Lyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKICoKICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKICoKICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCiAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgogKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KICovCgovKgogKiBzcGVsbC5jOiBjb2RlIGZvciBzcGVsbCBjaGVja2luZwogKgogKiBUaGUgc3BlbGwgY2hlY2tpbmcgbWVjaGFuaXNtIHVzZXMgYSB0cmVlIChha2EgdHJpZSkuICBFYWNoIG5vZGUgaW4gdGhlIHRyZWUKICogaGFzIGEgbGlzdCBvZiBieXRlcyB0aGF0IGNhbiBhcHBlYXIgKHNpYmxpbmdzKS4gIEZvciBlYWNoIGJ5dGUgdGhlcmUgaXMgYQogKiBwb2ludGVyIHRvIHRoZSBub2RlIHdpdGggdGhlIGJ5dGUgdGhhdCBmb2xsb3dzIGluIHRoZSB3b3JkIChjaGlsZCkuCiAqCiAqIEEgTlVMIGJ5dGUgaXMgdXNlZCB3aGVyZSB0aGUgd29yZCBtYXkgZW5kLiAgVGhlIGJ5dGVzIGFyZSBzb3J0ZWQsIHNvIHRoYXQKICogYmluYXJ5IHNlYXJjaGluZyBjYW4gYmUgdXNlZCBhbmQgdGhlIE5VTCBieXRlcyBhcmUgYXQgdGhlIHN0YXJ0LiAgVGhlCiAqIG51bWJlciBvZiBwb3NzaWJsZSBieXRlcyBpcyBzdG9yZWQgYmVmb3JlIHRoZSBsaXN0IG9mIGJ5dGVzLgogKgogKiBUaGUgdHJlZSB1c2VzIHR3byBhcnJheXM6ICJieXRzIiBzdG9yZXMgdGhlIGNoYXJhY3RlcnMsICJpZHhzIiBzdG9yZXMKICogZWl0aGVyIHRoZSBuZXh0IGluZGV4IG9yIGZsYWdzLiAgVGhlIHRyZWUgc3RhcnRzIGF0IGluZGV4IDAuICBGb3IgZXhhbXBsZSwKICogdG8gbG9va3VwICJ2aSIgdGhpcyBzZXF1ZW5jZSBpcyBmb2xsb3dlZDoKICoJaSA9IDAKICoJbGVuID0gYnl0c1tpXQogKgluID0gd2hlcmUgInYiIGFwcGVhcnMgaW4gYnl0c1tpICsgMV0gdG8gYnl0c1tpICsgbGVuXQogKglpID0gaWR4c1tuXQogKglsZW4gPSBieXRzW2ldCiAqCW4gPSB3aGVyZSAiaSIgYXBwZWFycyBpbiBieXRzW2kgKyAxXSB0byBieXRzW2kgKyBsZW5dCiAqCWkgPSBpZHhzW25dCiAqCWxlbiA9IGJ5dHNbaV0KICoJZmluZCB0aGF0IGJ5dHNbaSArIDFdIGlzIDAsIGlkeHNbaSArIDFdIGhhcyBmbGFncyBmb3IgInZpIi4KICoKICogVGhlcmUgYXJlIHR3byB3b3JkIHRyZWVzOiBvbmUgd2l0aCBjYXNlLWZvbGRlZCB3b3JkcyBhbmQgb25lIHdpdGggd29yZHMgaW4KICogb3JpZ2luYWwgY2FzZS4gIFRoZSBzZWNvbmQgb25lIGlzIG9ubHkgdXNlZCBmb3Iga2VlcC1jYXNlIHdvcmRzIGFuZCBpcwogKiB1c3VhbGx5IHNtYWxsLgogKgogKiBUaGVyZSBpcyBvbmUgYWRkaXRpb25hbCB0cmVlIGZvciB3aGVuIG5vdCBhbGwgcHJlZml4ZXMgYXJlIGFwcGxpZWQgd2hlbgogKiBnZW5lcmF0aW5nIHRoZSAuc3BsIGZpbGUuICBUaGlzIHRyZWUgc3RvcmVzIGFsbCB0aGUgcG9zc2libGUgcHJlZml4ZXMsIGFzCiAqIGlmIHRoZXkgd2VyZSB3b3Jkcy4gIEF0IGVhY2ggd29yZCAocHJlZml4KSBlbmQgdGhlIHByZWZpeCBuciBpcyBzdG9yZWQsIHRoZQogKiBmb2xsb3dpbmcgd29yZCBtdXN0IHN1cHBvcnQgdGhpcyBwcmVmaXggbnIuICBBbmQgdGhlIGNvbmRpdGlvbiBuciBpcwogKiBzdG9yZWQsIHVzZWQgdG8gbG9va3VwIHRoZSBjb25kaXRpb24gdGhhdCB0aGUgd29yZCBtdXN0IG1hdGNoIHdpdGguCiAqCiAqIFRoYW5rcyB0byBPbGFmIFNlaWJlcnQgZm9yIHByb3ZpZGluZyBhbiBleGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgdHJlZQogKiBhbmQgdGhlIGNvbXByZXNzaW9uIG1lY2hhbmlzbS4KICogTFogdHJpZSBpZGVhczoKICoJaHR0cDovL3d3dy5pcmIuaHIvaHIvaG9tZS9yaXN0b3YvcGFwZXJzL1Jpc3RvdkxadHJpZVJldmlzaW9uMS5wZGYKICogTW9yZSBwYXBlcnM6IGh0dHA6Ly93d3ctaWdtLnVuaXYtbWx2LmZyL35sYXBvcnRlL3B1YmxpX2VuLmh0bWwKICoKICogTWF0Y2hpbmcgaW52b2x2ZXMgY2hlY2tpbmcgdGhlIGNhcHMgdHlwZTogT25lY2FwIEFMTENBUCBLZWVwQ2FwLgogKgogKiBXaHkgZG9lc24ndCBWaW0gdXNlIGFzcGVsbC9pc3BlbGwvbXlzcGVsbC9ldGMuPwogKiBTZWUgIjpoZWxwIGRldmVsb3Atc3BlbGwiLgogKi8KCi8qIFVzZSBTUEVMTF9QUklOVFRSRUUgZm9yIGRlYnVnZ2luZzogZHVtcCB0aGUgd29yZCB0cmVlIGFmdGVyIGFkZGluZyBhIHdvcmQuCiAqIE9ubHkgdXNlIGl0IGZvciBzbWFsbCB3b3JkIGxpc3RzISAqLwojaWYgMAojIGRlZmluZSBTUEVMTF9QUklOVFRSRUUKI2VuZGlmCgovKiBVc2UgREVCVUdfVFJJRVdBTEsgdG8gcHJpbnQgdGhlIGNoYW5nZXMgbWFkZSBpbiBzdWdnZXN0X3RyaWVfd2FsaygpIGZvciBhCiAqIHNwZWNpZmljIHdvcmQuICovCiNpZiAwCiMgZGVmaW5lIERFQlVHX1RSSUVXQUxLCiNlbmRpZgoKLyoKICogVXNlIHRoaXMgdG8gYWRqdXN0IHRoZSBzY29yZSBhZnRlciBmaW5kaW5nIHN1Z2dlc3Rpb25zLCBiYXNlZCBvbiB0aGUKICogc3VnZ2VzdGVkIHdvcmQgc291bmRpbmcgbGlrZSB0aGUgYmFkIHdvcmQuICBUaGlzIGlzIG11Y2ggZmFzdGVyIHRoYW4gZG9pbmcKICogaXQgZm9yIGV2ZXJ5IHBvc3NpYmxlIHN1Z2dlc3Rpb24uCiAqIERpc2FkdmFudGFnZTogV2hlbiAidGhlIiBpcyB0eXBlZCBhcyAiaHRlIiBpdCBzb3VuZHMgcXVpdGUgZGlmZmVyZW50ICgiQCIKICogdnMgImh0IikgYW5kIGdvZXMgZG93biBpbiB0aGUgbGlzdC4KICogVXNlZCB3aGVuICdzcGVsbHN1Z2dlc3QnIGlzIHNldCB0byAiYmVzdCIuCiAqLwojZGVmaW5lIFJFU0NPUkUod29yZF9zY29yZSwgc291bmRfc2NvcmUpICgoMyAqIHdvcmRfc2NvcmUgKyBzb3VuZF9zY29yZSkgLyA0KQoKLyoKICogRG8gdGhlIG9wcG9zaXRlOiBiYXNlZCBvbiBhIG1heGltdW0gZW5kIHNjb3JlIGFuZCBhIGtub3duIHNvdW5kIHNjb3JlLAogKiBjb21wdXRlIHRoZSB0aGUgbWF4aW11bSB3b3JkIHNjb3JlIHRoYXQgY2FuIGJlIHVzZWQuCiAqLwojZGVmaW5lIE1BWFNDT1JFKHdvcmRfc2NvcmUsIHNvdW5kX3Njb3JlKSAoKDQgKiB3b3JkX3Njb3JlIC0gc291bmRfc2NvcmUpIC8gMykKCi8qCiAqIFZpbSBzcGVsbCBmaWxlIGZvcm1hdDogPEhFQURFUj4KICoJCQkgIDxTRUNUSU9OUz4KICoJCQkgIDxMV09SRFRSRUU+CiAqCQkJICA8S1dPUkRUUkVFPgogKgkJCSAgPFBSRUZJWFRSRUU+CiAqCiAqIDxIRUFERVI+OiA8ZmlsZUlEPiA8dmVyc2lvbm5yPgogKgogKiA8ZmlsZUlEPiAgICAgOCBieXRlcyAgICAiVklNc3BlbGwiCiAqIDx2ZXJzaW9ubnI+ICAxIGJ5dGUJICAgIFZJTVNQRUxMVkVSU0lPTgogKgogKgogKiBTZWN0aW9ucyBtYWtlIGl0IHBvc3NpYmxlIHRvIGFkZCBpbmZvcm1hdGlvbiB0byB0aGUgLnNwbCBmaWxlIHdpdGhvdXQKICogbWFraW5nIGl0IGluY29tcGF0aWJsZSB3aXRoIHByZXZpb3VzIHZlcnNpb25zLiAgVGhlcmUgYXJlIHR3byBraW5kcyBvZgogKiBzZWN0aW9uczoKICogMS4gTm90IGVzc2VudGlhbCBmb3IgY29ycmVjdCBzcGVsbCBjaGVja2luZy4gIEUuZy4gZm9yIG1ha2luZyBzdWdnZXN0aW9ucy4KICogICAgVGhlc2UgYXJlIHNraXBwZWQgd2hlbiBub3Qgc3VwcG9ydGVkLgogKiAyLiBPcHRpb25hbCBpbmZvcm1hdGlvbiwgYnV0IGVzc2VudGlhbCBmb3Igc3BlbGwgY2hlY2tpbmcgd2hlbiBwcmVzZW50LgogKiAgICBFLmcuIGNvbmRpdGlvbnMgZm9yIGFmZml4ZXMuICBXaGVuIHRoaXMgc2VjdGlvbiBpcyBwcmVzZW50IGJ1dCBub3QKICogICAgc3VwcG9ydGVkIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2l2ZW4uCiAqCiAqIDxTRUNUSU9OUz46IDxzZWN0aW9uPiAuLi4gPHNlY3Rpb25lbmQ+CiAqCiAqIDxzZWN0aW9uPjogPHNlY3Rpb25JRD4gPHNlY3Rpb25mbGFncz4gPHNlY3Rpb25sZW4+IChzZWN0aW9uIGNvbnRlbnRzKQogKgogKiA8c2VjdGlvbklEPgkgIDEgYnl0ZSAgICBudW1iZXIgZnJvbSAwIHRvIDI1NCBpZGVudGlmeWluZyB0aGUgc2VjdGlvbgogKgogKiA8c2VjdGlvbmZsYWdzPiAxIGJ5dGUgICAgU05GX1JFUVVJUkVEOiB0aGlzIHNlY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGNvcnJlY3QKICoJCQkJCSAgICBzcGVsbCBjaGVja2luZwogKgogKiA8c2VjdGlvbmxlbj4gICA0IGJ5dGVzICAgbGVuZ3RoIG9mIHNlY3Rpb24gY29udGVudHMsIE1TQiBmaXJzdAogKgogKiA8c2VjdGlvbmVuZD4JICAxIGJ5dGUgICAgU05fRU5ECiAqCiAqCiAqIHNlY3Rpb25JRCA9PSBTTl9JTkZPOiA8aW5mb3RleHQ+CiAqIDxpbmZvdGV4dD4JIE4gYnl0ZXMgICAgZnJlZSBmb3JtYXQgdGV4dCB3aXRoIHNwZWxsIGZpbGUgaW5mbyAodmVyc2lvbiwKICoJCQkgICAgd2Vic2l0ZSwgZXRjKQogKgogKiBzZWN0aW9uSUQgPT0gU05fUkVHSU9OOiA8cmVnaW9ubmFtZT4gLi4uCiAqIDxyZWdpb25uYW1lPgkgMiBieXRlcyAgICBVcCB0byA4IHJlZ2lvbiBuYW1lczogY2EsIGF1LCBldGMuICBMb3dlciBjYXNlLgogKgkJCSAgICBGaXJzdCA8cmVnaW9ubmFtZT4gaXMgcmVnaW9uIDEuCiAqCiAqIHNlY3Rpb25JRCA9PSBTTl9DSEFSRkxBR1M6IDxjaGFyZmxhZ3NsZW4+IDxjaGFyZmxhZ3M+CiAqCQkJCTxmb2xjaGFyc2xlbj4gPGZvbGNoYXJzPgogKiA8Y2hhcmZsYWdzbGVuPiAxIGJ5dGUgICAgTnVtYmVyIG9mIGJ5dGVzIGluIDxjaGFyZmxhZ3M+IChzaG91bGQgYmUgMTI4KS4KICogPGNoYXJmbGFncz4gIE4gYnl0ZXMgICAgIExpc3Qgb2YgZmxhZ3MgKGZpcnN0IG9uZSBpcyBmb3IgY2hhcmFjdGVyIDEyOCk6CiAqCQkJICAgIDB4MDEgIHdvcmQgY2hhcmFjdGVyCUNGX1dPUkQKICoJCQkgICAgMHgwMiAgdXBwZXItY2FzZSBjaGFyYWN0ZXIJQ0ZfVVBQRVIKICogPGZvbGNoYXJzbGVuPiAgMiBieXRlcyAgIE51bWJlciBvZiBieXRlcyBpbiA8Zm9sY2hhcnM+LgogKiA8Zm9sY2hhcnM+ICAgICBOIGJ5dGVzICAgRm9sZGVkIGNoYXJhY3RlcnMsIGZpcnN0IG9uZSBpcyBmb3IgY2hhcmFjdGVyIDEyOC4KICoKICogc2VjdGlvbklEID09IFNOX01JRFdPUkQ6IDxtaWR3b3JkPgogKiA8bWlkd29yZD4gICAgIE4gYnl0ZXMgICAgQ2hhcmFjdGVycyB0aGF0IGFyZSB3b3JkIGNoYXJhY3RlcnMgb25seSB3aGVuIHVzZWQKICoJCQkgICAgaW4gdGhlIG1pZGRsZSBvZiBhIHdvcmQuCiAqCiAqIHNlY3Rpb25JRCA9PSBTTl9QUkVGQ09ORDogPHByZWZjb25kY250PiA8cHJlZmNvbmQ+IC4uLgogKiA8cHJlZmNvbmRjbnQ+IDIgYnl0ZXMgICAgTnVtYmVyIG9mIDxwcmVmY29uZD4gaXRlbXMgZm9sbG93aW5nLgogKiA8cHJlZmNvbmQ+IDogPGNvbmRsZW4+IDxjb25kc3RyPgogKiA8Y29uZGxlbj4JMSBieXRlCSAgICBMZW5ndGggb2YgPGNvbmRzdHI+LgogKiA8Y29uZHN0cj4JTiBieXRlcwkgICAgQ29uZGl0aW9uIGZvciB0aGUgcHJlZml4LgogKgogKiBzZWN0aW9uSUQgPT0gU05fUkVQOiA8cmVwY291bnQ+IDxyZXA+IC4uLgogKiA8cmVwY291bnQ+CSAyIGJ5dGVzICAgIG51bWJlciBvZiA8cmVwPiBpdGVtcywgTVNCIGZpcnN0LgogKiA8cmVwPiA6IDxyZXBmcm9tbGVuPiA8cmVwZnJvbT4gPHJlcHRvbGVuPiA8cmVwdG8+CiAqIDxyZXBmcm9tbGVuPgkgMSBieXRlCSAgICBsZW5ndGggb2YgPHJlcGZyb20+CiAqIDxyZXBmcm9tPgkgTiBieXRlcyAgICAiZnJvbSIgcGFydCBvZiByZXBsYWNlbWVudAogKiA8cmVwdG9sZW4+CSAxIGJ5dGUJICAgIGxlbmd0aCBvZiA8cmVwdG8+CiAqIDxyZXB0bz4JIE4gYnl0ZXMgICAgInRvIiBwYXJ0IG9mIHJlcGxhY2VtZW50CiAqCiAqIHNlY3Rpb25JRCA9PSBTTl9SRVBTQUw6IDxyZXBjb3VudD4gPHJlcD4gLi4uCiAqICAganVzdCBsaWtlIFNOX1JFUCBidXQgZm9yIHNvdW5kZm9sZGVkIHdvcmRzCiAqCiAqIHNlY3Rpb25JRCA9PSBTTl9TQUw6IDxzYWxmbGFncz4gPHNhbGNvdW50PiA8c2FsPiAuLi4KICogPHNhbGZsYWdzPgkgMSBieXRlCSAgICBmbGFncyBmb3Igc291bmRzYWxpa2UgY29udmVyc2lvbjoKICoJCQkgICAgU0FMX0YwTExPV1VQCiAqCQkJICAgIFNBTF9DT0xMQVBTRQogKgkJCSAgICBTQUxfUkVNX0FDQ0VOVFMKICogPHNhbGNvdW50PiAgICAyIGJ5dGVzICAgIG51bWJlciBvZiA8c2FsPiBpdGVtcyBmb2xsb3dpbmcKICogPHNhbD4gOiA8c2FsZnJvbWxlbj4gPHNhbGZyb20+IDxzYWx0b2xlbj4gPHNhbHRvPgogKiA8c2FsZnJvbWxlbj4JIDEgYnl0ZQkgICAgbGVuZ3RoIG9mIDxzYWxmcm9tPgogKiA8c2FsZnJvbT4JIE4gYnl0ZXMgICAgImZyb20iIHBhcnQgb2Ygc291bmRzYWxpa2UKICogPHNhbHRvbGVuPgkgMSBieXRlCSAgICBsZW5ndGggb2YgPHNhbHRvPgogKiA8c2FsdG8+CSBOIGJ5dGVzICAgICJ0byIgcGFydCBvZiBzb3VuZHNhbGlrZQogKgogKiBzZWN0aW9uSUQgPT0gU05fU09GTzogPHNvZm9mcm9tbGVuPiA8c29mb2Zyb20+IDxzb2ZvdG9sZW4+IDxzb2ZvdG8+CiAqIDxzb2ZvZnJvbWxlbj4gMiBieXRlcyAgICBsZW5ndGggb2YgPHNvZm9mcm9tPgogKiA8c29mb2Zyb20+CSBOIGJ5dGVzICAgICJmcm9tIiBwYXJ0IG9mIHNvdW5kZm9sZAogKiA8c29mb3RvbGVuPgkgMiBieXRlcyAgICBsZW5ndGggb2YgPHNvZm90bz4KICogPHNvZm90bz4JIE4gYnl0ZXMgICAgInRvIiBwYXJ0IG9mIHNvdW5kZm9sZAogKgogKiBzZWN0aW9uSUQgPT0gU05fU1VHRklMRTogPHRpbWVzdGFtcD4KICogPHRpbWVzdGFtcD4gICA4IGJ5dGVzICAgIHRpbWUgaW4gc2Vjb25kcyB0aGF0IG11c3QgbWF0Y2ggd2l0aCAuc3VnIGZpbGUKICoKICogc2VjdGlvbklEID09IFNOX05PU1BMSVRTVUdTOiBub3RoaW5nCiAqCiAqIHNlY3Rpb25JRCA9PSBTTl9XT1JEUzogPHdvcmQ+IC4uLgogKiA8d29yZD4JIE4gYnl0ZXMgICAgTlVMIHRlcm1pbmF0ZWQgY29tbW9uIHdvcmQKICoKICogc2VjdGlvbklEID09IFNOX01BUDogPG1hcHN0cj4KICogPG1hcHN0cj4JIE4gYnl0ZXMgICAgU3RyaW5nIHdpdGggc2VxdWVuY2VzIG9mIHNpbWlsYXIgY2hhcmFjdGVycywKICoJCQkgICAgc2VwYXJhdGVkIGJ5IHNsYXNoZXMuCiAqCiAqIHNlY3Rpb25JRCA9PSBTTl9DT01QT1VORDogPGNvbXBtYXg+IDxjb21wbWlubGVuPiA8Y29tcHN5bG1heD4gPGNvbXBvcHRpb25zPgogKgkJCQk8Y29tcHBhdGNvdW50PiA8Y29tcHBhdHRlcm4+IC4uLiA8Y29tcGZsYWdzPgogKiA8Y29tcG1heD4gICAgIDEgYnl0ZQkgICAgTWF4aW11bSBuciBvZiB3b3JkcyBpbiBjb21wb3VuZCB3b3JkLgogKiA8Y29tcG1pbmxlbj4gIDEgYnl0ZQkgICAgTWluaW1hbCB3b3JkIGxlbmd0aCBmb3IgY29tcG91bmRpbmcuCiAqIDxjb21wc3lsbWF4PiAgMSBieXRlCSAgICBNYXhpbXVtIG5yIG9mIHN5bGxhYmxlcyBpbiBjb21wb3VuZCB3b3JkLgogKiA8Y29tcG9wdGlvbnM+IDIgYnl0ZXMgICAgQ09NUF8gZmxhZ3MuCiAqIDxjb21wcGF0Y291bnQ+IDIgYnl0ZXMgICBudW1iZXIgb2YgPGNvbXBwYXR0ZXJuPiBmb2xsb3dpbmcKICogPGNvbXBmbGFncz4gICBOIGJ5dGVzICAgIEZsYWdzIGZyb20gQ09NUE9VTkRSVUxFIGl0ZW1zLCBzZXBhcmF0ZWQgYnkKICoJCQkgICAgc2xhc2hlcy4KICoKICogPGNvbXBwYXR0ZXJuPjogPGNvbXBwYXRsZW4+IDxjb21wcGF0dGV4dD4KICogPGNvbXBwYXRsZW4+CSAxIGJ5dGUJICAgIGxlbmd0aCBvZiA8Y29tcHBhdHRleHQ+CiAqIDxjb21wcGF0dGV4dD4gTiBieXRlcyAgICBlbmQgb3IgYmVnaW4gY2hhcnMgZnJvbSBDSEVDS0NPTVBPVU5EUEFUVEVSTgogKgogKiBzZWN0aW9uSUQgPT0gU05fTk9CUkVBSzogKGVtcHR5LCBpdHMgcHJlc2VuY2UgaXMgd2hhdCBtYXR0ZXJzKQogKgogKiBzZWN0aW9uSUQgPT0gU05fU1lMTEFCTEU6IDxzeWxsYWJsZT4KICogPHN5bGxhYmxlPiAgICBOIGJ5dGVzICAgIFN0cmluZyBmcm9tIFNZTExBQkxFIGl0ZW0uCiAqCiAqIDxMV09SRFRSRUU+OiA8d29yZHRyZWU+CiAqCiAqIDxLV09SRFRSRUU+OiA8d29yZHRyZWU+CiAqCiAqIDxQUkVGSVhUUkVFPjogPHdvcmR0cmVlPgogKgogKgogKiA8d29yZHRyZWU+OiA8bm9kZWNvdW50PiA8bm9kZWRhdGE+IC4uLgogKgogKiA8bm9kZWNvdW50Pgk0IGJ5dGVzCSAgICBOdW1iZXIgb2Ygbm9kZXMgZm9sbG93aW5nLiAgTVNCIGZpcnN0LgogKgogKiA8bm9kZWRhdGE+OiA8c2libGluZ2NvdW50PiA8c2libGluZz4gLi4uCiAqCiAqIDxzaWJsaW5nY291bnQ+IDEgYnl0ZSAgICBOdW1iZXIgb2Ygc2libGluZ3MgaW4gdGhpcyBub2RlLiAgVGhlIHNpYmxpbmdzCiAqCQkJICAgIGZvbGxvdyBpbiBzb3J0ZWQgb3JkZXIuCiAqCiAqIDxzaWJsaW5nPjogPGJ5dGU+IFsgPG5vZGVpZHg+IDx4Ynl0ZT4KICoJCSAgICAgIHwgPGZsYWdzPiBbPGZsYWdzMj5dIFs8cmVnaW9uPl0gWzxhZmZpeElEPl0KICoJCSAgICAgIHwgWzxwZmxhZ3M+XSA8YWZmaXhJRD4gPHByZWZjb25kbnI+IF0KICoKICogPGJ5dGU+CTEgYnl0ZQkgICAgQnl0ZSB2YWx1ZSBvZiB0aGUgc2libGluZy4gIFNwZWNpYWwgY2FzZXM6CiAqCQkJICAgIEJZX05PRkxBR1M6IEVuZCBvZiB3b3JkIHdpdGhvdXQgZmxhZ3MgYW5kIGZvciBhbGwKICoJCQkJCXJlZ2lvbnMuCiAqCQkJCQlGb3IgUFJFRklYVFJFRSA8YWZmaXhJRD4gYW5kCiAqCQkJCQk8cHJlZmNvbmRucj4gZm9sbG93LgogKgkJCSAgICBCWV9GTEFHUzogICBFbmQgb2Ygd29yZCwgPGZsYWdzPiBmb2xsb3cuCiAqCQkJCQlGb3IgUFJFRklYVFJFRSA8cGZsYWdzPiwgPGFmZml4SUQ+CiAqCQkJCQlhbmQgPHByZWZjb25kbnI+IGZvbGxvdy4KICoJCQkgICAgQllfRkxBR1MyOiAgRW5kIG9mIHdvcmQsIDxmbGFncz4gYW5kIDxmbGFnczI+CiAqCQkJCQlmb2xsb3cuICBOb3QgdXNlZCBpbiBQUkVGSVhUUkVFLgogKgkJCSAgICBCWV9JTkRFWDogICBDaGlsZCBvZiBzaWJsaW5nIGlzIHNoYXJlZCwgPG5vZGVpZHg+CiAqCQkJCQlhbmQgPHhieXRlPiBmb2xsb3cuCiAqCiAqIDxub2RlaWR4PgkzIGJ5dGVzCSAgICBJbmRleCBvZiBjaGlsZCBmb3IgdGhpcyBzaWJsaW5nLCBNU0IgZmlyc3QuCiAqCiAqIDx4Ynl0ZT4JMSBieXRlCSAgICBieXRlIHZhbHVlIG9mIHRoZSBzaWJsaW5nLgogKgogKiA8ZmxhZ3M+CTEgYnl0ZQkgICAgYml0bWFzayBvZjoKICoJCQkgICAgV0ZfQUxMQ0FQCXdvcmQgbXVzdCBoYXZlIG9ubHkgY2FwaXRhbHMKICoJCQkgICAgV0ZfT05FQ0FQICAgZmlyc3QgY2hhciBvZiB3b3JkIG11c3QgYmUgY2FwaXRhbAogKgkJCSAgICBXRl9LRUVQQ0FQCWtlZXAtY2FzZSB3b3JkCiAqCQkJICAgIFdGX0ZJWENBUCAgIGtlZXAtY2FzZSB3b3JkLCBhbGwgY2FwcyBub3QgYWxsb3dlZAogKgkJCSAgICBXRl9SQVJFCXJhcmUgd29yZAogKgkJCSAgICBXRl9CQU5ORUQJYmFkIHdvcmQKICoJCQkgICAgV0ZfUkVHSU9OCTxyZWdpb24+IGZvbGxvd3MKICoJCQkgICAgV0ZfQUZYCTxhZmZpeElEPiBmb2xsb3dzCiAqCiAqIDxmbGFnczI+CTEgYnl0ZQkgICAgQml0bWFzayBvZjoKICoJCQkgICAgV0ZfSEFTX0FGRiA+PiA4ICAgd29yZCBpbmNsdWRlcyBhZmZpeAogKgkJCSAgICBXRl9ORUVEQ09NUCA+PiA4ICB3b3JkIG9ubHkgdmFsaWQgaW4gY29tcG91bmQKICoJCQkgICAgV0ZfTk9TVUdHRVNUID4+IDggIHdvcmQgbm90IHVzZWQgZm9yIHN1Z2dlc3Rpb25zCiAqCQkJICAgIFdGX0NPTVBST09UID4+IDggIHdvcmQgYWxyZWFkeSBhIGNvbXBvdW5kCiAqCQkJICAgIFdGX05PQ09NUEJFRiA+PiA4IG5vIGNvbXBvdW5kaW5nIGJlZm9yZSB0aGlzIHdvcmQKICoJCQkgICAgV0ZfTk9DT01QQUZUID4+IDggbm8gY29tcG91bmRpbmcgYWZ0ZXIgdGhpcyB3b3JkCiAqCiAqIDxwZmxhZ3M+CTEgYnl0ZQkgICAgYml0bWFzayBvZjoKICoJCQkgICAgV0ZQX1JBUkUJcmFyZSBwcmVmaXgKICoJCQkgICAgV0ZQX05DCW5vbi1jb21iaW5pbmcgcHJlZml4CiAqCQkJICAgIFdGUF9VUAlsZXR0ZXIgYWZ0ZXIgcHJlZml4IG1hZGUgdXBwZXIgY2FzZQogKgogKiA8cmVnaW9uPgkxIGJ5dGUJICAgIEJpdG1hc2sgZm9yIHJlZ2lvbnMgaW4gd2hpY2ggd29yZCBpcyB2YWxpZC4gIFdoZW4KICoJCQkgICAgb21pdHRlZCBpdCdzIHZhbGlkIGluIGFsbCByZWdpb25zLgogKgkJCSAgICBMb3dlc3QgYml0IGlzIGZvciByZWdpb24gMS4KICoKICogPGFmZml4SUQ+CTEgYnl0ZQkgICAgSUQgb2YgYWZmaXggdGhhdCBjYW4gYmUgdXNlZCB3aXRoIHRoaXMgd29yZC4gIEluCiAqCQkJICAgIFBSRUZJWFRSRUUgdXNlZCBmb3IgdGhlIHJlcXVpcmVkIHByZWZpeCBJRC4KICoKICogPHByZWZjb25kbnI+CTIgYnl0ZXMJICAgIFByZWZpeCBjb25kaXRpb24gbnVtYmVyLCBpbmRleCBpbiA8cHJlZmNvbmQ+IGxpc3QKICoJCQkgICAgZnJvbSBIRUFERVIuCiAqCiAqIEFsbCB0ZXh0IGNoYXJhY3RlcnMgYXJlIGluICdlbmNvZGluZycsIGJ1dCBzdG9yZWQgYXMgc2luZ2xlIGJ5dGVzLgogKi8KCi8qCiAqIFZpbSAuc3VnIGZpbGUgZm9ybWF0OiAgPFNVR0hFQURFUj4KICoJCQkgIDxTVUdXT1JEVFJFRT4KICoJCQkgIDxTVUdUQUJMRT4KICoKICogPFNVR0hFQURFUj46IDxmaWxlSUQ+IDx2ZXJzaW9ubnI+IDx0aW1lc3RhbXA+CiAqCiAqIDxmaWxlSUQ+ICAgICA2IGJ5dGVzICAgICAiVklNc3VnIgogKiA8dmVyc2lvbm5yPiAgMSBieXRlICAgICAgVklNU1VHVkVSU0lPTgogKiA8dGltZXN0YW1wPiAgOCBieXRlcyAgICAgdGltZXN0YW1wIHRoYXQgbXVzdCBtYXRjaCB3aXRoIC5zcGwgZmlsZQogKgogKgogKiA8U1VHV09SRFRSRUU+OiA8d29yZHRyZWU+ICAoc2VlIGFib3ZlLCBubyBmbGFncyBvciByZWdpb24gdXNlZCkKICoKICoKICogPFNVR1RBQkxFPjogPHN1Z3djb3VudD4gPHN1Z2xpbmU+IC4uLgogKgogKiA8c3Vnd2NvdW50Pgk0IGJ5dGVzCSAgICBudW1iZXIgb2YgPHN1Z2xpbmU+IGZvbGxvd2luZwogKgogKiA8c3VnbGluZT46IDxzdWducj4gLi4uIE5VTAogKgogKiA8c3VnbnI+OiAgICAgWCBieXRlcyAgICAgd29yZCBudW1iZXIgdGhhdCByZXN1bHRzIGluIHRoaXMgc291bmRmb2xkZWQgd29yZCwKICoJCQkgICAgc3RvcmVkIGFzIGFuIG9mZnNldCB0byB0aGUgcHJldmlvdXMgbnVtYmVyIGluIGFzCiAqCQkJICAgIGZldyBieXRlcyBhcyBwb3NzaWJsZSwgc2VlIG9mZnNldDJieXRlcygpKQogKi8KCiNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKFdJTjE2KSB8fCBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKIyBpbmNsdWRlICJ2aW1pby5oIgkvKiBmb3IgbHNlZWsoKSwgbXVzdCBiZSBiZWZvcmUgdmltLmggKi8KI2VuZGlmCgojaW5jbHVkZSAidmltLmgiCgojaWYgZGVmaW5lZChGRUFUX1NQRUxMKSB8fCBkZWZpbmVkKFBST1RPKQoKI2lmZGVmIEhBVkVfRkNOVExfSAojIGluY2x1ZGUgPGZjbnRsLmg+CiNlbmRpZgoKI2lmbmRlZiBVTklYCQkvKiBpdCdzIGluIG9zX3VuaXguaCBmb3IgVW5peCAqLwojIGluY2x1ZGUgPHRpbWUuaD4JLyogZm9yIHRpbWVfdCAqLwojZW5kaWYKCiNkZWZpbmUgTUFYV0xFTiAyNTAJCS8qIEFzc3VtZSBtYXguIHdvcmQgbGVuIGlzIHRoaXMgbWFueSBieXRlcy4KCQkJCSAgIFNvbWUgcGxhY2VzIGFzc3VtZSBhIHdvcmQgbGVuZ3RoIGZpdHMgaW4gYQoJCQkJICAgYnl0ZSwgdGh1cyBpdCBjYW4ndCBiZSBhYm92ZSAyNTUuICovCgovKiBUeXBlIHVzZWQgZm9yIGluZGV4ZXMgaW4gdGhlIHdvcmQgdHJlZSBuZWVkIHRvIGJlIGF0IGxlYXN0IDQgYnl0ZXMuICBJZiBpbnQKICogaXMgOCBieXRlcyB3ZSBjb3VsZCB1c2Ugc29tZXRoaW5nIHNtYWxsZXIsIGJ1dCB3aGF0PyAqLwojaWYgU0laRU9GX0lOVCA+IDMKdHlwZWRlZiBpbnQgaWR4X1Q7CiNlbHNlCnR5cGVkZWYgbG9uZyBpZHhfVDsKI2VuZGlmCgovKiBGbGFncyB1c2VkIGZvciBhIHdvcmQuICBPbmx5IHRoZSBsb3dlc3QgYnl0ZSBjYW4gYmUgdXNlZCwgdGhlIHJlZ2lvbiBieXRlCiAqIGNvbWVzIGFib3ZlIGl0LiAqLwojZGVmaW5lIFdGX1JFR0lPTiAgIDB4MDEJLyogcmVnaW9uIGJ5dGUgZm9sbG93cyAqLwojZGVmaW5lIFdGX09ORUNBUCAgIDB4MDIJLyogd29yZCB3aXRoIG9uZSBjYXBpdGFsIChvciBhbGwgY2FwaXRhbHMpICovCiNkZWZpbmUgV0ZfQUxMQ0FQICAgMHgwNAkvKiB3b3JkIG11c3QgYmUgYWxsIGNhcGl0YWxzICovCiNkZWZpbmUgV0ZfUkFSRQkgICAgMHgwOAkvKiByYXJlIHdvcmQgKi8KI2RlZmluZSBXRl9CQU5ORUQgICAweDEwCS8qIGJhZCB3b3JkICovCiNkZWZpbmUgV0ZfQUZYCSAgICAweDIwCS8qIGFmZml4IElEIGZvbGxvd3MgKi8KI2RlZmluZSBXRl9GSVhDQVAgICAweDQwCS8qIGtlZXAtY2FzZSB3b3JkLCBhbGxjYXAgbm90IGFsbG93ZWQgKi8KI2RlZmluZSBXRl9LRUVQQ0FQICAweDgwCS8qIGtlZXAtY2FzZSB3b3JkICovCgovKiBmb3IgPGZsYWdzMj4sIHNoaWZ0ZWQgdXAgb25lIGJ5dGUgdG8gYmUgdXNlZCBpbiB3bl9mbGFncyAqLwojZGVmaW5lIFdGX0hBU19BRkYgIDB4MDEwMAkvKiB3b3JkIGluY2x1ZGVzIGFmZml4ICovCiNkZWZpbmUgV0ZfTkVFRENPTVAgMHgwMjAwCS8qIHdvcmQgb25seSB2YWxpZCBpbiBjb21wb3VuZCAqLwojZGVmaW5lIFdGX05PU1VHR0VTVCAweDA0MDAJLyogd29yZCBub3QgdG8gYmUgc3VnZ2VzdGVkICovCiNkZWZpbmUgV0ZfQ09NUFJPT1QgMHgwODAwCS8qIGFscmVhZHkgY29tcG91bmRlZCB3b3JkLCBDT01QT1VORFJPT1QgKi8KI2RlZmluZSBXRl9OT0NPTVBCRUYgMHgxMDAwCS8qIG5vIGNvbXBvdW5kaW5nIGJlZm9yZSB0aGlzIHdvcmQgKi8KI2RlZmluZSBXRl9OT0NPTVBBRlQgMHgyMDAwCS8qIG5vIGNvbXBvdW5kaW5nIGFmdGVyIHRoaXMgd29yZCAqLwoKLyogb25seSB1c2VkIGZvciBzdV9iYWRmbGFncyAqLwojZGVmaW5lIFdGX01JWENBUCAgIDB4MjAJLyogbWl4IG9mIHVwcGVyIGFuZCBsb3dlciBjYXNlOiBtYWNhUk9OSSAqLwoKI2RlZmluZSBXRl9DQVBNQVNLIChXRl9PTkVDQVAgfCBXRl9BTExDQVAgfCBXRl9LRUVQQ0FQIHwgV0ZfRklYQ0FQKQoKLyogZmxhZ3MgZm9yIDxwZmxhZ3M+ICovCiNkZWZpbmUgV0ZQX1JBUkUJICAgIDB4MDEJLyogcmFyZSBwcmVmaXggKi8KI2RlZmluZSBXRlBfTkMJCSAgICAweDAyCS8qIHByZWZpeCBpcyBub3QgY29tYmluaW5nICovCiNkZWZpbmUgV0ZQX1VQCQkgICAgMHgwNAkvKiB0by11cHBlciBwcmVmaXggKi8KI2RlZmluZSBXRlBfQ09NUFBFUk1JVAkgICAgMHgwOAkvKiBwcmVmaXggd2l0aCBDT01QT1VORFBFUk1JVEZMQUcgKi8KI2RlZmluZSBXRlBfQ09NUEZPUkJJRAkgICAgMHgxMAkvKiBwcmVmaXggd2l0aCBDT01QT1VOREZPUkJJREZMQUcgKi8KCi8qIEZsYWdzIGZvciBwb3N0cG9uZWQgcHJlZml4ZXMgaW4gInNsX3BpZHhzIi4gIE11c3QgYmUgYWJvdmUgYWZmaXhJRCAob25lCiAqIGJ5dGUpIGFuZCBwcmVmY29uZG5yICh0d28gYnl0ZXMpLiAqLwojZGVmaW5lIFdGX1JBUkVQRlggIChXRlBfUkFSRSA8PCAyNCkJLyogcmFyZSBwb3N0cG9uZWQgcHJlZml4ICovCiNkZWZpbmUgV0ZfUEZYX05DICAgKFdGUF9OQyA8PCAyNCkJLyogbm9uLWNvbWJpbmluZyBwb3N0cG9uZWQgcHJlZml4ICovCiNkZWZpbmUgV0ZfUEZYX1VQICAgKFdGUF9VUCA8PCAyNCkJLyogdG8tdXBwZXIgcG9zdHBvbmVkIHByZWZpeCAqLwojZGVmaW5lIFdGX1BGWF9DT01QUEVSTUlUIChXRlBfQ09NUFBFUk1JVCA8PCAyNCkgLyogcG9zdHBvbmVkIHByZWZpeCB3aXRoCgkJCQkJCSAgKiBDT01QT1VORFBFUk1JVEZMQUcgKi8KI2RlZmluZSBXRl9QRlhfQ09NUEZPUkJJRCAoV0ZQX0NPTVBGT1JCSUQgPDwgMjQpIC8qIHBvc3Rwb25lZCBwcmVmaXggd2l0aAoJCQkJCQkgICogQ09NUE9VTkRGT1JCSURGTEFHICovCgoKLyogZmxhZ3MgZm9yIDxjb21wb3B0aW9ucz4gKi8KI2RlZmluZSBDT01QX0NIRUNLRFVQCQkxCS8qIENIRUNLQ09NUE9VTkREVVAgKi8KI2RlZmluZSBDT01QX0NIRUNLUkVQCQkyCS8qIENIRUNLQ09NUE9VTkRSRVAgKi8KI2RlZmluZSBDT01QX0NIRUNLQ0FTRQkJNAkvKiBDSEVDS0NPTVBPVU5EQ0FTRSAqLwojZGVmaW5lIENPTVBfQ0hFQ0tUUklQTEUJOAkvKiBDSEVDS0NPTVBPVU5EVFJJUExFICovCgovKiBTcGVjaWFsIGJ5dGUgdmFsdWVzIGZvciA8Ynl0ZT4uICBTb21lIGFyZSBvbmx5IHVzZWQgaW4gdGhlIHRyZWUgZm9yCiAqIHBvc3Rwb25lZCBwcmVmaXhlcywgc29tZSBvbmx5IGluIHRoZSBvdGhlciB0cmVlcy4gIFRoaXMgaXMgYSBiaXQgbWVzc3kuLi4gKi8KI2RlZmluZSBCWV9OT0ZMQUdTCTAJLyogZW5kIG9mIHdvcmQgd2l0aG91dCBmbGFncyBvciByZWdpb247IGZvcgoJCQkJICogcG9zdHBvbmVkIHByZWZpeDogbm8gPHBmbGFncz4gKi8KI2RlZmluZSBCWV9JTkRFWAkxCS8qIGNoaWxkIGlzIHNoYXJlZCwgaW5kZXggZm9sbG93cyAqLwojZGVmaW5lIEJZX0ZMQUdTCTIJLyogZW5kIG9mIHdvcmQsIDxmbGFncz4gYnl0ZSBmb2xsb3dzOyBmb3IKCQkJCSAqIHBvc3Rwb25lZCBwcmVmaXg6IDxwZmxhZ3M+IGZvbGxvd3MgKi8KI2RlZmluZSBCWV9GTEFHUzIJMwkvKiBlbmQgb2Ygd29yZCwgPGZsYWdzPiBhbmQgPGZsYWdzMj4gYnl0ZXMKCQkJCSAqIGZvbGxvdzsgbmV2ZXIgdXNlZCBpbiBwcmVmaXggdHJlZSAqLwojZGVmaW5lIEJZX1NQRUNJQUwgIEJZX0ZMQUdTMgkvKiBoaWdoZXN0IHNwZWNpYWwgYnl0ZSB2YWx1ZSAqLwoKLyogSW5mbyBmcm9tICJSRVAiLCAiUkVQU0FMIiBhbmQgIlNBTCIgZW50cmllcyBpbiAiLmFmZiIgZmlsZSB1c2VkIGluIHNpX3JlcCwKICogc2lfcmVwc2FsLCBzbF9yZXAsIGFuZCBzaV9zYWwuICBOb3QgZm9yIHNsX3NhbCEKICogT25lIHJlcGxhY2VtZW50OiBmcm9tICJmdF9mcm9tIiB0byAiZnRfdG8iLiAqLwp0eXBlZGVmIHN0cnVjdCBmcm9tdG9fUwp7CiAgICBjaGFyX3UJKmZ0X2Zyb207CiAgICBjaGFyX3UJKmZ0X3RvOwp9IGZyb210b19UOwoKLyogSW5mbyBmcm9tICJTQUwiIGVudHJpZXMgaW4gIi5hZmYiIGZpbGUgdXNlZCBpbiBzbF9zYWwuCiAqIFRoZSBpbmZvIGlzIHNwbGl0IGZvciBxdWljayBwcm9jZXNzaW5nIGJ5IHNwZWxsX3NvdW5kZm9sZCgpLgogKiBOb3RlIHRoYXQgInNtX29uZW9mIiBhbmQgInNtX3J1bGVzIiBwb2ludCBpbnRvIHNtX2xlYWQuICovCnR5cGVkZWYgc3RydWN0IHNhbGl0ZW1fUwp7CiAgICBjaGFyX3UJKnNtX2xlYWQ7CS8qIGxlYWRpbmcgbGV0dGVycyAqLwogICAgaW50CQlzbV9sZWFkbGVuOwkvKiBsZW5ndGggb2YgInNtX2xlYWQiICovCiAgICBjaGFyX3UJKnNtX29uZW9mOwkvKiBsZXR0ZXJzIGZyb20gKCkgb3IgTlVMTCAqLwogICAgY2hhcl91CSpzbV9ydWxlczsJLyogcnVsZXMgbGlrZSBeLCAkLCBwcmlvcml0eSAqLwogICAgY2hhcl91CSpzbV90bzsJCS8qIHJlcGxhY2VtZW50LiAqLwojaWZkZWYgRkVBVF9NQllURQogICAgaW50CQkqc21fbGVhZF93OwkvKiB3aWRlIGNoYXJhY3RlciBjb3B5IG9mICJzbV9sZWFkIiAqLwogICAgaW50CQkqc21fb25lb2ZfdzsJLyogd2lkZSBjaGFyYWN0ZXIgY29weSBvZiAic21fb25lb2YiICovCiAgICBpbnQJCSpzbV90b193OwkvKiB3aWRlIGNoYXJhY3RlciBjb3B5IG9mICJzbV90byIgKi8KI2VuZGlmCn0gc2FsaXRlbV9UOwoKI2lmZGVmIEZFQVRfTUJZVEUKdHlwZWRlZiBpbnQgc2FsZmlyc3RfVDsKI2Vsc2UKdHlwZWRlZiBzaG9ydCBzYWxmaXJzdF9UOwojZW5kaWYKCi8qIFZhbHVlcyBmb3IgU1BfKkVSUk9SIGFyZSBuZWdhdGl2ZSwgcG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGJ5CiAqIHJlYWRfY250X3N0cmluZygpLiAqLwojZGVmaW5lCVNQX1RSVU5DRVJST1IJLTEJLyogc3BlbGwgZmlsZSB0cnVuY2F0ZWQgZXJyb3IgKi8KI2RlZmluZQlTUF9GT1JNRVJST1IJLTIJLyogZm9ybWF0IGVycm9yIGluIHNwZWxsIGZpbGUgKi8KI2RlZmluZSBTUF9PVEhFUkVSUk9SCS0zCS8qIG90aGVyIGVycm9yIHdoaWxlIHJlYWRpbmcgc3BlbGwgZmlsZSAqLwoKLyoKICogU3RydWN0dXJlIHVzZWQgdG8gc3RvcmUgd29yZHMgYW5kIG90aGVyIGluZm8gZm9yIG9uZSBsYW5ndWFnZSwgbG9hZGVkIGZyb20KICogYSAuc3BsIGZpbGUuCiAqIFRoZSBtYWluIGFjY2VzcyBpcyB0aHJvdWdoIHRoZSB0cmVlIGluICJzbF9mYnl0cy9zbF9maWR4cyIsIHN0b3JpbmcgdGhlCiAqIGNhc2UtZm9sZGVkIHdvcmRzLiAgInNsX2tieXRzL3NsX2tpZHhzIiBpcyBmb3Iga2VlcC1jYXNlIHdvcmRzLgogKgogKiBUaGUgImJ5dHMiIGFycmF5IHN0b3JlcyB0aGUgcG9zc2libGUgYnl0ZXMgaW4gZWFjaCB0cmVlIG5vZGUsIHByZWNlZGVkIGJ5CiAqIHRoZSBudW1iZXIgb2YgcG9zc2libGUgYnl0ZXMsIHNvcnRlZCBvbiBieXRlIHZhbHVlOgogKgk8bGVuPiA8Ynl0ZTE+IDxieXRlMj4gLi4uCiAqIFRoZSAiaWR4cyIgYXJyYXkgc3RvcmVzIHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgbm9kZSBjb3JyZXNwb25kaW5nIHRvIHRoZQogKiBieXRlIGluICJieXRzIi4KICogRXhjZXB0aW9uOiB3aGVuIHRoZSBieXRlIGlzIHplcm8sIHRoZSB3b3JkIG1heSBlbmQgaGVyZSBhbmQgImlkeHMiIGhvbGRzCiAqIHRoZSBmbGFncywgcmVnaW9uIG1hc2sgYW5kIGFmZml4SUQgZm9yIHRoZSB3b3JkLiAgVGhlcmUgbWF5IGJlIHNldmVyYWwKICogemVyb3MgaW4gc2VxdWVuY2UgZm9yIGFsdGVybmF0aXZlIGZsYWcvcmVnaW9uL2FmZml4SUQgY29tYmluYXRpb25zLgogKi8KdHlwZWRlZiBzdHJ1Y3Qgc2xhbmdfUyBzbGFuZ19UOwpzdHJ1Y3Qgc2xhbmdfUwp7CiAgICBzbGFuZ19UCSpzbF9uZXh0OwkvKiBuZXh0IGxhbmd1YWdlICovCiAgICBjaGFyX3UJKnNsX25hbWU7CS8qIGxhbmd1YWdlIG5hbWUgImVuIiwgImVuLnJhcmUiLCAibmwiLCBldGMuICovCiAgICBjaGFyX3UJKnNsX2ZuYW1lOwkvKiBuYW1lIG9mIC5zcGwgZmlsZSAqLwogICAgaW50CQlzbF9hZGQ7CQkvKiBUUlVFIGlmIGl0J3MgYSAuYWRkIGZpbGUuICovCgogICAgY2hhcl91CSpzbF9mYnl0czsJLyogY2FzZS1mb2xkZWQgd29yZCBieXRlcyAqLwogICAgaWR4X1QJKnNsX2ZpZHhzOwkvKiBjYXNlLWZvbGRlZCB3b3JkIGluZGV4ZXMgKi8KICAgIGNoYXJfdQkqc2xfa2J5dHM7CS8qIGtlZXAtY2FzZSB3b3JkIGJ5dGVzICovCiAgICBpZHhfVAkqc2xfa2lkeHM7CS8qIGtlZXAtY2FzZSB3b3JkIGluZGV4ZXMgKi8KICAgIGNoYXJfdQkqc2xfcGJ5dHM7CS8qIHByZWZpeCB0cmVlIHdvcmQgYnl0ZXMgKi8KICAgIGlkeF9UCSpzbF9waWR4czsJLyogcHJlZml4IHRyZWUgd29yZCBpbmRleGVzICovCgogICAgY2hhcl91CSpzbF9pbmZvOwkvKiBpbmZvdGV4dCBzdHJpbmcgb3IgTlVMTCAqLwoKICAgIGNoYXJfdQlzbF9yZWdpb25zWzE3XTsJLyogdGFibGUgd2l0aCB1cCB0byA4IHJlZ2lvbiBuYW1lcyBwbHVzIE5VTCAqLwoKICAgIGNoYXJfdQkqc2xfbWlkd29yZDsJLyogTUlEV09SRCBzdHJpbmcgb3IgTlVMTCAqLwoKICAgIGhhc2h0YWJfVAlzbF93b3JkY291bnQ7CS8qIGhhc2h0YWJsZSB3aXRoIHdvcmQgY291bnQsIHdvcmRjb3VudF9UICovCgogICAgaW50CQlzbF9jb21wbWF4OwkvKiBDT01QT1VORFdPUkRNQVggKGRlZmF1bHQ6IE1BWFdMRU4pICovCiAgICBpbnQJCXNsX2NvbXBtaW5sZW47CS8qIENPTVBPVU5ETUlOIChkZWZhdWx0OiAwKSAqLwogICAgaW50CQlzbF9jb21wc3lsbWF4OwkvKiBDT01QT1VORFNZTE1BWCAoZGVmYXVsdDogTUFYV0xFTikgKi8KICAgIGludAkJc2xfY29tcG9wdGlvbnM7CS8qIENPTVBfKiBmbGFncyAqLwogICAgZ2FycmF5X1QJc2xfY29tcHBhdDsJLyogQ0hFQ0tDT01QT1VORFBBVFRFUk4gaXRlbXMgKi8KICAgIHJlZ3Byb2dfVAkqc2xfY29tcHByb2c7CS8qIENPTVBPVU5EUlVMRSB0dXJuZWQgaW50byBhIHJlZ2V4cCBwcm9ncm0KCQkJCSAqIChOVUxMIHdoZW4gbm8gY29tcG91bmRpbmcpICovCiAgICBjaGFyX3UJKnNsX2NvbXBzdGFydGZsYWdzOyAvKiBmbGFncyBmb3IgZmlyc3QgY29tcG91bmQgd29yZCAqLwogICAgY2hhcl91CSpzbF9jb21wYWxsZmxhZ3M7IC8qIGFsbCBmbGFncyBmb3IgY29tcG91bmQgd29yZHMgKi8KICAgIGNoYXJfdQlzbF9ub2JyZWFrOwkvKiBXaGVuIFRSVUU6IG5vIHNwYWNlcyBiZXR3ZWVuIHdvcmRzICovCiAgICBjaGFyX3UJKnNsX3N5bGxhYmxlOwkvKiBTWUxMQUJMRSByZXBlYXRhYmxlIGNoYXJzIG9yIE5VTEwgKi8KICAgIGdhcnJheV9UCXNsX3N5bF9pdGVtczsJLyogc3lsbGFibGUgaXRlbXMgKi8KCiAgICBpbnQJCXNsX3ByZWZpeGNudDsJLyogbnVtYmVyIG9mIGl0ZW1zIGluICJzbF9wcmVmcHJvZyIgKi8KICAgIHJlZ3Byb2dfVAkqKnNsX3ByZWZwcm9nOwkvKiB0YWJsZSB3aXRoIHJlZ3Byb2dzIGZvciBwcmVmaXhlcyAqLwoKICAgIGdhcnJheV9UCXNsX3JlcDsJCS8qIGxpc3Qgb2YgZnJvbXRvX1QgZW50cmllcyBmcm9tIFJFUCBsaW5lcyAqLwogICAgc2hvcnQJc2xfcmVwX2ZpcnN0WzI1Nl07ICAvKiBpbmRleGVzIHdoZXJlIGJ5dGUgZmlyc3QgYXBwZWFycywgLTEgaWYKCQkJCSAgICAgICB0aGVyZSBpcyBub25lICovCiAgICBnYXJyYXlfVAlzbF9zYWw7CQkvKiBsaXN0IG9mIHNhbGl0ZW1fVCBlbnRyaWVzIGZyb20gU0FMIGxpbmVzICovCiAgICBzYWxmaXJzdF9UCXNsX3NhbF9maXJzdFsyNTZdOyAgLyogaW5kZXhlcyB3aGVyZSBieXRlIGZpcnN0IGFwcGVhcnMsIC0xIGlmCgkJCQkgICAgICAgdGhlcmUgaXMgbm9uZSAqLwogICAgaW50CQlzbF9mb2xsb3d1cDsJLyogU0FMIGZvbGxvd3VwICovCiAgICBpbnQJCXNsX2NvbGxhcHNlOwkvKiBTQUwgY29sbGFwc2VfcmVzdWx0ICovCiAgICBpbnQJCXNsX3JlbV9hY2NlbnRzOwkvKiBTQUwgcmVtb3ZlX2FjY2VudHMgKi8KICAgIGludAkJc2xfc29mbzsJLyogU09GT0ZST00gYW5kIFNPRk9UTyBpbnN0ZWFkIG9mIFNBTCBpdGVtczoKCQkJCSAqICJzbF9zYWxfZmlyc3QiIG1hcHMgY2hhcnMsIHdoZW4gaGFzX21ieXRlCgkJCQkgKiAic2xfc2FsIiBpcyBhIGxpc3Qgb2Ygd2lkZSBjaGFyIGxpc3RzLiAqLwogICAgZ2FycmF5X1QJc2xfcmVwc2FsOwkvKiBsaXN0IG9mIGZyb210b19UIGVudHJpZXMgZnJvbSBSRVBTQUwgbGluZXMgKi8KICAgIHNob3J0CXNsX3JlcHNhbF9maXJzdFsyNTZdOyAgLyogc2xfcmVwX2ZpcnN0IGZvciBSRVBTQUwgbGluZXMgKi8KICAgIGludAkJc2xfbm9zcGxpdHN1Z3M7CS8qIGRvbid0IHN1Z2dlc3Qgc3BsaXR0aW5nIGEgd29yZCAqLwoKICAgIC8qIEluZm8gZnJvbSB0aGUgLnN1ZyBmaWxlLiAgTG9hZGVkIG9uIGRlbWFuZC4gKi8KICAgIHRpbWVfdAlzbF9zdWd0aW1lOwkvKiB0aW1lc3RhbXAgZm9yIC5zdWcgZmlsZSAqLwogICAgY2hhcl91CSpzbF9zYnl0czsJLyogc291bmRmb2xkZWQgd29yZCBieXRlcyAqLwogICAgaWR4X1QJKnNsX3NpZHhzOwkvKiBzb3VuZGZvbGRlZCB3b3JkIGluZGV4ZXMgKi8KICAgIGJ1Zl9UCSpzbF9zdWdidWY7CS8qIGJ1ZmZlciB3aXRoIHdvcmQgbnVtYmVyIHRhYmxlICovCiAgICBpbnQJCXNsX3N1Z2xvYWRlZDsJLyogVFJVRSB3aGVuIC5zdWcgZmlsZSB3YXMgbG9hZGVkIG9yIGZhaWxlZCB0bwoJCQkJICAgbG9hZCAqLwoKICAgIGludAkJc2xfaGFzX21hcDsJLyogVFJVRSBpZiB0aGVyZSBpcyBhIE1BUCBsaW5lICovCiNpZmRlZiBGRUFUX01CWVRFCiAgICBoYXNodGFiX1QJc2xfbWFwX2hhc2g7CS8qIE1BUCBmb3IgbXVsdGktYnl0ZSBjaGFycyAqLwogICAgaW50CQlzbF9tYXBfYXJyYXlbMjU2XTsgLyogTUFQIGZvciBmaXJzdCAyNTYgY2hhcnMgKi8KI2Vsc2UKICAgIGNoYXJfdQlzbF9tYXBfYXJyYXlbMjU2XTsgLyogTUFQIGZvciBmaXJzdCAyNTYgY2hhcnMgKi8KI2VuZGlmCiAgICBoYXNodGFiX1QJc2xfc291bmRkb25lOwkvKiB0YWJsZSB3aXRoIHNvdW5kZm9sZGVkIHdvcmRzIHRoYXQgaGF2ZQoJCQkJICAgaGFuZGxlZCwgc2VlIGFkZF9zb3VuZF9zdWdnZXN0KCkgKi8KfTsKCi8qIEZpcnN0IGxhbmd1YWdlIHRoYXQgaXMgbG9hZGVkLCBzdGFydCBvZiB0aGUgbGlua2VkIGxpc3Qgb2YgbG9hZGVkCiAqIGxhbmd1YWdlcy4gKi8Kc3RhdGljIHNsYW5nX1QgKmZpcnN0X2xhbmcgPSBOVUxMOwoKLyogRmxhZ3MgdXNlZCBpbiAuc3BsIGZpbGUgZm9yIHNvdW5kc2FsaWtlIGZsYWdzLiAqLwojZGVmaW5lIFNBTF9GMExMT1dVUAkJMQojZGVmaW5lIFNBTF9DT0xMQVBTRQkJMgojZGVmaW5lIFNBTF9SRU1fQUNDRU5UUwkJNAoKLyoKICogU3RydWN0dXJlIHVzZWQgaW4gImJfbGFuZ3AiLCBmaWxsZWQgZnJvbSAnc3BlbGxsYW5nJy4KICovCnR5cGVkZWYgc3RydWN0IGxhbmdwX1MKewogICAgc2xhbmdfVAkqbHBfc2xhbmc7CS8qIGluZm8gZm9yIHRoaXMgbGFuZ3VhZ2UgKi8KICAgIHNsYW5nX1QJKmxwX3NhbGxhbmc7CS8qIGxhbmd1YWdlIHVzZWQgZm9yIHNvdW5kIGZvbGRpbmcgb3IgTlVMTCAqLwogICAgc2xhbmdfVAkqbHBfcmVwbGFuZzsJLyogbGFuZ3VhZ2UgdXNlZCBmb3IgUkVQIGl0ZW1zIG9yIE5VTEwgKi8KICAgIGludAkJbHBfcmVnaW9uOwkvKiBiaXRtYXNrIGZvciByZWdpb24gb3IgUkVHSU9OX0FMTCAqLwp9IGxhbmdwX1Q7CgojZGVmaW5lIExBTkdQX0VOVFJZKGdhLCBpKQkoKChsYW5ncF9UICopKGdhKS5nYV9kYXRhKSArIChpKSkKCiNkZWZpbmUgUkVHSU9OX0FMTCAweGZmCQkvKiB3b3JkIHZhbGlkIGluIGFsbCByZWdpb25zICovCgojZGVmaW5lIFZJTVNQRUxMTUFHSUMgIlZJTXNwZWxsIiAgLyogc3RyaW5nIGF0IHN0YXJ0IG9mIFZpbSBzcGVsbCBmaWxlICovCiNkZWZpbmUgVklNU1BFTExNQUdJQ0wgOAojZGVmaW5lIFZJTVNQRUxMVkVSU0lPTiA1MAoKI2RlZmluZSBWSU1TVUdNQUdJQyAiVklNc3VnIgkvKiBzdHJpbmcgYXQgc3RhcnQgb2YgVmltIC5zdWcgZmlsZSAqLwojZGVmaW5lIFZJTVNVR01BR0lDTCA2CiNkZWZpbmUgVklNU1VHVkVSU0lPTiAxCgovKiBTZWN0aW9uIElEcy4gIE9ubHkgcmVudW1iZXIgdGhlbSB3aGVuIFZJTVNQRUxMVkVSU0lPTiBjaGFuZ2VzISAqLwojZGVmaW5lIFNOX1JFR0lPTgkwCS8qIDxyZWdpb25uYW1lPiBzZWN0aW9uICovCiNkZWZpbmUgU05fQ0hBUkZMQUdTCTEJLyogY2hhcmZsYWdzIHNlY3Rpb24gKi8KI2RlZmluZSBTTl9NSURXT1JECTIJLyogPG1pZHdvcmQ+IHNlY3Rpb24gKi8KI2RlZmluZSBTTl9QUkVGQ09ORAkzCS8qIDxwcmVmY29uZD4gc2VjdGlvbiAqLwojZGVmaW5lIFNOX1JFUAkJNAkvKiBSRVAgaXRlbXMgc2VjdGlvbiAqLwojZGVmaW5lIFNOX1NBTAkJNQkvKiBTQUwgaXRlbXMgc2VjdGlvbiAqLwojZGVmaW5lIFNOX1NPRk8JCTYJLyogc291bmRmb2xkaW5nIHNlY3Rpb24gKi8KI2RlZmluZSBTTl9NQVAJCTcJLyogTUFQIGl0ZW1zIHNlY3Rpb24gKi8KI2RlZmluZSBTTl9DT01QT1VORAk4CS8qIGNvbXBvdW5kIHdvcmRzIHNlY3Rpb24gKi8KI2RlZmluZSBTTl9TWUxMQUJMRQk5CS8qIHN5bGxhYmxlIHNlY3Rpb24gKi8KI2RlZmluZSBTTl9OT0JSRUFLCTEwCS8qIE5PQlJFQUsgc2VjdGlvbiAqLwojZGVmaW5lIFNOX1NVR0ZJTEUJMTEJLyogdGltZXN0YW1wIGZvciAuc3VnIGZpbGUgKi8KI2RlZmluZSBTTl9SRVBTQUwJMTIJLyogUkVQU0FMIGl0ZW1zIHNlY3Rpb24gKi8KI2RlZmluZSBTTl9XT1JEUwkxMwkvKiBjb21tb24gd29yZHMgKi8KI2RlZmluZSBTTl9OT1NQTElUU1VHUwkxNAkvKiBkb24ndCBzcGxpdCB3b3JkIGZvciBzdWdnZXN0aW9ucyAqLwojZGVmaW5lIFNOX0lORk8JCTE1CS8qIGluZm8gc2VjdGlvbiAqLwojZGVmaW5lIFNOX0VORAkJMjU1CS8qIGVuZCBvZiBzZWN0aW9ucyAqLwoKI2RlZmluZSBTTkZfUkVRVUlSRUQJMQkvKiA8c2VjdGlvbmZsYWdzPjogcmVxdWlyZWQgc2VjdGlvbiAqLwoKLyogUmVzdWx0IHZhbHVlcy4gIExvd2VyIG51bWJlciBpcyBhY2NlcHRlZCBvdmVyIGhpZ2hlciBvbmUuICovCiNkZWZpbmUgU1BfQkFOTkVECS0xCiNkZWZpbmUgU1BfT0sJCTAKI2RlZmluZSBTUF9SQVJFCQkxCiNkZWZpbmUgU1BfTE9DQUwJMgojZGVmaW5lIFNQX0JBRAkJMwoKLyogZmlsZSB1c2VkIGZvciAiekciIGFuZCAielciICovCnN0YXRpYyBjaGFyX3UJKmludF93b3JkbGlzdCA9IE5VTEw7Cgp0eXBlZGVmIHN0cnVjdCB3b3JkY291bnRfUwp7CiAgICBzaG9ydF91CXdjX2NvdW50OwkgICAgLyogbnIgb2YgdGltZXMgd29yZCB3YXMgc2VlbiAqLwogICAgY2hhcl91CXdjX3dvcmRbMV07CSAgICAvKiB3b3JkLCBhY3R1YWxseSBsb25nZXIgKi8KfSB3b3JkY291bnRfVDsKCnN0YXRpYyB3b3JkY291bnRfVCBkdW13YzsKI2RlZmluZSBXQ19LRVlfT0ZGICAoZHVtd2Mud2Nfd29yZCAtIChjaGFyX3UgKikmZHVtd2MpCiNkZWZpbmUgSEkyV0MoaGkpICAgICAoKHdvcmRjb3VudF9UICopKChoaSktPmhpX2tleSAtIFdDX0tFWV9PRkYpKQojZGVmaW5lIE1BWFdPUkRDT1VOVCAweGZmZmYKCi8qCiAqIEluZm9ybWF0aW9uIHVzZWQgd2hlbiBsb29raW5nIGZvciBzdWdnZXN0aW9ucy4KICovCnR5cGVkZWYgc3RydWN0IHN1Z2luZm9fUwp7CiAgICBnYXJyYXlfVAlzdV9nYTsJCSAgICAvKiBzdWdnZXN0aW9ucywgY29udGFpbnMgInN1Z2dlc3RfVCIgKi8KICAgIGludAkJc3VfbWF4Y291bnQ7CSAgICAvKiBtYXguIG51bWJlciBvZiBzdWdnZXN0aW9ucyBkaXNwbGF5ZWQgKi8KICAgIGludAkJc3VfbWF4c2NvcmU7CSAgICAvKiBtYXhpbXVtIHNjb3JlIGZvciBhZGRpbmcgdG8gc3VfZ2EgKi8KICAgIGludAkJc3Vfc2ZtYXhzY29yZTsJICAgIC8qIGlkZW0sIGZvciB3aGVuIGRvaW5nIHNvdW5kZm9sZCB3b3JkcyAqLwogICAgZ2FycmF5X1QJc3Vfc2dhOwkJICAgIC8qIGxpa2Ugc3VfZ2EsIHNvdW5kLWZvbGRlZCBzY29yaW5nICovCiAgICBjaGFyX3UJKnN1X2JhZHB0cjsJICAgIC8qIHN0YXJ0IG9mIGJhZCB3b3JkIGluIGxpbmUgKi8KICAgIGludAkJc3VfYmFkbGVuOwkgICAgLyogbGVuZ3RoIG9mIGRldGVjdGVkIGJhZCB3b3JkIGluIGxpbmUgKi8KICAgIGludAkJc3VfYmFkZmxhZ3M7CSAgICAvKiBjYXBzIGZsYWdzIGZvciBiYWQgd29yZCAqLwogICAgY2hhcl91CXN1X2JhZHdvcmRbTUFYV0xFTl07IC8qIGJhZCB3b3JkIHRydW5jYXRlZCBhdCBzdV9iYWRsZW4gKi8KICAgIGNoYXJfdQlzdV9mYmFkd29yZFtNQVhXTEVOXTsgLyogc3VfYmFkd29yZCBjYXNlLWZvbGRlZCAqLwogICAgY2hhcl91CXN1X3NhbF9iYWR3b3JkW01BWFdMRU5dOyAvKiBzdV9iYWR3b3JkIHNvdW5kZm9sZGVkICovCiAgICBoYXNodGFiX1QJc3VfYmFubmVkOwkgICAgLyogdGFibGUgd2l0aCBiYW5uZWQgd29yZHMgKi8KICAgIHNsYW5nX1QJKnN1X3NhbGxhbmc7CSAgICAvKiBkZWZhdWx0IGxhbmd1YWdlIGZvciBzb3VuZCBmb2xkaW5nICovCn0gc3VnaW5mb19UOwoKLyogT25lIHdvcmQgc3VnZ2VzdGlvbi4gIFVzZWQgaW4gInNpX2dhIi4gKi8KdHlwZWRlZiBzdHJ1Y3Qgc3VnZ2VzdF9TCnsKICAgIGNoYXJfdQkqc3Rfd29yZDsJLyogc3VnZ2VzdGVkIHdvcmQsIGFsbG9jYXRlZCBzdHJpbmcgKi8KICAgIGludAkJc3Rfd29yZGxlbjsJLyogU1RSTEVOKHN0X3dvcmQpICovCiAgICBpbnQJCXN0X29yZ2xlbjsJLyogbGVuZ3RoIG9mIHJlcGxhY2VkIHRleHQgKi8KICAgIGludAkJc3Rfc2NvcmU7CS8qIGxvd2VyIGlzIGJldHRlciAqLwogICAgaW50CQlzdF9hbHRzY29yZTsJLyogdXNlZCB3aGVuIHN0X3Njb3JlIGNvbXBhcmVzIGVxdWFsICovCiAgICBpbnQJCXN0X3NhbHNjb3JlOwkvKiBzdF9zY29yZSBpcyBmb3Igc291bmRhbGlrZSAqLwogICAgaW50CQlzdF9oYWRfYm9udXM7CS8qIGJvbnVzIGFscmVhZHkgaW5jbHVkZWQgaW4gc2NvcmUgKi8KICAgIHNsYW5nX1QJKnN0X3NsYW5nOwkvKiBsYW5ndWFnZSB1c2VkIGZvciBzb3VuZCBmb2xkaW5nICovCn0gc3VnZ2VzdF9UOwoKI2RlZmluZSBTVUcoZ2EsIGkpICgoKHN1Z2dlc3RfVCAqKShnYSkuZ2FfZGF0YSlbaV0pCgovKiBUUlVFIGlmIGEgd29yZCBhcHBlYXJzIGluIHRoZSBsaXN0IG9mIGJhbm5lZCB3b3Jkcy4gICovCiNkZWZpbmUgV0FTX0JBTk5FRChzdSwgd29yZCkgKCFIQVNISVRFTV9FTVBUWShoYXNoX2ZpbmQoJnN1LT5zdV9iYW5uZWQsIHdvcmQpKSkKCi8qIE51bWJlciBvZiBzdWdnZXN0aW9ucyBrZXB0IHdoZW4gY2xlYW5pbmcgdXAuICB3ZSBuZWVkIHRvIGtlZXAgbW9yZSB0aGFuCiAqIHdoYXQgaXMgZGlzcGxheWVkLCBiZWNhdXNlIHdoZW4gcmVzY29yZV9zdWdnZXN0aW9ucygpIGlzIGNhbGxlZCB0aGUgc2NvcmUKICogbWF5IGNoYW5nZSBhbmQgd3Jvbmcgc3VnZ2VzdGlvbnMgbWF5IGJlIHJlbW92ZWQgbGF0ZXIuICovCiNkZWZpbmUgU1VHX0NMRUFOX0NPVU5UKHN1KSAgICAoKHN1KS0+c3VfbWF4Y291bnQgPCAxMzAgPyAxNTAgOiAoc3UpLT5zdV9tYXhjb3VudCArIDIwKQoKLyogVGhyZXNob2xkIGZvciBzb3J0aW5nIGFuZCBjbGVhbmluZyB1cCBzdWdnZXN0aW9ucy4gIERvbid0IHdhbnQgdG8ga2VlcCBsb3RzCiAqIG9mIHN1Z2dlc3Rpb25zIHRoYXQgYXJlIG5vdCBnb2luZyB0byBiZSBkaXNwbGF5ZWQuICovCiNkZWZpbmUgU1VHX01BWF9DT1VOVChzdSkJKFNVR19DTEVBTl9DT1VOVChzdSkgKyA1MCkKCi8qIHNjb3JlIGZvciB2YXJpb3VzIGNoYW5nZXMgKi8KI2RlZmluZSBTQ09SRV9TUExJVAkxNDkJLyogc3BsaXQgYmFkIHdvcmQgKi8KI2RlZmluZSBTQ09SRV9TUExJVF9OTwkyNDkJLyogc3BsaXQgYmFkIHdvcmQgd2l0aCBOT1NQTElUU1VHUyAqLwojZGVmaW5lIFNDT1JFX0lDQVNFCTUyCS8qIHNsaWdodGx5IGRpZmZlcmVudCBjYXNlICovCiNkZWZpbmUgU0NPUkVfUkVHSU9OCTIwMAkvKiB3b3JkIGlzIGZvciBkaWZmZXJlbnQgcmVnaW9uICovCiNkZWZpbmUgU0NPUkVfUkFSRQkxODAJLyogcmFyZSB3b3JkICovCiNkZWZpbmUgU0NPUkVfU1dBUAk3NQkvKiBzd2FwIHR3byBjaGFyYWN0ZXJzICovCiNkZWZpbmUgU0NPUkVfU1dBUDMJMTEwCS8qIHN3YXAgdHdvIGNoYXJhY3RlcnMgaW4gdGhyZWUgKi8KI2RlZmluZSBTQ09SRV9SRVAJNjUJLyogUkVQIHJlcGxhY2VtZW50ICovCiNkZWZpbmUgU0NPUkVfU1VCU1QJOTMJLyogc3Vic3RpdHV0ZSBhIGNoYXJhY3RlciAqLwojZGVmaW5lIFNDT1JFX1NJTUlMQVIJMzMJLyogc3Vic3RpdHV0ZSBhIHNpbWlsYXIgY2hhcmFjdGVyICovCiNkZWZpbmUgU0NPUkVfU1VCQ09NUAkzMwkvKiBzdWJzdGl0dXRlIGEgY29tcG9zaW5nIGNoYXJhY3RlciAqLwojZGVmaW5lIFNDT1JFX0RFTAk5NAkvKiBkZWxldGUgYSBjaGFyYWN0ZXIgKi8KI2RlZmluZSBTQ09SRV9ERUxEVVAJNjYJLyogZGVsZXRlIGEgZHVwbGljYXRlZCBjaGFyYWN0ZXIgKi8KI2RlZmluZSBTQ09SRV9ERUxDT01QCTI4CS8qIGRlbGV0ZSBhIGNvbXBvc2luZyBjaGFyYWN0ZXIgKi8KI2RlZmluZSBTQ09SRV9JTlMJOTYJLyogaW5zZXJ0IGEgY2hhcmFjdGVyICovCiNkZWZpbmUgU0NPUkVfSU5TRFVQCTY3CS8qIGluc2VydCBhIGR1cGxpY2F0ZSBjaGFyYWN0ZXIgKi8KI2RlZmluZSBTQ09SRV9JTlNDT01QCTMwCS8qIGluc2VydCBhIGNvbXBvc2luZyBjaGFyYWN0ZXIgKi8KI2RlZmluZSBTQ09SRV9OT05XT1JECTEwMwkvKiBjaGFuZ2Ugbm9uLXdvcmQgdG8gd29yZCBjaGFyICovCgojZGVmaW5lIFNDT1JFX0ZJTEUJMzAJLyogc3VnZ2VzdGlvbiBmcm9tIGEgZmlsZSAqLwojZGVmaW5lIFNDT1JFX01BWElOSVQJMzUwCS8qIEluaXRpYWwgbWF4aW11bSBzY29yZTogaGlnaGVyID09IHNsb3dlci4KCQkJCSAqIDM1MCBhbGxvd3MgZm9yIGFib3V0IHRocmVlIGNoYW5nZXMuICovCgojZGVmaW5lIFNDT1JFX0NPTU1PTjEJMzAJLyogc3VidHJhY3RlZCBmb3Igd29yZHMgc2VlbiBiZWZvcmUgKi8KI2RlZmluZSBTQ09SRV9DT01NT04yCTQwCS8qIHN1YnRyYWN0ZWQgZm9yIHdvcmRzIG9mdGVuIHNlZW4gKi8KI2RlZmluZSBTQ09SRV9DT01NT04zCTUwCS8qIHN1YnRyYWN0ZWQgZm9yIHdvcmRzIHZlcnkgb2Z0ZW4gc2VlbiAqLwojZGVmaW5lIFNDT1JFX1RIUkVTMgkxMAkvKiB3b3JkIGNvdW50IHRocmVzaG9sZCBmb3IgQ09NTU9OMiAqLwojZGVmaW5lIFNDT1JFX1RIUkVTMwkxMDAJLyogd29yZCBjb3VudCB0aHJlc2hvbGQgZm9yIENPTU1PTjMgKi8KCi8qIFdoZW4gdHJ5aW5nIGNoYW5nZWQgc291bmRmb2xkIHdvcmRzIGl0IGJlY29tZXMgc2xvdyB3aGVuIHRyeWluZyBtb3JlIHRoYW4KICogdHdvIGNoYW5nZXMuICBXaXRoIGxlc3MgdGhlbiB0d28gY2hhbmdlcyBpdCdzIHNsaWdodGx5IGZhc3RlciBidXQgd2UgbWlzcyBhCiAqIGZldyBnb29kIHN1Z2dlc3Rpb25zLiAgSW4gcmFyZSBjYXNlcyB3ZSBuZWVkIHRvIHRyeSB0aHJlZSBvZiBmb3VyIGNoYW5nZXMuCiAqLwojZGVmaW5lIFNDT1JFX1NGTUFYMQkyMDAJLyogbWF4aW11bSBzY29yZSBmb3IgZmlyc3QgdHJ5ICovCiNkZWZpbmUgU0NPUkVfU0ZNQVgyCTMwMAkvKiBtYXhpbXVtIHNjb3JlIGZvciBzZWNvbmQgdHJ5ICovCiNkZWZpbmUgU0NPUkVfU0ZNQVgzCTQwMAkvKiBtYXhpbXVtIHNjb3JlIGZvciB0aGlyZCB0cnkgKi8KCiNkZWZpbmUgU0NPUkVfQklHCVNDT1JFX0lOUyAqIDMJLyogYmlnIGRpZmZlcmVuY2UgKi8KI2RlZmluZSBTQ09SRV9NQVhNQVgJOTk5OTk5CQkvKiBhY2NlcHQgYW55IHNjb3JlICovCiNkZWZpbmUgU0NPUkVfTElNSVRNQVgJMzUwCQkvKiBmb3Igc3BlbGxfZWRpdF9zY29yZV9saW1pdCgpICovCgovKiBmb3Igc3BlbGxfZWRpdF9zY29yZV9saW1pdCgpIHdlIG5lZWQgdG8ga25vdyB0aGUgbWluaW11bSB2YWx1ZSBvZgogKiBTQ09SRV9JQ0FTRSwgU0NPUkVfU1dBUCwgU0NPUkVfREVMLCBTQ09SRV9TSU1JTEFSIGFuZCBTQ09SRV9JTlMgKi8KI2RlZmluZSBTQ09SRV9FRElUX01JTglTQ09SRV9TSU1JTEFSCgovKgogKiBTdHJ1Y3R1cmUgdG8gc3RvcmUgaW5mbyBmb3Igd29yZCBtYXRjaGluZy4KICovCnR5cGVkZWYgc3RydWN0IG1hdGNoaW5mX1MKewogICAgbGFuZ3BfVAkqbWlfbHA7CQkJLyogaW5mbyBmb3IgbGFuZ3VhZ2UgYW5kIHJlZ2lvbiAqLwoKICAgIC8qIHBvaW50ZXJzIHRvIG9yaWdpbmFsIHRleHQgdG8gYmUgY2hlY2tlZCAqLwogICAgY2hhcl91CSptaV93b3JkOwkJLyogc3RhcnQgb2Ygd29yZCBiZWluZyBjaGVja2VkICovCiAgICBjaGFyX3UJKm1pX2VuZDsJCS8qIGVuZCBvZiBtYXRjaGluZyB3b3JkIHNvIGZhciAqLwogICAgY2hhcl91CSptaV9mZW5kOwkJLyogbmV4dCBjaGFyIHRvIGJlIGFkZGVkIHRvIG1pX2Z3b3JkICovCiAgICBjaGFyX3UJKm1pX2NlbmQ7CQkvKiBjaGFyIGFmdGVyIHdoYXQgd2FzIHVzZWQgZm9yCgkJCQkJICAgbWlfY2FwZmxhZ3MgKi8KCiAgICAvKiBjYXNlLWZvbGRlZCB0ZXh0ICovCiAgICBjaGFyX3UJbWlfZndvcmRbTUFYV0xFTiArIDFdOwkvKiBtaV93b3JkIGNhc2UtZm9sZGVkICovCiAgICBpbnQJCW1pX2Z3b3JkbGVuOwkJLyogbnIgb2YgdmFsaWQgYnl0ZXMgaW4gbWlfZndvcmQgKi8KCiAgICAvKiBmb3Igd2hlbiBjaGVja2luZyB3b3JkIGFmdGVyIGEgcHJlZml4ICovCiAgICBpbnQJCW1pX3ByZWZhcnJpZHg7CQkvKiBpbmRleCBpbiBzbF9waWR4cyB3aXRoIGxpc3Qgb2YKCQkJCQkgICBhZmZpeElEL2NvbmRpdGlvbiAqLwogICAgaW50CQltaV9wcmVmY250OwkJLyogbnVtYmVyIG9mIGVudHJpZXMgYXQgbWlfcHJlZmFycmlkeCAqLwogICAgaW50CQltaV9wcmVmaXhsZW47CQkvKiBieXRlIGxlbmd0aCBvZiBwcmVmaXggKi8KI2lmZGVmIEZFQVRfTUJZVEUKICAgIGludAkJbWlfY3ByZWZpeGxlbjsJCS8qIGJ5dGUgbGVuZ3RoIG9mIHByZWZpeCBpbiBvcmlnaW5hbAoJCQkJCSAgIGNhc2UgKi8KI2Vsc2UKIyBkZWZpbmUgbWlfY3ByZWZpeGxlbiBtaV9wcmVmaXhsZW4JLyogaXQncyB0aGUgc2FtZSB2YWx1ZSAqLwojZW5kaWYKCiAgICAvKiBmb3Igd2hlbiBjaGVja2luZyBhIGNvbXBvdW5kIHdvcmQgKi8KICAgIGludAkJbWlfY29tcG9mZjsJCS8qIHN0YXJ0IG9mIGZvbGxvd2luZyB3b3JkIG9mZnNldCAqLwogICAgY2hhcl91CW1pX2NvbXBmbGFnc1tNQVhXTEVOXTsJLyogZmxhZ3MgZm9yIGNvbXBvdW5kIHdvcmRzIHVzZWQgKi8KICAgIGludAkJbWlfY29tcGxlbjsJCS8qIG5yIG9mIGNvbXBvdW5kIHdvcmRzIHVzZWQgKi8KICAgIGludAkJbWlfY29tcGV4dHJhOwkJLyogbnIgb2YgQ09NUE9VTkRST09UIHdvcmRzICovCgogICAgLyogb3RoZXJzICovCiAgICBpbnQJCW1pX3Jlc3VsdDsJCS8qIHJlc3VsdCBzbyBmYXI6IFNQX0JBRCwgU1BfT0ssIGV0Yy4gKi8KICAgIGludAkJbWlfY2FwZmxhZ3M7CQkvKiBXRl9PTkVDQVAgV0ZfQUxMQ0FQIFdGX0tFRVBDQVAgKi8KICAgIGJ1Zl9UCSptaV9idWY7CQkvKiBidWZmZXIgYmVpbmcgY2hlY2tlZCAqLwoKICAgIC8qIGZvciBOT0JSRUFLICovCiAgICBpbnQJCW1pX3Jlc3VsdDI7CQkvKiAibWlfcmVzdWwiIHdpdGhvdXQgZm9sbG93aW5nIHdvcmQgKi8KICAgIGNoYXJfdQkqbWlfZW5kMjsJCS8qICJtaV9lbmQiIHdpdGhvdXQgZm9sbG93aW5nIHdvcmQgKi8KfSBtYXRjaGluZl9UOwoKLyoKICogVGhlIHRhYmxlcyB1c2VkIGZvciByZWNvZ25pemluZyB3b3JkIGNoYXJhY3RlcnMgYWNjb3JkaW5nIHRvIHNwZWxsaW5nLgogKiBUaGVzZSBhcmUgb25seSB1c2VkIGZvciB0aGUgZmlyc3QgMjU2IGNoYXJhY3RlcnMgb2YgJ2VuY29kaW5nJy4KICovCnR5cGVkZWYgc3RydWN0IHNwZWxsdGFiX1MKewogICAgY2hhcl91ICBzdF9pc3dbMjU2XTsJLyogZmxhZ3M6IGlzIHdvcmQgY2hhciAqLwogICAgY2hhcl91ICBzdF9pc3VbMjU2XTsJLyogZmxhZ3M6IGlzIHVwcGVyY2FzZSBjaGFyICovCiAgICBjaGFyX3UgIHN0X2ZvbGRbMjU2XTsJLyogY2hhcnM6IGZvbGRlZCBjYXNlICovCiAgICBjaGFyX3UgIHN0X3VwcGVyWzI1Nl07CS8qIGNoYXJzOiB1cHBlciBjYXNlICovCn0gc3BlbGx0YWJfVDsKCnN0YXRpYyBzcGVsbHRhYl9UICAgc3BlbGx0YWI7CnN0YXRpYyBpbnQJICAgIGRpZF9zZXRfc3BlbGx0YWI7CgojZGVmaW5lIENGX1dPUkQJCTB4MDEKI2RlZmluZSBDRl9VUFBFUgkweDAyCgpzdGF0aWMgdm9pZCBjbGVhcl9zcGVsbF9jaGFydGFiIF9fQVJHUygoc3BlbGx0YWJfVCAqc3ApKTsKc3RhdGljIGludCBzZXRfc3BlbGxfZmluaXNoIF9fQVJHUygoc3BlbGx0YWJfVAkqbmV3X3N0KSk7CnN0YXRpYyBpbnQgc3BlbGxfaXN3b3JkcCBfX0FSR1MoKGNoYXJfdSAqcCwgYnVmX1QgKmJ1ZikpOwpzdGF0aWMgaW50IHNwZWxsX2lzd29yZHBfbm13IF9fQVJHUygoY2hhcl91ICpwKSk7CiNpZmRlZiBGRUFUX01CWVRFCnN0YXRpYyBpbnQgc3BlbGxfaXN3b3JkcF93IF9fQVJHUygoaW50ICpwLCBidWZfVCAqYnVmKSk7CiNlbmRpZgpzdGF0aWMgaW50IHdyaXRlX3NwZWxsX3ByZWZjb25kIF9fQVJHUygoRklMRSAqZmQsIGdhcnJheV9UICpnYXApKTsKCi8qCiAqIEZvciBmaW5kaW5nIHN1Z2dlc3Rpb25zOiBBdCBlYWNoIG5vZGUgaW4gdGhlIHRyZWUgdGhlc2Ugc3RhdGVzIGFyZSB0cmllZDoKICovCnR5cGVkZWYgZW51bQp7CiAgICBTVEFURV9TVEFSVCA9IDAsCS8qIEF0IHN0YXJ0IG9mIG5vZGUgY2hlY2sgZm9yIE5VTCBieXRlcyAoZ29vZHdvcmQKCQkJICogZW5kcyk7IGlmIGJhZHdvcmQgZW5kcyB0aGVyZSBpcyBhIG1hdGNoLCBvdGhlcndpc2UKCQkJICogdHJ5IHNwbGl0dGluZyB3b3JkLiAqLwogICAgU1RBVEVfTk9QUkVGSVgsCS8qIHRyeSB3aXRob3V0IHByZWZpeCAqLwogICAgU1RBVEVfU1BMSVRVTkRPLAkvKiBVbmRvIHNwbGl0dGluZy4gKi8KICAgIFNUQVRFX0VORE5VTCwJLyogUGFzdCBOVUwgYnl0ZXMgYXQgc3RhcnQgb2YgdGhlIG5vZGUuICovCiAgICBTVEFURV9QTEFJTiwJLyogVXNlIGVhY2ggYnl0ZSBvZiB0aGUgbm9kZS4gKi8KICAgIFNUQVRFX0RFTCwJCS8qIERlbGV0ZSBhIGJ5dGUgZnJvbSB0aGUgYmFkIHdvcmQuICovCiAgICBTVEFURV9JTlNfUFJFUCwJLyogUHJlcGFyZSBmb3IgaW5zZXJ0aW5nIGJ5dGVzLiAqLwogICAgU1RBVEVfSU5TLAkJLyogSW5zZXJ0IGEgYnl0ZSBpbiB0aGUgYmFkIHdvcmQuICovCiAgICBTVEFURV9TV0FQLAkJLyogU3dhcCB0d28gYnl0ZXMuICovCiAgICBTVEFURV9VTlNXQVAsCS8qIFVuZG8gc3dhcCB0d28gY2hhcmFjdGVycy4gKi8KICAgIFNUQVRFX1NXQVAzLAkvKiBTd2FwIHR3byBjaGFyYWN0ZXJzIG92ZXIgdGhyZWUuICovCiAgICBTVEFURV9VTlNXQVAzLAkvKiBVbmRvIFN3YXAgdHdvIGNoYXJhY3RlcnMgb3ZlciB0aHJlZS4gKi8KICAgIFNUQVRFX1VOUk9UM0wsCS8qIFVuZG8gcm90YXRlIHRocmVlIGNoYXJhY3RlcnMgbGVmdCAqLwogICAgU1RBVEVfVU5ST1QzUiwJLyogVW5kbyByb3RhdGUgdGhyZWUgY2hhcmFjdGVycyByaWdodCAqLwogICAgU1RBVEVfUkVQX0lOSSwJLyogUHJlcGFyZSBmb3IgdXNpbmcgUkVQIGl0ZW1zLiAqLwogICAgU1RBVEVfUkVQLAkJLyogVXNlIG1hdGNoaW5nIFJFUCBpdGVtcyBmcm9tIHRoZSAuYWZmIGZpbGUuICovCiAgICBTVEFURV9SRVBfVU5ETywJLyogVW5kbyBhIFJFUCBpdGVtIHJlcGxhY2VtZW50LiAqLwogICAgU1RBVEVfRklOQUwJCS8qIEVuZCBvZiB0aGlzIG5vZGUuICovCn0gc3RhdGVfVDsKCi8qCiAqIFN0cnVjdCB0byBrZWVwIHRoZSBzdGF0ZSBhdCBlYWNoIGxldmVsIGluIHN1Z2dlc3RfdHJ5X2NoYW5nZSgpLgogKi8KdHlwZWRlZiBzdHJ1Y3QgdHJ5c3RhdGVfUwp7CiAgICBzdGF0ZV9UCXRzX3N0YXRlOwkvKiBzdGF0ZSBhdCB0aGlzIGxldmVsLCBTVEFURV8gKi8KICAgIGludAkJdHNfc2NvcmU7CS8qIHNjb3JlICovCiAgICBpZHhfVAl0c19hcnJpZHg7CS8qIGluZGV4IGluIHRyZWUgYXJyYXksIHN0YXJ0IG9mIG5vZGUgKi8KICAgIHNob3J0CXRzX2N1cmk7CS8qIGluZGV4IGluIGxpc3Qgb2YgY2hpbGQgbm9kZXMgKi8KICAgIGNoYXJfdQl0c19maWR4OwkvKiBpbmRleCBpbiBmd29yZFtdLCBjYXNlLWZvbGRlZCBiYWQgd29yZCAqLwogICAgY2hhcl91CXRzX2ZpZHh0cnk7CS8qIHRzX2ZpZHggYXQgd2hpY2ggYnl0ZXMgbWF5IGJlIGNoYW5nZWQgKi8KICAgIGNoYXJfdQl0c190d29yZGxlbjsJLyogdmFsaWQgbGVuZ3RoIG9mIHR3b3JkW10gKi8KICAgIGNoYXJfdQl0c19wcmVmaXhkZXB0aDsJLyogc3RhY2sgZGVwdGggZm9yIGVuZCBvZiBwcmVmaXggb3IKCQkJCSAqIFBGRF9QUkVGSVhUUkVFIG9yIFBGRF9OT1BSRUZJWCAqLwogICAgY2hhcl91CXRzX2ZsYWdzOwkvKiBUU0ZfIGZsYWdzICovCiNpZmRlZiBGRUFUX01CWVRFCiAgICBjaGFyX3UJdHNfdGNoYXJsZW47CS8qIG51bWJlciBvZiBieXRlcyBpbiB0d29yZCBjaGFyYWN0ZXIgKi8KICAgIGNoYXJfdQl0c190Y2hhcmlkeDsJLyogY3VycmVudCBieXRlIGluZGV4IGluIHR3b3JkIGNoYXJhY3RlciAqLwogICAgY2hhcl91CXRzX2lzZGlmZjsJLyogRElGRl8gdmFsdWVzICovCiAgICBjaGFyX3UJdHNfZmNoYXJzdGFydDsJLyogaW5kZXggaW4gZndvcmQgd2hlcmUgYmFkd29yZCBjaGFyIHN0YXJ0ZWQgKi8KI2VuZGlmCiAgICBjaGFyX3UJdHNfcHJld29yZGxlbjsJLyogbGVuZ3RoIG9mIHdvcmQgaW4gInByZXdvcmRbXSIgKi8KICAgIGNoYXJfdQl0c19zcGxpdG9mZjsJLyogaW5kZXggaW4gInR3b3JkIiBhZnRlciBsYXN0IHNwbGl0ICovCiAgICBjaGFyX3UJdHNfc3BsaXRmaWR4OwkvKiAidHNfZmlkeCIgYXQgd29yZCBzcGxpdCAqLwogICAgY2hhcl91CXRzX2NvbXBsZW47CS8qIG5yIG9mIGNvbXBvdW5kIHdvcmRzIHVzZWQgKi8KICAgIGNoYXJfdQl0c19jb21wc3BsaXQ7CS8qIGluZGV4IGZvciAiY29tcGZsYWdzIiB3aGVyZSB3b3JkIHdhcyBzcGl0ICovCiAgICBjaGFyX3UJdHNfc2F2ZV9iYWRmbGFnczsgICAvKiBzdV9iYWRmbGFncyBzYXZlZCBoZXJlICovCiAgICBjaGFyX3UJdHNfZGVsaWR4OwkvKiBpbmRleCBpbiBmd29yZCBmb3IgY2hhciB0aGF0IHdhcyBkZWxldGVkLAoJCQkJICAgdmFsaWQgd2hlbiAidHNfZmxhZ3MiIGhhcyBUU0ZfRElEREVMICovCn0gdHJ5c3RhdGVfVDsKCi8qIHZhbHVlcyBmb3IgdHNfaXNkaWZmICovCiNkZWZpbmUgRElGRl9OT05FCTAJLyogbm8gZGlmZmVyZW50IGJ5dGUgKHlldCkgKi8KI2RlZmluZSBESUZGX1lFUwkxCS8qIGRpZmZlcmVudCBieXRlIGZvdW5kICovCiNkZWZpbmUgRElGRl9JTlNFUlQJMgkvKiBpbnNlcnRpbmcgY2hhcmFjdGVyICovCgovKiB2YWx1ZXMgZm9yIHRzX2ZsYWdzICovCiNkZWZpbmUgVFNGX1BSRUZJWE9LCTEJLyogYWxyZWFkeSBjaGVja2VkIHRoYXQgcHJlZml4IGlzIE9LICovCiNkZWZpbmUgVFNGX0RJRFNQTElUCTIJLyogdHJpZWQgc3BsaXQgYXQgdGhpcyBwb2ludCAqLwojZGVmaW5lIFRTRl9ESURERUwJNAkvKiBkaWQgYSBkZWxldGUsICJ0c19kZWxpZHgiIGhhcyBpbmRleCAqLwoKLyogc3BlY2lhbCB2YWx1ZXMgdHNfcHJlZml4ZGVwdGggKi8KI2RlZmluZSBQRkRfTk9QUkVGSVgJMHhmZgkvKiBub3QgdXNpbmcgcHJlZml4ZXMgKi8KI2RlZmluZSBQRkRfUFJFRklYVFJFRQkweGZlCS8qIHdhbGtpbmcgdGhyb3VnaCB0aGUgcHJlZml4IHRyZWUgKi8KI2RlZmluZSBQRkRfTk9UU1BFQ0lBTAkweGZkCS8qIGhpZ2hlc3QgdmFsdWUgdGhhdCdzIG5vdCBzcGVjaWFsICovCgovKiBtb2RlIHZhbHVlcyBmb3IgZmluZF93b3JkICovCiNkZWZpbmUgRklORF9GT0xEV09SRAkgICAgMAkvKiBmaW5kIHdvcmQgY2FzZS1mb2xkZWQgKi8KI2RlZmluZSBGSU5EX0tFRVBXT1JECSAgICAxCS8qIGZpbmQga2VlcC1jYXNlIHdvcmQgKi8KI2RlZmluZSBGSU5EX1BSRUZJWAkgICAgMgkvKiBmaW5kIHdvcmQgYWZ0ZXIgcHJlZml4ICovCiNkZWZpbmUgRklORF9DT01QT1VORAkgICAgMwkvKiBmaW5kIGNhc2UtZm9sZGVkIGNvbXBvdW5kIHdvcmQgKi8KI2RlZmluZSBGSU5EX0tFRVBDT01QT1VORCAgIDQJLyogZmluZCBrZWVwLWNhc2UgY29tcG91bmQgd29yZCAqLwoKc3RhdGljIHNsYW5nX1QgKnNsYW5nX2FsbG9jIF9fQVJHUygoY2hhcl91ICpsYW5nKSk7CnN0YXRpYyB2b2lkIHNsYW5nX2ZyZWUgX19BUkdTKChzbGFuZ19UICpscCkpOwpzdGF0aWMgdm9pZCBzbGFuZ19jbGVhciBfX0FSR1MoKHNsYW5nX1QgKmxwKSk7CnN0YXRpYyB2b2lkIHNsYW5nX2NsZWFyX3N1ZyBfX0FSR1MoKHNsYW5nX1QgKmxwKSk7CnN0YXRpYyB2b2lkIGZpbmRfd29yZCBfX0FSR1MoKG1hdGNoaW5mX1QgKm1pcCwgaW50IG1vZGUpKTsKc3RhdGljIGludCBjYW5fY29tcG91bmQgX19BUkdTKChzbGFuZ19UICpzbGFuZywgY2hhcl91ICp3b3JkLCBjaGFyX3UgKmZsYWdzKSk7CnN0YXRpYyBpbnQgdmFsaWRfd29yZF9wcmVmaXggX19BUkdTKChpbnQgdG90cHJlZmNudCwgaW50IGFycmlkeCwgaW50IGZsYWdzLCBjaGFyX3UgKndvcmQsIHNsYW5nX1QgKnNsYW5nLCBpbnQgY29uZF9yZXEpKTsKc3RhdGljIHZvaWQgZmluZF9wcmVmaXggX19BUkdTKChtYXRjaGluZl9UICptaXAsIGludCBtb2RlKSk7CnN0YXRpYyBpbnQgZm9sZF9tb3JlIF9fQVJHUygobWF0Y2hpbmZfVCAqbWlwKSk7CnN0YXRpYyBpbnQgc3BlbGxfdmFsaWRfY2FzZSBfX0FSR1MoKGludCB3b3JkZmxhZ3MsIGludCB0cmVlZmxhZ3MpKTsKc3RhdGljIGludCBub19zcGVsbF9jaGVja2luZyBfX0FSR1MoKHdpbl9UICp3cCkpOwpzdGF0aWMgdm9pZCBzcGVsbF9sb2FkX2xhbmcgX19BUkdTKChjaGFyX3UgKmxhbmcpKTsKc3RhdGljIGNoYXJfdSAqc3BlbGxfZW5jIF9fQVJHUygodm9pZCkpOwpzdGF0aWMgdm9pZCBpbnRfd29yZGxpc3Rfc3BsIF9fQVJHUygoY2hhcl91ICpmbmFtZSkpOwpzdGF0aWMgdm9pZCBzcGVsbF9sb2FkX2NiIF9fQVJHUygoY2hhcl91ICpmbmFtZSwgdm9pZCAqY29va2llKSk7CnN0YXRpYyBzbGFuZ19UICpzcGVsbF9sb2FkX2ZpbGUgX19BUkdTKChjaGFyX3UgKmZuYW1lLCBjaGFyX3UgKmxhbmcsIHNsYW5nX1QgKm9sZF9scCwgaW50IHNpbGVudCkpOwpzdGF0aWMgaW50IGdldDJjIF9fQVJHUygoRklMRSAqZmQpKTsKc3RhdGljIGludCBnZXQzYyBfX0FSR1MoKEZJTEUgKmZkKSk7CnN0YXRpYyBpbnQgZ2V0NGMgX19BUkdTKChGSUxFICpmZCkpOwpzdGF0aWMgdGltZV90IGdldDhjIF9fQVJHUygoRklMRSAqZmQpKTsKc3RhdGljIGNoYXJfdSAqcmVhZF9jbnRfc3RyaW5nIF9fQVJHUygoRklMRSAqZmQsIGludCBjbnRfYnl0ZXMsIGludCAqbGVucCkpOwpzdGF0aWMgY2hhcl91ICpyZWFkX3N0cmluZyBfX0FSR1MoKEZJTEUgKmZkLCBpbnQgY250KSk7CnN0YXRpYyBpbnQgcmVhZF9yZWdpb25fc2VjdGlvbiBfX0FSR1MoKEZJTEUgKmZkLCBzbGFuZ19UICpzbGFuZywgaW50IGxlbikpOwpzdGF0aWMgaW50IHJlYWRfY2hhcmZsYWdzX3NlY3Rpb24gX19BUkdTKChGSUxFICpmZCkpOwpzdGF0aWMgaW50IHJlYWRfcHJlZmNvbmRfc2VjdGlvbiBfX0FSR1MoKEZJTEUgKmZkLCBzbGFuZ19UICpscCkpOwpzdGF0aWMgaW50IHJlYWRfcmVwX3NlY3Rpb24gX19BUkdTKChGSUxFICpmZCwgZ2FycmF5X1QgKmdhcCwgc2hvcnQgKmZpcnN0KSk7CnN0YXRpYyBpbnQgcmVhZF9zYWxfc2VjdGlvbiBfX0FSR1MoKEZJTEUgKmZkLCBzbGFuZ19UICpzbGFuZykpOwpzdGF0aWMgaW50IHJlYWRfd29yZHNfc2VjdGlvbiBfX0FSR1MoKEZJTEUgKmZkLCBzbGFuZ19UICpscCwgaW50IGxlbikpOwpzdGF0aWMgdm9pZCBjb3VudF9jb21tb25fd29yZCBfX0FSR1MoKHNsYW5nX1QgKmxwLCBjaGFyX3UgKndvcmQsIGludCBsZW4sIGludCBjb3VudCkpOwpzdGF0aWMgaW50IHNjb3JlX3dvcmRjb3VudF9hZGogX19BUkdTKChzbGFuZ19UICpzbGFuZywgaW50IHNjb3JlLCBjaGFyX3UgKndvcmQsIGludCBzcGxpdCkpOwpzdGF0aWMgaW50IHJlYWRfc29mb19zZWN0aW9uIF9fQVJHUygoRklMRSAqZmQsIHNsYW5nX1QgKnNsYW5nKSk7CnN0YXRpYyBpbnQgcmVhZF9jb21wb3VuZCBfX0FSR1MoKEZJTEUgKmZkLCBzbGFuZ19UICpzbGFuZywgaW50IGxlbikpOwpzdGF0aWMgaW50IGJ5dGVfaW5fc3RyIF9fQVJHUygoY2hhcl91ICpzdHIsIGludCBieXRlKSk7CnN0YXRpYyBpbnQgaW5pdF9zeWxfdGFiIF9fQVJHUygoc2xhbmdfVCAqc2xhbmcpKTsKc3RhdGljIGludCBjb3VudF9zeWxsYWJsZXMgX19BUkdTKChzbGFuZ19UICpzbGFuZywgY2hhcl91ICp3b3JkKSk7CnN0YXRpYyBpbnQgc2V0X3NvZm8gX19BUkdTKChzbGFuZ19UICpscCwgY2hhcl91ICpmcm9tLCBjaGFyX3UgKnRvKSk7CnN0YXRpYyB2b2lkIHNldF9zYWxfZmlyc3QgX19BUkdTKChzbGFuZ19UICpscCkpOwojaWZkZWYgRkVBVF9NQllURQpzdGF0aWMgaW50ICptYl9zdHIyd2lkZSBfX0FSR1MoKGNoYXJfdSAqcykpOwojZW5kaWYKc3RhdGljIGludCBzcGVsbF9yZWFkX3RyZWUgX19BUkdTKChGSUxFICpmZCwgY2hhcl91ICoqYnl0c3AsIGlkeF9UICoqaWR4c3AsIGludCBwcmVmaXh0cmVlLCBpbnQgcHJlZml4Y250KSk7CnN0YXRpYyBpZHhfVCByZWFkX3RyZWVfbm9kZSBfX0FSR1MoKEZJTEUgKmZkLCBjaGFyX3UgKmJ5dHMsIGlkeF9UICppZHhzLCBpbnQgbWF4aWR4LCBpbnQgc3RhcnRpZHgsIGludCBwcmVmaXh0cmVlLCBpbnQgbWF4cHJlZmNvbmRucikpOwpzdGF0aWMgdm9pZCBjbGVhcl9taWR3b3JkIF9fQVJHUygoYnVmX1QgKmJ1ZikpOwpzdGF0aWMgdm9pZCB1c2VfbWlkd29yZCBfX0FSR1MoKHNsYW5nX1QgKmxwLCBidWZfVCAqYnVmKSk7CnN0YXRpYyBpbnQgZmluZF9yZWdpb24gX19BUkdTKChjaGFyX3UgKnJwLCBjaGFyX3UgKnJlZ2lvbikpOwpzdGF0aWMgaW50IGNhcHR5cGUgX19BUkdTKChjaGFyX3UgKndvcmQsIGNoYXJfdSAqZW5kKSk7CnN0YXRpYyBpbnQgYmFkd29yZF9jYXB0eXBlIF9fQVJHUygoY2hhcl91ICp3b3JkLCBjaGFyX3UgKmVuZCkpOwpzdGF0aWMgdm9pZCBzcGVsbF9yZWxvYWRfb25lIF9fQVJHUygoY2hhcl91ICpmbmFtZSwgaW50IGFkZGVkX3dvcmQpKTsKc3RhdGljIHZvaWQgc2V0X3NwZWxsX2NoYXJmbGFncyBfX0FSR1MoKGNoYXJfdSAqZmxhZ3MsIGludCBjbnQsIGNoYXJfdSAqdXBwKSk7CnN0YXRpYyBpbnQgc2V0X3NwZWxsX2NoYXJ0YWIgX19BUkdTKChjaGFyX3UgKmZvbCwgY2hhcl91ICpsb3csIGNoYXJfdSAqdXBwKSk7CnN0YXRpYyBpbnQgc3BlbGxfY2FzZWZvbGQgX19BUkdTKChjaGFyX3UgKnAsIGludCBsZW4sIGNoYXJfdSAqYnVmLCBpbnQgYnVmbGVuKSk7CnN0YXRpYyBpbnQgY2hlY2tfbmVlZF9jYXAgX19BUkdTKChsaW5lbnJfVCBsbnVtLCBjb2xucl9UIGNvbCkpOwpzdGF0aWMgdm9pZCBzcGVsbF9maW5kX3N1Z2dlc3QgX19BUkdTKChjaGFyX3UgKmJhZHB0ciwgaW50IGJhZGxlbiwgc3VnaW5mb19UICpzdSwgaW50IG1heGNvdW50LCBpbnQgYmFuYmFkd29yZCwgaW50IG5lZWRfY2FwLCBpbnQgaW50ZXJhY3RpdmUpKTsKI2lmZGVmIEZFQVRfRVZBTApzdGF0aWMgdm9pZCBzcGVsbF9zdWdnZXN0X2V4cHIgX19BUkdTKChzdWdpbmZvX1QgKnN1LCBjaGFyX3UgKmV4cHIpKTsKI2VuZGlmCnN0YXRpYyB2b2lkIHNwZWxsX3N1Z2dlc3RfZmlsZSBfX0FSR1MoKHN1Z2luZm9fVCAqc3UsIGNoYXJfdSAqZm5hbWUpKTsKc3RhdGljIHZvaWQgc3BlbGxfc3VnZ2VzdF9pbnRlcm4gX19BUkdTKChzdWdpbmZvX1QgKnN1LCBpbnQgaW50ZXJhY3RpdmUpKTsKc3RhdGljIHZvaWQgc3VnZ2VzdF9sb2FkX2ZpbGVzIF9fQVJHUygodm9pZCkpOwpzdGF0aWMgdm9pZCB0cmVlX2NvdW50X3dvcmRzIF9fQVJHUygoY2hhcl91ICpieXRzLCBpZHhfVCAqaWR4cykpOwpzdGF0aWMgdm9pZCBzcGVsbF9maW5kX2NsZWFudXAgX19BUkdTKChzdWdpbmZvX1QgKnN1KSk7CnN0YXRpYyB2b2lkIG9uZWNhcF9jb3B5IF9fQVJHUygoY2hhcl91ICp3b3JkLCBjaGFyX3UgKndjb3B5LCBpbnQgdXBwZXIpKTsKc3RhdGljIHZvaWQgYWxsY2FwX2NvcHkgX19BUkdTKChjaGFyX3UgKndvcmQsIGNoYXJfdSAqd2NvcHkpKTsKc3RhdGljIHZvaWQgc3VnZ2VzdF90cnlfc3BlY2lhbCBfX0FSR1MoKHN1Z2luZm9fVCAqc3UpKTsKc3RhdGljIHZvaWQgc3VnZ2VzdF90cnlfY2hhbmdlIF9fQVJHUygoc3VnaW5mb19UICpzdSkpOwpzdGF0aWMgdm9pZCBzdWdnZXN0X3RyaWVfd2FsayBfX0FSR1MoKHN1Z2luZm9fVCAqc3UsIGxhbmdwX1QgKmxwLCBjaGFyX3UgKmZ3b3JkLCBpbnQgc291bmRmb2xkKSk7CnN0YXRpYyB2b2lkIGdvX2RlZXBlciBfX0FSR1MoKHRyeXN0YXRlX1QgKnN0YWNrLCBpbnQgZGVwdGgsIGludCBzY29yZV9hZGQpKTsKI2lmZGVmIEZFQVRfTUJZVEUKc3RhdGljIGludCBub2ZvbGRfbGVuIF9fQVJHUygoY2hhcl91ICpmd29yZCwgaW50IGZsZW4sIGNoYXJfdSAqd29yZCkpOwojZW5kaWYKc3RhdGljIHZvaWQgZmluZF9rZWVwY2FwX3dvcmQgX19BUkdTKChzbGFuZ19UICpzbGFuZywgY2hhcl91ICpmd29yZCwgY2hhcl91ICprd29yZCkpOwpzdGF0aWMgdm9pZCBzY29yZV9jb21wX3NhbCBfX0FSR1MoKHN1Z2luZm9fVCAqc3UpKTsKc3RhdGljIHZvaWQgc2NvcmVfY29tYmluZSBfX0FSR1MoKHN1Z2luZm9fVCAqc3UpKTsKc3RhdGljIGludCBzdHBfc2FsX3Njb3JlIF9fQVJHUygoc3VnZ2VzdF9UICpzdHAsIHN1Z2luZm9fVCAqc3UsIHNsYW5nX1QgKnNsYW5nLCBjaGFyX3UgKmJhZHNvdW5kKSk7CnN0YXRpYyB2b2lkIHN1Z2dlc3RfdHJ5X3NvdW5kYWxpa2VfcHJlcCBfX0FSR1MoKHZvaWQpKTsKc3RhdGljIHZvaWQgc3VnZ2VzdF90cnlfc291bmRhbGlrZSBfX0FSR1MoKHN1Z2luZm9fVCAqc3UpKTsKc3RhdGljIHZvaWQgc3VnZ2VzdF90cnlfc291bmRhbGlrZV9maW5pc2ggX19BUkdTKCh2b2lkKSk7CnN0YXRpYyB2b2lkIGFkZF9zb3VuZF9zdWdnZXN0IF9fQVJHUygoc3VnaW5mb19UICpzdSwgY2hhcl91ICpnb29kd29yZCwgaW50IHNjb3JlLCBsYW5ncF9UICpscCkpOwpzdGF0aWMgaW50IHNvdW5kZm9sZF9maW5kIF9fQVJHUygoc2xhbmdfVCAqc2xhbmcsIGNoYXJfdSAqd29yZCkpOwpzdGF0aWMgdm9pZCBtYWtlX2Nhc2Vfd29yZCBfX0FSR1MoKGNoYXJfdSAqZndvcmQsIGNoYXJfdSAqY3dvcmQsIGludCBmbGFncykpOwpzdGF0aWMgdm9pZCBzZXRfbWFwX3N0ciBfX0FSR1MoKHNsYW5nX1QgKmxwLCBjaGFyX3UgKm1hcCkpOwpzdGF0aWMgaW50IHNpbWlsYXJfY2hhcnMgX19BUkdTKChzbGFuZ19UICpzbGFuZywgaW50IGMxLCBpbnQgYzIpKTsKc3RhdGljIHZvaWQgYWRkX3N1Z2dlc3Rpb24gX19BUkdTKChzdWdpbmZvX1QgKnN1LCBnYXJyYXlfVCAqZ2FwLCBjaGFyX3UgKmdvb2R3b3JkLCBpbnQgYmFkbGVuLCBpbnQgc2NvcmUsIGludCBhbHRzY29yZSwgaW50IGhhZF9ib251cywgc2xhbmdfVCAqc2xhbmcsIGludCBtYXhzZikpOwpzdGF0aWMgdm9pZCBjaGVja19zdWdnZXN0aW9ucyBfX0FSR1MoKHN1Z2luZm9fVCAqc3UsIGdhcnJheV9UICpnYXApKTsKc3RhdGljIHZvaWQgYWRkX2Jhbm5lZCBfX0FSR1MoKHN1Z2luZm9fVCAqc3UsIGNoYXJfdSAqd29yZCkpOwpzdGF0aWMgdm9pZCByZXNjb3JlX3N1Z2dlc3Rpb25zIF9fQVJHUygoc3VnaW5mb19UICpzdSkpOwpzdGF0aWMgdm9pZCByZXNjb3JlX29uZSBfX0FSR1MoKHN1Z2luZm9fVCAqc3UsIHN1Z2dlc3RfVCAqc3RwKSk7CnN0YXRpYyBpbnQgY2xlYW51cF9zdWdnZXN0aW9ucyBfX0FSR1MoKGdhcnJheV9UICpnYXAsIGludCBtYXhzY29yZSwgaW50IGtlZXApKTsKc3RhdGljIHZvaWQgc3BlbGxfc291bmRmb2xkIF9fQVJHUygoc2xhbmdfVCAqc2xhbmcsIGNoYXJfdSAqaW53b3JkLCBpbnQgZm9sZGVkLCBjaGFyX3UgKnJlcykpOwpzdGF0aWMgdm9pZCBzcGVsbF9zb3VuZGZvbGRfc29mbyBfX0FSR1MoKHNsYW5nX1QgKnNsYW5nLCBjaGFyX3UgKmlud29yZCwgY2hhcl91ICpyZXMpKTsKc3RhdGljIHZvaWQgc3BlbGxfc291bmRmb2xkX3NhbCBfX0FSR1MoKHNsYW5nX1QgKnNsYW5nLCBjaGFyX3UgKmlud29yZCwgY2hhcl91ICpyZXMpKTsKI2lmZGVmIEZFQVRfTUJZVEUKc3RhdGljIHZvaWQgc3BlbGxfc291bmRmb2xkX3dzYWwgX19BUkdTKChzbGFuZ19UICpzbGFuZywgY2hhcl91ICppbndvcmQsIGNoYXJfdSAqcmVzKSk7CiNlbmRpZgpzdGF0aWMgaW50IHNvdW5kYWxpa2Vfc2NvcmUgX19BUkdTKChjaGFyX3UgKmdvb2Rzb3VuZCwgY2hhcl91ICpiYWRzb3VuZCkpOwpzdGF0aWMgaW50IHNwZWxsX2VkaXRfc2NvcmUgX19BUkdTKChzbGFuZ19UICpzbGFuZywgY2hhcl91ICpiYWR3b3JkLCBjaGFyX3UgKmdvb2R3b3JkKSk7CnN0YXRpYyBpbnQgc3BlbGxfZWRpdF9zY29yZV9saW1pdCBfX0FSR1MoKHNsYW5nX1QgKnNsYW5nLCBjaGFyX3UgKmJhZHdvcmQsIGNoYXJfdSAqZ29vZHdvcmQsIGludCBsaW1pdCkpOwojaWZkZWYgRkVBVF9NQllURQpzdGF0aWMgaW50IHNwZWxsX2VkaXRfc2NvcmVfbGltaXRfdyBfX0FSR1MoKHNsYW5nX1QgKnNsYW5nLCBjaGFyX3UgKmJhZHdvcmQsIGNoYXJfdSAqZ29vZHdvcmQsIGludCBsaW1pdCkpOwojZW5kaWYKc3RhdGljIHZvaWQgZHVtcF93b3JkIF9fQVJHUygoc2xhbmdfVCAqc2xhbmcsIGNoYXJfdSAqd29yZCwgY2hhcl91ICpwYXQsIGludCAqZGlyLCBpbnQgcm91bmQsIGludCBmbGFncywgbGluZW5yX1QgbG51bSkpOwpzdGF0aWMgbGluZW5yX1QgZHVtcF9wcmVmaXhlcyBfX0FSR1MoKHNsYW5nX1QgKnNsYW5nLCBjaGFyX3UgKndvcmQsIGNoYXJfdSAqcGF0LCBpbnQgKmRpciwgaW50IHJvdW5kLCBpbnQgZmxhZ3MsIGxpbmVucl9UIHN0YXJ0bG51bSkpOwpzdGF0aWMgYnVmX1QgKm9wZW5fc3BlbGxidWYgX19BUkdTKCh2b2lkKSk7CnN0YXRpYyB2b2lkIGNsb3NlX3NwZWxsYnVmIF9fQVJHUygoYnVmX1QgKmJ1ZikpOwoKLyoKICogVXNlIG91ciBvd24gY2hhcmFjdGVyLWNhc2UgZGVmaW5pdGlvbnMsIGJlY2F1c2UgdGhlIGN1cnJlbnQgbG9jYWxlIG1heQogKiBkaWZmZXIgZnJvbSB3aGF0IHRoZSAuc3BsIGZpbGUgdXNlcy4KICogVGhlc2UgbXVzdCBub3QgYmUgY2FsbGVkIHdpdGggbmVnYXRpdmUgbnVtYmVyIQogKi8KI2lmbmRlZiBGRUFUX01CWVRFCi8qIE5vbi1tdWx0aS1ieXRlIGltcGxlbWVudGF0aW9uLiAqLwojIGRlZmluZSBTUEVMTF9UT0ZPTEQoYykgKChjKSA8IDI1NiA/IHNwZWxsdGFiLnN0X2ZvbGRbY10gOiAoYykpCiMgZGVmaW5lIFNQRUxMX1RPVVBQRVIoYykgKChjKSA8IDI1NiA/IHNwZWxsdGFiLnN0X3VwcGVyW2NdIDogKGMpKQojIGRlZmluZSBTUEVMTF9JU1VQUEVSKGMpICgoYykgPCAyNTYgPyBzcGVsbHRhYi5zdF9pc3VbY10gOiBGQUxTRSkKI2Vsc2UKIyBpZiBkZWZpbmVkKEhBVkVfV0NIQVJfSCkKIyAgaW5jbHVkZSA8d2NoYXIuaD4JICAgIC8qIGZvciB0b3d1cHBlcigpIGFuZCB0b3dsb3dlcigpICovCiMgZW5kaWYKLyogTXVsdGktYnl0ZSBpbXBsZW1lbnRhdGlvbi4gIEZvciBVbmljb2RlIHdlIGNhbiBjYWxsIHV0Zl8qKCksIGJ1dCBkb24ndCBkbwogKiB0aGF0IGZvciBBU0NJSSwgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHVzZSAnY2FzZW1hcCcgaGVyZS4gIE90aGVyd2lzZSB1c2UKICogdGhlICJ3IiBsaWJyYXJ5IGZ1bmN0aW9uIGZvciBjaGFyYWN0ZXJzIGFib3ZlIDI1NSBpZiBhdmFpbGFibGUuICovCiMgaWZkZWYgSEFWRV9UT1dMT1dFUgojICBkZWZpbmUgU1BFTExfVE9GT0xEKGMpIChlbmNfdXRmOCAmJiAoYykgPj0gMTI4ID8gdXRmX2ZvbGQoYykgXAoJICAgIDogKGMpIDwgMjU2ID8gc3BlbGx0YWIuc3RfZm9sZFtjXSA6IHRvd2xvd2VyKGMpKQojIGVsc2UKIyAgZGVmaW5lIFNQRUxMX1RPRk9MRChjKSAoZW5jX3V0ZjggJiYgKGMpID49IDEyOCA/IHV0Zl9mb2xkKGMpIFwKCSAgICA6IChjKSA8IDI1NiA/IHNwZWxsdGFiLnN0X2ZvbGRbY10gOiAoYykpCiMgZW5kaWYKCiMgaWZkZWYgSEFWRV9UT1dVUFBFUgojICBkZWZpbmUgU1BFTExfVE9VUFBFUihjKSAoZW5jX3V0ZjggJiYgKGMpID49IDEyOCA/IHV0Zl90b3VwcGVyKGMpIFwKCSAgICA6IChjKSA8IDI1NiA/IHNwZWxsdGFiLnN0X3VwcGVyW2NdIDogdG93dXBwZXIoYykpCiMgZWxzZQojICBkZWZpbmUgU1BFTExfVE9VUFBFUihjKSAoZW5jX3V0ZjggJiYgKGMpID49IDEyOCA/IHV0Zl90b3VwcGVyKGMpIFwKCSAgICA6IChjKSA8IDI1NiA/IHNwZWxsdGFiLnN0X3VwcGVyW2NdIDogKGMpKQojIGVuZGlmCgojIGlmZGVmIEhBVkVfSVNXVVBQRVIKIyAgZGVmaW5lIFNQRUxMX0lTVVBQRVIoYykgKGVuY191dGY4ICYmIChjKSA+PSAxMjggPyB1dGZfaXN1cHBlcihjKSBcCgkgICAgOiAoYykgPCAyNTYgPyBzcGVsbHRhYi5zdF9pc3VbY10gOiBpc3d1cHBlcihjKSkKIyBlbHNlCiMgIGRlZmluZSBTUEVMTF9JU1VQUEVSKGMpIChlbmNfdXRmOCAmJiAoYykgPj0gMTI4ID8gdXRmX2lzdXBwZXIoYykgXAoJICAgIDogKGMpIDwgMjU2ID8gc3BlbGx0YWIuc3RfaXN1W2NdIDogKEZBTFNFKSkKIyBlbmRpZgojZW5kaWYKCgpzdGF0aWMgY2hhciAqZV9mb3JtYXQgPSBOXygiRTc1OTogRm9ybWF0IGVycm9yIGluIHNwZWxsIGZpbGUiKTsKc3RhdGljIGNoYXIgKmVfc3BlbGxfdHJ1bmMgPSBOXygiRTc1ODogVHJ1bmNhdGVkIHNwZWxsIGZpbGUiKTsKc3RhdGljIGNoYXIgKmVfYWZmdHJhaWxpbmcgPSBOXygiVHJhaWxpbmcgdGV4dCBpbiAlcyBsaW5lICVkOiAlcyIpOwpzdGF0aWMgY2hhciAqZV9hZmZuYW1lID0gTl8oIkFmZml4IG5hbWUgdG9vIGxvbmcgaW4gJXMgbGluZSAlZDogJXMiKTsKc3RhdGljIGNoYXIgKmVfYWZmZm9ybSA9IE5fKCJFNzYxOiBGb3JtYXQgZXJyb3IgaW4gYWZmaXggZmlsZSBGT0wsIExPVyBvciBVUFAiKTsKc3RhdGljIGNoYXIgKmVfYWZmcmFuZ2UgPSBOXygiRTc2MjogQ2hhcmFjdGVyIGluIEZPTCwgTE9XIG9yIFVQUCBpcyBvdXQgb2YgcmFuZ2UiKTsKc3RhdGljIGNoYXIgKm1zZ19jb21wcmVzc2luZyA9IE5fKCJDb21wcmVzc2luZyB3b3JkIHRyZWUuLi4iKTsKCi8qIFJlbWVtYmVyIHdoYXQgIno/IiByZXBsYWNlZC4gKi8Kc3RhdGljIGNoYXJfdQkqcmVwbF9mcm9tID0gTlVMTDsKc3RhdGljIGNoYXJfdQkqcmVwbF90byA9IE5VTEw7CgovKgogKiBNYWluIHNwZWxsLWNoZWNraW5nIGZ1bmN0aW9uLgogKiAicHRyIiBwb2ludHMgdG8gYSBjaGFyYWN0ZXIgdGhhdCBjb3VsZCBiZSB0aGUgc3RhcnQgb2YgYSB3b3JkLgogKiAiKmF0dHJwIiBpcyBzZXQgdG8gdGhlIGhpZ2hsaWdodCBpbmRleCBmb3IgYSBiYWRseSBzcGVsbGVkIHdvcmQuICBGb3IgYQogKiBub24td29yZCBvciB3aGVuIGl0J3MgT0sgaXQgcmVtYWlucyB1bmNoYW5nZWQuCiAqIFRoaXMgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aGVuICdzcGVsbGxhbmcnIGlzIG5vdCBlbXB0eS4KICoKICogImNhcGNvbCIgaXMgdXNlZCB0byBjaGVjayBmb3IgYSBDYXBpdGFsaXNlZCB3b3JkIGFmdGVyIHRoZSBlbmQgb2YgYQogKiBzZW50ZW5jZS4gIElmIGl0J3MgemVybyB0aGVuIHBlcmZvcm0gdGhlIGNoZWNrLiAgUmV0dXJuIHRoZSBjb2x1bW4gd2hlcmUgdG8KICogY2hlY2sgbmV4dCwgb3IgLTEgd2hlbiBubyBzZW50ZW5jZSBlbmQgd2FzIGZvdW5kLiAgSWYgaXQncyBOVUxMIHRoZW4gZG9uJ3QKICogd29ycnkuCiAqCiAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgd29yZCBpbiBieXRlcywgYWxzbyB3aGVuIGl0J3MgT0ssIHNvIHRoYXQgdGhlCiAqIGNhbGxlciBjYW4gc2tpcCBvdmVyIHRoZSB3b3JkLgogKi8KICAgIGludApzcGVsbF9jaGVjayh3cCwgcHRyLCBhdHRycCwgY2FwY29sLCBkb2NvdW50KQogICAgd2luX1QJKndwOwkJLyogY3VycmVudCB3aW5kb3cgKi8KICAgIGNoYXJfdQkqcHRyOwogICAgaGxmX1QJKmF0dHJwOwogICAgaW50CQkqY2FwY29sOwkvKiBjb2x1bW4gdG8gY2hlY2sgZm9yIENhcGl0YWwgKi8KICAgIGludAkJZG9jb3VudDsJLyogY291bnQgZ29vZCB3b3JkcyAqLwp7CiAgICBtYXRjaGluZl9UCW1pOwkJLyogTW9zdCB0aGluZ3MgYXJlIHB1dCBpbiAibWkiIHNvIHRoYXQgaXQgY2FuCgkJCQkgICBiZSBwYXNzZWQgdG8gZnVuY3Rpb25zIHF1aWNrbHkuICovCiAgICBpbnQJCW5ybGVuID0gMDsJLyogZm91bmQgYSBudW1iZXIgZmlyc3QgKi8KICAgIGludAkJYzsKICAgIGludAkJd3JvbmdjYXBsZW4gPSAwOwogICAgaW50CQlscGk7CiAgICBpbnQJCWNvdW50X3dvcmQgPSBkb2NvdW50OwoKICAgIC8qIEEgd29yZCBuZXZlciBzdGFydHMgYXQgYSBzcGFjZSBvciBhIGNvbnRyb2wgY2hhcmFjdGVyLiAgUmV0dXJuIHF1aWNrbHkKICAgICAqIHRoZW4sIHNraXBwaW5nIG92ZXIgdGhlIGNoYXJhY3Rlci4gKi8KICAgIGlmICgqcHRyIDw9ICcgJykKCXJldHVybiAxOwoKICAgIC8qIFJldHVybiBoZXJlIHdoZW4gbG9hZGluZyBsYW5ndWFnZSBmaWxlcyBmYWlsZWQuICovCiAgICBpZiAod3AtPndfYnVmZmVyLT5iX2xhbmdwLmdhX2xlbiA9PSAwKQoJcmV0dXJuIDE7CgogICAgdmltX21lbXNldCgmbWksIDAsIHNpemVvZihtYXRjaGluZl9UKSk7CgogICAgLyogQSBudW1iZXIgaXMgYWx3YXlzIE9LLiAgQWxzbyBza2lwIGhleGFkZWNpbWFsIG51bWJlcnMgMHhGRjk5IGFuZAogICAgICogMFg5OUZGLiAgQnV0IGFsd2F5cyBkbyBjaGVjayBzcGVsbGluZyB0byBmaW5kICIzR1BQIiBhbmQgIjExCiAgICAgKiBqdWxpZmVlc3QiLiAqLwogICAgaWYgKCpwdHIgPj0gJzAnICYmICpwdHIgPD0gJzknKQogICAgewoJaWYgKCpwdHIgPT0gJzAnICYmIChwdHJbMV0gPT0gJ3gnIHx8IHB0clsxXSA9PSAnWCcpKQoJICAgIG1pLm1pX2VuZCA9IHNraXBoZXgocHRyICsgMik7CgllbHNlCgkgICAgbWkubWlfZW5kID0gc2tpcGRpZ2l0cyhwdHIpOwoJbnJsZW4gPSBtaS5taV9lbmQgLSBwdHI7CiAgICB9CgogICAgLyogRmluZCB0aGUgbm9ybWFsIGVuZCBvZiB0aGUgd29yZCAodW50aWwgdGhlIG5leHQgbm9uLXdvcmQgY2hhcmFjdGVyKS4gKi8KICAgIG1pLm1pX3dvcmQgPSBwdHI7CiAgICBtaS5taV9mZW5kID0gcHRyOwogICAgaWYgKHNwZWxsX2lzd29yZHAobWkubWlfZmVuZCwgd3AtPndfYnVmZmVyKSkKICAgIHsKCWRvCgl7CgkgICAgbWJfcHRyX2FkdihtaS5taV9mZW5kKTsKCX0gd2hpbGUgKCptaS5taV9mZW5kICE9IE5VTCAmJiBzcGVsbF9pc3dvcmRwKG1pLm1pX2ZlbmQsIHdwLT53X2J1ZmZlcikpOwoKCWlmIChjYXBjb2wgIT0gTlVMTCAmJiAqY2FwY29sID09IDAgJiYgd3AtPndfYnVmZmVyLT5iX2NhcF9wcm9nICE9IE5VTEwpCgl7CgkgICAgLyogQ2hlY2sgd29yZCBzdGFydGluZyB3aXRoIGNhcGl0YWwgbGV0dGVyLiAqLwoJICAgIGMgPSBQVFIyQ0hBUihwdHIpOwoJICAgIGlmICghU1BFTExfSVNVUFBFUihjKSkKCQl3cm9uZ2NhcGxlbiA9IChpbnQpKG1pLm1pX2ZlbmQgLSBwdHIpOwoJfQogICAgfQogICAgaWYgKGNhcGNvbCAhPSBOVUxMKQoJKmNhcGNvbCA9IC0xOwoKICAgIC8qIFdlIGFsd2F5cyB1c2UgdGhlIGNoYXJhY3RlcnMgdXAgdG8gdGhlIG5leHQgbm9uLXdvcmQgY2hhcmFjdGVyLAogICAgICogYWxzbyBmb3IgYmFkIHdvcmRzLiAqLwogICAgbWkubWlfZW5kID0gbWkubWlfZmVuZDsKCiAgICAvKiBDaGVjayBjYXBzIHR5cGUgbGF0ZXIuICovCiAgICBtaS5taV9idWYgPSB3cC0+d19idWZmZXI7CgogICAgLyogY2FzZS1mb2xkIHRoZSB3b3JkIHdpdGggb25lIG5vbi13b3JkIGNoYXJhY3Rlciwgc28gdGhhdCB3ZSBjYW4gY2hlY2sKICAgICAqIGZvciB0aGUgd29yZCBlbmQuICovCiAgICBpZiAoKm1pLm1pX2ZlbmQgIT0gTlVMKQoJbWJfcHRyX2FkdihtaS5taV9mZW5kKTsKCiAgICAodm9pZClzcGVsbF9jYXNlZm9sZChwdHIsIChpbnQpKG1pLm1pX2ZlbmQgLSBwdHIpLCBtaS5taV9md29yZCwKCQkJCQkJCSAgICAgTUFYV0xFTiArIDEpOwogICAgbWkubWlfZndvcmRsZW4gPSBTVFJMRU4obWkubWlfZndvcmQpOwoKICAgIC8qIFRoZSB3b3JkIGlzIGJhZCB1bmxlc3Mgd2UgcmVjb2duaXplIGl0LiAqLwogICAgbWkubWlfcmVzdWx0ID0gU1BfQkFEOwogICAgbWkubWlfcmVzdWx0MiA9IFNQX0JBRDsKCiAgICAvKgogICAgICogTG9vcCBvdmVyIHRoZSBsYW5ndWFnZXMgc3BlY2lmaWVkIGluICdzcGVsbGxhbmcnLgogICAgICogV2UgY2hlY2sgdGhlbSBhbGwsIGJlY2F1c2UgYSB3b3JkIG1heSBiZSBtYXRjaGVkIGxvbmdlciBpbiBhbm90aGVyCiAgICAgKiBsYW5ndWFnZS4KICAgICAqLwogICAgZm9yIChscGkgPSAwOyBscGkgPCB3cC0+d19idWZmZXItPmJfbGFuZ3AuZ2FfbGVuOyArK2xwaSkKICAgIHsKCW1pLm1pX2xwID0gTEFOR1BfRU5UUlkod3AtPndfYnVmZmVyLT5iX2xhbmdwLCBscGkpOwoKCS8qIElmIHJlbG9hZGluZyBmYWlscyB0aGUgbGFuZ3VhZ2UgaXMgc3RpbGwgaW4gdGhlIGxpc3QgYnV0IGV2ZXJ5dGhpbmcKCSAqIGhhcyBiZWVuIGNsZWFyZWQuICovCglpZiAobWkubWlfbHAtPmxwX3NsYW5nLT5zbF9maWR4cyA9PSBOVUxMKQoJICAgIGNvbnRpbnVlOwoKCS8qIENoZWNrIGZvciBhIG1hdGNoaW5nIHdvcmQgaW4gY2FzZS1mb2xkZWQgd29yZHMuICovCglmaW5kX3dvcmQoJm1pLCBGSU5EX0ZPTERXT1JEKTsKCgkvKiBDaGVjayBmb3IgYSBtYXRjaGluZyB3b3JkIGluIGtlZXAtY2FzZSB3b3Jkcy4gKi8KCWZpbmRfd29yZCgmbWksIEZJTkRfS0VFUFdPUkQpOwoKCS8qIENoZWNrIGZvciBtYXRjaGluZyBwcmVmaXhlcy4gKi8KCWZpbmRfcHJlZml4KCZtaSwgRklORF9GT0xEV09SRCk7CgoJLyogRm9yIGEgTk9CUkVBSyBsYW5ndWFnZSwgbWF5IHdhbnQgdG8gdXNlIGEgd29yZCB3aXRob3V0IGEgZm9sbG93aW5nCgkgKiB3b3JkIGFzIGEgYmFja3VwLiAqLwoJaWYgKG1pLm1pX2xwLT5scF9zbGFuZy0+c2xfbm9icmVhayAmJiBtaS5taV9yZXN1bHQgPT0gU1BfQkFECgkJCQkJCSAgICYmIG1pLm1pX3Jlc3VsdDIgIT0gU1BfQkFEKQoJewoJICAgIG1pLm1pX3Jlc3VsdCA9IG1pLm1pX3Jlc3VsdDI7CgkgICAgbWkubWlfZW5kID0gbWkubWlfZW5kMjsKCX0KCgkvKiBDb3VudCB0aGUgd29yZCBpbiB0aGUgZmlyc3QgbGFuZ3VhZ2Ugd2hlcmUgaXQncyBmb3VuZCB0byBiZSBPSy4gKi8KCWlmIChjb3VudF93b3JkICYmIG1pLm1pX3Jlc3VsdCA9PSBTUF9PSykKCXsKCSAgICBjb3VudF9jb21tb25fd29yZChtaS5taV9scC0+bHBfc2xhbmcsIHB0ciwKCQkJCQkJICAgKGludCkobWkubWlfZW5kIC0gcHRyKSwgMSk7CgkgICAgY291bnRfd29yZCA9IEZBTFNFOwoJfQogICAgfQoKICAgIGlmIChtaS5taV9yZXN1bHQgIT0gU1BfT0spCiAgICB7CgkvKiBJZiB3ZSBmb3VuZCBhIG51bWJlciBza2lwIG92ZXIgaXQuICBBbGxvd3MgZm9yICI0Mm5kIi4gIERvIGZsYWcKCSAqIHJhcmUgYW5kIGxvY2FsIHdvcmRzLCBlLmcuLCAiM0dQUCIuICovCglpZiAobnJsZW4gPiAwKQoJewoJICAgIGlmIChtaS5taV9yZXN1bHQgPT0gU1BfQkFEIHx8IG1pLm1pX3Jlc3VsdCA9PSBTUF9CQU5ORUQpCgkJcmV0dXJuIG5ybGVuOwoJfQoKCS8qIFdoZW4gd2UgYXJlIGF0IGEgbm9uLXdvcmQgY2hhcmFjdGVyIHRoZXJlIGlzIG5vIGVycm9yLCBqdXN0CgkgKiBza2lwIG92ZXIgdGhlIGNoYXJhY3RlciAodHJ5IGxvb2tpbmcgZm9yIGEgd29yZCBhZnRlciBpdCkuICovCgllbHNlIGlmICghc3BlbGxfaXN3b3JkcF9ubXcocHRyKSkKCXsKCSAgICBpZiAoY2FwY29sICE9IE5VTEwgJiYgd3AtPndfYnVmZmVyLT5iX2NhcF9wcm9nICE9IE5VTEwpCgkgICAgewoJCXJlZ21hdGNoX1QJcmVnbWF0Y2g7CgoJCS8qIENoZWNrIGZvciBlbmQgb2Ygc2VudGVuY2UuICovCgkJcmVnbWF0Y2gucmVncHJvZyA9IHdwLT53X2J1ZmZlci0+Yl9jYXBfcHJvZzsKCQlyZWdtYXRjaC5ybV9pYyA9IEZBTFNFOwoJCWlmICh2aW1fcmVnZXhlYygmcmVnbWF0Y2gsIHB0ciwgMCkpCgkJICAgICpjYXBjb2wgPSAoaW50KShyZWdtYXRjaC5lbmRwWzBdIC0gcHRyKTsKCSAgICB9CgojaWZkZWYgRkVBVF9NQllURQoJICAgIGlmIChoYXNfbWJ5dGUpCgkJcmV0dXJuICgqbWJfcHRyMmxlbikocHRyKTsKI2VuZGlmCgkgICAgcmV0dXJuIDE7Cgl9CgllbHNlIGlmIChtaS5taV9lbmQgPT0gcHRyKQoJICAgIC8qIEFsd2F5cyBpbmNsdWRlIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIuICBSZXF1aXJlZCBmb3Igd2hlbiB0aGVyZQoJICAgICAqIGlzIGEgbWl4dXAgaW4gIm1pZHdvcmQiLiAqLwoJICAgIG1iX3B0cl9hZHYobWkubWlfZW5kKTsKCWVsc2UgaWYgKG1pLm1pX3Jlc3VsdCA9PSBTUF9CQUQKCQkmJiBMQU5HUF9FTlRSWSh3cC0+d19idWZmZXItPmJfbGFuZ3AsIDApLT5scF9zbGFuZy0+c2xfbm9icmVhaykKCXsKCSAgICBjaGFyX3UJKnAsICpmcDsKCSAgICBpbnQJCXNhdmVfcmVzdWx0ID0gbWkubWlfcmVzdWx0OwoKCSAgICAvKiBGaXJzdCBsYW5ndWFnZSBpbiAnc3BlbGxsYW5nJyBpcyBOT0JSRUFLLiAgRmluZCBmaXJzdCBwb3NpdGlvbgoJICAgICAqIGF0IHdoaWNoIGFueSB3b3JkIHdvdWxkIGJlIHZhbGlkLiAqLwoJICAgIG1pLm1pX2xwID0gTEFOR1BfRU5UUlkod3AtPndfYnVmZmVyLT5iX2xhbmdwLCAwKTsKCSAgICBpZiAobWkubWlfbHAtPmxwX3NsYW5nLT5zbF9maWR4cyAhPSBOVUxMKQoJICAgIHsKCQlwID0gbWkubWlfd29yZDsKCQlmcCA9IG1pLm1pX2Z3b3JkOwoJCWZvciAoOzspCgkJewoJCSAgICBtYl9wdHJfYWR2KHApOwoJCSAgICBtYl9wdHJfYWR2KGZwKTsKCQkgICAgaWYgKHAgPj0gbWkubWlfZW5kKQoJCQlicmVhazsKCQkgICAgbWkubWlfY29tcG9mZiA9IGZwIC0gbWkubWlfZndvcmQ7CgkJICAgIGZpbmRfd29yZCgmbWksIEZJTkRfQ09NUE9VTkQpOwoJCSAgICBpZiAobWkubWlfcmVzdWx0ICE9IFNQX0JBRCkKCQkgICAgewoJCQltaS5taV9lbmQgPSBwOwoJCQlicmVhazsKCQkgICAgfQoJCX0KCQltaS5taV9yZXN1bHQgPSBzYXZlX3Jlc3VsdDsKCSAgICB9Cgl9CgoJaWYgKG1pLm1pX3Jlc3VsdCA9PSBTUF9CQUQgfHwgbWkubWlfcmVzdWx0ID09IFNQX0JBTk5FRCkKCSAgICAqYXR0cnAgPSBITEZfU1BCOwoJZWxzZSBpZiAobWkubWlfcmVzdWx0ID09IFNQX1JBUkUpCgkgICAgKmF0dHJwID0gSExGX1NQUjsKCWVsc2UKCSAgICAqYXR0cnAgPSBITEZfU1BMOwogICAgfQoKICAgIGlmICh3cm9uZ2NhcGxlbiA+IDAgJiYgKG1pLm1pX3Jlc3VsdCA9PSBTUF9PSyB8fCBtaS5taV9yZXN1bHQgPT0gU1BfUkFSRSkpCiAgICB7CgkvKiBSZXBvcnQgU3BlbGxDYXAgb25seSB3aGVuIHRoZSB3b3JkIGlzbid0IGJhZGx5IHNwZWxsZWQuICovCgkqYXR0cnAgPSBITEZfU1BDOwoJcmV0dXJuIHdyb25nY2FwbGVuOwogICAgfQoKICAgIHJldHVybiAoaW50KShtaS5taV9lbmQgLSBwdHIpOwp9CgovKgogKiBDaGVjayBpZiB0aGUgd29yZCBhdCAibWlwLT5taV93b3JkIiBpcyBpbiB0aGUgdHJlZS4KICogV2hlbiAibW9kZSIgaXMgRklORF9GT0xEV09SRCBjaGVjayBpbiBmb2xkLWNhc2Ugd29yZCB0cmVlLgogKiBXaGVuICJtb2RlIiBpcyBGSU5EX0tFRVBXT1JEIGNoZWNrIGluIGtlZXAtY2FzZSB3b3JkIHRyZWUuCiAqIFdoZW4gIm1vZGUiIGlzIEZJTkRfUFJFRklYIGNoZWNrIGZvciB3b3JkIGFmdGVyIHByZWZpeCBpbiBmb2xkLWNhc2Ugd29yZAogKiB0cmVlLgogKgogKiBGb3IgYSBtYXRjaCBtaXAtPm1pX3Jlc3VsdCBpcyB1cGRhdGVkLgogKi8KICAgIHN0YXRpYyB2b2lkCmZpbmRfd29yZChtaXAsIG1vZGUpCiAgICBtYXRjaGluZl9UCSptaXA7CiAgICBpbnQJCW1vZGU7CnsKICAgIGlkeF9UCWFycmlkeCA9IDA7CiAgICBpbnQJCWVuZGxlbltNQVhXTEVOXTsgICAgLyogbGVuZ3RoIGF0IHBvc3NpYmxlIHdvcmQgZW5kaW5ncyAqLwogICAgaWR4X1QJZW5kaWR4W01BWFdMRU5dOyAgICAvKiBwb3NzaWJsZSB3b3JkIGVuZGluZ3MgKi8KICAgIGludAkJZW5kaWR4Y250ID0gMDsKICAgIGludAkJbGVuOwogICAgaW50CQl3bGVuID0gMDsKICAgIGludAkJZmxlbjsKICAgIGludAkJYzsKICAgIGNoYXJfdQkqcHRyOwogICAgaWR4X1QJbG8sIGhpLCBtOwojaWZkZWYgRkVBVF9NQllURQogICAgY2hhcl91CSpzOwojZW5kaWYKICAgIGNoYXJfdQkqcDsKICAgIGludAkJcmVzID0gU1BfQkFEOwogICAgc2xhbmdfVAkqc2xhbmcgPSBtaXAtPm1pX2xwLT5scF9zbGFuZzsKICAgIHVuc2lnbmVkCWZsYWdzOwogICAgY2hhcl91CSpieXRzOwogICAgaWR4X1QJKmlkeHM7CiAgICBpbnQJCXdvcmRfZW5kczsKICAgIGludAkJcHJlZml4X2ZvdW5kOwogICAgaW50CQlub2JyZWFrX3Jlc3VsdDsKCiAgICBpZiAobW9kZSA9PSBGSU5EX0tFRVBXT1JEIHx8IG1vZGUgPT0gRklORF9LRUVQQ09NUE9VTkQpCiAgICB7CgkvKiBDaGVjayBmb3Igd29yZCB3aXRoIG1hdGNoaW5nIGNhc2UgaW4ga2VlcC1jYXNlIHRyZWUuICovCglwdHIgPSBtaXAtPm1pX3dvcmQ7CglmbGVuID0gOTk5OTsJCSAgICAvKiBubyBjYXNlIGZvbGRpbmcsIGFsd2F5cyBlbm91Z2ggYnl0ZXMgKi8KCWJ5dHMgPSBzbGFuZy0+c2xfa2J5dHM7CglpZHhzID0gc2xhbmctPnNsX2tpZHhzOwoKCWlmIChtb2RlID09IEZJTkRfS0VFUENPTVBPVU5EKQoJICAgIC8qIFNraXAgb3ZlciB0aGUgcHJldmlvdXNseSBmb3VuZCB3b3JkKHMpLiAqLwoJICAgIHdsZW4gKz0gbWlwLT5taV9jb21wb2ZmOwogICAgfQogICAgZWxzZQogICAgewoJLyogQ2hlY2sgZm9yIGNhc2UtZm9sZGVkIGluIGNhc2UtZm9sZGVkIHRyZWUuICovCglwdHIgPSBtaXAtPm1pX2Z3b3JkOwoJZmxlbiA9IG1pcC0+bWlfZndvcmRsZW47ICAgIC8qIGF2YWlsYWJsZSBjYXNlLWZvbGRlZCBieXRlcyAqLwoJYnl0cyA9IHNsYW5nLT5zbF9mYnl0czsKCWlkeHMgPSBzbGFuZy0+c2xfZmlkeHM7CgoJaWYgKG1vZGUgPT0gRklORF9QUkVGSVgpCgl7CgkgICAgLyogU2tpcCBvdmVyIHRoZSBwcmVmaXguICovCgkgICAgd2xlbiA9IG1pcC0+bWlfcHJlZml4bGVuOwoJICAgIGZsZW4gLT0gbWlwLT5taV9wcmVmaXhsZW47Cgl9CgllbHNlIGlmIChtb2RlID09IEZJTkRfQ09NUE9VTkQpCgl7CgkgICAgLyogU2tpcCBvdmVyIHRoZSBwcmV2aW91c2x5IGZvdW5kIHdvcmQocykuICovCgkgICAgd2xlbiA9IG1pcC0+bWlfY29tcG9mZjsKCSAgICBmbGVuIC09IG1pcC0+bWlfY29tcG9mZjsKCX0KCiAgICB9CgogICAgaWYgKGJ5dHMgPT0gTlVMTCkKCXJldHVybjsJCQkvKiBhcnJheSBpcyBlbXB0eSAqLwoKICAgIC8qCiAgICAgKiBSZXBlYXQgYWR2YW5jaW5nIGluIHRoZSB0cmVlIHVudGlsOgogICAgICogLSB0aGVyZSBpcyBhIGJ5dGUgdGhhdCBkb2Vzbid0IG1hdGNoLAogICAgICogLSB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSB0cmVlLAogICAgICogLSBvciB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSBsaW5lLgogICAgICovCiAgICBmb3IgKDs7KQogICAgewoJaWYgKGZsZW4gPD0gMCAmJiAqbWlwLT5taV9mZW5kICE9IE5VTCkKCSAgICBmbGVuID0gZm9sZF9tb3JlKG1pcCk7CgoJbGVuID0gYnl0c1thcnJpZHgrK107CgoJLyogSWYgdGhlIGZpcnN0IHBvc3NpYmxlIGJ5dGUgaXMgYSB6ZXJvIHRoZSB3b3JkIGNvdWxkIGVuZCBoZXJlLgoJICogUmVtZW1iZXIgdGhpcyBpbmRleCwgd2UgZmlyc3QgY2hlY2sgZm9yIHRoZSBsb25nZXN0IHdvcmQuICovCglpZiAoYnl0c1thcnJpZHhdID09IDApCgl7CgkgICAgaWYgKGVuZGlkeGNudCA9PSBNQVhXTEVOKQoJICAgIHsKCQkvKiBNdXN0IGJlIGEgY29ycnVwdGVkIHNwZWxsIGZpbGUuICovCgkJRU1TRyhfKGVfZm9ybWF0KSk7CgkJcmV0dXJuOwoJICAgIH0KCSAgICBlbmRsZW5bZW5kaWR4Y250XSA9IHdsZW47CgkgICAgZW5kaWR4W2VuZGlkeGNudCsrXSA9IGFycmlkeCsrOwoJICAgIC0tbGVuOwoKCSAgICAvKiBTa2lwIG92ZXIgdGhlIHplcm9zLCB0aGVyZSBjYW4gYmUgc2V2ZXJhbCBmbGFnL3JlZ2lvbgoJICAgICAqIGNvbWJpbmF0aW9ucy4gKi8KCSAgICB3aGlsZSAobGVuID4gMCAmJiBieXRzW2FycmlkeF0gPT0gMCkKCSAgICB7CgkJKythcnJpZHg7CgkJLS1sZW47CgkgICAgfQoJICAgIGlmIChsZW4gPT0gMCkKCQlicmVhazsJICAgIC8qIG5vIGNoaWxkcmVuLCB3b3JkIG11c3QgZW5kIGhlcmUgKi8KCX0KCgkvKiBTdG9wIGxvb2tpbmcgYXQgZW5kIG9mIHRoZSBsaW5lLiAqLwoJaWYgKHB0clt3bGVuXSA9PSBOVUwpCgkgICAgYnJlYWs7CgoJLyogUGVyZm9ybSBhIGJpbmFyeSBzZWFyY2ggaW4gdGhlIGxpc3Qgb2YgYWNjZXB0ZWQgYnl0ZXMuICovCgljID0gcHRyW3dsZW5dOwoJaWYgKGMgPT0gVEFCKQkgICAgLyogPFRhYj4gaXMgaGFuZGxlZCBsaWtlIDxTcGFjZT4gKi8KCSAgICBjID0gJyAnOwoJbG8gPSBhcnJpZHg7CgloaSA9IGFycmlkeCArIGxlbiAtIDE7Cgl3aGlsZSAobG8gPCBoaSkKCXsKCSAgICBtID0gKGxvICsgaGkpIC8gMjsKCSAgICBpZiAoYnl0c1ttXSA+IGMpCgkJaGkgPSBtIC0gMTsKCSAgICBlbHNlIGlmIChieXRzW21dIDwgYykKCQlsbyA9IG0gKyAxOwoJICAgIGVsc2UKCSAgICB7CgkJbG8gPSBoaSA9IG07CgkJYnJlYWs7CgkgICAgfQoJfQoKCS8qIFN0b3AgaWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgYnl0ZS4gKi8KCWlmIChoaSA8IGxvIHx8IGJ5dHNbbG9dICE9IGMpCgkgICAgYnJlYWs7CgoJLyogQ29udGludWUgYXQgdGhlIGNoaWxkIChpZiB0aGVyZSBpcyBvbmUpLiAqLwoJYXJyaWR4ID0gaWR4c1tsb107CgkrK3dsZW47CgktLWZsZW47CgoJLyogT25lIHNwYWNlIGluIHRoZSBnb29kIHdvcmQgbWF5IHN0YW5kIGZvciBzZXZlcmFsIHNwYWNlcyBpbiB0aGUKCSAqIGNoZWNrZWQgd29yZC4gKi8KCWlmIChjID09ICcgJykKCXsKCSAgICBmb3IgKDs7KQoJICAgIHsKCQlpZiAoZmxlbiA8PSAwICYmICptaXAtPm1pX2ZlbmQgIT0gTlVMKQoJCSAgICBmbGVuID0gZm9sZF9tb3JlKG1pcCk7CgkJaWYgKHB0clt3bGVuXSAhPSAnICcgJiYgcHRyW3dsZW5dICE9IFRBQikKCQkgICAgYnJlYWs7CgkJKyt3bGVuOwoJCS0tZmxlbjsKCSAgICB9Cgl9CiAgICB9CgogICAgLyoKICAgICAqIFZlcmlmeSB0aGF0IG9uZSBvZiB0aGUgcG9zc2libGUgZW5kaW5ncyBpcyB2YWxpZC4gIFRyeSB0aGUgbG9uZ2VzdAogICAgICogZmlyc3QuCiAgICAgKi8KICAgIHdoaWxlIChlbmRpZHhjbnQgPiAwKQogICAgewoJLS1lbmRpZHhjbnQ7CglhcnJpZHggPSBlbmRpZHhbZW5kaWR4Y250XTsKCXdsZW4gPSBlbmRsZW5bZW5kaWR4Y250XTsKCiNpZmRlZiBGRUFUX01CWVRFCglpZiAoKCptYl9oZWFkX29mZikocHRyLCBwdHIgKyB3bGVuKSA+IDApCgkgICAgY29udGludWU7CSAgICAvKiBub3QgYXQgZmlyc3QgYnl0ZSBvZiBjaGFyYWN0ZXIgKi8KI2VuZGlmCglpZiAoc3BlbGxfaXN3b3JkcChwdHIgKyB3bGVuLCBtaXAtPm1pX2J1ZikpCgl7CgkgICAgaWYgKHNsYW5nLT5zbF9jb21wcHJvZyA9PSBOVUxMICYmICFzbGFuZy0+c2xfbm9icmVhaykKCQljb250aW51ZTsJICAgIC8qIG5leHQgY2hhciBpcyBhIHdvcmQgY2hhcmFjdGVyICovCgkgICAgd29yZF9lbmRzID0gRkFMU0U7Cgl9CgllbHNlCgkgICAgd29yZF9lbmRzID0gVFJVRTsKCS8qIFRoZSBwcmVmaXggZmxhZyBpcyBiZWZvcmUgY29tcG91bmQgZmxhZ3MuICBPbmNlIGEgdmFsaWQgcHJlZml4IGZsYWcKCSAqIGhhcyBiZWVuIGZvdW5kIHdlIHRyeSBjb21wb3VuZCBmbGFncy4gKi8KCXByZWZpeF9mb3VuZCA9IEZBTFNFOwoKI2lmZGVmIEZFQVRfTUJZVEUKCWlmIChtb2RlICE9IEZJTkRfS0VFUFdPUkQgJiYgaGFzX21ieXRlKQoJewoJICAgIC8qIENvbXB1dGUgYnl0ZSBsZW5ndGggaW4gb3JpZ2luYWwgd29yZCwgbGVuZ3RoIG1heSBjaGFuZ2UKCSAgICAgKiB3aGVuIGZvbGRpbmcgY2FzZS4gIFRoaXMgY2FuIGJlIHNsb3csIHRha2UgYSBzaG9ydGN1dCB3aGVuIHRoZQoJICAgICAqIGNhc2UtZm9sZGVkIHdvcmQgaXMgZXF1YWwgdG8gdGhlIGtlZXAtY2FzZSB3b3JkLiAqLwoJICAgIHAgPSBtaXAtPm1pX3dvcmQ7CgkgICAgaWYgKFNUUk5DTVAocHRyLCBwLCB3bGVuKSAhPSAwKQoJICAgIHsKCQlmb3IgKHMgPSBwdHI7IHMgPCBwdHIgKyB3bGVuOyBtYl9wdHJfYWR2KHMpKQoJCSAgICBtYl9wdHJfYWR2KHApOwoJCXdsZW4gPSBwIC0gbWlwLT5taV93b3JkOwoJICAgIH0KCX0KI2VuZGlmCgoJLyogQ2hlY2sgZmxhZ3MgYW5kIHJlZ2lvbi4gIEZvciBGSU5EX1BSRUZJWCBjaGVjayB0aGUgY29uZGl0aW9uIGFuZAoJICogcHJlZml4IElELgoJICogUmVwZWF0IHRoaXMgaWYgdGhlcmUgYXJlIG1vcmUgZmxhZ3MvcmVnaW9uIGFsdGVybmF0aXZlcyB1bnRpbCB0aGVyZQoJICogaXMgYSBtYXRjaC4gKi8KCXJlcyA9IFNQX0JBRDsKCWZvciAobGVuID0gYnl0c1thcnJpZHggLSAxXTsgbGVuID4gMCAmJiBieXRzW2FycmlkeF0gPT0gMDsKCQkJCQkJCSAgICAgIC0tbGVuLCArK2FycmlkeCkKCXsKCSAgICBmbGFncyA9IGlkeHNbYXJyaWR4XTsKCgkgICAgLyogRm9yIHRoZSBmb2xkLWNhc2UgdHJlZSBjaGVjayB0aGF0IHRoZSBjYXNlIG9mIHRoZSBjaGVja2VkIHdvcmQKCSAgICAgKiBtYXRjaGVzIHdpdGggd2hhdCB0aGUgd29yZCBpbiB0aGUgdHJlZSByZXF1aXJlcy4KCSAgICAgKiBGb3Iga2VlcC1jYXNlIHRyZWUgdGhlIGNhc2UgaXMgYWx3YXlzIHJpZ2h0LiAgRm9yIHByZWZpeGVzIHdlCgkgICAgICogZG9uJ3QgYm90aGVyIHRvIGNoZWNrLiAqLwoJICAgIGlmIChtb2RlID09IEZJTkRfRk9MRFdPUkQpCgkgICAgewoJCWlmIChtaXAtPm1pX2NlbmQgIT0gbWlwLT5taV93b3JkICsgd2xlbikKCQl7CgkJICAgIC8qIG1pX2NhcGZsYWdzIHdhcyBzZXQgZm9yIGEgZGlmZmVyZW50IHdvcmQgbGVuZ3RoLCBuZWVkCgkJICAgICAqIHRvIGRvIGl0IGFnYWluLiAqLwoJCSAgICBtaXAtPm1pX2NlbmQgPSBtaXAtPm1pX3dvcmQgKyB3bGVuOwoJCSAgICBtaXAtPm1pX2NhcGZsYWdzID0gY2FwdHlwZShtaXAtPm1pX3dvcmQsIG1pcC0+bWlfY2VuZCk7CgkJfQoKCQlpZiAobWlwLT5taV9jYXBmbGFncyA9PSBXRl9LRUVQQ0FQCgkJCQl8fCAhc3BlbGxfdmFsaWRfY2FzZShtaXAtPm1pX2NhcGZsYWdzLCBmbGFncykpCgkJICAgIGNvbnRpbnVlOwoJICAgIH0KCgkgICAgLyogV2hlbiBtb2RlIGlzIEZJTkRfUFJFRklYIHRoZSB3b3JkIG11c3Qgc3VwcG9ydCB0aGUgcHJlZml4OgoJICAgICAqIGNoZWNrIHRoZSBwcmVmaXggSUQgYW5kIHRoZSBjb25kaXRpb24uICBEbyB0aGF0IGZvciB0aGUgbGlzdCBhdAoJICAgICAqIG1pcC0+bWlfcHJlZmFycmlkeCB0aGF0IGZpbmRfcHJlZml4KCkgZmlsbGVkLiAqLwoJICAgIGVsc2UgaWYgKG1vZGUgPT0gRklORF9QUkVGSVggJiYgIXByZWZpeF9mb3VuZCkKCSAgICB7CgkJYyA9IHZhbGlkX3dvcmRfcHJlZml4KG1pcC0+bWlfcHJlZmNudCwgbWlwLT5taV9wcmVmYXJyaWR4LAoJCQkJICAgIGZsYWdzLAoJCQkJICAgIG1pcC0+bWlfd29yZCArIG1pcC0+bWlfY3ByZWZpeGxlbiwgc2xhbmcsCgkJCQkgICAgRkFMU0UpOwoJCWlmIChjID09IDApCgkJICAgIGNvbnRpbnVlOwoKCQkvKiBVc2UgdGhlIFdGX1JBUkUgZmxhZyBmb3IgYSByYXJlIHByZWZpeC4gKi8KCQlpZiAoYyAmIFdGX1JBUkVQRlgpCgkJICAgIGZsYWdzIHw9IFdGX1JBUkU7CgkJcHJlZml4X2ZvdW5kID0gVFJVRTsKCSAgICB9CgoJICAgIGlmIChzbGFuZy0+c2xfbm9icmVhaykKCSAgICB7CgkJaWYgKChtb2RlID09IEZJTkRfQ09NUE9VTkQgfHwgbW9kZSA9PSBGSU5EX0tFRVBDT01QT1VORCkKCQkJJiYgKGZsYWdzICYgV0ZfQkFOTkVEKSA9PSAwKQoJCXsKCQkgICAgLyogTk9CUkVBSzogZm91bmQgYSB2YWxpZCBmb2xsb3dpbmcgd29yZC4gIFRoYXQncyBhbGwgd2UKCQkgICAgICogbmVlZCB0byBrbm93LCBzbyByZXR1cm4uICovCgkJICAgIG1pcC0+bWlfcmVzdWx0ID0gU1BfT0s7CgkJICAgIGJyZWFrOwoJCX0KCSAgICB9CgoJICAgIGVsc2UgaWYgKChtb2RlID09IEZJTkRfQ09NUE9VTkQgfHwgbW9kZSA9PSBGSU5EX0tFRVBDT01QT1VORAoJCQkJCQkJCXx8ICF3b3JkX2VuZHMpKQoJICAgIHsKCQkvKiBJZiB0aGVyZSBpcyBubyAgZmxhZyBvciB0aGUgd29yZCBpcyBzaG9ydGVyIHRoYW4KCQkgKiBDT01QT1VORE1JTiByZWplY3QgaXQgcXVpY2tseS4KCQkgKiBNYWtlcyB5b3Ugd29uZGVyIHdoeSBzb21lb25lIHB1dHMgYSBjb21wb3VuZCBmbGFnIG9uIGEgd29yZAoJCSAqIHRoYXQncyB0b28gc2hvcnQuLi4gIE15c3BlbGwgY29tcGF0aWJpbGl0eSByZXF1aXJlcyB0aGlzCgkJICogYW55d2F5LiAqLwoJCWlmICgoKHVuc2lnbmVkKWZsYWdzID4+IDI0KSA9PSAwCgkJCSAgICAgfHwgd2xlbiAtIG1pcC0+bWlfY29tcG9mZiA8IHNsYW5nLT5zbF9jb21wbWlubGVuKQoJCSAgICBjb250aW51ZTsKI2lmZGVmIEZFQVRfTUJZVEUKCQkvKiBGb3IgbXVsdGktYnl0ZSBjaGFycyBjaGVjayBjaGFyYWN0ZXIgbGVuZ3RoIGFnYWluc3QKCQkgKiBDT01QT1VORE1JTi4gKi8KCQlpZiAoaGFzX21ieXRlCgkJCSYmIHNsYW5nLT5zbF9jb21wbWlubGVuID4gMAoJCQkmJiBtYl9jaGFybGVuX2xlbihtaXAtPm1pX3dvcmQgKyBtaXAtPm1pX2NvbXBvZmYsCgkJCQl3bGVuIC0gbWlwLT5taV9jb21wb2ZmKSA8IHNsYW5nLT5zbF9jb21wbWlubGVuKQoJCQljb250aW51ZTsKI2VuZGlmCgoJCS8qIExpbWl0IHRoZSBudW1iZXIgb2YgY29tcG91bmQgd29yZHMgdG8gQ09NUE9VTkRXT1JETUFYIGlmIG5vCgkJICogbWF4aW11bSBmb3Igc3lsbGFibGVzIGlzIHNwZWNpZmllZC4gKi8KCQlpZiAoIXdvcmRfZW5kcyAmJiBtaXAtPm1pX2NvbXBsZW4gKyBtaXAtPm1pX2NvbXBleHRyYSArIDIKCQkJCQkJCSAgID4gc2xhbmctPnNsX2NvbXBtYXgKCQkJCQkgICAmJiBzbGFuZy0+c2xfY29tcHN5bG1heCA9PSBNQVhXTEVOKQoJCSAgICBjb250aW51ZTsKCgkJLyogRG9uJ3QgYWxsb3cgY29tcG91bmRpbmcgb24gYSBzaWRlIHdoZXJlIGFuIGFmZml4IHdhcyBhZGRlZCwKCQkgKiB1bmxlc3MgQ09NUE9VTkRQRVJNSVRGTEFHIHdhcyB1c2VkLiAqLwoJCWlmIChtaXAtPm1pX2NvbXBsZW4gPiAwICYmIChmbGFncyAmIFdGX05PQ09NUEJFRikpCgkJICAgIGNvbnRpbnVlOwoJCWlmICghd29yZF9lbmRzICYmIChmbGFncyAmIFdGX05PQ09NUEFGVCkpCgkJICAgIGNvbnRpbnVlOwoKCQkvKiBRdWlja2x5IGNoZWNrIGlmIGNvbXBvdW5kaW5nIGlzIHBvc3NpYmxlIHdpdGggdGhpcyBmbGFnLiAqLwoJCWlmICghYnl0ZV9pbl9zdHIobWlwLT5taV9jb21wbGVuID09IDAKCQkJCQk/IHNsYW5nLT5zbF9jb21wc3RhcnRmbGFncwoJCQkJCTogc2xhbmctPnNsX2NvbXBhbGxmbGFncywKCQkJCQkgICAgKCh1bnNpZ25lZClmbGFncyA+PiAyNCkpKQoJCSAgICBjb250aW51ZTsKCgkJaWYgKG1vZGUgPT0gRklORF9DT01QT1VORCkKCQl7CgkJICAgIGludAkgICAgY2FwZmxhZ3M7CgoJCSAgICAvKiBOZWVkIHRvIGNoZWNrIHRoZSBjYXBzIHR5cGUgb2YgdGhlIGFwcGVuZGVkIGNvbXBvdW5kCgkJICAgICAqIHdvcmQuICovCiNpZmRlZiBGRUFUX01CWVRFCgkJICAgIGlmIChoYXNfbWJ5dGUgJiYgU1RSTkNNUChwdHIsIG1pcC0+bWlfd29yZCwKCQkJCQkJCW1pcC0+bWlfY29tcG9mZikgIT0gMCkKCQkgICAgewoJCQkvKiBjYXNlIGZvbGRpbmcgbWF5IGhhdmUgY2hhbmdlZCB0aGUgbGVuZ3RoICovCgkJCXAgPSBtaXAtPm1pX3dvcmQ7CgkJCWZvciAocyA9IHB0cjsgcyA8IHB0ciArIG1pcC0+bWlfY29tcG9mZjsgbWJfcHRyX2FkdihzKSkKCQkJICAgIG1iX3B0cl9hZHYocCk7CgkJICAgIH0KCQkgICAgZWxzZQojZW5kaWYKCQkJcCA9IG1pcC0+bWlfd29yZCArIG1pcC0+bWlfY29tcG9mZjsKCQkgICAgY2FwZmxhZ3MgPSBjYXB0eXBlKHAsIG1pcC0+bWlfd29yZCArIHdsZW4pOwoJCSAgICBpZiAoY2FwZmxhZ3MgPT0gV0ZfS0VFUENBUCB8fCAoY2FwZmxhZ3MgPT0gV0ZfQUxMQ0FQCgkJCQkJCSAmJiAoZmxhZ3MgJiBXRl9GSVhDQVApICE9IDApKQoJCQljb250aW51ZTsKCgkJICAgIGlmIChjYXBmbGFncyAhPSBXRl9BTExDQVApCgkJICAgIHsKCQkJLyogV2hlbiB0aGUgY2hhcmFjdGVyIGJlZm9yZSB0aGUgd29yZCBpcyBhIHdvcmQKCQkJICogY2hhcmFjdGVyIHdlIGRvIG5vdCBhY2NlcHQgYSBPbmVjYXAgd29yZC4gIFdlIGRvCgkJCSAqIGFjY2VwdCBhIG5vLWNhcHMgd29yZCwgZXZlbiB3aGVuIHRoZSBkaWN0aW9uYXJ5CgkJCSAqIHdvcmQgc3BlY2lmaWVzIE9ORUNBUC4gKi8KCQkJbWJfcHRyX2JhY2sobWlwLT5taV93b3JkLCBwKTsKCQkJaWYgKHNwZWxsX2lzd29yZHBfbm13KHApCgkJCQk/IGNhcGZsYWdzID09IFdGX09ORUNBUAoJCQkJOiAoZmxhZ3MgJiBXRl9PTkVDQVApICE9IDAKCQkJCQkJICAgICAmJiBjYXBmbGFncyAhPSBXRl9PTkVDQVApCgkJCSAgICBjb250aW51ZTsKCQkgICAgfQoJCX0KCgkJLyogSWYgdGhlIHdvcmQgZW5kcyB0aGUgc2VxdWVuY2Ugb2YgY29tcG91bmQgZmxhZ3Mgb2YgdGhlCgkJICogd29yZHMgbXVzdCBtYXRjaCB3aXRoIG9uZSBvZiB0aGUgQ09NUE9VTkRSVUxFIGl0ZW1zIGFuZAoJCSAqIHRoZSBudW1iZXIgb2Ygc3lsbGFibGVzIG11c3Qgbm90IGJlIHRvbyBsYXJnZS4gKi8KCQltaXAtPm1pX2NvbXBmbGFnc1ttaXAtPm1pX2NvbXBsZW5dID0gKCh1bnNpZ25lZClmbGFncyA+PiAyNCk7CgkJbWlwLT5taV9jb21wZmxhZ3NbbWlwLT5taV9jb21wbGVuICsgMV0gPSBOVUw7CgkJaWYgKHdvcmRfZW5kcykKCQl7CgkJICAgIGNoYXJfdQlmd29yZFtNQVhXTEVOXTsKCgkJICAgIGlmIChzbGFuZy0+c2xfY29tcHN5bG1heCA8IE1BWFdMRU4pCgkJICAgIHsKCQkJLyogImZ3b3JkIiBpcyBvbmx5IG5lZWRlZCBmb3IgY2hlY2tpbmcgc3lsbGFibGVzLiAqLwoJCQlpZiAocHRyID09IG1pcC0+bWlfd29yZCkKCQkJICAgICh2b2lkKXNwZWxsX2Nhc2Vmb2xkKHB0ciwgd2xlbiwgZndvcmQsIE1BWFdMRU4pOwoJCQllbHNlCgkJCSAgICB2aW1fc3RybmNweShmd29yZCwgcHRyLCBlbmRsZW5bZW5kaWR4Y250XSk7CgkJICAgIH0KCQkgICAgaWYgKCFjYW5fY29tcG91bmQoc2xhbmcsIGZ3b3JkLCBtaXAtPm1pX2NvbXBmbGFncykpCgkJCWNvbnRpbnVlOwoJCX0KCSAgICB9CgoJICAgIC8qIENoZWNrIE5FRURDT01QT1VORDogY2FuJ3QgdXNlIHdvcmQgd2l0aG91dCBjb21wb3VuZGluZy4gKi8KCSAgICBlbHNlIGlmIChmbGFncyAmIFdGX05FRURDT01QKQoJCWNvbnRpbnVlOwoKCSAgICBub2JyZWFrX3Jlc3VsdCA9IFNQX09LOwoKCSAgICBpZiAoIXdvcmRfZW5kcykKCSAgICB7CgkJaW50CXNhdmVfcmVzdWx0ID0gbWlwLT5taV9yZXN1bHQ7CgkJY2hhcl91CSpzYXZlX2VuZCA9IG1pcC0+bWlfZW5kOwoJCWxhbmdwX1QJKnNhdmVfbHAgPSBtaXAtPm1pX2xwOwoJCWludAlscGk7CgoJCS8qIENoZWNrIHRoYXQgYSB2YWxpZCB3b3JkIGZvbGxvd3MuICBJZiB0aGVyZSBpcyBvbmUgYW5kIHdlCgkJICogYXJlIGNvbXBvdW5kaW5nLCBpdCB3aWxsIHNldCAibWlfcmVzdWx0IiwgdGh1cyB3ZSBhcmUKCQkgKiBhbHdheXMgZmluaXNoZWQgaGVyZS4gIEZvciBOT0JSRUFLIHdlIG9ubHkgY2hlY2sgdGhhdCBhCgkJICogdmFsaWQgd29yZCBmb2xsb3dzLgoJCSAqIFJlY3Vyc2l2ZSEgKi8KCQlpZiAoc2xhbmctPnNsX25vYnJlYWspCgkJICAgIG1pcC0+bWlfcmVzdWx0ID0gU1BfQkFEOwoKCQkvKiBGaW5kIGZvbGxvd2luZyB3b3JkIGluIGNhc2UtZm9sZGVkIHRyZWUuICovCgkJbWlwLT5taV9jb21wb2ZmID0gZW5kbGVuW2VuZGlkeGNudF07CiNpZmRlZiBGRUFUX01CWVRFCgkJaWYgKGhhc19tYnl0ZSAmJiBtb2RlID09IEZJTkRfS0VFUFdPUkQpCgkJewoJCSAgICAvKiBDb21wdXRlIGJ5dGUgbGVuZ3RoIGluIGNhc2UtZm9sZGVkIHdvcmQgZnJvbSAid2xlbiI6CgkJICAgICAqIGJ5dGUgbGVuZ3RoIGluIGtlZXAtY2FzZSB3b3JkLiAgTGVuZ3RoIG1heSBjaGFuZ2Ugd2hlbgoJCSAgICAgKiBmb2xkaW5nIGNhc2UuICBUaGlzIGNhbiBiZSBzbG93LCB0YWtlIGEgc2hvcnRjdXQgd2hlbgoJCSAgICAgKiB0aGUgY2FzZS1mb2xkZWQgd29yZCBpcyBlcXVhbCB0byB0aGUga2VlcC1jYXNlIHdvcmQuICovCgkJICAgIHAgPSBtaXAtPm1pX2Z3b3JkOwoJCSAgICBpZiAoU1RSTkNNUChwdHIsIHAsIHdsZW4pICE9IDApCgkJICAgIHsKCQkJZm9yIChzID0gcHRyOyBzIDwgcHRyICsgd2xlbjsgbWJfcHRyX2FkdihzKSkKCQkJICAgIG1iX3B0cl9hZHYocCk7CgkJCW1pcC0+bWlfY29tcG9mZiA9IHAgLSBtaXAtPm1pX2Z3b3JkOwoJCSAgICB9CgkJfQojZW5kaWYKCQljID0gbWlwLT5taV9jb21wb2ZmOwoJCSsrbWlwLT5taV9jb21wbGVuOwoJCWlmIChmbGFncyAmIFdGX0NPTVBST09UKQoJCSAgICArK21pcC0+bWlfY29tcGV4dHJhOwoKCQkvKiBGb3IgTk9CUkVBSyB3ZSBuZWVkIHRvIHRyeSBhbGwgTk9CUkVBSyBsYW5ndWFnZXMsIGF0IGxlYXN0CgkJICogdG8gZmluZCB0aGUgIi5hZGQiIGZpbGUocykuICovCgkJZm9yIChscGkgPSAwOyBscGkgPCBtaXAtPm1pX2J1Zi0+Yl9sYW5ncC5nYV9sZW47ICsrbHBpKQoJCXsKCQkgICAgaWYgKHNsYW5nLT5zbF9ub2JyZWFrKQoJCSAgICB7CgkJCW1pcC0+bWlfbHAgPSBMQU5HUF9FTlRSWShtaXAtPm1pX2J1Zi0+Yl9sYW5ncCwgbHBpKTsKCQkJaWYgKG1pcC0+bWlfbHAtPmxwX3NsYW5nLT5zbF9maWR4cyA9PSBOVUxMCgkJCQkJIHx8ICFtaXAtPm1pX2xwLT5scF9zbGFuZy0+c2xfbm9icmVhaykKCQkJICAgIGNvbnRpbnVlOwoJCSAgICB9CgoJCSAgICBmaW5kX3dvcmQobWlwLCBGSU5EX0NPTVBPVU5EKTsKCgkJICAgIC8qIFdoZW4gTk9CUkVBSyBhbnkgd29yZCB0aGF0IG1hdGNoZXMgaXMgT0suICBPdGhlcndpc2Ugd2UKCQkgICAgICogbmVlZCB0byBmaW5kIHRoZSBsb25nZXN0IG1hdGNoLCB0aHVzIHRyeSB3aXRoIGtlZXAtY2FzZQoJCSAgICAgKiBhbmQgcHJlZml4IHRvby4gKi8KCQkgICAgaWYgKCFzbGFuZy0+c2xfbm9icmVhayB8fCBtaXAtPm1pX3Jlc3VsdCA9PSBTUF9CQUQpCgkJICAgIHsKCQkJLyogRmluZCBmb2xsb3dpbmcgd29yZCBpbiBrZWVwLWNhc2UgdHJlZS4gKi8KCQkJbWlwLT5taV9jb21wb2ZmID0gd2xlbjsKCQkJZmluZF93b3JkKG1pcCwgRklORF9LRUVQQ09NUE9VTkQpOwoKI2lmIDAJICAgIC8qIERpc2FibGVkLCBhIHByZWZpeCBtdXN0IG5vdCBhcHBlYXIgaGFsZndheSBhIGNvbXBvdW5kIHdvcmQsCgkgICAgICAgdW5sZXNzIHRoZSBDT01QT1VORFBFUk1JVEZMQUcgaXMgdXNlZCBhbmQgdGhlbiBpdCBjYW4ndCBiZSBhCgkgICAgICAgcG9zdHBvbmVkIHByZWZpeC4gKi8KCQkJaWYgKCFzbGFuZy0+c2xfbm9icmVhayB8fCBtaXAtPm1pX3Jlc3VsdCA9PSBTUF9CQUQpCgkJCXsKCQkJICAgIC8qIENoZWNrIGZvciBmb2xsb3dpbmcgd29yZCB3aXRoIHByZWZpeC4gKi8KCQkJICAgIG1pcC0+bWlfY29tcG9mZiA9IGM7CgkJCSAgICBmaW5kX3ByZWZpeChtaXAsIEZJTkRfQ09NUE9VTkQpOwoJCQl9CiNlbmRpZgoJCSAgICB9CgoJCSAgICBpZiAoIXNsYW5nLT5zbF9ub2JyZWFrKQoJCQlicmVhazsKCQl9CgkJLS1taXAtPm1pX2NvbXBsZW47CgkJaWYgKGZsYWdzICYgV0ZfQ09NUFJPT1QpCgkJICAgIC0tbWlwLT5taV9jb21wZXh0cmE7CgkJbWlwLT5taV9scCA9IHNhdmVfbHA7CgoJCWlmIChzbGFuZy0+c2xfbm9icmVhaykKCQl7CgkJICAgIG5vYnJlYWtfcmVzdWx0ID0gbWlwLT5taV9yZXN1bHQ7CgkJICAgIG1pcC0+bWlfcmVzdWx0ID0gc2F2ZV9yZXN1bHQ7CgkJICAgIG1pcC0+bWlfZW5kID0gc2F2ZV9lbmQ7CgkJfQoJCWVsc2UKCQl7CgkJICAgIGlmIChtaXAtPm1pX3Jlc3VsdCA9PSBTUF9PSykKCQkJYnJlYWs7CgkJICAgIGNvbnRpbnVlOwoJCX0KCSAgICB9CgoJICAgIGlmIChmbGFncyAmIFdGX0JBTk5FRCkKCQlyZXMgPSBTUF9CQU5ORUQ7CgkgICAgZWxzZSBpZiAoZmxhZ3MgJiBXRl9SRUdJT04pCgkgICAgewoJCS8qIENoZWNrIHJlZ2lvbi4gKi8KCQlpZiAoKG1pcC0+bWlfbHAtPmxwX3JlZ2lvbiAmIChmbGFncyA+PiAxNikpICE9IDApCgkJICAgIHJlcyA9IFNQX09LOwoJCWVsc2UKCQkgICAgcmVzID0gU1BfTE9DQUw7CgkgICAgfQoJICAgIGVsc2UgaWYgKGZsYWdzICYgV0ZfUkFSRSkKCQlyZXMgPSBTUF9SQVJFOwoJICAgIGVsc2UKCQlyZXMgPSBTUF9PSzsKCgkgICAgLyogQWx3YXlzIHVzZSB0aGUgbG9uZ2VzdCBtYXRjaCBhbmQgdGhlIGJlc3QgcmVzdWx0LiAgRm9yIE5PQlJFQUsKCSAgICAgKiB3ZSBzZXBhcmF0ZWx5IGtlZXAgdGhlIGxvbmdlc3QgbWF0Y2ggd2l0aG91dCBhIGZvbGxvd2luZyBnb29kCgkgICAgICogd29yZCBhcyBhIGZhbGwtYmFjay4gKi8KCSAgICBpZiAobm9icmVha19yZXN1bHQgPT0gU1BfQkFEKQoJICAgIHsKCQlpZiAobWlwLT5taV9yZXN1bHQyID4gcmVzKQoJCXsKCQkgICAgbWlwLT5taV9yZXN1bHQyID0gcmVzOwoJCSAgICBtaXAtPm1pX2VuZDIgPSBtaXAtPm1pX3dvcmQgKyB3bGVuOwoJCX0KCQllbHNlIGlmIChtaXAtPm1pX3Jlc3VsdDIgPT0gcmVzCgkJCQkJJiYgbWlwLT5taV9lbmQyIDwgbWlwLT5taV93b3JkICsgd2xlbikKCQkgICAgbWlwLT5taV9lbmQyID0gbWlwLT5taV93b3JkICsgd2xlbjsKCSAgICB9CgkgICAgZWxzZSBpZiAobWlwLT5taV9yZXN1bHQgPiByZXMpCgkgICAgewoJCW1pcC0+bWlfcmVzdWx0ID0gcmVzOwoJCW1pcC0+bWlfZW5kID0gbWlwLT5taV93b3JkICsgd2xlbjsKCSAgICB9CgkgICAgZWxzZSBpZiAobWlwLT5taV9yZXN1bHQgPT0gcmVzICYmIG1pcC0+bWlfZW5kIDwgbWlwLT5taV93b3JkICsgd2xlbikKCQltaXAtPm1pX2VuZCA9IG1pcC0+bWlfd29yZCArIHdsZW47CgoJICAgIGlmIChtaXAtPm1pX3Jlc3VsdCA9PSBTUF9PSykKCQlicmVhazsKCX0KCglpZiAobWlwLT5taV9yZXN1bHQgPT0gU1BfT0spCgkgICAgYnJlYWs7CiAgICB9Cn0KCi8qCiAqIFJldHVybiBUUlVFIGlmICJmbGFncyIgaXMgYSB2YWxpZCBzZXF1ZW5jZSBvZiBjb21wb3VuZCBmbGFncyBhbmQgIndvcmQiCiAqIGRvZXMgbm90IGhhdmUgdG9vIG1hbnkgc3lsbGFibGVzLgogKi8KICAgIHN0YXRpYyBpbnQKY2FuX2NvbXBvdW5kKHNsYW5nLCB3b3JkLCBmbGFncykKICAgIHNsYW5nX1QJKnNsYW5nOwogICAgY2hhcl91CSp3b3JkOwogICAgY2hhcl91CSpmbGFnczsKewogICAgcmVnbWF0Y2hfVAlyZWdtYXRjaDsKI2lmZGVmIEZFQVRfTUJZVEUKICAgIGNoYXJfdQl1ZmxhZ3NbTUFYV0xFTiAqIDJdOwogICAgaW50CQlpOwojZW5kaWYKICAgIGNoYXJfdQkqcDsKCiAgICBpZiAoc2xhbmctPnNsX2NvbXBwcm9nID09IE5VTEwpCglyZXR1cm4gRkFMU0U7CiNpZmRlZiBGRUFUX01CWVRFCiAgICBpZiAoZW5jX3V0ZjgpCiAgICB7CgkvKiBOZWVkIHRvIGNvbnZlcnQgdGhlIHNpbmdsZSBieXRlIGZsYWdzIHRvIHV0ZjggY2hhcmFjdGVycy4gKi8KCXAgPSB1ZmxhZ3M7Cglmb3IgKGkgPSAwOyBmbGFnc1tpXSAhPSBOVUw7ICsraSkKCSAgICBwICs9IG1iX2NoYXIyYnl0ZXMoZmxhZ3NbaV0sIHApOwoJKnAgPSBOVUw7CglwID0gdWZsYWdzOwogICAgfQogICAgZWxzZQojZW5kaWYKCXAgPSBmbGFnczsKICAgIHJlZ21hdGNoLnJlZ3Byb2cgPSBzbGFuZy0+c2xfY29tcHByb2c7CiAgICByZWdtYXRjaC5ybV9pYyA9IEZBTFNFOwogICAgaWYgKCF2aW1fcmVnZXhlYygmcmVnbWF0Y2gsIHAsIDApKQoJcmV0dXJuIEZBTFNFOwoKICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2Ygc3lsbGFibGVzLiAgVGhpcyBtYXkgYmUgc2xvdywgZG8gaXQgbGFzdC4gIElmIHRoZXJlCiAgICAgKiBhcmUgdG9vIG1hbnkgc3lsbGFibGVzIEFORCB0aGUgbnVtYmVyIG9mIGNvbXBvdW5kIHdvcmRzIGlzIGFib3ZlCiAgICAgKiBDT01QT1VORFdPUkRNQVggdGhlbiBjb21wb3VuZGluZyBpcyBub3QgYWxsb3dlZC4gKi8KICAgIGlmIChzbGFuZy0+c2xfY29tcHN5bG1heCA8IE1BWFdMRU4KCQkgICAgICAgJiYgY291bnRfc3lsbGFibGVzKHNsYW5nLCB3b3JkKSA+IHNsYW5nLT5zbF9jb21wc3lsbWF4KQoJcmV0dXJuIChpbnQpU1RSTEVOKGZsYWdzKSA8IHNsYW5nLT5zbF9jb21wbWF4OwogICAgcmV0dXJuIFRSVUU7Cn0KCi8qCiAqIFJldHVybiBub24temVybyBpZiB0aGUgcHJlZml4IGluZGljYXRlZCBieSAiYXJyaWR4IiBtYXRjaGVzIHdpdGggdGhlIHByZWZpeAogKiBJRCBpbiAiZmxhZ3MiIGZvciB0aGUgd29yZCAid29yZCIuCiAqIFRoZSBXRl9SQVJFUEZYIGZsYWcgaXMgaW5jbHVkZWQgaW4gdGhlIHJldHVybiB2YWx1ZSBmb3IgYSByYXJlIHByZWZpeC4KICovCiAgICBzdGF0aWMgaW50CnZhbGlkX3dvcmRfcHJlZml4KHRvdHByZWZjbnQsIGFycmlkeCwgZmxhZ3MsIHdvcmQsIHNsYW5nLCBjb25kX3JlcSkKICAgIGludAkJdG90cHJlZmNudDsJLyogbnIgb2YgcHJlZml4IElEcyAqLwogICAgaW50CQlhcnJpZHg7CQkvKiBpZHggaW4gc2xfcGlkeHNbXSAqLwogICAgaW50CQlmbGFnczsKICAgIGNoYXJfdQkqd29yZDsKICAgIHNsYW5nX1QJKnNsYW5nOwogICAgaW50CQljb25kX3JlcTsJLyogb25seSB1c2UgcHJlZml4ZXMgd2l0aCBhIGNvbmRpdGlvbiAqLwp7CiAgICBpbnQJCXByZWZjbnQ7CiAgICBpbnQJCXBpZHg7CiAgICByZWdwcm9nX1QJKnJwOwogICAgcmVnbWF0Y2hfVAlyZWdtYXRjaDsKICAgIGludAkJcHJlZmlkOwoKICAgIHByZWZpZCA9ICh1bnNpZ25lZClmbGFncyA+PiAyNDsKICAgIGZvciAocHJlZmNudCA9IHRvdHByZWZjbnQgLSAxOyBwcmVmY250ID49IDA7IC0tcHJlZmNudCkKICAgIHsKCXBpZHggPSBzbGFuZy0+c2xfcGlkeHNbYXJyaWR4ICsgcHJlZmNudF07CgoJLyogQ2hlY2sgdGhlIHByZWZpeCBJRC4gKi8KCWlmIChwcmVmaWQgIT0gKHBpZHggJiAweGZmKSkKCSAgICBjb250aW51ZTsKCgkvKiBDaGVjayBpZiB0aGUgcHJlZml4IGRvZXNuJ3QgY29tYmluZSBhbmQgdGhlIHdvcmQgYWxyZWFkeSBoYXMgYQoJICogc3VmZml4LiAqLwoJaWYgKChmbGFncyAmIFdGX0hBU19BRkYpICYmIChwaWR4ICYgV0ZfUEZYX05DKSkKCSAgICBjb250aW51ZTsKCgkvKiBDaGVjayB0aGUgY29uZGl0aW9uLCBpZiB0aGVyZSBpcyBvbmUuICBUaGUgY29uZGl0aW9uIGluZGV4IGlzCgkgKiBzdG9yZWQgaW4gdGhlIHR3byBieXRlcyBhYm92ZSB0aGUgcHJlZml4IElEIGJ5dGUuICAqLwoJcnAgPSBzbGFuZy0+c2xfcHJlZnByb2dbKCh1bnNpZ25lZClwaWR4ID4+IDgpICYgMHhmZmZmXTsKCWlmIChycCAhPSBOVUxMKQoJewoJICAgIHJlZ21hdGNoLnJlZ3Byb2cgPSBycDsKCSAgICByZWdtYXRjaC5ybV9pYyA9IEZBTFNFOwoJICAgIGlmICghdmltX3JlZ2V4ZWMoJnJlZ21hdGNoLCB3b3JkLCAwKSkKCQljb250aW51ZTsKCX0KCWVsc2UgaWYgKGNvbmRfcmVxKQoJICAgIGNvbnRpbnVlOwoKCS8qIEl0J3MgYSBtYXRjaCEgIFJldHVybiB0aGUgV0ZfIGZsYWdzLiAqLwoJcmV0dXJuIHBpZHg7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoKICogQ2hlY2sgaWYgdGhlIHdvcmQgYXQgIm1pcC0+bWlfd29yZCIgaGFzIGEgbWF0Y2hpbmcgcHJlZml4LgogKiBJZiBpdCBkb2VzLCB0aGVuIGNoZWNrIHRoZSBmb2xsb3dpbmcgd29yZC4KICoKICogSWYgIm1vZGUiIGlzICJGSU5EX0NPTVBPVU5EIiB0aGVuIGRvIHRoZSBzYW1lIGFmdGVyIGFub3RoZXIgd29yZCwgZmluZCBhCiAqIHByZWZpeCBpbiBhIGNvbXBvdW5kIHdvcmQuCiAqCiAqIEZvciBhIG1hdGNoIG1pcC0+bWlfcmVzdWx0IGlzIHVwZGF0ZWQuCiAqLwogICAgc3RhdGljIHZvaWQKZmluZF9wcmVmaXgobWlwLCBtb2RlKQogICAgbWF0Y2hpbmZfVAkqbWlwOwogICAgaW50CQltb2RlOwp7CiAgICBpZHhfVAlhcnJpZHggPSAwOwogICAgaW50CQlsZW47CiAgICBpbnQJCXdsZW4gPSAwOwogICAgaW50CQlmbGVuOwogICAgaW50CQljOwogICAgY2hhcl91CSpwdHI7CiAgICBpZHhfVAlsbywgaGksIG07CiAgICBzbGFuZ19UCSpzbGFuZyA9IG1pcC0+bWlfbHAtPmxwX3NsYW5nOwogICAgY2hhcl91CSpieXRzOwogICAgaWR4X1QJKmlkeHM7CgogICAgYnl0cyA9IHNsYW5nLT5zbF9wYnl0czsKICAgIGlmIChieXRzID09IE5VTEwpCglyZXR1cm47CQkJLyogYXJyYXkgaXMgZW1wdHkgKi8KCiAgICAvKiBXZSB1c2UgdGhlIGNhc2UtZm9sZGVkIHdvcmQgaGVyZSwgc2luY2UgcHJlZml4ZXMgYXJlIGFsd2F5cwogICAgICogY2FzZS1mb2xkZWQuICovCiAgICBwdHIgPSBtaXAtPm1pX2Z3b3JkOwogICAgZmxlbiA9IG1pcC0+bWlfZndvcmRsZW47ICAgIC8qIGF2YWlsYWJsZSBjYXNlLWZvbGRlZCBieXRlcyAqLwogICAgaWYgKG1vZGUgPT0gRklORF9DT01QT1VORCkKICAgIHsKCS8qIFNraXAgb3ZlciB0aGUgcHJldmlvdXNseSBmb3VuZCB3b3JkKHMpLiAqLwoJcHRyICs9IG1pcC0+bWlfY29tcG9mZjsKCWZsZW4gLT0gbWlwLT5taV9jb21wb2ZmOwogICAgfQogICAgaWR4cyA9IHNsYW5nLT5zbF9waWR4czsKCiAgICAvKgogICAgICogUmVwZWF0IGFkdmFuY2luZyBpbiB0aGUgdHJlZSB1bnRpbDoKICAgICAqIC0gdGhlcmUgaXMgYSBieXRlIHRoYXQgZG9lc24ndCBtYXRjaCwKICAgICAqIC0gd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgdHJlZSwKICAgICAqIC0gb3Igd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgbGluZS4KICAgICAqLwogICAgZm9yICg7OykKICAgIHsKCWlmIChmbGVuID09IDAgJiYgKm1pcC0+bWlfZmVuZCAhPSBOVUwpCgkgICAgZmxlbiA9IGZvbGRfbW9yZShtaXApOwoKCWxlbiA9IGJ5dHNbYXJyaWR4KytdOwoKCS8qIElmIHRoZSBmaXJzdCBwb3NzaWJsZSBieXRlIGlzIGEgemVybyB0aGUgcHJlZml4IGNvdWxkIGVuZCBoZXJlLgoJICogQ2hlY2sgaWYgdGhlIGZvbGxvd2luZyB3b3JkIG1hdGNoZXMgYW5kIHN1cHBvcnRzIHRoZSBwcmVmaXguICovCglpZiAoYnl0c1thcnJpZHhdID09IDApCgl7CgkgICAgLyogVGhlcmUgY2FuIGJlIHNldmVyYWwgcHJlZml4ZXMgd2l0aCBkaWZmZXJlbnQgY29uZGl0aW9ucy4gIFdlCgkgICAgICogdHJ5IHRoZW0gYWxsLCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoaWNoIG9uZSB3aWxsIGdpdmUgdGhlCgkgICAgICogbG9uZ2VzdCBtYXRjaC4gIFRoZSB3b3JkIGlzIHRoZSBzYW1lIGVhY2ggdGltZSwgcGFzcyB0aGUgbGlzdAoJICAgICAqIG9mIHBvc3NpYmxlIHByZWZpeGVzIHRvIGZpbmRfd29yZCgpLiAqLwoJICAgIG1pcC0+bWlfcHJlZmFycmlkeCA9IGFycmlkeDsKCSAgICBtaXAtPm1pX3ByZWZjbnQgPSBsZW47CgkgICAgd2hpbGUgKGxlbiA+IDAgJiYgYnl0c1thcnJpZHhdID09IDApCgkgICAgewoJCSsrYXJyaWR4OwoJCS0tbGVuOwoJICAgIH0KCSAgICBtaXAtPm1pX3ByZWZjbnQgLT0gbGVuOwoKCSAgICAvKiBGaW5kIHRoZSB3b3JkIHRoYXQgY29tZXMgYWZ0ZXIgdGhlIHByZWZpeC4gKi8KCSAgICBtaXAtPm1pX3ByZWZpeGxlbiA9IHdsZW47CgkgICAgaWYgKG1vZGUgPT0gRklORF9DT01QT1VORCkKCQkvKiBTa2lwIG92ZXIgdGhlIHByZXZpb3VzbHkgZm91bmQgd29yZChzKS4gKi8KCQltaXAtPm1pX3ByZWZpeGxlbiArPSBtaXAtPm1pX2NvbXBvZmY7CgojaWZkZWYgRkVBVF9NQllURQoJICAgIGlmIChoYXNfbWJ5dGUpCgkgICAgewoJCS8qIENhc2UtZm9sZGVkIGxlbmd0aCBtYXkgZGlmZmVyIGZyb20gb3JpZ2luYWwgbGVuZ3RoLiAqLwoJCW1pcC0+bWlfY3ByZWZpeGxlbiA9IG5vZm9sZF9sZW4obWlwLT5taV9md29yZCwKCQkJCQkgICAgIG1pcC0+bWlfcHJlZml4bGVuLCBtaXAtPm1pX3dvcmQpOwoJICAgIH0KCSAgICBlbHNlCgkJbWlwLT5taV9jcHJlZml4bGVuID0gbWlwLT5taV9wcmVmaXhsZW47CiNlbmRpZgoJICAgIGZpbmRfd29yZChtaXAsIEZJTkRfUFJFRklYKTsKCgoJICAgIGlmIChsZW4gPT0gMCkKCQlicmVhazsJICAgIC8qIG5vIGNoaWxkcmVuLCB3b3JkIG11c3QgZW5kIGhlcmUgKi8KCX0KCgkvKiBTdG9wIGxvb2tpbmcgYXQgZW5kIG9mIHRoZSBsaW5lLiAqLwoJaWYgKHB0clt3bGVuXSA9PSBOVUwpCgkgICAgYnJlYWs7CgoJLyogUGVyZm9ybSBhIGJpbmFyeSBzZWFyY2ggaW4gdGhlIGxpc3Qgb2YgYWNjZXB0ZWQgYnl0ZXMuICovCgljID0gcHRyW3dsZW5dOwoJbG8gPSBhcnJpZHg7CgloaSA9IGFycmlkeCArIGxlbiAtIDE7Cgl3aGlsZSAobG8gPCBoaSkKCXsKCSAgICBtID0gKGxvICsgaGkpIC8gMjsKCSAgICBpZiAoYnl0c1ttXSA+IGMpCgkJaGkgPSBtIC0gMTsKCSAgICBlbHNlIGlmIChieXRzW21dIDwgYykKCQlsbyA9IG0gKyAxOwoJICAgIGVsc2UKCSAgICB7CgkJbG8gPSBoaSA9IG07CgkJYnJlYWs7CgkgICAgfQoJfQoKCS8qIFN0b3AgaWYgdGhlcmUgaXMgbm8gbWF0Y2hpbmcgYnl0ZS4gKi8KCWlmIChoaSA8IGxvIHx8IGJ5dHNbbG9dICE9IGMpCgkgICAgYnJlYWs7CgoJLyogQ29udGludWUgYXQgdGhlIGNoaWxkIChpZiB0aGVyZSBpcyBvbmUpLiAqLwoJYXJyaWR4ID0gaWR4c1tsb107CgkrK3dsZW47CgktLWZsZW47CiAgICB9Cn0KCi8qCiAqIE5lZWQgdG8gZm9sZCBhdCBsZWFzdCBvbmUgbW9yZSBjaGFyYWN0ZXIuICBEbyB1bnRpbCBuZXh0IG5vbi13b3JkIGNoYXJhY3RlcgogKiBmb3IgZWZmaWNpZW5jeS4gIEluY2x1ZGUgdGhlIG5vbi13b3JkIGNoYXJhY3RlciB0b28uCiAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBmb2xkZWQgY2hhcnMgaW4gYnl0ZXMuCiAqLwogICAgc3RhdGljIGludApmb2xkX21vcmUobWlwKQogICAgbWF0Y2hpbmZfVAkqbWlwOwp7CiAgICBpbnQJCWZsZW47CiAgICBjaGFyX3UJKnA7CgogICAgcCA9IG1pcC0+bWlfZmVuZDsKICAgIGRvCiAgICB7CgltYl9wdHJfYWR2KG1pcC0+bWlfZmVuZCk7CiAgICB9IHdoaWxlICgqbWlwLT5taV9mZW5kICE9IE5VTCAmJiBzcGVsbF9pc3dvcmRwKG1pcC0+bWlfZmVuZCwgbWlwLT5taV9idWYpKTsKCiAgICAvKiBJbmNsdWRlIHRoZSBub24td29yZCBjaGFyYWN0ZXIgc28gdGhhdCB3ZSBjYW4gY2hlY2sgZm9yIHRoZSB3b3JkIGVuZC4gKi8KICAgIGlmICgqbWlwLT5taV9mZW5kICE9IE5VTCkKCW1iX3B0cl9hZHYobWlwLT5taV9mZW5kKTsKCiAgICAodm9pZClzcGVsbF9jYXNlZm9sZChwLCAoaW50KShtaXAtPm1pX2ZlbmQgLSBwKSwKCQkJICAgICBtaXAtPm1pX2Z3b3JkICsgbWlwLT5taV9md29yZGxlbiwKCQkJICAgICBNQVhXTEVOIC0gbWlwLT5taV9md29yZGxlbik7CiAgICBmbGVuID0gU1RSTEVOKG1pcC0+bWlfZndvcmQgKyBtaXAtPm1pX2Z3b3JkbGVuKTsKICAgIG1pcC0+bWlfZndvcmRsZW4gKz0gZmxlbjsKICAgIHJldHVybiBmbGVuOwp9CgovKgogKiBDaGVjayBjYXNlIGZsYWdzIGZvciBhIHdvcmQuICBSZXR1cm4gVFJVRSBpZiB0aGUgd29yZCBoYXMgdGhlIHJlcXVlc3RlZAogKiBjYXNlLgogKi8KICAgIHN0YXRpYyBpbnQKc3BlbGxfdmFsaWRfY2FzZSh3b3JkZmxhZ3MsIHRyZWVmbGFncykKICAgIGludAkgICAgd29yZGZsYWdzOwkgICAgLyogZmxhZ3MgZm9yIHRoZSBjaGVja2VkIHdvcmQuICovCiAgICBpbnQJICAgIHRyZWVmbGFnczsJICAgIC8qIGZsYWdzIGZvciB0aGUgd29yZCBpbiB0aGUgc3BlbGwgdHJlZSAqLwp7CiAgICByZXR1cm4gKCh3b3JkZmxhZ3MgPT0gV0ZfQUxMQ0FQICYmICh0cmVlZmxhZ3MgJiBXRl9GSVhDQVApID09IDApCgkgICAgfHwgKCh0cmVlZmxhZ3MgJiAoV0ZfQUxMQ0FQIHwgV0ZfS0VFUENBUCkpID09IDAKCQkmJiAoKHRyZWVmbGFncyAmIFdGX09ORUNBUCkgPT0gMAoJCQkJCSAgIHx8ICh3b3JkZmxhZ3MgJiBXRl9PTkVDQVApICE9IDApKSk7Cn0KCi8qCiAqIFJldHVybiBUUlVFIGlmIHNwZWxsIGNoZWNraW5nIGlzIG5vdCBlbmFibGVkLgogKi8KICAgIHN0YXRpYyBpbnQKbm9fc3BlbGxfY2hlY2tpbmcod3ApCiAgICB3aW5fVAkqd3A7CnsKICAgIGlmICghd3AtPndfcF9zcGVsbCB8fCAqd3AtPndfYnVmZmVyLT5iX3Bfc3BsID09IE5VTAoJCQkJCSB8fCB3cC0+d19idWZmZXItPmJfbGFuZ3AuZ2FfbGVuID09IDApCiAgICB7CglFTVNHKF8oIkU3NTY6IFNwZWxsIGNoZWNraW5nIGlzIG5vdCBlbmFibGVkIikpOwoJcmV0dXJuIFRSVUU7CiAgICB9CiAgICByZXR1cm4gRkFMU0U7Cn0KCi8qCiAqIE1vdmUgdG8gbmV4dCBzcGVsbCBlcnJvci4KICogImN1cmxpbmUiIGlzIEZBTFNFIGZvciAiW3MiLCAiXXMiLCAiW1MiIGFuZCAiXVMiLgogKiAiY3VybGluZSIgaXMgVFJVRSB0byBmaW5kIHdvcmQgdW5kZXIvYWZ0ZXIgY3Vyc29yIGluIHRoZSBzYW1lIGxpbmUuCiAqIEZvciBJbnNlcnQgbW9kZSBjb21wbGV0aW9uICJkaXIiIGlzIEJBQ0tXQVJEIGFuZCAiY3VybGluZSIgaXMgVFJVRTogbW92ZQogKiB0byBhZnRlciBiYWRseSBzcGVsbGVkIHdvcmQgYmVmb3JlIHRoZSBjdXJzb3IuCiAqIFJldHVybiAwIGlmIG5vdCBmb3VuZCwgbGVuZ3RoIG9mIHRoZSBiYWRseSBzcGVsbGVkIHdvcmQgb3RoZXJ3aXNlLgogKi8KICAgIGludApzcGVsbF9tb3ZlX3RvKHdwLCBkaXIsIGFsbHdvcmRzLCBjdXJsaW5lLCBhdHRycCkKICAgIHdpbl9UCSp3cDsKICAgIGludAkJZGlyOwkJLyogRk9SV0FSRCBvciBCQUNLV0FSRCAqLwogICAgaW50CQlhbGx3b3JkczsJLyogVFJVRSBmb3IgIltzIi8iXXMiLCBGQUxTRSBmb3IgIltTIi8iXVMiICovCiAgICBpbnQJCWN1cmxpbmU7CiAgICBobGZfVAkqYXR0cnA7CQkvKiByZXR1cm46IGF0dHJpYnV0ZXMgb2YgYmFkIHdvcmQgb3IgTlVMTAoJCQkJICAgKG9ubHkgd2hlbiAiZGlyIiBpcyBGT1JXQVJEKSAqLwp7CiAgICBsaW5lbnJfVAlsbnVtOwogICAgcG9zX1QJZm91bmRfcG9zOwogICAgaW50CQlmb3VuZF9sZW4gPSAwOwogICAgY2hhcl91CSpsaW5lOwogICAgY2hhcl91CSpwOwogICAgY2hhcl91CSplbmRwOwogICAgaGxmX1QJYXR0cjsKICAgIGludAkJbGVuOwojIGlmZGVmIEZFQVRfU1lOX0hMCiAgICBpbnQJCWhhc19zeW50YXggPSBzeW50YXhfcHJlc2VudCh3cC0+d19idWZmZXIpOwogICAgaW50CQljb2w7CiMgZW5kaWYKICAgIGludAkJY2FuX3NwZWxsOwogICAgY2hhcl91CSpidWYgPSBOVUxMOwogICAgaW50CQlidWZsZW4gPSAwOwogICAgaW50CQlza2lwID0gMDsKICAgIGludAkJY2FwY29sID0gLTE7CiAgICBpbnQJCWZvdW5kX29uZSA9IEZBTFNFOwogICAgaW50CQl3cmFwcGVkID0gRkFMU0U7CgogICAgaWYgKG5vX3NwZWxsX2NoZWNraW5nKHdwKSkKCXJldHVybiAwOwoKICAgIC8qCiAgICAgKiBTdGFydCBsb29raW5nIGZvciBiYWQgd29yZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUsIGJlY2F1c2Ugd2UgY2FuJ3QKICAgICAqIHN0YXJ0IGhhbGZ3YXkgYSB3b3JkLCB3ZSBkb24ndCBrbm93IHdoZXJlIGl0IHN0YXJ0cyBvciBlbmRzLgogICAgICoKICAgICAqIFdoZW4gc2VhcmNoaW5nIGJhY2t3YXJkcywgd2UgY29udGludWUgaW4gdGhlIGxpbmUgdG8gZmluZCB0aGUgbGFzdAogICAgICogYmFkIHdvcmQgKGluIHRoZSBjdXJzb3IgbGluZTogYmVmb3JlIHRoZSBjdXJzb3IpLgogICAgICoKICAgICAqIFdlIGNvbmNhdGVuYXRlIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBsaW5lLCBzbyB0aGF0IHdyYXBwZWQgd29yZHMgd29yawogICAgICogKGUuZy4gImV0PGxpbmUtYnJlYWs+Y2V0ZXJhIikuICBEb2Vzbid0IHdvcmsgd2hlbiBzZWFyY2hpbmcgYmFja3dhcmRzCiAgICAgKiB0aG91Z2guLi4KICAgICAqLwogICAgbG51bSA9IHdwLT53X2N1cnNvci5sbnVtOwogICAgY2xlYXJwb3MoJmZvdW5kX3Bvcyk7CgogICAgd2hpbGUgKCFnb3RfaW50KQogICAgewoJbGluZSA9IG1sX2dldF9idWYod3AtPndfYnVmZmVyLCBsbnVtLCBGQUxTRSk7CgoJbGVuID0gU1RSTEVOKGxpbmUpOwoJaWYgKGJ1ZmxlbiA8IGxlbiArIE1BWFdMRU4gKyAyKQoJewoJICAgIHZpbV9mcmVlKGJ1Zik7CgkgICAgYnVmbGVuID0gbGVuICsgTUFYV0xFTiArIDI7CgkgICAgYnVmID0gYWxsb2MoYnVmbGVuKTsKCSAgICBpZiAoYnVmID09IE5VTEwpCgkJYnJlYWs7Cgl9CgoJLyogSW4gZmlyc3QgbGluZSBjaGVjayBmaXJzdCB3b3JkIGZvciBDYXBpdGFsLiAqLwoJaWYgKGxudW0gPT0gMSkKCSAgICBjYXBjb2wgPSAwOwoKCS8qIEZvciBjaGVja2luZyBmaXJzdCB3b3JkIHdpdGggYSBjYXBpdGFsIHNraXAgd2hpdGUgc3BhY2UuICovCglpZiAoY2FwY29sID09IDApCgkgICAgY2FwY29sID0gc2tpcHdoaXRlKGxpbmUpIC0gbGluZTsKCgkvKiBDb3B5IHRoZSBsaW5lIGludG8gImJ1ZiIgYW5kIGFwcGVuZCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgbGluZSBpZgoJICogcG9zc2libGUuICovCglTVFJDUFkoYnVmLCBsaW5lKTsKCWlmIChsbnVtIDwgd3AtPndfYnVmZmVyLT5iX21sLm1sX2xpbmVfY291bnQpCgkgICAgc3BlbGxfY2F0X2xpbmUoYnVmICsgU1RSTEVOKGJ1ZiksIG1sX2dldChsbnVtICsgMSksIE1BWFdMRU4pOwoKCXAgPSBidWYgKyBza2lwOwoJZW5kcCA9IGJ1ZiArIGxlbjsKCXdoaWxlIChwIDwgZW5kcCkKCXsKCSAgICAvKiBXaGVuIHNlYXJjaGluZyBiYWNrd2FyZCBkb24ndCBzZWFyY2ggYWZ0ZXIgdGhlIGN1cnNvci4gIFVubGVzcwoJICAgICAqIHdlIHdyYXBwZWQgYXJvdW5kIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4gKi8KCSAgICBpZiAoZGlyID09IEJBQ0tXQVJECgkJICAgICYmIGxudW0gPT0gd3AtPndfY3Vyc29yLmxudW0KCQkgICAgJiYgIXdyYXBwZWQKCQkgICAgJiYgKGNvbG5yX1QpKHAgLSBidWYpID49IHdwLT53X2N1cnNvci5jb2wpCgkJYnJlYWs7CgoJICAgIC8qIHN0YXJ0IG9mIHdvcmQgKi8KCSAgICBhdHRyID0gSExGX0NPVU5UOwoJICAgIGxlbiA9IHNwZWxsX2NoZWNrKHdwLCBwLCAmYXR0ciwgJmNhcGNvbCwgRkFMU0UpOwoKCSAgICBpZiAoYXR0ciAhPSBITEZfQ09VTlQpCgkgICAgewoJCS8qIFdlIGZvdW5kIGEgYmFkIHdvcmQuICBDaGVjayB0aGUgYXR0cmlidXRlLiAqLwoJCWlmIChhbGx3b3JkcyB8fCBhdHRyID09IEhMRl9TUEIpCgkJewoJCSAgICBmb3VuZF9vbmUgPSBUUlVFOwoKCQkgICAgLyogV2hlbiBzZWFyY2hpbmcgZm9yd2FyZCBvbmx5IGFjY2VwdCBhIGJhZCB3b3JkIGFmdGVyCgkJICAgICAqIHRoZSBjdXJzb3IuICovCgkJICAgIGlmIChkaXIgPT0gQkFDS1dBUkQKCQkJICAgIHx8IGxudW0gIT0gd3AtPndfY3Vyc29yLmxudW0KCQkJICAgIHx8IChsbnVtID09IHdwLT53X2N1cnNvci5sbnVtCgkJCQkmJiAod3JhcHBlZAoJCQkJICAgIHx8IChjb2xucl9UKShjdXJsaW5lID8gcCAtIGJ1ZiArIGxlbgoJCQkJCQkgICAgIDogcCAtIGJ1ZikKCQkJCQkJICA+IHdwLT53X2N1cnNvci5jb2wpKSkKCQkgICAgewojIGlmZGVmIEZFQVRfU1lOX0hMCgkJCWlmIChoYXNfc3ludGF4KQoJCQl7CgkJCSAgICBjb2wgPSBwIC0gYnVmOwoJCQkgICAgKHZvaWQpc3luX2dldF9pZCh3cCwgbG51bSwgKGNvbG5yX1QpY29sLAoJCQkJCQkgICAgICAgRkFMU0UsICZjYW5fc3BlbGwpOwoJCQl9CgkJCWVsc2UKI2VuZGlmCgkJCSAgICBjYW5fc3BlbGwgPSBUUlVFOwoKCQkJaWYgKGNhbl9zcGVsbCkKCQkJewoJCQkgICAgZm91bmRfcG9zLmxudW0gPSBsbnVtOwoJCQkgICAgZm91bmRfcG9zLmNvbCA9IHAgLSBidWY7CiNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCgkJCSAgICBmb3VuZF9wb3MuY29sYWRkID0gMDsKI2VuZGlmCgkJCSAgICBpZiAoZGlyID09IEZPUldBUkQpCgkJCSAgICB7CgkJCQkvKiBObyBuZWVkIHRvIHNlYXJjaCBmdXJ0aGVyLiAqLwoJCQkJd3AtPndfY3Vyc29yID0gZm91bmRfcG9zOwoJCQkJdmltX2ZyZWUoYnVmKTsKCQkJCWlmIChhdHRycCAhPSBOVUxMKQoJCQkJICAgICphdHRycCA9IGF0dHI7CgkJCQlyZXR1cm4gbGVuOwoJCQkgICAgfQoJCQkgICAgZWxzZSBpZiAoY3VybGluZSkKCQkJCS8qIEluc2VydCBtb2RlIGNvbXBsZXRpb246IHB1dCBjdXJzb3IgYWZ0ZXIKCQkJCSAqIHRoZSBiYWQgd29yZC4gKi8KCQkJCWZvdW5kX3Bvcy5jb2wgKz0gbGVuOwoJCQkgICAgZm91bmRfbGVuID0gbGVuOwoJCQl9CgkJICAgIH0KCQl9CgkgICAgfQoKCSAgICAvKiBhZHZhbmNlIHRvIGNoYXJhY3RlciBhZnRlciB0aGUgd29yZCAqLwoJICAgIHAgKz0gbGVuOwoJICAgIGNhcGNvbCAtPSBsZW47Cgl9CgoJaWYgKGRpciA9PSBCQUNLV0FSRCAmJiBmb3VuZF9wb3MubG51bSAhPSAwKQoJewoJICAgIC8qIFVzZSB0aGUgbGFzdCBtYXRjaCBpbiB0aGUgbGluZSAoYmVmb3JlIHRoZSBjdXJzb3IpLiAqLwoJICAgIHdwLT53X2N1cnNvciA9IGZvdW5kX3BvczsKCSAgICB2aW1fZnJlZShidWYpOwoJICAgIHJldHVybiBmb3VuZF9sZW47Cgl9CgoJaWYgKGN1cmxpbmUpCgkgICAgYnJlYWs7CS8qIG9ubHkgY2hlY2sgY3Vyc29yIGxpbmUgKi8KCgkvKiBBZHZhbmNlIHRvIG5leHQgbGluZS4gKi8KCWlmIChkaXIgPT0gQkFDS1dBUkQpCgl7CgkgICAgLyogSWYgd2UgYXJlIGJhY2sgYXQgdGhlIHN0YXJ0aW5nIGxpbmUgYW5kIHNlYXJjaGVkIGl0IGFnYWluIHRoZXJlCgkgICAgICogaXMgbm8gbWF0Y2gsIGdpdmUgdXAuICovCgkgICAgaWYgKGxudW0gPT0gd3AtPndfY3Vyc29yLmxudW0gJiYgd3JhcHBlZCkKCQlicmVhazsKCgkgICAgaWYgKGxudW0gPiAxKQoJCS0tbG51bTsKCSAgICBlbHNlIGlmICghcF93cykKCQlicmVhazsJICAgIC8qIGF0IGZpcnN0IGxpbmUgYW5kICdub3dyYXBzY2FuJyAqLwoJICAgIGVsc2UKCSAgICB7CgkJLyogV3JhcCBhcm91bmQgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiAgTWF5IHNlYXJjaCB0aGUKCQkgKiBzdGFydGluZyBsaW5lIGFnYWluIGFuZCBhY2NlcHQgdGhlIGxhc3QgbWF0Y2guICovCgkJbG51bSA9IHdwLT53X2J1ZmZlci0+Yl9tbC5tbF9saW5lX2NvdW50OwoJCXdyYXBwZWQgPSBUUlVFOwoJCWlmICghc2hvcnRtZXNzKFNITV9TRUFSQ0gpKQoJCSAgICBnaXZlX3dhcm5pbmcoKGNoYXJfdSAqKV8odG9wX2JvdF9tc2cpLCBUUlVFKTsKCSAgICB9CgkgICAgY2FwY29sID0gLTE7Cgl9CgllbHNlCgl7CgkgICAgaWYgKGxudW0gPCB3cC0+d19idWZmZXItPmJfbWwubWxfbGluZV9jb3VudCkKCQkrK2xudW07CgkgICAgZWxzZSBpZiAoIXBfd3MpCgkJYnJlYWs7CSAgICAvKiBhdCBmaXJzdCBsaW5lIGFuZCAnbm93cmFwc2NhbicgKi8KCSAgICBlbHNlCgkgICAgewoJCS8qIFdyYXAgYXJvdW5kIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyLiAgTWF5IHNlYXJjaCB0aGUKCQkgKiBzdGFydGluZyBsaW5lIGFnYWluIGFuZCBhY2NlcHQgdGhlIGZpcnN0IG1hdGNoLiAqLwoJCWxudW0gPSAxOwoJCXdyYXBwZWQgPSBUUlVFOwoJCWlmICghc2hvcnRtZXNzKFNITV9TRUFSQ0gpKQoJCSAgICBnaXZlX3dhcm5pbmcoKGNoYXJfdSAqKV8oYm90X3RvcF9tc2cpLCBUUlVFKTsKCSAgICB9CgoJICAgIC8qIElmIHdlIGFyZSBiYWNrIGF0IHRoZSBzdGFydGluZyBsaW5lIGFuZCB0aGVyZSBpcyBubyBtYXRjaCB0aGVuCgkgICAgICogZ2l2ZSB1cC4gKi8KCSAgICBpZiAobG51bSA9PSB3cC0+d19jdXJzb3IubG51bSAmJiAhZm91bmRfb25lKQoJCWJyZWFrOwoKCSAgICAvKiBTa2lwIHRoZSBjaGFyYWN0ZXJzIGF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBsaW5lIHRoYXQgd2VyZQoJICAgICAqIGluY2x1ZGVkIGluIGEgbWF0Y2ggY3Jvc3NpbmcgbGluZSBib3VuZGFyaWVzLiAqLwoJICAgIGlmIChhdHRyID09IEhMRl9DT1VOVCkKCQlza2lwID0gcCAtIGVuZHA7CgkgICAgZWxzZQoJCXNraXAgPSAwOwoKCSAgICAvKiBDYXBzY29sIHNraXBzIG92ZXIgdGhlIGluc2VydGVkIHNwYWNlLiAqLwoJICAgIC0tY2FwY29sOwoKCSAgICAvKiBCdXQgYWZ0ZXIgZW1wdHkgbGluZSBjaGVjayBmaXJzdCB3b3JkIGluIG5leHQgbGluZSAqLwoJICAgIGlmICgqc2tpcHdoaXRlKGxpbmUpID09IE5VTCkKCQljYXBjb2wgPSAwOwoJfQoKCWxpbmVfYnJlYWtjaGVjaygpOwogICAgfQoKICAgIHZpbV9mcmVlKGJ1Zik7CiAgICByZXR1cm4gMDsKfQoKLyoKICogRm9yIHNwZWxsIGNoZWNraW5nOiBjb25jYXRlbmF0ZSB0aGUgc3RhcnQgb2YgdGhlIGZvbGxvd2luZyBsaW5lICJsaW5lIiBpbnRvCiAqICJidWYiLCBibGFua2luZy1vdXQgc3BlY2lhbCBjaGFyYWN0ZXJzLiAgQ29weSBsZXNzIHRoZW4gIm1heGxlbiIgYnl0ZXMuCiAqLwogICAgdm9pZApzcGVsbF9jYXRfbGluZShidWYsIGxpbmUsIG1heGxlbikKICAgIGNoYXJfdQkqYnVmOwogICAgY2hhcl91CSpsaW5lOwogICAgaW50CQltYXhsZW47CnsKICAgIGNoYXJfdQkqcDsKICAgIGludAkJbjsKCiAgICBwID0gc2tpcHdoaXRlKGxpbmUpOwogICAgd2hpbGUgKHZpbV9zdHJjaHIoKGNoYXJfdSAqKSIqIy9cIlx0IiwgKnApICE9IE5VTEwpCglwID0gc2tpcHdoaXRlKHAgKyAxKTsKCiAgICBpZiAoKnAgIT0gTlVMKQogICAgewoJKmJ1ZiA9ICcgJzsKCXZpbV9zdHJuY3B5KGJ1ZiArIDEsIGxpbmUsIG1heGxlbiAtIDIpOwoJbiA9IHAgLSBsaW5lOwoJaWYgKG4gPj0gbWF4bGVuKQoJICAgIG4gPSBtYXhsZW4gLSAxOwoJdmltX21lbXNldChidWYgKyAxLCAnICcsIG4pOwogICAgfQp9CgovKgogKiBTdHJ1Y3R1cmUgdXNlZCBmb3IgdGhlIGNvb2tpZSBhcmd1bWVudCBvZiBkb19pbl9ydW50aW1lcGF0aCgpLgogKi8KdHlwZWRlZiBzdHJ1Y3Qgc3BlbGxvYWRfUwp7CiAgICBjaGFyX3UgIHNsX2xhbmdbTUFYV0xFTiArIDFdOwkvKiBsYW5ndWFnZSBuYW1lICovCiAgICBzbGFuZ19UICpzbF9zbGFuZzsJCQkvKiByZXN1bHRpbmcgc2xhbmdfVCBzdHJ1Y3QgKi8KICAgIGludAkgICAgc2xfbm9icmVhazsJCQkvKiBOT0JSRUFLIGxhbmd1YWdlIGZvdW5kICovCn0gc3BlbGxvYWRfVDsKCi8qCiAqIExvYWQgd29yZCBsaXN0KHMpIGZvciAibGFuZyIgZnJvbSBWaW0gc3BlbGwgZmlsZShzKS4KICogImxhbmciIG11c3QgYmUgdGhlIGxhbmd1YWdlIHdpdGhvdXQgdGhlIHJlZ2lvbjogZS5nLiwgImVuIi4KICovCiAgICBzdGF0aWMgdm9pZApzcGVsbF9sb2FkX2xhbmcobGFuZykKICAgIGNoYXJfdQkqbGFuZzsKewogICAgY2hhcl91CWZuYW1lX2VuY1s4NV07CiAgICBpbnQJCXI7CiAgICBzcGVsbG9hZF9UCXNsOwojaWZkZWYgRkVBVF9BVVRPQ01ECiAgICBpbnQJCXJvdW5kOwojZW5kaWYKCiAgICAvKiBDb3B5IHRoZSBsYW5ndWFnZSBuYW1lIHRvIHBhc3MgaXQgdG8gc3BlbGxfbG9hZF9jYigpIGFzIGEgY29va2llLgogICAgICogSXQncyB0cnVuY2F0ZWQgd2hlbiBhbiBlcnJvciBpcyBkZXRlY3RlZC4gKi8KICAgIFNUUkNQWShzbC5zbF9sYW5nLCBsYW5nKTsKICAgIHNsLnNsX3NsYW5nID0gTlVMTDsKICAgIHNsLnNsX25vYnJlYWsgPSBGQUxTRTsKCiNpZmRlZiBGRUFUX0FVVE9DTUQKICAgIC8qIFdlIG1heSByZXRyeSB3aGVuIG5vIHNwZWxsIGZpbGUgaXMgZm91bmQgZm9yIHRoZSBsYW5ndWFnZSwgYW4KICAgICAqIGF1dG9jb21tYW5kIG1heSBsb2FkIGl0IHRoZW4uICovCiAgICBmb3IgKHJvdW5kID0gMTsgcm91bmQgPD0gMjsgKytyb3VuZCkKI2VuZGlmCiAgICB7CgkvKgoJICogRmluZCB0aGUgZmlyc3Qgc3BlbGwgZmlsZSBmb3IgImxhbmciIGluICdydW50aW1lcGF0aCcgYW5kIGxvYWQgaXQuCgkgKi8KCXZpbV9zbnByaW50ZigoY2hhciAqKWZuYW1lX2VuYywgc2l6ZW9mKGZuYW1lX2VuYykgLSA1LAoJCQkJCSJzcGVsbC8lcy4lcy5zcGwiLCBsYW5nLCBzcGVsbF9lbmMoKSk7CglyID0gZG9faW5fcnVudGltZXBhdGgoZm5hbWVfZW5jLCBGQUxTRSwgc3BlbGxfbG9hZF9jYiwgJnNsKTsKCglpZiAociA9PSBGQUlMICYmICpzbC5zbF9sYW5nICE9IE5VTCkKCXsKCSAgICAvKiBUcnkgbG9hZGluZyB0aGUgQVNDSUkgdmVyc2lvbi4gKi8KCSAgICB2aW1fc25wcmludGYoKGNoYXIgKilmbmFtZV9lbmMsIHNpemVvZihmbmFtZV9lbmMpIC0gNSwKCQkJCQkJICAic3BlbGwvJXMuYXNjaWkuc3BsIiwgbGFuZyk7CgkgICAgciA9IGRvX2luX3J1bnRpbWVwYXRoKGZuYW1lX2VuYywgRkFMU0UsIHNwZWxsX2xvYWRfY2IsICZzbCk7CgojaWZkZWYgRkVBVF9BVVRPQ01ECgkgICAgaWYgKHIgPT0gRkFJTCAmJiAqc2wuc2xfbGFuZyAhPSBOVUwgJiYgcm91bmQgPT0gMQoJCSAgICAmJiBhcHBseV9hdXRvY21kcyhFVkVOVF9TUEVMTEZJTEVNSVNTSU5HLCBsYW5nLAoJCQkJCSAgICAgIGN1cmJ1Zi0+Yl9mbmFtZSwgRkFMU0UsIGN1cmJ1ZikpCgkJY29udGludWU7CgkgICAgYnJlYWs7CiNlbmRpZgoJfQojaWZkZWYgRkVBVF9BVVRPQ01ECglicmVhazsKI2VuZGlmCiAgICB9CgogICAgaWYgKHIgPT0gRkFJTCkKICAgIHsKCXNtc2coKGNoYXJfdSAqKV8oIldhcm5pbmc6IENhbm5vdCBmaW5kIHdvcmQgbGlzdCBcIiVzLiVzLnNwbFwiIG9yIFwiJXMuYXNjaWkuc3BsXCIiKSwKCQkJCQkJICAgICBsYW5nLCBzcGVsbF9lbmMoKSwgbGFuZyk7CiAgICB9CiAgICBlbHNlIGlmIChzbC5zbF9zbGFuZyAhPSBOVUxMKQogICAgewoJLyogQXQgbGVhc3Qgb25lIGZpbGUgd2FzIGxvYWRlZCwgbm93IGxvYWQgQUxMIHRoZSBhZGRpdGlvbnMuICovCglTVFJDUFkoZm5hbWVfZW5jICsgU1RSTEVOKGZuYW1lX2VuYykgLSAzLCAiYWRkLnNwbCIpOwoJZG9faW5fcnVudGltZXBhdGgoZm5hbWVfZW5jLCBUUlVFLCBzcGVsbF9sb2FkX2NiLCAmc2wpOwogICAgfQp9CgovKgogKiBSZXR1cm4gdGhlIGVuY29kaW5nIHVzZWQgZm9yIHNwZWxsIGNoZWNraW5nOiBVc2UgJ2VuY29kaW5nJywgZXhjZXB0IHRoYXQgd2UKICogdXNlICJsYXRpbjEiIGZvciAibGF0aW45Ii4gIEFuZCBsaW1pdCB0byA2MCBjaGFyYWN0ZXJzIChqdXN0IGluIGNhc2UpLgogKi8KICAgIHN0YXRpYyBjaGFyX3UgKgpzcGVsbF9lbmMoKQp7CgojaWZkZWYgRkVBVF9NQllURQogICAgaWYgKFNUUkxFTihwX2VuYykgPCA2MCAmJiBTVFJDTVAocF9lbmMsICJpc28tODg1OS0xNSIpICE9IDApCglyZXR1cm4gcF9lbmM7CiNlbmRpZgogICAgcmV0dXJuIChjaGFyX3UgKikibGF0aW4xIjsKfQoKLyoKICogR2V0IHRoZSBuYW1lIG9mIHRoZSAuc3BsIGZpbGUgZm9yIHRoZSBpbnRlcm5hbCB3b3JkbGlzdCBpbnRvCiAqICJmbmFtZVtNQVhQQVRITF0iLgogKi8KICAgIHN0YXRpYyB2b2lkCmludF93b3JkbGlzdF9zcGwoZm5hbWUpCiAgICBjaGFyX3UJICAgICpmbmFtZTsKewogICAgdmltX3NucHJpbnRmKChjaGFyICopZm5hbWUsIE1BWFBBVEhMLCAiJXMuJXMuc3BsIiwKCQkJCQkJICBpbnRfd29yZGxpc3QsIHNwZWxsX2VuYygpKTsKfQoKLyoKICogQWxsb2NhdGUgYSBuZXcgc2xhbmdfVCBmb3IgbGFuZ3VhZ2UgImxhbmciLiAgImxhbmciIGNhbiBiZSBOVUxMLgogKiBDYWxsZXIgbXVzdCBmaWxsICJzbF9uZXh0Ii4KICovCiAgICBzdGF0aWMgc2xhbmdfVCAqCnNsYW5nX2FsbG9jKGxhbmcpCiAgICBjaGFyX3UJKmxhbmc7CnsKICAgIHNsYW5nX1QgKmxwOwoKICAgIGxwID0gKHNsYW5nX1QgKilhbGxvY19jbGVhcihzaXplb2Yoc2xhbmdfVCkpOwogICAgaWYgKGxwICE9IE5VTEwpCiAgICB7CglpZiAobGFuZyAhPSBOVUxMKQoJICAgIGxwLT5zbF9uYW1lID0gdmltX3N0cnNhdmUobGFuZyk7CglnYV9pbml0MigmbHAtPnNsX3JlcCwgc2l6ZW9mKGZyb210b19UKSwgMTApOwoJZ2FfaW5pdDIoJmxwLT5zbF9yZXBzYWwsIHNpemVvZihmcm9tdG9fVCksIDEwKTsKCWxwLT5zbF9jb21wbWF4ID0gTUFYV0xFTjsKCWxwLT5zbF9jb21wc3lsbWF4ID0gTUFYV0xFTjsKCWhhc2hfaW5pdCgmbHAtPnNsX3dvcmRjb3VudCk7CiAgICB9CgogICAgcmV0dXJuIGxwOwp9CgovKgogKiBGcmVlIHRoZSBjb250ZW50cyBvZiBhbiBzbGFuZ19UIGFuZCB0aGUgc3RydWN0dXJlIGl0c2VsZi4KICovCiAgICBzdGF0aWMgdm9pZApzbGFuZ19mcmVlKGxwKQogICAgc2xhbmdfVAkqbHA7CnsKICAgIHZpbV9mcmVlKGxwLT5zbF9uYW1lKTsKICAgIHZpbV9mcmVlKGxwLT5zbF9mbmFtZSk7CiAgICBzbGFuZ19jbGVhcihscCk7CiAgICB2aW1fZnJlZShscCk7Cn0KCi8qCiAqIENsZWFyIGFuIHNsYW5nX1Qgc28gdGhhdCB0aGUgZmlsZSBjYW4gYmUgcmVsb2FkZWQuCiAqLwogICAgc3RhdGljIHZvaWQKc2xhbmdfY2xlYXIobHApCiAgICBzbGFuZ19UCSpscDsKewogICAgZ2FycmF5X1QJKmdhcDsKICAgIGZyb210b19UCSpmdHA7CiAgICBzYWxpdGVtX1QJKnNtcDsKICAgIGludAkJaTsKICAgIGludAkJcm91bmQ7CgogICAgdmltX2ZyZWUobHAtPnNsX2ZieXRzKTsKICAgIGxwLT5zbF9mYnl0cyA9IE5VTEw7CiAgICB2aW1fZnJlZShscC0+c2xfa2J5dHMpOwogICAgbHAtPnNsX2tieXRzID0gTlVMTDsKICAgIHZpbV9mcmVlKGxwLT5zbF9wYnl0cyk7CiAgICBscC0+c2xfcGJ5dHMgPSBOVUxMOwoKICAgIHZpbV9mcmVlKGxwLT5zbF9maWR4cyk7CiAgICBscC0+c2xfZmlkeHMgPSBOVUxMOwogICAgdmltX2ZyZWUobHAtPnNsX2tpZHhzKTsKICAgIGxwLT5zbF9raWR4cyA9IE5VTEw7CiAgICB2aW1fZnJlZShscC0+c2xfcGlkeHMpOwogICAgbHAtPnNsX3BpZHhzID0gTlVMTDsKCiAgICBmb3IgKHJvdW5kID0gMTsgcm91bmQgPD0gMjsgKytyb3VuZCkKICAgIHsKCWdhcCA9IHJvdW5kID09IDEgPyAmbHAtPnNsX3JlcCA6ICZscC0+c2xfcmVwc2FsOwoJd2hpbGUgKGdhcC0+Z2FfbGVuID4gMCkKCXsKCSAgICBmdHAgPSAmKChmcm9tdG9fVCAqKWdhcC0+Z2FfZGF0YSlbLS1nYXAtPmdhX2xlbl07CgkgICAgdmltX2ZyZWUoZnRwLT5mdF9mcm9tKTsKCSAgICB2aW1fZnJlZShmdHAtPmZ0X3RvKTsKCX0KCWdhX2NsZWFyKGdhcCk7CiAgICB9CgogICAgZ2FwID0gJmxwLT5zbF9zYWw7CiAgICBpZiAobHAtPnNsX3NvZm8pCiAgICB7CgkvKiAiZ2FfbGVuIiBpcyBzZXQgdG8gMSB3aXRob3V0IGFkZGluZyBhbiBpdGVtIGZvciBsYXRpbjEgKi8KCWlmIChnYXAtPmdhX2RhdGEgIT0gTlVMTCkKCSAgICAvKiBTT0ZPRlJPTSBhbmQgU09GT1RPIGl0ZW1zOiBmcmVlIGxpc3RzIG9mIHdpZGUgY2hhcmFjdGVycy4gKi8KCSAgICBmb3IgKGkgPSAwOyBpIDwgZ2FwLT5nYV9sZW47ICsraSkKCQl2aW1fZnJlZSgoKGludCAqKilnYXAtPmdhX2RhdGEpW2ldKTsKICAgIH0KICAgIGVsc2UKCS8qIFNBTCBpdGVtczogZnJlZSBzYWxpdGVtX1QgaXRlbXMgKi8KCXdoaWxlIChnYXAtPmdhX2xlbiA+IDApCgl7CgkgICAgc21wID0gJigoc2FsaXRlbV9UICopZ2FwLT5nYV9kYXRhKVstLWdhcC0+Z2FfbGVuXTsKCSAgICB2aW1fZnJlZShzbXAtPnNtX2xlYWQpOwoJICAgIC8qIERvbid0IGZyZWUgc21fb25lb2YgYW5kIHNtX3J1bGVzLCB0aGV5IHBvaW50IGludG8gc21fbGVhZC4gKi8KCSAgICB2aW1fZnJlZShzbXAtPnNtX3RvKTsKI2lmZGVmIEZFQVRfTUJZVEUKCSAgICB2aW1fZnJlZShzbXAtPnNtX2xlYWRfdyk7CgkgICAgdmltX2ZyZWUoc21wLT5zbV9vbmVvZl93KTsKCSAgICB2aW1fZnJlZShzbXAtPnNtX3RvX3cpOwojZW5kaWYKCX0KICAgIGdhX2NsZWFyKGdhcCk7CgogICAgZm9yIChpID0gMDsgaSA8IGxwLT5zbF9wcmVmaXhjbnQ7ICsraSkKCXZpbV9mcmVlKGxwLT5zbF9wcmVmcHJvZ1tpXSk7CiAgICBscC0+c2xfcHJlZml4Y250ID0gMDsKICAgIHZpbV9mcmVlKGxwLT5zbF9wcmVmcHJvZyk7CiAgICBscC0+c2xfcHJlZnByb2cgPSBOVUxMOwoKICAgIHZpbV9mcmVlKGxwLT5zbF9pbmZvKTsKICAgIGxwLT5zbF9pbmZvID0gTlVMTDsKCiAgICB2aW1fZnJlZShscC0+c2xfbWlkd29yZCk7CiAgICBscC0+c2xfbWlkd29yZCA9IE5VTEw7CgogICAgdmltX2ZyZWUobHAtPnNsX2NvbXBwcm9nKTsKICAgIHZpbV9mcmVlKGxwLT5zbF9jb21wc3RhcnRmbGFncyk7CiAgICB2aW1fZnJlZShscC0+c2xfY29tcGFsbGZsYWdzKTsKICAgIGxwLT5zbF9jb21wcHJvZyA9IE5VTEw7CiAgICBscC0+c2xfY29tcHN0YXJ0ZmxhZ3MgPSBOVUxMOwogICAgbHAtPnNsX2NvbXBhbGxmbGFncyA9IE5VTEw7CgogICAgdmltX2ZyZWUobHAtPnNsX3N5bGxhYmxlKTsKICAgIGxwLT5zbF9zeWxsYWJsZSA9IE5VTEw7CiAgICBnYV9jbGVhcigmbHAtPnNsX3N5bF9pdGVtcyk7CgogICAgZ2FfY2xlYXJfc3RyaW5ncygmbHAtPnNsX2NvbXBwYXQpOwoKICAgIGhhc2hfY2xlYXJfYWxsKCZscC0+c2xfd29yZGNvdW50LCBXQ19LRVlfT0ZGKTsKICAgIGhhc2hfaW5pdCgmbHAtPnNsX3dvcmRjb3VudCk7CgojaWZkZWYgRkVBVF9NQllURQogICAgaGFzaF9jbGVhcl9hbGwoJmxwLT5zbF9tYXBfaGFzaCwgMCk7CiNlbmRpZgoKICAgIC8qIENsZWFyIGluZm8gZnJvbSAuc3VnIGZpbGUuICovCiAgICBzbGFuZ19jbGVhcl9zdWcobHApOwoKICAgIGxwLT5zbF9jb21wbWF4ID0gTUFYV0xFTjsKICAgIGxwLT5zbF9jb21wbWlubGVuID0gMDsKICAgIGxwLT5zbF9jb21wc3lsbWF4ID0gTUFYV0xFTjsKICAgIGxwLT5zbF9yZWdpb25zWzBdID0gTlVMOwp9CgovKgogKiBDbGVhciB0aGUgaW5mbyBmcm9tIHRoZSAuc3VnIGZpbGUgaW4gImxwIi4KICovCiAgICBzdGF0aWMgdm9pZApzbGFuZ19jbGVhcl9zdWcobHApCiAgICBzbGFuZ19UCSpscDsKewogICAgdmltX2ZyZWUobHAtPnNsX3NieXRzKTsKICAgIGxwLT5zbF9zYnl0cyA9IE5VTEw7CiAgICB2aW1fZnJlZShscC0+c2xfc2lkeHMpOwogICAgbHAtPnNsX3NpZHhzID0gTlVMTDsKICAgIGNsb3NlX3NwZWxsYnVmKGxwLT5zbF9zdWdidWYpOwogICAgbHAtPnNsX3N1Z2J1ZiA9IE5VTEw7CiAgICBscC0+c2xfc3VnbG9hZGVkID0gRkFMU0U7CiAgICBscC0+c2xfc3VndGltZSA9IDA7Cn0KCi8qCiAqIExvYWQgb25lIHNwZWxsIGZpbGUgYW5kIHN0b3JlIHRoZSBpbmZvIGludG8gYSBzbGFuZ19ULgogKiBJbnZva2VkIHRocm91Z2ggZG9faW5fcnVudGltZXBhdGgoKS4KICovCiAgICBzdGF0aWMgdm9pZApzcGVsbF9sb2FkX2NiKGZuYW1lLCBjb29raWUpCiAgICBjaGFyX3UJKmZuYW1lOwogICAgdm9pZAkqY29va2llOwp7CiAgICBzcGVsbG9hZF9UCSpzbHAgPSAoc3BlbGxvYWRfVCAqKWNvb2tpZTsKICAgIHNsYW5nX1QJKnNsYW5nOwoKICAgIHNsYW5nID0gc3BlbGxfbG9hZF9maWxlKGZuYW1lLCBzbHAtPnNsX2xhbmcsIE5VTEwsIEZBTFNFKTsKICAgIGlmIChzbGFuZyAhPSBOVUxMKQogICAgewoJLyogV2hlbiBhIHByZXZpb3VzbHkgbG9hZGVkIGZpbGUgaGFzIE5PQlJFQUsgYWxzbyB1c2UgaXQgZm9yIHRoZQoJICogIi5hZGQiIGZpbGVzLiAqLwoJaWYgKHNscC0+c2xfbm9icmVhayAmJiBzbGFuZy0+c2xfYWRkKQoJICAgIHNsYW5nLT5zbF9ub2JyZWFrID0gVFJVRTsKCWVsc2UgaWYgKHNsYW5nLT5zbF9ub2JyZWFrKQoJICAgIHNscC0+c2xfbm9icmVhayA9IFRSVUU7CgoJc2xwLT5zbF9zbGFuZyA9IHNsYW5nOwogICAgfQp9CgovKgogKiBMb2FkIG9uZSBzcGVsbCBmaWxlIGFuZCBzdG9yZSB0aGUgaW5mbyBpbnRvIGEgc2xhbmdfVC4KICoKICogVGhpcyBpcyBpbnZva2VkIGluIHRocmVlIHdheXM6CiAqIC0gRnJvbSBzcGVsbF9sb2FkX2NiKCkgdG8gbG9hZCBhIHNwZWxsIGZpbGUgZm9yIHRoZSBmaXJzdCB0aW1lLiAgImxhbmciIGlzCiAqICAgdGhlIGxhbmd1YWdlIG5hbWUsICJvbGRfbHAiIGlzIE5VTEwuICBXaWxsIGFsbG9jYXRlIGFuIHNsYW5nX1QuCiAqIC0gVG8gcmVsb2FkIGEgc3BlbGwgZmlsZSB0aGF0IHdhcyBjaGFuZ2VkLiAgImxhbmciIGlzIE5VTEwgYW5kICJvbGRfbHAiCiAqICAgcG9pbnRzIHRvIHRoZSBleGlzdGluZyBzbGFuZ19ULgogKiAtIEp1c3QgYWZ0ZXIgd3JpdGluZyBhIC5zcGwgZmlsZTsgaXQncyByZWFkIGJhY2sgdG8gcHJvZHVjZSB0aGUgLnN1ZyBmaWxlLgogKiAgICJvbGRfbHAiIGlzIE5VTEwgYW5kICJsYW5nIiBpcyBOVUxMLiAgV2lsbCBhbGxvY2F0ZSBhbiBzbGFuZ19ULgogKgogKiBSZXR1cm5zIHRoZSBzbGFuZ19UIHRoZSBzcGVsbCBmaWxlIHdhcyBsb2FkZWQgaW50by4gIE5VTEwgZm9yIGVycm9yLgogKi8KICAgIHN0YXRpYyBzbGFuZ19UICoKc3BlbGxfbG9hZF9maWxlKGZuYW1lLCBsYW5nLCBvbGRfbHAsIHNpbGVudCkKICAgIGNoYXJfdQkqZm5hbWU7CiAgICBjaGFyX3UJKmxhbmc7CiAgICBzbGFuZ19UCSpvbGRfbHA7CiAgICBpbnQJCXNpbGVudDsJCS8qIG5vIGVycm9yIGlmIGZpbGUgZG9lc24ndCBleGlzdCAqLwp7CiAgICBGSUxFCSpmZDsKICAgIGNoYXJfdQlidWZbVklNU1BFTExNQUdJQ0xdOwogICAgY2hhcl91CSpwOwogICAgaW50CQlpOwogICAgaW50CQluOwogICAgaW50CQlsZW47CiAgICBjaGFyX3UJKnNhdmVfc291cmNpbmdfbmFtZSA9IHNvdXJjaW5nX25hbWU7CiAgICBsaW5lbnJfVAlzYXZlX3NvdXJjaW5nX2xudW0gPSBzb3VyY2luZ19sbnVtOwogICAgc2xhbmdfVAkqbHAgPSBOVUxMOwogICAgaW50CQljID0gMDsKICAgIGludAkJcmVzOwoKICAgIGZkID0gbWNoX2ZvcGVuKChjaGFyICopZm5hbWUsICJyIik7CiAgICBpZiAoZmQgPT0gTlVMTCkKICAgIHsKCWlmICghc2lsZW50KQoJICAgIEVNU0cyKF8oZV9ub3RvcGVuKSwgZm5hbWUpOwoJZWxzZSBpZiAocF92ZXJib3NlID4gMikKCXsKCSAgICB2ZXJib3NlX2VudGVyKCk7CgkgICAgc21zZygoY2hhcl91ICopZV9ub3RvcGVuLCBmbmFtZSk7CgkgICAgdmVyYm9zZV9sZWF2ZSgpOwoJfQoJZ290byBlbmRGQUlMOwogICAgfQogICAgaWYgKHBfdmVyYm9zZSA+IDIpCiAgICB7Cgl2ZXJib3NlX2VudGVyKCk7CglzbXNnKChjaGFyX3UgKilfKCJSZWFkaW5nIHNwZWxsIGZpbGUgXCIlc1wiIiksIGZuYW1lKTsKCXZlcmJvc2VfbGVhdmUoKTsKICAgIH0KCiAgICBpZiAob2xkX2xwID09IE5VTEwpCiAgICB7CglscCA9IHNsYW5nX2FsbG9jKGxhbmcpOwoJaWYgKGxwID09IE5VTEwpCgkgICAgZ290byBlbmRGQUlMOwoKCS8qIFJlbWVtYmVyIHRoZSBmaWxlIG5hbWUsIHVzZWQgdG8gcmVsb2FkIHRoZSBmaWxlIHdoZW4gaXQncyB1cGRhdGVkLiAqLwoJbHAtPnNsX2ZuYW1lID0gdmltX3N0cnNhdmUoZm5hbWUpOwoJaWYgKGxwLT5zbF9mbmFtZSA9PSBOVUxMKQoJICAgIGdvdG8gZW5kRkFJTDsKCgkvKiBDaGVjayBmb3IgLmFkZC5zcGwuICovCglscC0+c2xfYWRkID0gc3Ryc3RyKChjaGFyICopZ2V0dGFpbChmbmFtZSksICIuYWRkLiIpICE9IE5VTEw7CiAgICB9CiAgICBlbHNlCglscCA9IG9sZF9scDsKCiAgICAvKiBTZXQgc291cmNpbmdfbmFtZSwgc28gdGhhdCBlcnJvciBtZXNzYWdlcyBtZW50aW9uIHRoZSBmaWxlIG5hbWUuICovCiAgICBzb3VyY2luZ19uYW1lID0gZm5hbWU7CiAgICBzb3VyY2luZ19sbnVtID0gMDsKCiAgICAvKgogICAgICogPEhFQURFUj46IDxmaWxlSUQ+CiAgICAgKi8KICAgIGZvciAoaSA9IDA7IGkgPCBWSU1TUEVMTE1BR0lDTDsgKytpKQoJYnVmW2ldID0gZ2V0YyhmZCk7CQkJCS8qIDxmaWxlSUQ+ICovCiAgICBpZiAoU1RSTkNNUChidWYsIFZJTVNQRUxMTUFHSUMsIFZJTVNQRUxMTUFHSUNMKSAhPSAwKQogICAgewoJRU1TRyhfKCJFNzU3OiBUaGlzIGRvZXMgbm90IGxvb2sgbGlrZSBhIHNwZWxsIGZpbGUiKSk7Cglnb3RvIGVuZEZBSUw7CiAgICB9CiAgICBjID0gZ2V0YyhmZCk7CQkJCQkvKiA8dmVyc2lvbm5yPiAqLwogICAgaWYgKGMgPCBWSU1TUEVMTFZFUlNJT04pCiAgICB7CglFTVNHKF8oIkU3NzE6IE9sZCBzcGVsbCBmaWxlLCBuZWVkcyB0byBiZSB1cGRhdGVkIikpOwoJZ290byBlbmRGQUlMOwogICAgfQogICAgZWxzZSBpZiAoYyA+IFZJTVNQRUxMVkVSU0lPTikKICAgIHsKCUVNU0coXygiRTc3MjogU3BlbGwgZmlsZSBpcyBmb3IgbmV3ZXIgdmVyc2lvbiBvZiBWaW0iKSk7Cglnb3RvIGVuZEZBSUw7CiAgICB9CgoKICAgIC8qCiAgICAgKiA8U0VDVElPTlM+OiA8c2VjdGlvbj4gLi4uIDxzZWN0aW9uZW5kPgogICAgICogPHNlY3Rpb24+OiA8c2VjdGlvbklEPiA8c2VjdGlvbmZsYWdzPiA8c2VjdGlvbmxlbj4gKHNlY3Rpb24gY29udGVudHMpCiAgICAgKi8KICAgIGZvciAoOzspCiAgICB7CgluID0gZ2V0YyhmZCk7CQkJICAgIC8qIDxzZWN0aW9uSUQ+IG9yIDxzZWN0aW9uZW5kPiAqLwoJaWYgKG4gPT0gU05fRU5EKQoJICAgIGJyZWFrOwoJYyA9IGdldGMoZmQpOwkJCQkJLyogPHNlY3Rpb25mbGFncz4gKi8KCWxlbiA9IGdldDRjKGZkKTsJCQkJLyogPHNlY3Rpb25sZW4+ICovCglpZiAobGVuIDwgMCkKCSAgICBnb3RvIHRydW5jZXJyOwoKCXJlcyA9IDA7Cglzd2l0Y2ggKG4pCgl7CgkgICAgY2FzZSBTTl9JTkZPOgoJCWxwLT5zbF9pbmZvID0gcmVhZF9zdHJpbmcoZmQsIGxlbik7CS8qIDxpbmZvdGV4dD4gKi8KCQlpZiAobHAtPnNsX2luZm8gPT0gTlVMTCkKCQkgICAgZ290byBlbmRGQUlMOwoJCWJyZWFrOwoKCSAgICBjYXNlIFNOX1JFR0lPTjoKCQlyZXMgPSByZWFkX3JlZ2lvbl9zZWN0aW9uKGZkLCBscCwgbGVuKTsKCQlicmVhazsKCgkgICAgY2FzZSBTTl9DSEFSRkxBR1M6CgkJcmVzID0gcmVhZF9jaGFyZmxhZ3Nfc2VjdGlvbihmZCk7CgkJYnJlYWs7CgoJICAgIGNhc2UgU05fTUlEV09SRDoKCQlscC0+c2xfbWlkd29yZCA9IHJlYWRfc3RyaW5nKGZkLCBsZW4pOwkvKiA8bWlkd29yZD4gKi8KCQlpZiAobHAtPnNsX21pZHdvcmQgPT0gTlVMTCkKCQkgICAgZ290byBlbmRGQUlMOwoJCWJyZWFrOwoKCSAgICBjYXNlIFNOX1BSRUZDT05EOgoJCXJlcyA9IHJlYWRfcHJlZmNvbmRfc2VjdGlvbihmZCwgbHApOwoJCWJyZWFrOwoKCSAgICBjYXNlIFNOX1JFUDoKCQlyZXMgPSByZWFkX3JlcF9zZWN0aW9uKGZkLCAmbHAtPnNsX3JlcCwgbHAtPnNsX3JlcF9maXJzdCk7CgkJYnJlYWs7CgoJICAgIGNhc2UgU05fUkVQU0FMOgoJCXJlcyA9IHJlYWRfcmVwX3NlY3Rpb24oZmQsICZscC0+c2xfcmVwc2FsLCBscC0+c2xfcmVwc2FsX2ZpcnN0KTsKCQlicmVhazsKCgkgICAgY2FzZSBTTl9TQUw6CgkJcmVzID0gcmVhZF9zYWxfc2VjdGlvbihmZCwgbHApOwoJCWJyZWFrOwoKCSAgICBjYXNlIFNOX1NPRk86CgkJcmVzID0gcmVhZF9zb2ZvX3NlY3Rpb24oZmQsIGxwKTsKCQlicmVhazsKCgkgICAgY2FzZSBTTl9NQVA6CgkJcCA9IHJlYWRfc3RyaW5nKGZkLCBsZW4pOwkJLyogPG1hcHN0cj4gKi8KCQlpZiAocCA9PSBOVUxMKQoJCSAgICBnb3RvIGVuZEZBSUw7CgkJc2V0X21hcF9zdHIobHAsIHApOwoJCXZpbV9mcmVlKHApOwoJCWJyZWFrOwoKCSAgICBjYXNlIFNOX1dPUkRTOgoJCXJlcyA9IHJlYWRfd29yZHNfc2VjdGlvbihmZCwgbHAsIGxlbik7CgkJYnJlYWs7CgoJICAgIGNhc2UgU05fU1VHRklMRToKCQlscC0+c2xfc3VndGltZSA9IGdldDhjKGZkKTsJCS8qIDx0aW1lc3RhbXA+ICovCgkJYnJlYWs7CgoJICAgIGNhc2UgU05fTk9TUExJVFNVR1M6CgkJbHAtPnNsX25vc3BsaXRzdWdzID0gVFJVRTsJCS8qIDx0aW1lc3RhbXA+ICovCgkJYnJlYWs7CgoJICAgIGNhc2UgU05fQ09NUE9VTkQ6CgkJcmVzID0gcmVhZF9jb21wb3VuZChmZCwgbHAsIGxlbik7CgkJYnJlYWs7CgoJICAgIGNhc2UgU05fTk9CUkVBSzoKCQlscC0+c2xfbm9icmVhayA9IFRSVUU7CgkJYnJlYWs7CgoJICAgIGNhc2UgU05fU1lMTEFCTEU6CgkJbHAtPnNsX3N5bGxhYmxlID0gcmVhZF9zdHJpbmcoZmQsIGxlbik7CS8qIDxzeWxsYWJsZT4gKi8KCQlpZiAobHAtPnNsX3N5bGxhYmxlID09IE5VTEwpCgkJICAgIGdvdG8gZW5kRkFJTDsKCQlpZiAoaW5pdF9zeWxfdGFiKGxwKSA9PSBGQUlMKQoJCSAgICBnb3RvIGVuZEZBSUw7CgkJYnJlYWs7CgoJICAgIGRlZmF1bHQ6CgkJLyogVW5zdXBwb3J0ZWQgc2VjdGlvbi4gIFdoZW4gaXQncyByZXF1aXJlZCBnaXZlIGFuIGVycm9yCgkJICogbWVzc2FnZS4gIFdoZW4gaXQncyBub3QgcmVxdWlyZWQgc2tpcCB0aGUgY29udGVudHMuICovCgkJaWYgKGMgJiBTTkZfUkVRVUlSRUQpCgkJewoJCSAgICBFTVNHKF8oIkU3NzA6IFVuc3VwcG9ydGVkIHNlY3Rpb24gaW4gc3BlbGwgZmlsZSIpKTsKCQkgICAgZ290byBlbmRGQUlMOwoJCX0KCQl3aGlsZSAoLS1sZW4gPj0gMCkKCQkgICAgaWYgKGdldGMoZmQpIDwgMCkKCQkJZ290byB0cnVuY2VycjsKCQlicmVhazsKCX0Kc29tZWVycm9yOgoJaWYgKHJlcyA9PSBTUF9GT1JNRVJST1IpCgl7CgkgICAgRU1TRyhfKGVfZm9ybWF0KSk7CgkgICAgZ290byBlbmRGQUlMOwoJfQoJaWYgKHJlcyA9PSBTUF9UUlVOQ0VSUk9SKQoJewp0cnVuY2VycjoKCSAgICBFTVNHKF8oZV9zcGVsbF90cnVuYykpOwoJICAgIGdvdG8gZW5kRkFJTDsKCX0KCWlmIChyZXMgPT0gU1BfT1RIRVJFUlJPUikKCSAgICBnb3RvIGVuZEZBSUw7CiAgICB9CgogICAgLyogPExXT1JEVFJFRT4gKi8KICAgIHJlcyA9IHNwZWxsX3JlYWRfdHJlZShmZCwgJmxwLT5zbF9mYnl0cywgJmxwLT5zbF9maWR4cywgRkFMU0UsIDApOwogICAgaWYgKHJlcyAhPSAwKQoJZ290byBzb21lZXJyb3I7CgogICAgLyogPEtXT1JEVFJFRT4gKi8KICAgIHJlcyA9IHNwZWxsX3JlYWRfdHJlZShmZCwgJmxwLT5zbF9rYnl0cywgJmxwLT5zbF9raWR4cywgRkFMU0UsIDApOwogICAgaWYgKHJlcyAhPSAwKQoJZ290byBzb21lZXJyb3I7CgogICAgLyogPFBSRUZJWFRSRUU+ICovCiAgICByZXMgPSBzcGVsbF9yZWFkX3RyZWUoZmQsICZscC0+c2xfcGJ5dHMsICZscC0+c2xfcGlkeHMsIFRSVUUsCgkJCQkJCQkgICAgbHAtPnNsX3ByZWZpeGNudCk7CiAgICBpZiAocmVzICE9IDApCglnb3RvIHNvbWVlcnJvcjsKCiAgICAvKiBGb3IgYSBuZXcgZmlsZSBsaW5rIGl0IGluIHRoZSBsaXN0IG9mIHNwZWxsIGZpbGVzLiAqLwogICAgaWYgKG9sZF9scCA9PSBOVUxMICYmIGxhbmcgIT0gTlVMTCkKICAgIHsKCWxwLT5zbF9uZXh0ID0gZmlyc3RfbGFuZzsKCWZpcnN0X2xhbmcgPSBscDsKICAgIH0KCiAgICBnb3RvIGVuZE9LOwoKZW5kRkFJTDoKICAgIGlmIChsYW5nICE9IE5VTEwpCgkvKiB0cnVuY2F0aW5nIHRoZSBuYW1lIHNpZ25hbHMgdGhlIGVycm9yIHRvIHNwZWxsX2xvYWRfbGFuZygpICovCgkqbGFuZyA9IE5VTDsKICAgIGlmIChscCAhPSBOVUxMICYmIG9sZF9scCA9PSBOVUxMKQoJc2xhbmdfZnJlZShscCk7CiAgICBscCA9IE5VTEw7CgplbmRPSzoKICAgIGlmIChmZCAhPSBOVUxMKQoJZmNsb3NlKGZkKTsKICAgIHNvdXJjaW5nX25hbWUgPSBzYXZlX3NvdXJjaW5nX25hbWU7CiAgICBzb3VyY2luZ19sbnVtID0gc2F2ZV9zb3VyY2luZ19sbnVtOwoKICAgIHJldHVybiBscDsKfQoKLyoKICogUmVhZCAyIGJ5dGVzIGZyb20gImZkIiBhbmQgdHVybiB0aGVtIGludG8gYW4gaW50LCBNU0IgZmlyc3QuCiAqLwogICAgc3RhdGljIGludApnZXQyYyhmZCkKICAgIEZJTEUJKmZkOwp7CiAgICBsb25nCW47CgogICAgbiA9IGdldGMoZmQpOwogICAgbiA9IChuIDw8IDgpICsgZ2V0YyhmZCk7CiAgICByZXR1cm4gbjsKfQoKLyoKICogUmVhZCAzIGJ5dGVzIGZyb20gImZkIiBhbmQgdHVybiB0aGVtIGludG8gYW4gaW50LCBNU0IgZmlyc3QuCiAqLwogICAgc3RhdGljIGludApnZXQzYyhmZCkKICAgIEZJTEUJKmZkOwp7CiAgICBsb25nCW47CgogICAgbiA9IGdldGMoZmQpOwogICAgbiA9IChuIDw8IDgpICsgZ2V0YyhmZCk7CiAgICBuID0gKG4gPDwgOCkgKyBnZXRjKGZkKTsKICAgIHJldHVybiBuOwp9CgovKgogKiBSZWFkIDQgYnl0ZXMgZnJvbSAiZmQiIGFuZCB0dXJuIHRoZW0gaW50byBhbiBpbnQsIE1TQiBmaXJzdC4KICovCiAgICBzdGF0aWMgaW50CmdldDRjKGZkKQogICAgRklMRQkqZmQ7CnsKICAgIGxvbmcJbjsKCiAgICBuID0gZ2V0YyhmZCk7CiAgICBuID0gKG4gPDwgOCkgKyBnZXRjKGZkKTsKICAgIG4gPSAobiA8PCA4KSArIGdldGMoZmQpOwogICAgbiA9IChuIDw8IDgpICsgZ2V0YyhmZCk7CiAgICByZXR1cm4gbjsKfQoKLyoKICogUmVhZCA4IGJ5dGVzIGZyb20gImZkIiBhbmQgdHVybiB0aGVtIGludG8gYSB0aW1lX3QsIE1TQiBmaXJzdC4KICovCiAgICBzdGF0aWMgdGltZV90CmdldDhjKGZkKQogICAgRklMRQkqZmQ7CnsKICAgIHRpbWVfdAluID0gMDsKICAgIGludAkJaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKQoJbiA9IChuIDw8IDgpICsgZ2V0YyhmZCk7CiAgICByZXR1cm4gbjsKfQoKLyoKICogUmVhZCBhIGxlbmd0aCBmaWVsZCBmcm9tICJmZCIgaW4gImNudF9ieXRlcyIgYnl0ZXMuCiAqIEFsbG9jYXRlIG1lbW9yeSwgcmVhZCB0aGUgc3RyaW5nIGludG8gaXQgYW5kIGFkZCBhIE5VTCBhdCB0aGUgZW5kLgogKiBSZXR1cm5zIE5VTEwgd2hlbiB0aGUgY291bnQgaXMgemVyby4KICogU2V0cyAiKmNudHAiIHRvIFNQXypFUlJPUiB3aGVuIHRoZXJlIGlzIGFuIGVycm9yLCBsZW5ndGggb2YgdGhlIHJlc3VsdAogKiBvdGhlcndpc2UuCiAqLwogICAgc3RhdGljIGNoYXJfdSAqCnJlYWRfY250X3N0cmluZyhmZCwgY250X2J5dGVzLCBjbnRwKQogICAgRklMRQkqZmQ7CiAgICBpbnQJCWNudF9ieXRlczsKICAgIGludAkJKmNudHA7CnsKICAgIGludAkJY250ID0gMDsKICAgIGludAkJaTsKICAgIGNoYXJfdQkqc3RyOwoKICAgIC8qIHJlYWQgdGhlIGxlbmd0aCBieXRlcywgTVNCIGZpcnN0ICovCiAgICBmb3IgKGkgPSAwOyBpIDwgY250X2J5dGVzOyArK2kpCgljbnQgPSAoY250IDw8IDgpICsgZ2V0YyhmZCk7CiAgICBpZiAoY250IDwgMCkKICAgIHsKCSpjbnRwID0gU1BfVFJVTkNFUlJPUjsKCXJldHVybiBOVUxMOwogICAgfQogICAgKmNudHAgPSBjbnQ7CiAgICBpZiAoY250ID09IDApCglyZXR1cm4gTlVMTDsJICAgIC8qIG5vdGhpbmcgdG8gcmVhZCwgcmV0dXJuIE5VTEwgKi8KCiAgICBzdHIgPSByZWFkX3N0cmluZyhmZCwgY250KTsKICAgIGlmIChzdHIgPT0gTlVMTCkKCSpjbnRwID0gU1BfT1RIRVJFUlJPUjsKICAgIHJldHVybiBzdHI7Cn0KCi8qCiAqIFJlYWQgYSBzdHJpbmcgb2YgbGVuZ3RoICJjbnQiIGZyb20gImZkIiBpbnRvIGFsbG9jYXRlZCBtZW1vcnkuCiAqIFJldHVybnMgTlVMTCB3aGVuIG91dCBvZiBtZW1vcnkuCiAqLwogICAgc3RhdGljIGNoYXJfdSAqCnJlYWRfc3RyaW5nKGZkLCBjbnQpCiAgICBGSUxFCSpmZDsKICAgIGludAkJY250Owp7CiAgICBjaGFyX3UJKnN0cjsKICAgIGludAkJaTsKCiAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgKi8KICAgIHN0ciA9IGFsbG9jKCh1bnNpZ25lZCljbnQgKyAxKTsKICAgIGlmIChzdHIgIT0gTlVMTCkKICAgIHsKCS8qIFJlYWQgdGhlIHN0cmluZy4gIERvZXNuJ3QgY2hlY2sgZm9yIHRydW5jYXRlZCBmaWxlLiAqLwoJZm9yIChpID0gMDsgaSA8IGNudDsgKytpKQoJICAgIHN0cltpXSA9IGdldGMoZmQpOwoJc3RyW2ldID0gTlVMOwogICAgfQogICAgcmV0dXJuIHN0cjsKfQoKLyoKICogUmVhZCBTTl9SRUdJT046IDxyZWdpb25uYW1lPiAuLi4KICogUmV0dXJuIFNQXypFUlJPUiBmbGFncy4KICovCiAgICBzdGF0aWMgaW50CnJlYWRfcmVnaW9uX3NlY3Rpb24oZmQsIGxwLCBsZW4pCiAgICBGSUxFCSpmZDsKICAgIHNsYW5nX1QJKmxwOwogICAgaW50CQlsZW47CnsKICAgIGludAkJaTsKCiAgICBpZiAobGVuID4gMTYpCglyZXR1cm4gU1BfRk9STUVSUk9SOwogICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQoJbHAtPnNsX3JlZ2lvbnNbaV0gPSBnZXRjKGZkKTsJCQkvKiA8cmVnaW9ubmFtZT4gKi8KICAgIGxwLT5zbF9yZWdpb25zW2xlbl0gPSBOVUw7CiAgICByZXR1cm4gMDsKfQoKLyoKICogUmVhZCBTTl9DSEFSRkxBR1Mgc2VjdGlvbjogPGNoYXJmbGFnc2xlbj4gPGNoYXJmbGFncz4KICoJCQkJPGZvbGNoYXJzbGVuPiA8Zm9sY2hhcnM+CiAqIFJldHVybiBTUF8qRVJST1IgZmxhZ3MuCiAqLwogICAgc3RhdGljIGludApyZWFkX2NoYXJmbGFnc19zZWN0aW9uKGZkKQogICAgRklMRQkqZmQ7CnsKICAgIGNoYXJfdQkqZmxhZ3M7CiAgICBjaGFyX3UJKmZvbDsKICAgIGludAkJZmxhZ3NsZW4sIGZvbGxlbjsKCiAgICAvKiA8Y2hhcmZsYWdzbGVuPiA8Y2hhcmZsYWdzPiAqLwogICAgZmxhZ3MgPSByZWFkX2NudF9zdHJpbmcoZmQsIDEsICZmbGFnc2xlbik7CiAgICBpZiAoZmxhZ3NsZW4gPCAwKQoJcmV0dXJuIGZsYWdzbGVuOwoKICAgIC8qIDxmb2xjaGFyc2xlbj4gPGZvbGNoYXJzPiAqLwogICAgZm9sID0gcmVhZF9jbnRfc3RyaW5nKGZkLCAyLCAmZm9sbGVuKTsKICAgIGlmIChmb2xsZW4gPCAwKQogICAgewoJdmltX2ZyZWUoZmxhZ3MpOwoJcmV0dXJuIGZvbGxlbjsKICAgIH0KCiAgICAvKiBTZXQgdGhlIHdvcmQtY2hhciBmbGFncyBhbmQgZmlsbCBTUEVMTF9JU1VQUEVSKCkgdGFibGUuICovCiAgICBpZiAoZmxhZ3MgIT0gTlVMTCAmJiBmb2wgIT0gTlVMTCkKCXNldF9zcGVsbF9jaGFyZmxhZ3MoZmxhZ3MsIGZsYWdzbGVuLCBmb2wpOwoKICAgIHZpbV9mcmVlKGZsYWdzKTsKICAgIHZpbV9mcmVlKGZvbCk7CgogICAgLyogV2hlbiA8Y2hhcmZsYWdzbGVuPiBpcyB6ZXJvIHRoZW4gPGZjaGFybGVuPiBtdXN0IGFsc28gYmUgemVyby4gKi8KICAgIGlmICgoZmxhZ3MgPT0gTlVMTCkgIT0gKGZvbCA9PSBOVUxMKSkKCXJldHVybiBTUF9GT1JNRVJST1I7CiAgICByZXR1cm4gMDsKfQoKLyoKICogUmVhZCBTTl9QUkVGQ09ORCBzZWN0aW9uLgogKiBSZXR1cm4gU1BfKkVSUk9SIGZsYWdzLgogKi8KICAgIHN0YXRpYyBpbnQKcmVhZF9wcmVmY29uZF9zZWN0aW9uKGZkLCBscCkKICAgIEZJTEUJKmZkOwogICAgc2xhbmdfVAkqbHA7CnsKICAgIGludAkJY250OwogICAgaW50CQlpOwogICAgaW50CQluOwogICAgY2hhcl91CSpwOwogICAgY2hhcl91CWJ1ZltNQVhXTEVOICsgMV07CgogICAgLyogPHByZWZjb25kY250PiA8cHJlZmNvbmQ+IC4uLiAqLwogICAgY250ID0gZ2V0MmMoZmQpOwkJCQkJLyogPHByZWZjb25kY250PiAqLwogICAgaWYgKGNudCA8PSAwKQoJcmV0dXJuIFNQX0ZPUk1FUlJPUjsKCiAgICBscC0+c2xfcHJlZnByb2cgPSAocmVncHJvZ19UICoqKWFsbG9jX2NsZWFyKAoJCQkJCSAodW5zaWduZWQpc2l6ZW9mKHJlZ3Byb2dfVCAqKSAqIGNudCk7CiAgICBpZiAobHAtPnNsX3ByZWZwcm9nID09IE5VTEwpCglyZXR1cm4gU1BfT1RIRVJFUlJPUjsKICAgIGxwLT5zbF9wcmVmaXhjbnQgPSBjbnQ7CgogICAgZm9yIChpID0gMDsgaSA8IGNudDsgKytpKQogICAgewoJLyogPHByZWZjb25kPiA6IDxjb25kbGVuPiA8Y29uZHN0cj4gKi8KCW4gPSBnZXRjKGZkKTsJCQkJCS8qIDxjb25kbGVuPiAqLwoJaWYgKG4gPCAwIHx8IG4gPj0gTUFYV0xFTikKCSAgICByZXR1cm4gU1BfRk9STUVSUk9SOwoKCS8qIFdoZW4gPGNvbmRsZW4+IGlzIHplcm8gd2UgaGF2ZSBhbiBlbXB0eSBjb25kaXRpb24uICBPdGhlcndpc2UKCSAqIGNvbXBpbGUgdGhlIHJlZ2V4cCBwcm9ncmFtIHVzZWQgdG8gY2hlY2sgZm9yIHRoZSBjb25kaXRpb24uICovCglpZiAobiA+IDApCgl7CgkgICAgYnVmWzBdID0gJ14nOwkgICAgLyogYWx3YXlzIG1hdGNoIGF0IG9uZSBwb3NpdGlvbiBvbmx5ICovCgkgICAgcCA9IGJ1ZiArIDE7CgkgICAgd2hpbGUgKG4tLSA+IDApCgkJKnArKyA9IGdldGMoZmQpOwkJCS8qIDxjb25kc3RyPiAqLwoJICAgICpwID0gTlVMOwoJICAgIGxwLT5zbF9wcmVmcHJvZ1tpXSA9IHZpbV9yZWdjb21wKGJ1ZiwgUkVfTUFHSUMgKyBSRV9TVFJJTkcpOwoJfQogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qCiAqIFJlYWQgUkVQIG9yIFJFUFNBTCBpdGVtcyBzZWN0aW9uIGZyb20gImZkIjogPHJlcGNvdW50PiA8cmVwPiAuLi4KICogUmV0dXJuIFNQXypFUlJPUiBmbGFncy4KICovCiAgICBzdGF0aWMgaW50CnJlYWRfcmVwX3NlY3Rpb24oZmQsIGdhcCwgZmlyc3QpCiAgICBGSUxFCSpmZDsKICAgIGdhcnJheV9UCSpnYXA7CiAgICBzaG9ydAkqZmlyc3Q7CnsKICAgIGludAkJY250OwogICAgZnJvbXRvX1QJKmZ0cDsKICAgIGludAkJaTsKCiAgICBjbnQgPSBnZXQyYyhmZCk7CQkJCQkvKiA8cmVwY291bnQ+ICovCiAgICBpZiAoY250IDwgMCkKCXJldHVybiBTUF9UUlVOQ0VSUk9SOwoKICAgIGlmIChnYV9ncm93KGdhcCwgY250KSA9PSBGQUlMKQoJcmV0dXJuIFNQX09USEVSRVJST1I7CgogICAgLyogPHJlcD4gOiA8cmVwZnJvbWxlbj4gPHJlcGZyb20+IDxyZXB0b2xlbj4gPHJlcHRvPiAqLwogICAgZm9yICg7IGdhcC0+Z2FfbGVuIDwgY250OyArK2dhcC0+Z2FfbGVuKQogICAgewoJZnRwID0gJigoZnJvbXRvX1QgKilnYXAtPmdhX2RhdGEpW2dhcC0+Z2FfbGVuXTsKCWZ0cC0+ZnRfZnJvbSA9IHJlYWRfY250X3N0cmluZyhmZCwgMSwgJmkpOwoJaWYgKGkgPCAwKQoJICAgIHJldHVybiBpOwoJaWYgKGkgPT0gMCkKCSAgICByZXR1cm4gU1BfRk9STUVSUk9SOwoJZnRwLT5mdF90byA9IHJlYWRfY250X3N0cmluZyhmZCwgMSwgJmkpOwoJaWYgKGkgPD0gMCkKCXsKCSAgICB2aW1fZnJlZShmdHAtPmZ0X2Zyb20pOwoJICAgIGlmIChpIDwgMCkKCQlyZXR1cm4gaTsKCSAgICByZXR1cm4gU1BfRk9STUVSUk9SOwoJfQogICAgfQoKICAgIC8qIEZpbGwgdGhlIGZpcnN0LWluZGV4IHRhYmxlLiAqLwogICAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKQoJZmlyc3RbaV0gPSAtMTsKICAgIGZvciAoaSA9IDA7IGkgPCBnYXAtPmdhX2xlbjsgKytpKQogICAgewoJZnRwID0gJigoZnJvbXRvX1QgKilnYXAtPmdhX2RhdGEpW2ldOwoJaWYgKGZpcnN0WypmdHAtPmZ0X2Zyb21dID09IC0xKQoJICAgIGZpcnN0WypmdHAtPmZ0X2Zyb21dID0gaTsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKgogKiBSZWFkIFNOX1NBTCBzZWN0aW9uOiA8c2FsZmxhZ3M+IDxzYWxjb3VudD4gPHNhbD4gLi4uCiAqIFJldHVybiBTUF8qRVJST1IgZmxhZ3MuCiAqLwogICAgc3RhdGljIGludApyZWFkX3NhbF9zZWN0aW9uKGZkLCBzbGFuZykKICAgIEZJTEUJKmZkOwogICAgc2xhbmdfVAkqc2xhbmc7CnsKICAgIGludAkJaTsKICAgIGludAkJY250OwogICAgZ2FycmF5X1QJKmdhcDsKICAgIHNhbGl0ZW1fVAkqc21wOwogICAgaW50CQljY250OwogICAgY2hhcl91CSpwOwogICAgaW50CQljID0gTlVMOwoKICAgIHNsYW5nLT5zbF9zb2ZvID0gRkFMU0U7CgogICAgaSA9IGdldGMoZmQpOwkJCQkvKiA8c2FsZmxhZ3M+ICovCiAgICBpZiAoaSAmIFNBTF9GMExMT1dVUCkKCXNsYW5nLT5zbF9mb2xsb3d1cCA9IFRSVUU7CiAgICBpZiAoaSAmIFNBTF9DT0xMQVBTRSkKCXNsYW5nLT5zbF9jb2xsYXBzZSA9IFRSVUU7CiAgICBpZiAoaSAmIFNBTF9SRU1fQUNDRU5UUykKCXNsYW5nLT5zbF9yZW1fYWNjZW50cyA9IFRSVUU7CgogICAgY250ID0gZ2V0MmMoZmQpOwkJCQkvKiA8c2FsY291bnQ+ICovCiAgICBpZiAoY250IDwgMCkKCXJldHVybiBTUF9UUlVOQ0VSUk9SOwoKICAgIGdhcCA9ICZzbGFuZy0+c2xfc2FsOwogICAgZ2FfaW5pdDIoZ2FwLCBzaXplb2Yoc2FsaXRlbV9UKSwgMTApOwogICAgaWYgKGdhX2dyb3coZ2FwLCBjbnQgKyAxKSA9PSBGQUlMKQoJcmV0dXJuIFNQX09USEVSRVJST1I7CgogICAgLyogPHNhbD4gOiA8c2FsZnJvbWxlbj4gPHNhbGZyb20+IDxzYWx0b2xlbj4gPHNhbHRvPiAqLwogICAgZm9yICg7IGdhcC0+Z2FfbGVuIDwgY250OyArK2dhcC0+Z2FfbGVuKQogICAgewoJc21wID0gJigoc2FsaXRlbV9UICopZ2FwLT5nYV9kYXRhKVtnYXAtPmdhX2xlbl07CgljY250ID0gZ2V0YyhmZCk7CQkJLyogPHNhbGZyb21sZW4+ICovCglpZiAoY2NudCA8IDApCgkgICAgcmV0dXJuIFNQX1RSVU5DRVJST1I7CglpZiAoKHAgPSBhbGxvYyhjY250ICsgMikpID09IE5VTEwpCgkgICAgcmV0dXJuIFNQX09USEVSRVJST1I7CglzbXAtPnNtX2xlYWQgPSBwOwoKCS8qIFJlYWQgdXAgdG8gdGhlIGZpcnN0IHNwZWNpYWwgY2hhciBpbnRvIHNtX2xlYWQuICovCglmb3IgKGkgPSAwOyBpIDwgY2NudDsgKytpKQoJewoJICAgIGMgPSBnZXRjKGZkKTsJCQkvKiA8c2FsZnJvbT4gKi8KCSAgICBpZiAodmltX3N0cmNocigoY2hhcl91ICopIjAxMjM0NTY3ODkoLTxeJCIsIGMpICE9IE5VTEwpCgkJYnJlYWs7CgkgICAgKnArKyA9IGM7Cgl9CglzbXAtPnNtX2xlYWRsZW4gPSBwIC0gc21wLT5zbV9sZWFkOwoJKnArKyA9IE5VTDsKCgkvKiBQdXQgKGFiYykgY2hhcnMgaW4gc21fb25lb2YsIGlmIGFueS4gKi8KCWlmIChjID09ICcoJykKCXsKCSAgICBzbXAtPnNtX29uZW9mID0gcDsKCSAgICBmb3IgKCsraTsgaSA8IGNjbnQ7ICsraSkKCSAgICB7CgkJYyA9IGdldGMoZmQpOwkJCS8qIDxzYWxmcm9tPiAqLwoJCWlmIChjID09ICcpJykKCQkgICAgYnJlYWs7CgkJKnArKyA9IGM7CgkgICAgfQoJICAgICpwKysgPSBOVUw7CgkgICAgaWYgKCsraSA8IGNjbnQpCgkJYyA9IGdldGMoZmQpOwoJfQoJZWxzZQoJICAgIHNtcC0+c21fb25lb2YgPSBOVUxMOwoKCS8qIEFueSBmb2xsb3dpbmcgY2hhcnMgZ28gaW4gc21fcnVsZXMuICovCglzbXAtPnNtX3J1bGVzID0gcDsKCWlmIChpIDwgY2NudCkKCSAgICAvKiBzdG9yZSB0aGUgY2hhciB3ZSBnb3Qgd2hpbGUgY2hlY2tpbmcgZm9yIGVuZCBvZiBzbV9sZWFkICovCgkgICAgKnArKyA9IGM7Cglmb3IgKCsraTsgaSA8IGNjbnQ7ICsraSkKCSAgICAqcCsrID0gZ2V0YyhmZCk7CQkJLyogPHNhbGZyb20+ICovCgkqcCsrID0gTlVMOwoKCS8qIDxzYWx0b2xlbj4gPHNhbHRvPiAqLwoJc21wLT5zbV90byA9IHJlYWRfY250X3N0cmluZyhmZCwgMSwgJmNjbnQpOwoJaWYgKGNjbnQgPCAwKQoJewoJICAgIHZpbV9mcmVlKHNtcC0+c21fbGVhZCk7CgkgICAgcmV0dXJuIGNjbnQ7Cgl9CgojaWZkZWYgRkVBVF9NQllURQoJaWYgKGhhc19tYnl0ZSkKCXsKCSAgICAvKiBjb252ZXJ0IHRoZSBtdWx0aS1ieXRlIHN0cmluZ3MgdG8gd2lkZSBjaGFyIHN0cmluZ3MgKi8KCSAgICBzbXAtPnNtX2xlYWRfdyA9IG1iX3N0cjJ3aWRlKHNtcC0+c21fbGVhZCk7CgkgICAgc21wLT5zbV9sZWFkbGVuID0gbWJfY2hhcmxlbihzbXAtPnNtX2xlYWQpOwoJICAgIGlmIChzbXAtPnNtX29uZW9mID09IE5VTEwpCgkJc21wLT5zbV9vbmVvZl93ID0gTlVMTDsKCSAgICBlbHNlCgkJc21wLT5zbV9vbmVvZl93ID0gbWJfc3RyMndpZGUoc21wLT5zbV9vbmVvZik7CgkgICAgaWYgKHNtcC0+c21fdG8gPT0gTlVMTCkKCQlzbXAtPnNtX3RvX3cgPSBOVUxMOwoJICAgIGVsc2UKCQlzbXAtPnNtX3RvX3cgPSBtYl9zdHIyd2lkZShzbXAtPnNtX3RvKTsKCSAgICBpZiAoc21wLT5zbV9sZWFkX3cgPT0gTlVMTAoJCSAgICB8fCAoc21wLT5zbV9vbmVvZl93ID09IE5VTEwgJiYgc21wLT5zbV9vbmVvZiAhPSBOVUxMKQoJCSAgICB8fCAoc21wLT5zbV90b193ID09IE5VTEwgJiYgc21wLT5zbV90byAhPSBOVUxMKSkKCSAgICB7CgkJdmltX2ZyZWUoc21wLT5zbV9sZWFkKTsKCQl2aW1fZnJlZShzbXAtPnNtX3RvKTsKCQl2aW1fZnJlZShzbXAtPnNtX2xlYWRfdyk7CgkJdmltX2ZyZWUoc21wLT5zbV9vbmVvZl93KTsKCQl2aW1fZnJlZShzbXAtPnNtX3RvX3cpOwoJCXJldHVybiBTUF9PVEhFUkVSUk9SOwoJICAgIH0KCX0KI2VuZGlmCiAgICB9CgogICAgaWYgKGdhcC0+Z2FfbGVuID4gMCkKICAgIHsKCS8qIEFkZCBvbmUgZXh0cmEgZW50cnkgdG8gbWFyayB0aGUgZW5kIHdpdGggYW4gZW1wdHkgc21fbGVhZC4gIEF2b2lkcwoJICogdGhhdCB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBpbmRleCBldmVyeSB0aW1lLiAqLwoJc21wID0gJigoc2FsaXRlbV9UICopZ2FwLT5nYV9kYXRhKVtnYXAtPmdhX2xlbl07CglpZiAoKHAgPSBhbGxvYygxKSkgPT0gTlVMTCkKCSAgICByZXR1cm4gU1BfT1RIRVJFUlJPUjsKCXBbMF0gPSBOVUw7CglzbXAtPnNtX2xlYWQgPSBwOwoJc21wLT5zbV9sZWFkbGVuID0gMDsKCXNtcC0+c21fb25lb2YgPSBOVUxMOwoJc21wLT5zbV9ydWxlcyA9IHA7CglzbXAtPnNtX3RvID0gTlVMTDsKI2lmZGVmIEZFQVRfTUJZVEUKCWlmIChoYXNfbWJ5dGUpCgl7CgkgICAgc21wLT5zbV9sZWFkX3cgPSBtYl9zdHIyd2lkZShzbXAtPnNtX2xlYWQpOwoJICAgIHNtcC0+c21fbGVhZGxlbiA9IDA7CgkgICAgc21wLT5zbV9vbmVvZl93ID0gTlVMTDsKCSAgICBzbXAtPnNtX3RvX3cgPSBOVUxMOwoJfQojZW5kaWYKCSsrZ2FwLT5nYV9sZW47CiAgICB9CgogICAgLyogRmlsbCB0aGUgZmlyc3QtaW5kZXggdGFibGUuICovCiAgICBzZXRfc2FsX2ZpcnN0KHNsYW5nKTsKCiAgICByZXR1cm4gMDsKfQoKLyoKICogUmVhZCBTTl9XT1JEUzogPHdvcmQ+IC4uLgogKiBSZXR1cm4gU1BfKkVSUk9SIGZsYWdzLgogKi8KICAgIHN0YXRpYyBpbnQKcmVhZF93b3Jkc19zZWN0aW9uKGZkLCBscCwgbGVuKQogICAgRklMRQkqZmQ7CiAgICBzbGFuZ19UCSpscDsKICAgIGludAkJbGVuOwp7CiAgICBpbnQJCWRvbmUgPSAwOwogICAgaW50CQlpOwogICAgY2hhcl91CXdvcmRbTUFYV0xFTl07CgogICAgd2hpbGUgKGRvbmUgPCBsZW4pCiAgICB7CgkvKiBSZWFkIG9uZSB3b3JkIGF0IGEgdGltZS4gKi8KCWZvciAoaSA9IDA7IDsgKytpKQoJewoJICAgIHdvcmRbaV0gPSBnZXRjKGZkKTsKCSAgICBpZiAod29yZFtpXSA9PSBOVUwpCgkJYnJlYWs7CgkgICAgaWYgKGkgPT0gTUFYV0xFTiAtIDEpCgkJcmV0dXJuIFNQX0ZPUk1FUlJPUjsKCX0KCgkvKiBJbml0IHRoZSBjb3VudCB0byAxMC4gKi8KCWNvdW50X2NvbW1vbl93b3JkKGxwLCB3b3JkLCAtMSwgMTApOwoJZG9uZSArPSBpICsgMTsKICAgIH0KICAgIHJldHVybiAwOwp9CgovKgogKiBBZGQgYSB3b3JkIHRvIHRoZSBoYXNodGFibGUgb2YgY29tbW9uIHdvcmRzLgogKiBJZiBpdCdzIGFscmVhZHkgdGhlcmUgdGhlbiB0aGUgY291bnRlciBpcyBpbmNyZWFzZWQuCiAqLwogICAgc3RhdGljIHZvaWQKY291bnRfY29tbW9uX3dvcmQobHAsIHdvcmQsIGxlbiwgY291bnQpCiAgICBzbGFuZ19UCSpscDsKICAgIGNoYXJfdQkqd29yZDsKICAgIGludAkJbGVuOwkgICAgLyogd29yZCBsZW5ndGgsIC0xIGZvciB1cHRvIE5VTCAqLwogICAgaW50CQljb3VudDsJICAgIC8qIDEgdG8gY291bnQgb25jZSwgMTAgdG8gaW5pdCAqLwp7CiAgICBoYXNoX1QJaGFzaDsKICAgIGhhc2hpdGVtX1QJKmhpOwogICAgd29yZGNvdW50X1QJKndjOwogICAgY2hhcl91CWJ1ZltNQVhXTEVOXTsKICAgIGNoYXJfdQkqcDsKCiAgICBpZiAobGVuID09IC0xKQoJcCA9IHdvcmQ7CiAgICBlbHNlCiAgICB7Cgl2aW1fc3RybmNweShidWYsIHdvcmQsIGxlbik7CglwID0gYnVmOwogICAgfQoKICAgIGhhc2ggPSBoYXNoX2hhc2gocCk7CiAgICBoaSA9IGhhc2hfbG9va3VwKCZscC0+c2xfd29yZGNvdW50LCBwLCBoYXNoKTsKICAgIGlmIChIQVNISVRFTV9FTVBUWShoaSkpCiAgICB7Cgl3YyA9ICh3b3JkY291bnRfVCAqKWFsbG9jKHNpemVvZih3b3JkY291bnRfVCkgKyBTVFJMRU4ocCkpOwoJaWYgKHdjID09IE5VTEwpCgkgICAgcmV0dXJuOwoJU1RSQ1BZKHdjLT53Y193b3JkLCBwKTsKCXdjLT53Y19jb3VudCA9IGNvdW50OwoJaGFzaF9hZGRfaXRlbSgmbHAtPnNsX3dvcmRjb3VudCwgaGksIHdjLT53Y193b3JkLCBoYXNoKTsKICAgIH0KICAgIGVsc2UKICAgIHsKCXdjID0gSEkyV0MoaGkpOwoJaWYgKCh3Yy0+d2NfY291bnQgKz0gY291bnQpIDwgKHVuc2lnbmVkKWNvdW50KQkvKiBjaGVjayBmb3Igb3ZlcmZsb3cgKi8KCSAgICB3Yy0+d2NfY291bnQgPSBNQVhXT1JEQ09VTlQ7CiAgICB9Cn0KCi8qCiAqIEFkanVzdCB0aGUgc2NvcmUgb2YgY29tbW9uIHdvcmRzLgogKi8KICAgIHN0YXRpYyBpbnQKc2NvcmVfd29yZGNvdW50X2FkaihzbGFuZywgc2NvcmUsIHdvcmQsIHNwbGl0KQogICAgc2xhbmdfVAkqc2xhbmc7CiAgICBpbnQJCXNjb3JlOwogICAgY2hhcl91CSp3b3JkOwogICAgaW50CQlzcGxpdDsJICAgIC8qIHdvcmQgd2FzIHNwbGl0LCBsZXNzIGJvbnVzICovCnsKICAgIGhhc2hpdGVtX1QJKmhpOwogICAgd29yZGNvdW50X1QJKndjOwogICAgaW50CQlib251czsKICAgIGludAkJbmV3c2NvcmU7CgogICAgaGkgPSBoYXNoX2ZpbmQoJnNsYW5nLT5zbF93b3JkY291bnQsIHdvcmQpOwogICAgaWYgKCFIQVNISVRFTV9FTVBUWShoaSkpCiAgICB7Cgl3YyA9IEhJMldDKGhpKTsKCWlmICh3Yy0+d2NfY291bnQgPCBTQ09SRV9USFJFUzIpCgkgICAgYm9udXMgPSBTQ09SRV9DT01NT04xOwoJZWxzZSBpZiAod2MtPndjX2NvdW50IDwgU0NPUkVfVEhSRVMzKQoJICAgIGJvbnVzID0gU0NPUkVfQ09NTU9OMjsKCWVsc2UKCSAgICBib251cyA9IFNDT1JFX0NPTU1PTjM7CglpZiAoc3BsaXQpCgkgICAgbmV3c2NvcmUgPSBzY29yZSAtIGJvbnVzIC8gMjsKCWVsc2UKCSAgICBuZXdzY29yZSA9IHNjb3JlIC0gYm9udXM7CglpZiAobmV3c2NvcmUgPCAwKQoJICAgIHJldHVybiAwOwoJcmV0dXJuIG5ld3Njb3JlOwogICAgfQogICAgcmV0dXJuIHNjb3JlOwp9CgovKgogKiBTTl9TT0ZPOiA8c29mb2Zyb21sZW4+IDxzb2ZvZnJvbT4gPHNvZm90b2xlbj4gPHNvZm90bz4KICogUmV0dXJuIFNQXypFUlJPUiBmbGFncy4KICovCiAgICBzdGF0aWMgaW50CnJlYWRfc29mb19zZWN0aW9uKGZkLCBzbGFuZykKICAgIEZJTEUJKmZkOwogICAgc2xhbmdfVAkqc2xhbmc7CnsKICAgIGludAkJY250OwogICAgY2hhcl91CSpmcm9tLCAqdG87CiAgICBpbnQJCXJlczsKCiAgICBzbGFuZy0+c2xfc29mbyA9IFRSVUU7CgogICAgLyogPHNvZm9mcm9tbGVuPiA8c29mb2Zyb20+ICovCiAgICBmcm9tID0gcmVhZF9jbnRfc3RyaW5nKGZkLCAyLCAmY250KTsKICAgIGlmIChjbnQgPCAwKQoJcmV0dXJuIGNudDsKCiAgICAvKiA8c29mb3RvbGVuPiA8c29mb3RvPiAqLwogICAgdG8gPSByZWFkX2NudF9zdHJpbmcoZmQsIDIsICZjbnQpOwogICAgaWYgKGNudCA8IDApCiAgICB7Cgl2aW1fZnJlZShmcm9tKTsKCXJldHVybiBjbnQ7CiAgICB9CgogICAgLyogU3RvcmUgdGhlIGluZm8gaW4gc2xhbmctPnNsX3NhbCBhbmQvb3Igc2xhbmctPnNsX3NhbF9maXJzdC4gKi8KICAgIGlmIChmcm9tICE9IE5VTEwgJiYgdG8gIT0gTlVMTCkKCXJlcyA9IHNldF9zb2ZvKHNsYW5nLCBmcm9tLCB0byk7CiAgICBlbHNlIGlmIChmcm9tICE9IE5VTEwgfHwgdG8gIT0gTlVMTCkKCXJlcyA9IFNQX0ZPUk1FUlJPUjsgICAgLyogb25seSBvbmUgb2YgdHdvIHN0cmluZ3MgaXMgYW4gZXJyb3IgKi8KICAgIGVsc2UKCXJlcyA9IDA7CgogICAgdmltX2ZyZWUoZnJvbSk7CiAgICB2aW1fZnJlZSh0byk7CiAgICByZXR1cm4gcmVzOwp9CgovKgogKiBSZWFkIHRoZSBjb21wb3VuZCBzZWN0aW9uIGZyb20gdGhlIC5zcGwgZmlsZToKICoJPGNvbXBtYXg+IDxjb21wbWlubGVuPiA8Y29tcHN5bG1heD4gPGNvbXBvcHRpb25zPiA8Y29tcGZsYWdzPgogKiBSZXR1cm5zIFNQXypFUlJPUiBmbGFncy4KICovCiAgICBzdGF0aWMgaW50CnJlYWRfY29tcG91bmQoZmQsIHNsYW5nLCBsZW4pCiAgICBGSUxFCSpmZDsKICAgIHNsYW5nX1QJKnNsYW5nOwogICAgaW50CQlsZW47CnsKICAgIGludAkJdG9kbyA9IGxlbjsKICAgIGludAkJYzsKICAgIGludAkJYXRzdGFydDsKICAgIGNoYXJfdQkqcGF0OwogICAgY2hhcl91CSpwcDsKICAgIGNoYXJfdQkqY3A7CiAgICBjaGFyX3UJKmFwOwogICAgaW50CQljbnQ7CiAgICBnYXJyYXlfVAkqZ2FwOwoKICAgIGlmICh0b2RvIDwgMikKCXJldHVybiBTUF9GT1JNRVJST1I7CS8qIG5lZWQgYXQgbGVhc3QgdHdvIGJ5dGVzICovCgogICAgLS10b2RvOwogICAgYyA9IGdldGMoZmQpOwkJCQkJLyogPGNvbXBtYXg+ICovCiAgICBpZiAoYyA8IDIpCgljID0gTUFYV0xFTjsKICAgIHNsYW5nLT5zbF9jb21wbWF4ID0gYzsKCiAgICAtLXRvZG87CiAgICBjID0gZ2V0YyhmZCk7CQkJCQkvKiA8Y29tcG1pbmxlbj4gKi8KICAgIGlmIChjIDwgMSkKCWMgPSAwOwogICAgc2xhbmctPnNsX2NvbXBtaW5sZW4gPSBjOwoKICAgIC0tdG9kbzsKICAgIGMgPSBnZXRjKGZkKTsJCQkJCS8qIDxjb21wc3lsbWF4PiAqLwogICAgaWYgKGMgPCAxKQoJYyA9IE1BWFdMRU47CiAgICBzbGFuZy0+c2xfY29tcHN5bG1heCA9IGM7CgogICAgYyA9IGdldGMoZmQpOwkJCQkJLyogPGNvbXBvcHRpb25zPiAqLwogICAgaWYgKGMgIT0gMCkKCXVuZ2V0YyhjLCBmZCk7CSAgICAvKiBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIFZpbSA3LjBiICovCiAgICBlbHNlCiAgICB7CgktLXRvZG87CgljID0gZ2V0YyhmZCk7CSAgICAvKiBvbmx5IHVzZSB0aGUgbG93ZXIgYnl0ZSBmb3Igbm93ICovCgktLXRvZG87CglzbGFuZy0+c2xfY29tcG9wdGlvbnMgPSBjOwoKCWdhcCA9ICZzbGFuZy0+c2xfY29tcHBhdDsKCWMgPSBnZXQyYyhmZCk7CQkJCQkvKiA8Y29tcHBhdGNvdW50PiAqLwoJdG9kbyAtPSAyOwoJZ2FfaW5pdDIoZ2FwLCBzaXplb2YoY2hhcl91ICopLCBjKTsKCWlmIChnYV9ncm93KGdhcCwgYykgPT0gT0spCgkgICAgd2hpbGUgKC0tYyA+PSAwKQoJICAgIHsKCQkoKGNoYXJfdSAqKikoZ2FwLT5nYV9kYXRhKSlbZ2FwLT5nYV9sZW4rK10gPQoJCQkJCQkgcmVhZF9jbnRfc3RyaW5nKGZkLCAxLCAmY250KTsKCQkJCQkgICAgLyogPGNvbXBwYXRsZW4+IDxjb21wcGF0dGV4dD4gKi8KCQlpZiAoY250IDwgMCkKCQkgICAgcmV0dXJuIGNudDsKCQl0b2RvIC09IGNudCArIDE7CgkgICAgfQogICAgfQogICAgaWYgKHRvZG8gPCAwKQoJcmV0dXJuIFNQX0ZPUk1FUlJPUjsKCiAgICAvKiBUdXJuIHRoZSBDT01QT1VORFJVTEUgaXRlbXMgaW50byBhIHJlZ2V4cCBwYXR0ZXJuOgogICAgICogImFbYmNdL2EqYisiIC0+ICJeXChhW2JjXVx8YSpiXCtcKSQiLgogICAgICogSW5zZXJ0aW5nIGJhY2tzbGFzaGVzIG1heSBkb3VibGUgdGhlIGxlbmd0aCwgIl5cKFwpJDxOdWw+IiBpcyA3IGJ5dGVzLgogICAgICogQ29udmVyc2lvbiB0byB1dGYtOCBtYXkgZG91YmxlIHRoZSBzaXplLiAqLwogICAgYyA9IHRvZG8gKiAyICsgNzsKI2lmZGVmIEZFQVRfTUJZVEUKICAgIGlmIChlbmNfdXRmOCkKCWMgKz0gdG9kbyAqIDI7CiNlbmRpZgogICAgcGF0ID0gYWxsb2MoKHVuc2lnbmVkKWMpOwogICAgaWYgKHBhdCA9PSBOVUxMKQoJcmV0dXJuIFNQX09USEVSRVJST1I7CgogICAgLyogV2UgYWxzbyBuZWVkIGEgbGlzdCBvZiBhbGwgZmxhZ3MgdGhhdCBjYW4gYXBwZWFyIGF0IHRoZSBzdGFydCBhbmQgb25lCiAgICAgKiBmb3IgYWxsIGZsYWdzLiAqLwogICAgY3AgPSBhbGxvYyh0b2RvICsgMSk7CiAgICBpZiAoY3AgPT0gTlVMTCkKICAgIHsKCXZpbV9mcmVlKHBhdCk7CglyZXR1cm4gU1BfT1RIRVJFUlJPUjsKICAgIH0KICAgIHNsYW5nLT5zbF9jb21wc3RhcnRmbGFncyA9IGNwOwogICAgKmNwID0gTlVMOwoKICAgIGFwID0gYWxsb2ModG9kbyArIDEpOwogICAgaWYgKGFwID09IE5VTEwpCiAgICB7Cgl2aW1fZnJlZShwYXQpOwoJcmV0dXJuIFNQX09USEVSRVJST1I7CiAgICB9CiAgICBzbGFuZy0+c2xfY29tcGFsbGZsYWdzID0gYXA7CiAgICAqYXAgPSBOVUw7CgogICAgcHAgPSBwYXQ7CiAgICAqcHArKyA9ICdeJzsKICAgICpwcCsrID0gJ1xcJzsKICAgICpwcCsrID0gJygnOwoKICAgIGF0c3RhcnQgPSAxOwogICAgd2hpbGUgKHRvZG8tLSA+IDApCiAgICB7CgljID0gZ2V0YyhmZCk7CQkJCQkvKiA8Y29tcGZsYWdzPiAqLwoKCS8qIEFkZCBhbGwgZmxhZ3MgdG8gInNsX2NvbXBhbGxmbGFncyIuICovCglpZiAodmltX3N0cmNocigoY2hhcl91ICopIisqW10vIiwgYykgPT0gTlVMTAoJCSYmICFieXRlX2luX3N0cihzbGFuZy0+c2xfY29tcGFsbGZsYWdzLCBjKSkKCXsKCSAgICAqYXArKyA9IGM7CgkgICAgKmFwID0gTlVMOwoJfQoKCWlmIChhdHN0YXJ0ICE9IDApCgl7CgkgICAgLyogQXQgc3RhcnQgb2YgaXRlbTogY29weSBmbGFncyB0byAic2xfY29tcHN0YXJ0ZmxhZ3MiLiAgRm9yIGEKCSAgICAgKiBbYWJjXSBpdGVtIHNldCAiYXRzdGFydCIgdG8gMiBhbmQgY29weSB1cCB0byB0aGUgJ10nLiAqLwoJICAgIGlmIChjID09ICdbJykKCQlhdHN0YXJ0ID0gMjsKCSAgICBlbHNlIGlmIChjID09ICddJykKCQlhdHN0YXJ0ID0gMDsKCSAgICBlbHNlCgkgICAgewoJCWlmICghYnl0ZV9pbl9zdHIoc2xhbmctPnNsX2NvbXBzdGFydGZsYWdzLCBjKSkKCQl7CgkJICAgICpjcCsrID0gYzsKCQkgICAgKmNwID0gTlVMOwoJCX0KCQlpZiAoYXRzdGFydCA9PSAxKQoJCSAgICBhdHN0YXJ0ID0gMDsKCSAgICB9Cgl9CglpZiAoYyA9PSAnLycpCSAgICAvKiBzbGFzaCBzZXBhcmF0ZXMgdHdvIGl0ZW1zICovCgl7CgkgICAgKnBwKysgPSAnXFwnOwoJICAgICpwcCsrID0gJ3wnOwoJICAgIGF0c3RhcnQgPSAxOwoJfQoJZWxzZQkJICAgIC8qIG5vcm1hbCBjaGFyLCAiW2FiY10iIGFuZCAnKicgYXJlIGNvcGllZCBhcy1pcyAqLwoJewoJICAgIGlmIChjID09ICcrJyB8fCBjID09ICd+JykKCQkqcHArKyA9ICdcXCc7CSAgICAvKiAiYSsiIGJlY29tZXMgImFcKyIgKi8KI2lmZGVmIEZFQVRfTUJZVEUKCSAgICBpZiAoZW5jX3V0ZjgpCgkJcHAgKz0gbWJfY2hhcjJieXRlcyhjLCBwcCk7CgkgICAgZWxzZQojZW5kaWYKCQkqcHArKyA9IGM7Cgl9CiAgICB9CgogICAgKnBwKysgPSAnXFwnOwogICAgKnBwKysgPSAnKSc7CiAgICAqcHArKyA9ICckJzsKICAgICpwcCA9IE5VTDsKCiAgICBzbGFuZy0+c2xfY29tcHByb2cgPSB2aW1fcmVnY29tcChwYXQsIFJFX01BR0lDICsgUkVfU1RSSU5HICsgUkVfU1RSSUNUKTsKICAgIHZpbV9mcmVlKHBhdCk7CiAgICBpZiAoc2xhbmctPnNsX2NvbXBwcm9nID09IE5VTEwpCglyZXR1cm4gU1BfRk9STUVSUk9SOwoKICAgIHJldHVybiAwOwp9CgovKgogKiBSZXR1cm4gVFJVRSBpZiBieXRlICJuIiBhcHBlYXJzIGluICJzdHIiLgogKiBMaWtlIHN0cmNocigpIGJ1dCBpbmRlcGVuZGVudCBvZiBsb2NhbGUuCiAqLwogICAgc3RhdGljIGludApieXRlX2luX3N0cihzdHIsIG4pCiAgICBjaGFyX3UJKnN0cjsKICAgIGludAkJbjsKewogICAgY2hhcl91CSpwOwoKICAgIGZvciAocCA9IHN0cjsgKnAgIT0gTlVMOyArK3ApCglpZiAoKnAgPT0gbikKCSAgICByZXR1cm4gVFJVRTsKICAgIHJldHVybiBGQUxTRTsKfQoKI2RlZmluZSBTWV9NQVhMRU4gICAzMAp0eXBlZGVmIHN0cnVjdCBzeWxfaXRlbV9TCnsKICAgIGNoYXJfdQlzeV9jaGFyc1tTWV9NQVhMRU5dOwkgICAgLyogdGhlIHNlcXVlbmNlIG9mIGNoYXJzICovCiAgICBpbnQJCXN5X2xlbjsKfSBzeWxfaXRlbV9UOwoKLyoKICogVHJ1bmNhdGUgInNsYW5nLT5zbF9zeWxsYWJsZSIgYXQgdGhlIGZpcnN0IHNsYXNoIGFuZCBwdXQgdGhlIGZvbGxvd2luZyBpdGVtcwogKiBpbiAic2xhbmctPnNsX3N5bF9pdGVtcyIuCiAqLwogICAgc3RhdGljIGludAppbml0X3N5bF90YWIoc2xhbmcpCiAgICBzbGFuZ19UCSpzbGFuZzsKewogICAgY2hhcl91CSpwOwogICAgY2hhcl91CSpzOwogICAgaW50CQlsOwogICAgc3lsX2l0ZW1fVAkqc3lsOwoKICAgIGdhX2luaXQyKCZzbGFuZy0+c2xfc3lsX2l0ZW1zLCBzaXplb2Yoc3lsX2l0ZW1fVCksIDQpOwogICAgcCA9IHZpbV9zdHJjaHIoc2xhbmctPnNsX3N5bGxhYmxlLCAnLycpOwogICAgd2hpbGUgKHAgIT0gTlVMTCkKICAgIHsKCSpwKysgPSBOVUw7CglpZiAoKnAgPT0gTlVMKQkgICAgLyogdHJhaWxpbmcgc2xhc2ggKi8KCSAgICBicmVhazsKCXMgPSBwOwoJcCA9IHZpbV9zdHJjaHIocCwgJy8nKTsKCWlmIChwID09IE5VTEwpCgkgICAgbCA9IFNUUkxFTihzKTsKCWVsc2UKCSAgICBsID0gcCAtIHM7CglpZiAobCA+PSBTWV9NQVhMRU4pCgkgICAgcmV0dXJuIFNQX0ZPUk1FUlJPUjsKCWlmIChnYV9ncm93KCZzbGFuZy0+c2xfc3lsX2l0ZW1zLCAxKSA9PSBGQUlMKQoJICAgIHJldHVybiBTUF9PVEhFUkVSUk9SOwoJc3lsID0gKChzeWxfaXRlbV9UICopc2xhbmctPnNsX3N5bF9pdGVtcy5nYV9kYXRhKQoJCQkJCSAgICAgICArIHNsYW5nLT5zbF9zeWxfaXRlbXMuZ2FfbGVuKys7Cgl2aW1fc3RybmNweShzeWwtPnN5X2NoYXJzLCBzLCBsKTsKCXN5bC0+c3lfbGVuID0gbDsKICAgIH0KICAgIHJldHVybiBPSzsKfQoKLyoKICogQ291bnQgdGhlIG51bWJlciBvZiBzeWxsYWJsZXMgaW4gIndvcmQiLgogKiBXaGVuICJ3b3JkIiBjb250YWlucyBzcGFjZXMgdGhlIHN5bGxhYmxlcyBhZnRlciB0aGUgbGFzdCBzcGFjZSBhcmUgY291bnRlZC4KICogUmV0dXJucyB6ZXJvIGlmIHN5bGxhYmxlcyBhcmUgbm90IGRlZmluZXMuCiAqLwogICAgc3RhdGljIGludApjb3VudF9zeWxsYWJsZXMoc2xhbmcsIHdvcmQpCiAgICBzbGFuZ19UCSpzbGFuZzsKICAgIGNoYXJfdQkqd29yZDsKewogICAgaW50CQljbnQgPSAwOwogICAgaW50CQlza2lwID0gRkFMU0U7CiAgICBjaGFyX3UJKnA7CiAgICBpbnQJCWxlbjsKICAgIGludAkJaTsKICAgIHN5bF9pdGVtX1QJKnN5bDsKICAgIGludAkJYzsKCiAgICBpZiAoc2xhbmctPnNsX3N5bGxhYmxlID09IE5VTEwpCglyZXR1cm4gMDsKCiAgICBmb3IgKHAgPSB3b3JkOyAqcCAhPSBOVUw7IHAgKz0gbGVuKQogICAgewoJLyogV2hlbiBydW5uaW5nIGludG8gYSBzcGFjZSByZXNldCBjb3VudGVyLiAqLwoJaWYgKCpwID09ICcgJykKCXsKCSAgICBsZW4gPSAxOwoJICAgIGNudCA9IDA7CgkgICAgY29udGludWU7Cgl9CgoJLyogRmluZCBsb25nZXN0IG1hdGNoIG9mIHN5bGxhYmxlIGl0ZW1zLiAqLwoJbGVuID0gMDsKCWZvciAoaSA9IDA7IGkgPCBzbGFuZy0+c2xfc3lsX2l0ZW1zLmdhX2xlbjsgKytpKQoJewoJICAgIHN5bCA9ICgoc3lsX2l0ZW1fVCAqKXNsYW5nLT5zbF9zeWxfaXRlbXMuZ2FfZGF0YSkgKyBpOwoJICAgIGlmIChzeWwtPnN5X2xlbiA+IGxlbgoJCQkgICAgICAgJiYgU1RSTkNNUChwLCBzeWwtPnN5X2NoYXJzLCBzeWwtPnN5X2xlbikgPT0gMCkKCQlsZW4gPSBzeWwtPnN5X2xlbjsKCX0KCWlmIChsZW4gIT0gMCkJLyogZm91bmQgYSBtYXRjaCwgY291bnQgc3lsbGFibGUgICovCgl7CgkgICAgKytjbnQ7CgkgICAgc2tpcCA9IEZBTFNFOwoJfQoJZWxzZQoJewoJICAgIC8qIE5vIHJlY29nbml6ZWQgc3lsbGFibGUgaXRlbSwgYXQgbGVhc3QgYSBzeWxsYWJsZSBjaGFyIHRoZW4/ICovCiNpZmRlZiBGRUFUX01CWVRFCgkgICAgYyA9IG1iX3B0cjJjaGFyKHApOwoJICAgIGxlbiA9ICgqbWJfcHRyMmxlbikocCk7CiNlbHNlCgkgICAgYyA9ICpwOwoJICAgIGxlbiA9IDE7CiNlbmRpZgoJICAgIGlmICh2aW1fc3RyY2hyKHNsYW5nLT5zbF9zeWxsYWJsZSwgYykgPT0gTlVMTCkKCQlza2lwID0gRkFMU0U7CSAgICAvKiBObywgc2VhcmNoIGZvciBuZXh0IHN5bGxhYmxlICovCgkgICAgZWxzZSBpZiAoIXNraXApCgkgICAgewoJCSsrY250OwkJICAgIC8qIFllcywgY291bnQgaXQgKi8KCQlza2lwID0gVFJVRTsJICAgIC8qIGRvbid0IGNvdW50IGZvbGxvd2luZyBzeWxsYWJsZSBjaGFycyAqLwoJICAgIH0KCX0KICAgIH0KICAgIHJldHVybiBjbnQ7Cn0KCi8qCiAqIFNldCB0aGUgU09GT0ZST00gYW5kIFNPRk9UTyBpdGVtcyBpbiBsYW5ndWFnZSAibHAiLgogKiBSZXR1cm5zIFNQXypFUlJPUiBmbGFncyB3aGVuIHRoZXJlIGlzIHNvbWV0aGluZyB3cm9uZy4KICovCiAgICBzdGF0aWMgaW50CnNldF9zb2ZvKGxwLCBmcm9tLCB0bykKICAgIHNsYW5nX1QJKmxwOwogICAgY2hhcl91CSpmcm9tOwogICAgY2hhcl91CSp0bzsKewogICAgaW50CQlpOwoKI2lmZGVmIEZFQVRfTUJZVEUKICAgIGdhcnJheV9UCSpnYXA7CiAgICBjaGFyX3UJKnM7CiAgICBjaGFyX3UJKnA7CiAgICBpbnQJCWM7CiAgICBpbnQJCSppbnA7CgogICAgaWYgKGhhc19tYnl0ZSkKICAgIHsKCS8qIFVzZSAic2xfc2FsIiBhcyBhbiBhcnJheSB3aXRoIDI1NiBwb2ludGVycyB0byBhIGxpc3Qgb2Ygd2lkZQoJICogY2hhcmFjdGVycy4gIFRoZSBpbmRleCBpcyB0aGUgbG93IGJ5dGUgb2YgdGhlIGNoYXJhY3Rlci4KCSAqIFRoZSBsaXN0IGNvbnRhaW5zIGZyb20tdG8gcGFpcnMgd2l0aCBhIHRlcm1pbmF0aW5nIE5VTC4KCSAqIHNsX3NhbF9maXJzdFtdIGlzIHVzZWQgZm9yIGxhdGluMSAiZnJvbSIgY2hhcmFjdGVycy4gKi8KCWdhcCA9ICZscC0+c2xfc2FsOwoJZ2FfaW5pdDIoZ2FwLCBzaXplb2YoaW50ICopLCAxKTsKCWlmIChnYV9ncm93KGdhcCwgMjU2KSA9PSBGQUlMKQoJICAgIHJldHVybiBTUF9PVEhFUkVSUk9SOwoJdmltX21lbXNldChnYXAtPmdhX2RhdGEsIDAsIHNpemVvZihpbnQgKikgKiAyNTYpOwoJZ2FwLT5nYV9sZW4gPSAyNTY7CgoJLyogRmlyc3QgY291bnQgdGhlIG51bWJlciBvZiBpdGVtcyBmb3IgZWFjaCBsaXN0LiAgVGVtcG9yYXJpbHkgdXNlCgkgKiBzbF9zYWxfZmlyc3RbXSBmb3IgdGhpcy4gKi8KCWZvciAocCA9IGZyb20sIHMgPSB0bzsgKnAgIT0gTlVMICYmICpzICE9IE5VTDsgKQoJewoJICAgIGMgPSBtYl9jcHRyMmNoYXJfYWR2KCZwKTsKCSAgICBtYl9jcHRyX2FkdihzKTsKCSAgICBpZiAoYyA+PSAyNTYpCgkJKytscC0+c2xfc2FsX2ZpcnN0W2MgJiAweGZmXTsKCX0KCWlmICgqcCAhPSBOVUwgfHwgKnMgIT0gTlVMKQkgICAgLyogbGVuZ3RocyBkaWZmZXIgKi8KCSAgICByZXR1cm4gU1BfRk9STUVSUk9SOwoKCS8qIEFsbG9jYXRlIHRoZSBsaXN0cy4gKi8KCWZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkKCSAgICBpZiAobHAtPnNsX3NhbF9maXJzdFtpXSA+IDApCgkgICAgewoJCXAgPSBhbGxvYyhzaXplb2YoaW50KSAqIChscC0+c2xfc2FsX2ZpcnN0W2ldICogMiArIDEpKTsKCQlpZiAocCA9PSBOVUxMKQoJCSAgICByZXR1cm4gU1BfT1RIRVJFUlJPUjsKCQkoKGludCAqKilnYXAtPmdhX2RhdGEpW2ldID0gKGludCAqKXA7CgkJKihpbnQgKilwID0gMDsKCSAgICB9CgoJLyogUHV0IHRoZSBjaGFyYWN0ZXJzIHVwIHRvIDI1NSBpbiBzbF9zYWxfZmlyc3RbXSB0aGUgcmVzdCBpbiBhIHNsX3NhbAoJICogbGlzdC4gKi8KCXZpbV9tZW1zZXQobHAtPnNsX3NhbF9maXJzdCwgMCwgc2l6ZW9mKHNhbGZpcnN0X1QpICogMjU2KTsKCWZvciAocCA9IGZyb20sIHMgPSB0bzsgKnAgIT0gTlVMICYmICpzICE9IE5VTDsgKQoJewoJICAgIGMgPSBtYl9jcHRyMmNoYXJfYWR2KCZwKTsKCSAgICBpID0gbWJfY3B0cjJjaGFyX2Fkdigmcyk7CgkgICAgaWYgKGMgPj0gMjU2KQoJICAgIHsKCQkvKiBBcHBlbmQgdGhlIGZyb20tdG8gY2hhcnMgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCB3aXRoCgkJICogdGhlIGxvdyBieXRlLiAqLwoJCWlucCA9ICgoaW50ICoqKWdhcC0+Z2FfZGF0YSlbYyAmIDB4ZmZdOwoJCXdoaWxlICgqaW5wICE9IDApCgkJICAgICsraW5wOwoJCSppbnArKyA9IGM7CQkvKiBmcm9tIGNoYXIgKi8KCQkqaW5wKysgPSBpOwkJLyogdG8gY2hhciAqLwoJCSppbnArKyA9IE5VTDsJCS8qIE5VTCBhdCB0aGUgZW5kICovCgkgICAgfQoJICAgIGVsc2UKCQkvKiBtYXBwaW5nIGJ5dGUgdG8gY2hhciBpcyBkb25lIGluIHNsX3NhbF9maXJzdFtdICovCgkJbHAtPnNsX3NhbF9maXJzdFtjXSA9IGk7Cgl9CiAgICB9CiAgICBlbHNlCiNlbmRpZgogICAgewoJLyogbWFwcGluZyBieXRlcyB0byBieXRlcyBpcyBkb25lIGluIHNsX3NhbF9maXJzdFtdICovCglpZiAoU1RSTEVOKGZyb20pICE9IFNUUkxFTih0bykpCgkgICAgcmV0dXJuIFNQX0ZPUk1FUlJPUjsKCglmb3IgKGkgPSAwOyB0b1tpXSAhPSBOVUw7ICsraSkKCSAgICBscC0+c2xfc2FsX2ZpcnN0W2Zyb21baV1dID0gdG9baV07CglscC0+c2xfc2FsLmdhX2xlbiA9IDE7CQkvKiBpbmRpY2F0ZXMgd2UgaGF2ZSBzb3VuZGZvbGRpbmcgKi8KICAgIH0KCiAgICByZXR1cm4gMDsKfQoKLyoKICogRmlsbCB0aGUgZmlyc3QtaW5kZXggdGFibGUgZm9yICJscCIuCiAqLwogICAgc3RhdGljIHZvaWQKc2V0X3NhbF9maXJzdChscCkKICAgIHNsYW5nX1QJKmxwOwp7CiAgICBzYWxmaXJzdF9UCSpzZmlyc3Q7CiAgICBpbnQJCWk7CiAgICBzYWxpdGVtX1QJKnNtcDsKICAgIGludAkJYzsKICAgIGdhcnJheV9UCSpnYXAgPSAmbHAtPnNsX3NhbDsKCiAgICBzZmlyc3QgPSBscC0+c2xfc2FsX2ZpcnN0OwogICAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKQoJc2ZpcnN0W2ldID0gLTE7CiAgICBzbXAgPSAoc2FsaXRlbV9UICopZ2FwLT5nYV9kYXRhOwogICAgZm9yIChpID0gMDsgaSA8IGdhcC0+Z2FfbGVuOyArK2kpCiAgICB7CiNpZmRlZiBGRUFUX01CWVRFCglpZiAoaGFzX21ieXRlKQoJICAgIC8qIFVzZSB0aGUgbG93ZXN0IGJ5dGUgb2YgdGhlIGZpcnN0IGNoYXJhY3Rlci4gIEZvciBsYXRpbjEgaXQncwoJICAgICAqIHRoZSBjaGFyYWN0ZXIsIGZvciBvdGhlciBlbmNvZGluZ3MgaXQgc2hvdWxkIGRpZmZlciBmb3IgbW9zdAoJICAgICAqIGNoYXJhY3RlcnMuICovCgkgICAgYyA9ICpzbXBbaV0uc21fbGVhZF93ICYgMHhmZjsKCWVsc2UKI2VuZGlmCgkgICAgYyA9ICpzbXBbaV0uc21fbGVhZDsKCWlmIChzZmlyc3RbY10gPT0gLTEpCgl7CgkgICAgc2ZpcnN0W2NdID0gaTsKI2lmZGVmIEZFQVRfTUJZVEUKCSAgICBpZiAoaGFzX21ieXRlKQoJICAgIHsKCQlpbnQJCW47CgoJCS8qIE1ha2Ugc3VyZSBhbGwgZW50cmllcyB3aXRoIHRoaXMgYnl0ZSBhcmUgZm9sbG93aW5nIGVhY2gKCQkgKiBvdGhlci4gIE1vdmUgdGhlIG9uZXMgdGhhdCBhcmUgaW4gdGhlIHdyb25nIHBvc2l0aW9uLiAgRG8KCQkgKiBrZWVwIHRoZSBzYW1lIG9yZGVyaW5nISAqLwoJCXdoaWxlIChpICsgMSA8IGdhcC0+Z2FfbGVuCgkJCQkgICAgICAgJiYgKCpzbXBbaSArIDFdLnNtX2xlYWRfdyAmIDB4ZmYpID09IGMpCgkJICAgIC8qIFNraXAgb3ZlciBlbnRyeSB3aXRoIHNhbWUgaW5kZXggYnl0ZS4gKi8KCQkgICAgKytpOwoKCQlmb3IgKG4gPSAxOyBpICsgbiA8IGdhcC0+Z2FfbGVuOyArK24pCgkJICAgIGlmICgoKnNtcFtpICsgbl0uc21fbGVhZF93ICYgMHhmZikgPT0gYykKCQkgICAgewoJCQlzYWxpdGVtX1QgIHRzYWw7CgoJCQkvKiBNb3ZlIGVudHJ5IHdpdGggc2FtZSBpbmRleCBieXRlIGFmdGVyIHRoZSBlbnRyaWVzCgkJCSAqIHdlIGFscmVhZHkgZm91bmQuICovCgkJCSsraTsKCQkJLS1uOwoJCQl0c2FsID0gc21wW2kgKyBuXTsKCQkJbWNoX21lbW1vdmUoc21wICsgaSArIDEsIHNtcCArIGksCgkJCQkJCSAgICAgICBzaXplb2Yoc2FsaXRlbV9UKSAqIG4pOwoJCQlzbXBbaV0gPSB0c2FsOwoJCSAgICB9CgkgICAgfQojZW5kaWYKCX0KICAgIH0KfQoKI2lmZGVmIEZFQVRfTUJZVEUKLyoKICogVHVybiBhIG11bHRpLWJ5dGUgc3RyaW5nIGludG8gYSB3aWRlIGNoYXJhY3RlciBzdHJpbmcuCiAqIFJldHVybiBpdCBpbiBhbGxvY2F0ZWQgbWVtb3J5IChOVUxMIGZvciBvdXQtb2YtbWVtb3J5KQogKi8KICAgIHN0YXRpYyBpbnQgKgptYl9zdHIyd2lkZShzKQogICAgY2hhcl91CSpzOwp7CiAgICBpbnQJCSpyZXM7CiAgICBjaGFyX3UJKnA7CiAgICBpbnQJCWkgPSAwOwoKICAgIHJlcyA9IChpbnQgKilhbGxvYyhzaXplb2YoaW50KSAqIChtYl9jaGFybGVuKHMpICsgMSkpOwogICAgaWYgKHJlcyAhPSBOVUxMKQogICAgewoJZm9yIChwID0gczsgKnAgIT0gTlVMOyApCgkgICAgcmVzW2krK10gPSBtYl9wdHIyY2hhcl9hZHYoJnApOwoJcmVzW2ldID0gTlVMOwogICAgfQogICAgcmV0dXJuIHJlczsKfQojZW5kaWYKCi8qCiAqIFJlYWQgYSB0cmVlIGZyb20gdGhlIC5zcGwgb3IgLnN1ZyBmaWxlLgogKiBBbGxvY2F0ZXMgdGhlIG1lbW9yeSBhbmQgc3RvcmVzIHBvaW50ZXJzIGluICJieXRzcCIgYW5kICJpZHhzcCIuCiAqIFRoaXMgaXMgc2tpcHBlZCB3aGVuIHRoZSB0cmVlIGhhcyB6ZXJvIGxlbmd0aC4KICogUmV0dXJucyB6ZXJvIHdoZW4gT0ssIFNQXyB2YWx1ZSBmb3IgYW4gZXJyb3IuCiAqLwogICAgc3RhdGljIGludApzcGVsbF9yZWFkX3RyZWUoZmQsIGJ5dHNwLCBpZHhzcCwgcHJlZml4dHJlZSwgcHJlZml4Y250KQogICAgRklMRQkqZmQ7CiAgICBjaGFyX3UJKipieXRzcDsKICAgIGlkeF9UCSoqaWR4c3A7CiAgICBpbnQJCXByZWZpeHRyZWU7CS8qIFRSVUUgZm9yIHRoZSBwcmVmaXggdHJlZSAqLwogICAgaW50CQlwcmVmaXhjbnQ7CS8qIHdoZW4gInByZWZpeHRyZWUiIGlzIFRSVUU6IHByZWZpeCBjb3VudCAqLwp7CiAgICBpbnQJCWxlbjsKICAgIGludAkJaWR4OwogICAgY2hhcl91CSpicDsKICAgIGlkeF9UCSppcDsKCiAgICAvKiBUaGUgdHJlZSBzaXplIHdhcyBjb21wdXRlZCB3aGVuIHdyaXRpbmcgdGhlIGZpbGUsIHNvIHRoYXQgd2UgY2FuCiAgICAgKiBhbGxvY2F0ZSBpdCBhcyBvbmUgbG9uZyBibG9jay4gPG5vZGVjb3VudD4gKi8KICAgIGxlbiA9IGdldDRjKGZkKTsKICAgIGlmIChsZW4gPCAwKQoJcmV0dXJuIFNQX1RSVU5DRVJST1I7CiAgICBpZiAobGVuID4gMCkKICAgIHsKCS8qIEFsbG9jYXRlIHRoZSBieXRlIGFycmF5LiAqLwoJYnAgPSBsYWxsb2MoKGxvbmdfdSlsZW4sIFRSVUUpOwoJaWYgKGJwID09IE5VTEwpCgkgICAgcmV0dXJuIFNQX09USEVSRVJST1I7CgkqYnl0c3AgPSBicDsKCgkvKiBBbGxvY2F0ZSB0aGUgaW5kZXggYXJyYXkuICovCglpcCA9IChpZHhfVCAqKWxhbGxvY19jbGVhcigobG9uZ191KShsZW4gKiBzaXplb2YoaW50KSksIFRSVUUpOwoJaWYgKGlwID09IE5VTEwpCgkgICAgcmV0dXJuIFNQX09USEVSRVJST1I7CgkqaWR4c3AgPSBpcDsKCgkvKiBSZWN1cnNpdmVseSByZWFkIHRoZSB0cmVlIGFuZCBzdG9yZSBpdCBpbiB0aGUgYXJyYXkuICovCglpZHggPSByZWFkX3RyZWVfbm9kZShmZCwgYnAsIGlwLCBsZW4sIDAsIHByZWZpeHRyZWUsIHByZWZpeGNudCk7CglpZiAoaWR4IDwgMCkKCSAgICByZXR1cm4gaWR4OwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qCiAqIFJlYWQgb25lIHJvdyBvZiBzaWJsaW5ncyBmcm9tIHRoZSBzcGVsbCBmaWxlIGFuZCBzdG9yZSBpdCBpbiB0aGUgYnl0ZSBhcnJheQogKiAiYnl0cyIgYW5kIGluZGV4IGFycmF5ICJpZHhzIi4gIFJlY3Vyc2l2ZWx5IHJlYWQgdGhlIGNoaWxkcmVuLgogKgogKiBOT1RFOiBUaGUgY29kZSBoZXJlIG11c3QgbWF0Y2ggcHV0X25vZGUoKSEKICoKICogUmV0dXJucyB0aGUgaW5kZXggKD49IDApIGZvbGxvd2luZyB0aGUgc2libGluZ3MuCiAqIFJldHVybnMgU1BfVFJVTkNFUlJPUiBpZiB0aGUgZmlsZSBpcyBzaG9ydGVyIHRoYW4gZXhwZWN0ZWQuCiAqIFJldHVybnMgU1BfRk9STUVSUk9SIGlmIHRoZXJlIGlzIGEgZm9ybWF0IGVycm9yLgogKi8KICAgIHN0YXRpYyBpZHhfVApyZWFkX3RyZWVfbm9kZShmZCwgYnl0cywgaWR4cywgbWF4aWR4LCBzdGFydGlkeCwgcHJlZml4dHJlZSwgbWF4cHJlZmNvbmRucikKICAgIEZJTEUJKmZkOwogICAgY2hhcl91CSpieXRzOwogICAgaWR4X1QJKmlkeHM7CiAgICBpbnQJCW1heGlkeDsJCSAgICAvKiBzaXplIG9mIGFycmF5cyAqLwogICAgaWR4X1QJc3RhcnRpZHg7CSAgICAvKiBjdXJyZW50IGluZGV4IGluICJieXRzIiBhbmQgImlkeHMiICovCiAgICBpbnQJCXByZWZpeHRyZWU7CSAgICAvKiBUUlVFIGZvciByZWFkaW5nIFBSRUZJWFRSRUUgKi8KICAgIGludAkJbWF4cHJlZmNvbmRucjsJICAgIC8qIG1heGltdW0gZm9yIDxwcmVmY29uZG5yPiAqLwp7CiAgICBpbnQJCWxlbjsKICAgIGludAkJaTsKICAgIGludAkJbjsKICAgIGlkeF9UCWlkeCA9IHN0YXJ0aWR4OwogICAgaW50CQljOwogICAgaW50CQljMjsKI2RlZmluZSBTSEFSRURfTUFTSwkweDgwMDAwMDAKCiAgICBsZW4gPSBnZXRjKGZkKTsJCQkJCS8qIDxzaWJsaW5nY291bnQ+ICovCiAgICBpZiAobGVuIDw9IDApCglyZXR1cm4gU1BfVFJVTkNFUlJPUjsKCiAgICBpZiAoc3RhcnRpZHggKyBsZW4gPj0gbWF4aWR4KQoJcmV0dXJuIFNQX0ZPUk1FUlJPUjsKICAgIGJ5dHNbaWR4KytdID0gbGVuOwoKICAgIC8qIFJlYWQgdGhlIGJ5dGUgdmFsdWVzLCBmbGFnL3JlZ2lvbiBieXRlcyBhbmQgc2hhcmVkIGluZGV4ZXMuICovCiAgICBmb3IgKGkgPSAxOyBpIDw9IGxlbjsgKytpKQogICAgewoJYyA9IGdldGMoZmQpOwkJCQkJLyogPGJ5dGU+ICovCglpZiAoYyA8IDApCgkgICAgcmV0dXJuIFNQX1RSVU5DRVJST1I7CglpZiAoYyA8PSBCWV9TUEVDSUFMKQoJewoJICAgIGlmIChjID09IEJZX05PRkxBR1MgJiYgIXByZWZpeHRyZWUpCgkgICAgewoJCS8qIE5vIGZsYWdzLCBhbGwgcmVnaW9ucy4gKi8KCQlpZHhzW2lkeF0gPSAwOwoJCWMgPSAwOwoJICAgIH0KCSAgICBlbHNlIGlmIChjICE9IEJZX0lOREVYKQoJICAgIHsKCQlpZiAocHJlZml4dHJlZSkKCQl7CgkJICAgIC8qIFJlYWQgdGhlIG9wdGlvbmFsIHBmbGFncyBieXRlLCB0aGUgcHJlZml4IElEIGFuZCB0aGUKCQkgICAgICogY29uZGl0aW9uIG5yLiAgSW4gaWR4c1tdIHN0b3JlIHRoZSBwcmVmaXggSUQgaW4gdGhlIGxvdwoJCSAgICAgKiBieXRlLCB0aGUgY29uZGl0aW9uIGluZGV4IHNoaWZ0ZWQgdXAgOCBiaXRzLCB0aGUgZmxhZ3MKCQkgICAgICogc2hpZnRlZCB1cCAyNCBiaXRzLiAqLwoJCSAgICBpZiAoYyA9PSBCWV9GTEFHUykKCQkJYyA9IGdldGMoZmQpIDw8IDI0OwkJLyogPHBmbGFncz4gKi8KCQkgICAgZWxzZQoJCQljID0gMDsKCgkJICAgIGMgfD0gZ2V0YyhmZCk7CQkJLyogPGFmZml4SUQ+ICovCgoJCSAgICBuID0gZ2V0MmMoZmQpOwkJCS8qIDxwcmVmY29uZG5yPiAqLwoJCSAgICBpZiAobiA+PSBtYXhwcmVmY29uZG5yKQoJCQlyZXR1cm4gU1BfRk9STUVSUk9SOwoJCSAgICBjIHw9IChuIDw8IDgpOwoJCX0KCQllbHNlIC8qIGMgbXVzdCBiZSBCWV9GTEFHUyBvciBCWV9GTEFHUzIgKi8KCQl7CgkJICAgIC8qIFJlYWQgZmxhZ3MgYW5kIG9wdGlvbmFsIHJlZ2lvbiBhbmQgcHJlZml4IElELiAgSW4KCQkgICAgICogaWR4c1tdIHRoZSBmbGFncyBnbyBpbiB0aGUgbG93IHR3byBieXRlcywgcmVnaW9uIGFib3ZlCgkJICAgICAqIHRoYXQgYW5kIHByZWZpeCBJRCBhYm92ZSB0aGUgcmVnaW9uLiAqLwoJCSAgICBjMiA9IGM7CgkJICAgIGMgPSBnZXRjKGZkKTsJCQkvKiA8ZmxhZ3M+ICovCgkJICAgIGlmIChjMiA9PSBCWV9GTEFHUzIpCgkJCWMgPSAoZ2V0YyhmZCkgPDwgOCkgKyBjOwkvKiA8ZmxhZ3MyPiAqLwoJCSAgICBpZiAoYyAmIFdGX1JFR0lPTikKCQkJYyA9IChnZXRjKGZkKSA8PCAxNikgKyBjOwkvKiA8cmVnaW9uPiAqLwoJCSAgICBpZiAoYyAmIFdGX0FGWCkKCQkJYyA9IChnZXRjKGZkKSA8PCAyNCkgKyBjOwkvKiA8YWZmaXhJRD4gKi8KCQl9CgoJCWlkeHNbaWR4XSA9IGM7CgkJYyA9IDA7CgkgICAgfQoJICAgIGVsc2UgLyogYyA9PSBCWV9JTkRFWCAqLwoJICAgIHsKCQkJCQkJCS8qIDxub2RlaWR4PiAqLwoJCW4gPSBnZXQzYyhmZCk7CgkJaWYgKG4gPCAwIHx8IG4gPj0gbWF4aWR4KQoJCSAgICByZXR1cm4gU1BfRk9STUVSUk9SOwoJCWlkeHNbaWR4XSA9IG4gKyBTSEFSRURfTUFTSzsKCQljID0gZ2V0YyhmZCk7CQkJCS8qIDx4Ynl0ZT4gKi8KCSAgICB9Cgl9CglieXRzW2lkeCsrXSA9IGM7CiAgICB9CgogICAgLyogUmVjdXJzaXZlbHkgcmVhZCB0aGUgY2hpbGRyZW4gZm9yIG5vbi1zaGFyZWQgc2libGluZ3MuCiAgICAgKiBTa2lwIHRoZSBlbmQtb2Ytd29yZCBvbmVzICh6ZXJvIGJ5dGUgdmFsdWUpIGFuZCB0aGUgc2hhcmVkIG9uZXMgKGFuZAogICAgICogcmVtb3ZlIFNIQVJFRF9NQVNLKSAqLwogICAgZm9yIChpID0gMTsgaSA8PSBsZW47ICsraSkKCWlmIChieXRzW3N0YXJ0aWR4ICsgaV0gIT0gMCkKCXsKCSAgICBpZiAoaWR4c1tzdGFydGlkeCArIGldICYgU0hBUkVEX01BU0spCgkJaWR4c1tzdGFydGlkeCArIGldICY9IH5TSEFSRURfTUFTSzsKCSAgICBlbHNlCgkgICAgewoJCWlkeHNbc3RhcnRpZHggKyBpXSA9IGlkeDsKCQlpZHggPSByZWFkX3RyZWVfbm9kZShmZCwgYnl0cywgaWR4cywgbWF4aWR4LCBpZHgsCgkJCQkJCSAgICAgcHJlZml4dHJlZSwgbWF4cHJlZmNvbmRucik7CgkJaWYgKGlkeCA8IDApCgkJICAgIGJyZWFrOwoJICAgIH0KCX0KCiAgICByZXR1cm4gaWR4Owp9CgovKgogKiBQYXJzZSAnc3BlbGxsYW5nJyBhbmQgc2V0IGJ1Zi0+Yl9sYW5ncCBhY2NvcmRpbmdseS4KICogUmV0dXJucyBOVUxMIGlmIGl0J3MgT0ssIGFuIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlLgogKi8KICAgIGNoYXJfdSAqCmRpZF9zZXRfc3BlbGxsYW5nKGJ1ZikKICAgIGJ1Zl9UCSpidWY7CnsKICAgIGdhcnJheV9UCWdhOwogICAgY2hhcl91CSpzcGxwOwogICAgY2hhcl91CSpyZWdpb247CiAgICBjaGFyX3UJcmVnaW9uX2NwWzNdOwogICAgaW50CQlmaWxlbmFtZTsKICAgIGludAkJcmVnaW9uX21hc2s7CiAgICBzbGFuZ19UCSpzbGFuZzsKICAgIGludAkJYzsKICAgIGNoYXJfdQlsYW5nW01BWFdMRU4gKyAxXTsKICAgIGNoYXJfdQlzcGZfbmFtZVtNQVhQQVRITF07CiAgICBpbnQJCWxlbjsKICAgIGNoYXJfdQkqcDsKICAgIGludAkJcm91bmQ7CiAgICBjaGFyX3UJKnNwZjsKICAgIGNoYXJfdQkqdXNlX3JlZ2lvbiA9IE5VTEw7CiAgICBpbnQJCWRvbnRfdXNlX3JlZ2lvbiA9IEZBTFNFOwogICAgaW50CQlub2JyZWFrID0gRkFMU0U7CiAgICBpbnQJCWksIGo7CiAgICBsYW5ncF9UCSpscCwgKmxwMjsKCiAgICBnYV9pbml0MigmZ2EsIHNpemVvZihsYW5ncF9UKSwgMik7CiAgICBjbGVhcl9taWR3b3JkKGJ1Zik7CgogICAgLyogbG9vcCBvdmVyIGNvbW1hIHNlcGFyYXRlZCBsYW5ndWFnZSBuYW1lcy4gKi8KICAgIGZvciAoc3BscCA9IGJ1Zi0+Yl9wX3NwbDsgKnNwbHAgIT0gTlVMOyApCiAgICB7CgkvKiBHZXQgb25lIGxhbmd1YWdlIG5hbWUuICovCgljb3B5X29wdGlvbl9wYXJ0KCZzcGxwLCBsYW5nLCBNQVhXTEVOLCAiLCIpOwoKCXJlZ2lvbiA9IE5VTEw7CglsZW4gPSBTVFJMRU4obGFuZyk7CgoJLyogSWYgdGhlIG5hbWUgZW5kcyBpbiAiLnNwbCIgdXNlIGl0IGFzIHRoZSBuYW1lIG9mIHRoZSBzcGVsbCBmaWxlLgoJICogSWYgdGhlcmUgaXMgYSByZWdpb24gbmFtZSBsZXQgInJlZ2lvbiIgcG9pbnQgdG8gaXQgYW5kIHJlbW92ZSBpdAoJICogZnJvbSB0aGUgbmFtZS4gKi8KCWlmIChsZW4gPiA0ICYmIGZuYW1lY21wKGxhbmcgKyBsZW4gLSA0LCAiLnNwbCIpID09IDApCgl7CgkgICAgZmlsZW5hbWUgPSBUUlVFOwoKCSAgICAvKiBMb2NhdGUgYSByZWdpb24gYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBmaWxlIG5hbWUuICovCgkgICAgcCA9IHZpbV9zdHJjaHIoZ2V0dGFpbChsYW5nKSwgJ18nKTsKCSAgICBpZiAocCAhPSBOVUxMICYmIEFTQ0lJX0lTQUxQSEEocFsxXSkgJiYgQVNDSUlfSVNBTFBIQShwWzJdKQoJCQkJCQkgICAgICAmJiAhQVNDSUlfSVNBTFBIQShwWzNdKSkKCSAgICB7CgkJdmltX3N0cm5jcHkocmVnaW9uX2NwLCBwICsgMSwgMik7CgkJbWNoX21lbW1vdmUocCwgcCArIDMsIGxlbiAtIChwIC0gbGFuZykgLSAyKTsKCQlsZW4gLT0gMzsKCQlyZWdpb24gPSByZWdpb25fY3A7CgkgICAgfQoJICAgIGVsc2UKCQlkb250X3VzZV9yZWdpb24gPSBUUlVFOwoKCSAgICAvKiBDaGVjayBpZiB3ZSBsb2FkZWQgdGhpcyBsYW5ndWFnZSBiZWZvcmUuICovCgkgICAgZm9yIChzbGFuZyA9IGZpcnN0X2xhbmc7IHNsYW5nICE9IE5VTEw7IHNsYW5nID0gc2xhbmctPnNsX25leHQpCgkJaWYgKGZ1bGxwYXRoY21wKGxhbmcsIHNsYW5nLT5zbF9mbmFtZSwgRkFMU0UpID09IEZQQ19TQU1FKQoJCSAgICBicmVhazsKCX0KCWVsc2UKCXsKCSAgICBmaWxlbmFtZSA9IEZBTFNFOwoJICAgIGlmIChsZW4gPiAzICYmIGxhbmdbbGVuIC0gM10gPT0gJ18nKQoJICAgIHsKCQlyZWdpb24gPSBsYW5nICsgbGVuIC0gMjsKCQlsZW4gLT0gMzsKCQlsYW5nW2xlbl0gPSBOVUw7CgkgICAgfQoJICAgIGVsc2UKCQlkb250X3VzZV9yZWdpb24gPSBUUlVFOwoKCSAgICAvKiBDaGVjayBpZiB3ZSBsb2FkZWQgdGhpcyBsYW5ndWFnZSBiZWZvcmUuICovCgkgICAgZm9yIChzbGFuZyA9IGZpcnN0X2xhbmc7IHNsYW5nICE9IE5VTEw7IHNsYW5nID0gc2xhbmctPnNsX25leHQpCgkJaWYgKFNUUklDTVAobGFuZywgc2xhbmctPnNsX25hbWUpID09IDApCgkJICAgIGJyZWFrOwoJfQoKCWlmIChyZWdpb24gIT0gTlVMTCkKCXsKCSAgICAvKiBJZiB0aGUgcmVnaW9uIGRpZmZlcnMgZnJvbSB3aGF0IHdhcyB1c2VkIGJlZm9yZSB0aGVuIGRvbid0CgkgICAgICogdXNlIGl0IGZvciAnc3BlbGxmaWxlJy4gKi8KCSAgICBpZiAodXNlX3JlZ2lvbiAhPSBOVUxMICYmIFNUUkNNUChyZWdpb24sIHVzZV9yZWdpb24pICE9IDApCgkJZG9udF91c2VfcmVnaW9uID0gVFJVRTsKCSAgICB1c2VfcmVnaW9uID0gcmVnaW9uOwoJfQoKCS8qIElmIG5vdCBmb3VuZCB0cnkgbG9hZGluZyB0aGUgbGFuZ3VhZ2Ugbm93LiAqLwoJaWYgKHNsYW5nID09IE5VTEwpCgl7CgkgICAgaWYgKGZpbGVuYW1lKQoJCSh2b2lkKXNwZWxsX2xvYWRfZmlsZShsYW5nLCBsYW5nLCBOVUxMLCBGQUxTRSk7CgkgICAgZWxzZQoJCXNwZWxsX2xvYWRfbGFuZyhsYW5nKTsKCX0KCgkvKgoJICogTG9vcCBvdmVyIHRoZSBsYW5ndWFnZXMsIHRoZXJlIGNhbiBiZSBzZXZlcmFsIGZpbGVzIGZvciAibGFuZyIuCgkgKi8KCWZvciAoc2xhbmcgPSBmaXJzdF9sYW5nOyBzbGFuZyAhPSBOVUxMOyBzbGFuZyA9IHNsYW5nLT5zbF9uZXh0KQoJICAgIGlmIChmaWxlbmFtZSA/IGZ1bGxwYXRoY21wKGxhbmcsIHNsYW5nLT5zbF9mbmFtZSwgRkFMU0UpID09IEZQQ19TQU1FCgkJCSA6IFNUUklDTVAobGFuZywgc2xhbmctPnNsX25hbWUpID09IDApCgkgICAgewoJCXJlZ2lvbl9tYXNrID0gUkVHSU9OX0FMTDsKCQlpZiAoIWZpbGVuYW1lICYmIHJlZ2lvbiAhPSBOVUxMKQoJCXsKCQkgICAgLyogZmluZCByZWdpb24gaW4gc2xfcmVnaW9ucyAqLwoJCSAgICBjID0gZmluZF9yZWdpb24oc2xhbmctPnNsX3JlZ2lvbnMsIHJlZ2lvbik7CgkJICAgIGlmIChjID09IFJFR0lPTl9BTEwpCgkJICAgIHsKCQkJaWYgKHNsYW5nLT5zbF9hZGQpCgkJCXsKCQkJICAgIGlmICgqc2xhbmctPnNsX3JlZ2lvbnMgIT0gTlVMKQoJCQkJLyogVGhpcyBhZGRpdGlvbiBmaWxlIGlzIGZvciBvdGhlciByZWdpb25zLiAqLwoJCQkJcmVnaW9uX21hc2sgPSAwOwoJCQl9CgkJCWVsc2UKCQkJICAgIC8qIFRoaXMgaXMgcHJvYmFibHkgYW4gZXJyb3IuICBHaXZlIGEgd2FybmluZyBhbmQKCQkJICAgICAqIGFjY2VwdCB0aGUgd29yZHMgYW55d2F5LiAqLwoJCQkgICAgc21zZygoY2hhcl91ICopCgkJCQkgICAgXygiV2FybmluZzogcmVnaW9uICVzIG5vdCBzdXBwb3J0ZWQiKSwKCQkJCQkJCQkgICAgICByZWdpb24pOwoJCSAgICB9CgkJICAgIGVsc2UKCQkJcmVnaW9uX21hc2sgPSAxIDw8IGM7CgkJfQoKCQlpZiAocmVnaW9uX21hc2sgIT0gMCkKCQl7CgkJICAgIGlmIChnYV9ncm93KCZnYSwgMSkgPT0gRkFJTCkKCQkgICAgewoJCQlnYV9jbGVhcigmZ2EpOwoJCQlyZXR1cm4gZV9vdXRvZm1lbTsKCQkgICAgfQoJCSAgICBMQU5HUF9FTlRSWShnYSwgZ2EuZ2FfbGVuKS0+bHBfc2xhbmcgPSBzbGFuZzsKCQkgICAgTEFOR1BfRU5UUlkoZ2EsIGdhLmdhX2xlbiktPmxwX3JlZ2lvbiA9IHJlZ2lvbl9tYXNrOwoJCSAgICArK2dhLmdhX2xlbjsKCQkgICAgdXNlX21pZHdvcmQoc2xhbmcsIGJ1Zik7CgkJICAgIGlmIChzbGFuZy0+c2xfbm9icmVhaykKCQkJbm9icmVhayA9IFRSVUU7CgkJfQoJICAgIH0KICAgIH0KCiAgICAvKiByb3VuZCAwOiBsb2FkIGludF93b3JkbGlzdCwgaWYgcG9zc2libGUuCiAgICAgKiByb3VuZCAxOiBsb2FkIGZpcnN0IG5hbWUgaW4gJ3NwZWxsZmlsZScuCiAgICAgKiByb3VuZCAyOiBsb2FkIHNlY29uZCBuYW1lIGluICdzcGVsbGZpbGUuCiAgICAgKiBldGMuICovCiAgICBzcGYgPSBjdXJidWYtPmJfcF9zcGY7CiAgICBmb3IgKHJvdW5kID0gMDsgcm91bmQgPT0gMCB8fCAqc3BmICE9IE5VTDsgKytyb3VuZCkKICAgIHsKCWlmIChyb3VuZCA9PSAwKQoJewoJICAgIC8qIEludGVybmFsIHdvcmRsaXN0LCBpZiB0aGVyZSBpcyBvbmUuICovCgkgICAgaWYgKGludF93b3JkbGlzdCA9PSBOVUxMKQoJCWNvbnRpbnVlOwoJICAgIGludF93b3JkbGlzdF9zcGwoc3BmX25hbWUpOwoJfQoJZWxzZQoJewoJICAgIC8qIE9uZSBlbnRyeSBpbiAnc3BlbGxmaWxlJy4gKi8KCSAgICBjb3B5X29wdGlvbl9wYXJ0KCZzcGYsIHNwZl9uYW1lLCBNQVhQQVRITCAtIDUsICIsIik7CgkgICAgU1RSQ0FUKHNwZl9uYW1lLCAiLnNwbCIpOwoKCSAgICAvKiBJZiBpdCB3YXMgYWxyZWFkeSBmb3VuZCBhYm92ZSB0aGVuIHNraXAgaXQuICovCgkgICAgZm9yIChjID0gMDsgYyA8IGdhLmdhX2xlbjsgKytjKQoJICAgIHsKCQlwID0gTEFOR1BfRU5UUlkoZ2EsIGMpLT5scF9zbGFuZy0+c2xfZm5hbWU7CgkJaWYgKHAgIT0gTlVMTCAmJiBmdWxscGF0aGNtcChzcGZfbmFtZSwgcCwgRkFMU0UpID09IEZQQ19TQU1FKQoJCSAgICBicmVhazsKCSAgICB9CgkgICAgaWYgKGMgPCBnYS5nYV9sZW4pCgkJY29udGludWU7Cgl9CgoJLyogQ2hlY2sgaWYgaXQgd2FzIGxvYWRlZCBhbHJlYWR5LiAqLwoJZm9yIChzbGFuZyA9IGZpcnN0X2xhbmc7IHNsYW5nICE9IE5VTEw7IHNsYW5nID0gc2xhbmctPnNsX25leHQpCgkgICAgaWYgKGZ1bGxwYXRoY21wKHNwZl9uYW1lLCBzbGFuZy0+c2xfZm5hbWUsIEZBTFNFKSA9PSBGUENfU0FNRSkKCQlicmVhazsKCWlmIChzbGFuZyA9PSBOVUxMKQoJewoJICAgIC8qIE5vdCBsb2FkZWQsIHRyeSBsb2FkaW5nIGl0IG5vdy4gIFRoZSBsYW5ndWFnZSBuYW1lIGluY2x1ZGVzIHRoZQoJICAgICAqIHJlZ2lvbiBuYW1lLCB0aGUgcmVnaW9uIGlzIGlnbm9yZWQgb3RoZXJ3aXNlLiAgZm9yIGludF93b3JkbGlzdAoJICAgICAqIHVzZSBhbiBhcmJpdHJhcnkgbmFtZS4gKi8KCSAgICBpZiAocm91bmQgPT0gMCkKCQlTVFJDUFkobGFuZywgImludGVybmFsIHdvcmRsaXN0Iik7CgkgICAgZWxzZQoJICAgIHsKCQl2aW1fc3RybmNweShsYW5nLCBnZXR0YWlsKHNwZl9uYW1lKSwgTUFYV0xFTik7CgkJcCA9IHZpbV9zdHJjaHIobGFuZywgJy4nKTsKCQlpZiAocCAhPSBOVUxMKQoJCSAgICAqcCA9IE5VTDsJLyogdHJ1bmNhdGUgYXQgIi5lbmNvZGluZy5hZGQiICovCgkgICAgfQoJICAgIHNsYW5nID0gc3BlbGxfbG9hZF9maWxlKHNwZl9uYW1lLCBsYW5nLCBOVUxMLCBUUlVFKTsKCgkgICAgLyogSWYgb25lIG9mIHRoZSBsYW5ndWFnZXMgaGFzIE5PQlJFQUsgd2UgYXNzdW1lIHRoZSBhZGRpdGlvbgoJICAgICAqIGZpbGVzIGFsc28gaGF2ZSB0aGlzLiAqLwoJICAgIGlmIChzbGFuZyAhPSBOVUxMICYmIG5vYnJlYWspCgkJc2xhbmctPnNsX25vYnJlYWsgPSBUUlVFOwoJfQoJaWYgKHNsYW5nICE9IE5VTEwgJiYgZ2FfZ3JvdygmZ2EsIDEpID09IE9LKQoJewoJICAgIHJlZ2lvbl9tYXNrID0gUkVHSU9OX0FMTDsKCSAgICBpZiAodXNlX3JlZ2lvbiAhPSBOVUxMICYmICFkb250X3VzZV9yZWdpb24pCgkgICAgewoJCS8qIGZpbmQgcmVnaW9uIGluIHNsX3JlZ2lvbnMgKi8KCQljID0gZmluZF9yZWdpb24oc2xhbmctPnNsX3JlZ2lvbnMsIHVzZV9yZWdpb24pOwoJCWlmIChjICE9IFJFR0lPTl9BTEwpCgkJICAgIHJlZ2lvbl9tYXNrID0gMSA8PCBjOwoJCWVsc2UgaWYgKCpzbGFuZy0+c2xfcmVnaW9ucyAhPSBOVUwpCgkJICAgIC8qIFRoaXMgc3BlbGwgZmlsZSBpcyBmb3Igb3RoZXIgcmVnaW9ucy4gKi8KCQkgICAgcmVnaW9uX21hc2sgPSAwOwoJICAgIH0KCgkgICAgaWYgKHJlZ2lvbl9tYXNrICE9IDApCgkgICAgewoJCUxBTkdQX0VOVFJZKGdhLCBnYS5nYV9sZW4pLT5scF9zbGFuZyA9IHNsYW5nOwoJCUxBTkdQX0VOVFJZKGdhLCBnYS5nYV9sZW4pLT5scF9zYWxsYW5nID0gTlVMTDsKCQlMQU5HUF9FTlRSWShnYSwgZ2EuZ2FfbGVuKS0+bHBfcmVwbGFuZyA9IE5VTEw7CgkJTEFOR1BfRU5UUlkoZ2EsIGdhLmdhX2xlbiktPmxwX3JlZ2lvbiA9IHJlZ2lvbl9tYXNrOwoJCSsrZ2EuZ2FfbGVuOwoJCXVzZV9taWR3b3JkKHNsYW5nLCBidWYpOwoJICAgIH0KCX0KICAgIH0KCiAgICAvKiBFdmVyeXRoaW5nIGlzIGZpbmUsIHN0b3JlIHRoZSBuZXcgYl9sYW5ncCB2YWx1ZS4gKi8KICAgIGdhX2NsZWFyKCZidWYtPmJfbGFuZ3ApOwogICAgYnVmLT5iX2xhbmdwID0gZ2E7CgogICAgLyogRm9yIGVhY2ggbGFuZ3VhZ2UgZmlndXJlIG91dCB3aGF0IGxhbmd1YWdlIHRvIHVzZSBmb3Igc291bmQgZm9sZGluZyBhbmQKICAgICAqIFJFUCBpdGVtcy4gIElmIHRoZSBsYW5ndWFnZSBkb2Vzbid0IHN1cHBvcnQgaXQgaXRzZWxmIHVzZSBhbm90aGVyIG9uZQogICAgICogd2l0aCB0aGUgc2FtZSBuYW1lLiAgRS5nLiBmb3IgImVuLW1hdGgiIHVzZSAiZW4iLiAqLwogICAgZm9yIChpID0gMDsgaSA8IGdhLmdhX2xlbjsgKytpKQogICAgewoJbHAgPSBMQU5HUF9FTlRSWShnYSwgaSk7CgoJLyogc291bmQgZm9sZGluZyAqLwoJaWYgKGxwLT5scF9zbGFuZy0+c2xfc2FsLmdhX2xlbiA+IDApCgkgICAgLyogbGFuZ3VhZ2UgZG9lcyBzb3VuZCBmb2xkaW5nIGl0c2VsZiAqLwoJICAgIGxwLT5scF9zYWxsYW5nID0gbHAtPmxwX3NsYW5nOwoJZWxzZQoJICAgIC8qIGZpbmQgZmlyc3Qgc2ltaWxhciBsYW5ndWFnZSB0aGF0IGRvZXMgc291bmQgZm9sZGluZyAqLwoJICAgIGZvciAoaiA9IDA7IGogPCBnYS5nYV9sZW47ICsraikKCSAgICB7CgkJbHAyID0gTEFOR1BfRU5UUlkoZ2EsIGopOwoJCWlmIChscDItPmxwX3NsYW5nLT5zbF9zYWwuZ2FfbGVuID4gMAoJCQkmJiBTVFJOQ01QKGxwLT5scF9zbGFuZy0+c2xfbmFtZSwKCQkJCQkgICAgICBscDItPmxwX3NsYW5nLT5zbF9uYW1lLCAyKSA9PSAwKQoJCXsKCQkgICAgbHAtPmxwX3NhbGxhbmcgPSBscDItPmxwX3NsYW5nOwoJCSAgICBicmVhazsKCQl9CgkgICAgfQoKCS8qIFJFUCBpdGVtcyAqLwoJaWYgKGxwLT5scF9zbGFuZy0+c2xfcmVwLmdhX2xlbiA+IDApCgkgICAgLyogbGFuZ3VhZ2UgaGFzIFJFUCBpdGVtcyBpdHNlbGYgKi8KCSAgICBscC0+bHBfcmVwbGFuZyA9IGxwLT5scF9zbGFuZzsKCWVsc2UKCSAgICAvKiBmaW5kIGZpcnN0IHNpbWlsYXIgbGFuZ3VhZ2UgdGhhdCBoYXMgUkVQIGl0ZW1zICovCgkgICAgZm9yIChqID0gMDsgaiA8IGdhLmdhX2xlbjsgKytqKQoJICAgIHsKCQlscDIgPSBMQU5HUF9FTlRSWShnYSwgaik7CgkJaWYgKGxwMi0+bHBfc2xhbmctPnNsX3JlcC5nYV9sZW4gPiAwCgkJCSYmIFNUUk5DTVAobHAtPmxwX3NsYW5nLT5zbF9uYW1lLAoJCQkJCSAgICAgIGxwMi0+bHBfc2xhbmctPnNsX25hbWUsIDIpID09IDApCgkJewoJCSAgICBscC0+bHBfcmVwbGFuZyA9IGxwMi0+bHBfc2xhbmc7CgkJICAgIGJyZWFrOwoJCX0KCSAgICB9CiAgICB9CgogICAgcmV0dXJuIE5VTEw7Cn0KCi8qCiAqIENsZWFyIHRoZSBtaWR3b3JkIGNoYXJhY3RlcnMgZm9yIGJ1ZmZlciAiYnVmIi4KICovCiAgICBzdGF0aWMgdm9pZApjbGVhcl9taWR3b3JkKGJ1ZikKICAgIGJ1Zl9UCSpidWY7CnsKICAgIHZpbV9tZW1zZXQoYnVmLT5iX3NwZWxsX2lzbXcsIDAsIDI1Nik7CiNpZmRlZiBGRUFUX01CWVRFCiAgICB2aW1fZnJlZShidWYtPmJfc3BlbGxfaXNtd19tYik7CiAgICBidWYtPmJfc3BlbGxfaXNtd19tYiA9IE5VTEw7CiNlbmRpZgp9CgovKgogKiBVc2UgdGhlICJzbF9taWR3b3JkIiBmaWVsZCBvZiBsYW5ndWFnZSAibHAiIGZvciBidWZmZXIgImJ1ZiIuCiAqIFRoZXkgYWRkIHVwIHRvIGFueSBjdXJyZW50bHkgdXNlZCBtaWR3b3JkIGNoYXJhY3RlcnMuCiAqLwogICAgc3RhdGljIHZvaWQKdXNlX21pZHdvcmQobHAsIGJ1ZikKICAgIHNsYW5nX1QJKmxwOwogICAgYnVmX1QJKmJ1ZjsKewogICAgY2hhcl91CSpwOwoKICAgIGlmIChscC0+c2xfbWlkd29yZCA9PSBOVUxMKQkgICAgLyogdGhlcmUgYXJlbid0IGFueSAqLwoJcmV0dXJuOwoKICAgIGZvciAocCA9IGxwLT5zbF9taWR3b3JkOyAqcCAhPSBOVUw7ICkKI2lmZGVmIEZFQVRfTUJZVEUKCWlmIChoYXNfbWJ5dGUpCgl7CgkgICAgaW50CSAgICBjLCBsLCBuOwoJICAgIGNoYXJfdSAgKmJwOwoKCSAgICBjID0gbWJfcHRyMmNoYXIocCk7CgkgICAgbCA9ICgqbWJfcHRyMmxlbikocCk7CgkgICAgaWYgKGMgPCAyNTYgJiYgbCA8PSAyKQoJCWJ1Zi0+Yl9zcGVsbF9pc213W2NdID0gVFJVRTsKCSAgICBlbHNlIGlmIChidWYtPmJfc3BlbGxfaXNtd19tYiA9PSBOVUxMKQoJCS8qIEZpcnN0IG11bHRpLWJ5dGUgY2hhciBpbiAiYl9zcGVsbF9pc213X21iIi4gKi8KCQlidWYtPmJfc3BlbGxfaXNtd19tYiA9IHZpbV9zdHJuc2F2ZShwLCBsKTsKCSAgICBlbHNlCgkgICAgewoJCS8qIEFwcGVuZCBtdWx0aS1ieXRlIGNoYXJzIHRvICJiX3NwZWxsX2lzbXdfbWIiLiAqLwoJCW4gPSBTVFJMRU4oYnVmLT5iX3NwZWxsX2lzbXdfbWIpOwoJCWJwID0gdmltX3N0cm5zYXZlKGJ1Zi0+Yl9zcGVsbF9pc213X21iLCBuICsgbCk7CgkJaWYgKGJwICE9IE5VTEwpCgkJewoJCSAgICB2aW1fZnJlZShidWYtPmJfc3BlbGxfaXNtd19tYik7CgkJICAgIGJ1Zi0+Yl9zcGVsbF9pc213X21iID0gYnA7CgkJICAgIHZpbV9zdHJuY3B5KGJwICsgbiwgcCwgbCk7CgkJfQoJICAgIH0KCSAgICBwICs9IGw7Cgl9CgllbHNlCiNlbmRpZgoJICAgIGJ1Zi0+Yl9zcGVsbF9pc213WypwKytdID0gVFJVRTsKfQoKLyoKICogRmluZCB0aGUgcmVnaW9uICJyZWdpb25bMl0iIGluICJycCIgKHBvaW50cyB0byAic2xfcmVnaW9ucyIpLgogKiBFYWNoIHJlZ2lvbiBpcyBzaW1wbHkgc3RvcmVkIGFzIHRoZSB0d28gY2hhcmFjdGVycyBvZiBpdCdzIG5hbWUuCiAqIFJldHVybnMgdGhlIGluZGV4IGlmIGZvdW5kIChmaXJzdCBpcyAwKSwgUkVHSU9OX0FMTCBpZiBub3QgZm91bmQuCiAqLwogICAgc3RhdGljIGludApmaW5kX3JlZ2lvbihycCwgcmVnaW9uKQogICAgY2hhcl91CSpycDsKICAgIGNoYXJfdQkqcmVnaW9uOwp7CiAgICBpbnQJCWk7CgogICAgZm9yIChpID0gMDsgOyBpICs9IDIpCiAgICB7CglpZiAocnBbaV0gPT0gTlVMKQoJICAgIHJldHVybiBSRUdJT05fQUxMOwoJaWYgKHJwW2ldID09IHJlZ2lvblswXSAmJiBycFtpICsgMV0gPT0gcmVnaW9uWzFdKQoJICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIGkgLyAyOwp9CgovKgogKiBSZXR1cm4gY2FzZSB0eXBlIG9mIHdvcmQ6CiAqIHcgd29yZAkwCiAqIFdvcmQJCVdGX09ORUNBUAogKiBXIFdPUkQJV0ZfQUxMQ0FQCiAqIFdvUmQJd09yZAlXRl9LRUVQQ0FQCiAqLwogICAgc3RhdGljIGludApjYXB0eXBlKHdvcmQsIGVuZCkKICAgIGNoYXJfdQkqd29yZDsKICAgIGNoYXJfdQkqZW5kOwkgICAgLyogV2hlbiBOVUxMIHVzZSB1cCB0byBOVUwgYnl0ZS4gKi8KewogICAgY2hhcl91CSpwOwogICAgaW50CQljOwogICAgaW50CQlmaXJzdGNhcDsKICAgIGludAkJYWxsY2FwOwogICAgaW50CQlwYXN0X3NlY29uZCA9IEZBTFNFOwkvKiBwYXN0IHNlY29uZCB3b3JkIGNoYXIgKi8KCiAgICAvKiBmaW5kIGZpcnN0IGxldHRlciAqLwogICAgZm9yIChwID0gd29yZDsgIXNwZWxsX2lzd29yZHBfbm13KHApOyBtYl9wdHJfYWR2KHApKQoJaWYgKGVuZCA9PSBOVUxMID8gKnAgPT0gTlVMIDogcCA+PSBlbmQpCgkgICAgcmV0dXJuIDA7CSAgICAvKiBvbmx5IG5vbi13b3JkIGNoYXJhY3RlcnMsIGlsbGVnYWwgd29yZCAqLwojaWZkZWYgRkVBVF9NQllURQogICAgaWYgKGhhc19tYnl0ZSkKCWMgPSBtYl9wdHIyY2hhcl9hZHYoJnApOwogICAgZWxzZQojZW5kaWYKCWMgPSAqcCsrOwogICAgZmlyc3RjYXAgPSBhbGxjYXAgPSBTUEVMTF9JU1VQUEVSKGMpOwoKICAgIC8qCiAgICAgKiBOZWVkIHRvIGNoZWNrIGFsbCBsZXR0ZXJzIHRvIGZpbmQgYSB3b3JkIHdpdGggbWl4ZWQgdXBwZXIvbG93ZXIuCiAgICAgKiBCdXQgYSB3b3JkIHdpdGggYW4gdXBwZXIgY2hhciBvbmx5IGF0IHN0YXJ0IGlzIGEgT05FQ0FQLgogICAgICovCiAgICBmb3IgKCA7IGVuZCA9PSBOVUxMID8gKnAgIT0gTlVMIDogcCA8IGVuZDsgbWJfcHRyX2FkdihwKSkKCWlmIChzcGVsbF9pc3dvcmRwX25tdyhwKSkKCXsKCSAgICBjID0gUFRSMkNIQVIocCk7CgkgICAgaWYgKCFTUEVMTF9JU1VQUEVSKGMpKQoJICAgIHsKCQkvKiBVVWwgLT4gS0VFUENBUCAqLwoJCWlmIChwYXN0X3NlY29uZCAmJiBhbGxjYXApCgkJICAgIHJldHVybiBXRl9LRUVQQ0FQOwoJCWFsbGNhcCA9IEZBTFNFOwoJICAgIH0KCSAgICBlbHNlIGlmICghYWxsY2FwKQoJCS8qIFVsVSAtPiBLRUVQQ0FQICovCgkJcmV0dXJuIFdGX0tFRVBDQVA7CgkgICAgcGFzdF9zZWNvbmQgPSBUUlVFOwoJfQoKICAgIGlmIChhbGxjYXApCglyZXR1cm4gV0ZfQUxMQ0FQOwogICAgaWYgKGZpcnN0Y2FwKQoJcmV0dXJuIFdGX09ORUNBUDsKICAgIHJldHVybiAwOwp9CgovKgogKiBMaWtlIGNhcHR5cGUoKSBidXQgZm9yIGEgS0VFUENBUCB3b3JkIGFkZCBPTkVDQVAgaWYgdGhlIHdvcmQgc3RhcnRzIHdpdGggYQogKiBjYXBpdGFsLiAgU28gdGhhdCBtYWtlX2Nhc2Vfd29yZCgpIGNhbiB0dXJuIFdPcmQgaW50byBXb3JkLgogKiBBZGQgQUxMQ0FQIGZvciAiV09yRCIuCiAqLwogICAgc3RhdGljIGludApiYWR3b3JkX2NhcHR5cGUod29yZCwgZW5kKQogICAgY2hhcl91CSp3b3JkOwogICAgY2hhcl91CSplbmQ7CnsKICAgIGludAkJZmxhZ3MgPSBjYXB0eXBlKHdvcmQsIGVuZCk7CiAgICBpbnQJCWM7CiAgICBpbnQJCWwsIHU7CiAgICBpbnQJCWZpcnN0OwogICAgY2hhcl91CSpwOwoKICAgIGlmIChmbGFncyAmIFdGX0tFRVBDQVApCiAgICB7CgkvKiBDb3VudCB0aGUgbnVtYmVyIG9mIFVQUEVSIGFuZCBsb3dlciBjYXNlIGxldHRlcnMuICovCglsID0gdSA9IDA7CglmaXJzdCA9IEZBTFNFOwoJZm9yIChwID0gd29yZDsgcCA8IGVuZDsgbWJfcHRyX2FkdihwKSkKCXsKCSAgICBjID0gUFRSMkNIQVIocCk7CgkgICAgaWYgKFNQRUxMX0lTVVBQRVIoYykpCgkgICAgewoJCSsrdTsKCQlpZiAocCA9PSB3b3JkKQoJCSAgICBmaXJzdCA9IFRSVUU7CgkgICAgfQoJICAgIGVsc2UKCQkrK2w7Cgl9CgoJLyogSWYgdGhlcmUgYXJlIG1vcmUgVVBQRVIgdGhhbiBsb3dlciBjYXNlIGxldHRlcnMgc3VnZ2VzdCBhbgoJICogQUxMQ0FQIHdvcmQuICBPdGhlcndpc2UsIGlmIHRoZSBmaXJzdCBsZXR0ZXIgaXMgVVBQRVIgdGhlbgoJICogc3VnZ2VzdCBPTkVDQVAuICBFeGNlcHRpb246ICJBTGwiIG1vc3QgbGlrZWx5IHNob3VsZCBiZSAiQWxsIiwKCSAqIHJlcXVpcmUgdGhyZWUgdXBwZXIgY2FzZSBsZXR0ZXJzLiAqLwoJaWYgKHUgPiBsICYmIHUgPiAyKQoJICAgIGZsYWdzIHw9IFdGX0FMTENBUDsKCWVsc2UgaWYgKGZpcnN0KQoJICAgIGZsYWdzIHw9IFdGX09ORUNBUDsKCglpZiAodSA+PSAyICYmIGwgPj0gMikJLyogbWFDQVJPTkkgbWFDQXJvbmkgKi8KCSAgICBmbGFncyB8PSBXRl9NSVhDQVA7CiAgICB9CiAgICByZXR1cm4gZmxhZ3M7Cn0KCiMgaWYgZGVmaW5lZChGRUFUX01CWVRFKSB8fCBkZWZpbmVkKEVYSVRGUkVFKSB8fCBkZWZpbmVkKFBST1RPKQovKgogKiBGcmVlIGFsbCBsYW5ndWFnZXMuCiAqLwogICAgdm9pZApzcGVsbF9mcmVlX2FsbCgpCnsKICAgIHNsYW5nX1QJKnNsYW5nOwogICAgYnVmX1QJKmJ1ZjsKICAgIGNoYXJfdQlmbmFtZVtNQVhQQVRITF07CgogICAgLyogR28gdGhyb3VnaCBhbGwgYnVmZmVycyBhbmQgaGFuZGxlICdzcGVsbGxhbmcnLiAqLwogICAgZm9yIChidWYgPSBmaXJzdGJ1ZjsgYnVmICE9IE5VTEw7IGJ1ZiA9IGJ1Zi0+Yl9uZXh0KQoJZ2FfY2xlYXIoJmJ1Zi0+Yl9sYW5ncCk7CgogICAgd2hpbGUgKGZpcnN0X2xhbmcgIT0gTlVMTCkKICAgIHsKCXNsYW5nID0gZmlyc3RfbGFuZzsKCWZpcnN0X2xhbmcgPSBzbGFuZy0+c2xfbmV4dDsKCXNsYW5nX2ZyZWUoc2xhbmcpOwogICAgfQoKICAgIGlmIChpbnRfd29yZGxpc3QgIT0gTlVMTCkKICAgIHsKCS8qIERlbGV0ZSB0aGUgaW50ZXJuYWwgd29yZGxpc3QgYW5kIGl0cyAuc3BsIGZpbGUgKi8KCW1jaF9yZW1vdmUoaW50X3dvcmRsaXN0KTsKCWludF93b3JkbGlzdF9zcGwoZm5hbWUpOwoJbWNoX3JlbW92ZShmbmFtZSk7Cgl2aW1fZnJlZShpbnRfd29yZGxpc3QpOwoJaW50X3dvcmRsaXN0ID0gTlVMTDsKICAgIH0KCiAgICBpbml0X3NwZWxsX2NoYXJ0YWIoKTsKCiAgICB2aW1fZnJlZShyZXBsX3RvKTsKICAgIHJlcGxfdG8gPSBOVUxMOwogICAgdmltX2ZyZWUocmVwbF9mcm9tKTsKICAgIHJlcGxfZnJvbSA9IE5VTEw7Cn0KIyBlbmRpZgoKIyBpZiBkZWZpbmVkKEZFQVRfTUJZVEUpIHx8IGRlZmluZWQoUFJPVE8pCi8qCiAqIENsZWFyIGFsbCBzcGVsbGluZyB0YWJsZXMgYW5kIHJlbG9hZCB0aGVtLgogKiBVc2VkIGFmdGVyICdlbmNvZGluZycgaXMgc2V0IGFuZCB3aGVuICI6bWtzcGVsbCIgd2FzIHVzZWQuCiAqLwogICAgdm9pZApzcGVsbF9yZWxvYWQoKQp7CiAgICBidWZfVAkqYnVmOwogICAgd2luX1QJKndwOwoKICAgIC8qIEluaXRpYWxpemUgdGhlIHRhYmxlIGZvciBzcGVsbF9pc3dvcmRwKCkuICovCiAgICBpbml0X3NwZWxsX2NoYXJ0YWIoKTsKCiAgICAvKiBVbmxvYWQgYWxsIGFsbG9jYXRlZCBtZW1vcnkuICovCiAgICBzcGVsbF9mcmVlX2FsbCgpOwoKICAgIC8qIEdvIHRocm91Z2ggYWxsIGJ1ZmZlcnMgYW5kIGhhbmRsZSAnc3BlbGxsYW5nJy4gKi8KICAgIGZvciAoYnVmID0gZmlyc3RidWY7IGJ1ZiAhPSBOVUxMOyBidWYgPSBidWYtPmJfbmV4dCkKICAgIHsKCS8qIE9ubHkgbG9hZCB0aGUgd29yZGxpc3RzIHdoZW4gJ3NwZWxsbGFuZycgaXMgc2V0IGFuZCB0aGVyZSBpcyBhCgkgKiB3aW5kb3cgZm9yIHRoaXMgYnVmZmVyIGluIHdoaWNoICdzcGVsbCcgaXMgc2V0LiAqLwoJaWYgKCpidWYtPmJfcF9zcGwgIT0gTlVMKQoJewoJICAgIEZPUl9BTExfV0lORE9XUyh3cCkKCQlpZiAod3AtPndfYnVmZmVyID09IGJ1ZiAmJiB3cC0+d19wX3NwZWxsKQoJCXsKCQkgICAgKHZvaWQpZGlkX3NldF9zcGVsbGxhbmcoYnVmKTsKIyBpZmRlZiBGRUFUX1dJTkRPV1MKCQkgICAgYnJlYWs7CiMgZW5kaWYKCQl9Cgl9CiAgICB9Cn0KIyBlbmRpZgoKLyoKICogUmVsb2FkIHRoZSBzcGVsbCBmaWxlICJmbmFtZSIgaWYgaXQncyBsb2FkZWQuCiAqLwogICAgc3RhdGljIHZvaWQKc3BlbGxfcmVsb2FkX29uZShmbmFtZSwgYWRkZWRfd29yZCkKICAgIGNoYXJfdQkqZm5hbWU7CiAgICBpbnQJCWFkZGVkX3dvcmQ7CS8qIGludm9rZWQgdGhyb3VnaCAiemciICovCnsKICAgIHNsYW5nX1QJKnNsYW5nOwogICAgaW50CQlkaWRpdCA9IEZBTFNFOwoKICAgIGZvciAoc2xhbmcgPSBmaXJzdF9sYW5nOyBzbGFuZyAhPSBOVUxMOyBzbGFuZyA9IHNsYW5nLT5zbF9uZXh0KQogICAgewoJaWYgKGZ1bGxwYXRoY21wKGZuYW1lLCBzbGFuZy0+c2xfZm5hbWUsIEZBTFNFKSA9PSBGUENfU0FNRSkKCXsKCSAgICBzbGFuZ19jbGVhcihzbGFuZyk7CgkgICAgaWYgKHNwZWxsX2xvYWRfZmlsZShmbmFtZSwgTlVMTCwgc2xhbmcsIEZBTFNFKSA9PSBOVUxMKQoJCS8qIHJlbG9hZGluZyBmYWlsZWQsIGNsZWFyIHRoZSBsYW5ndWFnZSAqLwoJCXNsYW5nX2NsZWFyKHNsYW5nKTsKCSAgICByZWRyYXdfYWxsX2xhdGVyKFNPTUVfVkFMSUQpOwoJICAgIGRpZGl0ID0gVFJVRTsKCX0KICAgIH0KCiAgICAvKiBXaGVuICJ6ZyIgd2FzIHVzZWQgYW5kIHRoZSBmaWxlIHdhc24ndCBsb2FkZWQgeWV0LCBzaG91bGQgcmVkbwogICAgICogJ3NwZWxsbGFuZycgdG8gbG9hZCBpdCBub3cuICovCiAgICBpZiAoYWRkZWRfd29yZCAmJiAhZGlkaXQpCglkaWRfc2V0X3NwZWxsbGFuZyhjdXJidWYpOwp9CgoKLyoKICogRnVuY3Rpb25zIGZvciAiOm1rc3BlbGwiLgogKi8KCiNkZWZpbmUgTUFYTElORUxFTiAgNTAwCQkvKiBNYXhpbXVtIGxlbmd0aCBpbiBieXRlcyBvZiBhIGxpbmUgaW4gYSAuYWZmCgkJCQkgICBhbmQgLmRpYyBmaWxlLiAqLwovKgogKiBNYWluIHN0cnVjdHVyZSB0byBzdG9yZSB0aGUgY29udGVudHMgb2YgYSAiLmFmZiIgZmlsZS4KICovCnR5cGVkZWYgc3RydWN0IGFmZmZpbGVfUwp7CiAgICBjaGFyX3UJKmFmX2VuYzsJLyogIlNFVCIsIG5vcm1hbGl6ZWQsIGFsbG9jJ2VkIHN0cmluZyBvciBOVUxMICovCiAgICBpbnQJCWFmX2ZsYWd0eXBlOwkvKiBBRlRfQ0hBUiwgQUZUX0xPTkcsIEFGVF9OVU0gb3IgQUZUX0NBUExPTkcgKi8KICAgIHVuc2lnbmVkCWFmX3JhcmU7CS8qIFJBUkUgSUQgZm9yIHJhcmUgd29yZCAqLwogICAgdW5zaWduZWQJYWZfa2VlcGNhc2U7CS8qIEtFRVBDQVNFIElEIGZvciBrZWVwLWNhc2Ugd29yZCAqLwogICAgdW5zaWduZWQJYWZfYmFkOwkJLyogQkFEIElEIGZvciBiYW5uZWQgd29yZCAqLwogICAgdW5zaWduZWQJYWZfbmVlZGFmZml4OwkvKiBORUVEQUZGSVggSUQgKi8KICAgIHVuc2lnbmVkCWFmX2NpcmN1bWZpeDsJLyogQ0lSQ1VNRklYIElEICovCiAgICB1bnNpZ25lZAlhZl9uZWVkY29tcDsJLyogTkVFRENPTVBPVU5EIElEICovCiAgICB1bnNpZ25lZAlhZl9jb21wcm9vdDsJLyogQ09NUE9VTkRST09UIElEICovCiAgICB1bnNpZ25lZAlhZl9jb21wZm9yYmlkOwkvKiBDT01QT1VOREZPUkJJREZMQUcgSUQgKi8KICAgIHVuc2lnbmVkCWFmX2NvbXBwZXJtaXQ7CS8qIENPTVBPVU5EUEVSTUlURkxBRyBJRCAqLwogICAgdW5zaWduZWQJYWZfbm9zdWdnZXN0OwkvKiBOT1NVR0dFU1QgSUQgKi8KICAgIGludAkJYWZfcGZ4cG9zdHBvbmU7CS8qIHBvc3Rwb25lIHByZWZpeGVzIHdpdGhvdXQgY2hvcCBzdHJpbmcgYW5kCgkJCQkgICB3aXRob3V0IGZsYWdzICovCiAgICBoYXNodGFiX1QJYWZfcHJlZjsJLyogaGFzaHRhYmxlIGZvciBwcmVmaXhlcywgYWZmaGVhZGVyX1QgKi8KICAgIGhhc2h0YWJfVAlhZl9zdWZmOwkvKiBoYXNodGFibGUgZm9yIHN1ZmZpeGVzLCBhZmZoZWFkZXJfVCAqLwogICAgaGFzaHRhYl9UCWFmX2NvbXA7CS8qIGhhc2h0YWJsZSBmb3IgY29tcG91bmQgZmxhZ3MsIGNvbXBpdGVtX1QgKi8KfSBhZmZmaWxlX1Q7CgojZGVmaW5lIEFGVF9DSEFSCTAJLyogZmxhZ3MgYXJlIG9uZSBjaGFyYWN0ZXIgKi8KI2RlZmluZSBBRlRfTE9ORwkxCS8qIGZsYWdzIGFyZSB0d28gY2hhcmFjdGVycyAqLwojZGVmaW5lIEFGVF9DQVBMT05HCTIJLyogZmxhZ3MgYXJlIG9uZSBvciB0d28gY2hhcmFjdGVycyAqLwojZGVmaW5lIEFGVF9OVU0JCTMJLyogZmxhZ3MgYXJlIG51bWJlcnMsIGNvbW1hIHNlcGFyYXRlZCAqLwoKdHlwZWRlZiBzdHJ1Y3QgYWZmZW50cnlfUyBhZmZlbnRyeV9UOwovKiBBZmZpeCBlbnRyeSBmcm9tICIuYWZmIiBmaWxlLiAgVXNlZCBmb3IgcHJlZml4ZXMgYW5kIHN1ZmZpeGVzLiAqLwpzdHJ1Y3QgYWZmZW50cnlfUwp7CiAgICBhZmZlbnRyeV9UCSphZV9uZXh0OwkvKiBuZXh0IGFmZml4IHdpdGggc2FtZSBuYW1lL251bWJlciAqLwogICAgY2hhcl91CSphZV9jaG9wOwkvKiB0ZXh0IHRvIGNob3Agb2ZmIGJhc2ljIHdvcmQgKGNhbiBiZSBOVUxMKSAqLwogICAgY2hhcl91CSphZV9hZGQ7CS8qIHRleHQgdG8gYWRkIHRvIGJhc2ljIHdvcmQgKGNhbiBiZSBOVUxMKSAqLwogICAgY2hhcl91CSphZV9mbGFnczsJLyogZmxhZ3Mgb24gdGhlIGFmZml4IChjYW4gYmUgTlVMTCkgKi8KICAgIGNoYXJfdQkqYWVfY29uZDsJLyogY29uZGl0aW9uIChOVUxMIGZvciAiLiIpICovCiAgICByZWdwcm9nX1QJKmFlX3Byb2c7CS8qIHJlZ2V4cCBwcm9ncmFtIGZvciBhZV9jb25kIG9yIE5VTEwgKi8KICAgIGNoYXIJYWVfY29tcGZvcmJpZDsJLyogQ09NUE9VTkRGT1JCSURGTEFHIGZvdW5kICovCiAgICBjaGFyCWFlX2NvbXBwZXJtaXQ7CS8qIENPTVBPVU5EUEVSTUlURkxBRyBmb3VuZCAqLwp9OwoKI2lmZGVmIEZFQVRfTUJZVEUKIyBkZWZpbmUgQUhfS0VZX0xFTiAxNwkJLyogMiB4IDggYnl0ZXMgKyBOVUwgKi8KI2Vsc2UKIyBkZWZpbmUgQUhfS0VZX0xFTiA3CQkvKiA2IGRpZ2l0cyArIE5VTCAqLwojZW5kaWYKCi8qIEFmZml4IGhlYWRlciBmcm9tICIuYWZmIiBmaWxlLiAgVXNlZCBmb3IgYWZfcHJlZiBhbmQgYWZfc3VmZi4gKi8KdHlwZWRlZiBzdHJ1Y3QgYWZmaGVhZGVyX1MKewogICAgY2hhcl91CWFoX2tleVtBSF9LRVlfTEVOXTsgLyoga2V5IGZvciBoYXNodGFiID09IG5hbWUgb2YgYWZmaXggKi8KICAgIHVuc2lnbmVkCWFoX2ZsYWc7CS8qIGFmZml4IG5hbWUgYXMgbnVtYmVyLCB1c2VzICJhZl9mbGFndHlwZSIgKi8KICAgIGludAkJYWhfbmV3SUQ7CS8qIHByZWZpeCBJRCBhZnRlciByZW51bWJlcmluZzsgMCBpZiBub3QgdXNlZCAqLwogICAgaW50CQlhaF9jb21iaW5lOwkvKiBzdWZmaXggbWF5IGNvbWJpbmUgd2l0aCBwcmVmaXggKi8KICAgIGludAkJYWhfZm9sbG93czsJLyogYW5vdGhlciBhZmZpeCBibG9jayBzaG91bGQgYmUgZm9sbG93aW5nICovCiAgICBhZmZlbnRyeV9UCSphaF9maXJzdDsJLyogZmlyc3QgYWZmaXggZW50cnkgKi8KfSBhZmZoZWFkZXJfVDsKCiNkZWZpbmUgSEkyQUgoaGkpICAgKChhZmZoZWFkZXJfVCAqKShoaSktPmhpX2tleSkKCi8qIEZsYWcgdXNlZCBpbiBjb21wb3VuZCBpdGVtcy4gKi8KdHlwZWRlZiBzdHJ1Y3QgY29tcGl0ZW1fUwp7CiAgICBjaGFyX3UJY2lfa2V5W0FIX0tFWV9MRU5dOyAvKiBrZXkgZm9yIGhhc2h0YWIgPT0gbmFtZSBvZiBjb21wb3VuZCAqLwogICAgdW5zaWduZWQJY2lfZmxhZzsJLyogYWZmaXggbmFtZSBhcyBudW1iZXIsIHVzZXMgImFmX2ZsYWd0eXBlIiAqLwogICAgaW50CQljaV9uZXdJRDsJLyogYWZmaXggSUQgYWZ0ZXIgcmVudW1iZXJpbmcuICovCn0gY29tcGl0ZW1fVDsKCiNkZWZpbmUgSEkyQ0koaGkpICAgKChjb21waXRlbV9UICopKGhpKS0+aGlfa2V5KQoKLyoKICogU3RydWN0dXJlIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgaXRlbXMgaW4gdGhlIHdvcmQgdHJlZS4gIFRoaXMgYXZvaWRzCiAqIHRoZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgZWFjaCBhbGxvY2F0ZWQgdGhpbmcsIGV2ZXJ5dGhpbmcgaXMgZnJlZWQgYWxsIGF0CiAqIG9uY2UgYWZ0ZXIgIjpta3NwZWxsIiBpcyBkb25lLgogKi8KI2RlZmluZSAgU0JMT0NLU0laRSAxNjAwMAkvKiBzaXplIG9mIHNiX2RhdGEgKi8KdHlwZWRlZiBzdHJ1Y3Qgc2Jsb2NrX1Mgc2Jsb2NrX1Q7CnN0cnVjdCBzYmxvY2tfUwp7CiAgICBzYmxvY2tfVAkqc2JfbmV4dDsJLyogbmV4dCBibG9jayBpbiBsaXN0ICovCiAgICBpbnQJCXNiX3VzZWQ7CS8qIG5yIG9mIGJ5dGVzIGFscmVhZHkgaW4gdXNlICovCiAgICBjaGFyX3UJc2JfZGF0YVsxXTsJLyogZGF0YSwgYWN0dWFsbHkgbG9uZ2VyICovCn07CgovKgogKiBBIG5vZGUgaW4gdGhlIHRyZWUuCiAqLwp0eXBlZGVmIHN0cnVjdCB3b3Jkbm9kZV9TIHdvcmRub2RlX1Q7CnN0cnVjdCB3b3Jkbm9kZV9TCnsKICAgIHVuaW9uICAgLyogc2hhcmVkIHRvIHNhdmUgc3BhY2UgKi8KICAgIHsKCWNoYXJfdQloYXNoa2V5WzZdOwkvKiB0aGUgaGFzaCBrZXksIG9ubHkgdXNlZCB3aGlsZSBjb21wcmVzc2luZyAqLwoJaW50CWluZGV4OwkJLyogaW5kZXggaW4gd3JpdHRlbiBub2RlcyAodmFsaWQgYWZ0ZXIgZmlyc3QKCQkJCSAgIHJvdW5kKSAqLwogICAgfSB3bl91MTsKICAgIHVuaW9uICAgLyogc2hhcmVkIHRvIHNhdmUgc3BhY2UgKi8KICAgIHsKCXdvcmRub2RlX1QgKm5leHQ7CS8qIG5leHQgbm9kZSB3aXRoIHNhbWUgaGFzaCBrZXkgKi8KCXdvcmRub2RlX1QgKndub2RlOwkvKiBwYXJlbnQgbm9kZSB0aGF0IHdpbGwgd3JpdGUgdGhpcyBub2RlICovCiAgICB9IHduX3UyOwogICAgd29yZG5vZGVfVAkqd25fY2hpbGQ7CS8qIGNoaWxkIChuZXh0IGJ5dGUgaW4gd29yZCkgKi8KICAgIHdvcmRub2RlX1QgICp3bl9zaWJsaW5nOwkvKiBuZXh0IHNpYmxpbmcgKGFsdGVybmF0ZSBieXRlIGluIHdvcmQsCgkJCQkgICBhbHdheXMgc29ydGVkKSAqLwogICAgaW50CQl3bl9yZWZzOwkvKiBOci4gb2YgcmVmZXJlbmNlcyB0byB0aGlzIG5vZGUuICBPbmx5CgkJCQkgICByZWxldmFudCBmb3IgZmlyc3Qgbm9kZSBpbiBhIGxpc3Qgb2YKCQkJCSAgIHNpYmxpbmdzLCBpbiBmb2xsb3dpbmcgc2libGluZ3MgaXQgaXMKCQkJCSAgIGFsd2F5cyBvbmUuICovCiAgICBjaGFyX3UJd25fYnl0ZTsJLyogQnl0ZSBmb3IgdGhpcyBub2RlLiBOVUwgZm9yIHdvcmQgZW5kICovCgogICAgLyogSW5mbyBmb3Igd2hlbiAid25fYnl0ZSIgaXMgTlVMLgogICAgICogSW4gUFJFRklYVFJFRSAid25fcmVnaW9uIiBpcyB1c2VkIGZvciB0aGUgcHJlZmNvbmRuci4KICAgICAqIEluIHRoZSBzb3VuZGZvbGRlZCB3b3JkIHRyZWUgInduX2ZsYWdzIiBoYXMgdGhlIE1TVyBvZiB0aGUgd29yZG5yIGFuZAogICAgICogInduX3JlZ2lvbiIgdGhlIExTVyBvZiB0aGUgd29yZG5yLiAqLwogICAgY2hhcl91CXduX2FmZml4SUQ7CS8qIHN1cHBvcnRlZC9yZXF1aXJlZCBwcmVmaXggSUQgb3IgMCAqLwogICAgc2hvcnRfdQl3bl9mbGFnczsJLyogV0ZfIGZsYWdzICovCiAgICBzaG9ydAl3bl9yZWdpb247CS8qIHJlZ2lvbiBtYXNrICovCgojaWZkZWYgU1BFTExfUFJJTlRUUkVFCiAgICBpbnQJCXduX25yOwkJLyogc2VxdWVuY2UgbnIgZm9yIHByaW50aW5nICovCiNlbmRpZgp9OwoKI2RlZmluZSBXTl9NQVNLCSAweGZmZmYJCS8qIG1hc2sgcmVsZXZhbnQgYml0cyBvZiAid25fZmxhZ3MiICovCgojZGVmaW5lIEhJMldOKGhpKSAgICAod29yZG5vZGVfVCAqKSgoaGkpLT5oaV9rZXkpCgovKgogKiBJbmZvIHVzZWQgd2hpbGUgcmVhZGluZyB0aGUgc3BlbGwgZmlsZXMuCiAqLwp0eXBlZGVmIHN0cnVjdCBzcGVsbGluZm9fUwp7CiAgICB3b3Jkbm9kZV9UCSpzaV9mb2xkcm9vdDsJLyogdHJlZSB3aXRoIGNhc2UtZm9sZGVkIHdvcmRzICovCiAgICBsb25nCXNpX2ZvbGR3Y291bnQ7CS8qIG5yIG9mIHdvcmRzIGluIHNpX2ZvbGRyb290ICovCgogICAgd29yZG5vZGVfVAkqc2lfa2VlcHJvb3Q7CS8qIHRyZWUgd2l0aCBrZWVwLWNhc2Ugd29yZHMgKi8KICAgIGxvbmcJc2lfa2VlcHdjb3VudDsJLyogbnIgb2Ygd29yZHMgaW4gc2lfa2VlcHJvb3QgKi8KCiAgICB3b3Jkbm9kZV9UCSpzaV9wcmVmcm9vdDsJLyogdHJlZSB3aXRoIHBvc3Rwb25lZCBwcmVmaXhlcyAqLwoKICAgIGxvbmcJc2lfc3VndHJlZTsJLyogY3JlYXRpbmcgdGhlIHNvdW5kZm9sZGluZyB0cmllICovCgogICAgc2Jsb2NrX1QJKnNpX2Jsb2NrczsJLyogbWVtb3J5IGJsb2NrcyB1c2VkICovCiAgICBsb25nCXNpX2Jsb2Nrc19jbnQ7CS8qIG1lbW9yeSBibG9ja3MgYWxsb2NhdGVkICovCiAgICBsb25nCXNpX2NvbXByZXNzX2NudDsgICAgLyogd29yZHMgdG8gYWRkIGJlZm9yZSBsb3dlcmluZwoJCQkJICAgICAgIGNvbXByZXNzaW9uIGxpbWl0ICovCiAgICB3b3Jkbm9kZV9UCSpzaV9maXJzdF9mcmVlOyAvKiBMaXN0IG9mIG5vZGVzIHRoYXQgaGF2ZSBiZWVuIGZyZWVkIGR1cmluZwoJCQkJICAgY29tcHJlc3Npb24sIGxpbmtlZCBieSAid25fY2hpbGQiIGZpZWxkLiAqLwogICAgbG9uZwlzaV9mcmVlX2NvdW50OwkvKiBudW1iZXIgb2Ygbm9kZXMgaW4gc2lfZmlyc3RfZnJlZSAqLwojaWZkZWYgU1BFTExfUFJJTlRUUkVFCiAgICBpbnQJCXNpX3dvcmRub2RlX25yOwkvKiBzZXF1ZW5jZSBuciBmb3Igbm9kZXMgKi8KI2VuZGlmCiAgICBidWZfVAkqc2lfc3BlbGxidWY7CS8qIGJ1ZmZlciB1c2VkIHRvIHN0b3JlIHNvdW5kZm9sZCB3b3JkIHRhYmxlICovCgogICAgaW50CQlzaV9hc2NpaTsJLyogaGFuZGxpbmcgb25seSBBU0NJSSB3b3JkcyAqLwogICAgaW50CQlzaV9hZGQ7CQkvKiBhZGRpdGlvbiBmaWxlICovCiAgICBpbnQJCXNpX2NsZWFyX2NoYXJ0YWI7ICAgLyogd2hlbiBUUlVFIGNsZWFyIGNoYXIgdGFibGVzICovCiAgICBpbnQJCXNpX3JlZ2lvbjsJLyogcmVnaW9uIG1hc2sgKi8KICAgIHZpbWNvbnZfVAlzaV9jb252OwkvKiBmb3IgY29udmVyc2lvbiB0byAnZW5jb2RpbmcnICovCiAgICBpbnQJCXNpX21lbXRvdDsJLyogcnVudGltZSBtZW1vcnkgdXNlZCAqLwogICAgaW50CQlzaV92ZXJib3NlOwkvKiB2ZXJib3NlIG1lc3NhZ2VzICovCiAgICBpbnQJCXNpX21zZ19jb3VudDsJLyogbnVtYmVyIG9mIHdvcmRzIGFkZGVkIHNpbmNlIGxhc3QgbWVzc2FnZSAqLwogICAgY2hhcl91CSpzaV9pbmZvOwkvKiBpbmZvIHRleHQgY2hhcnMgb3IgTlVMTCAgKi8KICAgIGludAkJc2lfcmVnaW9uX2NvdW50OyAvKiBudW1iZXIgb2YgcmVnaW9ucyBzdXBwb3J0ZWQgKDEgd2hlbiB0aGVyZQoJCQkJICAgIGFyZSBubyByZWdpb25zKSAqLwogICAgY2hhcl91CXNpX3JlZ2lvbl9uYW1lWzE2XTsgLyogcmVnaW9uIG5hbWVzOyB1c2VkIG9ubHkgaWYKCQkJCSAgICAgKiBzaV9yZWdpb25fY291bnQgPiAxKSAqLwoKICAgIGdhcnJheV9UCXNpX3JlcDsJCS8qIGxpc3Qgb2YgZnJvbXRvX1QgZW50cmllcyBmcm9tIFJFUCBsaW5lcyAqLwogICAgZ2FycmF5X1QJc2lfcmVwc2FsOwkvKiBsaXN0IG9mIGZyb210b19UIGVudHJpZXMgZnJvbSBSRVBTQUwgbGluZXMgKi8KICAgIGdhcnJheV9UCXNpX3NhbDsJCS8qIGxpc3Qgb2YgZnJvbXRvX1QgZW50cmllcyBmcm9tIFNBTCBsaW5lcyAqLwogICAgY2hhcl91CSpzaV9zb2ZvZnI7CS8qIFNPRk9GUk9NIHRleHQgKi8KICAgIGNoYXJfdQkqc2lfc29mb3RvOwkvKiBTT0ZPVE8gdGV4dCAqLwogICAgaW50CQlzaV9ub3N1Z2ZpbGU7CS8qIE5PU1VHRklMRSBpdGVtIGZvdW5kICovCiAgICBpbnQJCXNpX25vc3BsaXRzdWdzOwkvKiBOT1NQTElUU1VHUyBpdGVtIGZvdW5kICovCiAgICBpbnQJCXNpX2ZvbGxvd3VwOwkvKiBzb3VuZHNhbGlrZTogPyAqLwogICAgaW50CQlzaV9jb2xsYXBzZTsJLyogc291bmRzYWxpa2U6ID8gKi8KICAgIGhhc2h0YWJfVAlzaV9jb21tb253b3JkczsJLyogaGFzaHRhYmxlIGZvciBjb21tb24gd29yZHMgKi8KICAgIHRpbWVfdAlzaV9zdWd0aW1lOwkvKiB0aW1lc3RhbXAgZm9yIC5zdWcgZmlsZSAqLwogICAgaW50CQlzaV9yZW1fYWNjZW50czsJLyogc291bmRzYWxpa2U6IHJlbW92ZSBhY2NlbnRzICovCiAgICBnYXJyYXlfVAlzaV9tYXA7CQkvKiBNQVAgaW5mbyBjb25jYXRlbmF0ZWQgKi8KICAgIGNoYXJfdQkqc2lfbWlkd29yZDsJLyogTUlEV09SRCBjaGFycyBvciBOVUxMICAqLwogICAgaW50CQlzaV9jb21wbWF4OwkvKiBtYXggbnIgb2Ygd29yZHMgZm9yIGNvbXBvdW5kaW5nICovCiAgICBpbnQJCXNpX2NvbXBtaW5sZW47CS8qIG1pbmltYWwgbGVuZ3RoIGZvciBjb21wb3VuZGluZyAqLwogICAgaW50CQlzaV9jb21wc3lsbWF4OwkvKiBtYXggbnIgb2Ygc3lsbGFibGVzIGZvciBjb21wb3VuZGluZyAqLwogICAgaW50CQlzaV9jb21wb3B0aW9uczsJLyogQ09NUF8gZmxhZ3MgKi8KICAgIGdhcnJheV9UCXNpX2NvbXBwYXQ7CS8qIENIRUNLQ09NUE9VTkRQQVRURVJOIGl0ZW1zLCBlYWNoIHN0b3JlZCBhcwoJCQkJICAgYSBzdHJpbmcgKi8KICAgIGNoYXJfdQkqc2lfY29tcGZsYWdzOwkvKiBmbGFncyB1c2VkIGZvciBjb21wb3VuZGluZyAqLwogICAgY2hhcl91CXNpX25vYnJlYWs7CS8qIE5PQlJFQUsgKi8KICAgIGNoYXJfdQkqc2lfc3lsbGFibGU7CS8qIHN5bGxhYmxlIHN0cmluZyAqLwogICAgZ2FycmF5X1QJc2lfcHJlZmNvbmQ7CS8qIHRhYmxlIHdpdGggY29uZGl0aW9ucyBmb3IgcG9zdHBvbmVkCgkJCQkgKiBwcmVmaXhlcywgZWFjaCBzdG9yZWQgYXMgYSBzdHJpbmcgKi8KICAgIGludAkJc2lfbmV3cHJlZklEOwkvKiBjdXJyZW50IHZhbHVlIGZvciBhaF9uZXdJRCAqLwogICAgaW50CQlzaV9uZXdjb21wSUQ7CS8qIGN1cnJlbnQgdmFsdWUgZm9yIGNvbXBvdW5kIElEICovCn0gc3BlbGxpbmZvX1Q7CgpzdGF0aWMgYWZmZmlsZV9UICpzcGVsbF9yZWFkX2FmZiBfX0FSR1MoKHNwZWxsaW5mb19UICpzcGluLCBjaGFyX3UgKmZuYW1lKSk7CnN0YXRpYyB2b2lkIGFmZl9wcm9jZXNzX2ZsYWdzIF9fQVJHUygoYWZmZmlsZV9UICphZmZpbGUsIGFmZmVudHJ5X1QgKmVudHJ5KSk7CnN0YXRpYyBpbnQgc3BlbGxfaW5mb19pdGVtIF9fQVJHUygoY2hhcl91ICpzKSk7CnN0YXRpYyB1bnNpZ25lZCBhZmZpdGVtMmZsYWcgX19BUkdTKChpbnQgZmxhZ3R5cGUsIGNoYXJfdSAqaXRlbSwgY2hhcl91CSpmbmFtZSwgaW50IGxudW0pKTsKc3RhdGljIHVuc2lnbmVkIGdldF9hZmZpdGVtIF9fQVJHUygoaW50IGZsYWd0eXBlLCBjaGFyX3UgKipwcCkpOwpzdGF0aWMgdm9pZCBwcm9jZXNzX2NvbXBmbGFncyBfX0FSR1MoKHNwZWxsaW5mb19UICpzcGluLCBhZmZmaWxlX1QgKmFmZiwgY2hhcl91ICpjb21wZmxhZ3MpKTsKc3RhdGljIHZvaWQgY2hlY2tfcmVudW1iZXIgX19BUkdTKChzcGVsbGluZm9fVCAqc3BpbikpOwpzdGF0aWMgaW50IGZsYWdfaW5fYWZmbGlzdCBfX0FSR1MoKGludCBmbGFndHlwZSwgY2hhcl91ICphZmZsaXN0LCB1bnNpZ25lZCBmbGFnKSk7CnN0YXRpYyB2b2lkIGFmZl9jaGVja19udW1iZXIgX19BUkdTKChpbnQgc3BpbnZhbCwgaW50IGFmZnZhbCwgY2hhciAqbmFtZSkpOwpzdGF0aWMgdm9pZCBhZmZfY2hlY2tfc3RyaW5nIF9fQVJHUygoY2hhcl91ICpzcGludmFsLCBjaGFyX3UgKmFmZnZhbCwgY2hhciAqbmFtZSkpOwpzdGF0aWMgaW50IHN0cl9lcXVhbCBfX0FSR1MoKGNoYXJfdSAqczEsIGNoYXJfdQkqczIpKTsKc3RhdGljIHZvaWQgYWRkX2Zyb210byBfX0FSR1MoKHNwZWxsaW5mb19UICpzcGluLCBnYXJyYXlfVCAqZ2FwLCBjaGFyX3UJKmZyb20sIGNoYXJfdSAqdG8pKTsKc3RhdGljIGludCBzYWxfdG9fYm9vbCBfX0FSR1MoKGNoYXJfdSAqcykpOwpzdGF0aWMgaW50IGhhc19ub25fYXNjaWkgX19BUkdTKChjaGFyX3UgKnMpKTsKc3RhdGljIHZvaWQgc3BlbGxfZnJlZV9hZmYgX19BUkdTKChhZmZmaWxlX1QgKmFmZikpOwpzdGF0aWMgaW50IHNwZWxsX3JlYWRfZGljIF9fQVJHUygoc3BlbGxpbmZvX1QgKnNwaW4sIGNoYXJfdSAqZm5hbWUsIGFmZmZpbGVfVCAqYWZmaWxlKSk7CnN0YXRpYyBpbnQgZ2V0X2FmZml4X2ZsYWdzIF9fQVJHUygoYWZmZmlsZV9UICphZmZpbGUsIGNoYXJfdSAqYWZmbGlzdCkpOwpzdGF0aWMgaW50IGdldF9wZnhsaXN0IF9fQVJHUygoYWZmZmlsZV9UICphZmZpbGUsIGNoYXJfdSAqYWZmbGlzdCwgY2hhcl91ICpzdG9yZV9hZmZsaXN0KSk7CnN0YXRpYyB2b2lkIGdldF9jb21wZmxhZ3MgX19BUkdTKChhZmZmaWxlX1QgKmFmZmlsZSwgY2hhcl91ICphZmZsaXN0LCBjaGFyX3UgKnN0b3JlX2FmZmxpc3QpKTsKc3RhdGljIGludCBzdG9yZV9hZmZfd29yZCBfX0FSR1MoKHNwZWxsaW5mb19UICpzcGluLCBjaGFyX3UgKndvcmQsIGNoYXJfdSAqYWZmbGlzdCwgYWZmZmlsZV9UICphZmZpbGUsIGhhc2h0YWJfVCAqaHQsIGhhc2h0YWJfVCAqeGh0LCBpbnQgY29uZGl0LCBpbnQgZmxhZ3MsIGNoYXJfdSAqcGZ4bGlzdCwgaW50IHBmeGxlbikpOwpzdGF0aWMgaW50IHNwZWxsX3JlYWRfd29yZGZpbGUgX19BUkdTKChzcGVsbGluZm9fVCAqc3BpbiwgY2hhcl91ICpmbmFtZSkpOwpzdGF0aWMgdm9pZCAqZ2V0cm9vbSBfX0FSR1MoKHNwZWxsaW5mb19UICpzcGluLCBzaXplX3QgbGVuLCBpbnQgYWxpZ24pKTsKc3RhdGljIGNoYXJfdSAqZ2V0cm9vbV9zYXZlIF9fQVJHUygoc3BlbGxpbmZvX1QgKnNwaW4sIGNoYXJfdSAqcykpOwpzdGF0aWMgdm9pZCBmcmVlX2Jsb2NrcyBfX0FSR1MoKHNibG9ja19UICpibCkpOwpzdGF0aWMgd29yZG5vZGVfVCAqd29yZHRyZWVfYWxsb2MgX19BUkdTKChzcGVsbGluZm9fVCAqc3BpbikpOwpzdGF0aWMgaW50IHN0b3JlX3dvcmQgX19BUkdTKChzcGVsbGluZm9fVCAqc3BpbiwgY2hhcl91ICp3b3JkLCBpbnQgZmxhZ3MsIGludCByZWdpb24sIGNoYXJfdSAqcGZ4bGlzdCwgaW50IG5lZWRfYWZmaXgpKTsKc3RhdGljIGludCB0cmVlX2FkZF93b3JkIF9fQVJHUygoc3BlbGxpbmZvX1QgKnNwaW4sIGNoYXJfdSAqd29yZCwgd29yZG5vZGVfVCAqdHJlZSwgaW50IGZsYWdzLCBpbnQgcmVnaW9uLCBpbnQgYWZmaXhJRCkpOwpzdGF0aWMgd29yZG5vZGVfVCAqZ2V0X3dvcmRub2RlIF9fQVJHUygoc3BlbGxpbmZvX1QgKnNwaW4pKTsKc3RhdGljIGludCBkZXJlZl93b3Jkbm9kZSBfX0FSR1MoKHNwZWxsaW5mb19UICpzcGluLCB3b3Jkbm9kZV9UICpub2RlKSk7CnN0YXRpYyB2b2lkIGZyZWVfd29yZG5vZGUgX19BUkdTKChzcGVsbGluZm9fVCAqc3Bpbiwgd29yZG5vZGVfVCAqbikpOwpzdGF0aWMgdm9pZCB3b3JkdHJlZV9jb21wcmVzcyBfX0FSR1MoKHNwZWxsaW5mb19UICpzcGluLCB3b3Jkbm9kZV9UICpyb290KSk7CnN0YXRpYyBpbnQgbm9kZV9jb21wcmVzcyBfX0FSR1MoKHNwZWxsaW5mb19UICpzcGluLCB3b3Jkbm9kZV9UICpub2RlLCBoYXNodGFiX1QgKmh0LCBpbnQgKnRvdCkpOwpzdGF0aWMgaW50IG5vZGVfZXF1YWwgX19BUkdTKCh3b3Jkbm9kZV9UICpuMSwgd29yZG5vZGVfVCAqbjIpKTsKc3RhdGljIHZvaWQgcHV0X3N1Z3RpbWUgX19BUkdTKChzcGVsbGluZm9fVCAqc3BpbiwgRklMRSAqZmQpKTsKc3RhdGljIGludCB3cml0ZV92aW1fc3BlbGwgX19BUkdTKChzcGVsbGluZm9fVCAqc3BpbiwgY2hhcl91ICpmbmFtZSkpOwpzdGF0aWMgdm9pZCBjbGVhcl9ub2RlIF9fQVJHUygod29yZG5vZGVfVCAqbm9kZSkpOwpzdGF0aWMgaW50IHB1dF9ub2RlIF9fQVJHUygoRklMRSAqZmQsIHdvcmRub2RlX1QgKm5vZGUsIGludCBpbmRleCwgaW50IHJlZ2lvbm1hc2ssIGludCBwcmVmaXh0cmVlKSk7CnN0YXRpYyB2b2lkIHNwZWxsX21ha2Vfc3VnZmlsZSBfX0FSR1MoKHNwZWxsaW5mb19UICpzcGluLCBjaGFyX3UgKndmbmFtZSkpOwpzdGF0aWMgaW50IHN1Z19maWxsdHJlZSBfX0FSR1MoKHNwZWxsaW5mb19UICpzcGluLCBzbGFuZ19UICpzbGFuZykpOwpzdGF0aWMgaW50IHN1Z19tYWtldGFibGUgX19BUkdTKChzcGVsbGluZm9fVCAqc3BpbikpOwpzdGF0aWMgaW50IHN1Z19maWxsdGFibGUgX19BUkdTKChzcGVsbGluZm9fVCAqc3Bpbiwgd29yZG5vZGVfVCAqbm9kZSwgaW50IHN0YXJ0d29yZG5yLCBnYXJyYXlfVCAqZ2FwKSk7CnN0YXRpYyBpbnQgb2Zmc2V0MmJ5dGVzIF9fQVJHUygoaW50IG5yLCBjaGFyX3UgKmJ1ZikpOwpzdGF0aWMgaW50IGJ5dGVzMm9mZnNldCBfX0FSR1MoKGNoYXJfdSAqKnBwKSk7CnN0YXRpYyB2b2lkIHN1Z193cml0ZSBfX0FSR1MoKHNwZWxsaW5mb19UICpzcGluLCBjaGFyX3UgKmZuYW1lKSk7CnN0YXRpYyB2b2lkIG1rc3BlbGwgX19BUkdTKChpbnQgZmNvdW50LCBjaGFyX3UgKipmbmFtZXMsIGludCBhc2NpaSwgaW50IG92ZXJ3cml0ZSwgaW50IGFkZGVkX3dvcmQpKTsKc3RhdGljIHZvaWQgc3BlbGxfbWVzc2FnZSBfX0FSR1MoKHNwZWxsaW5mb19UICpzcGluLCBjaGFyX3UgKnN0cikpOwpzdGF0aWMgdm9pZCBpbml0X3NwZWxsZmlsZSBfX0FSR1MoKHZvaWQpKTsKCi8qIEluIHRoZSBwb3N0cG9uZWQgcHJlZml4ZXMgdHJlZSB3bl9mbGFncyBpcyB1c2VkIHRvIHN0b3JlIHRoZSBXRlBfIGZsYWdzLAogKiBidXQgaXQgbXVzdCBiZSBuZWdhdGl2ZSB0byBpbmRpY2F0ZSB0aGUgcHJlZml4IHRyZWUgdG8gdHJlZV9hZGRfd29yZCgpLgogKiBVc2UgYSBuZWdhdGl2ZSBudW1iZXIgd2l0aCB0aGUgbG93ZXIgOCBiaXRzIHplcm8uICovCiNkZWZpbmUgUEZYX0ZMQUdTCS0yNTYKCi8qIGZsYWdzIGZvciAiY29uZGl0IiBhcmd1bWVudCBvZiBzdG9yZV9hZmZfd29yZCgpICovCiNkZWZpbmUgQ09ORElUX0NPTUIJMQkvKiBhZmZpeCBtdXN0IGNvbWJpbmUgKi8KI2RlZmluZSBDT05ESVRfQ0ZJWAkyCS8qIGFmZml4IG11c3QgaGF2ZSBDSVJDVU1GSVggZmxhZyAqLwojZGVmaW5lIENPTkRJVF9TVUYJNAkvKiBhZGQgYSBzdWZmaXggZm9yIG1hdGNoaW5nIGZsYWdzICovCiNkZWZpbmUgQ09ORElUX0FGRgk4CS8qIHdvcmQgYWxyZWFkeSBoYXMgYW4gYWZmaXggKi8KCi8qCiAqIFR1bmFibGUgcGFyYW1ldGVycyBmb3Igd2hlbiB0aGUgdHJlZSBpcyBjb21wcmVzc2VkLiAgU2VlICdta3NwZWxsbWVtJy4KICovCnN0YXRpYyBsb25nIGNvbXByZXNzX3N0YXJ0ID0gMzAwMDA7CS8qIG1lbW9yeSAvIFNCTE9DS1NJWkUgKi8Kc3RhdGljIGxvbmcgY29tcHJlc3NfaW5jID0gMTAwOwkJLyogbWVtb3J5IC8gU0JMT0NLU0laRSAqLwpzdGF0aWMgbG9uZyBjb21wcmVzc19hZGRlZCA9IDUwMDAwMDsJLyogd29yZCBjb3VudCAqLwoKI2lmZGVmIFNQRUxMX1BSSU5UVFJFRQovKgogKiBGb3IgZGVidWdnaW5nIHRoZSB0cmVlIGNvZGU6IHByaW50IHRoZSBjdXJyZW50IHRyZWUgaW4gYSAobW9yZSBvciBsZXNzKQogKiByZWFkYWJsZSBmb3JtYXQsIHNvIHRoYXQgd2UgY2FuIHNlZSB3aGF0IGhhcHBlbnMgd2hlbiBhZGRpbmcgYSB3b3JkIGFuZC9vcgogKiBjb21wcmVzc2luZyB0aGUgdHJlZS4KICogQmFzZWQgb24gY29kZSBmcm9tIE9sYWYgU2VpYmVydC4KICovCiNkZWZpbmUgUFJJTlRMSU5FU0laRQkxMDAwCiNkZWZpbmUgUFJJTlRXSURUSAk2CgojZGVmaW5lIFBSSU5UU09NRShsLCBkZXB0aCwgZm10LCBhMSwgYTIpIHZpbV9zbnByaW50ZihsICsgZGVwdGggKiBQUklOVFdJRFRILCBcCgkgICAgUFJJTlRMSU5FU0laRSAtIFBSSU5UV0lEVEggKiBkZXB0aCwgZm10LCBhMSwgYTIpCgpzdGF0aWMgY2hhciBsaW5lMVtQUklOVExJTkVTSVpFXTsKc3RhdGljIGNoYXIgbGluZTJbUFJJTlRMSU5FU0laRV07CnN0YXRpYyBjaGFyIGxpbmUzW1BSSU5UTElORVNJWkVdOwoKICAgIHN0YXRpYyB2b2lkCnNwZWxsX2NsZWFyX2ZsYWdzKHdvcmRub2RlX1QgKm5vZGUpCnsKICAgIHdvcmRub2RlX1QJKm5wOwoKICAgIGZvciAobnAgPSBub2RlOyBucCAhPSBOVUxMOyBucCA9IG5wLT53bl9zaWJsaW5nKQogICAgewoJbnAtPnduX3UxLmluZGV4ID0gRkFMU0U7CglzcGVsbF9jbGVhcl9mbGFncyhucC0+d25fY2hpbGQpOwogICAgfQp9CgogICAgc3RhdGljIHZvaWQKc3BlbGxfcHJpbnRfbm9kZSh3b3Jkbm9kZV9UICpub2RlLCBpbnQgZGVwdGgpCnsKICAgIGlmIChub2RlLT53bl91MS5pbmRleCkKICAgIHsKCS8qIERvbmUgdGhpcyBub2RlIGJlZm9yZSwgcHJpbnQgdGhlIHJlZmVyZW5jZS4gKi8KCVBSSU5UU09NRShsaW5lMSwgZGVwdGgsICIoJWQpIiwgbm9kZS0+d25fbnIsIDApOwoJUFJJTlRTT01FKGxpbmUyLCBkZXB0aCwgIiAgICAiLCAwLCAwKTsKCVBSSU5UU09NRShsaW5lMywgZGVwdGgsICIgICAgIiwgMCwgMCk7Cgltc2cobGluZTEpOwoJbXNnKGxpbmUyKTsKCW1zZyhsaW5lMyk7CiAgICB9CiAgICBlbHNlCiAgICB7Cglub2RlLT53bl91MS5pbmRleCA9IFRSVUU7CgoJaWYgKG5vZGUtPnduX2J5dGUgIT0gTlVMKQoJewoJICAgIGlmIChub2RlLT53bl9jaGlsZCAhPSBOVUxMKQoJCVBSSU5UU09NRShsaW5lMSwgZGVwdGgsICIgJWMgLT4gIiwgbm9kZS0+d25fYnl0ZSwgMCk7CgkgICAgZWxzZQoJCS8qIENhbm5vdCBoYXBwZW4/ICovCgkJUFJJTlRTT01FKGxpbmUxLCBkZXB0aCwgIiAlYyA/Pz8iLCBub2RlLT53bl9ieXRlLCAwKTsKCX0KCWVsc2UKCSAgICBQUklOVFNPTUUobGluZTEsIGRlcHRoLCAiICQgICAgIiwgMCwgMCk7CgoJUFJJTlRTT01FKGxpbmUyLCBkZXB0aCwgIiVkLyVkICAgICIsIG5vZGUtPnduX25yLCBub2RlLT53bl9yZWZzKTsKCglpZiAobm9kZS0+d25fc2libGluZyAhPSBOVUxMKQoJICAgIFBSSU5UU09NRShsaW5lMywgZGVwdGgsICIgfCAgICAiLCAwLCAwKTsKCWVsc2UKCSAgICBQUklOVFNPTUUobGluZTMsIGRlcHRoLCAiICAgICAgIiwgMCwgMCk7CgoJaWYgKG5vZGUtPnduX2J5dGUgPT0gTlVMKQoJewoJICAgIG1zZyhsaW5lMSk7CgkgICAgbXNnKGxpbmUyKTsKCSAgICBtc2cobGluZTMpOwoJfQoKCS8qIGRvIHRoZSBjaGlsZHJlbiAqLwoJaWYgKG5vZGUtPnduX2J5dGUgIT0gTlVMICYmIG5vZGUtPnduX2NoaWxkICE9IE5VTEwpCgkgICAgc3BlbGxfcHJpbnRfbm9kZShub2RlLT53bl9jaGlsZCwgZGVwdGggKyAxKTsKCgkvKiBkbyB0aGUgc2libGluZ3MgKi8KCWlmIChub2RlLT53bl9zaWJsaW5nICE9IE5VTEwpCgl7CgkgICAgLyogZ2V0IHJpZCBvZiBhbGwgcGFyZW50IGRldGFpbHMgZXhjZXB0IHwgKi8KCSAgICBTVFJDUFkobGluZTEsIGxpbmUzKTsKCSAgICBTVFJDUFkobGluZTIsIGxpbmUzKTsKCSAgICBzcGVsbF9wcmludF9ub2RlKG5vZGUtPnduX3NpYmxpbmcsIGRlcHRoKTsKCX0KICAgIH0KfQoKICAgIHN0YXRpYyB2b2lkCnNwZWxsX3ByaW50X3RyZWUod29yZG5vZGVfVCAqcm9vdCkKewogICAgaWYgKHJvb3QgIT0gTlVMTCkKICAgIHsKCS8qIENsZWFyIHRoZSAid25fdTEuaW5kZXgiIGZpZWxkcywgdXNlZCB0byByZW1lbWJlciB3aGF0IGhhcyBiZWVuCgkgKiBkb25lLiAqLwoJc3BlbGxfY2xlYXJfZmxhZ3Mocm9vdCk7CgoJLyogUmVjdXJzaXZlbHkgcHJpbnQgdGhlIHRyZWUuICovCglzcGVsbF9wcmludF9ub2RlKHJvb3QsIDApOwogICAgfQp9CiNlbmRpZiAvKiBTUEVMTF9QUklOVFRSRUUgKi8KCi8qCiAqIFJlYWQgdGhlIGFmZml4IGZpbGUgImZuYW1lIi4KICogUmV0dXJucyBhbiBhZmZmaWxlX1QsIE5VTEwgZm9yIGNvbXBsZXRlIGZhaWx1cmUuCiAqLwogICAgc3RhdGljIGFmZmZpbGVfVCAqCnNwZWxsX3JlYWRfYWZmKHNwaW4sIGZuYW1lKQogICAgc3BlbGxpbmZvX1QJKnNwaW47CiAgICBjaGFyX3UJKmZuYW1lOwp7CiAgICBGSUxFCSpmZDsKICAgIGFmZmZpbGVfVAkqYWZmOwogICAgY2hhcl91CXJsaW5lW01BWExJTkVMRU5dOwogICAgY2hhcl91CSpsaW5lOwogICAgY2hhcl91CSpwYyA9IE5VTEw7CiNkZWZpbmUgTUFYSVRFTUNOVCAgMzAKICAgIGNoYXJfdQkqKGl0ZW1zW01BWElURU1DTlRdKTsKICAgIGludAkJaXRlbWNudDsKICAgIGNoYXJfdQkqcDsKICAgIGludAkJbG51bSA9IDA7CiAgICBhZmZoZWFkZXJfVAkqY3VyX2FmZiA9IE5VTEw7CiAgICBpbnQJCWRpZF9wb3N0cG9uZV9wcmVmaXggPSBGQUxTRTsKICAgIGludAkJYWZmX3RvZG8gPSAwOwogICAgaGFzaHRhYl9UCSp0cDsKICAgIGNoYXJfdQkqbG93ID0gTlVMTDsKICAgIGNoYXJfdQkqZm9sID0gTlVMTDsKICAgIGNoYXJfdQkqdXBwID0gTlVMTDsKICAgIGludAkJZG9fcmVwOwogICAgaW50CQlkb19yZXBzYWw7CiAgICBpbnQJCWRvX3NhbDsKICAgIGludAkJZG9fbWFwOwogICAgaW50CQlmb3VuZF9tYXAgPSBGQUxTRTsKICAgIGhhc2hpdGVtX1QJKmhpOwogICAgaW50CQlsOwogICAgaW50CQljb21wbWlubGVuID0gMDsJCS8qIENPTVBPVU5ETUlOIHZhbHVlICovCiAgICBpbnQJCWNvbXBzeWxtYXggPSAwOwkJLyogQ09NUE9VTkRTWUxNQVggdmFsdWUgKi8KICAgIGludAkJY29tcG9wdGlvbnMgPSAwOwkvKiBDT01QXyBmbGFncyAqLwogICAgaW50CQljb21wbWF4ID0gMDsJCS8qIENPTVBPVU5EV09SRE1BWCB2YWx1ZSAqLwogICAgY2hhcl91CSpjb21wZmxhZ3MgPSBOVUxMOwkvKiBDT01QT1VOREZMQUcgYW5kIENPTVBPVU5EUlVMRQoJCQkJCSAgIGNvbmNhdGVuYXRlZCAqLwogICAgY2hhcl91CSptaWR3b3JkID0gTlVMTDsJLyogTUlEV09SRCB2YWx1ZSAqLwogICAgY2hhcl91CSpzeWxsYWJsZSA9IE5VTEw7CS8qIFNZTExBQkxFIHZhbHVlICovCiAgICBjaGFyX3UJKnNvZm9mcm9tID0gTlVMTDsJLyogU09GT0ZST00gdmFsdWUgKi8KICAgIGNoYXJfdQkqc29mb3RvID0gTlVMTDsJCS8qIFNPRk9UTyB2YWx1ZSAqLwoKICAgIC8qCiAgICAgKiBPcGVuIHRoZSBmaWxlLgogICAgICovCiAgICBmZCA9IG1jaF9mb3BlbigoY2hhciAqKWZuYW1lLCAiciIpOwogICAgaWYgKGZkID09IE5VTEwpCiAgICB7CglFTVNHMihfKGVfbm90b3BlbiksIGZuYW1lKTsKCXJldHVybiBOVUxMOwogICAgfQoKICAgIHZpbV9zbnByaW50ZigoY2hhciAqKUlPYnVmZiwgSU9TSVpFLCBfKCJSZWFkaW5nIGFmZml4IGZpbGUgJXMgLi4uIiksIGZuYW1lKTsKICAgIHNwZWxsX21lc3NhZ2Uoc3BpbiwgSU9idWZmKTsKCiAgICAvKiBPbmx5IGRvIFJFUCBsaW5lcyB3aGVuIG5vdCBkb25lIGluIGFub3RoZXIgLmFmZiBmaWxlIGFscmVhZHkuICovCiAgICBkb19yZXAgPSBzcGluLT5zaV9yZXAuZ2FfbGVuID09IDA7CgogICAgLyogT25seSBkbyBSRVBTQUwgbGluZXMgd2hlbiBub3QgZG9uZSBpbiBhbm90aGVyIC5hZmYgZmlsZSBhbHJlYWR5LiAqLwogICAgZG9fcmVwc2FsID0gc3Bpbi0+c2lfcmVwc2FsLmdhX2xlbiA9PSAwOwoKICAgIC8qIE9ubHkgZG8gU0FMIGxpbmVzIHdoZW4gbm90IGRvbmUgaW4gYW5vdGhlciAuYWZmIGZpbGUgYWxyZWFkeS4gKi8KICAgIGRvX3NhbCA9IHNwaW4tPnNpX3NhbC5nYV9sZW4gPT0gMDsKCiAgICAvKiBPbmx5IGRvIE1BUCBsaW5lcyB3aGVuIG5vdCBkb25lIGluIGFub3RoZXIgLmFmZiBmaWxlIGFscmVhZHkuICovCiAgICBkb19tYXAgPSBzcGluLT5zaV9tYXAuZ2FfbGVuID09IDA7CgogICAgLyoKICAgICAqIEFsbG9jYXRlIGFuZCBpbml0IHRoZSBhZmZmaWxlX1Qgc3RydWN0dXJlLgogICAgICovCiAgICBhZmYgPSAoYWZmZmlsZV9UICopZ2V0cm9vbShzcGluLCBzaXplb2YoYWZmZmlsZV9UKSwgVFJVRSk7CiAgICBpZiAoYWZmID09IE5VTEwpCglyZXR1cm4gTlVMTDsKICAgIGhhc2hfaW5pdCgmYWZmLT5hZl9wcmVmKTsKICAgIGhhc2hfaW5pdCgmYWZmLT5hZl9zdWZmKTsKICAgIGhhc2hfaW5pdCgmYWZmLT5hZl9jb21wKTsKCiAgICAvKgogICAgICogUmVhZCBhbGwgdGhlIGxpbmVzIGluIHRoZSBmaWxlIG9uZSBieSBvbmUuCiAgICAgKi8KICAgIHdoaWxlICghdmltX2ZnZXRzKHJsaW5lLCBNQVhMSU5FTEVOLCBmZCkgJiYgIWdvdF9pbnQpCiAgICB7CglsaW5lX2JyZWFrY2hlY2soKTsKCSsrbG51bTsKCgkvKiBTa2lwIGNvbW1lbnQgbGluZXMuICovCglpZiAoKnJsaW5lID09ICcjJykKCSAgICBjb250aW51ZTsKCgkvKiBDb252ZXJ0IGZyb20gIlNFVCIgdG8gJ2VuY29kaW5nJyB3aGVuIG5lZWRlZC4gKi8KCXZpbV9mcmVlKHBjKTsKI2lmZGVmIEZFQVRfTUJZVEUKCWlmIChzcGluLT5zaV9jb252LnZjX3R5cGUgIT0gQ09OVl9OT05FKQoJewoJICAgIHBjID0gc3RyaW5nX2NvbnZlcnQoJnNwaW4tPnNpX2NvbnYsIHJsaW5lLCBOVUxMKTsKCSAgICBpZiAocGMgPT0gTlVMTCkKCSAgICB7CgkJc21zZygoY2hhcl91ICopXygiQ29udmVyc2lvbiBmYWlsdXJlIGZvciB3b3JkIGluICVzIGxpbmUgJWQ6ICVzIiksCgkJCQkJCQkgICBmbmFtZSwgbG51bSwgcmxpbmUpOwoJCWNvbnRpbnVlOwoJICAgIH0KCSAgICBsaW5lID0gcGM7Cgl9CgllbHNlCiNlbmRpZgoJewoJICAgIHBjID0gTlVMTDsKCSAgICBsaW5lID0gcmxpbmU7Cgl9CgoJLyogU3BsaXQgdGhlIGxpbmUgdXAgaW4gd2hpdGUgc2VwYXJhdGVkIGl0ZW1zLiAgUHV0IGEgTlVMIGFmdGVyIGVhY2gKCSAqIGl0ZW0uICovCglpdGVtY250ID0gMDsKCWZvciAocCA9IGxpbmU7IDsgKQoJewoJICAgIHdoaWxlICgqcCAhPSBOVUwgJiYgKnAgPD0gJyAnKSAgLyogc2tpcCB3aGl0ZSBzcGFjZSBhbmQgQ1IvTkwgKi8KCQkrK3A7CgkgICAgaWYgKCpwID09IE5VTCkKCQlicmVhazsKCSAgICBpZiAoaXRlbWNudCA9PSBNQVhJVEVNQ05UKQkgICAgLyogdG9vIG1hbnkgaXRlbXMgKi8KCQlicmVhazsKCSAgICBpdGVtc1tpdGVtY250KytdID0gcDsKCSAgICAvKiBBIGZldyBpdGVtcyBoYXZlIGFyYml0cmFyeSB0ZXh0IGFyZ3VtZW50LCBkb24ndCBzcGxpdCB0aGVtLiAqLwoJICAgIGlmIChpdGVtY250ID09IDIgJiYgc3BlbGxfaW5mb19pdGVtKGl0ZW1zWzBdKSkKCQl3aGlsZSAoKnAgPj0gJyAnIHx8ICpwID09IFRBQikgICAgLyogc2tpcCB1bnRpbCBDUi9OTCAqLwoJCSAgICArK3A7CgkgICAgZWxzZQoJCXdoaWxlICgqcCA+ICcgJykgICAgLyogc2tpcCB1bnRpbCB3aGl0ZSBzcGFjZSBvciBDUi9OTCAqLwoJCSAgICArK3A7CgkgICAgaWYgKCpwID09IE5VTCkKCQlicmVhazsKCSAgICAqcCsrID0gTlVMOwoJfQoKCS8qIEhhbmRsZSBub24tZW1wdHkgbGluZXMuICovCglpZiAoaXRlbWNudCA+IDApCgl7CgkgICAgaWYgKFNUUkNNUChpdGVtc1swXSwgIlNFVCIpID09IDAgJiYgaXRlbWNudCA9PSAyCgkJCQkJCSAgICAgICAmJiBhZmYtPmFmX2VuYyA9PSBOVUxMKQoJICAgIHsKI2lmZGVmIEZFQVRfTUJZVEUKCQkvKiBTZXR1cCBmb3IgY29udmVyc2lvbiBmcm9tICJFTkMiIHRvICdlbmNvZGluZycuICovCgkJYWZmLT5hZl9lbmMgPSBlbmNfY2Fub25pemUoaXRlbXNbMV0pOwoJCWlmIChhZmYtPmFmX2VuYyAhPSBOVUxMICYmICFzcGluLT5zaV9hc2NpaQoJCQkmJiBjb252ZXJ0X3NldHVwKCZzcGluLT5zaV9jb252LCBhZmYtPmFmX2VuYywKCQkJCQkJCSAgICAgICBwX2VuYykgPT0gRkFJTCkKCQkgICAgc21zZygoY2hhcl91ICopXygiQ29udmVyc2lvbiBpbiAlcyBub3Qgc3VwcG9ydGVkOiBmcm9tICVzIHRvICVzIiksCgkJCQkJICAgICAgIGZuYW1lLCBhZmYtPmFmX2VuYywgcF9lbmMpOwoJCXNwaW4tPnNpX2NvbnYudmNfZmFpbCA9IFRSVUU7CiNlbHNlCgkJICAgIHNtc2coKGNoYXJfdSAqKV8oIkNvbnZlcnNpb24gaW4gJXMgbm90IHN1cHBvcnRlZCIpLCBmbmFtZSk7CiNlbmRpZgoJICAgIH0KCSAgICBlbHNlIGlmIChTVFJDTVAoaXRlbXNbMF0sICJGTEFHIikgPT0gMCAmJiBpdGVtY250ID09IDIKCQkJCQkgICAgICAmJiBhZmYtPmFmX2ZsYWd0eXBlID09IEFGVF9DSEFSKQoJICAgIHsKCQlpZiAoU1RSQ01QKGl0ZW1zWzFdLCAibG9uZyIpID09IDApCgkJICAgIGFmZi0+YWZfZmxhZ3R5cGUgPSBBRlRfTE9ORzsKCQllbHNlIGlmIChTVFJDTVAoaXRlbXNbMV0sICJudW0iKSA9PSAwKQoJCSAgICBhZmYtPmFmX2ZsYWd0eXBlID0gQUZUX05VTTsKCQllbHNlIGlmIChTVFJDTVAoaXRlbXNbMV0sICJjYXBsb25nIikgPT0gMCkKCQkgICAgYWZmLT5hZl9mbGFndHlwZSA9IEFGVF9DQVBMT05HOwoJCWVsc2UKCQkgICAgc21zZygoY2hhcl91ICopXygiSW52YWxpZCB2YWx1ZSBmb3IgRkxBRyBpbiAlcyBsaW5lICVkOiAlcyIpLAoJCQkgICAgZm5hbWUsIGxudW0sIGl0ZW1zWzFdKTsKCQlpZiAoYWZmLT5hZl9yYXJlICE9IDAKCQkJfHwgYWZmLT5hZl9rZWVwY2FzZSAhPSAwCgkJCXx8IGFmZi0+YWZfYmFkICE9IDAKCQkJfHwgYWZmLT5hZl9uZWVkYWZmaXggIT0gMAoJCQl8fCBhZmYtPmFmX2NpcmN1bWZpeCAhPSAwCgkJCXx8IGFmZi0+YWZfbmVlZGNvbXAgIT0gMAoJCQl8fCBhZmYtPmFmX2NvbXByb290ICE9IDAKCQkJfHwgYWZmLT5hZl9ub3N1Z2dlc3QgIT0gMAoJCQl8fCBjb21wZmxhZ3MgIT0gTlVMTAoJCQl8fCBhZmYtPmFmX3N1ZmYuaHRfdXNlZCA+IDAKCQkJfHwgYWZmLT5hZl9wcmVmLmh0X3VzZWQgPiAwKQoJCSAgICBzbXNnKChjaGFyX3UgKilfKCJGTEFHIGFmdGVyIHVzaW5nIGZsYWdzIGluICVzIGxpbmUgJWQ6ICVzIiksCgkJCSAgICBmbmFtZSwgbG51bSwgaXRlbXNbMV0pOwoJICAgIH0KCSAgICBlbHNlIGlmIChzcGVsbF9pbmZvX2l0ZW0oaXRlbXNbMF0pKQoJICAgIHsKCQkgICAgcCA9IChjaGFyX3UgKilnZXRyb29tKHNwaW4sCgkJCSAgICAoc3Bpbi0+c2lfaW5mbyA9PSBOVUxMID8gMCA6IFNUUkxFTihzcGluLT5zaV9pbmZvKSkKCQkJICAgICsgU1RSTEVOKGl0ZW1zWzBdKQoJCQkgICAgKyBTVFJMRU4oaXRlbXNbMV0pICsgMywgRkFMU0UpOwoJCSAgICBpZiAocCAhPSBOVUxMKQoJCSAgICB7CgkJCWlmIChzcGluLT5zaV9pbmZvICE9IE5VTEwpCgkJCXsKCQkJICAgIFNUUkNQWShwLCBzcGluLT5zaV9pbmZvKTsKCQkJICAgIFNUUkNBVChwLCAiXG4iKTsKCQkJfQoJCQlTVFJDQVQocCwgaXRlbXNbMF0pOwoJCQlTVFJDQVQocCwgIiAiKTsKCQkJU1RSQ0FUKHAsIGl0ZW1zWzFdKTsKCQkJc3Bpbi0+c2lfaW5mbyA9IHA7CgkJICAgIH0KCSAgICB9CgkgICAgZWxzZSBpZiAoU1RSQ01QKGl0ZW1zWzBdLCAiTUlEV09SRCIpID09IDAgJiYgaXRlbWNudCA9PSAyCgkJCQkJCQkgICAmJiBtaWR3b3JkID09IE5VTEwpCgkgICAgewoJCW1pZHdvcmQgPSBnZXRyb29tX3NhdmUoc3BpbiwgaXRlbXNbMV0pOwoJICAgIH0KCSAgICBlbHNlIGlmIChTVFJDTVAoaXRlbXNbMF0sICJUUlkiKSA9PSAwICYmIGl0ZW1jbnQgPT0gMikKCSAgICB7CgkJLyogaWdub3JlZCwgd2UgbG9vayBpbiB0aGUgdHJlZSBmb3Igd2hhdCBjaGFycyBtYXkgYXBwZWFyICovCgkgICAgfQoJICAgIC8qIFRPRE86IHJlbW92ZSAiUkFSIiBsYXRlciAqLwoJICAgIGVsc2UgaWYgKChTVFJDTVAoaXRlbXNbMF0sICJSQVIiKSA9PSAwCgkJCXx8IFNUUkNNUChpdGVtc1swXSwgIlJBUkUiKSA9PSAwKSAmJiBpdGVtY250ID09IDIKCQkJCQkJICAgICAgICYmIGFmZi0+YWZfcmFyZSA9PSAwKQoJICAgIHsKCQlhZmYtPmFmX3JhcmUgPSBhZmZpdGVtMmZsYWcoYWZmLT5hZl9mbGFndHlwZSwgaXRlbXNbMV0sCgkJCQkJCQkJIGZuYW1lLCBsbnVtKTsKCSAgICB9CgkgICAgLyogVE9ETzogcmVtb3ZlICJLRVAiIGxhdGVyICovCgkgICAgZWxzZSBpZiAoKFNUUkNNUChpdGVtc1swXSwgIktFUCIpID09IDAKCQkgICAgfHwgU1RSQ01QKGl0ZW1zWzBdLCAiS0VFUENBU0UiKSA9PSAwKSAmJiBpdGVtY250ID09IDIKCQkJCQkJICAgICAmJiBhZmYtPmFmX2tlZXBjYXNlID09IDApCgkgICAgewoJCWFmZi0+YWZfa2VlcGNhc2UgPSBhZmZpdGVtMmZsYWcoYWZmLT5hZl9mbGFndHlwZSwgaXRlbXNbMV0sCgkJCQkJCQkJIGZuYW1lLCBsbnVtKTsKCSAgICB9CgkgICAgZWxzZSBpZiAoU1RSQ01QKGl0ZW1zWzBdLCAiQkFEIikgPT0gMCAmJiBpdGVtY250ID09IDIKCQkJCQkJICAgICAgICYmIGFmZi0+YWZfYmFkID09IDApCgkgICAgewoJCWFmZi0+YWZfYmFkID0gYWZmaXRlbTJmbGFnKGFmZi0+YWZfZmxhZ3R5cGUsIGl0ZW1zWzFdLAoJCQkJCQkJCSBmbmFtZSwgbG51bSk7CgkgICAgfQoJICAgIGVsc2UgaWYgKFNUUkNNUChpdGVtc1swXSwgIk5FRURBRkZJWCIpID09IDAgJiYgaXRlbWNudCA9PSAyCgkJCQkJCSAgICAmJiBhZmYtPmFmX25lZWRhZmZpeCA9PSAwKQoJICAgIHsKCQlhZmYtPmFmX25lZWRhZmZpeCA9IGFmZml0ZW0yZmxhZyhhZmYtPmFmX2ZsYWd0eXBlLCBpdGVtc1sxXSwKCQkJCQkJCQkgZm5hbWUsIGxudW0pOwoJICAgIH0KCSAgICBlbHNlIGlmIChTVFJDTVAoaXRlbXNbMF0sICJDSVJDVU1GSVgiKSA9PSAwICYmIGl0ZW1jbnQgPT0gMgoJCQkJCQkgICAgJiYgYWZmLT5hZl9jaXJjdW1maXggPT0gMCkKCSAgICB7CgkJYWZmLT5hZl9jaXJjdW1maXggPSBhZmZpdGVtMmZsYWcoYWZmLT5hZl9mbGFndHlwZSwgaXRlbXNbMV0sCgkJCQkJCQkJIGZuYW1lLCBsbnVtKTsKCSAgICB9CgkgICAgZWxzZSBpZiAoU1RSQ01QKGl0ZW1zWzBdLCAiTk9TVUdHRVNUIikgPT0gMCAmJiBpdGVtY250ID09IDIKCQkJCQkJICAgICYmIGFmZi0+YWZfbm9zdWdnZXN0ID09IDApCgkgICAgewoJCWFmZi0+YWZfbm9zdWdnZXN0ID0gYWZmaXRlbTJmbGFnKGFmZi0+YWZfZmxhZ3R5cGUsIGl0ZW1zWzFdLAoJCQkJCQkJCSBmbmFtZSwgbG51bSk7CgkgICAgfQoJICAgIGVsc2UgaWYgKFNUUkNNUChpdGVtc1swXSwgIk5FRURDT01QT1VORCIpID09IDAgJiYgaXRlbWNudCA9PSAyCgkJCQkJCSAgICAgJiYgYWZmLT5hZl9uZWVkY29tcCA9PSAwKQoJICAgIHsKCQlhZmYtPmFmX25lZWRjb21wID0gYWZmaXRlbTJmbGFnKGFmZi0+YWZfZmxhZ3R5cGUsIGl0ZW1zWzFdLAoJCQkJCQkJCSBmbmFtZSwgbG51bSk7CgkgICAgfQoJICAgIGVsc2UgaWYgKFNUUkNNUChpdGVtc1swXSwgIkNPTVBPVU5EUk9PVCIpID09IDAgJiYgaXRlbWNudCA9PSAyCgkJCQkJCSAgICAgJiYgYWZmLT5hZl9jb21wcm9vdCA9PSAwKQoJICAgIHsKCQlhZmYtPmFmX2NvbXByb290ID0gYWZmaXRlbTJmbGFnKGFmZi0+YWZfZmxhZ3R5cGUsIGl0ZW1zWzFdLAoJCQkJCQkJCSBmbmFtZSwgbG51bSk7CgkgICAgfQoJICAgIGVsc2UgaWYgKFNUUkNNUChpdGVtc1swXSwgIkNPTVBPVU5ERk9SQklERkxBRyIpID09IDAKCQkJCSAgICYmIGl0ZW1jbnQgPT0gMiAmJiBhZmYtPmFmX2NvbXBmb3JiaWQgPT0gMCkKCSAgICB7CgkJYWZmLT5hZl9jb21wZm9yYmlkID0gYWZmaXRlbTJmbGFnKGFmZi0+YWZfZmxhZ3R5cGUsIGl0ZW1zWzFdLAoJCQkJCQkJCSBmbmFtZSwgbG51bSk7CgkJaWYgKGFmZi0+YWZfcHJlZi5odF91c2VkID4gMCkKCQkgICAgc21zZygoY2hhcl91ICopXygiRGVmaW5pbmcgQ09NUE9VTkRGT1JCSURGTEFHIGFmdGVyIFBGWCBpdGVtIG1heSBnaXZlIHdyb25nIHJlc3VsdHMgaW4gJXMgbGluZSAlZCIpLAoJCQkgICAgZm5hbWUsIGxudW0pOwoJICAgIH0KCSAgICBlbHNlIGlmIChTVFJDTVAoaXRlbXNbMF0sICJDT01QT1VORFBFUk1JVEZMQUciKSA9PSAwCgkJCQkgICAmJiBpdGVtY250ID09IDIgJiYgYWZmLT5hZl9jb21wcGVybWl0ID09IDApCgkgICAgewoJCWFmZi0+YWZfY29tcHBlcm1pdCA9IGFmZml0ZW0yZmxhZyhhZmYtPmFmX2ZsYWd0eXBlLCBpdGVtc1sxXSwKCQkJCQkJCQkgZm5hbWUsIGxudW0pOwoJCWlmIChhZmYtPmFmX3ByZWYuaHRfdXNlZCA+IDApCgkJICAgIHNtc2coKGNoYXJfdSAqKV8oIkRlZmluaW5nIENPTVBPVU5EUEVSTUlURkxBRyBhZnRlciBQRlggaXRlbSBtYXkgZ2l2ZSB3cm9uZyByZXN1bHRzIGluICVzIGxpbmUgJWQiKSwKCQkJICAgIGZuYW1lLCBsbnVtKTsKCSAgICB9CgkgICAgZWxzZSBpZiAoU1RSQ01QKGl0ZW1zWzBdLCAiQ09NUE9VTkRGTEFHIikgPT0gMCAmJiBpdGVtY250ID09IDIKCQkJCQkJCSAmJiBjb21wZmxhZ3MgPT0gTlVMTCkKCSAgICB7CgkJLyogVHVybiBmbGFnICJjIiBpbnRvIENPTVBPVU5EUlVMRSBjb21wYXRpYmxlIHN0cmluZyAiYysiLAoJCSAqICJOYSIgaW50byAiTmErIiwgIjEyMzQiIGludG8gIjEyMzQrIi4gKi8KCQlwID0gZ2V0cm9vbShzcGluLCBTVFJMRU4oaXRlbXNbMV0pICsgMiwgRkFMU0UpOwoJCWlmIChwICE9IE5VTEwpCgkJewoJCSAgICBTVFJDUFkocCwgaXRlbXNbMV0pOwoJCSAgICBTVFJDQVQocCwgIisiKTsKCQkgICAgY29tcGZsYWdzID0gcDsKCQl9CgkgICAgfQoJICAgIGVsc2UgaWYgKFNUUkNNUChpdGVtc1swXSwgIkNPTVBPVU5EUlVMRSIpID09IDAgJiYgaXRlbWNudCA9PSAyKQoJICAgIHsKCQkvKiBDb25jYXRlbmF0ZSB0aGlzIHN0cmluZyB0byBwcmV2aW91c2x5IGRlZmluZWQgb25lcywgdXNpbmcgYQoJCSAqIHNsYXNoIHRvIHNlcGFyYXRlIHRoZW0uICovCgkJbCA9IFNUUkxFTihpdGVtc1sxXSkgKyAxOwoJCWlmIChjb21wZmxhZ3MgIT0gTlVMTCkKCQkgICAgbCArPSBTVFJMRU4oY29tcGZsYWdzKSArIDE7CgkJcCA9IGdldHJvb20oc3BpbiwgbCwgRkFMU0UpOwoJCWlmIChwICE9IE5VTEwpCgkJewoJCSAgICBpZiAoY29tcGZsYWdzICE9IE5VTEwpCgkJICAgIHsKCQkJU1RSQ1BZKHAsIGNvbXBmbGFncyk7CgkJCVNUUkNBVChwLCAiLyIpOwoJCSAgICB9CgkJICAgIFNUUkNBVChwLCBpdGVtc1sxXSk7CgkJICAgIGNvbXBmbGFncyA9IHA7CgkJfQoJICAgIH0KCSAgICBlbHNlIGlmIChTVFJDTVAoaXRlbXNbMF0sICJDT01QT1VORFdPUkRNQVgiKSA9PSAwICYmIGl0ZW1jbnQgPT0gMgoJCQkJCQkJICAgICAgJiYgY29tcG1heCA9PSAwKQoJICAgIHsKCQljb21wbWF4ID0gYXRvaSgoY2hhciAqKWl0ZW1zWzFdKTsKCQlpZiAoY29tcG1heCA9PSAwKQoJCSAgICBzbXNnKChjaGFyX3UgKilfKCJXcm9uZyBDT01QT1VORFdPUkRNQVggdmFsdWUgaW4gJXMgbGluZSAlZDogJXMiKSwKCQkJCQkJICAgICAgIGZuYW1lLCBsbnVtLCBpdGVtc1sxXSk7CgkgICAgfQoJICAgIGVsc2UgaWYgKFNUUkNNUChpdGVtc1swXSwgIkNPTVBPVU5ETUlOIikgPT0gMCAmJiBpdGVtY250ID09IDIKCQkJCQkJCSAgICYmIGNvbXBtaW5sZW4gPT0gMCkKCSAgICB7CgkJY29tcG1pbmxlbiA9IGF0b2koKGNoYXIgKilpdGVtc1sxXSk7CgkJaWYgKGNvbXBtaW5sZW4gPT0gMCkKCQkgICAgc21zZygoY2hhcl91ICopXygiV3JvbmcgQ09NUE9VTkRNSU4gdmFsdWUgaW4gJXMgbGluZSAlZDogJXMiKSwKCQkJCQkJICAgICAgIGZuYW1lLCBsbnVtLCBpdGVtc1sxXSk7CgkgICAgfQoJICAgIGVsc2UgaWYgKFNUUkNNUChpdGVtc1swXSwgIkNPTVBPVU5EU1lMTUFYIikgPT0gMCAmJiBpdGVtY250ID09IDIKCQkJCQkJCSAgICYmIGNvbXBzeWxtYXggPT0gMCkKCSAgICB7CgkJY29tcHN5bG1heCA9IGF0b2koKGNoYXIgKilpdGVtc1sxXSk7CgkJaWYgKGNvbXBzeWxtYXggPT0gMCkKCQkgICAgc21zZygoY2hhcl91ICopXygiV3JvbmcgQ09NUE9VTkRTWUxNQVggdmFsdWUgaW4gJXMgbGluZSAlZDogJXMiKSwKCQkJCQkJICAgICAgIGZuYW1lLCBsbnVtLCBpdGVtc1sxXSk7CgkgICAgfQoJICAgIGVsc2UgaWYgKFNUUkNNUChpdGVtc1swXSwgIkNIRUNLQ09NUE9VTkREVVAiKSA9PSAwICYmIGl0ZW1jbnQgPT0gMSkKCSAgICB7CgkJY29tcG9wdGlvbnMgfD0gQ09NUF9DSEVDS0RVUDsKCSAgICB9CgkgICAgZWxzZSBpZiAoU1RSQ01QKGl0ZW1zWzBdLCAiQ0hFQ0tDT01QT1VORFJFUCIpID09IDAgJiYgaXRlbWNudCA9PSAxKQoJICAgIHsKCQljb21wb3B0aW9ucyB8PSBDT01QX0NIRUNLUkVQOwoJICAgIH0KCSAgICBlbHNlIGlmIChTVFJDTVAoaXRlbXNbMF0sICJDSEVDS0NPTVBPVU5EQ0FTRSIpID09IDAgJiYgaXRlbWNudCA9PSAxKQoJICAgIHsKCQljb21wb3B0aW9ucyB8PSBDT01QX0NIRUNLQ0FTRTsKCSAgICB9CgkgICAgZWxzZSBpZiAoU1RSQ01QKGl0ZW1zWzBdLCAiQ0hFQ0tDT01QT1VORFRSSVBMRSIpID09IDAKCQkJCQkJCSAgICAgICYmIGl0ZW1jbnQgPT0gMSkKCSAgICB7CgkJY29tcG9wdGlvbnMgfD0gQ09NUF9DSEVDS1RSSVBMRTsKCSAgICB9CgkgICAgZWxzZSBpZiAoU1RSQ01QKGl0ZW1zWzBdLCAiQ0hFQ0tDT01QT1VORFBBVFRFUk4iKSA9PSAwCgkJCQkJCQkgICAgICAmJiBpdGVtY250ID09IDIpCgkgICAgewoJCWlmIChhdG9pKChjaGFyICopaXRlbXNbMV0pID09IDApCgkJICAgIHNtc2coKGNoYXJfdSAqKV8oIldyb25nIENIRUNLQ09NUE9VTkRQQVRURVJOIHZhbHVlIGluICVzIGxpbmUgJWQ6ICVzIiksCgkJCQkJCSAgICAgICBmbmFtZSwgbG51bSwgaXRlbXNbMV0pOwoJICAgIH0KCSAgICBlbHNlIGlmIChTVFJDTVAoaXRlbXNbMF0sICJDSEVDS0NPTVBPVU5EUEFUVEVSTiIpID09IDAKCQkJCQkJCSAgICAgICYmIGl0ZW1jbnQgPT0gMykKCSAgICB7CgkJZ2FycmF5X1QgICAgKmdhcCA9ICZzcGluLT5zaV9jb21wcGF0OwoJCWludAkgICAgaTsKCgkJLyogT25seSBhZGQgdGhlIGNvdXBsZSBpZiBpdCBpc24ndCBhbHJlYWR5IHRoZXJlLiAqLwoJCWZvciAoaSA9IDA7IGkgPCBnYXAtPmdhX2xlbiAtIDE7IGkgKz0gMikKCQkgICAgaWYgKFNUUkNNUCgoKGNoYXJfdSAqKikoZ2FwLT5nYV9kYXRhKSlbaV0sIGl0ZW1zWzFdKSA9PSAwCgkJCSAgICAmJiBTVFJDTVAoKChjaGFyX3UgKiopKGdhcC0+Z2FfZGF0YSkpW2kgKyAxXSwKCQkJCQkJCSAgICAgICBpdGVtc1syXSkgPT0gMCkKCQkJYnJlYWs7CgkJaWYgKGkgPj0gZ2FwLT5nYV9sZW4gJiYgZ2FfZ3JvdyhnYXAsIDIpID09IE9LKQoJCXsKCQkgICAgKChjaGFyX3UgKiopKGdhcC0+Z2FfZGF0YSkpW2dhcC0+Z2FfbGVuKytdCgkJCQkJICAgICAgID0gZ2V0cm9vbV9zYXZlKHNwaW4sIGl0ZW1zWzFdKTsKCQkgICAgKChjaGFyX3UgKiopKGdhcC0+Z2FfZGF0YSkpW2dhcC0+Z2FfbGVuKytdCgkJCQkJICAgICAgID0gZ2V0cm9vbV9zYXZlKHNwaW4sIGl0ZW1zWzJdKTsKCQl9CgkgICAgfQoJICAgIGVsc2UgaWYgKFNUUkNNUChpdGVtc1swXSwgIlNZTExBQkxFIikgPT0gMCAmJiBpdGVtY250ID09IDIKCQkJCQkJCSAgJiYgc3lsbGFibGUgPT0gTlVMTCkKCSAgICB7CgkJc3lsbGFibGUgPSBnZXRyb29tX3NhdmUoc3BpbiwgaXRlbXNbMV0pOwoJICAgIH0KCSAgICBlbHNlIGlmIChTVFJDTVAoaXRlbXNbMF0sICJOT0JSRUFLIikgPT0gMCAmJiBpdGVtY250ID09IDEpCgkgICAgewoJCXNwaW4tPnNpX25vYnJlYWsgPSBUUlVFOwoJICAgIH0KCSAgICBlbHNlIGlmIChTVFJDTVAoaXRlbXNbMF0sICJOT1NQTElUU1VHUyIpID09IDAgJiYgaXRlbWNudCA9PSAxKQoJICAgIHsKCQlzcGluLT5zaV9ub3NwbGl0c3VncyA9IFRSVUU7CgkgICAgfQoJICAgIGVsc2UgaWYgKFNUUkNNUChpdGVtc1swXSwgIk5PU1VHRklMRSIpID09IDAgJiYgaXRlbWNudCA9PSAxKQoJICAgIHsKCQlzcGluLT5zaV9ub3N1Z2ZpbGUgPSBUUlVFOwoJICAgIH0KCSAgICBlbHNlIGlmIChTVFJDTVAoaXRlbXNbMF0sICJQRlhQT1NUUE9ORSIpID09IDAgJiYgaXRlbWNudCA9PSAxKQoJICAgIHsKCQlhZmYtPmFmX3BmeHBvc3Rwb25lID0gVFJVRTsKCSAgICB9CgkgICAgZWxzZSBpZiAoKFNUUkNNUChpdGVtc1swXSwgIlBGWCIpID09IDAKCQkJCQkgICAgICB8fCBTVFJDTVAoaXRlbXNbMF0sICJTRlgiKSA9PSAwKQoJCSAgICAmJiBhZmZfdG9kbyA9PSAwCgkJICAgICYmIGl0ZW1jbnQgPj0gNCkKCSAgICB7CgkJaW50CWxhc3RpID0gNDsKCQljaGFyX3UJa2V5W0FIX0tFWV9MRU5dOwoKCQlpZiAoKml0ZW1zWzBdID09ICdQJykKCQkgICAgdHAgPSAmYWZmLT5hZl9wcmVmOwoJCWVsc2UKCQkgICAgdHAgPSAmYWZmLT5hZl9zdWZmOwoKCQkvKiBNeXNwZWxsIGFsbG93cyB0aGUgc2FtZSBhZmZpeCBuYW1lIHRvIGJlIHVzZWQgbXVsdGlwbGUKCQkgKiB0aW1lcy4gIFRoZSBhZmZpeCBmaWxlcyB0aGF0IGRvIHRoaXMgaGF2ZSBhbiB1bmRvY3VtZW50ZWQKCQkgKiAiUyIgZmxhZyBvbiBhbGwgYnV0IHRoZSBsYXN0IGJsb2NrLCB0aHVzIHdlIGNoZWNrIGZvciB0aGF0CgkJICogYW5kIHN0b3JlIGl0IGluIGFoX2ZvbGxvd3MuICovCgkJdmltX3N0cm5jcHkoa2V5LCBpdGVtc1sxXSwgQUhfS0VZX0xFTiAtIDEpOwoJCWhpID0gaGFzaF9maW5kKHRwLCBrZXkpOwoJCWlmICghSEFTSElURU1fRU1QVFkoaGkpKQoJCXsKCQkgICAgY3VyX2FmZiA9IEhJMkFIKGhpKTsKCQkgICAgaWYgKGN1cl9hZmYtPmFoX2NvbWJpbmUgIT0gKCppdGVtc1syXSA9PSAnWScpKQoJCQlzbXNnKChjaGFyX3UgKilfKCJEaWZmZXJlbnQgY29tYmluaW5nIGZsYWcgaW4gY29udGludWVkIGFmZml4IGJsb2NrIGluICVzIGxpbmUgJWQ6ICVzIiksCgkJCQkJCSAgIGZuYW1lLCBsbnVtLCBpdGVtc1sxXSk7CgkJICAgIGlmICghY3VyX2FmZi0+YWhfZm9sbG93cykKCQkJc21zZygoY2hhcl91ICopXygiRHVwbGljYXRlIGFmZml4IGluICVzIGxpbmUgJWQ6ICVzIiksCgkJCQkJCSAgICAgICBmbmFtZSwgbG51bSwgaXRlbXNbMV0pOwoJCX0KCQllbHNlCgkJewoJCSAgICAvKiBOZXcgYWZmaXggbGV0dGVyLiAqLwoJCSAgICBjdXJfYWZmID0gKGFmZmhlYWRlcl9UICopZ2V0cm9vbShzcGluLAoJCQkJCQkgICBzaXplb2YoYWZmaGVhZGVyX1QpLCBUUlVFKTsKCQkgICAgaWYgKGN1cl9hZmYgPT0gTlVMTCkKCQkJYnJlYWs7CgkJICAgIGN1cl9hZmYtPmFoX2ZsYWcgPSBhZmZpdGVtMmZsYWcoYWZmLT5hZl9mbGFndHlwZSwgaXRlbXNbMV0sCgkJCQkJCQkJIGZuYW1lLCBsbnVtKTsKCQkgICAgaWYgKGN1cl9hZmYtPmFoX2ZsYWcgPT0gMCB8fCBTVFJMRU4oaXRlbXNbMV0pID49IEFIX0tFWV9MRU4pCgkJCWJyZWFrOwoJCSAgICBpZiAoY3VyX2FmZi0+YWhfZmxhZyA9PSBhZmYtPmFmX2JhZAoJCQkgICAgfHwgY3VyX2FmZi0+YWhfZmxhZyA9PSBhZmYtPmFmX3JhcmUKCQkJICAgIHx8IGN1cl9hZmYtPmFoX2ZsYWcgPT0gYWZmLT5hZl9rZWVwY2FzZQoJCQkgICAgfHwgY3VyX2FmZi0+YWhfZmxhZyA9PSBhZmYtPmFmX25lZWRhZmZpeAoJCQkgICAgfHwgY3VyX2FmZi0+YWhfZmxhZyA9PSBhZmYtPmFmX2NpcmN1bWZpeAoJCQkgICAgfHwgY3VyX2FmZi0+YWhfZmxhZyA9PSBhZmYtPmFmX25vc3VnZ2VzdAoJCQkgICAgfHwgY3VyX2FmZi0+YWhfZmxhZyA9PSBhZmYtPmFmX25lZWRjb21wCgkJCSAgICB8fCBjdXJfYWZmLT5haF9mbGFnID09IGFmZi0+YWZfY29tcHJvb3QpCgkJCXNtc2coKGNoYXJfdSAqKV8oIkFmZml4IGFsc28gdXNlZCBmb3IgQkFEL1JBUkUvS0VFUENBU0UvTkVFREFGRklYL05FRURDT01QT1VORC9OT1NVR0dFU1QgaW4gJXMgbGluZSAlZDogJXMiKSwKCQkJCQkJICAgICAgIGZuYW1lLCBsbnVtLCBpdGVtc1sxXSk7CgkJICAgIFNUUkNQWShjdXJfYWZmLT5haF9rZXksIGl0ZW1zWzFdKTsKCQkgICAgaGFzaF9hZGQodHAsIGN1cl9hZmYtPmFoX2tleSk7CgoJCSAgICBjdXJfYWZmLT5haF9jb21iaW5lID0gKCppdGVtc1syXSA9PSAnWScpOwoJCX0KCgkJLyogQ2hlY2sgZm9yIHRoZSAiUyIgZmxhZywgd2hpY2ggYXBwYXJlbnRseSBtZWFucyB0aGF0IGFub3RoZXIKCQkgKiBibG9jayB3aXRoIHRoZSBzYW1lIGFmZml4IG5hbWUgaXMgZm9sbG93aW5nLiAqLwoJCWlmIChpdGVtY250ID4gbGFzdGkgJiYgU1RSQ01QKGl0ZW1zW2xhc3RpXSwgIlMiKSA9PSAwKQoJCXsKCQkgICAgKytsYXN0aTsKCQkgICAgY3VyX2FmZi0+YWhfZm9sbG93cyA9IFRSVUU7CgkJfQoJCWVsc2UKCQkgICAgY3VyX2FmZi0+YWhfZm9sbG93cyA9IEZBTFNFOwoKCQkvKiBNeXNwZWxsIGFsbG93cyBleHRyYSB0ZXh0IGFmdGVyIHRoZSBpdGVtLCBidXQgdGhhdCBtaWdodAoJCSAqIG1lYW4gbWlzdGFrZXMgZ28gdW5ub3RpY2VkLiAgUmVxdWlyZSBhIGNvbW1lbnQtc3RhcnRlci4gKi8KCQlpZiAoaXRlbWNudCA+IGxhc3RpICYmICppdGVtc1tsYXN0aV0gIT0gJyMnKQoJCSAgICBzbXNnKChjaGFyX3UgKilfKGVfYWZmdHJhaWxpbmcpLCBmbmFtZSwgbG51bSwgaXRlbXNbbGFzdGldKTsKCgkJaWYgKFNUUkNNUChpdGVtc1syXSwgIlkiKSAhPSAwICYmIFNUUkNNUChpdGVtc1syXSwgIk4iKSAhPSAwKQoJCSAgICBzbXNnKChjaGFyX3UgKilfKCJFeHBlY3RlZCBZIG9yIE4gaW4gJXMgbGluZSAlZDogJXMiKSwKCQkJCQkJICAgICAgIGZuYW1lLCBsbnVtLCBpdGVtc1syXSk7CgoJCWlmICgqaXRlbXNbMF0gPT0gJ1AnICYmIGFmZi0+YWZfcGZ4cG9zdHBvbmUpCgkJewoJCSAgICBpZiAoY3VyX2FmZi0+YWhfbmV3SUQgPT0gMCkKCQkgICAgewoJCQkvKiBVc2UgYSBuZXcgbnVtYmVyIGluIHRoZSAuc3BsIGZpbGUgbGF0ZXIsIHRvIGJlIGFibGUKCQkJICogdG8gaGFuZGxlIG11bHRpcGxlIC5hZmYgZmlsZXMuICovCgkJCWNoZWNrX3JlbnVtYmVyKHNwaW4pOwoJCQljdXJfYWZmLT5haF9uZXdJRCA9ICsrc3Bpbi0+c2lfbmV3cHJlZklEOwoKCQkJLyogV2Ugb25seSByZWFsbHkgdXNlIGFoX25ld0lEIGlmIHRoZSBwcmVmaXggaXMKCQkJICogcG9zdHBvbmVkLiAgV2Uga25vdyB0aGF0IG9ubHkgYWZ0ZXIgaGFuZGxpbmcgYWxsCgkJCSAqIHRoZSBpdGVtcy4gKi8KCQkJZGlkX3Bvc3Rwb25lX3ByZWZpeCA9IEZBTFNFOwoJCSAgICB9CgkJICAgIGVsc2UKCQkJLyogRGlkIHVzZSB0aGUgSUQgaW4gYSBwcmV2aW91cyBibG9jay4gKi8KCQkJZGlkX3Bvc3Rwb25lX3ByZWZpeCA9IFRSVUU7CgkJfQoKCQlhZmZfdG9kbyA9IGF0b2koKGNoYXIgKilpdGVtc1szXSk7CgkgICAgfQoJICAgIGVsc2UgaWYgKChTVFJDTVAoaXRlbXNbMF0sICJQRlgiKSA9PSAwCgkJCQkJICAgICAgfHwgU1RSQ01QKGl0ZW1zWzBdLCAiU0ZYIikgPT0gMCkKCQkgICAgJiYgYWZmX3RvZG8gPiAwCgkJICAgICYmIFNUUkNNUChjdXJfYWZmLT5haF9rZXksIGl0ZW1zWzFdKSA9PSAwCgkJICAgICYmIGl0ZW1jbnQgPj0gNSkKCSAgICB7CgkJYWZmZW50cnlfVAkqYWZmX2VudHJ5OwoJCWludAkJdXBwZXIgPSBGQUxTRTsKCQlpbnQJCWxhc3RpID0gNTsKCgkJLyogTXlzcGVsbCBhbGxvd3MgZXh0cmEgdGV4dCBhZnRlciB0aGUgaXRlbSwgYnV0IHRoYXQgbWlnaHQKCQkgKiBtZWFuIG1pc3Rha2VzIGdvIHVubm90aWNlZC4gIFJlcXVpcmUgYSBjb21tZW50LXN0YXJ0ZXIuCgkJICogSHVuc3BlbGwgdXNlcyBhICItIiBpdGVtLiAqLwoJCWlmIChpdGVtY250ID4gbGFzdGkgJiYgKml0ZW1zW2xhc3RpXSAhPSAnIycKCQkJJiYgKFNUUkNNUChpdGVtc1tsYXN0aV0sICItIikgIT0gMAoJCQkJCQkgICAgIHx8IGl0ZW1jbnQgIT0gbGFzdGkgKyAxKSkKCQkgICAgc21zZygoY2hhcl91ICopXyhlX2FmZnRyYWlsaW5nKSwgZm5hbWUsIGxudW0sIGl0ZW1zW2xhc3RpXSk7CgoJCS8qIE5ldyBpdGVtIGZvciBhbiBhZmZpeCBsZXR0ZXIuICovCgkJLS1hZmZfdG9kbzsKCQlhZmZfZW50cnkgPSAoYWZmZW50cnlfVCAqKWdldHJvb20oc3BpbiwKCQkJCQkJICAgIHNpemVvZihhZmZlbnRyeV9UKSwgVFJVRSk7CgkJaWYgKGFmZl9lbnRyeSA9PSBOVUxMKQoJCSAgICBicmVhazsKCgkJaWYgKFNUUkNNUChpdGVtc1syXSwgIjAiKSAhPSAwKQoJCSAgICBhZmZfZW50cnktPmFlX2Nob3AgPSBnZXRyb29tX3NhdmUoc3BpbiwgaXRlbXNbMl0pOwoJCWlmIChTVFJDTVAoaXRlbXNbM10sICIwIikgIT0gMCkKCQl7CgkJICAgIGFmZl9lbnRyeS0+YWVfYWRkID0gZ2V0cm9vbV9zYXZlKHNwaW4sIGl0ZW1zWzNdKTsKCgkJICAgIC8qIFJlY29nbml6ZSBmbGFncyBvbiB0aGUgYWZmaXg6IGFiY2QvWFlaICovCgkJICAgIGFmZl9lbnRyeS0+YWVfZmxhZ3MgPSB2aW1fc3RyY2hyKGFmZl9lbnRyeS0+YWVfYWRkLCAnLycpOwoJCSAgICBpZiAoYWZmX2VudHJ5LT5hZV9mbGFncyAhPSBOVUxMKQoJCSAgICB7CgkJCSphZmZfZW50cnktPmFlX2ZsYWdzKysgPSBOVUw7CgkJCWFmZl9wcm9jZXNzX2ZsYWdzKGFmZiwgYWZmX2VudHJ5KTsKCQkgICAgfQoJCX0KCgkJLyogRG9uJ3QgdXNlIGFuIGFmZml4IGVudHJ5IHdpdGggbm9uLUFTQ0lJIGNoYXJhY3RlcnMgd2hlbgoJCSAqICJzcGluLT5zaV9hc2NpaSIgaXMgVFJVRS4gKi8KCQlpZiAoIXNwaW4tPnNpX2FzY2lpIHx8ICEoaGFzX25vbl9hc2NpaShhZmZfZW50cnktPmFlX2Nob3ApCgkJCQkJICB8fCBoYXNfbm9uX2FzY2lpKGFmZl9lbnRyeS0+YWVfYWRkKSkpCgkJewoJCSAgICBhZmZfZW50cnktPmFlX25leHQgPSBjdXJfYWZmLT5haF9maXJzdDsKCQkgICAgY3VyX2FmZi0+YWhfZmlyc3QgPSBhZmZfZW50cnk7CgoJCSAgICBpZiAoU1RSQ01QKGl0ZW1zWzRdLCAiLiIpICE9IDApCgkJICAgIHsKCQkJY2hhcl91CWJ1ZltNQVhMSU5FTEVOXTsKCgkJCWFmZl9lbnRyeS0+YWVfY29uZCA9IGdldHJvb21fc2F2ZShzcGluLCBpdGVtc1s0XSk7CgkJCWlmICgqaXRlbXNbMF0gPT0gJ1AnKQoJCQkgICAgc3ByaW50ZigoY2hhciAqKWJ1ZiwgIl4lcyIsIGl0ZW1zWzRdKTsKCQkJZWxzZQoJCQkgICAgc3ByaW50ZigoY2hhciAqKWJ1ZiwgIiVzJCIsIGl0ZW1zWzRdKTsKCQkJYWZmX2VudHJ5LT5hZV9wcm9nID0gdmltX3JlZ2NvbXAoYnVmLAoJCQkJCSAgICBSRV9NQUdJQyArIFJFX1NUUklORyArIFJFX1NUUklDVCk7CgkJCWlmIChhZmZfZW50cnktPmFlX3Byb2cgPT0gTlVMTCkKCQkJICAgIHNtc2coKGNoYXJfdSAqKV8oIkJyb2tlbiBjb25kaXRpb24gaW4gJXMgbGluZSAlZDogJXMiKSwKCQkJCQkJICAgICAgIGZuYW1lLCBsbnVtLCBpdGVtc1s0XSk7CgkJICAgIH0KCgkJICAgIC8qIEZvciBwb3N0cG9uZWQgcHJlZml4ZXMgd2UgbmVlZCBhbiBlbnRyeSBpbiBzaV9wcmVmY29uZAoJCSAgICAgKiBmb3IgdGhlIGNvbmRpdGlvbi4gIFVzZSBhbiBleGlzdGluZyBvbmUgaWYgcG9zc2libGUuCgkJICAgICAqIENhbid0IGJlIGRvbmUgZm9yIGFuIGFmZml4IHdpdGggZmxhZ3MsIGlnbm9yaW5nCgkJICAgICAqIENPTVBPVU5ERk9SQklERkxBRyBhbmQgQ09NUE9VTkRQRVJNSVRGTEFHLiAqLwoJCSAgICBpZiAoKml0ZW1zWzBdID09ICdQJyAmJiBhZmYtPmFmX3BmeHBvc3Rwb25lCgkJCQkJICAgICAgICYmIGFmZl9lbnRyeS0+YWVfZmxhZ3MgPT0gTlVMTCkKCQkgICAgewoJCQkvKiBXaGVuIHRoZSBjaG9wIHN0cmluZyBpcyBvbmUgbG93ZXItY2FzZSBsZXR0ZXIgYW5kCgkJCSAqIHRoZSBhZGQgc3RyaW5nIGVuZHMgaW4gdGhlIHVwcGVyLWNhc2UgbGV0dGVyIHdlIHNldAoJCQkgKiB0aGUgInVwcGVyIiBmbGFnLCBjbGVhciAiYWVfY2hvcCIgYW5kIHJlbW92ZSB0aGUKCQkJICogbGV0dGVycyBmcm9tICJhZV9hZGQiLiAgVGhlIGNvbmRpdGlvbiBtdXN0IGVpdGhlcgoJCQkgKiBiZSBlbXB0eSBvciBzdGFydCB3aXRoIHRoZSBzYW1lIGxldHRlci4gKi8KCQkJaWYgKGFmZl9lbnRyeS0+YWVfY2hvcCAhPSBOVUxMCgkJCQkmJiBhZmZfZW50cnktPmFlX2FkZCAhPSBOVUxMCiNpZmRlZiBGRUFUX01CWVRFCgkJCQkmJiBhZmZfZW50cnktPmFlX2Nob3BbKCptYl9wdHIybGVuKSgKCQkJCQkJICAgYWZmX2VudHJ5LT5hZV9jaG9wKV0gPT0gTlVMCiNlbHNlCgkJCQkmJiBhZmZfZW50cnktPmFlX2Nob3BbMV0gPT0gTlVMCiNlbmRpZgoJCQkJKQoJCQl7CgkJCSAgICBpbnQJCWMsIGNfdXA7CgoJCQkgICAgYyA9IFBUUjJDSEFSKGFmZl9lbnRyeS0+YWVfY2hvcCk7CgkJCSAgICBjX3VwID0gU1BFTExfVE9VUFBFUihjKTsKCQkJICAgIGlmIChjX3VwICE9IGMKCQkJCSAgICAmJiAoYWZmX2VudHJ5LT5hZV9jb25kID09IE5VTEwKCQkJCQl8fCBQVFIyQ0hBUihhZmZfZW50cnktPmFlX2NvbmQpID09IGMpKQoJCQkgICAgewoJCQkJcCA9IGFmZl9lbnRyeS0+YWVfYWRkCgkJCQkJCSAgKyBTVFJMRU4oYWZmX2VudHJ5LT5hZV9hZGQpOwoJCQkJbWJfcHRyX2JhY2soYWZmX2VudHJ5LT5hZV9hZGQsIHApOwoJCQkJaWYgKFBUUjJDSEFSKHApID09IGNfdXApCgkJCQl7CgkJCQkgICAgdXBwZXIgPSBUUlVFOwoJCQkJICAgIGFmZl9lbnRyeS0+YWVfY2hvcCA9IE5VTEw7CgkJCQkgICAgKnAgPSBOVUw7CgoJCQkJICAgIC8qIFRoZSBjb25kaXRpb24gaXMgbWF0Y2hlZCB3aXRoIHRoZQoJCQkJICAgICAqIGFjdHVhbCB3b3JkLCB0aHVzIG11c3QgY2hlY2sgZm9yIHRoZQoJCQkJICAgICAqIHVwcGVyLWNhc2UgbGV0dGVyLiAqLwoJCQkJICAgIGlmIChhZmZfZW50cnktPmFlX2NvbmQgIT0gTlVMTCkKCQkJCSAgICB7CgkJCQkJY2hhcl91CWJ1ZltNQVhMSU5FTEVOXTsKI2lmZGVmIEZFQVRfTUJZVEUKCQkJCQlpZiAoaGFzX21ieXRlKQoJCQkJCXsKCQkJCQkgICAgb25lY2FwX2NvcHkoaXRlbXNbNF0sIGJ1ZiwgVFJVRSk7CgkJCQkJICAgIGFmZl9lbnRyeS0+YWVfY29uZCA9IGdldHJvb21fc2F2ZSgKCQkJCQkJCQkgICBzcGluLCBidWYpOwoJCQkJCX0KCQkJCQllbHNlCiNlbmRpZgoJCQkJCSAgICAqYWZmX2VudHJ5LT5hZV9jb25kID0gY191cDsKCQkJCQlpZiAoYWZmX2VudHJ5LT5hZV9jb25kICE9IE5VTEwpCgkJCQkJewoJCQkJCSAgICBzcHJpbnRmKChjaGFyICopYnVmLCAiXiVzIiwKCQkJCQkJCSAgYWZmX2VudHJ5LT5hZV9jb25kKTsKCQkJCQkgICAgdmltX2ZyZWUoYWZmX2VudHJ5LT5hZV9wcm9nKTsKCQkJCQkgICAgYWZmX2VudHJ5LT5hZV9wcm9nID0gdmltX3JlZ2NvbXAoCgkJCQkJCSAgICBidWYsIFJFX01BR0lDICsgUkVfU1RSSU5HKTsKCQkJCQl9CgkJCQkgICAgfQoJCQkJfQoJCQkgICAgfQoJCQl9CgoJCQlpZiAoYWZmX2VudHJ5LT5hZV9jaG9wID09IE5VTEwKCQkJCQkgICAgICAgJiYgYWZmX2VudHJ5LT5hZV9mbGFncyA9PSBOVUxMKQoJCQl7CgkJCSAgICBpbnQJCWlkeDsKCQkJICAgIGNoYXJfdQkqKnBwOwoJCQkgICAgaW50CQluOwoKCQkJICAgIC8qIEZpbmQgYSBwcmV2aW91c2x5IHVzZWQgY29uZGl0aW9uLiAqLwoJCQkgICAgZm9yIChpZHggPSBzcGluLT5zaV9wcmVmY29uZC5nYV9sZW4gLSAxOyBpZHggPj0gMDsKCQkJCQkJCQkJLS1pZHgpCgkJCSAgICB7CgkJCQlwID0gKChjaGFyX3UgKiopc3Bpbi0+c2lfcHJlZmNvbmQuZ2FfZGF0YSlbaWR4XTsKCQkJCWlmIChzdHJfZXF1YWwocCwgYWZmX2VudHJ5LT5hZV9jb25kKSkKCQkJCSAgICBicmVhazsKCQkJICAgIH0KCQkJICAgIGlmIChpZHggPCAwICYmIGdhX2dyb3coJnNwaW4tPnNpX3ByZWZjb25kLCAxKSA9PSBPSykKCQkJICAgIHsKCQkJCS8qIE5vdCBmb3VuZCwgYWRkIGEgbmV3IGNvbmRpdGlvbi4gKi8KCQkJCWlkeCA9IHNwaW4tPnNpX3ByZWZjb25kLmdhX2xlbisrOwoJCQkJcHAgPSAoKGNoYXJfdSAqKilzcGluLT5zaV9wcmVmY29uZC5nYV9kYXRhKQoJCQkJCQkJCQkrIGlkeDsKCQkJCWlmIChhZmZfZW50cnktPmFlX2NvbmQgPT0gTlVMTCkKCQkJCSAgICAqcHAgPSBOVUxMOwoJCQkJZWxzZQoJCQkJICAgICpwcCA9IGdldHJvb21fc2F2ZShzcGluLAoJCQkJCQkJICBhZmZfZW50cnktPmFlX2NvbmQpOwoJCQkgICAgfQoKCQkJICAgIC8qIEFkZCB0aGUgcHJlZml4IHRvIHRoZSBwcmVmaXggdHJlZS4gKi8KCQkJICAgIGlmIChhZmZfZW50cnktPmFlX2FkZCA9PSBOVUxMKQoJCQkJcCA9IChjaGFyX3UgKikiIjsKCQkJICAgIGVsc2UKCQkJCXAgPSBhZmZfZW50cnktPmFlX2FkZDsKCgkJCSAgICAvKiBQRlhfRkxBR1MgaXMgYSBuZWdhdGl2ZSBudW1iZXIsIHNvIHRoYXQKCQkJICAgICAqIHRyZWVfYWRkX3dvcmQoKSBrbm93cyB0aGlzIGlzIHRoZSBwcmVmaXggdHJlZS4gKi8KCQkJICAgIG4gPSBQRlhfRkxBR1M7CgkJCSAgICBpZiAoIWN1cl9hZmYtPmFoX2NvbWJpbmUpCgkJCQluIHw9IFdGUF9OQzsKCQkJICAgIGlmICh1cHBlcikKCQkJCW4gfD0gV0ZQX1VQOwoJCQkgICAgaWYgKGFmZl9lbnRyeS0+YWVfY29tcHBlcm1pdCkKCQkJCW4gfD0gV0ZQX0NPTVBQRVJNSVQ7CgkJCSAgICBpZiAoYWZmX2VudHJ5LT5hZV9jb21wZm9yYmlkKQoJCQkJbiB8PSBXRlBfQ09NUEZPUkJJRDsKCQkJICAgIHRyZWVfYWRkX3dvcmQoc3BpbiwgcCwgc3Bpbi0+c2lfcHJlZnJvb3QsIG4sCgkJCQkJCSAgICAgIGlkeCwgY3VyX2FmZi0+YWhfbmV3SUQpOwoJCQkgICAgZGlkX3Bvc3Rwb25lX3ByZWZpeCA9IFRSVUU7CgkJCX0KCgkJCS8qIERpZG4ndCBhY3R1YWxseSB1c2UgYWhfbmV3SUQsIGJhY2t1cCBzaV9uZXdwcmVmSUQuICovCgkJCWlmIChhZmZfdG9kbyA9PSAwICYmICFkaWRfcG9zdHBvbmVfcHJlZml4KQoJCQl7CgkJCSAgICAtLXNwaW4tPnNpX25ld3ByZWZJRDsKCQkJICAgIGN1cl9hZmYtPmFoX25ld0lEID0gMDsKCQkJfQoJCSAgICB9CgkJfQoJICAgIH0KCSAgICBlbHNlIGlmIChTVFJDTVAoaXRlbXNbMF0sICJGT0wiKSA9PSAwICYmIGl0ZW1jbnQgPT0gMgoJCQkJCQkJICAgICAgICYmIGZvbCA9PSBOVUxMKQoJICAgIHsKCQlmb2wgPSB2aW1fc3Ryc2F2ZShpdGVtc1sxXSk7CgkgICAgfQoJICAgIGVsc2UgaWYgKFNUUkNNUChpdGVtc1swXSwgIkxPVyIpID09IDAgJiYgaXRlbWNudCA9PSAyCgkJCQkJCQkgICAgICAgJiYgbG93ID09IE5VTEwpCgkgICAgewoJCWxvdyA9IHZpbV9zdHJzYXZlKGl0ZW1zWzFdKTsKCSAgICB9CgkgICAgZWxzZSBpZiAoU1RSQ01QKGl0ZW1zWzBdLCAiVVBQIikgPT0gMCAmJiBpdGVtY250ID09IDIKCQkJCQkJCSAgICAgICAmJiB1cHAgPT0gTlVMTCkKCSAgICB7CgkJdXBwID0gdmltX3N0cnNhdmUoaXRlbXNbMV0pOwoJICAgIH0KCSAgICBlbHNlIGlmICgoU1RSQ01QKGl0ZW1zWzBdLCAiUkVQIikgPT0gMAoJCQl8fCBTVFJDTVAoaXRlbXNbMF0sICJSRVBTQUwiKSA9PSAwKQoJCSAgICAmJiBpdGVtY250ID09IDIpCgkgICAgewoJCS8qIElnbm9yZSBSRVAvUkVQU0FMIGNvdW50ICovOwoJCWlmICghaXNkaWdpdCgqaXRlbXNbMV0pKQoJCSAgICBzbXNnKChjaGFyX3UgKilfKCJFeHBlY3RlZCBSRVAoU0FMKSBjb3VudCBpbiAlcyBsaW5lICVkIiksCgkJCQkJCQkJIGZuYW1lLCBsbnVtKTsKCSAgICB9CgkgICAgZWxzZSBpZiAoKFNUUkNNUChpdGVtc1swXSwgIlJFUCIpID09IDAKCQkJfHwgU1RSQ01QKGl0ZW1zWzBdLCAiUkVQU0FMIikgPT0gMCkKCQkgICAgJiYgaXRlbWNudCA+PSAzKQoJICAgIHsKCQkvKiBSRVAvUkVQU0FMIGl0ZW0gKi8KCQkvKiBNeXNwZWxsIGlnbm9yZXMgZXh0cmEgYXJndW1lbnRzLCB3ZSByZXF1aXJlIGl0IHN0YXJ0cyB3aXRoCgkJICogIyB0byBkZXRlY3QgbWlzdGFrZXMuICovCgkJaWYgKGl0ZW1jbnQgPiAzICYmIGl0ZW1zWzNdWzBdICE9ICcjJykKCQkgICAgc21zZygoY2hhcl91ICopXyhlX2FmZnRyYWlsaW5nKSwgZm5hbWUsIGxudW0sIGl0ZW1zWzNdKTsKCQlpZiAoaXRlbXNbMF1bM10gPT0gJ1MnID8gZG9fcmVwc2FsIDogZG9fcmVwKQoJCXsKCQkgICAgLyogUmVwbGFjZSB1bmRlcnNjb3JlIHdpdGggc3BhY2UgKGNhbid0IGluY2x1ZGUgYSBzcGFjZQoJCSAgICAgKiBkaXJlY3RseSkuICovCgkJICAgIGZvciAocCA9IGl0ZW1zWzFdOyAqcCAhPSBOVUw7IG1iX3B0cl9hZHYocCkpCgkJCWlmICgqcCA9PSAnXycpCgkJCSAgICAqcCA9ICcgJzsKCQkgICAgZm9yIChwID0gaXRlbXNbMl07ICpwICE9IE5VTDsgbWJfcHRyX2FkdihwKSkKCQkJaWYgKCpwID09ICdfJykKCQkJICAgICpwID0gJyAnOwoJCSAgICBhZGRfZnJvbXRvKHNwaW4sIGl0ZW1zWzBdWzNdID09ICdTJwoJCQkJCSA/ICZzcGluLT5zaV9yZXBzYWwKCQkJCQkgOiAmc3Bpbi0+c2lfcmVwLCBpdGVtc1sxXSwgaXRlbXNbMl0pOwoJCX0KCSAgICB9CgkgICAgZWxzZSBpZiAoU1RSQ01QKGl0ZW1zWzBdLCAiTUFQIikgPT0gMCAmJiBpdGVtY250ID09IDIpCgkgICAgewoJCS8qIE1BUCBpdGVtIG9yIGNvdW50ICovCgkJaWYgKCFmb3VuZF9tYXApCgkJewoJCSAgICAvKiBGaXJzdCBsaW5lIGNvbnRhaW5zIHRoZSBjb3VudC4gKi8KCQkgICAgZm91bmRfbWFwID0gVFJVRTsKCQkgICAgaWYgKCFpc2RpZ2l0KCppdGVtc1sxXSkpCgkJCXNtc2coKGNoYXJfdSAqKV8oIkV4cGVjdGVkIE1BUCBjb3VudCBpbiAlcyBsaW5lICVkIiksCgkJCQkJCQkJIGZuYW1lLCBsbnVtKTsKCQl9CgkJZWxzZSBpZiAoZG9fbWFwKQoJCXsKCQkgICAgaW50CQljOwoKCQkgICAgLyogQ2hlY2sgdGhhdCBldmVyeSBjaGFyYWN0ZXIgYXBwZWFycyBvbmx5IG9uY2UuICovCgkJICAgIGZvciAocCA9IGl0ZW1zWzFdOyAqcCAhPSBOVUw7ICkKCQkgICAgewojaWZkZWYgRkVBVF9NQllURQoJCQljID0gbWJfcHRyMmNoYXJfYWR2KCZwKTsKI2Vsc2UKCQkJYyA9ICpwKys7CiNlbmRpZgoJCQlpZiAoKHNwaW4tPnNpX21hcC5nYV9sZW4gPiAwCgkJCQkgICAgJiYgdmltX3N0cmNocihzcGluLT5zaV9tYXAuZ2FfZGF0YSwgYykKCQkJCQkJCQkgICAgICAhPSBOVUxMKQoJCQkJfHwgdmltX3N0cmNocihwLCBjKSAhPSBOVUxMKQoJCQkgICAgc21zZygoY2hhcl91ICopXygiRHVwbGljYXRlIGNoYXJhY3RlciBpbiBNQVAgaW4gJXMgbGluZSAlZCIpLAoJCQkJCQkJCSBmbmFtZSwgbG51bSk7CgkJICAgIH0KCgkJICAgIC8qIFdlIHNpbXBseSBjb25jYXRlbmF0ZSBhbGwgdGhlIE1BUCBzdHJpbmdzLCBzZXBhcmF0ZWQgYnkKCQkgICAgICogc2xhc2hlcy4gKi8KCQkgICAgZ2FfY29uY2F0KCZzcGluLT5zaV9tYXAsIGl0ZW1zWzFdKTsKCQkgICAgZ2FfYXBwZW5kKCZzcGluLT5zaV9tYXAsICcvJyk7CgkJfQoJICAgIH0KCSAgICAvKiBBY2NlcHQgIlNBTCBmcm9tIHRvIiBhbmQgIlNBTCBmcm9tIHRvICMgY29tbWVudCIuICovCgkgICAgZWxzZSBpZiAoU1RSQ01QKGl0ZW1zWzBdLCAiU0FMIikgPT0gMAoJCSAgICAmJiAoaXRlbWNudCA9PSAzIHx8IChpdGVtY250ID4gMyAmJiBpdGVtc1szXVswXSA9PSAnIycpKSkKCSAgICB7CgkJaWYgKGRvX3NhbCkKCQl7CgkJICAgIC8qIFNBTCBpdGVtIChzb3VuZHMtYS1saWtlKQoJCSAgICAgKiBFaXRoZXIgb25lIG9mIHRoZSBrbm93biBrZXlzIG9yIGEgZnJvbS10byBwYWlyLiAqLwoJCSAgICBpZiAoU1RSQ01QKGl0ZW1zWzFdLCAiZm9sbG93dXAiKSA9PSAwKQoJCQlzcGluLT5zaV9mb2xsb3d1cCA9IHNhbF90b19ib29sKGl0ZW1zWzJdKTsKCQkgICAgZWxzZSBpZiAoU1RSQ01QKGl0ZW1zWzFdLCAiY29sbGFwc2VfcmVzdWx0IikgPT0gMCkKCQkJc3Bpbi0+c2lfY29sbGFwc2UgPSBzYWxfdG9fYm9vbChpdGVtc1syXSk7CgkJICAgIGVsc2UgaWYgKFNUUkNNUChpdGVtc1sxXSwgInJlbW92ZV9hY2NlbnRzIikgPT0gMCkKCQkJc3Bpbi0+c2lfcmVtX2FjY2VudHMgPSBzYWxfdG9fYm9vbChpdGVtc1syXSk7CgkJICAgIGVsc2UKCQkJLyogd2hlbiAidG8iIGlzICJfIiBpdCBtZWFucyBlbXB0eSAqLwoJCQlhZGRfZnJvbXRvKHNwaW4sICZzcGluLT5zaV9zYWwsIGl0ZW1zWzFdLAoJCQkJICAgICBTVFJDTVAoaXRlbXNbMl0sICJfIikgPT0gMCA/IChjaGFyX3UgKikiIgoJCQkJCQkJCTogaXRlbXNbMl0pOwoJCX0KCSAgICB9CgkgICAgZWxzZSBpZiAoU1RSQ01QKGl0ZW1zWzBdLCAiU09GT0ZST00iKSA9PSAwICYmIGl0ZW1jbnQgPT0gMgoJCQkJCQkJICAmJiBzb2ZvZnJvbSA9PSBOVUxMKQoJICAgIHsKCQlzb2ZvZnJvbSA9IGdldHJvb21fc2F2ZShzcGluLCBpdGVtc1sxXSk7CgkgICAgfQoJICAgIGVsc2UgaWYgKFNUUkNNUChpdGVtc1swXSwgIlNPRk9UTyIpID09IDAgJiYgaXRlbWNudCA9PSAyCgkJCQkJCQkgICAgJiYgc29mb3RvID09IE5VTEwpCgkgICAgewoJCXNvZm90byA9IGdldHJvb21fc2F2ZShzcGluLCBpdGVtc1sxXSk7CgkgICAgfQoJICAgIGVsc2UgaWYgKFNUUkNNUChpdGVtc1swXSwgIkNPTU1PTiIpID09IDApCgkgICAgewoJCWludAlpOwoKCQlmb3IgKGkgPSAxOyBpIDwgaXRlbWNudDsgKytpKQoJCXsKCQkgICAgaWYgKEhBU0hJVEVNX0VNUFRZKGhhc2hfZmluZCgmc3Bpbi0+c2lfY29tbW9ud29yZHMsCgkJCQkJCQkJICAgaXRlbXNbaV0pKSkKCQkgICAgewoJCQlwID0gdmltX3N0cnNhdmUoaXRlbXNbaV0pOwoJCQlpZiAocCA9PSBOVUxMKQoJCQkgICAgYnJlYWs7CgkJCWhhc2hfYWRkKCZzcGluLT5zaV9jb21tb253b3JkcywgcCk7CgkJICAgIH0KCQl9CgkgICAgfQoJICAgIGVsc2UKCQlzbXNnKChjaGFyX3UgKilfKCJVbnJlY29nbml6ZWQgb3IgZHVwbGljYXRlIGl0ZW0gaW4gJXMgbGluZSAlZDogJXMiKSwKCQkJCQkJICAgICAgIGZuYW1lLCBsbnVtLCBpdGVtc1swXSk7Cgl9CiAgICB9CgogICAgaWYgKGZvbCAhPSBOVUxMIHx8IGxvdyAhPSBOVUxMIHx8IHVwcCAhPSBOVUxMKQogICAgewoJaWYgKHNwaW4tPnNpX2NsZWFyX2NoYXJ0YWIpCgl7CgkgICAgLyogQ2xlYXIgdGhlIGNoYXIgdHlwZSB0YWJsZXMsIGRvbid0IHdhbnQgdG8gdXNlIGFueSBvZiB0aGUKCSAgICAgKiBjdXJyZW50bHkgdXNlZCBzcGVsbCBwcm9wZXJ0aWVzLiAqLwoJICAgIGluaXRfc3BlbGxfY2hhcnRhYigpOwoJICAgIHNwaW4tPnNpX2NsZWFyX2NoYXJ0YWIgPSBGQUxTRTsKCX0KCgkvKgoJICogRG9uJ3Qgd3JpdGUgYSB3b3JkIHRhYmxlIGZvciBhbiBBU0NJSSBmaWxlLCBzbyB0aGF0IHdlIGRvbid0IGNoZWNrCgkgKiBmb3IgY29uZmxpY3RzIHdpdGggYSB3b3JkIHRhYmxlIHRoYXQgbWF0Y2hlcyAnZW5jb2RpbmcnLgoJICogRG9uJ3Qgd3JpdGUgb25lIGZvciB1dGYtOCBlaXRoZXIsIHdlIHVzZSB1dGZfKigpIGFuZAoJICogbWJfZ2V0X2NsYXNzKCksIHRoZSBsaXN0IG9mIGNoYXJzIGluIHRoZSBmaWxlIHdpbGwgYmUgaW5jb21wbGV0ZS4KCSAqLwoJaWYgKCFzcGluLT5zaV9hc2NpaQojaWZkZWYgRkVBVF9NQllURQoJCSYmICFlbmNfdXRmOAojZW5kaWYKCQkpCgl7CgkgICAgaWYgKGZvbCA9PSBOVUxMIHx8IGxvdyA9PSBOVUxMIHx8IHVwcCA9PSBOVUxMKQoJCXNtc2coKGNoYXJfdSAqKV8oIk1pc3NpbmcgRk9ML0xPVy9VUFAgbGluZSBpbiAlcyIpLCBmbmFtZSk7CgkgICAgZWxzZQoJCSh2b2lkKXNldF9zcGVsbF9jaGFydGFiKGZvbCwgbG93LCB1cHApOwoJfQoKCXZpbV9mcmVlKGZvbCk7Cgl2aW1fZnJlZShsb3cpOwoJdmltX2ZyZWUodXBwKTsKICAgIH0KCiAgICAvKiBVc2UgY29tcG91bmQgc3BlY2lmaWNhdGlvbnMgb2YgdGhlIC5hZmYgZmlsZSBmb3IgdGhlIHNwZWxsIGluZm8uICovCiAgICBpZiAoY29tcG1heCAhPSAwKQogICAgewoJYWZmX2NoZWNrX251bWJlcihzcGluLT5zaV9jb21wbWF4LCBjb21wbWF4LCAiQ09NUE9VTkRXT1JETUFYIik7CglzcGluLT5zaV9jb21wbWF4ID0gY29tcG1heDsKICAgIH0KCiAgICBpZiAoY29tcG1pbmxlbiAhPSAwKQogICAgewoJYWZmX2NoZWNrX251bWJlcihzcGluLT5zaV9jb21wbWlubGVuLCBjb21wbWlubGVuLCAiQ09NUE9VTkRNSU4iKTsKCXNwaW4tPnNpX2NvbXBtaW5sZW4gPSBjb21wbWlubGVuOwogICAgfQoKICAgIGlmIChjb21wc3lsbWF4ICE9IDApCiAgICB7CglpZiAoc3lsbGFibGUgPT0gTlVMTCkKCSAgICBzbXNnKChjaGFyX3UgKilfKCJDT01QT1VORFNZTE1BWCB1c2VkIHdpdGhvdXQgU1lMTEFCTEUiKSk7CglhZmZfY2hlY2tfbnVtYmVyKHNwaW4tPnNpX2NvbXBzeWxtYXgsIGNvbXBzeWxtYXgsICJDT01QT1VORFNZTE1BWCIpOwoJc3Bpbi0+c2lfY29tcHN5bG1heCA9IGNvbXBzeWxtYXg7CiAgICB9CgogICAgaWYgKGNvbXBvcHRpb25zICE9IDApCiAgICB7CglhZmZfY2hlY2tfbnVtYmVyKHNwaW4tPnNpX2NvbXBvcHRpb25zLCBjb21wb3B0aW9ucywgIkNPTVBPVU5EIG9wdGlvbnMiKTsKCXNwaW4tPnNpX2NvbXBvcHRpb25zIHw9IGNvbXBvcHRpb25zOwogICAgfQoKICAgIGlmIChjb21wZmxhZ3MgIT0gTlVMTCkKCXByb2Nlc3NfY29tcGZsYWdzKHNwaW4sIGFmZiwgY29tcGZsYWdzKTsKCiAgICAvKiBDaGVjayB0aGF0IHdlIGRpZG4ndCB1c2UgdG9vIG1hbnkgcmVudW1iZXJlZCBmbGFncy4gKi8KICAgIGlmIChzcGluLT5zaV9uZXdjb21wSUQgPCBzcGluLT5zaV9uZXdwcmVmSUQpCiAgICB7CglpZiAoc3Bpbi0+c2lfbmV3Y29tcElEID09IDEyNyB8fCBzcGluLT5zaV9uZXdjb21wSUQgPT0gMjU1KQoJICAgIE1TRyhfKCJUb28gbWFueSBwb3N0cG9uZWQgcHJlZml4ZXMiKSk7CgllbHNlIGlmIChzcGluLT5zaV9uZXdwcmVmSUQgPT0gMCB8fCBzcGluLT5zaV9uZXdwcmVmSUQgPT0gMTI3KQoJICAgIE1TRyhfKCJUb28gbWFueSBjb21wb3VuZCBmbGFncyIpKTsKCWVsc2UKCSAgICBNU0coXygiVG9vIG1hbnkgcG9zcG9uZWQgcHJlZml4ZXMgYW5kL29yIGNvbXBvdW5kIGZsYWdzIikpOwogICAgfQoKICAgIGlmIChzeWxsYWJsZSAhPSBOVUxMKQogICAgewoJYWZmX2NoZWNrX3N0cmluZyhzcGluLT5zaV9zeWxsYWJsZSwgc3lsbGFibGUsICJTWUxMQUJMRSIpOwoJc3Bpbi0+c2lfc3lsbGFibGUgPSBzeWxsYWJsZTsKICAgIH0KCiAgICBpZiAoc29mb2Zyb20gIT0gTlVMTCB8fCBzb2ZvdG8gIT0gTlVMTCkKICAgIHsKCWlmIChzb2ZvZnJvbSA9PSBOVUxMIHx8IHNvZm90byA9PSBOVUxMKQoJICAgIHNtc2coKGNoYXJfdSAqKV8oIk1pc3NpbmcgU09GTyVzIGxpbmUgaW4gJXMiKSwKCQkJCSAgICAgc29mb2Zyb20gPT0gTlVMTCA/ICJGUk9NIiA6ICJUTyIsIGZuYW1lKTsKCWVsc2UgaWYgKHNwaW4tPnNpX3NhbC5nYV9sZW4gPiAwKQoJICAgIHNtc2coKGNoYXJfdSAqKV8oIkJvdGggU0FMIGFuZCBTT0ZPIGxpbmVzIGluICVzIiksIGZuYW1lKTsKCWVsc2UKCXsKCSAgICBhZmZfY2hlY2tfc3RyaW5nKHNwaW4tPnNpX3NvZm9mciwgc29mb2Zyb20sICJTT0ZPRlJPTSIpOwoJICAgIGFmZl9jaGVja19zdHJpbmcoc3Bpbi0+c2lfc29mb3RvLCBzb2ZvdG8sICJTT0ZPVE8iKTsKCSAgICBzcGluLT5zaV9zb2ZvZnIgPSBzb2ZvZnJvbTsKCSAgICBzcGluLT5zaV9zb2ZvdG8gPSBzb2ZvdG87Cgl9CiAgICB9CgogICAgaWYgKG1pZHdvcmQgIT0gTlVMTCkKICAgIHsKCWFmZl9jaGVja19zdHJpbmcoc3Bpbi0+c2lfbWlkd29yZCwgbWlkd29yZCwgIk1JRFdPUkQiKTsKCXNwaW4tPnNpX21pZHdvcmQgPSBtaWR3b3JkOwogICAgfQoKICAgIHZpbV9mcmVlKHBjKTsKICAgIGZjbG9zZShmZCk7CiAgICByZXR1cm4gYWZmOwp9CgovKgogKiBGb3IgYWZmaXggImVudHJ5IiBtb3ZlIENPTVBPVU5ERk9SQklERkxBRyBhbmQgQ09NUE9VTkRQRVJNSVRGTEFHIGZyb20KICogYWVfZmxhZ3MgdG8gYWVfY29tcHBlcm1pdCBhbmQgYWVfY29tcGZvcmJpZC4KICovCiAgICBzdGF0aWMgdm9pZAphZmZfcHJvY2Vzc19mbGFncyhhZmZpbGUsIGVudHJ5KQogICAgYWZmZmlsZV9UCSphZmZpbGU7CiAgICBhZmZlbnRyeV9UCSplbnRyeTsKewogICAgY2hhcl91CSpwOwogICAgY2hhcl91CSpwcmV2cDsKICAgIHVuc2lnbmVkCWZsYWc7CgogICAgaWYgKGVudHJ5LT5hZV9mbGFncyAhPSBOVUxMCgkJJiYgKGFmZmlsZS0+YWZfY29tcGZvcmJpZCAhPSAwIHx8IGFmZmlsZS0+YWZfY29tcHBlcm1pdCAhPSAwKSkKICAgIHsKCWZvciAocCA9IGVudHJ5LT5hZV9mbGFnczsgKnAgIT0gTlVMOyApCgl7CgkgICAgcHJldnAgPSBwOwoJICAgIGZsYWcgPSBnZXRfYWZmaXRlbShhZmZpbGUtPmFmX2ZsYWd0eXBlLCAmcCk7CgkgICAgaWYgKGZsYWcgPT0gYWZmaWxlLT5hZl9jb21wcGVybWl0IHx8IGZsYWcgPT0gYWZmaWxlLT5hZl9jb21wZm9yYmlkKQoJICAgIHsKCQltY2hfbWVtbW92ZShwcmV2cCwgcCwgU1RSTEVOKHApICsgMSk7CgkJcCA9IHByZXZwOwoJCWlmIChmbGFnID09IGFmZmlsZS0+YWZfY29tcHBlcm1pdCkKCQkgICAgZW50cnktPmFlX2NvbXBwZXJtaXQgPSBUUlVFOwoJCWVsc2UKCQkgICAgZW50cnktPmFlX2NvbXBmb3JiaWQgPSBUUlVFOwoJICAgIH0KCSAgICBpZiAoYWZmaWxlLT5hZl9mbGFndHlwZSA9PSBBRlRfTlVNICYmICpwID09ICcsJykKCQkrK3A7Cgl9CglpZiAoKmVudHJ5LT5hZV9mbGFncyA9PSBOVUwpCgkgICAgZW50cnktPmFlX2ZsYWdzID0gTlVMTDsJLyogbm90aGluZyBsZWZ0ICovCiAgICB9Cn0KCi8qCiAqIFJldHVybiBUUlVFIGlmICJzIiBpcyB0aGUgbmFtZSBvZiBhbiBpbmZvIGl0ZW0gaW4gdGhlIGFmZml4IGZpbGUuCiAqLwogICAgc3RhdGljIGludApzcGVsbF9pbmZvX2l0ZW0ocykKICAgIGNoYXJfdQkqczsKewogICAgcmV0dXJuIFNUUkNNUChzLCAiTkFNRSIpID09IDAKCXx8IFNUUkNNUChzLCAiSE9NRSIpID09IDAKCXx8IFNUUkNNUChzLCAiVkVSU0lPTiIpID09IDAKCXx8IFNUUkNNUChzLCAiQVVUSE9SIikgPT0gMAoJfHwgU1RSQ01QKHMsICJFTUFJTCIpID09IDAKCXx8IFNUUkNNUChzLCAiQ09QWVJJR0hUIikgPT0gMDsKfQoKLyoKICogVHVybiBhbiBhZmZpeCBmbGFnIG5hbWUgaW50byBhIG51bWJlciwgYWNjb3JkaW5nIHRvIHRoZSBGTEFHIHR5cGUuCiAqIHJldHVybnMgemVybyBmb3IgZmFpbHVyZS4KICovCiAgICBzdGF0aWMgdW5zaWduZWQKYWZmaXRlbTJmbGFnKGZsYWd0eXBlLCBpdGVtLCBmbmFtZSwgbG51bSkKICAgIGludAkJZmxhZ3R5cGU7CiAgICBjaGFyX3UJKml0ZW07CiAgICBjaGFyX3UJKmZuYW1lOwogICAgaW50CQlsbnVtOwp7CiAgICB1bnNpZ25lZAlyZXM7CiAgICBjaGFyX3UJKnAgPSBpdGVtOwoKICAgIHJlcyA9IGdldF9hZmZpdGVtKGZsYWd0eXBlLCAmcCk7CiAgICBpZiAocmVzID09IDApCiAgICB7CglpZiAoZmxhZ3R5cGUgPT0gQUZUX05VTSkKCSAgICBzbXNnKChjaGFyX3UgKilfKCJGbGFnIGlzIG5vdCBhIG51bWJlciBpbiAlcyBsaW5lICVkOiAlcyIpLAoJCQkJCQkJICAgZm5hbWUsIGxudW0sIGl0ZW0pOwoJZWxzZQoJICAgIHNtc2coKGNoYXJfdSAqKV8oIklsbGVnYWwgZmxhZyBpbiAlcyBsaW5lICVkOiAlcyIpLAoJCQkJCQkJICAgZm5hbWUsIGxudW0sIGl0ZW0pOwogICAgfQogICAgaWYgKCpwICE9IE5VTCkKICAgIHsKCXNtc2coKGNoYXJfdSAqKV8oZV9hZmZuYW1lKSwgZm5hbWUsIGxudW0sIGl0ZW0pOwoJcmV0dXJuIDA7CiAgICB9CgogICAgcmV0dXJuIHJlczsKfQoKLyoKICogR2V0IG9uZSBhZmZpeCBuYW1lIGZyb20gIipwcCIgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIuCiAqIFJldHVybnMgemVybyBmb3IgYW4gZXJyb3IsIHN0aWxsIGFkdmFuY2VzIHRoZSBwb2ludGVyIHRoZW4uCiAqLwogICAgc3RhdGljIHVuc2lnbmVkCmdldF9hZmZpdGVtKGZsYWd0eXBlLCBwcCkKICAgIGludAkJZmxhZ3R5cGU7CiAgICBjaGFyX3UJKipwcDsKewogICAgaW50CQlyZXM7CgogICAgaWYgKGZsYWd0eXBlID09IEFGVF9OVU0pCiAgICB7CglpZiAoIVZJTV9JU0RJR0lUKCoqcHApKQoJewoJICAgICsrKnBwOwkvKiBhbHdheXMgYWR2YW5jZSwgYXZvaWQgZ2V0dGluZyBzdHVjayAqLwoJICAgIHJldHVybiAwOwoJfQoJcmVzID0gZ2V0ZGlnaXRzKHBwKTsKICAgIH0KICAgIGVsc2UKICAgIHsKI2lmZGVmIEZFQVRfTUJZVEUKCXJlcyA9IG1iX3B0cjJjaGFyX2FkdihwcCk7CiNlbHNlCglyZXMgPSAqKCpwcCkrKzsKI2VuZGlmCglpZiAoZmxhZ3R5cGUgPT0gQUZUX0xPTkcgfHwgKGZsYWd0eXBlID09IEFGVF9DQVBMT05HCgkJCQkJCSAmJiByZXMgPj0gJ0EnICYmIHJlcyA8PSAnWicpKQoJewoJICAgIGlmICgqKnBwID09IE5VTCkKCQlyZXR1cm4gMDsKI2lmZGVmIEZFQVRfTUJZVEUKCSAgICByZXMgPSBtYl9wdHIyY2hhcl9hZHYocHApICsgKHJlcyA8PCAxNik7CiNlbHNlCgkgICAgcmVzID0gKigqcHApKysgKyAocmVzIDw8IDE2KTsKI2VuZGlmCgl9CiAgICB9CiAgICByZXR1cm4gcmVzOwp9CgovKgogKiBQcm9jZXNzIHRoZSAiY29tcGZsYWdzIiBzdHJpbmcgdXNlZCBpbiBhbiBhZmZpeCBmaWxlIGFuZCBhcHBlbmQgaXQgdG8KICogc3Bpbi0+c2lfY29tcGZsYWdzLgogKiBUaGUgcHJvY2Vzc2luZyBpbnZvbHZlcyBjaGFuZ2luZyB0aGUgYWZmaXggbmFtZXMgdG8gSUQgbnVtYmVycywgc28gdGhhdAogKiB0aGV5IGZpdCBpbiBvbmUgYnl0ZS4KICovCiAgICBzdGF0aWMgdm9pZApwcm9jZXNzX2NvbXBmbGFncyhzcGluLCBhZmYsIGNvbXBmbGFncykKICAgIHNwZWxsaW5mb19UCSpzcGluOwogICAgYWZmZmlsZV9UCSphZmY7CiAgICBjaGFyX3UJKmNvbXBmbGFnczsKewogICAgY2hhcl91CSpwOwogICAgY2hhcl91CSpwcmV2cDsKICAgIHVuc2lnbmVkCWZsYWc7CiAgICBjb21waXRlbV9UCSpjaTsKICAgIGludAkJaWQ7CiAgICBpbnQJCWxlbjsKICAgIGNoYXJfdQkqdHA7CiAgICBjaGFyX3UJa2V5W0FIX0tFWV9MRU5dOwogICAgaGFzaGl0ZW1fVAkqaGk7CgogICAgLyogTWFrZSByb29tIGZvciB0aGUgb2xkIGFuZCB0aGUgbmV3IGNvbXBmbGFncywgY29uY2F0ZW5hdGVkIHdpdGggYSAvIGluCiAgICAgKiBiZXR3ZWVuLiAgUHJvY2Vzc2luZyBpdCBtYWtlcyBpdCBzaG9ydGVyLCBidXQgd2UgZG9uJ3Qga25vdyBieSBob3cKICAgICAqIG11Y2gsIHRodXMgYWxsb2NhdGUgdGhlIG1heGltdW0uICovCiAgICBsZW4gPSBTVFJMRU4oY29tcGZsYWdzKSArIDE7CiAgICBpZiAoc3Bpbi0+c2lfY29tcGZsYWdzICE9IE5VTEwpCglsZW4gKz0gU1RSTEVOKHNwaW4tPnNpX2NvbXBmbGFncykgKyAxOwogICAgcCA9IGdldHJvb20oc3BpbiwgbGVuLCBGQUxTRSk7CiAgICBpZiAocCA9PSBOVUxMKQoJcmV0dXJuOwogICAgaWYgKHNwaW4tPnNpX2NvbXBmbGFncyAhPSBOVUxMKQogICAgewoJU1RSQ1BZKHAsIHNwaW4tPnNpX2NvbXBmbGFncyk7CglTVFJDQVQocCwgIi8iKTsKICAgIH0KICAgIHNwaW4tPnNpX2NvbXBmbGFncyA9IHA7CiAgICB0cCA9IHAgKyBTVFJMRU4ocCk7CgogICAgZm9yIChwID0gY29tcGZsYWdzOyAqcCAhPSBOVUw7ICkKICAgIHsKCWlmICh2aW1fc3RyY2hyKChjaGFyX3UgKikiLyorW10iLCAqcCkgIT0gTlVMTCkKCSAgICAvKiBDb3B5IG5vbi1mbGFnIGNoYXJhY3RlcnMgZGlyZWN0bHkuICovCgkgICAgKnRwKysgPSAqcCsrOwoJZWxzZQoJewoJICAgIC8qIEZpcnN0IGdldCB0aGUgZmxhZyBudW1iZXIsIGFsc28gY2hlY2tzIHZhbGlkaXR5LiAqLwoJICAgIHByZXZwID0gcDsKCSAgICBmbGFnID0gZ2V0X2FmZml0ZW0oYWZmLT5hZl9mbGFndHlwZSwgJnApOwoJICAgIGlmIChmbGFnICE9IDApCgkgICAgewoJCS8qIEZpbmQgdGhlIGZsYWcgaW4gdGhlIGhhc2h0YWJsZS4gIElmIGl0IHdhcyB1c2VkIGJlZm9yZSwgdXNlCgkJICogdGhlIGV4aXN0aW5nIElELiAgT3RoZXJ3aXNlIGFkZCBhIG5ldyBlbnRyeS4gKi8KCQl2aW1fc3RybmNweShrZXksIHByZXZwLCBwIC0gcHJldnApOwoJCWhpID0gaGFzaF9maW5kKCZhZmYtPmFmX2NvbXAsIGtleSk7CgkJaWYgKCFIQVNISVRFTV9FTVBUWShoaSkpCgkJICAgIGlkID0gSEkyQ0koaGkpLT5jaV9uZXdJRDsKCQllbHNlCgkJewoJCSAgICBjaSA9IChjb21waXRlbV9UICopZ2V0cm9vbShzcGluLCBzaXplb2YoY29tcGl0ZW1fVCksIFRSVUUpOwoJCSAgICBpZiAoY2kgPT0gTlVMTCkKCQkJYnJlYWs7CgkJICAgIFNUUkNQWShjaS0+Y2lfa2V5LCBrZXkpOwoJCSAgICBjaS0+Y2lfZmxhZyA9IGZsYWc7CgkJICAgIC8qIEF2b2lkIHVzaW5nIGEgZmxhZyBJRCB0aGF0IGhhcyBhIHNwZWNpYWwgbWVhbmluZyBpbiBhCgkJICAgICAqIHJlZ2V4cCAoYWxzbyBpbnNpZGUgW10pLiAqLwoJCSAgICBkbwoJCSAgICB7CgkJCWNoZWNrX3JlbnVtYmVyKHNwaW4pOwoJCQlpZCA9IHNwaW4tPnNpX25ld2NvbXBJRC0tOwoJCSAgICB9IHdoaWxlICh2aW1fc3RyY2hyKChjaGFyX3UgKikiLysqW11cXC1eIiwgaWQpICE9IE5VTEwpOwoJCSAgICBjaS0+Y2lfbmV3SUQgPSBpZDsKCQkgICAgaGFzaF9hZGQoJmFmZi0+YWZfY29tcCwgY2ktPmNpX2tleSk7CgkJfQoJCSp0cCsrID0gaWQ7CgkgICAgfQoJICAgIGlmIChhZmYtPmFmX2ZsYWd0eXBlID09IEFGVF9OVU0gJiYgKnAgPT0gJywnKQoJCSsrcDsKCX0KICAgIH0KCiAgICAqdHAgPSBOVUw7Cn0KCi8qCiAqIENoZWNrIHRoYXQgdGhlIG5ldyBJRHMgZm9yIHBvc3Rwb25lZCBhZmZpeGVzIGFuZCBjb21wb3VuZGluZyBkb24ndCBvdmVycnVuCiAqIGVhY2ggb3RoZXIuICBXZSBoYXZlIGFsbW9zdCAyNTUgYXZhaWxhYmxlLCBidXQgc3RhcnQgYXQgMC0xMjcgdG8gYXZvaWQKICogdXNpbmcgdHdvIGJ5dGVzIGZvciB1dGYtOC4gIFdoZW4gdGhlIDAtMTI3IHJhbmdlIGlzIHVzZWQgdXAgZ28gdG8gMTI4LTI1NS4KICogV2hlbiB0aGF0IGlzIHVzZWQgdXAgYW4gZXJyb3IgbWVzc2FnZSBpcyBnaXZlbi4KICovCiAgICBzdGF0aWMgdm9pZApjaGVja19yZW51bWJlcihzcGluKQogICAgc3BlbGxpbmZvX1QJKnNwaW47CnsKICAgIGlmIChzcGluLT5zaV9uZXdwcmVmSUQgPT0gc3Bpbi0+c2lfbmV3Y29tcElEICYmIHNwaW4tPnNpX25ld2NvbXBJRCA8IDEyOCkKICAgIHsKCXNwaW4tPnNpX25ld3ByZWZJRCA9IDEyNzsKCXNwaW4tPnNpX25ld2NvbXBJRCA9IDI1NTsKICAgIH0KfQoKLyoKICogUmV0dXJuIFRSVUUgaWYgZmxhZyAiZmxhZyIgYXBwZWFycyBpbiBhZmZpeCBsaXN0ICJhZmZsaXN0Ii4KICovCiAgICBzdGF0aWMgaW50CmZsYWdfaW5fYWZmbGlzdChmbGFndHlwZSwgYWZmbGlzdCwgZmxhZykKICAgIGludAkJZmxhZ3R5cGU7CiAgICBjaGFyX3UJKmFmZmxpc3Q7CiAgICB1bnNpZ25lZAlmbGFnOwp7CiAgICBjaGFyX3UJKnA7CiAgICB1bnNpZ25lZAluOwoKICAgIHN3aXRjaCAoZmxhZ3R5cGUpCiAgICB7CgljYXNlIEFGVF9DSEFSOgoJICAgIHJldHVybiB2aW1fc3RyY2hyKGFmZmxpc3QsIGZsYWcpICE9IE5VTEw7CgoJY2FzZSBBRlRfQ0FQTE9ORzoKCWNhc2UgQUZUX0xPTkc6CgkgICAgZm9yIChwID0gYWZmbGlzdDsgKnAgIT0gTlVMOyApCgkgICAgewojaWZkZWYgRkVBVF9NQllURQoJCW4gPSBtYl9wdHIyY2hhcl9hZHYoJnApOwojZWxzZQoJCW4gPSAqcCsrOwojZW5kaWYKCQlpZiAoKGZsYWd0eXBlID09IEFGVF9MT05HIHx8IChuID49ICdBJyAmJiBuIDw9ICdaJykpCgkJCQkJCQkJICYmICpwICE9IE5VTCkKI2lmZGVmIEZFQVRfTUJZVEUKCQkgICAgbiA9IG1iX3B0cjJjaGFyX2FkdigmcCkgKyAobiA8PCAxNik7CiNlbHNlCgkJICAgIG4gPSAqcCsrICsgKG4gPDwgMTYpOwojZW5kaWYKCQlpZiAobiA9PSBmbGFnKQoJCSAgICByZXR1cm4gVFJVRTsKCSAgICB9CgkgICAgYnJlYWs7CgoJY2FzZSBBRlRfTlVNOgoJICAgIGZvciAocCA9IGFmZmxpc3Q7ICpwICE9IE5VTDsgKQoJICAgIHsKCQluID0gZ2V0ZGlnaXRzKCZwKTsKCQlpZiAobiA9PSBmbGFnKQoJCSAgICByZXR1cm4gVFJVRTsKCQlpZiAoKnAgIT0gTlVMKQkvKiBza2lwIG92ZXIgY29tbWEgKi8KCQkgICAgKytwOwoJICAgIH0KCSAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBGQUxTRTsKfQoKLyoKICogR2l2ZSBhIHdhcm5pbmcgd2hlbiAic3BpbnZhbCIgYW5kICJhZmZ2YWwiIG51bWJlcnMgYXJlIHNldCBhbmQgbm90IHRoZSBzYW1lLgogKi8KICAgIHN0YXRpYyB2b2lkCmFmZl9jaGVja19udW1iZXIoc3BpbnZhbCwgYWZmdmFsLCBuYW1lKQogICAgaW50CSAgICBzcGludmFsOwogICAgaW50CSAgICBhZmZ2YWw7CiAgICBjaGFyICAgICpuYW1lOwp7CiAgICBpZiAoc3BpbnZhbCAhPSAwICYmIHNwaW52YWwgIT0gYWZmdmFsKQoJc21zZygoY2hhcl91ICopXygiJXMgdmFsdWUgZGlmZmVycyBmcm9tIHdoYXQgaXMgdXNlZCBpbiBhbm90aGVyIC5hZmYgZmlsZSIpLCBuYW1lKTsKfQoKLyoKICogR2l2ZSBhIHdhcm5pbmcgd2hlbiAic3BpbnZhbCIgYW5kICJhZmZ2YWwiIHN0cmluZ3MgYXJlIHNldCBhbmQgbm90IHRoZSBzYW1lLgogKi8KICAgIHN0YXRpYyB2b2lkCmFmZl9jaGVja19zdHJpbmcoc3BpbnZhbCwgYWZmdmFsLCBuYW1lKQogICAgY2hhcl91CSpzcGludmFsOwogICAgY2hhcl91CSphZmZ2YWw7CiAgICBjaGFyCSpuYW1lOwp7CiAgICBpZiAoc3BpbnZhbCAhPSBOVUxMICYmIFNUUkNNUChzcGludmFsLCBhZmZ2YWwpICE9IDApCglzbXNnKChjaGFyX3UgKilfKCIlcyB2YWx1ZSBkaWZmZXJzIGZyb20gd2hhdCBpcyB1c2VkIGluIGFub3RoZXIgLmFmZiBmaWxlIiksIG5hbWUpOwp9CgovKgogKiBSZXR1cm4gVFJVRSBpZiBzdHJpbmdzICJzMSIgYW5kICJzMiIgYXJlIGVxdWFsLiAgQWxzbyBjb25zaWRlciBib3RoIGJlaW5nCiAqIE5VTEwgYXMgZXF1YWwuCiAqLwogICAgc3RhdGljIGludApzdHJfZXF1YWwoczEsIHMyKQogICAgY2hhcl91CSpzMTsKICAgIGNoYXJfdQkqczI7CnsKICAgIGlmIChzMSA9PSBOVUxMIHx8IHMyID09IE5VTEwpCglyZXR1cm4gczEgPT0gczI7CiAgICByZXR1cm4gU1RSQ01QKHMxLCBzMikgPT0gMDsKfQoKLyoKICogQWRkIGEgZnJvbS10byBpdGVtIHRvICJnYXAiLiAgVXNlZCBmb3IgUkVQIGFuZCBTQUwgaXRlbXMuCiAqIFRoZXkgYXJlIHN0b3JlZCBjYXNlLWZvbGRlZC4KICovCiAgICBzdGF0aWMgdm9pZAphZGRfZnJvbXRvKHNwaW4sIGdhcCwgZnJvbSwgdG8pCiAgICBzcGVsbGluZm9fVAkqc3BpbjsKICAgIGdhcnJheV9UCSpnYXA7CiAgICBjaGFyX3UJKmZyb207CiAgICBjaGFyX3UJKnRvOwp7CiAgICBmcm9tdG9fVAkqZnRwOwogICAgY2hhcl91CXdvcmRbTUFYV0xFTl07CgogICAgaWYgKGdhX2dyb3coZ2FwLCAxKSA9PSBPSykKICAgIHsKCWZ0cCA9ICgoZnJvbXRvX1QgKilnYXAtPmdhX2RhdGEpICsgZ2FwLT5nYV9sZW47Cgkodm9pZClzcGVsbF9jYXNlZm9sZChmcm9tLCBTVFJMRU4oZnJvbSksIHdvcmQsIE1BWFdMRU4pOwoJZnRwLT5mdF9mcm9tID0gZ2V0cm9vbV9zYXZlKHNwaW4sIHdvcmQpOwoJKHZvaWQpc3BlbGxfY2FzZWZvbGQodG8sIFNUUkxFTih0byksIHdvcmQsIE1BWFdMRU4pOwoJZnRwLT5mdF90byA9IGdldHJvb21fc2F2ZShzcGluLCB3b3JkKTsKCSsrZ2FwLT5nYV9sZW47CiAgICB9Cn0KCi8qCiAqIENvbnZlcnQgYSBib29sZWFuIGFyZ3VtZW50IGluIGEgU0FMIGxpbmUgdG8gVFJVRSBvciBGQUxTRTsKICovCiAgICBzdGF0aWMgaW50CnNhbF90b19ib29sKHMpCiAgICBjaGFyX3UJKnM7CnsKICAgIHJldHVybiBTVFJDTVAocywgIjEiKSA9PSAwIHx8IFNUUkNNUChzLCAidHJ1ZSIpID09IDA7Cn0KCi8qCiAqIFJldHVybiBUUlVFIGlmIHN0cmluZyAicyIgY29udGFpbnMgYSBub24tQVNDSUkgY2hhcmFjdGVyICgxMjggb3IgaGlnaGVyKS4KICogV2hlbiAicyIgaXMgTlVMTCBGQUxTRSBpcyByZXR1cm5lZC4KICovCiAgICBzdGF0aWMgaW50Cmhhc19ub25fYXNjaWkocykKICAgIGNoYXJfdQkqczsKewogICAgY2hhcl91CSpwOwoKICAgIGlmIChzICE9IE5VTEwpCglmb3IgKHAgPSBzOyAqcCAhPSBOVUw7ICsrcCkKCSAgICBpZiAoKnAgPj0gMTI4KQoJCXJldHVybiBUUlVFOwogICAgcmV0dXJuIEZBTFNFOwp9CgovKgogKiBGcmVlIHRoZSBzdHJ1Y3R1cmUgZmlsbGVkIGJ5IHNwZWxsX3JlYWRfYWZmKCkuCiAqLwogICAgc3RhdGljIHZvaWQKc3BlbGxfZnJlZV9hZmYoYWZmKQogICAgYWZmZmlsZV9UCSphZmY7CnsKICAgIGhhc2h0YWJfVAkqaHQ7CiAgICBoYXNoaXRlbV9UCSpoaTsKICAgIGludAkJdG9kbzsKICAgIGFmZmhlYWRlcl9UCSphaDsKICAgIGFmZmVudHJ5X1QJKmFlOwoKICAgIHZpbV9mcmVlKGFmZi0+YWZfZW5jKTsKCiAgICAvKiBBbGwgdGhpcyB0cm91YmxlIHRvIGZyZWUgdGhlICJhZV9wcm9nIiBpdGVtcy4uLiAqLwogICAgZm9yIChodCA9ICZhZmYtPmFmX3ByZWY7IDsgaHQgPSAmYWZmLT5hZl9zdWZmKQogICAgewoJdG9kbyA9IGh0LT5odF91c2VkOwoJZm9yIChoaSA9IGh0LT5odF9hcnJheTsgdG9kbyA+IDA7ICsraGkpCgl7CgkgICAgaWYgKCFIQVNISVRFTV9FTVBUWShoaSkpCgkgICAgewoJCS0tdG9kbzsKCQlhaCA9IEhJMkFIKGhpKTsKCQlmb3IgKGFlID0gYWgtPmFoX2ZpcnN0OyBhZSAhPSBOVUxMOyBhZSA9IGFlLT5hZV9uZXh0KQoJCSAgICB2aW1fZnJlZShhZS0+YWVfcHJvZyk7CgkgICAgfQoJfQoJaWYgKGh0ID09ICZhZmYtPmFmX3N1ZmYpCgkgICAgYnJlYWs7CiAgICB9CgogICAgaGFzaF9jbGVhcigmYWZmLT5hZl9wcmVmKTsKICAgIGhhc2hfY2xlYXIoJmFmZi0+YWZfc3VmZik7CiAgICBoYXNoX2NsZWFyKCZhZmYtPmFmX2NvbXApOwp9CgovKgogKiBSZWFkIGRpY3Rpb25hcnkgZmlsZSAiZm5hbWUiLgogKiBSZXR1cm5zIE9LIG9yIEZBSUw7CiAqLwogICAgc3RhdGljIGludApzcGVsbF9yZWFkX2RpYyhzcGluLCBmbmFtZSwgYWZmaWxlKQogICAgc3BlbGxpbmZvX1QJKnNwaW47CiAgICBjaGFyX3UJKmZuYW1lOwogICAgYWZmZmlsZV9UCSphZmZpbGU7CnsKICAgIGhhc2h0YWJfVAlodDsKICAgIGNoYXJfdQlsaW5lW01BWExJTkVMRU5dOwogICAgY2hhcl91CSpwOwogICAgY2hhcl91CSphZmZsaXN0OwogICAgY2hhcl91CXN0b3JlX2FmZmxpc3RbTUFYV0xFTl07CiAgICBpbnQJCXBmeGxlbjsKICAgIGludAkJbmVlZF9hZmZpeDsKICAgIGNoYXJfdQkqZHc7CiAgICBjaGFyX3UJKnBjOwogICAgY2hhcl91CSp3OwogICAgaW50CQlsOwogICAgaGFzaF9UCWhhc2g7CiAgICBoYXNoaXRlbV9UCSpoaTsKICAgIEZJTEUJKmZkOwogICAgaW50CQlsbnVtID0gMTsKICAgIGludAkJbm9uX2FzY2lpID0gMDsKICAgIGludAkJcmV0dmFsID0gT0s7CiAgICBjaGFyX3UJbWVzc2FnZVtNQVhMSU5FTEVOICsgTUFYV0xFTl07CiAgICBpbnQJCWZsYWdzOwogICAgaW50CQlkdXBsaWNhdGUgPSAwOwoKICAgIC8qCiAgICAgKiBPcGVuIHRoZSBmaWxlLgogICAgICovCiAgICBmZCA9IG1jaF9mb3BlbigoY2hhciAqKWZuYW1lLCAiciIpOwogICAgaWYgKGZkID09IE5VTEwpCiAgICB7CglFTVNHMihfKGVfbm90b3BlbiksIGZuYW1lKTsKCXJldHVybiBGQUlMOwogICAgfQoKICAgIC8qIFRoZSBoYXNodGFibGUgaXMgb25seSB1c2VkIHRvIGRldGVjdCBkdXBsaWNhdGVkIHdvcmRzLiAqLwogICAgaGFzaF9pbml0KCZodCk7CgogICAgdmltX3NucHJpbnRmKChjaGFyICopSU9idWZmLCBJT1NJWkUsCgkJCQkgIF8oIlJlYWRpbmcgZGljdGlvbmFyeSBmaWxlICVzIC4uLiIpLCBmbmFtZSk7CiAgICBzcGVsbF9tZXNzYWdlKHNwaW4sIElPYnVmZik7CgogICAgLyogc3RhcnQgd2l0aCBhIG1lc3NhZ2UgZm9yIHRoZSBmaXJzdCBsaW5lICovCiAgICBzcGluLT5zaV9tc2dfY291bnQgPSA5OTk5OTk7CgogICAgLyogUmVhZCBhbmQgaWdub3JlIHRoZSBmaXJzdCBsaW5lOiB3b3JkIGNvdW50LiAqLwogICAgKHZvaWQpdmltX2ZnZXRzKGxpbmUsIE1BWExJTkVMRU4sIGZkKTsKICAgIGlmICghdmltX2lzZGlnaXQoKnNraXB3aGl0ZShsaW5lKSkpCglFTVNHMihfKCJFNzYwOiBObyB3b3JkIGNvdW50IGluICVzIiksIGZuYW1lKTsKCiAgICAvKgogICAgICogUmVhZCBhbGwgdGhlIGxpbmVzIGluIHRoZSBmaWxlIG9uZSBieSBvbmUuCiAgICAgKiBUaGUgd29yZHMgYXJlIGNvbnZlcnRlZCB0byAnZW5jb2RpbmcnIGhlcmUsIGJlZm9yZSBiZWluZyBhZGRlZCB0bwogICAgICogdGhlIGhhc2h0YWJsZS4KICAgICAqLwogICAgd2hpbGUgKCF2aW1fZmdldHMobGluZSwgTUFYTElORUxFTiwgZmQpICYmICFnb3RfaW50KQogICAgewoJbGluZV9icmVha2NoZWNrKCk7CgkrK2xudW07CglpZiAobGluZVswXSA9PSAnIycgfHwgbGluZVswXSA9PSAnLycpCgkgICAgY29udGludWU7CS8qIGNvbW1lbnQgbGluZSAqLwoKCS8qIFJlbW92ZSBDUiwgTEYgYW5kIHdoaXRlIHNwYWNlIGZyb20gdGhlIGVuZC4gIFdoaXRlIHNwYWNlIGhhbGZ3YXkKCSAqIHRoZSB3b3JkIGlzIGtlcHQgdG8gYWxsb3cgZS5nLiwgImV0IGFsLiIuICovCglsID0gU1RSTEVOKGxpbmUpOwoJd2hpbGUgKGwgPiAwICYmIGxpbmVbbCAtIDFdIDw9ICcgJykKCSAgICAtLWw7CglpZiAobCA9PSAwKQoJICAgIGNvbnRpbnVlOwkvKiBlbXB0eSBsaW5lICovCglsaW5lW2xdID0gTlVMOwoKI2lmZGVmIEZFQVRfTUJZVEUKCS8qIENvbnZlcnQgZnJvbSAiU0VUIiB0byAnZW5jb2RpbmcnIHdoZW4gbmVlZGVkLiAqLwoJaWYgKHNwaW4tPnNpX2NvbnYudmNfdHlwZSAhPSBDT05WX05PTkUpCgl7CgkgICAgcGMgPSBzdHJpbmdfY29udmVydCgmc3Bpbi0+c2lfY29udiwgbGluZSwgTlVMTCk7CgkgICAgaWYgKHBjID09IE5VTEwpCgkgICAgewoJCXNtc2coKGNoYXJfdSAqKV8oIkNvbnZlcnNpb24gZmFpbHVyZSBmb3Igd29yZCBpbiAlcyBsaW5lICVkOiAlcyIpLAoJCQkJCQkgICAgICAgZm5hbWUsIGxudW0sIGxpbmUpOwoJCWNvbnRpbnVlOwoJICAgIH0KCSAgICB3ID0gcGM7Cgl9CgllbHNlCiNlbmRpZgoJewoJICAgIHBjID0gTlVMTDsKCSAgICB3ID0gbGluZTsKCX0KCgkvKiBUcnVuY2F0ZSB0aGUgd29yZCBhdCB0aGUgIi8iLCBzZXQgImFmZmxpc3QiIHRvIHdoYXQgZm9sbG93cy4KCSAqIFJlcGxhY2UgIlwvIiBieSAiLyIgYW5kICJcXCIgYnkgIlwiLiAqLwoJYWZmbGlzdCA9IE5VTEw7Cglmb3IgKHAgPSB3OyAqcCAhPSBOVUw7IG1iX3B0cl9hZHYocCkpCgl7CgkgICAgaWYgKCpwID09ICdcXCcgJiYgKHBbMV0gPT0gJ1xcJyB8fCBwWzFdID09ICcvJykpCgkJbWNoX21lbW1vdmUocCwgcCArIDEsIFNUUkxFTihwKSk7CgkgICAgZWxzZSBpZiAoKnAgPT0gJy8nKQoJICAgIHsKCQkqcCA9IE5VTDsKCQlhZmZsaXN0ID0gcCArIDE7CgkJYnJlYWs7CgkgICAgfQoJfQoKCS8qIFNraXAgbm9uLUFTQ0lJIHdvcmRzIHdoZW4gInNwaW4tPnNpX2FzY2lpIiBpcyBUUlVFLiAqLwoJaWYgKHNwaW4tPnNpX2FzY2lpICYmIGhhc19ub25fYXNjaWkodykpCgl7CgkgICAgKytub25fYXNjaWk7CgkgICAgdmltX2ZyZWUocGMpOwoJICAgIGNvbnRpbnVlOwoJfQoKCS8qIFRoaXMgdGFrZXMgdGltZSwgcHJpbnQgYSBtZXNzYWdlIGV2ZXJ5IDEwMDAwIHdvcmRzLiAqLwoJaWYgKHNwaW4tPnNpX3ZlcmJvc2UgJiYgc3Bpbi0+c2lfbXNnX2NvdW50ID4gMTAwMDApCgl7CgkgICAgc3Bpbi0+c2lfbXNnX2NvdW50ID0gMDsKCSAgICB2aW1fc25wcmludGYoKGNoYXIgKiltZXNzYWdlLCBzaXplb2YobWVzc2FnZSksCgkJICAgIF8oImxpbmUgJTZkLCB3b3JkICU2ZCAtICVzIiksCgkJICAgICAgIGxudW0sIHNwaW4tPnNpX2ZvbGR3Y291bnQgKyBzcGluLT5zaV9rZWVwd2NvdW50LCB3KTsKCSAgICBtc2dfc3RhcnQoKTsKCSAgICBtc2dfcHV0c19sb25nX2F0dHIobWVzc2FnZSwgMCk7CgkgICAgbXNnX2Nscl9lb3MoKTsKCSAgICBtc2dfZGlkb3V0ID0gRkFMU0U7CgkgICAgbXNnX2NvbCA9IDA7CgkgICAgb3V0X2ZsdXNoKCk7Cgl9CgoJLyogU3RvcmUgdGhlIHdvcmQgaW4gdGhlIGhhc2h0YWJsZSB0byBiZSBhYmxlIHRvIGZpbmQgZHVwbGljYXRlcy4gKi8KCWR3ID0gKGNoYXJfdSAqKWdldHJvb21fc2F2ZShzcGluLCB3KTsKCWlmIChkdyA9PSBOVUxMKQoJewoJICAgIHJldHZhbCA9IEZBSUw7CgkgICAgdmltX2ZyZWUocGMpOwoJICAgIGJyZWFrOwoJfQoKCWhhc2ggPSBoYXNoX2hhc2goZHcpOwoJaGkgPSBoYXNoX2xvb2t1cCgmaHQsIGR3LCBoYXNoKTsKCWlmICghSEFTSElURU1fRU1QVFkoaGkpKQoJewoJICAgIGlmIChwX3ZlcmJvc2UgPiAwKQoJCXNtc2coKGNoYXJfdSAqKV8oIkR1cGxpY2F0ZSB3b3JkIGluICVzIGxpbmUgJWQ6ICVzIiksCgkJCQkJCQkgICAgIGZuYW1lLCBsbnVtLCBkdyk7CgkgICAgZWxzZSBpZiAoZHVwbGljYXRlID09IDApCgkJc21zZygoY2hhcl91ICopXygiRmlyc3QgZHVwbGljYXRlIHdvcmQgaW4gJXMgbGluZSAlZDogJXMiKSwKCQkJCQkJCSAgICAgZm5hbWUsIGxudW0sIGR3KTsKCSAgICArK2R1cGxpY2F0ZTsKCX0KCWVsc2UKCSAgICBoYXNoX2FkZF9pdGVtKCZodCwgaGksIGR3LCBoYXNoKTsKCglmbGFncyA9IDA7CglzdG9yZV9hZmZsaXN0WzBdID0gTlVMOwoJcGZ4bGVuID0gMDsKCW5lZWRfYWZmaXggPSBGQUxTRTsKCWlmIChhZmZsaXN0ICE9IE5VTEwpCgl7CgkgICAgLyogRXh0cmFjdCBmbGFncyBmcm9tIHRoZSBhZmZpeCBsaXN0LiAqLwoJICAgIGZsYWdzIHw9IGdldF9hZmZpeF9mbGFncyhhZmZpbGUsIGFmZmxpc3QpOwoKCSAgICBpZiAoYWZmaWxlLT5hZl9uZWVkYWZmaXggIT0gMCAmJiBmbGFnX2luX2FmZmxpc3QoCgkJCSAgYWZmaWxlLT5hZl9mbGFndHlwZSwgYWZmbGlzdCwgYWZmaWxlLT5hZl9uZWVkYWZmaXgpKQoJCW5lZWRfYWZmaXggPSBUUlVFOwoKCSAgICBpZiAoYWZmaWxlLT5hZl9wZnhwb3N0cG9uZSkKCQkvKiBOZWVkIHRvIHN0b3JlIHRoZSBsaXN0IG9mIHByZWZpeCBJRHMgd2l0aCB0aGUgd29yZC4gKi8KCQlwZnhsZW4gPSBnZXRfcGZ4bGlzdChhZmZpbGUsIGFmZmxpc3QsIHN0b3JlX2FmZmxpc3QpOwoKCSAgICBpZiAoc3Bpbi0+c2lfY29tcGZsYWdzICE9IE5VTEwpCgkJLyogTmVlZCB0byBzdG9yZSB0aGUgbGlzdCBvZiBjb21wb3VuZCBmbGFncyB3aXRoIHRoZSB3b3JkLgoJCSAqIENvbmNhdGVuYXRlIHRoZW0gdG8gdGhlIGxpc3Qgb2YgcHJlZml4IElEcy4gKi8KCQlnZXRfY29tcGZsYWdzKGFmZmlsZSwgYWZmbGlzdCwgc3RvcmVfYWZmbGlzdCArIHBmeGxlbik7Cgl9CgoJLyogQWRkIHRoZSB3b3JkIHRvIHRoZSB3b3JkIHRyZWUocykuICovCglpZiAoc3RvcmVfd29yZChzcGluLCBkdywgZmxhZ3MsIHNwaW4tPnNpX3JlZ2lvbiwKCQkJCQkgICBzdG9yZV9hZmZsaXN0LCBuZWVkX2FmZml4KSA9PSBGQUlMKQoJICAgIHJldHZhbCA9IEZBSUw7CgoJaWYgKGFmZmxpc3QgIT0gTlVMTCkKCXsKCSAgICAvKiBGaW5kIGFsbCBtYXRjaGluZyBzdWZmaXhlcyBhbmQgYWRkIHRoZSByZXN1bHRpbmcgd29yZHMuCgkgICAgICogQWRkaXRpb25hbGx5IGRvIG1hdGNoaW5nIHByZWZpeGVzIHRoYXQgY29tYmluZS4gKi8KCSAgICBpZiAoc3RvcmVfYWZmX3dvcmQoc3BpbiwgZHcsIGFmZmxpc3QsIGFmZmlsZSwKCQkJICAgJmFmZmlsZS0+YWZfc3VmZiwgJmFmZmlsZS0+YWZfcHJlZiwKCQkJICAgIENPTkRJVF9TVUYsIGZsYWdzLCBzdG9yZV9hZmZsaXN0LCBwZnhsZW4pID09IEZBSUwpCgkJcmV0dmFsID0gRkFJTDsKCgkgICAgLyogRmluZCBhbGwgbWF0Y2hpbmcgcHJlZml4ZXMgYW5kIGFkZCB0aGUgcmVzdWx0aW5nIHdvcmRzLiAqLwoJICAgIGlmIChzdG9yZV9hZmZfd29yZChzcGluLCBkdywgYWZmbGlzdCwgYWZmaWxlLAoJCQkgICZhZmZpbGUtPmFmX3ByZWYsIE5VTEwsCgkJCSAgICBDT05ESVRfU1VGLCBmbGFncywgc3RvcmVfYWZmbGlzdCwgcGZ4bGVuKSA9PSBGQUlMKQoJCXJldHZhbCA9IEZBSUw7Cgl9CgoJdmltX2ZyZWUocGMpOwogICAgfQoKICAgIGlmIChkdXBsaWNhdGUgPiAwKQoJc21zZygoY2hhcl91ICopXygiJWQgZHVwbGljYXRlIHdvcmQocykgaW4gJXMiKSwgZHVwbGljYXRlLCBmbmFtZSk7CiAgICBpZiAoc3Bpbi0+c2lfYXNjaWkgJiYgbm9uX2FzY2lpID4gMCkKCXNtc2coKGNoYXJfdSAqKV8oIklnbm9yZWQgJWQgd29yZChzKSB3aXRoIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluICVzIiksCgkJCQkJCQkgICAgbm9uX2FzY2lpLCBmbmFtZSk7CiAgICBoYXNoX2NsZWFyKCZodCk7CgogICAgZmNsb3NlKGZkKTsKICAgIHJldHVybiByZXR2YWw7Cn0KCi8qCiAqIENoZWNrIGZvciBhZmZpeCBmbGFncyBpbiAiYWZmbGlzdCIgdGhhdCBhcmUgdHVybmVkIGludG8gd29yZCBmbGFncy4KICogUmV0dXJuIFdGXyBmbGFncy4KICovCiAgICBzdGF0aWMgaW50CmdldF9hZmZpeF9mbGFncyhhZmZpbGUsIGFmZmxpc3QpCiAgICBhZmZmaWxlX1QJKmFmZmlsZTsKICAgIGNoYXJfdQkqYWZmbGlzdDsKewogICAgaW50CQlmbGFncyA9IDA7CgogICAgaWYgKGFmZmlsZS0+YWZfa2VlcGNhc2UgIT0gMCAmJiBmbGFnX2luX2FmZmxpc3QoCgkJCSAgIGFmZmlsZS0+YWZfZmxhZ3R5cGUsIGFmZmxpc3QsIGFmZmlsZS0+YWZfa2VlcGNhc2UpKQoJZmxhZ3MgfD0gV0ZfS0VFUENBUCB8IFdGX0ZJWENBUDsKICAgIGlmIChhZmZpbGUtPmFmX3JhcmUgIT0gMCAmJiBmbGFnX2luX2FmZmxpc3QoCgkJCSAgICAgICBhZmZpbGUtPmFmX2ZsYWd0eXBlLCBhZmZsaXN0LCBhZmZpbGUtPmFmX3JhcmUpKQoJZmxhZ3MgfD0gV0ZfUkFSRTsKICAgIGlmIChhZmZpbGUtPmFmX2JhZCAhPSAwICYmIGZsYWdfaW5fYWZmbGlzdCgKCQkJCWFmZmlsZS0+YWZfZmxhZ3R5cGUsIGFmZmxpc3QsIGFmZmlsZS0+YWZfYmFkKSkKCWZsYWdzIHw9IFdGX0JBTk5FRDsKICAgIGlmIChhZmZpbGUtPmFmX25lZWRjb21wICE9IDAgJiYgZmxhZ19pbl9hZmZsaXN0KAoJCQkgICBhZmZpbGUtPmFmX2ZsYWd0eXBlLCBhZmZsaXN0LCBhZmZpbGUtPmFmX25lZWRjb21wKSkKCWZsYWdzIHw9IFdGX05FRURDT01QOwogICAgaWYgKGFmZmlsZS0+YWZfY29tcHJvb3QgIT0gMCAmJiBmbGFnX2luX2FmZmxpc3QoCgkJCSAgIGFmZmlsZS0+YWZfZmxhZ3R5cGUsIGFmZmxpc3QsIGFmZmlsZS0+YWZfY29tcHJvb3QpKQoJZmxhZ3MgfD0gV0ZfQ09NUFJPT1Q7CiAgICBpZiAoYWZmaWxlLT5hZl9ub3N1Z2dlc3QgIT0gMCAmJiBmbGFnX2luX2FmZmxpc3QoCgkJCSAgYWZmaWxlLT5hZl9mbGFndHlwZSwgYWZmbGlzdCwgYWZmaWxlLT5hZl9ub3N1Z2dlc3QpKQoJZmxhZ3MgfD0gV0ZfTk9TVUdHRVNUOwogICAgcmV0dXJuIGZsYWdzOwp9CgovKgogKiBHZXQgdGhlIGxpc3Qgb2YgcHJlZml4IElEcyBmcm9tIHRoZSBhZmZpeCBsaXN0ICJhZmZsaXN0Ii4KICogVXNlZCBmb3IgUEZYUE9TVFBPTkUuCiAqIFB1dCB0aGUgcmVzdWx0aW5nIGZsYWdzIGluICJzdG9yZV9hZmZsaXN0W01BWFdMRU5dIiB3aXRoIGEgdGVybWluYXRpbmcgTlVMCiAqIGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBhZmZpeGVzLgogKi8KICAgIHN0YXRpYyBpbnQKZ2V0X3BmeGxpc3QoYWZmaWxlLCBhZmZsaXN0LCBzdG9yZV9hZmZsaXN0KQogICAgYWZmZmlsZV9UCSphZmZpbGU7CiAgICBjaGFyX3UJKmFmZmxpc3Q7CiAgICBjaGFyX3UJKnN0b3JlX2FmZmxpc3Q7CnsKICAgIGNoYXJfdQkqcDsKICAgIGNoYXJfdQkqcHJldnA7CiAgICBpbnQJCWNudCA9IDA7CiAgICBpbnQJCWlkOwogICAgY2hhcl91CWtleVtBSF9LRVlfTEVOXTsKICAgIGhhc2hpdGVtX1QJKmhpOwoKICAgIGZvciAocCA9IGFmZmxpc3Q7ICpwICE9IE5VTDsgKQogICAgewoJcHJldnAgPSBwOwoJaWYgKGdldF9hZmZpdGVtKGFmZmlsZS0+YWZfZmxhZ3R5cGUsICZwKSAhPSAwKQoJewoJICAgIC8qIEEgZmxhZyBpcyBhIHBvc3Rwb25lZCBwcmVmaXggZmxhZyBpZiBpdCBhcHBlYXJzIGluICJhZl9wcmVmIgoJICAgICAqIGFuZCBpdCdzIElEIGlzIG5vdCB6ZXJvLiAqLwoJICAgIHZpbV9zdHJuY3B5KGtleSwgcHJldnAsIHAgLSBwcmV2cCk7CgkgICAgaGkgPSBoYXNoX2ZpbmQoJmFmZmlsZS0+YWZfcHJlZiwga2V5KTsKCSAgICBpZiAoIUhBU0hJVEVNX0VNUFRZKGhpKSkKCSAgICB7CgkJaWQgPSBISTJBSChoaSktPmFoX25ld0lEOwoJCWlmIChpZCAhPSAwKQoJCSAgICBzdG9yZV9hZmZsaXN0W2NudCsrXSA9IGlkOwoJICAgIH0KCX0KCWlmIChhZmZpbGUtPmFmX2ZsYWd0eXBlID09IEFGVF9OVU0gJiYgKnAgPT0gJywnKQoJICAgICsrcDsKICAgIH0KCiAgICBzdG9yZV9hZmZsaXN0W2NudF0gPSBOVUw7CiAgICByZXR1cm4gY250Owp9CgovKgogKiBHZXQgdGhlIGxpc3Qgb2YgY29tcG91bmQgSURzIGZyb20gdGhlIGFmZml4IGxpc3QgImFmZmxpc3QiIHRoYXQgYXJlIHVzZWQKICogZm9yIGNvbXBvdW5kIHdvcmRzLgogKiBQdXRzIHRoZSBmbGFncyBpbiAic3RvcmVfYWZmbGlzdFtdIi4KICovCiAgICBzdGF0aWMgdm9pZApnZXRfY29tcGZsYWdzKGFmZmlsZSwgYWZmbGlzdCwgc3RvcmVfYWZmbGlzdCkKICAgIGFmZmZpbGVfVAkqYWZmaWxlOwogICAgY2hhcl91CSphZmZsaXN0OwogICAgY2hhcl91CSpzdG9yZV9hZmZsaXN0Owp7CiAgICBjaGFyX3UJKnA7CiAgICBjaGFyX3UJKnByZXZwOwogICAgaW50CQljbnQgPSAwOwogICAgY2hhcl91CWtleVtBSF9LRVlfTEVOXTsKICAgIGhhc2hpdGVtX1QJKmhpOwoKICAgIGZvciAocCA9IGFmZmxpc3Q7ICpwICE9IE5VTDsgKQogICAgewoJcHJldnAgPSBwOwoJaWYgKGdldF9hZmZpdGVtKGFmZmlsZS0+YWZfZmxhZ3R5cGUsICZwKSAhPSAwKQoJewoJICAgIC8qIEEgZmxhZyBpcyBhIGNvbXBvdW5kIGZsYWcgaWYgaXQgYXBwZWFycyBpbiAiYWZfY29tcCIuICovCgkgICAgdmltX3N0cm5jcHkoa2V5LCBwcmV2cCwgcCAtIHByZXZwKTsKCSAgICBoaSA9IGhhc2hfZmluZCgmYWZmaWxlLT5hZl9jb21wLCBrZXkpOwoJICAgIGlmICghSEFTSElURU1fRU1QVFkoaGkpKQoJCXN0b3JlX2FmZmxpc3RbY250KytdID0gSEkyQ0koaGkpLT5jaV9uZXdJRDsKCX0KCWlmIChhZmZpbGUtPmFmX2ZsYWd0eXBlID09IEFGVF9OVU0gJiYgKnAgPT0gJywnKQoJICAgICsrcDsKICAgIH0KCiAgICBzdG9yZV9hZmZsaXN0W2NudF0gPSBOVUw7Cn0KCi8qCiAqIEFwcGx5IGFmZml4ZXMgdG8gYSB3b3JkIGFuZCBzdG9yZSB0aGUgcmVzdWx0aW5nIHdvcmRzLgogKiAiaHQiIGlzIHRoZSBoYXNodGFibGUgd2l0aCBhZmZlbnRyeV9UIHRoYXQgbmVlZCB0byBiZSBhcHBsaWVkLCBlaXRoZXIKICogcHJlZml4ZXMgb3Igc3VmZml4ZXMuCiAqICJ4aHQiLCB3aGVuIG5vdCBOVUxMLCBpcyB0aGUgcHJlZml4IGhhc2h0YWJsZSwgdG8gYmUgdXNlZCBhZGRpdGlvbmFsbHkgb24KICogdGhlIHJlc3VsdGluZyB3b3JkcyBmb3IgY29tYmluaW5nIGFmZml4ZXMuCiAqCiAqIFJldHVybnMgRkFJTCB3aGVuIG91dCBvZiBtZW1vcnkuCiAqLwogICAgc3RhdGljIGludApzdG9yZV9hZmZfd29yZChzcGluLCB3b3JkLCBhZmZsaXN0LCBhZmZpbGUsIGh0LCB4aHQsIGNvbmRpdCwgZmxhZ3MsCgkJCQkJCQkgICAgICBwZnhsaXN0LCBwZnhsZW4pCiAgICBzcGVsbGluZm9fVAkqc3BpbjsJCS8qIHNwZWxsIGluZm8gKi8KICAgIGNoYXJfdQkqd29yZDsJCS8qIGJhc2ljIHdvcmQgc3RhcnQgKi8KICAgIGNoYXJfdQkqYWZmbGlzdDsJLyogbGlzdCBvZiBuYW1lcyBvZiBzdXBwb3J0ZWQgYWZmaXhlcyAqLwogICAgYWZmZmlsZV9UCSphZmZpbGU7CiAgICBoYXNodGFiX1QJKmh0OwogICAgaGFzaHRhYl9UCSp4aHQ7CiAgICBpbnQJCWNvbmRpdDsJCS8qIENPTkRJVF9TVUYgZXQgYWwuICovCiAgICBpbnQJCWZsYWdzOwkJLyogZmxhZ3MgZm9yIHRoZSB3b3JkICovCiAgICBjaGFyX3UJKnBmeGxpc3Q7CS8qIGxpc3Qgb2YgcHJlZml4IElEcyAqLwogICAgaW50CQlwZnhsZW47CQkvKiBuciBvZiBmbGFncyBpbiAicGZ4bGlzdCIgZm9yIHByZWZpeGVzLCByZXN0CgkJCQkgKiBpcyBjb21wb3VuZCBmbGFncyAqLwp7CiAgICBpbnQJCXRvZG87CiAgICBoYXNoaXRlbV9UCSpoaTsKICAgIGFmZmhlYWRlcl9UCSphaDsKICAgIGFmZmVudHJ5X1QJKmFlOwogICAgcmVnbWF0Y2hfVAlyZWdtYXRjaDsKICAgIGNoYXJfdQluZXd3b3JkW01BWFdMRU5dOwogICAgaW50CQlyZXR2YWwgPSBPSzsKICAgIGludAkJaSwgajsKICAgIGNoYXJfdQkqcDsKICAgIGludAkJdXNlX2ZsYWdzOwogICAgY2hhcl91CSp1c2VfcGZ4bGlzdDsKICAgIGludAkJdXNlX3BmeGxlbjsKICAgIGludAkJbmVlZF9hZmZpeDsKICAgIGNoYXJfdQlzdG9yZV9hZmZsaXN0W01BWFdMRU5dOwogICAgY2hhcl91CXBmeF9wZnhsaXN0W01BWFdMRU5dOwogICAgc2l6ZV90CXdvcmRsZW4gPSBTVFJMRU4od29yZCk7CiAgICBpbnQJCXVzZV9jb25kaXQ7CgogICAgdG9kbyA9IGh0LT5odF91c2VkOwogICAgZm9yIChoaSA9IGh0LT5odF9hcnJheTsgdG9kbyA+IDAgJiYgcmV0dmFsID09IE9LOyArK2hpKQogICAgewoJaWYgKCFIQVNISVRFTV9FTVBUWShoaSkpCgl7CgkgICAgLS10b2RvOwoJICAgIGFoID0gSEkyQUgoaGkpOwoKCSAgICAvKiBDaGVjayB0aGF0IHRoZSBhZmZpeCBjb21iaW5lcywgaWYgcmVxdWlyZWQsIGFuZCB0aGF0IHRoZSB3b3JkCgkgICAgICogc3VwcG9ydHMgdGhpcyBhZmZpeC4gKi8KCSAgICBpZiAoKChjb25kaXQgJiBDT05ESVRfQ09NQikgPT0gMCB8fCBhaC0+YWhfY29tYmluZSkKCQkgICAgJiYgZmxhZ19pbl9hZmZsaXN0KGFmZmlsZS0+YWZfZmxhZ3R5cGUsIGFmZmxpc3QsCgkJCQkJCQkJIGFoLT5haF9mbGFnKSkKCSAgICB7CgkJLyogTG9vcCBvdmVyIGFsbCBhZmZpeCBlbnRyaWVzIHdpdGggdGhpcyBuYW1lLiAqLwoJCWZvciAoYWUgPSBhaC0+YWhfZmlyc3Q7IGFlICE9IE5VTEw7IGFlID0gYWUtPmFlX25leHQpCgkJewoJCSAgICAvKiBDaGVjayB0aGUgY29uZGl0aW9uLiAgSXQncyBub3QgbG9naWNhbCB0byBtYXRjaCBjYXNlCgkJICAgICAqIGhlcmUsIGJ1dCBpdCBpcyByZXF1aXJlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCgkJICAgICAqIE15c3BlbGwuCgkJICAgICAqIEFub3RoZXIgcmVxdWlyZW1lbnQgZnJvbSBNeXNwZWxsIGlzIHRoYXQgdGhlIGNob3AKCQkgICAgICogc3RyaW5nIGlzIHNob3J0ZXIgdGhhbiB0aGUgd29yZCBpdHNlbGYuCgkJICAgICAqIEZvciBwcmVmaXhlcywgd2hlbiAiUEZYUE9TVFBPTkUiIHdhcyB1c2VkLCBvbmx5IGRvCgkJICAgICAqIHByZWZpeGVzIHdpdGggYSBjaG9wIHN0cmluZyBhbmQvb3IgZmxhZ3MuCgkJICAgICAqIFdoZW4gYSBwcmV2aW91c2x5IGFkZGVkIGFmZml4IGhhZCBDSVJDVU1GSVggdGhpcyBvbmUKCQkgICAgICogbXVzdCBoYXZlIGl0IHRvbywgaWYgaXQgaGFkIG5vdCB0aGVuIHRoaXMgb25lIG11c3Qgbm90CgkJICAgICAqIGhhdmUgb25lIGVpdGhlci4gKi8KCQkgICAgcmVnbWF0Y2gucmVncHJvZyA9IGFlLT5hZV9wcm9nOwoJCSAgICByZWdtYXRjaC5ybV9pYyA9IEZBTFNFOwoJCSAgICBpZiAoKHhodCAhPSBOVUxMIHx8ICFhZmZpbGUtPmFmX3BmeHBvc3Rwb25lCgkJCQl8fCBhZS0+YWVfY2hvcCAhPSBOVUxMCgkJCQl8fCBhZS0+YWVfZmxhZ3MgIT0gTlVMTCkKCQkJICAgICYmIChhZS0+YWVfY2hvcCA9PSBOVUxMCgkJCQl8fCBTVFJMRU4oYWUtPmFlX2Nob3ApIDwgd29yZGxlbikKCQkJICAgICYmIChhZS0+YWVfcHJvZyA9PSBOVUxMCgkJCQl8fCB2aW1fcmVnZXhlYygmcmVnbWF0Y2gsIHdvcmQsIChjb2xucl9UKTApKQoJCQkgICAgJiYgKCgoY29uZGl0ICYgQ09ORElUX0NGSVgpID09IDApCgkJCQk9PSAoKGNvbmRpdCAmIENPTkRJVF9BRkYpID09IDAKCQkJCSAgICB8fCBhZS0+YWVfZmxhZ3MgPT0gTlVMTAoJCQkJICAgIHx8ICFmbGFnX2luX2FmZmxpc3QoYWZmaWxlLT5hZl9mbGFndHlwZSwKCQkJCQlhZS0+YWVfZmxhZ3MsIGFmZmlsZS0+YWZfY2lyY3VtZml4KSkpKQoJCSAgICB7CgkJCS8qIE1hdGNoLiAgUmVtb3ZlIHRoZSBjaG9wIGFuZCBhZGQgdGhlIGFmZml4LiAqLwoJCQlpZiAoeGh0ID09IE5VTEwpCgkJCXsKCQkJICAgIC8qIHByZWZpeDogY2hvcC9hZGQgYXQgdGhlIHN0YXJ0IG9mIHRoZSB3b3JkICovCgkJCSAgICBpZiAoYWUtPmFlX2FkZCA9PSBOVUxMKQoJCQkJKm5ld3dvcmQgPSBOVUw7CgkJCSAgICBlbHNlCgkJCQlTVFJDUFkobmV3d29yZCwgYWUtPmFlX2FkZCk7CgkJCSAgICBwID0gd29yZDsKCQkJICAgIGlmIChhZS0+YWVfY2hvcCAhPSBOVUxMKQoJCQkgICAgewoJCQkJLyogU2tpcCBjaG9wIHN0cmluZy4gKi8KI2lmZGVmIEZFQVRfTUJZVEUKCQkJCWlmIChoYXNfbWJ5dGUpCgkJCQl7CgkJCQkgICAgaSA9IG1iX2NoYXJsZW4oYWUtPmFlX2Nob3ApOwoJCQkJICAgIGZvciAoIDsgaSA+IDA7IC0taSkKCQkJCQltYl9wdHJfYWR2KHApOwoJCQkJfQoJCQkJZWxzZQojZW5kaWYKCQkJCSAgICBwICs9IFNUUkxFTihhZS0+YWVfY2hvcCk7CgkJCSAgICB9CgkJCSAgICBTVFJDQVQobmV3d29yZCwgcCk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCSAgICAvKiBzdWZmaXg6IGNob3AvYWRkIGF0IHRoZSBlbmQgb2YgdGhlIHdvcmQgKi8KCQkJICAgIFNUUkNQWShuZXd3b3JkLCB3b3JkKTsKCQkJICAgIGlmIChhZS0+YWVfY2hvcCAhPSBOVUxMKQoJCQkgICAgewoJCQkJLyogUmVtb3ZlIGNob3Agc3RyaW5nLiAqLwoJCQkJcCA9IG5ld3dvcmQgKyBTVFJMRU4obmV3d29yZCk7CgkJCQlpID0gTUJfQ0hBUkxFTihhZS0+YWVfY2hvcCk7CgkJCQlmb3IgKCA7IGkgPiAwOyAtLWkpCgkJCQkgICAgbWJfcHRyX2JhY2sobmV3d29yZCwgcCk7CgkJCQkqcCA9IE5VTDsKCQkJICAgIH0KCQkJICAgIGlmIChhZS0+YWVfYWRkICE9IE5VTEwpCgkJCQlTVFJDQVQobmV3d29yZCwgYWUtPmFlX2FkZCk7CgkJCX0KCgkJCXVzZV9mbGFncyA9IGZsYWdzOwoJCQl1c2VfcGZ4bGlzdCA9IHBmeGxpc3Q7CgkJCXVzZV9wZnhsZW4gPSBwZnhsZW47CgkJCW5lZWRfYWZmaXggPSBGQUxTRTsKCQkJdXNlX2NvbmRpdCA9IGNvbmRpdCB8IENPTkRJVF9DT01CIHwgQ09ORElUX0FGRjsKCQkJaWYgKGFlLT5hZV9mbGFncyAhPSBOVUxMKQoJCQl7CgkJCSAgICAvKiBFeHRyYWN0IGZsYWdzIGZyb20gdGhlIGFmZml4IGxpc3QuICovCgkJCSAgICB1c2VfZmxhZ3MgfD0gZ2V0X2FmZml4X2ZsYWdzKGFmZmlsZSwgYWUtPmFlX2ZsYWdzKTsKCgkJCSAgICBpZiAoYWZmaWxlLT5hZl9uZWVkYWZmaXggIT0gMCAmJiBmbGFnX2luX2FmZmxpc3QoCgkJCQkJYWZmaWxlLT5hZl9mbGFndHlwZSwgYWUtPmFlX2ZsYWdzLAoJCQkJCQkJYWZmaWxlLT5hZl9uZWVkYWZmaXgpKQoJCQkJbmVlZF9hZmZpeCA9IFRSVUU7CgoJCQkgICAgLyogV2hlbiB0aGVyZSBpcyBhIENJUkNVTUZJWCBmbGFnIHRoZSBvdGhlciBhZmZpeAoJCQkgICAgICogbXVzdCBhbHNvIGhhdmUgaXQgYW5kIHdlIGRvbid0IGFkZCB0aGUgd29yZAoJCQkgICAgICogd2l0aCBvbmUgYWZmaXguICovCgkJCSAgICBpZiAoYWZmaWxlLT5hZl9jaXJjdW1maXggIT0gMCAmJiBmbGFnX2luX2FmZmxpc3QoCgkJCQkJYWZmaWxlLT5hZl9mbGFndHlwZSwgYWUtPmFlX2ZsYWdzLAoJCQkJCQkJYWZmaWxlLT5hZl9jaXJjdW1maXgpKQoJCQkgICAgewoJCQkJdXNlX2NvbmRpdCB8PSBDT05ESVRfQ0ZJWDsKCQkJCWlmICgoY29uZGl0ICYgQ09ORElUX0NGSVgpID09IDApCgkJCQkgICAgbmVlZF9hZmZpeCA9IFRSVUU7CgkJCSAgICB9CgoJCQkgICAgaWYgKGFmZmlsZS0+YWZfcGZ4cG9zdHBvbmUKCQkJCQkJfHwgc3Bpbi0+c2lfY29tcGZsYWdzICE9IE5VTEwpCgkJCSAgICB7CgkJCQlpZiAoYWZmaWxlLT5hZl9wZnhwb3N0cG9uZSkKCQkJCSAgICAvKiBHZXQgcHJlZml4IElEUyBmcm9tIHRoZSBhZmZpeCBsaXN0LiAqLwoJCQkJICAgIHVzZV9wZnhsZW4gPSBnZXRfcGZ4bGlzdChhZmZpbGUsCgkJCQkJCSBhZS0+YWVfZmxhZ3MsIHN0b3JlX2FmZmxpc3QpOwoJCQkJZWxzZQoJCQkJICAgIHVzZV9wZnhsZW4gPSAwOwoJCQkJdXNlX3BmeGxpc3QgPSBzdG9yZV9hZmZsaXN0OwoKCQkJCS8qIENvbWJpbmUgdGhlIHByZWZpeCBJRHMuIEF2b2lkIGFkZGluZyB0aGUKCQkJCSAqIHNhbWUgSUQgdHdpY2UuICovCgkJCQlmb3IgKGkgPSAwOyBpIDwgcGZ4bGVuOyArK2kpCgkJCQl7CgkJCQkgICAgZm9yIChqID0gMDsgaiA8IHVzZV9wZnhsZW47ICsraikKCQkJCQlpZiAocGZ4bGlzdFtpXSA9PSB1c2VfcGZ4bGlzdFtqXSkKCQkJCQkgICAgYnJlYWs7CgkJCQkgICAgaWYgKGogPT0gdXNlX3BmeGxlbikKCQkJCQl1c2VfcGZ4bGlzdFt1c2VfcGZ4bGVuKytdID0gcGZ4bGlzdFtpXTsKCQkJCX0KCgkJCQlpZiAoc3Bpbi0+c2lfY29tcGZsYWdzICE9IE5VTEwpCgkJCQkgICAgLyogR2V0IGNvbXBvdW5kIElEUyBmcm9tIHRoZSBhZmZpeCBsaXN0LiAqLwoJCQkJICAgIGdldF9jb21wZmxhZ3MoYWZmaWxlLCBhZS0+YWVfZmxhZ3MsCgkJCQkJCSAgdXNlX3BmeGxpc3QgKyB1c2VfcGZ4bGVuKTsKCgkJCQkvKiBDb21iaW5lIHRoZSBsaXN0IG9mIGNvbXBvdW5kIGZsYWdzLgoJCQkJICogQ29uY2F0ZW5hdGUgdGhlbSB0byB0aGUgcHJlZml4IElEcyBsaXN0LgoJCQkJICogQXZvaWQgYWRkaW5nIHRoZSBzYW1lIElEIHR3aWNlLiAqLwoJCQkJZm9yIChpID0gcGZ4bGVuOyBwZnhsaXN0W2ldICE9IE5VTDsgKytpKQoJCQkJewoJCQkJICAgIGZvciAoaiA9IHVzZV9wZnhsZW47CgkJCQkJCSAgIHVzZV9wZnhsaXN0W2pdICE9IE5VTDsgKytqKQoJCQkJCWlmIChwZnhsaXN0W2ldID09IHVzZV9wZnhsaXN0W2pdKQoJCQkJCSAgICBicmVhazsKCQkJCSAgICBpZiAodXNlX3BmeGxpc3Rbal0gPT0gTlVMKQoJCQkJICAgIHsKCQkJCQl1c2VfcGZ4bGlzdFtqKytdID0gcGZ4bGlzdFtpXTsKCQkJCQl1c2VfcGZ4bGlzdFtqXSA9IE5VTDsKCQkJCSAgICB9CgkJCQl9CgkJCSAgICB9CgkJCX0KCgkJCS8qIE9iZXkgYSAiQ09NUE9VTkRGT1JCSURGTEFHIiBvZiB0aGUgYWZmaXg6IGRvbid0CgkJCSAqIHVzZSB0aGUgY29tcG91bmQgZmxhZ3MuICovCgkJCWlmICh1c2VfcGZ4bGlzdCAhPSBOVUxMICYmIGFlLT5hZV9jb21wZm9yYmlkKQoJCQl7CgkJCSAgICB2aW1fc3RybmNweShwZnhfcGZ4bGlzdCwgdXNlX3BmeGxpc3QsIHVzZV9wZnhsZW4pOwoJCQkgICAgdXNlX3BmeGxpc3QgPSBwZnhfcGZ4bGlzdDsKCQkJfQoKCQkJLyogV2hlbiB0aGVyZSBhcmUgcG9zdHBvbmVkIHByZWZpeGVzLi4uICovCgkJCWlmIChzcGluLT5zaV9wcmVmcm9vdCAhPSBOVUxMCgkJCQkmJiBzcGluLT5zaV9wcmVmcm9vdC0+d25fc2libGluZyAhPSBOVUxMKQoJCQl7CgkJCSAgICAvKiAuLi4gYWRkIGEgZmxhZyB0byBpbmRpY2F0ZSBhbiBhZmZpeCB3YXMgdXNlZC4gKi8KCQkJICAgIHVzZV9mbGFncyB8PSBXRl9IQVNfQUZGOwoKCQkJICAgIC8qIC4uLiBkb24ndCB1c2UgYSBwcmVmaXggbGlzdCBpZiBjb21iaW5pbmcKCQkJICAgICAqIGFmZml4ZXMgaXMgbm90IGFsbG93ZWQuICBCdXQgZG8gdXNlIHRoZQoJCQkgICAgICogY29tcG91bmQgZmxhZ3MgYWZ0ZXIgdGhlbS4gKi8KCQkJICAgIGlmICgoIWFoLT5haF9jb21iaW5lIHx8IChjb25kaXQgJiBDT05ESVRfQ09NQikpCgkJCQkJCSAgICAgICAmJiB1c2VfcGZ4bGlzdCAhPSBOVUxMKQoJCQkJdXNlX3BmeGxpc3QgKz0gdXNlX3BmeGxlbjsKCQkJfQoKCQkJLyogV2hlbiBjb21wb3VuZGluZyBpcyBzdXBwb3J0ZWQgYW5kIHRoZXJlIGlzIG5vCgkJCSAqICJDT01QT1VORFBFUk1JVEZMQUciIHRoZW4gZm9yYmlkIGNvbXBvdW5kaW5nIG9uIHRoZQoJCQkgKiBzaWRlIHdoZXJlIHRoZSBhZmZpeCBpcyBhcHBsaWVkLiAqLwoJCQlpZiAoc3Bpbi0+c2lfY29tcGZsYWdzICE9IE5VTEwgJiYgIWFlLT5hZV9jb21wcGVybWl0KQoJCQl7CgkJCSAgICBpZiAoeGh0ICE9IE5VTEwpCgkJCQl1c2VfZmxhZ3MgfD0gV0ZfTk9DT01QQUZUOwoJCQkgICAgZWxzZQoJCQkJdXNlX2ZsYWdzIHw9IFdGX05PQ09NUEJFRjsKCQkJfQoKCQkJLyogU3RvcmUgdGhlIG1vZGlmaWVkIHdvcmQuICovCgkJCWlmIChzdG9yZV93b3JkKHNwaW4sIG5ld3dvcmQsIHVzZV9mbGFncywKCQkJCQkJIHNwaW4tPnNpX3JlZ2lvbiwgdXNlX3BmeGxpc3QsCgkJCQkJCQkgIG5lZWRfYWZmaXgpID09IEZBSUwpCgkJCSAgICByZXR2YWwgPSBGQUlMOwoKCQkJLyogV2hlbiBhZGRlZCBhIHByZWZpeCBvciBhIGZpcnN0IHN1ZmZpeCBhbmQgdGhlIGFmZml4CgkJCSAqIGhhcyBmbGFncyBtYXkgYWRkIGEobm90aGVyKSBzdWZmaXguICBSRUNVUlNJVkUhICovCgkJCWlmICgoY29uZGl0ICYgQ09ORElUX1NVRikgJiYgYWUtPmFlX2ZsYWdzICE9IE5VTEwpCgkJCSAgICBpZiAoc3RvcmVfYWZmX3dvcmQoc3BpbiwgbmV3d29yZCwgYWUtPmFlX2ZsYWdzLAoJCQkJCWFmZmlsZSwgJmFmZmlsZS0+YWZfc3VmZiwgeGh0LAoJCQkJCSAgIHVzZV9jb25kaXQgJiAoeGh0ID09IE5VTEwKCQkJCQkJCT8gfjAgOiAgfkNPTkRJVF9TVUYpLAoJCQkJICAgICAgdXNlX2ZsYWdzLCB1c2VfcGZ4bGlzdCwgcGZ4bGVuKSA9PSBGQUlMKQoJCQkJcmV0dmFsID0gRkFJTDsKCgkJCS8qIFdoZW4gYWRkZWQgYSBzdWZmaXggYW5kIGNvbWJpbmluZyBpcyBhbGxvd2VkIGFsc28KCQkJICogdHJ5IGFkZGluZyBhIHByZWZpeCBhZGRpdGlvbmFsbHkuICBCb3RoIGZvciB0aGUKCQkJICogd29yZCBmbGFncyBhbmQgZm9yIHRoZSBhZmZpeCBmbGFncy4gIFJFQ1VSU0lWRSEgKi8KCQkJaWYgKHhodCAhPSBOVUxMICYmIGFoLT5haF9jb21iaW5lKQoJCQl7CgkJCSAgICBpZiAoc3RvcmVfYWZmX3dvcmQoc3BpbiwgbmV3d29yZCwKCQkJCQlhZmZsaXN0LCBhZmZpbGUsCgkJCQkJeGh0LCBOVUxMLCB1c2VfY29uZGl0LAoJCQkJCXVzZV9mbGFncywgdXNlX3BmeGxpc3QsCgkJCQkJcGZ4bGVuKSA9PSBGQUlMCgkJCQkgICAgfHwgKGFlLT5hZV9mbGFncyAhPSBOVUxMCgkJCQkJJiYgc3RvcmVfYWZmX3dvcmQoc3BpbiwgbmV3d29yZCwKCQkJCQkgICAgYWUtPmFlX2ZsYWdzLCBhZmZpbGUsCgkJCQkJICAgIHhodCwgTlVMTCwgdXNlX2NvbmRpdCwKCQkJCQkgICAgdXNlX2ZsYWdzLCB1c2VfcGZ4bGlzdCwKCQkJCQkgICAgcGZ4bGVuKSA9PSBGQUlMKSkKCQkJCXJldHZhbCA9IEZBSUw7CgkJCX0KCQkgICAgfQoJCX0KCSAgICB9Cgl9CiAgICB9CgogICAgcmV0dXJuIHJldHZhbDsKfQoKLyoKICogUmVhZCBhIGZpbGUgd2l0aCBhIGxpc3Qgb2Ygd29yZHMuCiAqLwogICAgc3RhdGljIGludApzcGVsbF9yZWFkX3dvcmRmaWxlKHNwaW4sIGZuYW1lKQogICAgc3BlbGxpbmZvX1QJKnNwaW47CiAgICBjaGFyX3UJKmZuYW1lOwp7CiAgICBGSUxFCSpmZDsKICAgIGxvbmcJbG51bSA9IDA7CiAgICBjaGFyX3UJcmxpbmVbTUFYTElORUxFTl07CiAgICBjaGFyX3UJKmxpbmU7CiAgICBjaGFyX3UJKnBjID0gTlVMTDsKICAgIGNoYXJfdQkqcDsKICAgIGludAkJbDsKICAgIGludAkJcmV0dmFsID0gT0s7CiAgICBpbnQJCWRpZF93b3JkID0gRkFMU0U7CiAgICBpbnQJCW5vbl9hc2NpaSA9IDA7CiAgICBpbnQJCWZsYWdzOwogICAgaW50CQlyZWdpb25tYXNrOwoKICAgIC8qCiAgICAgKiBPcGVuIHRoZSBmaWxlLgogICAgICovCiAgICBmZCA9IG1jaF9mb3BlbigoY2hhciAqKWZuYW1lLCAiciIpOwogICAgaWYgKGZkID09IE5VTEwpCiAgICB7CglFTVNHMihfKGVfbm90b3BlbiksIGZuYW1lKTsKCXJldHVybiBGQUlMOwogICAgfQoKICAgIHZpbV9zbnByaW50ZigoY2hhciAqKUlPYnVmZiwgSU9TSVpFLCBfKCJSZWFkaW5nIHdvcmQgZmlsZSAlcyAuLi4iKSwgZm5hbWUpOwogICAgc3BlbGxfbWVzc2FnZShzcGluLCBJT2J1ZmYpOwoKICAgIC8qCiAgICAgKiBSZWFkIGFsbCB0aGUgbGluZXMgaW4gdGhlIGZpbGUgb25lIGJ5IG9uZS4KICAgICAqLwogICAgd2hpbGUgKCF2aW1fZmdldHMocmxpbmUsIE1BWExJTkVMRU4sIGZkKSAmJiAhZ290X2ludCkKICAgIHsKCWxpbmVfYnJlYWtjaGVjaygpOwoJKytsbnVtOwoKCS8qIFNraXAgY29tbWVudCBsaW5lcy4gKi8KCWlmICgqcmxpbmUgPT0gJyMnKQoJICAgIGNvbnRpbnVlOwoKCS8qIFJlbW92ZSBDUiwgTEYgYW5kIHdoaXRlIHNwYWNlIGZyb20gdGhlIGVuZC4gKi8KCWwgPSBTVFJMRU4ocmxpbmUpOwoJd2hpbGUgKGwgPiAwICYmIHJsaW5lW2wgLSAxXSA8PSAnICcpCgkgICAgLS1sOwoJaWYgKGwgPT0gMCkKCSAgICBjb250aW51ZTsJLyogZW1wdHkgb3IgYmxhbmsgbGluZSAqLwoJcmxpbmVbbF0gPSBOVUw7CgoJLyogQ29udmVydCBmcm9tICI9ZW5jb2Rpbmc9e2VuY29kaW5nfSIgdG8gJ2VuY29kaW5nJyB3aGVuIG5lZWRlZC4gKi8KCXZpbV9mcmVlKHBjKTsKI2lmZGVmIEZFQVRfTUJZVEUKCWlmIChzcGluLT5zaV9jb252LnZjX3R5cGUgIT0gQ09OVl9OT05FKQoJewoJICAgIHBjID0gc3RyaW5nX2NvbnZlcnQoJnNwaW4tPnNpX2NvbnYsIHJsaW5lLCBOVUxMKTsKCSAgICBpZiAocGMgPT0gTlVMTCkKCSAgICB7CgkJc21zZygoY2hhcl91ICopXygiQ29udmVyc2lvbiBmYWlsdXJlIGZvciB3b3JkIGluICVzIGxpbmUgJWQ6ICVzIiksCgkJCQkJCQkgICBmbmFtZSwgbG51bSwgcmxpbmUpOwoJCWNvbnRpbnVlOwoJICAgIH0KCSAgICBsaW5lID0gcGM7Cgl9CgllbHNlCiNlbmRpZgoJewoJICAgIHBjID0gTlVMTDsKCSAgICBsaW5lID0gcmxpbmU7Cgl9CgoJaWYgKCpsaW5lID09ICcvJykKCXsKCSAgICArK2xpbmU7CgkgICAgaWYgKFNUUk5DTVAobGluZSwgImVuY29kaW5nPSIsIDkpID09IDApCgkgICAgewoJCWlmIChzcGluLT5zaV9jb252LnZjX3R5cGUgIT0gQ09OVl9OT05FKQoJCSAgICBzbXNnKChjaGFyX3UgKilfKCJEdXBsaWNhdGUgL2VuY29kaW5nPSBsaW5lIGlnbm9yZWQgaW4gJXMgbGluZSAlZDogJXMiKSwKCQkJCQkJICAgICAgIGZuYW1lLCBsbnVtLCBsaW5lIC0gMSk7CgkJZWxzZSBpZiAoZGlkX3dvcmQpCgkJICAgIHNtc2coKGNoYXJfdSAqKV8oIi9lbmNvZGluZz0gbGluZSBhZnRlciB3b3JkIGlnbm9yZWQgaW4gJXMgbGluZSAlZDogJXMiKSwKCQkJCQkJICAgICAgIGZuYW1lLCBsbnVtLCBsaW5lIC0gMSk7CgkJZWxzZQoJCXsKI2lmZGVmIEZFQVRfTUJZVEUKCQkgICAgY2hhcl91CSplbmM7CgoJCSAgICAvKiBTZXR1cCBmb3IgY29udmVyc2lvbiB0byAnZW5jb2RpbmcnLiAqLwoJCSAgICBsaW5lICs9IDEwOwoJCSAgICBlbmMgPSBlbmNfY2Fub25pemUobGluZSk7CgkJICAgIGlmIChlbmMgIT0gTlVMTCAmJiAhc3Bpbi0+c2lfYXNjaWkKCQkJICAgICYmIGNvbnZlcnRfc2V0dXAoJnNwaW4tPnNpX2NvbnYsIGVuYywKCQkJCQkJCSAgICAgICBwX2VuYykgPT0gRkFJTCkKCQkJc21zZygoY2hhcl91ICopXygiQ29udmVyc2lvbiBpbiAlcyBub3Qgc3VwcG9ydGVkOiBmcm9tICVzIHRvICVzIiksCgkJCQkJCQkgIGZuYW1lLCBsaW5lLCBwX2VuYyk7CgkJICAgIHZpbV9mcmVlKGVuYyk7CgkJICAgIHNwaW4tPnNpX2NvbnYudmNfZmFpbCA9IFRSVUU7CiNlbHNlCgkJICAgIHNtc2coKGNoYXJfdSAqKV8oIkNvbnZlcnNpb24gaW4gJXMgbm90IHN1cHBvcnRlZCIpLCBmbmFtZSk7CiNlbmRpZgoJCX0KCQljb250aW51ZTsKCSAgICB9CgoJICAgIGlmIChTVFJOQ01QKGxpbmUsICJyZWdpb25zPSIsIDgpID09IDApCgkgICAgewoJCWlmIChzcGluLT5zaV9yZWdpb25fY291bnQgPiAxKQoJCSAgICBzbXNnKChjaGFyX3UgKilfKCJEdXBsaWNhdGUgL3JlZ2lvbnM9IGxpbmUgaWdub3JlZCBpbiAlcyBsaW5lICVkOiAlcyIpLAoJCQkJCQkgICAgICAgZm5hbWUsIGxudW0sIGxpbmUpOwoJCWVsc2UKCQl7CgkJICAgIGxpbmUgKz0gODsKCQkgICAgaWYgKFNUUkxFTihsaW5lKSA+IDE2KQoJCQlzbXNnKChjaGFyX3UgKilfKCJUb28gbWFueSByZWdpb25zIGluICVzIGxpbmUgJWQ6ICVzIiksCgkJCQkJCSAgICAgICBmbmFtZSwgbG51bSwgbGluZSk7CgkJICAgIGVsc2UKCQkgICAgewoJCQlzcGluLT5zaV9yZWdpb25fY291bnQgPSBTVFJMRU4obGluZSkgLyAyOwoJCQlTVFJDUFkoc3Bpbi0+c2lfcmVnaW9uX25hbWUsIGxpbmUpOwoKCQkJLyogQWRqdXN0IHRoZSBtYXNrIGZvciBhIHdvcmQgdmFsaWQgaW4gYWxsIHJlZ2lvbnMuICovCgkJCXNwaW4tPnNpX3JlZ2lvbiA9ICgxIDw8IHNwaW4tPnNpX3JlZ2lvbl9jb3VudCkgLSAxOwoJCSAgICB9CgkJfQoJCWNvbnRpbnVlOwoJICAgIH0KCgkgICAgc21zZygoY2hhcl91ICopXygiLyBsaW5lIGlnbm9yZWQgaW4gJXMgbGluZSAlZDogJXMiKSwKCQkJCQkJICAgICAgIGZuYW1lLCBsbnVtLCBsaW5lIC0gMSk7CgkgICAgY29udGludWU7Cgl9CgoJZmxhZ3MgPSAwOwoJcmVnaW9ubWFzayA9IHNwaW4tPnNpX3JlZ2lvbjsKCgkvKiBDaGVjayBmb3IgZmxhZ3MgYW5kIHJlZ2lvbiBhZnRlciBhIHNsYXNoLiAqLwoJcCA9IHZpbV9zdHJjaHIobGluZSwgJy8nKTsKCWlmIChwICE9IE5VTEwpCgl7CgkgICAgKnArKyA9IE5VTDsKCSAgICB3aGlsZSAoKnAgIT0gTlVMKQoJICAgIHsKCQlpZiAoKnAgPT0gJz0nKQkJLyoga2VlcC1jYXNlIHdvcmQgKi8KCQkgICAgZmxhZ3MgfD0gV0ZfS0VFUENBUCB8IFdGX0ZJWENBUDsKCQllbHNlIGlmICgqcCA9PSAnIScpCS8qIEJhZCwgYmFkLCB3aWNrZWQgd29yZC4gKi8KCQkgICAgZmxhZ3MgfD0gV0ZfQkFOTkVEOwoJCWVsc2UgaWYgKCpwID09ICc/JykJLyogUmFyZSB3b3JkLiAqLwoJCSAgICBmbGFncyB8PSBXRl9SQVJFOwoJCWVsc2UgaWYgKFZJTV9JU0RJR0lUKCpwKSkgLyogcmVnaW9uIG51bWJlcihzKSAqLwoJCXsKCQkgICAgaWYgKChmbGFncyAmIFdGX1JFR0lPTikgPT0gMCkgICAvKiBmaXJzdCBvbmUgKi8KCQkJcmVnaW9ubWFzayA9IDA7CgkJICAgIGZsYWdzIHw9IFdGX1JFR0lPTjsKCgkJICAgIGwgPSAqcCAtICcwJzsKCQkgICAgaWYgKGwgPiBzcGluLT5zaV9yZWdpb25fY291bnQpCgkJICAgIHsKCQkJc21zZygoY2hhcl91ICopXygiSW52YWxpZCByZWdpb24gbnIgaW4gJXMgbGluZSAlZDogJXMiKSwKCQkJCQkJCSAgZm5hbWUsIGxudW0sIHApOwoJCQlicmVhazsKCQkgICAgfQoJCSAgICByZWdpb25tYXNrIHw9IDEgPDwgKGwgLSAxKTsKCQl9CgkJZWxzZQoJCXsKCQkgICAgc21zZygoY2hhcl91ICopXygiVW5yZWNvZ25pemVkIGZsYWdzIGluICVzIGxpbmUgJWQ6ICVzIiksCgkJCQkJCQkgICAgICBmbmFtZSwgbG51bSwgcCk7CgkJICAgIGJyZWFrOwoJCX0KCQkrK3A7CgkgICAgfQoJfQoKCS8qIFNraXAgbm9uLUFTQ0lJIHdvcmRzIHdoZW4gInNwaW4tPnNpX2FzY2lpIiBpcyBUUlVFLiAqLwoJaWYgKHNwaW4tPnNpX2FzY2lpICYmIGhhc19ub25fYXNjaWkobGluZSkpCgl7CgkgICAgKytub25fYXNjaWk7CgkgICAgY29udGludWU7Cgl9CgoJLyogTm9ybWFsIHdvcmQ6IHN0b3JlIGl0LiAqLwoJaWYgKHN0b3JlX3dvcmQoc3BpbiwgbGluZSwgZmxhZ3MsIHJlZ2lvbm1hc2ssIE5VTEwsIEZBTFNFKSA9PSBGQUlMKQoJewoJICAgIHJldHZhbCA9IEZBSUw7CgkgICAgYnJlYWs7Cgl9CglkaWRfd29yZCA9IFRSVUU7CiAgICB9CgogICAgdmltX2ZyZWUocGMpOwogICAgZmNsb3NlKGZkKTsKCiAgICBpZiAoc3Bpbi0+c2lfYXNjaWkgJiYgbm9uX2FzY2lpID4gMCkKICAgIHsKCXZpbV9zbnByaW50ZigoY2hhciAqKUlPYnVmZiwgSU9TSVpFLAoJCSAgXygiSWdub3JlZCAlZCB3b3JkcyB3aXRoIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIiksIG5vbl9hc2NpaSk7CglzcGVsbF9tZXNzYWdlKHNwaW4sIElPYnVmZik7CiAgICB9CgogICAgcmV0dXJuIHJldHZhbDsKfQoKLyoKICogR2V0IHBhcnQgb2YgYW4gc2Jsb2NrX1QsICJsZW4iIGJ5dGVzIGxvbmcuCiAqIFRoaXMgYXZvaWRzIGNhbGxpbmcgZnJlZSgpIGZvciBldmVyeSBsaXR0bGUgc3RydWN0IHdlIHVzZSAoYW5kIGtlZXBpbmcKICogdHJhY2sgb2YgdGhlbSkuCiAqIFRoZSBtZW1vcnkgaXMgY2xlYXJlZCB0byBhbGwgemVyb3MuCiAqIFJldHVybnMgTlVMTCB3aGVuIG91dCBvZiBtZW1vcnkuCiAqLwogICAgc3RhdGljIHZvaWQgKgpnZXRyb29tKHNwaW4sIGxlbiwgYWxpZ24pCiAgICBzcGVsbGluZm9fVCAqc3BpbjsKICAgIHNpemVfdAlsZW47CQkvKiBsZW5ndGggbmVlZGVkICovCiAgICBpbnQJCWFsaWduOwkJLyogYWxpZ24gZm9yIHBvaW50ZXIgKi8KewogICAgY2hhcl91CSpwOwogICAgc2Jsb2NrX1QJKmJsID0gc3Bpbi0+c2lfYmxvY2tzOwoKICAgIGlmIChhbGlnbiAmJiBibCAhPSBOVUxMKQoJLyogUm91bmQgc2l6ZSB1cCBmb3IgYWxpZ25tZW50LiAgT24gc29tZSBzeXN0ZW1zIHN0cnVjdHVyZXMgbmVlZCB0byBiZQoJICogYWxpZ25lZCB0byB0aGUgc2l6ZSBvZiBhIHBvaW50ZXIgKGUuZy4sIFNQQVJDKS4gKi8KCWJsLT5zYl91c2VkID0gKGJsLT5zYl91c2VkICsgc2l6ZW9mKGNoYXIgKikgLSAxKQoJCQkJCQkgICAgICAmIH4oc2l6ZW9mKGNoYXIgKikgLSAxKTsKCiAgICBpZiAoYmwgPT0gTlVMTCB8fCBibC0+c2JfdXNlZCArIGxlbiA+IFNCTE9DS1NJWkUpCiAgICB7CgkvKiBBbGxvY2F0ZSBhIGJsb2NrIG9mIG1lbW9yeS4gVGhpcyBpcyBub3QgZnJlZWQgdW50aWwgbXVjaCBsYXRlci4gKi8KCWJsID0gKHNibG9ja19UICopYWxsb2NfY2xlYXIoKHVuc2lnbmVkKShzaXplb2Yoc2Jsb2NrX1QpICsgU0JMT0NLU0laRSkpOwoJaWYgKGJsID09IE5VTEwpCgkgICAgcmV0dXJuIE5VTEw7CglibC0+c2JfbmV4dCA9IHNwaW4tPnNpX2Jsb2NrczsKCXNwaW4tPnNpX2Jsb2NrcyA9IGJsOwoJYmwtPnNiX3VzZWQgPSAwOwoJKytzcGluLT5zaV9ibG9ja3NfY250OwogICAgfQoKICAgIHAgPSBibC0+c2JfZGF0YSArIGJsLT5zYl91c2VkOwogICAgYmwtPnNiX3VzZWQgKz0gbGVuOwoKICAgIHJldHVybiBwOwp9CgovKgogKiBNYWtlIGEgY29weSBvZiBhIHN0cmluZyBpbnRvIG1lbW9yeSBhbGxvY2F0ZWQgd2l0aCBnZXRyb29tKCkuCiAqLwogICAgc3RhdGljIGNoYXJfdSAqCmdldHJvb21fc2F2ZShzcGluLCBzKQogICAgc3BlbGxpbmZvX1QJKnNwaW47CiAgICBjaGFyX3UJKnM7CnsKICAgIGNoYXJfdQkqc2M7CgogICAgc2MgPSAoY2hhcl91ICopZ2V0cm9vbShzcGluLCBTVFJMRU4ocykgKyAxLCBGQUxTRSk7CiAgICBpZiAoc2MgIT0gTlVMTCkKCVNUUkNQWShzYywgcyk7CiAgICByZXR1cm4gc2M7Cn0KCgovKgogKiBGcmVlIHRoZSBsaXN0IG9mIGFsbG9jYXRlZCBzYmxvY2tfVC4KICovCiAgICBzdGF0aWMgdm9pZApmcmVlX2Jsb2NrcyhibCkKICAgIHNibG9ja19UCSpibDsKewogICAgc2Jsb2NrX1QJKm5leHQ7CgogICAgd2hpbGUgKGJsICE9IE5VTEwpCiAgICB7CgluZXh0ID0gYmwtPnNiX25leHQ7Cgl2aW1fZnJlZShibCk7CglibCA9IG5leHQ7CiAgICB9Cn0KCi8qCiAqIEFsbG9jYXRlIHRoZSByb290IG9mIGEgd29yZCB0cmVlLgogKi8KICAgIHN0YXRpYyB3b3Jkbm9kZV9UICoKd29yZHRyZWVfYWxsb2Moc3BpbikKICAgIHNwZWxsaW5mb19UICpzcGluOwp7CiAgICByZXR1cm4gKHdvcmRub2RlX1QgKilnZXRyb29tKHNwaW4sIHNpemVvZih3b3Jkbm9kZV9UKSwgVFJVRSk7Cn0KCi8qCiAqIFN0b3JlIGEgd29yZCBpbiB0aGUgdHJlZShzKS4KICogQWx3YXlzIHN0b3JlIGl0IGluIHRoZSBjYXNlLWZvbGRlZCB0cmVlLiAgRm9yIGEga2VlcC1jYXNlIHdvcmQgdGhpcyBpcwogKiB1c2VmdWwgd2hlbiB0aGUgd29yZCBjYW4gYWxzbyBiZSB1c2VkIHdpdGggYWxsIGNhcHMgKG5vIFdGX0ZJWENBUCBmbGFnKSBhbmQKICogdXNlZCB0byBmaW5kIHN1Z2dlc3Rpb25zLgogKiBGb3IgYSBrZWVwLWNhc2Ugd29yZCBhbHNvIHN0b3JlIGl0IGluIHRoZSBrZWVwLWNhc2UgdHJlZS4KICogV2hlbiAicGZ4bGlzdCIgaXMgbm90IE5VTEwgc3RvcmUgdGhlIHdvcmQgZm9yIGVhY2ggcG9zdHBvbmVkIHByZWZpeCBJRCBhbmQKICogY29tcG91bmQgZmxhZy4KICovCiAgICBzdGF0aWMgaW50CnN0b3JlX3dvcmQoc3Bpbiwgd29yZCwgZmxhZ3MsIHJlZ2lvbiwgcGZ4bGlzdCwgbmVlZF9hZmZpeCkKICAgIHNwZWxsaW5mb19UCSpzcGluOwogICAgY2hhcl91CSp3b3JkOwogICAgaW50CQlmbGFnczsJCS8qIGV4dHJhIGZsYWdzLCBXRl9CQU5ORUQgKi8KICAgIGludAkJcmVnaW9uOwkJLyogc3VwcG9ydGVkIHJlZ2lvbihzKSAqLwogICAgY2hhcl91CSpwZnhsaXN0OwkvKiBsaXN0IG9mIHByZWZpeCBJRHMgb3IgTlVMTCAqLwogICAgaW50CQluZWVkX2FmZml4OwkvKiBvbmx5IHN0b3JlIHdvcmQgd2l0aCBhZmZpeCBJRCAqLwp7CiAgICBpbnQJCWxlbiA9IFNUUkxFTih3b3JkKTsKICAgIGludAkJY3QgPSBjYXB0eXBlKHdvcmQsIHdvcmQgKyBsZW4pOwogICAgY2hhcl91CWZvbGR3b3JkW01BWFdMRU5dOwogICAgaW50CQlyZXMgPSBPSzsKICAgIGNoYXJfdQkqcDsKCiAgICAodm9pZClzcGVsbF9jYXNlZm9sZCh3b3JkLCBsZW4sIGZvbGR3b3JkLCBNQVhXTEVOKTsKICAgIGZvciAocCA9IHBmeGxpc3Q7IHJlcyA9PSBPSzsgKytwKQogICAgewoJaWYgKCFuZWVkX2FmZml4IHx8IChwICE9IE5VTEwgJiYgKnAgIT0gTlVMKSkKCSAgICByZXMgPSB0cmVlX2FkZF93b3JkKHNwaW4sIGZvbGR3b3JkLCBzcGluLT5zaV9mb2xkcm9vdCwgY3QgfCBmbGFncywKCQkJCQkJICByZWdpb24sIHAgPT0gTlVMTCA/IDAgOiAqcCk7CglpZiAocCA9PSBOVUxMIHx8ICpwID09IE5VTCkKCSAgICBicmVhazsKICAgIH0KICAgICsrc3Bpbi0+c2lfZm9sZHdjb3VudDsKCiAgICBpZiAocmVzID09IE9LICYmIChjdCA9PSBXRl9LRUVQQ0FQIHx8IChmbGFncyAmIFdGX0tFRVBDQVApKSkKICAgIHsKCWZvciAocCA9IHBmeGxpc3Q7IHJlcyA9PSBPSzsgKytwKQoJewoJICAgIGlmICghbmVlZF9hZmZpeCB8fCAocCAhPSBOVUxMICYmICpwICE9IE5VTCkpCgkJcmVzID0gdHJlZV9hZGRfd29yZChzcGluLCB3b3JkLCBzcGluLT5zaV9rZWVwcm9vdCwgZmxhZ3MsCgkJCQkJCSAgcmVnaW9uLCBwID09IE5VTEwgPyAwIDogKnApOwoJICAgIGlmIChwID09IE5VTEwgfHwgKnAgPT0gTlVMKQoJCWJyZWFrOwoJfQoJKytzcGluLT5zaV9rZWVwd2NvdW50OwogICAgfQogICAgcmV0dXJuIHJlczsKfQoKLyoKICogQWRkIHdvcmQgIndvcmQiIHRvIGEgd29yZCB0cmVlIGF0ICJyb290Ii4KICogV2hlbiAiZmxhZ3MiIDwgMCB3ZSBhcmUgYWRkaW5nIHRvIHRoZSBwcmVmaXggdHJlZSB3aGVyZSAiZmxhZ3MiIGlzIHVzZWQgZm9yCiAqICJyYXJlIiBhbmQgInJlZ2lvbiIgaXMgdGhlIGNvbmRpdGlvbiBuci4KICogUmV0dXJucyBGQUlMIHdoZW4gb3V0IG9mIG1lbW9yeS4KICovCiAgICBzdGF0aWMgaW50CnRyZWVfYWRkX3dvcmQoc3Bpbiwgd29yZCwgcm9vdCwgZmxhZ3MsIHJlZ2lvbiwgYWZmaXhJRCkKICAgIHNwZWxsaW5mb19UCSpzcGluOwogICAgY2hhcl91CSp3b3JkOwogICAgd29yZG5vZGVfVAkqcm9vdDsKICAgIGludAkJZmxhZ3M7CiAgICBpbnQJCXJlZ2lvbjsKICAgIGludAkJYWZmaXhJRDsKewogICAgd29yZG5vZGVfVAkqbm9kZSA9IHJvb3Q7CiAgICB3b3Jkbm9kZV9UCSpucDsKICAgIHdvcmRub2RlX1QJKmNvcHlwLCAqKmNvcHlwcmV2OwogICAgd29yZG5vZGVfVAkqKnByZXYgPSBOVUxMOwogICAgaW50CQlpOwoKICAgIC8qIEFkZCBlYWNoIGJ5dGUgb2YgdGhlIHdvcmQgdG8gdGhlIHRyZWUsIGluY2x1ZGluZyB0aGUgTlVMIGF0IHRoZSBlbmQuICovCiAgICBmb3IgKGkgPSAwOyA7ICsraSkKICAgIHsKCS8qIFdoZW4gdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSByZWZlcmVuY2UgdG8gdGhpcyBub2RlIHdlIG5lZWQgdG8gbWFrZQoJICogYSBjb3B5LCBzbyB0aGF0IHdlIGNhbiBtb2RpZnkgaXQuICBDb3B5IHRoZSB3aG9sZSBsaXN0IG9mIHNpYmxpbmdzCgkgKiAod2UgZG9uJ3Qgb3B0aW1pemUgZm9yIGEgcGFydGx5IHNoYXJlZCBsaXN0IG9mIHNpYmxpbmdzKS4gKi8KCWlmIChub2RlICE9IE5VTEwgJiYgbm9kZS0+d25fcmVmcyA+IDEpCgl7CgkgICAgLS1ub2RlLT53bl9yZWZzOwoJICAgIGNvcHlwcmV2ID0gcHJldjsKCSAgICBmb3IgKGNvcHlwID0gbm9kZTsgY29weXAgIT0gTlVMTDsgY29weXAgPSBjb3B5cC0+d25fc2libGluZykKCSAgICB7CgkJLyogQWxsb2NhdGUgYSBuZXcgbm9kZSBhbmQgY29weSB0aGUgaW5mby4gKi8KCQlucCA9IGdldF93b3Jkbm9kZShzcGluKTsKCQlpZiAobnAgPT0gTlVMTCkKCQkgICAgcmV0dXJuIEZBSUw7CgkJbnAtPnduX2NoaWxkID0gY29weXAtPnduX2NoaWxkOwoJCWlmIChucC0+d25fY2hpbGQgIT0gTlVMTCkKCQkgICAgKytucC0+d25fY2hpbGQtPnduX3JlZnM7CS8qIGNoaWxkIGdldHMgZXh0cmEgcmVmICovCgkJbnAtPnduX2J5dGUgPSBjb3B5cC0+d25fYnl0ZTsKCQlpZiAobnAtPnduX2J5dGUgPT0gTlVMKQoJCXsKCQkgICAgbnAtPnduX2ZsYWdzID0gY29weXAtPnduX2ZsYWdzOwoJCSAgICBucC0+d25fcmVnaW9uID0gY29weXAtPnduX3JlZ2lvbjsKCQkgICAgbnAtPnduX2FmZml4SUQgPSBjb3B5cC0+d25fYWZmaXhJRDsKCQl9CgoJCS8qIExpbmsgdGhlIG5ldyBub2RlIGluIHRoZSBsaXN0LCB0aGVyZSB3aWxsIGJlIG9uZSByZWYuICovCgkJbnAtPnduX3JlZnMgPSAxOwoJCSpjb3B5cHJldiA9IG5wOwoJCWNvcHlwcmV2ID0gJm5wLT53bl9zaWJsaW5nOwoKCQkvKiBMZXQgIm5vZGUiIHBvaW50IHRvIHRoZSBoZWFkIG9mIHRoZSBjb3BpZWQgbGlzdC4gKi8KCQlpZiAoY29weXAgPT0gbm9kZSkKCQkgICAgbm9kZSA9IG5wOwoJICAgIH0KCX0KCgkvKiBMb29rIGZvciB0aGUgc2libGluZyB0aGF0IGhhcyB0aGUgc2FtZSBjaGFyYWN0ZXIuICBUaGV5IGFyZSBzb3J0ZWQKCSAqIG9uIGJ5dGUgdmFsdWUsIHRodXMgc3RvcCBzZWFyY2hpbmcgd2hlbiBhIHNpYmxpbmcgaXMgZm91bmQgd2l0aCBhCgkgKiBoaWdoZXIgYnl0ZSB2YWx1ZS4gIEZvciB6ZXJvIGJ5dGVzIChlbmQgb2Ygd29yZCkgdGhlIHNvcnRpbmcgaXMKCSAqIGRvbmUgb24gZmxhZ3MgYW5kIHRoZW4gb24gYWZmaXhJRC4gKi8KCXdoaWxlIChub2RlICE9IE5VTEwKCQkmJiAobm9kZS0+d25fYnl0ZSA8IHdvcmRbaV0KCQkgICAgfHwgKG5vZGUtPnduX2J5dGUgPT0gTlVMCgkJCSYmIChmbGFncyA8IDAKCQkJICAgID8gbm9kZS0+d25fYWZmaXhJRCA8ICh1bnNpZ25lZClhZmZpeElECgkJCSAgICA6IChub2RlLT53bl9mbGFncyA8ICh1bnNpZ25lZCkoZmxhZ3MgJiBXTl9NQVNLKQoJCQkJfHwgKG5vZGUtPnduX2ZsYWdzID09IChmbGFncyAmIFdOX01BU0spCgkJCQkgICAgJiYgKHNwaW4tPnNpX3N1Z3RyZWUKCQkJCQk/IChub2RlLT53bl9yZWdpb24gJiAweGZmZmYpIDwgcmVnaW9uCgkJCQkJOiBub2RlLT53bl9hZmZpeElECgkJCQkJCSAgICA8ICh1bnNpZ25lZClhZmZpeElEKSkpKSkpKQoJewoJICAgIHByZXYgPSAmbm9kZS0+d25fc2libGluZzsKCSAgICBub2RlID0gKnByZXY7Cgl9CglpZiAobm9kZSA9PSBOVUxMCgkJfHwgbm9kZS0+d25fYnl0ZSAhPSB3b3JkW2ldCgkJfHwgKHdvcmRbaV0gPT0gTlVMCgkJICAgICYmIChmbGFncyA8IDAKCQkJfHwgc3Bpbi0+c2lfc3VndHJlZQoJCQl8fCBub2RlLT53bl9mbGFncyAhPSAoZmxhZ3MgJiBXTl9NQVNLKQoJCQl8fCBub2RlLT53bl9hZmZpeElEICE9IGFmZml4SUQpKSkKCXsKCSAgICAvKiBBbGxvY2F0ZSBhIG5ldyBub2RlLiAqLwoJICAgIG5wID0gZ2V0X3dvcmRub2RlKHNwaW4pOwoJICAgIGlmIChucCA9PSBOVUxMKQoJCXJldHVybiBGQUlMOwoJICAgIG5wLT53bl9ieXRlID0gd29yZFtpXTsKCgkgICAgLyogSWYgIm5vZGUiIGlzIE5VTEwgdGhpcyBpcyBhIG5ldyBjaGlsZCBvciB0aGUgZW5kIG9mIHRoZSBzaWJsaW5nCgkgICAgICogbGlzdDogcmVmIGNvdW50IGlzIG9uZS4gIE90aGVyd2lzZSB1c2UgcmVmIGNvdW50IG9mIHNpYmxpbmcgYW5kCgkgICAgICogbWFrZSByZWYgY291bnQgb2Ygc2libGluZyBvbmUgKG1hdHRlcnMgd2hlbiBpbnNlcnRpbmcgaW4gZnJvbnQKCSAgICAgKiBvZiB0aGUgbGlzdCBvZiBzaWJsaW5ncykuICovCgkgICAgaWYgKG5vZGUgPT0gTlVMTCkKCQlucC0+d25fcmVmcyA9IDE7CgkgICAgZWxzZQoJICAgIHsKCQlucC0+d25fcmVmcyA9IG5vZGUtPnduX3JlZnM7CgkJbm9kZS0+d25fcmVmcyA9IDE7CgkgICAgfQoJICAgICpwcmV2ID0gbnA7CgkgICAgbnAtPnduX3NpYmxpbmcgPSBub2RlOwoJICAgIG5vZGUgPSBucDsKCX0KCglpZiAod29yZFtpXSA9PSBOVUwpCgl7CgkgICAgbm9kZS0+d25fZmxhZ3MgPSBmbGFnczsKCSAgICBub2RlLT53bl9yZWdpb24gfD0gcmVnaW9uOwoJICAgIG5vZGUtPnduX2FmZml4SUQgPSBhZmZpeElEOwoJICAgIGJyZWFrOwoJfQoJcHJldiA9ICZub2RlLT53bl9jaGlsZDsKCW5vZGUgPSAqcHJldjsKICAgIH0KI2lmZGVmIFNQRUxMX1BSSU5UVFJFRQogICAgc21zZygiQWRkZWQgXCIlc1wiIiwgd29yZCk7CiAgICBzcGVsbF9wcmludF90cmVlKHJvb3QtPnduX3NpYmxpbmcpOwojZW5kaWYKCiAgICAvKiBjb3VudCBuciBvZiB3b3JkcyBhZGRlZCBzaW5jZSBsYXN0IG1lc3NhZ2UgKi8KICAgICsrc3Bpbi0+c2lfbXNnX2NvdW50OwoKICAgIGlmIChzcGluLT5zaV9jb21wcmVzc19jbnQgPiAxKQogICAgewoJaWYgKC0tc3Bpbi0+c2lfY29tcHJlc3NfY250ID09IDEpCgkgICAgLyogRGlkIGVub3VnaCB3b3JkcyB0byBsb3dlciB0aGUgYmxvY2sgY291bnQgbGltaXQuICovCgkgICAgc3Bpbi0+c2lfYmxvY2tzX2NudCArPSBjb21wcmVzc19pbmM7CiAgICB9CgogICAgLyoKICAgICAqIFdoZW4gd2UgaGF2ZSBhbGxvY2F0ZWQgbG90cyBvZiBtZW1vcnkgd2UgbmVlZCB0byBjb21wcmVzcyB0aGUgd29yZCB0cmVlCiAgICAgKiB0byBmcmVlIHVwIHNvbWUgcm9vbS4gIEJ1dCBjb21wcmVzc2lvbiBpcyBzbG93LCBhbmQgd2UgbWlnaHQgYWN0dWFsbHkKICAgICAqIG5lZWQgdGhhdCByb29tLCB0aHVzIG9ubHkgY29tcHJlc3MgaW4gdGhlIGZvbGxvd2luZyBzaXR1YXRpb25zOgogICAgICogMS4gV2hlbiBub3QgY29tcHJlc3NlZCBiZWZvcmUgKHNpX2NvbXByZXNzX2NudCA9PSAwKTogd2hlbiB1c2luZwogICAgICogICAgImNvbXByZXNzX3N0YXJ0IiBibG9ja3MuCiAgICAgKiAyLiBXaGVuIGNvbXByZXNzZWQgYmVmb3JlIGFuZCB1c2VkICJjb21wcmVzc19pbmMiIGJsb2NrcyBiZWZvcmUKICAgICAqICAgIGFkZGluZyAiY29tcHJlc3NfYWRkZWQiIHdvcmRzIChzaV9jb21wcmVzc19jbnQgPiAxKS4KICAgICAqIDMuIFdoZW4gY29tcHJlc3NlZCBiZWZvcmUsIGFkZGVkICJjb21wcmVzc19hZGRlZCIgd29yZHMKICAgICAqICAgIChzaV9jb21wcmVzc19jbnQgPT0gMSkgYW5kIHRoZSBudW1iZXIgb2YgZnJlZSBub2RlcyBkcm9wcyBiZWxvdyB0aGUKICAgICAqICAgIG1heGltdW0gd29yZCBsZW5ndGguCiAgICAgKi8KI2lmbmRlZiBTUEVMTF9QUklOVFRSRUUKICAgIGlmIChzcGluLT5zaV9jb21wcmVzc19jbnQgPT0gMQoJICAgID8gc3Bpbi0+c2lfZnJlZV9jb3VudCA8IE1BWFdMRU4KCSAgICA6IHNwaW4tPnNpX2Jsb2Nrc19jbnQgPj0gY29tcHJlc3Nfc3RhcnQpCiNlbmRpZgogICAgewoJLyogRGVjcmVtZW50IHRoZSBibG9jayBjb3VudGVyLiAgVGhlIGVmZmVjdCBpcyB0aGF0IHdlIGNvbXByZXNzIGFnYWluCgkgKiB3aGVuIHRoZSBmcmVlZCB1cCByb29tIGhhcyBiZWVuIHVzZWQgYW5kIGFub3RoZXIgImNvbXByZXNzX2luYyIKCSAqIGJsb2NrcyBoYXZlIGJlZW4gYWxsb2NhdGVkLiAgVW5sZXNzICJjb21wcmVzc19hZGRlZCIgd29yZHMgaGF2ZQoJICogYmVlbiBhZGRlZCwgdGhlbiB0aGUgbGltaXQgaXMgcHV0IGJhY2sgYWdhaW4uICovCglzcGluLT5zaV9ibG9ja3NfY250IC09IGNvbXByZXNzX2luYzsKCXNwaW4tPnNpX2NvbXByZXNzX2NudCA9IGNvbXByZXNzX2FkZGVkOwoKCWlmIChzcGluLT5zaV92ZXJib3NlKQoJewoJICAgIG1zZ19zdGFydCgpOwoJICAgIG1zZ19wdXRzKChjaGFyX3UgKilfKG1zZ19jb21wcmVzc2luZykpOwoJICAgIG1zZ19jbHJfZW9zKCk7CgkgICAgbXNnX2RpZG91dCA9IEZBTFNFOwoJICAgIG1zZ19jb2wgPSAwOwoJICAgIG91dF9mbHVzaCgpOwoJfQoKCS8qIENvbXByZXNzIGJvdGggdHJlZXMuICBFaXRoZXIgdGhleSBib3RoIGhhdmUgbWFueSBub2Rlcywgd2hpY2ggbWFrZXMKCSAqIGNvbXByZXNzaW9uIHVzZWZ1bCwgb3Igb25lIG9mIHRoZW0gaXMgc21hbGwsIHdoaWNoIG1lYW5zCgkgKiBjb21wcmVzc2lvbiBnb2VzIGZhc3QuICBCdXQgd2hlbiBmaWxsaW5nIHRoZSBzb3VsZGZvbGQgd29yZCB0cmVlCgkgKiB0aGVyZSBpcyBubyBrZWVwLWNhc2UgdHJlZS4gKi8KCXdvcmR0cmVlX2NvbXByZXNzKHNwaW4sIHNwaW4tPnNpX2ZvbGRyb290KTsKCWlmIChhZmZpeElEID49IDApCgkgICAgd29yZHRyZWVfY29tcHJlc3Moc3Bpbiwgc3Bpbi0+c2lfa2VlcHJvb3QpOwogICAgfQoKICAgIHJldHVybiBPSzsKfQoKLyoKICogQ2hlY2sgdGhlICdta3NwZWxsbWVtJyBvcHRpb24uICBSZXR1cm4gRkFJTCBpZiBpdCdzIHdyb25nLgogKiBTZXRzICJzcHNfZmxhZ3MiLgogKi8KICAgIGludApzcGVsbF9jaGVja19tc20oKQp7CiAgICBjaGFyX3UJKnAgPSBwX21zbTsKICAgIGxvbmcJc3RhcnQgPSAwOwogICAgbG9uZwlpbmMgPSAwOwogICAgbG9uZwlhZGRlZCA9IDA7CgogICAgaWYgKCFWSU1fSVNESUdJVCgqcCkpCglyZXR1cm4gRkFJTDsKICAgIC8qIGJsb2NrIGNvdW50ID0gKHZhbHVlICogMTAyNCkgLyBTQkxPQ0tTSVpFIChidXQgYXZvaWQgb3ZlcmZsb3cpKi8KICAgIHN0YXJ0ID0gKGdldGRpZ2l0cygmcCkgKiAxMCkgLyAoU0JMT0NLU0laRSAvIDEwMik7CiAgICBpZiAoKnAgIT0gJywnKQoJcmV0dXJuIEZBSUw7CiAgICArK3A7CiAgICBpZiAoIVZJTV9JU0RJR0lUKCpwKSkKCXJldHVybiBGQUlMOwogICAgaW5jID0gKGdldGRpZ2l0cygmcCkgKiAxMDIpIC8gKFNCTE9DS1NJWkUgLyAxMCk7CiAgICBpZiAoKnAgIT0gJywnKQoJcmV0dXJuIEZBSUw7CiAgICArK3A7CiAgICBpZiAoIVZJTV9JU0RJR0lUKCpwKSkKCXJldHVybiBGQUlMOwogICAgYWRkZWQgPSBnZXRkaWdpdHMoJnApICogMTAyNDsKICAgIGlmICgqcCAhPSBOVUwpCglyZXR1cm4gRkFJTDsKCiAgICBpZiAoc3RhcnQgPT0gMCB8fCBpbmMgPT0gMCB8fCBhZGRlZCA9PSAwIHx8IGluYyA+IHN0YXJ0KQoJcmV0dXJuIEZBSUw7CgogICAgY29tcHJlc3Nfc3RhcnQgPSBzdGFydDsKICAgIGNvbXByZXNzX2luYyA9IGluYzsKICAgIGNvbXByZXNzX2FkZGVkID0gYWRkZWQ7CiAgICByZXR1cm4gT0s7Cn0KCgovKgogKiBHZXQgYSB3b3Jkbm9kZV9ULCBlaXRoZXIgZnJvbSB0aGUgbGlzdCBvZiBwcmV2aW91c2x5IGZyZWVkIG5vZGVzIG9yCiAqIGFsbG9jYXRlIGEgbmV3IG9uZS4KICovCiAgICBzdGF0aWMgd29yZG5vZGVfVCAqCmdldF93b3Jkbm9kZShzcGluKQogICAgc3BlbGxpbmZvX1QJICAgICpzcGluOwp7CiAgICB3b3Jkbm9kZV9UICpuOwoKICAgIGlmIChzcGluLT5zaV9maXJzdF9mcmVlID09IE5VTEwpCgluID0gKHdvcmRub2RlX1QgKilnZXRyb29tKHNwaW4sIHNpemVvZih3b3Jkbm9kZV9UKSwgVFJVRSk7CiAgICBlbHNlCiAgICB7CgluID0gc3Bpbi0+c2lfZmlyc3RfZnJlZTsKCXNwaW4tPnNpX2ZpcnN0X2ZyZWUgPSBuLT53bl9jaGlsZDsKCXZpbV9tZW1zZXQobiwgMCwgc2l6ZW9mKHdvcmRub2RlX1QpKTsKCS0tc3Bpbi0+c2lfZnJlZV9jb3VudDsKICAgIH0KI2lmZGVmIFNQRUxMX1BSSU5UVFJFRQogICAgbi0+d25fbnIgPSArK3NwaW4tPnNpX3dvcmRub2RlX25yOwojZW5kaWYKICAgIHJldHVybiBuOwp9CgovKgogKiBEZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiBhIG5vZGUgKHdoaWNoIGlzIHRoZSBoZWFkIG9mIGEgbGlzdCBvZgogKiBzaWJsaW5ncykuICBJZiB0aGUgcmVmZXJlbmNlIGNvdW50IGJlY29tZXMgemVybyBmcmVlIHRoZSBub2RlIGFuZCBpdHMKICogc2libGluZ3MuCiAqIFJldHVybnMgdGhlIG51bWJlciBvZiBub2RlcyBhY3R1YWxseSBmcmVlZC4KICovCiAgICBzdGF0aWMgaW50CmRlcmVmX3dvcmRub2RlKHNwaW4sIG5vZGUpCiAgICBzcGVsbGluZm9fVCAqc3BpbjsKICAgIHdvcmRub2RlX1QgICpub2RlOwp7CiAgICB3b3Jkbm9kZV9UCSpucDsKICAgIGludAkJY250ID0gMDsKCiAgICBpZiAoLS1ub2RlLT53bl9yZWZzID09IDApCiAgICB7Cglmb3IgKG5wID0gbm9kZTsgbnAgIT0gTlVMTDsgbnAgPSBucC0+d25fc2libGluZykKCXsKCSAgICBpZiAobnAtPnduX2NoaWxkICE9IE5VTEwpCgkJY250ICs9IGRlcmVmX3dvcmRub2RlKHNwaW4sIG5wLT53bl9jaGlsZCk7CgkgICAgZnJlZV93b3Jkbm9kZShzcGluLCBucCk7CgkgICAgKytjbnQ7Cgl9CgkrK2NudDsJICAgIC8qIGxlbmd0aCBmaWVsZCAqLwogICAgfQogICAgcmV0dXJuIGNudDsKfQoKLyoKICogRnJlZSBhIHdvcmRub2RlX1QgZm9yIHJlLXVzZSBsYXRlci4KICogT25seSB0aGUgInduX2NoaWxkIiBmaWVsZCBiZWNvbWVzIGludmFsaWQuCiAqLwogICAgc3RhdGljIHZvaWQKZnJlZV93b3Jkbm9kZShzcGluLCBuKQogICAgc3BlbGxpbmZvX1QJKnNwaW47CiAgICB3b3Jkbm9kZV9UICAqbjsKewogICAgbi0+d25fY2hpbGQgPSBzcGluLT5zaV9maXJzdF9mcmVlOwogICAgc3Bpbi0+c2lfZmlyc3RfZnJlZSA9IG47CiAgICArK3NwaW4tPnNpX2ZyZWVfY291bnQ7Cn0KCi8qCiAqIENvbXByZXNzIGEgdHJlZTogZmluZCB0YWlscyB0aGF0IGFyZSBpZGVudGljYWwgYW5kIGNhbiBiZSBzaGFyZWQuCiAqLwogICAgc3RhdGljIHZvaWQKd29yZHRyZWVfY29tcHJlc3Moc3Bpbiwgcm9vdCkKICAgIHNwZWxsaW5mb19UCSAgICAqc3BpbjsKICAgIHdvcmRub2RlX1QJICAgICpyb290Owp7CiAgICBoYXNodGFiX1QJICAgIGh0OwogICAgaW50CQkgICAgbjsKICAgIGludAkJICAgIHRvdCA9IDA7CiAgICBpbnQJCSAgICBwZXJjOwoKICAgIC8qIFNraXAgdGhlIHJvb3QgaXRzZWxmLCBpdCdzIG5vdCBhY3R1YWxseSB1c2VkLiAgVGhlIGZpcnN0IHNpYmxpbmcgaXMgdGhlCiAgICAgKiBzdGFydCBvZiB0aGUgdHJlZS4gKi8KICAgIGlmIChyb290LT53bl9zaWJsaW5nICE9IE5VTEwpCiAgICB7CgloYXNoX2luaXQoJmh0KTsKCW4gPSBub2RlX2NvbXByZXNzKHNwaW4sIHJvb3QtPnduX3NpYmxpbmcsICZodCwgJnRvdCk7CgojaWZuZGVmIFNQRUxMX1BSSU5UVFJFRQoJaWYgKHNwaW4tPnNpX3ZlcmJvc2UgfHwgcF92ZXJib3NlID4gMikKI2VuZGlmCgl7CgkgICAgaWYgKHRvdCA+IDEwMDAwMDApCgkJcGVyYyA9ICh0b3QgLSBuKSAvICh0b3QgLyAxMDApOwoJICAgIGVsc2UgaWYgKHRvdCA9PSAwKQoJCXBlcmMgPSAwOwoJICAgIGVsc2UKCQlwZXJjID0gKHRvdCAtIG4pICogMTAwIC8gdG90OwoJICAgIHZpbV9zbnByaW50ZigoY2hhciAqKUlPYnVmZiwgSU9TSVpFLAoJCQkgIF8oIkNvbXByZXNzZWQgJWQgb2YgJWQgbm9kZXM7ICVkICglZCUlKSByZW1haW5pbmciKSwKCQkJCQkJICAgICAgIG4sIHRvdCwgdG90IC0gbiwgcGVyYyk7CgkgICAgc3BlbGxfbWVzc2FnZShzcGluLCBJT2J1ZmYpOwoJfQojaWZkZWYgU1BFTExfUFJJTlRUUkVFCglzcGVsbF9wcmludF90cmVlKHJvb3QtPnduX3NpYmxpbmcpOwojZW5kaWYKCWhhc2hfY2xlYXIoJmh0KTsKICAgIH0KfQoKLyoKICogQ29tcHJlc3MgYSBub2RlLCBpdHMgc2libGluZ3MgYW5kIGl0cyBjaGlsZHJlbiwgZGVwdGggZmlyc3QuCiAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjb21wcmVzc2VkIG5vZGVzLgogKi8KICAgIHN0YXRpYyBpbnQKbm9kZV9jb21wcmVzcyhzcGluLCBub2RlLCBodCwgdG90KQogICAgc3BlbGxpbmZvX1QJKnNwaW47CiAgICB3b3Jkbm9kZV9UCSpub2RlOwogICAgaGFzaHRhYl9UCSpodDsKICAgIGludAkJKnRvdDsJICAgIC8qIHRvdGFsIGNvdW50IG9mIG5vZGVzIGJlZm9yZSBjb21wcmVzc2luZywKCQkJICAgICAgIGluY3JlbWVudGVkIHdoaWxlIGdvaW5nIHRocm91Z2ggdGhlIHRyZWUgKi8KewogICAgd29yZG5vZGVfVAkqbnA7CiAgICB3b3Jkbm9kZV9UCSp0cDsKICAgIHdvcmRub2RlX1QJKmNoaWxkOwogICAgaGFzaF9UCWhhc2g7CiAgICBoYXNoaXRlbV9UCSpoaTsKICAgIGludAkJbGVuID0gMDsKICAgIHVuc2lnbmVkCW5yLCBuOwogICAgaW50CQljb21wcmVzc2VkID0gMDsKCiAgICAvKgogICAgICogR28gdGhyb3VnaCB0aGUgbGlzdCBvZiBzaWJsaW5ncy4gIENvbXByZXNzIGVhY2ggY2hpbGQgYW5kIHRoZW4gdHJ5CiAgICAgKiBmaW5kaW5nIGFuIGlkZW50aWNhbCBjaGlsZCB0byByZXBsYWNlIGl0LgogICAgICogTm90ZSB0aGF0IHdpdGggImNoaWxkIiB3ZSBtZWFuIG5vdCBqdXN0IHRoZSBub2RlIHRoYXQgaXMgcG9pbnRlZCB0bywKICAgICAqIGJ1dCB0aGUgd2hvbGUgbGlzdCBvZiBzaWJsaW5ncyBvZiB3aGljaCB0aGUgY2hpbGQgbm9kZSBpcyB0aGUgZmlyc3QuCiAgICAgKi8KICAgIGZvciAobnAgPSBub2RlOyBucCAhPSBOVUxMICYmICFnb3RfaW50OyBucCA9IG5wLT53bl9zaWJsaW5nKQogICAgewoJKytsZW47CglpZiAoKGNoaWxkID0gbnAtPnduX2NoaWxkKSAhPSBOVUxMKQoJewoJICAgIC8qIENvbXByZXNzIHRoZSBjaGlsZCBmaXJzdC4gIFRoaXMgZmlsbHMgaGFzaGtleS4gKi8KCSAgICBjb21wcmVzc2VkICs9IG5vZGVfY29tcHJlc3Moc3BpbiwgY2hpbGQsIGh0LCB0b3QpOwoKCSAgICAvKiBUcnkgdG8gZmluZCBhbiBpZGVudGljYWwgY2hpbGQuICovCgkgICAgaGFzaCA9IGhhc2hfaGFzaChjaGlsZC0+d25fdTEuaGFzaGtleSk7CgkgICAgaGkgPSBoYXNoX2xvb2t1cChodCwgY2hpbGQtPnduX3UxLmhhc2hrZXksIGhhc2gpOwoJICAgIGlmICghSEFTSElURU1fRU1QVFkoaGkpKQoJICAgIHsKCQkvKiBUaGVyZSBhcmUgY2hpbGRyZW4gd2UgZW5jb3VudGVyZWQgYmVmb3JlIHdpdGggYSBoYXNoIHZhbHVlCgkJICogaWRlbnRpY2FsIHRvIHRoZSBjdXJyZW50IGNoaWxkLiAgTm93IGNoZWNrIGlmIHRoZXJlIGlzIG9uZQoJCSAqIHRoYXQgaXMgcmVhbGx5IGlkZW50aWNhbC4gKi8KCQlmb3IgKHRwID0gSEkyV04oaGkpOyB0cCAhPSBOVUxMOyB0cCA9IHRwLT53bl91Mi5uZXh0KQoJCSAgICBpZiAobm9kZV9lcXVhbChjaGlsZCwgdHApKQoJCSAgICB7CgkJCS8qIEZvdW5kIG9uZSEgIE5vdyB1c2UgdGhhdCBjaGlsZCBpbiBwbGFjZSBvZiB0aGUKCQkJICogY3VycmVudCBvbmUuICBUaGlzIG1lYW5zIHRoZSBjdXJyZW50IGNoaWxkIGFuZCBhbGwKCQkJICogaXRzIHNpYmxpbmdzIGlzIHVubGlua2VkIGZyb20gdGhlIHRyZWUuICovCgkJCSsrdHAtPnduX3JlZnM7CgkJCWNvbXByZXNzZWQgKz0gZGVyZWZfd29yZG5vZGUoc3BpbiwgY2hpbGQpOwoJCQlucC0+d25fY2hpbGQgPSB0cDsKCQkJYnJlYWs7CgkJICAgIH0KCQlpZiAodHAgPT0gTlVMTCkKCQl7CgkJICAgIC8qIE5vIG90aGVyIGNoaWxkIHdpdGggdGhpcyBoYXNoIHZhbHVlIGVxdWFscyB0aGUgY2hpbGQgb2YKCQkgICAgICogdGhlIG5vZGUsIGFkZCBpdCB0byB0aGUgbGlua2VkIGxpc3QgYWZ0ZXIgdGhlIGZpcnN0CgkJICAgICAqIGl0ZW0uICovCgkJICAgIHRwID0gSEkyV04oaGkpOwoJCSAgICBjaGlsZC0+d25fdTIubmV4dCA9IHRwLT53bl91Mi5uZXh0OwoJCSAgICB0cC0+d25fdTIubmV4dCA9IGNoaWxkOwoJCX0KCSAgICB9CgkgICAgZWxzZQoJCS8qIE5vIG90aGVyIGNoaWxkIGhhcyB0aGlzIGhhc2ggdmFsdWUsIGFkZCBpdCB0byB0aGUKCQkgKiBoYXNodGFibGUuICovCgkJaGFzaF9hZGRfaXRlbShodCwgaGksIGNoaWxkLT53bl91MS5oYXNoa2V5LCBoYXNoKTsKCX0KICAgIH0KICAgICp0b3QgKz0gbGVuICsgMTsJLyogYWRkIG9uZSBmb3IgdGhlIG5vZGUgdGhhdCBzdG9yZXMgdGhlIGxlbmd0aCAqLwoKICAgIC8qCiAgICAgKiBNYWtlIGEgaGFzaCBrZXkgZm9yIHRoZSBub2RlIGFuZCBpdHMgc2libGluZ3MsIHNvIHRoYXQgd2UgY2FuIHF1aWNrbHkKICAgICAqIGZpbmQgYSBsb29rYWxpa2Ugbm9kZS4gIFRoaXMgbXVzdCBiZSBkb25lIGFmdGVyIGNvbXByZXNzaW5nIHRoZSBzaWJsaW5nCiAgICAgKiBsaXN0LCBvdGhlcndpc2UgdGhlIGhhc2gga2V5IHdvdWxkIGJlY29tZSBpbnZhbGlkIGJ5IHRoZSBjb21wcmVzc2lvbi4KICAgICAqLwogICAgbm9kZS0+d25fdTEuaGFzaGtleVswXSA9IGxlbjsKICAgIG5yID0gMDsKICAgIGZvciAobnAgPSBub2RlOyBucCAhPSBOVUxMOyBucCA9IG5wLT53bl9zaWJsaW5nKQogICAgewoJaWYgKG5wLT53bl9ieXRlID09IE5VTCkKCSAgICAvKiBlbmQgbm9kZTogdXNlIHduX2ZsYWdzLCB3bl9yZWdpb24gYW5kIHduX2FmZml4SUQgKi8KCSAgICBuID0gbnAtPnduX2ZsYWdzICsgKG5wLT53bl9yZWdpb24gPDwgOCkgKyAobnAtPnduX2FmZml4SUQgPDwgMTYpOwoJZWxzZQoJICAgIC8qIGJ5dGUgbm9kZTogdXNlIHRoZSBieXRlIHZhbHVlIGFuZCB0aGUgY2hpbGQgcG9pbnRlciAqLwoJICAgIG4gPSBucC0+d25fYnl0ZSArICgobG9uZ191KW5wLT53bl9jaGlsZCA8PCA4KTsKCW5yID0gbnIgKiAxMDEgKyBuOwogICAgfQoKICAgIC8qIEF2b2lkIE5VTCBieXRlcywgaXQgdGVybWluYXRlcyB0aGUgaGFzaCBrZXkuICovCiAgICBuID0gbnIgJiAweGZmOwogICAgbm9kZS0+d25fdTEuaGFzaGtleVsxXSA9IG4gPT0gMCA/IDEgOiBuOwogICAgbiA9IChuciA+PiA4KSAmIDB4ZmY7CiAgICBub2RlLT53bl91MS5oYXNoa2V5WzJdID0gbiA9PSAwID8gMSA6IG47CiAgICBuID0gKG5yID4+IDE2KSAmIDB4ZmY7CiAgICBub2RlLT53bl91MS5oYXNoa2V5WzNdID0gbiA9PSAwID8gMSA6IG47CiAgICBuID0gKG5yID4+IDI0KSAmIDB4ZmY7CiAgICBub2RlLT53bl91MS5oYXNoa2V5WzRdID0gbiA9PSAwID8gMSA6IG47CiAgICBub2RlLT53bl91MS5oYXNoa2V5WzVdID0gTlVMOwoKICAgIC8qIENoZWNrIGZvciBDVFJMLUMgcHJlc3NlZCBub3cgYW5kIHRoZW4uICovCiAgICBmYXN0X2JyZWFrY2hlY2soKTsKCiAgICByZXR1cm4gY29tcHJlc3NlZDsKfQoKLyoKICogUmV0dXJuIFRSVUUgd2hlbiB0d28gbm9kZXMgaGF2ZSBpZGVudGljYWwgc2libGluZ3MgYW5kIGNoaWxkcmVuLgogKi8KICAgIHN0YXRpYyBpbnQKbm9kZV9lcXVhbChuMSwgbjIpCiAgICB3b3Jkbm9kZV9UCSpuMTsKICAgIHdvcmRub2RlX1QJKm4yOwp7CiAgICB3b3Jkbm9kZV9UCSpwMTsKICAgIHdvcmRub2RlX1QJKnAyOwoKICAgIGZvciAocDEgPSBuMSwgcDIgPSBuMjsgcDEgIT0gTlVMTCAmJiBwMiAhPSBOVUxMOwoJCQkJICAgICBwMSA9IHAxLT53bl9zaWJsaW5nLCBwMiA9IHAyLT53bl9zaWJsaW5nKQoJaWYgKHAxLT53bl9ieXRlICE9IHAyLT53bl9ieXRlCgkJfHwgKHAxLT53bl9ieXRlID09IE5VTAoJCSAgICA/IChwMS0+d25fZmxhZ3MgIT0gcDItPnduX2ZsYWdzCgkJCXx8IHAxLT53bl9yZWdpb24gIT0gcDItPnduX3JlZ2lvbgoJCQl8fCBwMS0+d25fYWZmaXhJRCAhPSBwMi0+d25fYWZmaXhJRCkKCQkgICAgOiAocDEtPnduX2NoaWxkICE9IHAyLT53bl9jaGlsZCkpKQoJICAgIGJyZWFrOwoKICAgIHJldHVybiBwMSA9PSBOVUxMICYmIHAyID09IE5VTEw7Cn0KCi8qCiAqIFdyaXRlIGEgbnVtYmVyIHRvIGZpbGUgImZkIiwgTVNCIGZpcnN0LCBpbiAibGVuIiBieXRlcy4KICovCiAgICB2b2lkCnB1dF9ieXRlcyhmZCwgbnIsIGxlbikKICAgIEZJTEUgICAgKmZkOwogICAgbG9uZ191ICBucjsKICAgIGludAkgICAgbGVuOwp7CiAgICBpbnQJICAgIGk7CgogICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpCglwdXRjKChpbnQpKG5yID4+IChpICogOCkpLCBmZCk7Cn0KCiNpZmRlZiBfTVNDX1ZFUgojIGlmIChfTVNDX1ZFUiA8PSAxMjAwKQovKiBUaGlzIGxpbmUgaXMgcmVxdWlyZWQgZm9yIFZDNiB3aXRob3V0IHRoZSBzZXJ2aWNlIHBhY2suICBBbHNvIHNlZSB0aGUKICogbWF0Y2hpbmcgI3ByYWdtYSBiZWxvdy4gKi8KLyogIyBwcmFnbWEgb3B0aW1pemUoIiIsIG9mZikgKi8KIyBlbmRpZgojZW5kaWYKCi8qCiAqIFdyaXRlIHNwaW4tPnNpX3N1Z3RpbWUgdG8gZmlsZSAiZmQiLgogKi8KICAgIHN0YXRpYyB2b2lkCnB1dF9zdWd0aW1lKHNwaW4sIGZkKQogICAgc3BlbGxpbmZvX1QgKnNwaW47CiAgICBGSUxFCSpmZDsKewogICAgaW50CQljOwogICAgaW50CQlpOwoKICAgIC8qIHRpbWVfdCBjYW4gYmUgdXAgdG8gOCBieXRlcyBpbiBzaXplLCBtb3JlIHRoYW4gbG9uZ191LCB0aHVzIHdlCiAgICAgKiBjYW4ndCB1c2UgcHV0X2J5dGVzKCkgaGVyZS4gKi8KICAgIGZvciAoaSA9IDc7IGkgPj0gMDsgLS1pKQoJaWYgKGkgKyAxID4gc2l6ZW9mKHRpbWVfdCkpCgkgICAgLyogIj4+IiBkb2Vzbid0IHdvcmsgd2VsbCB3aGVuIHNoaWZ0aW5nIG1vcmUgYml0cyB0aGFuIGF2YWlsICovCgkgICAgcHV0YygwLCBmZCk7CgllbHNlCgl7CgkgICAgYyA9ICh1bnNpZ25lZClzcGluLT5zaV9zdWd0aW1lID4+IChpICogOCk7CgkgICAgcHV0YyhjLCBmZCk7Cgl9Cn0KCiNpZmRlZiBfTVNDX1ZFUgojIGlmIChfTVNDX1ZFUiA8PSAxMjAwKQovKiAjIHByYWdtYSBvcHRpbWl6ZSgiIiwgb24pICovCiMgZW5kaWYKI2VuZGlmCgpzdGF0aWMgaW50CiNpZmRlZiBfX0JPUkxBTkRDX18KX1JUTEVOVFJZRgojZW5kaWYKcmVwX2NvbXBhcmUgX19BUkdTKChjb25zdCB2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIpKTsKCi8qCiAqIEZ1bmN0aW9uIGdpdmVuIHRvIHFzb3J0KCkgdG8gc29ydCB0aGUgUkVQIGl0ZW1zIG9uICJmcm9tIiBzdHJpbmcuCiAqLwogICAgc3RhdGljIGludAojaWZkZWYgX19CT1JMQU5EQ19fCl9SVExFTlRSWUYKI2VuZGlmCnJlcF9jb21wYXJlKHMxLCBzMikKICAgIGNvbnN0IHZvaWQJKnMxOwogICAgY29uc3Qgdm9pZAkqczI7CnsKICAgIGZyb210b19UCSpwMSA9IChmcm9tdG9fVCAqKXMxOwogICAgZnJvbXRvX1QJKnAyID0gKGZyb210b19UICopczI7CgogICAgcmV0dXJuIFNUUkNNUChwMS0+ZnRfZnJvbSwgcDItPmZ0X2Zyb20pOwp9CgovKgogKiBXcml0ZSB0aGUgVmltIC5zcGwgZmlsZSAiZm5hbWUiLgogKiBSZXR1cm4gRkFJTCBvciBPSzsKICovCiAgICBzdGF0aWMgaW50CndyaXRlX3ZpbV9zcGVsbChzcGluLCBmbmFtZSkKICAgIHNwZWxsaW5mb19UCSpzcGluOwogICAgY2hhcl91CSpmbmFtZTsKewogICAgRklMRQkqZmQ7CiAgICBpbnQJCXJlZ2lvbm1hc2s7CiAgICBpbnQJCXJvdW5kOwogICAgd29yZG5vZGVfVAkqdHJlZTsKICAgIGludAkJbm9kZWNvdW50OwogICAgaW50CQlpOwogICAgaW50CQlsOwogICAgZ2FycmF5X1QJKmdhcDsKICAgIGZyb210b19UCSpmdHA7CiAgICBjaGFyX3UJKnA7CiAgICBpbnQJCXJyOwogICAgaW50CQlyZXR2YWwgPSBPSzsKCiAgICBmZCA9IG1jaF9mb3BlbigoY2hhciAqKWZuYW1lLCAidyIpOwogICAgaWYgKGZkID09IE5VTEwpCiAgICB7CglFTVNHMihfKGVfbm90b3BlbiksIGZuYW1lKTsKCXJldHVybiBGQUlMOwogICAgfQoKICAgIC8qIDxIRUFERVI+OiA8ZmlsZUlEPiA8dmVyc2lvbm5yPiAqLwoJCQkJCQkJICAgIC8qIDxmaWxlSUQ+ICovCiAgICBpZiAoZndyaXRlKFZJTVNQRUxMTUFHSUMsIFZJTVNQRUxMTUFHSUNMLCAoc2l6ZV90KTEsIGZkKSAhPSAxKQogICAgewoJRU1TRyhfKGVfd3JpdGUpKTsKCXJldHZhbCA9IEZBSUw7CiAgICB9CiAgICBwdXRjKFZJTVNQRUxMVkVSU0lPTiwgZmQpOwkJCQkgICAgLyogPHZlcnNpb25ucj4gKi8KCiAgICAvKgogICAgICogPFNFQ1RJT05TPjogPHNlY3Rpb24+IC4uLiA8c2VjdGlvbmVuZD4KICAgICAqLwoKICAgIC8qIFNOX0lORk86IDxpbmZvdGV4dD4gKi8KICAgIGlmIChzcGluLT5zaV9pbmZvICE9IE5VTEwpCiAgICB7CglwdXRjKFNOX0lORk8sIGZkKTsJCQkJLyogPHNlY3Rpb25JRD4gKi8KCXB1dGMoMCwgZmQpOwkJCQkJLyogPHNlY3Rpb25mbGFncz4gKi8KCglpID0gU1RSTEVOKHNwaW4tPnNpX2luZm8pOwoJcHV0X2J5dGVzKGZkLCAobG9uZ191KWksIDQpOwkJCS8qIDxzZWN0aW9ubGVuPiAqLwoJZndyaXRlKHNwaW4tPnNpX2luZm8sIChzaXplX3QpaSwgKHNpemVfdCkxLCBmZCk7IC8qIDxpbmZvdGV4dD4gKi8KICAgIH0KCiAgICAvKiBTTl9SRUdJT046IDxyZWdpb25uYW1lPiAuLi4KICAgICAqIFdyaXRlIHRoZSByZWdpb24gbmFtZXMgb25seSBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lLiAqLwogICAgaWYgKHNwaW4tPnNpX3JlZ2lvbl9jb3VudCA+IDEpCiAgICB7CglwdXRjKFNOX1JFR0lPTiwgZmQpOwkJCQkvKiA8c2VjdGlvbklEPiAqLwoJcHV0YyhTTkZfUkVRVUlSRUQsIGZkKTsJCQkJLyogPHNlY3Rpb25mbGFncz4gKi8KCWwgPSBzcGluLT5zaV9yZWdpb25fY291bnQgKiAyOwoJcHV0X2J5dGVzKGZkLCAobG9uZ191KWwsIDQpOwkJCS8qIDxzZWN0aW9ubGVuPiAqLwoJZndyaXRlKHNwaW4tPnNpX3JlZ2lvbl9uYW1lLCAoc2l6ZV90KWwsIChzaXplX3QpMSwgZmQpOwoJCQkJCQkJLyogPHJlZ2lvbm5hbWU+IC4uLiAqLwoJcmVnaW9ubWFzayA9ICgxIDw8IHNwaW4tPnNpX3JlZ2lvbl9jb3VudCkgLSAxOwogICAgfQogICAgZWxzZQoJcmVnaW9ubWFzayA9IDA7CgogICAgLyogU05fQ0hBUkZMQUdTOiA8Y2hhcmZsYWdzbGVuPiA8Y2hhcmZsYWdzPiA8Zm9sY2hhcnNsZW4+IDxmb2xjaGFycz4KICAgICAqCiAgICAgKiBUaGUgdGFibGUgd2l0aCBjaGFyYWN0ZXIgZmxhZ3MgYW5kIHRoZSB0YWJsZSBmb3IgY2FzZSBmb2xkaW5nLgogICAgICogVGhpcyBtYWtlcyBzdXJlIHRoZSBzYW1lIGNoYXJhY3RlcnMgYXJlIHJlY29nbml6ZWQgYXMgd29yZCBjaGFyYWN0ZXJzCiAgICAgKiB3aGVuIGdlbmVyYXRpbmcgYW4gd2hlbiB1c2luZyBhIHNwZWxsIGZpbGUuCiAgICAgKiBTa2lwIHRoaXMgZm9yIEFTQ0lJLCB0aGUgdGFibGUgbWF5IGNvbmZsaWN0IHdpdGggdGhlIG9uZSB1c2VkIGZvcgogICAgICogJ2VuY29kaW5nJy4KICAgICAqIEFsc28gc2tpcCB0aGlzIGZvciBhbiAuYWRkLnNwbCBmaWxlLCB0aGUgbWFpbiBzcGVsbCBmaWxlIG11c3QgY29udGFpbgogICAgICogdGhlIHRhYmxlIChhdm9pZHMgdGhhdCBpdCBjb25mbGljdHMpLiAgRmlsZSBpcyBzaG9ydGVyIHRvby4KICAgICAqLwogICAgaWYgKCFzcGluLT5zaV9hc2NpaSAmJiAhc3Bpbi0+c2lfYWRkKQogICAgewoJY2hhcl91CWZvbGNoYXJzWzEyOCAqIDhdOwoJaW50CWZsYWdzOwoKCXB1dGMoU05fQ0hBUkZMQUdTLCBmZCk7CQkJCS8qIDxzZWN0aW9uSUQ+ICovCglwdXRjKFNORl9SRVFVSVJFRCwgZmQpOwkJCQkvKiA8c2VjdGlvbmZsYWdzPiAqLwoKCS8qIEZvcm0gdGhlIDxmb2xjaGFycz4gc3RyaW5nIGZpcnN0LCB3ZSBuZWVkIHRvIGtub3cgaXRzIGxlbmd0aC4gKi8KCWwgPSAwOwoJZm9yIChpID0gMTI4OyBpIDwgMjU2OyArK2kpCgl7CiNpZmRlZiBGRUFUX01CWVRFCgkgICAgaWYgKGhhc19tYnl0ZSkKCQlsICs9IG1iX2NoYXIyYnl0ZXMoc3BlbGx0YWIuc3RfZm9sZFtpXSwgZm9sY2hhcnMgKyBsKTsKCSAgICBlbHNlCiNlbmRpZgoJCWZvbGNoYXJzW2wrK10gPSBzcGVsbHRhYi5zdF9mb2xkW2ldOwoJfQoJcHV0X2J5dGVzKGZkLCAobG9uZ191KSgxICsgMTI4ICsgMiArIGwpLCA0KTsJLyogPHNlY3Rpb25sZW4+ICovCgoJZnB1dGMoMTI4LCBmZCk7CQkJCQkvKiA8Y2hhcmZsYWdzbGVuPiAqLwoJZm9yIChpID0gMTI4OyBpIDwgMjU2OyArK2kpCgl7CgkgICAgZmxhZ3MgPSAwOwoJICAgIGlmIChzcGVsbHRhYi5zdF9pc3dbaV0pCgkJZmxhZ3MgfD0gQ0ZfV09SRDsKCSAgICBpZiAoc3BlbGx0YWIuc3RfaXN1W2ldKQoJCWZsYWdzIHw9IENGX1VQUEVSOwoJICAgIGZwdXRjKGZsYWdzLCBmZCk7CQkJCS8qIDxjaGFyZmxhZ3M+ICovCgl9CgoJcHV0X2J5dGVzKGZkLCAobG9uZ191KWwsIDIpOwkJCS8qIDxmb2xjaGFyc2xlbj4gKi8KCWZ3cml0ZShmb2xjaGFycywgKHNpemVfdClsLCAoc2l6ZV90KTEsIGZkKTsJLyogPGZvbGNoYXJzPiAqLwogICAgfQoKICAgIC8qIFNOX01JRFdPUkQ6IDxtaWR3b3JkPiAqLwogICAgaWYgKHNwaW4tPnNpX21pZHdvcmQgIT0gTlVMTCkKICAgIHsKCXB1dGMoU05fTUlEV09SRCwgZmQpOwkJCQkvKiA8c2VjdGlvbklEPiAqLwoJcHV0YyhTTkZfUkVRVUlSRUQsIGZkKTsJCQkJLyogPHNlY3Rpb25mbGFncz4gKi8KCglpID0gU1RSTEVOKHNwaW4tPnNpX21pZHdvcmQpOwoJcHV0X2J5dGVzKGZkLCAobG9uZ191KWksIDQpOwkJCS8qIDxzZWN0aW9ubGVuPiAqLwoJZndyaXRlKHNwaW4tPnNpX21pZHdvcmQsIChzaXplX3QpaSwgKHNpemVfdCkxLCBmZCk7IC8qIDxtaWR3b3JkPiAqLwogICAgfQoKICAgIC8qIFNOX1BSRUZDT05EOiA8cHJlZmNvbmRjbnQ+IDxwcmVmY29uZD4gLi4uICovCiAgICBpZiAoc3Bpbi0+c2lfcHJlZmNvbmQuZ2FfbGVuID4gMCkKICAgIHsKCXB1dGMoU05fUFJFRkNPTkQsIGZkKTsJCQkJLyogPHNlY3Rpb25JRD4gKi8KCXB1dGMoU05GX1JFUVVJUkVELCBmZCk7CQkJCS8qIDxzZWN0aW9uZmxhZ3M+ICovCgoJbCA9IHdyaXRlX3NwZWxsX3ByZWZjb25kKE5VTEwsICZzcGluLT5zaV9wcmVmY29uZCk7CglwdXRfYnl0ZXMoZmQsIChsb25nX3UpbCwgNCk7CQkJLyogPHNlY3Rpb25sZW4+ICovCgoJd3JpdGVfc3BlbGxfcHJlZmNvbmQoZmQsICZzcGluLT5zaV9wcmVmY29uZCk7CiAgICB9CgogICAgLyogU05fUkVQOiA8cmVwY291bnQ+IDxyZXA+IC4uLgogICAgICogU05fU0FMOiA8c2FsZmxhZ3M+IDxzYWxjb3VudD4gPHNhbD4gLi4uCiAgICAgKiBTTl9SRVBTQUw6IDxyZXBjb3VudD4gPHJlcD4gLi4uICovCgogICAgLyogcm91bmQgMTogU05fUkVQIHNlY3Rpb24KICAgICAqIHJvdW5kIDI6IFNOX1NBTCBzZWN0aW9uICh1bmxlc3MgU05fU09GTyBpcyB1c2VkKQogICAgICogcm91bmQgMzogU05fUkVQU0FMIHNlY3Rpb24gKi8KICAgIGZvciAocm91bmQgPSAxOyByb3VuZCA8PSAzOyArK3JvdW5kKQogICAgewoJaWYgKHJvdW5kID09IDEpCgkgICAgZ2FwID0gJnNwaW4tPnNpX3JlcDsKCWVsc2UgaWYgKHJvdW5kID09IDIpCgl7CgkgICAgLyogRG9uJ3Qgd3JpdGUgU05fU0FMIHdoZW4gdXNpbmcgYSBTTl9TT0ZPIHNlY3Rpb24gKi8KCSAgICBpZiAoc3Bpbi0+c2lfc29mb2ZyICE9IE5VTEwgJiYgc3Bpbi0+c2lfc29mb3RvICE9IE5VTEwpCgkJY29udGludWU7CgkgICAgZ2FwID0gJnNwaW4tPnNpX3NhbDsKCX0KCWVsc2UKCSAgICBnYXAgPSAmc3Bpbi0+c2lfcmVwc2FsOwoKCS8qIERvbid0IHdyaXRlIHRoZSBzZWN0aW9uIGlmIHRoZXJlIGFyZSBubyBpdGVtcy4gKi8KCWlmIChnYXAtPmdhX2xlbiA9PSAwKQoJICAgIGNvbnRpbnVlOwoKCS8qIFNvcnQgdGhlIFJFUC9SRVBTQUwgaXRlbXMuICovCglpZiAocm91bmQgIT0gMikKCSAgICBxc29ydChnYXAtPmdhX2RhdGEsIChzaXplX3QpZ2FwLT5nYV9sZW4sCgkJCQkJICAgICAgIHNpemVvZihmcm9tdG9fVCksIHJlcF9jb21wYXJlKTsKCglpID0gcm91bmQgPT0gMSA/IFNOX1JFUCA6IChyb3VuZCA9PSAyID8gU05fU0FMIDogU05fUkVQU0FMKTsKCXB1dGMoaSwgZmQpOwkJCQkJLyogPHNlY3Rpb25JRD4gKi8KCgkvKiBUaGlzIGlzIGZvciBtYWtpbmcgc3VnZ2VzdGlvbnMsIHNlY3Rpb24gaXMgbm90IHJlcXVpcmVkLiAqLwoJcHV0YygwLCBmZCk7CQkJCQkvKiA8c2VjdGlvbmZsYWdzPiAqLwoKCS8qIENvbXB1dGUgdGhlIGxlbmd0aCBvZiB3aGF0IGZvbGxvd3MuICovCglsID0gMjsJICAgIC8qIGNvdW50IDxyZXBjb3VudD4gb3IgPHNhbGNvdW50PiAqLwoJZm9yIChpID0gMDsgaSA8IGdhcC0+Z2FfbGVuOyArK2kpCgl7CgkgICAgZnRwID0gJigoZnJvbXRvX1QgKilnYXAtPmdhX2RhdGEpW2ldOwoJICAgIGwgKz0gMSArIFNUUkxFTihmdHAtPmZ0X2Zyb20pOyAgLyogY291bnQgPCpmcm9tbGVuPiBhbmQgPCpmcm9tPiAqLwoJICAgIGwgKz0gMSArIFNUUkxFTihmdHAtPmZ0X3RvKTsgICAgLyogY291bnQgPCp0b2xlbj4gYW5kIDwqdG8+ICovCgl9CglpZiAocm91bmQgPT0gMikKCSAgICArK2w7CS8qIGNvdW50IDxzYWxmbGFncz4gKi8KCXB1dF9ieXRlcyhmZCwgKGxvbmdfdSlsLCA0KTsJCQkvKiA8c2VjdGlvbmxlbj4gKi8KCglpZiAocm91bmQgPT0gMikKCXsKCSAgICBpID0gMDsKCSAgICBpZiAoc3Bpbi0+c2lfZm9sbG93dXApCgkJaSB8PSBTQUxfRjBMTE9XVVA7CgkgICAgaWYgKHNwaW4tPnNpX2NvbGxhcHNlKQoJCWkgfD0gU0FMX0NPTExBUFNFOwoJICAgIGlmIChzcGluLT5zaV9yZW1fYWNjZW50cykKCQlpIHw9IFNBTF9SRU1fQUNDRU5UUzsKCSAgICBwdXRjKGksIGZkKTsJCQkvKiA8c2FsZmxhZ3M+ICovCgl9CgoJcHV0X2J5dGVzKGZkLCAobG9uZ191KWdhcC0+Z2FfbGVuLCAyKTsJLyogPHJlcGNvdW50PiBvciA8c2FsY291bnQ+ICovCglmb3IgKGkgPSAwOyBpIDwgZ2FwLT5nYV9sZW47ICsraSkKCXsKCSAgICAvKiA8cmVwPiA6IDxyZXBmcm9tbGVuPiA8cmVwZnJvbT4gPHJlcHRvbGVuPiA8cmVwdG8+ICovCgkgICAgLyogPHNhbD4gOiA8c2FsZnJvbWxlbj4gPHNhbGZyb20+IDxzYWx0b2xlbj4gPHNhbHRvPiAqLwoJICAgIGZ0cCA9ICYoKGZyb210b19UICopZ2FwLT5nYV9kYXRhKVtpXTsKCSAgICBmb3IgKHJyID0gMTsgcnIgPD0gMjsgKytycikKCSAgICB7CgkJcCA9IHJyID09IDEgPyBmdHAtPmZ0X2Zyb20gOiBmdHAtPmZ0X3RvOwoJCWwgPSBTVFJMRU4ocCk7CgkJcHV0YyhsLCBmZCk7CgkJZndyaXRlKHAsIGwsIChzaXplX3QpMSwgZmQpOwoJICAgIH0KCX0KCiAgICB9CgogICAgLyogU05fU09GTzogPHNvZm9mcm9tbGVuPiA8c29mb2Zyb20+IDxzb2ZvdG9sZW4+IDxzb2ZvdG8+CiAgICAgKiBUaGlzIGlzIGZvciBtYWtpbmcgc3VnZ2VzdGlvbnMsIHNlY3Rpb24gaXMgbm90IHJlcXVpcmVkLiAqLwogICAgaWYgKHNwaW4tPnNpX3NvZm9mciAhPSBOVUxMICYmIHNwaW4tPnNpX3NvZm90byAhPSBOVUxMKQogICAgewoJcHV0YyhTTl9TT0ZPLCBmZCk7CQkJCS8qIDxzZWN0aW9uSUQ+ICovCglwdXRjKDAsIGZkKTsJCQkJCS8qIDxzZWN0aW9uZmxhZ3M+ICovCgoJbCA9IFNUUkxFTihzcGluLT5zaV9zb2ZvZnIpOwoJcHV0X2J5dGVzKGZkLCAobG9uZ191KShsICsgU1RSTEVOKHNwaW4tPnNpX3NvZm90bykgKyA0KSwgNCk7CgkJCQkJCQkvKiA8c2VjdGlvbmxlbj4gKi8KCglwdXRfYnl0ZXMoZmQsIChsb25nX3UpbCwgMik7CQkJLyogPHNvZm9mcm9tbGVuPiAqLwoJZndyaXRlKHNwaW4tPnNpX3NvZm9mciwgbCwgKHNpemVfdCkxLCBmZCk7CS8qIDxzb2ZvZnJvbT4gKi8KCglsID0gU1RSTEVOKHNwaW4tPnNpX3NvZm90byk7CglwdXRfYnl0ZXMoZmQsIChsb25nX3UpbCwgMik7CQkJLyogPHNvZm90b2xlbj4gKi8KCWZ3cml0ZShzcGluLT5zaV9zb2ZvdG8sIGwsIChzaXplX3QpMSwgZmQpOwkvKiA8c29mb3RvPiAqLwogICAgfQoKICAgIC8qIFNOX1dPUkRTOiA8d29yZD4gLi4uCiAgICAgKiBUaGlzIGlzIGZvciBtYWtpbmcgc3VnZ2VzdGlvbnMsIHNlY3Rpb24gaXMgbm90IHJlcXVpcmVkLiAqLwogICAgaWYgKHNwaW4tPnNpX2NvbW1vbndvcmRzLmh0X3VzZWQgPiAwKQogICAgewoJcHV0YyhTTl9XT1JEUywgZmQpOwkJCQkvKiA8c2VjdGlvbklEPiAqLwoJcHV0YygwLCBmZCk7CQkJCQkvKiA8c2VjdGlvbmZsYWdzPiAqLwoKCS8qIHJvdW5kIDE6IGNvdW50IHRoZSBieXRlcwoJICogcm91bmQgMjogd3JpdGUgdGhlIGJ5dGVzICovCglmb3IgKHJvdW5kID0gMTsgcm91bmQgPD0gMjsgKytyb3VuZCkKCXsKCSAgICBpbnQJCXRvZG87CgkgICAgaW50CQlsZW4gPSAwOwoJICAgIGhhc2hpdGVtX1QJKmhpOwoKCSAgICB0b2RvID0gc3Bpbi0+c2lfY29tbW9ud29yZHMuaHRfdXNlZDsKCSAgICBmb3IgKGhpID0gc3Bpbi0+c2lfY29tbW9ud29yZHMuaHRfYXJyYXk7IHRvZG8gPiAwOyArK2hpKQoJCWlmICghSEFTSElURU1fRU1QVFkoaGkpKQoJCXsKCQkgICAgbCA9IFNUUkxFTihoaS0+aGlfa2V5KSArIDE7CgkJICAgIGxlbiArPSBsOwoJCSAgICBpZiAocm91bmQgPT0gMikJCQkvKiA8d29yZD4gKi8KCQkJZndyaXRlKGhpLT5oaV9rZXksIChzaXplX3QpbCwgKHNpemVfdCkxLCBmZCk7CgkJICAgIC0tdG9kbzsKCQl9CgkgICAgaWYgKHJvdW5kID09IDEpCgkJcHV0X2J5dGVzKGZkLCAobG9uZ191KWxlbiwgNCk7CQkvKiA8c2VjdGlvbmxlbj4gKi8KCX0KICAgIH0KCiAgICAvKiBTTl9NQVA6IDxtYXBzdHI+CiAgICAgKiBUaGlzIGlzIGZvciBtYWtpbmcgc3VnZ2VzdGlvbnMsIHNlY3Rpb24gaXMgbm90IHJlcXVpcmVkLiAqLwogICAgaWYgKHNwaW4tPnNpX21hcC5nYV9sZW4gPiAwKQogICAgewoJcHV0YyhTTl9NQVAsIGZkKTsJCQkJLyogPHNlY3Rpb25JRD4gKi8KCXB1dGMoMCwgZmQpOwkJCQkJLyogPHNlY3Rpb25mbGFncz4gKi8KCWwgPSBzcGluLT5zaV9tYXAuZ2FfbGVuOwoJcHV0X2J5dGVzKGZkLCAobG9uZ191KWwsIDQpOwkJCS8qIDxzZWN0aW9ubGVuPiAqLwoJZndyaXRlKHNwaW4tPnNpX21hcC5nYV9kYXRhLCAoc2l6ZV90KWwsIChzaXplX3QpMSwgZmQpOwoJCQkJCQkJLyogPG1hcHN0cj4gKi8KICAgIH0KCiAgICAvKiBTTl9TVUdGSUxFOiA8dGltZXN0YW1wPgogICAgICogVGhpcyBpcyB1c2VkIHRvIG5vdGlmeSB0aGF0IGEgLnN1ZyBmaWxlIG1heSBiZSBhdmFpbGFibGUgYW5kIGF0IHRoZQogICAgICogc2FtZSB0aW1lIGFsbG93cyBmb3IgY2hlY2tpbmcgdGhhdCBhIC5zdWcgZmlsZSB0aGF0IGlzIGZvdW5kIG1hdGNoZXMKICAgICAqIHdpdGggdGhpcyAuc3BsIGZpbGUuICBUaGF0J3MgYmVjYXVzZSB0aGUgd29yZCBudW1iZXJzIG11c3QgYmUgZXhhY3RseQogICAgICogcmlnaHQuICovCiAgICBpZiAoIXNwaW4tPnNpX25vc3VnZmlsZQoJICAgICYmIChzcGluLT5zaV9zYWwuZ2FfbGVuID4gMAoJCSAgICAgfHwgKHNwaW4tPnNpX3NvZm9mciAhPSBOVUxMICYmIHNwaW4tPnNpX3NvZm90byAhPSBOVUxMKSkpCiAgICB7CglwdXRjKFNOX1NVR0ZJTEUsIGZkKTsJCQkJLyogPHNlY3Rpb25JRD4gKi8KCXB1dGMoMCwgZmQpOwkJCQkJLyogPHNlY3Rpb25mbGFncz4gKi8KCXB1dF9ieXRlcyhmZCwgKGxvbmdfdSk4LCA0KTsJCQkvKiA8c2VjdGlvbmxlbj4gKi8KCgkvKiBTZXQgc2lfc3VndGltZSBhbmQgd3JpdGUgaXQgdG8gdGhlIGZpbGUuICovCglzcGluLT5zaV9zdWd0aW1lID0gdGltZShOVUxMKTsKCXB1dF9zdWd0aW1lKHNwaW4sIGZkKTsJCQkJLyogPHRpbWVzdGFtcD4gKi8KICAgIH0KCiAgICAvKiBTTl9OT1NQTElUU1VHUzogbm90aGluZwogICAgICogVGhpcyBpcyB1c2VkIHRvIG5vdGlmeSB0aGF0IG5vIHN1Z2dlc3Rpb25zIHdpdGggd29yZCBzcGxpdHMgYXJlIHRvIGJlCiAgICAgKiBtYWRlLiAqLwogICAgaWYgKHNwaW4tPnNpX25vc3BsaXRzdWdzKQogICAgewoJcHV0YyhTTl9OT1NQTElUU1VHUywgZmQpOwkJCS8qIDxzZWN0aW9uSUQ+ICovCglwdXRjKDAsIGZkKTsJCQkJCS8qIDxzZWN0aW9uZmxhZ3M+ICovCglwdXRfYnl0ZXMoZmQsIChsb25nX3UpMCwgNCk7CQkJLyogPHNlY3Rpb25sZW4+ICovCiAgICB9CgogICAgLyogU05fQ09NUE9VTkQ6IGNvbXBvdW5kIGluZm8uCiAgICAgKiBXZSBkb24ndCBtYXJrIGl0IHJlcXVpcmVkLCB3aGVuIG5vdCBzdXBwb3J0ZWQgYWxsIGNvbXBvdW5kIHdvcmRzIHdpbGwKICAgICAqIGJlIGJhZCB3b3Jkcy4gKi8KICAgIGlmIChzcGluLT5zaV9jb21wZmxhZ3MgIT0gTlVMTCkKICAgIHsKCXB1dGMoU05fQ09NUE9VTkQsIGZkKTsJCQkJLyogPHNlY3Rpb25JRD4gKi8KCXB1dGMoMCwgZmQpOwkJCQkJLyogPHNlY3Rpb25mbGFncz4gKi8KCglsID0gU1RSTEVOKHNwaW4tPnNpX2NvbXBmbGFncyk7Cglmb3IgKGkgPSAwOyBpIDwgc3Bpbi0+c2lfY29tcHBhdC5nYV9sZW47ICsraSkKCSAgICBsICs9IFNUUkxFTigoKGNoYXJfdSAqKikoc3Bpbi0+c2lfY29tcHBhdC5nYV9kYXRhKSlbaV0pICsgMTsKCXB1dF9ieXRlcyhmZCwgKGxvbmdfdSkobCArIDcpLCA0KTsJCS8qIDxzZWN0aW9ubGVuPiAqLwoKCXB1dGMoc3Bpbi0+c2lfY29tcG1heCwgZmQpOwkJCS8qIDxjb21wbWF4PiAqLwoJcHV0YyhzcGluLT5zaV9jb21wbWlubGVuLCBmZCk7CQkJLyogPGNvbXBtaW5sZW4+ICovCglwdXRjKHNwaW4tPnNpX2NvbXBzeWxtYXgsIGZkKTsJCQkvKiA8Y29tcHN5bG1heD4gKi8KCXB1dGMoMCwgZmQpOwkJLyogZm9yIFZpbSA3LjBiIGNvbXBhdGliaWxpdHkgKi8KCXB1dGMoc3Bpbi0+c2lfY29tcG9wdGlvbnMsIGZkKTsJCQkvKiA8Y29tcG9wdGlvbnM+ICovCglwdXRfYnl0ZXMoZmQsIChsb25nX3Upc3Bpbi0+c2lfY29tcHBhdC5nYV9sZW4sIDIpOwoJCQkJCQkJLyogPGNvbXBwYXRjb3VudD4gKi8KCWZvciAoaSA9IDA7IGkgPCBzcGluLT5zaV9jb21wcGF0LmdhX2xlbjsgKytpKQoJewoJICAgIHAgPSAoKGNoYXJfdSAqKikoc3Bpbi0+c2lfY29tcHBhdC5nYV9kYXRhKSlbaV07CgkgICAgcHV0YyhTVFJMRU4ocCksIGZkKTsJCQkvKiA8Y29tcHBhdGxlbj4gKi8KCSAgICBmd3JpdGUocCwgKHNpemVfdClTVFJMRU4ocCksIChzaXplX3QpMSwgZmQpOy8qIDxjb21wcGF0dGV4dD4gKi8KCX0KCQkJCQkJCS8qIDxjb21wZmxhZ3M+ICovCglmd3JpdGUoc3Bpbi0+c2lfY29tcGZsYWdzLCAoc2l6ZV90KVNUUkxFTihzcGluLT5zaV9jb21wZmxhZ3MpLAoJCQkJCQkJICAgICAgIChzaXplX3QpMSwgZmQpOwogICAgfQoKICAgIC8qIFNOX05PQlJFQUs6IE5PQlJFQUsgZmxhZyAqLwogICAgaWYgKHNwaW4tPnNpX25vYnJlYWspCiAgICB7CglwdXRjKFNOX05PQlJFQUssIGZkKTsJCQkJLyogPHNlY3Rpb25JRD4gKi8KCXB1dGMoMCwgZmQpOwkJCQkJLyogPHNlY3Rpb25mbGFncz4gKi8KCgkvKiBJdCdzIGVtcHR5LCB0aGUgcHJlY2Vuc2Ugb2YgdGhlIHNlY3Rpb24gZmxhZ3MgdGhlIGZlYXR1cmUuICovCglwdXRfYnl0ZXMoZmQsIChsb25nX3UpMCwgNCk7CQkJLyogPHNlY3Rpb25sZW4+ICovCiAgICB9CgogICAgLyogU05fU1lMTEFCTEU6IHN5bGxhYmxlIGluZm8uCiAgICAgKiBXZSBkb24ndCBtYXJrIGl0IHJlcXVpcmVkLCB3aGVuIG5vdCBzdXBwb3J0ZWQgc3lsbGFibGVzIHdpbGwgbm90IGJlCiAgICAgKiBjb3VudGVkLiAqLwogICAgaWYgKHNwaW4tPnNpX3N5bGxhYmxlICE9IE5VTEwpCiAgICB7CglwdXRjKFNOX1NZTExBQkxFLCBmZCk7CQkJCS8qIDxzZWN0aW9uSUQ+ICovCglwdXRjKDAsIGZkKTsJCQkJCS8qIDxzZWN0aW9uZmxhZ3M+ICovCgoJbCA9IFNUUkxFTihzcGluLT5zaV9zeWxsYWJsZSk7CglwdXRfYnl0ZXMoZmQsIChsb25nX3UpbCwgNCk7CQkJLyogPHNlY3Rpb25sZW4+ICovCglmd3JpdGUoc3Bpbi0+c2lfc3lsbGFibGUsIChzaXplX3QpbCwgKHNpemVfdCkxLCBmZCk7IC8qIDxzeWxsYWJsZT4gKi8KICAgIH0KCiAgICAvKiBlbmQgb2YgPFNFQ1RJT05TPiAqLwogICAgcHV0YyhTTl9FTkQsIGZkKTsJCQkJCS8qIDxzZWN0aW9uZW5kPiAqLwoKCiAgICAvKgogICAgICogPExXT1JEVFJFRT4gIDxLV09SRFRSRUU+ICA8UFJFRklYVFJFRT4KICAgICAqLwogICAgc3Bpbi0+c2lfbWVtdG90ID0gMDsKICAgIGZvciAocm91bmQgPSAxOyByb3VuZCA8PSAzOyArK3JvdW5kKQogICAgewoJaWYgKHJvdW5kID09IDEpCgkgICAgdHJlZSA9IHNwaW4tPnNpX2ZvbGRyb290LT53bl9zaWJsaW5nOwoJZWxzZSBpZiAocm91bmQgPT0gMikKCSAgICB0cmVlID0gc3Bpbi0+c2lfa2VlcHJvb3QtPnduX3NpYmxpbmc7CgllbHNlCgkgICAgdHJlZSA9IHNwaW4tPnNpX3ByZWZyb290LT53bl9zaWJsaW5nOwoKCS8qIENsZWFyIHRoZSBpbmRleCBhbmQgd25vZGUgZmllbGRzIGluIHRoZSB0cmVlLiAqLwoJY2xlYXJfbm9kZSh0cmVlKTsKCgkvKiBDb3VudCB0aGUgbnVtYmVyIG9mIG5vZGVzLiAgTmVlZGVkIHRvIGJlIGFibGUgdG8gYWxsb2NhdGUgdGhlCgkgKiBtZW1vcnkgd2hlbiByZWFkaW5nIHRoZSBub2Rlcy4gIEFsc28gZmlsbHMgaW4gaW5kZXggZm9yIHNoYXJlZAoJICogbm9kZXMuICovCglub2RlY291bnQgPSBwdXRfbm9kZShOVUxMLCB0cmVlLCAwLCByZWdpb25tYXNrLCByb3VuZCA9PSAzKTsKCgkvKiBudW1iZXIgb2Ygbm9kZXMgaW4gNCBieXRlcyAqLwoJcHV0X2J5dGVzKGZkLCAobG9uZ191KW5vZGVjb3VudCwgNCk7CS8qIDxub2RlY291bnQ+ICovCglzcGluLT5zaV9tZW10b3QgKz0gbm9kZWNvdW50ICsgbm9kZWNvdW50ICogc2l6ZW9mKGludCk7CgoJLyogV3JpdGUgdGhlIG5vZGVzLiAqLwoJKHZvaWQpcHV0X25vZGUoZmQsIHRyZWUsIDAsIHJlZ2lvbm1hc2ssIHJvdW5kID09IDMpOwogICAgfQoKICAgIC8qIFdyaXRlIGFub3RoZXIgYnl0ZSB0byBjaGVjayBmb3IgZXJyb3JzLiAqLwogICAgaWYgKHB1dGMoMCwgZmQpID09IEVPRikKCXJldHZhbCA9IEZBSUw7CgogICAgaWYgKGZjbG9zZShmZCkgPT0gRU9GKQoJcmV0dmFsID0gRkFJTDsKCiAgICByZXR1cm4gcmV0dmFsOwp9CgovKgogKiBDbGVhciB0aGUgaW5kZXggYW5kIHdub2RlIGZpZWxkcyBvZiAibm9kZSIsIGl0IHNpYmxpbmdzIGFuZCBpdHMKICogY2hpbGRyZW4uICBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZXkgYXJlIGEgdW5pb24gd2l0aCBvdGhlciBpdGVtcyB0byBzYXZlCiAqIHNwYWNlLgogKi8KICAgIHN0YXRpYyB2b2lkCmNsZWFyX25vZGUobm9kZSkKICAgIHdvcmRub2RlX1QJKm5vZGU7CnsKICAgIHdvcmRub2RlX1QJKm5wOwoKICAgIGlmIChub2RlICE9IE5VTEwpCglmb3IgKG5wID0gbm9kZTsgbnAgIT0gTlVMTDsgbnAgPSBucC0+d25fc2libGluZykKCXsKCSAgICBucC0+d25fdTEuaW5kZXggPSAwOwoJICAgIG5wLT53bl91Mi53bm9kZSA9IE5VTEw7CgoJICAgIGlmIChucC0+d25fYnl0ZSAhPSBOVUwpCgkJY2xlYXJfbm9kZShucC0+d25fY2hpbGQpOwoJfQp9CgoKLyoKICogRHVtcCBhIHdvcmQgdHJlZSBhdCBub2RlICJub2RlIi4KICoKICogVGhpcyBmaXJzdCB3cml0ZXMgdGhlIGxpc3Qgb2YgcG9zc2libGUgYnl0ZXMgKHNpYmxpbmdzKS4gIFRoZW4gZm9yIGVhY2gKICogYnl0ZSByZWN1cnNpdmVseSB3cml0ZSB0aGUgY2hpbGRyZW4uCiAqCiAqIE5PVEU6IFRoZSBjb2RlIGhlcmUgbXVzdCBtYXRjaCB0aGUgY29kZSBpbiByZWFkX3RyZWVfbm9kZSgpLCBzaW5jZQogKiBhc3N1bXB0aW9ucyBhcmUgbWFkZSBhYm91dCB0aGUgaW5kZXhlcyAoc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHdyaXRlIHRoZW0KICogaW4gdGhlIGZpbGUpLgogKgogKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9kZXMgdXNlZC4KICovCiAgICBzdGF0aWMgaW50CnB1dF9ub2RlKGZkLCBub2RlLCBpbmRleCwgcmVnaW9ubWFzaywgcHJlZml4dHJlZSkKICAgIEZJTEUJKmZkOwkJLyogTlVMTCB3aGVuIG9ubHkgY291bnRpbmcgKi8KICAgIHdvcmRub2RlX1QJKm5vZGU7CiAgICBpbnQJCWluZGV4OwogICAgaW50CQlyZWdpb25tYXNrOwogICAgaW50CQlwcmVmaXh0cmVlOwkvKiBUUlVFIGZvciBQUkVGSVhUUkVFICovCnsKICAgIGludAkJbmV3aW5kZXggPSBpbmRleDsKICAgIGludAkJc2libGluZ2NvdW50ID0gMDsKICAgIHdvcmRub2RlX1QJKm5wOwogICAgaW50CQlmbGFnczsKCiAgICAvKiBJZiAibm9kZSIgaXMgemVybyB0aGUgdHJlZSBpcyBlbXB0eS4gKi8KICAgIGlmIChub2RlID09IE5VTEwpCglyZXR1cm4gMDsKCiAgICAvKiBTdG9yZSB0aGUgaW5kZXggd2hlcmUgdGhpcyBub2RlIGlzIHdyaXR0ZW4uICovCiAgICBub2RlLT53bl91MS5pbmRleCA9IGluZGV4OwoKICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2Ygc2libGluZ3MuICovCiAgICBmb3IgKG5wID0gbm9kZTsgbnAgIT0gTlVMTDsgbnAgPSBucC0+d25fc2libGluZykKCSsrc2libGluZ2NvdW50OwoKICAgIC8qIFdyaXRlIHRoZSBzaWJsaW5nIGNvdW50LiAqLwogICAgaWYgKGZkICE9IE5VTEwpCglwdXRjKHNpYmxpbmdjb3VudCwgZmQpOwkJCQkvKiA8c2libGluZ2NvdW50PiAqLwoKICAgIC8qIFdyaXRlIGVhY2ggc2libGluZyBieXRlIGFuZCBvcHRpb25hbGx5IGV4dHJhIGluZm8uICovCiAgICBmb3IgKG5wID0gbm9kZTsgbnAgIT0gTlVMTDsgbnAgPSBucC0+d25fc2libGluZykKICAgIHsKCWlmIChucC0+d25fYnl0ZSA9PSAwKQoJewoJICAgIGlmIChmZCAhPSBOVUxMKQoJICAgIHsKCQkvKiBGb3IgYSBOVUwgYnl0ZSAoZW5kIG9mIHdvcmQpIHdyaXRlIHRoZSBmbGFncyBldGMuICovCgkJaWYgKHByZWZpeHRyZWUpCgkJewoJCSAgICAvKiBJbiBQUkVGSVhUUkVFIHdyaXRlIHRoZSByZXF1aXJlZCBhZmZpeElEIGFuZCB0aGUKCQkgICAgICogYXNzb2NpYXRlZCBjb25kaXRpb24gbnIgKHN0b3JlZCBpbiB3bl9yZWdpb24pLiAgVGhlCgkJICAgICAqIGJ5dGUgdmFsdWUgaXMgbWlzdXNlZCB0byBzdG9yZSB0aGUgInJhcmUiIGFuZCAibm90CgkJICAgICAqIGNvbWJpbmluZyIgZmxhZ3MgKi8KCQkgICAgaWYgKG5wLT53bl9mbGFncyA9PSAoc2hvcnRfdSlQRlhfRkxBR1MpCgkJCXB1dGMoQllfTk9GTEFHUywgZmQpOwkJLyogPGJ5dGU+ICovCgkJICAgIGVsc2UKCQkgICAgewoJCQlwdXRjKEJZX0ZMQUdTLCBmZCk7CQkvKiA8Ynl0ZT4gKi8KCQkJcHV0YyhucC0+d25fZmxhZ3MsIGZkKTsJCS8qIDxwZmxhZ3M+ICovCgkJICAgIH0KCQkgICAgcHV0YyhucC0+d25fYWZmaXhJRCwgZmQpOwkJLyogPGFmZml4SUQ+ICovCgkJICAgIHB1dF9ieXRlcyhmZCwgKGxvbmdfdSlucC0+d25fcmVnaW9uLCAyKTsgLyogPHByZWZjb25kbnI+ICovCgkJfQoJCWVsc2UKCQl7CgkJICAgIC8qIEZvciB3b3JkIHRyZWVzIHdlIHdyaXRlIHRoZSBmbGFnL3JlZ2lvbiBpdGVtcy4gKi8KCQkgICAgZmxhZ3MgPSBucC0+d25fZmxhZ3M7CgkJICAgIGlmIChyZWdpb25tYXNrICE9IDAgJiYgbnAtPnduX3JlZ2lvbiAhPSByZWdpb25tYXNrKQoJCQlmbGFncyB8PSBXRl9SRUdJT047CgkJICAgIGlmIChucC0+d25fYWZmaXhJRCAhPSAwKQoJCQlmbGFncyB8PSBXRl9BRlg7CgkJICAgIGlmIChmbGFncyA9PSAwKQoJCSAgICB7CgkJCS8qIHdvcmQgd2l0aG91dCBmbGFncyBvciByZWdpb24gKi8KCQkJcHV0YyhCWV9OT0ZMQUdTLCBmZCk7CQkJLyogPGJ5dGU+ICovCgkJICAgIH0KCQkgICAgZWxzZQoJCSAgICB7CgkJCWlmIChucC0+d25fZmxhZ3MgPj0gMHgxMDApCgkJCXsKCQkJICAgIHB1dGMoQllfRkxBR1MyLCBmZCk7CQkvKiA8Ynl0ZT4gKi8KCQkJICAgIHB1dGMoZmxhZ3MsIGZkKTsJCQkvKiA8ZmxhZ3M+ICovCgkJCSAgICBwdXRjKCh1bnNpZ25lZClmbGFncyA+PiA4LCBmZCk7CS8qIDxmbGFnczI+ICovCgkJCX0KCQkJZWxzZQoJCQl7CgkJCSAgICBwdXRjKEJZX0ZMQUdTLCBmZCk7CQkJLyogPGJ5dGU+ICovCgkJCSAgICBwdXRjKGZsYWdzLCBmZCk7CQkJLyogPGZsYWdzPiAqLwoJCQl9CgkJCWlmIChmbGFncyAmIFdGX1JFR0lPTikKCQkJICAgIHB1dGMobnAtPnduX3JlZ2lvbiwgZmQpOwkJLyogPHJlZ2lvbj4gKi8KCQkJaWYgKGZsYWdzICYgV0ZfQUZYKQoJCQkgICAgcHV0YyhucC0+d25fYWZmaXhJRCwgZmQpOwkJLyogPGFmZml4SUQ+ICovCgkJICAgIH0KCQl9CgkgICAgfQoJfQoJZWxzZQoJewoJICAgIGlmIChucC0+d25fY2hpbGQtPnduX3UxLmluZGV4ICE9IDAKCQkJCQkgJiYgbnAtPnduX2NoaWxkLT53bl91Mi53bm9kZSAhPSBub2RlKQoJICAgIHsKCQkvKiBUaGUgY2hpbGQgaXMgd3JpdHRlbiBlbHNld2hlcmUsIHdyaXRlIHRoZSByZWZlcmVuY2UuICovCgkJaWYgKGZkICE9IE5VTEwpCgkJewoJCSAgICBwdXRjKEJZX0lOREVYLCBmZCk7CQkJLyogPGJ5dGU+ICovCgkJCQkJCQkvKiA8bm9kZWlkeD4gKi8KCQkgICAgcHV0X2J5dGVzKGZkLCAobG9uZ191KW5wLT53bl9jaGlsZC0+d25fdTEuaW5kZXgsIDMpOwoJCX0KCSAgICB9CgkgICAgZWxzZSBpZiAobnAtPnduX2NoaWxkLT53bl91Mi53bm9kZSA9PSBOVUxMKQoJCS8qIFdlIHdpbGwgd3JpdGUgdGhlIGNoaWxkIGJlbG93IGFuZCBnaXZlIGl0IGFuIGluZGV4LiAqLwoJCW5wLT53bl9jaGlsZC0+d25fdTIud25vZGUgPSBub2RlOwoKCSAgICBpZiAoZmQgIT0gTlVMTCkKCQlpZiAocHV0YyhucC0+d25fYnl0ZSwgZmQpID09IEVPRikgLyogPGJ5dGU+IG9yIDx4Ynl0ZT4gKi8KCQl7CgkJICAgIEVNU0coXyhlX3dyaXRlKSk7CgkJICAgIHJldHVybiAwOwoJCX0KCX0KICAgIH0KCiAgICAvKiBTcGFjZSB1c2VkIGluIHRoZSBhcnJheSB3aGVuIHJlYWRpbmc6IG9uZSBmb3IgZWFjaCBzaWJsaW5nIGFuZCBvbmUgZm9yCiAgICAgKiB0aGUgY291bnQuICovCiAgICBuZXdpbmRleCArPSBzaWJsaW5nY291bnQgKyAxOwoKICAgIC8qIFJlY3Vyc2l2ZWx5IGR1bXAgdGhlIGNoaWxkcmVuIG9mIGVhY2ggc2libGluZy4gKi8KICAgIGZvciAobnAgPSBub2RlOyBucCAhPSBOVUxMOyBucCA9IG5wLT53bl9zaWJsaW5nKQoJaWYgKG5wLT53bl9ieXRlICE9IDAgJiYgbnAtPnduX2NoaWxkLT53bl91Mi53bm9kZSA9PSBub2RlKQoJICAgIG5ld2luZGV4ID0gcHV0X25vZGUoZmQsIG5wLT53bl9jaGlsZCwgbmV3aW5kZXgsIHJlZ2lvbm1hc2ssCgkJCQkJCQkJICBwcmVmaXh0cmVlKTsKCiAgICByZXR1cm4gbmV3aW5kZXg7Cn0KCgovKgogKiAiOm1rc3BlbGwgWy1hc2NpaV0gb3V0ZmlsZSAgaW5maWxlIC4uLiIKICogIjpta3NwZWxsIFstYXNjaWldIGFkZGZpbGUiCiAqLwogICAgdm9pZApleF9ta3NwZWxsKGVhcCkKICAgIGV4YXJnX1QgKmVhcDsKewogICAgaW50CQlmY291bnQ7CiAgICBjaGFyX3UJKipmbmFtZXM7CiAgICBjaGFyX3UJKmFyZyA9IGVhcC0+YXJnOwogICAgaW50CQlhc2NpaSA9IEZBTFNFOwoKICAgIGlmIChTVFJOQ01QKGFyZywgIi1hc2NpaSIsIDYpID09IDApCiAgICB7Cglhc2NpaSA9IFRSVUU7CglhcmcgPSBza2lwd2hpdGUoYXJnICsgNik7CiAgICB9CgogICAgLyogRXhwYW5kIGFsbCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyAoZS5nLiwgJFZJTVJVTlRJTUUpLiAqLwogICAgaWYgKGdldF9hcmdsaXN0X2V4cChhcmcsICZmY291bnQsICZmbmFtZXMpID09IE9LKQogICAgewoJbWtzcGVsbChmY291bnQsIGZuYW1lcywgYXNjaWksIGVhcC0+Zm9yY2VpdCwgRkFMU0UpOwoJRnJlZVdpbGQoZmNvdW50LCBmbmFtZXMpOwogICAgfQp9CgovKgogKiBDcmVhdGUgdGhlIC5zdWcgZmlsZS4KICogVXNlcyB0aGUgc291bmRmb2xkIGluZm8gaW4gInNwaW4iLgogKiBXcml0ZXMgdGhlIGZpbGUgd2l0aCB0aGUgbmFtZSAid2ZuYW1lIiwgd2l0aCAiLnNwbCIgY2hhbmdlZCB0byAiLnN1ZyIuCiAqLwogICAgc3RhdGljIHZvaWQKc3BlbGxfbWFrZV9zdWdmaWxlKHNwaW4sIHdmbmFtZSkKICAgIHNwZWxsaW5mb19UCSpzcGluOwogICAgY2hhcl91CSp3Zm5hbWU7CnsKICAgIGNoYXJfdQlmbmFtZVtNQVhQQVRITF07CiAgICBpbnQJCWxlbjsKICAgIHNsYW5nX1QJKnNsYW5nOwogICAgaW50CQlmcmVlX3NsYW5nID0gRkFMU0U7CgogICAgLyoKICAgICAqIFJlYWQgYmFjayB0aGUgLnNwbCBmaWxlIHRoYXQgd2FzIHdyaXR0ZW4uICBUaGlzIGZpbGxzIHRoZSByZXF1aXJlZAogICAgICogaW5mbyBmb3Igc291bmRmb2xkaW5nLiAgVGhpcyBhbHNvIHVzZXMgbGVzcyBtZW1vcnkgdGhhbiB0aGUKICAgICAqIHBvaW50ZXItbGlua2VkIHZlcnNpb24gb2YgdGhlIHRyaWUuICBBbmQgaXQgYXZvaWRzIGhhdmluZyB0d28gdmVyc2lvbnMKICAgICAqIG9mIHRoZSBjb2RlIGZvciB0aGUgc291bmRmb2xkaW5nIHN0dWZmLgogICAgICogSXQgbWlnaHQgaGF2ZSBiZWVuIGRvbmUgYWxyZWFkeSBieSBzcGVsbF9yZWxvYWRfb25lKCkuCiAgICAgKi8KICAgIGZvciAoc2xhbmcgPSBmaXJzdF9sYW5nOyBzbGFuZyAhPSBOVUxMOyBzbGFuZyA9IHNsYW5nLT5zbF9uZXh0KQoJaWYgKGZ1bGxwYXRoY21wKHdmbmFtZSwgc2xhbmctPnNsX2ZuYW1lLCBGQUxTRSkgPT0gRlBDX1NBTUUpCgkgICAgYnJlYWs7CiAgICBpZiAoc2xhbmcgPT0gTlVMTCkKICAgIHsKCXNwZWxsX21lc3NhZ2Uoc3BpbiwgKGNoYXJfdSAqKV8oIlJlYWRpbmcgYmFjayBzcGVsbCBmaWxlLi4uIikpOwoJc2xhbmcgPSBzcGVsbF9sb2FkX2ZpbGUod2ZuYW1lLCBOVUxMLCBOVUxMLCBGQUxTRSk7CglpZiAoc2xhbmcgPT0gTlVMTCkKCSAgICByZXR1cm47CglmcmVlX3NsYW5nID0gVFJVRTsKICAgIH0KCiAgICAvKgogICAgICogQ2xlYXIgdGhlIGluZm8gaW4gInNwaW4iIHRoYXQgaXMgdXNlZC4KICAgICAqLwogICAgc3Bpbi0+c2lfYmxvY2tzID0gTlVMTDsKICAgIHNwaW4tPnNpX2Jsb2Nrc19jbnQgPSAwOwogICAgc3Bpbi0+c2lfY29tcHJlc3NfY250ID0gMDsJICAgIC8qIHdpbGwgc3RheSBhdCAwIGFsbCB0aGUgdGltZSovCiAgICBzcGluLT5zaV9mcmVlX2NvdW50ID0gMDsKICAgIHNwaW4tPnNpX2ZpcnN0X2ZyZWUgPSBOVUxMOwogICAgc3Bpbi0+c2lfZm9sZHdjb3VudCA9IDA7CgogICAgLyoKICAgICAqIEdvIHRocm91Z2ggdGhlIHRyaWUgb2YgZ29vZCB3b3Jkcywgc291bmRmb2xkIGVhY2ggd29yZCBhbmQgYWRkIGl0IHRvCiAgICAgKiB0aGUgc291bmRmb2xkIHRyaWUuCiAgICAgKi8KICAgIHNwZWxsX21lc3NhZ2Uoc3BpbiwgKGNoYXJfdSAqKV8oIlBlcmZvcm1pbmcgc291bmRmb2xkaW5nLi4uIikpOwogICAgaWYgKHN1Z19maWxsdHJlZShzcGluLCBzbGFuZykgPT0gRkFJTCkKCWdvdG8gdGhlZW5kOwoKICAgIC8qCiAgICAgKiBDcmVhdGUgdGhlIHRhYmxlIHdoaWNoIGxpbmtzIGVhY2ggc291bmRmb2xkIHdvcmQgd2l0aCBhIGxpc3Qgb2YgdGhlCiAgICAgKiBnb29kIHdvcmRzIGl0IG1heSBjb21lIGZyb20uICBDcmVhdGVzIGJ1ZmZlciAic3Bpbi0+c2lfc3BlbGxidWYiLgogICAgICogVGhpcyBhbHNvIHJlbW92ZXMgdGhlIHdvcmRuciBmcm9tIHRoZSBOVUwgYnl0ZSBlbnRyaWVzIHRvIG1ha2UKICAgICAqIGNvbXByZXNzaW9uIHBvc3NpYmxlLgogICAgICovCiAgICBpZiAoc3VnX21ha2V0YWJsZShzcGluKSA9PSBGQUlMKQoJZ290byB0aGVlbmQ7CgogICAgc21zZygoY2hhcl91ICopXygiTnVtYmVyIG9mIHdvcmRzIGFmdGVyIHNvdW5kZm9sZGluZzogJWxkIiksCgkJCQkgKGxvbmcpc3Bpbi0+c2lfc3BlbGxidWYtPmJfbWwubWxfbGluZV9jb3VudCk7CgogICAgLyoKICAgICAqIENvbXByZXNzIHRoZSBzb3VuZGZvbGQgdHJpZS4KICAgICAqLwogICAgc3BlbGxfbWVzc2FnZShzcGluLCAoY2hhcl91ICopXyhtc2dfY29tcHJlc3NpbmcpKTsKICAgIHdvcmR0cmVlX2NvbXByZXNzKHNwaW4sIHNwaW4tPnNpX2ZvbGRyb290KTsKCiAgICAvKgogICAgICogV3JpdGUgdGhlIC5zdWcgZmlsZS4KICAgICAqIE1ha2UgdGhlIGZpbGUgbmFtZSBieSBjaGFuZ2luZyAiLnNwbCIgdG8gIi5zdWciLgogICAgICovCiAgICBTVFJDUFkoZm5hbWUsIHdmbmFtZSk7CiAgICBsZW4gPSBTVFJMRU4oZm5hbWUpOwogICAgZm5hbWVbbGVuIC0gMl0gPSAndSc7CiAgICBmbmFtZVtsZW4gLSAxXSA9ICdnJzsKICAgIHN1Z193cml0ZShzcGluLCBmbmFtZSk7Cgp0aGVlbmQ6CiAgICBpZiAoZnJlZV9zbGFuZykKCXNsYW5nX2ZyZWUoc2xhbmcpOwogICAgZnJlZV9ibG9ja3Moc3Bpbi0+c2lfYmxvY2tzKTsKICAgIGNsb3NlX3NwZWxsYnVmKHNwaW4tPnNpX3NwZWxsYnVmKTsKfQoKLyoKICogQnVpbGQgdGhlIHNvdW5kZm9sZCB0cmllIGZvciBsYW5ndWFnZSAic2xhbmciLgogKi8KICAgIHN0YXRpYyBpbnQKc3VnX2ZpbGx0cmVlKHNwaW4sIHNsYW5nKQogICAgc3BlbGxpbmZvX1QJKnNwaW47CiAgICBzbGFuZ19UCSpzbGFuZzsKewogICAgY2hhcl91CSpieXRzOwogICAgaWR4X1QJKmlkeHM7CiAgICBpbnQJCWRlcHRoOwogICAgaWR4X1QJYXJyaWR4W01BWFdMRU5dOwogICAgaW50CQljdXJpW01BWFdMRU5dOwogICAgY2hhcl91CXR3b3JkW01BWFdMRU5dOwogICAgY2hhcl91CXRzYWx3b3JkW01BWFdMRU5dOwogICAgaW50CQljOwogICAgaWR4X1QJbjsKICAgIHVuc2lnbmVkCXdvcmRzX2RvbmUgPSAwOwogICAgaW50CQl3b3JkY291bnRbTUFYV0xFTl07CgogICAgLyogV2UgdXNlIHNpX2ZvbGRyb290IGZvciB0aGUgc291bGRmb2xkZWQgdHJpZS4gKi8KICAgIHNwaW4tPnNpX2ZvbGRyb290ID0gd29yZHRyZWVfYWxsb2Moc3Bpbik7CiAgICBpZiAoc3Bpbi0+c2lfZm9sZHJvb3QgPT0gTlVMTCkKCXJldHVybiBGQUlMOwoKICAgIC8qIGxldCB0cmVlX2FkZF93b3JkKCkga25vdyB3ZSdyZSBhZGRpbmcgdG8gdGhlIHNvdW5kZm9sZGVkIHRyZWUgKi8KICAgIHNwaW4tPnNpX3N1Z3RyZWUgPSBUUlVFOwoKICAgIC8qCiAgICAgKiBHbyB0aHJvdWdoIHRoZSB3aG9sZSBjYXNlLWZvbGRlZCB0cmVlLCBzb3VuZGZvbGQgZWFjaCB3b3JkIGFuZCBwdXQgaXQKICAgICAqIGluIHRoZSB0cmllLgogICAgICovCiAgICBieXRzID0gc2xhbmctPnNsX2ZieXRzOwogICAgaWR4cyA9IHNsYW5nLT5zbF9maWR4czsKCiAgICBhcnJpZHhbMF0gPSAwOwogICAgY3VyaVswXSA9IDE7CiAgICB3b3JkY291bnRbMF0gPSAwOwoKICAgIGRlcHRoID0gMDsKICAgIHdoaWxlIChkZXB0aCA+PSAwICYmICFnb3RfaW50KQogICAgewoJaWYgKGN1cmlbZGVwdGhdID4gYnl0c1thcnJpZHhbZGVwdGhdXSkKCXsKCSAgICAvKiBEb25lIGFsbCBieXRlcyBhdCB0aGlzIG5vZGUsIGdvIHVwIG9uZSBsZXZlbC4gKi8KCSAgICBpZHhzW2FycmlkeFtkZXB0aF1dID0gd29yZGNvdW50W2RlcHRoXTsKCSAgICBpZiAoZGVwdGggPiAwKQoJCXdvcmRjb3VudFtkZXB0aCAtIDFdICs9IHdvcmRjb3VudFtkZXB0aF07CgoJICAgIC0tZGVwdGg7CgkgICAgbGluZV9icmVha2NoZWNrKCk7Cgl9CgllbHNlCgl7CgoJICAgIC8qIERvIG9uZSBtb3JlIGJ5dGUgYXQgdGhpcyBub2RlLiAqLwoJICAgIG4gPSBhcnJpZHhbZGVwdGhdICsgY3VyaVtkZXB0aF07CgkgICAgKytjdXJpW2RlcHRoXTsKCgkgICAgYyA9IGJ5dHNbbl07CgkgICAgaWYgKGMgPT0gMCkKCSAgICB7CgkJLyogU291bmQtZm9sZCB0aGUgd29yZC4gKi8KCQl0d29yZFtkZXB0aF0gPSBOVUw7CgkJc3BlbGxfc291bmRmb2xkKHNsYW5nLCB0d29yZCwgVFJVRSwgdHNhbHdvcmQpOwoKCQkvKiBXZSB1c2UgdGhlICJmbGFncyIgZmllbGQgZm9yIHRoZSBNU0Igb2YgdGhlIHdvcmRuciwKCQkgKiAicmVnaW9uIiBmb3IgdGhlIExTQiBvZiB0aGUgd29yZG5yLiAgKi8KCQlpZiAodHJlZV9hZGRfd29yZChzcGluLCB0c2Fsd29yZCwgc3Bpbi0+c2lfZm9sZHJvb3QsCgkJCQl3b3Jkc19kb25lID4+IDE2LCB3b3Jkc19kb25lICYgMHhmZmZmLAoJCQkJCQkJICAgMCkgPT0gRkFJTCkKCQkgICAgcmV0dXJuIEZBSUw7CgoJCSsrd29yZHNfZG9uZTsKCQkrK3dvcmRjb3VudFtkZXB0aF07CgoJCS8qIFJlc2V0IHRoZSBibG9jayBjb3VudCBlYWNoIHRpbWUgdG8gYXZvaWQgY29tcHJlc3Npb24KCQkgKiBraWNraW5nIGluLiAqLwoJCXNwaW4tPnNpX2Jsb2Nrc19jbnQgPSAwOwoKCQkvKiBTa2lwIG92ZXIgYW55IG90aGVyIE5VTCBieXRlcyAoc2FtZSB3b3JkIHdpdGggZGlmZmVyZW50CgkJICogZmxhZ3MpLiAqLwoJCXdoaWxlIChieXRzW24gKyAxXSA9PSAwKQoJCXsKCQkgICAgKytuOwoJCSAgICArK2N1cmlbZGVwdGhdOwoJCX0KCSAgICB9CgkgICAgZWxzZQoJICAgIHsKCQkvKiBOb3JtYWwgY2hhciwgZ28gb25lIGxldmVsIGRlZXBlci4gKi8KCQl0d29yZFtkZXB0aCsrXSA9IGM7CgkJYXJyaWR4W2RlcHRoXSA9IGlkeHNbbl07CgkJY3VyaVtkZXB0aF0gPSAxOwoJCXdvcmRjb3VudFtkZXB0aF0gPSAwOwoJICAgIH0KCX0KICAgIH0KCiAgICBzbXNnKChjaGFyX3UgKilfKCJUb3RhbCBudW1iZXIgb2Ygd29yZHM6ICVkIiksIHdvcmRzX2RvbmUpOwoKICAgIHJldHVybiBPSzsKfQoKLyoKICogTWFrZSB0aGUgdGFibGUgdGhhdCBsaW5rcyBlYWNoIHdvcmQgaW4gdGhlIHNvdW5kZm9sZCB0cmllIHRvIHRoZSB3b3JkcyBpdAogKiBjYW4gYmUgcHJvZHVjZWQgZnJvbS4KICogVGhpcyBpcyBub3QgdW5saWtlIGxpbmVzIGluIGEgZmlsZSwgdGh1cyB1c2UgYSBtZW1maWxlIHRvIGJlIGFibGUgdG8gYWNjZXNzCiAqIHRoZSB0YWJsZSBlZmZpY2llbnRseS4KICogUmV0dXJucyBGQUlMIHdoZW4gb3V0IG9mIG1lbW9yeS4KICovCiAgICBzdGF0aWMgaW50CnN1Z19tYWtldGFibGUoc3BpbikKICAgIHNwZWxsaW5mb19UCSpzcGluOwp7CiAgICBnYXJyYXlfVAlnYTsKICAgIGludAkJcmVzID0gT0s7CgogICAgLyogQWxsb2NhdGUgYSBidWZmZXIsIG9wZW4gYSBtZW1saW5lIGZvciBpdCBhbmQgY3JlYXRlIHRoZSBzd2FwIGZpbGUKICAgICAqICh1c2VzIGEgdGVtcCBmaWxlLCBub3QgYSAuc3dwIGZpbGUpLiAqLwogICAgc3Bpbi0+c2lfc3BlbGxidWYgPSBvcGVuX3NwZWxsYnVmKCk7CiAgICBpZiAoc3Bpbi0+c2lfc3BlbGxidWYgPT0gTlVMTCkKCXJldHVybiBGQUlMOwoKICAgIC8qIFVzZSBhIGJ1ZmZlciB0byBzdG9yZSB0aGUgbGluZSBpbmZvLCBhdm9pZHMgYWxsb2NhdGluZyBtYW55IHNtYWxsCiAgICAgKiBwaWVjZXMgb2YgbWVtb3J5LiAqLwogICAgZ2FfaW5pdDIoJmdhLCAxLCAxMDApOwoKICAgIC8qIHJlY3Vyc2l2ZWx5IGdvIHRocm91Z2ggdGhlIHRyZWUgKi8KICAgIGlmIChzdWdfZmlsbHRhYmxlKHNwaW4sIHNwaW4tPnNpX2ZvbGRyb290LT53bl9zaWJsaW5nLCAwLCAmZ2EpID09IC0xKQoJcmVzID0gRkFJTDsKCiAgICBnYV9jbGVhcigmZ2EpOwogICAgcmV0dXJuIHJlczsKfQoKLyoKICogRmlsbCB0aGUgdGFibGUgZm9yIG9uZSBub2RlIGFuZCBpdHMgY2hpbGRyZW4uCiAqIFJldHVybnMgdGhlIHdvcmRuciBhdCB0aGUgc3RhcnQgb2YgdGhlIG5vZGUuCiAqIFJldHVybnMgLTEgd2hlbiBvdXQgb2YgbWVtb3J5LgogKi8KICAgIHN0YXRpYyBpbnQKc3VnX2ZpbGx0YWJsZShzcGluLCBub2RlLCBzdGFydHdvcmRuciwgZ2FwKQogICAgc3BlbGxpbmZvX1QJKnNwaW47CiAgICB3b3Jkbm9kZV9UCSpub2RlOwogICAgaW50CQlzdGFydHdvcmRucjsKICAgIGdhcnJheV9UCSpnYXA7CSAgICAvKiBwbGFjZSB0byBzdG9yZSBsaW5lIG9mIG51bWJlcnMgKi8KewogICAgd29yZG5vZGVfVAkqcCwgKm5wOwogICAgaW50CQl3b3JkbnIgPSBzdGFydHdvcmRucjsKICAgIGludAkJbnI7CiAgICBpbnQJCXByZXZfbnI7CgogICAgZm9yIChwID0gbm9kZTsgcCAhPSBOVUxMOyBwID0gcC0+d25fc2libGluZykKICAgIHsKCWlmIChwLT53bl9ieXRlID09IE5VTCkKCXsKCSAgICBnYXAtPmdhX2xlbiA9IDA7CgkgICAgcHJldl9uciA9IDA7CgkgICAgZm9yIChucCA9IHA7IG5wICE9IE5VTEwgJiYgbnAtPnduX2J5dGUgPT0gTlVMOyBucCA9IG5wLT53bl9zaWJsaW5nKQoJICAgIHsKCQlpZiAoZ2FfZ3JvdyhnYXAsIDEwKSA9PSBGQUlMKQoJCSAgICByZXR1cm4gLTE7CgoJCW5yID0gKG5wLT53bl9mbGFncyA8PCAxNikgKyAobnAtPnduX3JlZ2lvbiAmIDB4ZmZmZik7CgkJLyogQ29tcHV0ZSB0aGUgb2Zmc2V0IGZyb20gdGhlIHByZXZpb3VzIG5yIGFuZCBzdG9yZSB0aGUKCQkgKiBvZmZzZXQgaW4gYSB3YXkgdGhhdCBpdCB0YWtlcyBhIG1pbmltdW0gbnVtYmVyIG9mIGJ5dGVzLgoJCSAqIEl0J3MgYSBiaXQgbGlrZSB1dGYtOCwgYnV0IHdpdGhvdXQgdGhlIG5lZWQgdG8gbWFyawoJCSAqIGZvbGxvd2luZyBieXRlcy4gKi8KCQluciAtPSBwcmV2X25yOwoJCXByZXZfbnIgKz0gbnI7CgkJZ2FwLT5nYV9sZW4gKz0gb2Zmc2V0MmJ5dGVzKG5yLAoJCQkJCSAoY2hhcl91ICopZ2FwLT5nYV9kYXRhICsgZ2FwLT5nYV9sZW4pOwoJICAgIH0KCgkgICAgLyogYWRkIHRoZSBOVUwgYnl0ZSAqLwoJICAgICgoY2hhcl91ICopZ2FwLT5nYV9kYXRhKVtnYXAtPmdhX2xlbisrXSA9IE5VTDsKCgkgICAgaWYgKG1sX2FwcGVuZF9idWYoc3Bpbi0+c2lfc3BlbGxidWYsIChsaW5lbnJfVCl3b3JkbnIsCgkJCQkgICAgIGdhcC0+Z2FfZGF0YSwgZ2FwLT5nYV9sZW4sIFRSVUUpID09IEZBSUwpCgkJcmV0dXJuIC0xOwoJICAgICsrd29yZG5yOwoKCSAgICAvKiBSZW1vdmUgZXh0cmEgTlVMIGVudHJpZXMsIHdlIG5vIGxvbmdlciBuZWVkIHRoZW0uIFdlIGRvbid0CgkgICAgICogYm90aGVyIGZyZWVpbmcgdGhlIG5vZGVzLCB0aGUgd29uJ3QgYmUgcmV1c2VkIGFueXdheS4gKi8KCSAgICB3aGlsZSAocC0+d25fc2libGluZyAhPSBOVUxMICYmIHAtPnduX3NpYmxpbmctPnduX2J5dGUgPT0gTlVMKQoJCXAtPnduX3NpYmxpbmcgPSBwLT53bl9zaWJsaW5nLT53bl9zaWJsaW5nOwoKCSAgICAvKiBDbGVhciB0aGUgZmxhZ3Mgb24gdGhlIHJlbWFpbmluZyBOVUwgbm9kZSwgc28gdGhhdCBjb21wcmVzc2lvbgoJICAgICAqIHdvcmtzIGEgbG90IGJldHRlci4gKi8KCSAgICBwLT53bl9mbGFncyA9IDA7CgkgICAgcC0+d25fcmVnaW9uID0gMDsKCX0KCWVsc2UKCXsKCSAgICB3b3JkbnIgPSBzdWdfZmlsbHRhYmxlKHNwaW4sIHAtPnduX2NoaWxkLCB3b3JkbnIsIGdhcCk7CgkgICAgaWYgKHdvcmRuciA9PSAtMSkKCQlyZXR1cm4gLTE7Cgl9CiAgICB9CiAgICByZXR1cm4gd29yZG5yOwp9CgovKgogKiBDb252ZXJ0IGFuIG9mZnNldCBpbnRvIGEgbWluaW1hbCBudW1iZXIgb2YgYnl0ZXMuCiAqIFNpbWlsYXIgdG8gdXRmX2NoYXIyYnl0ZXJzLCBidXQgdXNlIDggYml0cyBpbiBmb2xsb3d1cCBieXRlcyBhbmQgYXZvaWQgTlVMCiAqIGJ5dGVzLgogKi8KICAgIHN0YXRpYyBpbnQKb2Zmc2V0MmJ5dGVzKG5yLCBidWYpCiAgICBpbnQJICAgIG5yOwogICAgY2hhcl91ICAqYnVmOwp7CiAgICBpbnQJICAgIHJlbTsKICAgIGludAkgICAgYjEsIGIyLCBiMywgYjQ7CgogICAgLyogU3BsaXQgdGhlIG51bWJlciBpbiBwYXJ0cyBvZiBiYXNlIDI1NS4gIFdlIG5lZWQgdG8gYXZvaWQgTlVMIGJ5dGVzLiAqLwogICAgYjEgPSBuciAlIDI1NSArIDE7CiAgICByZW0gPSBuciAvIDI1NTsKICAgIGIyID0gcmVtICUgMjU1ICsgMTsKICAgIHJlbSA9IHJlbSAvIDI1NTsKICAgIGIzID0gcmVtICUgMjU1ICsgMTsKICAgIGI0ID0gcmVtIC8gMjU1ICsgMTsKCiAgICBpZiAoYjQgPiAxIHx8IGIzID4gMHgxZikJLyogNCBieXRlcyAqLwogICAgewoJYnVmWzBdID0gMHhlMCArIGI0OwoJYnVmWzFdID0gYjM7CglidWZbMl0gPSBiMjsKCWJ1ZlszXSA9IGIxOwoJcmV0dXJuIDQ7CiAgICB9CiAgICBpZiAoYjMgPiAxIHx8IGIyID4gMHgzZiApCS8qIDMgYnl0ZXMgKi8KICAgIHsKCWJ1ZlswXSA9IDB4YzAgKyBiMzsKCWJ1ZlsxXSA9IGIyOwoJYnVmWzJdID0gYjE7CglyZXR1cm4gMzsKICAgIH0KICAgIGlmIChiMiA+IDEgfHwgYjEgPiAweDdmICkJLyogMiBieXRlcyAqLwogICAgewoJYnVmWzBdID0gMHg4MCArIGIyOwoJYnVmWzFdID0gYjE7CglyZXR1cm4gMjsKICAgIH0KCQkJCS8qIDEgYnl0ZSAqLwogICAgYnVmWzBdID0gYjE7CiAgICByZXR1cm4gMTsKfQoKLyoKICogT3Bwb3NpdGUgb2Ygb2Zmc2V0MmJ5dGVzKCkuCiAqICJwcCIgcG9pbnRzIHRvIHRoZSBieXRlcyBhbmQgaXMgYWR2YW5jZWQgb3ZlciBpdC4KICogUmV0dXJucyB0aGUgb2Zmc2V0LgogKi8KICAgIHN0YXRpYyBpbnQKYnl0ZXMyb2Zmc2V0KHBwKQogICAgY2hhcl91CSoqcHA7CnsKICAgIGNoYXJfdQkqcCA9ICpwcDsKICAgIGludAkJbnI7CiAgICBpbnQJCWM7CgogICAgYyA9ICpwKys7CiAgICBpZiAoKGMgJiAweDgwKSA9PSAweDAwKQkJLyogMSBieXRlICovCiAgICB7CgluciA9IGMgLSAxOwogICAgfQogICAgZWxzZSBpZiAoKGMgJiAweGMwKSA9PSAweDgwKQkvKiAyIGJ5dGVzICovCiAgICB7CgluciA9IChjICYgMHgzZikgLSAxOwoJbnIgPSBuciAqIDI1NSArICgqcCsrIC0gMSk7CiAgICB9CiAgICBlbHNlIGlmICgoYyAmIDB4ZTApID09IDB4YzApCS8qIDMgYnl0ZXMgKi8KICAgIHsKCW5yID0gKGMgJiAweDFmKSAtIDE7CgluciA9IG5yICogMjU1ICsgKCpwKysgLSAxKTsKCW5yID0gbnIgKiAyNTUgKyAoKnArKyAtIDEpOwogICAgfQogICAgZWxzZQkJCQkvKiA0IGJ5dGVzICovCiAgICB7CgluciA9IChjICYgMHgwZikgLSAxOwoJbnIgPSBuciAqIDI1NSArICgqcCsrIC0gMSk7CgluciA9IG5yICogMjU1ICsgKCpwKysgLSAxKTsKCW5yID0gbnIgKiAyNTUgKyAoKnArKyAtIDEpOwogICAgfQoKICAgICpwcCA9IHA7CiAgICByZXR1cm4gbnI7Cn0KCi8qCiAqIFdyaXRlIHRoZSAuc3VnIGZpbGUgaW4gImZuYW1lIi4KICovCiAgICBzdGF0aWMgdm9pZApzdWdfd3JpdGUoc3BpbiwgZm5hbWUpCiAgICBzcGVsbGluZm9fVAkqc3BpbjsKICAgIGNoYXJfdQkqZm5hbWU7CnsKICAgIEZJTEUJKmZkOwogICAgd29yZG5vZGVfVAkqdHJlZTsKICAgIGludAkJbm9kZWNvdW50OwogICAgaW50CQl3Y291bnQ7CiAgICBjaGFyX3UJKmxpbmU7CiAgICBsaW5lbnJfVAlsbnVtOwogICAgaW50CQlsZW47CgogICAgLyogQ3JlYXRlIHRoZSBmaWxlLiAgTm90ZSB0aGF0IGFuIGV4aXN0aW5nIGZpbGUgaXMgc2lsZW50bHkgb3ZlcndyaXR0ZW4hICovCiAgICBmZCA9IG1jaF9mb3BlbigoY2hhciAqKWZuYW1lLCAidyIpOwogICAgaWYgKGZkID09IE5VTEwpCiAgICB7CglFTVNHMihfKGVfbm90b3BlbiksIGZuYW1lKTsKCXJldHVybjsKICAgIH0KCiAgICB2aW1fc25wcmludGYoKGNoYXIgKilJT2J1ZmYsIElPU0laRSwKCQkJCSAgXygiV3JpdGluZyBzdWdnZXN0aW9uIGZpbGUgJXMgLi4uIiksIGZuYW1lKTsKICAgIHNwZWxsX21lc3NhZ2Uoc3BpbiwgSU9idWZmKTsKCiAgICAvKgogICAgICogPFNVR0hFQURFUj46IDxmaWxlSUQ+IDx2ZXJzaW9ubnI+IDx0aW1lc3RhbXA+CiAgICAgKi8KICAgIGlmIChmd3JpdGUoVklNU1VHTUFHSUMsIFZJTVNVR01BR0lDTCwgKHNpemVfdCkxLCBmZCkgIT0gMSkgLyogPGZpbGVJRD4gKi8KICAgIHsKCUVNU0coXyhlX3dyaXRlKSk7Cglnb3RvIHRoZWVuZDsKICAgIH0KICAgIHB1dGMoVklNU1VHVkVSU0lPTiwgZmQpOwkJCQkvKiA8dmVyc2lvbm5yPiAqLwoKICAgIC8qIFdyaXRlIHNpX3N1Z3RpbWUgdG8gdGhlIGZpbGUuICovCiAgICBwdXRfc3VndGltZShzcGluLCBmZCk7CQkJCS8qIDx0aW1lc3RhbXA+ICovCgogICAgLyoKICAgICAqIDxTVUdXT1JEVFJFRT4KICAgICAqLwogICAgc3Bpbi0+c2lfbWVtdG90ID0gMDsKICAgIHRyZWUgPSBzcGluLT5zaV9mb2xkcm9vdC0+d25fc2libGluZzsKCiAgICAvKiBDbGVhciB0aGUgaW5kZXggYW5kIHdub2RlIGZpZWxkcyBpbiB0aGUgdHJlZS4gKi8KICAgIGNsZWFyX25vZGUodHJlZSk7CgogICAgLyogQ291bnQgdGhlIG51bWJlciBvZiBub2Rlcy4gIE5lZWRlZCB0byBiZSBhYmxlIHRvIGFsbG9jYXRlIHRoZQogICAgICogbWVtb3J5IHdoZW4gcmVhZGluZyB0aGUgbm9kZXMuICBBbHNvIGZpbGxzIGluIGluZGV4IGZvciBzaGFyZWQKICAgICAqIG5vZGVzLiAqLwogICAgbm9kZWNvdW50ID0gcHV0X25vZGUoTlVMTCwgdHJlZSwgMCwgMCwgRkFMU0UpOwoKICAgIC8qIG51bWJlciBvZiBub2RlcyBpbiA0IGJ5dGVzICovCiAgICBwdXRfYnl0ZXMoZmQsIChsb25nX3Upbm9kZWNvdW50LCA0KTsJLyogPG5vZGVjb3VudD4gKi8KICAgIHNwaW4tPnNpX21lbXRvdCArPSBub2RlY291bnQgKyBub2RlY291bnQgKiBzaXplb2YoaW50KTsKCiAgICAvKiBXcml0ZSB0aGUgbm9kZXMuICovCiAgICAodm9pZClwdXRfbm9kZShmZCwgdHJlZSwgMCwgMCwgRkFMU0UpOwoKICAgIC8qCiAgICAgKiA8U1VHVEFCTEU+OiA8c3Vnd2NvdW50PiA8c3VnbGluZT4gLi4uCiAgICAgKi8KICAgIHdjb3VudCA9IHNwaW4tPnNpX3NwZWxsYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7CiAgICBwdXRfYnl0ZXMoZmQsIChsb25nX3Upd2NvdW50LCA0KTsJLyogPHN1Z3djb3VudD4gKi8KCiAgICBmb3IgKGxudW0gPSAxOyBsbnVtIDw9IChsaW5lbnJfVCl3Y291bnQ7ICsrbG51bSkKICAgIHsKCS8qIDxzdWdsaW5lPjogPHN1Z25yPiAuLi4gTlVMICovCglsaW5lID0gbWxfZ2V0X2J1ZihzcGluLT5zaV9zcGVsbGJ1ZiwgbG51bSwgRkFMU0UpOwoJbGVuID0gU1RSTEVOKGxpbmUpICsgMTsKCWlmIChmd3JpdGUobGluZSwgKHNpemVfdClsZW4sIChzaXplX3QpMSwgZmQpID09IDApCgl7CgkgICAgRU1TRyhfKGVfd3JpdGUpKTsKCSAgICBnb3RvIHRoZWVuZDsKCX0KCXNwaW4tPnNpX21lbXRvdCArPSBsZW47CiAgICB9CgogICAgLyogV3JpdGUgYW5vdGhlciBieXRlIHRvIGNoZWNrIGZvciBlcnJvcnMuICovCiAgICBpZiAocHV0YygwLCBmZCkgPT0gRU9GKQoJRU1TRyhfKGVfd3JpdGUpKTsKCiAgICB2aW1fc25wcmludGYoKGNoYXIgKilJT2J1ZmYsIElPU0laRSwKCQkgXygiRXN0aW1hdGVkIHJ1bnRpbWUgbWVtb3J5IHVzZTogJWQgYnl0ZXMiKSwgc3Bpbi0+c2lfbWVtdG90KTsKICAgIHNwZWxsX21lc3NhZ2Uoc3BpbiwgSU9idWZmKTsKCnRoZWVuZDoKICAgIC8qIGNsb3NlIHRoZSBmaWxlICovCiAgICBmY2xvc2UoZmQpOwp9CgovKgogKiBPcGVuIGEgc3BlbGwgYnVmZmVyLiAgVGhpcyBpcyBhIG5hbWVsZXNzIGJ1ZmZlciB0aGF0IGlzIG5vdCBpbiB0aGUgYnVmZmVyCiAqIGxpc3QgYW5kIG9ubHkgY29udGFpbnMgdGV4dCBsaW5lcy4gIENhbiB1c2UgYSBzd2FwZmlsZSB0byByZWR1Y2UgbWVtb3J5CiAqIHVzZS4KICogTW9zdCBvdGhlciBmaWVsZHMgYXJlIGludmFsaWQhICBFc3AuIHdhdGNoIG91dCBmb3Igc3RyaW5nIG9wdGlvbnMgYmVpbmcKICogTlVMTCBhbmQgdGhlcmUgaXMgbm8gdW5kbyBpbmZvLgogKiBSZXR1cm5zIE5VTEwgd2hlbiBvdXQgb2YgbWVtb3J5LgogKi8KICAgIHN0YXRpYyBidWZfVCAqCm9wZW5fc3BlbGxidWYoKQp7CiAgICBidWZfVAkqYnVmOwoKICAgIGJ1ZiA9IChidWZfVCAqKWFsbG9jX2NsZWFyKHNpemVvZihidWZfVCkpOwogICAgaWYgKGJ1ZiAhPSBOVUxMKQogICAgewoJYnVmLT5iX3NwZWxsID0gVFJVRTsKCWJ1Zi0+Yl9wX3N3ZiA9IFRSVUU7CS8qIG1heSBjcmVhdGUgYSBzd2FwIGZpbGUgKi8KCW1sX29wZW4oYnVmKTsKCW1sX29wZW5fZmlsZShidWYpOwkvKiBjcmVhdGUgc3dhcCBmaWxlIG5vdyAqLwogICAgfQogICAgcmV0dXJuIGJ1ZjsKfQoKLyoKICogQ2xvc2UgdGhlIGJ1ZmZlciB1c2VkIGZvciBzcGVsbCBpbmZvLgogKi8KICAgIHN0YXRpYyB2b2lkCmNsb3NlX3NwZWxsYnVmKGJ1ZikKICAgIGJ1Zl9UCSpidWY7CnsKICAgIGlmIChidWYgIT0gTlVMTCkKICAgIHsKCW1sX2Nsb3NlKGJ1ZiwgVFJVRSk7Cgl2aW1fZnJlZShidWYpOwogICAgfQp9CgoKLyoKICogQ3JlYXRlIGEgVmltIHNwZWxsIGZpbGUgZnJvbSBvbmUgb3IgbW9yZSB3b3JkIGxpc3RzLgogKiAiZm5hbWVzWzBdIiBpcyB0aGUgb3V0cHV0IGZpbGUgbmFtZS4KICogImZuYW1lc1tmY291bnQgLSAxXSIgaXMgdGhlIGxhc3QgaW5wdXQgZmlsZSBuYW1lLgogKiBFeGNlcHRpb246IHdoZW4gImZuYW1lc1swXSIgZW5kcyBpbiAiLmFkZCIgaXQncyB1c2VkIGFzIHRoZSBpbnB1dCBmaWxlIG5hbWUKICogYW5kICIuc3BsIiBpcyBhcHBlbmRlZCB0byBtYWtlIHRoZSBvdXRwdXQgZmlsZSBuYW1lLgogKi8KICAgIHN0YXRpYyB2b2lkCm1rc3BlbGwoZmNvdW50LCBmbmFtZXMsIGFzY2lpLCBvdmVyd3JpdGUsIGFkZGVkX3dvcmQpCiAgICBpbnQJCWZjb3VudDsKICAgIGNoYXJfdQkqKmZuYW1lczsKICAgIGludAkJYXNjaWk7CQkgICAgLyogLWFzY2lpIGFyZ3VtZW50IGdpdmVuICovCiAgICBpbnQJCW92ZXJ3cml0ZTsJICAgIC8qIG92ZXJ3cml0ZSBleGlzdGluZyBvdXRwdXQgZmlsZSAqLwogICAgaW50CQlhZGRlZF93b3JkOwkgICAgLyogaW52b2tlZCB0aHJvdWdoICJ6ZyIgKi8KewogICAgY2hhcl91CWZuYW1lW01BWFBBVEhMXTsKICAgIGNoYXJfdQl3Zm5hbWVbTUFYUEFUSExdOwogICAgY2hhcl91CSoqaW5uYW1lczsKICAgIGludAkJaW5jb3VudDsKICAgIGFmZmZpbGVfVAkqKGFmaWxlWzhdKTsKICAgIGludAkJaTsKICAgIGludAkJbGVuOwogICAgc3RydWN0IHN0YXQJc3Q7CiAgICBpbnQJCWVycm9yID0gRkFMU0U7CiAgICBzcGVsbGluZm9fVCBzcGluOwoKICAgIHZpbV9tZW1zZXQoJnNwaW4sIDAsIHNpemVvZihzcGluKSk7CiAgICBzcGluLnNpX3ZlcmJvc2UgPSAhYWRkZWRfd29yZDsKICAgIHNwaW4uc2lfYXNjaWkgPSBhc2NpaTsKICAgIHNwaW4uc2lfZm9sbG93dXAgPSBUUlVFOwogICAgc3Bpbi5zaV9yZW1fYWNjZW50cyA9IFRSVUU7CiAgICBnYV9pbml0Migmc3Bpbi5zaV9yZXAsIChpbnQpc2l6ZW9mKGZyb210b19UKSwgMjApOwogICAgZ2FfaW5pdDIoJnNwaW4uc2lfcmVwc2FsLCAoaW50KXNpemVvZihmcm9tdG9fVCksIDIwKTsKICAgIGdhX2luaXQyKCZzcGluLnNpX3NhbCwgKGludClzaXplb2YoZnJvbXRvX1QpLCAyMCk7CiAgICBnYV9pbml0Migmc3Bpbi5zaV9tYXAsIChpbnQpc2l6ZW9mKGNoYXJfdSksIDEwMCk7CiAgICBnYV9pbml0Migmc3Bpbi5zaV9jb21wcGF0LCAoaW50KXNpemVvZihjaGFyX3UgKiksIDIwKTsKICAgIGdhX2luaXQyKCZzcGluLnNpX3ByZWZjb25kLCAoaW50KXNpemVvZihjaGFyX3UgKiksIDUwKTsKICAgIGhhc2hfaW5pdCgmc3Bpbi5zaV9jb21tb253b3Jkcyk7CiAgICBzcGluLnNpX25ld2NvbXBJRCA9IDEyNzsJLyogc3RhcnQgY29tcG91bmQgSUQgYXQgZmlyc3QgbWF4aW11bSAqLwoKICAgIC8qIGRlZmF1bHQ6IGZuYW1lc1swXSBpcyBvdXRwdXQgZmlsZSwgZm9sbG93aW5nIGFyZSBpbnB1dCBmaWxlcyAqLwogICAgaW5uYW1lcyA9ICZmbmFtZXNbMV07CiAgICBpbmNvdW50ID0gZmNvdW50IC0gMTsKCiAgICBpZiAoZmNvdW50ID49IDEpCiAgICB7CglsZW4gPSBTVFJMRU4oZm5hbWVzWzBdKTsKCWlmIChmY291bnQgPT0gMSAmJiBsZW4gPiA0ICYmIFNUUkNNUChmbmFtZXNbMF0gKyBsZW4gLSA0LCAiLmFkZCIpID09IDApCgl7CgkgICAgLyogRm9yICI6bWtzcGVsbCBwYXRoL2VuLmxhdGluMS5hZGQiIG91dHB1dCBmaWxlIGlzCgkgICAgICogInBhdGgvZW4ubGF0aW4xLmFkZC5zcGwiLiAqLwoJICAgIGlubmFtZXMgPSAmZm5hbWVzWzBdOwoJICAgIGluY291bnQgPSAxOwoJICAgIHZpbV9zbnByaW50ZigoY2hhciAqKXdmbmFtZSwgc2l6ZW9mKHdmbmFtZSksICIlcy5zcGwiLCBmbmFtZXNbMF0pOwoJfQoJZWxzZSBpZiAoZmNvdW50ID09IDEpCgl7CgkgICAgLyogRm9yICI6bWtzcGVsbCBwYXRoL3ZpbSIgb3V0cHV0IGZpbGUgaXMgInBhdGgvdmltLmxhdGluMS5zcGwiLiAqLwoJICAgIGlubmFtZXMgPSAmZm5hbWVzWzBdOwoJICAgIGluY291bnQgPSAxOwoJICAgIHZpbV9zbnByaW50ZigoY2hhciAqKXdmbmFtZSwgc2l6ZW9mKHdmbmFtZSksICIlcy4lcy5zcGwiLCBmbmFtZXNbMF0sCgkJCSAgICAgc3Bpbi5zaV9hc2NpaSA/IChjaGFyX3UgKikiYXNjaWkiIDogc3BlbGxfZW5jKCkpOwoJfQoJZWxzZSBpZiAobGVuID4gNCAmJiBTVFJDTVAoZm5hbWVzWzBdICsgbGVuIC0gNCwgIi5zcGwiKSA9PSAwKQoJewoJICAgIC8qIE5hbWUgZW5kcyBpbiAiLnNwbCIsIHVzZSBhcyB0aGUgZmlsZSBuYW1lLiAqLwoJICAgIHZpbV9zdHJuY3B5KHdmbmFtZSwgZm5hbWVzWzBdLCBzaXplb2Yod2ZuYW1lKSAtIDEpOwoJfQoJZWxzZQoJICAgIC8qIE5hbWUgc2hvdWxkIGJlIGxhbmd1YWdlLCBtYWtlIHRoZSBmaWxlIG5hbWUgZnJvbSBpdC4gKi8KCSAgICB2aW1fc25wcmludGYoKGNoYXIgKil3Zm5hbWUsIHNpemVvZih3Zm5hbWUpLCAiJXMuJXMuc3BsIiwgZm5hbWVzWzBdLAoJCQkgICAgIHNwaW4uc2lfYXNjaWkgPyAoY2hhcl91ICopImFzY2lpIiA6IHNwZWxsX2VuYygpKTsKCgkvKiBDaGVjayBmb3IgLmFzY2lpLnNwbC4gKi8KCWlmIChzdHJzdHIoKGNoYXIgKilnZXR0YWlsKHdmbmFtZSksICIuYXNjaWkuIikgIT0gTlVMTCkKCSAgICBzcGluLnNpX2FzY2lpID0gVFJVRTsKCgkvKiBDaGVjayBmb3IgLmFkZC5zcGwuICovCglpZiAoc3Ryc3RyKChjaGFyICopZ2V0dGFpbCh3Zm5hbWUpLCAiLmFkZC4iKSAhPSBOVUxMKQoJICAgIHNwaW4uc2lfYWRkID0gVFJVRTsKICAgIH0KCiAgICBpZiAoaW5jb3VudCA8PSAwKQoJRU1TRyhfKGVfaW52YXJnKSk7CS8qIG5lZWQgYXQgbGVhc3Qgb3V0cHV0IGFuZCBpbnB1dCBuYW1lcyAqLwogICAgZWxzZSBpZiAodmltX3N0cmNocihnZXR0YWlsKHdmbmFtZSksICdfJykgIT0gTlVMTCkKCUVNU0coXygiRTc1MTogT3V0cHV0IGZpbGUgbmFtZSBtdXN0IG5vdCBoYXZlIHJlZ2lvbiBuYW1lIikpOwogICAgZWxzZSBpZiAoaW5jb3VudCA+IDgpCglFTVNHKF8oIkU3NTQ6IE9ubHkgdXAgdG8gOCByZWdpb25zIHN1cHBvcnRlZCIpKTsKICAgIGVsc2UKICAgIHsKCS8qIENoZWNrIGZvciBvdmVyd3JpdGluZyBiZWZvcmUgZG9pbmcgdGhpbmdzIHRoYXQgbWF5IHRha2UgYSBsb3Qgb2YKCSAqIHRpbWUuICovCglpZiAoIW92ZXJ3cml0ZSAmJiBtY2hfc3RhdCgoY2hhciAqKXdmbmFtZSwgJnN0KSA+PSAwKQoJewoJICAgIEVNU0coXyhlX2V4aXN0cykpOwoJICAgIHJldHVybjsKCX0KCWlmIChtY2hfaXNkaXIod2ZuYW1lKSkKCXsKCSAgICBFTVNHMihfKGVfaXNhZGlyMiksIHdmbmFtZSk7CgkgICAgcmV0dXJuOwoJfQoKCS8qCgkgKiBJbml0IHRoZSBhZmYgYW5kIGRpYyBwb2ludGVycy4KCSAqIEdldCB0aGUgcmVnaW9uIG5hbWVzIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gMiBhcmd1bWVudHMuCgkgKi8KCWZvciAoaSA9IDA7IGkgPCBpbmNvdW50OyArK2kpCgl7CgkgICAgYWZpbGVbaV0gPSBOVUxMOwoKCSAgICBpZiAoaW5jb3VudCA+IDEpCgkgICAgewoJCWxlbiA9IFNUUkxFTihpbm5hbWVzW2ldKTsKCQlpZiAoU1RSTEVOKGdldHRhaWwoaW5uYW1lc1tpXSkpIDwgNQoJCQkJCQl8fCBpbm5hbWVzW2ldW2xlbiAtIDNdICE9ICdfJykKCQl7CgkJICAgIEVNU0cyKF8oIkU3NTU6IEludmFsaWQgcmVnaW9uIGluICVzIiksIGlubmFtZXNbaV0pOwoJCSAgICByZXR1cm47CgkJfQoJCXNwaW4uc2lfcmVnaW9uX25hbWVbaSAqIDJdID0gVE9MT1dFUl9BU0MoaW5uYW1lc1tpXVtsZW4gLSAyXSk7CgkJc3Bpbi5zaV9yZWdpb25fbmFtZVtpICogMiArIDFdID0KCQkJCQkgICAgIFRPTE9XRVJfQVNDKGlubmFtZXNbaV1bbGVuIC0gMV0pOwoJICAgIH0KCX0KCXNwaW4uc2lfcmVnaW9uX2NvdW50ID0gaW5jb3VudDsKCglzcGluLnNpX2ZvbGRyb290ID0gd29yZHRyZWVfYWxsb2MoJnNwaW4pOwoJc3Bpbi5zaV9rZWVwcm9vdCA9IHdvcmR0cmVlX2FsbG9jKCZzcGluKTsKCXNwaW4uc2lfcHJlZnJvb3QgPSB3b3JkdHJlZV9hbGxvYygmc3Bpbik7CglpZiAoc3Bpbi5zaV9mb2xkcm9vdCA9PSBOVUxMCgkJfHwgc3Bpbi5zaV9rZWVwcm9vdCA9PSBOVUxMCgkJfHwgc3Bpbi5zaV9wcmVmcm9vdCA9PSBOVUxMKQoJewoJICAgIGZyZWVfYmxvY2tzKHNwaW4uc2lfYmxvY2tzKTsKCSAgICByZXR1cm47Cgl9CgoJLyogV2hlbiBub3QgcHJvZHVjaW5nIGEgLmFkZC5zcGwgZmlsZSBjbGVhciB0aGUgY2hhcmFjdGVyIHRhYmxlIHdoZW4KCSAqIHdlIGVuY291bnRlciBvbmUgaW4gdGhlIC5hZmYgZmlsZS4gIFRoaXMgbWVhbnMgd2UgZHVtcCB0aGUgY3VycmVudAoJICogb25lIGluIHRoZSAuc3BsIGZpbGUgaWYgdGhlIC5hZmYgZmlsZSBkb2Vzbid0IGRlZmluZSBvbmUuICBUaGF0J3MKCSAqIGJldHRlciB0aGFuIGd1ZXNzaW5nIHRoZSBjb250ZW50cywgdGhlIHRhYmxlIHdpbGwgbWF0Y2ggYQoJICogcHJldmlvdXNseSBsb2FkZWQgc3BlbGwgZmlsZS4gKi8KCWlmICghc3Bpbi5zaV9hZGQpCgkgICAgc3Bpbi5zaV9jbGVhcl9jaGFydGFiID0gVFJVRTsKCgkvKgoJICogUmVhZCBhbGwgdGhlIC5hZmYgYW5kIC5kaWMgZmlsZXMuCgkgKiBUZXh0IGlzIGNvbnZlcnRlZCB0byAnZW5jb2RpbmcnLgoJICogV29yZHMgYXJlIHN0b3JlZCBpbiB0aGUgY2FzZS1mb2xkZWQgYW5kIGtlZXAtY2FzZSB0cmVlcy4KCSAqLwoJZm9yIChpID0gMDsgaSA8IGluY291bnQgJiYgIWVycm9yOyArK2kpCgl7CgkgICAgc3Bpbi5zaV9jb252LnZjX3R5cGUgPSBDT05WX05PTkU7CgkgICAgc3Bpbi5zaV9yZWdpb24gPSAxIDw8IGk7CgoJICAgIHZpbV9zbnByaW50ZigoY2hhciAqKWZuYW1lLCBzaXplb2YoZm5hbWUpLCAiJXMuYWZmIiwgaW5uYW1lc1tpXSk7CgkgICAgaWYgKG1jaF9zdGF0KChjaGFyICopZm5hbWUsICZzdCkgPj0gMCkKCSAgICB7CgkJLyogUmVhZCB0aGUgLmFmZiBmaWxlLiAgV2lsbCBpbml0ICJzcGluLT5zaV9jb252IiBiYXNlZCBvbiB0aGUKCQkgKiAiU0VUIiBsaW5lLiAqLwoJCWFmaWxlW2ldID0gc3BlbGxfcmVhZF9hZmYoJnNwaW4sIGZuYW1lKTsKCQlpZiAoYWZpbGVbaV0gPT0gTlVMTCkKCQkgICAgZXJyb3IgPSBUUlVFOwoJCWVsc2UKCQl7CgkJICAgIC8qIFJlYWQgdGhlIC5kaWMgZmlsZSBhbmQgc3RvcmUgdGhlIHdvcmRzIGluIHRoZSB0cmVlcy4gKi8KCQkgICAgdmltX3NucHJpbnRmKChjaGFyICopZm5hbWUsIHNpemVvZihmbmFtZSksICIlcy5kaWMiLAoJCQkJCQkJCSAgaW5uYW1lc1tpXSk7CgkJICAgIGlmIChzcGVsbF9yZWFkX2RpYygmc3BpbiwgZm5hbWUsIGFmaWxlW2ldKSA9PSBGQUlMKQoJCQllcnJvciA9IFRSVUU7CgkJfQoJICAgIH0KCSAgICBlbHNlCgkgICAgewoJCS8qIE5vIC5hZmYgZmlsZSwgdHJ5IHJlYWRpbmcgdGhlIGZpbGUgYXMgYSB3b3JkIGxpc3QuICBTdG9yZQoJCSAqIHRoZSB3b3JkcyBpbiB0aGUgdHJlZXMuICovCgkJaWYgKHNwZWxsX3JlYWRfd29yZGZpbGUoJnNwaW4sIGlubmFtZXNbaV0pID09IEZBSUwpCgkJICAgIGVycm9yID0gVFJVRTsKCSAgICB9CgojaWZkZWYgRkVBVF9NQllURQoJICAgIC8qIEZyZWUgYW55IGNvbnZlcnNpb24gc3R1ZmYuICovCgkgICAgY29udmVydF9zZXR1cCgmc3Bpbi5zaV9jb252LCBOVUxMLCBOVUxMKTsKI2VuZGlmCgl9CgoJaWYgKHNwaW4uc2lfY29tcGZsYWdzICE9IE5VTEwgJiYgc3Bpbi5zaV9ub2JyZWFrKQoJICAgIE1TRyhfKCJXYXJuaW5nOiBib3RoIGNvbXBvdW5kaW5nIGFuZCBOT0JSRUFLIHNwZWNpZmllZCIpKTsKCglpZiAoIWVycm9yICYmICFnb3RfaW50KQoJewoJICAgIC8qCgkgICAgICogQ29tYmluZSB0YWlscyBpbiB0aGUgdHJlZS4KCSAgICAgKi8KCSAgICBzcGVsbF9tZXNzYWdlKCZzcGluLCAoY2hhcl91ICopXyhtc2dfY29tcHJlc3NpbmcpKTsKCSAgICB3b3JkdHJlZV9jb21wcmVzcygmc3Bpbiwgc3Bpbi5zaV9mb2xkcm9vdCk7CgkgICAgd29yZHRyZWVfY29tcHJlc3MoJnNwaW4sIHNwaW4uc2lfa2VlcHJvb3QpOwoJICAgIHdvcmR0cmVlX2NvbXByZXNzKCZzcGluLCBzcGluLnNpX3ByZWZyb290KTsKCX0KCglpZiAoIWVycm9yICYmICFnb3RfaW50KQoJewoJICAgIC8qCgkgICAgICogV3JpdGUgdGhlIGluZm8gaW4gdGhlIHNwZWxsIGZpbGUuCgkgICAgICovCgkgICAgdmltX3NucHJpbnRmKChjaGFyICopSU9idWZmLCBJT1NJWkUsCgkJCQkgICAgICBfKCJXcml0aW5nIHNwZWxsIGZpbGUgJXMgLi4uIiksIHdmbmFtZSk7CgkgICAgc3BlbGxfbWVzc2FnZSgmc3BpbiwgSU9idWZmKTsKCgkgICAgZXJyb3IgPSB3cml0ZV92aW1fc3BlbGwoJnNwaW4sIHdmbmFtZSkgPT0gRkFJTDsKCgkgICAgc3BlbGxfbWVzc2FnZSgmc3BpbiwgKGNoYXJfdSAqKV8oIkRvbmUhIikpOwoJICAgIHZpbV9zbnByaW50ZigoY2hhciAqKUlPYnVmZiwgSU9TSVpFLAoJCSBfKCJFc3RpbWF0ZWQgcnVudGltZSBtZW1vcnkgdXNlOiAlZCBieXRlcyIpLCBzcGluLnNpX21lbXRvdCk7CgkgICAgc3BlbGxfbWVzc2FnZSgmc3BpbiwgSU9idWZmKTsKCgkgICAgLyoKCSAgICAgKiBJZiB0aGUgZmlsZSBpcyBsb2FkZWQgbmVlZCB0byByZWxvYWQgaXQuCgkgICAgICovCgkgICAgaWYgKCFlcnJvcikKCQlzcGVsbF9yZWxvYWRfb25lKHdmbmFtZSwgYWRkZWRfd29yZCk7Cgl9CgoJLyogRnJlZSB0aGUgYWxsb2NhdGVkIG1lbW9yeS4gKi8KCWdhX2NsZWFyKCZzcGluLnNpX3JlcCk7CglnYV9jbGVhcigmc3Bpbi5zaV9yZXBzYWwpOwoJZ2FfY2xlYXIoJnNwaW4uc2lfc2FsKTsKCWdhX2NsZWFyKCZzcGluLnNpX21hcCk7CglnYV9jbGVhcigmc3Bpbi5zaV9jb21wcGF0KTsKCWdhX2NsZWFyKCZzcGluLnNpX3ByZWZjb25kKTsKCWhhc2hfY2xlYXJfYWxsKCZzcGluLnNpX2NvbW1vbndvcmRzLCAwKTsKCgkvKiBGcmVlIHRoZSAuYWZmIGZpbGUgc3RydWN0dXJlcy4gKi8KCWZvciAoaSA9IDA7IGkgPCBpbmNvdW50OyArK2kpCgkgICAgaWYgKGFmaWxlW2ldICE9IE5VTEwpCgkJc3BlbGxfZnJlZV9hZmYoYWZpbGVbaV0pOwoKCS8qIEZyZWUgYWxsIHRoZSBiaXRzIGFuZCBwaWVjZXMgYXQgb25jZS4gKi8KCWZyZWVfYmxvY2tzKHNwaW4uc2lfYmxvY2tzKTsKCgkvKgoJICogSWYgdGhlcmUgaXMgc291bmRmb2xkaW5nIGluZm8gYW5kIG5vIE5PU1VHRklMRSBpdGVtIGNyZWF0ZSB0aGUKCSAqIC5zdWcgZmlsZSB3aXRoIHRoZSBzb3VuZGZvbGRlZCB3b3JkIHRyaWUuCgkgKi8KCWlmIChzcGluLnNpX3N1Z3RpbWUgIT0gMCAmJiAhZXJyb3IgJiYgIWdvdF9pbnQpCgkgICAgc3BlbGxfbWFrZV9zdWdmaWxlKCZzcGluLCB3Zm5hbWUpOwoKICAgIH0KfQoKLyoKICogRGlzcGxheSBhIG1lc3NhZ2UgZm9yIHNwZWxsIGZpbGUgcHJvY2Vzc2luZyB3aGVuICd2ZXJib3NlJyBpcyBzZXQgb3IgdXNpbmcKICogIjpta3NwZWxsIi4gICJzdHIiIGNhbiBiZSBJT2J1ZmYuCiAqLwogICAgc3RhdGljIHZvaWQKc3BlbGxfbWVzc2FnZShzcGluLCBzdHIpCiAgICBzcGVsbGluZm9fVCAqc3BpbjsKICAgIGNoYXJfdQkqc3RyOwp7CiAgICBpZiAoc3Bpbi0+c2lfdmVyYm9zZSB8fCBwX3ZlcmJvc2UgPiAyKQogICAgewoJaWYgKCFzcGluLT5zaV92ZXJib3NlKQoJICAgIHZlcmJvc2VfZW50ZXIoKTsKCU1TRyhzdHIpOwoJb3V0X2ZsdXNoKCk7CglpZiAoIXNwaW4tPnNpX3ZlcmJvc2UpCgkgICAgdmVyYm9zZV9sZWF2ZSgpOwogICAgfQp9CgovKgogKiAiOltjb3VudF1zcGVsbGdvb2QgIHt3b3JkfSIKICogIjpbY291bnRdc3BlbGx3cm9uZyAge3dvcmR9IgogKiAiOltjb3VudF1zcGVsbHVuZG8gIHt3b3JkfSIKICovCiAgICB2b2lkCmV4X3NwZWxsKGVhcCkKICAgIGV4YXJnX1QgKmVhcDsKewogICAgc3BlbGxfYWRkX3dvcmQoZWFwLT5hcmcsIFNUUkxFTihlYXAtPmFyZyksIGVhcC0+Y21kaWR4ID09IENNRF9zcGVsbHdyb25nLAoJCQkJICAgZWFwLT5mb3JjZWl0ID8gMCA6IChpbnQpZWFwLT5saW5lMiwKCQkJCSAgIGVhcC0+Y21kaWR4ID09IENNRF9zcGVsbHVuZG8pOwp9CgovKgogKiBBZGQgIndvcmRbbGVuXSIgdG8gJ3NwZWxsZmlsZScgYXMgYSBnb29kIG9yIGJhZCB3b3JkLgogKi8KICAgIHZvaWQKc3BlbGxfYWRkX3dvcmQod29yZCwgbGVuLCBiYWQsIGluZGV4LCB1bmRvKQogICAgY2hhcl91CSp3b3JkOwogICAgaW50CQlsZW47CiAgICBpbnQJCWJhZDsKICAgIGludAkJaW5kZXg7CSAgICAvKiAiekciIGFuZCAielciOiB6ZXJvLCBvdGhlcndpc2UgaW5kZXggaW4KCQkJICAgICAgICdzcGVsbGZpbGUnICovCiAgICBpbnQJCXVuZG87CSAgICAvKiBUUlVFIGZvciAienVnIiwgInp1RyIsICJ6dXciIGFuZCAienVXIiAqLwp7CiAgICBGSUxFCSpmZDsKICAgIGJ1Zl9UCSpidWYgPSBOVUxMOwogICAgaW50CQluZXdfc3BmID0gRkFMU0U7CiAgICBjaGFyX3UJKmZuYW1lOwogICAgY2hhcl91CWZuYW1lYnVmW01BWFBBVEhMXTsKICAgIGNoYXJfdQlsaW5lW01BWFdMRU4gKiAyXTsKICAgIGxvbmcJZnBvcywgZnBvc19uZXh0ID0gMDsKICAgIGludAkJaTsKICAgIGNoYXJfdQkqc3BmOwoKICAgIGlmIChpbmRleCA9PSAwKQkgICAgLyogdXNlIGludGVybmFsIHdvcmRsaXN0ICovCiAgICB7CglpZiAoaW50X3dvcmRsaXN0ID09IE5VTEwpCgl7CgkgICAgaW50X3dvcmRsaXN0ID0gdmltX3RlbXBuYW1lKCdzJyk7CgkgICAgaWYgKGludF93b3JkbGlzdCA9PSBOVUxMKQoJCXJldHVybjsKCX0KCWZuYW1lID0gaW50X3dvcmRsaXN0OwogICAgfQogICAgZWxzZQogICAgewoJLyogSWYgJ3NwZWxsZmlsZScgaXNuJ3Qgc2V0IGZpZ3VyZSBvdXQgYSBnb29kIGRlZmF1bHQgdmFsdWUuICovCglpZiAoKmN1cmJ1Zi0+Yl9wX3NwZiA9PSBOVUwpCgl7CgkgICAgaW5pdF9zcGVsbGZpbGUoKTsKCSAgICBuZXdfc3BmID0gVFJVRTsKCX0KCglpZiAoKmN1cmJ1Zi0+Yl9wX3NwZiA9PSBOVUwpCgl7CgkgICAgRU1TRzIoXyhlX25vdHNldCksICJzcGVsbGZpbGUiKTsKCSAgICByZXR1cm47Cgl9CgoJZm9yIChzcGYgPSBjdXJidWYtPmJfcF9zcGYsIGkgPSAxOyAqc3BmICE9IE5VTDsgKytpKQoJewoJICAgIGNvcHlfb3B0aW9uX3BhcnQoJnNwZiwgZm5hbWVidWYsIE1BWFBBVEhMLCAiLCIpOwoJICAgIGlmIChpID09IGluZGV4KQoJCWJyZWFrOwoJICAgIGlmICgqc3BmID09IE5VTCkKCSAgICB7CgkJRU1TR04oXygiRTc2NTogJ3NwZWxsZmlsZScgZG9lcyBub3QgaGF2ZSAlbGQgZW50cmllcyIpLCBpbmRleCk7CgkJcmV0dXJuOwoJICAgIH0KCX0KCgkvKiBDaGVjayB0aGF0IHRoZSB1c2VyIGlzbid0IGVkaXRpbmcgdGhlIC5hZGQgZmlsZSBzb21ld2hlcmUuICovCglidWYgPSBidWZsaXN0X2ZpbmRuYW1lX2V4cChmbmFtZWJ1Zik7CglpZiAoYnVmICE9IE5VTEwgJiYgYnVmLT5iX21sLm1sX21mcCA9PSBOVUxMKQoJICAgIGJ1ZiA9IE5VTEw7CglpZiAoYnVmICE9IE5VTEwgJiYgYnVmSXNDaGFuZ2VkKGJ1ZikpCgl7CgkgICAgRU1TRyhfKGVfYnVmbG9hZGVkKSk7CgkgICAgcmV0dXJuOwoJfQoKCWZuYW1lID0gZm5hbWVidWY7CiAgICB9CgogICAgaWYgKGJhZCB8fCB1bmRvKQogICAgewoJLyogV2hlbiB0aGUgd29yZCBhcHBlYXJzIGFzIGdvb2Qgd29yZCB3ZSBuZWVkIHRvIHJlbW92ZSB0aGF0IG9uZSwKCSAqIHNpbmNlIGl0cyBmbGFncyBzb3J0IGJlZm9yZSB0aGUgb25lIHdpdGggV0ZfQkFOTkVELiAqLwoJZmQgPSBtY2hfZm9wZW4oKGNoYXIgKilmbmFtZSwgInIiKTsKCWlmIChmZCAhPSBOVUxMKQoJewoJICAgIHdoaWxlICghdmltX2ZnZXRzKGxpbmUsIE1BWFdMRU4gKiAyLCBmZCkpCgkgICAgewoJCWZwb3MgPSBmcG9zX25leHQ7CgkJZnBvc19uZXh0ID0gZnRlbGwoZmQpOwoJCWlmIChTVFJOQ01QKHdvcmQsIGxpbmUsIGxlbikgPT0gMAoJCQkmJiAobGluZVtsZW5dID09ICcvJyB8fCBsaW5lW2xlbl0gPCAnICcpKQoJCXsKCQkgICAgLyogRm91bmQgZHVwbGljYXRlIHdvcmQuICBSZW1vdmUgaXQgYnkgd3JpdGluZyBhICcjJyBhdAoJCSAgICAgKiB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuICBNaXhpbmcgcmVhZGluZyBhbmQgd3JpdGluZwoJCSAgICAgKiBkb2Vzbid0IHdvcmsgZm9yIGFsbCBzeXN0ZW1zLCBjbG9zZSB0aGUgZmlsZSBmaXJzdC4gKi8KCQkgICAgZmNsb3NlKGZkKTsKCQkgICAgZmQgPSBtY2hfZm9wZW4oKGNoYXIgKilmbmFtZSwgInIrIik7CgkJICAgIGlmIChmZCA9PSBOVUxMKQoJCQlicmVhazsKCQkgICAgaWYgKGZzZWVrKGZkLCBmcG9zLCBTRUVLX1NFVCkgPT0gMCkKCQkgICAgewoJCQlmcHV0YygnIycsIGZkKTsKCQkJaWYgKHVuZG8pCgkJCXNtc2coKGNoYXJfdSAqKV8oIldvcmQgcmVtb3ZlZCBmcm9tICVzIiksIE5hbWVCdWZmKTsKCQkgICAgfQoJCSAgICBmc2VlayhmZCwgZnBvc19uZXh0LCBTRUVLX1NFVCk7CgkJfQoJICAgIH0KCSAgICBmY2xvc2UoZmQpOwoJfQogICAgfQoKICAgIGlmICghdW5kbykKICAgIHsKCWZkID0gbWNoX2ZvcGVuKChjaGFyICopZm5hbWUsICJhIik7CglpZiAoZmQgPT0gTlVMTCAmJiBuZXdfc3BmKQoJewoJICAgIC8qIFdlIGp1c3QgaW5pdGlhbGl6ZWQgdGhlICdzcGVsbGZpbGUnIG9wdGlvbiBhbmQgY2FuJ3Qgb3BlbiB0aGUKCSAgICAgKiBmaWxlLiAgV2UgbWF5IG5lZWQgdG8gY3JlYXRlIHRoZSAic3BlbGwiIGRpcmVjdG9yeSBmaXJzdC4gIFdlCgkgICAgICogYWxyZWFkeSBjaGVja2VkIHRoZSBydW50aW1lIGRpcmVjdG9yeSBpcyB3cml0YWJsZSBpbgoJICAgICAqIGluaXRfc3BlbGxmaWxlKCkuICovCgkgICAgaWYgKCFkaXJfb2ZfZmlsZV9leGlzdHMoZm5hbWUpKQoJICAgIHsKCQkvKiBUaGUgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QuICBUcnkgY3JlYXRpbmcgaXQgYW5kIG9wZW5pbmcKCQkgKiB0aGUgZmlsZSBhZ2Fpbi4gKi8KCQl2aW1fbWtkaXIoTmFtZUJ1ZmYsIDA3NTUpOwoJCWZkID0gbWNoX2ZvcGVuKChjaGFyICopZm5hbWUsICJhIik7CgkgICAgfQoJfQoKCWlmIChmZCA9PSBOVUxMKQoJICAgIEVNU0cyKF8oZV9ub3RvcGVuKSwgZm5hbWUpOwoJZWxzZQoJewoJICAgIGlmIChiYWQpCgkJZnByaW50ZihmZCwgIiUuKnMvIVxuIiwgbGVuLCB3b3JkKTsKCSAgICBlbHNlCgkJZnByaW50ZihmZCwgIiUuKnNcbiIsIGxlbiwgd29yZCk7CgkgICAgZmNsb3NlKGZkKTsKCgkgICAgaG9tZV9yZXBsYWNlKE5VTEwsIGZuYW1lLCBOYW1lQnVmZiwgTUFYUEFUSEwsIFRSVUUpOwoJICAgIHNtc2coKGNoYXJfdSAqKV8oIldvcmQgYWRkZWQgdG8gJXMiKSwgTmFtZUJ1ZmYpOwoJfQogICAgfQoKICAgIGlmIChmZCAhPSBOVUxMKQogICAgewoJLyogVXBkYXRlIHRoZSAuYWRkLnNwbCBmaWxlLiAqLwoJbWtzcGVsbCgxLCAmZm5hbWUsIEZBTFNFLCBUUlVFLCBUUlVFKTsKCgkvKiBJZiB0aGUgLmFkZCBmaWxlIGlzIGVkaXRlZCBzb21ld2hlcmUsIHJlbG9hZCBpdC4gKi8KCWlmIChidWYgIT0gTlVMTCkKCSAgICBidWZfcmVsb2FkKGJ1ZiwgYnVmLT5iX29yaWdfbW9kZSk7CgoJcmVkcmF3X2FsbF9sYXRlcihTT01FX1ZBTElEKTsKICAgIH0KfQoKLyoKICogSW5pdGlhbGl6ZSAnc3BlbGxmaWxlJyBmb3IgdGhlIGN1cnJlbnQgYnVmZmVyLgogKi8KICAgIHN0YXRpYyB2b2lkCmluaXRfc3BlbGxmaWxlKCkKewogICAgY2hhcl91CWJ1ZltNQVhQQVRITF07CiAgICBpbnQJCWw7CiAgICBjaGFyX3UJKmZuYW1lOwogICAgY2hhcl91CSpydHA7CiAgICBjaGFyX3UJKmxlbmQ7CiAgICBpbnQJCWFzcGF0aCA9IEZBTFNFOwogICAgY2hhcl91CSpsc3RhcnQgPSBjdXJidWYtPmJfcF9zcGw7CgogICAgaWYgKCpjdXJidWYtPmJfcF9zcGwgIT0gTlVMICYmIGN1cmJ1Zi0+Yl9sYW5ncC5nYV9sZW4gPiAwKQogICAgewoJLyogRmluZCB0aGUgZW5kIG9mIHRoZSBsYW5ndWFnZSBuYW1lLiAgRXhjbHVkZSB0aGUgcmVnaW9uLiAgSWYgdGhlcmUKCSAqIGlzIGEgcGF0aCBzZXBhcmF0b3IgcmVtZW1iZXIgdGhlIHN0YXJ0IG9mIHRoZSB0YWlsLiAqLwoJZm9yIChsZW5kID0gY3VyYnVmLT5iX3Bfc3BsOyAqbGVuZCAhPSBOVUwKCQkJJiYgdmltX3N0cmNocigoY2hhcl91ICopIiwuXyIsICpsZW5kKSA9PSBOVUxMOyArK2xlbmQpCgkgICAgaWYgKHZpbV9pc3BhdGhzZXAoKmxlbmQpKQoJICAgIHsKCQlhc3BhdGggPSBUUlVFOwoJCWxzdGFydCA9IGxlbmQgKyAxOwoJICAgIH0KCgkvKiBMb29wIG92ZXIgYWxsIGVudHJpZXMgaW4gJ3J1bnRpbWVwYXRoJy4gIFVzZSB0aGUgZmlyc3Qgb25lIHdoZXJlIHdlCgkgKiBhcmUgYWxsb3dlZCB0byB3cml0ZS4gKi8KCXJ0cCA9IHBfcnRwOwoJd2hpbGUgKCpydHAgIT0gTlVMKQoJewoJICAgIGlmIChhc3BhdGgpCgkJLyogVXNlIGRpcmVjdG9yeSBvZiBhbiBlbnRyeSB3aXRoIHBhdGgsIGUuZy4sIGZvcgoJCSAqICIvZGlyL2xnLnV0Zi04LnNwbCIgdXNlICIvZGlyIi4gKi8KCQl2aW1fc3RybmNweShidWYsIGN1cmJ1Zi0+Yl9wX3NwbCwgbHN0YXJ0IC0gY3VyYnVmLT5iX3Bfc3BsIC0gMSk7CgkgICAgZWxzZQoJCS8qIENvcHkgdGhlIHBhdGggZnJvbSAncnVudGltZXBhdGgnIHRvIGJ1ZltdLiAqLwoJCWNvcHlfb3B0aW9uX3BhcnQoJnJ0cCwgYnVmLCBNQVhQQVRITCwgIiwiKTsKCSAgICBpZiAoZmlsZXdyaXRhYmxlKGJ1ZikgPT0gMikKCSAgICB7CgkJLyogVXNlIHRoZSBmaXJzdCBsYW5ndWFnZSBuYW1lIGZyb20gJ3NwZWxsbGFuZycgYW5kIHRoZQoJCSAqIGVuY29kaW5nIHVzZWQgaW4gdGhlIGZpcnN0IGxvYWRlZCAuc3BsIGZpbGUuICovCgkJaWYgKGFzcGF0aCkKCQkgICAgdmltX3N0cm5jcHkoYnVmLCBjdXJidWYtPmJfcF9zcGwsIGxlbmQgLSBjdXJidWYtPmJfcF9zcGwpOwoJCWVsc2UKCQl7CgkJICAgIC8qIENyZWF0ZSB0aGUgInNwZWxsIiBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBleGlzdCB5ZXQuICovCgkJICAgIGwgPSBTVFJMRU4oYnVmKTsKCQkgICAgdmltX3NucHJpbnRmKChjaGFyICopYnVmICsgbCwgTUFYUEFUSEwgLSBsLCAiL3NwZWxsIik7CgkJICAgIGlmICghZmlsZXdyaXRhYmxlKGJ1ZikgIT0gMikKCQkJdmltX21rZGlyKGJ1ZiwgMDc1NSk7CgoJCSAgICBsID0gU1RSTEVOKGJ1Zik7CgkJICAgIHZpbV9zbnByaW50ZigoY2hhciAqKWJ1ZiArIGwsIE1BWFBBVEhMIC0gbCwKCQkJCSAiLyUuKnMiLCAoaW50KShsZW5kIC0gbHN0YXJ0KSwgbHN0YXJ0KTsKCQl9CgkJbCA9IFNUUkxFTihidWYpOwoJCWZuYW1lID0gTEFOR1BfRU5UUlkoY3VyYnVmLT5iX2xhbmdwLCAwKS0+bHBfc2xhbmctPnNsX2ZuYW1lOwoJCXZpbV9zbnByaW50ZigoY2hhciAqKWJ1ZiArIGwsIE1BWFBBVEhMIC0gbCwgIi4lcy5hZGQiLAoJCQlmbmFtZSAhPSBOVUxMCgkJCSAgJiYgc3Ryc3RyKChjaGFyICopZ2V0dGFpbChmbmFtZSksICIuYXNjaWkuIikgIT0gTlVMTAoJCQkJICAgICAgID8gKGNoYXJfdSAqKSJhc2NpaSIgOiBzcGVsbF9lbmMoKSk7CgkJc2V0X29wdGlvbl92YWx1ZSgoY2hhcl91ICopInNwZWxsZmlsZSIsIDBMLCBidWYsIE9QVF9MT0NBTCk7CgkJYnJlYWs7CgkgICAgfQoJICAgIGFzcGF0aCA9IEZBTFNFOwoJfQogICAgfQp9CgoKLyoKICogSW5pdCB0aGUgY2hhcnRhYiB1c2VkIGZvciBzcGVsbGluZyBmb3IgQVNDSUkuCiAqIEVCQ0RJQyBpcyBub3Qgc3VwcG9ydGVkIQogKi8KICAgIHN0YXRpYyB2b2lkCmNsZWFyX3NwZWxsX2NoYXJ0YWIoc3ApCiAgICBzcGVsbHRhYl9UCSpzcDsKewogICAgaW50CQlpOwoKICAgIC8qIEluaXQgZXZlcnl0aGluZyB0byBGQUxTRS4gKi8KICAgIHZpbV9tZW1zZXQoc3AtPnN0X2lzdywgRkFMU0UsIHNpemVvZihzcC0+c3RfaXN3KSk7CiAgICB2aW1fbWVtc2V0KHNwLT5zdF9pc3UsIEZBTFNFLCBzaXplb2Yoc3AtPnN0X2lzdSkpOwogICAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKQogICAgewoJc3AtPnN0X2ZvbGRbaV0gPSBpOwoJc3AtPnN0X3VwcGVyW2ldID0gaTsKICAgIH0KCiAgICAvKiBXZSBpbmNsdWRlIGRpZ2l0cy4gIEEgd29yZCBzaG91bGRuJ3Qgc3RhcnQgd2l0aCBhIGRpZ2l0LCBidXQgaGFuZGxpbmcKICAgICAqIHRoYXQgaXMgZG9uZSBzZXBhcmF0ZWx5LiAqLwogICAgZm9yIChpID0gJzAnOyBpIDw9ICc5JzsgKytpKQoJc3AtPnN0X2lzd1tpXSA9IFRSVUU7CiAgICBmb3IgKGkgPSAnQSc7IGkgPD0gJ1onOyArK2kpCiAgICB7CglzcC0+c3RfaXN3W2ldID0gVFJVRTsKCXNwLT5zdF9pc3VbaV0gPSBUUlVFOwoJc3AtPnN0X2ZvbGRbaV0gPSBpICsgMHgyMDsKICAgIH0KICAgIGZvciAoaSA9ICdhJzsgaSA8PSAneic7ICsraSkKICAgIHsKCXNwLT5zdF9pc3dbaV0gPSBUUlVFOwoJc3AtPnN0X3VwcGVyW2ldID0gaSAtIDB4MjA7CiAgICB9Cn0KCi8qCiAqIEluaXQgdGhlIGNoYXJ0YWIgdXNlZCBmb3Igc3BlbGxpbmcuICBPbmx5IGRlcGVuZHMgb24gJ2VuY29kaW5nJy4KICogQ2FsbGVkIG9uY2Ugd2hpbGUgc3RhcnRpbmcgdXAgYW5kIHdoZW4gJ2VuY29kaW5nJyBjaGFuZ2VzLgogKiBUaGUgZGVmYXVsdCBpcyB0byB1c2UgaXNhbHBoYSgpLCBidXQgdGhlIHNwZWxsIGZpbGUgc2hvdWxkIGRlZmluZSB0aGUgd29yZAogKiBjaGFyYWN0ZXJzIHRvIG1ha2UgaXQgcG9zc2libGUgdGhhdCAnZW5jb2RpbmcnIGRpZmZlcnMgZnJvbSB0aGUgY3VycmVudAogKiBsb2NhbGUuICBGb3IgdXRmLTggd2UgZG9uJ3QgdXNlIGlzYWxwaGEoKSBidXQgb3VyIG93biBmdW5jdGlvbnMuCiAqLwogICAgdm9pZAppbml0X3NwZWxsX2NoYXJ0YWIoKQp7CiAgICBpbnQJICAgIGk7CgogICAgZGlkX3NldF9zcGVsbHRhYiA9IEZBTFNFOwogICAgY2xlYXJfc3BlbGxfY2hhcnRhYigmc3BlbGx0YWIpOwojaWZkZWYgRkVBVF9NQllURQogICAgaWYgKGVuY19kYmNzKQogICAgewoJLyogREJDUzogYXNzdW1lIGRvdWJsZS13aWRlIGNoYXJhY3RlcnMgYXJlIHdvcmQgY2hhcmFjdGVycy4gKi8KCWZvciAoaSA9IDEyODsgaSA8PSAyNTU7ICsraSkKCSAgICBpZiAoTUJfQllURTJMRU4oaSkgPT0gMikKCQlzcGVsbHRhYi5zdF9pc3dbaV0gPSBUUlVFOwogICAgfQogICAgZWxzZSBpZiAoZW5jX3V0ZjgpCiAgICB7Cglmb3IgKGkgPSAxMjg7IGkgPCAyNTY7ICsraSkKCXsKCSAgICBzcGVsbHRhYi5zdF9pc3VbaV0gPSB1dGZfaXN1cHBlcihpKTsKCSAgICBzcGVsbHRhYi5zdF9pc3dbaV0gPSBzcGVsbHRhYi5zdF9pc3VbaV0gfHwgdXRmX2lzbG93ZXIoaSk7CgkgICAgc3BlbGx0YWIuc3RfZm9sZFtpXSA9IHV0Zl9mb2xkKGkpOwoJICAgIHNwZWxsdGFiLnN0X3VwcGVyW2ldID0gdXRmX3RvdXBwZXIoaSk7Cgl9CiAgICB9CiAgICBlbHNlCiNlbmRpZgogICAgewoJLyogUm91Z2ggZ3Vlc3M6IHVzZSBsb2NhbGUtZGVwZW5kZW50IGxpYnJhcnkgZnVuY3Rpb25zLiAqLwoJZm9yIChpID0gMTI4OyBpIDwgMjU2OyArK2kpCgl7CgkgICAgaWYgKE1CX0lTVVBQRVIoaSkpCgkgICAgewoJCXNwZWxsdGFiLnN0X2lzd1tpXSA9IFRSVUU7CgkJc3BlbGx0YWIuc3RfaXN1W2ldID0gVFJVRTsKCQlzcGVsbHRhYi5zdF9mb2xkW2ldID0gTUJfVE9MT1dFUihpKTsKCSAgICB9CgkgICAgZWxzZSBpZiAoTUJfSVNMT1dFUihpKSkKCSAgICB7CgkJc3BlbGx0YWIuc3RfaXN3W2ldID0gVFJVRTsKCQlzcGVsbHRhYi5zdF91cHBlcltpXSA9IE1CX1RPVVBQRVIoaSk7CgkgICAgfQoJfQogICAgfQp9CgovKgogKiBTZXQgdGhlIHNwZWxsIGNoYXJhY3RlciB0YWJsZXMgZnJvbSBzdHJpbmdzIGluIHRoZSBhZmZpeCBmaWxlLgogKi8KICAgIHN0YXRpYyBpbnQKc2V0X3NwZWxsX2NoYXJ0YWIoZm9sLCBsb3csIHVwcCkKICAgIGNoYXJfdQkqZm9sOwogICAgY2hhcl91CSpsb3c7CiAgICBjaGFyX3UJKnVwcDsKewogICAgLyogV2UgYnVpbGQgdGhlIG5ldyB0YWJsZXMgaGVyZSBmaXJzdCwgc28gdGhhdCB3ZSBjYW4gY29tcGFyZSB3aXRoIHRoZQogICAgICogcHJldmlvdXMgb25lLiAqLwogICAgc3BlbGx0YWJfVAluZXdfc3Q7CiAgICBjaGFyX3UJKnBmID0gZm9sLCAqcGwgPSBsb3csICpwdSA9IHVwcDsKICAgIGludAkJZiwgbCwgdTsKCiAgICBjbGVhcl9zcGVsbF9jaGFydGFiKCZuZXdfc3QpOwoKICAgIHdoaWxlICgqcGYgIT0gTlVMKQogICAgewoJaWYgKCpwbCA9PSBOVUwgfHwgKnB1ID09IE5VTCkKCXsKCSAgICBFTVNHKF8oZV9hZmZmb3JtKSk7CgkgICAgcmV0dXJuIEZBSUw7Cgl9CiNpZmRlZiBGRUFUX01CWVRFCglmID0gbWJfcHRyMmNoYXJfYWR2KCZwZik7CglsID0gbWJfcHRyMmNoYXJfYWR2KCZwbCk7Cgl1ID0gbWJfcHRyMmNoYXJfYWR2KCZwdSk7CiNlbHNlCglmID0gKnBmKys7CglsID0gKnBsKys7Cgl1ID0gKnB1Kys7CiNlbmRpZgoJLyogRXZlcnkgY2hhcmFjdGVyIHRoYXQgYXBwZWFycyBpcyBhIHdvcmQgY2hhcmFjdGVyLiAqLwoJaWYgKGYgPCAyNTYpCgkgICAgbmV3X3N0LnN0X2lzd1tmXSA9IFRSVUU7CglpZiAobCA8IDI1NikKCSAgICBuZXdfc3Quc3RfaXN3W2xdID0gVFJVRTsKCWlmICh1IDwgMjU2KQoJICAgIG5ld19zdC5zdF9pc3dbdV0gPSBUUlVFOwoKCS8qIGlmICJMT1ciIGFuZCAiRk9MIiBhcmUgbm90IHRoZSBzYW1lIHRoZSAiTE9XIiBjaGFyIG5lZWRzCgkgKiBjYXNlLWZvbGRpbmcgKi8KCWlmIChsIDwgMjU2ICYmIGwgIT0gZikKCXsKCSAgICBpZiAoZiA+PSAyNTYpCgkgICAgewoJCUVNU0coXyhlX2FmZnJhbmdlKSk7CgkJcmV0dXJuIEZBSUw7CgkgICAgfQoJICAgIG5ld19zdC5zdF9mb2xkW2xdID0gZjsKCX0KCgkvKiBpZiAiVVBQIiBhbmQgIkZPTCIgYXJlIG5vdCB0aGUgc2FtZSB0aGUgIlVQUCIgY2hhciBuZWVkcwoJICogY2FzZS1mb2xkaW5nLCBpdCdzIHVwcGVyIGNhc2UgYW5kIHRoZSAiVVBQIiBpcyB0aGUgdXBwZXIgY2FzZSBvZgoJICogIkZPTCIgLiAqLwoJaWYgKHUgPCAyNTYgJiYgdSAhPSBmKQoJewoJICAgIGlmIChmID49IDI1NikKCSAgICB7CgkJRU1TRyhfKGVfYWZmcmFuZ2UpKTsKCQlyZXR1cm4gRkFJTDsKCSAgICB9CgkgICAgbmV3X3N0LnN0X2ZvbGRbdV0gPSBmOwoJICAgIG5ld19zdC5zdF9pc3VbdV0gPSBUUlVFOwoJICAgIG5ld19zdC5zdF91cHBlcltmXSA9IHU7Cgl9CiAgICB9CgogICAgaWYgKCpwbCAhPSBOVUwgfHwgKnB1ICE9IE5VTCkKICAgIHsKCUVNU0coXyhlX2FmZmZvcm0pKTsKCXJldHVybiBGQUlMOwogICAgfQoKICAgIHJldHVybiBzZXRfc3BlbGxfZmluaXNoKCZuZXdfc3QpOwp9CgovKgogKiBTZXQgdGhlIHNwZWxsIGNoYXJhY3RlciB0YWJsZXMgZnJvbSBzdHJpbmdzIGluIHRoZSAuc3BsIGZpbGUuCiAqLwogICAgc3RhdGljIHZvaWQKc2V0X3NwZWxsX2NoYXJmbGFncyhmbGFncywgY250LCBmb2wpCiAgICBjaGFyX3UJKmZsYWdzOwogICAgaW50CQljbnQ7CSAgICAvKiBsZW5ndGggb2YgImZsYWdzIiAqLwogICAgY2hhcl91CSpmb2w7CnsKICAgIC8qIFdlIGJ1aWxkIHRoZSBuZXcgdGFibGVzIGhlcmUgZmlyc3QsIHNvIHRoYXQgd2UgY2FuIGNvbXBhcmUgd2l0aCB0aGUKICAgICAqIHByZXZpb3VzIG9uZS4gKi8KICAgIHNwZWxsdGFiX1QJbmV3X3N0OwogICAgaW50CQlpOwogICAgY2hhcl91CSpwID0gZm9sOwogICAgaW50CQljOwoKICAgIGNsZWFyX3NwZWxsX2NoYXJ0YWIoJm5ld19zdCk7CgogICAgZm9yIChpID0gMDsgaSA8IDEyODsgKytpKQogICAgewoJaWYgKGkgPCBjbnQpCgl7CgkgICAgbmV3X3N0LnN0X2lzd1tpICsgMTI4XSA9IChmbGFnc1tpXSAmIENGX1dPUkQpICE9IDA7CgkgICAgbmV3X3N0LnN0X2lzdVtpICsgMTI4XSA9IChmbGFnc1tpXSAmIENGX1VQUEVSKSAhPSAwOwoJfQoKCWlmICgqcCAhPSBOVUwpCgl7CiNpZmRlZiBGRUFUX01CWVRFCgkgICAgYyA9IG1iX3B0cjJjaGFyX2FkdigmcCk7CiNlbHNlCgkgICAgYyA9ICpwKys7CiNlbmRpZgoJICAgIG5ld19zdC5zdF9mb2xkW2kgKyAxMjhdID0gYzsKCSAgICBpZiAoaSArIDEyOCAhPSBjICYmIG5ld19zdC5zdF9pc3VbaSArIDEyOF0gJiYgYyA8IDI1NikKCQluZXdfc3Quc3RfdXBwZXJbY10gPSBpICsgMTI4OwoJfQogICAgfQoKICAgICh2b2lkKXNldF9zcGVsbF9maW5pc2goJm5ld19zdCk7Cn0KCiAgICBzdGF0aWMgaW50CnNldF9zcGVsbF9maW5pc2gobmV3X3N0KQogICAgc3BlbGx0YWJfVAkqbmV3X3N0Owp7CiAgICBpbnQJCWk7CgogICAgaWYgKGRpZF9zZXRfc3BlbGx0YWIpCiAgICB7CgkvKiBjaGVjayB0aGF0IGl0J3MgdGhlIHNhbWUgdGFibGUgKi8KCWZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkKCXsKCSAgICBpZiAoc3BlbGx0YWIuc3RfaXN3W2ldICE9IG5ld19zdC0+c3RfaXN3W2ldCgkJICAgIHx8IHNwZWxsdGFiLnN0X2lzdVtpXSAhPSBuZXdfc3QtPnN0X2lzdVtpXQoJCSAgICB8fCBzcGVsbHRhYi5zdF9mb2xkW2ldICE9IG5ld19zdC0+c3RfZm9sZFtpXQoJCSAgICB8fCBzcGVsbHRhYi5zdF91cHBlcltpXSAhPSBuZXdfc3QtPnN0X3VwcGVyW2ldKQoJICAgIHsKCQlFTVNHKF8oIkU3NjM6IFdvcmQgY2hhcmFjdGVycyBkaWZmZXIgYmV0d2VlbiBzcGVsbCBmaWxlcyIpKTsKCQlyZXR1cm4gRkFJTDsKCSAgICB9Cgl9CiAgICB9CiAgICBlbHNlCiAgICB7CgkvKiBjb3B5IHRoZSBuZXcgc3BlbGx0YWIgaW50byB0aGUgb25lIGJlaW5nIHVzZWQgKi8KCXNwZWxsdGFiID0gKm5ld19zdDsKCWRpZF9zZXRfc3BlbGx0YWIgPSBUUlVFOwogICAgfQoKICAgIHJldHVybiBPSzsKfQoKLyoKICogUmV0dXJuIFRSVUUgaWYgInAiIHBvaW50cyB0byBhIHdvcmQgY2hhcmFjdGVyLgogKiBBcyBhIHNwZWNpYWwgY2FzZSB3ZSBzZWUgIm1pZHdvcmQiIGNoYXJhY3RlcnMgYXMgd29yZCBjaGFyYWN0ZXIgd2hlbiBpdCBpcwogKiBmb2xsb3dlZCBieSBhIHdvcmQgY2hhcmFjdGVyLiAgVGhpcyBmaW5kcyB0aGV5J3RoZXJlIGJ1dCBub3QgJ3RoZXkgdGhlcmUnLgogKiBUaHVzIHRoaXMgb25seSB3b3JrcyBwcm9wZXJseSB3aGVuIHBhc3QgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgd29yZC4KICovCiAgICBzdGF0aWMgaW50CnNwZWxsX2lzd29yZHAocCwgYnVmKQogICAgY2hhcl91CSpwOwogICAgYnVmX1QJKmJ1ZjsJICAgIC8qIGJ1ZmZlciB1c2VkICovCnsKI2lmZGVmIEZFQVRfTUJZVEUKICAgIGNoYXJfdQkqczsKICAgIGludAkJbDsKICAgIGludAkJYzsKCiAgICBpZiAoaGFzX21ieXRlKQogICAgewoJbCA9IE1CX0JZVEUyTEVOKCpwKTsKCXMgPSBwOwoJaWYgKGwgPT0gMSkKCXsKCSAgICAvKiBiZSBxdWljayBmb3IgQVNDSUkgKi8KCSAgICBpZiAoYnVmLT5iX3NwZWxsX2lzbXdbKnBdKQoJICAgIHsKCQlzID0gcCArIDE7CQkvKiBza2lwIGEgbWlkLXdvcmQgY2hhcmFjdGVyICovCgkJbCA9IE1CX0JZVEUyTEVOKCpzKTsKCSAgICB9Cgl9CgllbHNlCgl7CgkgICAgYyA9IG1iX3B0cjJjaGFyKHApOwoJICAgIGlmIChjIDwgMjU2ID8gYnVmLT5iX3NwZWxsX2lzbXdbY10KCQkgICAgOiAoYnVmLT5iX3NwZWxsX2lzbXdfbWIgIT0gTlVMTAoJCQkgICAmJiB2aW1fc3RyY2hyKGJ1Zi0+Yl9zcGVsbF9pc213X21iLCBjKSAhPSBOVUxMKSkKCSAgICB7CgkJcyA9IHAgKyBsOwoJCWwgPSBNQl9CWVRFMkxFTigqcyk7CgkgICAgfQoJfQoKCWMgPSBtYl9wdHIyY2hhcihzKTsKCWlmIChjID4gMjU1KQoJICAgIHJldHVybiBtYl9nZXRfY2xhc3MocykgPj0gMjsKCXJldHVybiBzcGVsbHRhYi5zdF9pc3dbY107CiAgICB9CiNlbmRpZgoKICAgIHJldHVybiBzcGVsbHRhYi5zdF9pc3dbYnVmLT5iX3NwZWxsX2lzbXdbKnBdID8gcFsxXSA6IHBbMF1dOwp9CgovKgogKiBSZXR1cm4gVFJVRSBpZiAicCIgcG9pbnRzIHRvIGEgd29yZCBjaGFyYWN0ZXIuCiAqIFVubGlrZSBzcGVsbF9pc3dvcmRwKCkgdGhpcyBkb2Vzbid0IGNoZWNrIGZvciAibWlkd29yZCIgY2hhcmFjdGVycy4KICovCiAgICBzdGF0aWMgaW50CnNwZWxsX2lzd29yZHBfbm13KHApCiAgICBjaGFyX3UJKnA7CnsKI2lmZGVmIEZFQVRfTUJZVEUKICAgIGludAkJYzsKCiAgICBpZiAoaGFzX21ieXRlKQogICAgewoJYyA9IG1iX3B0cjJjaGFyKHApOwoJaWYgKGMgPiAyNTUpCgkgICAgcmV0dXJuIG1iX2dldF9jbGFzcyhwKSA+PSAyOwoJcmV0dXJuIHNwZWxsdGFiLnN0X2lzd1tjXTsKICAgIH0KI2VuZGlmCiAgICByZXR1cm4gc3BlbGx0YWIuc3RfaXN3WypwXTsKfQoKI2lmZGVmIEZFQVRfTUJZVEUKLyoKICogUmV0dXJuIFRSVUUgaWYgInAiIHBvaW50cyB0byBhIHdvcmQgY2hhcmFjdGVyLgogKiBXaWRlIHZlcnNpb24gb2Ygc3BlbGxfaXN3b3JkcCgpLgogKi8KICAgIHN0YXRpYyBpbnQKc3BlbGxfaXN3b3JkcF93KHAsIGJ1ZikKICAgIGludAkJKnA7CiAgICBidWZfVAkqYnVmOwp7CiAgICBpbnQJCSpzOwoKICAgIGlmICgqcCA8IDI1NiA/IGJ1Zi0+Yl9zcGVsbF9pc213WypwXQoJCSA6IChidWYtPmJfc3BlbGxfaXNtd19tYiAhPSBOVUxMCgkJCSAgICAgJiYgdmltX3N0cmNocihidWYtPmJfc3BlbGxfaXNtd19tYiwgKnApICE9IE5VTEwpKQoJcyA9IHAgKyAxOwogICAgZWxzZQoJcyA9IHA7CgogICAgaWYgKCpzID4gMjU1KQogICAgewoJaWYgKGVuY191dGY4KQoJICAgIHJldHVybiB1dGZfY2xhc3MoKnMpID49IDI7CglpZiAoZW5jX2RiY3MpCgkgICAgcmV0dXJuIGRiY3NfY2xhc3MoKHVuc2lnbmVkKSpzID4+IDgsICpzICYgMHhmZikgPj0gMjsKCXJldHVybiAwOwogICAgfQogICAgcmV0dXJuIHNwZWxsdGFiLnN0X2lzd1sqc107Cn0KI2VuZGlmCgovKgogKiBXcml0ZSB0aGUgdGFibGUgd2l0aCBwcmVmaXggY29uZGl0aW9ucyB0byB0aGUgLnNwbCBmaWxlLgogKiBXaGVuICJmZCIgaXMgTlVMTCBvbmx5IGNvdW50IHRoZSBsZW5ndGggb2Ygd2hhdCBpcyB3cml0dGVuLgogKi8KICAgIHN0YXRpYyBpbnQKd3JpdGVfc3BlbGxfcHJlZmNvbmQoZmQsIGdhcCkKICAgIEZJTEUJKmZkOwogICAgZ2FycmF5X1QJKmdhcDsKewogICAgaW50CQlpOwogICAgY2hhcl91CSpwOwogICAgaW50CQlsZW47CiAgICBpbnQJCXRvdGxlbjsKCiAgICBpZiAoZmQgIT0gTlVMTCkKCXB1dF9ieXRlcyhmZCwgKGxvbmdfdSlnYXAtPmdhX2xlbiwgMik7CSAgICAvKiA8cHJlZmNvbmRjbnQ+ICovCgogICAgdG90bGVuID0gMiArIGdhcC0+Z2FfbGVuOyAvKiBsZW5ndGggb2YgPHByZWZjb25kY250PiBhbmQgPGNvbmRsZW4+IGJ5dGVzICovCgogICAgZm9yIChpID0gMDsgaSA8IGdhcC0+Z2FfbGVuOyArK2kpCiAgICB7CgkvKiA8cHJlZmNvbmQ+IDogPGNvbmRsZW4+IDxjb25kc3RyPiAqLwoJcCA9ICgoY2hhcl91ICoqKWdhcC0+Z2FfZGF0YSlbaV07CglpZiAocCAhPSBOVUxMKQoJewoJICAgIGxlbiA9IFNUUkxFTihwKTsKCSAgICBpZiAoZmQgIT0gTlVMTCkKCSAgICB7CgkJZnB1dGMobGVuLCBmZCk7CgkJZndyaXRlKHAsIChzaXplX3QpbGVuLCAoc2l6ZV90KTEsIGZkKTsKCSAgICB9CgkgICAgdG90bGVuICs9IGxlbjsKCX0KCWVsc2UgaWYgKGZkICE9IE5VTEwpCgkgICAgZnB1dGMoMCwgZmQpOwogICAgfQoKICAgIHJldHVybiB0b3RsZW47Cn0KCi8qCiAqIENhc2UtZm9sZCAic3RyW2xlbl0iIGludG8gImJ1ZltidWZsZW5dIi4gIFRoZSByZXN1bHQgaXMgTlVMIHRlcm1pbmF0ZWQuCiAqIFVzZXMgdGhlIGNoYXJhY3RlciBkZWZpbml0aW9ucyBmcm9tIHRoZSAuc3BsIGZpbGUuCiAqIFdoZW4gdXNpbmcgYSBtdWx0aS1ieXRlICdlbmNvZGluZycgdGhlIGxlbmd0aCBtYXkgY2hhbmdlIQogKiBSZXR1cm5zIEZBSUwgd2hlbiBzb21ldGhpbmcgd3JvbmcuCiAqLwogICAgc3RhdGljIGludApzcGVsbF9jYXNlZm9sZChzdHIsIGxlbiwgYnVmLCBidWZsZW4pCiAgICBjaGFyX3UJKnN0cjsKICAgIGludAkJbGVuOwogICAgY2hhcl91CSpidWY7CiAgICBpbnQJCWJ1ZmxlbjsKewogICAgaW50CQlpOwoKICAgIGlmIChsZW4gPj0gYnVmbGVuKQogICAgewoJYnVmWzBdID0gTlVMOwoJcmV0dXJuIEZBSUw7CQkvKiByZXN1bHQgd2lsbCBub3QgZml0ICovCiAgICB9CgojaWZkZWYgRkVBVF9NQllURQogICAgaWYgKGhhc19tYnl0ZSkKICAgIHsKCWludAlvdXRpID0gMDsKCWNoYXJfdQkqcDsKCWludAljOwoKCS8qIEZvbGQgb25lIGNoYXJhY3RlciBhdCBhIHRpbWUuICovCglmb3IgKHAgPSBzdHI7IHAgPCBzdHIgKyBsZW47ICkKCXsKCSAgICBpZiAob3V0aSArIE1CX01BWEJZVEVTID4gYnVmbGVuKQoJICAgIHsKCQlidWZbb3V0aV0gPSBOVUw7CgkJcmV0dXJuIEZBSUw7CgkgICAgfQoJICAgIGMgPSBtYl9jcHRyMmNoYXJfYWR2KCZwKTsKCSAgICBvdXRpICs9IG1iX2NoYXIyYnl0ZXMoU1BFTExfVE9GT0xEKGMpLCBidWYgKyBvdXRpKTsKCX0KCWJ1ZltvdXRpXSA9IE5VTDsKICAgIH0KICAgIGVsc2UKI2VuZGlmCiAgICB7CgkvKiBCZSBxdWljayBmb3Igbm9uLW11bHRpYnl0ZSBlbmNvZGluZ3MuICovCglmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCgkgICAgYnVmW2ldID0gc3BlbGx0YWIuc3RfZm9sZFtzdHJbaV1dOwoJYnVmW2ldID0gTlVMOwogICAgfQoKICAgIHJldHVybiBPSzsKfQoKLyogdmFsdWVzIGZvciBzcHNfZmxhZ3MgKi8KI2RlZmluZSBTUFNfQkVTVCAgICAxCiNkZWZpbmUgU1BTX0ZBU1QgICAgMgojZGVmaW5lIFNQU19ET1VCTEUgIDQKCnN0YXRpYyBpbnQgc3BzX2ZsYWdzID0gU1BTX0JFU1Q7CS8qIGZsYWdzIGZyb20gJ3NwZWxsc3VnZ2VzdCcgKi8Kc3RhdGljIGludCBzcHNfbGltaXQgPSA5OTk5OwkJLyogbWF4IG5yIG9mIHN1Z2dlc3Rpb25zIGdpdmVuICovCgovKgogKiBDaGVjayB0aGUgJ3NwZWxsc3VnZ2VzdCcgb3B0aW9uLiAgUmV0dXJuIEZBSUwgaWYgaXQncyB3cm9uZy4KICogU2V0cyAic3BzX2ZsYWdzIiBhbmQgInNwc19saW1pdCIuCiAqLwogICAgaW50CnNwZWxsX2NoZWNrX3NwcygpCnsKICAgIGNoYXJfdQkqcDsKICAgIGNoYXJfdQkqczsKICAgIGNoYXJfdQlidWZbTUFYUEFUSExdOwogICAgaW50CQlmOwoKICAgIHNwc19mbGFncyA9IDA7CiAgICBzcHNfbGltaXQgPSA5OTk5OwoKICAgIGZvciAocCA9IHBfc3BzOyAqcCAhPSBOVUw7ICkKICAgIHsKCWNvcHlfb3B0aW9uX3BhcnQoJnAsIGJ1ZiwgTUFYUEFUSEwsICIsIik7CgoJZiA9IDA7CglpZiAoVklNX0lTRElHSVQoKmJ1ZikpCgl7CgkgICAgcyA9IGJ1ZjsKCSAgICBzcHNfbGltaXQgPSBnZXRkaWdpdHMoJnMpOwoJICAgIGlmICgqcyAhPSBOVUwgJiYgIVZJTV9JU0RJR0lUKCpzKSkKCQlmID0gLTE7Cgl9CgllbHNlIGlmIChTVFJDTVAoYnVmLCAiYmVzdCIpID09IDApCgkgICAgZiA9IFNQU19CRVNUOwoJZWxzZSBpZiAoU1RSQ01QKGJ1ZiwgImZhc3QiKSA9PSAwKQoJICAgIGYgPSBTUFNfRkFTVDsKCWVsc2UgaWYgKFNUUkNNUChidWYsICJkb3VibGUiKSA9PSAwKQoJICAgIGYgPSBTUFNfRE9VQkxFOwoJZWxzZSBpZiAoU1RSTkNNUChidWYsICJleHByOiIsIDUpICE9IDAKCQkmJiBTVFJOQ01QKGJ1ZiwgImZpbGU6IiwgNSkgIT0gMCkKCSAgICBmID0gLTE7CgoJaWYgKGYgPT0gLTEgfHwgKHNwc19mbGFncyAhPSAwICYmIGYgIT0gMCkpCgl7CgkgICAgc3BzX2ZsYWdzID0gU1BTX0JFU1Q7CgkgICAgc3BzX2xpbWl0ID0gOTk5OTsKCSAgICByZXR1cm4gRkFJTDsKCX0KCWlmIChmICE9IDApCgkgICAgc3BzX2ZsYWdzID0gZjsKICAgIH0KCiAgICBpZiAoc3BzX2ZsYWdzID09IDApCglzcHNfZmxhZ3MgPSBTUFNfQkVTVDsKCiAgICByZXR1cm4gT0s7Cn0KCi8qCiAqICJ6PyI6IEZpbmQgYmFkbHkgc3BlbGxlZCB3b3JkIHVuZGVyIG9yIGFmdGVyIHRoZSBjdXJzb3IuCiAqIEdpdmUgc3VnZ2VzdGlvbnMgZm9yIHRoZSBwcm9wZXJseSBzcGVsbGVkIHdvcmQuCiAqIEluIFZpc3VhbCBtb2RlIHVzZSB0aGUgaGlnaGxpZ2h0ZWQgd29yZCBhcyB0aGUgYmFkIHdvcmQuCiAqIFdoZW4gImNvdW50IiBpcyBub24temVybyB1c2UgdGhhdCBzdWdnZXN0aW9uLgogKi8KICAgIHZvaWQKc3BlbGxfc3VnZ2VzdChjb3VudCkKICAgIGludAkJY291bnQ7CnsKICAgIGNoYXJfdQkqbGluZTsKICAgIHBvc19UCXByZXZfY3Vyc29yID0gY3Vyd2luLT53X2N1cnNvcjsKICAgIGNoYXJfdQl3Y29weVtNQVhXTEVOICsgMl07CiAgICBjaGFyX3UJKnA7CiAgICBpbnQJCWk7CiAgICBpbnQJCWM7CiAgICBzdWdpbmZvX1QJc3VnOwogICAgc3VnZ2VzdF9UCSpzdHA7CiAgICBpbnQJCW1vdXNlX3VzZWQ7CiAgICBpbnQJCW5lZWRfY2FwOwogICAgaW50CQlsaW1pdDsKICAgIGludAkJc2VsZWN0ZWQgPSBjb3VudDsKICAgIGludAkJYmFkbGVuID0gMDsKCiAgICBpZiAobm9fc3BlbGxfY2hlY2tpbmcoY3Vyd2luKSkKCXJldHVybjsKCiNpZmRlZiBGRUFUX1ZJU1VBTAogICAgaWYgKFZJc3VhbF9hY3RpdmUpCiAgICB7CgkvKiBVc2UgdGhlIFZpc3VhbGx5IHNlbGVjdGVkIHRleHQgYXMgdGhlIGJhZCB3b3JkLiAgQnV0IHJlamVjdAoJICogYSBtdWx0aS1saW5lIHNlbGVjdGlvbi4gKi8KCWlmIChjdXJ3aW4tPndfY3Vyc29yLmxudW0gIT0gVklzdWFsLmxudW0pCgl7CgkgICAgdmltX2JlZXAoKTsKCSAgICByZXR1cm47Cgl9CgliYWRsZW4gPSAoaW50KWN1cndpbi0+d19jdXJzb3IuY29sIC0gKGludClWSXN1YWwuY29sOwoJaWYgKGJhZGxlbiA8IDApCgkgICAgYmFkbGVuID0gLWJhZGxlbjsKCWVsc2UKCSAgICBjdXJ3aW4tPndfY3Vyc29yLmNvbCA9IFZJc3VhbC5jb2w7CgkrK2JhZGxlbjsKCWVuZF92aXN1YWxfbW9kZSgpOwogICAgfQogICAgZWxzZQojZW5kaWYKCS8qIEZpbmQgdGhlIHN0YXJ0IG9mIHRoZSBiYWRseSBzcGVsbGVkIHdvcmQuICovCglpZiAoc3BlbGxfbW92ZV90byhjdXJ3aW4sIEZPUldBUkQsIFRSVUUsIFRSVUUsIE5VTEwpID09IDAKCSAgICB8fCBjdXJ3aW4tPndfY3Vyc29yLmNvbCA+IHByZXZfY3Vyc29yLmNvbCkKICAgIHsKCS8qIE5vIGJhZCB3b3JkIG9yIGl0IHN0YXJ0cyBhZnRlciB0aGUgY3Vyc29yOiB1c2UgdGhlIHdvcmQgdW5kZXIgdGhlCgkgKiBjdXJzb3IuICovCgljdXJ3aW4tPndfY3Vyc29yID0gcHJldl9jdXJzb3I7CglsaW5lID0gbWxfZ2V0X2N1cmxpbmUoKTsKCXAgPSBsaW5lICsgY3Vyd2luLT53X2N1cnNvci5jb2w7CgkvKiBCYWNrdXAgdG8gYmVmb3JlIHN0YXJ0IG9mIHdvcmQuICovCgl3aGlsZSAocCA+IGxpbmUgJiYgc3BlbGxfaXN3b3JkcF9ubXcocCkpCgkgICAgbWJfcHRyX2JhY2sobGluZSwgcCk7CgkvKiBGb3J3YXJkIHRvIHN0YXJ0IG9mIHdvcmQuICovCgl3aGlsZSAoKnAgIT0gTlVMICYmICFzcGVsbF9pc3dvcmRwX25tdyhwKSkKCSAgICBtYl9wdHJfYWR2KHApOwoKCWlmICghc3BlbGxfaXN3b3JkcF9ubXcocCkpCQkvKiBObyB3b3JkIGZvdW5kLiAqLwoJewoJICAgIGJlZXBfZmx1c2goKTsKCSAgICByZXR1cm47Cgl9CgljdXJ3aW4tPndfY3Vyc29yLmNvbCA9IHAgLSBsaW5lOwogICAgfQoKICAgIC8qIEdldCB0aGUgd29yZCBhbmQgaXRzIGxlbmd0aC4gKi8KCiAgICAvKiBGaWd1cmUgb3V0IGlmIHRoZSB3b3JkIHNob3VsZCBiZSBjYXBpdGFsaXNlZC4gKi8KICAgIG5lZWRfY2FwID0gY2hlY2tfbmVlZF9jYXAoY3Vyd2luLT53X2N1cnNvci5sbnVtLCBjdXJ3aW4tPndfY3Vyc29yLmNvbCk7CgogICAgbGluZSA9IG1sX2dldF9jdXJsaW5lKCk7CgogICAgLyogR2V0IHRoZSBsaXN0IG9mIHN1Z2dlc3Rpb25zLiAgTGltaXQgdG8gJ2xpbmVzJyAtIDIgb3IgdGhlIG51bWJlciBpbgogICAgICogJ3NwZWxsc3VnZ2VzdCcsIHdoYXRldmVyIGlzIHNtYWxsZXIuICovCiAgICBpZiAoc3BzX2xpbWl0ID4gKGludClSb3dzIC0gMikKCWxpbWl0ID0gKGludClSb3dzIC0gMjsKICAgIGVsc2UKCWxpbWl0ID0gc3BzX2xpbWl0OwogICAgc3BlbGxfZmluZF9zdWdnZXN0KGxpbmUgKyBjdXJ3aW4tPndfY3Vyc29yLmNvbCwgYmFkbGVuLCAmc3VnLCBsaW1pdCwKCQkJCQkJCVRSVUUsIG5lZWRfY2FwLCBUUlVFKTsKCiAgICBpZiAoc3VnLnN1X2dhLmdhX2xlbiA9PSAwKQoJTVNHKF8oIlNvcnJ5LCBubyBzdWdnZXN0aW9ucyIpKTsKICAgIGVsc2UgaWYgKGNvdW50ID4gMCkKICAgIHsKCWlmIChjb3VudCA+IHN1Zy5zdV9nYS5nYV9sZW4pCgkgICAgc21zZygoY2hhcl91ICopXygiU29ycnksIG9ubHkgJWxkIHN1Z2dlc3Rpb25zIiksCgkJCQkJCSAgICAgIChsb25nKXN1Zy5zdV9nYS5nYV9sZW4pOwogICAgfQogICAgZWxzZQogICAgewoJdmltX2ZyZWUocmVwbF9mcm9tKTsKCXJlcGxfZnJvbSA9IE5VTEw7Cgl2aW1fZnJlZShyZXBsX3RvKTsKCXJlcGxfdG8gPSBOVUxMOwoKI2lmZGVmIEZFQVRfUklHSFRMRUZUCgkvKiBXaGVuICdyaWdodGxlZnQnIGlzIHNldCB0aGUgbGlzdCBpcyBkcmF3biByaWdodC1sZWZ0LiAqLwoJY21kbXNnX3JsID0gY3Vyd2luLT53X3Bfcmw7CglpZiAoY21kbXNnX3JsKQoJICAgIG1zZ19jb2wgPSBDb2x1bW5zIC0gMTsKI2VuZGlmCgoJLyogTGlzdCB0aGUgc3VnZ2VzdGlvbnMuICovCgltc2dfc3RhcnQoKTsKCWxpbmVzX2xlZnQgPSBSb3dzOwkvKiBhdm9pZCBtb3JlIHByb21wdCAqLwoJdmltX3NucHJpbnRmKChjaGFyICopSU9idWZmLCBJT1NJWkUsIF8oIkNoYW5nZSBcIiUuKnNcIiB0bzoiKSwKCQkJCQkJc3VnLnN1X2JhZGxlbiwgc3VnLnN1X2JhZHB0cik7CiNpZmRlZiBGRUFUX1JJR0hUTEVGVAoJaWYgKGNtZG1zZ19ybCAmJiBTVFJOQ01QKElPYnVmZiwgIkNoYW5nZSIsIDYpID09IDApCgl7CgkgICAgLyogQW5kIG5vdyB0aGUgcmFiYml0IGZyb20gdGhlIGhpZ2ggaGF0OiBBdm9pZCBzaG93aW5nIHRoZQoJICAgICAqIHVudHJhbnNsYXRlZCBtZXNzYWdlIHJpZ2h0bGVmdC4gKi8KCSAgICB2aW1fc25wcmludGYoKGNoYXIgKilJT2J1ZmYsIElPU0laRSwgIjpvdCBcIiUuKnNcIiBlZ25haEMiLAoJCQkJCQlzdWcuc3VfYmFkbGVuLCBzdWcuc3VfYmFkcHRyKTsKCX0KI2VuZGlmCgltc2dfcHV0cyhJT2J1ZmYpOwoJbXNnX2Nscl9lb3MoKTsKCW1zZ19wdXRjaGFyKCdcbicpOwoKCW1zZ19zY3JvbGwgPSBUUlVFOwoJZm9yIChpID0gMDsgaSA8IHN1Zy5zdV9nYS5nYV9sZW47ICsraSkKCXsKCSAgICBzdHAgPSAmU1VHKHN1Zy5zdV9nYSwgaSk7CgoJICAgIC8qIFRoZSBzdWdnZXN0ZWQgd29yZCBtYXkgcmVwbGFjZSBvbmx5IHBhcnQgb2YgdGhlIGJhZCB3b3JkLCBhZGQKCSAgICAgKiB0aGUgbm90IHJlcGxhY2VkIHBhcnQuICovCgkgICAgU1RSQ1BZKHdjb3B5LCBzdHAtPnN0X3dvcmQpOwoJICAgIGlmIChzdWcuc3VfYmFkbGVuID4gc3RwLT5zdF9vcmdsZW4pCgkJdmltX3N0cm5jcHkod2NvcHkgKyBzdHAtPnN0X3dvcmRsZW4sCgkJCQkJICAgICAgIHN1Zy5zdV9iYWRwdHIgKyBzdHAtPnN0X29yZ2xlbiwKCQkJCQkgICAgICBzdWcuc3VfYmFkbGVuIC0gc3RwLT5zdF9vcmdsZW4pOwoJICAgIHZpbV9zbnByaW50ZigoY2hhciAqKUlPYnVmZiwgSU9TSVpFLCAiJTJkIiwgaSArIDEpOwojaWZkZWYgRkVBVF9SSUdIVExFRlQKCSAgICBpZiAoY21kbXNnX3JsKQoJCXJsX21pcnJvcihJT2J1ZmYpOwojZW5kaWYKCSAgICBtc2dfcHV0cyhJT2J1ZmYpOwoKCSAgICB2aW1fc25wcmludGYoKGNoYXIgKilJT2J1ZmYsIElPU0laRSwgIiBcIiVzXCIiLCB3Y29weSk7CgkgICAgbXNnX3B1dHMoSU9idWZmKTsKCgkgICAgLyogVGhlIHdvcmQgbWF5IHJlcGxhY2UgbW9yZSB0aGFuICJzdV9iYWRsZW4iLiAqLwoJICAgIGlmIChzdWcuc3VfYmFkbGVuIDwgc3RwLT5zdF9vcmdsZW4pCgkgICAgewoJCXZpbV9zbnByaW50ZigoY2hhciAqKUlPYnVmZiwgSU9TSVpFLCBfKCIgPCBcIiUuKnNcIiIpLAoJCQkJCSAgICAgICBzdHAtPnN0X29yZ2xlbiwgc3VnLnN1X2JhZHB0cik7CgkJbXNnX3B1dHMoSU9idWZmKTsKCSAgICB9CgoJICAgIGlmIChwX3ZlcmJvc2UgPiAwKQoJICAgIHsKCQkvKiBBZGQgdGhlIHNjb3JlLiAqLwoJCWlmIChzcHNfZmxhZ3MgJiAoU1BTX0RPVUJMRSB8IFNQU19CRVNUKSkKCQkgICAgdmltX3NucHJpbnRmKChjaGFyICopSU9idWZmLCBJT1NJWkUsICIgKCVzJWQgLSAlZCkiLAoJCQlzdHAtPnN0X3NhbHNjb3JlID8gInMgIiA6ICIiLAoJCQlzdHAtPnN0X3Njb3JlLCBzdHAtPnN0X2FsdHNjb3JlKTsKCQllbHNlCgkJICAgIHZpbV9zbnByaW50ZigoY2hhciAqKUlPYnVmZiwgSU9TSVpFLCAiICglZCkiLAoJCQkgICAgc3RwLT5zdF9zY29yZSk7CiNpZmRlZiBGRUFUX1JJR0hUTEVGVAoJCWlmIChjbWRtc2dfcmwpCgkJICAgIC8qIE1pcnJvciB0aGUgbnVtYmVycywgYnV0IGtlZXAgdGhlIGxlYWRpbmcgc3BhY2UuICovCgkJICAgIHJsX21pcnJvcihJT2J1ZmYgKyAxKTsKI2VuZGlmCgkJbXNnX2FkdmFuY2UoMzApOwoJCW1zZ19wdXRzKElPYnVmZik7CgkgICAgfQoJICAgIG1zZ19wdXRjaGFyKCdcbicpOwoJfQoKI2lmZGVmIEZFQVRfUklHSFRMRUZUCgljbWRtc2dfcmwgPSBGQUxTRTsKCW1zZ19jb2wgPSAwOwojZW5kaWYKCS8qIEFzayBmb3IgY2hvaWNlLiAqLwoJc2VsZWN0ZWQgPSBwcm9tcHRfZm9yX251bWJlcigmbW91c2VfdXNlZCk7CglpZiAobW91c2VfdXNlZCkKCSAgICBzZWxlY3RlZCAtPSBsaW5lc19sZWZ0OwoJbGluZXNfbGVmdCA9IFJvd3M7CS8qIGF2b2lkIG1vcmUgcHJvbXB0ICovCiAgICB9CgogICAgaWYgKHNlbGVjdGVkID4gMCAmJiBzZWxlY3RlZCA8PSBzdWcuc3VfZ2EuZ2FfbGVuICYmIHVfc2F2ZV9jdXJzb3IoKSA9PSBPSykKICAgIHsKCS8qIFNhdmUgdGhlIGZyb20gYW5kIHRvIHRleHQgZm9yIDpzcGVsbHJlcGFsbC4gKi8KCXN0cCA9ICZTVUcoc3VnLnN1X2dhLCBzZWxlY3RlZCAtIDEpOwoJaWYgKHN1Zy5zdV9iYWRsZW4gPiBzdHAtPnN0X29yZ2xlbikKCXsKCSAgICAvKiBSZXBsYWNpbmcgbGVzcyB0aGFuICJzdV9iYWRsZW4iLCBhcHBlbmQgdGhlIHJlbWFpbmRlciB0bwoJICAgICAqIHJlcGxfdG8uICovCgkgICAgcmVwbF9mcm9tID0gdmltX3N0cm5zYXZlKHN1Zy5zdV9iYWRwdHIsIHN1Zy5zdV9iYWRsZW4pOwoJICAgIHZpbV9zbnByaW50ZigoY2hhciAqKUlPYnVmZiwgSU9TSVpFLCAiJXMlLipzIiwgc3RwLT5zdF93b3JkLAoJCSAgICBzdWcuc3VfYmFkbGVuIC0gc3RwLT5zdF9vcmdsZW4sCgkJCQkJICAgICAgc3VnLnN1X2JhZHB0ciArIHN0cC0+c3Rfb3JnbGVuKTsKCSAgICByZXBsX3RvID0gdmltX3N0cnNhdmUoSU9idWZmKTsKCX0KCWVsc2UKCXsKCSAgICAvKiBSZXBsYWNpbmcgc3VfYmFkbGVuIG9yIG1vcmUsIHVzZSB0aGUgd2hvbGUgd29yZC4gKi8KCSAgICByZXBsX2Zyb20gPSB2aW1fc3RybnNhdmUoc3VnLnN1X2JhZHB0ciwgc3RwLT5zdF9vcmdsZW4pOwoJICAgIHJlcGxfdG8gPSB2aW1fc3Ryc2F2ZShzdHAtPnN0X3dvcmQpOwoJfQoKCS8qIFJlcGxhY2UgdGhlIHdvcmQuICovCglwID0gYWxsb2MoU1RSTEVOKGxpbmUpIC0gc3RwLT5zdF9vcmdsZW4gKyBzdHAtPnN0X3dvcmRsZW4gKyAxKTsKCWlmIChwICE9IE5VTEwpCgl7CgkgICAgYyA9IHN1Zy5zdV9iYWRwdHIgLSBsaW5lOwoJICAgIG1jaF9tZW1tb3ZlKHAsIGxpbmUsIGMpOwoJICAgIFNUUkNQWShwICsgYywgc3RwLT5zdF93b3JkKTsKCSAgICBTVFJDQVQocCwgc3VnLnN1X2JhZHB0ciArIHN0cC0+c3Rfb3JnbGVuKTsKCSAgICBtbF9yZXBsYWNlKGN1cndpbi0+d19jdXJzb3IubG51bSwgcCwgRkFMU0UpOwoJICAgIGN1cndpbi0+d19jdXJzb3IuY29sID0gYzsKCgkgICAgLyogRm9yIHJlZG8gd2UgdXNlIGEgY2hhbmdlLXdvcmQgY29tbWFuZC4gKi8KCSAgICBSZXNldFJlZG9idWZmKCk7CgkgICAgQXBwZW5kVG9SZWRvYnVmZigoY2hhcl91ICopImNpdyIpOwoJICAgIEFwcGVuZFRvUmVkb2J1ZmZMaXQocCArIGMsCgkJCSAgICBzdHAtPnN0X3dvcmRsZW4gKyBzdWcuc3VfYmFkbGVuIC0gc3RwLT5zdF9vcmdsZW4pOwoJICAgIEFwcGVuZENoYXJUb1JlZG9idWZmKEVTQyk7CgoJICAgIC8qIEFmdGVyIHRoaXMgInAiIG1heSBiZSBpbnZhbGlkLiAqLwoJICAgIGNoYW5nZWRfYnl0ZXMoY3Vyd2luLT53X2N1cnNvci5sbnVtLCBjKTsKCX0KICAgIH0KICAgIGVsc2UKCWN1cndpbi0+d19jdXJzb3IgPSBwcmV2X2N1cnNvcjsKCiAgICBzcGVsbF9maW5kX2NsZWFudXAoJnN1Zyk7Cn0KCi8qCiAqIENoZWNrIGlmIHRoZSB3b3JkIGF0IGxpbmUgImxudW0iIGNvbHVtbiAiY29sIiBpcyByZXF1aXJlZCB0byBzdGFydCB3aXRoIGEKICogY2FwaXRhbC4gIFRoaXMgdXNlcyAnc3BlbGxjYXBjaGVjaycgb2YgdGhlIGN1cnJlbnQgYnVmZmVyLgogKi8KICAgIHN0YXRpYyBpbnQKY2hlY2tfbmVlZF9jYXAobG51bSwgY29sKQogICAgbGluZW5yX1QJbG51bTsKICAgIGNvbG5yX1QJY29sOwp7CiAgICBpbnQJCW5lZWRfY2FwID0gRkFMU0U7CiAgICBjaGFyX3UJKmxpbmU7CiAgICBjaGFyX3UJKmxpbmVfY29weSA9IE5VTEw7CiAgICBjaGFyX3UJKnA7CiAgICBjb2xucl9UCWVuZGNvbDsKICAgIHJlZ21hdGNoX1QJcmVnbWF0Y2g7CgogICAgaWYgKGN1cmJ1Zi0+Yl9jYXBfcHJvZyA9PSBOVUxMKQoJcmV0dXJuIEZBTFNFOwoKICAgIGxpbmUgPSBtbF9nZXRfY3VybGluZSgpOwogICAgZW5kY29sID0gMDsKICAgIGlmICgoaW50KShza2lwd2hpdGUobGluZSkgLSBsaW5lKSA+PSAoaW50KWNvbCkKICAgIHsKCS8qIEF0IHN0YXJ0IG9mIGxpbmUsIGNoZWNrIGlmIHByZXZpb3VzIGxpbmUgaXMgZW1wdHkgb3Igc2VudGVuY2UKCSAqIGVuZHMgdGhlcmUuICovCglpZiAobG51bSA9PSAxKQoJICAgIG5lZWRfY2FwID0gVFJVRTsKCWVsc2UKCXsKCSAgICBsaW5lID0gbWxfZ2V0KGxudW0gLSAxKTsKCSAgICBpZiAoKnNraXB3aGl0ZShsaW5lKSA9PSBOVUwpCgkJbmVlZF9jYXAgPSBUUlVFOwoJICAgIGVsc2UKCSAgICB7CgkJLyogQXBwZW5kIGEgc3BhY2UgaW4gcGxhY2Ugb2YgdGhlIGxpbmUgYnJlYWsuICovCgkJbGluZV9jb3B5ID0gY29uY2F0X3N0cihsaW5lLCAoY2hhcl91ICopIiAiKTsKCQlsaW5lID0gbGluZV9jb3B5OwoJCWVuZGNvbCA9IFNUUkxFTihsaW5lKTsKCSAgICB9Cgl9CiAgICB9CiAgICBlbHNlCgllbmRjb2wgPSBjb2w7CgogICAgaWYgKGVuZGNvbCA+IDApCiAgICB7CgkvKiBDaGVjayBpZiBzZW50ZW5jZSBlbmRzIGJlZm9yZSB0aGUgYmFkIHdvcmQuICovCglyZWdtYXRjaC5yZWdwcm9nID0gY3VyYnVmLT5iX2NhcF9wcm9nOwoJcmVnbWF0Y2gucm1faWMgPSBGQUxTRTsKCXAgPSBsaW5lICsgZW5kY29sOwoJZm9yICg7OykKCXsKCSAgICBtYl9wdHJfYmFjayhsaW5lLCBwKTsKCSAgICBpZiAocCA9PSBsaW5lIHx8IHNwZWxsX2lzd29yZHBfbm13KHApKQoJCWJyZWFrOwoJICAgIGlmICh2aW1fcmVnZXhlYygmcmVnbWF0Y2gsIHAsIDApCgkJCQkJICYmIHJlZ21hdGNoLmVuZHBbMF0gPT0gbGluZSArIGVuZGNvbCkKCSAgICB7CgkJbmVlZF9jYXAgPSBUUlVFOwoJCWJyZWFrOwoJICAgIH0KCX0KICAgIH0KCiAgICB2aW1fZnJlZShsaW5lX2NvcHkpOwoKICAgIHJldHVybiBuZWVkX2NhcDsKfQoKCi8qCiAqICI6c3BlbGxyZXBhbGwiCiAqLwovKkFSR1NVU0VEKi8KICAgIHZvaWQKZXhfc3BlbGxyZXBhbGwoZWFwKQogICAgZXhhcmdfVCAqZWFwOwp7CiAgICBwb3NfVAlwb3MgPSBjdXJ3aW4tPndfY3Vyc29yOwogICAgY2hhcl91CSpmcm9tcGF0OwogICAgaW50CQlhZGRsZW47CiAgICBjaGFyX3UJKmxpbmU7CiAgICBjaGFyX3UJKnA7CiAgICBpbnQJCXNhdmVfd3MgPSBwX3dzOwogICAgbGluZW5yX1QJcHJldl9sbnVtID0gMDsKCiAgICBpZiAocmVwbF9mcm9tID09IE5VTEwgfHwgcmVwbF90byA9PSBOVUxMKQogICAgewoJRU1TRyhfKCJFNzUyOiBObyBwcmV2aW91cyBzcGVsbCByZXBsYWNlbWVudCIpKTsKCXJldHVybjsKICAgIH0KICAgIGFkZGxlbiA9IFNUUkxFTihyZXBsX3RvKSAtIFNUUkxFTihyZXBsX2Zyb20pOwoKICAgIGZyb21wYXQgPSBhbGxvYyhTVFJMRU4ocmVwbF9mcm9tKSArIDcpOwogICAgaWYgKGZyb21wYXQgPT0gTlVMTCkKCXJldHVybjsKICAgIHNwcmludGYoKGNoYXIgKilmcm9tcGF0LCAiXFxWXFw8JXNcXD4iLCByZXBsX2Zyb20pOwogICAgcF93cyA9IEZBTFNFOwoKICAgIHN1Yl9uc3VicyA9IDA7CiAgICBzdWJfbmxpbmVzID0gMDsKICAgIGN1cndpbi0+d19jdXJzb3IubG51bSA9IDA7CiAgICB3aGlsZSAoIWdvdF9pbnQpCiAgICB7CglpZiAoZG9fc2VhcmNoKE5VTEwsICcvJywgZnJvbXBhdCwgMUwsIFNFQVJDSF9LRUVQKSA9PSAwCgkJCQkJCSAgIHx8IHVfc2F2ZV9jdXJzb3IoKSA9PSBGQUlMKQoJICAgIGJyZWFrOwoKCS8qIE9ubHkgcmVwbGFjZSB3aGVuIHRoZSByaWdodCB3b3JkIGlzbid0IHRoZXJlIHlldC4gIFRoaXMgaGFwcGVucwoJICogd2hlbiBjaGFuZ2luZyAiZXRjIiB0byAiZXRjLiIuICovCglsaW5lID0gbWxfZ2V0X2N1cmxpbmUoKTsKCWlmIChhZGRsZW4gPD0gMCB8fCBTVFJOQ01QKGxpbmUgKyBjdXJ3aW4tPndfY3Vyc29yLmNvbCwKCQkJCQkgICAgICAgcmVwbF90bywgU1RSTEVOKHJlcGxfdG8pKSAhPSAwKQoJewoJICAgIHAgPSBhbGxvYyhTVFJMRU4obGluZSkgKyBhZGRsZW4gKyAxKTsKCSAgICBpZiAocCA9PSBOVUxMKQoJCWJyZWFrOwoJICAgIG1jaF9tZW1tb3ZlKHAsIGxpbmUsIGN1cndpbi0+d19jdXJzb3IuY29sKTsKCSAgICBTVFJDUFkocCArIGN1cndpbi0+d19jdXJzb3IuY29sLCByZXBsX3RvKTsKCSAgICBTVFJDQVQocCwgbGluZSArIGN1cndpbi0+d19jdXJzb3IuY29sICsgU1RSTEVOKHJlcGxfZnJvbSkpOwoJICAgIG1sX3JlcGxhY2UoY3Vyd2luLT53X2N1cnNvci5sbnVtLCBwLCBGQUxTRSk7CgkgICAgY2hhbmdlZF9ieXRlcyhjdXJ3aW4tPndfY3Vyc29yLmxudW0sIGN1cndpbi0+d19jdXJzb3IuY29sKTsKCgkgICAgaWYgKGN1cndpbi0+d19jdXJzb3IubG51bSAhPSBwcmV2X2xudW0pCgkgICAgewoJCSsrc3ViX25saW5lczsKCQlwcmV2X2xudW0gPSBjdXJ3aW4tPndfY3Vyc29yLmxudW07CgkgICAgfQoJICAgICsrc3ViX25zdWJzOwoJfQoJY3Vyd2luLT53X2N1cnNvci5jb2wgKz0gU1RSTEVOKHJlcGxfdG8pOwogICAgfQoKICAgIHBfd3MgPSBzYXZlX3dzOwogICAgY3Vyd2luLT53X2N1cnNvciA9IHBvczsKICAgIHZpbV9mcmVlKGZyb21wYXQpOwoKICAgIGlmIChzdWJfbnN1YnMgPT0gMCkKCUVNU0cyKF8oIkU3NTM6IE5vdCBmb3VuZDogJXMiKSwgcmVwbF9mcm9tKTsKICAgIGVsc2UKCWRvX3N1Yl9tc2coRkFMU0UpOwp9CgovKgogKiBGaW5kIHNwZWxsIHN1Z2dlc3Rpb25zIGZvciAid29yZCIuICBSZXR1cm4gdGhlbSBpbiB0aGUgZ3Jvd2FycmF5ICIqZ2FwIiBhcwogKiBhIGxpc3Qgb2YgYWxsb2NhdGVkIHN0cmluZ3MuCiAqLwogICAgdm9pZApzcGVsbF9zdWdnZXN0X2xpc3QoZ2FwLCB3b3JkLCBtYXhjb3VudCwgbmVlZF9jYXAsIGludGVyYWN0aXZlKQogICAgZ2FycmF5X1QJKmdhcDsKICAgIGNoYXJfdQkqd29yZDsKICAgIGludAkJbWF4Y291bnQ7CS8qIG1heGltdW0gbnIgb2Ygc3VnZ2VzdGlvbnMgKi8KICAgIGludAkJbmVlZF9jYXA7CS8qICdzcGVsbGNhcGNoZWNrJyBtYXRjaGVkICovCiAgICBpbnQJCWludGVyYWN0aXZlOwp7CiAgICBzdWdpbmZvX1QJc3VnOwogICAgaW50CQlpOwogICAgc3VnZ2VzdF9UCSpzdHA7CiAgICBjaGFyX3UJKndjb3B5OwoKICAgIHNwZWxsX2ZpbmRfc3VnZ2VzdCh3b3JkLCAwLCAmc3VnLCBtYXhjb3VudCwgRkFMU0UsIG5lZWRfY2FwLCBpbnRlcmFjdGl2ZSk7CgogICAgLyogTWFrZSByb29tIGluICJnYXAiLiAqLwogICAgZ2FfaW5pdDIoZ2FwLCBzaXplb2YoY2hhcl91ICopLCBzdWcuc3VfZ2EuZ2FfbGVuICsgMSk7CiAgICBpZiAoZ2FfZ3JvdyhnYXAsIHN1Zy5zdV9nYS5nYV9sZW4pID09IE9LKQogICAgewoJZm9yIChpID0gMDsgaSA8IHN1Zy5zdV9nYS5nYV9sZW47ICsraSkKCXsKCSAgICBzdHAgPSAmU1VHKHN1Zy5zdV9nYSwgaSk7CgoJICAgIC8qIFRoZSBzdWdnZXN0ZWQgd29yZCBtYXkgcmVwbGFjZSBvbmx5IHBhcnQgb2YgIndvcmQiLCBhZGQgdGhlIG5vdAoJICAgICAqIHJlcGxhY2VkIHBhcnQuICovCgkgICAgd2NvcHkgPSBhbGxvYyhzdHAtPnN0X3dvcmRsZW4KCQkJCSsgU1RSTEVOKHN1Zy5zdV9iYWRwdHIgKyBzdHAtPnN0X29yZ2xlbikgKyAxKTsKCSAgICBpZiAod2NvcHkgPT0gTlVMTCkKCQlicmVhazsKCSAgICBTVFJDUFkod2NvcHksIHN0cC0+c3Rfd29yZCk7CgkgICAgU1RSQ1BZKHdjb3B5ICsgc3RwLT5zdF93b3JkbGVuLCBzdWcuc3VfYmFkcHRyICsgc3RwLT5zdF9vcmdsZW4pOwoJICAgICgoY2hhcl91ICoqKWdhcC0+Z2FfZGF0YSlbZ2FwLT5nYV9sZW4rK10gPSB3Y29weTsKCX0KICAgIH0KCiAgICBzcGVsbF9maW5kX2NsZWFudXAoJnN1Zyk7Cn0KCi8qCiAqIEZpbmQgc3BlbGwgc3VnZ2VzdGlvbnMgZm9yIHRoZSB3b3JkIGF0IHRoZSBzdGFydCBvZiAiYmFkcHRyIi4KICogUmV0dXJuIHRoZSBzdWdnZXN0aW9ucyBpbiAic3UtPnN1X2dhIi4KICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHN1Z2dlc3Rpb25zIGlzICJtYXhjb3VudCIuCiAqIE5vdGU6IGRvZXMgdXNlIGluZm8gZm9yIHRoZSBjdXJyZW50IHdpbmRvdy4KICogVGhpcyBpcyBiYXNlZCBvbiB0aGUgbWVjaGFuaXNtcyBvZiBBc3BlbGwsIGJ1dCBjb21wbGV0ZWx5IHJlaW1wbGVtZW50ZWQuCiAqLwogICAgc3RhdGljIHZvaWQKc3BlbGxfZmluZF9zdWdnZXN0KGJhZHB0ciwgYmFkbGVuLCBzdSwgbWF4Y291bnQsIGJhbmJhZHdvcmQsIG5lZWRfY2FwLCBpbnRlcmFjdGl2ZSkKICAgIGNoYXJfdQkqYmFkcHRyOwogICAgaW50CQliYWRsZW47CQkvKiBsZW5ndGggb2YgYmFkIHdvcmQgb3IgMCBpZiB1bmtub3duICovCiAgICBzdWdpbmZvX1QJKnN1OwogICAgaW50CQltYXhjb3VudDsKICAgIGludAkJYmFuYmFkd29yZDsJLyogZG9uJ3QgaW5jbHVkZSBiYWR3b3JkIGluIHN1Z2dlc3Rpb25zICovCiAgICBpbnQJCW5lZWRfY2FwOwkvKiB3b3JkIHNob3VsZCBzdGFydCB3aXRoIGNhcGl0YWwgKi8KICAgIGludAkJaW50ZXJhY3RpdmU7CnsKICAgIGhsZl9UCWF0dHIgPSBITEZfQ09VTlQ7CiAgICBjaGFyX3UJYnVmW01BWFBBVEhMXTsKICAgIGNoYXJfdQkqcDsKICAgIGludAkJZG9fY29tYmluZSA9IEZBTFNFOwogICAgY2hhcl91CSpzcHNfY29weTsKI2lmZGVmIEZFQVRfRVZBTAogICAgc3RhdGljIGludAlleHByX2J1c3kgPSBGQUxTRTsKI2VuZGlmCiAgICBpbnQJCWM7CiAgICBpbnQJCWk7CiAgICBsYW5ncF9UCSpscDsKCiAgICAvKgogICAgICogU2V0IHRoZSBpbmZvIGluICIqc3UiLgogICAgICovCiAgICB2aW1fbWVtc2V0KHN1LCAwLCBzaXplb2Yoc3VnaW5mb19UKSk7CiAgICBnYV9pbml0Migmc3UtPnN1X2dhLCAoaW50KXNpemVvZihzdWdnZXN0X1QpLCAxMCk7CiAgICBnYV9pbml0Migmc3UtPnN1X3NnYSwgKGludClzaXplb2Yoc3VnZ2VzdF9UKSwgMTApOwogICAgaWYgKCpiYWRwdHIgPT0gTlVMKQoJcmV0dXJuOwogICAgaGFzaF9pbml0KCZzdS0+c3VfYmFubmVkKTsKCiAgICBzdS0+c3VfYmFkcHRyID0gYmFkcHRyOwogICAgaWYgKGJhZGxlbiAhPSAwKQoJc3UtPnN1X2JhZGxlbiA9IGJhZGxlbjsKICAgIGVsc2UKCXN1LT5zdV9iYWRsZW4gPSBzcGVsbF9jaGVjayhjdXJ3aW4sIHN1LT5zdV9iYWRwdHIsICZhdHRyLCBOVUxMLCBGQUxTRSk7CiAgICBzdS0+c3VfbWF4Y291bnQgPSBtYXhjb3VudDsKICAgIHN1LT5zdV9tYXhzY29yZSA9IFNDT1JFX01BWElOSVQ7CgogICAgaWYgKHN1LT5zdV9iYWRsZW4gPj0gTUFYV0xFTikKCXN1LT5zdV9iYWRsZW4gPSBNQVhXTEVOIC0gMTsJLyoganVzdCBpbiBjYXNlICovCiAgICB2aW1fc3RybmNweShzdS0+c3VfYmFkd29yZCwgc3UtPnN1X2JhZHB0ciwgc3UtPnN1X2JhZGxlbik7CiAgICAodm9pZClzcGVsbF9jYXNlZm9sZChzdS0+c3VfYmFkcHRyLCBzdS0+c3VfYmFkbGVuLAoJCQkJCQkgICAgc3UtPnN1X2ZiYWR3b3JkLCBNQVhXTEVOKTsKICAgIC8qIGdldCBjYXBzIGZsYWdzIGZvciBiYWQgd29yZCAqLwogICAgc3UtPnN1X2JhZGZsYWdzID0gYmFkd29yZF9jYXB0eXBlKHN1LT5zdV9iYWRwdHIsCgkJCQkJICAgICAgIHN1LT5zdV9iYWRwdHIgKyBzdS0+c3VfYmFkbGVuKTsKICAgIGlmIChuZWVkX2NhcCkKCXN1LT5zdV9iYWRmbGFncyB8PSBXRl9PTkVDQVA7CgogICAgLyogRmluZCB0aGUgZGVmYXVsdCBsYW5ndWFnZSBmb3Igc291bmQgZm9sZGluZy4gIFdlIHNpbXBseSB1c2UgdGhlIGZpcnN0CiAgICAgKiBvbmUgaW4gJ3NwZWxsbGFuZycgdGhhdCBzdXBwb3J0cyBzb3VuZCBmb2xkaW5nLiAgVGhhdCdzIGdvb2QgZm9yIHdoZW4KICAgICAqIHVzaW5nIG11bHRpcGxlIGZpbGVzIGZvciBvbmUgbGFuZ3VhZ2UsIGl0J3Mgbm90IHRoYXQgYmFkIHdoZW4gbWl4aW5nCiAgICAgKiBsYW5ndWFnZXMgKGUuZy4sICJwbCxlbiIpLiAqLwogICAgZm9yIChpID0gMDsgaSA8IGN1cmJ1Zi0+Yl9sYW5ncC5nYV9sZW47ICsraSkKICAgIHsKCWxwID0gTEFOR1BfRU5UUlkoY3VyYnVmLT5iX2xhbmdwLCBpKTsKCWlmIChscC0+bHBfc2FsbGFuZyAhPSBOVUxMKQoJewoJICAgIHN1LT5zdV9zYWxsYW5nID0gbHAtPmxwX3NhbGxhbmc7CgkgICAgYnJlYWs7Cgl9CiAgICB9CgogICAgLyogU291bmRmb2xkIHRoZSBiYWQgd29yZCB3aXRoIHRoZSBkZWZhdWx0IHNvdW5kIGZvbGRpbmcsIHNvIHRoYXQgd2UgZG9uJ3QKICAgICAqIGhhdmUgdG8gZG8gdGhpcyBtYW55IHRpbWVzLiAqLwogICAgaWYgKHN1LT5zdV9zYWxsYW5nICE9IE5VTEwpCglzcGVsbF9zb3VuZGZvbGQoc3UtPnN1X3NhbGxhbmcsIHN1LT5zdV9mYmFkd29yZCwgVFJVRSwKCQkJCQkJCSAgc3UtPnN1X3NhbF9iYWR3b3JkKTsKCiAgICAvKiBJZiB0aGUgd29yZCBpcyBub3QgY2FwaXRhbGlzZWQgYW5kIHNwZWxsX2NoZWNrKCkgZG9lc24ndCBjb25zaWRlciB0aGUKICAgICAqIHdvcmQgdG8gYmUgYmFkIHRoZW4gaXQgbWlnaHQgbmVlZCB0byBiZSBjYXBpdGFsaXNlZC4gIEFkZCBhIHN1Z2dlc3Rpb24KICAgICAqIGZvciB0aGF0LiAqLwogICAgYyA9IFBUUjJDSEFSKHN1LT5zdV9iYWRwdHIpOwogICAgaWYgKCFTUEVMTF9JU1VQUEVSKGMpICYmIGF0dHIgPT0gSExGX0NPVU5UKQogICAgewoJbWFrZV9jYXNlX3dvcmQoc3UtPnN1X2JhZHdvcmQsIGJ1ZiwgV0ZfT05FQ0FQKTsKCWFkZF9zdWdnZXN0aW9uKHN1LCAmc3UtPnN1X2dhLCBidWYsIHN1LT5zdV9iYWRsZW4sIFNDT1JFX0lDQVNFLAoJCQkJCSAgICAgIDAsIFRSVUUsIHN1LT5zdV9zYWxsYW5nLCBGQUxTRSk7CiAgICB9CgogICAgLyogQmFuIHRoZSBiYWQgd29yZCBpdHNlbGYuICBJdCBtYXkgYXBwZWFyIGluIGFub3RoZXIgcmVnaW9uLiAqLwogICAgaWYgKGJhbmJhZHdvcmQpCglhZGRfYmFubmVkKHN1LCBzdS0+c3VfYmFkd29yZCk7CgogICAgLyogTWFrZSBhIGNvcHkgb2YgJ3NwZWxsc3VnZ2VzdCcsIGJlY2F1c2UgdGhlIGV4cHJlc3Npb24gbWF5IGNoYW5nZSBpdC4gKi8KICAgIHNwc19jb3B5ID0gdmltX3N0cnNhdmUocF9zcHMpOwogICAgaWYgKHNwc19jb3B5ID09IE5VTEwpCglyZXR1cm47CgogICAgLyogTG9vcCBvdmVyIHRoZSBpdGVtcyBpbiAnc3BlbGxzdWdnZXN0Jy4gKi8KICAgIGZvciAocCA9IHNwc19jb3B5OyAqcCAhPSBOVUw7ICkKICAgIHsKCWNvcHlfb3B0aW9uX3BhcnQoJnAsIGJ1ZiwgTUFYUEFUSEwsICIsIik7CgoJaWYgKFNUUk5DTVAoYnVmLCAiZXhwcjoiLCA1KSA9PSAwKQoJewojaWZkZWYgRkVBVF9FVkFMCgkgICAgLyogRXZhbHVhdGUgYW4gZXhwcmVzc2lvbi4gIFNraXAgdGhpcyB3aGVuIGNhbGxlZCByZWN1cnNpdmVseSwKCSAgICAgKiB3aGVuIHVzaW5nIHNwZWxsc3VnZ2VzdCgpIGluIHRoZSBleHByZXNzaW9uLiAqLwoJICAgIGlmICghZXhwcl9idXN5KQoJICAgIHsKCQlleHByX2J1c3kgPSBUUlVFOwoJCXNwZWxsX3N1Z2dlc3RfZXhwcihzdSwgYnVmICsgNSk7CgkJZXhwcl9idXN5ID0gRkFMU0U7CgkgICAgfQojZW5kaWYKCX0KCWVsc2UgaWYgKFNUUk5DTVAoYnVmLCAiZmlsZToiLCA1KSA9PSAwKQoJICAgIC8qIFVzZSBsaXN0IG9mIHN1Z2dlc3Rpb25zIGluIGEgZmlsZS4gKi8KCSAgICBzcGVsbF9zdWdnZXN0X2ZpbGUoc3UsIGJ1ZiArIDUpOwoJZWxzZQoJewoJICAgIC8qIFVzZSBpbnRlcm5hbCBtZXRob2QuICovCgkgICAgc3BlbGxfc3VnZ2VzdF9pbnRlcm4oc3UsIGludGVyYWN0aXZlKTsKCSAgICBpZiAoc3BzX2ZsYWdzICYgU1BTX0RPVUJMRSkKCQlkb19jb21iaW5lID0gVFJVRTsKCX0KICAgIH0KCiAgICB2aW1fZnJlZShzcHNfY29weSk7CgogICAgaWYgKGRvX2NvbWJpbmUpCgkvKiBDb21iaW5lIHRoZSB0d28gbGlzdCBvZiBzdWdnZXN0aW9ucy4gIFRoaXMgbXVzdCBiZSBkb25lIGxhc3QsCgkgKiBiZWNhdXNlIHNvcnRpbmcgY2hhbmdlcyB0aGUgb3JkZXIgYWdhaW4uICovCglzY29yZV9jb21iaW5lKHN1KTsKfQoKI2lmZGVmIEZFQVRfRVZBTAovKgogKiBGaW5kIHN1Z2dlc3Rpb25zIGJ5IGV2YWx1YXRpbmcgZXhwcmVzc2lvbiAiZXhwciIuCiAqLwogICAgc3RhdGljIHZvaWQKc3BlbGxfc3VnZ2VzdF9leHByKHN1LCBleHByKQogICAgc3VnaW5mb19UCSpzdTsKICAgIGNoYXJfdQkqZXhwcjsKewogICAgbGlzdF9UCSpsaXN0OwogICAgbGlzdGl0ZW1fVAkqbGk7CiAgICBpbnQJCXNjb3JlOwogICAgY2hhcl91CSpwOwoKICAgIC8qIFRoZSB3b3JrIGlzIHNwbGl0IHVwIGluIGEgZmV3IHBhcnRzIHRvIGF2b2lkIGhhdmluZyB0byBleHBvcnQKICAgICAqIHN1Z2luZm9fVC4KICAgICAqIEZpcnN0IGV2YWx1YXRlIHRoZSBleHByZXNzaW9uIGFuZCBnZXQgdGhlIHJlc3VsdGluZyBsaXN0LiAqLwogICAgbGlzdCA9IGV2YWxfc3BlbGxfZXhwcihzdS0+c3VfYmFkd29yZCwgZXhwcik7CiAgICBpZiAobGlzdCAhPSBOVUxMKQogICAgewoJLyogTG9vcCBvdmVyIHRoZSBpdGVtcyBpbiB0aGUgbGlzdC4gKi8KCWZvciAobGkgPSBsaXN0LT5sdl9maXJzdDsgbGkgIT0gTlVMTDsgbGkgPSBsaS0+bGlfbmV4dCkKCSAgICBpZiAobGktPmxpX3R2LnZfdHlwZSA9PSBWQVJfTElTVCkKCSAgICB7CgkJLyogR2V0IHRoZSB3b3JkIGFuZCB0aGUgc2NvcmUgZnJvbSB0aGUgaXRlbXMuICovCgkJc2NvcmUgPSBnZXRfc3BlbGx3b3JkKGxpLT5saV90di52dmFsLnZfbGlzdCwgJnApOwoJCWlmIChzY29yZSA+PSAwICYmIHNjb3JlIDw9IHN1LT5zdV9tYXhzY29yZSkKCQkgICAgYWRkX3N1Z2dlc3Rpb24oc3UsICZzdS0+c3VfZ2EsIHAsIHN1LT5zdV9iYWRsZW4sCgkJCQkgICAgICAgc2NvcmUsIDAsIFRSVUUsIHN1LT5zdV9zYWxsYW5nLCBGQUxTRSk7CgkgICAgfQoJbGlzdF91bnJlZihsaXN0KTsKICAgIH0KCiAgICAvKiBSZW1vdmUgYm9ndXMgc3VnZ2VzdGlvbnMsIHNvcnQgYW5kIHRydW5jYXRlIGF0ICJtYXhjb3VudCIuICovCiAgICBjaGVja19zdWdnZXN0aW9ucyhzdSwgJnN1LT5zdV9nYSk7CiAgICAodm9pZCljbGVhbnVwX3N1Z2dlc3Rpb25zKCZzdS0+c3VfZ2EsIHN1LT5zdV9tYXhzY29yZSwgc3UtPnN1X21heGNvdW50KTsKfQojZW5kaWYKCi8qCiAqIEZpbmQgc3VnZ2VzdGlvbnMgaW4gZmlsZSAiZm5hbWUiLiAgVXNlZCBmb3IgImZpbGU6IiBpbiAnc3BlbGxzdWdnZXN0Jy4KICovCiAgICBzdGF0aWMgdm9pZApzcGVsbF9zdWdnZXN0X2ZpbGUoc3UsIGZuYW1lKQogICAgc3VnaW5mb19UCSpzdTsKICAgIGNoYXJfdQkqZm5hbWU7CnsKICAgIEZJTEUJKmZkOwogICAgY2hhcl91CWxpbmVbTUFYV0xFTiAqIDJdOwogICAgY2hhcl91CSpwOwogICAgaW50CQlsZW47CiAgICBjaGFyX3UJY3dvcmRbTUFYV0xFTl07CgogICAgLyogT3BlbiB0aGUgZmlsZS4gKi8KICAgIGZkID0gbWNoX2ZvcGVuKChjaGFyICopZm5hbWUsICJyIik7CiAgICBpZiAoZmQgPT0gTlVMTCkKICAgIHsKCUVNU0cyKF8oZV9ub3RvcGVuKSwgZm5hbWUpOwoJcmV0dXJuOwogICAgfQoKICAgIC8qIFJlYWQgaXQgbGluZSBieSBsaW5lLiAqLwogICAgd2hpbGUgKCF2aW1fZmdldHMobGluZSwgTUFYV0xFTiAqIDIsIGZkKSAmJiAhZ290X2ludCkKICAgIHsKCWxpbmVfYnJlYWtjaGVjaygpOwoKCXAgPSB2aW1fc3RyY2hyKGxpbmUsICcvJyk7CglpZiAocCA9PSBOVUxMKQoJICAgIGNvbnRpbnVlOwkgICAgLyogTm8gVGFiIGZvdW5kLCBqdXN0IHNraXAgdGhlIGxpbmUuICovCgkqcCsrID0gTlVMOwoJaWYgKFNUUklDTVAoc3UtPnN1X2JhZHdvcmQsIGxpbmUpID09IDApCgl7CgkgICAgLyogTWF0Y2ghICBJc29sYXRlIHRoZSBnb29kIHdvcmQsIHVudGlsIENSIG9yIE5MLiAqLwoJICAgIGZvciAobGVuID0gMDsgcFtsZW5dID49ICcgJzsgKytsZW4pCgkJOwoJICAgIHBbbGVuXSA9IE5VTDsKCgkgICAgLyogSWYgdGhlIHN1Z2dlc3Rpb24gZG9lc24ndCBoYXZlIHNwZWNpZmljIGNhc2UgZHVwbGljYXRlIHRoZSBjYXNlCgkgICAgICogb2YgdGhlIGJhZCB3b3JkLiAqLwoJICAgIGlmIChjYXB0eXBlKHAsIE5VTEwpID09IDApCgkgICAgewoJCW1ha2VfY2FzZV93b3JkKHAsIGN3b3JkLCBzdS0+c3VfYmFkZmxhZ3MpOwoJCXAgPSBjd29yZDsKCSAgICB9CgoJICAgIGFkZF9zdWdnZXN0aW9uKHN1LCAmc3UtPnN1X2dhLCBwLCBzdS0+c3VfYmFkbGVuLAoJCQkJICBTQ09SRV9GSUxFLCAwLCBUUlVFLCBzdS0+c3Vfc2FsbGFuZywgRkFMU0UpOwoJfQogICAgfQoKICAgIGZjbG9zZShmZCk7CgogICAgLyogUmVtb3ZlIGJvZ3VzIHN1Z2dlc3Rpb25zLCBzb3J0IGFuZCB0cnVuY2F0ZSBhdCAibWF4Y291bnQiLiAqLwogICAgY2hlY2tfc3VnZ2VzdGlvbnMoc3UsICZzdS0+c3VfZ2EpOwogICAgKHZvaWQpY2xlYW51cF9zdWdnZXN0aW9ucygmc3UtPnN1X2dhLCBzdS0+c3VfbWF4c2NvcmUsIHN1LT5zdV9tYXhjb3VudCk7Cn0KCi8qCiAqIEZpbmQgc3VnZ2VzdGlvbnMgZm9yIHRoZSBpbnRlcm5hbCBtZXRob2QgaW5kaWNhdGVkIGJ5ICJzcHNfZmxhZ3MiLgogKi8KICAgIHN0YXRpYyB2b2lkCnNwZWxsX3N1Z2dlc3RfaW50ZXJuKHN1LCBpbnRlcmFjdGl2ZSkKICAgIHN1Z2luZm9fVAkqc3U7CiAgICBpbnQJCWludGVyYWN0aXZlOwp7CiAgICAvKgogICAgICogTG9hZCB0aGUgLnN1ZyBmaWxlKHMpIHRoYXQgYXJlIGF2YWlsYWJsZSBhbmQgbm90IGRvbmUgeWV0LgogICAgICovCiAgICBzdWdnZXN0X2xvYWRfZmlsZXMoKTsKCiAgICAvKgogICAgICogMS4gVHJ5IHNwZWNpYWwgY2FzZXMsIHN1Y2ggYXMgcmVwZWF0aW5nIGEgd29yZDogInRoZSB0aGUiIC0+ICJ0aGUiLgogICAgICoKICAgICAqIFNldCBhIG1heGltdW0gc2NvcmUgdG8gbGltaXQgdGhlIGNvbWJpbmF0aW9uIG9mIG9wZXJhdGlvbnMgdGhhdCBpcwogICAgICogdHJpZWQuCiAgICAgKi8KICAgIHN1Z2dlc3RfdHJ5X3NwZWNpYWwoc3UpOwoKICAgIC8qCiAgICAgKiAyLiBUcnkgaW5zZXJ0aW5nL2RlbGV0aW5nL3N3YXBwaW5nL2NoYW5naW5nIGEgbGV0dGVyLCB1c2UgUkVQIGVudHJpZXMKICAgICAqICAgIGZyb20gdGhlIC5hZmYgZmlsZSBhbmQgaW5zZXJ0aW5nIGEgc3BhY2UgKHNwbGl0IHRoZSB3b3JkKS4KICAgICAqLwogICAgc3VnZ2VzdF90cnlfY2hhbmdlKHN1KTsKCiAgICAvKiBGb3IgdGhlIHJlc3VsdGluZyB0b3Atc2NvcmVycyBjb21wdXRlIHRoZSBzb3VuZC1hLWxpa2Ugc2NvcmUuICovCiAgICBpZiAoc3BzX2ZsYWdzICYgU1BTX0RPVUJMRSkKCXNjb3JlX2NvbXBfc2FsKHN1KTsKCiAgICAvKgogICAgICogMy4gVHJ5IGZpbmRpbmcgc291bmQtYS1saWtlIHdvcmRzLgogICAgICovCiAgICBpZiAoKHNwc19mbGFncyAmIFNQU19GQVNUKSA9PSAwKQogICAgewoJaWYgKHNwc19mbGFncyAmIFNQU19CRVNUKQoJICAgIC8qIEFkanVzdCB0aGUgd29yZCBzY29yZSBmb3IgdGhlIHN1Z2dlc3Rpb25zIGZvdW5kIHNvIGZhciBmb3IgaG93CgkgICAgICogdGhleSBzb3VuZHMgbGlrZS4gKi8KCSAgICByZXNjb3JlX3N1Z2dlc3Rpb25zKHN1KTsKCgkvKgoJICogV2hpbGUgZ29pbmcgdGhyb3VnaHQgdGhlIHNvdW5kZm9sZCB0cmVlICJzdV9tYXhzY29yZSIgaXMgdGhlIHNjb3JlCgkgKiBmb3IgdGhlIHNvdW5kZm9sZCB3b3JkLCBsaW1pdHMgdGhlIGNoYW5nZXMgdGhhdCBhcmUgYmVpbmcgdHJpZWQsCgkgKiBhbmQgInN1X3NmbWF4c2NvcmUiIHRoZSByZXNjb3JlZCBzY29yZSwgd2hpY2ggaXMgc2V0IGJ5CgkgKiBjbGVhbnVwX3N1Z2dlc3Rpb25zKCkuCgkgKiBGaXJzdCBmaW5kIHdvcmRzIHdpdGggYSBzbWFsbCBlZGl0IGRpc3RhbmNlLCBiZWNhdXNlIHRoaXMgaXMgbXVjaAoJICogZmFzdGVyIGFuZCBvZnRlbiBhbHJlYWR5IGZpbmRzIHRoZSB0b3AtTiBzdWdnZXN0aW9ucy4gIElmIHdlIGRpZG4ndAoJICogZmluZCBtYW55IHN1Z2dlc3Rpb25zIHRyeSBhZ2FpbiB3aXRoIGEgaGlnaGVyIGVkaXQgZGlzdGFuY2UuCgkgKiAic2xfc291bmRkb25lIiBpcyB1c2VkIHRvIGF2b2lkIGRvaW5nIHRoZSBzYW1lIHdvcmQgdHdpY2UuCgkgKi8KCXN1Z2dlc3RfdHJ5X3NvdW5kYWxpa2VfcHJlcCgpOwoJc3UtPnN1X21heHNjb3JlID0gU0NPUkVfU0ZNQVgxOwoJc3UtPnN1X3NmbWF4c2NvcmUgPSBTQ09SRV9NQVhJTklUICogMzsKCXN1Z2dlc3RfdHJ5X3NvdW5kYWxpa2Uoc3UpOwoJaWYgKHN1LT5zdV9nYS5nYV9sZW4gPCBTVUdfQ0xFQU5fQ09VTlQoc3UpKQoJewoJICAgIC8qIFdlIGRpZG4ndCBmaW5kIGVub3VnaCBtYXRjaGVzLCB0cnkgYWdhaW4sIGFsbG93aW5nIG1vcmUKCSAgICAgKiBjaGFuZ2VzIHRvIHRoZSBzb3VuZGZvbGQgd29yZC4gKi8KCSAgICBzdS0+c3VfbWF4c2NvcmUgPSBTQ09SRV9TRk1BWDI7CgkgICAgc3VnZ2VzdF90cnlfc291bmRhbGlrZShzdSk7CgkgICAgaWYgKHN1LT5zdV9nYS5nYV9sZW4gPCBTVUdfQ0xFQU5fQ09VTlQoc3UpKQoJICAgIHsKCQkvKiBTdGlsbCBkaWRuJ3QgZmluZCBlbm91Z2ggbWF0Y2hlcywgdHJ5IGFnYWluLCBhbGxvd2luZyBldmVuCgkJICogbW9yZSBjaGFuZ2VzIHRvIHRoZSBzb3VuZGZvbGQgd29yZC4gKi8KCQlzdS0+c3VfbWF4c2NvcmUgPSBTQ09SRV9TRk1BWDM7CgkJc3VnZ2VzdF90cnlfc291bmRhbGlrZShzdSk7CgkgICAgfQoJfQoJc3UtPnN1X21heHNjb3JlID0gc3UtPnN1X3NmbWF4c2NvcmU7CglzdWdnZXN0X3RyeV9zb3VuZGFsaWtlX2ZpbmlzaCgpOwogICAgfQoKICAgIC8qIFdoZW4gQ1RSTC1DIHdhcyBoaXQgd2hpbGUgc2VhcmNoaW5nIGRvIHNob3cgdGhlIHJlc3VsdHMuICBPbmx5IGNsZWFyCiAgICAgKiBnb3RfaW50IHdoZW4gdXNpbmcgYSBjb21tYW5kLCBub3QgZm9yIHNwZWxsc3VnZ2VzdCgpLiAqLwogICAgdWlfYnJlYWtjaGVjaygpOwogICAgaWYgKGludGVyYWN0aXZlICYmIGdvdF9pbnQpCiAgICB7Cgkodm9pZCl2Z2V0YygpOwoJZ290X2ludCA9IEZBTFNFOwogICAgfQoKICAgIGlmICgoc3BzX2ZsYWdzICYgU1BTX0RPVUJMRSkgPT0gMCAmJiBzdS0+c3VfZ2EuZ2FfbGVuICE9IDApCiAgICB7CglpZiAoc3BzX2ZsYWdzICYgU1BTX0JFU1QpCgkgICAgLyogQWRqdXN0IHRoZSB3b3JkIHNjb3JlIGZvciBob3cgaXQgc291bmRzIGxpa2UuICovCgkgICAgcmVzY29yZV9zdWdnZXN0aW9ucyhzdSk7CgoJLyogUmVtb3ZlIGJvZ3VzIHN1Z2dlc3Rpb25zLCBzb3J0IGFuZCB0cnVuY2F0ZSBhdCAibWF4Y291bnQiLiAqLwoJY2hlY2tfc3VnZ2VzdGlvbnMoc3UsICZzdS0+c3VfZ2EpOwoJKHZvaWQpY2xlYW51cF9zdWdnZXN0aW9ucygmc3UtPnN1X2dhLCBzdS0+c3VfbWF4c2NvcmUsIHN1LT5zdV9tYXhjb3VudCk7CiAgICB9Cn0KCi8qCiAqIExvYWQgdGhlIC5zdWcgZmlsZXMgZm9yIGxhbmd1YWdlcyB0aGF0IGhhdmUgb25lIGFuZCB3ZXJlbid0IGxvYWRlZCB5ZXQuCiAqLwogICAgc3RhdGljIHZvaWQKc3VnZ2VzdF9sb2FkX2ZpbGVzKCkKewogICAgbGFuZ3BfVAkqbHA7CiAgICBpbnQJCWxwaTsKICAgIHNsYW5nX1QJKnNsYW5nOwogICAgY2hhcl91CSpkb3RwOwogICAgRklMRQkqZmQ7CiAgICBjaGFyX3UJYnVmW01BWFdMRU5dOwogICAgaW50CQlpOwogICAgdGltZV90CXRpbWVzdGFtcDsKICAgIGludAkJd2NvdW50OwogICAgaW50CQl3b3JkbnI7CiAgICBnYXJyYXlfVAlnYTsKICAgIGludAkJYzsKCiAgICAvKiBEbyB0aGlzIGZvciBhbGwgbGFuZ3VhZ2VzIHRoYXQgc3VwcG9ydCBzb3VuZCBmb2xkaW5nLiAqLwogICAgZm9yIChscGkgPSAwOyBscGkgPCBjdXJidWYtPmJfbGFuZ3AuZ2FfbGVuOyArK2xwaSkKICAgIHsKCWxwID0gTEFOR1BfRU5UUlkoY3VyYnVmLT5iX2xhbmdwLCBscGkpOwoJc2xhbmcgPSBscC0+bHBfc2xhbmc7CglpZiAoc2xhbmctPnNsX3N1Z3RpbWUgIT0gMCAmJiAhc2xhbmctPnNsX3N1Z2xvYWRlZCkKCXsKCSAgICAvKiBDaGFuZ2UgIi5zcGwiIHRvICIuc3VnIiBhbmQgb3BlbiB0aGUgZmlsZS4gIFdoZW4gdGhlIGZpbGUgaXNuJ3QKCSAgICAgKiBmb3VuZCBzaWxlbnRseSBza2lwIGl0LiAgRG8gc2V0ICJzbF9zdWdsb2FkZWQiIHNvIHRoYXQgd2UKCSAgICAgKiBkb24ndCB0cnkgYWdhaW4gYW5kIGFnYWluLiAqLwoJICAgIHNsYW5nLT5zbF9zdWdsb2FkZWQgPSBUUlVFOwoKCSAgICBkb3RwID0gdmltX3N0cnJjaHIoc2xhbmctPnNsX2ZuYW1lLCAnLicpOwoJICAgIGlmIChkb3RwID09IE5VTEwgfHwgZm5hbWVjbXAoZG90cCwgIi5zcGwiKSAhPSAwKQoJCWNvbnRpbnVlOwoJICAgIFNUUkNQWShkb3RwLCAiLnN1ZyIpOwoJICAgIGZkID0gbWNoX2ZvcGVuKChjaGFyICopc2xhbmctPnNsX2ZuYW1lLCAiciIpOwoJICAgIGlmIChmZCA9PSBOVUxMKQoJCWdvdG8gbmV4dG9uZTsKCgkgICAgLyoKCSAgICAgKiA8U1VHSEVBREVSPjogPGZpbGVJRD4gPHZlcnNpb25ucj4gPHRpbWVzdGFtcD4KCSAgICAgKi8KCSAgICBmb3IgKGkgPSAwOyBpIDwgVklNU1VHTUFHSUNMOyArK2kpCgkJYnVmW2ldID0gZ2V0YyhmZCk7CQkJLyogPGZpbGVJRD4gKi8KCSAgICBpZiAoU1RSTkNNUChidWYsIFZJTVNVR01BR0lDLCBWSU1TVUdNQUdJQ0wpICE9IDApCgkgICAgewoJCUVNU0cyKF8oIkU3Nzg6IFRoaXMgZG9lcyBub3QgbG9vayBsaWtlIGEgLnN1ZyBmaWxlOiAlcyIpLAoJCQkJCQkJICAgICBzbGFuZy0+c2xfZm5hbWUpOwoJCWdvdG8gbmV4dG9uZTsKCSAgICB9CgkgICAgYyA9IGdldGMoZmQpOwkJCQkvKiA8dmVyc2lvbm5yPiAqLwoJICAgIGlmIChjIDwgVklNU1VHVkVSU0lPTikKCSAgICB7CgkJRU1TRzIoXygiRTc3OTogT2xkIC5zdWcgZmlsZSwgbmVlZHMgdG8gYmUgdXBkYXRlZDogJXMiKSwKCQkJCQkJCSAgICAgc2xhbmctPnNsX2ZuYW1lKTsKCQlnb3RvIG5leHRvbmU7CgkgICAgfQoJICAgIGVsc2UgaWYgKGMgPiBWSU1TVUdWRVJTSU9OKQoJICAgIHsKCQlFTVNHMihfKCJFNzgwOiAuc3VnIGZpbGUgaXMgZm9yIG5ld2VyIHZlcnNpb24gb2YgVmltOiAlcyIpLAoJCQkJCQkJICAgICBzbGFuZy0+c2xfZm5hbWUpOwoJCWdvdG8gbmV4dG9uZTsKCSAgICB9CgoJICAgIC8qIENoZWNrIHRoZSB0aW1lc3RhbXAsIGl0IG11c3QgYmUgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgb25lIGluCgkgICAgICogdGhlIC5zcGwgZmlsZS4gIE90aGVyd2lzZSB0aGUgd29yZCBudW1iZXJzIHdvbid0IG1hdGNoLiAqLwoJICAgIHRpbWVzdGFtcCA9IGdldDhjKGZkKTsJCQkvKiA8dGltZXN0YW1wPiAqLwoJICAgIGlmICh0aW1lc3RhbXAgIT0gc2xhbmctPnNsX3N1Z3RpbWUpCgkgICAgewoJCUVNU0cyKF8oIkU3ODE6IC5zdWcgZmlsZSBkb2Vzbid0IG1hdGNoIC5zcGwgZmlsZTogJXMiKSwKCQkJCQkJCSAgICAgc2xhbmctPnNsX2ZuYW1lKTsKCQlnb3RvIG5leHRvbmU7CgkgICAgfQoKCSAgICAvKgoJICAgICAqIDxTVUdXT1JEVFJFRT46IDx3b3JkdHJlZT4KCSAgICAgKiBSZWFkIHRoZSB0cmllIHdpdGggdGhlIHNvdW5kZm9sZGVkIHdvcmRzLgoJICAgICAqLwoJICAgIGlmIChzcGVsbF9yZWFkX3RyZWUoZmQsICZzbGFuZy0+c2xfc2J5dHMsICZzbGFuZy0+c2xfc2lkeHMsCgkJCQkJCQkgICAgICAgRkFMU0UsIDApICE9IDApCgkgICAgewpzb21lZXJyb3I6CgkJRU1TRzIoXygiRTc4MjogZXJyb3Igd2hpbGUgcmVhZGluZyAuc3VnIGZpbGU6ICVzIiksCgkJCQkJCQkgICAgIHNsYW5nLT5zbF9mbmFtZSk7CgkJc2xhbmdfY2xlYXJfc3VnKHNsYW5nKTsKCQlnb3RvIG5leHRvbmU7CgkgICAgfQoKCSAgICAvKgoJICAgICAqIDxTVUdUQUJMRT46IDxzdWd3Y291bnQ+IDxzdWdsaW5lPiAuLi4KCSAgICAgKgoJICAgICAqIFJlYWQgdGhlIHRhYmxlIHdpdGggd29yZCBudW1iZXJzLiAgV2UgdXNlIGEgZmlsZSBidWZmZXIgZm9yCgkgICAgICogdGhpcywgYmVjYXVzZSBpdCdzIHNvIG11Y2ggbGlrZSBhIGZpbGUgd2l0aCBsaW5lcy4gIE1ha2VzIGl0CgkgICAgICogcG9zc2libGUgdG8gc3dhcCB0aGUgaW5mbyBhbmQgc2F2ZSBvbiBtZW1vcnkgdXNlLgoJICAgICAqLwoJICAgIHNsYW5nLT5zbF9zdWdidWYgPSBvcGVuX3NwZWxsYnVmKCk7CgkgICAgaWYgKHNsYW5nLT5zbF9zdWdidWYgPT0gTlVMTCkKCQlnb3RvIHNvbWVlcnJvcjsKCQkJCQkJCSAgICAvKiA8c3Vnd2NvdW50PiAqLwoJICAgIHdjb3VudCA9IGdldDRjKGZkKTsKCSAgICBpZiAod2NvdW50IDwgMCkKCQlnb3RvIHNvbWVlcnJvcjsKCgkgICAgLyogUmVhZCBhbGwgdGhlIHdvcmRuciBsaXN0cyBpbnRvIHRoZSBidWZmZXIsIG9uZSBOVUwgdGVybWluYXRlZAoJICAgICAqIGxpc3QgcGVyIGxpbmUuICovCgkgICAgZ2FfaW5pdDIoJmdhLCAxLCAxMDApOwoJICAgIGZvciAod29yZG5yID0gMDsgd29yZG5yIDwgd2NvdW50OyArK3dvcmRucikKCSAgICB7CgkJZ2EuZ2FfbGVuID0gMDsKCQlmb3IgKDs7KQoJCXsKCQkgICAgYyA9IGdldGMoZmQpOwkJCSAgICAvKiA8c3VnbGluZT4gKi8KCQkgICAgaWYgKGMgPCAwIHx8IGdhX2dyb3coJmdhLCAxKSA9PSBGQUlMKQoJCQlnb3RvIHNvbWVlcnJvcjsKCQkgICAgKChjaGFyX3UgKilnYS5nYV9kYXRhKVtnYS5nYV9sZW4rK10gPSBjOwoJCSAgICBpZiAoYyA9PSBOVUwpCgkJCWJyZWFrOwoJCX0KCQlpZiAobWxfYXBwZW5kX2J1ZihzbGFuZy0+c2xfc3VnYnVmLCAobGluZW5yX1Qpd29yZG5yLAoJCQkJCSBnYS5nYV9kYXRhLCBnYS5nYV9sZW4sIFRSVUUpID09IEZBSUwpCgkJICAgIGdvdG8gc29tZWVycm9yOwoJICAgIH0KCSAgICBnYV9jbGVhcigmZ2EpOwoKCSAgICAvKgoJICAgICAqIE5lZWQgdG8gcHV0IHdvcmQgY291bnRzIGluIHRoZSB3b3JkIHRyaWVzLCBzbyB0aGF0IHdlIGNhbiBmaW5kCgkgICAgICogYSB3b3JkIGJ5IGl0cyBudW1iZXIuCgkgICAgICovCgkgICAgdHJlZV9jb3VudF93b3JkcyhzbGFuZy0+c2xfZmJ5dHMsIHNsYW5nLT5zbF9maWR4cyk7CgkgICAgdHJlZV9jb3VudF93b3JkcyhzbGFuZy0+c2xfc2J5dHMsIHNsYW5nLT5zbF9zaWR4cyk7CgpuZXh0b25lOgoJICAgIGlmIChmZCAhPSBOVUxMKQoJCWZjbG9zZShmZCk7CgkgICAgU1RSQ1BZKGRvdHAsICIuc3BsIik7Cgl9CiAgICB9Cn0KCgovKgogKiBGaWxsIGluIHRoZSB3b3JkY291bnQgZmllbGRzIGZvciBhIHRyaWUuCiAqIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiB3b3Jkcy4KICovCiAgICBzdGF0aWMgdm9pZAp0cmVlX2NvdW50X3dvcmRzKGJ5dHMsIGlkeHMpCiAgICBjaGFyX3UJKmJ5dHM7CiAgICBpZHhfVAkqaWR4czsKewogICAgaW50CQlkZXB0aDsKICAgIGlkeF9UCWFycmlkeFtNQVhXTEVOXTsKICAgIGludAkJY3VyaVtNQVhXTEVOXTsKICAgIGludAkJYzsKICAgIGlkeF9UCW47CiAgICBpbnQJCXdvcmRjb3VudFtNQVhXTEVOXTsKCiAgICBhcnJpZHhbMF0gPSAwOwogICAgY3VyaVswXSA9IDE7CiAgICB3b3JkY291bnRbMF0gPSAwOwogICAgZGVwdGggPSAwOwogICAgd2hpbGUgKGRlcHRoID49IDAgJiYgIWdvdF9pbnQpCiAgICB7CglpZiAoY3VyaVtkZXB0aF0gPiBieXRzW2FycmlkeFtkZXB0aF1dKQoJewoJICAgIC8qIERvbmUgYWxsIGJ5dGVzIGF0IHRoaXMgbm9kZSwgZ28gdXAgb25lIGxldmVsLiAqLwoJICAgIGlkeHNbYXJyaWR4W2RlcHRoXV0gPSB3b3JkY291bnRbZGVwdGhdOwoJICAgIGlmIChkZXB0aCA+IDApCgkJd29yZGNvdW50W2RlcHRoIC0gMV0gKz0gd29yZGNvdW50W2RlcHRoXTsKCgkgICAgLS1kZXB0aDsKCSAgICBmYXN0X2JyZWFrY2hlY2soKTsKCX0KCWVsc2UKCXsKCSAgICAvKiBEbyBvbmUgbW9yZSBieXRlIGF0IHRoaXMgbm9kZS4gKi8KCSAgICBuID0gYXJyaWR4W2RlcHRoXSArIGN1cmlbZGVwdGhdOwoJICAgICsrY3VyaVtkZXB0aF07CgoJICAgIGMgPSBieXRzW25dOwoJICAgIGlmIChjID09IDApCgkgICAgewoJCS8qIEVuZCBvZiB3b3JkLCBjb3VudCBpdC4gKi8KCQkrK3dvcmRjb3VudFtkZXB0aF07CgoJCS8qIFNraXAgb3ZlciBhbnkgb3RoZXIgTlVMIGJ5dGVzIChzYW1lIHdvcmQgd2l0aCBkaWZmZXJlbnQKCQkgKiBmbGFncykuICovCgkJd2hpbGUgKGJ5dHNbbiArIDFdID09IDApCgkJewoJCSAgICArK247CgkJICAgICsrY3VyaVtkZXB0aF07CgkJfQoJICAgIH0KCSAgICBlbHNlCgkgICAgewoJCS8qIE5vcm1hbCBjaGFyLCBnbyBvbmUgbGV2ZWwgZGVlcGVyIHRvIGNvdW50IHRoZSB3b3Jkcy4gKi8KCQkrK2RlcHRoOwoJCWFycmlkeFtkZXB0aF0gPSBpZHhzW25dOwoJCWN1cmlbZGVwdGhdID0gMTsKCQl3b3JkY291bnRbZGVwdGhdID0gMDsKCSAgICB9Cgl9CiAgICB9Cn0KCi8qCiAqIEZyZWUgdGhlIGluZm8gcHV0IGluICIqc3UiIGJ5IHNwZWxsX2ZpbmRfc3VnZ2VzdCgpLgogKi8KICAgIHN0YXRpYyB2b2lkCnNwZWxsX2ZpbmRfY2xlYW51cChzdSkKICAgIHN1Z2luZm9fVAkqc3U7CnsKICAgIGludAkJaTsKCiAgICAvKiBGcmVlIHRoZSBzdWdnZXN0aW9ucy4gKi8KICAgIGZvciAoaSA9IDA7IGkgPCBzdS0+c3VfZ2EuZ2FfbGVuOyArK2kpCgl2aW1fZnJlZShTVUcoc3UtPnN1X2dhLCBpKS5zdF93b3JkKTsKICAgIGdhX2NsZWFyKCZzdS0+c3VfZ2EpOwogICAgZm9yIChpID0gMDsgaSA8IHN1LT5zdV9zZ2EuZ2FfbGVuOyArK2kpCgl2aW1fZnJlZShTVUcoc3UtPnN1X3NnYSwgaSkuc3Rfd29yZCk7CiAgICBnYV9jbGVhcigmc3UtPnN1X3NnYSk7CgogICAgLyogRnJlZSB0aGUgYmFubmVkIHdvcmRzLiAqLwogICAgaGFzaF9jbGVhcl9hbGwoJnN1LT5zdV9iYW5uZWQsIDApOwp9CgovKgogKiBNYWtlIGEgY29weSBvZiAid29yZCIsIHdpdGggdGhlIGZpcnN0IGxldHRlciB1cHBlciBvciBsb3dlciBjYXNlZCwgdG8KICogIndjb3B5W01BWFdMRU5dIi4gICJ3b3JkIiBtdXN0IG5vdCBiZSBlbXB0eS4KICogVGhlIHJlc3VsdCBpcyBOVUwgdGVybWluYXRlZC4KICovCiAgICBzdGF0aWMgdm9pZApvbmVjYXBfY29weSh3b3JkLCB3Y29weSwgdXBwZXIpCiAgICBjaGFyX3UJKndvcmQ7CiAgICBjaGFyX3UJKndjb3B5OwogICAgaW50CQl1cHBlcjsJICAgIC8qIFRSVUU6IGZpcnN0IGxldHRlciBtYWRlIHVwcGVyIGNhc2UgKi8KewogICAgY2hhcl91CSpwOwogICAgaW50CQljOwogICAgaW50CQlsOwoKICAgIHAgPSB3b3JkOwojaWZkZWYgRkVBVF9NQllURQogICAgaWYgKGhhc19tYnl0ZSkKCWMgPSBtYl9jcHRyMmNoYXJfYWR2KCZwKTsKICAgIGVsc2UKI2VuZGlmCgljID0gKnArKzsKICAgIGlmICh1cHBlcikKCWMgPSBTUEVMTF9UT1VQUEVSKGMpOwogICAgZWxzZQoJYyA9IFNQRUxMX1RPRk9MRChjKTsKI2lmZGVmIEZFQVRfTUJZVEUKICAgIGlmIChoYXNfbWJ5dGUpCglsID0gbWJfY2hhcjJieXRlcyhjLCB3Y29weSk7CiAgICBlbHNlCiNlbmRpZgogICAgewoJbCA9IDE7Cgl3Y29weVswXSA9IGM7CiAgICB9CiAgICB2aW1fc3RybmNweSh3Y29weSArIGwsIHAsIE1BWFdMRU4gLSBsIC0gMSk7Cn0KCi8qCiAqIE1ha2UgYSBjb3B5IG9mICJ3b3JkIiB3aXRoIGFsbCB0aGUgbGV0dGVycyB1cHBlciBjYXNlZCBpbnRvCiAqICJ3Y29weVtNQVhXTEVOXSIuICBUaGUgcmVzdWx0IGlzIE5VTCB0ZXJtaW5hdGVkLgogKi8KICAgIHN0YXRpYyB2b2lkCmFsbGNhcF9jb3B5KHdvcmQsIHdjb3B5KQogICAgY2hhcl91CSp3b3JkOwogICAgY2hhcl91CSp3Y29weTsKewogICAgY2hhcl91CSpzOwogICAgY2hhcl91CSpkOwogICAgaW50CQljOwoKICAgIGQgPSB3Y29weTsKICAgIGZvciAocyA9IHdvcmQ7ICpzICE9IE5VTDsgKQogICAgewojaWZkZWYgRkVBVF9NQllURQoJaWYgKGhhc19tYnl0ZSkKCSAgICBjID0gbWJfY3B0cjJjaGFyX2Fkdigmcyk7CgllbHNlCiNlbmRpZgoJICAgIGMgPSAqcysrOwoKI2lmZGVmIEZFQVRfTUJZVEUKCS8qIFdlIG9ubHkgY2hhbmdlIN8gdG8gU1Mgd2hlbiB3ZSBhcmUgY2VydGFpbiBsYXRpbjEgaXMgdXNlZC4gIEl0CgkgKiB3b3VsZCBjYXVzZSB3ZWlyZCBlcnJvcnMgaW4gb3RoZXIgOC1iaXQgZW5jb2RpbmdzLiAqLwoJaWYgKGVuY19sYXRpbjFsaWtlICYmIGMgPT0gMHhkZikKCXsKCSAgICBjID0gJ1MnOwoJICAgIGlmIChkIC0gd2NvcHkgPj0gTUFYV0xFTiAtIDEpCgkJYnJlYWs7CgkgICAgKmQrKyA9IGM7Cgl9CgllbHNlCiNlbmRpZgoJICAgIGMgPSBTUEVMTF9UT1VQUEVSKGMpOwoKI2lmZGVmIEZFQVRfTUJZVEUKCWlmIChoYXNfbWJ5dGUpCgl7CgkgICAgaWYgKGQgLSB3Y29weSA+PSBNQVhXTEVOIC0gTUJfTUFYQllURVMpCgkJYnJlYWs7CgkgICAgZCArPSBtYl9jaGFyMmJ5dGVzKGMsIGQpOwoJfQoJZWxzZQojZW5kaWYKCXsKCSAgICBpZiAoZCAtIHdjb3B5ID49IE1BWFdMRU4gLSAxKQoJCWJyZWFrOwoJICAgICpkKysgPSBjOwoJfQogICAgfQogICAgKmQgPSBOVUw7Cn0KCi8qCiAqIFRyeSBmaW5kaW5nIHN1Z2dlc3Rpb25zIGJ5IHJlY29nbml6aW5nIHNwZWNpZmljIHNpdHVhdGlvbnMuCiAqLwogICAgc3RhdGljIHZvaWQKc3VnZ2VzdF90cnlfc3BlY2lhbChzdSkKICAgIHN1Z2luZm9fVAkqc3U7CnsKICAgIGNoYXJfdQkqcDsKICAgIHNpemVfdAlsZW47CiAgICBpbnQJCWM7CiAgICBjaGFyX3UJd29yZFtNQVhXTEVOXTsKCiAgICAvKgogICAgICogUmVjb2duaXplIGEgd29yZCB0aGF0IGlzIHJlcGVhdGVkOiAidGhlIHRoZSIuCiAgICAgKi8KICAgIHAgPSBza2lwdG93aGl0ZShzdS0+c3VfZmJhZHdvcmQpOwogICAgbGVuID0gcCAtIHN1LT5zdV9mYmFkd29yZDsKICAgIHAgPSBza2lwd2hpdGUocCk7CiAgICBpZiAoU1RSTEVOKHApID09IGxlbiAmJiBTVFJOQ01QKHN1LT5zdV9mYmFkd29yZCwgcCwgbGVuKSA9PSAwKQogICAgewoJLyogSW5jbHVkZSBiYWRmbGFnczogaWYgdGhlIGJhZHdvcmQgaXMgb25lY2FwIG9yIGFsbGNhcAoJICogdXNlIHRoYXQgZm9yIHRoZSBnb29kd29yZCB0b286ICJUaGUgdGhlIiAtPiAiVGhlIi4gKi8KCWMgPSBzdS0+c3VfZmJhZHdvcmRbbGVuXTsKCXN1LT5zdV9mYmFkd29yZFtsZW5dID0gTlVMOwoJbWFrZV9jYXNlX3dvcmQoc3UtPnN1X2ZiYWR3b3JkLCB3b3JkLCBzdS0+c3VfYmFkZmxhZ3MpOwoJc3UtPnN1X2ZiYWR3b3JkW2xlbl0gPSBjOwoKCS8qIEdpdmUgYSBzb3VuZGFsaWtlIHNjb3JlIG9mIDAsIGNvbXB1dGUgdGhlIHNjb3JlIGFzIGlmIGRlbGV0aW5nIG9uZQoJICogY2hhcmFjdGVyLiAqLwoJYWRkX3N1Z2dlc3Rpb24oc3UsICZzdS0+c3VfZ2EsIHdvcmQsIHN1LT5zdV9iYWRsZW4sCgkJICAgICAgIFJFU0NPUkUoU0NPUkVfUkVQLCAwKSwgMCwgVFJVRSwgc3UtPnN1X3NhbGxhbmcsIEZBTFNFKTsKICAgIH0KfQoKLyoKICogVHJ5IGZpbmRpbmcgc3VnZ2VzdGlvbnMgYnkgYWRkaW5nL3JlbW92aW5nL3N3YXBwaW5nIGxldHRlcnMuCiAqLwogICAgc3RhdGljIHZvaWQKc3VnZ2VzdF90cnlfY2hhbmdlKHN1KQogICAgc3VnaW5mb19UCSpzdTsKewogICAgY2hhcl91CWZ3b3JkW01BWFdMRU5dOwkgICAgLyogY29weSBvZiB0aGUgYmFkIHdvcmQsIGNhc2UtZm9sZGVkICovCiAgICBpbnQJCW47CiAgICBjaGFyX3UJKnA7CiAgICBpbnQJCWxwaTsKICAgIGxhbmdwX1QJKmxwOwoKICAgIC8qIFdlIG1ha2UgYSBjb3B5IG9mIHRoZSBjYXNlLWZvbGRlZCBiYWQgd29yZCwgc28gdGhhdCB3ZSBjYW4gbW9kaWZ5IGl0CiAgICAgKiB0byBmaW5kIG1hdGNoZXMgKGVzcC4gUkVQIGl0ZW1zKS4gIEFwcGVuZCBzb21lIG1vcmUgdGV4dCwgY2hhbmdpbmcKICAgICAqIGNoYXJzIGFmdGVyIHRoZSBiYWQgd29yZCBtYXkgaGVscC4gKi8KICAgIFNUUkNQWShmd29yZCwgc3UtPnN1X2ZiYWR3b3JkKTsKICAgIG4gPSBTVFJMRU4oZndvcmQpOwogICAgcCA9IHN1LT5zdV9iYWRwdHIgKyBzdS0+c3VfYmFkbGVuOwogICAgKHZvaWQpc3BlbGxfY2FzZWZvbGQocCwgU1RSTEVOKHApLCBmd29yZCArIG4sIE1BWFdMRU4gLSBuKTsKCiAgICBmb3IgKGxwaSA9IDA7IGxwaSA8IGN1cmJ1Zi0+Yl9sYW5ncC5nYV9sZW47ICsrbHBpKQogICAgewoJbHAgPSBMQU5HUF9FTlRSWShjdXJidWYtPmJfbGFuZ3AsIGxwaSk7CgoJLyogSWYgcmVsb2FkaW5nIGEgc3BlbGwgZmlsZSBmYWlscyBpdCdzIHN0aWxsIGluIHRoZSBsaXN0IGJ1dAoJICogZXZlcnl0aGluZyBoYXMgYmVlbiBjbGVhcmVkLiAqLwoJaWYgKGxwLT5scF9zbGFuZy0+c2xfZmJ5dHMgPT0gTlVMTCkKCSAgICBjb250aW51ZTsKCgkvKiBUcnkgaXQgZm9yIHRoaXMgbGFuZ3VhZ2UuICBXaWxsIGFkZCBwb3NzaWJsZSBzdWdnZXN0aW9ucy4gKi8KCXN1Z2dlc3RfdHJpZV93YWxrKHN1LCBscCwgZndvcmQsIEZBTFNFKTsKICAgIH0KfQoKLyogQ2hlY2sgdGhlIG1heGltdW0gc2NvcmUsIGlmIHdlIGdvIG92ZXIgaXQgd2Ugd29uJ3QgdHJ5IHRoaXMgY2hhbmdlLiAqLwojZGVmaW5lIFRSWV9ERUVQRVIoc3UsIHN0YWNrLCBkZXB0aCwgYWRkKSBcCgkJKHN0YWNrW2RlcHRoXS50c19zY29yZSArIChhZGQpIDwgc3UtPnN1X21heHNjb3JlKQoKLyoKICogVHJ5IGZpbmRpbmcgc3VnZ2VzdGlvbnMgYnkgYWRkaW5nL3JlbW92aW5nL3N3YXBwaW5nIGxldHRlcnMuCiAqCiAqIFRoaXMgdXNlcyBhIHN0YXRlIG1hY2hpbmUuICBBdCBlYWNoIG5vZGUgaW4gdGhlIHRyZWUgd2UgdHJ5IHZhcmlvdXMKICogb3BlcmF0aW9ucy4gIFdoZW4gdHJ5aW5nIGlmIGFuIG9wZXJhdGlvbiB3b3JrcyAiZGVwdGgiIGlzIGluY3JlYXNlZCBhbmQgdGhlCiAqIHN0YWNrW10gaXMgdXNlZCB0byBzdG9yZSBpbmZvLiAgVGhpcyBhbGxvd3MgY29tYmluYXRpb25zLCB0aHVzIGluc2VydCBvbmUKICogY2hhcmFjdGVyLCByZXBsYWNlIG9uZSBhbmQgZGVsZXRlIGFub3RoZXIuICBUaGUgbnVtYmVyIG9mIGNoYW5nZXMgaXMKICogbGltaXRlZCBieSBzdS0+c3VfbWF4c2NvcmUuCiAqCiAqIEFmdGVyIGltcGxlbWVudGluZyB0aGlzIEkgbm90aWNlZCBhbiBhcnRpY2xlIGJ5IEtlbWFsIE9mbGF6ZXIgdGhhdAogKiBkZXNjcmliZXMgc29tZXRoaW5nIHNpbWlsYXI6ICJFcnJvci10b2xlcmFudCBGaW5pdGUgU3RhdGUgUmVjb2duaXRpb24gd2l0aAogKiBBcHBsaWNhdGlvbnMgdG8gTW9ycGhvbG9naWNhbCBBbmFseXNpcyBhbmQgU3BlbGxpbmcgQ29ycmVjdGlvbiIgKDE5OTYpLgogKiBUaGUgaW1wbGVtZW50YXRpb24gaW4gdGhlIGFydGljbGUgaXMgc2ltcGxpZmllZCBhbmQgcmVxdWlyZXMgYSBzdGFjayBvZgogKiB1bmtub3duIGRlcHRoLiAgVGhlIGltcGxlbWVudGF0aW9uIGhlcmUgb25seSBuZWVkcyBhIHN0YWNrIGRlcHRoIGVxdWFsIHRvCiAqIHRoZSBsZW5ndGggb2YgdGhlIHdvcmQuCiAqCiAqIFRoaXMgaXMgYWxzbyB1c2VkIGZvciB0aGUgc291bmQtZm9sZGVkIHdvcmQsICJzb3VuZGZvbGQiIGlzIFRSVUUgdGhlbi4KICogVGhlIG1lY2hhbmlzbSBpcyB0aGUgc2FtZSwgYnV0IHdlIGZpbmQgYSBtYXRjaCB3aXRoIGEgc291bmQtZm9sZGVkIHdvcmQKICogdGhhdCBjb21lcyBmcm9tIG9uZSBvciBtb3JlIG9yaWdpbmFsIHdvcmRzLiAgRWFjaCBvZiB0aGVzZSB3b3JkcyBtYXkgYmUKICogYWRkZWQsIHRoaXMgaXMgZG9uZSBieSBhZGRfc291bmRfc3VnZ2VzdCgpLgogKiBEb24ndCB1c2U6CiAqCXRoZSBwcmVmaXggdHJlZSBvciB0aGUga2VlcC1jYXNlIHRyZWUKICoJInN1LT5zdV9iYWRsZW4iCiAqCWFueXRoaW5nIHRvIGRvIHdpdGggdXBwZXIgYW5kIGxvd2VyIGNhc2UKICoJYW55dGhpbmcgdG8gZG8gd2l0aCB3b3JkIG9yIG5vbi13b3JkIGNoYXJhY3RlcnMgKCJzcGVsbF9pc3dvcmRwKCkiKQogKgliYW5uZWQgd29yZHMKICoJd29yZCBmbGFncyAocmFyZSwgcmVnaW9uLCBjb21wb3VuZGluZykKICoJd29yZCBzcGxpdHRpbmcgZm9yIG5vdwogKgkic2ltaWxhcl9jaGFycygpIgogKgl1c2UgInNsYW5nLT5zbF9yZXBzYWwiIGluc3RlYWQgb2YgImxwLT5scF9yZXBsYW5nLT5zbF9yZXAiCiAqLwogICAgc3RhdGljIHZvaWQKc3VnZ2VzdF90cmllX3dhbGsoc3UsIGxwLCBmd29yZCwgc291bmRmb2xkKQogICAgc3VnaW5mb19UCSpzdTsKICAgIGxhbmdwX1QJKmxwOwogICAgY2hhcl91CSpmd29yZDsKICAgIGludAkJc291bmRmb2xkOwp7CiAgICBjaGFyX3UJdHdvcmRbTUFYV0xFTl07CSAgICAvKiBnb29kIHdvcmQgY29sbGVjdGVkIHNvIGZhciAqLwogICAgdHJ5c3RhdGVfVAlzdGFja1tNQVhXTEVOXTsKICAgIGNoYXJfdQlwcmV3b3JkW01BWFdMRU4gKiAzXTsgLyogd29yZCBmb3VuZCB3aXRoIHByb3BlciBjYXNlOwoJCQkJICAgICAgICogY29uY2F0YW5hdGlvbiBvZiBwcmVmaXggY29tcG91bmQKCQkJCSAgICAgICAqIHdvcmRzIGFuZCBzcGxpdCB3b3JkLiAgTlVMIHRlcm1pbmF0ZWQKCQkJCSAgICAgICAqIHdoZW4gZ29pbmcgZGVlcGVyIGJ1dCBub3Qgd2hlbiBjb21pbmcKCQkJCSAgICAgICAqIGJhY2suICovCiAgICBjaGFyX3UJY29tcGZsYWdzW01BWFdMRU5dOwkvKiBjb21wb3VuZCBmbGFncywgb25lIGZvciBlYWNoIHdvcmQgKi8KICAgIHRyeXN0YXRlX1QJKnNwOwogICAgaW50CQluZXdzY29yZTsKICAgIGludAkJc2NvcmU7CiAgICBjaGFyX3UJKmJ5dHMsICpmYnl0cywgKnBieXRzOwogICAgaWR4X1QJKmlkeHMsICpmaWR4cywgKnBpZHhzOwogICAgaW50CQlkZXB0aDsKICAgIGludAkJYywgYzIsIGMzOwogICAgaW50CQluID0gMDsKICAgIGludAkJZmxhZ3M7CiAgICBnYXJyYXlfVAkqZ2FwOwogICAgaWR4X1QJYXJyaWR4OwogICAgaW50CQlsZW47CiAgICBjaGFyX3UJKnA7CiAgICBmcm9tdG9fVAkqZnRwOwogICAgaW50CQlmbCA9IDAsIHRsOwogICAgaW50CQlyZXBleHRyYSA9IDA7CSAgICAvKiBleHRyYSBieXRlcyBpbiBmd29yZFtdIGZyb20gUkVQIGl0ZW0gKi8KICAgIHNsYW5nX1QJKnNsYW5nID0gbHAtPmxwX3NsYW5nOwogICAgaW50CQlmd29yZF9lbmRzOwogICAgaW50CQlnb29kd29yZF9lbmRzOwojaWZkZWYgREVCVUdfVFJJRVdBTEsKICAgIC8qIFN0b3JlcyB0aGUgbmFtZSBvZiB0aGUgY2hhbmdlIG1hZGUgYXQgZWFjaCBsZXZlbC4gKi8KICAgIGNoYXJfdQljaGFuZ2VuYW1lW01BWFdMRU5dWzgwXTsKI2VuZGlmCiAgICBpbnQJCWJyZWFrY2hlY2tjb3VudCA9IDEwMDA7CiAgICBpbnQJCWNvbXBvdW5kX29rOwoKICAgIC8qCiAgICAgKiBHbyB0aHJvdWdoIHRoZSB3aG9sZSBjYXNlLWZvbGQgdHJlZSwgdHJ5IGNoYW5nZXMgYXQgZWFjaCBub2RlLgogICAgICogInR3b3JkW10iIGNvbnRhaW5zIHRoZSB3b3JkIGNvbGxlY3RlZCBmcm9tIG5vZGVzIGluIHRoZSB0cmVlLgogICAgICogImZ3b3JkW10iIHRoZSB3b3JkIHdlIGFyZSB0cnlpbmcgdG8gbWF0Y2ggd2l0aCAoaW5pdGlhbGx5IHRoZSBiYWQKICAgICAqIHdvcmQpLgogICAgICovCiAgICBkZXB0aCA9IDA7CiAgICBzcCA9ICZzdGFja1swXTsKICAgIHZpbV9tZW1zZXQoc3AsIDAsIHNpemVvZih0cnlzdGF0ZV9UKSk7CiAgICBzcC0+dHNfY3VyaSA9IDE7CgogICAgaWYgKHNvdW5kZm9sZCkKICAgIHsKCS8qIEdvaW5nIHRocm91Z2ggdGhlIHNvdW5kZm9sZCB0cmVlLiAqLwoJYnl0cyA9IGZieXRzID0gc2xhbmctPnNsX3NieXRzOwoJaWR4cyA9IGZpZHhzID0gc2xhbmctPnNsX3NpZHhzOwoJcGJ5dHMgPSBOVUxMOwoJcGlkeHMgPSBOVUxMOwoJc3AtPnRzX3ByZWZpeGRlcHRoID0gUEZEX05PUFJFRklYOwoJc3AtPnRzX3N0YXRlID0gU1RBVEVfU1RBUlQ7CiAgICB9CiAgICBlbHNlCiAgICB7CgkvKgoJICogV2hlbiB0aGVyZSBhcmUgcG9zdHBvbmVkIHByZWZpeGVzIHdlIG5lZWQgdG8gdXNlIHRoZXNlIGZpcnN0LiAgQXQKCSAqIHRoZSBlbmQgb2YgdGhlIHByZWZpeCB3ZSBjb250aW51ZSBpbiB0aGUgY2FzZS1mb2xkIHRyZWUuCgkgKi8KCWZieXRzID0gc2xhbmctPnNsX2ZieXRzOwoJZmlkeHMgPSBzbGFuZy0+c2xfZmlkeHM7CglwYnl0cyA9IHNsYW5nLT5zbF9wYnl0czsKCXBpZHhzID0gc2xhbmctPnNsX3BpZHhzOwoJaWYgKHBieXRzICE9IE5VTEwpCgl7CgkgICAgYnl0cyA9IHBieXRzOwoJICAgIGlkeHMgPSBwaWR4czsKCSAgICBzcC0+dHNfcHJlZml4ZGVwdGggPSBQRkRfUFJFRklYVFJFRTsKCSAgICBzcC0+dHNfc3RhdGUgPSBTVEFURV9OT1BSRUZJWDsJLyogdHJ5IHdpdGhvdXQgcHJlZml4IGZpcnN0ICovCgl9CgllbHNlCgl7CgkgICAgYnl0cyA9IGZieXRzOwoJICAgIGlkeHMgPSBmaWR4czsKCSAgICBzcC0+dHNfcHJlZml4ZGVwdGggPSBQRkRfTk9QUkVGSVg7CgkgICAgc3AtPnRzX3N0YXRlID0gU1RBVEVfU1RBUlQ7Cgl9CiAgICB9CgogICAgLyoKICAgICAqIExvb3AgdG8gZmluZCBhbGwgc3VnZ2VzdGlvbnMuICBBdCBlYWNoIHJvdW5kIHdlIGVpdGhlcjoKICAgICAqIC0gRm9yIHRoZSBjdXJyZW50IHN0YXRlIHRyeSBvbmUgb3BlcmF0aW9uLCBhZHZhbmNlICJ0c19jdXJpIiwKICAgICAqICAgaW5jcmVhc2UgImRlcHRoIi4KICAgICAqIC0gV2hlbiBhIHN0YXRlIGlzIGRvbmUgZ28gdG8gdGhlIG5leHQsIHNldCAidHNfc3RhdGUiLgogICAgICogLSBXaGVuIGFsbCBzdGF0ZXMgYXJlIHRyaWVkIGRlY3JlYXNlICJkZXB0aCIuCiAgICAgKi8KICAgIHdoaWxlIChkZXB0aCA+PSAwICYmICFnb3RfaW50KQogICAgewoJc3AgPSAmc3RhY2tbZGVwdGhdOwoJc3dpdGNoIChzcC0+dHNfc3RhdGUpCgl7CgljYXNlIFNUQVRFX1NUQVJUOgoJY2FzZSBTVEFURV9OT1BSRUZJWDoKCSAgICAvKgoJICAgICAqIFN0YXJ0IG9mIG5vZGU6IERlYWwgd2l0aCBOVUwgYnl0ZXMsIHdoaWNoIG1lYW5zCgkgICAgICogdHdvcmRbXSBtYXkgZW5kIGhlcmUuCgkgICAgICovCgkgICAgYXJyaWR4ID0gc3AtPnRzX2FycmlkeDsJICAgIC8qIGN1cnJlbnQgbm9kZSBpbiB0aGUgdHJlZSAqLwoJICAgIGxlbiA9IGJ5dHNbYXJyaWR4XTsJCSAgICAvKiBieXRlcyBpbiB0aGlzIG5vZGUgKi8KCSAgICBhcnJpZHggKz0gc3AtPnRzX2N1cmk7CSAgICAvKiBpbmRleCBvZiBjdXJyZW50IGJ5dGUgKi8KCgkgICAgaWYgKHNwLT50c19wcmVmaXhkZXB0aCA9PSBQRkRfUFJFRklYVFJFRSkKCSAgICB7CgkJLyogU2tpcCBvdmVyIHRoZSBOVUwgYnl0ZXMsIHdlIHVzZSB0aGVtIGxhdGVyLiAqLwoJCWZvciAobiA9IDA7IG4gPCBsZW4gJiYgYnl0c1thcnJpZHggKyBuXSA9PSAwOyArK24pCgkJICAgIDsKCQlzcC0+dHNfY3VyaSArPSBuOwoKCQkvKiBBbHdheXMgcGFzdCBOVUwgYnl0ZXMgbm93LiAqLwoJCW4gPSAoaW50KXNwLT50c19zdGF0ZTsKCQlzcC0+dHNfc3RhdGUgPSBTVEFURV9FTkROVUw7CgkJc3AtPnRzX3NhdmVfYmFkZmxhZ3MgPSBzdS0+c3VfYmFkZmxhZ3M7CgoJCS8qIEF0IGVuZCBvZiBhIHByZWZpeCBvciBhdCBzdGFydCBvZiBwcmVmaXh0cmVlOiBjaGVjayBmb3IKCQkgKiBmb2xsb3dpbmcgd29yZC4gKi8KCQlpZiAoYnl0c1thcnJpZHhdID09IDAgfHwgbiA9PSAoaW50KVNUQVRFX05PUFJFRklYKQoJCXsKCQkgICAgLyogU2V0IHN1LT5zdV9iYWRmbGFncyB0byB0aGUgY2FwcyB0eXBlIGF0IHRoaXMgcG9zaXRpb24uCgkJICAgICAqIFVzZSB0aGUgY2FwcyB0eXBlIHVudGlsIGhlcmUgZm9yIHRoZSBwcmVmaXggaXRzZWxmLiAqLwojaWZkZWYgRkVBVF9NQllURQoJCSAgICBpZiAoaGFzX21ieXRlKQoJCQluID0gbm9mb2xkX2xlbihmd29yZCwgc3AtPnRzX2ZpZHgsIHN1LT5zdV9iYWRwdHIpOwoJCSAgICBlbHNlCiNlbmRpZgoJCQluID0gc3AtPnRzX2ZpZHg7CgkJICAgIGZsYWdzID0gYmFkd29yZF9jYXB0eXBlKHN1LT5zdV9iYWRwdHIsIHN1LT5zdV9iYWRwdHIgKyBuKTsKCQkgICAgc3UtPnN1X2JhZGZsYWdzID0gYmFkd29yZF9jYXB0eXBlKHN1LT5zdV9iYWRwdHIgKyBuLAoJCQkJCSAgICAgICBzdS0+c3VfYmFkcHRyICsgc3UtPnN1X2JhZGxlbik7CiNpZmRlZiBERUJVR19UUklFV0FMSwoJCSAgICBzcHJpbnRmKGNoYW5nZW5hbWVbZGVwdGhdLCAicHJlZml4Iik7CiNlbmRpZgoJCSAgICBnb19kZWVwZXIoc3RhY2ssIGRlcHRoLCAwKTsKCQkgICAgKytkZXB0aDsKCQkgICAgc3AgPSAmc3RhY2tbZGVwdGhdOwoJCSAgICBzcC0+dHNfcHJlZml4ZGVwdGggPSBkZXB0aCAtIDE7CgkJICAgIGJ5dHMgPSBmYnl0czsKCQkgICAgaWR4cyA9IGZpZHhzOwoJCSAgICBzcC0+dHNfYXJyaWR4ID0gMDsKCgkJICAgIC8qIE1vdmUgdGhlIHByZWZpeCB0byBwcmV3b3JkW10gd2l0aCB0aGUgcmlnaHQgY2FzZQoJCSAgICAgKiBhbmQgbWFrZSBmaW5kX2tlZXBjYXBfd29yZCgpIHdvcmtzLiAqLwoJCSAgICB0d29yZFtzcC0+dHNfdHdvcmRsZW5dID0gTlVMOwoJCSAgICBtYWtlX2Nhc2Vfd29yZCh0d29yZCArIHNwLT50c19zcGxpdG9mZiwKCQkJCQkgIHByZXdvcmQgKyBzcC0+dHNfcHJld29yZGxlbiwgZmxhZ3MpOwoJCSAgICBzcC0+dHNfcHJld29yZGxlbiA9IFNUUkxFTihwcmV3b3JkKTsKCQkgICAgc3AtPnRzX3NwbGl0b2ZmID0gc3AtPnRzX3R3b3JkbGVuOwoJCX0KCQlicmVhazsKCSAgICB9CgoJICAgIGlmIChzcC0+dHNfY3VyaSA+IGxlbiB8fCBieXRzW2FycmlkeF0gIT0gMCkKCSAgICB7CgkJLyogUGFzdCBieXRlcyBpbiBub2RlIGFuZC9vciBwYXN0IE5VTCBieXRlcy4gKi8KCQlzcC0+dHNfc3RhdGUgPSBTVEFURV9FTkROVUw7CgkJc3AtPnRzX3NhdmVfYmFkZmxhZ3MgPSBzdS0+c3VfYmFkZmxhZ3M7CgkJYnJlYWs7CgkgICAgfQoKCSAgICAvKgoJICAgICAqIEVuZCBvZiB3b3JkIGluIHRyZWUuCgkgICAgICovCgkgICAgKytzcC0+dHNfY3VyaTsJCS8qIGVhdCBvbmUgTlVMIGJ5dGUgKi8KCgkgICAgZmxhZ3MgPSAoaW50KWlkeHNbYXJyaWR4XTsKCgkgICAgLyogU2tpcCB3b3JkcyB3aXRoIHRoZSBOT1NVR0dFU1QgZmxhZy4gKi8KCSAgICBpZiAoZmxhZ3MgJiBXRl9OT1NVR0dFU1QpCgkJYnJlYWs7CgoJICAgIGZ3b3JkX2VuZHMgPSAoZndvcmRbc3AtPnRzX2ZpZHhdID09IE5VTAoJCQkgICB8fCAoc291bmRmb2xkCgkJCSAgICAgICA/IHZpbV9pc3doaXRlKGZ3b3JkW3NwLT50c19maWR4XSkKCQkJICAgICAgIDogIXNwZWxsX2lzd29yZHAoZndvcmQgKyBzcC0+dHNfZmlkeCwgY3VyYnVmKSkpOwoJICAgIHR3b3JkW3NwLT50c190d29yZGxlbl0gPSBOVUw7CgoJICAgIGlmIChzcC0+dHNfcHJlZml4ZGVwdGggPD0gUEZEX05PVFNQRUNJQUwKCQkJCQkmJiAoc3AtPnRzX2ZsYWdzICYgVFNGX1BSRUZJWE9LKSA9PSAwKQoJICAgIHsKCQkvKiBUaGVyZSB3YXMgYSBwcmVmaXggYmVmb3JlIHRoZSB3b3JkLiAgQ2hlY2sgdGhhdCB0aGUgcHJlZml4CgkJICogY2FuIGJlIHVzZWQgd2l0aCB0aGlzIHdvcmQuICovCgkJLyogQ291bnQgdGhlIGxlbmd0aCBvZiB0aGUgTlVMcyBpbiB0aGUgcHJlZml4LiAgSWYgdGhlcmUgYXJlCgkJICogbm9uZSB0aGlzIG11c3QgYmUgdGhlIGZpcnN0IHRyeSB3aXRob3V0IGEgcHJlZml4LiAgKi8KCQluID0gc3RhY2tbc3AtPnRzX3ByZWZpeGRlcHRoXS50c19hcnJpZHg7CgkJbGVuID0gcGJ5dHNbbisrXTsKCQlmb3IgKGMgPSAwOyBjIDwgbGVuICYmIHBieXRzW24gKyBjXSA9PSAwOyArK2MpCgkJICAgIDsKCQlpZiAoYyA+IDApCgkJewoJCSAgICBjID0gdmFsaWRfd29yZF9wcmVmaXgoYywgbiwgZmxhZ3MsCgkJCQkgICAgICAgdHdvcmQgKyBzcC0+dHNfc3BsaXRvZmYsIHNsYW5nLCBGQUxTRSk7CgkJICAgIGlmIChjID09IDApCgkJCWJyZWFrOwoKCQkgICAgLyogVXNlIHRoZSBXRl9SQVJFIGZsYWcgZm9yIGEgcmFyZSBwcmVmaXguICovCgkJICAgIGlmIChjICYgV0ZfUkFSRVBGWCkKCQkJZmxhZ3MgfD0gV0ZfUkFSRTsKCgkJICAgIC8qIFRyaWNreTogd2hlbiBjaGVja2luZyBmb3IgYm90aCBwcmVmaXggYW5kIGNvbXBvdW5kaW5nCgkJICAgICAqIHdlIHJ1biBpbnRvIHRoZSBwcmVmaXggZmxhZyBmaXJzdC4KCQkgICAgICogUmVtZW1iZXIgdGhhdCBpdCdzIE9LLCBzbyB0aGF0IHdlIGFjY2VwdCB0aGUgcHJlZml4CgkJICAgICAqIHdoZW4gYXJyaXZpbmcgYXQgYSBjb21wb3VuZCBmbGFnLiAqLwoJCSAgICBzcC0+dHNfZmxhZ3MgfD0gVFNGX1BSRUZJWE9LOwoJCX0KCSAgICB9CgoJICAgIC8qIENoZWNrIE5FRURDT01QT1VORDogY2FuJ3QgdXNlIHdvcmQgd2l0aG91dCBjb21wb3VuZGluZy4gIERvIHRyeQoJICAgICAqIGFwcGVuZGluZyBhbm90aGVyIGNvbXBvdW5kIHdvcmQgYmVsb3cuICovCgkgICAgaWYgKHNwLT50c19jb21wbGVuID09IHNwLT50c19jb21wc3BsaXQgJiYgZndvcmRfZW5kcwoJCQkJCQkgICAgICYmIChmbGFncyAmIFdGX05FRURDT01QKSkKCQlnb29kd29yZF9lbmRzID0gRkFMU0U7CgkgICAgZWxzZQoJCWdvb2R3b3JkX2VuZHMgPSBUUlVFOwoKCSAgICBwID0gTlVMTDsKCSAgICBjb21wb3VuZF9vayA9IFRSVUU7CgkgICAgaWYgKHNwLT50c19jb21wbGVuID4gc3AtPnRzX2NvbXBzcGxpdCkKCSAgICB7CgkJaWYgKHNsYW5nLT5zbF9ub2JyZWFrKQoJCXsKCQkgICAgLyogVGhlcmUgd2FzIGEgd29yZCBiZWZvcmUgdGhpcyB3b3JkLiAgV2hlbiB0aGVyZSB3YXMgbm8KCQkgICAgICogY2hhbmdlIGluIHRoaXMgd29yZCAoaXQgd2FzIGNvcnJlY3QpIGFkZCB0aGUgZmlyc3Qgd29yZAoJCSAgICAgKiBhcyBhIHN1Z2dlc3Rpb24uICBJZiB0aGlzIHdvcmQgd2FzIGNvcnJlY3RlZCB0b28sIHdlCgkJICAgICAqIG5lZWQgdG8gY2hlY2sgaWYgYSBjb3JyZWN0IHdvcmQgZm9sbG93cy4gKi8KCQkgICAgaWYgKHNwLT50c19maWR4IC0gc3AtPnRzX3NwbGl0ZmlkeAoJCQkJCSAgPT0gc3AtPnRzX3R3b3JkbGVuIC0gc3AtPnRzX3NwbGl0b2ZmCgkJCSAgICAmJiBTVFJOQ01QKGZ3b3JkICsgc3AtPnRzX3NwbGl0ZmlkeCwKCQkJCQl0d29yZCArIHNwLT50c19zcGxpdG9mZiwKCQkJCQkgc3AtPnRzX2ZpZHggLSBzcC0+dHNfc3BsaXRmaWR4KSA9PSAwKQoJCSAgICB7CgkJCXByZXdvcmRbc3AtPnRzX3ByZXdvcmRsZW5dID0gTlVMOwoJCQluZXdzY29yZSA9IHNjb3JlX3dvcmRjb3VudF9hZGooc2xhbmcsIHNwLT50c19zY29yZSwKCQkJCQkJIHByZXdvcmQgKyBzcC0+dHNfcHJld29yZGxlbiwKCQkJCQkJIHNwLT50c19wcmV3b3JkbGVuID4gMCk7CgkJCS8qIEFkZCB0aGUgc3VnZ2VzdGlvbiBpZiB0aGUgc2NvcmUgaXNuJ3QgdG9vIGJhZC4gKi8KCQkJaWYgKG5ld3Njb3JlIDw9IHN1LT5zdV9tYXhzY29yZSkKCQkJICAgIGFkZF9zdWdnZXN0aW9uKHN1LCAmc3UtPnN1X2dhLCBwcmV3b3JkLAoJCQkJICAgIHNwLT50c19zcGxpdGZpZHggLSByZXBleHRyYSwKCQkJCSAgICBuZXdzY29yZSwgMCwgRkFMU0UsCgkJCQkgICAgbHAtPmxwX3NhbGxhbmcsIEZBTFNFKTsKCQkJYnJlYWs7CgkJICAgIH0KCQl9CgkJZWxzZQoJCXsKCQkgICAgLyogVGhlcmUgd2FzIGEgY29tcG91bmQgd29yZCBiZWZvcmUgdGhpcyB3b3JkLiAgSWYgdGhpcwoJCSAgICAgKiB3b3JkIGRvZXMgbm90IHN1cHBvcnQgY29tcG91bmRpbmcgdGhlbiBnaXZlIHVwCgkJICAgICAqIChzcGxpdHRpbmcgaXMgdHJpZWQgZm9yIHRoZSB3b3JkIHdpdGhvdXQgY29tcG91bmQKCQkgICAgICogZmxhZykuICovCgkJICAgIGlmICgoKHVuc2lnbmVkKWZsYWdzID4+IDI0KSA9PSAwCgkJCSAgICB8fCBzcC0+dHNfdHdvcmRsZW4gLSBzcC0+dHNfc3BsaXRvZmYKCQkJCQkJICAgICAgIDwgc2xhbmctPnNsX2NvbXBtaW5sZW4pCgkJCWJyZWFrOwojaWZkZWYgRkVBVF9NQllURQoJCSAgICAvKiBGb3IgbXVsdGktYnl0ZSBjaGFycyBjaGVjayBjaGFyYWN0ZXIgbGVuZ3RoIGFnYWluc3QKCQkgICAgICogQ09NUE9VTkRNSU4uICovCgkJICAgIGlmIChoYXNfbWJ5dGUKCQkJICAgICYmIHNsYW5nLT5zbF9jb21wbWlubGVuID4gMAoJCQkgICAgJiYgbWJfY2hhcmxlbih0d29yZCArIHNwLT50c19zcGxpdG9mZikKCQkJCQkJICAgICAgIDwgc2xhbmctPnNsX2NvbXBtaW5sZW4pCgkJCWJyZWFrOwojZW5kaWYKCgkJICAgIGNvbXBmbGFnc1tzcC0+dHNfY29tcGxlbl0gPSAoKHVuc2lnbmVkKWZsYWdzID4+IDI0KTsKCQkgICAgY29tcGZsYWdzW3NwLT50c19jb21wbGVuICsgMV0gPSBOVUw7CgkJICAgIHZpbV9zdHJuY3B5KHByZXdvcmQgKyBzcC0+dHNfcHJld29yZGxlbiwKCQkJICAgIHR3b3JkICsgc3AtPnRzX3NwbGl0b2ZmLAoJCQkgICAgc3AtPnRzX3R3b3JkbGVuIC0gc3AtPnRzX3NwbGl0b2ZmKTsKCQkgICAgcCA9IHByZXdvcmQ7CgkJICAgIHdoaWxlICgqc2tpcHRvd2hpdGUocCkgIT0gTlVMKQoJCQlwID0gc2tpcHdoaXRlKHNraXB0b3doaXRlKHApKTsKCQkgICAgaWYgKGZ3b3JkX2VuZHMgJiYgIWNhbl9jb21wb3VuZChzbGFuZywgcCwKCQkJCQkJY29tcGZsYWdzICsgc3AtPnRzX2NvbXBzcGxpdCkpCgkJCS8qIENvbXBvdW5kIGlzIG5vdCBhbGxvd2VkLiAgQnV0IGl0IG1heSBzdGlsbCBiZQoJCQkgKiBwb3NzaWJsZSBpZiB3ZSBhZGQgYW5vdGhlciAoc2hvcnQpIHdvcmQuICovCgkJCWNvbXBvdW5kX29rID0gRkFMU0U7CgoJCSAgICAvKiBHZXQgcG9pbnRlciB0byBsYXN0IGNoYXIgb2YgcHJldmlvdXMgd29yZC4gKi8KCQkgICAgcCA9IHByZXdvcmQgKyBzcC0+dHNfcHJld29yZGxlbjsKCQkgICAgbWJfcHRyX2JhY2socHJld29yZCwgcCk7CgkJfQoJICAgIH0KCgkgICAgLyoKCSAgICAgKiBGb3JtIHRoZSB3b3JkIHdpdGggcHJvcGVyIGNhc2UgaW4gcHJld29yZC4KCSAgICAgKiBJZiB0aGVyZSBpcyBhIHdvcmQgZnJvbSBhIHByZXZpb3VzIHNwbGl0LCBhcHBlbmQuCgkgICAgICogRm9yIHRoZSBzb3VuZGZvbGQgdHJlZSBkb24ndCBjaGFuZ2UgdGhlIGNhc2UsIHNpbXBseSBhcHBlbmQuCgkgICAgICovCgkgICAgaWYgKHNvdW5kZm9sZCkKCQlTVFJDUFkocHJld29yZCArIHNwLT50c19wcmV3b3JkbGVuLCB0d29yZCArIHNwLT50c19zcGxpdG9mZik7CgkgICAgZWxzZSBpZiAoZmxhZ3MgJiBXRl9LRUVQQ0FQKQoJCS8qIE11c3QgZmluZCB0aGUgd29yZCBpbiB0aGUga2VlcC1jYXNlIHRyZWUuICovCgkJZmluZF9rZWVwY2FwX3dvcmQoc2xhbmcsIHR3b3JkICsgc3AtPnRzX3NwbGl0b2ZmLAoJCQkJCQkgcHJld29yZCArIHNwLT50c19wcmV3b3JkbGVuKTsKCSAgICBlbHNlCgkgICAgewoJCS8qIEluY2x1ZGUgYmFkZmxhZ3M6IElmIHRoZSBiYWR3b3JkIGlzIG9uZWNhcCBvciBhbGxjYXAKCQkgKiB1c2UgdGhhdCBmb3IgdGhlIGdvb2R3b3JkIHRvby4gIEJ1dCBpZiB0aGUgYmFkd29yZCBpcwoJCSAqIGFsbGNhcCBhbmQgaXQncyBvbmx5IG9uZSBjaGFyIGxvbmcgdXNlIG9uZWNhcC4gKi8KCQljID0gc3UtPnN1X2JhZGZsYWdzOwoJCWlmICgoYyAmIFdGX0FMTENBUCkKI2lmZGVmIEZFQVRfTUJZVEUKCQkJJiYgc3UtPnN1X2JhZGxlbiA9PSAoKm1iX3B0cjJsZW4pKHN1LT5zdV9iYWRwdHIpCiNlbHNlCgkJCSYmIHN1LT5zdV9iYWRsZW4gPT0gMQojZW5kaWYKCQkJKQoJCSAgICBjID0gV0ZfT05FQ0FQOwoJCWMgfD0gZmxhZ3M7CgoJCS8qIFdoZW4gYXBwZW5kaW5nIGEgY29tcG91bmQgd29yZCBhZnRlciBhIHdvcmQgY2hhcmFjdGVyIGRvbid0CgkJICogdXNlIE9uZWNhcC4gKi8KCQlpZiAocCAhPSBOVUxMICYmIHNwZWxsX2lzd29yZHBfbm13KHApKQoJCSAgICBjICY9IH5XRl9PTkVDQVA7CgkJbWFrZV9jYXNlX3dvcmQodHdvcmQgKyBzcC0+dHNfc3BsaXRvZmYsCgkJCQkJICAgICAgcHJld29yZCArIHNwLT50c19wcmV3b3JkbGVuLCBjKTsKCSAgICB9CgoJICAgIGlmICghc291bmRmb2xkKQoJICAgIHsKCQkvKiBEb24ndCB1c2UgYSBiYW5uZWQgd29yZC4gIEl0IG1heSBhcHBlYXIgYWdhaW4gYXMgYSBnb29kCgkJICogd29yZCwgdGh1cyByZW1lbWJlciBpdC4gKi8KCQlpZiAoZmxhZ3MgJiBXRl9CQU5ORUQpCgkJewoJCSAgICBhZGRfYmFubmVkKHN1LCBwcmV3b3JkICsgc3AtPnRzX3ByZXdvcmRsZW4pOwoJCSAgICBicmVhazsKCQl9CgkJaWYgKChzcC0+dHNfY29tcGxlbiA9PSBzcC0+dHNfY29tcHNwbGl0CgkJCSAgICAmJiBXQVNfQkFOTkVEKHN1LCBwcmV3b3JkICsgc3AtPnRzX3ByZXdvcmRsZW4pKQoJCQkJCQkgICB8fCBXQVNfQkFOTkVEKHN1LCBwcmV3b3JkKSkKCQl7CgkJICAgIGlmIChzbGFuZy0+c2xfY29tcHByb2cgPT0gTlVMTCkKCQkJYnJlYWs7CgkJICAgIC8qIHRoZSB3b3JkIHNvIGZhciB3YXMgYmFubmVkIGJ1dCB3ZSBtYXkgdHJ5IGNvbXBvdW5kaW5nICovCgkJICAgIGdvb2R3b3JkX2VuZHMgPSBGQUxTRTsKCQl9CgkgICAgfQoKCSAgICBuZXdzY29yZSA9IDA7CgkgICAgaWYgKCFzb3VuZGZvbGQpCS8qIHNvdW5kZm9sZCB3b3JkcyBkb24ndCBoYXZlIGZsYWdzICovCgkgICAgewoJCWlmICgoZmxhZ3MgJiBXRl9SRUdJT04pCgkJCSAgICAmJiAoKCh1bnNpZ25lZClmbGFncyA+PiAxNikgJiBscC0+bHBfcmVnaW9uKSA9PSAwKQoJCSAgICBuZXdzY29yZSArPSBTQ09SRV9SRUdJT047CgkJaWYgKGZsYWdzICYgV0ZfUkFSRSkKCQkgICAgbmV3c2NvcmUgKz0gU0NPUkVfUkFSRTsKCgkJaWYgKCFzcGVsbF92YWxpZF9jYXNlKHN1LT5zdV9iYWRmbGFncywKCQkJCSAgY2FwdHlwZShwcmV3b3JkICsgc3AtPnRzX3ByZXdvcmRsZW4sIE5VTEwpKSkKCQkgICAgbmV3c2NvcmUgKz0gU0NPUkVfSUNBU0U7CgkgICAgfQoKCSAgICAvKiBUT0RPOiBob3cgYWJvdXQgc3BsaXR0aW5nIGluIHRoZSBzb3VuZGZvbGQgdHJlZT8gKi8KCSAgICBpZiAoZndvcmRfZW5kcwoJCSAgICAmJiBnb29kd29yZF9lbmRzCgkJICAgICYmIHNwLT50c19maWR4ID49IHNwLT50c19maWR4dHJ5CgkJICAgICYmIGNvbXBvdW5kX29rKQoJICAgIHsKCQkvKiBUaGUgYmFkd29yZCBhbHNvIGVuZHM6IGFkZCBzdWdnZXN0aW9ucy4gKi8KI2lmZGVmIERFQlVHX1RSSUVXQUxLCgkJaWYgKHNvdW5kZm9sZCAmJiBTVFJDTVAocHJld29yZCwgInNtd3JkIikgPT0gMCkKCQl7CgkJICAgIGludAkgICAgajsKCgkJICAgIC8qIHByaW50IHRoZSBzdGFjayBvZiBjaGFuZ2VzIHRoYXQgYnJvdWdodCB1cyBoZXJlICovCgkJICAgIHNtc2coIi0tLS0tLSAlcyAtLS0tLS0tIiwgZndvcmQpOwoJCSAgICBmb3IgKGogPSAwOyBqIDwgZGVwdGg7ICsraikKCQkJc21zZygiJXMiLCBjaGFuZ2VuYW1lW2pdKTsKCQl9CiNlbmRpZgoJCWlmIChzb3VuZGZvbGQpCgkJewoJCSAgICAvKiBGb3Igc291bmRmb2xkZWQgd29yZHMgd2UgbmVlZCB0byBmaW5kIHRoZSBvcmlnaW5hbAoJCSAgICAgKiB3b3JkcywgdGhlIGVkaXQgZGlzdHJhbmNlIGFuZCB0aGVuIGFkZCB0aGVtLiAqLwoJCSAgICBhZGRfc291bmRfc3VnZ2VzdChzdSwgcHJld29yZCwgc3AtPnRzX3Njb3JlLCBscCk7CgkJfQoJCWVsc2UKCQl7CgkJICAgIC8qIEdpdmUgYSBwZW5hbHR5IHdoZW4gY2hhbmdpbmcgbm9uLXdvcmQgY2hhciB0byB3b3JkCgkJICAgICAqIGNoYXIsIGUuZy4sICJ0aGVzLCIgLT4gInRoZXNlIi4gKi8KCQkgICAgcCA9IGZ3b3JkICsgc3AtPnRzX2ZpZHg7CgkJICAgIG1iX3B0cl9iYWNrKGZ3b3JkLCBwKTsKCQkgICAgaWYgKCFzcGVsbF9pc3dvcmRwKHAsIGN1cmJ1ZikpCgkJICAgIHsKCQkJcCA9IHByZXdvcmQgKyBTVFJMRU4ocHJld29yZCk7CgkJCW1iX3B0cl9iYWNrKHByZXdvcmQsIHApOwoJCQlpZiAoc3BlbGxfaXN3b3JkcChwLCBjdXJidWYpKQoJCQkgICAgbmV3c2NvcmUgKz0gU0NPUkVfTk9OV09SRDsKCQkgICAgfQoKCQkgICAgLyogR2l2ZSBhIGJvbnVzIHRvIHdvcmRzIHNlZW4gYmVmb3JlLiAqLwoJCSAgICBzY29yZSA9IHNjb3JlX3dvcmRjb3VudF9hZGooc2xhbmcsCgkJCQkJCXNwLT50c19zY29yZSArIG5ld3Njb3JlLAoJCQkJCQlwcmV3b3JkICsgc3AtPnRzX3ByZXdvcmRsZW4sCgkJCQkJCXNwLT50c19wcmV3b3JkbGVuID4gMCk7CgoJCSAgICAvKiBBZGQgdGhlIHN1Z2dlc3Rpb24gaWYgdGhlIHNjb3JlIGlzbid0IHRvbyBiYWQuICovCgkJICAgIGlmIChzY29yZSA8PSBzdS0+c3VfbWF4c2NvcmUpCgkJICAgIHsKCQkJYWRkX3N1Z2dlc3Rpb24oc3UsICZzdS0+c3VfZ2EsIHByZXdvcmQsCgkJCQkgICAgc3AtPnRzX2ZpZHggLSByZXBleHRyYSwKCQkJCSAgICBzY29yZSwgMCwgRkFMU0UsIGxwLT5scF9zYWxsYW5nLCBGQUxTRSk7CgoJCQlpZiAoc3UtPnN1X2JhZGZsYWdzICYgV0ZfTUlYQ0FQKQoJCQl7CgkJCSAgICAvKiBXZSByZWFsbHkgZG9uJ3Qga25vdyBpZiB0aGUgd29yZCBzaG91bGQgYmUKCQkJICAgICAqIHVwcGVyIG9yIGxvd2VyIGNhc2UsIGFkZCBib3RoLiAqLwoJCQkgICAgYyA9IGNhcHR5cGUocHJld29yZCwgTlVMTCk7CgkJCSAgICBpZiAoYyA9PSAwIHx8IGMgPT0gV0ZfQUxMQ0FQKQoJCQkgICAgewoJCQkJbWFrZV9jYXNlX3dvcmQodHdvcmQgKyBzcC0+dHNfc3BsaXRvZmYsCgkJCQkJICAgICAgcHJld29yZCArIHNwLT50c19wcmV3b3JkbGVuLAoJCQkJCQkgICAgICBjID09IDAgPyBXRl9BTExDQVAgOiAwKTsKCgkJCQlhZGRfc3VnZ2VzdGlvbihzdSwgJnN1LT5zdV9nYSwgcHJld29yZCwKCQkJCQlzcC0+dHNfZmlkeCAtIHJlcGV4dHJhLAoJCQkJCXNjb3JlICsgU0NPUkVfSUNBU0UsIDAsIEZBTFNFLAoJCQkJCWxwLT5scF9zYWxsYW5nLCBGQUxTRSk7CgkJCSAgICB9CgkJCX0KCQkgICAgfQoJCX0KCSAgICB9CgoJICAgIC8qCgkgICAgICogVHJ5IHdvcmQgc3BsaXQgYW5kL29yIGNvbXBvdW5kaW5nLgoJICAgICAqLwoJICAgIGlmICgoc3AtPnRzX2ZpZHggPj0gc3AtPnRzX2ZpZHh0cnkgfHwgZndvcmRfZW5kcykKI2lmZGVmIEZFQVRfTUJZVEUKCQkgICAgLyogRG9uJ3Qgc3BsaXQgaGFsZndheSBhIGNoYXJhY3Rlci4gKi8KCQkgICAgJiYgKCFoYXNfbWJ5dGUgfHwgc3AtPnRzX3RjaGFybGVuID09IDApCiNlbmRpZgoJCSAgICApCgkgICAgewoJCWludAl0cnlfY29tcG91bmQ7CgkJaW50CXRyeV9zcGxpdDsKCgkJLyogSWYgcGFzdCB0aGUgZW5kIG9mIHRoZSBiYWQgd29yZCBkb24ndCB0cnkgYSBzcGxpdC4KCQkgKiBPdGhlcndpc2UgdHJ5IGNoYW5naW5nIHRoZSBuZXh0IHdvcmQuICBFLmcuLCBmaW5kCgkJICogc3VnZ2VzdGlvbnMgZm9yICJ0aGUgdGhlIiB3aGVyZSB0aGUgc2Vjb25kICJ0aGUiIGlzCgkJICogZGlmZmVyZW50LiAgSXQncyBkb25lIGxpa2UgYSBzcGxpdC4KCQkgKiBUT0RPOiB3b3JkIHNwbGl0IGZvciBzb3VuZGZvbGQgd29yZHMgKi8KCQl0cnlfc3BsaXQgPSAoc3AtPnRzX2ZpZHggLSByZXBleHRyYSA8IHN1LT5zdV9iYWRsZW4pCgkJCQkJCQkJJiYgIXNvdW5kZm9sZDsKCgkJLyogR2V0IGhlcmUgaW4gc2V2ZXJhbCBzaXR1YXRpb25zOgoJCSAqIDEuIFRoZSB3b3JkIGluIHRoZSB0cmVlIGVuZHM6CgkJICogICAgSWYgdGhlIHdvcmQgYWxsb3dzIGNvbXBvdW5kaW5nIHRyeSB0aGF0LiAgT3RoZXJ3aXNlIHRyeQoJCSAqICAgIGEgc3BsaXQgYnkgaW5zZXJ0aW5nIGEgc3BhY2UuICBGb3IgYm90aCBjaGVjayB0aGF0IGEKCQkgKiAgICB2YWxpZCB3b3JkcyBzdGFydHMgYXQgZndvcmRbc3AtPnRzX2ZpZHhdLgoJCSAqICAgIEZvciBOT0JSRUFLIGRvIGxpa2UgY29tcG91bmRpbmcgdG8gYmUgYWJsZSB0byBjaGVjayBpZgoJCSAqICAgIHRoZSBuZXh0IHdvcmQgaXMgdmFsaWQuCgkJICogMi4gVGhlIGJhZHdvcmQgZG9lcyBlbmQsIGJ1dCBpdCB3YXMgZHVlIHRvIGEgY2hhbmdlIChlLmcuLAoJCSAqICAgIGEgc3dhcCkuICBObyBuZWVkIHRvIHNwbGl0LCBidXQgZG8gY2hlY2sgdGhhdCB0aGUKCQkgKiAgICBmb2xsb3dpbmcgd29yZCBpcyB2YWxpZC4KCQkgKiAzLiBUaGUgYmFkd29yZCBhbmQgdGhlIHdvcmQgaW4gdGhlIHRyZWUgZW5kLiAgSXQgbWF5IHN0aWxsCgkJICogICAgYmUgcG9zc2libGUgdG8gY29tcG91bmQgYW5vdGhlciAoc2hvcnQpIHdvcmQuCgkJICovCgkJdHJ5X2NvbXBvdW5kID0gRkFMU0U7CgkJaWYgKCFzb3VuZGZvbGQKCQkJJiYgc2xhbmctPnNsX2NvbXBwcm9nICE9IE5VTEwKCQkJJiYgKCh1bnNpZ25lZClmbGFncyA+PiAyNCkgIT0gMAoJCQkmJiBzcC0+dHNfdHdvcmRsZW4gLSBzcC0+dHNfc3BsaXRvZmYKCQkJCQkJICAgICAgID49IHNsYW5nLT5zbF9jb21wbWlubGVuCiNpZmRlZiBGRUFUX01CWVRFCgkJCSYmICghaGFzX21ieXRlCgkJCSAgICB8fCBzbGFuZy0+c2xfY29tcG1pbmxlbiA9PSAwCgkJCSAgICB8fCBtYl9jaGFybGVuKHR3b3JkICsgc3AtPnRzX3NwbGl0b2ZmKQoJCQkJCQkgICAgICA+PSBzbGFuZy0+c2xfY29tcG1pbmxlbikKI2VuZGlmCgkJCSYmIChzbGFuZy0+c2xfY29tcHN5bG1heCA8IE1BWFdMRU4KCQkJICAgIHx8IHNwLT50c19jb21wbGVuICsgMSAtIHNwLT50c19jb21wc3BsaXQKCQkJCQkJCSAgPCBzbGFuZy0+c2xfY29tcG1heCkKCQkJJiYgKGJ5dGVfaW5fc3RyKHNwLT50c19jb21wbGVuID09IHNwLT50c19jb21wc3BsaXQKCQkJCQkgICAgPyBzbGFuZy0+c2xfY29tcHN0YXJ0ZmxhZ3MKCQkJCQkgICAgOiBzbGFuZy0+c2xfY29tcGFsbGZsYWdzLAoJCQkJCQkgICAgKCh1bnNpZ25lZClmbGFncyA+PiAyNCkpKSkKCQl7CgkJICAgIHRyeV9jb21wb3VuZCA9IFRSVUU7CgkJICAgIGNvbXBmbGFnc1tzcC0+dHNfY29tcGxlbl0gPSAoKHVuc2lnbmVkKWZsYWdzID4+IDI0KTsKCQkgICAgY29tcGZsYWdzW3NwLT50c19jb21wbGVuICsgMV0gPSBOVUw7CgkJfQoKCQkvKiBGb3IgTk9CUkVBSyB3ZSBuZXZlciB0cnkgc3BsaXR0aW5nLCBpdCB3b24ndCBtYWtlIGFueSB3b3JkCgkJICogdmFsaWQuICovCgkJaWYgKHNsYW5nLT5zbF9ub2JyZWFrKQoJCSAgICB0cnlfY29tcG91bmQgPSBUUlVFOwoKCQkvKiBJZiB3ZSBjb3VsZCBhZGQgYSBjb21wb3VuZCB3b3JkLCBhbmQgaXQncyBhbHNvIHBvc3NpYmxlIHRvCgkJICogc3BsaXQgYXQgdGhpcyBwb2ludCwgZG8gdGhlIHNwbGl0IGZpcnN0IGFuZCBzZXQKCQkgKiBUU0ZfRElEU1BMSVQgdG8gYXZvaWQgZG9pbmcgaXQgYWdhaW4uICovCgkJZWxzZSBpZiAoIWZ3b3JkX2VuZHMKCQkJJiYgdHJ5X2NvbXBvdW5kCgkJCSYmIChzcC0+dHNfZmxhZ3MgJiBUU0ZfRElEU1BMSVQpID09IDApCgkJewoJCSAgICB0cnlfY29tcG91bmQgPSBGQUxTRTsKCQkgICAgc3AtPnRzX2ZsYWdzIHw9IFRTRl9ESURTUExJVDsKCQkgICAgLS1zcC0+dHNfY3VyaTsJICAgIC8qIGRvIHRoZSBzYW1lIE5VTCBhZ2FpbiAqLwoJCSAgICBjb21wZmxhZ3Nbc3AtPnRzX2NvbXBsZW5dID0gTlVMOwoJCX0KCQllbHNlCgkJICAgIHNwLT50c19mbGFncyAmPSB+VFNGX0RJRFNQTElUOwoKCQlpZiAodHJ5X3NwbGl0IHx8IHRyeV9jb21wb3VuZCkKCQl7CgkJICAgIGlmICghdHJ5X2NvbXBvdW5kICYmICghZndvcmRfZW5kcyB8fCAhZ29vZHdvcmRfZW5kcykpCgkJICAgIHsKCQkJLyogSWYgd2UncmUgZ29pbmcgdG8gc3BsaXQgbmVlZCB0byBjaGVjayB0aGF0IHRoZQoJCQkgKiB3b3JkcyBzbyBmYXIgYXJlIHZhbGlkIGZvciBjb21wb3VuZGluZy4gIElmIHRoZXJlCgkJCSAqIGlzIG9ubHkgb25lIHdvcmQgaXQgbXVzdCBub3QgaGF2ZSB0aGUgTkVFRENPTVBPVU5ECgkJCSAqIGZsYWcuICovCgkJCWlmIChzcC0+dHNfY29tcGxlbiA9PSBzcC0+dHNfY29tcHNwbGl0CgkJCQkJCSAgICAgJiYgKGZsYWdzICYgV0ZfTkVFRENPTVApKQoJCQkgICAgYnJlYWs7CgkJCXAgPSBwcmV3b3JkOwoJCQl3aGlsZSAoKnNraXB0b3doaXRlKHApICE9IE5VTCkKCQkJICAgIHAgPSBza2lwd2hpdGUoc2tpcHRvd2hpdGUocCkpOwoJCQlpZiAoc3AtPnRzX2NvbXBsZW4gPiBzcC0+dHNfY29tcHNwbGl0CgkJCQkmJiAhY2FuX2NvbXBvdW5kKHNsYW5nLCBwLAoJCQkJCQljb21wZmxhZ3MgKyBzcC0+dHNfY29tcHNwbGl0KSkKCQkJICAgIGJyZWFrOwoKCQkJaWYgKHNsYW5nLT5zbF9ub3NwbGl0c3VncykKCQkJICAgIG5ld3Njb3JlICs9IFNDT1JFX1NQTElUX05POwoJCQllbHNlCgkJCSAgICBuZXdzY29yZSArPSBTQ09SRV9TUExJVDsKCgkJCS8qIEdpdmUgYSBib251cyB0byB3b3JkcyBzZWVuIGJlZm9yZS4gKi8KCQkJbmV3c2NvcmUgPSBzY29yZV93b3JkY291bnRfYWRqKHNsYW5nLCBuZXdzY29yZSwKCQkJCQkgICBwcmV3b3JkICsgc3AtPnRzX3ByZXdvcmRsZW4sIFRSVUUpOwoJCSAgICB9CgoJCSAgICBpZiAoVFJZX0RFRVBFUihzdSwgc3RhY2ssIGRlcHRoLCBuZXdzY29yZSkpCgkJICAgIHsKCQkJZ29fZGVlcGVyKHN0YWNrLCBkZXB0aCwgbmV3c2NvcmUpOwojaWZkZWYgREVCVUdfVFJJRVdBTEsKCQkJaWYgKCF0cnlfY29tcG91bmQgJiYgIWZ3b3JkX2VuZHMpCgkJCSAgICBzcHJpbnRmKGNoYW5nZW5hbWVbZGVwdGhdLCAiJS4qcy0lczogc3BsaXQiLAoJCQkJIHNwLT50c190d29yZGxlbiwgdHdvcmQsIGZ3b3JkICsgc3AtPnRzX2ZpZHgpOwoJCQllbHNlCgkJCSAgICBzcHJpbnRmKGNoYW5nZW5hbWVbZGVwdGhdLCAiJS4qcy0lczogY29tcG91bmQiLAoJCQkJIHNwLT50c190d29yZGxlbiwgdHdvcmQsIGZ3b3JkICsgc3AtPnRzX2ZpZHgpOwojZW5kaWYKCQkJLyogU2F2ZSB0aGluZ3MgdG8gYmUgcmVzdG9yZWQgYXQgU1RBVEVfU1BMSVRVTkRPLiAqLwoJCQlzcC0+dHNfc2F2ZV9iYWRmbGFncyA9IHN1LT5zdV9iYWRmbGFnczsKCQkJc3AtPnRzX3N0YXRlID0gU1RBVEVfU1BMSVRVTkRPOwoKCQkJKytkZXB0aDsKCQkJc3AgPSAmc3RhY2tbZGVwdGhdOwoKCQkJLyogQXBwZW5kIGEgc3BhY2UgdG8gcHJld29yZCB3aGVuIHNwbGl0dGluZy4gKi8KCQkJaWYgKCF0cnlfY29tcG91bmQgJiYgIWZ3b3JkX2VuZHMpCgkJCSAgICBTVFJDQVQocHJld29yZCwgIiAiKTsKCQkJc3AtPnRzX3ByZXdvcmRsZW4gPSBTVFJMRU4ocHJld29yZCk7CgkJCXNwLT50c19zcGxpdG9mZiA9IHNwLT50c190d29yZGxlbjsKCQkJc3AtPnRzX3NwbGl0ZmlkeCA9IHNwLT50c19maWR4OwoKCQkJLyogSWYgdGhlIGJhZHdvcmQgaGFzIGEgbm9uLXdvcmQgY2hhcmFjdGVyIGF0IHRoaXMKCQkJICogcG9zaXRpb24gc2tpcCBpdC4gIFRoYXQgbWVhbnMgcmVwbGFjaW5nIHRoZQoJCQkgKiBub24td29yZCBjaGFyYWN0ZXIgd2l0aCBhIHNwYWNlLiAgQWx3YXlzIHNraXAgYQoJCQkgKiBjaGFyYWN0ZXIgd2hlbiB0aGUgd29yZCBlbmRzLiAgQnV0IG9ubHkgd2hlbiB0aGUKCQkJICogZ29vZCB3b3JkIGNhbiBlbmQuICovCgkJCWlmICgoKCF0cnlfY29tcG91bmQgJiYgIXNwZWxsX2lzd29yZHBfbm13KGZ3b3JkCgkJCQkJCQkgICAgICAgKyBzcC0+dHNfZmlkeCkpCgkJCQkgICAgfHwgZndvcmRfZW5kcykKCQkJCSYmIGZ3b3JkW3NwLT50c19maWR4XSAhPSBOVUwKCQkJCSYmIGdvb2R3b3JkX2VuZHMpCgkJCXsKCQkJICAgIGludAkgICAgbDsKCiNpZmRlZiBGRUFUX01CWVRFCgkJCSAgICBpZiAoaGFzX21ieXRlKQoJCQkJbCA9IE1CX0JZVEUyTEVOKGZ3b3JkW3NwLT50c19maWR4XSk7CgkJCSAgICBlbHNlCiNlbmRpZgoJCQkJbCA9IDE7CgkJCSAgICBpZiAoZndvcmRfZW5kcykKCQkJICAgIHsKCQkJCS8qIENvcHkgdGhlIHNraXBwZWQgY2hhcmFjdGVyIHRvIHByZXdvcmQuICovCgkJCQltY2hfbWVtbW92ZShwcmV3b3JkICsgc3AtPnRzX3ByZXdvcmRsZW4sCgkJCQkJCSAgICAgIGZ3b3JkICsgc3AtPnRzX2ZpZHgsIGwpOwoJCQkJc3AtPnRzX3ByZXdvcmRsZW4gKz0gbDsKCQkJCXByZXdvcmRbc3AtPnRzX3ByZXdvcmRsZW5dID0gTlVMOwoJCQkgICAgfQoJCQkgICAgZWxzZQoJCQkJc3AtPnRzX3Njb3JlIC09IFNDT1JFX1NQTElUIC0gU0NPUkVfU1VCU1Q7CgkJCSAgICBzcC0+dHNfZmlkeCArPSBsOwoJCQl9CgoJCQkvKiBXaGVuIGNvbXBvdW5kaW5nIGluY2x1ZGUgY29tcG91bmQgZmxhZyBpbgoJCQkgKiBjb21wZmxhZ3NbXSAoYWxyZWFkeSBzZXQgYWJvdmUpLiAgV2hlbiBzcGxpdHRpbmcgd2UKCQkJICogbWF5IHN0YXJ0IGNvbXBvdW5kaW5nIG92ZXIgYWdhaW4uICAqLwoJCQlpZiAodHJ5X2NvbXBvdW5kKQoJCQkgICAgKytzcC0+dHNfY29tcGxlbjsKCQkJZWxzZQoJCQkgICAgc3AtPnRzX2NvbXBzcGxpdCA9IHNwLT50c19jb21wbGVuOwoJCQlzcC0+dHNfcHJlZml4ZGVwdGggPSBQRkRfTk9QUkVGSVg7CgoJCQkvKiBzZXQgc3UtPnN1X2JhZGZsYWdzIHRvIHRoZSBjYXBzIHR5cGUgYXQgdGhpcwoJCQkgKiBwb3NpdGlvbiAqLwojaWZkZWYgRkVBVF9NQllURQoJCQlpZiAoaGFzX21ieXRlKQoJCQkgICAgbiA9IG5vZm9sZF9sZW4oZndvcmQsIHNwLT50c19maWR4LCBzdS0+c3VfYmFkcHRyKTsKCQkJZWxzZQojZW5kaWYKCQkJICAgIG4gPSBzcC0+dHNfZmlkeDsKCQkJc3UtPnN1X2JhZGZsYWdzID0gYmFkd29yZF9jYXB0eXBlKHN1LT5zdV9iYWRwdHIgKyBuLAoJCQkJCSAgICAgICBzdS0+c3VfYmFkcHRyICsgc3UtPnN1X2JhZGxlbik7CgoJCQkvKiBSZXN0YXJ0IGF0IHRvcCBvZiB0aGUgdHJlZS4gKi8KCQkJc3AtPnRzX2FycmlkeCA9IDA7CgoJCQkvKiBJZiB0aGVyZSBhcmUgcG9zdHBvbmVkIHByZWZpeGVzLCB0cnkgdGhlc2UgdG9vLiAqLwoJCQlpZiAocGJ5dHMgIT0gTlVMTCkKCQkJewoJCQkgICAgYnl0cyA9IHBieXRzOwoJCQkgICAgaWR4cyA9IHBpZHhzOwoJCQkgICAgc3AtPnRzX3ByZWZpeGRlcHRoID0gUEZEX1BSRUZJWFRSRUU7CgkJCSAgICBzcC0+dHNfc3RhdGUgPSBTVEFURV9OT1BSRUZJWDsKCQkJfQoJCSAgICB9CgkJfQoJICAgIH0KCSAgICBicmVhazsKCgljYXNlIFNUQVRFX1NQTElUVU5ETzoKCSAgICAvKiBVbmRvIHRoZSBjaGFuZ2VzIGRvbmUgZm9yIHdvcmQgc3BsaXQgb3IgY29tcG91bmQgd29yZC4gKi8KCSAgICBzdS0+c3VfYmFkZmxhZ3MgPSBzcC0+dHNfc2F2ZV9iYWRmbGFnczsKCgkgICAgLyogQ29udGludWUgbG9va2luZyBmb3IgTlVMIGJ5dGVzLiAqLwoJICAgIHNwLT50c19zdGF0ZSA9IFNUQVRFX1NUQVJUOwoKCSAgICAvKiBJbiBjYXNlIHdlIHdlbnQgaW50byB0aGUgcHJlZml4IHRyZWUuICovCgkgICAgYnl0cyA9IGZieXRzOwoJICAgIGlkeHMgPSBmaWR4czsKCSAgICBicmVhazsKCgljYXNlIFNUQVRFX0VORE5VTDoKCSAgICAvKiBQYXN0IHRoZSBOVUwgYnl0ZXMgaW4gdGhlIG5vZGUuICovCgkgICAgc3UtPnN1X2JhZGZsYWdzID0gc3AtPnRzX3NhdmVfYmFkZmxhZ3M7CgkgICAgaWYgKGZ3b3JkW3NwLT50c19maWR4XSA9PSBOVUwKI2lmZGVmIEZFQVRfTUJZVEUKCQkgICAgJiYgc3AtPnRzX3RjaGFybGVuID09IDAKI2VuZGlmCgkgICAgICAgKQoJICAgIHsKCQkvKiBUaGUgYmFkd29yZCBlbmRzLCBjYW4ndCB1c2UgU1RBVEVfUExBSU4uICovCgkJc3AtPnRzX3N0YXRlID0gU1RBVEVfREVMOwoJCWJyZWFrOwoJICAgIH0KCSAgICBzcC0+dHNfc3RhdGUgPSBTVEFURV9QTEFJTjsKCSAgICAvKkZBTExUSFJPVUdIKi8KCgljYXNlIFNUQVRFX1BMQUlOOgoJICAgIC8qCgkgICAgICogR28gb3ZlciBhbGwgcG9zc2libGUgYnl0ZXMgYXQgdGhpcyBub2RlLCBhZGQgZWFjaCB0byB0d29yZFtdCgkgICAgICogYW5kIHVzZSBjaGlsZCBub2RlLiAgInRzX2N1cmkiIGlzIHRoZSBpbmRleC4KCSAgICAgKi8KCSAgICBhcnJpZHggPSBzcC0+dHNfYXJyaWR4OwoJICAgIGlmIChzcC0+dHNfY3VyaSA+IGJ5dHNbYXJyaWR4XSkKCSAgICB7CgkJLyogRG9uZSBhbGwgYnl0ZXMgYXQgdGhpcyBub2RlLCBkbyBuZXh0IHN0YXRlLiAgV2hlbiBzdGlsbCBhdAoJCSAqIGFscmVhZHkgY2hhbmdlZCBieXRlcyBza2lwIHRoZSBvdGhlciB0cmlja3MuICovCgkJaWYgKHNwLT50c19maWR4ID49IHNwLT50c19maWR4dHJ5KQoJCSAgICBzcC0+dHNfc3RhdGUgPSBTVEFURV9ERUw7CgkJZWxzZQoJCSAgICBzcC0+dHNfc3RhdGUgPSBTVEFURV9GSU5BTDsKCSAgICB9CgkgICAgZWxzZQoJICAgIHsKCQlhcnJpZHggKz0gc3AtPnRzX2N1cmkrKzsKCQljID0gYnl0c1thcnJpZHhdOwoKCQkvKiBOb3JtYWwgYnl0ZSwgZ28gb25lIGxldmVsIGRlZXBlci4gIElmIGl0J3Mgbm90IGVxdWFsIHRvIHRoZQoJCSAqIGJ5dGUgaW4gdGhlIGJhZCB3b3JkIGFkanVzdCB0aGUgc2NvcmUuICBCdXQgZG9uJ3QgZXZlbiB0cnkKCQkgKiB3aGVuIHRoZSBieXRlIHdhcyBhbHJlYWR5IGNoYW5nZWQuICBBbmQgZG9uJ3QgdHJ5IHdoZW4gd2UKCQkgKiBqdXN0IGRlbGV0ZWQgdGhpcyBieXRlLCBhY2NlcHRpbmcgaXQgaXMgYWx3YXlzIGNoZWFwZXIgdGhlbgoJCSAqIGRlbGV0ZSArIHN1YnN0aXR1dGUuICovCgkJaWYgKGMgPT0gZndvcmRbc3AtPnRzX2ZpZHhdCiNpZmRlZiBGRUFUX01CWVRFCgkJCXx8IChzcC0+dHNfdGNoYXJsZW4gPiAwICYmIHNwLT50c19pc2RpZmYgIT0gRElGRl9OT05FKQojZW5kaWYKCQkJKQoJCSAgICBuZXdzY29yZSA9IDA7CgkJZWxzZQoJCSAgICBuZXdzY29yZSA9IFNDT1JFX1NVQlNUOwoJCWlmICgobmV3c2NvcmUgPT0gMAoJCQkgICAgfHwgKHNwLT50c19maWR4ID49IHNwLT50c19maWR4dHJ5CgkJCQkmJiAoKHNwLT50c19mbGFncyAmIFRTRl9ESURERUwpID09IDAKCQkJCSAgICB8fCBjICE9IGZ3b3JkW3NwLT50c19kZWxpZHhdKSkpCgkJCSYmIFRSWV9ERUVQRVIoc3UsIHN0YWNrLCBkZXB0aCwgbmV3c2NvcmUpKQoJCXsKCQkgICAgZ29fZGVlcGVyKHN0YWNrLCBkZXB0aCwgbmV3c2NvcmUpOwojaWZkZWYgREVCVUdfVFJJRVdBTEsKCQkgICAgaWYgKG5ld3Njb3JlID4gMCkKCQkJc3ByaW50ZihjaGFuZ2VuYW1lW2RlcHRoXSwgIiUuKnMtJXM6IHN1YnN0ICVjIHRvICVjIiwKCQkJCXNwLT50c190d29yZGxlbiwgdHdvcmQsIGZ3b3JkICsgc3AtPnRzX2ZpZHgsCgkJCQlmd29yZFtzcC0+dHNfZmlkeF0sIGMpOwoJCSAgICBlbHNlCgkJCXNwcmludGYoY2hhbmdlbmFtZVtkZXB0aF0sICIlLipzLSVzOiBhY2NlcHQgJWMiLAoJCQkJc3AtPnRzX3R3b3JkbGVuLCB0d29yZCwgZndvcmQgKyBzcC0+dHNfZmlkeCwKCQkJCWZ3b3JkW3NwLT50c19maWR4XSk7CiNlbmRpZgoJCSAgICArK2RlcHRoOwoJCSAgICBzcCA9ICZzdGFja1tkZXB0aF07CgkJICAgICsrc3AtPnRzX2ZpZHg7CgkJICAgIHR3b3JkW3NwLT50c190d29yZGxlbisrXSA9IGM7CgkJICAgIHNwLT50c19hcnJpZHggPSBpZHhzW2FycmlkeF07CiNpZmRlZiBGRUFUX01CWVRFCgkJICAgIGlmIChuZXdzY29yZSA9PSBTQ09SRV9TVUJTVCkKCQkJc3AtPnRzX2lzZGlmZiA9IERJRkZfWUVTOwoJCSAgICBpZiAoaGFzX21ieXRlKQoJCSAgICB7CgkJCS8qIE11bHRpLWJ5dGUgY2hhcmFjdGVycyBhcmUgYSBiaXQgY29tcGxpY2F0ZWQgdG8KCQkJICogaGFuZGxlOiBUaGV5IGRpZmZlciB3aGVuIGFueSBvZiB0aGUgYnl0ZXMgZGlmZmVyCgkJCSAqIGFuZCB0aGVuIHRoZWlyIGxlbmd0aCBtYXkgYWxzbyBkaWZmZXIuICovCgkJCWlmIChzcC0+dHNfdGNoYXJsZW4gPT0gMCkKCQkJewoJCQkgICAgLyogRmlyc3QgYnl0ZS4gKi8KCQkJICAgIHNwLT50c190Y2hhcmlkeCA9IDA7CgkJCSAgICBzcC0+dHNfdGNoYXJsZW4gPSBNQl9CWVRFMkxFTihjKTsKCQkJICAgIHNwLT50c19mY2hhcnN0YXJ0ID0gc3AtPnRzX2ZpZHggLSAxOwoJCQkgICAgc3AtPnRzX2lzZGlmZiA9IChuZXdzY29yZSAhPSAwKQoJCQkJCQkgICAgICAgPyBESUZGX1lFUyA6IERJRkZfTk9ORTsKCQkJfQoJCQllbHNlIGlmIChzcC0+dHNfaXNkaWZmID09IERJRkZfSU5TRVJUKQoJCQkgICAgLyogV2hlbiBpbnNlcnRpbmcgdHJhaWwgYnl0ZXMgZG9uJ3QgYWR2YW5jZSBpbiB0aGUKCQkJICAgICAqIGJhZCB3b3JkLiAqLwoJCQkgICAgLS1zcC0+dHNfZmlkeDsKCQkJaWYgKCsrc3AtPnRzX3RjaGFyaWR4ID09IHNwLT50c190Y2hhcmxlbikKCQkJewoJCQkgICAgLyogTGFzdCBieXRlIG9mIGNoYXJhY3Rlci4gKi8KCQkJICAgIGlmIChzcC0+dHNfaXNkaWZmID09IERJRkZfWUVTKQoJCQkgICAgewoJCQkJLyogQ29ycmVjdCB0c19maWR4IGZvciB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlCgkJCQkgKiBjaGFyYWN0ZXIgKHdlIGRpZG4ndCBjaGVjayB0aGF0IGJlZm9yZSkuICovCgkJCQlzcC0+dHNfZmlkeCA9IHNwLT50c19mY2hhcnN0YXJ0CgkJCQkJICAgICsgTUJfQllURTJMRU4oCgkJCQkJCSAgICBmd29yZFtzcC0+dHNfZmNoYXJzdGFydF0pOwoKCQkJCS8qIEZvciBjaGFuZ2luZyBhIGNvbXBvc2luZyBjaGFyYWN0ZXIgYWRqdXN0CgkJCQkgKiB0aGUgc2NvcmUgZnJvbSBTQ09SRV9TVUJTVCB0bwoJCQkJICogU0NPUkVfU1VCQ09NUC4gKi8KCQkJCWlmIChlbmNfdXRmOAoJCQkJCSYmIHV0Zl9pc2NvbXBvc2luZygKCQkJCQkgICAgbWJfcHRyMmNoYXIodHdvcmQKCQkJCQkJKyBzcC0+dHNfdHdvcmRsZW4KCQkJCQkJCSAgIC0gc3AtPnRzX3RjaGFybGVuKSkKCQkJCQkmJiB1dGZfaXNjb21wb3NpbmcoCgkJCQkJICAgIG1iX3B0cjJjaGFyKGZ3b3JkCgkJCQkJCQkrIHNwLT50c19mY2hhcnN0YXJ0KSkpCgkJCQkgICAgc3AtPnRzX3Njb3JlIC09CgkJCQkJCSAgU0NPUkVfU1VCU1QgLSBTQ09SRV9TVUJDT01QOwoKCQkJCS8qIEZvciBhIHNpbWlsYXIgY2hhcmFjdGVyIGFkanVzdCBzY29yZSBmcm9tCgkJCQkgKiBTQ09SRV9TVUJTVCB0byBTQ09SRV9TSU1JTEFSLiAqLwoJCQkJZWxzZSBpZiAoIXNvdW5kZm9sZAoJCQkJCSYmIHNsYW5nLT5zbF9oYXNfbWFwCgkJCQkJJiYgc2ltaWxhcl9jaGFycyhzbGFuZywKCQkJCQkgICAgbWJfcHRyMmNoYXIodHdvcmQKCQkJCQkJKyBzcC0+dHNfdHdvcmRsZW4KCQkJCQkJCSAgIC0gc3AtPnRzX3RjaGFybGVuKSwKCQkJCQkgICAgbWJfcHRyMmNoYXIoZndvcmQKCQkJCQkJCSsgc3AtPnRzX2ZjaGFyc3RhcnQpKSkKCQkJCSAgICBzcC0+dHNfc2NvcmUgLT0KCQkJCQkJICBTQ09SRV9TVUJTVCAtIFNDT1JFX1NJTUlMQVI7CgkJCSAgICB9CgkJCSAgICBlbHNlIGlmIChzcC0+dHNfaXNkaWZmID09IERJRkZfSU5TRVJUCgkJCQkJICYmIHNwLT50c190d29yZGxlbiA+IHNwLT50c190Y2hhcmxlbikKCQkJICAgIHsKCQkJCXAgPSB0d29yZCArIHNwLT50c190d29yZGxlbiAtIHNwLT50c190Y2hhcmxlbjsKCQkJCWMgPSBtYl9wdHIyY2hhcihwKTsKCQkJCWlmIChlbmNfdXRmOCAmJiB1dGZfaXNjb21wb3NpbmcoYykpCgkJCQl7CgkJCQkgICAgLyogSW5zZXJ0aW5nIGEgY29tcG9zaW5nIGNoYXIgZG9lc24ndAoJCQkJICAgICAqIGNvdW50IHRoYXQgbXVjaC4gKi8KCQkJCSAgICBzcC0+dHNfc2NvcmUgLT0gU0NPUkVfSU5TIC0gU0NPUkVfSU5TQ09NUDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCSAgICAvKiBJZiB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIHdhcyB0aGUgc2FtZSwKCQkJCSAgICAgKiB0aHVzIGRvdWJsaW5nIGEgY2hhcmFjdGVyLCBnaXZlIGEgYm9udXMKCQkJCSAgICAgKiB0byB0aGUgc2NvcmUuICBBbHNvIGZvciB0aGUgc291bmRmb2xkCgkJCQkgICAgICogdHJlZSAobWlnaHQgc2VlbSBpbGxvZ2ljYWwgYnV0IGRvZXMKCQkJCSAgICAgKiBnaXZlIGJldHRlciBzY29yZXMpLiAqLwoJCQkJICAgIG1iX3B0cl9iYWNrKHR3b3JkLCBwKTsKCQkJCSAgICBpZiAoYyA9PSBtYl9wdHIyY2hhcihwKSkKCQkJCQlzcC0+dHNfc2NvcmUgLT0gU0NPUkVfSU5TCgkJCQkJCQkgICAgICAgLSBTQ09SRV9JTlNEVVA7CgkJCQl9CgkJCSAgICB9CgoJCQkgICAgLyogU3RhcnRpbmcgYSBuZXcgY2hhciwgcmVzZXQgdGhlIGxlbmd0aC4gKi8KCQkJICAgIHNwLT50c190Y2hhcmxlbiA9IDA7CgkJCX0KCQkgICAgfQoJCSAgICBlbHNlCiNlbmRpZgoJCSAgICB7CgkJCS8qIElmIHdlIGZvdW5kIGEgc2ltaWxhciBjaGFyIGFkanVzdCB0aGUgc2NvcmUuCgkJCSAqIFdlIGRvIHRoaXMgYWZ0ZXIgY2FsbGluZyBnb19kZWVwZXIoKSBiZWNhdXNlCgkJCSAqIGl0J3Mgc2xvdy4gKi8KCQkJaWYgKG5ld3Njb3JlICE9IDAKCQkJCSYmICFzb3VuZGZvbGQKCQkJCSYmIHNsYW5nLT5zbF9oYXNfbWFwCgkJCQkmJiBzaW1pbGFyX2NoYXJzKHNsYW5nLAoJCQkJCQkgICBjLCBmd29yZFtzcC0+dHNfZmlkeCAtIDFdKSkKCQkJICAgIHNwLT50c19zY29yZSAtPSBTQ09SRV9TVUJTVCAtIFNDT1JFX1NJTUlMQVI7CgkJICAgIH0KCQl9CgkgICAgfQoJICAgIGJyZWFrOwoKCWNhc2UgU1RBVEVfREVMOgojaWZkZWYgRkVBVF9NQllURQoJICAgIC8qIFdoZW4gcGFzdCB0aGUgZmlyc3QgYnl0ZSBvZiBhIG11bHRpLWJ5dGUgY2hhciBkb24ndCB0cnkKCSAgICAgKiBkZWxldGUvaW5zZXJ0L3N3YXAgYSBjaGFyYWN0ZXIuICovCgkgICAgaWYgKGhhc19tYnl0ZSAmJiBzcC0+dHNfdGNoYXJsZW4gPiAwKQoJICAgIHsKCQlzcC0+dHNfc3RhdGUgPSBTVEFURV9GSU5BTDsKCQlicmVhazsKCSAgICB9CiNlbmRpZgoJICAgIC8qCgkgICAgICogVHJ5IHNraXBwaW5nIG9uZSBjaGFyYWN0ZXIgaW4gdGhlIGJhZCB3b3JkIChkZWxldGUgaXQpLgoJICAgICAqLwoJICAgIHNwLT50c19zdGF0ZSA9IFNUQVRFX0lOU19QUkVQOwoJICAgIHNwLT50c19jdXJpID0gMTsKCSAgICBpZiAoc291bmRmb2xkICYmIHNwLT50c19maWR4ID09IDAgJiYgZndvcmRbc3AtPnRzX2ZpZHhdID09ICcqJykKCQkvKiBEZWxldGluZyBhIHZvd2VsIGF0IHRoZSBzdGFydCBvZiBhIHdvcmQgY291bnRzIGxlc3MsIHNlZQoJCSAqIHNvdW5kYWxpa2Vfc2NvcmUoKS4gKi8KCQluZXdzY29yZSA9IDIgKiBTQ09SRV9ERUwgLyAzOwoJICAgIGVsc2UKCQluZXdzY29yZSA9IFNDT1JFX0RFTDsKCSAgICBpZiAoZndvcmRbc3AtPnRzX2ZpZHhdICE9IE5VTAoJCQkJICAgICYmIFRSWV9ERUVQRVIoc3UsIHN0YWNrLCBkZXB0aCwgbmV3c2NvcmUpKQoJICAgIHsKCQlnb19kZWVwZXIoc3RhY2ssIGRlcHRoLCBuZXdzY29yZSk7CiNpZmRlZiBERUJVR19UUklFV0FMSwoJCXNwcmludGYoY2hhbmdlbmFtZVtkZXB0aF0sICIlLipzLSVzOiBkZWxldGUgJWMiLAoJCQlzcC0+dHNfdHdvcmRsZW4sIHR3b3JkLCBmd29yZCArIHNwLT50c19maWR4LAoJCQlmd29yZFtzcC0+dHNfZmlkeF0pOwojZW5kaWYKCQkrK2RlcHRoOwoKCQkvKiBSZW1lbWJlciB3aGF0IGNoYXJhY3RlciB3ZSBkZWxldGVkLCBzbyB0aGF0IHdlIGNhbiBhdm9pZAoJCSAqIGluc2VydGluZyBpdCBhZ2Fpbi4gKi8KCQlzdGFja1tkZXB0aF0udHNfZmxhZ3MgfD0gVFNGX0RJRERFTDsKCQlzdGFja1tkZXB0aF0udHNfZGVsaWR4ID0gc3AtPnRzX2ZpZHg7CgoJCS8qIEFkdmFuY2Ugb3ZlciB0aGUgY2hhcmFjdGVyIGluIGZ3b3JkW10uICBHaXZlIGEgYm9udXMgdG8gdGhlCgkJICogc2NvcmUgaWYgdGhlIHNhbWUgY2hhcmFjdGVyIGlzIGZvbGxvd2luZyAibm4iIC0+ICJuIi4gIEl0J3MKCQkgKiBhIGJpdCBpbGxvZ2ljYWwgZm9yIHNvdW5kZm9sZCB0cmVlIGJ1dCBpdCBkb2VzIGdpdmUgYmV0dGVyCgkJICogcmVzdWx0cy4gKi8KI2lmZGVmIEZFQVRfTUJZVEUKCQlpZiAoaGFzX21ieXRlKQoJCXsKCQkgICAgYyA9IG1iX3B0cjJjaGFyKGZ3b3JkICsgc3AtPnRzX2ZpZHgpOwoJCSAgICBzdGFja1tkZXB0aF0udHNfZmlkeCArPSBNQl9CWVRFMkxFTihmd29yZFtzcC0+dHNfZmlkeF0pOwoJCSAgICBpZiAoZW5jX3V0ZjggJiYgdXRmX2lzY29tcG9zaW5nKGMpKQoJCQlzdGFja1tkZXB0aF0udHNfc2NvcmUgLT0gU0NPUkVfREVMIC0gU0NPUkVfREVMQ09NUDsKCQkgICAgZWxzZSBpZiAoYyA9PSBtYl9wdHIyY2hhcihmd29yZCArIHN0YWNrW2RlcHRoXS50c19maWR4KSkKCQkJc3RhY2tbZGVwdGhdLnRzX3Njb3JlIC09IFNDT1JFX0RFTCAtIFNDT1JFX0RFTERVUDsKCQl9CgkJZWxzZQojZW5kaWYKCQl7CgkJICAgICsrc3RhY2tbZGVwdGhdLnRzX2ZpZHg7CgkJICAgIGlmIChmd29yZFtzcC0+dHNfZmlkeF0gPT0gZndvcmRbc3AtPnRzX2ZpZHggKyAxXSkKCQkJc3RhY2tbZGVwdGhdLnRzX3Njb3JlIC09IFNDT1JFX0RFTCAtIFNDT1JFX0RFTERVUDsKCQl9CgkJYnJlYWs7CgkgICAgfQoJICAgIC8qRkFMTFRIUk9VR0gqLwoKCWNhc2UgU1RBVEVfSU5TX1BSRVA6CgkgICAgaWYgKHNwLT50c19mbGFncyAmIFRTRl9ESURERUwpCgkgICAgewoJCS8qIElmIHdlIGp1c3QgZGVsZXRlZCBhIGJ5dGUgdGhlbiBpbnNlcnRpbmcgd29uJ3QgbWFrZSBzZW5zZSwKCQkgKiBhIHN1YnN0aXR1dGUgaXMgYWx3YXlzIGNoZWFwZXIuICovCgkJc3AtPnRzX3N0YXRlID0gU1RBVEVfU1dBUDsKCQlicmVhazsKCSAgICB9CgoJICAgIC8qIHNraXAgb3ZlciBOVUwgYnl0ZXMgKi8KCSAgICBuID0gc3AtPnRzX2FycmlkeDsKCSAgICBmb3IgKDs7KQoJICAgIHsKCQlpZiAoc3AtPnRzX2N1cmkgPiBieXRzW25dKQoJCXsKCQkgICAgLyogT25seSBOVUwgYnl0ZXMgYXQgdGhpcyBub2RlLCBnbyB0byBuZXh0IHN0YXRlLiAqLwoJCSAgICBzcC0+dHNfc3RhdGUgPSBTVEFURV9TV0FQOwoJCSAgICBicmVhazsKCQl9CgkJaWYgKGJ5dHNbbiArIHNwLT50c19jdXJpXSAhPSBOVUwpCgkJewoJCSAgICAvKiBGb3VuZCBhIGJ5dGUgdG8gaW5zZXJ0LiAqLwoJCSAgICBzcC0+dHNfc3RhdGUgPSBTVEFURV9JTlM7CgkJICAgIGJyZWFrOwoJCX0KCQkrK3NwLT50c19jdXJpOwoJICAgIH0KCSAgICBicmVhazsKCgkgICAgLypGQUxMVEhST1VHSCovCgoJY2FzZSBTVEFURV9JTlM6CgkgICAgLyogSW5zZXJ0IG9uZSBieXRlLiAgUmVwZWF0IHRoaXMgZm9yIGVhY2ggcG9zc2libGUgYnl0ZSBhdCB0aGlzCgkgICAgICogbm9kZS4gKi8KCSAgICBuID0gc3AtPnRzX2FycmlkeDsKCSAgICBpZiAoc3AtPnRzX2N1cmkgPiBieXRzW25dKQoJICAgIHsKCQkvKiBEb25lIGFsbCBieXRlcyBhdCB0aGlzIG5vZGUsIGdvIHRvIG5leHQgc3RhdGUuICovCgkJc3AtPnRzX3N0YXRlID0gU1RBVEVfU1dBUDsKCQlicmVhazsKCSAgICB9CgoJICAgIC8qIERvIG9uZSBtb3JlIGJ5dGUgYXQgdGhpcyBub2RlLCBidXQ6CgkgICAgICogLSBTa2lwIE5VTCBieXRlcy4KCSAgICAgKiAtIFNraXAgdGhlIGJ5dGUgaWYgaXQncyBlcXVhbCB0byB0aGUgYnl0ZSBpbiB0aGUgd29yZCwKCSAgICAgKiAgIGFjY2VwdGluZyB0aGF0IGJ5dGUgaXMgYWx3YXlzIGJldHRlci4KCSAgICAgKi8KCSAgICBuICs9IHNwLT50c19jdXJpKys7CgkgICAgYyA9IGJ5dHNbbl07CgkgICAgaWYgKHNvdW5kZm9sZCAmJiBzcC0+dHNfdHdvcmRsZW4gPT0gMCAmJiBjID09ICcqJykKCQkvKiBJbnNlcnRpbmcgYSB2b3dlbCBhdCB0aGUgc3RhcnQgb2YgYSB3b3JkIGNvdW50cyBsZXNzLAoJCSAqIHNlZSBzb3VuZGFsaWtlX3Njb3JlKCkuICovCgkJbmV3c2NvcmUgPSAyICogU0NPUkVfSU5TIC8gMzsKCSAgICBlbHNlCgkJbmV3c2NvcmUgPSBTQ09SRV9JTlM7CgkgICAgaWYgKGMgIT0gZndvcmRbc3AtPnRzX2ZpZHhdCgkJCQkgICAgJiYgVFJZX0RFRVBFUihzdSwgc3RhY2ssIGRlcHRoLCBuZXdzY29yZSkpCgkgICAgewoJCWdvX2RlZXBlcihzdGFjaywgZGVwdGgsIG5ld3Njb3JlKTsKI2lmZGVmIERFQlVHX1RSSUVXQUxLCgkJc3ByaW50ZihjaGFuZ2VuYW1lW2RlcHRoXSwgIiUuKnMtJXM6IGluc2VydCAlYyIsCgkJCXNwLT50c190d29yZGxlbiwgdHdvcmQsIGZ3b3JkICsgc3AtPnRzX2ZpZHgsCgkJCWMpOwojZW5kaWYKCQkrK2RlcHRoOwoJCXNwID0gJnN0YWNrW2RlcHRoXTsKCQl0d29yZFtzcC0+dHNfdHdvcmRsZW4rK10gPSBjOwoJCXNwLT50c19hcnJpZHggPSBpZHhzW25dOwojaWZkZWYgRkVBVF9NQllURQoJCWlmIChoYXNfbWJ5dGUpCgkJewoJCSAgICBmbCA9IE1CX0JZVEUyTEVOKGMpOwoJCSAgICBpZiAoZmwgPiAxKQoJCSAgICB7CgkJCS8qIFRoZXJlIGFyZSBmb2xsb3dpbmcgYnl0ZXMgZm9yIHRoZSBzYW1lIGNoYXJhY3Rlci4KCQkJICogV2UgbXVzdCBmaW5kIGFsbCBieXRlcyBiZWZvcmUgdHJ5aW5nCgkJCSAqIGRlbGV0ZS9pbnNlcnQvc3dhcC9ldGMuICovCgkJCXNwLT50c190Y2hhcmxlbiA9IGZsOwoJCQlzcC0+dHNfdGNoYXJpZHggPSAxOwoJCQlzcC0+dHNfaXNkaWZmID0gRElGRl9JTlNFUlQ7CgkJICAgIH0KCQl9CgkJZWxzZQoJCSAgICBmbCA9IDE7CgkJaWYgKGZsID09IDEpCiNlbmRpZgoJCXsKCQkgICAgLyogSWYgdGhlIHByZXZpb3VzIGNoYXJhY3RlciB3YXMgdGhlIHNhbWUsIHRodXMgZG91YmxpbmcgYQoJCSAgICAgKiBjaGFyYWN0ZXIsIGdpdmUgYSBib251cyB0byB0aGUgc2NvcmUuICBBbHNvIGZvcgoJCSAgICAgKiBzb3VuZGZvbGQgd29yZHMgKGlsbG9naWNhbCBidXQgZG9lcyBnaXZlIGEgYmV0dGVyCgkJICAgICAqIHNjb3JlKS4gKi8KCQkgICAgaWYgKHNwLT50c190d29yZGxlbiA+PSAyCgkJCQkJICAgJiYgdHdvcmRbc3AtPnRzX3R3b3JkbGVuIC0gMl0gPT0gYykKCQkJc3AtPnRzX3Njb3JlIC09IFNDT1JFX0lOUyAtIFNDT1JFX0lOU0RVUDsKCQl9CgkgICAgfQoJICAgIGJyZWFrOwoKCWNhc2UgU1RBVEVfU1dBUDoKCSAgICAvKgoJICAgICAqIFN3YXAgdHdvIGJ5dGVzIGluIHRoZSBiYWQgd29yZDogIjEyIiAtPiAiMjEiLgoJICAgICAqIFdlIGNoYW5nZSAiZndvcmQiIGhlcmUsIGl0J3MgY2hhbmdlZCBiYWNrIGFmdGVyd2FyZHMgYXQKCSAgICAgKiBTVEFURV9VTlNXQVAuCgkgICAgICovCgkgICAgcCA9IGZ3b3JkICsgc3AtPnRzX2ZpZHg7CgkgICAgYyA9ICpwOwoJICAgIGlmIChjID09IE5VTCkKCSAgICB7CgkJLyogRW5kIG9mIHdvcmQsIGNhbid0IHN3YXAgb3IgcmVwbGFjZS4gKi8KCQlzcC0+dHNfc3RhdGUgPSBTVEFURV9GSU5BTDsKCQlicmVhazsKCSAgICB9CgoJICAgIC8qIERvbid0IHN3YXAgaWYgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBub3QgYSB3b3JkIGNoYXJhY3Rlci4KCSAgICAgKiBTV0FQMyBldGMuIGFsc28gZG9uJ3QgbWFrZSBzZW5zZSB0aGVuLiAqLwoJICAgIGlmICghc291bmRmb2xkICYmICFzcGVsbF9pc3dvcmRwKHAsIGN1cmJ1ZikpCgkgICAgewoJCXNwLT50c19zdGF0ZSA9IFNUQVRFX1JFUF9JTkk7CgkJYnJlYWs7CgkgICAgfQoKI2lmZGVmIEZFQVRfTUJZVEUKCSAgICBpZiAoaGFzX21ieXRlKQoJICAgIHsKCQluID0gbWJfY3B0cjJsZW4ocCk7CgkJYyA9IG1iX3B0cjJjaGFyKHApOwoJCWlmICghc291bmRmb2xkICYmICFzcGVsbF9pc3dvcmRwKHAgKyBuLCBjdXJidWYpKQoJCSAgICBjMiA9IGM7IC8qIGRvbid0IHN3YXAgbm9uLXdvcmQgY2hhciAqLwoJCWVsc2UKCQkgICAgYzIgPSBtYl9wdHIyY2hhcihwICsgbik7CgkgICAgfQoJICAgIGVsc2UKI2VuZGlmCgkgICAgewoJCWlmICghc291bmRmb2xkICYmICFzcGVsbF9pc3dvcmRwKHAgKyAxLCBjdXJidWYpKQoJCSAgICBjMiA9IGM7IC8qIGRvbid0IHN3YXAgbm9uLXdvcmQgY2hhciAqLwoJCWVsc2UKCQkgICAgYzIgPSBwWzFdOwoJICAgIH0KCgkgICAgLyogV2hlbiBjaGFyYWN0ZXJzIGFyZSBpZGVudGljYWwsIHN3YXAgd29uJ3QgZG8gYW55dGhpbmcuCgkgICAgICogQWxzbyBnZXQgaGVyZSBpZiB0aGUgc2Vjb25kIGNoYXIgaXMgbm90IGEgd29yZCBjaGFyYWN0ZXIuICovCgkgICAgaWYgKGMgPT0gYzIpCgkgICAgewoJCXNwLT50c19zdGF0ZSA9IFNUQVRFX1NXQVAzOwoJCWJyZWFrOwoJICAgIH0KCSAgICBpZiAoYzIgIT0gTlVMICYmIFRSWV9ERUVQRVIoc3UsIHN0YWNrLCBkZXB0aCwgU0NPUkVfU1dBUCkpCgkgICAgewoJCWdvX2RlZXBlcihzdGFjaywgZGVwdGgsIFNDT1JFX1NXQVApOwojaWZkZWYgREVCVUdfVFJJRVdBTEsKCQlzcHJpbnRmKGNoYW5nZW5hbWVbZGVwdGhdLCAiJS4qcy0lczogc3dhcCAlYyBhbmQgJWMiLAoJCQlzcC0+dHNfdHdvcmRsZW4sIHR3b3JkLCBmd29yZCArIHNwLT50c19maWR4LAoJCQljLCBjMik7CiNlbmRpZgoJCXNwLT50c19zdGF0ZSA9IFNUQVRFX1VOU1dBUDsKCQkrK2RlcHRoOwojaWZkZWYgRkVBVF9NQllURQoJCWlmIChoYXNfbWJ5dGUpCgkJewoJCSAgICBmbCA9IG1iX2NoYXIybGVuKGMyKTsKCQkgICAgbWNoX21lbW1vdmUocCwgcCArIG4sIGZsKTsKCQkgICAgbWJfY2hhcjJieXRlcyhjLCBwICsgZmwpOwoJCSAgICBzdGFja1tkZXB0aF0udHNfZmlkeHRyeSA9IHNwLT50c19maWR4ICsgbiArIGZsOwoJCX0KCQllbHNlCiNlbmRpZgoJCXsKCQkgICAgcFswXSA9IGMyOwoJCSAgICBwWzFdID0gYzsKCQkgICAgc3RhY2tbZGVwdGhdLnRzX2ZpZHh0cnkgPSBzcC0+dHNfZmlkeCArIDI7CgkJfQoJICAgIH0KCSAgICBlbHNlCgkJLyogSWYgdGhpcyBzd2FwIGRvZXNuJ3Qgd29yayB0aGVuIFNXQVAzIHdvbid0IGVpdGhlci4gKi8KCQlzcC0+dHNfc3RhdGUgPSBTVEFURV9SRVBfSU5JOwoJICAgIGJyZWFrOwoKCWNhc2UgU1RBVEVfVU5TV0FQOgoJICAgIC8qIFVuZG8gdGhlIFNUQVRFX1NXQVAgc3dhcDogIjIxIiAtPiAiMTIiLiAqLwoJICAgIHAgPSBmd29yZCArIHNwLT50c19maWR4OwojaWZkZWYgRkVBVF9NQllURQoJICAgIGlmIChoYXNfbWJ5dGUpCgkgICAgewoJCW4gPSBNQl9CWVRFMkxFTigqcCk7CgkJYyA9IG1iX3B0cjJjaGFyKHAgKyBuKTsKCQltY2hfbWVtbW92ZShwICsgTUJfQllURTJMRU4ocFtuXSksIHAsIG4pOwoJCW1iX2NoYXIyYnl0ZXMoYywgcCk7CgkgICAgfQoJICAgIGVsc2UKI2VuZGlmCgkgICAgewoJCWMgPSAqcDsKCQkqcCA9IHBbMV07CgkJcFsxXSA9IGM7CgkgICAgfQoJICAgIC8qRkFMTFRIUk9VR0gqLwoKCWNhc2UgU1RBVEVfU1dBUDM6CgkgICAgLyogU3dhcCB0d28gYnl0ZXMsIHNraXBwaW5nIG9uZTogIjEyMyIgLT4gIjMyMSIuICBXZSBjaGFuZ2UKCSAgICAgKiAiZndvcmQiIGhlcmUsIGl0J3MgY2hhbmdlZCBiYWNrIGFmdGVyd2FyZHMgYXQgU1RBVEVfVU5TV0FQMy4gKi8KCSAgICBwID0gZndvcmQgKyBzcC0+dHNfZmlkeDsKI2lmZGVmIEZFQVRfTUJZVEUKCSAgICBpZiAoaGFzX21ieXRlKQoJICAgIHsKCQluID0gbWJfY3B0cjJsZW4ocCk7CgkJYyA9IG1iX3B0cjJjaGFyKHApOwoJCWZsID0gbWJfY3B0cjJsZW4ocCArIG4pOwoJCWMyID0gbWJfcHRyMmNoYXIocCArIG4pOwoJCWlmICghc291bmRmb2xkICYmICFzcGVsbF9pc3dvcmRwKHAgKyBuICsgZmwsIGN1cmJ1ZikpCgkJICAgIGMzID0gYzsJLyogZG9uJ3Qgc3dhcCBub24td29yZCBjaGFyICovCgkJZWxzZQoJCSAgICBjMyA9IG1iX3B0cjJjaGFyKHAgKyBuICsgZmwpOwoJICAgIH0KCSAgICBlbHNlCiNlbmRpZgoJICAgIHsKCQljID0gKnA7CgkJYzIgPSBwWzFdOwoJCWlmICghc291bmRmb2xkICYmICFzcGVsbF9pc3dvcmRwKHAgKyAyLCBjdXJidWYpKQoJCSAgICBjMyA9IGM7CS8qIGRvbid0IHN3YXAgbm9uLXdvcmQgY2hhciAqLwoJCWVsc2UKCQkgICAgYzMgPSBwWzJdOwoJICAgIH0KCgkgICAgLyogV2hlbiBjaGFyYWN0ZXJzIGFyZSBpZGVudGljYWw6ICIxMjEiIHRoZW4gU1dBUDMgcmVzdWx0IGlzCgkgICAgICogaWRlbnRpY2FsLCBST1QzTCByZXN1bHQgaXMgc2FtZSBhcyBTV0FQOiAiMjExIiwgUk9UM0wgcmVzdWx0IGlzCgkgICAgICogc2FtZSBhcyBTV0FQIG9uIG5leHQgY2hhcjogIjExMiIuICBUaHVzIHNraXAgYWxsIHN3YXBwaW5nLgoJICAgICAqIEFsc28gc2tpcCB3aGVuIGMzIGlzIE5VTC4KCSAgICAgKiBBbHNvIGdldCBoZXJlIHdoZW4gdGhlIHRoaXJkIGNoYXJhY3RlciBpcyBub3QgYSB3b3JkIGNoYXJhY3Rlci4KCSAgICAgKiBTZWNvbmQgY2hhcmFjdGVyIG1heSBhbnkgY2hhcjogImEuYiIgLT4gImIuYSIgKi8KCSAgICBpZiAoYyA9PSBjMyB8fCBjMyA9PSBOVUwpCgkgICAgewoJCXNwLT50c19zdGF0ZSA9IFNUQVRFX1JFUF9JTkk7CgkJYnJlYWs7CgkgICAgfQoJICAgIGlmIChUUllfREVFUEVSKHN1LCBzdGFjaywgZGVwdGgsIFNDT1JFX1NXQVAzKSkKCSAgICB7CgkJZ29fZGVlcGVyKHN0YWNrLCBkZXB0aCwgU0NPUkVfU1dBUDMpOwojaWZkZWYgREVCVUdfVFJJRVdBTEsKCQlzcHJpbnRmKGNoYW5nZW5hbWVbZGVwdGhdLCAiJS4qcy0lczogc3dhcDMgJWMgYW5kICVjIiwKCQkJc3AtPnRzX3R3b3JkbGVuLCB0d29yZCwgZndvcmQgKyBzcC0+dHNfZmlkeCwKCQkJYywgYzMpOwojZW5kaWYKCQlzcC0+dHNfc3RhdGUgPSBTVEFURV9VTlNXQVAzOwoJCSsrZGVwdGg7CiNpZmRlZiBGRUFUX01CWVRFCgkJaWYgKGhhc19tYnl0ZSkKCQl7CgkJICAgIHRsID0gbWJfY2hhcjJsZW4oYzMpOwoJCSAgICBtY2hfbWVtbW92ZShwLCBwICsgbiArIGZsLCB0bCk7CgkJICAgIG1iX2NoYXIyYnl0ZXMoYzIsIHAgKyB0bCk7CgkJICAgIG1iX2NoYXIyYnl0ZXMoYywgcCArIGZsICsgdGwpOwoJCSAgICBzdGFja1tkZXB0aF0udHNfZmlkeHRyeSA9IHNwLT50c19maWR4ICsgbiArIGZsICsgdGw7CgkJfQoJCWVsc2UKI2VuZGlmCgkJewoJCSAgICBwWzBdID0gcFsyXTsKCQkgICAgcFsyXSA9IGM7CgkJICAgIHN0YWNrW2RlcHRoXS50c19maWR4dHJ5ID0gc3AtPnRzX2ZpZHggKyAzOwoJCX0KCSAgICB9CgkgICAgZWxzZQoJCXNwLT50c19zdGF0ZSA9IFNUQVRFX1JFUF9JTkk7CgkgICAgYnJlYWs7CgoJY2FzZSBTVEFURV9VTlNXQVAzOgoJICAgIC8qIFVuZG8gU1RBVEVfU1dBUDM6ICIzMjEiIC0+ICIxMjMiICovCgkgICAgcCA9IGZ3b3JkICsgc3AtPnRzX2ZpZHg7CiNpZmRlZiBGRUFUX01CWVRFCgkgICAgaWYgKGhhc19tYnl0ZSkKCSAgICB7CgkJbiA9IE1CX0JZVEUyTEVOKCpwKTsKCQljMiA9IG1iX3B0cjJjaGFyKHAgKyBuKTsKCQlmbCA9IE1CX0JZVEUyTEVOKHBbbl0pOwoJCWMgPSBtYl9wdHIyY2hhcihwICsgbiArIGZsKTsKCQl0bCA9IE1CX0JZVEUyTEVOKHBbbiArIGZsXSk7CgkJbWNoX21lbW1vdmUocCArIGZsICsgdGwsIHAsIG4pOwoJCW1iX2NoYXIyYnl0ZXMoYywgcCk7CgkJbWJfY2hhcjJieXRlcyhjMiwgcCArIHRsKTsKCQlwID0gcCArIHRsOwoJICAgIH0KCSAgICBlbHNlCiNlbmRpZgoJICAgIHsKCQljID0gKnA7CgkJKnAgPSBwWzJdOwoJCXBbMl0gPSBjOwoJCSsrcDsKCSAgICB9CgoJICAgIGlmICghc291bmRmb2xkICYmICFzcGVsbF9pc3dvcmRwKHAsIGN1cmJ1ZikpCgkgICAgewoJCS8qIE1pZGRsZSBjaGFyIGlzIG5vdCBhIHdvcmQgY2hhciwgc2tpcCB0aGUgcm90YXRlLiAgRmlyc3QgYW5kCgkJICogdGhpcmQgY2hhciB3ZXJlIGFscmVhZHkgY2hlY2tlZCBhdCBzd2FwIGFuZCBzd2FwMy4gKi8KCQlzcC0+dHNfc3RhdGUgPSBTVEFURV9SRVBfSU5JOwoJCWJyZWFrOwoJICAgIH0KCgkgICAgLyogUm90YXRlIHRocmVlIGNoYXJhY3RlcnMgbGVmdDogIjEyMyIgLT4gIjIzMSIuICBXZSBjaGFuZ2UKCSAgICAgKiAiZndvcmQiIGhlcmUsIGl0J3MgY2hhbmdlZCBiYWNrIGFmdGVyd2FyZHMgYXQgU1RBVEVfVU5ST1QzTC4gKi8KCSAgICBpZiAoVFJZX0RFRVBFUihzdSwgc3RhY2ssIGRlcHRoLCBTQ09SRV9TV0FQMykpCgkgICAgewoJCWdvX2RlZXBlcihzdGFjaywgZGVwdGgsIFNDT1JFX1NXQVAzKTsKI2lmZGVmIERFQlVHX1RSSUVXQUxLCgkJcCA9IGZ3b3JkICsgc3AtPnRzX2ZpZHg7CgkJc3ByaW50ZihjaGFuZ2VuYW1lW2RlcHRoXSwgIiUuKnMtJXM6IHJvdGF0ZSBsZWZ0ICVjJWMlYyIsCgkJCXNwLT50c190d29yZGxlbiwgdHdvcmQsIGZ3b3JkICsgc3AtPnRzX2ZpZHgsCgkJCXBbMF0sIHBbMV0sIHBbMl0pOwojZW5kaWYKCQlzcC0+dHNfc3RhdGUgPSBTVEFURV9VTlJPVDNMOwoJCSsrZGVwdGg7CgkJcCA9IGZ3b3JkICsgc3AtPnRzX2ZpZHg7CiNpZmRlZiBGRUFUX01CWVRFCgkJaWYgKGhhc19tYnl0ZSkKCQl7CgkJICAgIG4gPSBtYl9jcHRyMmxlbihwKTsKCQkgICAgYyA9IG1iX3B0cjJjaGFyKHApOwoJCSAgICBmbCA9IG1iX2NwdHIybGVuKHAgKyBuKTsKCQkgICAgZmwgKz0gbWJfY3B0cjJsZW4ocCArIG4gKyBmbCk7CgkJICAgIG1jaF9tZW1tb3ZlKHAsIHAgKyBuLCBmbCk7CgkJICAgIG1iX2NoYXIyYnl0ZXMoYywgcCArIGZsKTsKCQkgICAgc3RhY2tbZGVwdGhdLnRzX2ZpZHh0cnkgPSBzcC0+dHNfZmlkeCArIG4gKyBmbDsKCQl9CgkJZWxzZQojZW5kaWYKCQl7CgkJICAgIGMgPSAqcDsKCQkgICAgKnAgPSBwWzFdOwoJCSAgICBwWzFdID0gcFsyXTsKCQkgICAgcFsyXSA9IGM7CgkJICAgIHN0YWNrW2RlcHRoXS50c19maWR4dHJ5ID0gc3AtPnRzX2ZpZHggKyAzOwoJCX0KCSAgICB9CgkgICAgZWxzZQoJCXNwLT50c19zdGF0ZSA9IFNUQVRFX1JFUF9JTkk7CgkgICAgYnJlYWs7CgoJY2FzZSBTVEFURV9VTlJPVDNMOgoJICAgIC8qIFVuZG8gUk9UM0w6ICIyMzEiIC0+ICIxMjMiICovCgkgICAgcCA9IGZ3b3JkICsgc3AtPnRzX2ZpZHg7CiNpZmRlZiBGRUFUX01CWVRFCgkgICAgaWYgKGhhc19tYnl0ZSkKCSAgICB7CgkJbiA9IE1CX0JZVEUyTEVOKCpwKTsKCQluICs9IE1CX0JZVEUyTEVOKHBbbl0pOwoJCWMgPSBtYl9wdHIyY2hhcihwICsgbik7CgkJdGwgPSBNQl9CWVRFMkxFTihwW25dKTsKCQltY2hfbWVtbW92ZShwICsgdGwsIHAsIG4pOwoJCW1iX2NoYXIyYnl0ZXMoYywgcCk7CgkgICAgfQoJICAgIGVsc2UKI2VuZGlmCgkgICAgewoJCWMgPSBwWzJdOwoJCXBbMl0gPSBwWzFdOwoJCXBbMV0gPSAqcDsKCQkqcCA9IGM7CgkgICAgfQoKCSAgICAvKiBSb3RhdGUgdGhyZWUgYnl0ZXMgcmlnaHQ6ICIxMjMiIC0+ICIzMTIiLiAgV2UgY2hhbmdlICJmd29yZCIKCSAgICAgKiBoZXJlLCBpdCdzIGNoYW5nZWQgYmFjayBhZnRlcndhcmRzIGF0IFNUQVRFX1VOUk9UM1IuICovCgkgICAgaWYgKFRSWV9ERUVQRVIoc3UsIHN0YWNrLCBkZXB0aCwgU0NPUkVfU1dBUDMpKQoJICAgIHsKCQlnb19kZWVwZXIoc3RhY2ssIGRlcHRoLCBTQ09SRV9TV0FQMyk7CiNpZmRlZiBERUJVR19UUklFV0FMSwoJCXAgPSBmd29yZCArIHNwLT50c19maWR4OwoJCXNwcmludGYoY2hhbmdlbmFtZVtkZXB0aF0sICIlLipzLSVzOiByb3RhdGUgcmlnaHQgJWMlYyVjIiwKCQkJc3AtPnRzX3R3b3JkbGVuLCB0d29yZCwgZndvcmQgKyBzcC0+dHNfZmlkeCwKCQkJcFswXSwgcFsxXSwgcFsyXSk7CiNlbmRpZgoJCXNwLT50c19zdGF0ZSA9IFNUQVRFX1VOUk9UM1I7CgkJKytkZXB0aDsKCQlwID0gZndvcmQgKyBzcC0+dHNfZmlkeDsKI2lmZGVmIEZFQVRfTUJZVEUKCQlpZiAoaGFzX21ieXRlKQoJCXsKCQkgICAgbiA9IG1iX2NwdHIybGVuKHApOwoJCSAgICBuICs9IG1iX2NwdHIybGVuKHAgKyBuKTsKCQkgICAgYyA9IG1iX3B0cjJjaGFyKHAgKyBuKTsKCQkgICAgdGwgPSBtYl9jcHRyMmxlbihwICsgbik7CgkJICAgIG1jaF9tZW1tb3ZlKHAgKyB0bCwgcCwgbik7CgkJICAgIG1iX2NoYXIyYnl0ZXMoYywgcCk7CgkJICAgIHN0YWNrW2RlcHRoXS50c19maWR4dHJ5ID0gc3AtPnRzX2ZpZHggKyBuICsgdGw7CgkJfQoJCWVsc2UKI2VuZGlmCgkJewoJCSAgICBjID0gcFsyXTsKCQkgICAgcFsyXSA9IHBbMV07CgkJICAgIHBbMV0gPSAqcDsKCQkgICAgKnAgPSBjOwoJCSAgICBzdGFja1tkZXB0aF0udHNfZmlkeHRyeSA9IHNwLT50c19maWR4ICsgMzsKCQl9CgkgICAgfQoJICAgIGVsc2UKCQlzcC0+dHNfc3RhdGUgPSBTVEFURV9SRVBfSU5JOwoJICAgIGJyZWFrOwoKCWNhc2UgU1RBVEVfVU5ST1QzUjoKCSAgICAvKiBVbmRvIFJPVDNSOiAiMzEyIiAtPiAiMTIzIiAqLwoJICAgIHAgPSBmd29yZCArIHNwLT50c19maWR4OwojaWZkZWYgRkVBVF9NQllURQoJICAgIGlmIChoYXNfbWJ5dGUpCgkgICAgewoJCWMgPSBtYl9wdHIyY2hhcihwKTsKCQl0bCA9IE1CX0JZVEUyTEVOKCpwKTsKCQluID0gTUJfQllURTJMRU4ocFt0bF0pOwoJCW4gKz0gTUJfQllURTJMRU4ocFt0bCArIG5dKTsKCQltY2hfbWVtbW92ZShwLCBwICsgdGwsIG4pOwoJCW1iX2NoYXIyYnl0ZXMoYywgcCArIG4pOwoJICAgIH0KCSAgICBlbHNlCiNlbmRpZgoJICAgIHsKCQljID0gKnA7CgkJKnAgPSBwWzFdOwoJCXBbMV0gPSBwWzJdOwoJCXBbMl0gPSBjOwoJICAgIH0KCSAgICAvKkZBTExUSFJPVUdIKi8KCgljYXNlIFNUQVRFX1JFUF9JTkk6CgkgICAgLyogQ2hlY2sgaWYgbWF0Y2hpbmcgd2l0aCBSRVAgaXRlbXMgZnJvbSB0aGUgLmFmZiBmaWxlIHdvdWxkIHdvcmsuCgkgICAgICogUXVpY2tseSBza2lwIGlmOgoJICAgICAqIC0gdGhlcmUgYXJlIG5vIFJFUCBpdGVtcyBhbmQgd2UgYXJlIG5vdCBpbiB0aGUgc291bmRmb2xkIHRyaWUKCSAgICAgKiAtIHRoZSBzY29yZSBpcyBnb2luZyB0byBiZSB0b28gaGlnaCBhbnl3YXkKCSAgICAgKiAtIGFscmVhZHkgYXBwbGllZCBhIFJFUCBpdGVtIG9yIHN3YXBwZWQgaGVyZSAgKi8KCSAgICBpZiAoKGxwLT5scF9yZXBsYW5nID09IE5VTEwgJiYgIXNvdW5kZm9sZCkKCQkgICAgfHwgc3AtPnRzX3Njb3JlICsgU0NPUkVfUkVQID49IHN1LT5zdV9tYXhzY29yZQoJCSAgICB8fCBzcC0+dHNfZmlkeCA8IHNwLT50c19maWR4dHJ5KQoJICAgIHsKCQlzcC0+dHNfc3RhdGUgPSBTVEFURV9GSU5BTDsKCQlicmVhazsKCSAgICB9CgoJICAgIC8qIFVzZSB0aGUgZmlyc3QgYnl0ZSB0byBxdWlja2x5IGZpbmQgdGhlIGZpcnN0IGVudHJ5IHRoYXQgbWF5CgkgICAgICogbWF0Y2guICBJZiB0aGUgaW5kZXggaXMgLTEgdGhlcmUgaXMgbm9uZS4gKi8KCSAgICBpZiAoc291bmRmb2xkKQoJCXNwLT50c19jdXJpID0gc2xhbmctPnNsX3JlcHNhbF9maXJzdFtmd29yZFtzcC0+dHNfZmlkeF1dOwoJICAgIGVsc2UKCQlzcC0+dHNfY3VyaSA9IGxwLT5scF9yZXBsYW5nLT5zbF9yZXBfZmlyc3RbZndvcmRbc3AtPnRzX2ZpZHhdXTsKCgkgICAgaWYgKHNwLT50c19jdXJpIDwgMCkKCSAgICB7CgkJc3AtPnRzX3N0YXRlID0gU1RBVEVfRklOQUw7CgkJYnJlYWs7CgkgICAgfQoKCSAgICBzcC0+dHNfc3RhdGUgPSBTVEFURV9SRVA7CgkgICAgLypGQUxMVEhST1VHSCovCgoJY2FzZSBTVEFURV9SRVA6CgkgICAgLyogVHJ5IG1hdGNoaW5nIHdpdGggUkVQIGl0ZW1zIGZyb20gdGhlIC5hZmYgZmlsZS4gIEZvciBlYWNoIG1hdGNoCgkgICAgICogcmVwbGFjZSB0aGUgY2hhcmFjdGVycyBhbmQgY2hlY2sgaWYgdGhlIHJlc3VsdGluZyB3b3JkIGlzCgkgICAgICogdmFsaWQuICovCgkgICAgcCA9IGZ3b3JkICsgc3AtPnRzX2ZpZHg7CgoJICAgIGlmIChzb3VuZGZvbGQpCgkJZ2FwID0gJnNsYW5nLT5zbF9yZXBzYWw7CgkgICAgZWxzZQoJCWdhcCA9ICZscC0+bHBfcmVwbGFuZy0+c2xfcmVwOwoJICAgIHdoaWxlIChzcC0+dHNfY3VyaSA8IGdhcC0+Z2FfbGVuKQoJICAgIHsKCQlmdHAgPSAoZnJvbXRvX1QgKilnYXAtPmdhX2RhdGEgKyBzcC0+dHNfY3VyaSsrOwoJCWlmICgqZnRwLT5mdF9mcm9tICE9ICpwKQoJCXsKCQkgICAgLyogcGFzdCBwb3NzaWJsZSBtYXRjaGluZyBlbnRyaWVzICovCgkJICAgIHNwLT50c19jdXJpID0gZ2FwLT5nYV9sZW47CgkJICAgIGJyZWFrOwoJCX0KCQlpZiAoU1RSTkNNUChmdHAtPmZ0X2Zyb20sIHAsIFNUUkxFTihmdHAtPmZ0X2Zyb20pKSA9PSAwCgkJCSYmIFRSWV9ERUVQRVIoc3UsIHN0YWNrLCBkZXB0aCwgU0NPUkVfUkVQKSkKCQl7CgkJICAgIGdvX2RlZXBlcihzdGFjaywgZGVwdGgsIFNDT1JFX1JFUCk7CiNpZmRlZiBERUJVR19UUklFV0FMSwoJCSAgICBzcHJpbnRmKGNoYW5nZW5hbWVbZGVwdGhdLCAiJS4qcy0lczogcmVwbGFjZSAlcyB3aXRoICVzIiwKCQkJICAgIHNwLT50c190d29yZGxlbiwgdHdvcmQsIGZ3b3JkICsgc3AtPnRzX2ZpZHgsCgkJCSAgICBmdHAtPmZ0X2Zyb20sIGZ0cC0+ZnRfdG8pOwojZW5kaWYKCQkgICAgLyogTmVlZCB0byB1bmRvIHRoaXMgYWZ0ZXJ3YXJkcy4gKi8KCQkgICAgc3AtPnRzX3N0YXRlID0gU1RBVEVfUkVQX1VORE87CgoJCSAgICAvKiBDaGFuZ2UgdGhlICJmcm9tIiB0byB0aGUgInRvIiBzdHJpbmcuICovCgkJICAgICsrZGVwdGg7CgkJICAgIGZsID0gU1RSTEVOKGZ0cC0+ZnRfZnJvbSk7CgkJICAgIHRsID0gU1RSTEVOKGZ0cC0+ZnRfdG8pOwoJCSAgICBpZiAoZmwgIT0gdGwpCgkJICAgIHsKCQkJbWNoX21lbW1vdmUocCArIHRsLCBwICsgZmwsIFNUUkxFTihwICsgZmwpICsgMSk7CgkJCXJlcGV4dHJhICs9IHRsIC0gZmw7CgkJICAgIH0KCQkgICAgbWNoX21lbW1vdmUocCwgZnRwLT5mdF90bywgdGwpOwoJCSAgICBzdGFja1tkZXB0aF0udHNfZmlkeHRyeSA9IHNwLT50c19maWR4ICsgdGw7CiNpZmRlZiBGRUFUX01CWVRFCgkJICAgIHN0YWNrW2RlcHRoXS50c190Y2hhcmxlbiA9IDA7CiNlbmRpZgoJCSAgICBicmVhazsKCQl9CgkgICAgfQoKCSAgICBpZiAoc3AtPnRzX2N1cmkgPj0gZ2FwLT5nYV9sZW4gJiYgc3AtPnRzX3N0YXRlID09IFNUQVRFX1JFUCkKCQkvKiBObyAobW9yZSkgbWF0Y2hlcy4gKi8KCQlzcC0+dHNfc3RhdGUgPSBTVEFURV9GSU5BTDsKCgkgICAgYnJlYWs7CgoJY2FzZSBTVEFURV9SRVBfVU5ETzoKCSAgICAvKiBVbmRvIGEgUkVQIHJlcGxhY2VtZW50IGFuZCBjb250aW51ZSB3aXRoIHRoZSBuZXh0IG9uZS4gKi8KCSAgICBpZiAoc291bmRmb2xkKQoJCWdhcCA9ICZzbGFuZy0+c2xfcmVwc2FsOwoJICAgIGVsc2UKCQlnYXAgPSAmbHAtPmxwX3JlcGxhbmctPnNsX3JlcDsKCSAgICBmdHAgPSAoZnJvbXRvX1QgKilnYXAtPmdhX2RhdGEgKyBzcC0+dHNfY3VyaSAtIDE7CgkgICAgZmwgPSBTVFJMRU4oZnRwLT5mdF9mcm9tKTsKCSAgICB0bCA9IFNUUkxFTihmdHAtPmZ0X3RvKTsKCSAgICBwID0gZndvcmQgKyBzcC0+dHNfZmlkeDsKCSAgICBpZiAoZmwgIT0gdGwpCgkgICAgewoJCW1jaF9tZW1tb3ZlKHAgKyBmbCwgcCArIHRsLCBTVFJMRU4ocCArIHRsKSArIDEpOwoJCXJlcGV4dHJhIC09IHRsIC0gZmw7CgkgICAgfQoJICAgIG1jaF9tZW1tb3ZlKHAsIGZ0cC0+ZnRfZnJvbSwgZmwpOwoJICAgIHNwLT50c19zdGF0ZSA9IFNUQVRFX1JFUDsKCSAgICBicmVhazsKCglkZWZhdWx0OgoJICAgIC8qIERpZCBhbGwgcG9zc2libGUgc3RhdGVzIGF0IHRoaXMgbGV2ZWwsIGdvIHVwIG9uZSBsZXZlbC4gKi8KCSAgICAtLWRlcHRoOwoKCSAgICBpZiAoZGVwdGggPj0gMCAmJiBzdGFja1tkZXB0aF0udHNfcHJlZml4ZGVwdGggPT0gUEZEX1BSRUZJWFRSRUUpCgkgICAgewoJCS8qIENvbnRpbnVlIGluIG9yIGdvIGJhY2sgdG8gdGhlIHByZWZpeCB0cmVlLiAqLwoJCWJ5dHMgPSBwYnl0czsKCQlpZHhzID0gcGlkeHM7CgkgICAgfQoKCSAgICAvKiBEb24ndCBjaGVjayBmb3IgQ1RSTC1DIHRvbyBvZnRlbiwgaXQgdGFrZXMgdGltZS4gKi8KCSAgICBpZiAoLS1icmVha2NoZWNrY291bnQgPT0gMCkKCSAgICB7CgkJdWlfYnJlYWtjaGVjaygpOwoJCWJyZWFrY2hlY2tjb3VudCA9IDEwMDA7CgkgICAgfQoJfQogICAgfQp9CgoKLyoKICogR28gb25lIGxldmVsIGRlZXBlciBpbiB0aGUgdHJlZS4KICovCiAgICBzdGF0aWMgdm9pZApnb19kZWVwZXIoc3RhY2ssIGRlcHRoLCBzY29yZV9hZGQpCiAgICB0cnlzdGF0ZV9UCSpzdGFjazsKICAgIGludAkJZGVwdGg7CiAgICBpbnQJCXNjb3JlX2FkZDsKewogICAgc3RhY2tbZGVwdGggKyAxXSA9IHN0YWNrW2RlcHRoXTsKICAgIHN0YWNrW2RlcHRoICsgMV0udHNfc3RhdGUgPSBTVEFURV9TVEFSVDsKICAgIHN0YWNrW2RlcHRoICsgMV0udHNfc2NvcmUgPSBzdGFja1tkZXB0aF0udHNfc2NvcmUgKyBzY29yZV9hZGQ7CiAgICBzdGFja1tkZXB0aCArIDFdLnRzX2N1cmkgPSAxOwkvKiBzdGFydCBqdXN0IGFmdGVyIGxlbmd0aCBieXRlICovCiAgICBzdGFja1tkZXB0aCArIDFdLnRzX2ZsYWdzID0gMDsKfQoKI2lmZGVmIEZFQVRfTUJZVEUKLyoKICogQ2FzZS1mb2xkaW5nIG1heSBjaGFuZ2UgdGhlIG51bWJlciBvZiBieXRlczogQ291bnQgbnIgb2YgY2hhcnMgaW4KICogZndvcmRbZmxlbl0gYW5kIHJldHVybiB0aGUgYnl0ZSBsZW5ndGggb2YgdGhhdCBtYW55IGNoYXJzIGluICJ3b3JkIi4KICovCiAgICBzdGF0aWMgaW50Cm5vZm9sZF9sZW4oZndvcmQsIGZsZW4sIHdvcmQpCiAgICBjaGFyX3UJKmZ3b3JkOwogICAgaW50CQlmbGVuOwogICAgY2hhcl91CSp3b3JkOwp7CiAgICBjaGFyX3UJKnA7CiAgICBpbnQJCWkgPSAwOwoKICAgIGZvciAocCA9IGZ3b3JkOyBwIDwgZndvcmQgKyBmbGVuOyBtYl9wdHJfYWR2KHApKQoJKytpOwogICAgZm9yIChwID0gd29yZDsgaSA+IDA7IG1iX3B0cl9hZHYocCkpCgktLWk7CiAgICByZXR1cm4gKGludCkocCAtIHdvcmQpOwp9CiNlbmRpZgoKLyoKICogImZ3b3JkIiBpcyBhIGdvb2Qgd29yZCB3aXRoIGNhc2UgZm9sZGVkLiAgRmluZCB0aGUgbWF0Y2hpbmcga2VlcC1jYXNlCiAqIHdvcmRzIGFuZCBwdXQgaXQgaW4gImt3b3JkIi4KICogVGhlb3JldGljYWxseSB0aGVyZSBjb3VsZCBiZSBzZXZlcmFsIGtlZXAtY2FzZSB3b3JkcyB0aGF0IHJlc3VsdCBpbiB0aGUKICogc2FtZSBjYXNlLWZvbGRlZCB3b3JkLCBidXQgd2Ugb25seSBmaW5kIG9uZS4uLgogKi8KICAgIHN0YXRpYyB2b2lkCmZpbmRfa2VlcGNhcF93b3JkKHNsYW5nLCBmd29yZCwga3dvcmQpCiAgICBzbGFuZ19UCSpzbGFuZzsKICAgIGNoYXJfdQkqZndvcmQ7CiAgICBjaGFyX3UJKmt3b3JkOwp7CiAgICBjaGFyX3UJdXdvcmRbTUFYV0xFTl07CQkvKiAiZndvcmQiIGluIHVwcGVyLWNhc2UgKi8KICAgIGludAkJZGVwdGg7CiAgICBpZHhfVAl0cnlpZHg7CgogICAgLyogVGhlIGZvbGxvd2luZyBhcnJheXMgYXJlIHVzZWQgYXQgZWFjaCBkZXB0aCBpbiB0aGUgdHJlZS4gKi8KICAgIGlkeF9UCWFycmlkeFtNQVhXTEVOXTsKICAgIGludAkJcm91bmRbTUFYV0xFTl07CiAgICBpbnQJCWZ3b3JkaWR4W01BWFdMRU5dOwogICAgaW50CQl1d29yZGlkeFtNQVhXTEVOXTsKICAgIGludAkJa3dvcmRsZW5bTUFYV0xFTl07CgogICAgaW50CQlmbGVuLCB1bGVuOwogICAgaW50CQlsOwogICAgaW50CQlsZW47CiAgICBpbnQJCWM7CiAgICBpZHhfVAlsbywgaGksIG07CiAgICBjaGFyX3UJKnA7CiAgICBjaGFyX3UJKmJ5dHMgPSBzbGFuZy0+c2xfa2J5dHM7ICAgIC8qIGFycmF5IHdpdGggYnl0ZXMgb2YgdGhlIHdvcmRzICovCiAgICBpZHhfVAkqaWR4cyA9IHNsYW5nLT5zbF9raWR4czsgICAgLyogYXJyYXkgd2l0aCBpbmRleGVzICovCgogICAgaWYgKGJ5dHMgPT0gTlVMTCkKICAgIHsKCS8qIGFycmF5IGlzIGVtcHR5OiAiY2Fubm90IGhhcHBlbiIgKi8KCSprd29yZCA9IE5VTDsKCXJldHVybjsKICAgIH0KCiAgICAvKiBNYWtlIGFuIGFsbC1jYXAgdmVyc2lvbiBvZiAiZndvcmQiLiAqLwogICAgYWxsY2FwX2NvcHkoZndvcmQsIHV3b3JkKTsKCiAgICAvKgogICAgICogRWFjaCBjaGFyYWN0ZXIgbmVlZHMgdG8gYmUgdHJpZWQgYm90aCBjYXNlLWZvbGRlZCBhbmQgdXBwZXItY2FzZS4KICAgICAqIEFsbCB0aGlzIGdldHMgdmVyeSBjb21wbGljYXRlZCBpZiB3ZSBrZWVwIGluIG1pbmQgdGhhdCBjaGFuZ2luZyBjYXNlCiAgICAgKiBtYXkgY2hhbmdlIHRoZSBieXRlIGxlbmd0aCBvZiBhIG11bHRpLWJ5dGUgY2hhcmFjdGVyLi4uCiAgICAgKi8KICAgIGRlcHRoID0gMDsKICAgIGFycmlkeFswXSA9IDA7CiAgICByb3VuZFswXSA9IDA7CiAgICBmd29yZGlkeFswXSA9IDA7CiAgICB1d29yZGlkeFswXSA9IDA7CiAgICBrd29yZGxlblswXSA9IDA7CiAgICB3aGlsZSAoZGVwdGggPj0gMCkKICAgIHsKCWlmIChmd29yZFtmd29yZGlkeFtkZXB0aF1dID09IE5VTCkKCXsKCSAgICAvKiBXZSBhcmUgYXQgdGhlIGVuZCBvZiAiZndvcmQiLiAgSWYgdGhlIHRyZWUgYWxsb3dzIGEgd29yZCB0byBlbmQKCSAgICAgKiBoZXJlIHdlIGhhdmUgZm91bmQgYSBtYXRjaC4gKi8KCSAgICBpZiAoYnl0c1thcnJpZHhbZGVwdGhdICsgMV0gPT0gMCkKCSAgICB7CgkJa3dvcmRba3dvcmRsZW5bZGVwdGhdXSA9IE5VTDsKCQlyZXR1cm47CgkgICAgfQoKCSAgICAvKiBrd29yZCBpcyBnZXR0aW5nIHRvbyBsb25nLCBjb250aW51ZSBvbmUgbGV2ZWwgdXAgKi8KCSAgICAtLWRlcHRoOwoJfQoJZWxzZSBpZiAoKytyb3VuZFtkZXB0aF0gPiAyKQoJewoJICAgIC8qIHRyaWVkIGJvdGggZm9sZC1jYXNlIGFuZCB1cHBlci1jYXNlIGNoYXJhY3RlciwgY29udGludWUgb25lCgkgICAgICogbGV2ZWwgdXAgKi8KCSAgICAtLWRlcHRoOwoJfQoJZWxzZQoJewoJICAgIC8qCgkgICAgICogcm91bmRbZGVwdGhdID09IDE6IFRyeSB1c2luZyB0aGUgZm9sZGVkLWNhc2UgY2hhcmFjdGVyLgoJICAgICAqIHJvdW5kW2RlcHRoXSA9PSAyOiBUcnkgdXNpbmcgdGhlIHVwcGVyLWNhc2UgY2hhcmFjdGVyLgoJICAgICAqLwojaWZkZWYgRkVBVF9NQllURQoJICAgIGlmIChoYXNfbWJ5dGUpCgkgICAgewoJCWZsZW4gPSBtYl9jcHRyMmxlbihmd29yZCArIGZ3b3JkaWR4W2RlcHRoXSk7CgkJdWxlbiA9IG1iX2NwdHIybGVuKHV3b3JkICsgdXdvcmRpZHhbZGVwdGhdKTsKCSAgICB9CgkgICAgZWxzZQojZW5kaWYKCQl1bGVuID0gZmxlbiA9IDE7CgkgICAgaWYgKHJvdW5kW2RlcHRoXSA9PSAxKQoJICAgIHsKCQlwID0gZndvcmQgKyBmd29yZGlkeFtkZXB0aF07CgkJbCA9IGZsZW47CgkgICAgfQoJICAgIGVsc2UKCSAgICB7CgkJcCA9IHV3b3JkICsgdXdvcmRpZHhbZGVwdGhdOwoJCWwgPSB1bGVuOwoJICAgIH0KCgkgICAgZm9yICh0cnlpZHggPSBhcnJpZHhbZGVwdGhdOyBsID4gMDsgLS1sKQoJICAgIHsKCQkvKiBQZXJmb3JtIGEgYmluYXJ5IHNlYXJjaCBpbiB0aGUgbGlzdCBvZiBhY2NlcHRlZCBieXRlcy4gKi8KCQlsZW4gPSBieXRzW3RyeWlkeCsrXTsKCQljID0gKnArKzsKCQlsbyA9IHRyeWlkeDsKCQloaSA9IHRyeWlkeCArIGxlbiAtIDE7CgkJd2hpbGUgKGxvIDwgaGkpCgkJewoJCSAgICBtID0gKGxvICsgaGkpIC8gMjsKCQkgICAgaWYgKGJ5dHNbbV0gPiBjKQoJCQloaSA9IG0gLSAxOwoJCSAgICBlbHNlIGlmIChieXRzW21dIDwgYykKCQkJbG8gPSBtICsgMTsKCQkgICAgZWxzZQoJCSAgICB7CgkJCWxvID0gaGkgPSBtOwoJCQlicmVhazsKCQkgICAgfQoJCX0KCgkJLyogU3RvcCBpZiB0aGVyZSBpcyBubyBtYXRjaGluZyBieXRlLiAqLwoJCWlmIChoaSA8IGxvIHx8IGJ5dHNbbG9dICE9IGMpCgkJICAgIGJyZWFrOwoKCQkvKiBDb250aW51ZSBhdCB0aGUgY2hpbGQgKGlmIHRoZXJlIGlzIG9uZSkuICovCgkJdHJ5aWR4ID0gaWR4c1tsb107CgkgICAgfQoKCSAgICBpZiAobCA9PSAwKQoJICAgIHsKCQkvKgoJCSAqIEZvdW5kIHRoZSBtYXRjaGluZyBjaGFyLiAgQ29weSBpdCB0byAia3dvcmQiIGFuZCBnbyBhCgkJICogbGV2ZWwgZGVlcGVyLgoJCSAqLwoJCWlmIChyb3VuZFtkZXB0aF0gPT0gMSkKCQl7CgkJICAgIFNUUk5DUFkoa3dvcmQgKyBrd29yZGxlbltkZXB0aF0sIGZ3b3JkICsgZndvcmRpZHhbZGVwdGhdLAoJCQkJCQkJCQlmbGVuKTsKCQkgICAga3dvcmRsZW5bZGVwdGggKyAxXSA9IGt3b3JkbGVuW2RlcHRoXSArIGZsZW47CgkJfQoJCWVsc2UKCQl7CgkJICAgIFNUUk5DUFkoa3dvcmQgKyBrd29yZGxlbltkZXB0aF0sIHV3b3JkICsgdXdvcmRpZHhbZGVwdGhdLAoJCQkJCQkJCQl1bGVuKTsKCQkgICAga3dvcmRsZW5bZGVwdGggKyAxXSA9IGt3b3JkbGVuW2RlcHRoXSArIHVsZW47CgkJfQoJCWZ3b3JkaWR4W2RlcHRoICsgMV0gPSBmd29yZGlkeFtkZXB0aF0gKyBmbGVuOwoJCXV3b3JkaWR4W2RlcHRoICsgMV0gPSB1d29yZGlkeFtkZXB0aF0gKyB1bGVuOwoKCQkrK2RlcHRoOwoJCWFycmlkeFtkZXB0aF0gPSB0cnlpZHg7CgkJcm91bmRbZGVwdGhdID0gMDsKCSAgICB9Cgl9CiAgICB9CgogICAgLyogRGlkbid0IGZpbmQgaXQ6ICJjYW5ub3QgaGFwcGVuIi4gKi8KICAgICprd29yZCA9IE5VTDsKfQoKLyoKICogQ29tcHV0ZSB0aGUgc291bmQtYS1saWtlIHNjb3JlIGZvciBzdWdnZXN0aW9ucyBpbiBzdS0+c3VfZ2EgYW5kIGFkZCB0aGVtIHRvCiAqIHN1LT5zdV9zZ2EuCiAqLwogICAgc3RhdGljIHZvaWQKc2NvcmVfY29tcF9zYWwoc3UpCiAgICBzdWdpbmZvX1QJKnN1Owp7CiAgICBsYW5ncF9UCSpscDsKICAgIGNoYXJfdQliYWRzb3VuZFtNQVhXTEVOXTsKICAgIGludAkJaTsKICAgIHN1Z2dlc3RfVCAgICpzdHA7CiAgICBzdWdnZXN0X1QgICAqc3N0cDsKICAgIGludAkJc2NvcmU7CiAgICBpbnQJCWxwaTsKCiAgICBpZiAoZ2FfZ3Jvdygmc3UtPnN1X3NnYSwgc3UtPnN1X2dhLmdhX2xlbikgPT0gRkFJTCkKCXJldHVybjsKCiAgICAvKglVc2UgdGhlIHNvdW5kLWZvbGRpbmcgb2YgdGhlIGZpcnN0IGxhbmd1YWdlIHRoYXQgc3VwcG9ydHMgaXQuICovCiAgICBmb3IgKGxwaSA9IDA7IGxwaSA8IGN1cmJ1Zi0+Yl9sYW5ncC5nYV9sZW47ICsrbHBpKQogICAgewoJbHAgPSBMQU5HUF9FTlRSWShjdXJidWYtPmJfbGFuZ3AsIGxwaSk7CglpZiAobHAtPmxwX3NsYW5nLT5zbF9zYWwuZ2FfbGVuID4gMCkKCXsKCSAgICAvKiBzb3VuZGZvbGQgdGhlIGJhZCB3b3JkICovCgkgICAgc3BlbGxfc291bmRmb2xkKGxwLT5scF9zbGFuZywgc3UtPnN1X2ZiYWR3b3JkLCBUUlVFLCBiYWRzb3VuZCk7CgoJICAgIGZvciAoaSA9IDA7IGkgPCBzdS0+c3VfZ2EuZ2FfbGVuOyArK2kpCgkgICAgewoJCXN0cCA9ICZTVUcoc3UtPnN1X2dhLCBpKTsKCgkJLyogQ2FzZS1mb2xkIHRoZSBzdWdnZXN0ZWQgd29yZCwgc291bmQtZm9sZCBpdCBhbmQgY29tcHV0ZSB0aGUKCQkgKiBzb3VuZC1hLWxpa2Ugc2NvcmUuICovCgkJc2NvcmUgPSBzdHBfc2FsX3Njb3JlKHN0cCwgc3UsIGxwLT5scF9zbGFuZywgYmFkc291bmQpOwoJCWlmIChzY29yZSA8IFNDT1JFX01BWE1BWCkKCQl7CgkJICAgIC8qIEFkZCB0aGUgc3VnZ2VzdGlvbi4gKi8KCQkgICAgc3N0cCA9ICZTVUcoc3UtPnN1X3NnYSwgc3UtPnN1X3NnYS5nYV9sZW4pOwoJCSAgICBzc3RwLT5zdF93b3JkID0gdmltX3N0cnNhdmUoc3RwLT5zdF93b3JkKTsKCQkgICAgaWYgKHNzdHAtPnN0X3dvcmQgIT0gTlVMTCkKCQkgICAgewoJCQlzc3RwLT5zdF93b3JkbGVuID0gc3RwLT5zdF93b3JkbGVuOwoJCQlzc3RwLT5zdF9zY29yZSA9IHNjb3JlOwoJCQlzc3RwLT5zdF9hbHRzY29yZSA9IDA7CgkJCXNzdHAtPnN0X29yZ2xlbiA9IHN0cC0+c3Rfb3JnbGVuOwoJCQkrK3N1LT5zdV9zZ2EuZ2FfbGVuOwoJCSAgICB9CgkJfQoJICAgIH0KCSAgICBicmVhazsKCX0KICAgIH0KfQoKLyoKICogQ29tYmluZSB0aGUgbGlzdCBvZiBzdWdnZXN0aW9ucyBpbiBzdS0+c3VfZ2EgYW5kIHN1LT5zdV9zZ2EuCiAqIFRoZXkgYXJlIGludHdpbmVkLgogKi8KICAgIHN0YXRpYyB2b2lkCnNjb3JlX2NvbWJpbmUoc3UpCiAgICBzdWdpbmZvX1QJKnN1Owp7CiAgICBpbnQJCWk7CiAgICBpbnQJCWo7CiAgICBnYXJyYXlfVAlnYTsKICAgIGdhcnJheV9UCSpnYXA7CiAgICBsYW5ncF9UCSpscDsKICAgIHN1Z2dlc3RfVAkqc3RwOwogICAgY2hhcl91CSpwOwogICAgY2hhcl91CWJhZHNvdW5kW01BWFdMRU5dOwogICAgaW50CQlyb3VuZDsKICAgIGludAkJbHBpOwogICAgc2xhbmdfVAkqc2xhbmcgPSBOVUxMOwoKICAgIC8qIEFkZCB0aGUgYWx0ZXJuYXRlIHNjb3JlIHRvIHN1X2dhLiAqLwogICAgZm9yIChscGkgPSAwOyBscGkgPCBjdXJidWYtPmJfbGFuZ3AuZ2FfbGVuOyArK2xwaSkKICAgIHsKCWxwID0gTEFOR1BfRU5UUlkoY3VyYnVmLT5iX2xhbmdwLCBscGkpOwoJaWYgKGxwLT5scF9zbGFuZy0+c2xfc2FsLmdhX2xlbiA+IDApCgl7CgkgICAgLyogc291bmRmb2xkIHRoZSBiYWQgd29yZCAqLwoJICAgIHNsYW5nID0gbHAtPmxwX3NsYW5nOwoJICAgIHNwZWxsX3NvdW5kZm9sZChzbGFuZywgc3UtPnN1X2ZiYWR3b3JkLCBUUlVFLCBiYWRzb3VuZCk7CgoJICAgIGZvciAoaSA9IDA7IGkgPCBzdS0+c3VfZ2EuZ2FfbGVuOyArK2kpCgkgICAgewoJCXN0cCA9ICZTVUcoc3UtPnN1X2dhLCBpKTsKCQlzdHAtPnN0X2FsdHNjb3JlID0gc3RwX3NhbF9zY29yZShzdHAsIHN1LCBzbGFuZywgYmFkc291bmQpOwoJCWlmIChzdHAtPnN0X2FsdHNjb3JlID09IFNDT1JFX01BWE1BWCkKCQkgICAgc3RwLT5zdF9zY29yZSA9IChzdHAtPnN0X3Njb3JlICogMyArIFNDT1JFX0JJRykgLyA0OwoJCWVsc2UKCQkgICAgc3RwLT5zdF9zY29yZSA9IChzdHAtPnN0X3Njb3JlICogMwoJCQkJCQkgICsgc3RwLT5zdF9hbHRzY29yZSkgLyA0OwoJCXN0cC0+c3Rfc2Fsc2NvcmUgPSBGQUxTRTsKCSAgICB9CgkgICAgYnJlYWs7Cgl9CiAgICB9CgogICAgaWYgKHNsYW5nID09IE5VTEwpCS8qIGp1c3QgaW4gY2FzZSAqLwoJcmV0dXJuOwoKICAgIC8qIEFkZCB0aGUgYWx0ZXJuYXRlIHNjb3JlIHRvIHN1X3NnYS4gKi8KICAgIGZvciAoaSA9IDA7IGkgPCBzdS0+c3Vfc2dhLmdhX2xlbjsgKytpKQogICAgewoJc3RwID0gJlNVRyhzdS0+c3Vfc2dhLCBpKTsKCXN0cC0+c3RfYWx0c2NvcmUgPSBzcGVsbF9lZGl0X3Njb3JlKHNsYW5nLAoJCQkJCQlzdS0+c3VfYmFkd29yZCwgc3RwLT5zdF93b3JkKTsKCWlmIChzdHAtPnN0X3Njb3JlID09IFNDT1JFX01BWE1BWCkKCSAgICBzdHAtPnN0X3Njb3JlID0gKFNDT1JFX0JJRyAqIDcgKyBzdHAtPnN0X2FsdHNjb3JlKSAvIDg7CgllbHNlCgkgICAgc3RwLT5zdF9zY29yZSA9IChzdHAtPnN0X3Njb3JlICogNyArIHN0cC0+c3RfYWx0c2NvcmUpIC8gODsKCXN0cC0+c3Rfc2Fsc2NvcmUgPSBUUlVFOwogICAgfQoKICAgIC8qIFJlbW92ZSBiYWQgc3VnZ2VzdGlvbnMsIHNvcnQgdGhlIHN1Z2dlc3Rpb25zIGFuZCB0cnVuY2F0ZSBhdCAibWF4Y291bnQiCiAgICAgKiBmb3IgYm90aCBsaXN0cy4gKi8KICAgIGNoZWNrX3N1Z2dlc3Rpb25zKHN1LCAmc3UtPnN1X2dhKTsKICAgICh2b2lkKWNsZWFudXBfc3VnZ2VzdGlvbnMoJnN1LT5zdV9nYSwgc3UtPnN1X21heHNjb3JlLCBzdS0+c3VfbWF4Y291bnQpOwogICAgY2hlY2tfc3VnZ2VzdGlvbnMoc3UsICZzdS0+c3Vfc2dhKTsKICAgICh2b2lkKWNsZWFudXBfc3VnZ2VzdGlvbnMoJnN1LT5zdV9zZ2EsIHN1LT5zdV9tYXhzY29yZSwgc3UtPnN1X21heGNvdW50KTsKCiAgICBnYV9pbml0MigmZ2EsIChpbnQpc2l6ZW9mKHN1Z2luZm9fVCksIDEpOwogICAgaWYgKGdhX2dyb3coJmdhLCBzdS0+c3VfZ2EuZ2FfbGVuICsgc3UtPnN1X3NnYS5nYV9sZW4pID09IEZBSUwpCglyZXR1cm47CgogICAgc3RwID0gJlNVRyhnYSwgMCk7CiAgICBmb3IgKGkgPSAwOyBpIDwgc3UtPnN1X2dhLmdhX2xlbiB8fCBpIDwgc3UtPnN1X3NnYS5nYV9sZW47ICsraSkKICAgIHsKCS8qIHJvdW5kIDE6IGdldCBhIHN1Z2dlc3Rpb24gZnJvbSBzdV9nYQoJICogcm91bmQgMjogZ2V0IGEgc3VnZ2VzdGlvbiBmcm9tIHN1X3NnYSAqLwoJZm9yIChyb3VuZCA9IDE7IHJvdW5kIDw9IDI7ICsrcm91bmQpCgl7CgkgICAgZ2FwID0gcm91bmQgPT0gMSA/ICZzdS0+c3VfZ2EgOiAmc3UtPnN1X3NnYTsKCSAgICBpZiAoaSA8IGdhcC0+Z2FfbGVuKQoJICAgIHsKCQkvKiBEb24ndCBhZGQgYSB3b3JkIGlmIGl0J3MgYWxyZWFkeSB0aGVyZS4gKi8KCQlwID0gU1VHKCpnYXAsIGkpLnN0X3dvcmQ7CgkJZm9yIChqID0gMDsgaiA8IGdhLmdhX2xlbjsgKytqKQoJCSAgICBpZiAoU1RSQ01QKHN0cFtqXS5zdF93b3JkLCBwKSA9PSAwKQoJCQlicmVhazsKCQlpZiAoaiA9PSBnYS5nYV9sZW4pCgkJICAgIHN0cFtnYS5nYV9sZW4rK10gPSBTVUcoKmdhcCwgaSk7CgkJZWxzZQoJCSAgICB2aW1fZnJlZShwKTsKCSAgICB9Cgl9CiAgICB9CgogICAgZ2FfY2xlYXIoJnN1LT5zdV9nYSk7CiAgICBnYV9jbGVhcigmc3UtPnN1X3NnYSk7CgogICAgLyogVHJ1bmNhdGUgdGhlIGxpc3QgdG8gdGhlIG51bWJlciBvZiBzdWdnZXN0aW9ucyB0aGF0IHdpbGwgYmUgZGlzcGxheWVkLiAqLwogICAgaWYgKGdhLmdhX2xlbiA+IHN1LT5zdV9tYXhjb3VudCkKICAgIHsKCWZvciAoaSA9IHN1LT5zdV9tYXhjb3VudDsgaSA8IGdhLmdhX2xlbjsgKytpKQoJICAgIHZpbV9mcmVlKHN0cFtpXS5zdF93b3JkKTsKCWdhLmdhX2xlbiA9IHN1LT5zdV9tYXhjb3VudDsKICAgIH0KCiAgICBzdS0+c3VfZ2EgPSBnYTsKfQoKLyoKICogRm9yIHRoZSBnb29kd29yZCBpbiAic3RwIiBjb21wdXRlIHRoZSBzb3VuZGFsaWtlIHNjb3JlIGNvbXBhcmVkIHRvIHRoZQogKiBiYWR3b3JkLgogKi8KICAgIHN0YXRpYyBpbnQKc3RwX3NhbF9zY29yZShzdHAsIHN1LCBzbGFuZywgYmFkc291bmQpCiAgICBzdWdnZXN0X1QJKnN0cDsKICAgIHN1Z2luZm9fVAkqc3U7CiAgICBzbGFuZ19UCSpzbGFuZzsKICAgIGNoYXJfdQkqYmFkc291bmQ7CS8qIHNvdW5kLWZvbGRlZCBiYWR3b3JkICovCnsKICAgIGNoYXJfdQkqcDsKICAgIGNoYXJfdQkqcGJhZDsKICAgIGNoYXJfdQkqcGdvb2Q7CiAgICBjaGFyX3UJYmFkc291bmQyW01BWFdMRU5dOwogICAgY2hhcl91CWZ3b3JkW01BWFdMRU5dOwogICAgY2hhcl91CWdvb2Rzb3VuZFtNQVhXTEVOXTsKICAgIGNoYXJfdQlnb29kd29yZFtNQVhXTEVOXTsKICAgIGludAkJbGVuZGlmZjsKCiAgICBsZW5kaWZmID0gKGludCkoc3UtPnN1X2JhZGxlbiAtIHN0cC0+c3Rfb3JnbGVuKTsKICAgIGlmIChsZW5kaWZmID49IDApCglwYmFkID0gYmFkc291bmQ7CiAgICBlbHNlCiAgICB7CgkvKiBzb3VuZGZvbGQgdGhlIGJhZCB3b3JkIHdpdGggbW9yZSBjaGFyYWN0ZXJzIGZvbGxvd2luZyAqLwoJKHZvaWQpc3BlbGxfY2FzZWZvbGQoc3UtPnN1X2JhZHB0ciwgc3RwLT5zdF9vcmdsZW4sIGZ3b3JkLCBNQVhXTEVOKTsKCgkvKiBXaGVuIGpvaW5pbmcgdHdvIHdvcmRzIHRoZSBzb3VuZCBvZnRlbiBjaGFuZ2VzIGEgbG90LiAgRS5nLiwgInQgaGUiCgkgKiBzb3VuZHMgbGlrZSAidCBoIiB3aGlsZSAidGhlIiBzb3VuZHMgbGlrZSAiQCIuICBBdm9pZCB0aGF0IGJ5CgkgKiByZW1vdmluZyB0aGUgc3BhY2UuICBEb24ndCBkbyBpdCB3aGVuIHRoZSBnb29kIHdvcmQgYWxzbyBjb250YWlucyBhCgkgKiBzcGFjZS4gKi8KCWlmICh2aW1faXN3aGl0ZShzdS0+c3VfYmFkcHRyW3N1LT5zdV9iYWRsZW5dKQoJCQkJCSAmJiAqc2tpcHRvd2hpdGUoc3RwLT5zdF93b3JkKSA9PSBOVUwpCgkgICAgZm9yIChwID0gZndvcmQ7ICoocCA9IHNraXB0b3doaXRlKHApKSAhPSBOVUw7ICkKCQltY2hfbWVtbW92ZShwLCBwICsgMSwgU1RSTEVOKHApKTsKCglzcGVsbF9zb3VuZGZvbGQoc2xhbmcsIGZ3b3JkLCBUUlVFLCBiYWRzb3VuZDIpOwoJcGJhZCA9IGJhZHNvdW5kMjsKICAgIH0KCiAgICBpZiAobGVuZGlmZiA+IDApCiAgICB7CgkvKiBBZGQgcGFydCBvZiB0aGUgYmFkIHdvcmQgdG8gdGhlIGdvb2Qgd29yZCwgc28gdGhhdCB3ZSBzb3VuZGZvbGQKCSAqIHdoYXQgcmVwbGFjZXMgdGhlIGJhZCB3b3JkLiAqLwoJU1RSQ1BZKGdvb2R3b3JkLCBzdHAtPnN0X3dvcmQpOwoJdmltX3N0cm5jcHkoZ29vZHdvcmQgKyBzdHAtPnN0X3dvcmRsZW4sCgkJCSAgICBzdS0+c3VfYmFkcHRyICsgc3UtPnN1X2JhZGxlbiAtIGxlbmRpZmYsIGxlbmRpZmYpOwoJcGdvb2QgPSBnb29kd29yZDsKICAgIH0KICAgIGVsc2UKCXBnb29kID0gc3RwLT5zdF93b3JkOwoKICAgIC8qIFNvdW5kLWZvbGQgdGhlIHdvcmQgYW5kIGNvbXB1dGUgdGhlIHNjb3JlIGZvciB0aGUgZGlmZmVyZW5jZS4gKi8KICAgIHNwZWxsX3NvdW5kZm9sZChzbGFuZywgcGdvb2QsIEZBTFNFLCBnb29kc291bmQpOwoKICAgIHJldHVybiBzb3VuZGFsaWtlX3Njb3JlKGdvb2Rzb3VuZCwgcGJhZCk7Cn0KCi8qIHN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIHNvdW5kZm9sZGVkIHdvcmRzIHRoYXQgYWRkX3NvdW5kX3N1Z2dlc3QoKSBoYXMKICogaGFuZGxlZCBhbHJlYWR5LiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBzaG9ydAlzZnRfc2NvcmU7CS8qIGxvd2VzdCBzY29yZSB1c2VkICovCiAgICBjaGFyX3UJc2Z0X3dvcmRbMV07ICAgIC8qIHNvdW5kZm9sZGVkIHdvcmQsIGFjdHVhbGx5IGxvbmdlciAqLwp9IHNmdHdvcmRfVDsKCnN0YXRpYyBzZnR3b3JkX1QgZHVtc2Z0OwojZGVmaW5lIEhJS0VZMlNGVChwKSAgKChzZnR3b3JkX1QgKikocCAtIChkdW1zZnQuc2Z0X3dvcmQgLSAoY2hhcl91ICopJmR1bXNmdCkpKQojZGVmaW5lIEhJMlNGVChoaSkgICAgIEhJS0VZMlNGVCgoaGkpLT5oaV9rZXkpCgovKgogKiBQcmVwYXJlIGZvciBjYWxsaW5nIHN1Z2dlc3RfdHJ5X3NvdW5kYWxpa2UoKS4KICovCiAgICBzdGF0aWMgdm9pZApzdWdnZXN0X3RyeV9zb3VuZGFsaWtlX3ByZXAoKQp7CiAgICBsYW5ncF9UCSpscDsKICAgIGludAkJbHBpOwogICAgc2xhbmdfVAkqc2xhbmc7CgogICAgLyogRG8gdGhpcyBmb3IgYWxsIGxhbmd1YWdlcyB0aGF0IHN1cHBvcnQgc291bmQgZm9sZGluZyBhbmQgZm9yIHdoaWNoIGEKICAgICAqIC5zdWcgZmlsZSBoYXMgYmVlbiBsb2FkZWQuICovCiAgICBmb3IgKGxwaSA9IDA7IGxwaSA8IGN1cmJ1Zi0+Yl9sYW5ncC5nYV9sZW47ICsrbHBpKQogICAgewoJbHAgPSBMQU5HUF9FTlRSWShjdXJidWYtPmJfbGFuZ3AsIGxwaSk7CglzbGFuZyA9IGxwLT5scF9zbGFuZzsKCWlmIChzbGFuZy0+c2xfc2FsLmdhX2xlbiA+IDAgJiYgc2xhbmctPnNsX3NieXRzICE9IE5VTEwpCgkgICAgLyogcHJlcGFyZSB0aGUgaGFzaHRhYmxlIHVzZWQgYnkgYWRkX3NvdW5kX3N1Z2dlc3QoKSAqLwoJICAgIGhhc2hfaW5pdCgmc2xhbmctPnNsX3NvdW5kZG9uZSk7CiAgICB9Cn0KCi8qCiAqIEZpbmQgc3VnZ2VzdGlvbnMgYnkgY29tcGFyaW5nIHRoZSB3b3JkIGluIGEgc291bmQtYS1saWtlIGZvcm0uCiAqIE5vdGU6IFRoaXMgZG9lc24ndCBzdXBwb3J0IHBvc3Rwb25lZCBwcmVmaXhlcy4KICovCiAgICBzdGF0aWMgdm9pZApzdWdnZXN0X3RyeV9zb3VuZGFsaWtlKHN1KQogICAgc3VnaW5mb19UCSpzdTsKewogICAgY2hhcl91CXNhbHdvcmRbTUFYV0xFTl07CiAgICBsYW5ncF9UCSpscDsKICAgIGludAkJbHBpOwogICAgc2xhbmdfVAkqc2xhbmc7CgogICAgLyogRG8gdGhpcyBmb3IgYWxsIGxhbmd1YWdlcyB0aGF0IHN1cHBvcnQgc291bmQgZm9sZGluZyBhbmQgZm9yIHdoaWNoIGEKICAgICAqIC5zdWcgZmlsZSBoYXMgYmVlbiBsb2FkZWQuICovCiAgICBmb3IgKGxwaSA9IDA7IGxwaSA8IGN1cmJ1Zi0+Yl9sYW5ncC5nYV9sZW47ICsrbHBpKQogICAgewoJbHAgPSBMQU5HUF9FTlRSWShjdXJidWYtPmJfbGFuZ3AsIGxwaSk7CglzbGFuZyA9IGxwLT5scF9zbGFuZzsKCWlmIChzbGFuZy0+c2xfc2FsLmdhX2xlbiA+IDAgJiYgc2xhbmctPnNsX3NieXRzICE9IE5VTEwpCgl7CgkgICAgLyogc291bmRmb2xkIHRoZSBiYWQgd29yZCAqLwoJICAgIHNwZWxsX3NvdW5kZm9sZChzbGFuZywgc3UtPnN1X2ZiYWR3b3JkLCBUUlVFLCBzYWx3b3JkKTsKCgkgICAgLyogdHJ5IGFsbCBraW5kcyBvZiBpbnNlcnRzL2RlbGV0ZXMvc3dhcHMvZXRjLiAqLwoJICAgIC8qIFRPRE86IGFsc28gc291bmRmb2xkIHRoZSBuZXh0IHdvcmRzLCBzbyB0aGF0IHdlIGNhbiB0cnkgam9pbmluZwoJICAgICAqIGFuZCBzcGxpdHRpbmcgKi8KCSAgICBzdWdnZXN0X3RyaWVfd2FsayhzdSwgbHAsIHNhbHdvcmQsIFRSVUUpOwoJfQogICAgfQp9CgovKgogKiBGaW5pc2ggdXAgYWZ0ZXIgY2FsbGluZyBzdWdnZXN0X3RyeV9zb3VuZGFsaWtlKCkuCiAqLwogICAgc3RhdGljIHZvaWQKc3VnZ2VzdF90cnlfc291bmRhbGlrZV9maW5pc2goKQp7CiAgICBsYW5ncF9UCSpscDsKICAgIGludAkJbHBpOwogICAgc2xhbmdfVAkqc2xhbmc7CiAgICBpbnQJCXRvZG87CiAgICBoYXNoaXRlbV9UCSpoaTsKCiAgICAvKiBEbyB0aGlzIGZvciBhbGwgbGFuZ3VhZ2VzIHRoYXQgc3VwcG9ydCBzb3VuZCBmb2xkaW5nIGFuZCBmb3Igd2hpY2ggYQogICAgICogLnN1ZyBmaWxlIGhhcyBiZWVuIGxvYWRlZC4gKi8KICAgIGZvciAobHBpID0gMDsgbHBpIDwgY3VyYnVmLT5iX2xhbmdwLmdhX2xlbjsgKytscGkpCiAgICB7CglscCA9IExBTkdQX0VOVFJZKGN1cmJ1Zi0+Yl9sYW5ncCwgbHBpKTsKCXNsYW5nID0gbHAtPmxwX3NsYW5nOwoJaWYgKHNsYW5nLT5zbF9zYWwuZ2FfbGVuID4gMCAmJiBzbGFuZy0+c2xfc2J5dHMgIT0gTlVMTCkKCXsKCSAgICAvKiBGcmVlIHRoZSBpbmZvIGFib3V0IGhhbmRsZWQgd29yZHMuICovCgkgICAgdG9kbyA9IHNsYW5nLT5zbF9zb3VuZGRvbmUuaHRfdXNlZDsKCSAgICBmb3IgKGhpID0gc2xhbmctPnNsX3NvdW5kZG9uZS5odF9hcnJheTsgdG9kbyA+IDA7ICsraGkpCgkJaWYgKCFIQVNISVRFTV9FTVBUWShoaSkpCgkJewoJCSAgICB2aW1fZnJlZShISTJTRlQoaGkpKTsKCQkgICAgLS10b2RvOwoJCX0KCSAgICBoYXNoX2NsZWFyKCZzbGFuZy0+c2xfc291bmRkb25lKTsKCX0KICAgIH0KfQoKLyoKICogQSBtYXRjaCB3aXRoIGEgc291bmRmb2xkZWQgd29yZCBpcyBmb3VuZC4gIEFkZCB0aGUgZ29vZCB3b3JkKHMpIHRoYXQKICogcHJvZHVjZSB0aGlzIHNvdW5kZm9sZGVkIHdvcmQuCiAqLwogICAgc3RhdGljIHZvaWQKYWRkX3NvdW5kX3N1Z2dlc3Qoc3UsIGdvb2R3b3JkLCBzY29yZSwgbHApCiAgICBzdWdpbmZvX1QJKnN1OwogICAgY2hhcl91CSpnb29kd29yZDsKICAgIGludAkJc2NvcmU7CQkvKiBzb3VuZGZvbGQgc2NvcmUgICovCiAgICBsYW5ncF9UCSpscDsKewogICAgc2xhbmdfVAkqc2xhbmcgPSBscC0+bHBfc2xhbmc7CS8qIGxhbmd1YWdlIGZvciBzb3VuZCBmb2xkaW5nICovCiAgICBpbnQJCXNmd29yZG5yOwogICAgY2hhcl91CSpucmxpbmU7CiAgICBpbnQJCW9yZ25yOwogICAgY2hhcl91CXRoZXdvcmRbTUFYV0xFTl07CiAgICBpbnQJCWk7CiAgICBpbnQJCXdsZW47CiAgICBjaGFyX3UJKmJ5dHM7CiAgICBpZHhfVAkqaWR4czsKICAgIGludAkJbjsKICAgIGludAkJd29yZGNvdW50OwogICAgaW50CQl3YzsKICAgIGludAkJZ29vZHNjb3JlOwogICAgaGFzaF9UCWhhc2g7CiAgICBoYXNoaXRlbV9UICAqaGk7CiAgICBzZnR3b3JkX1QJKnNmdDsKICAgIGludAkJYmMsIGdjOwogICAgaW50CQlsaW1pdDsKCiAgICAvKgogICAgICogSXQncyB2ZXJ5IHdlbGwgcG9zc2libGUgdGhhdCB0aGUgc2FtZSBzb3VuZGZvbGQgd29yZCBpcyBmb3VuZCBzZXZlcmFsCiAgICAgKiB0aW1lcyB3aXRoIGRpZmZlcmVudCBzY29yZXMuICBTaW5jZSB0aGUgZm9sbG93aW5nIGlzIHF1aXRlIHNsb3cgb25seSBkbwogICAgICogdGhlIHdvcmRzIHRoYXQgaGF2ZSBhIGJldHRlciBzY29yZSB0aGFuIGJlZm9yZS4gIFVzZSBhIGhhc2h0YWJsZSB0bwogICAgICogcmVtZW1iZXIgdGhlIHdvcmRzIHRoYXQgaGF2ZSBiZWVuIGRvbmUuCiAgICAgKi8KICAgIGhhc2ggPSBoYXNoX2hhc2goZ29vZHdvcmQpOwogICAgaGkgPSBoYXNoX2xvb2t1cCgmc2xhbmctPnNsX3NvdW5kZG9uZSwgZ29vZHdvcmQsIGhhc2gpOwogICAgaWYgKEhBU0hJVEVNX0VNUFRZKGhpKSkKICAgIHsKCXNmdCA9IChzZnR3b3JkX1QgKilhbGxvYyhzaXplb2Yoc2Z0d29yZF9UKSArIFNUUkxFTihnb29kd29yZCkpOwoJaWYgKHNmdCAhPSBOVUxMKQoJewoJICAgIHNmdC0+c2Z0X3Njb3JlID0gc2NvcmU7CgkgICAgU1RSQ1BZKHNmdC0+c2Z0X3dvcmQsIGdvb2R3b3JkKTsKCSAgICBoYXNoX2FkZF9pdGVtKCZzbGFuZy0+c2xfc291bmRkb25lLCBoaSwgc2Z0LT5zZnRfd29yZCwgaGFzaCk7Cgl9CiAgICB9CiAgICBlbHNlCiAgICB7CglzZnQgPSBISTJTRlQoaGkpOwoJaWYgKHNjb3JlID49IHNmdC0+c2Z0X3Njb3JlKQoJICAgIHJldHVybjsKCXNmdC0+c2Z0X3Njb3JlID0gc2NvcmU7CiAgICB9CgogICAgLyoKICAgICAqIEZpbmQgdGhlIHdvcmQgbnIgaW4gdGhlIHNvdW5kZm9sZCB0cmVlLgogICAgICovCiAgICBzZndvcmRuciA9IHNvdW5kZm9sZF9maW5kKHNsYW5nLCBnb29kd29yZCk7CiAgICBpZiAoc2Z3b3JkbnIgPCAwKQogICAgewoJRU1TRzIoXyhlX2ludGVybjIpLCAiYWRkX3NvdW5kX3N1Z2dlc3QoKSIpOwoJcmV0dXJuOwogICAgfQoKICAgIC8qCiAgICAgKiBnbyBvdmVyIHRoZSBsaXN0IG9mIGdvb2Qgd29yZHMgdGhhdCBwcm9kdWNlIHRoaXMgc291bmRmb2xkIHdvcmQKICAgICAqLwogICAgbnJsaW5lID0gbWxfZ2V0X2J1ZihzbGFuZy0+c2xfc3VnYnVmLCAobGluZW5yX1QpKHNmd29yZG5yICsgMSksIEZBTFNFKTsKICAgIG9yZ25yID0gMDsKICAgIHdoaWxlICgqbnJsaW5lICE9IE5VTCkKICAgIHsKCS8qIFRoZSB3b3JkbnIgd2FzIHN0b3JlZCBpbiBhIG1pbmltYWwgbnIgb2YgYnl0ZXMgYXMgYW4gb2Zmc2V0IHRvIHRoZQoJICogcHJldmlvdXMgd29yZG5yLiAqLwoJb3JnbnIgKz0gYnl0ZXMyb2Zmc2V0KCZucmxpbmUpOwoKCWJ5dHMgPSBzbGFuZy0+c2xfZmJ5dHM7CglpZHhzID0gc2xhbmctPnNsX2ZpZHhzOwoKCS8qIExvb2t1cCB0aGUgd29yZCAib3JnbnIiIG9uZSBvZiB0aGUgdHdvIHRyaWVzLiAqLwoJbiA9IDA7Cgl3bGVuID0gMDsKCXdvcmRjb3VudCA9IDA7Cglmb3IgKDs7KQoJewoJICAgIGkgPSAxOwoJICAgIGlmICh3b3JkY291bnQgPT0gb3JnbnIgJiYgYnl0c1tuICsgMV0gPT0gTlVMKQoJCWJyZWFrOwkvKiBmb3VuZCBlbmQgb2Ygd29yZCAqLwoKCSAgICBpZiAoYnl0c1tuICsgMV0gPT0gTlVMKQoJCSsrd29yZGNvdW50OwoKCSAgICAvKiBza2lwIG92ZXIgdGhlIE5VTCBieXRlcyAqLwoJICAgIGZvciAoIDsgYnl0c1tuICsgaV0gPT0gTlVMOyArK2kpCgkJaWYgKGkgPiBieXRzW25dKQkvKiBzYWZldHkgY2hlY2sgKi8KCQl7CgkJICAgIFNUUkNQWSh0aGV3b3JkICsgd2xlbiwgIkJBRCIpOwoJCSAgICBnb3RvIGJhZHdvcmQ7CgkJfQoKCSAgICAvKiBPbmUgb2YgdGhlIHNpYmxpbmdzIG11c3QgaGF2ZSB0aGUgd29yZC4gKi8KCSAgICBmb3IgKCA7IGkgPCBieXRzW25dOyArK2kpCgkgICAgewoJCXdjID0gaWR4c1tpZHhzW24gKyBpXV07CS8qIG5yIG9mIHdvcmRzIHVuZGVyIHRoaXMgYnl0ZSAqLwoJCWlmICh3b3JkY291bnQgKyB3YyA+IG9yZ25yKQoJCSAgICBicmVhazsKCQl3b3JkY291bnQgKz0gd2M7CgkgICAgfQoKCSAgICB0aGV3b3JkW3dsZW4rK10gPSBieXRzW24gKyBpXTsKCSAgICBuID0gaWR4c1tuICsgaV07Cgl9CmJhZHdvcmQ6Cgl0aGV3b3JkW3dsZW5dID0gTlVMOwoKCS8qIEdvIG92ZXIgdGhlIHBvc3NpYmxlIGZsYWdzIGFuZCByZWdpb25zLiAqLwoJZm9yICg7IGkgPD0gYnl0c1tuXSAmJiBieXRzW24gKyBpXSA9PSBOVUw7ICsraSkKCXsKCSAgICBjaGFyX3UJY3dvcmRbTUFYV0xFTl07CgkgICAgY2hhcl91CSpwOwoJICAgIGludAkJZmxhZ3MgPSAoaW50KWlkeHNbbiArIGldOwoKCSAgICAvKiBTa2lwIHdvcmRzIHdpdGggdGhlIE5PU1VHR0VTVCBmbGFnICovCgkgICAgaWYgKGZsYWdzICYgV0ZfTk9TVUdHRVNUKQoJCWNvbnRpbnVlOwoKCSAgICBpZiAoZmxhZ3MgJiBXRl9LRUVQQ0FQKQoJICAgIHsKCQkvKiBNdXN0IGZpbmQgdGhlIHdvcmQgaW4gdGhlIGtlZXAtY2FzZSB0cmVlLiAqLwoJCWZpbmRfa2VlcGNhcF93b3JkKHNsYW5nLCB0aGV3b3JkLCBjd29yZCk7CgkJcCA9IGN3b3JkOwoJICAgIH0KCSAgICBlbHNlCgkgICAgewoJCWZsYWdzIHw9IHN1LT5zdV9iYWRmbGFnczsKCQlpZiAoKGZsYWdzICYgV0ZfQ0FQTUFTSykgIT0gMCkKCQl7CgkJICAgIC8qIE5lZWQgdG8gZml4IGNhc2UgYWNjb3JkaW5nIHRvICJmbGFncyIuICovCgkJICAgIG1ha2VfY2FzZV93b3JkKHRoZXdvcmQsIGN3b3JkLCBmbGFncyk7CgkJICAgIHAgPSBjd29yZDsKCQl9CgkJZWxzZQoJCSAgICBwID0gdGhld29yZDsKCSAgICB9CgoJICAgIC8qIEFkZCB0aGUgc3VnZ2VzdGlvbi4gKi8KCSAgICBpZiAoc3BzX2ZsYWdzICYgU1BTX0RPVUJMRSkKCSAgICB7CgkJLyogQWRkIHRoZSBzdWdnZXN0aW9uIGlmIHRoZSBzY29yZSBpc24ndCB0b28gYmFkLiAqLwoJCWlmIChzY29yZSA8PSBzdS0+c3VfbWF4c2NvcmUpCgkJICAgIGFkZF9zdWdnZXN0aW9uKHN1LCAmc3UtPnN1X3NnYSwgcCwgc3UtPnN1X2JhZGxlbiwKCQkJCQkgICAgICAgc2NvcmUsIDAsIEZBTFNFLCBzbGFuZywgRkFMU0UpOwoJICAgIH0KCSAgICBlbHNlCgkgICAgewoJCS8qIEFkZCBhIHBlbmFsdHkgZm9yIHdvcmRzIGluIGFub3RoZXIgcmVnaW9uLiAqLwoJCWlmICgoZmxhZ3MgJiBXRl9SRUdJT04pCgkJCSAgICAmJiAoKCh1bnNpZ25lZClmbGFncyA+PiAxNikgJiBscC0+bHBfcmVnaW9uKSA9PSAwKQoJCSAgICBnb29kc2NvcmUgPSBTQ09SRV9SRUdJT047CgkJZWxzZQoJCSAgICBnb29kc2NvcmUgPSAwOwoKCQkvKiBBZGQgYSBzbWFsbCBwZW5hbHR5IGZvciBjaGFuZ2luZyB0aGUgZmlyc3QgbGV0dGVyIGZyb20KCQkgKiBsb3dlciB0byB1cHBlciBjYXNlLiAgSGVscHMgZm9yICJ0YXRoIiAtPiAiS2F0aCIsIHdoaWNoIGlzCgkJICogbGVzcyBjb21tb24gdGhhdG4gInRhdGgiIC0+ICJwYXRoIi4gIERvbid0IGRvIGl0IHdoZW4gdGhlCgkJICogbGV0dGVyIGlzIHRoZSBzYW1lLCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY291bnRlZC4gKi8KCQlnYyA9IFBUUjJDSEFSKHApOwoJCWlmIChTUEVMTF9JU1VQUEVSKGdjKSkKCQl7CgkJICAgIGJjID0gUFRSMkNIQVIoc3UtPnN1X2JhZHdvcmQpOwoJCSAgICBpZiAoIVNQRUxMX0lTVVBQRVIoYmMpCgkJCQkgICAgICAmJiBTUEVMTF9UT0ZPTEQoYmMpICE9IFNQRUxMX1RPRk9MRChnYykpCgkJCWdvb2RzY29yZSArPSBTQ09SRV9JQ0FTRSAvIDI7CgkJfQoKCQkvKiBDb21wdXRlIHRoZSBzY29yZSBmb3IgdGhlIGdvb2Qgd29yZC4gIFRoaXMgb25seSBkb2VzIGxldHRlcgoJCSAqIGluc2VydC9kZWxldGUvc3dhcC9yZXBsYWNlLiAgUkVQIGl0ZW1zIGFyZSBub3QgY29uc2lkZXJlZCwKCQkgKiB3aGljaCBtYXkgbWFrZSB0aGUgc2NvcmUgYSBiaXQgaGlnaGVyLgoJCSAqIFVzZSBhIGxpbWl0IGZvciB0aGUgc2NvcmUgdG8gbWFrZSBpdCB3b3JrIGZhc3Rlci4gIFVzZQoJCSAqIE1BWFNDT1JFKCksIGJlY2F1c2UgUkVTQ09SRSgpIHdpbGwgY2hhbmdlIHRoZSBzY29yZS4KCQkgKiBJZiB0aGUgbGltaXQgaXMgdmVyeSBoaWdoIHRoZW4gdGhlIGl0ZXJhdGl2ZSBtZXRob2QgaXMKCQkgKiBpbmVmZmljaWVudCwgdXNpbmcgYW4gYXJyYXkgaXMgcXVpY2tlci4gKi8KCQlsaW1pdCA9IE1BWFNDT1JFKHN1LT5zdV9zZm1heHNjb3JlIC0gZ29vZHNjb3JlLCBzY29yZSk7CgkJaWYgKGxpbWl0ID4gU0NPUkVfTElNSVRNQVgpCgkJICAgIGdvb2RzY29yZSArPSBzcGVsbF9lZGl0X3Njb3JlKHNsYW5nLCBzdS0+c3VfYmFkd29yZCwgcCk7CgkJZWxzZQoJCSAgICBnb29kc2NvcmUgKz0gc3BlbGxfZWRpdF9zY29yZV9saW1pdChzbGFuZywgc3UtPnN1X2JhZHdvcmQsCgkJCQkJCQkJICAgIHAsIGxpbWl0KTsKCgkJLyogV2hlbiBnb2luZyBvdmVyIHRoZSBsaW1pdCBkb24ndCBib3RoZXIgdG8gZG8gdGhlIHJlc3QuICovCgkJaWYgKGdvb2RzY29yZSA8IFNDT1JFX01BWE1BWCkKCQl7CgkJICAgIC8qIEdpdmUgYSBib251cyB0byB3b3JkcyBzZWVuIGJlZm9yZS4gKi8KCQkgICAgZ29vZHNjb3JlID0gc2NvcmVfd29yZGNvdW50X2FkaihzbGFuZywgZ29vZHNjb3JlLCBwLCBGQUxTRSk7CgoJCSAgICAvKiBBZGQgdGhlIHN1Z2dlc3Rpb24gaWYgdGhlIHNjb3JlIGlzbid0IHRvbyBiYWQuICovCgkJICAgIGdvb2RzY29yZSA9IFJFU0NPUkUoZ29vZHNjb3JlLCBzY29yZSk7CgkJICAgIGlmIChnb29kc2NvcmUgPD0gc3UtPnN1X3NmbWF4c2NvcmUpCgkJCWFkZF9zdWdnZXN0aW9uKHN1LCAmc3UtPnN1X2dhLCBwLCBzdS0+c3VfYmFkbGVuLAoJCQkJCSBnb29kc2NvcmUsIHNjb3JlLCBUUlVFLCBzbGFuZywgVFJVRSk7CgkJfQoJICAgIH0KCX0KCS8qIHNtc2coIndvcmQgJXMgKCVkKTogJXMgKCVkKSIsIHNmdHdvcmQsIHNmdG5yLCB0aGV3b3JkLCBvcmducik7ICovCiAgICB9Cn0KCi8qCiAqIEZpbmQgd29yZCAid29yZCIgaW4gZm9sZC1jYXNlIHRyZWUgZm9yICJzbGFuZyIgYW5kIHJldHVybiB0aGUgd29yZCBudW1iZXIuCiAqLwogICAgc3RhdGljIGludApzb3VuZGZvbGRfZmluZChzbGFuZywgd29yZCkKICAgIHNsYW5nX1QJKnNsYW5nOwogICAgY2hhcl91CSp3b3JkOwp7CiAgICBpZHhfVAlhcnJpZHggPSAwOwogICAgaW50CQlsZW47CiAgICBpbnQJCXdsZW4gPSAwOwogICAgaW50CQljOwogICAgY2hhcl91CSpwdHIgPSB3b3JkOwogICAgY2hhcl91CSpieXRzOwogICAgaWR4X1QJKmlkeHM7CiAgICBpbnQJCXdvcmRuciA9IDA7CgogICAgYnl0cyA9IHNsYW5nLT5zbF9zYnl0czsKICAgIGlkeHMgPSBzbGFuZy0+c2xfc2lkeHM7CgogICAgZm9yICg7OykKICAgIHsKCS8qIEZpcnN0IGJ5dGUgaXMgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBieXRlcy4gKi8KCWxlbiA9IGJ5dHNbYXJyaWR4KytdOwoKCS8qIElmIHRoZSBmaXJzdCBwb3NzaWJsZSBieXRlIGlzIGEgemVybyB0aGUgd29yZCBjb3VsZCBlbmQgaGVyZS4KCSAqIElmIHRoZSB3b3JkIGVuZHMgd2UgZm91bmQgdGhlIHdvcmQuICBJZiBub3Qgc2tpcCB0aGUgTlVMIGJ5dGVzLiAqLwoJYyA9IHB0clt3bGVuXTsKCWlmIChieXRzW2FycmlkeF0gPT0gTlVMKQoJewoJICAgIGlmIChjID09IE5VTCkKCQlicmVhazsKCgkgICAgLyogU2tpcCBvdmVyIHRoZSB6ZXJvcywgdGhlcmUgY2FuIGJlIHNldmVyYWwuICovCgkgICAgd2hpbGUgKGxlbiA+IDAgJiYgYnl0c1thcnJpZHhdID09IE5VTCkKCSAgICB7CgkJKythcnJpZHg7CgkJLS1sZW47CgkgICAgfQoJICAgIGlmIChsZW4gPT0gMCkKCQlyZXR1cm4gLTE7ICAgIC8qIG5vIGNoaWxkcmVuLCB3b3JkIHNob3VsZCBoYXZlIGVuZGVkIGhlcmUgKi8KCSAgICArK3dvcmRucjsKCX0KCgkvKiBJZiB0aGUgd29yZCBlbmRzIHdlIGRpZG4ndCBmaW5kIGl0LiAqLwoJaWYgKGMgPT0gTlVMKQoJICAgIHJldHVybiAtMTsKCgkvKiBQZXJmb3JtIGEgYmluYXJ5IHNlYXJjaCBpbiB0aGUgbGlzdCBvZiBhY2NlcHRlZCBieXRlcy4gKi8KCWlmIChjID09IFRBQikJICAgIC8qIDxUYWI+IGlzIGhhbmRsZWQgbGlrZSA8U3BhY2U+ICovCgkgICAgYyA9ICcgJzsKCXdoaWxlIChieXRzW2FycmlkeF0gPCBjKQoJewoJICAgIC8qIFRoZSB3b3JkIGNvdW50IGlzIGluIHRoZSBmaXJzdCBpZHhzW10gZW50cnkgb2YgdGhlIGNoaWxkLiAqLwoJICAgIHdvcmRuciArPSBpZHhzW2lkeHNbYXJyaWR4XV07CgkgICAgKythcnJpZHg7CgkgICAgaWYgKC0tbGVuID09IDApCS8qIGVuZCBvZiB0aGUgYnl0ZXMsIGRpZG4ndCBmaW5kIGl0ICovCgkJcmV0dXJuIC0xOwoJfQoJaWYgKGJ5dHNbYXJyaWR4XSAhPSBjKQkvKiBkaWRuJ3QgZmluZCB0aGUgYnl0ZSAqLwoJICAgIHJldHVybiAtMTsKCgkvKiBDb250aW51ZSBhdCB0aGUgY2hpbGQgKGlmIHRoZXJlIGlzIG9uZSkuICovCglhcnJpZHggPSBpZHhzW2FycmlkeF07CgkrK3dsZW47CgoJLyogT25lIHNwYWNlIGluIHRoZSBnb29kIHdvcmQgbWF5IHN0YW5kIGZvciBzZXZlcmFsIHNwYWNlcyBpbiB0aGUKCSAqIGNoZWNrZWQgd29yZC4gKi8KCWlmIChjID09ICcgJykKCSAgICB3aGlsZSAocHRyW3dsZW5dID09ICcgJyB8fCBwdHJbd2xlbl0gPT0gVEFCKQoJCSsrd2xlbjsKICAgIH0KCiAgICByZXR1cm4gd29yZG5yOwp9CgovKgogKiBDb3B5ICJmd29yZCIgdG8gImN3b3JkIiwgZml4aW5nIGNhc2UgYWNjb3JkaW5nIHRvICJmbGFncyIuCiAqLwogICAgc3RhdGljIHZvaWQKbWFrZV9jYXNlX3dvcmQoZndvcmQsIGN3b3JkLCBmbGFncykKICAgIGNoYXJfdQkqZndvcmQ7CiAgICBjaGFyX3UJKmN3b3JkOwogICAgaW50CQlmbGFnczsKewogICAgaWYgKGZsYWdzICYgV0ZfQUxMQ0FQKQoJLyogTWFrZSBpdCBhbGwgdXBwZXItY2FzZSAqLwoJYWxsY2FwX2NvcHkoZndvcmQsIGN3b3JkKTsKICAgIGVsc2UgaWYgKGZsYWdzICYgV0ZfT05FQ0FQKQoJLyogTWFrZSB0aGUgZmlyc3QgbGV0dGVyIHVwcGVyLWNhc2UgKi8KCW9uZWNhcF9jb3B5KGZ3b3JkLCBjd29yZCwgVFJVRSk7CiAgICBlbHNlCgkvKiBVc2UgZ29vZHdvcmQgYXMtaXMuICovCglTVFJDUFkoY3dvcmQsIGZ3b3JkKTsKfQoKLyoKICogVXNlIG1hcCBzdHJpbmcgIm1hcCIgZm9yIGxhbmd1YWdlcyAibHAiLgogKi8KICAgIHN0YXRpYyB2b2lkCnNldF9tYXBfc3RyKGxwLCBtYXApCiAgICBzbGFuZ19UCSpscDsKICAgIGNoYXJfdQkqbWFwOwp7CiAgICBjaGFyX3UJKnA7CiAgICBpbnQJCWhlYWRjID0gMDsKICAgIGludAkJYzsKICAgIGludAkJaTsKCiAgICBpZiAoKm1hcCA9PSBOVUwpCiAgICB7CglscC0+c2xfaGFzX21hcCA9IEZBTFNFOwoJcmV0dXJuOwogICAgfQogICAgbHAtPnNsX2hhc19tYXAgPSBUUlVFOwoKICAgIC8qIEluaXQgdGhlIGFycmF5IGFuZCBoYXNoIHRhYmxlcyBlbXB0eS4gKi8KICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkKCWxwLT5zbF9tYXBfYXJyYXlbaV0gPSAwOwojaWZkZWYgRkVBVF9NQllURQogICAgaGFzaF9pbml0KCZscC0+c2xfbWFwX2hhc2gpOwojZW5kaWYKCiAgICAvKgogICAgICogVGhlIHNpbWlsYXIgY2hhcmFjdGVycyBhcmUgc3RvcmVkIHNlcGFyYXRlZCB3aXRoIHNsYXNoZXM6CiAgICAgKiAiYWFhL2JiYi9jY2MvIi4gIEZpbGwgc2xfbWFwX2FycmF5W2NdIHdpdGggdGhlIGNoYXJhY3RlciBiZWZvcmUgYyBhbmQKICAgICAqIGJlZm9yZSB0aGUgc2FtZSBzbGFzaC4gIEZvciBjaGFyYWN0ZXJzIGFib3ZlIDI1NSBzbF9tYXBfaGFzaCBpcyB1c2VkLgogICAgICovCiAgICBmb3IgKHAgPSBtYXA7ICpwICE9IE5VTDsgKQogICAgewojaWZkZWYgRkVBVF9NQllURQoJYyA9IG1iX2NwdHIyY2hhcl9hZHYoJnApOwojZWxzZQoJYyA9ICpwKys7CiNlbmRpZgoJaWYgKGMgPT0gJy8nKQoJICAgIGhlYWRjID0gMDsKCWVsc2UKCXsKCSAgICBpZiAoaGVhZGMgPT0gMCkKCQkgaGVhZGMgPSBjOwoKI2lmZGVmIEZFQVRfTUJZVEUKCSAgICAvKiBDaGFyYWN0ZXJzIGFib3ZlIDI1NSBkb24ndCBmaXQgaW4gc2xfbWFwX2FycmF5W10sIHB1dCB0aGVtIGluCgkgICAgICogdGhlIGhhc2ggdGFibGUuICBFYWNoIGVudHJ5IGlzIHRoZSBjaGFyLCBhIE5VTCB0aGUgaGVhZGNoYXIgYW5kCgkgICAgICogYSBOVUwuICovCgkgICAgaWYgKGMgPj0gMjU2KQoJICAgIHsKCQlpbnQJICAgIGNsID0gbWJfY2hhcjJsZW4oYyk7CgkJaW50CSAgICBoZWFkY2wgPSBtYl9jaGFyMmxlbihoZWFkYyk7CgkJY2hhcl91CSAgICAqYjsKCQloYXNoX1QJICAgIGhhc2g7CgkJaGFzaGl0ZW1fVCAgKmhpOwoKCQliID0gYWxsb2MoKHVuc2lnbmVkKShjbCArIGhlYWRjbCArIDIpKTsKCQlpZiAoYiA9PSBOVUxMKQoJCSAgICByZXR1cm47CgkJbWJfY2hhcjJieXRlcyhjLCBiKTsKCQliW2NsXSA9IE5VTDsKCQltYl9jaGFyMmJ5dGVzKGhlYWRjLCBiICsgY2wgKyAxKTsKCQliW2NsICsgMSArIGhlYWRjbF0gPSBOVUw7CgkJaGFzaCA9IGhhc2hfaGFzaChiKTsKCQloaSA9IGhhc2hfbG9va3VwKCZscC0+c2xfbWFwX2hhc2gsIGIsIGhhc2gpOwoJCWlmIChIQVNISVRFTV9FTVBUWShoaSkpCgkJICAgIGhhc2hfYWRkX2l0ZW0oJmxwLT5zbF9tYXBfaGFzaCwgaGksIGIsIGhhc2gpOwoJCWVsc2UKCQl7CgkJICAgIC8qIFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBjaGVja2VkIHdoZW4gZ2VuZXJhdGluZyB0aGUgLnNwbAoJCSAgICAgKiBmaWxlLiAqLwoJCSAgICBFTVNHKF8oIkU3ODM6IGR1cGxpY2F0ZSBjaGFyIGluIE1BUCBlbnRyeSIpKTsKCQkgICAgdmltX2ZyZWUoYik7CgkJfQoJICAgIH0KCSAgICBlbHNlCiNlbmRpZgoJCWxwLT5zbF9tYXBfYXJyYXlbY10gPSBoZWFkYzsKCX0KICAgIH0KfQoKLyoKICogUmV0dXJuIFRSVUUgaWYgImMxIiBhbmQgImMyIiBhcmUgc2ltaWxhciBjaGFyYWN0ZXJzIGFjY29yZGluZyB0byB0aGUgTUFQCiAqIGxpbmVzIGluIHRoZSAuYWZmIGZpbGUuCiAqLwogICAgc3RhdGljIGludApzaW1pbGFyX2NoYXJzKHNsYW5nLCBjMSwgYzIpCiAgICBzbGFuZ19UCSpzbGFuZzsKICAgIGludAkJYzE7CiAgICBpbnQJCWMyOwp7CiAgICBpbnQJCW0xLCBtMjsKI2lmZGVmIEZFQVRfTUJZVEUKICAgIGNoYXJfdQlidWZbTUJfTUFYQllURVNdOwogICAgaGFzaGl0ZW1fVCAgKmhpOwoKICAgIGlmIChjMSA+PSAyNTYpCiAgICB7CglidWZbbWJfY2hhcjJieXRlcyhjMSwgYnVmKV0gPSAwOwoJaGkgPSBoYXNoX2ZpbmQoJnNsYW5nLT5zbF9tYXBfaGFzaCwgYnVmKTsKCWlmIChIQVNISVRFTV9FTVBUWShoaSkpCgkgICAgbTEgPSAwOwoJZWxzZQoJICAgIG0xID0gbWJfcHRyMmNoYXIoaGktPmhpX2tleSArIFNUUkxFTihoaS0+aGlfa2V5KSArIDEpOwogICAgfQogICAgZWxzZQojZW5kaWYKCW0xID0gc2xhbmctPnNsX21hcF9hcnJheVtjMV07CiAgICBpZiAobTEgPT0gMCkKCXJldHVybiBGQUxTRTsKCgojaWZkZWYgRkVBVF9NQllURQogICAgaWYgKGMyID49IDI1NikKICAgIHsKCWJ1ZlttYl9jaGFyMmJ5dGVzKGMyLCBidWYpXSA9IDA7CgloaSA9IGhhc2hfZmluZCgmc2xhbmctPnNsX21hcF9oYXNoLCBidWYpOwoJaWYgKEhBU0hJVEVNX0VNUFRZKGhpKSkKCSAgICBtMiA9IDA7CgllbHNlCgkgICAgbTIgPSBtYl9wdHIyY2hhcihoaS0+aGlfa2V5ICsgU1RSTEVOKGhpLT5oaV9rZXkpICsgMSk7CiAgICB9CiAgICBlbHNlCiNlbmRpZgoJbTIgPSBzbGFuZy0+c2xfbWFwX2FycmF5W2MyXTsKCiAgICByZXR1cm4gbTEgPT0gbTI7Cn0KCi8qCiAqIEFkZCBhIHN1Z2dlc3Rpb24gdG8gdGhlIGxpc3Qgb2Ygc3VnZ2VzdGlvbnMuCiAqIEZvciBhIHN1Z2dlc3Rpb24gdGhhdCBpcyBhbHJlYWR5IGluIHRoZSBsaXN0IHRoZSBsb3dlc3Qgc2NvcmUgaXMgcmVtZW1iZXJlZC4KICovCiAgICBzdGF0aWMgdm9pZAphZGRfc3VnZ2VzdGlvbihzdSwgZ2FwLCBnb29kd29yZCwgYmFkbGVuYXJnLCBzY29yZSwgYWx0c2NvcmUsIGhhZF9ib251cywKCQkJCQkJCQkgc2xhbmcsIG1heHNmKQogICAgc3VnaW5mb19UCSpzdTsKICAgIGdhcnJheV9UCSpnYXA7CQkvKiBlaXRoZXIgc3VfZ2Egb3Igc3Vfc2dhICovCiAgICBjaGFyX3UJKmdvb2R3b3JkOwogICAgaW50CQliYWRsZW5hcmc7CS8qIGxlbiBvZiBiYWQgd29yZCByZXBsYWNlZCB3aXRoICJnb29kd29yZCIgKi8KICAgIGludAkJc2NvcmU7CiAgICBpbnQJCWFsdHNjb3JlOwogICAgaW50CQloYWRfYm9udXM7CS8qIHZhbHVlIGZvciBzdF9oYWRfYm9udXMgKi8KICAgIHNsYW5nX1QJKnNsYW5nOwkJLyogbGFuZ3VhZ2UgZm9yIHNvdW5kIGZvbGRpbmcgKi8KICAgIGludAkJbWF4c2Y7CQkvKiBzdV9tYXhzY29yZSBhcHBsaWVzIHRvIHNvdW5kZm9sZCBzY29yZSwKCQkJCSAgIHN1X3NmbWF4c2NvcmUgdG8gdGhlIHRvdGFsIHNjb3JlLiAqLwp7CiAgICBpbnQJCWdvb2RsZW47CS8qIGxlbiBvZiBnb29kd29yZCBjaGFuZ2VkICovCiAgICBpbnQJCWJhZGxlbjsJCS8qIGxlbiBvZiBiYWQgd29yZCBjaGFuZ2VkICovCiAgICBzdWdnZXN0X1QgICAqc3RwOwogICAgc3VnZ2VzdF9UICAgbmV3X3N1ZzsKICAgIGludAkJaTsKICAgIGNoYXJfdQkqcGdvb2QsICpwYmFkOwoKICAgIC8qIE1pbmltaXplICJiYWRsZW4iIGZvciBjb25zaXN0ZW5jeS4gIEF2b2lkcyB0aGF0IGNoYW5naW5nICJ0aGUgdGhlIiB0bwogICAgICogInRoZWUgdGhlIiBpcyBhZGRlZCBuZXh0IHRvIGNoYW5naW5nIHRoZSBmaXJzdCAidGhlIiB0aGUgInRoZWUiLiAgKi8KICAgIHBnb29kID0gZ29vZHdvcmQgKyBTVFJMRU4oZ29vZHdvcmQpOwogICAgcGJhZCA9IHN1LT5zdV9iYWRwdHIgKyBiYWRsZW5hcmc7CiAgICBmb3IgKDs7KQogICAgewoJZ29vZGxlbiA9IHBnb29kIC0gZ29vZHdvcmQ7CgliYWRsZW4gPSBwYmFkIC0gc3UtPnN1X2JhZHB0cjsKCWlmIChnb29kbGVuIDw9IDAgfHwgYmFkbGVuIDw9IDApCgkgICAgYnJlYWs7CgltYl9wdHJfYmFjayhnb29kd29yZCwgcGdvb2QpOwoJbWJfcHRyX2JhY2soc3UtPnN1X2JhZHB0ciwgcGJhZCk7CiNpZmRlZiBGRUFUX01CWVRFCglpZiAoaGFzX21ieXRlKQoJewoJICAgIGlmIChtYl9wdHIyY2hhcihwZ29vZCkgIT0gbWJfcHRyMmNoYXIocGJhZCkpCgkJYnJlYWs7Cgl9CgllbHNlCiNlbmRpZgoJICAgIGlmICgqcGdvb2QgIT0gKnBiYWQpCgkJYnJlYWs7CiAgICB9CgogICAgaWYgKGJhZGxlbiA9PSAwICYmIGdvb2RsZW4gPT0gMCkKCS8qIGdvb2R3b3JkIGRvZXNuJ3QgY2hhbmdlIGFueXRoaW5nOyBtYXkgaGFwcGVuIGZvciAidGhlIHRoZSIgY2hhbmdpbmcKCSAqIHRoZSBmaXJzdCAidGhlIiB0byBpdHNlbGYuICovCglyZXR1cm47CgogICAgLyogQ2hlY2sgaWYgdGhlIHdvcmQgaXMgYWxyZWFkeSB0aGVyZS4gIEFsc28gY2hlY2sgdGhlIGxlbmd0aCB0aGF0IGlzCiAgICAgKiBiZWluZyByZXBsYWNlZCAidGhlcywiIC0+ICJ0aGVzZSIgaXMgYSBkaWZmZXJlbnQgc3VnZ2VzdGlvbiBmcm9tCiAgICAgKiAidGhlcyIgLT4gInRoZXNlIi4gKi8KICAgIHN0cCA9ICZTVUcoKmdhcCwgMCk7CiAgICBmb3IgKGkgPSBnYXAtPmdhX2xlbjsgLS1pID49IDA7ICsrc3RwKQoJaWYgKHN0cC0+c3Rfd29yZGxlbiA9PSBnb29kbGVuCgkJJiYgc3RwLT5zdF9vcmdsZW4gPT0gYmFkbGVuCgkJJiYgU1RSTkNNUChzdHAtPnN0X3dvcmQsIGdvb2R3b3JkLCBnb29kbGVuKSA9PSAwKQoJewoJICAgIC8qCgkgICAgICogRm91bmQgaXQuICBSZW1lbWJlciB0aGUgd29yZCB3aXRoIHRoZSBsb3dlc3Qgc2NvcmUuCgkgICAgICovCgkgICAgaWYgKHN0cC0+c3Rfc2xhbmcgPT0gTlVMTCkKCQlzdHAtPnN0X3NsYW5nID0gc2xhbmc7CgoJICAgIG5ld19zdWcuc3Rfc2NvcmUgPSBzY29yZTsKCSAgICBuZXdfc3VnLnN0X2FsdHNjb3JlID0gYWx0c2NvcmU7CgkgICAgbmV3X3N1Zy5zdF9oYWRfYm9udXMgPSBoYWRfYm9udXM7CgoJICAgIGlmIChzdHAtPnN0X2hhZF9ib251cyAhPSBoYWRfYm9udXMpCgkgICAgewoJCS8qIE9ubHkgb25lIG9mIHRoZSB0d28gaGFkIHRoZSBzb3VuZGFsaWtlIHNjb3JlIGNvbXB1dGVkLgoJCSAqIE5lZWQgdG8gZG8gdGhhdCBmb3IgdGhlIG90aGVyIG9uZSBub3csIG90aGVyd2lzZSB0aGUKCQkgKiBzY29yZXMgY2FuJ3QgYmUgY29tcGFyZWQuICBUaGlzIGhhcHBlbnMgYmVjYXVzZQoJCSAqIHN1Z2dlc3RfdHJ5X2NoYW5nZSgpIGRvZXNuJ3QgY29tcHV0ZSB0aGUgc291bmRhbGlrZQoJCSAqIHdvcmQgdG8ga2VlcCBpdCBmYXN0LCB3aGlsZSBzb21lIHNwZWNpYWwgbWV0aG9kcyBzZXQKCQkgKiB0aGUgc291bmRhbGlrZSBzY29yZSB0byB6ZXJvLiAqLwoJCWlmIChoYWRfYm9udXMpCgkJICAgIHJlc2NvcmVfb25lKHN1LCBzdHApOwoJCWVsc2UKCQl7CgkJICAgIG5ld19zdWcuc3Rfd29yZCA9IHN0cC0+c3Rfd29yZDsKCQkgICAgbmV3X3N1Zy5zdF93b3JkbGVuID0gc3RwLT5zdF93b3JkbGVuOwoJCSAgICBuZXdfc3VnLnN0X3NsYW5nID0gc3RwLT5zdF9zbGFuZzsKCQkgICAgbmV3X3N1Zy5zdF9vcmdsZW4gPSBiYWRsZW47CgkJICAgIHJlc2NvcmVfb25lKHN1LCAmbmV3X3N1Zyk7CgkJfQoJICAgIH0KCgkgICAgaWYgKHN0cC0+c3Rfc2NvcmUgPiBuZXdfc3VnLnN0X3Njb3JlKQoJICAgIHsKCQlzdHAtPnN0X3Njb3JlID0gbmV3X3N1Zy5zdF9zY29yZTsKCQlzdHAtPnN0X2FsdHNjb3JlID0gbmV3X3N1Zy5zdF9hbHRzY29yZTsKCQlzdHAtPnN0X2hhZF9ib251cyA9IG5ld19zdWcuc3RfaGFkX2JvbnVzOwoJICAgIH0KCSAgICBicmVhazsKCX0KCiAgICBpZiAoaSA8IDAgJiYgZ2FfZ3JvdyhnYXAsIDEpID09IE9LKQogICAgewoJLyogQWRkIGEgc3VnZ2VzdGlvbi4gKi8KCXN0cCA9ICZTVUcoKmdhcCwgZ2FwLT5nYV9sZW4pOwoJc3RwLT5zdF93b3JkID0gdmltX3N0cm5zYXZlKGdvb2R3b3JkLCBnb29kbGVuKTsKCWlmIChzdHAtPnN0X3dvcmQgIT0gTlVMTCkKCXsKCSAgICBzdHAtPnN0X3dvcmRsZW4gPSBnb29kbGVuOwoJICAgIHN0cC0+c3Rfc2NvcmUgPSBzY29yZTsKCSAgICBzdHAtPnN0X2FsdHNjb3JlID0gYWx0c2NvcmU7CgkgICAgc3RwLT5zdF9oYWRfYm9udXMgPSBoYWRfYm9udXM7CgkgICAgc3RwLT5zdF9vcmdsZW4gPSBiYWRsZW47CgkgICAgc3RwLT5zdF9zbGFuZyA9IHNsYW5nOwoJICAgICsrZ2FwLT5nYV9sZW47CgoJICAgIC8qIElmIHdlIGhhdmUgdG9vIG1hbnkgc3VnZ2VzdGlvbnMgbm93LCBzb3J0IHRoZSBsaXN0IGFuZCBrZWVwCgkgICAgICogdGhlIGJlc3Qgc3VnZ2VzdGlvbnMuICovCgkgICAgaWYgKGdhcC0+Z2FfbGVuID4gU1VHX01BWF9DT1VOVChzdSkpCgkgICAgewoJCWlmIChtYXhzZikKCQkgICAgc3UtPnN1X3NmbWF4c2NvcmUgPSBjbGVhbnVwX3N1Z2dlc3Rpb25zKGdhcCwKCQkJCSAgICAgIHN1LT5zdV9zZm1heHNjb3JlLCBTVUdfQ0xFQU5fQ09VTlQoc3UpKTsKCQllbHNlCgkJewoJCSAgICBpID0gc3UtPnN1X21heHNjb3JlOwoJCSAgICBzdS0+c3VfbWF4c2NvcmUgPSBjbGVhbnVwX3N1Z2dlc3Rpb25zKGdhcCwKCQkJCQlzdS0+c3VfbWF4c2NvcmUsIFNVR19DTEVBTl9DT1VOVChzdSkpOwoJCX0KCSAgICB9Cgl9CiAgICB9Cn0KCi8qCiAqIFN1Z2dlc3Rpb25zIG1heSBpbiBmYWN0IGJlIGZsYWdnZWQgYXMgZXJyb3JzLiAgRXNwLiBmb3IgYmFubmVkIHdvcmRzIGFuZAogKiBmb3Igc3BsaXQgd29yZHMsIHN1Y2ggYXMgInRoZSB0aGUiLiAgUmVtb3ZlIHRoZXNlIGZyb20gdGhlIGxpc3QgaGVyZS4KICovCiAgICBzdGF0aWMgdm9pZApjaGVja19zdWdnZXN0aW9ucyhzdSwgZ2FwKQogICAgc3VnaW5mb19UCSpzdTsKICAgIGdhcnJheV9UCSpnYXA7CQkgICAgLyogZWl0aGVyIHN1X2dhIG9yIHN1X3NnYSAqLwp7CiAgICBzdWdnZXN0X1QgICAqc3RwOwogICAgaW50CQlpOwogICAgY2hhcl91CWxvbmd3b3JkW01BWFdMRU4gKyAxXTsKICAgIGludAkJbGVuOwogICAgaGxmX1QJYXR0cjsKCiAgICBzdHAgPSAmU1VHKCpnYXAsIDApOwogICAgZm9yIChpID0gZ2FwLT5nYV9sZW4gLSAxOyBpID49IDA7IC0taSkKICAgIHsKCS8qIE5lZWQgdG8gYXBwZW5kIHdoYXQgZm9sbG93cyB0byBjaGVjayBmb3IgInRoZSB0aGUiLiAqLwoJU1RSQ1BZKGxvbmd3b3JkLCBzdHBbaV0uc3Rfd29yZCk7CglsZW4gPSBzdHBbaV0uc3Rfd29yZGxlbjsKCXZpbV9zdHJuY3B5KGxvbmd3b3JkICsgbGVuLCBzdS0+c3VfYmFkcHRyICsgc3RwW2ldLnN0X29yZ2xlbiwKCQkJCQkJCSAgICAgICBNQVhXTEVOIC0gbGVuKTsKCWF0dHIgPSBITEZfQ09VTlQ7Cgkodm9pZClzcGVsbF9jaGVjayhjdXJ3aW4sIGxvbmd3b3JkLCAmYXR0ciwgTlVMTCwgRkFMU0UpOwoJaWYgKGF0dHIgIT0gSExGX0NPVU5UKQoJewoJICAgIC8qIFJlbW92ZSB0aGlzIGVudHJ5LiAqLwoJICAgIHZpbV9mcmVlKHN0cFtpXS5zdF93b3JkKTsKCSAgICAtLWdhcC0+Z2FfbGVuOwoJICAgIGlmIChpIDwgZ2FwLT5nYV9sZW4pCgkJbWNoX21lbW1vdmUoc3RwICsgaSwgc3RwICsgaSArIDEsCgkJCQkgICAgICAgc2l6ZW9mKHN1Z2dlc3RfVCkgKiAoZ2FwLT5nYV9sZW4gLSBpKSk7Cgl9CiAgICB9Cn0KCgovKgogKiBBZGQgYSB3b3JkIHRvIGJlIGJhbm5lZC4KICovCiAgICBzdGF0aWMgdm9pZAphZGRfYmFubmVkKHN1LCB3b3JkKQogICAgc3VnaW5mb19UCSpzdTsKICAgIGNoYXJfdQkqd29yZDsKewogICAgY2hhcl91CSpzOwogICAgaGFzaF9UCWhhc2g7CiAgICBoYXNoaXRlbV9UCSpoaTsKCiAgICBoYXNoID0gaGFzaF9oYXNoKHdvcmQpOwogICAgaGkgPSBoYXNoX2xvb2t1cCgmc3UtPnN1X2Jhbm5lZCwgd29yZCwgaGFzaCk7CiAgICBpZiAoSEFTSElURU1fRU1QVFkoaGkpKQogICAgewoJcyA9IHZpbV9zdHJzYXZlKHdvcmQpOwoJaWYgKHMgIT0gTlVMTCkKCSAgICBoYXNoX2FkZF9pdGVtKCZzdS0+c3VfYmFubmVkLCBoaSwgcywgaGFzaCk7CiAgICB9Cn0KCi8qCiAqIFJlY29tcHV0ZSB0aGUgc2NvcmUgZm9yIGFsbCBzdWdnZXN0aW9ucyBpZiBzb3VuZC1mb2xkaW5nIGlzIHBvc3NpYmxlLiAgVGhpcwogKiBpcyBzbG93LCB0aHVzIG9ubHkgZG9uZSBmb3IgdGhlIGZpbmFsIHJlc3VsdHMuCiAqLwogICAgc3RhdGljIHZvaWQKcmVzY29yZV9zdWdnZXN0aW9ucyhzdSkKICAgIHN1Z2luZm9fVAkqc3U7CnsKICAgIGludAkJaTsKCiAgICBpZiAoc3UtPnN1X3NhbGxhbmcgIT0gTlVMTCkKCWZvciAoaSA9IDA7IGkgPCBzdS0+c3VfZ2EuZ2FfbGVuOyArK2kpCgkgICAgcmVzY29yZV9vbmUoc3UsICZTVUcoc3UtPnN1X2dhLCBpKSk7Cn0KCi8qCiAqIFJlY29tcHV0ZSB0aGUgc2NvcmUgZm9yIG9uZSBzdWdnZXN0aW9uIGlmIHNvdW5kLWZvbGRpbmcgaXMgcG9zc2libGUuCiAqLwogICAgc3RhdGljIHZvaWQKcmVzY29yZV9vbmUoc3UsIHN0cCkKICAgIHN1Z2luZm9fVAkqc3U7CiAgICBzdWdnZXN0X1QJKnN0cDsKewogICAgc2xhbmdfVAkqc2xhbmcgPSBzdHAtPnN0X3NsYW5nOwogICAgY2hhcl91CXNhbF9iYWR3b3JkW01BWFdMRU5dOwogICAgY2hhcl91CSpwOwoKICAgIC8qIE9ubHkgcmVzY29yZSBzdWdnZXN0aW9ucyB0aGF0IGhhdmUgbm8gc2FsIHNjb3JlIHlldCBhbmQgZG8gaGF2ZSBhCiAgICAgKiBsYW5ndWFnZS4gKi8KICAgIGlmIChzbGFuZyAhPSBOVUxMICYmIHNsYW5nLT5zbF9zYWwuZ2FfbGVuID4gMCAmJiAhc3RwLT5zdF9oYWRfYm9udXMpCiAgICB7CglpZiAoc2xhbmcgPT0gc3UtPnN1X3NhbGxhbmcpCgkgICAgcCA9IHN1LT5zdV9zYWxfYmFkd29yZDsKCWVsc2UKCXsKCSAgICBzcGVsbF9zb3VuZGZvbGQoc2xhbmcsIHN1LT5zdV9mYmFkd29yZCwgVFJVRSwgc2FsX2JhZHdvcmQpOwoJICAgIHAgPSBzYWxfYmFkd29yZDsKCX0KCglzdHAtPnN0X2FsdHNjb3JlID0gc3RwX3NhbF9zY29yZShzdHAsIHN1LCBzbGFuZywgcCk7CglpZiAoc3RwLT5zdF9hbHRzY29yZSA9PSBTQ09SRV9NQVhNQVgpCgkgICAgc3RwLT5zdF9hbHRzY29yZSA9IFNDT1JFX0JJRzsKCXN0cC0+c3Rfc2NvcmUgPSBSRVNDT1JFKHN0cC0+c3Rfc2NvcmUsIHN0cC0+c3RfYWx0c2NvcmUpOwoJc3RwLT5zdF9oYWRfYm9udXMgPSBUUlVFOwogICAgfQp9CgpzdGF0aWMgaW50CiNpZmRlZiBfX0JPUkxBTkRDX18KX1JUTEVOVFJZRgojZW5kaWYKc3VnX2NvbXBhcmUgX19BUkdTKChjb25zdCB2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIpKTsKCi8qCiAqIEZ1bmN0aW9uIGdpdmVuIHRvIHFzb3J0KCkgdG8gc29ydCB0aGUgc3VnZ2VzdGlvbnMgb24gc3Rfc2NvcmUuCiAqIEZpcnN0IG9uICJzdF9zY29yZSIsIHRoZW4gInN0X2FsdHNjb3JlIiB0aGVuIGFscGhhYmV0aWNhbGx5LgogKi8KICAgIHN0YXRpYyBpbnQKI2lmZGVmIF9fQk9STEFORENfXwpfUlRMRU5UUllGCiNlbmRpZgpzdWdfY29tcGFyZShzMSwgczIpCiAgICBjb25zdCB2b2lkCSpzMTsKICAgIGNvbnN0IHZvaWQJKnMyOwp7CiAgICBzdWdnZXN0X1QJKnAxID0gKHN1Z2dlc3RfVCAqKXMxOwogICAgc3VnZ2VzdF9UCSpwMiA9IChzdWdnZXN0X1QgKilzMjsKICAgIGludAkJbiA9IHAxLT5zdF9zY29yZSAtIHAyLT5zdF9zY29yZTsKCiAgICBpZiAobiA9PSAwKQogICAgewoJbiA9IHAxLT5zdF9hbHRzY29yZSAtIHAyLT5zdF9hbHRzY29yZTsKCWlmIChuID09IDApCgkgICAgbiA9IFNUUklDTVAocDEtPnN0X3dvcmQsIHAyLT5zdF93b3JkKTsKICAgIH0KICAgIHJldHVybiBuOwp9CgovKgogKiBDbGVhbnVwIHRoZSBzdWdnZXN0aW9uczoKICogLSBTb3J0IG9uIHNjb3JlLgogKiAtIFJlbW92ZSB3b3JkcyB0aGF0IHdvbid0IGJlIGRpc3BsYXllZC4KICogUmV0dXJucyB0aGUgbWF4aW11bSBzY29yZSBpbiB0aGUgbGlzdCBvciAibWF4c2NvcmUiIHVubW9kaWZpZWQuCiAqLwogICAgc3RhdGljIGludApjbGVhbnVwX3N1Z2dlc3Rpb25zKGdhcCwgbWF4c2NvcmUsIGtlZXApCiAgICBnYXJyYXlfVAkqZ2FwOwogICAgaW50CQltYXhzY29yZTsKICAgIGludAkJa2VlcDsJCS8qIG5yIG9mIHN1Z2dlc3Rpb25zIHRvIGtlZXAgKi8KewogICAgc3VnZ2VzdF9UICAgKnN0cCA9ICZTVUcoKmdhcCwgMCk7CiAgICBpbnQJCWk7CgogICAgLyogU29ydCB0aGUgbGlzdC4gKi8KICAgIHFzb3J0KGdhcC0+Z2FfZGF0YSwgKHNpemVfdClnYXAtPmdhX2xlbiwgc2l6ZW9mKHN1Z2dlc3RfVCksIHN1Z19jb21wYXJlKTsKCiAgICAvKiBUcnVuY2F0ZSB0aGUgbGlzdCB0byB0aGUgbnVtYmVyIG9mIHN1Z2dlc3Rpb25zIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQuICovCiAgICBpZiAoZ2FwLT5nYV9sZW4gPiBrZWVwKQogICAgewoJZm9yIChpID0ga2VlcDsgaSA8IGdhcC0+Z2FfbGVuOyArK2kpCgkgICAgdmltX2ZyZWUoc3RwW2ldLnN0X3dvcmQpOwoJZ2FwLT5nYV9sZW4gPSBrZWVwOwoJcmV0dXJuIHN0cFtrZWVwIC0gMV0uc3Rfc2NvcmU7CiAgICB9CiAgICByZXR1cm4gbWF4c2NvcmU7Cn0KCiNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChQUk9UTykKLyoKICogU291bmRmb2xkIGEgc3RyaW5nLCBmb3Igc291bmRmb2xkKCkuCiAqIFJlc3VsdCBpcyBpbiBhbGxvY2F0ZWQgbWVtb3J5LCBOVUxMIGZvciBhbiBlcnJvci4KICovCiAgICBjaGFyX3UgKgpldmFsX3NvdW5kZm9sZCh3b3JkKQogICAgY2hhcl91CSp3b3JkOwp7CiAgICBsYW5ncF9UCSpscDsKICAgIGNoYXJfdQlzb3VuZFtNQVhXTEVOXTsKICAgIGludAkJbHBpOwoKICAgIGlmIChjdXJ3aW4tPndfcF9zcGVsbCAmJiAqY3VyYnVmLT5iX3Bfc3BsICE9IE5VTCkKCS8qIFVzZSB0aGUgc291bmQtZm9sZGluZyBvZiB0aGUgZmlyc3QgbGFuZ3VhZ2UgdGhhdCBzdXBwb3J0cyBpdC4gKi8KCWZvciAobHBpID0gMDsgbHBpIDwgY3VyYnVmLT5iX2xhbmdwLmdhX2xlbjsgKytscGkpCgl7CgkgICAgbHAgPSBMQU5HUF9FTlRSWShjdXJidWYtPmJfbGFuZ3AsIGxwaSk7CgkgICAgaWYgKGxwLT5scF9zbGFuZy0+c2xfc2FsLmdhX2xlbiA+IDApCgkgICAgewoJCS8qIHNvdW5kZm9sZCB0aGUgd29yZCAqLwoJCXNwZWxsX3NvdW5kZm9sZChscC0+bHBfc2xhbmcsIHdvcmQsIEZBTFNFLCBzb3VuZCk7CgkJcmV0dXJuIHZpbV9zdHJzYXZlKHNvdW5kKTsKCSAgICB9Cgl9CgogICAgLyogTm8gbGFuZ3VhZ2Ugd2l0aCBzb3VuZCBmb2xkaW5nLCByZXR1cm4gd29yZCBhcy1pcy4gKi8KICAgIHJldHVybiB2aW1fc3Ryc2F2ZSh3b3JkKTsKfQojZW5kaWYKCi8qCiAqIFR1cm4gImlud29yZCIgaW50byBpdHMgc291bmQtYS1saWtlIGVxdWl2YWxlbnQgaW4gInJlc1tNQVhXTEVOXSIuCiAqCiAqIFRoZXJlIGFyZSBtYW55IHdheXMgdG8gdHVybiBhIHdvcmQgaW50byBhIHNvdW5kLWEtbGlrZSByZXByZXNlbnRhdGlvbi4gIFRoZQogKiBvbGRlc3QgaXMgU291bmRleCAoMTkxOCEpLiAgIEEgbmljZSBvdmVydmlldyBjYW4gYmUgZm91bmQgaW4gIkFwcHJveGltYXRlCiAqIHN3ZWRpc2ggbmFtZSBtYXRjaGluZyAtIHN1cnZleSBhbmQgdGVzdCBvZiBkaWZmZXJlbnQgYWxnb3JpdGhtcyIgYnkgS2xhcwogKiBFcmlrc29uLgogKgogKiBXZSBzdXBwb3J0IHR3byBtZXRob2RzOgogKiAxLiBTT0ZPRlJPTS9TT0ZPVE8gZG8gYSBzaW1wbGUgY2hhcmFjdGVyIG1hcHBpbmcuCiAqIDIuIFNBTCBpdGVtcyBkZWZpbmUgYSBtb3JlIGFkdmFuY2VkIHNvdW5kLWZvbGRpbmcgKGFuZCBtdWNoIHNsb3dlcikuCiAqLwogICAgc3RhdGljIHZvaWQKc3BlbGxfc291bmRmb2xkKHNsYW5nLCBpbndvcmQsIGZvbGRlZCwgcmVzKQogICAgc2xhbmdfVAkqc2xhbmc7CiAgICBjaGFyX3UJKmlud29yZDsKICAgIGludAkJZm9sZGVkOwkgICAgLyogImlud29yZCIgaXMgYWxyZWFkeSBjYXNlLWZvbGRlZCAqLwogICAgY2hhcl91CSpyZXM7CnsKICAgIGNoYXJfdQlmd29yZFtNQVhXTEVOXTsKICAgIGNoYXJfdQkqd29yZDsKCiAgICBpZiAoc2xhbmctPnNsX3NvZm8pCgkvKiBTT0ZPRlJPTSBhbmQgU09GT1RPIHVzZWQgKi8KCXNwZWxsX3NvdW5kZm9sZF9zb2ZvKHNsYW5nLCBpbndvcmQsIHJlcyk7CiAgICBlbHNlCiAgICB7CgkvKiBTQUwgaXRlbXMgdXNlZC4gIFJlcXVpcmVzIHRoZSB3b3JkIHRvIGJlIGNhc2UtZm9sZGVkLiAqLwoJaWYgKGZvbGRlZCkKCSAgICB3b3JkID0gaW53b3JkOwoJZWxzZQoJewoJICAgICh2b2lkKXNwZWxsX2Nhc2Vmb2xkKGlud29yZCwgU1RSTEVOKGlud29yZCksIGZ3b3JkLCBNQVhXTEVOKTsKCSAgICB3b3JkID0gZndvcmQ7Cgl9CgojaWZkZWYgRkVBVF9NQllURQoJaWYgKGhhc19tYnl0ZSkKCSAgICBzcGVsbF9zb3VuZGZvbGRfd3NhbChzbGFuZywgd29yZCwgcmVzKTsKCWVsc2UKI2VuZGlmCgkgICAgc3BlbGxfc291bmRmb2xkX3NhbChzbGFuZywgd29yZCwgcmVzKTsKICAgIH0KfQoKLyoKICogUGVyZm9ybSBzb3VuZCBmb2xkaW5nIG9mICJpbndvcmQiIGludG8gInJlcyIgYWNjb3JkaW5nIHRvIFNPRk9GUk9NIGFuZAogKiBTT0ZPVE8gbGluZXMuCiAqLwogICAgc3RhdGljIHZvaWQKc3BlbGxfc291bmRmb2xkX3NvZm8oc2xhbmcsIGlud29yZCwgcmVzKQogICAgc2xhbmdfVAkqc2xhbmc7CiAgICBjaGFyX3UJKmlud29yZDsKICAgIGNoYXJfdQkqcmVzOwp7CiAgICBjaGFyX3UJKnM7CiAgICBpbnQJCXJpID0gMDsKICAgIGludAkJYzsKCiNpZmRlZiBGRUFUX01CWVRFCiAgICBpZiAoaGFzX21ieXRlKQogICAgewoJaW50CXByZXZjID0gMDsKCWludAkqaXA7CgoJLyogVGhlIHNsX3NhbF9maXJzdFtdIHRhYmxlIGNvbnRhaW5zIHRoZSB0cmFuc2xhdGlvbiBmb3IgY2hhcnMgdXAgdG8KCSAqIDI1NSwgc2xfc2FsIHRoZSByZXN0LiAqLwoJZm9yIChzID0gaW53b3JkOyAqcyAhPSBOVUw7ICkKCXsKCSAgICBjID0gbWJfY3B0cjJjaGFyX2Fkdigmcyk7CgkgICAgaWYgKGVuY191dGY4ID8gdXRmX2NsYXNzKGMpID09IDAgOiB2aW1faXN3aGl0ZShjKSkKCQljID0gJyAnOwoJICAgIGVsc2UgaWYgKGMgPCAyNTYpCgkJYyA9IHNsYW5nLT5zbF9zYWxfZmlyc3RbY107CgkgICAgZWxzZQoJICAgIHsKCQlpcCA9ICgoaW50ICoqKXNsYW5nLT5zbF9zYWwuZ2FfZGF0YSlbYyAmIDB4ZmZdOwoJCWlmIChpcCA9PSBOVUxMKQkJLyogZW1wdHkgbGlzdCwgY2FuJ3QgbWF0Y2ggKi8KCQkgICAgYyA9IE5VTDsKCQllbHNlCgkJICAgIGZvciAoOzspCQkvKiBmaW5kICJjIiBpbiB0aGUgbGlzdCAqLwoJCSAgICB7CgkJCWlmICgqaXAgPT0gMCkJLyogbm90IGZvdW5kICovCgkJCXsKCQkJICAgIGMgPSBOVUw7CgkJCSAgICBicmVhazsKCQkJfQoJCQlpZiAoKmlwID09IGMpCS8qIG1hdGNoISAqLwoJCQl7CgkJCSAgICBjID0gaXBbMV07CgkJCSAgICBicmVhazsKCQkJfQoJCQlpcCArPSAyOwoJCSAgICB9CgkgICAgfQoKCSAgICBpZiAoYyAhPSBOVUwgJiYgYyAhPSBwcmV2YykKCSAgICB7CgkJcmkgKz0gbWJfY2hhcjJieXRlcyhjLCByZXMgKyByaSk7CgkJaWYgKHJpICsgTUJfTUFYQllURVMgPiBNQVhXTEVOKQoJCSAgICBicmVhazsKCQlwcmV2YyA9IGM7CgkgICAgfQoJfQogICAgfQogICAgZWxzZQojZW5kaWYKICAgIHsKCS8qIFRoZSBzbF9zYWxfZmlyc3RbXSB0YWJsZSBjb250YWlucyB0aGUgdHJhbnNsYXRpb24uICovCglmb3IgKHMgPSBpbndvcmQ7IChjID0gKnMpICE9IE5VTDsgKytzKQoJewoJICAgIGlmICh2aW1faXN3aGl0ZShjKSkKCQljID0gJyAnOwoJICAgIGVsc2UKCQljID0gc2xhbmctPnNsX3NhbF9maXJzdFtjXTsKCSAgICBpZiAoYyAhPSBOVUwgJiYgKHJpID09IDAgfHwgcmVzW3JpIC0gMV0gIT0gYykpCgkJcmVzW3JpKytdID0gYzsKCX0KICAgIH0KCiAgICByZXNbcmldID0gTlVMOwp9CgogICAgc3RhdGljIHZvaWQKc3BlbGxfc291bmRmb2xkX3NhbChzbGFuZywgaW53b3JkLCByZXMpCiAgICBzbGFuZ19UCSpzbGFuZzsKICAgIGNoYXJfdQkqaW53b3JkOwogICAgY2hhcl91CSpyZXM7CnsKICAgIHNhbGl0ZW1fVAkqc21wOwogICAgY2hhcl91CXdvcmRbTUFYV0xFTl07CiAgICBjaGFyX3UJKnMgPSBpbndvcmQ7CiAgICBjaGFyX3UJKnQ7CiAgICBjaGFyX3UJKnBmOwogICAgaW50CQlpLCBqLCB6OwogICAgaW50CQlyZXNsZW47CiAgICBpbnQJCW4sIGsgPSAwOwogICAgaW50CQl6MDsKICAgIGludAkJazA7CiAgICBpbnQJCW4wOwogICAgaW50CQljOwogICAgaW50CQlwcmk7CiAgICBpbnQJCXAwID0gLTMzMzsKICAgIGludAkJYzA7CgogICAgLyogUmVtb3ZlIGFjY2VudHMsIGlmIHdhbnRlZC4gIFdlIGFjdHVhbGx5IHJlbW92ZSBhbGwgbm9uLXdvcmQgY2hhcmFjdGVycy4KICAgICAqIEJ1dCBrZWVwIHdoaXRlIHNwYWNlLiAgV2UgbmVlZCBhIGNvcHksIHRoZSB3b3JkIG1heSBiZSBjaGFuZ2VkIGhlcmUuICovCiAgICBpZiAoc2xhbmctPnNsX3JlbV9hY2NlbnRzKQogICAgewoJdCA9IHdvcmQ7Cgl3aGlsZSAoKnMgIT0gTlVMKQoJewoJICAgIGlmICh2aW1faXN3aGl0ZSgqcykpCgkgICAgewoJCSp0KysgPSAnICc7CgkJcyA9IHNraXB3aGl0ZShzKTsKCSAgICB9CgkgICAgZWxzZQoJICAgIHsKCQlpZiAoc3BlbGxfaXN3b3JkcF9ubXcocykpCgkJICAgICp0KysgPSAqczsKCQkrK3M7CgkgICAgfQoJfQoJKnQgPSBOVUw7CiAgICB9CiAgICBlbHNlCglTVFJDUFkod29yZCwgcyk7CgogICAgc21wID0gKHNhbGl0ZW1fVCAqKXNsYW5nLT5zbF9zYWwuZ2FfZGF0YTsKCiAgICAvKgogICAgICogVGhpcyBjb21lcyBmcm9tIEFzcGVsbCBwaG9uZXQuY3BwLiAgQ29udmVydGVkIGZyb20gQysrIHRvIEMuCiAgICAgKiBDaGFuZ2VkIHRvIGtlZXAgc3BhY2VzLgogICAgICovCiAgICBpID0gcmVzbGVuID0geiA9IDA7CiAgICB3aGlsZSAoKGMgPSB3b3JkW2ldKSAhPSBOVUwpCiAgICB7CgkvKiBTdGFydCB3aXRoIHRoZSBmaXJzdCBydWxlIHRoYXQgaGFzIHRoZSBjaGFyYWN0ZXIgaW4gdGhlIHdvcmQuICovCgluID0gc2xhbmctPnNsX3NhbF9maXJzdFtjXTsKCXowID0gMDsKCglpZiAobiA+PSAwKQoJewoJICAgIC8qIGNoZWNrIGFsbCBydWxlcyBmb3IgdGhlIHNhbWUgbGV0dGVyICovCgkgICAgZm9yICg7IChzID0gc21wW25dLnNtX2xlYWQpWzBdID09IGM7ICsrbikKCSAgICB7CgkJLyogUXVpY2tseSBza2lwIGVudHJpZXMgdGhhdCBkb24ndCBtYXRjaCB0aGUgd29yZC4gIE1vc3QKCQkgKiBlbnRyaWVzIGFyZSBsZXNzIHRoZW4gdGhyZWUgY2hhcnMsIG9wdGltaXplIGZvciB0aGF0LiAqLwoJCWsgPSBzbXBbbl0uc21fbGVhZGxlbjsKCQlpZiAoayA+IDEpCgkJewoJCSAgICBpZiAod29yZFtpICsgMV0gIT0gc1sxXSkKCQkJY29udGludWU7CgkJICAgIGlmIChrID4gMikKCQkgICAgewoJCQlmb3IgKGogPSAyOyBqIDwgazsgKytqKQoJCQkgICAgaWYgKHdvcmRbaSArIGpdICE9IHNbal0pCgkJCQlicmVhazsKCQkJaWYgKGogPCBrKQoJCQkgICAgY29udGludWU7CgkJICAgIH0KCQl9CgoJCWlmICgocGYgPSBzbXBbbl0uc21fb25lb2YpICE9IE5VTEwpCgkJewoJCSAgICAvKiBDaGVjayBmb3IgbWF0Y2ggd2l0aCBvbmUgb2YgdGhlIGNoYXJzIGluICJzbV9vbmVvZiIuICovCgkJICAgIHdoaWxlICgqcGYgIT0gTlVMICYmICpwZiAhPSB3b3JkW2kgKyBrXSkKCQkJKytwZjsKCQkgICAgaWYgKCpwZiA9PSBOVUwpCgkJCWNvbnRpbnVlOwoJCSAgICArK2s7CgkJfQoJCXMgPSBzbXBbbl0uc21fcnVsZXM7CgkJcHJpID0gNTsgICAgLyogZGVmYXVsdCBwcmlvcml0eSAqLwoKCQlwMCA9ICpzOwoJCWswID0gazsKCQl3aGlsZSAoKnMgPT0gJy0nICYmIGsgPiAxKQoJCXsKCQkgICAgay0tOwoJCSAgICBzKys7CgkJfQoJCWlmICgqcyA9PSAnPCcpCgkJICAgIHMrKzsKCQlpZiAoVklNX0lTRElHSVQoKnMpKQoJCXsKCQkgICAgLyogZGV0ZXJtaW5lIHByaW9yaXR5ICovCgkJICAgIHByaSA9ICpzIC0gJzAnOwoJCSAgICBzKys7CgkJfQoJCWlmICgqcyA9PSAnXicgJiYgKihzICsgMSkgPT0gJ14nKQoJCSAgICBzKys7CgoJCWlmICgqcyA9PSBOVUwKCQkJfHwgKCpzID09ICdeJwoJCQkgICAgJiYgKGkgPT0gMCB8fCAhKHdvcmRbaSAtIDFdID09ICcgJwoJCQkJICAgICAgfHwgc3BlbGxfaXN3b3JkcCh3b3JkICsgaSAtIDEsIGN1cmJ1ZikpKQoJCQkgICAgJiYgKCoocyArIDEpICE9ICckJwoJCQkJfHwgKCFzcGVsbF9pc3dvcmRwKHdvcmQgKyBpICsgazAsIGN1cmJ1ZikpKSkKCQkJfHwgKCpzID09ICckJyAmJiBpID4gMAoJCQkgICAgJiYgc3BlbGxfaXN3b3JkcCh3b3JkICsgaSAtIDEsIGN1cmJ1ZikKCQkJICAgICYmICghc3BlbGxfaXN3b3JkcCh3b3JkICsgaSArIGswLCBjdXJidWYpKSkpCgkJewoJCSAgICAvKiBzZWFyY2ggZm9yIGZvbGxvd3VwIHJ1bGVzLCBpZjogICAgKi8KCQkgICAgLyogZm9sbG93dXAgYW5kIGsgPiAxICBhbmQgIE5PICctJyBpbiBzZWFyY2hzdHJpbmcgKi8KCQkgICAgYzAgPSB3b3JkW2kgKyBrIC0gMV07CgkJICAgIG4wID0gc2xhbmctPnNsX3NhbF9maXJzdFtjMF07CgoJCSAgICBpZiAoc2xhbmctPnNsX2ZvbGxvd3VwICYmIGsgPiAxICYmIG4wID49IDAKCQkJCQkgICAmJiBwMCAhPSAnLScgJiYgd29yZFtpICsga10gIT0gTlVMKQoJCSAgICB7CgkJCS8qIHRlc3QgZm9sbG93LXVwIHJ1bGUgZm9yICJ3b3JkW2kgKyBrXSIgKi8KCQkJZm9yICggOyAocyA9IHNtcFtuMF0uc21fbGVhZClbMF0gPT0gYzA7ICsrbjApCgkJCXsKCQkJICAgIC8qIFF1aWNrbHkgc2tpcCBlbnRyaWVzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIHdvcmQuCgkJCSAgICAgKiAqLwoJCQkgICAgazAgPSBzbXBbbjBdLnNtX2xlYWRsZW47CgkJCSAgICBpZiAoazAgPiAxKQoJCQkgICAgewoJCQkJaWYgKHdvcmRbaSArIGtdICE9IHNbMV0pCgkJCQkgICAgY29udGludWU7CgkJCQlpZiAoazAgPiAyKQoJCQkJewoJCQkJICAgIHBmID0gd29yZCArIGkgKyBrICsgMTsKCQkJCSAgICBmb3IgKGogPSAyOyBqIDwgazA7ICsraikKCQkJCQlpZiAoKnBmKysgIT0gc1tqXSkKCQkJCQkgICAgYnJlYWs7CgkJCQkgICAgaWYgKGogPCBrMCkKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJICAgIH0KCQkJICAgIGswICs9IGsgLSAxOwoKCQkJICAgIGlmICgocGYgPSBzbXBbbjBdLnNtX29uZW9mKSAhPSBOVUxMKQoJCQkgICAgewoJCQkJLyogQ2hlY2sgZm9yIG1hdGNoIHdpdGggb25lIG9mIHRoZSBjaGFycyBpbgoJCQkJICogInNtX29uZW9mIi4gKi8KCQkJCXdoaWxlICgqcGYgIT0gTlVMICYmICpwZiAhPSB3b3JkW2kgKyBrMF0pCgkJCQkgICAgKytwZjsKCQkJCWlmICgqcGYgPT0gTlVMKQoJCQkJICAgIGNvbnRpbnVlOwoJCQkJKytrMDsKCQkJICAgIH0KCgkJCSAgICBwMCA9IDU7CgkJCSAgICBzID0gc21wW24wXS5zbV9ydWxlczsKCQkJICAgIHdoaWxlICgqcyA9PSAnLScpCgkJCSAgICB7CgkJCQkvKiAiazAiIGdldHMgTk9UIHJlZHVjZWQgYmVjYXVzZQoJCQkJICogImlmIChrMCA9PSBrKSIgKi8KCQkJCXMrKzsKCQkJICAgIH0KCQkJICAgIGlmICgqcyA9PSAnPCcpCgkJCQlzKys7CgkJCSAgICBpZiAoVklNX0lTRElHSVQoKnMpKQoJCQkgICAgewoJCQkJcDAgPSAqcyAtICcwJzsKCQkJCXMrKzsKCQkJICAgIH0KCgkJCSAgICBpZiAoKnMgPT0gTlVMCgkJCQkgICAgLyogKnMgPT0gJ14nIGN1dHMgKi8KCQkJCSAgICB8fCAoKnMgPT0gJyQnCgkJCQkJICAgICYmICFzcGVsbF9pc3dvcmRwKHdvcmQgKyBpICsgazAsCgkJCQkJCQkJICAgICBjdXJidWYpKSkKCQkJICAgIHsKCQkJCWlmIChrMCA9PSBrKQoJCQkJICAgIC8qIHRoaXMgaXMganVzdCBhIHBpZWNlIG9mIHRoZSBzdHJpbmcgKi8KCQkJCSAgICBjb250aW51ZTsKCgkJCQlpZiAocDAgPCBwcmkpCgkJCQkgICAgLyogcHJpb3JpdHkgdG9vIGxvdyAqLwoJCQkJICAgIGNvbnRpbnVlOwoJCQkJLyogcnVsZSBmaXRzOyBzdG9wIHNlYXJjaCAqLwoJCQkJYnJlYWs7CgkJCSAgICB9CgkJCX0KCgkJCWlmIChwMCA+PSBwcmkgJiYgc21wW24wXS5zbV9sZWFkWzBdID09IGMwKQoJCQkgICAgY29udGludWU7CgkJICAgIH0KCgkJICAgIC8qIHJlcGxhY2Ugc3RyaW5nICovCgkJICAgIHMgPSBzbXBbbl0uc21fdG87CgkJICAgIGlmIChzID09IE5VTEwpCgkJCXMgPSAoY2hhcl91ICopIiI7CgkJICAgIHBmID0gc21wW25dLnNtX3J1bGVzOwoJCSAgICBwMCA9ICh2aW1fc3RyY2hyKHBmLCAnPCcpICE9IE5VTEwpID8gMSA6IDA7CgkJICAgIGlmIChwMCA9PSAxICYmIHogPT0gMCkKCQkgICAgewoJCQkvKiBydWxlIHdpdGggJzwnIGlzIHVzZWQgKi8KCQkJaWYgKHJlc2xlbiA+IDAgJiYgKnMgIT0gTlVMICYmIChyZXNbcmVzbGVuIC0gMV0gPT0gYwoJCQkJCQkgICAgfHwgcmVzW3Jlc2xlbiAtIDFdID09ICpzKSkKCQkJICAgIHJlc2xlbi0tOwoJCQl6MCA9IDE7CgkJCXogPSAxOwoJCQlrMCA9IDA7CgkJCXdoaWxlICgqcyAhPSBOVUwgJiYgd29yZFtpICsgazBdICE9IE5VTCkKCQkJewoJCQkgICAgd29yZFtpICsgazBdID0gKnM7CgkJCSAgICBrMCsrOwoJCQkgICAgcysrOwoJCQl9CgkJCWlmIChrID4gazApCgkJCSAgICBtY2hfbWVtbW92ZSh3b3JkICsgaSArIGswLCB3b3JkICsgaSArIGssCgkJCQkJCSAgICBTVFJMRU4od29yZCArIGkgKyBrKSArIDEpOwoKCQkJLyogbmV3ICJhY3R1YWwgbGV0dGVyIiAqLwoJCQljID0gd29yZFtpXTsKCQkgICAgfQoJCSAgICBlbHNlCgkJICAgIHsKCQkJLyogbm8gJzwnIHJ1bGUgdXNlZCAqLwoJCQlpICs9IGsgLSAxOwoJCQl6ID0gMDsKCQkJd2hpbGUgKCpzICE9IE5VTCAmJiBzWzFdICE9IE5VTCAmJiByZXNsZW4gPCBNQVhXTEVOKQoJCQl7CgkJCSAgICBpZiAocmVzbGVuID09IDAgfHwgcmVzW3Jlc2xlbiAtIDFdICE9ICpzKQoJCQkJcmVzW3Jlc2xlbisrXSA9ICpzOwoJCQkgICAgcysrOwoJCQl9CgkJCS8qIG5ldyAiYWN0dWFsIGxldHRlciIgKi8KCQkJYyA9ICpzOwoJCQlpZiAoc3Ryc3RyKChjaGFyICopcGYsICJeXiIpICE9IE5VTEwpCgkJCXsKCQkJICAgIGlmIChjICE9IE5VTCkKCQkJCXJlc1tyZXNsZW4rK10gPSBjOwoJCQkgICAgbWNoX21lbW1vdmUod29yZCwgd29yZCArIGkgKyAxLAoJCQkJCQkgICAgU1RSTEVOKHdvcmQgKyBpICsgMSkgKyAxKTsKCQkJICAgIGkgPSAwOwoJCQkgICAgejAgPSAxOwoJCQl9CgkJICAgIH0KCQkgICAgYnJlYWs7CgkJfQoJICAgIH0KCX0KCWVsc2UgaWYgKHZpbV9pc3doaXRlKGMpKQoJewoJICAgIGMgPSAnICc7CgkgICAgayA9IDE7Cgl9CgoJaWYgKHowID09IDApCgl7CgkgICAgaWYgKGsgJiYgIXAwICYmIHJlc2xlbiA8IE1BWFdMRU4gJiYgYyAhPSBOVUwKCQkgICAgJiYgKCFzbGFuZy0+c2xfY29sbGFwc2UgfHwgcmVzbGVuID09IDAKCQkJCQkJICAgICB8fCByZXNbcmVzbGVuIC0gMV0gIT0gYykpCgkJLyogY29uZGVuc2Ugb25seSBkb3VibGUgbGV0dGVycyAqLwoJCXJlc1tyZXNsZW4rK10gPSBjOwoKCSAgICBpKys7CgkgICAgeiA9IDA7CgkgICAgayA9IDA7Cgl9CiAgICB9CgogICAgcmVzW3Jlc2xlbl0gPSBOVUw7Cn0KCiNpZmRlZiBGRUFUX01CWVRFCi8qCiAqIFR1cm4gImlud29yZCIgaW50byBpdHMgc291bmQtYS1saWtlIGVxdWl2YWxlbnQgaW4gInJlc1tNQVhXTEVOXSIuCiAqIE11bHRpLWJ5dGUgdmVyc2lvbiBvZiBzcGVsbF9zb3VuZGZvbGQoKS4KICovCiAgICBzdGF0aWMgdm9pZApzcGVsbF9zb3VuZGZvbGRfd3NhbChzbGFuZywgaW53b3JkLCByZXMpCiAgICBzbGFuZ19UCSpzbGFuZzsKICAgIGNoYXJfdQkqaW53b3JkOwogICAgY2hhcl91CSpyZXM7CnsKICAgIHNhbGl0ZW1fVAkqc21wID0gKHNhbGl0ZW1fVCAqKXNsYW5nLT5zbF9zYWwuZ2FfZGF0YTsKICAgIGludAkJd29yZFtNQVhXTEVOXTsKICAgIGludAkJd3Jlc1tNQVhXTEVOXTsKICAgIGludAkJbDsKICAgIGNoYXJfdQkqczsKICAgIGludAkJKndzOwogICAgY2hhcl91CSp0OwogICAgaW50CQkqcGY7CiAgICBpbnQJCWksIGosIHo7CiAgICBpbnQJCXJlc2xlbjsKICAgIGludAkJbiwgayA9IDA7CiAgICBpbnQJCXowOwogICAgaW50CQlrMDsKICAgIGludAkJbjA7CiAgICBpbnQJCWM7CiAgICBpbnQJCXByaTsKICAgIGludAkJcDAgPSAtMzMzOwogICAgaW50CQljMDsKICAgIGludAkJZGlkX3doaXRlID0gRkFMU0U7CgogICAgLyoKICAgICAqIENvbnZlcnQgdGhlIG11bHRpLWJ5dGUgc3RyaW5nIHRvIGEgd2lkZS1jaGFyYWN0ZXIgc3RyaW5nLgogICAgICogUmVtb3ZlIGFjY2VudHMsIGlmIHdhbnRlZC4gIFdlIGFjdHVhbGx5IHJlbW92ZSBhbGwgbm9uLXdvcmQgY2hhcmFjdGVycy4KICAgICAqIEJ1dCBrZWVwIHdoaXRlIHNwYWNlLgogICAgICovCiAgICBuID0gMDsKICAgIGZvciAocyA9IGlud29yZDsgKnMgIT0gTlVMOyApCiAgICB7Cgl0ID0gczsKCWMgPSBtYl9jcHRyMmNoYXJfYWR2KCZzKTsKCWlmIChzbGFuZy0+c2xfcmVtX2FjY2VudHMpCgl7CgkgICAgaWYgKGVuY191dGY4ID8gdXRmX2NsYXNzKGMpID09IDAgOiB2aW1faXN3aGl0ZShjKSkKCSAgICB7CgkJaWYgKGRpZF93aGl0ZSkKCQkgICAgY29udGludWU7CgkJYyA9ICcgJzsKCQlkaWRfd2hpdGUgPSBUUlVFOwoJICAgIH0KCSAgICBlbHNlCgkgICAgewoJCWRpZF93aGl0ZSA9IEZBTFNFOwoJCWlmICghc3BlbGxfaXN3b3JkcF9ubXcodCkpCgkJICAgIGNvbnRpbnVlOwoJICAgIH0KCX0KCXdvcmRbbisrXSA9IGM7CiAgICB9CiAgICB3b3JkW25dID0gTlVMOwoKICAgIC8qCiAgICAgKiBUaGlzIGNvbWVzIGZyb20gQXNwZWxsIHBob25ldC5jcHAuCiAgICAgKiBDb252ZXJ0ZWQgZnJvbSBDKysgdG8gQy4gIEFkZGVkIHN1cHBvcnQgZm9yIG11bHRpLWJ5dGUgY2hhcnMuCiAgICAgKiBDaGFuZ2VkIHRvIGtlZXAgc3BhY2VzLgogICAgICovCiAgICBpID0gcmVzbGVuID0geiA9IDA7CiAgICB3aGlsZSAoKGMgPSB3b3JkW2ldKSAhPSBOVUwpCiAgICB7CgkvKiBTdGFydCB3aXRoIHRoZSBmaXJzdCBydWxlIHRoYXQgaGFzIHRoZSBjaGFyYWN0ZXIgaW4gdGhlIHdvcmQuICovCgluID0gc2xhbmctPnNsX3NhbF9maXJzdFtjICYgMHhmZl07Cgl6MCA9IDA7CgoJaWYgKG4gPj0gMCkKCXsKCSAgICAvKiBjaGVjayBhbGwgcnVsZXMgZm9yIHRoZSBzYW1lIGluZGV4IGJ5dGUgKi8KCSAgICBmb3IgKDsgKCh3cyA9IHNtcFtuXS5zbV9sZWFkX3cpWzBdICYgMHhmZikgPT0gKGMgJiAweGZmKTsgKytuKQoJICAgIHsKCQkvKiBRdWlja2x5IHNraXAgZW50cmllcyB0aGF0IGRvbid0IG1hdGNoIHRoZSB3b3JkLiAgTW9zdAoJCSAqIGVudHJpZXMgYXJlIGxlc3MgdGhlbiB0aHJlZSBjaGFycywgb3B0aW1pemUgZm9yIHRoYXQuICovCgkJaWYgKGMgIT0gd3NbMF0pCgkJICAgIGNvbnRpbnVlOwoJCWsgPSBzbXBbbl0uc21fbGVhZGxlbjsKCQlpZiAoayA+IDEpCgkJewoJCSAgICBpZiAod29yZFtpICsgMV0gIT0gd3NbMV0pCgkJCWNvbnRpbnVlOwoJCSAgICBpZiAoayA+IDIpCgkJICAgIHsKCQkJZm9yIChqID0gMjsgaiA8IGs7ICsraikKCQkJICAgIGlmICh3b3JkW2kgKyBqXSAhPSB3c1tqXSkKCQkJCWJyZWFrOwoJCQlpZiAoaiA8IGspCgkJCSAgICBjb250aW51ZTsKCQkgICAgfQoJCX0KCgkJaWYgKChwZiA9IHNtcFtuXS5zbV9vbmVvZl93KSAhPSBOVUxMKQoJCXsKCQkgICAgLyogQ2hlY2sgZm9yIG1hdGNoIHdpdGggb25lIG9mIHRoZSBjaGFycyBpbiAic21fb25lb2YiLiAqLwoJCSAgICB3aGlsZSAoKnBmICE9IE5VTCAmJiAqcGYgIT0gd29yZFtpICsga10pCgkJCSsrcGY7CgkJICAgIGlmICgqcGYgPT0gTlVMKQoJCQljb250aW51ZTsKCQkgICAgKytrOwoJCX0KCQlzID0gc21wW25dLnNtX3J1bGVzOwoJCXByaSA9IDU7ICAgIC8qIGRlZmF1bHQgcHJpb3JpdHkgKi8KCgkJcDAgPSAqczsKCQlrMCA9IGs7CgkJd2hpbGUgKCpzID09ICctJyAmJiBrID4gMSkKCQl7CgkJICAgIGstLTsKCQkgICAgcysrOwoJCX0KCQlpZiAoKnMgPT0gJzwnKQoJCSAgICBzKys7CgkJaWYgKFZJTV9JU0RJR0lUKCpzKSkKCQl7CgkJICAgIC8qIGRldGVybWluZSBwcmlvcml0eSAqLwoJCSAgICBwcmkgPSAqcyAtICcwJzsKCQkgICAgcysrOwoJCX0KCQlpZiAoKnMgPT0gJ14nICYmICoocyArIDEpID09ICdeJykKCQkgICAgcysrOwoKCQlpZiAoKnMgPT0gTlVMCgkJCXx8ICgqcyA9PSAnXicKCQkJICAgICYmIChpID09IDAgfHwgISh3b3JkW2kgLSAxXSA9PSAnICcKCQkJCSAgICB8fCBzcGVsbF9pc3dvcmRwX3cod29yZCArIGkgLSAxLCBjdXJidWYpKSkKCQkJICAgICYmICgqKHMgKyAxKSAhPSAnJCcKCQkJCXx8ICghc3BlbGxfaXN3b3JkcF93KHdvcmQgKyBpICsgazAsIGN1cmJ1ZikpKSkKCQkJfHwgKCpzID09ICckJyAmJiBpID4gMAoJCQkgICAgJiYgc3BlbGxfaXN3b3JkcF93KHdvcmQgKyBpIC0gMSwgY3VyYnVmKQoJCQkgICAgJiYgKCFzcGVsbF9pc3dvcmRwX3cod29yZCArIGkgKyBrMCwgY3VyYnVmKSkpKQoJCXsKCQkgICAgLyogc2VhcmNoIGZvciBmb2xsb3d1cCBydWxlcywgaWY6ICAgICovCgkJICAgIC8qIGZvbGxvd3VwIGFuZCBrID4gMSAgYW5kICBOTyAnLScgaW4gc2VhcmNoc3RyaW5nICovCgkJICAgIGMwID0gd29yZFtpICsgayAtIDFdOwoJCSAgICBuMCA9IHNsYW5nLT5zbF9zYWxfZmlyc3RbYzAgJiAweGZmXTsKCgkJICAgIGlmIChzbGFuZy0+c2xfZm9sbG93dXAgJiYgayA+IDEgJiYgbjAgPj0gMAoJCQkJCSAgICYmIHAwICE9ICctJyAmJiB3b3JkW2kgKyBrXSAhPSBOVUwpCgkJICAgIHsKCQkJLyogVGVzdCBmb2xsb3ctdXAgcnVsZSBmb3IgIndvcmRbaSArIGtdIjsgbG9vcCBvdmVyCgkJCSAqIGFsbCBlbnRyaWVzIHdpdGggdGhlIHNhbWUgaW5kZXggYnl0ZS4gKi8KCQkJZm9yICggOyAoKHdzID0gc21wW24wXS5zbV9sZWFkX3cpWzBdICYgMHhmZikKCQkJCQkJCSA9PSAoYzAgJiAweGZmKTsgKytuMCkKCQkJewoJCQkgICAgLyogUXVpY2tseSBza2lwIGVudHJpZXMgdGhhdCBkb24ndCBtYXRjaCB0aGUgd29yZC4KCQkJICAgICAqLwoJCQkgICAgaWYgKGMwICE9IHdzWzBdKQoJCQkJY29udGludWU7CgkJCSAgICBrMCA9IHNtcFtuMF0uc21fbGVhZGxlbjsKCQkJICAgIGlmIChrMCA+IDEpCgkJCSAgICB7CgkJCQlpZiAod29yZFtpICsga10gIT0gd3NbMV0pCgkJCQkgICAgY29udGludWU7CgkJCQlpZiAoazAgPiAyKQoJCQkJewoJCQkJICAgIHBmID0gd29yZCArIGkgKyBrICsgMTsKCQkJCSAgICBmb3IgKGogPSAyOyBqIDwgazA7ICsraikKCQkJCQlpZiAoKnBmKysgIT0gd3Nbal0pCgkJCQkJICAgIGJyZWFrOwoJCQkJICAgIGlmIChqIDwgazApCgkJCQkJY29udGludWU7CgkJCQl9CgkJCSAgICB9CgkJCSAgICBrMCArPSBrIC0gMTsKCgkJCSAgICBpZiAoKHBmID0gc21wW24wXS5zbV9vbmVvZl93KSAhPSBOVUxMKQoJCQkgICAgewoJCQkJLyogQ2hlY2sgZm9yIG1hdGNoIHdpdGggb25lIG9mIHRoZSBjaGFycyBpbgoJCQkJICogInNtX29uZW9mIi4gKi8KCQkJCXdoaWxlICgqcGYgIT0gTlVMICYmICpwZiAhPSB3b3JkW2kgKyBrMF0pCgkJCQkgICAgKytwZjsKCQkJCWlmICgqcGYgPT0gTlVMKQoJCQkJICAgIGNvbnRpbnVlOwoJCQkJKytrMDsKCQkJICAgIH0KCgkJCSAgICBwMCA9IDU7CgkJCSAgICBzID0gc21wW24wXS5zbV9ydWxlczsKCQkJICAgIHdoaWxlICgqcyA9PSAnLScpCgkJCSAgICB7CgkJCQkvKiAiazAiIGdldHMgTk9UIHJlZHVjZWQgYmVjYXVzZQoJCQkJICogImlmIChrMCA9PSBrKSIgKi8KCQkJCXMrKzsKCQkJICAgIH0KCQkJICAgIGlmICgqcyA9PSAnPCcpCgkJCQlzKys7CgkJCSAgICBpZiAoVklNX0lTRElHSVQoKnMpKQoJCQkgICAgewoJCQkJcDAgPSAqcyAtICcwJzsKCQkJCXMrKzsKCQkJICAgIH0KCgkJCSAgICBpZiAoKnMgPT0gTlVMCgkJCQkgICAgLyogKnMgPT0gJ14nIGN1dHMgKi8KCQkJCSAgICB8fCAoKnMgPT0gJyQnCgkJCQkJICYmICFzcGVsbF9pc3dvcmRwX3cod29yZCArIGkgKyBrMCwKCQkJCQkJCQkgICAgIGN1cmJ1ZikpKQoJCQkgICAgewoJCQkJaWYgKGswID09IGspCgkJCQkgICAgLyogdGhpcyBpcyBqdXN0IGEgcGllY2Ugb2YgdGhlIHN0cmluZyAqLwoJCQkJICAgIGNvbnRpbnVlOwoKCQkJCWlmIChwMCA8IHByaSkKCQkJCSAgICAvKiBwcmlvcml0eSB0b28gbG93ICovCgkJCQkgICAgY29udGludWU7CgkJCQkvKiBydWxlIGZpdHM7IHN0b3Agc2VhcmNoICovCgkJCQlicmVhazsKCQkJICAgIH0KCQkJfQoKCQkJaWYgKHAwID49IHByaSAmJiAoc21wW24wXS5zbV9sZWFkX3dbMF0gJiAweGZmKQoJCQkJCQkJICAgICAgID09IChjMCAmIDB4ZmYpKQoJCQkgICAgY29udGludWU7CgkJICAgIH0KCgkJICAgIC8qIHJlcGxhY2Ugc3RyaW5nICovCgkJICAgIHdzID0gc21wW25dLnNtX3RvX3c7CgkJICAgIHMgPSBzbXBbbl0uc21fcnVsZXM7CgkJICAgIHAwID0gKHZpbV9zdHJjaHIocywgJzwnKSAhPSBOVUxMKSA/IDEgOiAwOwoJCSAgICBpZiAocDAgPT0gMSAmJiB6ID09IDApCgkJICAgIHsKCQkJLyogcnVsZSB3aXRoICc8JyBpcyB1c2VkICovCgkJCWlmIChyZXNsZW4gPiAwICYmIHdzICE9IE5VTEwgJiYgKndzICE9IE5VTAoJCQkJJiYgKHdyZXNbcmVzbGVuIC0gMV0gPT0gYwoJCQkJCQkgICAgfHwgd3Jlc1tyZXNsZW4gLSAxXSA9PSAqd3MpKQoJCQkgICAgcmVzbGVuLS07CgkJCXowID0gMTsKCQkJeiA9IDE7CgkJCWswID0gMDsKCQkJaWYgKHdzICE9IE5VTEwpCgkJCSAgICB3aGlsZSAoKndzICE9IE5VTCAmJiB3b3JkW2kgKyBrMF0gIT0gTlVMKQoJCQkgICAgewoJCQkJd29yZFtpICsgazBdID0gKndzOwoJCQkJazArKzsKCQkJCXdzKys7CgkJCSAgICB9CgkJCWlmIChrID4gazApCgkJCSAgICBtY2hfbWVtbW92ZSh3b3JkICsgaSArIGswLCB3b3JkICsgaSArIGssCgkJCQkgICAgc2l6ZW9mKGludCkgKiAoU1RSTEVOKHdvcmQgKyBpICsgaykgKyAxKSk7CgoJCQkvKiBuZXcgImFjdHVhbCBsZXR0ZXIiICovCgkJCWMgPSB3b3JkW2ldOwoJCSAgICB9CgkJICAgIGVsc2UKCQkgICAgewoJCQkvKiBubyAnPCcgcnVsZSB1c2VkICovCgkJCWkgKz0gayAtIDE7CgkJCXogPSAwOwoJCQlpZiAod3MgIT0gTlVMTCkKCQkJICAgIHdoaWxlICgqd3MgIT0gTlVMICYmIHdzWzFdICE9IE5VTAoJCQkJCQkJICAmJiByZXNsZW4gPCBNQVhXTEVOKQoJCQkgICAgewoJCQkJaWYgKHJlc2xlbiA9PSAwIHx8IHdyZXNbcmVzbGVuIC0gMV0gIT0gKndzKQoJCQkJICAgIHdyZXNbcmVzbGVuKytdID0gKndzOwoJCQkJd3MrKzsKCQkJICAgIH0KCQkJLyogbmV3ICJhY3R1YWwgbGV0dGVyIiAqLwoJCQlpZiAod3MgPT0gTlVMTCkKCQkJICAgIGMgPSBOVUw7CgkJCWVsc2UKCQkJICAgIGMgPSAqd3M7CgkJCWlmIChzdHJzdHIoKGNoYXIgKilzLCAiXl4iKSAhPSBOVUxMKQoJCQl7CgkJCSAgICBpZiAoYyAhPSBOVUwpCgkJCQl3cmVzW3Jlc2xlbisrXSA9IGM7CgkJCSAgICBtY2hfbWVtbW92ZSh3b3JkLCB3b3JkICsgaSArIDEsCgkJCQkgICAgc2l6ZW9mKGludCkgKiAoU1RSTEVOKHdvcmQgKyBpICsgMSkgKyAxKSk7CgkJCSAgICBpID0gMDsKCQkJICAgIHowID0gMTsKCQkJfQoJCSAgICB9CgkJICAgIGJyZWFrOwoJCX0KCSAgICB9Cgl9CgllbHNlIGlmICh2aW1faXN3aGl0ZShjKSkKCXsKCSAgICBjID0gJyAnOwoJICAgIGsgPSAxOwoJfQoKCWlmICh6MCA9PSAwKQoJewoJICAgIGlmIChrICYmICFwMCAmJiByZXNsZW4gPCBNQVhXTEVOICYmIGMgIT0gTlVMCgkJICAgICYmICghc2xhbmctPnNsX2NvbGxhcHNlIHx8IHJlc2xlbiA9PSAwCgkJCQkJCSAgICAgfHwgd3Jlc1tyZXNsZW4gLSAxXSAhPSBjKSkKCQkvKiBjb25kZW5zZSBvbmx5IGRvdWJsZSBsZXR0ZXJzICovCgkJd3Jlc1tyZXNsZW4rK10gPSBjOwoKCSAgICBpKys7CgkgICAgeiA9IDA7CgkgICAgayA9IDA7Cgl9CiAgICB9CgogICAgLyogQ29udmVydCB3aWRlIGNoYXJhY3RlcnMgaW4gIndyZXMiIHRvIGEgbXVsdGktYnl0ZSBzdHJpbmcgaW4gInJlcyIuICovCiAgICBsID0gMDsKICAgIGZvciAobiA9IDA7IG4gPCByZXNsZW47ICsrbikKICAgIHsKCWwgKz0gbWJfY2hhcjJieXRlcyh3cmVzW25dLCByZXMgKyBsKTsKCWlmIChsICsgTUJfTUFYQllURVMgPiBNQVhXTEVOKQoJICAgIGJyZWFrOwogICAgfQogICAgcmVzW2xdID0gTlVMOwp9CiNlbmRpZgoKLyoKICogQ29tcHV0ZSBhIHNjb3JlIGZvciB0d28gc291bmQtYS1saWtlIHdvcmRzLgogKiBUaGlzIHBlcm1pdHMgdXAgdG8gdHdvIGluc2VydHMvZGVsZXRlcy9zd2Fwcy9ldGMuIHRvIGtlZXAgdGhpbmdzIGZhc3QuCiAqIEluc3RlYWQgb2YgYSBnZW5lcmljIGxvb3Agd2Ugd3JpdGUgb3V0IHRoZSBjb2RlLiAgVGhhdCBrZWVwcyBpdCBmYXN0IGJ5CiAqIGF2b2lkaW5nIGNoZWNrcyB0aGF0IHdpbGwgbm90IGJlIHBvc3NpYmxlLgogKi8KICAgIHN0YXRpYyBpbnQKc291bmRhbGlrZV9zY29yZShnb29kc3RhcnQsIGJhZHN0YXJ0KQogICAgY2hhcl91CSpnb29kc3RhcnQ7CS8qIHNvdW5kLWZvbGRlZCBnb29kIHdvcmQgKi8KICAgIGNoYXJfdQkqYmFkc3RhcnQ7CS8qIHNvdW5kLWZvbGRlZCBiYWQgd29yZCAqLwp7CiAgICBjaGFyX3UJKmdvb2Rzb3VuZCA9IGdvb2RzdGFydDsKICAgIGNoYXJfdQkqYmFkc291bmQgPSBiYWRzdGFydDsKICAgIGludAkJZ29vZGxlbjsKICAgIGludAkJYmFkbGVuOwogICAgaW50CQluOwogICAgY2hhcl91CSpwbCwgKnBzOwogICAgY2hhcl91CSpwbDIsICpwczI7CiAgICBpbnQJCXNjb3JlID0gMDsKCiAgICAvKiBhZGRpbmcvaW5zZXJ0aW5nICIqIiBhdCB0aGUgc3RhcnQgKHdvcmQgc3RhcnRzIHdpdGggdm93ZWwpIHNob3VsZG4ndCBiZQogICAgICogY291bnRlZCBzbyBtdWNoLCB2b3dlbHMgaGFsZndheSB0aGUgd29yZCBhcmVuJ3QgY291bnRlZCBhdCBhbGwuICovCiAgICBpZiAoKCpiYWRzb3VuZCA9PSAnKicgfHwgKmdvb2Rzb3VuZCA9PSAnKicpICYmICpiYWRzb3VuZCAhPSAqZ29vZHNvdW5kKQogICAgewoJaWYgKGJhZHNvdW5kWzFdID09IGdvb2Rzb3VuZFsxXQoJCXx8IChiYWRzb3VuZFsxXSAhPSBOVUwKCQkgICAgJiYgZ29vZHNvdW5kWzFdICE9IE5VTAoJCSAgICAmJiBiYWRzb3VuZFsyXSA9PSBnb29kc291bmRbMl0pKQoJewoJICAgIC8qIGhhbmRsZSBsaWtlIGEgc3Vic3RpdHV0ZSAqLwoJfQoJZWxzZQoJewoJICAgIHNjb3JlID0gMiAqIFNDT1JFX0RFTCAvIDM7CgkgICAgaWYgKCpiYWRzb3VuZCA9PSAnKicpCgkJKytiYWRzb3VuZDsKCSAgICBlbHNlCgkJKytnb29kc291bmQ7Cgl9CiAgICB9CgogICAgZ29vZGxlbiA9IFNUUkxFTihnb29kc291bmQpOwogICAgYmFkbGVuID0gU1RSTEVOKGJhZHNvdW5kKTsKCiAgICAvKiBSZXR1cm4gcXVpY2tseSBpZiB0aGUgbGVuZ2h0cyBhcmUgdG9vIGRpZmZlcmVudCB0byBiZSBmaXhlZCBieSB0d28KICAgICAqIGNoYW5nZXMuICovCiAgICBuID0gZ29vZGxlbiAtIGJhZGxlbjsKICAgIGlmIChuIDwgLTIgfHwgbiA+IDIpCglyZXR1cm4gU0NPUkVfTUFYTUFYOwoKICAgIGlmIChuID4gMCkKICAgIHsKCXBsID0gZ29vZHNvdW5kOwkgICAgLyogZ29vZHNvdW5kIGlzIGxvbmdlc3QgKi8KCXBzID0gYmFkc291bmQ7CiAgICB9CiAgICBlbHNlCiAgICB7CglwbCA9IGJhZHNvdW5kOwkgICAgLyogYmFkc291bmQgaXMgbG9uZ2VzdCAqLwoJcHMgPSBnb29kc291bmQ7CiAgICB9CgogICAgLyogU2tpcCBvdmVyIHRoZSBpZGVudGljYWwgcGFydC4gKi8KICAgIHdoaWxlICgqcGwgPT0gKnBzICYmICpwbCAhPSBOVUwpCiAgICB7CgkrK3BsOwoJKytwczsKICAgIH0KCiAgICBzd2l0Y2ggKG4pCiAgICB7CgljYXNlIC0yOgoJY2FzZSAyOgoJICAgIC8qCgkgICAgICogTXVzdCBkZWxldGUgdHdvIGNoYXJhY3RlcnMgZnJvbSAicGwiLgoJICAgICAqLwoJICAgICsrcGw7CS8qIGZpcnN0IGRlbGV0ZSAqLwoJICAgIHdoaWxlICgqcGwgPT0gKnBzKQoJICAgIHsKCQkrK3BsOwoJCSsrcHM7CgkgICAgfQoJICAgIC8qIHN0cmluZ3MgbXVzdCBiZSBlcXVhbCBhZnRlciBzZWNvbmQgZGVsZXRlICovCgkgICAgaWYgKFNUUkNNUChwbCArIDEsIHBzKSA9PSAwKQoJCXJldHVybiBzY29yZSArIFNDT1JFX0RFTCAqIDI7CgoJICAgIC8qIEZhaWxlZCB0byBjb21wYXJlLiAqLwoJICAgIGJyZWFrOwoKCWNhc2UgLTE6CgljYXNlIDE6CgkgICAgLyoKCSAgICAgKiBNaW5pbWFsIG9uZSBkZWxldGUgZnJvbSAicGwiIHJlcXVpcmVkLgoJICAgICAqLwoKCSAgICAvKiAxOiBkZWxldGUgKi8KCSAgICBwbDIgPSBwbCArIDE7CgkgICAgcHMyID0gcHM7CgkgICAgd2hpbGUgKCpwbDIgPT0gKnBzMikKCSAgICB7CgkJaWYgKCpwbDIgPT0gTlVMKQkvKiByZWFjaGVkIHRoZSBlbmQgKi8KCQkgICAgcmV0dXJuIHNjb3JlICsgU0NPUkVfREVMOwoJCSsrcGwyOwoJCSsrcHMyOwoJICAgIH0KCgkgICAgLyogMjogZGVsZXRlIHRoZW4gc3dhcCwgdGhlbiByZXN0IG11c3QgYmUgZXF1YWwgKi8KCSAgICBpZiAocGwyWzBdID09IHBzMlsxXSAmJiBwbDJbMV0gPT0gcHMyWzBdCgkJCQkJICAgICAmJiBTVFJDTVAocGwyICsgMiwgcHMyICsgMikgPT0gMCkKCQlyZXR1cm4gc2NvcmUgKyBTQ09SRV9ERUwgKyBTQ09SRV9TV0FQOwoKCSAgICAvKiAzOiBkZWxldGUgdGhlbiBzdWJzdGl0dXRlLCB0aGVuIHRoZSByZXN0IG11c3QgYmUgZXF1YWwgKi8KCSAgICBpZiAoU1RSQ01QKHBsMiArIDEsIHBzMiArIDEpID09IDApCgkJcmV0dXJuIHNjb3JlICsgU0NPUkVfREVMICsgU0NPUkVfU1VCU1Q7CgoJICAgIC8qIDQ6IGZpcnN0IHN3YXAgdGhlbiBkZWxldGUgKi8KCSAgICBpZiAocGxbMF0gPT0gcHNbMV0gJiYgcGxbMV0gPT0gcHNbMF0pCgkgICAgewoJCXBsMiA9IHBsICsgMjsJICAgIC8qIHN3YXAsIHNraXAgdHdvIGNoYXJzICovCgkJcHMyID0gcHMgKyAyOwoJCXdoaWxlICgqcGwyID09ICpwczIpCgkJewoJCSAgICArK3BsMjsKCQkgICAgKytwczI7CgkJfQoJCS8qIGRlbGV0ZSBhIGNoYXIgYW5kIHRoZW4gc3RyaW5ncyBtdXN0IGJlIGVxdWFsICovCgkJaWYgKFNUUkNNUChwbDIgKyAxLCBwczIpID09IDApCgkJICAgIHJldHVybiBzY29yZSArIFNDT1JFX1NXQVAgKyBTQ09SRV9ERUw7CgkgICAgfQoKCSAgICAvKiA1OiBmaXJzdCBzdWJzdGl0dXRlIHRoZW4gZGVsZXRlICovCgkgICAgcGwyID0gcGwgKyAxOwkgICAgLyogc3Vic3RpdHV0ZSwgc2tpcCBvbmUgY2hhciAqLwoJICAgIHBzMiA9IHBzICsgMTsKCSAgICB3aGlsZSAoKnBsMiA9PSAqcHMyKQoJICAgIHsKCQkrK3BsMjsKCQkrK3BzMjsKCSAgICB9CgkgICAgLyogZGVsZXRlIGEgY2hhciBhbmQgdGhlbiBzdHJpbmdzIG11c3QgYmUgZXF1YWwgKi8KCSAgICBpZiAoU1RSQ01QKHBsMiArIDEsIHBzMikgPT0gMCkKCQlyZXR1cm4gc2NvcmUgKyBTQ09SRV9TVUJTVCArIFNDT1JFX0RFTDsKCgkgICAgLyogRmFpbGVkIHRvIGNvbXBhcmUuICovCgkgICAgYnJlYWs7CgoJY2FzZSAwOgoJICAgIC8qCgkgICAgICogTGVuZ2h0cyBhcmUgZXF1YWwsIHRodXMgY2hhbmdlcyBtdXN0IHJlc3VsdCBpbiBzYW1lIGxlbmd0aDogQW4KCSAgICAgKiBpbnNlcnQgaXMgb25seSBwb3NzaWJsZSBpbiBjb21iaW5hdGlvbiB3aXRoIGEgZGVsZXRlLgoJICAgICAqIDE6IGNoZWNrIGlmIGZvciBpZGVudGljYWwgc3RyaW5ncwoJICAgICAqLwoJICAgIGlmICgqcGwgPT0gTlVMKQoJCXJldHVybiBzY29yZTsKCgkgICAgLyogMjogc3dhcCAqLwoJICAgIGlmIChwbFswXSA9PSBwc1sxXSAmJiBwbFsxXSA9PSBwc1swXSkKCSAgICB7CgkJcGwyID0gcGwgKyAyOwkgICAgLyogc3dhcCwgc2tpcCB0d28gY2hhcnMgKi8KCQlwczIgPSBwcyArIDI7CgkJd2hpbGUgKCpwbDIgPT0gKnBzMikKCQl7CgkJICAgIGlmICgqcGwyID09IE5VTCkJLyogcmVhY2hlZCB0aGUgZW5kICovCgkJCXJldHVybiBzY29yZSArIFNDT1JFX1NXQVA7CgkJICAgICsrcGwyOwoJCSAgICArK3BzMjsKCQl9CgkJLyogMzogc3dhcCBhbmQgc3dhcCBhZ2FpbiAqLwoJCWlmIChwbDJbMF0gPT0gcHMyWzFdICYmIHBsMlsxXSA9PSBwczJbMF0KCQkJCQkgICAgICYmIFNUUkNNUChwbDIgKyAyLCBwczIgKyAyKSA9PSAwKQoJCSAgICByZXR1cm4gc2NvcmUgKyBTQ09SRV9TV0FQICsgU0NPUkVfU1dBUDsKCgkJLyogNDogc3dhcCBhbmQgc3Vic3RpdHV0ZSAqLwoJCWlmIChTVFJDTVAocGwyICsgMSwgcHMyICsgMSkgPT0gMCkKCQkgICAgcmV0dXJuIHNjb3JlICsgU0NPUkVfU1dBUCArIFNDT1JFX1NVQlNUOwoJICAgIH0KCgkgICAgLyogNTogc3Vic3RpdHV0ZSAqLwoJICAgIHBsMiA9IHBsICsgMTsKCSAgICBwczIgPSBwcyArIDE7CgkgICAgd2hpbGUgKCpwbDIgPT0gKnBzMikKCSAgICB7CgkJaWYgKCpwbDIgPT0gTlVMKQkvKiByZWFjaGVkIHRoZSBlbmQgKi8KCQkgICAgcmV0dXJuIHNjb3JlICsgU0NPUkVfU1VCU1Q7CgkJKytwbDI7CgkJKytwczI7CgkgICAgfQoKCSAgICAvKiA2OiBzdWJzdGl0dXRlIGFuZCBzd2FwICovCgkgICAgaWYgKHBsMlswXSA9PSBwczJbMV0gJiYgcGwyWzFdID09IHBzMlswXQoJCQkJCSAgICAgJiYgU1RSQ01QKHBsMiArIDIsIHBzMiArIDIpID09IDApCgkJcmV0dXJuIHNjb3JlICsgU0NPUkVfU1VCU1QgKyBTQ09SRV9TV0FQOwoKCSAgICAvKiA3OiBzdWJzdGl0dXRlIGFuZCBzdWJzdGl0dXRlICovCgkgICAgaWYgKFNUUkNNUChwbDIgKyAxLCBwczIgKyAxKSA9PSAwKQoJCXJldHVybiBzY29yZSArIFNDT1JFX1NVQlNUICsgU0NPUkVfU1VCU1Q7CgoJICAgIC8qIDg6IGluc2VydCB0aGVuIGRlbGV0ZSAqLwoJICAgIHBsMiA9IHBsOwoJICAgIHBzMiA9IHBzICsgMTsKCSAgICB3aGlsZSAoKnBsMiA9PSAqcHMyKQoJICAgIHsKCQkrK3BsMjsKCQkrK3BzMjsKCSAgICB9CgkgICAgaWYgKFNUUkNNUChwbDIgKyAxLCBwczIpID09IDApCgkJcmV0dXJuIHNjb3JlICsgU0NPUkVfSU5TICsgU0NPUkVfREVMOwoKCSAgICAvKiA5OiBkZWxldGUgdGhlbiBpbnNlcnQgKi8KCSAgICBwbDIgPSBwbCArIDE7CgkgICAgcHMyID0gcHM7CgkgICAgd2hpbGUgKCpwbDIgPT0gKnBzMikKCSAgICB7CgkJKytwbDI7CgkJKytwczI7CgkgICAgfQoJICAgIGlmIChTVFJDTVAocGwyLCBwczIgKyAxKSA9PSAwKQoJCXJldHVybiBzY29yZSArIFNDT1JFX0lOUyArIFNDT1JFX0RFTDsKCgkgICAgLyogRmFpbGVkIHRvIGNvbXBhcmUuICovCgkgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIFNDT1JFX01BWE1BWDsKfQoKLyoKICogQ29tcHV0ZSB0aGUgImVkaXQgZGlzdGFuY2UiIHRvIHR1cm4gImJhZHdvcmQiIGludG8gImdvb2R3b3JkIi4gIFRoZSBsZXNzCiAqIGRlbGV0ZXMvaW5zZXJ0cy9zdWJzdGl0dXRlcy9zd2FwcyBhcmUgcmVxdWlyZWQgdGhlIGxvd2VyIHRoZSBzY29yZS4KICoKICogVGhlIGFsZ29yaXRobSBpcyBkZXNjcmliZWQgYnkgRHUgYW5kIENoYW5nLCAxOTkyLgogKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGFsZ29yaXRobSBjb21lcyBmcm9tIEFzcGVsbCBlZGl0ZGlzdC5jcHAsCiAqIGVkaXRfZGlzdGFuY2UoKS4gIEl0IGhhcyBiZWVuIGNvbnZlcnRlZCBmcm9tIEMrKyB0byBDIGFuZCBtb2RpZmllZCB0bwogKiBzdXBwb3J0IG11bHRpLWJ5dGUgY2hhcmFjdGVycy4KICovCiAgICBzdGF0aWMgaW50CnNwZWxsX2VkaXRfc2NvcmUoc2xhbmcsIGJhZHdvcmQsIGdvb2R3b3JkKQogICAgc2xhbmdfVAkqc2xhbmc7CiAgICBjaGFyX3UJKmJhZHdvcmQ7CiAgICBjaGFyX3UJKmdvb2R3b3JkOwp7CiAgICBpbnQJCSpjbnQ7CiAgICBpbnQJCWJhZGxlbiwgZ29vZGxlbjsJLyogbGVuZ2h0cyBpbmNsdWRpbmcgTlVMICovCiAgICBpbnQJCWosIGk7CiAgICBpbnQJCXQ7CiAgICBpbnQJCWJjLCBnYzsKICAgIGludAkJcGJjLCBwZ2M7CiNpZmRlZiBGRUFUX01CWVRFCiAgICBjaGFyX3UJKnA7CiAgICBpbnQJCXdiYWR3b3JkW01BWFdMRU5dOwogICAgaW50CQl3Z29vZHdvcmRbTUFYV0xFTl07CgogICAgaWYgKGhhc19tYnl0ZSkKICAgIHsKCS8qIEdldCB0aGUgY2hhcmFjdGVycyBmcm9tIHRoZSBtdWx0aS1ieXRlIHN0cmluZ3MgYW5kIHB1dCB0aGVtIGluIGFuCgkgKiBpbnQgYXJyYXkgZm9yIGVhc3kgYWNjZXNzLiAqLwoJZm9yIChwID0gYmFkd29yZCwgYmFkbGVuID0gMDsgKnAgIT0gTlVMOyApCgkgICAgd2JhZHdvcmRbYmFkbGVuKytdID0gbWJfY3B0cjJjaGFyX2FkdigmcCk7Cgl3YmFkd29yZFtiYWRsZW4rK10gPSAwOwoJZm9yIChwID0gZ29vZHdvcmQsIGdvb2RsZW4gPSAwOyAqcCAhPSBOVUw7ICkKCSAgICB3Z29vZHdvcmRbZ29vZGxlbisrXSA9IG1iX2NwdHIyY2hhcl9hZHYoJnApOwoJd2dvb2R3b3JkW2dvb2RsZW4rK10gPSAwOwogICAgfQogICAgZWxzZQojZW5kaWYKICAgIHsKCWJhZGxlbiA9IFNUUkxFTihiYWR3b3JkKSArIDE7Cglnb29kbGVuID0gU1RSTEVOKGdvb2R3b3JkKSArIDE7CiAgICB9CgogICAgLyogV2UgdXNlICJjbnQiIGFzIGFuIGFycmF5OiBDTlQoYmFkd29yZF9pZHgsIGdvb2R3b3JkX2lkeCkuICovCiNkZWZpbmUgQ05UKGEsIGIpICAgY250WyhhKSArIChiKSAqIChiYWRsZW4gKyAxKV0KICAgIGNudCA9IChpbnQgKilsYWxsb2MoKGxvbmdfdSkoc2l6ZW9mKGludCkgKiAoYmFkbGVuICsgMSkgKiAoZ29vZGxlbiArIDEpKSwKCQkJCQkJCQkJVFJVRSk7CiAgICBpZiAoY250ID09IE5VTEwpCglyZXR1cm4gMDsJLyogb3V0IG9mIG1lbW9yeSAqLwoKICAgIENOVCgwLCAwKSA9IDA7CiAgICBmb3IgKGogPSAxOyBqIDw9IGdvb2RsZW47ICsraikKCUNOVCgwLCBqKSA9IENOVCgwLCBqIC0gMSkgKyBTQ09SRV9JTlM7CgogICAgZm9yIChpID0gMTsgaSA8PSBiYWRsZW47ICsraSkKICAgIHsKCUNOVChpLCAwKSA9IENOVChpIC0gMSwgMCkgKyBTQ09SRV9ERUw7Cglmb3IgKGogPSAxOyBqIDw9IGdvb2RsZW47ICsraikKCXsKI2lmZGVmIEZFQVRfTUJZVEUKCSAgICBpZiAoaGFzX21ieXRlKQoJICAgIHsKCQliYyA9IHdiYWR3b3JkW2kgLSAxXTsKCQlnYyA9IHdnb29kd29yZFtqIC0gMV07CgkgICAgfQoJICAgIGVsc2UKI2VuZGlmCgkgICAgewoJCWJjID0gYmFkd29yZFtpIC0gMV07CgkJZ2MgPSBnb29kd29yZFtqIC0gMV07CgkgICAgfQoJICAgIGlmIChiYyA9PSBnYykKCQlDTlQoaSwgaikgPSBDTlQoaSAtIDEsIGogLSAxKTsKCSAgICBlbHNlCgkgICAgewoJCS8qIFVzZSBhIGJldHRlciBzY29yZSB3aGVuIHRoZXJlIGlzIG9ubHkgYSBjYXNlIGRpZmZlcmVuY2UuICovCgkJaWYgKFNQRUxMX1RPRk9MRChiYykgPT0gU1BFTExfVE9GT0xEKGdjKSkKCQkgICAgQ05UKGksIGopID0gU0NPUkVfSUNBU0UgKyBDTlQoaSAtIDEsIGogLSAxKTsKCQllbHNlCgkJewoJCSAgICAvKiBGb3IgYSBzaW1pbGFyIGNoYXJhY3RlciB1c2UgU0NPUkVfU0lNSUxBUi4gKi8KCQkgICAgaWYgKHNsYW5nICE9IE5VTEwKCQkJICAgICYmIHNsYW5nLT5zbF9oYXNfbWFwCgkJCSAgICAmJiBzaW1pbGFyX2NoYXJzKHNsYW5nLCBnYywgYmMpKQoJCQlDTlQoaSwgaikgPSBTQ09SRV9TSU1JTEFSICsgQ05UKGkgLSAxLCBqIC0gMSk7CgkJICAgIGVsc2UKCQkJQ05UKGksIGopID0gU0NPUkVfU1VCU1QgKyBDTlQoaSAtIDEsIGogLSAxKTsKCQl9CgoJCWlmIChpID4gMSAmJiBqID4gMSkKCQl7CiNpZmRlZiBGRUFUX01CWVRFCgkJICAgIGlmIChoYXNfbWJ5dGUpCgkJICAgIHsKCQkJcGJjID0gd2JhZHdvcmRbaSAtIDJdOwoJCQlwZ2MgPSB3Z29vZHdvcmRbaiAtIDJdOwoJCSAgICB9CgkJICAgIGVsc2UKI2VuZGlmCgkJICAgIHsKCQkJcGJjID0gYmFkd29yZFtpIC0gMl07CgkJCXBnYyA9IGdvb2R3b3JkW2ogLSAyXTsKCQkgICAgfQoJCSAgICBpZiAoYmMgPT0gcGdjICYmIHBiYyA9PSBnYykKCQkgICAgewoJCQl0ID0gU0NPUkVfU1dBUCArIENOVChpIC0gMiwgaiAtIDIpOwoJCQlpZiAodCA8IENOVChpLCBqKSkKCQkJICAgIENOVChpLCBqKSA9IHQ7CgkJICAgIH0KCQl9CgkJdCA9IFNDT1JFX0RFTCArIENOVChpIC0gMSwgaik7CgkJaWYgKHQgPCBDTlQoaSwgaikpCgkJICAgIENOVChpLCBqKSA9IHQ7CgkJdCA9IFNDT1JFX0lOUyArIENOVChpLCBqIC0gMSk7CgkJaWYgKHQgPCBDTlQoaSwgaikpCgkJICAgIENOVChpLCBqKSA9IHQ7CgkgICAgfQoJfQogICAgfQoKICAgIGkgPSBDTlQoYmFkbGVuIC0gMSwgZ29vZGxlbiAtIDEpOwogICAgdmltX2ZyZWUoY250KTsKICAgIHJldHVybiBpOwp9Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBpbnQJCWJhZGk7CiAgICBpbnQJCWdvb2RpOwogICAgaW50CQlzY29yZTsKfSBsaW1pdHNjb3JlX1Q7CgovKgogKiBMaWtlIHNwZWxsX2VkaXRfc2NvcmUoKSwgYnV0IHdpdGggYSBsaW1pdCBvbiB0aGUgc2NvcmUgdG8gbWFrZSBpdCBmYXN0ZXIuCiAqIE1heSByZXR1cm4gU0NPUkVfTUFYTUFYIHdoZW4gdGhlIHNjb3JlIGlzIGhpZ2hlciB0aGFuICJsaW1pdCIuCiAqCiAqIFRoaXMgdXNlcyBhIHN0YWNrIGZvciB0aGUgZWRpdHMgc3RpbGwgdG8gYmUgdHJpZWQuCiAqIFRoZSBpZGVhIGNvbWVzIGZyb20gQXNwZWxsIGxlZGl0ZGlzdC5jcHAuICBSZXdyaXR0ZW4gaW4gQyBhbmQgYWRkZWQgc3VwcG9ydAogKiBmb3IgbXVsdGktYnl0ZSBjaGFyYWN0ZXJzLgogKi8KICAgIHN0YXRpYyBpbnQKc3BlbGxfZWRpdF9zY29yZV9saW1pdChzbGFuZywgYmFkd29yZCwgZ29vZHdvcmQsIGxpbWl0KQogICAgc2xhbmdfVAkqc2xhbmc7CiAgICBjaGFyX3UJKmJhZHdvcmQ7CiAgICBjaGFyX3UJKmdvb2R3b3JkOwogICAgaW50CQlsaW1pdDsKewogICAgbGltaXRzY29yZV9UICAgIHN0YWNrWzEwXTsJCS8qIGFsbG93IGZvciBvdmVyIDMgKiAyIGVkaXRzICovCiAgICBpbnQJCSAgICBzdGFja2lkeDsKICAgIGludAkJICAgIGJpLCBnaTsKICAgIGludAkJICAgIGJpMiwgZ2kyOwogICAgaW50CQkgICAgYmMsIGdjOwogICAgaW50CQkgICAgc2NvcmU7CiAgICBpbnQJCSAgICBzY29yZV9vZmY7CiAgICBpbnQJCSAgICBtaW5zY29yZTsKICAgIGludAkJICAgIHJvdW5kOwoKI2lmZGVmIEZFQVRfTUJZVEUKICAgIC8qIE11bHRpLWJ5dGUgY2hhcmFjdGVycyByZXF1aXJlIGEgYml0IG1vcmUgd29yaywgdXNlIGEgZGlmZmVyZW50IGZ1bmN0aW9uCiAgICAgKiB0byBhdm9pZCB0ZXN0aW5nICJoYXNfbWJ5dGUiIHF1aXRlIG9mdGVuLiAqLwogICAgaWYgKGhhc19tYnl0ZSkKCXJldHVybiBzcGVsbF9lZGl0X3Njb3JlX2xpbWl0X3coc2xhbmcsIGJhZHdvcmQsIGdvb2R3b3JkLCBsaW1pdCk7CiNlbmRpZgoKICAgIC8qCiAgICAgKiBUaGUgaWRlYSBpcyB0byBnbyBmcm9tIHN0YXJ0IHRvIGVuZCBvdmVyIHRoZSB3b3Jkcy4gIFNvIGxvbmcgYXMKICAgICAqIGNoYXJhY3RlcnMgYXJlIGVxdWFsIGp1c3QgY29udGludWUsIHRoaXMgYWx3YXlzIGdpdmVzIHRoZSBsb3dlc3Qgc2NvcmUuCiAgICAgKiBXaGVuIHRoZXJlIGlzIGEgZGlmZmVyZW5jZSB0cnkgc2V2ZXJhbCBhbHRlcm5hdGl2ZXMuICBFYWNoIGFsdGVybmF0aXZlCiAgICAgKiBpbmNyZWFzZXMgInNjb3JlIiBmb3IgdGhlIGVkaXQgZGlzdGFuY2UuICBTb21lIG9mIHRoZSBhbHRlcm5hdGl2ZXMgYXJlCiAgICAgKiBwdXNoZWQgdW50byBhIHN0YWNrIGFuZCB0cmllZCBsYXRlciwgc29tZSBhcmUgdHJpZWQgcmlnaHQgYXdheS4gIEF0IHRoZQogICAgICogZW5kIG9mIHRoZSB3b3JkIHRoZSBzY29yZSBmb3Igb25lIGFsdGVybmF0aXZlIGlzIGtub3duLiAgVGhlIGxvd2VzdAogICAgICogcG9zc2libGUgc2NvcmUgaXMgc3RvcmVkIGluICJtaW5zY29yZSIuCiAgICAgKi8KICAgIHN0YWNraWR4ID0gMDsKICAgIGJpID0gMDsKICAgIGdpID0gMDsKICAgIHNjb3JlID0gMDsKICAgIG1pbnNjb3JlID0gbGltaXQgKyAxOwoKICAgIGZvciAoOzspCiAgICB7CgkvKiBTa2lwIG92ZXIgYW4gZXF1YWwgcGFydCwgc2NvcmUgcmVtYWlucyB0aGUgc2FtZS4gKi8KCWZvciAoOzspCgl7CgkgICAgYmMgPSBiYWR3b3JkW2JpXTsKCSAgICBnYyA9IGdvb2R3b3JkW2dpXTsKCSAgICBpZiAoYmMgIT0gZ2MpCS8qIHN0b3AgYXQgYSBjaGFyIHRoYXQncyBkaWZmZXJlbnQgKi8KCQlicmVhazsKCSAgICBpZiAoYmMgPT0gTlVMKQkvKiBib3RoIHdvcmRzIGVuZCAqLwoJICAgIHsKCQlpZiAoc2NvcmUgPCBtaW5zY29yZSkKCQkgICAgbWluc2NvcmUgPSBzY29yZTsKCQlnb3RvIHBvcDsJLyogZG8gbmV4dCBhbHRlcm5hdGl2ZSAqLwoJICAgIH0KCSAgICArK2JpOwoJICAgICsrZ2k7Cgl9CgoJaWYgKGdjID09IE5VTCkgICAgLyogZ29vZHdvcmQgZW5kcywgZGVsZXRlIGJhZHdvcmQgY2hhcnMgKi8KCXsKCSAgICBkbwoJICAgIHsKCQlpZiAoKHNjb3JlICs9IFNDT1JFX0RFTCkgPj0gbWluc2NvcmUpCgkJICAgIGdvdG8gcG9wOwkgICAgLyogZG8gbmV4dCBhbHRlcm5hdGl2ZSAqLwoJICAgIH0gd2hpbGUgKGJhZHdvcmRbKytiaV0gIT0gTlVMKTsKCSAgICBtaW5zY29yZSA9IHNjb3JlOwoJfQoJZWxzZSBpZiAoYmMgPT0gTlVMKSAvKiBiYWR3b3JkIGVuZHMsIGluc2VydCBiYWR3b3JkIGNoYXJzICovCgl7CgkgICAgZG8KCSAgICB7CgkJaWYgKChzY29yZSArPSBTQ09SRV9JTlMpID49IG1pbnNjb3JlKQoJCSAgICBnb3RvIHBvcDsJICAgIC8qIGRvIG5leHQgYWx0ZXJuYXRpdmUgKi8KCSAgICB9IHdoaWxlIChnb29kd29yZFsrK2dpXSAhPSBOVUwpOwoJICAgIG1pbnNjb3JlID0gc2NvcmU7Cgl9CgllbHNlCQkJLyogYm90aCB3b3JkcyBjb250aW51ZSAqLwoJewoJICAgIC8qIElmIG5vdCBjbG9zZSB0byB0aGUgbGltaXQsIHBlcmZvcm0gYSBjaGFuZ2UuICBPbmx5IHRyeSBjaGFuZ2VzCgkgICAgICogdGhhdCBtYXkgbGVhZCB0byBhIGxvd2VyIHNjb3JlIHRoYW4gIm1pbnNjb3JlIi4KCSAgICAgKiByb3VuZCAwOiB0cnkgZGVsZXRpbmcgYSBjaGFyIGZyb20gYmFkd29yZAoJICAgICAqIHJvdW5kIDE6IHRyeSBpbnNlcnRpbmcgYSBjaGFyIGluIGJhZHdvcmQgKi8KCSAgICBmb3IgKHJvdW5kID0gMDsgcm91bmQgPD0gMTsgKytyb3VuZCkKCSAgICB7CgkJc2NvcmVfb2ZmID0gc2NvcmUgKyAocm91bmQgPT0gMCA/IFNDT1JFX0RFTCA6IFNDT1JFX0lOUyk7CgkJaWYgKHNjb3JlX29mZiA8IG1pbnNjb3JlKQoJCXsKCQkgICAgaWYgKHNjb3JlX29mZiArIFNDT1JFX0VESVRfTUlOID49IG1pbnNjb3JlKQoJCSAgICB7CgkJCS8qIE5lYXIgdGhlIGxpbWl0LCByZXN0IG9mIHRoZSB3b3JkcyBtdXN0IG1hdGNoLiAgV2UKCQkJICogY2FuIGNoZWNrIHRoYXQgcmlnaHQgbm93LCBubyBuZWVkIHRvIHB1c2ggYW4gaXRlbQoJCQkgKiBvbnRvIHRoZSBzdGFjay4gKi8KCQkJYmkyID0gYmkgKyAxIC0gcm91bmQ7CgkJCWdpMiA9IGdpICsgcm91bmQ7CgkJCXdoaWxlIChnb29kd29yZFtnaTJdID09IGJhZHdvcmRbYmkyXSkKCQkJewoJCQkgICAgaWYgKGdvb2R3b3JkW2dpMl0gPT0gTlVMKQoJCQkgICAgewoJCQkJbWluc2NvcmUgPSBzY29yZV9vZmY7CgkJCQlicmVhazsKCQkJICAgIH0KCQkJICAgICsrYmkyOwoJCQkgICAgKytnaTI7CgkJCX0KCQkgICAgfQoJCSAgICBlbHNlCgkJICAgIHsKCQkJLyogdHJ5IGRlbGV0aW5nL2luc2VydGluZyBhIGNoYXJhY3RlciBsYXRlciAqLwoJCQlzdGFja1tzdGFja2lkeF0uYmFkaSA9IGJpICsgMSAtIHJvdW5kOwoJCQlzdGFja1tzdGFja2lkeF0uZ29vZGkgPSBnaSArIHJvdW5kOwoJCQlzdGFja1tzdGFja2lkeF0uc2NvcmUgPSBzY29yZV9vZmY7CgkJCSsrc3RhY2tpZHg7CgkJICAgIH0KCQl9CgkgICAgfQoKCSAgICBpZiAoc2NvcmUgKyBTQ09SRV9TV0FQIDwgbWluc2NvcmUpCgkgICAgewoJCS8qIElmIHN3YXBwaW5nIHR3byBjaGFyYWN0ZXJzIG1ha2VzIGEgbWF0Y2ggdGhlbiB0aGUKCQkgKiBzdWJzdGl0dXRpb24gaXMgbW9yZSBleHBlbnNpdmUsIHRodXMgdGhlcmUgaXMgbm8gbmVlZCB0bwoJCSAqIHRyeSBib3RoLiAqLwoJCWlmIChnYyA9PSBiYWR3b3JkW2JpICsgMV0gJiYgYmMgPT0gZ29vZHdvcmRbZ2kgKyAxXSkKCQl7CgkJICAgIC8qIFN3YXAgdHdvIGNoYXJhY3RlcnMsIHRoYXQgaXM6IHNraXAgdGhlbS4gKi8KCQkgICAgZ2kgKz0gMjsKCQkgICAgYmkgKz0gMjsKCQkgICAgc2NvcmUgKz0gU0NPUkVfU1dBUDsKCQkgICAgY29udGludWU7CgkJfQoJICAgIH0KCgkgICAgLyogU3Vic3RpdHV0ZSBvbmUgY2hhcmFjdGVyIGZvciBhbm90aGVyIHdoaWNoIGlzIHRoZSBzYW1lCgkgICAgICogdGhpbmcgYXMgZGVsZXRpbmcgYSBjaGFyYWN0ZXIgZnJvbSBib3RoIGdvb2R3b3JkIGFuZCBiYWR3b3JkLgoJICAgICAqIFVzZSBhIGJldHRlciBzY29yZSB3aGVuIHRoZXJlIGlzIG9ubHkgYSBjYXNlIGRpZmZlcmVuY2UuICovCgkgICAgaWYgKFNQRUxMX1RPRk9MRChiYykgPT0gU1BFTExfVE9GT0xEKGdjKSkKCQlzY29yZSArPSBTQ09SRV9JQ0FTRTsKCSAgICBlbHNlCgkgICAgewoJCS8qIEZvciBhIHNpbWlsYXIgY2hhcmFjdGVyIHVzZSBTQ09SRV9TSU1JTEFSLiAqLwoJCWlmIChzbGFuZyAhPSBOVUxMCgkJCSYmIHNsYW5nLT5zbF9oYXNfbWFwCgkJCSYmIHNpbWlsYXJfY2hhcnMoc2xhbmcsIGdjLCBiYykpCgkJICAgIHNjb3JlICs9IFNDT1JFX1NJTUlMQVI7CgkJZWxzZQoJCSAgICBzY29yZSArPSBTQ09SRV9TVUJTVDsKCSAgICB9CgoJICAgIGlmIChzY29yZSA8IG1pbnNjb3JlKQoJICAgIHsKCQkvKiBEbyB0aGUgc3Vic3RpdHV0aW9uLiAqLwoJCSsrZ2k7CgkJKytiaTsKCQljb250aW51ZTsKCSAgICB9Cgl9CnBvcDoKCS8qCgkgKiBHZXQgaGVyZSB0byB0cnkgdGhlIG5leHQgYWx0ZXJuYXRpdmUsIHBvcCBpdCBmcm9tIHRoZSBzdGFjay4KCSAqLwoJaWYgKHN0YWNraWR4ID09IDApCQkvKiBzdGFjayBpcyBlbXB0eSwgZmluaXNoZWQgKi8KCSAgICBicmVhazsKCgkvKiBwb3AgYW4gaXRlbSBmcm9tIHRoZSBzdGFjayAqLwoJLS1zdGFja2lkeDsKCWdpID0gc3RhY2tbc3RhY2tpZHhdLmdvb2RpOwoJYmkgPSBzdGFja1tzdGFja2lkeF0uYmFkaTsKCXNjb3JlID0gc3RhY2tbc3RhY2tpZHhdLnNjb3JlOwogICAgfQoKICAgIC8qIFdoZW4gdGhlIHNjb3JlIGdvZXMgb3ZlciAibGltaXQiIGl0IG1heSBhY3R1YWxseSBiZSBtdWNoIGhpZ2hlci4KICAgICAqIFJldHVybiBhIHZlcnkgbGFyZ2UgbnVtYmVyIHRvIGF2b2lkIGdvaW5nIGJlbG93IHRoZSBsaW1pdCB3aGVuIGdpdmluZyBhCiAgICAgKiBib251cy4gKi8KICAgIGlmIChtaW5zY29yZSA+IGxpbWl0KQoJcmV0dXJuIFNDT1JFX01BWE1BWDsKICAgIHJldHVybiBtaW5zY29yZTsKfQoKI2lmZGVmIEZFQVRfTUJZVEUKLyoKICogTXVsdGktYnl0ZSB2ZXJzaW9uIG9mIHNwZWxsX2VkaXRfc2NvcmVfbGltaXQoKS4KICogS2VlcCBpdCBpbiBzeW5jIHdpdGggdGhlIGFib3ZlIQogKi8KICAgIHN0YXRpYyBpbnQKc3BlbGxfZWRpdF9zY29yZV9saW1pdF93KHNsYW5nLCBiYWR3b3JkLCBnb29kd29yZCwgbGltaXQpCiAgICBzbGFuZ19UCSpzbGFuZzsKICAgIGNoYXJfdQkqYmFkd29yZDsKICAgIGNoYXJfdQkqZ29vZHdvcmQ7CiAgICBpbnQJCWxpbWl0Owp7CiAgICBsaW1pdHNjb3JlX1QgICAgc3RhY2tbMTBdOwkJLyogYWxsb3cgZm9yIG92ZXIgMyAqIDIgZWRpdHMgKi8KICAgIGludAkJICAgIHN0YWNraWR4OwogICAgaW50CQkgICAgYmksIGdpOwogICAgaW50CQkgICAgYmkyLCBnaTI7CiAgICBpbnQJCSAgICBiYywgZ2M7CiAgICBpbnQJCSAgICBzY29yZTsKICAgIGludAkJICAgIHNjb3JlX29mZjsKICAgIGludAkJICAgIG1pbnNjb3JlOwogICAgaW50CQkgICAgcm91bmQ7CiAgICBjaGFyX3UJICAgICpwOwogICAgaW50CQkgICAgd2JhZHdvcmRbTUFYV0xFTl07CiAgICBpbnQJCSAgICB3Z29vZHdvcmRbTUFYV0xFTl07CgogICAgLyogR2V0IHRoZSBjaGFyYWN0ZXJzIGZyb20gdGhlIG11bHRpLWJ5dGUgc3RyaW5ncyBhbmQgcHV0IHRoZW0gaW4gYW4KICAgICAqIGludCBhcnJheSBmb3IgZWFzeSBhY2Nlc3MuICovCiAgICBiaSA9IDA7CiAgICBmb3IgKHAgPSBiYWR3b3JkOyAqcCAhPSBOVUw7ICkKCXdiYWR3b3JkW2JpKytdID0gbWJfY3B0cjJjaGFyX2FkdigmcCk7CiAgICB3YmFkd29yZFtiaSsrXSA9IDA7CiAgICBnaSA9IDA7CiAgICBmb3IgKHAgPSBnb29kd29yZDsgKnAgIT0gTlVMOyApCgl3Z29vZHdvcmRbZ2krK10gPSBtYl9jcHRyMmNoYXJfYWR2KCZwKTsKICAgIHdnb29kd29yZFtnaSsrXSA9IDA7CgogICAgLyoKICAgICAqIFRoZSBpZGVhIGlzIHRvIGdvIGZyb20gc3RhcnQgdG8gZW5kIG92ZXIgdGhlIHdvcmRzLiAgU28gbG9uZyBhcwogICAgICogY2hhcmFjdGVycyBhcmUgZXF1YWwganVzdCBjb250aW51ZSwgdGhpcyBhbHdheXMgZ2l2ZXMgdGhlIGxvd2VzdCBzY29yZS4KICAgICAqIFdoZW4gdGhlcmUgaXMgYSBkaWZmZXJlbmNlIHRyeSBzZXZlcmFsIGFsdGVybmF0aXZlcy4gIEVhY2ggYWx0ZXJuYXRpdmUKICAgICAqIGluY3JlYXNlcyAic2NvcmUiIGZvciB0aGUgZWRpdCBkaXN0YW5jZS4gIFNvbWUgb2YgdGhlIGFsdGVybmF0aXZlcyBhcmUKICAgICAqIHB1c2hlZCB1bnRvIGEgc3RhY2sgYW5kIHRyaWVkIGxhdGVyLCBzb21lIGFyZSB0cmllZCByaWdodCBhd2F5LiAgQXQgdGhlCiAgICAgKiBlbmQgb2YgdGhlIHdvcmQgdGhlIHNjb3JlIGZvciBvbmUgYWx0ZXJuYXRpdmUgaXMga25vd24uICBUaGUgbG93ZXN0CiAgICAgKiBwb3NzaWJsZSBzY29yZSBpcyBzdG9yZWQgaW4gIm1pbnNjb3JlIi4KICAgICAqLwogICAgc3RhY2tpZHggPSAwOwogICAgYmkgPSAwOwogICAgZ2kgPSAwOwogICAgc2NvcmUgPSAwOwogICAgbWluc2NvcmUgPSBsaW1pdCArIDE7CgogICAgZm9yICg7OykKICAgIHsKCS8qIFNraXAgb3ZlciBhbiBlcXVhbCBwYXJ0LCBzY29yZSByZW1haW5zIHRoZSBzYW1lLiAqLwoJZm9yICg7OykKCXsKCSAgICBiYyA9IHdiYWR3b3JkW2JpXTsKCSAgICBnYyA9IHdnb29kd29yZFtnaV07CgoJICAgIGlmIChiYyAhPSBnYykJLyogc3RvcCBhdCBhIGNoYXIgdGhhdCdzIGRpZmZlcmVudCAqLwoJCWJyZWFrOwoJICAgIGlmIChiYyA9PSBOVUwpCS8qIGJvdGggd29yZHMgZW5kICovCgkgICAgewoJCWlmIChzY29yZSA8IG1pbnNjb3JlKQoJCSAgICBtaW5zY29yZSA9IHNjb3JlOwoJCWdvdG8gcG9wOwkvKiBkbyBuZXh0IGFsdGVybmF0aXZlICovCgkgICAgfQoJICAgICsrYmk7CgkgICAgKytnaTsKCX0KCglpZiAoZ2MgPT0gTlVMKSAgICAvKiBnb29kd29yZCBlbmRzLCBkZWxldGUgYmFkd29yZCBjaGFycyAqLwoJewoJICAgIGRvCgkgICAgewoJCWlmICgoc2NvcmUgKz0gU0NPUkVfREVMKSA+PSBtaW5zY29yZSkKCQkgICAgZ290byBwb3A7CSAgICAvKiBkbyBuZXh0IGFsdGVybmF0aXZlICovCgkgICAgfSB3aGlsZSAod2JhZHdvcmRbKytiaV0gIT0gTlVMKTsKCSAgICBtaW5zY29yZSA9IHNjb3JlOwoJfQoJZWxzZSBpZiAoYmMgPT0gTlVMKSAvKiBiYWR3b3JkIGVuZHMsIGluc2VydCBiYWR3b3JkIGNoYXJzICovCgl7CgkgICAgZG8KCSAgICB7CgkJaWYgKChzY29yZSArPSBTQ09SRV9JTlMpID49IG1pbnNjb3JlKQoJCSAgICBnb3RvIHBvcDsJICAgIC8qIGRvIG5leHQgYWx0ZXJuYXRpdmUgKi8KCSAgICB9IHdoaWxlICh3Z29vZHdvcmRbKytnaV0gIT0gTlVMKTsKCSAgICBtaW5zY29yZSA9IHNjb3JlOwoJfQoJZWxzZQkJCS8qIGJvdGggd29yZHMgY29udGludWUgKi8KCXsKCSAgICAvKiBJZiBub3QgY2xvc2UgdG8gdGhlIGxpbWl0LCBwZXJmb3JtIGEgY2hhbmdlLiAgT25seSB0cnkgY2hhbmdlcwoJICAgICAqIHRoYXQgbWF5IGxlYWQgdG8gYSBsb3dlciBzY29yZSB0aGFuICJtaW5zY29yZSIuCgkgICAgICogcm91bmQgMDogdHJ5IGRlbGV0aW5nIGEgY2hhciBmcm9tIGJhZHdvcmQKCSAgICAgKiByb3VuZCAxOiB0cnkgaW5zZXJ0aW5nIGEgY2hhciBpbiBiYWR3b3JkICovCgkgICAgZm9yIChyb3VuZCA9IDA7IHJvdW5kIDw9IDE7ICsrcm91bmQpCgkgICAgewoJCXNjb3JlX29mZiA9IHNjb3JlICsgKHJvdW5kID09IDAgPyBTQ09SRV9ERUwgOiBTQ09SRV9JTlMpOwoJCWlmIChzY29yZV9vZmYgPCBtaW5zY29yZSkKCQl7CgkJICAgIGlmIChzY29yZV9vZmYgKyBTQ09SRV9FRElUX01JTiA+PSBtaW5zY29yZSkKCQkgICAgewoJCQkvKiBOZWFyIHRoZSBsaW1pdCwgcmVzdCBvZiB0aGUgd29yZHMgbXVzdCBtYXRjaC4gIFdlCgkJCSAqIGNhbiBjaGVjayB0aGF0IHJpZ2h0IG5vdywgbm8gbmVlZCB0byBwdXNoIGFuIGl0ZW0KCQkJICogb250byB0aGUgc3RhY2suICovCgkJCWJpMiA9IGJpICsgMSAtIHJvdW5kOwoJCQlnaTIgPSBnaSArIHJvdW5kOwoJCQl3aGlsZSAod2dvb2R3b3JkW2dpMl0gPT0gd2JhZHdvcmRbYmkyXSkKCQkJewoJCQkgICAgaWYgKHdnb29kd29yZFtnaTJdID09IE5VTCkKCQkJICAgIHsKCQkJCW1pbnNjb3JlID0gc2NvcmVfb2ZmOwoJCQkJYnJlYWs7CgkJCSAgICB9CgkJCSAgICArK2JpMjsKCQkJICAgICsrZ2kyOwoJCQl9CgkJICAgIH0KCQkgICAgZWxzZQoJCSAgICB7CgkJCS8qIHRyeSBkZWxldGluZyBhIGNoYXJhY3RlciBmcm9tIGJhZHdvcmQgbGF0ZXIgKi8KCQkJc3RhY2tbc3RhY2tpZHhdLmJhZGkgPSBiaSArIDEgLSByb3VuZDsKCQkJc3RhY2tbc3RhY2tpZHhdLmdvb2RpID0gZ2kgKyByb3VuZDsKCQkJc3RhY2tbc3RhY2tpZHhdLnNjb3JlID0gc2NvcmVfb2ZmOwoJCQkrK3N0YWNraWR4OwoJCSAgICB9CgkJfQoJICAgIH0KCgkgICAgaWYgKHNjb3JlICsgU0NPUkVfU1dBUCA8IG1pbnNjb3JlKQoJICAgIHsKCQkvKiBJZiBzd2FwcGluZyB0d28gY2hhcmFjdGVycyBtYWtlcyBhIG1hdGNoIHRoZW4gdGhlCgkJICogc3Vic3RpdHV0aW9uIGlzIG1vcmUgZXhwZW5zaXZlLCB0aHVzIHRoZXJlIGlzIG5vIG5lZWQgdG8KCQkgKiB0cnkgYm90aC4gKi8KCQlpZiAoZ2MgPT0gd2JhZHdvcmRbYmkgKyAxXSAmJiBiYyA9PSB3Z29vZHdvcmRbZ2kgKyAxXSkKCQl7CgkJICAgIC8qIFN3YXAgdHdvIGNoYXJhY3RlcnMsIHRoYXQgaXM6IHNraXAgdGhlbS4gKi8KCQkgICAgZ2kgKz0gMjsKCQkgICAgYmkgKz0gMjsKCQkgICAgc2NvcmUgKz0gU0NPUkVfU1dBUDsKCQkgICAgY29udGludWU7CgkJfQoJICAgIH0KCgkgICAgLyogU3Vic3RpdHV0ZSBvbmUgY2hhcmFjdGVyIGZvciBhbm90aGVyIHdoaWNoIGlzIHRoZSBzYW1lCgkgICAgICogdGhpbmcgYXMgZGVsZXRpbmcgYSBjaGFyYWN0ZXIgZnJvbSBib3RoIGdvb2R3b3JkIGFuZCBiYWR3b3JkLgoJICAgICAqIFVzZSBhIGJldHRlciBzY29yZSB3aGVuIHRoZXJlIGlzIG9ubHkgYSBjYXNlIGRpZmZlcmVuY2UuICovCgkgICAgaWYgKFNQRUxMX1RPRk9MRChiYykgPT0gU1BFTExfVE9GT0xEKGdjKSkKCQlzY29yZSArPSBTQ09SRV9JQ0FTRTsKCSAgICBlbHNlCgkgICAgewoJCS8qIEZvciBhIHNpbWlsYXIgY2hhcmFjdGVyIHVzZSBTQ09SRV9TSU1JTEFSLiAqLwoJCWlmIChzbGFuZyAhPSBOVUxMCgkJCSYmIHNsYW5nLT5zbF9oYXNfbWFwCgkJCSYmIHNpbWlsYXJfY2hhcnMoc2xhbmcsIGdjLCBiYykpCgkJICAgIHNjb3JlICs9IFNDT1JFX1NJTUlMQVI7CgkJZWxzZQoJCSAgICBzY29yZSArPSBTQ09SRV9TVUJTVDsKCSAgICB9CgoJICAgIGlmIChzY29yZSA8IG1pbnNjb3JlKQoJICAgIHsKCQkvKiBEbyB0aGUgc3Vic3RpdHV0aW9uLiAqLwoJCSsrZ2k7CgkJKytiaTsKCQljb250aW51ZTsKCSAgICB9Cgl9CnBvcDoKCS8qCgkgKiBHZXQgaGVyZSB0byB0cnkgdGhlIG5leHQgYWx0ZXJuYXRpdmUsIHBvcCBpdCBmcm9tIHRoZSBzdGFjay4KCSAqLwoJaWYgKHN0YWNraWR4ID09IDApCQkvKiBzdGFjayBpcyBlbXB0eSwgZmluaXNoZWQgKi8KCSAgICBicmVhazsKCgkvKiBwb3AgYW4gaXRlbSBmcm9tIHRoZSBzdGFjayAqLwoJLS1zdGFja2lkeDsKCWdpID0gc3RhY2tbc3RhY2tpZHhdLmdvb2RpOwoJYmkgPSBzdGFja1tzdGFja2lkeF0uYmFkaTsKCXNjb3JlID0gc3RhY2tbc3RhY2tpZHhdLnNjb3JlOwogICAgfQoKICAgIC8qIFdoZW4gdGhlIHNjb3JlIGdvZXMgb3ZlciAibGltaXQiIGl0IG1heSBhY3R1YWxseSBiZSBtdWNoIGhpZ2hlci4KICAgICAqIFJldHVybiBhIHZlcnkgbGFyZ2UgbnVtYmVyIHRvIGF2b2lkIGdvaW5nIGJlbG93IHRoZSBsaW1pdCB3aGVuIGdpdmluZyBhCiAgICAgKiBib251cy4gKi8KICAgIGlmIChtaW5zY29yZSA+IGxpbWl0KQoJcmV0dXJuIFNDT1JFX01BWE1BWDsKICAgIHJldHVybiBtaW5zY29yZTsKfQojZW5kaWYKCi8qCiAqICI6c3BlbGxpbmZvIgogKi8KLypBUkdTVVNFRCovCiAgICB2b2lkCmV4X3NwZWxsaW5mbyhlYXApCiAgICBleGFyZ19UICplYXA7CnsKICAgIGludAkJbHBpOwogICAgbGFuZ3BfVAkqbHA7CiAgICBjaGFyX3UJKnA7CgogICAgaWYgKG5vX3NwZWxsX2NoZWNraW5nKGN1cndpbikpCglyZXR1cm47CgogICAgbXNnX3N0YXJ0KCk7CiAgICBmb3IgKGxwaSA9IDA7IGxwaSA8IGN1cmJ1Zi0+Yl9sYW5ncC5nYV9sZW4gJiYgIWdvdF9pbnQ7ICsrbHBpKQogICAgewoJbHAgPSBMQU5HUF9FTlRSWShjdXJidWYtPmJfbGFuZ3AsIGxwaSk7Cgltc2dfcHV0cygoY2hhcl91ICopImZpbGU6ICIpOwoJbXNnX3B1dHMobHAtPmxwX3NsYW5nLT5zbF9mbmFtZSk7Cgltc2dfcHV0Y2hhcignXG4nKTsKCXAgPSBscC0+bHBfc2xhbmctPnNsX2luZm87CglpZiAocCAhPSBOVUxMKQoJewoJICAgIG1zZ19wdXRzKHApOwoJICAgIG1zZ19wdXRjaGFyKCdcbicpOwoJfQogICAgfQogICAgbXNnX2VuZCgpOwp9CgojZGVmaW5lIERVTVBGTEFHX0tFRVBDQVNFICAgMQkvKiByb3VuZCAyOiBrZWVwLWNhc2UgdHJlZSAqLwojZGVmaW5lIERVTVBGTEFHX0NPVU5UCSAgICAyCS8qIGluY2x1ZGUgd29yZCBjb3VudCAqLwojZGVmaW5lIERVTVBGTEFHX0lDQVNFCSAgICA0CS8qIGlnbm9yZSBjYXNlIHdoZW4gZmluZGluZyBtYXRjaGVzICovCiNkZWZpbmUgRFVNUEZMQUdfT05FQ0FQCSAgICA4CS8qIHBhdHRlcm4gc3RhcnRzIHdpdGggY2FwaXRhbCAqLwojZGVmaW5lIERVTVBGTEFHX0FMTENBUAkgICAgMTYJLyogcGF0dGVybiBpcyBhbGwgY2FwaXRhbHMgKi8KCi8qCiAqICI6c3BlbGxkdW1wIgogKi8KICAgIHZvaWQKZXhfc3BlbGxkdW1wKGVhcCkKICAgIGV4YXJnX1QgKmVhcDsKewogICAgYnVmX1QJKmJ1ZiA9IGN1cmJ1ZjsKCiAgICBpZiAobm9fc3BlbGxfY2hlY2tpbmcoY3Vyd2luKSkKCXJldHVybjsKCiAgICAvKiBDcmVhdGUgYSBuZXcgZW1wdHkgYnVmZmVyIGJ5IHNwbGl0dGluZyB0aGUgd2luZG93LiAqLwogICAgZG9fY21kbGluZV9jbWQoKGNoYXJfdSAqKSJuZXciKTsKICAgIGlmICghYnVmZW1wdHkoKSB8fCAhYnVmX3ZhbGlkKGJ1ZikpCglyZXR1cm47CgogICAgc3BlbGxfZHVtcF9jb21wbChidWYsIE5VTEwsIDAsIE5VTEwsIGVhcC0+Zm9yY2VpdCA/IERVTVBGTEFHX0NPVU5UIDogMCk7CgogICAgLyogRGVsZXRlIHRoZSBlbXB0eSBsaW5lIHRoYXQgd2Ugc3RhcnRlZCB3aXRoLiAqLwogICAgaWYgKGN1cmJ1Zi0+Yl9tbC5tbF9saW5lX2NvdW50ID4gMSkKCW1sX2RlbGV0ZShjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCwgRkFMU0UpOwoKICAgIHJlZHJhd19sYXRlcihOT1RfVkFMSUQpOwp9CgovKgogKiBHbyB0aHJvdWdoIGFsbCBwb3NzaWJsZSB3b3JkcyBhbmQ6CiAqIDEuIFdoZW4gInBhdCIgaXMgTlVMTDogZHVtcCBhIGxpc3Qgb2YgYWxsIHdvcmRzIGluIHRoZSBjdXJyZW50IGJ1ZmZlci4KICoJImljIiBhbmQgImRpciIgYXJlIG5vdCB1c2VkLgogKiAyLiBXaGVuICJwYXQiIGlzIG5vdCBOVUxMOiBhZGQgbWF0Y2hpbmcgd29yZHMgdG8gaW5zZXJ0IG1vZGUgY29tcGxldGlvbi4KICovCiAgICB2b2lkCnNwZWxsX2R1bXBfY29tcGwoYnVmLCBwYXQsIGljLCBkaXIsIGR1bXBmbGFnc19hcmcpCiAgICBidWZfVAkqYnVmOwkgICAgLyogYnVmZmVyIHdpdGggc3BlbGwgY2hlY2tpbmcgKi8KICAgIGNoYXJfdQkqcGF0OwkgICAgLyogbGVhZGluZyBwYXJ0IG9mIHRoZSB3b3JkICovCiAgICBpbnQJCWljOwkgICAgLyogaWdub3JlIGNhc2UgKi8KICAgIGludAkJKmRpcjsJICAgIC8qIGRpcmVjdGlvbiBmb3IgYWRkaW5nIG1hdGNoZXMgKi8KICAgIGludAkJZHVtcGZsYWdzX2FyZzsJLyogRFVNUEZMQUdfKiAqLwp7CiAgICBsYW5ncF9UCSpscDsKICAgIHNsYW5nX1QJKnNsYW5nOwogICAgaWR4X1QJYXJyaWR4W01BWFdMRU5dOwogICAgaW50CQljdXJpW01BWFdMRU5dOwogICAgY2hhcl91CXdvcmRbTUFYV0xFTl07CiAgICBpbnQJCWM7CiAgICBjaGFyX3UJKmJ5dHM7CiAgICBpZHhfVAkqaWR4czsKICAgIGxpbmVucl9UCWxudW0gPSAwOwogICAgaW50CQlyb3VuZDsKICAgIGludAkJZGVwdGg7CiAgICBpbnQJCW47CiAgICBpbnQJCWZsYWdzOwogICAgY2hhcl91CSpyZWdpb25fbmFtZXMgPSBOVUxMOwkgICAgLyogcmVnaW9uIG5hbWVzIGJlaW5nIHVzZWQgKi8KICAgIGludAkJZG9fcmVnaW9uID0gVFJVRTsJICAgIC8qIGR1bXAgcmVnaW9uIG5hbWVzIGFuZCBudW1iZXJzICovCiAgICBjaGFyX3UJKnA7CiAgICBpbnQJCWxwaTsKICAgIGludAkJZHVtcGZsYWdzID0gZHVtcGZsYWdzX2FyZzsKICAgIGludAkJcGF0bGVuOwoKICAgIC8qIFdoZW4gaWdub3JpbmcgY2FzZSBvciB3aGVuIHRoZSBwYXR0ZXJuIHN0YXJ0cyB3aXRoIGNhcGl0YWwgcGFzcyB0aGlzIG9uCiAgICAgKiB0byBkdW1wX3dvcmQoKS4gKi8KICAgIGlmIChwYXQgIT0gTlVMTCkKICAgIHsKCWlmIChpYykKCSAgICBkdW1wZmxhZ3MgfD0gRFVNUEZMQUdfSUNBU0U7CgllbHNlCgl7CgkgICAgbiA9IGNhcHR5cGUocGF0LCBOVUxMKTsKCSAgICBpZiAobiA9PSBXRl9PTkVDQVApCgkJZHVtcGZsYWdzIHw9IERVTVBGTEFHX09ORUNBUDsKCSAgICBlbHNlIGlmIChuID09IFdGX0FMTENBUAojaWZkZWYgRkVBVF9NQllURQoJCSAgICAmJiAoaW50KVNUUkxFTihwYXQpID4gbWJfcHRyMmxlbihwYXQpCiNlbHNlCgkJICAgICYmIChpbnQpU1RSTEVOKHBhdCkgPiAxCiNlbmRpZgoJCSAgICApCgkJZHVtcGZsYWdzIHw9IERVTVBGTEFHX0FMTENBUDsKCX0KICAgIH0KCiAgICAvKiBGaW5kIG91dCBpZiB3ZSBjYW4gc3VwcG9ydCByZWdpb25zOiBBbGwgbGFuZ3VhZ2VzIG11c3Qgc3VwcG9ydCB0aGUgc2FtZQogICAgICogcmVnaW9ucyBvciBub25lIGF0IGFsbC4gKi8KICAgIGZvciAobHBpID0gMDsgbHBpIDwgYnVmLT5iX2xhbmdwLmdhX2xlbjsgKytscGkpCiAgICB7CglscCA9IExBTkdQX0VOVFJZKGJ1Zi0+Yl9sYW5ncCwgbHBpKTsKCXAgPSBscC0+bHBfc2xhbmctPnNsX3JlZ2lvbnM7CglpZiAocFswXSAhPSAwKQoJewoJICAgIGlmIChyZWdpb25fbmFtZXMgPT0gTlVMTCkJICAgIC8qIGZpcnN0IGxhbmd1YWdlIHdpdGggcmVnaW9ucyAqLwoJCXJlZ2lvbl9uYW1lcyA9IHA7CgkgICAgZWxzZSBpZiAoU1RSQ01QKHJlZ2lvbl9uYW1lcywgcCkgIT0gMCkKCSAgICB7CgkJZG9fcmVnaW9uID0gRkFMU0U7CSAgICAvKiByZWdpb24gbmFtZXMgYXJlIGRpZmZlcmVudCAqLwoJCWJyZWFrOwoJICAgIH0KCX0KICAgIH0KCiAgICBpZiAoZG9fcmVnaW9uICYmIHJlZ2lvbl9uYW1lcyAhPSBOVUxMKQogICAgewoJaWYgKHBhdCA9PSBOVUxMKQoJewoJICAgIHZpbV9zbnByaW50ZigoY2hhciAqKUlPYnVmZiwgSU9TSVpFLCAiL3JlZ2lvbnM9JXMiLCByZWdpb25fbmFtZXMpOwoJICAgIG1sX2FwcGVuZChsbnVtKyssIElPYnVmZiwgKGNvbG5yX1QpMCwgRkFMU0UpOwoJfQogICAgfQogICAgZWxzZQoJZG9fcmVnaW9uID0gRkFMU0U7CgogICAgLyoKICAgICAqIExvb3Agb3ZlciBhbGwgZmlsZXMgbG9hZGVkIGZvciB0aGUgZW50cmllcyBpbiAnc3BlbGxsYW5nJy4KICAgICAqLwogICAgZm9yIChscGkgPSAwOyBscGkgPCBidWYtPmJfbGFuZ3AuZ2FfbGVuOyArK2xwaSkKICAgIHsKCWxwID0gTEFOR1BfRU5UUlkoYnVmLT5iX2xhbmdwLCBscGkpOwoJc2xhbmcgPSBscC0+bHBfc2xhbmc7CglpZiAoc2xhbmctPnNsX2ZieXRzID09IE5VTEwpCSAgICAvKiByZWxvYWRpbmcgZmFpbGVkICovCgkgICAgY29udGludWU7CgoJaWYgKHBhdCA9PSBOVUxMKQoJewoJICAgIHZpbV9zbnByaW50ZigoY2hhciAqKUlPYnVmZiwgSU9TSVpFLCAiIyBmaWxlOiAlcyIsIHNsYW5nLT5zbF9mbmFtZSk7CgkgICAgbWxfYXBwZW5kKGxudW0rKywgSU9idWZmLCAoY29sbnJfVCkwLCBGQUxTRSk7Cgl9CgoJLyogV2hlbiBtYXRjaGluZyB3aXRoIGEgcGF0dGVybiBhbmQgdGhlcmUgYXJlIG5vIHByZWZpeGVzIG9ubHkgdXNlCgkgKiBwYXJ0cyBvZiB0aGUgdHJlZSB0aGF0IG1hdGNoICJwYXQiLiAqLwoJaWYgKHBhdCAhPSBOVUxMICYmIHNsYW5nLT5zbF9wYnl0cyA9PSBOVUxMKQoJICAgIHBhdGxlbiA9IFNUUkxFTihwYXQpOwoJZWxzZQoJICAgIHBhdGxlbiA9IDA7CgoJLyogcm91bmQgMTogY2FzZS1mb2xkZWQgdHJlZQoJICogcm91bmQgMjoga2VlcC1jYXNlIHRyZWUgKi8KCWZvciAocm91bmQgPSAxOyByb3VuZCA8PSAyOyArK3JvdW5kKQoJewoJICAgIGlmIChyb3VuZCA9PSAxKQoJICAgIHsKCQlkdW1wZmxhZ3MgJj0gfkRVTVBGTEFHX0tFRVBDQVNFOwoJCWJ5dHMgPSBzbGFuZy0+c2xfZmJ5dHM7CgkJaWR4cyA9IHNsYW5nLT5zbF9maWR4czsKCSAgICB9CgkgICAgZWxzZQoJICAgIHsKCQlkdW1wZmxhZ3MgfD0gRFVNUEZMQUdfS0VFUENBU0U7CgkJYnl0cyA9IHNsYW5nLT5zbF9rYnl0czsKCQlpZHhzID0gc2xhbmctPnNsX2tpZHhzOwoJICAgIH0KCSAgICBpZiAoYnl0cyA9PSBOVUxMKQoJCWNvbnRpbnVlOwkJLyogYXJyYXkgaXMgZW1wdHkgKi8KCgkgICAgZGVwdGggPSAwOwoJICAgIGFycmlkeFswXSA9IDA7CgkgICAgY3VyaVswXSA9IDE7CgkgICAgd2hpbGUgKGRlcHRoID49IDAgJiYgIWdvdF9pbnQKCQkJCSAgICAgICAmJiAocGF0ID09IE5VTEwgfHwgIWNvbXBsX2ludGVycnVwdGVkKSkKCSAgICB7CgkJaWYgKGN1cmlbZGVwdGhdID4gYnl0c1thcnJpZHhbZGVwdGhdXSkKCQl7CgkJICAgIC8qIERvbmUgYWxsIGJ5dGVzIGF0IHRoaXMgbm9kZSwgZ28gdXAgb25lIGxldmVsLiAqLwoJCSAgICAtLWRlcHRoOwoJCSAgICBsaW5lX2JyZWFrY2hlY2soKTsKCQkgICAgaW5zX2NvbXBsX2NoZWNrX2tleXMoNTApOwoJCX0KCQllbHNlCgkJewoJCSAgICAvKiBEbyBvbmUgbW9yZSBieXRlIGF0IHRoaXMgbm9kZS4gKi8KCQkgICAgbiA9IGFycmlkeFtkZXB0aF0gKyBjdXJpW2RlcHRoXTsKCQkgICAgKytjdXJpW2RlcHRoXTsKCQkgICAgYyA9IGJ5dHNbbl07CgkJICAgIGlmIChjID09IDApCgkJICAgIHsKCQkJLyogRW5kIG9mIHdvcmQsIGRlYWwgd2l0aCB0aGUgd29yZC4KCQkJICogRG9uJ3QgdXNlIGtlZXAtY2FzZSB3b3JkcyBpbiB0aGUgZm9sZC1jYXNlIHRyZWUsCgkJCSAqIHRoZXkgd2lsbCBhcHBlYXIgaW4gdGhlIGtlZXAtY2FzZSB0cmVlLgoJCQkgKiBPbmx5IHVzZSB0aGUgd29yZCB3aGVuIHRoZSByZWdpb24gbWF0Y2hlcy4gKi8KCQkJZmxhZ3MgPSAoaW50KWlkeHNbbl07CgkJCWlmICgocm91bmQgPT0gMiB8fCAoZmxhZ3MgJiBXRl9LRUVQQ0FQKSA9PSAwKQoJCQkJJiYgKGZsYWdzICYgV0ZfTkVFRENPTVApID09IDAKCQkJCSYmIChkb19yZWdpb24KCQkJCSAgICB8fCAoZmxhZ3MgJiBXRl9SRUdJT04pID09IDAKCQkJCSAgICB8fCAoKCh1bnNpZ25lZClmbGFncyA+PiAxNikKCQkJCQkJICAgICAgICYgbHAtPmxwX3JlZ2lvbikgIT0gMCkpCgkJCXsKCQkJICAgIHdvcmRbZGVwdGhdID0gTlVMOwoJCQkgICAgaWYgKCFkb19yZWdpb24pCgkJCQlmbGFncyAmPSB+V0ZfUkVHSU9OOwoKCQkJICAgIC8qIER1bXAgdGhlIGJhc2ljIHdvcmQgaWYgdGhlcmUgaXMgbm8gcHJlZml4IG9yCgkJCSAgICAgKiB3aGVuIGl0J3MgdGhlIGZpcnN0IG9uZS4gKi8KCQkJICAgIGMgPSAodW5zaWduZWQpZmxhZ3MgPj4gMjQ7CgkJCSAgICBpZiAoYyA9PSAwIHx8IGN1cmlbZGVwdGhdID09IDIpCgkJCSAgICB7CgkJCQlkdW1wX3dvcmQoc2xhbmcsIHdvcmQsIHBhdCwgZGlyLAoJCQkJCQkgICAgICBkdW1wZmxhZ3MsIGZsYWdzLCBsbnVtKTsKCQkJCWlmIChwYXQgPT0gTlVMTCkKCQkJCSAgICArK2xudW07CgkJCSAgICB9CgoJCQkgICAgLyogQXBwbHkgdGhlIHByZWZpeCwgaWYgdGhlcmUgaXMgb25lLiAqLwoJCQkgICAgaWYgKGMgIT0gMCkKCQkJCWxudW0gPSBkdW1wX3ByZWZpeGVzKHNsYW5nLCB3b3JkLCBwYXQsIGRpciwKCQkJCQkJICAgICAgZHVtcGZsYWdzLCBmbGFncywgbG51bSk7CgkJCX0KCQkgICAgfQoJCSAgICBlbHNlCgkJICAgIHsKCQkJLyogTm9ybWFsIGNoYXIsIGdvIG9uZSBsZXZlbCBkZWVwZXIuICovCgkJCXdvcmRbZGVwdGgrK10gPSBjOwoJCQlhcnJpZHhbZGVwdGhdID0gaWR4c1tuXTsKCQkJY3VyaVtkZXB0aF0gPSAxOwoKCQkJLyogQ2hlY2sgaWYgdGhpcyBjaGFyYWN0ZXJzIG1hdGNoZXMgd2l0aCB0aGUgcGF0dGVybi4KCQkJICogSWYgbm90IHNraXAgdGhlIHdob2xlIHRyZWUgYmVsb3cgaXQuCgkJCSAqIEFsd2F5cyBpZ25vcmUgY2FzZSBoZXJlLCBkdW1wX3dvcmQoKSB3aWxsIGNoZWNrCgkJCSAqIHByb3BlciBjYXNlIGxhdGVyLiAgVGhpcyBpc24ndCBleGFjdGx5IHJpZ2h0IHdoZW4KCQkJICogbGVuZ3RoIGNoYW5nZXMgZm9yIG11bHRpLWJ5dGUgY2hhcmFjdGVycyB3aXRoCgkJCSAqIGlnbm9yZSBjYXNlLi4uICovCgkJCWlmIChkZXB0aCA8PSBwYXRsZW4KCQkJCQkmJiBNQl9TVFJOSUNNUCh3b3JkLCBwYXQsIGRlcHRoKSAhPSAwKQoJCQkgICAgLS1kZXB0aDsKCQkgICAgfQoJCX0KCSAgICB9Cgl9CiAgICB9Cn0KCi8qCiAqIER1bXAgb25lIHdvcmQ6IGFwcGx5IGNhc2UgbW9kaWZpY2F0aW9ucyBhbmQgYXBwZW5kIGEgbGluZSB0byB0aGUgYnVmZmVyLgogKiBXaGVuICJsbnVtIiBpcyB6ZXJvIGFkZCBpbnNlcnQgbW9kZSBjb21wbGV0aW9uLgogKi8KICAgIHN0YXRpYyB2b2lkCmR1bXBfd29yZChzbGFuZywgd29yZCwgcGF0LCBkaXIsIGR1bXBmbGFncywgd29yZGZsYWdzLCBsbnVtKQogICAgc2xhbmdfVAkqc2xhbmc7CiAgICBjaGFyX3UJKndvcmQ7CiAgICBjaGFyX3UJKnBhdDsKICAgIGludAkJKmRpcjsKICAgIGludAkJZHVtcGZsYWdzOwogICAgaW50CQl3b3JkZmxhZ3M7CiAgICBsaW5lbnJfVAlsbnVtOwp7CiAgICBpbnQJCWtlZXBjYXAgPSBGQUxTRTsKICAgIGNoYXJfdQkqcDsKICAgIGNoYXJfdQkqdHc7CiAgICBjaGFyX3UJY3dvcmRbTUFYV0xFTl07CiAgICBjaGFyX3UJYmFkd29yZFtNQVhXTEVOICsgMTBdOwogICAgaW50CQlpOwogICAgaW50CQlmbGFncyA9IHdvcmRmbGFnczsKCiAgICBpZiAoZHVtcGZsYWdzICYgRFVNUEZMQUdfT05FQ0FQKQoJZmxhZ3MgfD0gV0ZfT05FQ0FQOwogICAgaWYgKGR1bXBmbGFncyAmIERVTVBGTEFHX0FMTENBUCkKCWZsYWdzIHw9IFdGX0FMTENBUDsKCiAgICBpZiAoKGR1bXBmbGFncyAmIERVTVBGTEFHX0tFRVBDQVNFKSA9PSAwICYmIChmbGFncyAmIFdGX0NBUE1BU0spICE9IDApCiAgICB7CgkvKiBOZWVkIHRvIGZpeCBjYXNlIGFjY29yZGluZyB0byAiZmxhZ3MiLiAqLwoJbWFrZV9jYXNlX3dvcmQod29yZCwgY3dvcmQsIGZsYWdzKTsKCXAgPSBjd29yZDsKICAgIH0KICAgIGVsc2UKICAgIHsKCXAgPSB3b3JkOwoJaWYgKChkdW1wZmxhZ3MgJiBEVU1QRkxBR19LRUVQQ0FTRSkKCQkmJiAoKGNhcHR5cGUod29yZCwgTlVMTCkgJiBXRl9LRUVQQ0FQKSA9PSAwCgkJCQkJCSB8fCAoZmxhZ3MgJiBXRl9GSVhDQVApICE9IDApKQoJICAgIGtlZXBjYXAgPSBUUlVFOwogICAgfQogICAgdHcgPSBwOwoKICAgIGlmIChwYXQgPT0gTlVMTCkKICAgIHsKCS8qIEFkZCBmbGFncyBhbmQgcmVnaW9ucyBhZnRlciBhIHNsYXNoLiAqLwoJaWYgKChmbGFncyAmIChXRl9CQU5ORUQgfCBXRl9SQVJFIHwgV0ZfUkVHSU9OKSkgfHwga2VlcGNhcCkKCXsKCSAgICBTVFJDUFkoYmFkd29yZCwgcCk7CgkgICAgU1RSQ0FUKGJhZHdvcmQsICIvIik7CgkgICAgaWYgKGtlZXBjYXApCgkJU1RSQ0FUKGJhZHdvcmQsICI9Iik7CgkgICAgaWYgKGZsYWdzICYgV0ZfQkFOTkVEKQoJCVNUUkNBVChiYWR3b3JkLCAiISIpOwoJICAgIGVsc2UgaWYgKGZsYWdzICYgV0ZfUkFSRSkKCQlTVFJDQVQoYmFkd29yZCwgIj8iKTsKCSAgICBpZiAoZmxhZ3MgJiBXRl9SRUdJT04pCgkJZm9yIChpID0gMDsgaSA8IDc7ICsraSkKCQkgICAgaWYgKGZsYWdzICYgKDB4MTAwMDAgPDwgaSkpCgkJCXNwcmludGYoKGNoYXIgKiliYWR3b3JkICsgU1RSTEVOKGJhZHdvcmQpLCAiJWQiLCBpICsgMSk7CgkgICAgcCA9IGJhZHdvcmQ7Cgl9CgoJaWYgKGR1bXBmbGFncyAmIERVTVBGTEFHX0NPVU5UKQoJewoJICAgIGhhc2hpdGVtX1QgICpoaTsKCgkgICAgLyogSW5jbHVkZSB0aGUgd29yZCBjb3VudCBmb3IgIjpzcGVsbGR1bXAhIi4gKi8KCSAgICBoaSA9IGhhc2hfZmluZCgmc2xhbmctPnNsX3dvcmRjb3VudCwgdHcpOwoJICAgIGlmICghSEFTSElURU1fRU1QVFkoaGkpKQoJICAgIHsKCQl2aW1fc25wcmludGYoKGNoYXIgKilJT2J1ZmYsIElPU0laRSwgIiVzXHQlZCIsCgkJCQkJCSAgICAgdHcsIEhJMldDKGhpKS0+d2NfY291bnQpOwoJCXAgPSBJT2J1ZmY7CgkgICAgfQoJfQoKCW1sX2FwcGVuZChsbnVtLCBwLCAoY29sbnJfVCkwLCBGQUxTRSk7CiAgICB9CiAgICBlbHNlIGlmICgoKGR1bXBmbGFncyAmIERVTVBGTEFHX0lDQVNFKQoJCSAgICA/IE1CX1NUUk5JQ01QKHAsIHBhdCwgU1RSTEVOKHBhdCkpID09IDAKCQkgICAgOiBTVFJOQ01QKHAsIHBhdCwgU1RSTEVOKHBhdCkpID09IDApCgkJJiYgaW5zX2NvbXBsX2FkZF9pbmZlcmNhc2UocCwgKGludClTVFJMRU4ocCksCgkJCQkJICBkdW1wZmxhZ3MgJiBEVU1QRkxBR19JQ0FTRSwKCQkJCQkgIE5VTEwsICpkaXIsIDApID09IE9LKQoJLyogaWYgZGlyIHdhcyBCQUNLV0FSRCB0aGVuIGhvbm9yIGl0IGp1c3Qgb25jZSAqLwoJKmRpciA9IEZPUldBUkQ7Cn0KCi8qCiAqIEZvciAiOnNwZWxsZHVtcCI6IEZpbmQgbWF0Y2hpbmcgcHJlZml4ZXMgZm9yICJ3b3JkIi4gIFByZXBlbmQgZWFjaCB0bwogKiAid29yZCIgYW5kIGFwcGVuZCBhIGxpbmUgdG8gdGhlIGJ1ZmZlci4KICogV2hlbiAibG51bSIgaXMgemVybyBhZGQgaW5zZXJ0IG1vZGUgY29tcGxldGlvbi4KICogUmV0dXJuIHRoZSB1cGRhdGVkIGxpbmUgbnVtYmVyLgogKi8KICAgIHN0YXRpYyBsaW5lbnJfVApkdW1wX3ByZWZpeGVzKHNsYW5nLCB3b3JkLCBwYXQsIGRpciwgZHVtcGZsYWdzLCBmbGFncywgc3RhcnRsbnVtKQogICAgc2xhbmdfVAkqc2xhbmc7CiAgICBjaGFyX3UJKndvcmQ7CSAgICAvKiBjYXNlLWZvbGRlZCB3b3JkICovCiAgICBjaGFyX3UJKnBhdDsKICAgIGludAkJKmRpcjsKICAgIGludAkJZHVtcGZsYWdzOwogICAgaW50CQlmbGFnczsJICAgIC8qIGZsYWdzIHdpdGggcHJlZml4IElEICovCiAgICBsaW5lbnJfVAlzdGFydGxudW07CnsKICAgIGlkeF9UCWFycmlkeFtNQVhXTEVOXTsKICAgIGludAkJY3VyaVtNQVhXTEVOXTsKICAgIGNoYXJfdQlwcmVmaXhbTUFYV0xFTl07CiAgICBjaGFyX3UJd29yZF91cFtNQVhXTEVOXTsKICAgIGludAkJaGFzX3dvcmRfdXAgPSBGQUxTRTsKICAgIGludAkJYzsKICAgIGNoYXJfdQkqYnl0czsKICAgIGlkeF9UCSppZHhzOwogICAgbGluZW5yX1QJbG51bSA9IHN0YXJ0bG51bTsKICAgIGludAkJZGVwdGg7CiAgICBpbnQJCW47CiAgICBpbnQJCWxlbjsKICAgIGludAkJaTsKCiAgICAvKiBJZiB0aGUgd29yZCBzdGFydHMgd2l0aCBhIGxvd2VyLWNhc2UgbGV0dGVyIG1ha2UgdGhlIHdvcmQgd2l0aCBhbgogICAgICogdXBwZXItY2FzZSBsZXR0ZXIgaW4gd29yZF91cFtdLiAqLwogICAgYyA9IFBUUjJDSEFSKHdvcmQpOwogICAgaWYgKFNQRUxMX1RPVVBQRVIoYykgIT0gYykKICAgIHsKCW9uZWNhcF9jb3B5KHdvcmQsIHdvcmRfdXAsIFRSVUUpOwoJaGFzX3dvcmRfdXAgPSBUUlVFOwogICAgfQoKICAgIGJ5dHMgPSBzbGFuZy0+c2xfcGJ5dHM7CiAgICBpZHhzID0gc2xhbmctPnNsX3BpZHhzOwogICAgaWYgKGJ5dHMgIT0gTlVMTCkJCS8qIGFycmF5IG5vdCBpcyBlbXB0eSAqLwogICAgewoJLyoKCSAqIExvb3Agb3ZlciBhbGwgcHJlZml4ZXMsIGJ1aWxkaW5nIHRoZW0gYnl0ZS1ieS1ieXRlIGluIHByZWZpeFtdLgoJICogV2hlbiBhdCB0aGUgZW5kIG9mIGEgcHJlZml4IGNoZWNrIHRoYXQgaXQgc3VwcG9ydHMgImZsYWdzIi4KCSAqLwoJZGVwdGggPSAwOwoJYXJyaWR4WzBdID0gMDsKCWN1cmlbMF0gPSAxOwoJd2hpbGUgKGRlcHRoID49IDAgJiYgIWdvdF9pbnQpCgl7CgkgICAgbiA9IGFycmlkeFtkZXB0aF07CgkgICAgbGVuID0gYnl0c1tuXTsKCSAgICBpZiAoY3VyaVtkZXB0aF0gPiBsZW4pCgkgICAgewoJCS8qIERvbmUgYWxsIGJ5dGVzIGF0IHRoaXMgbm9kZSwgZ28gdXAgb25lIGxldmVsLiAqLwoJCS0tZGVwdGg7CgkJbGluZV9icmVha2NoZWNrKCk7CgkgICAgfQoJICAgIGVsc2UKCSAgICB7CgkJLyogRG8gb25lIG1vcmUgYnl0ZSBhdCB0aGlzIG5vZGUuICovCgkJbiArPSBjdXJpW2RlcHRoXTsKCQkrK2N1cmlbZGVwdGhdOwoJCWMgPSBieXRzW25dOwoJCWlmIChjID09IDApCgkJewoJCSAgICAvKiBFbmQgb2YgcHJlZml4LCBmaW5kIG91dCBob3cgbWFueSBJRHMgdGhlcmUgYXJlLiAqLwoJCSAgICBmb3IgKGkgPSAxOyBpIDwgbGVuOyArK2kpCgkJCWlmIChieXRzW24gKyBpXSAhPSAwKQoJCQkgICAgYnJlYWs7CgkJICAgIGN1cmlbZGVwdGhdICs9IGkgLSAxOwoKCQkgICAgYyA9IHZhbGlkX3dvcmRfcHJlZml4KGksIG4sIGZsYWdzLCB3b3JkLCBzbGFuZywgRkFMU0UpOwoJCSAgICBpZiAoYyAhPSAwKQoJCSAgICB7CgkJCXZpbV9zdHJuY3B5KHByZWZpeCArIGRlcHRoLCB3b3JkLCBNQVhXTEVOIC0gZGVwdGggLSAxKTsKCQkJZHVtcF93b3JkKHNsYW5nLCBwcmVmaXgsIHBhdCwgZGlyLCBkdW1wZmxhZ3MsCgkJCQkoYyAmIFdGX1JBUkVQRlgpID8gKGZsYWdzIHwgV0ZfUkFSRSkKCQkJCQkJCSAgICAgICA6IGZsYWdzLCBsbnVtKTsKCQkJaWYgKGxudW0gIT0gMCkKCQkJICAgICsrbG51bTsKCQkgICAgfQoKCQkgICAgLyogQ2hlY2sgZm9yIHByZWZpeCB0aGF0IG1hdGNoZXMgdGhlIHdvcmQgd2hlbiB0aGUKCQkgICAgICogZmlyc3QgbGV0dGVyIGlzIHVwcGVyLWNhc2UsIGJ1dCBvbmx5IGlmIHRoZSBwcmVmaXggaGFzCgkJICAgICAqIGEgY29uZGl0aW9uLiAqLwoJCSAgICBpZiAoaGFzX3dvcmRfdXApCgkJICAgIHsKCQkJYyA9IHZhbGlkX3dvcmRfcHJlZml4KGksIG4sIGZsYWdzLCB3b3JkX3VwLCBzbGFuZywKCQkJCQkJCQkJVFJVRSk7CgkJCWlmIChjICE9IDApCgkJCXsKCQkJICAgIHZpbV9zdHJuY3B5KHByZWZpeCArIGRlcHRoLCB3b3JkX3VwLAoJCQkJCQkJIE1BWFdMRU4gLSBkZXB0aCAtIDEpOwoJCQkgICAgZHVtcF93b3JkKHNsYW5nLCBwcmVmaXgsIHBhdCwgZGlyLCBkdW1wZmxhZ3MsCgkJCQkgICAgKGMgJiBXRl9SQVJFUEZYKSA/IChmbGFncyB8IFdGX1JBUkUpCgkJCQkJCQkgICAgICAgOiBmbGFncywgbG51bSk7CgkJCSAgICBpZiAobG51bSAhPSAwKQoJCQkJKytsbnVtOwoJCQl9CgkJICAgIH0KCQl9CgkJZWxzZQoJCXsKCQkgICAgLyogTm9ybWFsIGNoYXIsIGdvIG9uZSBsZXZlbCBkZWVwZXIuICovCgkJICAgIHByZWZpeFtkZXB0aCsrXSA9IGM7CgkJICAgIGFycmlkeFtkZXB0aF0gPSBpZHhzW25dOwoJCSAgICBjdXJpW2RlcHRoXSA9IDE7CgkJfQoJICAgIH0KCX0KICAgIH0KCiAgICByZXR1cm4gbG51bTsKfQoKLyoKICogTW92ZSAicCIgdG8gdGhlIGVuZCBvZiB3b3JkICJzdGFydCIuCiAqIFVzZXMgdGhlIHNwZWxsLWNoZWNraW5nIHdvcmQgY2hhcmFjdGVycy4KICovCiAgICBjaGFyX3UgKgpzcGVsbF90b193b3JkX2VuZChzdGFydCwgYnVmKQogICAgY2hhcl91ICAqc3RhcnQ7CiAgICBidWZfVCAgICpidWY7CnsKICAgIGNoYXJfdSAgKnAgPSBzdGFydDsKCiAgICB3aGlsZSAoKnAgIT0gTlVMICYmIHNwZWxsX2lzd29yZHAocCwgYnVmKSkKCW1iX3B0cl9hZHYocCk7CiAgICByZXR1cm4gcDsKfQoKI2lmIGRlZmluZWQoRkVBVF9JTlNfRVhQQU5EKSB8fCBkZWZpbmVkKFBST1RPKQovKgogKiBGb3IgSW5zZXJ0IG1vZGUgY29tcGxldGlvbiBDVFJMLVggczoKICogRmluZCBzdGFydCBvZiB0aGUgd29yZCBpbiBmcm9udCBvZiBjb2x1bW4gInN0YXJ0Y29sIi4KICogV2UgZG9uJ3QgY2hlY2sgaWYgaXQgaXMgYmFkbHkgc3BlbGxlZCwgd2l0aCBjb21wbGV0aW9uIHdlIGNhbiBvbmx5IGNoYW5nZQogKiB0aGUgd29yZCBpbiBmcm9udCBvZiB0aGUgY3Vyc29yLgogKiBSZXR1cm5zIHRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSB3b3JkLgogKi8KICAgIGludApzcGVsbF93b3JkX3N0YXJ0KHN0YXJ0Y29sKQogICAgaW50CQlzdGFydGNvbDsKewogICAgY2hhcl91CSpsaW5lOwogICAgY2hhcl91CSpwOwogICAgaW50CQljb2wgPSAwOwoKICAgIGlmIChub19zcGVsbF9jaGVja2luZyhjdXJ3aW4pKQoJcmV0dXJuIHN0YXJ0Y29sOwoKICAgIC8qIEZpbmQgYSB3b3JkIGNoYXJhY3RlciBiZWZvcmUgInN0YXJ0Y29sIi4gKi8KICAgIGxpbmUgPSBtbF9nZXRfY3VybGluZSgpOwogICAgZm9yIChwID0gbGluZSArIHN0YXJ0Y29sOyBwID4gbGluZTsgKQogICAgewoJbWJfcHRyX2JhY2sobGluZSwgcCk7CglpZiAoc3BlbGxfaXN3b3JkcF9ubXcocCkpCgkgICAgYnJlYWs7CiAgICB9CgogICAgLyogR28gYmFjayB0byBzdGFydCBvZiB0aGUgd29yZC4gKi8KICAgIHdoaWxlIChwID4gbGluZSkKICAgIHsKCWNvbCA9IHAgLSBsaW5lOwoJbWJfcHRyX2JhY2sobGluZSwgcCk7CglpZiAoIXNwZWxsX2lzd29yZHAocCwgY3VyYnVmKSkKCSAgICBicmVhazsKCWNvbCA9IDA7CiAgICB9CgogICAgcmV0dXJuIGNvbDsKfQoKLyoKICogTmVlZCB0byBjaGVjayBmb3IgJ3NwZWxsY2FwY2hlY2snIG5vdywgdGhlIHdvcmQgaXMgcmVtb3ZlZCBiZWZvcmUKICogZXhwYW5kX3NwZWxsaW5nKCkgaXMgY2FsbGVkLiAgVGhlcmVmb3JlIHRoZSB1Z2x5IGdsb2JhbCB2YXJpYWJsZS4KICovCnN0YXRpYyBpbnQgc3BlbGxfZXhwYW5kX25lZWRfY2FwOwoKICAgIHZvaWQKc3BlbGxfZXhwYW5kX2NoZWNrX2NhcChjb2wpCiAgICBjb2xucl9UIGNvbDsKewogICAgc3BlbGxfZXhwYW5kX25lZWRfY2FwID0gY2hlY2tfbmVlZF9jYXAoY3Vyd2luLT53X2N1cnNvci5sbnVtLCBjb2wpOwp9CgovKgogKiBHZXQgbGlzdCBvZiBzcGVsbGluZyBzdWdnZXN0aW9ucy4KICogVXNlZCBmb3IgSW5zZXJ0IG1vZGUgY29tcGxldGlvbiBDVFJMLVggPy4KICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1hdGNoZXMuICBUaGUgbWF0Y2hlcyBhcmUgaW4gIm1hdGNocFtdIiwgYXJyYXkgb2YKICogYWxsb2NhdGVkIHN0cmluZ3MuCiAqLwovKkFSR1NVU0VEKi8KICAgIGludApleHBhbmRfc3BlbGxpbmcobG51bSwgY29sLCBwYXQsIG1hdGNocCkKICAgIGxpbmVucl9UCWxudW07CiAgICBpbnQJCWNvbDsKICAgIGNoYXJfdQkqcGF0OwogICAgY2hhcl91CSoqKm1hdGNocDsKewogICAgZ2FycmF5X1QJZ2E7CgogICAgc3BlbGxfc3VnZ2VzdF9saXN0KCZnYSwgcGF0LCAxMDAsIHNwZWxsX2V4cGFuZF9uZWVkX2NhcCwgVFJVRSk7CiAgICAqbWF0Y2hwID0gZ2EuZ2FfZGF0YTsKICAgIHJldHVybiBnYS5nYV9sZW47Cn0KI2VuZGlmCgojZW5kaWYgIC8qIEZFQVRfU1BFTEwgKi8K