LyoqIEBmaWxlDQogIEhPQiBMaWJyYXJ5Lg0KDQogIENvcHlyaWdodCAoYykgMjAwNiwgSW50ZWwgQ29ycG9yYXRpb248QlI+DQogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCiAgYXJlIGxpY2Vuc2VkIGFuZCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEJTRCBMaWNlbnNlDQogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAgVGhlIGZ1bGwgdGV4dCBvZiB0aGUgbGljZW5zZSBtYXkgYmUgZm91bmQgYXQNCiAgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocA0KDQogIFRIRSBQUk9HUkFNIElTIERJU1RSSUJVVEVEIFVOREVSIFRIRSBCU0QgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLA0KICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELg0KDQogIE1vZHVsZSBOYW1lOiAgSG9iTGliLmMNCg0KKiovDQoNCg0KDQpTVEFUSUMgVk9JRCAgKm1Ib2JMaXN0ID0gTlVMTDsNCg0KLyoqDQogIFRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBjYWNoZXMgdGhlIHBvaW50ZXIgdG8gSE9CIGxpc3QuDQogIA0KICBUaGUgY29uc3RydWN0b3IgZnVuY3Rpb24gZ2V0cyB0aGUgc3RhcnQgYWRkcmVzcyBvZiBIT0IgbGlzdCBmcm9tIHN5c3RlbSBjb25maWd1cmF0aW9uIHRhYmxlLg0KICBJdCB3aWxsIEFTU0VSVCgpIGlmIHRoYXQgb3BlcmF0aW9uIGZhaWxzIGFuZCBpdCB3aWxsIGFsd2F5cyByZXR1cm4gRUZJX1NVQ0NFU1MuIA0KDQogIEBwYXJhbSAgSW1hZ2VIYW5kbGUgICBUaGUgZmlybXdhcmUgYWxsb2NhdGVkIGhhbmRsZSBmb3IgdGhlIEVGSSBpbWFnZS4NCiAgQHBhcmFtICBTeXN0ZW1UYWJsZSAgIEEgcG9pbnRlciB0byB0aGUgRUZJIFN5c3RlbSBUYWJsZS4NCiAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICBUaGUgY29uc3RydWN0b3IgYWx3YXlzIHJldHVybnMgRUZJX1NVQ0NFU1MuDQoNCioqLw0KRUZJX1NUQVRVUw0KRUZJQVBJDQpIb2JMaWJDb25zdHJ1Y3RvciAoDQogIElOIEVGSV9IQU5ETEUgICAgICAgIEltYWdlSGFuZGxlLA0KICBJTiBFRklfU1lTVEVNX1RBQkxFICAqU3lzdGVtVGFibGUNCiAgKQ0Kew0KICBFRklfU1RBVFVTICBTdGF0dXM7DQoNCiAgU3RhdHVzID0gRWZpR2V0U3lzdGVtQ29uZmlndXJhdGlvblRhYmxlICgmZ0VmaUhvYkxpc3RHdWlkLCAmbUhvYkxpc3QpOw0KICBBU1NFUlRfRUZJX0VSUk9SIChTdGF0dXMpOw0KICBBU1NFUlQgKG1Ib2JMaXN0ICE9IE5VTEwpOw0KICByZXR1cm4gU3RhdHVzOw0KfQ0KDQovKioNCiAgUmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgSE9CIGxpc3QuDQoNCiAgTm9uZS4NCg0KICBUaGUgcG9pbnRlciB0byB0aGUgSE9CIGxpc3QuDQoNCioqLw0KVk9JRCAqDQpFRklBUEkNCkdldEhvYkxpc3QgKA0KICBWT0lEDQogICkNCnsNCiAgcmV0dXJuIG1Ib2JMaXN0Ow0KfQ0KDQovKioNCiAgVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgYSBIT0IgdHlwZSBmcm9tIHRoZSBzdGFydGluZyBIT0IgcG9pbnRlci4gDQogIElmIHRoZXJlIGRvZXMgbm90IGV4aXN0IHN1Y2ggSE9CIHR5cGUgZnJvbSB0aGUgc3RhcnRpbmcgSE9CIHBvaW50ZXIsIGl0IHdpbGwgcmV0dXJuIE5VTEwuIA0KDQogIEBwYXJhbSAgVHlwZSBUaGUgSE9CIHR5cGUgdG8gcmV0dXJuLg0KICBAcGFyYW0gIEhvYlN0YXJ0IFRoZSBzdGFydGluZyBIT0IgcG9pbnRlciB0byBzZWFyY2ggZnJvbS4NCg0KICBAcmV0dXJuIFRoZSBuZXh0IGluc3RhbmNlIG9mIGEgSE9CIHR5cGUgZnJvbSB0aGUgc3RhcnRpbmcgSE9CLg0KDQoqKi8NClZPSUQgKg0KRUZJQVBJDQpHZXROZXh0SG9iICgNCiAgSU4gVUlOVDE2ICAgICAgICAgICAgICAgICBUeXBlLA0KICBJTiBDT05TVCBWT0lEICAgICAgICAgICAgICpIb2JTdGFydA0KICApDQp7DQogIEVGSV9QRUlfSE9CX1BPSU5URVJTICBIb2I7DQoNCiAgQVNTRVJUIChIb2JTdGFydCAhPSBOVUxMKTsNCiAgIA0KICBIb2IuUmF3ID0gKFVJTlQ4ICopIEhvYlN0YXJ0Ow0KICAvLw0KICAvLyBQYXJzZSB0aGUgSE9CIGxpc3QsIHN0b3AgaWYgZW5kIG9mIGxpc3Qgb3IgbWF0Y2hpbmcgdHlwZSBmb3VuZC4NCiAgLy8NCiAgd2hpbGUgKCFFTkRfT0ZfSE9CX0xJU1QgKEhvYikpIHsNCiAgICBpZiAoSG9iLkhlYWRlci0+SG9iVHlwZSA9PSBUeXBlKSB7DQogICAgICByZXR1cm4gSG9iLlJhdzsNCiAgICB9DQogICAgSG9iLlJhdyA9IEdFVF9ORVhUX0hPQiAoSG9iKTsNCiAgfQ0KICByZXR1cm4gTlVMTDsNCn0NCg0KLyoqDQogIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGEgSE9CIHR5cGUgYW1vbmcgdGhlIHdob2xlIEhPQiBsaXN0LiANCiAgSWYgdGhlcmUgZG9lcyBub3QgZXhpc3Qgc3VjaCBIT0IgdHlwZSBpbiB0aGUgSE9CIGxpc3QsIGl0IHdpbGwgcmV0dXJuIE5VTEwuIA0KDQogIEBwYXJhbSAgVHlwZSBUaGUgSE9CIHR5cGUgdG8gcmV0dXJuLg0KDQogIEByZXR1cm4gVGhlIG5leHQgaW5zdGFuY2Ugb2YgYSBIT0IgdHlwZSBmcm9tIHRoZSBzdGFydGluZyBIT0IuDQoNCioqLw0KVk9JRCAqDQpFRklBUEkNCkdldEZpcnN0SG9iICgNCiAgSU4gVUlOVDE2ICAgICAgICAgICAgICAgICBUeXBlDQogICkNCnsNCiAgVk9JRCAgICAgICpIb2JMaXN0Ow0KDQogIEhvYkxpc3QgPSBHZXRIb2JMaXN0ICgpOw0KICByZXR1cm4gR2V0TmV4dEhvYiAoVHlwZSwgSG9iTGlzdCk7DQp9DQoNCi8qKg0KICBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBhIEhPQiBmcm9tIHRoZSBzdGFydGluZyBIT0IgcG9pbnRlci4gDQogIFN1Y2ggSE9CIHNob3VsZCBzYXRpc2Z5IHR3byBjb25kaXRpb25zOiANCiAgaXRzIEhPQiB0eXBlIGlzIEVGSV9IT0JfVFlQRV9HVUlEX0VYVEVOU0lPTiBhbmQgaXRzIEdVSUQgTmFtZSBlcXVhbHMgdG8gdGhlIGlucHV0IEd1aWQuIA0KICBJZiB0aGVyZSBkb2VzIG5vdCBleGlzdCBzdWNoIEhPQiBmcm9tIHRoZSBzdGFydGluZyBIT0IgcG9pbnRlciwgaXQgd2lsbCByZXR1cm4gTlVMTC4gDQoNCiAgQHBhcmFtICBHdWlkIFRoZSBHVUlEIHRvIG1hdGNoIHdpdGggaW4gdGhlIEhPQiBsaXN0Lg0KICBAcGFyYW0gIEhvYlN0YXJ0IEEgcG9pbnRlciB0byBhIEd1aWQuDQoNCiAgQHJldHVybiBUaGUgbmV4dCBpbnN0YW5jZSBvZiB0aGUgbWF0Y2hlZCBHVUlEIEhPQiBmcm9tIHRoZSBzdGFydGluZyBIT0IuDQoNCioqLw0KVk9JRCAqDQpFRklBUEkNCkdldE5leHRHdWlkSG9iICgNCiAgSU4gQ09OU1QgRUZJX0dVSUQgICAgICAgICAqR3VpZCwNCiAgSU4gQ09OU1QgVk9JRCAgICAgICAgICAgICAqSG9iU3RhcnQNCiAgKQ0Kew0KICBFRklfUEVJX0hPQl9QT0lOVEVSUyAgR3VpZEhvYjsNCg0KICBHdWlkSG9iLlJhdyA9IChVSU5UOCAqKSBIb2JTdGFydDsNCiAgd2hpbGUgKChHdWlkSG9iLlJhdyA9IEdldE5leHRIb2IgKEVGSV9IT0JfVFlQRV9HVUlEX0VYVEVOU0lPTiwgR3VpZEhvYi5SYXcpKSAhPSBOVUxMKSB7DQogICAgaWYgKENvbXBhcmVHdWlkIChHdWlkLCAmR3VpZEhvYi5HdWlkLT5OYW1lKSkgew0KICAgICAgYnJlYWs7DQogICAgfQ0KICAgIEd1aWRIb2IuUmF3ID0gR0VUX05FWFRfSE9CIChHdWlkSG9iKTsNCiAgfQ0KICByZXR1cm4gR3VpZEhvYi5SYXc7DQp9DQoNCi8qKg0KICBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBhIEhPQiBhbW9uZyB0aGUgd2hvbGUgSE9CIGxpc3QuIA0KICBTdWNoIEhPQiBzaG91bGQgc2F0aXNmeSB0d28gY29uZGl0aW9uczoNCiAgaXRzIEhPQiB0eXBlIGlzIEVGSV9IT0JfVFlQRV9HVUlEX0VYVEVOU0lPTiBhbmQgaXRzIEdVSUQgTmFtZSBlcXVhbHMgdG8gdGhlIGlucHV0IEd1aWQuDQogIElmIHRoZXJlIGRvZXMgbm90IGV4aXN0IHN1Y2ggSE9CIGZyb20gdGhlIHN0YXJ0aW5nIEhPQiBwb2ludGVyLCBpdCB3aWxsIHJldHVybiBOVUxMLg0KDQogIEBwYXJhbSAgR3VpZCBUaGUgR1VJRCB0byBtYXRjaCB3aXRoIGluIHRoZSBIT0IgbGlzdC4NCg0KICBAcmV0dXJuIFRoZSBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgbWF0Y2hlZCBHVUlEIEhPQiBhbW9uZyB0aGUgd2hvbGUgSE9CIGxpc3QuDQoNCioqLw0KVk9JRCAqDQpFRklBUEkNCkdldEZpcnN0R3VpZEhvYiAoDQogIElOIENPTlNUIEVGSV9HVUlEICAgICAgICAgKkd1aWQNCiAgKQ0Kew0KICBWT0lEICAgICAgKkhvYkxpc3Q7DQoNCiAgSG9iTGlzdCA9IEdldEhvYkxpc3QgKCk7DQogIHJldHVybiBHZXROZXh0R3VpZEhvYiAoR3VpZCwgSG9iTGlzdCk7DQp9DQoNCi8qKg0KICBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyBhIEhPQiBmb3IgYSBsb2FkZWQgUEUzMiBtb2R1bGUuDQoNCiAgQHBhcmFtICBNb2R1bGVOYW1lIFRoZSBHVUlEIEZpbGUgTmFtZSBvZiB0aGUgbW9kdWxlLg0KICBAcGFyYW0gIE1lbW9yeUFsbG9jYXRpb25Nb2R1bGUgVGhlIDY0IGJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBtb2R1bGUuDQogIEBwYXJhbSAgTW9kdWxlTGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIG1vZHVsZSBpbiBieXRlcy4NCiAgQHBhcmFtICBFbnRyeVBvaW50IFRoZSA2NCBiaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgbW9kdWxlknMgZW50cnkgcG9pbnQuDQoNCioqLw0KVk9JRA0KRUZJQVBJDQpCdWlsZE1vZHVsZUhvYiAoDQogIElOIENPTlNUIEVGSV9HVUlEICAgICAgICAgKk1vZHVsZU5hbWUsDQogIElOIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgTWVtb3J5QWxsb2NhdGlvbk1vZHVsZSwNCiAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgICBNb2R1bGVMZW5ndGgsDQogIElOIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgRW50cnlQb2ludA0KICApDQp7DQogIC8vDQogIC8vIFBFSSBIT0IgaXMgcmVhZCBvbmx5IGZvciBEWEUgcGhhc2UNCiAgLy8NCiAgQVNTRVJUIChGQUxTRSk7DQp9DQoNCi8qKg0KICBCdWlsZHMgYSBIT0IgdGhhdCBkZXNjcmliZXMgYSBjaHVuayBvZiBzeXN0ZW0gbWVtb3J5Lg0KDQogIEBwYXJhbSAgUmVzb3VyY2VUeXBlIFRoZSB0eXBlIG9mIHJlc291cmNlIGRlc2NyaWJlZCBieSB0aGlzIEhPQi4NCiAgQHBhcmFtICBSZXNvdXJjZUF0dHJpYnV0ZSBUaGUgcmVzb3VyY2UgYXR0cmlidXRlcyBvZiB0aGUgbWVtb3J5IGRlc2NyaWJlZCBieSB0aGlzIEhPQi4NCiAgQHBhcmFtICBQaHlzaWNhbFN0YXJ0IFRoZSA2NCBiaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBtZW1vcnkgZGVzY3JpYmVkIGJ5IHRoaXMgSE9CLg0KICBAcGFyYW0gIE51bWJlck9mQnl0ZXMgVGhlIGxlbmd0aCBvZiB0aGUgbWVtb3J5IGRlc2NyaWJlZCBieSB0aGlzIEhPQiBpbiBieXRlcy4NCg0KKiovDQpWT0lEDQpFRklBUEkNCkJ1aWxkUmVzb3VyY2VEZXNjcmlwdG9ySG9iICgNCiAgSU4gRUZJX1JFU09VUkNFX1RZUEUgICAgICAgICAgICBSZXNvdXJjZVR5cGUsDQogIElOIEVGSV9SRVNPVVJDRV9BVFRSSUJVVEVfVFlQRSAgUmVzb3VyY2VBdHRyaWJ1dGUsDQogIElOIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgICAgICAgUGh5c2ljYWxTdGFydCwNCiAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJPZkJ5dGVzDQogICkNCnsNCiAgLy8NCiAgLy8gUEVJIEhPQiBpcyByZWFkIG9ubHkgZm9yIERYRSBwaGFzZQ0KICAvLw0KICBBU1NFUlQgKEZBTFNFKTsNCn0NCg0KLyoqDQogIFRoaXMgZnVuY3Rpb24gYnVpbGRzIGEgY3VzdG9taXplZCBIT0IgdGFnZ2VkIHdpdGggYSBHVUlEIGZvciBpZGVudGlmaWNhdGlvbiANCiAgYW5kIHJldHVybnMgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgR1VJRCBIT0IgZGF0YSBzbyB0aGF0IGNhbGxlciBjYW4gZmlsbCB0aGUgY3VzdG9taXplZCBkYXRhLiANCg0KICBAcGFyYW0gIEd1aWQgVGhlIEdVSUQgdG8gdGFnIHRoZSBjdXN0b21pemVkIEhPQi4NCiAgQHBhcmFtICBEYXRhTGVuZ3RoIFRoZSBzaXplIG9mIHRoZSBkYXRhIHBheWxvYWQgZm9yIHRoZSBHVUlEIEhPQi4NCg0KICBAcmV0dXJuIFRoZSBzdGFydCBhZGRyZXNzIG9mIEdVSUQgSE9CIGRhdGEuDQoNCioqLw0KVk9JRCAqDQpFRklBUEkNCkJ1aWxkR3VpZEhvYiAoDQogIElOIENPTlNUIEVGSV9HVUlEICAgICAgICAgICAgICAqR3VpZCwNCiAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgICAgIERhdGFMZW5ndGgNCiAgKQ0Kew0KICAvLw0KICAvLyBQRUkgSE9CIGlzIHJlYWQgb25seSBmb3IgRFhFIHBoYXNlDQogIC8vDQogIEFTU0VSVCAoRkFMU0UpOw0KICByZXR1cm4gTlVMTDsNCn0NCg0KLyoqDQogIFRoaXMgZnVuY3Rpb24gYnVpbGRzIGEgY3VzdG9taXplZCBIT0IgdGFnZ2VkIHdpdGggYSBHVUlEIGZvciBpZGVudGlmaWNhdGlvbiwgDQogIGNvcGllcyB0aGUgaW5wdXQgZGF0YSB0byB0aGUgSE9CIGRhdGEgZmllbGQsIGFuZCByZXR1cm5zIHRoZSBzdGFydCBhZGRyZXNzIG9mIEdVSUQgSE9CIGRhdGEuDQoNCiAgQHBhcmFtICBHdWlkIFRoZSBHVUlEIHRvIHRhZyB0aGUgY3VzdG9taXplZCBIT0IuDQogIEBwYXJhbSAgRGF0YSBUaGUgZGF0YSB0byBiZSBjb3BpZWQgaW50byB0aGUgZGF0YSBmaWVsZCBvZiB0aGUgR1VJRCBIT0IuDQogIEBwYXJhbSAgRGF0YUxlbmd0aCBUaGUgc2l6ZSBvZiB0aGUgZGF0YSBwYXlsb2FkIGZvciB0aGUgR1VJRCBIT0IuDQoNCiAgQHJldHVybiBUaGUgc3RhcnQgYWRkcmVzcyBvZiBHVUlEIEhPQiBkYXRhLg0KDQoqKi8NClZPSUQgKg0KRUZJQVBJDQpCdWlsZEd1aWREYXRhSG9iICgNCiAgSU4gQ09OU1QgRUZJX0dVSUQgICAgICAgICAgICAgICpHdWlkLA0KICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgKkRhdGEsDQogIElOIFVJTlROICAgICAgICAgICAgICAgICAgICAgICBEYXRhTGVuZ3RoDQogICkNCnsNCiAgLy8NCiAgLy8gUEVJIEhPQiBpcyByZWFkIG9ubHkgZm9yIERYRSBwaGFzZQ0KICAvLw0KICBBU1NFUlQgKEZBTFNFKTsNCiAgcmV0dXJuIE5VTEw7DQp9DQoNCi8qKg0KICBCdWlsZHMgYSBGaXJtd2FyZSBWb2x1bWUgSE9CLg0KDQogIEBwYXJhbSAgQmFzZUFkZHJlc3MgVGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgRmlybXdhcmUgVm9sdW1lLg0KICBAcGFyYW0gIExlbmd0aCBUaGUgc2l6ZSBvZiB0aGUgRmlybXdhcmUgVm9sdW1lIGluIGJ5dGVzLg0KDQoqKi8NClZPSUQNCkVGSUFQSQ0KQnVpbGRGdkhvYiAoDQogIElOIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgICAgICBCYXNlQWRkcmVzcywNCiAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgIExlbmd0aA0KICApDQp7DQogIC8vDQogIC8vIFBFSSBIT0IgaXMgcmVhZCBvbmx5IGZvciBEWEUgcGhhc2UNCiAgLy8NCiAgQVNTRVJUIChGQUxTRSk7DQp9DQoNCi8qKg0KICBCdWlsZHMgYSBDYXBzdWxlIFZvbHVtZSBIT0IuDQoNCiAgQHBhcmFtICBCYXNlQWRkcmVzcyBUaGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBDYXBzdWxlIFZvbHVtZS4NCiAgQHBhcmFtICBMZW5ndGggVGhlIHNpemUgb2YgdGhlIENhcHN1bGUgVm9sdW1lIGluIGJ5dGVzLg0KDQoqKi8NClZPSUQNCkVGSUFQSQ0KQnVpbGRDdkhvYiAoDQogIElOIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgICAgICBCYXNlQWRkcmVzcywNCiAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgIExlbmd0aA0KICApDQp7DQogIC8vDQogIC8vIFBFSSBIT0IgaXMgcmVhZCBvbmx5IGZvciBEWEUgcGhhc2UNCiAgLy8NCiAgQVNTRVJUIChGQUxTRSk7DQp9DQoNCi8qKg0KICBCdWlsZHMgYSBIT0IgZm9yIHRoZSBDUFUuDQoNCiAgQHBhcmFtICBTaXplT2ZNZW1vcnlTcGFjZSBUaGUgbWF4aW11bSBwaHlzaWNhbCBtZW1vcnkgYWRkcmVzc2FiaWxpdHkgb2YgdGhlIHByb2Nlc3Nvci4NCiAgQHBhcmFtICBTaXplT2ZJb1NwYWNlIFRoZSBtYXhpbXVtIHBoeXNpY2FsIEkvTyBhZGRyZXNzYWJpbGl0eSBvZiB0aGUgcHJvY2Vzc29yLg0KDQoqKi8NClZPSUQNCkVGSUFQSQ0KQnVpbGRDcHVIb2IgKA0KICBJTiBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgU2l6ZU9mTWVtb3J5U3BhY2UsDQogIElOIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICBTaXplT2ZJb1NwYWNlDQogICkNCnsNCiAgLy8NCiAgLy8gUEVJIEhPQiBpcyByZWFkIG9ubHkgZm9yIERYRSBwaGFzZQ0KICAvLw0KICBBU1NFUlQgKEZBTFNFKTsNCn0NCg0KLyoqDQogIEJ1aWxkcyBhIEhPQiBmb3IgdGhlIFN0YWNrLg0KDQogIEBwYXJhbSAgQmFzZUFkZHJlc3MgVGhlIDY0IGJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBTdGFjay4NCiAgQHBhcmFtICBMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgc3RhY2sgaW4gYnl0ZXMuDQoNCioqLw0KVk9JRA0KRUZJQVBJDQpCdWlsZFN0YWNrSG9iICgNCiAgSU4gRUZJX1BIWVNJQ0FMX0FERFJFU1MgICAgICAgIEJhc2VBZGRyZXNzLA0KICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoDQogICkNCnsNCiAgLy8NCiAgLy8gUEVJIEhPQiBpcyByZWFkIG9ubHkgZm9yIERYRSBwaGFzZQ0KICAvLw0KICBBU1NFUlQgKEZBTFNFKTsNCn0NCg0KLyoqDQogIEJ1aWxkcyBhIEhPQiBmb3IgdGhlIEJTUCBzdG9yZS4NCg0KICBAcGFyYW0gIEJhc2VBZGRyZXNzIFRoZSA2NCBiaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgQlNQLg0KICBAcGFyYW0gIExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSBCU1Agc3RvcmUgaW4gYnl0ZXMuDQogIEBwYXJhbSAgTWVtb3J5VHlwZSBUeXBlIG9mIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhpcyBIT0IuDQoNCioqLw0KVk9JRA0KRUZJQVBJDQpCdWlsZEJzcFN0b3JlSG9iICgNCiAgSU4gRUZJX1BIWVNJQ0FMX0FERFJFU1MgICAgICAgIEJhc2VBZGRyZXNzLA0KICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoLA0KICBJTiBFRklfTUVNT1JZX1RZUEUgICAgICAgICAgICAgTWVtb3J5VHlwZQ0KICApDQp7DQogIC8vDQogIC8vIFBFSSBIT0IgaXMgcmVhZCBvbmx5IGZvciBEWEUgcGhhc2UNCiAgLy8NCiAgQVNTRVJUIChGQUxTRSk7DQp9DQoNCi8qKg0KICBCdWlsZHMgYSBIT0IgZm9yIHRoZSBtZW1vcnkgYWxsb2NhdGlvbi4NCg0KICBAcGFyYW0gIEJhc2VBZGRyZXNzIFRoZSA2NCBiaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgbWVtb3J5Lg0KICBAcGFyYW0gIExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBpbiBieXRlcy4NCiAgQHBhcmFtICBNZW1vcnlUeXBlIFR5cGUgb2YgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGlzIEhPQi4NCg0KKiovDQpWT0lEDQpFRklBUEkNCkJ1aWxkTWVtb3J5QWxsb2NhdGlvbkhvYiAoDQogIElOIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgICAgICBCYXNlQWRkcmVzcywNCiAgSU4gVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgIExlbmd0aCwNCiAgSU4gRUZJX01FTU9SWV9UWVBFICAgICAgICAgICAgIE1lbW9yeVR5cGUNCiAgKQ0Kew0KICAvLw0KICAvLyBQRUkgSE9CIGlzIHJlYWQgb25seSBmb3IgRFhFIHBoYXNlDQogIC8vDQogIEFTU0VSVCAoRkFMU0UpOw0KfQ0K