LyogSW1wbGVtZW50YXRpb24gb2YgdGhlIFRSQU5TUE9TRSBpbnRyaW5zaWMKICAgQ29weXJpZ2h0IDIwMDMsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgIENvbnRyaWJ1dGVkIGJ5IFRvYmlhcyBTY2hs/HRlcgoKVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBGb3J0cmFuIDk1IHJ1bnRpbWUgbGlicmFyeSAobGliZ2ZvcnRyYW4pLgoKTGliZ2ZvcnRyYW4gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCm1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwpMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKSW4gYWRkaXRpb24gdG8gdGhlIHBlcm1pc3Npb25zIGluIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdGhlCkZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcyB5b3UgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gbGluayB0aGUKY29tcGlsZWQgdmVyc2lvbiBvZiB0aGlzIGZpbGUgaW50byBjb21iaW5hdGlvbnMgd2l0aCBvdGhlciBwcm9ncmFtcywKYW5kIHRvIGRpc3RyaWJ1dGUgdGhvc2UgY29tYmluYXRpb25zIHdpdGhvdXQgYW55IHJlc3RyaWN0aW9uIGNvbWluZwpmcm9tIHRoZSB1c2Ugb2YgdGhpcyBmaWxlLiAgKFRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHJlc3RyaWN0aW9ucwpkbyBhcHBseSBpbiBvdGhlciByZXNwZWN0czsgZm9yIGV4YW1wbGUsIHRoZXkgY292ZXIgbW9kaWZpY2F0aW9uIG9mCnRoZSBmaWxlLCBhbmQgZGlzdHJpYnV0aW9uIHdoZW4gbm90IGxpbmtlZCBpbnRvIGEgY29tYmluZQpleGVjdXRhYmxlLikKCkxpYmdmb3J0cmFuIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCk1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwpMaWNlbnNlIGFsb25nIHdpdGggbGliZ2ZvcnRyYW47IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LAp3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLApCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4gICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlICJsaWJnZm9ydHJhbi5oIgoKZXh0ZXJuIHZvaWQgdHJhbnNwb3NlIChnZmNfYXJyYXlfY2hhciAqLCBnZmNfYXJyYXlfY2hhciAqKTsKZXhwb3J0X3Byb3RvKHRyYW5zcG9zZSk7CgpzdGF0aWMgdm9pZAp0cmFuc3Bvc2VfaW50ZXJuYWwgKGdmY19hcnJheV9jaGFyICpyZXQsIGdmY19hcnJheV9jaGFyICpzb3VyY2UsCgkJICAgIGluZGV4X3R5cGUgc2l6ZSkKewogIC8qIHIuKiBpbmRpY2F0ZXMgdGhlIHJldHVybiBhcnJheS4gICovCiAgaW5kZXhfdHlwZSByeHN0cmlkZSwgcnlzdHJpZGU7CiAgY2hhciAqcnB0cjsKICAvKiBzLiogaW5kaWNhdGVzIHRoZSBzb3VyY2UgYXJyYXkuICAqLwogIGluZGV4X3R5cGUgc3hzdHJpZGUsIHN5c3RyaWRlOwogIGNvbnN0IGNoYXIgKnNwdHI7CgogIGluZGV4X3R5cGUgeGNvdW50LCB5Y291bnQ7CiAgaW5kZXhfdHlwZSB4LCB5OwoKICBhc3NlcnQgKEdGQ19ERVNDUklQVE9SX1JBTksgKHNvdXJjZSkgPT0gMgogICAgICAgICAgJiYgR0ZDX0RFU0NSSVBUT1JfUkFOSyAocmV0KSA9PSAyKTsKCiAgaWYgKHJldC0+ZGF0YSA9PSBOVUxMKQogICAgewogICAgICBhc3NlcnQgKHJldC0+ZHR5cGUgPT0gc291cmNlLT5kdHlwZSk7CgogICAgICByZXQtPmRpbVswXS5sYm91bmQgPSAwOwogICAgICByZXQtPmRpbVswXS51Ym91bmQgPSBzb3VyY2UtPmRpbVsxXS51Ym91bmQgLSBzb3VyY2UtPmRpbVsxXS5sYm91bmQ7CiAgICAgIHJldC0+ZGltWzBdLnN0cmlkZSA9IDE7CgogICAgICByZXQtPmRpbVsxXS5sYm91bmQgPSAwOwogICAgICByZXQtPmRpbVsxXS51Ym91bmQgPSBzb3VyY2UtPmRpbVswXS51Ym91bmQgLSBzb3VyY2UtPmRpbVswXS5sYm91bmQ7CiAgICAgIHJldC0+ZGltWzFdLnN0cmlkZSA9IHJldC0+ZGltWzBdLnVib3VuZCsxOwoKICAgICAgcmV0LT5kYXRhID0gaW50ZXJuYWxfbWFsbG9jX3NpemUgKHNpemUgKiBzaXplMCAoKGFycmF5X3QqKXJldCkpOwogICAgICByZXQtPm9mZnNldCA9IDA7CiAgICB9CgogIHN4c3RyaWRlID0gc291cmNlLT5kaW1bMF0uc3RyaWRlICogc2l6ZTsKICBzeXN0cmlkZSA9IHNvdXJjZS0+ZGltWzFdLnN0cmlkZSAqIHNpemU7CiAgeGNvdW50ID0gc291cmNlLT5kaW1bMF0udWJvdW5kICsgMSAtIHNvdXJjZS0+ZGltWzBdLmxib3VuZDsKICB5Y291bnQgPSBzb3VyY2UtPmRpbVsxXS51Ym91bmQgKyAxIC0gc291cmNlLT5kaW1bMV0ubGJvdW5kOwoKICByeHN0cmlkZSA9IHJldC0+ZGltWzBdLnN0cmlkZSAqIHNpemU7CiAgcnlzdHJpZGUgPSByZXQtPmRpbVsxXS5zdHJpZGUgKiBzaXplOwoKICBycHRyID0gcmV0LT5kYXRhOwogIHNwdHIgPSBzb3VyY2UtPmRhdGE7CgogIGZvciAoeSA9IDA7IHkgPCB5Y291bnQ7IHkrKykKICAgIHsKICAgICAgZm9yICh4ID0gMDsgeCA8IHhjb3VudDsgeCsrKQogICAgICAgIHsKICAgICAgICAgIG1lbWNweSAocnB0ciwgc3B0ciwgc2l6ZSk7CgogICAgICAgICAgc3B0ciArPSBzeHN0cmlkZTsKICAgICAgICAgIHJwdHIgKz0gcnlzdHJpZGU7CiAgICAgICAgfQogICAgICBzcHRyICs9IHN5c3RyaWRlIC0gKHN4c3RyaWRlICogeGNvdW50KTsKICAgICAgcnB0ciArPSByeHN0cmlkZSAtIChyeXN0cmlkZSAqIHhjb3VudCk7CiAgICB9Cn0KCmV4dGVybiB2b2lkIHRyYW5zcG9zZSAoZ2ZjX2FycmF5X2NoYXIgKiwgZ2ZjX2FycmF5X2NoYXIgKik7CmV4cG9ydF9wcm90byh0cmFuc3Bvc2UpOwoKdm9pZAp0cmFuc3Bvc2UgKGdmY19hcnJheV9jaGFyICpyZXQsIGdmY19hcnJheV9jaGFyICpzb3VyY2UpCnsKICB0cmFuc3Bvc2VfaW50ZXJuYWwgKHJldCwgc291cmNlLCBHRkNfREVTQ1JJUFRPUl9TSVpFIChzb3VyY2UpKTsKfQoKZXh0ZXJuIHZvaWQgdHJhbnNwb3NlX2NoYXIgKGdmY19hcnJheV9jaGFyICosIEdGQ19JTlRFR0VSXzQsCgkJCSAgICBnZmNfYXJyYXlfY2hhciAqLCBHRkNfSU5URUdFUl80KTsKZXhwb3J0X3Byb3RvKHRyYW5zcG9zZV9jaGFyKTsKCnZvaWQKdHJhbnNwb3NlX2NoYXIgKGdmY19hcnJheV9jaGFyICpyZXQsCgkJR0ZDX0lOVEVHRVJfNCByZXRfbGVuZ3RoIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAoJCWdmY19hcnJheV9jaGFyICpzb3VyY2UsIEdGQ19JTlRFR0VSXzQgc291cmNlX2xlbmd0aCkKewogIHRyYW5zcG9zZV9pbnRlcm5hbCAocmV0LCBzb3VyY2UsIHNvdXJjZV9sZW5ndGgpOwp9Cg==