LyoKICBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxOSBTYW0gTGFudGluZ2EgPHNsb3VrZW5AbGlic2RsLm9yZz4KCiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KCiAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAogIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKCiAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQogICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQogICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCiAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKi8KI2luY2x1ZGUgIi4uL1NETF9pbnRlcm5hbC5oIgoKLyoKICogUkxFIGVuY29kaW5nIGZvciBzb2Z0d2FyZSBjb2xvcmtleSBhbmQgYWxwaGEtY2hhbm5lbCBhY2NlbGVyYXRpb24KICoKICogT3JpZ2luYWwgdmVyc2lvbiBieSBTYW0gTGFudGluZ2EKICoKICogTWF0dGlhcyBFbmdkZWflcmQgKFlvcmljayk6IFJld3JpdGUuIE5ldyBlbmNvZGluZyBmb3JtYXQsIGVuY29kZXIgYW5kCiAqIGRlY29kZXIuIEFkZGVkIHBlci1zdXJmYWNlIGFscGhhIGJsaXR0ZXIuIEFkZGVkIHBlci1waXhlbCBhbHBoYQogKiBmb3JtYXQsIGVuY29kZXIgYW5kIGJsaXR0ZXIuCiAqCiAqIE1hbnkgdGhhbmtzIHRvIFhhcmsgYW5kIGpvaG5zIGZvciBoaW50cywgYmVuY2htYXJrcyBhbmQgdXNlZnVsIGNvbW1lbnRzCiAqIGxlYWRpbmcgdG8gdGhpcyBjb2RlLgogKgogKiBXZWxjb21lIHRvIE1hY3JvIE1heWhlbS4KICovCgovKgogKiBUaGUgZW5jb2RpbmcgdHJhbnNsYXRlcyB0aGUgaW1hZ2UgZGF0YSB0byBhIHN0cmVhbSBvZiBzZWdtZW50cyBvZiB0aGUgZm9ybQogKgogKiA8c2tpcD4gPHJ1bj4gPGRhdGE+CiAqCiAqIHdoZXJlIDxza2lwPiBpcyB0aGUgbnVtYmVyIG9mIHRyYW5zcGFyZW50IHBpeGVscyB0byBza2lwLAogKiAgICAgICA8cnVuPiAgaXMgdGhlIG51bWJlciBvZiBvcGFxdWUgcGl4ZWxzIHRvIGJsaXQsCiAqIGFuZCAgIDxkYXRhPiBhcmUgdGhlIHBpeGVscyB0aGVtc2VsdmVzLgogKgogKiBUaGlzIGJhc2ljIHN0cnVjdHVyZSBpcyB1c2VkIGJvdGggZm9yIGNvbG9ya2V5ZWQgc3VyZmFjZXMsIHVzZWQgZm9yIHNpbXBsZQogKiBiaW5hcnkgdHJhbnNwYXJlbmN5IGFuZCBmb3IgcGVyLXN1cmZhY2UgYWxwaGEgYmxlbmRpbmcsIGFuZCBmb3Igc3VyZmFjZXMKICogd2l0aCBwZXItcGl4ZWwgYWxwaGEuIFRoZSBkZXRhaWxzIGRpZmZlciwgaG93ZXZlcjoKICoKICogRW5jb2Rpbmcgb2YgY29sb3JrZXllZCBzdXJmYWNlczoKICoKICogICBFbmNvZGVkIHBpeGVscyBhbHdheXMgaGF2ZSB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIHRhcmdldCBzdXJmYWNlLgogKiAgIDxza2lwPiBhbmQgPHJ1bj4gYXJlIHVuc2lnbmVkIDggYml0IGludGVnZXJzLCBleGNlcHQgZm9yIDMyIGJpdCBkZXB0aAogKiAgIHdoZXJlIHRoZXkgYXJlIDE2IGJpdC4gVGhpcyBtYWtlcyB0aGUgcGl4ZWwgZGF0YSBhbGlnbmVkIGF0IGFsbCB0aW1lcy4KICogICBTZWdtZW50cyBuZXZlciB3cmFwIGFyb3VuZCBmcm9tIG9uZSBzY2FuIGxpbmUgdG8gdGhlIG5leHQuCiAqCiAqICAgVGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UgaXMgbWFya2VkIGJ5IGEgemVybyA8c2tpcD4sPHJ1bj4gcGFpciBhdCB0aGUgKgogKiAgIGJlZ2lubmluZyBvZiBhIGxpbmUuCiAqCiAqIEVuY29kaW5nIG9mIHN1cmZhY2VzIHdpdGggcGVyLXBpeGVsIGFscGhhOgogKgogKiAgIFRoZSBzZXF1ZW5jZSBiZWdpbnMgd2l0aCBhIHN0cnVjdCBSTEVEZXN0Rm9ybWF0IGRlc2NyaWJpbmcgdGhlIHRhcmdldAogKiAgIHBpeGVsIGZvcm1hdCwgdG8gcHJvdmlkZSByZWxpYWJsZSB1bi1lbmNvZGluZy4KICoKICogICBFYWNoIHNjYW4gbGluZSBpcyBlbmNvZGVkIHR3aWNlOiBGaXJzdCBhbGwgY29tcGxldGVseSBvcGFxdWUgcGl4ZWxzLAogKiAgIGVuY29kZWQgaW4gdGhlIHRhcmdldCBmb3JtYXQgYXMgZGVzY3JpYmVkIGFib3ZlLCBhbmQgdGhlbiBhbGwKICogICBwYXJ0aWFsbHkgdHJhbnNwYXJlbnQgKHRyYW5zbHVjZW50KSBwaXhlbHMgKHdoZXJlIDEgPD0gYWxwaGEgPD0gMjU0KSwKICogICBpbiB0aGUgZm9sbG93aW5nIDMyLWJpdCBmb3JtYXQ6CiAqCiAqICAgRm9yIDMyLWJpdCB0YXJnZXRzLCBlYWNoIHBpeGVsIGhhcyB0aGUgdGFyZ2V0IFJHQiBmb3JtYXQgYnV0IHdpdGgKICogICB0aGUgYWxwaGEgdmFsdWUgb2NjdXB5aW5nIHRoZSBoaWdoZXN0IDggYml0cy4gVGhlIDxza2lwPiBhbmQgPHJ1bj4KICogICBjb3VudHMgYXJlIDE2IGJpdC4KICoKICogICBGb3IgMTYtYml0IHRhcmdldHMsIGVhY2ggcGl4ZWwgaGFzIHRoZSB0YXJnZXQgUkdCIGZvcm1hdCwgYnV0IHdpdGgKICogICB0aGUgbWlkZGxlIGNvbXBvbmVudCAodXN1YWxseSBncmVlbikgc2hpZnRlZCAxNiBzdGVwcyB0byB0aGUgbGVmdCwKICogICBhbmQgdGhlIGhvbGUgZmlsbGVkIHdpdGggdGhlIDUgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBhbHBoYSB2YWx1ZS4KICogICBpLmUuIGlmIHRoZSB0YXJnZXQgaGFzIHRoZSBmb3JtYXQgICAgICAgICBycnJycmdnZ2dnZ2JiYmJiLAogKiAgIHRoZSBlbmNvZGVkIHBpeGVsIHdpbGwgYmUgMDAwMDBnZ2dnZ2cwMDAwMHJycnJyMGFhYWFhYmJiYmIuCiAqICAgVGhlIDxza2lwPiBhbmQgPHJ1bj4gY291bnRzIGFyZSA4IGJpdCBmb3IgdGhlIG9wYXF1ZSBsaW5lcywgMTYgYml0CiAqICAgZm9yIHRoZSB0cmFuc2x1Y2VudCBsaW5lcy4gVHdvIHBhZGRpbmcgYnl0ZXMgbWF5IGJlIGluc2VydGVkCiAqICAgYmVmb3JlIGVhY2ggdHJhbnNsdWNlbnQgbGluZSB0byBrZWVwIHRoZW0gMzItYml0IGFsaWduZWQuCiAqCiAqICAgVGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UgaXMgbWFya2VkIGJ5IGEgemVybyA8c2tpcD4sPHJ1bj4gcGFpciBhdCB0aGUKICogICBiZWdpbm5pbmcgb2YgYW4gb3BhcXVlIGxpbmUuCiAqLwoKI2luY2x1ZGUgIlNETF92aWRlby5oIgojaW5jbHVkZSAiU0RMX3N5c3ZpZGVvLmgiCiNpbmNsdWRlICJTRExfYmxpdC5oIgojaW5jbHVkZSAiU0RMX1JMRWFjY2VsX2MuaCIKCiNpZm5kZWYgTUlOCiNkZWZpbmUgTUlOKGEsIGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCiNlbmRpZgoKI2RlZmluZSBQSVhFTF9DT1BZKHRvLCBmcm9tLCBsZW4sIGJwcCkgICAgICAgICAgXAogICAgU0RMX21lbWNweSh0bywgZnJvbSwgKHNpemVfdCkobGVuKSAqIChicHApKQoKLyoKICogVmFyaW91cyBjb2xvcmtleSBibGl0IG1ldGhvZHMsIGZvciBvcGFxdWUgYW5kIHBlci1zdXJmYWNlIGFscGhhCiAqLwoKI2RlZmluZSBPUEFRVUVfQkxJVCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKSAgIFwKICAgIFBJWEVMX0NPUFkodG8sIGZyb20sIGxlbmd0aCwgYnBwKQoKLyoKICogRm9yIDMyYnBwIHBpeGVscyBvbiB0aGUgZm9ybSAweDAwcnJnZ2JiOgogKiBJZiB3ZSB0cmVhdCB0aGUgbWlkZGxlIGNvbXBvbmVudCBzZXBhcmF0ZWx5LCB3ZSBjYW4gcHJvY2VzcyB0aGUgdHdvCiAqIHJlbWFpbmluZyBpbiBwYXJhbGxlbC4gVGhpcyBpcyBzYWZlIHRvIGRvIGJlY2F1c2Ugb2YgdGhlIGdhcCB0byB0aGUgbGVmdAogKiBvZiBlYWNoIGNvbXBvbmVudCwgc28gdGhlIGJpdHMgZnJvbSB0aGUgbXVsdGlwbGljYXRpb24gZG9uJ3QgY29sbGlkZS4KICogVGhpcyBjYW4gYmUgdXNlZCBmb3IgYW55IFJHQiBwZXJtdXRhdGlvbiBvZiBjb3Vyc2UuCiAqLwojZGVmaW5lIEFMUEhBX0JMSVQzMl84ODgodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQzMiAqc3JjID0gKFVpbnQzMiAqKShmcm9tKTsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyICpkc3QgPSAoVWludDMyICopKHRvKTsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkobGVuZ3RoKTsgaSsrKSB7ICAgICAgICAgICAgICAgXAogICAgICAgICAgICBVaW50MzIgcyA9ICpzcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFVpbnQzMiBkID0gKmRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgVWludDMyIHMxID0gcyAmIDB4ZmYwMGZmOyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBVaW50MzIgZDEgPSBkICYgMHhmZjAwZmY7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGQxID0gKGQxICsgKChzMSAtIGQxKSAqIGFscGhhID4+IDgpKSAmIDB4ZmYwMGZmOyBcCiAgICAgICAgICAgIHMgJj0gMHhmZjAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZCAmPSAweGZmMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBkID0gKGQgKyAoKHMgLSBkKSAqIGFscGhhID4+IDgpKSAmIDB4ZmYwMDsgICAgICBcCiAgICAgICAgICAgICpkc3QrKyA9IGQxIHwgZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSAoMCkKCi8qCiAqIEZvciAxNmJwcCBwaXhlbHMgd2UgY2FuIGdvIGEgc3RlcCBmdXJ0aGVyOiBwdXQgdGhlIG1pZGRsZSBjb21wb25lbnQKICogaW4gdGhlIGhpZ2ggMTYgYml0cyBvZiBhIDMyIGJpdCB3b3JkLCBhbmQgcHJvY2VzcyBhbGwgdGhyZWUgUkdCCiAqIGNvbXBvbmVudHMgYXQgdGhlIHNhbWUgdGltZS4gU2luY2UgdGhlIHNtYWxsZXN0IGdhcCBpcyBoZXJlIGp1c3QKICogNSBiaXRzLCB3ZSBoYXZlIHRvIHNjYWxlIGFscGhhIGRvd24gdG8gNSBiaXRzIGFzIHdlbGwuCiAqLwojZGVmaW5lIEFMUEhBX0JMSVQxNl81NjUodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQxNiAqc3JjID0gKFVpbnQxNiAqKShmcm9tKTsgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MTYgKmRzdCA9IChVaW50MTYgKikodG8pOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyIEFMUEhBID0gYWxwaGEgPj4gMzsgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGZvcihpID0gMDsgaSA8IChpbnQpKGxlbmd0aCk7IGkrKykgeyAgICAgICAgICAgIFwKICAgICAgICAgICAgVWludDMyIHMgPSAqc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFVpbnQzMiBkID0gKmRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBzID0gKHMgfCBzIDw8IDE2KSAmIDB4MDdlMGY4MWY7ICAgICAgICAgICAgIFwKICAgICAgICAgICAgZCA9IChkIHwgZCA8PCAxNikgJiAweDA3ZTBmODFmOyAgICAgICAgICAgICBcCiAgICAgICAgICAgIGQgKz0gKHMgLSBkKSAqIEFMUEhBID4+IDU7ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBkICY9IDB4MDdlMGY4MWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgKmRzdCsrID0gKFVpbnQxNikoZCB8IGQgPj4gMTYpOyAgICAgICAgICAgICBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKI2RlZmluZSBBTFBIQV9CTElUMTZfNTU1KHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MTYgKnNyYyA9IChVaW50MTYgKikoZnJvbSk7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDE2ICpkc3QgPSAoVWludDE2ICopKHRvKTsgICAgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQzMiBBTFBIQSA9IGFscGhhID4+IDM7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBmb3IoaSA9IDA7IGkgPCAoaW50KShsZW5ndGgpOyBpKyspIHsgICAgICAgICAgICBcCiAgICAgICAgICAgIFVpbnQzMiBzID0gKnNyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBVaW50MzIgZCA9ICpkc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgcyA9IChzIHwgcyA8PCAxNikgJiAweDAzZTA3YzFmOyAgICAgICAgICAgICBcCiAgICAgICAgICAgIGQgPSAoZCB8IGQgPDwgMTYpICYgMHgwM2UwN2MxZjsgICAgICAgICAgICAgXAogICAgICAgICAgICBkICs9IChzIC0gZCkgKiBBTFBIQSA+PiA1OyAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZCAmPSAweDAzZTA3YzFmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICpkc3QrKyA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsgICAgICAgICAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCi8qCiAqIFRoZSBnZW5lcmFsIHNsb3cgY2F0Y2gtYWxsIGZ1bmN0aW9uLCBmb3IgcmVtYWluaW5nIGRlcHRocyBhbmQgZm9ybWF0cwogKi8KI2RlZmluZSBBTFBIQV9CTElUX0FOWSh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKSAgICAgICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50OCAqc3JjID0gZnJvbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50OCAqZHN0ID0gdG87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkobGVuZ3RoKTsgaSsrKSB7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgVWludDMyIHMsIGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgdW5zaWduZWQgcnMsIGdzLCBicywgcmQsIGdkLCBiZDsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgc3dpdGNoIChicHApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIHMgPSAqKFVpbnQxNiAqKXNyYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGQgPSAqKFVpbnQxNiAqKWRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGlmIChTRExfQllURU9SREVSID09IFNETF9CSUdfRU5ESUFOKSB7ICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBzID0gKHNyY1swXSA8PCAxNikgfCAoc3JjWzFdIDw8IDgpIHwgc3JjWzJdOyBcCiAgICAgICAgICAgICAgICAgICAgZCA9IChkc3RbMF0gPDwgMTYpIHwgKGRzdFsxXSA8PCA4KSB8IGRzdFsyXTsgXAogICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIHMgPSAoc3JjWzJdIDw8IDE2KSB8IChzcmNbMV0gPDwgOCkgfCBzcmNbMF07IFwKICAgICAgICAgICAgICAgICAgICBkID0gKGRzdFsyXSA8PCAxNikgfCAoZHN0WzFdIDw8IDgpIHwgZHN0WzBdOyBcCiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNhc2UgNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBzID0gKihVaW50MzIgKilzcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBkID0gKihVaW50MzIgKilkc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFJHQl9GUk9NX1BJWEVMKHMsIGZtdCwgcnMsIGdzLCBicyk7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFJHQl9GUk9NX1BJWEVMKGQsIGZtdCwgcmQsIGdkLCBiZCk7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHJkICs9IChycyAtIHJkKSAqIGFscGhhID4+IDg7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGdkICs9IChncyAtIGdkKSAqIGFscGhhID4+IDg7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGJkICs9IChicyAtIGJkKSAqIGFscGhhID4+IDg7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFBJWEVMX0ZST01fUkdCKGQsIGZtdCwgcmQsIGdkLCBiZCk7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHN3aXRjaCAoYnBwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAqKFVpbnQxNiAqKWRzdCA9IChVaW50MTYpZDsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBpZiAoU0RMX0JZVEVPUkRFUiA9PSBTRExfQklHX0VORElBTikgeyAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZHN0WzBdID0gKFVpbnQ4KShkID4+IDE2KTsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZHN0WzFdID0gKFVpbnQ4KShkID4+IDgpOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZHN0WzJdID0gKFVpbnQ4KShkKTsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZHN0WzBdID0gKFVpbnQ4KWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZHN0WzFdID0gKFVpbnQ4KShkID4+IDgpOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZHN0WzJdID0gKFVpbnQ4KShkID4+IDE2KTsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNhc2UgNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAqKFVpbnQzMiAqKWRzdCA9IGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHNyYyArPSBicHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGRzdCArPSBicHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgovKgogKiBTcGVjaWFsIGNhc2U6IDUwJSBhbHBoYSAoYWxwaGE9MTI4KQogKiBUaGlzIGlzIHRyZWF0ZWQgc3BlY2lhbGx5IGJlY2F1c2UgaXQgY2FuIGJlIG9wdGltaXplZCB2ZXJ5IHdlbGwsIGFuZAogKiBzaW5jZSBpdCBpcyBnb29kIGZvciBtYW55IGNhc2VzIG9mIHNlbWktdHJhbnNsdWNlbmN5LgogKiBUaGUgdGhlb3J5IGlzIHRvIGRvIGFsbCB0aHJlZSBjb21wb25lbnRzIGF0IHRoZSBzYW1lIHRpbWU6CiAqIEZpcnN0IHplcm8gdGhlIGxvd2VzdCBiaXQgb2YgZWFjaCBjb21wb25lbnQsIHdoaWNoIGdpdmVzIHVzIHJvb20gdG8KICogYWRkIHRoZW0uIFRoZW4gc2hpZnQgcmlnaHQgYW5kIGFkZCB0aGUgc3VtIG9mIHRoZSBsb3dlc3QgYml0cy4KICovCiNkZWZpbmUgQUxQSEFfQkxJVDMyXzg4OF81MCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKSAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyICpzcmMgPSAoVWludDMyICopKGZyb20pOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyICpkc3QgPSAoVWludDMyICopKHRvKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZm9yKGkgPSAwOyBpIDwgKGludCkobGVuZ3RoKTsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFVpbnQzMiBzID0gKnNyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFVpbnQzMiBkID0gKmRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICpkc3QrKyA9ICgoKHMgJiAweDAwZmVmZWZlKSArIChkICYgMHgwMGZlZmVmZSkpID4+IDEpIFwKICAgICAgICAgICAgICAgICArIChzICYgZCAmIDB4MDAwMTAxMDEpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCi8qCiAqIEZvciAxNmJwcCwgd2UgY2FuIGFjdHVhbGx5IGJsZW5kIHR3byBwaXhlbHMgaW4gcGFyYWxsZWwsIGlmIHdlIHRha2UKICogY2FyZSB0byBzaGlmdCBiZWZvcmUgd2UgYWRkLCBub3QgYWZ0ZXIuCiAqLwoKLyogaGVscGVyOiBibGVuZCBhIHNpbmdsZSAxNiBiaXQgcGl4ZWwgYXQgNTAlICovCiNkZWZpbmUgQkxFTkQxNl81MChkc3QsIHNyYywgbWFzaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyIHMgPSAqc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyIGQgPSAqZHN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgKmRzdCsrID0gKFVpbnQxNikoKCgocyAmIG1hc2spICsgKGQgJiBtYXNrKSkgPj4gMSkgKyAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgKHMgJiBkICYgKH5tYXNrICYgMHhmZmZmKSkpOyAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgovKiBiYXNpYyAxNmJwcCBibGVuZGVyLiBtYXNrIGlzIHRoZSBwaXhlbHMgdG8ga2VlcCB3aGVuIGFkZGluZy4gKi8KI2RlZmluZSBBTFBIQV9CTElUMTZfNTAodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSwgbWFzaykgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB1bnNpZ25lZCBuID0gKGxlbmd0aCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MTYgKnNyYyA9IChVaW50MTYgKikoZnJvbSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MTYgKmRzdCA9IChVaW50MTYgKikodG8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpZiAoKCh1aW50cHRyX3Qpc3JjIF4gKHVpbnRwdHJfdClkc3QpICYgMykgeyAgICAgICAgICAgIFwKICAgICAgICAgICAgLyogc291cmNlIGFuZCBkZXN0aW5hdGlvbiBub3QgaW4gcGhhc2UsIGJsaXQgb25lIGJ5IG9uZSAqLyBcCiAgICAgICAgICAgIHdoaWxlIChuLS0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBCTEVORDE2XzUwKGRzdCwgc3JjLCBtYXNrKTsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmICgodWludHB0cl90KXNyYyAmIDMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAvKiBmaXJzdCBvZGQgcGl4ZWwgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBCTEVORDE2XzUwKGRzdCwgc3JjLCBtYXNrKTsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBuLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGZvciAoOyBuID4gMTsgbiAtPSAyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBVaW50MzIgcyA9ICooVWludDMyICopc3JjOyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBVaW50MzIgZCA9ICooVWludDMyICopZHN0OyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAqKFVpbnQzMiAqKWRzdCA9ICgocyAmIChtYXNrIHwgbWFzayA8PCAxNikpID4+IDEpIFwKICAgICAgICAgICAgICAgICAgICArICgoZCAmIChtYXNrIHwgbWFzayA8PCAxNikpID4+IDEpICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICArIChzICYgZCAmICh+KG1hc2sgfCBtYXNrIDw8IDE2KSkpOyAgICAgICAgIFwKICAgICAgICAgICAgICAgIHNyYyArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGRzdCArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYgKG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIEJMRU5EMTZfNTAoZHN0LCBzcmMsIG1hc2spOyAvKiBsYXN0IG9kZCBwaXhlbCAqLyBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgojZGVmaW5lIEFMUEhBX0JMSVQxNl81NjVfNTAodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkgICAgICAgXAogICAgQUxQSEFfQkxJVDE2XzUwKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEsICh1bnNpZ25lZCBpbnQpMHhmN2RlKQoKI2RlZmluZSBBTFBIQV9CTElUMTZfNTU1XzUwKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpICAgICAgIFwKICAgIEFMUEhBX0JMSVQxNl81MCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhLCAodW5zaWduZWQgaW50KTB4ZmJkZSkKCiNkZWZpbmUgQ0hPT1NFX0JMSVQoYmxpdHRlciwgYWxwaGEsIGZtdCkgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaWYgKGFscGhhID09IDI1NSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHN3aXRjaCAoZm10LT5CeXRlc1BlclBpeGVsKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNhc2UgMTogYmxpdHRlcigxLCBVaW50OCwgT1BBUVVFX0JMSVQpOyBicmVhazsgICAgICBcCiAgICAgICAgICAgIGNhc2UgMjogYmxpdHRlcigyLCBVaW50OCwgT1BBUVVFX0JMSVQpOyBicmVhazsgICAgICBcCiAgICAgICAgICAgIGNhc2UgMzogYmxpdHRlcigzLCBVaW50OCwgT1BBUVVFX0JMSVQpOyBicmVhazsgICAgICBcCiAgICAgICAgICAgIGNhc2UgNDogYmxpdHRlcig0LCBVaW50MTYsIE9QQVFVRV9CTElUKTsgYnJlYWs7ICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHN3aXRjaCAoZm10LT5CeXRlc1BlclBpeGVsKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAvKiBObyA4YnBwIGFscGhhIGJsaXR0aW5nICovICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZtdC0+Um1hc2sgfCBmbXQtPkdtYXNrIHwgZm10LT5CbWFzaykgeyBcCiAgICAgICAgICAgICAgICBjYXNlIDB4ZmZmZjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgaWYgKGZtdC0+R21hc2sgPT0gMHgwN2UwICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGZtdC0+Um1hc2sgPT0gMHgwN2UwICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGZtdC0+Qm1hc2sgPT0gMHgwN2UwKSB7ICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHBoYSA9PSAxMjgpIHsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUMTZfNTY1XzUwKTsgXAogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxpdHRlcigyLCBVaW50OCwgQUxQSEFfQkxJVDE2XzU2NSk7IFwKICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBnZW5lcmFsMTY7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGNhc2UgMHg3ZmZmOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBpZiAoZm10LT5HbWFzayA9PSAweDAzZTAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgfHwgZm10LT5SbWFzayA9PSAweDAzZTAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgfHwgZm10LT5CbWFzayA9PSAweDAzZTApIHsgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFscGhhID09IDEyOCkgeyAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVQxNl81NTVfNTApOyBcCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUMTZfNTU1KTsgXAogICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGdlbmVyYWwxNjsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgZ2VuZXJhbDE2OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVRfQU5ZKTsgICAgICAgICAgXAogICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgYmxpdHRlcigzLCBVaW50OCwgQUxQSEFfQkxJVF9BTlkpOyAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjYXNlIDQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgaWYgKChmbXQtPlJtYXNrIHwgZm10LT5HbWFzayB8IGZtdC0+Qm1hc2spID09IDB4MDBmZmZmZmYgXAogICAgICAgICAgICAgICAgICAgICYmIChmbXQtPkdtYXNrID09IDB4ZmYwMCB8fCBmbXQtPlJtYXNrID09IDB4ZmYwMCBcCiAgICAgICAgICAgICAgICAgICAgfHwgZm10LT5CbWFzayA9PSAweGZmMDApKSB7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgaWYgKGFscGhhID09IDEyOCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIGJsaXR0ZXIoNCwgVWludDE2LCBBTFBIQV9CTElUMzJfODg4XzUwKTsgXAogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICBibGl0dGVyKDQsIFVpbnQxNiwgQUxQSEFfQkxJVDMyXzg4OCk7ICAgXAogICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGJsaXR0ZXIoNCwgVWludDE2LCBBTFBIQV9CTElUX0FOWSk7ICAgICAgICAgXAogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKLyoKICogU2V0IGEgcGl4ZWwgdmFsdWUgdXNpbmcgdGhlIGdpdmVuIGZvcm1hdCwgZXhjZXB0IHRoYXQgdGhlIGFscGhhIHZhbHVlIGlzCiAqIHBsYWNlZCBpbiB0aGUgdG9wIGJ5dGUuIFRoaXMgaXMgdGhlIGZvcm1hdCB1c2VkIGZvciBSTEUgd2l0aCBhbHBoYS4KICovCiNkZWZpbmUgUkxFUElYRUxfRlJPTV9SR0JBKFBpeGVsLCBmbXQsIHIsIGcsIGIsIGEpICAgICAgICAgICAgICAgICAgICAgIFwKeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgUGl4ZWwgPSAoKHI+PmZtdC0+Umxvc3MpPDxmbXQtPlJzaGlmdCl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgKChnPj5mbXQtPkdsb3NzKTw8Zm10LT5Hc2hpZnQpfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAoKGI+PmZtdC0+Qmxvc3MpPDxmbXQtPkJzaGlmdCl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIChhPDwyNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCn0KCi8qCiAqIFRoaXMgdGFrZXMgY2FyZSBvZiB0aGUgY2FzZSB3aGVuIHRoZSBzdXJmYWNlIGlzIGNsaXBwZWQgb24gdGhlIGxlZnQgYW5kL29yCiAqIHJpZ2h0LiBUb3AgY2xpcHBpbmcgaGFzIGFscmVhZHkgYmVlbiB0YWtlbiBjYXJlIG9mLgogKi8Kc3RhdGljIHZvaWQKUkxFQ2xpcEJsaXQoaW50IHcsIFVpbnQ4ICogc3JjYnVmLCBTRExfU3VyZmFjZSAqIHN1cmZfZHN0LAogICAgICAgICAgICBVaW50OCAqIGRzdGJ1ZiwgU0RMX1JlY3QgKiBzcmNyZWN0LCB1bnNpZ25lZCBhbHBoYSkKewogICAgU0RMX1BpeGVsRm9ybWF0ICpmbXQgPSBzdXJmX2RzdC0+Zm9ybWF0OwoKI2RlZmluZSBSTEVDTElQQkxJVChicHAsIFR5cGUsIGRvX2JsaXQpICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgbGluZWNvdW50ID0gc3JjcmVjdC0+aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgb2ZzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgbGVmdCA9IHNyY3JlY3QtPng7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgcmlnaHQgPSBsZWZ0ICsgc3JjcmVjdC0+dzsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBkc3RidWYgLT0gbGVmdCAqIGJwcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBmb3IgKDs7KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaW50IHJ1bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9ICooVHlwZSAqKXNyY2J1ZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgcnVuID0gKChUeXBlICopc3JjYnVmKVsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgc3JjYnVmICs9IDIgKiBzaXplb2YoVHlwZSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYgKHJ1bikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIC8qIGNsaXAgdG8gbGVmdCBhbmQgcmlnaHQgYm9yZGVycyAqLyAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGlmIChvZnMgPCByaWdodCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gcnVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2w7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBpZiAobGVmdCAtIG9mcyA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBsZWZ0IC0gb2ZzOyAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IHN0YXJ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA8PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbm9jb3B5ICMjIGJwcCAjIyBkb19ibGl0OyAgICAgIFwKICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBzdGFydGNvbCA9IG9mcyArIHN0YXJ0OyAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBpZiAobGVuID4gcmlnaHQgLSBzdGFydGNvbCkgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gcmlnaHQgLSBzdGFydGNvbDsgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBkb19ibGl0KGRzdGJ1ZiArIHN0YXJ0Y29sICogYnBwLCBzcmNidWYgKyBzdGFydCAqIGJwcCwgXAogICAgICAgICAgICAgICAgICAgICAgICBsZW4sIGJwcCwgYWxwaGEpOyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgbm9jb3B5ICMjIGJwcCAjIyBkb19ibGl0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgc3JjYnVmICs9IHJ1biAqIGJwcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgb2ZzICs9IHJ1bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9IGVsc2UgaWYgKCFvZnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZiAob2ZzID09IHcpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgb2ZzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgZHN0YnVmICs9IHN1cmZfZHN0LT5waXRjaDsgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgaWYgKCEtLWxpbmVjb3VudCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKICAgIENIT09TRV9CTElUKFJMRUNMSVBCTElULCBhbHBoYSwgZm10KTsKCiN1bmRlZiBSTEVDTElQQkxJVAoKfQoKCi8qIGJsaXQgYSBjb2xvcmtleWVkIFJMRSBzdXJmYWNlICovCmludCBTRExDQUxMClNETF9STEVCbGl0KFNETF9TdXJmYWNlICogc3VyZl9zcmMsIFNETF9SZWN0ICogc3JjcmVjdCwKICAgICAgICAgICAgU0RMX1N1cmZhY2UgKiBzdXJmX2RzdCwgU0RMX1JlY3QgKiBkc3RyZWN0KQp7CiAgICBVaW50OCAqZHN0YnVmOwogICAgVWludDggKnNyY2J1ZjsKICAgIGludCB4LCB5OwogICAgaW50IHcgPSBzdXJmX3NyYy0+dzsKICAgIHVuc2lnbmVkIGFscGhhOwoKICAgIC8qIExvY2sgdGhlIGRlc3RpbmF0aW9uIGlmIG5lY2Vzc2FyeSAqLwogICAgaWYgKFNETF9NVVNUTE9DSyhzdXJmX2RzdCkpIHsKICAgICAgICBpZiAoU0RMX0xvY2tTdXJmYWNlKHN1cmZfZHN0KSA8IDApIHsKICAgICAgICAgICAgcmV0dXJuICgtMSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qIFNldCB1cCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBwb2ludGVycyAqLwogICAgeCA9IGRzdHJlY3QtPng7CiAgICB5ID0gZHN0cmVjdC0+eTsKICAgIGRzdGJ1ZiA9IChVaW50OCAqKSBzdXJmX2RzdC0+cGl4ZWxzCiAgICAgICAgKyB5ICogc3VyZl9kc3QtPnBpdGNoICsgeCAqIHN1cmZfc3JjLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7CiAgICBzcmNidWYgPSAoVWludDggKikgc3VyZl9zcmMtPm1hcC0+ZGF0YTsKCiAgICB7CiAgICAgICAgLyogc2tpcCBsaW5lcyBhdCB0aGUgdG9wIGlmIG5lY2Vzc2FyeSAqLwogICAgICAgIGludCB2c2tpcCA9IHNyY3JlY3QtPnk7CiAgICAgICAgaW50IG9mcyA9IDA7CiAgICAgICAgaWYgKHZza2lwKSB7CgojZGVmaW5lIFJMRVNLSVAoYnBwLCBUeXBlKSAgICAgICAgICBcCiAgICAgICAgZm9yKDs7KSB7ICAgICAgICAgICBcCiAgICAgICAgICAgIGludCBydW47ICAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgKz0gKihUeXBlICopc3JjYnVmOyBcCiAgICAgICAgICAgIHJ1biA9ICgoVHlwZSAqKXNyY2J1ZilbMV07ICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSBzaXplb2YoVHlwZSkgKiAyOyBcCiAgICAgICAgICAgIGlmKHJ1bikgeyAgICAgICAgICAgXAogICAgICAgICAgICBzcmNidWYgKz0gcnVuICogYnBwOyAgICBcCiAgICAgICAgICAgIG9mcyArPSBydW47ICAgICBcCiAgICAgICAgICAgIH0gZWxzZSBpZighb2ZzKSAgICAgXAogICAgICAgICAgICBnb3RvIGRvbmU7ICAgICAgXAogICAgICAgICAgICBpZihvZnMgPT0gdykgeyAgICAgIFwKICAgICAgICAgICAgb2ZzID0gMDsgICAgICAgIFwKICAgICAgICAgICAgaWYoIS0tdnNraXApICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICBcCiAgICAgICAgfQoKICAgICAgICAgICAgc3dpdGNoIChzdXJmX3NyYy0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsKSB7CiAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgIFJMRVNLSVAoMSwgVWludDgpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIFJMRVNLSVAoMiwgVWludDgpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgIFJMRVNLSVAoMywgVWludDgpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgIFJMRVNLSVAoNCwgVWludDE2KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgojdW5kZWYgUkxFU0tJUAoKICAgICAgICB9CiAgICB9CgogICAgYWxwaGEgPSBzdXJmX3NyYy0+bWFwLT5pbmZvLmE7CiAgICAvKiBpZiBsZWZ0IG9yIHJpZ2h0IGVkZ2UgY2xpcHBpbmcgbmVlZGVkLCBjYWxsIGNsaXAgYmxpdCAqLwogICAgaWYgKHNyY3JlY3QtPnggfHwgc3JjcmVjdC0+dyAhPSBzdXJmX3NyYy0+dykgewogICAgICAgIFJMRUNsaXBCbGl0KHcsIHNyY2J1Ziwgc3VyZl9kc3QsIGRzdGJ1Ziwgc3JjcmVjdCwgYWxwaGEpOwogICAgfSBlbHNlIHsKICAgICAgICBTRExfUGl4ZWxGb3JtYXQgKmZtdCA9IHN1cmZfc3JjLT5mb3JtYXQ7CgojZGVmaW5lIFJMRUJMSVQoYnBwLCBUeXBlLCBkb19ibGl0KSAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCBsaW5lY291bnQgPSBzcmNyZWN0LT5oOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IG9mcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGZvcig7OykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB1bnNpZ25lZCBydW47ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9ICooVHlwZSAqKXNyY2J1ZjsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBydW4gPSAoKFR5cGUgKilzcmNidWYpWzFdOyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBzcmNidWYgKz0gMiAqIHNpemVvZihUeXBlKTsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihydW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZG9fYmxpdChkc3RidWYgKyBvZnMgKiBicHAsIHNyY2J1ZiwgcnVuLCBicHAsIGFscGhhKTsgXAogICAgICAgICAgICBzcmNidWYgKz0gcnVuICogYnBwOyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIG9mcyArPSBydW47ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gZWxzZSBpZighb2ZzKSAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihvZnMgPT0gdykgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZHN0YnVmICs9IHN1cmZfZHN0LT5waXRjaDsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKCEtLWxpbmVjb3VudCkgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSB3aGlsZSgwKQoKICAgICAgICBDSE9PU0VfQkxJVChSTEVCTElULCBhbHBoYSwgZm10KTsKCiN1bmRlZiBSTEVCTElUCiAgICB9CgogIGRvbmU6CiAgICAvKiBVbmxvY2sgdGhlIGRlc3RpbmF0aW9uIGlmIG5lY2Vzc2FyeSAqLwogICAgaWYgKFNETF9NVVNUTE9DSyhzdXJmX2RzdCkpIHsKICAgICAgICBTRExfVW5sb2NrU3VyZmFjZShzdXJmX2RzdCk7CiAgICB9CiAgICByZXR1cm4gKDApOwp9CgojdW5kZWYgT1BBUVVFX0JMSVQKCi8qCiAqIFBlci1waXhlbCBibGl0dGluZyBtYWNyb3MgZm9yIHRyYW5zbHVjZW50IHBpeGVsczoKICogVGhlc2UgdXNlIHRoZSBzYW1lIHRlY2huaXF1ZXMgYXMgdGhlIHBlci1zdXJmYWNlIGJsaXR0aW5nIG1hY3JvcwogKi8KCi8qCiAqIEZvciAzMmJwcCBwaXhlbHMsIHdlIGhhdmUgbWFkZSBzdXJlIHRoZSBhbHBoYSBpcyBzdG9yZWQgaW4gdGhlIHRvcAogKiA4IGJpdHMsIHNvIHByb2NlZWQgYXMgdXN1YWwKICovCiNkZWZpbmUgQkxJVF9UUkFOU0xfODg4KHNyYywgZHN0KSAgICAgICAgICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQzMiBzID0gc3JjOyAgICAgICAgICAgICAgICAgICAgIFwKICAgIFVpbnQzMiBkID0gZHN0OyAgICAgICAgICAgICAgICAgICAgIFwKICAgIHVuc2lnbmVkIGFscGhhID0gcyA+PiAyNDsgICAgICAgICAgICAgICBcCiAgICBVaW50MzIgczEgPSBzICYgMHhmZjAwZmY7ICAgICAgICAgICAgICAgXAogICAgVWludDMyIGQxID0gZCAmIDB4ZmYwMGZmOyAgICAgICAgICAgICAgIFwKICAgIGQxID0gKGQxICsgKChzMSAtIGQxKSAqIGFscGhhID4+IDgpKSAmIDB4ZmYwMGZmOyAgICBcCiAgICBzICY9IDB4ZmYwMDsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBkICY9IDB4ZmYwMDsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBkID0gKGQgKyAoKHMgLSBkKSAqIGFscGhhID4+IDgpKSAmIDB4ZmYwMDsgICAgICBcCiAgICBkc3QgPSBkMSB8IGQgfCAweGZmMDAwMDAwOyAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKLyoKICogRm9yIDE2YnBwIHBpeGVscywgd2UgaGF2ZSBzdG9yZWQgdGhlIDUgbW9zdCBzaWduaWZpY2FudCBhbHBoYSBiaXRzIGluCiAqIGJpdHMgNS0xMC4gQXMgYmVmb3JlLCB3ZSBjYW4gcHJvY2VzcyBhbGwgMyBSR0IgY29tcG9uZW50cyBhdCB0aGUgc2FtZSB0aW1lLgogKi8KI2RlZmluZSBCTElUX1RSQU5TTF81NjUoc3JjLCBkc3QpICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgIFwKICAgIFVpbnQzMiBzID0gc3JjOyAgICAgICAgICAgICBcCiAgICBVaW50MzIgZCA9IGRzdDsgICAgICAgICAgICAgXAogICAgdW5zaWduZWQgYWxwaGEgPSAocyAmIDB4M2UwKSA+PiA1OyAgXAogICAgcyAmPSAweDA3ZTBmODFmOyAgICAgICAgICAgIFwKICAgIGQgPSAoZCB8IGQgPDwgMTYpICYgMHgwN2UwZjgxZjsgICAgIFwKICAgIGQgKz0gKHMgLSBkKSAqIGFscGhhID4+IDU7ICAgICAgXAogICAgZCAmPSAweDA3ZTBmODFmOyAgICAgICAgICAgIFwKICAgIGRzdCA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgojZGVmaW5lIEJMSVRfVFJBTlNMXzU1NShzcmMsIGRzdCkgICAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgXAogICAgVWludDMyIHMgPSBzcmM7ICAgICAgICAgICAgIFwKICAgIFVpbnQzMiBkID0gZHN0OyAgICAgICAgICAgICBcCiAgICB1bnNpZ25lZCBhbHBoYSA9IChzICYgMHgzZTApID4+IDU7ICBcCiAgICBzICY9IDB4MDNlMDdjMWY7ICAgICAgICAgICAgXAogICAgZCA9IChkIHwgZCA8PCAxNikgJiAweDAzZTA3YzFmOyAgICAgXAogICAgZCArPSAocyAtIGQpICogYWxwaGEgPj4gNTsgICAgICBcCiAgICBkICY9IDB4MDNlMDdjMWY7ICAgICAgICAgICAgXAogICAgZHN0ID0gKFVpbnQxNikoZCB8IGQgPj4gMTYpOyAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCi8qIHVzZWQgdG8gc2F2ZSB0aGUgZGVzdGluYXRpb24gZm9ybWF0IGluIHRoZSBlbmNvZGluZy4gRGVzaWduZWQgdG8gYmUKICAgbWFjcm8tY29tcGF0aWJsZSB3aXRoIFNETF9QaXhlbEZvcm1hdCBidXQgd2l0aG91dCB0aGUgdW5uZWVkZWQgZmllbGRzICovCnR5cGVkZWYgc3RydWN0CnsKICAgIFVpbnQ4IEJ5dGVzUGVyUGl4ZWw7CiAgICBVaW50OCBwYWRkaW5nWzNdOwogICAgVWludDMyIFJtYXNrOwogICAgVWludDMyIEdtYXNrOwogICAgVWludDMyIEJtYXNrOwogICAgVWludDMyIEFtYXNrOwogICAgVWludDggUmxvc3M7CiAgICBVaW50OCBHbG9zczsKICAgIFVpbnQ4IEJsb3NzOwogICAgVWludDggQWxvc3M7CiAgICBVaW50OCBSc2hpZnQ7CiAgICBVaW50OCBHc2hpZnQ7CiAgICBVaW50OCBCc2hpZnQ7CiAgICBVaW50OCBBc2hpZnQ7Cn0gUkxFRGVzdEZvcm1hdDsKCi8qIGJsaXQgYSBwaXhlbC1hbHBoYSBSTEUgc3VyZmFjZSBjbGlwcGVkIGF0IHRoZSByaWdodCBhbmQvb3IgbGVmdCBlZGdlcyAqLwpzdGF0aWMgdm9pZApSTEVBbHBoYUNsaXBCbGl0KGludCB3LCBVaW50OCAqIHNyY2J1ZiwgU0RMX1N1cmZhY2UgKiBzdXJmX2RzdCwKICAgICAgICAgICAgICAgICBVaW50OCAqIGRzdGJ1ZiwgU0RMX1JlY3QgKiBzcmNyZWN0KQp7CiAgICBTRExfUGl4ZWxGb3JtYXQgKmRmID0gc3VyZl9kc3QtPmZvcm1hdDsKICAgIC8qCiAgICAgKiBjbGlwcGVkIGJsaXR0ZXI6IFB0eXBlIGlzIHRoZSBkZXN0aW5hdGlvbiBwaXhlbCB0eXBlLAogICAgICogQ3R5cGUgdGhlIHRyYW5zbHVjZW50IGNvdW50IHR5cGUsIGFuZCBkb19ibGVuZCB0aGUgbWFjcm8KICAgICAqIHRvIGJsZW5kIG9uZSBwaXhlbC4KICAgICAqLwojZGVmaW5lIFJMRUFMUEhBQ0xJUEJMSVQoUHR5cGUsIEN0eXBlLCBkb19ibGVuZCkgICAgICAgICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgaW50IGxpbmVjb3VudCA9IHNyY3JlY3QtPmg7ICAgICAgICAgICAgICAgICAgIFwKICAgIGludCBsZWZ0ID0gc3JjcmVjdC0+eDsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBpbnQgcmlnaHQgPSBsZWZ0ICsgc3JjcmVjdC0+dzsgICAgICAgICAgICAgICAgICAgIFwKICAgIGRzdGJ1ZiAtPSBsZWZ0ICogc2l6ZW9mKFB0eXBlKTsgICAgICAgICAgICAgICAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IG9mcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgLyogYmxpdCBvcGFxdWUgcGl4ZWxzIG9uIG9uZSBsaW5lICovICAgICAgICAgICAgICBcCiAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB1bnNpZ25lZCBydW47ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBvZnMgKz0gKChDdHlwZSAqKXNyY2J1ZilbMF07ICAgICAgICAgICAgICAgICAgXAogICAgICAgIHJ1biA9ICgoQ3R5cGUgKilzcmNidWYpWzFdOyAgICAgICAgICAgICAgIFwKICAgICAgICBzcmNidWYgKz0gMiAqIHNpemVvZihDdHlwZSk7ICAgICAgICAgICAgICAgICAgXAogICAgICAgIGlmKHJ1bikgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIC8qIGNsaXAgdG8gbGVmdCBhbmQgcmlnaHQgYm9yZGVycyAqLyAgICAgICAgICBcCiAgICAgICAgICAgIGludCBjb2ZzID0gb2ZzOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGludCBjcnVuID0gcnVuOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKGxlZnQgLSBjb2ZzID4gMCkgeyAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjcnVuIC09IGxlZnQgLSBjb2ZzOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY29mcyA9IGxlZnQ7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihjcnVuID4gcmlnaHQgLSBjb2ZzKSAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY3J1biA9IHJpZ2h0IC0gY29mczsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKGNydW4gPiAwKSAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFBJWEVMX0NPUFkoZHN0YnVmICsgY29mcyAqIHNpemVvZihQdHlwZSksICAgICBcCiAgICAgICAgICAgICAgICAgICBzcmNidWYgKyAoY29mcyAtIG9mcykgKiBzaXplb2YoUHR5cGUpLCBcCiAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpY3J1biwgc2l6ZW9mKFB0eXBlKSk7ICAgIFwKICAgICAgICAgICAgc3JjYnVmICs9IHJ1biAqIHNpemVvZihQdHlwZSk7ICAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgKz0gcnVuOyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gZWxzZSBpZighb2ZzKSAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSB3aGlsZShvZnMgPCB3KTsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIC8qIHNraXAgcGFkZGluZyBpZiBuZWNlc3NhcnkgKi8gICAgICAgICAgICAgICBcCiAgICAgICAgaWYoc2l6ZW9mKFB0eXBlKSA9PSAyKSAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHNyY2J1ZiArPSAodWludHB0cl90KXNyY2J1ZiAmIDI7ICAgICAgICAgICAgICBcCiAgICAgICAgLyogYmxpdCB0cmFuc2x1Y2VudCBwaXhlbHMgb24gdGhlIHNhbWUgbGluZSAqLyAgICAgICAgXAogICAgICAgIG9mcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgdW5zaWduZWQgcnVuOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgb2ZzICs9ICgoVWludDE2ICopc3JjYnVmKVswXTsgICAgICAgICAgICAgICAgIFwKICAgICAgICBydW4gPSAoKFVpbnQxNiAqKXNyY2J1ZilbMV07ICAgICAgICAgICAgICAgICAgXAogICAgICAgIHNyY2J1ZiArPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGlmKHJ1bikgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIC8qIGNsaXAgdG8gbGVmdCBhbmQgcmlnaHQgYm9yZGVycyAqLyAgICAgICAgICBcCiAgICAgICAgICAgIGludCBjb2ZzID0gb2ZzOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGludCBjcnVuID0gcnVuOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKGxlZnQgLSBjb2ZzID4gMCkgeyAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjcnVuIC09IGxlZnQgLSBjb2ZzOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY29mcyA9IGxlZnQ7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihjcnVuID4gcmlnaHQgLSBjb2ZzKSAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY3J1biA9IHJpZ2h0IC0gY29mczsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKGNydW4gPiAwKSB7ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFB0eXBlICpkc3QgPSAoUHR5cGUgKilkc3RidWYgKyBjb2ZzOyAgICAgICAgICBcCiAgICAgICAgICAgIFVpbnQzMiAqc3JjID0gKFVpbnQzMiAqKXNyY2J1ZiArIChjb2ZzIC0gb2ZzKTsgICAgXAogICAgICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IGNydW47IGkrKykgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgZG9fYmxlbmQoc3JjW2ldLCBkc3RbaV0pOyAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgc3JjYnVmICs9IHJ1biAqIDQ7ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIG9mcyArPSBydW47ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gd2hpbGUob2ZzIDwgdyk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBkc3RidWYgKz0gc3VyZl9kc3QtPnBpdGNoOyAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoLS1saW5lY291bnQpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgogICAgc3dpdGNoIChkZi0+Qnl0ZXNQZXJQaXhlbCkgewogICAgY2FzZSAyOgogICAgICAgIGlmIChkZi0+R21hc2sgPT0gMHgwN2UwIHx8IGRmLT5SbWFzayA9PSAweDA3ZTAgfHwgZGYtPkJtYXNrID09IDB4MDdlMCkKICAgICAgICAgICAgUkxFQUxQSEFDTElQQkxJVChVaW50MTYsIFVpbnQ4LCBCTElUX1RSQU5TTF81NjUpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgUkxFQUxQSEFDTElQQkxJVChVaW50MTYsIFVpbnQ4LCBCTElUX1RSQU5TTF81NTUpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSA0OgogICAgICAgIFJMRUFMUEhBQ0xJUEJMSVQoVWludDMyLCBVaW50MTYsIEJMSVRfVFJBTlNMXzg4OCk7CiAgICAgICAgYnJlYWs7CiAgICB9Cn0KCi8qIGJsaXQgYSBwaXhlbC1hbHBoYSBSTEUgc3VyZmFjZSAqLwppbnQgU0RMQ0FMTApTRExfUkxFQWxwaGFCbGl0KFNETF9TdXJmYWNlICogc3VyZl9zcmMsIFNETF9SZWN0ICogc3JjcmVjdCwKICAgICAgICAgICAgICAgICBTRExfU3VyZmFjZSAqIHN1cmZfZHN0LCBTRExfUmVjdCAqIGRzdHJlY3QpCnsKICAgIGludCB4LCB5OwogICAgaW50IHcgPSBzdXJmX3NyYy0+dzsKICAgIFVpbnQ4ICpzcmNidWYsICpkc3RidWY7CiAgICBTRExfUGl4ZWxGb3JtYXQgKmRmID0gc3VyZl9kc3QtPmZvcm1hdDsKCiAgICAvKiBMb2NrIHRoZSBkZXN0aW5hdGlvbiBpZiBuZWNlc3NhcnkgKi8KICAgIGlmIChTRExfTVVTVExPQ0soc3VyZl9kc3QpKSB7CiAgICAgICAgaWYgKFNETF9Mb2NrU3VyZmFjZShzdXJmX2RzdCkgPCAwKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICB9CgogICAgeCA9IGRzdHJlY3QtPng7CiAgICB5ID0gZHN0cmVjdC0+eTsKICAgIGRzdGJ1ZiA9IChVaW50OCAqKSBzdXJmX2RzdC0+cGl4ZWxzICsgeSAqIHN1cmZfZHN0LT5waXRjaCArIHggKiBkZi0+Qnl0ZXNQZXJQaXhlbDsKICAgIHNyY2J1ZiA9IChVaW50OCAqKSBzdXJmX3NyYy0+bWFwLT5kYXRhICsgc2l6ZW9mKFJMRURlc3RGb3JtYXQpOwoKICAgIHsKICAgICAgICAvKiBza2lwIGxpbmVzIGF0IHRoZSB0b3AgaWYgbmVjZXNzYXJ5ICovCiAgICAgICAgaW50IHZza2lwID0gc3JjcmVjdC0+eTsKICAgICAgICBpZiAodnNraXApIHsKICAgICAgICAgICAgaW50IG9mczsKICAgICAgICAgICAgaWYgKGRmLT5CeXRlc1BlclBpeGVsID09IDIpIHsKICAgICAgICAgICAgICAgIC8qIHRoZSAxNi8zMiBpbnRlcmxlYXZlZCBmb3JtYXQgKi8KICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAvKiBza2lwIG9wYXF1ZSBsaW5lICovCiAgICAgICAgICAgICAgICAgICAgb2ZzID0gMDsKICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICAgIGludCBydW47CiAgICAgICAgICAgICAgICAgICAgICAgIG9mcyArPSBzcmNidWZbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1biA9IHNyY2J1ZlsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgc3JjYnVmICs9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY2J1ZiArPSAyICogcnVuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZzICs9IHJ1bjsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghb2ZzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKG9mcyA8IHcpOwoKICAgICAgICAgICAgICAgICAgICAvKiBza2lwIHBhZGRpbmcgKi8KICAgICAgICAgICAgICAgICAgICBzcmNidWYgKz0gKHVpbnRwdHJfdCkgc3JjYnVmICYgMjsKCiAgICAgICAgICAgICAgICAgICAgLyogc2tpcCB0cmFuc2x1Y2VudCBsaW5lICovCiAgICAgICAgICAgICAgICAgICAgb2ZzID0gMDsKICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICAgIGludCBydW47CiAgICAgICAgICAgICAgICAgICAgICAgIG9mcyArPSAoKFVpbnQxNiAqKSBzcmNidWYpWzBdOwogICAgICAgICAgICAgICAgICAgICAgICBydW4gPSAoKFVpbnQxNiAqKSBzcmNidWYpWzFdOwogICAgICAgICAgICAgICAgICAgICAgICBzcmNidWYgKz0gNCAqIChydW4gKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgb2ZzICs9IHJ1bjsKICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChvZnMgPCB3KTsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tdnNraXApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLyogdGhlIDMyLzMyIGludGVybGVhdmVkIGZvcm1hdCAqLwogICAgICAgICAgICAgICAgdnNraXAgPDw9IDE7ICAgIC8qIG9wYXF1ZSBhbmQgdHJhbnNsdWNlbnQgaGF2ZSBzYW1lIGZvcm1hdCAqLwogICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgIG9mcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICBpbnQgcnVuOwogICAgICAgICAgICAgICAgICAgICAgICBvZnMgKz0gKChVaW50MTYgKikgc3JjYnVmKVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgcnVuID0gKChVaW50MTYgKikgc3JjYnVmKVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgc3JjYnVmICs9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY2J1ZiArPSA0ICogcnVuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZzICs9IHJ1bjsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghb2ZzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKG9mcyA8IHcpOwogICAgICAgICAgICAgICAgfSB3aGlsZSAoLS12c2tpcCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyogaWYgbGVmdCBvciByaWdodCBlZGdlIGNsaXBwaW5nIG5lZWRlZCwgY2FsbCBjbGlwIGJsaXQgKi8KICAgIGlmIChzcmNyZWN0LT54IHx8IHNyY3JlY3QtPncgIT0gc3VyZl9zcmMtPncpIHsKICAgICAgICBSTEVBbHBoYUNsaXBCbGl0KHcsIHNyY2J1Ziwgc3VyZl9kc3QsIGRzdGJ1Ziwgc3JjcmVjdCk7CiAgICB9IGVsc2UgewoKICAgICAgICAvKgogICAgICAgICAqIG5vbi1jbGlwcGVkIGJsaXR0ZXIuIFB0eXBlIGlzIHRoZSBkZXN0aW5hdGlvbiBwaXhlbCB0eXBlLAogICAgICAgICAqIEN0eXBlIHRoZSB0cmFuc2x1Y2VudCBjb3VudCB0eXBlLCBhbmQgZG9fYmxlbmQgdGhlCiAgICAgICAgICogbWFjcm8gdG8gYmxlbmQgb25lIHBpeGVsLgogICAgICAgICAqLwojZGVmaW5lIFJMRUFMUEhBQkxJVChQdHlwZSwgQ3R5cGUsIGRvX2JsZW5kKSAgICAgICAgICAgICAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgbGluZWNvdW50ID0gc3JjcmVjdC0+aDsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCBvZnMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgLyogYmxpdCBvcGFxdWUgcGl4ZWxzIG9uIG9uZSBsaW5lICovICAgICAgICAgICAgIFwKICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHVuc2lnbmVkIHJ1bjsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9ICgoQ3R5cGUgKilzcmNidWYpWzBdOyAgICAgICAgICAgICBcCiAgICAgICAgICAgIHJ1biA9ICgoQ3R5cGUgKilzcmNidWYpWzFdOyAgICAgICAgICAgICAgXAogICAgICAgICAgICBzcmNidWYgKz0gMiAqIHNpemVvZihDdHlwZSk7ICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYocnVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBQSVhFTF9DT1BZKGRzdGJ1ZiArIG9mcyAqIHNpemVvZihQdHlwZSksIHNyY2J1ZiwgXAogICAgICAgICAgICAgICAgICAgcnVuLCBzaXplb2YoUHR5cGUpKTsgICAgICAgICAgXAogICAgICAgICAgICBzcmNidWYgKz0gcnVuICogc2l6ZW9mKFB0eXBlKTsgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9IHJ1bjsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gZWxzZSBpZighb2ZzKSAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZ290byBkb25lOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSB3aGlsZShvZnMgPCB3KTsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAvKiBza2lwIHBhZGRpbmcgaWYgbmVjZXNzYXJ5ICovICAgICAgICAgICAgICBcCiAgICAgICAgaWYoc2l6ZW9mKFB0eXBlKSA9PSAyKSAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSAodWludHB0cl90KXNyY2J1ZiAmIDI7ICAgICAgICAgICAgIFwKICAgICAgICAvKiBibGl0IHRyYW5zbHVjZW50IHBpeGVscyBvbiB0aGUgc2FtZSBsaW5lICovICAgICAgIFwKICAgICAgICBvZnMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB1bnNpZ25lZCBydW47ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIG9mcyArPSAoKFVpbnQxNiAqKXNyY2J1ZilbMF07ICAgICAgICAgICAgXAogICAgICAgICAgICBydW4gPSAoKFVpbnQxNiAqKXNyY2J1ZilbMV07ICAgICAgICAgICAgIFwKICAgICAgICAgICAgc3JjYnVmICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihydW4pIHsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFB0eXBlICpkc3QgPSAoUHR5cGUgKilkc3RidWYgKyBvZnM7ICAgICAgXAogICAgICAgICAgICB1bnNpZ25lZCBpOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgcnVuOyBpKyspIHsgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIFVpbnQzMiBzcmMgPSAqKFVpbnQzMiAqKXNyY2J1ZjsgICAgICBcCiAgICAgICAgICAgICAgICBkb19ibGVuZChzcmMsICpkc3QpOyAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBzcmNidWYgKz0gNDsgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGRzdCsrOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIG9mcyArPSBydW47ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9IHdoaWxlKG9mcyA8IHcpOyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGRzdGJ1ZiArPSBzdXJmX2RzdC0+cGl0Y2g7ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSB3aGlsZSgtLWxpbmVjb3VudCk7ICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgogICAgICAgIHN3aXRjaCAoZGYtPkJ5dGVzUGVyUGl4ZWwpIHsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIGlmIChkZi0+R21hc2sgPT0gMHgwN2UwIHx8IGRmLT5SbWFzayA9PSAweDA3ZTAKICAgICAgICAgICAgICAgIHx8IGRmLT5CbWFzayA9PSAweDA3ZTApCiAgICAgICAgICAgICAgICBSTEVBTFBIQUJMSVQoVWludDE2LCBVaW50OCwgQkxJVF9UUkFOU0xfNTY1KTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgUkxFQUxQSEFCTElUKFVpbnQxNiwgVWludDgsIEJMSVRfVFJBTlNMXzU1NSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgUkxFQUxQSEFCTElUKFVpbnQzMiwgVWludDE2LCBCTElUX1RSQU5TTF84ODgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogIGRvbmU6CiAgICAvKiBVbmxvY2sgdGhlIGRlc3RpbmF0aW9uIGlmIG5lY2Vzc2FyeSAqLwogICAgaWYgKFNETF9NVVNUTE9DSyhzdXJmX2RzdCkpIHsKICAgICAgICBTRExfVW5sb2NrU3VyZmFjZShzdXJmX2RzdCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoKICogQXV4aWxpYXJ5IGZ1bmN0aW9uczoKICogVGhlIGVuY29kaW5nIGZ1bmN0aW9ucyB0YWtlIDMyYnBwIHJnYiArIGEsIGFuZAogKiByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgdG8gdGhlIGRlc3RpbmF0aW9uLgogKiBUaGUgZGVjb2RpbmcgZnVuY3Rpb25zIGNvcHkgdG8gMzJicHAgcmdiICsgYSwgYW5kCiAqIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBmcm9tIHRoZSBzb3VyY2UuCiAqIFRoZXNlIGFyZSBvbmx5IHVzZWQgaW4gdGhlIGVuY29kZXIgYW5kIHVuLVJMRSBjb2RlIGFuZCBhcmUgdGhlcmVmb3JlIG5vdAogKiBoaWdobHkgb3B0aW1pc2VkLgogKi8KCi8qIGVuY29kZSAzMmJwcCByZ2IgKyBhIGludG8gMTZicHAgcmdiLCBsb3NpbmcgYWxwaGEgKi8Kc3RhdGljIGludApjb3B5X29wYXF1ZV8xNih2b2lkICpkc3QsIFVpbnQzMiAqIHNyYywgaW50IG4sCiAgICAgICAgICAgICAgIFNETF9QaXhlbEZvcm1hdCAqIHNmbXQsIFNETF9QaXhlbEZvcm1hdCAqIGRmbXQpCnsKICAgIGludCBpOwogICAgVWludDE2ICpkID0gZHN0OwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHVuc2lnbmVkIHIsIGcsIGI7CiAgICAgICAgUkdCX0ZST01fUElYRUwoKnNyYywgc2ZtdCwgciwgZywgYik7CiAgICAgICAgUElYRUxfRlJPTV9SR0IoKmQsIGRmbXQsIHIsIGcsIGIpOwogICAgICAgIHNyYysrOwogICAgICAgIGQrKzsKICAgIH0KICAgIHJldHVybiBuICogMjsKfQoKLyogZGVjb2RlIG9wYXF1ZSBwaXhlbHMgZnJvbSAxNmJwcCB0byAzMmJwcCByZ2IgKyBhICovCnN0YXRpYyBpbnQKdW5jb3B5X29wYXF1ZV8xNihVaW50MzIgKiBkc3QsIHZvaWQgKnNyYywgaW50IG4sCiAgICAgICAgICAgICAgICAgUkxFRGVzdEZvcm1hdCAqIHNmbXQsIFNETF9QaXhlbEZvcm1hdCAqIGRmbXQpCnsKICAgIGludCBpOwogICAgVWludDE2ICpzID0gc3JjOwogICAgdW5zaWduZWQgYWxwaGEgPSBkZm10LT5BbWFzayA/IDI1NSA6IDA7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgdW5zaWduZWQgciwgZywgYjsKICAgICAgICBSR0JfRlJPTV9QSVhFTCgqcywgc2ZtdCwgciwgZywgYik7CiAgICAgICAgUElYRUxfRlJPTV9SR0JBKCpkc3QsIGRmbXQsIHIsIGcsIGIsIGFscGhhKTsKICAgICAgICBzKys7CiAgICAgICAgZHN0Kys7CiAgICB9CiAgICByZXR1cm4gbiAqIDI7Cn0KCgoKLyogZW5jb2RlIDMyYnBwIHJnYiArIGEgaW50byAzMmJwcCBHMFJBQiBmb3JtYXQgZm9yIGJsaXR0aW5nIGludG8gNTY1ICovCnN0YXRpYyBpbnQKY29weV90cmFuc2xfNTY1KHZvaWQgKmRzdCwgVWludDMyICogc3JjLCBpbnQgbiwKICAgICAgICAgICAgICAgIFNETF9QaXhlbEZvcm1hdCAqIHNmbXQsIFNETF9QaXhlbEZvcm1hdCAqIGRmbXQpCnsKICAgIGludCBpOwogICAgVWludDMyICpkID0gZHN0OwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHVuc2lnbmVkIHIsIGcsIGIsIGE7CiAgICAgICAgVWludDE2IHBpeDsKICAgICAgICBSR0JBX0ZST01fODg4OCgqc3JjLCBzZm10LCByLCBnLCBiLCBhKTsKICAgICAgICBQSVhFTF9GUk9NX1JHQihwaXgsIGRmbXQsIHIsIGcsIGIpOwogICAgICAgICpkID0gKChwaXggJiAweDdlMCkgPDwgMTYpIHwgKHBpeCAmIDB4ZjgxZikgfCAoKGEgPDwgMikgJiAweDdlMCk7CiAgICAgICAgc3JjKys7CiAgICAgICAgZCsrOwogICAgfQogICAgcmV0dXJuIG4gKiA0Owp9CgovKiBlbmNvZGUgMzJicHAgcmdiICsgYSBpbnRvIDMyYnBwIEcwUkFCIGZvcm1hdCBmb3IgYmxpdHRpbmcgaW50byA1NTUgKi8Kc3RhdGljIGludApjb3B5X3RyYW5zbF81NTUodm9pZCAqZHN0LCBVaW50MzIgKiBzcmMsIGludCBuLAogICAgICAgICAgICAgICAgU0RMX1BpeGVsRm9ybWF0ICogc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICogZGZtdCkKewogICAgaW50IGk7CiAgICBVaW50MzIgKmQgPSBkc3Q7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgdW5zaWduZWQgciwgZywgYiwgYTsKICAgICAgICBVaW50MTYgcGl4OwogICAgICAgIFJHQkFfRlJPTV84ODg4KCpzcmMsIHNmbXQsIHIsIGcsIGIsIGEpOwogICAgICAgIFBJWEVMX0ZST01fUkdCKHBpeCwgZGZtdCwgciwgZywgYik7CiAgICAgICAgKmQgPSAoKHBpeCAmIDB4M2UwKSA8PCAxNikgfCAocGl4ICYgMHhmYzFmKSB8ICgoYSA8PCAyKSAmIDB4M2UwKTsKICAgICAgICBzcmMrKzsKICAgICAgICBkKys7CiAgICB9CiAgICByZXR1cm4gbiAqIDQ7Cn0KCi8qIGRlY29kZSB0cmFuc2x1Y2VudCBwaXhlbHMgZnJvbSAzMmJwcCBHT1JBQiB0byAzMmJwcCByZ2IgKyBhICovCnN0YXRpYyBpbnQKdW5jb3B5X3RyYW5zbF8xNihVaW50MzIgKiBkc3QsIHZvaWQgKnNyYywgaW50IG4sCiAgICAgICAgICAgICAgICAgUkxFRGVzdEZvcm1hdCAqIHNmbXQsIFNETF9QaXhlbEZvcm1hdCAqIGRmbXQpCnsKICAgIGludCBpOwogICAgVWludDMyICpzID0gc3JjOwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHVuc2lnbmVkIHIsIGcsIGIsIGE7CiAgICAgICAgVWludDMyIHBpeCA9ICpzKys7CiAgICAgICAgYSA9IChwaXggJiAweDNlMCkgPj4gMjsKICAgICAgICBwaXggPSAocGl4ICYgfjB4M2UwKSB8IHBpeCA+PiAxNjsKICAgICAgICBSR0JfRlJPTV9QSVhFTChwaXgsIHNmbXQsIHIsIGcsIGIpOwogICAgICAgIFBJWEVMX0ZST01fUkdCQSgqZHN0LCBkZm10LCByLCBnLCBiLCBhKTsKICAgICAgICBkc3QrKzsKICAgIH0KICAgIHJldHVybiBuICogNDsKfQoKLyogZW5jb2RlIDMyYnBwIHJnYmEgaW50byAzMmJwcCByZ2JhLCBrZWVwaW5nIGFscGhhIChkdWFsIHB1cnBvc2UpICovCnN0YXRpYyBpbnQKY29weV8zMih2b2lkICpkc3QsIFVpbnQzMiAqIHNyYywgaW50IG4sCiAgICAgICAgU0RMX1BpeGVsRm9ybWF0ICogc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICogZGZtdCkKewogICAgaW50IGk7CiAgICBVaW50MzIgKmQgPSBkc3Q7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgdW5zaWduZWQgciwgZywgYiwgYTsKICAgICAgICBSR0JBX0ZST01fODg4OCgqc3JjLCBzZm10LCByLCBnLCBiLCBhKTsKICAgICAgICBSTEVQSVhFTF9GUk9NX1JHQkEoKmQsIGRmbXQsIHIsIGcsIGIsIGEpOwogICAgICAgIGQrKzsKICAgICAgICBzcmMrKzsKICAgIH0KICAgIHJldHVybiBuICogNDsKfQoKLyogZGVjb2RlIDMyYnBwIHJnYmEgaW50byAzMmJwcCByZ2JhLCBrZWVwaW5nIGFscGhhIChkdWFsIHB1cnBvc2UpICovCnN0YXRpYyBpbnQKdW5jb3B5XzMyKFVpbnQzMiAqIGRzdCwgdm9pZCAqc3JjLCBpbnQgbiwKICAgICAgICAgIFJMRURlc3RGb3JtYXQgKiBzZm10LCBTRExfUGl4ZWxGb3JtYXQgKiBkZm10KQp7CiAgICBpbnQgaTsKICAgIFVpbnQzMiAqcyA9IHNyYzsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICB1bnNpZ25lZCByLCBnLCBiLCBhOwogICAgICAgIFVpbnQzMiBwaXhlbCA9ICpzKys7CiAgICAgICAgUkdCX0ZST01fUElYRUwocGl4ZWwsIHNmbXQsIHIsIGcsIGIpOwogICAgICAgIGEgPSBwaXhlbCA+PiAyNDsKICAgICAgICBQSVhFTF9GUk9NX1JHQkEoKmRzdCwgZGZtdCwgciwgZywgYiwgYSk7CiAgICAgICAgZHN0Kys7CiAgICB9CiAgICByZXR1cm4gbiAqIDQ7Cn0KCiNkZWZpbmUgSVNPUEFRVUUocGl4ZWwsIGZtdCkgKCgoKHBpeGVsKSAmIGZtdC0+QW1hc2spID4+IGZtdC0+QXNoaWZ0KSA9PSAyNTUpCgojZGVmaW5lIElTVFJBTlNMKHBpeGVsLCBmbXQpICAgIFwKICAgICgodW5zaWduZWQpKCgoKHBpeGVsKSAmIGZtdC0+QW1hc2spID4+IGZtdC0+QXNoaWZ0KSAtIDFVKSA8IDI1NFUpCgovKiBjb252ZXJ0IHN1cmZhY2UgdG8gYmUgcXVpY2tseSBhbHBoYS1ibGl0dGFibGUgb250byBkZXN0LCBpZiBwb3NzaWJsZSAqLwpzdGF0aWMgaW50ClJMRUFscGhhU3VyZmFjZShTRExfU3VyZmFjZSAqIHN1cmZhY2UpCnsKICAgIFNETF9TdXJmYWNlICpkZXN0OwogICAgU0RMX1BpeGVsRm9ybWF0ICpkZjsKICAgIGludCBtYXhzaXplID0gMDsKICAgIGludCBtYXhfb3BhcXVlX3J1bjsKICAgIGludCBtYXhfdHJhbnNsX3J1biA9IDY1NTM1OwogICAgdW5zaWduZWQgbWFza3N1bTsKICAgIFVpbnQ4ICpybGVidWYsICpkc3Q7CiAgICBpbnQgKCpjb3B5X29wYXF1ZSkgKHZvaWQgKiwgVWludDMyICosIGludCwKICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1BpeGVsRm9ybWF0ICosIFNETF9QaXhlbEZvcm1hdCAqKTsKICAgIGludCAoKmNvcHlfdHJhbnNsKSAodm9pZCAqLCBVaW50MzIgKiwgaW50LAogICAgICAgICAgICAgICAgICAgICAgICBTRExfUGl4ZWxGb3JtYXQgKiwgU0RMX1BpeGVsRm9ybWF0ICopOwoKICAgIGRlc3QgPSBzdXJmYWNlLT5tYXAtPmRzdDsKICAgIGlmICghZGVzdCkKICAgICAgICByZXR1cm4gLTE7CiAgICBkZiA9IGRlc3QtPmZvcm1hdDsKICAgIGlmIChzdXJmYWNlLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCAhPSAzMikKICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAvKiBvbmx5IDMyYnBwIHNvdXJjZSBzdXBwb3J0ZWQgKi8KCiAgICAvKiBmaW5kIG91dCB3aGV0aGVyIHRoZSBkZXN0aW5hdGlvbiBpcyBvbmUgd2Ugc3VwcG9ydCwKICAgICAgIGFuZCBkZXRlcm1pbmUgdGhlIG1heCBzaXplIG9mIHRoZSBlbmNvZGVkIHJlc3VsdCAqLwogICAgbWFza3N1bSA9IGRmLT5SbWFzayB8IGRmLT5HbWFzayB8IGRmLT5CbWFzazsKICAgIHN3aXRjaCAoZGYtPkJ5dGVzUGVyUGl4ZWwpIHsKICAgIGNhc2UgMjoKICAgICAgICAvKiAxNmJwcDogb25seSBzdXBwb3J0IDU2NSBhbmQgNTU1IGZvcm1hdHMgKi8KICAgICAgICBzd2l0Y2ggKG1hc2tzdW0pIHsKICAgICAgICBjYXNlIDB4ZmZmZjoKICAgICAgICAgICAgaWYgKGRmLT5HbWFzayA9PSAweDA3ZTAKICAgICAgICAgICAgICAgIHx8IGRmLT5SbWFzayA9PSAweDA3ZTAgfHwgZGYtPkJtYXNrID09IDB4MDdlMCkgewogICAgICAgICAgICAgICAgY29weV9vcGFxdWUgPSBjb3B5X29wYXF1ZV8xNjsKICAgICAgICAgICAgICAgIGNvcHlfdHJhbnNsID0gY29weV90cmFuc2xfNTY1OwogICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDdmZmY6CiAgICAgICAgICAgIGlmIChkZi0+R21hc2sgPT0gMHgwM2UwCiAgICAgICAgICAgICAgICB8fCBkZi0+Um1hc2sgPT0gMHgwM2UwIHx8IGRmLT5CbWFzayA9PSAweDAzZTApIHsKICAgICAgICAgICAgICAgIGNvcHlfb3BhcXVlID0gY29weV9vcGFxdWVfMTY7CiAgICAgICAgICAgICAgICBjb3B5X3RyYW5zbCA9IGNvcHlfdHJhbnNsXzU1NTsKICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgbWF4X29wYXF1ZV9ydW4gPSAyNTU7ICAgLyogcnVucyBzdG9yZWQgYXMgYnl0ZXMgKi8KCiAgICAgICAgLyogd29yc3QgY2FzZSBpcyBhbHRlcm5hdGluZyBvcGFxdWUgYW5kIHRyYW5zbHVjZW50IHBpeGVscywKICAgICAgICAgICB3aXRoIHJvb20gZm9yIGFsaWdubWVudCBwYWRkaW5nIGJldHdlZW4gbGluZXMgKi8KICAgICAgICBtYXhzaXplID0gc3VyZmFjZS0+aCAqICgyICsgKDQgKyAyKSAqIChzdXJmYWNlLT53ICsgMSkpICsgMjsKICAgICAgICBicmVhazsKICAgIGNhc2UgNDoKICAgICAgICBpZiAobWFza3N1bSAhPSAweDAwZmZmZmZmKQogICAgICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgIC8qIHJlcXVpcmVzIHVudXNlZCBoaWdoIGJ5dGUgKi8KICAgICAgICBjb3B5X29wYXF1ZSA9IGNvcHlfMzI7CiAgICAgICAgY29weV90cmFuc2wgPSBjb3B5XzMyOwogICAgICAgIG1heF9vcGFxdWVfcnVuID0gMjU1OyAgIC8qIHJ1bnMgc3RvcmVkIGFzIHNob3J0IGludHMgKi8KCiAgICAgICAgLyogd29yc3QgY2FzZSBpcyBhbHRlcm5hdGluZyBvcGFxdWUgYW5kIHRyYW5zbHVjZW50IHBpeGVscyAqLwogICAgICAgIG1heHNpemUgPSBzdXJmYWNlLT5oICogMiAqIDQgKiAoc3VyZmFjZS0+dyArIDEpICsgNDsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgLyogYW55dGhpbmcgZWxzZSB1bnN1cHBvcnRlZCByaWdodCBub3cgKi8KICAgIH0KCiAgICBtYXhzaXplICs9IHNpemVvZihSTEVEZXN0Rm9ybWF0KTsKICAgIHJsZWJ1ZiA9IChVaW50OCAqKSBTRExfbWFsbG9jKG1heHNpemUpOwogICAgaWYgKCFybGVidWYpIHsKICAgICAgICByZXR1cm4gU0RMX091dE9mTWVtb3J5KCk7CiAgICB9CiAgICB7CiAgICAgICAgLyogc2F2ZSB0aGUgZGVzdGluYXRpb24gZm9ybWF0IHNvIHdlIGNhbiB1bmRvIHRoZSBlbmNvZGluZyBsYXRlciAqLwogICAgICAgIFJMRURlc3RGb3JtYXQgKnIgPSAoUkxFRGVzdEZvcm1hdCAqKSBybGVidWY7CiAgICAgICAgci0+Qnl0ZXNQZXJQaXhlbCA9IGRmLT5CeXRlc1BlclBpeGVsOwogICAgICAgIHItPlJtYXNrID0gZGYtPlJtYXNrOwogICAgICAgIHItPkdtYXNrID0gZGYtPkdtYXNrOwogICAgICAgIHItPkJtYXNrID0gZGYtPkJtYXNrOwogICAgICAgIHItPkFtYXNrID0gZGYtPkFtYXNrOwogICAgICAgIHItPlJsb3NzID0gZGYtPlJsb3NzOwogICAgICAgIHItPkdsb3NzID0gZGYtPkdsb3NzOwogICAgICAgIHItPkJsb3NzID0gZGYtPkJsb3NzOwogICAgICAgIHItPkFsb3NzID0gZGYtPkFsb3NzOwogICAgICAgIHItPlJzaGlmdCA9IGRmLT5Sc2hpZnQ7CiAgICAgICAgci0+R3NoaWZ0ID0gZGYtPkdzaGlmdDsKICAgICAgICByLT5Cc2hpZnQgPSBkZi0+QnNoaWZ0OwogICAgICAgIHItPkFzaGlmdCA9IGRmLT5Bc2hpZnQ7CiAgICB9CiAgICBkc3QgPSBybGVidWYgKyBzaXplb2YoUkxFRGVzdEZvcm1hdCk7CgogICAgLyogRG8gdGhlIGFjdHVhbCBlbmNvZGluZyAqLwogICAgewogICAgICAgIGludCB4LCB5OwogICAgICAgIGludCBoID0gc3VyZmFjZS0+aCwgdyA9IHN1cmZhY2UtPnc7CiAgICAgICAgU0RMX1BpeGVsRm9ybWF0ICpzZiA9IHN1cmZhY2UtPmZvcm1hdDsKICAgICAgICBVaW50MzIgKnNyYyA9IChVaW50MzIgKikgc3VyZmFjZS0+cGl4ZWxzOwogICAgICAgIFVpbnQ4ICpsYXN0bGluZSA9IGRzdDsgIC8qIGVuZCBvZiBsYXN0IG5vbi1ibGFuayBsaW5lICovCgogICAgICAgIC8qIG9wYXF1ZSBjb3VudHMgYXJlIDggb3IgMTYgYml0cywgZGVwZW5kaW5nIG9uIHRhcmdldCBkZXB0aCAqLwojZGVmaW5lIEFERF9PUEFRVUVfQ09VTlRTKG4sIG0pICAgICAgICAgXAogICAgaWYoZGYtPkJ5dGVzUGVyUGl4ZWwgPT0gNCkgeyAgICAgICAgXAogICAgICAgICgoVWludDE2ICopZHN0KVswXSA9IG47ICAgICBcCiAgICAgICAgKChVaW50MTYgKilkc3QpWzFdID0gbTsgICAgIFwKICAgICAgICBkc3QgKz0gNDsgICAgICAgICAgICAgICBcCiAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICBcCiAgICAgICAgZHN0WzBdID0gbjsgICAgICAgICAgICAgXAogICAgICAgIGRzdFsxXSA9IG07ICAgICAgICAgICAgIFwKICAgICAgICBkc3QgKz0gMjsgICAgICAgICAgICAgICBcCiAgICB9CgogICAgICAgIC8qIHRyYW5zbHVjZW50IGNvdW50cyBhcmUgYWx3YXlzIDE2IGJpdCAqLwojZGVmaW5lIEFERF9UUkFOU0xfQ09VTlRTKG4sIG0pICAgICBcCiAgICAoKChVaW50MTYgKilkc3QpWzBdID0gbiwgKChVaW50MTYgKilkc3QpWzFdID0gbSwgZHN0ICs9IDQpCgogICAgICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKICAgICAgICAgICAgaW50IHJ1bnN0YXJ0LCBza2lwc3RhcnQ7CiAgICAgICAgICAgIGludCBibGFua2xpbmUgPSAwOwogICAgICAgICAgICAvKiBGaXJzdCBlbmNvZGUgYWxsIG9wYXF1ZSBwaXhlbHMgb2YgYSBzY2FuIGxpbmUgKi8KICAgICAgICAgICAgeCA9IDA7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIGludCBydW4sIHNraXAsIGxlbjsKICAgICAgICAgICAgICAgIHNraXBzdGFydCA9IHg7CiAgICAgICAgICAgICAgICB3aGlsZSAoeCA8IHcgJiYgIUlTT1BBUVVFKHNyY1t4XSwgc2YpKQogICAgICAgICAgICAgICAgICAgIHgrKzsKICAgICAgICAgICAgICAgIHJ1bnN0YXJ0ID0geDsKICAgICAgICAgICAgICAgIHdoaWxlICh4IDwgdyAmJiBJU09QQVFVRShzcmNbeF0sIHNmKSkKICAgICAgICAgICAgICAgICAgICB4Kys7CiAgICAgICAgICAgICAgICBza2lwID0gcnVuc3RhcnQgLSBza2lwc3RhcnQ7CiAgICAgICAgICAgICAgICBpZiAoc2tpcCA9PSB3KQogICAgICAgICAgICAgICAgICAgIGJsYW5rbGluZSA9IDE7CiAgICAgICAgICAgICAgICBydW4gPSB4IC0gcnVuc3RhcnQ7CiAgICAgICAgICAgICAgICB3aGlsZSAoc2tpcCA+IG1heF9vcGFxdWVfcnVuKSB7CiAgICAgICAgICAgICAgICAgICAgQUREX09QQVFVRV9DT1VOVFMobWF4X29wYXF1ZV9ydW4sIDApOwogICAgICAgICAgICAgICAgICAgIHNraXAgLT0gbWF4X29wYXF1ZV9ydW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZW4gPSBNSU4ocnVuLCBtYXhfb3BhcXVlX3J1bik7CiAgICAgICAgICAgICAgICBBRERfT1BBUVVFX0NPVU5UUyhza2lwLCBsZW4pOwogICAgICAgICAgICAgICAgZHN0ICs9IGNvcHlfb3BhcXVlKGRzdCwgc3JjICsgcnVuc3RhcnQsIGxlbiwgc2YsIGRmKTsKICAgICAgICAgICAgICAgIHJ1bnN0YXJ0ICs9IGxlbjsKICAgICAgICAgICAgICAgIHJ1biAtPSBsZW47CiAgICAgICAgICAgICAgICB3aGlsZSAocnVuKSB7CiAgICAgICAgICAgICAgICAgICAgbGVuID0gTUlOKHJ1biwgbWF4X29wYXF1ZV9ydW4pOwogICAgICAgICAgICAgICAgICAgIEFERF9PUEFRVUVfQ09VTlRTKDAsIGxlbik7CiAgICAgICAgICAgICAgICAgICAgZHN0ICs9IGNvcHlfb3BhcXVlKGRzdCwgc3JjICsgcnVuc3RhcnQsIGxlbiwgc2YsIGRmKTsKICAgICAgICAgICAgICAgICAgICBydW5zdGFydCArPSBsZW47CiAgICAgICAgICAgICAgICAgICAgcnVuIC09IGxlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSB3aGlsZSAoeCA8IHcpOwoKICAgICAgICAgICAgLyogTWFrZSBzdXJlIHRoZSBuZXh0IG91dHB1dCBhZGRyZXNzIGlzIDMyLWJpdCBhbGlnbmVkICovCiAgICAgICAgICAgIGRzdCArPSAodWludHB0cl90KSBkc3QgJiAyOwoKICAgICAgICAgICAgLyogTmV4dCwgZW5jb2RlIGFsbCB0cmFuc2x1Y2VudCBwaXhlbHMgb2YgdGhlIHNhbWUgc2NhbiBsaW5lICovCiAgICAgICAgICAgIHggPSAwOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBpbnQgcnVuLCBza2lwLCBsZW47CiAgICAgICAgICAgICAgICBza2lwc3RhcnQgPSB4OwogICAgICAgICAgICAgICAgd2hpbGUgKHggPCB3ICYmICFJU1RSQU5TTChzcmNbeF0sIHNmKSkKICAgICAgICAgICAgICAgICAgICB4Kys7CiAgICAgICAgICAgICAgICBydW5zdGFydCA9IHg7CiAgICAgICAgICAgICAgICB3aGlsZSAoeCA8IHcgJiYgSVNUUkFOU0woc3JjW3hdLCBzZikpCiAgICAgICAgICAgICAgICAgICAgeCsrOwogICAgICAgICAgICAgICAgc2tpcCA9IHJ1bnN0YXJ0IC0gc2tpcHN0YXJ0OwogICAgICAgICAgICAgICAgYmxhbmtsaW5lICY9IChza2lwID09IHcpOwogICAgICAgICAgICAgICAgcnVuID0geCAtIHJ1bnN0YXJ0OwogICAgICAgICAgICAgICAgd2hpbGUgKHNraXAgPiBtYXhfdHJhbnNsX3J1bikgewogICAgICAgICAgICAgICAgICAgIEFERF9UUkFOU0xfQ09VTlRTKG1heF90cmFuc2xfcnVuLCAwKTsKICAgICAgICAgICAgICAgICAgICBza2lwIC09IG1heF90cmFuc2xfcnVuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGVuID0gTUlOKHJ1biwgbWF4X3RyYW5zbF9ydW4pOwogICAgICAgICAgICAgICAgQUREX1RSQU5TTF9DT1VOVFMoc2tpcCwgbGVuKTsKICAgICAgICAgICAgICAgIGRzdCArPSBjb3B5X3RyYW5zbChkc3QsIHNyYyArIHJ1bnN0YXJ0LCBsZW4sIHNmLCBkZik7CiAgICAgICAgICAgICAgICBydW5zdGFydCArPSBsZW47CiAgICAgICAgICAgICAgICBydW4gLT0gbGVuOwogICAgICAgICAgICAgICAgd2hpbGUgKHJ1bikgewogICAgICAgICAgICAgICAgICAgIGxlbiA9IE1JTihydW4sIG1heF90cmFuc2xfcnVuKTsKICAgICAgICAgICAgICAgICAgICBBRERfVFJBTlNMX0NPVU5UUygwLCBsZW4pOwogICAgICAgICAgICAgICAgICAgIGRzdCArPSBjb3B5X3RyYW5zbChkc3QsIHNyYyArIHJ1bnN0YXJ0LCBsZW4sIHNmLCBkZik7CiAgICAgICAgICAgICAgICAgICAgcnVuc3RhcnQgKz0gbGVuOwogICAgICAgICAgICAgICAgICAgIHJ1biAtPSBsZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWJsYW5rbGluZSkKICAgICAgICAgICAgICAgICAgICBsYXN0bGluZSA9IGRzdDsKICAgICAgICAgICAgfSB3aGlsZSAoeCA8IHcpOwoKICAgICAgICAgICAgc3JjICs9IHN1cmZhY2UtPnBpdGNoID4+IDI7CiAgICAgICAgfQogICAgICAgIGRzdCA9IGxhc3RsaW5lOyAgICAgICAgIC8qIGJhY2sgdXAgcGFzdCB0cmFpbGluZyBibGFuayBsaW5lcyAqLwogICAgICAgIEFERF9PUEFRVUVfQ09VTlRTKDAsIDApOwogICAgfQoKI3VuZGVmIEFERF9PUEFRVUVfQ09VTlRTCiN1bmRlZiBBRERfVFJBTlNMX0NPVU5UUwoKICAgIC8qIE5vdyB0aGF0IHdlIGhhdmUgaXQgZW5jb2RlZCwgcmVsZWFzZSB0aGUgb3JpZ2luYWwgcGl4ZWxzICovCiAgICBpZiAoIShzdXJmYWNlLT5mbGFncyAmIFNETF9QUkVBTExPQykpIHsKICAgICAgICBTRExfU0lNREZyZWUoc3VyZmFjZS0+cGl4ZWxzKTsKICAgICAgICBzdXJmYWNlLT5waXhlbHMgPSBOVUxMOwogICAgICAgIHN1cmZhY2UtPmZsYWdzICY9IH5TRExfU0lNRF9BTElHTkVEOwogICAgfQoKICAgIC8qIHJlYWxsb2MgdGhlIGJ1ZmZlciB0byByZWxlYXNlIHVudXNlZCBtZW1vcnkgKi8KICAgIHsKICAgICAgICBVaW50OCAqcCA9IFNETF9yZWFsbG9jKHJsZWJ1ZiwgZHN0IC0gcmxlYnVmKTsKICAgICAgICBpZiAoIXApCiAgICAgICAgICAgIHAgPSBybGVidWY7CiAgICAgICAgc3VyZmFjZS0+bWFwLT5kYXRhID0gcDsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKc3RhdGljIFVpbnQzMgpnZXRwaXhfOChVaW50OCAqIHNyY2J1ZikKewogICAgcmV0dXJuICpzcmNidWY7Cn0KCnN0YXRpYyBVaW50MzIKZ2V0cGl4XzE2KFVpbnQ4ICogc3JjYnVmKQp7CiAgICByZXR1cm4gKihVaW50MTYgKikgc3JjYnVmOwp9CgpzdGF0aWMgVWludDMyCmdldHBpeF8yNChVaW50OCAqIHNyY2J1ZikKewojaWYgU0RMX0JZVEVPUkRFUiA9PSBTRExfTElMX0VORElBTgogICAgcmV0dXJuIHNyY2J1ZlswXSArIChzcmNidWZbMV0gPDwgOCkgKyAoc3JjYnVmWzJdIDw8IDE2KTsKI2Vsc2UKICAgIHJldHVybiAoc3JjYnVmWzBdIDw8IDE2KSArIChzcmNidWZbMV0gPDwgOCkgKyBzcmNidWZbMl07CiNlbmRpZgp9CgpzdGF0aWMgVWludDMyCmdldHBpeF8zMihVaW50OCAqIHNyY2J1ZikKewogICAgcmV0dXJuICooVWludDMyICopIHNyY2J1ZjsKfQoKdHlwZWRlZiBVaW50MzIoKmdldHBpeF9mdW5jKSAoVWludDggKik7CgpzdGF0aWMgY29uc3QgZ2V0cGl4X2Z1bmMgZ2V0cGl4ZXNbNF0gPSB7CiAgICBnZXRwaXhfOCwgZ2V0cGl4XzE2LCBnZXRwaXhfMjQsIGdldHBpeF8zMgp9OwoKc3RhdGljIGludApSTEVDb2xvcmtleVN1cmZhY2UoU0RMX1N1cmZhY2UgKiBzdXJmYWNlKQp7CiAgICBVaW50OCAqcmxlYnVmLCAqZHN0OwogICAgaW50IG1heG47CiAgICBpbnQgeTsKICAgIFVpbnQ4ICpzcmNidWYsICpsYXN0bGluZTsKICAgIGludCBtYXhzaXplID0gMDsKICAgIGNvbnN0IGludCBicHAgPSBzdXJmYWNlLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7CiAgICBnZXRwaXhfZnVuYyBnZXRwaXg7CiAgICBVaW50MzIgY2tleSwgcmdibWFzazsKICAgIGludCB3LCBoOwoKICAgIC8qIGNhbGN1bGF0ZSB0aGUgd29yc3QgY2FzZSBzaXplIGZvciB0aGUgY29tcHJlc3NlZCBzdXJmYWNlICovCiAgICBzd2l0Y2ggKGJwcCkgewogICAgY2FzZSAxOgogICAgICAgIC8qIHdvcnN0IGNhc2UgaXMgYWx0ZXJuYXRpbmcgb3BhcXVlIGFuZCB0cmFuc3BhcmVudCBwaXhlbHMsCiAgICAgICAgICAgc3RhcnRpbmcgd2l0aCBhbiBvcGFxdWUgcGl4ZWwgKi8KICAgICAgICBtYXhzaXplID0gc3VyZmFjZS0+aCAqIDMgKiAoc3VyZmFjZS0+dyAvIDIgKyAxKSArIDI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDI6CiAgICBjYXNlIDM6CiAgICAgICAgLyogd29yc3QgY2FzZSBpcyBzb2xpZCBydW5zLCBhdCBtb3N0IDI1NSBwaXhlbHMgd2lkZSAqLwogICAgICAgIG1heHNpemUgPSBzdXJmYWNlLT5oICogKDIgKiAoc3VyZmFjZS0+dyAvIDI1NSArIDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdXJmYWNlLT53ICogYnBwKSArIDI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDQ6CiAgICAgICAgLyogd29yc3QgY2FzZSBpcyBzb2xpZCBydW5zLCBhdCBtb3N0IDY1NTM1IHBpeGVscyB3aWRlICovCiAgICAgICAgbWF4c2l6ZSA9IHN1cmZhY2UtPmggKiAoNCAqIChzdXJmYWNlLT53IC8gNjU1MzUgKyAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3VyZmFjZS0+dyAqIDQpICsgNDsKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBybGVidWYgPSAoVWludDggKikgU0RMX21hbGxvYyhtYXhzaXplKTsKICAgIGlmIChybGVidWYgPT0gTlVMTCkgewogICAgICAgIHJldHVybiBTRExfT3V0T2ZNZW1vcnkoKTsKICAgIH0KCiAgICAvKiBTZXQgdXAgdGhlIGNvbnZlcnNpb24gKi8KICAgIHNyY2J1ZiA9IChVaW50OCAqKSBzdXJmYWNlLT5waXhlbHM7CiAgICBtYXhuID0gYnBwID09IDQgPyA2NTUzNSA6IDI1NTsKICAgIGRzdCA9IHJsZWJ1ZjsKICAgIHJnYm1hc2sgPSB+c3VyZmFjZS0+Zm9ybWF0LT5BbWFzazsKICAgIGNrZXkgPSBzdXJmYWNlLT5tYXAtPmluZm8uY29sb3JrZXkgJiByZ2JtYXNrOwogICAgbGFzdGxpbmUgPSBkc3Q7CiAgICBnZXRwaXggPSBnZXRwaXhlc1ticHAgLSAxXTsKICAgIHcgPSBzdXJmYWNlLT53OwogICAgaCA9IHN1cmZhY2UtPmg7CgojZGVmaW5lIEFERF9DT1VOVFMobiwgbSkgICAgICAgICAgICBcCiAgICBpZihicHAgPT0gNCkgeyAgICAgICAgICAgICAgXAogICAgICAgICgoVWludDE2ICopZHN0KVswXSA9IG47ICAgICBcCiAgICAgICAgKChVaW50MTYgKilkc3QpWzFdID0gbTsgICAgIFwKICAgICAgICBkc3QgKz0gNDsgICAgICAgICAgICAgICBcCiAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICBcCiAgICAgICAgZHN0WzBdID0gbjsgICAgICAgICAgICAgXAogICAgICAgIGRzdFsxXSA9IG07ICAgICAgICAgICAgIFwKICAgICAgICBkc3QgKz0gMjsgICAgICAgICAgICAgICBcCiAgICB9CgogICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgewogICAgICAgIGludCB4ID0gMDsKICAgICAgICBpbnQgYmxhbmtsaW5lID0gMDsKICAgICAgICBkbyB7CiAgICAgICAgICAgIGludCBydW4sIHNraXAsIGxlbjsKICAgICAgICAgICAgaW50IHJ1bnN0YXJ0OwogICAgICAgICAgICBpbnQgc2tpcHN0YXJ0ID0geDsKCiAgICAgICAgICAgIC8qIGZpbmQgcnVuIG9mIHRyYW5zcGFyZW50LCB0aGVuIG9wYXF1ZSBwaXhlbHMgKi8KICAgICAgICAgICAgd2hpbGUgKHggPCB3ICYmIChnZXRwaXgoc3JjYnVmICsgeCAqIGJwcCkgJiByZ2JtYXNrKSA9PSBja2V5KQogICAgICAgICAgICAgICAgeCsrOwogICAgICAgICAgICBydW5zdGFydCA9IHg7CiAgICAgICAgICAgIHdoaWxlICh4IDwgdyAmJiAoZ2V0cGl4KHNyY2J1ZiArIHggKiBicHApICYgcmdibWFzaykgIT0gY2tleSkKICAgICAgICAgICAgICAgIHgrKzsKICAgICAgICAgICAgc2tpcCA9IHJ1bnN0YXJ0IC0gc2tpcHN0YXJ0OwogICAgICAgICAgICBpZiAoc2tpcCA9PSB3KQogICAgICAgICAgICAgICAgYmxhbmtsaW5lID0gMTsKICAgICAgICAgICAgcnVuID0geCAtIHJ1bnN0YXJ0OwoKICAgICAgICAgICAgLyogZW5jb2RlIHNlZ21lbnQgKi8KICAgICAgICAgICAgd2hpbGUgKHNraXAgPiBtYXhuKSB7CiAgICAgICAgICAgICAgICBBRERfQ09VTlRTKG1heG4sIDApOwogICAgICAgICAgICAgICAgc2tpcCAtPSBtYXhuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxlbiA9IE1JTihydW4sIG1heG4pOwogICAgICAgICAgICBBRERfQ09VTlRTKHNraXAsIGxlbik7CiAgICAgICAgICAgIFNETF9tZW1jcHkoZHN0LCBzcmNidWYgKyBydW5zdGFydCAqIGJwcCwgbGVuICogYnBwKTsKICAgICAgICAgICAgZHN0ICs9IGxlbiAqIGJwcDsKICAgICAgICAgICAgcnVuIC09IGxlbjsKICAgICAgICAgICAgcnVuc3RhcnQgKz0gbGVuOwogICAgICAgICAgICB3aGlsZSAocnVuKSB7CiAgICAgICAgICAgICAgICBsZW4gPSBNSU4ocnVuLCBtYXhuKTsKICAgICAgICAgICAgICAgIEFERF9DT1VOVFMoMCwgbGVuKTsKICAgICAgICAgICAgICAgIFNETF9tZW1jcHkoZHN0LCBzcmNidWYgKyBydW5zdGFydCAqIGJwcCwgbGVuICogYnBwKTsKICAgICAgICAgICAgICAgIGRzdCArPSBsZW4gKiBicHA7CiAgICAgICAgICAgICAgICBydW5zdGFydCArPSBsZW47CiAgICAgICAgICAgICAgICBydW4gLT0gbGVuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghYmxhbmtsaW5lKQogICAgICAgICAgICAgICAgbGFzdGxpbmUgPSBkc3Q7CiAgICAgICAgfSB3aGlsZSAoeCA8IHcpOwoKICAgICAgICBzcmNidWYgKz0gc3VyZmFjZS0+cGl0Y2g7CiAgICB9CiAgICBkc3QgPSBsYXN0bGluZTsgICAgICAgICAgICAgLyogYmFjayB1cCBiYXN0IHRyYWlsaW5nIGJsYW5rIGxpbmVzICovCiAgICBBRERfQ09VTlRTKDAsIDApOwoKI3VuZGVmIEFERF9DT1VOVFMKCiAgICAvKiBOb3cgdGhhdCB3ZSBoYXZlIGl0IGVuY29kZWQsIHJlbGVhc2UgdGhlIG9yaWdpbmFsIHBpeGVscyAqLwogICAgaWYgKCEoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfUFJFQUxMT0MpKSB7CiAgICAgICAgU0RMX1NJTURGcmVlKHN1cmZhY2UtPnBpeGVscyk7CiAgICAgICAgc3VyZmFjZS0+cGl4ZWxzID0gTlVMTDsKICAgICAgICBzdXJmYWNlLT5mbGFncyAmPSB+U0RMX1NJTURfQUxJR05FRDsKICAgIH0KCiAgICAvKiByZWFsbG9jIHRoZSBidWZmZXIgdG8gcmVsZWFzZSB1bnVzZWQgbWVtb3J5ICovCiAgICB7CiAgICAgICAgLyogSWYgcmVhbGxvYyByZXR1cm5zIE5VTEwsIHRoZSBvcmlnaW5hbCBibG9jayBpcyBsZWZ0IGludGFjdCAqLwogICAgICAgIFVpbnQ4ICpwID0gU0RMX3JlYWxsb2MocmxlYnVmLCBkc3QgLSBybGVidWYpOwogICAgICAgIGlmICghcCkKICAgICAgICAgICAgcCA9IHJsZWJ1ZjsKICAgICAgICBzdXJmYWNlLT5tYXAtPmRhdGEgPSBwOwogICAgfQoKICAgIHJldHVybiAwOwp9CgppbnQKU0RMX1JMRVN1cmZhY2UoU0RMX1N1cmZhY2UgKiBzdXJmYWNlKQp7CiAgICBpbnQgZmxhZ3M7CgogICAgLyogQ2xlYXIgYW55IHByZXZpb3VzIFJMRSBjb252ZXJzaW9uICovCiAgICBpZiAoKHN1cmZhY2UtPmZsYWdzICYgU0RMX1JMRUFDQ0VMKSA9PSBTRExfUkxFQUNDRUwpIHsKICAgICAgICBTRExfVW5STEVTdXJmYWNlKHN1cmZhY2UsIDEpOwogICAgfQoKICAgIC8qIFdlIGRvbid0IHN1cHBvcnQgUkxFIGVuY29kaW5nIG9mIGJpdG1hcHMgKi8KICAgIGlmIChzdXJmYWNlLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCA8IDgpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgLyogTWFrZSBzdXJlIHRoZSBwaXhlbHMgYXJlIGF2YWlsYWJsZSAqLwogICAgaWYgKCFzdXJmYWNlLT5waXhlbHMpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBjb2xvcmtleSBvciBibGVuZGluZywgbm90aGluZyB0byBkby4uLiAqLwogICAgZmxhZ3MgPSBzdXJmYWNlLT5tYXAtPmluZm8uZmxhZ3M7CiAgICBpZiAoIShmbGFncyAmIChTRExfQ09QWV9DT0xPUktFWSB8IFNETF9DT1BZX0JMRU5EKSkpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgLyogUGFzcyBvbiBjb21iaW5hdGlvbnMgbm90IHN1cHBvcnRlZCAqLwogICAgaWYgKChmbGFncyAmIFNETF9DT1BZX01PRFVMQVRFX0NPTE9SKSB8fAogICAgICAgICgoZmxhZ3MgJiBTRExfQ09QWV9NT0RVTEFURV9BTFBIQSkgJiYgc3VyZmFjZS0+Zm9ybWF0LT5BbWFzaykgfHwKICAgICAgICAoZmxhZ3MgJiAoU0RMX0NPUFlfQUREIHwgU0RMX0NPUFlfTU9EKSkgfHwKICAgICAgICAoZmxhZ3MgJiBTRExfQ09QWV9ORUFSRVNUKSkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKiBFbmNvZGUgYW5kIHNldCB1cCB0aGUgYmxpdCAqLwogICAgaWYgKCFzdXJmYWNlLT5mb3JtYXQtPkFtYXNrIHx8ICEoZmxhZ3MgJiBTRExfQ09QWV9CTEVORCkpIHsKICAgICAgICBpZiAoIXN1cmZhY2UtPm1hcC0+aWRlbnRpdHkpIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBpZiAoUkxFQ29sb3JrZXlTdXJmYWNlKHN1cmZhY2UpIDwgMCkgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIHN1cmZhY2UtPm1hcC0+YmxpdCA9IFNETF9STEVCbGl0OwogICAgICAgIHN1cmZhY2UtPm1hcC0+aW5mby5mbGFncyB8PSBTRExfQ09QWV9STEVfQ09MT1JLRVk7CiAgICB9IGVsc2UgewogICAgICAgIGlmIChSTEVBbHBoYVN1cmZhY2Uoc3VyZmFjZSkgPCAwKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgc3VyZmFjZS0+bWFwLT5ibGl0ID0gU0RMX1JMRUFscGhhQmxpdDsKICAgICAgICBzdXJmYWNlLT5tYXAtPmluZm8uZmxhZ3MgfD0gU0RMX0NPUFlfUkxFX0FMUEhBS0VZOwogICAgfQoKICAgIC8qIFRoZSBzdXJmYWNlIGlzIG5vdyBhY2NlbGVyYXRlZCAqLwogICAgc3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX1JMRUFDQ0VMOwoKICAgIHJldHVybiAoMCk7Cn0KCi8qCiAqIFVuLVJMRSBhIHN1cmZhY2Ugd2l0aCBwaXhlbCBhbHBoYQogKiBUaGlzIG1heSBub3QgZ2l2ZSBiYWNrIGV4YWN0bHkgdGhlIGltYWdlIGJlZm9yZSBSTEUtZW5jb2Rpbmc7IGFsbAogKiBjb21wbGV0ZWx5IHRyYW5zcGFyZW50IHBpeGVscyB3aWxsIGJlIGxvc3QsIGFuZCBjb2xvciBhbmQgYWxwaGEgZGVwdGgKICogbWF5IGhhdmUgYmVlbiByZWR1Y2VkICh3aGVuIGVuY29kaW5nIGZvciAxNmJwcCB0YXJnZXRzKS4KICovCnN0YXRpYyBTRExfYm9vbApVblJMRUFscGhhKFNETF9TdXJmYWNlICogc3VyZmFjZSkKewogICAgVWludDggKnNyY2J1ZjsKICAgIFVpbnQzMiAqZHN0OwogICAgU0RMX1BpeGVsRm9ybWF0ICpzZiA9IHN1cmZhY2UtPmZvcm1hdDsKICAgIFJMRURlc3RGb3JtYXQgKmRmID0gc3VyZmFjZS0+bWFwLT5kYXRhOwogICAgaW50ICgqdW5jb3B5X29wYXF1ZSkgKFVpbnQzMiAqLCB2b2lkICosIGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICBSTEVEZXN0Rm9ybWF0ICosIFNETF9QaXhlbEZvcm1hdCAqKTsKICAgIGludCAoKnVuY29weV90cmFuc2wpIChVaW50MzIgKiwgdm9pZCAqLCBpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgUkxFRGVzdEZvcm1hdCAqLCBTRExfUGl4ZWxGb3JtYXQgKik7CiAgICBpbnQgdyA9IHN1cmZhY2UtPnc7CiAgICBpbnQgYnBwID0gZGYtPkJ5dGVzUGVyUGl4ZWw7CgogICAgaWYgKGJwcCA9PSAyKSB7CiAgICAgICAgdW5jb3B5X29wYXF1ZSA9IHVuY29weV9vcGFxdWVfMTY7CiAgICAgICAgdW5jb3B5X3RyYW5zbCA9IHVuY29weV90cmFuc2xfMTY7CiAgICB9IGVsc2UgewogICAgICAgIHVuY29weV9vcGFxdWUgPSB1bmNvcHlfdHJhbnNsID0gdW5jb3B5XzMyOwogICAgfQoKICAgIHN1cmZhY2UtPnBpeGVscyA9IFNETF9TSU1EQWxsb2Moc3VyZmFjZS0+aCAqIHN1cmZhY2UtPnBpdGNoKTsKICAgIGlmICghc3VyZmFjZS0+cGl4ZWxzKSB7CiAgICAgICAgcmV0dXJuIChTRExfRkFMU0UpOwogICAgfQogICAgc3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX1NJTURfQUxJR05FRDsKICAgIC8qIGZpbGwgYmFja2dyb3VuZCB3aXRoIHRyYW5zcGFyZW50IHBpeGVscyAqLwogICAgU0RMX21lbXNldChzdXJmYWNlLT5waXhlbHMsIDAsIHN1cmZhY2UtPmggKiBzdXJmYWNlLT5waXRjaCk7CgogICAgZHN0ID0gc3VyZmFjZS0+cGl4ZWxzOwogICAgc3JjYnVmID0gKFVpbnQ4ICopIChkZiArIDEpOwogICAgZm9yICg7OykgewogICAgICAgIC8qIGNvcHkgb3BhcXVlIHBpeGVscyAqLwogICAgICAgIGludCBvZnMgPSAwOwogICAgICAgIGRvIHsKICAgICAgICAgICAgdW5zaWduZWQgcnVuOwogICAgICAgICAgICBpZiAoYnBwID09IDIpIHsKICAgICAgICAgICAgICAgIG9mcyArPSBzcmNidWZbMF07CiAgICAgICAgICAgICAgICBydW4gPSBzcmNidWZbMV07CiAgICAgICAgICAgICAgICBzcmNidWYgKz0gMjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG9mcyArPSAoKFVpbnQxNiAqKSBzcmNidWYpWzBdOwogICAgICAgICAgICAgICAgcnVuID0gKChVaW50MTYgKikgc3JjYnVmKVsxXTsKICAgICAgICAgICAgICAgIHNyY2J1ZiArPSA0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChydW4pIHsKICAgICAgICAgICAgICAgIHNyY2J1ZiArPSB1bmNvcHlfb3BhcXVlKGRzdCArIG9mcywgc3JjYnVmLCBydW4sIGRmLCBzZik7CiAgICAgICAgICAgICAgICBvZnMgKz0gcnVuOwogICAgICAgICAgICB9IGVsc2UgaWYgKCFvZnMpIHsKICAgICAgICAgICAgICAgIGdvdG8gZW5kX2Z1bmN0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgfSB3aGlsZSAob2ZzIDwgdyk7CgogICAgICAgIC8qIHNraXAgcGFkZGluZyBpZiBuZWVkZWQgKi8KICAgICAgICBpZiAoYnBwID09IDIpCiAgICAgICAgICAgIHNyY2J1ZiArPSAodWludHB0cl90KSBzcmNidWYgJiAyOwoKICAgICAgICAvKiBjb3B5IHRyYW5zbHVjZW50IHBpeGVscyAqLwogICAgICAgIG9mcyA9IDA7CiAgICAgICAgZG8gewogICAgICAgICAgICB1bnNpZ25lZCBydW47CiAgICAgICAgICAgIG9mcyArPSAoKFVpbnQxNiAqKSBzcmNidWYpWzBdOwogICAgICAgICAgICBydW4gPSAoKFVpbnQxNiAqKSBzcmNidWYpWzFdOwogICAgICAgICAgICBzcmNidWYgKz0gNDsKICAgICAgICAgICAgaWYgKHJ1bikgewogICAgICAgICAgICAgICAgc3JjYnVmICs9IHVuY29weV90cmFuc2woZHN0ICsgb2ZzLCBzcmNidWYsIHJ1biwgZGYsIHNmKTsKICAgICAgICAgICAgICAgIG9mcyArPSBydW47CiAgICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlIChvZnMgPCB3KTsKICAgICAgICBkc3QgKz0gc3VyZmFjZS0+cGl0Y2ggPj4gMjsKICAgIH0KCmVuZF9mdW5jdGlvbjoKICAgIHJldHVybiAoU0RMX1RSVUUpOwp9Cgp2b2lkClNETF9VblJMRVN1cmZhY2UoU0RMX1N1cmZhY2UgKiBzdXJmYWNlLCBpbnQgcmVjb2RlKQp7CiAgICBpZiAoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfUkxFQUNDRUwpIHsKICAgICAgICBzdXJmYWNlLT5mbGFncyAmPSB+U0RMX1JMRUFDQ0VMOwoKICAgICAgICBpZiAocmVjb2RlICYmICEoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfUFJFQUxMT0MpKSB7CiAgICAgICAgICAgIGlmIChzdXJmYWNlLT5tYXAtPmluZm8uZmxhZ3MgJiBTRExfQ09QWV9STEVfQ09MT1JLRVkpIHsKICAgICAgICAgICAgICAgIFNETF9SZWN0IGZ1bGw7CgogICAgICAgICAgICAgICAgLyogcmUtY3JlYXRlIHRoZSBvcmlnaW5hbCBzdXJmYWNlICovCiAgICAgICAgICAgICAgICBzdXJmYWNlLT5waXhlbHMgPSBTRExfU0lNREFsbG9jKHN1cmZhY2UtPmggKiBzdXJmYWNlLT5waXRjaCk7CiAgICAgICAgICAgICAgICBpZiAoIXN1cmZhY2UtPnBpeGVscykgewogICAgICAgICAgICAgICAgICAgIC8qIE9oIGNyYXAuLi4gKi8KICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLT5mbGFncyB8PSBTRExfUkxFQUNDRUw7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX1NJTURfQUxJR05FRDsKCiAgICAgICAgICAgICAgICAvKiBmaWxsIGl0IHdpdGggdGhlIGJhY2tncm91bmQgY29sb3IgKi8KICAgICAgICAgICAgICAgIFNETF9GaWxsUmVjdChzdXJmYWNlLCBOVUxMLCBzdXJmYWNlLT5tYXAtPmluZm8uY29sb3JrZXkpOwoKICAgICAgICAgICAgICAgIC8qIG5vdyByZW5kZXIgdGhlIGVuY29kZWQgc3VyZmFjZSAqLwogICAgICAgICAgICAgICAgZnVsbC54ID0gZnVsbC55ID0gMDsKICAgICAgICAgICAgICAgIGZ1bGwudyA9IHN1cmZhY2UtPnc7CiAgICAgICAgICAgICAgICBmdWxsLmggPSBzdXJmYWNlLT5oOwogICAgICAgICAgICAgICAgU0RMX1JMRUJsaXQoc3VyZmFjZSwgJmZ1bGwsIHN1cmZhY2UsICZmdWxsKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICghVW5STEVBbHBoYShzdXJmYWNlKSkgewogICAgICAgICAgICAgICAgICAgIC8qIE9oIGNyYXAuLi4gKi8KICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLT5mbGFncyB8PSBTRExfUkxFQUNDRUw7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN1cmZhY2UtPm1hcC0+aW5mby5mbGFncyAmPQogICAgICAgICAgICB+KFNETF9DT1BZX1JMRV9DT0xPUktFWSB8IFNETF9DT1BZX1JMRV9BTFBIQUtFWSk7CgogICAgICAgIFNETF9mcmVlKHN1cmZhY2UtPm1hcC0+ZGF0YSk7CiAgICAgICAgc3VyZmFjZS0+bWFwLT5kYXRhID0gTlVMTDsKICAgIH0KfQoKLyogdmk6IHNldCB0cz00IHN3PTQgZXhwYW5kdGFiOiAqLwo=