OyBndm1hdDMyLmFzbSAtLSBBc20gcG9ydGlvbiBvZiB0aGUgb3B0aW1pemVkIGxvbmdlc3RfbWF0Y2ggZm9yIDMyIGJpdHMgeDg2DQo7IENvcHlyaWdodCAoQykgMTk5NS0xOTk2IEplYW4tbG91cCBHYWlsbHkgYW5kIEdpbGxlcyBWb2xsYW50Lg0KOyBGaWxlIHdyaXR0ZW4gYnkgR2lsbGVzIFZvbGxhbnQsIGJ5IG1vZGlmaXlpbmcgdGhlIGxvbmdlc3RfbWF0Y2gNCjsgIGZyb20gSmVhbi1sb3VwIEdhaWxseSBpbiBkZWZsYXRlLmMNCjsNCjsgICAgICAgICBodHRwOi8vd3d3LnpsaWIubmV0DQo7ICAgICAgICAgaHR0cDovL3d3dy53aW5pbWFnZS5jb20vekxpYkRsbA0KOyAgICAgICAgIGh0dHA6Ly93d3cubXVwcGV0bGFicy5jb20vfmJyZWFkYm94L3NvZnR3YXJlL2Fzc2VtYmx5Lmh0bWwNCjsNCjsgRm9yIFZpc3VhbCBDKysgNC54IGFuZCBoaWdoZXIgYW5kIE1MIDYueCBhbmQgaGlnaGVyDQo7ICAgbWwuZXhlIGlzIGluIGRpcmVjdG9yeSBcTUFTTTYxMUMgb2YgV2luOTUgRERLDQo7ICAgbWwuZXhlIGlzIGFsc28gZGlzdHJpYnV0ZWQgaW4gaHR0cDovL3d3dy5tYXNtMzIuY29tL21hc21kbC5odG0NCjsgICAgYW5kIGluIFZDKysyMDAzIHRvb2xraXQgYXQgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS92aXN1YWxjL3ZjdG9vbGtpdDIwMDMvDQo7DQo7IHRoaXMgZmlsZSBjb250YWluIHR3byBpbXBsZW1lbnRhdGlvbiBvZiBsb25nZXN0X21hdGNoDQo7DQo7ICBsb25nZXN0X21hdGNoXzdmZmYgOiB3cml0dGVuIDE5OTYgYnkgR2lsbGVzIFZvbGxhbnQgb3B0aW1pemVkIGZvcg0KOyAgICAgICAgICAgIGZpcnN0IFBlbnRpdW0uIEFzc3VtZSBzLT53X21hc2sgPT0gMHg3ZmZmDQo7ICBsb25nZXN0X21hdGNoXzY4NiA6IHdyaXR0ZW4gYnkgQnJpYW4gcmFpdGVyICgxOTk4KSwgb3B0aW1pemVkIGZvciBQZW50aXVtIFBybw0KOw0KOyAgZm9yIHVzaW5nIGFuIHNlZW1ibHkgdmVyc2lvbiBvZiBsb25nZXN0X21hdGNoLCB5b3UgbmVlZCBkZWZpbmUgQVNNViBpbiBwcm9qZWN0DQo7ICBUaGVyZSBpcyB0d28gd2F5IGluIHVzaW5nIGd2bWF0MzIuYXNtDQo7DQo7ICBBKSBTdWdnZXN0ZWQgbWV0aG9kDQo7ICAgIGlmIHlvdSB3YW50IGluY2x1ZGUgYm90aCBsb25nZXN0X21hdGNoXzdmZmYgYW5kIGxvbmdlc3RfbWF0Y2hfNjg2DQo7ICAgIGNvbXBpbGUgdGhlIGFzbSBmaWxlIHJ1bm5pbmcNCjsgICAgICAgICAgIG1sIC9jb2ZmIC9aaSAvRmxndm1hdDMyLmxzdCAvYyBndm1hdDMyLmFzbQ0KOyAgICBhbmQgaW5jbHVkZSBndm1hdDMyYy5jIGluIHlvdXIgcHJvamVjdA0KOyAgICBpZiB5b3UgaGF2ZSBhbiBvbGQgY3B1ICgzODYsNDg2IG9yIGZpcnN0IFBlbnRpdW0pIGFuZCBzLT53X21hc2s9PTB4N2ZmZiwNCjsgICAgICAgIGxvbmdlc3RfbWF0Y2hfN2ZmZiB3aWxsIGJlIHVzZWQNCjsgICAgaWYgeW91IGhhdmUgYSBtb3JlIG1vZGVybiBDUFUgKFBlbnRpdW0gUHJvLCBJSSBhbmQgaGlnaGVyKQ0KOyAgICAgICAgbG9uZ2VzdF9tYXRjaF82ODYgd2lsbCBiZSB1c2VkDQo7ICAgIG9uIG9sZCBjcHUgd2l0aCBzLT53X21hc2shPTB4N2ZmZiwgbG9uZ2VzdF9tYXRjaF82ODYgd2lsbCBiZSB1c2VkLA0KOyAgICAgICAgYnV0IHRoaXMgaXMgbm90IGEgc2l0YXRpb24geW91J2xsIGZpbmQgb2Z0ZW4NCjsNCjsgIEIpIEFsdGVybmF0aXZlDQo7ICAgIGlmIHlvdSBhcmUgbm90IGludGVycmVzZWQgaW4gb2xkIGNwdSBwZXJmb3JtYW5jZSBhbmQgd2FudCB0aGUgc21hbGxlcg0KOyAgICAgICBiaW5hcmllcyBwb3NzaWJsZQ0KOw0KOyAgICBjb21waWxlIHRoZSBhc20gZmlsZSBydW5uaW5nDQo7ICAgICAgICAgICBtbCAvY29mZiAvWmkgL2MgL0ZsZ3ZtYXQzMi5sc3QgL0ROT09MRFBFTlRJVU1DT0RFIGd2bWF0MzIuYXNtDQo7ICAgIGFuZCBkbyBub3QgaW5jbHVkZSBndm1hdDMyYy5jIGluIHlvdXIgcHJvamVjdCAob3UgZGVmaW5lIGFsc28NCjsgICAgICAgICAgICAgIE5PT0xEUEVOVElVTUNPREUpDQo7DQo7IG5vdGUgOiBhcyBJIGtub3duLCBsb25nZXN0X21hdGNoXzY4NiBpcyB2ZXJ5IGZhc3RlciB0aGFuIGxvbmdlc3RfbWF0Y2hfN2ZmZg0KOyAgICAgICAgb24gcGVudGl1bSBQcm8vSUkvSUlJLCBmYXN0ZXIgKGJ1dCBsZXNzKSBpbiBQNCwgYnV0IGl0IHNlZW0NCjsgICAgICAgIGxvbmdlc3RfbWF0Y2hfN2ZmZiBjYW4gYmUgZmFzdGVyICh2ZXJ5IHZlcnkgbGl0dGUpIG9uIEFNRCBBdGhsb242NC9LOA0KOw0KOyBzZWUgYmVsb3cgOiB6bGliMTIyMmFkZCBtdXN0IGJlIGFkanVzdGVyIGlmIHlvdSB1c2UgYSB6bGliIHZlcnNpb24gPCAxLjIuMi4yDQoNCjt1SW50IGxvbmdlc3RfbWF0Y2hfN2ZmZihzLCBjdXJfbWF0Y2gpDQo7ICAgIGRlZmxhdGVfc3RhdGUgKnM7DQo7ICAgIElQb3MgY3VyX21hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBtYXRjaCAqLw0KDQogICAgTmJTdGFjayAgICAgICAgIGVxdSAgICAgNzYNCiAgICBjdXJfbWF0Y2ggICAgICAgZXF1ICAgICBkd29yZCBwdHJbZXNwK05iU3RhY2stMF0NCiAgICBzdHJfcyAgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHJbZXNwK05iU3RhY2stNF0NCjsgNSBkd29yZCBvbiB0b3AgKHJldCxlYnAsZXNpLGVkaSxlYngpDQogICAgYWRycmV0ICAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLThdDQogICAgcHVzaGVicCAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTEyXQ0KICAgIHB1c2hlZGkgICAgICAgICBlcXUgICAgIGR3b3JkIHB0cltlc3ArTmJTdGFjay0xNl0NCiAgICBwdXNoZXNpICAgICAgICAgZXF1ICAgICBkd29yZCBwdHJbZXNwK05iU3RhY2stMjBdDQogICAgcHVzaGVieCAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTI0XQ0KDQogICAgY2hhaW5fbGVuZ3RoICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay0yOF0NCiAgICBsaW1pdCAgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTMyXQ0KICAgIGJlc3RfbGVuICAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stMzZdDQogICAgd2luZG93ICAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay00MF0NCiAgICBwcmV2ICAgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTQ0XQ0KICAgIHNjYW5fc3RhcnQgICAgICBlcXUgICAgICB3b3JkIHB0ciBbZXNwK05iU3RhY2stNDhdDQogICAgd21hc2sgICAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay01Ml0NCiAgICBtYXRjaF9zdGFydF9wdHIgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTU2XQ0KICAgIG5pY2VfbWF0Y2ggICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNjBdDQogICAgc2NhbiAgICAgICAgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay02NF0NCg0KICAgIHdpbmRvd2xlbiAgICAgICBlcXUgICAgIGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNjhdDQogICAgbWF0Y2hfc3RhcnQgICAgIGVxdSAgICAgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay03Ml0NCiAgICBzdHJlbmQgICAgICAgICAgZXF1ICAgICBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTc2XQ0KICAgIE5iU3RhY2tBZGQgICAgICBlcXUgICAgIChOYlN0YWNrLTI0KQ0KDQogICAgLjM4NnANCg0KICAgIG5hbWUgICAgZ3ZtYXRjaA0KICAgIC5NT0RFTCAgRkxBVA0KDQoNCg0KOyAgYWxsIHRoZSAremxpYjEyMjJhZGQgb2Zmc2V0cyBhcmUgZHVlIHRvIHRoZSBhZGRpdGlvbiBvZiBmaWVsZHMNCjsgIGluIHpsaWIgaW4gdGhlIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlIHNpbmNlIHRoZSBhc20gY29kZSB3YXMgZmlyc3Qgd3JpdHRlbg0KOyAgKGlmIHlvdSBjb21waWxlIHdpdGggemxpYiAxLjAuNCBvciBvbGRlciwgdXNlICJ6bGliMTIyMmFkZCBlcXUgKC00KSIpLg0KOyAgKGlmIHlvdSBjb21waWxlIHdpdGggemxpYiBiZXR3ZWVuIDEuMC41IGFuZCAxLjIuMi4xLCB1c2UgInpsaWIxMjIyYWRkIGVxdSAwIikuDQo7ICBpZiB5b3UgY29tcGlsZSB3aXRoIHpsaWIgMS4yLjIuMiBvciBsYXRlciAsIHVzZSAiemxpYjEyMjJhZGQgZXF1IDgiKS4NCg0KICAgIHpsaWIxMjIyYWRkICAgICAgICAgZXF1ICAgICA4DQoNCjsgIE5vdGUgOiB0aGVzZSB2YWx1ZSBhcmUgZ29vZCB3aXRoIGEgOCBieXRlcyBib3VuZGFyeSBwYWNrIHN0cnVjdHVyZQ0KICAgIGRlcF9jaGFpbl9sZW5ndGggICAgZXF1ICAgICA3NGgremxpYjEyMjJhZGQNCiAgICBkZXBfd2luZG93ICAgICAgICAgIGVxdSAgICAgMzBoK3psaWIxMjIyYWRkDQogICAgZGVwX3N0cnN0YXJ0ICAgICAgICBlcXUgICAgIDY0aCt6bGliMTIyMmFkZA0KICAgIGRlcF9wcmV2X2xlbmd0aCAgICAgZXF1ICAgICA3MGgremxpYjEyMjJhZGQNCiAgICBkZXBfbmljZV9tYXRjaCAgICAgIGVxdSAgICAgODhoK3psaWIxMjIyYWRkDQogICAgZGVwX3dfc2l6ZSAgICAgICAgICBlcXUgICAgIDI0aCt6bGliMTIyMmFkZA0KICAgIGRlcF9wcmV2ICAgICAgICAgICAgZXF1ICAgICAzOGgremxpYjEyMjJhZGQNCiAgICBkZXBfd19tYXNrICAgICAgICAgIGVxdSAgICAgMmNoK3psaWIxMjIyYWRkDQogICAgZGVwX2dvb2RfbWF0Y2ggICAgICBlcXUgICAgIDg0aCt6bGliMTIyMmFkZA0KICAgIGRlcF9tYXRjaF9zdGFydCAgICAgZXF1ICAgICA2OGgremxpYjEyMjJhZGQNCiAgICBkZXBfbG9va2FoZWFkICAgICAgIGVxdSAgICAgNmNoK3psaWIxMjIyYWRkDQoNCg0KX1RFWFQgICAgICAgICAgICAgICAgICAgc2VnbWVudA0KDQpJRkRFRiBOT1VOREVSTElORQ0KICAgSUZERUYgTk9PTERQRU5USVVNQ09ERQ0KICAgICAgICAgICAgcHVibGljICBsb25nZXN0X21hdGNoDQogICAgICAgICAgICBwdWJsaWMgIG1hdGNoX2luaXQNCiAgIEVMU0UNCiAgICAgICAgICAgIHB1YmxpYyAgbG9uZ2VzdF9tYXRjaF83ZmZmDQogICAgICAgICAgICBwdWJsaWMgIGNwdWRldGVjdDMyDQogICAgICAgICAgICBwdWJsaWMgIGxvbmdlc3RfbWF0Y2hfNjg2DQogICBFTkRJRg0KRUxTRQ0KICAgSUZERUYgTk9PTERQRU5USVVNQ09ERQ0KICAgICAgICAgICAgcHVibGljICBfbG9uZ2VzdF9tYXRjaA0KICAgICAgICAgICAgcHVibGljICBfbWF0Y2hfaW5pdA0KICAgRUxTRQ0KICAgICAgICAgICAgcHVibGljICBfbG9uZ2VzdF9tYXRjaF83ZmZmDQogICAgICAgICAgICBwdWJsaWMgIF9jcHVkZXRlY3QzMg0KICAgICAgICAgICAgcHVibGljICBfbG9uZ2VzdF9tYXRjaF82ODYNCiAgIEVORElGDQpFTkRJRg0KDQogICAgTUFYX01BVENIICAgICAgICAgICBlcXUgICAgIDI1OA0KICAgIE1JTl9NQVRDSCAgICAgICAgICAgZXF1ICAgICAzDQogICAgTUlOX0xPT0tBSEVBRCAgICAgICBlcXUgICAgIChNQVhfTUFUQ0grTUlOX01BVENIKzEpDQoNCg0KDQpJRk5ERUYgTk9PTERQRU5USVVNQ09ERQ0KSUZERUYgTk9VTkRFUkxJTkUNCmxvbmdlc3RfbWF0Y2hfN2ZmZiAgIHByb2MgbmVhcg0KRUxTRQ0KX2xvbmdlc3RfbWF0Y2hfN2ZmZiAgcHJvYyBuZWFyDQpFTkRJRg0KDQogICAgbW92ICAgICBlZHgsW2VzcCs0XQ0KDQoNCg0KICAgIHB1c2ggICAgZWJwDQogICAgcHVzaCAgICBlZGkNCiAgICBwdXNoICAgIGVzaQ0KICAgIHB1c2ggICAgZWJ4DQoNCiAgICBzdWIgICAgIGVzcCxOYlN0YWNrQWRkDQoNCjsgaW5pdGlhbGl6ZSBvciBjaGVjayB0aGUgdmFyaWFibGVzIHVzZWQgaW4gbWF0Y2guYXNtLg0KICAgIG1vdiAgICAgZWJwLGVkeA0KDQo7IGNoYWluX2xlbmd0aCA9IHMtPm1heF9jaGFpbl9sZW5ndGgNCjsgaWYgKHByZXZfbGVuZ3RoPj1nb29kX21hdGNoKSBjaGFpbl9sZW5ndGggPj49IDINCiAgICBtb3YgICAgIGVkeCxbZWJwK2RlcF9jaGFpbl9sZW5ndGhdDQogICAgbW92ICAgICBlYngsW2VicCtkZXBfcHJldl9sZW5ndGhdDQogICAgY21wICAgICBbZWJwK2RlcF9nb29kX21hdGNoXSxlYngNCiAgICBqYSAgICAgIG5vc2hyDQogICAgc2hyICAgICBlZHgsMg0Kbm9zaHI6DQo7IHdlIGluY3JlbWVudCBjaGFpbl9sZW5ndGggYmVjYXVzZSBpbiB0aGUgYXNtLCB0aGUgLS1jaGFpbl9sZW5naHQgaXMgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgbG9vcA0KICAgIGluYyAgICAgZWR4DQogICAgbW92ICAgICBlZGksW2VicCtkZXBfbmljZV9tYXRjaF0NCiAgICBtb3YgICAgIGNoYWluX2xlbmd0aCxlZHgNCiAgICBtb3YgICAgIGVheCxbZWJwK2RlcF9sb29rYWhlYWRdDQogICAgY21wICAgICBlYXgsZWRpDQo7IGlmICgodUludCluaWNlX21hdGNoID4gcy0+bG9va2FoZWFkKSBuaWNlX21hdGNoID0gcy0+bG9va2FoZWFkOw0KICAgIGphZSAgICAgbm9sb29rYWhlYWRuaWNlbWF0Y2gNCiAgICBtb3YgICAgIGVkaSxlYXgNCm5vbG9va2FoZWFkbmljZW1hdGNoOg0KOyBiZXN0X2xlbiA9IHMtPnByZXZfbGVuZ3RoDQogICAgbW92ICAgICBiZXN0X2xlbixlYngNCg0KOyB3aW5kb3cgPSBzLT53aW5kb3cNCiAgICBtb3YgICAgIGVzaSxbZWJwK2RlcF93aW5kb3ddDQogICAgbW92ICAgICBlY3gsW2VicCtkZXBfc3Ryc3RhcnRdDQogICAgbW92ICAgICB3aW5kb3csZXNpDQoNCiAgICBtb3YgICAgIG5pY2VfbWF0Y2gsZWRpDQo7IHNjYW4gPSB3aW5kb3cgKyBzdHJzdGFydA0KICAgIGFkZCAgICAgZXNpLGVjeA0KICAgIG1vdiAgICAgc2Nhbixlc2kNCjsgZHggPSAqd2luZG93DQogICAgbW92ICAgICBkeCx3b3JkIHB0ciBbZXNpXQ0KOyBieCA9ICood2luZG93K2Jlc3RfbGVuLTEpDQogICAgbW92ICAgICBieCx3b3JkIHB0ciBbZXNpK2VieC0xXQ0KICAgIGFkZCAgICAgZXNpLE1BWF9NQVRDSC0xDQo7IHNjYW5fc3RhcnQgPSAqc2Nhbg0KICAgIG1vdiAgICAgc2Nhbl9zdGFydCxkeA0KOyBzdHJlbmQgPSBzY2FuICsgTUFYX01BVENILTENCiAgICBtb3YgICAgIHN0cmVuZCxlc2kNCjsgYnggPSBzY2FuX2VuZCA9ICood2luZG93K2Jlc3RfbGVuLTEpDQoNCjsgICAgSVBvcyBsaW1pdCA9IHMtPnN0cnN0YXJ0ID4gKElQb3MpTUFYX0RJU1QocykgPw0KOyAgICAgICAgcy0+c3Ryc3RhcnQgLSAoSVBvcylNQVhfRElTVChzKSA6IE5JTDsNCg0KICAgIG1vdiAgICAgZXNpLFtlYnArZGVwX3dfc2l6ZV0NCiAgICBzdWIgICAgIGVzaSxNSU5fTE9PS0FIRUFEDQo7IGhlcmUgZXNpID0gTUFYX0RJU1QocykNCiAgICBzdWIgICAgIGVjeCxlc2kNCiAgICBqYSAgICAgIG5vZGlzdA0KICAgIHhvciAgICAgZWN4LGVjeA0Kbm9kaXN0Og0KICAgIG1vdiAgICAgbGltaXQsZWN4DQoNCjsgcHJldiA9IHMtPnByZXYNCiAgICBtb3YgICAgIGVkeCxbZWJwK2RlcF9wcmV2XQ0KICAgIG1vdiAgICAgcHJldixlZHgNCg0KOw0KICAgIG1vdiAgICAgZWR4LGR3b3JkIHB0ciBbZWJwK2RlcF9tYXRjaF9zdGFydF0NCiAgICBtb3YgICAgIGJwLHNjYW5fc3RhcnQNCiAgICBtb3YgICAgIGVheCxjdXJfbWF0Y2gNCiAgICBtb3YgICAgIG1hdGNoX3N0YXJ0LGVkeA0KDQogICAgbW92ICAgICBlZHgsd2luZG93DQogICAgbW92ICAgICBlZGksZWR4DQogICAgYWRkICAgICBlZGksYmVzdF9sZW4NCiAgICBtb3YgICAgIGVzaSxwcmV2DQogICAgZGVjICAgICBlZGkNCjsgd2luZG93bGVuID0gd2luZG93ICsgYmVzdF9sZW4gLTENCiAgICBtb3YgICAgIHdpbmRvd2xlbixlZGkNCg0KICAgIGptcCAgICAgYmVnaW5sb29wMg0KICAgIGFsaWduICAgNA0KDQo7IGhlcmUsIGluIHRoZSBsb29wDQo7ICAgICAgIGVheCA9IGF4ID0gY3VyX21hdGNoDQo7ICAgICAgIGVjeCA9IGxpbWl0DQo7ICAgICAgICBieCA9IHNjYW5fZW5kDQo7ICAgICAgICBicCA9IHNjYW5fc3RhcnQNCjsgICAgICAgZWRpID0gd2luZG93bGVuICh3aW5kb3cgKyBiZXN0X2xlbiAtMSkNCjsgICAgICAgZXNpID0gcHJldg0KDQoNCjsvLyBoZXJlOyBjaGFpbl9sZW5ndGggPD0xNg0Kbm9ybWFsYmVnMGFkZDE2Og0KICAgIGFkZCAgICAgY2hhaW5fbGVuZ3RoLDE2DQogICAganogICAgICBleGl0bG9vcA0Kbm9ybWFsYmVnMDoNCiAgICBjbXAgICAgIHdvcmQgcHRyW2VkaStlYXhdLGJ4DQogICAgamUgICAgICBub3JtYWxiZWcybm9yb2xsDQpyY29udGxhYm5vcm9sbDoNCjsgY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10NCiAgICBhbmQgICAgIGVheCw3ZmZmaA0KICAgIG1vdiAgICAgYXgsd29yZCBwdHJbZXNpK2VheCoyXQ0KOyBpZiBjdXJfbWF0Y2ggPiBsaW1pdCwgZ28gdG8gZXhpdGxvb3ANCiAgICBjbXAgICAgIGVjeCxlYXgNCiAgICBqbmIgICAgIGV4aXRsb29wDQo7IGlmIC0tY2hhaW5fbGVuZ3RoICE9IDAsIGdvIHRvIGV4aXRsb29wDQogICAgZGVjICAgICBjaGFpbl9sZW5ndGgNCiAgICBqbnogICAgIG5vcm1hbGJlZzANCiAgICBqbXAgICAgIGV4aXRsb29wDQoNCm5vcm1hbGJlZzJub3JvbGw6DQo7IGlmIChzY2FuX3N0YXJ0PT0qKGN1cl9tYXRjaCt3aW5kb3cpKSBnb3RvIG5vcm1hbGJlZzINCiAgICBjbXAgICAgIGJwLHdvcmQgcHRyW2VkeCtlYXhdDQogICAgam5lICAgICByY29udGxhYm5vcm9sbA0KICAgIGptcCAgICAgbm9ybWFsYmVnMg0KDQpjb250bG9vcDM6DQogICAgbW92ICAgICBlZGksd2luZG93bGVuDQoNCjsgY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10NCiAgICBhbmQgICAgIGVheCw3ZmZmaA0KICAgIG1vdiAgICAgYXgsd29yZCBwdHJbZXNpK2VheCoyXQ0KOyBpZiBjdXJfbWF0Y2ggPiBsaW1pdCwgZ28gdG8gZXhpdGxvb3ANCiAgICBjbXAgICAgIGVjeCxlYXgNCmpuYmV4aXRsb29wc2hvcnQxOg0KICAgIGpuYiAgICAgZXhpdGxvb3ANCjsgaWYgLS1jaGFpbl9sZW5ndGggIT0gMCwgZ28gdG8gZXhpdGxvb3ANCg0KDQo7IGJlZ2luIHRoZSBtYWluIGxvb3ANCmJlZ2lubG9vcDI6DQogICAgc3ViICAgICBjaGFpbl9sZW5ndGgsMTYrMQ0KOyBpZiBjaGFpbl9sZW5ndGggPD0xNiwgZG9uJ3QgdXNlIHRoZSB1bnJvbGxlZCBsb29wDQogICAgam5hICAgICBub3JtYWxiZWcwYWRkMTYNCg0KZG8xNjoNCiAgICBjbXAgICAgIHdvcmQgcHRyW2VkaStlYXhdLGJ4DQogICAgamUgICAgICBub3JtYWxiZWcyZGMwDQoNCm1hY2NuICAgTUFDUk8gICBsYWINCiAgICBhbmQgICAgIGVheCw3ZmZmaA0KICAgIG1vdiAgICAgYXgsd29yZCBwdHJbZXNpK2VheCoyXQ0KICAgIGNtcCAgICAgZWN4LGVheA0KICAgIGpuYiAgICAgZXhpdGxvb3ANCiAgICBjbXAgICAgIHdvcmQgcHRyW2VkaStlYXhdLGJ4DQogICAgamUgICAgICBsYWINCiAgICBFTkRNDQoNCnJjb250bG9vcDA6DQogICAgbWFjY24gICBub3JtYWxiZWcyZGMxDQoNCnJjb250bG9vcDE6DQogICAgbWFjY24gICBub3JtYWxiZWcyZGMyDQoNCnJjb250bG9vcDI6DQogICAgbWFjY24gICBub3JtYWxiZWcyZGMzDQoNCnJjb250bG9vcDM6DQogICAgbWFjY24gICBub3JtYWxiZWcyZGM0DQoNCnJjb250bG9vcDQ6DQogICAgbWFjY24gICBub3JtYWxiZWcyZGM1DQoNCnJjb250bG9vcDU6DQogICAgbWFjY24gICBub3JtYWxiZWcyZGM2DQoNCnJjb250bG9vcDY6DQogICAgbWFjY24gICBub3JtYWxiZWcyZGM3DQoNCnJjb250bG9vcDc6DQogICAgbWFjY24gICBub3JtYWxiZWcyZGM4DQoNCnJjb250bG9vcDg6DQogICAgbWFjY24gICBub3JtYWxiZWcyZGM5DQoNCnJjb250bG9vcDk6DQogICAgbWFjY24gICBub3JtYWxiZWcyZGMxMA0KDQpyY29udGxvb3AxMDoNCiAgICBtYWNjbiAgIHNob3J0IG5vcm1hbGJlZzJkYzExDQoNCnJjb250bG9vcDExOg0KICAgIG1hY2NuICAgc2hvcnQgbm9ybWFsYmVnMmRjMTINCg0KcmNvbnRsb29wMTI6DQogICAgbWFjY24gICBzaG9ydCBub3JtYWxiZWcyZGMxMw0KDQpyY29udGxvb3AxMzoNCiAgICBtYWNjbiAgIHNob3J0IG5vcm1hbGJlZzJkYzE0DQoNCnJjb250bG9vcDE0Og0KICAgIG1hY2NuICAgc2hvcnQgbm9ybWFsYmVnMmRjMTUNCg0KcmNvbnRsb29wMTU6DQogICAgYW5kICAgICBlYXgsN2ZmZmgNCiAgICBtb3YgICAgIGF4LHdvcmQgcHRyW2VzaStlYXgqMl0NCiAgICBjbXAgICAgIGVjeCxlYXgNCiAgICBqbmIgICAgIGV4aXRsb29wDQoNCiAgICBzdWIgICAgIGNoYWluX2xlbmd0aCwxNg0KICAgIGphICAgICAgZG8xNg0KICAgIGptcCAgICAgbm9ybWFsYmVnMGFkZDE2DQoNCjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7DQoNCm5vcm1iZWcgTUFDUk8gICByY29udGxhYix2YWxzdWINCjsgaWYgd2UgYXJlIGhlcmUsIHdlIGtub3cgdGhhdCAqKG1hdGNoK2Jlc3RfbGVuLTEpID09IHNjYW5fZW5kDQogICAgY21wICAgICBicCx3b3JkIHB0cltlZHgrZWF4XQ0KOyBpZiAobWF0Y2ggIT0gc2Nhbl9zdGFydCkgZ290byByY29udGxhYg0KICAgIGpuZSAgICAgcmNvbnRsYWINCjsgY2FsY3VsYXRlIHRoZSBnb29kIGNoYWluX2xlbmd0aCwgYW5kIHdlJ2xsIGNvbXBhcmUgc2NhbiBhbmQgbWF0Y2ggc3RyaW5nDQogICAgYWRkICAgICBjaGFpbl9sZW5ndGgsMTYtdmFsc3ViDQogICAgam1wICAgICBpc2VxDQogICAgRU5ETQ0KDQoNCm5vcm1hbGJlZzJkYzExOg0KICAgIG5vcm1iZWcgcmNvbnRsb29wMTEsMTENCg0Kbm9ybWFsYmVnMmRjMTI6DQogICAgbm9ybWJlZyBzaG9ydCByY29udGxvb3AxMiwxMg0KDQpub3JtYWxiZWcyZGMxMzoNCiAgICBub3JtYmVnIHNob3J0IHJjb250bG9vcDEzLDEzDQoNCm5vcm1hbGJlZzJkYzE0Og0KICAgIG5vcm1iZWcgc2hvcnQgcmNvbnRsb29wMTQsMTQNCg0Kbm9ybWFsYmVnMmRjMTU6DQogICAgbm9ybWJlZyBzaG9ydCByY29udGxvb3AxNSwxNQ0KDQpub3JtYWxiZWcyZGMxMDoNCiAgICBub3JtYmVnIHJjb250bG9vcDEwLDEwDQoNCm5vcm1hbGJlZzJkYzk6DQogICAgbm9ybWJlZyByY29udGxvb3A5LDkNCg0Kbm9ybWFsYmVnMmRjODoNCiAgICBub3JtYmVnIHJjb250bG9vcDgsOA0KDQpub3JtYWxiZWcyZGM3Og0KICAgIG5vcm1iZWcgcmNvbnRsb29wNyw3DQoNCm5vcm1hbGJlZzJkYzY6DQogICAgbm9ybWJlZyByY29udGxvb3A2LDYNCg0Kbm9ybWFsYmVnMmRjNToNCiAgICBub3JtYmVnIHJjb250bG9vcDUsNQ0KDQpub3JtYWxiZWcyZGM0Og0KICAgIG5vcm1iZWcgcmNvbnRsb29wNCw0DQoNCm5vcm1hbGJlZzJkYzM6DQogICAgbm9ybWJlZyByY29udGxvb3AzLDMNCg0Kbm9ybWFsYmVnMmRjMjoNCiAgICBub3JtYmVnIHJjb250bG9vcDIsMg0KDQpub3JtYWxiZWcyZGMxOg0KICAgIG5vcm1iZWcgcmNvbnRsb29wMSwxDQoNCm5vcm1hbGJlZzJkYzA6DQogICAgbm9ybWJlZyByY29udGxvb3AwLDANCg0KDQo7IHdlIGdvIGluIG5vcm1hbGJlZzIgYmVjYXVzZSAqKHVzaGYqKShtYXRjaCtiZXN0X2xlbi0xKSA9PSBzY2FuX2VuZA0KDQpub3JtYWxiZWcyOg0KICAgIG1vdiAgICAgZWRpLHdpbmRvdw0KDQogICAgY21wICAgICBicCx3b3JkIHB0cltlZGkrZWF4XQ0KICAgIGpuZSAgICAgY29udGxvb3AzICAgICAgICAgICAgICAgICAgIDsgaWYgKih1c2hmKiltYXRjaCAhPSBzY2FuX3N0YXJ0LCBjb250aW51ZQ0KDQppc2VxOg0KOyBpZiB3ZSBhcmUgaGVyZSwgd2Uga25vdyB0aGF0ICoobWF0Y2grYmVzdF9sZW4tMSkgPT0gc2Nhbl9lbmQNCjsgYW5kIChtYXRjaCA9PSBzY2FuX3N0YXJ0KQ0KDQogICAgbW92ICAgICBlZGksZWR4DQogICAgbW92ICAgICBlc2ksc2NhbiAgICAgICAgICAgICAgICAgICAgOyBlc2kgPSBzY2FuDQogICAgYWRkICAgICBlZGksZWF4ICAgICAgICAgICAgICAgICAgICAgOyBlZGkgPSB3aW5kb3cgKyBjdXJfbWF0Y2ggPSBtYXRjaA0KDQogICAgbW92ICAgICBlZHgsW2VzaSszXSAgICAgICAgICAgICAgICAgOyBjb21wYXJlIG1hbnVhbGx5IGR3b3JkIGF0IG1hdGNoKzMNCiAgICB4b3IgICAgIGVkeCxbZWRpKzNdICAgICAgICAgICAgICAgICA7IGFuZCBzY2FuICszDQoNCiAgICBqeiAgICAgIGJlZ2luY29tcGFyZSAgICAgICAgICAgICAgICA7IGlmIGVxdWFsLCBnbyB0byBsb25nIGNvbXBhcmUNCg0KOyB3ZSB3aWxsIGRldGVybWluZSB0aGUgdW5tYXRjaCBieXRlIGFuZCBjYWxjdWxhdGUgbGVuIChpbiBlc2kpDQogICAgb3IgICAgICBkbCxkbA0KICAgIGplICAgICAgZXExcnINCiAgICBtb3YgICAgIGVzaSwzDQogICAgam1wICAgICB0cmZpbnZhbA0KZXExcnI6DQogICAgb3IgICAgICBkeCxkeA0KICAgIGplICAgICAgZXExDQoNCiAgICBtb3YgICAgIGVzaSw0DQogICAgam1wICAgICB0cmZpbnZhbA0KZXExOg0KICAgIGFuZCAgICAgZWR4LDBmZmZmZmZoDQogICAganogICAgICBlcTExDQogICAgbW92ICAgICBlc2ksNQ0KICAgIGptcCAgICAgdHJmaW52YWwNCmVxMTE6DQogICAgbW92ICAgICBlc2ksNg0KICAgIGptcCAgICAgdHJmaW52YWwNCg0KYmVnaW5jb21wYXJlOg0KICAgIDsgaGVyZSB3ZSBub3cgc2NhbiBhbmQgbWF0Y2ggYmVnaW4gc2FtZQ0KICAgIGFkZCAgICAgZWRpLDYNCiAgICBhZGQgICAgIGVzaSw2DQogICAgbW92ICAgICBlY3gsKE1BWF9NQVRDSC0oMis0KSkvNCAgICAgOyBzY2FuIGZvciBhdCBtb3N0IE1BWF9NQVRDSCBieXRlcw0KICAgIHJlcGUgICAgY21wc2QgICAgICAgICAgICAgICAgICAgICAgIDsgbG9vcCB1bnRpbCBtaXNtYXRjaA0KDQogICAgamUgICAgICB0cmZpbiAgICAgICAgICAgICAgICAgICAgICAgOyBnbyB0byB0cmZpbiBpZiBub3QgdW5tYXRjaA0KOyB3ZSBkZXRlcm1pbmUgdGhlIHVubWF0Y2ggYnl0ZQ0KICAgIHN1YiAgICAgZXNpLDQNCiAgICBtb3YgICAgIGVkeCxbZWRpLTRdDQogICAgeG9yICAgICBlZHgsW2VzaV0NCg0KICAgIG9yICAgICAgZGwsZGwNCiAgICBqbnogICAgIHRyZmluDQogICAgaW5jICAgICBlc2kNCg0KICAgIG9yICAgICAgZHgsZHgNCiAgICBqbnogICAgIHRyZmluDQogICAgaW5jICAgICBlc2kNCg0KICAgIGFuZCAgICAgZWR4LDBmZmZmZmZoDQogICAgam56ICAgICB0cmZpbg0KICAgIGluYyAgICAgZXNpDQoNCnRyZmluOg0KICAgIHN1YiAgICAgZXNpLHNjYW4gICAgICAgICAgOyBlc2kgPSBsZW4NCnRyZmludmFsOg0KOyBoZXJlIHdlIGhhdmUgZmluaXNlZCBjb21wYXJlLCBhbmQgZXNpIGNvbnRhaW4gbGVuIG9mIGVxdWFsIHN0cmluZw0KICAgIGNtcCAgICAgZXNpLGJlc3RfbGVuICAgICAgICA7IGlmIGxlbiA+IGJlc3RfbGVuLCBnbyBuZXdiZXN0bGVuDQogICAgamEgICAgICBzaG9ydCBuZXdiZXN0bGVuDQo7IG5vdyB3ZSByZXN0b3JlIGVkeCwgZWN4IGFuZCBlc2ksIGZvciB0aGUgYmlnIGxvb3ANCiAgICBtb3YgICAgIGVzaSxwcmV2DQogICAgbW92ICAgICBlY3gsbGltaXQNCiAgICBtb3YgICAgIGVkeCx3aW5kb3cNCiAgICBqbXAgICAgIGNvbnRsb29wMw0KDQpuZXdiZXN0bGVuOg0KICAgIG1vdiAgICAgYmVzdF9sZW4sZXNpICAgICAgICA7IGxlbiBiZWNvbWUgYmVzdF9sZW4NCg0KICAgIG1vdiAgICAgbWF0Y2hfc3RhcnQsZWF4ICAgICA7IHNhdmUgbmV3IHBvc2l0aW9uIGFzIG1hdGNoX3N0YXJ0DQogICAgY21wICAgICBlc2ksbmljZV9tYXRjaCAgICAgIDsgaWYgYmVzdF9sZW4gPj0gbmljZV9tYXRjaCwgZXhpdA0KICAgIGphZSAgICAgZXhpdGxvb3ANCiAgICBtb3YgICAgIGVjeCxzY2FuDQogICAgbW92ICAgICBlZHgsd2luZG93ICAgICAgICAgIDsgcmVzdG9yZSBlZHg9d2luZG93DQogICAgYWRkICAgICBlY3gsZXNpDQogICAgYWRkICAgICBlc2ksZWR4DQoNCiAgICBkZWMgICAgIGVzaQ0KICAgIG1vdiAgICAgd2luZG93bGVuLGVzaSAgICAgICA7IHdpbmRvd2xlbiA9IHdpbmRvdyArIGJlc3RfbGVuLTENCiAgICBtb3YgICAgIGJ4LFtlY3gtMV0gICAgICAgICAgOyBieCA9ICooc2NhbitiZXN0X2xlbi0xKSA9IHNjYW5fZW5kDQoNCjsgbm93IHdlIHJlc3RvcmUgZWN4IGFuZCBlc2ksIGZvciB0aGUgYmlnIGxvb3AgOg0KICAgIG1vdiAgICAgZXNpLHByZXYNCiAgICBtb3YgICAgIGVjeCxsaW1pdA0KICAgIGptcCAgICAgY29udGxvb3AzDQoNCmV4aXRsb29wOg0KOyBleGl0IDogcy0+bWF0Y2hfc3RhcnQ9bWF0Y2hfc3RhcnQNCiAgICBtb3YgICAgIGVieCxtYXRjaF9zdGFydA0KICAgIG1vdiAgICAgZWJwLHN0cl9zDQogICAgbW92ICAgICBlY3gsYmVzdF9sZW4NCiAgICBtb3YgICAgIGR3b3JkIHB0ciBbZWJwK2RlcF9tYXRjaF9zdGFydF0sZWJ4DQogICAgbW92ICAgICBlYXgsZHdvcmQgcHRyIFtlYnArZGVwX2xvb2thaGVhZF0NCiAgICBjbXAgICAgIGVjeCxlYXgNCiAgICBqYSAgICAgIG1pbmV4bG8NCiAgICBtb3YgICAgIGVheCxlY3gNCm1pbmV4bG86DQo7IHJldHVybiBtaW4oYmVzdF9sZW4scy0+bG9va2FoZWFkKQ0KDQo7IHJlc3RvcmUgc3RhY2sgYW5kIHJlZ2lzdGVyIGVieCxlc2ksZWRpLGVicA0KICAgIGFkZCAgICAgZXNwLE5iU3RhY2tBZGQNCg0KICAgIHBvcCAgICAgZWJ4DQogICAgcG9wICAgICBlc2kNCiAgICBwb3AgICAgIGVkaQ0KICAgIHBvcCAgICAgZWJwDQogICAgcmV0DQpJbmZvQXV0aG9yOg0KOyBwbGVhc2UgZG9uJ3QgcmVtb3ZlIHRoaXMgc3RyaW5nICENCjsgWW91ciBhcmUgZnJlZSB1c2UgZ3ZtYXQzMiBpbiBhbnkgZnJlIG9yIGNvbW1lcmNpYWwgYXBwcyBpZiB5b3UgZG9uJ3QgcmVtb3ZlIHRoZSBzdHJpbmcgaW4gdGhlIGJpbmFyeSENCiAgICBkYiAgICAgMGRoLDBhaCwiR1ZNYXQzMiBvcHRpbWlzZWQgYXNzZW1ibHkgY29kZSB3cml0dGVuIDE5OTYtOTggYnkgR2lsbGVzIFZvbGxhbnQiLDBkaCwwYWgNCg0KDQoNCklGREVGIE5PVU5ERVJMSU5FDQpsb25nZXN0X21hdGNoXzdmZmYgICBlbmRwDQpFTFNFDQpfbG9uZ2VzdF9tYXRjaF83ZmZmICBlbmRwDQpFTkRJRg0KDQoNCklGREVGIE5PVU5ERVJMSU5FDQpjcHVkZXRlY3QzMiAgICAgcHJvYyBuZWFyDQpFTFNFDQpfY3B1ZGV0ZWN0MzIgICAgcHJvYyBuZWFyDQpFTkRJRg0KDQogICAgcHVzaCAgICBlYngNCg0KICAgIHB1c2hmZCAgICAgICAgICAgICAgICAgIDsgcHVzaCBvcmlnaW5hbCBFRkxBR1MNCiAgICBwb3AgICAgIGVheCAgICAgICAgICAgICA7IGdldCBvcmlnaW5hbCBFRkxBR1MNCiAgICBtb3YgICAgIGVjeCwgZWF4ICAgICAgICA7IHNhdmUgb3JpZ2luYWwgRUZMQUdTDQogICAgeG9yICAgICBlYXgsIDQwMDAwaCAgICAgOyBmbGlwIEFDIGJpdCBpbiBFRkxBR1MNCiAgICBwdXNoICAgIGVheCAgICAgICAgICAgICA7IHNhdmUgbmV3IEVGTEFHUyB2YWx1ZSBvbiBzdGFjaw0KICAgIHBvcGZkICAgICAgICAgICAgICAgICAgIDsgcmVwbGFjZSBjdXJyZW50IEVGTEFHUyB2YWx1ZQ0KICAgIHB1c2hmZCAgICAgICAgICAgICAgICAgIDsgZ2V0IG5ldyBFRkxBR1MNCiAgICBwb3AgICAgIGVheCAgICAgICAgICAgICA7IHN0b3JlIG5ldyBFRkxBR1MgaW4gRUFYDQogICAgeG9yICAgICBlYXgsIGVjeCAgICAgICAgOyBjYW6SdCB0b2dnbGUgQUMgYml0LCBwcm9jZXNzb3I9ODAzODYNCiAgICBqeiAgICAgIGVuZF9jcHVfaXNfMzg2ICA7IGp1bXAgaWYgODAzODYgcHJvY2Vzc29yDQogICAgcHVzaCAgICBlY3gNCiAgICBwb3BmZCAgICAgICAgICAgICAgICAgICA7IHJlc3RvcmUgQUMgYml0IGluIEVGTEFHUyBmaXJzdA0KDQogICAgcHVzaGZkDQogICAgcHVzaGZkDQogICAgcG9wICAgICBlY3gNCg0KICAgIG1vdiAgICAgZWF4LCBlY3ggICAgICAgIDsgZ2V0IG9yaWdpbmFsIEVGTEFHUw0KICAgIHhvciAgICAgZWF4LCAyMDAwMDBoICAgIDsgZmxpcCBJRCBiaXQgaW4gRUZMQUdTDQogICAgcHVzaCAgICBlYXggICAgICAgICAgICAgOyBzYXZlIG5ldyBFRkxBR1MgdmFsdWUgb24gc3RhY2sNCiAgICBwb3BmZCAgICAgICAgICAgICAgICAgICA7IHJlcGxhY2UgY3VycmVudCBFRkxBR1MgdmFsdWUNCiAgICBwdXNoZmQgICAgICAgICAgICAgICAgICA7IGdldCBuZXcgRUZMQUdTDQogICAgcG9wICAgICBlYXggICAgICAgICAgICAgOyBzdG9yZSBuZXcgRUZMQUdTIGluIEVBWA0KICAgIHBvcGZkICAgICAgICAgICAgICAgICAgIDsgcmVzdG9yZSBvcmlnaW5hbCBFRkxBR1MNCiAgICB4b3IgICAgIGVheCwgZWN4ICAgICAgICA7IGNhbpJ0IHRvZ2dsZSBJRCBiaXQsDQogICAgamUgICAgICBpc19vbGRfNDg2ICAgICAgOyBwcm9jZXNzb3I9b2xkDQoNCiAgICBtb3YgICAgIGVheCwxDQogICAgZGIgICAgICAwZmgsMGEyaCAgICAgICAgO0NQVUlEDQoNCmV4aXRjcHVkZXRlY3Q6DQogICAgcG9wIGVieA0KICAgIHJldA0KDQplbmRfY3B1X2lzXzM4NjoNCiAgICBtb3YgICAgIGVheCwwMzAwaA0KICAgIGptcCAgICAgZXhpdGNwdWRldGVjdA0KDQppc19vbGRfNDg2Og0KICAgIG1vdiAgICAgZWF4LDA0MDBoDQogICAgam1wICAgICBleGl0Y3B1ZGV0ZWN0DQoNCklGREVGIE5PVU5ERVJMSU5FDQpjcHVkZXRlY3QzMiAgICAgZW5kcA0KRUxTRQ0KX2NwdWRldGVjdDMyICAgIGVuZHANCkVORElGDQpFTkRJRg0KDQpNQVhfTUFUQ0ggICAgICAgZXF1ICAgICAyNTgNCk1JTl9NQVRDSCAgICAgICBlcXUgICAgIDMNCk1JTl9MT09LQUhFQUQgICBlcXUgICAgIChNQVhfTUFUQ0ggKyBNSU5fTUFUQ0ggKyAxKQ0KTUFYX01BVENIXzhfICAgICBlcXUgICAgICgoTUFYX01BVENIICsgNykgQU5EIDBGRkYwaCkNCg0KDQo7Ozsgc3RhY2sgZnJhbWUgb2Zmc2V0cw0KDQpjaGFpbmxlbndtYXNrICAgZXF1ICBlc3AgKyAwICAgIDsgaGlnaCB3b3JkOiBjdXJyZW50IGNoYWluIGxlbg0KICAgICAgICAgICAgICAgICAgICA7IGxvdyB3b3JkOiBzLT53bWFzaw0Kd2luZG93ICAgICAgZXF1ICBlc3AgKyA0ICAgIDsgbG9jYWwgY29weSBvZiBzLT53aW5kb3cNCndpbmRvd2Jlc3RsZW4gICBlcXUgIGVzcCArIDggICAgOyBzLT53aW5kb3cgKyBiZXN0bGVuDQpzY2Fuc3RhcnQgICBlcXUgIGVzcCArIDE2ICAgOyBmaXJzdCB0d28gYnl0ZXMgb2Ygc3RyaW5nDQpzY2FuZW5kICAgICBlcXUgIGVzcCArIDEyICAgOyBsYXN0IHR3byBieXRlcyBvZiBzdHJpbmcNCnNjYW5hbGlnbiAgIGVxdSAgZXNwICsgMjAgICA7IGR3b3JkLW1pc2FsaWdubWVudCBvZiBzdHJpbmcNCm5pY2VtYXRjaCAgIGVxdSAgZXNwICsgMjQgICA7IGEgZ29vZCBlbm91Z2ggbWF0Y2ggc2l6ZQ0KYmVzdGxlbiAgICAgZXF1ICBlc3AgKyAyOCAgIDsgc2l6ZSBvZiBiZXN0IG1hdGNoIHNvIGZhcg0Kc2NhbiAgICAgICAgZXF1ICBlc3AgKyAzMiAgIDsgcHRyIHRvIHN0cmluZyB3YW50aW5nIG1hdGNoDQoNCkxvY2FsVmFyc1NpemUgICBlcXUgMzYNCjsgICBzYXZlZCBlYnggICBieXRlIGVzcCArIDM2DQo7ICAgc2F2ZWQgZWRpICAgYnl0ZSBlc3AgKyA0MA0KOyAgIHNhdmVkIGVzaSAgIGJ5dGUgZXNwICsgNDQNCjsgICBzYXZlZCBlYnAgICBieXRlIGVzcCArIDQ4DQo7ICAgcmV0dXJuIGFkZHJlc3MgIGJ5dGUgZXNwICsgNTINCmRlZmxhdGVzdGF0ZSAgICBlcXUgIGVzcCArIDU2ICAgOyB0aGUgZnVuY3Rpb24gYXJndW1lbnRzDQpjdXJtYXRjaCAgICBlcXUgIGVzcCArIDYwDQoNCjs7OyBPZmZzZXRzIGZvciBmaWVsZHMgaW4gdGhlIGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlLiBUaGVzZSBudW1iZXJzDQo7OzsgYXJlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgZGVmaW5pdGlvbiBvZiBkZWZsYXRlX3N0YXRlLCB3aXRoIHRoZQ0KOzs7IGFzc3VtcHRpb24gdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBkd29yZC1hbGlnbiB0aGUgZmllbGRzLiAoVGh1cywNCjs7OyBjaGFuZ2luZyB0aGUgZGVmaW5pdGlvbiBvZiBkZWZsYXRlX3N0YXRlIGNvdWxkIGVhc2lseSBjYXVzZSB0aGlzDQo7OzsgcHJvZ3JhbSB0byBjcmFzaCBob3JyaWJseSwgd2l0aG91dCBzbyBtdWNoIGFzIGEgd2FybmluZyBhdA0KOzs7IGNvbXBpbGUgdGltZS4gU2lnaC4pDQoNCmRzV1NpemUgICAgIGVxdSAzNit6bGliMTIyMmFkZA0KZHNXTWFzayAgICAgZXF1IDQ0K3psaWIxMjIyYWRkDQpkc1dpbmRvdyAgICBlcXUgNDgremxpYjEyMjJhZGQNCmRzUHJldiAgICAgIGVxdSA1Nit6bGliMTIyMmFkZA0KZHNNYXRjaExlbiAgZXF1IDg4K3psaWIxMjIyYWRkDQpkc1ByZXZNYXRjaCBlcXUgOTIremxpYjEyMjJhZGQNCmRzU3RyU3RhcnQgIGVxdSAxMDAremxpYjEyMjJhZGQNCmRzTWF0Y2hTdGFydCAgICBlcXUgMTA0K3psaWIxMjIyYWRkDQpkc0xvb2thaGVhZCBlcXUgMTA4K3psaWIxMjIyYWRkDQpkc1ByZXZMZW4gICBlcXUgMTEyK3psaWIxMjIyYWRkDQpkc01heENoYWluTGVuICAgZXF1IDExNit6bGliMTIyMmFkZA0KZHNHb29kTWF0Y2ggZXF1IDEzMit6bGliMTIyMmFkZA0KZHNOaWNlTWF0Y2ggZXF1IDEzNit6bGliMTIyMmFkZA0KDQoNCjs7OyBtYXRjaC5hc20gLS0gUGVudGl1bS1Qcm8tb3B0aW1pemVkIHZlcnNpb24gb2YgbG9uZ2VzdF9tYXRjaCgpDQo7OzsgV3JpdHRlbiBmb3IgemxpYiAxLjEuMg0KOzs7IENvcHlyaWdodCAoQykgMTk5OCBCcmlhbiBSYWl0ZXIgPGJyZWFkYm94QG11cHBldGxhYnMuY29tPg0KOzs7IFlvdSBjYW4gbG9vayBhdCBodHRwOi8vd3d3Lm11cHBldGxhYnMuY29tL35icmVhZGJveC9zb2Z0d2FyZS9hc3NlbWJseS5odG1sDQo7OzsNCjs7OyBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQNCjs7OyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLg0KDQo7R0xPQkFMIF9sb25nZXN0X21hdGNoLCBfbWF0Y2hfaW5pdA0KDQoNCjtTRUNUSU9OICAgIC50ZXh0DQoNCjs7OyB1SW50IGxvbmdlc3RfbWF0Y2goZGVmbGF0ZV9zdGF0ZSAqZGVmbGF0ZXN0YXRlLCBJUG9zIGN1cm1hdGNoKQ0KDQo7X2xvbmdlc3RfbWF0Y2g6DQpJRkRFRiBOT09MRFBFTlRJVU1DT0RFDQogICAgSUZERUYgTk9VTkRFUkxJTkUNCiAgICBsb25nZXN0X21hdGNoICAgICAgIHByb2MgbmVhcg0KICAgIEVMU0UNCiAgICBfbG9uZ2VzdF9tYXRjaCAgICAgIHByb2MgbmVhcg0KICAgIEVORElGDQpFTFNFDQogICAgSUZERUYgTk9VTkRFUkxJTkUNCiAgICBsb25nZXN0X21hdGNoXzY4NiAgIHByb2MgbmVhcg0KICAgIEVMU0UNCiAgICBfbG9uZ2VzdF9tYXRjaF82ODYgIHByb2MgbmVhcg0KICAgIEVORElGDQpFTkRJRg0KDQo7OzsgU2F2ZSByZWdpc3RlcnMgdGhhdCB0aGUgY29tcGlsZXIgbWF5IGJlIHVzaW5nLCBhbmQgYWRqdXN0IGVzcCB0bw0KOzs7IG1ha2Ugcm9vbSBmb3Igb3VyIHN0YWNrIGZyYW1lLg0KDQogICAgICAgIHB1c2ggICAgZWJwDQogICAgICAgIHB1c2ggICAgZWRpDQogICAgICAgIHB1c2ggICAgZXNpDQogICAgICAgIHB1c2ggICAgZWJ4DQogICAgICAgIHN1YiBlc3AsIExvY2FsVmFyc1NpemUNCg0KOzs7IFJldHJpZXZlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMuIGVjeCB3aWxsIGhvbGQgY3VyX21hdGNoDQo7OzsgdGhyb3VnaG91dCB0aGUgZW50aXJlIGZ1bmN0aW9uLiBlZHggd2lsbCBob2xkIHRoZSBwb2ludGVyIHRvIHRoZQ0KOzs7IGRlZmxhdGVfc3RhdGUgc3RydWN0dXJlIGR1cmluZyB0aGUgZnVuY3Rpb24ncyBzZXR1cCAoYmVmb3JlDQo7OzsgZW50ZXJpbmcgdGhlIG1haW4gbG9vcC4NCg0KICAgICAgICBtb3YgZWR4LCBbZGVmbGF0ZXN0YXRlXQ0KICAgICAgICBtb3YgZWN4LCBbY3VybWF0Y2hdDQoNCjs7OyB1SW50IHdtYXNrID0gcy0+d19tYXNrOw0KOzs7IHVuc2lnbmVkIGNoYWluX2xlbmd0aCA9IHMtPm1heF9jaGFpbl9sZW5ndGg7DQo7OzsgaWYgKHMtPnByZXZfbGVuZ3RoID49IHMtPmdvb2RfbWF0Y2gpIHsNCjs7OyAgICAgY2hhaW5fbGVuZ3RoID4+PSAyOw0KOzs7IH0NCg0KICAgICAgICBtb3YgZWF4LCBbZWR4ICsgZHNQcmV2TGVuXQ0KICAgICAgICBtb3YgZWJ4LCBbZWR4ICsgZHNHb29kTWF0Y2hdDQogICAgICAgIGNtcCBlYXgsIGVieA0KICAgICAgICBtb3YgZWF4LCBbZWR4ICsgZHNXTWFza10NCiAgICAgICAgbW92IGVieCwgW2VkeCArIGRzTWF4Q2hhaW5MZW5dDQogICAgICAgIGpsICBMYXN0TWF0Y2hHb29kDQogICAgICAgIHNociBlYngsIDINCkxhc3RNYXRjaEdvb2Q6DQoNCjs7OyBjaGFpbmxlbiBpcyBkZWNyZW1lbnRlZCBvbmNlIGJlZm9yZWhhbmQgc28gdGhhdCB0aGUgZnVuY3Rpb24gY2FuDQo7OzsgdXNlIHRoZSBzaWduIGZsYWcgaW5zdGVhZCBvZiB0aGUgemVybyBmbGFnIGZvciB0aGUgZXhpdCB0ZXN0Lg0KOzs7IEl0IGlzIHRoZW4gc2hpZnRlZCBpbnRvIHRoZSBoaWdoIHdvcmQsIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHdtYXNrDQo7OzsgdmFsdWUsIHdoaWNoIGl0IHdpbGwgYWx3YXlzIGFjY29tcGFueS4NCg0KICAgICAgICBkZWMgZWJ4DQogICAgICAgIHNobCBlYngsIDE2DQogICAgICAgIG9yICBlYngsIGVheA0KICAgICAgICBtb3YgW2NoYWlubGVud21hc2tdLCBlYngNCg0KOzs7IGlmICgodUludCluaWNlX21hdGNoID4gcy0+bG9va2FoZWFkKSBuaWNlX21hdGNoID0gcy0+bG9va2FoZWFkOw0KDQogICAgICAgIG1vdiBlYXgsIFtlZHggKyBkc05pY2VNYXRjaF0NCiAgICAgICAgbW92IGVieCwgW2VkeCArIGRzTG9va2FoZWFkXQ0KICAgICAgICBjbXAgZWJ4LCBlYXgNCiAgICAgICAgamwgIExvb2thaGVhZExlc3MNCiAgICAgICAgbW92IGVieCwgZWF4DQpMb29rYWhlYWRMZXNzOiAgbW92IFtuaWNlbWF0Y2hdLCBlYngNCg0KOzs7IHJlZ2lzdGVyIEJ5dGVmICpzY2FuID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQ7DQoNCiAgICAgICAgbW92IGVzaSwgW2VkeCArIGRzV2luZG93XQ0KICAgICAgICBtb3YgW3dpbmRvd10sIGVzaQ0KICAgICAgICBtb3YgZWJwLCBbZWR4ICsgZHNTdHJTdGFydF0NCiAgICAgICAgbGVhIGVkaSwgW2VzaSArIGVicF0NCiAgICAgICAgbW92IFtzY2FuXSwgZWRpDQoNCjs7OyBEZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgdGhlIHNjYW4gcHRyIGlzIG9mZiBmcm9tIGJlaW5nDQo7OzsgZHdvcmQtYWxpZ25lZC4NCg0KICAgICAgICBtb3YgZWF4LCBlZGkNCiAgICAgICAgbmVnIGVheA0KICAgICAgICBhbmQgZWF4LCAzDQogICAgICAgIG1vdiBbc2NhbmFsaWduXSwgZWF4DQoNCjs7OyBJUG9zIGxpbWl0ID0gcy0+c3Ryc3RhcnQgPiAoSVBvcylNQVhfRElTVChzKSA/DQo7OzsgICAgIHMtPnN0cnN0YXJ0IC0gKElQb3MpTUFYX0RJU1QocykgOiBOSUw7DQoNCiAgICAgICAgbW92IGVheCwgW2VkeCArIGRzV1NpemVdDQogICAgICAgIHN1YiBlYXgsIE1JTl9MT09LQUhFQUQNCiAgICAgICAgc3ViIGVicCwgZWF4DQogICAgICAgIGpnICBMaW1pdFBvc2l0aXZlDQogICAgICAgIHhvciBlYnAsIGVicA0KTGltaXRQb3NpdGl2ZToNCg0KOzs7IGludCBiZXN0X2xlbiA9IHMtPnByZXZfbGVuZ3RoOw0KDQogICAgICAgIG1vdiBlYXgsIFtlZHggKyBkc1ByZXZMZW5dDQogICAgICAgIG1vdiBbYmVzdGxlbl0sIGVheA0KDQo7OzsgU3RvcmUgdGhlIHN1bSBvZiBzLT53aW5kb3cgKyBiZXN0X2xlbiBpbiBlc2kgbG9jYWxseSwgYW5kIGluIGVzaS4NCg0KICAgICAgICBhZGQgZXNpLCBlYXgNCiAgICAgICAgbW92IFt3aW5kb3diZXN0bGVuXSwgZXNpDQoNCjs7OyByZWdpc3RlciB1c2ggc2Nhbl9zdGFydCA9ICoodXNoZiopc2NhbjsNCjs7OyByZWdpc3RlciB1c2ggc2Nhbl9lbmQgICA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7DQo7OzsgUG9zZiAqcHJldiA9IHMtPnByZXY7DQoNCiAgICAgICAgbW92enggICBlYngsIHdvcmQgcHRyIFtlZGldDQogICAgICAgIG1vdiBbc2NhbnN0YXJ0XSwgZWJ4DQogICAgICAgIG1vdnp4ICAgZWJ4LCB3b3JkIHB0ciBbZWRpICsgZWF4IC0gMV0NCiAgICAgICAgbW92IFtzY2FuZW5kXSwgZWJ4DQogICAgICAgIG1vdiBlZGksIFtlZHggKyBkc1ByZXZdDQoNCjs7OyBKdW1wIGludG8gdGhlIG1haW4gbG9vcC4NCg0KICAgICAgICBtb3YgZWR4LCBbY2hhaW5sZW53bWFza10NCiAgICAgICAgam1wIHNob3J0IExvb3BFbnRyeQ0KDQphbGlnbiA0DQoNCjs7OyBkbyB7DQo7OzsgICAgIG1hdGNoID0gcy0+d2luZG93ICsgY3VyX21hdGNoOw0KOzs7ICAgICBpZiAoKih1c2hmKikobWF0Y2grYmVzdF9sZW4tMSkgIT0gc2Nhbl9lbmQgfHwNCjs7OyAgICAgICAgICoodXNoZiopbWF0Y2ggIT0gc2Nhbl9zdGFydCkgY29udGludWU7DQo7OzsgICAgIFsuLi5dDQo7OzsgfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdKSA+IGxpbWl0DQo7OzsgICAgICAgICAgJiYgLS1jaGFpbl9sZW5ndGggIT0gMCk7DQo7OzsNCjs7OyBIZXJlIGlzIHRoZSBpbm5lciBsb29wIG9mIHRoZSBmdW5jdGlvbi4gVGhlIGZ1bmN0aW9uIHdpbGwgc3BlbmQgdGhlDQo7OzsgbWFqb3JpdHkgb2YgaXRzIHRpbWUgaW4gdGhpcyBsb29wLCBhbmQgbWFqb3JpdHkgb2YgdGhhdCB0aW1lIHdpbGwNCjs7OyBiZSBzcGVudCBpbiB0aGUgZmlyc3QgdGVuIGluc3RydWN0aW9ucy4NCjs7Ow0KOzs7IFdpdGhpbiB0aGlzIGxvb3A6DQo7OzsgZWJ4ID0gc2NhbmVuZA0KOzs7IGVjeCA9IGN1cm1hdGNoDQo7OzsgZWR4ID0gY2hhaW5sZW53bWFzayAtIGkuZS4sICgoY2hhaW5sZW4gPDwgMTYpIHwgd21hc2spDQo7OzsgZXNpID0gd2luZG93YmVzdGxlbiAtIGkuZS4sICh3aW5kb3cgKyBiZXN0bGVuKQ0KOzs7IGVkaSA9IHByZXYNCjs7OyBlYnAgPSBsaW1pdA0KDQpMb29rdXBMb29wOg0KICAgICAgICBhbmQgZWN4LCBlZHgNCiAgICAgICAgbW92enggICBlY3gsIHdvcmQgcHRyIFtlZGkgKyBlY3gqMl0NCiAgICAgICAgY21wIGVjeCwgZWJwDQogICAgICAgIGpiZSBMZWF2ZU5vdw0KICAgICAgICBzdWIgZWR4LCAwMDAxMDAwMGgNCiAgICAgICAganMgIExlYXZlTm93DQpMb29wRW50cnk6ICBtb3Z6eCAgIGVheCwgd29yZCBwdHIgW2VzaSArIGVjeCAtIDFdDQogICAgICAgIGNtcCBlYXgsIGVieA0KICAgICAgICBqbnogTG9va3VwTG9vcA0KICAgICAgICBtb3YgZWF4LCBbd2luZG93XQ0KICAgICAgICBtb3Z6eCAgIGVheCwgd29yZCBwdHIgW2VheCArIGVjeF0NCiAgICAgICAgY21wIGVheCwgW3NjYW5zdGFydF0NCiAgICAgICAgam56IExvb2t1cExvb3ANCg0KOzs7IFN0b3JlIHRoZSBjdXJyZW50IHZhbHVlIG9mIGNoYWlubGVuLg0KDQogICAgICAgIG1vdiBbY2hhaW5sZW53bWFza10sIGVkeA0KDQo7OzsgUG9pbnQgZWRpIHRvIHRoZSBzdHJpbmcgdW5kZXIgc2NydXRpbnksIGFuZCBlc2kgdG8gdGhlIHN0cmluZyB3ZQ0KOzs7IGFyZSBob3BpbmcgdG8gbWF0Y2ggaXQgdXAgd2l0aC4gSW4gYWN0dWFsaXR5LCBlc2kgYW5kIGVkaSBhcmUNCjs7OyBib3RoIHBvaW50ZWQgKE1BWF9NQVRDSF84IC0gc2NhbmFsaWduKSBieXRlcyBhaGVhZCwgYW5kIGVkeCBpcw0KOzs7IGluaXRpYWxpemVkIHRvIC0oTUFYX01BVENIXzggLSBzY2FuYWxpZ24pLg0KDQogICAgICAgIG1vdiBlc2ksIFt3aW5kb3ddDQogICAgICAgIG1vdiBlZGksIFtzY2FuXQ0KICAgICAgICBhZGQgZXNpLCBlY3gNCiAgICAgICAgbW92IGVheCwgW3NjYW5hbGlnbl0NCiAgICAgICAgbW92IGVkeCwgMGZmZmZmZWY4aDsgLShNQVhfTUFUQ0hfOCkNCiAgICAgICAgbGVhIGVkaSwgW2VkaSArIGVheCArIDAxMDhoXSA7TUFYX01BVENIXzhdDQogICAgICAgIGxlYSBlc2ksIFtlc2kgKyBlYXggKyAwMTA4aF0gO01BWF9NQVRDSF84XQ0KDQo7OzsgVGVzdCB0aGUgc3RyaW5ncyBmb3IgZXF1YWxpdHksIDggYnl0ZXMgYXQgYSB0aW1lLiBBdCB0aGUgZW5kLA0KOzs7IGFkanVzdCBlZHggc28gdGhhdCBpdCBpcyBvZmZzZXQgdG8gdGhlIGV4YWN0IGJ5dGUgdGhhdCBtaXNtYXRjaGVkLg0KOzs7DQo7OzsgV2UgYWxyZWFkeSBrbm93IGF0IHRoaXMgcG9pbnQgdGhhdCB0aGUgZmlyc3QgdGhyZWUgYnl0ZXMgb2YgdGhlDQo7Ozsgc3RyaW5ncyBtYXRjaCBlYWNoIG90aGVyLCBhbmQgdGhleSBjYW4gYmUgc2FmZWx5IHBhc3NlZCBvdmVyIGJlZm9yZQ0KOzs7IHN0YXJ0aW5nIHRoZSBjb21wYXJlIGxvb3AuIFNvIHdoYXQgdGhpcyBjb2RlIGRvZXMgaXMgc2tpcCBvdmVyIDAtMw0KOzs7IGJ5dGVzLCBhcyBtdWNoIGFzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBkd29yZC1hbGlnbiB0aGUgZWRpDQo7OzsgcG9pbnRlci4gKGVzaSB3aWxsIHN0aWxsIGJlIG1pc2FsaWduZWQgdGhyZWUgdGltZXMgb3V0IG9mIGZvdXIuKQ0KOzs7DQo7OzsgSXQgc2hvdWxkIGJlIGNvbmZlc3NlZCB0aGF0IHRoaXMgbG9vcCB1c3VhbGx5IGRvZXMgbm90IHJlcHJlc2VudA0KOzs7IG11Y2ggb2YgdGhlIHRvdGFsIHJ1bm5pbmcgdGltZS4gUmVwbGFjaW5nIGl0IHdpdGggYSBtb3JlDQo7Ozsgc3RyYWlnaHRmb3J3YXJkICJyZXAgY21wc2IiIHdvdWxkIG5vdCBkcmFzdGljYWxseSBkZWdyYWRlDQo7OzsgcGVyZm9ybWFuY2UuDQoNCkxvb3BDbXBzOg0KICAgICAgICBtb3YgZWF4LCBbZXNpICsgZWR4XQ0KICAgICAgICB4b3IgZWF4LCBbZWRpICsgZWR4XQ0KICAgICAgICBqbnogTGVhdmVMb29wQ21wcw0KICAgICAgICBtb3YgZWF4LCBbZXNpICsgZWR4ICsgNF0NCiAgICAgICAgeG9yIGVheCwgW2VkaSArIGVkeCArIDRdDQogICAgICAgIGpueiBMZWF2ZUxvb3BDbXBzNA0KICAgICAgICBhZGQgZWR4LCA4DQogICAgICAgIGpueiBMb29wQ21wcw0KICAgICAgICBqbXAgc2hvcnQgTGVuTWF4aW11bQ0KTGVhdmVMb29wQ21wczQ6IGFkZCBlZHgsIDQNCkxlYXZlTG9vcENtcHM6ICB0ZXN0ICAgIGVheCwgMDAwMEZGRkZoDQogICAgICAgIGpueiBMZW5Mb3dlcg0KICAgICAgICBhZGQgZWR4LCAgMg0KICAgICAgICBzaHIgZWF4LCAxNg0KTGVuTG93ZXI6ICAgc3ViIGFsLCAxDQogICAgICAgIGFkYyBlZHgsIDANCg0KOzs7IENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaC4gSWYgaXQgaXMgbG9uZ2VyIHRoYW4gTUFYX01BVENILA0KOzs7IHRoZW4gYXV0b21hdGljYWxseSBhY2NlcHQgaXQgYXMgdGhlIGJlc3QgcG9zc2libGUgbWF0Y2ggYW5kIGxlYXZlLg0KDQogICAgICAgIGxlYSBlYXgsIFtlZGkgKyBlZHhdDQogICAgICAgIG1vdiBlZGksIFtzY2FuXQ0KICAgICAgICBzdWIgZWF4LCBlZGkNCiAgICAgICAgY21wIGVheCwgTUFYX01BVENIDQogICAgICAgIGpnZSBMZW5NYXhpbXVtDQoNCjs7OyBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaCBpcyBub3QgbG9uZ2VyIHRoYW4gdGhlIGJlc3QgbWF0Y2ggd2UNCjs7OyBoYXZlIHNvIGZhciwgdGhlbiBmb3JnZXQgaXQgYW5kIHJldHVybiB0byB0aGUgbG9va3VwIGxvb3AuDQoNCiAgICAgICAgbW92IGVkeCwgW2RlZmxhdGVzdGF0ZV0NCiAgICAgICAgbW92IGVieCwgW2Jlc3RsZW5dDQogICAgICAgIGNtcCBlYXgsIGVieA0KICAgICAgICBqZyAgTG9uZ2VyTWF0Y2gNCiAgICAgICAgbW92IGVzaSwgW3dpbmRvd2Jlc3RsZW5dDQogICAgICAgIG1vdiBlZGksIFtlZHggKyBkc1ByZXZdDQogICAgICAgIG1vdiBlYngsIFtzY2FuZW5kXQ0KICAgICAgICBtb3YgZWR4LCBbY2hhaW5sZW53bWFza10NCiAgICAgICAgam1wIExvb2t1cExvb3ANCg0KOzs7ICAgICAgICAgcy0+bWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7DQo7OzsgICAgICAgICBiZXN0X2xlbiA9IGxlbjsNCjs7OyAgICAgICAgIGlmIChsZW4gPj0gbmljZV9tYXRjaCkgYnJlYWs7DQo7OzsgICAgICAgICBzY2FuX2VuZCA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7DQoNCkxvbmdlck1hdGNoOiAgICBtb3YgZWJ4LCBbbmljZW1hdGNoXQ0KICAgICAgICBtb3YgW2Jlc3RsZW5dLCBlYXgNCiAgICAgICAgbW92IFtlZHggKyBkc01hdGNoU3RhcnRdLCBlY3gNCiAgICAgICAgY21wIGVheCwgZWJ4DQogICAgICAgIGpnZSBMZWF2ZU5vdw0KICAgICAgICBtb3YgZXNpLCBbd2luZG93XQ0KICAgICAgICBhZGQgZXNpLCBlYXgNCiAgICAgICAgbW92IFt3aW5kb3diZXN0bGVuXSwgZXNpDQogICAgICAgIG1vdnp4ICAgZWJ4LCB3b3JkIHB0ciBbZWRpICsgZWF4IC0gMV0NCiAgICAgICAgbW92IGVkaSwgW2VkeCArIGRzUHJldl0NCiAgICAgICAgbW92IFtzY2FuZW5kXSwgZWJ4DQogICAgICAgIG1vdiBlZHgsIFtjaGFpbmxlbndtYXNrXQ0KICAgICAgICBqbXAgTG9va3VwTG9vcA0KDQo7OzsgQWNjZXB0IHRoZSBjdXJyZW50IHN0cmluZywgd2l0aCB0aGUgbWF4aW11bSBwb3NzaWJsZSBsZW5ndGguDQoNCkxlbk1heGltdW06IG1vdiBlZHgsIFtkZWZsYXRlc3RhdGVdDQogICAgICAgIG1vdiBkd29yZCBwdHIgW2Jlc3RsZW5dLCBNQVhfTUFUQ0gNCiAgICAgICAgbW92IFtlZHggKyBkc01hdGNoU3RhcnRdLCBlY3gNCg0KOzs7IGlmICgodUludCliZXN0X2xlbiA8PSBzLT5sb29rYWhlYWQpIHJldHVybiAodUludCliZXN0X2xlbjsNCjs7OyByZXR1cm4gcy0+bG9va2FoZWFkOw0KDQpMZWF2ZU5vdzoNCiAgICAgICAgbW92IGVkeCwgW2RlZmxhdGVzdGF0ZV0NCiAgICAgICAgbW92IGVieCwgW2Jlc3RsZW5dDQogICAgICAgIG1vdiBlYXgsIFtlZHggKyBkc0xvb2thaGVhZF0NCiAgICAgICAgY21wIGVieCwgZWF4DQogICAgICAgIGpnICBMb29rYWhlYWRSZXQNCiAgICAgICAgbW92IGVheCwgZWJ4DQpMb29rYWhlYWRSZXQ6DQoNCjs7OyBSZXN0b3JlIHRoZSBzdGFjayBhbmQgcmV0dXJuIGZyb20gd2hlbmNlIHdlIGNhbWUuDQoNCiAgICAgICAgYWRkIGVzcCwgTG9jYWxWYXJzU2l6ZQ0KICAgICAgICBwb3AgZWJ4DQogICAgICAgIHBvcCBlc2kNCiAgICAgICAgcG9wIGVkaQ0KICAgICAgICBwb3AgZWJwDQoNCiAgICAgICAgcmV0DQo7IHBsZWFzZSBkb24ndCByZW1vdmUgdGhpcyBzdHJpbmcgIQ0KOyBZb3VyIGNhbiBmcmVlbHkgdXNlIGd2bWF0MzIgaW4gYW55IGZyZWUgb3IgY29tbWVyY2lhbCBhcHAgaWYgeW91IGRvbid0IHJlbW92ZSB0aGUgc3RyaW5nIGluIHRoZSBiaW5hcnkhDQogICAgZGIgICAgIDBkaCwwYWgsImFzbTY4NiB3aXRoIG1hc20sIG9wdGltaXNlZCBhc3NlbWJseSBjb2RlIGZyb20gQnJpYW4gUmFpdGVyLCB3cml0dGVuIDE5OTgiLDBkaCwwYWgNCg0KDQpJRkRFRiBOT09MRFBFTlRJVU1DT0RFDQogICAgSUZERUYgTk9VTkRFUkxJTkUNCiAgICBsb25nZXN0X21hdGNoICAgICAgIGVuZHANCiAgICBFTFNFDQogICAgX2xvbmdlc3RfbWF0Y2ggICAgICBlbmRwDQogICAgRU5ESUYNCg0KICAgIElGREVGIE5PVU5ERVJMSU5FDQogICAgbWF0Y2hfaW5pdCAgICAgIHByb2MgbmVhcg0KICAgICAgICAgICAgICAgICAgICByZXQNCiAgICBtYXRjaF9pbml0ICAgICAgZW5kcA0KICAgIEVMU0UNCiAgICBfbWF0Y2hfaW5pdCAgICAgcHJvYyBuZWFyDQogICAgICAgICAgICAgICAgICAgIHJldA0KICAgIF9tYXRjaF9pbml0ICAgICBlbmRwDQogICAgRU5ESUYNCkVMU0UNCiAgICBJRkRFRiBOT1VOREVSTElORQ0KICAgIGxvbmdlc3RfbWF0Y2hfNjg2ICAgZW5kcA0KICAgIEVMU0UNCiAgICBfbG9uZ2VzdF9tYXRjaF82ODYgIGVuZHANCiAgICBFTkRJRg0KRU5ESUYNCg0KX1RFWFQgICBlbmRzDQplbmQNCg==