ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggMWMwMzM2OS4uMjU4OTcxNSAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTMgKzEsMTQgQEAKLVRoaXMgaXMgcmVsZWFzZSA5NzAzMDUgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKK1RoaXMgaXMgcmVsZWFzZSA5NzAzMjkgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKIGRldmVsb3BlcidzIG9ubHkgcmVsZWFzZS4gIFRoZXJlIGFyZSBtYW55IGJ1Z3MgYW5kIG1hbnkgdW5pbXBsZW1lbnRlZCBBUEkKIGZlYXR1cmVzLiAgTW9zdCBhcHBsaWNhdGlvbnMgc3RpbGwgZG8gbm90IHdvcmsgY29ycmVjdGx5LgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gImp1bGxpYXJkQGxyYy5lcGZsLmNoIi4gIFBsZWFzZSBkb24ndAogZm9yZ2V0IHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk3MDMwNTogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBDb21wbGV0ZWQgdHJhbnNpdGlvbiB0byBuZXcgV2luMzIgdHlwZXMuCi0JLSBQb2xpc2ggbGFuZ3VhZ2Ugc3VwcG9ydC4KK1dIQVQnUyBORVcgd2l0aCBXaW5lLTk3MDMyOTogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCisJLSBXaW4zMiBldmVudC9tdXRleC9zZW1hcGhvcmUgZnVuY3Rpb25zLgorCS0gUmV3cml0dGVuIGNvbWJvYm94LgorCS0gUG9ydHVndWVzZSBsYW5ndWFnZSBzdXBwb3J0LgogCS0gTG90cyBvZiBidWcgZml4ZXMuCiAKIFNlZSB0aGUgUkVBRE1FIGZpbGUgaW4gdGhlIGRpc3RyaWJ1dGlvbiBmb3IgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucy4KQEAgLTE2LDEwICsxNywxMSBAQAogdGhlIHJlbGVhc2UgaXMgYXZhaWxhYmxlIGF0IHRoZSBmdHAgc2l0ZXMuICBUaGUgc291cmNlcyB3aWxsIGJlIGF2YWlsYWJsZQogZnJvbSB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKIAotICBmdHA6Ly9zdW5zaXRlLnVuYy5lZHUvcHViL0xpbnV4L0FMUEhBL3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzAzMDUudGFyLmd6Ci0gIGZ0cDovL3RzeC0xMS5taXQuZWR1L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTcwMzA1LnRhci5negotICBmdHA6Ly9mdHAuaW5mb21hZ2ljLmNvbS9wdWIvbWlycm9ycy9saW51eC93aW5lL2RldmVsb3BtZW50L1dpbmUtOTcwMzA1LnRhci5negotICBmdHA6Ly9hcmlzLmNvbS9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MDMwNS50YXIuZ3oKKyAgZnRwOi8vc3Vuc2l0ZS51bmMuZWR1L3B1Yi9MaW51eC9BTFBIQS93aW5lL2RldmVsb3BtZW50L1dpbmUtOTcwMzI5LnRhci5negorICBmdHA6Ly90c3gtMTEubWl0LmVkdS9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MDMyOS50YXIuZ3oKKyAgZnRwOi8vZnRwLmluZm9tYWdpYy5jb20vcHViL21pcnJvcnMvbGludXgvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MDMyOS50YXIuZ3oKKyAgZnRwOi8vYXJpcy5jb20vcHViL2xpbnV4L0FMUEhBL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzAzMjkudGFyLmd6CisgIGZ0cDovL2Z0cC5wcm9nc29jLnV0cy5lZHUuYXUvcHViL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzAzMjkudGFyLmd6CiAKIEl0IHNob3VsZCBhbHNvIGJlIGF2YWlsYWJsZSBmcm9tIGFueSBzaXRlIHRoYXQgbWlycm9ycyB0c3gtMTEgb3Igc3Vuc2l0ZS4KIApAQCAtMzEsMjUgKzMzLDI5IEBACiB3aW5lLXBhdGNoZXMgeW91cl9hZGRyZXNzJyB0byBtYWpvcmRvbW9AdGlnZXIuaW5mb3JtYXRpay5odS1iZXJsaW4uZGUuCiAKIFdpbmUgaXMgYXZhaWxhYmxlIHRoYW5rcyB0byB0aGUgd29yayBvZiBCb2IgQW1zdGFkdCwgRGFnIEFzaGVpbSwKLU1hcnRpbiBBeW90dGUsIFJvc3MgQmlybywgVXdlIEJvbm5lcywgRXJpayBCb3MsIEZvbnMgQm90bWFuLCBKb2huIEJyZXphaywKLUFuZHJldyBCdWxoYWssIEpvaG4gQnVydG9uLCBOaWVscyBkZSBDYXJwZW50aWVyLCBSb21hbiBEb2xlanNpLAotRnJhbnMgdmFuIERvcnNzZWxhZXIsIFBhdWwgRmFsc3RhZCwgT2xhZiBGbGViYmUsIFBldGVyIEdhbGJhdnksCi1SYW1vbiBHYXJjaWEsIEhhbnMgZGUgR3JhYWZmLCBDaGFybGVzIE0uIEhhbm51bSwgSm9obiBIYXJ2ZXksCi1DYW1lcm9uIEhlaWRlLCBKb2NoZW4gSG9lbmlja2UsIE9ubm8gSG92ZXJzLCBKZWZmcmV5IEhzdSwKLU1pZ3VlbCBkZSBJY2F6YSwgSnVra2EgSWl2b25lbiwgQWxleGFuZHJlIEp1bGxpYXJkLCBKb2NoZW4gS2FycmVyLAotQW5kcmVhcyBLaXJzY2hiYXVtLCBBbGJyZWNodCBLbGVpbmUsIEpvbiBLb25yYXRoLCBBbGV4IEtvcm9ia2EsCi1HcmVnIEtyZWlkZXIsIEFuYW5kIEt1bXJpYSwgU2NvdHQgQS4gTGFpcmQsIE1hcnRpbiB2b24gTG9ld2lzLAotS2VubmV0aCBNYWNEb25hbGQsIFBldGVyIE1hY0RvbmFsZCwgV2lsbGlhbSBNYWdybywgSnVlcmdlbiBNYXJxdWFyZHQsCi1NYXJjdXMgTWVpc3NuZXIsIEdyYWhhbSBNZW5oZW5uaXR0LCBEYXZpZCBNZXRjYWxmZSwgU3RlZmZlbiBNb2VsbGVyLAorTWFydGluIEF5b3R0ZSwgUGV0ZXIgQmFqdXN6LCBSb3NzIEJpcm8sIFV3ZSBCb25uZXMsIEVyaWsgQm9zLCBGb25zIEJvdG1hbiwKK0pvaG4gQnJlemFrLCBBbmRyZXcgQnVsaGFrLCBKb2huIEJ1cnRvbiwgTmllbHMgZGUgQ2FycGVudGllciwgSmltZW4gQ2hpbmcsCitIdXcgRC4gTS4gRGF2aWVzLCBSb21hbiBEb2xlanNpLCBGcmFucyB2YW4gRG9yc3NlbGFlciwgUGF1bCBGYWxzdGFkLAorRGF2aWQgRmF1cmUsIE9sYWYgRmxlYmJlLCBQZXRlciBHYWxiYXZ5LCBSYW1vbiBHYXJjaWEsIE1hdHRoZXcgR2hpbywKK0hhbnMgZGUgR3JhYWZmLCBDaGFybGVzIE0uIEhhbm51bSwgSm9obiBIYXJ2ZXksIENhbWVyb24gSGVpZGUsCitKb2NoZW4gSG9lbmlja2UsIE9ubm8gSG92ZXJzLCBKZWZmcmV5IEhzdSwgTWlndWVsIGRlIEljYXphLCBKdWtrYSBJaXZvbmVuLAorTGVlIEphZWtpbCwgQWxleGFuZHJlIEp1bGxpYXJkLCBCYW5nIEp1bi1Zb3VuZywgUGF2ZWwgS2Fua292c2t5LAorSm9jaGVuIEthcnJlciwgQW5kcmVhcyBLaXJzY2hiYXVtLCBBbGJyZWNodCBLbGVpbmUsIEpvbiBLb25yYXRoLAorQWxleCBLb3JvYmthLCBHcmVnIEtyZWlkZXIsIEFuYW5kIEt1bXJpYSwgU2NvdHQgQS4gTGFpcmQsIEFuZHJldyBMZXd5Y2t5LAorTWFydGluIHZvbiBMb2V3aXMsIEtlbm5ldGggTWFjRG9uYWxkLCBQZXRlciBNYWNEb25hbGQsIFdpbGxpYW0gTWFncm8sCitKdWVyZ2VuIE1hcnF1YXJkdCwgUmljYXJkbyBNYXNzYXJvLCBNYXJjdXMgTWVpc3NuZXIsIEdyYWhhbSBNZW5oZW5uaXR0LAorRGF2aWQgTWV0Y2FsZmUsIEJydWNlIE1pbG5lciwgU3RlZmZlbiBNb2VsbGVyLCBBbmRyZWFzIE1vaHIsCiBQaGlsaXBwZSBEZSBNdXl0ZXIsIEl0YWkgTmFoc2hvbiwgTWljaGFlbCBQYXRyYSwgSmltIFBldGVyc29uLAotUm9iZXJ0IFBvdWxpb3QsIEtlaXRoIFJleW5vbGRzLCBKb2huIFJpY2hhcmRzb24sIEpvaGFubmVzIFJ1c2NoZWluc2tpLAotVGhvbWFzIFNhbmRmb3JkLCBDb25zdGFudGluZSBTYXB1bnR6YWtpcywgRGFuaWVsIFNjaGVwbGVyLCBVbHJpY2ggU2NobWlkLAotQmVybmQgU2NobWlkdCwgWW5ndmkgU2lndXJqb25zc29uLCBSaWNrIFNsYWRrZXksIFdpbGxpYW0gU21pdGgsCi1FcmlrIFN2ZW5kc2VuLCBUcmlzdGFuIFRhcnJhbnQsIEFuZHJldyBUYXlsb3IsIER1bmNhbiBDIFRob21zb24sCi1Hb3JhbiBUaHluaSwgSmltbXkgVGlydGF3YW5nc2EsIEpvbiBUb21icywgTGludXMgVG9ydmFsZHMsCi1HcmVnb3J5IFRydWJldHNrb3ksIE1pY2hhZWwgVmVrc2xlciwgU3ZlbiBWZXJkb29sYWVnZSwgRXJpYyBXYXJua2UsCi1NYW5mcmVkIFdlaWNoZWwsIE1vcnRlbiBXZWxpbmRlciwgSmFuIFdpbGxhbW93aXVzLCBDYXJsIFdpbGxpYW1zLAotS2FybCBHdWVudGVyIFd1ZW5zY2gsIEVyaWMgWW91bmdkYWxlLCBhbmQgSmFtZXMgWW91bmdtYW4uCitSb2JlcnQgUG91bGlvdCwgS2VpdGggUmV5bm9sZHMsIFNsYXZlbiBSZXppYywgSm9obiBSaWNoYXJkc29uLAorSm9oYW5uZXMgUnVzY2hlaW5za2ksIFRob21hcyBTYW5kZm9yZCwgQ29uc3RhbnRpbmUgU2FwdW50emFraXMsCitQYWJsbyBTYXJhdHhhZ2EsIERhbmllbCBTY2hlcGxlciwgVWxyaWNoIFNjaG1pZCwgQmVybmQgU2NobWlkdCwKK1luZ3ZpIFNpZ3Vyam9uc3NvbiwgU3RlcGhlbiBTaW1tb25zLCBSaWNrIFNsYWRrZXksIFdpbGxpYW0gU21pdGgsCitEb21pbmlrIFN0cmFzc2VyLCBWYWRpbSBTdHJpemhldnNreSwgRXJpayBTdmVuZHNlbiwgVHJpc3RhbiBUYXJyYW50LAorQW5kcmV3IFRheWxvciwgRHVuY2FuIEMgVGhvbXNvbiwgR29yYW4gVGh5bmksIEppbW15IFRpcnRhd2FuZ3NhLCBKb24gVG9tYnMsCitMaW51cyBUb3J2YWxkcywgR3JlZ29yeSBUcnViZXRza295LCBQZXRyaSBUdW9tb2xhLCBNaWNoYWVsIFZla3NsZXIsCitTdmVuIFZlcmRvb2xhZWdlLCBSb25hbiBXYWlkZSwgRXJpYyBXYXJua2UsIE1hbmZyZWQgV2VpY2hlbCwKK01vcnRlbiBXZWxpbmRlciwgSmFuIFdpbGxhbW93aXVzLCBDYXJsIFdpbGxpYW1zLCBLYXJsIEd1ZW50ZXIgV3VlbnNjaCwKK0VyaWMgWW91bmdkYWxlLCBKYW1lcyBZb3VuZ21hbiwgTWlrb2xhaiBaYWxld3NraSwgYW5kIEpvaG4gWmVyby4KIAogLS0KIEFsZXhhbmRyZSBKdWxsaWFyZApkaWZmIC0tZ2l0IGEvQlVHUyBiL0JVR1MKaW5kZXggYjRlOGI4NC4uNzllZjkzNSAxMDA2NDQKLS0tIGEvQlVHUworKysgYi9CVUdTCkBAIC01LDIzICs1LDIxIEBACiBhZGQgbmV3IGVudHJpZXMgYW5kLCBtb3JlIGltcG9ydGFudGx5LCByZW1vdmUgdGhvc2UgZm9yIHRoZSAKIGJ1Z3MgeW91IGZpeGVkIDstKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BcyBvZiBEZWMgMjIgMTk5NiAtCitBcyBvZiBNYXJjaCAxMCAxOTk3IC0KIAogR2VuZXJhbDoKIAotICogQ29tYm9ib3ggY29kZSBpcyB2ZXJ5IGluYWRlcXVhdGUgKG5vIG5vdGlmaWNhdGlvbiBtZXNzYWdlcywKLSAgIGRyb3Bkb3duIGxpc3Rib3hlcyBvZnRlbiBzdGF5IHZpc2libGUsIGV0Yy4uLiApLgotCiAgKiBGb250IG1hcHBpbmcgaXMgdG9vIGdlbmVyaWMuIE5vIHNvZnQgZm9udCBsb2FkaW5nLCBubyByb3RhdGVkIAotICAgdGV4dCBzdXBwb3J0LiBbYWxleEBhbWFkZXVzLnBoYXJtLnN1bnlzYi5lZHVdCisgICB0ZXh0IHN1cHBvcnQsIGluY29ycmVjdCBtZXRyaWNzLiBbYWxleEBhbWFkZXVzLnBoYXJtLnN1bnlzYi5lZHVdCiAKICAqIE5vIHRocmVhZC9wcm9jZXNzL2tlcm5lbC1vYmplY3Qgc3VwcG9ydCBpbiBXaW4zMiBjb2RlLiAKIAogICogVmVyeSBhbHBoYSBwcmludGluZyBjb2RlLiBbam9obkBkaXZpc2lvbi5jby51a10KIAotICogTm8gT0xFIGFuZCBPTEUzMiBzdXBwb3J0IChpbmNsdWRpbmcgT0xFIGludGVyZmFjZXMgZXRjLikuCisgKiBObyBPTEUyIGFuZCBPTEUzMiBzdXBwb3J0IChpbmNsdWRpbmcgT0xFMiBpbnRlcmZhY2VzIGV0Yy4pLgogCi0gKiBObyBNUyBWaWRlbyBzdXBwb3J0IChwZXJoYXBzIGludGVyZmFjZSB3aXRoIHhhbmltKS4KKyAqIE5vIE1TIFZpZGVvIHN1cHBvcnQgKHBlcmhhcHMgaW50ZXJmYWNlIHdpdGggeGFuaW0sIGRvbid0IGhvbGQKKyAgIHlvdXIgYnJlYXRoIGZvciB0aGlzIG9uZSkuCiAKICAqIE5vIENPTURMRzMyIHN1cHBvcnQuIChOZWVkZWQgYmFkbHksIHRoZSBXaW5kb3dzOTUgY29tZGxnMzIuZGxsCiAgICBkb2Vzbid0IHdvcmsgd2l0aCBXSU5FLikKQEAgLTMzLDE0ICszMSwyNiBAQAogCSAgSGFuZGxlcyB0byB0aGVzZSB0aXRsZSB3aW5kb3dzIGFyZSBzdG9yZWQgaW4gdGhlIGljb24gd2luZG93CiAJICBwcm9wZXJ0aWVzLgogCisgKiBObyBtYW51YWwgcGFnZXMgZGVzY3JpYmluZyB0aGUgdmFyaW91cyBXaW5kb3dzIGNhbGxzLgorCiBNaXNjZWxsYW5lb3VzOgogCi0gKiBTaW1wbGUgT0xFIGFjdGlvbnMgd2VyZSB3b3JraW5nIGluIE9jdG9iZXIgcmVsZWFzZSwgZ290Ci0gICBicm9rZW4gaW4gTm92ZW1iZXIgKGluIFdpbndvcmQgIkluc2VydCBPYmplY3QiIG5vdyByZXN1bHRzIGluIAotICAgc2VnZmF1bHQgcmlnaHQgYWZ0ZXIgdGhlIGNhbGwgdG8gTG9hZE1vZHVsZSgpKS4KKyAqICJDdXJzb3IgWFhYWCBoYXMgbW9yZSB0aGFuIDEgYnBwISIKKworICogMzItYml0IEZyZWVjZWxsIHNlZ2ZhdWx0cyB3aGVuIHN0YXJ0ZWQgZnJvbSB0aGUgUHJvZ21hbiAobG9va3MgbGlrZQorICAgYSBwcm9ibGVtIHdpdGggY2FyZHMuZGxsKS4KKworICogV29yZCA2LjAgb2Z0ZW4gc2VnZmF1bHRzIHdoZW4gc3lzdGVtIG1lbnUgaXMgZG91YmxlLWNsaWNrZWQuIAorCisgKiBFZGl0IGNvbnRyb2xzIGFyZSBwcm9uZSB0byBzaG93IGJsYW5rIHNwYWNlIHdoZW4sIGluIGZhY3QsIHRoZXJlIGlzIGEKKyAgIHRleHQgdGhlcmUuCisKKyAqIFNHSSB3aW5kb3cgbWFuYWdlciB0cmVhdHMgV2luZSB3aW5kb3dzIGFzIHRvcG1vc3QuCisKKyAqIFdyaXRlIHNob3dzIGJsYW5rIHNwYWNlIGluc3RlYWQgb2YgUGFpbnRicnVzaCBPTEUxIG9iamVjdC4KKwogICogQWxsb2NDU1RvRFNBbGlhcygpIHNob3VsZG4ndCBhbGxvYyBhbGlhcyBmb3IgdGhlIHNhbWUgc2VnbWVudCBtdWx0aXBsZQogICAgdGltZXMuCi0gKiBTY3JvbGxXaW5kb3dFeCgpIGlzIG91dGRhdGVkLgogCiBXaGVyZSB0byBsb29rIGluIHNvdXJjZSBmaWxlczoKIApkaWZmIC0tZ2l0IGEvQ2hhbmdlTG9nIGIvQ2hhbmdlTG9nCmluZGV4IDNhNzIyYjYuLjIzYjgyZGIgMTAwNjQ0Ci0tLSBhL0NoYW5nZUxvZworKysgYi9DaGFuZ2VMb2cKQEAgLTEsNCArMSwxMjcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZyaSBNYXIgMjggMTQ6MTg6MzIgMTk5NyAgQWxleGFuZHJlIEp1bGxpYXJkICA8anVsbGlhcmRAbHJjLmVwZmwuY2g+CisKKwkqIFttaXNjL21haW4uY10gW0FOTk9VTkNFXQorCVVwZGF0ZSB0aGUgbGlzdCBvZiBjb250cmlidXRvcnMuIFBsZWFzZSBsZXQgbWUga25vdyBpZiBJIGZvcmdvdAorCXNvbWVvbmUuCisKKwkqIFtjb250cm9scy9jb21iby5jXQorCUZpeGVkIGJ1ZyBpbiBDQl9ESVIxNiBoYW5kbGluZy4KKwlVc2UgY29ycmVjdCB0ZXh0IGNvbG9yIGluIENCUGFpbnRUZXh0LgorCisJKiBbY29udHJvbHMvbGlzdGJveC5jXQorCUZpeGVkIFdNX0NUTENPTE9SIGhhbmRsaW5nLgorCisJKiBbd2luZG93cy93aW5wcm9jLmNdCisJQWRkZWQgdHJhbnNsYXRpb24gZm9yIEVNXyozMiBtZXNzYWdlcy4KKworTW9uIE1hciAyNCAwMTozMTo1MiAxOTk3ICBTdGVmZmVuIE1vZWxsZXIgPG1vZWxsZXJAbXBpbWctYmVybGluLWRhaGxlbS5tcGcuZGU+CisKKwkqIFtmaWxlcy9kcml2ZS5jXQorCUFkZGVkIGluZm9ybWF0aW9uIG9uIGRldmljZSBhbmQgaW5vZGUgbnVtYmVycyB0byB0aGUgRE9TRFJJVkUKKwlzdHJ1Y3QsIHVzaW5nIGl0IHRvIGZpbmQgRE9TIGRyaXZlcyBpbiBhIHBhdGggZXZlbiBpZiBpdCBjb250YWlucworCXN5bWJvbGljIGxpbmtzLCBlbGltaW5hdGluZyBhbm5veWluZyBtZXNzYWdlcyBhdCBzdGFydHVwLiAgCisJRWRpdGVkIGZ1bmN0aW9ucyBEUklWRV9Jbml0IGFuZCByZXdyb3RlIERSSVZFX0ZpbmREcml2ZVJvb3QuCisKK1dlZCBNYXIgMTkgMTY6MzE6MTggMTk5NyAgSm9obiBIYXJ2ZXkgPGpvaG5AZGl2aXNpb24uY28udWs+CisKKwkqIFtncmFwaGljcy93aW4xNmRydi9mb250LmNdIFtncmFwaGljcy93aW4xNmRydi9pbml0LmNdCisJICBbZ3JhcGhpY3MveDExZHJ2L2ZvbnQuY10gW29iamVjdHMvZm9udC5jXSBbaW5jbHVkZS9nZGkuaF0KKwkgIFtpbmNsdWRlL3dpbjE2ZHJ2LmhdIFtpbmNsdWRlL3gxMWRydi5oXQorCUltcGxlbWVudGVkIEdldENoYXJXaWR0aCB2aWEgZ3JhcGhpY3MgZHJpdmVycy4KKworCSogW2dyYXBoaWNzL3dpbjE2ZHJ2L01ha2VmaWxlLmluXSBbZ3JhcGhpY3Mvd2luMTZkcnYvcHJ0ZHJ2LmNdCisJTW92ZWQgcHJpbnRlciBkcml2ZXIgaW50ZXJmYWNlcyBpbnRvIGEgc2VwYXJhdGUgZmlsZS4KKworCSogW2dyYXBoaWNzL3dpbjE2ZHJ2L3RleHQuY10KKwlGaXhlZCBidWdzIHRoYXQgc2VnLWZhdWx0ZWQgd3JpdGUuCisKK1dlZCBNYXIgMTkgMTM6NTI6NDEgMTk5NyAgQWxleCBLb3JvYmthIDxhbGV4QHRyYW50b3IucGhhcm0uc3VueXNiLmVkdT4KKworCSogW0JVR1NdCisJVXBkYXRlLgorCisJKiBbY29udHJvbHMvZWRpdC5jXQorCVJlbW92ZWQgdXNlbGVzcyBwYXJhbWV0ZXJzIGZyb20gYSBsb3Qgb2YgZnVuY3Rpb25zLgorCisJKiBbY29udHJvbHMvbWVudS5jXQorCUltcHJvdmVkIGtleWJvYXJkIHNob3J0Y3V0cy4gQWRkZWQgY2hlY2sgZm9yIGVudHJpZXMgd2l0aCBwb3B1cCAKKwltZW51IGluIEVuYWJsZU1lbnVJdGVtKCkuCisKKwkqIFt3aW5kb3dzL3dpbnByb2MuY10gW3dpbmRvd3Mvd2luLmNdIFttZW1vcnkvc2VsZWN0b3IuY10KKwlEbyBub3QgYWxsb2NhdGUgc2VwYXJhdGUgdGh1bmtzIGZvciBuZXcgd2luZG93cy4KKworCSogW21pc2MvY2xpcGJvYXJkLmNdIFt3aW5kb3dzL3BhaW50aW5nLmNdCisJRml4ZWQgcHJvYmxlbXMgd2l0aCBDbGlwQm9vay4KKworICAgICAgICAqIFtjb250cm9scy9jb21iby5jXSBbY29udHJvbHMvZWRpdC5jXSBbY29udHJvbHMvbGlzdGJveC5jXQorCSAgW2NvbnRyb2xzL3dpZGdldHMuY10gW3dpbmRvd3MvZ3JhcGhpY3MuY10gW3dpbmRvd3MvZGVmZGxnLmNdCisgICAgICAgIENvbWJvIHJld3JpdGUuCisKKwkqIFtvYmplY3RzL2RpYi5jXQorCVNsaWdodCBpbXByb3ZlbWVudHMuCisKK1dlZCBNYXIgMTkgMTE6MjE6MTcgMTk5NyAgTWFyY3VzIE1laXNzbmVyIDxtc21laXNzbkBjaXAuaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGU+CisKKwkqIFttaXNjL2NydGRsbC5jXQorCUFkZGVkIGNoZGlyL21rZGlyLgorCisJKiBbbWlzYy9udGRsbC5jXQorCUZpeGVkIHNvbWUgYnVncywgYWRkZWQgUnRsVW5pY29kZVN0cmluZ1RvQW5zaVN0cmluZy4KKworCSogW3dpbjMyL3Byb2Nlc3MuY10KKwlBZGRlZCBpbml0aWFsaXNhdGlvbiBvZiBldmVudHMvc2VtYXBob3Jlcy9tdXRpY2VzLgorCitXZWQgTWFyIDE5IDAxOjU1OjQwIDE5OTcgIFJpY2FyZG8gUi4gTWFzc2FybyA8bWFzc2Fyb0BpbWUudXNwLmJyPgorCisJKiBbcmVzb3VyY2VzL3N5c3Jlc19Qby5yY10KKwlBZGRlZCBzdXBwb3J0IGZvciBQb3J0dWd1ZXNlIGxhbmd1YWdlLgorCitTYXQgTWFyIDE4IDE4OjAwOjE0IDE5OTcgIFV3ZSBCb25uZXMgIDxib25AZWxla3Ryb24uaWtwLnBoeXNpay50aC1kYXJtc3RhZHQuZGU+CisKKwkqIFt3aW5kb3dzL3dpbnBvcy5jXSBbaWYxNjMyL3VzZXIuc3BlY10gW2lmMTYzMi91c2VyMzIuc3BlY10KKwlJbXBsZW1lbnRlZCBTd2l0Y2hUb1RoaXNXaW5kb3coKS4KKwkKKwkqIFttaXNjL3Zlci5jXQorCUNvcnJlY3RlZCBhIGZsYXcgaW4gVmVySW5zdGFsbEZpbGUzMkEuCisJCisJKiBbbXNkb3MvaW50MjEuY10KKwlDb3JyZWN0ZWQgd3JvbmcgbnVtYmVyIGluIEludDIxIDMzMDUKKwlDb3JyZWN0ZWQgSW50MjEgNzE0ZSwgaW1wbGVtZW50ZWQgSW50MjEgNzE2MCxDTD0yLCA3MTQzIGFuZCA3MTQ3CisJCitTdW4gTWFyIDE2IDA5OjUzOjA0IDE5OTcgIEFuZHJlYXMgTW9ociA8MTAwLjMwOTM2QGdlcm1hbnkubmV0PgorCisJKiBbbG9hZGVyL25lX21vZHVsZS5jXQorCUZpeGVkIE5FX0xvYWRTZWdtZW50cygpIHRvIHNldCBzaXplIHRvIHBTZWctPm1pbnNpemUgcmF0aGVyIHRoYW4KKwlzZXR0aW5nIGl0IHRvIDB4MTAwMDAgaWYgcFNlZy0+c2l6ZSBpcyAwLgorCitUaHUgTWFyIDEzIDEyOjE1OjAwIDE5OTcgIEFuYW5kIEt1bXJpYSA8YWt1bXJpYUBvemVtYWlsLmNvbS5hdT4KKworCSogW0FOTk9VTkNFXQorCUFkZGVkIGZ0cC5wcm9nc29jLnV0cy5lZHUuYXUgYXMgYSBtaXJyb3Igb2YgV2luZS4KKworCSogW21lbW9yeS9nbG9iYWwuY10KKwlSZW1vdmVkIE1lbU1hbkluZm8gc2l6ZW9mIGNoZWNrLgorCitNb24gTWFyIDEwIDEwOjM1OjQ0IE1FVCAxOTk3IFN2ZW4gVmVyZG9vbGFlZ2UgPHNraW1vQGJyZXVnaGVsLnVmc2lhLmFjLmJlPgorCisJKiBbZmlsZXMvZG9zX2ZzLmNdCisJUGljayB1cCBrZXJuZWwgZGlyZW50IG9uIGdsaWJjIHN5c3RlbXMuCisKKwkqIFtsb2FkZXIvc2lnbmFsLmNdCisJUGljayB1cCBrZXJuZWwgc2lnYWN0aW9uIG9uIGdsaWJjIHN5c3RlbXMuCisKK1NhdCBNYXIgIDggMjE6MDU6MzcgMTk5NyAgSmltZW4gQ2hpbmcgIDxqY2hpbmdAYWxvaGEuY29tPgorCisJKiBbZGVidWdnZXIvc3RhYnMuY10gW2RlYnVnZ2VyL21zYy5jXQorCUNoZWNrIHJldHVybiB2YWx1ZSBvZiBtbWFwLgorCitGcmkgTWFyICA3IDA1OjQyOjAzIDE5OTcgIExlZSBKYWVraWwgPGp1cmlhQHNlb2R1LmNvLmtyPgorCisJKiBbd2luMzIvY29kZV9wYWdlLmNdCisJQWRkZWQgSXNWYWxpZENvZGVQYWdlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTdW4gTWFyICAyIDE0OjU3OjM3IDE5OTcgIEFsZXhhbmRyZSBKdWxsaWFyZCAgPGp1bGxpYXJkQGxyYy5lcGZsLmNoPgogCiAJKiBbKi8qXQpkaWZmIC0tZ2l0IGEvY29udHJvbHMvTWFrZWZpbGUuaW4gYi9jb250cm9scy9NYWtlZmlsZS5pbgppbmRleCA3ZjdkZmY5Li4wOTE4OGI1IDEwMDY0NAotLS0gYS9jb250cm9scy9NYWtlZmlsZS5pbgorKysgYi9jb250cm9scy9NYWtlZmlsZS5pbgpAQCAtMTIsNyArMTIsNiBAQAogCWVkaXQuYyBcCiAJbGlzdGJveC5jIFwKIAltZW51LmMgXAotCW9sZGxib3guYyBcCiAJc2Nyb2xsLmMgXAogCXN0YXRpYy5jIFwKIAlzdGF0dXMuYyBcCmRpZmYgLS1naXQgYS9jb250cm9scy9idXR0b24uYyBiL2NvbnRyb2xzL2J1dHRvbi5jCmluZGV4IDIwNTg4ODcuLjcyZTI4OTMgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2J1dHRvbi5jCisrKyBiL2NvbnRyb2xzL2J1dHRvbi5jCkBAIC00NzIsMjMgKzQ3MiwxOSBAQAogCiAgICAgaWYgKGFjdGlvbiAhPSBPREFfRFJBV0VOVElSRSkgcmV0dXJuOwogCi0gICAgaWYgKGluZm9QdHItPmhGb250KSBTZWxlY3RPYmplY3QzMiggaERDLCBpbmZvUHRyLT5oRm9udCApOwogICAgIEJVVFRPTl9TRU5EX0NUTENPTE9SKCB3bmRQdHIsIGhEQyApOwotICAgIFNlbGVjdE9iamVjdDMyKCBoREMsIHN5c0NvbG9yT2JqZWN0cy5ocGVuV2luZG93RnJhbWUgKTsKIAogICAgIEdldENsaWVudFJlY3QxNiggd25kUHRyLT5od25kU2VsZiwgJnJjKTsKLQotICAgIE1vdmVUbyggaERDLCByYy5sZWZ0LCByYy50b3ArMiApOwotICAgIExpbmVUbzMyKCBoREMsIHJjLnJpZ2h0LTEsIHJjLnRvcCsyICk7Ci0gICAgTGluZVRvMzIoIGhEQywgcmMucmlnaHQtMSwgcmMuYm90dG9tLTEgKTsKLSAgICBMaW5lVG8zMiggaERDLCByYy5sZWZ0LCByYy5ib3R0b20tMSApOwotICAgIExpbmVUbzMyKCBoREMsIHJjLmxlZnQsIHJjLnRvcCsyICk7Ci0KLSAgICBpZiAoIXduZFB0ci0+dGV4dCkgcmV0dXJuOwotICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19ESVNBQkxFRCkKLSAgICAgICAgU2V0VGV4dENvbG9yMzIoIGhEQywgR2V0U3lzQ29sb3IzMihDT0xPUl9HUkFZVEVYVCkgKTsKLSAgICByYy5sZWZ0ICs9IDEwOwotICAgIERyYXdUZXh0MTYoIGhEQywgd25kUHRyLT50ZXh0LCAtMSwgJnJjLCBEVF9TSU5HTEVMSU5FIHwgRFRfTk9DTElQICk7CisgICAgR1JBUEhfRHJhd1JlY3RhbmdsZSggaERDLCByYy5sZWZ0LCByYy50b3AgKyAyLCByYy5yaWdodCAtIDEsIHJjLmJvdHRvbSAtIDEsCisJCQkJCSAgICAgc3lzQ29sb3JPYmplY3RzLmhwZW5XaW5kb3dGcmFtZSApOworICAgIGlmICh3bmRQdHItPnRleHQpCisgICAgeworCWlmIChpbmZvUHRyLT5oRm9udCkgU2VsZWN0T2JqZWN0MzIoIGhEQywgaW5mb1B0ci0+aEZvbnQgKTsKKyAgICAgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0RJU0FCTEVEKQorICAgICAgICAgICAgU2V0VGV4dENvbG9yMzIoIGhEQywgR2V0U3lzQ29sb3IzMihDT0xPUl9HUkFZVEVYVCkgKTsKKyAgICAgICAgcmMubGVmdCArPSAxMDsKKyAgICAgICAgRHJhd1RleHQxNiggaERDLCB3bmRQdHItPnRleHQsIC0xLCAmcmMsIERUX1NJTkdMRUxJTkUgfCBEVF9OT0NMSVAgKTsKKyAgICB9CiB9CiAKIApkaWZmIC0tZ2l0IGEvY29udHJvbHMvY29tYm8uYyBiL2NvbnRyb2xzL2NvbWJvLmMKaW5kZXggZjhmY2NmOC4uN2JmYjY4ZCAxMDA2NDQKLS0tIGEvY29udHJvbHMvY29tYm8uYworKysgYi9jb250cm9scy9jb21iby5jCkBAIC0xLDEyNDAgKzEsMTU1MSBAQAogLyoKICAqIENvbWJvIGNvbnRyb2xzCiAgKiAKLSAqIENvcHlyaWdodCAxOTkzIE1hcnRpbiBBeW90dGUKLSAqIENvcHlyaWdodCAxOTk1IEJlcm5kIFNjaG1pZHQKLSAqIENvcHlyaWdodCAxOTk2IEFsYnJlY2h0IEtsZWluZSAgW3NvbWUgZml4ZXNdCisgKiBDb3B5cmlnaHQgMTk5NyBBbGV4IEtvcm9ia2EKICAqIAorICogRklYTUU6IHJvbGwgdXAgaW4gTmV0c2NhcGUgMy4wMS4KICAqLwogCiAjaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgogCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKKyNpbmNsdWRlICJzeXNjb2xvci5oIgogI2luY2x1ZGUgIndpbi5oIgotI2luY2x1ZGUgImNvbWJvLmgiCisjaW5jbHVkZSAic3B5LmgiCiAjaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgImdyYXBoaWNzLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgotI2luY2x1ZGUgImxpc3Rib3guaCIKKyNpbmNsdWRlICJjb21iby5oIgogI2luY2x1ZGUgImRyaXZlLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgInhtYWxsb2MuaCIKIAotIC8qCi0gICogTm90ZTogQ29tYm9zIGFyZSBwcm9iYWJseSBpbXBsZW1lbnRlZCBpbiBhIGRpZmZlcmVudCB3YXkgYnkgV2luZG93cy4KLSAgKiBVc2luZyBhIG1lc3NhZ2Ugc3B5IGZvciBXaW5kb3dzLCB5b3UgY2FuIHNlZSBzb21lIHVuZG9jdW1lbnRlZAotICAqIG1lc3NhZ2VzIGJlaW5nIHBhc3NlZCBiZXR3ZWVuIENvbWJvQm94IGFuZCBDb21ib0xCb3guCi0gICogSSBob3BlIG5vIHByb2dyYW1zIHJlbHkgb24gdGhlIGltcGxlbWVudGF0aW9uIG9mIGNvbWJvcy4KLSAgKi8KKyAgLyogYml0cyBpbiB0aGUgZHdLZXlEYXRhICovCisjZGVmaW5lIEtFWURBVEFfQUxUICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBLRVlEQVRBX1BSRVZTVEFURSAgICAgICAweDQwMDAKIAotI2RlZmluZSBJRF9FRElUICAxCi0jZGVmaW5lIElEX0NMQiAgIDIKLSNkZWZpbmUgQ0JMTU1fRURHRSAgIDQgICAgLyogZGlzdGFuY2UgaW5zaWRlIGJveCB3aGljaCBpcyBzYW1lIGFzIG1vdmluZyBtb3VzZQotCQkJICAgICBvdXRzaWRlIGJveCwgdG8gdHJpZ2dlciBzY3JvbGxpbmcgb2YgQ0JMICovCisvKgorICogQWRkaXRpb25hbCBjb21ibyBib3ggZGVmaW5pdGlvbnMKKyAqLwogCi1zdGF0aWMgQk9PTDMyIENCQ2hlY2tTaXplKEhXTkQxNiBod25kKTsKLXN0YXRpYyBCT09MMzIgQ0JMQ2hlY2tTaXplKEhXTkQxNiBod25kKTsKKyNkZWZpbmUgQ0JfR0VUUFRSKCB3bmQgKSAgICAgICgqKExQSEVBRENPTUJPKikoKHduZCktPndFeHRyYSkpCisjZGVmaW5lIENCX05PVElGWSggbHBoYywgY29kZSApIFwKKwkoU2VuZE1lc3NhZ2UzMkEoIChscGhjKS0+b3duZXIsIFdNX0NPTU1BTkQsIFwKKwkJCSBNQUtFV1BBUkFNKChscGhjKS0+c2VsZi0+d0lEbWVudSwgKGNvZGUpKSwgKGxwaGMpLT5zZWxmLT5od25kU2VsZikpCisjZGVmaW5lIENCX0dFVEVESVRURVhUTEVOR1RIKCBscGhjICkgXAorCShTZW5kTWVzc2FnZTMyQSggKGxwaGMpLT5oV25kRWRpdCwgV01fR0VUVEVYVExFTkdUSCwgMCwgMCApKQogCi1zdGF0aWMgSEJJVE1BUDE2IGhDb21ib0JpdCA9IDA7Ci1zdGF0aWMgV09SRCBDQml0SGVpZ2h0LCBDQml0V2lkdGg7CitzdGF0aWMgSEJJVE1BUDE2IAloQ29tYm9CbXAgPSAwOworc3RhdGljIFVJTlQxNgkJQ0JpdEhlaWdodCwgQ0JpdFdpZHRoOworc3RhdGljIFVJTlQxNgkJQ0JpdE9mZnNldCA9IDg7CiAKLXN0YXRpYyBpbnQgQ09NQk9fSW5pdCgpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDT01CT19Jbml0CisgKgorICogTG9hZCBjb21ibyBidXR0b24gYml0bWFwLgorICovCitzdGF0aWMgQk9PTDMyIENPTUJPX0luaXQoKQogewotICBCSVRNQVAxNiBibTsKKyAgSERDMTYJCWhEQzsKICAgCi0gIGRwcmludGZfY29tYm8oc3RkZGViLCAiQ09NQk9fSW5pdFxuIik7Ci0gIGhDb21ib0JpdCA9IExvYWRCaXRtYXAxNigwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX0NPTUJPKSk7Ci0gIEdldE9iamVjdDE2KCBoQ29tYm9CaXQsIHNpemVvZihibSksICZibSApOwotICBDQml0SGVpZ2h0ID0gYm0uYm1IZWlnaHQ7Ci0gIENCaXRXaWR0aCA9IGJtLmJtV2lkdGg7Ci0gIHJldHVybiAwOwotfQotCi1MUEhFQURDT01CTyBDb21ib0dldFN0b3JhZ2VIZWFkZXIoSFdORDE2IGh3bmQpCi17Ci0gIHJldHVybiAoTFBIRUFEQ09NQk8pR2V0V2luZG93TG9uZzMyQShod25kLDQpOwotfQotCi1MUEhFQURMSVNUIENvbWJvR2V0TGlzdEhlYWRlcihIV05EMTYgaHduZCkKLXsKLSAgcmV0dXJuIChMUEhFQURMSVNUKUdldFdpbmRvd0xvbmczMkEoaHduZCwwKTsKLX0KLQotaW50IENyZWF0ZUNvbWJvU3RydWN0KEhXTkQxNiBod25kLCBMT05HIHN0eWxlKQotewotICBMUEhFQURDT01CTyBscGhjOwotCi0gIGxwaGMgPSAoTFBIRUFEQ09NQk8peG1hbGxvYyhzaXplb2YoSEVBRENPTUJPKSk7Ci0gIFNldFdpbmRvd0xvbmczMkEoaHduZCw0LChMT05HKWxwaGMpOwotICBscGhjLT5oV25kRWRpdCA9IDA7Ci0gIGxwaGMtPmhXbmRMQm94ID0gMDsKLSAgbHBoYy0+ZHdTdGF0ZSA9IDA7Ci0gIGxwaGMtPkxhc3RTZWwgPSAtMTsKLSAgbHBoYy0+ZHdTdHlsZSA9IHN0eWxlOyAKLSAgbHBoYy0+RHJvcERvd25WaXNpYmxlID0gRkFMU0U7Ci0gIHJldHVybiBUUlVFOwotfQotCi12b2lkIENvbWJvVXBkYXRlV2luZG93KEhXTkQxNiBod25kLCBMUEhFQURMSVNUIGxwaGwsIExQSEVBRENPTUJPIGxwaGMsIEJPT0wzMiByZXBhaW50KQotewotICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOwotCi0gIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19WU0NST0xMKSAKLSAgICBTZXRTY3JvbGxSYW5nZTMyKGxwaGMtPmhXbmRMQm94LFNCX1ZFUlQsMCxMaXN0TWF4Rmlyc3RWaXNpYmxlKGxwaGwpLFRSVUUpOwotICBpZiAocmVwYWludCAmJiBscGhsLT5iUmVkcmF3RmxhZykgSW52YWxpZGF0ZVJlY3QzMiggaHduZCwgTlVMTCwgVFJVRSApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDQk5DQ3JlYXRlCi0gKi8KLXN0YXRpYyBMUkVTVUxUIENCTkNDcmVhdGUoSFdORDE2IGh3bmQsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKLXsKLSAgQ1JFQVRFU1RSVUNUMTYgKmNyZWF0ZVN0cnVjdDsKLQotICBpZiAoIWhDb21ib0JpdCkgQ09NQk9fSW5pdCgpOwotCi0gIGNyZWF0ZVN0cnVjdCA9IChDUkVBVEVTVFJVQ1QxNiAqKVBUUl9TRUdfVE9fTElOKGxQYXJhbSk7Ci0gIGNyZWF0ZVN0cnVjdC0+c3R5bGUgfD0gV1NfQk9SREVSOwotICBTZXRXaW5kb3dMb25nMzJBKGh3bmQsIEdXTF9TVFlMRSwgY3JlYXRlU3RydWN0LT5zdHlsZSk7Ci0KLSAgZHByaW50Zl9jb21ibyhzdGRkZWIsIkNvbWJvQm94IFdNX05DQ1JFQVRFIVxuIik7Ci0gIHJldHVybiBEZWZXaW5kb3dQcm9jMTYoaHduZCwgV01fTkNDUkVBVEUsIHdQYXJhbSwgbFBhcmFtKTsKLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDQkNyZWF0ZQotICovCi1zdGF0aWMgTFJFU1VMVCBDQkNyZWF0ZShIV05EMTYgaHduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotICBMUEhFQURMSVNUICAgbHBobDsKLSAgTFBIRUFEQ09NQk8gIGxwaGM7Ci0gIExPTkcgICAgICAgICBzdHlsZSA9IDA7Ci0gIExPTkcgICAgICAgICBjc3R5bGUgPSBHZXRXaW5kb3dMb25nMzJBKGh3bmQsR1dMX1NUWUxFKTsKLSAgUkVDVDE2ICAgICAgIHJlY3QsbGJveHJlY3Q7Ci0gIFdORCogICAgICAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKLSAgY2hhciBjbGFzc05hbWVbXSA9ICJDT01CT0xCT1giOyAgLyogSGFjayBzbyB0aGF0IGNsYXNzIG5hbWVzIGFyZSA+IDB4MTAwMDAgKi8KLSAgY2hhciBlZGl0TmFtZVtdID0gIkVESVQiOwotICBIV05EMTYgaHduZHA9MDsKLQotICAvKiB0cmFuc2xhdGUgY29tYm8gaW50byBsaXN0Ym94IHN0eWxlcyAqLwotICBjc3R5bGUgfD0gV1NfQk9SREVSOwotICBpZiAoY3N0eWxlICYgQ0JTX09XTkVSRFJBV0ZJWEVEKSBzdHlsZSB8PSBMQlNfT1dORVJEUkFXRklYRUQ7Ci0gIGlmIChjc3R5bGUgJiBDQlNfT1dORVJEUkFXVkFSSUFCTEUpIHN0eWxlIHw9IExCU19PV05FUkRSQVdWQVJJQUJMRTsKLSAgaWYgKGNzdHlsZSAmIENCU19TT1JUKSBzdHlsZSB8PSBMQlNfU09SVDsKLSAgaWYgKGNzdHlsZSAmIENCU19IQVNTVFJJTkdTKSBzdHlsZSB8PSBMQlNfSEFTU1RSSU5HUzsKLSAgc3R5bGUgfD0gTEJTX05PVElGWTsKLSAgQ3JlYXRlTGlzdEJveFN0cnVjdChod25kLCBPRFRfQ09NQk9CT1gsIHN0eWxlLCBHZXRQYXJlbnQxNihod25kKSk7Ci0gIENyZWF0ZUNvbWJvU3RydWN0KGh3bmQsY3N0eWxlKTsKLQotICBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOwotICBscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotCi0gIEdldENsaWVudFJlY3QxNihod25kLCZyZWN0KTsKLSAgbHBoYy0+TEJveFRvcCA9IGxwaGwtPlN0ZEl0ZW1IZWlnaHQ7Ci0KLSAgc3dpdGNoKGNzdHlsZSAmIDMpIAorICBpZiggaENvbWJvQm1wICkgcmV0dXJuIFRSVUU7CisgIGlmKCAoaERDID0gQ3JlYXRlQ29tcGF0aWJsZURDMTYoMCkpICkKICAgewotICAgY2FzZSBDQlNfU0lNUExFOiAgICAgICAgICAgIC8qIGVkaXQgY29udHJvbCwgbGlzdCBhbHdheXMgdmlzaWJsZSAgKi8KLSAgICAgbGJveHJlY3Q9cmVjdDsgICAgCi0gICAgIGRwcmludGZfY29tYm8oc3RkZGViLCJDQlNfU0lNUExFXG4iKTsKLSAgICAgc3R5bGU9IFdTX0JPUkRFUiB8ICBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19WU0NST0xMOwotICAgICBTZXRSZWN0RW1wdHkxNigmbHBoYy0+UmVjdEJ1dHRvbik7Ci0gICAgIGh3bmRwPWh3bmQ7Ci0gICAgIGJyZWFrOworICAgIEJPT0wzMgliUmV0ID0gRkFMU0U7CisgICAgaWYoIChoQ29tYm9CbXAgPSBMb2FkQml0bWFwMTYoMCwgTUFLRUlOVFJFU09VUkNFKE9CTV9DT01CTykpKSApCisgICAgeworICAgICAgQklUTUFQMTYgICAgICBibTsKKyAgICAgIEhCSVRNQVAxNiAgICAgaFByZXZCOworICAgICAgUkVDVDE2ICAgICAgICByOwogCi0gICBjYXNlIENCU19EUk9QRE9XTkxJU1Q6ICAgICAgLyogc3RhdGljIGNvbnRyb2wsIGRyb3Bkb3duIGxpc3Rib3ggICAqLwotICAgY2FzZSBDQlNfRFJPUERPV046ICAgICAgICAgIC8qIGVkaXQgY29udHJvbCwgZHJvcGRvd24gbGlzdGJveCAgICAgKi8KLSAgICAgR2V0V2luZG93UmVjdDE2KGh3bmQsJmxib3hyZWN0KTsKLSAgICAgc3R5bGUgPSBXU19QT1BVUCB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEw7Ci0gICAgIC8qIEZJWE1FOiBXaW5TaWdodCBzYXlzIHRoZXNlIHNob3VsZCBiZSBDSElMRCB3aW5kb3dzIHdpdGggdGhlIFRPUE1PU1QgZmxhZwotICAgICAgKiBzZXQuIFdpbmUgZG9lc24ndCBzdXBwb3J0IFRPUE1PU1QsIGFuZCBzaW1wbHkgc2V0dGluZyB0aGUgV1NfQ0hJTEQKLSAgICAgICogZmxhZyBkb2Vzbid0IHdvcmsuICovCi0gICAgIGxwaGMtPlJlY3RCdXR0b24gPSByZWN0OwotICAgICBscGhjLT5SZWN0QnV0dG9uLmxlZnQgPSBscGhjLT5SZWN0QnV0dG9uLnJpZ2h0IC0gNiAtIENCaXRXaWR0aDsKLSAgICAgbHBoYy0+UmVjdEJ1dHRvbi5ib3R0b20gPSBscGhjLT5SZWN0QnV0dG9uLnRvcCArIGxwaGwtPlN0ZEl0ZW1IZWlnaHQ7Ci0gICAgIFNldFdpbmRvd1BvczMyKGh3bmQsIDAsIDAsIDAsIHJlY3QucmlnaHQgLXJlY3QubGVmdCArIDIqU1lTTUVUUklDU19DWEJPUkRFUiwKLQkJIGxwaGwtPlN0ZEl0ZW1IZWlnaHQgKyAyKlNZU01FVFJJQ1NfQ1lCT1JERVIsCi0JCSBTV1BfTk9NT1ZFIHwgU1dQX05PWk9SREVSIHwgU1dQX05PU0VORENIQU5HSU5HIHwgU1dQX05PQUNUSVZBVEUpOwotICAgICBkcHJpbnRmX2NvbWJvKHN0ZGRlYiwoY3N0eWxlICYgMyk9PUNCU19EUk9QRE9XTiA/ICJDQlNfRFJPUERPV05cbiI6ICJDQlNfRFJPUERPV05MSVNUXG4iKTsKLSAgICAgYnJlYWs7Ci0gICAgIAotICAgZGVmYXVsdDogZnByaW50ZihzdGRlcnIsIkNPTUJPQk9YIGVycm9yOiBiYWQgY2xhc3Mgc3R5bGUhXG4iKTsKLSAgICAgcmV0dXJuIDA7CisgICAgICBHZXRPYmplY3QxNiggaENvbWJvQm1wLCBzaXplb2YoYm0pLCAmYm0gKTsKKyAgICAgIENCaXRIZWlnaHQgPSBibS5ibUhlaWdodDsKKyAgICAgIENCaXRXaWR0aCAgPSBibS5ibVdpZHRoOworCisgICAgICBkcHJpbnRmX2NvbWJvKHN0ZGRlYiwgImNvbWJvIGJpdG1hcCBbJWksJWldXG4iLCBDQml0V2lkdGgsIENCaXRIZWlnaHQgKTsKKworICAgICAgaFByZXZCID0gU2VsZWN0T2JqZWN0MTYoIGhEQywgaENvbWJvQm1wKTsKKyAgICAgIFNldFJlY3QxNiggJnIsIDAsIDAsIENCaXRXaWR0aCwgQ0JpdEhlaWdodCApOworICAgICAgSW52ZXJ0UmVjdDE2KCBoREMsICZyICk7CisgICAgICBTZWxlY3RPYmplY3QxNiggaERDLCBoUHJldkIgKTsKKyAgICAgIGJSZXQgPSBUUlVFOworICAgIH0KKyAgICBEZWxldGVEQzE2KCBoREMgKTsKKyAgICByZXR1cm4gYlJldDsKICAgfQorICByZXR1cm4gRkFMU0U7Cit9CiAKLSAgaWYgKChjc3R5bGUgJiAzKSAhPSBDQlNfRFJPUERPV05MSVNUKQotICAgICAgbHBoYy0+aFduZEVkaXQgPSBDcmVhdGVXaW5kb3cxNiggZWRpdE5hbWUsIE5VTEwsCi0JCQkJICBXU19DSElMRCB8IFdTX0NMSVBDSElMRFJFTiB8IFdTX1ZJU0lCTEUgfCBFU19MRUZULAotCQkJCSAgMCwgMCwgcmVjdC5yaWdodC02LUNCaXRXaWR0aCwKLQkJCQkgIGxwaGwtPlN0ZEl0ZW1IZWlnaHQrMipTWVNNRVRSSUNTX0NZQk9SREVSLAotCQkJCSAgaHduZCwgKEhNRU5VMTYpSURfRURJVCwgV0lOX0dldFdpbmRvd0luc3RhbmNlKGh3bmQpLCBOVUxMICk7Ci0JCQkJICAKLSAgbGJveHJlY3QudG9wKz1scGhjLT5MQm94VG9wOwotICBscGhjLT5oV25kTEJveCA9IENyZWF0ZVdpbmRvdzE2KCBjbGFzc05hbWUsIE5VTEwsIHN0eWxlIHwKLSAJCQkJKChjc3R5bGUgJiBXU19IU0NST0xMKT8gV1NfSFNDUk9MTCA6IDApIHwKLSAJCQkJKChjc3R5bGUgJiBXU19WU0NST0xMKT8gV1NfVlNDUk9MTCA6IDApLAotCQkJCWxib3hyZWN0LmxlZnQsIGxib3hyZWN0LnRvcCwKLQkJCQlsYm94cmVjdC5yaWdodCAtIGxib3hyZWN0LmxlZnQsIAotCQkJCWxib3hyZWN0LmJvdHRvbSAtIGxib3hyZWN0LnRvcCwKLQkJCQlod25kcCwoSE1FTlUxNilJRF9DTEIsIFdJTl9HZXRXaW5kb3dJbnN0YW5jZShod25kKSwKLQkJCQkoTFBWT0lEKShIV05EMzIpaHduZCApOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ09NQk9fTkNDcmVhdGUKKyAqLworc3RhdGljIExSRVNVTFQgQ09NQk9fTkNDcmVhdGUoV05EKiB3bmQsIExQQVJBTSBsUGFyYW0pCit7CisgIExQSEVBRENPTUJPIAkJbHBoYzsKIAotICAgd25kUHRyLT5kd1N0eWxlICY9IH4oV1NfVlNDUk9MTCB8IFdTX0hTQ1JPTEwpOworICBpZiAoIHduZCAmJiBDT01CT19Jbml0KCkgJiYKKyAgICAgIChscGhjID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihIRUFEQ09NQk8pKSkgKQorICB7CisgICAgICAgTFBDUkVBVEVTVFJVQ1QzMkEgICAgIGxwY3MgPSAoQ1JFQVRFU1RSVUNUMzJBKilsUGFyYW07CisgICAgICAgCisgICAgICAgbWVtc2V0KCBscGhjLCAwLCBzaXplb2YoSEVBRENPTUJPKSApOworICAgICAgICooTFBIRUFEQ09NQk8qKXduZC0+d0V4dHJhID0gbHBoYzsKIAotICAgZHByaW50Zl9jb21ibyggc3RkZGViLCAiQ29tYm8gQ3JlYXRpb24gaHduZD0lMDR4ICBMQm94PSUwNHggIEVkaXQ9JTA0eFxuIiwKLSAgICAgICAgICAgICAgICAgIGh3bmQsIGxwaGMtPmhXbmRMQm94LCBscGhjLT5oV25kRWRpdCk7Ci0gICBkcHJpbnRmX2NvbWJvKCBzdGRkZWIsICIgIGxib3ggJWQsJWQtJWQsJWQgICAgIGJ1dHRvbiAlZCwlZC0lZCwlZFxuIiwKLSAgICAgICAgICAgICAgICAgIGxib3hyZWN0LmxlZnQsIGxib3hyZWN0LnRvcCwgbGJveHJlY3QucmlnaHQsIGxib3hyZWN0LmJvdHRvbSwKLSAgICAgICAgICAgICAgICAgIGxwaGMtPlJlY3RCdXR0b24ubGVmdCwgbHBoYy0+UmVjdEJ1dHRvbi50b3AsCi0gICAgICAgICAgICAgICAgICBscGhjLT5SZWN0QnV0dG9uLnJpZ2h0LCBscGhjLT5SZWN0QnV0dG9uLmJvdHRvbSApOwotICAgZHByaW50Zl9jb21ibyggc3RkZGViLCAiICAgY2xpZW50ICVkLCVkLSVkLCVkICAgICB3aW5kb3cgJWQsJWQtJWQsJWRcbiIsCi0gICAgICAgICAgICAgICAgICB3bmRQdHItPnJlY3RDbGllbnQubGVmdCwgd25kUHRyLT5yZWN0Q2xpZW50LnRvcCwKLSAgICAgICAgICAgICAgICAgIHduZFB0ci0+cmVjdENsaWVudC5yaWdodCwgd25kUHRyLT5yZWN0Q2xpZW50LmJvdHRvbSwKLSAgICAgICAgICAgICAgICAgIHduZFB0ci0+cmVjdFdpbmRvdy5sZWZ0LCB3bmRQdHItPnJlY3RXaW5kb3cudG9wLAotICAgICAgICAgICAgICAgICAgd25kUHRyLT5yZWN0V2luZG93LnJpZ2h0LCB3bmRQdHItPnJlY3RXaW5kb3cuYm90dG9tICk7CisgICAgICAgLyogc29tZSBicmFpbmRlYWQgYXBwcyBkbyB0cnkgdG8gdXNlIHNjcm9sbGJhci9ib3JkZXIgZmxhZ3MgKi8KKworICAgICAgIGxwaGMtPmR3U3R5bGUgPSAobHBjcy0+c3R5bGUgJiB+KFdTX0JPUkRFUiB8IFdTX0hTQ1JPTEwgfCBXU19WU0NST0xMKSk7CisgICAgICAgd25kLT5kd1N0eWxlICY9IH4oV1NfQk9SREVSIHwgV1NfSFNDUk9MTCB8IFdTX1ZTQ1JPTEwpOworCisgICAgICAgaWYoICEobHBjcy0+c3R5bGUgJiAoQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX09XTkVSRFJBV1ZBUklBQkxFKSkgKQorICAgICAgICAgICAgIGxwaGMtPmR3U3R5bGUgfD0gQ0JTX0hBU1NUUklOR1M7CisKKyAgICAgICBkcHJpbnRmX2NvbWJvKHN0ZGRlYiwgIkNPTUJPX05DQ3JlYXRlOiBbMHglMDh4XSwgc3R5bGUgPSAlMDh4XG4iLCAKKwkJCQkgICAgICAgICAgICAgIChVSU5UMzIpbHBoYywgbHBoYy0+ZHdTdHlsZSApOworCisgICAgICAgcmV0dXJuIChMUkVTVUxUKShVSU5UMzIpd25kLT5od25kU2VsZjsgCisgIH0KKyAgcmV0dXJuIChMUkVTVUxUKUZBTFNFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDT01CT19OQ0Rlc3Ryb3kKKyAqLworc3RhdGljIExSRVNVTFQgQ09NQk9fTkNEZXN0cm95KCBMUEhFQURDT01CTyBscGhjICkKK3sKKworICAgaWYoIGxwaGMgKQorICAgeworICAgICAgIFdORCoJCXduZCA9IGxwaGMtPnNlbGY7CisKKyAgICAgICBkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ29tYm8gWyUwNHhdOiBmcmVlaW5nIHN0b3JhZ2VcbiIsIENCX0hXTkQobHBoYykpOworCisgICAgICAgaWYoIChDQl9HRVRUWVBFKGxwaGMpICE9IENCU19TSU1QTEUpICYmIGxwaGMtPmhXbmRMQm94ICkgCisgICAJICAgRGVzdHJveVdpbmRvdzMyKCBscGhjLT5oV25kTEJveCApOworCisgICAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGxwaGMgKTsKKyAgICAgICB3bmQtPndFeHRyYVswXSA9IDA7CisgICB9CiAgICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ0JEZXN0cm95CisgKiAgICAgICAgICAgQ0JDYWxjUGxhY2VtZW50CisgKgorICogU2V0IHVwIGNvbXBvbmVudCBjb29yZGluYXRlcyBnaXZlbiB2YWxpZCBscGhjLT5SZWN0Q29tYm8uCiAgKi8KLXN0YXRpYyBMUkVTVUxUIENCRGVzdHJveShIV05EMTYgaHduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorc3RhdGljIHZvaWQgQ0JDYWxjUGxhY2VtZW50KCBMUEhFQURDT01CTyBscGhjLCAKKwkJCSAgICAgTFBSRUNUMTYgbHByRWRpdCwgTFBSRUNUMTYgbHByQnV0dG9uLCBMUFJFQ1QxNiBscHJMQiApCiB7Ci0gIExQSEVBRENPTUJPIGxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisgICBSRUNUMTYJcmVjdCA9IGxwaGMtPlJlY3RDb21ibzsKKyAgIFNJWkUxNglzaXplOwogCi0gIGlmIChscGhjLT5oV25kRWRpdCkgRGVzdHJveVdpbmRvdzMyKCBscGhjLT5oV25kRWRpdCApOwotICBpZiAobHBoYy0+aFduZExCb3gpIERlc3Ryb3lXaW5kb3czMiggbHBoYy0+aFduZExCb3ggKTsKLSAgcmV0dXJuIDA7Ci19CisgICAvKiBnZXQgY29tYm8gaGVpZ2h0IGFuZCB3aWR0aCAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDQlBhaW50Ci0gKi8KLXN0YXRpYyBMUkVTVUxUIENCUGFpbnQoSFdORDE2IGh3bmQsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKLXsKLSAgTFBIRUFETElTVCBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOwotICBMUEhFQURDT01CTyBscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotICBMUExJU1RTVFJVQ1QgbHBsczsKLSAgUEFJTlRTVFJVQ1QxNiAgcHM7Ci0gIEhCUlVTSDMyIGhCcnVzaDsKLSAgSEZPTlQzMiBoT2xkRm9udDsKLSAgSERDMTYgaGRjOwotICBSRUNUMTYgcmVjdDsKLSAgCi0gIGhkYyA9IEJlZ2luUGFpbnQxNihod25kLCAmcHMpOwotCi0gIEdldENsaWVudFJlY3QxNihod25kLCAmcmVjdCk7Ci0gIENCQ2hlY2tTaXplKGh3bmQpOwotICAvKiAxIGZvciBidXR0b24gYm9yZGVyICovCi0gIHJlY3QucmlnaHQgPSBscGhjLT5SZWN0QnV0dG9uLmxlZnQgLSAxOwotCi0gIGlmIChoQ29tYm9CaXQgIT0gMCAmJiAhSXNSZWN0RW1wdHkxNigmbHBoYy0+UmVjdEJ1dHRvbikpCi0gIHsKLSAgICBSZWN0YW5nbGUzMihoZGMsbHBoYy0+UmVjdEJ1dHRvbi5sZWZ0LTEsbHBoYy0+UmVjdEJ1dHRvbi50b3AtMSwKLSAgICAgICAgICAgICAgICBscGhjLT5SZWN0QnV0dG9uLnJpZ2h0KzEsbHBoYy0+UmVjdEJ1dHRvbi5ib3R0b20rMSk7Ci0gICAgewotICAgICAgICBSRUNUMzIgcjsKLSAgICAgICAgQ09OVl9SRUNUMTZUTzMyKCAmbHBoYy0+UmVjdEJ1dHRvbiwgJnIgKTsKLSAgICAgICAgR1JBUEhfRHJhd1JlbGllZlJlY3QoaGRjLCAmciwgMiwgMiwgRkFMU0UpOwotICAgIH0KLSAgICBHUkFQSF9EcmF3Qml0bWFwKGhkYywgaENvbWJvQml0LAotCQkgICAgIGxwaGMtPlJlY3RCdXR0b24ubGVmdCArIDIsbHBoYy0+UmVjdEJ1dHRvbi50b3AgKyAyLAotCQkgICAgIDAsIDAsIENCaXRXaWR0aCwgQ0JpdEhlaWdodCApOwotICB9Ci0gIGlmICghSXNXaW5kb3dWaXNpYmxlMTYoaHduZCkgfHwgIWxwaGwtPmJSZWRyYXdGbGFnIAotICAgICAgfHwgKGxwaGMtPmR3U3R5bGUgJiAzKSAhPSBDQlNfRFJPUERPV05MSVNUKSAKLSAgewotICAgIC8qIHdlIGRvbid0IHdhbnQgdG8gZHJhdyBhbiBlbnRyeSB3aGVuIHRoZXJlIGlzIGFuIGVkaXQgY29udHJvbCAqLwotICAgIEVuZFBhaW50MTYoaHduZCwgJnBzKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGhPbGRGb250ID0gU2VsZWN0T2JqZWN0MzIoaGRjLCBscGhsLT5oRm9udCk7Ci0KLSAgaEJydXNoID0gU2VuZE1lc3NhZ2UzMkEoIGxwaGwtPmhQYXJlbnQsIFdNX0NUTENPTE9STElTVEJPWCwgaGRjLCBod25kICk7Ci0gIGlmIChoQnJ1c2ggPT0gMCkgaEJydXNoID0gR2V0U3RvY2tPYmplY3QzMihXSElURV9CUlVTSCk7Ci0KLSAgbHBscyA9IExpc3RCb3hHZXRJdGVtKGxwaGwsbHBobC0+SXRlbUZvY3VzZWQpOwotICBpZiAobHBscyAhPSBOVUxMKSB7ICAKLSAgICBGaWxsUmVjdDE2KGhkYywgJnJlY3QsIGhCcnVzaCk7Ci0gICAgTGlzdEJveERyYXdJdGVtIChod25kLCBscGhsLCBoZGMsIGxwbHMsICZyZWN0LCBPREFfRFJBV0VOVElSRSwgMCk7Ci0gICAgaWYgKEdldEZvY3VzMzIoKSA9PSBod25kKQotICAgIExpc3RCb3hEcmF3SXRlbSAoaHduZCxscGhsLCBoZGMsIGxwbHMsICZyZWN0LCBPREFfRk9DVVMsIE9EU19GT0NVUyk7Ci0gIH0KLSAgZWxzZSBGaWxsUmVjdDE2KGhkYywgJnJlY3QsIGhCcnVzaCk7Ci0gIFNlbGVjdE9iamVjdDMyKGhkYyxoT2xkRm9udCk7Ci0gIEVuZFBhaW50MTYoaHduZCwgJnBzKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENCR2V0RGxnQ29kZQotICovCi1zdGF0aWMgTFJFU1VMVCBDQkdldERsZ0NvZGUoSFdORDE2IGh3bmQsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKLXsKLSAgcmV0dXJuIERMR0NfV0FOVEFSUk9XUyB8IERMR0NfV0FOVENIQVJTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDQkxCdXR0b25Eb3duCi0gKi8KLXN0YXRpYyBMUkVTVUxUIENCTEJ1dHRvbkRvd24oSFdORDE2IGh3bmQsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKLXsKLSAgTFBIRUFEQ09NQk8gbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihod25kKTsKLSAgU2VuZE1lc3NhZ2UxNihod25kLENCX1NIT1dEUk9QRE9XTjE2LCFscGhjLT5Ecm9wRG93blZpc2libGUsMCk7Ci0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDQktleURvd24KLSAqLwotc3RhdGljIExSRVNVTFQgQ0JLZXlEb3duKEhXTkQxNiBod25kLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCi17Ci0gIExQSEVBRExJU1QgbHBobCA9IENvbWJvR2V0TGlzdEhlYWRlcihod25kKTsKLSAgV09SRCAgICAgICBuZXdGb2N1c2VkID0gbHBobC0+SXRlbUZvY3VzZWQ7Ci0KLSAgc3dpdGNoKHdQYXJhbSkgewotICBjYXNlIFZLX0hPTUU6Ci0gICAgbmV3Rm9jdXNlZCA9IDA7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVktfRU5EOgotICAgIG5ld0ZvY3VzZWQgPSBscGhsLT5JdGVtc0NvdW50IC0gMTsKLSAgICBicmVhazsKLSAgY2FzZSBWS19VUDoKLSAgICBpZiAobmV3Rm9jdXNlZCA+IDApIG5ld0ZvY3VzZWQtLTsKLSAgICBicmVhazsKLSAgY2FzZSBWS19ET1dOOgotICAgIG5ld0ZvY3VzZWQrKzsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGlmIChuZXdGb2N1c2VkID49IGxwaGwtPkl0ZW1zQ291bnQpCi0gICAgbmV3Rm9jdXNlZCA9IGxwaGwtPkl0ZW1zQ291bnQgLSAxOwotICAKLSAgTGlzdEJveFNldEN1clNlbChscGhsLCBuZXdGb2N1c2VkKTsKLSAgU2VuZE1lc3NhZ2UxNihod25kLCBXTV9DT01NQU5ELElEX0NMQixNQUtFTE9ORygwLENCTl9TRUxDSEFOR0UpKTsKLSAgTGlzdEJveFNlbmROb3RpZmljYXRpb24obHBobCwgQ0JOX1NFTENIQU5HRSk7Ci0KLSAgbHBobC0+SXRlbUZvY3VzZWQgPSBuZXdGb2N1c2VkOwotICBMaXN0Qm94U2Nyb2xsVG9Gb2N1cyhscGhsKTsKLS8qICBTZXRTY3JvbGxQb3MoaHduZCwgU0JfVkVSVCwgbHBobC0+Rmlyc3RWaXNpYmxlLCBUUlVFKTsqLwotICBJbnZhbGlkYXRlUmVjdDMyKCBod25kLCBOVUxMLCBUUlVFICk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENCQ2hhcgotICovCi1zdGF0aWMgTFJFU1VMVCBDQkNoYXIoSFdORDE2IGh3bmQsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKLXsKLSAgTFBIRUFETElTVCBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOwotICBXT1JEICAgICAgIG5ld0ZvY3VzZWQ7Ci0KLSAgbmV3Rm9jdXNlZCA9IExpc3RCb3hGaW5kTmV4dE1hdGNoKGxwaGwsIHdQYXJhbSk7Ci0gIGlmIChuZXdGb2N1c2VkID09IChXT1JEKUxCX0VSUikgcmV0dXJuIDA7Ci0KLSAgaWYgKG5ld0ZvY3VzZWQgPj0gbHBobC0+SXRlbXNDb3VudCkKLSAgICBuZXdGb2N1c2VkID0gbHBobC0+SXRlbXNDb3VudCAtIDE7Ci0gIAotICBMaXN0Qm94U2V0Q3VyU2VsKGxwaGwsIG5ld0ZvY3VzZWQpOwotICBTZW5kTWVzc2FnZTE2KGh3bmQsIFdNX0NPTU1BTkQsSURfQ0xCLE1BS0VMT05HKDAsQ0JOX1NFTENIQU5HRSkpOwotICBMaXN0Qm94U2VuZE5vdGlmaWNhdGlvbihscGhsLCBDQk5fU0VMQ0hBTkdFKTsKLSAgbHBobC0+SXRlbUZvY3VzZWQgPSBuZXdGb2N1c2VkOwotICBMaXN0Qm94U2Nyb2xsVG9Gb2N1cyhscGhsKTsKLSAgCi0vKiAgU2V0U2Nyb2xsUG9zKGh3bmQsIFNCX1ZFUlQsIGxwaGwtPkZpcnN0VmlzaWJsZSwgVFJVRSk7Ki8KLSAgSW52YWxpZGF0ZVJlY3QzMiggaHduZCwgTlVMTCwgVFJVRSApOwotCi0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDQktpbGxGb2N1cwotICovCi1zdGF0aWMgTFJFU1VMVCBDQktpbGxGb2N1cyhIV05EMTYgaHduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ0JTZXRGb2N1cwotICovCi1zdGF0aWMgTFJFU1VMVCBDQlNldEZvY3VzKEhXTkQxNiBod25kLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCi17Ci0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDQlJlc2V0Q29udGVudAotICovCi1zdGF0aWMgTFJFU1VMVCBDQlJlc2V0Q29udGVudChIV05EMTYgaHduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotICBMUEhFQURMSVNUIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7Ci0gIExQSEVBRENPTUJPIGxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0KLSAgTGlzdEJveFJlc2V0Q29udGVudChscGhsKTsKLSAgQ29tYm9VcGRhdGVXaW5kb3coaHduZCwgbHBobCwgbHBoYywgVFJVRSk7Ci0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDQkRpcgotICovCi1zdGF0aWMgTFJFU1VMVCBDQkRpcihIV05EMTYgaHduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotICBXT1JEIHdSZXQ7Ci0gIExQSEVBRExJU1QgbHBobCA9IENvbWJvR2V0TGlzdEhlYWRlcihod25kKTsKLSAgTFBIRUFEQ09NQk8gbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihod25kKTsKLQotICB3UmV0ID0gTGlzdEJveERpcmVjdG9yeShscGhsLCB3UGFyYW0sIChMUFNUUilQVFJfU0VHX1RPX0xJTihsUGFyYW0pKTsKLSAgQ29tYm9VcGRhdGVXaW5kb3coaHduZCwgbHBobCwgbHBoYywgVFJVRSk7Ci0gIHJldHVybiB3UmV0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDQkluc2VydFN0cmluZwotICovCi1zdGF0aWMgTFJFU1VMVCBDQkluc2VydFN0cmluZyhIV05EMTYgaHduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotICBXT1JEICB3UmV0OwotICBMUEhFQURMSVNUIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7Ci0gIExQSEVBRENPTUJPIGxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0KLSAgaWYgKGxwaGwtPkhhc1N0cmluZ3MpCi0gICAgd1JldCA9IExpc3RCb3hJbnNlcnRTdHJpbmcobHBobCwgd1BhcmFtLCAoTFBTVFIpUFRSX1NFR19UT19MSU4obFBhcmFtKSk7Ci0gIGVsc2UKLSAgICB3UmV0ID0gTGlzdEJveEluc2VydFN0cmluZyhscGhsLCB3UGFyYW0sIChMUFNUUilsUGFyYW0pOwotICBDb21ib1VwZGF0ZVdpbmRvdyhod25kLCBscGhsLCBscGhjLCBUUlVFKTsKLSAgcmV0dXJuIHdSZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENCQWRkU3RyaW5nCi0gKi8KLXN0YXRpYyBMUkVTVUxUIENCQWRkU3RyaW5nKEhXTkQxNiBod25kLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCi17Ci0gIFdPUkQgIHdSZXQ7Ci0gIExQSEVBRExJU1QgbHBobCA9IENvbWJvR2V0TGlzdEhlYWRlcihod25kKTsKLSAgTFBIRUFEQ09NQk8gbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihod25kKTsKLQotICB3UmV0ID0gTGlzdEJveEFkZFN0cmluZyhscGhsLCAoU0VHUFRSKWxQYXJhbSk7Ci0KLSAgQ29tYm9VcGRhdGVXaW5kb3coaHduZCwgbHBobCwgbHBoYywgVFJVRSk7Ci0gIHJldHVybiB3UmV0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDQkRlbGV0ZVN0cmluZwotICovCi1zdGF0aWMgTFJFU1VMVCBDQkRlbGV0ZVN0cmluZyhIV05EMTYgaHduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotICBMUEhFQURMSVNUIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7Ci0gIExQSEVBRENPTUJPIGxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0gIExPTkcgbFJldCA9IExpc3RCb3hEZWxldGVTdHJpbmcobHBobCx3UGFyYW0pOwotICAKLSAgQ29tYm9VcGRhdGVXaW5kb3coaHduZCwgbHBobCwgbHBoYywgVFJVRSk7Ci0gIHJldHVybiBsUmV0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDQlNlbGVjdFN0cmluZwotICovCi1zdGF0aWMgTFJFU1VMVCBDQlNlbGVjdFN0cmluZyhIV05EMTYgaHduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotICBMUEhFQURMSVNUIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7Ci0gIFdPUkQgIHdSZXQ7Ci0KLSAgd1JldCA9IExpc3RCb3hGaW5kU3RyaW5nKGxwaGwsIHdQYXJhbSwgKFNFR1BUUilsUGFyYW0pOwotCi0gIC8qIFhYWCBhZGQgZnVuY3Rpb25hbGl0eSBoZXJlICovCi0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENCRmluZFN0cmluZwotICovCi1zdGF0aWMgTFJFU1VMVCBDQkZpbmRTdHJpbmcoSFdORDE2IGh3bmQsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKLXsKLSAgTFBIRUFETElTVCBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOwotICByZXR1cm4gTGlzdEJveEZpbmRTdHJpbmcobHBobCwgd1BhcmFtLCAoU0VHUFRSKWxQYXJhbSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENCRmluZFN0cmluZ0V4YWN0Ci0gKi8KLXN0YXRpYyBMUkVTVUxUIENCRmluZFN0cmluZ0V4YWN0KEhXTkQxNiBod25kLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCi17Ci0gIExQSEVBRExJU1QgbHBobCA9IENvbWJvR2V0TGlzdEhlYWRlcihod25kKTsKLSAgcmV0dXJuIExpc3RCb3hGaW5kU3RyaW5nRXhhY3QobHBobCwgd1BhcmFtLCAoU0VHUFRSKWxQYXJhbSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENCR2V0Q291bnQKLSAqLwotc3RhdGljIExSRVNVTFQgQ0JHZXRDb3VudChIV05EMTYgaHduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotICBMUEhFQURMSVNUIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7Ci0gIHJldHVybiBscGhsLT5JdGVtc0NvdW50OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDQlNldEN1clNlbAotICovCi1zdGF0aWMgTFJFU1VMVCBDQlNldEN1clNlbChIV05EMTYgaHduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotICBMUEhFQURMSVNUIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7Ci0gIFdPUkQgIHdSZXQ7Ci0KLSAgd1JldCA9IExpc3RCb3hTZXRDdXJTZWwobHBobCwgd1BhcmFtKTsKLQotICBkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ0JTZXRDdXJTZWw6IGh3bmQgJTA0eCB3cCAleCBscCAlbHggd1JldCAlZFxuIiwKLQkJaHduZCx3UGFyYW0sbFBhcmFtLHdSZXQpOwotLyogIFNldFNjcm9sbFBvcyhod25kLCBTQl9WRVJULCBscGhsLT5GaXJzdFZpc2libGUsIFRSVUUpOyovCi0gIEludmFsaWRhdGVSZWN0MzIoIGh3bmQsIE5VTEwsIFRSVUUgKTsKLQotICByZXR1cm4gd1JldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ0JHZXRDdXJTZWwKLSAqLwotc3RhdGljIExSRVNVTFQgQ0JHZXRDdXJTZWwoSFdORDE2IGh3bmQsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKLXsKLSAgTFBIRUFETElTVCBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOwotICByZXR1cm4gbHBobC0+SXRlbUZvY3VzZWQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENCR2V0SXRlbUhlaWdodAotICovCi1zdGF0aWMgTFJFU1VMVCBDQkdldEl0ZW1IZWlnaHQoSFdORDE2IGh3bmQsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKLXsKLSAgTFBIRUFETElTVCBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOwotICBMUExJU1RTVFJVQ1QgbHBscyA9IExpc3RCb3hHZXRJdGVtIChscGhsLCB3UGFyYW0pOwotCi0gIGlmIChscGxzID09IE5VTEwpIHJldHVybiBMQl9FUlI7Ci0gIHJldHVybiBscGxzLT5taXMuaXRlbUhlaWdodDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ0JTZXRJdGVtSGVpZ2h0Ci0gKi8KLXN0YXRpYyBMUkVTVUxUIENCU2V0SXRlbUhlaWdodChIV05EMTYgaHduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotICBMUEhFQURMSVNUIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7Ci0gIHJldHVybiBMaXN0Qm94U2V0SXRlbUhlaWdodChscGhsLCB3UGFyYW0sIGxQYXJhbSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENCU2V0UmVkcmF3Ci0gKi8KLXN0YXRpYyBMUkVTVUxUIENCU2V0UmVkcmF3KEhXTkQxNiBod25kLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCi17Ci0gIExQSEVBRExJU1QgbHBobCA9IENvbWJvR2V0TGlzdEhlYWRlcihod25kKTsKLSAgbHBobC0+YlJlZHJhd0ZsYWcgPSB3UGFyYW07Ci0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDQlNldEZvbnQKLSAqLwotc3RhdGljIExSRVNVTFQgQ0JTZXRGb250KEhXTkQxNiBod25kLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCi17Ci0gIExQSEVBRExJU1QgIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7Ci0gIExQSEVBRENPTUJPIGxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0gIAotICBpZiAod1BhcmFtID09IDApCi0gICAgbHBobC0+aEZvbnQgPSBHZXRTdG9ja09iamVjdDMyKFNZU1RFTV9GT05UKTsKLSAgZWxzZQotICAgIGxwaGwtPmhGb250ID0gKEhGT05UMTYpd1BhcmFtOwotICBpZiAobHBoYy0+aFduZEVkaXQpCi0gICAgIFNlbmRNZXNzYWdlMTYobHBoYy0+aFduZEVkaXQsV01fU0VURk9OVCxscGhsLT5oRm9udCwwKTsgCi0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDQkdldExCVGV4dExlbgotICovCi1zdGF0aWMgTFJFU1VMVCBDQkdldExCVGV4dExlbihIV05EMTYgaHduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotICBMUEhFQURMSVNUICAgbHBobCA9IENvbWJvR2V0TGlzdEhlYWRlcihod25kKTsKLSAgTFBMSVNUU1RSVUNUIGxwbHMgPSBMaXN0Qm94R2V0SXRlbShscGhsLHdQYXJhbSk7Ci0KLSAgaWYgKGxwbHMgPT0gTlVMTCB8fCAhbHBobC0+SGFzU3RyaW5ncykgcmV0dXJuIExCX0VSUjsKLSAgcmV0dXJuIHN0cmxlbihscGxzLT5pdGVtVGV4dCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENCR2V0TEJUZXh0Ci0gKi8KLXN0YXRpYyBMUkVTVUxUIENCR2V0TEJUZXh0KEhXTkQxNiBod25kLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCi17Ci0gIExQSEVBRExJU1QgbHBobCA9IENvbWJvR2V0TGlzdEhlYWRlcihod25kKTsKLSAgcmV0dXJuIExpc3RCb3hHZXRUZXh0KGxwaGwsIHdQYXJhbSwgKExQU1RSKVBUUl9TRUdfVE9fTElOKGxQYXJhbSkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDQkdldEl0ZW1EYXRhCi0gKi8KLXN0YXRpYyBMUkVTVUxUIENCR2V0SXRlbURhdGEoSFdORDE2IGh3bmQsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKLXsKLSAgTFBIRUFETElTVCBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOwotICByZXR1cm4gTGlzdEJveEdldEl0ZW1EYXRhKGxwaGwsIHdQYXJhbSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENCU2V0SXRlbURhdGEKLSAqLwotc3RhdGljIExSRVNVTFQgQ0JTZXRJdGVtRGF0YShIV05EMTYgaHduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotICBMUEhFQURMSVNUIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7Ci0gIHJldHVybiBMaXN0Qm94U2V0SXRlbURhdGEobHBobCwgd1BhcmFtLCBsUGFyYW0pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDQlNob3dEcm9wRG93bgotICovCi1zdGF0aWMgTFJFU1VMVCBDQlNob3dEcm9wRG93bihIV05EMTYgaHduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotICBMUEhFQURDT01CTyBscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotICBSRUNUMzIgcmVjdDsKLSAgCi0gIGlmICgobHBoYy0+ZHdTdHlsZSAmIDMpID09IENCU19TSU1QTEUpIHJldHVybiBMQl9FUlI7Ci0gIAotICB3UGFyYW0gPSAhIXdQYXJhbTsKLSAgaWYgKHdQYXJhbSAhPSBscGhjLT5Ecm9wRG93blZpc2libGUpIHsKLSAgICBscGhjLT5Ecm9wRG93blZpc2libGUgPSB3UGFyYW07Ci0gICAgR2V0V2luZG93UmVjdDMyKGh3bmQsJnJlY3QpOwotICAgIFNldFdpbmRvd1BvczMyKGxwaGMtPmhXbmRMQm94LCAwLCByZWN0LmxlZnQsIHJlY3QudG9wK2xwaGMtPkxCb3hUb3AsIDAsIDAsCi0JCSBTV1BfTk9TSVpFIHwgU1dQX05PQUNUSVZBVEUgfAotICAgICAgICAgICAgICAgICAod1BhcmFtID8gU1dQX1NIT1dXSU5ET1cgOiBTV1BfSElERVdJTkRPVykpOwotICAgIGlmICghd1BhcmFtKSBTZXRGb2N1czMyKGh3bmQpOwotICB9Ci0gIHJldHVybiAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgQ0JDaGVja1NpemUKLSAqLwotc3RhdGljIEJPT0wzMiBDQkNoZWNrU2l6ZShIV05EMTYgaHduZCkKLXsKLSAgTFBIRUFEQ09NQk8gIGxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0gIExQSEVBRExJU1QgICBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOwotICBMT05HICAgICAgICAgY3N0eWxlID0gR2V0V2luZG93TG9uZzMyQShod25kLEdXTF9TVFlMRSk7Ci0gIFJFQ1QxNiAgICAgICBjUmVjdCwgd1JlY3Q7Ci0KLSAgaWYgKGxwaGMtPmhXbmRMQm94ID09IDApIHJldHVybiBGQUxTRTsKLQotICBHZXRDbGllbnRSZWN0MTYoaHduZCwmY1JlY3QpOwotICBHZXRXaW5kb3dSZWN0MTYoaHduZCwmd1JlY3QpOwotCi0gIGRwcmludGZfY29tYm8oc3RkZGViLAotCSAiQ0JDaGVja1NpemU6IGh3bmQgJTA0eCBSZWN0ICVkLCVkLSVkLCVkICB3UmVjdCAlZCwlZC0lZCwlZFxuIiwgCi0JCWh3bmQsY1JlY3QubGVmdCxjUmVjdC50b3AsY1JlY3QucmlnaHQsY1JlY3QuYm90dG9tLAotCQl3UmVjdC5sZWZ0LHdSZWN0LnRvcCx3UmVjdC5yaWdodCx3UmVjdC5ib3R0b20pOwotICBpZiAoKGNzdHlsZSAmIDMpID09IENCU19TSU1QTEUpIHJldHVybiBUUlVFOwotCi0gIGlmICgoY1JlY3QuYm90dG9tIC0gY1JlY3QudG9wKSA+Ci0gICAgICAobHBobC0+U3RkSXRlbUhlaWdodCArIDIqU1lTTUVUUklDU19DWUJPUkRFUikpIHsKLSAgICBTZXRXaW5kb3dQb3MzMihod25kLCAwLCAwLCAwLCAKLQkJIGNSZWN0LnJpZ2h0LWNSZWN0LmxlZnQsCi0JCSBscGhsLT5TdGRJdGVtSGVpZ2h0KzIqU1lTTUVUUklDU19DWUJPUkRFUiwgCi0JCSBTV1BfTk9NT1ZFIHwgU1dQX05PWk9SREVSIHwgU1dQX05PUkVEUkFXIHwgU1dQX05PQUNUSVZBVEUgKTsKLSAgICBHZXRDbGllbnRSZWN0MTYoaHduZCwmY1JlY3QpOwotICAgIEdldFdpbmRvd1JlY3QxNihod25kLCZ3UmVjdCk7Ci0KLSAgICBscGhjLT5SZWN0QnV0dG9uLnJpZ2h0ID0gY1JlY3QucmlnaHQ7Ci0gICAgbHBoYy0+UmVjdEJ1dHRvbi5sZWZ0ID0gY1JlY3QucmlnaHQgLSAyKlNZU01FVFJJQ1NfQ1hCT1JERVIgLSA0IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gQ0JpdFdpZHRoOwotICAgIGxwaGMtPlJlY3RCdXR0b24udG9wID0gY1JlY3QudG9wOwotICAgIGxwaGMtPlJlY3RCdXR0b24uYm90dG9tID0gY1JlY3QuYm90dG9tOwotICB9Ci0KLSAgaWYgKGNSZWN0LnJpZ2h0IDwgbHBoYy0+UmVjdEJ1dHRvbi5sZWZ0KSB7Ci0gICAgLyogaWYgdGhlIGJ1dHRvbiBpcyBvdXRzaWRlIHRoZSB3aW5kb3cgbW92ZSBpdCBpbiAqLwotICAgIGlmICgod1JlY3QucmlnaHQgLSB3UmVjdC5sZWZ0IC0gMipTWVNNRVRSSUNTX0NYQk9SREVSKSA9PSAoY1JlY3QucmlnaHQgLSBjUmVjdC5sZWZ0KSkgewotICAgICAgbHBoYy0+UmVjdEJ1dHRvbi5yaWdodCA9IGNSZWN0LnJpZ2h0OwotICAgICAgbHBoYy0+UmVjdEJ1dHRvbi5sZWZ0ID0gY1JlY3QucmlnaHQgLSAyKlNZU01FVFJJQ1NfQ1hCT1JERVIgLSA0IAotCSAgICAgICAgICAgICAgICAgICAgICAgLSBDQml0V2lkdGg7Ci0gICAgICBscGhjLT5SZWN0QnV0dG9uLnRvcCA9IGNSZWN0LnRvcDsKLSAgICAgIGxwaGMtPlJlY3RCdXR0b24uYm90dG9tID0gY1JlY3QuYm90dG9tOwotICAgIH0KLSAgICAvKiBvdGhlcndpc2Ugd2UgbmVlZCB0byBtYWtlIHRoZSBjbGllbnQgaW5jbHVkZSB0aGUgYnV0dG9uICovCi0gICAgZWxzZQotICAgICAgU2V0V2luZG93UG9zMzIoaHduZCwgMCwgMCwgMCwgbHBoYy0+UmVjdEJ1dHRvbi5yaWdodCwKLQkJICAgbHBobC0+U3RkSXRlbUhlaWdodCsyKlNZU01FVFJJQ1NfQ1lCT1JERVIsCi0JCSAgIFNXUF9OT01PVkUgfCBTV1BfTk9aT1JERVIgfCBTV1BfTk9SRURSQVcgfCBTV1BfTk9BQ1RJVkFURSk7Ci0KLSAgICAgIGlmICgobHBoYy0+ZHdTdHlsZSAmIDMpICE9IENCU19EUk9QRE9XTkxJU1QpCi0gICAgICAgIFNldFdpbmRvd1BvczMyKGxwaGMtPmhXbmRFZGl0LCAwLCAwLCAwLCBscGhjLT5SZWN0QnV0dG9uLmxlZnQsCi0JCSAgICAgbHBobC0+U3RkSXRlbUhlaWdodCwKLQkJICAgICBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT01PVkUgfCBTV1BfTk9aT1JERVIgKTsKLSAgfQotCi0gIENCTENoZWNrU2l6ZShod25kKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENCQ29tbWFuZCAgICAgICAgCi0gKi8KLXN0YXRpYyBMUkVTVUxUIENCQ29tbWFuZChIV05EMTYgaHduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotICBMUEhFQURDT01CTyBscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotICBMUEhFQURMSVNUIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7Ci0gIGNoYXIgICAgICAgYnVmZmVyWzI1Nl07Ci0gIFdPUkQgICAgICAgbmV3Rm9jdXNlZDsKLSAgV09SRCAgICAgICBpZDsKLSAgaWYgKGxwaGMtPmhXbmRFZGl0KSAgLyogaW50ZXJkZXBlbmRlbmNlIG9ubHkgdXNlZCBmb3IgQ0JTX1NJTVBMRSBhbmQgQ0JTX0RST1BET1dOIHN0eWxlcyAqLwotICB7Ci0gICBzd2l0Y2ggKHdQYXJhbSkKKyAgIGlmKCBscGhjLT5lZGl0SGVpZ2h0ICkKKyAgICAgICBzaXplLmN5ID0gKElOVDE2KWxwaGMtPmVkaXRIZWlnaHQ7CisgICBlbHNlCiAgICB7Ci0gICAgY2FzZSBJRF9DTEI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBFRElUIHdpbmRvdyAqLwotICAgICAgICAgICAgICAgIGlmIChISVdPUkQobFBhcmFtKT09Q0JOX1NFTENIQU5HRSkKLSAgICAgICAgICAgICAgICAgaWYgKGxwaGwtPkhhc1N0cmluZ3MpCi0gICAgICAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgICAgICBMaXN0Qm94R2V0VGV4dChscGhsLGxwaGwtPkl0ZW1Gb2N1c2VkLCBidWZmZXIpOwotICAgICAgICAgICAgICAgICAgZHByaW50Zl9jb21ibyhzdGRkZWIsIkNCQ29tbWFuZDogdXBkYXRlIEVkaXQ6ICVzXG4iLGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICBTZXRXaW5kb3dUZXh0MzJBKCBscGhjLT5oV25kRWRpdCwgYnVmZmVyICk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICBjYXNlIElEX0VESVQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1cGRhdGUgTElTVEJPWCB3aW5kb3cgKi8KLSAgICAgICAgICAgICAgICAgaWQgPSBHZXRXaW5kb3dXb3JkMzIoaHduZCxHV1dfSUQpOwotICAgICAgICAgICAgICAgICBzd2l0Y2ggKEhJV09SRChsUGFyYW0pKQotICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBjYXNlIEVOX1VQREFURTpHZXRXaW5kb3dUZXh0MzJBKGxwaGMtPmhXbmRFZGl0LGJ1ZmZlciwyNTUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3RyID0gU0VHUFRSX1NUUkRVUChidWZmZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0ZvY3VzZWQ9TGlzdEJveEZpbmRTdHJpbmcobHBobCwgLTEsIFNFR1BUUl9HRVQoc3RyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VHUFRSX0ZSRUUoc3RyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ0JDb21tYW5kOiBuZXcgc2VsZWN0aW9uICMlZCBpcz0gJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb2N1c2VkLGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0ZvY3VzZWQgIT0gKFdPUkQpTEJfRVJSKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIGZvdW5kIHNvbWV0aGluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0Qm94U2V0Q3VyU2VsKGxwaGwsIG5ld0ZvY3VzZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0Qm94U2VuZE5vdGlmaWNhdGlvbihscGhsLCBDQk5fU0VMQ0hBTkdFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZGF0ZVJlY3QzMihod25kLCBOVUxMLCBUUlVFKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UxNihHZXRQYXJlbnQxNihod25kKSxXTV9DT01NQU5ELGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyhod25kLCBDQk5fRURJVFVQREFURSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBjYXNlIEVOX0NIQU5HRTpTZW5kTWVzc2FnZTE2KEdldFBhcmVudDE2KGh3bmQpLFdNX0NPTU1BTkQsaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKGh3bmQsIENCTl9FRElUQ0hBTkdFKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGNhc2UgRU5fRVJSU1BBQ0U6U2VuZE1lc3NhZ2UxNihHZXRQYXJlbnQxNihod25kKSxXTV9DT01NQU5ELGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyhod25kLCBDQk5fRVJSU1BBQ0UpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsgICAgICAgIAorICAgICAgIEhEQzE2CWhEQyA9IEdldERDMTYoIGxwaGMtPnNlbGYtPmh3bmRTZWxmICk7CisgICAgICAgSEZPTlQxNgloUHJldkZvbnQgPSAoSEZPTlQxNikwOworCisgICAgICAgaWYoIGxwaGMtPmhGb250ICkgaFByZXZGb250ID0gU2VsZWN0T2JqZWN0MTYoIGhEQywgbHBoYy0+aEZvbnQgKTsKKyAgIAorICAgICAgIEdldFRleHRFeHRlbnRQb2ludDE2KCBoREMsICJYIiwgMSwgJnNpemUpOworICAgICAgIHNpemUuY3kgKz0gc2l6ZS5jeSAvIDQgKyA0ICogU1lTTUVUUklDU19DWUJPUkRFUjsKKworICAgICAgIGlmKCBoUHJldkZvbnQgKSBTZWxlY3RPYmplY3QxNiggaERDLCBoUHJldkZvbnQgKTsKKyAgICAgICBSZWxlYXNlREMxNiggbHBoYy0+c2VsZi0+aHduZFNlbGYsIGhEQyApOwogICAgfQotICB9IAorICAgc2l6ZS5jeCA9IHJlY3QucmlnaHQgLSByZWN0LmxlZnQ7CisKKyAgIGlmKCBDQl9PV05FUkRSQVdOKGxwaGMpICkKKyAgIHsKKyAgICAgICBVSU5UMTYJdSA9IGxwaGMtPlJlY3RFZGl0LmJvdHRvbSAtIGxwaGMtPlJlY3RFZGl0LnRvcDsKKworICAgICAgIGlmKCBscGhjLT53U3RhdGUgJiBDQkZfTUVBU1VSRUlURU0gKSAvKiBmaXJzdCBpbml0aWFsaXphdGlvbiAqLworICAgICAgIHsKKwkgTUVBU1VSRUlURU1TVFJVQ1QzMiAgICAgICAgbWkzMjsKKworCSBscGhjLT53U3RhdGUgJj0gfkNCRl9NRUFTVVJFSVRFTTsKKwkgbWkzMi5DdGxUeXBlID0gT0RUX0NPTUJPQk9YOworCSBtaTMyLkN0bElEICAgPSBscGhjLT5zZWxmLT53SURtZW51OworCSBtaTMyLml0ZW1JRCAgPSAtMTsKKwkgbWkzMi5pdGVtV2lkdGggID0gc2l6ZS5jeDsKKwkgbWkzMi5pdGVtSGVpZ2h0ID0gc2l6ZS5jeSAtIDY7CS8qIG93bmVyZHJhd24gY2IgaXMgdGFsbGVyICovCisJIG1pMzIuaXRlbURhdGEgICA9IDA7CisJIFNlbmRNZXNzYWdlMzJBKGxwaGMtPm93bmVyLCBXTV9NRUFTVVJFSVRFTSwgCisJCQkJKFdQQVJBTTMyKW1pMzIuQ3RsSUQsIChMUEFSQU0pJm1pMzIpOworCSB1ID0gNiArIChVSU5UMTYpbWkzMi5pdGVtSGVpZ2h0OworICAgICAgIH0KKyAgICAgICBzaXplLmN5ID0gdTsKKyAgIH0KKworICAgLyogY2FsY3VsYXRlIHRleHQgYW5kIGJ1dHRvbiBwbGFjZW1lbnQgKi8KKworICAgbHByRWRpdC0+bGVmdCA9IGxwckVkaXQtPnRvcCA9IGxwckJ1dHRvbi0+dG9wID0gMDsKKyAgIGlmKCBDQl9HRVRUWVBFKGxwaGMpID09IENCU19TSU1QTEUgKSAJLyogbm8gYnV0dG9uICovCisgICAgICAgbHByQnV0dG9uLT5sZWZ0ID0gbHByQnV0dG9uLT5yaWdodCA9IGxwckJ1dHRvbi0+Ym90dG9tID0gMDsKKyAgIGVsc2UKKyAgIHsKKyAgICAgICBJTlQzMglpID0gc2l6ZS5jeCAtIENCaXRXaWR0aCAtIDEwOwkvKiBzZWVtcyBvayAqLworCisgICAgICAgbHByQnV0dG9uLT5yaWdodCA9IHNpemUuY3g7CisgICAgICAgbHByQnV0dG9uLT5sZWZ0ID0gKElOVDE2KWk7CisgICAgICAgbHByQnV0dG9uLT5ib3R0b20gPSBscHJCdXR0b24tPnRvcCArIHNpemUuY3k7CisKKyAgICAgICBpZiggaSA8IDAgKSBzaXplLmN4ID0gMDsKKyAgICAgICBlbHNlIHNpemUuY3ggPSAoSU5UMTYpaTsKKyAgIH0KKworICAgaWYoIENCX0dFVFRZUEUobHBoYykgPT0gQ0JTX0RST1BET1dOICkKKyAgIHsKKyAgICAgICBzaXplLmN4IC09IENCaXRPZmZzZXQ7CisgICAgICAgaWYoIHNpemUuY3ggPCAwICkgc2l6ZS5jeCA9IDA7CisgICB9CisKKyAgIGxwckVkaXQtPnJpZ2h0ID0gc2l6ZS5jeDsgbHByRWRpdC0+Ym90dG9tID0gc2l6ZS5jeTsKKworICAgLyogbGlzdGJveCBwbGFjZW1lbnQgKi8KKworICAgbHByTEItPmxlZnQgPSAoIENCX0dFVFRZUEUobHBoYykgPT0gQ0JTX0RST1BET1dOTElTVCApID8gMCA6IENCaXRPZmZzZXQ7CisgICBscHJMQi0+dG9wID0gbHByRWRpdC0+Ym90dG9tIC0gU1lTTUVUUklDU19DWUJPUkRFUjsKKyAgIGxwckxCLT5yaWdodCA9IHJlY3QucmlnaHQgLSByZWN0LmxlZnQ7CisgICBscHJMQi0+Ym90dG9tID0gcmVjdC5ib3R0b20gLSByZWN0LnRvcDsKKworICAgaWYoIGxwaGMtPmRyb3BwZWRXaWR0aCA+IChscHJMQi0+cmlnaHQgLSBscHJMQi0+bGVmdCkgKQorICAgICAgIGxwckxCLT5yaWdodCA9IGxwckxCLT5sZWZ0ICsgKElOVDE2KWxwaGMtPmRyb3BwZWRXaWR0aDsKKworZHByaW50Zl9jb21ibyhzdGRkZWIsIkNvbWJvIFslMDR4XTogKCVpLCVpLSVpLCVpKSBwbGFjZW1lbnRcblx0dGV4dFx0PSAoJWksJWktJWksJWkpXAorXG5cdGJ1dHRvblx0PSAoJWksJWktJWksJWkpXG5cdGxib3hcdD0gKCVpLCVpLSVpLCVpKVxuIiwgQ0JfSFdORChscGhjKSwKK2xwaGMtPlJlY3RDb21iby5sZWZ0LCBscGhjLT5SZWN0Q29tYm8udG9wLCBscGhjLT5SZWN0Q29tYm8ucmlnaHQsIGxwaGMtPlJlY3RDb21iby5ib3R0b20sCitscHJFZGl0LT5sZWZ0LCBscHJFZGl0LT50b3AsIGxwckVkaXQtPnJpZ2h0LCBscHJFZGl0LT5ib3R0b20sCitscHJCdXR0b24tPmxlZnQsIGxwckJ1dHRvbi0+dG9wLCBscHJCdXR0b24tPnJpZ2h0LCBscHJCdXR0b24tPmJvdHRvbSwgCitscHJMQi0+bGVmdCwgbHByTEItPnRvcCwgbHByTEItPnJpZ2h0LCBscHJMQi0+Ym90dG9tICk7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0JHZXREcm9wcGVkQ29udHJvbFJlY3QzMgorICovCitzdGF0aWMgdm9pZCBDQkdldERyb3BwZWRDb250cm9sUmVjdDMyKCBMUEhFQURDT01CTyBscGhjLCBMUFJFQ1QzMiBscFJlY3QpCit7CisgICBscFJlY3QtPmxlZnQgPSBscGhjLT5SZWN0Q29tYm8ubGVmdCArCisgICAgICAgICAgICAgICAgICAgICAgKGxwaGMtPndTdGF0ZSAmIENCRl9FRElUKSA/IENCaXRPZmZzZXQgOiAwOworICAgbHBSZWN0LT50b3AgPSBscGhjLT5SZWN0Q29tYm8udG9wICsgbHBoYy0+UmVjdEVkaXQuYm90dG9tIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZU01FVFJJQ1NfQ1lCT1JERVI7CisgICBscFJlY3QtPnJpZ2h0ID0gbHBoYy0+UmVjdENvbWJvLnJpZ2h0OworICAgbHBSZWN0LT5ib3R0b20gPSBscGhjLT5SZWN0Q29tYm8uYm90dG9tIC0gU1lTTUVUUklDU19DWUJPUkRFUjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ09NQk9fQ3JlYXRlCisgKi8KK3N0YXRpYyBMUkVTVUxUIENPTUJPX0NyZWF0ZSggTFBIRUFEQ09NQk8gbHBoYywgV05EKiB3bmQsIExQQVJBTSBsUGFyYW0pCit7CisgIHN0YXRpYyBjaGFyIGNsYk5hbWVbXSA9ICJDb21ib0xCb3giOworICBzdGF0aWMgY2hhciBlZGl0TmFtZVtdID0gIkVkaXQiOworCisgIExQQ1JFQVRFU1RSVUNUMzJBICBscGNzID0gKENSRUFURVNUUlVDVDMyQSopbFBhcmFtOworICAKKyAgaWYoICFDQl9HRVRUWVBFKGxwaGMpICkgbHBoYy0+ZHdTdHlsZSB8PSBDQlNfU0lNUExFOworICBlbHNlIGlmKCBDQl9HRVRUWVBFKGxwaGMpICE9IENCU19EUk9QRE9XTkxJU1QgKSBscGhjLT53U3RhdGUgfD0gQ0JGX0VESVQ7CisKKyAgbHBoYy0+c2VsZiAgPSB3bmQ7CisgIGxwaGMtPm93bmVyID0gbHBjcy0+aHduZFBhcmVudDsKKworICAvKiBNJCBJRSAzLjAxIGFjdHVhbGx5IGNyZWF0ZXMgKGFuZCByYXBpZGx5IGRlc3Ryb3lzKSBhbiBvd25lcmxlc3MgY29tYm9ib3ggKi8KKworICBpZiggbHBoYy0+b3duZXIgfHwgIShscGNzLT5zdHlsZSAmIFdTX1ZJU0lCTEUpICkKKyAgeworICAgICAgVUlOVDMyCWxiZVN0eWxlOworICAgICAgUkVDVDE2CWVkaXRSZWN0LCBidG5SZWN0LCBsYlJlY3Q7CisKKyAgICAgIEdldFdpbmRvd1JlY3QxNiggd25kLT5od25kU2VsZiwgJmxwaGMtPlJlY3RDb21ibyApOworCisgICAgICBscGhjLT53U3RhdGUgfD0gQ0JGX01FQVNVUkVJVEVNOworICAgICAgQ0JDYWxjUGxhY2VtZW50KCBscGhjLCAmZWRpdFJlY3QsICZidG5SZWN0LCAmbGJSZWN0ICk7CisgICAgICBscGhjLT5SZWN0QnV0dG9uID0gYnRuUmVjdDsKKyAgICAgIGxwaGMtPmRyb3BwZWRXaWR0aCA9IGxwaGMtPmVkaXRIZWlnaHQgPSAwOworCisgICAgICAvKiBjcmVhdGUgbGlzdGJveCBwb3B1cCAqLworCisgICAgICBsYmVTdHlsZSA9IChMQlNfTk9USUZZIHwgV1NfQk9SREVSIHwgV1NfQ0xJUFNJQkxJTkdTKSB8IAorICAgICAgICAgICAgICAgICAobHBjcy0+c3R5bGUgJiAoV1NfVlNDUk9MTCB8IENCU19PV05FUkRSQVdGSVhFRCB8IENCU19PV05FUkRSQVdWQVJJQUJMRSkpOworCisgICAgICBpZiggbHBoYy0+ZHdTdHlsZSAmIENCU19TT1JUICkKKwlsYmVTdHlsZSB8PSBMQlNfU09SVDsKKyAgICAgIGlmKCBscGhjLT5kd1N0eWxlICYgQ0JTX0hBU1NUUklOR1MgKQorCWxiZVN0eWxlIHw9IExCU19IQVNTVFJJTkdTOworICAgICAgaWYoIGxwaGMtPmR3U3R5bGUgJiBDQlNfTk9JTlRFR1JBTEhFSUdIVCApCisJbGJlU3R5bGUgfD0gTEJTX05PSU5URUdSQUxIRUlHSFQ7CisgICAgICBpZiggbHBoYy0+ZHdTdHlsZSAmIENCU19ESVNBQkxFTk9TQ1JPTEwgKQorCWxiZVN0eWxlIHw9IExCU19ESVNBQkxFTk9TQ1JPTEw7CisgIAorICAgICAgaWYoIENCX0dFVFRZUEUobHBoYykgPT0gQ0JTX1NJTVBMRSApIAkvKiBjaGlsZCBsaXN0Ym94ICovCisJbGJlU3R5bGUgfD0gV1NfQ0hJTEQgfCBXU19WSVNJQkxFOworICAgICAgZWxzZQkJCQkJLyogcG9wdXAgbGlzdGJveCAqLworICAgICAgeworCWxiZVN0eWxlIHw9IFdTX1BPUFVQOworCU9mZnNldFJlY3QxNiggJmxiUmVjdCwgbHBoYy0+UmVjdENvbWJvLmxlZnQsIGxwaGMtPlJlY3RDb21iby50b3AgKTsKKyAgICAgIH0KKworICAgICAvKiBEcm9wZG93biBDb21ib0xCb3ggaXMgbm90IGEgY2hpbGQgd2luZG93IGFuZCB3ZSBjYW5ub3QgcGFzcyAKKyAgICAgICogSURfQ0JfTElTVEJPWCBkaXJlY3RseSBiZWNhdXNlIGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBhIG1lbnUgaGFuZGxlLgorICAgICAgKi8KKworICAgICAgbHBoYy0+aFduZExCb3ggPSBDcmVhdGVXaW5kb3dFeDMyQSggMCwgY2xiTmFtZSwgTlVMTCwgbGJlU3R5bGUsIAorCQkgICAgICAgIGxiUmVjdC5sZWZ0ICsgU1lTTUVUUklDU19DWEJPUkRFUiwgCisJCSAgICAgICAgbGJSZWN0LnRvcCArIFNZU01FVFJJQ1NfQ1lCT1JERVIsIAorCQkJbGJSZWN0LnJpZ2h0IC0gbGJSZWN0LmxlZnQgLSAyICogU1lTTUVUUklDU19DWEJPUkRFUiwgCisJCQlsYlJlY3QuYm90dG9tIC0gbGJSZWN0LnRvcCAtIDIgKiBTWVNNRVRSSUNTX0NZQk9SREVSLCAKKwkJCWxwaGMtPnNlbGYtPmh3bmRTZWxmLCAKKwkJICAgICAgIChscGhjLT5kd1N0eWxlICYgQ0JTX0RST1BET1dOKT8gKEhNRU5VMzIpMCA6IChITUVOVTMyKUlEX0NCX0xJU1RCT1gsCisJCQlscGhjLT5zZWxmLT5oSW5zdGFuY2UsIChMUFZPSUQpbHBoYyApOworICAgICAgaWYoIGxwaGMtPmhXbmRMQm94ICkKKyAgICAgIHsKKwkgIEJPT0wzMgliRWRpdCA9IFRSVUU7CisJICBsYmVTdHlsZSA9IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0JPUkRFUiB8IEVTX05PSElERVNFTCB8IEVTX0xFRlQ7CisJICBpZiggbHBoYy0+d1N0YXRlICYgQ0JGX0VESVQgKSAKKwkgIHsKKwkgICAgICBpZiggbHBoYy0+ZHdTdHlsZSAmIENCU19PRU1DT05WRVJUICkKKwkJICBsYmVTdHlsZSB8PSBFU19PRU1DT05WRVJUOworCSAgICAgIGlmKCBscGhjLT5kd1N0eWxlICYgQ0JTX0FVVE9IU0NST0xMICkKKwkJICBsYmVTdHlsZSB8PSBFU19BVVRPSFNDUk9MTDsKKwkgICAgICBpZiggbHBoYy0+ZHdTdHlsZSAmIENCU19MT1dFUkNBU0UgKQorCQkgIGxiZVN0eWxlIHw9IEVTX0xPV0VSQ0FTRTsKKwkgICAgICBlbHNlIGlmKCBscGhjLT5kd1N0eWxlICYgQ0JTX1VQUEVSQ0FTRSApCisJCSAgbGJlU3R5bGUgfD0gRVNfVVBQRVJDQVNFOworCSAgICAgIGxwaGMtPmhXbmRFZGl0ID0gQ3JlYXRlV2luZG93RXgzMkEoIDAsIGVkaXROYW1lLCBOVUxMLCBsYmVTdHlsZSwKKwkJICAJZWRpdFJlY3QubGVmdCwgZWRpdFJlY3QudG9wLCBlZGl0UmVjdC5yaWdodCAtIGVkaXRSZWN0LmxlZnQsCisJCQllZGl0UmVjdC5ib3R0b20gLSBlZGl0UmVjdC50b3AsIGxwaGMtPnNlbGYtPmh3bmRTZWxmLCAKKwkJCShITUVOVTMyKUlEX0NCX0VESVQsIGxwaGMtPnNlbGYtPmhJbnN0YW5jZSwgTlVMTCApOworCSAgICAgIGlmKCAhbHBoYy0+aFduZEVkaXQgKSBiRWRpdCA9IEZBTFNFOworCSAgfSAKKworICAgICAgICAgIGlmKCBiRWRpdCApCisJICB7CisJICAgICAgbHBoYy0+UmVjdEVkaXQgPSBlZGl0UmVjdDsKKwkgICAgICBpZiggQ0JfR0VUVFlQRShscGhjKSAhPSBDQlNfU0lNUExFICkKKwkgICAgICB7CisJCWxwaGMtPndTdGF0ZSB8PSBDQkZfTk9SRVNJWkU7CisJCVNldFdpbmRvd1BvczMyKCB3bmQtPmh3bmRTZWxmLCAwLCAwLCAwLCAKKwkJCQlscGhjLT5SZWN0Q29tYm8ucmlnaHQgLSBscGhjLT5SZWN0Q29tYm8ubGVmdCwKKwkJCQlscGhjLT5SZWN0RWRpdC5ib3R0b20gLSBscGhjLT5SZWN0RWRpdC50b3AsCisJCQkJU1dQX05PTU9WRSB8IFNXUF9OT1pPUkRFUiB8IFNXUF9OT0FDVElWQVRFICk7CisJCWxwaGMtPndTdGF0ZSAmPSB+Q0JGX05PUkVTSVpFOworCSAgICAgIH0KKwkgICAgICBkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ09NQk9fQ3JlYXRlOiBpbml0IGRvbmVcbiIpOworCSAgICAgIHJldHVybiB3bmQtPmh3bmRTZWxmOworCSAgfQorCSAgZHByaW50Zl9jb21ibyhzdGRlcnIsICJDT01CT19DcmVhdGU6IGVkaXQgY29udHJvbCBmYWlsdXJlLlxuIik7CisgICAgICB9IGVsc2UgZHByaW50Zl9jb21ibyhzdGRlcnIsICJDT01CT19DcmVhdGU6IGxpc3Rib3ggZmFpbHVyZS5cbiIpOworICB9IGVsc2UgZHByaW50Zl9jb21ibyhzdGRlcnIsICJDT01CT19DcmVhdGU6IG5vIG93bmVyIGZvciB2aXNpYmxlIGNvbWJvLlxuIik7CisKKyAgLyogQ3JlYXRlV2luZG93KCkgd2lsbCBzZW5kIFdNX05DREVTVFJPWSB0byBjbGVhbnVwICovCisKKyAgcmV0dXJuIC0xOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDQlBhaW50QnV0dG9uCisgKgorICogUGFpbnQgY29tYm8gYnV0dG9uIChub3JtYWwsIHByZXNzZWQsIGFuZCBkaXNhYmxlZCBzdGF0ZXMpLgorICovCitzdGF0aWMgdm9pZCBDQlBhaW50QnV0dG9uKExQSEVBRENPTUJPIGxwaGMsIEhEQzE2IGhkYykKK3sKKyAgICBSRUNUMzIgCXI7CisgICAgSEJSVVNIMzIgCWhQcmV2QnJ1c2g7CisgICAgVUlOVDMyIAl4LCB5OworICAgIEJPT0wzMiAJYkJvb2w7CisKKyAgICBoUHJldkJydXNoID0gKEhCUlVTSDMyKVNlbGVjdE9iamVjdDMyKGhkYywgc3lzQ29sb3JPYmplY3RzLmhicnVzaEJ0bkZhY2UpOworICAgIENPTlZfUkVDVDE2VE8zMiggJmxwaGMtPlJlY3RCdXR0b24sICZyICk7CisKKyAgICBSZWN0YW5nbGUzMihoZGMsIHIubGVmdCwgci50b3AsIHIucmlnaHQsIHIuYm90dG9tICk7CisgICAgSW5mbGF0ZVJlY3QzMiggJnIsIC0xLCAtMSApOworICAgIGlmKCAoYkJvb2wgPSBscGhjLT53U3RhdGUgJiBDQkZfQlVUVE9ORE9XTikgKQorICAgIHsKKwlHUkFQSF9EcmF3UmVsaWVmUmVjdChoZGMsICZyLCAxLCAwLCBUUlVFKTsKKwlPZmZzZXRSZWN0MzIoICZyLCAxLCAxICk7CisgICAgfSBlbHNlIEdSQVBIX0RyYXdSZWxpZWZSZWN0KGhkYywgJnIsIDEsIDIsIEZBTFNFKTsKKworICAgIHggPSAoci5sZWZ0ICsgci5yaWdodCAtIENCaXRXaWR0aCkgPj4gMTsKKyAgICB5ID0gKHIudG9wICsgci5ib3R0b20gLSBDQml0SGVpZ2h0KSA+PiAxOworCisgICAgSW5mbGF0ZVJlY3QzMiggJnIsIC0zLCAtMyApOworICAgIGlmKCAoYkJvb2wgPSBDQl9ESVNBQkxFRChscGhjKSkgKQorICAgIHsKKyAgICAgICAgR1JBUEhfU2VsZWN0Q2xpcE1hc2soaGRjLCBoQ29tYm9CbXAsIHggKyAxLCB5ICsgMSApOworICAgICAgICBGaWxsUmVjdDMyKGhkYywgJnIsIChIQlJVU0gzMilHZXRTdG9ja09iamVjdDMyKFdISVRFX0JSVVNIKSk7CisgICAgfQorCisgICAgR1JBUEhfU2VsZWN0Q2xpcE1hc2soaGRjLCBoQ29tYm9CbXAsIHgsIHkgKTsKKyAgICBGaWxsUmVjdDMyKGhkYywgJnIsIChIQlJVU0gzMilHZXRTdG9ja09iamVjdDMyKChiQm9vbCkgPyBHUkFZX0JSVVNIIDogQkxBQ0tfQlJVU0gpKTsKKworICAgIEdSQVBIX1NlbGVjdENsaXBNYXNrKGhkYywgKEhCSVRNQVAzMikwLCAwLCAwKTsKKyAgICBTZWxlY3RPYmplY3QzMiggaGRjLCBoUHJldkJydXNoICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENCUGFpbnRUZXh0CisgKgorICogUGFpbnQgQ0JTX0RST1BET1dOTElTVCB0ZXh0IGZpZWxkIC8gdXBkYXRlIGVkaXQgY29udHJvbCBjb250ZW50cy4KKyAqLworc3RhdGljIHZvaWQgQ0JQYWludFRleHQoTFBIRUFEQ09NQk8gbHBoYywgSERDMTYgaGRjKQoreworICAgSU5UMzIJaWQsIHNpemU7CisgICBMUFNUUglwVGV4dCA9IE5VTEw7CisKKyAgIC8qIGZvbGxvdyBXaW5kb3dzIGNvbWJvYm94IHRoYXQgc2VuZHMgYSBidW5jaCBvZiB0ZXh0IAorICAgICogaW5xdWlyaWVzIHRvIGl0cyBsaXN0Ym94IHdoaWxlIHByb2Nlc3NpbmcgV01fUEFJTlQuCisgICAgKi8KKworICAgc2l6ZSA9IFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kTEJveCwgTEJfR0VUVEVYVExFTjMyLAorCSAJKGlkID0gU2VuZE1lc3NhZ2UzMkEobHBoYy0+aFduZExCb3gsIExCX0dFVENVUlNFTDMyLCAwLCAwKSksIDApOworCisgICBpZiggIShwVGV4dCA9IEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZSArIDEpKSApIHJldHVybjsKKworICAgU2VuZE1lc3NhZ2UzMkEoIGxwaGMtPmhXbmRMQm94LCBMQl9HRVRURVhUMzIsIChXUEFSQU0zMilpZCwgKExQQVJBTSlwVGV4dCApOworICAgcFRleHRbc2l6ZV0gPSAnXDAnOwkvKiBqdXN0IGluIGNhc2UgKi8KKworICAgaWYoIGxwaGMtPndTdGF0ZSAmIENCRl9FRElUICkKKyAgIHsKKwlpZiggQ0JfSEFTU1RSSU5HUyhscGhjKSApCisJICAgIFNldFdpbmRvd1RleHQzMkEoIGxwaGMtPmhXbmRFZGl0LCAocFRleHQpID8gcFRleHQgOiAiIiApOworCWlmKCBscGhjLT53U3RhdGUgJiBDQkZfRk9DVVNFRCApCisJICAgIFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kRWRpdCwgRU1fU0VUU0VMMzIsIDAsIChMUEFSQU0pKC0xKSk7CisgICB9CisgICBlbHNlIC8qIHBhaW50IHRleHQgZmllbGQgb3Vyc2VsdmVzICovCisgICB7CisgICAgICAgIEhCUlVTSDMyIGhQcmV2QnJ1c2ggPSAwOworCUhEQzMyCSBoREMgPSBoZGM7CisKKwlpZiggIWhEQyApIAorCXsKKwkgICAgaWYgKChoREMgPSBHZXREQzMyKGxwaGMtPnNlbGYtPmh3bmRTZWxmKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSEJSVVNIMzIgaEJydXNoID0gU2VuZE1lc3NhZ2UzMkEoIGxwaGMtPm93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTV9DVExDT0xPUkxJU1RCT1gsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoREMsIGxwaGMtPnNlbGYtPmh3bmRTZWxmICk7CisgICAgICAgICAgICAgICAgaFByZXZCcnVzaCA9IFNlbGVjdE9iamVjdDMyKCBoREMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhCcnVzaCkgPyBoQnJ1c2ggOiBHZXRTdG9ja09iamVjdDMyKFdISVRFX0JSVVNIKSApOworICAgICAgICAgICAgfQorCX0KKwlpZiggaERDICkKKwl7CisJICAgIFJFQ1QzMglyZWN0OworCSAgICBVSU5UMTYJaXRlbVN0YXRlOworCSAgICBIRk9OVDMyCWhQcmV2Rm9udCA9IChscGhjLT5oRm9udCkgPyBTZWxlY3RPYmplY3QzMihoREMsIGxwaGMtPmhGb250KSA6IDA7CisKKwkgICAgUGF0Qmx0MzIoIGhEQywgKHJlY3QubGVmdCA9IGxwaGMtPlJlY3RFZGl0LmxlZnQgKyBTWVNNRVRSSUNTX0NYQk9SREVSKSwKKwkJCSAgIChyZWN0LnRvcCA9IGxwaGMtPlJlY3RFZGl0LnRvcCArIFNZU01FVFJJQ1NfQ1lCT1JERVIpLAorCQkJICAgKHJlY3QucmlnaHQgPSBscGhjLT5SZWN0RWRpdC5yaWdodCAtIFNZU01FVFJJQ1NfQ1hCT1JERVIpLAorCQkJICAgKHJlY3QuYm90dG9tID0gbHBoYy0+UmVjdEVkaXQuYm90dG9tIC0gU1lTTUVUUklDU19DWUJPUkRFUikgLSAxLCBQQVRDT1BZICk7CisJICAgIEluZmxhdGVSZWN0MzIoICZyZWN0LCAtMSwgLTEgKTsKKworCSAgICBpZiggbHBoYy0+d1N0YXRlICYgQ0JGX0ZPQ1VTRUQgJiYgCisJICAgICAgICAhKGxwaGMtPndTdGF0ZSAmIENCRl9EUk9QUEVEKSApCisJICAgIHsKKwkJLyogaGlnaGxpZ2h0ICovCisKKwkJRmlsbFJlY3QzMiggaERDLCAmcmVjdCwgc3lzQ29sb3JPYmplY3RzLmhicnVzaEhpZ2hsaWdodCApOworICAgICAgICAgICAgICAgIFNldEJrQ29sb3IzMiggaERDLCBHZXRTeXNDb2xvcjMyKCBDT0xPUl9ISUdITElHSFQgKSApOworICAgICAgICAgICAgICAgIFNldFRleHRDb2xvcjMyKCBoREMsIEdldFN5c0NvbG9yMzIoIENPTE9SX0hJR0hMSUdIVFRFWFQgKSApOworCQlpdGVtU3RhdGUgPSBPRFNfU0VMRUNURUQgfCBPRFNfRk9DVVM7CisJICAgIH0gZWxzZSBpdGVtU3RhdGUgPSAwOworCisJICAgIGlmKCBDQl9PV05FUkRSQVdOKGxwaGMpICkKKwkgICAgeworCQlEUkFXSVRFTVNUUlVDVDMyIGRpczsKKworCQlpZiggbHBoYy0+c2VsZi0+ZHdTdHlsZSAmIFdTX0RJU0FCTEVEICkgaXRlbVN0YXRlIHw9IE9EU19ESVNBQkxFRDsKKworCQlkaXMuQ3RsVHlwZQk9IE9EVF9DT01CT0JPWDsKKwkJZGlzLkN0bElECT0gbHBoYy0+c2VsZi0+d0lEbWVudTsKKwkJZGlzLmh3bmRJdGVtCT0gbHBoYy0+c2VsZi0+aHduZFNlbGY7CisJCWRpcy5pdGVtQWN0aW9uCT0gT0RBX0RSQVdFTlRJUkU7CisJCWRpcy5pdGVtSUQJPSBpZDsKKwkJZGlzLml0ZW1TdGF0ZQk9IGl0ZW1TdGF0ZTsKKwkJZGlzLmhEQwkJPSBoREM7CisJCWRpcy5yY0l0ZW0JPSByZWN0OworCQlkaXMuaXRlbURhdGEJPSBTZW5kTWVzc2FnZTMyQSggbHBoYy0+aFduZExCb3gsIExCX0dFVElURU1EQVRBMzIsIAorCQkJCQkJICAJCSAgKFdQQVJBTTMyKWlkLCAwICk7CisJCVNlbmRNZXNzYWdlMzJBKCBscGhjLT5vd25lciwgV01fRFJBV0lURU0sIAorCQkJCWxwaGMtPnNlbGYtPndJRG1lbnUsIChMUEFSQU0pJmRpcyApOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlFeHRUZXh0T3V0MzJBKCBoREMsIHJlY3QubGVmdCArIDEsIHJlY3QudG9wICsgMSwKKwkJCSAgICAgICBFVE9fT1BBUVVFIHwgRVRPX0NMSVBQRUQsICZyZWN0LCBwVGV4dCwgc2l6ZSwgTlVMTCApOworCQlpZiggbHBoYy0+d1N0YXRlICYgQ0JGX0ZPQ1VTRUQgJiYgIShscGhjLT53U3RhdGUgJiBDQkZfRFJPUFBFRCkgKQorCQkgICAgRHJhd0ZvY3VzUmVjdDMyKCBoREMsICZyZWN0ICk7CisJICAgIH0KKworCSAgICBpZiggaFByZXZGb250ICkgU2VsZWN0T2JqZWN0MzIoaERDLCBoUHJldkZvbnQgKTsKKwkgICAgaWYoICFoZGMgKSAKKwkgICAgeworCQlpZiggaFByZXZCcnVzaCApIFNlbGVjdE9iamVjdDMyKCBoREMsIGhQcmV2QnJ1c2ggKTsKKwkJUmVsZWFzZURDMzIoIGxwaGMtPnNlbGYtPmh3bmRTZWxmLCBoREMgKTsKKwkgICAgfQorCX0KKyAgIH0KKyAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBwVGV4dCApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDT01CT19QYWludAorICovCitzdGF0aWMgTFJFU1VMVCBDT01CT19QYWludChMUEhFQURDT01CTyBscGhjLCBIREMxNiBoUGFyYW1EQykKK3sKKyAgUEFJTlRTVFJVQ1QxNiBwczsKKyAgSERDMTYgCWhEQzsKKyAgCisgIGhEQyA9IChoUGFyYW1EQykgPyBoUGFyYW1EQworCQkgICA6IEJlZ2luUGFpbnQxNiggbHBoYy0+c2VsZi0+aHduZFNlbGYsICZwcyk7CisgIGlmKCBoREMgJiYgIShscGhjLT5zZWxmLT5mbGFncyAmIFdJTl9OT19SRURSQVcpICkKKyAgeworICAgICAgSEJSVVNIMzIJaFByZXZCcnVzaCwgaEJrZ0JydXNoOworCisgICAgICBoQmtnQnJ1c2ggPSBTZW5kTWVzc2FnZTMyQSggbHBoYy0+b3duZXIsIFdNX0NUTENPTE9STElTVEJPWCwKKwkJCQkgIGhEQywgbHBoYy0+c2VsZi0+aHduZFNlbGYgKTsKKyAgICAgIGlmKCAhaEJrZ0JydXNoICkgaEJrZ0JydXNoID0gR2V0U3RvY2tPYmplY3QzMihXSElURV9CUlVTSCk7CisKKyAgICAgIGhQcmV2QnJ1c2ggPSBTZWxlY3RPYmplY3QzMiggaERDLCBoQmtnQnJ1c2ggKTsKKyAgICAgIGlmKCAhSXNSZWN0RW1wdHkxNigmbHBoYy0+UmVjdEJ1dHRvbikgKQorICAgICAgeworCSAgLyogcGFpbnQgZXZlcnl0aGluZyB0byB0aGUgcmlnaHQgb2YgdGhlIHRleHQgZmllbGQgKi8KKworCSAgUGF0Qmx0MzIoIGhEQywgbHBoYy0+UmVjdEVkaXQucmlnaHQsIGxwaGMtPlJlY3RFZGl0LnRvcCwKKwkJCSBscGhjLT5SZWN0QnV0dG9uLnJpZ2h0IC0gbHBoYy0+UmVjdEVkaXQucmlnaHQsCisJCQkgbHBoYy0+UmVjdEVkaXQuYm90dG9tIC0gbHBoYy0+UmVjdEVkaXQudG9wLCBQQVRDT1BZICk7CisgICAgICAgICAgQ0JQYWludEJ1dHRvbiggbHBoYywgaERDICk7CisgICAgICB9CisKKyAgICAgIGlmKCAhKGxwaGMtPndTdGF0ZSAmIENCRl9FRElUKSApCisgICAgICB7CisJICAvKiBwYWludCB0ZXh0IGZpZWxkICovCisKKwkgIEdSQVBIX0RyYXdSZWN0YW5nbGUoIGhEQywgbHBoYy0+UmVjdEVkaXQubGVmdCwgbHBoYy0+UmVjdEVkaXQudG9wLAorCQkJCSAgICBscGhjLT5SZWN0RWRpdC5yaWdodCAtIGxwaGMtPlJlY3RFZGl0LmxlZnQsIAorCQkJCSAgICBscGhjLT5SZWN0QnV0dG9uLmJvdHRvbSAtIGxwaGMtPlJlY3RCdXR0b24udG9wLAorCQkJCSAgICBzeXNDb2xvck9iamVjdHMuaHBlbldpbmRvd0ZyYW1lICk7IAorCSAgQ0JQYWludFRleHQoIGxwaGMsIGhEQyApOworICAgICAgfQorICAgICAgaWYoIGhQcmV2QnJ1c2ggKSBTZWxlY3RPYmplY3QzMiggaERDLCBoUHJldkJydXNoICk7CisgIH0KKyAgaWYoICFoUGFyYW1EQyApIEVuZFBhaW50MTYobHBoYy0+c2VsZi0+aHduZFNlbGYsICZwcyk7CisgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDQlVwZGF0ZUxCb3gKKyAqCisgKiBTZWxlY3QgbGlzdGJveCBlbnRyeSBhY2NvcmRpbmcgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0IGNvbnRyb2wuCisgKi8KK3N0YXRpYyBJTlQzMiBDQlVwZGF0ZUxCb3goIExQSEVBRENPTUJPIGxwaGMgKQoreworICAgSU5UMzIJbGVuZ3RoLCBpZHgsIHJldDsKKyAgIExQU1RSCXBUZXh0ID0gTlVMTDsKKyAgIAorICAgaWR4ID0gcmV0ID0gTEJfRVJSOworICAgbGVuZ3RoID0gQ0JfR0VURURJVFRFWFRMRU5HVEgoIGxwaGMgKTsKKyAKKyAgIGlmKCBsZW5ndGggPiAwICkgCisgICAgICAgcFRleHQgPSAoTFBTVFIpIEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbGVuZ3RoICsgMSk7CisKKyAgIGRwcmludGZfY29tYm8oc3RkZGViLCJcdENCVXBkYXRlTEJveDogZWRpdCB0ZXh0IGxlbmd0aCAlaVxuIiwgbGVuZ3RoICk7CisKKyAgIGlmKCBwVGV4dCApCisgICB7CisgICAgICAgaWYoIGxlbmd0aCApIEdldFdpbmRvd1RleHQzMkEoIGxwaGMtPmhXbmRFZGl0LCBwVGV4dCwgbGVuZ3RoICsgMSk7CisgICAgICAgZWxzZSBwVGV4dFswXSA9ICdcMCc7CisgICAgICAgaWR4ID0gU2VuZE1lc3NhZ2UzMkEoIGxwaGMtPmhXbmRMQm94LCBMQl9GSU5EU1RSSU5HMzIsIAorCQkJICAgICAoV1BBUkFNMzIpKC0xKSwgKExQQVJBTSlwVGV4dCApOworICAgICAgIGlmKCBpZHggPT0gTEJfRVJSICkgaWR4ID0gMDsJLyogc2VsZWN0IGZpcnN0IGl0ZW0gKi8KKyAgICAgICBlbHNlIHJldCA9IGlkeDsKKyAgICAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcFRleHQgKTsKKyAgIH0KKworICAgLyogc2VsZWN0IGVudHJ5ICovCisKKyAgIFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kTEJveCwgTEJfU0VUQ1VSU0VMMzIsIChXUEFSQU0zMilpZHgsIDAgKTsKKyAgIAorICAgaWYoIGlkeCA+PSAwICkKKyAgIHsKKyAgICAgICBTZW5kTWVzc2FnZTMyQSggbHBoYy0+aFduZExCb3gsIExCX1NFVFRPUElOREVYMzIsIChXUEFSQU0zMilpZHgsIDAgKTsKKyAgICAgICAvKiBwcm9iYWJseSBzdXBlcmZsdW91cyBidXQgV2luZG93cyBzZW5kcyB0aGlzIHRvbyAqLworICAgICAgIFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kTEJveCwgTEJfU0VUQ0FSRVRJTkRFWDMyLCAoV1BBUkFNMzIpaWR4LCAwICk7CisgICB9CisgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDQlVwZGF0ZUVkaXQKKyAqCisgKiBDb3B5IGEgbGlzdGJveCBlbnRyeSB0byB0aGUgZWRpdCBjb250cm9sLgorICovCitzdGF0aWMgdm9pZCBDQlVwZGF0ZUVkaXQoIExQSEVBRENPTUJPIGxwaGMgLCBJTlQzMiBpbmRleCApCit7CisgICBJTlQzMglsZW5ndGg7CisgICBMUFNUUglwVGV4dCA9IE5VTEw7CisKKyAgIGRwcmludGZfY29tYm8oc3RkZGViLCJcdENCVXBkYXRlRWRpdDogJWlcbiIsIGluZGV4ICk7CisKKyAgIGlmKCBpbmRleCA9PSAtMSApCisgICB7CisgICAgICAgbGVuZ3RoID0gQ0JfR0VURURJVFRFWFRMRU5HVEgoIGxwaGMgKTsKKyAgICAgICBpZiggbGVuZ3RoICkKKyAgICAgICB7CisgICAgICAgICAgIGlmKCAocFRleHQgPSAoTFBTVFIpIEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbGVuZ3RoICsgMSkpICkKKyAgICAgICAgICAgeworIAkgICAJR2V0V2luZG93VGV4dDMyQSggbHBoYy0+aFduZEVkaXQsIHBUZXh0LCBsZW5ndGggKyAxICk7CisJICAgCWluZGV4ID0gU2VuZE1lc3NhZ2UzMkEoIGxwaGMtPmhXbmRMQm94LCBMQl9GSU5EU1RSSU5HMzIsCisJCQkJICAgICAgICAoV1BBUkFNMzIpKC0xKSwgKExQQVJBTSlwVGV4dCApOworCSAgIAlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcFRleHQgKTsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgIH0KKworICAgaWYoIGluZGV4ID49IDAgKSAvKiBnb3QgYW4gZW50cnkgKi8KKyAgIHsKKyAgICAgICBsZW5ndGggPSBTZW5kTWVzc2FnZTMyQSggbHBoYy0+aFduZExCb3gsIExCX0dFVFRFWFRMRU4zMiwgKFdQQVJBTTMyKWluZGV4LCAwKTsKKyAgICAgICBpZiggbGVuZ3RoICkKKyAgICAgICB7CisJICAgaWYoIChwVGV4dCA9IChMUFNUUikgSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBsZW5ndGggKyAxKSkgKQorCSAgIHsKKwkJU2VuZE1lc3NhZ2UzMkEoIGxwaGMtPmhXbmRMQm94LCBMQl9HRVRURVhUMzIsIAorCQkJCShXUEFSQU0zMilpbmRleCwgKExQQVJBTSlwVGV4dCApOworCQlTZW5kTWVzc2FnZTMyQSggbHBoYy0+aFduZEVkaXQsIFdNX1NFVFRFWFQsIDAsIChMUEFSQU0pcFRleHQgKTsKKwkJU2VuZE1lc3NhZ2UzMkEoIGxwaGMtPmhXbmRFZGl0LCBFTV9TRVRTRUwzMiwgMCwgKExQQVJBTSkoLTEpICk7CisJCUhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBwVGV4dCApOworCSAgIH0KKyAgICAgICB9CisgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENCRHJvcERvd24KKyAqIAorICogU2hvdyBsaXN0Ym94IHBvcHVwLgorICovCitzdGF0aWMgdm9pZCBDQkRyb3BEb3duKCBMUEhFQURDT01CTyBscGhjICkKK3sKKyAgIElOVDMyCWluZGV4OworICAgUkVDVDE2CXJlY3Q7CisgICBMUFJFQ1QxNglwUmVjdCA9IE5VTEw7CisKKyAgIGRwcmludGZfY29tYm8oc3RkZGViLCJDb21ibyBbJTA0eF06IGRyb3AgZG93blxuIiwgQ0JfSFdORChscGhjKSk7CisKKyAgIENCX05PVElGWSggbHBoYywgQ0JOX0RST1BET1dOICk7CisKKyAgIC8qIHNldCBzZWxlY3Rpb24gKi8KKworICAgbHBoYy0+d1N0YXRlIHw9IENCRl9EUk9QUEVEOworICAgaWYoIENCX0dFVFRZUEUobHBoYykgPT0gQ0JTX0RST1BET1dOICkKKyAgIHsKKyAgICAgICBpbmRleCA9IENCVXBkYXRlTEJveCggbHBoYyApOworICAgICAgIGlmKCAhKGxwaGMtPndTdGF0ZSAmIENCRl9DQVBUVVJFKSApIENCVXBkYXRlRWRpdCggbHBoYywgaW5kZXggKTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgICBpbmRleCA9IFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kTEJveCwgTEJfR0VUQ1VSU0VMMzIsIDAsIDAgKTsKKyAgICAgICBpZiggaW5kZXggPT0gTEJfRVJSICkgaW5kZXggPSAwOworICAgICAgIFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kTEJveCwgTEJfU0VUVE9QSU5ERVgzMiwgKFdQQVJBTTMyKWluZGV4LCAwICk7CisgICAgICAgU2VuZE1lc3NhZ2UzMkEoIGxwaGMtPmhXbmRMQm94LCBMQl9DQVJFVE9OMzIsIDAsIDAgKTsKKyAgICAgICBwUmVjdCA9ICZscGhjLT5SZWN0RWRpdDsKKyAgIH0KKworICAgLyogbm93IHNldCBwb3B1cCBwb3NpdGlvbiAqLworCisgICBHZXRXaW5kb3dSZWN0MTYoIGxwaGMtPnNlbGYtPmh3bmRTZWxmLCAmcmVjdCApOworICAgCisgICByZWN0LnRvcCArPSBscGhjLT5SZWN0RWRpdC5ib3R0b20gLSBscGhjLT5SZWN0RWRpdC50b3AgLSBTWVNNRVRSSUNTX0NZQk9SREVSOworICAgcmVjdC5ib3R0b20gPSByZWN0LnRvcCArIGxwaGMtPlJlY3RDb21iby5ib3R0b20gLSAKKwkJCSAgICBscGhjLT5SZWN0Q29tYm8udG9wIC0gU1lTTUVUUklDU19DWUJPUkRFUjsKKyAgIHJlY3QucmlnaHQgPSByZWN0LmxlZnQgKyBscGhjLT5SZWN0Q29tYm8ucmlnaHQgLSBscGhjLT5SZWN0Q29tYm8ubGVmdDsKKyAgIHJlY3QubGVmdCArPSAoIENCX0dFVFRZUEUobHBoYykgPT0gQ0JTX0RST1BET1dOTElTVCApID8gMCA6IENCaXRPZmZzZXQ7CisKKyAgIFNldFdpbmRvd1BvczMyKCBscGhjLT5oV25kTEJveCwgSFdORF9UT1AsIHJlY3QubGVmdCwgcmVjdC50b3AsIAorCQkgcmVjdC5yaWdodCAtIHJlY3QubGVmdCwgcmVjdC5ib3R0b20gLSByZWN0LnRvcCwgCisJCSBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT1NJWkUgKTsKKyAgIGlmKCBwUmVjdCApCisgICAgICAgUmVkcmF3V2luZG93MTYoIGxwaGMtPnNlbGYtPmh3bmRTZWxmLCBwUmVjdCwgMCwgUkRXX0lOVkFMSURBVEUgfCAKKwkJCSAgIFJEV19FUkFTRSB8IFJEV19VUERBVEVOT1cgfCBSRFdfTk9DSElMRFJFTiApOworICAgU2hvd1dpbmRvdzMyKCBscGhjLT5oV25kTEJveCwgU1dfU0hPV05BICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENCUm9sbFVwCisgKgorICogSGlkZSBsaXN0Ym94IHBvcHVwLgorICovCitzdGF0aWMgdm9pZCBDQlJvbGxVcCggTFBIRUFEQ09NQk8gbHBoYywgQk9PTDMyIG9rLCBCT09MMzIgYkJ1dHRvbiApCit7CisgICBIV05EMzIJaFduZCA9IGxwaGMtPnNlbGYtPmh3bmRTZWxmOworCisgICBDQl9OT1RJRlkoIGxwaGMsIChvaykgPyBDQk5fU0VMRU5ET0sgOiBDQk5fU0VMRU5EQ0FOQ0VMICk7CisKKyAgIGlmKCBJc1dpbmRvdzMyKCBoV25kICkgJiYgQ0JfR0VUVFlQRShscGhjKSAhPSBDQlNfU0lNUExFICkKKyAgIHsKKworICAgICAgIGRwcmludGZfY29tYm8oc3RkZGViLCJDb21ibyBbJTA0eF06IHJvbGwgdXAgWyVpXVxuIiwgQ0JfSFdORChscGhjKSwgKElOVDMyKW9rICk7CisKKyAgICAgICAvKiBhbHdheXMgc2VuZCBXTV9MQlVUVE9OVVA/ICovCisgICAgICAgU2VuZE1lc3NhZ2UzMkEoIGxwaGMtPmhXbmRMQm94LCBXTV9MQlVUVE9OVVAsIDAsIChMUEFSQU0pKC0xKSApOworCisgICAgICAgaWYoIGxwaGMtPndTdGF0ZSAmIENCRl9EUk9QUEVEICkgCisgICAgICAgeworCSAgIFJFQ1QxNglyZWN0OworCisJICAgbHBoYy0+d1N0YXRlICY9IH5DQkZfRFJPUFBFRDsKKwkgICBTaG93V2luZG93MzIoIGxwaGMtPmhXbmRMQm94LCBTV19ISURFICk7CisKKwkgICBpZiggQ0JfR0VUVFlQRShscGhjKSA9PSBDQlNfRFJPUERPV04gKQorCSAgIHsKKwkgICAgICAgSU5UMzIgaW5kZXggPSBTZW5kTWVzc2FnZTMyQSggbHBoYy0+aFduZExCb3gsIExCX0dFVENVUlNFTDMyLCAwLCAwICk7CisJICAgICAgIENCVXBkYXRlRWRpdCggbHBoYywgaW5kZXggKTsKKwkgICAgICAgcmVjdCA9IGxwaGMtPlJlY3RCdXR0b247CisJICAgfQorCSAgIGVsc2UgCisgICAgICAgICAgIHsKKwkgICAgICAgaWYoIGJCdXR0b24gKQorCSAgICAgICAgICAgVW5pb25SZWN0MTYoICZyZWN0LCAmbHBoYy0+UmVjdEJ1dHRvbiwKKwkJCQkgICAgICAgJmxwaGMtPlJlY3RFZGl0ICk7CisJICAgICAgIGVsc2UKKwkJICAgcmVjdCA9IGxwaGMtPlJlY3RFZGl0OworCSAgICAgICBiQnV0dG9uID0gVFJVRTsKKwkgICB9CisKKwkgICBpZiggYkJ1dHRvbiApCisJICAgICAgIFJlZHJhd1dpbmRvdzE2KCBoV25kLCAmcmVjdCwgMCwgUkRXX0lOVkFMSURBVEUgfCAKKwkJCSAgICAgICBSRFdfRVJBU0UgfCBSRFdfVVBEQVRFTk9XIHwgUkRXX05PQ0hJTERSRU4gKTsKKwkgICBDQl9OT1RJRlkoIGxwaGMsIENCTl9DTE9TRVVQICk7CisgICAgICAgfQorICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDT01CT19GbGlwTGlzdGJveAorICoKKyAqIFVzZWQgYnkgdGhlIENvbWJvTEJveCB0byBzaG93L2hpZGUgaXRzZWxmIGluIHJlc3BvbnNlIHRvIFZLX0Y0LCBldGMuLi4KKyAqLworQk9PTDMyIENPTUJPX0ZsaXBMaXN0Ym94KCBMUEhFQURDT01CTyBscGhjLCBCT09MMzIgYlJlZHJhd0J1dHRvbiApCit7CisgICBpZiggbHBoYy0+d1N0YXRlICYgQ0JGX0RST1BQRUQgKQorICAgeworICAgICAgIENCUm9sbFVwKCBscGhjLCBUUlVFLCBiUmVkcmF3QnV0dG9uICk7CisgICAgICAgcmV0dXJuIEZBTFNFOworICAgfQorCisgICBDQkRyb3BEb3duKCBscGhjICk7CisgICByZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ09NQk9fR2V0TEJXaW5kb3cKKyAqCisgKiBFZGl0IGNvbnRyb2wgaGVscGVyLgorICovCitIV05EMzIgQ09NQk9fR2V0TEJXaW5kb3coIFdORCogcFduZCApCit7CisgIExQSEVBRENPTUJPICAgICAgIGxwaGMgPSBDQl9HRVRQVFIocFduZCk7CisgIGlmKCBscGhjICkgcmV0dXJuIGxwaGMtPmhXbmRMQm94OwogICByZXR1cm4gMDsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDQkdldEVkaXRTZWwKLSAqIExvb2sgb3V0ISBVbmRlciBXaW4zMiwgdGhlIHBhcmFtZXRlciBwYWNraW5nIGlzIHZlcnkgZGlmZmVyZW50LgorICogICAgICAgICAgIENCUmVwYWludEJ1dHRvbgogICovCi1zdGF0aWMgTFJFU1VMVCBDQkdldEVkaXRTZWwoSFdORDE2IGh3bmQsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3N0YXRpYyB2b2lkIENCUmVwYWludEJ1dHRvbiggTFBIRUFEQ09NQk8gbHBoYyApCiB7Ci0gICAgTFBIRUFEQ09NQk8gbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihod25kKTsKKyAgIEhEQzMyICAgICAgICBoREMgPSBHZXREQzMyKCBscGhjLT5zZWxmLT5od25kU2VsZiApOwogCi0gICAgaWYgKChscGhjLT5kd1N0eWxlICYgMykgPT0gQ0JTX0RST1BET1dOTElTVCkKLSAgICAgIHJldHVybiBDQl9FUlI7CS8qIGVyciwgZG9jdW1lbnRlZCBmb3IgQ0JTZXRFZGl0U2VsICovCi0gICAgcmV0dXJuIFNlbmRNZXNzYWdlMTYobHBoYy0+aFduZEVkaXQsIEVNX0dFVFNFTDE2LCAwLCAwKTsKKyAgIGlmKCBoREMgKQorICAgeworICAgICAgIENCUGFpbnRCdXR0b24oIGxwaGMsIChIREMxNiloREMgKTsKKyAgICAgICBSZWxlYXNlREMzMiggbHBoYy0+c2VsZi0+aHduZFNlbGYsIGhEQyApOworICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDT01CT19TZXRGb2N1cworICovCitzdGF0aWMgdm9pZCBDT01CT19TZXRGb2N1cyggTFBIRUFEQ09NQk8gbHBoYyApCit7CisgICBpZiggIShscGhjLT53U3RhdGUgJiBDQkZfRk9DVVNFRCkgKQorICAgeworICAgICAgIGlmKCBDQl9HRVRUWVBFKGxwaGMpID09IENCU19EUk9QRE9XTkxJU1QgKQorICAgICAgICAgICBTZW5kTWVzc2FnZTMyQSggbHBoYy0+aFduZExCb3gsIExCX0NBUkVUT04zMiwgMCwgMCApOworCisgICAgICAgaWYoIGxwaGMtPndTdGF0ZSAmIENCRl9FRElUICkKKyAgICAgICAgICAgU2VuZE1lc3NhZ2UzMkEoIGxwaGMtPmhXbmRFZGl0LCBFTV9TRVRTRUwzMiwgMCwgKExQQVJBTSkoLTEpICk7CisgICAgICAgbHBoYy0+d1N0YXRlIHw9IENCRl9GT0NVU0VEOworICAgICAgIGlmKCAhKGxwaGMtPndTdGF0ZSAmIENCRl9FRElUKSApIENCUGFpbnRUZXh0KCBscGhjLCAwICk7CisKKyAgICAgICBDQl9OT1RJRlkoIGxwaGMsIENCTl9TRVRGT0NVUyApOworICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDT01CT19LaWxsRm9jdXMKKyAqLworc3RhdGljIHZvaWQgQ09NQk9fS2lsbEZvY3VzKCBMUEhFQURDT01CTyBscGhjICkKK3sKKyAgIEhXTkQzMgloV25kID0gbHBoYy0+c2VsZi0+aHduZFNlbGY7CisKKyAgIGlmKCBscGhjLT53U3RhdGUgJiBDQkZfRk9DVVNFRCApCisgICB7CisgICAgICAgU2VuZE1lc3NhZ2UzMkEoIGhXbmQsIFdNX0xCVVRUT05VUCwgMCwgKExQQVJBTSkoLTEpICk7CisKKyAgICAgICBDQlJvbGxVcCggbHBoYywgRkFMU0UsIFRSVUUgKTsKKyAgICAgICBpZiggSXNXaW5kb3czMiggaFduZCApICkKKyAgICAgICB7CisgICAgICAgICAgIGlmKCBDQl9HRVRUWVBFKGxwaGMpID09IENCU19EUk9QRE9XTkxJU1QgKQorICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UzMkEoIGxwaGMtPmhXbmRMQm94LCBMQl9DQVJFVE9GRjMyLCAwLCAwICk7CisKKyAJICAgbHBoYy0+d1N0YXRlICY9IH5DQkZfRk9DVVNFRDsKKworICAgICAgICAgICAvKiByZWRyYXcgdGV4dCAqLworICAgICAgICAgICBpZiggbHBoYy0+d1N0YXRlICYgQ0JGX0VESVQgKQorICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UzMkEoIGxwaGMtPmhXbmRFZGl0LCBFTV9TRVRTRUwzMiwgKFdQQVJBTTMyKSgtMSksIDAgKTsKKyAgICAgICAgICAgZWxzZSBDQlBhaW50VGV4dCggbHBoYywgMCApOworCisgICAgICAgICAgIENCX05PVElGWSggbHBoYywgQ0JOX0tJTExGT0NVUyApOworICAgICAgIH0KKyAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ09NQk9fQ29tbWFuZAorICovCitzdGF0aWMgTFJFU1VMVCBDT01CT19Db21tYW5kKCBMUEhFQURDT01CTyBscGhjLCBXUEFSQU0zMiB3UGFyYW0sIEhXTkQzMiBoV25kICkKK3sKKyAgIGlmKCBscGhjLT53U3RhdGUgJiBDQkZfRURJVCAmJiBscGhjLT5oV25kRWRpdCA9PSBoV25kICkKKyAgIHsKKyAgICAgICAvKiAiPj4gOCIgbWFrZXMgZ2NjIGdlbmVyYXRlIGp1bXAtdGFibGUgaW5zdGVhZCBvZiBjbXAgbGFkZGVyICovCisKKyAgICAgICBzd2l0Y2goIEhJV09SRCh3UGFyYW0pID4+IDggKQorICAgICAgIHsgICAKKwkgICBjYXNlIChFTl9TRVRGT0NVUyA+PiA4KToKKworCQlkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ29tYm8gWyUwNHhdOiBlZGl0IFslMDR4XSBnb3QgZm9jdXNcbiIsIAorCQkJCSAgICAgQ0JfSFdORChscGhjKSwgKEhXTkQxNilscGhjLT5oV25kRWRpdCApOworCisJCWlmKCAhKGxwaGMtPndTdGF0ZSAmIENCRl9GT0NVU0VEKSApIENPTUJPX1NldEZvY3VzKCBscGhjICk7CisJICAgICAgICBicmVhazsKKworCSAgIGNhc2UgKEVOX0tJTExGT0NVUyA+PiA4KToKKworCQlkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ29tYm8gWyUwNHhdOiBlZGl0IFslMDR4XSBsb3N0IGZvY3VzXG4iLAorCQkJCSAgICAgIENCX0hXTkQobHBoYyksIChIV05EMTYpbHBoYy0+aFduZEVkaXQgKTsKKworCQkvKiBOT1RFOiBpdCBzZWVtcyB0aGF0IFdpbmRvd3MnIGVkaXQgY29udHJvbCBzZW5kcyBhbgorCQkgKiB1bmRvY3VtZW50ZWQgbWVzc2FnZSBXTV9VU0VSICsgMHgxQiBpbnN0ZWFkIG9mIHRoaXMKKwkJICogbm90aWZpY2F0aW9uIChvbmx5IHdoZW4gaXQgaGFwcGVucyB0byBiZSBhIHBhcnQgb2YgCisJCSAqIHRoZSBjb21ibykuID8/IC0gQUsuCisJCSAqLworCisJCUNPTUJPX0tpbGxGb2N1cyggbHBoYyApOworCQlicmVhazsKKworCisJICAgY2FzZSAoRU5fQ0hBTkdFID4+IDgpOgorCQlDQl9OT1RJRlkoIGxwaGMsIENCTl9FRElUQ0hBTkdFICk7CisJCUNCVXBkYXRlTEJveCggbHBoYyApOworCQlicmVhazsKKworCSAgIGNhc2UgKEVOX1VQREFURSA+PiA4KToKKwkJQ0JfTk9USUZZKCBscGhjLCBDQk5fRURJVFVQREFURSApOworCQlicmVhazsKKworCSAgIGNhc2UgKEVOX0VSUlNQQUNFID4+IDgpOgorCQlDQl9OT1RJRlkoIGxwaGMsIENCTl9FUlJTUEFDRSApOworICAgICAgIH0KKyAgIH0KKyAgIGVsc2UgaWYoIGxwaGMtPmhXbmRMQm94ID09IGhXbmQgKQorICAgeworICAgICAgIHN3aXRjaCggSElXT1JEKHdQYXJhbSkgKQorICAgICAgIHsKKwkgICBjYXNlIExCTl9FUlJTUEFDRToKKwkJQ0JfTk9USUZZKCBscGhjLCBDQk5fRVJSU1BBQ0UgKTsKKwkJYnJlYWs7CisKKwkgICBjYXNlIExCTl9EQkxDTEs6CisJCUNCX05PVElGWSggbHBoYywgQ0JOX0RCTENMSyApOworCQlicmVhazsKKworCSAgIGNhc2UgTEJOX1NFTENIQU5HRToKKwkgICBjYXNlIExCTl9TRUxDQU5DRUw6CisKKwkJZHByaW50Zl9jb21ibyhzdGRkZWIsIkNvbWJvIFslMDR4XTogbGJveCBzZWxlY3Rpb24gY2hhbmdlIFslMDR4XVxuIiwgCisJCQkJCQkgICAgICBDQl9IV05EKGxwaGMpLCBscGhjLT53U3RhdGUgKTsKKworCQkvKiBkbyBub3Qgcm9sbCB1cCBpZiBzZWxlY3Rpb24gaXMgYmVpbmcgdHJhY2tlZCAKKwkJICogYnkgYXJyb3drZXlzIGluIHRoZSBkcm9wZG93biBsaXN0Ym94ICovCisKKwkJaWYoIChscGhjLT53U3RhdGUgJiBDQkZfRFJPUFBFRCkgJiYgIShscGhjLT53U3RhdGUgJiBDQkZfTk9ST0xMVVApICkKKwkJICAgICBDQlJvbGxVcCggbHBoYywgKEhJV09SRCh3UGFyYW0pID09IExCTl9TRUxDSEFOR0UpLCBUUlVFICk7CisJCWVsc2UgbHBoYy0+d1N0YXRlICY9IH5DQkZfTk9ST0xMVVA7CisKKwkJQ0JfTk9USUZZKCBscGhjLCBDQk5fU0VMQ0hBTkdFICk7CisJCUNCUGFpbnRUZXh0KCBscGhjLCAwICk7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJICAgY2FzZSBMQk5fU0VURk9DVVM6CisJICAgY2FzZSBMQk5fS0lMTEZPQ1VTOgorCQkvKiBub3RoaW5nIHRvIGRvIGhlcmUgc2luY2UgQ29tYm9MQm94IGFsd2F5cyByZXNldHMgdGhlIGZvY3VzIHRvIGl0cworCQkgKiBjb21iby9lZGl0IGNvdW50ZXJwYXJ0ICovCisgICAgICAgfQorICAgfQorICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENPTUJPX0l0ZW1PcAorICoKKyAqIEZpeHVwIGFuIG93bmVyZHJhd24gaXRlbSBvcGVyYXRpb24gYW5kIHBhc3MgaXQgdXAgdG8gdGhlIGNvbWJvYm94IG93bmVyLgorICovCitzdGF0aWMgTFJFU1VMVCBDT01CT19JdGVtT3AzMiggTFBIRUFEQ09NQk8gbHBoYywgVUlOVDMyIG1zZywgCisJCQkgICAgICAgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkgCit7CisgICBIV05EMzIJaFduZCA9IGxwaGMtPnNlbGYtPmh3bmRTZWxmOworCisgICBkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ29tYm8gWyUwNHhdOiBvd25lcmRyYXcgb3AgJTA0eFxuIiwgCisJCQkJICAgICAgIENCX0hXTkQobHBoYyksIChVSU5UMTYpbXNnICk7CisKKyNkZWZpbmUgbHBJUyAgICAoKExQREVMRVRFSVRFTVNUUlVDVDMyKWxQYXJhbSkKKworICAgLyogdHdvIGZpcnN0IGl0ZW1zIGFyZSB0aGUgc2FtZSBpbiBhbGwgNCBzdHJ1Y3RzICovCisgICBscElTLT5DdGxUeXBlID0gT0RUX0NPTUJPQk9YOworICAgbHBJUy0+Q3RsSUQgICA9IGxwaGMtPnNlbGYtPndJRG1lbnU7CisKKyAgIHN3aXRjaCggbXNnICkJLyogcGF0Y2ggd2luZG93IGhhbmRsZSAqLworICAgeworCWNhc2UgV01fREVMRVRFSVRFTTogCisJICAgICBscElTLT5od25kSXRlbSA9IGhXbmQ7IAorI3VuZGVmICBscElTCisJICAgICBicmVhazsKKwljYXNlIFdNX0RSQVdJVEVNOiAKKyNkZWZpbmUgbHBJUyAgICAoKExQRFJBV0lURU1TVFJVQ1QzMilsUGFyYW0pCisJICAgICBscElTLT5od25kSXRlbSA9IGhXbmQ7IAorI3VuZGVmICBscElTCisJICAgICBicmVhazsKKwljYXNlIFdNX0NPTVBBUkVJVEVNOiAKKyNkZWZpbmUgbHBJUyAgICAoKExQQ09NUEFSRUlURU1TVFJVQ1QzMilsUGFyYW0pCisJICAgICBscElTLT5od25kSXRlbSA9IGhXbmQ7IAorI3VuZGVmICBscElTCisJICAgICBicmVhazsKKyAgIH0KKworICByZXR1cm4gU2VuZE1lc3NhZ2UzMkEoIGxwaGMtPm93bmVyLCBtc2csIGxwaGMtPnNlbGYtPndJRG1lbnUsIGxQYXJhbSApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDT01CT19HZXRUZXh0CisgKi8KK3N0YXRpYyBMUkVTVUxUIENPTUJPX0dldFRleHQoIExQSEVBRENPTUJPIGxwaGMsIFVJTlQzMiBOLCBMUFNUUiBscFRleHQpCit7CisgICBJTlQzMglpZHg7CisKKyAgIGlmKCBscGhjLT53U3RhdGUgJiBDQkZfRURJVCApCisgICAgICAgcmV0dXJuIFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kRWRpdCwgV01fR0VUVEVYVCwgCisJCQkgICAgIChXUEFSQU0zMilOLCAoTFBBUkFNKWxwVGV4dCApOyAgICAgCisKKyAgIC8qIGdldCBpdCBmcm9tIHRoZSBsaXN0Ym94ICovCisKKyAgIGlkeCA9IFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kTEJveCwgTEJfR0VUQ1VSU0VMMzIsIDAsIDAgKTsKKyAgIGlmKCBpZHggPj0gMCApCisgICB7CisgICAgICAgTFBTVFIgICAgICAgIGxwQnVmZmVyOworICAgICAgIElOVDMyCSAgICBsZW5ndGggPSBTZW5kTWVzc2FnZTMyQSggbHBoYy0+aFduZExCb3gsIExCX0dFVFRFWFRMRU4zMiwKKwkJCQkJICAgIChXUEFSQU0zMilpZHgsIDAgKTsKKworICAgICAgIC8qICdsZW5ndGgnIGlzIHdpdGhvdXQgdGhlIHRlcm1pbmF0aW5nIGNoYXJhY3RlciAqLworICAgICAgIGlmKCBsZW5ndGggPj0gTiApCisJICAgbHBCdWZmZXIgPSAoTFBTVFIpIEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbGVuZ3RoICsgMSApOworICAgICAgIGVsc2UgCisJICAgbHBCdWZmZXIgPSBscFRleHQ7CisKKyAgICAgICBpZiggbHBCdWZmZXIgKQorICAgICAgIHsKKwkgICBJTlQzMiAgICBuID0gU2VuZE1lc3NhZ2UzMkEoIGxwaGMtPmhXbmRMQm94LCBMQl9HRVRURVhUMzIsIAorCQkJCSAgICAgICAoV1BBUkFNMzIpaWR4LCAoTFBBUkFNKWxwVGV4dCApOworCisJICAgLyogdHJ1bmNhdGUgaWYgYnVmZmVyIGlzIHRvbyBzaG9ydCAqLworCisJICAgaWYoIGxlbmd0aCA+PSBOICkKKwkgICB7CisJICAgICAgIGlmKCBuICE9IExCX0VSUiApIG1lbWNweSggbHBUZXh0LCBscEJ1ZmZlciwgKE4+bikgPyBuKzEgOiBOLTEgKTsKKwkgICAgICAgbHBUZXh0W04gLSAxXSA9ICdcMCc7CisJICAgICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBscEJ1ZmZlciApOworCSAgIH0KKwkgICByZXR1cm4gKExSRVNVTFQpbjsKKyAgICAgICB9CisgICB9CisgICByZXR1cm4gMDsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDQlNldEVkaXRTZWwKLSAqIExvb2sgb3V0ISBVbmRlciBXaW4zMiwgdGhlIHBhcmFtZXRlciBwYWNraW5nIGlzIHZlcnkgZGlmZmVyZW50LgorICogICAgICAgICAgIENCUmVzZXRQb3MKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgd2luZG93IHBvc2l0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIHVwZGF0ZWQgCisgKiBjb21wb25lbnQgcGxhY2VtZW50IHN0cnVjdC4KICAqLwotc3RhdGljIExSRVNVTFQgQ0JTZXRFZGl0U2VsKEhXTkQxNiBod25kLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitzdGF0aWMgdm9pZCBDQlJlc2V0UG9zKCBMUEhFQURDT01CTyBscGhjLCBMUFJFQ1QxNiBsYlJlY3QsIEJPT0wzMiBiUmVkcmF3ICkKIHsKLSAgICBMUEhFQURDT01CTyBscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOworICAgQk9PTDMyCWJEcm9wID0gKENCX0dFVFRZUEUobHBoYykgIT0gQ0JTX1NJTVBMRSk7CiAKLSAgICBpZiAoKGxwaGMtPmR3U3R5bGUgJiAzKSA9PSBDQlNfRFJPUERPV05MSVNUKQotICAgICAgcmV0dXJuIENCX0VSUjsKLSAgICByZXR1cm4gU2VuZE1lc3NhZ2UxNihscGhjLT5oV25kRWRpdCwgRU1fU0VUU0VMMTYsIDAsIGxQYXJhbSk7CisgICAvKiBOT1RFOiBsb2dzIHNvbWV0aW1lcyBoYXZlIFdNX0xCVVRUT05VUCBiZWZvcmUgYSBjYXNjYWRlIG9mCisgICAgKiBzaXppbmcgbWVzc2FnZXMgKi8KKworICAgaWYoIGxwaGMtPndTdGF0ZSAmIENCRl9FRElUICkKKyAgICAgICBTZXRXaW5kb3dQb3MzMiggbHBoYy0+aFduZEVkaXQsIDAsIGxwaGMtPlJlY3RFZGl0LmxlZnQsIGxwaGMtPlJlY3RFZGl0LnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgbHBoYy0+UmVjdEVkaXQucmlnaHQgLSBscGhjLT5SZWN0RWRpdC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICBscGhjLT5SZWN0RWRpdC5ib3R0b20gLSBscGhjLT5SZWN0RWRpdC50b3AsCisgICAgICAgICAgICAgICAgICAgICAgIFNXUF9OT1pPUkRFUiB8IFNXUF9OT0FDVElWQVRFIHwgKChiRHJvcCkgPyBTV1BfTk9SRURSQVcgOiAwKSApOworCisgICBpZiggYkRyb3AgKQorICAgICAgIE9mZnNldFJlY3QxNiggbGJSZWN0LCBscGhjLT5SZWN0Q29tYm8ubGVmdCwgbHBoYy0+UmVjdENvbWJvLnRvcCApOworCisgICBsYlJlY3QtPnJpZ2h0IC09IGxiUmVjdC0+bGVmdDsJLyogY29udmVydCB0byB3aWR0aCAqLworICAgbGJSZWN0LT5ib3R0b20gLT0gbGJSZWN0LT50b3A7CisgICBTZXRXaW5kb3dQb3MzMiggbHBoYy0+aFduZExCb3gsIDAsIGxiUmVjdC0+bGVmdCwgbGJSZWN0LT50b3AsCisgICAgICAgICAgICAgICAgICAgbGJSZWN0LT5yaWdodCwgbGJSZWN0LT5ib3R0b20sIAorCQkgICBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT1pPUkRFUiB8ICgoYkRyb3ApID8gU1dQX05PUkVEUkFXIDogMCkgKTsKKworICAgaWYoIGJEcm9wICkKKyAgIHsKKyAgICAgICBpZiggbHBoYy0+d1N0YXRlICYgQ0JGX0RST1BQRUQgKQorICAgICAgIHsKKyAgICAgICAgICAgbHBoYy0+d1N0YXRlICY9IH5DQkZfRFJPUFBFRDsKKyAgICAgICAgICAgU2hvd1dpbmRvdzMyKCBscGhjLT5oV25kTEJveCwgU1dfSElERSApOworICAgICAgIH0KKworICAgICAgIGxwaGMtPndTdGF0ZSB8PSBDQkZfTk9SRVNJWkU7CisgICAgICAgU2V0V2luZG93UG9zMzIoIGxwaGMtPnNlbGYtPmh3bmRTZWxmLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICBscGhjLT5SZWN0Q29tYm8ucmlnaHQgLSBscGhjLT5SZWN0Q29tYm8ubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgbHBoYy0+UmVjdEVkaXQuYm90dG9tIC0gbHBoYy0+UmVjdEVkaXQudG9wLAorICAgICAgICAgICAgICAgICAgICAgICBTV1BfTk9NT1ZFIHwgU1dQX05PWk9SREVSIHwgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9SRURSQVcgKTsKKyAgICAgICBscGhjLT53U3RhdGUgJj0gfkNCRl9OT1JFU0laRTsKKyAgICAgICBpZiggYlJlZHJhdyApCisgICAgICAgICAgIFJlZHJhd1dpbmRvdzMyKCBscGhjLT5zZWxmLT5od25kU2VsZiwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJEV19JTlZBTElEQVRFIHwgUkRXX0VSQVNFIHwgUkRXX1VQREFURU5PVyApOworICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENPTUJPX1NpemUKKyAqLworc3RhdGljIHZvaWQgQ09NQk9fU2l6ZSggTFBIRUFEQ09NQk8gbHBoYyApCit7CisgIFJFQ1QxNglyZWN0OworICBJTlQxNgkJdywgaDsKKworICBHZXRXaW5kb3dSZWN0MTYoIGxwaGMtPnNlbGYtPmh3bmRTZWxmLCAmcmVjdCApOworICB3ID0gcmVjdC5yaWdodCAtIHJlY3QubGVmdDsgaCA9IHJlY3QuYm90dG9tIC0gcmVjdC50b3A7CisKKyAgZHByaW50Zl9jb21ibyhzdGRkZWIsIkNPTUJPX1NpemU6IHcgPSAlaSwgaCA9ICVpXG4iLCB3LCBoICk7CisKKyAgLyogQ3JlYXRlV2luZG93KCkgbWF5IHNlbmQgYSBib2d1cyBXTV9TSVpFLCBpZ25vcmUgaXQgKi8KKworICBpZiggdyA9PSAobHBoYy0+UmVjdENvbWJvLnJpZ2h0IC0gbHBoYy0+UmVjdENvbWJvLmxlZnQpICkKKyAgICAgIGlmKCAoQ0JfR0VUVFlQRShscGhjKSA9PSBDQlNfU0lNUExFKSAmJgorCSAgKGggPT0gKGxwaGMtPlJlY3RDb21iby5ib3R0b20gLSBscGhjLT5SZWN0Q29tYm8udG9wKSkgKQorICAgICAgICAgIHJldHVybjsKKyAgICAgIGVsc2UgaWYoIChscGhjLT5kd1N0eWxlICYgQ0JTX0RST1BET1dOKSAmJgorCSAgICAgICAoaCA9PSAobHBoYy0+UmVjdEVkaXQuYm90dG9tIC0gbHBoYy0+UmVjdEVkaXQudG9wKSkgICkKKwkgICAgICAgcmV0dXJuOworICAKKyAgbHBoYy0+UmVjdENvbWJvID0gcmVjdDsKKyAgQ0JDYWxjUGxhY2VtZW50KCBscGhjLCAmbHBoYy0+UmVjdEVkaXQsICZscGhjLT5SZWN0QnV0dG9uLCAmcmVjdCApOworICBDQlJlc2V0UG9zKCBscGhjLCAmcmVjdCwgVFJVRSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENPTUJPX0ZvbnQKKyAqLworc3RhdGljIHZvaWQgQ09NQk9fRm9udCggTFBIRUFEQ09NQk8gbHBoYywgSEZPTlQxNiBoRm9udCwgQk9PTDMyIGJSZWRyYXcgKQoreworICBSRUNUMTYgICAgICAgIHJlY3Q7CisKKyAgbHBoYy0+aEZvbnQgPSBoRm9udDsKKworICBpZiggbHBoYy0+d1N0YXRlICYgQ0JGX0VESVQgKQorICAgICAgU2VuZE1lc3NhZ2UzMkEoIGxwaGMtPmhXbmRFZGl0LCBXTV9TRVRGT05ULCAoV1BBUkFNMzIpaEZvbnQsIGJSZWRyYXcgKTsKKyAgU2VuZE1lc3NhZ2UzMkEoIGxwaGMtPmhXbmRMQm94LCBXTV9TRVRGT05ULCAoV1BBUkFNMzIpaEZvbnQsIGJSZWRyYXcgKTsKKworICBHZXRXaW5kb3dSZWN0MTYoIGxwaGMtPnNlbGYtPmh3bmRTZWxmLCAmcmVjdCApOworICBPZmZzZXRSZWN0MTYoICZscGhjLT5SZWN0Q29tYm8sIHJlY3QubGVmdCAtIGxwaGMtPlJlY3RDb21iby5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QudG9wIC0gbHBoYy0+UmVjdENvbWJvLnRvcCApOworICBDQkNhbGNQbGFjZW1lbnQoIGxwaGMsICZscGhjLT5SZWN0RWRpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmbHBoYy0+UmVjdEJ1dHRvbiwgJnJlY3QgKTsKKyAgQ0JSZXNldFBvcyggbHBoYywgJnJlY3QsIGJSZWRyYXcgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDT01CT19TZXRJdGVtSGVpZ2h0CisgKi8KK3N0YXRpYyBMUkVTVUxUIENPTUJPX1NldEl0ZW1IZWlnaHQoIExQSEVBRENPTUJPIGxwaGMsIElOVDMyIGluZGV4LCBJTlQzMiBoZWlnaHQgKQoreworICAgTFJFU1VMVAlsUmV0ID0gQ0JfRVJSOworCisgICBpZiggaW5kZXggPT0gLTEgKSAvKiBzZXQgdGV4dCBmaWVsZCBoZWlnaHQgKi8KKyAgIHsKKyAgICAgICBpZiggaGVpZ2h0IDwgMzI3NjggKQorICAgICAgIHsKKyAgICAgICAgICAgUkVDVDE2CXJlY3Q7CisKKyAgICAgICAgICAgbHBoYy0+ZWRpdEhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgICAgR2V0V2luZG93UmVjdDE2KCBscGhjLT5zZWxmLT5od25kU2VsZiwgJnJlY3QgKTsKKyAgICAgICAgICAgT2Zmc2V0UmVjdDE2KCAmbHBoYy0+UmVjdENvbWJvLCByZWN0LmxlZnQgLSBscGhjLT5SZWN0Q29tYm8ubGVmdCwKKwkJCQkgICAgICAgICAgIHJlY3QudG9wIC0gbHBoYy0+UmVjdENvbWJvLnRvcCApOworICAgICAgICAgICBDQkNhbGNQbGFjZW1lbnQoIGxwaGMsICZscGhjLT5SZWN0RWRpdCwKKwkJCSAgICAgICAgICAmbHBoYy0+UmVjdEJ1dHRvbiwgJnJlY3QgKTsKKyAgICAgICAgICAgQ0JSZXNldFBvcyggbHBoYywgJnJlY3QsIFRSVUUgKTsKKwkgICBsUmV0ID0gaGVpZ2h0OworICAgICAgIH0KKyAgIH0gCisgICBlbHNlIGlmICggQ0JfT1dORVJEUkFXTihscGhjKSApCS8qIHNldCBsaXN0Ym94IGl0ZW0gaGVpZ2h0ICovCisJbFJldCA9IFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kTEJveCwgTEJfU0VUSVRFTUhFSUdIVDMyLCAKKwkJCSAgICAgIChXUEFSQU0zMilpbmRleCwgKExQQVJBTSloZWlnaHQgKTsKKyAgIHJldHVybiBsUmV0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDQkdldFRleHQKKyAqICAgICAgICAgICBDT01CT19TZWxlY3RTdHJpbmcKICAqLwotc3RhdGljIExSRVNVTFQgQ0JHZXRUZXh0KEhXTkQxNiBod25kLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitzdGF0aWMgTFJFU1VMVCBDT01CT19TZWxlY3RTdHJpbmcoIExQSEVBRENPTUJPIGxwaGMsIElOVDMyIHN0YXJ0LCBMUENTVFIgcFRleHQgKQogewotICAgIExQSEVBRENPTUJPIGxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0KLSAgICByZXR1cm4gU2VuZE1lc3NhZ2UxNihscGhjLT5oV25kRWRpdCwgV01fR0VUVEVYVCwgd1BhcmFtLCBsUGFyYW0pOyAgIAorICAgSU5UMzIgaW5kZXggPSBTZW5kTWVzc2FnZTMyQSggbHBoYy0+aFduZExCb3gsIENCX1NFTEVDVFNUUklORzMyLCAKKwkJCQkgKFdQQVJBTTMyKXN0YXJ0LCAoTFBBUkFNKXBUZXh0ICk7CisgICBpZiggaW5kZXggPj0gMCApCisgICAgICAgIGlmKCBscGhjLT53U3RhdGUgJiBDQkZfRURJVCApCisJICAgIENCVXBkYXRlRWRpdCggbHBoYywgaW5kZXggKTsKKwllbHNlCisJICAgIENCUGFpbnRUZXh0KCBscGhjLCAwICk7CisgICByZXR1cm4gKExSRVNVTFQpaW5kZXg7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENPTUJPX0xCdXR0b25Eb3duCisgKi8KK3N0YXRpYyB2b2lkIENPTUJPX0xCdXR0b25Eb3duKCBMUEhFQURDT01CTyBscGhjLCBMUEFSQU0gbFBhcmFtICkKK3sKKyAgIEJPT0wzMiAgICAgIGJCdXR0b24gPSBQdEluUmVjdDE2KCZscGhjLT5SZWN0QnV0dG9uLCBNQUtFUE9JTlQxNihsUGFyYW0pKTsKKyAgIEhXTkQzMiAgICAgIGhXbmQgPSBscGhjLT5zZWxmLT5od25kU2VsZjsKKworICAgaWYoIChDQl9HRVRUWVBFKGxwaGMpID09IENCU19EUk9QRE9XTkxJU1QpIHx8CisgICAgICAgKGJCdXR0b24gJiYgKENCX0dFVFRZUEUobHBoYykgPT0gQ0JTX0RST1BET1dOKSkgKQorICAgeworICAgICAgIGxwaGMtPndTdGF0ZSB8PSBDQkZfQlVUVE9ORE9XTjsKKyAgICAgICBpZiggbHBoYy0+d1N0YXRlICYgQ0JGX0RST1BQRUQgKQorICAgICAgIHsKKwkgICAvKiBnb3QgYSBjbGljayB0byBjYW5jZWwgc2VsZWN0aW9uICovCisKKyAgICAgICAgICAgQ0JSb2xsVXAoIGxwaGMsIFRSVUUsIEZBTFNFICk7CisJICAgaWYoICFJc1dpbmRvdzMyKCBoV25kICkgKSByZXR1cm47CisKKyAgICAgICAgICAgaWYoIGxwaGMtPndTdGF0ZSAmIENCRl9DQVBUVVJFICkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgbHBoYy0+d1N0YXRlICY9IH5DQkZfQ0FQVFVSRTsKKyAgICAgICAgICAgICAgIFJlbGVhc2VDYXB0dXJlKCk7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgbHBoYy0+d1N0YXRlICY9IH5DQkZfQlVUVE9ORE9XTjsKKyAgICAgICB9CisgICAgICAgZWxzZQorICAgICAgIHsKKwkgICAvKiBkcm9wIGRvd24gdGhlIGxpc3Rib3ggYW5kIHN0YXJ0IHRyYWNraW5nICovCisKKyAgICAgICAgICAgbHBoYy0+d1N0YXRlIHw9IENCRl9DQVBUVVJFOworICAgICAgICAgICBDQkRyb3BEb3duKCBscGhjICk7CisgICAgICAgICAgIFNldENhcHR1cmUzMiggaFduZCApOworICAgICAgIH0KKyAgICAgICBpZiggYkJ1dHRvbiApIENCUmVwYWludEJ1dHRvbiggbHBoYyApOworICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDT01CT19MQnV0dG9uVXAKKyAqCisgKiBSZWxlYXNlIGNhcHR1cmUgYW5kIHN0b3AgdHJhY2tpbmcgaWYgbmVlZGVkLgorICovCitzdGF0aWMgdm9pZCBDT01CT19MQnV0dG9uVXAoIExQSEVBRENPTUJPIGxwaGMsIExQQVJBTSBsUGFyYW0gKQoreworICAgaWYoIGxwaGMtPndTdGF0ZSAmIENCRl9DQVBUVVJFICkKKyAgIHsKKyAgICAgICBscGhjLT53U3RhdGUgJj0gfkNCRl9DQVBUVVJFOworICAgICAgIGlmKCBDQl9HRVRUWVBFKGxwaGMpID09IENCU19EUk9QRE9XTiApCisgICAgICAgeworCSAgIElOVDMyIGluZGV4ID0gQ0JVcGRhdGVMQm94KCBscGhjICk7CisJICAgQ0JVcGRhdGVFZGl0KCBscGhjLCBpbmRleCApOworICAgICAgIH0KKyAgICAgICBSZWxlYXNlQ2FwdHVyZSgpOworICAgfQorCisgICBpZiggbHBoYy0+d1N0YXRlICYgQ0JGX0JVVFRPTkRPV04gKQorICAgeworICAgICAgIGxwaGMtPndTdGF0ZSAmPSB+Q0JGX0JVVFRPTkRPV047CisgICAgICAgQ0JSZXBhaW50QnV0dG9uKCBscGhjICk7CisgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENPTUJPX01vdXNlTW92ZQorICoKKyAqIFR3byB0aGluZ3MgdG8gZG8gLSB0cmFjayBjb21ibyBidXR0b24gYW5kIHJlbGVhc2UgY2FwdHVyZSB3aGVuCisgKiBwb2ludGVyIGdvZXMgaW50byB0aGUgbGlzdGJveC4KKyAqLworc3RhdGljIHZvaWQgQ09NQk9fTW91c2VNb3ZlKCBMUEhFQURDT01CTyBscGhjLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKQoreworICAgUkVDVDE2CWxiUmVjdDsKKworICAgaWYoIGxwaGMtPndTdGF0ZSAmIENCRl9CVVRUT05ET1dOICkKKyAgIHsKKyAgICAgICBCT09MMzIJYkJ1dHRvbiA9IFB0SW5SZWN0MTYoJmxwaGMtPlJlY3RCdXR0b24sIE1BS0VQT0lOVDE2KGxQYXJhbSkpOworCisgICAgICAgaWYoICFiQnV0dG9uICkKKyAgICAgICB7CisJICAgbHBoYy0+d1N0YXRlICY9IH5DQkZfQlVUVE9ORE9XTjsKKwkgICBDQlJlcGFpbnRCdXR0b24oIGxwaGMgKTsKKyAgICAgICB9CisgICB9CisKKyAgIEdldENsaWVudFJlY3QxNiggbHBoYy0+aFduZExCb3gsICZsYlJlY3QgKTsKKyAgIE1hcFdpbmRvd1BvaW50czE2KCBscGhjLT5zZWxmLT5od25kU2VsZiwgCisJCSAgICAgIGxwaGMtPmhXbmRMQm94LCAoTFBQT0lOVDE2KSZsUGFyYW0sIDEgKTsKKyAgIGlmKCBQdEluUmVjdDE2KCZsYlJlY3QsIE1BS0VQT0lOVDE2KGxQYXJhbSkpICkKKyAgIHsKKyAgICAgICBscGhjLT53U3RhdGUgJj0gfkNCRl9DQVBUVVJFOworICAgICAgIFJlbGVhc2VDYXB0dXJlKCk7CisgICAgICAgaWYoIENCX0dFVFRZUEUobHBoYykgPT0gQ0JTX0RST1BET1dOICkgQ0JVcGRhdGVMQm94KCBscGhjICk7CisKKyAgICAgICAvKiBoYW5kIG92ZXIgcG9pbnRlciB0cmFja2luZyAqLworICAgICAgIFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kTEJveCwgV01fTEJVVFRPTkRPV04sIHdQYXJhbSwgbFBhcmFtICk7CisgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ29tYm9XbmRQcm9jCisgKgorICogaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL21zZG4vc2RrL3BsYXRmb3Jtcy9kb2Mvc2RrL3dpbjMyL2N0cmwvc3JjL2NvbWJvYm94XzE1Lmh0bQogICovCi1MUkVTVUxUIENvbWJvQm94V25kUHJvYyhIV05EMTYgaHduZCwgVUlOVDE2IG1lc3NhZ2UsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK0xSRVNVTFQgQ29tYm9XbmRQcm9jKEhXTkQzMiBod25kLCBVSU5UMzIgbWVzc2FnZSwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotICAgIHN3aXRjaChtZXNzYWdlKSB7CQotICAgICBjYXNlIFdNX05DQ1JFQVRFOiByZXR1cm4gQ0JOQ0NyZWF0ZShod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgIGNhc2UgV01fQ1JFQVRFOiByZXR1cm4gQ0JDcmVhdGUoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIFdNX0RFU1RST1k6IHJldHVybiBDQkRlc3Ryb3koaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIFdNX0dFVERMR0NPREU6IHJldHVybiBDQkdldERsZ0NvZGUoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIFdNX0tFWURPV046IHJldHVybiBDQktleURvd24oaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIFdNX0NIQVI6IHJldHVybiBDQkNoYXIoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIFdNX1NFVEZPTlQ6IHJldHVybiBDQlNldEZvbnQoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIFdNX1NFVFJFRFJBVzogcmV0dXJuIENCU2V0UmVkcmF3KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBXTV9QQUlOVDogcmV0dXJuIENCUGFpbnQoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIFdNX0dFVFRFWFQ6IHJldHVybiBDQkdldFRleHQoIGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBXTV9MQlVUVE9ORE9XTjogcmV0dXJuIENCTEJ1dHRvbkRvd24oaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIFdNX1NFVEZPQ1VTOiByZXR1cm4gQ0JTZXRGb2N1cyhod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgIGNhc2UgV01fS0lMTEZPQ1VTOiByZXR1cm4gQ0JLaWxsRm9jdXMoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIFdNX1NJWkU6IHJldHVybiBDQkNoZWNrU2l6ZShod25kKTsKLSAgICAgY2FzZSBXTV9DT01NQU5EOiByZXR1cm4gQ0JDb21tYW5kKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBDQl9SRVNFVENPTlRFTlQxNjogcmV0dXJuIENCUmVzZXRDb250ZW50KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBDQl9ESVIxNjogcmV0dXJuIENCRGlyKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBDQl9BRERTVFJJTkcxNjogcmV0dXJuIENCQWRkU3RyaW5nKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBDQl9JTlNFUlRTVFJJTkcxNjogcmV0dXJuIENCSW5zZXJ0U3RyaW5nKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBDQl9ERUxFVEVTVFJJTkcxNjogcmV0dXJuIENCRGVsZXRlU3RyaW5nKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBDQl9GSU5EU1RSSU5HMTY6IHJldHVybiBDQkZpbmRTdHJpbmcoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIENCX0dFVENPVU5UMTY6IHJldHVybiBDQkdldENvdW50KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBDQl9HRVRDVVJTRUwxNjogcmV0dXJuIENCR2V0Q3VyU2VsKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBDQl9HRVRJVEVNREFUQTE2OiByZXR1cm4gQ0JHZXRJdGVtRGF0YShod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgIGNhc2UgQ0JfR0VUSVRFTUhFSUdIVDE2OiByZXR1cm4gQ0JHZXRJdGVtSGVpZ2h0KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBDQl9HRVRMQlRFWFQxNjogcmV0dXJuIENCR2V0TEJUZXh0KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBDQl9HRVRMQlRFWFRMRU4xNjogcmV0dXJuIENCR2V0TEJUZXh0TGVuKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBDQl9TRUxFQ1RTVFJJTkcxNjogcmV0dXJuIENCU2VsZWN0U3RyaW5nKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBDQl9TRVRJVEVNREFUQTE2OiByZXR1cm4gQ0JTZXRJdGVtRGF0YShod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgIGNhc2UgQ0JfU0VUQ1VSU0VMMTY6IHJldHVybiBDQlNldEN1clNlbChod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgIGNhc2UgQ0JfU0VUSVRFTUhFSUdIVDE2OiByZXR1cm4gQ0JTZXRJdGVtSGVpZ2h0KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBDQl9TSE9XRFJPUERPV04xNjogcmV0dXJuIENCU2hvd0Ryb3BEb3duKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBDQl9HRVRFRElUU0VMMTY6IHJldHVybiBDQkdldEVkaXRTZWwoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIENCX1NFVEVESVRTRUwxNjogcmV0dXJuIENCU2V0RWRpdFNlbChod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgIGNhc2UgQ0JfRklORFNUUklOR0VYQUNUMTY6IHJldHVybiBDQkZpbmRTdHJpbmdFeGFjdChod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgV05EKglwV25kID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7CisgICAKKyAgICBpZiggcFduZCApCisgICAgeworICAgICAgTFBIRUFEQ09NQk8JbHBoYyA9IENCX0dFVFBUUihwV25kKTsKKworICAgICAgZHByaW50Zl9jb21ibyggc3RkZGViLCAiQ29tYm8gWyUwNHhdOiBtc2cgJXMgd3AgJTA4eCBscCAlMDhseFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHBXbmQtPmh3bmRTZWxmLCBTUFlfR2V0TXNnTmFtZShtZXNzYWdlKSwgd1BhcmFtLCBsUGFyYW0gKTsKKworICAgICAgaWYoIGxwaGMgfHwgbWVzc2FnZSA9PSBXTV9OQ0NSRUFURSApCisgICAgICBzd2l0Y2gobWVzc2FnZSkgCisgICAgICB7CQorCisJLyogU3lzdGVtIG1lc3NhZ2VzICovCisKKyAgICAgCWNhc2UgV01fTkNDUkVBVEU6IAorCQlyZXR1cm4gQ09NQk9fTkNDcmVhdGUocFduZCwgbFBhcmFtKTsKKworICAgICAJY2FzZSBXTV9OQ0RFU1RST1k6IAorCQlDT01CT19OQ0Rlc3Ryb3kobHBoYyk7CisJCWJyZWFrOworCisgICAgIAljYXNlIFdNX0NSRUFURTogCisJCXJldHVybiBDT01CT19DcmVhdGUobHBoYywgcFduZCwgbFBhcmFtKTsKKworICAgICAJY2FzZSBXTV9QQUlOVDoKKwkJLyogd1BhcmFtIG1heSBjb250YWluIGEgdmFsaWQgSERDISAqLworCQlyZXR1cm4gQ09NQk9fUGFpbnQobHBoYywgKEhEQzE2KXdQYXJhbSk7CisKKwljYXNlIFdNX0VSQVNFQktHTkQ6CisJCXJldHVybiBUUlVFOworCisgICAgIAljYXNlIFdNX0dFVERMR0NPREU6IAorCQlyZXR1cm4gKExSRVNVTFQpKERMR0NfV0FOVEFSUk9XUyB8IERMR0NfV0FOVENIQVJTKTsKKworCWNhc2UgV01fU0laRToKKwkgICAgICAgIGlmKCBscGhjLT5oV25kTEJveCAmJiAKKwkJICAhKGxwaGMtPndTdGF0ZSAmIENCRl9OT1JFU0laRSkgKSBDT01CT19TaXplKCBscGhjICk7CisJCXJldHVybiBUUlVFOworCisJY2FzZSBXTV9TRVRGT05UOgorCQlDT01CT19Gb250KCBscGhjLCAoSEZPTlQxNil3UGFyYW0sIChCT09MMzIpbFBhcmFtICk7CisJCXJldHVybiBUUlVFOworCisJY2FzZSBXTV9HRVRGT05UOgorCQlyZXR1cm4gKExSRVNVTFQpbHBoYy0+aEZvbnQ7CisKKwljYXNlIFdNX1NFVEZPQ1VTOgorCQlpZiggbHBoYy0+d1N0YXRlICYgQ0JGX0VESVQgKQorCQkgICAgU2V0Rm9jdXMzMiggbHBoYy0+aFduZEVkaXQgKTsKKwkJZWxzZQorCQkgICAgQ09NQk9fU2V0Rm9jdXMoIGxwaGMgKTsKKwkJcmV0dXJuIFRSVUU7CisKKwljYXNlIFdNX0tJTExGT0NVUzoKKyNkZWZpbmUgaHduZEZvY3VzICgoSFdORDE2KXdQYXJhbSkKKwkJaWYoICFod25kRm9jdXMgfHwKKwkJICAgIChod25kRm9jdXMgIT0gbHBoYy0+aFduZEVkaXQgJiYgaHduZEZvY3VzICE9IGxwaGMtPmhXbmRMQm94ICkpCisJCSAgICBDT01CT19LaWxsRm9jdXMoIGxwaGMgKTsKKyN1bmRlZiBod25kRm9jdXMKKwkJcmV0dXJuIFRSVUU7CisKKwljYXNlIFdNX0NPTU1BTkQ6CisJCXJldHVybiBDT01CT19Db21tYW5kKCBscGhjLCB3UGFyYW0sIChIV05EMzIpbFBhcmFtICk7CisKKwljYXNlIFdNX0dFVFRFWFQ6CisJCXJldHVybiBDT01CT19HZXRUZXh0KCBscGhjLCAoVUlOVDMyKXdQYXJhbSwgKExQU1RSKWxQYXJhbSApOworCisJY2FzZSBXTV9TRVRURVhUOgorCWNhc2UgV01fR0VUVEVYVExFTkdUSDoKKwljYXNlIFdNX0NMRUFSOgorCWNhc2UgV01fQ1VUOgorICAgICAgICBjYXNlIFdNX1BBU1RFOgorCWNhc2UgV01fQ09QWToKKwkJaWYoIGxwaGMtPndTdGF0ZSAmIENCRl9FRElUICkKKwkJICAgIHJldHVybiBTZW5kTWVzc2FnZTMyQSggbHBoYy0+aFduZEVkaXQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtICk7CisJCXJldHVybiBDQl9FUlI7CisKKwljYXNlIFdNX0RSQVdJVEVNOgorCWNhc2UgV01fREVMRVRFSVRFTToKKwljYXNlIFdNX0NPTVBBUkVJVEVNOgorCWNhc2UgV01fTUVBU1VSRUlURU06CisJCXJldHVybiBDT01CT19JdGVtT3AzMiggbHBoYywgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0gKTsKKworCWNhc2UgV01fRU5BQkxFOgorCQlpZiggbHBoYy0+d1N0YXRlICYgQ0JGX0VESVQgKQorCQkgICAgRW5hYmxlV2luZG93MzIoIGxwaGMtPmhXbmRFZGl0LCAoQk9PTDMyKXdQYXJhbSApOyAKKwkJRW5hYmxlV2luZG93MzIoIGxwaGMtPmhXbmRMQm94LCAoQk9PTDMyKXdQYXJhbSApOworCQlyZXR1cm4gVFJVRTsKKworCWNhc2UgV01fU0VUUkVEUkFXOgorCQlpZiggbHBoYy0+d1N0YXRlICYgQ0JGX0VESVQgKQorCQkgICAgU2VuZE1lc3NhZ2UzMkEoIGxwaGMtPmhXbmRFZGl0LCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSApOworCQlTZW5kTWVzc2FnZTMyQSggbHBoYy0+aFduZExCb3gsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtICk7CisJCWJyZWFrOworCQkKKwljYXNlIFdNX1NZU0tFWURPV046CisJCWlmKCBLRVlEQVRBX0FMVCAmIEhJV09SRChsUGFyYW0pICkKKwkJICAgIGlmKCB3UGFyYW0gPT0gVktfVVAgfHwgd1BhcmFtID09IFZLX0RPV04gKQorCQkJQ09NQk9fRmxpcExpc3Rib3goIGxwaGMsIFRSVUUgKTsKKwkJYnJlYWs7CisKKwljYXNlIFdNX0NIQVI6CisJY2FzZSBXTV9LRVlET1dOOgorCQlpZiggbHBoYy0+d1N0YXRlICYgQ0JGX0VESVQgKQorCQkgICAgcmV0dXJuIFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kRWRpdCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0gKTsKKwkJZWxzZQorCQkgICAgcmV0dXJuIFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kTEJveCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0gKTsKKworCWNhc2UgV01fTEJVVFRPTkRPV046IAorCQlpZiggIShscGhjLT53U3RhdGUgJiBDQkZfRk9DVVNFRCkgKSBTZXRGb2N1czMyKCBscGhjLT5zZWxmLT5od25kU2VsZiApOworCQlpZiggbHBoYy0+d1N0YXRlICYgQ0JGX0ZPQ1VTRUQgKSBDT01CT19MQnV0dG9uRG93biggbHBoYywgbFBhcmFtICk7CisJCXJldHVybiBUUlVFOworCisJY2FzZSBXTV9MQlVUVE9OVVA6CisJCUNPTUJPX0xCdXR0b25VcCggbHBoYywgbFBhcmFtICk7CisJCXJldHVybiBUUlVFOworCisJY2FzZSBXTV9NT1VTRU1PVkU6IAorCQlpZiggbHBoYy0+d1N0YXRlICYgQ0JGX0NBUFRVUkUgKSAKKwkJICAgIENPTUJPX01vdXNlTW92ZSggbHBoYywgd1BhcmFtLCBsUGFyYW0gKTsKKwkJcmV0dXJuIFRSVUU7CisKKwkvKiBDb21ibyBtZXNzYWdlcyAqLworCisJY2FzZSBDQl9BRERTVFJJTkcxNjoKKwkJaWYoIENCX0hBU1NUUklOR1MobHBoYykgKSBsUGFyYW0gPSAoTFBBUkFNKVBUUl9TRUdfVE9fTElOKGxQYXJhbSk7CisJY2FzZSBDQl9BRERTVFJJTkczMjoKKwkJcmV0dXJuIFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kTEJveCwgTEJfQUREU1RSSU5HMzIsIDAsIGxQYXJhbSk7CisKKwljYXNlIENCX0lOU0VSVFNUUklORzE2OgorCQl3UGFyYW0gPSAoSU5UMzIpKElOVDE2KXdQYXJhbTsKKwkJaWYoIENCX0hBU1NUUklOR1MobHBoYykgKSBsUGFyYW0gPSAoTFBBUkFNKVBUUl9TRUdfVE9fTElOKGxQYXJhbSk7CisJY2FzZSBDQl9JTlNFUlRTVFJJTkczMjoKKwkJcmV0dXJuIFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kTEJveCwgTEJfSU5TRVJUU1RSSU5HMzIsIHdQYXJhbSwgbFBhcmFtKTsKKworCWNhc2UgQ0JfREVMRVRFU1RSSU5HMTY6CisJY2FzZSBDQl9ERUxFVEVTVFJJTkczMjoKKwkJcmV0dXJuIFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kTEJveCwgTEJfREVMRVRFU1RSSU5HMzIsIHdQYXJhbSwgMCk7CisKKwljYXNlIENCX1NFTEVDVFNUUklORzE2OgorCQl3UGFyYW0gPSAoSU5UMzIpKElOVDE2KXdQYXJhbTsKKwkJaWYoIENCX0hBU1NUUklOR1MobHBoYykgKSBsUGFyYW0gPSAoTFBBUkFNKVBUUl9TRUdfVE9fTElOKGxQYXJhbSk7CisJY2FzZSBDQl9TRUxFQ1RTVFJJTkczMjoKKwkJcmV0dXJuIENPTUJPX1NlbGVjdFN0cmluZyggbHBoYywgKElOVDMyKXdQYXJhbSwgKExQU1RSKWxQYXJhbSApOworCisJY2FzZSBDQl9GSU5EU1RSSU5HMTY6CisJCXdQYXJhbSA9IChJTlQzMikoSU5UMTYpd1BhcmFtOworCQlpZiggQ0JfSEFTU1RSSU5HUyhscGhjKSApIGxQYXJhbSA9IChMUEFSQU0pUFRSX1NFR19UT19MSU4obFBhcmFtKTsKKwljYXNlIENCX0ZJTkRTVFJJTkczMjoKKwkJcmV0dXJuIFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kTEJveCwgTEJfRklORFNUUklORzMyLCB3UGFyYW0sIGxQYXJhbSk7CisKKwljYXNlIENCX0ZJTkRTVFJJTkdFWEFDVDE2OgorCQl3UGFyYW0gPSAoSU5UMzIpKElOVDE2KXdQYXJhbTsKKwkJaWYoIENCX0hBU1NUUklOR1MobHBoYykgKSBsUGFyYW0gPSAoTFBBUkFNKVBUUl9TRUdfVE9fTElOKGxQYXJhbSk7CisJY2FzZSBDQl9GSU5EU1RSSU5HRVhBQ1QzMjoKKwkJcmV0dXJuIFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kTEJveCwgTEJfRklORFNUUklOR0VYQUNUMzIsIAorCQkJCQkJICAgICAgIHdQYXJhbSwgbFBhcmFtICk7CisJY2FzZSBDQl9TRVRJVEVNSEVJR0hUMTY6CisJCXdQYXJhbSA9IChJTlQzMikoSU5UMTYpd1BhcmFtOworCWNhc2UgQ0JfU0VUSVRFTUhFSUdIVDMyOgorCQlyZXR1cm4gQ09NQk9fU2V0SXRlbUhlaWdodCggbHBoYywgKElOVDMyKXdQYXJhbSwgKElOVDMyKWxQYXJhbSk7CisKKwljYXNlIENCX1JFU0VUQ09OVEVOVDE2OiAKKwljYXNlIENCX1JFU0VUQ09OVEVOVDMyOgorCQlTZW5kTWVzc2FnZTMyQSggbHBoYy0+aFduZExCb3gsIExCX1JFU0VUQ09OVEVOVDMyLCAwLCAwICk7CisJCUNCUGFpbnRUZXh0KCBscGhjLCAwICk7CisJCXJldHVybiBUUlVFOworCisJY2FzZSBDQl9JTklUU1RPUkFHRTMyOgorCQlyZXR1cm4gU2VuZE1lc3NhZ2UzMkEoIGxwaGMtPmhXbmRMQm94LCBMQl9JTklUU1RPUkFHRTMyLCB3UGFyYW0sIGxQYXJhbSk7CisKKwljYXNlIENCX0dFVEhPUklaT05UQUxFWFRFTlQzMjoKKwkJcmV0dXJuIFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kTEJveCwgTEJfR0VUSE9SSVpPTlRBTEVYVEVOVDMyLCAwLCAwKTsKKworCWNhc2UgQ0JfU0VUSE9SSVpPTlRBTEVYVEVOVDMyOgorCQlyZXR1cm4gU2VuZE1lc3NhZ2UzMkEoIGxwaGMtPmhXbmRMQm94LCBMQl9TRVRIT1JJWk9OVEFMRVhURU5UMzIsIHdQYXJhbSwgMCk7CisKKwljYXNlIENCX0dFVFRPUElOREVYMzI6CisJCXJldHVybiBTZW5kTWVzc2FnZTMyQSggbHBoYy0+aFduZExCb3gsIExCX0dFVFRPUElOREVYMzIsIDAsIDApOworCisJY2FzZSBDQl9HRVRMT0NBTEUzMjoKKwkJcmV0dXJuIFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kTEJveCwgTEJfR0VUTE9DQUxFMzIsIDAsIDApOworCisJY2FzZSBDQl9TRVRMT0NBTEUzMjoKKwkJcmV0dXJuIFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kTEJveCwgTEJfU0VUTE9DQUxFMzIsIHdQYXJhbSwgMCk7CisKKwljYXNlIENCX0dFVERST1BQRURXSURUSDMyOgorCQlpZiggbHBoYy0+ZHJvcHBlZFdpZHRoICkKKwkJICAgIHJldHVybiBscGhjLT5kcm9wcGVkV2lkdGg7CisJCXJldHVybiBscGhjLT5SZWN0Q29tYm8ucmlnaHQgLSBscGhjLT5SZWN0Q29tYm8ubGVmdCAtIAorCQkgICAgICAgICAgIChscGhjLT53U3RhdGUgJiBDQkZfRURJVCkgPyBDQml0T2Zmc2V0IDogMDsKKworCWNhc2UgQ0JfU0VURFJPUFBFRFdJRFRIMzI6CisJCWlmKCAoQ0JfR0VUVFlQRShscGhjKSAhPSBDQlNfU0lNUExFKSAmJgorCQkgICAgKElOVDMyKXdQYXJhbSA8IDMyNzY4ICkgbHBoYy0+ZHJvcHBlZFdpZHRoID0gKElOVDMyKXdQYXJhbTsKKwkJcmV0dXJuIENCX0VSUjsKKworCWNhc2UgQ0JfR0VURFJPUFBFRENPTlRST0xSRUNUMTY6CisJCWxQYXJhbSA9IChMUEFSQU0pUFRSX1NFR19UT19MSU4obFBhcmFtKTsKKwkJaWYoIGxQYXJhbSApIAorCQl7CisJCSAgICBSRUNUMzIJcjsKKwkJICAgIENCR2V0RHJvcHBlZENvbnRyb2xSZWN0MzIoIGxwaGMsICZyICk7CisJCSAgICBDT05WX1JFQ1QzMlRPMTYoICZyLCAoTFBSRUNUMTYpbFBhcmFtICk7CisJCX0KKwkJcmV0dXJuIENCX09LQVk7CisKKwljYXNlIENCX0dFVERST1BQRURDT05UUk9MUkVDVDMyOgorCQlpZiggbFBhcmFtICkgQ0JHZXREcm9wcGVkQ29udHJvbFJlY3QzMihscGhjLCAoTFBSRUNUMzIpbFBhcmFtICk7CisJCXJldHVybiBDQl9PS0FZOworCisJY2FzZSBDQl9HRVREUk9QUEVEU1RBVEUxNjoKKwljYXNlIENCX0dFVERST1BQRURTVEFURTMyOgorCQlyZXR1cm4gKGxwaGMtPndTdGF0ZSAmIENCRl9EUk9QUEVEKSA/IFRSVUUgOiBGQUxTRTsKKworCWNhc2UgQ0JfRElSMTY6IAorICAgICAgICAgICAgICAgIGxQYXJhbSA9IChMUEFSQU0pUFRSX1NFR19UT19MSU4obFBhcmFtKTsKKyAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIENCX0RJUjMyOgorCQlyZXR1cm4gQ09NQk9fRGlyZWN0b3J5KCBscGhjLCAoVUlOVDMyKXdQYXJhbSwgCisJCQkJICAgICAgIChMUFNUUilsUGFyYW0sIChtZXNzYWdlID09IENCX0RJUjMyKSk7CisJY2FzZSBDQl9TSE9XRFJPUERPV04xNjoKKwljYXNlIENCX1NIT1dEUk9QRE9XTjMyOgorCQlpZiggQ0JfR0VUVFlQRShscGhjKSAhPSBDQlNfU0lNUExFICkKKwkJICAgIGlmKCB3UGFyYW0gKQorCQkgICAgeworCQkJaWYoICEobHBoYy0+d1N0YXRlICYgQ0JGX0RST1BQRUQpICkKKwkJCSAgICBDQkRyb3BEb3duKCBscGhjICk7CisJCSAgICB9CisJCSAgICBlbHNlIAorCQkJaWYoIGxwaGMtPndTdGF0ZSAmIENCRl9EUk9QUEVEICkgCisJCSAgICAgICAgICAgIENCUm9sbFVwKCBscGhjLCBGQUxTRSwgVFJVRSApOworCQlyZXR1cm4gVFJVRTsKKworCWNhc2UgQ0JfR0VUQ09VTlQxNjogCisJY2FzZSBDQl9HRVRDT1VOVDMyOgorCQlyZXR1cm4gU2VuZE1lc3NhZ2UzMkEoIGxwaGMtPmhXbmRMQm94LCBMQl9HRVRDT1VOVDMyLCAwLCAwKTsKKworCWNhc2UgQ0JfR0VUQ1VSU0VMMTY6IAorCWNhc2UgQ0JfR0VUQ1VSU0VMMzI6CisJCXJldHVybiBTZW5kTWVzc2FnZTMyQSggbHBoYy0+aFduZExCb3gsIExCX0dFVENVUlNFTDMyLCAwLCAwKTsKKworCWNhc2UgQ0JfU0VUQ1VSU0VMMTY6CisJCXdQYXJhbSA9IChJTlQzMikoSU5UMTYpd1BhcmFtOworCWNhc2UgQ0JfU0VUQ1VSU0VMMzI6CisJCXJldHVybiBTZW5kTWVzc2FnZTMyQSggbHBoYy0+aFduZExCb3gsIExCX1NFVENVUlNFTDMyLCB3UGFyYW0sIDApOworCisJY2FzZSBDQl9HRVRMQlRFWFQxNjogCisJCXdQYXJhbSA9IChJTlQzMikoSU5UMTYpd1BhcmFtOworCQlsUGFyYW0gPSAoTFBBUkFNKVBUUl9TRUdfVE9fTElOKGxQYXJhbSk7CisJY2FzZSBDQl9HRVRMQlRFWFQzMjoKKwkJcmV0dXJuIFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kTEJveCwgTEJfR0VUVEVYVDMyLCB3UGFyYW0sIGxQYXJhbSk7CisKKwljYXNlIENCX0dFVExCVEVYVExFTjE2OiAKKwkJd1BhcmFtID0gKElOVDMyKShJTlQxNil3UGFyYW07CisJY2FzZSBDQl9HRVRMQlRFWFRMRU4zMjoKKwkJcmV0dXJuIFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kTEJveCwgTEJfR0VUVEVYVExFTjMyLCB3UGFyYW0sIDApOworCisJY2FzZSBDQl9HRVRJVEVNREFUQTE2OgorCQl3UGFyYW0gPSAoSU5UMzIpKElOVDE2KXdQYXJhbTsKKwljYXNlIENCX0dFVElURU1EQVRBMzI6CisJCXJldHVybiBTZW5kTWVzc2FnZTMyQSggbHBoYy0+aFduZExCb3gsIExCX0dFVElURU1EQVRBMzIsIHdQYXJhbSwgMCk7CisKKwljYXNlIENCX1NFVElURU1EQVRBMTY6CisJCXdQYXJhbSA9IChJTlQzMikoSU5UMTYpd1BhcmFtOworCWNhc2UgQ0JfU0VUSVRFTURBVEEzMjoKKwkJcmV0dXJuIFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kTEJveCwgTEJfU0VUSVRFTURBVEEzMiwgd1BhcmFtLCBsUGFyYW0pOworCisJY2FzZSBDQl9HRVRFRElUU0VMMTY6IAorCQl3UGFyYW0gPSBsUGFyYW0gPSAwOyAgIC8qIGp1c3QgaW4gY2FzZSAqLworCWNhc2UgQ0JfR0VURURJVFNFTDMyOgorCQlpZiggbHBoYy0+d1N0YXRlICYgQ0JGX0VESVQgKQorCQl7CisJCSAgICBJTlQzMglhLCBiOworCisJCSAgICByZXR1cm4gU2VuZE1lc3NhZ2UzMkEoIGxwaGMtPmhXbmRFZGl0LCBFTV9HRVRTRUwzMiwKKwkJCQkJICAgKHdQYXJhbSkgPyB3UGFyYW0gOiAoV1BBUkFNMzIpJmEsCisJCQkJCSAgIChsUGFyYW0pID8gbFBhcmFtIDogKExQQVJBTSkmYiApOworCQl9CisJCXJldHVybiBDQl9FUlI7CisKKwljYXNlIENCX1NFVEVESVRTRUwxNjogCisJY2FzZSBDQl9TRVRFRElUU0VMMzI6CisJCWlmKCBscGhjLT53U3RhdGUgJiBDQkZfRURJVCApIAorCQkgICAgcmV0dXJuIFNlbmRNZXNzYWdlMzJBKCBscGhjLT5oV25kRWRpdCwgRU1fU0VUU0VMMzIsIAorCQkJICAoSU5UMzIpKElOVDE2KUxPV09SRChsUGFyYW0pLCAoSU5UMzIpKElOVDE2KUhJV09SRChsUGFyYW0pICk7CisJCXJldHVybiBDQl9FUlI7CisKKwljYXNlIENCX1NFVEVYVEVOREVEVUkxNjoKKwljYXNlIENCX1NFVEVYVEVOREVEVUkzMjoKKwkJaWYoIENCX0dFVFRZUEUobHBoYykgPT0gQ0JTX1NJTVBMRSApIHJldHVybiBDQl9FUlI7CisKKwkJaWYoIHdQYXJhbSApCisJCSAgICBscGhjLT53U3RhdGUgfD0gQ0JGX0VVSTsKKwkJZWxzZSBscGhjLT53U3RhdGUgJj0gfkNCRl9FVUk7CisJCXJldHVybiBDQl9PS0FZOworCisJY2FzZSBDQl9HRVRFWFRFTkRFRFVJMTY6CisJY2FzZSBDQl9HRVRFWFRFTkRFRFVJMzI6CisJCXJldHVybiAobHBoYy0+d1N0YXRlICYgQ0JGX0VVSSkgPyBUUlVFIDogRkFMU0U7CisKKwljYXNlIChXTV9VU0VSICsgMHgxQik6CisJICAgICAgICBkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ29tYm8gWyUwNHhdOiB1bmRvY3VtZW50ZWQgbXNnIVxuIiwgKEhXTkQxNilod25kICk7CiAgICAgfQotICAgIHJldHVybiBEZWZXaW5kb3dQcm9jMTYoaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENvbWJvTEJveCBjb2RlIHN0YXJ0cyBoZXJlICovCi0KLUhXTkQxNiBDTEJveEdldENvbWJvKEhXTkQxNiBod25kKQotewotICByZXR1cm4gKEhXTkQxNilHZXRXaW5kb3dMb25nMzJBKGh3bmQsMCk7Ci19Ci0KLUxQSEVBRExJU1QgQ0xCb3hHZXRMaXN0SGVhZGVyKEhXTkQxNiBod25kKQotewotICByZXR1cm4gQ29tYm9HZXRMaXN0SGVhZGVyKENMQm94R2V0Q29tYm8oaHduZCkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDQkxDcmVhdGUKLSAqLwotc3RhdGljIExSRVNVTFQgQ0JMQ3JlYXRlKCBIV05EMTYgaHduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkKLXsKLSAgQ1JFQVRFU1RSVUNUMTYgKmNyZWF0ZVN0cnVjdCA9IChDUkVBVEVTVFJVQ1QxNiAqKVBUUl9TRUdfVE9fTElOKGxQYXJhbSk7Ci0gIFNldFdpbmRvd0xvbmczMkEoaHduZCwwLChMT05HKWNyZWF0ZVN0cnVjdC0+bHBDcmVhdGVQYXJhbXMpOwotICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ0JMR2V0RGxnQ29kZQotICovCi1zdGF0aWMgTFJFU1VMVCBDQkxHZXREbGdDb2RlKCBIV05EMTYgaHduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkKLXsKLSAgcmV0dXJuIERMR0NfV0FOVEFSUk9XUyB8IERMR0NfV0FOVENIQVJTOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDQkxLZXlEb3duCi0gKi8KLXN0YXRpYyBMUkVTVUxUIENCTEtleURvd24oIEhXTkQxNiBod25kLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKSAKLXsKLSAgTFBIRUFETElTVCBscGhsID0gQ0xCb3hHZXRMaXN0SGVhZGVyKGh3bmQpOwotICBXT1JEIG5ld0ZvY3VzZWQgPSBscGhsLT5JdGVtRm9jdXNlZDsKLQotICBzd2l0Y2god1BhcmFtKSB7Ci0gIGNhc2UgVktfSE9NRToKLSAgICBuZXdGb2N1c2VkID0gMDsKLSAgICBicmVhazsKLSAgY2FzZSBWS19FTkQ6Ci0gICAgbmV3Rm9jdXNlZCA9IGxwaGwtPkl0ZW1zQ291bnQgLSAxOwotICAgIGJyZWFrOwotICBjYXNlIFZLX1VQOgotICAgIGlmIChuZXdGb2N1c2VkID4gMCkgbmV3Rm9jdXNlZC0tOwotICAgIGJyZWFrOwotICBjYXNlIFZLX0RPV046Ci0gICAgbmV3Rm9jdXNlZCsrOwotICAgIGJyZWFrOwotICBjYXNlIFZLX1BSSU9SOgotICAgIGlmIChuZXdGb2N1c2VkID4gbHBobC0+SXRlbXNWaXNpYmxlKSB7Ci0gICAgICBuZXdGb2N1c2VkIC09IGxwaGwtPkl0ZW1zVmlzaWJsZTsKLSAgICB9IGVsc2UgewotICAgICAgbmV3Rm9jdXNlZCA9IDA7Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIFZLX05FWFQ6Ci0gICAgbmV3Rm9jdXNlZCArPSBscGhsLT5JdGVtc1Zpc2libGU7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIERlZldpbmRvd1Byb2MzMkEoaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwogICB9Ci0KLSAgaWYgKG5ld0ZvY3VzZWQgPj0gbHBobC0+SXRlbXNDb3VudCkKLSAgICBuZXdGb2N1c2VkID0gbHBobC0+SXRlbXNDb3VudCAtIDE7Ci0gIAotICBMaXN0Qm94U2V0Q3VyU2VsKGxwaGwsIG5ld0ZvY3VzZWQpOwotICBMaXN0Qm94U2VuZE5vdGlmaWNhdGlvbihscGhsLCBDQk5fU0VMQ0hBTkdFKTsKLSAgU2VuZE1lc3NhZ2UxNihHZXRQYXJlbnQxNihod25kKSwgV01fQ09NTUFORCxJRF9DTEIsTUFLRUxPTkcoMCxDQk5fU0VMQ0hBTkdFKSk7Ci0gIGxwaGwtPkl0ZW1Gb2N1c2VkID0gbmV3Rm9jdXNlZDsKLSAgTGlzdEJveFNjcm9sbFRvRm9jdXMobHBobCk7Ci0gIFNldFNjcm9sbFBvczMyKGh3bmQsIFNCX1ZFUlQsIGxwaGwtPkZpcnN0VmlzaWJsZSwgVFJVRSk7Ci0gIEludmFsaWRhdGVSZWN0MzIoIGh3bmQsIE5VTEwsIFRSVUUgKTsKLSAgcmV0dXJuIDA7CisgIHJldHVybiBDQl9FUlI7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENCTENoYXIKLSAqLwotc3RhdGljIExSRVNVTFQgQ0JMQ2hhciggSFdORDE2IGh3bmQsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApCi17Ci0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDQkxQYWludAotICovCi1zdGF0aWMgTFJFU1VMVCBDQkxQYWludCggSFdORDE2IGh3bmQsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApCi17Ci0gIExQSEVBRExJU1QgICBscGhsID0gQ0xCb3hHZXRMaXN0SGVhZGVyKGh3bmQpOwotICBMUExJU1RTVFJVQ1QgbHBsczsKLSAgUEFJTlRTVFJVQ1QxNiAgcHM7Ci0gIEhCUlVTSDMyIGhCcnVzaDsKLSAgSEZPTlQzMiBoT2xkRm9udDsKLSAgV05EICogd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7Ci0gIEhXTkQxNiAgY29tYm9od25kID0gQ0xCb3hHZXRDb21ibyhod25kKTsKLSAgSERDMTYgaGRjOwotICBSRUNUMTYgcmVjdDsKLSAgaW50ICAgaSwgdG9wLCBoZWlnaHQ7Ci0KLSAgdG9wID0gMDsKLSAgaWYgKCFscGhsKQotICAgIHJldHVybiAwOwotICBoZGMgPSBCZWdpblBhaW50MTYoIGh3bmQsICZwcyApOwotCi0gIGlmICghbHBobCkgewotICAgIGZwcmludGYoc3RkbmltcCwiQ0JMUGFpbnQ6IENMQm94R2V0TGlzdEhlYWRlciByZXR1cm5lZCBOVUxMIVxuIik7Ci0gIH0KLSAgaWYgKCFJc1dpbmRvd1Zpc2libGUxNihod25kKSB8fCAhbHBobCB8fCAhbHBobC0+YlJlZHJhd0ZsYWcpIHsKLSAgICBFbmRQYWludDE2KGh3bmQsICZwcyk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBoT2xkRm9udCA9IFNlbGVjdE9iamVjdDMyKGhkYywgbHBobC0+aEZvbnQpOwotICAvKiBsaXN0Ym94ZXMgc2hvdWxkIGJlIHdoaXRlICovCi0gIGhCcnVzaCA9IEdldFN0b2NrT2JqZWN0MzIoV0hJVEVfQlJVU0gpOwotCi0gIEdldENsaWVudFJlY3QxNihod25kLCAmcmVjdCk7Ci0gIEZpbGxSZWN0MTYoaGRjLCAmcmVjdCwgaEJydXNoKTsKLSAgQ0JMQ2hlY2tTaXplKGh3bmQpOwotCi0gIGxwbHMgPSBscGhsLT5scEZpcnN0OwotCi0gIGxwaGwtPkl0ZW1zVmlzaWJsZSA9IDA7Ci0gIGZvcihpID0gMDsgaSA8IGxwaGwtPkl0ZW1zQ291bnQ7IGkrKykgewotICAgIGlmIChscGxzID09IE5VTEwpIGJyZWFrOwotCi0gICAgaWYgKGkgPj0gbHBobC0+Rmlyc3RWaXNpYmxlKSB7Ci0gICAgICBoZWlnaHQgPSBscGxzLT5taXMuaXRlbUhlaWdodDsKLSAgICAgIC8qIG11c3QgaGF2ZSBlbm91Z2ggcm9vbSB0byBkcmF3IGVudGlyZSBpdGVtICovCi0gICAgICBpZiAodG9wID4gKHJlY3QuYm90dG9tLWhlaWdodCsxKSkgYnJlYWs7Ci0KLSAgICAgIGxwbHMtPml0ZW1SZWN0LnRvcCAgICA9IHRvcDsKLSAgICAgIGxwbHMtPml0ZW1SZWN0LmJvdHRvbSA9IHRvcCArIGhlaWdodDsKLSAgICAgIGxwbHMtPml0ZW1SZWN0LmxlZnQgICA9IHJlY3QubGVmdDsKLSAgICAgIGxwbHMtPml0ZW1SZWN0LnJpZ2h0ICA9IHJlY3QucmlnaHQ7Ci0KLSAgICAgIGRwcmludGZfbGlzdGJveChzdGRkZWIsImRyYXdpbmcgaXRlbTogJWQgJWQgJWQgJWQgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgcmVjdC5sZWZ0LHRvcCxyZWN0LnJpZ2h0LHRvcCtoZWlnaHQsbHBscy0+aXRlbVN0YXRlKTsKLSAgICAgIGlmIChscGhsLT5Pd25lckRyYXduKSB7Ci0JTGlzdEJveERyYXdJdGVtIChjb21ib2h3bmQsIGxwaGwsIGhkYywgbHBscywgJmxwbHMtPml0ZW1SZWN0LCBPREFfRFJBV0VOVElSRSwgMCk7Ci0JaWYgKGxwbHMtPml0ZW1TdGF0ZSkKLQkgIExpc3RCb3hEcmF3SXRlbSAoY29tYm9od25kLCBscGhsLCBoZGMsIGxwbHMsICZscGxzLT5pdGVtUmVjdCwgT0RBX1NFTEVDVCwgT0RTX1NFTEVDVEVEKTsKLSAgICAgIH0gZWxzZSB7Ci0JTGlzdEJveERyYXdJdGVtIChjb21ib2h3bmQsIGxwaGwsIGhkYywgbHBscywgJmxwbHMtPml0ZW1SZWN0LCBPREFfRFJBV0VOVElSRSwgCi0JCQkgbHBscy0+aXRlbVN0YXRlKTsKLSAgICAgIH0KLSAgICAgIGlmICgobHBobC0+SXRlbUZvY3VzZWQgPT0gaSkgJiYgR2V0Rm9jdXMzMigpID09IGh3bmQpCi0JTGlzdEJveERyYXdJdGVtIChjb21ib2h3bmQsIGxwaGwsIGhkYywgbHBscywgJmxwbHMtPml0ZW1SZWN0LCBPREFfRk9DVVMsIE9EU19GT0NVUyk7Ci0KLSAgICAgIHRvcCArPSBoZWlnaHQ7Ci0gICAgICBscGhsLT5JdGVtc1Zpc2libGUrKzsKLSAgICB9Ci0KLSAgICBscGxzID0gbHBscy0+bHBOZXh0OwotICB9Ci0KLSAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1ZTQ1JPTEwpIAotICAgICAgU2V0U2Nyb2xsUmFuZ2UzMihod25kLCBTQl9WRVJULCAwLCBMaXN0TWF4Rmlyc3RWaXNpYmxlKGxwaGwpLCBUUlVFKTsKLQotICBTZWxlY3RPYmplY3QzMihoZGMsaE9sZEZvbnQpOwotICBFbmRQYWludDE2KCBod25kLCAmcHMgKTsKLSAgcmV0dXJuIDA7Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ0JMS2lsbEZvY3VzCi0gKi8KLXN0YXRpYyBMUkVTVUxUIENCTEtpbGxGb2N1cyggSFdORDE2IGh3bmQsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApCi17Ci0vKiAgU2VuZE1lc3NhZ2UxNihDTEJveEdldENvbWJvKGh3bmQpLENCX1NIT1dEUk9QRE9XTjE2LDAsMCk7Ki8KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENCTEFjdGl2YXRlCi0gKi8KLXN0YXRpYyBMUkVTVUxUIENCTEFjdGl2YXRlKCBIV05EMTYgaHduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkKLXsKLSAgaWYgKHdQYXJhbSA9PSBXQV9JTkFDVElWRSkKLSAgICBTZW5kTWVzc2FnZTE2KENMQm94R2V0Q29tYm8oaHduZCksQ0JfU0hPV0RST1BET1dOMTYsMCwwKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENCTExCdXR0b25Eb3duCi0gKi8KLXN0YXRpYyBMUkVTVUxUIENCTExCdXR0b25Eb3duKCBIV05EMTYgaHduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkKLXsKLSAgTFBIRUFETElTVCBscGhsID0gQ0xCb3hHZXRMaXN0SGVhZGVyKGh3bmQpOwotICBpbnQgICAgICAgIHk7Ci0gIFJFQ1QxNiAgICAgcmVjdHNlbDsKLQotLyogIFNldEZvY3VzMzIoaHduZCk7ICovCi0gIFNldENhcHR1cmUzMihod25kKTsKLQotICBscGhsLT5QcmV2Rm9jdXNlZCA9IGxwaGwtPkl0ZW1Gb2N1c2VkOwotCi0gIHkgPSBMaXN0Qm94RmluZE1vdXNlKGxwaGwsIExPV09SRChsUGFyYW0pLCBISVdPUkQobFBhcmFtKSk7Ci0gIGlmICh5ID09IC0xKQotICAgIHJldHVybiAwOwotCi0gIExpc3RCb3hTZXRDdXJTZWwobHBobCwgeSk7Ci0gIExpc3RCb3hHZXRJdGVtUmVjdChscGhsLCB5LCAmcmVjdHNlbCk7Ci0KLSAgSW52YWxpZGF0ZVJlY3QzMiggaHduZCwgTlVMTCwgVFJVRSApOwotICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ0JMTEJ1dHRvblVwCi0gKi8KLXN0YXRpYyBMUkVTVUxUIENCTExCdXR0b25VcCggSFdORDE2IGh3bmQsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApCi17Ci0gIExQSEVBRExJU1QgbHBobCA9IENMQm94R2V0TGlzdEhlYWRlcihod25kKTsKLQotICBpZiAoR2V0Q2FwdHVyZTMyKCkgPT0gaHduZCkgUmVsZWFzZUNhcHR1cmUoKTsKLQotICBpZighbHBobCkKLSAgICAgewotICAgICAgZnByaW50ZihzdGRuaW1wLCJDQkxMQnV0dG9uVXA6IENMQm94R2V0TGlzdEhlYWRlciByZXR1cm5lZCBOVUxMIVxuIik7Ci0gICAgIH0KLSAgZWxzZSBpZiAobHBobC0+UHJldkZvY3VzZWQgIT0gbHBobC0+SXRlbUZvY3VzZWQpIAotICAgICAgICAgIHsKLSAgICAgIAkJU2VuZE1lc3NhZ2UxNihDTEJveEdldENvbWJvKGh3bmQpLENCX1NFVENVUlNFTDE2LGxwaGwtPkl0ZW1Gb2N1c2VkLDApOwotICAgICAgCQlTZW5kTWVzc2FnZTE2KEdldFBhcmVudDE2KGh3bmQpLCBXTV9DT01NQU5ELElEX0NMQixNQUtFTE9ORygwLENCTl9TRUxDSEFOR0UpKTsKLSAgICAgIAkJTGlzdEJveFNlbmROb3RpZmljYXRpb24obHBobCwgQ0JOX1NFTENIQU5HRSk7Ci0gICAgIAkgIH0KLQotICBTZW5kTWVzc2FnZTE2KENMQm94R2V0Q29tYm8oaHduZCksQ0JfU0hPV0RST1BET1dOMTYsMCwwKTsKLQotICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ0JMTW91c2VNb3ZlCi0gKi8KLXN0YXRpYyBMUkVTVUxUIENCTE1vdXNlTW92ZSggSFdORDE2IGh3bmQsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApCi17Ci0gIExQSEVBRExJU1QgbHBobCA9IENMQm94R2V0TGlzdEhlYWRlcihod25kKTsKLSAgc2hvcnQgeTsKLSAgV09SRCB3UmV0OwotICBSRUNUMTYgcmVjdCwgcmVjdHNlbDsKLQotICB5ID0gU0hJV09SRChsUGFyYW0pOwotICB3UmV0ID0gTGlzdEJveEZpbmRNb3VzZShscGhsLCBMT1dPUkQobFBhcmFtKSwgSElXT1JEKGxQYXJhbSkpOwotICBMaXN0Qm94R2V0SXRlbVJlY3QobHBobCwgd1JldCwgJnJlY3RzZWwpOwotICBHZXRDbGllbnRSZWN0MTYoaHduZCwgJnJlY3QpOwotCi0gIGRwcmludGZfY29tYm8oc3RkZGViLCJDQkxNb3VzZU1vdmU6IGh3bmQgJTA0eCB3cCAleCBscCAlbHggIHkgJWQgIGlmICVkIHdyZXQgJWQgJWQsJWQtJWQsJWRcbiIsCi1od25kLHdQYXJhbSxsUGFyYW0seSxscGhsLT5JdGVtRm9jdXNlZCx3UmV0LHJlY3RzZWwubGVmdCxyZWN0c2VsLnRvcCxyZWN0c2VsLnJpZ2h0LHJlY3RzZWwuYm90dG9tKTsKLSAgCi0gIGlmICgod1BhcmFtICYgTUtfTEJVVFRPTikgIT0gMCkgewotICAgIGlmICh5IDwgQ0JMTU1fRURHRSkgewotICAgICAgaWYgKGxwaGwtPkZpcnN0VmlzaWJsZSA+IDApIHsKLQlscGhsLT5GaXJzdFZpc2libGUtLTsKLQlTZXRTY3JvbGxQb3MzMihod25kLCBTQl9WRVJULCBscGhsLT5GaXJzdFZpc2libGUsIFRSVUUpOwotCUxpc3RCb3hTZXRDdXJTZWwobHBobCwgd1JldCk7Ci0JSW52YWxpZGF0ZVJlY3QzMiggaHduZCwgTlVMTCwgVFJVRSApOwotCXJldHVybiAwOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICh5ID49IChyZWN0LmJvdHRvbS1DQkxNTV9FREdFKSkgewotICAgICAgaWYgKGxwaGwtPkZpcnN0VmlzaWJsZSA8IExpc3RNYXhGaXJzdFZpc2libGUobHBobCkpIHsKLQlscGhsLT5GaXJzdFZpc2libGUrKzsKLQlTZXRTY3JvbGxQb3MzMihod25kLCBTQl9WRVJULCBscGhsLT5GaXJzdFZpc2libGUsIFRSVUUpOwotCUxpc3RCb3hTZXRDdXJTZWwobHBobCwgd1JldCk7Ci0JSW52YWxpZGF0ZVJlY3QzMiggaHduZCwgTlVMTCwgVFJVRSApOwotCXJldHVybiAwOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGlmICgoc2hvcnQpIHdSZXQgPT0gbHBobC0+SXRlbUZvY3VzZWQpIHJldHVybiAwOwotICAgICAgTGlzdEJveFNldEN1clNlbChscGhsLCB3UmV0KTsKLSAgICAgIEludmFsaWRhdGVSZWN0MzIoIGh3bmQsIE5VTEwsIFRSVUUgKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ0JMVlNjcm9sbAotICovCi1zdGF0aWMgTFJFU1VMVCBDQkxWU2Nyb2xsKCBIV05EMTYgaHduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkKLXsKLSAgTFBIRUFETElTVCBscGhsID0gQ0xCb3hHZXRMaXN0SGVhZGVyKGh3bmQpOwotICBpbnQgIHk7Ci0KLSAgeSA9IGxwaGwtPkZpcnN0VmlzaWJsZTsKLQotICBzd2l0Y2god1BhcmFtKSB7Ci0gIGNhc2UgU0JfTElORVVQOgotICAgIGlmIChscGhsLT5GaXJzdFZpc2libGUgPiAwKQotICAgICAgbHBobC0+Rmlyc3RWaXNpYmxlLS07Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBTQl9MSU5FRE9XTjoKLSAgICBscGhsLT5GaXJzdFZpc2libGUrKzsKLSAgICBicmVhazsKLQotICBjYXNlIFNCX1BBR0VVUDoKLSAgICBpZiAobHBobC0+Rmlyc3RWaXNpYmxlID4gbHBobC0+SXRlbXNWaXNpYmxlKSB7Ci0gICAgICBscGhsLT5GaXJzdFZpc2libGUgLT0gbHBobC0+SXRlbXNWaXNpYmxlOwotICAgIH0gZWxzZSB7Ci0gICAgICBscGhsLT5GaXJzdFZpc2libGUgPSAwOwotICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlIFNCX1BBR0VET1dOOgotICAgIGxwaGwtPkZpcnN0VmlzaWJsZSArPSBscGhsLT5JdGVtc1Zpc2libGU7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBTQl9USFVNQlRSQUNLOgotICAgIGxwaGwtPkZpcnN0VmlzaWJsZSA9IExPV09SRChsUGFyYW0pOwotICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKGxwaGwtPkZpcnN0VmlzaWJsZSA+IExpc3RNYXhGaXJzdFZpc2libGUobHBobCkpCi0gICAgbHBobC0+Rmlyc3RWaXNpYmxlID0gTGlzdE1heEZpcnN0VmlzaWJsZShscGhsKTsKLQotICBpZiAoeSAhPSBscGhsLT5GaXJzdFZpc2libGUpIHsKLSAgICBTZXRTY3JvbGxQb3MzMihod25kLCBTQl9WRVJULCBscGhsLT5GaXJzdFZpc2libGUsIFRSVUUpOwotICAgIEludmFsaWRhdGVSZWN0MzIoIGh3bmQsIE5VTEwsIFRSVUUgKTsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgQ0JMQ2hlY2tTaXplCi0gKi8KLXN0YXRpYyBCT09MMzIgQ0JMQ2hlY2tTaXplKEhXTkQxNiBod25kKQotewotICBMUEhFQURDT01CTyAgbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihod25kKTsKLSAgTFBIRUFETElTVCAgIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7Ci0gIExQTElTVFNUUlVDVCBscGxzOwotICBIV05EMTYgICAgICAgICBoV25kTEJveDsKLSAgUkVDVDE2IGNSZWN0LHdSZWN0LGxSZWN0LGx3UmVjdDsKLSAgaW50IHRvdGhlaWdodCxkdzsKLSAgY2hhciBjbGFzc05hbWVbODBdOwotCi0gIEdldENsYXNzTmFtZTMyQShod25kLGNsYXNzTmFtZSw4MCk7Ci0gIGZmbHVzaChzdGRkZWIpOwotICBpZiAoc3RybmNtcChjbGFzc05hbWUsIkNPTUJPQk9YIiw4KSkgcmV0dXJuIEZBTFNFOwotICBpZiAoKGhXbmRMQm94ID0gbHBoYy0+aFduZExCb3gpID09IDApIHJldHVybiBGQUxTRTsKLSAgZHByaW50Zl9jb21ibyhzdGRkZWIsIkNCTENoZWNrU2l6ZSBoZWFkZXJzIGh3ICUwNHggIGxiICUwNHggIG5hbWUgJXNcbiIsCi0JCWh3bmQsaFduZExCb3gsY2xhc3NOYW1lKTsKLQotICBHZXRDbGllbnRSZWN0MTYoaHduZCwmY1JlY3QpOwotICBHZXRXaW5kb3dSZWN0MTYoaHduZCwmd1JlY3QpOwotICBHZXRDbGllbnRSZWN0MTYoaFduZExCb3gsJmxSZWN0KTsKLSAgR2V0V2luZG93UmVjdDE2KGhXbmRMQm94LCZsd1JlY3QpOwotCi0gIGRwcmludGZfY29tYm8oc3RkZGViLCJDQkxDaGVja1NpemU6IGluaXQgY1JlY3QgJWQsJWQtJWQsJWQgIHdSZWN0ICVkLCVkLSVkLCVkXG4iLAotCQljUmVjdC5sZWZ0LGNSZWN0LnRvcCxjUmVjdC5yaWdodCxjUmVjdC5ib3R0b20sCi0JCXdSZWN0LmxlZnQsd1JlY3QudG9wLHdSZWN0LnJpZ2h0LHdSZWN0LmJvdHRvbSk7Ci0gIGRwcmludGZfY29tYm8oc3RkZGViLCIgICAgICAgICAgICAgICAgICAgbFJlY3QgJWQsJWQtJWQsJWQgIGx3UmVjdCAlZCwlZC0lZCwlZFxuIiwKLQkgICAgICBsUmVjdC5sZWZ0LGxSZWN0LnRvcCxsUmVjdC5yaWdodCxsUmVjdC5ib3R0b20sCi0JICAgICAgbHdSZWN0LmxlZnQsbHdSZWN0LnRvcCxsd1JlY3QucmlnaHQsbHdSZWN0LmJvdHRvbSk7Ci0gIGZmbHVzaChzdGRkZWIpOwotICAKLSAgdG90aGVpZ2h0ID0gMDsKLSAgZm9yIChscGxzPWxwaGwtPmxwRmlyc3Q7IGxwbHMgIT0gTlVMTDsgbHBscz1scGxzLT5scE5leHQpCi0gICAgdG90aGVpZ2h0ICs9IGxwbHMtPm1pcy5pdGVtSGVpZ2h0OwotCi0gIGR3ID0gY1JlY3QucmlnaHQtY1JlY3QubGVmdCsyKlNZU01FVFJJQ1NfQ1hCT1JERVIrU1lTTUVUUklDU19DWFZTQ1JPTEw7Ci0gIGR3IC09IGx3UmVjdC5yaWdodC1sd1JlY3QubGVmdDsKLSAgZHcgLT0gU1lTTUVUUklDU19DWFZTQ1JPTEw7Ci0KLSAgLyogVE9ETzogVGhpcyBpc24ndCByZWFsbHkgd2hhdCB3aW5kb3dzIGRvZXMgKi8KLSAgaWYgKChsUmVjdC5ib3R0b20tbFJlY3QudG9wIDwgMypscGhsLT5TdGRJdGVtSGVpZ2h0KSB8fCBkdykgewotICAgIGRwcmludGZfY29tYm8oc3RkZGViLCIgICAgQ2hhbmdpbmc7IHRvdEhlaWdodCAlZCAgU3RkSXRlbUhnaHQgJWQgIGR3ICVkXG4iLAotCQkgIHRvdGhlaWdodCxscGhsLT5TdGRJdGVtSGVpZ2h0LGR3KTsKLSAgICBTZXRXaW5kb3dQb3MzMihoV25kTEJveCwgMCwgbFJlY3QubGVmdCwgbFJlY3QudG9wLCAKLQkJIGx3UmVjdC5yaWdodC1sd1JlY3QubGVmdCtkdywgdG90aGVpZ2h0KzIqU1lTTUVUUklDU19DWUJPUkRFUiwgCi0JCSBTV1BfTk9NT1ZFIHwgU1dQX05PWk9SREVSIHwgU1dQX05PUkVEUkFXIHwgU1dQX05PQUNUSVZBVEUgKTsKLSAgfQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDb21ib0xCb3hXbmRQcm9jCi0gKi8KLUxSRVNVTFQgQ29tYm9MQm94V25kUHJvYyhIV05EMTYgaHduZCwgVUlOVDE2IG1lc3NhZ2UsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKLXsKLSAgICBzd2l0Y2gobWVzc2FnZSkgewkKLSAgICAgY2FzZSBXTV9DUkVBVEU6IHJldHVybiBDQkxDcmVhdGUoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIFdNX0dFVERMR0NPREU6IHJldHVybiBDQkxHZXREbGdDb2RlKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBXTV9LRVlET1dOOiByZXR1cm4gQ0JMS2V5RG93bihod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgIGNhc2UgV01fQ0hBUjogcmV0dXJuIENCTENoYXIoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIFdNX1BBSU5UOiByZXR1cm4gQ0JMUGFpbnQoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIFdNX0tJTExGT0NVUzogcmV0dXJuIENCTEtpbGxGb2N1cyhod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgIGNhc2UgV01fQUNUSVZBVEU6IHJldHVybiBDQkxBY3RpdmF0ZShod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgIGNhc2UgV01fTEJVVFRPTkRPV046IHJldHVybiBDQkxMQnV0dG9uRG93bihod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgIGNhc2UgV01fTEJVVFRPTlVQOiByZXR1cm4gQ0JMTEJ1dHRvblVwKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBXTV9NT1VTRU1PVkU6IHJldHVybiBDQkxNb3VzZU1vdmUoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIFdNX1ZTQ1JPTEw6IHJldHVybiBDQkxWU2Nyb2xsKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBXTV9TSVpFOiByZXR1cm4gQ0JMQ2hlY2tTaXplKGh3bmQpOwotICAgICBjYXNlIFdNX01PVVNFQUNUSVZBVEU6ICAvKiBXZSBkb24ndCB3YW50IHRvIGJlIGFjdGl2YXRlZCAqLwotCXJldHVybiBNQV9OT0FDVElWQVRFOwotICAgIH0KLSAgICByZXR1cm4gRGVmV2luZG93UHJvYzE2KGh3bmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKLX0KZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2VkaXQuYyBiL2NvbnRyb2xzL2VkaXQuYwppbmRleCAzMTg3Njk4Li42ZjZmNWNlIDEwMDY0NAotLS0gYS9jb250cm9scy9lZGl0LmMKKysrIGIvY29udHJvbHMvZWRpdC5jCkBAIC0xMywxMSArMTMsMTMgQEAKICAqCiAgKi8KIAorCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2luLmgiCisjaW5jbHVkZSAiY29tYm8uaCIKICNpbmNsdWRlICJsb2NhbC5oIgogI2luY2x1ZGUgInJlc291cmNlLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKQEAgLTM1LDYgKzM3LDkgQEAKICNkZWZpbmUgR1JPV0xFTkdUSAkJNjQJLyogYnVmZmVycyBncm93IGJ5IHRoaXMgbXVjaCAqLwogI2RlZmluZSBIU0NST0xMX0ZSQUNUSU9OCTMJLyogc2Nyb2xsIHdpbmRvdyBieSAxLzMgd2lkdGggKi8KIAorI2RlZmluZSBFRl9URVhUQ0hBTkdFRAkJMHgwMDAxCisjZGVmaW5lIEVGX0ZPQ1VTRUQJCTB4MDAwMgorCiB0eXBlZGVmIGVudW0KIHsKIAlFTkRfMCA9IDAsCkBAIC04NiwxMyArOTEsMTIgQEAKIAlJTlQzMiBBdmVDaGFyV2lkdGg7CS8qIGF2ZXJhZ2UgY2hhcmFjdGVyIHdpZHRoIGluIHBpeGVscyAqLwogCUlOVDMyIEJ1ZkxpbWl0OwogCUlOVDMyIEJ1ZlNpemU7Ci0JQk9PTDMyIFRleHRDaGFuZ2VkOworCVVJTlQzMiBlU3RhdGU7CQkvKiBFRiBmbGFncyAqLwogCUlOVDMyIFVuZG9JbnNlcnRMZW47CiAJSU5UMzIgVW5kb1BvczsKIAlJTlQzMiBVbmRvQnVmU2l6ZTsKIAlITE9DQUwzMiBoVW5kb0J1ZjsKIAlMUFNUUiBVbmRvVGV4dDsKLQlCT09MMzIgUmVkcmF3OwogCUlOVDMyIFNlbFN0YXJ0OwkJLyogb2Zmc2V0IG9mIHNlbGVjdGlvbiBzdGFydCwgPT0gU2VsRW5kIGlmIG5vIHNlbGVjdGlvbiAqLwogCUlOVDMyIFNlbEVuZDsJCS8qIG9mZnNldCBvZiBzZWxlY3Rpb24gZW5kID09IGN1cnJlbnQgY2FyZXQgcG9zaXRpb24gKi8KIAlJTlQzMiBOdW1UYWJTdG9wczsKQEAgLTEyNiw2ICsxMzAsNyBAQAogI2RlZmluZSBJc1Bhc3N3b3JkKHduZFB0cikgKCh3bmRQdHIpLT5kd1N0eWxlICYgRVNfUEFTU1dPUkQpCiAjZGVmaW5lIElzTG93ZXIod25kUHRyKSAoKHduZFB0ciktPmR3U3R5bGUgJiBFU19MT1dFUkNBU0UpCiAjZGVmaW5lIElzVXBwZXIod25kUHRyKSAoKHduZFB0ciktPmR3U3R5bGUgJiBFU19VUFBFUkNBU0UpCisjZGVmaW5lIElzTm9SZWRyYXcod25kUHRyKSAoKHduZFB0ciktPmZsYWdzICYgV0lOX05PX1JFRFJBVykKIAogI2RlZmluZSBFRElUU1RBVEVQVFIod25kUHRyKSAoKihFRElUU1RBVEUgKiopKCh3bmRQdHIpLT53RXh0cmEpKQogCkBAIC0xNDUsNyArMTUwLDYgQEAKIAkJICJlZGl0OiAzMiBiaXQgOiAiIHN0ciAiOiBod25kPSUwOHgsIHdQYXJhbT0lMDh4LCBsUGFyYW09JTA4eFxuIiwgXAogCQkgKFVJTlQzMilod25kLCAoVUlOVDMyKXdQYXJhbSwgKFVJTlQzMilsUGFyYW0pCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqCURlY2xhcmF0aW9ucwpAQCAtMTY2LDcgKzE3MCw2IEBACiBzdGF0aWMgdm9pZCAgICBFRElUX0dldExpbmVSZWN0KFdORCAqd25kUHRyLCBJTlQzMiBsaW5lLCBJTlQzMiBzY29sLCBJTlQzMiBlY29sLCBMUFJFQ1QzMiByYyk7CiBzdGF0aWMgTFBTVFIgICBFRElUX0dldFBvaW50ZXIoV05EICp3bmRQdHIpOwogc3RhdGljIExQU1RSICAgRURJVF9HZXRQYXNzd29yZFBvaW50ZXIoV05EICp3bmRQdHIpOwotc3RhdGljIEJPT0wzMiAgRURJVF9HZXRSZWRyYXcoV05EICp3bmRQdHIpOwogc3RhdGljIHZvaWQgICAgRURJVF9HZXRTZWwoV05EICp3bmRQdHIsIExQSU5UMzIgcywgTFBJTlQzMiBlKTsKIHN0YXRpYyBJTlQzMiAgIEVESVRfR2V0VGV4dFdpZHRoKFdORCAqd25kUHRyKTsKIHN0YXRpYyBMUFNUUiAgIEVESVRfR2V0VW5kb1BvaW50ZXIoV05EICp3bmRQdHIpOwpAQCAtMTk2LDM5ICsxOTksMzkgQEAKIHN0YXRpYyBJTlQzMiAgIEVESVRfV25kWUZyb21MaW5lKFdORCAqd25kUHRyLCBJTlQzMiBsaW5lKTsKIHN0YXRpYyBJTlQzMiAgIEVESVRfV29yZEJyZWFrUHJvYyhMUFNUUiBzLCBJTlQzMiBpbmRleCwgSU5UMzIgY291bnQsIElOVDMyIGFjdGlvbik7CiAKLXN0YXRpYyBMUkVTVUxUIEVESVRfRU1fQ2FuVW5kbyhXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKK3N0YXRpYyBMUkVTVUxUIEVESVRfRU1fQ2FuVW5kbyhXTkQgKnduZFB0cik7CiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0NoYXJGcm9tUG9zKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwotc3RhdGljIExSRVNVTFQgRURJVF9FTV9FbXB0eVVuZG9CdWZmZXIoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7Ci1zdGF0aWMgTFJFU1VMVCBFRElUX0VNX0ZtdExpbmVzKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwotc3RhdGljIExSRVNVTFQgRURJVF9FTV9HZXRGaXJzdFZpc2libGVMaW5lKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwotc3RhdGljIExSRVNVTFQgRURJVF9FTV9HZXRIYW5kbGUoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7Ci1zdGF0aWMgTFJFU1VMVCBFRElUX0VNX0dldEhhbmRsZTE2KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworc3RhdGljIExSRVNVTFQgRURJVF9FTV9FbXB0eVVuZG9CdWZmZXIoV05EICp3bmRQdHIpOworc3RhdGljIExSRVNVTFQgRURJVF9FTV9GbXRMaW5lcyhXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtKTsKK3N0YXRpYyBMUkVTVUxUIEVESVRfRU1fR2V0Rmlyc3RWaXNpYmxlTGluZShXTkQgKnduZFB0cik7CitzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0dldEhhbmRsZShXTkQgKnduZFB0cik7CitzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0dldEhhbmRsZTE2KFdORCAqd25kUHRyKTsKIHN0YXRpYyBMUkVTVUxUIEVESVRfRU1fR2V0TGltaXRUZXh0KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwogc3RhdGljIExSRVNVTFQgRURJVF9FTV9HZXRMaW5lKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwotc3RhdGljIExSRVNVTFQgRURJVF9FTV9HZXRMaW5lQ291bnQoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CitzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0dldExpbmVDb3VudChXTkQgKnduZFB0cik7CiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0dldE1hcmdpbnMoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7Ci1zdGF0aWMgTFJFU1VMVCBFRElUX0VNX0dldE1vZGlmeShXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKLXN0YXRpYyBMUkVTVUxUIEVESVRfRU1fR2V0UGFzc3dvcmRDaGFyKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworc3RhdGljIExSRVNVTFQgRURJVF9FTV9HZXRNb2RpZnkoV05EICp3bmRQdHIpOworc3RhdGljIExSRVNVTFQgRURJVF9FTV9HZXRQYXNzd29yZENoYXIoV05EICp3bmRQdHIpOwogc3RhdGljIExSRVNVTFQgRURJVF9FTV9HZXRSZWN0KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwogc3RhdGljIExSRVNVTFQgRURJVF9FTV9HZXRSZWN0MTYoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0dldFNlbChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKLXN0YXRpYyBMUkVTVUxUIEVESVRfRU1fR2V0VGh1bWIoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CitzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0dldFRodW1iKFdORCAqd25kUHRyKTsKIHN0YXRpYyBMUkVTVUxUIEVESVRfRU1fR2V0V29yZEJyZWFrUHJvYyhXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKLXN0YXRpYyBMUkVTVUxUIEVESVRfRU1fTGluZUZyb21DaGFyKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwotc3RhdGljIExSRVNVTFQgRURJVF9FTV9MaW5lSW5kZXgoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7Ci1zdGF0aWMgTFJFU1VMVCBFRElUX0VNX0xpbmVMZW5ndGgoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CitzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0xpbmVGcm9tQ2hhcihXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtKTsKK3N0YXRpYyBMUkVTVUxUIEVESVRfRU1fTGluZUluZGV4KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0pOworc3RhdGljIExSRVNVTFQgRURJVF9FTV9MaW5lTGVuZ3RoKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0pOwogc3RhdGljIExSRVNVTFQgRURJVF9FTV9MaW5lU2Nyb2xsKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwotc3RhdGljIExSRVNVTFQgRURJVF9FTV9Qb3NGcm9tQ2hhcihXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKK3N0YXRpYyBMUkVTVUxUIEVESVRfRU1fUG9zRnJvbUNoYXIoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSk7CiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX1JlcGxhY2VTZWwoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7Ci1zdGF0aWMgTFJFU1VMVCBFRElUX0VNX1Njcm9sbChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKLXN0YXRpYyBMUkVTVUxUIEVESVRfRU1fU2Nyb2xsQ2FyZXQoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7Ci1zdGF0aWMgTFJFU1VMVCBFRElUX0VNX1NldEhhbmRsZShXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKLXN0YXRpYyBMUkVTVUxUIEVESVRfRU1fU2V0SGFuZGxlMTYoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CitzdGF0aWMgTFJFU1VMVCBFRElUX0VNX1Njcm9sbChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtKTsKK3N0YXRpYyBMUkVTVUxUIEVESVRfRU1fU2Nyb2xsQ2FyZXQoV05EICp3bmRQdHIpOworc3RhdGljIExSRVNVTFQgRURJVF9FTV9TZXRIYW5kbGUoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSk7CitzdGF0aWMgTFJFU1VMVCBFRElUX0VNX1NldEhhbmRsZTE2KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0pOwogc3RhdGljIExSRVNVTFQgRURJVF9FTV9TZXRMaW1pdFRleHQoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX1NldE1hcmdpbnMoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7Ci1zdGF0aWMgTFJFU1VMVCBFRElUX0VNX1NldE1vZGlmeShXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKLXN0YXRpYyBMUkVTVUxUIEVESVRfRU1fU2V0UGFzc3dvcmRDaGFyKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwotc3RhdGljIExSRVNVTFQgRURJVF9FTV9TZXRSZWFkT25seShXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKK3N0YXRpYyBMUkVTVUxUIEVESVRfRU1fU2V0TW9kaWZ5KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0pOworc3RhdGljIExSRVNVTFQgRURJVF9FTV9TZXRQYXNzd29yZENoYXIoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSk7CitzdGF0aWMgTFJFU1VMVCBFRElUX0VNX1NldFJlYWRPbmx5KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0pOwogc3RhdGljIExSRVNVTFQgRURJVF9FTV9TZXRSZWN0KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwogc3RhdGljIExSRVNVTFQgRURJVF9FTV9TZXRSZWN0TlAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX1NldFNlbChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKQEAgLTIzNiwzNiArMjM5LDM2IEBACiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX1NldFRhYlN0b3BzKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwogc3RhdGljIExSRVNVTFQgRURJVF9FTV9TZXRUYWJTdG9wczE2KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwogc3RhdGljIExSRVNVTFQgRURJVF9FTV9TZXRXb3JkQnJlYWtQcm9jKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwotc3RhdGljIExSRVNVTFQgRURJVF9FTV9VbmRvKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworc3RhdGljIExSRVNVTFQgRURJVF9FTV9VbmRvKFdORCAqd25kUHRyKTsKIAogc3RhdGljIExSRVNVTFQgRURJVF9XTV9DaGFyKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwotc3RhdGljIExSRVNVTFQgRURJVF9XTV9DbGVhcihXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKK3N0YXRpYyBMUkVTVUxUIEVESVRfV01fQ2xlYXIoV05EICp3bmRQdHIpOwogc3RhdGljIExSRVNVTFQgRURJVF9XTV9Db21tYW5kKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwogc3RhdGljIExSRVNVTFQgRURJVF9XTV9Db250ZXh0TWVudShXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKLXN0YXRpYyBMUkVTVUxUIEVESVRfV01fQ29weShXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKLXN0YXRpYyBMUkVTVUxUIEVESVRfV01fQ3V0KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworc3RhdGljIExSRVNVTFQgRURJVF9XTV9Db3B5KFdORCAqd25kUHRyKTsKK3N0YXRpYyBMUkVTVUxUIEVESVRfV01fQ3V0KFdORCAqd25kUHRyKTsKIHN0YXRpYyBMUkVTVUxUIEVESVRfV01fQ3JlYXRlKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwotc3RhdGljIExSRVNVTFQgRURJVF9XTV9EZXN0cm95KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwotc3RhdGljIExSRVNVTFQgRURJVF9XTV9FbmFibGUoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7Ci1zdGF0aWMgTFJFU1VMVCBFRElUX1dNX0VyYXNlQmtHbmQoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7Ci1zdGF0aWMgTFJFU1VMVCBFRElUX1dNX0dldERsZ0NvZGUoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7Ci1zdGF0aWMgTFJFU1VMVCBFRElUX1dNX0dldEZvbnQoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CitzdGF0aWMgTFJFU1VMVCBFRElUX1dNX0Rlc3Ryb3koV05EICp3bmRQdHIpOworc3RhdGljIExSRVNVTFQgRURJVF9XTV9FbmFibGUoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSk7CitzdGF0aWMgTFJFU1VMVCBFRElUX1dNX0VyYXNlQmtHbmQoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSk7CitzdGF0aWMgTFJFU1VMVCBFRElUX1dNX0dldERsZ0NvZGUoV05EICp3bmRQdHIpOworc3RhdGljIExSRVNVTFQgRURJVF9XTV9HZXRGb250KFdORCAqd25kUHRyKTsKIHN0YXRpYyBMUkVTVUxUIEVESVRfV01fR2V0VGV4dChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKLXN0YXRpYyBMUkVTVUxUIEVESVRfV01fR2V0VGV4dExlbmd0aChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKK3N0YXRpYyBMUkVTVUxUIEVESVRfV01fR2V0VGV4dExlbmd0aChXTkQgKnduZFB0cik7CiBzdGF0aWMgTFJFU1VMVCBFRElUX1dNX0hTY3JvbGwoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CiBzdGF0aWMgTFJFU1VMVCBFRElUX1dNX0luaXRNZW51UG9wdXAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CiBzdGF0aWMgTFJFU1VMVCBFRElUX1dNX0tleURvd24oV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7Ci1zdGF0aWMgTFJFU1VMVCBFRElUX1dNX0tpbGxGb2N1cyhXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKK3N0YXRpYyBMUkVTVUxUIEVESVRfV01fS2lsbEZvY3VzKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0pOwogc3RhdGljIExSRVNVTFQgRURJVF9XTV9MQnV0dG9uRGJsQ2xrKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwogc3RhdGljIExSRVNVTFQgRURJVF9XTV9MQnV0dG9uRG93bihXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKIHN0YXRpYyBMUkVTVUxUIEVESVRfV01fTEJ1dHRvblVwKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwogc3RhdGljIExSRVNVTFQgRURJVF9XTV9Nb3VzZU1vdmUoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7Ci1zdGF0aWMgTFJFU1VMVCBFRElUX1dNX1BhaW50KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwotc3RhdGljIExSRVNVTFQgRURJVF9XTV9QYXN0ZShXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKK3N0YXRpYyBMUkVTVUxUIEVESVRfV01fUGFpbnQoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSk7CitzdGF0aWMgTFJFU1VMVCBFRElUX1dNX1Bhc3RlKFdORCAqd25kUHRyKTsKIHN0YXRpYyBMUkVTVUxUIEVESVRfV01fU2V0Q3Vyc29yKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwotc3RhdGljIExSRVNVTFQgRURJVF9XTV9TZXRGb2N1cyhXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKK3N0YXRpYyBMUkVTVUxUIEVESVRfV01fU2V0Rm9jdXMoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSk7CiBzdGF0aWMgTFJFU1VMVCBFRElUX1dNX1NldEZvbnQoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7Ci1zdGF0aWMgTFJFU1VMVCBFRElUX1dNX1NldFJlZHJhdyhXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKK3N0YXRpYyBMUkVTVUxUIEVESVRfV01fU2V0UmVkcmF3KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0pOwogc3RhdGljIExSRVNVTFQgRURJVF9XTV9TZXRUZXh0KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwogc3RhdGljIExSRVNVTFQgRURJVF9XTV9TaXplKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwogc3RhdGljIExSRVNVTFQgRURJVF9XTV9TeXNLZXlEb3duKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwpAQCAtMzY4LDcgKzM3MSw3IEBACiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgRU1fU0NST0xMMzI6CiAJCURQUklOVEZfRURJVF9NU0czMigiRU1fU0NST0xMIik7Ci0JCWxSZXN1bHQgPSBFRElUX0VNX1Njcm9sbCh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwkJbFJlc3VsdCA9IEVESVRfRU1fU2Nyb2xsKHduZFB0ciwgd1BhcmFtKTsKICAJCWJyZWFrOwogCiAJY2FzZSBFTV9MSU5FU0NST0xMMTY6CkBAIC0zODYsNyArMzg5LDcgQEAKIAkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBFTV9TQ1JPTExDQVJFVDMyOgogCQlEUFJJTlRGX0VESVRfTVNHMzIoIkVNX1NDUk9MTENBUkVUIik7Ci0JCWxSZXN1bHQgPSBFRElUX0VNX1Njcm9sbENhcmV0KHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlsUmVzdWx0ID0gRURJVF9FTV9TY3JvbGxDYXJldCh3bmRQdHIpOwogCQlicmVhazsKIAogCWNhc2UgRU1fR0VUTU9ESUZZMTY6CkBAIC0zOTQsNyArMzk3LDcgQEAKIAkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBFTV9HRVRNT0RJRlkzMjoKIAkJRFBSSU5URl9FRElUX01TRzMyKCJFTV9HRVRNT0RJRlkiKTsKLQkJbFJlc3VsdCA9IEVESVRfRU1fR2V0TW9kaWZ5KHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlsUmVzdWx0ID0gRURJVF9FTV9HZXRNb2RpZnkod25kUHRyKTsKIAkJYnJlYWs7CiAKIAljYXNlIEVNX1NFVE1PRElGWTE2OgpAQCAtNDAyLDcgKzQwNSw3IEBACiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgRU1fU0VUTU9ESUZZMzI6CiAJCURQUklOVEZfRURJVF9NU0czMigiRU1fU0VUTU9ESUZZIik7Ci0JCWxSZXN1bHQgPSBFRElUX0VNX1NldE1vZGlmeSh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwkJbFJlc3VsdCA9IEVESVRfRU1fU2V0TW9kaWZ5KHduZFB0ciwgd1BhcmFtKTsKIAkJYnJlYWs7CiAKIAljYXNlIEVNX0dFVExJTkVDT1VOVDE2OgpAQCAtNDEwLDcgKzQxMyw3IEBACiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgRU1fR0VUTElORUNPVU5UMzI6CiAJCURQUklOVEZfRURJVF9NU0czMigiRU1fR0VUTElORUNPVU5UIik7Ci0JCWxSZXN1bHQgPSBFRElUX0VNX0dldExpbmVDb3VudCh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwkJbFJlc3VsdCA9IEVESVRfRU1fR2V0TGluZUNvdW50KHduZFB0cik7CiAJCWJyZWFrOwogCiAJY2FzZSBFTV9MSU5FSU5ERVgxNjoKQEAgLTQxOCwyNSArNDIxLDI1IEBACiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgRU1fTElORUlOREVYMzI6CiAJCURQUklOVEZfRURJVF9NU0czMigiRU1fTElORUlOREVYIik7Ci0JCWxSZXN1bHQgPSBFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwkJbFJlc3VsdCA9IEVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgd1BhcmFtKTsKIAkJYnJlYWs7CiAKIAljYXNlIEVNX1NFVEhBTkRMRTE2OgogCQlEUFJJTlRGX0VESVRfTVNHMTYoIkVNX1NFVEhBTkRMRSIpOwotCQlsUmVzdWx0ID0gRURJVF9FTV9TZXRIYW5kbGUxNih3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwkJbFJlc3VsdCA9IEVESVRfRU1fU2V0SGFuZGxlMTYod25kUHRyLCB3UGFyYW0pOwogCQlicmVhazsKIAljYXNlIEVNX1NFVEhBTkRMRTMyOgogCQlEUFJJTlRGX0VESVRfTVNHMzIoIkVNX1NFVEhBTkRMRSIpOwotCQlsUmVzdWx0ID0gRURJVF9FTV9TZXRIYW5kbGUod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJCWxSZXN1bHQgPSBFRElUX0VNX1NldEhhbmRsZSh3bmRQdHIsIHdQYXJhbSk7CiAJCWJyZWFrOwogCiAJY2FzZSBFTV9HRVRIQU5ETEUxNjoKIAkJRFBSSU5URl9FRElUX01TRzE2KCJFTV9HRVRIQU5ETEUiKTsKLQkJbFJlc3VsdCA9IEVESVRfRU1fR2V0SGFuZGxlMTYod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJCWxSZXN1bHQgPSBFRElUX0VNX0dldEhhbmRsZTE2KHduZFB0cik7CiAJCWJyZWFrOwogCWNhc2UgRU1fR0VUSEFORExFMzI6CiAJCURQUklOVEZfRURJVF9NU0czMigiRU1fR0VUSEFORExFIik7Ci0JCWxSZXN1bHQgPSBFRElUX0VNX0dldEhhbmRsZSh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwkJbFJlc3VsdCA9IEVESVRfRU1fR2V0SGFuZGxlKHduZFB0cik7CiAJCWJyZWFrOwogCiAJY2FzZSBFTV9HRVRUSFVNQjE2OgpAQCAtNDQ0LDcgKzQ0Nyw3IEBACiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgRU1fR0VUVEhVTUIzMjoKIAkJRFBSSU5URl9FRElUX01TRzMyKCJFTV9HRVRUSFVNQiIpOwotCQlsUmVzdWx0ID0gRURJVF9FTV9HZXRUaHVtYih3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwkJbFJlc3VsdCA9IEVESVRfRU1fR2V0VGh1bWIod25kUHRyKTsKIAkJYnJlYWs7CiAKIAkvKiBtZXNzYWdlcyAweDAwYmYgYW5kIDB4MDBjMCBtaXNzaW5nIGZyb20gc3BlY3MgKi8KQEAgLTQ3MCw3ICs0NzMsNyBAQAogCQkvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIEVNX0xJTkVMRU5HVEgzMjoKIAkJRFBSSU5URl9FRElUX01TRzMyKCJFTV9MSU5FTEVOR1RIIik7Ci0JCWxSZXN1bHQgPSBFRElUX0VNX0xpbmVMZW5ndGgod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJCWxSZXN1bHQgPSBFRElUX0VNX0xpbmVMZW5ndGgod25kUHRyLCB3UGFyYW0pOwogCQlicmVhazsKIAogCWNhc2UgRU1fUkVQTEFDRVNFTDE2OgpAQCAtNTE0LDcgKzUxNyw3IEBACiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgRU1fQ0FOVU5ETzMyOgogCQlEUFJJTlRGX0VESVRfTVNHMzIoIkVNX0NBTlVORE8iKTsKLQkJbFJlc3VsdCA9IEVESVRfRU1fQ2FuVW5kbyh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwkJbFJlc3VsdCA9IEVESVRfRU1fQ2FuVW5kbyh3bmRQdHIpOwogCQlicmVhazsKIAogCWNhc2UgRU1fVU5ETzE2OgpAQCAtNTI0LDcgKzUyNyw3IEBACiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgV01fVU5ETzoKIAkJRFBSSU5URl9FRElUX01TRzMyKCJFTV9VTkRPIC8gV01fVU5ETyIpOwotCQlsUmVzdWx0ID0gRURJVF9FTV9VbmRvKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlsUmVzdWx0ID0gRURJVF9FTV9VbmRvKHduZFB0cik7CiAJCWJyZWFrOwogCiAJY2FzZSBFTV9GTVRMSU5FUzE2OgpAQCAtNTMyLDcgKzUzNSw3IEBACiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgRU1fRk1UTElORVMzMjoKIAkJRFBSSU5URl9FRElUX01TRzMyKCJFTV9GTVRMSU5FUyIpOwotCQlsUmVzdWx0ID0gRURJVF9FTV9GbXRMaW5lcyh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwkJbFJlc3VsdCA9IEVESVRfRU1fRm10TGluZXMod25kUHRyLCB3UGFyYW0pOwogCQlicmVhazsKIAogCWNhc2UgRU1fTElORUZST01DSEFSMTY6CkBAIC01NDAsNyArNTQzLDcgQEAKIAkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBFTV9MSU5FRlJPTUNIQVIzMjoKIAkJRFBSSU5URl9FRElUX01TRzMyKCJFTV9MSU5FRlJPTUNIQVIiKTsKLQkJbFJlc3VsdCA9IEVESVRfRU1fTGluZUZyb21DaGFyKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlsUmVzdWx0ID0gRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCB3UGFyYW0pOwogCQlicmVhazsKIAogCS8qIG1lc3NhZ2UgMHgwMGNhIG1pc3NpbmcgZnJvbSBzcGVjcyAqLwpAQCAtNTY3LDcgKzU3MCw3IEBACiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgRU1fU0VUUEFTU1dPUkRDSEFSMzI6CiAJCURQUklOVEZfRURJVF9NU0czMigiRU1fU0VUUEFTU1dPUkRDSEFSIik7Ci0JCWxSZXN1bHQgPSBFRElUX0VNX1NldFBhc3N3b3JkQ2hhcih3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwkJbFJlc3VsdCA9IEVESVRfRU1fU2V0UGFzc3dvcmRDaGFyKHduZFB0ciwgd1BhcmFtKTsKIAkJYnJlYWs7CiAKIAljYXNlIEVNX0VNUFRZVU5ET0JVRkZFUjE2OgpAQCAtNTc1LDcgKzU3OCw3IEBACiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgRU1fRU1QVFlVTkRPQlVGRkVSMzI6CiAJCURQUklOVEZfRURJVF9NU0czMigiRU1fRU1QVFlVTkRPQlVGRkVSIik7Ci0JCWxSZXN1bHQgPSBFRElUX0VNX0VtcHR5VW5kb0J1ZmZlcih3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwkJbFJlc3VsdCA9IEVESVRfRU1fRW1wdHlVbmRvQnVmZmVyKHduZFB0cik7CiAJCWJyZWFrOwogCiAJY2FzZSBFTV9HRVRGSVJTVFZJU0lCTEVMSU5FMTY6CkBAIC01ODMsNyArNTg2LDcgQEAKIAkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBFTV9HRVRGSVJTVFZJU0lCTEVMSU5FMzI6CiAJCURQUklOVEZfRURJVF9NU0czMigiRU1fR0VURklSU1RWSVNJQkxFTElORSIpOwotCQlsUmVzdWx0ID0gRURJVF9FTV9HZXRGaXJzdFZpc2libGVMaW5lKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlsUmVzdWx0ID0gRURJVF9FTV9HZXRGaXJzdFZpc2libGVMaW5lKHduZFB0cik7CiAJCWJyZWFrOwogCiAJY2FzZSBFTV9TRVRSRUFET05MWTE2OgpAQCAtNTkxLDcgKzU5NCw3IEBACiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgRU1fU0VUUkVBRE9OTFkzMjoKIAkJRFBSSU5URl9FRElUX01TRzMyKCJFTV9TRVRSRUFET05MWSIpOwotCQlsUmVzdWx0ID0gRURJVF9FTV9TZXRSZWFkT25seSh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwkJbFJlc3VsdCA9IEVESVRfRU1fU2V0UmVhZE9ubHkod25kUHRyLCB3UGFyYW0pOwogIAkJYnJlYWs7CiAKIAljYXNlIEVNX1NFVFdPUkRCUkVBS1BST0MxNjoKQEAgLTYxNSw3ICs2MTgsNyBAQAogCQkvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIEVNX0dFVFBBU1NXT1JEQ0hBUjMyOgogCQlEUFJJTlRGX0VESVRfTVNHMzIoIkVNX0dFVFBBU1NXT1JEQ0hBUiIpOwotCQlsUmVzdWx0ID0gRURJVF9FTV9HZXRQYXNzd29yZENoYXIod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJCWxSZXN1bHQgPSBFRElUX0VNX0dldFBhc3N3b3JkQ2hhcih3bmRQdHIpOwogCQlicmVhazsKIAogCS8qIFRoZSBmb2xsb3dpbmcgRU1feHh4IGFyZSBuZXcgdG8gd2luOTUgYW5kIGRvbid0IGV4aXN0IGZvciAxNiBiaXQgKi8KQEAgLTYzNyw3ICs2NDAsNyBAQAogCiAJY2FzZSBFTV9QT1NGUk9NQ0hBUjMyOgogCQlEUFJJTlRGX0VESVRfTVNHMTYoIkVNX1BPU0ZST01DSEFSIik7Ci0JCWxSZXN1bHQgPSBFRElUX0VNX1Bvc0Zyb21DaGFyKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlsUmVzdWx0ID0gRURJVF9FTV9Qb3NGcm9tQ2hhcih3bmRQdHIsIHdQYXJhbSk7CiAJCWJyZWFrOwogCiAJY2FzZSBFTV9DSEFSRlJPTVBPUzMyOgpAQCAtNjQ3LDcgKzY1MCw3IEBACiAKIAljYXNlIFdNX0dFVERMR0NPREU6CiAJCURQUklOVEZfRURJVF9NU0czMigiV01fR0VURExHQ09ERSIpOwotCQlsUmVzdWx0ID0gRURJVF9XTV9HZXREbGdDb2RlKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlsUmVzdWx0ID0gRURJVF9XTV9HZXREbGdDb2RlKHduZFB0cik7CiAJCWJyZWFrOwogCiAJY2FzZSBXTV9DSEFSOgpAQCAtNjU3LDcgKzY2MCw3IEBACiAKIAljYXNlIFdNX0NMRUFSOgogCQlEUFJJTlRGX0VESVRfTVNHMzIoIldNX0NMRUFSIik7Ci0JCWxSZXN1bHQgPSBFRElUX1dNX0NsZWFyKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlsUmVzdWx0ID0gRURJVF9XTV9DbGVhcih3bmRQdHIpOwogCQlicmVhazsKIAogCWNhc2UgV01fQ09NTUFORDoKQEAgLTY3Miw3ICs2NzUsNyBAQAogCiAJY2FzZSBXTV9DT1BZOgogCQlEUFJJTlRGX0VESVRfTVNHMzIoIldNX0NPUFkiKTsKLQkJbFJlc3VsdCA9IEVESVRfV01fQ29weSh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwkJbFJlc3VsdCA9IEVESVRfV01fQ29weSh3bmRQdHIpOwogCQlicmVhazsKIAogCWNhc2UgV01fQ1JFQVRFOgpAQCAtNjgyLDI3ICs2ODUsMjcgQEAKIAogCWNhc2UgV01fQ1VUOgogCQlEUFJJTlRGX0VESVRfTVNHMzIoIldNX0NVVCIpOwotCQlsUmVzdWx0ID0gRURJVF9XTV9DdXQod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJCWxSZXN1bHQgPSBFRElUX1dNX0N1dCh3bmRQdHIpOwogCQlicmVhazsKIAogCWNhc2UgV01fREVTVFJPWToKIAkJRFBSSU5URl9FRElUX01TRzMyKCJXTV9ERVNUUk9ZIik7Ci0JCWxSZXN1bHQgPSBFRElUX1dNX0Rlc3Ryb3kod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJCWxSZXN1bHQgPSBFRElUX1dNX0Rlc3Ryb3kod25kUHRyKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdNX0VOQUJMRToKIAkJRFBSSU5URl9FRElUX01TRzMyKCJXTV9FTkFCTEUiKTsKLQkJbFJlc3VsdCA9IEVESVRfV01fRW5hYmxlKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlsUmVzdWx0ID0gRURJVF9XTV9FbmFibGUod25kUHRyLCB3UGFyYW0pOwogCQlicmVhazsKIAogCWNhc2UgV01fRVJBU0VCS0dORDoKIAkJRFBSSU5URl9FRElUX01TRzMyKCJXTV9FUkFTRUJLR05EIik7Ci0JCWxSZXN1bHQgPSBFRElUX1dNX0VyYXNlQmtHbmQod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJCWxSZXN1bHQgPSBFRElUX1dNX0VyYXNlQmtHbmQod25kUHRyLCB3UGFyYW0pOwogCQlicmVhazsKIAogCWNhc2UgV01fR0VURk9OVDoKIAkJRFBSSU5URl9FRElUX01TRzMyKCJXTV9HRVRGT05UIik7Ci0JCWxSZXN1bHQgPSBFRElUX1dNX0dldEZvbnQod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJCWxSZXN1bHQgPSBFRElUX1dNX0dldEZvbnQod25kUHRyKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdNX0dFVFRFWFQ6CkBAIC03MTIsNyArNzE1LDcgQEAKIAogCWNhc2UgV01fR0VUVEVYVExFTkdUSDoKIAkJRFBSSU5URl9FRElUX01TRzMyKCJXTV9HRVRURVhUTEVOR1RIIik7Ci0JCWxSZXN1bHQgPSBFRElUX1dNX0dldFRleHRMZW5ndGgod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJCWxSZXN1bHQgPSBFRElUX1dNX0dldFRleHRMZW5ndGgod25kUHRyKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdNX0hTQ1JPTEw6CkBAIC03MzIsNyArNzM1LDcgQEAKIAogCWNhc2UgV01fS0lMTEZPQ1VTOgogCQlEUFJJTlRGX0VESVRfTVNHMzIoIldNX0tJTExGT0NVUyIpOwotCQlsUmVzdWx0ID0gRURJVF9XTV9LaWxsRm9jdXMod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJCWxSZXN1bHQgPSBFRElUX1dNX0tpbGxGb2N1cyh3bmRQdHIsIHdQYXJhbSk7CiAJCWJyZWFrOwogCiAJY2FzZSBXTV9MQlVUVE9OREJMQ0xLOgpAQCAtNzU5LDEyICs3NjIsMTIgQEAKIAogCWNhc2UgV01fUEFJTlQ6CiAJCURQUklOVEZfRURJVF9NU0czMigiV01fUEFJTlQiKTsKLQkJbFJlc3VsdCA9IEVESVRfV01fUGFpbnQod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJCWxSZXN1bHQgPSBFRElUX1dNX1BhaW50KHduZFB0ciwgd1BhcmFtKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdNX1BBU1RFOgogCQlEUFJJTlRGX0VESVRfTVNHMzIoIldNX1BBU1RFIik7Ci0JCWxSZXN1bHQgPSBFRElUX1dNX1Bhc3RlKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlsUmVzdWx0ID0gRURJVF9XTV9QYXN0ZSh3bmRQdHIpOwogCQlicmVhazsKIAogCWNhc2UgV01fU0VUQ1VSU09SOgpAQCAtNzc2LDcgKzc3OSw3IEBACiAKIAljYXNlIFdNX1NFVEZPQ1VTOgogCQlEUFJJTlRGX0VESVRfTVNHMzIoIldNX1NFVEZPQ1VTIik7Ci0JCWxSZXN1bHQgPSBFRElUX1dNX1NldEZvY3VzKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlsUmVzdWx0ID0gRURJVF9XTV9TZXRGb2N1cyh3bmRQdHIsIHdQYXJhbSk7CiAJCWJyZWFrOwogCiAJY2FzZSBXTV9TRVRGT05UOgpAQCAtNzg2LDcgKzc4OSw3IEBACiAKIAljYXNlIFdNX1NFVFJFRFJBVzoKIAkJRFBSSU5URl9FRElUX01TRzMyKCJXTV9TRVRSRURSQVciKTsKLQkJbFJlc3VsdCA9IEVESVRfV01fU2V0UmVkcmF3KHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlsUmVzdWx0ID0gRURJVF9XTV9TZXRSZWRyYXcod25kUHRyLCB3UGFyYW0pOwogCQlicmVhazsKIAogCWNhc2UgV01fU0VUVEVYVDoKQEAgLTg0NywxNCArODUwLDE0IEBACiAJTElORV9FTkQgZW5kaW5nOwogCiAJaGRjID0gR2V0REMzMih3bmRQdHItPmh3bmRTZWxmKTsKLQloRm9udCA9IChIRk9OVDMyKUVESVRfV01fR2V0Rm9udCh3bmRQdHIsIDAsIDApOworCWhGb250ID0gKEhGT05UMzIpRURJVF9XTV9HZXRGb250KHduZFB0cik7CiAJaWYgKGhGb250KSBvbGRGb250ID0gU2VsZWN0T2JqZWN0MzIoaGRjLCBoRm9udCk7CiAKIAlpZiAoIUlzTXVsdGlMaW5lKHduZFB0cikpIHsKIAkJZXMtPkxpbmVDb3VudCA9IDE7CiAJCWVzLT5MaW5lRGVmcyA9IHhyZWFsbG9jKGVzLT5MaW5lRGVmcywgc2l6ZW9mKExJTkVERUYpKTsKIAkJZXMtPkxpbmVEZWZzWzBdLm9mZnNldCA9IDA7Ci0JCWVzLT5MaW5lRGVmc1swXS5sZW5ndGggPSBFRElUX1dNX0dldFRleHRMZW5ndGgod25kUHRyLCAwLCAwKTsKKwkJZXMtPkxpbmVEZWZzWzBdLmxlbmd0aCA9IEVESVRfV01fR2V0VGV4dExlbmd0aCh3bmRQdHIpOwogCQllcy0+TGluZURlZnNbMF0uZW5kaW5nID0gRU5EXzA7CiAJCWVzLT5UZXh0V2lkdGggPSAoSU5UMzIpTE9XT1JEKEdldFRhYmJlZFRleHRFeHRlbnQzMkEoaGRjLCB0ZXh0LAogCQkJCQllcy0+TGluZURlZnNbMF0ubGVuZ3RoLApAQCAtOTc2LDkgKzk3OSw5IEBACiAgKi8KIHN0YXRpYyBJTlQzMiBFRElUX0NvbEZyb21XbmRYKFdORCAqd25kUHRyLCBJTlQzMiBsaW5lLCBJTlQzMiB4KQogewotCUlOVDMyIGxjID0gKElOVDMyKUVESVRfRU1fR2V0TGluZUNvdW50KHduZFB0ciwgMCwgMCk7Ci0JSU5UMzIgbGkgPSAoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsaW5lLCAwKTsKLQlJTlQzMiBsbCA9IChJTlQzMilFRElUX0VNX0xpbmVMZW5ndGgod25kUHRyLCBsaSwgMCk7CisJSU5UMzIgbGMgPSAoSU5UMzIpRURJVF9FTV9HZXRMaW5lQ291bnQod25kUHRyKTsKKwlJTlQzMiBsaSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGxpbmUpOworCUlOVDMyIGxsID0gKElOVDMyKUVESVRfRU1fTGluZUxlbmd0aCh3bmRQdHIsIGxpKTsKIAlJTlQzMiBpOwogCiAJbGluZSA9IE1BWCgwLCBNSU4obGluZSwgbGMgLSAxKSk7CkBAIC0xMDAwLDcgKzEwMDMsNyBAQAogewogCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgLTEsIDApOwogCUVESVRfTW92ZUVuZCh3bmRQdHIsIFRSVUUpOwotCUVESVRfV01fQ2xlYXIod25kUHRyLCAwLCAwKTsKKwlFRElUX1dNX0NsZWFyKHduZFB0cik7CiB9CiAKIApAQCAtMTAxNSw3ICsxMDE4LDcgQEAKIHsKIAlFRElUX0VNX1NldFNlbCh3bmRQdHIsIC0xLCAwKTsKIAlFRElUX01vdmVCYWNrd2FyZCh3bmRQdHIsIFRSVUUpOwotCUVESVRfV01fQ2xlYXIod25kUHRyLCAwLCAwKTsKKwlFRElUX1dNX0NsZWFyKHduZFB0cik7CiB9CiAKIApAQCAtMTAzMCw3ICsxMDMzLDcgQEAKIHsKIAlFRElUX0VNX1NldFNlbCh3bmRQdHIsIC0xLCAwKTsKIAlFRElUX01vdmVGb3J3YXJkKHduZFB0ciwgVFJVRSk7Ci0JRURJVF9XTV9DbGVhcih3bmRQdHIsIDAsIDApOworCUVESVRfV01fQ2xlYXIod25kUHRyKTsKIH0KIAogCkBAIC0xMTI2LDE5ICsxMTI5LDYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqCUVESVRfR2V0UmVkcmF3Ci0gKgotICovCi1zdGF0aWMgQk9PTDMyIEVESVRfR2V0UmVkcmF3KFdORCAqd25kUHRyKQotewotCUVESVRTVEFURSAqZXMgPSBFRElUU1RBVEVQVFIod25kUHRyKTsKLQotCXJldHVybiBlcy0+UmVkcmF3OwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCiAgKglFRElUX0dldFNlbAogICoKICAqCUJld2FyZTogVGhpcyBpcyBub3QgdGhlIGZ1bmN0aW9uIGNhbGxlZCBvbiBFTV9HRVRTRUwuCkBAIC0xMjQyLDcgKzEyMzIsNyBAQAogICovCiBzdGF0aWMgdm9pZCBFRElUX0ludmFsaWRhdGVUZXh0KFdORCAqd25kUHRyLCBJTlQzMiBzdGFydCwgSU5UMzIgZW5kKQogewotCUlOVDMyIGZ2ID0gKElOVDMyKUVESVRfRU1fR2V0Rmlyc3RWaXNpYmxlTGluZSh3bmRQdHIsIDAsIDApOworCUlOVDMyIGZ2ID0gKElOVDMyKUVESVRfRU1fR2V0Rmlyc3RWaXNpYmxlTGluZSh3bmRQdHIpOwogCUlOVDMyIHZsYyA9IEVESVRfR2V0VmlzaWJsZUxpbmVDb3VudCh3bmRQdHIpOwogCUlOVDMyIHNsOwogCUlOVDMyIGVsOwpAQCAtMTI1NywxNSArMTI0NywxNSBAQAogCQlyZXR1cm47CiAKIAlpZiAoZW5kID09IC0xKQotCQllbmQgPSAoSU5UMzIpRURJVF9XTV9HZXRUZXh0TGVuZ3RoKHduZFB0ciwgMCwgMCk7CisJCWVuZCA9IChJTlQzMilFRElUX1dNX0dldFRleHRMZW5ndGgod25kUHRyKTsKIAlPUkRFUl9JTlQzMihzdGFydCwgZW5kKTsKLQlzbCA9IChJTlQzMilFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIHN0YXJ0LCAwKTsKLQllbCA9IChJTlQzMilFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIGVuZCwgMCk7CisJc2wgPSAoSU5UMzIpRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCBzdGFydCk7CisJZWwgPSAoSU5UMzIpRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCBlbmQpOwogCWlmICgoZWwgPCBmdikgfHwgKHNsID4gZnYgKyB2bGMpKQogCQlyZXR1cm47CiAKLQlzYyA9IHN0YXJ0IC0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgc2wsIDApOwotCWVjID0gZW5kIC0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgZWwsIDApOworCXNjID0gc3RhcnQgLSAoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBzbCk7CisJZWMgPSBlbmQgLSAoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBlbCk7CiAJaWYgKHNsIDwgZnYpIHsKIAkJc2wgPSBmdjsKIAkJc2MgPSAwOwpAQCAtMTI3Myw3ICsxMjYzLDcgQEAKIAlpZiAoZWwgPiBmdiArIHZsYykgewogCQllbCA9IGZ2ICsgdmxjOwogCQllYyA9IChJTlQzMilFRElUX0VNX0xpbmVMZW5ndGgod25kUHRyLAotCQkJCShJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGVsLCAwKSwgMCk7CisJCQkJKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgZWwpKTsKIAl9CiAJRURJVF9FTV9HZXRSZWN0KHduZFB0ciwgMCwgKExQQVJBTSkmcmNXbmQpOwogCWlmIChzbCA9PSBlbCkgewpAQCAtMTI4MywxNCArMTI3MywxNCBAQAogCX0gZWxzZSB7CiAJCUVESVRfR2V0TGluZVJlY3Qod25kUHRyLCBzbCwgc2MsCiAJCQkJKElOVDMyKUVESVRfRU1fTGluZUxlbmd0aCh3bmRQdHIsCi0JCQkJCShJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIHNsLCAwKSwgMCksCisJCQkJCShJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIHNsKSksCiAJCQkJJnJjTGluZSk7CiAJCWlmIChJbnRlcnNlY3RSZWN0MzIoJnJjVXBkYXRlLCAmcmNXbmQsICZyY0xpbmUpKQogCQkJSW52YWxpZGF0ZVJlY3QzMiggd25kUHRyLT5od25kU2VsZiwgJnJjVXBkYXRlLCBGQUxTRSApOwogCQlmb3IgKGwgPSBzbCArIDEgOyBsIDwgZWwgOyBsKyspIHsKIAkJCUVESVRfR2V0TGluZVJlY3Qod25kUHRyLCBsLCAwLAogCQkJCShJTlQzMilFRElUX0VNX0xpbmVMZW5ndGgod25kUHRyLAotCQkJCQkoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsLCAwKSwgMCksCisJCQkJCShJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwpKSwKIAkJCQkmcmNMaW5lKTsKIAkJCWlmIChJbnRlcnNlY3RSZWN0MzIoJnJjVXBkYXRlLCAmcmNXbmQsICZyY0xpbmUpKQogCQkJCUludmFsaWRhdGVSZWN0MzIod25kUHRyLT5od25kU2VsZiwgJnJjVXBkYXRlLCBGQUxTRSk7CkBAIC0xMzExLDkgKzEzMDEsOSBAQAogICovCiBzdGF0aWMgSU5UMzIgRURJVF9MaW5lRnJvbVduZFkoV05EICp3bmRQdHIsIElOVDMyIHkpCiB7Ci0JSU5UMzIgZnYgPSAoSU5UMzIpRURJVF9FTV9HZXRGaXJzdFZpc2libGVMaW5lKHduZFB0ciwgMCwgMCk7CisJSU5UMzIgZnYgPSAoSU5UMzIpRURJVF9FTV9HZXRGaXJzdFZpc2libGVMaW5lKHduZFB0cik7CiAJSU5UMzIgbGggPSBFRElUX0dldExpbmVIZWlnaHQod25kUHRyKTsKLQlJTlQzMiBsYyA9IChJTlQzMilFRElUX0VNX0dldExpbmVDb3VudCh3bmRQdHIsIDAsIDApOworCUlOVDMyIGxjID0gKElOVDMyKUVESVRfRU1fR2V0TGluZUNvdW50KHduZFB0cik7CiAKIAlyZXR1cm4gTUFYKDAsIE1JTihsYyAtIDEsIHkgLyBsaCArIGZ2KSk7CiB9CkBAIC0xNDI5LDE5ICsxNDE5LDE5IEBACiAJSU5UMzIgbGk7CiAKIAlFRElUX0dldFNlbCh3bmRQdHIsICZzLCAmZSk7Ci0JbCA9IChJTlQzMilFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIGUsIDApOwotCWxpID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCwgMCk7CisJbCA9IChJTlQzMilFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIGUpOworCWxpID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCk7CiAJaWYgKGUgLSBsaSA9PSAwKSB7CiAJCWlmIChsKSB7Ci0JCQlsaSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwgLSAxLCAwKTsKLQkJCWUgPSBsaSArIChJTlQzMilFRElUX0VNX0xpbmVMZW5ndGgod25kUHRyLCBsaSwgMCk7CisJCQlsaSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwgLSAxKTsKKwkJCWUgPSBsaSArIChJTlQzMilFRElUX0VNX0xpbmVMZW5ndGgod25kUHRyLCBsaSk7CiAJCX0KIAl9IGVsc2UKIAkJZS0tOwogCWlmICghZXh0ZW5kKQogCQlzID0gZTsKIAlFRElUX1NldFNlbCh3bmRQdHIsIHMsIGUpOwotCUVESVRfRU1fU2Nyb2xsQ2FyZXQod25kUHRyLCAwLCAwKTsKKwlFRElUX0VNX1Njcm9sbENhcmV0KHduZFB0cik7CiB9CiAKIApAQCAtMTQ2MCwxOSArMTQ1MCwxOSBAQAogCUlOVDMyIHg7CiAKIAlFRElUX0dldFNlbCh3bmRQdHIsICZzLCAmZSk7Ci0JbCA9IChJTlQzMilFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIGUsIDApOwotCWxjID0gKElOVDMyKUVESVRfRU1fR2V0TGluZUNvdW50KHduZFB0ciwgZSwgMCk7Ci0JbGkgPSAoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsLCAwKTsKKwlsID0gKElOVDMyKUVESVRfRU1fTGluZUZyb21DaGFyKHduZFB0ciwgZSk7CisJbGMgPSAoSU5UMzIpRURJVF9FTV9HZXRMaW5lQ291bnQod25kUHRyKTsKKwlsaSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwpOwogCWlmIChsIDwgbGMgLSAxKSB7CiAJCXggPSBFRElUX1duZFhGcm9tQ29sKHduZFB0ciwgbCwgZSAtIGxpKTsKIAkJbCsrOwotCQllID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCwgMCkgKworCQllID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCkgKwogCQkJCUVESVRfQ29sRnJvbVduZFgod25kUHRyLCBsLCB4KTsKIAl9CiAJaWYgKCFleHRlbmQpCiAJCXMgPSBlOwogCUVESVRfU2V0U2VsKHduZFB0ciwgcywgZSk7Ci0JRURJVF9FTV9TY3JvbGxDYXJldCh3bmRQdHIsIDAsIDApOworCUVESVRfRU1fU2Nyb2xsQ2FyZXQod25kUHRyKTsKIH0KIAogCkBAIC0xNDkwLDE0ICsxNDgwLDE0IEBACiAJSU5UMzIgbGk7CiAKIAlFRElUX0dldFNlbCh3bmRQdHIsICZzLCAmZSk7Ci0JbCA9IChJTlQzMilFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIGUsIDApOwotCWxsID0gKElOVDMyKUVESVRfRU1fTGluZUxlbmd0aCh3bmRQdHIsIGUsIDApOwotCWxpID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCwgMCk7CisJbCA9IChJTlQzMilFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIGUpOworCWxsID0gKElOVDMyKUVESVRfRU1fTGluZUxlbmd0aCh3bmRQdHIsIGUpOworCWxpID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCk7CiAJZSA9IGxpICsgbGw7CiAJaWYgKCFleHRlbmQpCiAJCXMgPSBlOwogCUVESVRfU2V0U2VsKHduZFB0ciwgcywgZSk7Ci0JRURJVF9FTV9TY3JvbGxDYXJldCh3bmRQdHIsIDAsIDApOworCUVESVRfRU1fU2Nyb2xsQ2FyZXQod25kUHRyKTsKIH0KIAogCkBAIC0xNTE2LDE5ICsxNTA2LDE5IEBACiAJSU5UMzIgbGk7CiAKIAlFRElUX0dldFNlbCh3bmRQdHIsICZzLCAmZSk7Ci0JbCA9IChJTlQzMilFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIGUsIDApOwotCWxjID0gKElOVDMyKUVESVRfRU1fR2V0TGluZUNvdW50KHduZFB0ciwgZSwgMCk7Ci0JbGwgPSAoSU5UMzIpRURJVF9FTV9MaW5lTGVuZ3RoKHduZFB0ciwgZSwgMCk7Ci0JbGkgPSAoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsLCAwKTsKKwlsID0gKElOVDMyKUVESVRfRU1fTGluZUZyb21DaGFyKHduZFB0ciwgZSk7CisJbGMgPSAoSU5UMzIpRURJVF9FTV9HZXRMaW5lQ291bnQod25kUHRyKTsKKwlsbCA9IChJTlQzMilFRElUX0VNX0xpbmVMZW5ndGgod25kUHRyLCBlKTsKKwlsaSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwpOwogCWlmIChlIC0gbGkgPT0gbGwpIHsKIAkJaWYgKGwgIT0gbGMgLSAxKQotCQkJZSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwgKyAxLCAwKTsKKwkJCWUgPSAoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsICsgMSk7CiAJfSBlbHNlCiAJCWUrKzsKIAlpZiAoIWV4dGVuZCkKIAkJcyA9IGU7CiAJRURJVF9TZXRTZWwod25kUHRyLCBzLCBlKTsKLQlFRElUX0VNX1Njcm9sbENhcmV0KHduZFB0ciwgMCwgMCk7CisJRURJVF9FTV9TY3JvbGxDYXJldCh3bmRQdHIpOwogfQogCiAKQEAgLTE1NDcsMTMgKzE1MzcsMTMgQEAKIAlJTlQzMiBsaTsKIAogCUVESVRfR2V0U2VsKHduZFB0ciwgJnMsICZlKTsKLQlsID0gKElOVDMyKUVESVRfRU1fTGluZUZyb21DaGFyKHduZFB0ciwgZSwgMCk7Ci0JbGkgPSAoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsLCAwKTsKKwlsID0gKElOVDMyKUVESVRfRU1fTGluZUZyb21DaGFyKHduZFB0ciwgZSk7CisJbGkgPSAoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsKTsKIAllID0gbGk7CiAJaWYgKCFleHRlbmQpCiAJCXMgPSBlOwogCUVESVRfU2V0U2VsKHduZFB0ciwgcywgZSk7Ci0JRURJVF9FTV9TY3JvbGxDYXJldCh3bmRQdHIsIDAsIDApOworCUVESVRfRU1fU2Nyb2xsQ2FyZXQod25kUHRyKTsKIH0KIAogCkBAIC0xNTcyLDE5ICsxNTYyLDE5IEBACiAJSU5UMzIgeDsKIAogCUVESVRfR2V0U2VsKHduZFB0ciwgJnMsICZlKTsKLQlsID0gKElOVDMyKUVESVRfRU1fTGluZUZyb21DaGFyKHduZFB0ciwgZSwgMCk7Ci0JbGMgPSAoSU5UMzIpRURJVF9FTV9HZXRMaW5lQ291bnQod25kUHRyLCBlLCAwKTsKLQlsaSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwsIDApOworCWwgPSAoSU5UMzIpRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCBlKTsKKwlsYyA9IChJTlQzMilFRElUX0VNX0dldExpbmVDb3VudCh3bmRQdHIpOworCWxpID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCk7CiAJaWYgKGwgPCBsYyAtIDEpIHsKIAkJeCA9IEVESVRfV25kWEZyb21Db2wod25kUHRyLCBsLCBlIC0gbGkpOwogCQlsID0gTUlOKGxjIC0gMSwgbCArIEVESVRfR2V0VmlzaWJsZUxpbmVDb3VudCh3bmRQdHIpKTsKLQkJZSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwsIDApICsKKwkJZSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwpICsKIAkJCQlFRElUX0NvbEZyb21XbmRYKHduZFB0ciwgbCwgeCk7CiAJfQogCWlmICghZXh0ZW5kKQogCQlzID0gZTsKIAlFRElUX1NldFNlbCh3bmRQdHIsIHMsIGUpOwotCUVESVRfRU1fU2Nyb2xsQ2FyZXQod25kUHRyLCAwLCAwKTsKKwlFRElUX0VNX1Njcm9sbENhcmV0KHduZFB0cik7CiB9CiAKIApAQCAtMTYwMiwxOCArMTU5MiwxOCBAQAogCUlOVDMyIHg7CiAKIAlFRElUX0dldFNlbCh3bmRQdHIsICZzLCAmZSk7Ci0JbCA9IChJTlQzMilFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIGUsIDApOwotCWxpID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCwgMCk7CisJbCA9IChJTlQzMilFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIGUpOworCWxpID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCk7CiAJaWYgKGwpIHsKIAkJeCA9IEVESVRfV25kWEZyb21Db2wod25kUHRyLCBsLCBlIC0gbGkpOwogCQlsID0gTUFYKDAsIGwgLSBFRElUX0dldFZpc2libGVMaW5lQ291bnQod25kUHRyKSk7Ci0JCWUgPSAoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsLCAwKSArCisJCWUgPSAoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsKSArCiAJCQkJRURJVF9Db2xGcm9tV25kWCh3bmRQdHIsIGwsIHgpOwogCX0KIAlpZiAoIWV4dGVuZCkKIAkJcyA9IGU7CiAJRURJVF9TZXRTZWwod25kUHRyLCBzLCBlKTsKLQlFRElUX0VNX1Njcm9sbENhcmV0KHduZFB0ciwgMCwgMCk7CisJRURJVF9FTV9TY3JvbGxDYXJldCh3bmRQdHIpOwogfQogCiAKQEAgLTE2MzEsMTggKzE2MjEsMTggQEAKIAlJTlQzMiB4OwogCiAJRURJVF9HZXRTZWwod25kUHRyLCAmcywgJmUpOwotCWwgPSAoSU5UMzIpRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCBlLCAwKTsKLQlsaSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwsIDApOworCWwgPSAoSU5UMzIpRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCBlKTsKKwlsaSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwpOwogCWlmIChsKSB7CiAJCXggPSBFRElUX1duZFhGcm9tQ29sKHduZFB0ciwgbCwgZSAtIGxpKTsKIAkJbC0tOwotCQllID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCwgMCkgKworCQllID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCkgKwogCQkJCUVESVRfQ29sRnJvbVduZFgod25kUHRyLCBsLCB4KTsKIAl9CiAJaWYgKCFleHRlbmQpCiAJCXMgPSBlOwogCUVESVRfU2V0U2VsKHduZFB0ciwgcywgZSk7Ci0JRURJVF9FTV9TY3JvbGxDYXJldCh3bmRQdHIsIDAsIDApOworCUVESVRfRU1fU2Nyb2xsQ2FyZXQod25kUHRyKTsKIH0KIAogCkBAIC0xNjYxLDEzICsxNjUxLDEzIEBACiAJTFBTVFIgdGV4dDsKIAogCUVESVRfR2V0U2VsKHduZFB0ciwgJnMsICZlKTsKLQlsID0gKElOVDMyKUVESVRfRU1fTGluZUZyb21DaGFyKHduZFB0ciwgZSwgMCk7Ci0JbGwgPSAoSU5UMzIpRURJVF9FTV9MaW5lTGVuZ3RoKHduZFB0ciwgZSwgMCk7Ci0JbGkgPSAoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsLCAwKTsKKwlsID0gKElOVDMyKUVESVRfRU1fTGluZUZyb21DaGFyKHduZFB0ciwgZSk7CisJbGwgPSAoSU5UMzIpRURJVF9FTV9MaW5lTGVuZ3RoKHduZFB0ciwgZSk7CisJbGkgPSAoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsKTsKIAlpZiAoZSAtIGxpID09IDApIHsKIAkJaWYgKGwpIHsKLQkJCWxpID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCAtIDEsIDApOwotCQkJZSA9IGxpICsgKElOVDMyKUVESVRfRU1fTGluZUxlbmd0aCh3bmRQdHIsIGxpLCAwKTsKKwkJCWxpID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCAtIDEpOworCQkJZSA9IGxpICsgKElOVDMyKUVESVRfRU1fTGluZUxlbmd0aCh3bmRQdHIsIGxpKTsKIAkJfQogCX0gZWxzZSB7CiAJCXRleHQgPSBFRElUX0dldFBvaW50ZXIod25kUHRyKTsKQEAgLTE2NzcsNyArMTY2Nyw3IEBACiAJaWYgKCFleHRlbmQpCiAJCXMgPSBlOwogCUVESVRfU2V0U2VsKHduZFB0ciwgcywgZSk7Ci0JRURJVF9FTV9TY3JvbGxDYXJldCh3bmRQdHIsIDAsIDApOworCUVESVRfRU1fU2Nyb2xsQ2FyZXQod25kUHRyKTsKIH0KIAogCkBAIC0xNjk3LDEzICsxNjg3LDEzIEBACiAJTFBTVFIgdGV4dDsKIAogCUVESVRfR2V0U2VsKHduZFB0ciwgJnMsICZlKTsKLQlsID0gKElOVDMyKUVESVRfRU1fTGluZUZyb21DaGFyKHduZFB0ciwgZSwgMCk7Ci0JbGMgPSAoSU5UMzIpRURJVF9FTV9HZXRMaW5lQ291bnQod25kUHRyLCBlLCAwKTsKLQlsbCA9IChJTlQzMilFRElUX0VNX0xpbmVMZW5ndGgod25kUHRyLCBlLCAwKTsKLQlsaSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwsIDApOworCWwgPSAoSU5UMzIpRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCBlKTsKKwlsYyA9IChJTlQzMilFRElUX0VNX0dldExpbmVDb3VudCh3bmRQdHIpOworCWxsID0gKElOVDMyKUVESVRfRU1fTGluZUxlbmd0aCh3bmRQdHIsIGUpOworCWxpID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCk7CiAJaWYgKGUgLSBsaSA9PSBsbCkgewogCQlpZiAobCAhPSBsYyAtIDEpCi0JCQllID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCArIDEsIDApOworCQkJZSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwgKyAxKTsKIAl9IGVsc2UgewogCQl0ZXh0ID0gRURJVF9HZXRQb2ludGVyKHduZFB0cik7CiAJCWUgPSBsaSArIEVESVRfQ2FsbFdvcmRCcmVha1Byb2Mod25kUHRyLApAQCAtMTcxMiw3ICsxNzAyLDcgQEAKIAlpZiAoIWV4dGVuZCkKIAkJcyA9IGU7CiAJRURJVF9TZXRTZWwod25kUHRyLCBzLCBlKTsKLQlFRElUX0VNX1Njcm9sbENhcmV0KHduZFB0ciwgMCwgMCk7CisJRURJVF9FTV9TY3JvbGxDYXJldCh3bmRQdHIpOwogfQogCiAKQEAgLTE3MjMsMTUgKzE3MTMsMTYgQEAKICAqLwogc3RhdGljIHZvaWQgRURJVF9QYWludExpbmUoV05EICp3bmRQdHIsIEhEQzMyIGhkYywgSU5UMzIgbGluZSwgQk9PTDMyIHJldikKIHsKLQlJTlQzMiBmdiA9IChJTlQzMilFRElUX0VNX0dldEZpcnN0VmlzaWJsZUxpbmUod25kUHRyLCAwLCAwKTsKKwlJTlQzMiBmdiA9IChJTlQzMilFRElUX0VNX0dldEZpcnN0VmlzaWJsZUxpbmUod25kUHRyKTsKIAlJTlQzMiB2bGMgPSBFRElUX0dldFZpc2libGVMaW5lQ291bnQod25kUHRyKTsKLQlJTlQzMiBsYyA9IChJTlQzMilFRElUX0VNX0dldExpbmVDb3VudCh3bmRQdHIsIDAsIDApOworCUlOVDMyIGxjID0gKElOVDMyKUVESVRfRU1fR2V0TGluZUNvdW50KHduZFB0cik7CiAJSU5UMzIgbGk7CiAJSU5UMzIgbGw7CiAJSU5UMzIgczsKIAlJTlQzMiBlOwogCUlOVDMyIHg7CiAJSU5UMzIgeTsKKwlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7CiAKIAlpZiAoKGxpbmUgPCBmdikgfHwgKGxpbmUgPiBmdiArIHZsYykgfHwgKGxpbmUgPj0gbGMpKQogCQlyZXR1cm47CkBAIC0xNzQwLDE1ICsxNzMxLDE0IEBACiAKIAl4ID0gRURJVF9XbmRYRnJvbUNvbCh3bmRQdHIsIGxpbmUsIDApOwogCXkgPSBFRElUX1duZFlGcm9tTGluZSh3bmRQdHIsIGxpbmUpOwotCWxpID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbGluZSwgMCk7Ci0JbGwgPSAoSU5UMzIpRURJVF9FTV9MaW5lTGVuZ3RoKHduZFB0ciwgbGksIDApOworCWxpID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbGluZSk7CisJbGwgPSAoSU5UMzIpRURJVF9FTV9MaW5lTGVuZ3RoKHduZFB0ciwgbGkpOwogCUVESVRfR2V0U2VsKHduZFB0ciwgJnMsICZlKTsKIAlPUkRFUl9JTlQzMihzLCBlKTsKIAlzID0gTUlOKGxpICsgbGwsIE1BWChsaSwgcykpOwogCWUgPSBNSU4obGkgKyBsbCwgTUFYKGxpLCBlKSk7CiAJaWYgKHJldiAmJiAocyAhPSBlKSAmJgotCQkJKChHZXRGb2N1czMyKCkgPT0gd25kUHRyLT5od25kU2VsZikgfHwKLQkJCQkod25kUHRyLT5kd1N0eWxlICYgRVNfTk9ISURFU0VMKSkpIHsKKwkJKChlcy0+ZVN0YXRlICYgRUZfRk9DVVNFRCkgfHwgKHduZFB0ci0+ZHdTdHlsZSAmIEVTX05PSElERVNFTCkpICkgewogCQl4ICs9IEVESVRfUGFpbnRUZXh0KHduZFB0ciwgaGRjLCB4LCB5LCBsaW5lLCAwLCBzIC0gbGksIEZBTFNFKTsKIAkJeCArPSBFRElUX1BhaW50VGV4dCh3bmRQdHIsIGhkYywgeCwgeSwgbGluZSwgcyAtIGxpLCBlIC0gcywgVFJVRSk7CiAJCXggKz0gRURJVF9QYWludFRleHQod25kUHRyLCBoZGMsIHgsIHksIGxpbmUsIGUgLSBsaSwgbGkgKyBsbCAtIGUsIEZBTFNFKTsKQEAgLTE3NzYsMjEgKzE3NjYsMTkgQEAKIAkJcmV0dXJuIDA7CiAJQmtDb2xvciA9IEdldEJrQ29sb3IzMihoZGMpOwogCVRleHRDb2xvciA9IEdldFRleHRDb2xvcjMyKGhkYyk7Ci0JaWYgKHJldikKLSAgICAgICAgewotICAgICAgICAgICAgU2V0QmtDb2xvcjMyKGhkYywgR2V0U3lzQ29sb3IzMihDT0xPUl9ISUdITElHSFQpKTsKLSAgICAgICAgICAgIFNldFRleHRDb2xvcjMyKGhkYywgR2V0U3lzQ29sb3IzMihDT0xPUl9ISUdITElHSFRURVhUKSk7CisJaWYgKHJldikgeworCQlTZXRCa0NvbG9yMzIoaGRjLCBHZXRTeXNDb2xvcjMyKENPTE9SX0hJR0hMSUdIVCkpOworCQlTZXRUZXh0Q29sb3IzMihoZGMsIEdldFN5c0NvbG9yMzIoQ09MT1JfSElHSExJR0hUVEVYVCkpOwogCX0KIAl0ZXh0ID0gRURJVF9HZXRQYXNzd29yZFBvaW50ZXIod25kUHRyKTsKLQlsaSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGxpbmUsIDApOworCWxpID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbGluZSk7CiAJeG9mZiA9IEVESVRfR2V0WE9mZnNldCh3bmRQdHIpOwogCXJldCA9IChJTlQzMilMT1dPUkQoVGFiYmVkVGV4dE91dDMyQShoZGMsIHgsIHksIHRleHQgKyBsaSArIGNvbCwgY291bnQsCiAJCQkJCWVzLT5OdW1UYWJTdG9wcywgZXMtPlRhYlN0b3BzLCAteG9mZikpOwogCWZyZWUodGV4dCk7Ci0JaWYgKHJldikKLSAgICAgICAgewotICAgICAgICAgICAgU2V0QmtDb2xvcjMyKGhkYywgQmtDb2xvcik7Ci0gICAgICAgICAgICBTZXRUZXh0Q29sb3IzMihoZGMsIFRleHRDb2xvcik7CisJaWYgKHJldikgeworCQlTZXRCa0NvbG9yMzIoaGRjLCBCa0NvbG9yKTsKKwkJU2V0VGV4dENvbG9yMzIoaGRjLCBUZXh0Q29sb3IpOwogCX0KIAlyZXR1cm4gcmV0OwogfQpAQCAtMTg2MCw5ICsxODQ4LDkgQEAKIAlFRElUX0VNX0dldFNlbCh3bmRQdHIsIChXUEFSQU0zMikmcywgKExQQVJBTSkmZSk7CiAJZXMtPlNlbFN0YXJ0ID0gbnM7CiAJZXMtPlNlbEVuZCA9IG5lOwotCWlmIChFRElUX0dldFJlZHJhdyh3bmRQdHIpKSB7Ci0JCWlmICh3bmRQdHItPmh3bmRTZWxmID09IEdldEZvY3VzMzIoKSkgewotCQkJcG9zID0gRURJVF9FTV9Qb3NGcm9tQ2hhcih3bmRQdHIsIG5lLCAwKTsKKwlpZiAoIUlzTm9SZWRyYXcod25kUHRyKSkgeworCQlpZiAoZXMtPmVTdGF0ZSAmIEVGX0ZPQ1VTRUQpIHsKKwkJCXBvcyA9IEVESVRfRU1fUG9zRnJvbUNoYXIod25kUHRyLCBuZSk7CiAJCQlTZXRDYXJldFBvczE2KChJTlQxNilMT1dPUkQocG9zKSwgKElOVDE2KUhJV09SRChwb3MpKTsKIAkJfQogCQlPUkRFUl9JTlQzMihzLCBucyk7CkBAIC0xODk0LDEzICsxODgyLDEzIEBACiAJSERDMzIgaGRjOwogCUhGT05UMzIgaEZvbnQ7CiAJSEZPTlQzMiBvbGRGb250ID0gMDsKLQlJTlQzMiBsYyA9IChJTlQzMilFRElUX0VNX0dldExpbmVDb3VudCh3bmRQdHIsIDAsIDApOwotCUlOVDMyIGxpID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbGluZSwgMCk7Ci0JSU5UMzIgbGwgPSAoSU5UMzIpRURJVF9FTV9MaW5lTGVuZ3RoKHduZFB0ciwgbGksIDApOworCUlOVDMyIGxjID0gKElOVDMyKUVESVRfRU1fR2V0TGluZUNvdW50KHduZFB0cik7CisJSU5UMzIgbGkgPSAoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsaW5lKTsKKwlJTlQzMiBsbCA9IChJTlQzMilFRElUX0VNX0xpbmVMZW5ndGgod25kUHRyLCBsaSk7CiAJSU5UMzIgeG9mZiA9IEVESVRfR2V0WE9mZnNldCh3bmRQdHIpOwogCiAJaGRjID0gR2V0REMzMih3bmRQdHItPmh3bmRTZWxmKTsKLQloRm9udCA9IChIRk9OVDMyKUVESVRfV01fR2V0Rm9udCh3bmRQdHIsIDAsIDApOworCWhGb250ID0gKEhGT05UMzIpRURJVF9XTV9HZXRGb250KHduZFB0cik7CiAJaWYgKGhGb250KSBvbGRGb250ID0gU2VsZWN0T2JqZWN0MzIoaGRjLCBoRm9udCk7CiAJbGluZSA9IE1BWCgwLCBNSU4obGluZSwgbGMgLSAxKSk7CiAJY29sID0gTUlOKGNvbCwgbGwpOwpAQCAtMTkyMyw3ICsxOTExLDcgQEAKICAqLwogc3RhdGljIElOVDMyIEVESVRfV25kWUZyb21MaW5lKFdORCAqd25kUHRyLCBJTlQzMiBsaW5lKQogewotCUlOVDMyIGZ2ID0gKElOVDMyKUVESVRfRU1fR2V0Rmlyc3RWaXNpYmxlTGluZSh3bmRQdHIsIDAsIDApOworCUlOVDMyIGZ2ID0gKElOVDMyKUVESVRfRU1fR2V0Rmlyc3RWaXNpYmxlTGluZSh3bmRQdHIpOwogCUlOVDMyIGxoID0gRURJVF9HZXRMaW5lSGVpZ2h0KHduZFB0cik7CiAKIAlyZXR1cm4gKGxpbmUgLSBmdikgKiBsaDsKQEAgLTIwMDEsNyArMTk4OSw3IEBACiAgKglFTV9DQU5VTkRPCiAgKgogICovCi1zdGF0aWMgTFJFU1VMVCBFRElUX0VNX0NhblVuZG8oV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3N0YXRpYyBMUkVTVUxUIEVESVRfRU1fQ2FuVW5kbyhXTkQgKnduZFB0cikKIHsKIAlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7CiAKQEAgLTIwMzEsNyArMjAxOSw3IEBACiAJCXJldHVybiAtMTsKIAogCWwgPSBFRElUX0xpbmVGcm9tV25kWSh3bmRQdHIsIHB0LnkpOwotCWxpID0gRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsLCAwKTsKKwlsaSA9IEVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCk7CiAJYyA9IEVESVRfQ29sRnJvbVduZFgod25kUHRyLCBsLCBwdC54KTsKIAogCXJldHVybiAoTFJFU1VMVClNQUtFTE9ORyhsaSArIGMsIGxpKTsKQEAgLTIwNDMsNyArMjAzMSw3IEBACiAgKglFTV9FTVBUWVVORE9CVUZGRVIKICAqCiAgKi8KLXN0YXRpYyBMUkVTVUxUIEVESVRfRU1fRW1wdHlVbmRvQnVmZmVyKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0VtcHR5VW5kb0J1ZmZlcihXTkQgKnduZFB0cikKIHsKIAlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7CiAKQEAgLTIwNTgsNyArMjA0Niw3IEBACiAgKglFTV9GTVRMSU5FUwogICoKICAqLwotc3RhdGljIExSRVNVTFQgRURJVF9FTV9GbXRMaW5lcyhXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorc3RhdGljIExSRVNVTFQgRURJVF9FTV9GbXRMaW5lcyhXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtKQogewogCWZwcmludGYoc3RkbmltcCwgImVkaXQ6IEVNX0ZNVExJTkVTOiBtZXNzYWdlIG5vdCBpbXBsZW1lbnRlZFxuIik7CiAJcmV0dXJuIHdQYXJhbSA/IFRSVUUgOiBGQUxTRTsKQEAgLTIwNzAsNyArMjA1OCw3IEBACiAgKglFTV9HRVRGSVJTVFZJU0lCTEVMSU5FCiAgKgogICovCi1zdGF0aWMgTFJFU1VMVCBFRElUX0VNX0dldEZpcnN0VmlzaWJsZUxpbmUoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3N0YXRpYyBMUkVTVUxUIEVESVRfRU1fR2V0Rmlyc3RWaXNpYmxlTGluZShXTkQgKnduZFB0cikKIHsKIAlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7CiAKQEAgLTIwODYsNyArMjA3NCw3IEBACiAgKglFTV9HRVRIQU5ETEUKICAqCiAgKi8KLXN0YXRpYyBMUkVTVUxUIEVESVRfRU1fR2V0SGFuZGxlKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0dldEhhbmRsZShXTkQgKnduZFB0cikKIHsKIAlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7CiAKQEAgLTIxMTUsNyArMjEwMyw3IEBACiAgKgogICoJSW4gdGhpcyBmdW5jdGlvbiB3ZSdsbCB0cnkgdG8gc3dpdGNoIHRvIGxvY2FsIGhlYXAuCiAgKi8KLXN0YXRpYyBMUkVTVUxUIEVESVRfRU1fR2V0SGFuZGxlMTYoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3N0YXRpYyBMUkVTVUxUIEVESVRfRU1fR2V0SGFuZGxlMTYoV05EICp3bmRQdHIpCiB7CiAJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOwogCUxQU1RSIHRleHQ7CkBAIC0yMTM4LDggKzIxMjYsNyBAQAogCQlkcHJpbnRmX2VkaXQoc3RkZGViLCAiZWRpdDogRU1fR0VUSEFORExFOiBsb2NhbCBoZWFwIGluaXRpYWxpemVkXG4iKTsKIAl9CiAJaWYgKCEobmV3QnVmID0gTE9DQUxfQWxsb2Mod25kUHRyLT5oSW5zdGFuY2UsIExNRU1fTU9WRUFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVESVRfV01fR2V0VGV4dExlbmd0aCh3bmRQdHIsIDAsIDApICsgMSkpKQotICAgICAgICB7CisJCQkJICAgRURJVF9XTV9HZXRUZXh0TGVuZ3RoKHduZFB0cikgKyAxKSkpIHsKIAkJZnByaW50ZihzdGRlcnIsICJlZGl0OiBFTV9HRVRIQU5ETEU6IGNvdWxkIG5vdCBhbGxvY2F0ZSBuZXcgMTYgYml0IGJ1ZmZlclxuIik7CiAJCXJldHVybiAwOwogCX0KQEAgLTIxODgsMTYgKzIxNzUsMTYgQEAKIAlMUFNUUiBkc3Q7CiAJSU5UMzIgbGVuOwogCUlOVDMyIGk7Ci0JSU5UMzIgbGMgPSAoSU5UMzIpRURJVF9FTV9HZXRMaW5lQ291bnQod25kUHRyLCAwLCAwKTsKKwlJTlQzMiBsYyA9IChJTlQzMilFRElUX0VNX0dldExpbmVDb3VudCh3bmRQdHIpOwogCiAJaWYgKCFJc011bHRpTGluZSh3bmRQdHIpKQogCQl3UGFyYW0gPSAwOwogCWlmICgoSU5UMzIpd1BhcmFtID49IGxjKQogCQlyZXR1cm4gMDsKIAl0ZXh0ID0gRURJVF9HZXRQb2ludGVyKHduZFB0cik7Ci0Jc3JjID0gdGV4dCArIChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIHdQYXJhbSwgMCk7CisJc3JjID0gdGV4dCArIChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIHdQYXJhbSk7CiAJZHN0ID0gKExQU1RSKWxQYXJhbTsKLQlsZW4gPSBNSU4oKihXT1JEICopZHN0LCAoSU5UMzIpRURJVF9FTV9MaW5lTGVuZ3RoKHduZFB0ciwgd1BhcmFtLCAwKSk7CisJbGVuID0gTUlOKCooV09SRCAqKWRzdCwgKElOVDMyKUVESVRfRU1fTGluZUxlbmd0aCh3bmRQdHIsIHdQYXJhbSkpOwogCWZvciAoaSA9IDAgOyBpIDwgbGVuIDsgaSsrKSB7CiAJCSpkc3QgPSAqc3JjOwogCQlzcmMrKzsKQEAgLTIyMTIsNyArMjE5OSw3IEBACiAgKglFTV9HRVRMSU5FQ09VTlQKICAqCiAgKi8KLXN0YXRpYyBMUkVTVUxUIEVESVRfRU1fR2V0TGluZUNvdW50KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0dldExpbmVDb3VudChXTkQgKnduZFB0cikKIHsKIAlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7CiAKQEAgLTIyMzgsMTEgKzIyMjUsMTEgQEAKICAqCUVNX0dFVE1PRElGWQogICoKICAqLwotc3RhdGljIExSRVNVTFQgRURJVF9FTV9HZXRNb2RpZnkoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3N0YXRpYyBMUkVTVUxUIEVESVRfRU1fR2V0TW9kaWZ5KFdORCAqd25kUHRyKQogewogCUVESVRTVEFURSAqZXMgPSBFRElUU1RBVEVQVFIod25kUHRyKTsKIAotCXJldHVybiAoTFJFU1VMVCllcy0+VGV4dENoYW5nZWQ7CisJcmV0dXJuIChMUkVTVUxUKSgoZXMtPmVTdGF0ZSAmIEVGX1RFWFRDSEFOR0VEKSAhPSAwKTsKIH0KIAogCkBAIC0yMjUxLDcgKzIyMzgsNyBAQAogICoJRU1fR0VUUEFTU1dPUkRDSEFSCiAgKgogICovCi1zdGF0aWMgTFJFU1VMVCBFRElUX0VNX0dldFBhc3N3b3JkQ2hhcihXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorc3RhdGljIExSRVNVTFQgRURJVF9FTV9HZXRQYXNzd29yZENoYXIoV05EICp3bmRQdHIpCiB7CiAJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOwogCkBAIC0yMzIwLDcgKzIzMDcsNyBAQAogICoJQWxsIGluIGFsbDogdmVyeSBwb29ybHkgZG9jdW1lbnRlZAogICoKICAqLwotc3RhdGljIExSRVNVTFQgRURJVF9FTV9HZXRUaHVtYihXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorc3RhdGljIExSRVNVTFQgRURJVF9FTV9HZXRUaHVtYihXTkQgKnduZFB0cikKIHsKIAlyZXR1cm4gTUFLRUxPTkcoRURJVF9XTV9WU2Nyb2xsKHduZFB0ciwgRU1fR0VUVEhVTUIxNiwgMCksCiAJCUVESVRfV01fSFNjcm9sbCh3bmRQdHIsIEVNX0dFVFRIVU1CMTYsIDApKTsKQEAgLTIzNTAsNyArMjMzNyw3IEBACiAgKglFTV9MSU5FRlJPTUNIQVIKICAqCiAgKi8KLXN0YXRpYyBMUkVTVUxUIEVESVRfRU1fTGluZUZyb21DaGFyKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0xpbmVGcm9tQ2hhcihXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtKQogewogCUlOVDMyIGw7CiAKQEAgLTIzNTgsOCArMjM0NSw4IEBACiAJCXJldHVybiAwOwogCWlmICgoSU5UMzIpd1BhcmFtID09IC0xKQogCQlFRElUX0VNX0dldFNlbCh3bmRQdHIsIChXUEFSQU0zMikmd1BhcmFtLCAwKTsJLyogaW50ZW50aW9uYWwgKGxvb2tzIHdlaXJkLCBkb2Vzbid0IGl0ID8pICovCi0JbCA9IChJTlQzMilFRElUX0VNX0dldExpbmVDb3VudCh3bmRQdHIsIDAsIDApIC0gMTsKLQl3aGlsZSAoKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCwgMCkgPiAoSU5UMzIpd1BhcmFtKQorCWwgPSAoSU5UMzIpRURJVF9FTV9HZXRMaW5lQ291bnQod25kUHRyKSAtIDE7CisJd2hpbGUgKChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwpID4gKElOVDMyKXdQYXJhbSkKIAkJbC0tOwogCXJldHVybiAoTFJFU1VMVClsOwogfQpAQCAtMjM3MCwxMiArMjM1NywxMiBAQAogICoJRU1fTElORUlOREVYCiAgKgogICovCi1zdGF0aWMgTFJFU1VMVCBFRElUX0VNX0xpbmVJbmRleChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorc3RhdGljIExSRVNVTFQgRURJVF9FTV9MaW5lSW5kZXgoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSkKIHsKIAlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7CiAJSU5UMzIgZTsKIAlJTlQzMiBsOwotCUlOVDMyIGxjID0gKElOVDMyKUVESVRfRU1fR2V0TGluZUNvdW50KHduZFB0ciwgMCwgMCk7CisJSU5UMzIgbGMgPSAoSU5UMzIpRURJVF9FTV9HZXRMaW5lQ291bnQod25kUHRyKTsKIAogCWlmICgoSU5UMzIpd1BhcmFtID09IC0xKSB7CiAJCUVESVRfR2V0U2VsKHduZFB0ciwgTlVMTCwgJmUpOwpAQCAtMjM5NSw3ICsyMzgyLDcgQEAKICAqCUVNX0xJTkVMRU5HVEgKICAqCiAgKi8KLXN0YXRpYyBMUkVTVUxUIEVESVRfRU1fTGluZUxlbmd0aChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorc3RhdGljIExSRVNVTFQgRURJVF9FTV9MaW5lTGVuZ3RoKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0pCiB7CiAJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOwogCUlOVDMyIHM7CkBAIC0yNDA3LDEzICsyMzk0LDEzIEBACiAJCXJldHVybiAoTFJFU1VMVCllcy0+TGluZURlZnNbMF0ubGVuZ3RoOwogCWlmICgoSU5UMzIpd1BhcmFtID09IC0xKSB7CiAJCUVESVRfR2V0U2VsKHduZFB0ciwgJnMsICZlKTsKLQkJc2wgPSAoSU5UMzIpRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCBzLCAwKTsKLQkJZWwgPSAoSU5UMzIpRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCBlLCAwKTsKKwkJc2wgPSAoSU5UMzIpRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCBzKTsKKwkJZWwgPSAoSU5UMzIpRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCBlKTsKIAkJcmV0dXJuIChMUkVTVUxUKShzIC0gZXMtPkxpbmVEZWZzW3NsXS5vZmZzZXQgKwogCQkJCWVzLT5MaW5lRGVmc1tlbF0ub2Zmc2V0ICsKIAkJCQllcy0+TGluZURlZnNbZWxdLmxlbmd0aCAtIGUpOwogCX0KLQlyZXR1cm4gKExSRVNVTFQpZXMtPkxpbmVEZWZzWyhJTlQzMilFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIHdQYXJhbSwgMCldLmxlbmd0aDsKKwlyZXR1cm4gKExSRVNVTFQpZXMtPkxpbmVEZWZzWyhJTlQzMilFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIHdQYXJhbSldLmxlbmd0aDsKIH0KIAogCkBAIC0yNDMwLDggKzI0MTcsOCBAQAogc3RhdGljIExSRVNVTFQgRURJVF9FTV9MaW5lU2Nyb2xsKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOwotCUlOVDMyIGxjID0gKElOVDMyKUVESVRfRU1fR2V0TGluZUNvdW50KHduZFB0ciwgMCwgMCk7Ci0JSU5UMzIgZnYgPSAoSU5UMzIpRURJVF9FTV9HZXRGaXJzdFZpc2libGVMaW5lKHduZFB0ciwgMCwgMCk7CisJSU5UMzIgbGMgPSAoSU5UMzIpRURJVF9FTV9HZXRMaW5lQ291bnQod25kUHRyKTsKKwlJTlQzMiBmdiA9IChJTlQzMilFRElUX0VNX0dldEZpcnN0VmlzaWJsZUxpbmUod25kUHRyKTsKIAlJTlQzMiBuZnYgPSBNQVgoMCwgZnYgKyAoSU5UMzIpbFBhcmFtKTsKIAlJTlQzMiB4b2ZmID0gRURJVF9HZXRYT2Zmc2V0KHduZFB0cik7CiAJSU5UMzIgbnhvZmYgPSBNQVgoMCwgeG9mZiArIChJTlQzMil3UGFyYW0pOwpAQCAtMjQ0Nyw4ICsyNDM0LDkgQEAKIAlkeCA9IHhvZmYgLSBueG9mZjsKIAlkeSA9IEVESVRfV25kWUZyb21MaW5lKHduZFB0ciwgZnYpIC0gRURJVF9XbmRZRnJvbUxpbmUod25kUHRyLCBuZnYpOwogCWlmIChkeCB8fCBkeSkgewotCQlpZiAoRURJVF9HZXRSZWRyYXcod25kUHRyKSkKLQkJCVNjcm9sbFdpbmRvdzMyKHduZFB0ci0+aHduZFNlbGYsIGR4LCBkeSwgTlVMTCwgTlVMTCk7CisJCWlmICghSXNOb1JlZHJhdyh3bmRQdHIpKQorCQkJU2Nyb2xsV2luZG93RXgzMih3bmRQdHItPmh3bmRTZWxmLCBkeCwgZHksIAorCQkJCQkgTlVMTCwgTlVMTCwgMCwgTlVMTCwgKFNXX0lOVkFMSURBVEUgfCBTV19FUkFTRSkpOwogCQllcy0+Rmlyc3RWaXNpYmxlTGluZSA9IG5mdjsKIAkJZXMtPlhPZmZzZXQgPSBueG9mZjsKIAkJaWYgKElzVlNjcm9sbEJhcih3bmRQdHIpKQpAQCAtMjQ3MCwxNSArMjQ1OCwxNSBAQAogICoJRU1fUE9TRlJPTUNIQVIKICAqCiAgKi8KLXN0YXRpYyBMUkVTVUxUIEVESVRfRU1fUG9zRnJvbUNoYXIoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3N0YXRpYyBMUkVTVUxUIEVESVRfRU1fUG9zRnJvbUNoYXIoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSkKIHsKLQlJTlQzMiBsZW4gPSAoSU5UMzIpRURJVF9XTV9HZXRUZXh0TGVuZ3RoKHduZFB0ciwgMCwgMCk7CisJSU5UMzIgbGVuID0gKElOVDMyKUVESVRfV01fR2V0VGV4dExlbmd0aCh3bmRQdHIpOwogCUlOVDMyIGw7CiAJSU5UMzIgbGk7CiAKIAl3UGFyYW0gPSBNSU4od1BhcmFtLCBsZW4pOwotCWwgPSBFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIHdQYXJhbSwgMCk7Ci0JbGkgPSBFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwsIDApOworCWwgPSBFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIHdQYXJhbSk7CisJbGkgPSBFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwpOwogCXJldHVybiAoTFJFU1VMVClNQUtFTE9ORyhFRElUX1duZFhGcm9tQ29sKHduZFB0ciwgbCwgd1BhcmFtIC0gbGkpLAogCQkJCUVESVRfV25kWUZyb21MaW5lKHduZFB0ciwgbCkpOwogfQpAQCAtMjQ5NCw3ICsyNDgyLDcgQEAKIAlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7CiAJTFBDU1RSIHN0ciA9IChMUENTVFIpbFBhcmFtOwogCUlOVDMyIHN0cmwgPSBsc3RybGVuMzJBKHN0cik7Ci0JSU5UMzIgdGwgPSAoSU5UMzIpRURJVF9XTV9HZXRUZXh0TGVuZ3RoKHduZFB0ciwgMCwgMCk7CisJSU5UMzIgdGwgPSAoSU5UMzIpRURJVF9XTV9HZXRUZXh0TGVuZ3RoKHduZFB0cik7CiAJSU5UMzIgdXRsOwogCUlOVDMyIHM7CiAJSU5UMzIgZTsKQEAgLTI1NDAsNyArMjUyOCw3IEBACiAJCQkvKiBhbnkgZGVsZXRpb24gbWFrZXMgdGhlIG9sZCBpbnNlcnRpb24tdW5kbyBpbnZhbGlkICovCiAJCQllcy0+VW5kb0luc2VydExlbiA9IDA7CiAJCX0gZWxzZQotCQkJRURJVF9FTV9FbXB0eVVuZG9CdWZmZXIod25kUHRyLCAwLCAwKTsKKwkJCUVESVRfRU1fRW1wdHlVbmRvQnVmZmVyKHduZFB0cik7CiAKIAkJLyogbm93IGRlbGV0ZSAqLwogCQlsc3RyY3B5MzJBKHRleHQgKyBzLCB0ZXh0ICsgZSk7CkBAIC0yNTY1LDcgKzI1NTMsNyBAQAogCQkJCSp1dGV4dCA9ICdcMCc7CiAJCQl9CiAJCX0gZWxzZQotCQkJRURJVF9FTV9FbXB0eVVuZG9CdWZmZXIod25kUHRyLCAwLCAwKTsKKwkJCUVESVRfRU1fRW1wdHlVbmRvQnVmZmVyKHduZFB0cik7CiAKIAkJLyogbm93IGluc2VydCAqLwogCQl0bCA9IGxzdHJsZW4zMkEodGV4dCk7CkBAIC0yNTc5LDE1ICsyNTY3LDE1IEBACiAJCQlDaGFyTG93ZXJCdWZmMzJBKHAsIHN0cmwpOwogCQlzICs9IHN0cmw7CiAJfQotCXJlZHJhdyA9IEVESVRfR2V0UmVkcmF3KHduZFB0cik7Ci0JRURJVF9XTV9TZXRSZWRyYXcod25kUHRyLCBGQUxTRSwgMCk7CisJcmVkcmF3ID0gIUlzTm9SZWRyYXcod25kUHRyKTsKKwlFRElUX1dNX1NldFJlZHJhdyh3bmRQdHIsIEZBTFNFKTsKIAlFRElUX0J1aWxkTGluZURlZnMod25kUHRyKTsKIAlFRElUX0VNX1NldFNlbCh3bmRQdHIsIHMsIHMpOwotCUVESVRfRU1fU2Nyb2xsQ2FyZXQod25kUHRyLCAwLCAwKTsKLQlFRElUX0VNX1NldE1vZGlmeSh3bmRQdHIsIFRSVUUsIDApOworCUVESVRfRU1fU2Nyb2xsQ2FyZXQod25kUHRyKTsKKwlFRElUX0VNX1NldE1vZGlmeSh3bmRQdHIsIFRSVUUpOwogCWRwcmludGZfZWRpdChzdGRkZWIsICJlZGl0OiBub3RpZmljYXRpb24gRU5fVVBEQVRFIHNlbnRcbiIpOwogCUVESVRfTk9USUZZX1BBUkVOVCh3bmRQdHIsIEVOX1VQREFURSk7Ci0JRURJVF9XTV9TZXRSZWRyYXcod25kUHRyLCByZWRyYXcsIDApOworCUVESVRfV01fU2V0UmVkcmF3KHduZFB0ciwgcmVkcmF3KTsKIAlpZiAocmVkcmF3KSB7CiAJCUludmFsaWRhdGVSZWN0MzIoIHduZFB0ci0+aHduZFNlbGYsIE5VTEwsIFRSVUUgKTsKIAkJZHByaW50Zl9lZGl0KHN0ZGRlYiwgImVkaXQ6IG5vdGlmaWNhdGlvbiBFTl9DSEFOR0Ugc2VudFxuIik7CkBAIC0yNjAwLDE0ICsyNTg4LDMyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICoJRU1fU0NST0xMCi0gKgotICoJRklYTUU6IFNjcm9sbCB3aGF0ID8/PyAgQW5kIHdoZXJlID8/PwotICoKICAqLwotc3RhdGljIExSRVNVTFQgRURJVF9FTV9TY3JvbGwoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3N0YXRpYyBMUkVTVUxUIEVESVRfRU1fU2Nyb2xsKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0pCiB7Ci0JZnByaW50ZihzdGRuaW1wLCAiZWRpdDogRU1fU0NST0xMOiBtZXNzYWdlIG5vdCBpbXBsZW1lbnRlZFxuIik7Ci0JcmV0dXJuIDA7CisJSU5UMzIJZHk7CisKKyAgICAgICAgc3dpdGNoICh3UGFyYW0pIHsKKyAgICAgICAgY2FzZSBTQl9MSU5FVVA6CisgICAgICAgICAgICAgICAgZHkgPSAtMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTQl9MSU5FRE9XTjoKKyAgICAgICAgICAgICAgICBkeSA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0JfUEFHRVVQOgorCWNhc2UgU0JfUEFHRURPV046CisJCWR5ID0gRURJVF9HZXRWaXNpYmxlTGluZUNvdW50KHduZFB0cik7CisgICAgICAgICAgICAgICAgaWYoIHdQYXJhbSA9PSBTQl9QQUdFVVApIGR5ID0gLWR5OworICAgICAgICAgICAgICAgIGJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBGQUxTRTsKKwl9CisJaWYgKGR5KSB7CisJCUVESVRfRU1fTGluZVNjcm9sbCh3bmRQdHIsIDAsIGR5KTsKKwkJZHByaW50Zl9lZGl0KHN0ZGRlYiwgImVkaXQ6IG5vdGlmaWNhdGlvbiBFTl9WU0NST0xMIHNlbnRcbiIpOworCQlFRElUX05PVElGWV9QQVJFTlQod25kUHRyLCBFTl9WU0NST0xMKTsKKwl9CisJcmV0dXJuIE1BS0VMT05HKCAoKFVJTlQxNikoSU5UMTYpZHkpLCBUUlVFICk7CiB9CiAKIApAQCAtMjYyMCwxMiArMjYyNiwxMiBAQAogICoJCWNvbnRyb2xzID8/PwogICoKICAqLwotc3RhdGljIExSRVNVTFQgRURJVF9FTV9TY3JvbGxDYXJldChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorc3RhdGljIExSRVNVTFQgRURJVF9FTV9TY3JvbGxDYXJldChXTkQgKnduZFB0cikKIHsKIAlJTlQzMiBlOwogCUlOVDMyIGw7CiAJSU5UMzIgbGk7Ci0JSU5UMzIgZnYgPSAoSU5UMzIpRURJVF9FTV9HZXRGaXJzdFZpc2libGVMaW5lKHduZFB0ciwgMCwgMCk7CisJSU5UMzIgZnYgPSAoSU5UMzIpRURJVF9FTV9HZXRGaXJzdFZpc2libGVMaW5lKHduZFB0cik7CiAJSU5UMzIgdmxjID0gRURJVF9HZXRWaXNpYmxlTGluZUNvdW50KHduZFB0cik7CiAJSU5UMzIgd3cgPSBFRElUX0dldFduZFdpZHRoKHduZFB0cik7CiAJSU5UMzIgY3cgPSBFRElUX0dldEF2ZUNoYXJXaWR0aCh3bmRQdHIpOwpAQCAtMjYzNCw4ICsyNjQwLDggQEAKIAlJTlQzMiBkeCA9IDA7CiAKIAlFRElUX0dldFNlbCh3bmRQdHIsIE5VTEwsICZlKTsKLQlsID0gKElOVDMyKUVESVRfRU1fTGluZUZyb21DaGFyKHduZFB0ciwgZSwgMCk7Ci0JbGkgPSAoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsLCAwKTsKKwlsID0gKElOVDMyKUVESVRfRU1fTGluZUZyb21DaGFyKHduZFB0ciwgZSk7CisJbGkgPSAoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsKTsKIAl4ID0gRURJVF9XbmRYRnJvbUNvbCh3bmRQdHIsIGwsIGUgLSBsaSk7CiAJaWYgKGwgPj0gZnYgKyB2bGMpCiAJCWR5ID0gbCAtIHZsYyArIDEgLSBmdjsKQEAgLTI2NjUsNyArMjY3MSw3IEBACiAgKglFTV9TRVRIQU5ETEUKICAqCiAgKi8KLXN0YXRpYyBMUkVTVUxUIEVESVRfRU1fU2V0SGFuZGxlKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitzdGF0aWMgTFJFU1VMVCBFRElUX0VNX1NldEhhbmRsZShXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtKQogewogCUVESVRTVEFURSAqZXMgPSBFRElUU1RBVEVQVFIod25kUHRyKTsKIApAQCAtMjY4MCwxMiArMjY4NiwxMiBAQAogCQllcy0+TGluZUNvdW50ID0gMDsKIAkJZXMtPkZpcnN0VmlzaWJsZUxpbmUgPSAwOwogCQllcy0+U2VsU3RhcnQgPSBlcy0+U2VsRW5kID0gMDsKLQkJRURJVF9FTV9FbXB0eVVuZG9CdWZmZXIod25kUHRyLCAwLCAwKTsKLQkJRURJVF9FTV9TZXRNb2RpZnkod25kUHRyLCBGQUxTRSwgMCk7CisJCUVESVRfRU1fRW1wdHlVbmRvQnVmZmVyKHduZFB0cik7CisJCUVESVRfRU1fU2V0TW9kaWZ5KHduZFB0ciwgRkFMU0UpOwogCQlFRElUX0J1aWxkTGluZURlZnMod25kUHRyKTsKLQkJaWYgKEVESVRfR2V0UmVkcmF3KHduZFB0cikpCisJCWlmICghSXNOb1JlZHJhdyh3bmRQdHIpKQogCQkJSW52YWxpZGF0ZVJlY3QzMiggd25kUHRyLT5od25kU2VsZiwgTlVMTCwgVFJVRSApOwotCQlFRElUX0VNX1Njcm9sbENhcmV0KHduZFB0ciwgMCwgMCk7CisJCUVESVRfRU1fU2Nyb2xsQ2FyZXQod25kUHRyKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0yNjk2LDcgKzI3MDIsNyBAQAogICoJRU1fU0VUSEFORExFMTYKICAqCiAgKi8KLXN0YXRpYyBMUkVTVUxUIEVESVRfRU1fU2V0SGFuZGxlMTYoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3N0YXRpYyBMUkVTVUxUIEVESVRfRU1fU2V0SGFuZGxlMTYoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSkKIHsKIAlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7CiAKQEAgLTI3MTEsMTIgKzI3MTcsMTIgQEAKIAkJZXMtPkxpbmVDb3VudCA9IDA7CiAJCWVzLT5GaXJzdFZpc2libGVMaW5lID0gMDsKIAkJZXMtPlNlbFN0YXJ0ID0gZXMtPlNlbEVuZCA9IDA7Ci0JCUVESVRfRU1fRW1wdHlVbmRvQnVmZmVyKHduZFB0ciwgMCwgMCk7Ci0JCUVESVRfRU1fU2V0TW9kaWZ5KHduZFB0ciwgRkFMU0UsIDApOworCQlFRElUX0VNX0VtcHR5VW5kb0J1ZmZlcih3bmRQdHIpOworCQlFRElUX0VNX1NldE1vZGlmeSh3bmRQdHIsIEZBTFNFKTsKIAkJRURJVF9CdWlsZExpbmVEZWZzKHduZFB0cik7Ci0JCWlmIChFRElUX0dldFJlZHJhdyh3bmRQdHIpKQorCQlpZiAoIUlzTm9SZWRyYXcod25kUHRyKSkKIAkJCUludmFsaWRhdGVSZWN0MzIoIHduZFB0ci0+aHduZFNlbGYsIE5VTEwsIFRSVUUgKTsKLQkJRURJVF9FTV9TY3JvbGxDYXJldCh3bmRQdHIsIDAsIDApOworCQlFRElUX0VNX1Njcm9sbENhcmV0KHduZFB0cik7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMjc4NCwxMSArMjc5MCwxNCBAQAogICoJRU1fU0VUTU9ESUZZCiAgKgogICovCi1zdGF0aWMgTFJFU1VMVCBFRElUX0VNX1NldE1vZGlmeShXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorc3RhdGljIExSRVNVTFQgRURJVF9FTV9TZXRNb2RpZnkoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSkKIHsKIAlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7CiAKLQllcy0+VGV4dENoYW5nZWQgPSAoQk9PTDMyKXdQYXJhbTsKKwlpZiggd1BhcmFtICkKKwkgICAgZXMtPmVTdGF0ZSB8PSBFRl9URVhUQ0hBTkdFRDsKKwllbHNlCisJICAgIGVzLT5lU3RhdGUgJj0gfkVGX1RFWFRDSEFOR0VEOwogCXJldHVybiAwOwogfQogCkBAIC0yODAwLDcgKzI4MDksNyBAQAogICoJRklYTUU6IFRoaXMgaW1sZW1lbnRhdGlvbiBpcyB3YXkgdG9vIHNpbXBsZQogICoKICAqLwotc3RhdGljIExSRVNVTFQgRURJVF9FTV9TZXRQYXNzd29yZENoYXIoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3N0YXRpYyBMUkVTVUxUIEVESVRfRU1fU2V0UGFzc3dvcmRDaGFyKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0pCiB7CiAJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOwogCkBAIC0yODE0LDcgKzI4MjMsNyBAQAogICoJRU1fU0VUUkVBRE9OTFkKICAqCiAgKi8KLXN0YXRpYyBMUkVTVUxUIEVESVRfRU1fU2V0UmVhZE9ubHkoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3N0YXRpYyBMUkVTVUxUIEVESVRfRU1fU2V0UmVhZE9ubHkoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSkKIHsKIAlpZiAoKEJPT0wzMil3UGFyYW0pCiAJCXduZFB0ci0+ZHdTdHlsZSB8PSBFU19SRUFET05MWTsKQEAgLTI4NTcsNyArMjg2Niw3IEBACiB7CiAJSU5UMzIgbnMgPSAoSU5UMzIpd1BhcmFtOwogCUlOVDMyIG5lID0gKElOVDMyKWxQYXJhbTsKLQlJTlQzMiB0bCA9IChJTlQzMilFRElUX1dNX0dldFRleHRMZW5ndGgod25kUHRyLCAwLCAwKTsKKwlJTlQzMiB0bCA9IChJTlQzMilFRElUX1dNX0dldFRleHRMZW5ndGgod25kUHRyKTsKIAogCWlmIChucyA9PSAtMSkgewogCQlFRElUX0dldFNlbCh3bmRQdHIsIE5VTEwsICZuZSk7CkBAIC0yODkwLDcgKzI4OTksNyBAQAogCQluZSA9IC0xOwogCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgbnMsIG5lKTsKIAlpZiAoIXdQYXJhbSkKLQkJRURJVF9FTV9TY3JvbGxDYXJldCh3bmRQdHIsIDAsIDApOworCQlFRElUX0VNX1Njcm9sbENhcmV0KHduZFB0cik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0yOTY4LDcgKzI5NzcsNyBAQAogICoJRU1fVU5ETyAvIFdNX1VORE8KICAqCiAgKi8KLXN0YXRpYyBMUkVTVUxUIEVESVRfRU1fVW5kbyhXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorc3RhdGljIExSRVNVTFQgRURJVF9FTV9VbmRvKFdORCAqd25kUHRyKQogewogCUVESVRTVEFURSAqZXMgPSBFRElUU1RBVEVQVFIod25kUHRyKTsKIAlMUFNUUiB1dGV4dCA9IHhzdHJkdXAoRURJVF9HZXRVbmRvUG9pbnRlcih3bmRQdHIpKTsKQEAgLTI5NzcsNyArMjk4Niw3IEBACiAJCQllcy0+VW5kb0luc2VydExlbiwgdXRleHQpOwogCiAJRURJVF9FTV9TZXRTZWwod25kUHRyLCBlcy0+VW5kb1BvcywgZXMtPlVuZG9Qb3MgKyBlcy0+VW5kb0luc2VydExlbik7Ci0JRURJVF9FTV9FbXB0eVVuZG9CdWZmZXIod25kUHRyLCAwLCAwKTsKKwlFRElUX0VNX0VtcHR5VW5kb0J1ZmZlcih3bmRQdHIpOwogCUVESVRfRU1fUmVwbGFjZVNlbCh3bmRQdHIsIFRSVUUsIChMUEFSQU0pdXRleHQpOwogCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgZXMtPlVuZG9Qb3MsIGVzLT5VbmRvUG9zICsgZXMtPlVuZG9JbnNlcnRMZW4pOwogCWZyZWUodXRleHQpOwpAQCAtMzAzMSw3ICszMDQwLDcgQEAKICAqCVdNX0NMRUFSCiAgKgogICovCi1zdGF0aWMgTFJFU1VMVCBFRElUX1dNX0NsZWFyKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitzdGF0aWMgTFJFU1VMVCBFRElUX1dNX0NsZWFyKFdORCAqd25kUHRyKQogewogCUVESVRfRU1fUmVwbGFjZVNlbCh3bmRQdHIsIFRSVUUsIChMUEFSQU0pIiIpOwogCkBAIC0zMDUxLDIzICszMDYwLDIzIEBACiAKIAlzd2l0Y2ggKExPV09SRCh3UGFyYW0pKSB7CiAJCWNhc2UgRU1fVU5ETzMyOgkKLQkJCUVESVRfRU1fVW5kbyh3bmRQdHIsIDAsIDApOworCQkJRURJVF9FTV9VbmRvKHduZFB0cik7CiAJCQlicmVhazsKIAkJY2FzZSBXTV9DVVQ6Ci0JCQlFRElUX1dNX0N1dCh3bmRQdHIsIDAsIDApOworCQkJRURJVF9XTV9DdXQod25kUHRyKTsKIAkJCWJyZWFrOwogCQljYXNlIFdNX0NPUFk6Ci0JCQlFRElUX1dNX0NvcHkod25kUHRyLCAwLCAwKTsKKwkJCUVESVRfV01fQ29weSh3bmRQdHIpOwogCQkJYnJlYWs7CiAJCWNhc2UgV01fUEFTVEU6Ci0JCQlFRElUX1dNX1Bhc3RlKHduZFB0ciwgMCwgMCk7CisJCQlFRElUX1dNX1Bhc3RlKHduZFB0cik7CiAJCQlicmVhazsKIAkJY2FzZSBXTV9DTEVBUjoKLQkJCUVESVRfV01fQ2xlYXIod25kUHRyLCAwLCAwKTsKKwkJCUVESVRfV01fQ2xlYXIod25kUHRyKTsKIAkJCWJyZWFrOwogCQljYXNlIEVNX1NFVFNFTDMyOgogCQkJRURJVF9FTV9TZXRTZWwod25kUHRyLCAwLCAtMSk7Ci0JCQlFRElUX0VNX1Njcm9sbENhcmV0KHduZFB0ciwgMCwgMCk7CisJCQlFRElUX0VNX1Njcm9sbENhcmV0KHduZFB0cik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWRwcmludGZfZWRpdChzdGRkZWIsICJlZGl0OiB1bmtub3duIG1lbnUgaXRlbSwgcGxlYXNlIHJlcG9ydFxuIik7CkBAIC0zMTAzLDcgKzMxMTIsNyBAQAogICoJV01fQ09QWQogICoKICAqLwotc3RhdGljIExSRVNVTFQgRURJVF9XTV9Db3B5KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitzdGF0aWMgTFJFU1VMVCBFRElUX1dNX0NvcHkoV05EICp3bmRQdHIpCiB7CiAJSU5UMzIgczsKIAlJTlQzMiBlOwpAQCAtMzE3NCwxNCArMzE4MywxNCBAQAogCX0KIAllcy0+QnVmU2l6ZSA9IExvY2FsU2l6ZTMyKGVzLT5oQnVmMzIpIC0gMTsKIAllcy0+VW5kb0J1ZlNpemUgPSBMb2NhbFNpemUzMihlcy0+aFVuZG9CdWYpIC0gMTsKLQlFRElUX0VNX0VtcHR5VW5kb0J1ZmZlcih3bmRQdHIsIDAsIDApOworCUVESVRfRU1fRW1wdHlVbmRvQnVmZmVyKHduZFB0cik7CiAJdGV4dCA9IEVESVRfR2V0UG9pbnRlcih3bmRQdHIpOwogCSp0ZXh0ID0gJ1wwJzsKIAlFRElUX0J1aWxkTGluZURlZnMod25kUHRyKTsKIAlFRElUX1dNX1NldEZvbnQod25kUHRyLCAwLCAwKTsKIAlpZiAoY3MtPmxwc3pOYW1lICYmICooY3MtPmxwc3pOYW1lKSAhPSAnXDAnKQogCQlFRElUX0VNX1JlcGxhY2VTZWwod25kUHRyLCAoV1BBUkFNMzIpRkFMU0UsIChMUEFSQU0pY3MtPmxwc3pOYW1lKTsKLQlFRElUX1dNX1NldFJlZHJhdyh3bmRQdHIsIFRSVUUsIDApOworCUVESVRfV01fU2V0UmVkcmF3KHduZFB0ciwgVFJVRSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMxOTEsMTAgKzMyMDAsMTAgQEAKICAqCVdNX0NVVAogICoKICAqLwotc3RhdGljIExSRVNVTFQgRURJVF9XTV9DdXQoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3N0YXRpYyBMUkVTVUxUIEVESVRfV01fQ3V0KFdORCAqd25kUHRyKQogewotCUVESVRfV01fQ29weSh3bmRQdHIsIDAsIDApOwotCUVESVRfV01fQ2xlYXIod25kUHRyLCAwLCAwKTsKKwlFRElUX1dNX0NvcHkod25kUHRyKTsKKwlFRElUX1dNX0NsZWFyKHduZFB0cik7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0zMjA0LDcgKzMyMTMsNyBAQAogICoJV01fREVTVFJPWQogICoKICAqLwotc3RhdGljIExSRVNVTFQgRURJVF9XTV9EZXN0cm95KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitzdGF0aWMgTFJFU1VMVCBFRElUX1dNX0Rlc3Ryb3koV05EICp3bmRQdHIpCiB7CiAJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOwogCkBAIC0zMjE5LDcgKzMyMjgsOCBAQAogCWVsc2UKIAkJTE9DQUxfRnJlZSh3bmRQdHItPmhJbnN0YW5jZSwgZXMtPmhCdWYxNik7CiAJZnJlZShlcyk7Ci0JKihFRElUU1RBVEUgKiopJnduZFB0ci0+d0V4dHJhID0gTlVMTDsKKwl3bmRQdHItPndFeHRyYVswXSA9IDA7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzIyOSw3ICszMjM5LDcgQEAKICAqCVdNX0VOQUJMRQogICoKICAqLwotc3RhdGljIExSRVNVTFQgRURJVF9XTV9FbmFibGUoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3N0YXRpYyBMUkVTVUxUIEVESVRfV01fRW5hYmxlKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0pCiB7CiAJRURJVF9JbnZhbGlkYXRlVGV4dCh3bmRQdHIsIDAsIC0xKTsKIAlyZXR1cm4gMDsKQEAgLTMyNDEsNyArMzI1MSw3IEBACiAgKglXTV9FUkFTRUJLR05ECiAgKgogICovCi1zdGF0aWMgTFJFU1VMVCBFRElUX1dNX0VyYXNlQmtHbmQoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3N0YXRpYyBMUkVTVUxUIEVESVRfV01fRXJhc2VCa0duZChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtKQogewogCUhCUlVTSDMyIGhCcnVzaDsKIAlSRUNUMzIgcmM7CkBAIC0zMjY5LDcgKzMyNzksNyBAQAogICoJV01fR0VURExHQ09ERQogICoKICAqLwotc3RhdGljIExSRVNVTFQgRURJVF9XTV9HZXREbGdDb2RlKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitzdGF0aWMgTFJFU1VMVCBFRElUX1dNX0dldERsZ0NvZGUoV05EICp3bmRQdHIpCiB7CiAJcmV0dXJuIERMR0NfSEFTU0VUU0VMIHwgRExHQ19XQU5UQ0hBUlMgfCBETEdDX1dBTlRBUlJPV1M7CiB9CkBAIC0zMjgwLDcgKzMyOTAsNyBAQAogICoJV01fR0VURk9OVAogICoKICAqLwotc3RhdGljIExSRVNVTFQgRURJVF9XTV9HZXRGb250KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitzdGF0aWMgTFJFU1VMVCBFRElUX1dNX0dldEZvbnQoV05EICp3bmRQdHIpCiB7CiAJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOwogCkBAIC0zMzEzLDcgKzMzMjMsNyBAQAogICoJV01fR0VUVEVYVExFTkdUSAogICoKICAqLwotc3RhdGljIExSRVNVTFQgRURJVF9XTV9HZXRUZXh0TGVuZ3RoKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitzdGF0aWMgTFJFU1VMVCBFRElUX1dNX0dldFRleHRMZW5ndGgoV05EICp3bmRQdHIpCiB7CiAJTFBTVFIgdGV4dCA9IEVESVRfR2V0UG9pbnRlcih3bmRQdHIpOwogCkBAIC0zNDA4LDcgKzM0MTgsNyBAQAogCiAJLyogdW5kbyAqLwogCUVuYWJsZU1lbnVJdGVtMzIoaFBvcHVwLCAwLCBNRl9CWVBPU0lUSU9OIHwKLQkJKEVESVRfRU1fQ2FuVW5kbyh3bmRQdHIsIDAsIDApID8gTUZfRU5BQkxFRCA6IE1GX0dSQVlFRCkpOworCQkoRURJVF9FTV9DYW5VbmRvKHduZFB0cikgPyBNRl9FTkFCTEVEIDogTUZfR1JBWUVEKSk7CiAJLyogY3V0ICovCiAJRW5hYmxlTWVudUl0ZW0zMihoUG9wdXAsIDIsIE1GX0JZUE9TSVRJT04gfAogCQkoKGUgLSBzKSAmJiAhSXNQYXNzd29yZCh3bmRQdHIpID8gTUZfRU5BQkxFRCA6IE1GX0dSQVlFRCkpOwpAQCAtMzQyMywxMSArMzQzMyw2MyBAQAogCQkoKGUgLSBzKSA/IE1GX0VOQUJMRUQgOiBNRl9HUkFZRUQpKTsKIAkvKiBzZWxlY3QgYWxsICovCiAJRW5hYmxlTWVudUl0ZW0zMihoUG9wdXAsIDcsIE1GX0JZUE9TSVRJT04gfAotCQkocyB8fCAoZSAhPSBFRElUX1dNX0dldFRleHRMZW5ndGgod25kUHRyLCAwLCAwKSkgPyBNRl9FTkFCTEVEIDogTUZfR1JBWUVEKSk7CisJCShzIHx8IChlICE9IEVESVRfV01fR2V0VGV4dExlbmd0aCh3bmRQdHIpKSA/IE1GX0VOQUJMRUQgOiBNRl9HUkFZRUQpKTsKIAogCXJldHVybiAwOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgICBFRElUX0NoZWNrQ29tYm8KKyAqCisgKi8KK3N0YXRpYyBCT09MMzIgRURJVF9DaGVja0NvbWJvKFdORCAqd25kUHRyLCBVSU5UMzIgbXNnLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICBIV05EMzIgaExCb3g7CisKKyAgIGlmKCBXSURHRVRTX0lzQ29udHJvbDMyKCB3bmRQdHItPnBhcmVudCwgQklDMzJfQ09NQk8gKSAmJgorICAgICAgICAgICAgKGhMQm94ID0gQ09NQk9fR2V0TEJXaW5kb3coIHduZFB0ci0+cGFyZW50ICkpICkKKyAgIHsKKyAgICAgICBIV05EMzIgaENvbWJvID0gd25kUHRyLT5wYXJlbnQtPmh3bmRTZWxmOworICAgICAgIEJPT0wzMiBiVUlGbGlwID0gVFJVRTsKKworICAgICAgIGRwcmludGZfY29tYm8oc3RkZGViLCAiRURJVF9DaGVja0NvbWJvIFslMDR4XTogaGFuZGxpbmcgbXNnICUwNHggKCUwNHgpXG4iLAorCQkJCSAgd25kUHRyLT5od25kU2VsZiwgKFVJTlQxNiltc2csIChVSU5UMTYpd1BhcmFtICk7CisgICAgICAgc3dpdGNoKCBtc2cgKQorICAgICAgIHsKKwkgY2FzZSBXTV9LRVlET1dOOiAvKiBIYW5kbGUgRjQgYW5kIGFycm93IGtleXMgKi8KKwkgICBpZiggd1BhcmFtICE9IFZLX0Y0ICkKKwkgICB7CisJICAgICAgIGJVSUZsaXAgPSAoQk9PTDMyKVNlbmRNZXNzYWdlMzJBKCBoQ29tYm8sIENCX0dFVEVYVEVOREVEVUkzMiwgMCwgMCApOworCSAgICAgICBpZiggU2VuZE1lc3NhZ2UzMkEoIGhDb21ibywgQ0JfR0VURFJPUFBFRFNUQVRFMzIsIDAsIDAgKSApIGJVSUZsaXAgPSBGQUxTRTsKKwkgICB9CisKKwkgICBpZiggIWJVSUZsaXAgKQorCSAgICAgICBTZW5kTWVzc2FnZTMyQSggaExCb3gsIFdNX0tFWURPV04sIHdQYXJhbSwgMCApOworCSAgIGVsc2UKKwkgICB7CisJICAgICAgIC8qIG1ha2Ugc3VyZSBDb21ib0xCb3ggcG9wcyB1cCAqLworCisJICAgICAgIFNlbmRNZXNzYWdlMzJBKCBoQ29tYm8sIENCX1NFVEVYVEVOREVEVUkzMiwgMCwgMCApOworCSAgICAgICBTZW5kTWVzc2FnZTMyQSggaExCb3gsIFdNX0tFWURPV04sIFZLX0Y0LCAwICk7IAorCSAgICAgICBTZW5kTWVzc2FnZTMyQSggaENvbWJvLCBDQl9TRVRFWFRFTkRFRFVJMzIsIDEsIDAgKTsKKwkgICB9CisJICAgYnJlYWs7CisKKwkgY2FzZSBXTV9TWVNLRVlET1dOOiAvKiBIYW5kbGUgQWx0K3VwL2Rvd24gYXJyb3dzICovCisJICAgYlVJRmxpcCA9IChCT09MMzIpU2VuZE1lc3NhZ2UzMkEoIGhDb21ibywgQ0JfR0VURVhURU5ERURVSTMyLCAwLCAwICk7CisKKwkgICBpZiggYlVJRmxpcCApCisJICAgeworCSAgICAgYlVJRmxpcCA9IChCT09MMzIpU2VuZE1lc3NhZ2UzMkEoIGhDb21ibywgQ0JfR0VURFJPUFBFRFNUQVRFMzIsIDAsIDAgKTsKKwkgICAgIFNlbmRNZXNzYWdlMzJBKCBoQ29tYm8sIENCX1NIT1dEUk9QRE9XTjMyLCAoYlVJRmxpcCkgPyBGQUxTRSA6IFRSVUUsIDAgKTsKKwkgICB9IGVsc2UgU2VuZE1lc3NhZ2UzMkEoIGhMQm94LCBXTV9LRVlET1dOLCBWS19GNCwgMCApOworCSAgIGJyZWFrOworICAgICAgIH0KKyAgICAgICByZXR1cm4gVFJVRTsKKyAgIH0KKyAgIHJldHVybiBGQUxTRTsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTM0NTIsOCArMzUxNCwxMiBAQAogCiAJRURJVF9HZXRTZWwod25kUHRyLCAmcywgJmUpOwogCXN3aXRjaCAod1BhcmFtKSB7Ci0JY2FzZSBWS19MRUZUOgorCWNhc2UgVktfRjQ6CiAJY2FzZSBWS19VUDoKKwkJaWYoIEVESVRfQ2hlY2tDb21ibyh3bmRQdHIsIFdNX0tFWURPV04sIHdQYXJhbSwgbFBhcmFtKSApIGJyZWFrOworCQlpZiggd1BhcmFtID09IFZLX0Y0ICkgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBWS19MRUZUOgogCQlpZiAoSXNNdWx0aUxpbmUod25kUHRyKSAmJiAod1BhcmFtID09IFZLX1VQKSkKIAkJCUVESVRfTW92ZVVwd2FyZCh3bmRQdHIsIHNoaWZ0KTsKIAkJZWxzZQpAQCAtMzQ2Miw4ICszNTI4LDEwIEBACiAJCQllbHNlCiAJCQkJRURJVF9Nb3ZlQmFja3dhcmQod25kUHRyLCBzaGlmdCk7CiAJCWJyZWFrOwotCWNhc2UgVktfUklHSFQ6CiAJY2FzZSBWS19ET1dOOgorCQlpZiggRURJVF9DaGVja0NvbWJvKHduZFB0ciwgV01fS0VZRE9XTiwgd1BhcmFtLCBsUGFyYW0pICkgYnJlYWs7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgVktfUklHSFQ6CiAJCWlmIChJc011bHRpTGluZSh3bmRQdHIpICYmICh3UGFyYW0gPT0gVktfRE9XTikpCiAJCQlFRElUX01vdmVEb3dud2FyZCh3bmRQdHIsIHNoaWZ0KTsKIAkJZWxzZSBpZiAoY29udHJvbCkKQEAgLTM0ODgsNyArMzU1Niw3IEBACiAJY2FzZSBWS19CQUNLOgogCQlpZiAoIUlzUmVhZE9ubHkod25kUHRyKSAmJiAhY29udHJvbCkKIAkJCWlmIChlICE9IHMpCi0JCQkJRURJVF9XTV9DbGVhcih3bmRQdHIsIDAsIDApOworCQkJCUVESVRfV01fQ2xlYXIod25kUHRyKTsKIAkJCWVsc2UKIAkJCQlFRElUX0RlbExlZnQod25kUHRyKTsKIAkJYnJlYWs7CkBAIC0zNDk2LDkgKzM1NjQsOSBAQAogCQlpZiAoIUlzUmVhZE9ubHkod25kUHRyKSAmJiAhKHNoaWZ0ICYmIGNvbnRyb2wpKQogCQkJaWYgKGUgIT0gcykgewogCQkJCWlmIChzaGlmdCkKLQkJCQkJRURJVF9XTV9DdXQod25kUHRyLCAwLCAwKTsKKwkJCQkJRURJVF9XTV9DdXQod25kUHRyKTsKIAkJCQllbHNlCi0JCQkJCUVESVRfV01fQ2xlYXIod25kUHRyLCAwLCAwKTsKKwkJCQkJRURJVF9XTV9DbGVhcih3bmRQdHIpOwogCQkJfSBlbHNlIHsKIAkJCQlpZiAoc2hpZnQpCiAJCQkJCUVESVRfRGVsTGVmdCh3bmRQdHIpOwpAQCAtMzUxMSw5ICszNTc5LDkgQEAKIAljYXNlIFZLX0lOU0VSVDoKIAkJaWYgKHNoaWZ0KSB7CiAJCQlpZiAoIUlzUmVhZE9ubHkod25kUHRyKSkKLQkJCQlFRElUX1dNX1Bhc3RlKHduZFB0ciwgMCwgMCk7CisJCQkJRURJVF9XTV9QYXN0ZSh3bmRQdHIpOwogCQl9IGVsc2UgaWYgKGNvbnRyb2wpCi0JCQlFRElUX1dNX0NvcHkod25kUHRyLCAwLCAwKTsKKwkJCUVESVRfV01fQ29weSh3bmRQdHIpOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIDA7CkBAIC0zNTI1LDExICszNTkzLDEzIEBACiAgKglXTV9LSUxMRk9DVVMKICAqCiAgKi8KLXN0YXRpYyBMUkVTVUxUIEVESVRfV01fS2lsbEZvY3VzKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitzdGF0aWMgTFJFU1VMVCBFRElUX1dNX0tpbGxGb2N1cyhXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtKQogewogCUlOVDMyIHM7CiAJSU5UMzIgZTsKKwlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7CiAKKwllcy0+ZVN0YXRlICY9IH5FRl9GT0NVU0VEOwogCURlc3Ryb3lDYXJldDMyKCk7CiAJaWYoISh3bmRQdHItPmR3U3R5bGUgJiBFU19OT0hJREVTRUwpKSB7CiAJCUVESVRfRU1fR2V0U2VsKHduZFB0ciwgKFdQQVJBTTMyKSZzLCAoTFBBUkFNKSZlKTsKQEAgLTM1NTgsMTMgKzM2MjgsMTMgQEAKIAlMUFNUUiB0ZXh0ID0gRURJVF9HZXRQb2ludGVyKHduZFB0cik7CiAKIAlFRElUX0dldFNlbCh3bmRQdHIsIE5VTEwsICZlKTsKLQlsID0gKElOVDMyKUVESVRfRU1fTGluZUZyb21DaGFyKHduZFB0ciwgZSwgMCk7Ci0JbGkgPSAoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsLCAwKTsKLQlsbCA9IChJTlQzMilFRElUX0VNX0xpbmVMZW5ndGgod25kUHRyLCBlLCAwKTsKKwlsID0gKElOVDMyKUVESVRfRU1fTGluZUZyb21DaGFyKHduZFB0ciwgZSk7CisJbGkgPSAoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsKTsKKwlsbCA9IChJTlQzMilFRElUX0VNX0xpbmVMZW5ndGgod25kUHRyLCBlKTsKIAlzID0gbGkgKyBFRElUX0NhbGxXb3JkQnJlYWtQcm9jICh3bmRQdHIsIHRleHQgKyBsaSwgZSAtIGxpLCBsbCwgV0JfTEVGVCk7CiAJZSA9IGxpICsgRURJVF9DYWxsV29yZEJyZWFrUHJvYyh3bmRQdHIsIHRleHQgKyBsaSwgZSAtIGxpLCBsbCwgV0JfUklHSFQpOwogCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgcywgZSk7Ci0JRURJVF9FTV9TY3JvbGxDYXJldCh3bmRQdHIsIDAsIDApOworCUVESVRfRU1fU2Nyb2xsQ2FyZXQod25kUHRyKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzU4Miw3ICszNjUyLDcgQEAKIAlJTlQzMiBjOwogCUlOVDMyIHM7CiAJSU5UMzIgZTsKLQlJTlQzMiBmdiA9IChJTlQzMilFRElUX0VNX0dldEZpcnN0VmlzaWJsZUxpbmUod25kUHRyLCAwLCAwKTsKKwlJTlQzMiBmdiA9IChJTlQzMilFRElUX0VNX0dldEZpcnN0VmlzaWJsZUxpbmUod25kUHRyKTsKIAlJTlQzMiB2bGMgPSBFRElUX0dldFZpc2libGVMaW5lQ291bnQod25kUHRyKTsKIAlJTlQzMiBsaTsKIApAQCAtMzU5MSwxNCArMzY2MSwxNCBAQAogCWwgPSBNSU4oZnYgKyB2bGMgLSAxLCBNQVgoZnYsIGwpKTsKIAl4ID0gTUlOKEVESVRfR2V0V25kV2lkdGgod25kUHRyKSwgTUFYKDAsIHgpKTsKIAljID0gRURJVF9Db2xGcm9tV25kWCh3bmRQdHIsIGwsIHgpOwotCWxpID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCwgMCk7CisJbGkgPSAoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsKTsKIAllID0gbGkgKyBjOwogCWlmIChHZXRLZXlTdGF0ZTMyKFZLX1NISUZUKSAmIDB4ODAwMCkKIAkJRURJVF9HZXRTZWwod25kUHRyLCAmcywgTlVMTCk7CiAJZWxzZQogCQlzID0gZTsKIAlFRElUX1NldFNlbCh3bmRQdHIsIHMsIGUpOwotCUVESVRfRU1fU2Nyb2xsQ2FyZXQod25kUHRyLCAwLCAwKTsKKwlFRElUX0VNX1Njcm9sbENhcmV0KHduZFB0cik7CiAJU2V0VGltZXIzMih3bmRQdHItPmh3bmRTZWxmLCAwLCAxMDAsIE5VTEwpOwogCXJldHVybiAwOwogfQpAQCAtMzYzOCwxNCArMzcwOCwxNCBAQAogCWlmIChHZXRDYXB0dXJlMzIoKSA9PSB3bmRQdHItPmh3bmRTZWxmKSB7CiAJCXggPSAoSU5UMzIpKElOVDE2KUxPV09SRChsUGFyYW0pOwogCQl5ID0gKElOVDMyKShJTlQxNilISVdPUkQobFBhcmFtKTsKLQkJZnYgPSAoSU5UMzIpRURJVF9FTV9HZXRGaXJzdFZpc2libGVMaW5lKHduZFB0ciwgMCwgMCk7CisJCWZ2ID0gKElOVDMyKUVESVRfRU1fR2V0Rmlyc3RWaXNpYmxlTGluZSh3bmRQdHIpOwogCQl2bGMgPSBFRElUX0dldFZpc2libGVMaW5lQ291bnQod25kUHRyKTsKIAkJbCA9IEVESVRfTGluZUZyb21XbmRZKHduZFB0ciwgeSk7CiAJCWwgPSBNSU4oZnYgKyB2bGMgLSAxLCBNQVgoZnYsIGwpKTsKIAkJeCA9IE1JTihFRElUX0dldFduZFdpZHRoKHduZFB0ciksIE1BWCgwLCB4KSk7CiAJCWMgPSBFRElUX0NvbEZyb21XbmRYKHduZFB0ciwgbCwgeCk7CiAJCUVESVRfR2V0U2VsKHduZFB0ciwgJnMsIE5VTEwpOwotCQlsaSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwsIDApOworCQlsaSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwpOwogCQlFRElUX1NldFNlbCh3bmRQdHIsIHMsIGxpICsgYyk7CiAJfQogCS8qCkBAIC0zNjYxLDEzICszNzMxLDEzIEBACiAgKglXTV9QQUlOVAogICoKICAqLwotc3RhdGljIExSRVNVTFQgRURJVF9XTV9QYWludChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorc3RhdGljIExSRVNVTFQgRURJVF9XTV9QYWludChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtKQogewogCVBBSU5UU1RSVUNUMzIgcHM7CiAJSU5UMzIgaTsKLQlJTlQzMiBmdiA9IChJTlQzMilFRElUX0VNX0dldEZpcnN0VmlzaWJsZUxpbmUod25kUHRyLCAwLCAwKTsKKwlJTlQzMiBmdiA9IChJTlQzMilFRElUX0VNX0dldEZpcnN0VmlzaWJsZUxpbmUod25kUHRyKTsKIAlJTlQzMiB2bGMgPSBFRElUX0dldFZpc2libGVMaW5lQ291bnQod25kUHRyKTsKLQlJTlQzMiBsYyA9IChJTlQzMilFRElUX0VNX0dldExpbmVDb3VudCh3bmRQdHIsIDAsIDApOworCUlOVDMyIGxjID0gKElOVDMyKUVESVRfRU1fR2V0TGluZUNvdW50KHduZFB0cik7CiAJSERDMzIgaGRjOwogCUhGT05UMzIgaEZvbnQ7CiAJSEZPTlQzMiBvbGRGb250ID0gMDsKQEAgLTM2NzYsMTQgKzM3NDYsMTUgQEAKIAlSRUNUMzIgcmNSZ247CiAgCUxSRVNVTFQgcG9zOwogIAlJTlQzMiBlOworCUVESVRTVEFURSAqZXMgPSBFRElUU1RBVEVQVFIod25kUHRyKTsKIAlCT09MMzIgcmV2ID0gSXNXaW5kb3dFbmFibGVkMzIod25kUHRyLT5od25kU2VsZikgJiYKLQkJCQkoKEdldEZvY3VzMzIoKSA9PSB3bmRQdHItPmh3bmRTZWxmKSB8fAorCQkJCSgoZXMtPmVTdGF0ZSAmIEVGX0ZPQ1VTRUQpIHx8CiAJCQkJCSh3bmRQdHItPmR3U3R5bGUgJiBFU19OT0hJREVTRUwpKTsKIAogCWhkYyA9IEJlZ2luUGFpbnQzMih3bmRQdHItPmh3bmRTZWxmLCAmcHMpOwogCUdldENsaWVudFJlY3QzMih3bmRQdHItPmh3bmRTZWxmLCAmcmMpOwogCUludGVyc2VjdENsaXBSZWN0MzIoIGhkYywgcmMubGVmdCwgcmMudG9wLCByYy5yaWdodCwgcmMuYm90dG9tICk7Ci0JaEZvbnQgPSAoSEZPTlQzMilFRElUX1dNX0dldEZvbnQod25kUHRyLCAwLCAwKTsKKwloRm9udCA9IChIRk9OVDMyKUVESVRfV01fR2V0Rm9udCh3bmRQdHIpOwogCWlmIChoRm9udCkKIAkJb2xkRm9udCA9IChIRk9OVDMyKVNlbGVjdE9iamVjdDMyKGhkYywgaEZvbnQpOwogCUVESVRfU0VORF9DVExDT0xPUih3bmRQdHIsIGhkYyk7CkBAIC0zNjk2LDEwICszNzY3LDEwIEBACiAJCQlFRElUX1BhaW50TGluZSh3bmRQdHIsIGhkYywgaSwgcmV2KTsKIAl9CiAJaWYgKGhGb250KSBTZWxlY3RPYmplY3QzMihoZGMsIG9sZEZvbnQpOwotCWlmICh3bmRQdHItPmh3bmRTZWxmID09IEdldEZvY3VzMzIoKSkgeworCWlmIChlcy0+ZVN0YXRlICYgRUZfRk9DVVNFRCkgewogCQlFRElUX0dldFNlbCh3bmRQdHIsIE5VTEwsICZlKTsKLQkJcG9zID0gRURJVF9FTV9Qb3NGcm9tQ2hhcih3bmRQdHIsIGUsIDApOwotCQlTZXRDYXJldFBvczE2KCAoSU5UMTYpTE9XT1JEKHBvcyksIChJTlQxNilISVdPUkQocG9zKSApOworCQlwb3MgPSBFRElUX0VNX1Bvc0Zyb21DaGFyKHduZFB0ciwgZSk7CisJCVNldENhcmV0UG9zMTYoKElOVDE2KUxPV09SRChwb3MpLCAoSU5UMTYpSElXT1JEKHBvcykpOwogCX0KIAlFbmRQYWludDMyKHduZFB0ci0+aHduZFNlbGYsICZwcyk7CiAJcmV0dXJuIDA7CkBAIC0zNzExLDE0ICszNzgyLDEzIEBACiAgKglXTV9QQVNURQogICoKICAqLwotc3RhdGljIExSRVNVTFQgRURJVF9XTV9QYXN0ZShXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorc3RhdGljIExSRVNVTFQgRURJVF9XTV9QYXN0ZShXTkQgKnduZFB0cikKIHsKIAlIR0xPQkFMMTYgaHNyYzsKIAlMUFNUUiBzcmM7CiAKIAlPcGVuQ2xpcGJvYXJkMzIod25kUHRyLT5od25kU2VsZik7Ci0JaWYgKChoc3JjID0gR2V0Q2xpcGJvYXJkRGF0YTE2KENGX1RFWFQpKSkKLSAgICAgICAgeworCWlmICgoaHNyYyA9IEdldENsaXBib2FyZERhdGExNihDRl9URVhUKSkpIHsKIAkJc3JjID0gKExQU1RSKUdsb2JhbExvY2sxNihoc3JjKTsKIAkJRURJVF9FTV9SZXBsYWNlU2VsKHduZFB0ciwgKFdQQVJBTTMyKVRSVUUsIChMUEFSQU0pc3JjKTsKIAkJR2xvYmFsVW5sb2NrMTYoaHNyYyk7CkBAIC0zNzQ4LDEzICszODE4LDE1IEBACiAgKglXTV9TRVRGT0NVUwogICoKICAqLwotc3RhdGljIExSRVNVTFQgRURJVF9XTV9TZXRGb2N1cyhXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorc3RhdGljIExSRVNVTFQgRURJVF9XTV9TZXRGb2N1cyhXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtKQogewogCUlOVDMyIHM7CiAJSU5UMzIgZTsKKwlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7CiAKKwllcy0+ZVN0YXRlIHw9IEVGX0ZPQ1VTRUQ7CiAJRURJVF9HZXRTZWwod25kUHRyLCAmcywgJmUpOwotCUNyZWF0ZUNhcmV0MzIoIHduZFB0ci0+aHduZFNlbGYsIDAsIDIsIEVESVRfR2V0TGluZUhlaWdodCh3bmRQdHIpICk7CisJQ3JlYXRlQ2FyZXQzMih3bmRQdHItPmh3bmRTZWxmLCAwLCAyLCBFRElUX0dldExpbmVIZWlnaHQod25kUHRyKSk7CiAJRURJVF9TZXRTZWwod25kUHRyLCBzLCBlKTsKIAlpZighKHduZFB0ci0+ZHdTdHlsZSAmIEVTX05PSElERVNFTCkpCiAJCUVESVRfSW52YWxpZGF0ZVRleHQod25kUHRyLCBzLCBlKTsKQEAgLTM3ODksMTIgKzM4NjEsMTEgQEAKIAlpZiAoZXMtPmhGb250KSBTZWxlY3RPYmplY3QzMihoZGMsIG9sZEZvbnQpOwogCVJlbGVhc2VEQzMyKHduZFB0ci0+aHduZFNlbGYsIGhkYyk7CiAJRURJVF9CdWlsZExpbmVEZWZzKHduZFB0cik7Ci0JaWYgKChCT09MMzIpbFBhcmFtICYmIEVESVRfR2V0UmVkcmF3KHduZFB0cikpCisJaWYgKChCT09MMzIpbFBhcmFtICYmICFJc05vUmVkcmF3KHduZFB0cikpCiAJCUludmFsaWRhdGVSZWN0MzIoIHduZFB0ci0+aHduZFNlbGYsIE5VTEwsIFRSVUUgKTsKLQlpZiAod25kUHRyLT5od25kU2VsZiA9PSBHZXRGb2N1czMyKCkpIHsKKwlpZiAoZXMtPmVTdGF0ZSAmIEVGX0ZPQ1VTRUQpIHsKIAkJRGVzdHJveUNhcmV0MzIoKTsKLQkJQ3JlYXRlQ2FyZXQzMiggd25kUHRyLT5od25kU2VsZiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCBFRElUX0dldExpbmVIZWlnaHQod25kUHRyKSApOworCQlDcmVhdGVDYXJldDMyKHduZFB0ci0+aHduZFNlbGYsIDAsIDIsIEVESVRfR2V0TGluZUhlaWdodCh3bmRQdHIpKTsKIAkJRURJVF9TZXRTZWwod25kUHRyLCBzLCBlKTsKIAkJU2hvd0NhcmV0MzIod25kUHRyLT5od25kU2VsZik7CiAJfQpAQCAtMzgwNywxMSArMzg3OCwxMiBAQAogICoJV01fU0VUUkVEUkFXCiAgKgogICovCi1zdGF0aWMgTFJFU1VMVCBFRElUX1dNX1NldFJlZHJhdyhXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorc3RhdGljIExSRVNVTFQgRURJVF9XTV9TZXRSZWRyYXcoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSkKIHsKLQlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7Ci0KLQllcy0+UmVkcmF3ID0gKEJPT0wzMil3UGFyYW07CisJaWYoIHdQYXJhbSApCisJICAgIHduZFB0ci0+ZmxhZ3MgJj0gfldJTl9OT19SRURSQVc7CisJZWxzZQorCSAgICB3bmRQdHItPmZsYWdzIHw9IFdJTl9OT19SRURSQVc7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM4MjUsOSArMzg5NywxMiBAQAogewogCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgMCwgLTEpOwogCWlmIChsUGFyYW0pCisJeworCQlkcHJpbnRmX2VkaXQoc3RkZGViLCJcdCclcydcbiIsIChjaGFyKilsUGFyYW0gKTsKIAkJRURJVF9FTV9SZXBsYWNlU2VsKHduZFB0ciwgKFdQQVJBTTMyKUZBTFNFLCBsUGFyYW0pOwotCUVESVRfRU1fU2V0TW9kaWZ5KHduZFB0ciwgVFJVRSwgMCk7Ci0JRURJVF9FTV9TY3JvbGxDYXJldCh3bmRQdHIsIDAsIDApOworCX0KKwlFRElUX0VNX1NldE1vZGlmeSh3bmRQdHIsIFRSVUUpOworCUVESVRfRU1fU2Nyb2xsQ2FyZXQod25kUHRyKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMzg0Niw3ICszOTIxLDcgQEAKIAkKIAlFRElUX0dldFNlbCh3bmRQdHIsIDAsICZlKTsKIAlHZXRDbGllbnRSZWN0MzIod25kUHRyLT5od25kU2VsZiwgJmVzLT5Gb3JtYXRSZWN0KTsKLQlpZiAoRURJVF9HZXRSZWRyYXcod25kUHRyKSAmJgorCWlmICghSXNOb1JlZHJhdyh3bmRQdHIpICYmCiAJCQkoKHdQYXJhbSA9PSBTSVpFX01BWElNSVpFRCkgfHwKIAkJCQkod1BhcmFtID09IFNJWkVfUkVTVE9SRUQpKSkgewogCQlpZiAoSXNNdWx0aUxpbmUod25kUHRyKSAmJiBJc1dvcmRXcmFwKHduZFB0cikpCkBAIC0zODY1LDggKzM5NDAsMTAgQEAKIHN0YXRpYyBMUkVTVUxUIEVESVRfV01fU3lzS2V5RG93bihXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogCWlmICgod1BhcmFtID09IFZLX0JBQ0spICYmIChsUGFyYW0gJiAweDIwMDApICYmCi0JCQkoQk9PTDMyKUVESVRfRU1fQ2FuVW5kbyh3bmRQdHIsIDAsIDApKQotCQlFRElUX0VNX1VuZG8od25kUHRyLCAwLCAwKTsKKwkJCShCT09MMzIpRURJVF9FTV9DYW5VbmRvKHduZFB0cikpCisJCUVESVRfRU1fVW5kbyh3bmRQdHIpOworCWVsc2UgaWYoIHdQYXJhbSA9PSBWS19VUCB8fCB3UGFyYW0gPT0gVktfRE9XTiApCisJCUVESVRfQ2hlY2tDb21ibyggd25kUHRyLCBXTV9TWVNLRVlET1dOLCB3UGFyYW0sIGxQYXJhbSApOwogCXJldHVybiAwOwogfQogCkBAIC0zODk1LDQ4ICszOTcyLDQ0IEBACiAgKi8KIHN0YXRpYyBMUkVTVUxUIEVESVRfV01fVlNjcm9sbChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotCUlOVDMyIGxjID0gKElOVDMyKUVESVRfRU1fR2V0TGluZUNvdW50KHduZFB0ciwgMCwgMCk7Ci0JSU5UMzIgZnYgPSAoSU5UMzIpRURJVF9FTV9HZXRGaXJzdFZpc2libGVMaW5lKHduZFB0ciwgMCwgMCk7Ci0JSU5UMzIgdmxjID0gRURJVF9HZXRWaXNpYmxlTGluZUNvdW50KHduZFB0cik7CisJSU5UMzIgbGMsIGZ2OwogCUlOVDMyIGR5ID0gMDsKIAlCT09MMzIgbm90ID0gVFJVRTsKIAlMUkVTVUxUIHJldCA9IDA7CiAKIAlzd2l0Y2ggKHdQYXJhbSkgewogCWNhc2UgU0JfTElORVVQOgotCQlkeSA9IC0xOwotCQlicmVhazsKIAljYXNlIFNCX0xJTkVET1dOOgotCQlkeSA9IDE7Ci0JCWJyZWFrOwogCWNhc2UgU0JfUEFHRVVQOgotCQlkeSA9IC12bGM7Ci0JCWJyZWFrOwogCWNhc2UgU0JfUEFHRURPV046Ci0JCWR5ID0gdmxjOwotCQlicmVhazsKLQljYXNlIFNCX1RPUDoKLQkJZHkgPSAtZnY7Ci0JCWJyZWFrOwotCWNhc2UgU0JfQk9UVE9NOgotCQlkeSA9IGxjIC0gMSAtIGZ2OwotCQlicmVhazsKLQljYXNlIFNCX1RIVU1CVFJBQ0s6Ci0JCW5vdCA9IEZBTFNFOwotCQkvKiBmYWxsIHRocm91Z2ggKi8KLQljYXNlIFNCX1RIVU1CUE9TSVRJT046Ci0JCWR5ID0gSElXT1JEKHdQYXJhbSkgKiAobGMgLSAxKSAvIDEwMCAtIGZ2OwotCQlicmVhazsKLQkvKiBUaGUgbmV4dCB0d28gYXJlIHVuZG9jdW1lbnRlZCAhICovCi0JY2FzZSBFTV9HRVRUSFVNQjE2OgotCQlyZXQgPSAobGMgPiAxKSA/IE1BS0VMT05HKGZ2ICogMTAwIC8gKGxjIC0gMSksIDApIDogMDsKLQkJYnJlYWs7Ci0JY2FzZSBFTV9MSU5FU0NST0xMMTY6Ci0JCWR5ID0gKElOVDE2KUxPV09SRChsUGFyYW0pOwotCQlicmVhazsKLQljYXNlIFNCX0VORFNDUk9MTDoKKwkJRURJVF9FTV9TY3JvbGwoIHduZFB0ciwgd1BhcmFtICk7CisJCXJldHVybiByZXQ7CiAJZGVmYXVsdDoKLQkJYnJlYWs7CisJCWxjID0gKElOVDMyKUVESVRfRU1fR2V0TGluZUNvdW50KHduZFB0cik7CisJCWZ2ID0gKElOVDMyKUVESVRfRU1fR2V0Rmlyc3RWaXNpYmxlTGluZSh3bmRQdHIpOworCQlzd2l0Y2goIHdQYXJhbSApIHsKKwkJY2FzZSBTQl9UT1A6CisJCQlkeSA9IC1mdjsKKwkJCWJyZWFrOworCQljYXNlIFNCX0JPVFRPTToKKwkJCWR5ID0gbGMgLSAxIC0gZnY7CisJCQlicmVhazsKKwkJY2FzZSBTQl9USFVNQlRSQUNLOgorCQkJbm90ID0gRkFMU0U7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBTQl9USFVNQlBPU0lUSU9OOgorCQkJZHkgPSBISVdPUkQod1BhcmFtKSAqIChsYyAtIDEpIC8gMTAwIC0gZnY7CisJCQlicmVhazsKKwkJLyogVGhlIG5leHQgdHdvIGFyZSB1bmRvY3VtZW50ZWQgISAqLworCQljYXNlIEVNX0dFVFRIVU1CMTY6CisJCQlyZXQgPSAobGMgPiAxKSA/IE1BS0VMT05HKGZ2ICogMTAwIC8gKGxjIC0gMSksIDApIDogMDsKKwkJCWJyZWFrOworCQljYXNlIEVNX0xJTkVTQ1JPTEwxNjoKKwkJCWR5ID0gKElOVDE2KUxPV09SRChsUGFyYW0pOworCQkJYnJlYWs7CisJCWNhc2UgU0JfRU5EU0NST0xMOgorCQkJLyogbm90aGluZyB0byBkbyAqLworCQl9CiAJfQogCWlmIChkeSkgewogCQlFRElUX0VNX0xpbmVTY3JvbGwod25kUHRyLCAwLCBkeSk7CmRpZmYgLS1naXQgYS9jb250cm9scy9saXN0Ym94LmMgYi9jb250cm9scy9saXN0Ym94LmMKaW5kZXggNTdhZmNmNC4uMjBmNjAyOCAxMDA2NDQKLS0tIGEvY29udHJvbHMvbGlzdGJveC5jCisrKyBiL2NvbnRyb2xzL2xpc3Rib3guYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJzcHkuaCIKICNpbmNsdWRlICJ3aW4uaCIKKyNpbmNsdWRlICJjb21iby5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIApAQCAtMjAsNyArMjEsNiBAQAogICogLSBMQlNfVVNFVEFCU1RPUFMKICAqIC0gVW5pY29kZQogICogLSBMb2NhbGUgaGFuZGxpbmcKLSAqIC0gQ09NQk9MQk9YCiAgKi8KIAogLyogSXRlbXMgYXJyYXkgZ3JhbnVsYXJpdHkgKi8KQEAgLTQ1LDcgKzQ1LDcgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgSEFORExFMzIgICAgICBoZWFwOyAgICAgICAgICAgLyogSGVhcCBmb3IgdGhpcyBsaXN0Ym94ICovCi0gICAgSFdORDMyICAgICAgICBvd25lcjsgICAgICAgICAgLyogT3duZXIgd2luZG93ICovCisgICAgSFdORDMyICAgICAgICBvd25lcjsgICAgICAgICAgLyogT3duZXIgd2luZG93IHRvIHNlbmQgbm90aWZpY2F0aW9ucyB0byAqLwogICAgIFVJTlQzMiAgICAgICAgc3R5bGU7ICAgICAgICAgIC8qIFdpbmRvdyBzdHlsZSAqLwogICAgIElOVDMyICAgICAgICAgd2lkdGg7ICAgICAgICAgIC8qIFdpbmRvdyB3aWR0aCAqLwogICAgIElOVDMyICAgICAgICAgaGVpZ2h0OyAgICAgICAgIC8qIFdpbmRvdyBoZWlnaHQgKi8KQEAgLTY1LDYgKzY1LDcgQEAKICAgICBCT09MMzIgICAgICAgIGNhcmV0X29uOyAgICAgICAvKiBJcyBjYXJldCBvbj8gKi8KICAgICBIRk9OVDMyICAgICAgIGZvbnQ7ICAgICAgICAgICAvKiBDdXJyZW50IGZvbnQgKi8KICAgICBMQ0lEICAgICAgICAgIGxvY2FsZTsgICAgICAgICAvKiBDdXJyZW50IGxvY2FsZSBmb3Igc3RyaW5nIGNvbXBhcmlzb25zICovCisgICAgTFBIRUFEQ09NQk8gICBscGhjOwkJICAvKiBDb21ib0xCb3ggKi8KIH0gTEJfREVTQ1I7CiAKIApAQCAtNzYsNyArNzcsNyBAQAogCiAjZGVmaW5lIFNFTkRfTk9USUZJQ0FUSU9OKHduZCxkZXNjcixjb2RlKSBcCiAgICAgKFNlbmRNZXNzYWdlMzJBKCAoZGVzY3IpLT5vd25lciwgV01fQ09NTUFORCwgXAotICAgICAgICAgICAgICAgICAgICAgTUFLRVdQQVJBTSggKHduZCktPndJRG1lbnUsIChjb2RlKSApLCAod25kKS0+aHduZFNlbGYgKSkKKyAgICAgTUFLRVdQQVJBTSgoKChkZXNjciktPmxwaGMpP0lEX0NCX0xJU1RCT1g6KHduZCktPndJRG1lbnUpLCAoY29kZSkgKSwgKHduZCktPmh3bmRTZWxmICkpCiAKIC8qIEN1cnJlbnQgdGltZXIgc3RhdHVzICovCiB0eXBlZGVmIGVudW0KQEAgLTQzOSw4ICs0NDAsMTAgQEAKICAgICBpZiAoSVNfT1dORVJEUkFXKGRlc2NyKSkKICAgICB7CiAgICAgICAgIERSQVdJVEVNU1RSVUNUMzIgZGlzOworCVVJTlQzMgkJIGlkID0gKGRlc2NyLT5scGhjKSA/IElEX0NCX0xJU1RCT1ggOiB3bmQtPndJRG1lbnU7CisKICAgICAgICAgZGlzLkN0bFR5cGUgICAgICA9IE9EVF9MSVNUQk9YOwotICAgICAgICBkaXMuQ3RsSUQgICAgICAgID0gd25kLT53SURtZW51OworICAgICAgICBkaXMuQ3RsSUQgICAgICAgID0gaWQ7CiAgICAgICAgIGRpcy5od25kSXRlbSAgICAgPSB3bmQtPmh3bmRTZWxmOwogICAgICAgICBkaXMuaXRlbUFjdGlvbiAgID0gYWN0aW9uOwogICAgICAgICBkaXMuaERDICAgICAgICAgID0gaGRjOwpAQCAtNDU4LDEwICs0NjEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICB3bmQtPmh3bmRTZWxmLCBpbmRleCwgaXRlbSA/IGl0ZW0tPnN0ciA6ICIiLCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzLml0ZW1TdGF0ZSwgcmVjdC0+bGVmdCwgcmVjdC0+dG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QtPnJpZ2h0LCByZWN0LT5ib3R0b20gKTsKLSAgICAgICAgU2VuZE1lc3NhZ2UzMkEoZGVzY3ItPm93bmVyLCBXTV9EUkFXSVRFTSwgd25kLT53SURtZW51LCAoTFBBUkFNKSZkaXMpOworICAgICAgICBTZW5kTWVzc2FnZTMyQShkZXNjci0+b3duZXIsIFdNX0RSQVdJVEVNLCBpZCwgKExQQVJBTSkmZGlzKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKKyAgICAgICAgQ09MT1JSRUYgb2xkVGV4dCA9IDAsIG9sZEJrID0gMDsKKwogICAgICAgICBpZiAoYWN0aW9uID09IE9EQV9GT0NVUykKICAgICAgICAgewogICAgICAgICAgICAgRHJhd0ZvY3VzUmVjdDMyKCBoZGMsIHJlY3QgKTsKQEAgLTQ2OSwxNyArNDc0LDEwIEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS0+c2VsZWN0ZWQpCiAgICAgICAgIHsKLSAgICAgICAgICAgIFNldEJrQ29sb3IzMiggaGRjLCBHZXRTeXNDb2xvcjMyKCBDT0xPUl9ISUdITElHSFQgKSApOwotICAgICAgICAgICAgU2V0VGV4dENvbG9yMzIoIGhkYywgR2V0U3lzQ29sb3IzMiggQ09MT1JfSElHSExJR0hUVEVYVCApICk7CisgICAgICAgICAgICBvbGRCayA9IFNldEJrQ29sb3IzMiggaGRjLCBHZXRTeXNDb2xvcjMyKCBDT0xPUl9ISUdITElHSFQgKSApOworICAgICAgICAgICAgb2xkVGV4dCA9IFNldFRleHRDb2xvcjMyKCBoZGMsIEdldFN5c0NvbG9yMzIoQ09MT1JfSElHSExJR0hUVEVYVCkpOwogICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgU2V0QmtDb2xvcjMyKCBoZGMsIEdldFN5c0NvbG9yMzIoIENPTE9SX1dJTkRPVyApICk7Ci0gICAgICAgICAgICBpZiAod25kLT5kd1N0eWxlICYgV1NfRElTQUJMRUQpCi0gICAgICAgICAgICAgICAgU2V0VGV4dENvbG9yMzIoIGhkYywgR2V0U3lzQ29sb3IzMiggQ09MT1JfR1JBWVRFWFQgKSApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIFNldFRleHRDb2xvcjMyKCBoZGMsIEdldFN5c0NvbG9yMzIoIENPTE9SX1dJTkRPV1RFWFQgKSApOwotICAgICAgICB9CisKICAgICAgICAgZHByaW50Zl9saXN0Ym94KCBzdGRkZWIsICJMaXN0Ym94ICUwNHg6IHBhaW50aW5nICVkICglcykgYWN0aW9uPSUwMnggIgogICAgICAgICAgICAgICAgICAgICAgICAgICJyZWN0PSVkLCVkLSVkLCVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIHduZC0+aHduZFNlbGYsIGluZGV4LCBpdGVtID8gaXRlbS0+c3RyIDogIiIsIGFjdGlvbiwKQEAgLTQ5Miw2ICs0OTAsMTEgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgICAgRXh0VGV4dE91dDMyQSggaGRjLCByZWN0LT5sZWZ0ICsgMSwgcmVjdC0+dG9wICsgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVUT19PUEFRVUUgfCBFVE9fQ0xJUFBFRCwgcmVjdCwgTlVMTCwgMCwgTlVMTCApOworICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLT5zZWxlY3RlZCkKKyAgICAgICAgeworICAgICAgICAgICAgU2V0QmtDb2xvcjMyKCBoZGMsIG9sZEJrICk7CisgICAgICAgICAgICBTZXRUZXh0Q29sb3IzMiggaGRjLCBvbGRUZXh0ICk7CisgICAgICAgIH0KICAgICAgICAgaWYgKChkZXNjci0+Zm9jdXNfaXRlbSA9PSBpbmRleCkgJiYKICAgICAgICAgICAgIChkZXNjci0+Y2FyZXRfb24pICYmCiAgICAgICAgICAgICAoR2V0Rm9jdXMzMigpID09IHduZC0+aHduZFNlbGYpKSBEcmF3Rm9jdXNSZWN0MzIoIGhkYywgcmVjdCApOwpAQCAtNTI2LDE4ICs1MjksMjMgQEAKIHsKICAgICBIREMzMiBoZGM7CiAgICAgUkVDVDMyIHJlY3Q7CisgICAgSEZPTlQzMiBvbGRGb250ID0gMDsKKyAgICBIQlJVU0gzMiBoYnJ1c2gsIG9sZEJydXNoID0gMDsKIAogICAgIGlmIChkZXNjci0+c3R5bGUgJiBMQlNfTk9SRURSQVcpIHJldHVybjsKICAgICBpZiAoTElTVEJPWF9HZXRJdGVtUmVjdCggd25kLCBkZXNjciwgaW5kZXgsICZyZWN0ICkgIT0gMSkgcmV0dXJuOwotICAgIGlmICgoaGRjID0gR2V0RENFeDMyKCB3bmQtPmh3bmRTZWxmLCAwLCBEQ1hfQ0FDSEUgKSkpCi0gICAgewotICAgICAgICBIRk9OVDMyIG9sZEZvbnQgPSAwOwotICAgICAgICBpZiAoZGVzY3ItPmZvbnQpIG9sZEZvbnQgPSBTZWxlY3RPYmplY3QzMiggaGRjLCBkZXNjci0+Zm9udCApOwotICAgICAgICBTZXRXaW5kb3dPcmdFeDMyKCBoZGMsIGRlc2NyLT5ob3J6X3BvcywgMCwgTlVMTCApOwotICAgICAgICBMSVNUQk9YX1BhaW50SXRlbSggd25kLCBkZXNjciwgaGRjLCAmcmVjdCwgaW5kZXgsIGFjdGlvbiApOwotICAgICAgICBpZiAob2xkRm9udCkgU2VsZWN0T2JqZWN0MzIoIGhkYywgb2xkRm9udCApOwotICAgICAgICBSZWxlYXNlREMzMiggd25kLT5od25kU2VsZiwgaGRjICk7Ci0gICAgfQorICAgIGlmICghKGhkYyA9IEdldERDRXgzMiggd25kLT5od25kU2VsZiwgMCwgRENYX0NBQ0hFICkpKSByZXR1cm47CisgICAgaWYgKGRlc2NyLT5mb250KSBvbGRGb250ID0gU2VsZWN0T2JqZWN0MzIoIGhkYywgZGVzY3ItPmZvbnQgKTsKKyAgICBoYnJ1c2ggPSBTZW5kTWVzc2FnZTMyQSggZGVzY3ItPm93bmVyLCBXTV9DVExDT0xPUkxJU1RCT1gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkYywgKExQQVJBTSl3bmQtPmh3bmRTZWxmICk7CisgICAgaWYgKGhicnVzaCkgb2xkQnJ1c2ggPSBTZWxlY3RPYmplY3QzMiggaGRjLCBoYnJ1c2ggKTsKKyAgICBpZiAod25kLT5kd1N0eWxlICYgV1NfRElTQUJMRUQpCisgICAgICAgIFNldFRleHRDb2xvcjMyKCBoZGMsIEdldFN5c0NvbG9yMzIoIENPTE9SX0dSQVlURVhUICkgKTsKKyAgICBTZXRXaW5kb3dPcmdFeDMyKCBoZGMsIGRlc2NyLT5ob3J6X3BvcywgMCwgTlVMTCApOworICAgIExJU1RCT1hfUGFpbnRJdGVtKCB3bmQsIGRlc2NyLCBoZGMsICZyZWN0LCBpbmRleCwgYWN0aW9uICk7CisgICAgaWYgKG9sZEZvbnQpIFNlbGVjdE9iamVjdDMyKCBoZGMsIG9sZEZvbnQgKTsKKyAgICBpZiAob2xkQnJ1c2gpIFNlbGVjdE9iamVjdDMyKCBoZGMsIG9sZEJydXNoICk7CisgICAgUmVsZWFzZURDMzIoIHduZC0+aHduZFNlbGYsIGhkYyApOwogfQogCiAKQEAgLTYzNSw4ICs2NDMsMTAgQEAKICAgICAgICAgZWxzZQogICAgICAgICB7CiAgICAgICAgICAgICBDT01QQVJFSVRFTVNUUlVDVDMyIGNpczsKKwkgICAgVUlOVDMyCQlpZCA9IChkZXNjci0+bHBoYykgPyBJRF9DQl9MSVNUQk9YIDogd25kLT53SURtZW51OworCiAgICAgICAgICAgICBjaXMuQ3RsVHlwZSAgICA9IE9EVF9MSVNUQk9YOwotICAgICAgICAgICAgY2lzLkN0bElEICAgICAgPSB3bmQtPndJRG1lbnU7CisgICAgICAgICAgICBjaXMuQ3RsSUQgICAgICA9IGlkOwogICAgICAgICAgICAgY2lzLmh3bmRJdGVtICAgPSB3bmQtPmh3bmRTZWxmOwogICAgICAgICAgICAgY2lzLml0ZW1JRDEgICAgPSBpbmRleDsKICAgICAgICAgICAgIGNpcy5pdGVtRGF0YTEgID0gZGVzY3ItPml0ZW1zW2luZGV4XS5kYXRhOwpAQCAtNjQ0LDcgKzY1NCw3IEBACiAgICAgICAgICAgICBjaXMuaXRlbURhdGEyICA9IChEV09SRClzdHI7CiAgICAgICAgICAgICBjaXMuZHdMb2NhbGVJZCA9IGRlc2NyLT5sb2NhbGU7CiAgICAgICAgICAgICByZXMgPSBTZW5kTWVzc2FnZTMyQSggZGVzY3ItPm93bmVyLCBXTV9DT01QQVJFSVRFTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bmQtPndJRG1lbnUsIChMUEFSQU0pJmNpcyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLCAoTFBBUkFNKSZjaXMgKTsKICAgICAgICAgfQogICAgICAgICBpZiAoIXJlcykgcmV0dXJuIGluZGV4OwogICAgICAgICBpZiAocmVzID4gMCkgbWF4ID0gaW5kZXg7CkBAIC04MTcsNiArODI3LDcgQEAKICAgICBJTlQzMiBpLCBjb2xfcG9zID0gZGVzY3ItPnBhZ2Vfc2l6ZSAtIDE7CiAgICAgUkVDVDMyIHJlY3Q7CiAgICAgSEZPTlQzMiBvbGRGb250ID0gMDsKKyAgICBIQlJVU0gzMiBoYnJ1c2gsIG9sZEJydXNoID0gMDsKIAogICAgIFNldFJlY3QzMiggJnJlY3QsIDAsIDAsIGRlc2NyLT53aWR0aCwgZGVzY3ItPmhlaWdodCApOwogICAgIGlmIChkZXNjci0+c3R5bGUgJiBMQlNfTk9SRURSQVcpIHJldHVybiAwOwpAQCAtODI5LDYgKzg0MCwxMSBAQAogICAgIH0KIAogICAgIGlmIChkZXNjci0+Zm9udCkgb2xkRm9udCA9IFNlbGVjdE9iamVjdDMyKCBoZGMsIGRlc2NyLT5mb250ICk7CisgICAgaGJydXNoID0gU2VuZE1lc3NhZ2UzMkEoIGRlc2NyLT5vd25lciwgV01fQ1RMQ09MT1JMSVNUQk9YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGMsIChMUEFSQU0pd25kLT5od25kU2VsZiApOworICAgIGlmIChoYnJ1c2gpIG9sZEJydXNoID0gU2VsZWN0T2JqZWN0MzIoIGhkYywgaGJydXNoICk7CisgICAgaWYgKHduZC0+ZHdTdHlsZSAmIFdTX0RJU0FCTEVEKQorICAgICAgICBTZXRUZXh0Q29sb3IzMiggaGRjLCBHZXRTeXNDb2xvcjMyKCBDT0xPUl9HUkFZVEVYVCApICk7CiAKICAgICBpZiAoIWRlc2NyLT5uYl9pdGVtcyAmJiAoZGVzY3ItPmZvY3VzX2l0ZW0gIT0gLTEpICYmIGRlc2NyLT5jYXJldF9vbiAmJgogICAgICAgICAoR2V0Rm9jdXMzMigpID09IHduZC0+aHduZFNlbGYpKQpAQCAtODk4LDYgKzkxNCw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKG9sZEZvbnQpIFNlbGVjdE9iamVjdDMyKCBoZGMsIG9sZEZvbnQgKTsKKyAgICBpZiAob2xkQnJ1c2gpIFNlbGVjdE9iamVjdDMyKCBoZGMsIG9sZEJydXNoICk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTEyNjEsMTMgKzEyNzgsMTQgQEAKICAgICBpZiAoZGVzY3ItPnN0eWxlICYgTEJTX09XTkVSRFJBV1ZBUklBQkxFKQogICAgIHsKICAgICAgICAgTUVBU1VSRUlURU1TVFJVQ1QzMiBtaXM7CisJVUlOVDMyCQkgICAgaWQgPSAoZGVzY3ItPmxwaGMpID8gSURfQ0JfTElTVEJPWCA6IHduZC0+d0lEbWVudTsKKwogICAgICAgICBtaXMuQ3RsVHlwZSAgICA9IE9EVF9MSVNUQk9YOwotICAgICAgICBtaXMuQ3RsSUQgICAgICA9IHduZC0+d0lEbWVudTsKKyAgICAgICAgbWlzLkN0bElEICAgICAgPSBpZDsKICAgICAgICAgbWlzLml0ZW1JRCAgICAgPSBpbmRleDsKICAgICAgICAgbWlzLml0ZW1EYXRhICAgPSBkZXNjci0+aXRlbXNbaW5kZXhdLmRhdGE7CiAgICAgICAgIG1pcy5pdGVtSGVpZ2h0ID0gZGVzY3ItPml0ZW1faGVpZ2h0OwotICAgICAgICBTZW5kTWVzc2FnZTMyQSggZGVzY3ItPm93bmVyLCBXTV9NRUFTVVJFSVRFTSwgd25kLT53SURtZW51LAotICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSkmbWlzICk7CisgICAgICAgIFNlbmRNZXNzYWdlMzJBKCBkZXNjci0+b3duZXIsIFdNX01FQVNVUkVJVEVNLCBpZCwgKExQQVJBTSkmbWlzICk7CiAgICAgICAgIGl0ZW0tPmhlaWdodCA9IG1pcy5pdGVtSGVpZ2h0ID8gbWlzLml0ZW1IZWlnaHQgOiAxOwogICAgICAgICBkcHJpbnRmX2xpc3Rib3goIHN0ZGRlYiwgIkxpc3Rib3ggJTA0eDogbWVhc3VyZSBpdGVtICVkICglcykgPSAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICB3bmQtPmh3bmRTZWxmLCBpbmRleCwgc3RyID8gc3RyIDogIiIsIGl0ZW0tPmhlaWdodCApOwpAQCAtMTM0MiwxMyArMTM2MCwxNCBAQAogICAgIGlmIChJU19PV05FUkRSQVcoZGVzY3IpIHx8IGRlc2NyLT5pdGVtc1tpbmRleF0uZGF0YSkKICAgICB7CiAgICAgICAgIERFTEVURUlURU1TVFJVQ1QzMiBkaXM7CisJVUlOVDMyCQkgICBpZCA9IChkZXNjci0+bHBoYykgPyBJRF9DQl9MSVNUQk9YIDogd25kLT53SURtZW51OworCiAgICAgICAgIGRpcy5DdGxUeXBlICA9IE9EVF9MSVNUQk9YOwotICAgICAgICBkaXMuQ3RsSUQgICAgPSB3bmQtPndJRG1lbnU7CisgICAgICAgIGRpcy5DdGxJRCAgICA9IGlkOwogICAgICAgICBkaXMuaXRlbUlEICAgPSBpbmRleDsKICAgICAgICAgZGlzLmh3bmRJdGVtID0gd25kLT5od25kU2VsZjsKICAgICAgICAgZGlzLml0ZW1EYXRhID0gZGVzY3ItPml0ZW1zW2luZGV4XS5kYXRhOwotICAgICAgICBTZW5kTWVzc2FnZTMyQSggd25kLT5od25kU2VsZiwgV01fREVMRVRFSVRFTSwgd25kLT53SURtZW51LAotICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSkmZGlzICk7CisgICAgICAgIFNlbmRNZXNzYWdlMzJBKCBkZXNjci0+b3duZXIsIFdNX0RFTEVURUlURU0sIGlkLCAoTFBBUkFNKSZkaXMgKTsKICAgICB9CiAgICAgaWYgKEhBU19TVFJJTkdTKGRlc2NyKSAmJiBkZXNjci0+aXRlbXNbaW5kZXhdLnN0cikKICAgICAgICAgSGVhcEZyZWUoIGRlc2NyLT5oZWFwLCAwLCBkZXNjci0+aXRlbXNbaW5kZXhdLnN0ciApOwpAQCAtMTQ1NCw4ICsxNDczLDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExJU1RCT1hfRGlyZWN0b3J5CiAgKi8KLUxSRVNVTFQgTElTVEJPWF9EaXJlY3RvcnkoIFdORCAqd25kLCBMQl9ERVNDUiAqZGVzY3IsIFVJTlQzMiBhdHRyaWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgZmlsZXNwZWMsIEJPT0wzMiBsb25nX25hbWVzICkKK3N0YXRpYyBMUkVTVUxUIExJU1RCT1hfRGlyZWN0b3J5KCBXTkQgKnduZCwgTEJfREVTQ1IgKmRlc2NyLCBVSU5UMzIgYXR0cmliLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBmaWxlc3BlYywgQk9PTDMyIGxvbmdfbmFtZXMgKQogewogICAgIEhBTkRMRTMyIGhhbmRsZTsKICAgICBMUkVTVUxUIHJldCA9IExCX09LQVk7CkBAIC0xNjgxLDExICsxNzAwLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkZXNjci0+aXRlbXNbaW5kZXhdLnNlbGVjdGVkKSwgRkFMU0UgKTsKICAgICAgICAgfQogICAgIH0KLSAgICBTZXRGb2N1czMyKCB3bmQtPmh3bmRTZWxmICk7CisKKyAgICBpZiggIWRlc2NyLT5scGhjICkgU2V0Rm9jdXMzMiggd25kLT5od25kU2VsZiApOworICAgIGVsc2UgU2V0Rm9jdXMzMiggKGRlc2NyLT5scGhjLT5oV25kRWRpdCkgPyBkZXNjci0+bHBoYy0+aFduZEVkaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGVzY3ItPmxwaGMtPnNlbGYtPmh3bmRTZWxmICkgOworCiAgICAgU2V0Q2FwdHVyZTMyKCB3bmQtPmh3bmRTZWxmICk7Ci0gICAgaWYgKGluZGV4ICE9IC0xKQorICAgIGlmIChpbmRleCAhPSAtMSAmJiAhZGVzY3ItPmxwaGMpCiAgICAgewotICAgICAgICBpZiAoZGVzY3ItPnN0eWxlICYgTEJTX05PVElGWSkKKyAgICAgICAgaWYgKGRlc2NyLT5zdHlsZSAmIExCU19OT1RJRlkgKQogICAgICAgICAgICAgU2VuZE1lc3NhZ2UzMkEoIGRlc2NyLT5vd25lciwgV01fTEJUUkFDS1BPSU5ULCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFTFBBUkFNKCB4LCB5ICkgKTsKICAgICAgICAgaWYgKHduZC0+ZHdFeFN0eWxlICYgV1NfRVhfRFJBR0RFVEVDVCkKQEAgLTE3MDcsOSArMTczMCwxMiBAQAogICAgIGlmIChMSVNUQk9YX1RpbWVyICE9IExCX1RJTUVSX05PTkUpCiAgICAgICAgIEtpbGxTeXN0ZW1UaW1lcjMyKCB3bmQtPmh3bmRTZWxmLCBMQl9USU1FUl9JRCApOwogICAgIExJU1RCT1hfVGltZXIgPSBMQl9USU1FUl9OT05FOwotICAgIGlmIChHZXRDYXB0dXJlMzIoKSA9PSB3bmQtPmh3bmRTZWxmKSBSZWxlYXNlQ2FwdHVyZSgpOwotICAgIGlmIChkZXNjci0+c3R5bGUgJiBMQlNfTk9USUZZKQotICAgICAgICBTRU5EX05PVElGSUNBVElPTiggd25kLCBkZXNjciwgTEJOX1NFTENIQU5HRSApOworICAgIGlmIChHZXRDYXB0dXJlMzIoKSA9PSB3bmQtPmh3bmRTZWxmKSAKKyAgICB7CisJUmVsZWFzZUNhcHR1cmUoKTsKKyAgICAgICAgaWYgKGRlc2NyLT5zdHlsZSAmIExCU19OT1RJRlkpCisgICAgICAgICAgICBTRU5EX05PVElGSUNBVElPTiggd25kLCBkZXNjciwgTEJOX1NFTENIQU5HRSApOworICAgIH0KICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTgxOSw4ICsxODQ1LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExJU1RCT1hfSGFuZGxlS2V5RG93bgogICovCi1zdGF0aWMgTFJFU1VMVCBMSVNUQk9YX0hhbmRsZUtleURvd24oIFdORCAqd25kLCBMQl9ERVNDUiAqZGVzY3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdQQVJBTTMyIHdQYXJhbSApCitzdGF0aWMgTFJFU1VMVCBMSVNUQk9YX0hhbmRsZUtleURvd24oIFdORCAqd25kLCBMQl9ERVNDUiAqZGVzY3IsIFdQQVJBTTMyIHdQYXJhbSApCiB7CiAgICAgSU5UMzIgY2FyZXQgPSAtMTsKICAgICBpZiAoZGVzY3ItPnN0eWxlICYgTEJTX1dBTlRLRVlCT0FSRElOUFVUKQpAQCAtMTg5OSw3ICsxOTI0LDE0IEBACiAgICAgICAgICAgICBkZXNjci0+YW5jaG9yX2l0ZW0gPSBjYXJldDsKICAgICAgICAgTElTVEJPWF9Nb3ZlQ2FyZXQoIHduZCwgZGVzY3IsIGNhcmV0LCBUUlVFICk7CiAgICAgICAgIGlmIChkZXNjci0+c3R5bGUgJiBMQlNfTk9USUZZKQorICAgICAgICB7CisJICAgIGlmKCBkZXNjci0+bHBoYyAmJiBDQl9HRVRUWVBFKGRlc2NyLT5scGhjKSAhPSBDQlNfU0lNUExFICkKKyAgICAgICAgICAgIHsKKwkJLyogbWFrZSBzdXJlIHRoYXQgY29tYm8gcGFyZW50IGRvZXNuJ3QgaGlkZSB1cyAqLworCQlkZXNjci0+bHBoYy0+d1N0YXRlIHw9IENCRl9OT1JPTExVUDsKKwkgICAgfQogICAgICAgICAgICAgU0VORF9OT1RJRklDQVRJT04oIHduZCwgZGVzY3IsIExCTl9TRUxDSEFOR0UgKTsKKyAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gMDsKIH0KQEAgLTE5MzYsNyArMTk2OCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMSVNUQk9YX0NyZWF0ZQogICovCi1zdGF0aWMgQk9PTDMyIExJU1RCT1hfQ3JlYXRlKCBXTkQgKnduZCApCitzdGF0aWMgQk9PTDMyIExJU1RCT1hfQ3JlYXRlKCBXTkQgKnduZCwgTFBIRUFEQ09NQk8gbHBoYyApCiB7CiAgICAgTEJfREVTQ1IgKmRlc2NyOwogICAgIE1FQVNVUkVJVEVNU1RSVUNUMzIgbWlzOwpAQCAtMTk3MCw2ICsyMDAyLDE0IEBACiAgICAgZGVzY3ItPmNhcmV0X29uICAgICAgPSBUUlVFOwogICAgIGRlc2NyLT5mb250ICAgICAgICAgID0gMDsKICAgICBkZXNjci0+bG9jYWxlICAgICAgICA9IDA7ICAvKiBGSVhNRSAqLworICAgIGRlc2NyLT5scGhjCQkgPSBscGhjOworCisgICAgaWYoIGxwaGMgKQorICAgIHsKKwlkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ29tYm9MQm94IFslMDR4XTogcmVzZXR0aW5nIG93bmVyICUwNHggLT4gJTA0eFxuIiwKKwkJCSAgICAgIHduZC0+aHduZFNlbGYsIGRlc2NyLT5vd25lciwgbHBoYy0+c2VsZi0+aHduZFNlbGYgKTsKKwlkZXNjci0+b3duZXIgPSBscGhjLT5zZWxmLT5od25kU2VsZjsKKyAgICB9CiAKICAgICAqKExCX0RFU0NSICoqKXduZC0+d0V4dHJhID0gZGVzY3I7CiAKQEAgLTE5ODAsMTUgKzIwMjAsMjQgQEAKIAogICAgIGlmIChkZXNjci0+c3R5bGUgJiBMQlNfT1dORVJEUkFXRklYRUQpCiAgICAgewotICAgICAgICBtaXMuQ3RsVHlwZSAgICA9IE9EVF9MSVNUQk9YOwotICAgICAgICBtaXMuQ3RsSUQgICAgICA9IHduZC0+d0lEbWVudTsKLSAgICAgICAgbWlzLml0ZW1JRCAgICAgPSAwOwotICAgICAgICBtaXMuaXRlbVdpZHRoICA9IDA7Ci0gICAgICAgIG1pcy5pdGVtRGF0YSAgID0gMDsKLSAgICAgICAgbWlzLml0ZW1IZWlnaHQgPSBkZXNjci0+aXRlbV9oZWlnaHQ7Ci0gICAgICAgIFNlbmRNZXNzYWdlMzJBKCBkZXNjci0+b3duZXIsIFdNX01FQVNVUkVJVEVNLCB3bmQtPndJRG1lbnUsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKSZtaXMgKTsKLSAgICAgICAgZGVzY3ItPml0ZW1faGVpZ2h0ID0gbWlzLml0ZW1IZWlnaHQgPyBtaXMuaXRlbUhlaWdodCA6IDE7CisJaWYoIGRlc2NyLT5scGhjICYmIChkZXNjci0+bHBoYy0+ZHdTdHlsZSAmIENCU19EUk9QRE9XTikpCisJeworCSAgICAvKiBXaW5Xb3JkIGdldHMgVkVSWSB1bmhhcHB5IGlmIHdlIHNlbmQgV01fTUVBU1VSRUlURU0gZnJvbSBoZXJlICovCisJICAgIGRlc2NyLT5pdGVtX2hlaWdodCA9IGxwaGMtPlJlY3RCdXR0b24uYm90dG9tIC0gbHBoYy0+UmVjdEJ1dHRvbi50b3AgLSA2OworCX0KKwllbHNlCisJeworCSAgICBVSU5UMzIJaWQgPSAoZGVzY3ItPmxwaGMgKSA/IElEX0NCX0xJU1RCT1ggOiB3bmQtPndJRG1lbnU7CisKKyAgICAgICAgICAgIG1pcy5DdGxUeXBlICAgID0gT0RUX0xJU1RCT1g7CisgICAgICAgICAgICBtaXMuQ3RsSUQgICAgICA9IGlkOworICAgICAgICAgICAgbWlzLml0ZW1JRCAgICAgPSAtMTsKKyAgICAgICAgICAgIG1pcy5pdGVtV2lkdGggID0gIDA7CisgICAgICAgICAgICBtaXMuaXRlbURhdGEgICA9ICAwOworICAgICAgICAgICAgbWlzLml0ZW1IZWlnaHQgPSBkZXNjci0+aXRlbV9oZWlnaHQ7CisgICAgICAgICAgICBTZW5kTWVzc2FnZTMyQSggZGVzY3ItPm93bmVyLCBXTV9NRUFTVVJFSVRFTSwgaWQsIChMUEFSQU0pJm1pcyApOworICAgICAgICAgICAgZGVzY3ItPml0ZW1faGVpZ2h0ID0gbWlzLml0ZW1IZWlnaHQgPyBtaXMuaXRlbUhlaWdodCA6IDE7CisJfQogICAgIH0KIAogICAgIHJldHVybiBUUlVFOwpAQCAtMjAwMyw3ICsyMDUyLDcgQEAKICAgICBMSVNUQk9YX1Jlc2V0Q29udGVudCggd25kLCBkZXNjciApOwogICAgIEhlYXBEZXN0cm95KCBkZXNjci0+aGVhcCApOwogICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBkZXNjciApOwotICAgICooTEJfREVTQ1IgKiopd25kLT53RXh0cmEgPSBOVUxMOworICAgIHduZC0+d0V4dHJhWzBdID0gMDsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMjAyMiw3ICsyMDcxLDcgQEAKICAgICB7CiAgICAgICAgIGlmIChtc2cgPT0gV01fQ1JFQVRFKQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIUxJU1RCT1hfQ3JlYXRlKCB3bmQgKSkgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKCFMSVNUQk9YX0NyZWF0ZSggd25kLCBOVUxMICkpIHJldHVybiAtMTsKICAgICAgICAgICAgIGRwcmludGZfbGlzdGJveCggc3RkZGViLCAiTGlzdGJveDogY3JlYXRpbmcgd25kPSUwNHggZGVzY3I9JXBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3bmQsICooTEJfREVTQ1IgKiopd25kLT53RXh0cmEgKTsKICAgICAgICAgICAgIHJldHVybiAwOwpAQCAtMjMwNSw5ICsyMzU0LDEwIEBACiAgICAgY2FzZSBXTV9QQUlOVDoKICAgICAgICAgewogICAgICAgICAgICAgUEFJTlRTVFJVQ1QzMiBwczsKLSAgICAgICAgICAgIEhEQzMyIGhkYyA9IEJlZ2luUGFpbnQzMiggaHduZCwgJnBzICk7CisgICAgICAgICAgICBIREMzMiBoZGMgPSAoIHdQYXJhbSApID8gKChIREMzMil3UGFyYW0pCisJCQkJICAgOiAgQmVnaW5QYWludDMyKCBod25kLCAmcHMgKTsKICAgICAgICAgICAgIHJldCA9IExJU1RCT1hfUGFpbnQoIHduZCwgZGVzY3IsIGhkYyApOwotICAgICAgICAgICAgRW5kUGFpbnQzMiggaHduZCwgJnBzICk7CisgICAgICAgICAgICBpZiggIXdQYXJhbSApIEVuZFBhaW50MzIoIGh3bmQsICZwcyApOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXQ7CiAKQEAgLTIzODEsMTggKzI0MzEsMjIgQEAKICAgICAgICAgcmV0dXJuIDE7CiAKICAgICBjYXNlIFdNX0RST1BGSUxFUzoKLSAgICAgICAgcmV0dXJuIFNlbmRNZXNzYWdlMzJBKCBkZXNjci0+b3duZXIsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKKyAgICAgICAgaWYoICFkZXNjci0+bHBoYyApIAorCSAgICByZXR1cm4gU2VuZE1lc3NhZ2UzMkEoIGRlc2NyLT5vd25lciwgbXNnLCB3UGFyYW0sIGxQYXJhbSApOworCWJyZWFrOwogCiAgICAgY2FzZSBXTV9EUk9QT0JKRUNUOgogICAgIGNhc2UgV01fUVVFUllEUk9QT0JKRUNUOgogICAgIGNhc2UgV01fRFJBR1NFTEVDVDoKICAgICBjYXNlIFdNX0RSQUdNT1ZFOgotICAgIHsKLSAgICAgICAgTFBEUkFHSU5GTyBkcmFnSW5mbyA9IChMUERSQUdJTkZPKVBUUl9TRUdfVE9fTElOKCAoU0VHUFRSKWxQYXJhbSApOwotICAgICAgICBkcmFnSW5mby0+bCA9IExJU1RCT1hfR2V0SXRlbUZyb21Qb2ludCggd25kLCBkZXNjciwgZHJhZ0luZm8tPnB0LngsCisJaWYoICFkZXNjci0+bHBoYyApCisgICAgICAgIHsKKyAgICAgICAgICAgIExQRFJBR0lORk8gZHJhZ0luZm8gPSAoTFBEUkFHSU5GTylQVFJfU0VHX1RPX0xJTiggKFNFR1BUUilsUGFyYW0gKTsKKyAgICAgICAgICAgIGRyYWdJbmZvLT5sID0gTElTVEJPWF9HZXRJdGVtRnJvbVBvaW50KCB3bmQsIGRlc2NyLCBkcmFnSW5mby0+cHQueCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYWdJbmZvLT5wdC55ICk7Ci0gICAgICAgIHJldHVybiBTZW5kTWVzc2FnZTMyQSggZGVzY3ItPm93bmVyLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7Ci0gICAgfQorICAgICAgICAgICAgcmV0dXJuIFNlbmRNZXNzYWdlMzJBKCBkZXNjci0+b3duZXIsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKKyAgICAgICAgfQorCWJyZWFrOwogCiAgICAgZGVmYXVsdDoKICAgICAgICAgaWYgKChtc2cgPj0gV01fVVNFUikgJiYgKG1zZyA8IDB4YzAwMCkpCkBAIC0yNDAyLDMgKzI0NTYsOTkgQEAKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENPTUJPX0RpcmVjdG9yeQorICovCitMUkVTVUxUIENPTUJPX0RpcmVjdG9yeSggTFBIRUFEQ09NQk8gbHBoYywgVUlOVDMyIGF0dHJpYiwgTFBTVFIgZGlyLCBCT09MMzIgYkxvbmcpCit7CisgICAgV05EICp3bmQgPSBXSU5fRmluZFduZFB0ciggbHBoYy0+aFduZExCb3ggKTsKKworICAgIGlmKCB3bmQgKQorICAgIHsKKyAgICAgICAgTEJfREVTQ1IgKmRlc2NyID0gKihMQl9ERVNDUiAqKil3bmQtPndFeHRyYTsKKwlpZiggZGVzY3IgKQorCXsKKwkgICAgTFJFU1VMVAlsUmV0ID0gTElTVEJPWF9EaXJlY3RvcnkoIHduZCwgZGVzY3IsIGF0dHJpYiwgZGlyLCBiTG9uZyApOworCisJICAgIFJlZHJhd1dpbmRvdzMyKCBscGhjLT5zZWxmLT5od25kU2VsZiwgTlVMTCwgMCwgCisJCQkgICAgUkRXX0lOVkFMSURBVEUgfCBSRFdfRVJBU0UgfCBSRFdfVVBEQVRFTk9XICk7CisJICAgIHJldHVybiBsUmV0OworCX0KKyAgICB9CisgICAgcmV0dXJuIENCX0VSUjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ29tYm9MQlduZFByb2MKKyAqCisgKiAgTk9URTogaW4gV2luZG93cywgd2lucHJvYyBhZGRyZXNzIG9mIHRoZSBDb21ib0xCb3ggaXMgdGhlIHNhbWUgCisgKgkgIGFzIHRoYXQgb2YgdGhlIExpc3Rib3guCisgKi8KK0xSRVNVTFQgQ29tYm9MQlduZFByb2MoSFdORDMyIGh3bmQsIFVJTlQzMiBtc2csIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBMUkVTVUxUIGxSZXQgPSAwOworICAgIFdORCAqd25kID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKKworICAgIGlmICh3bmQpCisgICAgeworCUxCX0RFU0NSICpkZXNjciA9ICooTEJfREVTQ1IgKiopd25kLT53RXh0cmE7CisKKyAgICAgICAgZHByaW50Zl9jb21ibyggc3RkZGViLCAiQ29tYm9MQm94IFslMDR4XTogbXNnICVzIHdwICUwOHggbHAgJTA4bHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHduZC0+aHduZFNlbGYsIFNQWV9HZXRNc2dOYW1lKG1zZyksIHdQYXJhbSwgbFBhcmFtICk7CisKKwlpZiggZGVzY3IgfHwgbXNnID09IFdNX0NSRUFURSApCisgICAgICAgIHsKKwkgICAgTFBIRUFEQ09NQk8gbHBoYyA9IChkZXNjcikgPyBkZXNjci0+bHBoYyA6IE5VTEw7CisKKwkgICAgc3dpdGNoKCBtc2cgKQorCSAgICB7CisJCWNhc2UgV01fQ1JFQVRFOgorI2RlZmluZSBscGNzCSgoTFBDUkVBVEVTVFJVQ1QzMkEpbFBhcmFtKQorCQkgICAgIGRwcmludGZfY29tYm8oc3RkZGViLCAiXHRwYXNzZWQgcGFyZW50IGhhbmRsZSA9IDB4JTA4eFxuIiwgCisJCQkJCSAgICAgICAgIChVSU5UMzIpbHBjcy0+bHBDcmVhdGVQYXJhbXMpOworCisJCSAgICAgbHBoYyA9IChMUEhFQURDT01CTykobHBjcy0+bHBDcmVhdGVQYXJhbXMpOworI3VuZGVmICBscGNzCisJCSAgICAgcmV0dXJuIExJU1RCT1hfQ3JlYXRlKCB3bmQsIGxwaGMgKTsKKworCQljYXNlIFdNX0xCVVRUT05ET1dOOgorCQkgICAgIHJldHVybiBMSVNUQk9YX0hhbmRsZUxCdXR0b25Eb3duKCB3bmQsIGRlc2NyLCB3UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTlQxNilMT1dPUkQobFBhcmFtKSwgKElOVDE2KUhJV09SRChsUGFyYW0pKTsKKworCQkvKiBhdm9pZCBhY3RpdmF0aW9uIGF0IGFsbCBjb3N0cyAqLworCisJCWNhc2UgV01fTU9VU0VBQ1RJVkFURToKKwkJICAgICByZXR1cm4gTUFfTk9BQ1RJVkFURTsKKworICAgICAgICAgICAgICAgIGNhc2UgV01fTkNBQ1RJVkFURToKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworCQljYXNlIFdNX0tFWURPV046CisJCSAgICAgaWYoIENCX0dFVFRZUEUobHBoYykgIT0gQ0JTX1NJTVBMRSApCisJCSAgICAgeworCQkJIC8qIGZvciBzb21lIHJlYXNvbig/KSBXaW5kb3dzIG1ha2VzIGl0IHBvc3NpYmxlIHRvCisJCQkgICogc2hvdy9oaWRlIENvbWJvTEJveCBieSBzZW5kaW5nIGl0IFdNX0tFWURPV05zICovCisKKwkJICAgICAgICAgaWYoICghKGxwaGMtPndTdGF0ZSAmIENCRl9FVUkpICYmIHdQYXJhbSA9PSBWS19GNCkgfHwKKwkJCSAgICAgKCAobHBoYy0+d1N0YXRlICYgQ0JGX0VVSSkgJiYgIShscGhjLT53U3RhdGUgJiBDQkZfRFJPUFBFRCkKKwkJCSAgICAgICAmJiAod1BhcmFtID09IFZLX0RPV04gfHwgd1BhcmFtID09IFZLX1VQKSkgKQorCQkJIHsKKwkJCSAgICAgQ09NQk9fRmxpcExpc3Rib3goIGxwaGMsIEZBTFNFICk7CisJCQkgICAgIHJldHVybiAwOworCQkJIH0KKwkJICAgICB9CisJCSAgICAgcmV0dXJuIExJU1RCT1hfSGFuZGxlS2V5RG93biggd25kLCBkZXNjciwgd1BhcmFtICk7CisKKwkgICAgICAgIGRlZmF1bHQ6CisJCSAgICAgcmV0dXJuIExpc3RCb3hXbmRQcm9jKCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CisJICAgIH0KKyAgICAgICAgfQorICAgICAgICBsUmV0ID0gRGVmV2luZG93UHJvYzMyQSggaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApOworCisgICAgICAgIGRwcmludGZfY29tYm8oc3RkZGViLCJcdENvbWJvTEJveDogZGVmYXVsdCBvbiBtc2cgWyUwNHhdXG4iLCAoVUlOVDE2KW1zZyApOworICAgIH0KKworICAgIHJldHVybiBsUmV0OworfQorCmRpZmYgLS1naXQgYS9jb250cm9scy9tZW51LmMgYi9jb250cm9scy9tZW51LmMKaW5kZXggMjlkMDczYy4uMDZkYjU4MCAxMDA2NDQKLS0tIGEvY29udHJvbHMvbWVudS5jCisrKyBiL2NvbnRyb2xzL21lbnUuYwpAQCAtMzA0LDMyICszMDQsMzkgQEAKICAqIEZpbmQgdGhlIG1lbnUgaXRlbSBzZWxlY3RlZCBieSBhIGtleSBwcmVzcy4KICAqIFJldHVybiBpdGVtIGlkLCAtMSBpZiBub25lLCAtMiBpZiB3ZSBzaG91bGQgY2xvc2UgdGhlIG1lbnUuCiAgKi8KLXN0YXRpYyBVSU5UMzIgTUVOVV9GaW5kSXRlbUJ5S2V5KCBIV05EMzIgaHduZE93bmVyLCBITUVOVTMyIGhtZW51LCBVSU5UMzIga2V5ICkKK3N0YXRpYyBVSU5UMzIgTUVOVV9GaW5kSXRlbUJ5S2V5KCBIV05EMzIgaHduZE93bmVyLCBITUVOVTMyIGhtZW51LCAKKwkJCQkgIFVJTlQzMiBrZXksIEJPT0wzMiBmb3JjZU1lbnVDaGFyICkKIHsKLSAgICBQT1BVUE1FTlUgKm1lbnU7Ci0gICAgTUVOVUlURU0gKml0ZW07Ci0gICAgVUlOVDMyIGk7Ci0gICAgTE9ORyBtZW51Y2hhcjsKKyAgICBkcHJpbnRmX21lbnUoc3RkZGViLCJcdGxvb2tpbmcgZm9yICclYycgaW4gWyUwNHhdXG4iLCAoY2hhcilrZXksIChVSU5UMTYpaG1lbnUgKTsKIAogICAgIGlmICghSXNNZW51MzIoIGhtZW51ICkpIGhtZW51ID0gV0lOX0ZpbmRXbmRQdHIoaHduZE93bmVyKS0+aFN5c01lbnU7Ci0gICAgaWYgKCFobWVudSkgcmV0dXJuIC0xOwogCi0gICAgbWVudSA9IChQT1BVUE1FTlUgKikgVVNFUl9IRUFQX0xJTl9BRERSKCBobWVudSApOwotICAgIGl0ZW0gPSBtZW51LT5pdGVtczsKLSAgICBrZXkgPSB0b3VwcGVyKGtleSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG1lbnUtPm5JdGVtczsgaSsrLCBpdGVtKyspCisgICAgaWYgKGhtZW51KQogICAgIHsKLQlpZiAoSVNfU1RSSU5HX0lURU0oaXRlbS0+aXRlbV9mbGFncykpCisJUE9QVVBNRU5VICptZW51ID0gKFBPUFVQTUVOVSAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGhtZW51ICk7CisJTUVOVUlURU0gKml0ZW0gPSBtZW51LT5pdGVtczsKKwlMT05HIG1lbnVjaGFyOworCisJaWYoICFmb3JjZU1lbnVDaGFyICkKIAl7Ci0JICAgIGNoYXIgKnAgPSBzdHJjaHIoIGl0ZW0tPnRleHQsICcmJyApOwotCSAgICBpZiAocCAmJiAocFsxXSAhPSAnJicpICYmICh0b3VwcGVyKHBbMV0pID09IGtleSkpIHJldHVybiBpOworCSAgICAgVUlOVDMyIGk7CisKKwkgICAgIGtleSA9IHRvdXBwZXIoa2V5KTsKKwkgICAgIGZvciAoaSA9IDA7IGkgPCBtZW51LT5uSXRlbXM7IGkrKywgaXRlbSsrKQorCSAgICAgeworCQlpZiAoSVNfU1RSSU5HX0lURU0oaXRlbS0+aXRlbV9mbGFncykpCisJCXsKKwkJICAgIGNoYXIgKnAgPSBzdHJjaHIoIGl0ZW0tPnRleHQsICcmJyApOworCQkgICAgaWYgKHAgJiYgKHBbMV0gIT0gJyYnKSAmJiAodG91cHBlcihwWzFdKSA9PSBrZXkpKSByZXR1cm4gaTsKKwkJfQorCSAgICAgfQogCX0KKwltZW51Y2hhciA9IFNlbmRNZXNzYWdlMzJBKCBod25kT3duZXIsIFdNX01FTlVDSEFSLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFLRVdQQVJBTSgga2V5LCBtZW51LT53RmxhZ3MgKSwgaG1lbnUgKTsKKwlpZiAoSElXT1JEKG1lbnVjaGFyKSA9PSAyKSByZXR1cm4gTE9XT1JEKG1lbnVjaGFyKTsKKwlpZiAoSElXT1JEKG1lbnVjaGFyKSA9PSAxKSByZXR1cm4gKFVJTlQzMikoLTIpOwogICAgIH0KLSAgICBtZW51Y2hhciA9IFNlbmRNZXNzYWdlMzJBKCBod25kT3duZXIsIFdNX01FTlVDSEFSLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFV1BBUkFNKCBrZXksIG1lbnUtPndGbGFncyApLCBobWVudSApOwotICAgIGlmIChISVdPUkQobWVudWNoYXIpID09IDIpIHJldHVybiBMT1dPUkQobWVudWNoYXIpOwotICAgIGlmIChISVdPUkQobWVudWNoYXIpID09IDEpIHJldHVybiAtMjsKLSAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIChVSU5UMzIpKC0xKTsKIH0KIAogCkBAIC04NjgsNyArODc1LDcgQEAKICAgICAgIC8qIERpc3BsYXkgdGhlIHdpbmRvdyAqLwogCiAgICAgU2V0V2luZG93UG9zMzIoIG1lbnUtPmhXbmQsIEhXTkRfVE9QLCAwLCAwLCAwLCAwLAotCQkgICAgU1dQX1NIT1dXSU5ET1cgfCBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRSB8IFNXUF9OT0FDVElWQVRFKTsKKwkJICAgIFNXUF9TSE9XV0lORE9XIHwgU1dQX05PU0laRSB8IFNXUF9OT01PVkUgfCBTV1BfTk9BQ1RJVkFURSApOwogICAgIFVwZGF0ZVdpbmRvdzMyKCBtZW51LT5oV25kICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CkBAIC0xMzEwLDcgKzEzMTcsNyBAQAogCWlmICghKGl0ZW0tPml0ZW1fZmxhZ3MgJiAoTUZfR1JBWUVEIHwgTUZfRElTQUJMRUQpKSkKIAl7CiAJICAgIFBvc3RNZXNzYWdlMTYoIGh3bmRPd25lciwgKG1lbnUtPndGbGFncyAmIE1GX1NZU01FTlUpID8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBXTV9TWVNDT01NQU5EIDogV01fQ09NTUFORCwgaXRlbS0+aXRlbV9pZCwgMCApOworCQkJV01fU1lTQ09NTUFORCA6IFdNX0NPTU1BTkQsIGl0ZW0tPml0ZW1faWQsIDAgKTsKIAkgICAgcmV0dXJuIEZBTFNFOwogCX0KIAllbHNlIHJldHVybiBUUlVFOwpAQCAtMTc4Nyw3ICsxNzk0LDcgQEAKIAkJICAgICAgLyogSGFjayB0byBhdm9pZCBjb250cm9sIGNoYXJzLiAqLwogCQkgICAgICAvKiBXZSB3aWxsIGZpbmQgYSBiZXR0ZXIgd2F5IHJlYWwgc29vbi4uLiAqLwogCQkgICAgaWYgKChtc2cud1BhcmFtIDw9IDMyKSB8fCAobXNnLndQYXJhbSA+PSAxMjcpKSBicmVhazsKLQkJICAgIHBvcyA9IE1FTlVfRmluZEl0ZW1CeUtleSggaHduZCwgaG1lbnVDdXJyZW50LCBtc2cud1BhcmFtICk7CisJCSAgICBwb3MgPSBNRU5VX0ZpbmRJdGVtQnlLZXkoIGh3bmQsIGhtZW51Q3VycmVudCwgbXNnLndQYXJhbSwgRkFMU0UgKTsKIAkJICAgIGlmIChwb3MgPT0gKFVJTlQzMiktMikgZkNsb3NlZCA9IFRSVUU7CiAJCSAgICBlbHNlIGlmIChwb3MgPT0gKFVJTlQzMiktMSkgTWVzc2FnZUJlZXAzMigwKTsKIAkJICAgIGVsc2UKQEAgLTE4NTksNiArMTg2NiwxOCBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBNRU5VX0luaXRUcmFja2luZworICovCitzdGF0aWMgQk9PTDMyIE1FTlVfSW5pdFRyYWNraW5nKEhXTkQzMiBoV25kLCBITUVOVTMyIGhNZW51KQoreworICAgIEhpZGVDYXJldDMyKDApOworICAgIFNlbmRNZXNzYWdlMTYoIGhXbmQsIFdNX0VOVEVSTUVOVUxPT1AsIDAsIDAgKTsKKyAgICBTZW5kTWVzc2FnZTE2KCBoV25kLCBXTV9TRVRDVVJTT1IsIGhXbmQsIEhUQ0FQVElPTiApOworICAgIFNlbmRNZXNzYWdlMTYoIGhXbmQsIFdNX0lOSVRNRU5VLCBoTWVudSwgMCApOworICAgIHJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBNRU5VX1RyYWNrTW91c2VNZW51QmFyCiAgKgogICogTWVudS1iYXIgdHJhY2tpbmcgdXBvbiBhIG1vdXNlIGV2ZW50LiBDYWxsZWQgZnJvbSBOQ19IYW5kbGVTeXNDb21tYW5kKCkuCkBAIC0xODcyLDkgKzE4OTEsNyBAQAogCiAgICAgaWYgKElzTWVudTMyKGhNZW51KSkKICAgICB7Ci0JSGlkZUNhcmV0MzIoMCk7Ci0JU2VuZE1lc3NhZ2UxNiggaFduZCwgV01fRU5URVJNRU5VTE9PUCwgMCwgMCApOwotCVNlbmRNZXNzYWdlMTYoIGhXbmQsIFdNX0lOSVRNRU5VLCBoTWVudSwgMCApOworCU1FTlVfSW5pdFRyYWNraW5nKCBoV25kLCBoTWVudSApOwogCWlmKCBiVHJhY2tTeXMgKQogCSAgICBNRU5VX1RyYWNrU3lzUG9wdXAoIHduZFB0ciApOwogCWVsc2UKQEAgLTE5MDQsMjggKzE5MjEsMzAgQEAKICAgICAgICAgICAKICAgICBpZiggIXduZFB0ci0+d0lEbWVudSAmJiAhKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1NZU01FTlUpICkgcmV0dXJuOwogCi0gICAgaHRNZW51ID0gKCh3bmRQdHItPmR3U3R5bGUgJiAoV1NfQ0hJTEQgfCBXU19NSU5JTUlaRSkpIHx8IAotCSAgICAgICF3bmRQdHItPndJRG1lbnUpID8gSFRTWVNNRU5VIDogSFRNRU5VOwotICAgIGhUcmFja01lbnUgPSAoIGh0TWVudSA9PSBIVFNZU01FTlUgKSA/IHduZFB0ci0+aFN5c01lbnUgOiB3bmRQdHItPndJRG1lbnU7CisgICAgaWYoKHduZFB0ci0+ZHdTdHlsZSAmIChXU19DSElMRCB8IFdTX01JTklNSVpFKSkgfHwgIXduZFB0ci0+d0lEbWVudSkgCisgICAgeworCWhUcmFja01lbnUgPSB3bmRQdHItPmhTeXNNZW51OworCWh0TWVudSA9IEhUU1lTTUVOVTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwloVHJhY2tNZW51ID0gd25kUHRyLT53SURtZW51OworCWh0TWVudSA9IEhUTUVOVTsKKyAgICB9CiAKICAgICBpZiAoSXNNZW51MzIoIGhUcmFja01lbnUgKSkKICAgICB7Ci0gICAgICAgIEhpZGVDYXJldDMyKDApOwotICAgICAgICBTZW5kTWVzc2FnZTE2KCB3bmRQdHItPmh3bmRTZWxmLCBXTV9FTlRFUk1FTlVMT09QLCAwLCAwICk7Ci0gICAgICAgIFNlbmRNZXNzYWdlMTYoIHduZFB0ci0+aHduZFNlbGYsIFdNX0lOSVRNRU5VLCBoVHJhY2tNZW51LCAwICk7Ci0KLSAgICAgICAgLyogZmluZCBzdWl0YWJsZSBtZW51IGVudHJ5ICovCisJTUVOVV9Jbml0VHJhY2tpbmcoIHduZFB0ci0+aHduZFNlbGYsIGhUcmFja01lbnUgKTsKIAogICAgICAgICBpZiggdmtleSA9PSBWS19TUEFDRSApCiAgICAgICAgICAgICB1SXRlbSA9IFNZU01FTlVfU0VMRUNURUQ7CiAgICAgICAgIGVsc2UgaWYoIHZrZXkgKQogICAgICAgICB7Ci0gICAgICAgICAgICB1SXRlbSA9ICggaHRNZW51ID09IEhUU1lTTUVOVSApCi0JCSAgICA/IDB4RkZGRQkvKiBvbmx5IFZLX1NQQUNFIGluIHRoaXMgY2FzZSAqLwotCQkgICAgOiBNRU5VX0ZpbmRJdGVtQnlLZXkoIHduZFB0ci0+aHduZFNlbGYsIHduZFB0ci0+d0lEbWVudSwgdmtleSApOwotCSAgICBpZiggdUl0ZW0gPj0gMHhGRkZFICkKKyAgICAgICAgICAgIHVJdGVtID0gTUVOVV9GaW5kSXRlbUJ5S2V5KCB3bmRQdHItPmh3bmRTZWxmLCBoVHJhY2tNZW51LCAKKwkJCQkJdmtleSwgKGh0TWVudSA9PSBIVFNZU01FTlUpICk7CisJICAgIGlmKCB1SXRlbSA+PSAoVUlOVDMyKSgtMikgKQogCSAgICB7Ci0JICAgICAgICBpZiggdUl0ZW0gPT0gMHhGRkZGICkgTWVzc2FnZUJlZXAzMigwKTsKKwkgICAgICAgIGlmKCB1SXRlbSA9PSAoVUlOVDMyKSgtMSkgKSBNZXNzYWdlQmVlcDMyKDApOwogCQlodE1lbnUgPSAwOwogCSAgICB9CiAgICAgICAgIH0KQEAgLTIxNzIsMjUgKzIxOTEsMzYgQEAKICAqLwogQk9PTDMyIEVuYWJsZU1lbnVJdGVtMzIoIEhNRU5VMzIgaE1lbnUsIFVJTlQzMiB3SXRlbUlELCBVSU5UMzIgd0ZsYWdzICkKIHsKLSAgICBNRU5VSVRFTSAqaXRlbTsKLSAgICBkcHJpbnRmX21lbnUoc3RkZGViLCJFbmFibGVNZW51SXRlbSAoJTA0eCwgJTA0WCwgJTA0WCkgIVxuIiwgCi0JCSBoTWVudSwgd0l0ZW1JRCwgd0ZsYWdzKTsKLSAgICBpZiAoIShpdGVtID0gTUVOVV9GaW5kSXRlbSggJmhNZW51LCAmd0l0ZW1JRCwgd0ZsYWdzICkpKSByZXR1cm4gRkFMU0U7CisgICAgQk9PTDMyICAgIGJSZXQgPSBGQUxTRTsKKyAgICBNRU5VSVRFTSAqaXRlbSwgKmZpcnN0ID0gTlVMTDsKIAotICAgICAgLyogV2UgY2FuJ3QgaGF2ZSBNRl9HUkFZRUQgYW5kIE1GX0RJU0FCTEVEIHRvZ2V0aGVyICovCi0gICAgaWYgKHdGbGFncyAmIE1GX0dSQVlFRCkKKyAgICBkcHJpbnRmX21lbnUoc3RkZGViLCJFbmFibGVNZW51SXRlbSAoJTA0eCwgJTA0WCwgJTA0WCkgIVxuIiwgCisJCSAgICAgICAgICAgICAgICAgICAgICAgIGhNZW51LCB3SXRlbUlELCB3RmxhZ3MpOworCisgICAgd2hpbGUoIChpdGVtID0gTUVOVV9GaW5kSXRlbSggJmhNZW51LCAmd0l0ZW1JRCwgd0ZsYWdzICkpICkKICAgICB7Ci0JaXRlbS0+aXRlbV9mbGFncyA9IChpdGVtLT5pdGVtX2ZsYWdzICYgfk1GX0RJU0FCTEVEKSB8IE1GX0dSQVlFRDsKKyAgICAgIGlmKCAhKGl0ZW0tPml0ZW1fZmxhZ3MgJiBNRl9QT1BVUCkgKQorICAgICAgeworICAgICAgICAgICAvKiBXZSBjYW4ndCBoYXZlIE1GX0dSQVlFRCBhbmQgTUZfRElTQUJMRUQgdG9nZXRoZXIgKi8KKyAgICAgICAgICAgaWYgKHdGbGFncyAmIE1GX0dSQVlFRCkKKyAgICAgICAgICAgeworICAJICAgICBpdGVtLT5pdGVtX2ZsYWdzID0gKGl0ZW0tPml0ZW1fZmxhZ3MgJiB+TUZfRElTQUJMRUQpIHwgTUZfR1JBWUVEOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UgaWYgKHdGbGFncyAmIE1GX0RJU0FCTEVEKQorICAgICAgICAgICB7CisJICAgICBpdGVtLT5pdGVtX2ZsYWdzID0gKGl0ZW0tPml0ZW1fZmxhZ3MgJiB+TUZfR1JBWUVEKSB8IE1GX0RJU0FCTEVEOworICAgICAgICAgICB9CisgICAgICAgICAgIGVsc2UgICAvKiBNRl9FTkFCTEVEICovCisgICAgICAgICAgIHsKKwkgICAgIGl0ZW0tPml0ZW1fZmxhZ3MgJj0gfihNRl9HUkFZRUQgfCBNRl9ESVNBQkxFRCk7CisgICAgICAgICAgIH0gCisJICAgYlJldCA9IFRSVUU7CisJICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiggIWZpcnN0ICkgZmlyc3QgPSBpdGVtOworICAgICAgZWxzZSBpZiggZmlyc3QgPT0gaXRlbSApIGJyZWFrOwogICAgIH0KLSAgICBlbHNlIGlmICh3RmxhZ3MgJiBNRl9ESVNBQkxFRCkKLSAgICB7Ci0JaXRlbS0+aXRlbV9mbGFncyA9IChpdGVtLT5pdGVtX2ZsYWdzICYgfk1GX0dSQVlFRCkgfCBNRl9ESVNBQkxFRDsKLSAgICB9Ci0gICAgZWxzZSAgIC8qIE1GX0VOQUJMRUQgKi8KLSAgICB7Ci0JaXRlbS0+aXRlbV9mbGFncyAmPSB+KE1GX0dSQVlFRCB8IE1GX0RJU0FCTEVEKTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIGJSZXQ7CiB9CiAKIApkaWZmIC0tZ2l0IGEvY29udHJvbHMvb2xkbGJveC5jIGIvY29udHJvbHMvb2xkbGJveC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmVjZmQ5Li4wMDAwMDAwCi0tLSBhL2NvbnRyb2xzL29sZGxib3guYworKysgL2Rldi9udWxsCkBAIC0xLDc2NyArMCwwIEBACi0vKgotICogTGlzdGJveCBjb250cm9scwotICogCi0gKiBDb3B5cmlnaHQgIE1hcnRpbiBBeW90dGUsIDE5OTMKLSAqICAgICAgICAgICAgQ29uc3RhbnRpbmUgU2FwdW50emFraXMsIDE5OTUKLSAqIAkgICAgICBBbGV4IEtvcm9ia2EsIDE5OTUsIDE5OTYgCi0gKiAKLSAqLwotCi0gLyoKLSAgKiBGSVhNRTogCi0gICogLSBwcm9wZXIgc2Nyb2xsaW5nIGZvciBtdWx0aWNvbHVtbiBzdHlsZQotICAqIC0gYW5jaG9yIGFuZCBjYXJldCBmb3IgTEJTX0VYVEVOREVEU0VMCi0gICogLSBwcm9wZXIgc2VsZWN0aW9uIHdpdGgga2V5Ym9hcmQKLSAgKiAtIGhvdyB0byBoYW5kbGUgKExCU19FWFRFTkRFRFNFTCB8IExCU19NVUxUSVBMRVNFTCkgc3R5bGUKLSAgKiAtIHN1cHBvcnQgZm9yIExCU19OT0lOVEVHUkFMSEVJR0hUIGFuZCBMQlNfT1dORVJEUkFXVkFSSUFCTEUgc3R5bGVzCi0gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAid2luZG93cy5oIgotI2luY2x1ZGUgIndpbi5oIgotI2luY2x1ZGUgImdkaS5oIgotI2luY2x1ZGUgImxpc3Rib3guaCIKLSNpbmNsdWRlICJoZWFwLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgInhtYWxsb2MuaCIKLQotI2RlZmluZSBMSVNUX0hFQVBfQUxMT0MobHBobCxmLHNpemUpIFwKLSAgICBMT0NBTF9BbGxvYyggbHBobC0+SGVhcFNlbCwgTE1FTV9GSVhFRCwgKHNpemUpICkKLSNkZWZpbmUgTElTVF9IRUFQX0ZSRUUobHBobCxoYW5kbGUpIFwKLSAgICBMT0NBTF9GcmVlKCBscGhsLT5IZWFwU2VsLCAoaGFuZGxlKSApCi0jZGVmaW5lIExJU1RfSEVBUF9BRERSKGxwaGwsaGFuZGxlKSAgXAotICAgICgoaGFuZGxlKSA/IFBUUl9TRUdfT0ZGX1RPX0xJTihscGhsLT5IZWFwU2VsLCAoaGFuZGxlKSkgOiBOVUxMKQotCi0jZGVmaW5lIExJU1RfSEVBUF9TSVpFIDB4MTAwMDAKLQotI2RlZmluZSBMQk1NX0VER0UgICA0ICAgIC8qIGRpc3RhbmNlIGluc2lkZSBib3ggd2hpY2ggaXMgc2FtZSBhcyBtb3ZpbmcgbW91c2UKLQkJCSAgICBvdXRzaWRlIGJveCwgdG8gdHJpZ2dlciBzY3JvbGxpbmcgb2YgTEIgKi8KLQotI2RlZmluZSBNQVRDSF9TVUJTVFIgICAgICAgICAgICAyCi0jZGVmaW5lIE1BVENIX0VYQUNUICAgICAgICAgICAgIDEKLSNkZWZpbmUgTUFUQ0hfTkVBUkVTVCAgICAgICAgICAgMAotCi1zdGF0aWMgdm9pZCBMaXN0Qm94SW5pdGlhbGl6ZShMUEhFQURMSVNUIGxwaGwpCi17Ci0gIGxwaGwtPmxwRmlyc3QgICAgICAgID0gTlVMTDsKLSAgbHBobC0+SXRlbXNDb3VudCAgICAgPSAwOwotICBscGhsLT5JdGVtc1Zpc2libGUgICA9IDA7Ci0gIGxwaGwtPkZpcnN0VmlzaWJsZSAgID0gMDsKLSAgbHBobC0+Q29sdW1uc1Zpc2libGUgPSAxOwotICBscGhsLT5JdGVtc1BlckNvbHVtbiA9IDA7Ci0gIGxwaGwtPkl0ZW1Gb2N1c2VkICAgID0gLTE7Ci0gIGxwaGwtPlByZXZGb2N1c2VkICAgID0gLTE7Ci19Ci0KLXZvaWQgQ3JlYXRlTGlzdEJveFN0cnVjdChIV05EMTYgaHduZCwgV09SRCBDdGxUeXBlLCBMT05HIHN0eWxlcywgSFdORDE2IHBhcmVudCkKLXsKLSAgTFBIRUFETElTVCBscGhsOwotICBIREMzMiAgICAgICAgIGhkYzsKLQotICBscGhsID0gKExQSEVBRExJU1QpeG1hbGxvYyhzaXplb2YoSEVBRExJU1QpKTsKLSAgU2V0V2luZG93TG9uZzMyQShod25kLCAwLCAoTE9ORylscGhsKTsKLSAgTGlzdEJveEluaXRpYWxpemUobHBobCk7Ci0gIGxwaGwtPkRyYXdDdGxUeXBlICAgID0gQ3RsVHlwZTsKLSAgbHBobC0+Q3RsSUQgICAgICAgICAgPSBHZXRXaW5kb3dXb3JkMTYoaHduZCxHV1dfSUQpOwotICBscGhsLT5iUmVkcmF3RmxhZyAgICA9IFRSVUU7Ci0gIGxwaGwtPmlOdW1TdG9wcyAgICAgID0gMDsKLSAgbHBobC0+VGFiU3RvcHMgICAgICAgPSBOVUxMOwotICBscGhsLT5oRm9udCAgICAgICAgICA9IEdldFN0b2NrT2JqZWN0MzIoU1lTVEVNX0ZPTlQpOwotICBscGhsLT5oU2VsZiAgICAgICAgICA9IGh3bmQ7ICAKLSAgaWYgKEN0bFR5cGU9PU9EVF9DT01CT0JPWCkgICAgICAgICAgICAgIC8qIHVzZSB0aGUgImZha2VkIiBzdHlsZSBmb3IgQ09NQk9MQk9YICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMQlNfU09SVCBpbnN0ZWFkIENCU19TT1JUIGUuZy4gICAgICAqLwotICAgIGxwaGwtPmR3U3R5bGUgICA9IE1BS0VMT05HKExPV09SRChzdHlsZXMpLEhJV09SRChHZXRXaW5kb3dMb25nMzJBKGh3bmQsR1dMX1NUWUxFKSkpOwotICBlbHNlCi0gICAgbHBobC0+ZHdTdHlsZSAgID0gR2V0V2luZG93TG9uZzMyQShod25kLEdXTF9TVFlMRSk7IC8qIHVzZSBvcmlnaW5hbCBzdHlsZSBkd29yZCAqLwotICBscGhsLT5oUGFyZW50ICAgICAgICA9IHBhcmVudDsKLSAgbHBobC0+U3RkSXRlbUhlaWdodCAgPSAxNTsgLyogRklYTUU6IHNob3VsZCBnZXQgdGhlIGZvbnQgaGVpZ2h0ICovCi0gIGxwaGwtPk93bmVyRHJhd24gICAgID0gc3R5bGVzICYgKExCU19PV05FUkRSQVdGSVhFRCB8IExCU19PV05FUkRSQVdWQVJJQUJMRSk7Ci0gIGxwaGwtPkhhc1N0cmluZ3MgICAgID0gKHN0eWxlcyAmIExCU19IQVNTVFJJTkdTKSB8fCAhbHBobC0+T3duZXJEcmF3bjsKLQotICAvKiBjcmVhdGUgZHVtbXkgaGRjIHRvIHNldCB0ZXh0IGhlaWdodCAqLwotICBpZiAoKGhkYyA9IEdldERDMzIoMCkpKQotICB7Ci0gICAgICBURVhUTUVUUklDMTYgdG07Ci0gICAgICBHZXRUZXh0TWV0cmljczE2KCBoZGMsICZ0bSApOwotICAgICAgbHBobC0+U3RkSXRlbUhlaWdodCA9IHRtLnRtSGVpZ2h0OwotICAgICAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiQ3JlYXRlTGlzdEJveFN0cnVjdDogIGZvbnQgaGVpZ2h0ICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgIGxwaGwtPlN0ZEl0ZW1IZWlnaHQpOwotICAgICAgUmVsZWFzZURDMzIoIDAsIGhkYyApOwotICB9Ci0KLSAgaWYgKGxwaGwtPk93bmVyRHJhd24pCi0gIHsKLSAgICBMSVNUU1RSVUNUIGR1bW15bHM7Ci0gICAgCi0gICAgbHBobC0+bmVlZE1lYXN1cmUgPSBUUlVFOwotICAgIGR1bW15bHMubWlzLkN0bFR5cGUgICAgPSBscGhsLT5EcmF3Q3RsVHlwZTsKLSAgICBkdW1teWxzLm1pcy5DdGxJRCAgICAgID0gbHBobC0+Q3RsSUQ7Ci0gICAgZHVtbXlscy5taXMuaXRlbUlEICAgICA9IC0xOwotICAgIGR1bW15bHMubWlzLml0ZW1XaWR0aCAgPSAwOyAvKiBpZ25vcmVkICovCi0gICAgZHVtbXlscy5taXMuaXRlbURhdGEgICA9IDA7Ci0KLSAgICBMaXN0Qm94QXNrTWVhc3VyZShscGhsLCZkdW1teWxzKTsKLSAgfQotCi0gIGxwaGwtPkhlYXBTZWwgPSBHbG9iYWxBbGxvYzE2KEdNRU1fRklYRUQsTElTVF9IRUFQX1NJWkUpOwotICBMb2NhbEluaXQoIGxwaGwtPkhlYXBTZWwsIDAsIExJU1RfSEVBUF9TSVpFLTEpOwotfQotCi0vKiBTZW5kIG5vdGlmaWNhdGlvbiAiY29kZSIgYXMgcGFydCBvZiBhIFdNX0NPTU1BTkQtbWVzc2FnZSBpZiBod25kCi0gICBoYXMgdGhlIExCU19OT1RJRlkgc3R5bGUgKi8KLXZvaWQgTGlzdEJveFNlbmROb3RpZmljYXRpb24oTFBIRUFETElTVCBscGhsLCBXT1JEIGNvZGUpCi17Ci0gIGlmIChscGhsLT5kd1N0eWxlICYgTEJTX05PVElGWSkKLSAgICAgIFNlbmRNZXNzYWdlMzJBKCBscGhsLT5oUGFyZW50LCBXTV9DT01NQU5ELAotICAgICAgICAgICAgICAgICAgICAgIE1BS0VXUEFSQU0oIGxwaGwtPkN0bElELCBjb2RlKSwgKExQQVJBTSlscGhsLT5oU2VsZiApOwotfQotCi0KLS8qIGdldCB0aGUgbWF4aW11bSB2YWx1ZSBvZiBscGhsLT5GaXJzdFZpc2libGUgKi8KLWludCBMaXN0TWF4Rmlyc3RWaXNpYmxlKExQSEVBRExJU1QgbHBobCkKLXsKLSAgICBpbnQgbSA9IGxwaGwtPkl0ZW1zQ291bnQtbHBobC0+SXRlbXNWaXNpYmxlOwotICAgIHJldHVybiAobSA8IDApID8gMCA6IG07Ci19Ci0KLQotLyogUmV0dXJuczogMCBpZiBub3RoaW5nIG5lZWRzIHRvIGJlIGNoYW5nZWQgKi8KLS8qICAgICAgICAgIDEgaWYgRmlyc3RWaXNpYmxlIGNoYW5nZWQgKi8KLQotaW50IExpc3RCb3hTY3JvbGxUb0ZvY3VzKExQSEVBRExJU1QgbHBobCkKLXsKLSAgc2hvcnQgICAgICAgZW5kOwotCi0gIGlmIChscGhsLT5JdGVtc0NvdW50ID09IDApIHJldHVybiAwOwotICBpZiAobHBobC0+SXRlbUZvY3VzZWQgPT0gLTEpIHJldHVybiAwOwotCi0gIGVuZCA9IGxwaGwtPkZpcnN0VmlzaWJsZSArIGxwaGwtPkl0ZW1zVmlzaWJsZSAtIDE7Ci0KLSAgaWYgKGxwaGwtPkl0ZW1Gb2N1c2VkIDwgbHBobC0+Rmlyc3RWaXNpYmxlICkgewotICAgIGxwaGwtPkZpcnN0VmlzaWJsZSA9IGxwaGwtPkl0ZW1Gb2N1c2VkOwotICAgIHJldHVybiAxOwotICB9IGVsc2UgewotICAgIGlmIChscGhsLT5JdGVtRm9jdXNlZCA+IGVuZCkgewotICAgICAgV09SRCBtYXhGaXJzdFZpc2libGUgPSBMaXN0TWF4Rmlyc3RWaXNpYmxlKGxwaGwpOwotCi0gICAgICBscGhsLT5GaXJzdFZpc2libGUgPSBscGhsLT5JdGVtRm9jdXNlZDsKLSAgICAgIAotICAgICAgaWYgKGxwaGwtPkZpcnN0VmlzaWJsZSA+IG1heEZpcnN0VmlzaWJsZSkgewotCWxwaGwtPkZpcnN0VmlzaWJsZSA9IG1heEZpcnN0VmlzaWJsZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgfSAKLSAgcmV0dXJuIDA7Ci19Ci0KLQotTFBMSVNUU1RSVUNUIExpc3RCb3hHZXRJdGVtKExQSEVBRExJU1QgbHBobCwgVUlOVDE2IHVJbmRleCkKLXsKLSAgTFBMSVNUU1RSVUNUIGxwbHM7Ci0gIFVJTlQxNiAgICAgICAgIENvdW50ID0gMDsKLQotICBpZiAodUluZGV4ID49IGxwaGwtPkl0ZW1zQ291bnQpIHJldHVybiBOVUxMOwotCi0gIGxwbHMgPSBscGhsLT5scEZpcnN0OwotICB3aGlsZSAoQ291bnQrKyA8IHVJbmRleCkgbHBscyA9IGxwbHMtPmxwTmV4dDsKLSAgcmV0dXJuIGxwbHM7Ci19Ci0KLQotdm9pZCBMaXN0Qm94RHJhd0l0ZW0oSFdORDE2IGh3bmQsIExQSEVBRExJU1QgbHBobCwgSERDMTYgaGRjLCBMUExJU1RTVFJVQ1QgbHBscywgCi0gICAgICAgICAgICAgICAgICAgICBSRUNUMTYgKnJlY3QsIFdPUkQgaXRlbUFjdGlvbiwgV09SRCBpdGVtU3RhdGUpCi17Ci0gICAgaWYgKGxwaGwtPk93bmVyRHJhd24pCi0gICAgewotICAgICAgICBEUkFXSVRFTVNUUlVDVDMyIGRpczsKLQotICAgICAgICBkaXMuQ3RsSUQgICAgICA9IGxwbHMtPm1pcy5DdGxJRDsKLSAgICAgICAgZGlzLkN0bFR5cGUgICAgPSBscGxzLT5taXMuQ3RsVHlwZTsKLSAgICAgICAgZGlzLml0ZW1JRCAgICAgPSBscGxzLT5taXMuaXRlbUlEOwotICAgICAgICBkaXMuaERDICAgICAgICA9IGhkYzsKLSAgICAgICAgZGlzLmh3bmRJdGVtICAgPSBod25kOwotICAgICAgICBkaXMuaXRlbURhdGEgICA9IGxwbHMtPm1pcy5pdGVtRGF0YTsKLSAgICAgICAgZGlzLml0ZW1BY3Rpb24gPSBpdGVtQWN0aW9uOwotICAgICAgICBkaXMuaXRlbVN0YXRlICA9IGl0ZW1TdGF0ZTsKLSAgICAgICAgQ09OVl9SRUNUMTZUTzMyKCByZWN0LCAmZGlzLnJjSXRlbSApOwotICAgICAgICBTZW5kTWVzc2FnZTMyQSggbHBobC0+aFBhcmVudCwgV01fRFJBV0lURU0sIGRpcy5DdGxJRCwgKExQQVJBTSkmZGlzICk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGl0ZW1BY3Rpb24gPT0gT0RBX0RSQVdFTlRJUkUgfHwgaXRlbUFjdGlvbiA9PSBPREFfU0VMRUNUKSB7Ci0gICAgICBpbnQgCU9sZEJrTW9kZTsKLSAgICAgIERXT1JEIAlkd09sZFRleHRDb2xvciA9IDA7Ci0KLSAgICAgIE9sZEJrTW9kZSA9IFNldEJrTW9kZTMyKGhkYywgVFJBTlNQQVJFTlQpOwotCi0gICAgICBpZiAoaXRlbVN0YXRlICE9IDApIHsKLQlkd09sZFRleHRDb2xvciA9IFNldFRleHRDb2xvcjMyKGhkYywgMHgwMEZGRkZGRkwpOwotCUZpbGxSZWN0MTYoaGRjLCByZWN0LCBHZXRTdG9ja09iamVjdDMyKEJMQUNLX0JSVVNIKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChscGhsLT5kd1N0eWxlICYgTEJTX1VTRVRBQlNUT1BTKSB7Ci0JVGFiYmVkVGV4dE91dDE2KGhkYywgcmVjdC0+bGVmdCArIDUsIHJlY3QtPnRvcCArIDIsIAotCQkgICAgICAoY2hhciAqKWxwbHMtPml0ZW1UZXh0LCBzdHJsZW4oKGNoYXIgKilscGxzLT5pdGVtVGV4dCksIAotCQkgICAgICBscGhsLT5pTnVtU3RvcHMsIGxwaGwtPlRhYlN0b3BzLCAwKTsKLSAgICAgIH0gZWxzZSB7Ci0JVGV4dE91dDE2KGhkYywgcmVjdC0+bGVmdCArIDUsIHJlY3QtPnRvcCArIDIsCi0gICAgICAgICAgICAgICAgICAoY2hhciAqKWxwbHMtPml0ZW1UZXh0LCBzdHJsZW4oKGNoYXIgKilscGxzLT5pdGVtVGV4dCkpOwotICAgICAgfQotCi0gICAgICBpZiAoaXRlbVN0YXRlICE9IDApIHsKLQlTZXRUZXh0Q29sb3IzMihoZGMsIGR3T2xkVGV4dENvbG9yKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgU2V0QmtNb2RlMzIoaGRjLCBPbGRCa01vZGUpOwotICAgIH0KLSAgICBlbHNlIERyYXdGb2N1c1JlY3QxNihoZGMsIHJlY3QpOwotfQotCi0KLWludCBMaXN0Qm94RmluZE1vdXNlKExQSEVBRExJU1QgbHBobCwgaW50IFgsIGludCBZKQotewotICBMUExJU1RTVFJVQ1QgbHBscyA9IGxwaGwtPmxwRmlyc3Q7Ci0gIGludCAgICAgICAgICBpLCBqOwotICBQT0lOVDE2ICAgICAgcG9pbnQ7Ci0gIAotICBwb2ludC54ID0gWDsgcG9pbnQueSA9IFk7Ci0gIGlmIChscGhsLT5JdGVtc0NvdW50ID09IDApIHJldHVybiBMQl9FUlI7Ci0KLSAgZm9yKGkgPSAwOyBpIDwgbHBobC0+Rmlyc3RWaXNpYmxlOyBpKyspIHsKLSAgICBpZiAobHBscyA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOwotICAgIGxwbHMgPSBscGxzLT5scE5leHQ7Ci0gIH0KLSAgZm9yKGogPSAwOyBqIDwgbHBobC0+SXRlbXNWaXNpYmxlOyBpKyssIGorKykgewotICAgIGlmIChscGxzID09IE5VTEwpIHJldHVybiBMQl9FUlI7Ci0gICAgaWYgKFB0SW5SZWN0MTYoJmxwbHMtPml0ZW1SZWN0LHBvaW50KSkgewotICAgICAgcmV0dXJuIGk7Ci0gICAgfQotICAgIGxwbHMgPSBscGxzLT5scE5leHQ7Ci0gIH0KLSAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiTGlzdEJveEZpbmRNb3VzZTogbm90IGZvdW5kXG4iKTsKLSAgcmV0dXJuIExCX0VSUjsKLX0KLQotQk9PTDMyIGxiRGVsZXRlSXRlbU5vdGlmeShMUEhFQURMSVNUIGxwaGwsIExQTElTVFNUUlVDVCBscGxzKQotewotICAgIC8qIGNhbGxlZCBvbmx5IGZvciBvd25lciBkcmF3biBsaXN0Ym94ZXMgKi8KLSAgICBCT09MMzIgcmV0OwotICAgIERFTEVURUlURU1TVFJVQ1QxNiAqZGVsSXRlbSA9IFNFR1BUUl9ORVcoREVMRVRFSVRFTVNUUlVDVDE2KTsKLSAgICBpZiAoIWRlbEl0ZW0pIHJldHVybiBGQUxTRTsKLQotICAgIGRlbEl0ZW0tPkN0bFR5cGUgID0gbHBobC0+RHJhd0N0bFR5cGU7Ci0gICAgZGVsSXRlbS0+Q3RsSUQgICAgPSBscGhsLT5DdGxJRDsKLSAgICBkZWxJdGVtLT5pdGVtSUQgICA9IGxwbHMtPm1pcy5pdGVtSUQ7Ci0gICAgZGVsSXRlbS0+aHduZEl0ZW0gPSBscGhsLT5oU2VsZjsKLSAgICBkZWxJdGVtLT5pdGVtRGF0YSA9IGxwbHMtPm1pcy5pdGVtRGF0YTsKLQotICAgIHJldCA9IFNlbmRNZXNzYWdlMTYoIGxwaGwtPmhQYXJlbnQsIFdNX0RFTEVURUlURU0sIChXUEFSQU0xNilscGhsLT5DdGxJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKVNFR1BUUl9HRVQoZGVsSXRlbSkgKTsKLSAgICBTRUdQVFJfRlJFRShkZWxJdGVtKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBzdHJpbmdzIGFuZCBpdGVtIGRhdGEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi12b2lkIExpc3RCb3hBc2tNZWFzdXJlKExQSEVBRExJU1QgbHBobCwgTFBMSVNUU1RSVUNUIGxwbHMpICAKLXsKLSAgICBNRUFTVVJFSVRFTVNUUlVDVDE2ICpscG1lYXN1cmUgPSBTRUdQVFJfTkVXKE1FQVNVUkVJVEVNU1RSVUNUMTYpOwotICAgIGlmICghbHBtZWFzdXJlKSByZXR1cm47Ci0gICAgKmxwbWVhc3VyZSA9IGxwbHMtPm1pczsKLSAgICBscG1lYXN1cmUtPml0ZW1IZWlnaHQgPSBscGhsLT5TdGRJdGVtSGVpZ2h0OwotICAgIFNlbmRNZXNzYWdlMTYoIGxwaGwtPmhQYXJlbnQsIFdNX01FQVNVUkVJVEVNLCBscGhsLT5DdGxJRCwKLSAgICAgICAgICAgICAgICAgICAoTFBBUkFNKVNFR1BUUl9HRVQobHBtZWFzdXJlKSApOwotCi0gICAgaWYgKGxwaGwtPmR3U3R5bGUgJiBMQlNfT1dORVJEUkFXRklYRUQpCi0gICAgewotICAgICAgICBpZiAobHBtZWFzdXJlLT5pdGVtSGVpZ2h0ID4gbHBobC0+U3RkSXRlbUhlaWdodCkKLSAgICAgICAgICAgIGxwaGwtPlN0ZEl0ZW1IZWlnaHQgPSBscG1lYXN1cmUtPml0ZW1IZWlnaHQ7Ci0gICAgICAgIGxwbHMtPm1pcy5pdGVtSGVpZ2h0ID0gbHBtZWFzdXJlLT5pdGVtSGVpZ2h0OwotICAgIH0KLSAgICBTRUdQVFJfRlJFRShscG1lYXN1cmUpOwotfQotCi1zdGF0aWMgTFBMSVNUU1RSVUNUIExpc3RCb3hDcmVhdGVJdGVtKExQSEVBRExJU1QgbHBobCwgaW50IGlkKQotewotICBMUExJU1RTVFJVQ1QgbHBsc25ldyA9IChMUExJU1RTVFJVQ1QpbWFsbG9jKHNpemVvZihMSVNUU1RSVUNUKSk7Ci0KLSAgaWYgKGxwbHNuZXcgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0gIAotICBscGxzbmV3LT5pdGVtU3RhdGUgICAgICA9IDA7Ci0gIGxwbHNuZXctPm1pcy5DdGxUeXBlICAgID0gbHBobC0+RHJhd0N0bFR5cGU7Ci0gIGxwbHNuZXctPm1pcy5DdGxJRCAgICAgID0gbHBobC0+Q3RsSUQ7Ci0gIGxwbHNuZXctPm1pcy5pdGVtSUQgICAgID0gaWQ7Ci0gIGxwbHNuZXctPm1pcy5pdGVtSGVpZ2h0ID0gbHBobC0+U3RkSXRlbUhlaWdodDsKLSAgbHBsc25ldy0+bWlzLml0ZW1XaWR0aCAgPSAwOyAvKiBpZ25vcmVkICovCi0gIGxwbHNuZXctPm1pcy5pdGVtRGF0YSAgID0gMDsKLSAgU2V0UmVjdEVtcHR5MTYoICZscGxzbmV3LT5pdGVtUmVjdCApOwotCi0gIHJldHVybiBscGxzbmV3OwotfQotCi1zdGF0aWMgaW50IExpc3RCb3hBc2tDb21wYXJlKExQSEVBRExJU1QgbHBobCwgaW50IHN0YXJ0SXRlbSwgU0VHUFRSIG1hdGNoRGF0YSwgQk9PTDMyIGV4YWN0TWF0Y2ggKQotewotIC8qICBEbyBiaW5hcnkgc2VhcmNoIGZvciBzb3J0ZWQgbGlzdGJveGVzLiBMaW5rZWQgbGlzdCBpdGVtIHN0b3JhZ2Ugc29ydCBvZiAKLSAgKiAgZGVmZWF0cyB0aGUgcHVycG9zZSAoIGZvcmNlcyB0byB0cmF2ZXJzZSBpdGVtIGxpc3QgYWxsIHRoZSB0aW1lICkgYnV0IE0kIGRvZXMgaXQgdGhpcyB3YXkuLi4KLSAgKgotICAqICBNQVRDSF9ORUFSRVNUICgwKSAtIHJldHVybiBwb3NpdGlvbiBmb3IgaW5zZXJ0aW9uIC0gZm9yIGFsbCBzdHlsZXMKLSAgKiAgTUFUQ0hfRVhBQ1QgICAoMSkgLSBzZWFyY2ggZm9yIGFuIGl0ZW0sIHJldHVybiBpbmRleCBvciBMQl9FUlIgCi0gICogIE1BVENIX1NVQlNUUiAgKDIpIC0gc2FtZSBhcyBleGFjdCBtYXRjaCBidXQgd2l0aCBzdHJuY21wIGZvciBzdHJpbmcgY29tcGFyaXNpb24KLSAgKi8KLQotIENPTVBBUkVJVEVNU1RSVUNUMTYgICAqaXRlbUNtcDsKLSBMUExJU1RTVFJVQ1QJCWN1cnJlbnRJdGVtID0gTlVMTDsKLSBMUENTVFIJCQltYXRjaFN0ciA9IChscGhsLT5IYXNTdHJpbmdzKT8oTFBDU1RSKVBUUl9TRUdfVE9fTElOKG1hdGNoRGF0YSk6TlVMTDsKLSBpbnQgICAgICAgICAgICAgICAgICAgIGhlYWQsIHBvcyA9IC0xLCB0YWlsLCBsb29wID0gMTsKLSBzaG9ydCAgICAgICAgICAgICAgICAgIGIgPSAwLCBzX2xlbmd0aCA9IDA7Ci0KLSAvKiBjaGVjayBpZiBlbXB0eSAqLwotCi0gaWYoICFscGhsLT5JdGVtc0NvdW50ICkKLSAgICByZXR1cm4gKGV4YWN0TWF0Y2gpPyBMQl9FUlI6IDA7Ci0KLSAvKiBzZXQgdXAgdmFyaWFibGVzICovCi0KLSBpZiggZXhhY3RNYXRjaCA9PSBNQVRDSF9ORUFSRVNUICkKLSAgICAgc3RhcnRJdGVtID0gMDsKLSBlbHNlIGlmKCArK3N0YXJ0SXRlbSApIAotICAgewotICAgICBsb29wID0gMjsKLSAgICAgaWYoIHN0YXJ0SXRlbSA+PSBscGhsLT5JdGVtc0NvdW50ICkgc3RhcnRJdGVtID0gbHBobC0+SXRlbXNDb3VudCAtIDE7Ci0gICB9Ci0KLSBpZiggZXhhY3RNYXRjaCA9PSBNQVRDSF9TVUJTVFIgJiYgbHBobC0+SGFzU3RyaW5ncyApCi0gICB7Ci0gICAgIHNfbGVuZ3RoID0gc3RybGVuKCBtYXRjaFN0ciApOwotICAgICBpZiggIXNfbGVuZ3RoICkgcmV0dXJuIDA7IAkJICAgICAgICAvKiBoZWFkIG9mIHRoZSBsaXN0IC0gZW1wdHkgc3RyaW5nICovCi0gICB9Ci0KLSBoZWFkID0gc3RhcnRJdGVtOyB0YWlsID0gbHBobC0+SXRlbXNDb3VudCAtIDE7Ci0KLSBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJBc2tDb21wYXJlOiBoZWFkID0gJWksIHRhaWwgPSAlaSwgZGF0YSA9ICUwOHhcbiIsIGhlYWQsIHRhaWwsICh1bnNpZ25lZCltYXRjaERhdGEgKTsKLQotIGlmICghKGl0ZW1DbXAgPSBTRUdQVFJfTkVXKENPTVBBUkVJVEVNU1RSVUNUMTYpKSkgcmV0dXJuIDA7Ci0gaXRlbUNtcC0+Q3RsVHlwZSAgICAgICAgPSBscGhsLT5EcmF3Q3RsVHlwZTsKLSBpdGVtQ21wLT5DdGxJRCAgICAgICAgICA9IGxwaGwtPkN0bElEOwotIGl0ZW1DbXAtPmh3bmRJdGVtICAgICAgID0gbHBobC0+aFNlbGY7Ci0KLSAvKiBzZWFyY2ggZnJvbSBzdGFydEl0ZW0gKi8KLQotIHdoaWxlICggbG9vcC0tICkKLSAgewotICAgIHdoaWxlKCBoZWFkIDw9IHRhaWwgKQotICAgICB7Ci0gICAgICAgcG9zID0gKHRhaWwgKyBoZWFkKS8yOwotICAgICAgIGN1cnJlbnRJdGVtID0gTGlzdEJveEdldEl0ZW0oIGxwaGwsIHBvcyApOwotCi0gICAgICAgaWYoIGxwaGwtPkhhc1N0cmluZ3MgKQotCSB7Ci0gICAgICAgICAgIGIgPSAoIHNfbGVuZ3RoICk/IGxzdHJuY21waTMyQSggY3VycmVudEl0ZW0tPml0ZW1UZXh0LCBtYXRjaFN0ciwgc19sZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA6IGxzdHJjbXBpMzJBKCBjdXJyZW50SXRlbS0+aXRlbVRleHQsIG1hdGNoU3RyKTsKLQkgfQotICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgaXRlbUNtcC0+aXRlbUlEMSAgICAgID0gcG9zOwotICAgICAgICAgICBpdGVtQ21wLT5pdGVtRGF0YTEgICAgPSBjdXJyZW50SXRlbS0+bWlzLml0ZW1EYXRhOwotICAgICAgICAgICBpdGVtQ21wLT5pdGVtSUQyICAgICAgPSAtMTsKLSAgICAgICAgICAgaXRlbUNtcC0+aXRlbURhdGEyICAgID0gbWF0Y2hEYXRhOwotCi0gICAgICAgICAgIGIgPSBTZW5kTWVzc2FnZTE2KCBscGhsLT5oUGFyZW50LCBXTV9DT01QQVJFSVRFTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXUEFSQU0xNilscGhsLT5DdGxJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pU0VHUFRSX0dFVChpdGVtQ21wKSApOwotICAgICAgICAgfQotCi0gICAgICAgaWYoIGIgPT0gMCApCi0gICAgICAgewotICAgICAgICAgICBTRUdQVFJfRlJFRShpdGVtQ21wKTsKLSAgICAgICAgICAgcmV0dXJuIHBvczsgIC8qIGZvdW5kIGV4YWN0IG1hdGNoICovCi0gICAgICAgfQotICAgICAgIGVsc2UKLSAgICAgICAgIGlmKCBiIDwgMCApIGhlYWQgPSArK3BvczsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgaWYoIGIgPiAwICkgdGFpbCA9IHBvcyAtIDE7Ci0gICAgIH0KLQotICAgIC8qIHJlc2V0IHRvIHNlYXJjaCBmcm9tIHRoZSBmaXJzdCBpdGVtICovCi0gICAgaGVhZCA9IDA7IHRhaWwgPSBzdGFydEl0ZW0gLSAxOwotICB9Ci0KLSBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJcdC0+IHBvcyA9ICVpXG4iLCBwb3MgKTsKLSBTRUdQVFJfRlJFRShpdGVtQ21wKTsKLQotIC8qIGlmIHdlIGdvdCBoZXJlIG1hdGNoIGlzIG5vdCBleGFjdCAqLwotCi0gaWYoIHBvcyA8IDAgKSBwb3MgPSAwOwotIGVsc2UgaWYoIHBvcyA+IGxwaGwtPkl0ZW1zQ291bnQgKSBwb3MgPSBscGhsLT5JdGVtc0NvdW50OwotCi0gcmV0dXJuIChleGFjdE1hdGNoKT8gTEJfRVJSOiBwb3M7Ci19Ci0KLWludCBMaXN0Qm94SW5zZXJ0U3RyaW5nKExQSEVBRExJU1QgbHBobCwgVUlOVDE2IHVJbmRleCwgTFBDU1RSIG5ld3N0cikKLXsKLSAgTFBMSVNUU1RSVUNUICpscHBscywgbHBsc25ldywgbHBsczsKLSAgSEFORExFMTYgaFN0cjsKLSAgTFBTVFIJc3RyOwotICBVSU5UMTYJQ291bnQ7Ci0gICAgCi0gIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkxpc3RCb3hJbnNlcnRTdHJpbmcoJWQsICVwKTtcbiIsIHVJbmRleCwgbmV3c3RyKTsKLSAgICAKLSAgaWYgKCFuZXdzdHIpIHJldHVybiAtMTsKLQotICBpZiAodUluZGV4ID09IChVSU5UMTYpLTEpCi0gICAgdUluZGV4ID0gbHBobC0+SXRlbXNDb3VudDsKLQotICBscHBscyA9ICZscGhsLT5scEZpcnN0OwotICBmb3IoQ291bnQgPSAwOyBDb3VudCA8IHVJbmRleDsgQ291bnQrKykgewotICAgIGlmICgqbHBwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKLSAgICBscHBscyA9IChMUExJU1RTVFJVQ1QgKikgJigqbHBwbHMpLT5scE5leHQ7Ci0gIH0KLSAgICAKLSAgbHBsc25ldyA9IExpc3RCb3hDcmVhdGVJdGVtKGxwaGwsIENvdW50KTsKLSAgCi0gIGlmIChscGxzbmV3ID09IE5VTEwpIHsKLSAgICBmcHJpbnRmKHN0ZG5pbXAsIkxpc3RCb3hJbnNlcnRTdHJpbmcoKSBvdXQgb2YgbWVtb3J5ICFcbiIpOwotICAgIHJldHVybiBMQl9FUlJTUEFDRTsKLSAgfQotCi0gIGxwbHNuZXctPmxwTmV4dCA9ICpscHBsczsKLSAgKmxwcGxzID0gbHBsc25ldzsKLSAgbHBobC0+SXRlbXNDb3VudCsrOwotICAKLSAgaFN0ciA9IDA7Ci0gIGlmIChscGhsLT5IYXNTdHJpbmdzKSB7Ci0gICAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiICBzdHJpbmc6ICVzXG4iLCBuZXdzdHIpOwotICAgIGhTdHIgPSBMSVNUX0hFQVBfQUxMT0MobHBobCwgTE1FTV9NT1ZFQUJMRSwgc3RybGVuKG5ld3N0cikgKyAxKTsKLSAgICBzdHIgPSAoTFBTVFIpTElTVF9IRUFQX0FERFIobHBobCwgaFN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMKSByZXR1cm4gTEJfRVJSU1BBQ0U7Ci0gICAgc3RyY3B5KHN0ciwgbmV3c3RyKTsgCi0gICAgbHBsc25ldy0+aXRlbVRleHQgPSBzdHI7Ci0gICAgLyogSSdtIG5vdCBzbyBzdXJlIGFib3V0IHRoZSBuZXh0IG9uZSAqLwotICAgIGxwbHNuZXctPm1pcy5pdGVtRGF0YSA9IDA7Ci0gIH0gZWxzZSB7Ci0gICAgbHBsc25ldy0+aXRlbVRleHQgPSBOVUxMOwotICAgIGxwbHNuZXctPm1pcy5pdGVtRGF0YSA9IChEV09SRCluZXdzdHI7Ci0gIH0KLQotICBscGxzbmV3LT5taXMuaXRlbUlEID0gdUluZGV4OwotICBscGxzbmV3LT5oRGF0YSA9IGhTdHI7Ci0gIAotICAvKiBhZGp1c3QgdGhlIGl0ZW1JRCBmaWVsZCBvZiB0aGUgZm9sbG93aW5nIGVudHJpZXMgKi8KLSAgZm9yKGxwbHMgPSBscGxzbmV3LT5scE5leHQ7IGxwbHMgIT0gTlVMTDsgbHBscyA9IGxwbHMtPmxwTmV4dCkgewotICAgICAgbHBscy0+bWlzLml0ZW1JRCsrOwotICB9Ci0gCi0gIGlmIChscGhsLT5uZWVkTWVhc3VyZSkgewotICAgIExpc3RCb3hBc2tNZWFzdXJlKGxwaGwsIGxwbHNuZXcpOwotICB9Ci0KLSAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiTGlzdEJveEluc2VydFN0cmluZyAvLyBjb3VudD0lZFxuIiwgbHBobC0+SXRlbXNDb3VudCk7Ci0gIHJldHVybiB1SW5kZXg7Ci19Ci0KLQotaW50IExpc3RCb3hBZGRTdHJpbmcoTFBIRUFETElTVCBscGhsLCBTRUdQVFIgaXRlbURhdGEpCi17Ci0gICAgVUlOVDE2IAlwb3MgPSAoVUlOVDE2KSAtMTsKLSAgICBMUENTVFIJbmV3c3RyID0gKGxwaGwtPkhhc1N0cmluZ3MpPyhMUENTVFIpUFRSX1NFR19UT19MSU4oaXRlbURhdGEpOihMUENTVFIpaXRlbURhdGE7Ci0KLSAgICBpZiAoIGxwaGwtPmR3U3R5bGUgJiBMQlNfU09SVCApIAotCSBwb3MgPSBMaXN0Qm94QXNrQ29tcGFyZSggbHBobCwgLTEsIGl0ZW1EYXRhLCBNQVRDSF9ORUFSRVNUICk7Ci0KLSAgICByZXR1cm4gTGlzdEJveEluc2VydFN0cmluZyhscGhsLCBwb3MsIG5ld3N0cik7Ci19Ci0KLQotaW50IExpc3RCb3hHZXRUZXh0KExQSEVBRExJU1QgbHBobCwgVUlOVDE2IHVJbmRleCwgTFBTVFIgT3V0U3RyKQotewotICBMUExJU1RTVFJVQ1QgbHBsczsKLQotICBpZiAoIU91dFN0cikgewotICAgIGRwcmludGZfbGlzdGJveChzdGRkZWIsICJMaXN0Qm94R2V0VGV4dCAvLyBPdXRTdHI9PU5VTExcbiIpOwotICAgIHJldHVybiAwOwotICB9Ci0gICpPdXRTdHIgPSAnXDAnOwotICBscGxzID0gTGlzdEJveEdldEl0ZW0gKGxwaGwsIHVJbmRleCk7Ci0gIGlmIChscGxzID09IE5VTEwpIHJldHVybiBMQl9FUlI7Ci0KLSAgaWYgKCFscGhsLT5IYXNTdHJpbmdzKSB7Ci0gICAgKigobG9uZyAqKU91dFN0cikgPSBscGxzLT5taXMuaXRlbURhdGE7Ci0gICAgcmV0dXJuIDQ7Ci0gIH0KLQkKLSAgc3RyY3B5KE91dFN0ciwgbHBscy0+aXRlbVRleHQpOwotICByZXR1cm4gc3RybGVuKE91dFN0cik7Ci19Ci0KLQotRFdPUkQgTGlzdEJveEdldEl0ZW1EYXRhKExQSEVBRExJU1QgbHBobCwgVUlOVDE2IHVJbmRleCkKLXsKLSAgTFBMSVNUU1RSVUNUIGxwbHM7Ci0KLSAgbHBscyA9IExpc3RCb3hHZXRJdGVtIChscGhsLCB1SW5kZXgpOwotICBpZiAobHBscyA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOwotICByZXR1cm4gbHBscy0+bWlzLml0ZW1EYXRhOwotfQotCi0KLWludCBMaXN0Qm94U2V0SXRlbURhdGEoTFBIRUFETElTVCBscGhsLCBVSU5UMTYgdUluZGV4LCBEV09SRCBJdGVtRGF0YSkKLXsKLSAgTFBMSVNUU1RSVUNUIGxwbHMgPSBMaXN0Qm94R2V0SXRlbShscGhsLCB1SW5kZXgpOwotCi0gIGlmIChscGxzID09IE5VTEwpIHJldHVybiBMQl9FUlI7Ci0gIGxwbHMtPm1pcy5pdGVtRGF0YSA9IEl0ZW1EYXRhOwotICByZXR1cm4gMTsKLX0KLQotCi1pbnQgTGlzdEJveERlbGV0ZVN0cmluZyhMUEhFQURMSVNUIGxwaGwsIFVJTlQxNiB1SW5kZXgpCi17Ci0gIExQTElTVFNUUlVDVCBscGxzLCBscGxzMjsKLSAgVUlOVDE2CUNvdW50OwotCi0gIGlmICh1SW5kZXggPj0gbHBobC0+SXRlbXNDb3VudCkgcmV0dXJuIExCX0VSUjsKLQotICBscGxzID0gbHBobC0+bHBGaXJzdDsKLSAgaWYgKGxwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKLQotICBpZiAodUluZGV4ID09IDApCi0gIHsKLSAgICBpZiggbHBobC0+T3duZXJEcmF3biApCi0gICAgICAgIGxiRGVsZXRlSXRlbU5vdGlmeSggbHBobCwgbHBscyk7Ci0gICAgbHBobC0+bHBGaXJzdCA9IGxwbHMtPmxwTmV4dDsKLSAgfQotICBlbHNlIAotICB7Ci0gICAgTFBMSVNUU1RSVUNUIGxwbHMyID0gTlVMTDsKLSAgICBmb3IoQ291bnQgPSAwOyBDb3VudCA8IHVJbmRleDsgQ291bnQrKykgewotICAgICAgaWYgKGxwbHMtPmxwTmV4dCA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOwotCi0gICAgICBscGxzMiA9IGxwbHM7Ci0gICAgICBscGxzID0gKExQTElTVFNUUlVDVClscGxzLT5scE5leHQ7Ci0gICAgfQotICAgIGlmKCBscGhsLT5Pd25lckRyYXduICkKLQlsYkRlbGV0ZUl0ZW1Ob3RpZnkoIGxwaGwsIGxwbHMpOwotICAgIGxwbHMyLT5scE5leHQgPSBscGxzLT5scE5leHQ7Ci0gIH0KLQotICAvKiBhZGp1c3QgdGhlIGl0ZW1JRCBmaWVsZCBvZiB0aGUgZm9sbG93aW5nIGVudHJpZXMgKi8KLSAgZm9yKGxwbHMyID0gbHBscy0+bHBOZXh0OyBscGxzMiAhPSBOVUxMOyBscGxzMiA9IGxwbHMyLT5scE5leHQpIHsKLSAgICAgIGxwbHMyLT5taXMuaXRlbUlELS07Ci0gIH0KLSAKLSAgbHBobC0+SXRlbXNDb3VudC0tOwotCi0gIGlmIChscGxzLT5oRGF0YSAhPSAwKSBMSVNUX0hFQVBfRlJFRShscGhsLCBscGxzLT5oRGF0YSk7Ci0gIGZyZWUobHBscyk7Ci0gIAotICByZXR1cm4gbHBobC0+SXRlbXNDb3VudDsKLX0KLQotc3RhdGljIGludCBsYkZpbmRTdHJpbmcoTFBIRUFETElTVCBscGhsLCBVSU5UMTYgbkZpcnN0LCBTRUdQVFIgTWF0Y2hTdHIsIEJPT0wzMiBtYXRjaCkKLXsKLSAgLyogIG1hdGNoIGlzIGVpdGhlciBNQVRDSF9TVUJTVFIgb3IgTUFUQ0hfRVhBQ1QgKi8KLQotICBMUExJU1RTVFJVQ1QgbHBsczsKLSAgVUlOVDE2CSAgICAgICBDb3VudDsKLSAgVUlOVDE2ICAgICAgICAgRmlyc3QgICAgICA9IG5GaXJzdCArIDE7Ci0gIGludAkgICAgICAgc19sZW5ndGggICA9IDA7Ci0gIExQU1RSICAgICAgICBscE1hdGNoU3RyID0gKExQU1RSKU1hdGNoU3RyOwotCi0gIGlmIChGaXJzdCA+IGxwaGwtPkl0ZW1zQ291bnQpIHJldHVybiBMQl9FUlI7Ci0KLSAgaWYgKGxwaGwtPmR3U3R5bGUgJiBMQlNfU09SVCApCi0gICAgICByZXR1cm4gTGlzdEJveEFza0NvbXBhcmUoIGxwaGwsIG5GaXJzdCwgTWF0Y2hTdHIsIG1hdGNoICk7Ci0KLSAgaWYgKGxwaGwtPkhhc1N0cmluZ3MgKSAKLSAgewotICAgIGxwTWF0Y2hTdHIgPSBQVFJfU0VHX1RPX0xJTihNYXRjaFN0cik7Ci0KLSAgICBpZiggbWF0Y2ggPT0gTUFUQ0hfU1VCU1RSICkKLSAgICB7Ci0gICAgICBzX2xlbmd0aCA9IHN0cmxlbihscE1hdGNoU3RyKTsKLSAgICAgIGlmKCAhc19sZW5ndGggKSByZXR1cm4gKGxwaGwtPkl0ZW1zQ291bnQpPzA6TEJfRVJSOwotICAgIH0KLSAgfQotCi0gIGxwbHMgPSBMaXN0Qm94R2V0SXRlbShscGhsLCBGaXJzdCk7Ci0gIENvdW50ID0gMDsKLSAgd2hpbGUobHBscyAhPSBOVUxMKSAKLSAgewotICAgIGlmIChscGhsLT5IYXNTdHJpbmdzKSAKLSAgICB7Ci0gICAgICBpZiAoICggc19sZW5ndGggKT8gIWxzdHJuY21waTMyQShscGxzLT5pdGVtVGV4dCwgbHBNYXRjaFN0ciwgc19sZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgICAgIDogIWxzdHJjbXBpMzJBKGxwbHMtPml0ZW1UZXh0LCBscE1hdGNoU3RyKSAgKSByZXR1cm4gQ291bnQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGlmICggbHBscy0+bWlzLml0ZW1EYXRhID09IChEV09SRClscE1hdGNoU3RyICkgcmV0dXJuIENvdW50OwotCi0gICAgbHBscyA9IGxwbHMtPmxwTmV4dDsKLSAgICBDb3VudCsrOwotICB9Ci0KLSAgLyogU3RhcnQgb3ZlciBhdCB0b3AgKi8KLSAgQ291bnQgPSAwOwotICBscGxzID0gbHBobC0+bHBGaXJzdDsKLQotICB3aGlsZSAoQ291bnQgPCBGaXJzdCkgCi0gIHsKLSAgICBpZiAobHBobC0+SGFzU3RyaW5ncykgCi0gICAgewotICAgICAgaWYgKCAoIHNfbGVuZ3RoICk/ICFsc3RybmNtcGkzMkEobHBscy0+aXRlbVRleHQsIGxwTWF0Y2hTdHIsIHNfbGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICAgICA6ICFsc3RyY21waTMyQShscGxzLT5pdGVtVGV4dCwgbHBNYXRjaFN0cikgICkgcmV0dXJuIENvdW50OwotICAgIH0KLSAgICBlbHNlCi0gICAgICBpZiAoIGxwbHMtPm1pcy5pdGVtRGF0YSA9PSAoRFdPUkQpbHBNYXRjaFN0ciApIHJldHVybiBDb3VudDsKLSAgICAKLSAgICBscGxzID0gbHBscy0+bHBOZXh0OwotICAgIENvdW50Kys7Ci0gIH0KLQotICByZXR1cm4gTEJfRVJSOwotfQotCi1pbnQgTGlzdEJveEZpbmRTdHJpbmcoTFBIRUFETElTVCBscGhsLCBVSU5UMTYgbkZpcnN0LCBTRUdQVFIgTWF0Y2hTdHIpCi17Ci0gIHJldHVybiBsYkZpbmRTdHJpbmcobHBobCwgbkZpcnN0LCBNYXRjaFN0ciwgTUFUQ0hfU1VCU1RSICk7Ci19Ci0KLWludCBMaXN0Qm94RmluZFN0cmluZ0V4YWN0KExQSEVBRExJU1QgbHBobCwgVUlOVDE2IG5GaXJzdCwgU0VHUFRSIE1hdGNoU3RyKQotewotICByZXR1cm4gbGJGaW5kU3RyaW5nKGxwaGwsIG5GaXJzdCwgTWF0Y2hTdHIsIE1BVENIX0VYQUNUICk7Ci19Ci0KLWludCBMaXN0Qm94UmVzZXRDb250ZW50KExQSEVBRExJU1QgbHBobCkKLXsKLSAgICBMUExJU1RTVFJVQ1QgbHBsczsKLSAgICBpbnQgaTsKLQotICAgIGlmIChscGhsLT5JdGVtc0NvdW50ID09IDApIHJldHVybiAwOwotCi0gICAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwgIkxpc3RCb3hSZXNldENvbnRlbnQgLy8gSXRlbUNvdW50ID0gJWRcbiIsCi0JbHBobC0+SXRlbXNDb3VudCk7Ci0KLSAgICBmb3IoaSA9IDA7IGkgPCBscGhsLT5JdGVtc0NvdW50OyBpKyspIHsKLSAgICAgIGxwbHMgPSBscGhsLT5scEZpcnN0OwotICAgICAgaWYgKGxwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKLQotICAgICAgaWYgKGxwaGwtPk93bmVyRHJhd24pIGxiRGVsZXRlSXRlbU5vdGlmeShscGhsLCBscGxzKTsKLQotICAgICAgbHBobC0+bHBGaXJzdCA9IGxwbHMtPmxwTmV4dDsKLSAgICAgIGlmIChscGxzLT5oRGF0YSAhPSAwKSBMSVNUX0hFQVBfRlJFRShscGhsLCBscGxzLT5oRGF0YSk7Ci0gICAgICBmcmVlKGxwbHMpOwotICAgIH0KLSAgICBMaXN0Qm94SW5pdGlhbGl6ZShscGhsKTsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2VsZWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotaW50IExpc3RCb3hTZXRDdXJTZWwoTFBIRUFETElTVCBscGhsLCBXT1JEIHdJbmRleCkKLXsKLSAgTFBMSVNUU1RSVUNUIGxwbHM7Ci0KLSAgLyogdXNlIExpc3RCb3hTZXRTZWwgaW5zdGVhZCAqLwotICBpZiAobHBobC0+ZHdTdHlsZSAmIChMQlNfTVVMVElQTEVTRUwgfCBMQlNfRVhURU5ERURTRUwpICkgcmV0dXJuIDA7Ci0KLSAgLyogdW5zZWxlY3QgcHJldmlvdXMgaXRlbSAqLwotICBpZiAobHBobC0+SXRlbUZvY3VzZWQgIT0gLTEpIHsKLSAgICBscGhsLT5QcmV2Rm9jdXNlZCA9IGxwaGwtPkl0ZW1Gb2N1c2VkOwotICAgIGxwbHMgPSBMaXN0Qm94R2V0SXRlbShscGhsLCBscGhsLT5JdGVtRm9jdXNlZCk7Ci0gICAgaWYgKGxwbHMgPT0gMCkgcmV0dXJuIExCX0VSUjsKLSAgICBscGxzLT5pdGVtU3RhdGUgPSAwOwotICB9Ci0KLSAgaWYgKCh3SW5kZXggIT0gKFVJTlQxNiktMSkgJiYgKHdJbmRleCA8IGxwaGwtPkl0ZW1zQ291bnQpKQotICB7Ci0gICAgbHBobC0+SXRlbUZvY3VzZWQgPSB3SW5kZXg7Ci0gICAgbHBscyA9IExpc3RCb3hHZXRJdGVtKGxwaGwsIHdJbmRleCk7Ci0gICAgaWYgKGxwbHMgPT0gMCkgcmV0dXJuIExCX0VSUjsKLSAgICBscGxzLT5pdGVtU3RhdGUgPSBPRFNfU0VMRUNURUQgfCBPRFNfRk9DVVM7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHJldHVybiBMQl9FUlI7Ci19Ci0KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRpciBsaXN0aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1MT05HIExpc3RCb3hEaXJlY3RvcnkoTFBIRUFETElTVCBscGhsLCBVSU5UMTYgYXR0cmliLCBMUENTVFIgZmlsZXNwZWMpCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZGltZW5zaW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLWludCBMaXN0Qm94R2V0SXRlbVJlY3QoTFBIRUFETElTVCBscGhsLCBXT1JEIHdJbmRleCwgTFBSRUNUMTYgbHByZWN0KQotewotICBMUExJU1RTVFJVQ1QgbHBscyA9IExpc3RCb3hHZXRJdGVtKGxwaGwsd0luZGV4KTsKLQotICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJMaXN0Qm94IExCX0dFVElURU1SRUNUICVpICVwIiwgd0luZGV4LGxwbHMpOwotICBpZiAobHBscyA9PSBOVUxMKQotICB7Ci0gICAgaWYgKGxwaGwtPmR3U3R5bGUgJiBMQlNfT1dORVJEUkFXVkFSSUFCTEUpCi0gICAgICByZXR1cm4gTEJfRVJSOwotICAgIGVsc2UgCi0gICAgewotICAgICBHZXRDbGllbnRSZWN0MTYobHBobC0+aFNlbGYsbHByZWN0KTsKLSAgICAgbHByZWN0LT5ib3R0b209bHBobC0+U3RkSXRlbUhlaWdodDsKLSAgICAgaWYgKGxwcmVjdC0+cmlnaHQ8MCkgbHByZWN0LT5yaWdodD0wOwotICAgIH0KLSAgfQotICBlbHNlCi0gICAqbHByZWN0ID0gbHBscy0+aXRlbVJlY3Q7Ci0gIGRwcmludGZfbGlzdGJveChzdGRkZWIsIiA9ICVkLCVkICAlZCwlZFxuIiwgbHByZWN0LT5sZWZ0LGxwcmVjdC0+dG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwcmVjdC0+cmlnaHQsbHByZWN0LT5ib3R0b20pOwotICByZXR1cm4gMDsKLX0KLQotCi1pbnQgTGlzdEJveFNldEl0ZW1IZWlnaHQoTFBIRUFETElTVCBscGhsLCBXT1JEIHdJbmRleCwgbG9uZyBoZWlnaHQpCi17Ci0gIExQTElTVFNUUlVDVCBscGxzOwotCi0gIGlmICghKGxwaGwtPmR3U3R5bGUgJiBMQlNfT1dORVJEUkFXVkFSSUFCTEUpKSB7Ci0gICAgbHBobC0+U3RkSXRlbUhlaWdodCA9IChzaG9ydCloZWlnaHQ7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgCi0gIGxwbHMgPSBMaXN0Qm94R2V0SXRlbShscGhsLCB3SW5kZXgpOwotICBpZiAobHBscyA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOwotICAKLSAgbHBscy0+bWlzLml0ZW1IZWlnaHQgPSBoZWlnaHQ7Ci0gIHJldHVybiAwOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdHJpbmcgc2VhcmNoIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLyAgCi0KLWludCBMaXN0Qm94RmluZE5leHRNYXRjaChMUEhFQURMSVNUIGxwaGwsIFdPUkQgd0NoYXIpCi17Ci0gIExQTElTVFNUUlVDVCBscGxzOwotICBVSU5UMTYgY291bnQsZmlyc3Q7Ci0KLSAgaWYgKChjaGFyKXdDaGFyIDwgJyAnKSByZXR1cm4gTEJfRVJSOwotICBpZiAoIWxwaGwtPkhhc1N0cmluZ3MpIHJldHVybiBMQl9FUlI7Ci0KLSAgbHBscyA9IGxwaGwtPmxwRmlyc3Q7Ci0gIAotICBmb3IgKGNvdW50ID0gMDsgbHBscyAhPSBOVUxMOyBscGxzID0gbHBscy0+bHBOZXh0LCBjb3VudCsrKSB7Ci0gICAgaWYgKHRvbG93ZXIoKmxwbHMtPml0ZW1UZXh0KSA9PSB0b2xvd2VyKChjaGFyKXdDaGFyKSkgYnJlYWs7Ci0gIH0KLSAgaWYgKGxwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKLSAgZmlyc3QgPSBjb3VudDsKLSAgZm9yKDsgbHBscyAhPSBOVUxMOyBscGxzID0gbHBscy0+bHBOZXh0LCBjb3VudCsrKSB7Ci0gICAgaWYgKCpscGxzLT5pdGVtVGV4dCAhPSAoY2hhcil3Q2hhcikgCi0gICAgICBicmVhazsKLSAgICBpZiAoKHNob3J0KSBjb3VudCA+IGxwaGwtPkl0ZW1Gb2N1c2VkKQotICAgICAgcmV0dXJuIGNvdW50OwotICB9Ci0gIHJldHVybiBmaXJzdDsKLX0KZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3Njcm9sbC5jIGIvY29udHJvbHMvc2Nyb2xsLmMKaW5kZXggODE5ZmY1ZC4uZDIzNzFmMSAxMDA2NDQKLS0tIGEvY29udHJvbHMvc2Nyb2xsLmMKKysrIGIvY29udHJvbHMvc2Nyb2xsLmMKQEAgLTQyMSwxMSArNDIxLDcgQEAKIAogICAgICAgLyogRHJhdyB0aGUgc2Nyb2xsIGJhciBmcmFtZSAqLwogCi0gICAgTW92ZVRvKCBoZGMsIHIubGVmdCwgci50b3AgKTsKLSAgICBMaW5lVG8zMiggaGRjLCByLnJpZ2h0LTEsIHIudG9wICk7Ci0gICAgTGluZVRvMzIoIGhkYywgci5yaWdodC0xLCByLmJvdHRvbS0xICk7Ci0gICAgTGluZVRvMzIoIGhkYywgci5sZWZ0LCByLmJvdHRvbS0xICk7Ci0gICAgTGluZVRvMzIoIGhkYywgci5sZWZ0LCByLnRvcCApOworICAgIEdSQVBIX0RyYXdSZWN0YW5nbGUoIGhkYywgci5sZWZ0LCByLnRvcCwgci5yaWdodCAtIDEsIHIuYm90dG9tIC0gMSwgMCk7CiAKICAgICAgIC8qIERyYXcgdGhlIHNjcm9sbCByZWN0YW5nbGVzIGFuZCB0aHVtYiAqLwogCmRpZmYgLS1naXQgYS9jb250cm9scy93aWRnZXRzLmMgYi9jb250cm9scy93aWRnZXRzLmMKaW5kZXggZmZjMmEyMy4uNmYxNzIzZiAxMDA2NDQKLS0tIGEvY29udHJvbHMvd2lkZ2V0cy5jCisrKyBiL2NvbnRyb2xzL3dpZGdldHMuYwpAQCAtNCw2ICs0LDggQEAKICAqIENvcHlyaWdodCAxOTkzIEFsZXhhbmRyZSBKdWxsaWFyZAogICovCiAKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKwogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgImNvbW1jdHJsLmgiCiAjaW5jbHVkZSAiYnV0dG9uLmgiCkBAIC0yMCw2ICsyMiwxMCBAQAogCiBleHRlcm4gTFJFU1VMVCBFZGl0V25kUHJvYyggSFdORDMyIGh3bmQsIFVJTlQzMiBtc2csIFdQQVJBTTMyIHdQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtICk7CitleHRlcm4gTFJFU1VMVCBDb21ib1duZFByb2MoIEhXTkQzMiBod25kLCBVSU5UMzIgbXNnLCBXUEFSQU0zMiB3UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0gKTsKK2V4dGVybiBMUkVTVUxUIENvbWJvTEJXbmRQcm9jKCBIV05EMzIgaHduZCwgVUlOVDMyIG1zZywgV1BBUkFNMzIgd1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0gKTsKIGV4dGVybiBMUkVTVUxUIExpc3RCb3hXbmRQcm9jKCBIV05EMzIgaHduZCwgVUlOVDMyIG1zZywgV1BBUkFNMzIgd1BhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0gKTsKIGV4dGVybiBMUkVTVUxUIFBvcHVwTWVudVduZFByb2MoIEhXTkQzMiBod25kLCBVSU5UMzIgbXNnLCBXUEFSQU0zMiB3UGFyYW0sCkBAIC00MiwxMCArNDgsNiBAQAogewogICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19QQVJFTlREQywKICAgICAgICBzaXplb2YoU1RBVElDSU5GTyksIDAsICJTdGF0aWNXbmRQcm9jIiwgIlN0YXRpYyIgfSwKLSAgICB7IENTX0dMT0JBTENMQVNTIHwgQ1NfUEFSRU5UREMgfCBDU19EQkxDTEtTLAotICAgICAgOCwgMCwgIkNvbWJvQm94V25kUHJvYyIsICJDb21ib0JveCIgfSwKLSAgICB7IENTX0dMT0JBTENMQVNTIHwgQ1NfREJMQ0xLUyB8IENTX1NBVkVCSVRTLAotICAgICAgOCwgMCwgIkNvbWJvTEJveFduZFByb2MiLCAiQ29tYm9MQm94IiB9LAogICAgIHsgQ1NfR0xPQkFMQ0xBU1MsIHNpemVvZihNRElDTElFTlRJTkZPKSwKICAgICAgIFNUT0NLX0xUR1JBWV9CUlVTSCwgIk1ESUNsaWVudFduZFByb2MiLCAiTURJQ2xpZW50IiB9CiB9OwpAQCAtNTUsMjcgKzU3LDM4IEBACiAKIC8qIFdpbjMyIGJ1aWx0LWluIGNsYXNzZXMgKi8KIAotc3RhdGljIFdORENMQVNTMzJBIFdJREdFVFNfQnVpbHRpbkNsYXNzZXMzMltdID0KK3N0YXRpYyBXTkRDTEFTUzMyQSBXSURHRVRTX0J1aWx0aW5DbGFzc2VzMzJbQklDMzJfTkJfQ0xBU1NFU10gPQogeworICAgIC8qIEJJQzMyX0JVVFRPTiAqLwogICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19EQkxDTEtTIHwgQ1NfVlJFRFJBVyB8IENTX0hSRURSQVcgfCBDU19QQVJFTlREQywKICAgICAgIEJ1dHRvblduZFByb2MsIDAsIHNpemVvZihCVVRUT05JTkZPKSwgMCwgMCwgMCwgMCwgMCwgIkJ1dHRvbiIgfSwKKyAgICAvKiBCSUMzMl9FRElUICovCiAgICAgeyBDU19HTE9CQUxDTEFTUyB8IENTX0RCTENMS1MgLyp8IENTX1BBUkVOVERDKi8sCiAgICAgICBFZGl0V25kUHJvYywgMCwgc2l6ZW9mKHZvaWQgKiksIDAsIDAsIDAsIDAsIDAsICJFZGl0IiB9LAorICAgIC8qIEJJQzMyX0xJU1RCT1ggKi8KICAgICB7IENTX0dMT0JBTENMQVNTIHwgQ1NfREJMQ0xLUyAvKnwgQ1NfUEFSRU5UREMqLywKICAgICAgIExpc3RCb3hXbmRQcm9jLCAwLCBzaXplb2Yodm9pZCAqKSwgMCwgMCwgMCwgMCwgMCwgIkxpc3RCb3giIH0sCisgICAgLyogQklDMzJfQ09NQk8gKi8KKyAgICB7IENTX0dMT0JBTENMQVNTIHwgQ1NfUEFSRU5UREMgfCBDU19EQkxDTEtTLCAKKyAgICAgIENvbWJvV25kUHJvYywgMCwgc2l6ZW9mKHZvaWQgKiksIDAsIDAsIDAsIDAsIDAsICJDb21ib0JveCIgfSwKKyAgICAvKiBCSUMzMl9DT01CT0xCICovCisgICAgeyBDU19HTE9CQUxDTEFTUyB8IENTX0RCTENMS1MgfCBDU19TQVZFQklUUywKKyAgICAgIENvbWJvTEJXbmRQcm9jLCAwLCBzaXplb2Yodm9pZCAqKSwgMCwgMCwgMCwgMCwgMCwgIkNvbWJvTEJveCIgfSwKKyAgICAvKiBCSUMzMl9QT1BVUE1FTlUgKi8KICAgICB7IENTX0dMT0JBTENMQVNTIHwgQ1NfU0FWRUJJVFMsIFBvcHVwTWVudVduZFByb2MsCiAgICAgICAwLCBzaXplb2YoSE1FTlUzMiksIDAsIDAsIDAsIDAsIDAsIFBPUFVQTUVOVV9DTEFTU19OQU1FIH0sCisgICAgLyogQklDMzJfU0NST0xMICovCiAgICAgeyBDU19HTE9CQUxDTEFTUyB8IENTX0RCTENMS1MgfCBDU19WUkVEUkFXIHwgQ1NfSFJFRFJBVyB8IENTX1BBUkVOVERDLAogICAgICAgU2Nyb2xsQmFyV25kUHJvYywgMCwgc2l6ZW9mKFNDUk9MTEJBUl9JTkZPKSwgMCwgMCwgMCwgMCwgMCwgIlNjcm9sbEJhciJ9LAorICAgIC8qIEJJQzMyX0RFU0tUT1AgKi8KICAgICB7IENTX0dMT0JBTENMQVNTLCBEZXNrdG9wV25kUHJvYywgMCwgc2l6ZW9mKERFU0tUT1BJTkZPKSwKICAgICAgIDAsIDAsIDAsIDAsIDAsIERFU0tUT1BfQ0xBU1NfTkFNRSB9LAorICAgIC8qIEJJQzMyX0RJQUxPRyAqLwogICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19TQVZFQklUUywgRGVmRGxnUHJvYzMyQSwgMCwgRExHV0lORE9XRVhUUkEsCiAgICAgICAwLCAwLCAwLCAwLCAwLCBESUFMT0dfQ0xBU1NfTkFNRSB9CiB9OwogCi0jZGVmaW5lIE5CX0JVSUxUSU5fQ0xBU1NFUzMyIFwKLSAgICAgICAgIChzaXplb2YoV0lER0VUU19CdWlsdGluQ2xhc3NlczMyKS9zaXplb2YoV0lER0VUU19CdWlsdGluQ2xhc3NlczMyWzBdKSkKLQorc3RhdGljIEFUT00gYmljQXRvbVRhYmxlW0JJQzMyX05CX0NMQVNTRVNdOwogCiAvKiBXaW4zMiBjb21tb24gY29udHJvbHMgKi8KIApAQCAtMTI0LDEzICsxMzcsMTMgQEAKIAogICAgIC8qIENyZWF0ZSAzMi1iaXQgY2xhc3NlcyAqLwogCi0gICAgZm9yIChpID0gMDsgaSA8IE5CX0JVSUxUSU5fQ0xBU1NFUzMyOyBpKyssIGNsYXNzMzIrKykKKyAgICBmb3IgKGkgPSAwOyBpIDwgQklDMzJfTkJfQ0xBU1NFUzsgaSsrLCBjbGFzczMyKyspCiAgICAgewogICAgICAgICAvKiBKdXN0IHRvIG1ha2Ugc3VyZSB0aGUgc3RyaW5nIGlzID4gMHgxMDAwMCAqLwogICAgICAgICBzdHJjcHkoIG5hbWUsIChjaGFyICopY2xhc3MzMi0+bHBzekNsYXNzTmFtZSApOwogICAgICAgICBjbGFzczMyLT5scHN6Q2xhc3NOYW1lID0gbmFtZTsKICAgICAgICAgY2xhc3MzMi0+aEN1cnNvciA9IExvYWRDdXJzb3IxNiggMCwgSURDX0FSUk9XICk7Ci0gICAgICAgIGlmICghUmVnaXN0ZXJDbGFzczMyQSggY2xhc3MzMiApKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghKGJpY0F0b21UYWJsZVtpXSA9IFJlZ2lzdGVyQ2xhc3MzMkEoIGNsYXNzMzIgKSkpIHJldHVybiBGQUxTRTsKICAgICB9CiAKICAgICBTRUdQVFJfRlJFRShuYW1lKTsKQEAgLTE1NiwzICsxNjksMTUgQEAKICAgICAgICAgUmVnaXN0ZXJDbGFzczMyQSggY2xhc3MzMiApOwogICAgIH0KIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBXSURHRVRTX0lzQ29udHJvbDMyCisgKgorICogQ2hlY2sgd2hldGhlciBwV25kIGlzIGEgYnVpbHQtaW4gY29udHJvbCBvciBub3QuCisgKi8KK0JPT0wzMglXSURHRVRTX0lzQ29udHJvbDMyKCBXTkQqIHBXbmQsIEJVSUxUSU5fQ0xBU1MzMiBjbHMgKQoreworICAgIGFzc2VydCggY2xzIDwgQklDMzJfTkJfQ0xBU1NFUyApOworICAgIHJldHVybiAocFduZC0+Y2xhc3MtPmF0b21OYW1lID09IGJpY0F0b21UYWJsZVtjbHNdKTsKK30KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL21zYy5jIGIvZGVidWdnZXIvbXNjLmMKaW5kZXggZmQ4ZGE3Ny4uODQ0ZTY0MiAxMDA2NDQKLS0tIGEvZGVidWdnZXIvbXNjLmMKKysrIGIvZGVidWdnZXIvbXNjLmMKQEAgLTE4NDMsNiArMTg0MywxMSBAQAogICAgKi8KICAgYWRkciA9IG1tYXAoMCwgc3RhdGJ1Zi5zdF9zaXplLCBQUk9UX1JFQUQsIAogCSAgICAgIE1BUF9QUklWQVRFLCBmZCwgMCk7CisgIGlmKCBhZGRyID09IChjaGFyICopIDB4ZmZmZmZmZmYgKQorICAgIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIG1tYXAgLkRCRyBmaWxlICVzXG4iLCBmaWxlbmFtZSk7CisgICAgICBnb3RvIGxlYXZlOworICAgIH0KIAogICAvKgogICAgKiBOb3cgdGhhdCB3ZSBoYXZlIHRoZSBmb3JtYWxpdGllcyBvdmVyIGFuZCBkb25lIHdpdGgsIHdlIG5lZWQKQEAgLTIxNjYsNiArMjE3MSwxMSBAQAogICAgKi8KICAgYWRkciA9IG1tYXAoMCwgc3RhdGJ1Zi5zdF9zaXplLCBQUk9UX1JFQUQsIAogCSAgICAgIE1BUF9QUklWQVRFLCBmZCwgMCk7CisgIGlmKCBhZGRyID09IChjaGFyICopIDB4ZmZmZmZmZmYgKQorICAgIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIG1tYXAgLkRCRyBmaWxlICVzXG4iLCBmaWxlbmFtZSk7CisgICAgICBnb3RvIGxlYXZlOworICAgIH0KIAogICBwZGJnID0gKExQSU1BR0VfU0VQQVJBVEVfREVCVUdfSEVBREVSKSBhZGRyOwogCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9zdGFicy5jIGIvZGVidWdnZXIvc3RhYnMuYwppbmRleCA5ZTY0YTM2Li44M2U5OWJmIDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9zdGFicy5jCisrKyBiL2RlYnVnZ2VyL3N0YWJzLmMKQEAgLTExMDMsNiArMTEwMywxMCBAQAogICAgKi8KICAgYWRkciA9IG1tYXAoMCwgc3RhdGJ1Zi5zdF9zaXplLCBQUk9UX1JFQUQsIAogCSAgICAgIE1BUF9QUklWQVRFLCBmZCwgMCk7CisgIGlmKCBhZGRyID09IChjaGFyICopIDB4ZmZmZmZmZmYgKQorICAgIHsKKyAgICAgIGdvdG8gbGVhdmU7CisgICAgfQogCiAgIC8qCiAgICAqIEdpdmUgYSBuaWNlIHN0YXR1cyBtZXNzYWdlIGhlcmUuLi4KQEAgLTEzMzcsNiArMTM0MSwxMCBAQAogICAgKi8KICAgYWRkciA9IG1tYXAoMCwgc3RhdGJ1Zi5zdF9zaXplLCBQUk9UX1JFQUQsIAogCSAgICAgIE1BUF9QUklWQVRFLCBmZCwgMCk7CisgIGlmKCBhZGRyID09IChjaGFyICopIDB4ZmZmZmZmZmYgKQorICAgIHsKKyAgICAgIGdvdG8gbGVhdmU7CisgICAgfQogCiAgIGFoZHIgPSAoc3RydWN0IGV4ZWMgKikgYWRkcjsKIApkaWZmIC0tZ2l0IGEvZmlsZXMvZG9zX2ZzLmMgYi9maWxlcy9kb3NfZnMuYwppbmRleCA0Njc4NmRkLi4zOGE4NGM4IDEwMDY0NAotLS0gYS9maWxlcy9kb3NfZnMuYworKysgYi9maWxlcy9kb3NfZnMuYwpAQCAtMzMsNiArMzMsMTUgQEAKIC8qIEZJWE1FOiBpcyBpdCBwb3NzaWJsZSB0byBnZXQgdGhpcyB0byB3b3JrIG9uIG90aGVyIHN5c3RlbXM/ICovCiAjaWZkZWYgbGludXgKICNkZWZpbmUgVkZBVF9JT0NUTF9SRUFERElSX0JPVEggIF9JT1IoJ3InLCAxLCBsb25nKQorLyogV2Ugd2FudCB0aGUgcmVhbCBrZXJuZWwgZGlyZW50IHN0cnVjdHVyZSwgbm90IHRoZSBsaWJjIG9uZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBsb25nIGRfaW5vOworICAgIGxvbmcgZF9vZmY7CisgICAgdW5zaWduZWQgc2hvcnQgZF9yZWNsZW47CisgICAgY2hhciBkX25hbWVbMjU2XTsKK30gS0VSTkVMX0RJUkVOVDsKKwogI2Vsc2UgICAvKiBsaW51eCAqLwogI3VuZGVmIFZGQVRfSU9DVExfUkVBRERJUl9CT1RIICAvKiBqdXN0IGluIGNhc2UuLi4gKi8KICNlbmRpZiAgLyogbGludXggKi8KQEAgLTgzLDcgKzkyLDcgQEAKICNpZmRlZiBWRkFUX0lPQ1RMX1JFQURESVJfQk9USAogICAgIGludCAgICAgICAgICAgIGZkOwogICAgIGNoYXIgICAgICAgICAgIHNob3J0X25hbWVbMTJdOwotICAgIHN0cnVjdCBkaXJlbnQgIGRpcmVudFsyXTsKKyAgICBLRVJORUxfRElSRU5UICBkaXJlbnRbMl07CiAjZW5kaWYKIH0gRE9TX0RJUjsKIApAQCAtOTQ4LDE2ICs5NTcsMTEgQEAKICAgICAgICAgaWYgKGRpcikgRE9TRlNfQ2xvc2VEaXIoZGlyKTsKICAgICAgICAgaWYgKCEqcGF0aCkgcGF0aCA9ICIvIjsKICAgICAgICAgaWYgKCEoZGlyID0gRE9TRlNfT3BlbkRpcihwYXRoKSkpIHJldHVybiAwOwotICAgICAgICBkcml2ZV9wYXRoID0gcGF0aDsKLSAgICAgICAgZHJpdmVfcm9vdCA9IDA7Ci0gICAgICAgIGlmIChEUklWRV9GaW5kRHJpdmVSb290KCAmZHJpdmVfcGF0aCApICE9IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAoKCpkcml2ZV9wYXRoID09ICcvJykgfHwgKCpkcml2ZV9wYXRoID09ICdcXCcpKSBkcml2ZV9wYXRoKys7Ci0gICAgICAgICAgICBpZiAoISpkcml2ZV9wYXRoKSBkcml2ZV9yb290ID0gMTsKLSAgICAgICAgfQorICAgICAgICBkcml2ZV9wYXRoID0gcGF0aCArIHN0cmxlbihEUklWRV9HZXRSb290KGRyaXZlKSk7CisgICAgICAgIHdoaWxlICgoKmRyaXZlX3BhdGggPT0gJy8nKSB8fCAoKmRyaXZlX3BhdGggPT0gJ1xcJykpIGRyaXZlX3BhdGgrKzsKKyAgICAgICAgZHJpdmVfcm9vdCA9ICEqZHJpdmVfcGF0aDsKICAgICAgICAgZHByaW50Zl9kb3NmcyhzdGRkZWIsICJET1NGU19GaW5kTmV4dDogZHJpdmVfcm9vdCA9ICVkXG4iLCBkcml2ZV9yb290KTsKICAgICAgICAgbHN0cmNweW4zMkEoIGJ1ZmZlciwgcGF0aCwgc2l6ZW9mKGJ1ZmZlcikgLSAxICk7Ci0gICAgICAgIAogICAgIH0KICAgICBzdHJjYXQoIGJ1ZmZlciwgIi8iICk7CiAgICAgcCA9IGJ1ZmZlciArIHN0cmxlbihidWZmZXIpOwpkaWZmIC0tZ2l0IGEvZmlsZXMvZHJpdmUuYyBiL2ZpbGVzL2RyaXZlLmMKaW5kZXggZGFiZWJmOC4uM2ZiNDNjMSAxMDA2NDQKLS0tIGEvZmlsZXMvZHJpdmUuYworKysgYi9maWxlcy9kcml2ZS5jCkBAIC00Myw2ICs0Myw4IEBACiAgICAgRFdPUkQgICAgIHNlcmlhbDsgICAgLyogZHJpdmUgc2VyaWFsIG51bWJlciAqLwogICAgIERSSVZFVFlQRSB0eXBlOyAgICAgIC8qIGRyaXZlIHR5cGUgKi8KICAgICBVSU5UMzIgICAgZmxhZ3M7ICAgICAvKiBkcml2ZSBmbGFncyAqLworICAgIGRldl90ICAgICBkZXY7ICAgICAgIC8qIHVuaXggZGV2aWNlIG51bWJlciAqLworICAgIGlub190ICAgICBpbm87ICAgICAgIC8qIHVuaXggaW5vZGUgbnVtYmVyICovCiB9IERPU0RSSVZFOwogCiAKQEAgLTEyNCw2ICsxMjYsNyBAQAogICAgIGNoYXIgbmFtZVtdID0gIkRyaXZlIEEiOwogICAgIGNoYXIgcGF0aFtNQVhfUEFUSE5BTUVfTEVOXTsKICAgICBjaGFyIGJ1ZmZlclsyMF07CisgICAgc3RydWN0IHN0YXQgZHJpdmVfc3RhdF9idWZmZXI7CiAgICAgY2hhciAqcDsKICAgICBET1NEUklWRSAqZHJpdmU7CiAKQEAgLTEzNCwxNCArMTM3LDI4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHAgPSBwYXRoICsgc3RybGVuKHBhdGgpIC0gMTsKICAgICAgICAgICAgIHdoaWxlICgocCA+IHBhdGgpICYmICgoKnAgPT0gJy8nKSB8fCAoKnAgPT0gJ1xcJykpKSAqcC0tID0gJ1wwJzsKLSAgICAgICAgICAgIGlmIChzdHJsZW4ocGF0aCkpCi0gICAgICAgICAgICAgICAgZHJpdmUtPnJvb3QgPSBIRUFQX3N0cmR1cEEoIFN5c3RlbUhlYXAsIDAsIHBhdGggKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBkcml2ZS0+cm9vdCA9IEhFQVBfc3RyZHVwQSggU3lzdGVtSGVhcCwgMCwgIi8iICk7CisgICAgICAgICAgICBpZiAoIXBhdGhbMF0pIHN0cmNweSggcGF0aCwgIi8iICk7CisKKyAgICAgICAgICAgIGlmIChzdGF0KCBwYXRoLCAmZHJpdmVfc3RhdF9idWZmZXIgKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJDb3VsZCBub3Qgc3RhdCAlcywgaWdub3JpbmcgZHJpdmUgJWM6XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsICdBJyArIGkgKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghU19JU0RJUihkcml2ZV9zdGF0X2J1ZmZlci5zdF9tb2RlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICIlcyBpcyBub3QgYSBkaXJlY3RvcnksIGlnbm9yaW5nIGRyaXZlICVjOlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCAnQScgKyBpICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRyaXZlLT5yb290ID0gSEVBUF9zdHJkdXBBKCBTeXN0ZW1IZWFwLCAwLCBwYXRoICk7CiAgICAgICAgICAgICBkcml2ZS0+ZG9zX2N3ZCAgPSBIRUFQX3N0cmR1cEEoIFN5c3RlbUhlYXAsIDAsICIiICk7CiAgICAgICAgICAgICBkcml2ZS0+dW5peF9jd2QgPSBIRUFQX3N0cmR1cEEoIFN5c3RlbUhlYXAsIDAsICIiICk7CiAgICAgICAgICAgICBkcml2ZS0+dHlwZSAgICAgPSBEUklWRV9HZXREcml2ZVR5cGUoIG5hbWUgKTsKICAgICAgICAgICAgIGRyaXZlLT5mbGFncyAgICA9IDA7CisgICAgICAgICAgICBkcml2ZS0+ZGV2ICAgICAgPSBkcml2ZV9zdGF0X2J1ZmZlci5zdF9kZXY7CisgICAgICAgICAgICBkcml2ZS0+aW5vICAgICAgPSBkcml2ZV9zdGF0X2J1ZmZlci5zdF9pbm87CiAKICAgICAgICAgICAgIC8qIEdldCB0aGUgZHJpdmUgbGFiZWwgKi8KICAgICAgICAgICAgIFBST0ZJTEVfR2V0V2luZUluaVN0cmluZyggbmFtZSwgIkxhYmVsIiwgbmFtZSwgZHJpdmUtPmxhYmVsLCAxMiApOwpAQCAtMTY3LDkgKzE4NCwxMCBAQAogICAgICAgICAgICAgICAgIERSSVZFX0N1ckRyaXZlID0gaTsKIAogICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgIGRwcmludGZfZG9zZnMoIHN0ZGRlYiwgIiVzOiBwYXRoPSVzIHR5cGU9JXMgbGFiZWw9JyVzJyBzZXJpYWw9JTA4bHggZmxhZ3M9JTA4eFxuIiwKKyAgICAgICAgICAgIGRwcmludGZfZG9zZnMoIHN0ZGRlYiwgIiVzOiBwYXRoPSVzIHR5cGU9JXMgbGFiZWw9JyVzJyBzZXJpYWw9JTA4bHggZmxhZ3M9JTA4eCBkZXY9JXggaW5vPSV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgcGF0aCwgRFJJVkVfVHlwZXNbZHJpdmUtPnR5cGVdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJpdmUtPmxhYmVsLCBkcml2ZS0+c2VyaWFsLCBkcml2ZS0+ZmxhZ3MgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlLT5sYWJlbCwgZHJpdmUtPnNlcmlhbCwgZHJpdmUtPmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClkcml2ZS0+ZGV2LCAoaW50KWRyaXZlLT5pbm8gKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIGRwcmludGZfZG9zZnMoIHN0ZGRlYiwgIiVzOiBub3QgZGVmaW5lZFxuIiwgbmFtZSApOwogICAgIH0KQEAgLTI1Miw1MSArMjcwLDU0IEBACiAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIHRyYW5zbGF0ZSBhIFVuaXggcGF0aCBpbnRvIGEgZHJpdmUgKyBET1MgcGF0aC4KICAqIFJldHVybiB2YWx1ZSBpcyB0aGUgZHJpdmUsIG9yIC0xIG9uIGVycm9yLiBPbiBzdWNjZXNzLCBwYXRoIGlzIG1vZGlmaWVkCiAgKiB0byBwb2ludCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBET1MgcGF0aC4KLSAqIEZJWE1FOiB0aGlzIG9ubHkgZG9lcyBhIHRleHR1YWwgY29tcGFyaXNvbiBvZiB0aGUgcGF0aCBuYW1lcywgYW5kIHdvbid0Ci0gKiAgICAgICAgd29yayB3ZWxsIGluIHRoZSBwcmVzZW5jZSBvZiBzeW1ib2xpYyBsaW5rcy4KICAqLwogaW50IERSSVZFX0ZpbmREcml2ZVJvb3QoIGNvbnN0IGNoYXIgKipwYXRoICkKIHsKKyAgICAvKiBpZGVhOiBjaGVjayBhdCBhbGwgJy8nIHBvc2l0aW9ucy4KKyAgICAgKiBJZiB0aGUgZGV2aWNlIGFuZCBpbm9kZSBvZiB0aGF0IHBhdGggaXMgaWRlbnRpY2FsIHdpdGggdGhlCisgICAgICogZGV2aWNlIGFuZCBpbm9kZSBvZiB0aGUgY3VycmVudCBkcml2ZSB0aGVuIHdlIGZvdW5kIGEgc29sdXRpb24uCisgICAgICogSWYgdGhlcmUgaXMgYW5vdGhlciBkcml2ZSBwb2ludGluZyB0byBhIGRlZXBlciBwb3NpdGlvbiBpbgorICAgICAqIHRoZSBmaWxlIHRyZWUsIHdlIHdhbnQgdG8gZmluZCB0aGF0IG9uZSwgbm90IHRoZSBlYXJsaWVyIHNvbHV0aW9uLgorICAgICAqLwogICAgIGludCBkcml2ZSwgcm9vdGRyaXZlID0gLTE7Ci0gICAgY29uc3QgY2hhciAqcDEsICpwMjsKKyAgICBjaGFyIGJ1ZmZlcltNQVhfUEFUSE5BTUVfTEVOXTsKKyAgICBjaGFyICpuZXh0ID0gYnVmZmVyOworICAgIGNvbnN0IGNoYXIgKnAgPSAqcGF0aDsKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKIAotICAgIGRwcmludGZfZG9zZnMoIHN0ZGRlYiwgIkRSSVZFX0ZpbmREcml2ZVJvb3Q6IHNlYXJjaGluZyAnJXMnXG4iLCAqcGF0aCApOwotICAgIGZvciAoZHJpdmUgPSAwOyBkcml2ZSA8IE1BWF9ET1NfRFJJVkVTOyBkcml2ZSsrKQorICAgIHN0cmNweSggYnVmZmVyLCAiLyIgKTsKKyAgICBmb3IgKDs7KQogICAgIHsKLSAgICAgICAgaWYgKCFET1NEcml2ZXNbZHJpdmVdLnJvb3QgfHwKLSAgICAgICAgICAgIChET1NEcml2ZXNbZHJpdmVdLmZsYWdzICYgRFJJVkVfRElTQUJMRUQpKSBjb250aW51ZTsKLSAgICAgICAgcDEgPSAqcGF0aDsKLSAgICAgICAgcDIgPSBET1NEcml2ZXNbZHJpdmVdLnJvb3Q7Ci0gICAgICAgIGRwcmludGZfZG9zZnMoIHN0ZGRlYiwgIkRSSVZFX0ZpbmREcml2ZVJvb3Q6IGNoZWNraW5nICVjOiAnJXMnXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAnQScgKyBkcml2ZSwgcDIgKTsKLSAgICAgICAgCi0gICAgICAgIHdoaWxlICgqcDIgPT0gJy8nKSBwMisrOwotICAgICAgICBpZiAoISpwMikKKyAgICAgICAgaWYgKHN0YXQoIGJ1ZmZlciwgJnN0ICkgfHwgIVNfSVNESVIoIHN0LnN0X21vZGUgKSkgYnJlYWs7CisKKyAgICAgICAgLyogRmluZCB0aGUgZHJpdmUgKi8KKworICAgICAgICBmb3IgKGRyaXZlID0gMDsgZHJpdmUgPCBNQVhfRE9TX0RSSVZFUzsgZHJpdmUrKykKICAgICAgICAgewotICAgICAgICAgICAgcm9vdGRyaXZlID0gZHJpdmU7Ci0gICAgICAgICAgICBjb250aW51ZTsgIC8qIExvb2sgaWYgdGhlcmUncyBhIGJldHRlciBtYXRjaCAqLworICAgICAgICAgICBpZiAoIURPU0RyaXZlc1tkcml2ZV0ucm9vdCB8fAorICAgICAgICAgICAgICAgKERPU0RyaXZlc1tkcml2ZV0uZmxhZ3MgJiBEUklWRV9ESVNBQkxFRCkpIGNvbnRpbnVlOworCisgICAgICAgICAgIGlmICgoRE9TRHJpdmVzW2RyaXZlXS5kZXYgPT0gc3Quc3RfZGV2KSAmJgorICAgICAgICAgICAgICAgKERPU0RyaXZlc1tkcml2ZV0uaW5vID09IHN0LnN0X2lubykpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHJvb3Rkcml2ZSA9IGRyaXZlOworICAgICAgICAgICAgICAgKnBhdGggPSBwOworICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUgKCgqcDEgPT0gJ1xcJykgfHwgKCpwMSA9PSAnLycpKSBwMSsrOwotICAgICAgICAgICAgd2hpbGUgKCpwMiA9PSAnLycpIHAyKys7Ci0gICAgICAgICAgICB3aGlsZSAoKCpwMSA9PSAqcDIpICYmICgqcDIpICYmICgqcDIgIT0gJy8nKSkgcDErKywgcDIrKzsKLSAgICAgICAgICAgIGlmICghKnAyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChJU19FTkRfT0ZfTkFNRSgqcDEpKSAvKiBPSywgZm91bmQgaXQgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICpwYXRoID0gcDE7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBkcml2ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICgqcDIgPT0gJy8nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChJU19FTkRfT0ZfTkFNRSgqcDEpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgIC8qIEdvIHRvIG5leHQgcGF0aCBlbGVtZW50ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsgIC8qIE5vIG1hdGNoLCBnbyB0byBuZXh0IGRyaXZlICovCi0gICAgICAgIH0KKworICAgICAgICAvKiBHZXQgdGhlIG5leHQgcGF0aCBjb21wb25lbnQgKi8KKworICAgICAgICAqbmV4dCsrID0gJy8nOworICAgICAgICB3aGlsZSAoKCpwID09ICcvJykgfHwgKCpwID09ICdcXCcpKSBwKys7CisgICAgICAgIGlmICghKnApIGJyZWFrOworICAgICAgICB3aGlsZSAoIUlTX0VORF9PRl9OQU1FKCpwKSkgKm5leHQrKyA9ICpwKys7CisgICAgICAgICpuZXh0ID0gMDsKICAgICB9CisKKyAgICBpZiAocm9vdGRyaXZlICE9IC0xKQorICAgICAgICBkcHJpbnRmX2Rvc2ZzKCBzdGRkZWIsICJEUklWRV9GaW5kRHJpdmVSb290OiAlcyAtPiBkcml2ZSAlYzosIHJvb3Q9JyVzJywgbmFtZT0nJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsICdBJyArIHJvb3Rkcml2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRE9TRHJpdmVzW3Jvb3Rkcml2ZV0ucm9vdCwgKnBhdGggKTsKICAgICByZXR1cm4gcm9vdGRyaXZlOwogfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9tZXRhZmlsZWRydi9pbml0LmMgYi9ncmFwaGljcy9tZXRhZmlsZWRydi9pbml0LmMKaW5kZXggMDhkYWM1ZC4uNzg1MWY0MyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvaW5pdC5jCisrKyBiL2dyYXBoaWNzL21ldGFmaWxlZHJ2L2luaXQuYwpAQCAtMjgsNiArMjgsNyBAQAogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBFeGNsdWRlVmlzUmVjdCAqLwogICAgIE1GRFJWX0V4dEZsb29kRmlsbCwgICAgICAgICAgICAgIC8qIHBFeHRGbG9vZEZpbGwgKi8KICAgICBNRkRSVl9FeHRUZXh0T3V0LCAgICAgICAgICAgICAgICAvKiBwRXh0VGV4dE91dCAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBHZXRDaGFyV2lkdGggKi8KICAgICBOVUxMIC8qIG5vIGltcGxlbWVudGF0aW9uICovLCAgICAvKiBwR2V0UGl4ZWwgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwR2V0VGV4dEV4dGVudFBvaW50ICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcEdldFRleHRNZXRyaWNzICovCmRpZmYgLS1naXQgYS9ncmFwaGljcy93aW4xNmRydi9NYWtlZmlsZS5pbiBiL2dyYXBoaWNzL3dpbjE2ZHJ2L01ha2VmaWxlLmluCmluZGV4IDBjNDA4YWQuLjg5NWIyYmIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3dpbjE2ZHJ2L01ha2VmaWxlLmluCisrKyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L01ha2VmaWxlLmluCkBAIC05LDYgKzksNyBAQAogCWZvbnQuYyBcCiAJaW5pdC5jIFwKIAlvYmplY3RzLmMgXAorCXBydGRydi5jIFwKIAl0ZXh0LmMKIAogYWxsOiAkKE1PRFVMRSkubwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3Mvd2luMTZkcnYvZm9udC5jIGIvZ3JhcGhpY3Mvd2luMTZkcnYvZm9udC5jCmluZGV4IDY3OGVkOTAuLjA5YmM3YWEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3dpbjE2ZHJ2L2ZvbnQuYworKysgYi9ncmFwaGljcy93aW4xNmRydi9mb250LmMKQEAgLTE4LDYgKzE4LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNJWkUzMiBzaXplICkKIHsKICAgICBXSU4xNkRSVl9QREVWSUNFICpwaHlzRGV2ID0gKFdJTjE2RFJWX1BERVZJQ0UgKilkYy0+cGh5c0RldjsKKyAgICBEV09SRCBkd1JldDsKKyAgICBleHRlcm4gRFJBV01PREUgRHJhd01vZGU7CisgICAgTFBEUkFXTU9ERSBscERyYXdNb2RlID0gJkRyYXdNb2RlOworICAgIFRFWFRYRk9STTE2IFRleHRYRm9ybTsKKyAgICBMUFRFWFRYRk9STTE2IGxwVGV4dFhGb3JtID0gJlRleHRYRm9ybTsKKyAgICBJbml0VGV4dFhGb3JtKGxwVGV4dFhGb3JtKTsKICAgICAKICAgICBwcmludGYoIkxQR0RJX0dldFRleHRFeHRQb2ludDogJTA0eCAlcyAlZCAlcFxuIiwgZGMtPmhTZWxmLCBzdHIsIGNvdW50LCBzaXplKTsKIApAQCAtMjUsNyArMzEsMTYgQEAKIAkvKiBBc3N1bWUgZml4ZWQgZm9udCAqLwogICAgIHNpemUtPmN4ID0gY291bnQgKiBwaHlzRGV2LT50bS50bUF2ZUNoYXJXaWR0aDsKICAgICBzaXplLT5jeSA9IHBoeXNEZXYtPnRtLnRtSGVpZ2h0OworCisKICAgICBwcmludGYoIkxQR0RJX0dldFRleHRFeHRQb2ludDogY3g9JWQsIGN5PSVkXG4iLCBzaXplLT5jeCxzaXplLT5jeSk7CisKKyAgICBkd1JldCA9IFBSVERSVl9FeHRUZXh0T3V0KHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIDAsIDAsIAorCQkJICAgICAgTlVMTCwgc3RyLCAKKwkJCSAgICAgIC1jb3VudCwgIHBoeXNEZXYtPnNlZ3B0ckZvbnRJbmZvLCBscERyYXdNb2RlLCAKKwkJCSAgICAgIGxwVGV4dFhGb3JtLCBOVUxMLCBOVUxMLCAwKTsKKyAgICBwcmludGYoIkxQR0RJX0dldFRleHRFeHRQb2ludDogY3g9MHgleCwgY3k9MHgleCBSZXQgMHgleFxuIiwgc2l6ZS0+Y3gsc2l6ZS0+Y3ksZHdSZXQpOworCiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTc5LDMgKzk0LDIwIEBACiAgICAgcHJpbnRmKCJJbiBXSU4xNkRSVl9GT05UX1NlbGVjdE9iamVjdFxuIik7CiAgICAgcmV0dXJuIEdldFN0b2NrT2JqZWN0MzIoU1lTVEVNX0ZJWEVEX0ZPTlQpOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRDaGFyV2lkdGgzMkEgICAgKEdESTMyLjE1NSkKKyAqLworQk9PTDMyIFdJTjE2RFJWX0dldENoYXJXaWR0aCggREMgKmRjLCBVSU5UMzIgZmlyc3RDaGFyLCBVSU5UMzIgbGFzdENoYXIsCisJCQkgICAgTFBJTlQzMiBidWZmZXIgKQoreworICAgIGludCBpOworICAgIFdJTjE2RFJWX1BERVZJQ0UgKnBoeXNEZXYgPSAoV0lOMTZEUlZfUERFVklDRSAqKWRjLT5waHlzRGV2OworICAgIC8qIFRURCBOZWVkIHRvIGNvcGUgd2l0aCBQUyBmb250cyAqLyAgICAKKyAgICBmb3IgKGkgPSBmaXJzdENoYXI7IGkgPD0gbGFzdENoYXI7IGkrKykKKyAgICAgICAgICpidWZmZXIrKyA9IHBoeXNEZXYtPnRtLnRtQXZlQ2hhcldpZHRoOworICAgIHJldHVybiBUUlVFOworfQorCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3Mvd2luMTZkcnYvaW5pdC5jIGIvZ3JhcGhpY3Mvd2luMTZkcnYvaW5pdC5jCmluZGV4IGZlYzBlYjAuLjQ3YTM5N2IgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3dpbjE2ZHJ2L2luaXQuYworKysgYi9ncmFwaGljcy93aW4xNmRydi9pbml0LmMKQEAgLTIyLDggKzIyLDcgQEAKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKLSNkZWZpbmUgU1VQUE9SVF9SRUFMSVpFRF9GT05UUyAxIAkKLXR5cGVkZWYgU0VHUFRSIExQUERFVklDRTsKKyNkZWZpbmUgU1VQUE9SVF9SRUFMSVpFRF9GT05UUyAxCiAKIAogI2lmIDAKQEAgLTUxLDYgKzUwLDcgQEAKICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwRXhjbHVkZVZpc1JlY3QgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwRXh0Rmxvb2RGaWxsICovCiAgICAgV0lOMTZEUlZfRXh0VGV4dE91dCwgICAgICAgICAgICAgLyogcEV4dFRleHRPdXQgKi8KKyAgICBXSU4xNkRSVl9HZXRDaGFyV2lkdGgsICAgICAgICAgICAvKiBwR2V0Q2hhcldpZHRoICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcEdldFBpeGVsICovCiAgICAgV0lOMTZEUlZfR2V0VGV4dEV4dGVudFBvaW50LCAgICAgLyogcEdldFRleHRFeHRlbnRQb2ludCAqLwogICAgIFdJTjE2RFJWX0dldFRleHRNZXRyaWNzLCAgICAgICAgIC8qIHBHZXRUZXh0TWV0cmljcyAqLwpAQCAtMTAxLDkgKzEwMSw3IEBACiB9OwogCiAKLSNkZWZpbmUgTUFYX1BSSU5URVJfRFJJVkVSUyAJMTYKIAotc3RhdGljIExPQURFRF9QUklOVEVSX0RSSVZFUiAqZ2FwTG9hZGVkUHJpbnRlckRyaXZlcnNbTUFYX1BSSU5URVJfRFJJVkVSU107CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE0OSwyOTUgKzE0Nyw2IEBACiAgICAgbHBEcmF3TW9kZS0+TGJrQ29sb3IJPSAweDAwZmZmZmZmOyAgIAogICAgIGxwRHJhd01vZGUtPkxUZXh0Q29sb3IJPSAweDAwMDAwMDAwOyAgICAgCiB9Ci0vKiAKLSAqIFRodW5raW5nIHV0aWxpdHkgZnVuY3Rpb25zCi0gKi8KLQotc3RhdGljIEJPT0wzMiBBZGREYXRhKFNFR1BUUiAqcFNlZ1B0ciwgY29uc3Qgdm9pZCAqcERhdGEsIGludCBuU2l6ZSwgU0VHUFRSIExpbWl0KQotewotICAgIEJPT0wzMiBiUmV0ID0gRkFMU0U7Ci0gICAgY2hhciAqcEJ1ZmZlciA9IFBUUl9TRUdfVE9fTElOKCgqcFNlZ1B0cikpOwotICAgIGNoYXIgKnBMaW1pdCA9IFBUUl9TRUdfVE9fTElOKExpbWl0KTsKLQotCi0gICAgaWYgKChwQnVmZmVyICsgblNpemUpIDwgcExpbWl0KQotICAgIHsKLQlEV09SRCAqcGR3ID0gKERXT1JEICopcFNlZ1B0cjsKLQlTRUdQVFIgU2VnUHRyT2xkID0gKnBTZWdQdHI7Ci0JU0VHUFRSIFNlZ1B0ck5ldzsKLQotCWRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiQWRkRGF0YTogQ29weWluZyAlZCBmcm9tICVwIHRvICVwKDB4JXgpXG4iLCBuU2l6ZSwgcERhdGEsIHBCdWZmZXIsIChVSU5UMzIpKnBTZWdQdHIpOwotCW1lbWNweShwQnVmZmVyLCBwRGF0YSwgblNpemUpOyAKLQlTZWdQdHJOZXcgPSAoU2VnUHRyT2xkICsgblNpemUgKyAxKTsKLQkqcGR3ID0gKERXT1JEKVNlZ1B0ck5ldzsKLSAgICB9Ci0gICAgcmV0dXJuIGJSZXQ7Ci19Ci0KLQotc3RhdGljIEJPT0wzMiBHZXRQYXJhbURhdGEoU0VHUFRSIFNlZ1B0clNyYyx2b2lkICpwRGF0YURlc3QsIGludCBuU2l6ZSkKLXsKLSAgICBjaGFyICpwU3JjID0gIFBUUl9TRUdfVE9fTElOKFNlZ1B0clNyYyk7Ci0gICAgY2hhciAqcERlc3QgPSBwRGF0YURlc3Q7Ci0KLSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIkdldFBhcmFtRGF0YTogQ29weWluZyAlZCBmcm9tICVseCglbHgpIHRvICVseFxuIiwgblNpemUsIChEV09SRClwU3JjLCAoRFdPUkQpU2VnUHRyU3JjLCAoRFdPUkQpcERhdGFEZXN0KTsKLSAgICBtZW1jcHkocERlc3QsIHBTcmMsIG5TaXplKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi1zdGF0aWMgdm9pZCBHZXRQcmludGVyRHJpdmVyRnVuY3Rpb25zKEhJTlNUQU5DRTE2IGhJbnN0LCBMT0FERURfUFJJTlRFUl9EUklWRVIgKnBMUEQpCi17Ci0jZGVmaW5lIExvYWRQcmludGVyRHJ2RnVuYyhBLEIpIHBMUEQtPmZuW0FdID0gXAotICAgICAgR2V0UHJvY0FkZHJlc3MxNihoSW5zdCwgTUFLRUlOVFJFU09VUkNFKEIpKQotCi0gICAgICBMb2FkUHJpbnRlckRydkZ1bmMoRlVOQ19DT05UUk9MLCBPUkRfQ09OVFJPTCk7IAkgICAgICAgCS8qIDMgKi8KLSAgICAgIExvYWRQcmludGVyRHJ2RnVuYyhGVU5DX0VOQUJMRSwgT1JEX0VOQUJMRSk7CQkvKiA1ICovCi0gICAgICBMb2FkUHJpbnRlckRydkZ1bmMoRlVOQ19FTlVNREZPTlRTLCBPUkRfRU5VTURGT05UUyk7CS8qIDYgKi8KLSAgICAgIExvYWRQcmludGVyRHJ2RnVuYyhGVU5DX1JFQUxJWkVPQkpFQ1QsIE9SRF9SRUFMSVpFT0JKRUNUKTsvKiAxMCAqLwotICAgICAgTG9hZFByaW50ZXJEcnZGdW5jKEZVTkNfRVhUVEVYVE9VVCwgT1JEX0VYVFRFWFRPVVQpOwkvKiAxNCAqLwotICAgICAgZHByaW50Zl93aW4xNmRydiAoc3RkZGViLCJnb3QgZnVuYyBDT05UUk9MIDB4JXAgZW5hYmxlIDB4JXAgZW51bURmb250cyAweCVwIHJlYWxpemVvYmplY3QgMHglcCBleHRleHRvdXQgMHglcFxuIiwKLSAgICAgICAgICAgICAgcExQRC0+Zm5bRlVOQ19DT05UUk9MXSwKLSAgICAgICAgICAgICAgcExQRC0+Zm5bRlVOQ19FTkFCTEVdLAotICAgICAgICAgICAgICBwTFBELT5mbltGVU5DX0VOVU1ERk9OVFNdLAotICAgICAgICAgICAgICBwTFBELT5mbltGVU5DX1JFQUxJWkVPQkpFQ1RdLAotICAgICAgICAgICAgICBwTFBELT5mbltGVU5DX0VYVFRFWFRPVVRdKTsKLSAgICAgIAotCi19Ci0KLXN0YXRpYyBMT0FERURfUFJJTlRFUl9EUklWRVIgKkZpbmRQcmludGVyRHJpdmVyRnJvbVBERVZJQ0UoU0VHUFRSIHNlZ3B0clBERVZJQ0UpCi17Ci0gICAgTE9BREVEX1BSSU5URVJfRFJJVkVSICpwTFBEID0gTlVMTDsKLQotICAgIC8qIEZpbmQgdGhlIHByaW50ZXIgZHJpdmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFBERVZJQ0UgKi8KLSAgICAvKiBFYWNoIG9mIHRoZSBQREVWSUNFIHN0cnVjdHVyZXMgaGFzIGEgUERFVklDRV9IRUFERVIgc3RydWN0dXJlICovCi0gICAgLyoganVzdCBiZWZvcmUgaXQgKi8KLSAgICBpZiAoc2VncHRyUERFVklDRSAhPSAoU0VHUFRSKU5VTEwpCi0gICAgewotCVBERVZJQ0VfSEVBREVSICpwUERIID0gKFBERVZJQ0VfSEVBREVSICopCi0JICAoUFRSX1NFR19UT19MSU4oc2VncHRyUERFVklDRSkgLSBzaXplb2YoUERFVklDRV9IRUFERVIpKTsgCi0gICAgICAgIHBMUEQgPSBwUERILT5wTFBEOwotICAgIH0KLSAgICByZXR1cm4gcExQRDsKLX0KLQotc3RhdGljIExPQURFRF9QUklOVEVSX0RSSVZFUiAqRmluZFByaW50ZXJEcml2ZXJGcm9tTmFtZShjb25zdCBjaGFyICpwc3pEcml2ZXIpCi17Ci0gICAgTE9BREVEX1BSSU5URVJfRFJJVkVSICpwTFBEID0gTlVMTDsKLSAgICBpbnQJCW5Ecml2ZXJTbG90ID0gMDsKLQotICAgIC8qIExvb2sgdG8gc2VlIGlmIHRoZSBwcmludGVyIGRyaXZlciBpcyBhbHJlYWR5IGxvYWRlZCAqLwotICAgIHdoaWxlIChwTFBEID09IE5VTEwgJiYgbkRyaXZlclNsb3QgPCBNQVhfUFJJTlRFUl9EUklWRVJTKQotICAgIHsKLQlMT0FERURfUFJJTlRFUl9EUklWRVIgKnB0bXBMUEQ7Ci0JcHRtcExQRCA9IGdhcExvYWRlZFByaW50ZXJEcml2ZXJzW25Ecml2ZXJTbG90KytdOwotCWlmIChwdG1wTFBEICE9IE5VTEwpCi0JewotCSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIkNvbXBhcmluZyAlcywlc1xuIixwdG1wTFBELT5zekRyaXZlcixwc3pEcml2ZXIpOwotCSAgICAvKiBGb3VuZCBkcml2ZXIgc3RvcmUgaW5mbywgZXhpdCBsb29wICovCi0JICAgIGlmIChsc3RyY21waTMyQShwdG1wTFBELT5zekRyaXZlciwgcHN6RHJpdmVyKSA9PSAwKQotCSAgICAgIHBMUEQgPSBwdG1wTFBEOwotCX0KLSAgICB9Ci0gICAgaWYgKHBMUEQgPT0gTlVMTCkgcHJpbnRmKCJDb3VsZG4ndCBmaW5kIGRyaXZlciAlc1xuIiwgcHN6RHJpdmVyKTsKLSAgICByZXR1cm4gcExQRDsKLX0KLS8qIAotICogTG9hZCBhIHByaW50ZXIgZHJpdmVyLCBhZGRpbmcgaXQgc2VsZiB0byB0aGUgbGlzdCBvZiBsb2FkZWQgZHJpdmVycy4KLSAqLwotCi1zdGF0aWMgTE9BREVEX1BSSU5URVJfRFJJVkVSICpMb2FkUHJpbnRlckRyaXZlcihjb25zdCBjaGFyICpwc3pEcml2ZXIpCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIEhJTlNUQU5DRTE2CWhJbnN0OwkKLSAgICBMT0FERURfUFJJTlRFUl9EUklWRVIgKnBMUEQgPSBOVUxMOwotICAgIGludAkJbkRyaXZlclNsb3QgPSAwOwotICAgIEJPT0wzMgliU2xvdEZvdW5kID0gRkFMU0U7Ci0KLSAgICAvKiBGaXJzdCBsb29rIHRvIHNlZSBpZiBkcml2ZXIgaXMgbG9hZGVkICovCi0gICAgcExQRCA9IEZpbmRQcmludGVyRHJpdmVyRnJvbU5hbWUocHN6RHJpdmVyKTsKLSAgICBpZiAocExQRCAhPSBOVUxMKQotICAgIHsKLQkvKiBBbHJlYWR5IGxvYWRlZCBzbyBpbmNyZWFzZSB1c2FnZSBjb3VudCAqLwotCXBMUEQtPm5Vc2FnZUNvdW50Kys7Ci0JcmV0dXJuIHBMUEQ7Ci0gICAgfQotCi0gICAgLyogTm90IGxvYWRlZCBzbyB0cnkgYW5kIGZpbmQgYW4gZW1wdHkgc2xvdCAqLwotICAgIHdoaWxlICghYlNsb3RGb3VuZCAmJiBuRHJpdmVyU2xvdCA8IE1BWF9QUklOVEVSX0RSSVZFUlMpCi0gICAgewotCWlmIChnYXBMb2FkZWRQcmludGVyRHJpdmVyc1tuRHJpdmVyU2xvdF0gPT0gTlVMTCkKLQkgIGJTbG90Rm91bmQgPSBUUlVFOwotCWVsc2UKLQkgIG5Ecml2ZXJTbG90Kys7Ci0gICAgfQotICAgIGlmICghYlNsb3RGb3VuZCkKLSAgICB7Ci0JcHJpbnRmKCJUb28gbWFueSBwcmludGVycyBkcml2ZXJzIGxvYWRlZFxuIik7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgewotICAgICAgICBjaGFyICpkcnZOYW1lID0gbWFsbG9jKHN0cmxlbihwc3pEcml2ZXIpKzUpOwotICAgICAgICBzdHJjcHkoZHJ2TmFtZSwgcHN6RHJpdmVyKTsKLSAgICAgICAgc3RyY2F0KGRydk5hbWUsICIuRFJWIik7Ci0gICAgICAgIGhJbnN0ID0gTG9hZExpYnJhcnkxNihkcnZOYW1lKTsKLSAgICB9Ci0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJMb2FkZWQgdGhlIGxpYnJhcnlcbiIpOwotCi0gICAgCi0gICAgaWYgKGhJbnN0IDw9IDMyKQotICAgIHsKLQkvKiBGYWlsZWQgdG8gbG9hZCBkcml2ZXIgKi8KLQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBsb2FkIHByaW50ZXIgZHJpdmVyICVzXG4iLCBwc3pEcml2ZXIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCUhBTkRMRTE2IGhIYW5kbGU7Ci0KLQkvKiBBbGxvY2F0ZSBzb21lIG1lbW9yeSBmb3IgcHJpbnRlciBkcml2ZXIgaW5mbyAqLwotCXBMUEQgPSBtYWxsb2Moc2l6ZW9mKExPQURFRF9QUklOVEVSX0RSSVZFUikpOwotCW1lbXNldChwTFBELCAwICwgc2l6ZW9mKExPQURFRF9QUklOVEVSX0RSSVZFUikpOwotCQotCXBMUEQtPmhJbnN0ID0gaEluc3Q7Ci0Jc3RyY3B5KHBMUEQtPnN6RHJpdmVyLHBzekRyaXZlcik7Ci0KLQkvKiBHZXQgRFMgZm9yIHRoZSBwcmludGVyIG1vZHVsZSAqLwotCXBMUEQtPmRzX3JlZyA9IGhJbnN0OwotCi0JZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJEUyBmb3IgJXMgaXMgJXhcbiIsIHBzekRyaXZlciwgcExQRC0+ZHNfcmVnKTsKLQotCS8qIEdldCBhZGRyZXNzIG9mIHByaW50ZXIgZHJpdmVyIGZ1bmN0aW9ucyAqLwotCUdldFByaW50ZXJEcml2ZXJGdW5jdGlvbnMoaEluc3QsIHBMUEQpOwotCi0JLyogU2V0IGluaXRpYWwgdXNhZ2UgY291bnQgKi8KLQlwTFBELT5uVXNhZ2VDb3VudCA9IDE7Ci0KLQkvKiBDcmVhdGUgYSB0aHVua2luZyBidWZmZXIgKi8KLQloSGFuZGxlID0gR2xvYmFsQWxsb2MxNihHSE5ELCAoMTAyNCAqIDgpKTsKLQlwTFBELT5oVGh1bmsgPSBoSGFuZGxlOwotCXBMUEQtPlRodW5rQnVmU2VnUHRyID0gV0lOMTZfR2xvYmFsTG9jazE2KGhIYW5kbGUpOwotCXBMUEQtPlRodW5rQnVmTGltaXQgPSBwTFBELT5UaHVua0J1ZlNlZ1B0ciArICgxMDI0KjgpOwotCi0JLyogVXBkYXRlIHRhYmxlIG9mIGxvYWRlZCBwcmludGVyIGRyaXZlcnMgKi8KLQlwTFBELT5uSW5kZXggPSBuRHJpdmVyU2xvdDsKLQlnYXBMb2FkZWRQcmludGVyRHJpdmVyc1tuRHJpdmVyU2xvdF0gPSBwTFBEOwotICAgIH0KLQotICAgIHJldHVybiBwTFBEOwotfQotLyoKLSAqICBDb250cm9sIChvcmRpbmFsIDMpCi0gKi8KLUlOVDE2IFBSVERSVl9Db250cm9sKExQUERFVklDRSBscERlc3REZXYsIFdPUkQgd2Z1bmN0aW9uLCBTRUdQVFIgbHBJbkRhdGEsIFNFR1BUUiBscE91dERhdGEpCi17Ci0gICAgLyogd2Z1bmN0aW9uID09IEVzY2FwZSBjb2RlICovCi0gICAgLyogbHBJbkRhdGEsIGxwT3V0RGF0YSBkZXBlbmQgb24gY29kZSAqLwotCi0gICAgV09SRCB3UmV0ID0gMDsKLSAgICBMT0FERURfUFJJTlRFUl9EUklWRVIgKnBMUEQgPSBOVUxMOwotCi0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfQ29udHJvbDogJTA4eCAweCV4ICUwOGx4ICUwOGx4XG4iLCAodW5zaWduZWQgaW50KWxwRGVzdERldiwgd2Z1bmN0aW9uLCBscEluRGF0YSwgbHBPdXREYXRhKTsKLQotICAgIGlmICgocExQRCA9IEZpbmRQcmludGVyRHJpdmVyRnJvbVBERVZJQ0UobHBEZXN0RGV2KSkgIT0gTlVMTCkKLSAgICB7Ci0JTE9ORyBsUDEsIGxQMywgbFA0OwotCVdPUkQgd1AyOwotCi0JaWYgKHBMUEQtPmZuW0ZVTkNfQ09OVFJPTF0gPT0gTlVMTCkKLQl7Ci0JICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiUFJURFJWX0NvbnRyb2w6IE5vdCBzdXBwb3J0ZWQgYnkgZHJpdmVyXG4iKTsKLQkgICAgcmV0dXJuIDA7Ci0JfQotCi0JbFAxID0gKFNFR1BUUilscERlc3REZXY7Ci0Jd1AyID0gd2Z1bmN0aW9uOwotCWxQMyA9IChTRUdQVFIpbHBJbkRhdGE7Ci0JbFA0ID0gKFNFR1BUUilscE91dERhdGE7Ci0KLQl3UmV0ID0gQ2FsbFRvMTZfd29yZF9sd2xsKHBMUEQtPmZuW0ZVTkNfQ09OVFJPTF0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxQMSwgd1AyLCBsUDMsIGxQNCk7Ci0gICAgfQotICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiUFJURFJWX0NvbnRyb2w6IHJldHVybiAleFxuIiwgd1JldCk7Ci0gICAgcmV0dXJuIHdSZXQ7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoKLSAqCUVuYWJsZSAob3JkaW5hbCA1KQotICovCi1zdGF0aWMgV09SRCBQUlREUlZfRW5hYmxlKExQVk9JRCBscERldkluZm8sIFdPUkQgd1N0eWxlLCBMUENTVFIgIGxwRGVzdERldlR5cGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgbHBEZXZpY2VOYW1lLCBMUENTVFIgbHBPdXRwdXRGaWxlLCBMUFZPSUQgbHBEYXRhKQotewotICAgIFdPUkQgd1JldCA9IDA7Ci0gICAgTE9BREVEX1BSSU5URVJfRFJJVkVSICpwTFBEID0gTlVMTDsKLQotICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiUFJURFJWX0VuYWJsZTogJXMgJXNcbiIsbHBEZXN0RGV2VHlwZSwgbHBPdXRwdXRGaWxlKTsKLQotICAgIC8qIEdldCB0aGUgcHJpbnRlciBkcml2ZXIgaW5mbyAqLwotICAgIGlmICh3U3R5bGUgPT0gSU5JVFBERVZJQ0UpCi0gICAgewotCXBMUEQgPSBGaW5kUHJpbnRlckRyaXZlckZyb21QREVWSUNFKChTRUdQVFIpbHBEZXZJbmZvKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlwTFBEID0gRmluZFByaW50ZXJEcml2ZXJGcm9tTmFtZSgoY2hhciAqKWxwRGV2aWNlTmFtZSk7Ci0gICAgfQotICAgIGlmIChwTFBEICE9IE5VTEwpCi0gICAgewotCUxPTkcgbFAxLCBsUDMsIGxQNCwgbFA1OwotCVdPUkQgd1AyOwotCVNFR1BUUiBTZWdQdHIgPSBwTFBELT5UaHVua0J1ZlNlZ1B0cjsKLQlTRUdQVFIgTGltaXQgPSBwTFBELT5UaHVua0J1ZkxpbWl0OwotCWludCAgIG5TaXplOwotCi0JaWYgKHBMUEQtPmZuW0ZVTkNfRU5BQkxFXSA9PSBOVUxMKQotCXsKLQkgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfRW5hYmxlOiBOb3Qgc3VwcG9ydGVkIGJ5IGRyaXZlclxuIik7Ci0JICAgIHJldHVybiAwOwotCX0KLQotCWlmICh3U3R5bGUgPT0gSU5JVFBERVZJQ0UpCi0JewotCSAgICAvKiBBbGwgcmVhZHkgYSAxNiBhZGRyZXNzICovCi0JICAgIGxQMSA9IChTRUdQVFIpbHBEZXZJbmZvOwotCX0KLQllbHNlCi0JewotCSAgICAvKiAzMiBiaXQgZGF0YSAqLwotCSAgICBsUDEgPSBTZWdQdHI7Ci0JICAgIG5TaXplID0gc2l6ZW9mKERldmljZUNhcHMpOwotCSAgICBBZGREYXRhKCZTZWdQdHIsIGxwRGV2SW5mbywgblNpemUsIExpbWl0KTsJCi0JfQotCQotCXdQMiA9IHdTdHlsZTsKLQkKLQlsUDMgPSBTZWdQdHI7Ci0JblNpemUgPSBzdHJsZW4obHBEZXN0RGV2VHlwZSkgKyAxOwotCUFkZERhdGEoJlNlZ1B0ciwgbHBEZXN0RGV2VHlwZSwgblNpemUsIExpbWl0KTsJCi0KLQlsUDQgPSBTZWdQdHI7IAotCW5TaXplID0gc3RybGVuKGxwT3V0cHV0RmlsZSkgKyAxOwotCUFkZERhdGEoJlNlZ1B0ciwgbHBPdXRwdXRGaWxlLCBuU2l6ZSwgTGltaXQpOwkKLQotCWxQNSA9IChMT05HKWxwRGF0YTsKLSAgICAgICAgCi0KLQl3UmV0ID0gQ2FsbFRvMTZfd29yZF9sd2xsbChwTFBELT5mbltGVU5DX0VOQUJMRV0sIAotCQkJCSAgIGxQMSwgd1AyLCBsUDMsIGxQNCwgbFA1KTsKLQotCS8qIEdldCB0aGUgZGF0YSBiYWNrICovCi0JaWYgKGxQMSAhPSAwICYmIHdTdHlsZSAhPSBJTklUUERFVklDRSkKLQl7Ci0JICAgIG5TaXplID0gc2l6ZW9mKERldmljZUNhcHMpOwotCSAgICBHZXRQYXJhbURhdGEobFAxLCBscERldkluZm8sIG5TaXplKTsKLQl9Ci0gICAgfQotICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiUFJURFJWX0VuYWJsZTogcmV0dXJuICV4XG4iLCB3UmV0KTsKLSAgICByZXR1cm4gd1JldDsKLX0KLQogCiAvKgogICogRW51bUNhbGxiYWNrIChHREkuMTU4KQpAQCAtNDkzLDEyMCArMjAyLDYgQEAKICAgICByZXR1cm4gd1JldDsKIH0KIAotLyoKLSAqCUVudW1ERm9udHMgKG9yZGluYWwgNikKLSAqLwotV09SRCBQUlREUlZfRW51bURGb250cyhMUFBERVZJQ0UgbHBEZXN0RGV2LCBMUFNUUiBscEZhY2VOYW1lLCAgCi0JCSAgICAgICBGQVJQUk9DMTYgbHBDYWxsYmFja0Z1bmMsIExQVk9JRCBscENsaWVudERhdGEpCi17Ci0gICAgV09SRCB3UmV0ID0gMDsKLSAgICBMT0FERURfUFJJTlRFUl9EUklWRVIgKnBMUEQgPSBOVUxMOwotCi0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfRW51bURGb250czpcbiIpOwotCi0gICAgaWYgKChwTFBEID0gRmluZFByaW50ZXJEcml2ZXJGcm9tUERFVklDRShscERlc3REZXYpKSAhPSBOVUxMKQotICAgIHsKLQlMT05HIGxQMSwgbFAyLCBsUDMsIGxQNDsKLQotCVNFR1BUUiBTZWdQdHIgPSBwTFBELT5UaHVua0J1ZlNlZ1B0cjsKLQlTRUdQVFIgTGltaXQgPSBwTFBELT5UaHVua0J1ZkxpbWl0OwotCWludCAgIG5TaXplOwotCi0JaWYgKHBMUEQtPmZuW0ZVTkNfRU5VTURGT05UU10gPT0gTlVMTCkKLQl7Ci0JICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiUFJURFJWX0VudW1ERm9udHM6IE5vdCBzdXBwb3J0ZWQgYnkgZHJpdmVyXG4iKTsKLQkgICAgcmV0dXJuIDA7Ci0JfQotCi0JbFAxID0gKFNFR1BUUilscERlc3REZXY7Ci0JCi0JaWYgKGxwRmFjZU5hbWUgPT0gTlVMTCkKLQl7Ci0JICAgIGxQMiA9IDA7Ci0JfQotCWVsc2UKLQl7Ci0JICAgIGxQMiA9IFNlZ1B0cjsKLQkgICAgblNpemUgPSBzdHJsZW4obHBGYWNlTmFtZSkgKyAxOwotCSAgICBBZGREYXRhKCZTZWdQdHIsIGxwRmFjZU5hbWUsIG5TaXplLCBMaW1pdCk7CQotCX0KLQotCWxQMyA9IChMT05HKWxwQ2FsbGJhY2tGdW5jOyAKLQotCWxQNCA9IChMT05HKWxwQ2xpZW50RGF0YTsKLSAgICAgICAgCi0Jd1JldCA9IENhbGxUbzE2X3dvcmRfbGxsbChwTFBELT5mbltGVU5DX0VOVU1ERk9OVFNdLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsUDEsIGxQMiwgbFAzLCBsUDQpOwotICAgIH0KLSAgICBlbHNlIAotICAgICAgICBwcmludGYoIkZhaWxlZCB0byBmaW5kIGRldmljZVxuIik7Ci0gICAgCi0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfRW51bURGb250czogcmV0dXJuICV4XG4iLCB3UmV0KTsKLSAgICByZXR1cm4gd1JldDsKLX0KLQotLyogCi0gKiBSZWFsaXplT2JqZWN0IChvcmRpbmFsIDEwKQotICovCi1EV09SRCBQUlREUlZfUmVhbGl6ZU9iamVjdChMUFBERVZJQ0UgbHBEZXN0RGV2LCBXT1JEIHdTdHlsZSwgCi0JCSAgICBMUFZPSUQgbHBJbk9iaiwgTFBWT0lEIGxwT3V0T2JqLAotICAgICAgICAgICAgICAgICAgICBMUFRFWFRYRk9STTE2IGxwVGV4dFhGb3JtKQotewotICAgIFdPUkQgZHdSZXQgPSAwOwotICAgIExPQURFRF9QUklOVEVSX0RSSVZFUiAqcExQRCA9IE5VTEw7Ci0gICAgCi0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfUmVhbGl6ZU9iamVjdDpcbiIpOwotICAgIAotICAgIGlmICgocExQRCA9IEZpbmRQcmludGVyRHJpdmVyRnJvbVBERVZJQ0UobHBEZXN0RGV2KSkgIT0gTlVMTCkKLSAgICB7Ci0JTE9ORyBsUDEsIGxQMywgbFA0LCBsUDU7ICAKLQlXT1JEIHdQMjsKLQlTRUdQVFIgU2VnUHRyID0gcExQRC0+VGh1bmtCdWZTZWdQdHI7Ci0JU0VHUFRSIExpbWl0ID0gcExQRC0+VGh1bmtCdWZMaW1pdDsKLQlpbnQgICBuU2l6ZTsKLQotCWlmIChwTFBELT5mbltGVU5DX1JFQUxJWkVPQkpFQ1RdID09IE5VTEwpCi0JewotCSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIlBSVERSVl9SZWFsaXplT2JqZWN0OiBOb3Qgc3VwcG9ydGVkIGJ5IGRyaXZlclxuIik7Ci0JICAgIHJldHVybiAwOwotCX0KLQotCWxQMSA9IGxwRGVzdERldjsKLQl3UDIgPSB3U3R5bGU7Ci0JCi0JbFAzID0gU2VnUHRyOwotCXN3aXRjaCAod1N0eWxlKQotCXsKLSAgICAgICAgY2FzZSAzOiAKLSAgICAgICAgICAgIG5TaXplID0gc2l6ZW9mKExPR0ZPTlQxNik7IAotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0JICAgIHByaW50ZigiUFJURFJWX1JlYWxpemVPYmplY3Q6IE9iamVjdCB0eXBlICVkIG5vdCBzdXBwb3J0ZWRcbiIsIHdTdHlsZSk7Ci0gICAgICAgICAgICBuU2l6ZSA9IDA7Ci0gICAgICAgICAgICAKLQl9Ci0JQWRkRGF0YSgmU2VnUHRyLCBscEluT2JqLCBuU2l6ZSwgTGltaXQpOwkKLQkKLQlsUDQgPSAoTE9ORylscE91dE9iajsKLQotCWlmIChscFRleHRYRm9ybSAhPSBOVUxMKQotCXsKLQkgICAgbFA1ID0gU2VnUHRyOwotCSAgICBuU2l6ZSA9IHNpemVvZihURVhUWEZPUk0xNik7Ci0JICAgIEFkZERhdGEoJlNlZ1B0ciwgbHBUZXh0WEZvcm0sIG5TaXplLCBMaW1pdCk7CQotCX0KLQllbHNlCi0JICBsUDUgPSAwTDsKLQotCWR3UmV0ID0gQ2FsbFRvMTZfbG9uZ19sd2xsbChwTFBELT5mbltGVU5DX1JFQUxJWkVPQkpFQ1RdLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxQMSwgd1AyLCBsUDMsIGxQNCwgbFA1KTsKLQotICAgIH0KLSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIlBSVERSVl9SZWFsaXplT2JqZWN0OiByZXR1cm4gJXhcbiIsIGR3UmV0KTsKLSAgICByZXR1cm4gZHdSZXQ7Ci19Ci0KLQogQk9PTDMyIFdJTjE2RFJWX0NyZWF0ZURDKCBEQyAqZGMsIExQQ1NUUiBkcml2ZXIsIExQQ1NUUiBkZXZpY2UsIExQQ1NUUiBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERFVk1PREUxNiogaW5pdERhdGEgKQogewpAQCAtNzk4LDExNiArMzkzLDYgQEAKICAgICByZXR1cm4gblJldDsKIH0KIAotRFdPUkQgUFJURFJWX0V4dFRleHRPdXQoTFBQREVWSUNFIGxwRGVzdERldiwgV09SRCB3RGVzdFhPcmcsIFdPUkQgd0Rlc3RZT3JnLAotICAgICAgICAgICAgICAgICAgICAgICAgUkVDVDE2ICpscENsaXBSZWN0LCBMUENTVFIgbHBTdHJpbmcsIFdPUkQgd0NvdW50LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIFNFR1BUUiBscEZvbnRJbmZvLCBMUERSQVdNT0RFIGxwRHJhd01vZGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgTFBURVhUWEZPUk0xNiBscFRleHRYRm9ybSwgU0hPUlQgKmxwQ2hhcldpZHRocywKLSAgICAgICAgICAgICAgICAgICAgICAgIFJFQ1QxNiAqICAgICBscE9wYXF1ZVJlY3QsIFdPUkQgd09wdGlvbnMpCi17Ci0gICAgRFdPUkQgZHdSZXQgPSAwOwotICAgIExPQURFRF9QUklOVEVSX0RSSVZFUiAqcExQRCA9IE5VTEw7Ci0gICAgCi0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfRXh0VGV4dE91dDpcbiIpOwotICAgIAotICAgIGlmICgocExQRCA9IEZpbmRQcmludGVyRHJpdmVyRnJvbVBERVZJQ0UobHBEZXN0RGV2KSkgIT0gTlVMTCkKLSAgICB7Ci0JTE9ORyBsUDEsIGxQNCwgbFA1LCBsUDcsIGxQOCwgbFA5LCBsUDEwLCBsUDExOyAgCi0JV09SRCB3UDIsIHdQMywgd1A2LCB3UDEyOwotICAgICAgICBJTlQxNiBpUDY7Ci0KLQlTRUdQVFIgU2VnUHRyID0gcExQRC0+VGh1bmtCdWZTZWdQdHI7Ci0JU0VHUFRSIExpbWl0ID0gcExQRC0+VGh1bmtCdWZMaW1pdDsKLQlpbnQgICBuU2l6ZTsKLQotCWlmIChwTFBELT5mbltGVU5DX0VYVFRFWFRPVVRdID09IE5VTEwpCi0JewotCSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIlBSVERSVl9FeHRUZXh0T3V0OiBOb3Qgc3VwcG9ydGVkIGJ5IGRyaXZlclxuIik7Ci0JICAgIHJldHVybiAwOwotCX0KLQotCWxQMSA9IGxwRGVzdERldjsKLQl3UDIgPSB3RGVzdFhPcmc7Ci0Jd1AzID0gd0Rlc3RZT3JnOwotCQotCWlmIChscENsaXBSZWN0ICE9IE5VTEwpCi0JewotCSAgICBsUDQgPSBTZWdQdHI7Ci0JICAgIG5TaXplID0gc2l6ZW9mKFJFQ1QxNik7Ci0gICAgICAgICAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIkFkZGluZyBscENsaXBSZWN0XG4iKTsKLSAgICAgICAgICAgIAotCSAgICBBZGREYXRhKCZTZWdQdHIsIGxwQ2xpcFJlY3QsIG5TaXplLCBMaW1pdCk7CQotCX0KLQllbHNlCi0JICBsUDQgPSAwTDsKLQotCWlmIChscFN0cmluZyAhPSBOVUxMKQotCXsKLQkgICAgLyogVFREIFdBUk5JTkcgVEhJUyBTVFJJTkcgSVNOVCBOVUxMIFRFUk1JTkFURUQgKi8KLQkgICAgbFA1ID0gU2VnUHRyOwotCSAgICBuU2l6ZSA9IHN0cmxlbihscFN0cmluZyk7Ci0gICAgICAgICAgICBuU2l6ZSA9IGFicyh3Q291bnQpOwotICAgICAgICAgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJBZGRpbmcgc3RyaW5nIHNpemUgJWRcbiIsblNpemUpOwotICAgICAgICAgICAgCi0JICAgIEFkZERhdGEoJlNlZ1B0ciwgbHBTdHJpbmcsIG5TaXplLCBMaW1pdCk7CQotCX0KLQllbHNlCi0JICBsUDUgPSAwTDsKLQkKLQlpUDYgPSB3Q291bnQ7Ci0JCi0JLyogVGhpcyBzaG91bGQgYmUgcmVhbGl6ZWQgYnkgdGhlIGRyaXZlciwgc28gaW4gMTZiaXQgZGF0YSBhcmVhICovCi0JbFA3ID0gbHBGb250SW5mbzsKLQkKLQlpZiAobHBEcmF3TW9kZSAhPSBOVUxMKQotCXsKLQkgICAgbFA4ID0gU2VnUHRyOwotCSAgICBuU2l6ZSA9IHNpemVvZihEUkFXTU9ERSk7Ci0gICAgICAgICAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgImFkZGluZyBscERyYXdNb2RlXG4iKTsKLSAgICAgICAgICAgIAotCSAgICBBZGREYXRhKCZTZWdQdHIsIGxwRHJhd01vZGUsIG5TaXplLCBMaW1pdCk7CQotCX0KLQllbHNlCi0JICBsUDggPSAwTDsKLQkKLQlpZiAobHBUZXh0WEZvcm0gIT0gTlVMTCkKLQl7Ci0JICAgIGxQOSA9IFNlZ1B0cjsKLQkgICAgblNpemUgPSBzaXplb2YoVEVYVFhGT1JNMTYpOwotICAgICAgICAgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJBZGRpbmcgVGV4dFhGb3JtXG4iKTsKLQkgICAgQWRkRGF0YSgmU2VnUHRyLCBscFRleHRYRm9ybSwgblNpemUsIExpbWl0KTsJCi0JfQotCWVsc2UKLQkgIGxQOSA9IDBMOwotCQotCWlmIChscENoYXJXaWR0aHMgIT0gTlVMTCkgCi0JICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIlBSVERSVl9FeHRUZXh0T3V0OiBDaGFyIHdpZHRocyBub3Qgc3VwcG9ydGVkXG4iKTsKLQlsUDEwID0gMDsKLQkKLQlpZiAobHBPcGFxdWVSZWN0ICE9IE5VTEwpCi0JewotCSAgICBsUDExID0gU2VnUHRyOwotCSAgICBuU2l6ZSA9IHNpemVvZihSRUNUMTYpOwotICAgICAgICAgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJBZGRpbmcgb3BhcXVlUmVjdFxuIik7Ci0JICAgIEFkZERhdGEoJlNlZ1B0ciwgbHBPcGFxdWVSZWN0LCBuU2l6ZSwgTGltaXQpOwkKLQl9Ci0JZWxzZQotCSAgbFAxMSA9IDBMOwotCQotCXdQMTIgPSB3T3B0aW9uczsKLQlkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIkNhbGxpbmcgZXh0dGV4dG91dCAweCVseCAweCV4IDB4JXggMHglbHhcbjB4JWx4IDB4JXggMHglbHggMHglbHhcbiIKLSAgICAgICAgICAgICAgICIweCVseCAweCVseCAweCVseCAweCV4XG4iLGxQMSwgd1AyLCB3UDMsIGxQNCwgCi0JCQkJCSAgIGxQNSwgaVA2LCBsUDcsIGxQOCwgbFA5LCBsUDEwLAotCQkJCQkgICBsUDExLCB3UDEyKTsKLQlkd1JldCA9IENhbGxUbzE2X2xvbmdfbHd3bGx3bGxsbGx3KHBMUEQtPmZuW0ZVTkNfRVhUVEVYVE9VVF0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxQMSwgd1AyLCB3UDMsIGxQNCwgCi0JCQkJCSAgIGxQNSwgaVA2LCBsUDcsIGxQOCwgbFA5LCBsUDEwLAotCQkJCQkgICBsUDExLCB3UDEyKTsKLSAgICAgICAgaWYgKGxwRHJhd01vZGUpCi0gICAgICAgICAgICBHZXRQYXJhbURhdGEobFA4LCBscERyYXdNb2RlLCBzaXplb2YoRFJBV01PREUpKTsKLSAgICB9Ci0gICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfRXh0VGV4dE91dDogcmV0dXJuICVseFxuIiwgZHdSZXQpOwotICAgIHJldHVybiBkd1JldDsKLX0KIAogCiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbjE2ZHJ2L3BydGRydi5jIGIvZ3JhcGhpY3Mvd2luMTZkcnYvcHJ0ZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg2NDc0MgotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L3BydGRydi5jCkBAIC0wLDAgKzEsNjAzIEBACisvKgorICogV2luZG93cyBEZXZpY2UgQ29udGV4dCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMTk5NiBKb2huIEhhcnZleQorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgIndpbjE2ZHJ2LmgiCisKKyNpbmNsdWRlICJjYWxsYmFjay5oIgorI2luY2x1ZGUgInN0ZGRlYnVnLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKworI2RlZmluZSBNQVhfUFJJTlRFUl9EUklWRVJTIAkxNgorc3RhdGljIExPQURFRF9QUklOVEVSX0RSSVZFUiAqZ2FwTG9hZGVkUHJpbnRlckRyaXZlcnNbTUFYX1BSSU5URVJfRFJJVkVSU107CisKKworc3RhdGljIHZvaWQgR2V0UHJpbnRlckRyaXZlckZ1bmN0aW9ucyhISU5TVEFOQ0UxNiBoSW5zdCwgTE9BREVEX1BSSU5URVJfRFJJVkVSICpwTFBEKQoreworI2RlZmluZSBMb2FkUHJpbnRlckRydkZ1bmMoQSkgcExQRC0+Zm5bRlVOQ18jI0FdID0gXAorICAgICAgR2V0UHJvY0FkZHJlc3MxNihoSW5zdCwgTUFLRUlOVFJFU09VUkNFKE9SRF8jI0EpKQorCisgICAgICBMb2FkUHJpbnRlckRydkZ1bmMoQklUQkxUKTsKKyAgICAgIExvYWRQcmludGVyRHJ2RnVuYyhDT0xPUklORk8pOworICAgICAgTG9hZFByaW50ZXJEcnZGdW5jKENPTlRST0wpOworICAgICAgTG9hZFByaW50ZXJEcnZGdW5jKERJU0FCTEUpOworICAgICAgTG9hZFByaW50ZXJEcnZGdW5jKEVOQUJMRSk7CisgICAgICBMb2FkUHJpbnRlckRydkZ1bmMoRU5VTURGT05UUyk7CisgICAgICBMb2FkUHJpbnRlckRydkZ1bmMoRU5VTU9CSik7CisgICAgICBMb2FkUHJpbnRlckRydkZ1bmMoT1VUUFVUKTsKKyAgICAgIExvYWRQcmludGVyRHJ2RnVuYyhQSVhFTCk7CisgICAgICBMb2FkUHJpbnRlckRydkZ1bmMoUkVBTElaRU9CSkVDVCk7CisgICAgICBMb2FkUHJpbnRlckRydkZ1bmMoU1RSQkxUKTsKKyAgICAgIExvYWRQcmludGVyRHJ2RnVuYyhTQ0FOTFIpOworICAgICAgTG9hZFByaW50ZXJEcnZGdW5jKERFVklDRU1PREUpOworICAgICAgTG9hZFByaW50ZXJEcnZGdW5jKEVYVFRFWFRPVVQpOworICAgICAgTG9hZFByaW50ZXJEcnZGdW5jKEdFVENIQVJXSURUSCk7CisgICAgICBMb2FkUHJpbnRlckRydkZ1bmMoREVWSUNFQklUTUFQKTsKKyAgICAgIExvYWRQcmludGVyRHJ2RnVuYyhGQVNUQk9SREVSKTsKKyAgICAgIExvYWRQcmludGVyRHJ2RnVuYyhTRVRBVFRSSUJVVEUpOworICAgICAgTG9hZFByaW50ZXJEcnZGdW5jKFNUUkVUQ0hCTFQpOworICAgICAgTG9hZFByaW50ZXJEcnZGdW5jKFNUUkVUQ0hESUJJVFMpOworICAgICAgTG9hZFByaW50ZXJEcnZGdW5jKFNFTEVDVEJJVE1BUCk7CisgICAgICBMb2FkUHJpbnRlckRydkZ1bmMoQklUTUFQQklUUyk7CisgICAgICBMb2FkUHJpbnRlckRydkZ1bmMoRVhUREVWSUNFTU9ERSk7CisgICAgICBMb2FkUHJpbnRlckRydkZ1bmMoREVWSUNFQ0FQQUJJTElUSUVTKTsKKyAgICAgIExvYWRQcmludGVyRHJ2RnVuYyhBRFZBTkNFRFNFVFVQRElBTE9HKTsKKyAgICAgIExvYWRQcmludGVyRHJ2RnVuYyhESUFMT0dGTik7CisgICAgICBMb2FkUHJpbnRlckRydkZ1bmMoUFNFVURPRURJVCk7CisgICAgICBkcHJpbnRmX3dpbjE2ZHJ2IChzdGRkZWIsImdvdCBmdW5jIENPTlRST0wgMHglcCBlbmFibGUgMHglcCBlbnVtRGZvbnRzIDB4JXAgcmVhbGl6ZW9iamVjdCAweCVwIGV4dGV4dG91dCAweCVwXG4iLAorICAgICAgICAgICAgICBwTFBELT5mbltGVU5DX0NPTlRST0xdLAorICAgICAgICAgICAgICBwTFBELT5mbltGVU5DX0VOQUJMRV0sCisgICAgICAgICAgICAgIHBMUEQtPmZuW0ZVTkNfRU5VTURGT05UU10sCisgICAgICAgICAgICAgIHBMUEQtPmZuW0ZVTkNfUkVBTElaRU9CSkVDVF0sCisgICAgICAgICAgICAgIHBMUEQtPmZuW0ZVTkNfRVhUVEVYVE9VVF0pOworICAgICAgCisKK30KKworCitzdGF0aWMgTE9BREVEX1BSSU5URVJfRFJJVkVSICpGaW5kUHJpbnRlckRyaXZlckZyb21OYW1lKGNvbnN0IGNoYXIgKnBzekRyaXZlcikKK3sKKyAgICBMT0FERURfUFJJTlRFUl9EUklWRVIgKnBMUEQgPSBOVUxMOworICAgIGludAkJbkRyaXZlclNsb3QgPSAwOworCisgICAgLyogTG9vayB0byBzZWUgaWYgdGhlIHByaW50ZXIgZHJpdmVyIGlzIGFscmVhZHkgbG9hZGVkICovCisgICAgd2hpbGUgKHBMUEQgPT0gTlVMTCAmJiBuRHJpdmVyU2xvdCA8IE1BWF9QUklOVEVSX0RSSVZFUlMpCisgICAgeworCUxPQURFRF9QUklOVEVSX0RSSVZFUiAqcHRtcExQRDsKKwlwdG1wTFBEID0gZ2FwTG9hZGVkUHJpbnRlckRyaXZlcnNbbkRyaXZlclNsb3QrK107CisJaWYgKHB0bXBMUEQgIT0gTlVMTCkKKwl7CisJICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiQ29tcGFyaW5nICVzLCVzXG4iLHB0bXBMUEQtPnN6RHJpdmVyLHBzekRyaXZlcik7CisJICAgIC8qIEZvdW5kIGRyaXZlciBzdG9yZSBpbmZvLCBleGl0IGxvb3AgKi8KKwkgICAgaWYgKGxzdHJjbXBpMzJBKHB0bXBMUEQtPnN6RHJpdmVyLCBwc3pEcml2ZXIpID09IDApCisJICAgICAgcExQRCA9IHB0bXBMUEQ7CisJfQorICAgIH0KKyAgICBpZiAocExQRCA9PSBOVUxMKSBwcmludGYoIkNvdWxkbid0IGZpbmQgZHJpdmVyICVzXG4iLCBwc3pEcml2ZXIpOworICAgIHJldHVybiBwTFBEOworfQorCitzdGF0aWMgTE9BREVEX1BSSU5URVJfRFJJVkVSICpGaW5kUHJpbnRlckRyaXZlckZyb21QREVWSUNFKFNFR1BUUiBzZWdwdHJQREVWSUNFKQoreworICAgIExPQURFRF9QUklOVEVSX0RSSVZFUiAqcExQRCA9IE5VTEw7CisKKyAgICAvKiBGaW5kIHRoZSBwcmludGVyIGRyaXZlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBQREVWSUNFICovCisgICAgLyogRWFjaCBvZiB0aGUgUERFVklDRSBzdHJ1Y3R1cmVzIGhhcyBhIFBERVZJQ0VfSEVBREVSIHN0cnVjdHVyZSAqLworICAgIC8qIGp1c3QgYmVmb3JlIGl0ICovCisgICAgaWYgKHNlZ3B0clBERVZJQ0UgIT0gKFNFR1BUUilOVUxMKQorICAgIHsKKwlQREVWSUNFX0hFQURFUiAqcFBESCA9IChQREVWSUNFX0hFQURFUiAqKQorCSAgKFBUUl9TRUdfVE9fTElOKHNlZ3B0clBERVZJQ0UpIC0gc2l6ZW9mKFBERVZJQ0VfSEVBREVSKSk7IAorICAgICAgICBwTFBEID0gcFBESC0+cExQRDsKKyAgICB9CisgICAgcmV0dXJuIHBMUEQ7Cit9CisKKy8qIAorICogTG9hZCBhIHByaW50ZXIgZHJpdmVyLCBhZGRpbmcgaXQgc2VsZiB0byB0aGUgbGlzdCBvZiBsb2FkZWQgZHJpdmVycy4KKyAqLworCitMT0FERURfUFJJTlRFUl9EUklWRVIgKkxvYWRQcmludGVyRHJpdmVyKGNvbnN0IGNoYXIgKnBzekRyaXZlcikKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgSElOU1RBTkNFMTYJaEluc3Q7CQorICAgIExPQURFRF9QUklOVEVSX0RSSVZFUiAqcExQRCA9IE5VTEw7CisgICAgaW50CQluRHJpdmVyU2xvdCA9IDA7CisgICAgQk9PTDMyCWJTbG90Rm91bmQgPSBGQUxTRTsKKworICAgIC8qIEZpcnN0IGxvb2sgdG8gc2VlIGlmIGRyaXZlciBpcyBsb2FkZWQgKi8KKyAgICBwTFBEID0gRmluZFByaW50ZXJEcml2ZXJGcm9tTmFtZShwc3pEcml2ZXIpOworICAgIGlmIChwTFBEICE9IE5VTEwpCisgICAgeworCS8qIEFscmVhZHkgbG9hZGVkIHNvIGluY3JlYXNlIHVzYWdlIGNvdW50ICovCisJcExQRC0+blVzYWdlQ291bnQrKzsKKwlyZXR1cm4gcExQRDsKKyAgICB9CisKKyAgICAvKiBOb3QgbG9hZGVkIHNvIHRyeSBhbmQgZmluZCBhbiBlbXB0eSBzbG90ICovCisgICAgd2hpbGUgKCFiU2xvdEZvdW5kICYmIG5Ecml2ZXJTbG90IDwgTUFYX1BSSU5URVJfRFJJVkVSUykKKyAgICB7CisJaWYgKGdhcExvYWRlZFByaW50ZXJEcml2ZXJzW25Ecml2ZXJTbG90XSA9PSBOVUxMKQorCSAgYlNsb3RGb3VuZCA9IFRSVUU7CisJZWxzZQorCSAgbkRyaXZlclNsb3QrKzsKKyAgICB9CisgICAgaWYgKCFiU2xvdEZvdW5kKQorICAgIHsKKwlwcmludGYoIlRvbyBtYW55IHByaW50ZXJzIGRyaXZlcnMgbG9hZGVkXG4iKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGNoYXIgKmRydk5hbWUgPSBtYWxsb2Moc3RybGVuKHBzekRyaXZlcikrNSk7CisgICAgICAgIHN0cmNweShkcnZOYW1lLCBwc3pEcml2ZXIpOworICAgICAgICBzdHJjYXQoZHJ2TmFtZSwgIi5EUlYiKTsKKyAgICAgICAgaEluc3QgPSBMb2FkTGlicmFyeTE2KGRydk5hbWUpOworICAgIH0KKyAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIkxvYWRlZCB0aGUgbGlicmFyeVxuIik7CisKKyAgICAKKyAgICBpZiAoaEluc3QgPD0gMzIpCisgICAgeworCS8qIEZhaWxlZCB0byBsb2FkIGRyaXZlciAqLworCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGxvYWQgcHJpbnRlciBkcml2ZXIgJXNcbiIsIHBzekRyaXZlcik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJSEFORExFMTYgaEhhbmRsZTsKKworCS8qIEFsbG9jYXRlIHNvbWUgbWVtb3J5IGZvciBwcmludGVyIGRyaXZlciBpbmZvICovCisJcExQRCA9IG1hbGxvYyhzaXplb2YoTE9BREVEX1BSSU5URVJfRFJJVkVSKSk7CisJbWVtc2V0KHBMUEQsIDAgLCBzaXplb2YoTE9BREVEX1BSSU5URVJfRFJJVkVSKSk7CisJCisJcExQRC0+aEluc3QgPSBoSW5zdDsKKwlzdHJjcHkocExQRC0+c3pEcml2ZXIscHN6RHJpdmVyKTsKKworCS8qIEdldCBEUyBmb3IgdGhlIHByaW50ZXIgbW9kdWxlICovCisJcExQRC0+ZHNfcmVnID0gaEluc3Q7CisKKwlkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIkRTIGZvciAlcyBpcyAleFxuIiwgcHN6RHJpdmVyLCBwTFBELT5kc19yZWcpOworCisJLyogR2V0IGFkZHJlc3Mgb2YgcHJpbnRlciBkcml2ZXIgZnVuY3Rpb25zICovCisJR2V0UHJpbnRlckRyaXZlckZ1bmN0aW9ucyhoSW5zdCwgcExQRCk7CisKKwkvKiBTZXQgaW5pdGlhbCB1c2FnZSBjb3VudCAqLworCXBMUEQtPm5Vc2FnZUNvdW50ID0gMTsKKworCS8qIENyZWF0ZSBhIHRodW5raW5nIGJ1ZmZlciAqLworCWhIYW5kbGUgPSBHbG9iYWxBbGxvYzE2KEdITkQsICgxMDI0ICogOCkpOworCXBMUEQtPmhUaHVuayA9IGhIYW5kbGU7CisJcExQRC0+VGh1bmtCdWZTZWdQdHIgPSBXSU4xNl9HbG9iYWxMb2NrMTYoaEhhbmRsZSk7CisJcExQRC0+VGh1bmtCdWZMaW1pdCA9IHBMUEQtPlRodW5rQnVmU2VnUHRyICsgKDEwMjQqOCk7CisKKwkvKiBVcGRhdGUgdGFibGUgb2YgbG9hZGVkIHByaW50ZXIgZHJpdmVycyAqLworCXBMUEQtPm5JbmRleCA9IG5Ecml2ZXJTbG90OworCWdhcExvYWRlZFByaW50ZXJEcml2ZXJzW25Ecml2ZXJTbG90XSA9IHBMUEQ7CisgICAgfQorCisgICAgcmV0dXJuIHBMUEQ7Cit9CisKKy8qIAorICogVGh1bmtpbmcgdXRpbGl0eSBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgQk9PTDMyIEFkZERhdGEoU0VHUFRSICpwU2VnUHRyLCBjb25zdCB2b2lkICpwRGF0YSwgaW50IG5TaXplLCBTRUdQVFIgTGltaXQpCit7CisgICAgQk9PTDMyIGJSZXQgPSBGQUxTRTsKKyAgICBjaGFyICpwQnVmZmVyID0gUFRSX1NFR19UT19MSU4oKCpwU2VnUHRyKSk7CisgICAgY2hhciAqcExpbWl0ID0gUFRSX1NFR19UT19MSU4oTGltaXQpOworCisKKyAgICBpZiAoKHBCdWZmZXIgKyBuU2l6ZSkgPCBwTGltaXQpCisgICAgeworCURXT1JEICpwZHcgPSAoRFdPUkQgKilwU2VnUHRyOworCVNFR1BUUiBTZWdQdHJPbGQgPSAqcFNlZ1B0cjsKKwlTRUdQVFIgU2VnUHRyTmV3OworCisJZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJBZGREYXRhOiBDb3B5aW5nICVkIGZyb20gJXAgdG8gJXAoMHgleClcbiIsIG5TaXplLCBwRGF0YSwgcEJ1ZmZlciwgKFVJTlQzMikqcFNlZ1B0cik7CisJbWVtY3B5KHBCdWZmZXIsIHBEYXRhLCBuU2l6ZSk7IAorCVNlZ1B0ck5ldyA9IChTZWdQdHJPbGQgKyBuU2l6ZSArIDEpOworCSpwZHcgPSAoRFdPUkQpU2VnUHRyTmV3OworICAgIH0KKyAgICByZXR1cm4gYlJldDsKK30KKworCitzdGF0aWMgQk9PTDMyIEdldFBhcmFtRGF0YShTRUdQVFIgU2VnUHRyU3JjLHZvaWQgKnBEYXRhRGVzdCwgaW50IG5TaXplKQoreworICAgIGNoYXIgKnBTcmMgPSAgUFRSX1NFR19UT19MSU4oU2VnUHRyU3JjKTsKKyAgICBjaGFyICpwRGVzdCA9IHBEYXRhRGVzdDsKKworICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiR2V0UGFyYW1EYXRhOiBDb3B5aW5nICVkIGZyb20gJWx4KCVseCkgdG8gJWx4XG4iLCBuU2l6ZSwgKERXT1JEKXBTcmMsIChEV09SRClTZWdQdHJTcmMsIChEV09SRClwRGF0YURlc3QpOworICAgIG1lbWNweShwRGVzdCwgcFNyYywgblNpemUpOworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICogIENvbnRyb2wgKG9yZGluYWwgMykKKyAqLworSU5UMTYgUFJURFJWX0NvbnRyb2woTFBQREVWSUNFIGxwRGVzdERldiwgV09SRCB3ZnVuY3Rpb24sIFNFR1BUUiBscEluRGF0YSwgU0VHUFRSIGxwT3V0RGF0YSkKK3sKKyAgICAvKiB3ZnVuY3Rpb24gPT0gRXNjYXBlIGNvZGUgKi8KKyAgICAvKiBscEluRGF0YSwgbHBPdXREYXRhIGRlcGVuZCBvbiBjb2RlICovCisKKyAgICBXT1JEIHdSZXQgPSAwOworICAgIExPQURFRF9QUklOVEVSX0RSSVZFUiAqcExQRCA9IE5VTEw7CisKKyAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIlBSVERSVl9Db250cm9sOiAlMDh4IDB4JXggJTA4bHggJTA4bHhcbiIsICh1bnNpZ25lZCBpbnQpbHBEZXN0RGV2LCB3ZnVuY3Rpb24sIGxwSW5EYXRhLCBscE91dERhdGEpOworCisgICAgaWYgKChwTFBEID0gRmluZFByaW50ZXJEcml2ZXJGcm9tUERFVklDRShscERlc3REZXYpKSAhPSBOVUxMKQorICAgIHsKKwlMT05HIGxQMSwgbFAzLCBsUDQ7CisJV09SRCB3UDI7CisKKwlpZiAocExQRC0+Zm5bRlVOQ19DT05UUk9MXSA9PSBOVUxMKQorCXsKKwkgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfQ29udHJvbDogTm90IHN1cHBvcnRlZCBieSBkcml2ZXJcbiIpOworCSAgICByZXR1cm4gMDsKKwl9CisKKwlsUDEgPSAoU0VHUFRSKWxwRGVzdERldjsKKwl3UDIgPSB3ZnVuY3Rpb247CisJbFAzID0gKFNFR1BUUilscEluRGF0YTsKKwlsUDQgPSAoU0VHUFRSKWxwT3V0RGF0YTsKKworCXdSZXQgPSBDYWxsVG8xNl93b3JkX2x3bGwocExQRC0+Zm5bRlVOQ19DT05UUk9MXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbFAxLCB3UDIsIGxQMywgbFA0KTsKKyAgICB9CisgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfQ29udHJvbDogcmV0dXJuICV4XG4iLCB3UmV0KTsKKyAgICByZXR1cm4gd1JldDsKKworICAgIHJldHVybiAwOworfQorCisvKgorICoJRW5hYmxlIChvcmRpbmFsIDUpCisgKi8KK1dPUkQgUFJURFJWX0VuYWJsZShMUFZPSUQgbHBEZXZJbmZvLCBXT1JEIHdTdHlsZSwgTFBDU1RSICBscERlc3REZXZUeXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwRGV2aWNlTmFtZSwgTFBDU1RSIGxwT3V0cHV0RmlsZSwgTFBWT0lEIGxwRGF0YSkKK3sKKyAgICBXT1JEIHdSZXQgPSAwOworICAgIExPQURFRF9QUklOVEVSX0RSSVZFUiAqcExQRCA9IE5VTEw7CisKKyAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIlBSVERSVl9FbmFibGU6ICVzICVzXG4iLGxwRGVzdERldlR5cGUsIGxwT3V0cHV0RmlsZSk7CisKKyAgICAvKiBHZXQgdGhlIHByaW50ZXIgZHJpdmVyIGluZm8gKi8KKyAgICBpZiAod1N0eWxlID09IElOSVRQREVWSUNFKQorICAgIHsKKwlwTFBEID0gRmluZFByaW50ZXJEcml2ZXJGcm9tUERFVklDRSgoU0VHUFRSKWxwRGV2SW5mbyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJcExQRCA9IEZpbmRQcmludGVyRHJpdmVyRnJvbU5hbWUoKGNoYXIgKilscERldmljZU5hbWUpOworICAgIH0KKyAgICBpZiAocExQRCAhPSBOVUxMKQorICAgIHsKKwlMT05HIGxQMSwgbFAzLCBsUDQsIGxQNTsKKwlXT1JEIHdQMjsKKwlTRUdQVFIgU2VnUHRyID0gcExQRC0+VGh1bmtCdWZTZWdQdHI7CisJU0VHUFRSIExpbWl0ID0gcExQRC0+VGh1bmtCdWZMaW1pdDsKKwlpbnQgICBuU2l6ZTsKKworCWlmIChwTFBELT5mbltGVU5DX0VOQUJMRV0gPT0gTlVMTCkKKwl7CisJICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiUFJURFJWX0VuYWJsZTogTm90IHN1cHBvcnRlZCBieSBkcml2ZXJcbiIpOworCSAgICByZXR1cm4gMDsKKwl9CisKKwlpZiAod1N0eWxlID09IElOSVRQREVWSUNFKQorCXsKKwkgICAgLyogQWxsIHJlYWR5IGEgMTYgYWRkcmVzcyAqLworCSAgICBsUDEgPSAoU0VHUFRSKWxwRGV2SW5mbzsKKwl9CisJZWxzZQorCXsKKwkgICAgLyogMzIgYml0IGRhdGEgKi8KKwkgICAgbFAxID0gU2VnUHRyOworCSAgICBuU2l6ZSA9IHNpemVvZihEZXZpY2VDYXBzKTsKKwkgICAgQWRkRGF0YSgmU2VnUHRyLCBscERldkluZm8sIG5TaXplLCBMaW1pdCk7CQorCX0KKwkKKwl3UDIgPSB3U3R5bGU7CisJCisJbFAzID0gU2VnUHRyOworCW5TaXplID0gc3RybGVuKGxwRGVzdERldlR5cGUpICsgMTsKKwlBZGREYXRhKCZTZWdQdHIsIGxwRGVzdERldlR5cGUsIG5TaXplLCBMaW1pdCk7CQorCisJbFA0ID0gU2VnUHRyOyAKKwluU2l6ZSA9IHN0cmxlbihscE91dHB1dEZpbGUpICsgMTsKKwlBZGREYXRhKCZTZWdQdHIsIGxwT3V0cHV0RmlsZSwgblNpemUsIExpbWl0KTsJCisKKwlsUDUgPSAoTE9ORylscERhdGE7CisgICAgICAgIAorCisJd1JldCA9IENhbGxUbzE2X3dvcmRfbHdsbGwocExQRC0+Zm5bRlVOQ19FTkFCTEVdLCAKKwkJCQkgICBsUDEsIHdQMiwgbFAzLCBsUDQsIGxQNSk7CisKKwkvKiBHZXQgdGhlIGRhdGEgYmFjayAqLworCWlmIChsUDEgIT0gMCAmJiB3U3R5bGUgIT0gSU5JVFBERVZJQ0UpCisJeworCSAgICBuU2l6ZSA9IHNpemVvZihEZXZpY2VDYXBzKTsKKwkgICAgR2V0UGFyYW1EYXRhKGxQMSwgbHBEZXZJbmZvLCBuU2l6ZSk7CisJfQorICAgIH0KKyAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIlBSVERSVl9FbmFibGU6IHJldHVybiAleFxuIiwgd1JldCk7CisgICAgcmV0dXJuIHdSZXQ7Cit9CisKKworLyoKKyAqCUVudW1ERm9udHMgKG9yZGluYWwgNikKKyAqLworV09SRCBQUlREUlZfRW51bURGb250cyhMUFBERVZJQ0UgbHBEZXN0RGV2LCBMUFNUUiBscEZhY2VOYW1lLCAgCisJCSAgICAgICBGQVJQUk9DMTYgbHBDYWxsYmFja0Z1bmMsIExQVk9JRCBscENsaWVudERhdGEpCit7CisgICAgV09SRCB3UmV0ID0gMDsKKyAgICBMT0FERURfUFJJTlRFUl9EUklWRVIgKnBMUEQgPSBOVUxMOworCisgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfRW51bURGb250czpcbiIpOworCisgICAgaWYgKChwTFBEID0gRmluZFByaW50ZXJEcml2ZXJGcm9tUERFVklDRShscERlc3REZXYpKSAhPSBOVUxMKQorICAgIHsKKwlMT05HIGxQMSwgbFAyLCBsUDMsIGxQNDsKKworCVNFR1BUUiBTZWdQdHIgPSBwTFBELT5UaHVua0J1ZlNlZ1B0cjsKKwlTRUdQVFIgTGltaXQgPSBwTFBELT5UaHVua0J1ZkxpbWl0OworCWludCAgIG5TaXplOworCisJaWYgKHBMUEQtPmZuW0ZVTkNfRU5VTURGT05UU10gPT0gTlVMTCkKKwl7CisJICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiUFJURFJWX0VudW1ERm9udHM6IE5vdCBzdXBwb3J0ZWQgYnkgZHJpdmVyXG4iKTsKKwkgICAgcmV0dXJuIDA7CisJfQorCisJbFAxID0gKFNFR1BUUilscERlc3REZXY7CisJCisJaWYgKGxwRmFjZU5hbWUgPT0gTlVMTCkKKwl7CisJICAgIGxQMiA9IDA7CisJfQorCWVsc2UKKwl7CisJICAgIGxQMiA9IFNlZ1B0cjsKKwkgICAgblNpemUgPSBzdHJsZW4obHBGYWNlTmFtZSkgKyAxOworCSAgICBBZGREYXRhKCZTZWdQdHIsIGxwRmFjZU5hbWUsIG5TaXplLCBMaW1pdCk7CQorCX0KKworCWxQMyA9IChMT05HKWxwQ2FsbGJhY2tGdW5jOyAKKworCWxQNCA9IChMT05HKWxwQ2xpZW50RGF0YTsKKyAgICAgICAgCisJd1JldCA9IENhbGxUbzE2X3dvcmRfbGxsbChwTFBELT5mbltGVU5DX0VOVU1ERk9OVFNdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsUDEsIGxQMiwgbFAzLCBsUDQpOworICAgIH0KKyAgICBlbHNlIAorICAgICAgICBwcmludGYoIkZhaWxlZCB0byBmaW5kIGRldmljZVxuIik7CisgICAgCisgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfRW51bURGb250czogcmV0dXJuICV4XG4iLCB3UmV0KTsKKyAgICByZXR1cm4gd1JldDsKK30KKy8qCisgKglFbnVtT2JqIChvcmRpbmFsIDcpCisgKi8KK0JPT0wxNiBQUlREUlZfRW51bU9iaihMUFBERVZJQ0UgbHBEZXN0RGV2LCBXT1JEIGlTdHlsZSwgCisJCSAgICAgICBGQVJQUk9DMTYgbHBDYWxsYmFja0Z1bmMsIExQVk9JRCBscENsaWVudERhdGEpCit7CisgICAgV09SRCB3UmV0ID0gMDsKKyAgICBMT0FERURfUFJJTlRFUl9EUklWRVIgKnBMUEQgPSBOVUxMOworCisgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfRW51bURGb250czpcbiIpOworCisgICAgaWYgKChwTFBEID0gRmluZFByaW50ZXJEcml2ZXJGcm9tUERFVklDRShscERlc3REZXYpKSAhPSBOVUxMKQorICAgIHsKKwlMT05HIGxQMSwgbFAzLCBsUDQ7CisJV09SRCB3UDI7CisKKwlpZiAocExQRC0+Zm5bRlVOQ19FTlVNREZPTlRTXSA9PSBOVUxMKQorCXsKKwkgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfRW51bURGb250czogTm90IHN1cHBvcnRlZCBieSBkcml2ZXJcbiIpOworCSAgICByZXR1cm4gMDsKKwl9CisKKwlsUDEgPSAoU0VHUFRSKWxwRGVzdERldjsKKwkKKwl3UDIgPSBpU3R5bGU7CisKKwkvKiAKKwkgKiBOZWVkIHRvIHBhc3MgYWRkcmVzIG9mIGZ1bmN0aW9uIGNvbnZlcnNpb24gZnVuY3Rpb24gdGhhdCB3aWxsIHN3aXRjaCBiYWNrIHRvIDMyIGJpdCBjb2RlIGlmIG5lY2Vzc2FyeQorCSAqLworCWxQMyA9IChMT05HKWxwQ2FsbGJhY2tGdW5jOyAKKworCWxQNCA9IChMT05HKWxwQ2xpZW50RGF0YTsKKyAgICAgICAgCisJd1JldCA9IENhbGxUbzE2X3dvcmRfbHdsbChwTFBELT5mbltGVU5DX0VOVU1PQkpdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsUDEsIHdQMiwgbFAzLCBsUDQpOworICAgIH0KKyAgICBlbHNlIAorICAgICAgICBwcmludGYoIkZhaWxlZCB0byBmaW5kIGRldmljZVxuIik7CisgICAgCisgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfRW51bURGb250czogcmV0dXJuICV4XG4iLCB3UmV0KTsKKyAgICByZXR1cm4gd1JldDsKK30KKworLyogCisgKiBSZWFsaXplT2JqZWN0IChvcmRpbmFsIDEwKQorICovCitEV09SRCBQUlREUlZfUmVhbGl6ZU9iamVjdChMUFBERVZJQ0UgbHBEZXN0RGV2LCBXT1JEIHdTdHlsZSwgCisJCSAgICBMUFZPSUQgbHBJbk9iaiwgTFBWT0lEIGxwT3V0T2JqLAorICAgICAgICAgICAgICAgICAgICBMUFRFWFRYRk9STTE2IGxwVGV4dFhGb3JtKQoreworICAgIFdPUkQgZHdSZXQgPSAwOworICAgIExPQURFRF9QUklOVEVSX0RSSVZFUiAqcExQRCA9IE5VTEw7CisgICAgCisgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfUmVhbGl6ZU9iamVjdDpcbiIpOworICAgIAorICAgIGlmICgocExQRCA9IEZpbmRQcmludGVyRHJpdmVyRnJvbVBERVZJQ0UobHBEZXN0RGV2KSkgIT0gTlVMTCkKKyAgICB7CisJTE9ORyBsUDEsIGxQMywgbFA0LCBsUDU7ICAKKwlXT1JEIHdQMjsKKwlTRUdQVFIgU2VnUHRyID0gcExQRC0+VGh1bmtCdWZTZWdQdHI7CisJU0VHUFRSIExpbWl0ID0gcExQRC0+VGh1bmtCdWZMaW1pdDsKKwlpbnQgICBuU2l6ZTsKKworCWlmIChwTFBELT5mbltGVU5DX1JFQUxJWkVPQkpFQ1RdID09IE5VTEwpCisJeworCSAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIlBSVERSVl9SZWFsaXplT2JqZWN0OiBOb3Qgc3VwcG9ydGVkIGJ5IGRyaXZlclxuIik7CisJICAgIHJldHVybiAwOworCX0KKworCWxQMSA9IGxwRGVzdERldjsKKwl3UDIgPSB3U3R5bGU7CisJCisJbFAzID0gU2VnUHRyOworCXN3aXRjaCAod1N0eWxlKQorCXsKKyAgICAgICAgY2FzZSAzOiAKKyAgICAgICAgICAgIG5TaXplID0gc2l6ZW9mKExPR0ZPTlQxNik7IAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisJICAgIHByaW50ZigiUFJURFJWX1JlYWxpemVPYmplY3Q6IE9iamVjdCB0eXBlICVkIG5vdCBzdXBwb3J0ZWRcbiIsIHdTdHlsZSk7CisgICAgICAgICAgICBuU2l6ZSA9IDA7CisgICAgICAgICAgICAKKwl9CisJQWRkRGF0YSgmU2VnUHRyLCBscEluT2JqLCBuU2l6ZSwgTGltaXQpOwkKKwkKKwlsUDQgPSAoTE9ORylscE91dE9iajsKKworCWlmIChscFRleHRYRm9ybSAhPSBOVUxMKQorCXsKKwkgICAgbFA1ID0gU2VnUHRyOworCSAgICBuU2l6ZSA9IHNpemVvZihURVhUWEZPUk0xNik7CisJICAgIEFkZERhdGEoJlNlZ1B0ciwgbHBUZXh0WEZvcm0sIG5TaXplLCBMaW1pdCk7CQorCX0KKwllbHNlCisJICBsUDUgPSAwTDsKKworCWR3UmV0ID0gQ2FsbFRvMTZfbG9uZ19sd2xsbChwTFBELT5mbltGVU5DX1JFQUxJWkVPQkpFQ1RdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxQMSwgd1AyLCBsUDMsIGxQNCwgbFA1KTsKKworICAgIH0KKyAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIlBSVERSVl9SZWFsaXplT2JqZWN0OiByZXR1cm4gJXhcbiIsIGR3UmV0KTsKKyAgICByZXR1cm4gZHdSZXQ7Cit9CisKKworRFdPUkQgUFJURFJWX0V4dFRleHRPdXQoTFBQREVWSUNFIGxwRGVzdERldiwgV09SRCB3RGVzdFhPcmcsIFdPUkQgd0Rlc3RZT3JnLAorICAgICAgICAgICAgICAgICAgICAgICAgUkVDVDE2ICpscENsaXBSZWN0LCBMUENTVFIgbHBTdHJpbmcsIFdPUkQgd0NvdW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFR1BUUiBscEZvbnRJbmZvLCBMUERSQVdNT0RFIGxwRHJhd01vZGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgTFBURVhUWEZPUk0xNiBscFRleHRYRm9ybSwgU0hPUlQgKmxwQ2hhcldpZHRocywKKyAgICAgICAgICAgICAgICAgICAgICAgIFJFQ1QxNiAqICAgICBscE9wYXF1ZVJlY3QsIFdPUkQgd09wdGlvbnMpCit7CisgICAgRFdPUkQgZHdSZXQgPSAwOworICAgIExPQURFRF9QUklOVEVSX0RSSVZFUiAqcExQRCA9IE5VTEw7CisgICAgCisgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfRXh0VGV4dE91dDpcbiIpOworICAgIAorICAgIGlmICgocExQRCA9IEZpbmRQcmludGVyRHJpdmVyRnJvbVBERVZJQ0UobHBEZXN0RGV2KSkgIT0gTlVMTCkKKyAgICB7CisJTE9ORyBsUDEsIGxQNCwgbFA1LCBsUDcsIGxQOCwgbFA5LCBsUDEwLCBsUDExOyAgCisJV09SRCB3UDIsIHdQMywgd1AxMjsKKyAgICAgICAgSU5UMTYgaVA2OworCisJU0VHUFRSIFNlZ1B0ciA9IHBMUEQtPlRodW5rQnVmU2VnUHRyOworCVNFR1BUUiBMaW1pdCA9IHBMUEQtPlRodW5rQnVmTGltaXQ7CisJaW50ICAgblNpemU7CisKKwlpZiAocExQRC0+Zm5bRlVOQ19FWFRURVhUT1VUXSA9PSBOVUxMKQorCXsKKwkgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfRXh0VGV4dE91dDogTm90IHN1cHBvcnRlZCBieSBkcml2ZXJcbiIpOworCSAgICByZXR1cm4gMDsKKwl9CisKKwlsUDEgPSBscERlc3REZXY7CisJd1AyID0gd0Rlc3RYT3JnOworCXdQMyA9IHdEZXN0WU9yZzsKKwkKKwlpZiAobHBDbGlwUmVjdCAhPSBOVUxMKQorCXsKKwkgICAgbFA0ID0gU2VnUHRyOworCSAgICBuU2l6ZSA9IHNpemVvZihSRUNUMTYpOworICAgICAgICAgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJBZGRpbmcgbHBDbGlwUmVjdFxuIik7CisgICAgICAgICAgICAKKwkgICAgQWRkRGF0YSgmU2VnUHRyLCBscENsaXBSZWN0LCBuU2l6ZSwgTGltaXQpOwkKKwl9CisJZWxzZQorCSAgbFA0ID0gMEw7CisKKwlpZiAobHBTdHJpbmcgIT0gTlVMTCkKKwl7CisJICAgIC8qIFRURCBXQVJOSU5HIFRISVMgU1RSSU5HIElTTlQgTlVMTCBURVJNSU5BVEVEICovCisJICAgIGxQNSA9IFNlZ1B0cjsKKwkgICAgblNpemUgPSBzdHJsZW4obHBTdHJpbmcpOworICAgICAgICAgICAgblNpemUgPSBhYnMod0NvdW50KTsKKyAgICAgICAgICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiQWRkaW5nIHN0cmluZyBzaXplICVkXG4iLG5TaXplKTsKKyAgICAgICAgICAgIAorCSAgICBBZGREYXRhKCZTZWdQdHIsIGxwU3RyaW5nLCBuU2l6ZSwgTGltaXQpOwkKKwl9CisJZWxzZQorCSAgbFA1ID0gMEw7CisJCisJaVA2ID0gd0NvdW50OworCQorCS8qIFRoaXMgc2hvdWxkIGJlIHJlYWxpemVkIGJ5IHRoZSBkcml2ZXIsIHNvIGluIDE2Yml0IGRhdGEgYXJlYSAqLworCWxQNyA9IGxwRm9udEluZm87CisJCisJaWYgKGxwRHJhd01vZGUgIT0gTlVMTCkKKwl7CisJICAgIGxQOCA9IFNlZ1B0cjsKKwkgICAgblNpemUgPSBzaXplb2YoRFJBV01PREUpOworICAgICAgICAgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJhZGRpbmcgbHBEcmF3TW9kZVxuIik7CisgICAgICAgICAgICAKKwkgICAgQWRkRGF0YSgmU2VnUHRyLCBscERyYXdNb2RlLCBuU2l6ZSwgTGltaXQpOwkKKwl9CisJZWxzZQorCSAgbFA4ID0gMEw7CisJCisJaWYgKGxwVGV4dFhGb3JtICE9IE5VTEwpCisJeworCSAgICBsUDkgPSBTZWdQdHI7CisJICAgIG5TaXplID0gc2l6ZW9mKFRFWFRYRk9STTE2KTsKKyAgICAgICAgICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiQWRkaW5nIFRleHRYRm9ybVxuIik7CisJICAgIEFkZERhdGEoJlNlZ1B0ciwgbHBUZXh0WEZvcm0sIG5TaXplLCBMaW1pdCk7CQorCX0KKwllbHNlCisJICBsUDkgPSAwTDsKKwkKKwlpZiAobHBDaGFyV2lkdGhzICE9IE5VTEwpIAorCSAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJQUlREUlZfRXh0VGV4dE91dDogQ2hhciB3aWR0aHMgbm90IHN1cHBvcnRlZFxuIik7CisJbFAxMCA9IDA7CisJCisJaWYgKGxwT3BhcXVlUmVjdCAhPSBOVUxMKQorCXsKKwkgICAgbFAxMSA9IFNlZ1B0cjsKKwkgICAgblNpemUgPSBzaXplb2YoUkVDVDE2KTsKKyAgICAgICAgICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiQWRkaW5nIG9wYXF1ZVJlY3RcbiIpOworCSAgICBBZGREYXRhKCZTZWdQdHIsIGxwT3BhcXVlUmVjdCwgblNpemUsIExpbWl0KTsJCisJfQorCWVsc2UKKwkgIGxQMTEgPSAwTDsKKwkKKwl3UDEyID0gd09wdGlvbnM7CisJZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJDYWxsaW5nIGV4dHRleHRvdXQgMHglbHggMHgleCAweCV4IDB4JWx4XG4weCVseCAweCV4IDB4JWx4IDB4JWx4XG4iCisgICAgICAgICAgICAgICAiMHglbHggMHglbHggMHglbHggMHgleFxuIixsUDEsIHdQMiwgd1AzLCBsUDQsIAorCQkJCQkgICBsUDUsIGlQNiwgbFA3LCBsUDgsIGxQOSwgbFAxMCwKKwkJCQkJICAgbFAxMSwgd1AxMik7CisJZHdSZXQgPSBDYWxsVG8xNl9sb25nX2x3d2xsd2xsbGxsdyhwTFBELT5mbltGVU5DX0VYVFRFWFRPVVRdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsUDEsIHdQMiwgd1AzLCBsUDQsIAorCQkJCQkgICBsUDUsIGlQNiwgbFA3LCBsUDgsIGxQOSwgbFAxMCwKKwkJCQkJICAgbFAxMSwgd1AxMik7CisgICAgICAgIGlmIChscERyYXdNb2RlKQorICAgICAgICAgICAgR2V0UGFyYW1EYXRhKGxQOCwgbHBEcmF3TW9kZSwgc2l6ZW9mKERSQVdNT0RFKSk7CisgICAgfQorICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiUFJURFJWX0V4dFRleHRPdXQ6IHJldHVybiAlbHhcbiIsIGR3UmV0KTsKKyAgICByZXR1cm4gZHdSZXQ7Cit9CmRpZmYgLS1naXQgYS9ncmFwaGljcy93aW4xNmRydi90ZXh0LmMgYi9ncmFwaGljcy93aW4xNmRydi90ZXh0LmMKaW5kZXggZmUwNzQ2My4uOTAzZDZjOCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3Mvd2luMTZkcnYvdGV4dC5jCisrKyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L3RleHQuYwpAQCAtNzAsMTMgKzcwLDE0IEBACiAJCQkJICBwaHlzRGV2LT5zZWdwdHJGb250SW5mbywgbHBEcmF3TW9kZSwgCiAJCQkJICBscFRleHRYRm9ybSwgTlVMTCwgTlVMTCwgMCk7CiAqLworI2lmZGVmIE5PVERFRgogCWxwQ2xpcFJlY3QtPmxlZnQgPSBscHJlY3QtPmxlZnQgOwogCWxwQ2xpcFJlY3QtPnRvcCA9IGxwcmVjdC0+dG9wOwogCWxwQ2xpcFJlY3QtPnJpZ2h0ID0gbHByZWN0LT5yaWdodDsKIAlscENsaXBSZWN0LT5ib3R0b20gPSBscHJlY3QtPmJvdHRvbTsKICAgICAgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJXSU4xNkRSVl9FeHRUZXh0T3V0IENsaXAgcmVjdCBsZWZ0ICVkIHRvcCAlZCByaWd0ICVkIGJvdHRvbSAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBscENsaXBSZWN0LT5sZWZ0LGxwQ2xpcFJlY3QtPnRvcCxscENsaXBSZWN0LT5yaWdodCxscENsaXBSZWN0LT5ib3R0b20pOwotICAgICAgICAKKyNlbmRpZgogCWxwQ2xpcFJlY3QtPmxlZnQgPSAwOwogCWxwQ2xpcFJlY3QtPnRvcCA9IDA7CiAJbHBDbGlwUmVjdC0+cmlnaHQgPSAweDNmYzsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3gxMWRydi9iaXRibHQuYyBiL2dyYXBoaWNzL3gxMWRydi9iaXRibHQuYwppbmRleCBjNGI0ZjhjLi4xZmJkM2M1IDEwMDY0NAotLS0gYS9ncmFwaGljcy94MTFkcnYvYml0Ymx0LmMKKysrIGIvZ3JhcGhpY3MveDExZHJ2L2JpdGJsdC5jCkBAIC0xMjA3LDEyICsxMjA3LDI0IEBACiAKICAgICBjYXNlIFBBVElOVkVSVDogIC8qIDB4NWEgKi8KIAlpZiAoT3B0aW9ucy5wZXJmZWN0R3JhcGhpY3MpIGJyZWFrOwotICAgICAgICBpZiAoIURDX1NldHVwR0NGb3JCcnVzaCggZGNEc3QgKSkgcmV0dXJuIFRSVUU7Ci0gICAgICAgIFhTZXRGdW5jdGlvbiggZGlzcGxheSwgZGNEc3QtPnUueC5nYywgR1h4b3IgKTsKLSAgICAgICAgWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGRjRHN0LT51LnguZHJhd2FibGUsIGRjRHN0LT51LnguZ2MsCi0gICAgICAgICAgICAgICAgICAgICAgICB2aXNSZWN0RHN0LmxlZnQsIHZpc1JlY3REc3QudG9wLCB3aWR0aCwgaGVpZ2h0ICk7CisgICAgICAgIGlmIChEQ19TZXR1cEdDRm9yQnJ1c2goIGRjRHN0ICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhTZXRGdW5jdGlvbiggZGlzcGxheSwgZGNEc3QtPnUueC5nYywgR1h4b3IgKTsKKyAgICAgICAgICAgIFhGaWxsUmVjdGFuZ2xlKCBkaXNwbGF5LCBkY0RzdC0+dS54LmRyYXdhYmxlLCBkY0RzdC0+dS54LmdjLAorCQkJICAgIHZpc1JlY3REc3QubGVmdCwgdmlzUmVjdERzdC50b3AsIHdpZHRoLCBoZWlnaHQgKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gVFJVRTsKIAorICAgIGNhc2UgMHhhNTAwNjU6CisJaWYgKE9wdGlvbnMucGVyZmVjdEdyYXBoaWNzKSBicmVhazsKKwlpZiAoRENfU2V0dXBHQ0ZvckJydXNoKCBkY0RzdCApKQorCXsKKwkgICAgWFNldEZ1bmN0aW9uKCBkaXNwbGF5LCBkY0RzdC0+dS54LmdjLCBHWGVxdWl2ICk7CisJICAgIFhGaWxsUmVjdGFuZ2xlKCBkaXNwbGF5LCBkY0RzdC0+dS54LmRyYXdhYmxlLCBkY0RzdC0+dS54LmdjLAorCQkJICAgIHZpc1JlY3REc3QubGVmdCwgdmlzUmVjdERzdC50b3AsIHdpZHRoLCBoZWlnaHQgKTsKKwl9CisJcmV0dXJuIFRSVUU7CisKICAgICBjYXNlIFNSQ0NPUFk6ICAvKiAweGNjICovCiAgICAgICAgIGlmIChkY1NyYy0+dy5iaXRzUGVyUGl4ZWwgPT0gZGNEc3QtPncuYml0c1BlclBpeGVsKQogICAgICAgICB7CmRpZmYgLS1naXQgYS9ncmFwaGljcy94MTFkcnYvZm9udC5jIGIvZ3JhcGhpY3MveDExZHJ2L2ZvbnQuYwppbmRleCBhMmY1MTUxLi4wZDRlMmM2IDEwMDY0NAotLS0gYS9ncmFwaGljcy94MTFkcnYvZm9udC5jCisrKyBiL2dyYXBoaWNzL3gxMWRydi9mb250LmMKQEAgLTIzLDYgKzIzLDMzIEBACiB9IEZvbnROYW1lc1szMl07CiBpbnQgRm9udFNpemU7CiAKKyNkZWZpbmUgQ0lfTk9ORVhJU1RDSEFSKGNzKSAoKChjcyktPndpZHRoID09IDApICYmIFwKKwkJCSAgICAgKCgoY3MpLT5yYmVhcmluZ3woY3MpLT5sYmVhcmluZ3wgXAorCQkJICAgICAgIChjcyktPmFzY2VudHwoY3MpLT5kZXNjZW50KSA9PSAwKSkKKworLyogCisgKiBDSV9HRVRfQ0hBUl9JTkZPIC0gcmV0dXJuIHRoZSBjaGFyaW5mbyBzdHJ1Y3QgZm9yIHRoZSBpbmRpY2F0ZWQgOGJpdAorICogY2hhcmFjdGVyLiAgSWYgdGhlIGNoYXJhY3RlciBpcyBpbiB0aGUgY29sdW1uIGFuZCBleGlzdHMsIHRoZW4gcmV0dXJuIHRoZQorICogYXBwcm9wcmlhdGUgbWV0cmljcyAobm90ZSB0aGF0IGZvbnRzIHdpdGggY29tbW9uIHBlci1jaGFyYWN0ZXIgbWV0cmljcyB3aWxsCisgKiByZXR1cm4gbWluX2JvdW5kcykuICBJZiBub25lIG9mIHRoZXNlIGhvbGQgdHJ1ZSwgdHJ5IGFnYWluIHdpdGggdGhlIGRlZmF1bHQKKyAqIGNoYXIuCisgKi8KKyNkZWZpbmUgQ0lfR0VUX0NIQVJfSU5GTyhmcyxjb2wsZGVmLGNzKSBcCit7IFwKKyAgICBjcyA9IGRlZjsgXAorICAgIGlmIChjb2wgPj0gZnMtPm1pbl9jaGFyX29yX2J5dGUyICYmIGNvbCA8PSBmcy0+bWF4X2NoYXJfb3JfYnl0ZTIpIHsgXAorCWlmIChmcy0+cGVyX2NoYXIgPT0gTlVMTCkgeyBcCisJICAgIGNzID0gJmZzLT5taW5fYm91bmRzOyBcCisJfSBlbHNlIHsgXAorCSAgICBjcyA9ICZmcy0+cGVyX2NoYXJbKGNvbCAtIGZzLT5taW5fY2hhcl9vcl9ieXRlMildOyBcCisJICAgIGlmIChDSV9OT05FWElTVENIQVIoY3MpKSBjcyA9IGRlZjsgXAorCX0gXAorICAgIH0gXAorfQorCisjZGVmaW5lIENJX0dFVF9ERUZBVUxUX0lORk8oZnMsY3MpIFwKKyAgQ0lfR0VUX0NIQVJfSU5GTyhmcywgZnMtPmRlZmF1bHRfY2hhciwgTlVMTCwgY3MpCisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgWDExRFJWX0ZPTlRfSW5pdApAQCAtNDU2LDMgKzQ4MywzNyBAQAogICAgIH0KICAgICByZXR1cm4gcHJldkhhbmRsZTsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0Q2hhcldpZHRoMzJBICAgIChHREkzMi4xNTUpCisgKi8KK0JPT0wzMiBYMTFEUlZfR2V0Q2hhcldpZHRoKCBEQyAqZGMsIFVJTlQzMiBmaXJzdENoYXIsIFVJTlQzMiBsYXN0Q2hhciwKKwkJCSAgICBMUElOVDMyIGJ1ZmZlciApCit7CisgICAgaW50IGksIHdpZHRoOworICAgIFhGb250U3RydWN0ICp4Zm9udDsKKyAgICBYQ2hhclN0cnVjdCAqY3MsICpkZWY7CisKKyAgICB4Zm9udCA9IGRjLT51LnguZm9udC5mc3RydWN0OworICAgIAorICAgIC8qIGZpeGVkIGZvbnQ/ICovCisgICAgaWYgKHhmb250LT5wZXJfY2hhciA9PSBOVUxMKQorICAgIHsKKwlmb3IgKGkgPSBmaXJzdENoYXI7IGkgPD0gbGFzdENoYXI7IGkrKykKKwkgICAgKmJ1ZmZlcisrID0geGZvbnQtPm1heF9ib3VuZHMud2lkdGg7CisJcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgQ0lfR0VUX0RFRkFVTFRfSU5GTyh4Zm9udCwgZGVmKTsKKwkKKyAgICBmb3IgKGkgPSBmaXJzdENoYXI7IGkgPD0gbGFzdENoYXI7IGkrKykKKyAgICB7CisJQ0lfR0VUX0NIQVJfSU5GTyggeGZvbnQsIGksIGRlZiwgY3MgKTsKKyAgICAgICAgd2lkdGggPSBjcyA/IGNzLT53aWR0aCA6IHhmb250LT5tYXhfYm91bmRzLndpZHRoOworICAgICAgICAqYnVmZmVyKysgPSBNQVgoIHdpZHRoLCAwICk7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L2luaXQuYyBiL2dyYXBoaWNzL3gxMWRydi9pbml0LmMKaW5kZXggNmYzNGY2My4uMTczNzRlYSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MveDExZHJ2L2luaXQuYworKysgYi9ncmFwaGljcy94MTFkcnYvaW5pdC5jCkBAIC0yOCw2ICsyOCw3IEBACiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcEV4Y2x1ZGVWaXNSZWN0ICovCiAgICAgWDExRFJWX0V4dEZsb29kRmlsbCwgICAgICAgICAgICAgLyogcEV4dEZsb29kRmlsbCAqLwogICAgIFgxMURSVl9FeHRUZXh0T3V0LCAgICAgICAgICAgICAgIC8qIHBFeHRUZXh0T3V0ICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcEdldENoYXJXaWR0aCAqLwogICAgIFgxMURSVl9HZXRQaXhlbCwgICAgICAgICAgICAgICAgIC8qIHBHZXRQaXhlbCAqLwogICAgIFgxMURSVl9HZXRUZXh0RXh0ZW50UG9pbnQsICAgICAgIC8qIHBHZXRUZXh0RXh0ZW50UG9pbnQgKi8KICAgICBYMTFEUlZfR2V0VGV4dE1ldHJpY3MsICAgICAgICAgICAvKiBwR2V0VGV4dE1ldHJpY3MgKi8KZGlmZiAtLWdpdCBhL2lmMTYzMi9jcnRkbGwuc3BlYyBiL2lmMTYzMi9jcnRkbGwuc3BlYwppbmRleCBiZTM0MTU1Li43ZTQzY2U5IDEwMDY0NAotLS0gYS9pZjE2MzIvY3J0ZGxsLnNwZWMKKysrIGIvaWYxNjMyL2NydGRsbC5zcGVjCkBAIC01Myw3ICs1Myw3IEBACiAwNDggc3R1YiBfY2FicwogMDQ5IHN0dWIgX2NleGl0CiAwNTAgc3R1YiBfY2dldHMKLTA1MSBzdHViIF9jaGRpcgorMDUxIGNkZWNsIF9jaGRpcihwdHIpIENSVERMTF9fY2hkaXIKIDA1MiBjZGVjbCBfY2hkcml2ZShsb25nKSBDUlRETExfX2NoZHJpdmUKIDA1MyBzdHViIF9jaGdzaWduCiAwNTQgc3R1YiBfY2htb2QKQEAgLTIzNiw3ICsyMzYsNyBAQAogMjMxIHN0dWIgX21ic3VwcgogMjMyIHN0dWIgX21lbWNjcHkKIDIzMyBzdHViIF9tZW1pY21wCi0yMzQgc3R1YiBfbWtkaXIKKzIzNCBjZGVjbCBfbWtkaXIocHRyKSBDUlRETExfX21rZGlyCiAyMzUgc3R1YiBfbWt0ZW1wCiAyMzYgc3R1YiBfbXNpemUKIDIzNyBzdHViIF9uZXh0YWZ0ZXIKZGlmZiAtLWdpdCBhL2lmMTYzMi9nZGkuc3BlYyBiL2lmMTYzMi9nZGkuc3BlYwppbmRleCA3MWRhM2JjLi44NjAwYjQzIDEwMDY0NAotLS0gYS9pZjE2MzIvZ2RpLnNwZWMKKysrIGIvaWYxNjMyL2dkaS5zcGVjCkBAIC0xNjIsNyArMTYyLDcgQEAKIDE5MyBzdHViIFNldEJvdW5kc1JlY3QKIDE5NCBzdHViIEdldEJvdW5kc1JlY3QKIDE5NSBzdHViIFNlbGVjdEJpdG1hcAotMTk2IHN0dWIgU2V0TWV0YUZpbGVCaXRzQmV0dGVyCisxOTYgcGFzY2FsMTYgU2V0TWV0YUZpbGVCaXRzQmV0dGVyKHdvcmQpIFNldE1ldGFGaWxlQml0c0JldHRlcgogMjAxIHN0dWIgRE1CSVRCTFQKIDIwMiBzdHViIERNQ09MT1JJTkZPCiAyMDYgc3R1YiBETUVOVU1ERk9OVFMKZGlmZiAtLWdpdCBhL2lmMTYzMi9rZXJuZWwzMi5zcGVjIGIvaWYxNjMyL2tlcm5lbDMyLnNwZWMKaW5kZXggZjgyODFlZS4uNTZhZDJiMCAxMDA2NDQKLS0tIGEvaWYxNjMyL2tlcm5lbDMyLnNwZWMKKysrIGIvaWYxNjMyL2tlcm5lbDMyLnNwZWMKQEAgLTQ1LDggKzQ1LDggQEAKIDAwNDAgc3RkY2FsbCBDcmVhdGVEaXJlY3RvcnlFeEEocHRyIHB0ciBwdHIpIENyZWF0ZURpcmVjdG9yeUV4MzJBCiAwMDQxIHN0ZGNhbGwgQ3JlYXRlRGlyZWN0b3J5RXhXKHB0ciBwdHIgcHRyKSBDcmVhdGVEaXJlY3RvcnlFeDMyVwogMDA0MiBzdGRjYWxsIENyZWF0ZURpcmVjdG9yeVcocHRyIHB0cikgQ3JlYXRlRGlyZWN0b3J5MzJXCi0wMDQzIAlzdGRjYWxsIENyZWF0ZUV2ZW50QShwdHIgbG9uZyBsb25nIHB0cikgQ3JlYXRlRXZlbnRBCi0wMDQ0IHN0dWIgQ3JlYXRlRXZlbnRXCiswMDQzIHN0ZGNhbGwgQ3JlYXRlRXZlbnRBKHB0ciBsb25nIGxvbmcgcHRyKSBDcmVhdGVFdmVudDMyQQorMDA0NCBzdGRjYWxsIENyZWF0ZUV2ZW50VyhwdHIgbG9uZyBsb25nIHB0cikgQ3JlYXRlRXZlbnQzMlcKIDAwNDUgc3RkY2FsbCBDcmVhdGVGaWxlQShwdHIgbG9uZyBsb25nIHB0ciBsb25nIGxvbmcgbG9uZykgQ3JlYXRlRmlsZTMyQQogMDA0NiBzdGRjYWxsIENyZWF0ZUZpbGVNYXBwaW5nQShsb25nIHB0ciBsb25nIGxvbmcgbG9uZyBwdHIpIENyZWF0ZUZpbGVNYXBwaW5nMzJBCiAwMDQ3IHN0ZGNhbGwgQ3JlYXRlRmlsZU1hcHBpbmdXKGxvbmcgcHRyIGxvbmcgbG9uZyBsb25nIHB0cikgQ3JlYXRlRmlsZU1hcHBpbmczMlcKQEAgLTU0LDE2ICs1NCwxNiBAQAogMDA0OSBzdHViIENyZWF0ZUlvQ29tcGxldGlvblBvcnQKIDAwNTAgc3R1YiBDcmVhdGVNYWlsc2xvdEEKIDAwNTEgc3R1YiBDcmVhdGVNYWlsc2xvdFcKLTAwNTIgCXN0ZGNhbGwgQ3JlYXRlTXV0ZXhBKHB0ciBsb25nIHB0cikgQ3JlYXRlTXV0ZXhBCi0wMDUzIHN0dWIgQ3JlYXRlTXV0ZXhXCiswMDUyIHN0ZGNhbGwgQ3JlYXRlTXV0ZXhBKHB0ciBsb25nIHB0cikgQ3JlYXRlTXV0ZXgzMkEKKzAwNTMgc3RkY2FsbCBDcmVhdGVNdXRleFcocHRyIGxvbmcgcHRyKSBDcmVhdGVNdXRleDMyVwogMDA1NCBzdHViIENyZWF0ZU5hbWVkUGlwZUEKIDAwNTUgc3R1YiBDcmVhdGVOYW1lZFBpcGVXCiAwMDU2IHN0dWIgQ3JlYXRlUGlwZQotMDA1NyBzdHViIENyZWF0ZVByb2Nlc3NBCiswMDU3IHN0ZGNhbGwgQ3JlYXRlUHJvY2Vzc0EocHRyIHB0ciBwdHIgcHRyIGxvbmcgbG9uZyBwdHIgcHRyIHB0ciBwdHIpIENyZWF0ZVByb2Nlc3MzMkEKIDAwNTggc3R1YiBDcmVhdGVQcm9jZXNzVwogMDA1OSBzdHViIENyZWF0ZVJlbW90ZVRocmVhZAotMDA2MCBzdHViIENyZWF0ZVNlbWFwaG9yZUEKLTAwNjEgc3R1YiBDcmVhdGVTZW1hcGhvcmVXCiswMDYwIHN0ZGNhbGwgQ3JlYXRlU2VtYXBob3JlQShwdHIgbG9uZyBsb25nIHB0cikgQ3JlYXRlU2VtYXBob3JlMzJBCiswMDYxIHN0ZGNhbGwgQ3JlYXRlU2VtYXBob3JlVyhwdHIgbG9uZyBsb25nIHB0cikgQ3JlYXRlU2VtYXBob3JlMzJXCiAwMDYyIHN0dWIgQ3JlYXRlVGFwZVBhcnRpdGlvbgogMDA2MyBzdGRjYWxsIENyZWF0ZVRocmVhZChwdHIgbG9uZyBwdHIgbG9uZyBsb25nIHB0cikgQ3JlYXRlVGhyZWFkCiAwMDY0IHN0dWIgQ3JlYXRlVmlydHVhbEJ1ZmZlcgpAQCAtMTM0LDcgKzEzNCw3IEBACiAwMTI5IHN0ZGNhbGwgRmluZFJlc291cmNlRXhBKGxvbmcgcHRyIHB0ciBsb25nKSBGaW5kUmVzb3VyY2VFeDMyQQogMDEzMCBzdGRjYWxsIEZpbmRSZXNvdXJjZUV4Vyhsb25nIHB0ciBwdHIgbG9uZykgRmluZFJlc291cmNlRXgzMlcKIDAxMzEgc3RkY2FsbCBGaW5kUmVzb3VyY2VXKGxvbmcgcHRyIHB0cikgRmluZFJlc291cmNlMzJXCi0wMTMyIHN0dWIgRmx1c2hDb25zb2xlSW5wdXRCdWZmZXIKKzAxMzIgc3RkY2FsbCBGbHVzaENvbnNvbGVJbnB1dEJ1ZmZlcihsb25nKSBGbHVzaENvbnNvbGVJbnB1dEJ1ZmZlcgogMDEzMyBzdGRjYWxsIEZsdXNoRmlsZUJ1ZmZlcnMobG9uZykgRmx1c2hGaWxlQnVmZmVycwogMDEzNCBzdHViIEZsdXNoSW5zdHJ1Y3Rpb25DYWNoZQogMDEzNSBzdHViIEZsdXNoVmlld09mRmlsZQpAQCAtMzYyLDcgKzM2Miw3IEBACiAwMzU3IHN0ZGNhbGwgSXNCYWRXcml0ZVB0cihwdHIgbG9uZykgSXNCYWRXcml0ZVB0cjMyCiAwMzU4IHN0ZGNhbGwgSXNEQkNTTGVhZEJ5dGUobG9uZykgSXNEQkNTTGVhZEJ5dGUzMgogMDM1OSBzdGRjYWxsIElzREJDU0xlYWRCeXRlRXgobG9uZyBsb25nKSBJc0RCQ1NMZWFkQnl0ZUV4Ci0wMzYwIHN0dWIgSXNWYWxpZENvZGVQYWdlCiswMzYwIHN0ZGNhbGwgSXNWYWxpZENvZGVQYWdlKGxvbmcpIElzVmFsaWRDb2RlUGFnZQogMDM2MSBzdGRjYWxsIElzVmFsaWRMb2NhbGUobG9uZyBsb25nKSBJc1ZhbGlkTG9jYWxlCiAwMzYyIHN0dWIgTENNYXBTdHJpbmdBCiAwMzYzIHN0dWIgTENNYXBTdHJpbmdXCkBAIC0zOTYsMTcgKzM5NiwxNyBAQAogMDM5MSBzdGRjYWxsIE11bERpdihsb25nIGxvbmcgbG9uZykgTXVsRGl2MzIKIDAzOTIgc3RkY2FsbCBNdWx0aUJ5dGVUb1dpZGVDaGFyKGxvbmcgbG9uZyBwdHIgbG9uZyBwdHIgbG9uZykgTXVsdGlCeXRlVG9XaWRlQ2hhcgogMDM5MyBzdHViIE9wZW5Db25zb2xlVwotMDM5NCBzdHViIE9wZW5FdmVudEEKLTAzOTUgc3R1YiBPcGVuRXZlbnRXCiswMzk0IHN0ZGNhbGwgT3BlbkV2ZW50QShsb25nIGxvbmcgcHRyKSBPcGVuRXZlbnQzMkEKKzAzOTUgc3RkY2FsbCBPcGVuRXZlbnRXKGxvbmcgbG9uZyBwdHIpIE9wZW5FdmVudDMyVwogMDM5NiBzdGRjYWxsIE9wZW5GaWxlKHB0ciBwdHIgbG9uZykgT3BlbkZpbGUzMgogMDM5NyBzdGRjYWxsIE9wZW5GaWxlTWFwcGluZ0EobG9uZyBsb25nIHB0cikgT3BlbkZpbGVNYXBwaW5nMzJBCiAwMzk4IHN0ZGNhbGwgT3BlbkZpbGVNYXBwaW5nVyhsb25nIGxvbmcgcHRyKSBPcGVuRmlsZU1hcHBpbmczMlcKLTAzOTkgc3R1YiBPcGVuTXV0ZXhBCi0wNDAwIHN0dWIgT3Blbk11dGV4VworMDM5OSBzdGRjYWxsIE9wZW5NdXRleEEobG9uZyBsb25nIHB0cikgT3Blbk11dGV4MzJBCiswNDAwIHN0ZGNhbGwgT3Blbk11dGV4Vyhsb25nIGxvbmcgcHRyKSBPcGVuTXV0ZXgzMlcKIDA0MDEgc3R1YiBPcGVuUHJvY2VzcwogMDQwMiBzdHViIE9wZW5Qcm9maWxlVXNlck1hcHBpbmcKLTA0MDMgc3R1YiBPcGVuU2VtYXBob3JlQQotMDQwNCBzdHViIE9wZW5TZW1hcGhvcmVXCiswNDAzIHN0ZGNhbGwgT3BlblNlbWFwaG9yZUEobG9uZyBsb25nIHB0cikgT3BlblNlbWFwaG9yZTMyQQorMDQwNCBzdGRjYWxsIE9wZW5TZW1hcGhvcmVXKGxvbmcgbG9uZyBwdHIpIE9wZW5TZW1hcGhvcmUzMlcKIDA0MDUgc3RkY2FsbCBPdXRwdXREZWJ1Z1N0cmluZ0EocHRyKSBPdXRwdXREZWJ1Z1N0cmluZzMyQQogMDQwNiBzdHViIE91dHB1dERlYnVnU3RyaW5nVwogMDQwNyBzdHViIFBlZWtDb25zb2xlSW5wdXRBCkBAIC00MzgsNyArNDM4LDcgQEAKIDA0MzMgc3R1YiBSZWdpc3Rlcldvd0Jhc2VIYW5kbGVycwogMDQzNCBzdHViIFJlZ2lzdGVyV293RXhlYwogMDQzNSAJc3RkY2FsbCBSZWxlYXNlTXV0ZXgobG9uZykgUmVsZWFzZU11dGV4Ci0wNDM2IHN0dWIgUmVsZWFzZVNlbWFwaG9yZQorMDQzNiBzdGRjYWxsIFJlbGVhc2VTZW1hcGhvcmUobG9uZyBsb25nIHB0cikgUmVsZWFzZVNlbWFwaG9yZQogMDQzNyBzdGRjYWxsIFJlbW92ZURpcmVjdG9yeUEocHRyKSBSZW1vdmVEaXJlY3RvcnkzMkEKIDA0Mzggc3RkY2FsbCBSZW1vdmVEaXJlY3RvcnlXKHB0cikgUmVtb3ZlRGlyZWN0b3J5MzJXCiAwNDM5IAlzdGRjYWxsIFJlc2V0RXZlbnQobG9uZykgUmVzZXRFdmVudApAQCAtNjY1LDcgKzY2NSw3IEBACiAwNjU5IHN0dWIgU1VuTWFwTFNfSVBfRUJQXzgKIDA2NjAgc3R1YiBTVW5NYXBMU19JUF9FQlBfMTYKIDA2NjEgc3R1YiBTVW5NYXBMU19JUF9FQlBfMjAKLTA2NjIgc3R1YiBNYXBTTAorMDY2MiBzdGRjYWxsIE1hcFNMKGxvbmcpIE1hcFNMCiAwNjYzIHN0dWIgSzMyVGhrMTYzMkVwaWxvZwogMDY2NCBzdHViIEszMlRoazE2MzJQcm9sb2cKIDA2NjUgc3R1YiBHZXRQcm9jZXNzRmxhZ3MKQEAgLTY4MCwzICs2ODAsOCBAQAogMDY3NCBzdHViIEZyZWVTTENhbGxiYWNrCiAwNjc1IHN0dWIgQWxsb2NTTENhbGxiYWNrCiAwNjc2IHN0dWIgQ2FsbGJhY2syOAorMDY3NyBzdHViIFVuaW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbgorMDY3OCBzdHViIEZUX0V4aXQ0CiswNjc5IHN0ZGNhbGwgTWFwTFMocHRyKSBNYXBMUworMDY4MCBzdGRjYWxsIFVuTWFwTFMobG9uZykgVW5NYXBMUworMDY4MSBzdHViIE9wZW5WeERIYW5kbGUKZGlmZiAtLWdpdCBhL2lmMTYzMi9udGRsbC5zcGVjIGIvaWYxNjMyL250ZGxsLnNwZWMKaW5kZXggN2FjNjA4Zi4uMGNjZWUyNCAxMDA2NDQKLS0tIGEvaWYxNjMyL250ZGxsLnNwZWMKKysrIGIvaWYxNjMyL250ZGxsLnNwZWMKQEAgLTM3OCw3ICszNzgsNyBAQAogMzc0IHN0ZGNhbGwgUnRsRnJlZUhlYXAobG9uZyBsb25nIGxvbmcpIEhlYXBGcmVlCiAzNzUgc3R1YiBSdGxGcmVlT2VtU3RyaW5nCiAzNzYgc3R1YiBSdGxGcmVlU2lkCi0zNzcgc3R1YiBSdGxGcmVlVW5pY29kZVN0cmluZworMzc3IHN0ZGNhbGwgUnRsRnJlZVVuaWNvZGVTdHJpbmcocHRyKSBSdGxGcmVlVW5pY29kZVN0cmluZwogMzc4IHN0dWIgUnRsR2VuZXJhdGU4ZG90M05hbWUKIDM3OSBzdHViIFJ0bEdldEFjZQogMzgwIHN0dWIgUnRsR2V0Q2FsbGVyc0FkZHJlc3MKQEAgLTUwOCw3ICs1MDgsNyBAQAogNTA0IHN0dWIgUnRsVGltZVRvU2Vjb25kc1NpbmNlMTk4MAogNTA1IHN0dWIgUnRsVGltZVRvVGltZUZpZWxkcwogNTA2IHN0dWIgUnRsVW5pY29kZVN0cmluZ1RvQW5zaVNpemUKLTUwNyBzdHViIFJ0bFVuaWNvZGVTdHJpbmdUb0Fuc2lTdHJpbmcKKzUwNyBzdGRjYWxsIFJ0bFVuaWNvZGVTdHJpbmdUb0Fuc2lTdHJpbmcocHRyIHB0ciBsb25nKSBSdGxVbmljb2RlU3RyaW5nVG9BbnNpU3RyaW5nCiA1MDggc3R1YiBSdGxVbmljb2RlU3RyaW5nVG9Db3VudGVkT2VtU3RyaW5nCiA1MDkgc3R1YiBSdGxVbmljb2RlU3RyaW5nVG9JbnRlZ2VyCiA1MTAgc3R1YiBSdGxVbmljb2RlU3RyaW5nVG9PZW1TaXplCmRpZmYgLS1naXQgYS9pZjE2MzIvc2hlbGwuc3BlYyBiL2lmMTYzMi9zaGVsbC5zcGVjCmluZGV4IGVhZjZlYzkuLjZmYzRmNjQgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9zaGVsbC5zcGVjCisrKyBiL2lmMTYzMi9zaGVsbC5zcGVjCkBAIC00MSw3ICs0MSw3IEBACiAjICAyNjQgU0gxNlRPMzJJTlQyNTI2CiAjICAzMDAgU0hHRVRGSUxFSU5GTwogIyAgNDAwIFNIRk9STUFURFJJVkUKLSMgIDQwMSBTSENIRUNLRFJJVkUKKzQwMSBzdHViIFNIQ0hFQ0tEUklWRQogIyAgNDAyIF9SVU5ETExDSEVDS0RSSVZFCiAKICMgOCBXRVAgCmRpZmYgLS1naXQgYS9pZjE2MzIvdXNlci5zcGVjIGIvaWYxNjMyL3VzZXIuc3BlYwppbmRleCA1NjRlNzkwLi5mZTBjNGY3IDEwMDY0NAotLS0gYS9pZjE2MzIvdXNlci5zcGVjCisrKyBiL2lmMTYzMi91c2VyLnNwZWMKQEAgLTE3MSw3ICsxNzEsNyBAQAogMTY5IHBhc2NhbDE2IEdldENhcmV0QmxpbmtUaW1lKCkgR2V0Q2FyZXRCbGlua1RpbWUxNgogMTcwIHBhc2NhbDE2IEFycmFuZ2VJY29uaWNXaW5kb3dzKHdvcmQpIEFycmFuZ2VJY29uaWNXaW5kb3dzMTYKIDE3MSBwYXNjYWwxNiBXaW5IZWxwKHdvcmQgcHRyIHdvcmQgbG9uZykgV2luSGVscDE2Ci0xNzIgc3R1YiBTd2l0Y2hUb1RoaXNXaW5kb3cKKzE3MiBwYXNjYWwxNiBTd2l0Y2hUb1RoaXNXaW5kb3cod29yZCB3b3JkKSBTd2l0Y2hUb1RoaXNXaW5kb3cxNgogMTczIHBhc2NhbDE2IExvYWRDdXJzb3Iod29yZCBzZWdwdHIpIExvYWRDdXJzb3IxNgogMTc0IHBhc2NhbDE2IExvYWRJY29uKHdvcmQgc2VncHRyKSBMb2FkSWNvbjE2CiAxNzUgcGFzY2FsMTYgTG9hZEJpdG1hcCh3b3JkIHNlZ3B0cikgTG9hZEJpdG1hcDE2CkBAIC0yOTcsNyArMjk3LDcgQEAKIDI5MSBwYXNjYWwgICBTZXRXaW5kb3dzSG9va0V4KHNfd29yZCBzZWdwdHIgd29yZCB3b3JkKSBUSFVOS19TZXRXaW5kb3dzSG9va0V4MTYKIDI5MiBwYXNjYWwxNiBVbmhvb2tXaW5kb3dzSG9va0V4KHNlZ3B0cikgVEhVTktfVW5ob29rV2luZG93c0hvb2tFeDE2CiAyOTMgcGFzY2FsICAgQ2FsbE5leHRIb29rRXgoc2VncHRyIHNfd29yZCB3b3JkIGxvbmcpIENhbGxOZXh0SG9va0V4MTYKLTI5NCBzdHViIExvY2tXaW5kb3dVcGRhdGUKKzI5NCBwYXNjYWwxNiBMb2NrV2luZG93VXBkYXRlKHdvcmQpIExvY2tXaW5kb3dVcGRhdGUxNgogMjk5IHJlZ2lzdGVyIE1vdXNlX0V2ZW50KCkgTW91c2VfRXZlbnQKIDMwMCBzdHViIFVubG9hZEluc3RhbGxlZERyaXZlcnMKICMzMDEgQk9aT1NMSVZFSEVSRSA6LSkpCTwtIHRoaXMgaXMgYWN0dWFsbHkgRWRpdFduZFByb2MKZGlmZiAtLWdpdCBhL2lmMTYzMi91c2VyMzIuc3BlYyBiL2lmMTYzMi91c2VyMzIuc3BlYwppbmRleCA3MWY3ZjBiLi5mNmMzZWE0IDEwMDY0NAotLS0gYS9pZjE2MzIvdXNlcjMyLnNwZWMKKysrIGIvaWYxNjMyL3VzZXIzMi5zcGVjCkBAIC0zODEsNyArMzgxLDcgQEAKIDAzNzQgc3RkY2FsbCBMb2FkU3RyaW5nQShsb25nIGxvbmcgcHRyIGxvbmcpIExvYWRTdHJpbmczMkEKIDAzNzUgc3RkY2FsbCBMb2FkU3RyaW5nVyhsb25nIGxvbmcgcHRyIGxvbmcpIExvYWRTdHJpbmczMlcKIDAzNzYgc3R1YiBMb2NrV2luZG93U3RhdGlvbgotMDM3NyBzdHViIExvY2tXaW5kb3dVcGRhdGUKKzAzNzcgc3RkY2FsbCBMb2NrV2luZG93VXBkYXRlKGxvbmcpIExvY2tXaW5kb3dVcGRhdGUzMgogMDM3OCBzdHViIExvb2t1cEljb25JZEZyb21EaXJlY3RvcnkKIDAzNzkgc3R1YiBMb29rdXBJY29uSWRGcm9tRGlyZWN0b3J5RXgKIDAzODAgc3R1YiBNQlRvV0NTRXgKQEAgLTU0Miw3ICs1NDIsNyBAQAogMDUzNSBzdGRjYWxsIFN1YnRyYWN0UmVjdChwdHIgcHRyIHB0cikgU3VidHJhY3RSZWN0MzIKIDA1MzYgc3RkY2FsbCBTd2FwTW91c2VCdXR0b24obG9uZykgU3dhcE1vdXNlQnV0dG9uMzIKIDA1Mzcgc3R1YiBTd2l0Y2hEZXNrdG9wCi0wNTM4IHN0dWIgU3dpdGNoVG9UaGlzV2luZG93CiswNTM4IHN0ZGNhbGwgU3dpdGNoVG9UaGlzV2luZG93KGxvbmcgbG9uZykgU3dpdGNoVG9UaGlzV2luZG93MzIKIDA1Mzkgc3RkY2FsbCBTeXN0ZW1QYXJhbWV0ZXJzSW5mb0EobG9uZyBsb25nIHB0ciBsb25nKSBTeXN0ZW1QYXJhbWV0ZXJzSW5mbzMyQQogMDU0MCBzdGRjYWxsIFN5c3RlbVBhcmFtZXRlcnNJbmZvVyhsb25nIGxvbmcgcHRyIGxvbmcpIFN5c3RlbVBhcmFtZXRlcnNJbmZvMzJXCiAwNTQxIHN0ZGNhbGwgVGFiYmVkVGV4dE91dEEobG9uZyBsb25nIGxvbmcgcHRyIGxvbmcgbG9uZyBwdHIgbG9uZykgVGFiYmVkVGV4dE91dDMyQQpAQCAtNjA1LDMgKzYwNSw0IEBACiAwNTk3IHN0dWIgVG9Vbmljb2RlRXgKIDA1OTggc3R1YiBEcmF3Q2FwdGlvblRlbXBBCiAwNTk5IHN0dWIgUmVnaXN0ZXJOZXR3b3JrQ2FwYWJpbGl0aWVzCiswNjAwIHN0dWIgV05EUFJPQ19DQUxMQkFDSwpkaWZmIC0tZ2l0IGEvaWYxNjMyL3dwcm9jcy5zcGVjIGIvaWYxNjMyL3dwcm9jcy5zcGVjCmluZGV4IDBkZWU5NGMuLmJjNjc2YWMgMTAwNjQ0Ci0tLSBhL2lmMTYzMi93cHJvY3Muc3BlYworKysgYi9pZjE2MzIvd3Byb2NzLnNwZWMKQEAgLTQsNyArNCw2IEBACiAxICBwYXNjYWwgV0lOUFJPQ19DYWxsUHJvYzE2VG8zMkEod29yZCB3b3JkIHdvcmQgbG9uZyBsb25nKSBXSU5QUk9DX0NhbGxQcm9jMTZUbzMyQQogMiAgcGFzY2FsIFN0YXRpY1duZFByb2Mod29yZCB3b3JkIHdvcmQgbG9uZykgU3RhdGljV25kUHJvYwogMyAgcGFzY2FsIFNjcm9sbEJhclduZFByb2Mod29yZCB3b3JkIHdvcmQgbG9uZykgU2Nyb2xsQmFyV25kUHJvYwotNSAgcGFzY2FsIENvbWJvQm94V25kUHJvYyh3b3JkIHdvcmQgd29yZCBsb25nKSBDb21ib0JveFduZFByb2MKIDEwIHBhc2NhbCBNRElDbGllbnRXbmRQcm9jKHdvcmQgd29yZCB3b3JkIGxvbmcpIE1ESUNsaWVudFduZFByb2MKIDE0IHBhc2NhbCBGaWxlT3BlbkRsZ1Byb2Mod29yZCB3b3JkIHdvcmQgbG9uZykgRmlsZU9wZW5EbGdQcm9jCiAxNSBwYXNjYWwgRmlsZVNhdmVEbGdQcm9jKHdvcmQgd29yZCB3b3JkIGxvbmcpIEZpbGVTYXZlRGxnUHJvYwpAQCAtMTMsNyArMTIsNiBAQAogMTggcGFzY2FsIFJlcGxhY2VUZXh0RGxnUHJvYyh3b3JkIHdvcmQgd29yZCBsb25nKSBSZXBsYWNlVGV4dERsZ1Byb2MKIDE5IHBhc2NhbCBQcmludFNldHVwRGxnUHJvYyh3b3JkIHdvcmQgd29yZCBsb25nKSBQcmludFNldHVwRGxnUHJvYwogMjAgcGFzY2FsIFByaW50RGxnUHJvYyh3b3JkIHdvcmQgd29yZCBsb25nKSBQcmludERsZ1Byb2MKLTIyIHBhc2NhbCBDb21ib0xCb3hXbmRQcm9jKHdvcmQgd29yZCB3b3JkIGxvbmcpIENvbWJvTEJveFduZFByb2MKIDI0IHBhc2NhbDE2IFRBU0tfUmVzY2hlZHVsZSgpIFRBU0tfUmVzY2hlZHVsZQogMjcgcGFzY2FsIEVudHJ5QWRkclByb2Mod29yZCB3b3JkKSBNT0RVTEVfR2V0RW50cnlQb2ludAogMjggcGFzY2FsIE15QWxsb2Mod29yZCB3b3JkIHdvcmQpIE1PRFVMRV9BbGxvY2F0ZVNlZ21lbnQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29tYm8uaCBiL2luY2x1ZGUvY29tYm8uaAppbmRleCA4MmZlODZjLi43MDYwYmRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbWJvLmgKKysrIGIvaW5jbHVkZS9jb21iby5oCkBAIC0yLDIwICsyLDU1IEBACiAgKiBDb21ibyBib3ggZGVmaW5pdGlvbnMKICAqLwogCisjaWZuZGVmIF9fV0lORV9DT01CT19ICisjZGVmaW5lIF9fV0lORV9DT01CT19ICiAKLXR5cGVkZWYgc3RydWN0IHsKLSAgV05EKgkgIHduZFNlbGY7Ci0gIERXT1JEICAgZHdTdHlsZTsKLSAgRFdPUkQgICBkd1N0YXRlOwotICBIV05EMTYgIGhXbmRFZGl0OwotICBIV05EMTYgIGhXbmRMQm94OwotICBXT1JEICAgIExCb3hUb3A7Ci0gIEJPT0wxNiAgRHJvcERvd25WaXNpYmxlOwotICBzaG9ydCAgIExhc3RTZWw7Ci0gIFJFQ1QxNiAgUmVjdEVkaXQ7Ci0gIFJFQ1QxNiAgUmVjdEJ1dHRvbjsKLSAgQk9PTDE2ICBiUmVkcmF3RmxhZzsKKyNkZWZpbmUgSURfQ0JfTElTVEJPWCAgICAgICAgICAgMTAwMAorI2RlZmluZSBJRF9DQl9FRElUICAgICAgICAgICAgICAxMDAxCisKKy8qIEludGVybmFsIGZsYWdzICovCisKKyNkZWZpbmUgQ0JGX0RST1BQRUQgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIENCRl9CVVRUT05ET1dOICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBDQkZfTk9ST0xMVVAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgQ0JGX01FQVNVUkVJVEVNCQkweDAwMDgKKyNkZWZpbmUgQ0JGX0ZPQ1VTRUQgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIENCRl9DQVBUVVJFICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBDQkZfRURJVCAgICAgICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgQ0JGX05PUkVTSVpFCQkweDAwODAKKyNkZWZpbmUgQ0JGX0VVSSAgICAgICAgICAgICAgICAgMHg4MDAwCisKKy8qIENvbWJvIHN0YXRlIHN0cnVjdCAqLworCit0eXBlZGVmIHN0cnVjdAoreworICAgV05EKiAgICAJc2VsZjsKKyAgIEhXTkQzMiAgCW93bmVyOworICAgVUlOVDMyICAJZHdTdHlsZTsKKyAgIEhXTkQzMiAgCWhXbmRFZGl0OworICAgSFdORDMyICAJaFduZExCb3g7CisgICBVSU5UMTYgIAl3U3RhdGU7CisgICBIRk9OVDE2IAloRm9udDsKKyAgIFJFQ1QxNiAgCVJlY3RDb21ibzsKKyAgIFJFQ1QxNiAgCVJlY3RFZGl0OworICAgUkVDVDE2ICAJUmVjdEJ1dHRvbjsKKyAgIElOVDMyICAgCWRyb3BwZWRXaWR0aDsJCS8qIGxhc3QgdHdvIGFyZSBub3QgdXNlZCB1bmxlc3Mgc2V0ICovCisgICBJTlQzMiAgIAllZGl0SGVpZ2h0OwkJLyogZXhwbGljaXRseSAqLwogfSBIRUFEQ09NQk8sKkxQSEVBRENPTUJPOwogCi1MUkVTVUxUIENvbWJvQm94V25kUHJvYyhIV05EMTYgaHduZCwgVUlOVDE2IG1lc3NhZ2UsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7Ci1MUkVTVUxUIENvbWJvTEJveFduZFByb2MoSFdORDE2IGh3bmQsIFVJTlQxNiBtZXNzYWdlLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworLyoKKyAqIE5vdGUsIHRoYXQgQ0JTX0RST1BET1dOTElTVCBzdHlsZSBpcyBhY3R1YWxseSAoQ0JTX1NJTVBMRSB8IENCU19EUk9QRE9XTikhCisgKi8KKworI2RlZmluZSBDQl9HRVRUWVBFKCBscGhjICkgICAgKChscGhjKS0+ZHdTdHlsZSAmIChDQlNfRFJPUERPV05MSVNUKSkKKyNkZWZpbmUgQ0JfRElTQUJMRUQoIGxwaGMgKSAgICgobHBoYyktPnNlbGYtPmR3U3R5bGUgJiBXU19ESVNBQkxFRCkKKyNkZWZpbmUgQ0JfT1dORVJEUkFXTiggbHBoYyApICgobHBoYyktPmR3U3R5bGUgJiAoQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX09XTkVSRFJBV1ZBUklBQkxFKSkKKyNkZWZpbmUgQ0JfSEFTU1RSSU5HUyggbHBoYyApICgobHBoYyktPmR3U3R5bGUgJiBDQlNfSEFTU1RSSU5HUykKKyNkZWZpbmUgQ0JfSFdORCggbHBoYyApICAgICAgICgobHBoYyktPnNlbGYtPmh3bmRTZWxmKQorCitCT09MMzIgCUNPTUJPX0ZsaXBMaXN0Ym94KCBMUEhFQURDT01CTywgQk9PTDMyICk7CitIV05EMzIgCUNPTUJPX0dldExCV2luZG93KCBXTkQqICk7CitMUkVTVUxUIENPTUJPX0RpcmVjdG9yeSggTFBIRUFEQ09NQk8sIFVJTlQzMiwgTFBTVFIsIEJPT0wzMiApOworCisjZW5kaWYgLyogX19XSU5FX0NPTUJPX0ggKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kaWFsb2cuaCBiL2luY2x1ZGUvZGlhbG9nLmgKaW5kZXggYTlkYjcyZS4uYWMzYTE0ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kaWFsb2cuaAorKysgYi9pbmNsdWRlL2RpYWxvZy5oCkBAIC0yOCwxNSArMjgsMTcgQEAKICAgICBIV05EMTYgICAgICBod25kRm9jdXM7ICAgLyogQ3VycmVudCBjb250cm9sIHdpdGggZm9jdXMgKi8KICAgICBIRk9OVDE2ICAgICBoVXNlckZvbnQ7ICAgLyogRGlhbG9nIGZvbnQgKi8KICAgICBITUVOVTE2ICAgICBoTWVudTsgICAgICAgLyogRGlhbG9nIG1lbnUgKi8KLSAgICBXT1JEICAgICAgICB4QmFzZVVuaXQ7ICAgLyogRGlhbG9nIHVuaXRzIChkZXBlbmRzIG9uIHRoZSBmb250KSAqLwotICAgIFdPUkQgICAgICAgIHlCYXNlVW5pdDsKKyAgICBVSU5UMTYgICAgICB4QmFzZVVuaXQ7ICAgLyogRGlhbG9nIHVuaXRzIChkZXBlbmRzIG9uIHRoZSBmb250KSAqLworICAgIFVJTlQxNiAgICAgIHlCYXNlVW5pdDsKICAgICBJTlQzMglpZFJlc3VsdDsgICAgLyogRW5kRGlhbG9nKCkgcmVzdWx0IC8gZGVmYXVsdCBwdXNoYnV0dG9uIElEICovCi0gICAgV09SRCAgICAgICAgZkVuZDsgICAgICAgIC8qIEVuZERpYWxvZygpIGNhbGxlZCBmb3IgdGhpcyBkaWFsb2cgKi8KKyAgICBVSU5UMTYgICAgICBmbGFnczsgICAgICAgLyogRW5kRGlhbG9nKCkgY2FsbGVkIGZvciB0aGlzIGRpYWxvZyAqLwogICAgIEhHTE9CQUwxNiAgIGhEaWFsb2dIZWFwOwogfSBESUFMT0dJTkZPOwogCiAjcHJhZ21hIHBhY2soNCkKIAorI2RlZmluZSBERl9FTkQgIDB4MDAwMQorCiBleHRlcm4gQk9PTDMyIERJQUxPR19Jbml0KHZvaWQpOwogZXh0ZXJuIEhXTkQzMiBESUFMT0dfQ3JlYXRlSW5kaXJlY3QoIEhJTlNUQU5DRTMyIGhJbnN0LCBMUENTVFIgZGxnVGVtcGxhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDMyIHdpbjMyVGVtcGxhdGUsIEhXTkQzMiBvd25lciwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ2RpLmggYi9pbmNsdWRlL2dkaS5oCmluZGV4IGFkNDg4NDkuLjg0MDMwMDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZ2RpLmgKKysrIGIvaW5jbHVkZS9nZGkuaApAQCAtMTU4LDYgKzE1OCw3IEBACiAgICAgSU5UMzIgICAgICAoKnBFeGNsdWRlVmlzUmVjdCkoREMqLElOVDMyLElOVDMyLElOVDMyLElOVDMyKTsKICAgICBCT09MMzIgICAgICgqcEV4dEZsb29kRmlsbCkoREMqLElOVDMyLElOVDMyLENPTE9SUkVGLFVJTlQzMik7CiAgICAgQk9PTDMyICAgICAoKnBFeHRUZXh0T3V0KShEQyosSU5UMzIsSU5UMzIsVUlOVDMyLGNvbnN0IFJFQ1QzMiosTFBDU1RSLFVJTlQzMixjb25zdCBJTlQzMiopOworICAgIEJPT0wzMiAgICAgKCpwR2V0Q2hhcldpZHRoKShEQyosVUlOVDMyLFVJTlQzMixMUElOVDMyKTsKICAgICBDT0xPUlJFRiAgICgqcEdldFBpeGVsKShEQyosSU5UMzIsSU5UMzIpOwogICAgIEJPT0wzMiAgICAgKCpwR2V0VGV4dEV4dGVudFBvaW50KShEQyosTFBDU1RSLElOVDMyLExQU0laRTMyKTsKICAgICBCT09MMzIgICAgICgqcEdldFRleHRNZXRyaWNzKShEQyosVEVYVE1FVFJJQzMyQSopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ncmFwaGljcy5oIGIvaW5jbHVkZS9ncmFwaGljcy5oCmluZGV4IDlmZmRiYjMuLjZkOTMzZmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZ3JhcGhpY3MuaAorKysgYi9pbmNsdWRlL2dyYXBoaWNzLmgKQEAgLTEzLDggKzEzLDEzIEBACiBleHRlcm4gdm9pZCBHUkFQSF9EcmF3UmVsaWVmUmVjdCggSERDMzIgaGRjLCBjb25zdCBSRUNUMzIgKnJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgaGlnaGxpZ2h0X3NpemUsIElOVDMyIHNoYWRvd19zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBwcmVzc2VkICk7CitleHRlcm4gQk9PTDMyIEdSQVBIX0RyYXdMaW5lcyggSERDMzIgaGRjLCBMUFBPSU5UMzIgcFhZLCBJTlQzMiBOLCBIUEVOMzIgaFBlbik7CitleHRlcm4gdm9pZCBHUkFQSF9EcmF3UmVjdGFuZ2xlKCBIREMzMiBoZGMsIElOVDMyIHgsIElOVDMyIHksIAorCQkJCSBJTlQzMiB3aWR0aCwgSU5UMzIgaGVpZ2h0LCBIUEVOMzIgaFBlbik7CiBleHRlcm4gQk9PTDMyIEdSQVBIX0RyYXdCaXRtYXAoIEhEQzMyIGhkYywgSEJJVE1BUDMyIGhiaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4ZGVzdCwgaW50IHlkZXN0LCBpbnQgeHNyYywgaW50IHlzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiB4ZGVzdCwgSU5UMzIgeWRlc3QsIElOVDMyIHhzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIHlzcmMsIElOVDMyIHdpZHRoLCBJTlQzMiBoZWlnaHQgKTsKK2V4dGVybiBCT09MMzIgR1JBUEhfU2VsZWN0Q2xpcE1hc2soIEhEQzMyIGhkYywgSEJJVE1BUDMyIGhNb25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgeCwgSU5UMzIgeSApOwogCiAjZW5kaWYgLyogX19XSU5FX0dSQVBISUNTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3B0aW9ucy5oIGIvaW5jbHVkZS9vcHRpb25zLmgKaW5kZXggM2YwNTFkNi4uMzZiZmI1YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9vcHRpb25zLmgKKysrIGIvaW5jbHVkZS9vcHRpb25zLmgKQEAgLTI0LDcgKzI0LDggQEAKICAgICBMQU5HX0l0LCAgLyogSXRhbGlhbiAqLwogICAgIExBTkdfS28sICAvKiBLb3JlYW4gKi8KICAgICBMQU5HX0h1LCAgLyogSHVuZ2FyaWFuICovCi0gICAgTEFOR19QbCAgIC8qIFBvbGlzaCAqLworICAgIExBTkdfUGwsICAvKiBQb2xpc2ggKi8KKyAgICBMQU5HX1BvICAgLyogUG9ydHVndWVzZSAqLwogfSBXSU5FX0xBTkdVQUdFOwogCiB0eXBlZGVmIHN0cnVjdApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wZV9pbWFnZS5oIGIvaW5jbHVkZS9wZV9pbWFnZS5oCmluZGV4IDEyZjY4OTUuLjQzM2JjZGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcGVfaW1hZ2UuaAorKysgYi9pbmNsdWRlL3BlX2ltYWdlLmgKQEAgLTIzLDE1ICsyMywxNSBAQAogZXh0ZXJuIGludCBQRV91bmxvYWRJbWFnZShITU9EVUxFMzIgaE1vZHVsZSk7CiBleHRlcm4gRkFSUFJPQzMyIFBFX0ZpbmRFeHBvcnRlZEZ1bmN0aW9uKHN0cnVjdCBwZV9kYXRhICpwZSwgTFBDU1RSIGZ1bmNOYW1lKTsKIGV4dGVybiB2b2lkIG15X3djc3RvbWJzKGNoYXIgKiByZXN1bHQsIHVfc2hvcnQgKiBzb3VyY2UsIGludCBsZW4pOwotZXh0ZXJuIFBFX0VudW1SZXNvdXJjZVR5cGVzMzJBKEhNT0RVTEUzMixFTlVNUkVTVFlQRVBST0MzMkEsTE9ORyk7Ci1leHRlcm4gUEVfRW51bVJlc291cmNlVHlwZXMzMlcoSE1PRFVMRTMyLEVOVU1SRVNUWVBFUFJPQzMyVyxMT05HKTsKLWV4dGVybiBQRV9FbnVtUmVzb3VyY2VOYW1lczMyQShITU9EVUxFMzIsTFBDU1RSLEVOVU1SRVNOQU1FUFJPQzMyQSxMT05HKTsKLWV4dGVybiBQRV9FbnVtUmVzb3VyY2VOYW1lczMyVyhITU9EVUxFMzIsTFBDV1NUUixFTlVNUkVTTkFNRVBST0MzMlcsTE9ORyk7Ci1leHRlcm4gUEVfRW51bVJlc291cmNlTGFuZ3VhZ2VzMzJBKEhNT0RVTEUzMixMUENTVFIsTFBDU1RSLEVOVU1SRVNMQU5HUFJPQzMyQSxMT05HKTsKLWV4dGVybiBQRV9FbnVtUmVzb3VyY2VMYW5ndWFnZXMzMlcoSE1PRFVMRTMyLExQQ1dTVFIsTFBDV1NUUixFTlVNUkVTTEFOR1BST0MzMlcsTE9ORyk7CitleHRlcm4gQk9PTDMyIFBFX0VudW1SZXNvdXJjZVR5cGVzMzJBKEhNT0RVTEUzMixFTlVNUkVTVFlQRVBST0MzMkEsTE9ORyk7CitleHRlcm4gQk9PTDMyIFBFX0VudW1SZXNvdXJjZVR5cGVzMzJXKEhNT0RVTEUzMixFTlVNUkVTVFlQRVBST0MzMlcsTE9ORyk7CitleHRlcm4gQk9PTDMyIFBFX0VudW1SZXNvdXJjZU5hbWVzMzJBKEhNT0RVTEUzMixMUENTVFIsRU5VTVJFU05BTUVQUk9DMzJBLExPTkcpOworZXh0ZXJuIEJPT0wzMiBQRV9FbnVtUmVzb3VyY2VOYW1lczMyVyhITU9EVUxFMzIsTFBDV1NUUixFTlVNUkVTTkFNRVBST0MzMlcsTE9ORyk7CitleHRlcm4gQk9PTDMyIFBFX0VudW1SZXNvdXJjZUxhbmd1YWdlczMyQShITU9EVUxFMzIsTFBDU1RSLExQQ1NUUixFTlVNUkVTTEFOR1BST0MzMkEsTE9ORyk7CitleHRlcm4gQk9PTDMyIFBFX0VudW1SZXNvdXJjZUxhbmd1YWdlczMyVyhITU9EVUxFMzIsTFBDV1NUUixMUENXU1RSLEVOVU1SRVNMQU5HUFJPQzMyVyxMT05HKTsKIGV4dGVybiBIUlNSQzMyIFBFX0ZpbmRSZXNvdXJjZUV4MzJXKEhJTlNUQU5DRTMyLExQQ1dTVFIsTFBDV1NUUixXT1JEKTsKIGV4dGVybiBEV09SRCBQRV9TaXplb2ZSZXNvdXJjZTMyKEhJTlNUQU5DRTMyLEhSU1JDMzIpOwogZXh0ZXJuIEhHTE9CQUwzMiBQRV9Mb2FkUmVzb3VyY2UzMihISU5TVEFOQ0UzMixIUlNSQzMyKTsKLWV4dGVybiB2b2lkIFBFX0luaXRpYWxpemVETExzKEhNT0RVTEUxNik7CitleHRlcm4gdm9pZCBQRV9Jbml0aWFsaXplRExMcyhITU9EVUxFMTYsRFdPUkQsTFBWT0lEKTsKIAogI2VuZGlmIC8qIF9fV0lORV9QRV9JTUFHRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbi5oIGIvaW5jbHVkZS93aW4uaAppbmRleCAwMTc5MjQ5Li5hYWJmZTYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbi5oCisrKyBiL2luY2x1ZGUvd2luLmgKQEAgLTI4LDYgKzI4LDIxIEBACiAjZGVmaW5lIFdJTlNXSVRDSF9DTEFTU19BVE9NIE1BS0VJTlRBVE9NKDMyNzcxKSAgLyogV2luU3dpdGNoICovCiAjZGVmaW5lIElDT05USVRMRV9DTEFTU19BVE9NIE1BS0VJTlRBVE9NKDMyNzcyKSAgLyogSWNvblRpdGxlICovCiAKKy8qIEJ1aWx0LWluIDMyLWJpdCBjbGFzc2VzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCSUMzMl9CVVRUT04sCisgICAgQklDMzJfRURJVCwKKyAgICBCSUMzMl9MSVNUQk9YLAorICAgIEJJQzMyX0NPTUJPLAorICAgIEJJQzMyX0NPTUJPTEIsCisgICAgQklDMzJfUE9QVVBNRU5VLAorICAgIEJJQzMyX1NDUk9MTCwKKyAgICBCSUMzMl9ERVNLVE9QLAorICAgIEJJQzMyX0RJQUxPRywKKyAgICBCSUMzMl9OQl9DTEFTU0VTCit9IEJVSUxUSU5fQ0xBU1MzMjsKKwogICAvKiBQQUlOVF9SZWRyYXdXaW5kb3coKSBjb250cm9sIGZsYWdzICovCiAjZGVmaW5lIFJEV19DX1VTRUhSR04JCTB4MDAwMQogI2RlZmluZSBSRFdfQ19ERUxFVEVIUkdOCTB4MDAwMgpAQCAtMTA4LDYgKzEyMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFJHTjMyIGhyZ25VcGRhdGUsIFVJTlQzMiBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgY29udHJvbCApOyAgICAvKiB3aW5kb3dzL3BhaW50aW5nLmMgKi8KIAorZXh0ZXJuIEJPT0wzMiBXSURHRVRTX0lzQ29udHJvbDMyKCBXTkQqIHBXbmQsIEJVSUxUSU5fQ0xBU1MzMiBjbHMgKTsgIC8qIGNvbnRyb2xzL3dpZGdldHMuYyAqLworCiBleHRlcm4gRGlzcGxheSAqIGRpc3BsYXk7CiBleHRlcm4gU2NyZWVuICogc2NyZWVuOwogZXh0ZXJuIFdpbmRvdyByb290V2luZG93OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW4xNmRydi5oIGIvaW5jbHVkZS93aW4xNmRydi5oCmluZGV4IDZiMmM4YTguLjA0ZGY0MTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luMTZkcnYuaAorKysgYi9pbmNsdWRlL3dpbjE2ZHJ2LmgKQEAgLTE1Miw4ICsxNTIsMzQgQEAKICAgICBTRUdQVFIJc2VncHRyRm9udEluZm87IC8qIEN1cnJlbnQgZm9udCByZWFsaXplZCBieSBwcmludGVyIGRyaXZlciAqLwogfSBXSU4xNkRSVl9QREVWSUNFOwogCisvKgorICogUHJpbnRlciBkcml2ZXIgZnVuY3Rpb25zCisgKi8KK3R5cGVkZWYgU0VHUFRSIExQUERFVklDRTsKK0xPQURFRF9QUklOVEVSX0RSSVZFUiAqTG9hZFByaW50ZXJEcml2ZXIoY29uc3QgY2hhciAqcHN6RHJpdmVyKTsKKworZXh0ZXJuIElOVDE2IFBSVERSVl9Db250cm9sKExQUERFVklDRSBscERlc3REZXYsIFdPUkQgd2Z1bmN0aW9uLCBTRUdQVFIgbHBJbkRhdGEsIFNFR1BUUiBscE91dERhdGEpOworZXh0ZXJuIFdPUkQgUFJURFJWX0VuYWJsZShMUFZPSUQgbHBEZXZJbmZvLCBXT1JEIHdTdHlsZSwgTFBDU1RSICBscERlc3REZXZUeXBlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwRGV2aWNlTmFtZSwgTFBDU1RSIGxwT3V0cHV0RmlsZSwgTFBWT0lEIGxwRGF0YSk7CitleHRlcm4gV09SRCBQUlREUlZfRW51bURGb250cyhMUFBERVZJQ0UgbHBEZXN0RGV2LCBMUFNUUiBscEZhY2VOYW1lLCAgCisJCSAgICAgICBGQVJQUk9DMTYgbHBDYWxsYmFja0Z1bmMsIExQVk9JRCBscENsaWVudERhdGEpOworZXh0ZXJuIERXT1JEIFBSVERSVl9SZWFsaXplT2JqZWN0KExQUERFVklDRSBscERlc3REZXYsIFdPUkQgd1N0eWxlLCAKKwkJCQkgIExQVk9JRCBscEluT2JqLCBMUFZPSUQgbHBPdXRPYmosCisJCQkJICBMUFRFWFRYRk9STTE2IGxwVGV4dFhGb3JtKTsKKworZXh0ZXJuIEJPT0wxNiBQUlREUlZfRW51bU9iaihMUFBERVZJQ0UgbHBEZXN0RGV2LCBXT1JEIGlTdHlsZSwgRkFSUFJPQzE2IGxwZm4sIExQVk9JRCBscGIpOworZXh0ZXJuIERXT1JEIFBSVERSVl9FeHRUZXh0T3V0KExQUERFVklDRSBscERlc3REZXYsIFdPUkQgd0Rlc3RYT3JnLCBXT1JEIHdEZXN0WU9yZywKKwkJCSAgICAgICBSRUNUMTYgKmxwQ2xpcFJlY3QsIExQQ1NUUiBscFN0cmluZywgV09SRCB3Q291bnQsIAorCQkJICAgICAgIFNFR1BUUiBscEZvbnRJbmZvLCBMUERSQVdNT0RFIGxwRHJhd01vZGUsIAorCQkJICAgICAgIExQVEVYVFhGT1JNMTYgbHBUZXh0WEZvcm0sIFNIT1JUICpscENoYXJXaWR0aHMsCisJCQkgICAgICAgUkVDVDE2ICogICAgIGxwT3BhcXVlUmVjdCwgV09SRCB3T3B0aW9ucyk7CisKKwogLyogV2luZSBkcml2ZXIgZnVuY3Rpb25zICovCiAKK2V4dGVybiBCT09MMzIgV0lOMTZEUlZfR2V0Q2hhcldpZHRoKCBzdHJ1Y3QgdGFnREMgKmRjLCBVSU5UMzIgZmlyc3RDaGFyLCBVSU5UMzIgbGFzdENoYXIsCisJCQkJICAgTFBJTlQzMiBidWZmZXIgKTsKKwogZXh0ZXJuIEJPT0wzMiBXSU4xNkRSVl9HZXRUZXh0RXh0ZW50UG9pbnQoIERDICpkYywgTFBDU1RSIHN0ciwgSU5UMzIgY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTSVpFMzIgc2l6ZSApOwogZXh0ZXJuIEJPT0wzMiBXSU4xNkRSVl9HZXRUZXh0TWV0cmljcyggREMgKmRjLCBURVhUTUVUUklDMzJBICptZXRyaWNzICk7CkBAIC0xNjQsNCArMTkwLDUgQEAKIGV4dGVybiBIR0RJT0JKMzIgV0lOMTZEUlZfU2VsZWN0T2JqZWN0KCBEQyAqZGMsIEhHRElPQkozMiBoYW5kbGUgKTsKIAogCisKICNlbmRpZiAgLyogX19XSU5FX1dJTjE2RFJWX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luZG93cy5oIGIvaW5jbHVkZS93aW5kb3dzLmgKaW5kZXggNjQ0OGY2My4uZTU1YmYxNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5kb3dzLmgKKysrIGIvaW5jbHVkZS93aW5kb3dzLmgKQEAgLTMzMDAsNiArMzMwMCwxMCBAQAogI2RlZmluZSBDQlNfTk9JTlRFR1JBTEhFSUdIVCAgMHgwNDAwTAogI2RlZmluZSBDQlNfRElTQUJMRU5PU0NST0xMICAgMHgwODAwTAogCisjZGVmaW5lIENCU19VUFBFUkNBU0UJICAgICAgMHgyMDAwTAorI2RlZmluZSBDQlNfTE9XRVJDQVNFCSAgICAgIDB4NDAwMEwKKworCiAvKiBDb21ibyBib3ggbWVzc2FnZXMgKi8KICNkZWZpbmUgQ0JfR0VURURJVFNFTDE2ICAgICAgICAgICAgKFdNX1VTRVIrMCkKICNkZWZpbmUgQ0JfR0VURURJVFNFTDMyICAgICAgICAgICAgMHgwMTQwCkBAIC00Nzc3LDYgKzQ3ODEsMTAgQEAKICNkZWZpbmUJQzNfQUxQSEEJCTB4ODAwMAogI2RlZmluZQlDM19OT1RBUFBMSUNBQkxFCTB4MDAwMAogCisvKiBmbGFncyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gTG9hZExpYnJhcnlFeCAqLworI2RlZmluZQlET05UX1JFU09MVkVfRExMX1JFRkVSRU5DRVMJMHgwMDAwMDAwMQorI2RlZmluZQlMT0FEX0xJQlJBUllfQVNfREFUQUZJTEUJMHgwMDAwMDAwMgorI2RlZmluZQlMT0FEX1dJVEhfQUxURVJFRF9TRUFSQ0hfUEFUSAkweDAwMDAwMDA4CiAKICNwcmFnbWEgcGFjayg0KQogCkBAIC00OTE4LDcgKzQ5MjYsNiBAQAogVk9JRCAgICAgICBZaWVsZCh2b2lkKTsKIAogLyogRGVjbGFyYXRpb25zIGZvciBmdW5jdGlvbnMgdGhhdCBleGlzdCBvbmx5IGluIFdpbjMyICovCi0KIEJPT0wzMiAgICAgQmVlcChEV09SRCxEV09SRCk7CiBCT09MMzIgICAgIENsZWFyQ29tbUVycm9yKElOVDMyLExQRFdPUkQsTFBDT01TVEFUKTsKIEJPT0wzMiAgICAgQ2xvc2VIYW5kbGUoSEFORExFMzIpOwpAQCAtNDkyNiwxMiArNDkzMywyMSBAQAogQk9PTDMyICAgICBDb3B5RmlsZTMyVyhMUENXU1RSLExQQ1dTVFIsQk9PTDMyKTsKICNkZWZpbmUgICAgQ29weUZpbGUgV0lORUxJQl9OQU1FX0FXKENvcHlGaWxlKQogSU5UMzIgICAgICBDb21wYXJlRmlsZVRpbWUoTFBGSUxFVElNRSxMUEZJTEVUSU1FKTsKK0hBTkRMRTMyICAgQ3JlYXRlRXZlbnQzMkEoTFBTRUNVUklUWV9BVFRSSUJVVEVTLEJPT0wzMixCT09MMzIsTFBDU1RSKTsKK0hBTkRMRTMyICAgQ3JlYXRlRXZlbnQzMlcoTFBTRUNVUklUWV9BVFRSSUJVVEVTLEJPT0wzMixCT09MMzIsTFBDV1NUUik7CisjZGVmaW5lICAgIENyZWF0ZUV2ZW50IFdJTkVMSUJfTkFNRV9BVyhDcmVhdGVFdmVudCkKIEhGSUxFMzIgICAgQ3JlYXRlRmlsZTMyQShMUENTVFIsRFdPUkQsRFdPUkQsTFBTRUNVUklUWV9BVFRSSUJVVEVTLERXT1JELERXT1JELEhBTkRMRTMyKTsKIEhGSUxFMzIgICAgQ3JlYXRlRmlsZTMyVyhMUENXU1RSLERXT1JELERXT1JELExQU0VDVVJJVFlfQVRUUklCVVRFUyxEV09SRCxEV09SRCxIQU5ETEUzMik7CiAjZGVmaW5lICAgIENyZWF0ZUZpbGUgV0lORUxJQl9OQU1FX0FXKENyZWF0ZUZpbGUpCiBIQU5ETEUzMiAgIENyZWF0ZUZpbGVNYXBwaW5nMzJBKEhBTkRMRTMyLExQU0VDVVJJVFlfQVRUUklCVVRFUyxEV09SRCxEV09SRCxEV09SRCxMUENTVFIpOwogSEFORExFMzIgICBDcmVhdGVGaWxlTWFwcGluZzMyVyhIQU5ETEUzMixMUFNFQ1VSSVRZX0FUVFJJQlVURVMsRFdPUkQsRFdPUkQsRFdPUkQsTFBDV1NUUik7CiAjZGVmaW5lICAgIENyZWF0ZUZpbGVNYXBwaW5nIFdJTkVMSUJfTkFNRV9BVyhDcmVhdGVGaWxlTWFwcGluZykKK0hBTkRMRTMyICAgQ3JlYXRlTXV0ZXgzMkEoTFBTRUNVUklUWV9BVFRSSUJVVEVTLEJPT0wzMixMUENTVFIpOworSEFORExFMzIgICBDcmVhdGVNdXRleDMyVyhMUFNFQ1VSSVRZX0FUVFJJQlVURVMsQk9PTDMyLExQQ1dTVFIpOworI2RlZmluZSAgICBDcmVhdGVNdXRleCBXSU5FTElCX05BTUVfQVcoQ3JlYXRlTXV0ZXgpCitIQU5ETEUzMiAgIENyZWF0ZVNlbWFwaG9yZTMyQShMUFNFQ1VSSVRZX0FUVFJJQlVURVMsTE9ORyxMT05HLExQQ1NUUik7CitIQU5ETEUzMiAgIENyZWF0ZVNlbWFwaG9yZTMyVyhMUFNFQ1VSSVRZX0FUVFJJQlVURVMsTE9ORyxMT05HLExQQ1dTVFIpOworI2RlZmluZSAgICBDcmVhdGVTZW1hcGhvcmUgV0lORUxJQl9OQU1FX0FXKENyZWF0ZVNlbWFwaG9yZSkKIEJPT0wzMiAgICAgRG9zRGF0ZVRpbWVUb0ZpbGVUaW1lKFdPUkQsV09SRCxMUEZJTEVUSU1FKTsKIElOVDMyICAgICAgRW51bVByb3BzRXgzMkEoSFdORDMyLFBST1BFTlVNUFJPQ0VYMzJBLExQQVJBTSk7CiBJTlQzMiAgICAgIEVudW1Qcm9wc0V4MzJXKEhXTkQzMixQUk9QRU5VTVBST0NFWDMyVyxMUEFSQU0pOwpAQCAtNTAyNCw2ICs1MDQwLDggQEAKIEJPT0wzMiAgICAgSXNXaW5kb3dVbmljb2RlKEhXTkQzMik7CiBCT09MMzIgICAgIElzVmFsaWRMb2NhbGUoRFdPUkQsRFdPUkQpOwogQk9PTDMyICAgICBMb2NhbEZpbGVUaW1lVG9GaWxlVGltZShjb25zdCBGSUxFVElNRSosTFBGSUxFVElNRSk7CitTRUdQVFIgICAgIE1hcExTKExQVk9JRCk7CitMUFZPSUQgICAgIE1hcFNMKFNFR1BUUik7CiBMUFZPSUQgICAgIE1hcFZpZXdPZkZpbGUoSEFORExFMzIsRFdPUkQsRFdPUkQsRFdPUkQsRFdPUkQpOwogTFBWT0lEICAgICBNYXBWaWV3T2ZGaWxlRXgoSEFORExFMzIsRFdPUkQsRFdPUkQsRFdPUkQsRFdPUkQsTFBWT0lEKTsKIElOVDMyICAgICAgTWVzc2FnZUJveEV4MzJBKEhXTkQzMixMUENTVFIsTFBDU1RSLFVJTlQzMixXT1JEKTsKQEAgLTUwMzIsOSArNTA1MCwxOCBAQAogQk9PTDMyICAgICBNb3ZlRmlsZTMyQShMUENTVFIsTFBDU1RSKTsKIEJPT0wzMiAgICAgTW92ZUZpbGUzMlcoTFBDV1NUUixMUENXU1RSKTsKICNkZWZpbmUgICAgTW92ZUZpbGUgV0lORUxJQl9OQU1FX0FXKE1vdmVGaWxlKQorSEFORExFMzIgICBPcGVuRXZlbnQzMkEoRFdPUkQsQk9PTDMyLExQQ1NUUik7CitIQU5ETEUzMiAgIE9wZW5FdmVudDMyVyhEV09SRCxCT09MMzIsTFBDV1NUUik7CisjZGVmaW5lICAgIE9wZW5FdmVudCBXSU5FTElCX05BTUVfQVcoT3BlbkV2ZW50KQogSEFORExFMzIgICBPcGVuRmlsZU1hcHBpbmczMkEoRFdPUkQsQk9PTDMyLExQQ1NUUik7CiBIQU5ETEUzMiAgIE9wZW5GaWxlTWFwcGluZzMyVyhEV09SRCxCT09MMzIsTFBDV1NUUik7CiAjZGVmaW5lICAgIE9wZW5GaWxlTWFwcGluZyBXSU5FTElCX05BTUVfQVcoT3BlbkZpbGVNYXBwaW5nKQorSEFORExFMzIgICBPcGVuTXV0ZXgzMkEoRFdPUkQsQk9PTDMyLExQQ1NUUik7CitIQU5ETEUzMiAgIE9wZW5NdXRleDMyVyhEV09SRCxCT09MMzIsTFBDV1NUUik7CisjZGVmaW5lICAgIE9wZW5NdXRleCBXSU5FTElCX05BTUVfQVcoT3Blbk11dGV4KQorSEFORExFMzIgICBPcGVuU2VtYXBob3JlMzJBKERXT1JELEJPT0wzMixMUENTVFIpOworSEFORExFMzIgICBPcGVuU2VtYXBob3JlMzJXKERXT1JELEJPT0wzMixMUENXU1RSKTsKKyNkZWZpbmUgICAgT3BlblNlbWFwaG9yZSBXSU5FTElCX05BTUVfQVcoT3BlblNlbWFwaG9yZSkKIERXT1JEICAgICAgUXVlcnlEb3NEZXZpY2UzMkEoTFBDU1RSLExQU1RSLERXT1JEKTsKIERXT1JEICAgICAgUXVlcnlEb3NEZXZpY2UzMlcoTFBDV1NUUixMUFdTVFIsRFdPUkQpOwogI2RlZmluZSAgICBRdWVyeURvc0RldmljZSBXSU5FTElCX05BTUVfQVcoUXVlcnlEb3NEZXZpY2UpCkBAIC01MDU5LDYgKzUwODYsNyBAQAogRFdPUkQgICAgICBSZWdRdWVyeUluZm9LZXkzMkEoSEtFWSxMUFNUUixMUERXT1JELExQRFdPUkQsTFBEV09SRCxMUERXT1JELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQsTFBEV09SRCxMUERXT1JELExQRFdPUkQsTFBEV09SRCxMUEZJTEVUSU1FKTsKICNkZWZpbmUgICAgUmVnUXVlcnlJbmZvS2V5IFdJTkVMSUJfTkFNRV9BVyhSZWdRdWVyeUluZm9LZXkpCitCT09MMzIgICAgIFJlbGVhc2VTZW1hcGhvcmUoSEFORExFMzIsTE9ORyxMUExPTkcpOwogVk9JRCAgICAgICBSdGxGaWxsTWVtb3J5KExQVk9JRCxVSU5UMzIsVUlOVDMyKTsKIFZPSUQgICAgICAgUnRsTW92ZU1lbW9yeShMUFZPSUQsTFBDVk9JRCxVSU5UMzIpOwogVk9JRCAgICAgICBSdGxaZXJvTWVtb3J5KExQVk9JRCxVSU5UMzIpOwpAQCAtNTA5MSw2ICs1MTE5LDcgQEAKIEJPT0wzMiAgICAgVGxzRnJlZShEV09SRCk7CiBMUFZPSUQgICAgIFRsc0dldFZhbHVlKERXT1JEKTsKIEJPT0wzMiAgICAgVGxzU2V0VmFsdWUoRFdPUkQsTFBWT0lEKTsKK1ZPSUQgICAgICAgVW5NYXBMUyhTRUdQVFIpOwogQk9PTDMyICAgICBVbm1hcFZpZXdPZkZpbGUoTFBWT0lEKTsKIExQVk9JRCAgICAgVmlydHVhbEFsbG9jKExQVk9JRCxEV09SRCxEV09SRCxEV09SRCk7CiBCT09MMzIgICAgIFZpcnR1YWxGcmVlKExQVk9JRCxEV09SRCxEV09SRCk7CkBAIC02NDc0LDYgKzY1MDMsOSBAQAogSEdMT0JBTDE2ICBMb2NrU2VnbWVudDE2KEhHTE9CQUwxNik7CiAjZGVmaW5lICAgIExvY2tTZWdtZW50MzIoaGFuZGxlKSBHbG9iYWxGaXgzMigoSEFORExFMzIpKGhhbmRsZSkpCiAjZGVmaW5lICAgIExvY2tTZWdtZW50IFdJTkVMSUJfTkFNRShMb2NrU2VnbWVudCkKK0JPT0wxNiAgICAgTG9ja1dpbmRvd1VwZGF0ZTE2KEhXTkQxNik7CitCT09MMzIgICAgIExvY2tXaW5kb3dVcGRhdGUzMihIV05EMzIpOworI2RlZmluZSAgICBMb2NrV2luZG93VXBkYXRlIFdJTkVMSUJfTkFNRShMb2NrV2luZG93VXBkYXRlKQogQk9PTDE2ICAgICBMUHRvRFAxNihIREMxNixMUFBPSU5UMTYsSU5UMTYpOwogQk9PTDMyICAgICBMUHRvRFAzMihIREMzMixMUFBPSU5UMzIsSU5UMzIpOwogI2RlZmluZSAgICBMUHRvRFAgV0lORUxJQl9OQU1FKExQdG9EUCkKQEAgLTcwNTEsNiArNzA4Myw5IEBACiBCT09MMTYgICAgIFN3YXBNb3VzZUJ1dHRvbjE2KEJPT0wxNik7CiBCT09MMzIgICAgIFN3YXBNb3VzZUJ1dHRvbjMyKEJPT0wzMik7CiAjZGVmaW5lICAgIFN3YXBNb3VzZUJ1dHRvbiBXSU5FTElCX05BTUUoU3dhcE1vdXNlQnV0dG9uKQorVk9JRCAgICAgICBTd2l0Y2hUb1RoaXNXaW5kb3cxNihIV05EMTYsQk9PTDE2KTsKK1ZPSUQgICAgICAgU3dpdGNoVG9UaGlzV2luZG93MzIoSFdORDMyLEJPT0wzMik7CisjZGVmaW5lICAgIFN3aXRjaFRvVGhpc1dpbmRvdyBXSU5FTElCX05BTUUoU3dpdGNoVG9UaGlzV2luZG93KQogSU5UMTYgICAgICBTeW5jQWxsVm9pY2VzMTYodm9pZCk7CiBEV09SRCAgICAgIFN5bmNBbGxWb2ljZXMzMih2b2lkKTsKICNkZWZpbmUgICAgU3luY0FsbFZvaWNlcyBXSU5FTElCX05BTUUoU3luY0FsbFZvaWNlcykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2lucHJvYy5oIGIvaW5jbHVkZS93aW5wcm9jLmgKaW5kZXggMWE1YmExMS4uN2ExYzY5NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5wcm9jLmgKKysrIGIvaW5jbHVkZS93aW5wcm9jLmgKQEAgLTE3LDEzICsxNywyMCBAQAogICAgIFdJTl9QUk9DXzMyVwogfSBXSU5ET1dQUk9DVFlQRTsKIAordHlwZWRlZiBlbnVtCit7CisgICAgV0lOX1BST0NfQ0xBU1MsCisgICAgV0lOX1BST0NfV0lORE9XLAorICAgIFdJTl9QUk9DX1RJTUVSCit9IFdJTkRPV1BST0NVU0VSOworCiB0eXBlZGVmIHZvaWQgKkhXSU5ET1dQUk9DOyAgLyogUmVhbGx5IGEgcG9pbnRlciB0byBhIFdJTkRPV1BST0MgKi8KIAogZXh0ZXJuIEJPT0wzMiBXSU5QUk9DX0luaXQodm9pZCk7CiBleHRlcm4gV05EUFJPQzE2IFdJTlBST0NfR2V0UHJvYyggSFdJTkRPV1BST0MgcHJvYywgV0lORE9XUFJPQ1RZUEUgdHlwZSApOwogZXh0ZXJuIEJPT0wzMiBXSU5QUk9DX1NldFByb2MoIEhXSU5ET1dQUk9DICpwRmlyc3QsIFdORFBST0MxNiBmdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkRPV1BST0NUWVBFIHR5cGUgKTsKLWV4dGVybiB2b2lkIFdJTlBST0NfRnJlZVByb2MoIEhXSU5ET1dQUk9DIHByb2MgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5ET1dQUk9DVFlQRSB0eXBlLCBXSU5ET1dQUk9DVVNFUiB1c2VyICk7CitleHRlcm4gdm9pZCBXSU5QUk9DX0ZyZWVQcm9jKCBIV0lORE9XUFJPQyBwcm9jLCBXSU5ET1dQUk9DVVNFUiB1c2VyICk7CiBleHRlcm4gV0lORE9XUFJPQ1RZUEUgV0lOUFJPQ19HZXRQcm9jVHlwZSggSFdJTkRPV1BST0MgcHJvYyApOwogCiBleHRlcm4gSU5UMzIgV0lOUFJPQ19NYXBNc2czMkFUbzMyVyggVUlOVDMyIG1zZywgV1BBUkFNMzIgd1BhcmFtLApAQCAtNTEsOCArNTgsOCBAQAogZXh0ZXJuIHZvaWQgV0lOUFJPQ19Vbm1hcE1zZzE2VG8zMlcoIFVJTlQzMiBtc2csIFdQQVJBTTMyIHdQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtICk7CiBleHRlcm4gdm9pZCBXSU5QUk9DX1VubWFwTXNnMzJBVG8xNiggVUlOVDMyIG1zZywgV1BBUkFNMTYgd1BhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtLCBMUkVTVUxUIGxSZXN1bHQgKTsKIGV4dGVybiB2b2lkIFdJTlBST0NfVW5tYXBNc2czMldUbzE2KCBVSU5UMzIgbXNnLCBXUEFSQU0xNiB3UGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0sIExSRVNVTFQgbFJlc3VsdCApOwogCiAjZW5kaWYgIC8qIF9fV0lORV9XSU5QUk9DX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUveDExZHJ2LmggYi9pbmNsdWRlL3gxMWRydi5oCmluZGV4IGEwODgzMWUuLjI2MzM2YzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveDExZHJ2LmgKKysrIGIvaW5jbHVkZS94MTFkcnYuaApAQCAtNTMsNiArNTMsOCBAQAogZXh0ZXJuIEJPT0wzMiBYMTFEUlZfQml0Qmx0KCBzdHJ1Y3QgdGFnREMgKmRjRHN0LCBJTlQzMiB4RHN0LCBJTlQzMiB5RHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiB3aWR0aCwgSU5UMzIgaGVpZ2h0LCBzdHJ1Y3QgdGFnREMgKmRjU3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiB4U3JjLCBJTlQzMiB5U3JjLCBEV09SRCByb3AgKTsKK2V4dGVybiBCT09MMzIgWDExRFJWX0dldENoYXJXaWR0aCggc3RydWN0IHRhZ0RDICpkYywgVUlOVDMyIGZpcnN0Q2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGxhc3RDaGFyLCBMUElOVDMyIGJ1ZmZlciApOwogZXh0ZXJuIEJPT0wzMiBYMTFEUlZfR2V0VGV4dEV4dGVudFBvaW50KCBzdHJ1Y3QgdGFnREMgKmRjLCBMUENTVFIgc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBjb3VudCwgTFBTSVpFMzIgc2l6ZSApOwogZXh0ZXJuIEJPT0wzMiBYMTFEUlZfR2V0VGV4dE1ldHJpY3Moc3RydWN0IHRhZ0RDICpkYywgVEVYVE1FVFJJQzMyQSAqbWV0cmljcyk7CmRpZmYgLS1naXQgYS9saWJyYXJ5L21pc2NzdHVicy5jIGIvbGlicmFyeS9taXNjc3R1YnMuYwppbmRleCAwYjAyMWRhLi42OTNmYmNjIDEwMDY0NAotLS0gYS9saWJyYXJ5L21pc2NzdHVicy5jCisrKyBiL2xpYnJhcnkvbWlzY3N0dWJzLmMKQEAgLTQ2LDggKzQ2LDYgQEAKIH0KIAogZXh0ZXJuIExSRVNVTFQgQ29sb3JEbGdQcm9jKEhXTkQxNixVSU5UMTYsV1BBUkFNMTYsTFBBUkFNKTsKLWV4dGVybiBMUkVTVUxUIENvbWJvQm94V25kUHJvYyhIV05EMTYsVUlOVDE2LFdQQVJBTTE2LExQQVJBTSk7Ci1leHRlcm4gTFJFU1VMVCBDb21ib0xCb3hXbmRQcm9jKEhXTkQxNixVSU5UMTYsV1BBUkFNMTYsTFBBUkFNKTsKIGV4dGVybiBMUkVTVUxUIEZpbGVPcGVuRGxnUHJvYyhIV05EMTYsVUlOVDE2LFdQQVJBTTE2LExQQVJBTSk7CiBleHRlcm4gTFJFU1VMVCBGaWxlU2F2ZURsZ1Byb2MoSFdORDE2LFVJTlQxNixXUEFSQU0xNixMUEFSQU0pOwogZXh0ZXJuIExSRVNVTFQgRmluZFRleHREbGdQcm9jKEhXTkQxNixVSU5UMTYsV1BBUkFNMTYsTFBBUkFNKTsKQEAgLTY4LDggKzY2LDYgQEAKIHsKICNkZWZpbmUgTUFQX1NUUl9UT19QUk9DKHN0cixwcm9jKSBpZighc3RyY21wKG5hbWUsc3RyKSlyZXR1cm4gKEZBUlBST0MxNilwcm9jCiAgIE1BUF9TVFJfVE9fUFJPQygiQ29sb3JEbGdQcm9jIixDb2xvckRsZ1Byb2MpOwotICBNQVBfU1RSX1RPX1BST0MoIkNvbWJvQm94V25kUHJvYyIsQ29tYm9Cb3hXbmRQcm9jKTsKLSAgTUFQX1NUUl9UT19QUk9DKCJDb21ib0xCb3hXbmRQcm9jIixDb21ib0xCb3hXbmRQcm9jKTsKICAgTUFQX1NUUl9UT19QUk9DKCJGaWxlT3BlbkRsZ1Byb2MiLEZpbGVPcGVuRGxnUHJvYyk7CiAgIE1BUF9TVFJfVE9fUFJPQygiRmlsZVNhdmVEbGdQcm9jIixGaWxlU2F2ZURsZ1Byb2MpOwogICBNQVBfU1RSX1RPX1BST0MoIkZpbmRUZXh0RGxnUHJvYyIsRmluZFRleHREbGdQcm9jKTsKZGlmZiAtLWdpdCBhL2xvYWRlci9uZV9pbWFnZS5jIGIvbG9hZGVyL25lX2ltYWdlLmMKaW5kZXggZjgxY2Y4Mi4uMDg4N2E1MyAxMDA2NDQKLS0tIGEvbG9hZGVyL25lX2ltYWdlLmMKKysrIGIvbG9hZGVyL25lX2ltYWdlLmMKQEAgLTYwLDcgKzYwLDkgQEAKICAgICBkcHJpbnRmX21vZHVsZSggc3RkZGViLCAiTG9hZGluZyBzZWdtZW50ICVkLCBzZWxlY3Rvcj0lMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICBzZWdudW0sIHBTZWctPnNlbGVjdG9yICk7CiAgICAgbHNlZWsoIGZkLCBwU2VnLT5maWxlcG9zIDw8IHBNb2R1bGUtPmFsaWdubWVudCwgU0VFS19TRVQgKTsKLSAgICBzaXplID0gcFNlZy0+c2l6ZSA/IHBTZWctPnNpemUgOiAweDEwMDAwOworICAgIGlmIChwU2VnLT5zaXplKSBzaXplID0gcFNlZy0+c2l6ZTsKKyAgICBlbHNlIGlmIChwU2VnLT5taW5zaXplKSBzaXplID0gcFNlZy0+bWluc2l6ZTsKKyAgICBlbHNlIHNpemUgPSAweDEwMDAwOwogICAgIG1lbSA9IEdsb2JhbExvY2sxNihwU2VnLT5zZWxlY3Rvcik7CiAgICAgaWYgKHBNb2R1bGUtPmZsYWdzICYgTkVfRkZMQUdTX1NFTEZMT0FEICYmIHNlZ251bSA+IDEpCiAgICAgewpAQCAtMjM2LDcgKzIzOCw3IEBACiAJICAgIGJyZWFrOwogCSAgICAKIAkgIGNhc2UgTkVfUkVMVFlQRV9JTlRFUk5BTDoKLQkgICAgaWYgKHJlcC0+dGFyZ2V0MSA9PSAweDAwZmYpCisJICAgIGlmICgocmVwLT50YXJnZXQxICYgMHhmZikgPT0gMHhmZikKIAkgICAgewogCQlhZGRyZXNzICA9IE1PRFVMRV9HZXRFbnRyeVBvaW50KCBoTW9kdWxlLCByZXAtPnRhcmdldDIgKTsKIAkgICAgfQpkaWZmIC0tZ2l0IGEvbG9hZGVyL3BlX2ltYWdlLmMgYi9sb2FkZXIvcGVfaW1hZ2UuYwppbmRleCAyNGNmM2U5Li5lZmNkYTdmIDEwMDY0NAotLS0gYS9sb2FkZXIvcGVfaW1hZ2UuYworKysgYi9sb2FkZXIvcGVfaW1hZ2UuYwpAQCAtMzIsNiArMzIsOSBAQAogI2luY2x1ZGUgImRlYnVnZ2VyLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgogCitzdGF0aWMgdm9pZCBQRV9Jbml0RExMKEhNT0RVTEUxNiBoTW9kdWxlLCBEV09SRCB0eXBlLCBMUFZPSUQgbHBSZXNlcnZlZCk7CisKKwogLyogY29udmVydCBQRSBpbWFnZSBWaXJ0dWFsQWRkcmVzcyB0byBSZWFsIEFkZHJlc3MgKi8KICNkZWZpbmUgUlZBKHgpICgodW5zaWduZWQgaW50KWxvYWRfYWRkcisodW5zaWduZWQgaW50KSh4KSkKIApAQCAtNDA2LDggKzQwOSw3IEBACiAJbG9hZF9hZGRyID0gcGUtPmxvYWRfYWRkciA9IChpbnQpeG1hbGxvYyhwZS0+dm1hX3NpemUpOwogCW1lbXNldCggbG9hZF9hZGRyLCAwLCBwZS0+dm1hX3NpemUpOwogI2Vsc2UKLQlsb2FkX2FkZHIgPSAoaW50KSBWaXJ0dWFsQWxsb2MoIE5VTEwsIHBlLT52bWFfc2l6ZSwgTUVNX0NPTU1JVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRV9FWEVDVVRFX1JFQURXUklURSApOworCWxvYWRfYWRkciA9IChpbnQpIFZpcnR1YWxBbGxvYyggKHZvaWQqKXBlLT5iYXNlX2FkZHIsIHBlLT52bWFfc2l6ZSwgTUVNX1JFU0VSVkV8TUVNX0NPTU1JVCwgUEFHRV9FWEVDVVRFX1JFQURXUklURSApOwogICAgICAgICBwZS0+bG9hZF9hZGRyID0gbG9hZF9hZGRyOwogI2VuZGlmCiAKQEAgLTYwMSw3ICs2MDMsMTIgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHZvaWQgUEVfSW5pdERMTChITU9EVUxFMTYgaE1vZHVsZSkKKy8qIENhbGxlZCBpZiB0aGUgbGlicmFyeSBpcyBsb2FkZWQgb3IgZnJlZWQuCisgKiBOT1RFOiBpZiBhIHRocmVhZCBhdHRhY2hlcyBhIERMTCwgdGhlIGN1cnJlbnQgdGhyZWFkIHdpbGwgb25seSBkbworICogRExMX1BST0NFU1NfQVRUQUNILiBPbmx5IG5ldyBjcmVhdGVkIHRocmVhZHMgZG8gRExMX1RIUkVBRF9BVFRBQ0gKKyAqIChTREspCisgKi8KK3N0YXRpYyB2b2lkIFBFX0luaXRETEwoSE1PRFVMRTE2IGhNb2R1bGUsIERXT1JEIHR5cGUsTFBWT0lEIGxwUmVzZXJ2ZWQpCiB7CiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwogICAgIFBFX01PRFVMRSAqcGU7CkBAIC02MTIsOCArNjE5LDExIEBACiAgICAgaWYgKCEocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfV0lOMzIpIHx8ICEocGUgPSBwTW9kdWxlLT5wZV9tb2R1bGUpKQogICAgICAgICByZXR1cm47CiAKLSAgICAvKiBGSVhNRTogV2hhdCBpcyB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgcGFyYW1ldGVyIDM/IAotICAgICAqCSAgICAgICh0aGUgTVNETiBsaWJyYXJ5IEpBTjk2IHNheXMgJ3Jlc2VydmVkIGZvciBmdXR1cmUgdXNlJykKKyAgICAvKiAgRExMX0FUVEFDSF9QUk9DRVNTOgorICAgICAqCQlscHJlc2VydmVkIGlzIE5VTEwgZm9yIGR5bmFtaWMgbG9hZHMsIG5vdC1OVUxMIGZvciBzdGF0aWMgbG9hZHMKKyAgICAgKiAgRExMX0RFVEFDSF9QUk9DRVNTOgorICAgICAqCQlscHJlc2VydmVkIGlzIE5VTEwgaWYgY2FsbGVkIGJ5IEZyZWVMaWJyYXJ5LCBub3QtTlVMTCBvdGhlcndpc2UKKyAgICAgKiAgdGhlIFNESyBkb2Vzbid0IG1lbnRpb24gYW55dGhpbmcgZm9yIERMTF9USFJFQURfKgogICAgICAqLwogICAgICAgICAKICAgICAvKiBJcyB0aGlzIGEgbGlicmFyeT8gQW5kIGhhcyBpdCBnb3QgYW4gZW50cnlwb2ludD8gKi8KQEAgLTYyNSwxMyArNjM1LDEzIEBACiAJQ2FsbERMTEVudHJ5UHJvYzMyKCAKIAkgICAgKEZBUlBST0MzMilSVkEocGUtPnBlX2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuQWRkcmVzc09mRW50cnlQb2ludCksCiAJICAgIGhNb2R1bGUsCi0JICAgIERMTF9QUk9DRVNTX0FUVEFDSCwKLQkgICAgLTEKKwkgICAgdHlwZSwKKwkgICAgKERXT1JEKWxwUmVzZXJ2ZWQKIAkpOwogICAgIH0KIH0KIAotdm9pZCBQRV9Jbml0aWFsaXplRExMcyhITU9EVUxFMTYgaE1vZHVsZSkKK3ZvaWQgUEVfSW5pdGlhbGl6ZURMTHMoSE1PRFVMRTE2IGhNb2R1bGUsRFdPUkQgdHlwZSxMUFZPSUQgbHBSZXNlcnZlZCkKIHsKIAlORV9NT0RVTEUgKnBNb2R1bGU7CiAJSE1PRFVMRTE2ICpwRExMOwpAQCAtNjQwLDE0ICs2NTAsMTUgQEAKIAl7CiAJCUhHTE9CQUwxNiB0b19pbml0ID0gcE1vZHVsZS0+ZGxsc190b19pbml0OwogCQlwTW9kdWxlLT5kbGxzX3RvX2luaXQgPSAwOworCQogCQlmb3IgKHBETEwgPSAoSE1PRFVMRTE2ICopR2xvYmFsTG9jazE2KCB0b19pbml0ICk7ICpwRExMOyBwRExMKyspCiAJCXsKLQkJCVBFX0luaXRpYWxpemVETExzKCAqcERMTCApOwotCQkJUEVfSW5pdERMTCggKnBETEwgKTsKKwkJCVBFX0luaXRpYWxpemVETExzKCAqcERMTCwgdHlwZSwgbHBSZXNlcnZlZCk7CisJCQlQRV9Jbml0RExMKCAqcERMTCwgdHlwZSwgbHBSZXNlcnZlZCApOwogCQl9CiAJCUdsb2JhbEZyZWUxNiggdG9faW5pdCApOwogCX0KLQlQRV9Jbml0RExMKCBoTW9kdWxlICk7CisJUEVfSW5pdERMTCggaE1vZHVsZSwgdHlwZSwgbHBSZXNlcnZlZCApOwogfQogCiB2b2lkIFBFX0luaXRUbHMoIFBFX01PRFVMRSAqbW9kdWxlICkKZGlmZiAtLWdpdCBhL2xvYWRlci9zaWduYWwuYyBiL2xvYWRlci9zaWduYWwuYwppbmRleCAxNzczOWVjLi5mZDIyMDNmIDEwMDY0NAotLS0gYS9sb2FkZXIvc2lnbmFsLmMKKysrIGIvbG9hZGVyL3NpZ25hbC5jCkBAIC0xLDcgKzEsMTEgQEAKICNpZm5kZWYgV0lORUxJQgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaWZkZWYgX19HTElCQ19fCisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjZWxzZQogI2luY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDx0aW1lLmg+CmRpZmYgLS1naXQgYS9sb2FkZXIvdGFzay5jIGIvbG9hZGVyL3Rhc2suYwppbmRleCAzOGU2MDI4Li45ODk1ZjkzIDEwMDY0NAotLS0gYS9sb2FkZXIvdGFzay5jCisrKyBiL2xvYWRlci90YXNrLmMKQEAgLTM2NSw3ICszNjUsNyBAQAogICAgICAgICBJbml0VGFzayggTlVMTCApOwogICAgICAgICBJbml0QXBwKCBwVGFzay0+aE1vZHVsZSApOwogICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92dyAldzAsJSVmcyI6OiJyIiAocEN1cnJlbnRUaHJlYWQtPnRlYl9zZWwpKTsKLSAgICAgICAgUEVfSW5pdGlhbGl6ZURMTHMoIHBUYXNrLT5oTW9kdWxlICk7CisgICAgICAgIFBFX0luaXRpYWxpemVETExzKCBwVGFzay0+aE1vZHVsZSwgRExMX1BST0NFU1NfQVRUQUNILCAoTFBWT0lEKS0xICk7CiAgICAgICAgIGV4aXRfY29kZSA9IENhbGxUYXNrU3RhcnQzMigoRkFSUFJPQzMyKShwTW9kdWxlLT5wZV9tb2R1bGUtPmxvYWRfYWRkciArIAogICAgICAgICAgICAgICAgIHBNb2R1bGUtPnBlX21vZHVsZS0+cGVfaGVhZGVyLT5PcHRpb25hbEhlYWRlci5BZGRyZXNzT2ZFbnRyeVBvaW50KSApOwogICAgICAgICBUQVNLX0tpbGxDdXJyZW50VGFzayggZXhpdF9jb2RlICk7CmRpZmYgLS1naXQgYS9tZW1vcnkvZ2xvYmFsLmMgYi9tZW1vcnkvZ2xvYmFsLmMKaW5kZXggMWE1YzEyZS4uZjVkN2QxOCAxMDA2NDQKLS0tIGEvbWVtb3J5L2dsb2JhbC5jCisrKyBiL21lbW9yeS9nbG9iYWwuYwpAQCAtNzk0LDcgKzc5NCwxMSBAQAogewogICAgIE1FTU9SWVNUQVRVUyBzdGF0dXM7CiAKLSAgICBpZiAoaW5mby0+ZHdTaXplIDwgc2l6ZW9mKE1FTU1BTklORk8pKSByZXR1cm4gRkFMU0U7CisgICAgLyoKKyAgICAgKiBOb3QgdW5zdXJwcmlzaW5nbHkgYWx0aG91Z2ggdGhlIGRvY3VtZW50aW9uIHNheXMgeW91IAorICAgICAqIF9tdXN0XyBwcm92aWRlIHRoZSBzaXplIGluIHRoZSBkd1NpemUgZmllbGQsIHRoaXMgZnVuY3Rpb24KKyAgICAgKiAodW5kZXIgV2luZG93cykgYWx3YXlzIGZpbGxzIHRoZSBzdHJ1Y3R1cmUgYW5kIHJldHVybnMgdHJ1ZS4KKyAgICAgKi8KICAgICBHbG9iYWxNZW1vcnlTdGF0dXMoICZzdGF0dXMgKTsKICNpZmRlZiBfX3N2cjRfXwogICAgIGluZm8tPndQYWdlU2l6ZSAgICAgICAgICAgID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOwpkaWZmIC0tZ2l0IGEvbWVtb3J5L3NlbGVjdG9yLmMgYi9tZW1vcnkvc2VsZWN0b3IuYwppbmRleCAxZGEwNzY4Li5iM2YyNDU0IDEwMDY0NAotLS0gYS9tZW1vcnkvc2VsZWN0b3IuYworKysgYi9tZW1vcnkvc2VsZWN0b3IuYwpAQCAtNDYyLDMgKzQ2Miw0MyBAQAogICAgIG1lbWNweSggKChjaGFyICopR0VUX1NFTF9CQVNFKHNlbCkpICsgb2Zmc2V0LCBidWZmZXIsIGNvdW50ICk7CiAgICAgcmV0dXJuIGNvdW50OwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBXaW45NSBwb2ludGVyIG1hcHBpbmcgZnVuY3Rpb25zICoKKyAqCisgKiBOT1RFOiBNYXBTTEZpeCBhbmQgVW5NYXBTTEZpeEFycmF5IGFyZSBwcm9iYWJseSBuZWVkZWQgdG8gcHJldmVudAorICogdW5leHBlY3RlZCBsaW5lYXIgYWRkcmVzcyBjaGFuZ2Ugd2hlbiBHbG9iYWxDb21wYWN0KCkgc2h1ZmZsZXMKKyAqIG1vdmVhYmxlIGJsb2Nrcy4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBNYXBTTCAgIChLRVJORUwzMi42NjIpCisgKgorICogTWFwcyBmaXhlZCBzZWdtZW50ZWQgcG9pbnRlciB0byBsaW5lYXIuCisgKi8KK0xQVk9JRCBNYXBTTCggU0VHUFRSIHNwdHIgKQoreworICAgIHJldHVybiAoTFBWT0lEKVBUUl9TRUdfVE9fTElOKHNwdHIpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE1hcExTICAgKEtFUk5FTDMyLjY3OSkKKyAqCisgKiBNYXBzIGxpbmVhciBwb2ludGVyIHRvIHNlZ21lbnRlZC4KKyAqLworU0VHUFRSIE1hcExTKCBMUFZPSUQgcHRyICkKK3sKKyAgICBXT1JEIHNlbCA9IFNFTEVDVE9SX0FsbG9jQmxvY2soIHB0ciwgMHgxMDAwMCwgU0VHTUVOVF9EQVRBLCBGQUxTRSwgRkFMU0UgKTsKKyAgICByZXR1cm4gUFRSX1NFR19PRkZfVE9fU0VHUFRSKCBzZWwsIDAgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBVbk1hcExTICAgKEtFUk5FTDMyLjY4MCkKKyAqCisgKiBGcmVlIG1hcHBlZCBzZWxlY3Rvci4KKyAqLwordm9pZCBVbk1hcExTKCBTRUdQVFIgc3B0ciApCit7CisgICAgaWYgKCFfX3dpbmVsaWIpIFNFTEVDVE9SX0ZyZWVCbG9jayggU0VMRUNUT1JPRihzcHRyKSwgMSApOworfQpkaWZmIC0tZ2l0IGEvbWVtb3J5L3ZpcnR1YWwuYyBiL21lbW9yeS92aXJ0dWFsLmMKaW5kZXggMGNjMzk3YS4uMzYyZmQzNiAxMDA2NDQKLS0tIGEvbWVtb3J5L3ZpcnR1YWwuYworKysgYi9tZW1vcnkvdmlydHVhbC5jCkBAIC04NzQsNiArODc0LDggQEAKICAgICB9CiAKICAgICBpZiAoIShtYXBwaW5nID0gSGVhcEFsbG9jKCBTeXN0ZW1IZWFwLCAwLCBzaXplb2YoKm1hcHBpbmcpICkpKSBnb3RvIGVycm9yOworICAgIG1hcHBpbmctPmhlYWRlci50eXBlID0gSzMyT0JKX01FTV9NQVBQRURfRklMRTsKKyAgICBtYXBwaW5nLT5oZWFkZXIucmVmY291bnQgPSAxOwogICAgIG1hcHBpbmctPnByb3RlY3QgICA9IFZJUlRVQUxfR2V0UHJvdCggcHJvdGVjdCApIHwgVlBST1RfQ09NTUlUVEVEOwogICAgIG1hcHBpbmctPnNpemVfaGlnaCA9IHNpemVfaGlnaDsKICAgICBtYXBwaW5nLT5zaXplX2xvdyAgPSBzaXplX2xvdzsKZGlmZiAtLWdpdCBhL21pc2MvY2xpcGJvYXJkLmMgYi9taXNjL2NsaXBib2FyZC5jCmluZGV4IDkyODJhNDQuLmQ0ZTkyNzYgMTAwNjQ0Ci0tLSBhL21pc2MvY2xpcGJvYXJkLmMKKysrIGIvbWlzYy9jbGlwYm9hcmQuYwpAQCAtNzUsNyArNzUsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgICAgICAgICBDTElQQk9BUkRfQ2hlY2tTZWxlY3Rpb24KICAqLwotdm9pZCBDTElQQk9BUkRfQ2hlY2tTZWxlY3Rpb24oV05EKiBwV25kKQorc3RhdGljIHZvaWQgQ0xJUEJPQVJEX0NoZWNrU2VsZWN0aW9uKFdORCogcFduZCkKIHsKICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJcdGNoZWNraW5nICUwOHhcbiIsICh1bnNpZ25lZClwV25kLT53aW5kb3cpOwogCkBAIC0xNDEsNyArMTQxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQlDTElQQk9BUkRfRGVsZXRlUmVjb3JkCiAgKi8KLXZvaWQgQ0xJUEJPQVJEX0RlbGV0ZVJlY29yZChMUENMSVBGT1JNQVQgbHBGb3JtYXQpCitzdGF0aWMgdm9pZCBDTElQQk9BUkRfRGVsZXRlUmVjb3JkKExQQ0xJUEZPUk1BVCBscEZvcm1hdCwgQk9PTDMyIGJDaGFuZ2UpCiB7CiAgIGlmKCBscEZvcm1hdC0+d0Zvcm1hdElEID49IENGX0dESU9CSkZJUlNUICYmCiAgICAgICBscEZvcm1hdC0+d0Zvcm1hdElEIDw9IENGX0dESU9CSkxBU1QgKQpAQCAtMTUyLDEzICsxNTIsMTMgQEAKICAgbHBGb3JtYXQtPndEYXRhUHJlc2VudCA9IDA7IAogICBscEZvcm1hdC0+aERhdGEgPSAwOwogCi0gIGJDbGlwQ2hhbmdlZCA9IFRSVUU7CisgIGlmKCBiQ2hhbmdlICkgYkNsaXBDaGFuZ2VkID0gVFJVRTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCUNMSVBCT0FSRF9SZXF1ZXN0WFNlbGVjdGlvbgogICovCi1CT09MMzIgQ0xJUEJPQVJEX1JlcXVlc3RYU2VsZWN0aW9uKCkKK3N0YXRpYyBCT09MMzIgQ0xJUEJPQVJEX1JlcXVlc3RYU2VsZWN0aW9uKCkKIHsKICAgSFdORDMyIGhXbmQgPSAoaFduZENsaXBXaW5kb3cpID8gaFduZENsaXBXaW5kb3cgOiBHZXRBY3RpdmVXaW5kb3czMigpOwogCkBAIC0yOTEsNyArMjkxLDcgQEAKICAgICB3aGlsZShscEZvcm1hdCkgCiAgICAgICB7CiAJaWYgKCBscEZvcm1hdC0+d0RhdGFQcmVzZW50IHx8IGxwRm9ybWF0LT5oRGF0YSApCi0JICAgICBDTElQQk9BUkRfRGVsZXRlUmVjb3JkKCBscEZvcm1hdCApOworCSAgICAgQ0xJUEJPQVJEX0RlbGV0ZVJlY29yZCggbHBGb3JtYXQsIFRSVUUgKTsKIAogCWxwRm9ybWF0ID0gbHBGb3JtYXQtPk5leHRGb3JtYXQ7CiAgICAgICB9CkBAIC0zNjgsMTYgKzM2OCwxNiBAQAogCiAgICAgaWYgKCBscEZvcm1hdC0+d0RhdGFQcmVzZW50IHx8IGxwRm9ybWF0LT5oRGF0YSApIAogICAgIHsKLQlDTElQQk9BUkRfRGVsZXRlUmVjb3JkKGxwRm9ybWF0KTsKKwlDTElQQk9BUkRfRGVsZXRlUmVjb3JkKGxwRm9ybWF0LCBUUlVFKTsKIAogCS8qIGRlbGV0ZSBleGlzdGluZyBDRl9URVhUL0NGX09FTVRFWFQgYWxpYXNlcyAqLwogCiAJaWYoIHdGb3JtYXQgPT0gQ0ZfVEVYVCAmJiBDbGlwRm9ybWF0c1tDRl9PRU1URVhULTFdLmhEYXRhCiAJICAgICYmICFDbGlwRm9ybWF0c1tDRl9PRU1URVhULTFdLndEYXRhUHJlc2VudCApCi0JICAgIENMSVBCT0FSRF9EZWxldGVSZWNvcmQoJkNsaXBGb3JtYXRzW0NGX09FTVRFWFQtMV0pOworCSAgICBDTElQQk9BUkRfRGVsZXRlUmVjb3JkKCZDbGlwRm9ybWF0c1tDRl9PRU1URVhULTFdLCBUUlVFKTsKICAgICAgICAgaWYoIHdGb3JtYXQgPT0gQ0ZfT0VNVEVYVCAmJiBDbGlwRm9ybWF0c1tDRl9URVhULTFdLmhEYXRhCiAJICAgICYmICFDbGlwRm9ybWF0c1tDRl9URVhULTFdLndEYXRhUHJlc2VudCApCi0JICAgIENMSVBCT0FSRF9EZWxldGVSZWNvcmQoJkNsaXBGb3JtYXRzW0NGX1RFWFQtMV0pOworCSAgICBDTElQQk9BUkRfRGVsZXRlUmVjb3JkKCZDbGlwRm9ybWF0c1tDRl9URVhULTFdLCBUUlVFKTsKICAgICB9CiAKICAgICBiQ2xpcENoYW5nZWQgPSBUUlVFOwpAQCAtNDAxLDcgKzQwMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgICAgICAgIENMSVBCT0FSRF9SZW5kZXJGb3JtYXQKICAqLwotQk9PTDMyIENMSVBCT0FSRF9SZW5kZXJGb3JtYXQoTFBDTElQRk9STUFUIGxwRm9ybWF0KQorc3RhdGljIEJPT0wzMiBDTElQQk9BUkRfUmVuZGVyRm9ybWF0KExQQ0xJUEZPUk1BVCBscEZvcm1hdCkKIHsKICBpZiggbHBGb3JtYXQtPndEYXRhUHJlc2VudCAmJiAhbHBGb3JtYXQtPmhEYXRhICkKICAgIGlmKCBJc1dpbmRvdzMyKGhXbmRDbGlwT3duZXIpICkKQEAgLTQyMCw3ICs0MjAsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgICAgICAgICBDTElQQk9BUkRfUmVuZGVyVGV4dAogICovCi1CT09MMzIgQ0xJUEJPQVJEX1JlbmRlclRleHQoTFBDTElQRk9STUFUIGxwVGFyZ2V0LCBMUENMSVBGT1JNQVQgbHBTb3VyY2UpCitzdGF0aWMgQk9PTDMyIENMSVBCT0FSRF9SZW5kZXJUZXh0KExQQ0xJUEZPUk1BVCBscFRhcmdldCwgTFBDTElQRk9STUFUIGxwU291cmNlKQogewogICBVSU5UMTYgc2l6ZSA9IEdsb2JhbFNpemUxNiggbHBTb3VyY2UtPmhEYXRhICk7CiAgIExQQ1NUUglscHN0clMgPSAoTFBTVFIpR2xvYmFsTG9jazE2KGxwU291cmNlLT5oRGF0YSk7CkBAIC05MDksMTAgKzkwOSwxMCBAQAogICAgewogICAgICBscEZvcm1hdCA9ICZDbGlwRm9ybWF0c1tDRl9URVhULTFdOwogICAgICBpZiAobHBGb3JtYXQtPndEYXRhUHJlc2VudCB8fCBscEZvcm1hdC0+aERhdGEpIAotICAgICAgICAgQ0xJUEJPQVJEX0RlbGV0ZVJlY29yZChscEZvcm1hdCk7CisgICAgICAgICBDTElQQk9BUkRfRGVsZXRlUmVjb3JkKGxwRm9ybWF0LCAhKGhXbmRDbGlwV2luZG93KSk7CiAgICAgIGxwRm9ybWF0ID0gJkNsaXBGb3JtYXRzW0NGX09FTVRFWFQtMV07CiAgICAgIGlmIChscEZvcm1hdC0+d0RhdGFQcmVzZW50IHx8IGxwRm9ybWF0LT5oRGF0YSkgCi0gICAgICAgICBDTElQQk9BUkRfRGVsZXRlUmVjb3JkKGxwRm9ybWF0KTsKKyAgICAgICAgIENMSVBCT0FSRF9EZWxldGVSZWNvcmQobHBGb3JtYXQsICEoaFduZENsaXBXaW5kb3cpKTsKIAogICAgICBscEZvcm1hdC0+d0RhdGFQcmVzZW50ID0gMTsKICAgICAgbHBGb3JtYXQtPmhEYXRhID0gaFRleHQ7CmRpZmYgLS1naXQgYS9taXNjL2NydGRsbC5jIGIvbWlzYy9jcnRkbGwuYwppbmRleCBlYTE4NWFjLi41NjNiZDM5IDEwMDY0NAotLS0gYS9taXNjL2NydGRsbC5jCisrKyBiL21pc2MvY3J0ZGxsLmMKQEAgLTk0Niw2ICs5NDYsMjYgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICBfY2hkaXIgICAgICAgICAgIChDUlRETEwuNTEpCisgKi8KK0lOVDMyCitDUlRETExfX2NoZGlyKExQQ1NUUiBuZXdkaXIpIHsKKwlpZiAoIVNldEN1cnJlbnREaXJlY3RvcnkzMkEobmV3ZGlyKSkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgIF9ta2RpciAgICAgICAgICAgKENSVERMTC4yMzQpCisgKi8KK0lOVDMyCitDUlRETExfX21rZGlyKExQQ1NUUiBuZXdkaXIpIHsKKwlpZiAoIUNyZWF0ZURpcmVjdG9yeTMyQShuZXdkaXIsTlVMTCkpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICBfZXJybm8gICAgICAgICAgIChDUlRETEwuNTIpCiAgKiBZZXMsIHRoaXMgaXMgYSBmdW5jdGlvbi4KICAqLwpkaWZmIC0tZ2l0IGEvbWlzYy9tYWluLmMgYi9taXNjL21haW4uYwppbmRleCA5NmE5MTVhLi41NzgzMmFkIDEwMDY0NAotLS0gYS9taXNjL21haW4uYworKysgYi9taXNjL21haW4uYwpAQCAtMzUsMjYgKzM1LDMxIEBACiAjaW5jbHVkZSAieG1hbGxvYy5oIgogCiBjb25zdCBjaGFyIHBlb3BsZVtdID0gIldpbmUgaXMgYXZhaWxhYmxlIHRoYW5rcyB0byB0aGUgd29yayBvZiAiCi0iQm9iIEFtc3RhZHQsIERhZyBBc2hlaW0sIE1hcnRpbiBBeW90dGUsIFJvc3MgQmlybywgVXdlIEJvbm5lcywgRXJpayBCb3MsICIKLSJGb25zIEJvdG1hbiwgSm9obiBCcmV6YWssIEFuZHJldyBCdWxoYWssIEpvaG4gQnVydG9uLCAiCi0iTmllbHMgZGUgQ2FycGVudGllciwgUm9tYW4gRG9sZWpzaSwgRnJhbnMgdmFuIERvcnNzZWxhZXIsIFBhdWwgRmFsc3RhZCwgIgotIk9sYWYgRmxlYmJlLCBQZXRlciBHYWxiYXZ5LCBSYW1vbiBHYXJjaWEsIEhhbnMgZGUgR3JhYWZmLCAiCi0iQ2hhcmxlcyBNLiBIYW5udW0sIEpvaG4gSGFydmV5LCBDYW1lcm9uIEhlaWRlLCBKb2NoZW4gSG9lbmlja2UsICIKLSJPbm5vIEhvdmVycywgSmVmZnJleSBIc3UsIE1pZ3VlbCBkZSBJY2F6YSwgSnVra2EgSWl2b25lbiwgIgotIkFsZXhhbmRyZSBKdWxsaWFyZCwgSm9jaGVuIEthcnJlciwgQW5kcmVhcyBLaXJzY2hiYXVtLCBBbGJyZWNodCBLbGVpbmUsICIKKyJCb2IgQW1zdGFkdCwgRGFnIEFzaGVpbSwgTWFydGluIEF5b3R0ZSwgUGV0ZXIgQmFqdXN6LCBSb3NzIEJpcm8sICIKKyJVd2UgQm9ubmVzLCBFcmlrIEJvcywgRm9ucyBCb3RtYW4sIEpvaG4gQnJlemFrLCBBbmRyZXcgQnVsaGFrLCAiCisiSm9obiBCdXJ0b24sIE5pZWxzIGRlIENhcnBlbnRpZXIsIEppbWVuIENoaW5nLCBIdXcgRC4gTS4gRGF2aWVzLCAiCisiUm9tYW4gRG9sZWpzaSwgRnJhbnMgdmFuIERvcnNzZWxhZXIsIFBhdWwgRmFsc3RhZCwgRGF2aWQgRmF1cmUsICIKKyJPbGFmIEZsZWJiZSwgUGV0ZXIgR2FsYmF2eSwgUmFtb24gR2FyY2lhLCBNYXR0aGV3IEdoaW8sICIKKyJIYW5zIGRlIEdyYWFmZiwgQ2hhcmxlcyBNLiBIYW5udW0sIEpvaG4gSGFydmV5LCBDYW1lcm9uIEhlaWRlLCAiCisiSm9jaGVuIEhvZW5pY2tlLCBPbm5vIEhvdmVycywgSmVmZnJleSBIc3UsIE1pZ3VlbCBkZSBJY2F6YSwgIgorIkp1a2thIElpdm9uZW4sIExlZSBKYWVraWwsIEFsZXhhbmRyZSBKdWxsaWFyZCwgQmFuZyBKdW4tWW91bmcsICIKKyJQYXZlbCBLYW5rb3Zza3ksIEpvY2hlbiBLYXJyZXIsIEFuZHJlYXMgS2lyc2NoYmF1bSwgQWxicmVjaHQgS2xlaW5lLCAiCiAiSm9uIEtvbnJhdGgsIEFsZXggS29yb2JrYSwgR3JlZyBLcmVpZGVyLCBBbmFuZCBLdW1yaWEsIFNjb3R0IEEuIExhaXJkLCAiCi0iTWFydGluIHZvbiBMb2V3aXMsIEtlbm5ldGggTWFjRG9uYWxkLCBQZXRlciBNYWNEb25hbGQsIFdpbGxpYW0gTWFncm8sICIKLSJKdWVyZ2VuIE1hcnF1YXJkdCwgTWFyY3VzIE1laXNzbmVyLCBHcmFoYW0gTWVuaGVubml0dCwgRGF2aWQgTWV0Y2FsZmUsICIKLSJTdGVmZmVuIE1vZWxsZXIsIFBoaWxpcHBlIERlIE11eXRlciwgSXRhaSBOYWhzaG9uLCBNaWNoYWVsIFBhdHJhLCAiCi0iSmltIFBldGVyc29uLCBSb2JlcnQgUG91bGlvdCwgS2VpdGggUmV5bm9sZHMsIEpvaG4gUmljaGFyZHNvbiwgIgotIkpvaGFubmVzIFJ1c2NoZWluc2tpLCBUaG9tYXMgU2FuZGZvcmQsIENvbnN0YW50aW5lIFNhcHVudHpha2lzLCAiCi0iRGFuaWVsIFNjaGVwbGVyLCBVbHJpY2ggU2NobWlkLCBCZXJuZCBTY2htaWR0LCBZbmd2aSBTaWd1cmpvbnNzb24sICIKLSJSaWNrIFNsYWRrZXksIFdpbGxpYW0gU21pdGgsIEVyaWsgU3ZlbmRzZW4sIFRyaXN0YW4gVGFycmFudCwgIgotIkFuZHJldyBUYXlsb3IsIER1bmNhbiBDIFRob21zb24sIEdvcmFuIFRoeW5pLCBKaW1teSBUaXJ0YXdhbmdzYSwgIgotIkpvbiBUb21icywgTGludXMgVG9ydmFsZHMsIEdyZWdvcnkgVHJ1YmV0c2tveSwgTWljaGFlbCBWZWtzbGVyLCAiCi0iU3ZlbiBWZXJkb29sYWVnZSwgRXJpYyBXYXJua2UsIE1hbmZyZWQgV2VpY2hlbCwgTW9ydGVuIFdlbGluZGVyLCAiCisiQW5kcmV3IExld3lja3ksIE1hcnRpbiB2b24gTG9ld2lzLCBLZW5uZXRoIE1hY0RvbmFsZCwgUGV0ZXIgTWFjRG9uYWxkLCAiCisiV2lsbGlhbSBNYWdybywgSnVlcmdlbiBNYXJxdWFyZHQsIFJpY2FyZG8gTWFzc2FybywgTWFyY3VzIE1laXNzbmVyLCAiCisiR3JhaGFtIE1lbmhlbm5pdHQsIERhdmlkIE1ldGNhbGZlLCBCcnVjZSBNaWxuZXIsIFN0ZWZmZW4gTW9lbGxlciwgIgorIkFuZHJlYXMgTW9ociwgUGhpbGlwcGUgRGUgTXV5dGVyLCBJdGFpIE5haHNob24sIE1pY2hhZWwgUGF0cmEsICIKKyJKaW0gUGV0ZXJzb24sIFJvYmVydCBQb3VsaW90LCBLZWl0aCBSZXlub2xkcywgU2xhdmVuIFJlemljLCAiCisiSm9obiBSaWNoYXJkc29uLCBKb2hhbm5lcyBSdXNjaGVpbnNraSwgVGhvbWFzIFNhbmRmb3JkLCAiCisiQ29uc3RhbnRpbmUgU2FwdW50emFraXMsIFBhYmxvIFNhcmF0eGFnYSwgRGFuaWVsIFNjaGVwbGVyLCAiCisiVWxyaWNoIFNjaG1pZCwgQmVybmQgU2NobWlkdCwgWW5ndmkgU2lndXJqb25zc29uLCBTdGVwaGVuIFNpbW1vbnMsICIKKyJSaWNrIFNsYWRrZXksIFdpbGxpYW0gU21pdGgsIERvbWluaWsgU3RyYXNzZXIsIFZhZGltIFN0cml6aGV2c2t5LCAiCisiRXJpayBTdmVuZHNlbiwgVHJpc3RhbiBUYXJyYW50LCBBbmRyZXcgVGF5bG9yLCBEdW5jYW4gQyBUaG9tc29uLCAiCisiR29yYW4gVGh5bmksIEppbW15IFRpcnRhd2FuZ3NhLCBKb24gVG9tYnMsIExpbnVzIFRvcnZhbGRzLCAiCisiR3JlZ29yeSBUcnViZXRza295LCBQZXRyaSBUdW9tb2xhLCBNaWNoYWVsIFZla3NsZXIsIFN2ZW4gVmVyZG9vbGFlZ2UsICIKKyJSb25hbiBXYWlkZSwgRXJpYyBXYXJua2UsIE1hbmZyZWQgV2VpY2hlbCwgTW9ydGVuIFdlbGluZGVyLCAiCiAiSmFuIFdpbGxhbW93aXVzLCBDYXJsIFdpbGxpYW1zLCBLYXJsIEd1ZW50ZXIgV3VlbnNjaCwgRXJpYyBZb3VuZ2RhbGUsICIKLSJhbmQgSmFtZXMgWW91bmdtYW4uICI7CisiSmFtZXMgWW91bmdtYW4sIE1pa29sYWogWmFsZXdza2ksIGFuZCBKb2huIFplcm8uIjsKIAogY29uc3QgV0lORV9MQU5HVUFHRV9ERUYgTGFuZ3VhZ2VzW10gPQogewpAQCAtNzEsNiArNzYsNyBAQAogICAgIHsiS28iLDB4MDQxMn0sCS8qIExBTkdfS28gKi8KICAgICB7Ikh1IiwweDA0MzZ9LAkvKiBMQU5HX0h1ICovCiAgICAgeyJQbCIsMHgwNDE1fSwgICAgICAvKiBMQU5HX1BsICovCisgICAgeyJQbyIsMHgwNDE2fSwgICAgICAvKiBMQU5HX1BvICovCiAgICAge05VTEwsMH0KIH07CiAKQEAgLTE2Myw3ICsxNjksNyBAQAogICAiICAgIC1maXhlZG1hcCAgICAgICBVc2UgYSBcInN0YW5kYXJkXCIgY29sb3IgbWFwXG4iIFwKICAgIiAgICAtaWNvbmljICAgICAgICAgU3RhcnQgYXMgYW4gaWNvblxuIiBcCiAgICIgICAgLWlwYyAgICAgICAgICAgIEVuYWJsZSBJUEMgZmFjaWxpdGllc1xuIiBcCi0gICIgICAgLWxhbmd1YWdlIHh4ICAgIFNldCB0aGUgbGFuZ3VhZ2UgKG9uZSBvZiBFbixFcyxEZSxObyxGcixGaSxEYSxDeixFbyxJdCxLbyxcbiAgICAgICAgICAgICAgICAgICAgSHUsUGwpXG4iIFwKKyAgIiAgICAtbGFuZ3VhZ2UgeHggICAgU2V0IHRoZSBsYW5ndWFnZSAob25lIG9mIEVuLEVzLERlLE5vLEZyLEZpLERhLEN6LEVvLEl0LEtvLFxuICAgICAgICAgICAgICAgICAgICBIdSxQbCxQbylcbiIgXAogICAiICAgIC1tYW5hZ2VkICAgICAgICBBbGxvdyB0aGUgd2luZG93IG1hbmFnZXIgdG8gbWFuYWdlIGNyZWF0ZWQgd2luZG93c1xuIiBcCiAgICIgICAgLW1vZGUgbW9kZSAgICAgIFN0YXJ0IFdpbmUgaW4gYSBwYXJ0aWN1bGFyIG1vZGUgKHN0YW5kYXJkIG9yIGVuaGFuY2VkKVxuIiBcCiAgICIgICAgLW5hbWUgbmFtZSAgICAgIFNldCB0aGUgYXBwbGljYXRpb24gbmFtZVxuIiBcCmRpZmYgLS1naXQgYS9taXNjL250ZGxsLmMgYi9taXNjL250ZGxsLmMKaW5kZXggYTgzYjA0OS4uY2Q0MzBkYyAxMDA2NDQKLS0tIGEvbWlzYy9udGRsbC5jCisrKyBiL21pc2MvbnRkbGwuYwpAQCAtMzY5LDEyICszNjksMTIgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgUnRsSW5pdFVuaWNvZGVTdHJpbmcJCQlbTlRETExdCisgKiAgICAgICAgICAgICAgICAgUnRsRnJlZVVuaWNvZGVTdHJpbmcJCQlbTlRETExdCiAgKi8KIFZPSUQKIFJ0bEZyZWVVbmljb2RlU3RyaW5nKExQVU5JQ09ERV9TVFJJTkcgc3RyKSB7CiAJaWYgKHN0ci0+QnVmZmVyKQotCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc3RyKTsKKwkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHN0ci0+QnVmZmVyKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zOTksNyArMzk5LDIyIEBACiAgKiAgICAgICAgICAgICAgICAgUnRsVW5pY29kZVN0cmluZ1RvT2VtU3RyaW5nCQlbTlRETExdCiAgKi8KIERXT1JEIC8qIE5UU1RBVFVTICovCi1SdGxVbmljb2RlU3RyaW5nVG9PZW1TdHJpbmcoTFBVTklDT0RFX1NUUklORyB1bmksTFBBTlNJX1NUUklORyBvZW0sQk9PTDMyIGFsbG9jKQorUnRsVW5pY29kZVN0cmluZ1RvT2VtU3RyaW5nKExQQU5TSV9TVFJJTkcgb2VtLExQVU5JQ09ERV9TVFJJTkcgdW5pLEJPT0wzMiBhbGxvYykKK3sKKwlpZiAoYWxsb2MpIHsKKwkJb2VtLT5CdWZmZXIgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksSEVBUF9aRVJPX01FTU9SWSx1bmktPkxlbmd0aC8yKSsxOworCQlvZW0tPk1heGltdW1MZW5ndGggPSB1bmktPkxlbmd0aC8yKzE7CisJfQorCW9lbS0+TGVuZ3RoID0gdW5pLT5MZW5ndGgvMjsKKwlsc3RyY3B5bld0b0Eob2VtLT5CdWZmZXIsdW5pLT5CdWZmZXIsdW5pLT5MZW5ndGgvMisxKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgUnRsVW5pY29kZVN0cmluZ1RvQW5zaVN0cmluZwkJW05URExMXQorICovCitEV09SRCAvKiBOVFNUQVRVUyAqLworUnRsVW5pY29kZVN0cmluZ1RvQW5zaVN0cmluZyhMUFVOSUNPREVfU1RSSU5HIHVuaSxMUEFOU0lfU1RSSU5HIG9lbSxCT09MMzIgYWxsb2MpCiB7CiAJaWYgKGFsbG9jKSB7CiAJCW9lbS0+QnVmZmVyID0gKExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLEhFQVBfWkVST19NRU1PUlksdW5pLT5MZW5ndGgvMikrMTsKQEAgLTQ0NywxMSArNDYyLDkgQEAKIAlpZiAoZGVzdC0+TWF4aW11bUxlbmd0aCA8IGxlbikKIAkJcmV0dXJuIFNUQVRVU19CVUZGRVJfT1ZFUkZMT1c7CiAJcz1kZXN0LT5CdWZmZXI7dD1zcmMtPkJ1ZmZlcjsKLQlmb3IgKGk9MDtpPGxlbjtpKyspIHsKKwkvKiBsZW4gaXMgaW4gYnl0ZXMgKi8KKwlmb3IgKGk9MDtpPGxlbi8yO2krKykKIAkJc1tpXT10b3VwcGVyKHRbaV0pOwotCQlzKys7Ci0JCXQrKzsKLQl9CiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQogCmRpZmYgLS1naXQgYS9taXNjL29sZTJubHMuYyBiL21pc2Mvb2xlMm5scy5jCmluZGV4IGViYmQ3MGQuLjY2ZTJmMzYgMTAwNjQ0Ci0tLSBhL21pc2Mvb2xlMm5scy5jCisrKyBiL21pc2Mvb2xlMm5scy5jCkBAIC0xNTIsNyArMTUyLDcgQEAKICAvKiBjYXNlIExBTkdfRHU6IHJldHVybiAweDEzOyAqLyAgICAgIC8qIER1dGNoICovCiAgICAgY2FzZSBMQU5HX05vOiByZXR1cm4gMHgxNDsgICAgICAgICAvKiBOb3J3ZWdpYW4gKi8KICAgICBjYXNlIExBTkdfUGw6IHJldHVybiAweDE1OyAgICAgICAgIC8qIFBvbGlzaCAqLwotIC8qIGNhc2UgTEFOR19QbzogcmV0dXJuIDB4MTY7ICovICAgICAgLyogUG9ydHVndWVzZSAqLworICAgIGNhc2UgTEFOR19QbzogcmV0dXJuIDB4MTY7ICAgICAgICAgLyogUG9ydHVndWVzZSAqLwogIC8qIGNhc2UgTEFOR19SbzogcmV0dXJuIDB4MTg7ICovICAgICAgLyogUm9tYW5pYW4gKi8KICAvKiBjYXNlIExBTkdfUnU6IHJldHVybiAweDE5OyAqLyAgICAgIC8qIFJ1c3NpYW4gKi8KICAvKiBjYXNlIExBTkdfQ3I6IHJldHVybiAweDFhOyAqLyAgICAgIC8qIENyb2F0aWFuICovCkBAIC0xNTEwLDYgKzE1MTAsMTEyIEBACiAJfQogICAgIGJyZWFrOyAgLyogTEFORyhQbCkgKi8KIAorICAgIGNhc2UgTEFOR19QbzoKKyAgICAJc3dpdGNoIChMQ1R5cGUpIHsKK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCAiMDQxNiIpCitMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwgIlBvcnR1Z3VcMzUycyAoQnJhc2lsKSIpCitMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwgIlByb3R1Z3Vlc2UiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsICJQT1IiKQorTE9DVkFMKExPQ0FMRV9TTkFUSVZFTEFOR05BTUUsICJQb3J0dWd1XDM1MnMiKQorTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwgIjEiKQorTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwgIkJyYXNpbCIpCitMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCAiQnJhemlsIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCAiQlJBIikKK0xPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCAiQnJhc2lsIikKK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwgIjA0MDkiKQorTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksICIxIikKK0xPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwgIjQzNyIpCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFLCAiMTI1MiIpCitMT0NWQUwoTE9DQUxFX1NMSVNULCAiOyIpCitMT0NWQUwoTE9DQUxFX0lNRUFTVVJFLCAiMSIpCitMT0NWQUwoTE9DQUxFX1NERUNJTUFMLCAiLCIpCitMT0NWQUwoTE9DQUxFX1NUSE9VU0FORCwgIi4iKQorTE9DVkFMKExPQ0FMRV9TR1JPVVBJTkcsICIzOzAiKQorTE9DVkFMKExPQ0FMRV9JRElHSVRTLCAiMiIpCitMT0NWQUwoTE9DQUxFX0lMWkVSTywgIjEiKQorTE9DVkFMKExPQ0FMRV9JTkVHTlVNQkVSLCAiMSIpCitMT0NWQUwoTE9DQUxFX1NOQVRJVkVESUdJVFMsICIwMTIzNDU2Nzg5IikKK0xPQ1ZBTChMT0NBTEVfU0NVUlJFTkNZLCAiJCIpCitMT0NWQUwoTE9DQUxFX1NJTlRMU1lNQk9MLCAiVVNEIikKK0xPQ1ZBTChMT0NBTEVfU01PTkRFQ0lNQUxTRVAsICIsIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRIT1VTQU5EU0VQLCAiLiIpCitMT0NWQUwoTE9DQUxFX1NNT05HUk9VUElORywgIjM7MCIpCitMT0NWQUwoTE9DQUxFX0lDVVJSRElHSVRTLCAiMiIpCitMT0NWQUwoTE9DQUxFX0lJTlRMQ1VSUkRJR0lUUywgIjIiKQorTE9DVkFMKExPQ0FMRV9JQ1VSUkVOQ1ksICIwIikKK0xPQ1ZBTChMT0NBTEVfSU5FR0NVUlIsICIwIikKK0xPQ1ZBTChMT0NBTEVfU0RBVEUsICIvIikKK0xPQ1ZBTChMT0NBTEVfU1RJTUUsICI6IikKK0xPQ1ZBTChMT0NBTEVfU1NIT1JUREFURSwgImRkL01NL3l5IikKK0xPQ1ZBTChMT0NBTEVfU0xPTkdEQVRFLCAiZGRkZCwgTU1NTSBkZCwgeXl5eSIpCitMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFULCAiaDptbTpzcyB0dCIpCitMT0NWQUwoTE9DQUxFX0lEQVRFLCAiMCIpCitMT0NWQUwoTE9DQUxFX0lMREFURSwgIjAiKQorTE9DVkFMKExPQ0FMRV9JVElNRSwgIjAiKQorTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOLCAiMCIpCitMT0NWQUwoTE9DQUxFX0lDRU5UVVJZLCAiMCIpCitMT0NWQUwoTE9DQUxFX0lUTFpFUk8sICIwIikKK0xPQ1ZBTChMT0NBTEVfSURBWUxaRVJPLCAiMCIpCitMT0NWQUwoTE9DQUxFX0lNT05MWkVSTywgIjAiKQorTE9DVkFMKExPQ0FMRV9TMTE1OSwgIkFNIikKK0xPQ1ZBTChMT0NBTEVfUzIzNTksICJQTSIpCitMT0NWQUwoTE9DQUxFX0lDQUxFTkRBUlRZUEUsICIxIikKK0xPQ1ZBTChMT0NBTEVfSU9QVElPTkFMQ0FMRU5EQVIsICIwIikKK0xPQ1ZBTChMT0NBTEVfSUZJUlNUREFZT0ZXRUVLLCAiNiIpCitMT0NWQUwoTE9DQUxFX0lGSVJTVFdFRUtPRllFQVIsICIwIikKK0xPQ1ZBTChMT0NBTEVfU0RBWU5BTUUxLCAiU2VndW5kYSIpCitMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMiwgIlRlclwzNDdhIikKK0xPQ1ZBTChMT0NBTEVfU0RBWU5BTUUzLCAiUXVhcnRhIikKK0xPQ1ZBTChMT0NBTEVfU0RBWU5BTUU0LCAiUXVpbnRhIikKK0xPQ1ZBTChMT0NBTEVfU0RBWU5BTUU1LCAiU2V4dGEiKQorTE9DVkFMKExPQ0FMRV9TREFZTkFNRTYsICJTXDM0MWJhZG8iKQorTE9DVkFMKExPQ0FMRV9TREFZTkFNRTcsICJEb21pbmdvIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUxLCAiU2VnIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUyLCAiVGVyIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLCAiUXVhIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU0LCAiUXVpIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU1LCAiU2V4IikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2LCAiU1wzNDFiIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU3LCAiRG9tIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEsICJKYW5laXJvIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTIsICJGZXZlcmVpcm8iKQorTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMywgIk1hclwzNDdvIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTQsICJBYnJpbCIpCitMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU1LCAiTWFpbyIpCitMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU2LCAiSnVuaG8iKQorTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNywgIkp1bGhvIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTgsICJBZ29zdG8iKQorTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOSwgIlNldGVtYnJvIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEwLCAiT3V0dWJybyIpCitMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMSwgIk5vdmVtYnJvIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEyLCAiRGV6ZW1icm8iKQorTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTMsICIiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSwgIkphbiIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUyLCAiRmV2IikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTMsICJNYXIiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNCwgIkFiciIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU1LCAiTWFpIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTYsICJKdW4iKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNywgIkp1bCIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU4LCAiQWdvIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTksICJTZXQiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTAsICJPdXQiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTEsICJOb3YiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTIsICJEZXoiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTMsICIiKQorTE9DVkFMKExPQ0FMRV9TUE9TSVRJVkVTSUdOLCAiIikKK0xPQ1ZBTChMT0NBTEVfU05FR0FUSVZFU0lHTiwgIi0iKQorTE9DVkFMKExPQ0FMRV9JUE9TU0lHTlBPU04sICIzIikKK0xPQ1ZBTChMT0NBTEVfSU5FR1NJR05QT1NOLCAiMCIpCitMT0NWQUwoTE9DQUxFX0lQT1NTWU1QUkVDRURFUywgIjEiKQorTE9DVkFMKExPQ0FMRV9JUE9TU0VQQllTUEFDRSwgIjAiKQorTE9DVkFMKExPQ0FMRV9JTkVHU1lNUFJFQ0VERVMsICIxIikKK0xPQ1ZBTChMT0NBTEVfSU5FR1NFUEJZU1BBQ0UsICIwIikKKwlkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOworCX0KKyAgICBicmVhazsgLyogTEFORyhQbykgKi8KKworCiAvKkluc2VydCBvdGhlciBsYW5ndWFnZXMgaGVyZSovCiAKICAgICBkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvbWlzYy92ZXIuYyBiL21pc2MvdmVyLmMKaW5kZXggMjc3OWEwMC4uYjM4MWYzNSAxMDA2NDQKLS0tIGEvbWlzYy92ZXIuYworKysgYi9taXNjL3Zlci5jCkBAIC01NzcsNyArNTc3LDcgQEAKICAgICAJYnVmMSA9IF9mZXRjaF92ZXJzaW9uaW5mbyhkZXN0Zm4pOwogCWlmIChidWYxKSB7CiAJICAgIGJ1ZjIgPSBfZmV0Y2hfdmVyc2lvbmluZm8odG1wZm4pOwotCSAgICBpZiAoIWJ1ZjIpIHsKKwkgICAgaWYgKGJ1ZjIpIHsKIAkgICAgCWNoYXIJKnRidWYxLCp0YnVmMjsKIAkJVlNfRklYRURGSUxFSU5GTyAqZGVzdHZmZmksKnRtcHZmZmk7CiAJCVVJTlQzMglsZW4xLGxlbjI7CmRpZmYgLS1naXQgYS9tc2Rvcy9pbnQyMS5jIGIvbXNkb3MvaW50MjEuYwppbmRleCAzN2RjNmYwLi5jYWEyZTc4IDEwMDY0NAotLS0gYS9tc2Rvcy9pbnQyMS5jCisrKyBiL21zZG9zL2ludDIxLmMKQEAgLTEwNzMsOCArMTA3Myw4IEBACiAJCWJyZWFrOwogCiAJICAgICAgY2FzZSAweDA1OiAvKiBHRVQgQk9PVCBEUklWRSAqLwotCQlETF9yZWcoY29udGV4dCkgPSAyOwotCQkvKiBjOiBpcyBXaW5lJ3MgYm9vdGRyaXZlICovCisJCURMX3JlZyhjb250ZXh0KSA9IDM7CisJCS8qIGM6IGlzIFdpbmUncyBib290ZHJpdmUgKGE6IGlzIDEpKi8KIAkJYnJlYWs7CiAJCQkJCiAJICAgICAgY2FzZSAweDA2OiAvKiBHRVQgVFJVRSBWRVJTSU9OIE5VTUJFUiAqLwpAQCAtMTM1NCw4ICsxMzU0LDYgQEAKICAgICAgICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IERPU19FeHRlbmRlZEVycm9yOwogICAgICAgICAgICAgU0VUX0NGTEFHKGNvbnRleHQpOwogICAgICAgICB9Ci0gICAgICAgIGVsc2UgQVhfcmVnKGNvbnRleHQpID0gMHgwMTAwOyAKLSAgICAgICAgLyogaW50bGlzdDogbWFueSBNaWNyb3NvZnQgcHJvZHVjdHMgZm9yIFdpbmRvd3MgcmVseSBvbiB0aGlzICovCiAgICAgICAgIGJyZWFrOwogCQogICAgIGNhc2UgMHg0ODogLyogQUxMT0NBVEUgTUVNT1JZICovCkBAIC0xNjM0LDEyICsxNjMyLDUzIEBACiAgICAgICAgICAgICAgICAgU0VUX0NGTEFHKGNvbnRleHQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg0MzogIC8qIEdldC9TZXQgZmlsZSBhdHRyaWJ1dGVzICovCisgICAgICAgIHN3aXRjaCAoQkxfcmVnKGNvbnRleHQpKQorICAgICAgICB7CisgICAgICAgIGNhc2UgMHgwMDogLyogR2V0IGZpbGUgYXR0cmlidXRlcyAqLworICAgICAgICAgICAgQ1hfcmVnKGNvbnRleHQpID0gKFdPUkQpR2V0RmlsZUF0dHJpYnV0ZXMzMkEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVFJfU0VHX09GRl9UT19MSU4oRFNfcmVnKGNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSkpOworICAgICAgICAgICAgaWYgKENYX3JlZyhjb250ZXh0KSA9PSAweGZmZmYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gRE9TX0V4dGVuZGVkRXJyb3I7CisgICAgICAgICAgICAgICAgU0VUX0NGTEFHKGNvbnRleHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwMToKKyAgICAgICAgICAgIGlmICghU2V0RmlsZUF0dHJpYnV0ZXMzMkEoIFBUUl9TRUdfT0ZGX1RPX0xJTihEU19yZWcoY29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhfcmVnKGNvbnRleHQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYX3JlZyhjb250ZXh0KSApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IERPU19FeHRlbmRlZEVycm9yOworICAgICAgICAgICAgICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICBmcHJpbnRmKCBzdGRlcnIsIAorCQkgICAiVW5pbXBsZW1lbnRlZCBpbnQyMSBsb25nIGZpbGUgbmFtZSBmdW5jdGlvbjpcbiIpOworCSAgSU5UX0JBUkYoIGNvbnRleHQsIDB4MjEgKTsKKwkgIFNFVF9DRkxBRyhjb250ZXh0KTsKKwkgIEFMX3JlZyhjb250ZXh0KSA9IDA7CisJICBicmVhazsKKwl9CisJYnJlYWs7CisgICAgICAgIGNhc2UgMHg0NzogIC8qIEdldCBjdXJyZW50IGRpcmVjdG9yeSAqLworCSAgaWYgKCFJTlQyMV9HZXRDdXJyZW50RGlyZWN0b3J5KGNvbnRleHQpKQorCSAgICB7CisJICAgICAgQVhfcmVnKGNvbnRleHQpID0gRE9TX0V4dGVuZGVkRXJyb3I7CisJICAgICAgU0VUX0NGTEFHKGNvbnRleHQpOworCSAgICB9CisJICBlbHNlIEFYX3JlZyhjb250ZXh0KSA9IDB4MDEwMDsgCisgICAgICAgIC8qIGludGxpc3Q6IG1hbnkgTWljcm9zb2Z0IHByb2R1Y3RzIGZvciBXaW5kb3dzIHJlbHkgb24gdGhpcyAqLworICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAweDRlOiAgLyogRmluZCBmaXJzdCBmaWxlICovCiAgICAgICAgICAgICAvKiBGSVhNRTogdXNlIGF0dHJpYnV0ZXMgaW4gQ1ggKi8KLSAgICAgICAgICAgIGlmICghKEFYX3JlZyhjb250ZXh0KSA9IEZpbmRGaXJzdEZpbGUxNigKKyAgICAgICAgICAgIGlmICgoQVhfcmVnKGNvbnRleHQpID0gRmluZEZpcnN0RmlsZTE2KAogICAgICAgICAgICAgICAgICAgIFBUUl9TRUdfT0ZGX1RPX0xJTihEU19yZWcoY29udGV4dCksRFhfcmVnKGNvbnRleHQpKSwKICAgICAgICAgICAgICAgICAgICAoV0lOMzJfRklORF9EQVRBMzJBICopUFRSX1NFR19PRkZfVE9fTElOKEVTX3JlZyhjb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJX3JlZyhjb250ZXh0KSkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJX3JlZyhjb250ZXh0KSkpKQorCQk9PSBJTlZBTElEX0hBTkRMRV9WQUxVRTE2KQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IERPU19FeHRlbmRlZEVycm9yOwogICAgICAgICAgICAgICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKQEAgLTE2NjMsMTIgKzE3MDIsMzcgQEAKICAgICAgICAgICAgIGJyZWFrOwogCWNhc2UgMHhhMDoKIAkgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg2MDogIAorCSAgc3dpdGNoKENMX3JlZyhjb250ZXh0KSkKKwkgICAgeworCSAgICBjYXNlIDB4MDI6ICAvKkdldCBjYW5vbmljYWwgbG9uZyBmaWxlbmFtZSBvciBwYXRoICovCisJICAgICAgaWYgKCFHZXRGdWxsUGF0aE5hbWUzMkEKKwkJICAoIFBUUl9TRUdfT0ZGX1RPX0xJTihEU19yZWcoY29udGV4dCksCisJCQkJICAgICAgIFNJX3JlZyhjb250ZXh0KSksIDEyOCwKKwkJICAgIFBUUl9TRUdfT0ZGX1RPX0xJTihFU19yZWcoY29udGV4dCksCisJCQkJICAgICAgIERJX3JlZyhjb250ZXh0KSksTlVMTCkpCisJCXsKKwkJICBBWF9yZWcoY29udGV4dCkgPSBET1NfRXh0ZW5kZWRFcnJvcjsKKwkJICBTRVRfQ0ZMQUcoY29udGV4dCk7CisJCX0KKwkgICAgICBlbHNlIEFYX3JlZyhjb250ZXh0KSA9IDA7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgZnByaW50Ziggc3RkZXJyLCAKKwkJICAgICAgICJVbmltcGxlbWVudGVkIGludDIxIGxvbmcgZmlsZSBuYW1lIGZ1bmN0aW9uOlxuIik7CisJICAgICAgSU5UX0JBUkYoIGNvbnRleHQsIDB4MjEgKTsKKwkgICAgICBTRVRfQ0ZMQUcoY29udGV4dCk7CisJICAgICAgQUxfcmVnKGNvbnRleHQpID0gMDsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDZjOiAgLyogQ3JlYXRlIG9yIG9wZW4gZmlsZSAqLworCSAgLyogdHJhbnNsYXRlIERvcyA3IGFjdGlvbiB0byBEb3MgNiBhY3Rpb24gKi8KKwkgICAgRXh0ZW5kZWRPcGVuQ3JlYXRlRmlsZShjb250ZXh0KTsKKwkgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMHgzYjogIC8qIENoYW5nZSBkaXJlY3RvcnkgKi8KICAgICAgICAgY2FzZSAweDQxOiAgLyogRGVsZXRlIGZpbGUgKi8KLSAgICAgICAgY2FzZSAweDQzOiAgLyogR2V0L1NldCBmaWxlIGF0dHJpYnV0ZXMgKi8KLSAgICAgICAgY2FzZSAweDQ3OiAgLyogR2V0IGN1cnJlbnQgZGlyZWN0b3J5ICovCiAgICAgICAgIGNhc2UgMHg1NjogIC8qIE1vdmUgKHJlbmFtZSkgZmlsZSAqLwotICAgICAgICBjYXNlIDB4NmM6ICAvKiBDcmVhdGUvT3BlbiBmaWxlICovCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJVbmltcGxlbWVudGVkIGludDIxIGxvbmcgZmlsZSBuYW1lIGZ1bmN0aW9uOlxuIik7CiAgICAgICAgICAgICBJTlRfQkFSRiggY29udGV4dCwgMHgyMSApOwpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9jb2xvci5jIGIvb2JqZWN0cy9jb2xvci5jCmluZGV4IDViOGM3NjEuLjk0M2IxZGEgMTAwNjQ0Ci0tLSBhL29iamVjdHMvY29sb3IuYworKysgYi9vYmplY3RzL2NvbG9yLmMKQEAgLTg2MSw3ICs4NjEsNyBAQAogCiAgICAgaWYoIHNwZWNfdHlwZSA+IDIgKQogICAgIHsgIAotCWZwcmludGYoc3RkZXJyLCAiQ09MT1JfVG9QaHlzaWNhbCA6IGludmFsaWQgUkdCIHNwZWNpZmllciBmb3I6ICUwOGx4XG4iLCBjb2xvcik7CisJZHByaW50Zl9wYWxldHRlKHN0ZGRlYiwgIkNPTE9SX1RvUGh5c2ljYWwgOiBpbnZhbGlkIFJHQiBzcGVjaWZpZXIgZm9yOiAlMDhseFxuIiwgY29sb3IpOwogCXNwZWNfdHlwZSA9IDA7CiAgICAgfQogCmRpZmYgLS1naXQgYS9vYmplY3RzL2RpYi5jIGIvb2JqZWN0cy9kaWIuYwppbmRleCAyOWFiYTM0Li43NmRiMTI1IDEwMDY0NAotLS0gYS9vYmplY3RzL2RpYi5jCisrKyBiL29iamVjdHMvZGliLmMKQEAgLTI5LDE1ICsyOSwxOCBAQAogCiAgICAgc3dpdGNoKGRlcHRoKQogICAgIHsKLSAgICBjYXNlIDE6ICB3b3JkcyA9ICh3aWR0aCArIDMxKSAvIDMyOyBicmVhazsKLSAgICBjYXNlIDQ6ICB3b3JkcyA9ICh3aWR0aCArIDcpIC8gODsgYnJlYWs7Ci0gICAgY2FzZSA4OiAgd29yZHMgPSAod2lkdGggKyAzKSAvIDQ7IGJyZWFrOwotICAgIGNhc2UgMTU6Ci0gICAgY2FzZSAxNjogd29yZHMgPSAod2lkdGggKyAxKSAvIDI7IGJyZWFrOwotICAgIGNhc2UgMjQ6IHdvcmRzID0gd2lkdGg7IGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRElCOiB1bnN1cHBvcnRlZCBkZXB0aCAlZC5cbiIsIGRlcHRoICk7Ci0gICAgICAgIGV4aXQoMSk7CisJY2FzZSAxOiAgd29yZHMgPSAod2lkdGggKyAzMSkgLyAzMjsgYnJlYWs7CisJY2FzZSA0OiAgd29yZHMgPSAod2lkdGggKyA3KSAvIDg7IGJyZWFrOworCWNhc2UgODogIHdvcmRzID0gKHdpZHRoICsgMykgLyA0OyBicmVhazsKKwljYXNlIDE1OgorCWNhc2UgMTY6IHdvcmRzID0gKHdpZHRoICsgMSkgLyAyOyBicmVhazsKKwljYXNlIDI0OiB3b3JkcyA9ICh3aWR0aCAqIDMgKyAzKS80OyBicmVhazsKKworCWRlZmF1bHQ6CisgICAgICAgIAlmcHJpbnRmKHN0ZGVyciwgIkRJQjogdW5zdXBwb3J0ZWQgZGVwdGggJWQuXG4iLCBkZXB0aCApOworCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgMzI6CisJICAgICAgICB3b3JkcyA9IHdpZHRoOwogICAgIH0KICAgICByZXR1cm4gNCAqIHdvcmRzOwogfQpAQCAtNzEsMjkgKzc0LDYgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBESUJfRElCbXBUb0ltYWdlCi0gKgotICogQ3JlYXRlIGFuIFhJbWFnZSBwb2ludGluZyB0byB0aGUgYml0bWFwIGRhdGEuCi0gKi8KLXN0YXRpYyBYSW1hZ2UgKkRJQl9ESUJtcFRvSW1hZ2UoIEJJVE1BUElORk9IRUFERVIgKiBibXAsIHZvaWQgKiBibXBEYXRhICkKLXsKLSAgICBleHRlcm4gdm9pZCBfWEluaXRJbWFnZUZ1bmNQdHJzKCBYSW1hZ2UqICk7Ci0gICAgWEltYWdlICogaW1hZ2U7Ci0KLSAgICBpbWFnZSA9IFhDcmVhdGVJbWFnZShkaXNwbGF5LCBEZWZhdWx0VmlzdWFsT2ZTY3JlZW4oIHNjcmVlbiApLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJtcC0+YmlCaXRDb3VudCwgWlBpeG1hcCwgMCwgYm1wRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBibXAtPmJpV2lkdGgsIGJtcC0+YmlIZWlnaHQsIDMyLAotICAgICAgICAgICAgICAgICAgICAgICAgIERJQl9HZXRJbWFnZVdpZHRoQnl0ZXMoYm1wLT5iaVdpZHRoLGJtcC0+YmlCaXRDb3VudCkpOwotICAgIGlmICghaW1hZ2UpIHJldHVybiAwOwotICAgIGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3Q7Ci0gICAgaW1hZ2UtPmJpdG1hcF9iaXRfb3JkZXIgPSBNU0JGaXJzdDsKLSAgICBpbWFnZS0+Yml0bWFwX3VuaXQgPSAxNjsKLSAgICBfWEluaXRJbWFnZUZ1bmNQdHJzKGltYWdlKTsKLSAgICByZXR1cm4gaW1hZ2U7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgRElCX0dldEJpdG1hcEluZm8KICAqCiAgKiBHZXQgdGhlIGluZm8gZnJvbSBhIGJpdG1hcCBoZWFkZXIuCkBAIC04MDksMzAgKzc4OSw5NSBAQAogCWVsc2UgKChXT1JEICopaW5mby0+Ym1pQ29sb3JzKVtpXSA9IChXT1JEKWk7CiAgICAgfQogICAgIAotICAgICAgLyogVHJhbnNmZXIgdGhlIHBpeGVscyAodmVyeSBzbG93Li4uKSAqLwotCiAgICAgaWYgKGJpdHMpCiAgICAgewkKKwlCWVRFKgliYml0cyA9IGJpdHM7CisJaW50CXBhZCwgeWVuZCwgeGVuZCA9IGJtcC0+Yml0bWFwLmJtV2lkdGg7CisKKyAgICAgICAgZHByaW50Zl9iaXRtYXAoc3RkZGViLCAiR2V0RElCaXRzOiAldSBzY2FubGluZXMgb2YgKCVpLCVpKSAtPiAoJWksJWkpIHN0YXJ0aW5nIGZyb20gJXVcbiIsCisJCQkgICAgbGluZXMsIGJtcC0+Yml0bWFwLmJtV2lkdGgsIGJtcC0+Yml0bWFwLmJtSGVpZ2h0LAorCQkJICAgIChpbnQpaW5mby0+Ym1pSGVhZGVyLmJpV2lkdGgsIChpbnQpaW5mby0+Ym1pSGVhZGVyLmJpSGVpZ2h0LCBzdGFydHNjYW4gKTsKKworCS8qIGFkanVzdCBudW1iZXIgb2Ygc2NhbmxpbmVzIHRvIGNvcHkgKi8KKworCWlmKCBsaW5lcyA+IGluZm8tPmJtaUhlYWRlci5iaUhlaWdodCApIGxpbmVzID0gaW5mby0+Ym1pSGVhZGVyLmJpSGVpZ2h0OworCXllbmQgPSBzdGFydHNjYW4gKyBsaW5lczsKKwlpZiggc3RhcnRzY2FuID49IGJtcC0+Yml0bWFwLmJtSGVpZ2h0ICkgCisJICAgIHJldHVybiBGQUxTRTsKKwlpZiggeWVuZCA+IGJtcC0+Yml0bWFwLmJtSGVpZ2h0ICkgeWVuZCA9IGJtcC0+Yml0bWFwLmJtSGVpZ2h0OworCisJLyogYWRqdXN0IHNjYW5saW5lIHdpZHRoICovCisKKwlwYWQgPSBpbmZvLT5ibWlIZWFkZXIuYmlXaWR0aCAtIGJtcC0+Yml0bWFwLmJtV2lkdGg7CisJaWYoIHBhZCA8IDAgKSAKKwl7CisJICAgIC8qIGJpdG1hcCBpcyB3aWRlciB0aGFuIERJQiwgY29weSBvbmx5IGEgcGFydCAqLworCisJICAgIHBhZCA9IDA7IHhlbmQgPSBpbmZvLT5ibWlIZWFkZXIuYmlXaWR0aDsKKwl9CisKIAlibXBJbWFnZSA9IChYSW1hZ2UgKilDYWxsVG8zMl9MYXJnZVN0YWNrKCAoaW50ICgqKSgpKVhHZXRJbWFnZSwgOCwgCiAJCSAgICAgICAgICAgICAgIGRpc3BsYXksIGJtcC0+cGl4bWFwLCAwLCAwLCBibXAtPmJpdG1hcC5ibVdpZHRoLAogCQkgICAgICAgICAgICAgICBibXAtPmJpdG1hcC5ibUhlaWdodCwgQWxsUGxhbmVzLCBaUGl4bWFwICk7Ci0JZGliSW1hZ2UgPSBESUJfRElCbXBUb0ltYWdlKCAmaW5mby0+Ym1pSGVhZGVyLCBiaXRzICk7CiAKLQlmb3IgKHkgPSAwOyB5IDwgbGluZXM7IHkrKykKKwlzd2l0Y2goIGluZm8tPmJtaUhlYWRlci5iaUJpdENvdW50ICkKIAl7Ci0JICAgIGZvciAoeCA9IDA7IHggPCBpbmZvLT5ibWlIZWFkZXIuYmlXaWR0aDsgeCsrKQotCSAgICB7Ci0JCVhQdXRQaXhlbCggZGliSW1hZ2UsIHgsIHksCi0JCSAgWEdldFBpeGVsKGJtcEltYWdlLCB4LCBibXAtPmJpdG1hcC5ibUhlaWdodC1zdGFydHNjYW4teS0xKSApOwotCQkKLQkgICAgfQorCSAgIGNhc2UgODoKKworCQlwYWQgKz0gKDQgLSAoaW5mby0+Ym1pSGVhZGVyLmJpV2lkdGggJiAzKSkgJiAzOworCQlmb3IoIHkgPSB5ZW5kIC0gMTsgKGludCl5ID49IChpbnQpc3RhcnRzY2FuOyB5LS0gKQorCQl7CisJCSAgIGZvciggeCA9IDA7IHggPCB4ZW5kOyB4KysgKQorCQkJKmJiaXRzKysgPSBYR2V0UGl4ZWwoIGJtcEltYWdlLCB4LCB5ICk7CisJCSAgIGJiaXRzICs9IHBhZDsKKwkJfQorCQlicmVhazsKKworLyogYWRkIG1vcmUgYnBwLXNwZWNpZmljIHNob3J0Y3V0cyBoZXJlICovCisKKwkgICBkZWZhdWx0OgorCisJCWRpYkltYWdlID0gWENyZWF0ZUltYWdlKGRpc3BsYXksIERlZmF1bHRWaXN1YWxPZlNjcmVlbiggc2NyZWVuICksCisJCQkgICBpbmZvLT5ibWlIZWFkZXIuYmlCaXRDb3VudCwgWlBpeG1hcCwgMCwgYml0cywKKwkJCSAgIGluZm8tPmJtaUhlYWRlci5iaVdpZHRoLCBpbmZvLT5ibWlIZWFkZXIuYmlIZWlnaHQsCisJCQkgICAzMiwgRElCX0dldEltYWdlV2lkdGhCeXRlcyggaW5mby0+Ym1pSGVhZGVyLmJpV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5ibWlIZWFkZXIuYmlCaXRDb3VudCApICk7CisJCWlmKCBkaWJJbWFnZSApCisJCXsKKwkJICAgIGV4dGVybiB2b2lkIF9YSW5pdEltYWdlRnVuY1B0cnMoIFhJbWFnZSogKTsKKworCQkgICAgZGliSW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdDsKKwkJICAgIGRpYkltYWdlLT5iaXRtYXBfYml0X29yZGVyID0gTVNCRmlyc3Q7CisJCSAgICBkaWJJbWFnZS0+Yml0bWFwX3VuaXQgPSAxNjsKKwkJICAgIF9YSW5pdEltYWdlRnVuY1B0cnMoIGRpYkltYWdlICk7CisKKwkJICAgIGZvciAoeSA9IHllbmQgLSAxOyAoaW50KXkgPj0gKGludClzdGFydHNjYW47IHktLSkKKwkJICAgICAgICBmb3IgKHggPSAwOyB4IDwgeGVuZDsgeCsrKQorCQkJICAgIFhQdXRQaXhlbCggZGliSW1hZ2UsIHgsIHllbmQgLSB5ICsgMSwgCisJCQkJICAgICAgIFhHZXRQaXhlbCggYm1wSW1hZ2UsIHgsIHkgKSk7CisJCSAgICBkaWJJbWFnZS0+ZGF0YSA9IE5VTEw7CisJCSAgICBYRGVzdHJveUltYWdlKCBkaWJJbWFnZSApOworCQl9CiAJfQotCQotCWRpYkltYWdlLT5kYXRhID0gTlVMTDsKLQlYRGVzdHJveUltYWdlKCBkaWJJbWFnZSApOworCiAJWERlc3Ryb3lJbWFnZSggYm1wSW1hZ2UgKTsKKworCWluZm8tPmJtaUhlYWRlci5iaUNvbXByZXNzaW9uID0gMDsKICAgICB9Ci0gICAgaW5mby0+Ym1pSGVhZGVyLmJpQ29tcHJlc3Npb24gPSAwOworICAgIGVsc2UgaWYoIGluZm8tPmJtaUhlYWRlci5iaVNpemUgPj0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpICkgCisgICAgeworCS8qIGZpbGwgaW4gc3RydWN0IG1lbWJlcnMgKi8KKwkKKwlpbmZvLT5ibWlIZWFkZXIuYmlXaWR0aCA9IGJtcC0+Yml0bWFwLmJtV2lkdGg7CisJaW5mby0+Ym1pSGVhZGVyLmJpSGVpZ2h0ID0gYm1wLT5iaXRtYXAuYm1IZWlnaHQ7CisJaW5mby0+Ym1pSGVhZGVyLmJpUGxhbmVzID0gMTsKKwlpbmZvLT5ibWlIZWFkZXIuYmlCaXRDb3VudCA9IGJtcC0+Yml0bWFwLmJtQml0c1BpeGVsOworCWluZm8tPmJtaUhlYWRlci5iaVNpemVJbWFnZSA9IGJtcC0+Yml0bWFwLmJtSGVpZ2h0ICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElCX0dldEltYWdlV2lkdGhCeXRlcyggYm1wLT5iaXRtYXAuYm1XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wLT5iaXRtYXAuYm1CaXRzUGl4ZWwgKTsKKwlpbmZvLT5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiA9IDA7CisgICAgfQorCiAgICAgcmV0dXJuIGxpbmVzOwogfQogCmRpZmYgLS1naXQgYS9vYmplY3RzL2ZvbnQuYyBiL29iamVjdHMvZm9udC5jCmluZGV4IDc5MTIzNjIuLjNhYzE3ZGIgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZm9udC5jCisrKyBiL29iamVjdHMvZm9udC5jCkBAIC04NjgsMzEgKzg2OCwyMyBAQAogQk9PTDE2IEdldENoYXJXaWR0aDE2KCBIREMxNiBoZGMsIFVJTlQxNiBmaXJzdENoYXIsIFVJTlQxNiBsYXN0Q2hhciwKICAgICAgICAgICAgICAgICAgICAgICAgTFBJTlQxNiBidWZmZXIgKQogewotICAgIGludCBpLCB3aWR0aDsKLSAgICBYRm9udFN0cnVjdCAqeGZvbnQ7Ci0gICAgWENoYXJTdHJ1Y3QgKmNzLCAqZGVmOwotCi0gICAgREMgKmRjID0gKERDICopR0RJX0dldE9ialB0cihoZGMsIERDX01BR0lDKTsKLSAgICBpZiAoIWRjKSByZXR1cm4gRkFMU0U7Ci0gICAgeGZvbnQgPSBkYy0+dS54LmZvbnQuZnN0cnVjdDsKLSAgICAKLSAgICAvKiBmaXhlZCBmb250PyAqLwotICAgIGlmICh4Zm9udC0+cGVyX2NoYXIgPT0gTlVMTCkKKyAgICBMUElOVDMyCSBidWYzMiA9IChMUElOVDMyKXhtYWxsb2Moc2l6ZW9mKElOVDMyKSooMSArIChsYXN0Q2hhci1maXJzdENoYXIpKSk7CisgICAgTFBJTlQzMgkgb2J1ZjMyOworICAgIEJPT0wzMgkgcmV0VmFsOworICAgIGludAkJIGk7CisgICAgaWYgKCFidWYzMikKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBvYnVmMzIgPSBidWYzMjsKKyAgICByZXRWYWwgPSBHZXRDaGFyV2lkdGgzMkEoaGRjLCBmaXJzdENoYXIsIGxhc3RDaGFyLCBidWYzMik7CisgICAgaWYgKHJldFZhbCkKICAgICB7CiAJZm9yIChpID0gZmlyc3RDaGFyOyBpIDw9IGxhc3RDaGFyOyBpKyspCi0JICAgICpidWZmZXIrKyA9IHhmb250LT5tYXhfYm91bmRzLndpZHRoOwotCXJldHVybiBUUlVFOworCXsKKwkgICAgKmJ1ZmZlcisrID0gKmJ1ZjMyKys7CisJfQogICAgIH0KLQotICAgIENJX0dFVF9ERUZBVUxUX0lORk8oeGZvbnQsIGRlZik7Ci0JCi0gICAgZm9yIChpID0gZmlyc3RDaGFyOyBpIDw9IGxhc3RDaGFyOyBpKyspCi0gICAgewotCUNJX0dFVF9DSEFSX0lORk8oIHhmb250LCBpLCBkZWYsIGNzICk7Ci0gICAgICAgIHdpZHRoID0gY3MgPyBjcy0+d2lkdGggOiB4Zm9udC0+bWF4X2JvdW5kcy53aWR0aDsKLSAgICAgICAgKmJ1ZmZlcisrID0gTUFYKCB3aWR0aCwgMCApOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICBmcmVlIChvYnVmMzIpOworICAgIHJldHVybiByZXRWYWw7CiB9CiAKIApAQCAtOTAyLDMwICs4OTQsMTcgQEAKIEJPT0wzMiBHZXRDaGFyV2lkdGgzMkEoIEhEQzMyIGhkYywgVUlOVDMyIGZpcnN0Q2hhciwgVUlOVDMyIGxhc3RDaGFyLAogICAgICAgICAgICAgICAgICAgICAgICAgTFBJTlQzMiBidWZmZXIgKQogewotICAgIGludCBpLCB3aWR0aDsKLSAgICBYRm9udFN0cnVjdCAqeGZvbnQ7Ci0gICAgWENoYXJTdHJ1Y3QgKmNzLCAqZGVmOwotCi0gICAgREMgKmRjID0gKERDICopR0RJX0dldE9ialB0cihoZGMsIERDX01BR0lDKTsKLSAgICBpZiAoIWRjKSByZXR1cm4gRkFMU0U7Ci0gICAgeGZvbnQgPSBkYy0+dS54LmZvbnQuZnN0cnVjdDsKLSAgICAKLSAgICAvKiBmaXhlZCBmb250PyAqLwotICAgIGlmICh4Zm9udC0+cGVyX2NoYXIgPT0gTlVMTCkKKyAgICBEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKKyAgICBpZiAoIWRjKQogICAgIHsKLQlmb3IgKGkgPSBmaXJzdENoYXI7IGkgPD0gbGFzdENoYXI7IGkrKykKLQkgICAgKmJ1ZmZlcisrID0geGZvbnQtPm1heF9ib3VuZHMud2lkdGg7Ci0JcmV0dXJuIFRSVUU7CisJaWYgKCEoZGMgPSAoREMgKilHRElfR2V0T2JqUHRyKCBoZGMsIE1FVEFGSUxFX0RDX01BR0lDICkpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAotICAgIENJX0dFVF9ERUZBVUxUX0lORk8oeGZvbnQsIGRlZik7Ci0JCi0gICAgZm9yIChpID0gZmlyc3RDaGFyOyBpIDw9IGxhc3RDaGFyOyBpKyspCi0gICAgewotCUNJX0dFVF9DSEFSX0lORk8oIHhmb250LCBpLCBkZWYsIGNzICk7Ci0gICAgICAgIHdpZHRoID0gY3MgPyBjcy0+d2lkdGggOiB4Zm9udC0+bWF4X2JvdW5kcy53aWR0aDsKLSAgICAgICAgKmJ1ZmZlcisrID0gTUFYKCB3aWR0aCwgMCApOwotICAgIH0KKyAgICBpZiAoIWRjLT5mdW5jcy0+cEdldENoYXJXaWR0aCB8fAorICAgICAgICAhZGMtPmZ1bmNzLT5wR2V0Q2hhcldpZHRoKCBkYywgZmlyc3RDaGFyLCBsYXN0Q2hhciwgYnVmZmVyKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKZGlmZiAtLWdpdCBhL29iamVjdHMvbWV0YWZpbGUuYyBiL29iamVjdHMvbWV0YWZpbGUuYwppbmRleCA2NDcwMWU5Li45Mjg0MTFjIDEwMDY0NAotLS0gYS9vYmplY3RzL21ldGFmaWxlLmMKKysrIGIvb2JqZWN0cy9tZXRhZmlsZS5jCkBAIC03NTAsNiArNzUwLDE3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgU2V0TWV0YUZpbGVCaXRzQmV0dGVyICAgKEdESS4xOTYpCisgKi8KK0hNRVRBRklMRTE2IFNldE1ldGFGaWxlQml0c0JldHRlciggSE1FVEFGSUxFMTYgaE1ldGEgKQoreworICAgaWYoIElzVmFsaWRNZXRhRmlsZSggaE1ldGEgKSApCisgICAgICAgcmV0dXJuIChITUVUQUZJTEUxNilHbG9iYWxSZUFsbG9jMTYoIGhNZXRhLCAwLCAKKwkJCSAgIEdNRU1fU0hBUkUgfCBHTUVNX05PRElTQ0FSRCB8IEdNRU1fTU9ESUZZKTsKKyAgIHJldHVybiAoSE1FVEFGSUxFMTYpMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICBNRl9Xcml0ZVJlY29yZAogICoKICAqIFdhcm5pbmc6IHRoaXMgZnVuY3Rpb24gY2FuIGNoYW5nZSB0aGUgbWV0YWZpbGUgaGFuZGxlLgpkaWZmIC0tZ2l0IGEvcmVzb3VyY2VzL01ha2VmaWxlLmluIGIvcmVzb3VyY2VzL01ha2VmaWxlLmluCmluZGV4IDA5ZDBkODUuLjFkMzc1NWMgMTAwNjQ0Ci0tLSBhL3Jlc291cmNlcy9NYWtlZmlsZS5pbgorKysgYi9yZXNvdXJjZXMvTWFrZWZpbGUuaW4KQEAgLTE5LDcgKzE5LDggQEAKIAlzeXNyZXNfSXQuYyBcCiAJc3lzcmVzX0tvLmMgXAogCXN5c3Jlc19Oby5jIFwKLQlzeXNyZXNfUGwuYworCXN5c3Jlc19QbC5jIFwKKwlzeXNyZXNfUG8uYwogCiBDX1NSQ1MgPSBzeXNyZXMuYwogR0VOX0NfU1JDUyA9ICQoU1lTUkVTX1NSQ1MpCmRpZmYgLS1naXQgYS9yZXNvdXJjZXMvc3lzcmVzLmMgYi9yZXNvdXJjZXMvc3lzcmVzLmMKaW5kZXggMDNiNDFlMy4uMzZhMGFkOCAxMDA2NDQKLS0tIGEvcmVzb3VyY2VzL3N5c3Jlcy5jCisrKyBiL3Jlc291cmNlcy9zeXNyZXMuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgInN5c3Jlc19Lby5oIgogI2luY2x1ZGUgInN5c3Jlc19IdS5oIgogI2luY2x1ZGUgInN5c3Jlc19QbC5oIgorI2luY2x1ZGUgInN5c3Jlc19Qby5oIgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3QgKiBTWVNSRVNfUmVzb3VyY2VzW10gPQogewpAQCAtMzcsNyArMzgsOCBAQAogICAgIHN5c3Jlc19JdF9UYWJsZSwgIC8qIExBTkdfSXQgKi8KICAgICBzeXNyZXNfS29fVGFibGUsICAvKiBMQU5HX0tvICovCiAgICAgc3lzcmVzX0h1X1RhYmxlLCAgLyogTEFOR19IdSAqLwotICAgIHN5c3Jlc19QbF9UYWJsZSAgIC8qIExBTkdfUGwgKi8KKyAgICBzeXNyZXNfUGxfVGFibGUsICAvKiBMQU5HX1BsICovCisgICAgc3lzcmVzX1BvX1RhYmxlICAgLyogTEFOR19QbyAqLwogfTsKIAogCmRpZmYgLS1naXQgYS9yZXNvdXJjZXMvc3lzcmVzX1BsLnJjIGIvcmVzb3VyY2VzL3N5c3Jlc19QbC5yYwppbmRleCAxYWYzZGZmLi4xZTgyMWY4IDEwMDY0NAotLS0gYS9yZXNvdXJjZXMvc3lzcmVzX1BsLnJjCisrKyBiL3Jlc291cmNlcy9zeXNyZXNfUGwucmMKQEAgLTUxLDcgKzUxLDcgQEAKIAlDT05UUk9MICJUZXh0IiwgMTAwLCAiU1RBVElDIiwgU1NfTk9QUkVGSVggfCBXU19HUk9VUCwgMTEsIDQwLCAyMDAsIDIwMAogCUlDT04gIiIsIDEwODgsIDE5NSwgMTAsIDE4LCAyMAogfQotLy9MVEVYVCAiV3lzd2lldGwgcGxpa2kgJnR5cHU6IiwgMTA4OSwgNiwgMTA0LCA5MCwgOQorLyogTFRFWFQgIld5c3dpZXRsIHBsaWtpICZ0eXB1OiIsIDEwODksIDYsIDEwNCwgOTAsIDkgKi8KIE9QRU5fRklMRSBESUFMT0cgMzYsIDI0LCAyNzksIDEzNAogU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKIENBUFRJT04gIk90d/NyeiIKQEAgLTcyLDcgKzcyLDcgQEAKIAlDT05UUk9MICImUG9tb2MiLCAxMDM4LCAiQlVUVE9OIiwgQlNfUFVTSEJVVFRPTiB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUCwgMjEyLCA0NiwgNTYsIDE0CiAJQ09OVFJPTCAiVHlsa28gZG8gb2Rjenl0dSIsIDEwNDAsICJCVVRUT04iLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AsIDIwOCwgNjgsIDY5LCAxMgogRU5ECi0vL1BSSU5UIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjY0LCAxMzQKKy8qIFBSSU5UIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjY0LCAxMzQgKi8KIFNBVkVfRklMRSBESUFMT0cgMzYsIDI0LCAyNzgsIDEzNAogU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKIENBUFRJT04gIlphcGlzeiBqYWtvIgpAQCAtOTMsNyArOTMsNyBAQAogCUNPTlRST0wgIiZQb21vYyIsIDEwMzgsICJCVVRUT04iLCBCU19QVVNIQlVUVE9OIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QLCAyMTMsIDQ1LCA1NiwgMTQKIAlDT05UUk9MICImVHlsa28gZG8gb2Rjenl0dSIsIDEwNDAsICJCVVRUT04iLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AsIDIwOCwgNjgsIDY4LCAxMgogRU5ECi0vLyBERUZQVVNIQlVUVE9OICJPayIsIDEsIDIwNiwgNiwgNTYsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisvKiBERUZQVVNIQlVUVE9OICJPayIsIDEsIDIwNiwgNiwgNTYsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QICovCiBQUklOVCBESUFMT0cgMzYsIDI0LCAyNjQsIDEzNAogU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKIENBUFRJT04gIkRydWt1aiIKQEAgLTExNSw3ICsxMTUsNyBAQAogCUNPTlRST0wgIkRydWt1aiBkbyBQbGkma3UiLCAxMDQwLCAiQlVUVE9OIiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QLCAxNCwgMTE1LCA5NSwgMTIKIAlDT05UUk9MICJTb3J0dWoga29waWUiLCAxMDQxLCAiQlVUVE9OIiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QLCAxODIsIDEwMiwgNTksIDEyCiBFTkQKLS8vICAgIFBVU0hCVVRUT04gICAgICAiQW51bHVqIixJRENBTkNFTCwyMTgsMjMsNDAsMTQsV1NfR1JPVVAKKy8qICAgIFBVU0hCVVRUT04gICAgICAiQW51bHVqIixJRENBTkNFTCwyMTgsMjMsNDAsMTQsV1NfR1JPVVAgKi8KIFBSSU5UX1NFVFVQIERJQUxPRyAzNiwgMjQsIDI2NCwgMTM0CiBTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQogQ0FQVElPTiAiUHJpbnQgU2V0dXAiCkBAIC0xNDAsNyArMTQwLDcgQEAKIAlDT05UUk9MICIiLCAxMTM3LCAiQ09NQk9CT1giLCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBDQlNfSEFTU1RSSU5HUyB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QLCAxNTUsIDk1LCA5MiwgNjgKIAlDT05UUk9MICIiLCAxMTM4LCAiQ09NQk9CT1giLCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBDQlNfSEFTU1RSSU5HUyB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QLCAxNTUsIDExMCwgOTIsIDY4CiBFTkQKLS8vIENPTlRST0wgIiIgLDcxMCwiU1RBVElDIixXU19CT1JERVJ8U1NfU0lNUExFfFdTX1RBQlNUT1B8V1NfR1JPVVAsIDE1Miw0LDExOCwxMTYKKy8qIENPTlRST0wgIiIgLDcxMCwiU1RBVElDIixXU19CT1JERVJ8U1NfU0lNUExFfFdTX1RBQlNUT1B8V1NfR1JPVVAsIDE1Miw0LDExOCwxMTYgKi8KIENIT09TRV9GT05UIERJQUxPRyAxMywgNTQsIDI2NCwgMTQ3CiBTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQogQ0FQVElPTiAiRm9udCIKQEAgLTE2OCwxMSArMTY4LDEyIEBACiAJQ09OVFJPTCAiUHJ6eWuzYWQiLCAxMDczLCAiQlVUVE9OIiwgQlNfR1JPVVBCT1ggfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AsIDk4LDcyLDE2MCw0OQogCUNPTlRST0wgIkFhQmJZeVp6XHhCMyIsIDEwOTMsICJTVEFUSUMiLCBTU19OT1BSRUZJWCB8IFdTX1ZJU0lCTEUsIDEwNCw4MSwxNDksMzcKIEVORAotLy8gUFVTSEJVVFRPTiAiJlJlcGxhY2UiLCAxMDI0LCAxNzQsIDIxLCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAotLy8gUFVTSEJVVFRPTiAiUmVwbGFjZSAmQWxsIiwgMTAyNSwgMTc0LCAzOCwgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKLS8vIFBVU0hCVVRUT04gIkNhbmNlbCIsIDIsIDE3NCwgNTUsIDUwLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCi0vLyBQVVNIQlVUVE9OICImSGVscCIsIDEwMzgsIDE3NCwgNzUsIDUwLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCi0vL30KKy8qIFBVU0hCVVRUT04gIiZSZXBsYWNlIiwgMTAyNCwgMTc0LCAyMSwgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyAqIFBVU0hCVVRUT04gIlJlcGxhY2UgJkFsbCIsIDEwMjUsIDE3NCwgMzgsIDUwLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgKiBQVVNIQlVUVE9OICJDYW5jZWwiLCAyLCAxNzQsIDU1LCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorICogUFVTSEJVVFRPTiAiJkhlbHAiLCAxMDM4LCAxNzQsIDc1LCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorICp9CisgKi8KIEZJTkRfVEVYVCBESUFMT0cgMzQsIDI0LCAyNTEsIDYyCiBTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQogQ0FQVElPTiAiWm5hamSfIgpkaWZmIC0tZ2l0IGEvcmVzb3VyY2VzL3N5c3Jlc19Qby5yYyBiL3Jlc291cmNlcy9zeXNyZXNfUG8ucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZjYTI1MQotLS0gL2Rldi9udWxsCisrKyBiL3Jlc291cmNlcy9zeXNyZXNfUG8ucmMKQEAgLTAsMCArMSwyNDcgQEAKK1NZU01FTlUgTUVOVSBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFCit7CisgTUVOVUlURU0gIiZSZXN0YXVyYXIiLCA2MTcyOAorIE1FTlVJVEVNICImTW92ZXIiLCA2MTQ1NgorIE1FTlVJVEVNICImVGFtYW5obyIsIDYxNDQwCisgTUVOVUlURU0gIk1pJm5pbWl6YXIiLCA2MTQ3MgorIE1FTlVJVEVNICJNYSZ4aW1pemFyIiwgNjE0ODgKKyBNRU5VSVRFTSBTRVBBUkFUT1IKKyBNRU5VSVRFTSAiJkZlY2hhclx0QWx0LUY0IiwgNjE1MzYKKyBNRU5VSVRFTSBTRVBBUkFUT1IKKyBNRU5VSVRFTSAiJkFsdGVybmFyIFBhcmEgLi4uXHRDdHJsLUVzYyIsIDYxNzQ0CisgTUVOVUlURU0gU0VQQVJBVE9SCisgTUVOVUlURU0gIiZTb2JyZSBvIFdJTkUgLi4uIiwgNjE3NjEKK30KKworRURJVE1FTlUgTUVOVSBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFCit7CisJUE9QVVAgIiIKKwlCRUdJTgorCQlNRU5VSVRFTSAiJlZvbHRhciIsIEVNX1VORE8zMgorCQlNRU5VSVRFTSBTRVBBUkFUT1IKKwkJTUVOVUlURU0gIiZSZWNvcnRhciIsIFdNX0NVVAorCQlNRU5VSVRFTSAiJkNvcGlhciIsIFdNX0NPUFkKKwkJTUVOVUlURU0gIkNvJmxhciIsIFdNX1BBU1RFCisJCU1FTlVJVEVNICImQXBhZ2FyIiwgV01fQ0xFQVIKKwkJTUVOVUlURU0gU0VQQVJBVE9SCisJCU1FTlVJVEVNICJTZWxlY2lvbmFyICZUdWRvIiwgRU1fU0VUU0VMMzIKKwlFTkQKK30KKworTVNHQk9YIERJQUxPRyAxMDAsIDgwLCAyMTYsIDE2OAorU1RZTEUgRFNfU1lTTU9EQUwgfCBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK0JFR0lOCisgICAgICAgIElDT04gIiIsIDEwODgsIDgsIDIwLCAxNiwgMTYsIFdTX0NISUxEIHwgV1NfVklTSUJMRQorICAgICAgICBMVEVYVCAiIiwgMTAwLCAzMiwgNCwgMTc2LCA0OCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKKyAgICAgICAgUFVTSEJVVFRPTiAiJk9rIiwgMSwgMTYsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKyAgICAgICAgUFVTSEJVVFRPTiAiJkNhbmNlbGFyIiwgMiwgNjQsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKyAgICAgICAgUFVTSEJVVFRPTiAiJkFib3J0YXIiLCAzLCAxMTIsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKyAgICAgICAgUFVTSEJVVFRPTiAiJlJlcGV0aXIiLCA0LCAxNjAsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKyAgICAgICAgUFVTSEJVVFRPTiAiJklnbm9yYXIiLCA1LCAyMDgsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKyAgICAgICAgUFVTSEJVVFRPTiAiJlNpbSIsIDYsIDI1NiwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorICAgICAgICBQVVNIQlVUVE9OICImTuNvIiwgNywgMzA0LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCitFTkQKKworU0hFTExfQUJPVVRfTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDUwLCA0NCwgMjIzLCAyNzAKK1NUWUxFIERTX0xPQ0FMRURJVCB8IERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiU29icmUgJXMiCitGT05UIDEwLCAiU2lzdGVtYSIKK3sKKyBERUZQVVNIQlVUVE9OICJPSyIsIDEsIDkxLCAyNTAsIDQwLCAxNAorIENPTlRST0wgIiIsIC0xLCAiU1RBVElDIiwgU1NfQkxBQ0tGUkFNRSB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0RJU0FCTEVELCA0LCAzNSwgMjE1LCAyMTAKKyBMVEVYVCAiVGV4dCIsIDEwMCwgMTEsIDQwLCAyMDAsIDIwMCwgU1NfTk9QUkVGSVggfCBXU19HUk9VUAorIElDT04gIiIsIDEwODgsIDE5NSwgMTAsIDE4LCAyMAorfQorCisKK09QRU5fRklMRSBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDI3NSwgMTM0CitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiQWJyaXIiCitGT05UIDgsICJIZWx2IgoreworIExURVhUICJOb21lIGRvICZBcnF1aXZvOiIsIDEwOTAsIDYsIDYsIDc2LCA5CisgRURJVFRFWFQgMTE1MiwgNiwgMTYsIDkwLCAxMiwgRVNfQVVUT0hTQ1JPTEwgfCBFU19PRU1DT05WRVJUIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAorIExJU1RCT1ggMTEyMCwgNiwgMzIsIDkwLCA2OCwgTEJTX1NUQU5EQVJEIHwgTEJTX09XTkVSRFJBV0ZJWEVEIHwgTEJTX0hBU1NUUklOR1MgfCBMQlNfRElTQUJMRU5PU0NST0xMIHwgV1NfVEFCU1RPUAorIExURVhUICImRGlyZXTzcmlvczoiLCAtMSwgMTEwLCA2LCA5MiwgOQorIExURVhUICIiLCAxMDg4LCAxMTAsIDE4LCA5MiwgOSwgU1NfTk9QUkVGSVggfCBXU19HUk9VUAorIExJU1RCT1ggMTEyMSwgMTEwLCAzMiwgOTIsIDY4LCBMQlNfU1RBTkRBUkQgfCBMQlNfT1dORVJEUkFXRklYRUQgfCBMQlNfSEFTU1RSSU5HUyB8IExCU19ESVNBQkxFTk9TQ1JPTEwgfCBXU19UQUJTVE9QCisgTFRFWFQgIkxpc3RhciBBcnF1aXZvcyBkbyAmVGlwbzoiLCAxMDg5LCA2LCAxMDQsIDkwLCA5CisgQ09NQk9CT1ggMTEzNiwgNiwgMTE0LCA5MCwgMzYsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfQVVUT0hTQ1JPTEwgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorIExURVhUICJEcmkmdmVzOiIsIDEwOTEsIDExMCwgMTA0LCA5MiwgOQorIENPTUJPQk9YIDExMzcsIDExMCwgMTE0LCA5MiwgNjgsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfT1dORVJEUkFXRklYRUQgfCBDQlNfQVVUT0hTQ1JPTEwgfCBDQlNfU09SVCB8IENCU19IQVNTVFJJTkdTIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AKKyBERUZQVVNIQlVUVE9OICJBYnJpciIsIDEsIDIwOCwgNiwgNTYsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiQ2FuY2VsYXIiLCAyLCAyMDgsIDI0LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIkEmanVkYSIsIDEwMzgsIDIwOCwgNDYsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ0hFQ0tCT1ggIiZTb21lbnRlIExlaXR1cmEiLCAxMDQwLCAyMDgsIDY4LCA1MCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorfQorCisKK1NBVkVfRklMRSBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDI3NSwgMTM0CitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiU2FsdmFyIENvbW8gLi4uIgorRk9OVCA4LCAiSGVsdiIKK3sKKyBMVEVYVCAiTm9tZSBkbyAmQXJxdWl2bzoiLCAxMDkwLCA2LCA2LCA3NiwgOQorIEVESVRURVhUIDExNTIsIDYsIDE2LCA5MCwgMTIsIEVTX0FVVE9IU0NST0xMIHwgRVNfT0VNQ09OVkVSVCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKKyBMSVNUQk9YIDExMjAsIDYsIDMyLCA5MCwgNjgsIExCU19TVEFOREFSRCB8IExCU19PV05FUkRSQVdGSVhFRCB8IExCU19IQVNTVFJJTkdTIHwgTEJTX0RJU0FCTEVOT1NDUk9MTCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAiJkRpcmV083Jpb3M6IiwgLTEsIDExMCwgNiwgOTIsIDkKKyBMVEVYVCAiIiwgMTA4OCwgMTEwLCAxOCwgOTIsIDksIFNTX05PUFJFRklYIHwgV1NfR1JPVVAKKyBMSVNUQk9YIDExMjEsIDExMCwgMzIsIDkyLCA2OCwgTEJTX1NUQU5EQVJEIHwgTEJTX09XTkVSRFJBV0ZJWEVEIHwgTEJTX0hBU1NUUklOR1MgfCBMQlNfRElTQUJMRU5PU0NST0xMIHwgV1NfVEFCU1RPUAorIExURVhUICJMaXN0YXIgQXJxdWl2b3MgZG8gJlRpcG86IiwgMTA4OSwgNiwgMTA0LCA5MCwgOQorIENPTUJPQk9YIDExMzYsIDYsIDExNCwgOTAsIDM2LCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX0FVVE9IU0NST0xMIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAiRHJpJnZlczoiLCAxMDkxLCAxMTAsIDEwNCwgOTIsIDkKKyBDT01CT0JPWCAxMTM3LCAxMTAsIDExNCwgOTIsIDY4LCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBDQlNfSEFTU1RSSU5HUyB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCisgREVGUFVTSEJVVFRPTiAiU2FsdmFyICZDb21vIiwgMSwgMjA4LCA2LCA1NiwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJDYW5jZWxhciIsIDIsIDIwOCwgMjQsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiJkFqdWRhIiwgMTAzOCwgMjA4LCA0NiwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBDSEVDS0JPWCAiJlNvbWVudGUgTGVpdHVyYSIsIDEwNDAsIDIwOCwgNjgsIDUwLCAxMiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCit9CisKKworUFJJTlQgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMzYsIDI0LCAyNjQsIDEzNAorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK0NBUFRJT04gIkltcHJpbWlyIgorRk9OVCA4LCAiSGVsdiIKK3sKKyBMVEVYVCAiSW1wcmVzc29yYToiLCAxMDg4LCA2LCA2LCA0MCwgOQorIExURVhUICIiLCAxMDg5LCA2MCwgNiwgMTUwLCA5CisgR1JPVVBCT1ggIkZhaXhhIGRlIEltcHJlc3PjbyIsIDEwNzIsIDYsIDMwLCAxNjAsIDY1LCBCU19HUk9VUEJPWAorIFJBRElPQlVUVE9OICImVHVkbyIsIDEwNTYsIDE2LCA0NSwgNjAsIDEyCisgUkFESU9CVVRUT04gIlMmZWxl5+NvIiwgMTA1NywgMTYsIDYwLCA2MCwgMTIKKyBSQURJT0JVVFRPTiAiJlDhZ2luYXMiLCAxMDU4LCAxNiwgNzUsIDYwLCAxMgorIERFRlBVU0hCVVRUT04gIkltcHJpbWlyIiwgMSwgMjA2LCA2LCA1NiwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJDYW5jZWxhciIsIDIsIDIwNiwgMjQsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiJkNvbmZpZ3VyYXIiLCAxMDI0LCAyMDYsIDQ2LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIExURVhUICImRGU6IiwgMTA5MCwgNjAsIDgwLCAzMCwgOQorIExURVhUICImQXRlOiIsIDEwOTEsIDEyMCwgODAsIDMwLCA5CisgTFRFWFQgIiZRdWFsaWRhZGUgZGUgSW1wcmVzc+NvOiIsIDEwOTIsIDYsIDEwMCwgNzYsIDkKKyBDT01CT0JPWCAxMTM2LCA4MCwgMTAwLCA5MiwgNjgsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfT1dORVJEUkFXRklYRUQgfCBDQlNfQVVUT0hTQ1JPTEwgfCBDQlNfU09SVCB8IENCU19IQVNTVFJJTkdTIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AKKyBDSEVDS0JPWCAiSW1wcmltaXIgcGFyYSBBcnF1aXZvIiwgMTA0MCwgMjAsIDEwMCwgNTAsIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBDSEVDS0JPWCAiQyZvbmRlbnNhZG8iLCAxMDQxLCAxNjAsIDEwMCwgNTAsIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKK30KKworCitQUklOVF9TRVRVUCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDI2NCwgMTM0CitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiQ29uZmlndXJh5/VlcyBkZSBJbXByZXNz428iCitGT05UIDgsICJIZWx2IgoreworIEdST1VQQk9YICJJbXByZXNzb3JhIiwgMTA3MiwgNiwgMTAsIDE4MCwgNjUsIEJTX0dST1VQQk9YCisgUkFESU9CVVRUT04gIiZJbXByZXNzb3JhIFBhZHLjbyIsIDEwNTYsIDE2LCAyMCwgODAsIDEyCisgTFRFWFQgIltub25lXSIsIDEwODgsIDM1LCAzNSwgMTIwLCA5CisgUkFESU9CVVRUT04gIkltcHJlc3NvcmEgJkVzcGVj7WZpY2EiLCAxMDU3LCAxNiwgNTAsIDgwLCAxMgorIENPTUJPQk9YIDExMzYsIDM1LCA2NSwgMTQ5LCA2OCwgQ0JTX0RST1BET1dOTElTVCB8IENCU19PV05FUkRSQVdGSVhFRCB8IENCU19BVVRPSFNDUk9MTCB8IENCU19TT1JUIHwgQ0JTX0hBU1NUUklOR1MgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorIERFRlBVU0hCVVRUT04gIk9rIiwgMSwgMjA2LCA2LCA1NiwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJDYW5jZWxhciIsIDIsIDIwNiwgMjQsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiJkNvbmZpZ3VyYXIiLCAxMDI0LCAyMDYsIDQ2LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIEdST1VQQk9YICJPcmllbnRh5+NvIiwgMTA3MywgNiwgODUsIDEwMCwgNTAsIEJTX0dST1VQQk9YCisgUkFESU9CVVRUT04gIiZSZXRyYXRvIiwgMTA1OCwgNTAsIDEwMCwgNDAsIDEyCisgUkFESU9CVVRUT04gIiZQYWlzYWdlbSIsIDEwNTksIDUwLCAxMTUsIDQwLCAxMgorIElDT04gIkxBTkRTQ0FQIiwgMTA5NywgMTAsIDk1LCAzMiwgMzIKKyBJQ09OICJQT1JUUkFJVCIsIDEwOTgsIDEwLCA5NSwgMzIsIDMyCisgR1JPVVBCT1ggIlBhcGVsIiwgMTA3NCwgMTIwLCA4NSwgMTgwLCA1MCwgQlNfR1JPVVBCT1gKKyBMVEVYVCAiJlRhbWFuaG8iLCAxMDg5LCAxMzAsIDk1LCAzMCwgOQorIExURVhUICImRm9udGUgZGUgQWxpbWVudGHn428iLCAxMDkwLCAxMzAsIDExMCwgMzAsIDkKKyBDT01CT0JPWCAxMTM3LCAxNTUsIDk1LCA5MiwgNjgsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfT1dORVJEUkFXRklYRUQgfCBDQlNfQVVUT0hTQ1JPTEwgfCBDQlNfU09SVCB8IENCU19IQVNTVFJJTkdTIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AKKyBDT01CT0JPWCAxMTM4LCAxNTUsIDExMCwgOTIsIDY4LCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBDQlNfSEFTU1RSSU5HUyB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCit9CisKKworQ0hPT1NFX0ZPTlQgRElBTE9HIERJU0NBUkRBQkxFICAxMywgNTQsIDI2NCwgMTQ3CitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiRm9udGUiCitGT05UIDgsICJIZWx2IgoreworICAgIExURVhUICAgICAgICAgICAiJkZvbnRlOiIsMTA4OCAsNiwzLDQwLDkKKyAgICBDT01CT0JPWCAgICAgICAgMTEzNiAsNiwxMyw5NCw1NCwgIENCU19PV05FUkRSQVdGSVhFRCB8IENCU19IQVNTVFJJTkdTIHwgQ0JTX0RJU0FCTEVOT1NDUk9MTCB8CisgICAgICAgICAgICAgICAgICAgIENCU19BVVRPSFNDUk9MTCB8IENCU19TT1JUIHwgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AgfCBDQlNfU0lNUExFCisgICAgTFRFWFQgICAgICAgICAgICImRXN0aWxvIGRhIEZvbnRlOiIsMTA4OSAsMTA4LDMsNDQsOQorICAgIENPTUJPQk9YICAgICAgICAxMTM3LDEwOCwxMyw2NCw1NCwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0hBU1NUUklOR1MgfCBDQlNfRElTQUJMRU5PU0NST0xMIHwKKyAgICAgICAgICAgICAgICAgICAgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AgfCBDQlNfU0lNUExFCisgICAgTFRFWFQgICAgICAgICAgICImVGFtYW5obzoiLDEwOTAsMTc5LDMsMzAsOQorICAgIENPTUJPQk9YICAgICAgICAxMTM4LDE3OSwxMywzMiw1NCwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0hBU1NUUklOR1MgfCBDQlNfRElTQUJMRU5PU0NST0xMIHwKKyAgICAgICAgICAgICAgICAgICAgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AgfCBDQlNfU0lNUExFIHwgQ0JTX1NPUlQKKyAgICBERUZQVVNIQlVUVE9OICAgIk9LIixJRE9LLDIxOCw2LDQwLDE0LFdTX0dST1VQCisgICAgUFVTSEJVVFRPTiAgICAgICJDYW5jZWxhciIsSURDQU5DRUwsMjE4LDIzLDQwLDE0LFdTX0dST1VQCisgICAgUFVTSEJVVFRPTiAgICAgICImQXBsaWNhciIsIDEwMjYsMjE4LDQwLDQwLDE0LFdTX0dST1VQCisgICAgUFVTSEJVVFRPTiAgICAgICJBJmp1ZGEiICwgMTAzOCwyMTgsNTcsNDAsMTQsV1NfR1JPVVAKKyAgICBHUk9VUEJPWCAgICAgICAgIkVmZWl0b3MiLDEwNzIsNiw3Miw4NCwzNCxXU19HUk9VUAorICAgIENIRUNLQk9YCSAgICAiJlJpc2NhZG8iLCAxMDQwLCAxMCw4Miw1MCwxMCwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfVEFCU1RPUAorICAgIENIRUNLQk9YIAkgICAgIiZTdWJsaW5oYWRvIiwgMTA0MSwgMTAsOTQsNTAsMTAsIEJTX0FVVE9DSEVDS0JPWCAKKyAgICBMVEVYVCAgICAgICAgICAgIiZDb3I6IiwgMTA5MSAsNiwxMTAsMzAsOQorICAgIENPTUJPQk9YICAgICAgICAxMTM5LDYsMTIwLDg0LDEwMCxDQlNfRFJPUERPV05MSVNUIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0hBU1NUUklOR1MgfAorCQkgICAgQ0JTX0FVVE9IU0NST0xMIHwgIFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCisgICAgR1JPVVBCT1ggICAgICAgICJBbW9zdHJhIiwxMDczLDk4LDcyLDE2MCw0OSxXU19HUk9VUAorICAgIENURVhUICAgICAgICAgICAiQWFCYll5WnoiLDEwOTMsMTA0LDgxLDE0OSwzNyxTU19OT1BSRUZJWCB8IFdTX1ZJU0lCTEUKK30KKworCitDSE9PU0VfQ09MT1IgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMzYsIDI0LCAzMDAsIDIwMAorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK0NBUFRJT04gIkNvciIKK0ZPTlQgOCwgIkhlbHYiCit7CisgTFRFWFQgIkNvcmVzICZC4XNpY2FzOiIsICAgMTA4OCwgNCwgICAgNCwgIDE0MCwgMTAKKyBMVEVYVCAiJkNvcmVzIGRvIFVzdeFyaW86IiwgIDEwODksIDQsICAgMTA2LCAxNDAsIDEwCisgTFRFWFQgIkNvbG9yaWRvfFPzbGlkJm8iLCAgMTA5MCwgMTUwLCAxNTEsICA0OCwgMTAKKyBMVEVYVCAgICJWZXImbWVsaG86IiwgNzI2IC8qMTA5NCovLDI0OSwxMjYsMjQsMTAKKyBFRElUVEVYVCA3MDYsIDI3NSwxMjQsMTgsMTIsIFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIExURVhUICAgIiZWZXJkZToiLDcyNy8qMTA5NSovLDI0OSwxNDAsMjQsMTAKKyBFRElUVEVYVCA3MDcsIDI3NSwxMzgsMTgsMTIsIFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIExURVhUICAgIkEmenVsOiIsNzI4IC8qMTA5NiovLDI0OSwxNTQsMjQsMTAKKyBFRElUVEVYVCA3MDgsIDI3NSwxNTIsMTgsMTIsIFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIExURVhUICAiTWF0Jml6OiIgLDcyMyAvKjEwOTEqLywyMDIsMTI2LDIyLDEwCisgRURJVFRFWFQgNzAzLCAyMjYsMTI0LDE4LDEyLCBXU19CT1JERVIgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAgIlNhJnQ6IiAsNzI0IC8qMTA5MiovLDIwMiwxNDAsMjIsMTAKKyBFRElUVEVYVCA3MDQsIDIyNiwxMzgsMTgsMTIsIFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIExURVhUICAiJkx1bToiICw3MjUgLyoxMDkzKi8sMjAyLDE1NCwyMiwxMAorIEVESVRURVhUIDcwNSwgMjI2LDE1MiwxOCwxMiwgV1NfQk9SREVSIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ09OVFJPTCAiIiAsNzIwLCJTVEFUSUMiLFNTX1NJTVBMRXxXU19UQUJTVE9QfFdTX0dST1VQLDQsMTQsMTQwLDg2CisgQ09OVFJPTCAiIiAsNzIxLCJTVEFUSUMiLFNTX1NJTVBMRXxXU19UQUJTVE9QfFdTX0dST1VQLDQsMTE2LDE0MCwyOAorIENPTlRST0wgIiIgLDcxMCwiU1RBVElDIixXU19CT1JERVJ8U1NfU0lNUExFfFdTX1RBQlNUT1B8V1NfR1JPVVAsIDE1Miw0LDExOCwxMTYKKyBDT05UUk9MICIiICw3MDIsIlNUQVRJQyIsU1NfU0lNUExFfFdTX1RBQlNUT1B8V1NfR1JPVVAsIDI3OCw0LDgsMTE2CisgQ09OVFJPTCAiIiAsNzA5LCJTVEFUSUMiLFNTX1NJTVBMRXxXU19UQUJTVE9QfFdTX0dST1VQLCAxNTIsMTI0LDQwLDI2CisgREVGUFVTSEJVVFRPTiAiT2siLCAgMSwgIDQsIDE2NiwgNDQsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiQ2FuY2VsYXIiLCAyLCA1MiwgMTY2LCA0NCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIkFqJnVkYSIsIDEwMzgsMTAwLDE2NiwgNDQsIDE0CisgUFVTSEJVVFRPTiAiJkFkaWNpb25hciBDb3IiLCAgICA3MTIvKjEwMjQqLywgMTUyLCAxNjYsIDE0MiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIiZEZWZpbmlyIENvcmVzIFBlcnNvbmFsaXphZGFzID4+IiwgNzE5LyoxMDI1Ki8sICAgNCwgMTUwLCAxNDIsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICAiJm8iLDcxMywzMDAsMjAwLDQsMTQgICAvKiBqdXN0IGEgZHVtbXk6ICAnbycgaXMgIGxpa2UgICZvICBpbiAic29saWQmbyIgICovCit9CisKKworRklORF9URVhUIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjM2LCA2MgorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK0NBUFRJT04gIlByb2N1cmFyIgorRk9OVCA4LCAiSGVsdiIKK3sKKyBMVEVYVCAiJlByb2N1cmFyOiIsIC0xLCA0LCA4LCA0MiwgOAorIEVESVRURVhUIDExNTIsIDQ3LCA3LCAxMjgsIDEyLCBFU19BVVRPSFNDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIENIRUNLQk9YICJQYWxhdnJhICZJbnRlaXJhIiwgMTA0MCwgNCwgMjYsIDEwMCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIENIRUNLQk9YICImTWFp+nNjdWxhcy9taW51c2N1bGFzIiwgMTA0MSwgNCwgNDIsIDY0LCAxMiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfVEFCU1RPUAorIEdST1VQQk9YICJEaXJl5+NvIiwgMTA3MiwgMTA3LCAyNiwgNjgsIDI4CisgQ09OVFJPTCAiQSZjaW1hIiwgMTA1NiwgIkJVVFRPTiIsIEJTX0FVVE9SQURJT0JVVFRPTiB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUCwgMTExLCAzOCwgMjAsIDEyCisgQ09OVFJPTCAiQSZiYWl4byIsIDEwNTcsICJCVVRUT04iLCBCU19BVVRPUkFESU9CVVRUT04gfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QLCAxMzgsIDM4LCAzMCwgMTIKKyBERUZQVVNIQlVUVE9OICJQcm9jdXJhciBhIFBy8yZ4aW1hIiwgMSwgMTgyLCA1LCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIkNhbmNlbGFyIiwgMiwgMTgyLCAyMywgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJBJmp1ZGEiLCAxMDM4LCAxODIsIDQ1LCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorfQorCisKK1JFUExBQ0VfVEVYVCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDIzMCwgOTQKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICJBbHRlcmFyIgorRk9OVCA4LCAiSGVsdiIKK3sKKyBMVEVYVCAiJlByb2N1cmFyOiIsIC0xLCA0LCA5LCA0OCwgOAorIEVESVRURVhUIDExNTIsIDU0LCA3LCAxMTQsIDEyLCBFU19BVVRPSFNDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIExURVhUICJBbHRlcmFyIFBhJnJhOiIsIC0xLCA0LCAyNiwgNDgsIDgKKyBFRElUVEVYVCAxMTUzLCA1NCwgMjQsIDExNCwgMTIsIEVTX0FVVE9IU0NST0xMIHwgV1NfQk9SREVSIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ0hFQ0tCT1ggIlBhbGF2cmEgJmludGVpcmEiLCAxMDQwLCA1LCA0NiwgMTA0LCAxMiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ0hFQ0tCT1ggIiZNYWn6c2N1bGFzL21pbvpzY3VsYXMiLCAxMDQxLCA1LCA2MiwgNTksIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19UQUJTVE9QCisgREVGUFVTSEJVVFRPTiAiUHJvY3VyYXIgYSBQcvMmeGltYSIsIDEsIDE3NCwgNCwgNTAsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiJkFsdGVyYXIiLCAxMDI0LCAxNzQsIDIxLCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIkFsdGVyYXIgJlRvZGFzIiwgMTAyNSwgMTc0LCAzOCwgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICJDYW5jZWxhciIsIDIsIDE3NCwgNTUsIDUwLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiQSZqdWRhIiwgMTAzOCwgMTc0LCA3NSwgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKK30KZGlmZiAtLWdpdCBhL3dpbjMyL2NvZGVfcGFnZS5jIGIvd2luMzIvY29kZV9wYWdlLmMKaW5kZXggOTUxODc0Yy4uYzliMGY5ZiAxMDA2NDQKLS0tIGEvd2luMzIvY29kZV9wYWdlLmMKKysrIGIvd2luMzIvY29kZV9wYWdlLmMKQEAgLTY3LDYgKzY3LDIyIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIElzVmFsaWRDb2RlUGFnZSAgIChLRVJORUwzMi4zNjApCisgKi8KK0JPT0wzMiBJc1ZhbGlkQ29kZVBhZ2UoVUlOVDMyIENvZGVQYWdlKQoreworICAgIHN3aXRjaCAoIENvZGVQYWdlICkKKyAgICB7CisgICAgY2FzZSAxMjUyIDoKKyAgICBjYXNlIDQzNyA6CisgICAgICAgIHJldHVybiBUUlVFOworICAgIGRlZmF1bHQgOgorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIgICAgICAgICAgICAgICAgKEtFUk5FTDMyLjM5MikKICAqLwogaW50IE11bHRpQnl0ZVRvV2lkZUNoYXIoVUlOVDMyIHBhZ2UsIERXT1JEIGZsYWdzLCBjaGFyICpzcmMsIGludCBzcmNsZW4sCmRpZmYgLS1naXQgYS93aW4zMi9jb25zb2xlLmMgYi93aW4zMi9jb25zb2xlLmMKaW5kZXggNjNlNWZhNC4uNjg4OWI1ZiAxMDA2NDQKLS0tIGEvd2luMzIvY29uc29sZS5jCisrKyBiL3dpbjMyL2NvbnNvbGUuYwpAQCAtMjA3LDMgKzIwNywxMSBAQAogICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB0aXRsZUEgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgIEZsdXNoQ29uc29sZUlucHV0QnVmZmVyICAgKEtFUk5FTDMyLjEzMikKKyAqLworQk9PTDMyIEZsdXNoQ29uc29sZUlucHV0QnVmZmVyKEhBTkRMRTMyIGhDb25zb2xlSW5wdXQpeworICAgIGZwcmludGYoc3RkZXJyLCJGbHVzaENvbnNvbGVJbnB1dEJ1ZmZlciglZClcbiIsaENvbnNvbGVJbnB1dCk7CisgICAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS93aW4zMi9rMzJvYmouYyBiL3dpbjMyL2szMm9iai5jCmluZGV4IGJjYjA1NjUuLjk0NGVjZDcgMTAwNjQ0Ci0tLSBhL3dpbjMyL2szMm9iai5jCisrKyBiL3dpbjMyL2szMm9iai5jCkBAIC05NywxMCArOTcsMTAgQEAKICAqLwogQk9PTDMyIEszMk9CSl9BZGROYW1lKCBLMzJPQkogKm9iaiwgTFBDU1RSIG5hbWUgKQogewotICAgIE5BTUVfRU5UUlkgKmVudHJ5ID0gSzMyT0JKX0ZpcnN0RW50cnk7CisgICAgTkFNRV9FTlRSWSAqZW50cnk7CiAgICAgVUlOVDMyIGxlbiA9IHN0cmxlbiggbmFtZSApOwogCi0gICAgaWYgKCEoZW50cnkgPSBIZWFwQWxsb2MoIFN5c3RlbUhlYXAsIDAsIHNpemVvZihlbnRyeSkgKyBsZW4gKSkpCisgICAgaWYgKCEoZW50cnkgPSBIZWFwQWxsb2MoIFN5c3RlbUhlYXAsIDAsIHNpemVvZihOQU1FX0VOVFJZKSArIGxlbiApKSkKICAgICB7CiAgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfT1VUT0ZNRU1PUlkgKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwpkaWZmIC0tZ2l0IGEvd2luMzIvcHJvY2Vzcy5jIGIvd2luMzIvcHJvY2Vzcy5jCmluZGV4IDU4ZjhkYzMuLjcxNzhiZjcgMTAwNjQ0Ci0tLSBhL3dpbjMyL3Byb2Nlc3MuYworKysgYi93aW4zMi9wcm9jZXNzLmMKQEAgLTEwLDQwICsxMCwyOTggQEAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKICNpbmNsdWRlICJoZWFwLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCiAjaW5jbHVkZSAiaGFuZGxlMzIuaCIKICNpbmNsdWRlICJwZV9pbWFnZS5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAordHlwZWRlZiBzdHJ1Y3QgeworCUszMk9CSgloZWFkZXI7CisJRFdPUkQJbWF4Y291bnQ7CisJRFdPUkQJY291bnQ7CisJRFdPUkQJaW5pdGlhbDsKK30gSzMyU0VNQVBIT1JFOworCit0eXBlZGVmIHN0cnVjdCB7CisJSzMyT0JKCWhlYWRlcjsKKwlUSERCCSpvd25pbmdfdGhyZWFkOyAvKiB3ZSBhcmUgbG9ja2VkIGJ5IHRoaXMgdGhyZWFkICovCit9IEszMk1VVEVYOworCit0eXBlZGVmIHN0cnVjdCB7CisJSzMyT0JKCWhlYWRlcjsKK30gSzMyRVZFTlQ7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENyZWF0ZU11dGV4QSAgICAoS0VSTkVMMzIuNTIpCiAgKi8KLUhBTkRMRTMyIENyZWF0ZU11dGV4QSAoU0VDVVJJVFlfQVRUUklCVVRFUyAqc2EsIEJPT0wzMiBvbiwgY29uc3QgY2hhciAqYSkKK0hBTkRMRTMyIENyZWF0ZU11dGV4MzJBKFNFQ1VSSVRZX0FUVFJJQlVURVMgKnNhLEJPT0wzMiBvbixMUENTVFIgbmFtZSkKIHsKKwlLMzJNVVRFWAkqbXV0OworCUhBTkRMRTMyCWhhbmRsZTsKKwlLMzJPQkogCQkqb2JqID0gSzMyT0JKX0ZpbmROYW1lKCBuYW1lICk7CisKKwlpZiAob2JqKSB7CisJCWlmIChvYmotPnR5cGUgPT0gSzMyT0JKX01VVEVYKSB7CisJCQlTZXRMYXN0RXJyb3IoIEVSUk9SX0FMUkVBRFlfRVhJU1RTICk7CisJCQlyZXR1cm4gUFJPQ0VTU19BbGxvY0hhbmRsZSggb2JqLDAgKTsKKwkJfQorCQlTZXRMYXN0RXJyb3IoIEVSUk9SX0RVUF9OQU1FICk7CisJCXJldHVybiAwOworCX0KKwltdXQgPSAoSzMyTVVURVgqKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKEszMk1VVEVYKSk7CisJbXV0LT5oZWFkZXIudHlwZSA9IEszMk9CSl9NVVRFWDsKKwltdXQtPmhlYWRlci5yZWZjb3VudCAgPSAxOworCW11dC0+b3duaW5nX3RocmVhZCA9IE5VTEw7CisJaWYgKG5hbWUpCisJCUszMk9CSl9BZGROYW1lKCYobXV0LT5oZWFkZXIpLG5hbWUpOworCWhhbmRsZSA9IFBST0NFU1NfQWxsb2NIYW5kbGUoJihtdXQtPmhlYWRlciksMCk7CisJaWYgKGhhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRTMyKSB7CisJCWlmIChvbikKKwkJCW11dC0+b3duaW5nX3RocmVhZCA9IChUSERCICopR2V0Q3VycmVudFRocmVhZElkKCk7CisJCXJldHVybiBoYW5kbGU7CisJfQorCUszMk9CSl9EZWNDb3VudCgmKG11dC0+aGVhZGVyKSk7IC8qIGFsc28gZnJlZXMgbmFtZSAqLworCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxtdXQpOwogCXJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDcmVhdGVNdXRleFcgICAgKEtFUk5FTDMyLjUzKQorICovCitIQU5ETEUzMiBDcmVhdGVNdXRleDMyVyhTRUNVUklUWV9BVFRSSUJVVEVTICpzYSwgQk9PTDMyIG9uLCBMUENXU1RSIGEpCit7CisJTFBTVFIJCW5hbWUgPSBhP0hFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLDAsYSk6TlVMTDsKKwlIQU5ETEUzMglyZXQ7CisKKwlyZXQgPSBDcmVhdGVNdXRleDMyQShzYSxvbixuYW1lKTsKKwlpZiAobmFtZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLG5hbWUpOworCXJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENyZWF0ZVNlbWFwaG9yZUEgICAgKEtFUk5FTDMyLjYwKQorICovCitIQU5ETEUzMiBDcmVhdGVTZW1hcGhvcmUzMkEoCisJTFBTRUNVUklUWV9BVFRSSUJVVEVTIHNhLExPTkcgaW5pdGlhbCxMT05HIG1heCxMUENTVFIgbmFtZQorKSB7CisJSzMyU0VNQVBIT1JFCSpzZW07CisJSEFORExFMzIJaGFuZGxlOworCUszMk9CSiAJCSpvYmogPSBLMzJPQkpfRmluZE5hbWUoIG5hbWUgKTsKKworCWlmIChvYmopIHsKKwkJaWYgKG9iai0+dHlwZSA9PSBLMzJPQkpfU0VNQVBIT1JFKSB7CisJCQlTZXRMYXN0RXJyb3IoIEVSUk9SX0FMUkVBRFlfRVhJU1RTICk7CisJCQlyZXR1cm4gUFJPQ0VTU19BbGxvY0hhbmRsZSggb2JqLDAgKTsKKwkJfQorCQlTZXRMYXN0RXJyb3IoIEVSUk9SX0RVUF9OQU1FICk7CisJCXJldHVybiAwOworCX0KKwlzZW0gPSAoSzMyU0VNQVBIT1JFKilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZihLMzJTRU1BUEhPUkUpKTsKKwlzZW0tPmhlYWRlci50eXBlID0gSzMyT0JKX1NFTUFQSE9SRTsKKwlzZW0tPmhlYWRlci5yZWZjb3VudCAgPSAxOworCisJc2VtLT5tYXhjb3VudCAJPSBtYXg7CisJc2VtLT5jb3VudAk9IGluaXRpYWw7CisJc2VtLT5pbml0aWFsCT0gaW5pdGlhbDsKKwlpZiAobmFtZSkKKwkJSzMyT0JKX0FkZE5hbWUoJihzZW0tPmhlYWRlciksbmFtZSk7CisJaGFuZGxlID0gUFJPQ0VTU19BbGxvY0hhbmRsZSgmKHNlbS0+aGVhZGVyKSwwKTsKKwlpZiAoaGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFMzIpCisJCXJldHVybiBoYW5kbGU7CisJSzMyT0JKX0RlY0NvdW50KCYoc2VtLT5oZWFkZXIpKTsgLyogYWxzbyBmcmVlcyBuYW1lICovCisJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHNlbSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENyZWF0ZVNlbWFwaG9yZVcgICAgKEtFUk5FTDMyLjYxKQorICovCitIQU5ETEUzMiBDcmVhdGVTZW1hcGhvcmUzMlcoU0VDVVJJVFlfQVRUUklCVVRFUyAqc2EsTE9ORyBpbml0aWFsLExPTkcgbWF4LExQQ1dTVFIgYSkKK3sKKwlMUFNUUgkJbmFtZSA9YT9IRUFQX3N0cmR1cFd0b0EoR2V0UHJvY2Vzc0hlYXAoKSwwLGEpOk5VTEw7CisJSEFORExFMzIJcmV0OworCisJcmV0ID0gQ3JlYXRlU2VtYXBob3JlMzJBKHNhLGluaXRpYWwsbWF4LG5hbWUpOworCWlmIChhKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsbmFtZSk7CisJcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBPcGVuU2VtYXBob3JlQSAgICAoS0VSTkVMMzIuNDAzKQorICovCitIQU5ETEUzMiBPcGVuU2VtYXBob3JlMzJBKERXT1JEIGRlc2lyZWQsQk9PTDMyIGluaGVyaXQsTFBDU1RSIG5hbWUpCit7CisJSzMyT0JKIAkJKm9iaiA9IEszMk9CSl9GaW5kTmFtZSggbmFtZSApOworCisJaWYgKG9iaikgeworCQlpZiAob2JqLT50eXBlID09IEszMk9CSl9TRU1BUEhPUkUpCisJCQlyZXR1cm4gUFJPQ0VTU19BbGxvY0hhbmRsZSggb2JqLDAgKTsKKwkJU2V0TGFzdEVycm9yKCBFUlJPUl9EVVBfTkFNRSApOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE9wZW5TZW1hcGhvcmVBICAgIChLRVJORUwzMi40MDQpCisgKi8KK0hBTkRMRTMyIE9wZW5TZW1hcGhvcmUzMlcoRFdPUkQgZGVzaXJlZCxCT09MMzIgaW5oZXJpdCxMUENXU1RSIG5hbWUpCit7CisJTFBTVFIJbmFtZUEgPSBuYW1lP0hFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLDAsbmFtZSk6TlVMTDsKKwlIQU5ETEUzMglyZXQgPSBPcGVuU2VtYXBob3JlMzJBKGRlc2lyZWQsaW5oZXJpdCxuYW1lQSk7CisKKwlpZiAobmFtZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLG5hbWVBKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBSZWxlYXNlU2VtYXBob3JlICAgIChLRVJORUwzMi40MDMpCisgKi8KK0JPT0wzMiBSZWxlYXNlU2VtYXBob3JlKEhBTkRMRTMyIGhTZW1hcGhvcmUsTE9ORyBsUmVsZWFzZUNvdW50LExQTE9ORyBscFByZXZpb3VzQ291bnQpIHsKKwlLMzJTRU1BUEhPUkUJKnNlbTsKKworCXNlbSA9IChLMzJTRU1BUEhPUkUqKVBST0NFU1NfR2V0T2JqUHRyKGhTZW1hcGhvcmUsSzMyT0JKX1NFTUFQSE9SRSk7CisJaWYgKCFzZW0pCisJCXJldHVybiBGQUxTRTsKKwlpZiAobHBQcmV2aW91c0NvdW50KSAqbHBQcmV2aW91c0NvdW50ID0gc2VtLT5jb3VudDsKKwlzZW0tPmNvdW50ICs9IGxSZWxlYXNlQ291bnQ7CisJaWYgKHNlbS0+Y291bnQ+c2VtLT5tYXhjb3VudCkgeworCQlmcHJpbnRmKHN0ZGVyciwiUmVsZWFzZVNlbWFwaG9yZSglZCwlbGQsLiksIHJlbGVhc2VkIG1vcmUgdGhlbiBwb3NzaWJsZT8/XG4iLGhTZW1hcGhvcmUsbFJlbGVhc2VDb3VudCk7CisJCXNlbS0+Y291bnQgPSBzZW0tPm1heGNvdW50OworCX0KKworCS8qIEZJWE1FOiB3YWtlIHVwIGFsbCB0aHJlYWRzIGJsb2NrZWQgb24gdGhhdCBzZW1hcGhvcmUgKi8KKworCUszMk9CSl9EZWNDb3VudCgmKHNlbS0+aGVhZGVyKSk7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE9wZW5NdXRleEEgICAgKEtFUk5FTDMyLjM5OSkKKyAqLworSEFORExFMzIgT3Blbk11dGV4MzJBKERXT1JEIGRlc2lyZWRhY2Nlc3MsIEJPT0wzMiBpbmhlcml0aGFuZGxlLCBMUENTVFIgbmFtZSkKK3sKKwlLMzJPQkogCQkqb2JqID0gSzMyT0JKX0ZpbmROYW1lKCBuYW1lICk7CisKKwlpZiAob2JqKSB7CisJCWlmIChvYmotPnR5cGUgPT0gSzMyT0JKX01VVEVYKQorCQkJcmV0dXJuIFBST0NFU1NfQWxsb2NIYW5kbGUoIG9iaiwwICk7CisJCVNldExhc3RFcnJvciggRVJST1JfRFVQX05BTUUgKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBPcGVuTXV0ZXhXICAgIChLRVJORUwzMi40MDApCisgKi8KK0hBTkRMRTMyIE9wZW5NdXRleDMyVyhEV09SRCBkZXNpcmVkYWNjZXNzLCBCT09MMzIgaW5oZXJpdGhhbmRsZSwgTFBDV1NUUiBuYW1lKQoreworCUxQU1RSCQluYW1lQT1uYW1lP0hFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLDAsbmFtZSk6TlVMTDsKKwlIQU5ETEUzMglyZXQgPSBPcGVuTXV0ZXgzMkEoZGVzaXJlZGFjY2Vzcyxpbmhlcml0aGFuZGxlLG5hbWVBKTsKKworCWlmIChuYW1lKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsbmFtZUEpOworCXJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFJlbGVhc2VNdXRleCAgICAoS0VSTkVMMzIuNDM1KQogICovCiBCT09MMzIgUmVsZWFzZU11dGV4IChIQU5ETEUzMiBoKQogewotCXJldHVybiAwOworCUszMk1VVEVYCSptdXQgPSAoSzMyTVVURVgqKVBST0NFU1NfR2V0T2JqUHRyKGgsSzMyT0JKX01VVEVYKTsKKworCWlmICghbXV0KQorCQlyZXR1cm4gMDsKKwlpZiAobXV0LT5vd25pbmdfdGhyZWFkICE9IChUSERCICopR2V0Q3VycmVudFRocmVhZElkKCkpIHsKKwkJLyogc2V0IGVycm9yIC4uLiAqLworCQlLMzJPQkpfRGVjQ291bnQoJihtdXQtPmhlYWRlcikpOworCQlyZXR1cm4gMDsKKwl9CisJbXV0LT5vd25pbmdfdGhyZWFkID0gTlVMTDsKKworCS8qIEZJWE1FOiB3YWtlIHVwIGFsbCB0aHJlYWRzIGJsb2NrZWQgb24gdGhpcyBtdXRleCAqLworCisJSzMyT0JKX0RlY0NvdW50KCYobXV0LT5oZWFkZXIpKTsKKwlyZXR1cm4gVFJVRTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ3JlYXRlRXZlbnRBICAgIChLRVJORUwzMi40MykKICAqLwotSEFORExFMzIgQ3JlYXRlRXZlbnRBIChTRUNVUklUWV9BVFRSSUJVVEVTICpzYSwgQk9PTDMyIGF1LCBCT09MMzIgb24sIGNvbnN0IGNoYXIKLSpuYW1lKQorSEFORExFMzIgQ3JlYXRlRXZlbnQzMkEoU0VDVVJJVFlfQVRUUklCVVRFUyAqc2EsQk9PTDMyIGF1LEJPT0wzMiBvbixMUENTVFIgbmFtZSkKIHsKKwlLMzJFVkVOVAkqZXZ0OworCUhBTkRMRTMyCWhhbmRsZTsKKwlLMzJPQkogCQkqb2JqID0gSzMyT0JKX0ZpbmROYW1lKCBuYW1lICk7CisKKwlpZiAob2JqKSB7CisJCWlmIChvYmotPnR5cGUgPT0gSzMyT0JKX0VWRU5UKSB7CisJCQlTZXRMYXN0RXJyb3IoIEVSUk9SX0FMUkVBRFlfRVhJU1RTICk7CisJCQlyZXR1cm4gUFJPQ0VTU19BbGxvY0hhbmRsZSggb2JqLDAgKTsKKwkJfQorCQlTZXRMYXN0RXJyb3IoIEVSUk9SX0RVUF9OQU1FICk7CisJCXJldHVybiAwOworCX0KKwlldnQgPSAoSzMyRVZFTlQqKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKEszMkVWRU5UKSk7CisJZXZ0LT5oZWFkZXIudHlwZSA9IEszMk9CSl9FVkVOVDsKKwlldnQtPmhlYWRlci5yZWZjb3VudCAgPSAxOworCWlmIChuYW1lKQorCQlLMzJPQkpfQWRkTmFtZSgmKGV2dC0+aGVhZGVyKSxuYW1lKTsKKwloYW5kbGUgPSBQUk9DRVNTX0FsbG9jSGFuZGxlKCYoZXZ0LT5oZWFkZXIpLDApOworCWlmIChoYW5kbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMikKKwkJcmV0dXJuIGhhbmRsZTsKKwlLMzJPQkpfRGVjQ291bnQoJihldnQtPmhlYWRlcikpOyAvKiBhbHNvIGZyZWVzIG5hbWUgKi8KKwlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsZXZ0KTsKIAlyZXR1cm4gMDsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ3JlYXRlRXZlbnRXICAgIChLRVJORUwzMi40MykKKyAqLworSEFORExFMzIgQ3JlYXRlRXZlbnQzMlcoU0VDVVJJVFlfQVRUUklCVVRFUyAqc2EsIEJPT0wzMiBhdSwgQk9PTDMyIG9uLExQQ1dTVFIgbmFtZSkKK3sKKwlMUFNUUiBuYW1lQT1uYW1lP0hFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLDAsbmFtZSk6TlVMTDsKKwlIQU5ETEUzMiByZXQgPSBDcmVhdGVFdmVudDMyQShzYSxhdSxvbixuYW1lQSk7CisKKwlpZiAobmFtZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLG5hbWVBKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBPcGVuRXZlbnRBICAgIChLRVJORUwzMi4zOTQpCisgKi8KK0hBTkRMRTMyIE9wZW5FdmVudDMyQShEV09SRCBkZXNpcmVkYWNjZXNzLEJPT0wzMiBpbmhlcml0aGFuZGxlLExQQ1NUUiBuYW1lKSB7CisJSzMyT0JKIAkJKm9iaiA9IEszMk9CSl9GaW5kTmFtZSggbmFtZSApOworCisJaWYgKG9iaikgeworCQlpZiAob2JqLT50eXBlID09IEszMk9CSl9FVkVOVCkKKwkJCXJldHVybiBQUk9DRVNTX0FsbG9jSGFuZGxlKCBvYmosMCApOworCQlTZXRMYXN0RXJyb3IoIEVSUk9SX0RVUF9OQU1FICk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgT3BlbkV2ZW50VyAgICAoS0VSTkVMMzIuMzk1KQorICovCitIQU5ETEUzMiBPcGVuRXZlbnQzMlcoRFdPUkQgZGVzaXJlZGFjY2VzcyxCT09MMzIgaW5oZXJpdGhhbmRsZSxMUENXU1RSIG5hbWUpIHsKKwlMUFNUUgluYW1lQSA9IG5hbWU/SEVBUF9zdHJkdXBXdG9BKEdldFByb2Nlc3NIZWFwKCksMCxuYW1lKTpOVUxMOworCUhBTkRMRTMyCXJldCA9IE9wZW5FdmVudDMyQShkZXNpcmVkYWNjZXNzLGluaGVyaXRoYW5kbGUsbmFtZUEpOworCisJaWYgKG5hbWUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxuYW1lQSk7CisJcmV0dXJuIHJldDsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgU2V0RXZlbnQgICAgKEtFUk5FTDMyLjQ4NykKICAqLwogQk9PTDMyIFNldEV2ZW50IChIQU5ETEUzMiBoKQogeworCWZwcmludGYoc3RkZXJyLCJTZXRFdmVudCglZCkgc3R1YlxuIixoKTsKIAlyZXR1cm4gMDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNTEsMTMgKzMwOSwxNSBAQAogICovCiBCT09MMzIgUmVzZXRFdmVudCAoSEFORExFMzIgaCkKIHsKKwlmcHJpbnRmKHN0ZGVyciwiUmVzZXRFdmVudCglZCkgc3R1YlxuIixoKTsKIAlyZXR1cm4gMDsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3QgICAgKEtFUk5FTDMyLjU2MSkKICAqLwotRFdPUkQgV2FpdEZvclNpbmdsZU9iamVjdChIQU5ETEUzMiBoLCBEV09SRCBhKQorRFdPUkQgV2FpdEZvclNpbmdsZU9iamVjdChIQU5ETEUzMiBoLCBEV09SRCB0aW1lb3V0KQogeworCWZwcmludGYoc3RkZXJyLCJXYWl0Rm9yU2luZ2xlT2JqZWN0KCVkLCVsZCkgc3R1YlxuIixoLHRpbWVvdXQpOwogCXJldHVybiAwOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC02NSw4ICszMjUsOSBAQAogICovCiBCT09MMzIgRHVwbGljYXRlSGFuZGxlKEhBTkRMRTMyIGEsIEhBTkRMRTMyIGIsIEhBTkRMRTMyIGMsIEhBTkRMRTMyICogZCwgRFdPUkQgZSwgQk9PTDMyIGYsIERXT1JEIGcpCiB7CisJZnByaW50ZihzdGRlcnIsIkR1cGxpY2F0ZUhhbmRsZSglZCwlZCwlZCwlcCwlbGQsJWQsJWxkKSBzdHViXG4iLGEsYixjLGQsZSxmLGcpOwogCSpkID0gYjsKLQlyZXR1cm4gMTsKKwlyZXR1cm4gVFJVRTsKIH0KIAogCkBAIC04OSw3ICszNTAsNyBAQAogCX0KIAkvKiBPYnRhaW4gbW9kdWxlIGhhbmRsZSBhbmQgY2FsbCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiAqLwogI2lmbmRlZiBXSU5FTElCCi0JaWYgKGhhbmRsZSA+PSAoSElOU1RBTkNFMzIpMzIpIFBFX0luaXRpYWxpemVETExzKCBHZXRFeGVQdHIoaGFuZGxlKSk7CisJaWYgKGhhbmRsZSA+PSAoSElOU1RBTkNFMzIpMzIpIFBFX0luaXRpYWxpemVETExzKCBHZXRFeGVQdHIoaGFuZGxlKSwgRExMX1BST0NFU1NfQVRUQUNILCBOVUxMKTsKICNlbmRpZgogCXJldHVybiBoYW5kbGU7CiB9CkBAIC0xMzQsMTEgKzM5NSwzMyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFNldFRocmVhZEFmZmluaXR5TWFzaworICogV29ya3Mgbm93IGxpa2UgdGhlIFdpbmRvd3M5NSAobm8gTVAgc3VwcG9ydCkgdmVyc2lvbgogICovCiBCT09MMzIgU2V0VGhyZWFkQWZmaW5pdHlNYXNrKEhBTkRMRTMyIGhUaHJlYWQsIERXT1JEIGR3VGhyZWFkQWZmaW5pdHlNYXNrKQogewotCWRwcmludGZfdGFzayhzdGRkZWIsIlNldFRocmVhZEFmZmluaXR5TWFzaygleCwlbHgpXG4iLGhUaHJlYWQsCi0JCWR3VGhyZWFkQWZmaW5pdHlNYXNrKTsKLQkvKiBGSVhNRTogV2UgbGV0IGl0IGZhaWwgKi8KLQlyZXR1cm4gMTsKKwlUSERCCSp0aGRiID0gKFRIREIqKVBST0NFU1NfR2V0T2JqUHRyKGhUaHJlYWQsSzMyT0JKX1RIUkVBRCk7CisKKwlpZiAoIXRoZGIpIAorCQlyZXR1cm4gRkFMU0U7CisJaWYgKGR3VGhyZWFkQWZmaW5pdHlNYXNrIT0xKSB7CisJCWZwcmludGYoc3RkZXJyLCJTZXRUaHJlYWRBZmZpbml0eU1hc2soJWQsJWxkKSwgb25seSAxIHByb2Nlc3NvciBzdXBwb3J0ZWQuXG4iLChpbnQpaFRocmVhZCxkd1RocmVhZEFmZmluaXR5TWFzayk7CisJCUszMk9CSl9EZWNDb3VudCgoSzMyT0JKKil0aGRiKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlLMzJPQkpfRGVjQ291bnQoKEszMk9CSiopdGhkYik7CisJcmV0dXJuIFRSVUU7Cit9CisKK0JPT0wzMgorQ3JlYXRlUHJvY2VzczMyQSgKKwlMUENTVFIgYXBwbmFtZSxMUFNUUiBjbWRsaW5lLExQU0VDVVJJVFlfQVRUUklCVVRFUyBwcm9jZXNzYXR0cmlidXRlcywKKyAgICAgICAgTFBTRUNVUklUWV9BVFRSSUJVVEVTIHRocmVhZGF0dHJpYnV0ZXMsQk9PTDMyIGluaGVyaXRoYW5kbGVzLAorCURXT1JEIGNyZWF0aW9uZmxhZ3MsTFBWT0lEIGVudixMUENTVFIgY3VyZGlyLAorCUxQU1RBUlRVUElORk8zMkEgc3RhcnR1cGluZm8sTFBQUk9DRVNTX0lORk9STUFUSU9OIHByb2Nlc3NpbmZvCispIHsKKwlmcHJpbnRmKHN0ZGVyciwiQ3JlYXRlUHJvY2VzcyglcywlcywlcCwlcCwlZCwlMDhseCwlcCwlcywlcCwlcClcbiIsCisJCWFwcG5hbWUsY21kbGluZSxwcm9jZXNzYXR0cmlidXRlcyx0aHJlYWRhdHRyaWJ1dGVzLAorCQlpbmhlcml0aGFuZGxlcyxjcmVhdGlvbmZsYWdzLGVudixjdXJkaXIsc3RhcnR1cGluZm8scHJvY2Vzc2luZm8KKwkpOworCXJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvd2luMzIvdGhyZWFkLmMgYi93aW4zMi90aHJlYWQuYwppbmRleCAyYWNmODU2Li45MzE1M2EwIDEwMDY0NAotLS0gYS93aW4zMi90aHJlYWQuYworKysgYi93aW4zMi90aHJlYWQuYwpAQCAtMTYwLDcgKzE2MCw3IEBACiAKIHZvaWQgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKENSSVRJQ0FMX1NFQ1RJT04gKnBjcml0aWNhbCkKIHsKLSAgIHNlbWN0bCgoaW50KSBwY3JpdGljYWwtPkxvY2tTZW1hcGhvcmUsMCxJUENfUk1JRCxOVUxMKTsKKyAgIHNlbWN0bCgoaW50KSBwY3JpdGljYWwtPkxvY2tTZW1hcGhvcmUsMCxJUENfUk1JRCwodW5pb24gc2VtdW4pTlVMTCk7CiAgICBwY3JpdGljYWwtPlJlc2VydmVkPS0xOwogfQogCmRpZmYgLS1naXQgYS93aW4zMi90aW1lLmMgYi93aW4zMi90aW1lLmMKaW5kZXggNmIzOGViOC4uNDk5NDE5MCAxMDA2NDQKLS0tIGEvd2luMzIvdGltZS5jCisrKyBiL3dpbjMyL3RpbWUuYwpAQCAtMTIzLDEwICsxMjMsMTAgQEAKICAgICBzdHJ1Y3QgdGltZXpvbmUgdHo7CiAKICAgICB0ei50el9taW51dGVzd2VzdCA9IHR6aW5mby0+QmlhczsKLSNpZmRlZiBfX0VNWF9fIC8qIEZJWE1FICovCi0gICAgdHoudHpfZHN0dGltZSA9IDA7Ci0jZWxzZQorI2lmZGVmIERTVF9OT05FCiAgICAgdHoudHpfZHN0dGltZSA9IERTVF9OT05FOworI2Vsc2UKKyAgICB0ei50el9kc3R0aW1lID0gMDsKICNlbmRpZgogICAgIHJldHVybiAhc2V0dGltZW9mZGF5KE5VTEwsICZ0eik7CiB9CmRpZmYgLS1naXQgYS93aW5kb3dzL2NsYXNzLmMgYi93aW5kb3dzL2NsYXNzLmMKaW5kZXggZmEwZDQ3MC4uYzZmYTgyZSAxMDA2NDQKLS0tIGEvd2luZG93cy9jbGFzcy5jCisrKyBiL3dpbmRvd3MvY2xhc3MuYwpAQCAtMTg1LDcgKzE4NSw3IEBACiAgICAgaWYgKGNsYXNzUHRyLT5oYnJCYWNrZ3JvdW5kKSBEZWxldGVPYmplY3QzMiggY2xhc3NQdHItPmhickJhY2tncm91bmQgKTsKICAgICBHbG9iYWxEZWxldGVBdG9tKCBjbGFzc1B0ci0+YXRvbU5hbWUgKTsKICAgICBDTEFTU19TZXRNZW51TmFtZUEoIGNsYXNzUHRyLCBOVUxMICk7Ci0gICAgV0lOUFJPQ19GcmVlUHJvYyggY2xhc3NQdHItPndpbnByb2MgKTsKKyAgICBXSU5QUk9DX0ZyZWVQcm9jKCBjbGFzc1B0ci0+d2lucHJvYywgV0lOX1BST0NfQ0xBU1MgKTsKICAgICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgY2xhc3NQdHIgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KQEAgLTI5MSw3ICsyOTEsNyBAQAogICAgIGNsYXNzUHRyLT5kY2UgICAgICAgICA9IChzdHlsZSAmIENTX0NMQVNTREMpID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDRV9BbGxvY0RDRSggMCwgRENFX0NMQVNTX0RDICkgOiBOVUxMOwogCi0gICAgV0lOUFJPQ19TZXRQcm9jKCAmY2xhc3NQdHItPndpbnByb2MsIHduZFByb2MsIHduZFByb2NUeXBlICk7CisgICAgV0lOUFJPQ19TZXRQcm9jKCAmY2xhc3NQdHItPndpbnByb2MsIHduZFByb2MsIHduZFByb2NUeXBlLCBXSU5fUFJPQ19DTEFTUyk7CiAKICAgICAvKiBPdGhlciB2YWx1ZXMgbXVzdCBiZSBzZXQgYnkgY2FsbGVyICovCiAKQEAgLTc0Myw3ICs3NDMsNyBAQAogICAgICAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKSkpIHJldHVybiAwOwogICAgICAgICByZXR2YWwgPSAoTE9ORylXSU5QUk9DX0dldFByb2MoIHduZFB0ci0+Y2xhc3MtPndpbnByb2MsIFdJTl9QUk9DXzE2ICk7CiAgICAgICAgIFdJTlBST0NfU2V0UHJvYyggJnduZFB0ci0+Y2xhc3MtPndpbnByb2MsIChXTkRQUk9DMTYpbmV3dmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgIFdJTl9QUk9DXzE2ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgV0lOX1BST0NfMTYsIFdJTl9QUk9DX0NMQVNTICk7CiAgICAgICAgIHJldHVybiByZXR2YWw7CiAgICAgY2FzZSBHQ0xfTUVOVU5BTUU6CiAgICAgICAgIHJldHVybiBTZXRDbGFzc0xvbmczMkEoIGh3bmQsIG9mZnNldCwgKExPTkcpUFRSX1NFR19UT19MSU4obmV3dmFsKSApOwpAQCAtNzgzLDcgKzc4Myw3IEBACiAgICAgICAgICAgICByZXR2YWwgPSAoTE9ORylXSU5QUk9DX0dldFByb2MoIHduZFB0ci0+Y2xhc3MtPndpbnByb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTl9QUk9DXzMyQSApOwogICAgICAgICAgICAgV0lOUFJPQ19TZXRQcm9jKCAmd25kUHRyLT5jbGFzcy0+d2lucHJvYywgKFdORFBST0MxNiluZXd2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTl9QUk9DXzMyQSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5fUFJPQ18zMkEsIFdJTl9QUk9DX0NMQVNTICk7CiAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOwogICAgICAgICBjYXNlIEdDTF9IQlJCQUNLR1JPVU5EOgogICAgICAgICBjYXNlIEdDTF9IQ1VSU09SOgpAQCAtODE5LDcgKzgxOSw3IEBACiAgICAgICAgIGlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpKSkgcmV0dXJuIDA7CiAgICAgICAgIHJldHZhbCA9IChMT05HKVdJTlBST0NfR2V0UHJvYyggd25kUHRyLT5jbGFzcy0+d2lucHJvYywgV0lOX1BST0NfMzJXICk7CiAgICAgICAgIFdJTlBST0NfU2V0UHJvYyggJnduZFB0ci0+Y2xhc3MtPndpbnByb2MsIChXTkRQUk9DMTYpbmV3dmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgIFdJTl9QUk9DXzMyVyApOworICAgICAgICAgICAgICAgICAgICAgICAgIFdJTl9QUk9DXzMyVywgV0lOX1BST0NfQ0xBU1MgKTsKICAgICAgICAgcmV0dXJuIHJldHZhbDsKICAgICBjYXNlIEdDTF9NRU5VTkFNRToKICAgICAgICAgaWYgKCEod25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCkpKSByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGNlLmMgYi93aW5kb3dzL2RjZS5jCmluZGV4IGNjOTJlNWMuLjg0NTIxNDcgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGNlLmMKKysrIGIvd2luZG93cy9kY2UuYwpAQCAtNzI3LDMgKzcyNywyMSBAQAogICByZXR1cm4gMDsKIH0KIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMb2NrV2luZG93VXBkYXRlMTYgICAoVVNFUi4yOTQpCisgKi8KK0JPT0wxNiBMb2NrV2luZG93VXBkYXRlMTYoIEhXTkQxNiBod25kICkKK3sKKyAgICByZXR1cm4gTG9ja1dpbmRvd1VwZGF0ZTMyKCBod25kICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTG9ja1dpbmRvd1VwZGF0ZTMyICAgKFVTRVIzMi4zNzcpCisgKi8KK0JPT0wzMiBMb2NrV2luZG93VXBkYXRlMzIoIEhXTkQzMiBod25kICkKK3sKKyAgICAvKiBGSVhNRT8gRENYX0xPQ0tXSU5ET1dVUERBVEUgaXMgdW5pbXBsZW1lbnRlZCAqLworICAgIHJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvd2luZG93cy9kZWZkbGcuYyBiL3dpbmRvd3MvZGVmZGxnLmMKaW5kZXggNjE4ZTNkZi4uM2M1YzA4MiAxMDA2NDQKLS0tIGEvd2luZG93cy9kZWZkbGcuYworKysgYi93aW5kb3dzL2RlZmRsZy5jCkBAIC0xMTQsOCArMTE0LDYgQEAKIHN0YXRpYyBMUkVTVUxUIERFRkRMR19Qcm9jKCBIV05EMzIgaHduZCwgVUlOVDMyIG1zZywgV1BBUkFNMzIgd1BhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0sIERJQUxPR0lORk8gKmRsZ0luZm8gKQogewotICAgIEhXTkQzMiBod25kRGVmSWQ7Ci0KICAgICBzd2l0Y2gobXNnKQogICAgIHsKICAgICAgICAgY2FzZSBXTV9FUkFTRUJLR05EOgpAQCAtMTQ3LDkgKzE0NSw5IEBACiAJICAgIH0KIAogICAgICAgICAgICAgLyogRGVsZXRlIHdpbmRvdyBwcm9jZWR1cmUgKi8KLSAgICAgICAgICAgIFdJTlBST0NfRnJlZVByb2MoIGRsZ0luZm8tPmRsZ1Byb2MgKTsKKyAgICAgICAgICAgIFdJTlBST0NfRnJlZVByb2MoIGRsZ0luZm8tPmRsZ1Byb2MsIFdJTl9QUk9DX1dJTkRPVyApOwogICAgICAgICAgICAgZGxnSW5mby0+ZGxnUHJvYyA9IChIV0lORE9XUFJPQykwOwotCSAgICBkbGdJbmZvLT5mRW5kICAgID0gVFJVRTsJLyoganVzdCBpbiBjYXNlICovCisgICAgICAgICAgICBkbGdJbmZvLT5mbGFncyB8PSBERl9FTkQ7ICAvKiBqdXN0IGluIGNhc2UgKi8KIAogCSAgICAgIC8qIFdpbmRvdyBjbGVhbi11cCAqLwogCSAgICByZXR1cm4gRGVmV2luZG93UHJvYzMyQSggaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApOwpAQCAtMTY4LDE4ICsxNjYsMjAgQEAKIAkgICAgcmV0dXJuIDA7CiAKICAgICAgICAgY2FzZSBETV9TRVRERUZJRDoKLSAgICAgICAgICAgIGlmIChkbGdJbmZvLT5mRW5kKSByZXR1cm4gMTsKKyAgICAgICAgICAgIGlmIChkbGdJbmZvLT5mbGFncyAmIERGX0VORCkgcmV0dXJuIDE7CiAgICAgICAgICAgICBERUZETEdfU2V0RGVmQnV0dG9uKCBod25kLCBkbGdJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1BhcmFtID8gR2V0RGxnSXRlbTMyKCBod25kLCB3UGFyYW0gKSA6IDAgKTsKICAgICAgICAgICAgIHJldHVybiAxOwogCiAgICAgICAgIGNhc2UgRE1fR0VUREVGSUQ6Ci0gICAgICAgICAgICBpZiAoZGxnSW5mby0+ZkVuZCkgcmV0dXJuIDA7Ci0JICAgIGlmIChkbGdJbmZvLT5pZFJlc3VsdCkKLQkgICAgICByZXR1cm4gTUFLRUxPTkcoIGRsZ0luZm8tPmlkUmVzdWx0LCBEQ19IQVNERUZJRCApOwotCSAgICBod25kRGVmSWQgPSBERUZETEdfRmluZERlZkJ1dHRvbiggaHduZCApOwotCSAgICBpZiAoaHduZERlZklkKQotCSAgICAgIHJldHVybiBNQUtFTE9ORyggR2V0RGxnQ3RybElEMzIoIGh3bmREZWZJZCApLCBEQ19IQVNERUZJRCk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSFdORDMyIGh3bmREZWZJZDsKKyAgICAgICAgICAgICAgICBpZiAoZGxnSW5mby0+ZmxhZ3MgJiBERl9FTkQpIHJldHVybiAwOworICAgICAgICAgICAgICAgIGlmIChkbGdJbmZvLT5pZFJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1BS0VMT05HKCBkbGdJbmZvLT5pZFJlc3VsdCwgRENfSEFTREVGSUQgKTsKKyAgICAgICAgICAgICAgICBpZiAoKGh3bmREZWZJZCA9IERFRkRMR19GaW5kRGVmQnV0dG9uKCBod25kICkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTUFLRUxPTkcoIEdldERsZ0N0cmxJRDMyKCBod25kRGVmSWQgKSwgRENfSEFTREVGSUQpOworICAgICAgICAgICAgfQogCSAgICByZXR1cm4gMDsKIAogCWNhc2UgV01fTkVYVERMR0NUTDoKQEAgLTE5Miw2ICsxOTIsMzIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiAwOwogCisgICAgICAgIGNhc2UgV01fRU5URVJNRU5VTE9PUDoKKyAgICAgICAgY2FzZSBXTV9MQlVUVE9ORE9XTjoKKyAgICAgICAgY2FzZSBXTV9OQ0xCVVRUT05ET1dOOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEhXTkQzMiBod25kRm9jdXMgPSBHZXRGb2N1czMyKCk7CisgICAgICAgICAgICAgICAgaWYgKGh3bmRGb2N1cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFdORCAqd25kID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmRGb2N1cyApOworCisgICAgICAgICAgICAgICAgICAgIGlmKCB3bmQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbHdheXMgbWFrZSBjb21ibyBib3ggaGlkZSBpdHMgbGlzdGJveCBjb250cm9sICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBXSURHRVRTX0lzQ29udHJvbDMyKCB3bmQsIEJJQzMyX0NPTUJPICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbmRNZXNzYWdlMzJBKCBod25kRm9jdXMsIENCX1NIT1dEUk9QRE9XTjMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgMCApOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggV0lER0VUU19Jc0NvbnRyb2wzMiggd25kLCBCSUMzMl9FRElUICkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJREdFVFNfSXNDb250cm9sMzIoIHduZC0+cGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklDMzJfQ09NQk8gKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZTMyQSggd25kLT5wYXJlbnQtPmh3bmRTZWxmLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JfU0hPV0RST1BET1dOMzIsIEZBTFNFLCAwICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisJICAgIHJldHVybiBEZWZXaW5kb3dQcm9jMzJBKCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CisKIAljYXNlIFdNX0dFVEZPTlQ6IAogCSAgICByZXR1cm4gZGxnSW5mby0+aFVzZXJGb250OwogCkBAIC0yMDQsOSArMjMwLDkgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgREVGRExHX1NpZ25vZmYKKyAqICAgICAgICAgICBERUZETEdfRXBpbG9nCiAgKi8KLXN0YXRpYyBMUkVTVUxUIERFRkRMR19TaWdub2ZmKERJQUxPR0lORk8qIGRsZ0luZm8sIFVJTlQzMiBtc2csIEJPT0wxNiBmUmVzdWx0KQorc3RhdGljIExSRVNVTFQgREVGRExHX0VwaWxvZyhESUFMT0dJTkZPKiBkbGdJbmZvLCBVSU5UMzIgbXNnLCBCT09MMTYgZlJlc3VsdCkKIHsKICAgICAvKiBzZWUgU0RLIDMuMSAqLwogCkBAIC0yNTQsNiArMjgwLDkgQEAKICAgICAgICAgICAgIGNhc2UgV01fR0VURk9OVDoKICAgICAgICAgICAgIGNhc2UgV01fQ0xPU0U6CiAgICAgICAgICAgICBjYXNlIFdNX05DREVTVFJPWToKKyAgICAgICAgICAgIGNhc2UgV01fRU5URVJNRU5VTE9PUDoKKyAgICAgICAgICAgIGNhc2UgV01fTEJVVFRPTkRPV046CisgICAgICAgICAgICBjYXNlIFdNX05DTEJVVFRPTkRPV046CiAgICAgICAgICAgICAgICAgcmV0dXJuIERFRkRMR19Qcm9jKCAoSFdORDMyKWh3bmQsIG1zZywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV1BBUkFNMzIpd1BhcmFtLCBsUGFyYW0sIGRsZ0luZm8gKTsKICAgICAgICAgICAgIGNhc2UgV01fSU5JVERJQUxPRzoKQEAgLTI2Niw3ICsyOTUsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBEZWZXaW5kb3dQcm9jMTYoIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKICAgICAgICAgfQogICAgIH0gICAKLSAgICByZXR1cm4gREVGRExHX1NpZ25vZmYoZGxnSW5mbywgbXNnLCByZXN1bHQpOworICAgIHJldHVybiBERUZETEdfRXBpbG9nKGRsZ0luZm8sIG1zZywgcmVzdWx0KTsKIH0KIAogCkBAIC0zMDUsNiArMzM0LDkgQEAKICAgICAgICAgICAgIGNhc2UgV01fR0VURk9OVDoKICAgICAgICAgICAgIGNhc2UgV01fQ0xPU0U6CiAgICAgICAgICAgICBjYXNlIFdNX05DREVTVFJPWToKKyAgICAgICAgICAgIGNhc2UgV01fRU5URVJNRU5VTE9PUDoKKyAgICAgICAgICAgIGNhc2UgV01fTEJVVFRPTkRPV046CisgICAgICAgICAgICBjYXNlIFdNX05DTEJVVFRPTkRPV046CiAgICAgICAgICAgICAgICAgIHJldHVybiBERUZETEdfUHJvYyggKEhXTkQzMilod25kLCBtc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdQQVJBTTMyKXdQYXJhbSwgbFBhcmFtLCBkbGdJbmZvICk7CiAgICAgICAgICAgICBjYXNlIFdNX0lOSVRESUFMT0c6CkBAIC0zMTcsNyArMzQ5LDcgQEAKICAgICAgICAgICAgICAgICAgcmV0dXJuIERlZldpbmRvd1Byb2MzMkEoIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gREVGRExHX1NpZ25vZmYoZGxnSW5mbywgbXNnLCByZXN1bHQpOworICAgIHJldHVybiBERUZETEdfRXBpbG9nKGRsZ0luZm8sIG1zZywgcmVzdWx0KTsKIH0KIAogCkBAIC0zNTYsNiArMzg4LDkgQEAKICAgICAgICAgICAgIGNhc2UgV01fR0VURk9OVDoKICAgICAgICAgICAgIGNhc2UgV01fQ0xPU0U6CiAgICAgICAgICAgICBjYXNlIFdNX05DREVTVFJPWToKKyAgICAgICAgICAgIGNhc2UgV01fRU5URVJNRU5VTE9PUDoKKyAgICAgICAgICAgIGNhc2UgV01fTEJVVFRPTkRPV046CisgICAgICAgICAgICBjYXNlIFdNX05DTEJVVFRPTkRPV046CiAgICAgICAgICAgICAgICAgIHJldHVybiBERUZETEdfUHJvYyggKEhXTkQzMilod25kLCBtc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdQQVJBTTMyKXdQYXJhbSwgbFBhcmFtLCBkbGdJbmZvICk7CiAgICAgICAgICAgICBjYXNlIFdNX0lOSVRESUFMT0c6CkBAIC0zNjgsNSArNDAzLDUgQEAKICAgICAgICAgICAgICAgICAgcmV0dXJuIERlZldpbmRvd1Byb2MzMlcoIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gREVGRExHX1NpZ25vZmYoZGxnSW5mbywgbXNnLCByZXN1bHQpOworICAgIHJldHVybiBERUZETEdfRXBpbG9nKGRsZ0luZm8sIG1zZywgcmVzdWx0KTsKIH0KZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGVmd25kLmMgYi93aW5kb3dzL2RlZnduZC5jCmluZGV4IGZlYzE3YmUuLjY2YjhhYWUgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGVmd25kLmMKKysrIGIvd2luZG93cy9kZWZ3bmQuYwpAQCAtMjYzLDcgKzI2Myw3IEBACiAKICAgICBjYXNlIFdNX1NZU0tFWURPV046CiAJaWYoIEhJV09SRChsUGFyYW0pICYgS0VZREFUQV9BTFQgKQotCSAgeworCXsKIAkgICAgLyogaWYoIEhJV09SRChsUGFyYW0pICYgfktFWURBVEFfUFJFVlNUQVRFICkgKi8KIAkgICAgICBpZiggd1BhcmFtID09IFZLX01FTlUgJiYgIWlNZW51U3lzS2V5ICkKIAkJaU1lbnVTeXNLZXkgPSAxOwpAQCAtMjcyLDEzICsyNzIsMjAgQEAKIAkgICAgCiAJICAgIGlGMTBLZXkgPSAwOwogCi0JICB9IAorCSAgICBpZiggd1BhcmFtID09IFZLX0Y0ICkJLyogdHJ5IHRvIGNsb3NlIHRoZSB3aW5kb3cgKi8KKwkgICAgeworCQlIV05EMzIgaFduZCA9IFdJTl9HZXRUb3BQYXJlbnQoIHduZFB0ci0+aHduZFNlbGYgKTsKKwkJd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGhXbmQgKTsKKwkJaWYoIHduZFB0ciAmJiAhKHduZFB0ci0+Y2xhc3MtPnN0eWxlICYgQ1NfTk9DTE9TRSkgKQorCQkgICAgUG9zdE1lc3NhZ2UxNiggaFduZCwgV01fU1lTQ09NTUFORCwgU0NfQ0xPU0UsIDAgKTsKKwkgICAgfQorCX0gCiAJZWxzZSBpZiggd1BhcmFtID09IFZLX0YxMCApCi0JICAgICAgICAgaUYxMEtleSA9IDE7CisJICAgICAgICBpRjEwS2V5ID0gMTsKIAkgICAgIGVsc2UKLQkgICAgICAgICBpZiggd1BhcmFtID09IFZLX0VTQ0FQRSAmJiAoR2V0S2V5U3RhdGUzMihWS19TSElGVCkgJiAweDgwMDApKQotCQkgICAgIFNlbmRNZXNzYWdlMTYoIHduZFB0ci0+aHduZFNlbGYsIFdNX1NZU0NPTU1BTkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV1BBUkFNMTYpU0NfS0VZTUVOVSwgKExQQVJBTSlWS19TUEFDRSk7CisJICAgICAgICBpZiggd1BhcmFtID09IFZLX0VTQ0FQRSAmJiAoR2V0S2V5U3RhdGUzMihWS19TSElGVCkgJiAweDgwMDApKQorCQkgICAgU2VuZE1lc3NhZ2UxNiggd25kUHRyLT5od25kU2VsZiwgV01fU1lTQ09NTUFORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV1BBUkFNMTYpU0NfS0VZTUVOVSwgKExQQVJBTSlWS19TUEFDRSk7CiAJYnJlYWs7CiAKICAgICBjYXNlIFdNX0tFWVVQOgpkaWZmIC0tZ2l0IGEvd2luZG93cy9kaWFsb2cuYyBiL3dpbmRvd3MvZGlhbG9nLmMKaW5kZXggMzY2ZGQ4YS4uY2EyMzRhZCAxMDA2NDQKLS0tIGEvd2luZG93cy9kaWFsb2cuYworKysgYi93aW5kb3dzL2RpYWxvZy5jCkBAIC01ODIsMTMgKzU4MiwxNCBAQAogICAgICAgLyogSW5pdGlhbGlzZSBkaWFsb2cgZXh0cmEgZGF0YSAqLwogCiAgICAgZGxnSW5mbyA9IChESUFMT0dJTkZPICopd25kUHRyLT53RXh0cmE7Ci0gICAgV0lOUFJPQ19TZXRQcm9jKCAmZGxnSW5mby0+ZGxnUHJvYywgZGxnUHJvYywgcHJvY1R5cGUgKTsKKyAgICBXSU5QUk9DX1NldFByb2MoICZkbGdJbmZvLT5kbGdQcm9jLCBkbGdQcm9jLCBwcm9jVHlwZSwgV0lOX1BST0NfV0lORE9XICk7CiAgICAgZGxnSW5mby0+aFVzZXJGb250ID0gaEZvbnQ7CiAgICAgZGxnSW5mby0+aE1lbnUgICAgID0gaE1lbnU7CiAgICAgZGxnSW5mby0+eEJhc2VVbml0ID0geFVuaXQ7CiAgICAgZGxnSW5mby0+eUJhc2VVbml0ID0geVVuaXQ7Ci0gICAgZGxnSW5mby0+bXNnUmVzdWx0ID0gMDsgCisgICAgZGxnSW5mby0+bXNnUmVzdWx0ID0gMDsKICAgICBkbGdJbmZvLT5pZFJlc3VsdCAgPSAwOworICAgIGRsZ0luZm8tPmZsYWdzICAgICA9IDA7CiAgICAgZGxnSW5mby0+aERpYWxvZ0hlYXAgPSAwOwogCiAgICAgaWYgKGRsZ0luZm8tPmhVc2VyRm9udCkKQEAgLTU5NiwyMSArNTk3LDIxIEBACiAKICAgICAvKiBDcmVhdGUgY29udHJvbHMgKi8KIAotICAgIGlmICghRElBTE9HX0NyZWF0ZUNvbnRyb2xzKCB3bmRQdHIsIGRsZ1RlbXBsYXRlLCB0ZW1wbGF0ZS5uYkl0ZW1zLAorICAgIGlmIChESUFMT0dfQ3JlYXRlQ29udHJvbHMoIHduZFB0ciwgZGxnVGVtcGxhdGUsIHRlbXBsYXRlLm5iSXRlbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhJbnN0LCB3aW4zMlRlbXBsYXRlICkpCiAgICAgewotICAgICAgICBEZXN0cm95V2luZG93MzIoIGh3bmQgKTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgLyogU2VuZCBpbml0aWFsaXNhdGlvbiBtZXNzYWdlcyBhbmQgc2V0IGZvY3VzICovCisKKyAgICAgICBkbGdJbmZvLT5od25kRm9jdXMgPSBHZXROZXh0RGxnVGFiSXRlbTMyKCBod25kLCAwLCBGQUxTRSApOworICAgICAgIGlmIChTZW5kTWVzc2FnZTMyQSggaHduZCwgV01fSU5JVERJQUxPRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChXUEFSQU0zMilkbGdJbmZvLT5od25kRm9jdXMsIHBhcmFtICkpCisgICAgICAgICAgIFNldEZvY3VzMzIoIGRsZ0luZm8tPmh3bmRGb2N1cyApOworICAgICAgIGlmICh0ZW1wbGF0ZS5zdHlsZSAmIFdTX1ZJU0lCTEUpIFNob3dXaW5kb3czMiggaHduZCwgU1dfU0hPVyApOworICAgICAgIHJldHVybiBod25kOwogICAgIH0KIAotICAgIC8qIFNlbmQgaW5pdGlhbGlzYXRpb24gbWVzc2FnZXMgYW5kIHNldCBmb2N1cyAqLwotCi0gICAgZGxnSW5mby0+aHduZEZvY3VzID0gR2V0TmV4dERsZ1RhYkl0ZW0zMiggaHduZCwgMCwgRkFMU0UgKTsKLSAgICBpZiAoU2VuZE1lc3NhZ2UzMkEoIGh3bmQsIFdNX0lOSVRESUFMT0csCi0gICAgICAgICAgICAgICAgICAgICAgICAoV1BBUkFNMzIpZGxnSW5mby0+aHduZEZvY3VzLCBwYXJhbSApKQotCVNldEZvY3VzMzIoIGRsZ0luZm8tPmh3bmRGb2N1cyApOwotICAgIGlmICh0ZW1wbGF0ZS5zdHlsZSAmIFdTX1ZJU0lCTEUpIFNob3dXaW5kb3czMiggaHduZCwgU1dfU0hPVyApOwotICAgIHJldHVybiBod25kOworICAgIGlmKCBJc1dpbmRvdzMyKGh3bmQpICkgRGVzdHJveVdpbmRvdzMyKCBod25kICk7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtNzUwLDcgKzc1MSw3IEBACiAJICAgIFRyYW5zbGF0ZU1lc3NhZ2UxNiggJm1zZyApOwogCSAgICBEaXNwYXRjaE1lc3NhZ2UxNiggJm1zZyApOwogCX0KLQlpZiAoZGxnSW5mby0+ZkVuZCkgYnJlYWs7CisJaWYgKGRsZ0luZm8tPmZsYWdzICYgREZfRU5EKSBicmVhazsKICAgICB9CiAgICAgcmV0dmFsID0gZGxnSW5mby0+aWRSZXN1bHQ7CiAgICAgRW5hYmxlV2luZG93MzIoIG93bmVyLCBUUlVFICk7CkBAIC04NzQsOSArODc1LDE0IEBACiB7CiAgICAgV05EICogd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKICAgICBESUFMT0dJTkZPICogZGxnSW5mbyA9IChESUFMT0dJTkZPICopd25kUHRyLT53RXh0cmE7Ci0gICAgZGxnSW5mby0+aWRSZXN1bHQgPSByZXR2YWw7Ci0gICAgZGxnSW5mby0+ZkVuZCA9IFRSVUU7CisKICAgICBkcHJpbnRmX2RpYWxvZyhzdGRkZWIsICJFbmREaWFsb2c6ICUwNHggJWRcbiIsIGh3bmQsIHJldHZhbCApOworCisgICAgaWYoIGRsZ0luZm8gKQorICAgIHsKKyAgICAgICAgZGxnSW5mby0+aWRSZXN1bHQgPSByZXR2YWw7CisgICAgICAgIGRsZ0luZm8tPmZsYWdzIHw9IERGX0VORDsKKyAgICB9CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZ3JhcGhpY3MuYyBiL3dpbmRvd3MvZ3JhcGhpY3MuYwppbmRleCA2MTY5ZmE3Li4yZGU3YmQ5IDEwMDY0NAotLS0gYS93aW5kb3dzL2dyYXBoaWNzLmMKKysrIGIvd2luZG93cy9ncmFwaGljcy5jCkBAIC00LDYgKzQsNyBAQAogICogQ29weXJpZ2h0IDE5OTMsIDE5OTQgQWxleGFuZHJlIEp1bGxpYXJkCiAgKi8KIAorI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxYMTEvWGxpYi5oPgpAQCAtMjYsNiArMjcsOCBAQAogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgogCisjZGVmaW5lIE1BWF9EUkFXTElORVMJCTgKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTGluZVRvMTYgICAgKEdESS4xOSkKICAqLwpAQCAtMjMxLDggKzIzNCw4IEBACiB7CiAgICAgSEJSVVNIMTYgcHJldkJydXNoOwogCi0gICAgLyogY29vcmRpbmF0ZXMgYXJlIGxvZ2ljYWwgc28gd2UgY2Fubm90IGZhc3QtY2hlY2sgcmVjdGFuZ2xlCi0gICAgICogLSBkbyBpdCBpbiBQYXRCbHQoKSBhZnRlciBMUHRvRFAoKS4KKyAgICAvKiBjb29yZGluYXRlcyBhcmUgbG9naWNhbCBzbyB3ZSBjYW5ub3QgZmFzdC1jaGVjayAncmVjdCcsCisgICAgICogaXQgd2lsbCBiZSBkb25lIGxhdGVyIGluIHRoZSBQYXRCbHQoKS4KICAgICAgKi8KIAogICAgIGlmICghKHByZXZCcnVzaCA9IFNlbGVjdE9iamVjdDE2KCBoZGMsIGhicnVzaCApKSkgcmV0dXJuIDA7CkBAIC01MTMsNzUgKzUxNiw2IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgIEdSQVBIX0RyYXdCaXRtYXAKLSAqCi0gKiBTaG9ydC1jdXQgZnVuY3Rpb24gdG8gYmxpdCBhIGJpdG1hcCBpbnRvIGEgZGV2aWNlLgotICogRmFzdGVyIHRoYW4gQ3JlYXRlQ29tcGF0aWJsZURDKCkgKyBTZWxlY3RCaXRtYXAoKSArIEJpdEJsdCgpICsgRGVsZXRlREMoKS4KLSAqLwotQk9PTDMyIEdSQVBIX0RyYXdCaXRtYXAoIEhEQzMyIGhkYywgSEJJVE1BUDMyIGhiaXRtYXAsIGludCB4ZGVzdCwgaW50IHlkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4c3JjLCBpbnQgeXNyYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0ICkKLXsKLSAgICBCSVRNQVBPQkogKmJtcDsKLSAgICBEQyAqZGM7Ci0gICAgCi0gICAgaWYgKCEoZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghKGJtcCA9IChCSVRNQVBPQkogKikgR0RJX0dldE9ialB0ciggaGJpdG1hcCwgQklUTUFQX01BR0lDICkpKQotCXJldHVybiBGQUxTRTsKLSAgICBYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjLT51LnguZ2MsIEdYY29weSApOwotICAgIGlmIChibXAtPmJpdG1hcC5ibUJpdHNQaXhlbCA9PSAxKQotICAgIHsKLSAgICAgICAgWFNldEZvcmVncm91bmQoIGRpc3BsYXksIGRjLT51LnguZ2MsIGRjLT53LmJhY2tncm91bmRQaXhlbCApOwotICAgICAgICBYU2V0QmFja2dyb3VuZCggZGlzcGxheSwgZGMtPnUueC5nYywgZGMtPncudGV4dFBpeGVsICk7Ci0JWENvcHlQbGFuZSggZGlzcGxheSwgYm1wLT5waXhtYXAsIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCi0JCSAgICB4c3JjLCB5c3JjLCB3aWR0aCwgaGVpZ2h0LAotCQkgICAgZGMtPncuRENPcmdYICsgeGRlc3QsIGRjLT53LkRDT3JnWSArIHlkZXN0LCAxICk7Ci0JcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGVsc2UgaWYgKGJtcC0+Yml0bWFwLmJtQml0c1BpeGVsID09IGRjLT53LmJpdHNQZXJQaXhlbCkKLSAgICB7Ci0JWENvcHlBcmVhKCBkaXNwbGF5LCBibXAtPnBpeG1hcCwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKLQkJICAgeHNyYywgeXNyYywgd2lkdGgsIGhlaWdodCwKLQkJICAgZGMtPncuRENPcmdYICsgeGRlc3QsIGRjLT53LkRDT3JnWSArIHlkZXN0ICk7Ci0JcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGVsc2UgcmV0dXJuIEZBTFNFOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICBHUkFQSF9EcmF3UmVsaWVmUmVjdCAgKE5vdCBhIE1TV2luIENhbGwpCi0gKi8KLXZvaWQgR1JBUEhfRHJhd1JlbGllZlJlY3QoIEhEQzMyIGhkYywgY29uc3QgUkVDVDMyICpyZWN0LCBJTlQzMiBoaWdobGlnaHRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIHNoYWRvd19zaXplLCBCT09MMzIgcHJlc3NlZCApCi17Ci0gICAgSEJSVVNIMzIgaGJydXNoT2xkOwotICAgIElOVDMyIGk7Ci0KLSAgICBoYnJ1c2hPbGQgPSBTZWxlY3RPYmplY3QzMihoZGMsIHByZXNzZWQgPyBzeXNDb2xvck9iamVjdHMuaGJydXNoQnRuU2hhZG93IDoKLQkJCSAgICAgICAgICAgICAgICAgIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hCdG5IaWdobGlnaHQgKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaGlnaGxpZ2h0X3NpemU7IGkrKykKLSAgICB7Ci0JUGF0Qmx0MzIoIGhkYywgcmVjdC0+bGVmdCArIGksIHJlY3QtPnRvcCwKLSAgICAgICAgICAgICAgICAgIDEsIHJlY3QtPmJvdHRvbSAtIHJlY3QtPnRvcCAtIGksIFBBVENPUFkgKTsKLQlQYXRCbHQzMiggaGRjLCByZWN0LT5sZWZ0LCByZWN0LT50b3AgKyBpLAotICAgICAgICAgICAgICAgICAgcmVjdC0+cmlnaHQgLSByZWN0LT5sZWZ0IC0gaSwgMSwgUEFUQ09QWSApOwotICAgIH0KLQotICAgIFNlbGVjdE9iamVjdDMyKCBoZGMsIHByZXNzZWQgPyBzeXNDb2xvck9iamVjdHMuaGJydXNoQnRuSGlnaGxpZ2h0IDoKLQkJICAgICAgICAgICAgICAgICAgIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hCdG5TaGFkb3cgKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgc2hhZG93X3NpemU7IGkrKykKLSAgICB7Ci0JUGF0Qmx0MzIoIGhkYywgcmVjdC0+cmlnaHQgLSBpIC0gMSwgcmVjdC0+dG9wICsgaSwKLSAgICAgICAgICAgICAgICAgIDEsIHJlY3QtPmJvdHRvbSAtIHJlY3QtPnRvcCAtIGksIFBBVENPUFkgKTsKLQlQYXRCbHQzMiggaGRjLCByZWN0LT5sZWZ0ICsgaSwgcmVjdC0+Ym90dG9tIC0gaSAtIDEsCi0gICAgICAgICAgICAgICAgICByZWN0LT5yaWdodCAtIHJlY3QtPmxlZnQgLSBpLCAxLCBQQVRDT1BZICk7Ci0gICAgfQotCi0gICAgU2VsZWN0T2JqZWN0MzIoIGhkYywgaGJydXNoT2xkICk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgIFBvbHlsaW5lMTYgIChHREkuMzcpCiAgKi8KIEJPT0wxNiBQb2x5bGluZTE2KCBIREMxNiBoZGMsIExQUE9JTlQxNiBwdCwgSU5UMTYgY291bnQgKQpAQCAtODMzLDMgKzc2NywxODEgQEAKICAgICAgICAgICAgICBoZGMscmMsZWRnZSxmbGFncyApOwogICAgIHJldHVybiBUUlVFOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBYLXNwZWNpZmljIHNob3J0Y3V0cyB0byBzcGVlZCB1cCBXTSBjb2RlLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIENhdmVhdDogbm8gY29vcmRpbmF0ZSB0cmFuc2Zvcm1hdGlvbnMgZXhjZXB0IG9yaWdpbiB0cmFuc2xhdGlvbi4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICAgICAgIEdSQVBIX0RyYXdMaW5lcworICoKKyAqIERyYXcgbXVsdGlwbGUgdW5jb25uZWN0ZWQgbGluZXMgKGxpbWl0ZWQgYnkgTUFYX0RSQVdMSU5FUykuCisgKi8KK0JPT0wzMiBHUkFQSF9EcmF3TGluZXMoIEhEQzMyIGhkYywgTFBQT0lOVDMyIHBYWSwgSU5UMzIgTiwgSFBFTjMyIGhQZW4gKQoreworICAgIEJPT0wzMgliUmV0ID0gRkFMU0U7CisgICAgREMqICAgICAgICAgZGM7CisKKyAgICBhc3NlcnQoIE4gPD0gTUFYX0RSQVdMSU5FUyApOworICAgIGlmKCAoZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApKSApCisgICAgeworCUhQRU4zMiAgaFByZXZQZW4gID0gMDsKKworCWlmKCBoUGVuICkgaFByZXZQZW4gPSBTZWxlY3RPYmplY3QzMiggaGRjLCBoUGVuICk7CisJaWYoIERDX1NldHVwR0NGb3JQZW4oIGRjICkgKQorCXsKKwkgICAgWFNlZ21lbnQJbFtNQVhfRFJBV0xJTkVTXTsKKwkgICAgSU5UMzIgCWksIGo7CisKKwkgICAgZm9yKCBpID0gMDsgaSA8IE47IGkrKyApCisJICAgIHsKKwkJIGogPSAyICogaTsKKwkJIGxbaV0ueDEgPSBwWFlbal0ueCArIGRjLT53LkRDT3JnWDsgCisJCSBsW2ldLngyID0gcFhZW2ogKyAxXS54ICsgZGMtPncuRENPcmdYOworCQkgbFtpXS55MSA9IHBYWVtqXS55ICsgZGMtPncuRENPcmdZOworCQkgbFtpXS55MiA9IHBYWVtqICsgMV0ueSArIGRjLT53LkRDT3JnWTsKKwkgICAgfQorCSAgICBYRHJhd1NlZ21lbnRzKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCBsLCBOICk7CisJICAgIGJSZXQgPSBUUlVFOworCX0KKwlpZiggaFByZXZQZW4gKSBTZWxlY3RPYmplY3QzMiggaGRjLCBoUHJldlBlbiApOworICAgIH0KKyAgICByZXR1cm4gYlJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogICAgICAgICAgR1JBUEhfRHJhd0JpdG1hcAorICoKKyAqIFNob3J0LWN1dCBmdW5jdGlvbiB0byBibGl0IGEgYml0bWFwIGludG8gYSBkZXZpY2UuCisgKiBGYXN0ZXIgdGhhbiBDcmVhdGVDb21wYXRpYmxlREMoKSArIFNlbGVjdEJpdG1hcCgpICsgQml0Qmx0KCkgKyBEZWxldGVEQygpLgorICovCitCT09MMzIgR1JBUEhfRHJhd0JpdG1hcCggSERDMzIgaGRjLCBIQklUTUFQMzIgaGJpdG1hcCwgCisJCQkgSU5UMzIgeGRlc3QsIElOVDMyIHlkZXN0LCBJTlQzMiB4c3JjLCBJTlQzMiB5c3JjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiB3aWR0aCwgSU5UMzIgaGVpZ2h0ICkKK3sKKyAgICBCSVRNQVBPQkogKmJtcDsKKyAgICBEQyAqZGM7CisKKyAgICBpZiAoIShkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICkpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCEoYm1wID0gKEJJVE1BUE9CSiAqKSBHRElfR2V0T2JqUHRyKCBoYml0bWFwLCBCSVRNQVBfTUFHSUMgKSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICBYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjLT51LnguZ2MsIEdYY29weSApOworICAgIGlmIChibXAtPmJpdG1hcC5ibUJpdHNQaXhlbCA9PSAxKQorICAgIHsKKyAgICAgICAgWFNldEZvcmVncm91bmQoIGRpc3BsYXksIGRjLT51LnguZ2MsIGRjLT53LmJhY2tncm91bmRQaXhlbCApOworICAgICAgICBYU2V0QmFja2dyb3VuZCggZGlzcGxheSwgZGMtPnUueC5nYywgZGMtPncudGV4dFBpeGVsICk7CisgICAgICAgIFhDb3B5UGxhbmUoIGRpc3BsYXksIGJtcC0+cGl4bWFwLCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorICAgICAgICAgICAgICAgICAgICB4c3JjLCB5c3JjLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyB4ZGVzdCwgZGMtPncuRENPcmdZICsgeWRlc3QsIDEgKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGVsc2UgaWYgKGJtcC0+Yml0bWFwLmJtQml0c1BpeGVsID09IGRjLT53LmJpdHNQZXJQaXhlbCkKKyAgICB7CisgICAgICAgIFhDb3B5QXJlYSggZGlzcGxheSwgYm1wLT5waXhtYXAsIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisgICAgICAgICAgICAgICAgICAgeHNyYywgeXNyYywgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyB4ZGVzdCwgZGMtPncuRENPcmdZICsgeWRlc3QgKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGVsc2UgcmV0dXJuIEZBTFNFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICBHUkFQSF9EcmF3UmVsaWVmUmVjdAorICoKKyAqIFVzZWQgaW4gdGhlIHN0YW5kYXJkIGNvbnRyb2wgY29kZSBmb3IgYnV0dG9uIGVkZ2UgZHJhd2luZy4KKyAqLwordm9pZCBHUkFQSF9EcmF3UmVsaWVmUmVjdCggSERDMzIgaGRjLCBjb25zdCBSRUNUMzIgKnJlY3QsIElOVDMyIGhpZ2hsaWdodF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgc2hhZG93X3NpemUsIEJPT0wzMiBwcmVzc2VkICkKK3sKKyAgICBEQyoJCWRjOworICAgIEhCUlVTSDMyIAloUHJldkJydXNoOworICAgIElOVDMyIAl3LCBoOworICAgIFJFQ1QzMglyID0gKnJlY3Q7CisKKyAgICBpZiAoIShkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICkpKSByZXR1cm47CisKKyAgICBPZmZzZXRSZWN0MzIoICZyLCBkYy0+dy5EQ09yZ1gsIGRjLT53LkRDT3JnWSk7CisgICAgaCA9IHJlY3QtPmJvdHRvbSAtIHJlY3QtPnRvcDsgIHcgPSByZWN0LT5yaWdodCAtIHJlY3QtPmxlZnQ7CisKKyAgICBoUHJldkJydXNoID0gU2VsZWN0T2JqZWN0MzIoaGRjLCBwcmVzc2VkID8gc3lzQ29sb3JPYmplY3RzLmhicnVzaEJ0blNoYWRvdyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hCdG5IaWdobGlnaHQgKTsKKyAgICBpZiAoIERDX1NldHVwR0NGb3JCcnVzaCggZGMgKSApCisgICAgeworICAgICAgICAgSU5UMzIJaTsKKworCSBYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjLT51LnguZ2MsIEdYY29weSApOworICAgICAgICAgZm9yIChpID0gMDsgaSA8IGhpZ2hsaWdodF9zaXplOyBpKyspCisgICAgICAgICB7CisJICAgICAgWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisJCQkJCXIubGVmdCArIGksIHIudG9wLCAxLCBoIC0gaSApOworCSAgICAgIFhGaWxsUmVjdGFuZ2xlKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorCQkJCQlyLmxlZnQsIHIudG9wICsgaSwgdyAtIGksIDEgKTsKKyAgICAgICAgIH0KKyAgICB9CisKKyAgICBTZWxlY3RPYmplY3QzMiggaGRjLCBwcmVzc2VkID8gc3lzQ29sb3JPYmplY3RzLmhicnVzaEJ0bkhpZ2hsaWdodCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hCdG5TaGFkb3cgKTsKKyAgICBpZiAoIERDX1NldHVwR0NGb3JCcnVzaCggZGMgKSApCisgICAgeworCSBJTlQzMglpOworCisJIFhTZXRGdW5jdGlvbiggZGlzcGxheSwgZGMtPnUueC5nYywgR1hjb3B5ICk7CisgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2hhZG93X3NpemU7IGkrKykKKyAgICAgICAgIHsKKwkgICAgICBYRmlsbFJlY3RhbmdsZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKKwkJCSAgICAgIHIucmlnaHQgLSBpIC0gMSwgci50b3AgKyBpLCAxLCBoIC0gaSApOworCSAgICAgIFhGaWxsUmVjdGFuZ2xlKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorCQkJICAgICAgci5sZWZ0ICsgaSwgci5ib3R0b20gLSBpIC0gMSwgdyAtIGksIDEgKTsKKyAgICAgICAgIH0KKyAgICB9CisKKyAgICBTZWxlY3RPYmplY3QzMiggaGRjLCBoUHJldkJydXNoICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICBHUkFQSF9EcmF3UmVjdGFuZ2xlCisgKi8KK3ZvaWQgR1JBUEhfRHJhd1JlY3RhbmdsZSggSERDMzIgaGRjLCBJTlQzMiB4LCBJTlQzMiB5LCAKKwkJCQkgICAgIElOVDMyIHcsIElOVDMyIGgsIEhQRU4zMiBoUGVuICkKK3sKKyAgICBEQyogZGM7CisKKyAgICBpZiggKGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKSkgKSAKKyAgICB7CisgICAgICAgIEhQRU4zMgloUHJldlBlbiAgPSAwOyAKKworCWlmKCBoUGVuICkgaFByZXZQZW4gPSBTZWxlY3RPYmplY3QzMiggaGRjLCBoUGVuICk7CisJaWYoIERDX1NldHVwR0NGb3JQZW4oIGRjICkgKQorCSAgICBYRHJhd1JlY3RhbmdsZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgCisJCQkgICAgeCArIGRjLT53LkRDT3JnWCwgeSArIGRjLT53LkRDT3JnWSwgdyAtIDEsIGggLSAxKTsKKwlpZiggaFByZXZQZW4gKSBTZWxlY3RPYmplY3QzMiggaGRjLCBoUHJldlBlbiApOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgIEdSQVBIX1NlbGVjdENsaXBNYXNrCisgKi8KK0JPT0wzMiBHUkFQSF9TZWxlY3RDbGlwTWFzayggSERDMzIgaGRjLCBIQklUTUFQMzIgaE1vbm9CaXRtYXAsIElOVDMyIHgsIElOVDMyIHkpCit7CisgICAgQklUTUFQT0JKICpibXAgPSBOVUxMOworICAgIERDICpkYzsKKworICAgIGlmICghKGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKSkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIGhNb25vQml0bWFwICkgCisgICAgeworICAgICAgIGlmICggIShibXAgPSAoQklUTUFQT0JKICopIEdESV9HZXRPYmpQdHIoIGhNb25vQml0bWFwLCBCSVRNQVBfTUFHSUMpKSAKKwkgICB8fCBibXAtPmJpdG1hcC5ibUJpdHNQaXhlbCAhPSAxICkgcmV0dXJuIEZBTFNFOworCSAgCisgICAgICAgWFNldENsaXBPcmlnaW4oIGRpc3BsYXksIGRjLT51LnguZ2MsIGRjLT53LkRDT3JnWCArIHgsIGRjLT53LkRDT3JnWSArIHkpOworICAgIH0KKworICAgIFhTZXRDbGlwTWFzayggZGlzcGxheSwgZGMtPnUueC5nYywgKGJtcCkgPyBibXAtPnBpeG1hcCA6IE5vbmUgKTsKKworICAgIHJldHVybiBUUlVFOworfQorCmRpZmYgLS1naXQgYS93aW5kb3dzL2hvb2suYyBiL3dpbmRvd3MvaG9vay5jCmluZGV4IGUwMWQzYjcuLjJlMDdmZTQgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvaG9vay5jCisrKyBiL3dpbmRvd3MvaG9vay5jCkBAIC01NzUsMTIgKzU3NSwxMiBAQAogCiAgICAgICBjYXNlIFdIX0NBTExXTkRQUk9DOgogICAgICAgewotICAgICAgICAgIHZvaWQgICAgICAgICAgKCpsb2NhbFVuTWFwKShVSU5UMzIsIFdQQVJBTTE2LCBMUEFSQU0pCisgICAgICAgICAgdm9pZCAgICAgICAgICAoKmxvY2FsVW5NYXApKFVJTlQzMiwgV1BBUkFNMTYsIExQQVJBTSwgTFJFU1VMVCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoYkEpID8gV0lOUFJPQ19Vbm1hcE1zZzMyQVRvMTYgOiBXSU5QUk9DX1VubWFwTXNnMzJXVG8xNjsKICAgICAgICAgICBMUENXUFNUUlVDVDE2ICAgbHBjd3AxNiA9IChMUENXUFNUUlVDVDE2KVBUUl9TRUdfVE9fTElOKGxQYXJhbSk7CiAJICBMUENXUFNUUlVDVDMyICAgbHBjd3AzMiA9IChMUENXUFNUUlVDVDMyKWxQYXJhbU9yaWc7CiAKLSAgICAgICAgICAoKmxvY2FsVW5NYXApKGxwY3dwMzItPm1lc3NhZ2UsIGxwY3dwMTYtPndQYXJhbSwgbHBjd3AxNi0+bFBhcmFtICk7CisgICAgICAgICAgKCpsb2NhbFVuTWFwKShscGN3cDMyLT5tZXNzYWdlLCBscGN3cDE2LT53UGFyYW0sIGxwY3dwMTYtPmxQYXJhbSwgMCApOwogCSAgU0VHUFRSX0ZSRUUoIFBUUl9TRUdfVE9fTElOKGxQYXJhbSkgKTsKICAgICAgICAgICBicmVhazsKICAgICAgIH0KZGlmZiAtLWdpdCBhL3dpbmRvd3Mva2V5Ym9hcmQuYyBiL3dpbmRvd3Mva2V5Ym9hcmQuYwppbmRleCBkMWMwYzk4Li4wMTg1M2FhIDEwMDY0NAotLS0gYS93aW5kb3dzL2tleWJvYXJkLmMKKysrIGIvd2luZG93cy9rZXlib2FyZC5jCkBAIC01NDMsNyArNTQzLDcgQEAKIAlicmVhazsKICAgICAgZGVmYXVsdDoKIAlyZXR2YWwgPSBBc3luY0tleVN0YXRlVGFibGVbbktleV0gfCAKLQkoSW5wdXRLZXlTdGF0ZVRhYmxlW25LZXldID8gMHg4MDAwIDogMCk7CisJICAJKChJbnB1dEtleVN0YXRlVGFibGVbbktleV0gJiAweDgwKSA/IDB4ODAwMCA6IDApOyAKIAlicmVhazsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvbWVzc2FnZS5jIGIvd2luZG93cy9tZXNzYWdlLmMKaW5kZXggYWNlNTIwMC4uMzhkZWI5ZSAxMDA2NDQKLS0tIGEvd2luZG93cy9tZXNzYWdlLmMKKysrIGIvd2luZG93cy9tZXNzYWdlLmMKQEAgLTYwNiw3ICs2MDYsNyBAQAogICAgICAgcXVldWUtPndha2VCaXRzICY9IH5RU19TTVJFU1VMVDsKIAogICAgICAgaWYoIHF1ZXVlLT5zbVJlc3VsdCAhPSAmcUN0cmwgKQotCSAgZHByaW50Zl9tc2coc3RkZGViLCIlKnNzbTogd2VpcmQgc2NlbmVzIGluc2lkZSB0aGUgZ29sZG1pbmUhXG4iLCBwcmV2U01STCwgIiIpOworCSAgZHByaW50Zl9zZW5kbXNnKHN0ZGRlYiwiJSpzc206IHdlaXJkIHNjZW5lcyBpbnNpZGUgdGhlIGdvbGRtaW5lIVxuIiwgcHJldlNNUkwsICIiKTsKICAgICB9CiAgICAgcXVldWUtPnNtUmVzdWx0SW5pdCA9IE5VTEw7CiAgICAgCkBAIC02NzUsOCArNjc1LDYgQEAKICAgICBtYXNrID0gUVNfUE9TVE1FU1NBR0UgfCBRU19TRU5ETUVTU0FHRTsgIC8qIEFsd2F5cyBzZWxlY3RlZCAqLwogICAgIGlmIChmaXJzdCB8fCBsYXN0KQogICAgIHsKLSAgICAgICAgLyogTVNXb3JkIGdldHMgc3R1Y2sgaWYgd2UgZG8gbm90IGNoZWNrIGZvciBub25jbGllbnQgbW91c2UgbWVzc2FnZXMgKi8KLQogICAgICAgICBpZiAoKGZpcnN0IDw9IFdNX0tFWUxBU1QpICYmIChsYXN0ID49IFdNX0tFWUZJUlNUKSkgbWFzayB8PSBRU19LRVk7CiAgICAgICAgIGlmICggKChmaXJzdCA8PSBXTV9NT1VTRUxBU1QpICYmIChsYXN0ID49IFdNX01PVVNFRklSU1QpKSB8fAogICAgICAgICAgICAgICgoZmlyc3QgPD0gV01fTkNNT1VTRUxBU1QpICYmIChsYXN0ID49IFdNX05DTU9VU0VGSVJTVCkpICkgbWFzayB8PSBRU19NT1VTRTsKQEAgLTcwMCwxMSArNjk4LDcgQEAKIAl3aGlsZSAobXNnUXVldWUtPndha2VCaXRzICYgUVNfU0VORE1FU1NBR0UpCiAgICAgICAgICAgICBRVUVVRV9SZWNlaXZlTWVzc2FnZSggbXNnUXVldWUgKTsKIAotICAgICAgICAvKiBOb3cgaGFuZGxlIGEgV01fUVVJVCBtZXNzYWdlIAotCSAqCi0JICogRklYTUU6IFBvc3RRdWl0TWVzc2FnZSgpIHNob3VsZCBwb3N0IFdNX1FVSVQgYW5kIAotCSAqCSAgc2V0IFFTX1BPU1RNRVNTQUdFIHdha2ViaXQgaW5zdGVhZCBvZiB0aGlzLgotCSAqLworICAgICAgICAvKiBOb3cgaGFuZGxlIGEgV01fUVVJVCBtZXNzYWdlICovCiAKICAgICAgICAgaWYgKG1zZ1F1ZXVlLT53UG9zdFFNc2cgJiYKIAkgICAoIWZpcnN0IHx8IFdNX1FVSVQgPj0gZmlyc3QpICYmIApAQCAtMTQxOSw3ICsxNDEzLDYgQEAKICAgICB7CiAJaWYgKG1zZy0+bFBhcmFtKQogICAgICAgICB7Ci0vKiAgICAgICAgICAgIEhPT0tfQ2FsbEhvb2tzMTYoIFdIX0NBTExXTkRQUk9DLCBIQ19BQ1RJT04sIDAsIEZJWE1FICk7ICovCiAJICAgIHJldHVybiBDYWxsV2luZG93UHJvYzE2KCAoV05EUFJPQzE2KW1zZy0+bFBhcmFtLCBtc2ctPmh3bmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+bWVzc2FnZSwgbXNnLT53UGFyYW0sIEdldFRpY2tDb3VudCgpICk7CiAgICAgICAgIH0KQEAgLTE0MzAsNyArMTQyMyw2IEBACiAgICAgaWYgKCF3bmRQdHItPndpbnByb2MpIHJldHVybiAwOwogICAgIHBhaW50aW5nID0gKG1zZy0+bWVzc2FnZSA9PSBXTV9QQUlOVCk7CiAgICAgaWYgKHBhaW50aW5nKSB3bmRQdHItPmZsYWdzIHw9IFdJTl9ORUVEU19CRUdJTlBBSU5UOwotLyogICAgSE9PS19DYWxsSG9va3MxNiggV0hfQ0FMTFdORFBST0MsIEhDX0FDVElPTiwgMCwgRklYTUUgKTsgKi8KIAogICAgIFNQWV9FbnRlck1lc3NhZ2UoIFNQWV9ESVNQQVRDSE1FU1NBR0UxNiwgbXNnLT5od25kLCBtc2ctPm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgbXNnLT53UGFyYW0sIG1zZy0+bFBhcmFtICk7CmRpZmYgLS1naXQgYS93aW5kb3dzL25vbmNsaWVudC5jIGIvd2luZG93cy9ub25jbGllbnQuYwppbmRleCBkMDRkN2RmLi4wODViODE3IDEwMDY0NAotLS0gYS93aW5kb3dzL25vbmNsaWVudC5jCisrKyBiL3dpbmRvd3Mvbm9uY2xpZW50LmMKQEAgLTUwMCwxMCArNTAwLDEwIEBACiAgKiBEcmF3IGEgd2luZG93IGZyYW1lIGluc2lkZSB0aGUgZ2l2ZW4gcmVjdGFuZ2xlLCBhbmQgdXBkYXRlIHRoZSByZWN0YW5nbGUuCiAgKiBUaGUgY29ycmVjdCBwZW4gZm9yIHRoZSBmcmFtZSBtdXN0IGJlIHNlbGVjdGVkIGluIHRoZSBEQy4KICAqLwotc3RhdGljIHZvaWQgTkNfRHJhd0ZyYW1lKCBIREMxNiBoZGMsIFJFQ1QxNiAqcmVjdCwgQk9PTDMyIGRsZ0ZyYW1lLAorc3RhdGljIHZvaWQgTkNfRHJhd0ZyYW1lKCBIREMzMiBoZGMsIFJFQ1QzMiAqcmVjdCwgQk9PTDMyIGRsZ0ZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgYWN0aXZlICkKIHsKLSAgICBzaG9ydCB3aWR0aCwgaGVpZ2h0LCB0bXA7CisgICAgSU5UMzIgd2lkdGgsIGhlaWdodDsKIAogICAgIGlmIChkbGdGcmFtZSkKICAgICB7CkBAIC01MzIsNDMgKzUzMiw0NSBAQAogCiAgICAgaWYgKGRsZ0ZyYW1lKQogICAgIHsKLQlJbmZsYXRlUmVjdDE2KCByZWN0LCAtd2lkdGgsIC1oZWlnaHQgKTsKLQlyZXR1cm47Ci0gICAgfQorCUluZmxhdGVSZWN0MzIoIHJlY3QsIC13aWR0aCwgLWhlaWdodCApOworICAgIH0gCisgICAgZWxzZQorICAgIHsKKwlQT0lOVDMyIGxwdFsxNl07CiAgICAgCiAgICAgICAvKiBEcmF3IGlubmVyIHJlY3RhbmdsZSAqLwotICAgIE1vdmVUbyggaGRjLCByZWN0LT5sZWZ0K3dpZHRoLCByZWN0LT50b3AraGVpZ2h0ICk7Ci0gICAgTGluZVRvMzIoIGhkYywgcmVjdC0+cmlnaHQtd2lkdGgtMSwgcmVjdC0+dG9wK2hlaWdodCApOwotICAgIExpbmVUbzMyKCBoZGMsIHJlY3QtPnJpZ2h0LXdpZHRoLTEsIHJlY3QtPmJvdHRvbS1oZWlnaHQtMSApOwotICAgIExpbmVUbzMyKCBoZGMsIHJlY3QtPmxlZnQrd2lkdGgsIHJlY3QtPmJvdHRvbS1oZWlnaHQtMSApOwotICAgIExpbmVUbzMyKCBoZGMsIHJlY3QtPmxlZnQrd2lkdGgsIHJlY3QtPnRvcCtoZWlnaHQgKTsKKworCUdSQVBIX0RyYXdSZWN0YW5nbGUoIGhkYywgcmVjdC0+bGVmdCArIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QtPnRvcCArIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LT5yaWdodCAtIHJlY3QtPmxlZnQgLSAyKndpZHRoICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LT5ib3R0b20gLSByZWN0LT50b3AgLSAyKmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSFBFTjMyKTAgKTsKIAogICAgICAgLyogRHJhdyB0aGUgZGVjb3JhdGlvbnMgKi8KLSAgICB0bXAgPSByZWN0LT50b3AgKyBTWVNNRVRSSUNTX0NZRlJBTUUgKyBTWVNNRVRSSUNTX0NZU0laRTsKLSAgICBNb3ZlVG8oIGhkYywgcmVjdC0+bGVmdCwgdG1wKTsKLSAgICBMaW5lVG8zMiggaGRjLCByZWN0LT5sZWZ0K3dpZHRoLCB0bXAgKTsKLSAgICBNb3ZlVG8oIGhkYywgcmVjdC0+cmlnaHQtd2lkdGgtMSwgdG1wICk7Ci0gICAgTGluZVRvMzIoIGhkYywgcmVjdC0+cmlnaHQtMSwgdG1wICk7CiAKLSAgICB0bXAgPSByZWN0LT5ib3R0b20gLSAxIC0gU1lTTUVUUklDU19DWUZSQU1FIC0gU1lTTUVUUklDU19DWVNJWkU7Ci0gICAgTW92ZVRvKCBoZGMsIHJlY3QtPmxlZnQsIHRtcCApOwotICAgIExpbmVUbzMyKCBoZGMsIHJlY3QtPmxlZnQrd2lkdGgsIHRtcCApOwotICAgIE1vdmVUbyggaGRjLCByZWN0LT5yaWdodC13aWR0aC0xLCB0bXAgKTsKLSAgICBMaW5lVG8zMiggaGRjLCByZWN0LT5yaWdodC0xLCB0bXAgKTsKKwlscHRbNF0ueCA9IGxwdFswXS54ID0gcmVjdC0+bGVmdDsKKwlscHRbNV0ueCA9IGxwdFsxXS54ID0gcmVjdC0+bGVmdCArIHdpZHRoOworCWxwdFs2XS54ID0gbHB0WzJdLnggPSByZWN0LT5yaWdodCAtIHdpZHRoIC0gMTsKKwlscHRbN10ueCA9IGxwdFszXS54ID0gcmVjdC0+cmlnaHQgLSAxOwogCi0gICAgdG1wID0gcmVjdC0+bGVmdCArIFNZU01FVFJJQ1NfQ1hGUkFNRSArIFNZU01FVFJJQ1NfQ1hTSVpFOwotICAgIE1vdmVUbyggaGRjLCB0bXAsIHJlY3QtPnRvcCApOwotICAgIExpbmVUbzMyKCBoZGMsIHRtcCwgcmVjdC0+dG9wK2hlaWdodCApOwotICAgIE1vdmVUbyggaGRjLCB0bXAsIHJlY3QtPmJvdHRvbS1oZWlnaHQtMSApOwotICAgIExpbmVUbzMyKCBoZGMsIHRtcCwgcmVjdC0+Ym90dG9tLTEgKTsKKwlscHRbMF0ueSA9IGxwdFsxXS55ID0gbHB0WzJdLnkgPSBscHRbM10ueSA9IAorCQkgIHJlY3QtPnRvcCArIFNZU01FVFJJQ1NfQ1lGUkFNRSArIFNZU01FVFJJQ1NfQ1lTSVpFOworCWxwdFs0XS55ID0gbHB0WzVdLnkgPSBscHRbNl0ueSA9IGxwdFs3XS55ID0KKwkJICByZWN0LT5ib3R0b20gLSAxIC0gU1lTTUVUUklDU19DWUZSQU1FIC0gU1lTTUVUUklDU19DWVNJWkU7CiAKLSAgICB0bXAgPSByZWN0LT5yaWdodCAtIDEgLSBTWVNNRVRSSUNTX0NYRlJBTUUgLSBTWVNNRVRSSUNTX0NZU0laRTsKLSAgICBNb3ZlVG8oIGhkYywgdG1wLCByZWN0LT50b3AgKTsKLSAgICBMaW5lVG8zMiggaGRjLCB0bXAsIHJlY3QtPnRvcCtoZWlnaHQgKTsKLSAgICBNb3ZlVG8oIGhkYywgdG1wLCByZWN0LT5ib3R0b20taGVpZ2h0LTEgKTsKLSAgICBMaW5lVG8zMiggaGRjLCB0bXAsIHJlY3QtPmJvdHRvbS0xICk7CisgICAgICAgIGxwdFs4XS54ID0gbHB0WzldLnggPSBscHRbMTBdLnggPSBscHRbMTFdLnggPQorCQkgIHJlY3QtPmxlZnQgKyBTWVNNRVRSSUNTX0NYRlJBTUUgKyBTWVNNRVRSSUNTX0NYU0laRTsKKwlscHRbMTJdLnggPSBscHRbMTNdLnggPSBscHRbMTRdLnggPSBscHRbMTVdLnggPSAKKwkJICByZWN0LT5yaWdodCAtIDEgLSBTWVNNRVRSSUNTX0NYRlJBTUUgLSBTWVNNRVRSSUNTX0NZU0laRTsKIAotICAgIEluZmxhdGVSZWN0MTYoIHJlY3QsIC13aWR0aC0xLCAtaGVpZ2h0LTEgKTsKKwlscHRbMTJdLnkgPSBscHRbOF0ueSA9IHJlY3QtPnRvcDsgCisJbHB0WzEzXS55ID0gbHB0WzldLnkgPSByZWN0LT50b3AgKyBoZWlnaHQ7CisJbHB0WzE0XS55ID0gbHB0WzEwXS55ID0gcmVjdC0+Ym90dG9tIC0gaGVpZ2h0IC0gMTsgCisJbHB0WzE1XS55ID0gbHB0WzExXS55ID0gcmVjdC0+Ym90dG9tIC0gMTsKKworCUdSQVBIX0RyYXdMaW5lcyggaGRjLCBscHQsIDgsIChIUEVOMzIpMCApOwkvKiA4IGlzIHRoZSBtYXhpbXVtICovCisJSW5mbGF0ZVJlY3QzMiggcmVjdCwgLXdpZHRoIC0gMSwgLWhlaWdodCAtIDEgKTsKKyAgICB9CiB9CiAKIApAQCAtNTkxLDEwICs1OTMsMTAgQEAKICAqIERyYXcgdGhlIHdpbmRvdyBjYXB0aW9uLgogICogVGhlIGNvcnJlY3QgcGVuIGZvciB0aGUgd2luZG93IGZyYW1lIG11c3QgYmUgc2VsZWN0ZWQgaW4gdGhlIERDLgogICovCi1zdGF0aWMgdm9pZCBOQ19EcmF3Q2FwdGlvbiggSERDMTYgaGRjLCBSRUNUMTYgKnJlY3QsIEhXTkQzMiBod25kLAorc3RhdGljIHZvaWQgTkNfRHJhd0NhcHRpb24oIEhEQzMyIGhkYywgUkVDVDMyICpyZWN0LCBIV05EMzIgaHduZCwKIAkJCSAgICBEV09SRCBzdHlsZSwgQk9PTDMyIGFjdGl2ZSApCiB7Ci0gICAgUkVDVDE2IHIgPSAqcmVjdDsKKyAgICBSRUNUMzIgciA9ICpyZWN0OwogICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CiAgICAgY2hhciBidWZmZXJbMjU2XTsKIApAQCAtNjQ0LDcgKzY0Niw3IEBACiAJci5yaWdodCAtPSBTWVNNRVRSSUNTX0NYU0laRSArIDE7CiAgICAgfQogCi0gICAgRmlsbFJlY3QxNiggaGRjLCAmciwgYWN0aXZlID8gc3lzQ29sb3JPYmplY3RzLmhicnVzaEFjdGl2ZUNhcHRpb24gOiAKKyAgICBGaWxsUmVjdDMyKCBoZGMsICZyLCBhY3RpdmUgPyBzeXNDb2xvck9iamVjdHMuaGJydXNoQWN0aXZlQ2FwdGlvbiA6IAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzQ29sb3JPYmplY3RzLmhicnVzaEluYWN0aXZlQ2FwdGlvbiApOwogCiAgICAgaWYgKEdldFdpbmRvd1RleHQzMkEoIGh3bmQsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgKSkKQEAgLTY1Miw4ICs2NTQsOCBAQAogCWlmIChhY3RpdmUpIFNldFRleHRDb2xvcjMyKCBoZGMsIEdldFN5c0NvbG9yMzIoIENPTE9SX0NBUFRJT05URVhUICkgKTsKIAllbHNlIFNldFRleHRDb2xvcjMyKCBoZGMsIEdldFN5c0NvbG9yMzIoIENPTE9SX0lOQUNUSVZFQ0FQVElPTlRFWFQgKSApOwogCVNldEJrTW9kZTMyKCBoZGMsIFRSQU5TUEFSRU5UICk7Ci0JRHJhd1RleHQxNiggaGRjLCBidWZmZXIsIC0xLCAmciwKLSAgICAgICAgICAgICAgICAgICAgRFRfU0lOR0xFTElORSB8IERUX0NFTlRFUiB8IERUX1ZDRU5URVIgfCBEVF9OT1BSRUZJWCApOworCURyYXdUZXh0MzJBKCBoZGMsIGJ1ZmZlciwgLTEsICZyLAorICAgICAgICAgICAgICAgICAgICAgRFRfU0lOR0xFTElORSB8IERUX0NFTlRFUiB8IERUX1ZDRU5URVIgfCBEVF9OT1BSRUZJWCApOwogICAgIH0KIH0KIApAQCAtNjY2LDcgKzY2OCw3IEBACiB2b2lkIE5DX0RvTkNQYWludCggSFdORDMyIGh3bmQsIEhSR04zMiBjbGlwLCBCT09MMzIgc3VwcHJlc3NfbWVudXBhaW50ICkKIHsKICAgICBIREMzMiBoZGM7Ci0gICAgUkVDVDE2IHJlY3Q7CisgICAgUkVDVDMyIHJlY3Q7CiAgICAgQk9PTDMyIGFjdGl2ZTsKIAogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKQEAgLTcwMSwxMiArNzAzLDkgQEAKICAgICAgICAgaWYgKCh3bmRQdHItPmR3U3R5bGUgJiBXU19CT1JERVIpIHx8ICh3bmRQdHItPmR3U3R5bGUgJiBXU19ETEdGUkFNRSkgfHwKICAgICAgICAgICAgICh3bmRQdHItPmR3RXhTdHlsZSAmIFdTX0VYX0RMR01PREFMRlJBTUUpKQogICAgICAgICB7Ci0gICAgICAgICAgICBNb3ZlVG8oIGhkYywgMCwgMCApOwotICAgICAgICAgICAgTGluZVRvMzIoIGhkYywgcmVjdC5yaWdodC0xLCAwICk7Ci0gICAgICAgICAgICBMaW5lVG8zMiggaGRjLCByZWN0LnJpZ2h0LTEsIHJlY3QuYm90dG9tLTEgKTsKLSAgICAgICAgICAgIExpbmVUbzMyKCBoZGMsIDAsIHJlY3QuYm90dG9tLTEgKTsKLSAgICAgICAgICAgIExpbmVUbzMyKCBoZGMsIDAsIDAgKTsKLSAgICAgICAgICAgIEluZmxhdGVSZWN0MTYoICZyZWN0LCAtMSwgLTEgKTsKKyAgICAgICAgICAgIEdSQVBIX0RyYXdSZWN0YW5nbGUoIGhkYywgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLCAoSFBFTjMyKTAgKTsKKyAgICAgICAgICAgIEluZmxhdGVSZWN0MzIoICZyZWN0LCAtMSwgLTEgKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChIQVNfRExHRlJBTUUoIHduZFB0ci0+ZHdTdHlsZSwgd25kUHRyLT5kd0V4U3R5bGUgKSkgCkBAIC03MTYsNyArNzE1LDcgQEAKIAogICAgICAgICBpZiAoKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NBUFRJT04pID09IFdTX0NBUFRJT04pCiAgICAgICAgIHsKLSAgICAgICAgICAgIFJFQ1QxNiByID0gcmVjdDsKKyAgICAgICAgICAgIFJFQ1QzMiByID0gcmVjdDsKICAgICAgICAgICAgIHIuYm90dG9tID0gcmVjdC50b3AgKyBTWVNNRVRSSUNTX0NZU0laRTsKICAgICAgICAgICAgIHJlY3QudG9wICs9IFNZU01FVFJJQ1NfQ1lTSVpFICsgU1lTTUVUUklDU19DWUJPUkRFUjsKICAgICAgICAgICAgIE5DX0RyYXdDYXB0aW9uKCBoZGMsICZyLCBod25kLCB3bmRQdHItPmR3U3R5bGUsIGFjdGl2ZSApOwpAQCAtNzI1LDggKzcyNCw3IEBACiAKICAgICBpZiAoSEFTX01FTlUod25kUHRyKSkKICAgICB7Ci0JUkVDVDMyIHI7Ci0gICAgICAgIENPTlZfUkVDVDE2VE8zMiggJnJlY3QsICZyICk7CisJUkVDVDMyIHIgPSByZWN0OwogCXIuYm90dG9tID0gcmVjdC50b3AgKyBTWVNNRVRSSUNTX0NZTUVOVTsgIC8qIGRlZmF1bHQgaGVpZ2h0ICovCiAJcmVjdC50b3AgKz0gTUVOVV9EcmF3TWVudUJhciggaGRjLCAmciwgaHduZCwgc3VwcHJlc3NfbWVudXBhaW50ICk7CiAgICAgfQpAQCAtNzQyLDEwICs3NDAsMTAgQEAKIAogICAgIGlmICgod25kUHRyLT5kd1N0eWxlICYgV1NfVlNDUk9MTCkgJiYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0hTQ1JPTEwpKQogICAgIHsKLSAgICAgICAgUkVDVDE2IHIgPSByZWN0OworICAgICAgICBSRUNUMzIgciA9IHJlY3Q7CiAgICAgICAgIHIubGVmdCA9IHIucmlnaHQgLSBTWVNNRVRSSUNTX0NYVlNDUk9MTCArIDE7CiAgICAgICAgIHIudG9wICA9IHIuYm90dG9tIC0gU1lTTUVUUklDU19DWUhTQ1JPTEwgKyAxOwotICAgICAgICBGaWxsUmVjdDE2KCBoZGMsICZyLCBzeXNDb2xvck9iamVjdHMuaGJydXNoU2Nyb2xsYmFyICk7CisgICAgICAgIEZpbGxSZWN0MzIoIGhkYywgJnIsIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hTY3JvbGxiYXIgKTsKICAgICB9ICAgIAogCiAgICAgUmVsZWFzZURDMzIoIGh3bmQsIGhkYyApOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9wYWludGluZy5jIGIvd2luZG93cy9wYWludGluZy5jCmluZGV4IDc4ZjYwNjIuLjExOTZiOGYgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvcGFpbnRpbmcuYworKysgYi93aW5kb3dzL3BhaW50aW5nLmMKQEAgLTIzNSw3ICsyMzUsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgUEFJTlRfUmVkcmF3V2luZG93CiAgKgotICogTm90ZTogV2luZG93cyB1c2VzIFdNX1NZTkNQQUlOVCB0byBjdXQgZG93biB0aGUgbnVtYmVyIG9mIGludGVydGFzaworICogRklYTUU6IFdpbmRvd3MgdXNlcyBXTV9TWU5DUEFJTlQgdG8gY3V0IGRvd24gdGhlIG51bWJlciBvZiBpbnRlcnRhc2sKICAqIFNlbmRNZXNzYWdlKCkgY2FsbHMuIEZyb20gU0RLOgogICogICBUaGlzIG1lc3NhZ2UgYXZvaWRzIGxvdHMgb2YgaW50ZXItYXBwIG1lc3NhZ2UgdHJhZmZpYwogICogICBieSBzd2l0Y2hpbmcgdG8gdGhlIG90aGVyIHRhc2sgYW5kIGNvbnRpbnVpbmcgdGhlCkBAIC0yNTYsOCArMjU2LDggQEAKIAogICAgIGlmICghaHduZCkgaHduZCA9IEdldERlc2t0b3BXaW5kb3czMigpOwogICAgIGlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICkpKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCFJc1dpbmRvd1Zpc2libGUzMihod25kKSB8fCAod25kUHRyLT5mbGFncyAmIFdJTl9OT19SRURSQVcpKQotICAgICAgICByZXR1cm4gVFJVRTsgIC8qIE5vIHJlZHJhdyBuZWVkZWQgKi8KKyAgICBpZiAoIVdJTl9Jc1dpbmRvd0RyYXdhYmxlKCB3bmRQdHIsICEoZmxhZ3MgJiBSRFdfRlJBTUUpICkgCisJfHwgKHduZFB0ci0+ZmxhZ3MgJiBXSU5fTk9fUkVEUkFXKSkgcmV0dXJuIFRSVUU7ICAvKiBObyByZWRyYXcgbmVlZGVkICovCiAKICAgICBiSWNvbiA9ICh3bmRQdHItPmR3U3R5bGUgJiBXU19NSU5JTUlaRSAmJiB3bmRQdHItPmNsYXNzLT5oSWNvbik7CiAgICAgaWYgKHJlY3RVcGRhdGUpCkBAIC00NTUsMTMgKzQ1NSw3IEBACiBCT09MMzIgUmVkcmF3V2luZG93MzIoIEhXTkQzMiBod25kLCBjb25zdCBSRUNUMzIgKnJlY3RVcGRhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgIEhSR04zMiBocmduVXBkYXRlLCBVSU5UMzIgZmxhZ3MgKQogewotICAgIFdORCogd25kID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKLQotICAgIC8qIGNoZWNrIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0byByZWRyYXcgKi8KLQotICAgIHJldHVybiAoIHduZCAmJiBXSU5fSXNXaW5kb3dEcmF3YWJsZSggd25kLCAhKGZsYWdzICYgUkRXX0ZSQU1FKSApICkKLSAgICAgICAgICAgPyBQQUlOVF9SZWRyYXdXaW5kb3coIGh3bmQsIHJlY3RVcGRhdGUsIGhyZ25VcGRhdGUsIGZsYWdzLCAwICkKLQkgICA6IDE7CisgICAgcmV0dXJuIFBBSU5UX1JlZHJhd1dpbmRvdyggaHduZCwgcmVjdFVwZGF0ZSwgaHJnblVwZGF0ZSwgZmxhZ3MsIDAgKTsKIH0KIAogCkBAIC00NzcsNyArNDcxLDggQEAKICAgICAgICAgQ09OVl9SRUNUMTZUTzMyKCByZWN0VXBkYXRlLCAmciApOwogICAgICAgICByZXR1cm4gKEJPT0wxNilSZWRyYXdXaW5kb3czMiggKEhXTkQzMilod25kLCAmciwgaHJnblVwZGF0ZSwgZmxhZ3MgKTsKICAgICB9Ci0gICAgcmV0dXJuIChCT09MMTYpUmVkcmF3V2luZG93MzIoIChIV05EMzIpaHduZCwgTlVMTCwgaHJnblVwZGF0ZSwgZmxhZ3MgKTsKKyAgICByZXR1cm4gKEJPT0wxNilQQUlOVF9SZWRyYXdXaW5kb3coIChIV05EMzIpaHduZCwgTlVMTCwgCisJCQkJICAgICAgIChIUkdOMzIpaHJnblVwZGF0ZSwgZmxhZ3MsIDAgKTsKIH0KIAogCkBAIC00ODYsMjUgKzQ4MSwyNCBAQAogICovCiB2b2lkIFVwZGF0ZVdpbmRvdzE2KCBIV05EMTYgaHduZCApCiB7Ci0gICAgUmVkcmF3V2luZG93MzIoIGh3bmQsIE5VTEwsIDAsIFJEV19VUERBVEVOT1cgfCBSRFdfTk9DSElMRFJFTiApOworICAgIFBBSU5UX1JlZHJhd1dpbmRvdyggaHduZCwgTlVMTCwgMCwgUkRXX1VQREFURU5PVyB8IFJEV19OT0NISUxEUkVOLCAwICk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgVXBkYXRlV2luZG93MzIgICAoVVNFUjMyLjU2NikKICAqLwogdm9pZCBVcGRhdGVXaW5kb3czMiggSFdORDMyIGh3bmQgKQogewotICAgIFJlZHJhd1dpbmRvdzMyKCBod25kLCBOVUxMLCAwLCBSRFdfVVBEQVRFTk9XIHwgUkRXX05PQ0hJTERSRU4gKTsKKyAgICBQQUlOVF9SZWRyYXdXaW5kb3coIGh3bmQsIE5VTEwsIDAsIFJEV19VUERBVEVOT1cgfCBSRFdfTk9DSElMRFJFTiwgMCApOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEludmFsaWRhdGVSZ24xNiAgIChVU0VSLjEyNikKICAqLwogdm9pZCBJbnZhbGlkYXRlUmduMTYoIEhXTkQxNiBod25kLCBIUkdOMTYgaHJnbiwgQk9PTDE2IGVyYXNlICkKIHsKLSAgICBSZWRyYXdXaW5kb3czMihod25kLCBOVUxMLCBocmduLCBSRFdfSU5WQUxJREFURSB8IChlcmFzZSA/IFJEV19FUkFTRSA6IDApICk7CisgICAgUEFJTlRfUmVkcmF3V2luZG93KChIV05EMzIpaHduZCwgTlVMTCwgKEhSR04zMilocmduLCAKKwkJICAgICAgIFJEV19JTlZBTElEQVRFIHwgKGVyYXNlID8gUkRXX0VSQVNFIDogMCksIDAgKTsKIH0KIAogCkBAIC01MTMsNyArNTA3LDcgQEAKICAqLwogdm9pZCBJbnZhbGlkYXRlUmduMzIoIEhXTkQzMiBod25kLCBIUkdOMzIgaHJnbiwgQk9PTDMyIGVyYXNlICkKIHsKLSAgICBSZWRyYXdXaW5kb3czMihod25kLCBOVUxMLCBocmduLCBSRFdfSU5WQUxJREFURSB8IChlcmFzZSA/IFJEV19FUkFTRSA6IDApICk7CisgICAgUEFJTlRfUmVkcmF3V2luZG93KGh3bmQsIE5VTEwsIGhyZ24sIFJEV19JTlZBTElEQVRFIHwgKGVyYXNlID8gUkRXX0VSQVNFIDogMCksIDAgKTsKIH0KIAogCkBAIC01MzEsNyArNTI1LDggQEAKICAqLwogdm9pZCBJbnZhbGlkYXRlUmVjdDMyKCBIV05EMzIgaHduZCwgY29uc3QgUkVDVDMyICpyZWN0LCBCT09MMzIgZXJhc2UgKQogewotICAgIFJlZHJhd1dpbmRvdzMyKCBod25kLCByZWN0LCAwLCBSRFdfSU5WQUxJREFURSB8IChlcmFzZSA/IFJEV19FUkFTRSA6IDApICk7CisgICAgUEFJTlRfUmVkcmF3V2luZG93KCBod25kLCByZWN0LCAwLCAKKwkJCVJEV19JTlZBTElEQVRFIHwgKGVyYXNlID8gUkRXX0VSQVNFIDogMCksIDAgKTsKIH0KIAogCkBAIC01NDAsNyArNTM1LDggQEAKICAqLwogdm9pZCBWYWxpZGF0ZVJnbjE2KCBIV05EMTYgaHduZCwgSFJHTjE2IGhyZ24gKQogewotICAgIFJlZHJhd1dpbmRvdzMyKCBod25kLCBOVUxMLCBocmduLCBSRFdfVkFMSURBVEUgfCBSRFdfTk9DSElMRFJFTiApOworICAgIFBBSU5UX1JlZHJhd1dpbmRvdyggKEhXTkQzMilod25kLCBOVUxMLCAoSFJHTjMyKWhyZ24sIAorCQkJUkRXX1ZBTElEQVRFIHwgUkRXX05PQ0hJTERSRU4sIDAgKTsKIH0KIAogCkBAIC01NDksNyArNTQ1LDcgQEAKICAqLwogdm9pZCBWYWxpZGF0ZVJnbjMyKCBIV05EMzIgaHduZCwgSFJHTjMyIGhyZ24gKQogewotICAgIFJlZHJhd1dpbmRvdzMyKCBod25kLCBOVUxMLCBocmduLCBSRFdfVkFMSURBVEUgfCBSRFdfTk9DSElMRFJFTiApOworICAgIFBBSU5UX1JlZHJhd1dpbmRvdyggaHduZCwgTlVMTCwgaHJnbiwgUkRXX1ZBTElEQVRFIHwgUkRXX05PQ0hJTERSRU4sIDAgKTsKIH0KIAogCkBAIC01NjcsNyArNTYzLDcgQEAKICAqLwogdm9pZCBWYWxpZGF0ZVJlY3QzMiggSFdORDMyIGh3bmQsIGNvbnN0IFJFQ1QzMiAqcmVjdCApCiB7Ci0gICAgUmVkcmF3V2luZG93MzIoIGh3bmQsIHJlY3QsIDAsIFJEV19WQUxJREFURSB8IFJEV19OT0NISUxEUkVOICk7CisgICAgUEFJTlRfUmVkcmF3V2luZG93KCBod25kLCByZWN0LCAwLCBSRFdfVkFMSURBVEUgfCBSRFdfTk9DSElMRFJFTiwgMCApOwogfQogCiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvdGltZXIuYyBiL3dpbmRvd3MvdGltZXIuYwppbmRleCA5M2Y4NTYzLi5iMDhlODkyIDEwMDY0NAotLS0gYS93aW5kb3dzL3RpbWVyLmMKKysrIGIvd2luZG93cy90aW1lci5jCkBAIC04Nyw3ICs4Nyw3IEBACiAgICAgcFRpbWVyLT5tc2cgICAgID0gMDsKICAgICBwVGltZXItPmlkICAgICAgPSAwOwogICAgIHBUaW1lci0+dGltZW91dCA9IDA7Ci0gICAgV0lOUFJPQ19GcmVlUHJvYyggcFRpbWVyLT5wcm9jICk7CisgICAgV0lOUFJPQ19GcmVlUHJvYyggcFRpbWVyLT5wcm9jLCBXSU5fUFJPQ19USU1FUiApOwogfQogCiAKQEAgLTIzNSw5ICsyMzUsMTAgQEAKICAgICAgICAgICAgICAgLyogR290IG9uZTogc2V0IG5ldyB2YWx1ZXMgYW5kIHJldHVybiAqLwogICAgICAgICAgICAgVElNRVJfUmVtb3ZlVGltZXIoIHBUaW1lciApOwogICAgICAgICAgICAgcFRpbWVyLT50aW1lb3V0ID0gdGltZW91dDsKLSAgICAgICAgICAgIFdJTlBST0NfRnJlZVByb2MoIHBUaW1lci0+cHJvYyApOworICAgICAgICAgICAgV0lOUFJPQ19GcmVlUHJvYyggcFRpbWVyLT5wcm9jLCBXSU5fUFJPQ19USU1FUiApOwogICAgICAgICAgICAgcFRpbWVyLT5wcm9jID0gKEhXSU5ET1dQUk9DKTA7Ci0gICAgICAgICAgICBpZiAocHJvYykgV0lOUFJPQ19TZXRQcm9jKCAmcFRpbWVyLT5wcm9jLCBwcm9jLCB0eXBlICk7CisgICAgICAgICAgICBpZiAocHJvYykgV0lOUFJPQ19TZXRQcm9jKCAmcFRpbWVyLT5wcm9jLCBwcm9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgV0lOX1BST0NfVElNRVIgKTsKICAgICAgICAgICAgIHBUaW1lci0+ZXhwaXJlcyA9IEdldFRpY2tDb3VudCgpICsgdGltZW91dDsKICAgICAgICAgICAgIFRJTUVSX0luc2VydFRpbWVyKCBwVGltZXIgKTsKICAgICAgICAgICAgIHJldHVybiBpZDsKQEAgLTI2Miw3ICsyNjMsNyBAQAogICAgIHBUaW1lci0+dGltZW91dCA9IHRpbWVvdXQ7CiAgICAgcFRpbWVyLT5leHBpcmVzID0gR2V0VGlja0NvdW50KCkgKyB0aW1lb3V0OwogICAgIHBUaW1lci0+cHJvYyAgICA9IChIV0lORE9XUFJPQykwOwotICAgIGlmIChwcm9jKSBXSU5QUk9DX1NldFByb2MoICZwVGltZXItPnByb2MsIHByb2MsIHR5cGUgKTsKKyAgICBpZiAocHJvYykgV0lOUFJPQ19TZXRQcm9jKCAmcFRpbWVyLT5wcm9jLCBwcm9jLCB0eXBlLCBXSU5fUFJPQ19USU1FUiApOwogICAgIGRwcmludGZfdGltZXIoIHN0ZGRlYiwgIlRpbWVyIGFkZGVkOiAlcCwgJTA0eCwgJTA0eCwgJTA0eCwgJTA4bHhcbiIsIAogCQkgICBwVGltZXIsIHBUaW1lci0+aHduZCwgcFRpbWVyLT5tc2csIHBUaW1lci0+aWQsCiAgICAgICAgICAgICAgICAgICAgKERXT1JEKXBUaW1lci0+cHJvYyApOwpkaWZmIC0tZ2l0IGEvd2luZG93cy93aW4uYyBiL3dpbmRvd3Mvd2luLmMKaW5kZXggZDI3M2IyYi4uZTViZTZmNCAxMDA2NDQKLS0tIGEvd2luZG93cy93aW4uYworKysgYi93aW5kb3dzL3dpbi5jCkBAIC0zNjMsNyArMzYzLDcgQEAKICAgICBpZiAod25kUHRyLT53aW5kb3cpIEVWRU5UX0Rlc3Ryb3lXaW5kb3coIHduZFB0ciApOwogICAgIGlmICh3bmRQdHItPmNsYXNzLT5zdHlsZSAmIENTX09XTkRDKSBEQ0VfRnJlZURDRSggd25kUHRyLT5kY2UgKTsKIAotICAgIFdJTlBST0NfRnJlZVByb2MoIHduZFB0ci0+d2lucHJvYyApOworICAgIFdJTlBST0NfRnJlZVByb2MoIHduZFB0ci0+d2lucHJvYywgV0lOX1BST0NfV0lORE9XICk7CiAKICAgICB3bmRQdHItPmNsYXNzLT5jV2luZG93cy0tOwogICAgIHduZFB0ci0+Y2xhc3MgPSBOVUxMOwpAQCAtNDE1LDcgKzQxNSw2IEBACiAgICAgcFduZERlc2t0b3AtPnBhcmVudCAgICAgICAgICAgID0gTlVMTDsKICAgICBwV25kRGVza3RvcC0+b3duZXIgICAgICAgICAgICAgPSBOVUxMOwogICAgIHBXbmREZXNrdG9wLT5jbGFzcyAgICAgICAgICAgICA9IGNsYXNzOwotICAgIHBXbmREZXNrdG9wLT53aW5wcm9jICAgICAgICAgICA9IE5VTEw7CiAgICAgcFduZERlc2t0b3AtPmR3TWFnaWMgICAgICAgICAgID0gV05EX01BR0lDOwogICAgIHBXbmREZXNrdG9wLT5od25kU2VsZiAgICAgICAgICA9IGh3bmREZXNrdG9wOwogICAgIHBXbmREZXNrdG9wLT5oSW5zdGFuY2UgICAgICAgICA9IDA7CkBAIC00NDYsNyArNDQ1LDggQEAKICAgICBwV25kRGVza3RvcC0+aFN5c01lbnUgICAgICAgICAgPSAwOwogICAgIHBXbmREZXNrdG9wLT51c2VyZGF0YSAgICAgICAgICA9IDA7CiAKLSAgICBXSU5QUk9DX1NldFByb2MoICZwV25kRGVza3RvcC0+d2lucHJvYywgKFdORFBST0MxNiljbGFzcy0+d2lucHJvYywgMCApOworICAgIHBXbmREZXNrdG9wLT53aW5wcm9jID0gKFdORFBST0MxNiljbGFzcy0+d2lucHJvYzsKKwogICAgIEVWRU5UX1JlZ2lzdGVyV2luZG93KCBwV25kRGVza3RvcCApOwogICAgIFNlbmRNZXNzYWdlMzJBKCBod25kRGVza3RvcCwgV01fTkNDUkVBVEUsIDAsIDAgKTsKICAgICBwV25kRGVza3RvcC0+ZmxhZ3MgfD0gV0lOX05FRURTX0VSQVNFQktHTkQ7CkBAIC01NTAsNyArNTUwLDcgQEAKIAogICAgIHduZFB0ci0+d2luZG93ICAgICAgICAgPSAwOwogICAgIHduZFB0ci0+Y2xhc3MgICAgICAgICAgPSBjbGFzc1B0cjsKLSAgICB3bmRQdHItPndpbnByb2MgICAgICAgID0gTlVMTDsKKyAgICB3bmRQdHItPndpbnByb2MgICAgICAgID0gY2xhc3NQdHItPndpbnByb2M7CiAgICAgd25kUHRyLT5kd01hZ2ljICAgICAgICA9IFdORF9NQUdJQzsKICAgICB3bmRQdHItPmh3bmRTZWxmICAgICAgID0gaHduZDsKICAgICB3bmRQdHItPmhJbnN0YW5jZSAgICAgID0gY3MtPmhJbnN0YW5jZTsKQEAgLTU5MiwxMCArNTkyLDkgQEAKIAl9CiAgICAgfQogCi0gICAgLyogU2V0IHRoZSB3aW5kb3cgcHJvY2VkdXJlICovCisgICAgLyogSW5jcmVtZW50IGNsYXNzIHdpbmRvdyBjb3VudGVyICovCiAKICAgICBjbGFzc1B0ci0+Y1dpbmRvd3MrKzsKLSAgICBXSU5QUk9DX1NldFByb2MoICZ3bmRQdHItPndpbnByb2MsIChXTkRQUk9DMTYpY2xhc3NQdHItPndpbnByb2MsIDAgKTsKIAogICAgIC8qIENvcnJlY3QgdGhlIHdpbmRvdyBzdHlsZSAqLwogCkBAIC0xNTA5LDcgKzE1MDgsOCBAQAogICAgICAgICBpZiAoKG9mZnNldCA9PSBEV0xfRExHUFJPQykgJiYgKHduZFB0ci0+ZmxhZ3MgJiBXSU5fSVNESUFMT0cpKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR2YWwgPSAoTE9ORylXSU5QUk9DX0dldFByb2MoIChIV0lORE9XUFJPQykqcHRyLCB0eXBlICk7Ci0gICAgICAgICAgICBXSU5QUk9DX1NldFByb2MoIChIV0lORE9XUFJPQyAqKXB0ciwgKFdORFBST0MxNiluZXd2YWwsIHR5cGUgKTsKKyAgICAgICAgICAgIFdJTlBST0NfU2V0UHJvYyggKEhXSU5ET1dQUk9DICopcHRyLCAoV05EUFJPQzE2KW5ld3ZhbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIFdJTl9QUk9DX1dJTkRPVyApOwogICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKICAgICAgICAgfQogICAgIH0KQEAgLTE1MjAsNyArMTUyMCw4IEBACiAgICAgICAgICAgICByZXR1cm4gU2V0V2luZG93V29yZDMyKCBod25kLCBvZmZzZXQsIChXT1JEKW5ld3ZhbCApOwogCWNhc2UgR1dMX1dORFBST0M6CiAgICAgICAgICAgICByZXR2YWwgPSAoTE9ORylXSU5QUk9DX0dldFByb2MoIHduZFB0ci0+d2lucHJvYywgdHlwZSApOwotICAgICAgICAgICAgV0lOUFJPQ19TZXRQcm9jKCAmd25kUHRyLT53aW5wcm9jLCAoV05EUFJPQzE2KW5ld3ZhbCwgdHlwZSApOworICAgICAgICAgICAgV0lOUFJPQ19TZXRQcm9jKCAmd25kUHRyLT53aW5wcm9jLCAoV05EUFJPQzE2KW5ld3ZhbCwgCisJCQkJCQl0eXBlLCBXSU5fUFJPQ19XSU5ET1cgKTsKICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CiAJY2FzZSBHV0xfU1RZTEU6CiAKQEAgLTE4MTQsMjcgKzE4MTUsMjMgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgV0lOX0lzV2luZG93RHJhd2FibGUKLSAqIAotICogaHduZCBpcyBkcmF3YWJsZSB3aGVuIGl0IGlzIHZpc2libGUsIGFsbCBwYXJlbnRzIGFyZSBub3QgCi0gKiBtaW5pbWl6ZWQsIGFuZCBpdCBpcyBpdHNlbGYgbm90IG1pbmltaXplZCB1bmxlc3Mgd2UgYXJlIAorICoKKyAqIGh3bmQgaXMgZHJhd2FibGUgd2hlbiBpdCBpcyB2aXNpYmxlLCBhbGwgcGFyZW50cyBhcmUgbm90CisgKiBtaW5pbWl6ZWQsIGFuZCBpdCBpcyBpdHNlbGYgbm90IG1pbmltaXplZCB1bmxlc3Mgd2UgYXJlCiAgKiB0cnlpbmcgdG8gZHJhdyBpY29uIGFuZCB0aGUgZGVmYXVsdCBjbGFzcyBpY29uIGlzIHNldC4KICAqLwogQk9PTDMyIFdJTl9Jc1dpbmRvd0RyYXdhYmxlKCBXTkQqIHduZCAsIEJPT0wzMiBpY29uICkKIHsKLSAgSFdORDMyIGh3bmQgPSB3bmQtPmh3bmRTZWxmOwotICBCT09MMzIgeWVzID0gVFJVRTsKLQotICB3aGlsZSh3bmQgJiYgeWVzKQotICB7IAotICAgIGlmKCB3bmQtPmR3U3R5bGUgJiBXU19NSU5JTUlaRSApCi0JaWYoIHduZC0+aHduZFNlbGYgIT0gaHduZCApIGJyZWFrOwotCWVsc2UgaWYoIGljb24gJiYgd25kLT5jbGFzcy0+aEljb24gKSBicmVhazsKLQotICAgIHllcyA9IHllcyAmJiAod25kLT5kd1N0eWxlICYgV1NfVklTSUJMRSk7Ci0gICAgd25kID0gd25kLT5wYXJlbnQ7IH0gICAgICAKLSAgcmV0dXJuICghd25kICYmIHllcyk7CisgIGlmKCAod25kLT5kd1N0eWxlICYgV1NfTUlOSU1JWkUgJiYKKyAgICAgICBpY29uICYmIHduZC0+Y2xhc3MtPmhJY29uKSB8fAorICAgICAhKHduZC0+ZHdTdHlsZSAmIFdTX1ZJU0lCTEUpICkgcmV0dXJuIEZBTFNFOworICBmb3Iod25kID0gd25kLT5wYXJlbnQ7IHduZDsgd25kID0gd25kLT5wYXJlbnQpCisgICAgaWYoIHduZC0+ZHdTdHlsZSAmIFdTX01JTklNSVpFIHx8CisgICAgICAhKHduZC0+ZHdTdHlsZSAmIFdTX1ZJU0lCTEUpICkgYnJlYWs7CisgIHJldHVybiAod25kID09IE5VTEwpOwogfQogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgIEdldFRvcFdpbmRvdzE2ICAgIChVU0VSLjIyOSkKICAqLwpkaWZmIC0tZ2l0IGEvd2luZG93cy93aW5wb3MuYyBiL3dpbmRvd3Mvd2lucG9zLmMKaW5kZXggODc2ZTY1Yi4uOTdiYmIyNCAxMDA2NDQKLS0tIGEvd2luZG93cy93aW5wb3MuYworKysgYi93aW5kb3dzL3dpbnBvcy5jCkBAIC0xNTcsNiArMTU3LDI0IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICBTd2l0Y2hUb1RoaXNXaW5kb3cxNiAgIChVU0VSLjE3MikKKyAqLwordm9pZCBTd2l0Y2hUb1RoaXNXaW5kb3cxNiggSFdORDE2IGh3bmQsIEJPT0wxNiByZXN0b3JlICkKK3sKKyAgICBTd2l0Y2hUb1RoaXNXaW5kb3czMiggaHduZCwgcmVzdG9yZSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgU3dpdGNoVG9UaGlzV2luZG93MzIgICAoVVNFUjMyLjUzOCkKKyAqLwordm9pZCBTd2l0Y2hUb1RoaXNXaW5kb3czMiggSFdORDMyIGh3bmQsIEJPT0wzMiByZXN0b3JlICkKK3sKKyAgICBTaG93V2luZG93MzIoIGh3bmQsIHJlc3RvcmUgPyBTV19SRVNUT1JFIDogU1dfU0hPV01JTklNSVpFRCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldFdpbmRvd1JlY3QxNiAgIChVU0VSLjMyKQogICovCiB2b2lkIEdldFdpbmRvd1JlY3QxNiggSFdORDE2IGh3bmQsIExQUkVDVDE2IHJlY3QgKSAKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2lucHJvYy5jIGIvd2luZG93cy93aW5wcm9jLmMKaW5kZXggZDdhMTk2YS4uN2I1NjE5NyAxMDA2NDQKLS0tIGEvd2luZG93cy93aW5wcm9jLmMKKysrIGIvd2luZG93cy93aW5wcm9jLmMKQEAgLTE3LDcgKzE3LDkgQEAKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKLS8qIFdpbmRvdyBwcm9jZWR1cmUgMTYtYml0IHRodW5rOyBzZWUgQnVpbGRTcGVjMTZGaWxlcygpIGluIHRvb2xzL2J1aWxkLmMgKi8KKy8qIFdpbmRvdyBwcm9jZWR1cmUgMTYtLXRvLTMyLWJpdCB0aHVuaywKKyAqIHNlZSBCdWlsZFNwZWMxNkZpbGVzKCkgaW4gdG9vbHMvYnVpbGQuYyAqLworCiB0eXBlZGVmIHN0cnVjdAogewogICAgIEJZVEUgICAgICAgcG9wbF9lYXg7ICAgICAgICAgICAgIC8qIHBvcGwgICVlYXggKHJldHVybiBhZGRyZXNzKSAqLwpAQCAtMjgsMTEgKzMwLDEzIEBACiAgICAgQllURSAgICAgICBwdXNobF90aHVuazsgICAgICAgICAgLyogcHVzaGwgJHRodW5rZnJvbTE2ICovCiAgICAgdm9pZCAgICAgKCp0aHVuazMyKSgpIFdJTkVfUEFDS0VEOwogICAgIEJZVEUgICAgICAgbGNhbGw7ICAgICAgICAgICAgICAgIC8qIGxjYWxsIGNzOnJlbGF5ICovCi0gICAgdm9pZCAgICAgKCpyZWxheSkoKSBXSU5FX1BBQ0tFRDsKKyAgICB2b2lkICAgICAoKnJlbGF5KSgpIFdJTkVfUEFDS0VEOyAvKiBXSU5QUk9DX0NhbGxQcm9jMTZUbzMyQS9XKCkgKi8KICAgICBXT1JEICAgICAgIGNzIFdJTkVfUEFDS0VEOwogfSBXSU5QUk9DX1RIVU5LX0ZST00xNjsKIAotLyogV2luZG93IHByb2NlZHVyZSAzMi1iaXQgdGh1bms7IHNlZSBCdWlsZFNwZWMzMkZpbGVzKCkgaW4gdG9vbHMvYnVpbGQuYyAqLworLyogV2luZG93IHByb2NlZHVyZSAzMi10by0xNi1iaXQgdGh1bmssCisgKiBzZWUgQnVpbGRTcGVjMzJGaWxlcygpIGluIHRvb2xzL2J1aWxkLmMgKi8KKwogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBCWVRFICAgICAgIHBvcGxfZWF4OyAgICAgICAgICAgICAvKiBwb3BsICAlZWF4IChyZXR1cm4gYWRkcmVzcykgKi8KQEAgLTQ1LDcgKzQ5LDcgQEAKICAgICBCWVRFICAgICAgIHB1c2hsX3RodW5rOyAgICAgICAgICAvKiBwdXNobCAkdGh1bmtmcm9tMzIgKi8KICAgICB2b2lkICAgICAoKnRodW5rMzIpKCkgV0lORV9QQUNLRUQ7CiAgICAgQllURSAgICAgICBqbXA7ICAgICAgICAgICAgICAgICAgLyogam1wICAgcmVsYXkgKHJlbGF0aXZlIGp1bXApKi8KLSAgICB2b2lkICAgICAoKnJlbGF5KSgpIFdJTkVfUEFDS0VEOworICAgIHZvaWQgICAgICgqcmVsYXkpKCkgV0lORV9QQUNLRUQ7IC8qIFdJTlBST0NfQ2FsbFByb2MzMkFUbzE2KCkgKi8KIH0gV0lOUFJPQ19USFVOS19GUk9NMzI7CiAKIC8qIFNpbXBsZSBqbXAgdG8gY2FsbCAzMi1iaXQgcHJvY2VkdXJlIGRpcmVjdGx5ICovCkBAIC02OCw2ICs3Miw3IEBACiAgICAgc3RydWN0IHRhZ1dJTkRPV1BST0MgKm5leHQ7ICAgICAvKiBOZXh0IHdpbmRvdyBwcm9jICovCiAgICAgVUlOVDMyICAgICAgICAgICAgICAgIG1hZ2ljOyAgICAvKiBNYWdpYyBudW1iZXIgKi8KICAgICBXSU5ET1dQUk9DVFlQRSAgICAgICAgdHlwZTsgICAgIC8qIEZ1bmN0aW9uIHR5cGUgKi8KKyAgICBXSU5ET1dQUk9DVVNFUiAgICAgICAgdXNlcjsgICAgIC8qIEZ1bmN0aW9uIHVzZXIgKi8KIH0gV0lORE9XUFJPQzsKIAogI2RlZmluZSBXSU5QUk9DX01BR0lDICAoJ1cnIHwgKCdQJyA8PCA4KSB8ICgnUicgPDwgMTYpIHwgKCdDJyA8PCAyNCkpCkBAIC0xNjIsNyArMTY3LDggQEAKICAqCiAgKiBBbGxvY2F0ZSBhIG5ldyB3aW5kb3cgcHJvY2VkdXJlLgogICovCi1zdGF0aWMgV0lORE9XUFJPQyAqV0lOUFJPQ19BbGxvY1dpblByb2MoIFdORFBST0MxNiBmdW5jLCBXSU5ET1dQUk9DVFlQRSB0eXBlICkKK3N0YXRpYyBXSU5ET1dQUk9DICpXSU5QUk9DX0FsbG9jV2luUHJvYyggV05EUFJPQzE2IGZ1bmMsIFdJTkRPV1BST0NUWVBFIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkRPV1BST0NVU0VSIHVzZXIgKQogewogICAgIFdJTkRPV1BST0MgKnByb2MsICpvbGRwcm9jOwogCkBAIC0yMjAsNiArMjI2LDcgQEAKICAgICAgICAgfQogICAgICAgICBwcm9jLT5tYWdpYyA9IFdJTlBST0NfTUFHSUM7CiAgICAgICAgIHByb2MtPnR5cGUgID0gdHlwZTsKKyAgICAgICAgcHJvYy0+dXNlciAgPSB1c2VyOwogICAgIH0KICAgICBwcm9jLT5uZXh0ICA9IE5VTEw7CiAgICAgZHByaW50Zl93aW4oIHN0ZGRlYiwgIldJTlBST0NfQWxsb2NXaW5Qcm9jKCUwOHgsJWQpOiByZXR1cm5pbmcgJTA4eFxuIiwKQEAgLTI1NywxMSArMjY0LDI4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJICAgICBXSU5QUk9DX1NldFByb2MKICAqCi0gKiBTZXQgdGhlIHdpbmRvdyBwcm9jZWR1cmUgZm9yIGEgd2luZG93IG9yIGNsYXNzLgorICogU2V0IHRoZSB3aW5kb3cgcHJvY2VkdXJlIGZvciBhIHdpbmRvdyBvciBjbGFzcy4gVGhlcmUgYXJlCisgKiB0aHJlZSB0cmVlIGNsYXNzZXMgb2Ygd2lucHJvYyBjYWxsYmFja3M6CisgKgorICogMSkgY2xhc3MgIC0+IHdwICAgICAgICAgICAgICAgICAJLQlub3Qgc3ViY2xhc3NlZAorICogICAgY2xhc3MgIC0+IHdwIC0+IHdwIC0+IHdwIC0+IHdwIAktCVNldENsYXNzTG9uZygpCisgKiAgICAgICAgICAgICAvICAgICAgICAgICAvCisgKiAyKSB3aW5kb3cgLScgICAgICAgICAgIC8JCS0Jbm90IHN1YmNsYXNzZWQKKyAqICAgIHdpbmRvdyAtPiB3cCAtPiB3cCAnICAgICAgICAgICAJLQlTZXRXaW5kb3dMb25nKCkKKyAqCisgKiAzKSB0aW1lciAgLT4gd3AgICAgICAgICAgICAgICAgICAgCS0JU2V0VGltZXIoKQorICoKKyAqIEluaXRpYWxseSwgd2lucHJvYyBvZiB0aGUgd2luZG93IHBvaW50cyB0byB0aGUgY3VycmVudCB3aW5wcm9jIAorICogdGh1bmsgb2YgaXRzIGNsYXNzLiBTdWJjbGFzc2luZyBwcmVwZW5kcyBhIG5ldyB0aHVuayB0byB0aGUgCisgKiB3aW5kb3cgd2lucHJvYyBjaGFpbiBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdC4gVGh1cywgd2luZG93IHRodW5rIAorICogbGlzdCBpbmNsdWRlcyBjbGFzcyB0aHVua3MgYW5kIHRoZSBsYXR0ZXIgYXJlIHByZXNlcnZlZCB3aGVuIHRoZSAKKyAqIHdpbmRvdyBpcyBkZXN0cm95ZWQuCisgKgogICovCiBCT09MMzIgV0lOUFJPQ19TZXRQcm9jKCBIV0lORE9XUFJPQyAqcEZpcnN0LCBXTkRQUk9DMTYgZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgIFdJTkRPV1BST0NUWVBFIHR5cGUgKQorICAgICAgICAgICAgICAgICAgICAgICAgV0lORE9XUFJPQ1RZUEUgdHlwZSwgV0lORE9XUFJPQ1VTRVIgdXNlciApCiB7CisgICAgQk9PTDMyIGJSZWN5Y2xlID0gRkFMU0U7CiAgICAgV0lORE9XUFJPQyAqcHJvYywgKipwcFByZXY7CiAKICAgICAvKiBDaGVjayBpZiBmdW5jdGlvbiBpcyBhbHJlYWR5IGluIHRoZSBsaXN0ICovCkBAIC0yNzIsMTggKzI5NiwzOCBAQAogICAgIHsKICAgICAgICAgaWYgKHByb2MpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICgqcHBQcmV2ID09IHByb2MpIGJyZWFrOworICAgICAgICAgICAgaWYgKCpwcFByZXYgPT0gcHJvYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKCpwcFByZXYpLT51c2VyICE9IHVzZXIpCisJCXsKKwkJICAgIC8qIHRlcm1pbmFsIHRodW5rIGlzIGJlaW5nIHJlc3RvcmVkICovCisKKwkJICAgIFdJTlBST0NfRnJlZVByb2MoICpwRmlyc3QsICgqcHBQcmV2KS0+dXNlciApOworCQkgICAgKihXSU5ET1dQUk9DICoqKXBGaXJzdCA9ICpwcFByZXY7CisJCSAgICByZXR1cm4gVFJVRTsKKwkJfQorCQliUmVjeWNsZSA9IFRSVUU7CisJCWJyZWFrOworCSAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoKCgqcHBQcmV2KS0+dHlwZSA9PSB0eXBlKSAmJgotICAgICAgICAgICAgICAgIChmdW5jID09IFdJTlBST0NfVEhVTktQUk9DKCpwcFByZXYpKSkgYnJlYWs7CisgICAgICAgICAgICAgICAgKGZ1bmMgPT0gV0lOUFJPQ19USFVOS1BST0MoKnBwUHJldikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJSZWN5Y2xlID0gVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIC8qIFdQRl9DTEFTUyB0aHVuayB0ZXJtaW5hdGVzIHdpbmRvdyB0aHVuayBsaXN0ICovCisgICAgICAgIGlmICgoKnBwUHJldiktPnVzZXIgIT0gdXNlcikgYnJlYWs7CiAgICAgICAgIHBwUHJldiA9ICYoKnBwUHJldiktPm5leHQ7CiAgICAgfQogCi0gICAgaWYgKCpwcFByZXYpICAvKiBSZW1vdmUgaXQgZnJvbSB0aGUgbGlzdCAqLworICAgIGlmIChiUmVjeWNsZSkKICAgICB7CisgICAgICAgIC8qIEV4dHJhY3QgdGhpcyB0aHVuayBmcm9tIHRoZSBsaXN0ICovCiAgICAgICAgIHByb2MgPSAqcHBQcmV2OwogICAgICAgICAqcHBQcmV2ID0gcHJvYy0+bmV4dDsKICAgICB9CkBAIC0yOTQsNyArMzM4LDcgQEAKICAgICAgICAgICAgIHR5cGUgPSBwcm9jLT50eXBlOwogICAgICAgICAgICAgZnVuYyA9IFdJTlBST0NfVEhVTktQUk9DKHByb2MpOwogICAgICAgICB9Ci0gICAgICAgIHByb2MgPSBXSU5QUk9DX0FsbG9jV2luUHJvYyggZnVuYywgdHlwZSApOworICAgICAgICBwcm9jID0gV0lOUFJPQ19BbGxvY1dpblByb2MoIGZ1bmMsIHR5cGUsIHVzZXIgKTsKICAgICAgICAgaWYgKCFwcm9jKSByZXR1cm4gRkFMU0U7CiAgICAgfQogCkBAIC0zMTMsMTEgKzM1NywxMiBAQAogICoKICAqIEZyZWUgYSBsaXN0IG9mIHdpbiBwcm9jcy4KICAqLwotdm9pZCBXSU5QUk9DX0ZyZWVQcm9jKCBIV0lORE9XUFJPQyBwcm9jICkKK3ZvaWQgV0lOUFJPQ19GcmVlUHJvYyggSFdJTkRPV1BST0MgcHJvYywgV0lORE9XUFJPQ1VTRVIgdXNlciApCiB7CiAgICAgd2hpbGUgKHByb2MpCiAgICAgewogICAgICAgICBXSU5ET1dQUk9DICpuZXh0ID0gKChXSU5ET1dQUk9DICopcHJvYyktPm5leHQ7CisgICAgICAgIGlmICgoKFdJTkRPV1BST0MgKilwcm9jKS0+dXNlciAhPSB1c2VyKSBicmVhazsKICAgICAgICAgZHByaW50Zl93aW4oIHN0ZGRlYiwgIldJTlBST0NfRnJlZVByb2M6IGZyZWVpbmcgJTA4eFxuIiwgKFVJTlQzMilwcm9jKTsKICAgICAgICAgSGVhcEZyZWUoIFdpblByb2NIZWFwLCAwLCBwcm9jICk7CiAgICAgICAgIHByb2MgPSBuZXh0OwpAQCAtOTg3LDYgKzEwMzIsNDAgQEAKICAgICBjYXNlIEJNX1NFVFNUWUxFMzI6CiAgICAgICAgICpwbXNnMTYgPSAoVUlOVDE2KW1zZzMyICsgKEJNX0dFVENIRUNLMTYgLSBCTV9HRVRDSEVDSzMyKTsKICAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIEVNX0dFVFNFTDMyOgorICAgIGNhc2UgRU1fR0VUUkVDVDMyOgorICAgIGNhc2UgRU1fU0VUUkVDVDMyOgorICAgIGNhc2UgRU1fU0VUUkVDVE5QMzI6CisgICAgY2FzZSBFTV9TQ1JPTEwzMjoKKyAgICBjYXNlIEVNX0xJTkVTQ1JPTEwzMjoKKyAgICBjYXNlIEVNX1NDUk9MTENBUkVUMzI6CisgICAgY2FzZSBFTV9HRVRNT0RJRlkzMjoKKyAgICBjYXNlIEVNX1NFVE1PRElGWTMyOgorICAgIGNhc2UgRU1fR0VUTElORUNPVU5UMzI6CisgICAgY2FzZSBFTV9MSU5FSU5ERVgzMjoKKyAgICBjYXNlIEVNX1NFVEhBTkRMRTMyOgorICAgIGNhc2UgRU1fR0VUSEFORExFMzI6CisgICAgY2FzZSBFTV9HRVRUSFVNQjMyOgorICAgIGNhc2UgRU1fTElORUxFTkdUSDMyOgorICAgIGNhc2UgRU1fUkVQTEFDRVNFTDMyOgorICAgIGNhc2UgRU1fR0VUTElORTMyOgorICAgIGNhc2UgRU1fTElNSVRURVhUMzI6CisgICAgY2FzZSBFTV9DQU5VTkRPMzI6CisgICAgY2FzZSBFTV9VTkRPMzI6CisgICAgY2FzZSBFTV9GTVRMSU5FUzMyOgorICAgIGNhc2UgRU1fTElORUZST01DSEFSMzI6CisgICAgY2FzZSBFTV9TRVRUQUJTVE9QUzMyOgorICAgIGNhc2UgRU1fU0VUUEFTU1dPUkRDSEFSMzI6CisgICAgY2FzZSBFTV9FTVBUWVVORE9CVUZGRVIzMjoKKyAgICBjYXNlIEVNX0dFVEZJUlNUVklTSUJMRUxJTkUzMjoKKyAgICBjYXNlIEVNX1NFVFJFQURPTkxZMzI6CisgICAgY2FzZSBFTV9TRVRXT1JEQlJFQUtQUk9DMzI6CisgICAgY2FzZSBFTV9HRVRXT1JEQlJFQUtQUk9DMzI6CisgICAgY2FzZSBFTV9HRVRQQVNTV09SRENIQVIzMjoKKyAgICAgICAgKnBtc2cxNiA9IChVSU5UMTYpbXNnMzIgKyAoRU1fR0VUU0VMMTYgLSBFTV9HRVRTRUwzMik7CisgICAgICAgIHJldHVybiAwOworCiAgICAgY2FzZSBMQl9DQVJFVE9GRjMyOgogICAgIGNhc2UgTEJfQ0FSRVRPTjMyOgogICAgIGNhc2UgTEJfREVMRVRFU1RSSU5HMzI6CkBAIC0xMDE1LDYgKzEwOTQsMjcgQEAKICAgICBjYXNlIExCX1NFVFRPUElOREVYMzI6CiAgICAgICAgICpwbXNnMTYgPSAoVUlOVDE2KW1zZzMyICsgKExCX0FERFNUUklORzE2IC0gTEJfQUREU1RSSU5HMzIpOwogICAgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIENCX0RFTEVURVNUUklORzMyOgorICAgIGNhc2UgQ0JfR0VUQ09VTlQzMjoKKyAgICBjYXNlIENCX0dFVExCVEVYVExFTjMyOgorICAgIGNhc2UgQ0JfTElNSVRURVhUMzI6CisgICAgY2FzZSBDQl9SRVNFVENPTlRFTlQzMjoKKyAgICBjYXNlIENCX1NFVEVESVRTRUwzMjoKKyAgICBjYXNlIENCX0dFVENVUlNFTDMyOgorICAgIGNhc2UgQ0JfU0VUQ1VSU0VMMzI6CisgICAgY2FzZSBDQl9TSE9XRFJPUERPV04zMjoKKyAgICBjYXNlIENCX1NFVElURU1EQVRBMzI6CisgICAgY2FzZSBDQl9TRVRJVEVNSEVJR0hUMzI6CisgICAgY2FzZSBDQl9HRVRJVEVNSEVJR0hUMzI6CisgICAgY2FzZSBDQl9TRVRFWFRFTkRFRFVJMzI6CisgICAgY2FzZSBDQl9HRVRFWFRFTkRFRFVJMzI6CisgICAgY2FzZSBDQl9HRVREUk9QUEVEU1RBVEUzMjoKKwkqcG1zZzE2ID0gKFVJTlQxNiltc2czMiArIChDQl9HRVRFRElUU0VMMTYgLSBDQl9HRVRFRElUU0VMMzIpOworCXJldHVybiAwOworICAgIGNhc2UgQ0JfR0VURURJVFNFTDMyOgorCSpwbXNnMTYgPSBDQl9HRVRFRElUU0VMMTY7CisJcmV0dXJuIDE7CisKICAgICBjYXNlIExCX0FERFNUUklORzMyOgogICAgIGNhc2UgTEJfRklORFNUUklORzMyOgogICAgIGNhc2UgTEJfRklORFNUUklOR0VYQUNUMzI6CkBAIC0xMDIyLDcgKzExMjIsNiBAQAogICAgIGNhc2UgTEJfU0VMRUNUU1RSSU5HMzI6CiAgICAgY2FzZSBMQl9ESVIzMjoKICAgICBjYXNlIExCX0FEREZJTEUzMjoKLS8qICAgIGNhc2UgTEJfR0VUVEVYVDMyOiBGSVhNRSAqLwogICAgICAgICB7CiAgICAgICAgICAgICBMUFNUUiBzdHIgPSBTRUdQVFJfU1RSRFVQKCAoTFBTVFIpKnBscGFyYW0gKTsKICAgICAgICAgICAgIGlmICghc3RyKSByZXR1cm4gLTE7CkBAIC0xMDMwLDYgKzExMjksMjEgQEAKICAgICAgICAgfQogICAgICAgICAqcG1zZzE2ID0gKFVJTlQxNiltc2czMiArIChMQl9BRERTVFJJTkcxNiAtIExCX0FERFNUUklORzMyKTsKICAgICAgICAgcmV0dXJuIDE7CisKKyAgICBjYXNlIENCX0FERFNUUklORzMyOgorICAgIGNhc2UgQ0JfRklORFNUUklORzMyOgorICAgIGNhc2UgQ0JfRklORFNUUklOR0VYQUNUMzI6CisgICAgY2FzZSBDQl9JTlNFUlRTVFJJTkczMjoKKyAgICBjYXNlIENCX1NFTEVDVFNUUklORzMyOgorICAgIGNhc2UgQ0JfRElSMzI6CisJeworCSAgICBMUFNUUiBzdHIgPSBTRUdQVFJfU1RSRFVQKCAoTFBTVFIpKnBscGFyYW0gKTsKKwkgICAgaWYgKCFzdHIpIHJldHVybiAtMTsKKwkgICAgKnBscGFyYW0gPSAoTFBBUkFNKVNFR1BUUl9HRVQoc3RyKTsKKwl9CisJKnBtc2cxNiA9IChVSU5UMTYpbXNnMzIgKyAoQ0JfR0VURURJVFNFTDE2IC0gQ0JfR0VURURJVFNFTDMyKTsKKwlyZXR1cm4gMTsKKwogICAgIGNhc2UgTEJfR0VUSVRFTVJFQ1QzMjoKICAgICAgICAgewogICAgICAgICAgICAgUkVDVDE2ICpyZWN0OwpAQCAtMTAzOCw2ICsxMTUyLDcgQEAKICAgICAgICAgICAgICooTFBBUkFNICopKHJlY3QgKyAxKSA9ICpwbHBhcmFtOyAgLyogU3RvcmUgdGhlIHByZXZpb3VzIGxQYXJhbSAqLwogICAgICAgICAgICAgKnBscGFyYW0gPSAoTFBBUkFNKVNFR1BUUl9HRVQocmVjdCk7CiAgICAgICAgIH0KKwkqcG1zZzE2ID0gTEJfR0VUSVRFTVJFQ1QxNjsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgY2FzZSBMQl9HRVRTRUxJVEVNUzMyOgogICAgICAgICB7CkBAIC0xMDQ4LDYgKzExNjMsNyBAQAogICAgICAgICAgICAgKigoTFBBUkFNICopaXRlbXMpKysgPSAqcGxwYXJhbTsgIC8qIFN0b3JlIHRoZSBwcmV2aW91cyBsUGFyYW0gKi8KICAgICAgICAgICAgICpwbHBhcmFtID0gKExQQVJBTSlTRUdQVFJfR0VUKGl0ZW1zKTsKICAgICAgICAgfQorCSpwbXNnMTYgPSBMQl9HRVRTRUxJVEVNUzE2OwogICAgICAgICByZXR1cm4gMTsKICAgICBjYXNlIExCX1NFVFRBQlNUT1BTMzI6CiAgICAgICAgIGlmICh3UGFyYW0zMikKQEAgLTEwNjMsNiArMTE3OSwzNCBAQAogICAgICAgICB9CiAgICAgICAgICpwbXNnMTYgPSBMQl9TRVRUQUJTVE9QUzE2OwogICAgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgQ0JfR0VURFJPUFBFRENPTlRST0xSRUNUMzI6CisgICAgICAgIHsKKwkgICAgUkVDVDE2ICpyZWN0OworCSAgICByZWN0ID0gKFJFQ1QxNiAqKVNFR1BUUl9BTExPQyggc2l6ZW9mKFJFQ1QxNikgKyBzaXplb2YoTFBBUkFNKSApOworCSAgICBpZiAoIXJlY3QpIHJldHVybiAtMTsKKwkgICAgKihMUEFSQU0gKikocmVjdCArIDEpID0gKnBscGFyYW07ICAvKiBTdG9yZSB0aGUgcHJldmlvdXMgbFBhcmFtICovCisJICAgICpwbHBhcmFtID0gKExQQVJBTSlTRUdQVFJfR0VUKHJlY3QpOworICAgICAgICB9CisJKnBtc2cxNiA9IENCX0dFVERST1BQRURDT05UUk9MUkVDVDE2OworICAgICAgICByZXR1cm4gMTsKKworICAgIGNhc2UgTEJfR0VUVEVYVDMyOgorCSpwbHBhcmFtID0gKExQQVJBTSlNYXBMUyggKExQVk9JRCkoKnBscGFyYW0pICk7CisJKnBtc2cxNiA9IExCX0dFVFRFWFQxNjsKKwlyZXR1cm4gMTsKKworICAgIGNhc2UgQ0JfR0VUTEJURVhUMzI6CisJKnBscGFyYW0gPSAoTFBBUkFNKU1hcExTKCAoTFBWT0lEKSgqcGxwYXJhbSkgKTsKKwkqcG1zZzE2ID0gQ0JfR0VUTEJURVhUMTY7CisJcmV0dXJuIDE7CisKKyAgICBjYXNlIEVNX1NFVFNFTDMyOgorCSpwd3BhcmFtMTYgPSAwOworCSpwbHBhcmFtID0gTUFLRUxPTkcoIChJTlQxNikoSU5UMzIpd1BhcmFtMzIsIChJTlQxNikqcGxwYXJhbSApOworCSpwbXNnMTYgPSBFTV9TRVRTRUwxNjsKKwlyZXR1cm4gMDsKKwogICAgIGNhc2UgV01fQUNUSVZBVEU6CiAgICAgY2FzZSBXTV9DSEFSVE9JVEVNOgogICAgIGNhc2UgV01fQ09NTUFORDoKQEAgLTEyNzIsNyArMTQxNiw4IEBACiAgKgogICogVW5tYXAgYSBtZXNzYWdlIHRoYXQgd2FzIG1hcHBlZCBmcm9tIDMyLWJpdCBBbnNpIHRvIDE2LWJpdC4KICAqLwotdm9pZCBXSU5QUk9DX1VubWFwTXNnMzJBVG8xNiggVUlOVDMyIG1zZywgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkKK3ZvaWQgV0lOUFJPQ19Vbm1hcE1zZzMyQVRvMTYoIFVJTlQzMiBtc2csIFdQQVJBTTE2IHdQYXJhbSwgCisJCQkJCSAgTFBBUkFNIGxQYXJhbSwgTFJFU1VMVCBsUmVzdWx0ICkKIHsKICAgICBzd2l0Y2gobXNnKQogICAgIHsKQEAgLTEyODQsMTIgKzE0MjksMjAgQEAKICAgICBjYXNlIExCX0lOU0VSVFNUUklORzMyOgogICAgIGNhc2UgTEJfU0VMRUNUU1RSSU5HMzI6CiAgICAgY2FzZSBMQl9TRVRUQUJTVE9QUzMyOgorICAgIGNhc2UgQ0JfQUREU1RSSU5HMzI6CisgICAgY2FzZSBDQl9GSU5EU1RSSU5HMzI6CisgICAgY2FzZSBDQl9GSU5EU1RSSU5HRVhBQ1QzMjoKKyAgICBjYXNlIENCX0lOU0VSVFNUUklORzMyOgorICAgIGNhc2UgQ0JfU0VMRUNUU1RSSU5HMzI6CisgICAgY2FzZSBDQl9ESVIzMjoKICAgICBjYXNlIFdNX0NPTVBBUkVJVEVNOgogICAgIGNhc2UgV01fREVMRVRFSVRFTToKICAgICBjYXNlIFdNX0RSQVdJVEVNOgogICAgIGNhc2UgV01fU0VUVEVYVDoKICAgICAgICAgU0VHUFRSX0ZSRUUoIFBUUl9TRUdfVE9fTElOKGxQYXJhbSkgKTsKICAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENCX0dFVERST1BQRURDT05UUk9MUkVDVDMyOgogICAgIGNhc2UgTEJfR0VUSVRFTVJFQ1QzMjoKICAgICAgICAgewogICAgICAgICAgICAgUkVDVDE2ICpyZWN0ID0gKFJFQ1QxNiAqKVBUUl9TRUdfVE9fTElOKGxQYXJhbSk7CkBAIC0xMzA3LDYgKzE0NjAsMjEgQEAKICAgICAgICAgICAgIFNFR1BUUl9GUkVFKCAoTFBBUkFNICopaXRlbXMgLSAxICk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENCX0dFVEVESVRTRUwzMjoKKy8qCisJaWYoIHdQYXJhbSApCisJICAgICooKExQVUlOVDMyKXdQYXJhbSkgPSBMT1dPUkQobFJlc3VsdCk7CisJaWYoIGxQYXJhbSApCisJICAgICooKExQVUlOVDMyKWxQYXJhbSkgPSBISVdPUkQobFJlc3VsdCk7CisqLworCWJyZWFrOworCisgICAgY2FzZSBMQl9HRVRURVhUMzI6CisgICAgY2FzZSBDQl9HRVRMQlRFWFQzMjoKKwlVbk1hcExTKCAoU0VHUFRSKWxQYXJhbSApOworCWJyZWFrOworCiAgICAgY2FzZSBXTV9NRUFTVVJFSVRFTToKICAgICAgICAgewogICAgICAgICAgICAgTUVBU1VSRUlURU1TVFJVQ1QxNiAqbWlzID0gKE1FQVNVUkVJVEVNU1RSVUNUMTYgKilQVFJfU0VHX1RPX0xJTihsUGFyYW0pOwpAQCAtMTQwMSwxMSArMTU2OSwyNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBMUFNUUiBzdHIgPSBTRUdQVFJfU1RSRFVQX1d0b0EoIChMUFdTVFIpKnBscGFyYW0gKTsKICAgICAgICAgICAgIGlmICghc3RyKSByZXR1cm4gLTE7Ci0gICAgICAgICAgICAqcG1zZzE2ID0gKFVJTlQxNiltc2czMiArIChMQl9BRERTVFJJTkcxNiAtIExCX0FERFNUUklORzMyKTsKICAgICAgICAgICAgICpwd3BhcmFtMTYgPSAoV1BBUkFNMTYpTE9XT1JEKHdQYXJhbTMyKTsKICAgICAgICAgICAgICpwbHBhcmFtICAgPSAoTFBBUkFNKVNFR1BUUl9HRVQoc3RyKTsKICAgICAgICAgfQorCSpwbXNnMTYgPSAoVUlOVDE2KW1zZzMyICsgKExCX0FERFNUUklORzE2IC0gTEJfQUREU1RSSU5HMzIpOwogICAgICAgICByZXR1cm4gMTsKKworICAgIGNhc2UgQ0JfQUREU1RSSU5HMzI6CisgICAgY2FzZSBDQl9GSU5EU1RSSU5HMzI6CisgICAgY2FzZSBDQl9GSU5EU1RSSU5HRVhBQ1QzMjoKKyAgICBjYXNlIENCX0lOU0VSVFNUUklORzMyOgorICAgIGNhc2UgQ0JfU0VMRUNUU1RSSU5HMzI6CisgICAgY2FzZSBDQl9ESVIzMjoKKyAgICAgICAgeworICAgICAgICAgICAgTFBTVFIgc3RyID0gU0VHUFRSX1NUUkRVUF9XdG9BKCAoTFBXU1RSKSpwbHBhcmFtICk7CisgICAgICAgICAgICBpZiAoIXN0cikgcmV0dXJuIC0xOworICAgICAgICAgICAgKnB3cGFyYW0xNiA9IChXUEFSQU0xNilMT1dPUkQod1BhcmFtMzIpOworICAgICAgICAgICAgKnBscGFyYW0gICA9IChMUEFSQU0pU0VHUFRSX0dFVChzdHIpOworICAgICAgICB9CisJKnBtc2cxNiA9IChVSU5UMTYpbXNnMzIgKyAoQ0JfQUREU1RSSU5HMTYgLSBDQl9BRERTVFJJTkczMik7CisgICAgICAgIHJldHVybiAxOworCiAgICAgY2FzZSBXTV9OQ0NSRUFURToKICAgICBjYXNlIFdNX0NSRUFURToKICAgICAgICAgewpAQCAtMTQ2Miw3ICsxNjQ2LDggQEAKICAqCiAgKiBVbm1hcCBhIG1lc3NhZ2UgdGhhdCB3YXMgbWFwcGVkIGZyb20gMzItYml0IFVuaWNvZGUgdG8gMTYtYml0LgogICovCi12b2lkIFdJTlBST0NfVW5tYXBNc2czMldUbzE2KCBVSU5UMzIgbXNnLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKQordm9pZCBXSU5QUk9DX1VubWFwTXNnMzJXVG8xNiggVUlOVDMyIG1zZywgV1BBUkFNMTYgd1BhcmFtLCAKKwkJCQkJICBMUEFSQU0gbFBhcmFtLCBMUkVTVUxUIGxSZXN1bHQgKQogewogICAgIHN3aXRjaChtc2cpCiAgICAgewpAQCAtMTQ3NSw3ICsxNjYwLDcgQEAKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBXSU5QUk9DX1VubWFwTXNnMzJBVG8xNiggbXNnLCB3UGFyYW0sIGxQYXJhbSApOworICAgICAgICBXSU5QUk9DX1VubWFwTXNnMzJBVG8xNiggbXNnLCB3UGFyYW0sIGxQYXJhbSwgbFJlc3VsdCApOwogICAgICAgICBicmVhazsKICAgICB9CiB9CkBAIC0xNTc5LDcgKzE3NjQsNyBAQAogICAgIGlmICh3bmRQdHIpIENVUlJFTlRfRFMgPSB3bmRQdHItPmhJbnN0YW5jZTsKICAgICByZXN1bHQgPSBDYWxsV25kUHJvYzE2KCBmdW5jLCBod25kLCBtc2cxNiwgd1BhcmFtMTYsIGxQYXJhbSApOwogICAgIENVUlJFTlRfRFMgPSBkczsKLSAgICBXSU5QUk9DX1VubWFwTXNnMzJBVG8xNiggbXNnLCB3UGFyYW0xNiwgbFBhcmFtICk7CisgICAgV0lOUFJPQ19Vbm1hcE1zZzMyQVRvMTYoIG1zZywgd1BhcmFtMTYsIGxQYXJhbSwgcmVzdWx0ICk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMTYwNCw3ICsxNzg5LDcgQEAKICAgICBpZiAod25kUHRyKSBDVVJSRU5UX0RTID0gd25kUHRyLT5oSW5zdGFuY2U7CiAgICAgcmVzdWx0ID0gQ2FsbFduZFByb2MxNiggZnVuYywgaHduZCwgbXNnMTYsIHdQYXJhbTE2LCBsUGFyYW0gKTsKICAgICBDVVJSRU5UX0RTID0gZHM7Ci0gICAgV0lOUFJPQ19Vbm1hcE1zZzMyV1RvMTYoIG1zZywgd1BhcmFtMTYsIGxQYXJhbSApOworICAgIFdJTlBST0NfVW5tYXBNc2czMldUbzE2KCBtc2csIHdQYXJhbTE2LCBsUGFyYW0sIHJlc3VsdCApOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKZGlmZiAtLWdpdCBhL3dpbmUubWFuIGIvd2luZS5tYW4KaW5kZXggZmEyMGZkNC4uOTk4NDgyMyAxMDA2NDQKLS0tIGEvd2luZS5tYW4KKysrIGIvd2luZS5tYW4KQEAgLTEwOSw3ICsxMDksNyBAQAogLkkgLWxhbmd1YWdlIHh4CiBTZXQgdGhlIGxhbmd1YWdlIHRvCiAuSSB4eAotKG9uZSBvZiBFbiwgRXMsIERlLCBObywgRnIsIEZpLCBEYSwgQ3osIEVvLCBJdCwgS28sIEh1LCBQbCkKKyhvbmUgb2YgRW4sIEVzLCBEZSwgTm8sIEZyLCBGaSwgRGEsIEN6LCBFbywgSXQsIEtvLCBIdSwgUGwsIFBvKQogLlRQCiAuSSAtbWFuYWdlZAogQ3JlYXRlIGVhY2ggdG9wLWxldmVsIHdpbmRvdyBhcyBhIHByb3Blcmx5IG1hbmFnZWQgWCB3aW5kb3cK