LyoKICBTaW1wbGUgRGlyZWN0TWVkaWEgTGF5ZXIKICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxOSBTYW0gTGFudGluZ2EgPHNsb3VrZW5AbGlic2RsLm9yZz4KCiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KCiAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAogIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKCiAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQogICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQogICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCiAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKi8KI2luY2x1ZGUgIi4uL1NETF9pbnRlcm5hbC5oIgoKLyoKICogUkxFIGVuY29kaW5nIGZvciBzb2Z0d2FyZSBjb2xvcmtleSBhbmQgYWxwaGEtY2hhbm5lbCBhY2NlbGVyYXRpb24KICoKICogT3JpZ2luYWwgdmVyc2lvbiBieSBTYW0gTGFudGluZ2EKICoKICogTWF0dGlhcyBFbmdkZWflcmQgKFlvcmljayk6IFJld3JpdGUuIE5ldyBlbmNvZGluZyBmb3JtYXQsIGVuY29kZXIgYW5kCiAqIGRlY29kZXIuIEFkZGVkIHBlci1zdXJmYWNlIGFscGhhIGJsaXR0ZXIuIEFkZGVkIHBlci1waXhlbCBhbHBoYQogKiBmb3JtYXQsIGVuY29kZXIgYW5kIGJsaXR0ZXIuCiAqCiAqIE1hbnkgdGhhbmtzIHRvIFhhcmsgYW5kIGpvaG5zIGZvciBoaW50cywgYmVuY2htYXJrcyBhbmQgdXNlZnVsIGNvbW1lbnRzCiAqIGxlYWRpbmcgdG8gdGhpcyBjb2RlLgogKgogKiBXZWxjb21lIHRvIE1hY3JvIE1heWhlbS4KICovCgovKgogKiBUaGUgZW5jb2RpbmcgdHJhbnNsYXRlcyB0aGUgaW1hZ2UgZGF0YSB0byBhIHN0cmVhbSBvZiBzZWdtZW50cyBvZiB0aGUgZm9ybQogKgogKiA8c2tpcD4gPHJ1bj4gPGRhdGE+CiAqCiAqIHdoZXJlIDxza2lwPiBpcyB0aGUgbnVtYmVyIG9mIHRyYW5zcGFyZW50IHBpeGVscyB0byBza2lwLAogKiAgICAgICA8cnVuPiAgaXMgdGhlIG51bWJlciBvZiBvcGFxdWUgcGl4ZWxzIHRvIGJsaXQsCiAqIGFuZCAgIDxkYXRhPiBhcmUgdGhlIHBpeGVscyB0aGVtc2VsdmVzLgogKgogKiBUaGlzIGJhc2ljIHN0cnVjdHVyZSBpcyB1c2VkIGJvdGggZm9yIGNvbG9ya2V5ZWQgc3VyZmFjZXMsIHVzZWQgZm9yIHNpbXBsZQogKiBiaW5hcnkgdHJhbnNwYXJlbmN5IGFuZCBmb3IgcGVyLXN1cmZhY2UgYWxwaGEgYmxlbmRpbmcsIGFuZCBmb3Igc3VyZmFjZXMKICogd2l0aCBwZXItcGl4ZWwgYWxwaGEuIFRoZSBkZXRhaWxzIGRpZmZlciwgaG93ZXZlcjoKICoKICogRW5jb2Rpbmcgb2YgY29sb3JrZXllZCBzdXJmYWNlczoKICoKICogICBFbmNvZGVkIHBpeGVscyBhbHdheXMgaGF2ZSB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIHRhcmdldCBzdXJmYWNlLgogKiAgIDxza2lwPiBhbmQgPHJ1bj4gYXJlIHVuc2lnbmVkIDggYml0IGludGVnZXJzLCBleGNlcHQgZm9yIDMyIGJpdCBkZXB0aAogKiAgIHdoZXJlIHRoZXkgYXJlIDE2IGJpdC4gVGhpcyBtYWtlcyB0aGUgcGl4ZWwgZGF0YSBhbGlnbmVkIGF0IGFsbCB0aW1lcy4KICogICBTZWdtZW50cyBuZXZlciB3cmFwIGFyb3VuZCBmcm9tIG9uZSBzY2FuIGxpbmUgdG8gdGhlIG5leHQuCiAqCiAqICAgVGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UgaXMgbWFya2VkIGJ5IGEgemVybyA8c2tpcD4sPHJ1bj4gcGFpciBhdCB0aGUgKgogKiAgIGJlZ2lubmluZyBvZiBhIGxpbmUuCiAqCiAqIEVuY29kaW5nIG9mIHN1cmZhY2VzIHdpdGggcGVyLXBpeGVsIGFscGhhOgogKgogKiAgIFRoZSBzZXF1ZW5jZSBiZWdpbnMgd2l0aCBhIHN0cnVjdCBSTEVEZXN0Rm9ybWF0IGRlc2NyaWJpbmcgdGhlIHRhcmdldAogKiAgIHBpeGVsIGZvcm1hdCwgdG8gcHJvdmlkZSByZWxpYWJsZSB1bi1lbmNvZGluZy4KICoKICogICBFYWNoIHNjYW4gbGluZSBpcyBlbmNvZGVkIHR3aWNlOiBGaXJzdCBhbGwgY29tcGxldGVseSBvcGFxdWUgcGl4ZWxzLAogKiAgIGVuY29kZWQgaW4gdGhlIHRhcmdldCBmb3JtYXQgYXMgZGVzY3JpYmVkIGFib3ZlLCBhbmQgdGhlbiBhbGwKICogICBwYXJ0aWFsbHkgdHJhbnNwYXJlbnQgKHRyYW5zbHVjZW50KSBwaXhlbHMgKHdoZXJlIDEgPD0gYWxwaGEgPD0gMjU0KSwKICogICBpbiB0aGUgZm9sbG93aW5nIDMyLWJpdCBmb3JtYXQ6CiAqCiAqICAgRm9yIDMyLWJpdCB0YXJnZXRzLCBlYWNoIHBpeGVsIGhhcyB0aGUgdGFyZ2V0IFJHQiBmb3JtYXQgYnV0IHdpdGgKICogICB0aGUgYWxwaGEgdmFsdWUgb2NjdXB5aW5nIHRoZSBoaWdoZXN0IDggYml0cy4gVGhlIDxza2lwPiBhbmQgPHJ1bj4KICogICBjb3VudHMgYXJlIDE2IGJpdC4KICoKICogICBGb3IgMTYtYml0IHRhcmdldHMsIGVhY2ggcGl4ZWwgaGFzIHRoZSB0YXJnZXQgUkdCIGZvcm1hdCwgYnV0IHdpdGgKICogICB0aGUgbWlkZGxlIGNvbXBvbmVudCAodXN1YWxseSBncmVlbikgc2hpZnRlZCAxNiBzdGVwcyB0byB0aGUgbGVmdCwKICogICBhbmQgdGhlIGhvbGUgZmlsbGVkIHdpdGggdGhlIDUgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBhbHBoYSB2YWx1ZS4KICogICBpLmUuIGlmIHRoZSB0YXJnZXQgaGFzIHRoZSBmb3JtYXQgICAgICAgICBycnJycmdnZ2dnZ2JiYmJiLAogKiAgIHRoZSBlbmNvZGVkIHBpeGVsIHdpbGwgYmUgMDAwMDBnZ2dnZ2cwMDAwMHJycnJyMGFhYWFhYmJiYmIuCiAqICAgVGhlIDxza2lwPiBhbmQgPHJ1bj4gY291bnRzIGFyZSA4IGJpdCBmb3IgdGhlIG9wYXF1ZSBsaW5lcywgMTYgYml0CiAqICAgZm9yIHRoZSB0cmFuc2x1Y2VudCBsaW5lcy4gVHdvIHBhZGRpbmcgYnl0ZXMgbWF5IGJlIGluc2VydGVkCiAqICAgYmVmb3JlIGVhY2ggdHJhbnNsdWNlbnQgbGluZSB0byBrZWVwIHRoZW0gMzItYml0IGFsaWduZWQuCiAqCiAqICAgVGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UgaXMgbWFya2VkIGJ5IGEgemVybyA8c2tpcD4sPHJ1bj4gcGFpciBhdCB0aGUKICogICBiZWdpbm5pbmcgb2YgYW4gb3BhcXVlIGxpbmUuCiAqLwoKI2luY2x1ZGUgIlNETF92aWRlby5oIgojaW5jbHVkZSAiU0RMX3N5c3ZpZGVvLmgiCiNpbmNsdWRlICJTRExfYmxpdC5oIgojaW5jbHVkZSAiU0RMX1JMRWFjY2VsX2MuaCIKCiNpZm5kZWYgTUlOCiNkZWZpbmUgTUlOKGEsIGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCiNlbmRpZgoKI2RlZmluZSBQSVhFTF9DT1BZKHRvLCBmcm9tLCBsZW4sIGJwcCkgICAgICAgICAgXAogICAgU0RMX21lbWNweSh0bywgZnJvbSwgKHNpemVfdCkobGVuKSAqIChicHApKQoKLyoKICogVmFyaW91cyBjb2xvcmtleSBibGl0IG1ldGhvZHMsIGZvciBvcGFxdWUgYW5kIHBlci1zdXJmYWNlIGFscGhhCiAqLwoKI2RlZmluZSBPUEFRVUVfQkxJVCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKSAgIFwKICAgIFBJWEVMX0NPUFkodG8sIGZyb20sIGxlbmd0aCwgYnBwKQoKLyoKICogRm9yIDMyYnBwIHBpeGVscyBvbiB0aGUgZm9ybSAweDAwcnJnZ2JiOgogKiBJZiB3ZSB0cmVhdCB0aGUgbWlkZGxlIGNvbXBvbmVudCBzZXBhcmF0ZWx5LCB3ZSBjYW4gcHJvY2VzcyB0aGUgdHdvCiAqIHJlbWFpbmluZyBpbiBwYXJhbGxlbC4gVGhpcyBpcyBzYWZlIHRvIGRvIGJlY2F1c2Ugb2YgdGhlIGdhcCB0byB0aGUgbGVmdAogKiBvZiBlYWNoIGNvbXBvbmVudCwgc28gdGhlIGJpdHMgZnJvbSB0aGUgbXVsdGlwbGljYXRpb24gZG9uJ3QgY29sbGlkZS4KICogVGhpcyBjYW4gYmUgdXNlZCBmb3IgYW55IFJHQiBwZXJtdXRhdGlvbiBvZiBjb3Vyc2UuCiAqLwojZGVmaW5lIEFMUEhBX0JMSVQzMl84ODgodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQzMiAqc3JjID0gKFVpbnQzMiAqKShmcm9tKTsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyICpkc3QgPSAoVWludDMyICopKHRvKTsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkobGVuZ3RoKTsgaSsrKSB7ICAgICAgICAgICAgICAgXAogICAgICAgICAgICBVaW50MzIgcyA9ICpzcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFVpbnQzMiBkID0gKmRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgVWludDMyIHMxID0gcyAmIDB4ZmYwMGZmOyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBVaW50MzIgZDEgPSBkICYgMHhmZjAwZmY7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGQxID0gKGQxICsgKChzMSAtIGQxKSAqIGFscGhhID4+IDgpKSAmIDB4ZmYwMGZmOyBcCiAgICAgICAgICAgIHMgJj0gMHhmZjAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZCAmPSAweGZmMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBkID0gKGQgKyAoKHMgLSBkKSAqIGFscGhhID4+IDgpKSAmIDB4ZmYwMDsgICAgICBcCiAgICAgICAgICAgICpkc3QrKyA9IGQxIHwgZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSAoMCkKCi8qCiAqIEZvciAxNmJwcCBwaXhlbHMgd2UgY2FuIGdvIGEgc3RlcCBmdXJ0aGVyOiBwdXQgdGhlIG1pZGRsZSBjb21wb25lbnQKICogaW4gdGhlIGhpZ2ggMTYgYml0cyBvZiBhIDMyIGJpdCB3b3JkLCBhbmQgcHJvY2VzcyBhbGwgdGhyZWUgUkdCCiAqIGNvbXBvbmVudHMgYXQgdGhlIHNhbWUgdGltZS4gU2luY2UgdGhlIHNtYWxsZXN0IGdhcCBpcyBoZXJlIGp1c3QKICogNSBiaXRzLCB3ZSBoYXZlIHRvIHNjYWxlIGFscGhhIGRvd24gdG8gNSBiaXRzIGFzIHdlbGwuCiAqLwojZGVmaW5lIEFMUEhBX0JMSVQxNl81NjUodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQxNiAqc3JjID0gKFVpbnQxNiAqKShmcm9tKTsgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MTYgKmRzdCA9IChVaW50MTYgKikodG8pOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyIEFMUEhBID0gYWxwaGEgPj4gMzsgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGZvcihpID0gMDsgaSA8IChpbnQpKGxlbmd0aCk7IGkrKykgeyAgICAgICAgICAgIFwKICAgICAgICAgICAgVWludDMyIHMgPSAqc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFVpbnQzMiBkID0gKmRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBzID0gKHMgfCBzIDw8IDE2KSAmIDB4MDdlMGY4MWY7ICAgICAgICAgICAgIFwKICAgICAgICAgICAgZCA9IChkIHwgZCA8PCAxNikgJiAweDA3ZTBmODFmOyAgICAgICAgICAgICBcCiAgICAgICAgICAgIGQgKz0gKHMgLSBkKSAqIEFMUEhBID4+IDU7ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBkICY9IDB4MDdlMGY4MWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgKmRzdCsrID0gKFVpbnQxNikoZCB8IGQgPj4gMTYpOyAgICAgICAgICAgICBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKI2RlZmluZSBBTFBIQV9CTElUMTZfNTU1KHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MTYgKnNyYyA9IChVaW50MTYgKikoZnJvbSk7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDE2ICpkc3QgPSAoVWludDE2ICopKHRvKTsgICAgICAgICAgICAgICAgICAgXAogICAgICAgIFVpbnQzMiBBTFBIQSA9IGFscGhhID4+IDM7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBmb3IoaSA9IDA7IGkgPCAoaW50KShsZW5ndGgpOyBpKyspIHsgICAgICAgICAgICBcCiAgICAgICAgICAgIFVpbnQzMiBzID0gKnNyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBVaW50MzIgZCA9ICpkc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgcyA9IChzIHwgcyA8PCAxNikgJiAweDAzZTA3YzFmOyAgICAgICAgICAgICBcCiAgICAgICAgICAgIGQgPSAoZCB8IGQgPDwgMTYpICYgMHgwM2UwN2MxZjsgICAgICAgICAgICAgXAogICAgICAgICAgICBkICs9IChzIC0gZCkgKiBBTFBIQSA+PiA1OyAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgZCAmPSAweDAzZTA3YzFmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICpkc3QrKyA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsgICAgICAgICAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCi8qCiAqIFRoZSBnZW5lcmFsIHNsb3cgY2F0Y2gtYWxsIGZ1bmN0aW9uLCBmb3IgcmVtYWluaW5nIGRlcHRocyBhbmQgZm9ybWF0cwogKi8KI2RlZmluZSBBTFBIQV9CTElUX0FOWSh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKSAgICAgICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50OCAqc3JjID0gZnJvbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50OCAqZHN0ID0gdG87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkobGVuZ3RoKTsgaSsrKSB7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgVWludDMyIHMsIGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgdW5zaWduZWQgcnMsIGdzLCBicywgcmQsIGdkLCBiZDsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgc3dpdGNoIChicHApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIHMgPSAqKFVpbnQxNiAqKXNyYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGQgPSAqKFVpbnQxNiAqKWRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGlmIChTRExfQllURU9SREVSID09IFNETF9CSUdfRU5ESUFOKSB7ICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBzID0gKHNyY1swXSA8PCAxNikgfCAoc3JjWzFdIDw8IDgpIHwgc3JjWzJdOyBcCiAgICAgICAgICAgICAgICAgICAgZCA9IChkc3RbMF0gPDwgMTYpIHwgKGRzdFsxXSA8PCA4KSB8IGRzdFsyXTsgXAogICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIHMgPSAoc3JjWzJdIDw8IDE2KSB8IChzcmNbMV0gPDwgOCkgfCBzcmNbMF07IFwKICAgICAgICAgICAgICAgICAgICBkID0gKGRzdFsyXSA8PCAxNikgfCAoZHN0WzFdIDw8IDgpIHwgZHN0WzBdOyBcCiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNhc2UgNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBzID0gKihVaW50MzIgKilzcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBkID0gKihVaW50MzIgKilkc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFJHQl9GUk9NX1BJWEVMKHMsIGZtdCwgcnMsIGdzLCBicyk7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFJHQl9GUk9NX1BJWEVMKGQsIGZtdCwgcmQsIGdkLCBiZCk7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHJkICs9IChycyAtIHJkKSAqIGFscGhhID4+IDg7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGdkICs9IChncyAtIGdkKSAqIGFscGhhID4+IDg7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGJkICs9IChicyAtIGJkKSAqIGFscGhhID4+IDg7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFBJWEVMX0ZST01fUkdCKGQsIGZtdCwgcmQsIGdkLCBiZCk7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHN3aXRjaCAoYnBwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAqKFVpbnQxNiAqKWRzdCA9IChVaW50MTYpZDsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNhc2UgMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBpZiAoU0RMX0JZVEVPUkRFUiA9PSBTRExfQklHX0VORElBTikgeyAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZHN0WzBdID0gKFVpbnQ4KShkID4+IDE2KTsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZHN0WzFdID0gKFVpbnQ4KShkID4+IDgpOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZHN0WzJdID0gKFVpbnQ4KShkKTsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZHN0WzBdID0gKFVpbnQ4KWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZHN0WzFdID0gKFVpbnQ4KShkID4+IDgpOyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZHN0WzJdID0gKFVpbnQ4KShkID4+IDE2KTsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNhc2UgNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAqKFVpbnQzMiAqKWRzdCA9IGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHNyYyArPSBicHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGRzdCArPSBicHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgovKgogKiBTcGVjaWFsIGNhc2U6IDUwJSBhbHBoYSAoYWxwaGE9MTI4KQogKiBUaGlzIGlzIHRyZWF0ZWQgc3BlY2lhbGx5IGJlY2F1c2UgaXQgY2FuIGJlIG9wdGltaXplZCB2ZXJ5IHdlbGwsIGFuZAogKiBzaW5jZSBpdCBpcyBnb29kIGZvciBtYW55IGNhc2VzIG9mIHNlbWktdHJhbnNsdWNlbmN5LgogKiBUaGUgdGhlb3J5IGlzIHRvIGRvIGFsbCB0aHJlZSBjb21wb25lbnRzIGF0IHRoZSBzYW1lIHRpbWU6CiAqIEZpcnN0IHplcm8gdGhlIGxvd2VzdCBiaXQgb2YgZWFjaCBjb21wb25lbnQsIHdoaWNoIGdpdmVzIHVzIHJvb20gdG8KICogYWRkIHRoZW0uIFRoZW4gc2hpZnQgcmlnaHQgYW5kIGFkZCB0aGUgc3VtIG9mIHRoZSBsb3dlc3QgYml0cy4KICovCiNkZWZpbmUgQUxQSEFfQkxJVDMyXzg4OF81MCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKSAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyICpzcmMgPSAoVWludDMyICopKGZyb20pOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyICpkc3QgPSAoVWludDMyICopKHRvKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZm9yKGkgPSAwOyBpIDwgKGludCkobGVuZ3RoKTsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFVpbnQzMiBzID0gKnNyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIFVpbnQzMiBkID0gKmRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICpkc3QrKyA9ICgoKHMgJiAweDAwZmVmZWZlKSArIChkICYgMHgwMGZlZmVmZSkpID4+IDEpIFwKICAgICAgICAgICAgICAgICArIChzICYgZCAmIDB4MDAwMTAxMDEpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCi8qCiAqIEZvciAxNmJwcCwgd2UgY2FuIGFjdHVhbGx5IGJsZW5kIHR3byBwaXhlbHMgaW4gcGFyYWxsZWwsIGlmIHdlIHRha2UKICogY2FyZSB0byBzaGlmdCBiZWZvcmUgd2UgYWRkLCBub3QgYWZ0ZXIuCiAqLwoKLyogaGVscGVyOiBibGVuZCBhIHNpbmdsZSAxNiBiaXQgcGl4ZWwgYXQgNTAlICovCiNkZWZpbmUgQkxFTkQxNl81MChkc3QsIHNyYywgbWFzaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyIHMgPSAqc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgVWludDMyIGQgPSAqZHN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgKmRzdCsrID0gKFVpbnQxNikoKCgocyAmIG1hc2spICsgKGQgJiBtYXNrKSkgPj4gMSkgKyAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgKHMgJiBkICYgKH5tYXNrICYgMHhmZmZmKSkpOyAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgovKiBiYXNpYyAxNmJwcCBibGVuZGVyLiBtYXNrIGlzIHRoZSBwaXhlbHMgdG8ga2VlcCB3aGVuIGFkZGluZy4gKi8KI2RlZmluZSBBTFBIQV9CTElUMTZfNTAodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSwgbWFzaykgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB1bnNpZ25lZCBuID0gKGxlbmd0aCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MTYgKnNyYyA9IChVaW50MTYgKikoZnJvbSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MTYgKmRzdCA9IChVaW50MTYgKikodG8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpZiAoKCh1aW50cHRyX3Qpc3JjIF4gKHVpbnRwdHJfdClkc3QpICYgMykgeyAgICAgICAgICAgIFwKICAgICAgICAgICAgLyogc291cmNlIGFuZCBkZXN0aW5hdGlvbiBub3QgaW4gcGhhc2UsIGJsaXQgb25lIGJ5IG9uZSAqLyBcCiAgICAgICAgICAgIHdoaWxlIChuLS0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBCTEVORDE2XzUwKGRzdCwgc3JjLCBtYXNrKTsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmICgodWludHB0cl90KXNyYyAmIDMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAvKiBmaXJzdCBvZGQgcGl4ZWwgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBCTEVORDE2XzUwKGRzdCwgc3JjLCBtYXNrKTsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBuLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGZvciAoOyBuID4gMTsgbiAtPSAyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBVaW50MzIgcyA9ICooVWludDMyICopc3JjOyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBVaW50MzIgZCA9ICooVWludDMyICopZHN0OyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAqKFVpbnQzMiAqKWRzdCA9ICgocyAmIChtYXNrIHwgbWFzayA8PCAxNikpID4+IDEpIFwKICAgICAgICAgICAgICAgICAgICArICgoZCAmIChtYXNrIHwgbWFzayA8PCAxNikpID4+IDEpICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICArIChzICYgZCAmICh+KG1hc2sgfCBtYXNrIDw8IDE2KSkpOyAgICAgICAgIFwKICAgICAgICAgICAgICAgIHNyYyArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGRzdCArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYgKG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIEJMRU5EMTZfNTAoZHN0LCBzcmMsIG1hc2spOyAvKiBsYXN0IG9kZCBwaXhlbCAqLyBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgojZGVmaW5lIEFMUEhBX0JMSVQxNl81NjVfNTAodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkgICAgICAgXAogICAgQUxQSEFfQkxJVDE2XzUwKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEsIDB4ZjdkZVUpCgojZGVmaW5lIEFMUEhBX0JMSVQxNl81NTVfNTAodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkgICAgICAgXAogICAgQUxQSEFfQkxJVDE2XzUwKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEsIDB4ZmJkZVUpCgojZGVmaW5lIENIT09TRV9CTElUKGJsaXR0ZXIsIGFscGhhLCBmbXQpICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGlmIChhbHBoYSA9PSAyNTUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBzd2l0Y2ggKGZtdC0+Qnl0ZXNQZXJQaXhlbCkgeyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjYXNlIDE6IGJsaXR0ZXIoMSwgVWludDgsIE9QQVFVRV9CTElUKTsgYnJlYWs7ICAgICAgXAogICAgICAgICAgICBjYXNlIDI6IGJsaXR0ZXIoMiwgVWludDgsIE9QQVFVRV9CTElUKTsgYnJlYWs7ICAgICAgXAogICAgICAgICAgICBjYXNlIDM6IGJsaXR0ZXIoMywgVWludDgsIE9QQVFVRV9CTElUKTsgYnJlYWs7ICAgICAgXAogICAgICAgICAgICBjYXNlIDQ6IGJsaXR0ZXIoNCwgVWludDE2LCBPUEFRVUVfQkxJVCk7IGJyZWFrOyAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBzd2l0Y2ggKGZtdC0+Qnl0ZXNQZXJQaXhlbCkgeyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgLyogTm8gOGJwcCBhbHBoYSBibGl0dGluZyAqLyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgc3dpdGNoIChmbXQtPlJtYXNrIHwgZm10LT5HbWFzayB8IGZtdC0+Qm1hc2spIHsgXAogICAgICAgICAgICAgICAgY2FzZSAweGZmZmY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGlmIChmbXQtPkdtYXNrID09IDB4MDdlMCAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICB8fCBmbXQtPlJtYXNrID09IDB4MDdlMCAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICB8fCBmbXQtPkJtYXNrID09IDB4MDdlMCkgeyAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxwaGEgPT0gMTI4KSB7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxpdHRlcigyLCBVaW50OCwgQUxQSEFfQkxJVDE2XzU2NV81MCk7IFwKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVQxNl81NjUpOyBcCiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZ2VuZXJhbDE2OyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBjYXNlIDB4N2ZmZjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgaWYgKGZtdC0+R21hc2sgPT0gMHgwM2UwICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGZtdC0+Um1hc2sgPT0gMHgwM2UwICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGZtdC0+Qm1hc2sgPT0gMHgwM2UwKSB7ICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbHBoYSA9PSAxMjgpIHsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUMTZfNTU1XzUwKTsgXAogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxpdHRlcigyLCBVaW50OCwgQUxQSEFfQkxJVDE2XzU1NSk7IFwKICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBnZW5lcmFsMTY7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGdlbmVyYWwxNjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUX0FOWSk7ICAgICAgICAgIFwKICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGJsaXR0ZXIoMywgVWludDgsIEFMUEhBX0JMSVRfQU5ZKTsgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY2FzZSA0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGlmICgoZm10LT5SbWFzayB8IGZtdC0+R21hc2sgfCBmbXQtPkJtYXNrKSA9PSAweDAwZmZmZmZmIFwKICAgICAgICAgICAgICAgICAgICAmJiAoZm10LT5HbWFzayA9PSAweGZmMDAgfHwgZm10LT5SbWFzayA9PSAweGZmMDAgXAogICAgICAgICAgICAgICAgICAgIHx8IGZtdC0+Qm1hc2sgPT0gMHhmZjAwKSkgeyAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIGlmIChhbHBoYSA9PSAxMjgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICBibGl0dGVyKDQsIFVpbnQxNiwgQUxQSEFfQkxJVDMyXzg4OF81MCk7IFwKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgYmxpdHRlcig0LCBVaW50MTYsIEFMUEhBX0JMSVQzMl84ODgpOyAgIFwKICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBibGl0dGVyKDQsIFVpbnQxNiwgQUxQSEFfQkxJVF9BTlkpOyAgICAgICAgIFwKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCi8qCiAqIFNldCBhIHBpeGVsIHZhbHVlIHVzaW5nIHRoZSBnaXZlbiBmb3JtYXQsIGV4Y2VwdCB0aGF0IHRoZSBhbHBoYSB2YWx1ZSBpcwogKiBwbGFjZWQgaW4gdGhlIHRvcCBieXRlLiBUaGlzIGlzIHRoZSBmb3JtYXQgdXNlZCBmb3IgUkxFIHdpdGggYWxwaGEuCiAqLwojZGVmaW5lIFJMRVBJWEVMX0ZST01fUkdCQShQaXhlbCwgZm10LCByLCBnLCBiLCBhKSAgICAgICAgICAgICAgICAgICAgICBcCnsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIFBpeGVsID0gKChyPj5mbXQtPlJsb3NzKTw8Zm10LT5Sc2hpZnQpfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICgoZz4+Zm10LT5HbG9zcyk8PGZtdC0+R3NoaWZ0KXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgKChiPj5mbXQtPkJsb3NzKTw8Zm10LT5Cc2hpZnQpfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAoYTw8MjQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAp9CgovKgogKiBUaGlzIHRha2VzIGNhcmUgb2YgdGhlIGNhc2Ugd2hlbiB0aGUgc3VyZmFjZSBpcyBjbGlwcGVkIG9uIHRoZSBsZWZ0IGFuZC9vcgogKiByaWdodC4gVG9wIGNsaXBwaW5nIGhhcyBhbHJlYWR5IGJlZW4gdGFrZW4gY2FyZSBvZi4KICovCnN0YXRpYyB2b2lkClJMRUNsaXBCbGl0KGludCB3LCBVaW50OCAqIHNyY2J1ZiwgU0RMX1N1cmZhY2UgKiBzdXJmX2RzdCwKICAgICAgICAgICAgVWludDggKiBkc3RidWYsIFNETF9SZWN0ICogc3JjcmVjdCwgdW5zaWduZWQgYWxwaGEpCnsKICAgIFNETF9QaXhlbEZvcm1hdCAqZm10ID0gc3VyZl9kc3QtPmZvcm1hdDsKCiNkZWZpbmUgUkxFQ0xJUEJMSVQoYnBwLCBUeXBlLCBkb19ibGl0KSAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IGxpbmVjb3VudCA9IHNyY3JlY3QtPmg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IG9mcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IGxlZnQgPSBzcmNyZWN0LT54OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IHJpZ2h0ID0gbGVmdCArIHNyY3JlY3QtPnc7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZHN0YnVmIC09IGxlZnQgKiBicHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZm9yICg7OykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGludCBydW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIG9mcyArPSAqKFR5cGUgKilzcmNidWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHJ1biA9ICgoVHlwZSAqKXNyY2J1ZilbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSAyICogc2l6ZW9mKFR5cGUpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmIChydW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAvKiBjbGlwIHRvIGxlZnQgYW5kIHJpZ2h0IGJvcmRlcnMgKi8gICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBpZiAob2ZzIDwgcmlnaHQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IHJ1bjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgaWYgKGxlZnQgLSBvZnMgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gbGVmdCAtIG9mczsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSBzdGFydDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG5vY29weSAjIyBicHAgIyMgZG9fYmxpdDsgICAgICBcCiAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgc3RhcnRjb2wgPSBvZnMgKyBzdGFydDsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+IHJpZ2h0IC0gc3RhcnRjb2wpICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHJpZ2h0IC0gc3RhcnRjb2w7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgZG9fYmxpdChkc3RidWYgKyBzdGFydGNvbCAqIGJwcCwgc3JjYnVmICsgc3RhcnQgKiBicHAsIFwKICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBicHAsIGFscGhhKTsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIG5vY29weSAjIyBicHAgIyMgZG9fYmxpdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIHNyY2J1ZiArPSBydW4gKiBicHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIG9mcyArPSBydW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSBlbHNlIGlmICghb2ZzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYgKG9mcyA9PSB3KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIG9mcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGRzdGJ1ZiArPSBzdXJmX2RzdC0+cGl0Y2g7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGlmICghLS1saW5lY291bnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCiAgICBDSE9PU0VfQkxJVChSTEVDTElQQkxJVCwgYWxwaGEsIGZtdCk7CgojdW5kZWYgUkxFQ0xJUEJMSVQKCn0KCgovKiBibGl0IGEgY29sb3JrZXllZCBSTEUgc3VyZmFjZSAqLwppbnQgU0RMQ0FMTApTRExfUkxFQmxpdChTRExfU3VyZmFjZSAqIHN1cmZfc3JjLCBTRExfUmVjdCAqIHNyY3JlY3QsCiAgICAgICAgICAgIFNETF9TdXJmYWNlICogc3VyZl9kc3QsIFNETF9SZWN0ICogZHN0cmVjdCkKewogICAgVWludDggKmRzdGJ1ZjsKICAgIFVpbnQ4ICpzcmNidWY7CiAgICBpbnQgeCwgeTsKICAgIGludCB3ID0gc3VyZl9zcmMtPnc7CiAgICB1bnNpZ25lZCBhbHBoYTsKCiAgICAvKiBMb2NrIHRoZSBkZXN0aW5hdGlvbiBpZiBuZWNlc3NhcnkgKi8KICAgIGlmIChTRExfTVVTVExPQ0soc3VyZl9kc3QpKSB7CiAgICAgICAgaWYgKFNETF9Mb2NrU3VyZmFjZShzdXJmX2RzdCkgPCAwKSB7CiAgICAgICAgICAgIHJldHVybiAoLTEpOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBTZXQgdXAgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9pbnRlcnMgKi8KICAgIHggPSBkc3RyZWN0LT54OwogICAgeSA9IGRzdHJlY3QtPnk7CiAgICBkc3RidWYgPSAoVWludDggKikgc3VyZl9kc3QtPnBpeGVscwogICAgICAgICsgeSAqIHN1cmZfZHN0LT5waXRjaCArIHggKiBzdXJmX3NyYy0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOwogICAgc3JjYnVmID0gKFVpbnQ4ICopIHN1cmZfc3JjLT5tYXAtPmRhdGE7CgogICAgewogICAgICAgIC8qIHNraXAgbGluZXMgYXQgdGhlIHRvcCBpZiBuZWNlc3NhcnkgKi8KICAgICAgICBpbnQgdnNraXAgPSBzcmNyZWN0LT55OwogICAgICAgIGludCBvZnMgPSAwOwogICAgICAgIGlmICh2c2tpcCkgewoKI2RlZmluZSBSTEVTS0lQKGJwcCwgVHlwZSkgICAgICAgICAgXAogICAgICAgIGZvcig7OykgeyAgICAgICAgICAgXAogICAgICAgICAgICBpbnQgcnVuOyAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9ICooVHlwZSAqKXNyY2J1ZjsgXAogICAgICAgICAgICBydW4gPSAoKFR5cGUgKilzcmNidWYpWzFdOyAgXAogICAgICAgICAgICBzcmNidWYgKz0gc2l6ZW9mKFR5cGUpICogMjsgXAogICAgICAgICAgICBpZihydW4pIHsgICAgICAgICAgIFwKICAgICAgICAgICAgc3JjYnVmICs9IHJ1biAqIGJwcDsgICAgXAogICAgICAgICAgICBvZnMgKz0gcnVuOyAgICAgXAogICAgICAgICAgICB9IGVsc2UgaWYoIW9mcykgICAgIFwKICAgICAgICAgICAgZ290byBkb25lOyAgICAgIFwKICAgICAgICAgICAgaWYob2ZzID09IHcpIHsgICAgICBcCiAgICAgICAgICAgIG9mcyA9IDA7ICAgICAgICBcCiAgICAgICAgICAgIGlmKCEtLXZza2lwKSAgICAgICAgXAogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgXAogICAgICAgIH0KCiAgICAgICAgICAgIHN3aXRjaCAoc3VyZl9zcmMtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCkgewogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICBSTEVTS0lQKDEsIFVpbnQ4KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICBSTEVTS0lQKDIsIFVpbnQ4KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICBSTEVTS0lQKDMsIFVpbnQ4KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICBSTEVTS0lQKDQsIFVpbnQxNik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKI3VuZGVmIFJMRVNLSVAKCiAgICAgICAgfQogICAgfQoKICAgIGFscGhhID0gc3VyZl9zcmMtPm1hcC0+aW5mby5hOwogICAgLyogaWYgbGVmdCBvciByaWdodCBlZGdlIGNsaXBwaW5nIG5lZWRlZCwgY2FsbCBjbGlwIGJsaXQgKi8KICAgIGlmIChzcmNyZWN0LT54IHx8IHNyY3JlY3QtPncgIT0gc3VyZl9zcmMtPncpIHsKICAgICAgICBSTEVDbGlwQmxpdCh3LCBzcmNidWYsIHN1cmZfZHN0LCBkc3RidWYsIHNyY3JlY3QsIGFscGhhKTsKICAgIH0gZWxzZSB7CiAgICAgICAgU0RMX1BpeGVsRm9ybWF0ICpmbXQgPSBzdXJmX3NyYy0+Zm9ybWF0OwoKI2RlZmluZSBSTEVCTElUKGJwcCwgVHlwZSwgZG9fYmxpdCkgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgbGluZWNvdW50ID0gc3JjcmVjdC0+aDsgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCBvZnMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBmb3IoOzspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgdW5zaWduZWQgcnVuOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIG9mcyArPSAqKFR5cGUgKilzcmNidWY7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgcnVuID0gKChUeXBlICopc3JjYnVmKVsxXTsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgc3JjYnVmICs9IDIgKiBzaXplb2YoVHlwZSk7ICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYocnVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGRvX2JsaXQoZHN0YnVmICsgb2ZzICogYnBwLCBzcmNidWYsIHJ1biwgYnBwLCBhbHBoYSk7IFwKICAgICAgICAgICAgc3JjYnVmICs9IHJ1biAqIGJwcDsgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgKz0gcnVuOyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9IGVsc2UgaWYoIW9mcykgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYob2ZzID09IHcpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIG9mcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGRzdGJ1ZiArPSBzdXJmX2RzdC0+cGl0Y2g7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZighLS1saW5lY291bnQpICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gd2hpbGUoMCkKCiAgICAgICAgQ0hPT1NFX0JMSVQoUkxFQkxJVCwgYWxwaGEsIGZtdCk7CgojdW5kZWYgUkxFQkxJVAogICAgfQoKICBkb25lOgogICAgLyogVW5sb2NrIHRoZSBkZXN0aW5hdGlvbiBpZiBuZWNlc3NhcnkgKi8KICAgIGlmIChTRExfTVVTVExPQ0soc3VyZl9kc3QpKSB7CiAgICAgICAgU0RMX1VubG9ja1N1cmZhY2Uoc3VyZl9kc3QpOwogICAgfQogICAgcmV0dXJuICgwKTsKfQoKI3VuZGVmIE9QQVFVRV9CTElUCgovKgogKiBQZXItcGl4ZWwgYmxpdHRpbmcgbWFjcm9zIGZvciB0cmFuc2x1Y2VudCBwaXhlbHM6CiAqIFRoZXNlIHVzZSB0aGUgc2FtZSB0ZWNobmlxdWVzIGFzIHRoZSBwZXItc3VyZmFjZSBibGl0dGluZyBtYWNyb3MKICovCgovKgogKiBGb3IgMzJicHAgcGl4ZWxzLCB3ZSBoYXZlIG1hZGUgc3VyZSB0aGUgYWxwaGEgaXMgc3RvcmVkIGluIHRoZSB0b3AKICogOCBiaXRzLCBzbyBwcm9jZWVkIGFzIHVzdWFsCiAqLwojZGVmaW5lIEJMSVRfVFJBTlNMXzg4OChzcmMsIGRzdCkgICAgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBVaW50MzIgcyA9IHNyYzsgICAgICAgICAgICAgICAgICAgICBcCiAgICBVaW50MzIgZCA9IGRzdDsgICAgICAgICAgICAgICAgICAgICBcCiAgICB1bnNpZ25lZCBhbHBoYSA9IHMgPj4gMjQ7ICAgICAgICAgICAgICAgXAogICAgVWludDMyIHMxID0gcyAmIDB4ZmYwMGZmOyAgICAgICAgICAgICAgIFwKICAgIFVpbnQzMiBkMSA9IGQgJiAweGZmMDBmZjsgICAgICAgICAgICAgICBcCiAgICBkMSA9IChkMSArICgoczEgLSBkMSkgKiBhbHBoYSA+PiA4KSkgJiAweGZmMDBmZjsgICAgXAogICAgcyAmPSAweGZmMDA7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgZCAmPSAweGZmMDA7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgZCA9IChkICsgKChzIC0gZCkgKiBhbHBoYSA+PiA4KSkgJiAweGZmMDA7ICAgICAgXAogICAgZHN0ID0gZDEgfCBkIHwgMHhmZjAwMDAwMDsgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUoMCkKCi8qCiAqIEZvciAxNmJwcCBwaXhlbHMsIHdlIGhhdmUgc3RvcmVkIHRoZSA1IG1vc3Qgc2lnbmlmaWNhbnQgYWxwaGEgYml0cyBpbgogKiBiaXRzIDUtMTAuIEFzIGJlZm9yZSwgd2UgY2FuIHByb2Nlc3MgYWxsIDMgUkdCIGNvbXBvbmVudHMgYXQgdGhlIHNhbWUgdGltZS4KICovCiNkZWZpbmUgQkxJVF9UUkFOU0xfNTY1KHNyYywgZHN0KSAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICBcCiAgICBVaW50MzIgcyA9IHNyYzsgICAgICAgICAgICAgXAogICAgVWludDMyIGQgPSBkc3Q7ICAgICAgICAgICAgIFwKICAgIHVuc2lnbmVkIGFscGhhID0gKHMgJiAweDNlMCkgPj4gNTsgIFwKICAgIHMgJj0gMHgwN2UwZjgxZjsgICAgICAgICAgICBcCiAgICBkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDdlMGY4MWY7ICAgICBcCiAgICBkICs9IChzIC0gZCkgKiBhbHBoYSA+PiA1OyAgICAgIFwKICAgIGQgJj0gMHgwN2UwZjgxZjsgICAgICAgICAgICBcCiAgICBkc3QgPSAoVWludDE2KShkIHwgZCA+PiAxNik7ICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKI2RlZmluZSBCTElUX1RSQU5TTF81NTUoc3JjLCBkc3QpICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgIFwKICAgIFVpbnQzMiBzID0gc3JjOyAgICAgICAgICAgICBcCiAgICBVaW50MzIgZCA9IGRzdDsgICAgICAgICAgICAgXAogICAgdW5zaWduZWQgYWxwaGEgPSAocyAmIDB4M2UwKSA+PiA1OyAgXAogICAgcyAmPSAweDAzZTA3YzFmOyAgICAgICAgICAgIFwKICAgIGQgPSAoZCB8IGQgPDwgMTYpICYgMHgwM2UwN2MxZjsgICAgIFwKICAgIGQgKz0gKHMgLSBkKSAqIGFscGhhID4+IDU7ICAgICAgXAogICAgZCAmPSAweDAzZTA3YzFmOyAgICAgICAgICAgIFwKICAgIGRzdCA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsgICAgICAgICAgICBcCiAgICB9IHdoaWxlKDApCgovKiB1c2VkIHRvIHNhdmUgdGhlIGRlc3RpbmF0aW9uIGZvcm1hdCBpbiB0aGUgZW5jb2RpbmcuIERlc2lnbmVkIHRvIGJlCiAgIG1hY3JvLWNvbXBhdGlibGUgd2l0aCBTRExfUGl4ZWxGb3JtYXQgYnV0IHdpdGhvdXQgdGhlIHVubmVlZGVkIGZpZWxkcyAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgICBVaW50OCBCeXRlc1BlclBpeGVsOwogICAgVWludDggcGFkZGluZ1szXTsKICAgIFVpbnQzMiBSbWFzazsKICAgIFVpbnQzMiBHbWFzazsKICAgIFVpbnQzMiBCbWFzazsKICAgIFVpbnQzMiBBbWFzazsKICAgIFVpbnQ4IFJsb3NzOwogICAgVWludDggR2xvc3M7CiAgICBVaW50OCBCbG9zczsKICAgIFVpbnQ4IEFsb3NzOwogICAgVWludDggUnNoaWZ0OwogICAgVWludDggR3NoaWZ0OwogICAgVWludDggQnNoaWZ0OwogICAgVWludDggQXNoaWZ0Owp9IFJMRURlc3RGb3JtYXQ7CgovKiBibGl0IGEgcGl4ZWwtYWxwaGEgUkxFIHN1cmZhY2UgY2xpcHBlZCBhdCB0aGUgcmlnaHQgYW5kL29yIGxlZnQgZWRnZXMgKi8Kc3RhdGljIHZvaWQKUkxFQWxwaGFDbGlwQmxpdChpbnQgdywgVWludDggKiBzcmNidWYsIFNETF9TdXJmYWNlICogc3VyZl9kc3QsCiAgICAgICAgICAgICAgICAgVWludDggKiBkc3RidWYsIFNETF9SZWN0ICogc3JjcmVjdCkKewogICAgU0RMX1BpeGVsRm9ybWF0ICpkZiA9IHN1cmZfZHN0LT5mb3JtYXQ7CiAgICAvKgogICAgICogY2xpcHBlZCBibGl0dGVyOiBQdHlwZSBpcyB0aGUgZGVzdGluYXRpb24gcGl4ZWwgdHlwZSwKICAgICAqIEN0eXBlIHRoZSB0cmFuc2x1Y2VudCBjb3VudCB0eXBlLCBhbmQgZG9fYmxlbmQgdGhlIG1hY3JvCiAgICAgKiB0byBibGVuZCBvbmUgcGl4ZWwuCiAgICAgKi8KI2RlZmluZSBSTEVBTFBIQUNMSVBCTElUKFB0eXBlLCBDdHlwZSwgZG9fYmxlbmQpICAgICAgICAgICAgICBcCiAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGludCBsaW5lY291bnQgPSBzcmNyZWN0LT5oOyAgICAgICAgICAgICAgICAgICBcCiAgICBpbnQgbGVmdCA9IHNyY3JlY3QtPng7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgaW50IHJpZ2h0ID0gbGVmdCArIHNyY3JlY3QtPnc7ICAgICAgICAgICAgICAgICAgICBcCiAgICBkc3RidWYgLT0gbGVmdCAqIHNpemVvZihQdHlwZSk7ICAgICAgICAgICAgICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGludCBvZnMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIC8qIGJsaXQgb3BhcXVlIHBpeGVscyBvbiBvbmUgbGluZSAqLyAgICAgICAgICAgICAgXAogICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgdW5zaWduZWQgcnVuOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgb2ZzICs9ICgoQ3R5cGUgKilzcmNidWYpWzBdOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICBydW4gPSAoKEN0eXBlICopc3JjYnVmKVsxXTsgICAgICAgICAgICAgICBcCiAgICAgICAgc3JjYnVmICs9IDIgKiBzaXplb2YoQ3R5cGUpOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpZihydW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAvKiBjbGlwIHRvIGxlZnQgYW5kIHJpZ2h0IGJvcmRlcnMgKi8gICAgICAgICAgXAogICAgICAgICAgICBpbnQgY29mcyA9IG9mczsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpbnQgY3J1biA9IHJ1bjsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihsZWZ0IC0gY29mcyA+IDApIHsgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY3J1biAtPSBsZWZ0IC0gY29mczsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNvZnMgPSBsZWZ0OyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYoY3J1biA+IHJpZ2h0IC0gY29mcykgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNydW4gPSByaWdodCAtIGNvZnM7ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihjcnVuID4gMCkgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBQSVhFTF9DT1BZKGRzdGJ1ZiArIGNvZnMgKiBzaXplb2YoUHR5cGUpLCAgICAgXAogICAgICAgICAgICAgICAgICAgc3JjYnVmICsgKGNvZnMgLSBvZnMpICogc2l6ZW9mKFB0eXBlKSwgXAogICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKWNydW4sIHNpemVvZihQdHlwZSkpOyAgICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSBydW4gKiBzaXplb2YoUHR5cGUpOyAgICAgICAgICAgIFwKICAgICAgICAgICAgb2ZzICs9IHJ1bjsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9IGVsc2UgaWYoIW9mcykgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gd2hpbGUob2ZzIDwgdyk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAvKiBza2lwIHBhZGRpbmcgaWYgbmVjZXNzYXJ5ICovICAgICAgICAgICAgICAgXAogICAgICAgIGlmKHNpemVvZihQdHlwZSkgPT0gMikgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBzcmNidWYgKz0gKHVpbnRwdHJfdClzcmNidWYgJiAyOyAgICAgICAgICAgICAgXAogICAgICAgIC8qIGJsaXQgdHJhbnNsdWNlbnQgcGl4ZWxzIG9uIHRoZSBzYW1lIGxpbmUgKi8gICAgICAgIFwKICAgICAgICBvZnMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHVuc2lnbmVkIHJ1bjsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIG9mcyArPSAoKFVpbnQxNiAqKXNyY2J1ZilbMF07ICAgICAgICAgICAgICAgICBcCiAgICAgICAgcnVuID0gKChVaW50MTYgKilzcmNidWYpWzFdOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICBzcmNidWYgKz0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpZihydW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAvKiBjbGlwIHRvIGxlZnQgYW5kIHJpZ2h0IGJvcmRlcnMgKi8gICAgICAgICAgXAogICAgICAgICAgICBpbnQgY29mcyA9IG9mczsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpbnQgY3J1biA9IHJ1bjsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihsZWZ0IC0gY29mcyA+IDApIHsgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgY3J1biAtPSBsZWZ0IC0gY29mczsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNvZnMgPSBsZWZ0OyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYoY3J1biA+IHJpZ2h0IC0gY29mcykgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGNydW4gPSByaWdodCAtIGNvZnM7ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBpZihjcnVuID4gMCkgeyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBQdHlwZSAqZHN0ID0gKFB0eXBlICopZHN0YnVmICsgY29mczsgICAgICAgICAgXAogICAgICAgICAgICBVaW50MzIgKnNyYyA9IChVaW50MzIgKilzcmNidWYgKyAoY29mcyAtIG9mcyk7ICAgIFwKICAgICAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBjcnVuOyBpKyspICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGRvX2JsZW5kKHNyY1tpXSwgZHN0W2ldKTsgICAgICAgICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSBydW4gKiA0OyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgKz0gcnVuOyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB9IHdoaWxlKG9mcyA8IHcpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgZHN0YnVmICs9IHN1cmZfZHN0LT5waXRjaDsgICAgICAgICAgICAgICAgICAgICBcCiAgICB9IHdoaWxlKC0tbGluZWNvdW50KTsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKICAgIHN3aXRjaCAoZGYtPkJ5dGVzUGVyUGl4ZWwpIHsKICAgIGNhc2UgMjoKICAgICAgICBpZiAoZGYtPkdtYXNrID09IDB4MDdlMCB8fCBkZi0+Um1hc2sgPT0gMHgwN2UwIHx8IGRmLT5CbWFzayA9PSAweDA3ZTApCiAgICAgICAgICAgIFJMRUFMUEhBQ0xJUEJMSVQoVWludDE2LCBVaW50OCwgQkxJVF9UUkFOU0xfNTY1KTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIFJMRUFMUEhBQ0xJUEJMSVQoVWludDE2LCBVaW50OCwgQkxJVF9UUkFOU0xfNTU1KTsKICAgICAgICBicmVhazsKICAgIGNhc2UgNDoKICAgICAgICBSTEVBTFBIQUNMSVBCTElUKFVpbnQzMiwgVWludDE2LCBCTElUX1RSQU5TTF84ODgpOwogICAgICAgIGJyZWFrOwogICAgfQp9CgovKiBibGl0IGEgcGl4ZWwtYWxwaGEgUkxFIHN1cmZhY2UgKi8KaW50IFNETENBTEwKU0RMX1JMRUFscGhhQmxpdChTRExfU3VyZmFjZSAqIHN1cmZfc3JjLCBTRExfUmVjdCAqIHNyY3JlY3QsCiAgICAgICAgICAgICAgICAgU0RMX1N1cmZhY2UgKiBzdXJmX2RzdCwgU0RMX1JlY3QgKiBkc3RyZWN0KQp7CiAgICBpbnQgeCwgeTsKICAgIGludCB3ID0gc3VyZl9zcmMtPnc7CiAgICBVaW50OCAqc3JjYnVmLCAqZHN0YnVmOwogICAgU0RMX1BpeGVsRm9ybWF0ICpkZiA9IHN1cmZfZHN0LT5mb3JtYXQ7CgogICAgLyogTG9jayB0aGUgZGVzdGluYXRpb24gaWYgbmVjZXNzYXJ5ICovCiAgICBpZiAoU0RMX01VU1RMT0NLKHN1cmZfZHN0KSkgewogICAgICAgIGlmIChTRExfTG9ja1N1cmZhY2Uoc3VyZl9kc3QpIDwgMCkgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgfQoKICAgIHggPSBkc3RyZWN0LT54OwogICAgeSA9IGRzdHJlY3QtPnk7CiAgICBkc3RidWYgPSAoVWludDggKikgc3VyZl9kc3QtPnBpeGVscyArIHkgKiBzdXJmX2RzdC0+cGl0Y2ggKyB4ICogZGYtPkJ5dGVzUGVyUGl4ZWw7CiAgICBzcmNidWYgPSAoVWludDggKikgc3VyZl9zcmMtPm1hcC0+ZGF0YSArIHNpemVvZihSTEVEZXN0Rm9ybWF0KTsKCiAgICB7CiAgICAgICAgLyogc2tpcCBsaW5lcyBhdCB0aGUgdG9wIGlmIG5lY2Vzc2FyeSAqLwogICAgICAgIGludCB2c2tpcCA9IHNyY3JlY3QtPnk7CiAgICAgICAgaWYgKHZza2lwKSB7CiAgICAgICAgICAgIGludCBvZnM7CiAgICAgICAgICAgIGlmIChkZi0+Qnl0ZXNQZXJQaXhlbCA9PSAyKSB7CiAgICAgICAgICAgICAgICAvKiB0aGUgMTYvMzIgaW50ZXJsZWF2ZWQgZm9ybWF0ICovCiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgLyogc2tpcCBvcGFxdWUgbGluZSAqLwogICAgICAgICAgICAgICAgICAgIG9mcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICBpbnQgcnVuOwogICAgICAgICAgICAgICAgICAgICAgICBvZnMgKz0gc3JjYnVmWzBdOwogICAgICAgICAgICAgICAgICAgICAgICBydW4gPSBzcmNidWZbMV07CiAgICAgICAgICAgICAgICAgICAgICAgIHNyY2J1ZiArPSAyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNidWYgKz0gMiAqIHJ1bjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mcyArPSBydW47CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW9mcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChvZnMgPCB3KTsKCiAgICAgICAgICAgICAgICAgICAgLyogc2tpcCBwYWRkaW5nICovCiAgICAgICAgICAgICAgICAgICAgc3JjYnVmICs9ICh1aW50cHRyX3QpIHNyY2J1ZiAmIDI7CgogICAgICAgICAgICAgICAgICAgIC8qIHNraXAgdHJhbnNsdWNlbnQgbGluZSAqLwogICAgICAgICAgICAgICAgICAgIG9mcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICBpbnQgcnVuOwogICAgICAgICAgICAgICAgICAgICAgICBvZnMgKz0gKChVaW50MTYgKikgc3JjYnVmKVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgcnVuID0gKChVaW50MTYgKikgc3JjYnVmKVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgc3JjYnVmICs9IDQgKiAocnVuICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG9mcyArPSBydW47CiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAob2ZzIDwgdyk7CiAgICAgICAgICAgICAgICB9IHdoaWxlICgtLXZza2lwKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8qIHRoZSAzMi8zMiBpbnRlcmxlYXZlZCBmb3JtYXQgKi8KICAgICAgICAgICAgICAgIHZza2lwIDw8PSAxOyAgICAvKiBvcGFxdWUgYW5kIHRyYW5zbHVjZW50IGhhdmUgc2FtZSBmb3JtYXQgKi8KICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICBvZnMgPSAwOwogICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJ1bjsKICAgICAgICAgICAgICAgICAgICAgICAgb2ZzICs9ICgoVWludDE2ICopIHNyY2J1ZilbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1biA9ICgoVWludDE2ICopIHNyY2J1ZilbMV07CiAgICAgICAgICAgICAgICAgICAgICAgIHNyY2J1ZiArPSA0OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNidWYgKz0gNCAqIHJ1bjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mcyArPSBydW47CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW9mcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChvZnMgPCB3KTsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tdnNraXApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qIGlmIGxlZnQgb3IgcmlnaHQgZWRnZSBjbGlwcGluZyBuZWVkZWQsIGNhbGwgY2xpcCBibGl0ICovCiAgICBpZiAoc3JjcmVjdC0+eCB8fCBzcmNyZWN0LT53ICE9IHN1cmZfc3JjLT53KSB7CiAgICAgICAgUkxFQWxwaGFDbGlwQmxpdCh3LCBzcmNidWYsIHN1cmZfZHN0LCBkc3RidWYsIHNyY3JlY3QpOwogICAgfSBlbHNlIHsKCiAgICAgICAgLyoKICAgICAgICAgKiBub24tY2xpcHBlZCBibGl0dGVyLiBQdHlwZSBpcyB0aGUgZGVzdGluYXRpb24gcGl4ZWwgdHlwZSwKICAgICAgICAgKiBDdHlwZSB0aGUgdHJhbnNsdWNlbnQgY291bnQgdHlwZSwgYW5kIGRvX2JsZW5kIHRoZQogICAgICAgICAqIG1hY3JvIHRvIGJsZW5kIG9uZSBwaXhlbC4KICAgICAgICAgKi8KI2RlZmluZSBSTEVBTFBIQUJMSVQoUHR5cGUsIEN0eXBlLCBkb19ibGVuZCkgICAgICAgICAgICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50IGxpbmVjb3VudCA9IHNyY3JlY3QtPmg7ICAgICAgICAgICAgICAgICAgXAogICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnQgb2ZzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIC8qIGJsaXQgb3BhcXVlIHBpeGVscyBvbiBvbmUgbGluZSAqLyAgICAgICAgICAgICBcCiAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB1bnNpZ25lZCBydW47ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIG9mcyArPSAoKEN0eXBlICopc3JjYnVmKVswXTsgICAgICAgICAgICAgXAogICAgICAgICAgICBydW4gPSAoKEN0eXBlICopc3JjYnVmKVsxXTsgICAgICAgICAgICAgIFwKICAgICAgICAgICAgc3JjYnVmICs9IDIgKiBzaXplb2YoQ3R5cGUpOyAgICAgICAgICAgICBcCiAgICAgICAgICAgIGlmKHJ1bikgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgUElYRUxfQ09QWShkc3RidWYgKyBvZnMgKiBzaXplb2YoUHR5cGUpLCBzcmNidWYsIFwKICAgICAgICAgICAgICAgICAgIHJ1biwgc2l6ZW9mKFB0eXBlKSk7ICAgICAgICAgIFwKICAgICAgICAgICAgc3JjYnVmICs9IHJ1biAqIHNpemVvZihQdHlwZSk7ICAgICAgICAgICBcCiAgICAgICAgICAgIG9mcyArPSBydW47ICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9IGVsc2UgaWYoIW9mcykgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGdvdG8gZG9uZTsgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gd2hpbGUob2ZzIDwgdyk7ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgLyogc2tpcCBwYWRkaW5nIGlmIG5lY2Vzc2FyeSAqLyAgICAgICAgICAgICAgXAogICAgICAgIGlmKHNpemVvZihQdHlwZSkgPT0gMikgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBzcmNidWYgKz0gKHVpbnRwdHJfdClzcmNidWYgJiAyOyAgICAgICAgICAgICBcCiAgICAgICAgLyogYmxpdCB0cmFuc2x1Y2VudCBwaXhlbHMgb24gdGhlIHNhbWUgbGluZSAqLyAgICAgICBcCiAgICAgICAgb2ZzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgdW5zaWduZWQgcnVuOyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgKz0gKChVaW50MTYgKilzcmNidWYpWzBdOyAgICAgICAgICAgIFwKICAgICAgICAgICAgcnVuID0gKChVaW50MTYgKilzcmNidWYpWzFdOyAgICAgICAgICAgICBcCiAgICAgICAgICAgIHNyY2J1ZiArPSA0OyAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgaWYocnVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBQdHlwZSAqZHN0ID0gKFB0eXBlICopZHN0YnVmICsgb2ZzOyAgICAgIFwKICAgICAgICAgICAgdW5zaWduZWQgaTsgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IHJ1bjsgaSsrKSB7ICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBVaW50MzIgc3JjID0gKihVaW50MzIgKilzcmNidWY7ICAgICAgXAogICAgICAgICAgICAgICAgZG9fYmxlbmQoc3JjLCAqZHN0KTsgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgc3JjYnVmICs9IDQ7ICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBkc3QrKzsgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICBvZnMgKz0gcnVuOyAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgfSB3aGlsZShvZnMgPCB3KTsgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBkc3RidWYgKz0gc3VyZl9kc3QtPnBpdGNoOyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIH0gd2hpbGUoLS1saW5lY291bnQpOyAgICAgICAgICAgICAgICAgICAgXAogICAgfSB3aGlsZSgwKQoKICAgICAgICBzd2l0Y2ggKGRmLT5CeXRlc1BlclBpeGVsKSB7CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBpZiAoZGYtPkdtYXNrID09IDB4MDdlMCB8fCBkZi0+Um1hc2sgPT0gMHgwN2UwCiAgICAgICAgICAgICAgICB8fCBkZi0+Qm1hc2sgPT0gMHgwN2UwKQogICAgICAgICAgICAgICAgUkxFQUxQSEFCTElUKFVpbnQxNiwgVWludDgsIEJMSVRfVFJBTlNMXzU2NSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIFJMRUFMUEhBQkxJVChVaW50MTYsIFVpbnQ4LCBCTElUX1RSQU5TTF81NTUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgIFJMRUFMUEhBQkxJVChVaW50MzIsIFVpbnQxNiwgQkxJVF9UUkFOU0xfODg4KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICBkb25lOgogICAgLyogVW5sb2NrIHRoZSBkZXN0aW5hdGlvbiBpZiBuZWNlc3NhcnkgKi8KICAgIGlmIChTRExfTVVTVExPQ0soc3VyZl9kc3QpKSB7CiAgICAgICAgU0RMX1VubG9ja1N1cmZhY2Uoc3VyZl9kc3QpOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qCiAqIEF1eGlsaWFyeSBmdW5jdGlvbnM6CiAqIFRoZSBlbmNvZGluZyBmdW5jdGlvbnMgdGFrZSAzMmJwcCByZ2IgKyBhLCBhbmQKICogcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIHRvIHRoZSBkZXN0aW5hdGlvbi4KICogVGhlIGRlY29kaW5nIGZ1bmN0aW9ucyBjb3B5IHRvIDMyYnBwIHJnYiArIGEsIGFuZAogKiByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgZnJvbSB0aGUgc291cmNlLgogKiBUaGVzZSBhcmUgb25seSB1c2VkIGluIHRoZSBlbmNvZGVyIGFuZCB1bi1STEUgY29kZSBhbmQgYXJlIHRoZXJlZm9yZSBub3QKICogaGlnaGx5IG9wdGltaXNlZC4KICovCgovKiBlbmNvZGUgMzJicHAgcmdiICsgYSBpbnRvIDE2YnBwIHJnYiwgbG9zaW5nIGFscGhhICovCnN0YXRpYyBpbnQKY29weV9vcGFxdWVfMTYodm9pZCAqZHN0LCBVaW50MzIgKiBzcmMsIGludCBuLAogICAgICAgICAgICAgICBTRExfUGl4ZWxGb3JtYXQgKiBzZm10LCBTRExfUGl4ZWxGb3JtYXQgKiBkZm10KQp7CiAgICBpbnQgaTsKICAgIFVpbnQxNiAqZCA9IGRzdDsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICB1bnNpZ25lZCByLCBnLCBiOwogICAgICAgIFJHQl9GUk9NX1BJWEVMKCpzcmMsIHNmbXQsIHIsIGcsIGIpOwogICAgICAgIFBJWEVMX0ZST01fUkdCKCpkLCBkZm10LCByLCBnLCBiKTsKICAgICAgICBzcmMrKzsKICAgICAgICBkKys7CiAgICB9CiAgICByZXR1cm4gbiAqIDI7Cn0KCi8qIGRlY29kZSBvcGFxdWUgcGl4ZWxzIGZyb20gMTZicHAgdG8gMzJicHAgcmdiICsgYSAqLwpzdGF0aWMgaW50CnVuY29weV9vcGFxdWVfMTYoVWludDMyICogZHN0LCB2b2lkICpzcmMsIGludCBuLAogICAgICAgICAgICAgICAgIFJMRURlc3RGb3JtYXQgKiBzZm10LCBTRExfUGl4ZWxGb3JtYXQgKiBkZm10KQp7CiAgICBpbnQgaTsKICAgIFVpbnQxNiAqcyA9IHNyYzsKICAgIHVuc2lnbmVkIGFscGhhID0gZGZtdC0+QW1hc2sgPyAyNTUgOiAwOwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHVuc2lnbmVkIHIsIGcsIGI7CiAgICAgICAgUkdCX0ZST01fUElYRUwoKnMsIHNmbXQsIHIsIGcsIGIpOwogICAgICAgIFBJWEVMX0ZST01fUkdCQSgqZHN0LCBkZm10LCByLCBnLCBiLCBhbHBoYSk7CiAgICAgICAgcysrOwogICAgICAgIGRzdCsrOwogICAgfQogICAgcmV0dXJuIG4gKiAyOwp9CgoKCi8qIGVuY29kZSAzMmJwcCByZ2IgKyBhIGludG8gMzJicHAgRzBSQUIgZm9ybWF0IGZvciBibGl0dGluZyBpbnRvIDU2NSAqLwpzdGF0aWMgaW50CmNvcHlfdHJhbnNsXzU2NSh2b2lkICpkc3QsIFVpbnQzMiAqIHNyYywgaW50IG4sCiAgICAgICAgICAgICAgICBTRExfUGl4ZWxGb3JtYXQgKiBzZm10LCBTRExfUGl4ZWxGb3JtYXQgKiBkZm10KQp7CiAgICBpbnQgaTsKICAgIFVpbnQzMiAqZCA9IGRzdDsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICB1bnNpZ25lZCByLCBnLCBiLCBhOwogICAgICAgIFVpbnQxNiBwaXg7CiAgICAgICAgUkdCQV9GUk9NXzg4ODgoKnNyYywgc2ZtdCwgciwgZywgYiwgYSk7CiAgICAgICAgUElYRUxfRlJPTV9SR0IocGl4LCBkZm10LCByLCBnLCBiKTsKICAgICAgICAqZCA9ICgocGl4ICYgMHg3ZTApIDw8IDE2KSB8IChwaXggJiAweGY4MWYpIHwgKChhIDw8IDIpICYgMHg3ZTApOwogICAgICAgIHNyYysrOwogICAgICAgIGQrKzsKICAgIH0KICAgIHJldHVybiBuICogNDsKfQoKLyogZW5jb2RlIDMyYnBwIHJnYiArIGEgaW50byAzMmJwcCBHMFJBQiBmb3JtYXQgZm9yIGJsaXR0aW5nIGludG8gNTU1ICovCnN0YXRpYyBpbnQKY29weV90cmFuc2xfNTU1KHZvaWQgKmRzdCwgVWludDMyICogc3JjLCBpbnQgbiwKICAgICAgICAgICAgICAgIFNETF9QaXhlbEZvcm1hdCAqIHNmbXQsIFNETF9QaXhlbEZvcm1hdCAqIGRmbXQpCnsKICAgIGludCBpOwogICAgVWludDMyICpkID0gZHN0OwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHVuc2lnbmVkIHIsIGcsIGIsIGE7CiAgICAgICAgVWludDE2IHBpeDsKICAgICAgICBSR0JBX0ZST01fODg4OCgqc3JjLCBzZm10LCByLCBnLCBiLCBhKTsKICAgICAgICBQSVhFTF9GUk9NX1JHQihwaXgsIGRmbXQsIHIsIGcsIGIpOwogICAgICAgICpkID0gKChwaXggJiAweDNlMCkgPDwgMTYpIHwgKHBpeCAmIDB4ZmMxZikgfCAoKGEgPDwgMikgJiAweDNlMCk7CiAgICAgICAgc3JjKys7CiAgICAgICAgZCsrOwogICAgfQogICAgcmV0dXJuIG4gKiA0Owp9CgovKiBkZWNvZGUgdHJhbnNsdWNlbnQgcGl4ZWxzIGZyb20gMzJicHAgR09SQUIgdG8gMzJicHAgcmdiICsgYSAqLwpzdGF0aWMgaW50CnVuY29weV90cmFuc2xfMTYoVWludDMyICogZHN0LCB2b2lkICpzcmMsIGludCBuLAogICAgICAgICAgICAgICAgIFJMRURlc3RGb3JtYXQgKiBzZm10LCBTRExfUGl4ZWxGb3JtYXQgKiBkZm10KQp7CiAgICBpbnQgaTsKICAgIFVpbnQzMiAqcyA9IHNyYzsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICB1bnNpZ25lZCByLCBnLCBiLCBhOwogICAgICAgIFVpbnQzMiBwaXggPSAqcysrOwogICAgICAgIGEgPSAocGl4ICYgMHgzZTApID4+IDI7CiAgICAgICAgcGl4ID0gKHBpeCAmIH4weDNlMCkgfCBwaXggPj4gMTY7CiAgICAgICAgUkdCX0ZST01fUElYRUwocGl4LCBzZm10LCByLCBnLCBiKTsKICAgICAgICBQSVhFTF9GUk9NX1JHQkEoKmRzdCwgZGZtdCwgciwgZywgYiwgYSk7CiAgICAgICAgZHN0Kys7CiAgICB9CiAgICByZXR1cm4gbiAqIDQ7Cn0KCi8qIGVuY29kZSAzMmJwcCByZ2JhIGludG8gMzJicHAgcmdiYSwga2VlcGluZyBhbHBoYSAoZHVhbCBwdXJwb3NlKSAqLwpzdGF0aWMgaW50CmNvcHlfMzIodm9pZCAqZHN0LCBVaW50MzIgKiBzcmMsIGludCBuLAogICAgICAgIFNETF9QaXhlbEZvcm1hdCAqIHNmbXQsIFNETF9QaXhlbEZvcm1hdCAqIGRmbXQpCnsKICAgIGludCBpOwogICAgVWludDMyICpkID0gZHN0OwogICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHVuc2lnbmVkIHIsIGcsIGIsIGE7CiAgICAgICAgUkdCQV9GUk9NXzg4ODgoKnNyYywgc2ZtdCwgciwgZywgYiwgYSk7CiAgICAgICAgUkxFUElYRUxfRlJPTV9SR0JBKCpkLCBkZm10LCByLCBnLCBiLCBhKTsKICAgICAgICBkKys7CiAgICAgICAgc3JjKys7CiAgICB9CiAgICByZXR1cm4gbiAqIDQ7Cn0KCi8qIGRlY29kZSAzMmJwcCByZ2JhIGludG8gMzJicHAgcmdiYSwga2VlcGluZyBhbHBoYSAoZHVhbCBwdXJwb3NlKSAqLwpzdGF0aWMgaW50CnVuY29weV8zMihVaW50MzIgKiBkc3QsIHZvaWQgKnNyYywgaW50IG4sCiAgICAgICAgICBSTEVEZXN0Rm9ybWF0ICogc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICogZGZtdCkKewogICAgaW50IGk7CiAgICBVaW50MzIgKnMgPSBzcmM7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgdW5zaWduZWQgciwgZywgYiwgYTsKICAgICAgICBVaW50MzIgcGl4ZWwgPSAqcysrOwogICAgICAgIFJHQl9GUk9NX1BJWEVMKHBpeGVsLCBzZm10LCByLCBnLCBiKTsKICAgICAgICBhID0gcGl4ZWwgPj4gMjQ7CiAgICAgICAgUElYRUxfRlJPTV9SR0JBKCpkc3QsIGRmbXQsIHIsIGcsIGIsIGEpOwogICAgICAgIGRzdCsrOwogICAgfQogICAgcmV0dXJuIG4gKiA0Owp9CgojZGVmaW5lIElTT1BBUVVFKHBpeGVsLCBmbXQpICgoKChwaXhlbCkgJiBmbXQtPkFtYXNrKSA+PiBmbXQtPkFzaGlmdCkgPT0gMjU1KQoKI2RlZmluZSBJU1RSQU5TTChwaXhlbCwgZm10KSAgICBcCiAgICAoKHVuc2lnbmVkKSgoKChwaXhlbCkgJiBmbXQtPkFtYXNrKSA+PiBmbXQtPkFzaGlmdCkgLSAxVSkgPCAyNTRVKQoKLyogY29udmVydCBzdXJmYWNlIHRvIGJlIHF1aWNrbHkgYWxwaGEtYmxpdHRhYmxlIG9udG8gZGVzdCwgaWYgcG9zc2libGUgKi8Kc3RhdGljIGludApSTEVBbHBoYVN1cmZhY2UoU0RMX1N1cmZhY2UgKiBzdXJmYWNlKQp7CiAgICBTRExfU3VyZmFjZSAqZGVzdDsKICAgIFNETF9QaXhlbEZvcm1hdCAqZGY7CiAgICBpbnQgbWF4c2l6ZSA9IDA7CiAgICBpbnQgbWF4X29wYXF1ZV9ydW47CiAgICBpbnQgbWF4X3RyYW5zbF9ydW4gPSA2NTUzNTsKICAgIHVuc2lnbmVkIG1hc2tzdW07CiAgICBVaW50OCAqcmxlYnVmLCAqZHN0OwogICAgaW50ICgqY29weV9vcGFxdWUpICh2b2lkICosIFVpbnQzMiAqLCBpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIFNETF9QaXhlbEZvcm1hdCAqLCBTRExfUGl4ZWxGb3JtYXQgKik7CiAgICBpbnQgKCpjb3B5X3RyYW5zbCkgKHZvaWQgKiwgVWludDMyICosIGludCwKICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1BpeGVsRm9ybWF0ICosIFNETF9QaXhlbEZvcm1hdCAqKTsKCiAgICBkZXN0ID0gc3VyZmFjZS0+bWFwLT5kc3Q7CiAgICBpZiAoIWRlc3QpCiAgICAgICAgcmV0dXJuIC0xOwogICAgZGYgPSBkZXN0LT5mb3JtYXQ7CiAgICBpZiAoc3VyZmFjZS0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgIT0gMzIpCiAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgLyogb25seSAzMmJwcCBzb3VyY2Ugc3VwcG9ydGVkICovCgogICAgLyogZmluZCBvdXQgd2hldGhlciB0aGUgZGVzdGluYXRpb24gaXMgb25lIHdlIHN1cHBvcnQsCiAgICAgICBhbmQgZGV0ZXJtaW5lIHRoZSBtYXggc2l6ZSBvZiB0aGUgZW5jb2RlZCByZXN1bHQgKi8KICAgIG1hc2tzdW0gPSBkZi0+Um1hc2sgfCBkZi0+R21hc2sgfCBkZi0+Qm1hc2s7CiAgICBzd2l0Y2ggKGRmLT5CeXRlc1BlclBpeGVsKSB7CiAgICBjYXNlIDI6CiAgICAgICAgLyogMTZicHA6IG9ubHkgc3VwcG9ydCA1NjUgYW5kIDU1NSBmb3JtYXRzICovCiAgICAgICAgc3dpdGNoIChtYXNrc3VtKSB7CiAgICAgICAgY2FzZSAweGZmZmY6CiAgICAgICAgICAgIGlmIChkZi0+R21hc2sgPT0gMHgwN2UwCiAgICAgICAgICAgICAgICB8fCBkZi0+Um1hc2sgPT0gMHgwN2UwIHx8IGRmLT5CbWFzayA9PSAweDA3ZTApIHsKICAgICAgICAgICAgICAgIGNvcHlfb3BhcXVlID0gY29weV9vcGFxdWVfMTY7CiAgICAgICAgICAgICAgICBjb3B5X3RyYW5zbCA9IGNvcHlfdHJhbnNsXzU2NTsKICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHg3ZmZmOgogICAgICAgICAgICBpZiAoZGYtPkdtYXNrID09IDB4MDNlMAogICAgICAgICAgICAgICAgfHwgZGYtPlJtYXNrID09IDB4MDNlMCB8fCBkZi0+Qm1hc2sgPT0gMHgwM2UwKSB7CiAgICAgICAgICAgICAgICBjb3B5X29wYXF1ZSA9IGNvcHlfb3BhcXVlXzE2OwogICAgICAgICAgICAgICAgY29weV90cmFuc2wgPSBjb3B5X3RyYW5zbF81NTU7CiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIG1heF9vcGFxdWVfcnVuID0gMjU1OyAgIC8qIHJ1bnMgc3RvcmVkIGFzIGJ5dGVzICovCgogICAgICAgIC8qIHdvcnN0IGNhc2UgaXMgYWx0ZXJuYXRpbmcgb3BhcXVlIGFuZCB0cmFuc2x1Y2VudCBwaXhlbHMsCiAgICAgICAgICAgd2l0aCByb29tIGZvciBhbGlnbm1lbnQgcGFkZGluZyBiZXR3ZWVuIGxpbmVzICovCiAgICAgICAgbWF4c2l6ZSA9IHN1cmZhY2UtPmggKiAoMiArICg0ICsgMikgKiAoc3VyZmFjZS0+dyArIDEpKSArIDI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDQ6CiAgICAgICAgaWYgKG1hc2tzdW0gIT0gMHgwMGZmZmZmZikKICAgICAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAvKiByZXF1aXJlcyB1bnVzZWQgaGlnaCBieXRlICovCiAgICAgICAgY29weV9vcGFxdWUgPSBjb3B5XzMyOwogICAgICAgIGNvcHlfdHJhbnNsID0gY29weV8zMjsKICAgICAgICBtYXhfb3BhcXVlX3J1biA9IDI1NTsgICAvKiBydW5zIHN0b3JlZCBhcyBzaG9ydCBpbnRzICovCgogICAgICAgIC8qIHdvcnN0IGNhc2UgaXMgYWx0ZXJuYXRpbmcgb3BhcXVlIGFuZCB0cmFuc2x1Y2VudCBwaXhlbHMgKi8KICAgICAgICBtYXhzaXplID0gc3VyZmFjZS0+aCAqIDIgKiA0ICogKHN1cmZhY2UtPncgKyAxKSArIDQ7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgIC8qIGFueXRoaW5nIGVsc2UgdW5zdXBwb3J0ZWQgcmlnaHQgbm93ICovCiAgICB9CgogICAgbWF4c2l6ZSArPSBzaXplb2YoUkxFRGVzdEZvcm1hdCk7CiAgICBybGVidWYgPSAoVWludDggKikgU0RMX21hbGxvYyhtYXhzaXplKTsKICAgIGlmICghcmxlYnVmKSB7CiAgICAgICAgcmV0dXJuIFNETF9PdXRPZk1lbW9yeSgpOwogICAgfQogICAgewogICAgICAgIC8qIHNhdmUgdGhlIGRlc3RpbmF0aW9uIGZvcm1hdCBzbyB3ZSBjYW4gdW5kbyB0aGUgZW5jb2RpbmcgbGF0ZXIgKi8KICAgICAgICBSTEVEZXN0Rm9ybWF0ICpyID0gKFJMRURlc3RGb3JtYXQgKikgcmxlYnVmOwogICAgICAgIHItPkJ5dGVzUGVyUGl4ZWwgPSBkZi0+Qnl0ZXNQZXJQaXhlbDsKICAgICAgICByLT5SbWFzayA9IGRmLT5SbWFzazsKICAgICAgICByLT5HbWFzayA9IGRmLT5HbWFzazsKICAgICAgICByLT5CbWFzayA9IGRmLT5CbWFzazsKICAgICAgICByLT5BbWFzayA9IGRmLT5BbWFzazsKICAgICAgICByLT5SbG9zcyA9IGRmLT5SbG9zczsKICAgICAgICByLT5HbG9zcyA9IGRmLT5HbG9zczsKICAgICAgICByLT5CbG9zcyA9IGRmLT5CbG9zczsKICAgICAgICByLT5BbG9zcyA9IGRmLT5BbG9zczsKICAgICAgICByLT5Sc2hpZnQgPSBkZi0+UnNoaWZ0OwogICAgICAgIHItPkdzaGlmdCA9IGRmLT5Hc2hpZnQ7CiAgICAgICAgci0+QnNoaWZ0ID0gZGYtPkJzaGlmdDsKICAgICAgICByLT5Bc2hpZnQgPSBkZi0+QXNoaWZ0OwogICAgfQogICAgZHN0ID0gcmxlYnVmICsgc2l6ZW9mKFJMRURlc3RGb3JtYXQpOwoKICAgIC8qIERvIHRoZSBhY3R1YWwgZW5jb2RpbmcgKi8KICAgIHsKICAgICAgICBpbnQgeCwgeTsKICAgICAgICBpbnQgaCA9IHN1cmZhY2UtPmgsIHcgPSBzdXJmYWNlLT53OwogICAgICAgIFNETF9QaXhlbEZvcm1hdCAqc2YgPSBzdXJmYWNlLT5mb3JtYXQ7CiAgICAgICAgVWludDMyICpzcmMgPSAoVWludDMyICopIHN1cmZhY2UtPnBpeGVsczsKICAgICAgICBVaW50OCAqbGFzdGxpbmUgPSBkc3Q7ICAvKiBlbmQgb2YgbGFzdCBub24tYmxhbmsgbGluZSAqLwoKICAgICAgICAvKiBvcGFxdWUgY291bnRzIGFyZSA4IG9yIDE2IGJpdHMsIGRlcGVuZGluZyBvbiB0YXJnZXQgZGVwdGggKi8KI2RlZmluZSBBRERfT1BBUVVFX0NPVU5UUyhuLCBtKSAgICAgICAgIFwKICAgIGlmKGRmLT5CeXRlc1BlclBpeGVsID09IDQpIHsgICAgICAgIFwKICAgICAgICAoKFVpbnQxNiAqKWRzdClbMF0gPSBuOyAgICAgXAogICAgICAgICgoVWludDE2ICopZHN0KVsxXSA9IG07ICAgICBcCiAgICAgICAgZHN0ICs9IDQ7ICAgICAgICAgICAgICAgXAogICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgXAogICAgICAgIGRzdFswXSA9IG47ICAgICAgICAgICAgIFwKICAgICAgICBkc3RbMV0gPSBtOyAgICAgICAgICAgICBcCiAgICAgICAgZHN0ICs9IDI7ICAgICAgICAgICAgICAgXAogICAgfQoKICAgICAgICAvKiB0cmFuc2x1Y2VudCBjb3VudHMgYXJlIGFsd2F5cyAxNiBiaXQgKi8KI2RlZmluZSBBRERfVFJBTlNMX0NPVU5UUyhuLCBtKSAgICAgXAogICAgKCgoVWludDE2ICopZHN0KVswXSA9IG4sICgoVWludDE2ICopZHN0KVsxXSA9IG0sIGRzdCArPSA0KQoKICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CiAgICAgICAgICAgIGludCBydW5zdGFydCwgc2tpcHN0YXJ0OwogICAgICAgICAgICBpbnQgYmxhbmtsaW5lID0gMDsKICAgICAgICAgICAgLyogRmlyc3QgZW5jb2RlIGFsbCBvcGFxdWUgcGl4ZWxzIG9mIGEgc2NhbiBsaW5lICovCiAgICAgICAgICAgIHggPSAwOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBpbnQgcnVuLCBza2lwLCBsZW47CiAgICAgICAgICAgICAgICBza2lwc3RhcnQgPSB4OwogICAgICAgICAgICAgICAgd2hpbGUgKHggPCB3ICYmICFJU09QQVFVRShzcmNbeF0sIHNmKSkKICAgICAgICAgICAgICAgICAgICB4Kys7CiAgICAgICAgICAgICAgICBydW5zdGFydCA9IHg7CiAgICAgICAgICAgICAgICB3aGlsZSAoeCA8IHcgJiYgSVNPUEFRVUUoc3JjW3hdLCBzZikpCiAgICAgICAgICAgICAgICAgICAgeCsrOwogICAgICAgICAgICAgICAgc2tpcCA9IHJ1bnN0YXJ0IC0gc2tpcHN0YXJ0OwogICAgICAgICAgICAgICAgaWYgKHNraXAgPT0gdykKICAgICAgICAgICAgICAgICAgICBibGFua2xpbmUgPSAxOwogICAgICAgICAgICAgICAgcnVuID0geCAtIHJ1bnN0YXJ0OwogICAgICAgICAgICAgICAgd2hpbGUgKHNraXAgPiBtYXhfb3BhcXVlX3J1bikgewogICAgICAgICAgICAgICAgICAgIEFERF9PUEFRVUVfQ09VTlRTKG1heF9vcGFxdWVfcnVuLCAwKTsKICAgICAgICAgICAgICAgICAgICBza2lwIC09IG1heF9vcGFxdWVfcnVuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGVuID0gTUlOKHJ1biwgbWF4X29wYXF1ZV9ydW4pOwogICAgICAgICAgICAgICAgQUREX09QQVFVRV9DT1VOVFMoc2tpcCwgbGVuKTsKICAgICAgICAgICAgICAgIGRzdCArPSBjb3B5X29wYXF1ZShkc3QsIHNyYyArIHJ1bnN0YXJ0LCBsZW4sIHNmLCBkZik7CiAgICAgICAgICAgICAgICBydW5zdGFydCArPSBsZW47CiAgICAgICAgICAgICAgICBydW4gLT0gbGVuOwogICAgICAgICAgICAgICAgd2hpbGUgKHJ1bikgewogICAgICAgICAgICAgICAgICAgIGxlbiA9IE1JTihydW4sIG1heF9vcGFxdWVfcnVuKTsKICAgICAgICAgICAgICAgICAgICBBRERfT1BBUVVFX0NPVU5UUygwLCBsZW4pOwogICAgICAgICAgICAgICAgICAgIGRzdCArPSBjb3B5X29wYXF1ZShkc3QsIHNyYyArIHJ1bnN0YXJ0LCBsZW4sIHNmLCBkZik7CiAgICAgICAgICAgICAgICAgICAgcnVuc3RhcnQgKz0gbGVuOwogICAgICAgICAgICAgICAgICAgIHJ1biAtPSBsZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gd2hpbGUgKHggPCB3KTsKCiAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgbmV4dCBvdXRwdXQgYWRkcmVzcyBpcyAzMi1iaXQgYWxpZ25lZCAqLwogICAgICAgICAgICBkc3QgKz0gKHVpbnRwdHJfdCkgZHN0ICYgMjsKCiAgICAgICAgICAgIC8qIE5leHQsIGVuY29kZSBhbGwgdHJhbnNsdWNlbnQgcGl4ZWxzIG9mIHRoZSBzYW1lIHNjYW4gbGluZSAqLwogICAgICAgICAgICB4ID0gMDsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgaW50IHJ1biwgc2tpcCwgbGVuOwogICAgICAgICAgICAgICAgc2tpcHN0YXJ0ID0geDsKICAgICAgICAgICAgICAgIHdoaWxlICh4IDwgdyAmJiAhSVNUUkFOU0woc3JjW3hdLCBzZikpCiAgICAgICAgICAgICAgICAgICAgeCsrOwogICAgICAgICAgICAgICAgcnVuc3RhcnQgPSB4OwogICAgICAgICAgICAgICAgd2hpbGUgKHggPCB3ICYmIElTVFJBTlNMKHNyY1t4XSwgc2YpKQogICAgICAgICAgICAgICAgICAgIHgrKzsKICAgICAgICAgICAgICAgIHNraXAgPSBydW5zdGFydCAtIHNraXBzdGFydDsKICAgICAgICAgICAgICAgIGJsYW5rbGluZSAmPSAoc2tpcCA9PSB3KTsKICAgICAgICAgICAgICAgIHJ1biA9IHggLSBydW5zdGFydDsKICAgICAgICAgICAgICAgIHdoaWxlIChza2lwID4gbWF4X3RyYW5zbF9ydW4pIHsKICAgICAgICAgICAgICAgICAgICBBRERfVFJBTlNMX0NPVU5UUyhtYXhfdHJhbnNsX3J1biwgMCk7CiAgICAgICAgICAgICAgICAgICAgc2tpcCAtPSBtYXhfdHJhbnNsX3J1bjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxlbiA9IE1JTihydW4sIG1heF90cmFuc2xfcnVuKTsKICAgICAgICAgICAgICAgIEFERF9UUkFOU0xfQ09VTlRTKHNraXAsIGxlbik7CiAgICAgICAgICAgICAgICBkc3QgKz0gY29weV90cmFuc2woZHN0LCBzcmMgKyBydW5zdGFydCwgbGVuLCBzZiwgZGYpOwogICAgICAgICAgICAgICAgcnVuc3RhcnQgKz0gbGVuOwogICAgICAgICAgICAgICAgcnVuIC09IGxlbjsKICAgICAgICAgICAgICAgIHdoaWxlIChydW4pIHsKICAgICAgICAgICAgICAgICAgICBsZW4gPSBNSU4ocnVuLCBtYXhfdHJhbnNsX3J1bik7CiAgICAgICAgICAgICAgICAgICAgQUREX1RSQU5TTF9DT1VOVFMoMCwgbGVuKTsKICAgICAgICAgICAgICAgICAgICBkc3QgKz0gY29weV90cmFuc2woZHN0LCBzcmMgKyBydW5zdGFydCwgbGVuLCBzZiwgZGYpOwogICAgICAgICAgICAgICAgICAgIHJ1bnN0YXJ0ICs9IGxlbjsKICAgICAgICAgICAgICAgICAgICBydW4gLT0gbGVuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFibGFua2xpbmUpCiAgICAgICAgICAgICAgICAgICAgbGFzdGxpbmUgPSBkc3Q7CiAgICAgICAgICAgIH0gd2hpbGUgKHggPCB3KTsKCiAgICAgICAgICAgIHNyYyArPSBzdXJmYWNlLT5waXRjaCA+PiAyOwogICAgICAgIH0KICAgICAgICBkc3QgPSBsYXN0bGluZTsgICAgICAgICAvKiBiYWNrIHVwIHBhc3QgdHJhaWxpbmcgYmxhbmsgbGluZXMgKi8KICAgICAgICBBRERfT1BBUVVFX0NPVU5UUygwLCAwKTsKICAgIH0KCiN1bmRlZiBBRERfT1BBUVVFX0NPVU5UUwojdW5kZWYgQUREX1RSQU5TTF9DT1VOVFMKCiAgICAvKiBOb3cgdGhhdCB3ZSBoYXZlIGl0IGVuY29kZWQsIHJlbGVhc2UgdGhlIG9yaWdpbmFsIHBpeGVscyAqLwogICAgaWYgKCEoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfUFJFQUxMT0MpKSB7CiAgICAgICAgU0RMX1NJTURGcmVlKHN1cmZhY2UtPnBpeGVscyk7CiAgICAgICAgc3VyZmFjZS0+cGl4ZWxzID0gTlVMTDsKICAgICAgICBzdXJmYWNlLT5mbGFncyAmPSB+U0RMX1NJTURfQUxJR05FRDsKICAgIH0KCiAgICAvKiByZWFsbG9jIHRoZSBidWZmZXIgdG8gcmVsZWFzZSB1bnVzZWQgbWVtb3J5ICovCiAgICB7CiAgICAgICAgVWludDggKnAgPSBTRExfcmVhbGxvYyhybGVidWYsIGRzdCAtIHJsZWJ1Zik7CiAgICAgICAgaWYgKCFwKQogICAgICAgICAgICBwID0gcmxlYnVmOwogICAgICAgIHN1cmZhY2UtPm1hcC0+ZGF0YSA9IHA7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBVaW50MzIKZ2V0cGl4XzgoY29uc3QgVWludDggKiBzcmNidWYpCnsKICAgIHJldHVybiAqc3JjYnVmOwp9CgpzdGF0aWMgVWludDMyCmdldHBpeF8xNihjb25zdCBVaW50OCAqIHNyY2J1ZikKewogICAgcmV0dXJuICooY29uc3QgVWludDE2ICopIHNyY2J1ZjsKfQoKc3RhdGljIFVpbnQzMgpnZXRwaXhfMjQoY29uc3QgVWludDggKiBzcmNidWYpCnsKI2lmIFNETF9CWVRFT1JERVIgPT0gU0RMX0xJTF9FTkRJQU4KICAgIHJldHVybiBzcmNidWZbMF0gKyAoc3JjYnVmWzFdIDw8IDgpICsgKHNyY2J1ZlsyXSA8PCAxNik7CiNlbHNlCiAgICByZXR1cm4gKHNyY2J1ZlswXSA8PCAxNikgKyAoc3JjYnVmWzFdIDw8IDgpICsgc3JjYnVmWzJdOwojZW5kaWYKfQoKc3RhdGljIFVpbnQzMgpnZXRwaXhfMzIoY29uc3QgVWludDggKiBzcmNidWYpCnsKICAgIHJldHVybiAqKGNvbnN0IFVpbnQzMiAqKSBzcmNidWY7Cn0KCnR5cGVkZWYgVWludDMyKCpnZXRwaXhfZnVuYykgKGNvbnN0IFVpbnQ4ICopOwoKc3RhdGljIGNvbnN0IGdldHBpeF9mdW5jIGdldHBpeGVzWzRdID0gewogICAgZ2V0cGl4XzgsIGdldHBpeF8xNiwgZ2V0cGl4XzI0LCBnZXRwaXhfMzIKfTsKCnN0YXRpYyBpbnQKUkxFQ29sb3JrZXlTdXJmYWNlKFNETF9TdXJmYWNlICogc3VyZmFjZSkKewogICAgVWludDggKnJsZWJ1ZiwgKmRzdDsKICAgIGludCBtYXhuOwogICAgaW50IHk7CiAgICBVaW50OCAqc3JjYnVmLCAqbGFzdGxpbmU7CiAgICBpbnQgbWF4c2l6ZSA9IDA7CiAgICBjb25zdCBpbnQgYnBwID0gc3VyZmFjZS0+Zm9ybWF0LT5CeXRlc1BlclBpeGVsOwogICAgZ2V0cGl4X2Z1bmMgZ2V0cGl4OwogICAgVWludDMyIGNrZXksIHJnYm1hc2s7CiAgICBpbnQgdywgaDsKCiAgICAvKiBjYWxjdWxhdGUgdGhlIHdvcnN0IGNhc2Ugc2l6ZSBmb3IgdGhlIGNvbXByZXNzZWQgc3VyZmFjZSAqLwogICAgc3dpdGNoIChicHApIHsKICAgIGNhc2UgMToKICAgICAgICAvKiB3b3JzdCBjYXNlIGlzIGFsdGVybmF0aW5nIG9wYXF1ZSBhbmQgdHJhbnNwYXJlbnQgcGl4ZWxzLAogICAgICAgICAgIHN0YXJ0aW5nIHdpdGggYW4gb3BhcXVlIHBpeGVsICovCiAgICAgICAgbWF4c2l6ZSA9IHN1cmZhY2UtPmggKiAzICogKHN1cmZhY2UtPncgLyAyICsgMSkgKyAyOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAyOgogICAgY2FzZSAzOgogICAgICAgIC8qIHdvcnN0IGNhc2UgaXMgc29saWQgcnVucywgYXQgbW9zdCAyNTUgcGl4ZWxzIHdpZGUgKi8KICAgICAgICBtYXhzaXplID0gc3VyZmFjZS0+aCAqICgyICogKHN1cmZhY2UtPncgLyAyNTUgKyAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3VyZmFjZS0+dyAqIGJwcCkgKyAyOwogICAgICAgIGJyZWFrOwogICAgY2FzZSA0OgogICAgICAgIC8qIHdvcnN0IGNhc2UgaXMgc29saWQgcnVucywgYXQgbW9zdCA2NTUzNSBwaXhlbHMgd2lkZSAqLwogICAgICAgIG1heHNpemUgPSBzdXJmYWNlLT5oICogKDQgKiAoc3VyZmFjZS0+dyAvIDY1NTM1ICsgMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN1cmZhY2UtPncgKiA0KSArIDQ7CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgcmxlYnVmID0gKFVpbnQ4ICopIFNETF9tYWxsb2MobWF4c2l6ZSk7CiAgICBpZiAocmxlYnVmID09IE5VTEwpIHsKICAgICAgICByZXR1cm4gU0RMX091dE9mTWVtb3J5KCk7CiAgICB9CgogICAgLyogU2V0IHVwIHRoZSBjb252ZXJzaW9uICovCiAgICBzcmNidWYgPSAoVWludDggKikgc3VyZmFjZS0+cGl4ZWxzOwogICAgbWF4biA9IGJwcCA9PSA0ID8gNjU1MzUgOiAyNTU7CiAgICBkc3QgPSBybGVidWY7CiAgICByZ2JtYXNrID0gfnN1cmZhY2UtPmZvcm1hdC0+QW1hc2s7CiAgICBja2V5ID0gc3VyZmFjZS0+bWFwLT5pbmZvLmNvbG9ya2V5ICYgcmdibWFzazsKICAgIGxhc3RsaW5lID0gZHN0OwogICAgZ2V0cGl4ID0gZ2V0cGl4ZXNbYnBwIC0gMV07CiAgICB3ID0gc3VyZmFjZS0+dzsKICAgIGggPSBzdXJmYWNlLT5oOwoKI2RlZmluZSBBRERfQ09VTlRTKG4sIG0pICAgICAgICAgICAgXAogICAgaWYoYnBwID09IDQpIHsgICAgICAgICAgICAgIFwKICAgICAgICAoKFVpbnQxNiAqKWRzdClbMF0gPSBuOyAgICAgXAogICAgICAgICgoVWludDE2ICopZHN0KVsxXSA9IG07ICAgICBcCiAgICAgICAgZHN0ICs9IDQ7ICAgICAgICAgICAgICAgXAogICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgXAogICAgICAgIGRzdFswXSA9IG47ICAgICAgICAgICAgIFwKICAgICAgICBkc3RbMV0gPSBtOyAgICAgICAgICAgICBcCiAgICAgICAgZHN0ICs9IDI7ICAgICAgICAgICAgICAgXAogICAgfQoKICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKICAgICAgICBpbnQgeCA9IDA7CiAgICAgICAgaW50IGJsYW5rbGluZSA9IDA7CiAgICAgICAgZG8gewogICAgICAgICAgICBpbnQgcnVuLCBza2lwLCBsZW47CiAgICAgICAgICAgIGludCBydW5zdGFydDsKICAgICAgICAgICAgaW50IHNraXBzdGFydCA9IHg7CgogICAgICAgICAgICAvKiBmaW5kIHJ1biBvZiB0cmFuc3BhcmVudCwgdGhlbiBvcGFxdWUgcGl4ZWxzICovCiAgICAgICAgICAgIHdoaWxlICh4IDwgdyAmJiAoZ2V0cGl4KHNyY2J1ZiArIHggKiBicHApICYgcmdibWFzaykgPT0gY2tleSkKICAgICAgICAgICAgICAgIHgrKzsKICAgICAgICAgICAgcnVuc3RhcnQgPSB4OwogICAgICAgICAgICB3aGlsZSAoeCA8IHcgJiYgKGdldHBpeChzcmNidWYgKyB4ICogYnBwKSAmIHJnYm1hc2spICE9IGNrZXkpCiAgICAgICAgICAgICAgICB4Kys7CiAgICAgICAgICAgIHNraXAgPSBydW5zdGFydCAtIHNraXBzdGFydDsKICAgICAgICAgICAgaWYgKHNraXAgPT0gdykKICAgICAgICAgICAgICAgIGJsYW5rbGluZSA9IDE7CiAgICAgICAgICAgIHJ1biA9IHggLSBydW5zdGFydDsKCiAgICAgICAgICAgIC8qIGVuY29kZSBzZWdtZW50ICovCiAgICAgICAgICAgIHdoaWxlIChza2lwID4gbWF4bikgewogICAgICAgICAgICAgICAgQUREX0NPVU5UUyhtYXhuLCAwKTsKICAgICAgICAgICAgICAgIHNraXAgLT0gbWF4bjsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZW4gPSBNSU4ocnVuLCBtYXhuKTsKICAgICAgICAgICAgQUREX0NPVU5UUyhza2lwLCBsZW4pOwogICAgICAgICAgICBTRExfbWVtY3B5KGRzdCwgc3JjYnVmICsgcnVuc3RhcnQgKiBicHAsIGxlbiAqIGJwcCk7CiAgICAgICAgICAgIGRzdCArPSBsZW4gKiBicHA7CiAgICAgICAgICAgIHJ1biAtPSBsZW47CiAgICAgICAgICAgIHJ1bnN0YXJ0ICs9IGxlbjsKICAgICAgICAgICAgd2hpbGUgKHJ1bikgewogICAgICAgICAgICAgICAgbGVuID0gTUlOKHJ1biwgbWF4bik7CiAgICAgICAgICAgICAgICBBRERfQ09VTlRTKDAsIGxlbik7CiAgICAgICAgICAgICAgICBTRExfbWVtY3B5KGRzdCwgc3JjYnVmICsgcnVuc3RhcnQgKiBicHAsIGxlbiAqIGJwcCk7CiAgICAgICAgICAgICAgICBkc3QgKz0gbGVuICogYnBwOwogICAgICAgICAgICAgICAgcnVuc3RhcnQgKz0gbGVuOwogICAgICAgICAgICAgICAgcnVuIC09IGxlbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWJsYW5rbGluZSkKICAgICAgICAgICAgICAgIGxhc3RsaW5lID0gZHN0OwogICAgICAgIH0gd2hpbGUgKHggPCB3KTsKCiAgICAgICAgc3JjYnVmICs9IHN1cmZhY2UtPnBpdGNoOwogICAgfQogICAgZHN0ID0gbGFzdGxpbmU7ICAgICAgICAgICAgIC8qIGJhY2sgdXAgYmFzdCB0cmFpbGluZyBibGFuayBsaW5lcyAqLwogICAgQUREX0NPVU5UUygwLCAwKTsKCiN1bmRlZiBBRERfQ09VTlRTCgogICAgLyogTm93IHRoYXQgd2UgaGF2ZSBpdCBlbmNvZGVkLCByZWxlYXNlIHRoZSBvcmlnaW5hbCBwaXhlbHMgKi8KICAgIGlmICghKHN1cmZhY2UtPmZsYWdzICYgU0RMX1BSRUFMTE9DKSkgewogICAgICAgIFNETF9TSU1ERnJlZShzdXJmYWNlLT5waXhlbHMpOwogICAgICAgIHN1cmZhY2UtPnBpeGVscyA9IE5VTEw7CiAgICAgICAgc3VyZmFjZS0+ZmxhZ3MgJj0gflNETF9TSU1EX0FMSUdORUQ7CiAgICB9CgogICAgLyogcmVhbGxvYyB0aGUgYnVmZmVyIHRvIHJlbGVhc2UgdW51c2VkIG1lbW9yeSAqLwogICAgewogICAgICAgIC8qIElmIHJlYWxsb2MgcmV0dXJucyBOVUxMLCB0aGUgb3JpZ2luYWwgYmxvY2sgaXMgbGVmdCBpbnRhY3QgKi8KICAgICAgICBVaW50OCAqcCA9IFNETF9yZWFsbG9jKHJsZWJ1ZiwgZHN0IC0gcmxlYnVmKTsKICAgICAgICBpZiAoIXApCiAgICAgICAgICAgIHAgPSBybGVidWY7CiAgICAgICAgc3VyZmFjZS0+bWFwLT5kYXRhID0gcDsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKaW50ClNETF9STEVTdXJmYWNlKFNETF9TdXJmYWNlICogc3VyZmFjZSkKewogICAgaW50IGZsYWdzOwoKICAgIC8qIENsZWFyIGFueSBwcmV2aW91cyBSTEUgY29udmVyc2lvbiAqLwogICAgaWYgKChzdXJmYWNlLT5mbGFncyAmIFNETF9STEVBQ0NFTCkgPT0gU0RMX1JMRUFDQ0VMKSB7CiAgICAgICAgU0RMX1VuUkxFU3VyZmFjZShzdXJmYWNlLCAxKTsKICAgIH0KCiAgICAvKiBXZSBkb24ndCBzdXBwb3J0IFJMRSBlbmNvZGluZyBvZiBiaXRtYXBzICovCiAgICBpZiAoc3VyZmFjZS0+Zm9ybWF0LT5CaXRzUGVyUGl4ZWwgPCA4KSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIC8qIE1ha2Ugc3VyZSB0aGUgcGl4ZWxzIGFyZSBhdmFpbGFibGUgKi8KICAgIGlmICghc3VyZmFjZS0+cGl4ZWxzKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIC8qIElmIHdlIGRvbid0IGhhdmUgY29sb3JrZXkgb3IgYmxlbmRpbmcsIG5vdGhpbmcgdG8gZG8uLi4gKi8KICAgIGZsYWdzID0gc3VyZmFjZS0+bWFwLT5pbmZvLmZsYWdzOwogICAgaWYgKCEoZmxhZ3MgJiAoU0RMX0NPUFlfQ09MT1JLRVkgfCBTRExfQ09QWV9CTEVORCkpKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIC8qIFBhc3Mgb24gY29tYmluYXRpb25zIG5vdCBzdXBwb3J0ZWQgKi8KICAgIGlmICgoZmxhZ3MgJiBTRExfQ09QWV9NT0RVTEFURV9DT0xPUikgfHwKICAgICAgICAoKGZsYWdzICYgU0RMX0NPUFlfTU9EVUxBVEVfQUxQSEEpICYmIHN1cmZhY2UtPmZvcm1hdC0+QW1hc2spIHx8CiAgICAgICAgKGZsYWdzICYgKFNETF9DT1BZX0FERCB8IFNETF9DT1BZX01PRCkpIHx8CiAgICAgICAgKGZsYWdzICYgU0RMX0NPUFlfTkVBUkVTVCkpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgLyogRW5jb2RlIGFuZCBzZXQgdXAgdGhlIGJsaXQgKi8KICAgIGlmICghc3VyZmFjZS0+Zm9ybWF0LT5BbWFzayB8fCAhKGZsYWdzICYgU0RMX0NPUFlfQkxFTkQpKSB7CiAgICAgICAgaWYgKCFzdXJmYWNlLT5tYXAtPmlkZW50aXR5KSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgaWYgKFJMRUNvbG9ya2V5U3VyZmFjZShzdXJmYWNlKSA8IDApIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBzdXJmYWNlLT5tYXAtPmJsaXQgPSBTRExfUkxFQmxpdDsKICAgICAgICBzdXJmYWNlLT5tYXAtPmluZm8uZmxhZ3MgfD0gU0RMX0NPUFlfUkxFX0NPTE9SS0VZOwogICAgfSBlbHNlIHsKICAgICAgICBpZiAoUkxFQWxwaGFTdXJmYWNlKHN1cmZhY2UpIDwgMCkgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIHN1cmZhY2UtPm1hcC0+YmxpdCA9IFNETF9STEVBbHBoYUJsaXQ7CiAgICAgICAgc3VyZmFjZS0+bWFwLT5pbmZvLmZsYWdzIHw9IFNETF9DT1BZX1JMRV9BTFBIQUtFWTsKICAgIH0KCiAgICAvKiBUaGUgc3VyZmFjZSBpcyBub3cgYWNjZWxlcmF0ZWQgKi8KICAgIHN1cmZhY2UtPmZsYWdzIHw9IFNETF9STEVBQ0NFTDsKCiAgICByZXR1cm4gKDApOwp9CgovKgogKiBVbi1STEUgYSBzdXJmYWNlIHdpdGggcGl4ZWwgYWxwaGEKICogVGhpcyBtYXkgbm90IGdpdmUgYmFjayBleGFjdGx5IHRoZSBpbWFnZSBiZWZvcmUgUkxFLWVuY29kaW5nOyBhbGwKICogY29tcGxldGVseSB0cmFuc3BhcmVudCBwaXhlbHMgd2lsbCBiZSBsb3N0LCBhbmQgY29sb3IgYW5kIGFscGhhIGRlcHRoCiAqIG1heSBoYXZlIGJlZW4gcmVkdWNlZCAod2hlbiBlbmNvZGluZyBmb3IgMTZicHAgdGFyZ2V0cykuCiAqLwpzdGF0aWMgU0RMX2Jvb2wKVW5STEVBbHBoYShTRExfU3VyZmFjZSAqIHN1cmZhY2UpCnsKICAgIFVpbnQ4ICpzcmNidWY7CiAgICBVaW50MzIgKmRzdDsKICAgIFNETF9QaXhlbEZvcm1hdCAqc2YgPSBzdXJmYWNlLT5mb3JtYXQ7CiAgICBSTEVEZXN0Rm9ybWF0ICpkZiA9IHN1cmZhY2UtPm1hcC0+ZGF0YTsKICAgIGludCAoKnVuY29weV9vcGFxdWUpIChVaW50MzIgKiwgdm9pZCAqLCBpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgUkxFRGVzdEZvcm1hdCAqLCBTRExfUGl4ZWxGb3JtYXQgKik7CiAgICBpbnQgKCp1bmNvcHlfdHJhbnNsKSAoVWludDMyICosIHZvaWQgKiwgaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgIFJMRURlc3RGb3JtYXQgKiwgU0RMX1BpeGVsRm9ybWF0ICopOwogICAgaW50IHcgPSBzdXJmYWNlLT53OwogICAgaW50IGJwcCA9IGRmLT5CeXRlc1BlclBpeGVsOwoKICAgIGlmIChicHAgPT0gMikgewogICAgICAgIHVuY29weV9vcGFxdWUgPSB1bmNvcHlfb3BhcXVlXzE2OwogICAgICAgIHVuY29weV90cmFuc2wgPSB1bmNvcHlfdHJhbnNsXzE2OwogICAgfSBlbHNlIHsKICAgICAgICB1bmNvcHlfb3BhcXVlID0gdW5jb3B5X3RyYW5zbCA9IHVuY29weV8zMjsKICAgIH0KCiAgICBzdXJmYWNlLT5waXhlbHMgPSBTRExfU0lNREFsbG9jKHN1cmZhY2UtPmggKiBzdXJmYWNlLT5waXRjaCk7CiAgICBpZiAoIXN1cmZhY2UtPnBpeGVscykgewogICAgICAgIHJldHVybiAoU0RMX0ZBTFNFKTsKICAgIH0KICAgIHN1cmZhY2UtPmZsYWdzIHw9IFNETF9TSU1EX0FMSUdORUQ7CiAgICAvKiBmaWxsIGJhY2tncm91bmQgd2l0aCB0cmFuc3BhcmVudCBwaXhlbHMgKi8KICAgIFNETF9tZW1zZXQoc3VyZmFjZS0+cGl4ZWxzLCAwLCBzdXJmYWNlLT5oICogc3VyZmFjZS0+cGl0Y2gpOwoKICAgIGRzdCA9IHN1cmZhY2UtPnBpeGVsczsKICAgIHNyY2J1ZiA9IChVaW50OCAqKSAoZGYgKyAxKTsKICAgIGZvciAoOzspIHsKICAgICAgICAvKiBjb3B5IG9wYXF1ZSBwaXhlbHMgKi8KICAgICAgICBpbnQgb2ZzID0gMDsKICAgICAgICBkbyB7CiAgICAgICAgICAgIHVuc2lnbmVkIHJ1bjsKICAgICAgICAgICAgaWYgKGJwcCA9PSAyKSB7CiAgICAgICAgICAgICAgICBvZnMgKz0gc3JjYnVmWzBdOwogICAgICAgICAgICAgICAgcnVuID0gc3JjYnVmWzFdOwogICAgICAgICAgICAgICAgc3JjYnVmICs9IDI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBvZnMgKz0gKChVaW50MTYgKikgc3JjYnVmKVswXTsKICAgICAgICAgICAgICAgIHJ1biA9ICgoVWludDE2ICopIHNyY2J1ZilbMV07CiAgICAgICAgICAgICAgICBzcmNidWYgKz0gNDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocnVuKSB7CiAgICAgICAgICAgICAgICBzcmNidWYgKz0gdW5jb3B5X29wYXF1ZShkc3QgKyBvZnMsIHNyY2J1ZiwgcnVuLCBkZiwgc2YpOwogICAgICAgICAgICAgICAgb2ZzICs9IHJ1bjsKICAgICAgICAgICAgfSBlbHNlIGlmICghb2ZzKSB7CiAgICAgICAgICAgICAgICBnb3RvIGVuZF9mdW5jdGlvbjsKICAgICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKG9mcyA8IHcpOwoKICAgICAgICAvKiBza2lwIHBhZGRpbmcgaWYgbmVlZGVkICovCiAgICAgICAgaWYgKGJwcCA9PSAyKQogICAgICAgICAgICBzcmNidWYgKz0gKHVpbnRwdHJfdCkgc3JjYnVmICYgMjsKCiAgICAgICAgLyogY29weSB0cmFuc2x1Y2VudCBwaXhlbHMgKi8KICAgICAgICBvZnMgPSAwOwogICAgICAgIGRvIHsKICAgICAgICAgICAgdW5zaWduZWQgcnVuOwogICAgICAgICAgICBvZnMgKz0gKChVaW50MTYgKikgc3JjYnVmKVswXTsKICAgICAgICAgICAgcnVuID0gKChVaW50MTYgKikgc3JjYnVmKVsxXTsKICAgICAgICAgICAgc3JjYnVmICs9IDQ7CiAgICAgICAgICAgIGlmIChydW4pIHsKICAgICAgICAgICAgICAgIHNyY2J1ZiArPSB1bmNvcHlfdHJhbnNsKGRzdCArIG9mcywgc3JjYnVmLCBydW4sIGRmLCBzZik7CiAgICAgICAgICAgICAgICBvZnMgKz0gcnVuOwogICAgICAgICAgICB9CiAgICAgICAgfSB3aGlsZSAob2ZzIDwgdyk7CiAgICAgICAgZHN0ICs9IHN1cmZhY2UtPnBpdGNoID4+IDI7CiAgICB9CgplbmRfZnVuY3Rpb246CiAgICByZXR1cm4gKFNETF9UUlVFKTsKfQoKdm9pZApTRExfVW5STEVTdXJmYWNlKFNETF9TdXJmYWNlICogc3VyZmFjZSwgaW50IHJlY29kZSkKewogICAgaWYgKHN1cmZhY2UtPmZsYWdzICYgU0RMX1JMRUFDQ0VMKSB7CiAgICAgICAgc3VyZmFjZS0+ZmxhZ3MgJj0gflNETF9STEVBQ0NFTDsKCiAgICAgICAgaWYgKHJlY29kZSAmJiAhKHN1cmZhY2UtPmZsYWdzICYgU0RMX1BSRUFMTE9DKSkgewogICAgICAgICAgICBpZiAoc3VyZmFjZS0+bWFwLT5pbmZvLmZsYWdzICYgU0RMX0NPUFlfUkxFX0NPTE9SS0VZKSB7CiAgICAgICAgICAgICAgICBTRExfUmVjdCBmdWxsOwoKICAgICAgICAgICAgICAgIC8qIHJlLWNyZWF0ZSB0aGUgb3JpZ2luYWwgc3VyZmFjZSAqLwogICAgICAgICAgICAgICAgc3VyZmFjZS0+cGl4ZWxzID0gU0RMX1NJTURBbGxvYyhzdXJmYWNlLT5oICogc3VyZmFjZS0+cGl0Y2gpOwogICAgICAgICAgICAgICAgaWYgKCFzdXJmYWNlLT5waXhlbHMpIHsKICAgICAgICAgICAgICAgICAgICAvKiBPaCBjcmFwLi4uICovCiAgICAgICAgICAgICAgICAgICAgc3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX1JMRUFDQ0VMOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN1cmZhY2UtPmZsYWdzIHw9IFNETF9TSU1EX0FMSUdORUQ7CgogICAgICAgICAgICAgICAgLyogZmlsbCBpdCB3aXRoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yICovCiAgICAgICAgICAgICAgICBTRExfRmlsbFJlY3Qoc3VyZmFjZSwgTlVMTCwgc3VyZmFjZS0+bWFwLT5pbmZvLmNvbG9ya2V5KTsKCiAgICAgICAgICAgICAgICAvKiBub3cgcmVuZGVyIHRoZSBlbmNvZGVkIHN1cmZhY2UgKi8KICAgICAgICAgICAgICAgIGZ1bGwueCA9IGZ1bGwueSA9IDA7CiAgICAgICAgICAgICAgICBmdWxsLncgPSBzdXJmYWNlLT53OwogICAgICAgICAgICAgICAgZnVsbC5oID0gc3VyZmFjZS0+aDsKICAgICAgICAgICAgICAgIFNETF9STEVCbGl0KHN1cmZhY2UsICZmdWxsLCBzdXJmYWNlLCAmZnVsbCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIVVuUkxFQWxwaGEoc3VyZmFjZSkpIHsKICAgICAgICAgICAgICAgICAgICAvKiBPaCBjcmFwLi4uICovCiAgICAgICAgICAgICAgICAgICAgc3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX1JMRUFDQ0VMOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzdXJmYWNlLT5tYXAtPmluZm8uZmxhZ3MgJj0KICAgICAgICAgICAgfihTRExfQ09QWV9STEVfQ09MT1JLRVkgfCBTRExfQ09QWV9STEVfQUxQSEFLRVkpOwoKICAgICAgICBTRExfZnJlZShzdXJmYWNlLT5tYXAtPmRhdGEpOwogICAgICAgIHN1cmZhY2UtPm1hcC0+ZGF0YSA9IE5VTEw7CiAgICB9Cn0KCi8qIHZpOiBzZXQgdHM9NCBzdz00IGV4cGFuZHRhYjogKi8K