LyoKICogKGMpIENvcHlyaWdodCAxOTkzLCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCiAqIENvcHlyaWdodCCpIDIwMTIgTGluYXJvIExpbWl0ZWQKICoKICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGdsbWFyazIgT3BlbkdMIChFUykgMi4wIGJlbmNobWFyay4KICoKICogZ2xtYXJrMiBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQogKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCiAqIHZlcnNpb24uCiAqCiAqIGdsbWFyazIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCiAqIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQogKiBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCiAqIGdsbWFyazIuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAqCiAqIEF1dGhvcnM6CiAqICBKZXNzZSBCYXJrZXIKICovCiNpZm5kZWYgTE9HT19IXwojZGVmaW5lIExPR09fSF8KCiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlICJ2ZWMuaCIKI2luY2x1ZGUgInN0YWNrLmgiCiNpbmNsdWRlICJnbC1oZWFkZXJzLmgiCiNpbmNsdWRlICJwcm9ncmFtLmgiCgpjbGFzcyBTR0lMb2dvCnsKcHVibGljOgogICAgU0dJTG9nbygpOwogICAgflNHSUxvZ28oKTsKCiAgICAvLyBJbml0aWFsaXplIHRoZSBsb2dvCiAgICB2b2lkIGluaXQoKTsKICAgIGJvb2wgdmFsaWQoKSBjb25zdCB7IHJldHVybiB2YWxpZF87IH0KICAgIHZvaWQgc2V0UG9zaXRpb24oY29uc3QgTGliTWF0cml4Ojp2ZWMzJiBwb3NpdGlvbikgeyBjdXJyZW50UG9zaXRpb25fID0gcG9zaXRpb247IH0KICAgIC8vIFRlbGwgdGhlIGxvZ28gdG8gZHJhdyBpdHNlbGYuIERyYXdTdHlsZSB0ZWxscyBpdCBob3cuCiAgICAvLyAtIExPR09fTk9STUFMIHJlbmRlcnMgdGhlIGxvZ28gbGl0IGFuZCBzaGFkZWQuCiAgICAvLyAtIExPR09fRkxBVCByZW5kZXJzIHRoZSBsb2dvIGFzIGlmIGZsYXR0ZW5lZCBvbnRvIGEgc3VyZmFjZS4KICAgIC8vIC0gTE9HT19TSEFET1cgcmVuZGVycyBhIHN0aXBwbGVkLWxvb2tpbmcgc2hhZG93IG9mIHRoZSBvYmplY3QuCiAgICBlbnVtIERyYXdTdHlsZQogICAgewogICAgICAgIExPR09fTk9STUFMLCAKICAgICAgICBMT0dPX0ZMQVQsIAogICAgICAgIExPR09fU0hBRE9XCiAgICB9OwogICAgdm9pZCBkcmF3KExpYk1hdHJpeDo6U3RhY2s0JiBtb2RlbHZpZXcsIExpYk1hdHJpeDo6U3RhY2s0JiBwcm9qZWN0aW9uLCAKICAgICAgICAgICAgICBjb25zdCBMaWJNYXRyaXg6OnZlYzQmIGxpZ2h0UG9zaXRpb24sIERyYXdTdHlsZSBzdHlsZSwgCiAgICAgICAgICAgICAgY29uc3QgTGliTWF0cml4Ojp1dmVjMyYgY29sb3IgPSBMaWJNYXRyaXg6OnV2ZWMzKCkpOwoKcHJpdmF0ZToKICAgIHZvaWQgZHJhd0VsYm93KCk7CiAgICB2b2lkIGRyYXdTaW5nbGVDeWxpbmRlcigpOwogICAgdm9pZCBkcmF3RG91YmxlQ3lsaW5kZXIoKTsKICAgIHZvaWQgYmVuZExlZnQoTGliTWF0cml4OjpTdGFjazQmIG1zKTsKICAgIHZvaWQgYmVuZFJpZ2h0KExpYk1hdHJpeDo6U3RhY2s0JiBtcyk7CiAgICB2b2lkIGJlbmRGb3J3YXJkKExpYk1hdHJpeDo6U3RhY2s0JiBtcyk7CiAgICB2b2lkIHVwZGF0ZVhmb3JtKGNvbnN0IExpYk1hdHJpeDo6bWF0NCYgbXYsIFByb2dyYW0mIHByb2dyYW0pOwogICAgUHJvZ3JhbSYgZ2V0UHJvZ3JhbSgpOwogICAgTGliTWF0cml4Ojp2ZWMzIGN1cnJlbnRQb3NpdGlvbl87CiAgICBzdGQ6OnZlY3RvcjxMaWJNYXRyaXg6OnZlYzM+IHNpbmdsZUN5bGluZGVyVmVydGljZXNfOwogICAgc3RkOjp2ZWN0b3I8TGliTWF0cml4Ojp2ZWMzPiBzaW5nbGVDeWxpbmRlck5vcm1hbHNfOwogICAgc3RkOjp2ZWN0b3I8TGliTWF0cml4Ojp2ZWMzPiBkb3VibGVDeWxpbmRlclZlcnRpY2VzXzsKICAgIHN0ZDo6dmVjdG9yPExpYk1hdHJpeDo6dmVjMz4gZG91YmxlQ3lsaW5kZXJOb3JtYWxzXzsKICAgIHN0ZDo6dmVjdG9yPExpYk1hdHJpeDo6dmVjMz4gZWxib3dWZXJ0aWNlc187CiAgICBzdGQ6OnZlY3RvcjxMaWJNYXRyaXg6OnZlYzM+IGVsYm93Tm9ybWFsc187CiAgICBzdGQ6OnZlY3RvcjxMaWJNYXRyaXg6OnZlYzM+IGVsYm93U2hhZG93VmVydGljZXNfOwogICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgc2hvcnQ+IGluZGV4RGF0YV87CiAgICAvLyBBIHNpbXBsZSBtYXAgc28gd2Uga25vdyB3aGVyZSBlYWNoIHNlY3Rpb24gb2Ygb3VyIGRhdGEgc3RhcnRzIHdpdGhpbgogICAgLy8gb3VyIHZlcnRleCBidWZmZXIgb2JqZWN0LgogICAgc3RydWN0IFZlcnRleERhdGFNYXAKICAgIHsKICAgICAgICB1bnNpZ25lZCBpbnQgc2N2T2Zmc2V0OwogICAgICAgIHVuc2lnbmVkIGludCBzY3ZTaXplOwogICAgICAgIHVuc2lnbmVkIGludCBzY25PZmZzZXQ7CiAgICAgICAgdW5zaWduZWQgaW50IHNjblNpemU7CiAgICAgICAgdW5zaWduZWQgaW50IGRjdk9mZnNldDsKICAgICAgICB1bnNpZ25lZCBpbnQgZGN2U2l6ZTsKICAgICAgICB1bnNpZ25lZCBpbnQgZGNuT2Zmc2V0OwogICAgICAgIHVuc2lnbmVkIGludCBkY25TaXplOwogICAgICAgIHVuc2lnbmVkIGludCBldk9mZnNldDsKICAgICAgICB1bnNpZ25lZCBpbnQgZXZTaXplOwogICAgICAgIHVuc2lnbmVkIGludCBlbk9mZnNldDsKICAgICAgICB1bnNpZ25lZCBpbnQgZW5TaXplOwogICAgICAgIHVuc2lnbmVkIGludCBlc3ZPZmZzZXQ7CiAgICAgICAgdW5zaWduZWQgaW50IGVzdlNpemU7CiAgICAgICAgdW5zaWduZWQgaW50IHRvdGFsU2l6ZTsKICAgIH0gZGF0YU1hcF87CiAgICB1bnNpZ25lZCBpbnQgYnVmZmVyT2JqZWN0c19bMl07CiAgICBQcm9ncmFtIG5vcm1hbFByb2dyYW1fOwogICAgUHJvZ3JhbSBmbGF0UHJvZ3JhbV87CiAgICBQcm9ncmFtIHNoYWRvd1Byb2dyYW1fOwogICAgc3RkOjpzdHJpbmcgbm9ybWFsVmVydGV4U2hhZGVyXzsKICAgIHN0ZDo6c3RyaW5nIG5vcm1hbEZyYWdtZW50U2hhZGVyXzsKICAgIHN0ZDo6c3RyaW5nIGZsYXRWZXJ0ZXhTaGFkZXJfOwogICAgc3RkOjpzdHJpbmcgZmxhdEZyYWdtZW50U2hhZGVyXzsKICAgIHN0ZDo6c3RyaW5nIHNoYWRvd1ZlcnRleFNoYWRlcl87CiAgICBzdGQ6OnN0cmluZyBzaGFkb3dGcmFnbWVudFNoYWRlcl87CiAgICBpbnQgbm9ybWFsTm9ybWFsSW5kZXhfOwogICAgaW50IG5vcm1hbFZlcnRleEluZGV4XzsKICAgIGludCBmbGF0VmVydGV4SW5kZXhfOwogICAgaW50IHNoYWRvd1ZlcnRleEluZGV4XzsKICAgIGludCB2ZXJ0ZXhJbmRleF87CiAgICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgbW9kZWx2aWV3TmFtZV87CiAgICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgcHJvamVjdGlvbk5hbWVfOwogICAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGxpZ2h0UG9zaXRpb25OYW1lXzsKICAgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBsb2dvQ29sb3JOYW1lXzsKICAgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyB2ZXJ0ZXhBdHRyaWJOYW1lXzsKICAgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBub3JtYWxBdHRyaWJOYW1lXzsKICAgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBub3JtYWxNYXRyaXhOYW1lXzsKICAgIC8vICJTaGFkb3ciIHN0YXRlCiAgICBHTHVpbnQgdGV4dHVyZU5hbWVfOwogICAgR0x1Ynl0ZSB0ZXh0dXJlSW1hZ2VfWzMyXVszMl07CiAgICAvLyBUaGlzIGlzIHRoZSBzaXplIGluIGVhY2ggZGlyZWN0aW9uIG9mIG91ciB0ZXh0dXJlIGltYWdlCiAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHRleHR1cmVSZXNvbHV0aW9uXzsKICAgIGJvb2wgdmFsaWRfOwogICAgRHJhd1N0eWxlIGRyYXdTdHlsZV87Cn07CgojZW5kaWYgLy8gTE9HT19IXwo=