LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0cy4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qCiAqIENvcHlyaWdodCCpIDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zIHNwZWNpZmllZCBpbiB0aGUgQ09QWUlORyBmaWxlCiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhlIE5ldC1TTk1QIHBhY2thZ2UuCiAqLwojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CgojaWZkZWYgSEFWRV9SRUdFWF9ICgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8ZXJybm8uaD4KCgojaWYgVElNRV9XSVRIX1NZU19USU1FCiMgaWZkZWYgV0lOMzIKIyAgaW5jbHVkZSA8c3lzL3RpbWViLmg+CiMgZWxzZQojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVuZGlmCiMgaW5jbHVkZSA8dGltZS5oPgojZWxzZQojIGlmIEhBVkVfU1lTX1RJTUVfSAojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVsc2UKIyAgaW5jbHVkZSA8dGltZS5oPgojIGVuZGlmCiNlbmRpZgojaWYgSEFWRV9XSU5TT0NLX0gKI2luY2x1ZGUgPHdpbnNvY2suaD4KI2VuZGlmCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtaW5jbHVkZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L25ldC1zbm1wLWFnZW50LWluY2x1ZGVzLmg+CgojaW5jbHVkZSAic3RydWN0LmgiCiNpbmNsdWRlICJsb2dtYXRjaC5oIgojaW5jbHVkZSAidXRpbF9mdW5jcy9oZWFkZXJfZ2VuZXJpYy5oIgojaW5jbHVkZSAidXRpbF9mdW5jcy9oZWFkZXJfc2ltcGxlX3RhYmxlLmgiCgojZGVmaW5lIE1BWExPR01BVENIICAgMjUwCgpzdHJ1Y3QgbG9nbWF0Y2hzdGF0IGxvZ21hdGNoVGFibGVbTUFYTE9HTUFUQ0hdOwppbnQgICAgICAgICAgICAgbG9nbWF0Y2hDb3VudDsKCnZvaWQKaW5pdF9sb2dtYXRjaCh2b2lkKQp7CiAgICBzdHJ1Y3QgdmFyaWFibGUyIGxvZ21hdGNoX2luZm9bXSA9IHsKICAgICAgICB7TE9HTUFUQ0hfSU5GTywgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgICAgICB2YXJfbG9nbWF0Y2hfdGFibGUsIDB9CiAgICB9OwoKICAgIHN0cnVjdCB2YXJpYWJsZTIgbG9nbWF0Y2hfdGFibGVbXSA9IHsKICAgICAgICB7TE9HTUFUQ0hfSU5ERVgsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICAgICAgdmFyX2xvZ21hdGNoX3RhYmxlLCAxLCB7MX19LAogICAgICAgIHtMT0dNQVRDSF9OQU1FLCBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICAgICAgdmFyX2xvZ21hdGNoX3RhYmxlLCAxLCB7Mn19LAogICAgICAgIHtMT0dNQVRDSF9GSUxFTkFNRSwgQVNOX09DVEVUX1NUUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgICAgIHZhcl9sb2dtYXRjaF90YWJsZSwgMSwgezN9fSwKICAgICAgICB7TE9HTUFUQ0hfUkVHRVgsIEFTTl9PQ1RFVF9TVFIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgICAgICB2YXJfbG9nbWF0Y2hfdGFibGUsIDEsIHs0fX0sCiAgICAgICAge0xPR01BVENIX0dMT0JBTENUUiwgQVNOX0NPVU5URVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgICAgICB2YXJfbG9nbWF0Y2hfdGFibGUsIDEsIHs1fX0sCiAgICAgICAge0xPR01BVENIX0dMT0JBTENOVCwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgICAgICB2YXJfbG9nbWF0Y2hfdGFibGUsIDEsIHs2fX0sCiAgICAgICAge0xPR01BVENIX0NVUlJFTlRDVFIsIEFTTl9DT1VOVEVSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICAgICAgdmFyX2xvZ21hdGNoX3RhYmxlLCAxLCB7N319LAogICAgICAgIHtMT0dNQVRDSF9DVVJSRU5UQ05ULCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgICAgIHZhcl9sb2dtYXRjaF90YWJsZSwgMSwgezh9fSwKICAgICAgICB7TE9HTUFUQ0hfQ09VTlRFUiwgQVNOX0NPVU5URVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgICAgICB2YXJfbG9nbWF0Y2hfdGFibGUsIDEsIHs5fX0sCiAgICAgICAge0xPR01BVENIX0NPVU5ULCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgICAgIHZhcl9sb2dtYXRjaF90YWJsZSwgMSwgezEwfX0sCiAgICAgICAge0xPR01BVENIX0ZSRVEsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICAgICAgdmFyX2xvZ21hdGNoX3RhYmxlLCAxLCB7MTF9fSwKICAgICAgICB7TE9HTUFUQ0hfRVJST1IsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICAgICAgdmFyX2xvZ21hdGNoX3RhYmxlLCAxLCB7MTAwfX0sCiAgICAgICAge0xPR01BVENIX01TRywgQVNOX09DVEVUX1NUUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgICAgIHZhcl9sb2dtYXRjaF90YWJsZSwgMSwgezEwMX19CiAgICB9OwoKICAgIC8qCiAgICAgKiBEZWZpbmUgdGhlIE9JRCBwb2ludGVyIHRvIHRoZSB0b3Agb2YgdGhlIG1pYiB0cmVlIHRoYXQgd2UncmUKICAgICAqIHJlZ2lzdGVyaW5nIHVuZGVybmVhdGggCiAgICAgKi8KICAgIG9pZCAgICAgICAgICAgICBsb2dtYXRjaF9pbmZvX29pZFtdID0geyBORVRTTk1QX1VDREFWSVNfTUlCLCAxNiwgMSB9OwogICAgb2lkICAgICAgICAgICAgIGxvZ21hdGNoX3ZhcmlhYmxlc19vaWRbXSA9IHsgTkVUU05NUF9VQ0RBVklTX01JQiwgMTYsIDIsIDEgfTsKCiAgICAvKgogICAgICogcmVnaXN0ZXIgb3Vyc2VsdmVzIHdpdGggdGhlIGFnZW50IHRvIGhhbmRsZSBvdXIgbWliIHRyZWUgCiAgICAgKi8KICAgIFJFR0lTVEVSX01JQigidWNkLXNubXAvbG9nbWF0Y2giLCBsb2dtYXRjaF9pbmZvLCB2YXJpYWJsZTIsCiAgICAgICAgICAgICAgICAgbG9nbWF0Y2hfaW5mb19vaWQpOwogICAgUkVHSVNURVJfTUlCKCJ1Y2Qtc25tcC9sb2dtYXRjaCIsIGxvZ21hdGNoX3RhYmxlLCB2YXJpYWJsZTIsCiAgICAgICAgICAgICAgICAgbG9nbWF0Y2hfdmFyaWFibGVzX29pZCk7CgogICAgc25tcGRfcmVnaXN0ZXJfY29uZmlnX2hhbmRsZXIoImxvZ21hdGNoIiwgbG9nbWF0Y2hfcGFyc2VfY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nbWF0Y2hfZnJlZV9jb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9nbWF0Y2ggbmFtZSBwYXRoIGN5Y2xldGltZSByZWdleCIpOwoKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiogISEhLS0tISEhIFBVQkxJQyAhISEgLS0tICEhISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqIGxvZ21hdGNoX2ZyZWVfY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiogZnJlZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoaXMgbWliIG1vZHVsZSAgICAgICAgICAgICAgICAgICAgICoKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp2b2lkCmxvZ21hdGNoX2ZyZWVfY29uZmlnKHZvaWQpCnsKICAgIGludCAgICAgICAgICAgICBpOwoKICAgIC8qCiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgKiB0aGUgb25seSBtZW1vcnkgd2UgaGF2ZSBhbGxvY2F0ZWQgICAgCiAgICAgKiBpcyB0aGUgbWVtb3J5IGFsbG9jYXRlZCBieSByZWdjb21wICAgCiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgKi8KCiAgICBmb3IgKGkgPSAwOyBpIDwgbG9nbWF0Y2hDb3VudDsgaSsrKSB7CgogICAgICAgIHJlZ2ZyZWUoJihsb2dtYXRjaFRhYmxlW2ldLnJlZ2V4QnVmZmVyKSk7CiAgICB9CiAgICBsb2dtYXRjaENvdW50ID0gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiogISEhLS0tISEhIFBVQkxJQyAhISEgLS0tICEhISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqIGxvZ21hdGNoX3BhcnNlX2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiogcGFyc2Ugb25lIGxpbmUgZnJvbSBzbm1wZC5jb25mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp2b2lkCmxvZ21hdGNoX3BhcnNlX2NvbmZpZyhjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqY3B0cikKewoKICAgIGNoYXIgc3BhY2VfbmFtZTsKICAgIGNoYXIgc3BhY2VfcGF0aDsKCiAgICBpZiAobG9nbWF0Y2hDb3VudCA8IE1BWExPR01BVENIKSB7CiAgICAgICAgbG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5mcmVxdWVuY3kgPSAzMDsKICAgICAgICBsb2dtYXRjaFRhYmxlW2xvZ21hdGNoQ291bnRdLnRoaXNJbmRleCA9IGxvZ21hdGNoQ291bnQ7CgoKICAgICAgICAvKgogICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAgICAgKiBiZSBjYXJlZnVsIHRoaXMgY291bnRlciBuZWVkcyB0byBiZSAgCiAgICAgICAgICogcmVzZXQgZnJvbSBwZXJzaXN0ZW50IHN0b3JhZ2UgICAgICAgICAKICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgICovCgogICAgICAgIGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0uZ2xvYmFsTWF0Y2hDb3VudGVyID0gMDsKICAgICAgICBsb2dtYXRjaFRhYmxlW2xvZ21hdGNoQ291bnRdLmN1cnJlbnRNYXRjaENvdW50ZXIgPSAwOwogICAgICAgIGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0ubWF0Y2hDb3VudGVyID0gMDsKICAgICAgICBsb2dtYXRjaFRhYmxlW2xvZ21hdGNoQ291bnRdLnZpcmdpbiA9IFRSVUU7CiAgICAgICAgbG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5jdXJyZW50RmlsZVBvc2l0aW9uID0gMDsKCgogICAgICAgIC8qCiAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAqIGJlIGNhcmVmdWw6IHRoZSBmbGFnIDI1NSBtdXN0IGZpdCB0byAKICAgICAgICAgKiB0aGUgc2l6ZSBvZiByZWdFeCBhcyBkZWZpbmRlZCBpbiAgICAgCiAgICAgICAgICogbG9nbWF0Y2guaCAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAgICAgKi8KCiAgICAgICAgc3NjYW5mKGNwdHIsICIlMjU1cyVjJTI1NXMlYyAlZCAlMjU1Y1xuIiwKICAgICAgICAgICAgICAgbG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5uYW1lLAoJICAgICAgICZzcGFjZV9uYW1lLAogICAgICAgICAgICAgICBsb2dtYXRjaFRhYmxlW2xvZ21hdGNoQ291bnRdLmZpbGVuYW1lUGF0dGVybiwKCSAgICAgICAmc3BhY2VfcGF0aCwKICAgICAgICAgICAgICAgJihsb2dtYXRjaFRhYmxlW2xvZ21hdGNoQ291bnRdLmZyZXF1ZW5jeSksCiAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0ucmVnRXgpOwoKICAgICAgICAvKiBmaWxsIGluIGZpbGVuYW1lIHdpdGggaW5pdGlhbCBkYXRhICovCiAgICAgICAgc3RyY3B5KGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0uZmlsZW5hbWUsIGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0uZmlsZW5hbWVQYXR0ZXJuKTsKICAgICAgICBsb2dtYXRjaF91cGRhdGVfZmlsZW5hbWUobG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5maWxlbmFtZVBhdHRlcm4sIGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0uZmlsZW5hbWUpOwoKCS8qCgkgKiBMb2cgYW4gZXJyb3IgdGhlbiByZXR1cm4gaWYgYW55IG9mIHRoZSBzdHJpbmdzIHNjYW5uZWQgaW4gd2VyZQoJICogbGFyZ2VyIHRoZW4gdGhleSBzaG91bGQgaGF2ZSBiZWVuLgoJICovCglpZiAoc3BhY2VfbmFtZSAhPSAnICcpIHsKCQlzbm1wX2xvZyhMT0dfRVJSLCAibG9nbWF0Y2hfcGFyc2VfY29uZmlnOiB0aGUgbmFtZSBzY2FubmVkICIgXAoJCSAiaW4gZnJvbSBsaW5lICVzIGlzIHRvbyBsYXJnZS4gbG9nbWF0Y2hDb3VudCA9ICVkXG4iLAoJCSBjcHRyLCBsb2dtYXRjaENvdW50KTsKCQlyZXR1cm47Cgl9IGVsc2UgaWYgKHNwYWNlX3BhdGggIT0gJyAnKSB7CgkJc25tcF9sb2coTE9HX0VSUiwgImxvZ21hdGNoX3BhcnNlX2NvbmZpZzogdGhlIGZpbGUgbmFtZSAiIFwKCQkgInNjYW5uZWQgaW4gZnJvbSBsaW5lICVzIGlzIHRvbyBsYXJnZS4gbG9nbWF0Y2hDb3VudCA9ICVkXG4iLAoJCSAgICBjcHRyLCBsb2dtYXRjaENvdW50KTsKCQlyZXR1cm47Cgl9CgogICAgICAgIC8qCiAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAqIGp1c3QgdG8gYmUgc2FmZSAiTlVMTCIgdGhlIGVuZCBvZiAgICAKICAgICAgICAgKiB0aGUgYXJhcnkgcmVnRXggYXMgc3NjYW5mIHdvbid0IGRvICAgCiAgICAgICAgICogaXQgd2l0aCB0aGUgJWMgbW9kaWZpZXIgICAgICAgICAgICAgIAogICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgICAgICAgKi8KCiAgICAgICAgbG9nbWF0Y2hUYWJsZVtsb2dtYXRjaENvdW50XS5yZWdFeFsyNTVdID0gJ1wwJzsKCgogICAgICAgIC8qCiAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAqIG5vdyBjb21waWxlIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gICAKICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgICovCgogICAgICAgIGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0ubXlSZWdleEVycm9yID0KICAgICAgICAgICAgcmVnY29tcCgmKGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0ucmVnZXhCdWZmZXIpLAogICAgICAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0ucmVnRXgsCiAgICAgICAgICAgICAgICAgICAgUkVHX0VYVEVOREVEIHwgUkVHX05PU1VCKTsKCiAgICAgICAgaWYgKGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0uZnJlcXVlbmN5ID4gMCkgewogICAgICAgICAgICBzbm1wX2FsYXJtX3JlZ2lzdGVyKGxvZ21hdGNoVGFibGVbbG9nbWF0Y2hDb3VudF0uZnJlcXVlbmN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBX1JFUEVBVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU05NUEFsYXJtQ2FsbGJhY2sgKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVMb2dtYXRjaF9TY2hlZHVsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihsb2dtYXRjaFRhYmxlW2xvZ21hdGNoQ291bnRdKQogICAgICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGxvZ21hdGNoQ291bnQrKzsKICAgIH0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqICEhIS0tLSEhISBQVUJMSUMgISEhIC0tLSAhISEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiB1cGRhdGVMb2dtYXRjaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJhY2sgYnkgc25tcGQgYWxhcm1zICAgICAgICAgICAgICAgICAqCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCnZvaWQKdXBkYXRlTG9nbWF0Y2goaW50IGlpbmRleCkKewoKICAgIGludCAgICAgICAgICAgICBtYXRjaFJlc3VsdENvZGU7CiAgICBjaGFyICAgICAgICAgICAgaW5idWZbMTAyNF07CiAgICBjaGFyICAgICAgICAgICAgcGVyZmlsZW5hbWVbMTAyNF07CiAgICBGSUxFICAgICAgICAgICAqcGVyZmlsZTsKICAgIHVuc2lnbmVkIGxvbmcgICBwb3MsIGNjb3VudGVyLCBjb3VudGVyOwogICAgaW50ICAgICAgICAgICAgIHJlc3VsdDsKICAgIGludCAgICAgICAgICAgICB0b29iaWc7CiAgICBpbnQgICAgICAgICAgICAgYW55Q2hhbmdlcyA9IEZBTFNFOwogICAgc3RydWN0IHN0YXQgICAgIHNiOwogICAgY2hhciAgICAgICAgICAgIGxhc3RGaWxlbmFtZVsyNTZdOwoKICAgIC8qCiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgKiB3ZSBjYW4gbmV2ZXIgYmUgc3VyZSBpZiB0aGlzIGlzIHRoZSAgCiAgICAgKiBsYXN0IHRpbWUgd2UgYXJlIGJlaW5nIGNhbGxlZCBoZXJlLCAgCiAgICAgKiBzbyB3ZSBhbHdheXMgdXBkYXRlIGEgcGVyc2lzdGVudCAgICAgCiAgICAgKiBkYXRhIGZpbGUgd2l0aCBvdXIgY3VycmVudCBmaWxlICAgICAgCiAgICAgKiBwb3NpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgKi8KCiAgICBzbnByaW50ZihwZXJmaWxlbmFtZSwgc2l6ZW9mKHBlcmZpbGVuYW1lKSwgIiVzL3NubXBkX2xvZ21hdGNoXyVzLnBvcyIsCglnZXRfcGVyc2lzdGVudF9kaXJlY3RvcnkoKSwgbG9nbWF0Y2hUYWJsZVtpaW5kZXhdLm5hbWUpOwoKICAgIGlmIChsb2dtYXRjaFRhYmxlW2lpbmRleF0udmlyZ2luKSB7CgogICAgICAgIC8qCiAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAqIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgYXJlIGJlaW5nICAKICAgICAgICAgKiBjYWxsZWQ7IGxldCdzIHRyeSB0byBmaW5kIGFuIG9sZCAgICAgCiAgICAgICAgICogZmlsZSBwb3NpdGlvbiBzdG9yZWQgaW4gYSBwZXJzaXN0ZW50IAogICAgICAgICAqIGRhdGEgZmlsZSBhbmQgcmVzdG9yZSBpdCAgICAgICAgICAgICAKICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgICovCgogICAgICAgIGlmICgocGVyZmlsZSA9IGZvcGVuKHBlcmZpbGVuYW1lLCAiciIpKSkgewoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAgICAgKiB0aGUgcGVyc2lzdGVudCBkYXRhIGZpbGUgZXhpc3RzIHNvICAgCiAgICAgICAgICAgICAqIGxldCdzIHJlYWQgaXQgb3V0ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAgICAgKi8KCgogICAgICAgICAgICBwb3MgPSBjb3VudGVyID0gY2NvdW50ZXIgPSAwOwoKICAgICAgICAgICAgaWYgKGZzY2FuZihwZXJmaWxlLCAiJWx1ICVsdSAlbHUgJXMiLCAmcG9zLCAmY2NvdW50ZXIsICZjb3VudGVyLCBsYXN0RmlsZW5hbWUpKSB7CgoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgICAgICAgICAgKiB0aGUgZGF0YSBjb3VsZCBiZSByZWFkOyBub3cgbGV0J3MgICAgCiAgICAgICAgICAgICAgICAgKiB0cnkgdG8gb3BlbiB0aGUgIGxvZ2ZpbGUgdG8gYmUgICAgICAgCiAgICAgICAgICAgICAgICAgKiBzY2FubmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICBpZiAobG9nbWF0Y2hfdXBkYXRlX2ZpbGVuYW1lKGxvZ21hdGNoVGFibGVbaWluZGV4XS5maWxlbmFtZVBhdHRlcm4sIGxhc3RGaWxlbmFtZSkgPT0gMCkgewoKICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAqIHRoZSBmaWxlbmFtZSBpcyBzdGlsbCB0aGUgc2FtZSBhcyAKICAgICAgICAgICAgICAgICAgICAgKiB0aGUgb25lIHN0b3JlZCBpbiB0aGUgcGVyc2lzdGVudAogICAgICAgICAgICAgICAgICAgICAqIGRhdGEgZmlsZS4KICAgICAgICAgICAgICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgaWYgKChsb2dtYXRjaFRhYmxlW2lpbmRleF0ubG9nZmlsZSA9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcGVuKGxvZ21hdGNoVGFibGVbaWluZGV4XS5maWxlbmFtZSwgInIiKSkpIHsKCgogICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBsb2cgZmlsZSBjb3VsZCBiZSBvcGVuZWQ7IG5vdyAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICogbGV0J3MgdHJ5IHRvIHNldCB0aGUgcG9pbnRlciAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmc2VlawogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvZ21hdGNoVGFibGVbaWluZGV4XS5sb2dmaWxlLCBwb3MsIFNFRUtfU0VUKSkgewoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIHBvaW50ZXIgY291bGQgYmUgc2V0IC0gdGhpcyBpcyAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIG1vc3QgdGhhdCB3ZSBjYW4gZG86IGlmIHRoZSAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcG9pbnRlciBpcyBzbWFsbGVyIHRoYW4gdGhlIGZpbGUgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZSB3ZSBtdXN0IGFzc3VtZSB0aGF0IHRoZSBwb2ludGVyIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3RpbGwgcG9pbnRzIHRvIHdoZXJlIGl0IHJlYWQgdGhlICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZmlsZSBsYXN0IHRpbWU7IGxldCdzIHJlc3RvcmUgdGhlICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmN1cnJlbnRGaWxlUG9zaXRpb24gPSBwb3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dtYXRjaFRhYmxlW2lpbmRleF0uY3VycmVudE1hdGNoQ291bnRlciA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NvdW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGZjbG9zZShsb2dtYXRjaFRhYmxlW2lpbmRleF0ubG9nZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmdsb2JhbE1hdGNoQ291bnRlciA9IGNvdW50ZXI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZjbG9zZShwZXJmaWxlKTsKICAgICAgICB9CgogICAgICAgIGxvZ21hdGNoVGFibGVbaWluZGV4XS52aXJnaW4gPSBGQUxTRTsKICAgIH0KCiAgICAvKgogICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogY2hlY2sgaWYgYSBuZXcgaW5wdXQgZmlsZSBuZWVkcyB0byBiZSBvcGVuZWQKICAgICAqIGlmIHllcywgcmVzZXQgY291bnRlciBhbmQgcG9zaXRpb24KICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqLwoKICAgIGlmIChsb2dtYXRjaF91cGRhdGVfZmlsZW5hbWUobG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmZpbGVuYW1lUGF0dGVybiwgbG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmZpbGVuYW1lKSA9PSAxKSB7CiAgICAgICAgbG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmN1cnJlbnRGaWxlUG9zaXRpb24gPSAwOyAKICAgICAgICBsb2dtYXRjaFRhYmxlW2lpbmRleF0uY3VycmVudE1hdGNoQ291bnRlciA9IDA7CiAgICB9CgoKICAgIC8qCiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgKiBub3cgdGhlIHBvaW50ZXIgYW5kIHRoZSBjb3VudGVyIGFyZSAgCiAgICAgKiBzZXQgZWl0aGVyIHplcm8gb3IgcmVzZXQgdG8gb2xkICAgICAgCiAgICAgKiB2YWx1ZTsgbm93IGxldCdzIHRyeSB0byByZWFkIHNvbWUgICAgCiAgICAgKiBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgKi8KCiAgICBpZiAoc3RhdChsb2dtYXRjaFRhYmxlW2lpbmRleF0uZmlsZW5hbWUsICZzYikgPT0gMCkgewoKICAgICAgICBpZiAobG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmN1cnJlbnRGaWxlUG9zaXRpb24gPiBzYi5zdF9zaXplKSB7CiAgICAgICAgICAgIHRvb2JpZyA9IFRSVUU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdG9vYmlnID0gRkFMU0U7CiAgICAgICAgfQoKICAgICAgICBpZiAoKGxvZ21hdGNoVGFibGVbaWluZGV4XS5sb2dmaWxlID0KICAgICAgICAgICAgZm9wZW4obG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmZpbGVuYW1lLCAiciIpKSkgewoKICAgICAgICAgICAgcmVzdWx0ID0KICAgICAgICAgICAgICAgIGZzZWVrKGxvZ21hdGNoVGFibGVbaWluZGV4XS5sb2dmaWxlLAogICAgICAgICAgICAgICAgICAgICAgbG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmN1cnJlbnRGaWxlUG9zaXRpb24sIFNFRUtfU0VUKTsKCiAgICAgICAgICAgIGlmIChyZXN1bHQgfHwgdG9vYmlnIHx8IChlcnJubyA9PSBFSU5WQUwpCiAgICAgICAgICAgICAgICB8fCBmZW9mKGxvZ21hdGNoVGFibGVbaWluZGV4XS5sb2dmaWxlKSkgewoKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAgICAgICAgICogd2hlbiB3ZSBhcmUgaGVyZSB0aGF0IG1lYW5zIHdlICAgICAgIAogICAgICAgICAgICAgICAgICogY291bGQndCBzZXQgdGhlIGZpbGUgcG9zaXRpb24gbWF5YmUgIAogICAgICAgICAgICAgICAgICogdGhlIGZpbGUgd2FzIHJvdGF0ZWQ7IGxldCdzIHJlc2V0ICAgIAogICAgICAgICAgICAgICAgICogdGhlIGZpbGVwb2ludGVyLCBidXQgbm90IHRoZSBjb3VudGVyIAogICAgICAgICAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAgICAgICAgICovCgoKICAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbaWluZGV4XS5jdXJyZW50RmlsZVBvc2l0aW9uID0gMDsKICAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbaWluZGV4XS5jdXJyZW50TWF0Y2hDb3VudGVyID0gMDsKICAgICAgICAgICAgICAgIGZzZWVrKGxvZ21hdGNoVGFibGVbaWluZGV4XS5sb2dmaWxlLCAwLCBTRUVLX1NFVCk7CiAgICAgICAgICAgICAgICBhbnlDaGFuZ2VzID0gVFJVRTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2hpbGUgKGZnZXRzCiAgICAgICAgICAgICAgICAgICAoaW5idWYsIHNpemVvZihpbmJ1ZiksIGxvZ21hdGNoVGFibGVbaWluZGV4XS5sb2dmaWxlKSkgewoKICAgICAgICAgICAgICAgIG1hdGNoUmVzdWx0Q29kZSA9CiAgICAgICAgICAgICAgICAgICAgcmVnZXhlYygmKGxvZ21hdGNoVGFibGVbaWluZGV4XS5yZWdleEJ1ZmZlciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmJ1ZiwgMCwgTlVMTCwgUkVHX05PVEVPTCk7CgogICAgICAgICAgICAgICAgaWYgKG1hdGNoUmVzdWx0Q29kZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgbG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmdsb2JhbE1hdGNoQ291bnRlcisrOwogICAgICAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbaWluZGV4XS5jdXJyZW50TWF0Y2hDb3VudGVyKys7CiAgICAgICAgICAgICAgICAgICAgbG9nbWF0Y2hUYWJsZVtpaW5kZXhdLm1hdGNoQ291bnRlcisrOwogICAgICAgICAgICAgICAgICAgIGFueUNoYW5nZXMgPSBUUlVFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBsb2dtYXRjaFRhYmxlW2lpbmRleF0uY3VycmVudEZpbGVQb3NpdGlvbiA9CiAgICAgICAgICAgICAgICBmdGVsbChsb2dtYXRjaFRhYmxlW2lpbmRleF0ubG9nZmlsZSk7CiAgICAgICAgICAgIGZjbG9zZShsb2dtYXRjaFRhYmxlW2lpbmRleF0ubG9nZmlsZSk7CiAgICAgICAgfQogICAgfQoKCiAgICAvKgogICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICogYXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc2FmZSB0aGF0ICAgIAogICAgICogb3VyIGN1cnJlbnQgZmlsZSBwb3NpdGlvbiBpcyAgICAgICAgIAogICAgICogc3RyYWlnaHRlbmVkIG91dCBvLmsuIC0gd2UgbmV2ZXIgICAgIAogICAgICoga25vdyBpZiB0aGlzIGlzIHRoZSBsYXN0IHRpbWUgd2UgYXJlIAogICAgICogYmVpbmcgY2FsbGVkIHNvIHNhdmUgdGhlIHBvc2l0aW9uICAgIAogICAgICogaW4gYSBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICovCgogICAgaWYgKGFueUNoYW5nZXMgJiYgKHBlcmZpbGUgPSBmb3BlbihwZXJmaWxlbmFtZSwgInciKSkpIHsKCgogICAgICAgIC8qCiAgICAgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAogICAgICAgICAqIG8uay4gbGV0cyB3cml0ZSBvdXQgb3VyIHZhcmlhYmxlICAgICAKICAgICAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCiAgICAgICAgICovCgogICAgICAgIGZwcmludGYocGVyZmlsZSwgIiVsdSAlbHUgJWx1ICVzXG4iLAogICAgICAgICAgICAgICAgbG9nbWF0Y2hUYWJsZVtpaW5kZXhdLmN1cnJlbnRGaWxlUG9zaXRpb24sCiAgICAgICAgICAgICAgICBsb2dtYXRjaFRhYmxlW2lpbmRleF0uY3VycmVudE1hdGNoQ291bnRlciwKICAgICAgICAgICAgICAgIGxvZ21hdGNoVGFibGVbaWluZGV4XS5nbG9iYWxNYXRjaENvdW50ZXIsCiAgICAgICAgICAgICAgICBsb2dtYXRjaFRhYmxlW2lpbmRleF0uZmlsZW5hbWUpOwoKICAgICAgICBmY2xvc2UocGVyZmlsZSk7CiAgICB9Cgp9CgoKdm9pZAp1cGRhdGVMb2dtYXRjaF9TY2hlZHVsZWQodW5zaWduZWQgaW50IHJlZ2lzdHJhdGlvbk51bWJlciwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBsb2dtYXRjaHN0YXQgKmxvZ21hdGNodGFibGUpCnsKCiAgICB1cGRhdGVMb2dtYXRjaChsb2dtYXRjaHRhYmxlLT50aGlzSW5kZXgpOwp9CgoKCgovKgogKiBPSUQgZnVuY3Rpb25zIAogKi8KCnVfY2hhciAgICAgICAgICoKdmFyX2xvZ21hdGNoX3RhYmxlKHN0cnVjdCB2YXJpYWJsZSAqdnAsCiAgICAgICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgaW50IGV4YWN0LAogICAgICAgICAgICAgICAgICAgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICBzdGF0aWMgbG9uZyAgICAgbG9uZ19yZXQ7CiAgICBzdGF0aWMgY2hhciAgICAgbWVzc2FnZVsxMDI0XTsKICAgIGludCAgICAgICAgICAgICBpaW5kZXg7CiAgICBzdHJ1Y3QgbG9nbWF0Y2hzdGF0ICpsb2dtYXRjaDsKCiAgICBpZiAodnAtPm1hZ2ljID09IExPR01BVENIX0lORk8pIHsKICAgICAgICBpZiAoaGVhZGVyX2dlbmVyaWModnAsIG5hbWUsIGxlbmd0aCwgZXhhY3QsIHZhcl9sZW4sIHdyaXRlX21ldGhvZCkKICAgICAgICAgICAgPT0gTUFUQ0hfRkFJTEVEKQogICAgICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgfSBlbHNlIHsKICAgICAgICBpZiAoaGVhZGVyX3NpbXBsZV90YWJsZQogICAgICAgICAgICAodnAsIG5hbWUsIGxlbmd0aCwgZXhhY3QsIHZhcl9sZW4sIHdyaXRlX21ldGhvZCwKICAgICAgICAgICAgIGxvZ21hdGNoQ291bnQpKQogICAgICAgICAgICByZXR1cm4gKE5VTEwpOwoKICAgICAgICBpaW5kZXggPSBuYW1lWypsZW5ndGggLSAxXSAtIDE7CiAgICAgICAgbG9nbWF0Y2ggPSAmbG9nbWF0Y2hUYWJsZVtpaW5kZXhdOwoKICAgICAgICBpZiAobG9nbWF0Y2gtPm15UmVnZXhFcnJvciA9PSAwKQogICAgICAgICAgICB1cGRhdGVMb2dtYXRjaChpaW5kZXgpOwogICAgfQoKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIExPR01BVENIX0lORk86CiAgICAgICAgbG9uZ19yZXQgPSBNQVhMT0dNQVRDSDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0OwoKICAgIGNhc2UgTE9HTUFUQ0hfSU5ERVg6CiAgICAgICAgbG9uZ19yZXQgPSBpaW5kZXggKyAxOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXQ7CgogICAgY2FzZSBMT0dNQVRDSF9OQU1FOgogICAgICAgICp2YXJfbGVuID0gc3RybGVuKGxvZ21hdGNoLT5uYW1lKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBsb2dtYXRjaC0+bmFtZTsKCiAgICBjYXNlIExPR01BVENIX0ZJTEVOQU1FOgogICAgICAgICp2YXJfbGVuID0gc3RybGVuKGxvZ21hdGNoLT5maWxlbmFtZSk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgbG9nbWF0Y2gtPmZpbGVuYW1lOwoKICAgIGNhc2UgTE9HTUFUQ0hfUkVHRVg6CiAgICAgICAgKnZhcl9sZW4gPSBzdHJsZW4obG9nbWF0Y2gtPnJlZ0V4KTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBsb2dtYXRjaC0+cmVnRXg7CgogICAgY2FzZSBMT0dNQVRDSF9HTE9CQUxDVFI6CiAgICBjYXNlIExPR01BVENIX0dMT0JBTENOVDoKICAgICAgICBsb25nX3JldCA9IChsb2dtYXRjaC0+Z2xvYmFsTWF0Y2hDb3VudGVyKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0OwoKICAgIGNhc2UgTE9HTUFUQ0hfQ1VSUkVOVENUUjoKICAgIGNhc2UgTE9HTUFUQ0hfQ1VSUkVOVENOVDoKICAgICAgICBsb25nX3JldCA9IChsb2dtYXRjaC0+Y3VycmVudE1hdGNoQ291bnRlcik7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKCiAgICBjYXNlIExPR01BVENIX0NPVU5URVI6CiAgICBjYXNlIExPR01BVENIX0NPVU5UOgogICAgICAgIGxvbmdfcmV0ID0gKGxvZ21hdGNoLT5tYXRjaENvdW50ZXIpOwogICAgICAgIGxvZ21hdGNoLT5tYXRjaENvdW50ZXIgPSAwOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXQ7CgogICAgY2FzZSBMT0dNQVRDSF9GUkVROgogICAgICAgIGxvbmdfcmV0ID0gbG9nbWF0Y2gtPmZyZXF1ZW5jeTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0OwoKICAgIGNhc2UgTE9HTUFUQ0hfRVJST1I6CiAgICAgICAgaWYgKGxvZ21hdGNoLT5mcmVxdWVuY3kgPj0gMCAmJiBsb2dtYXRjaC0+bXlSZWdleEVycm9yID09IDApCiAgICAgICAgICAgIGxvbmdfcmV0ID0gMDsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0ID0gMTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKCiAgICBjYXNlIExPR01BVENIX01TRzoKCiAgICAgICAgcmVnZXJyb3IobG9nbWF0Y2gtPm15UmVnZXhFcnJvciwgJihsb2dtYXRjaC0+cmVnZXhCdWZmZXIpLCBtZXNzYWdlLAogICAgICAgICAgICAgICAgIHNpemVvZihtZXNzYWdlKSk7CgogICAgICAgICp2YXJfbGVuID0gc3RybGVuKG1lc3NhZ2UpOwogICAgICAgIHJldHVybiAodV9jaGFyICopIG1lc3NhZ2U7CgogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2xvZ21hdGNoX3RhYmxlXG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT5tYWdpYykpOwogICAgfQoKICAgIHJldHVybiBOVUxMOwp9CgovKgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBmaWxlbmFtZSBwYXR0ZXJuIAogKiAgY29udGFpbnMgdGhlICUgY2hhcmFjdGVyIGluZGljYXRpbmcgYSB2YXJpYWJsZQogKiAgZmlsZW5hbWUgKGkuZS4gaXQgdXNlcyBkYXRlL3RpbWUgZm9ybWF0IGNvbnRyb2wgCiAqICBjb2Rlcywgc2VlICdtYW4gZGF0ZScpIHRoZW4gZXhwYW5kcyB0aG9zZSBjb250cm9sCiAqICBjb2RlcyBiYXNlZCBvbiBjdXJyZW50IHRpbWUgYW5kIHNldHMgdGhlIAogKiAgZmlsZW5hbWUgZmllbGQgaW4gdGhlIHN0cnVjdC4KICogIFJldHVybnMgMSBpZiB0aGUgZmlsZW5hbWUgY2hhbmdlZCwgMCBvdGhlcndpc2UKICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCgppbnQgbG9nbWF0Y2hfdXBkYXRlX2ZpbGVuYW1lKGNoYXIgKiBwYXR0ZXJuLCBjaGFyICogY3VycmVudEZpbGVuYW1lKSB7CiAgICB0aW1lX3QgdDsKICAgIHN0cnVjdCB0bSAqdG1wOwogICAgY2hhciBuZXdGaWxlbmFtZVsyNTZdOwoKICAgIC8qIAogICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogaWYgdGhlIGZpbGVuYW1lIHBhdHRlcm4gZG9lc24ndCBoYXZlIHRoZSAiJSIgY2hhcmFjdGVyIGp1c3QgcmV0dXJuLCAKICAgICAqIHNpbmNlIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZwogICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICovCiAgICBpZiAoc3Ryc3RyKHBhdHRlcm4sICIlIikgPT0gTlVMTCkgewogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIHQgPSB0aW1lKE5VTEwpOwogICAgdG1wID0gbG9jYWx0aW1lKCZ0KTsKCiAgICBpZiAodG1wID09IE5VTEwpIHsKICAgICAgICBwZXJyb3IoImxvY2FsdGltZSIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qIHJlc3VsdCBvZiBleHBhbnNpb24gbXVzdCBmaXQgaW50byBuZXdGaWxlbmFtZSwgb3RoZXJ3aXNlIHJldHVybmluZyAqLyAKICAgIGlmIChzdHJmdGltZShuZXdGaWxlbmFtZSwgc2l6ZW9mKG5ld0ZpbGVuYW1lKSwgcGF0dGVybiwgdG1wKSA9PSAwKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyogaWYgc2FtZSBhcyBjdXJyZW50IGZpbGVuYW1lLCBqdXN0IHJldHVybiAqLwogICAgaWYgKHN0cmNtcChjdXJyZW50RmlsZW5hbWUsIG5ld0ZpbGVuYW1lKSA9PSAwKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9IGVsc2UgewogICAgICAgIC8qIG90aGVyd2lzZSB1cGRhdGUgY3VycmVudEZpbGVuYW1lIGFuZCByZXR1cm4gMSAqLwogICAgICAgIHN0cmNweShjdXJyZW50RmlsZW5hbWUsIG5ld0ZpbGVuYW1lKTsgCiAgICAgICAgcmV0dXJuIDE7CiAgICB9Cn0KCiNlbmRpZiAvKiBIQVZFX1JFR0VYICovCg==