LyoKICogQ29weXJpZ2h0IChjKSAxOTk1IC0gMTk5OSBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIAogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqIAogKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqIAogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqIAogKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBJbnN0aXR1dGUgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCiAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQogKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICogCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIElOU1RJVFVURSBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCiAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIElOU1RJVFVURSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCiAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCiAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQogKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAogKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCiAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKICogU1VDSCBEQU1BR0UuCiAqLwoKI2lmZGVmIEhBVkVfQ09ORklHX0gKI2luY2x1ZGUgPGNvbmZpZy5oPgojZW5kaWYKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlICJiYXNlNjQuaCIKCi8qIFRoZSBsYXN0ICNpbmNsdWRlIGZpbGUgc2hvdWxkIGJlOiAqLwojaWZkZWYgTUFMTE9DREVCVUcKI2luY2x1ZGUgIm1lbWRlYnVnLmgiCiNlbmRpZgoKc3RhdGljIGNoYXIgYmFzZTY0W10gPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CgpzdGF0aWMgaW50IHBvcyhjaGFyIGMpCnsKICBjaGFyICpwOwogIGZvcihwID0gYmFzZTY0OyAqcDsgcCsrKQogICAgaWYoKnAgPT0gYykKICAgICAgcmV0dXJuIHAgLSBiYXNlNjQ7CiAgcmV0dXJuIC0xOwp9CgojaWYgMQppbnQgQ3VybF9iYXNlNjRfZW5jb2RlKGNvbnN0IHZvaWQgKmRhdGEsIGludCBzaXplLCBjaGFyICoqc3RyKQp7CiAgY2hhciAqcywgKnA7CiAgaW50IGk7CiAgaW50IGM7CiAgY29uc3QgdW5zaWduZWQgY2hhciAqcTsKCiAgcCA9IHMgPSAoY2hhciopbWFsbG9jKHNpemUqNC8zKzQpOwogIGlmIChwID09IE5VTEwpCiAgICAgIHJldHVybiAtMTsKICBxID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIqKWRhdGE7CiAgaT0wOwogIGZvcihpID0gMDsgaSA8IHNpemU7KXsKICAgIGM9cVtpKytdOwogICAgYyo9MjU2OwogICAgaWYoaSA8IHNpemUpCiAgICAgIGMrPXFbaV07CiAgICBpKys7CiAgICBjKj0yNTY7CiAgICBpZihpIDwgc2l6ZSkKICAgICAgYys9cVtpXTsKICAgIGkrKzsKICAgIHBbMF09YmFzZTY0WyhjJjB4MDBmYzAwMDApID4+IDE4XTsKICAgIHBbMV09YmFzZTY0WyhjJjB4MDAwM2YwMDApID4+IDEyXTsKICAgIHBbMl09YmFzZTY0WyhjJjB4MDAwMDBmYzApID4+IDZdOwogICAgcFszXT1iYXNlNjRbKGMmMHgwMDAwMDAzZikgPj4gMF07CiAgICBpZihpID4gc2l6ZSkKICAgICAgcFszXT0nPSc7CiAgICBpZihpID4gc2l6ZSsxKQogICAgICBwWzJdPSc9JzsKICAgIHArPTQ7CiAgfQogICpwPTA7CiAgKnN0ciA9IHM7CiAgcmV0dXJuIHN0cmxlbihzKTsKfQojZW5kaWYKCmludCBDdXJsX2Jhc2U2NF9kZWNvZGUoY29uc3QgY2hhciAqc3RyLCB2b2lkICpkYXRhKQp7CiAgY29uc3QgY2hhciAqcDsKICB1bnNpZ25lZCBjaGFyICpxOwogIGludCBjOwogIGludCB4OwogIGludCBkb25lID0gMDsKICBxPSh1bnNpZ25lZCBjaGFyKilkYXRhOwogIGZvcihwPXN0cjsgKnAgJiYgIWRvbmU7IHArPTQpewogICAgeCA9IHBvcyhwWzBdKTsKICAgIGlmKHggPj0gMCkKICAgICAgYyA9IHg7CiAgICBlbHNlewogICAgICBkb25lID0gMzsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjKj02NDsKICAgIAogICAgeCA9IHBvcyhwWzFdKTsKICAgIGlmKHggPj0gMCkKICAgICAgYyArPSB4OwogICAgZWxzZQogICAgICByZXR1cm4gLTE7CiAgICBjKj02NDsKICAgIAogICAgaWYocFsyXSA9PSAnPScpCiAgICAgIGRvbmUrKzsKICAgIGVsc2V7CiAgICAgIHggPSBwb3MocFsyXSk7CiAgICAgIGlmKHggPj0gMCkKCWMgKz0geDsKICAgICAgZWxzZQoJcmV0dXJuIC0xOwogICAgfQogICAgYyo9NjQ7CiAgICAKICAgIGlmKHBbM10gPT0gJz0nKQogICAgICBkb25lKys7CiAgICBlbHNlewogICAgICBpZihkb25lKQoJcmV0dXJuIC0xOwogICAgICB4ID0gcG9zKHBbM10pOwogICAgICBpZih4ID49IDApCgljICs9IHg7CiAgICAgIGVsc2UKCXJldHVybiAtMTsKICAgIH0KICAgIGlmKGRvbmUgPCAzKQogICAgICAqcSsrPShjJjB4MDBmZjAwMDApPj4xNjsKICAgICAgCiAgICBpZihkb25lIDwgMikKICAgICAgKnErKz0oYyYweDAwMDBmZjAwKT4+ODsKICAgIGlmKGRvbmUgPCAxKQogICAgICAqcSsrPShjJjB4MDAwMDAwZmYpPj4wOwogIH0KICByZXR1cm4gcSAtICh1bnNpZ25lZCBjaGFyKilkYXRhOwp9Cg==