Event Details

This is a KIND 5391 event created on 2024-03-25 23:51:32 (5 months, 3 weeks ago). Debug this event chain.

{
  "id": "a491caa225e031e799afdab9bc14ab89237257ff344c401e40c70330af7bd4ba",
  "pubkey": "a029df4a2c4a042f4b23a0d6197fd9680805327e023eb1705c70d13db9821a3d",
  "created_at": 1711410692,
  "kind": "5391",
  "tags": [
    [
      "e",
      "67c2163ef886642d4e3a0c9d99c4b056a0176320a88b3a502595d1bf9f8b15dc",
      "wss://dashglow-test.nostr1.com",
      "root"
    ],
    [
      "m",
      "text/html"
    ],
    [
      "alt",
      "This is a binary chunk of a web-based video game. Play the full game at https://crashglow.com/game/nevent1qqsx0ssk8mugvepdfcaqe8vecjc9dgqhvvs23ze62qjet5dln793thqpremhxue69uhkgctndpnkcmmh946x2um59ehx7um5wgcjucm0d5q3vamnwvaz7tmjv4kxz7fwwpexjmtpdshxuet5qy28wumn8ghj7un9d3shjtnyv9kh2uewd9hszymhwden5te0wfjkcctev93xcefwdaexwqg5waehxw309aex2mrp0yhxummnw3ezumt9qyxhwumn8ghj7mn0wvhxcmmvqyt8wumn8ghj7un9d3shjtnwdaehgu3wvfskueqzyzsznh62939qgt6tywsdvxtlm95qspfj0cpravtst3cdz0desgdr6qcyqqqqqqgn47xm6"
    ],
    [
      "index",
      "2"
    ],
    [
      "x",
      "a33194f438851920cc43d59c61a386b79adcc5a55b0b64667386cd8f43baaab0"
    ]
  ],
  "content": "dmFyIGxpbmVUZXh0ID0gIiI7CgkJCXZhciB3aGl0ZXNwYWNlQ291bnQgPSAwOwoJCQl2YXIgaXNOZXdMaXN0SXRlbSA9IGZhbHNlOwoJCQl2YXIgZW5jb3VudGVyZWROb25XaGl0ZXNwYWNlID0gZmFsc2U7CgoJCQl3aGlsZSAoIXN0YXRlLkRvbmUoKSAmJiAhKHN0YXRlLkNoYXIoKSA9PT0gU3ltLkxpbmVicmVhaykpIHsKCQkJCS8vIGNvdW50IHdoaXRlc3BhY2UgdW50aWwgd2UgaGl0IHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIKCQkJCWlmICghZW5jb3VudGVyZWROb25XaGl0ZXNwYWNlKSB7CgkJCQkJaWYgKHN0YXRlLkNoYXIoKSA9PT0gIiAiIHx8IHN0YXRlLkNoYXIoKSA9PT0gIlx0IikgewoJCQkJCQl3aGl0ZXNwYWNlQ291bnQrKzsKCQkJCQl9CgkJCQkJZWxzZSB7CgkJCQkJCWVuY291bnRlcmVkTm9uV2hpdGVzcGFjZSA9IHRydWU7CgoJCQkJCQlpZiAoc3RhdGUuQ2hhcigpID09PSBTeW0uTGlzdCkgewoJCQkJCQkJaXNOZXdMaXN0SXRlbSA9IHRydWU7CgkJCQkJCQl3aGl0ZXNwYWNlQ291bnQgKz0gMjsgLy8gY291bnQgdGhlIGxpc3Qgc2VwZXJhdG9yIEFORCB0aGUgZm9sbG93aW5nIGV4dHJhIHNwYWNlCgkJCQkJCX0KCQkJCQl9CgkJCQl9CgoJCQkJLy8gYWRkIGNoYXJhY3RlcnMgb25lIGF0IGEgdGltZSwgdW5sZXNzIGl0J3MgYSBjb2RlIGJsb2NrCgkJCQkvLyBzaW5jZSBjb2RlIGJsb2NrcyBjYW4gY29udGFpbiBhZGRpdGlvbmFsIHNlcXVlbmNlcyBpbnNpZGUKCQkJCS8vIHRoZW0gdGhhdCB3aWxsIG1lc3MgdXAgb3VyIGxpc3QgaXRlbSBkZXRlY3Rpb24KCQkJCWlmIChzdGF0ZS5DaGFyKCkgPT09IFN5bS5Db2RlT3BlbikgewoJCQkJCWxpbmVUZXh0ICs9IHN0YXRlLkNvbnN1bWVCbG9jayhTeW0uQ29kZU9wZW4sIFN5bS5Db2RlQ2xvc2UsIHRydWUgLyppbmNsdWRlU3ltYm9scyovKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCWxpbmVUZXh0ICs9IHN0YXRlLkNoYXIoKTsKCQkJCQlzdGF0ZS5TdGVwKCk7CgkJCQl9CgkJCX0KCgkJCWlmIChzdGF0ZS5DaGFyKCkgPT09IFN5bS5MaW5lYnJlYWspIHsKCQkJCXN0YXRlLlN0ZXAoKTsKCQkJfQoKCQkJcmV0dXJuIHsgdGV4dDpsaW5lVGV4dCwgd2hpdGVzcGFjZTp3aGl0ZXNwYWNlQ291bnQsIGlzTmV3TGlzdEl0ZW06aXNOZXdMaXN0SXRlbSB9OwoJCX0KCgkJZnVuY3Rpb24gdHJpbUxlYWRpbmdXaGl0ZXNwYWNlKHRleHQsIHRyaW1MZW5ndGgpIHsKCQkJLy8gdGhlIHNwbGl0IGFuZCBqb2luIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGEgc2luZ2xlICJsaW5lIgoJCQkvLyBjYW4gY29udGFpbiBzZXF1ZW5jZXMgdGhhdCBtYXkgY29udGFpbiBuZXdsaW5lcyBvZiB0aGVpciBvd24KCQkJLy8gKHdlIHRyZWF0IHRoZW0gYWxsIGFzIG9uZSAibGluZSIgZm9yIHNlcXVlbmNlIHBhcnNpbmcgcHVycG9zZXMpCgkJCXZhciB0ZXh0U3BsaXQgPSB0ZXh0LnNwbGl0KFN5bS5saW5lYnJlYWspOwoJCQl0ZXh0U3BsaXQgPSB0ZXh0U3BsaXQubWFwKGZ1bmN0aW9uKGxpbmUpIHsgcmV0dXJuIGxpbmUuc2xpY2UodHJpbUxlbmd0aCkgfSk7CgkJCXJldHVybiB0ZXh0U3BsaXQuam9pbihTeW0ubGluZWJyZWFrKTsKCQl9CgoJCXdoaWxlICghc3RhdGUuRG9uZSgpKSB7CgkJCXZhciBsaW5lUmVzdWx0cyA9IHBhcnNlU2VxdWVuY2VJdGVtTGluZShzdGF0ZSk7CgoJCQlpZiAobGluZVJlc3VsdHMuaXNOZXdMaXN0SXRlbSkgewoJCQkJcmVxdWlyZWRMZWFkaW5nV2hpdGVzcGFjZSA9IGxpbmVSZXN1bHRzLndoaXRlc3BhY2U7CgkJCQljdXJJdGVtSW5kZXgrKzsKCQkJCWl0ZW1TdHJpbmdzW2N1ckl0ZW1JbmRleF0gPSAiIjsKCQkJfQoKCQkJLy8gdG8gYXZvaWQgZG91YmxlIGNvdW50aW5nIGNsb3NpbmcgbGluZXMgKGVtcHR5IG9uZXMgZW5kaW5nIGluIGEgY3VybHkgYnJhY2UpCgkJCS8vIHdlIG9ubHkgYWxsb3cgbGluZXMgdGhhdCBoYXZlIGF0IGxlYXN0IGFzIG11Y2ggd2hpdGVzcGFjZSBhcyB0aGUgc3RhcnQgb2YgdGhlIGxpc3QgaXRlbQoJCQkvLyBUT0RPIDogSSB0aGluayByaWdodCBub3cgdGhpcyBsZWFkcyB0byBhIGJ1ZyBpZiB0aGUgbGlzdCBpdGVtJ3MgaW5kZW50YXRpb24gaXMgbGVzcyB0aGFuCgkJCS8vIGl0cyBwYXJlbnQgY29kZSBibG9jay4uLiBob3BlZnVsbHkgdGhhdCB3b24ndCBiZSBhIGJpZyBkZWFsIGZvciBub3cKCQkJLy8gKE5PVEU6IEkgdGhpbmsgdGhlIGJ1ZyBjb3VsZCBiZSBmaXhlZCBieSBvbmx5IGFwcGx5aW5nIHRoaXMgdG8gdGhlIEZJTkFMIGxpbmUgb2YgYW4gaXRlbSwgYnV0CgkJCS8vIHRoYXQgd291bGQgcmVxdWlyZSBtb3JlIGNvbnNpZGVyYXRpb24gYW5kIHRlc3RpbmcpCgkJCWlmIChsaW5lUmVzdWx0cy53aGl0ZXNwYWNlID49IHJlcXVpcmVkTGVhZGluZ1doaXRlc3BhY2UpIHsKCQkJCXZhciB0cmltbWVkVGV4dCA9IHRyaW1MZWFkaW5nV2hpdGVzcGFjZShsaW5lUmVzdWx0cy50ZXh0LCByZXF1aXJlZExlYWRpbmdXaGl0ZXNwYWNlKTsKCQkJCWl0ZW1TdHJpbmdzW2N1ckl0ZW1JbmRleF0gKz0gdHJpbW1lZFRleHQgKyBTeW0uTGluZWJyZWFrOwoJCQl9CgkJfQoKCQkvLyBhIGJpdCBoYWNreTogY3V0IG9mZiB0aGUgdHJhaWxpbmcgbmV3bGluZXMgZnJvbSBhbGwgdGhlIGl0ZW1zCgkJaXRlbVN0cmluZ3MgPSBpdGVtU3RyaW5ncy5tYXAoZnVuY3Rpb24oaXRlbSkgeyByZXR1cm4gaXRlbS5zbGljZSgwLC0xKTsgfSk7CgoJCXZhciBvcHRpb25zID0gW107CgkJZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtU3RyaW5ncy5sZW5ndGg7IGkrKykgewoJCQl2YXIgc3RyID0gaXRlbVN0cmluZ3NbaV07CgkJCXZhciBkaWFsb2dCbG9ja1N0YXRlID0gbmV3IFBhcnNlclN0YXRlKG5ldyBEaWFsb2dCbG9ja05vZGUoZmFsc2UgLyogZG9JbmRlbnRGaXJzdExpbmUgKi8pLCBzdHIpOwoJCQlkaWFsb2dCbG9ja1N0YXRlID0gUGFyc2VEaWFsb2coZGlhbG9nQmxvY2tTdGF0ZSk7CgkJCXZhciBkaWFsb2dCbG9jayA9IGRpYWxvZ0Jsb2NrU3RhdGUucm9vdE5vZGU7CgkJCW9wdGlvbnMucHVzaChkaWFsb2dCbG9jayk7CgkJfQoKCQlpZiAoc2VxdWVuY2VUeXBlID09PSAic2VxdWVuY2UiKSB7CgkJCXN0YXRlLmN1ck5vZGUuQWRkQ2hpbGQobmV3IFNlcXVlbmNlTm9kZShvcHRpb25zKSk7CgkJfQoJCWVsc2UgaWYgKHNlcXVlbmNlVHlwZSA9PT0gImN5Y2xlIikgewoJCQlzdGF0ZS5jdXJOb2RlLkFkZENoaWxkKG5ldyBDeWNsZU5vZGUob3B0aW9ucykpOwoJCX0KCQllbHNlIGlmIChzZXF1ZW5jZVR5cGUgPT09ICJzaHVmZmxlIikgewoJCQlzdGF0ZS5jdXJOb2RlLkFkZENoaWxkKG5ldyBTaHVmZmxlTm9kZShvcHRpb25zKSk7CgkJfQoKCQlyZXR1cm4gc3RhdGU7Cgl9CgoJZnVuY3Rpb24gUGFyc2VGdW5jdGlvbihzdGF0ZSwgZnVuY05hbWUpIHsKCQliaXRzeS5sb2coIn5+fiBQQVJTRSBGVU5DVElPTiAiICsgZnVuY05hbWUpOwoKCQl2YXIgYXJncyA9IFtdOwoKCQl2YXIgY3VyU3ltYm9sID0gIiI7CgkJZnVuY3Rpb24gT25TeW1ib2xFbmQoKSB7CgkJCWN1clN5bWJvbCA9IGN1clN5bWJvbC50cmltKCk7CgkJCS8vIGJpdHN5LmxvZygiUEFSQU1URVIgIiArIGN1clN5bWJvbCk7CgkJCWFyZ3MucHVzaCggU3RyaW5nVG9WYWx1ZShjdXJTeW1ib2wpICk7CgkJCS8vIGJpdHN5LmxvZyhhcmdzKTsKCQkJY3VyU3ltYm9sID0gIiI7CgkJfQoKCQl3aGlsZSggISggc3RhdGUuQ2hhcigpID09PSAiXG4iIHx8IHN0YXRlLkRvbmUoKSApICkgewoJCQlpZiggc3RhdGUuTWF0Y2hBaGVhZChTeW0uQ29kZU9wZW4pICkgewoJCQkJdmFyIGNvZGVCbG9ja1N0YXRlID0gbmV3IFBhcnNlclN0YXRlKG5ldyBDb2RlQmxvY2tOb2RlKCksIHN0YXRlLkNvbnN1bWVCbG9jayhTeW0uQ29kZU9wZW4sIFN5bS5Db2RlQ2xvc2UpKTsKCQkJCWNvZGVCbG9ja1N0YXRlID0gUGFyc2VDb2RlKCBjb2RlQmxvY2tTdGF0ZSApOwoJCQkJdmFyIGNvZGVCbG9jayA9IGNvZGVCbG9ja1N0YXRlLnJvb3ROb2RlOwoJCQkJYXJncy5wdXNoKCBjb2RlQmxvY2sgKTsKCQkJCWN1clN5bWJvbCA9ICIiOwoJCQl9CgkJCWVsc2UgaWYoIHN0YXRlLk1hdGNoQWhlYWQoU3ltLlN0cmluZykgKSB7CgkJCQkvKiBTVFJJTkcgTElURVJBTCAqLwoJCQkJdmFyIHN0ciA9IHN0YXRlLkNvbnN1bWVCbG9jayhTeW0uU3RyaW5nLCBTeW0uU3RyaW5nKTsKCQkJCS8vIGJpdHN5LmxvZygiU1RSSU5HICIgKyBzdHIpOwoJCQkJYXJncy5wdXNoKCBuZXcgTGl0ZXJhbE5vZGUoc3RyKSApOwoJCQkJY3VyU3ltYm9sID0gIiI7CgkJCX0KCQkJZWxzZSBpZihzdGF0ZS5DaGFyKCkgPT09ICIgIiAmJiBjdXJTeW1ib2wubGVuZ3RoID4gMCkgewoJCQkJT25TeW1ib2xFbmQoKTsKCQkJfQoJCQllbHNlIHsKCQkJCWN1clN5bWJvbCArPSBzdGF0ZS5DaGFyKCk7CgkJCX0KCQkJc3RhdGUuU3RlcCgpOwoJCX0KCgkJaWYoY3VyU3ltYm9sLmxlbmd0aCA+IDApIHsKCQkJT25TeW1ib2xFbmQoKTsKCQl9CgoJCXN0YXRlLmN1ck5vZGUuQWRkQ2hpbGQoIG5ldyBGdW5jTm9kZSggZnVuY05hbWUsIGFyZ3MgKSApOwoKCQlyZXR1cm4gc3RhdGU7Cgl9CgoJZnVuY3Rpb24gSXNWYWxpZFZhcmlhYmxlTmFtZShzdHIpIHsKCQl2YXIgcmVnID0gL15bYS16QS1aXyRdW2EtekEtWl8kMC05XSokLzsKCQl2YXIgaXNWYWxpZCA9IHJlZy50ZXN0KHN0cik7CgkJLy8gYml0c3kubG9nKCJWQUxJRCB2YXJpYWJsZT8/PyAiICsgaXNWYWxpZCk7CgkJcmV0dXJuIGlzVmFsaWQ7Cgl9CgoJZnVuY3Rpb24gU3RyaW5nVG9WYWx1ZSh2YWxTdHIpIHsKCQlpZih2YWxTdHJbMF0gPT09IFN5bS5Db2RlT3BlbikgewoJCQkvLyBDT0RFIEJMT0NLISEhCgkJCXZhciBjb2RlU3RyID0gKG5ldyBQYXJzZXJTdGF0ZSggbnVsbCwgdmFsU3RyICkpLkNvbnN1bWVCbG9jayhTeW0uQ29kZU9wZW4sIFN5bS5Db2RlQ2xvc2UpOyAvL2hhY2t5CgkJCXZhciBjb2RlQmxvY2tTdGF0ZSA9IG5ldyBQYXJzZXJTdGF0ZShuZXcgQ29kZUJsb2NrTm9kZSgpLCBjb2RlU3RyKTsKCQkJY29kZUJsb2NrU3RhdGUgPSBQYXJzZUNvZGUoIGNvZGVCbG9ja1N0YXRlICk7CgkJCXJldHVybiBjb2RlQmxvY2tTdGF0ZS5yb290Tm9kZTsKCQl9CgkJZWxzZSBpZih2YWxTdHJbMF0gPT09IFN5bS5TdHJpbmcpIHsKCQkJLy8gU1RSSU5HISEKCQkJLy8gYml0c3kubG9nKCJTVFJJTkciKTsKCQkJdmFyIHN0ciA9ICIiOwoJCQl2YXIgaSA9IDE7CgkJCXdoaWxlIChpIDwgdmFsU3RyLmxlbmd0aCAmJiB2YWxTdHJbaV0gIT0gU3ltLlN0cmluZykgewoJCQkJc3RyICs9IHZhbFN0cltpXTsKCQkJCWkrKzsKCQkJfQoJCQkvLyBiaXRzeS5sb2coc3RyKTsKCQkJcmV0dXJuIG5ldyBMaXRlcmFsTm9kZSggc3RyICk7CgkJfQoJCWVsc2UgaWYodmFsU3RyID09PSAidHJ1ZSIpIHsKCQkJLy8gQk9PTAoJCQlyZXR1cm4gbmV3IExpdGVyYWxOb2RlKCB0cnVlICk7CgkJfQoJCWVsc2UgaWYodmFsU3RyID09PSAiZmFsc2UiKSB7CgkJCS8vIEJPT0wKCQkJcmV0dXJuIG5ldyBMaXRlcmFsTm9kZSggZmFsc2UgKTsKCQl9CgkJZWxzZSBpZiggIWlzTmFOKHBhcnNlRmxvYXQodmFsU3RyKSkgKSB7CgkJCS8vIE5VTUJFUiEhCgkJCS8vIGJpdHN5LmxvZygiTlVNQkVSISEhICIgKyB2YWxTdHIpOwoJCQlyZXR1cm4gbmV3IExpdGVyYWxOb2RlKCBwYXJzZUZsb2F0KHZhbFN0cikgKTsKCQl9CgkJZWxzZSBpZihJc1ZhbGlkVmFyaWFibGVOYW1lKHZhbFN0cikpIHsKCQkJLy8gVkFSSUFCTEUhIQoJCQkvLyBiaXRzeS5sb2coIlZBUklBQkxFIik7CgkJCXJldHVybiBuZXcgVmFyTm9kZSh2YWxTdHIpOyAvLyBUT0RPIDogY2hlY2sgZm9yIHZhbGlkIHBvdGVudGlhbCB2YXJpYWJsZXMKCQl9CgkJZWxzZSB7CgkJCS8vIHVoIG9oCgkJCXJldHVybiBuZXcgTGl0ZXJhbE5vZGUobnVsbCk7CgkJfQoJfQoKCWZ1bmN0aW9uIENyZWF0ZUV4cHJlc3Npb24oZXhwU3RyKSB7CgkJZXhwU3RyID0gZXhwU3RyLnRyaW0oKTsKCgkJZnVuY3Rpb24gSXNJbnNpZGVTdHJpbmcoaW5kZXgpIHsKCQkJdmFyIGluU3RyaW5nID0gZmFsc2U7CgkJCWZvcih2YXIgaSA9IDA7IGkgPCBleHBTdHIubGVuZ3RoOyBpKyspIHsKCQkJCWlmKGV4cFN0cltpXSA9PT0gU3ltLlN0cmluZykKCQkJCQlpblN0cmluZyA9ICFpblN0cmluZzsKCgkJCQlpZihpbmRleCA9PT0gaSkKCQkJCQlyZXR1cm4gaW5TdHJpbmc7CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJZnVuY3Rpb24gSXNJbnNpZGVDb2RlKGluZGV4KSB7CgkJCXZhciBjb3VudCA9IDA7CgkJCWZvcih2YXIgaSA9IDA7IGkgPCBleHBTdHIubGVuZ3RoOyBpKyspIHsKCQkJCWlmKGV4cFN0cltpXSA9PT0gU3ltLkNvZGVPcGVuKQoJCQkJCWNvdW50Kys7CgkJCQllbHNlIGlmKGV4cFN0cltpXSA9PT0gU3ltLkNvZGVDbG9zZSkKCQkJCQljb3VudC0tOwoKCQkJCWlmKGluZGV4ID09PSBpKQoJCQkJCXJldHVybiBjb3VudCA+IDA7CgkJCX0KCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJdmFyIG9wZXJhdG9yID0gbnVsbDsKCgkJLy8gc2V0IGlzIHNwZWNpYWwgYmVjYXVzZSBvdGhlciBvcGVyYXRvciBjYW4gbG9vayBsaWtlIGl0LCBhbmQgaXQgaGFzIHRvIGdvIGZpcnN0IGluIHRoZSBvcmRlciBvZiBvcGVyYXRpb25zCgkJdmFyIHNldEluZGV4ID0gZXhwU3RyLmluZGV4T2YoU3ltLlNldCk7CgkJaWYoIHNldEluZGV4ID4gLTEgJiYgIUlzSW5zaWRlU3RyaW5nKHNldEluZGV4KSAmJiAhSXNJbnNpZGVDb2RlKHNldEluZGV4KSApIHsgLy8gaXQgbWlnaHQgYmUgYSBzZXQgb3BlcmF0b3IKCQkJaWYoIGV4cFN0cltzZXRJbmRleCsxXSAhPSAiPSIgJiYgZXhwU3RyW3NldEluZGV4LTFdICE9ICI+IiAmJiBleHBTdHJbc2V0SW5kZXgtMV0gIT0gIjwiICkgewoJCQkJLy8gb2sgaXQgYWN0dWFsbHkgSVMgYSBzZXQgb3BlcmF0b3IgYW5kIG5vdCA9PSwgPj0sIG9yIDw9CgkJCQlvcGVyYXRvciA9IFN5bS5TZXQ7CgkJCQl2YXIgdmFyaWFibGVOYW1lID0gZXhwU3RyLnN1YnN0cmluZygwLHNldEluZGV4KS50cmltKCk7IC8vIFRPRE8gOiB2YWxpZCB2YXJpYWJsZSBuYW1lIHRlc3RpbmcKCQkJCXZhciBsZWZ0ID0gSXNWYWxpZFZhcmlhYmxlTmFtZSh2YXJpYWJsZU5hbWUpID8gbmV3IFZhck5vZGUoIHZhcmlhYmxlTmFtZSApIDogbmV3IExpdGVyYWxOb2RlKG51bGwpOwoJCQkJdmFyIHJpZ2h0ID0gQ3JlYXRlRXhwcmVzc2lvbiggZXhwU3RyLnN1YnN0cmluZyhzZXRJbmRleCtTeW0uU2V0Lmxlbmd0aCkgKTsKCQkJCXZhciBleHAgPSBuZXcgRXhwTm9kZSggb3BlcmF0b3IsIGxlZnQsIHJpZ2h0ICk7CgkJCQlyZXR1cm4gZXhwOwoJCQl9CgkJfQoKCQkvLyBzcGVjaWFsIGlmICJleHByZXNzaW9uIiBmb3Igc2luZ2xlLWxpbmUgaWYgc3RhdGVtZW50cwoJCXZhciBpZkluZGV4ID0gZXhwU3RyLmluZGV4T2YoU3ltLkNvbmRpdGlvbkVuZCk7CgkJaWYoIGlmSW5kZXggPiAtMSAmJiAhSXNJbnNpZGVTdHJpbmcoaWZJbmRleCkgJiYgIUlzSW5zaWRlQ29kZShpZkluZGV4KSApIHsKCQkJb3BlcmF0b3IgPSBTeW0uQ29uZGl0aW9uRW5kOwoJCQl2YXIgY29uZGl0aW9uU3RyID0gZXhwU3RyLnN1YnN0cmluZygwLGlmSW5kZXgpLnRyaW0oKTsKCQkJdmFyIGNvbmRpdGlvbnMgPSBbIENyZWF0ZUV4cHJlc3Npb24oY29uZGl0aW9uU3RyKSBdOwoKCQkJdmFyIHJlc3VsdFN0ciA9IGV4cFN0ci5zdWJzdHJpbmcoaWZJbmRleCtTeW0uQ29uZGl0aW9uRW5kLmxlbmd0aCk7CgkJCXZhciByZXN1bHRzID0gW107CgkJCWZ1bmN0aW9uIEFkZFJlc3VsdChzdHIpIHsKCQkJCXZhciBkaWFsb2dCbG9ja1N0YXRlID0gbmV3IFBhcnNlclN0YXRlKG5ldyBEaWFsb2dCbG9ja05vZGUoKSwgc3RyKTsKCQkJCWRpYWxvZ0Jsb2NrU3RhdGUgPSBQYXJzZURpYWxvZyggZGlhbG9nQmxvY2tTdGF0ZSApOwoJCQkJdmFyIGRpYWxvZ0Jsb2NrID0gZGlhbG9nQmxvY2tTdGF0ZS5yb290Tm9kZTsKCQkJCXJlc3VsdHMucHVzaCggZGlhbG9nQmxvY2sgKTsKCQkJfQoKCQkJdmFyIGVsc2VJbmRleCA9IHJlc3VsdFN0ci5pbmRleE9mKFN5bS5FbHNlRXhwKTsgLy8gZG9lcyB0aGlzIG5lZWQgdG8gdGVzdCBmb3Igc3RyaW5ncz8KCQkJaWYoZWxzZUluZGV4ID4gLTEpIHsKCQkJCWNvbmRpdGlvbnMucHVzaCggbmV3IEVsc2VOb2RlKCkgKTsKCgkJCQl2YXIgZWxzZVN0ciA9IHJlc3VsdFN0ci5zdWJzdHJpbmcoZWxzZUluZGV4K1N5bS5FbHNlRXhwLmxlbmd0aCk7CgkJCQl2YXIgcmVzdWx0U3RyID0gcmVzdWx0U3RyLnN1YnN0cmluZygwLGVsc2VJbmRleCk7CgoJCQkJQWRkUmVzdWx0KCByZXN1bHRTdHIudHJpbSgpICk7CgkJCQlBZGRSZXN1bHQoIGVsc2VTdHIudHJpbSgpICk7CgkJCX0KCQkJZWxzZSB7CgkJCQlBZGRSZXN1bHQoIHJlc3VsdFN0ci50cmltKCkgKTsKCQkJfQoKCQkJcmV0dXJuIG5ldyBJZk5vZGUoIGNvbmRpdGlvbnMsIHJlc3VsdHMsIHRydWUgLyppc1NpbmdsZUxpbmUqLyApOwoJCX0KCgkJZm9yKCB2YXIgaSA9IDA7IChvcGVyYXRvciA9PSBudWxsKSAmJiAoaSA8IFN5bS5PcGVyYXRvcnMubGVuZ3RoKTsgaSsrICkgewoJCQl2YXIgb3BTeW0gPSBTeW0uT3BlcmF0b3JzW2ldOwoJCQl2YXIgb3BJbmRleCA9IGV4cFN0ci5pbmRleE9mKCBvcFN5bSApOwoJCQlpZiggb3BJbmRleCA+IC0xICYmICFJc0luc2lkZVN0cmluZyhvcEluZGV4KSAmJiAhSXNJbnNpZGVDb2RlKG9wSW5kZXgpICkgewoJCQkJb3BlcmF0b3IgPSBvcFN5bTsKCQkJCXZhciBsZWZ0ID0gQ3JlYXRlRXhwcmVzc2lvbiggZXhwU3RyLnN1YnN0cmluZygwLG9wSW5kZXgpICk7CgkJCQl2YXIgcmlnaHQgPSBDcmVhdGVFeHByZXNzaW9uKCBleHBTdHIuc3Vic3RyaW5nKG9wSW5kZXgrb3BTeW0ubGVuZ3RoKSApOwoJCQkJdmFyIGV4cCA9IG5ldyBFeHBOb2RlKCBvcGVyYXRvciwgbGVmdCwgcmlnaHQgKTsKCQkJCXJldHVybiBleHA7CgkJCX0KCQl9CgoJCWlmKCBvcGVyYXRvciA9PSBudWxsICkgewoJCQlyZXR1cm4gU3RyaW5nVG9WYWx1ZShleHBTdHIpOwoJCX0KCX0KCXRoaXMuQ3JlYXRlRXhwcmVzc2lvbiA9IENyZWF0ZUV4cHJlc3Npb247CgoJZnVuY3Rpb24gSXNXaGl0ZXNwYWNlKHN0cikgewoJCXJldHVybiAoIHN0ciA9PT0gIiAiIHx8IHN0ciA9PT0gIlx0IiB8fCBzdHIgPT09ICJcbiIgKTsKCX0KCglmdW5jdGlvbiBJc0V4cHJlc3Npb24oc3RyKSB7CgkJdmFyIHRlbXBTdGF0ZSA9IG5ldyBQYXJzZXJTdGF0ZShudWxsLCBzdHIpOyAvLyBoYWNreQoJCXZhciB0ZXh0T3V0c2lkZUNvZGVCbG9ja3MgPSAiIjsKCgkJd2hpbGUgKCF0ZW1wU3RhdGUuRG9uZSgpKSB7CgkJCWlmICh0ZW1wU3RhdGUuTWF0Y2hBaGVhZChTeW0uQ29kZU9wZW4pKSB7CgkJCQl0ZW1wU3RhdGUuQ29uc3VtZUJsb2NrKFN5bS5Db2RlT3BlbiwgU3ltLkNvZGVDbG9zZSk7CgkJCX0KCQkJZWxzZSB7CgkJCQl0ZXh0T3V0c2lkZUNvZGVCbG9ja3MgKz0gdGVtcFN0YXRlLkNoYXIoKTsKCQkJCXRlbXBTdGF0ZS5TdGVwKCk7CgkJCX0KCQl9CgoJCXZhciBjb250YWluc0FueUV4cHJlc3Npb25PcGVyYXRvcnMgPSAodGV4dE91dHNpZGVDb2RlQmxvY2tzLmluZGV4T2YoU3ltLkNvbmRpdGlvbkVuZCkgIT0gLTEpIHx8CgkJCQkodGV4dE91dHNpZGVDb2RlQmxvY2tzLmluZGV4T2YoU3ltLlNldCkgIT0gLTEpIHx8CgkJCQkoU3ltLk9wZXJhdG9ycy5zb21lKGZ1bmN0aW9uKG9wU3ltKSB7IHJldHVybiB0ZXh0T3V0c2lkZUNvZGVCbG9ja3MuaW5kZXhPZihvcFN5bSkgIT0gLTE7IH0pKTsKCgkJcmV0dXJuIGNvbnRhaW5zQW55RXhwcmVzc2lvbk9wZXJhdG9yczsKCX0KCglmdW5jdGlvbiBJc0xpdGVyYWwoc3RyKSB7CgkJdmFyIGlzQm9vbCA9IHN0ciA9PT0gInRydWUiIHx8IHN0ciA9PT0gImZhbHNlIjsKCQl2YXIgaXNOdW0gPSAhaXNOYU4ocGFyc2VGbG9hdChzdHIpKTsKCQl2YXIgaXNTdHIgPSBzdHJbMF0gPT09ICciJyAmJiBzdHJbc3RyLmxlbmd0aC0xXSA9PT0gJyInOwoJCXZhciBpc1ZhciA9IElzVmFsaWRWYXJpYWJsZU5hbWUoc3RyKTsKCQl2YXIgaXNFbXB0eSA9IHN0ci5sZW5ndGggPT09IDA7CgkJcmV0dXJuIGlzQm9vbCB8fCBpc051bSB8fCBpc1N0ciB8fCBpc1ZhciB8fCBpc0VtcHR5OwoJfQoKCWZ1bmN0aW9uIFBhcnNlRXhwcmVzc2lvbihzdGF0ZSkgewoJCXZhciBsaW5lID0gc3RhdGUuU291cmNlKCk7IC8vIHN0YXRlLlBlYWsoIFtTeW0uTGluZWJyZWFrXSApOyAvLyBUT0RPIDogcmVtb3ZlIHRoZSBsaW5lYnJlYWsgdGhpbmcKCQkvLyBiaXRzeS5sb2coIkVYUFJFU1NJT04gIiArIGxpbmUpOwoJCXZhciBleHAgPSBDcmVhdGVFeHByZXNzaW9uKGxpbmUpOwoJCS8vIGJpdHN5LmxvZyhleHApOwoJCXN0YXRlLmN1ck5vZGUuQWRkQ2hpbGQoZXhwKTsKCQlzdGF0ZS5TdGVwKGxpbmUubGVuZ3RoKTsKCQlyZXR1cm4gc3RhdGU7Cgl9CgoJZnVuY3Rpb24gSXNDb25kaXRpb25hbEJsb2NrKHN0YXRlKSB7CgkJdmFyIHBlYWtUb0ZpcnN0TGlzdFN5bWJvbCA9IHN0YXRlLlBlYWsoW1N5bS5MaXN0XSk7CgoJCXZhciBmb3VuZExpc3RTeW1ib2wgPSBwZWFrVG9GaXJzdExpc3RTeW1ib2wgPCBzdGF0ZS5Tb3VyY2UoKS5sZW5ndGg7CgoJCXZhciBhcmVBbGxDaGFyc0JlZm9yZUxpc3RXaGl0ZXNwYWNlID0gdHJ1ZTsKCQlmb3IgKHZhciBpID0gMDsgaSA8IHBlYWtUb0ZpcnN0TGlzdFN5bWJvbC5sZW5ndGg7IGkrKykgewoJCQlpZiAoIUlzV2hpdGVzcGFjZShwZWFrVG9GaXJzdExpc3RTeW1ib2xbaV0pKSB7CgkJCQlhcmVBbGxDaGFyc0JlZm9yZUxpc3RXaGl0ZXNwYWNlID0gZmFsc2U7CgkJCX0KCQl9CgoJCXZhciBwZWFrVG9GaXJzdENvbmRpdGlvblN5bWJvbCA9IHN0YXRlLlBlYWsoW1N5bS5Db25kaXRpb25FbmRdKTsKCQlwZWFrVG9GaXJzdENvbmRpdGlvblN5bWJvbCA9IHBlYWtUb0ZpcnN0Q29uZGl0aW9uU3ltYm9sLnNsaWNlKHBlYWtUb0ZpcnN0TGlzdFN5bWJvbC5sZW5ndGgpOwoJCXZhciBoYXNOb0xpbmVicmVha0JldHdlZW5MaXN0QW5kQ29uZGl0aW9uRW5kID0gcGVha1RvRmlyc3RDb25kaXRpb25TeW1ib2wuaW5kZXhPZihTeW0uTGluZWJyZWFrKSA9PSAtMTsKCgkJcmV0dXJuIGZvdW5kTGlzdFN5bWJvbCAmJiAKCQkJYXJlQWxsQ2hhcnNCZWZvcmVMaXN0V2hpdGVzcGFjZSAmJiAKCQkJaGFzTm9MaW5lYnJlYWtCZXR3ZWVuTGlzdEFuZENvbmRpdGlvbkVuZDsKCX0KCglmdW5jdGlvbiBQYXJzZUNvZGUoc3RhdGUpIHsKCQlpZiAoSXNDb25kaXRpb25hbEJsb2NrKHN0YXRlKSkgewoJCQlzdGF0ZSA9IFBhcnNlQ29uZGl0aW9uYWwoc3RhdGUpOwoJCX0KCQllbHNlIGlmIChlbnZpcm9ubWVudC5IYXNGdW5jdGlvbihzdGF0ZS5QZWFrKFsiICJdKSkpIHsgLy8gVE9ETyAtLS0gd2hhdCBhYm91dCBuZXdsaW5lcz8/PwoJCQl2YXIgZnVuY05hbWUgPSBzdGF0ZS5QZWFrKFsiICJdKTsKCQkJc3RhdGUuU3RlcChmdW5jTmFtZS5sZW5ndGgpOwoJCQlzdGF0ZSA9IFBhcnNlRnVuY3Rpb24oc3RhdGUsIGZ1bmNOYW1lKTsKCQl9CgkJZWxzZSBpZiAoSXNTZXF1ZW5jZShzdGF0ZS5QZWFrKFsiICIsIFN5bS5MaW5lYnJlYWtdKSkpIHsKCQkJdmFyIHNlcXVlbmNlVHlwZSA9IHN0YXRlLlBlYWsoWyIgIiwgU3ltLkxpbmVicmVha10pOwoJCQlzdGF0ZS5TdGVwKHNlcXVlbmNlVHlwZS5sZW5ndGgpOwoJCQlzdGF0ZSA9IFBhcnNlU2VxdWVuY2Uoc3RhdGUsIHNlcXVlbmNlVHlwZSk7CgkJfQoJCWVsc2UgaWYgKElzTGl0ZXJhbChzdGF0ZS5Tb3VyY2UoKSkgfHwgSXNFeHByZXNzaW9uKHN0YXRlLlNvdXJjZSgpKSkgewoJCQlzdGF0ZSA9IFBhcnNlRXhwcmVzc2lvbihzdGF0ZSk7CgkJfQoJCWVsc2UgewoJCQl2YXIgdW5kZWZpbmVkU3JjID0gc3RhdGUuUGVhayhbXSk7CgkJCXZhciB1bmRlZmluZWROb2RlID0gbmV3IFVuZGVmaW5lZE5vZGUodW5kZWZpbmVkU3JjKTsKCQkJc3RhdGUuY3VyTm9kZS5BZGRDaGlsZCh1bmRlZmluZWROb2RlKTsKCQl9CgoJCS8vIGp1c3QgZ28gdG8gdGhlIGVuZCBub3cKCQl3aGlsZSAoIXN0YXRlLkRvbmUoKSkgewoJCQlzdGF0ZS5TdGVwKCk7CgkJfQoKCQlyZXR1cm4gc3RhdGU7Cgl9CgoJZnVuY3Rpb24gUGFyc2VDb2RlQmxvY2soc3RhdGUpIHsKCQl2YXIgY29kZVN0ciA9IHN0YXRlLkNvbnN1bWVCbG9jayggU3ltLkNvZGVPcGVuLCBTeW0uQ29kZUNsb3NlICk7CgkJdmFyIGNvZGVTdGF0ZSA9IG5ldyBQYXJzZXJTdGF0ZShuZXcgQ29kZUJsb2NrTm9kZSgpLCBjb2RlU3RyKTsKCQljb2RlU3RhdGUgPSBQYXJzZUNvZGUoIGNvZGVTdGF0ZSApOwoJCXN0YXRlLmN1ck5vZGUuQWRkQ2hpbGQoIGNvZGVTdGF0ZS5yb290Tm9kZSApOwoJCXJldHVybiBzdGF0ZTsKCX0KCn0KCn0gLy8gU2NyaXB0KCkKPC9zY3JpcHQ+Cgo8c2NyaXB0PgpmdW5jdGlvbiBEaWFsb2coKSB7Cgp0aGlzLkNyZWF0ZVJlbmRlcmVyID0gZnVuY3Rpb24oKSB7CglyZXR1cm4gbmV3IERpYWxvZ1JlbmRlcmVyKCk7Cn07Cgp0aGlzLkNyZWF0ZUJ1ZmZlciA9IGZ1bmN0aW9uKCkgewoJcmV0dXJuIG5ldyBEaWFsb2dCdWZmZXIoKTsKfTsKCnZhciBEaWFsb2dSZW5kZXJlciA9IGZ1bmN0aW9uKCkgewoJLy8gVE9ETyA6IHJlZmFjdG9yIHRoaXMgZXZlbnR1YWxseT8gcmVtb3ZlIGV2ZXJ5dGhpbmcgZnJvbSBzdHJ1Y3QuLiBhdm9pZCB0aGUgZGVmYXVsdHM/Cgl2YXIgdGV4dGJveEluZm8gPSB7CgkJd2lkdGggOiAxMDQsCgkJaGVpZ2h0IDogOCs0KzIrNSwgLy84IGZvciB0ZXh0LCA0IGZvciB0b3AtYm90dG9tIHBhZGRpbmcsIDIgZm9yIGxpbmUgcGFkZGluZywgNSBmb3IgYXJyb3cKCQl0b3AgOiAxMiwKCQlsZWZ0IDogMTIsCgkJYm90dG9tIDogMTIsIC8vZm9yIGRyYXdpbmcgaXQgZnJvbSB0aGUgYm90dG9tCgkJcGFkZGluZ192ZXJ0IDogMiwKCQlwYWRkaW5nX2hvcnogOiA0LAoJCWFycm93X2hlaWdodCA6IDUsCgl9OwoKCXZhciBmb250ID0gbnVsbDsKCXRoaXMuU2V0Rm9udCA9IGZ1bmN0aW9uKGYpIHsKCQlmb250ID0gZjsKCQl0ZXh0Ym94SW5mby5oZWlnaHQgPSAodGV4dGJveEluZm8ucGFkZGluZ192ZXJ0ICogMykgKyAocmVsYXRpdmVGb250SGVpZ2h0KCkgKiAyKSArIHRleHRib3hJbmZvLmFycm93X2hlaWdodDsKCgkJLy8gdG9kbyA6IGNsZWFuIHVwIGFsbCB0aGUgc2NhbGUgc3R1ZmYKCQl2YXIgdGV4dGJveFNjYWxlVyA9IHRleHRib3hJbmZvLndpZHRoICogZ2V0VGV4dFNjYWxlKCk7CgkJdmFyIHRleHRib3hTY2FsZUggPSB0ZXh0Ym94SW5mby5oZWlnaHQgKiBnZXRUZXh0U2NhbGUoKTsKCQliaXRzeS50ZXh0Ym94KGZhbHNlLCAwLCAwLCB0ZXh0Ym94U2NhbGVXLCB0ZXh0Ym94U2NhbGVIKTsKCX0KCgl0aGlzLkdldFBpeGVsc1BlclJvdyA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiAodGV4dGJveEluZm8ud2lkdGggLSAodGV4dGJveEluZm8ucGFkZGluZ19ob3J6ICogMikpICogZ2V0VGV4dFNjYWxlKCk7Cgl9CgoJLy8gdG9kbyA6IGNhY2hlIHRoaXMgdmFsdWU/IGl0IHNob3VsZG4ndCByZWFsbHkgY2hhbmdlIGluIHRoZSBtaWRkbGUgb2YgYSBnYW1lCglmdW5jdGlvbiBnZXRUZXh0U2NhbGUoKSB7CgkJcmV0dXJuIGJpdHN5LnRleHRNb2RlKCkgPT09IGJpdHN5LlRYVF9MT1JFWiA/IDEgOiAyOwoJfQoKCWZ1bmN0aW9uIHJlbGF0aXZlRm9udFdpZHRoKCkgewoJCXJldHVybiBNYXRoLmNlaWwoZm9udC5nZXRXaWR0aCgpIC8gZ2V0VGV4dFNjYWxlKCkpOwoJfQoKCWZ1bmN0aW9uIHJlbGF0aXZlRm9udEhlaWdodCgpIHsKCQlyZXR1cm4gTWF0aC5jZWlsKGZvbnQuZ2V0SGVpZ2h0KCkgLyBnZXRUZXh0U2NhbGUoKSk7Cgl9CgoJdGhpcy5DbGVhclRleHRib3ggPSBmdW5jdGlvbigpIHsKCQliaXRzeS5maWxsKGJpdHN5LlRFWFRCT1gsIHRleHRCYWNrZ3JvdW5kSW5kZXgpOwoJfTsKCgl2YXIgaXNDZW50ZXJlZCA9IGZhbHNlOwoJdGhpcy5TZXRDZW50ZXJlZCA9IGZ1bmN0aW9uKGNlbnRlcmVkKSB7CgkJaXNDZW50ZXJlZCA9IGNlbnRlcmVkOwoJfTsKCgkvLyB0b2RvIDogSSBjYW4gc3RvcCBkb2luZyB0aGlzIGV2ZXJ5IGZyYW1lIHJpZ2h0PwoJdGhpcy5EcmF3VGV4dGJveCA9IGZ1bmN0aW9uKCkgewoJCWlmIChpc0NlbnRlcmVkKSB7CgkJCS8vIHRvZG8gOiB3aWxsIHRoZSBoZWlnaHQgY2FsY3VsYXRpb25zIGFsd2F5cyB3b3JrPwoJCQliaXRzeS50ZXh0Ym94KHRydWUsIHRleHRib3hJbmZvLmxlZnQsICgoYml0c3kuVklERU9fU0laRSAvIDIpIC0gKHRleHRib3hJbmZvLmhlaWdodCAvIDIpKSk7CgkJfQoJCWVsc2UgaWYgKHBsYXllcigpLnkgPCAoYml0c3kuTUFQX1NJWkUgLyAyKSkgewoJCQkvLyBib3R0b20KCQkJYml0c3kudGV4dGJveCh0cnVlLCB0ZXh0Ym94SW5mby5sZWZ0LCAoYml0c3kuVklERU9fU0laRSAtIHRleHRib3hJbmZvLmJvdHRvbSAtIHRleHRib3hJbmZvLmhlaWdodCkpOwoJCX0KCQllbHNlIHsKCQkJLy8gdG9wCgkJCWJpdHN5LnRleHRib3godHJ1ZSwgdGV4dGJveEluZm8ubGVmdCwgdGV4dGJveEluZm8udG9wKTsKCQl9Cgl9OwoKCXZhciBhcnJvd2RhdGEgPSBbCgkJMSwxLDEsMSwxLAoJCTAsMSwxLDEsMCwKCQkwLDAsMSwwLDAKCV07CgoJdGhpcy5EcmF3TmV4dEFycm93ID0gZnVuY3Rpb24oKSB7CgkJLy8gYml0c3kubG9nKCJkcmF3IGFycm93ISIpOwoJCXZhciB0ZXh0X3NjYWxlID0gZ2V0VGV4dFNjYWxlKCk7CgkJdmFyIHRleHRib3hTY2FsZVcgPSB0ZXh0Ym94SW5mby53aWR0aCAqIHRleHRfc2NhbGU7CgkJdmFyIHRleHRib3hTY2FsZUggPSB0ZXh0Ym94SW5mby5oZWlnaHQgKiB0ZXh0X3NjYWxlOwoKCQl2YXIgdG9wID0gKHRleHRib3hJbmZvLmhlaWdodCAtIDUpICogdGV4dF9zY2FsZTsKCQl2YXIgbGVmdCA9ICh0ZXh0Ym94SW5mby53aWR0aCAtICg1ICsgNCkpICogdGV4dF9zY2FsZTsKCQlpZiAodGV4dERpcmVjdGlvbiA9PT0gVGV4dERpcmVjdGlvbi5SaWdodFRvTGVmdCkgeyAvLyBSVEwgaGFjawoJCQlsZWZ0ID0gNCAqIHRleHRfc2NhbGU7CgkJfQoKCQlmb3IgKHZhciB5ID0gMDsgeSA8IDM7IHkrKykgewoJCQlmb3IgKHZhciB4ID0gMDsgeCA8IDU7IHgrKykgewoJCQkJdmFyIGkgPSAoeSAqIDUpICsgeDsKCQkJCWlmIChhcnJvd2RhdGFbaV0gPT0gMSkgewoJCQkJCS8vc2NhbGluZyBub25zZW5zZQoJCQkJCWZvciAodmFyIHN5ID0gMDsgc3kgPCB0ZXh0X3NjYWxlOyBzeSsrKSB7CgkJCQkJCWZvciAodmFyIHN4ID0gMDsgc3ggPCB0ZXh0X3NjYWxlOyBzeCsrKSB7CgkJCQkJCQl2YXIgcHggPSBsZWZ0ICsgKHggKiB0ZXh0X3NjYWxlKSArIHN4OwoJCQkJCQkJdmFyIHB5ID0gdG9wICsgKHkgKiB0ZXh0X3NjYWxlKSArIHN5OwoJCQkJCQkJYml0c3kuc2V0KGJpdHN5LlRFWFRCT1gsIChweSAqIHRleHRib3hTY2FsZVcpICsgcHgsIHRleHRBcnJvd0luZGV4KTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX07CgoJZnVuY3Rpb24gZHJhd0NoYXJEYXRhKGNoYXJEYXRhLCB0ZXh0U2NhbGUsIHRvcCwgbGVmdCwgd2lkdGgsIGhlaWdodCwgY29sb3IpIHsKCQlmb3IgKHZhciB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CgkJCWZvciAodmFyIHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewoJCQkJdmFyIGkgPSAoeSAqIHdpZHRoKSArIHg7CgkJCQlpZiAoY2hhckRhdGFbaV0gPT0gMSkgewoJCQkJCWJpdHN5LnNldChiaXRzeS5URVhUQk9YLCAoKHRvcCArIHkpICogKHRleHRib3hJbmZvLndpZHRoICogdGV4dFNjYWxlKSkgKyAobGVmdCArIHgpLCBjb2xvcik7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJdGhpcy5EcmF3Q2hhciA9IGZ1bmN0aW9uKGNoYXIsIHJvdywgY29sLCBsZWZ0UG9zKSB7CgkJLy8gY2hhcmFjdGVycyB3aXRoIGVmZmVjdHMgbmVlZCB0byBiZSByZWRyYXduIGV2ZXJ5IGZyYW1lCgkJaWYgKGNoYXIuZWZmZWN0TGlzdC5sZW5ndGggPiAwKSB7CgkJCWNoYXIucmVkcmF3ID0gdHJ1ZTsKCQl9CgoJCS8vIHNraXAgY2hhcmFjdGVycyB0aGF0IGFyZSBhbHJlYWR5IGRyYXduIGFuZCBkb24ndCBuZWVkIHRvIGJlIHVwZGF0ZWQKCQlpZiAoIWNoYXIucmVkcmF3KSB7CgkJCXJldHVybjsKCQl9CgkJY2hhci5yZWRyYXcgPSBmYWxzZTsKCgkJdmFyIHRleHRfc2NhbGUgPSBnZXRUZXh0U2NhbGUoKTsKCQl2YXIgY2hhckRhdGEgPSBjaGFyLmJpdG1hcDsKCQl2YXIgdG9wOwoJCXZhciBsZWZ0OwoKCQlpZiAoY2hhci5lZmZlY3RMaXN0Lmxlbmd0aCA+IDApIHsKCQkJLy8gY2xlYXIgdGhlIHBpeGVscyBmcm9tIHRoZSBwcmV2aW91cyBmcmFtZQoJCQl0b3AgPSAoNCAqIHRleHRfc2NhbGUpICsgKHJvdyAqIDIgKiB0ZXh0X3NjYWxlKSArIChyb3cgKiBmb250LmdldEhlaWdodCgpKSArIE1hdGguZmxvb3IoY2hhci5vZmZzZXQueSk7CgkJCWxlZnQgPSAoNCAqIHRleHRfc2NhbGUpICsgbGVmdFBvcyArIE1hdGguZmxvb3IoY2hhci5vZmZzZXQueCk7CgkJCWRyYXdDaGFyRGF0YShjaGFyRGF0YSwgdGV4dF9zY2FsZSwgdG9wLCBsZWZ0LCBjaGFyLndpZHRoLCBjaGFyLmhlaWdodCwgdGV4dEJhY2tncm91bmRJbmRleCk7CgkJfQoKCQkvLyBjb21wdXRlIHJlbmRlciBvZmZzZXQgKmV2ZXJ5KiBmcmFtZQoJCWNoYXIub2Zmc2V0ID0gewoJCQl4OiBjaGFyLmJhc2Vfb2Zmc2V0LngsCgkJCXk6IGNoYXIuYmFzZV9vZmZzZXQueQoJCX07CgkJY2hhci5TZXRQb3NpdGlvbihyb3csIGNvbCk7CgkJY2hhci5BcHBseUVmZmVjdHMoZWZmZWN0VGltZSk7CgoJCXRvcCA9ICg0ICogdGV4dF9zY2FsZSkgKyAocm93ICogMiAqIHRleHRfc2NhbGUpICsgKHJvdyAqIGZvbnQuZ2V0SGVpZ2h0KCkpICsgTWF0aC5mbG9vcihjaGFyLm9mZnNldC55KTsKCQlsZWZ0ID0gKDQgKiB0ZXh0X3NjYWxlKSArIGxlZnRQb3MgKyBNYXRoLmZsb29yKGNoYXIub2Zmc2V0LngpOwoKCQlkcmF3Q2hhckRhdGEoY2hhckRhdGEsIHRleHRfc2NhbGUsIHRvcCwgbGVmdCwgY2hhci53aWR0aCwgY2hhci5oZWlnaHQsIGNoYXIuY29sb3IpOwoKCQkvLyBUT0RPIDogY29uc2lkZXIgZm9yIGEgZnV0dXJlIHVwZGF0ZT8KCQkvKgoJCWlmIChzb3VuZFBsYXllciAmJiBjaGFyLmJsaXAgJiYgY2hhci5oYXNQbGF5ZWRCbGlwICE9IHRydWUpIHsKCQkJc291bmRQbGF5ZXIucGxheUJsaXAoYmxpcFtjaGFyLmJsaXBdLCB7IGlzUGl0Y2hSYW5kb21pemVkOiB0cnVlIH0pOwoJCQljaGFyLmhhc1BsYXllZEJsaXAgPSB0cnVlOwoJCX0KCQkqLwoKCQkvLyBjYWxsIHByaW50SGFuZGxlciBmb3IgY2hhcmFjdGVyCgkJaWYgKCFkaXNhYmxlT25QcmludEhhbmRsZXJzKSB7CgkJCWNoYXIuT25QcmludCgpOwoJCX0KCX07CgoJdmFyIGVmZmVjdFRpbWUgPSAwOyAvLyBUT0RPIHRoaXMgdmFyaWFibGUgc2hvdWxkIGxpdmUgc29tZXdoZXJlIGJldHRlcgoKCXZhciBzaG91bGRVcGRhdGVUZXh0Ym94U2V0dGluZ3MgPSB0cnVlOwoJdmFyIHNob3VsZENsZWFyVGV4dGJveCA9IHRydWU7Cgl2YXIgc2hvdWxkRHJhd0Fycm93ID0gdHJ1ZTsKCgl2YXIgZGlzYWJsZU9uUHJpbnRIYW5kbGVycyA9IGZhbHNlOwoKCXRoaXMuRHJhdyA9IGZ1bmN0aW9uKGJ1ZmZlciwgZHQsIGRpc2FibGVPblByaW50KSB7CgkJZGlzYWJsZU9uUHJpbnRIYW5kbGVycyA9IChkaXNhYmxlT25QcmludCA9PT0gdHJ1ZSk7CgoJCS8vIGJpdHN5LmxvZygiZHJhdyBkaWFsb2ciKTsKCQlpZiAoYnVmZmVyLkRpZEZsaXBQYWdlVGhpc0ZyYW1lKCkpIHsKCQkJc2hvdWxkQ2xlYXJUZXh0Ym94ID0gdHJ1ZTsKCQkJc2hvdWxkRHJhd0Fycm93ID0gdHJ1ZTsKCQl9CgoJCWVmZmVjdFRpbWUgKz0gZHQ7CgoJCWlmIChzaG91bGRVcGRhdGVUZXh0Ym94U2V0dGluZ3MpIHsKCQkJYml0c3kubG9nKCJkcmF3IHRleHRib3giKTsKCQkJdGhpcy5EcmF3VGV4dGJveCgpOyAvLyB0b2RvIDogcmVuYW1lIHRvIHNvbWV0aGluZyBtb3JlIGFjY3VyYXRlCgkJCXNob3VsZFVwZGF0ZVRleHRib3hTZXR0aW5ncyA9IGZhbHNlOwoJCX0KCgkJaWYgKHNob3VsZENsZWFyVGV4dGJveCkgewoJCQkvLyBiaXRzeS5sb2coImNsZWFyIHRleHRib3giKTsKCQkJdGhpcy5DbGVhclRleHRib3goKTsKCQkJc2hvdWxkQ2xlYXJUZXh0Ym94ID0gZmFsc2U7CgkJfQoKCQkvLyBiaXRzeS5sb2coImRyYXcgY2hhcnMiKTsKCQlidWZmZXIuRm9yRWFjaEFjdGl2ZUNoYXIodGhpcy5EcmF3Q2hhcik7CgoJCWlmIChidWZmZXIuQ2FuQ29udGludWUoKSAmJiBzaG91bGREcmF3QXJyb3cpIHsKCQkJLy8gYml0c3kubG9nKCJkcmF3IG5leHQgYXJyb3ciKTsKCQkJdGhpcy5EcmF3TmV4dEFycm93KCk7CgkJCXNob3VsZERyYXdBcnJvdyA9IGZhbHNlOwoJCX0KCgkJaWYgKGJ1ZmZlci5EaWRQYWdlRmluaXNoVGhpc0ZyYW1lKCkgJiYgb25QYWdlRmluaXNoICE9IG51bGwpIHsKCQkJYml0c3kubG9nKCJwYWdlIGZpbmlzaGVkIik7CgkJCW9uUGFnZUZpbmlzaCgpOwoJCX0KCgkJLy8gYml0c3kubG9nKCJkcmF3IGRpYWxvZyBlbmQiKTsKCX07CgoJLyogdGhpcyBpcyBhIGhvb2sgZm9yIEdJRiByZW5kZXJpbmcgKi8KCXZhciBvblBhZ2VGaW5pc2ggPSBudWxsOwoJdGhpcy5TZXRQYWdlRmluaXNoSGFuZGxlciA9IGZ1bmN0aW9uKGhhbmRsZXIpIHsKCQlvblBhZ2VGaW5pc2ggPSBoYW5kbGVyOwoJfTsKCgl0aGlzLlJlc2V0ID0gZnVuY3Rpb24oKSB7CgkJZWZmZWN0VGltZSA9IDA7CgkJLy8gVE9ETyAtIGFueXRoaW5nIGVsc2U/CgoJCXNob3VsZFVwZGF0ZVRleHRib3hTZXR0aW5ncyA9IHRydWU7CgkJc2hvdWxkQ2xlYXJUZXh0Ym94ID0gdHJ1ZTsKCQlzaG91bGREcmF3QXJyb3cgPSB0cnVlOwoJfQoKCXRoaXMudXBkYXRlVGV4dGJveFBvc2l0aW9uID0gZnVuY3Rpb24oKSB7CgkJc2hvdWxkVXBkYXRlVGV4dGJveFNldHRpbmdzID0gdHJ1ZTsKCX07CgoJLy8gdGhpcy5DaGFyc1BlclJvdyA9IGZ1bmN0aW9uKCkgewoJLy8gCXJldHVybiB0ZXh0Ym94SW5mby5jaGFyc1BlclJvdzsKCS8vIH0KfQoKdmFyIERpYWxvZ0J1ZmZlciA9IGZ1bmN0aW9uKCkgewoJdmFyIGJ1ZmZlciA9IFtbW11dXTsgLy8gaG9sZHMgZGlhbG9nIGluIGFuIGFycmF5IGJ1ZmZlcgoJdmFyIHBhZ2VJbmRleCA9IDA7Cgl2YXIgcm93SW5kZXggPSAwOwoJdmFyIGNoYXJJbmRleCA9IDA7Cgl2YXIgbmV4dENoYXJUaW1lciA9IDA7Cgl2YXIgbmV4dENoYXJNYXhUaW1lID0gNTA7IC8vIGluIG1pbGxpc2Vjb25kcwoJdmFyIGlzRGlhbG9nUmVhZHlUb0NvbnRpbnVlID0gZmFsc2U7Cgl2YXIgYWN0aXZlVGV4dEVmZmVjdHMgPSBbXTsKCXZhciBhY3RpdmVUZXh0RWZmZWN0UGFyYW1ldGVycyA9IFtdOwoJdmFyIGZvbnQgPSBudWxsOwoJdmFyIGFyYWJpY0hhbmRsZXIgPSBuZXcgQXJhYmljSGFuZGxlcigpOwoJdmFyIG9uRGlhbG9nRW5kQ2FsbGJhY2tzID0gW107CgoJdGhpcy5TZXRGb250ID0gZnVuY3Rpb24oZikgewoJCWZvbnQgPSBmOwoJfTsKCgl0aGlzLlNldFBpeGVsc1BlclJvdyA9IGZ1bmN0aW9uKG4pIHsKCQlwaXhlbHNQZXJSb3cgPSBuOwoJfTsKCgl0aGlzLkN1clBhZ2UgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGJ1ZmZlclsgcGFnZUluZGV4IF07IH07Cgl0aGlzLkN1clJvdyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5DdXJQYWdlKClbIHJvd0luZGV4IF07IH07Cgl0aGlzLkN1ckNoYXIgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuQ3VyUm93KClbIGNoYXJJbmRleCBdOyB9OwoJdGhpcy5DdXJQYWdlQ291bnQgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGJ1ZmZlci5sZW5ndGg7IH07Cgl0aGlzLkN1clJvd0NvdW50ID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLkN1clBhZ2UoKS5sZW5ndGg7IH07Cgl0aGlzLkN1ckNoYXJDb3VudCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5DdXJSb3coKS5sZW5ndGg7IH07CgoJdGhpcy5Gb3JFYWNoQWN0aXZlQ2hhciA9IGZ1bmN0aW9uKGhhbmRsZXIpIHsgLy8gSXRlcmF0ZXMgb3ZlciB2aXNpYmxlIGNoYXJhY3RlcnMgb24gdGhlIGFjdGl2ZSBwYWdlCgkJdmFyIHJvd0NvdW50ID0gcm93SW5kZXggKyAxOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgcm93Q291bnQ7IGkrKykgewoJCQl2YXIgcm93ID0gdGhpcy5DdXJQYWdlKClbaV07CgkJCXZhciBjaGFyQ291bnQgPSAoaSA9PSByb3dJbmRleCkgPyBjaGFySW5kZXgrMSA6IHJvdy5sZW5ndGg7CgkJCS8vIGJpdHN5LmxvZyhjaGFyQ291bnQpOwoKCQkJdmFyIGxlZnRQb3MgPSAwOwoJCQlpZiAodGV4dERpcmVjdGlvbiA9PT0gVGV4dERpcmVjdGlvbi5SaWdodFRvTGVmdCkgewoJCQkJbGVmdFBvcyA9IDI0ICogODsgLy8gaGFjayAtLSBJIHRoaW5rIHRoaXMgaXMgY29ycmVjdD8KCQkJfQoKCQkJZm9yKHZhciBqID0gMDsgaiA8IGNoYXJDb3VudDsgaisrKSB7CgkJCQl2YXIgY2hhciA9IHJvd1tqXTsKCQkJCWlmKGNoYXIpIHsKCQkJCQlpZiAodGV4dERpcmVjdGlvbiA9PT0gVGV4dERpcmVjdGlvbi5SaWdodFRvTGVmdCkgewoJCQkJCQlsZWZ0UG9zIC09IGNoYXIuc3BhY2luZzsKCQkJCQl9CgkJCQkJLy8gYml0c3kubG9nKGogKyAiICIgKyBsZWZ0UG9zKTsKCgkJCQkJLy8gaGFuZGxlciggY2hhciwgaSAvKnJvd0luZGV4Ki8sIGogLypjb2xJbmRleCovICk7CgkJCQkJaGFuZGxlcihjaGFyLCBpIC8qcm93SW5kZXgqLywgaiAvKmNvbEluZGV4Ki8sIGxlZnRQb3MpCgoJCQkJCWlmICh0ZXh0RGlyZWN0aW9uID09PSBUZXh0RGlyZWN0aW9uLkxlZnRUb1JpZ2h0KSB7CgkJCQkJCWxlZnRQb3MgKz0gY2hhci5zcGFjaW5nOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KCgl0aGlzLlJlc2V0ID0gZnVuY3Rpb24oKSB7CgkJYnVmZmVyID0gW1tbXV1dOwoJCXBhZ2VJbmRleCA9IDA7CgkJcm93SW5kZXggPSAwOwoJCWNoYXJJbmRleCA9IDA7CgkJaXNEaWFsb2dSZWFkeVRvQ29udGludWUgPSBmYWxzZTsKCgkJYWZ0ZXJNYW51YWxQYWdlYnJlYWsgPSBmYWxzZTsKCgkJYWN0aXZlVGV4dEVmZmVjdHMgPSBbXTsKCgkJb25EaWFsb2dFbmRDYWxsYmFja3MgPSBbXTsKCgkJaXNBY3RpdmUgPSBmYWxzZTsKCX07CgoJdGhpcy5Eb05leHRDaGFyID0gZnVuY3Rpb24oKSB7CgkJbmV4dENoYXJUaW1lciA9IDA7IC8vcmVzZXQgdGltZXIKCgkJLy90aW1lIHRvIHVwZGF0ZSBjaGFyYWN0ZXJzCgkJaWYgKGNoYXJJbmRleCArIDEgPCB0aGlzLkN1ckNoYXJDb3VudCgpKSB7CgkJCS8vYWRkIGNoYXIgdG8gY3VycmVudCByb3cKCQkJY2hhckluZGV4Kys7CgkJfQoJCWVsc2UgaWYgKHJvd0luZGV4ICsgMSA8IHRoaXMuQ3VyUm93Q291bnQoKSkgewoJCQkvL3N0YXJ0IG5leHQgcm93CgkJCXJvd0luZGV4Kys7CgkJCWNoYXJJbmRleCA9IDA7CgkJfQoJCWVsc2UgewoJCQkvL3RoZSBwYWdlIGlzIGZ1bGwhCgkJCWlzRGlhbG9nUmVhZHlUb0NvbnRpbnVlID0gdHJ1ZTsKCQkJZGlkUGFnZUZpbmlzaFRoaXNGcmFtZSA9IHRydWU7CgkJfQoKCQlpZiAodGhpcy5DdXJDaGFyKCkgIT0gbnVsbCkgewoJCQlpZiAodGhpcy5DdXJDaGFyKCkuaXNQYWdlQnJlYWspIHsKCQkJCS8vIHNwZWNpYWwgY2FzZSBmb3IgcGFnZSBicmVhayBtYXJrZXIgY2hhcmFjdGVyIQoJCQkJaXNEaWFsb2dSZWFkeVRvQ29udGludWUgPSB0cnVlOwoJCQkJZGlkUGFnZUZpbmlzaFRoaXNGcmFtZSA9IHRydWU7CgkJCX0KCQkJCgkJCXRoaXMuQ3VyQ2hhcigpLk9uUHJpbnQoKTsgLy8gbWFrZSBzdXJlIHdlIGhpdCB0aGUgY2FsbGJhY2sgYmVmb3JlIHdlIHJ1biBvdXQgb2YgdGV4dAoJCX0KCX07CgoJdGhpcy5VcGRhdGUgPSBmdW5jdGlvbihkdCkgewoJCWRpZFBhZ2VGaW5pc2hUaGlzRnJhbWUgPSBmYWxzZTsKCQlkaWRGbGlwUGFnZVRoaXNGcmFtZSA9IGZhbHNlOwoJCS8vIHRoaXMuRHJhdyhkdCk7IC8vIFRPRE8gbW92ZSBpbnRvIGEgcmVuZGVyZXIgb2JqZWN0CgkJaWYgKGlzRGlhbG9nUmVhZHlUb0NvbnRpbnVlKSB7CgkJCXJldHVybjsgLy93YWl0aW5nIGZvciBkaWFsb2cgdG8gYmUgYWR2YW5jZWQgYnkgcGxheWVyCgkJfQoKCQluZXh0Q2hhclRpbWVyICs9IGR0OyAvL3RpY2sgdGltZXIKCgkJaWYgKG5leHRDaGFyVGltZXIgPiBuZXh0Q2hhck1heFRpbWUpIHsKCQkJdGhpcy5Eb05leHRDaGFyKCk7CgkJfQoJfTsKCgl2YXIgaXNTa2lwcGluZyA9IGZhbHNlOwoKCXRoaXMuU2tpcCA9IGZ1bmN0aW9uKCkgewoJCWJpdHN5LmxvZygiU0tJUFBQIik7CgkJaXNTa2lwcGluZyA9IHRydWU7CgoJCWRpZFBhZ2VGaW5pc2hUaGlzRnJhbWUgPSBmYWxzZTsKCQlkaWRGbGlwUGFnZVRoaXNGcmFtZSA9IGZhbHNlOwoKCQkvLyBhZGQgbmV3IGNoYXJhY3RlcnMgdW50aWwgeW91IGdldCB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGxpbmUgb2YgZGlhbG9nCgkJd2hpbGUgKHJvd0luZGV4IDwgdGhpcy5DdXJSb3dDb3VudCgpICYmIGlzU2tpcHBpbmcpIHsKCQkJdGhpcy5Eb05leHRDaGFyKCk7CgoJCQlpZiAoaXNEaWFsb2dSZWFkeVRvQ29udGludWUpIHsKCQkJCS8vbWFrZSBzdXJlIHRvIHB1c2ggdGhlIHJvd0luZGV4IHBhc3QgdGhlIGVuZCB0byBicmVhayBvdXQgb2YgdGhlIGxvb3AKCQkJCXJvd0luZGV4Kys7CgkJCQljaGFySW5kZXggPSAwOwoJCQl9CgkJfQoKCQlpZiAoaXNTa2lwcGluZykgewoJCQlyb3dJbmRleCA9IHRoaXMuQ3VyUm93Q291bnQoKSAtIDE7CgkJCWNoYXJJbmRleCA9IHRoaXMuQ3VyQ2hhckNvdW50KCkgLSAxOwoJCX0KCgkJaXNTa2lwcGluZyA9IGZhbHNlOwoJfTsKCgl0aGlzLnRyeUludGVycnVwdFNraXAgPSBmdW5jdGlvbigpIHsKCQlpZiAoaXNTa2lwcGluZykgewoJCQlpc1NraXBwaW5nID0gZmFsc2U7CgkJCXJldHVybiB0cnVlOwoJCX0KCgkJcmV0dXJuIGZhbHNlOwoJfTsKCgl0aGlzLkZsaXBQYWdlID0gZnVuY3Rpb24oKSB7CgkJZGlkRmxpcFBhZ2VUaGlzRnJhbWUgPSB0cnVlOwoJCWlzRGlhbG9nUmVhZHlUb0NvbnRpbnVlID0gZmFsc2U7CgkJcGFnZUluZGV4Kys7CgkJcm93SW5kZXggPSAwOwoJCWNoYXJJbmRleCA9IDA7Cgl9CgoJdGhpcy5FbmREaWFsb2cgPSBmdW5jdGlvbigpIHsKCQlpc0FjdGl2ZSA9IGZhbHNlOyAvLyBubyBtb3JlIHRleHQgdG8gc2hvdy4uLiB0aGlzIHNob3VsZCBiZSBhIHNpZ24gdG8gc3RvcCByZW5kZXJpbmcgZGlhbG9nCgoJCWZvciAodmFyIGkgPSAwOyBpIDwgb25EaWFsb2dFbmRDYWxsYmFja3MubGVuZ3RoOyBpKyspIHsKCQkJb25EaWFsb2dFbmRDYWxsYmFja3NbaV0oKTsKCQl9Cgl9CgoJdmFyIGFmdGVyTWFudWFsUGFnZWJyZWFrID0gZmFsc2U7IC8vIGlzIGl0IGJhZCB0byB0cmFjayB0aGlzIHN0YXRlIGxpa2UgdGhpcz8KCgl0aGlzLkNvbnRpbnVlID0gZnVuY3Rpb24oKSB7CgkJYml0c3kubG9nKCJDT05USU5VRSIpOwoKCQkvLyBpZiB3ZSB1c2VkIGEgcGFnZSBicmVhayBjaGFyYWN0ZXIgdG8gY29udGludWUgd2UgbmVlZAoJCS8vIHRvIHJ1biB3aGF0ZXZlciBpcyBpbiB0aGUgc2NyaXB0IGFmdGVyd2FyZHMhIC8vIFRPRE8gOiBtYWtlIHRoaXMgY29tbWVudCBiZXR0ZXIKCQlpZiAodGhpcy5DdXJDaGFyKCkuaXNQYWdlQnJlYWspIHsKCQkJLy8gaGFja3k6IGFsd2F5cyB0cmVhdCBhIHBhZ2UgYnJlYWsgYXMgdGhlIGVuZCBvZiBkaWFsb2cKCQkJLy8gaWYgdGhlcmUncyBtb3JlIGRpYWxvZyBsYXRlciB3ZSByZS1hY3RpdmF0ZSB0aGUgZGlhbG9nIGJ1ZmZlcgoJCQl0aGlzLkVuZERpYWxvZygpOwoJCQlhZnRlck1hbnVhbFBhZ2VicmVhayA9IHRydWU7CgkJCXRoaXMuQ3VyQ2hhcigpLk9uQ29udGludWUoKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlpZiAocGFnZUluZGV4ICsgMSA8IHRoaXMuQ3VyUGFnZUNvdW50KCkpIHsKCQkJYml0c3kubG9nKCJGTElQIFBBR0UhIik7CgkJCS8vc3RhcnQgbmV4dCBwYWdlCgkJCXRoaXMuRmxpcFBhZ2UoKTsKCQkJcmV0dXJuIHRydWU7IC8qIGhhc01vcmVEaWFsb2cgKi8KCQl9CgkJZWxzZSB7CgkJCWJpdHN5LmxvZygiRU5EIERJQUxPRyEiKTsKCQkJYml0c3kudGV4dGJveChmYWxzZSk7CgkJCS8vZW5kIGRpYWxvZyBtb2RlCgkJCXRoaXMuRW5kRGlhbG9nKCk7CgkJCXJldHVybiBmYWxzZTsgLyogaGFzTW9yZURpYWxvZyAqLwoJCX0KCX07CgoJdmFyIGlzQWN0aXZlID0gZmFsc2U7Cgl0aGlzLklzQWN0aXZlID0gZnVuY3Rpb24oKSB7IHJldHVybiBpc0FjdGl2ZTsgfTsKCgl0aGlzLk9uRGlhbG9nRW5kID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKCQlpZiAoIWlzQWN0aXZlKSB7CgkJCWNhbGxiYWNrKCk7CgkJfQoJCWVsc2UgewoJCQlvbkRpYWxvZ0VuZENhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTsKCQl9Cgl9CgoJdGhpcy5DYW5Db250aW51ZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gaXNEaWFsb2dSZWFkeVRvQ29udGludWU7IH07CgoJZnVuY3Rpb24gRGlhbG9nQ2hhcigpIHsKCQl0aGlzLnJlZHJhdyA9IHRydWU7CgoJCXRoaXMuZWZmZWN0TGlzdCA9IFtdOwoJCXRoaXMuZWZmZWN0UGFyYW1ldGVyTGlzdCA9IFtdOwoKCQl0aGlzLmNvbG9yID0gdGV4dENvbG9ySW5kZXg7IC8vIHdoaXRlCgkJdGhpcy5vZmZzZXQgPSB7IHg6MCwgeTowIH07IC8vIGluIHBpeGVscyAoc2NyZWVuIHBpeGVscz8pCgoJCXRoaXMuY29sID0gMDsKCQl0aGlzLnJvdyA9IDA7CgoJCXRoaXMuU2V0UG9zaXRpb24gPSBmdW5jdGlvbihyb3csY29sKSB7CgkJCS8vIGJpdHN5LmxvZygiU0VUIFBPUyIpOwoJCQkvLyBiaXRzeS5sb2codGhpcyk7CgkJCXRoaXMucm93ID0gcm93OwoJCQl0aGlzLmNvbCA9IGNvbDsKCQl9OwoKCQl0aGlzLkFwcGx5RWZmZWN0cyA9IGZ1bmN0aW9uKHRpbWUpIHsKCQkJLy8gYml0c3kubG9nKCJBUFBMWSBFRkZFQ1RTISAiICsgdGltZSk7CgkJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lZmZlY3RMaXN0Lmxlbmd0aDsgaSsrKSB7CgkJCQl2YXIgZWZmZWN0TmFtZSA9IHRoaXMuZWZmZWN0TGlzdFtpXTsKCQkJCS8vIGJpdHN5LmxvZygiRlggIiArIGVmZmVjdE5hbWUpOwoJCQkJVGV4dEVmZmVjdHNbZWZmZWN0TmFtZV0uZG9FZmZlY3QodGhpcywgdGltZSwgdGhpcy5lZmZlY3RQYXJhbWV0ZXJMaXN0W2ldKTsKCQkJfQoJCX07CgoJCXZhciBwcmludEhhbmRsZXIgPSBudWxsOyAvLyBvcHRpb25hbCBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb25jZSBvbiBwcmludGluZyBjaGFyYWN0ZXIKCQl0aGlzLlNldFByaW50SGFuZGxlciA9IGZ1bmN0aW9uKGhhbmRsZXIpIHsKCQkJcHJpbnRIYW5kbGVyID0gaGFuZGxlcjsKCQl9OwoJCXRoaXMuT25QcmludCA9IGZ1bmN0aW9uKCkgewoJCQlpZiAocHJpbnRIYW5kbGVyICE9IG51bGwpIHsKCQkJCS8vIGJpdHN5LmxvZygiUFJJTlQgSEFORExFUiAtLS0tIERJQUxPRyBCVUZGRVIiKTsKCQkJCXByaW50SGFuZGxlcigpOwoJCQkJcHJpbnRIYW5kbGVyID0gbnVsbDsgLy8gb25seSBjYWxsIGhhbmRsZXIgb25jZSAoaGFja3kpCgkJCX0KCQl9OwoKCQl0aGlzLmJpdG1hcCA9IFtdOwoJCXRoaXMud2lkdGggPSAwOwoJCXRoaXMuaGVpZ2h0ID0gMDsKCQl0aGlzLmJhc2Vfb2Zmc2V0ID0geyAvLyBoYWNreSBuYW1lCiAJCQl4OiAwLAoJCQl5OiAwCgkJfTsKCQl0aGlzLnNwYWNpbmcgPSAwOwoJfQoKCWZ1bmN0aW9uIERpYWxvZ0ZvbnRDaGFyKGZvbnQsIGNoYXIsIGVmZmVjdExpc3QsIGVmZmVjdFBhcmFtZXRlckxpc3QpIHsKCQlEaWFsb2dDaGFyLmNhbGwodGhpcyk7CgoJCXRoaXMuZWZmZWN0TGlzdCA9IGVmZmVjdExpc3Quc2xpY2UoKTsgLy8gY2xvbmUgZWZmZWN0IGxpc3QgKHNpbmNlIGl0IGNhbiBjaGFuZ2UgYmV0d2VlbiBjaGFycykKCQl0aGlzLmVmZmVjdFBhcmFtZXRlckxpc3QgPSBlZmZlY3RQYXJhbWV0ZXJMaXN0LnNsaWNlKCk7CgoJCXZhciBjaGFyRGF0YSA9IGZvbnQuZ2V0Q2hhcihjaGFyKTsKCQl0aGlzLmNoYXIgPSBjaGFyOwoJCXRoaXMuYml0bWFwID0gY2hhckRhdGEuZGF0YTsKCQl0aGlzLndpZHRoID0gY2hhckRhdGEud2lkdGg7CgkJdGhpcy5oZWlnaHQgPSBjaGFyRGF0YS5oZWlnaHQ7CgkJdGhpcy5iYXNlX29mZnNldC54ID0gY2hhckRhdGEub2Zmc2V0Lng7CgkJdGhpcy5iYXNlX29mZnNldC55ID0gY2hhckRhdGEub2Zmc2V0Lnk7CgkJdGhpcy5zcGFjaW5nID0gY2hhckRhdGEuc3BhY2luZzsKCQl0aGlzLmJsaXAgPSBudWxsOwoJCXRoaXMuaGFzUGxheWVkQmxpcCA9IGZhbHNlOwoJfQoKCWZ1bmN0aW9uIERpYWxvZ0RyYXdpbmdDaGFyKGRyYXdpbmdJZCwgZWZmZWN0TGlzdCwgZWZmZWN0UGFyYW1ldGVyTGlzdCkgewoJCURpYWxvZ0NoYXIuY2FsbCh0aGlzKTsKCgkJdGhpcy5lZmZlY3RMaXN0ID0gZWZmZWN0TGlzdC5zbGljZSgpOyAvLyBjbG9uZSBlZmZlY3QgbGlzdCAoc2luY2UgaXQgY2FuIGNoYW5nZSBiZXR3ZWVuIGNoYXJzKQoJCXRoaXMuZWZmZWN0UGFyYW1ldGVyTGlzdCA9IGVmZmVjdFBhcmFtZXRlckxpc3Quc2xpY2UoKTsKCgkJLy8gZ2V0IHRoZSBmaXJzdCBmcmFtZSBvZiB0aGUgZHJhd2luZyBhbmQgZmxhdHRlbiBpdAoJCXZhciBkcmF3aW5nRGF0YSA9IHJlbmRlcmVyLkdldERyYXdpbmdTb3VyY2UoZHJhd2luZ0lkKVswXTsKCQl2YXIgZHJhd2luZ0RhdGFGbGF0ID0gW107CgkJZm9yICh2YXIgaSA9IDA7IGkgPCBkcmF3aW5nRGF0YS5sZW5ndGg7IGkrKykgewoJCQlkcmF3aW5nRGF0YUZsYXQgPSBkcmF3aW5nRGF0YUZsYXQuY29uY2F0KGRyYXdpbmdEYXRhW2ldKTsKCQl9CgoJCXRoaXMuYml0bWFwID0gZHJhd2luZ0RhdGFGbGF0OwoJCXRoaXMud2lkdGggPSA4OwoJCXRoaXMuaGVpZ2h0ID0gODsKCQl0aGlzLnNwYWNpbmcgPSA4OwoJfQoKCWZ1bmN0aW9uIERpYWxvZ1NjcmlwdENvbnRyb2xDaGFyKCkgewoJCURpYWxvZ0NoYXIuY2FsbCh0aGlzKTsKCgkJdGhpcy53aWR0aCA9IDA7CgkJdGhpcy5oZWlnaHQgPSAwOwoJCXRoaXMuc3BhY2luZyA9IDA7Cgl9CgoJLy8gaXMgYSBjb250cm9sIGNoYXJhY3RlciByZWFsbHkgdGhlIGJlc3Qgd2F5IHRvIGhhbmRsZSBwYWdlIGJyZWFrcz8KCWZ1bmN0aW9uIERpYWxvZ1BhZ2VCcmVha0NoYXIoKSB7CgkJRGlhbG9nQ2hhci5jYWxsKHRoaXMpOwoKCQl0aGlzLndpZHRoID0gMDsKCQl0aGlzLmhlaWdodCA9IDA7CgkJdGhpcy5zcGFjaW5nID0gMDsKCgkJdGhpcy5pc1BhZ2VCcmVhayA9IHRydWU7CgoJCXZhciBjb250aW51ZUhhbmRsZXIgPSBudWxsOwoKCQl0aGlzLlNldENvbnRpbnVlSGFuZGxlciA9IGZ1bmN0aW9uKGhhbmRsZXIpIHsKCQkJY29udGludWVIYW5kbGVyID0gaGFuZGxlcjsKCQl9OwoKCQl0aGlzLk9uQ29udGludWUgPSBmdW5jdGlvbigpIHsKCQkJaWYgKGNvbnRpbnVlSGFuZGxlcikgewoJCQkJY29udGludWVIYW5kbGVyKCk7CgkJCX0KCQl9OwoJfQoKCWZ1bmN0aW9uIEFkZFdvcmRUb0NoYXJBcnJheShjaGFyQXJyYXksIHdvcmQsIGVmZmVjdExpc3QsIGVmZmVjdFBhcmFtZXRlckxpc3QpIHsKCQkvLyBiaXRzeS5sb2coImFkZCBjaGFyIGFycmF5Iik7CgkJZm9yICh2YXIgaSA9IDA7IGkgPCB3b3JkLmxlbmd0aDsgaSsrKSB7CgkJCWNoYXJBcnJheS5wdXNoKG5ldyBEaWFsb2dGb250Q2hhcihmb250LCB3b3JkW2ldLCBlZmZlY3RMaXN0LCBlZmZlY3RQYXJhbWV0ZXJMaXN0KSk7CgkJfQoJCS8vIGJpdHN5LmxvZygiYWRkIGNoYXIgYXJyYXkgZW5kIik7CgkJcmV0dXJuIGNoYXJBcnJheTsKCX0KCglmdW5jdGlvbiBHZXRDaGFyQXJyYXlXaWR0aChjaGFyQXJyYXkpIHsKCQl2YXIgd2lkdGggPSAwOwoJCWZvcih2YXIgaSA9IDA7IGkgPCBjaGFyQXJyYXkubGVuZ3RoOyBpKyspIHsKCQkJd2lkdGggKz0gY2hhckFycmF5W2ldLnNwYWNpbmc7CgkJfQoJCXJldHVybiB3aWR0aDsKCX0KCglmdW5jdGlvbiBHZXRTdHJpbmdXaWR0aChzdHIpIHsKCQl2YXIgd2lkdGggPSAwOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7CgkJCXZhciBjaGFyRGF0YSA9IGZvbnQuZ2V0Q2hhcihzdHJbaV0pOwoJCQl3aWR0aCArPSBjaGFyRGF0YS5zcGFjaW5nOwoJCX0KCQlyZXR1cm4gd2lkdGg7Cgl9CgoJdmFyIHBpeGVsc1BlclJvdyA9IDE5MjsgLy8gaGFyZC1jb2RlZCBmdW4gdGltZXMhISEKCgl0aGlzLkFkZFNjcmlwdFJldHVybiA9IGZ1bmN0aW9uKG9uUmV0dXJuSGFuZGxlcikgewoJCXZhciBjdXJQYWdlSW5kZXggPSBidWZmZXIubGVuZ3RoIC0gMTsKCQl2YXIgY3VyUm93SW5kZXggPSBidWZmZXJbY3VyUGFnZUluZGV4XS5sZW5ndGggLSAxOwoJCXZhciBjdXJSb3dBcnIgPSBidWZmZXJbY3VyUGFnZUluZGV4XVtjdXJSb3dJbmRleF07CgoJCXZhciBjb250cm9sQ2hhciA9IG5ldyBEaWFsb2dTY3JpcHRDb250cm9sQ2hhcigpOwoJCWNvbnRyb2xDaGFyLlNldFByaW50SGFuZGxlcihvblJldHVybkhhbmRsZXIpOwoKCQljdXJSb3dBcnIucHVzaChjb250cm9sQ2hhcik7CgoJCWlzQWN0aXZlID0gdHJ1ZTsKCX0KCgl0aGlzLkFkZERyYXdpbmcgPSBmdW5jdGlvbihkcmF3aW5nSWQpIHsKCQkvLyBiaXRzeS5sb2coIkRSQVdJTkcgSUQgIiArIGRyYXdpbmdJZCk7CgoJCXZhciBjdXJQYWdlSW5kZXggPSBidWZmZXIubGVuZ3RoIC0gMTsKCQl2YXIgY3VyUm93SW5kZXggPSBidWZmZXJbY3VyUGFnZUluZGV4XS5sZW5ndGggLSAxOwoJCXZhciBjdXJSb3dBcnIgPSBidWZmZXJbY3VyUGFnZUluZGV4XVtjdXJSb3dJbmRleF07CgoJCXZhciBkcmF3aW5nQ2hhciA9IG5ldyBEaWFsb2dEcmF3aW5nQ2hhcihkcmF3aW5nSWQsIGFjdGl2ZVRleHRFZmZlY3RzLCBhY3RpdmVUZXh0RWZmZWN0UGFyYW1ldGVycyk7CgoJCXZhciByb3dMZW5ndGggPSBHZXRDaGFyQXJyYXlXaWR0aChjdXJSb3dBcnIpOwoKCQkvLyBUT0RPIDogY2xlYW4gdXAgY29weS1wYXN0ZWQgY29kZSBoZXJlIDovCgkJaWYgKGFmdGVyTWFudWFsUGFnZWJyZWFrKSB7CgkJCXRoaXMuRmxpcFBhZ2UoKTsgLy8gaGFja3kKCgkJCWJ1ZmZlcltjdXJQYWdlSW5kZXhdW2N1clJvd0luZGV4XSA9IGN1clJvd0FycjsKCQkJYnVmZmVyLnB1c2goW10pOwoJCQljdXJQYWdlSW5kZXgrKzsKCQkJYnVmZmVyW2N1clBhZ2VJbmRleF0ucHVzaChbXSk7CgkJCWN1clJvd0luZGV4ID0gMDsKCQkJY3VyUm93QXJyID0gYnVmZmVyW2N1clBhZ2VJbmRleF1bY3VyUm93SW5kZXhdOwoJCQljdXJSb3dBcnIucHVzaChkcmF3aW5nQ2hhcik7CgoJCQlhZnRlck1hbnVhbFBhZ2VicmVhayA9IGZhbHNlOwoJCX0KCQllbHNlIGlmIChyb3dMZW5ndGggKyBkcmF3aW5nQ2hhci5zcGFjaW5nICA8PSBwaXhlbHNQZXJSb3cgfHwgcm93TGVuZ3RoIDw9IDApIHsKCQkJLy9zdGF5IG9uIHNhbWUgcm93CgkJCWN1clJvd0Fyci5wdXNoKGRyYXdpbmdDaGFyKTsKCQl9CgkJZWxzZSBpZiAoY3VyUm93SW5kZXggPT0gMCkgewoJCQkvL3N0YXJ0IG5leHQgcm93CgkJCWJ1ZmZlcltjdXJQYWdlSW5kZXhdW2N1clJvd0luZGV4XSA9IGN1clJvd0FycjsKCQkJYnVmZmVyW2N1clBhZ2VJbmRleF0ucHVzaChbXSk7CgkJCWN1clJvd0luZGV4Kys7CgkJCWN1clJvd0FyciA9IGJ1ZmZlcltjdXJQYWdlSW5kZXhdW2N1clJvd0luZGV4XTsKCQkJY3VyUm93QXJyLnB1c2goZHJhd2luZ0NoYXIpOwoJCX0KCQllbHNlIHsKCQkJLy9zdGFydCBuZXh0IHBhZ2UKCQkJYnVmZmVyW2N1clBhZ2VJbmRleF1bY3VyUm93SW5kZXhdID0gY3VyUm93QXJyOwoJCQlidWZmZXIucHVzaChbXSk7CgkJCWN1clBhZ2VJbmRleCsrOwoJCQlidWZmZXJbY3VyUGFnZUluZGV4XS5wdXNoKFtdKTsKCQkJY3VyUm93SW5kZXggPSAwOwoJCQljdXJSb3dBcnIgPSBidWZmZXJbY3VyUGFnZUluZGV4XVtjdXJSb3dJbmRleF07CgkJCWN1clJvd0Fyci5wdXNoKGRyYXdpbmdDaGFyKTsKCQl9CgoJCWlzQWN0aXZlID0gdHJ1ZTsgLy8gdGhpcyBmZWVscyBsaWtlIGEgYmFkIHdheSB0byBkbyB0aGlzPz8/Cgl9CgoJLy8gVE9ETyA6IGNvbnZlcnQgdGhpcyBpbnRvIHNvbWV0aGluZyB0aGF0IHRha2VzIERpYWxvZ0NoYXIgYXJyYXlzCgl0aGlzLkFkZFRleHQgPSBmdW5jdGlvbih0ZXh0U3RyKSB7CgkJYml0c3kubG9nKCJBREQgVEVYVCA+PiIgKyB0ZXh0U3RyICsgIjw8Iik7CgoJCS8vcHJvY2VzcyBkaWFsb2cgc28gaXQncyBlYXNpZXIgdG8gZGlzcGxheQoJCXZhciB3b3JkcyA9IHRleHRTdHIuc3BsaXQoIiAiKTsKCgkJLy8gdmFyIGN1clBhZ2VJbmRleCA9IHRoaXMuQ3VyUGFnZUNvdW50KCkgLSAxOwoJCS8vIHZhciBjdXJSb3dJbmRleCA9IHRoaXMuQ3VyUm93Q291bnQoKSAtIDE7CgkJLy8gdmFyIGN1clJvd0FyciA9IHRoaXMuQ3VyUm93KCk7CgoJCXZhciBjdXJQYWdlSW5kZXggPSBidWZmZXIubGVuZ3RoIC0gMTsKCQl2YXIgY3VyUm93SW5kZXggPSBidWZmZXJbY3VyUGFnZUluZGV4XS5sZW5ndGggLSAxOwoJCXZhciBjdXJSb3dBcnIgPSBidWZmZXJbY3VyUGFnZUluZGV4XVtjdXJSb3dJbmRleF07CgoJCWZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyBpKyspIHsKCQkJdmFyIHdvcmQgPSB3b3Jkc1tpXTsKCQkJaWYgKGFyYWJpY0hhbmRsZXIuQ29udGFpbnNBcmFiaWNDaGFyYWN0ZXJzKHdvcmQpKSB7CgkJCQl3b3JkID0gYXJhYmljSGFuZGxlci5TaGFwZUFyYWJpY0NoYXJhY3RlcnMod29yZCk7CgkJCX0KCgkJCXZhciB3b3JkV2l0aFByZWNlZGluZ1NwYWNlID0gKChpID09IDApID8gIiIgOiAiICIpICsgd29yZDsKCQkJdmFyIHdvcmRMZW5ndGggPSBHZXRTdHJpbmdXaWR0aCh3b3JkV2l0aFByZWNlZGluZ1NwYWNlKTsKCgkJCXZhciByb3dMZW5ndGggPSBHZXRDaGFyQXJyYXlXaWR0aChjdXJSb3dBcnIpOwoKCQkJaWYgKGFmdGVyTWFudWFsUGFnZWJyZWFrKSB7CgkJCQl0aGlzLkZsaXBQYWdlKCk7CgoJCQkJLy8gaGFja3kgY29waWVkIGJpdCBmb3IgcGFnZSBicmVha3MKCQkJCWJ1ZmZlcltjdXJQYWdlSW5kZXhdW2N1clJvd0luZGV4XSA9IGN1clJvd0FycjsKCQkJCWJ1ZmZlci5wdXNoKFtdKTsKCQkJCWN1clBhZ2VJbmRleCsrOwoJCQkJYnVmZmVyW2N1clBhZ2VJbmRleF0ucHVzaChbXSk7CgkJCQljdXJSb3dJbmRleCA9IDA7CgkJCQljdXJSb3dBcnIgPSBidWZmZXJbY3VyUGFnZUluZGV4XVtjdXJSb3dJbmRleF07CgkJCQljdXJSb3dBcnIgPSBBZGRXb3JkVG9DaGFyQXJyYXkoY3VyUm93QXJyLCB3b3JkLCBhY3RpdmVUZXh0RWZmZWN0cywgYWN0aXZlVGV4dEVmZmVjdFBhcmFtZXRlcnMpOwoKCQkJCWFmdGVyTWFudWFsUGFnZWJyZWFrID0gZmFsc2U7CgkJCX0KCQkJZWxzZSBpZiAocm93TGVuZ3RoICsgd29yZExlbmd0aCA8PSBwaXhlbHNQZXJSb3cgfHwgcm93TGVuZ3RoIDw9IDApIHsKCQkJCS8vc3RheSBvbiBzYW1lIHJvdwoJCQkJY3VyUm93QXJyID0gQWRkV29yZFRvQ2hhckFycmF5KGN1clJvd0Fyciwgd29yZFdpdGhQcmVjZWRpbmdTcGFjZSwgYWN0aXZlVGV4dEVmZmVjdHMsIGFjdGl2ZVRleHRFZmZlY3RQYXJhbWV0ZXJzKTsKCQkJfQoJCQllbHNlIGlmIChjdXJSb3dJbmRleCA9PSAwKSB7CgkJCQkvL3N0YXJ0IG5leHQgcm93CgkJCQlidWZmZXJbY3VyUGFnZUluZGV4XVtjdXJSb3dJbmRleF0gPSBjdXJSb3dBcnI7CgkJCQlidWZmZXJbY3VyUGFnZUluZGV4XS5wdXNoKFtdKTsKCQkJCWN1clJvd0luZGV4Kys7CgkJCQljdXJSb3dBcnIgPSBidWZmZXJbY3VyUGFnZUluZGV4XVtjdXJSb3dJbmRleF07CgkJCQljdXJSb3dBcnIgPSBBZGRXb3JkVG9DaGFyQXJyYXkoY3VyUm93QXJyLCB3b3JkLCBhY3RpdmVUZXh0RWZmZWN0cywgYWN0aXZlVGV4dEVmZmVjdFBhcmFtZXRlcnMpOwoJCQl9CgkJCWVsc2UgewoJCQkJLy9zdGFydCBuZXh0IHBhZ2UKCQkJCWJ1ZmZlcltjdXJQYWdlSW5kZXhdW2N1clJvd0luZGV4XSA9IGN1clJvd0FycjsKCQkJCWJ1ZmZlci5wdXNoKFtdKTsKCQkJCWN1clBhZ2VJbmRleCsrOwoJCQkJYnVmZmVyW2N1clBhZ2VJbmRleF0ucHVzaChbXSk7CgkJCQljdXJSb3dJbmRleCA9IDA7CgkJCQljdXJSb3dBcnIgPSBidWZmZXJbY3VyUGFnZUluZGV4XVtjdXJSb3dJbmRleF07CgkJCQljdXJSb3dBcnIgPSBBZGRXb3JkVG9DaGFyQXJyYXkoY3VyUm93QXJyLCB3b3JkLCBhY3RpdmVUZXh0RWZmZWN0cywgYWN0aXZlVGV4dEVmZmVjdFBhcmFtZXRlcnMpOwoJCQl9CgkJfQoKCQkvL2Rlc3Ryb3kgYW55IGVtcHR5IHN0dWZmCgkJdmFyIGxhc3RQYWdlID0gYnVmZmVyW2J1ZmZlci5sZW5ndGgtMV07CgkJdmFyIGxhc3RSb3cgPSBsYXN0UGFnZVtsYXN0UGFnZS5sZW5ndGgtMV07CgkJaWYgKGxhc3RSb3cubGVuZ3RoID09IDApIHsKCQkJbGFzdFBhZ2Uuc3BsaWNlKGxhc3RQYWdlLmxlbmd0aC0xLCAxKTsKCQl9CgkJaWYgKGxhc3RQYWdlLmxlbmd0aCA9PSAwKSB7CgkJCWJ1ZmZlci5zcGxpY2UoYnVmZmVyLmxlbmd0aC0xLCAxKTsKCQl9CgoJCS8vZmluaXNoIHVwIAoJCWxhc3RQYWdlID0gYnVmZmVyW2J1ZmZlci5sZW5ndGgtMV07CgkJbGFzdFJvdyA9IGxhc3RQYWdlW2xhc3RQYWdlLmxlbmd0aC0xXTsKCQlpZiAobGFzdFJvdy5sZW5ndGggPiAwKSB7CgkJCXZhciBsYXN0Q2hhciA9IGxhc3RSb3dbbGFzdFJvdy5sZW5ndGgtMV07CgkJfQoKCQkvLyBiaXRzeS5sb2coYnVmZmVyKTsKCgkJYml0c3kubG9nKCJhZGQgdGV4dCBmaW5pc2hlZCIpOwoKCQlpc0FjdGl2ZSA9IHRydWU7Cgl9OwoKCXRoaXMuQWRkTGluZWJyZWFrID0gZnVuY3Rpb24oKSB7CgkJdmFyIGxhc3RQYWdlID0gYnVmZmVyW2J1ZmZlci5sZW5ndGgtMV07CgkJaWYgKGxhc3RQYWdlLmxlbmd0aCA8PSAxKSB7CgkJCS8vIGJpdHN5LmxvZygiTElORUJSRUFLIC0gTkVXIFJPVyAiKTsKCQkJLy8gYWRkIG5ldyByb3cKCQkJbGFzdFBhZ2UucHVzaChbXSk7CgkJfQoJCWVsc2UgewoJCQkvLyBhZGQgbmV3IHBhZ2UKCQkJYnVmZmVyLnB1c2goW1tdXSk7CgkJfQoJCS8vIGJpdHN5LmxvZyhidWZmZXIpOwoKCQlpc0FjdGl2ZSA9IHRydWU7Cgl9CgoJdGhpcy5BZGRQYWdlYnJlYWsgPSBmdW5jdGlvbihvblJldHVybkhhbmRsZXIpIHsKCQl2YXIgY3VyUGFnZUluZGV4ID0gYnVmZmVyLmxlbmd0aCAtIDE7CgkJdmFyIGN1clJvd0luZGV4ID0gYnVmZmVyW2N1clBhZ2VJbmRleF0ubGVuZ3RoIC0gMTsKCQl2YXIgY3VyUm93QXJyID0gYnVmZmVyW2N1clBhZ2VJbmRleF1bY3VyUm93SW5kZXhdOwoKCQkvLyBuZWVkIHRvIGFjdHVhbGx5IGNyZWF0ZSBhIHdob2xlIG5ldyBwYWdlIGlmIGZvbGxvd2luZyBhbm90aGVyIHBhZ2VicmVhayBjaGFyYWN0ZXIKCQlpZiAoYWZ0ZXJNYW51YWxQYWdlYnJlYWspIHsKCQkJdGhpcy5GbGlwUGFnZSgpOyAvLyBoYWNreQoKCQkJYnVmZmVyW2N1clBhZ2VJbmRleF1bY3VyUm93SW5kZXhdID0gY3VyUm93QXJyOwoJCQlidWZmZXIucHVzaChbXSk7CgkJCWN1clBhZ2VJbmRleCsrOwoJCQlidWZmZXJbY3VyUGFnZUluZGV4XS5wdXNoKFtdKTsKCQkJY3VyUm93SW5kZXggPSAwOwoJCQljdXJSb3dBcnIgPSBidWZmZXJbY3VyUGFnZUluZGV4XVtjdXJSb3dJbmRleF07CgoJCQlhZnRlck1hbnVhbFBhZ2VicmVhayA9IGZhbHNlOwoJCX0KCgkJdmFyIHBhZ2VicmVha0NoYXIgPSBuZXcgRGlhbG9nUGFnZUJyZWFrQ2hhcigpOwoJCXBhZ2VicmVha0NoYXIuU2V0Q29udGludWVIYW5kbGVyKG9uUmV0dXJuSGFuZGxlcik7CgoJCWN1clJvd0Fyci5wdXNoKHBhZ2VicmVha0NoYXIpOwoKCQlpc0FjdGl2ZSA9IHRydWU7Cgl9CgoJdGhpcy5oYXNUZXh0RWZmZWN0ID0gZnVuY3Rpb24obmFtZSkgewoJCXJldHVybiBhY3RpdmVUZXh0RWZmZWN0cy5pbmRleE9mKG5hbWUpICE9IC0xOwoJfTsKCgl0aGlzLnB1c2hUZXh0RWZmZWN0ID0gZnVuY3Rpb24obmFtZSwgcGFyYW1ldGVycykgewoJCWFjdGl2ZVRleHRFZmZlY3RzLnB1c2gobmFtZSk7CgkJYWN0aXZlVGV4dEVmZmVjdFBhcmFtZXRlcnMucHVzaChwYXJhbWV0ZXJzKTsKCX07CgoJdGhpcy5wb3BUZXh0RWZmZWN0ID0gZnVuY3Rpb24obmFtZSkgewoJCXZhciBpID0gYWN0aXZlVGV4dEVmZmVjdHMubGFzdEluZGV4T2YobmFtZSk7CgkJYWN0aXZlVGV4dEVmZmVjdHMuc3BsaWNlKGksIDEpOwoJCWFjdGl2ZVRleHRFZmZlY3RQYXJhbWV0ZXJzLnNwbGljZShpLCAxKTsKCX07CgoJLyogdGhpcyBpcyBhIGhvb2sgZm9yIEdJRiByZW5kZXJpbmcgKi8KCXZhciBkaWRQYWdlRmluaXNoVGhpc0ZyYW1lID0gZmFsc2U7Cgl0aGlzLkRpZFBhZ2VGaW5pc2hUaGlzRnJhbWUgPSBmdW5jdGlvbigpeyByZXR1cm4gZGlkUGFnZUZpbmlzaFRoaXNGcmFtZTsgfTsKCgl2YXIgZGlkRmxpcFBhZ2VUaGlzRnJhbWUgPSBmYWxzZTsKCXRoaXMuRGlkRmxpcFBhZ2VUaGlzRnJhbWUgPSBmdW5jdGlvbigpeyByZXR1cm4gZGlkRmxpcFBhZ2VUaGlzRnJhbWU7IH07CgoJLy8gdGhpcy5TZXRDaGFyc1BlclJvdyA9IGZ1bmN0aW9uKG51bSl7IGNoYXJzUGVyUm93ID0gbnVtOyB9OyAvLyBoYWNreQp9OwoKLyogQVJBQklDICovCnZhciBBcmFiaWNIYW5kbGVyID0gZnVuY3Rpb24oKSB7CgoJdmFyIGFyYWJpY0NoYXJTdGFydCA9IDB4MDYyMTsKCXZhciBhcmFiaWNDaGFyRW5kID0gMHgwNjRFOwoKCXZhciBDaGFyYWN0ZXJGb3JtID0gewoJCUlzb2xhdGVkIDogMCwKCQlGaW5hbCA6IDEsCgkJSW5pdGlhbCA6IDIsCgkJTWlkZGxlIDogMwoJfTsKCgkvLyBtYXAgZ2x5cGhzIHRvIHRoZWlyIGNoYXJhY3RlciBmb3JtcwoJdmFyIGdseXBoRm9ybXMgPSB7CgkJLyoJCSBJc29sYXRlZCwgRmluYWwsIEluaXRpYWwsIE1pZGRsZSBGb3JtcwkqLwoJCTB4MDYyMTogWzB4RkU4MCwweEZFODAsMHhGRTgwLDB4RkU4MF0sIC8qICBIQU1aQSAgKi8gCgkJMHgwNjIyOiBbMHhGRTgxLDB4RkU4MiwweEZFODEsMHhGRTgyXSwgLyogIEFMRUYgV0lUSCBNQUREQSBBQk9WRSAgKi8gCgkJMHgwNjIzOiBbMHhGRTgzLDB4RkU4NCwweEZFODMsMHhGRTg0XSwgLyogIEFMRUYgV0lUSCBIQU1aQSBBQk9WRSAgKi8gCgkJMHgwNjI0OiBbMHhGRTg1LDB4RkU4NiwweEZFODUsMHhGRTg2XSwgLyogIFdBVyBXSVRIIEhBTVpBIEFCT1ZFICAqLyAKCQkweDA2MjU6IFsweEZFODcsMHhGRTg4LDB4RkU4NywweEZFODhdLCAvKiAgQUxFRiBXSVRIIEhBTVpBIEJFTE9XICAqLyAKCQkweDA2MjY6IFsweEZFODksMHhGRThBLDB4RkU4QiwweEZFOENdLCAvKiAgWUVIIFdJVEggSEFNWkEgQUJPVkUgICovIAoJCTB4MDYyNzogWzB4RkU4RCwweEZFOEUsMHhGRThELDB4RkU4RV0sIC8qICBBTEVGICAqLyAKCQkweDA2Mjg6IFsweEZFOEYsMHhGRTkwLDB4RkU5MSwweEZFOTJdLCAvKiAgQkVIICAqLyAKCQkweDA2Mjk6IFsweEZFOTMsMHhGRTk0LDB4RkU5MywweEZFOTRdLCAvKiAgVEVIIE1BUkJVVEEgICovIAoJCTB4MDYyQTogWzB4RkU5NSwweEZFOTYsMHhGRTk3LDB4RkU5OF0sIC8qICBURUggICovIAoJCTB4MDYyQjogWzB4RkU5OSwweEZFOUEsMHhGRTlCLDB4RkU5Q10sIC8qICBUSEVIICAqLyAKCQkweDA2MkM6IFsweEZFOUQsMHhGRTlFLDB4RkU5RiwweEZFQTBdLCAvKiAgSkVFTSAgKi8gCgkJMHgwNjJEOiBbMHhGRUExLDB4RkVBMiwweEZFQTMsMHhGRUE0XSwgLyogIEhBSCAgKi8gCgkJMHgwNjJFOiBbMHhGRUE1LDB4RkVBNiwweEZFQTcsMHhGRUE4XSwgLyogIEtIQUggICovIAoJCTB4MDYyRjogWzB4RkVBOSwweEZFQUEsMHhGRUE5LDB4RkVBQV0sIC8qICBEQUwgICovIAoJCTB4MDYzMDogWzB4RkVBQiwweEZFQUMsMHhGRUFCLDB4RkVBQ10sIC8qICBUSEFMICovIAoJCTB4MDYzMTogWzB4RkVBRCwweEZFQUUsMHhGRUFELDB4RkVBRV0sIC8qICBSQUEgICovIAoJCTB4MDYzMjogWzB4RkVBRiwweEZFQjAsMHhGRUFGLDB4RkVCMF0sIC8qICBaQUlOICAqLyAKCQkweDA2MzM6IFsweEZFQjEsMHhGRUIyLDB4RkVCMywweEZFQjRdLCAvKiAgU0VFTiAgKi8gCgkJMHgwNjM0OiBbMHhGRUI1LDB4RkVCNiwweEZFQjcsMHhGRUI4XSwgLyogIFNIRUVOICAqLyAKCQkweDA2MzU6IFsweEZFQjksMHhGRUJBLDB4RkVCQiwweEZFQkNdLCAvKiAgU0FEICAqLyAKCQkweDA2MzY6IFsweEZFQkQsMHhGRUJFLDB4RkVCRiwweEZFQzBdLCAvKiAgREFEICAqLyAKCQkweDA2Mzc6IFsweEZFQzEsMHhGRUMyLDB4RkVDMywweEZFQzRdLCAvKiAgVEFIICAqLyAKCQkweDA2Mzg6IFsweEZFQzUsMHhGRUM2LDB4RkVDNywweEZFQzhdLCAvKiAgWkFIICAqLyAKCQkweDA2Mzk6IFsweEZFQzksMHhGRUNBLDB4RkVDQiwweEZFQ0NdLCAvKiAgQUlOICAqLyAKCQkweDA2M0E6IFsweEZFQ0QsMHhGRUNFLDB4RkVDRiwweEZFRDBdLCAvKiAgR0hBSU4gICovIAoJCTB4MDYzQjogWzB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMF0sIC8qICBzcGFjZSAqLwoJCTB4MDYzQzogWzB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMF0sIC8qICBzcGFjZSAqLwoJCTB4MDYzRDogWzB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMF0sIC8qICBzcGFjZSAqLwoJCTB4MDYzRTogWzB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMF0sIC8qICBzcGFjZSAqLwoJCTB4MDYzRjogWzB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMF0sIC8qICBzcGFjZSAqLwoJCTB4MDY0MDogWzB4MDY0MCwweDA2NDAsMHgwNjQwLDB4MDY0MF0sIC8qICBUQVRXRUVMICAqLyAKCQkweDA2NDE6IFsweEZFRDEsMHhGRUQyLDB4RkVEMywweEZFRDRdLCAvKiAgRkFBICAqLyAKCQkweDA2NDI6IFsweEZFRDUsMHhGRUQ2LDB4RkVENywweEZFRDhdLCAvKiAgUUFGICAqLyAKCQkweDA2NDM6IFsweEZFRDksMHhGRURBLDB4RkVEQiwweEZFRENdLCAvKiAgS0FGICAqLyAKCQkweDA2NDQ6IFsweEZFREQsMHhGRURFLDB4RkVERiwweEZFRTBdLCAvKiAgTEFNICAqLyAKCQkweDA2NDU6IFsweEZFRTEsMHhGRUUyLDB4RkVFMywweEZFRTRdLCAvKiAgTUVFTSAgKi8gCgkJMHgwNjQ2OiBbMHhGRUU1LDB4RkVFNiwweEZFRTcsMHhGRUU4XSwgLyogIE5PT04gICovIAoJCTB4MDY0NzogWzB4RkVFOSwweEZFRUEsMHhGRUVCLDB4RkVFQ10sIC8qICBIRUggICovIAoJCTB4MDY0ODogWzB4RkVFRCwweEZFRUUsMHhGRUVELDB4RkVFRV0sIC8qICBXQVcgICovIAoJCTB4MDY0OTogWzB4RkVFRiwweEZFRjAsMHhGQkU4LDB4RkJFOV0sIC8qICBBTEVGIE1BS1NVUkEgICovIAoJCTB4MDY0QTogWzB4RkVGMSwweEZFRjIsMHhGRUYzLDB4RkVGNF0sIC8qICBZRUggICovIAoJCTB4MDY0QjogWzB4RkVGNSwweEZFRjYsMHhGRUY1LDB4RkVGNl0sIC8qICBMQU0gQUxFRiBNQUREKi8KCQkweDA2NEM6IFsweEZFRjcsMHhGRUY4LDB4RkVGNywweEZFRjhdLCAvKiAgTEFNIEFMRUYgSEFNWkEgQUJPVkUqLwoJCTB4MDY0RDogWzB4RkVGOSwweEZFRmEsMHhGRUY5LDB4RkVGYV0sIC8qICBMQU0gQUxFRiBIQU1aQSBCRUxPVyovCgkJMHgwNjRFOiBbMHhGRUZiLDB4RkVGYywweEZFRmIsMHhGRUZjXSwgLyogIExBTSBBTEVGICovCgl9OwoKCXZhciBkaXNjb25uZWN0ZWRDaGFyYWN0ZXJzID0gWzB4MDYyMSwweDA2MjIsMHgwNjIzLDB4MDYyNCwweDA2MjUsMHgwNjI3LDB4MDYyZiwweDA2MzAsMHgwNjMxLDB4MDYzMiwweDA2NDgsMHgwNjQ5LDB4MDY0YiwweDA2NGMsMHgwNjRkLDB4MDY0ZV07CgoJZnVuY3Rpb24gSXNBcmFiaWNDaGFyYWN0ZXIoY2hhcikgewoJCXZhciBjb2RlID0gY2hhci5jaGFyQ29kZUF0KDApOwoJCXJldHVybiAoY29kZSA+PSBhcmFiaWNDaGFyU3RhcnQgJiYgY29kZSA8PSBhcmFiaWNDaGFyRW5kKTsKCX0KCglmdW5jdGlvbiBDb250YWluc0FyYWJpY0NoYXJhY3RlcnMod29yZCkgewoJCWZvciAodmFyIGkgPSAwOyBpIDwgd29yZC5sZW5ndGg7IGkrKykgewoJCQlpZiAoSXNBcmFiaWNDaGFyYWN0ZXIod29yZFtpXSkpIHsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCglmdW5jdGlvbiBJc0Rpc2Nvbm5lY3RlZENoYXJhY3RlcihjaGFyKSB7CgkJdmFyIGNvZGUgPSBjaGFyLmNoYXJDb2RlQXQoMCk7CgkJcmV0dXJuIGRpc2Nvbm5lY3RlZENoYXJhY3RlcnMuaW5kZXhPZihjb2RlKSAhPSAtMTsKCX0KCglmdW5jdGlvbiBTaGFwZUFyYWJpY0NoYXJhY3RlcnMod29yZCkgewoJCXZhciBzaGFwZWRXb3JkID0gIiI7CgoJCWZvciAodmFyIGkgPSAwOyBpIDwgd29yZC5sZW5ndGg7IGkrKykgewoJCQlpZiAoIUlzQXJhYmljQ2hhcmFjdGVyKHdvcmRbaV0pKSB7CgkJCQlzaGFwZWRXb3JkICs9IHdvcmRbaV07CgkJCQljb250aW51ZTsKCQkJfQoKCQkJdmFyIGNvbm5lY3RlZFRvUHJldmlvdXNDaGFyID0gaS0xID49IDAgJiYgSXNBcmFiaWNDaGFyYWN0ZXIod29yZFtpLTFdKSAmJiAhSXNEaXNjb25uZWN0ZWRDaGFyYWN0ZXIod29yZFtpLTFdKTsKCgkJCXZhciBjb25uZWN0ZWRUb05leHRDaGFyID0gaSsxIDwgd29yZC5sZW5ndGggJiYgSXNBcmFiaWNDaGFyYWN0ZXIod29yZFtpKzFdKSAmJiAhSXNEaXNjb25uZWN0ZWRDaGFyYWN0ZXIod29yZFtpXSk7CgoJCQl2YXIgZm9ybTsKCQkJaWYgKCFjb25uZWN0ZWRUb1ByZXZpb3VzQ2hhciAmJiAhY29ubmVjdGVkVG9OZXh0Q2hhcikgewoJCQkJZm9ybSA9IENoYXJhY3RlckZvcm0uSXNvbGF0ZWQ7CgkJCX0KCQkJZWxzZSBpZiAoY29ubmVjdGVkVG9QcmV2aW91c0NoYXIgJiYgIWNvbm5lY3RlZFRvTmV4dENoYXIpIHsKCQkJCWZvcm0gPSBDaGFyYWN0ZXJGb3JtLkZpbmFsOwoJCQl9CgkJCWVsc2UgaWYgKCFjb25uZWN0ZWRUb1ByZXZpb3VzQ2hhciAmJiBjb25uZWN0ZWRUb05leHRDaGFyKSB7CgkJCQlmb3JtID0gQ2hhcmFjdGVyRm9ybS5Jbml0aWFsOwoJCQl9CgkJCWVsc2UgaWYgKGNvbm5lY3RlZFRvUHJldmlvdXNDaGFyICYmIGNvbm5lY3RlZFRvTmV4dENoYXIpIHsKCQkJCWZvcm0gPSBDaGFyYWN0ZXJGb3JtLk1pZGRsZTsKCQkJfQoKCQkJdmFyIGNvZGUgPSB3b3JkW2ldLmNoYXJDb2RlQXQoMCk7CgoJCQkvLyBoYW5kbGUgbGFtIGFsZWYgc3BlY2lhbCBjYXNlCgkJCWlmIChjb2RlID09IDB4MDY0NCAmJiBjb25uZWN0ZWRUb05leHRDaGFyKSB7CgkJCQl2YXIgbmV4dENvZGUgPSB3b3JkW2krMV0uY2hhckNvZGVBdCgwKTsKCQkJCXZhciBzcGVjaWFsQ29kZSA9IG51bGw7CgkJCQlpZiAobmV4dENvZGUgPT0gMHgwNjIyKSB7CgkJCQkJLy8gYWxlZiBtYWRkCgkJCQkJc3BlY2lhbENvZGUgPSBnbHlwaEZvcm1zWzB4MDY0Yl1bZm9ybV07CgkJCQl9CgkJCQllbHNlIGlmIChuZXh0Q29kZSA9PSAweDA2MjMpIHsKCQkJCQkvLyBoYW16YSBhYm92ZQoJCQkJCXNwZWNpYWxDb2RlID0gZ2x5cGhGb3Jtc1sweDA2NGNdW2Zvcm1dOwoJCQkJfQoJCQkJZWxzZSBpZiAobmV4dENvZGUgPT0gMHgwNjI1KSB7CgkJCQkJLy8gaGFtemEgYmVsb3cKCQkJCQlzcGVjaWFsQ29kZSA9IGdseXBoRm9ybXNbMHgwNjRkXVtmb3JtXTsKCQkJCX0KCQkJCWVsc2UgaWYgKG5leHRDb2RlID09IDB4MDYyNykgewoJCQkJCS8vIGFsZWYKCQkJCQlzcGVjaWFsQ29kZSA9IGdseXBoRm9ybXNbMHgwNjRlXVtmb3JtXTsKCQkJCX0KCgkJCQlpZiAoc3BlY2lhbENvZGUgIT0gbnVsbCkgewoJCQkJCXNoYXBlZFdvcmQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShzcGVjaWFsQ29kZSk7CgkJCQkJaSsrOyAvLyBza2lwIGEgc3RlcAoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQl9CgoJCQkvLyBoYWNreT8KCQkJaWYgKGZvcm0gPT09IENoYXJhY3RlckZvcm0uSXNvbGF0ZWQpIHsKCQkJCXNoYXBlZFdvcmQgKz0gd29yZFtpXTsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQl2YXIgc2hhcGVkQ29kZSA9IGdseXBoRm9ybXNbY29kZV1bZm9ybV07CgkJCXNoYXBlZFdvcmQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShzaGFwZWRDb2RlKTsKCQl9CgoJCXJldHVybiBzaGFwZWRXb3JkOwoJfQoKCXRoaXMuQ29udGFpbnNBcmFiaWNDaGFyYWN0ZXJzID0gQ29udGFpbnNBcmFiaWNDaGFyYWN0ZXJzOwoJdGhpcy5TaGFwZUFyYWJpY0NoYXJhY3RlcnMgPSBTaGFwZUFyYWJpY0NoYXJhY3RlcnM7Cn0KCi8qIFRFWFQgRUZGRUNUUyAqLwp2YXIgVGV4dEVmZmVjdHMgPSB7fTsKCmZ1bmN0aW9uIFJhaW5ib3dFZmZlY3QoKSB7CglmdW5jdGlvbiBwb3NpdGl2ZU1vZHVsbyhudW1iZXIsIGRpdmlzb3IpIHsKCQlyZXR1cm4gKChudW1iZXIgJSBkaXZpc29yKSArIGRpdmlzb3IpICUgZGl2aXNvcjsKCX0KCgl0aGlzLmRvRWZmZWN0ID0gZnVuY3Rpb24oY2hhciwgdGltZSwgcGFyYW1ldGVycykgewoJCWNoYXIuY29sb3IgPSByYWluYm93Q29sb3JTdGFydEluZGV4ICsgTWF0aC5mbG9vcihwb3NpdGl2ZU1vZHVsbygodGltZSAvIDEwMCkgLSBjaGFyLmNvbCAqIDAuNSwgcmFpbmJvd0NvbG9yQ291bnQpKTsKCX07Cn0KClRleHRFZmZlY3RzWyJyYnciXSA9IG5ldyBSYWluYm93RWZmZWN0KCk7CgpmdW5jdGlvbiBDb2xvckVmZmVjdChpbmRleCkgewoJdGhpcy5kb0VmZmVjdCA9IGZ1bmN0aW9uKGNoYXIsIHRpbWUsIHBhcmFtZXRlcnMpIHsKCQlpZiAocGFyYW1ldGVycyAmJiBwYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKCQkJY2hhci5jb2xvciA9IHRpbGVDb2xvclN0YXJ0SW5kZXggKyBwYXJhbWV0ZXJzWzBdOwoJCX0KCQllbHNlIHsKCQkJY2hhci5jb2xvciA9IHRpbGVDb2xvclN0YXJ0SW5kZXggKyBpbmRleDsKCQl9Cgl9Owp9CgpUZXh0RWZmZWN0c1siY2xyIl0gPSBuZXcgQ29sb3JFZmZlY3QoKTsKVGV4dEVmZmVjdHNbImNscjEiXSA9IG5ldyBDb2xvckVmZmVjdCgwKTsKVGV4dEVmZmVjdHNbImNscjIiXSA9IG5ldyBDb2xvckVmZmVjdCgxKTsKVGV4dEVmZmVjdHNbImNscjMiXSA9IG5ldyBDb2xvckVmZmVjdCgyKTsKCmZ1bmN0aW9uIFdhdnlFZmZlY3QoKSB7Cgl0aGlzLmRvRWZmZWN0ID0gZnVuY3Rpb24oY2hhciwgdGltZSwgcGFyYW1ldGVycykgewoJCWNoYXIub2Zmc2V0LnkgKz0gTWF0aC5zaW4oKHRpbWUgLyAyNTApIC0gKGNoYXIuY29sIC8gMikpICogMjsKCX07Cn0KClRleHRFZmZlY3RzWyJ3dnkiXSA9IG5ldyBXYXZ5RWZmZWN0KCk7CgpmdW5jdGlvbiBTaGFreUVmZmVjdCgpIHsKCWZ1bmN0aW9uIGRpc3R1cmIoZnVuYywgdGltZSwgb2Zmc2V0LCBtdWx0MSwgbXVsdDIpIHsKCQlyZXR1cm4gZnVuYygodGltZSAqIG11bHQxKSAtIChvZmZzZXQgKiBtdWx0MikpOwoJfQoKCXRoaXMuZG9FZmZlY3QgPSBmdW5jdGlvbihjaGFyLCB0aW1lLCBwYXJhbWV0ZXJzKSB7CgkJY2hhci5vZmZzZXQueSArPSAxLjUKCQkJCQkJKiBkaXN0dXJiKE1hdGguc2luLCB0aW1lLCBjaGFyLmNvbCwgMC4xLCAwLjUpCgkJCQkJCSogZGlzdHVyYihNYXRoLmNvcywgdGltZSwgY2hhci5jb2wsIDAuMywgMC4yKQoJCQkJCQkqIGRpc3R1cmIoTWF0aC5zaW4sIHRpbWUsIGNoYXIucm93LCAyLjAsIDEuMCk7CgkJY2hhci5vZmZzZXQueCArPSAxLjUKCQkJCQkJKiBkaXN0dXJiKE1hdGguY29zLCB0aW1lLCBjaGFyLnJvdywgMC4xLCAxLjApCgkJCQkJCSogZGlzdHVyYihNYXRoLnNpbiwgdGltZSwgY2hhci5jb2wsIDMuMCwgMC43KQoJCQkJCQkqIGRpc3R1cmIoTWF0aC5jb3MsIHRpbWUsIGNoYXIuY29sLCAwLjIsIDAuMyk7Cgl9Owp9CgpUZXh0RWZmZWN0c1sic2hrIl0gPSBuZXcgU2hha3lFZmZlY3QoKTsKCi8qCi8vIFRPRE8gOiBtYXliZSB1c2UgdGhpcyBpbiBhIGZ1dHVyZSB1cGRhdGU/CmZ1bmN0aW9uIFlha0VmZmVjdCgpIHsKCXRoaXMuZG9FZmZlY3QgPSBmdW5jdGlvbihjaGFyLCB0aW1lLCBwYXJhbWV0ZXJzKSB7CgkJaWYgKGNoYXIuY2hhciAhPSAiICIpIHsKCQkJY2hhci5ibGlwID0gcGFyYW1ldGVyc1swXTsKCQl9Cgl9Owp9CgpUZXh0RWZmZWN0c1sieWFrIl0gPSBuZXcgWWFrRWZmZWN0KCk7CiovCgp2YXIgRGVidWdIaWdobGlnaHRFZmZlY3QgPSBmdW5jdGlvbigpIHsKCXRoaXMuZG9FZmZlY3QgPSBmdW5jdGlvbihjaGFyLCB0aW1lLCBwYXJhbWV0ZXJzKSB7CgkJY2hhci5jb2xvciA9IHRpbGVDb2xvclN0YXJ0SW5kZXg7Cgl9Owp9CgpUZXh0RWZmZWN0c1siX2RlYnVnX2hpZ2hsaWdodCJdID0gbmV3IERlYnVnSGlnaGxpZ2h0RWZmZWN0KCk7Cgp9IC8vIERpYWxvZygpCjwvc2NyaXB0PgoKPHNjcmlwdD4KZnVuY3Rpb24gVGlsZVJlbmRlcmVyKCkgewpiaXRzeS5sb2coIiEhISEhIE5FVyBUSUxFIFJFTkRFUkVSIik7Cgp2YXIgZHJhd2luZ0NhY2hlID0gewoJc291cmNlOiB7fSwKCXJlbmRlcjoge30sCn07CgovLyB2YXIgZGVidWdSZW5kZXJDb3VudCA9IDA7CgpmdW5jdGlvbiBjcmVhdGVSZW5kZXJDYWNoZUlkKGRyYXdpbmdJZCwgY29sb3JJbmRleCkgewoJcmV0dXJuIGRyYXdpbmdJZCArICJfIiArIGNvbG9ySW5kZXg7Cn0KCmZ1bmN0aW9uIHJlbmRlckRyYXdpbmcoZHJhd2luZykgewoJLy8gZGVidWdSZW5kZXJDb3VudCsrOwoJLy8gYml0c3kubG9nKCJSRU5ERVIgQ09VTlQgIiArIGRlYnVnUmVuZGVyQ291bnQpOwoKCXZhciBjb2wgPSBkcmF3aW5nLmNvbDsKCXZhciBiZ2MgPSBkcmF3aW5nLmJnYzsKCXZhciBkcndJZCA9IGRyYXdpbmcuZHJ3OwoJdmFyIGRyYXdpbmdGcmFtZXMgPSBkcmF3aW5nQ2FjaGUuc291cmNlW2Ryd0lkXTsKCgkvLyBpbml0aWFsaXplIHJlbmRlciBjYWNoZSBlbnRyeQoJdmFyIGNhY2hlSWQgPSBjcmVhdGVSZW5kZXJDYWNoZUlkKGRyd0lkLCBjb2wpOwoJaWYgKGRyYXdpbmdDYWNoZS5yZW5kZXJbY2FjaGVJZF0gPT09IHVuZGVmaW5lZCkgewoJCS8vIGluaXRpYWxpemUgYXJyYXkgb2YgZnJhbWVzIGZvciBkcmF3aW5nCgkJZHJhd2luZ0NhY2hlLnJlbmRlcltjYWNoZUlkXSA9IFtdOwoJfQoKCWZvciAodmFyIGkgPSAwOyBpIDwgZHJhd2luZ0ZyYW1lcy5sZW5ndGg7IGkrKykgewoJCXZhciBmcmFtZURhdGEgPSBkcmF3aW5nRnJhbWVzW2ldOwoJCXZhciBmcmFtZVRpbGVJZCA9IHJlbmRlclRpbGVGcm9tRHJhd2luZ0RhdGEoZnJhbWVEYXRhLCBjb2wsIGJnYyk7CgkJZHJhd2luZ0NhY2hlLnJlbmRlcltjYWNoZUlkXS5wdXNoKGZyYW1lVGlsZUlkKTsKCX0KfQoKZnVuY3Rpb24gcmVuZGVyVGlsZUZyb21EcmF3aW5nRGF0YShkcmF3aW5nRGF0YSwgY29sLCBiZ2MpIHsKCXZhciB0aWxlSWQgPSBiaXRzeS50aWxlKCk7CgoJdmFyIGJhY2tncm91bmRDb2xvciA9IHRpbGVDb2xvclN0YXJ0SW5kZXggKyBiZ2M7Cgl2YXIgZm9yZWdyb3VuZENvbG9yID0gdGlsZUNvbG9yU3RhcnRJbmRleCArIGNvbDsKCgliaXRzeS5maWxsKHRpbGVJZCwgYmFja2dyb3VuZENvbG9yKTsKCglmb3IgKHZhciB5ID0gMDsgeSA8IGJpdHN5LlRJTEVfU0laRTsgeSsrKSB7CgkJZm9yICh2YXIgeCA9IDA7IHggPCBiaXRzeS5USUxFX1NJWkU7IHgrKykgewoJCQl2YXIgcHggPSBkcmF3aW5nRGF0YVt5XVt4XTsKCQkJaWYgKHB4ID09PSAxKSB7CgkJCQliaXRzeS5zZXQodGlsZUlkLCAoeSAqIGJpdHN5LlRJTEVfU0laRSkgKyB4LCBmb3JlZ3JvdW5kQ29sb3IpOwoJCQl9CgkJfQoJfQoKCXJldHVybiB0aWxlSWQ7Cn0KCi8vIFRPRE8gOiBtb3ZlIGludG8gY29yZQpmdW5jdGlvbiB1bmRlZmluZWRPck51bGwoeCkgewoJcmV0dXJuIHggPT09IHVuZGVmaW5lZCB8fCB4ID09PSBudWxsOwp9CgpmdW5jdGlvbiBpc0RyYXdpbmdSZW5kZXJlZChkcmF3aW5nKSB7Cgl2YXIgY2FjaGVJZCA9IGNyZWF0ZVJlbmRlckNhY2hlSWQoZHJhd2luZy5kcncsIGRyYXdpbmcuY29sKTsKCXJldHVybiBkcmF3aW5nQ2FjaGUucmVuZGVyW2NhY2hlSWRdICE9IHVuZGVmaW5lZDsKfQoKZnVuY3Rpb24gZ2V0UmVuZGVyZWREcmF3aW5nRnJhbWVzKGRyYXdpbmcpIHsKCXZhciBjYWNoZUlkID0gY3JlYXRlUmVuZGVyQ2FjaGVJZChkcmF3aW5nLmRydywgZHJhd2luZy5jb2wpOwoJcmV0dXJuIGRyYXdpbmdDYWNoZS5yZW5kZXJbY2FjaGVJZF07Cn0KCmZ1bmN0aW9uIGdldERyYXdpbmdGcmFtZVRpbGVJZChkcmF3aW5nLCBmcmFtZU92ZXJyaWRlKSB7Cgl2YXIgZnJhbWVJbmRleCA9IDA7CgoJaWYgKGRyYXdpbmcgIT0gbnVsbCAmJiBkcmF3aW5nLmFuaW1hdGlvbi5pc0FuaW1hdGVkKSB7CgkJaWYgKGZyYW1lT3ZlcnJpZGUgIT0gdW5kZWZpbmVkICYmIGZyYW1lT3ZlcnJpZGUgIT0gbnVsbCkgewoJCQlmcmFtZUluZGV4ID0gZnJhbWVPdmVycmlkZTsKCQl9CgkJZWxzZSB7CgkJCWZyYW1lSW5kZXggPSBkcmF3aW5nLmFuaW1hdGlvbi5mcmFtZUluZGV4OwoJCX0KCX0KCglyZXR1cm4gZ2V0UmVuZGVyZWREcmF3aW5nRnJhbWVzKGRyYXdpbmcpW2ZyYW1lSW5kZXhdOwp9CgpmdW5jdGlvbiBnZXRPclJlbmRlckRyYXdpbmdGcmFtZShkcmF3aW5nLCBmcmFtZU92ZXJyaWRlKSB7CgkvLyBiaXRzeS5sb2coImZyYW1lIHJlbmRlcjogIiArIGRyYXdpbmcudHlwZSArICIgIiArIGRyYXdpbmcuaWQgKyAiIGY6IiArIGZyYW1lT3ZlcnJpZGUpOwoKCWlmICghaXNEcmF3aW5nUmVuZGVyZWQoZHJhd2luZykpIHsKCQliaXRzeS5sb2coImZyYW1lIHJlbmRlcjogZG9lc24ndCBleGlzdCAiICsgZHJhd2luZy5pZCk7CgkJcmVuZGVyRHJhd2luZyhkcmF3aW5nKTsKCX0KCglyZXR1cm4gZ2V0RHJhd2luZ0ZyYW1lVGlsZUlkKGRyYXdpbmcsIGZyYW1lT3ZlcnJpZGUpOwp9CgpmdW5jdGlvbiBkZWxldGVSZW5kZXJzKGRyYXdpbmdJZCkgewoJZm9yICh2YXIgY2FjaGVJZCBpbiBkcmF3aW5nQ2FjaGUucmVuZGVyKSB7CgkJaWYgKGNhY2hlSWQuaW5kZXhPZihkcmF3aW5nSWQpID09PSAwKSB7CgkJCXZhciB0aWxlcyA9IGRyYXdpbmdDYWNoZS5yZW5kZXJbY2FjaGVJZF07CgkJCWZvciAodmFyIGkgPSAwOyBpIDwgdGlsZXMubGVuZ3RoOyBpKyspIHsKCQkJCWJpdHN5LmRlbGV0ZSh0aWxlc1tpXSk7CgkJCX0KCQkJZGVsZXRlIGRyYXdpbmdDYWNoZS5yZW5kZXJbY2FjaGVJZF07CgkJfQoJfQp9CgovKiBQVUJMSUMgSU5URVJGQUNFICovCnRoaXMuR2V0RHJhd2luZ0ZyYW1lID0gZ2V0T3JSZW5kZXJEcmF3aW5nRnJhbWU7CgovLyB0b2RvIDogbGVhdmUgaW5kaXZpZHVhbCBnZXQgYW5kIHNldCBzdHVmZiBmb3Igbm93IC0gc2hvdWxkIEkgcmVtb3ZlIGxhdGVyPwovLyB0b2RvIDogYmV0dGVyIG5hbWUgZm9yIGZ1bmN0aW9uPwp0aGlzLlNldERyYXdpbmdzID0gZnVuY3Rpb24oZHJhd2luZ1NvdXJjZSkgewoJZHJhd2luZ0NhY2hlLnNvdXJjZSA9IGRyYXdpbmdTb3VyY2U7CgkvLyBuZWVkIHRvIHJlc2V0IGVudGlyZSByZW5kZXIgY2FjaGUgd2hlbiBhbGwgdGhlIGRyYXdpbmdzIGFyZSBjaGFuZ2VkCglkcmF3aW5nQ2FjaGUucmVuZGVyID0ge307Cn07Cgp0aGlzLlNldERyYXdpbmdTb3VyY2UgPSBmdW5jdGlvbihkcmF3aW5nSWQsIGRyYXdpbmdEYXRhKSB7CglkZWxldGVSZW5kZXJzKGRyYXdpbmdJZCk7CglkcmF3aW5nQ2FjaGUuc291cmNlW2RyYXdpbmdJZF0gPSBkcmF3aW5nRGF0YTsKfTsKCnRoaXMuR2V0RHJhd2luZ1NvdXJjZSA9IGZ1bmN0aW9uKGRyYXdpbmdJZCkgewoJcmV0dXJuIGRyYXdpbmdDYWNoZS5zb3VyY2VbZHJhd2luZ0lkXTsKfTsKCnRoaXMuR2V0RnJhbWVDb3VudCA9IGZ1bmN0aW9uKGRyYXdpbmdJZCkgewoJcmV0dXJuIGRyYXdpbmdDYWNoZS5zb3VyY2VbZHJhd2luZ0lkXS5sZW5ndGg7Cn07CgovLyB0b2RvIDogZm9yY2VSZXNldCBvcHRpb24gaXMgaGFja3k/CnRoaXMuQ2xlYXJDYWNoZSA9IGZ1bmN0aW9uKGZvcmNlUmVzZXQpIHsKCWlmIChmb3JjZVJlc2V0ID09PSB1bmRlZmluZWQgfHwgZm9yY2VSZXNldCA9PT0gdHJ1ZSkgewoJCWJpdHN5LmRlbGV0ZUFsbFRpbGVzKCk7Cgl9CgoJZHJhd2luZ0NhY2hlLnJlbmRlciA9IHt9Owp9OwoKdGhpcy5kZWxldGVEcmF3aW5nID0gZGVsZXRlUmVuZGVyczsKCn0gLy8gUmVuZGVyZXIoKQo8L3NjcmlwdD4KCjxzY3JpcHQ+Ci8qIFdPUkxEIERBVEEgKi8KdmFyIHJvb20gPSB7fTsKdmFyIHRpbGUgPSB7fTsKdmFyIHNwcml0ZSA9IHt9Owp2YXIgaXRlbSA9IHt9Owp2YXIgZGlhbG9nID0ge307CnZhciBlbmQgPSB7fTsgLy8gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CnZhciBwYWxldHRlID0geyAvLyBzdGFydCBvZmYgd2l0aCBhIGRlZmF1bHQgcGFsZXR0ZQoJCSJkZWZhdWx0IiA6IHsKCQkJbmFtZSA6ICJkZWZhdWx0IiwKCQkJY29sb3JzIDogW1swLDAsMF0sWzI1NSwyNTUsMjU1XSxbMjU1LDI1NSwyNTVdXQoJCX0KCX07CnZhciB2YXJpYWJsZSA9IHt9OyAvLyB0aGVzZSBhcmUgc3RhcnRpbmcgdmFyaWFibGUgdmFsdWVzIC0tIHRoZXkgZG9uJ3QgdXBkYXRlIChvciBJIGRvbid0IHRoaW5rIHRoZXkgd2lsbCkKdmFyIHR1bmUgPSB7fTsKdmFyIGJsaXAgPSB7fTsKdmFyIHBsYXllcklkID0gIkEiOwp2YXIgZm9udE5hbWUgPSBkZWZhdWx0Rm9udE5hbWU7CnZhciB0ZXh0RGlyZWN0aW9uID0gVGV4dERpcmVjdGlvbi5MZWZ0VG9SaWdodDsKCi8qIE5BTUUtVE8tSUQgTUFQUyAqLwp2YXIgbmFtZXMgPSB7Cglyb29tIDoge30sCgl0aWxlIDoge30sCglzcHJpdGUgOiB7fSwKCWl0ZW0gOiB7fSwKCWRpYWxvZyA6IHt9LAoJcGFsZXR0ZSA6IHt9LAoJdHVuZSA6IHt9LAoJYmxpcCA6IHt9LAp9OwoKLy8gdG9kbyA6IHRoaXMgaXMgYmFzaWNhbGx5IGEgY29weSBvZiB0aGUgb25lIGluIHdvcmxkLmpzIC0gY2FuIEkgcmVtb3ZlIGl0PwpmdW5jdGlvbiB1cGRhdGVOYW1lc0Zyb21DdXJEYXRhKCkgewoKCWZ1bmN0aW9uIGNyZWF0ZU5hbWVNYXAob2JqZWN0U3RvcmUpIHsKCQl2YXIgbWFwID0ge307CgoJCWZvciAoaWQgaW4gb2JqZWN0U3RvcmUpIHsKCQkJaWYgKG9iamVjdFN0b3JlW2lkXS5uYW1lICE9IHVuZGVmaW5lZCAmJiBvYmplY3RTdG9yZVtpZF0ubmFtZSAhPSBudWxsKSB7CgkJCQltYXBbb2JqZWN0U3RvcmVbaWRdLm5hbWVdID0gaWQ7CgkJCX0KCQl9CgoJCXJldHVybiBtYXA7Cgl9CgoJbmFtZXMucm9vbSA9IGNyZWF0ZU5hbWVNYXAocm9vbSk7CgluYW1lcy50aWxlID0gY3JlYXRlTmFtZU1hcCh0aWxlKTsKCW5hbWVzLnNwcml0ZSA9IGNyZWF0ZU5hbWVNYXAoc3ByaXRlKTsKCW5hbWVzLml0ZW0gPSBjcmVhdGVOYW1lTWFwKGl0ZW0pOwoJbmFtZXMuZGlhbG9nID0gY3JlYXRlTmFtZU1hcChkaWFsb2cpOwoJbmFtZXMucGFsZXR0ZSA9IGNyZWF0ZU5hbWVNYXAocGFsZXR0ZSk7CgluYW1lcy50dW5lID0gY3JlYXRlTmFtZU1hcCh0dW5lKTsKCW5hbWVzLmJsaXAgPSBjcmVhdGVOYW1lTWFwKGJsaXApOwp9CgovKiBHQU1FIFNUQVRFICovCnZhciBzdGF0ZSA9IHt9CmZ1bmN0aW9uIHJlc2V0R2FtZVN0YXRlKCkgewoJc3RhdGUucm9vbSA9ICIwIjsKCXN0YXRlLmF2YSA9IHBsYXllcklkOyAvLyBhdmF0YXIgYXBwZWFyYW5jZSBvdmVycmlkZQoJc3RhdGUucGFsID0gIjAiOyAvLyBjdXJyZW50IHBhbGV0dGUgaWQKCXN0YXRlLnR1bmUgPSAiMCI7IC8vIGN1cnJlbnQgdHVuZSBpZCAoIjAiID09PSBvZmYpCglzdGF0ZS5leGl0cyA9IFtdOyAvLyBleGl0cyBpbiBjdXJyZW50IHJvb20KCXN0YXRlLmVuZGluZ3MgPSBbXTsgLy8gZW5kaW5ncyBpbiBjdXJyZW50IHJvb20KfQoKLy8gdGl0bGUgaGVscGVyIGZ1bmN0aW9ucwpmdW5jdGlvbiBnZXRUaXRsZSgpIHsKCXJldHVybiBkaWFsb2dbdGl0bGVEaWFsb2dJZF0uc3JjOwp9CmZ1bmN0aW9uIHNldFRpdGxlKHRpdGxlU3JjKSB7CglkaWFsb2dbdGl0bGVEaWFsb2dJZF0gPSB7IHNyYzp0aXRsZVNyYywgbmFtZTpudWxsIH07Cn0KCi8qIEZMQUdTICovCnZhciBmbGFncyA9IGNyZWF0ZURlZmF1bHRGbGFncygpOwoKLy8gZmVhdHVyZSBmbGFncyBmb3IgdGVzdGluZyBwdXJwb3Nlcwp2YXIgZW5naW5lRmVhdHVyZUZsYWdzID0gewoJaXNTb3VuZEVuYWJsZWQgOiB0cnVlLAoJaXNGb250RW5hYmxlZCA6IHRydWUsCglpc1RyYW5zaXRpb25FbmFibGVkIDogdHJ1ZSwKCWlzU2NyaXB0RW5hYmxlZCA6IHRydWUsCglpc0RpYWxvZ0VuYWJsZWQgOiB0cnVlLAoJaXNSZW5kZXJlckVuYWJsZWQgOiB0cnVlLAp9OwoKZnVuY3Rpb24gY2xlYXJHYW1lRGF0YSgpIHsKCXJvb20gPSB7fTsKCXRpbGUgPSB7fTsKCXNwcml0ZSA9IHt9OwoJaXRlbSA9IHt9OwoJZGlhbG9nID0ge307CglwYWxldHRlID0geyAvL3N0YXJ0IG9mZiB3aXRoIGEgZGVmYXVsdCBwYWxldHRlCgkJImRlZmF1bHQiIDogewoJCQluYW1lIDogImRlZmF1bHQiLAoJCQljb2xvcnMgOiBbWzAsMCwwXSxbMjU1LDI1NSwyNTVdLFsyNTUsMjU1LDI1NV1dCgkJfQoJfTsKCWlzRW5kaW5nID0gZmFsc2U7IC8vdG9kbyAtIGNvcnJlY3QgcGxhY2UgZm9yIHRoaXM/Cgl2YXJpYWJsZSA9IHt9OwoKCXVwZGF0ZU5hbWVzRnJvbUN1ckRhdGEoKTsKCglmb250TmFtZSA9IGRlZmF1bHRGb250TmFtZTsgLy8gVE9ETyA6IHJlc2V0IGZvbnQgbWFuYWdlciB0b28/Cgl0ZXh0RGlyZWN0aW9uID0gVGV4dERpcmVjdGlvbi5MZWZ0VG9SaWdodDsKCglyZXNldEdhbWVTdGF0ZSgpOwoKCWlzR2FtZUxvYWRlZCA9IGZhbHNlOwoJaXNHYW1lT3ZlciA9IGZhbHNlOwp9CgovLyBlbmdpbmUgZXZlbnQgaG9va3MgZm9yIHRoZSBlZGl0b3IKdmFyIG9uSW52ZW50b3J5Q2hhbmdlZCA9IG51bGw7CnZhciBvblZhcmlhYmxlQ2hhbmdlZCA9IG51bGw7CnZhciBvbkdhbWVSZXNldCA9IG51bGw7CnZhciBvbkluaXRSb29tID0gbnVsbDsKCnZhciBpc1BsYXllckVtYmVkZGVkSW5FZGl0b3IgPSBmYWxzZTsKCnZhciByZW5kZXJlcjsKaWYgKGVuZ2luZUZlYXR1cmVGbGFncy5pc1JlbmRlcmVyRW5hYmxlZCkgewoJcmVuZGVyZXIgPSBuZXcgVGlsZVJlbmRlcmVyKCk7Cn0KCnZhciBjdXJHYW1lRGF0YSA9IG51bGw7CnZhciBjdXJEZWZhdWx0Rm9udERhdGEgPSBudWxsOwoKdmFyIGlzR2FtZUxvYWRlZCA9IGZhbHNlOwp2YXIgaXNHYW1lT3ZlciA9IGZhbHNlOwoKZnVuY3Rpb24gbG9hZF9nYW1lKGdhbWVEYXRhLCBkZWZhdWx0Rm9udERhdGEsIHN0YXJ0V2l0aFRpdGxlKSB7CgkvLyBiaXRzeS5sb2coImdhbWUgZGF0YSBpbjogXG4iICsgZ2FtZURhdGEpOwoKCWN1ckdhbWVEYXRhID0gZ2FtZURhdGE7IC8vcmVtZW1iZXIgdGhlIGN1cnJlbnQgZ2FtZSAodXNlZCB0byByZXNldCB0aGUgZ2FtZSkKCglpZiAoZGlhbG9nQnVmZmVyKSB7CgkJZGlhbG9nQnVmZmVyLlJlc2V0KCk7Cgl9CgoJaWYgKHNjcmlwdEludGVycHJldGVyKSB7CgkJc2NyaXB0SW50ZXJwcmV0ZXIuUmVzZXRFbnZpcm9ubWVudCgpOyAvLyBlbnN1cmVzIHZhcmlhYmxlcyBhcmUgcmVzZXQgLS0gaXMgdGhpcyB0aGUgYmVzdCB3YXk/Cgl9CgoJbG9hZFdvcmxkRnJvbUdhbWVEYXRhKGdhbWVEYXRhKTsKCgliaXRzeS5sb2coIndvcmxkIGxvYWRlZCIpOwoKCWlmIChmb250TWFuYWdlciAmJiAhaXNQbGF5ZXJFbWJlZGRlZEluRWRpdG9yICYmIGRlZmF1bHRGb250RGF0YSkgewoJCWJpdHN5LmxvZygibG9hZCBmb250Iik7CgoJCWN1ckRlZmF1bHRGb250RGF0YSA9IGRlZmF1bHRGb250RGF0YTsgLy8gc3RvcmUgZm9yIHJlc2V0dGluZyBnYW1lCgoJCS8vIHRvZG8gOiBjb25zaWRlciByZXBsYWNpbmcgdGhpcyB3aXRoIGEgbW9yZSBnZW5lcmFsIHN5c3RlbSBmb3IgcmVxdWVzdGluZyByZXNvdXJjZXMgZnJvbSB0aGUgc3lzdGVtPwoJCS8vIGhhY2sgdG8gZW5zdXJlIGRlZmF1bHQgZm9udCBpcyBhdmFpbGFibGUKCQlmb250TWFuYWdlci5BZGRSZXNvdXJjZShkZWZhdWx0Rm9udE5hbWUgKyBmb250TWFuYWdlci5HZXRFeHRlbnNpb24oKSwgZGVmYXVsdEZvbnREYXRhKTsKCgkJYml0c3kubG9nKCJsb2FkIGZvbnQgZW5kIik7Cgl9CgoJLy8gcmVxdWVzdCB0ZXh0IG1vZGUKCWlmIChmbGFncy5UWFRfTU9ERSA9PT0gMSkgewoJCWJpdHN5LnRleHRNb2RlKGJpdHN5LlRYVF9MT1JFWik7Cgl9CgllbHNlIHsKCQkvLyBkZWZhdWx0IHRvIDJ4IHNjYWxlIGZvciB0ZXh0IHJlbmRlcmluZwoJCWJpdHN5LnRleHRNb2RlKGJpdHN5LlRYVF9ISVJFWik7Cgl9CgoJaWYgKGZvbnRNYW5hZ2VyICYmIGRpYWxvZ0J1ZmZlcikgewoJCWJpdHN5LmxvZygiZ2V0IGZvbnQiKTsKCgkJdmFyIGZvbnQgPSBmb250TWFuYWdlci5HZXQoIGZvbnROYW1lICk7CgkJZGlhbG9nQnVmZmVyLlNldEZvbnQoZm9udCk7CgkJZGlhbG9nUmVuZGVyZXIuU2V0Rm9udChmb250KTsKCgkJYml0c3kubG9nKCJnZXQgZm9udCBlbmQiKTsKCX0KCglpZiAoZGlhbG9nQnVmZmVyKSB7CgkJLy8gdGhpcyBmZWVscyBhIGxpdHRsZSBzaWxseSB0byBtZSAtIG9oIHdlbGw/PwoJCWRpYWxvZ0J1ZmZlci5TZXRQaXhlbHNQZXJSb3coZGlhbG9nUmVuZGVyZXIuR2V0UGl4ZWxzUGVyUm93KCkpOwoJfQoKCXNldEluaXRpYWxWYXJpYWJsZXMoKTsKCgliaXRzeS5sb2coInJlYWR5Iik7CgoJb25yZWFkeShzdGFydFdpdGhUaXRsZSk7CgoJaXNHYW1lTG9hZGVkID0gdHJ1ZTsKfQoKZnVuY3Rpb24gbG9hZFdvcmxkRnJvbUdhbWVEYXRhKGdhbWVEYXRhKSB7CgliaXRzeS5sb2coImxvYWQgd29ybGQgZnJvbSBnYW1lIGRhdGEiKTsKCgl2YXIgd29ybGQgPSBwYXJzZVdvcmxkKGdhbWVEYXRhKTsKCgliaXRzeS5sb2coInBhcnNlIHdvcmxkIGRvbmUiKTsKCgkvLyBtb3ZlIHdvcmxkIGRhdGEgaW50byBnbG9iYWwgc2NvcGUKCXBhbGV0dGUgPSB3b3JsZC5wYWxldHRlOwoJcm9vbSA9IHdvcmxkLnJvb207Cgl0aWxlID0gd29ybGQudGlsZTsKCXNwcml0ZSA9IHdvcmxkLnNwcml0ZTsKCWl0ZW0gPSB3b3JsZC5pdGVtOwoJZGlhbG9nID0gd29ybGQuZGlhbG9nOwoJZW5kID0gd29ybGQuZW5kOyAvLyBiYWNrIGNvbXBhdCBlbmRpbmdzCgl2YXJpYWJsZSA9IHdvcmxkLnZhcmlhYmxlOwoJZm9udE5hbWUgPSB3b3JsZC5mb250TmFtZTsKCXRleHREaXJlY3Rpb24gPSB3b3JsZC50ZXh0RGlyZWN0aW9uOwoJdHVuZSA9IHdvcmxkLnR1bmU7CglibGlwID0gd29ybGQuYmxpcDsKCWZsYWdzID0gd29ybGQuZmxhZ3M7CgluYW1lcyA9IHdvcmxkLm5hbWVzOwoKCWlmIChyZW5kZXJlcikgewoJCXJlbmRlcmVyLlNldERyYXdpbmdzKHdvcmxkLmRyYXdpbmdzKTsKCX0KCgkvLyBmaW5kIHN0YXJ0aW5nIHJvb20gYW5kIGluaXRpYWxpemUgaXQKCXZhciByb29tSWRzID0gT2JqZWN0LmtleXMocm9vbSk7CgoJaWYgKHBsYXllcigpICE9IHVuZGVmaW5lZCAmJiBwbGF5ZXIoKS5yb29tICE9IG51bGwgJiYgcm9vbUlkcy5pbmRleE9mKHBsYXllcigpLnJvb20pICE9IC0xKSB7CgkJLy8gcGxheWVyIGhhcyB2YWxpZCByb29tCgkJc3RhdGUucm9vbSA9IHBsYXllcigpLnJvb207Cgl9CgllbHNlIGlmIChyb29tSWRzLmxlbmd0aCA+IDApIHsKCQkvLyBwbGF5ZXIgbm90IGluIGFueSByb29tISB3aGF0IHRoZSBoZWNrCgkJc3RhdGUucm9vbSA9IHJvb21JZHNbMF07Cgl9CgllbHNlIHsKCQkvLyB1aCBvaCB0aGVyZSBhcmUgbm8gcm9vbXMgSSBndWVzcz8/PwoJCXN0YXRlLnJvb20gPSBudWxsOwoJfQoKCWlmIChzdGF0ZS5yb29tICE9IG51bGwpIHsKCQliaXRzeS5sb2coIklOSVQgUk9PTSAiICsgc3RhdGUucm9vbSk7CgkJaW5pdFJvb20oc3RhdGUucm9vbSk7Cgl9Cn0KCmZ1bmN0aW9uIHJlc2V0X2N1cl9nYW1lKCkgewoJaWYgKGN1ckdhbWVEYXRhID09IG51bGwpIHsKCQlyZXR1cm47IC8vY2FuJ3QgcmVzZXQgaWYgd2UgZG9uJ3QgaGF2ZSB0aGUgZ2FtZSBkYXRhCgl9CgoJc3RvcEdhbWUoKTsKCWNsZWFyR2FtZURhdGEoKTsKCglpZiAoaXNQbGF5ZXJFbWJlZGRlZEluRWRpdG9yICYmIG9uR2FtZVJlc2V0ICE9IG51bGwpIHsKCQlvbkdhbWVSZXNldCgpOwoJfQp9CgpmdW5jdGlvbiBvbnJlYWR5KHN0YXJ0V2l0aFRpdGxlKSB7CgliaXRzeS5sb2coImdhbWUgcmVhZHkhIik7CgoJaWYgKHN0YXJ0V2l0aFRpdGxlID09PSB1bmRlZmluZWQgfHwgc3RhcnRXaXRoVGl0bGUgPT09IG51bGwpIHsKCQlzdGFydFdpdGhUaXRsZSA9IHRydWU7Cgl9CgoJaWYgKHN0YXJ0V2l0aFRpdGxlKSB7IC8vIHVzZWQgYnkgZWRpdG9yIAoJCXN0YXJ0TmFycmF0aW5nKGdldFRpdGxlKCkpOwoJfQp9CgpmdW5jdGlvbiBzZXRJbml0aWFsVmFyaWFibGVzKCkgewoJaWYgKCFzY3JpcHRJbnRlcnByZXRlcikgewoJCXJldHVybjsKCX0KCglmb3IoaWQgaW4gdmFyaWFibGUpIHsKCQl2YXIgdmFsdWUgPSB2YXJpYWJsZVtpZF07IC8vIGRlZmF1bHQgdG8gc3RyaW5nCgkJaWYodmFsdWUgPT09ICJ0cnVlIikgewoJCQl2YWx1ZSA9IHRydWU7CgkJfQoJCWVsc2UgaWYodmFsdWUgPT09ICJmYWxzZSIpIHsKCQkJdmFsdWUgPSBmYWxzZTsKCQl9CgkJZWxzZSBpZighaXNOYU4ocGFyc2VGbG9hdCh2YWx1ZSkpKSB7CgkJCXZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZSk7CgkJfQoJCXNjcmlwdEludGVycHJldGVyLlNldFZhcmlhYmxlKGlkLHZhbHVlKTsKCX0KCXNjcmlwdEludGVycHJldGVyLlNldE9uVmFyaWFibGVDaGFuZ2VIYW5kbGVyKCBvblZhcmlhYmxlQ2hhbmdlZCApOwp9CgpmdW5jdGlvbiBnZXRPZmZzZXQoZXZ0KSB7Cgl2YXIgb2Zmc2V0ID0geyB4OjAsIHk6MCB9OwoKCXZhciBlbCA9IGV2dC50YXJnZXQ7Cgl2YXIgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoKCW9mZnNldC54ICs9IHJlY3QubGVmdCArIGVsLnNjcm9sbExlZnQ7CglvZmZzZXQueSArPSByZWN0LnRvcCArIGVsLnNjcm9sbFRvcDsKCglvZmZzZXQueCA9IGV2dC5jbGllbnRYIC0gb2Zmc2V0Lng7CglvZmZzZXQueSA9IGV2dC5jbGllbnRZIC0gb2Zmc2V0Lnk7CgoJcmV0dXJuIG9mZnNldDsKfQoKZnVuY3Rpb24gc3RvcEdhbWUoKSB7CglpZiAoc291bmRQbGF5ZXIpIHsKCQlzb3VuZFBsYXllci5zdG9wVHVuZSgpOwoJfQoJYml0c3kubG9nKCJzdG9wIEdBTUUhIik7Cn0KCmZ1bmN0aW9uIHVwZGF0ZShkdCkgewoJaWYgKCFpc0dhbWVMb2FkZWQpIHsKCQlsb2FkX2dhbWUoYml0c3kuZ2V0R2FtZURhdGEoKSwgYml0c3kuZ2V0Rm9udERhdGEoKSk7Cgl9CgoJaWYgKHN0YXRlLnJvb20gPT0gbnVsbCkgewoJCS8vIGluIHRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhlcmUgaXMgbm8gdmFsaWQgcm9vbSwgZW5kIHRoZSBnYW1lCgkJc3RhcnROYXJyYXRpbmcoICIiLCB0cnVlIC8qaXNFbmRpbmcqLyApOwoJfQoKCWlmICghdHJhbnNpdGlvbiB8fCAhdHJhbnNpdGlvbi5Jc1RyYW5zaXRpb25BY3RpdmUoKSkgewoJCXVwZGF0ZUlucHV0KCk7Cgl9CgoJaWYgKHRyYW5zaXRpb24gJiYgdHJhbnNpdGlvbi5Jc1RyYW5zaXRpb25BY3RpdmUoKSkgewoJCS8vIHRyYW5zaXRpb24gYW5pbWF0aW9uIHRha2VzIG92ZXIgZXZlcnl0aGluZyEKCQl0cmFuc2l0aW9uLlVwZGF0ZVRyYW5zaXRpb24oZHQpOwoJfQoJZWxzZSB7CgkJaWYgKGJpdHN5LmdyYXBoaWNzTW9kZSgpICE9IGJpdHN5LkdGWF9NQVApIHsKCQkJYml0c3kuZ3JhcGhpY3NNb2RlKGJpdHN5LkdGWF9NQVApOwoJCX0KCgkJaWYgKHNvdW5kUGxheWVyKSB7CgkJCXNvdW5kUGxheWVyLnVwZGF0ZShkdCk7CgkJfQoKCQlpZiAoIWlzTmFycmF0aW5nICYmICFpc0VuZGluZykgewoJCQkvLyBkcmF3IHdvcmxkIGlmIGdhbWUgaGFzIGJlZ3VuCgkJCXZhciBkaWRBbmltYXRlID0gdXBkYXRlQW5pbWF0aW9uKGR0KTsKCgkJCS8vIHRlc3Qgd2hldGhlciBwbGF5ZXIgbW92ZWQgc28gd2UgY2FuIHJlZHJhdyBqdXN0IHRoZSBhdmF0YXIKCQkJcGxheWVyQ3VyWCA9IHBsYXllcigpLng7CgkJCXBsYXllckN1clkgPSBwbGF5ZXIoKS55OwoJCQl2YXIgZGlkUGxheWVyTW92ZSA9IChwbGF5ZXJQcmV2WCAhPSBwbGF5ZXJDdXJYKSB8fCAocGxheWVyUHJldlkgIT0gcGxheWVyQ3VyWSk7CgoJCQlkcmF3Um9vbShyb29tW3N0YXRlLnJvb21dLCB7IHJlZHJhd0FuaW1hdGVkOiBkaWRBbmltYXRlLCByZWRyYXdBdmF0YXI6IGRpZFBsYXllck1vdmUgfSk7CgoJCQkvLyBzdG9yZSBwbGF5ZXIncyBwb3NpdGlvbiBmb3IgbmV4dCBmcmFtZQoJCQlwbGF5ZXJQcmV2WCA9IHBsYXllckN1clg7CgkJCXBsYXllclByZXZZID0gcGxheWVyQ3VyWTsKCQl9CgkJZWxzZSB7CgkJCWNsZWFyUm9vbSgpOwoJCX0KCgkJaWYgKGRpYWxvZ0J1ZmZlciAmJiBkaWFsb2dCdWZmZXIuSXNBY3RpdmUoKSAmJiAhKHNvdW5kUGxheWVyICYmIHNvdW5kUGxheWVyLmlzQmxpcFBsYXlpbmcoKSkpIHsKCQkJLy8gYml0c3kubG9nKCJ1cGRhdGUgZGlhbG9nIik7CgkJCS8vIGJpdHN5LmxvZygicmVuZGVyZXIiKTsKCQkJZGlhbG9nUmVuZGVyZXIuRHJhdyhkaWFsb2dCdWZmZXIsIGR0KTsKCQkJLy8gYml0c3kubG9nKCJidWZmZXIiKTsKCQkJZGlhbG9nQnVmZmVyLlVwZGF0ZShkdCk7CgkJCS8vIGJpdHN5LmxvZygidXBkYXRlIGRpYWxvZyBlbmQiKTsKCQl9CgoJCS8vIGtlZXAgbW92aW5nIGF2YXRhciBpZiBwbGF5ZXIgaG9sZHMgZG93biBidXR0b24KCQlpZiAoKCFkaWFsb2dCdWZmZXIgfHwgIWRpYWxvZ0J1ZmZlci5Jc0FjdGl2ZSgpKSAmJiAhaXNFbmRpbmcpIHsKCQkJaWYgKGN1clBsYXllckRpcmVjdGlvbiAhPSBEaXJlY3Rpb24uTm9uZSkgewoJCQkJcGxheWVySG9sZFRvTW92ZVRpbWVyIC09IGR0OwoKCQkJCWlmIChwbGF5ZXJIb2xkVG9Nb3ZlVGltZXIgPD0gMCkgewoJCQkJCW1vdmVQbGF5ZXIoY3VyUGxheWVyRGlyZWN0aW9uLCBmYWxzZSAvKiBpc0ZpcnN0TW92ZSAqLyk7CgkJCQkJcGxheWVySG9sZFRvTW92ZVRpbWVyID0gMTUwOwoJCQkJCS8vIHBsYXllckhvbGRUb01vdmVUaW1lciA9IDE2OyAvLyBQRVJGIFRFU1QKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyBjbGVhbiB1cCBzdGF0ZSBpZiB0aGUgZ2FtZSBpcyBlbmRpbmcKCWlmIChpc0dhbWVPdmVyKSB7CgkJYml0c3kubG9nKCJnYW1lIG92ZXIiKTsKCQlyZXNldF9jdXJfZ2FtZSgpOwoJfQoKCXJldHVybiB0cnVlOwp9Cgp2YXIgaXNBbnlCdXR0b25IZWxkID0gZmFsc2U7CnZhciBpc0lnbm9yaW5nSW5wdXQgPSBmYWxzZTsKCmZ1bmN0aW9uIGlzQW55QnV0dG9uRG93bigpIHsKCXJldHVybiBiaXRzeS5idXR0b24oYml0c3kuQlROX1VQKSB8fAoJCWJpdHN5LmJ1dHRvbihiaXRzeS5CVE5fRE9XTikgfHwKCQliaXRzeS5idXR0b24oYml0c3kuQlROX0xFRlQpIHx8CgkJYml0c3kuYnV0dG9uKGJpdHN5LkJUTl9SSUdIVCkgfHwKCQliaXRzeS5idXR0b24oYml0c3kuQlROX09LKTsKfQoKZnVuY3Rpb24gdXBkYXRlSW5wdXQoKSB7CglpZiAoZGlhbG9nQnVmZmVyICYmIGRpYWxvZ0J1ZmZlci5Jc0FjdGl2ZSgpKSB7CgkJaWYgKCEoc291bmRQbGF5ZXIgJiYgc291bmRQbGF5ZXIuaXNCbGlwUGxheWluZygpKSkgewoJCQlpZiAoIWlzQW55QnV0dG9uSGVsZCAmJiBpc0FueUJ1dHRvbkRvd24oKSkgewoJCQkJLyogQ09OVElOVUUgRElBTE9HICovCgkJCQlpZiAoZGlhbG9nQnVmZmVyLkNhbkNvbnRpbnVlKCkpIHsKCQkJCQl2YXIgaGFzTW9yZURpYWxvZyA9IGRpYWxvZ0J1ZmZlci5Db250aW51ZSgpOwoJCQkJCWlmICghaGFzTW9yZURpYWxvZykgewoJCQkJCQkvLyBpZ25vcmUgY3VycmVudGx5IGhlbGQga2V5cyBVTlRJTCB0aGV5IGFyZSByZWxlYXNlZCAoc3RvcHMgcGxheWVyIGZyb20gaW5zdGEtbW92aW5nKQoJCQkJCQlpc0lnbm9yaW5nSW5wdXQgPSB0cnVlOwoJCQkJCQljdXJQbGF5ZXJEaXJlY3Rpb24gPSBEaXJlY3Rpb24uTm9uZTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlkaWFsb2dCdWZmZXIuU2tpcCgpOwoJCQkJfQoJCQl9CgkJfQoJfQoJZWxzZSBpZiAoaXNFbmRpbmcpIHsKCQlpZiAoIWlzQW55QnV0dG9uSGVsZCAmJiBpc0FueUJ1dHRvbkRvd24oKSkgewoJCQkvLyB0ZWxsIGdhbWUgdG8gcmVzdGFydAoJCQlpc0dhbWVPdmVyID0gdHJ1ZTsKCQl9Cgl9CgllbHNlIGlmICghaXNJZ25vcmluZ0lucHV0KSB7CgkJLyogV0FMSyAqLwoJCXZhciBwcmV2UGxheWVyRGlyZWN0aW9uID0gY3VyUGxheWVyRGlyZWN0aW9uOwoKCQlpZiAoYml0c3kuYnV0dG9uKGJpdHN5LkJUTl9VUCkpIHsKCQkJY3VyUGxheWVyRGlyZWN0aW9uID0gRGlyZWN0aW9uLlVwOwoJCX0KCQllbHNlIGlmIChiaXRzeS5idXR0b24oYml0c3kuQlROX0RPV04pKSB7CgkJCWN1clBsYXllckRpcmVjdGlvbiA9IERpcmVjdGlvbi5Eb3duOwoJCX0KCQllbHNlIGlmIChiaXRzeS5idXR0b24oYml0c3kuQlROX0xFRlQpKSB7CgkJCWN1clBsYXllckRpcmVjdGlvbiA9IERpcmVjdGlvbi5MZWZ0OwoJCX0KCQllbHNlIGlmIChiaXRzeS5idXR0b24oYml0c3kuQlROX1JJR0hUKSkgewoJCQljdXJQbGF5ZXJEaXJlY3Rpb24gPSBEaXJlY3Rpb24uUmlnaHQ7CgkJfQoJCWVsc2UgewoJCQljdXJQbGF5ZXJEaXJlY3Rpb24gPSBEaXJlY3Rpb24uTm9uZTsKCQl9CgoJCWlmIChjdXJQbGF5ZXJEaXJlY3Rpb24gIT0gRGlyZWN0aW9uLk5vbmUgJiYgY3VyUGxheWVyRGlyZWN0aW9uICE9IHByZXZQbGF5ZXJEaXJlY3Rpb24pIHsKCQkJbW92ZVBsYXllcihjdXJQbGF5ZXJEaXJlY3Rpb24sIHRydWUgLyogaXNGaXJzdE1vdmUgKi8pOwoJCQlwbGF5ZXJIb2xkVG9Nb3ZlVGltZXIgPSA1MDA7CgkJCS8vIHBsYXllckhvbGRUb01vdmVUaW1lciA9IDMyOyAvLyBQRVJGIFRFU1QKCQl9Cgl9CgoJaWYgKCFpc0FueUJ1dHRvbkRvd24oKSkgewoJCWlzSWdub3JpbmdJbnB1dCA9IGZhbHNlOwoJfQoKCS8vIHF1aXQgaWYgdGhlIHVzZXIgZXZlciBwcmVzc2VzIHRoZSByZXN0YXJ0IGJ1dHRvbgoJLy8gdG9kbyA6IHNob3VsZCBJIHJlbmFtZSBpdCBiaXRzeS5CVE5fUkVTVEFSVCBvciBiaXRzeS5CVE5fUVVJVCBvciBiaXRzeS5CVE5fT0ZGPwoJaWYgKGJpdHN5LmJ1dHRvbihiaXRzeS5CVE5fTUVOVSkpIHsKCQlpc0dhbWVPdmVyID0gdHJ1ZTsKCX0KCglpc0FueUJ1dHRvbkhlbGQgPSBpc0FueUJ1dHRvbkRvd24oKTsKfQoKdmFyIGFuaW1hdGlvbkNvdW50ZXIgPSAwOwp2YXIgYW5pbWF0aW9uVGltZSA9IDQwMDsKZnVuY3Rpb24gdXBkYXRlQW5pbWF0aW9uKGR0KSB7CglhbmltYXRpb25Db3VudGVyICs9IGR0OwoJLy8gYml0c3kubG9nKCJhbmltICIgKyBhbmltYXRpb25Db3VudGVyKTsKCWlmIChhbmltYXRpb25Db3VudGVyID49IGFuaW1hdGlvblRpbWUpIHsKCQkvLyBhbmltYXRlIHNwcml0ZXMKCQlmb3IgKGlkIGluIHNwcml0ZSkgewoJCQl2YXIgc3ByID0gc3ByaXRlW2lkXTsKCQkJaWYgKHNwci5hbmltYXRpb24uaXNBbmltYXRlZCkgewoJCQkJc3ByLmFuaW1hdGlvbi5mcmFtZUluZGV4ID0gKHNwci5hbmltYXRpb24uZnJhbWVJbmRleCArIDEpICUgc3ByLmFuaW1hdGlvbi5mcmFtZUNvdW50OwoJCQl9CgkJfQoKCQkvLyBhbmltYXRlIHRpbGVzCgkJZm9yIChpZCBpbiB0aWxlKSB7CgkJCXZhciB0aWwgPSB0aWxlW2lkXTsKCQkJaWYgKHRpbC5hbmltYXRpb24uaXNBbmltYXRlZCkgewoJCQkJdGlsLmFuaW1hdGlvbi5mcmFtZUluZGV4ID0gKHRpbC5hbmltYXRpb24uZnJhbWVJbmRleCArIDEpICUgdGlsLmFuaW1hdGlvbi5mcmFtZUNvdW50OwoJCQl9CgkJfQoKCQkvLyBhbmltYXRlIGl0ZW1zCgkJZm9yIChpZCBpbiBpdGVtKSB7CgkJCXZhciBpdG0gPSBpdGVtW2lkXTsKCQkJaWYgKGl0bS5hbmltYXRpb24uaXNBbmltYXRlZCkgewoJCQkJaXRtLmFuaW1hdGlvbi5mcmFtZUluZGV4ID0gKGl0bS5hbmltYXRpb24uZnJhbWVJbmRleCArIDEpICUgaXRtLmFuaW1hdGlvbi5mcmFtZUNvdW50OwoJCQl9CgkJfQoKCQkvLyByZXNldCBjb3VudGVyCgkJYW5pbWF0aW9uQ291bnRlciA9IDA7CgoJCS8vIHVwZGF0ZWQgYW5pbWF0aW9ucyB0aGlzIGZyYW1lCgkJcmV0dXJuIHRydWU7Cgl9CgoJLy8gZGlkICpub3QqIHVwZGF0ZSBhbmltYXRpb25zIHRoaXMgZnJhbWUKCXJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gcmVzZXRBbGxBbmltYXRpb25zKCkgewoJZm9yIChpZCBpbiBzcHJpdGUpIHsKCQl2YXIgc3ByID0gc3ByaXRlW2lkXTsKCQlpZiAoc3ByLmFuaW1hdGlvbi5pc0FuaW1hdGVkKSB7CgkJCXNwci5hbmltYXRpb24uZnJhbWVJbmRleCA9IDA7CgkJfQoJfQoKCWZvciAoaWQgaW4gdGlsZSkgewoJCXZhciB0aWwgPSB0aWxlW2lkXTsKCQlpZiAodGlsLmFuaW1hdGlvbi5pc0FuaW1hdGVkKSB7CgkJCXRpbC5hbmltYXRpb24uZnJhbWVJbmRleCA9IDA7CgkJfQoJfQoKCWZvciAoaWQgaW4gaXRlbSkgewoJCXZhciBpdG0gPSBpdGVtW2lkXTsKCQlpZiAoaXRtLmFuaW1hdGlvbi5pc0FuaW1hdGVkKSB7CgkJCWl0bS5hbmltYXRpb24uZnJhbWVJbmRleCA9IDA7CgkJfQoJfQp9CgpmdW5jdGlvbiBnZXRTcHJpdGVBdCh4LCB5LCByb29tSWQpIHsKCWlmIChyb29tSWQgPT09IHVuZGVmaW5lZCkgewoJCXJvb21JZCA9IHN0YXRlLnJvb207Cgl9CgoJZm9yIChpZCBpbiBzcHJpdGUpIHsKCQl2YXIgc3ByID0gc3ByaXRlW2lkXTsKCQlpZiAoc3ByLnJvb20gPT09IHJvb21JZCkgewoJCQlpZiAoc3ByLnggPT0geCAmJiBzcHIueSA9PSB5KSB7CgkJCQlyZXR1cm4gaWQ7CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIG51bGw7Cn0KCnZhciBEaXJlY3Rpb24gPSB7CglOb25lIDogLTEsCglVcCA6IDAsCglEb3duIDogMSwKCUxlZnQgOiAyLAoJUmlnaHQgOiAzCn07Cgp2YXIgY3VyUGxheWVyRGlyZWN0aW9uID0gRGlyZWN0aW9uLk5vbmU7CnZhciBwbGF5ZXJIb2xkVG9Nb3ZlVGltZXIgPSAwOwp2YXIgcGxheWVyUHJldlggPSAwOwp2YXIgcGxheWVyUHJldlkgPSAwOwoKZnVuY3Rpb24gbW92ZVBsYXllcihkaXJlY3Rpb24sIGlzRmlyc3RNb3ZlKSB7CglkaWRQbGF5ZXJNb3ZlID0gZmFsc2U7Cgl2YXIgcm9vbUlkcyA9IE9iamVjdC5rZXlzKHJvb20pOwoKCWlmIChwbGF5ZXIoKS5yb29tID09IG51bGwgfHwgcm9vbUlkcy5pbmRleE9mKHBsYXllcigpLnJvb20pIDwgMCkgewoJCXJldHVybjsgLy8gcGxheWVyIHJvb20gaXMgbWlzc2luZyBvciBpbnZhbGlkLi4gY2FuJ3QgbW92ZSB0aGVtIQoJfQoKCXZhciBzcHIgPSBudWxsOwoKCWlmIChkaXJlY3Rpb24gPT0gRGlyZWN0aW9uLkxlZnQgJiYgIShzcHIgPSBnZXRTcHJpdGVMZWZ0KCkpICYmICFpc1dhbGxMZWZ0KCkpIHsKCQlwbGF5ZXIoKS54IC09IDE7Cgl9CgllbHNlIGlmIChkaXJlY3Rpb24gPT0gRGlyZWN0aW9uLlJpZ2h0ICYmICEoc3ByID0gZ2V0U3ByaXRlUmlnaHQoKSkgJiYgIWlzV2FsbFJpZ2h0KCkpIHsKCQlwbGF5ZXIoKS54ICs9IDE7Cgl9CgllbHNlIGlmIChkaXJlY3Rpb24gPT0gRGlyZWN0aW9uLlVwICYmICEoc3ByID0gZ2V0U3ByaXRlVXAoKSkgJiYgIWlzV2FsbFVwKCkpIHsKCQlwbGF5ZXIoKS55IC09IDE7Cgl9CgllbHNlIGlmIChkaXJlY3Rpb24gPT0gRGlyZWN0aW9uLkRvd24gJiYgIShzcHIgPSBnZXRTcHJpdGVEb3duKCkpICYmICFpc1dhbGxEb3duKCkpIHsKCQlwbGF5ZXIoKS55ICs9IDE7Cgl9CgoJdmFyIGV4dCA9IGdldEV4aXQoIHBsYXllcigpLnJvb20sIHBsYXllcigpLngsIHBsYXllcigpLnkgKTsKCXZhciBlbmQgPSBnZXRFbmRpbmcoIHBsYXllcigpLnJvb20sIHBsYXllcigpLngsIHBsYXllcigpLnkgKTsKCXZhciBpdG1JbmRleCA9IGdldEl0ZW1JbmRleCggcGxheWVyKCkucm9vbSwgcGxheWVyKCkueCwgcGxheWVyKCkueSApOwoKCS8vIG9ubHkgcGxheSBvbmUgc291bmQgZWZmZWN0IHBlciAidHVybiIKCXZhciBibGlwSWQgPSBudWxsOwoKCS8vIGRvIGl0ZW1zIGZpcnN0LCBiZWNhdXNlIHlvdSBjYW4gcGljayB1cCBhbiBpdGVtIEFORCBnbyB0aHJvdWdoIGEgZG9vcgoJaWYgKGl0bUluZGV4ID4gLTEpIHsKCQl2YXIgaXRtID0gcm9vbVtwbGF5ZXIoKS5yb29tXS5pdGVtc1tpdG1JbmRleF07CgkJdmFyIGl0ZW1Sb29tID0gcGxheWVyKCkucm9vbTsKCgkJLy8gcGxheSBzb3VuZCBvbiBwaXRjayB1cCBpdGVtCgkJaWYgKGl0ZW1baXRtLmlkXS5ibGlwICE9IG51bGwpIHsKCQkJYmxpcElkID0gaXRlbVtpdG0uaWRdLmJsaXA7CgkJfQoKCQlzdGFydEl0ZW1EaWFsb2coaXRtLmlkLCBmdW5jdGlvbigpIHsKCQkJLy8gcmVtb3ZlIGl0ZW0gZnJvbSByb29tCgkJCXJvb21baXRlbVJvb21dLml0ZW1zLnNwbGljZShpdG1JbmRleCwgMSk7CgoJCQkvLyB1cGRhdGUgcGxheWVyIGludmVudG9yeQoJCQlpZiAocGxheWVyKCkuaW52ZW50b3J5W2l0bS5pZF0pIHsKCQkJCXBsYXllcigpLmludmVudG9yeVtpdG0uaWRdICs9IDE7CgkJCX0KCQkJZWxzZSB7CgkJCQlwbGF5ZXIoKS5pbnZlbnRvcnlbaXRtLmlkXSA9IDE7CgkJCX0KCgkJCS8vIHNob3cgaW52ZW50b3J5IGNoYW5nZSBpbiBVSQoJCQlpZiAob25JbnZlbnRvcnlDaGFuZ2VkICE9IG51bGwpIHsKCQkJCW9uSW52ZW50b3J5Q2hhbmdlZChpdG0uaWQpOwoJCQl9CgkJfSk7Cgl9CgoJaWYgKGVuZCkgewoJCXN0YXJ0RW5kaW5nRGlhbG9nKGVuZCk7Cgl9CgllbHNlIGlmIChleHQpIHsKCQltb3ZlUGxheWVyVGhyb3VnaEV4aXQoZXh0KTsKCX0KCWVsc2UgaWYgKHNwcikgewoJCS8vIHBsYXkgc291bmQgb24gZ3JlZXQgc3ByaXRlCgkJaWYgKHNwcml0ZVtzcHJdLmJsaXAgIT0gbnVsbCkgewoJCQlibGlwSWQgPSBzcHJpdGVbc3ByXS5ibGlwOwoJCX0KCgkJc3RhcnRTcHJpdGVEaWFsb2coc3ByIC8qc3ByaXRlSWQqLyk7Cgl9CgoJLy8gVE9ETyA6IG1heWJlIGFkZCBpbiBhIGZ1dHVyZSB1cGRhdGU/CgkvKgoJLy8gcGxheSBzb3VuZCB3aGVuIHBsYXllciBtb3ZlcyAoaWYgbm8gb3RoZXIgc291bmQgc2VsZWN0ZWQpCglpZiAoaXNGaXJzdE1vdmUgJiYgYmxpcElkID09PSBudWxsICYmIHNwcml0ZVtzdGF0ZS5hdmFdLmJsaXAgIT0gbnVsbCkgewoJCWJsaXBJZCA9IHNwcml0ZVtzdGF0ZS5hdmFdLmJsaXA7CgkJcmFuZG9taXplQmxpcCA9IHRydWU7CgkJYmxpcENoYW5uZWwgPSBiaXRzeS5TT1VORDI7IC8vIHBsYXkgd2Fsa2luZyBzZnggKnVuZGVyKiB0aGUgdHVuZSBtZWxvZHkKCX0KCSovCgoJaWYgKHNvdW5kUGxheWVyICYmIGJsaXBJZCAhPSBudWxsICYmIGJsaXBbYmxpcElkXSkgewoJCXNvdW5kUGxheWVyLnBsYXlCbGlwKGJsaXBbYmxpcElkXSk7Cgl9Cn0KCnZhciB0cmFuc2l0aW9uOwppZiAoZW5naW5lRmVhdHVyZUZsYWdzLmlzVHJhbnNpdGlvbkVuYWJsZWQpIHsKCXRyYW5zaXRpb24gPSBuZXcgVHJhbnNpdGlvbk1hbmFnZXIoKTsKfQoKZnVuY3Rpb24gbW92ZVBsYXllclRocm91Z2hFeGl0KGV4dCkgewoJdmFyIEdvVG9EZXN0ID0gZnVuY3Rpb24oKSB7CgkJaWYgKHRyYW5zaXRpb24gJiYgZXh0LnRyYW5zaXRpb25fZWZmZWN0ICE9IG51bGwpIHsKCQkJdHJhbnNpdGlvbi5CZWdpblRyYW5zaXRpb24oCgkJCQlwbGF5ZXIoKS5yb29tLAoJCQkJcGxheWVyKCkueCwKCQkJCXBsYXllcigpLnksCgkJCQlleHQuZGVzdC5yb29tLAoJCQkJZXh0LmRlc3QueCwKCQkJCWV4dC5kZXN0LnksCgkJCQlleHQudHJhbnNpdGlvbl9lZmZlY3QpOwoKCQkJdHJhbnNpdGlvbi5VcGRhdGVUcmFuc2l0aW9uKDApOwoKCQkJdHJhbnNpdGlvbi5PblRyYW5zaXRpb25Db21wbGV0ZShmdW5jdGlvbigpIHsKCQkJCXBsYXllcigpLnJvb20gPSBleHQuZGVzdC5yb29tOwoJCQkJcGxheWVyKCkueCA9IGV4dC5kZXN0Lng7CgkJCQlwbGF5ZXIoKS55ID0gZXh0LmRlc3QueTsKCQkJCXN0YXRlLnJvb20gPSBleHQuZGVzdC5yb29tOwoJCQkJaW5pdFJvb20oc3RhdGUucm9vbSk7CgkJCX0pOwoJCX0KCQllbHNlIHsKCQkJcGxheWVyKCkucm9vbSA9IGV4dC5kZXN0LnJvb207CgkJCXBsYXllcigpLnggPSBleHQuZGVzdC54OwoJCQlwbGF5ZXIoKS55ID0gZXh0LmRlc3QueTsKCQkJc3RhdGUucm9vbSA9IGV4dC5kZXN0LnJvb207CgoJCQlpbml0Um9vbShzdGF0ZS5yb29tKTsKCQl9Cgl9OwoKCWlmIChleHQuZGxnICE9IHVuZGVmaW5lZCAmJiBleHQuZGxnICE9IG51bGwpIHsKCQkvLyBUT0RPIDogSSBuZWVkIHRvIHNpbXBsaWZ5IGRpYWxvZyBjb2RlLAoJCS8vIHNvIEkgZG9uJ3QgaGF2ZSB0byBnZXQgdGhlIElEIGFuZCB0aGUgc291cmNlIHN0cgoJCS8vIGV2ZXJ5IHRpbWUhCgkJc3RhcnREaWFsb2coCgkJCWRpYWxvZ1tleHQuZGxnXS5zcmMsCgkJCWV4dC5kbGcsCgkJCWZ1bmN0aW9uKHJlc3VsdCkgewoJCQkJdmFyIGlzTG9ja2VkID0gZXh0LnByb3BlcnR5ICYmIGV4dC5wcm9wZXJ0eS5sb2NrZWQgPT09IHRydWU7CgkJCQlpZiAoIWlzTG9ja2VkKSB7CgkJCQkJR29Ub0Rlc3QoKTsKCQkJCX0KCQkJfSwKCQkJZXh0KTsKCX0KCWVsc2UgewoJCUdvVG9EZXN0KCk7Cgl9Cn0KCi8qIFBBTEVUVEUgSU5ESUNFUyAqLwp2YXIgYmFja2dyb3VuZEluZGV4ID0gMDsKdmFyIHRleHRCYWNrZ3JvdW5kSW5kZXggPSAxOwp2YXIgdGV4dEFycm93SW5kZXggPSAyOwp2YXIgdGV4dENvbG9ySW5kZXggPSAzOwoKLy8gcHJlY2FsY3VsYXRlZCByYWluYm93IGNvbG9ycwp2YXIgcmFpbmJvd0NvbG9yU3RhcnRJbmRleCA9IDQ7CnZhciByYWluYm93Q29sb3JDb3VudCA9IDEwOwp2YXIgcmFpbmJvd0NvbG9ycyA9IFsKCVsyNTUsMCwwXSwKCVsyNTUsMjE3LDBdLAoJWzc4LDI1NSwwXSwKCVswLDI1NSwxMjVdLAoJWzAsMTkyLDI1NV0sCglbMCwxOCwyNTVdLAoJWzEzNiwwLDI1NV0sCglbMjU1LDAsMjQyXSwKCVsyNTUsMCwxMzhdLAoJWzI1NSwwLDYxXSwKXTsKCmZ1bmN0aW9uIHVwZGF0ZVBhbGV0dGVXaXRoVGlsZUNvbG9ycyh0aWxlQ29sb3JzKSB7CgkvLyB0aGUgc2NyZWVuIGJhY2tncm91bmQgY29sb3Igc2hvdWxkIG1hdGNoIHRoZSBmaXJzdCB0aWxlIGNvbG9yCglpZiAodGlsZUNvbG9ycy5sZW5ndGggPiAwKSB7CgkJdmFyIGNvbG9yID0gdGlsZUNvbG9yc1swXTsKCQliaXRzeS5jb2xvcihiYWNrZ3JvdW5kSW5kZXgsIGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0pOwoJfQoJZWxzZSB7CgkJLy8gYXMgYSBmYWxsYmFjaywgdXNlIGJsYWNrIGFzIHRoZSBiYWNrZ3JvdW5kCgkJYml0c3kubG9nKCJubyB0aWxlIGNvbG9ycyEiKTsKCQliaXRzeS5jb2xvcihiYWNrZ3JvdW5kSW5kZXgsIDAsIDAsIDApOwoJfQoKCS8vIHRleHRib3ggY29sb3JzCgliaXRzeS5jb2xvcih0ZXh0QmFja2dyb3VuZEluZGV4LCAwLCAwLCAwKTsgLy8gYmxhY2sKCWJpdHN5LmNvbG9yKHRleHRBcnJvd0luZGV4LCAyNTUsIDI1NSwgMjU1KTsgLy8gd2hpdGUKCWJpdHN5LmNvbG9yKHRleHRDb2xvckluZGV4LCAyNTUsIDI1NSwgMjU1KTsgLy8gd2hpdGUKCgkvLyByYWluYm93IGNvbG9ycwoJZm9yICh2YXIgaSA9IDA7IGkgPCByYWluYm93Q29sb3JDb3VudDsgaSsrKSB7CgkJdmFyIGNvbG9yID0gcmFpbmJvd0NvbG9yc1tpXTsKCQliaXRzeS5jb2xvcihyYWluYm93Q29sb3JTdGFydEluZGV4ICsgaSwgY29sb3JbMF0sIGNvbG9yWzFdLCBjb2xvclsyXSk7Cgl9CgoJLy8gdGlsZSBjb2xvcnMKCWZvciAodmFyIGkgPSAwOyBpIDwgdGlsZUNvbG9ycy5sZW5ndGg7IGkrKykgewoJCXZhciBjb2xvciA9IHRpbGVDb2xvcnNbaV07CgkJYml0c3kuY29sb3IodGlsZUNvbG9yU3RhcnRJbmRleCArIGksIGNvbG9yWzBdLCBjb2xvclsxXSwgY29sb3JbMl0pOwoJfQp9CgpmdW5jdGlvbiB1cGRhdGVQYWxldHRlKHBhbElkKSB7CglzdGF0ZS5wYWwgPSBwYWxJZDsKCXZhciBwYWwgPSBwYWxldHRlW3N0YXRlLnBhbF07Cgl1cGRhdGVQYWxldHRlV2l0aFRpbGVDb2xvcnMocGFsLmNvbG9ycyk7Cn0KCmZ1bmN0aW9uIGluaXRSb29tKHJvb21JZCkgewoJYml0c3kubG9nKCJpbml0IHJvb20gIiArIHJvb21JZCk7CgoJdXBkYXRlUGFsZXR0ZShnZXRSb29tUGFsKHJvb21JZCkpOwoKCS8vIHVwZGF0ZSBhdmF0YXIgYXBwZWFyYW5jZQoJc3RhdGUuYXZhID0gKHJvb21bcm9vbUlkXS5hdmEgIT0gbnVsbCkgPyByb29tW3Jvb21JZF0uYXZhIDogcGxheWVySWQ7CgoJaWYgKHJlbmRlcmVyKSB7CgkJcmVuZGVyZXIuQ2xlYXJDYWNoZSgpOwoJfQoKCS8vIGluaXQgZXhpdCBwcm9wZXJ0aWVzCglzdGF0ZS5leGl0cyA9IFtdOwoJZm9yICh2YXIgaSA9IDA7IGkgPCByb29tW3Jvb21JZF0uZXhpdHMubGVuZ3RoOyBpKyspIHsKCQl2YXIgZXhpdCA9IGNyZWF0ZUV4aXREYXRhKAoJCQkvKiB4IAkJCSovIHJvb21bcm9vbUlkXS5leGl0c1tpXS54LAoJCQkvKiB5IAkJCSovIHJvb21bcm9vbUlkXS5leGl0c1tpXS55LAoJCQkvKiBkZXN0Um9vbSAJKi8gcm9vbVtyb29tSWRdLmV4aXRzW2ldLmRlc3Qucm9vbSwKCQkJLyogZGVzdFggCQkqLyByb29tW3Jvb21JZF0uZXhpdHNbaV0uZGVzdC54LAoJCQkvKiBkZXN0WSAJCSovIHJvb21bcm9vbUlkXS5leGl0c1tpXS5kZXN0LnksCgkJCS8qIHRyYW5zaXRpb24gCSovIHJvb21bcm9vbUlkXS5leGl0c1tpXS50cmFuc2l0aW9uX2VmZmVjdCwKCQkJLyogZGxnIAkJCSovIHJvb21bcm9vbUlkXS5leGl0c1tpXS5kbGcpOwoJCWV4aXQucHJvcGVydHkgPSB7IGxvY2tlZDogZmFsc2UgfTsKCgkJc3RhdGUuZXhpdHMucHVzaChleGl0KTsKCX0KCgkvLyBpbml0IGVuZGluZyBwcm9wZXJ0aWVzCglzdGF0ZS5lbmRpbmdzID0gW107Cglmb3IgKHZhciBpID0gMDsgaSA8IHJvb21bcm9vbUlkXS5lbmRpbmdzLmxlbmd0aDsgaSsrKSB7CgkJdmFyIGVuZCA9IGNyZWF0ZUVuZGluZ0RhdGEoCgkJCS8qIGlkICovIHJvb21bcm9vbUlkXS5lbmRpbmdzW2ldLmlkLAoJCQkvKiB4ICAqLyByb29tW3Jvb21JZF0uZW5kaW5nc1tpXS54LAoJCQkvKiB5ICAqLyByb29tW3Jvb21JZF0uZW5kaW5nc1tpXS55KTsKCQllbmQucHJvcGVydHkgPSB7IGxvY2tlZDogZmFsc2UgfTsKCgkJc3RhdGUuZW5kaW5ncy5wdXNoKGVuZCk7Cgl9CgoJaWYgKHNvdW5kUGxheWVyKSB7CgkJaWYgKCFyb29tW3Jvb21JZF0udHVuZSB8fCByb29tW3Jvb21JZF0udHVuZSA9PT0gIjAiIHx8ICF0dW5lW3Jvb21bcm9vbUlkXS50dW5lXSkgewoJCQkvLyBzdG9wIG11c2ljCgkJCXN0YXRlLnR1bmUgPSAiMCI7CgkJCXNvdW5kUGxheWVyLnN0b3BUdW5lKCk7CgkJfQoJCWVsc2UgaWYgKHJvb21bcm9vbUlkXS50dW5lICE9IHN0YXRlLnR1bmUpIHsKCQkJLy8gc3RhcnQgbXVzaWMKCQkJc3RhdGUudHVuZSA9IHJvb21bcm9vbUlkXS50dW5lOwoJCQlzb3VuZFBsYXllci5wbGF5VHVuZSh0dW5lW3N0YXRlLnR1bmVdKTsKCQl9Cgl9CgoJdmFyIGRyYXdBcmdzID0geyByZWRyYXdBbGw6IHRydWUgfTsKCWRyYXdSb29tKHJvb21bcm9vbUlkXSwgZHJhd0FyZ3MpOwoKCWlmIChvbkluaXRSb29tKSB7CgkJb25Jbml0Um9vbShyb29tSWQpOwoJfQp9CgpmdW5jdGlvbiBnZXRJdGVtSW5kZXgoIHJvb21JZCwgeCwgeSApIHsKCWZvciggdmFyIGkgPSAwOyBpIDwgcm9vbVtyb29tSWRdLml0ZW1zLmxlbmd0aDsgaSsrICkgewoJCXZhciBpdG0gPSByb29tW3Jvb21JZF0uaXRlbXNbaV07CgkJaWYgKCBpdG0ueCA9PSB4ICYmIGl0bS55ID09IHkpCgkJCXJldHVybiBpOwoJfQoJcmV0dXJuIC0xOwp9CgpmdW5jdGlvbiBnZXRTcHJpdGVMZWZ0KCkgeyAvL3JlcGV0aXRpdmU/CglyZXR1cm4gZ2V0U3ByaXRlQXQoIHBsYXllcigpLnggLSAxLCBwbGF5ZXIoKS55ICk7Cn0KCmZ1bmN0aW9uIGdldFNwcml0ZVJpZ2h0KCkgewoJcmV0dXJuIGdldFNwcml0ZUF0KCBwbGF5ZXIoKS54ICsgMSwgcGxheWVyKCkueSApOwp9CgpmdW5jdGlvbiBnZXRTcHJpdGVVcCgpIHsKCXJldHVybiBnZXRTcHJpdGVBdCggcGxheWVyKCkueCwgcGxheWVyKCkueSAtIDEgKTsKfQoKZnVuY3Rpb24gZ2V0U3ByaXRlRG93bigpIHsKCXJldHVybiBnZXRTcHJpdGVBdCggcGxheWVyKCkueCwgcGxheWVyKCkueSArIDEgKTsKfQoKZnVuY3Rpb24gaXNXYWxsTGVmdCgpIHsKCXJldHVybiAocGxheWVyKCkueCAtIDEgPCAwKSB8fCBpc1dhbGwoIHBsYXllcigpLnggLSAxLCBwbGF5ZXIoKS55ICk7Cn0KCmZ1bmN0aW9uIGlzV2FsbFJpZ2h0KCkgewoJcmV0dXJuIChwbGF5ZXIoKS54ICsgMSA+PSBiaXRzeS5NQVBfU0laRSkgfHwgaXNXYWxsKHBsYXllcigpLnggKyAxLCBwbGF5ZXIoKS55KTsKfQoKZnVuY3Rpb24gaXNXYWxsVXAoKSB7CglyZXR1cm4gKHBsYXllcigpLnkgLSAxIDwgMCkgfHwgaXNXYWxsKCBwbGF5ZXIoKS54LCBwbGF5ZXIoKS55IC0gMSApOwp9CgpmdW5jdGlvbiBpc1dhbGxEb3duKCkgewoJcmV0dXJuIChwbGF5ZXIoKS55ICsgMSA+PSBiaXRzeS5NQVBfU0laRSkgfHwgaXNXYWxsKHBsYXllcigpLngsIHBsYXllcigpLnkgKyAxKTsKfQoKZnVuY3Rpb24gaXNXYWxsKHgsIHksIHJvb21JZCkgewoJaWYgKHJvb21JZCA9PSB1bmRlZmluZWQgfHwgcm9vbUlkID09IG51bGwpIHsKCQlyb29tSWQgPSBzdGF0ZS5yb29tOwoJfQoKCXZhciB0aWxlSWQgPSBnZXRUaWxlKHgsIHksIHJvb21JZCk7CglpZiAodGlsZUlkID09PSAnMCcpIHsKCQlyZXR1cm4gZmFsc2U7IC8vIEJsYW5rIHNwYWNlcyBhcmVuJ3Qgd2FsbHMsIHlhIGRvb2Z1cwoJfQoKCWlmICh0aWxlW3RpbGVJZF0uaXNXYWxsID09PSB1bmRlZmluZWQgfHwgdGlsZVt0aWxlSWRdLmlzV2FsbCA9PT0gbnVsbCkgewoJCS8vIE5vIHdhbGwtc3RhdGUgZGVmaW5lZDogY2hlY2sgcm9vbS1zcGVjaWZpYyB3YWxscwoJCXZhciBpID0gcm9vbVtyb29tSWRdLndhbGxzLmluZGV4T2YoZ2V0VGlsZSh4LCB5LCByb29tSWQpKTsKCQlyZXR1cm4gKGkgPiAtMSk7Cgl9CgoJLy8gT3RoZXJ3aXNlLCB1c2UgdGhlIHRpbGUncyBvd24gd2FsbC1zdGF0ZQoJcmV0dXJuIHRpbGVbdGlsZUlkXS5pc1dhbGw7Cn0KCmZ1bmN0aW9uIGdldEl0ZW0ocm9vbUlkLHgseSkgewoJZm9yIChpIGluIHJvb21bcm9vbUlkXS5pdGVtcykgewoJCXZhciBpdGVtID0gcm9vbVtyb29tSWRdLml0ZW1zW2ldOwoJCWlmICh4ID09IGl0ZW0ueCAmJiB5ID09IGl0ZW0ueSkgewoJCQlyZXR1cm4gaXRlbTsKCQl9Cgl9CglyZXR1cm4gbnVsbDsKfQoKLy8gdG9kbyA6IHJvb21JZCBpc24ndCB1c2VmdWwgaW4gdGhlc2UgZnVuY3Rpb25zIGFueW1vcmUhIHNhZmUgdG8gcmVtb3ZlPwpmdW5jdGlvbiBnZXRFeGl0KHJvb21JZCwgeCwgeSkgewoJZm9yIChpIGluIHN0YXRlLmV4aXRzKSB7CgkJdmFyIGUgPSBzdGF0ZS5leGl0c1tpXTsKCQlpZiAoeCA9PSBlLnggJiYgeSA9PSBlLnkpIHsKCQkJcmV0dXJuIGU7CgkJfQoJfQoJcmV0dXJuIG51bGw7Cn0KCmZ1bmN0aW9uIGdldEVuZGluZyhyb29tSWQsIHgsIHkpIHsKCWZvciAoaSBpbiBzdGF0ZS5lbmRpbmdzKSB7CgkJdmFyIGUgPSBzdGF0ZS5lbmRpbmdzW2ldOwoJCWlmICh4ID09IGUueCAmJiB5ID09IGUueSkgewoJCQlyZXR1cm4gZTsKCQl9Cgl9CglyZXR1cm4gbnVsbDsKfQoKZnVuY3Rpb24gZ2V0VGlsZSh4LCB5LCByb29tSWQpIHsKCS8vIGJpdHN5LmxvZyh4ICsgIiAiICsgeSk7Cgl2YXIgdCA9IGdldFJvb20ocm9vbUlkKS50aWxlbWFwW3ldW3hdOwoJcmV0dXJuIHQ7Cn0KCmZ1bmN0aW9uIHBsYXllcigpIHsKCXJldHVybiBzcHJpdGVbcGxheWVySWRdOwp9CgovLyBTb3J0IG9mIGEgaGFjayBmb3IgbGVnYWN5IHBhbGV0dGUgY29kZSAod2hlbiBpdCB3YXMganVzdCBhbiBhcnJheSkKZnVuY3Rpb24gZ2V0UGFsKGlkKSB7CglpZiAocGFsZXR0ZVtpZF0gPT09IHVuZGVmaW5lZCkgewoJCWlkID0gImRlZmF1bHQiOwoJfQoKCXJldHVybiBwYWxldHRlWyBpZCBdLmNvbG9yczsKfQoKZnVuY3Rpb24gZ2V0Um9vbShpZCkgewoJcmV0dXJuIHJvb21baWQgPT09IHVuZGVmaW5lZCA/IHN0YXRlLnJvb20gOiBpZF07Cn0KCmZ1bmN0aW9uIGlzU3ByaXRlT2Zmc3RhZ2UoaWQpIHsKCXJldHVybiBzcHJpdGVbaWRdLnJvb20gPT0gbnVsbDsKfQoKZnVuY3Rpb24gc2VyaWFsaXplTm90ZShub3RlLCBrZXksIHVzZUZyaWVuZGx5TmFtZSkgewoJdmFyIGlzU29sZmEgPSAoa2V5ICE9IHVuZGVmaW5lZCAmJiBrZXkgIT0gbnVsbCk7Cgl2YXIgbm90ZVR5cGUgPSAoaXNTb2xmYSA9PT0gdHJ1ZSkgPyBTb2xmYSA6IE5vdGU7CgoJaWYgKGlzU29sZmEgJiYga2V5LnNjYWxlLmluZGV4T2Yobm90ZSkgPT09IC0xKSB7CgkJLy8gbm8gbWF0Y2hpbmcgbm90ZSBpbiBrZXkKCQlyZXR1cm4gbnVsbDsKCX0KCglpZiAoaXNTb2xmYSAmJiB1c2VGcmllbmRseU5hbWUgIT0gdHJ1ZSkgewoJCWZvciAodmFyIG5hbWUgaW4gU29sZmEpIHsKCQkJaWYgKFNvbGZhW25hbWVdID09PSBub3RlKSB7CgkJCQlyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpOwoJCQl9CgkJfQoKCQkvLyBubyBzb2xmYSBub3RlIGZvdW5kCgkJcmV0dXJuIG51bGw7Cgl9CgoJLy8gZm9yIGEgc29sZmEgbm90ZSdzICJmcmllbmRseSBuYW1lIiBjb252ZXJ0IHRvIHRoZSBjaHJvbWF0aWMgZXF1aXZhbGVudAoJaWYgKGlzU29sZmEgJiYgdXNlRnJpZW5kbHlOYW1lID09PSB0cnVlKSB7CgkJbm90ZSA9IGtleS5ub3Rlc1tub3RlXTsKCX0KCgkvLyBmcm9tIHRoaXMgcG9pbnQgb24sIHdlIGtub3cgdGhlIG5vdGUgd2UncmUgbG9va2luZyBmb3IgaXMgY2hyb21hdGljCglmb3IgKHZhciBuYW1lIGluIE5vdGUpIHsKCQlpZiAoTm90ZVtuYW1lXSA9PT0gbm90ZSkgewoJCQluYW1lID0gbmFtZS5yZXBsYWNlKCJfU0hBUlAiLCAiIyIpOwoJCQlpZiAodXNlRnJpZW5kbHlOYW1lID09PSB0cnVlICYmIG5hbWUgPT09ICJIIikgewoJCQkJbmFtZSA9ICJDIjsKCQkJfQoJCQlyZXR1cm4gbmFtZTsKCQl9Cgl9CgoJLy8gbm8gbm90ZSBmb3VuZAoJcmV0dXJuIHN5bWJvbDsKfQoKZnVuY3Rpb24gc2VyaWFsaXplT2N0YXZlKG9jdGF2ZSkgewoJZm9yICh2YXIgc3ltYm9sIGluIE9jdGF2ZSkgewoJCWlmIChPY3RhdmVbc3ltYm9sXSA9PT0gb2N0YXZlKSB7CgkJCXJldHVybiBzeW1ib2w7CgkJfQoJfQoKCS8vIGRlZmF1bHQgdG8gbWlkZGxlIG9jdGF2ZQoJcmV0dXJuICI0IjsKfQoKLy9UT0RPIHRoaXMgaXMgaW4gcHJvZ3Jlc3MgYW5kIGRvZXNuJ3Qgc3VwcG9ydCBhbGwgZmVhdHVyZXMKZnVuY3Rpb24gc2VyaWFsaXplV29ybGQoc2tpcEZvbnRzKSB7CglpZiAoc2tpcEZvbnRzID09PSB1bmRlZmluZWQgfHwgc2tpcEZvbnRzID09PSBudWxsKSB7CgkJc2tpcEZvbnRzID0gZmFsc2U7Cgl9CgoJLy8gdXBkYXRlIHZlcnNpb24gZmxhZ3MKCWZsYWdzLlZFUl9NQUogPSB2ZXJzaW9uLm1ham9yOwoJZmxhZ3MuVkVSX01JTiA9IHZlcnNpb24ubWlub3I7CgoJdmFyIHdvcmxkU3RyID0gIiI7CgkvKiBUSVRMRSAqLwoJd29ybGRTdHIgKz0gZ2V0VGl0bGUoKSArICJcbiI7Cgl3b3JsZFN0ciArPSAiXG4iOwoJLyogVkVSU0lPTiAqLwoJd29ybGRTdHIgKz0gIiMgQklUU1kgVkVSU0lPTiAiICsgZ2V0RW5naW5lVmVyc2lvbigpICsgIlxuIjsgLy8gYWRkIHZlcnNpb24gYXMgYSBjb21tZW50IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKCWlmICh2ZXJzaW9uLmRldkJ1aWxkUGhhc2UgIT0gIlJFTEVBU0UiKSB7CgkJd29ybGRTdHIgKz0gIiMgREVWRUxPUE1FTlQgQlVJTEQgLS0gIiArIHZlcnNpb24uZGV2QnVpbGRQaGFzZTsKCX0KCXdvcmxkU3RyICs9ICJcbiI7CgkvKiBGTEFHUyAqLwoJZm9yIChmIGluIGZsYWdzKSB7CgkJd29ybGRTdHIgKz0gIiEgIiArIGYgKyAiICIgKyBmbGFnc1tmXSArICJcbiI7Cgl9Cgl3b3JsZFN0ciArPSAiXG4iCgkvKiBGT05UICovCglpZiAoZm9udE5hbWUgIT0gZGVmYXVsdEZvbnROYW1lKSB7CgkJd29ybGRTdHIgKz0gIkRFRkFVTFRfRk9OVCAiICsgZm9udE5hbWUgKyAiXG4iOwoJCXdvcmxkU3RyICs9ICJcbiIKCX0KCWlmICh0ZXh0RGlyZWN0aW9uICE9IFRleHREaXJlY3Rpb24uTGVmdFRvUmlnaHQpIHsKCQl3b3JsZFN0ciArPSAiVEVYVF9ESVJFQ1RJT04gIiArIHRleHREaXJlY3Rpb24gKyAiXG4iOwoJCXdvcmxkU3RyICs9ICJcbiIKCX0KCS8qIFBBTEVUVEUgKi8KCWZvciAoaWQgaW4gcGFsZXR0ZSkgewoJCWlmIChpZCAhPSAiZGVmYXVsdCIpIHsKCQkJd29ybGRTdHIgKz0gIlBBTCAiICsgaWQgKyAiXG4iOwoJCQlmb3IgKGkgaW4gZ2V0UGFsKGlkKSkgewoJCQkJZm9yIChqIGluIGdldFBhbChpZClbaV0pIHsKCQkJCQl3b3JsZFN0ciArPSBnZXRQYWwoaWQpW2ldW2pdOwoJCQkJCWlmIChqIDwgMikgd29ybGRTdHIgKz0gIiwiOwoJCQkJfQoJCQkJd29ybGRTdHIgKz0gIlxuIjsKCQkJfQoJCQlpZiAocGFsZXR0ZVtpZF0ubmFtZSAhPSBudWxsKSB7CgkJCQl3b3JsZFN0ciArPSAiTkFNRSAiICsgcGFsZXR0ZVtpZF0ubmFtZSArICJcbiI7CgkJCX0KCQkJd29ybGRTdHIgKz0gIlxuIjsKCQl9Cgl9CgkvKiBST09NICovCglmb3IgKGlkIGluIHJvb20pIHsKCQl3b3JsZFN0ciArPSAiUk9PTSAiICsgaWQgKyAiXG4iOwoJCWlmICggZmxhZ3MuUk9PTV9GT1JNQVQgPT0gMCApIHsKCQkJLy8gb2xkIG5vbi1jb21tYSBzZXBhcmF0ZWQgZm9ybWF0CgkJCWZvciAoaSBpbiByb29tW2lkXS50aWxlbWFwKSB7CgkJCQlmb3IgKGogaW4gcm9vbVtpZF0udGlsZW1hcFtpXSkgewoJCQkJCXdvcmxkU3RyICs9IHJvb21baWRdLnRpbGVtYXBbaV1bal07CQoJCQkJfQoJCQkJd29ybGRTdHIgKz0gIlxuIjsKCQkJfQoJCX0KCQllbHNlIGlmICggZmxhZ3MuUk9PTV9GT1JNQVQgPT0gMSApIHsKCQkJLy8gbmV3IGNvbW1hIHNlcGFyYXRlZCBmb3JtYXQKCQkJZm9yIChpIGluIHJvb21baWRdLnRpbGVtYXApIHsKCQkJCWZvciAoaiBpbiByb29tW2lkXS50aWxlbWFwW2ldKSB7CgkJCQkJd29ybGRTdHIgKz0gcm9vbVtpZF0udGlsZW1hcFtpXVtqXTsKCQkJCQlpZiAoaiA8IHJvb21baWRdLnRpbGVtYXBbaV0ubGVuZ3RoLTEpIHdvcmxkU3RyICs9ICIsIgoJCQkJfQoJCQkJd29ybGRTdHIgKz0gIlxuIjsKCQkJfQoJCX0KCQlpZiAocm9vbVtpZF0ubmFtZSAhPSBudWxsKSB7CgkJCS8qIE5BTUUgKi8KCQkJd29ybGRTdHIgKz0gIk5BTUUgIiArIHJvb21baWRdLm5hbWUgKyAiXG4iOwoJCX0KCQlpZiAocm9vbVtpZF0ud2FsbHMubGVuZ3RoID4gMCkgewoJCQkvKiBXQUxMUyAqLwoJCQl3b3JsZFN0ciArPSAiV0FMICI7CgkJCWZvciAoaiBpbiByb29tW2lkXS53YWxscykgewoJCQkJd29ybGRTdHIgKz0gcm9vbVtpZF0ud2FsbHNbal07CgkJCQlpZiAoaiA8IHJvb21baWRdLndhbGxzLmxlbmd0aC0xKSB7CgkJCQkJd29ybGRTdHIgKz0gIiwiOwoJCQkJfQoJCQl9CgkJCXdvcmxkU3RyICs9ICJcbiI7CgkJfQoJCWlmIChyb29tW2lkXS5pdGVtcy5sZW5ndGggPiAwKSB7CgkJCS8qIElURU1TICovCgkJCWZvciAoaiBpbiByb29tW2lkXS5pdGVtcykgewoJCQkJdmFyIGl0bSA9IHJvb21baWRdLml0ZW1zW2pdOwoJCQkJd29ybGRTdHIgKz0gIklUTSAiICsgaXRtLmlkICsgIiAiICsgaXRtLnggKyAiLCIgKyBpdG0ueTsKCQkJCXdvcmxkU3RyICs9ICJcbiI7CgkJCX0KCQl9CgkJaWYgKHJvb21baWRdLmV4aXRzLmxlbmd0aCA+IDApIHsKCQkJLyogRVhJVFMgKi8KCQkJZm9yIChqIGluIHJvb21baWRdLmV4aXRzKSB7CgkJCQl2YXIgZSA9IHJvb21baWRdLmV4aXRzW2pdOwoJCQkJaWYgKCBpc0V4aXRWYWxpZChlKSApIHsKCQkJCQl3b3JsZFN0ciArPSAiRVhUICIgKyBlLnggKyAiLCIgKyBlLnkgKyAiICIgKyBlLmRlc3Qucm9vbSArICIgIiArIGUuZGVzdC54ICsgIiwiICsgZS5kZXN0Lnk7CgkJCQkJaWYgKGUudHJhbnNpdGlvbl9lZmZlY3QgIT0gdW5kZWZpbmVkICYmIGUudHJhbnNpdGlvbl9lZmZlY3QgIT0gbnVsbCkgewoJCQkJCQl3b3JsZFN0ciArPSAiIEZYICIgKyBlLnRyYW5zaXRpb25fZWZmZWN0OwoJCQkJCX0KCQkJCQlpZiAoZS5kbGcgIT0gdW5kZWZpbmVkICYmIGUuZGxnICE9IG51bGwpIHsKCQkJCQkJd29ybGRTdHIgKz0gIiBETEcgIiArIGUuZGxnOwoJCQkJCX0KCQkJCQl3b3JsZFN0ciArPSAiXG4iOwoJCQkJfQoJCQl9CgkJfQoJCWlmIChyb29tW2lkXS5lbmRpbmdzLmxlbmd0aCA+IDApIHsKCQkJLyogRU5ESU5HUyAqLwoJCQlmb3IgKGogaW4gcm9vbVtpZF0uZW5kaW5ncykgewoJCQkJdmFyIGUgPSByb29tW2lkXS5lbmRpbmdzW2pdOwoJCQkJLy8gdG9kbyBpc0VuZGluZ1ZhbGlkCgkJCQl3b3JsZFN0ciArPSAiRU5EICIgKyBlLmlkICsgIiAiICsgZS54ICsgIiwiICsgZS55OwoJCQkJd29ybGRTdHIgKz0gIlxuIjsKCQkJfQoJCX0KCQlpZiAocm9vbVtpZF0ucGFsICE9IG51bGwgJiYgcm9vbVtpZF0ucGFsICE9ICJkZWZhdWx0IikgewoJCQkvKiBQQUxFVFRFICovCgkJCXdvcmxkU3RyICs9ICJQQUwgIiArIHJvb21baWRdLnBhbCArICJcbiI7CgkJfQoJCWlmIChyb29tW2lkXS5hdmEgIT0gbnVsbCkgewoJCQkvKiBBVkFUQVIgU1BSSVRFICovCgkJCXdvcmxkU3RyICs9ICJBVkEgIiArIHJvb21baWRdLmF2YSArICJcbiI7CgkJfQoJCWlmIChyb29tW2lkXS50dW5lICE9IG51bGwgJiYgcm9vbVtpZF0udHVuZSAhPSAiMCIpIHsKCQkJLyogVFVORSAqLwoJCQl3b3JsZFN0ciArPSAiVFVORSAiICsgcm9vbVtpZF0udHVuZSArICJcbiI7CgkJfQoJCXdvcmxkU3RyICs9ICJcbiI7Cgl9CgkvKiBUSUxFUyAqLwoJZm9yIChpZCBpbiB0aWxlKSB7CgkJd29ybGRTdHIgKz0gIlRJTCAiICsgaWQgKyAiXG4iOwoJCXdvcmxkU3RyICs9IHNlcmlhbGl6ZURyYXdpbmcoICJUSUxfIiArIGlkICk7CgkJaWYgKHRpbGVbaWRdLm5hbWUgIT0gbnVsbCAmJiB0aWxlW2lkXS5uYW1lICE9IHVuZGVmaW5lZCkgewoJCQkvKiBOQU1FICovCgkJCXdvcmxkU3RyICs9ICJOQU1FICIgKyB0aWxlW2lkXS5uYW1lICsgIlxuIjsKCQl9CgkJaWYgKHRpbGVbaWRdLmlzV2FsbCAhPSBudWxsICYmIHRpbGVbaWRdLmlzV2FsbCAhPSB1bmRlZmluZWQpIHsKCQkJLyogV0FMTCAqLwoJCQl3b3JsZFN0ciArPSAiV0FMICIgKyB0aWxlW2lkXS5pc1dhbGwgKyAiXG4iOwoJCX0KCQlpZiAodGlsZVtpZF0uY29sICE9IG51bGwgJiYgdGlsZVtpZF0uY29sICE9IHVuZGVmaW5lZCAmJiB0aWxlW2lkXS5jb2wgIT0gMSkgewoJCQkvKiBDT0xPUiBPVkVSUklERSAqLwoJCQl3b3JsZFN0ciArPSAiQ09MICIgKyB0aWxlW2lkXS5jb2wgKyAiXG4iOwoJCX0KCQlpZiAodGlsZVtpZF0uYmdjICE9IG51bGwgJiYgdGlsZVtpZF0uYmdjICE9IHVuZGVmaW5lZCAmJiB0aWxlW2lkXS5iZ2MgIT0gMCkgewoJCQkvKiBCQUNLR1JPVU5EIENPTE9SIE9WRVJSSURFICovCgkJCWlmICh0aWxlW2lkXS5iZ2MgPCAwKSB7CgkJCQkvLyB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kCgkJCQl3b3JsZFN0ciArPSAiQkdDICpcbiI7CgkJCX0KCQkJZWxzZSB7CgkJCQl3b3JsZFN0ciArPSAiQkdDICIgKyB0aWxlW2lkXS5iZ2MgKyAiXG4iOwoJCQl9CgkJfQoJCXdvcmxkU3RyICs9ICJcbiI7Cgl9CgkvKiBTUFJJVEVTICovCglmb3IgKGlkIGluIHNwcml0ZSkgewoJCXdvcmxkU3RyICs9ICJTUFIgIiArIGlkICsgIlxuIjsKCQl3b3JsZFN0ciArPSBzZXJpYWxpemVEcmF3aW5nKCAiU1BSXyIgKyBpZCApOwoJCWlmIChzcHJpdGVbaWRdLm5hbWUgIT0gbnVsbCAmJiBzcHJpdGVbaWRdLm5hbWUgIT0gdW5kZWZpbmVkKSB7CgkJCS8qIE5BTUUgKi8KCQkJd29ybGRTdHIgKz0gIk5BTUUgIiArIHNwcml0ZVtpZF0ubmFtZSArICJcbiI7CgkJfQoJCWlmIChzcHJpdGVbaWRdLmRsZyAhPSBudWxsKSB7CgkJCXdvcmxkU3RyICs9ICJETEcgIiArIHNwcml0ZVtpZF0uZGxnICsgIlxuIjsKCQl9CgkJaWYgKHNwcml0ZVtpZF0ucm9vbSAhPSBudWxsKSB7CgkJCS8qIFNQUklURSBQT1NJVElPTiAqLwoJCQl3b3JsZFN0ciArPSAiUE9TICIgKyBzcHJpdGVbaWRdLnJvb20gKyAiICIgKyBzcHJpdGVbaWRdLnggKyAiLCIgKyBzcHJpdGVbaWRdLnkgKyAiXG4iOwoJCX0KCQlpZiAoc3ByaXRlW2lkXS5pbnZlbnRvcnkgIT0gbnVsbCkgewoJCQlmb3IoaXRlbUlkIGluIHNwcml0ZVtpZF0uaW52ZW50b3J5KSB7CgkJCQl3b3JsZFN0ciArPSAiSVRNICIgKyBpdGVtSWQgKyAiICIgKyBzcHJpdGVbaWRdLmludmVudG9yeVtpdGVtSWRdICsgIlxuIjsKCQkJfQoJCX0KCQlpZiAoc3ByaXRlW2lkXS5jb2wgIT0gbnVsbCAmJiBzcHJpdGVbaWRdLmNvbCAhPSB1bmRlZmluZWQgJiYgc3ByaXRlW2lkXS5jb2wgIT0gMikgewoJCQkvKiBDT0xPUiBPVkVSUklERSAqLwoJCQl3b3JsZFN0ciArPSAiQ09MICIgKyBzcHJpdGVbaWRdLmNvbCArICJcbiI7CgkJfQoJCWlmIChzcHJpdGVbaWRdLmJnYyAhPSBudWxsICYmIHNwcml0ZVtpZF0uYmdjICE9IHVuZGVmaW5lZCAmJiBzcHJpdGVbaWRdLmJnYyAhPSAwKSB7CgkJCS8qIEJBQ0tHUk9VTkQgQ09MT1IgT1ZFUlJJREUgKi8KCQkJaWYgKHNwcml0ZVtpZF0uYmdjIDwgMCkgewoJCQkJLy8gdHJhbnNwYXJlbnQgYmFja2dyb3VuZAoJCQkJd29ybGRTdHIgKz0gIkJHQyAqXG4iOwoJCQl9CgkJCWVsc2UgewoJCQkJd29ybGRTdHIgKz0gIkJHQyAiICsgc3ByaXRlW2lkXS5iZ2MgKyAiXG4iOwoJCQl9CgkJfQoJCWlmIChzcHJpdGVbaWRdLmJsaXAgIT0gbnVsbCAmJiBzcHJpdGVbaWRdLmJsaXAgIT0gdW5kZWZpbmVkKSB7CgkJCS8qIEJMSVAgKi8KCQkJd29ybGRTdHIgKz0gIkJMSVAgIiArIHNwcml0ZVtpZF0uYmxpcCArICJcbiI7CgkJfQoJCXdvcmxkU3RyICs9ICJcbiI7Cgl9CgkvKiBJVEVNUyAqLwoJZm9yIChpZCBpbiBpdGVtKSB7CgkJd29ybGRTdHIgKz0gIklUTSAiICsgaWQgKyAiXG4iOwoJCXdvcmxkU3RyICs9IHNlcmlhbGl6ZURyYXdpbmcoICJJVE1fIiArIGlkICk7CgkJaWYgKGl0ZW1baWRdLm5hbWUgIT0gbnVsbCAmJiBpdGVtW2lkXS5uYW1lICE9IHVuZGVmaW5lZCkgewoJCQkvKiBOQU1FICovCgkJCXdvcmxkU3RyICs9ICJOQU1FICIgKyBpdGVtW2lkXS5uYW1lICsgIlxuIjsKCQl9CgkJaWYgKGl0ZW1baWRdLmRsZyAhPSBudWxsKSB7CgkJCXdvcmxkU3RyICs9ICJETEcgIiArIGl0ZW1baWRdLmRsZyArICJcbiI7CgkJfQoJCWlmIChpdGVtW2lkXS5jb2wgIT0gbnVsbCAmJiBpdGVtW2lkXS5jb2wgIT0gdW5kZWZpbmVkICYmIGl0ZW1baWRdLmNvbCAhPSAyKSB7CgkJCS8qIENPTE9SIE9WRVJSSURFICovCgkJCXdvcmxkU3RyICs9ICJDT0wgIiArIGl0ZW1baWRdLmNvbCArICJcbiI7CgkJfQoJCWlmIChpdGVtW2lkXS5iZ2MgIT0gbnVsbCAmJiBpdGVtW2lkXS5iZ2MgIT0gdW5kZWZpbmVkICYmIGl0ZW1baWRdLmJnYyAhPSAwKSB7CgkJCS8qIEJBQ0tHUk9VTkQgQ09MT1IgT1ZFUlJJREUgKi8KCQkJaWYgKGl0ZW1baWRdLmJnYyA8IDApIHsKCQkJCS8vIHRyYW5zcGFyZW50IGJhY2tncm91bmQKCQkJCXdvcmxkU3RyICs9ICJCR0MgKlxuIjsKCQkJfQoJCQllbHNlIHsKCQkJCXdvcmxkU3RyICs9ICJCR0MgIiArIGl0ZW1baWRdLmJnYyArICJcbiI7CgkJCX0KCQl9CgkJaWYgKGl0ZW1baWRdLmJsaXAgIT0gbnVsbCAmJiBpdGVtW2lkXS5ibGlwICE9IHVuZGVmaW5lZCkgewoJCQkvKiBCTElQICovCgkJCXdvcmxkU3RyICs9ICJCTElQICIgKyBpdGVtW2lkXS5ibGlwICsgIlxuIjsKCQl9CgkJd29ybGRTdHIgKz0gIlxuIjsKCX0KCS8qIERJQUxPRyAqLwoJZm9yIChpZCBpbiBkaWFsb2cpIHsKCQlpZiAoaWQgIT0gdGl0bGVEaWFsb2dJZCkgewoJCQl3b3JsZFN0ciArPSAiRExHICIgKyBpZCArICJcbiI7CgkJCXdvcmxkU3RyICs9IGRpYWxvZ1tpZF0uc3JjICsgIlxuIjsKCQkJaWYgKGRpYWxvZ1tpZF0ubmFtZSAhPSBudWxsKSB7CgkJCQl3b3JsZFN0ciArPSAiTkFNRSAiICsgZGlhbG9nW2lkXS5uYW1lICsgIlxuIjsKCQkJfQoJCQl3b3JsZFN0ciArPSAiXG4iOwoJCX0KCX0KCS8qIEVORElOR1MgKGZvciBiYWNrd2FyZHMgY29tcGFiaWxpdHkgb25seSkgKi8KCWZvciAoaWQgaW4gZW5kKSB7CgkJd29ybGRTdHIgKz0gIkVORCAiICsgaWQgKyAiXG4iOwoJCXdvcmxkU3RyICs9IGVuZFtpZF0uc3JjICsgIlxuIjsKCQl3b3JsZFN0ciArPSAiXG4iOwoJfQoJLyogVkFSSUFCTEVTICovCglmb3IgKGlkIGluIHZhcmlhYmxlKSB7CgkJd29ybGRTdHIgKz0gIlZBUiAiICsgaWQgKyAiXG4iOwoJCXdvcmxkU3RyICs9IHZhcmlhYmxlW2lkXSArICJcbiI7CgkJd29ybGRTdHIgKz0gIlxuIjsKCX0KCS8qIFRVTkVTICovCglmb3IgKGlkIGluIHR1bmUpIHsKCQlpZiAoaWQgPT09ICIwIikgewoJCQljb250aW51ZTsKCQl9CgoJCXdvcmxkU3RyICs9ICJUVU5FICIgKyBpZCArICJcbiI7CgkJZm9yICh2YXIgaSA9IDA7IGkgPCBtYXhUdW5lTGVuZ3RoICYmIGkgPCB0dW5lW2lkXS5tZWxvZHkubGVuZ3RoOyBpKyspIHsKCQkJLy8gTUVMT0RZCgkJCWZvciAodmFyIGogPSAwOyBqIDwgYmFyTGVuZ3RoOyBqKyspIHsKCQkJCXZhciBub3RlU3RyID0gc2VyaWFsaXplTm90ZSh0dW5lW2lkXS5tZWxvZHlbaV1bal0ubm90ZSwgdHVuZVtpZF0ua2V5KTsKCQkJCWlmIChub3RlU3RyID09PSBudWxsKSB7CgkJCQkJdHVuZVtpZF0ubWVsb2R5W2ldW2pdLmJlYXRzID0gMDsKCQkJCX0KCQkJCWlmICh0dW5lW2lkXS5tZWxvZHlbaV1bal0uYmVhdHMgIT0gMSkgewoJCQkJCXdvcmxkU3RyICs9IHR1bmVbaWRdLm1lbG9keVtpXVtqXS5iZWF0czsKCQkJCX0KCQkJCWlmICh0dW5lW2lkXS5tZWxvZHlbaV1bal0uYmVhdHMgPiAwKSB7CgkJCQkJd29ybGRTdHIgKz0gbm90ZVN0cjsKCQkJCX0KCQkJCWlmICh0dW5lW2lkXS5tZWxvZHlbaV1bal0uYmVhdHMgPiAwICYmIHR1bmVbaWRdLm1lbG9keVtpXVtqXS5vY3RhdmUgIT0gT2N0YXZlWzRdKSB7CgkJCQkJd29ybGRTdHIgKz0gc2VyaWFsaXplT2N0YXZlKHR1bmVbaWRdLm1lbG9keVtpXVtqXS5vY3RhdmUpOwoJCQkJfQoJCQkJaWYgKHR1bmVbaWRdLm1lbG9keVtpXVtqXS5iZWF0cyA+IDAgJiYgdHVuZVtpZF0ubWVsb2R5W2ldW2pdLmJsaXAgIT0gdW5kZWZpbmVkKSB7CgkJCQkJLy8gdG9kbyA6IGNyZWF0ZSBjb25zdGFudCBmb3IgdGhlIGJsaXAgc2VwYXJhdG9yPwoJCQkJCXdvcmxkU3RyICs9ICJ+IiArIHR1bmVbaWRdLm1lbG9keVtpXVtqXS5ibGlwOwoJCQkJfQoJCQkJaWYgKGogPCAxNSkgewoJCQkJCXdvcmxkU3RyICs9ICIsIjsKCQkJCX0KCQkJfQoJCQl3b3JsZFN0ciArPSAiXG4iOwoKCQkJLy8gSEFSTU9OWQoJCQkvLyB0b2RvIDogbG90cyBvZiBjb3B5LXBhc3RpbmcgLSBJIGNvdWxkIHByb2JhYmx5IG1ha2Ugc29tZSBoZWxwZXIgZnVuY3Rpb25zIHRvIHNpbXBsaWZ5IHRoaXMKCQkJZm9yICh2YXIgaiA9IDA7IGogPCBiYXJMZW5ndGg7IGorKykgewoJCQkJdmFyIG5vdGVTdHIgPSBzZXJpYWxpemVOb3RlKHR1bmVbaWRdLmhhcm1vbnlbaV1bal0ubm90ZSwgdHVuZVtpZF0ua2V5KTsKCQkJCWlmIChub3RlU3RyID09PSBudWxsKSB7CgkJCQkJdHVuZVtpZF0uaGFybW9ueVtpXVtqXS5iZWF0cyA9IDA7CgkJCQl9CgkJCQlpZiAodHVuZVtpZF0uaGFybW9ueVtpXVtqXS5iZWF0cyAhPSAxKSB7CgkJCQkJd29ybGRTdHIgKz0gdHVuZVtpZF0uaGFybW9ueVtpXVtqXS5iZWF0czsKCQkJCX0KCQkJCWlmICh0dW5lW2lkXS5oYXJtb255W2ldW2pdLmJlYXRzID4gMCkgewoJCQkJCXdvcmxkU3RyICs9IG5vdGVTdHI7CgkJCQl9CgkJCQlpZiAodHVuZVtpZF0uaGFybW9ueVtpXVtqXS5iZWF0cyA+IDAgJiYgdHVuZVtpZF0uaGFybW9ueVtpXVtqXS5vY3RhdmUgIT0gT2N0YXZlWzRdKSB7CgkJCQkJd29ybGRTdHIgKz0gc2VyaWFsaXplT2N0YXZlKHR1bmVbaWRdLmhhcm1vbnlbaV1bal0ub2N0YXZlKTsKCQkJCX0KCQkJCWlmICh0dW5lW2lkXS5oYXJtb255W2ldW2pdLmJlYXRzID4gMCAmJiB0dW5lW2lkXS5oYXJtb255W2ldW2pdLmJsaXAgIT0gdW5kZWZpbmVkKSB7CgkJCQkJd29ybGRTdHIgKz0gIn4iICsgdHVuZVtpZF0uaGFybW9ueVtpXVtqXS5ibGlwOwoJCQkJfQoJCQkJaWYgKGogPCAxNSkgewoJCQkJCXdvcmxkU3RyICs9ICIsIjsKCQkJCX0KCQkJfQoJCQl3b3JsZFN0ciArPSAiXG4iOwoKCQkJaWYgKGkgPCAodHVuZVtpZF0ubWVsb2R5Lmxlbmd0aCAtIDEpKSB7CgkJCQl3b3JsZFN0ciArPSAiPiI7CgkJCQl3b3JsZFN0ciArPSAiXG4iOwoJCQl9CgkJfQoJCWlmICh0dW5lW2lkXS5uYW1lICE9IG51bGwpIHsKCQkJLyogTkFNRSAqLwoJCQl3b3JsZFN0ciArPSAiTkFNRSAiICsg",
  "sig": "81717d4ef0923d327aa4b094ed6ce8b25adf12911e51842360b6ef4af21e382150cf8a82d2deaa302fee31fd1a7143cfde702e443b7330a6a5cc1decdd22f9f4"
}

Note: Under active development, if you find a bug, please report it here GitHub & Reach out.