rO0ABXRRLWZ1bmMlfCFDb25kaXRpb258aWYgdGhlbiBlbHNlIGVuZDo6aWYgPENvbmRpdGlvbiBYPiB0aGVuIDxWYWx1ZSBZPiBlbHNlIDxWYWx1ZSBaPiBlbmQNCi0gQ29uZGl0aW9uYWwgY29uc3RydWN0DQoNCkUuZyBpZiBwZXJjZW50bW92ZShGRURfVVNEX0NOWSwwLC01KT4wLjA1IHRoZW4gMSBlbHNlIDAgZW5kIHJldHVybnMgMSB3aGVuIHBlcmNlbnR0YWdlIG1vdmUgb2YgcXVvdGUgRkVEX1VTRF9DTlkgb2YgY3VycmVudCByb3cgYWdhaW5zdCA1IHJvd3MgYmVmb3JlIGlzIGdyZWF0ZXIgdGhhbiA1JSBlbHNlIHJldHVybnMgMCV8IUN1cnZlfGF2Z19jdXJ2ZTo6YXZnX2N1cnZlKFN3YXAgb3IgRnV0dXJlcywgTnVtYmVyIG1vbnRocykNCi1SZXR1cm5zIHRoZSBhdmVyYWdlIG9mIHRoZSBjdXJ2ZSB3aXRoIG51bWJlciBvZiBtb250aHMgIHN0YXJ0aW5nIGZyb20gdGhlIHNwZWNpZmllZCBjdXJ2ZQ0KDQpFLmcuIGF2Z19jdXJ2ZShDT19GdXR1cmVzXzIwMTdGLkNsb3NlLDMpIHdpbGwgcmV0dXJuIHRoZSBKYW51YXJ5IHRvIE1hcmNoIDIwMTcgY3VydmUgcHJpY2VzJXwhQ3VydmV8bmV4dF9jdXJ2ZTo6bmV4dF9jdXJ2ZShTd2FwIG9yIEZ1dHVyZXMsIE51bWJlciBtb250aHMpDQotUmV0dXJucyB0aGUgZHluYW1pYyBjdXJ2ZSB3aXRoIG51bWJlciBvZiBtb250aHMgc3RhcnRpbmcgZnJvbSBub3cNCg0KRS5nLiBuZXh0X2N1cnZlKENPX0Z1dHVyZXNfMjAxN0YuQ2xvc2UsMykgb24gNSBKYW4gMjAxOCB3aWxsIHJldHVybiB0aGUgQXByaWwgMjAxOCBjdXJ2ZSBwcmljZXMlfCFDdXJ2ZXxuZXh0X2hhbGY6Om5leHRfaGFsZihTd2FwIG9yIEZ1dHVyZXMsIE51bWJlciBtb250aHMpDQotUmV0dXJucyB0aGUgZHluYW1pYyBhdmVyYWdlIGN1cnZlIHdpdGggbmV4dCBudW1iZXIgb2YgaGFsZiB5ZWFyIHN0YXJ0aW5nIGZyb20gbm93DQoNCkUuZy4gbmV4dF9oYWxmKENPX0Z1dHVyZXNfMjAxN0YuQ2xvc2UsMSkgb24gNSBGZWIgMjAxOCB3aWxsIHJldHVybiB0aGUgSDIgMjAxOSBjdXJ2ZSBwcmljZXMlfCFDdXJ2ZXxuZXh0X3F0cjo6bmV4dF9xdHIoU3dhcCBvciBGdXR1cmVzLCBOdW1iZXIgbW9udGhzKQ0KLVJldHVybnMgdGhlIGR5bmFtaWMgYXZlcmFnZSBjdXJ2ZSB3aXRoIG51bWJlciBvZiBxdWFydGVycyBzdGFydGluZyBmcm9tIG5vdw0KDQpFLmcuIG5leHRfcXRyKENPX0Z1dHVyZXNfMjAxN0YuQ2xvc2UsMSkgb24gNSBGZWIgMjAxOCB3aWxsIHJldHVybiB0aGUgUTIgMjAxOCBjdXJ2ZSBwcmljZXMlfCFDdXJ2ZXxuZXh0X3F1YXJ0ZXI6Om5leHRfcXVhcnRlcihTd2FwIG9yIEZ1dHVyZXMsIE51bWJlciBtb250aHMpDQotUmV0dXJucyB0aGUgZHluYW1pYyBhdmVyYWdlIGN1cnZlIHdpdGggbnVtYmVyIG9mIHF1YXJ0ZXJzIHN0YXJ0aW5nIGZyb20gbm93DQoNCkUuZy4gbmV4dF9xdWFydGVyKENPX0Z1dHVyZXNfMjAxN0YuQ2xvc2UsMSkgb24gNSBGZWIgMjAxOCB3aWxsIHJldHVybiB0aGUgUTIgMjAxOCBjdXJ2ZSBwcmljZXMlfCFDdXJ2ZXxuZXh0X3N1bW1lcjo6bmV4dF9zdW1tZXIoU3dhcCBvciBGdXR1cmVzLCBOdW1iZXIgbW9udGhzKQ0KLVJldHVybnMgdGhlIGR5bmFtaWMgYXZlcmFnZSBjdXJ2ZSB3aXRoIG51bWJlciBvZiBzdW1tZXJzIHN0YXJ0aW5nIGZyb20gbm93DQoNCkUuZy4gbmV4dF9zdW1tZXIoQ09fRnV0dXJlc18yMDE3Ri5DbG9zZSwxKSBvbiA1IEZlYiAyMDE4IHdpbGwgcmV0dXJuIHRoZSBTdW1tZXIgMjAxOCBjdXJ2ZSBwcmljZXMlfCFDdXJ2ZXxuZXh0X3dpbnRlcjo6bmV4dF93aW50ZXIoU3dhcCBvciBGdXR1cmVzLCBOdW1iZXIgbW9udGhzKQ0KLVJldHVybnMgdGhlIGR5bmFtaWMgYXZlcmFnZSBjdXJ2ZSB3aXRoIG51bWJlciBvZiB3aW50ZXJzIHN0YXJ0aW5nIGZyb20gbm93DQoNCkUuZy4gbmV4dF9oYWxmKENPX0Z1dHVyZXNfMjAxN0YuQ2xvc2UsMSkgb24gNSBGZWIgMjAxOCB3aWxsIHJldHVybiB0aGUgV2ludGVyIDIwMTggY3VydmUgcHJpY2VzJXwhQ3VydmV8bmV4dF95ZWFyOjpuZXh0X3llYXIoU3dhcCBvciBGdXR1cmVzLCBOdW1iZXIgbW9udGhzKQ0KLVJldHVybnMgdGhlIGR5bmFtaWMgYXZlcmFnZSBjdXJ2ZSB3aXRoIG51bWJlciBvZiB5ZWFycyBzdGFydGluZyBmcm9tIG5vdw0KDQpFLmcuIG5leHRfaGFsZihDT19GdXR1cmVzXzIwMTdGLkNsb3NlLDEpIG9uIDUgRmViIDIwMTggd2lsbCByZXR1cm4gdGhlIENhbCAyMDE5IGN1cnZlIHByaWNlcyV8IUN1cnZlfHJvbGxfY29udHJhY3Q6OnJvbGxfY29udHJhY3QoU3dhcCBvciBGdXR1cmVzLCB0ZXh0IENvbnRyYWN0KQ0KLSBSZXR1cm5zIHRoZSBuZXh0IGNvbnRyYWN0IG1vbnRoIGN1cnZlIHZhbHVlIG9mIGEgZm9yd2FyZCBwcmljZSANCkNvbnRyYWN0IHZhbHVlcyBjYW4gYmUgIkYiLCJHIiwiSCIsIkoiLCJLIiwiTSIsIk4iLCJRIiwiVSIsIlYiLCJYIiwiWiIsICJRMSIsIlEyIiwiUTMiLCJRNCIsIkgxIiwiSDIiIG9yICJZMSINCg0KRS5nLiByb2xsX2NvbnRyYWN0KENPX0Z1dHVyZXNfMjAwM0YuQ2xvc2UsIkciKSB3aWxsIHJldHVybiB0aGUgRmVidWFyeSAyMDEzIHByaWNlcyBkdXJpbmcgT2N0IDIwMTIlfCFDdXJ2ZXxyb2xsX2NvbnRyYWN0X2JhbDo6cm9sbF9jb250cmFjdF9iYWwoU3dhcCBvciBGdXR1cmVzLCB0ZXh0IENvbnRyYWN0KQ0KLSBSZXR1cm5zIHRoZSBuZXh0IGNvbnRyYWN0IG1vbnRoIGN1cnZlIHZhbHVlIG9mIGEgZm9yd2FyZCBwcmljZSBhZnRlciBiYWxhbmNlIG1vbnRoDQpDb250cmFjdCB2YWx1ZXMgY2FuIGJlICJGIiwiRyIsIkgiLCJKIiwiSyIsIk0iLCJOIiwiUSIsIlUiLCJWIiwiWCIsIloiLCAiUTEiLCJRMiIsIlEzIiwiUTQiLCJIMSIsIkgyIiBvciAiWTEiDQoNCkUuZy4gcm9sbF9jb250cmFjdF9iYWwoQ09fRnV0dXJlc18yMDAzRi5DbG9zZSwiRyIpIHdpbGwgcmV0dXJuIHRoZSBGZWJ1YXJ5IDIwMTMgcHJpY2VzIGR1cmluZyBGZWIgMjAxMyV8IUN1cnZlfHJvbGxfbW9udGg6OnJvbGxfbW9udGgoU3dhcCBvciBGdXR1cmVzLCB0ZXh0IE1vbnRoKQ0KLSBSZXR1cm5zIHRoZSBuZXh0IG1vbnRoIGN1cnZlIHZhbHVlIG9mIGEgZm9yd2FyZCBwcmljZQ0KDQpFLmcuIHJvbGxfbW9udGgoQ09fRnV0dXJlc18yMDEyRi5DbG9zZSwiMSIpIHdpbGwgcmV0dXJuIHRoZSBGZWJ1YXJ5IDIwMTYgY3VydmUgcHJpY2VzIGR1cmluZyBKYW51YXJ5IDIwMTYlfCFEYXRlfGN1cnJlbnRkYXk6OmN1cnJlbnRtb250aA0KLSBSZXR1cm5zIGRheSBvZiB0b2RheQ0KDQpFLmcgY3VycmVudG1vbnRoIHJldHVybnMgNSB3aGVuIHRvZGF5IGlzIDUgRmViIDIwMTclfCFEYXRlfGN1cnJlbnRtb250aDo6Y3VycmVudG1vbnRoDQotIFJldHVybnMgbW9udGggb2YgdG9kYXkNCg0KRS5nIGN1cnJlbnRtb250aCByZXR1cm5zIDIgd2hlbiB0b2RheSBpcyA1IEZlYiAyMDE3JXwhRGF0ZXxjdXJyZW50eWVhcjo6Y3VycmVudHllYXINCi0gUmV0dXJucyB5ZWFyIG9mIHRvZGF5DQoNCkUuZyBjdXJyZW50bW9udGggcmV0dXJucyAyMDE3IHdoZW4gdG9kYXkgaXMgNSBGZWIgMjAxNyV8IURhdGV8ZGF5OjpkYXkNCi0gUmV0dXJucyB0aGUgZGF5IG9mIHRoZSB3ZWVrDQoNCkUuZy4gZGF5IHJldHVybnMgdmFsdWUgb2YgMTYgd2hlbiBkYXRlIGlzIDE2IERlYyAyMDE2JXwhRGF0ZXxkYXlzaW5tb250aDo6ZGF5c2lubW9udGgNCi0gUmV0dXJucyBudW1iZSBvZiBkYXlzIGluIHRoZSBtb250aA0KDQpFLmcuIGRheXNpbm1vbnRoIHJldHVybnMgdmFsdWUgb2YgMzEgd2hlbiBkYXRlIGlzIDE0IE9jdCAyMDE2JXwhRGF0ZXxob3VyOjpob3VyDQotIFJldHVybnMgdGhlIGhvdXIgb2YgdGhlIHRpbWUNCg0KRS5nLiBob3VyIHJldHVybnMgdmFsdWUgb2YgOCB3aGVuIHRpbWUgaXMgOC4yMy4xMyBhbSV8IURhdGV8aXN3ZWVrZGF5Ojppc3dlZWtkYXkNCi0gUmV0dXJucyB0cnVlIHdoZW4gZGF0ZSBpcyBhIHdlZWtkYXkNCg0KRS5nLiBpc3dlZWtkYXkgcmV0dXJucyB2YWx1ZSBvZiB0cnVlIHdoZW4gZGF0ZSBpcyAxNCBPY3QgMjAxNiV8IURhdGV8aXN3ZWVrZW5kOjppc3dlZWtlbmQNCi0gUmV0dXJucyB0cnVlIHdoZW4gZGF0ZSBpcyBhIHdlZWtlbmQNCg0KRS5nLiBpc3dlZWtlbmQgcmV0dXJucyB2YWx1ZSBvZiBmYWxzZSB3aGVuIGRhdGUgaXMgMTQgT2N0IDIwMTYlfCFEYXRlfG1pbnV0ZTo6bWludXRlDQotIFJldHVybnMgdGhlIG1pbnV0ZSBvZiB0aGUgdGltZQ0KDQpFLmcuIG1pbnV0ZSByZXR1cm5zIHZhbHVlIG9mIDIzIHdoZW4gdGltZSBpcyA4LjIzLjEzIGFtJXwhRGF0ZXxtb250aDo6bW9udGgNCi0gUmV0dXJucyB0aGUgbW9udGggb2YgdGhlIHllYXINCg0KRS5nLiBtb250aCByZXR1cm5zIHZhbHVlIG9mIDQxIHdoZW4gZGF0ZSBpcyAxNCBPY3QgMjAxNiV8IURhdGV8c2Vjb25kOjpzZWNvbmQNCi0gUmV0dXJucyB0aGUgc2Vjb25kIG9mIHRoZSB0aW1lDQoNCkUuZy4gc2Vjb25kIHJldHVybnMgdmFsdWUgb2YgMTMgd2hlbiB0aW1lIGlzIDguMjMuMTMgYW0lfCFEYXRlfHdlZWs6OndlZWsNCi0gUmV0dXJucyB0aGUgd2VlayBvZiB0aGUgeWVhcg0KDQpFLmcuIHdlZWsgcmV0dXJucyB2YWx1ZSBvZiAxMCB3aGVuIGRhdGUgaXMgMTQgT2N0IDIwMTYlfCFEYXRlfHdlZWtkYXk6OndlZWtkYXkNCi0gUmV0dXJucyB0aGUgZGF5IG9mIHRoZSB3ZWVrDQoNCkUuZy4gd2Vla2RheSByZXR1cm5zIHZhbHVlIG9mIDUgd2hlbiBkYXRlIGlzIDE2IERlYyAyMDE2JXwhRGF0ZXx5ZWFyOjp5ZWFyDQotIFJldHVybnMgdGhlIHllYXINCg0KRS5nLiB5ZWFyIHJldHVybnMgdmFsdWUgb2YgMjAxNiB3aGVuIGRhdGUgaXMgMTQgT2N0IDIwMTYlfCFEYXRlfHl5eXltbWRkOjp5eXl5bW1kZA0KLSBSZXR1cm5zIHRoZSBEYXRlIGluIHl5eXltbWRkIGZvcm1hdA0KDQpFLmcuIHl5eXltbWRkIHJldHVybnMgdmFsdWUgb2YgMjAxNjEwMTQgd2hlbiBkYXRlIGlzIDE0IE9jdCAyMDE2JXwhRmlsbHxmaWxsX2JhY2t3YXJkOjpmaWxsX2JhY2t3YXJkKFRpbWVzZXJpZXMpDQotIFJldHVybnMgdGhlIGRhaWx5IHNlcmllcyB3aXRoIG51bGwgdmFsdWVzIGZpbGxlZCB1c2luZyBmaXJzdCBvYnNlcnZhdGlvbiBjYXJyaWVkIGJhY2t3YXJkIChmb2NiKSBtZXRob2QlfCFGaWxsfGZpbGxfZm9yd2FyZDo6ZmlsbF9mb3J3YXJkKFRpbWVzZXJpZXMpDQotIFJldHVybnMgdGhlIGRhaWx5IHNlcmllcyB3aXRoIG51bGwgdmFsdWVzIGZpbGxlZCB1c2luZyBsYXN0IG9ic2VydmF0aW9uIGNhcnJpZWQgZm9yd2FyZCAobG9jZikgbWV0aG9kJXwhSW50ZXJwb2xhdGlvbnxpbnRlcnBvbGF0ZTo6aW50ZXJwb2xhdGUoVGltZXNlcmllcykNCi0gUmV0dXJucyB0aGUgZGFpbHkgc2VyaWVzIHdpdGggaW50ZXJwb2xhdGVkIG1pc3NpbmcgZGFpbHkgdmFsdWVzIGZyb20gYW5vdGhlciBzZXJpZXMlfCFMZWFkIGFuZCBMYWd8bGFnOjpsYWcoTnVtYmVyIFgsIEludGVnZXIgRCkNCi0gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHJvdyBvZmZzZXQgRCBiZWZvcmUgY3VycmVudCByb3cNCgoKRS5nLiBsYWcoRkVEX1VTRF9DTlksIDIpIHJldHVybnMgdGhlIHZhbHVlIG9mIHN5bWJvbCBGRURfVVNEX0NOWSAyIGRheXMgYmVmb3JlIGN1cnJlbnQgcm93JXwhTGVhZCBhbmQgTGFnfGxlYWQ6OmxlYWQoTnVtYmVyIFgsIEludGVnZXIgRCkNCi0gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHJvdyBvZmZzZXQgRCBhZnRlciBjdXJyZW50IHJvdw0KCgpFLmcuIGxlYWQoRkVEX1VTRF9DTlksIDIpIHJldHVybnMgdGhlIHZhbHVlIG9mIHN5bWJvbCBGRURfVVNEX0NOWSAyIGRheXMgYWZ0ZXIgY3VycmVudCByb3clfCFNYXRofGFiczo6YWJzKE51bWJlciBYKQ0KLSBSZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBhIG51bWJlciBYLCBhIG51bWJlciB3aXRob3V0IGl0cyBzaWduDQoNCkUuZy4gYWJzKC01LjIpIHJldHVybnMgdmFsdWUgb2YgNS4yJXwhTWF0aHxhdmVyYWdlOjphdmVyYWdlKE51bWJlciBBLCBOdW1iZXIgQiwgTnVtYmVyIEMs4oCmKQ0KDQotIFJldHVybiB0aGUgYXZlcmFnZSBvZiB1cCB0byAxMiBzeW1ib2xzJXwhTWF0aHxjYnJ0OjpjYnJ0KE51bWJlciBYKQ0KLSBSZXR1cm5zIHRoZSBjdWJlIHJvb3Qgb2YgYSBudW1iZXIgWA0KDQoNCkUuZy4gY2JydCg4KSByZXR1cm5zIHZhbHVlIG9mIDIlfCFNYXRofGNlaWw6OmNlaWwoTnVtYmVyIFgpDQotIFJldHVybnMgdGhlIG5lYXJlc3QgaW50ZWdlciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYSBudW1iZXINCg0KDQpFLmcuIGNlaWwoLTMyLjcpIHJldHVybnMgdmFsdWUgb2YgLTMyJXwhTWF0aHxkZWdyZWVzOjpkZWdyZWVzKE51bWJlciBYKQ0KLSBDb252ZXJ0cyB0aGUgdmFsdWUgb2YgWCBpbiByYWRpYW5zIHRvIGluIGRlZ3JlZXMNCg0KDQpFLmcuIGRlZ3JlZXMoMC41KSByZXR1cm5zIHZhbHVlIG9mIDI4LjY0Nzg4OTc1NjU0MTIlfCFNYXRofGRpdjo6ZGl2KE51bWJlciBZLCBOdW1iZXIgWCkNCi0gUmV0dXJucyB0aGUgaW50ZWdlciBxdW90aWVudCBvZiBZL1gNCg0KDQpFLmcuIGRpdig5LDQpIHJldHVybnMgdmFsdWUgb2YgMiV8IU1hdGh8ZXhwOjpleHAoTnVtYmVyIFgpDQpSZXR1cm5zIGUgcmFpc2VkIHRvIHRoZSBwb3dlciBvZiBhIGdpdmVuIG51bWJlciBYIHdoZXJlIGUgPSAyLjcxODI4MTgyODQ1OTA1DQoNCg0KRS5nLiBleHAoMi4wKSByZXR1cm5zIHZhbHVlIG9mIDcuMzg5MDU2MDk4OTMwNjUlfCFNYXRofGZsb29yOjpmbG9vcihOdW1iZXIgWCkNCi0gUmV0dXJucyB0aGUgbmVhcmVzdCBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBhIG51bWJlciBYDQoNCg0KRS5nLiAgRmxvb3IoLTMyLjcpIHJldHVybnMgdmFsdWUgb2YgLTMzJXwhTWF0aHxsbjo6bG4oTnVtYmVyIFgpDQotIFJldHVybnMgdGhlIG5hdHVyYWwgbG9nYXJpdGhtIG9mIGEgbnVtYmVyIFgNCg0KRS5nLiBsbigyLjApIHJldHVybnMgdmFsdWUgb2YgMC42OTMxNDcxODA1NTk5NDUlfCFNYXRofGxvZzo6bG9nKE51bWJlciBCLCBOdW1iZXIgWCkNCi0gUmV0dXJucyB0aGUgYmFzZSBCIGxvZ2FyaXRobSBvZiBhIG51bWJlciBYDQoNCkUuZy4gbG9nKDIsIDY0KSByZXR1cm5zIHZhbHVlIG9mIDYlfCFNYXRofGxvZzo6bG9nKE51bWJlciBYKQ0KLSBSZXR1cm5zIHRoZSBiYXNlIDEwIGxvZ2FyaXRobSBvZiBhIG51bWJlciBYDQoNCkUuZy4gbG9nKDEwMC4wKSByZXR1cm5zIHZhbHVlIG9mIDIlfCFNYXRofG1vZDo6bW9kKE51bWJlciBZLCBOdW1iZXIgWCkNCi0gUmV0dXJucyB0aGUgcmVtYWluZGVyIG9mIFkvWA0KDQpFLmcuIG1vZCg5LCA0KSByZXR1cm5zIHZhbHVlIG9mIDElfCFNYXRofHBpOjpwaSgpDQpSZXR1cm5zIHRoZSB2YWx1ZSBvZiBwaQ0KDQpFLmcuIHBpKCkgcmV0dXJucyB2YWx1ZSBvZiAzLjE0MTU5MjY1MzU4OTc5JXwhTWF0aHxwb3dlcjo6cG93ZXIoTnVtYmVyIFksIE51bWJlciBYKQ0KUmV0dXJucyBZIHJhaXNlZCB0byB0aGUgcG93ZXIgb2YgYSBnaXZlbiBudW1iZXIgWA0KDQpFLmcuIHBvd2VyKDQsMykgcmV0dXJucyB2YWx1ZSBvZiA2NCV8IU1hdGh8cmFkaWFuczo6cmFkaWFucyhOdW1iZXIgWCkNCi0gQ29udmVydHMgdGhlIHZhbHVlIG9mIFggaW4gZGVncmVlcyB0byBpbiByYWRpYW5zDQoNCkUuZy4gcmFkaWFucyg0NS4wKSByZXR1cm5zIHZhbHVlIG9mIDAuNzg1Mzk4MTYzMzk3NDQ4JXwhTWF0aHxyb3VuZDo6cm91bmQoTnVtYmVyIFgpDQpSb3VuZHMgYSBudW1iZXIgWCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyDQoNCkUuZy4gcm91bmQoMzIuMykgcmV0dXJucyB2YWx1ZSBvZiAzMiV8IU1hdGh8cm91bmQ6OnJvdW5kKE51bWJlciBYLCBOdW1iZXIgWSkNCi0gUm91bmRzIGEgbnVtYmVyIFggdG8gdGhlIFkgZGVjaW1hbCBwbGFjZXMNCg0KRS5nLiByb3VuZCgzMi4zMTQ1LCAyKSByZXR1cm5zIHZhbHVlIG9mIDMyLjMxJXwhTWF0aHxzaWduOjpzaWduKE51bWJlciBYKQ0KLSBSb3VuZHMgdGhlIHNpZ24gb2YgYSBudW1iZXIgWA0KDQpFLmcuIHNpZ24oLTEyKSByZXR1cm5zIHZhbHVlIG9mIC0xJXwhTWF0aHxzcXJ0OjpzcXJ0KE51bWJlciBYKQ0KLSBSZXR1cm5zIHRoZSBzcXVhcmUgcm9vdCBvZiBhIG51bWJlciBYDQoNCg0KRS5nLiBzcXJ0KDkpIHJldHVybnMgdmFsdWUgb2YgMyV8IU1hdGh8dHJ1bmM6OnRydW5jKE51bWJlciBYKQ0KLSBUcnVuY2F0ZXMgdGhlIGRlY2ltYWwgb2YgYSBudW1iZXIgWCB0byBhbiBpbnRlZ2VyDQoNCg0KRS5nLiB0cnVuYyg5LjQzKSByZXR1cm5zIHZhbHVlIG9mIDklfCFNYXRofHRydW5jOjp0cnVuYyhOdW1iZXIgWCwgTnVtYmVyIFkpDQotIFRydW5jYXRlcyB0aGUgZGVjaW1hbCBvZiBhIG51bWJlciBYIHRvIFkgZGVjaW1hbCBwbGFjZXMNCg0KDQpFLmcuIHRydW5jKDkuNDM1NiwzKSByZXR1cm5zIHZhbHVlIG9mIDkuNDM1JXwhTWF0aHx3aWR0aF9idWNrZXQ6OndpZHRoX2J1Y2tldChOdW1iZXIgQSwgTnVtYmVyIEIxLCBOdW1iZXIgQjIsIEludGVnZXIgQykNCi0gUmV0dXJuIHRoZSBidWNrZXQgdG8gd2hpY2ggYSBudW1iZXIgQSB3b3VsZCBiZSBhc3NpZ25lZCBpbiBhbiBlcXVpZGVwdGggaGlzdG9ncmFtIHdpdGggY291bnQgYnVja2V0cyBDLCBpbiB0aGUgcmFuZ2UgQjEgdG8gQjINCg0KRS5nLiB3aWR0aF9idWNrZXQoNS4zNSwgMC4wMjQsIDEwLjA2LCA1KSByZXR1cm5zIHZhbHVlIG9mIDMlfCFNb250aGx5fG1vbnRobHlfYXZnOjptb250aGx5X2F2ZyhOdW1iZXIgWCkKLSBSZXR1cm5zIHRoZSBtb250aGx5IGF2ZXJhZ2UKCgpFLmcuIG1vbnRobHlfYXZnKEZFRF9VU0RfQ05ZKSByZXR1cm5zIHRoZSBtb250aGx5IGF2ZXJhZ2Ugb2YgdGhlIHN5bWJvbCBGRURfVVNEX0NOWSV8IU1vbnRobHl8bW9udGhseV9tYXg6Om1vbnRobHlfbWF4KE51bWJlciBYKQotIFJldHVybnMgdGhlIG1vbnRobHkgbWF4aW11bQoKCkUuZy4gbW9udGhseV9tYXgoRkVEX1VTRF9DTlkpIHJldHVybnMgdGhlIG1vbnRobHkgbWF4aW11bSBvZiB0aGUgc3ltYm9sIEZFRF9VU0RfQ05ZJXwhTW9udGhseXxtb250aGx5X21pbjo6bW9udGhseV9taW4oTnVtYmVyIFgpCi0gUmV0dXJucyB0aGUgbW9udGhseSBtaW5pbXVtCgoKRS5nLiBtb250aGx5X21pbihGRURfVVNEX0NOWSkgcmV0dXJucyB0aGUgbW9udGhseSBtaW5pbXVtIG9mIHRoZSBzeW1ib2wgRkVEX1VTRF9DTlklfCFNb250aGx5fG1vbnRobHlfc3RkZGV2Ojptb250aGx5X3N0ZGRldihOdW1iZXIgWCkKLSBSZXR1cm5zIHRoZSBtb250aGx5IHN0YW5kYXJkIGRldmlhdGlvbgoKCkUuZy4gbW9udGhseV9zdGRkZXYoRkVEX1VTRF9DTlkpIHJldHVybnMgdGhlIG1vbnRobHkgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBzeW1ib2wgRkVEX1VTRF9DTlklfCFNb250aGx5fG1vbnRobHlfc3RkZGV2X3BvcDo6bW9udGhseV9zdGRkZXZfcG9wKE51bWJlciBYKQotIFJldHVybnMgdGhlIG1vbnRobHkgcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24KCgpFLmcuIG1vbnRobHlfc3RkZGV2X3BvcChGRURfVVNEX0NOWSkgcmV0dXJucyB0aGUgbW9udGhseSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgc3ltYm9sIEZFRF9VU0RfQ05ZJXwhTW9udGhseXxtb250aGx5X3N0ZGRldl9zYW1wOjptb250aGx5X3N0ZGRldl9zYW1wKE51bWJlciBYKQotIFJldHVybnMgdGhlIG1vbnRobHkgc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbgoKCkUuZy4gbW9udGhseV9zdGRkZXZfc2FtcChGRURfVVNEX0NOWSkgcmV0dXJucyB0aGUgbW9udGhseSBzYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBzeW1ib2wgRkVEX1VTRF9DTlklfCFNb250aGx5fG1vbnRobHlfc3VtOjptb250aGx5X3N1bShOdW1iZXIgWCkKLSBSZXR1cm5zIHRoZSBtb250aGx5IHN1bQoKCkUuZy4gbW9udGhseV9zdW0oRkVEX1VTRF9DTlkpIHJldHVybnMgdGhlIG1vbnRobHkgc3VtIG9mIHRoZSBzeW1ib2wgRkVEX1VTRF9DTlklfCFNb250aGx5fG1vbnRobHlfdmFyaWFuY2U6Om1vbnRobHlfdmFyaWFuY2UoTnVtYmVyIFgpCi0gUmV0dXJucyB0aGUgbW9udGhseSBhdmVyYWdlCgoKRS5nLiBtb250aGx5X3ZhcmlhbmNlKEZFRF9VU0RfQ05ZKSByZXR1cm5zIHRoZSBtb250aGx5IHZhcmlhbmNlIG9mIHRoZSBzeW1ib2wgRkVEX1VTRF9DTlklfCFNb250aGx5fG1vbnRobHlfdmFyX3BvcDo6bW9udGhseV92YXJfcG9wKE51bWJlciBYKQotIFJldHVybnMgdGhlIG1vbnRobHkgcG9wdWxhdGlvbiB2YXJpYW5jZQoKCkUuZy4gbW9udGhseV92YXJfcG9wKEZFRF9VU0RfQ05ZKSByZXR1cm5zIHRoZSBtb250aGx5IHBvcHVsYXRpb24gdmFyaWFuY2Ugb2YgdGhlIHN5bWJvbCBGRURfVVNEX0NOWSV8IU1vbnRobHl8bW9udGhseV92YXJfc2FtcDo6bW9udGhseV92YXJfc2FtcChOdW1iZXIgWCkKLSBSZXR1cm5zIHRoZSBtb250aGx5IHNhbXBsZSB2YXJpYW5jZQoKCkUuZy4gbW9udGhseV92YXJfc2FtcChGRURfVVNEX0NOWSkgcmV0dXJucyB0aGUgbW9udGhseSBzYW1wbGUgdmFyaWFuY2Ugb2YgdGhlIHN5bWJvbCBGRURfVVNEX0NOWSV8IU1vcmUgRGF0YXxiZGg6OmJkaCgiQmxvb21iZXJnIHN5bWJvbCIsIkJsb29tYmVyZyBmaWVsZCIpDQotIFJldHVybnMgdGhlIGhpc3RvcmljYWwgc2VyaWVzIG9mIGEgQmxvb21iZXJnIHN5bWJvbA0KDQpFLmcuIGJkaCgiQ08xIENvbWR0eSIsIlBYX0xBU1QiKSByZXR1cm5zIHRoZSBsYXN0IHByaWNlIG9mIEJyZW50IDFzdCBsaW5lIGZ1dHVyZXMlfCFNb3JlIERhdGF8Y2xpcHBlcjo6Y2xpcHBlcigidHlwZSBvZiB0cmVuZCIsInByb2R1Y3QiLCJmcmVxdWVuY3kiLCJyZWdpb24gZnJvbSIuInJlZ2lvbiB0byIpDQotIFJldHVybnMgdGhlIGhpc3RvcmljYWwgc2VyaWVzIG9mIGEgQ2xpcHBlckRhdGEgcXVlcnkNCg0KRS5nLiBjbGlwcGVyKCJmbG93IiwiZnVlbCIsIldlZWtseSIsIlNQT1IiLCJDSC1OIikgcmV0dXJucyB0aGUgd2Vla2x5IGZsb3cgb2YgZnVlbCBvaWwgZnJvbSBTaW5nYXBvcmUgdG8gTm9ydGggQ2hpbmElfCFNb3JlIERhdGF8aW50ZXJuYWw6OmludGVybmFsKHRpbWVzZXJpZXMpDQotIFJldHVybnMgdGhlIGhpc3RvcmljYWwgc2VyaWVzIG9mIGFuIGludGVybmFsIGRhdGElfCFNb3JlIERhdGF8cXNlcmllczo6cXNlcmllcygiUXVhbmRsIHN5bWJvbCIsIlF1YW5kbCBmaWVsZCIpDQotIFJldHVybnMgdGhlIGhpc3RvcmljYWwgc2VyaWVzIG9mIGEgUXVhbmRsIHN5bWJvbA0KDQpFLmcuIHFzZXJpZXMoIklDRS9CWjIwMTciLCJTZXR0bGUiKSByZXR1cm5zIHRoZSBkYWlseSBzZXR0bGUgcHJpY2Ugb2YgQnJlbnQgRGVjIDIwMTcgZnV0dXJlcyV8IU1vcmUgRGF0YXxyaGlzdG9yeTo6cmhpc3RvcnkoIkVpa29uIHN5bWJvbCIsIkVpa29uIGZpZWxkIikNCi0gUmV0dXJucyB0aGUgaGlzdG9yaWNhbCBzZXJpZXMgb2YgYSBFaWtvbiBzeW1ib2wNCg0KRS5nLiByaGlzdG9yeSgiTENPYzEiLCJEYWlseV9NSURfUFJJQ0UiKSByZXR1cm5zIHRoZSBkYWlseSBtaWQgcHJpY2Ugb2YgQnJlbnQgUm9sbGluZyBBY3RpdmUgZnV0dXJlcyV8IU1vcmUgRGF0YXxzaGFyZWV4Y2VsOjpzaGFyZWV4Y2VsKCJmb2xkZXIiLCJ0YWJsZSIsInRyYW5zcG9zZSIsImRhdGUgY29sdW1uIiwidmFsdWUgY29sdW1uIikNCi0gUmV0dXJucyB0aGUgaGlzdG9yaWNhbCBzZXJpZXMgb2YgYSBTaGFyZUV4Y2VsIHRhYmxlIGJhc2Ugb24gd2hlcmUgaXQgaXMgdHJhbnNwb3NlIGFuZCB0aGUgY29sdW1uIHNlbGVjdGVkJXwhTW9yZSBEYXRhfHdzczo6d3NzKCJXSU5EIHN5bWJvbCIsIldJTkQgZmllbGQiKQ0KLSBSZXR1cm5zIHRoZSBoaXN0b3JpY2FsIHNlcmllcyBvZiBhIFdJTkQgc3ltYm9sDQoNCkUuZy4gd3NzKCJCMDAuSVBFIiwic2V0dGxlIikgcmV0dXJucyB0aGUgZGFpbHkgc2V0dGxlbWVudCBwcmljZSBvZiBCcmVudCBSb2xsaW5nIEFjdGl2ZSBmdXR1cmVzJXwhTW92ZXxwZXJjZW50X21vdmU6OnBlcmNlbnRfbW92ZShOdW1iZXIgWCwgSW50ZWdlciBEMSwgSW50ZWdlciBEMikNCi0gUmV0dXJucyB0aGUgcGVyY2VudGFnZSBtb3ZlIG9mIFggZnJvbSAoRDIgcG9pbnRzIGZyb20gY3VycmVudCBkYXkpIHRvIChEMSBwb2ludHMgZnJvbSBjdXJyZW50IGRheSkNCgoKRS5nLiBwZXJjZW50X21vdmUoTllNRVhfTkdfRnV0dXJlc18yMDE5Ri5DbG9zZSwgLTMsMCkgcmV0dXJucyB0aGUgcGVyY2VudGFnZSBtb3ZlIG9mIHRoZSBjdXJ2ZSBOWU1FWF9OR19GdXR1cmVzIDMgZGF5cyBiZWZvcmUgY3VycmVudCByb3clfCFNb3ZlfHZhbHVlX21vdmU6OnZhbHVlX21vdmUoTnVtYmVyIFgsIEludGVnZXIgRDEsIEludGVnZXIgRDIpDQotIFJldHVybnMgdGhlIHZhbHVlIG1vdmUgb2YgWCBmcm9tIChEMiBwb2ludHMgZnJvbSBjdXJyZW50IGRheSkgdG8gKEQxIHBvaW50cyBmcm9tIGN1cnJlbnQgZGF5KQ0KCgpFLmcuIHZhbHVlX21vdmUoTllNRVhfTkdfRnV0dXJlc18yMDE5Ri5DbG9zZSwgLTMsMCkgcmV0dXJucyB0aGUgdmFsdWUgbW92ZSBvZiB0aGUgY3VydmUgTllNRVhfTkdfRnV0dXJlcyAzIGRheXMgYmVmb3JlIGN1cnJlbnQgcm93JXwhU3RhdGlzdGljYWx8cm9sbGluZ19hdmc6OnJvbGxpbmdfYXZnKE51bWJlciBYLCBJbnRlZ2VyIEQxLCBJbnRlZ2VyIEQyKQ0KLSBSZXR1cm5zIHRoZSByb2xsaW5nIGF2ZXJhZ2UgYmV0d2VlbiByb3cgb2Zmc2V0IEQxIGZyb20gY3VycmVudCByb3cgdG8gcm93IG9mZnNldCBEMiBmcm9tIGN1cnJlbnQgcm93DQoNCkUuZy4gcm9sbGluZ19hdmcoRkVEX1VTRF9DTlksIC0zLCAyKSByZXR1cm5zIHRoZSByb2xsaW5nIGF2ZXJhZ2Ugb2YgdGhlIHN5bWJvbCBGRURfVVNEX0NOWSAzIHJvd3MgYmVmb3JlIGN1cnJlbnQgcm93IHRvIDIgZGF5cyBhZnRlciBjdXJyZW50IHJvdyV8IVN0YXRpc3RpY2FsfHJvbGxpbmdfbWF4Ojpyb2xsaW5nX21heChOdW1iZXIgWCwgSW50ZWdlciBEMSwgSW50ZWdlciBEMikNCi0gUmV0dXJucyB0aGUgcm9sbGluZyBtYXhpbXVtIGJldHdlZW4gcm93IG9mZnNldCBEMSBmcm9tIGN1cnJlbnQgcm93IHRvIHJvdyBvZmZzZXQgRDIgZnJvbSBjdXJyZW50IHJvdw0KDQpFLmcuIHJvbGxpbmdfbWF4KEZFRF9VU0RfQ05ZLCAtMywgMikgcmV0dXJucyB0aGUgcm9sbGluZyBhdmVyYWdlIG9mIHRoZSBzeW1ib2wgRkVEX1VTRF9DTlkgMyByb3dzIGJlZm9yZSBjdXJyZW50IHJvdyB0byAyIGRheXMgYWZ0ZXIgY3VycmVudCByb3clfCFTdGF0aXN0aWNhbHxyb2xsaW5nX21pbjo6cm9sbGluZ19taW4oTnVtYmVyIFgsIEludGVnZXIgRDEsIEludGVnZXIgRDIpDQotIFJldHVybnMgdGhlIHJvbGxpbmcgbWluaW11bSBiZXR3ZWVuIHJvdyBvZmZzZXQgRDEgZnJvbSBjdXJyZW50IHJvdyB0byByb3cgb2Zmc2V0IEQyIGZyb20gY3VycmVudCByb3cNCg0KRS5nLiByb2xsaW5nX21pbihGRURfVVNEX0NOWSwgLTMsIDIpIHJldHVybnMgdGhlIHJvbGxpbmcgYXZlcmFnZSBvZiB0aGUgc3ltYm9sIEZFRF9VU0RfQ05ZIDMgcm93cyBiZWZvcmUgY3VycmVudCByb3cgdG8gMiBkYXlzIGFmdGVyIGN1cnJlbnQgcm93JXwhU3RhdGlzdGljYWx8cm9sbGluZ19zdGRkZXY6OnJvbGxpbmdfc3RkZGV2KE51bWJlciBYLCBJbnRlZ2VyIEQxLCBJbnRlZ2VyIEQyKQ0KLSBSZXR1cm5zIHRoZSByb2xsaW5nIHN0YW5kYXJkIGRldmlhdGlvbiBiZXR3ZWVuIHJvdyBvZmZzZXQgRDEgZnJvbSBjdXJyZW50IHJvdyB0byByb3cgb2Zmc2V0IEQyIGZyb20gY3VycmVudCByb3cNCg0KRS5nLiByb2xsaW5nX3N0ZGRldihGRURfVVNEX0NOWSwgLTMsIDIpIHJldHVybnMgdGhlIHJvbGxpbmcgYXZlcmFnZSBvZiB0aGUgc3ltYm9sIEZFRF9VU0RfQ05ZIDMgcm93cyBiZWZvcmUgY3VycmVudCByb3cgdG8gMiBkYXlzIGFmdGVyIGN1cnJlbnQgcm93JXwhU3RhdGlzdGljYWx8cm9sbGluZ19zdGRkZXZfcG9wOjpyb2xsaW5nX3N0ZGRldl9wb3AoTnVtYmVyIFgsIEludGVnZXIgRDEsIEludGVnZXIgRDIpDQotIFJldHVybnMgdGhlIHJvbGxpbmcgcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24gYmV0d2VlbiByb3cgb2Zmc2V0IEQxIGZyb20gY3VycmVudCByb3cgdG8gcm93IG9mZnNldCBEMiBmcm9tIGN1cnJlbnQgcm93DQoNCkUuZy4gcm9sbGluZ19zdGRkZXZfcG9wKEZFRF9VU0RfQ05ZLCAtMywgMikgcmV0dXJucyB0aGUgcm9sbGluZyBhdmVyYWdlIG9mIHRoZSBzeW1ib2wgRkVEX1VTRF9DTlkgMyByb3dzIGJlZm9yZSBjdXJyZW50IHJvdyB0byAyIGRheXMgYWZ0ZXIgY3VycmVudCByb3clfCFTdGF0aXN0aWNhbHxyb2xsaW5nX3N0ZGRldl9zYW1wOjpyb2xsaW5nX3N0ZGRldl9zYW1wKE51bWJlciBYLCBJbnRlZ2VyIEQxLCBJbnRlZ2VyIEQyKQ0KLSBSZXR1cm5zIHRoZSByb2xsaW5nIHNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24gYmV0d2VlbiByb3cgb2Zmc2V0IEQxIGZyb20gY3VycmVudCByb3cgdG8gcm93IG9mZnNldCBEMiBmcm9tIGN1cnJlbnQgcm93DQoNCkUuZy4gcm9sbGluZ19zdGRkZXZfc2FtcChGRURfVVNEX0NOWSwgLTMsIDIpIHJldHVybnMgdGhlIHJvbGxpbmcgYXZlcmFnZSBvZiB0aGUgc3ltYm9sIEZFRF9VU0RfQ05ZIDMgcm93cyBiZWZvcmUgY3VycmVudCByb3cgdG8gMiBkYXlzIGFmdGVyIGN1cnJlbnQgcm93JXwhU3RhdGlzdGljYWx8cm9sbGluZ19zdW06OnJvbGxpbmdfc3VtKE51bWJlciBYLCBJbnRlZ2VyIEQxLCBJbnRlZ2VyIEQyKQ0KLSBSZXR1cm5zIHRoZSByb2xsaW5nIHN1bSBiZXR3ZWVuIHJvdyBvZmZzZXQgRDEgZnJvbSBjdXJyZW50IHJvdyB0byByb3cgb2Zmc2V0IEQyIGZyb20gY3VycmVudCByb3cNCg0KRS5nLiByb2xsaW5nX3N1bShGRURfVVNEX0NOWSwgLTMsIDIpIHJldHVybnMgdGhlIHJvbGxpbmcgYXZlcmFnZSBvZiB0aGUgc3ltYm9sIEZFRF9VU0RfQ05ZIDMgcm93cyBiZWZvcmUgY3VycmVudCByb3cgdG8gMiBkYXlzIGFmdGVyIGN1cnJlbnQgcm93JXwhU3RhdGlzdGljYWx8cm9sbGluZ192YXJpYW5jZTo6cm9sbGluZ192YXJpYW5jZShOdW1iZXIgWCwgSW50ZWdlciBEMSwgSW50ZWdlciBEMikNCi0gUmV0dXJucyB0aGUgcm9sbGluZyB2YXJpYW5jZSBiZXR3ZWVuIHJvdyBvZmZzZXQgRDEgZnJvbSBjdXJyZW50IHJvdyB0byByb3cgb2Zmc2V0IEQyIGZyb20gY3VycmVudCByb3cNCg0KRS5nLiByb2xsaW5nX3ZhcmlhbmNlKEZFRF9VU0RfQ05ZLCAtMywgMikgcmV0dXJucyB0aGUgcm9sbGluZyBhdmVyYWdlIG9mIHRoZSBzeW1ib2wgRkVEX1VTRF9DTlkgMyByb3dzIGJlZm9yZSBjdXJyZW50IHJvdyB0byAyIGRheXMgYWZ0ZXIgY3VycmVudCByb3clfCFTdGF0aXN0aWNhbHxyb2xsaW5nX3Zhcl9wb3A6OnJvbGxpbmdfdmFyX3BvcChOdW1iZXIgWCwgSW50ZWdlciBEMSwgSW50ZWdlciBEMikNCi0gUmV0dXJucyB0aGUgcm9sbGluZyBwb3B1bGF0aW9uIHZhcmlhbmNlIGJldHdlZW4gcm93IG9mZnNldCBEMSBmcm9tIGN1cnJlbnQgcm93IHRvIHJvdyBvZmZzZXQgRDIgZnJvbSBjdXJyZW50IHJvdw0KDQpFLmcuIHJvbGxpbmdfdmFyX3BvcChGRURfVVNEX0NOWSwgLTMsIDIpIHJldHVybnMgdGhlIHJvbGxpbmcgYXZlcmFnZSBvZiB0aGUgc3ltYm9sIEZFRF9VU0RfQ05ZIDMgcm93cyBiZWZvcmUgY3VycmVudCByb3cgdG8gMiBkYXlzIGFmdGVyIGN1cnJlbnQgcm93JXwhU3RhdGlzdGljYWx8cm9sbGluZ192YXJfc2FtcDo6cm9sbGluZ192YXJfc2FtcChOdW1iZXIgWCwgSW50ZWdlciBEMSwgSW50ZWdlciBEMikNCi0gUmV0dXJucyB0aGUgcm9sbGluZyBzYW1wbGUgdmFyaWFuY2UgYmV0d2VlbiByb3cgb2Zmc2V0IEQxIGZyb20gY3VycmVudCByb3cgdG8gcm93IG9mZnNldCBEMiBmcm9tIGN1cnJlbnQgcm93DQoNCkUuZy4gcm9sbGluZ192YXJfc2FtcChGRURfVVNEX0NOWSwgLTMsIDIpIHJldHVybnMgdGhlIHJvbGxpbmcgYXZlcmFnZSBvZiB0aGUgc3ltYm9sIEZFRF9VU0RfQ05ZIDMgcm93cyBiZWZvcmUgY3VycmVudCByb3cgdG8gMiBkYXlzIGFmdGVyIGN1cnJlbnQgcm93JXwhVHJpZ29ub21ldHJpY3xhY29zOjphY29zKE51bWJlciBYKQ0KLSBSZXR1cm5zIHRoZSBpbnZlcnNlIGNvc2luZSBvZiBhIG51bWJlciBpbiByYWRpYW5zDQoNCkUuZy4gYWNvcygwLjUpIHJldHVybnMgdmFsdWUgb2YgMS4wNDcxOTc1NTExOTY2JXwhVHJpZ29ub21ldHJpY3xhc2luOjphc2luKE51bWJlciBYKQ0KLSBSZXR1cm5zIHRoZSBpbnZlcnNlIHNpbmUgb2YgYSBudW1iZXIgaW4gcmFkaWFucw0KDQpFLmcuIGFzaW4oMC41KSByZXR1cm5zIHZhbHVlIG9mIDAuNTIzNTk4Nzc1NTk4Mjk5JXwhVHJpZ29ub21ldHJpY3xhdGFuOjphdGFuKE51bWJlciBYKQ0KLSBSZXR1cm5zIHRoZSBpbnZlcnNlIHRhbmdlbnQgb2YgYSBudW1iZXIgaW4gcmFkaWFucw0KDQpFLmcuIGF0YW4oMC41KSByZXR1cm5zIHZhbHVlIG9mIDAuNDYzNjQ3NjA5MDAwODA2JXwhVHJpZ29ub21ldHJpY3xhdGFuMjo6YXRhbjIoTnVtYmVyIFksIE51bWJlciBYKQ0KLSBSZXR1cm5zIHRoZSBpbnZlcnNlIHRhbmdlbnQgb2YgYSBZL1ggaW4gcmFkaWFucw0KDQpFLmcuIGF0YW4yKDUsMykgcmV0dXJucyB2YWx1ZSBvZiAxLjAzMDM3NjgyNjUyNDMxJXwhVHJpZ29ub21ldHJpY3xjb3M6OmNvcyhOdW1iZXIgWCkNCi0gUmV0dXJucyB0aGUgY29zaW5lIG9mIGEgbnVtYmVyIGluIHJhZGlhbnMNCg0KRS5nLiBjb3MoMikgcmV0dXJucyB2YWx1ZSBvZiAtMC40MTYxNDY4MzY1NDcxNDIlfCFUcmlnb25vbWV0cmljfGNvdDo6Y290KE51bWJlciBYKQ0KLSBSZXR1cm5zIHRoZSBjb3RhbmdlbnQgb2YgYSBudW1iZXIgaW4gcmFkaWFucw0KDQpFLmcuIGNvdCgyKSByZXR1cm5zIHZhbHVlIG9mIC0wLjQ1NzY1NzU1NDM2MDI4NiV8IVRyaWdvbm9tZXRyaWN8c2luOjpzaW4oTnVtYmVyIFgpDQotIFJldHVybnMgdGhlIHNpbmUgb2YgYSBudW1iZXIgaW4gcmFkaWFucw0KDQpFLmcuIHNpbigyKSByZXR1cm5zIHZhbHVlIG9mIDAuOTA5Mjk3NDI2ODI1NjgyJXwhVHJpZ29ub21ldHJpY3x0YW46OnRhbihOdW1iZXIgWCkNCi0gUmV0dXJucyB0aGUgdGFuZ2VudCBvZiBhIG51bWJlciBpbiByYWRpYW5zDQoNCkUuZy4gdGFuKDIpIHJldHVybnMgdmFsdWUgb2YgLTIuMTg1MDM5ODYzMjYxNTIlfCFXZWVrbHl8d2Vla2x5X2F2Zzo6d2Vla2x5X2F2ZyhOdW1iZXIgWCkNCi0gUmV0dXJucyB0aGUgd2Vla2x5IGF2ZXJhZ2UNCgoKRS5nLiB3ZWVrbHlfYXZnKEZFRF9VU0RfQ05ZKSByZXR1cm5zIHRoZSB3ZWVrbHkgYXZlcmFnZSBvZiB0aGUgc3ltYm9sIEZFRF9VU0RfQ05ZJXwhV2Vla2x5fHdlZWtseV9hdmdfc3RhcnRpbmc6OndlZWtseV9hdmdfc3RhcnRpbmcoTnVtYmVyIFgsTnVtYmVyIEQpDQotIFJldHVybnMgdGhlIHdlZWtseSBhdmVyYWdlIHN0YXJ0aW5nIGZyb20gZGF5IEQNCgoKRS5nLiB3ZWVrbHlfYXZnX3N0YXJ0aW5nKEZFRF9VU0RfQ05ZLDEpIHJldHVybnMgdGhlIHdlZWtseSBhdmVyYWdlIG9mIHRoZSBzeW1ib2wgRkVEX1VTRF9DTlkgc3RhcnRpbmcgTW9uZGF5JXwhV2Vla2x5fHdlZWtseV9tYXg6OndlZWtseV9tYXgoTnVtYmVyIFgpDQotIFJldHVybnMgdGhlIHdlZWtseSBtYXhpbXVtDQoKCkUuZy4gd2Vla2x5X21heChGRURfVVNEX0NOWSkgcmV0dXJucyB0aGUgd2Vla2x5IG1heGltdW0gb2YgdGhlIHN5bWJvbCBGRURfVVNEX0NOWSV8IVdlZWtseXx3ZWVrbHlfbWluOjp3ZWVrbHlfbWluKE51bWJlciBYKQ0KLSBSZXR1cm5zIHRoZSB3ZWVrbHkgbWluaW11bQ0KCgpFLmcuIHdlZWtseV9taW4oRkVEX1VTRF9DTlkpIHJldHVybnMgdGhlIHdlZWtseSBtaW5pbXVtIG9mIHRoZSBzeW1ib2wgRkVEX1VTRF9DTlklfCFXZWVrbHl8d2Vla2x5X3N0ZGRldjo6d2Vla2x5X3N0ZGRldihOdW1iZXIgWCkNCi0gUmV0dXJucyB0aGUgd2Vla2x5IHN0YW5kYXJkIGRldmlhdGlvbg0KCgpFLmcuIHdlZWtseV9zdGRkZXYoRkVEX1VTRF9DTlkpIHJldHVybnMgdGhlIHdlZWtseSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHN5bWJvbCBGRURfVVNEX0NOWSV8IVdlZWtseXx3ZWVrbHlfc3RkZGV2X3BvcDo6d2Vla2x5X3N0ZGRldl9wb3AoTnVtYmVyIFgpDQotIFJldHVybnMgdGhlIHdlZWtseSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbg0KCgpFLmcuIHdlZWtseV9zdGRkZXZfcG9wKEZFRF9VU0RfQ05ZKSByZXR1cm5zIHRoZSB3ZWVrbHkgcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHN5bWJvbCBGRURfVVNEX0NOWSV8IVdlZWtseXx3ZWVrbHlfc3RkZGV2X3NhbXA6OndlZWtseV9zdGRkZXZfc2FtcChOdW1iZXIgWCkNCi0gUmV0dXJucyB0aGUgd2Vla2x5IHNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24NCgoKRS5nLiB3ZWVrbHlfc3RkZGV2X3NhbXAoRkVEX1VTRF9DTlkpIHJldHVybnMgdGhlIHdlZWtseSBzYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBzeW1ib2wgRkVEX1VTRF9DTlklfCFXZWVrbHl8d2Vla2x5X3N1bTo6d2Vla2x5X3N1bShOdW1iZXIgWCkNCi0gUmV0dXJucyB0aGUgd2Vla2x5IHN1bQ0KCgpFLmcuIHdlZWtseV9zdW0oRkVEX1VTRF9DTlkpIHJldHVybnMgdGhlIHdlZWtseSBzdW0gb2YgdGhlIHN5bWJvbCBGRURfVVNEX0NOWSV8IVdlZWtseXx3ZWVrbHlfdmFyaWFuY2U6OndlZWtseV92YXJpYW5jZShOdW1iZXIgWCkNCi0gUmV0dXJucyB0aGUgd2Vla2x5IGF2ZXJhZ2UNCgoKRS5nLiB3ZWVrbHlfdmFyaWFuY2UoRkVEX1VTRF9DTlkpIHJldHVybnMgdGhlIHdlZWtseSB2YXJpYW5jZSBvZiB0aGUgc3ltYm9sIEZFRF9VU0RfQ05ZJXwhV2Vla2x5fHdlZWtseV92YXJfcG9wOjp3ZWVrbHlfdmFyX3BvcChOdW1iZXIgWCkNCi0gUmV0dXJucyB0aGUgd2Vla2x5IHBvcHVsYXRpb24gdmFyaWFuY2UNCgoKRS5nLiB3ZWVrbHlfdmFyX3BvcChGRURfVVNEX0NOWSkgcmV0dXJucyB0aGUgd2Vla2x5IHBvcHVsYXRpb24gdmFyaWFuY2Ugb2YgdGhlIHN5bWJvbCBGRURfVVNEX0NOWSV8IVdlZWtseXx3ZWVrbHlfdmFyX3NhbXA6OndlZWtseV92YXJfc2FtcChOdW1iZXIgWCkNCi0gUmV0dXJucyB0aGUgd2Vla2x5IHNhbXBsZSB2YXJpYW5jZQ0KCgpFLmcuIHdlZWtseV92YXJfc2FtcChGRURfVVNEX0NOWSkgcmV0dXJucyB0aGUgd2Vla2x5IHNhbXBsZSB2YXJpYW5jZSBvZiB0aGUgc3ltYm9sIEZFRF9VU0RfQ05ZJXwhWWVhcmx5fHllYXJseV9hdmc6OnllYXJseV9hdmcoTnVtYmVyIFgpDQotIFJldHVybnMgdGhlIHllYXJseSBhdmVyYWdlDQoKRS5nLiB5ZWFybHlfYXZnKEZFRF9VU0RfQ05ZKSByZXR1cm5zIHRoZSB5ZWFybHkgYXZlcmFnZSBvZiB0aGUgc3ltYm9sIEZFRF9VU0RfQ05ZJXwhWWVhcmx5fHllYXJseV9tYXg6OnllYXJseV9tYXgoTnVtYmVyIFgpDQotIFJldHVybnMgdGhlIHllYXJseSBtYXhpbXVtDQoKCkUuZy4geWVhcmx5X21heChGRURfVVNEX0NOWSkgcmV0dXJucyB0aGUgeWVhcmx5IG1heGltdW0gb2YgdGhlIHN5bWJvbCBGRURfVVNEX0NOWSV8IVllYXJseXx5ZWFybHlfbWluOjp5ZWFybHlfbWluKE51bWJlciBYKQ0KLSBSZXR1cm5zIHRoZSB5ZWFybHkgbWluaW11bQ0KCgpFLmcuIHllYXJseV9taW4oRkVEX1VTRF9DTlkpIHJldHVybnMgdGhlIHllYXJseSBtaW5pbXVtIG9mIHRoZSBzeW1ib2wgRkVEX1VTRF9DTlklfCFZZWFybHl8eWVhcmx5X3N0ZGRldjo6eWVhcmx5X3N0ZGRldihOdW1iZXIgWCkNCi0gUmV0dXJucyB0aGUgeWVhcmx5IHN0YW5kYXJkIGRldmlhdGlvbg0KCgpFLmcuIHllYXJseV9zdGRkZXYoRkVEX1VTRF9DTlkpIHJldHVybnMgdGhlIHllYXJseSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHN5bWJvbCBGRURfVVNEX0NOWSV8IVllYXJseXx5ZWFybHlfc3RkZGV2X3BvcDo6eWVhcmx5X3N0ZGRldl9wb3AoTnVtYmVyIFgpDQotIFJldHVybnMgdGhlIHllYXJseSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbg0KCgpFLmcuIHllYXJseV9zdGRkZXZfcG9wKEZFRF9VU0RfQ05ZKSByZXR1cm5zIHRoZSB5ZWFybHkgcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHN5bWJvbCBGRURfVVNEX0NOWSV8IVllYXJseXx5ZWFybHlfc3RkZGV2X3NhbXA6OnllYXJseV9zdGRkZXZfc2FtcChOdW1iZXIgWCkNCi0gUmV0dXJucyB0aGUgeWVhcmx5IHNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24NCgoKRS5nLiB5ZWFybHlfc3RkZGV2X3NhbXAoRkVEX1VTRF9DTlkpIHJldHVybnMgdGhlIHllYXJseSBzYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBzeW1ib2wgRkVEX1VTRF9DTlklfCFZZWFybHl8eWVhcmx5X3N1bTo6eWVhcmx5X3N1bShOdW1iZXIgWCkNCi0gUmV0dXJucyB0aGUgeWVhcmx5IHN1bQ0KCgpFLmcuIHllYXJseV9zdW0oRkVEX1VTRF9DTlkpIHJldHVybnMgdGhlIHllYXJseSBzdW0gb2YgdGhlIHN5bWJvbCBGRURfVVNEX0NOWSV8IVllYXJseXx5ZWFybHlfdmFyaWFuY2U6OnllYXJseV92YXJpYW5jZShOdW1iZXIgWCkNCi0gUmV0dXJucyB0aGUgeWVhcmx5IGF2ZXJhZ2UNCgoKRS5nLiB5ZWFybHlfdmFyaWFuY2UoRkVEX1VTRF9DTlkpIHJldHVybnMgdGhlIHllYXJseSB2YXJpYW5jZSBvZiB0aGUgc3ltYm9sIEZFRF9VU0RfQ05ZJXwhWWVhcmx5fHllYXJseV92YXJfcG9wOjp5ZWFybHlfdmFyX3BvcChOdW1iZXIgWCkNCi0gUmV0dXJucyB0aGUgeWVhcmx5IHBvcHVsYXRpb24gdmFyaWFuY2UNCgoKRS5nLiB5ZWFybHlfdmFyX3BvcChGRURfVVNEX0NOWSkgcmV0dXJucyB0aGUgeWVhcmx5IHBvcHVsYXRpb24gdmFyaWFuY2Ugb2YgdGhlIHN5bWJvbCBGRURfVVNEX0NOWSV8IVllYXJseXx5ZWFybHlfdmFyX3NhbXA6OnllYXJseV92YXJfc2FtcChOdW1iZXIgWCkKLSBSZXR1cm5zIHRoZSB5ZWFybHkgc2FtcGxlIHZhcmlhbmNlCgoKRS5nLiB5ZWFybHlfdmFyX3NhbXAoRkVEX1VTRF9DTlkpIHJldHVybnMgdGhlIHllYXJseSBzYW1wbGUgdmFyaWFuY2Ugb2YgdGhlIHN5bWJvbCBGRURfVVNEX0NOWQ==