Ly8KLy8gqSBDb3B5cmlnaHQgSGVucmlrIFJhdm4gMjAwNAovLwovLyBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gCi8vIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQovLwoKdXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7CgpuYW1lc3BhY2UgRG90WkxpYgp7CgoJLy8vIDxzdW1tYXJ5PgoJLy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIGNpcmN1bGFyIGJ1ZmZlcgoJLy8vIDwvc3VtbWFyeT4KCWludGVybmFsIGNsYXNzIENpcmN1bGFyQnVmZmVyCgl7CiAgICAgICAgI3JlZ2lvbiBQcml2YXRlIGRhdGEKICAgICAgICBwcml2YXRlIGludCBfY2FwYWNpdHk7CiAgICAgICAgcHJpdmF0ZSBpbnQgX2hlYWQ7CiAgICAgICAgcHJpdmF0ZSBpbnQgX3RhaWw7CiAgICAgICAgcHJpdmF0ZSBpbnQgX3NpemU7CiAgICAgICAgcHJpdmF0ZSBieXRlW10gX2J1ZmZlcjsKICAgICAgICAjZW5kcmVnaW9uCgogICAgICAgIHB1YmxpYyBDaXJjdWxhckJ1ZmZlcihpbnQgY2FwYWNpdHkpCiAgICAgICAgeyAgICAKICAgICAgICAgICAgRGVidWcuQXNzZXJ0KCBjYXBhY2l0eSA+IDAgKTsKICAgICAgICAgICAgX2J1ZmZlciA9IG5ldyBieXRlW2NhcGFjaXR5XTsKICAgICAgICAgICAgX2NhcGFjaXR5ID0gY2FwYWNpdHk7CiAgICAgICAgICAgIF9oZWFkID0gMDsKICAgICAgICAgICAgX3RhaWwgPSAwOwogICAgICAgICAgICBfc2l6ZSA9IDA7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgaW50IFNpemUgeyBnZXQgeyByZXR1cm4gX3NpemU7IH0gfQoKICAgICAgICBwdWJsaWMgaW50IFB1dChieXRlW10gc291cmNlLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpCiAgICAgICAgewogICAgICAgICAgICBEZWJ1Zy5Bc3NlcnQoIGNvdW50ID4gMCApOwogICAgICAgICAgICBpbnQgdHJ1ZUNvdW50ID0gTWF0aC5NaW4oY291bnQsIF9jYXBhY2l0eSAtIFNpemUpOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRydWVDb3VudDsgKytpKQogICAgICAgICAgICAgICAgX2J1ZmZlclsoX3RhaWwraSkgJSBfY2FwYWNpdHldID0gc291cmNlW29mZnNldCtpXTsKICAgICAgICAgICAgX3RhaWwgKz0gdHJ1ZUNvdW50OwogICAgICAgICAgICBfdGFpbCAlPSBfY2FwYWNpdHk7CiAgICAgICAgICAgIF9zaXplICs9IHRydWVDb3VudDsKICAgICAgICAgICAgcmV0dXJuIHRydWVDb3VudDsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBib29sIFB1dChieXRlIGIpCiAgICAgICAgewogICAgICAgICAgICBpZiAoU2l6ZSA9PSBfY2FwYWNpdHkpIC8vIG5vIHJvb20KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgX2J1ZmZlcltfdGFpbCsrXSA9IGI7CiAgICAgICAgICAgIF90YWlsICU9IF9jYXBhY2l0eTsKICAgICAgICAgICAgKytfc2l6ZTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgaW50IEdldChieXRlW10gZGVzdGluYXRpb24sIGludCBvZmZzZXQsIGludCBjb3VudCkKICAgICAgICB7CiAgICAgICAgICAgIGludCB0cnVlQ291bnQgPSBNYXRoLk1pbihjb3VudCxTaXplKTsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cnVlQ291bnQ7ICsraSkKICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uW29mZnNldCArIGldID0gX2J1ZmZlclsoX2hlYWQraSkgJSBfY2FwYWNpdHldOwogICAgICAgICAgICBfaGVhZCArPSB0cnVlQ291bnQ7CiAgICAgICAgICAgIF9oZWFkICU9IF9jYXBhY2l0eTsKICAgICAgICAgICAgX3NpemUgLT0gdHJ1ZUNvdW50OwogICAgICAgICAgICByZXR1cm4gdHJ1ZUNvdW50OwogICAgICAgIH0KCiAgICAgICAgcHVibGljIGludCBHZXQoKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKFNpemUgPT0gMCkKICAgICAgICAgICAgICAgIHJldHVybiAtMTsKCiAgICAgICAgICAgIGludCByZXN1bHQgPSAoaW50KV9idWZmZXJbX2hlYWQrKyAlIF9jYXBhY2l0eV07CiAgICAgICAgICAgIC0tX3NpemU7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQoKICAgIH0KfQo=