LyogQm9vc3QgaW50ZXJ2YWwvdXRpbGl0eS5ocHAgdGVtcGxhdGUgaW1wbGVtZW50YXRpb24gZmlsZQ0KICoNCiAqIENvcHlyaWdodCAyMDAwIEplbnMgTWF1cmVyDQogKiBDb3B5cmlnaHQgMjAwMi0yMDAzIEhlcnbpIEJy9m5uaW1hbm4sIEd1aWxsYXVtZSBNZWxxdWlvbmQsIFN5bHZhaW4gUGlvbg0KICoNCiAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4NCiAqIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yDQogKiBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkNCiAqLw0KDQojaWZuZGVmIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfVVRJTElUWV9IUFANCiNkZWZpbmUgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9VVElMSVRZX0hQUA0KDQojaW5jbHVkZSA8Ym9vc3QvY29uZmlnLmhwcD4NCiNpbmNsdWRlIDxib29zdC9udW1lcmljL2ludGVydmFsL2RldGFpbC9pbnRlcnZhbF9wcm90b3R5cGUuaHBwPg0KI2luY2x1ZGUgPGJvb3N0L251bWVyaWMvaW50ZXJ2YWwvZGV0YWlsL3Rlc3RfaW5wdXQuaHBwPg0KI2luY2x1ZGUgPGJvb3N0L251bWVyaWMvaW50ZXJ2YWwvZGV0YWlsL2J1Z3MuaHBwPg0KI2luY2x1ZGUgPGFsZ29yaXRobT4NCiNpbmNsdWRlIDx1dGlsaXR5Pg0KDQovKg0KICogSW1wbGVtZW50YXRpb24gb2Ygc2ltcGxlIGZ1bmN0aW9ucw0KICovDQoNCm5hbWVzcGFjZSBib29zdCB7DQpuYW1lc3BhY2UgbnVtZXJpYyB7DQoNCi8qDQogKiBVdGlsaXR5IEZ1bmN0aW9ucw0KICovDQoNCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUNCmNvbnN0IFQmIGxvd2VyKGNvbnN0IGludGVydmFsPFQsIFBvbGljaWVzPiYgeCkNCnsNCiAgcmV0dXJuIHgubG93ZXIoKTsNCn0NCg0KdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQ0KY29uc3QgVCYgdXBwZXIoY29uc3QgaW50ZXJ2YWw8VCwgUG9saWNpZXM+JiB4KQ0Kew0KICByZXR1cm4geC51cHBlcigpOw0KfQ0KDQp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gaW5saW5lDQpUIGNoZWNrZWRfbG93ZXIoY29uc3QgaW50ZXJ2YWw8VCwgUG9saWNpZXM+JiB4KQ0Kew0KICBpZiAoZW1wdHkoeCkpIHsNCiAgICB0eXBlZGVmIHR5cGVuYW1lIFBvbGljaWVzOjpjaGVja2luZyBjaGVja2luZzsNCiAgICByZXR1cm4gY2hlY2tpbmc6Om5hbigpOw0KICB9DQogIHJldHVybiB4Lmxvd2VyKCk7DQp9DQoNCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUNClQgY2hlY2tlZF91cHBlcihjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llcz4mIHgpDQp7DQogIGlmIChlbXB0eSh4KSkgew0KICAgIHR5cGVkZWYgdHlwZW5hbWUgUG9saWNpZXM6OmNoZWNraW5nIGNoZWNraW5nOw0KICAgIHJldHVybiBjaGVja2luZzo6bmFuKCk7DQogIH0NCiAgcmV0dXJuIHgudXBwZXIoKTsNCn0NCg0KdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQ0KVCB3aWR0aChjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llcz4mIHgpDQp7DQogIGlmIChpbnRlcnZhbF9saWI6OmRldGFpbDo6dGVzdF9pbnB1dCh4KSkgcmV0dXJuIHN0YXRpY19jYXN0PFQ+KDApOw0KICB0eXBlbmFtZSBQb2xpY2llczo6cm91bmRpbmcgcm5kOw0KICByZXR1cm4gcm5kLnN1Yl91cCh4LnVwcGVyKCksIHgubG93ZXIoKSk7DQp9DQoNCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUNClQgbWVkaWFuKGNvbnN0IGludGVydmFsPFQsIFBvbGljaWVzPiYgeCkNCnsNCiAgaWYgKGludGVydmFsX2xpYjo6ZGV0YWlsOjp0ZXN0X2lucHV0KHgpKSB7DQogICAgdHlwZWRlZiB0eXBlbmFtZSBQb2xpY2llczo6Y2hlY2tpbmcgY2hlY2tpbmc7DQogICAgcmV0dXJuIGNoZWNraW5nOjpuYW4oKTsNCiAgfQ0KICB0eXBlbmFtZSBQb2xpY2llczo6cm91bmRpbmcgcm5kOw0KICByZXR1cm4gcm5kLm1lZGlhbih4Lmxvd2VyKCksIHgudXBwZXIoKSk7DQp9DQoNCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUNCmludGVydmFsPFQsIFBvbGljaWVzPiB3aWRlbihjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llcz4mIHgsIGNvbnN0IFQmIHYpDQp7DQogIGlmIChpbnRlcnZhbF9saWI6OmRldGFpbDo6dGVzdF9pbnB1dCh4KSkNCiAgICByZXR1cm4gaW50ZXJ2YWw8VCwgUG9saWNpZXM+OjplbXB0eSgpOw0KICB0eXBlbmFtZSBQb2xpY2llczo6cm91bmRpbmcgcm5kOw0KICByZXR1cm4gaW50ZXJ2YWw8VCwgUG9saWNpZXM+KHJuZC5zdWJfZG93bih4Lmxvd2VyKCksIHYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZC5hZGRfdXAgICh4LnVwcGVyKCksIHYpLCB0cnVlKTsNCn0NCg0KLyoNCiAqIFNldC1saWtlIG9wZXJhdGlvbnMNCiAqLw0KDQp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gaW5saW5lDQpib29sIGVtcHR5KGNvbnN0IGludGVydmFsPFQsIFBvbGljaWVzPiYgeCkNCnsNCiAgcmV0dXJuIGludGVydmFsX2xpYjo6ZGV0YWlsOjp0ZXN0X2lucHV0KHgpOw0KfQ0KDQp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gaW5saW5lDQpib29sIHplcm9faW4oY29uc3QgaW50ZXJ2YWw8VCwgUG9saWNpZXM+JiB4KQ0Kew0KICBpZiAoaW50ZXJ2YWxfbGliOjpkZXRhaWw6OnRlc3RfaW5wdXQoeCkpIHJldHVybiBmYWxzZTsNCiAgcmV0dXJuICghaW50ZXJ2YWxfbGliOjp1c2VyOjppc19wb3MoeC5sb3dlcigpKSkgJiYNCiAgICAgICAgICghaW50ZXJ2YWxfbGliOjp1c2VyOjppc19uZWcoeC51cHBlcigpKSk7DQp9DQoNCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUNCmJvb2wgaW5femVybyhjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llcz4mIHgpIC8vIERFUFJFQ0FURUQNCnsNCiAgcmV0dXJuIHplcm9faW48VCwgUG9saWNpZXM+KHgpOw0KfQ0KDQp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gaW5saW5lDQpib29sIGluKGNvbnN0IFQmIHgsIGNvbnN0IGludGVydmFsPFQsIFBvbGljaWVzPiYgeSkNCnsNCiAgaWYgKGludGVydmFsX2xpYjo6ZGV0YWlsOjp0ZXN0X2lucHV0KHgsIHkpKSByZXR1cm4gZmFsc2U7DQogIHJldHVybiB5Lmxvd2VyKCkgPD0geCAmJiB4IDw9IHkudXBwZXIoKTsNCn0NCg0KdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQ0KYm9vbCBzdWJzZXQoY29uc3QgaW50ZXJ2YWw8VCwgUG9saWNpZXM+JiB4LA0KICAgICAgICAgICAgY29uc3QgaW50ZXJ2YWw8VCwgUG9saWNpZXM+JiB5KQ0Kew0KICBpZiAoZW1wdHkoeCkpIHJldHVybiB0cnVlOw0KICByZXR1cm4gIWVtcHR5KHkpICYmIHkubG93ZXIoKSA8PSB4Lmxvd2VyKCkgJiYgeC51cHBlcigpIDw9IHkudXBwZXIoKTsNCn0NCg0KdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXMxLCBjbGFzcyBQb2xpY2llczI+IGlubGluZQ0KYm9vbCBwcm9wZXJfc3Vic2V0KGNvbnN0IGludGVydmFsPFQsIFBvbGljaWVzMT4mIHgsDQogICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXJ2YWw8VCwgUG9saWNpZXMyPiYgeSkNCnsNCiAgaWYgKGVtcHR5KHkpKSByZXR1cm4gZmFsc2U7DQogIGlmIChlbXB0eSh4KSkgcmV0dXJuIHRydWU7DQogIHJldHVybiB5Lmxvd2VyKCkgPD0geC5sb3dlcigpICYmIHgudXBwZXIoKSA8PSB5LnVwcGVyKCkgJiYNCiAgICAgICAgICh5Lmxvd2VyKCkgIT0geC5sb3dlcigpIHx8IHgudXBwZXIoKSAhPSB5LnVwcGVyKCkpOw0KfQ0KDQp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llczEsIGNsYXNzIFBvbGljaWVzMj4gaW5saW5lDQpib29sIG92ZXJsYXAoY29uc3QgaW50ZXJ2YWw8VCwgUG9saWNpZXMxPiYgeCwNCiAgICAgICAgICAgICBjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llczI+JiB5KQ0Kew0KICBpZiAoaW50ZXJ2YWxfbGliOjpkZXRhaWw6OnRlc3RfaW5wdXQoeCwgeSkpIHJldHVybiBmYWxzZTsNCiAgcmV0dXJuICh4Lmxvd2VyKCkgPD0geS5sb3dlcigpICYmIHkubG93ZXIoKSA8PSB4LnVwcGVyKCkpIHx8DQogICAgICAgICAoeS5sb3dlcigpIDw9IHgubG93ZXIoKSAmJiB4Lmxvd2VyKCkgPD0geS51cHBlcigpKTsNCn0NCg0KdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQ0KYm9vbCBzaW5nbGV0b24oY29uc3QgaW50ZXJ2YWw8VCwgUG9saWNpZXM+JiB4KQ0Kew0KIHJldHVybiAhZW1wdHkoeCkgJiYgeC5sb3dlcigpID09IHgudXBwZXIoKTsNCn0NCg0KdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXMxLCBjbGFzcyBQb2xpY2llczI+IGlubGluZQ0KYm9vbCBlcXVhbChjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llczE+JiB4LCBjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llczI+JiB5KQ0Kew0KICBpZiAoZW1wdHkoeCkpIHJldHVybiBlbXB0eSh5KTsNCiAgcmV0dXJuICFlbXB0eSh5KSAmJiB4Lmxvd2VyKCkgPT0geS5sb3dlcigpICYmIHgudXBwZXIoKSA9PSB5LnVwcGVyKCk7DQp9DQoNCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUNCmludGVydmFsPFQsIFBvbGljaWVzPiBpbnRlcnNlY3QoY29uc3QgaW50ZXJ2YWw8VCwgUG9saWNpZXM+JiB4LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llcz4mIHkpDQp7DQogIEJPT1NUX1VTSU5HX1NURF9NSU4oKTsNCiAgQk9PU1RfVVNJTkdfU1REX01BWCgpOw0KICBpZiAoaW50ZXJ2YWxfbGliOjpkZXRhaWw6OnRlc3RfaW5wdXQoeCwgeSkpDQogICAgcmV0dXJuIGludGVydmFsPFQsIFBvbGljaWVzPjo6ZW1wdHkoKTsNCiAgY29uc3QgVCYgbCA9IG1heCBCT09TVF9QUkVWRU5UX01BQ1JPX1NVQlNUSVRVVElPTih4Lmxvd2VyKCksIHkubG93ZXIoKSk7DQogIGNvbnN0IFQmIHUgPSBtaW4gQk9PU1RfUFJFVkVOVF9NQUNST19TVUJTVElUVVRJT04oeC51cHBlcigpLCB5LnVwcGVyKCkpOw0KICBpZiAobCA8PSB1KSByZXR1cm4gaW50ZXJ2YWw8VCwgUG9saWNpZXM+KGwsIHUsIHRydWUpOw0KICBlbHNlICAgICAgICByZXR1cm4gaW50ZXJ2YWw8VCwgUG9saWNpZXM+OjplbXB0eSgpOw0KfQ0KDQp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gaW5saW5lDQppbnRlcnZhbDxULCBQb2xpY2llcz4gaHVsbChjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llcz4mIHgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llcz4mIHkpDQp7DQogIEJPT1NUX1VTSU5HX1NURF9NSU4oKTsNCiAgQk9PU1RfVVNJTkdfU1REX01BWCgpOw0KICBib29sIGJhZF94ID0gaW50ZXJ2YWxfbGliOjpkZXRhaWw6OnRlc3RfaW5wdXQoeCk7DQogIGJvb2wgYmFkX3kgPSBpbnRlcnZhbF9saWI6OmRldGFpbDo6dGVzdF9pbnB1dCh5KTsNCiAgaWYgKGJhZF94KQ0KICAgIGlmIChiYWRfeSkgcmV0dXJuIGludGVydmFsPFQsIFBvbGljaWVzPjo6ZW1wdHkoKTsNCiAgICBlbHNlICAgICAgIHJldHVybiB5Ow0KICBlbHNlDQogICAgaWYgKGJhZF95KSByZXR1cm4geDsNCiAgcmV0dXJuIGludGVydmFsPFQsIFBvbGljaWVzPihtaW4gQk9PU1RfUFJFVkVOVF9NQUNST19TVUJTVElUVVRJT04oeC5sb3dlcigpLCB5Lmxvd2VyKCkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCBCT09TVF9QUkVWRU5UX01BQ1JPX1NVQlNUSVRVVElPTih4LnVwcGVyKCksIHkudXBwZXIoKSksIHRydWUpOw0KfQ0KDQp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gaW5saW5lDQppbnRlcnZhbDxULCBQb2xpY2llcz4gaHVsbChjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llcz4mIHgsIGNvbnN0IFQmIHkpDQp7DQogIEJPT1NUX1VTSU5HX1NURF9NSU4oKTsNCiAgQk9PU1RfVVNJTkdfU1REX01BWCgpOw0KICBib29sIGJhZF94ID0gaW50ZXJ2YWxfbGliOjpkZXRhaWw6OnRlc3RfaW5wdXQoeCk7DQogIGJvb2wgYmFkX3kgPSBpbnRlcnZhbF9saWI6OmRldGFpbDo6dGVzdF9pbnB1dDxULCBQb2xpY2llcz4oeSk7DQogIGlmIChiYWRfeSkNCiAgICBpZiAoYmFkX3gpIHJldHVybiBpbnRlcnZhbDxULCBQb2xpY2llcz46OmVtcHR5KCk7DQogICAgZWxzZSAgICAgICByZXR1cm4geDsNCiAgZWxzZQ0KICAgIGlmIChiYWRfeCkgcmV0dXJuIGludGVydmFsPFQsIFBvbGljaWVzPih5LCB5LCB0cnVlKTsNCiAgcmV0dXJuIGludGVydmFsPFQsIFBvbGljaWVzPihtaW4gQk9PU1RfUFJFVkVOVF9NQUNST19TVUJTVElUVVRJT04oeC5sb3dlcigpLCB5KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXggQk9PU1RfUFJFVkVOVF9NQUNST19TVUJTVElUVVRJT04oeC51cHBlcigpLCB5KSwgdHJ1ZSk7DQp9DQoNCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUNCmludGVydmFsPFQsIFBvbGljaWVzPiBodWxsKGNvbnN0IFQmIHgsIGNvbnN0IGludGVydmFsPFQsIFBvbGljaWVzPiYgeSkNCnsNCiAgQk9PU1RfVVNJTkdfU1REX01JTigpOw0KICBCT09TVF9VU0lOR19TVERfTUFYKCk7DQogIGJvb2wgYmFkX3ggPSBpbnRlcnZhbF9saWI6OmRldGFpbDo6dGVzdF9pbnB1dDxULCBQb2xpY2llcz4oeCk7DQogIGJvb2wgYmFkX3kgPSBpbnRlcnZhbF9saWI6OmRldGFpbDo6dGVzdF9pbnB1dCh5KTsNCiAgaWYgKGJhZF94KQ0KICAgIGlmIChiYWRfeSkgcmV0dXJuIGludGVydmFsPFQsIFBvbGljaWVzPjo6ZW1wdHkoKTsNCiAgICBlbHNlICAgICAgIHJldHVybiB5Ow0KICBlbHNlDQogICAgaWYgKGJhZF95KSByZXR1cm4gaW50ZXJ2YWw8VCwgUG9saWNpZXM+KHgsIHgsIHRydWUpOw0KICByZXR1cm4gaW50ZXJ2YWw8VCwgUG9saWNpZXM+KG1pbiBCT09TVF9QUkVWRU5UX01BQ1JPX1NVQlNUSVRVVElPTih4LCB5Lmxvd2VyKCkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCBCT09TVF9QUkVWRU5UX01BQ1JPX1NVQlNUSVRVVElPTih4LCB5LnVwcGVyKCkpLCB0cnVlKTsNCn0NCg0KdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lDQppbnRlcnZhbDxUPiBodWxsKGNvbnN0IFQmIHgsIGNvbnN0IFQmIHkpDQp7DQogIHJldHVybiBpbnRlcnZhbDxUPjo6aHVsbCh4LCB5KTsNCn0NCg0KdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQ0Kc3RkOjpwYWlyPGludGVydmFsPFQsIFBvbGljaWVzPiwgaW50ZXJ2YWw8VCwgUG9saWNpZXM+ID4NCmJpc2VjdChjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llcz4mIHgpDQp7DQogIHR5cGVkZWYgaW50ZXJ2YWw8VCwgUG9saWNpZXM+IEk7DQogIGlmIChpbnRlcnZhbF9saWI6OmRldGFpbDo6dGVzdF9pbnB1dCh4KSkNCiAgICByZXR1cm4gc3RkOjpwYWlyPEksST4oSTo6ZW1wdHkoKSwgSTo6ZW1wdHkoKSk7DQogIGNvbnN0IFQgbSA9IG1lZGlhbih4KTsNCiAgcmV0dXJuIHN0ZDo6cGFpcjxJLEk+KEkoeC5sb3dlcigpLCBtLCB0cnVlKSwgSShtLCB4LnVwcGVyKCksIHRydWUpKTsNCn0NCg0KLyoNCiAqIEVsZW1lbnRhcnkgZnVuY3Rpb25zDQogKi8NCg0KdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQ0KVCBub3JtKGNvbnN0IGludGVydmFsPFQsIFBvbGljaWVzPiYgeCkNCnsNCiAgdHlwZWRlZiBpbnRlcnZhbDxULCBQb2xpY2llcz4gSTsNCiAgaWYgKGludGVydmFsX2xpYjo6ZGV0YWlsOjp0ZXN0X2lucHV0KHgpKSB7DQogICAgdHlwZWRlZiB0eXBlbmFtZSBQb2xpY2llczo6Y2hlY2tpbmcgY2hlY2tpbmc7DQogICAgcmV0dXJuIGNoZWNraW5nOjpuYW4oKTsNCiAgfQ0KICBCT09TVF9VU0lOR19TVERfTUFYKCk7DQogIHJldHVybiBtYXggQk9PU1RfUFJFVkVOVF9NQUNST19TVUJTVElUVVRJT04oc3RhdGljX2Nhc3Q8VD4oLXgubG93ZXIoKSksIHgudXBwZXIoKSk7DQp9DQoNCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUNCmludGVydmFsPFQsIFBvbGljaWVzPiBhYnMoY29uc3QgaW50ZXJ2YWw8VCwgUG9saWNpZXM+JiB4KQ0Kew0KICB0eXBlZGVmIGludGVydmFsPFQsIFBvbGljaWVzPiBJOw0KICBpZiAoaW50ZXJ2YWxfbGliOjpkZXRhaWw6OnRlc3RfaW5wdXQoeCkpDQogICAgcmV0dXJuIEk6OmVtcHR5KCk7DQogIGlmICghaW50ZXJ2YWxfbGliOjp1c2VyOjppc19uZWcoeC5sb3dlcigpKSkgcmV0dXJuIHg7DQogIGlmICghaW50ZXJ2YWxfbGliOjp1c2VyOjppc19wb3MoeC51cHBlcigpKSkgcmV0dXJuIC14Ow0KICBCT09TVF9VU0lOR19TVERfTUFYKCk7DQogIHJldHVybiBJKHN0YXRpY19jYXN0PFQ+KDApLCBtYXggQk9PU1RfUFJFVkVOVF9NQUNST19TVUJTVElUVVRJT04oc3RhdGljX2Nhc3Q8VD4oLXgubG93ZXIoKSksIHgudXBwZXIoKSksIHRydWUpOw0KfQ0KDQp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBQb2xpY2llcz4gaW5saW5lDQppbnRlcnZhbDxULCBQb2xpY2llcz4gbWF4IEJPT1NUX1BSRVZFTlRfTUFDUk9fU1VCU1RJVFVUSU9OIChjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llcz4mIHgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlcnZhbDxULCBQb2xpY2llcz4mIHkpDQp7DQogIHR5cGVkZWYgaW50ZXJ2YWw8VCwgUG9saWNpZXM+IEk7DQogIGlmIChpbnRlcnZhbF9saWI6OmRldGFpbDo6dGVzdF9pbnB1dCh4LCB5KSkNCiAgICByZXR1cm4gSTo6ZW1wdHkoKTsNCiAgQk9PU1RfVVNJTkdfU1REX01BWCgpOw0KICByZXR1cm4gSShtYXggQk9PU1RfUFJFVkVOVF9NQUNST19TVUJTVElUVVRJT04oeC5sb3dlcigpLCB5Lmxvd2VyKCkpLCBtYXggQk9PU1RfUFJFVkVOVF9NQUNST19TVUJTVElUVVRJT04oeC51cHBlcigpLCB5LnVwcGVyKCkpLCB0cnVlKTsNCn0NCg0KdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQ0KaW50ZXJ2YWw8VCwgUG9saWNpZXM+IG1heCBCT09TVF9QUkVWRU5UX01BQ1JPX1NVQlNUSVRVVElPTiAoY29uc3QgaW50ZXJ2YWw8VCwgUG9saWNpZXM+JiB4LCBjb25zdCBUJiB5KQ0Kew0KICB0eXBlZGVmIGludGVydmFsPFQsIFBvbGljaWVzPiBJOw0KICBpZiAoaW50ZXJ2YWxfbGliOjpkZXRhaWw6OnRlc3RfaW5wdXQoeCwgeSkpDQogICAgcmV0dXJuIEk6OmVtcHR5KCk7DQogIEJPT1NUX1VTSU5HX1NURF9NQVgoKTsNCiAgcmV0dXJuIEkobWF4IEJPT1NUX1BSRVZFTlRfTUFDUk9fU1VCU1RJVFVUSU9OKHgubG93ZXIoKSwgeSksIG1heCBCT09TVF9QUkVWRU5UX01BQ1JPX1NVQlNUSVRVVElPTih4LnVwcGVyKCksIHkpLCB0cnVlKTsNCn0NCg0KdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQ0KaW50ZXJ2YWw8VCwgUG9saWNpZXM+IG1heCBCT09TVF9QUkVWRU5UX01BQ1JPX1NVQlNUSVRVVElPTiAoY29uc3QgVCYgeCwgY29uc3QgaW50ZXJ2YWw8VCwgUG9saWNpZXM+JiB5KQ0Kew0KICB0eXBlZGVmIGludGVydmFsPFQsIFBvbGljaWVzPiBJOw0KICBpZiAoaW50ZXJ2YWxfbGliOjpkZXRhaWw6OnRlc3RfaW5wdXQoeCwgeSkpDQogICAgcmV0dXJuIEk6OmVtcHR5KCk7DQogIEJPT1NUX1VTSU5HX1NURF9NQVgoKTsNCiAgcmV0dXJuIEkobWF4IEJPT1NUX1BSRVZFTlRfTUFDUk9fU1VCU1RJVFVUSU9OKHgsIHkubG93ZXIoKSksIG1heCBCT09TVF9QUkVWRU5UX01BQ1JPX1NVQlNUSVRVVElPTih4LCB5LnVwcGVyKCkpLCB0cnVlKTsNCn0NCg0KdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+IGlubGluZQ0KaW50ZXJ2YWw8VCwgUG9saWNpZXM+IG1pbiBCT09TVF9QUkVWRU5UX01BQ1JPX1NVQlNUSVRVVElPTiAoY29uc3QgaW50ZXJ2YWw8VCwgUG9saWNpZXM+JiB4LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXJ2YWw8VCwgUG9saWNpZXM+JiB5KQ0Kew0KICB0eXBlZGVmIGludGVydmFsPFQsIFBvbGljaWVzPiBJOw0KICBpZiAoaW50ZXJ2YWxfbGliOjpkZXRhaWw6OnRlc3RfaW5wdXQoeCwgeSkpDQogICAgcmV0dXJuIEk6OmVtcHR5KCk7DQogIEJPT1NUX1VTSU5HX1NURF9NSU4oKTsNCiAgcmV0dXJuIEkobWluIEJPT1NUX1BSRVZFTlRfTUFDUk9fU1VCU1RJVFVUSU9OKHgubG93ZXIoKSwgeS5sb3dlcigpKSwgbWluIEJPT1NUX1BSRVZFTlRfTUFDUk9fU1VCU1RJVFVUSU9OKHgudXBwZXIoKSwgeS51cHBlcigpKSwgdHJ1ZSk7DQp9DQoNCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUNCmludGVydmFsPFQsIFBvbGljaWVzPiBtaW4gQk9PU1RfUFJFVkVOVF9NQUNST19TVUJTVElUVVRJT04gKGNvbnN0IGludGVydmFsPFQsIFBvbGljaWVzPiYgeCwgY29uc3QgVCYgeSkNCnsNCiAgdHlwZWRlZiBpbnRlcnZhbDxULCBQb2xpY2llcz4gSTsNCiAgaWYgKGludGVydmFsX2xpYjo6ZGV0YWlsOjp0ZXN0X2lucHV0KHgsIHkpKQ0KICAgIHJldHVybiBJOjplbXB0eSgpOw0KICBCT09TVF9VU0lOR19TVERfTUlOKCk7DQogIHJldHVybiBJKG1pbiBCT09TVF9QUkVWRU5UX01BQ1JPX1NVQlNUSVRVVElPTih4Lmxvd2VyKCksIHkpLCBtaW4gQk9PU1RfUFJFVkVOVF9NQUNST19TVUJTVElUVVRJT04oeC51cHBlcigpLCB5KSwgdHJ1ZSk7DQp9DQoNCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFBvbGljaWVzPiBpbmxpbmUNCmludGVydmFsPFQsIFBvbGljaWVzPiBtaW4gQk9PU1RfUFJFVkVOVF9NQUNST19TVUJTVElUVVRJT04gKGNvbnN0IFQmIHgsIGNvbnN0IGludGVydmFsPFQsIFBvbGljaWVzPiYgeSkNCnsNCiAgdHlwZWRlZiBpbnRlcnZhbDxULCBQb2xpY2llcz4gSTsNCiAgaWYgKGludGVydmFsX2xpYjo6ZGV0YWlsOjp0ZXN0X2lucHV0KHgsIHkpKQ0KICAgIHJldHVybiBJOjplbXB0eSgpOw0KICBCT09TVF9VU0lOR19TVERfTUlOKCk7DQogIHJldHVybiBJKG1pbiBCT09TVF9QUkVWRU5UX01BQ1JPX1NVQlNUSVRVVElPTih4LCB5Lmxvd2VyKCkpLCBtaW4gQk9PU1RfUFJFVkVOVF9NQUNST19TVUJTVElUVVRJT04oeCwgeS51cHBlcigpKSwgdHJ1ZSk7DQp9DQoNCn0gLy8gbmFtZXNwYWNlIG51bWVyaWMNCn0gLy8gbmFtZXNwYWNlIGJvb3N0DQoNCiNlbmRpZiAvLyBCT09TVF9OVU1FUklDX0lOVEVSVkFMX1VUSUxJVFlfSFBQDQo=