LyoKICogVmVydGV4IHBvc2l0aW9uIGRhdGEgZGVzY3JpYmluZyB0aGUgbGV0dGVyICd0JwogKgogKiAoYykgQ29weXJpZ2h0IDE5OTMsIFNpbGljb24gR3JhcGhpY3MsIEluYy4KICogQ29weXJpZ2h0IKkgMjAxMiBMaW5hcm8gTGltaXRlZAogKgogKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgZ2xtYXJrMiBPcGVuR0wgKEVTKSAyLjAgYmVuY2htYXJrLgogKgogKiBnbG1hcmsyIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCiAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKICogdmVyc2lvbi4KICoKICogZ2xtYXJrMiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKICogV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwogKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCiAqIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKICogZ2xtYXJrMi4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICoKICogQXV0aG9yczoKICogIEplc3NlIEJhcmtlcgogKi8KI2luY2x1ZGUgImNoYXJhY3RlcnMuaCIKCnVzaW5nIExpYk1hdHJpeDo6dmVjMjsKCkxldHRlclQ6OkxldHRlclQoKQp7CiAgICAvLyBWZXJ0ZXggZGF0YS4uLgogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoMi45ODY2NjcsIDE0LjAzNDgwMSkpOwogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoMi40NDUxMjgsIDEwLjA4ODAyNCkpOwogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoMS43ODg3MTgsIDkuMjM2NDM4KSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMigyLjI2NDYxNSwgNy42NjQyNzkpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDEuMTY1MTI4LCA1LjY2NjMyNikpOwogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoMi4wMzQ4NzIsIDQuOTQ1NzUyKSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMigxLjEzMjMwOCwgMy43NjY2MzMpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDIuMTgyNTY0LCAzLjU3MDExMykpOwogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoMS40MTEyODIsIDIuMzA5MTA5KSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMigyLjUxMDc2OSwgMi4zNDE4NjMpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDIuMTQ5NzQ0LCAxLjA0ODEwNikpOwogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoMy4zNjQxMDMsIDEuMzc1NjQwKSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMigzLjE2NzE4MCwgMC4zMjc1MzMpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDQuMzgxNTM4LCAwLjczNjk1MCkpOwogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoNS4wMDUxMjgsIDAuMDMyNzUzKSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMig1LjYxMjMwOCwgMC42Mzg2OTApKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDYuMjM1ODk4LCAwLjU0MDQzMCkpOwogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoNy4xODc2OTIsIDEuMTYyNzQzKSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMigxLjk4NTY0MSwgOS4wMzk5MTgpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDIuMTMzMzMzLCAxMC4xODYyODUpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDEuNTA5NzQ0LCA5LjAyMzU0MSkpOwogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoMS42MDgyMDUsIDkuNjYyMjMxKSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMigxLjA1MDI1NiwgOS4wMjM1NDEpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDEuMDUwMjU2LCA5LjMzNDY5OCkpOwogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoMC4xOTY5MjMsIDkuMDA3MTY1KSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMigyLjM2MzA3NywgOS43MTEzNjEpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDIuMjY0NjE1LCA5LjAyMzU0MSkpOwogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoMy4yODIwNTEsIDkuNTYzOTcyKSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMigzLjQ0NjE1NCwgOS4wMjM1NDEpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDQuMDY5NzQ0LCA5LjUzMTIxOCkpOwogICAgdmVydGV4RGF0YV8ucHVzaF9iYWNrKHZlYzIoNC4yOTk0ODcsIDkuMjM2NDM4KSk7CiAgICB2ZXJ0ZXhEYXRhXy5wdXNoX2JhY2sodmVjMig0LjY0NDEwMywgOS42MTMxMDEpKTsKICAgIHZlcnRleERhdGFfLnB1c2hfYmFjayh2ZWMyKDUuMjUxMjgyLCA5Ljg3NTEyOCkpOwoKICAgIC8vIEluZGV4IGRhdGEuLi4KICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDApOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMSk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygyKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDMpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soNCk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjayg1KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDYpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soNyk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjayg4KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDkpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMTApOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMTEpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMTIpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMTMpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMTQpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMTUpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMTYpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMTcpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMTgpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMTkpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMjApOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMjEpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMjIpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMjMpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMjQpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMjUpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMjYpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMjcpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMjgpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMjkpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMzApOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMzEpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMzIpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMCk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygyKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDQpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soNik7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjayg4KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDEwKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDEyKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDE0KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDE2KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDE3KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDE1KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDEzKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDExKTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDkpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soNyk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjayg1KTsKICAgIGluZGV4RGF0YV8ucHVzaF9iYWNrKDMpOwogICAgaW5kZXhEYXRhXy5wdXNoX2JhY2soMSk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygxOCk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygyMCk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygyMik7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygyNCk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygyMyk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygyMSk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygxOSk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygyNik7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygyOCk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygzMCk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygzMik7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygzMSk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygyOSk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygyNyk7CiAgICBpbmRleERhdGFfLnB1c2hfYmFjaygyNSk7CgogICAgLy8gUHJpbWl0aXZlIHN0YXRlIHNvIHRoYXQgdGhlIGRyYXcgY2FsbCBjYW4gaXNzdWUgdGhlIHByaW1pdGl2ZXMgd2Ugd2FudC4KICAgIHVuc2lnbmVkIGludCBjdXJPZmZzZXQoMCk7CiAgICBwcmltVmVjXy5wdXNoX2JhY2soUHJpbWl0aXZlU3RhdGUoR0xfVFJJQU5HTEVfU1RSSVAsIDE4LCBjdXJPZmZzZXQpKTsKICAgIGN1ck9mZnNldCArPSAoMTggKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKICAgIHByaW1WZWNfLnB1c2hfYmFjayhQcmltaXRpdmVTdGF0ZShHTF9UUklBTkdMRV9TVFJJUCwgNywgY3VyT2Zmc2V0KSk7CiAgICBjdXJPZmZzZXQgKz0gKDcgKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKICAgIHByaW1WZWNfLnB1c2hfYmFjayhQcmltaXRpdmVTdGF0ZShHTF9UUklBTkdMRV9TVFJJUCwgOCwgY3VyT2Zmc2V0KSk7CiAgICBjdXJPZmZzZXQgKz0gKDggKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKICAgIHByaW1WZWNfLnB1c2hfYmFjayhQcmltaXRpdmVTdGF0ZShHTF9MSU5FX1NUUklQLCAxOCwgY3VyT2Zmc2V0KSk7CiAgICBjdXJPZmZzZXQgKz0gKDE4ICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CiAgICBwcmltVmVjXy5wdXNoX2JhY2soUHJpbWl0aXZlU3RhdGUoR0xfTElORV9TVFJJUCwgNywgY3VyT2Zmc2V0KSk7CiAgICBjdXJPZmZzZXQgKz0gKDcgKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKICAgIHByaW1WZWNfLnB1c2hfYmFjayhQcmltaXRpdmVTdGF0ZShHTF9MSU5FX1NUUklQLCA4LCBjdXJPZmZzZXQpKTsKfQo=