LyogQm9vc3QgZXhhbXBsZXMvaW8uY3BwCiAqIHNob3cgc29tZSBleGFtcGxlc28gb2YgaS9vIG9wZXJhdG9ycwogKiB0aGFua3MgdG8gYWxsIHRoZSBwZW9wbGUgd2hvIGNvbW1lbnRlZCBvbiB0aGlzIHBvaW50LCBwYXJ0aWN1bGFybHkgb24KICogdGhlIEJvb3N0IG1haWxpbmctbGlzdAogKgogKiBDb3B5cmlnaHQgMjAwMyBHdWlsbGF1bWUgTWVscXVpb25kCiAqCiAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KICogKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IKICogY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCiAqLwoKI2luY2x1ZGUgPGJvb3N0L251bWVyaWMvaW50ZXJ2YWwuaHBwPgojaW5jbHVkZSA8Ym9vc3QvaW8vaW9zX3N0YXRlLmhwcD4KI2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8Y2Fzc2VydD4KCm5hbWVzcGFjZSBpb19zdGQgewoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXMsIGNsYXNzIENoYXJUeXBlLCBjbGFzcyBDaGFyVHJhaXRzPgpzdGQ6OmJhc2ljX29zdHJlYW08Q2hhclR5cGUsIENoYXJUcmFpdHM+ICZvcGVyYXRvcjw8CiAgKHN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyVHlwZSwgQ2hhclRyYWl0cz4gJnN0cmVhbSwKICAgY29uc3QgYm9vc3Q6Om51bWVyaWM6OmludGVydmFsPFQsIFBvbGljaWVzPiAmdmFsdWUpCnsKICBpZiAoZW1wdHkodmFsdWUpKSB7CiAgICByZXR1cm4gc3RyZWFtIDw8ICJbXSI7CiAgfSBlbHNlIHsKICAgIHJldHVybiBzdHJlYW0gPDwgJ1snIDw8IGxvd2VyKHZhbHVlKSA8PCAnLCcgPDwgdXBwZXIodmFsdWUpIDw8ICddJzsKICB9Cn0KCn0gLy8gbmFtZXNwYWNlIGlvX3N0ZAoKbmFtZXNwYWNlIGlvX3NuZ2wgewoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXMsIGNsYXNzIENoYXJUeXBlLCBjbGFzcyBDaGFyVHJhaXRzPgpzdGQ6OmJhc2ljX29zdHJlYW08Q2hhclR5cGUsIENoYXJUcmFpdHM+ICZvcGVyYXRvcjw8CiAgKHN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyVHlwZSwgQ2hhclRyYWl0cz4gJnN0cmVhbSwKICAgY29uc3QgYm9vc3Q6Om51bWVyaWM6OmludGVydmFsPFQsIFBvbGljaWVzPiAmdmFsdWUpCnsKICBpZiAoZW1wdHkodmFsdWUpKSB7CiAgICByZXR1cm4gc3RyZWFtIDw8ICJbXSI7CiAgfSBlbHNlIGlmIChzaW5nbGV0b24odmFsdWUpKSB7CiAgICByZXR1cm4gc3RyZWFtIDw8ICdbJyA8PCBsb3dlcih2YWx1ZSkgPDwgJ10nOwogIH0gZWxzZSB7CiAgICByZXR1cm4gc3RyZWFtIDw8ICdbJyA8PCBsb3dlcih2YWx1ZSkgPDwgJywnIDw8IHVwcGVyKHZhbHVlKSA8PCAnXSc7CiAgfQp9Cgp9IC8vIG5hbWVzcGFjZSBpb19zbmdsCgpuYW1lc3BhY2UgaW9fd2R0aCB7Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcywgY2xhc3MgQ2hhclR5cGUsIGNsYXNzIENoYXJUcmFpdHM+CnN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyVHlwZSwgQ2hhclRyYWl0cz4gJm9wZXJhdG9yPDwKICAoc3RkOjpiYXNpY19vc3RyZWFtPENoYXJUeXBlLCBDaGFyVHJhaXRzPiAmc3RyZWFtLAogICBjb25zdCBib29zdDo6bnVtZXJpYzo6aW50ZXJ2YWw8VCwgUG9saWNpZXM+ICZ2YWx1ZSkKewogIGlmIChlbXB0eSh2YWx1ZSkpIHsKICAgIHJldHVybiBzdHJlYW0gPDwgIm5vdGhpbmciOwogIH0gZWxzZSB7CiAgICByZXR1cm4gc3RyZWFtIDw8IG1lZGlhbih2YWx1ZSkgPDwgIiCxICIgPDwgd2lkdGgodmFsdWUpIC8gMjsKICB9Cn0KCn0gLy8gbmFtZXNwYWNlIGlvX3dkdGgKCm5hbWVzcGFjZSBpb19wcmVjIHsKCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzLCBjbGFzcyBDaGFyVHlwZSwgY2xhc3MgQ2hhclRyYWl0cz4Kc3RkOjpiYXNpY19vc3RyZWFtPENoYXJUeXBlLCBDaGFyVHJhaXRzPiAmb3BlcmF0b3I8PAogIChzdGQ6OmJhc2ljX29zdHJlYW08Q2hhclR5cGUsIENoYXJUcmFpdHM+ICZzdHJlYW0sCiAgIGNvbnN0IGJvb3N0OjpudW1lcmljOjppbnRlcnZhbDxULCBQb2xpY2llcz4gJnZhbHVlKQp7CiAgaWYgKGVtcHR5KHZhbHVlKSkgewogICAgcmV0dXJuIHN0cmVhbSA8PCAibm90aGluZyI7CiAgfSBlbHNlIGlmIChzaW5nbGV0b24odmFsdWUpKSB7CiAgICBib29zdDo6aW86Omlvc19wcmVjaXNpb25fc2F2ZXIgc3RhdGUoc3RyZWFtLCBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjpkaWdpdHMxMCk7CiAgICByZXR1cm4gc3RyZWFtIDw8IGxvd2VyKHZhbHVlKTsKICB9IGVsc2UgaWYgKHplcm9faW4odmFsdWUpKSB7CiAgICByZXR1cm4gc3RyZWFtIDw8ICIwfiI7CiAgfSBlbHNlIHsKICAgIGNvbnN0IFQgcmVsID0gd2lkdGgodmFsdWUpIC8gbm9ybSh2YWx1ZSk7CiAgICBpbnQgcmFuZ2UgPSAtIChpbnQpc3RkOjpsb2cxMChyZWwpOwogICAgYm9vc3Q6OmlvOjppb3NfcHJlY2lzaW9uX3NhdmVyIHN0YXRlKHN0cmVhbSwgcmFuZ2UpOwogICAgcmV0dXJuIHN0cmVhbSA8PCBtZWRpYW4odmFsdWUpOwogIH0KfQoKfSAvLyBuYW1lc3BhY2UgaW9fcHJlYwoKbmFtZXNwYWNlIGlvX3dpZGUgewoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXMsIGNsYXNzIENoYXJUeXBlLCBjbGFzcyBDaGFyVHJhaXRzPgpzdGQ6OmJhc2ljX29zdHJlYW08Q2hhclR5cGUsIENoYXJUcmFpdHM+ICZvcGVyYXRvcjw8CiAgKHN0ZDo6YmFzaWNfb3N0cmVhbTxDaGFyVHlwZSwgQ2hhclRyYWl0cz4gJnN0cmVhbSwKICAgY29uc3QgYm9vc3Q6Om51bWVyaWM6OmludGVydmFsPFQsIFBvbGljaWVzPiAmdmFsdWUpCnsKICBpZiAoZW1wdHkodmFsdWUpKSB7CiAgICByZXR1cm4gc3RyZWFtIDw8ICJub3RoaW5nIjsKICB9IGVsc2UgaWYgKHNpbmdsZXRvbih2YWx1ZSkpIHsKICAgIGJvb3N0Ojppbzo6aW9zX3ByZWNpc2lvbl9zYXZlciBzdGF0ZShzdHJlYW0sIHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmRpZ2l0czEwKTsKICAgIHJldHVybiBzdHJlYW0gPDwgbG93ZXIodmFsdWUpOwogIH0gZWxzZSBpZiAoemVyb19pbih2YWx1ZSkpIHsKICAgIHJldHVybiBzdHJlYW0gPDwgIjB+IjsKICB9IGVsc2UgewogICAgc3RkOjpzdHJlYW1zaXplIHAgPSBzdHJlYW0ucHJlY2lzaW9uKCk7CiAgICAvLyBGSVhNRSBwb29yIG1hbidzIHBvd2VyIG9mIDEwLCBvbmx5IHVwIHRvIDFFLTE1CiAgICBwID0gKHAgPiAxNSkgPyAxNSA6IHAgLSAxOwogICAgZG91YmxlIGVwcyA9IDEuMDsgZm9yKDsgcCA+IDA7IC0tcCkgeyBlcHMgLz0gMTA7IH0KICAgIFQgZXBzMiA9IHN0YXRpY19jYXN0PFQ+KGVwcyAvIDIpICogbm9ybSh2YWx1ZSk7CiAgICBib29zdDo6bnVtZXJpYzo6aW50ZXJ2YWw8VCwgUG9saWNpZXM+IHIgPSB3aWRlbih2YWx1ZSwgZXBzMik7CiAgICByZXR1cm4gc3RyZWFtIDw8ICdbJyA8PCBsb3dlcihyKSA8PCAnLCcgPDwgdXBwZXIocikgPDwgJ10nOwogIH0KfQoKfSAvLyBuYW1lc3BhY2UgaW9fd2lkZQoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXMsIGNsYXNzIENoYXJUeXBlLCBjbGFzcyBDaGFyVHJhaXRzPiBpbmxpbmUKc3RkOjpiYXNpY19pc3RyZWFtPENoYXJUeXBlLCBDaGFyVHJhaXRzPiAmb3BlcmF0b3I+PgogIChzdGQ6OmJhc2ljX2lzdHJlYW08Q2hhclR5cGUsIENoYXJUcmFpdHM+ICZzdHJlYW0sCiAgIGJvb3N0OjpudW1lcmljOjppbnRlcnZhbDxULCBQb2xpY2llcz4gJnZhbHVlKQp7CiAgVCBsLCB1OwogIGNoYXIgYyA9IDA7CiAgc3RyZWFtID4+IGM7CiAgaWYgKGMgPT0gJ1snKSB7CiAgICBzdHJlYW0gPj4gbCA+PiBjOwogICAgaWYgKGMgPT0gJywnKSBzdHJlYW0gPj4gdSA+PiBjOyBlbHNlIHUgPSBsOwogICAgaWYgKGMgIT0gJ10nKSBzdHJlYW0uc2V0c3RhdGUoc3RyZWFtLmZhaWxiaXQpOwogIH0gZWxzZSB7CiAgICBzdHJlYW0ucHV0YmFjayhjKTsKICAgIHN0cmVhbSA+PiBsOwogICAgdSA9IGw7CiAgfQogIGlmIChzdHJlYW0pCiAgICB2YWx1ZS5hc3NpZ24obCwgdSk7CiAgZWxzZQogICAgdmFsdWUgPSBib29zdDo6bnVtZXJpYzo6aW50ZXJ2YWw8VCwgUG9saWNpZXM+OjplbXB0eSgpOwogIHJldHVybiBzdHJlYW07Cn0KCi8vIFRlc3QgcHJvZ3JhbQoKI2luY2x1ZGUgPGlvc3RyZWFtPgoKaW50IG1haW4oKQp7CiAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OwogIHVzaW5nIG5hbWVzcGFjZSBudW1lcmljOwogIHVzaW5nIG5hbWVzcGFjZSBpbnRlcnZhbF9saWI7CgogIHR5cGVkZWYgaW50ZXJ2YWw8ZG91YmxlLAogICAgICAgICAgICAgICAgICAgcG9saWNpZXM8cm91bmRlZF9tYXRoPGRvdWJsZT4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2luZ19iYXNlPGRvdWJsZT4gPiA+IEk7CgogIEkgdGFiW10gPSB7IEk6OmVtcHR5KCksIEkoMSwxKSwgSSgxLDIpLCBJKC0xLDEpLCBJKDEyLjM0LDEyLjM1KSwKICAgICAgICAgICAgICBJKDEyMzQuNTYsMTIzNC41NyksIEkoMTIzNDU2Ljc4LCAxMjM0NTYuNzkpLCBJOjplbXB0eSgpIH07CiAgdW5zaWduZWQgaW50IGxlbiA9IHNpemVvZih0YWIpIC8gc2l6ZW9mKEkpOwogIHN0ZDo6Y291dCA8PCAiRW50ZXIgYW4gaW50ZXJ2YWw6IChpdCB3aWxsIGJlIHRoZSBsYXN0IHNob3duKVxuIjsKICBzdGQ6OmNpbiA+PiB0YWJbbGVuIC0gMV07CgogIGZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgewogICAgeyB1c2luZyBuYW1lc3BhY2UgaW9fc3RkOyAgc3RkOjpjb3V0IDw8IHRhYltpXSA8PCAnXG4nOyB9CiAgICB7IHVzaW5nIG5hbWVzcGFjZSBpb19zbmdsOyBzdGQ6OmNvdXQgPDwgdGFiW2ldIDw8ICdcbic7IH0KICAgIHsgdXNpbmcgbmFtZXNwYWNlIGlvX3dkdGg7IHN0ZDo6Y291dCA8PCB0YWJbaV0gPDwgJ1xuJzsgfQogICAgeyB1c2luZyBuYW1lc3BhY2UgaW9fcHJlYzsgc3RkOjpjb3V0IDw8IHRhYltpXSA8PCAnXG4nOyB9CiAgICB7IHVzaW5nIG5hbWVzcGFjZSBpb193aWRlOyBzdGQ6OmNvdXQgPDwgdGFiW2ldIDw8ICdcbic7IH0KICAgIHN0ZDo6Y291dCA8PCAnXG4nOwogIH0KCn0K