I2luY2x1ZGUgInN0dWIuaCIgLy8gdGhpcyBiYWQgcGF0aCBpcyBtYWRlIHZhbGlkIGJ5IGEgYC1JIGluY2x1ZGVgIGNsYW5nIGFyZwoKI3ByYWdtYSBvbmNlCgojZGVmaW5lIFRFU1RNQUNSTwoKI2RlZmluZSBURVNUTUFDUk9fSU5URUdFUiA0MgojZGVmaW5lIFRFU1RNQUNST19TVFJJTkcgIkhlbGxvIFByZXByb2Nlc3NvciEiCiNkZWZpbmUgVEVTVE1BQ1JPX1NUUklOR19FWFBBTkRFRCBURVNUTUFDUk9fU1RSSU5HCiNkZWZpbmUgVEVTVE1BQ1JPX0NVU1RPTUlOVEtJTkRfUEFUSCAxMjMKCi8vIFRoZSBmb2xsb3dpbmcgdHdvIG1hY3JvcyBhcmUgcGFyc2VkIHRoZSBzYW1lIGJ5IGNleHByLCBidXQgYXJlIHNlbWFudGljYWxseQovLyBkaWZmZXJlbnQuCiNkZWZpbmUgVEVTVE1BQ1JPX05PTkZVTkNUSU9OQUwgKFRFU1RNQUNST19JTlRFR0VSKQojZGVmaW5lIFRFU1RNQUNST19GVU5DVElPTkFMX0VNUFRZKFRFU1RNQUNST19JTlRFR0VSKQojZGVmaW5lIFRFU1RNQUNST19GVU5DVElPTkFMX05PTkVNUFRZKFRFU1RNQUNST19JTlRFR0VSKS1URVNUTUFDUk9fSU5URUdFUgojZGVmaW5lIFRFU1RNQUNST19GVU5DVElPTkFMX1RPS0VOSVpFRCggIGEsIGIgICAsYyxkLGUgICApIGEvYiBjICAgIGQgIyMgZQojZGVmaW5lIFRFU1RNQUNST19GVU5DVElPTkFMX1NQTElUKCAgYSwgXAogICAgICAgIGIpIGIsXAogICAgICAgIGEKLy8jZGVmaW5lIFRFU1RNQUNST19JTlZBTElEKCJzdHJpbmciKSAvLyBBIGNvbmZvcm1pbmcgcHJlcHJvY2Vzc29yIHJlamVjdHMgdGhpcwojZGVmaW5lIFRFU1RNQUNST19TVFJJTkdfRVhQUiAoInN0cmluZyIpCiNkZWZpbmUgVEVTVE1BQ1JPX1NUUklOR19GVU5DX05PTl9VVEY4KHgpICh4ICL//yIpIC8qIGludmFsaWQgVVRGLTggb24gcHVycG9zZSAqLwoKZW51bSB7CiAgTVlfQU5OT1lJTkdfTUFDUk8gPQojZGVmaW5lIE1ZX0FOTk9ZSU5HX01BQ1JPIDEKICAgIE1ZX0FOTk9ZSU5HX01BQ1JPLAp9OwoKY2xhc3MgVGVzdCB7CiAgaW50IG1faW50OwogIGRvdWJsZSBtX2RvdWJsZTsKcHVibGljOgogIHN0YXRpYyBjb25zdCBjaGFyKiBuYW1lKCk7CiAgVGVzdChpbnQgZm9vKTsKICBUZXN0KGRvdWJsZSBmb28pOwoKICBzdGF0aWMgY29uc3QgaW50IENPVU5URE9XTltdOwogIHN0YXRpYyBjb25zdCBpbnQqIENPVU5URE9XTl9QVFI7CiAgc3RhdGljIGNvbnN0IGludCogY291bnRkb3duKCk7Cn07CgpjbGFzcyBJVGVzdCB7CiAgdmlydHVhbCB2b2lkIGZvbygpID0gMDsKfTsKCmNsYXNzIFZpcnR1YWxEZXN0cnVjdG9yIHsKcHVibGljOgogIHN0YXRpYyB1bnNpZ25lZCBzRGVzdHJ1Y3RvckNvdW50OwogIHZpcnR1YWwgflZpcnR1YWxEZXN0cnVjdG9yKCkgPSAwOwp9OwoKY2xhc3MgSW5oZXJpdHNGcm9tVmlydHVhbERlc3RydWN0b3IgZmluYWwgOiBwdWJsaWMgVmlydHVhbERlc3RydWN0b3IgewpwdWJsaWM6CiAgc3RhdGljIHVuc2lnbmVkIHNEZXN0cnVjdG9yQ291bnQ7CiAgSW5oZXJpdHNGcm9tVmlydHVhbERlc3RydWN0b3IoKTsKICB+SW5oZXJpdHNGcm9tVmlydHVhbERlc3RydWN0b3IoKSBmaW5hbDsKfTsKCm5hbWVzcGFjZSB0ZXN0aW5nIHsKCnR5cGVkZWYgVGVzdCBUeXBlQWxpYXM7Cgp9IC8vIG5hbWVzcGFjZSB0ZXN0aW5nCgp0eXBlZGVmIHRlc3Rpbmc6OlR5cGVBbGlhcyBUeXBlQWxpYXM7CgpuYW1lc3BhY2UgYml0ZmllbGRzIHsKCnN0cnVjdCBGaXJzdCB7CiAgICB1bnNpZ25lZCBjaGFyIHRocmVlX2JpdHNfYnl0ZV9vbmUgOiAzOwogICAgLy8gVGhpcyBzdGFydHMgYSBuZXcgYnl0ZSwgbGVhdmluZyA1IGJpdHMgdW51c2VkLgogICAgdW5zaWduZWQgY2hhciA6MDsKCiAgICB1bnNpZ25lZCBjaGFyIHNpeF9iaXRzX2J5dGVfdHdvIDogNjsKICAgIHVuc2lnbmVkIGNoYXIgdHdvX2JpdHNfYnl0ZV90d28gOiAyOwoKICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGJpdGZpZWxkcyBtYXRjaCB0aGUgYXJndW1lbnRzLCBmYWxzZSBvdGhlcndpc2UuCiAgICBib29sIGFzc2VydCh1bnNpZ25lZCBjaGFyIGZpcnN0LAogICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBzZWNvbmQsCiAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHRoaXJkKTsKfTsKCnN0cnVjdCBTZWNvbmQgewogICAgaW50IHRoaXJ0eV9vbmVfYml0cyA6IDMxOwogICAgYm9vbCBvbmVfYml0IDogMTsKCiAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBiaXRmaWVsZHMgbWF0Y2ggdGhlIGFyZ3VtZW50cywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgYm9vbCBhc3NlcnQoaW50IGZpcnN0LAogICAgICAgICAgICAgICAgYm9vbCBzZWNvbmQpOwp9OwoKZW51bSBJdGVtS2luZCB7CiAgICBJVEVNX0tJTkRfVU5PID0gMCwKICAgIElURU1fS0lORF9ET1MsCiAgICBJVEVNX0tJTkRfVFJFUywKfTsKCnN0cnVjdCBUaGlyZCB7CiAgICBpbnQgZmxhZ3MgOiAyODsKICAgIGJvb2wgaXNfd2hhdGV2ZXIgOiAxOwogICAgSXRlbUtpbmQga2luZCA6IDM7CgogICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgYml0ZmllbGRzIG1hdGNoIHRoZSBhcmd1bWVudHMsIGZhbHNlIG90aGVyd2lzZS4KICAgIGJvb2wgYXNzZXJ0KGludCBmaXJzdCwgYm9vbCBzZWNvbmQsIEl0ZW1LaW5kIHRoaXJkKTsKfTsKCmVudW0gTXlFbnVtIHsKICAgIE9ORSA9IDAsCiAgICBUV08sCiAgICBUSFJFRSwKICAgIEZPVVIsCn07CgpzdHJ1Y3QgRm91cnRoIHsKICAgIE15RW51bSB0YWc6IDI7CiAgICB1bnNpZ25lZCBsb25nIHB0cjogNDg7CgogICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgYml0ZmllbGRzIG1hdGNoIHRoZSBhcmd1bWVudHMsIGZhbHNlIG90aGVyd2lzZS4KICAgIGJvb2wgYXNzZXJ0KE15RW51bSB0YWcsIHVuc2lnbmVkIGxvbmcgcHRyKTsKfTsKCnN0cnVjdCBEYXRlMiB7CiAgICB1bnNpZ25lZCBzaG9ydCBuV2Vla0RheSAgOiAzOyAgICAvLyAwLi43ICAgKDMgYml0cykKICAgIHVuc2lnbmVkIHNob3J0IG5Nb250aERheSA6IDY7ICAgIC8vIDAuLjMxICAoNiBiaXRzKQogICAgdW5zaWduZWQgc2hvcnQgbk1vbnRoICAgIDogNTsgICAgLy8gMC4uMTIgICg1IGJpdHMpCiAgICB1bnNpZ25lZCBzaG9ydCBuWWVhciAgICAgOiA4OyAgICAvLyAwLi4xMDAgKDggYml0cykKICAgIHVuc2lnbmVkIGNoYXIgYnl0ZSA6IDg7CgogICAgYm9vbCBhc3NlcnQodW5zaWduZWQgc2hvcnQgbldlZWtEYXksCiAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBuTW9udGhEYXksCiAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBuTW9udGgsCiAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBuWWVhciwKICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGJ5dGUpOwp9OwoKCnN0cnVjdCBGaWZ0aCB7CiAgICB1bnNpZ25lZCBzaG9ydCBuV2Vla0RheSAgOiAzOyAgICAvLyAwLi43ICAgKDMgYml0cykKICAgIHVuc2lnbmVkIHNob3J0IG5Nb250aERheSA6IDY7ICAgIC8vIDAuLjMxICAoNiBiaXRzKQogICAgdW5zaWduZWQgc2hvcnQgbk1vbnRoICAgIDogNTsgICAgLy8gMC4uMTIgICg1IGJpdHMpCiAgICB1bnNpZ25lZCBzaG9ydCBuWWVhciAgICAgOiA4OyAgICAvLyAwLi4xMDAgKDggYml0cykKICAgIHVuc2lnbmVkIGNoYXIgYnl0ZTsKCiAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBiaXRmaWVsZHMgbWF0Y2ggdGhlIGFyZ3VtZW50cywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgYm9vbCBhc3NlcnQodW5zaWduZWQgc2hvcnQgbldlZWtEYXksCiAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBuTW9udGhEYXksCiAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBuTW9udGgsCiAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBuWWVhciwKICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYnl0ZSk7Cn07CgpzdHJ1Y3QgU2l4dGggewogICAgdW5zaWduZWQgY2hhciBieXRlOwogICAgdW5zaWduZWQgY2hhciBuV2Vla0RheSAgOiAzOwogICAgdW5zaWduZWQgY2hhciBuTW9udGggICAgOiA1OwogICAgdW5zaWduZWQgY2hhciBuTW9udGhEYXkgOiA2OwoKICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGJpdGZpZWxkcyBtYXRjaCB0aGUgYXJndW1lbnRzLCBmYWxzZSBvdGhlcndpc2UuCiAgICBib29sIGFzc2VydCh1bnNpZ25lZCBjaGFyIGJ5dGUsCiAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIG5XZWVrRGF5LAogICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBuTW9udGgsCiAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIG5Nb250aERheSk7Cn07CgpzdHJ1Y3QgU2V2ZW50aCB7CiAgICBib29sIGZpcnN0X29uZV9iaXQgOiAxOwogICAgdW5zaWduZWQgaW50IHNlY29uZF90aGlydHlfYml0cyA6IDMwOwogICAgdW5zaWduZWQgc2hvcnQgdGhpcmRfdHdvX2JpdHMgOiAyOwogICAgdW5zaWduZWQgaW50IGZvdXJ0aF90aGlydHlfYml0cyA6IDMwOwogICAgdW5zaWduZWQgc2hvcnQgZmlmdGhfdHdvX2JpdHMgOiAyOwogICAgYm9vbCBzaXh0aF9vbmVfYml0IDogMTsKICAgIHVuc2lnbmVkIGludCBzZXZlbnRoX3RoaXJ0eV9iaXRzIDogMzA7CgogICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgYml0ZmllbGRzIG1hdGNoIHRoZSBhcmd1bWVudHMsIGZhbHNlIG90aGVyd2lzZS4KICAgIGJvb2wgYXNzZXJ0KGJvb2wgZmlyc3QsCiAgICAgICAgICAgICAgICBpbnQgc2Vjb25kLAogICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgdGhpcmQsCiAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZm91cnRoLAogICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgZmlmdGgsCiAgICAgICAgICAgICAgICBib29sIHNpeHRoLAogICAgICAgICAgICAgICAgaW50IHNldmVudGgpOwp9OwoKfSAvLyBuYW1lc3BhY2UgYml0ZmllbGRzCgpzdHJ1Y3QgQXV0b1Jlc3RvcmVCb29sIHsKICBib29sKiBtX3B0cjsKICBib29sIG1fdmFsdWU7CgogIEF1dG9SZXN0b3JlQm9vbChib29sKik7CiAgfkF1dG9SZXN0b3JlQm9vbCgpOwp9OwoKc3RydWN0IFdpdGhXQ2hhciB7CiAgd2NoYXJfdCBmb29bMzBdOwp9OwoKLy8gVGhlIG5hbWVzIG9mIHRoZSBmb2xsb3dpbmcgaXRlbXMgYXJlIHVucHJlZml4ZWQgYnkgdGhlIHBhcnNlIGNhbGxiYWNrcy4KY29uc3QgaW50IE1ZX1BSRUZJWEVEX0NPTlNUX1ZBTFVFID0gMzsKCmludCBteV9wcmVmaXhlZF9mdW5jdGlvbl9uYW1lKCk7CgpzdHJ1Y3QgbXlfcHJlZml4ZWRfYmFyIHsKICAgIGludCBmb287Cn07CgpzdHJ1Y3QgbXlfcHJlZml4ZWRfZm9vIHsKICAgbXlfcHJlZml4ZWRfYmFyIG1lbWJlcjsKfTsKCmVudW0gbXlfcHJlZml4ZWRfZW51bV90b19iZV9jb25zdGlmaWVkIHsKICBPTkUgPSAxLAogIFRXTywKICBUSFJFRSwKfTsKCnN0cnVjdCBteV9wcmVmaXhlZF9iYXogewogIGNoYXIgZm9vWzMwXTsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnN0cnVjdCBteV9wcmVmaXhlZF90ZW1wbGF0ZWRfZm9vIHsKICBUIG1lbWJlcjsKfTsKCm15X3ByZWZpeGVkX3RlbXBsYXRlZF9mb288bXlfcHJlZml4ZWRfYmF6PiBURU1QTEFURURfQ09OU1RfVkFMVUU7Cgp2b2lkIG15X3ByZWZpeGVkX2Z1bmN0aW9uX3RvX3JlbW92ZSgpOwoKdHlwZWRlZiB1bmlvbiB7CiAgZG91YmxlIHZbNF07Cn0gQ29vcmQ7CgpDb29yZCBjb29yZChkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB6LCBkb3VibGUgdCk7Cg==