Event Details

This is a KIND 5391 event created on 2023-11-03 04:31:38 (10 months, 2 weeks ago). Debug this event chain.

{
  "id": "b694ff17167a9d4bcd7dae028e102ccd1a5dc69afc1218d92d0af1f524d1fd66",
  "pubkey": "e8ed3798c6ffebffa08501ac39e271662bfd160f688f94c45d692d8767dd345a",
  "created_at": 1698985898,
  "kind": "5391",
  "tags": [
    [
      "e",
      "7c90faab92915b934eaeac038f4d0d188fbe66569268d3acfe47add69bc9c638",
      "wss://dashglow-test.nostr1.com",
      "root"
    ],
    [
      "m",
      "text/javascript"
    ],
    [
      "alt",
      "This is a binary chunk of a web-based video game. Play the full game at https://crashglow.com/game/nevent1qqs8ey864wffzkunf6h2cqu0f5x33ra7vetfy6xn4nly0twkn0yuvwqpremhxue69uhkgctndpnkcmmh946x2um59ehx7um5wgcjucm0d5q3vamnwvaz7tmjv4kxz7fwwpexjmtpdshxuet5qy28wumn8ghj7un9d3shjtnyv9kh2uewd9hszymhwden5te0wfjkcctev93xcefwdaexwqg5waehxw309aex2mrp0yhxummnw3ezumt9qyxhwumn8ghj7mn0wvhxcmmvqyt8wumn8ghj7un9d3shjtnwdaehgu3wvfskueqzyr5w6duccml7hlaqs5q6cw0zw9nzhlgkpa5gl9xyt45jmpm8m5695qcyqqqqqqgk7zq5g"
    ],
    [
      "index",
      "4"
    ],
    [
      "x",
      "7c8a57a48656f34ac9a8dd31ca419e155b5ed28df1bd279c74ccdb220579e243"
    ]
  ],
  "content": "TUZTLmNyZWF0ZU5vZGUocGFyZW50LCBuYW1lLCBtb2RlLCBkZXYpOw0KICB9LA0KICByZW5hbWU6IGZ1bmN0aW9uKG9sZF9ub2RlLCBuZXdfZGlyLCBuZXdfbmFtZSkgew0KICAgaWYgKEZTLmlzRGlyKG9sZF9ub2RlLm1vZGUpKSB7DQogICAgdmFyIG5ld19ub2RlOw0KICAgIHRyeSB7DQogICAgIG5ld19ub2RlID0gRlMubG9va3VwTm9kZShuZXdfZGlyLCBuZXdfbmFtZSk7DQogICAgfSBjYXRjaCAoZSkge30NCiAgICBpZiAobmV3X25vZGUpIHsNCiAgICAgZm9yICh2YXIgaSBpbiBuZXdfbm9kZS5jb250ZW50cykgew0KICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PVEVNUFRZKTsNCiAgICAgfQ0KICAgIH0NCiAgIH0NCiAgIGRlbGV0ZSBvbGRfbm9kZS5wYXJlbnQuY29udGVudHNbb2xkX25vZGUubmFtZV07DQogICBvbGRfbm9kZS5uYW1lID0gbmV3X25hbWU7DQogICBuZXdfZGlyLmNvbnRlbnRzW25ld19uYW1lXSA9IG9sZF9ub2RlOw0KICAgb2xkX25vZGUucGFyZW50ID0gbmV3X2RpcjsNCiAgfSwNCiAgdW5saW5rOiBmdW5jdGlvbihwYXJlbnQsIG5hbWUpIHsNCiAgIGRlbGV0ZSBwYXJlbnQuY29udGVudHNbbmFtZV07DQogIH0sDQogIHJtZGlyOiBmdW5jdGlvbihwYXJlbnQsIG5hbWUpIHsNCiAgIHZhciBub2RlID0gRlMubG9va3VwTm9kZShwYXJlbnQsIG5hbWUpOw0KICAgZm9yICh2YXIgaSBpbiBub2RlLmNvbnRlbnRzKSB7DQogICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PVEVNUFRZKTsNCiAgIH0NCiAgIGRlbGV0ZSBwYXJlbnQuY29udGVudHNbbmFtZV07DQogIH0sDQogIHJlYWRkaXI6IGZ1bmN0aW9uKG5vZGUpIHsNCiAgIHZhciBlbnRyaWVzID0gWyAiLiIsICIuLiIgXTsNCiAgIGZvciAodmFyIGtleSBpbiBub2RlLmNvbnRlbnRzKSB7DQogICAgaWYgKCFub2RlLmNvbnRlbnRzLmhhc093blByb3BlcnR5KGtleSkpIHsNCiAgICAgY29udGludWU7DQogICAgfQ0KICAgIGVudHJpZXMucHVzaChrZXkpOw0KICAgfQ0KICAgcmV0dXJuIGVudHJpZXM7DQogIH0sDQogIHN5bWxpbms6IGZ1bmN0aW9uKHBhcmVudCwgbmV3bmFtZSwgb2xkcGF0aCkgew0KICAgdmFyIG5vZGUgPSBNRU1GUy5jcmVhdGVOb2RlKHBhcmVudCwgbmV3bmFtZSwgNTExIHwgNDA5NjAsIDApOw0KICAgbm9kZS5saW5rID0gb2xkcGF0aDsNCiAgIHJldHVybiBub2RlOw0KICB9LA0KICByZWFkbGluazogZnVuY3Rpb24obm9kZSkgew0KICAgaWYgKCFGUy5pc0xpbmsobm9kZS5tb2RlKSkgew0KICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCk7DQogICB9DQogICByZXR1cm4gbm9kZS5saW5rOw0KICB9DQogfSwNCiBzdHJlYW1fb3BzOiB7DQogIHJlYWQ6IGZ1bmN0aW9uKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24pIHsNCiAgIHZhciBjb250ZW50cyA9IHN0cmVhbS5ub2RlLmNvbnRlbnRzOw0KICAgaWYgKHBvc2l0aW9uID49IHN0cmVhbS5ub2RlLnVzZWRCeXRlcykgcmV0dXJuIDA7DQogICB2YXIgc2l6ZSA9IE1hdGgubWluKHN0cmVhbS5ub2RlLnVzZWRCeXRlcyAtIHBvc2l0aW9uLCBsZW5ndGgpOw0KICAgYXNzZXJ0KHNpemUgPj0gMCk7DQogICBpZiAoc2l6ZSA+IDggJiYgY29udGVudHMuc3ViYXJyYXkpIHsNCiAgICBidWZmZXIuc2V0KGNvbnRlbnRzLnN1YmFycmF5KHBvc2l0aW9uLCBwb3NpdGlvbiArIHNpemUpLCBvZmZzZXQpOw0KICAgfSBlbHNlIHsNCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykgYnVmZmVyW29mZnNldCArIGldID0gY29udGVudHNbcG9zaXRpb24gKyBpXTsNCiAgIH0NCiAgIHJldHVybiBzaXplOw0KICB9LA0KICB3cml0ZTogZnVuY3Rpb24oc3RyZWFtLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgY2FuT3duKSB7DQogICBpZiAoIWxlbmd0aCkgcmV0dXJuIDA7DQogICB2YXIgbm9kZSA9IHN0cmVhbS5ub2RlOw0KICAgbm9kZS50aW1lc3RhbXAgPSBEYXRlLm5vdygpOw0KICAgaWYgKGJ1ZmZlci5zdWJhcnJheSAmJiAoIW5vZGUuY29udGVudHMgfHwgbm9kZS5jb250ZW50cy5zdWJhcnJheSkpIHsNCiAgICBpZiAoY2FuT3duKSB7DQogICAgIG5vZGUuY29udGVudHMgPSBidWZmZXIuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpOw0KICAgICBub2RlLnVzZWRCeXRlcyA9IGxlbmd0aDsNCiAgICAgcmV0dXJuIGxlbmd0aDsNCiAgICB9IGVsc2UgaWYgKG5vZGUudXNlZEJ5dGVzID09PSAwICYmIHBvc2l0aW9uID09PSAwKSB7DQogICAgIG5vZGUuY29udGVudHMgPSBuZXcgVWludDhBcnJheShidWZmZXIuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpKTsNCiAgICAgbm9kZS51c2VkQnl0ZXMgPSBsZW5ndGg7DQogICAgIHJldHVybiBsZW5ndGg7DQogICAgfSBlbHNlIGlmIChwb3NpdGlvbiArIGxlbmd0aCA8PSBub2RlLnVzZWRCeXRlcykgew0KICAgICBub2RlLmNvbnRlbnRzLnNldChidWZmZXIuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpLCBwb3NpdGlvbik7DQogICAgIHJldHVybiBsZW5ndGg7DQogICAgfQ0KICAgfQ0KICAgTUVNRlMuZXhwYW5kRmlsZVN0b3JhZ2Uobm9kZSwgcG9zaXRpb24gKyBsZW5ndGgpOw0KICAgaWYgKG5vZGUuY29udGVudHMuc3ViYXJyYXkgJiYgYnVmZmVyLnN1YmFycmF5KSBub2RlLmNvbnRlbnRzLnNldChidWZmZXIuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpLCBwb3NpdGlvbik7IGVsc2Ugew0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgbm9kZS5jb250ZW50c1twb3NpdGlvbiArIGldID0gYnVmZmVyW29mZnNldCArIGldOw0KICAgIH0NCiAgIH0NCiAgIG5vZGUudXNlZEJ5dGVzID0gTWF0aC5tYXgobm9kZS51c2VkQnl0ZXMsIHBvc2l0aW9uICsgbGVuZ3RoKTsNCiAgIHJldHVybiBsZW5ndGg7DQogIH0sDQogIGxsc2VlazogZnVuY3Rpb24oc3RyZWFtLCBvZmZzZXQsIHdoZW5jZSkgew0KICAgdmFyIHBvc2l0aW9uID0gb2Zmc2V0Ow0KICAgaWYgKHdoZW5jZSA9PT0gMSkgew0KICAgIHBvc2l0aW9uICs9IHN0cmVhbS5wb3NpdGlvbjsNCiAgIH0gZWxzZSBpZiAod2hlbmNlID09PSAyKSB7DQogICAgaWYgKEZTLmlzRmlsZShzdHJlYW0ubm9kZS5tb2RlKSkgew0KICAgICBwb3NpdGlvbiArPSBzdHJlYW0ubm9kZS51c2VkQnl0ZXM7DQogICAgfQ0KICAgfQ0KICAgaWYgKHBvc2l0aW9uIDwgMCkgew0KICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCk7DQogICB9DQogICByZXR1cm4gcG9zaXRpb247DQogIH0sDQogIGFsbG9jYXRlOiBmdW5jdGlvbihzdHJlYW0sIG9mZnNldCwgbGVuZ3RoKSB7DQogICBNRU1GUy5leHBhbmRGaWxlU3RvcmFnZShzdHJlYW0ubm9kZSwgb2Zmc2V0ICsgbGVuZ3RoKTsNCiAgIHN0cmVhbS5ub2RlLnVzZWRCeXRlcyA9IE1hdGgubWF4KHN0cmVhbS5ub2RlLnVzZWRCeXRlcywgb2Zmc2V0ICsgbGVuZ3RoKTsNCiAgfSwNCiAgbW1hcDogZnVuY3Rpb24oc3RyZWFtLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgcHJvdCwgZmxhZ3MpIHsNCiAgIGlmICghRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpKSB7DQogICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PREVWKTsNCiAgIH0NCiAgIHZhciBwdHI7DQogICB2YXIgYWxsb2NhdGVkOw0KICAgdmFyIGNvbnRlbnRzID0gc3RyZWFtLm5vZGUuY29udGVudHM7DQogICBpZiAoIShmbGFncyAmIDIpICYmIChjb250ZW50cy5idWZmZXIgPT09IGJ1ZmZlciB8fCBjb250ZW50cy5idWZmZXIgPT09IGJ1ZmZlci5idWZmZXIpKSB7DQogICAgYWxsb2NhdGVkID0gZmFsc2U7DQogICAgcHRyID0gY29udGVudHMuYnl0ZU9mZnNldDsNCiAgIH0gZWxzZSB7DQogICAgaWYgKHBvc2l0aW9uID4gMCB8fCBwb3NpdGlvbiArIGxlbmd0aCA8IHN0cmVhbS5ub2RlLnVzZWRCeXRlcykgew0KICAgICBpZiAoY29udGVudHMuc3ViYXJyYXkpIHsNCiAgICAgIGNvbnRlbnRzID0gY29udGVudHMuc3ViYXJyYXkocG9zaXRpb24sIHBvc2l0aW9uICsgbGVuZ3RoKTsNCiAgICAgfSBlbHNlIHsNCiAgICAgIGNvbnRlbnRzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoY29udGVudHMsIHBvc2l0aW9uLCBwb3NpdGlvbiArIGxlbmd0aCk7DQogICAgIH0NCiAgICB9DQogICAgYWxsb2NhdGVkID0gdHJ1ZTsNCiAgICBwdHIgPSBfbWFsbG9jKGxlbmd0aCk7DQogICAgaWYgKCFwdHIpIHsNCiAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PTUVNKTsNCiAgICB9DQogICAgYnVmZmVyLnNldChjb250ZW50cywgcHRyKTsNCiAgIH0NCiAgIHJldHVybiB7DQogICAgcHRyOiBwdHIsDQogICAgYWxsb2NhdGVkOiBhbGxvY2F0ZWQNCiAgIH07DQogIH0sDQogIG1zeW5jOiBmdW5jdGlvbihzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIG1tYXBGbGFncykgew0KICAgaWYgKCFGUy5pc0ZpbGUoc3RyZWFtLm5vZGUubW9kZSkpIHsNCiAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9ERVYpOw0KICAgfQ0KICAgaWYgKG1tYXBGbGFncyAmIDIpIHsNCiAgICByZXR1cm4gMDsNCiAgIH0NCiAgIHZhciBieXRlc1dyaXR0ZW4gPSBNRU1GUy5zdHJlYW1fb3BzLndyaXRlKHN0cmVhbSwgYnVmZmVyLCAwLCBsZW5ndGgsIG9mZnNldCwgZmFsc2UpOw0KICAgcmV0dXJuIDA7DQogIH0NCiB9DQp9Ow0KDQp2YXIgSURCRlMgPSB7DQogZGJzOiB7fSwNCiBpbmRleGVkREI6IGZ1bmN0aW9uKCkgew0KICBpZiAodHlwZW9mIGluZGV4ZWREQiAhPT0gInVuZGVmaW5lZCIpIHJldHVybiBpbmRleGVkREI7DQogIHZhciByZXQgPSBudWxsOw0KICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gIm9iamVjdCIpIHJldCA9IHdpbmRvdy5pbmRleGVkREIgfHwgd2luZG93Lm1vekluZGV4ZWREQiB8fCB3aW5kb3cud2Via2l0SW5kZXhlZERCIHx8IHdpbmRvdy5tc0luZGV4ZWREQjsNCiAgYXNzZXJ0KHJldCwgIklEQkZTIHVzZWQsIGJ1dCBpbmRleGVkREIgbm90IHN1cHBvcnRlZCIpOw0KICByZXR1cm4gcmV0Ow0KIH0sDQogREJfVkVSU0lPTjogMjEsDQogREJfU1RPUkVfTkFNRTogIkZJTEVfREFUQSIsDQogbW91bnQ6IGZ1bmN0aW9uKG1vdW50KSB7DQogIHJldHVybiBNRU1GUy5tb3VudC5hcHBseShudWxsLCBhcmd1bWVudHMpOw0KIH0sDQogc3luY2ZzOiBmdW5jdGlvbihtb3VudCwgcG9wdWxhdGUsIGNhbGxiYWNrKSB7DQogIElEQkZTLmdldExvY2FsU2V0KG1vdW50LCBmdW5jdGlvbihlcnIsIGxvY2FsKSB7DQogICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTsNCiAgIElEQkZTLmdldFJlbW90ZVNldChtb3VudCwgZnVuY3Rpb24oZXJyLCByZW1vdGUpIHsNCiAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTsNCiAgICB2YXIgc3JjID0gcG9wdWxhdGUgPyByZW1vdGUgOiBsb2NhbDsNCiAgICB2YXIgZHN0ID0gcG9wdWxhdGUgPyBsb2NhbCA6IHJlbW90ZTsNCiAgICBJREJGUy5yZWNvbmNpbGUoc3JjLCBkc3QsIGNhbGxiYWNrKTsNCiAgIH0pOw0KICB9KTsNCiB9LA0KIGdldERCOiBmdW5jdGlvbihuYW1lLCBjYWxsYmFjaykgew0KICB2YXIgZGIgPSBJREJGUy5kYnNbbmFtZV07DQogIGlmIChkYikgew0KICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIGRiKTsNCiAgfQ0KICB2YXIgcmVxOw0KICB0cnkgew0KICAgcmVxID0gSURCRlMuaW5kZXhlZERCKCkub3BlbihuYW1lLCBJREJGUy5EQl9WRVJTSU9OKTsNCiAgfSBjYXRjaCAoZSkgew0KICAgcmV0dXJuIGNhbGxiYWNrKGUpOw0KICB9DQogIGlmICghcmVxKSB7DQogICByZXR1cm4gY2FsbGJhY2soIlVuYWJsZSB0byBjb25uZWN0IHRvIEluZGV4ZWREQiIpOw0KICB9DQogIHJlcS5vbnVwZ3JhZGVuZWVkZWQgPSBmdW5jdGlvbihlKSB7DQogICB2YXIgZGIgPSBlLnRhcmdldC5yZXN1bHQ7DQogICB2YXIgdHJhbnNhY3Rpb24gPSBlLnRhcmdldC50cmFuc2FjdGlvbjsNCiAgIHZhciBmaWxlU3RvcmU7DQogICBpZiAoZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhJREJGUy5EQl9TVE9SRV9OQU1FKSkgew0KICAgIGZpbGVTdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKElEQkZTLkRCX1NUT1JFX05BTUUpOw0KICAgfSBlbHNlIHsNCiAgICBmaWxlU3RvcmUgPSBkYi5jcmVhdGVPYmplY3RTdG9yZShJREJGUy5EQl9TVE9SRV9OQU1FKTsNCiAgIH0NCiAgIGlmICghZmlsZVN0b3JlLmluZGV4TmFtZXMuY29udGFpbnMoInRpbWVzdGFtcCIpKSB7DQogICAgZmlsZVN0b3JlLmNyZWF0ZUluZGV4KCJ0aW1lc3RhbXAiLCAidGltZXN0YW1wIiwgew0KICAgICB1bmlxdWU6IGZhbHNlDQogICAgfSk7DQogICB9DQogIH07DQogIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbigpIHsNCiAgIGRiID0gcmVxLnJlc3VsdDsNCiAgIElEQkZTLmRic1tuYW1lXSA9IGRiOw0KICAgY2FsbGJhY2sobnVsbCwgZGIpOw0KICB9Ow0KICByZXEub25lcnJvciA9IGZ1bmN0aW9uKGUpIHsNCiAgIGNhbGxiYWNrKHRoaXMuZXJyb3IpOw0KICAgZS5wcmV2ZW50RGVmYXVsdCgpOw0KICB9Ow0KIH0sDQogZ2V0TG9jYWxTZXQ6IGZ1bmN0aW9uKG1vdW50LCBjYWxsYmFjaykgew0KICB2YXIgZW50cmllcyA9IHt9Ow0KICBmdW5jdGlvbiBpc1JlYWxEaXIocCkgew0KICAgcmV0dXJuIHAgIT09ICIuIiAmJiBwICE9PSAiLi4iOw0KICB9DQogIGZ1bmN0aW9uIHRvQWJzb2x1dGUocm9vdCkgew0KICAgcmV0dXJuIGZ1bmN0aW9uKHApIHsNCiAgICByZXR1cm4gUEFUSC5qb2luMihyb290LCBwKTsNCiAgIH07DQogIH0NCiAgdmFyIGNoZWNrID0gRlMucmVhZGRpcihtb3VudC5tb3VudHBvaW50KS5maWx0ZXIoaXNSZWFsRGlyKS5tYXAodG9BYnNvbHV0ZShtb3VudC5tb3VudHBvaW50KSk7DQogIHdoaWxlIChjaGVjay5sZW5ndGgpIHsNCiAgIHZhciBwYXRoID0gY2hlY2sucG9wKCk7DQogICB2YXIgc3RhdDsNCiAgIHRyeSB7DQogICAgc3RhdCA9IEZTLnN0YXQocGF0aCk7DQogICB9IGNhdGNoIChlKSB7DQogICAgcmV0dXJuIGNhbGxiYWNrKGUpOw0KICAgfQ0KICAgaWYgKEZTLmlzRGlyKHN0YXQubW9kZSkpIHsNCiAgICBjaGVjay5wdXNoLmFwcGx5KGNoZWNrLCBGUy5yZWFkZGlyKHBhdGgpLmZpbHRlcihpc1JlYWxEaXIpLm1hcCh0b0Fic29sdXRlKHBhdGgpKSk7DQogICB9DQogICBlbnRyaWVzW3BhdGhdID0gew0KICAgIHRpbWVzdGFtcDogc3RhdC5tdGltZQ0KICAgfTsNCiAgfQ0KICByZXR1cm4gY2FsbGJhY2sobnVsbCwgew0KICAgdHlwZTogImxvY2FsIiwNCiAgIGVudHJpZXM6IGVudHJpZXMNCiAgfSk7DQogfSwNCiBnZXRSZW1vdGVTZXQ6IGZ1bmN0aW9uKG1vdW50LCBjYWxsYmFjaykgew0KICB2YXIgZW50cmllcyA9IHt9Ow0KICBJREJGUy5nZXREQihtb3VudC5tb3VudHBvaW50LCBmdW5jdGlvbihlcnIsIGRiKSB7DQogICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTsNCiAgIHRyeSB7DQogICAgdmFyIHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24oWyBJREJGUy5EQl9TVE9SRV9OQU1FIF0sICJyZWFkb25seSIpOw0KICAgIHRyYW5zYWN0aW9uLm9uZXJyb3IgPSBmdW5jdGlvbihlKSB7DQogICAgIGNhbGxiYWNrKHRoaXMuZXJyb3IpOw0KICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQogICAgfTsNCiAgICB2YXIgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShJREJGUy5EQl9TVE9SRV9OQU1FKTsNCiAgICB2YXIgaW5kZXggPSBzdG9yZS5pbmRleCgidGltZXN0YW1wIik7DQogICAgaW5kZXgub3BlbktleUN1cnNvcigpLm9uc3VjY2VzcyA9IGZ1bmN0aW9uKGV2ZW50KSB7DQogICAgIHZhciBjdXJzb3IgPSBldmVudC50YXJnZXQucmVzdWx0Ow0KICAgICBpZiAoIWN1cnNvcikgew0KICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHsNCiAgICAgICB0eXBlOiAicmVtb3RlIiwNCiAgICAgICBkYjogZGIsDQogICAgICAgZW50cmllczogZW50cmllcw0KICAgICAgfSk7DQogICAgIH0NCiAgICAgZW50cmllc1tjdXJzb3IucHJpbWFyeUtleV0gPSB7DQogICAgICB0aW1lc3RhbXA6IGN1cnNvci5rZXkNCiAgICAgfTsNCiAgICAgY3Vyc29yLmNvbnRpbnVlKCk7DQogICAgfTsNCiAgIH0gY2F0Y2ggKGUpIHsNCiAgICByZXR1cm4gY2FsbGJhY2soZSk7DQogICB9DQogIH0pOw0KIH0sDQogbG9hZExvY2FsRW50cnk6IGZ1bmN0aW9uKHBhdGgsIGNhbGxiYWNrKSB7DQogIHZhciBzdGF0LCBub2RlOw0KICB0cnkgew0KICAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgocGF0aCk7DQogICBub2RlID0gbG9va3VwLm5vZGU7DQogICBzdGF0ID0gRlMuc3RhdChwYXRoKTsNCiAgfSBjYXRjaCAoZSkgew0KICAgcmV0dXJuIGNhbGxiYWNrKGUpOw0KICB9DQogIGlmIChGUy5pc0RpcihzdGF0Lm1vZGUpKSB7DQogICByZXR1cm4gY2FsbGJhY2sobnVsbCwgew0KICAgIHRpbWVzdGFtcDogc3RhdC5tdGltZSwNCiAgICBtb2RlOiBzdGF0Lm1vZGUNCiAgIH0pOw0KICB9IGVsc2UgaWYgKEZTLmlzRmlsZShzdGF0Lm1vZGUpKSB7DQogICBub2RlLmNvbnRlbnRzID0gTUVNRlMuZ2V0RmlsZURhdGFBc1R5cGVkQXJyYXkobm9kZSk7DQogICByZXR1cm4gY2FsbGJhY2sobnVsbCwgew0KICAgIHRpbWVzdGFtcDogc3RhdC5tdGltZSwNCiAgICBtb2RlOiBzdGF0Lm1vZGUsDQogICAgY29udGVudHM6IG5vZGUuY29udGVudHMNCiAgIH0pOw0KICB9IGVsc2Ugew0KICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcigibm9kZSB0eXBlIG5vdCBzdXBwb3J0ZWQiKSk7DQogIH0NCiB9LA0KIHN0b3JlTG9jYWxFbnRyeTogZnVuY3Rpb24ocGF0aCwgZW50cnksIGNhbGxiYWNrKSB7DQogIHRyeSB7DQogICBpZiAoRlMuaXNEaXIoZW50cnkubW9kZSkpIHsNCiAgICBGUy5ta2RpcihwYXRoLCBlbnRyeS5tb2RlKTsNCiAgIH0gZWxzZSBpZiAoRlMuaXNGaWxlKGVudHJ5Lm1vZGUpKSB7DQogICAgRlMud3JpdGVGaWxlKHBhdGgsIGVudHJ5LmNvbnRlbnRzLCB7DQogICAgIGNhbk93bjogdHJ1ZQ0KICAgIH0pOw0KICAgfSBlbHNlIHsNCiAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKCJub2RlIHR5cGUgbm90IHN1cHBvcnRlZCIpKTsNCiAgIH0NCiAgIEZTLmNobW9kKHBhdGgsIGVudHJ5Lm1vZGUpOw0KICAgRlMudXRpbWUocGF0aCwgZW50cnkudGltZXN0YW1wLCBlbnRyeS50aW1lc3RhbXApOw0KICB9IGNhdGNoIChlKSB7DQogICByZXR1cm4gY2FsbGJhY2soZSk7DQogIH0NCiAgY2FsbGJhY2sobnVsbCk7DQogfSwNCiByZW1vdmVMb2NhbEVudHJ5OiBmdW5jdGlvbihwYXRoLCBjYWxsYmFjaykgew0KICB0cnkgew0KICAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgocGF0aCk7DQogICB2YXIgc3RhdCA9IEZTLnN0YXQocGF0aCk7DQogICBpZiAoRlMuaXNEaXIoc3RhdC5tb2RlKSkgew0KICAgIEZTLnJtZGlyKHBhdGgpOw0KICAgfSBlbHNlIGlmIChGUy5pc0ZpbGUoc3RhdC5tb2RlKSkgew0KICAgIEZTLnVubGluayhwYXRoKTsNCiAgIH0NCiAgfSBjYXRjaCAoZSkgew0KICAgcmV0dXJuIGNhbGxiYWNrKGUpOw0KICB9DQogIGNhbGxiYWNrKG51bGwpOw0KIH0sDQogbG9hZFJlbW90ZUVudHJ5OiBmdW5jdGlvbihzdG9yZSwgcGF0aCwgY2FsbGJhY2spIHsNCiAgdmFyIHJlcSA9IHN0b3JlLmdldChwYXRoKTsNCiAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uKGV2ZW50KSB7DQogICBjYWxsYmFjayhudWxsLCBldmVudC50YXJnZXQucmVzdWx0KTsNCiAgfTsNCiAgcmVxLm9uZXJyb3IgPSBmdW5jdGlvbihlKSB7DQogICBjYWxsYmFjayh0aGlzLmVycm9yKTsNCiAgIGUucHJldmVudERlZmF1bHQoKTsNCiAgfTsNCiB9LA0KIHN0b3JlUmVtb3RlRW50cnk6IGZ1bmN0aW9uKHN0b3JlLCBwYXRoLCBlbnRyeSwgY2FsbGJhY2spIHsNCiAgdmFyIHJlcSA9IHN0b3JlLnB1dChlbnRyeSwgcGF0aCk7DQogIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbigpIHsNCiAgIGNhbGxiYWNrKG51bGwpOw0KICB9Ow0KICByZXEub25lcnJvciA9IGZ1bmN0aW9uKGUpIHsNCiAgIGNhbGxiYWNrKHRoaXMuZXJyb3IpOw0KICAgZS5wcmV2ZW50RGVmYXVsdCgpOw0KICB9Ow0KIH0sDQogcmVtb3ZlUmVtb3RlRW50cnk6IGZ1bmN0aW9uKHN0b3JlLCBwYXRoLCBjYWxsYmFjaykgew0KICB2YXIgcmVxID0gc3RvcmUuZGVsZXRlKHBhdGgpOw0KICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24oKSB7DQogICBjYWxsYmFjayhudWxsKTsNCiAgfTsNCiAgcmVxLm9uZXJyb3IgPSBmdW5jdGlvbihlKSB7DQogICBjYWxsYmFjayh0aGlzLmVycm9yKTsNCiAgIGUucHJldmVudERlZmF1bHQoKTsNCiAgfTsNCiB9LA0KIHJlY29uY2lsZTogZnVuY3Rpb24oc3JjLCBkc3QsIGNhbGxiYWNrKSB7DQogIHZhciB0b3RhbCA9IDA7DQogIHZhciBjcmVhdGUgPSBbXTsNCiAgT2JqZWN0LmtleXMoc3JjLmVudHJpZXMpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7DQogICB2YXIgZSA9IHNyYy5lbnRyaWVzW2tleV07DQogICB2YXIgZTIgPSBkc3QuZW50cmllc1trZXldOw0KICAgaWYgKCFlMiB8fCBlLnRpbWVzdGFtcCA+IGUyLnRpbWVzdGFtcCkgew0KICAgIGNyZWF0ZS5wdXNoKGtleSk7DQogICAgdG90YWwrKzsNCiAgIH0NCiAgfSk7DQogIHZhciByZW1vdmUgPSBbXTsNCiAgT2JqZWN0LmtleXMoZHN0LmVudHJpZXMpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7DQogICB2YXIgZSA9IGRzdC5lbnRyaWVzW2tleV07DQogICB2YXIgZTIgPSBzcmMuZW50cmllc1trZXldOw0KICAgaWYgKCFlMikgew0KICAgIHJlbW92ZS5wdXNoKGtleSk7DQogICAgdG90YWwrKzsNCiAgIH0NCiAgfSk7DQogIGlmICghdG90YWwpIHsNCiAgIHJldHVybiBjYWxsYmFjayhudWxsKTsNCiAgfQ0KICB2YXIgZXJyb3JlZCA9IGZhbHNlOw0KICB2YXIgY29tcGxldGVkID0gMDsNCiAgdmFyIGRiID0gc3JjLnR5cGUgPT09ICJyZW1vdGUiID8gc3JjLmRiIDogZHN0LmRiOw0KICB2YXIgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbihbIElEQkZTLkRCX1NUT1JFX05BTUUgXSwgInJlYWR3cml0ZSIpOw0KICB2YXIgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShJREJGUy5EQl9TVE9SRV9OQU1FKTsNCiAgZnVuY3Rpb24gZG9uZShlcnIpIHsNCiAgIGlmIChlcnIpIHsNCiAgICBpZiAoIWRvbmUuZXJyb3JlZCkgew0KICAgICBkb25lLmVycm9yZWQgPSB0cnVlOw0KICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTsNCiAgICB9DQogICAgcmV0dXJuOw0KICAgfQ0KICAgaWYgKCsrY29tcGxldGVkID49IHRvdGFsKSB7DQogICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpOw0KICAgfQ0KICB9DQogIHRyYW5zYWN0aW9uLm9uZXJyb3IgPSBmdW5jdGlvbihlKSB7DQogICBkb25lKHRoaXMuZXJyb3IpOw0KICAgZS5wcmV2ZW50RGVmYXVsdCgpOw0KICB9Ow0KICBjcmVhdGUuc29ydCgpLmZvckVhY2goZnVuY3Rpb24ocGF0aCkgew0KICAgaWYgKGRzdC50eXBlID09PSAibG9jYWwiKSB7DQogICAgSURCRlMubG9hZFJlbW90ZUVudHJ5KHN0b3JlLCBwYXRoLCBmdW5jdGlvbihlcnIsIGVudHJ5KSB7DQogICAgIGlmIChlcnIpIHJldHVybiBkb25lKGVycik7DQogICAgIElEQkZTLnN0b3JlTG9jYWxFbnRyeShwYXRoLCBlbnRyeSwgZG9uZSk7DQogICAgfSk7DQogICB9IGVsc2Ugew0KICAgIElEQkZTLmxvYWRMb2NhbEVudHJ5KHBhdGgsIGZ1bmN0aW9uKGVyciwgZW50cnkpIHsNCiAgICAgaWYgKGVycikgcmV0dXJuIGRvbmUoZXJyKTsNCiAgICAgSURCRlMuc3RvcmVSZW1vdGVFbnRyeShzdG9yZSwgcGF0aCwgZW50cnksIGRvbmUpOw0KICAgIH0pOw0KICAgfQ0KICB9KTsNCiAgcmVtb3ZlLnNvcnQoKS5yZXZlcnNlKCkuZm9yRWFjaChmdW5jdGlvbihwYXRoKSB7DQogICBpZiAoZHN0LnR5cGUgPT09ICJsb2NhbCIpIHsNCiAgICBJREJGUy5yZW1vdmVMb2NhbEVudHJ5KHBhdGgsIGRvbmUpOw0KICAgfSBlbHNlIHsNCiAgICBJREJGUy5yZW1vdmVSZW1vdGVFbnRyeShzdG9yZSwgcGF0aCwgZG9uZSk7DQogICB9DQogIH0pOw0KIH0NCn07DQoNCnZhciBOT0RFRlMgPSB7DQogaXNXaW5kb3dzOiBmYWxzZSwNCiBzdGF0aWNJbml0OiBmdW5jdGlvbigpIHsNCiAgTk9ERUZTLmlzV2luZG93cyA9ICEhcHJvY2Vzcy5wbGF0Zm9ybS5tYXRjaCgvXndpbi8pOw0KICB2YXIgZmxhZ3MgPSBwcm9jZXNzWyJiaW5kaW5nIl0oImNvbnN0YW50cyIpOw0KICBpZiAoZmxhZ3NbImZzIl0pIHsNCiAgIGZsYWdzID0gZmxhZ3NbImZzIl07DQogIH0NCiAgTk9ERUZTLmZsYWdzRm9yTm9kZU1hcCA9IHsNCiAgIDEwMjQ6IGZsYWdzWyJPX0FQUEVORCJdLA0KICAgNjQ6IGZsYWdzWyJPX0NSRUFUIl0sDQogICAxMjg6IGZsYWdzWyJPX0VYQ0wiXSwNCiAgIDA6IGZsYWdzWyJPX1JET05MWSJdLA0KICAgMjogZmxhZ3NbIk9fUkRXUiJdLA0KICAgNDA5NjogZmxhZ3NbIk9fU1lOQyJdLA0KICAgNTEyOiBmbGFnc1siT19UUlVOQyJdLA0KICAgMTogZmxhZ3NbIk9fV1JPTkxZIl0NCiAgfTsNCiB9LA0KIGJ1ZmZlckZyb206IGZ1bmN0aW9uKGFycmF5QnVmZmVyKSB7DQogIHJldHVybiBCdWZmZXIuYWxsb2MgPyBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlcikgOiBuZXcgQnVmZmVyKGFycmF5QnVmZmVyKTsNCiB9LA0KIG1vdW50OiBmdW5jdGlvbihtb3VudCkgew0KICBhc3NlcnQoRU5WSVJPTk1FTlRfSVNfTk9ERSk7DQogIHJldHVybiBOT0RFRlMuY3JlYXRlTm9kZShudWxsLCAiLyIsIE5PREVGUy5nZXRNb2RlKG1vdW50Lm9wdHMucm9vdCksIDApOw0KIH0sDQogY3JlYXRlTm9kZTogZnVuY3Rpb24ocGFyZW50LCBuYW1lLCBtb2RlLCBkZXYpIHsNCiAgaWYgKCFGUy5pc0Rpcihtb2RlKSAmJiAhRlMuaXNGaWxlKG1vZGUpICYmICFGUy5pc0xpbmsobW9kZSkpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCk7DQogIH0NCiAgdmFyIG5vZGUgPSBGUy5jcmVhdGVOb2RlKHBhcmVudCwgbmFtZSwgbW9kZSk7DQogIG5vZGUubm9kZV9vcHMgPSBOT0RFRlMubm9kZV9vcHM7DQogIG5vZGUuc3RyZWFtX29wcyA9IE5PREVGUy5zdHJlYW1fb3BzOw0KICByZXR1cm4gbm9kZTsNCiB9LA0KIGdldE1vZGU6IGZ1bmN0aW9uKHBhdGgpIHsNCiAgdmFyIHN0YXQ7DQogIHRyeSB7DQogICBzdGF0ID0gZnMubHN0YXRTeW5jKHBhdGgpOw0KICAgaWYgKE5PREVGUy5pc1dpbmRvd3MpIHsNCiAgICBzdGF0Lm1vZGUgPSBzdGF0Lm1vZGUgfCAoc3RhdC5tb2RlICYgMjkyKSA+PiAyOw0KICAgfQ0KICB9IGNhdGNoIChlKSB7DQogICBpZiAoIWUuY29kZSkgdGhyb3cgZTsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTW2UuY29kZV0pOw0KICB9DQogIHJldHVybiBzdGF0Lm1vZGU7DQogfSwNCiByZWFsUGF0aDogZnVuY3Rpb24obm9kZSkgew0KICB2YXIgcGFydHMgPSBbXTsNCiAgd2hpbGUgKG5vZGUucGFyZW50ICE9PSBub2RlKSB7DQogICBwYXJ0cy5wdXNoKG5vZGUubmFtZSk7DQogICBub2RlID0gbm9kZS5wYXJlbnQ7DQogIH0NCiAgcGFydHMucHVzaChub2RlLm1vdW50Lm9wdHMucm9vdCk7DQogIHBhcnRzLnJldmVyc2UoKTsNCiAgcmV0dXJuIFBBVEguam9pbi5hcHBseShudWxsLCBwYXJ0cyk7DQogfSwNCiBmbGFnc0Zvck5vZGU6IGZ1bmN0aW9uKGZsYWdzKSB7DQogIGZsYWdzICY9IH4yMDk3MTUyOw0KICBmbGFncyAmPSB+MjA0ODsNCiAgZmxhZ3MgJj0gfjMyNzY4Ow0KICBmbGFncyAmPSB+NTI0Mjg4Ow0KICB2YXIgbmV3RmxhZ3MgPSAwOw0KICBmb3IgKHZhciBrIGluIE5PREVGUy5mbGFnc0Zvck5vZGVNYXApIHsNCiAgIGlmIChmbGFncyAmIGspIHsNCiAgICBuZXdGbGFncyB8PSBOT0RFRlMuZmxhZ3NGb3JOb2RlTWFwW2tdOw0KICAgIGZsYWdzIF49IGs7DQogICB9DQogIH0NCiAgaWYgKCFmbGFncykgew0KICAgcmV0dXJuIG5ld0ZsYWdzOw0KICB9IGVsc2Ugew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKTsNCiAgfQ0KIH0sDQogbm9kZV9vcHM6IHsNCiAgZ2V0YXR0cjogZnVuY3Rpb24obm9kZSkgew0KICAgdmFyIHBhdGggPSBOT0RFRlMucmVhbFBhdGgobm9kZSk7DQogICB2YXIgc3RhdDsNCiAgIHRyeSB7DQogICAgc3RhdCA9IGZzLmxzdGF0U3luYyhwYXRoKTsNCiAgIH0gY2F0Y2ggKGUpIHsNCiAgICBpZiAoIWUuY29kZSkgdGhyb3cgZTsNCiAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKTsNCiAgIH0NCiAgIGlmIChOT0RFRlMuaXNXaW5kb3dzICYmICFzdGF0LmJsa3NpemUpIHsNCiAgICBzdGF0LmJsa3NpemUgPSA0MDk2Ow0KICAgfQ0KICAgaWYgKE5PREVGUy5pc1dpbmRvd3MgJiYgIXN0YXQuYmxvY2tzKSB7DQogICAgc3RhdC5ibG9ja3MgPSAoc3RhdC5zaXplICsgc3RhdC5ibGtzaXplIC0gMSkgLyBzdGF0LmJsa3NpemUgfCAwOw0KICAgfQ0KICAgcmV0dXJuIHsNCiAgICBkZXY6IHN0YXQuZGV2LA0KICAgIGlubzogc3RhdC5pbm8sDQogICAgbW9kZTogc3RhdC5tb2RlLA0KICAgIG5saW5rOiBzdGF0Lm5saW5rLA0KICAgIHVpZDogc3RhdC51aWQsDQogICAgZ2lkOiBzdGF0LmdpZCwNCiAgICByZGV2OiBzdGF0LnJkZXYsDQogICAgc2l6ZTogc3RhdC5zaXplLA0KICAgIGF0aW1lOiBzdGF0LmF0aW1lLA0KICAgIG10aW1lOiBzdGF0Lm10aW1lLA0KICAgIGN0aW1lOiBzdGF0LmN0aW1lLA0KICAgIGJsa3NpemU6IHN0YXQuYmxrc2l6ZSwNCiAgICBibG9ja3M6IHN0YXQuYmxvY2tzDQogICB9Ow0KICB9LA0KICBzZXRhdHRyOiBmdW5jdGlvbihub2RlLCBhdHRyKSB7DQogICB2YXIgcGF0aCA9IE5PREVGUy5yZWFsUGF0aChub2RlKTsNCiAgIHRyeSB7DQogICAgaWYgKGF0dHIubW9kZSAhPT0gdW5kZWZpbmVkKSB7DQogICAgIGZzLmNobW9kU3luYyhwYXRoLCBhdHRyLm1vZGUpOw0KICAgICBub2RlLm1vZGUgPSBhdHRyLm1vZGU7DQogICAgfQ0KICAgIGlmIChhdHRyLnRpbWVzdGFtcCAhPT0gdW5kZWZpbmVkKSB7DQogICAgIHZhciBkYXRlID0gbmV3IERhdGUoYXR0ci50aW1lc3RhbXApOw0KICAgICBmcy51dGltZXNTeW5jKHBhdGgsIGRhdGUsIGRhdGUpOw0KICAgIH0NCiAgICBpZiAoYXR0ci5zaXplICE9PSB1bmRlZmluZWQpIHsNCiAgICAgZnMudHJ1bmNhdGVTeW5jKHBhdGgsIGF0dHIuc2l6ZSk7DQogICAgfQ0KICAgfSBjYXRjaCAoZSkgew0KICAgIGlmICghZS5jb2RlKSB0aHJvdyBlOw0KICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTW2UuY29kZV0pOw0KICAgfQ0KICB9LA0KICBsb29rdXA6IGZ1bmN0aW9uKHBhcmVudCwgbmFtZSkgew0KICAgdmFyIHBhdGggPSBQQVRILmpvaW4yKE5PREVGUy5yZWFsUGF0aChwYXJlbnQpLCBuYW1lKTsNCiAgIHZhciBtb2RlID0gTk9ERUZTLmdldE1vZGUocGF0aCk7DQogICByZXR1cm4gTk9ERUZTLmNyZWF0ZU5vZGUocGFyZW50LCBuYW1lLCBtb2RlKTsNCiAgfSwNCiAgbWtub2Q6IGZ1bmN0aW9uKHBhcmVudCwgbmFtZSwgbW9kZSwgZGV2KSB7DQogICB2YXIgbm9kZSA9IE5PREVGUy5jcmVhdGVOb2RlKHBhcmVudCwgbmFtZSwgbW9kZSwgZGV2KTsNCiAgIHZhciBwYXRoID0gTk9ERUZTLnJlYWxQYXRoKG5vZGUpOw0KICAgdHJ5IHsNCiAgICBpZiAoRlMuaXNEaXIobm9kZS5tb2RlKSkgew0KICAgICBmcy5ta2RpclN5bmMocGF0aCwgbm9kZS5tb2RlKTsNCiAgICB9IGVsc2Ugew0KICAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGgsICIiLCB7DQogICAgICBtb2RlOiBub2RlLm1vZGUNCiAgICAgfSk7DQogICAgfQ0KICAgfSBjYXRjaCAoZSkgew0KICAgIGlmICghZS5jb2RlKSB0aHJvdyBlOw0KICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTW2UuY29kZV0pOw0KICAgfQ0KICAgcmV0dXJuIG5vZGU7DQogIH0sDQogIHJlbmFtZTogZnVuY3Rpb24ob2xkTm9kZSwgbmV3RGlyLCBuZXdOYW1lKSB7DQogICB2YXIgb2xkUGF0aCA9IE5PREVGUy5yZWFsUGF0aChvbGROb2RlKTsNCiAgIHZhciBuZXdQYXRoID0gUEFUSC5qb2luMihOT0RFRlMucmVhbFBhdGgobmV3RGlyKSwgbmV3TmFtZSk7DQogICB0cnkgew0KICAgIGZzLnJlbmFtZVN5bmMob2xkUGF0aCwgbmV3UGF0aCk7DQogICB9IGNhdGNoIChlKSB7DQogICAgaWYgKCFlLmNvZGUpIHRocm93IGU7DQogICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVNbZS5jb2RlXSk7DQogICB9DQogIH0sDQogIHVubGluazogZnVuY3Rpb24ocGFyZW50LCBuYW1lKSB7DQogICB2YXIgcGF0aCA9IFBBVEguam9pbjIoTk9ERUZTLnJlYWxQYXRoKHBhcmVudCksIG5hbWUpOw0KICAgdHJ5IHsNCiAgICBmcy51bmxpbmtTeW5jKHBhdGgpOw0KICAgfSBjYXRjaCAoZSkgew0KICAgIGlmICghZS5jb2RlKSB0aHJvdyBlOw0KICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTW2UuY29kZV0pOw0KICAgfQ0KICB9LA0KICBybWRpcjogZnVuY3Rpb24ocGFyZW50LCBuYW1lKSB7DQogICB2YXIgcGF0aCA9IFBBVEguam9pbjIoTk9ERUZTLnJlYWxQYXRoKHBhcmVudCksIG5hbWUpOw0KICAgdHJ5IHsNCiAgICBmcy5ybWRpclN5bmMocGF0aCk7DQogICB9IGNhdGNoIChlKSB7DQogICAgaWYgKCFlLmNvZGUpIHRocm93IGU7DQogICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVNbZS5jb2RlXSk7DQogICB9DQogIH0sDQogIHJlYWRkaXI6IGZ1bmN0aW9uKG5vZGUpIHsNCiAgIHZhciBwYXRoID0gTk9ERUZTLnJlYWxQYXRoKG5vZGUpOw0KICAgdHJ5IHsNCiAgICByZXR1cm4gZnMucmVhZGRpclN5bmMocGF0aCk7DQogICB9IGNhdGNoIChlKSB7DQogICAgaWYgKCFlLmNvZGUpIHRocm93IGU7DQogICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVNbZS5jb2RlXSk7DQogICB9DQogIH0sDQogIHN5bWxpbms6IGZ1bmN0aW9uKHBhcmVudCwgbmV3TmFtZSwgb2xkUGF0aCkgew0KICAgdmFyIG5ld1BhdGggPSBQQVRILmpvaW4yKE5PREVGUy5yZWFsUGF0aChwYXJlbnQpLCBuZXdOYW1lKTsNCiAgIHRyeSB7DQogICAgZnMuc3ltbGlua1N5bmMob2xkUGF0aCwgbmV3UGF0aCk7DQogICB9IGNhdGNoIChlKSB7DQogICAgaWYgKCFlLmNvZGUpIHRocm93IGU7DQogICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVNbZS5jb2RlXSk7DQogICB9DQogIH0sDQogIHJlYWRsaW5rOiBmdW5jdGlvbihub2RlKSB7DQogICB2YXIgcGF0aCA9IE5PREVGUy5yZWFsUGF0aChub2RlKTsNCiAgIHRyeSB7DQogICAgcGF0aCA9IGZzLnJlYWRsaW5rU3luYyhwYXRoKTsNCiAgICBwYXRoID0gTk9ERUpTX1BBVEgucmVsYXRpdmUoTk9ERUpTX1BBVEgucmVzb2x2ZShub2RlLm1vdW50Lm9wdHMucm9vdCksIHBhdGgpOw0KICAgIHJldHVybiBwYXRoOw0KICAgfSBjYXRjaCAoZSkgew0KICAgIGlmICghZS5jb2RlKSB0aHJvdyBlOw0KICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTW2UuY29kZV0pOw0KICAgfQ0KICB9DQogfSwNCiBzdHJlYW1fb3BzOiB7DQogIG9wZW46IGZ1bmN0aW9uKHN0cmVhbSkgew0KICAgdmFyIHBhdGggPSBOT0RFRlMucmVhbFBhdGgoc3RyZWFtLm5vZGUpOw0KICAgdHJ5IHsNCiAgICBpZiAoRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpKSB7DQogICAgIHN0cmVhbS5uZmQgPSBmcy5vcGVuU3luYyhwYXRoLCBOT0RFRlMuZmxhZ3NGb3JOb2RlKHN0cmVhbS5mbGFncykpOw0KICAgIH0NCiAgIH0gY2F0Y2ggKGUpIHsNCiAgICBpZiAoIWUuY29kZSkgdGhyb3cgZTsNCiAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKTsNCiAgIH0NCiAgfSwNCiAgY2xvc2U6IGZ1bmN0aW9uKHN0cmVhbSkgew0KICAgdHJ5IHsNCiAgICBpZiAoRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpICYmIHN0cmVhbS5uZmQpIHsNCiAgICAgZnMuY2xvc2VTeW5jKHN0cmVhbS5uZmQpOw0KICAgIH0NCiAgIH0gY2F0Y2ggKGUpIHsNCiAgICBpZiAoIWUuY29kZSkgdGhyb3cgZTsNCiAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKTsNCiAgIH0NCiAgfSwNCiAgcmVhZDogZnVuY3Rpb24oc3RyZWFtLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbikgew0KICAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7DQogICB0cnkgew0KICAgIHJldHVybiBmcy5yZWFkU3luYyhzdHJlYW0ubmZkLCBOT0RFRlMuYnVmZmVyRnJvbShidWZmZXIuYnVmZmVyKSwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uKTsNCiAgIH0gY2F0Y2ggKGUpIHsNCiAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKTsNCiAgIH0NCiAgfSwNCiAgd3JpdGU6IGZ1bmN0aW9uKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24pIHsNCiAgIHRyeSB7DQogICAgcmV0dXJuIGZzLndyaXRlU3luYyhzdHJlYW0ubmZkLCBOT0RFRlMuYnVmZmVyRnJvbShidWZmZXIuYnVmZmVyKSwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uKTsNCiAgIH0gY2F0Y2ggKGUpIHsNCiAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKTsNCiAgIH0NCiAgfSwNCiAgbGxzZWVrOiBmdW5jdGlvbihzdHJlYW0sIG9mZnNldCwgd2hlbmNlKSB7DQogICB2YXIgcG9zaXRpb24gPSBvZmZzZXQ7DQogICBpZiAod2hlbmNlID09PSAxKSB7DQogICAgcG9zaXRpb24gKz0gc3RyZWFtLnBvc2l0aW9uOw0KICAgfSBlbHNlIGlmICh3aGVuY2UgPT09IDIpIHsNCiAgICBpZiAoRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpKSB7DQogICAgIHRyeSB7DQogICAgICB2YXIgc3RhdCA9IGZzLmZzdGF0U3luYyhzdHJlYW0ubmZkKTsNCiAgICAgIHBvc2l0aW9uICs9IHN0YXQuc2l6ZTsNCiAgICAgfSBjYXRjaCAoZSkgew0KICAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVNbZS5jb2RlXSk7DQogICAgIH0NCiAgICB9DQogICB9DQogICBpZiAocG9zaXRpb24gPCAwKSB7DQogICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKTsNCiAgIH0NCiAgIHJldHVybiBwb3NpdGlvbjsNCiAgfQ0KIH0NCn07DQoNCnZhciBXT1JLRVJGUyA9IHsNCiBESVJfTU9ERTogMTY4OTUsDQogRklMRV9NT0RFOiAzMzI3OSwNCiByZWFkZXI6IG51bGwsDQogbW91bnQ6IGZ1bmN0aW9uKG1vdW50KSB7DQogIGFzc2VydChFTlZJUk9OTUVOVF9JU19XT1JLRVIpOw0KICBpZiAoIVdPUktFUkZTLnJlYWRlcikgV09SS0VSRlMucmVhZGVyID0gbmV3IEZpbGVSZWFkZXJTeW5jKCk7DQogIHZhciByb290ID0gV09SS0VSRlMuY3JlYXRlTm9kZShudWxsLCAiLyIsIFdPUktFUkZTLkRJUl9NT0RFLCAwKTsNCiAgdmFyIGNyZWF0ZWRQYXJlbnRzID0ge307DQogIGZ1bmN0aW9uIGVuc3VyZVBhcmVudChwYXRoKSB7DQogICB2YXIgcGFydHMgPSBwYXRoLnNwbGl0KCIvIik7DQogICB2YXIgcGFyZW50ID0gcm9vdDsNCiAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7DQogICAgdmFyIGN1cnIgPSBwYXJ0cy5zbGljZSgwLCBpICsgMSkuam9pbigiLyIpOw0KICAgIGlmICghY3JlYXRlZFBhcmVudHNbY3Vycl0pIHsNCiAgICAgY3JlYXRlZFBhcmVudHNbY3Vycl0gPSBXT1JLRVJGUy5jcmVhdGVOb2RlKHBhcmVudCwgcGFydHNbaV0sIFdPUktFUkZTLkRJUl9NT0RFLCAwKTsNCiAgICB9DQogICAgcGFyZW50ID0gY3JlYXRlZFBhcmVudHNbY3Vycl07DQogICB9DQogICByZXR1cm4gcGFyZW50Ow0KICB9DQogIGZ1bmN0aW9uIGJhc2UocGF0aCkgew0KICAgdmFyIHBhcnRzID0gcGF0aC5zcGxpdCgiLyIpOw0KICAgcmV0dXJuIHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdOw0KICB9DQogIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobW91bnQub3B0c1siZmlsZXMiXSB8fCBbXSwgZnVuY3Rpb24oZmlsZSkgew0KICAgV09SS0VSRlMuY3JlYXRlTm9kZShlbnN1cmVQYXJlbnQoZmlsZS5uYW1lKSwgYmFzZShmaWxlLm5hbWUpLCBXT1JLRVJGUy5GSUxFX01PREUsIDAsIGZpbGUsIGZpbGUubGFzdE1vZGlmaWVkRGF0ZSk7DQogIH0pOw0KICAobW91bnQub3B0c1siYmxvYnMiXSB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbihvYmopIHsNCiAgIFdPUktFUkZTLmNyZWF0ZU5vZGUoZW5zdXJlUGFyZW50KG9ialsibmFtZSJdKSwgYmFzZShvYmpbIm5hbWUiXSksIFdPUktFUkZTLkZJTEVfTU9ERSwgMCwgb2JqWyJkYXRhIl0pOw0KICB9KTsNCiAgKG1vdW50Lm9wdHNbInBhY2thZ2VzIl0gfHwgW10pLmZvckVhY2goZnVuY3Rpb24ocGFjaykgew0KICAgcGFja1sibWV0YWRhdGEiXS5maWxlcy5mb3JFYWNoKGZ1bmN0aW9uKGZpbGUpIHsNCiAgICB2YXIgbmFtZSA9IGZpbGUuZmlsZW5hbWUuc3Vic3RyKDEpOw0KICAgIFdPUktFUkZTLmNyZWF0ZU5vZGUoZW5zdXJlUGFyZW50KG5hbWUpLCBiYXNlKG5hbWUpLCBXT1JLRVJGUy5GSUxFX01PREUsIDAsIHBhY2tbImJsb2IiXS5zbGljZShmaWxlLnN0YXJ0LCBmaWxlLmVuZCkpOw0KICAgfSk7DQogIH0pOw0KICByZXR1cm4gcm9vdDsNCiB9LA0KIGNyZWF0ZU5vZGU6IGZ1bmN0aW9uKHBhcmVudCwgbmFtZSwgbW9kZSwgZGV2LCBjb250ZW50cywgbXRpbWUpIHsNCiAgdmFyIG5vZGUgPSBGUy5jcmVhdGVOb2RlKHBhcmVudCwgbmFtZSwgbW9kZSk7DQogIG5vZGUubW9kZSA9IG1vZGU7DQogIG5vZGUubm9kZV9vcHMgPSBXT1JLRVJGUy5ub2RlX29wczsNCiAgbm9kZS5zdHJlYW1fb3BzID0gV09SS0VSRlMuc3RyZWFtX29wczsNCiAgbm9kZS50aW1lc3RhbXAgPSAobXRpbWUgfHwgbmV3IERhdGUoKSkuZ2V0VGltZSgpOw0KICBhc3NlcnQoV09SS0VSRlMuRklMRV9NT0RFICE9PSBXT1JLRVJGUy5ESVJfTU9ERSk7DQogIGlmIChtb2RlID09PSBXT1JLRVJGUy5GSUxFX01PREUpIHsNCiAgIG5vZGUuc2l6ZSA9IGNvbnRlbnRzLnNpemU7DQogICBub2RlLmNvbnRlbnRzID0gY29udGVudHM7DQogIH0gZWxzZSB7DQogICBub2RlLnNpemUgPSA0MDk2Ow0KICAgbm9kZS5jb250ZW50cyA9IHt9Ow0KICB9DQogIGlmIChwYXJlbnQpIHsNCiAgIHBhcmVudC5jb250ZW50c1tuYW1lXSA9IG5vZGU7DQogIH0NCiAgcmV0dXJuIG5vZGU7DQogfSwNCiBub2RlX29wczogew0KICBnZXRhdHRyOiBmdW5jdGlvbihub2RlKSB7DQogICByZXR1cm4gew0KICAgIGRldjogMSwNCiAgICBpbm86IHVuZGVmaW5lZCwNCiAgICBtb2RlOiBub2RlLm1vZGUsDQogICAgbmxpbms6IDEsDQogICAgdWlkOiAwLA0KICAgIGdpZDogMCwNCiAgICByZGV2OiB1bmRlZmluZWQsDQogICAgc2l6ZTogbm9kZS5zaXplLA0KICAgIGF0aW1lOiBuZXcgRGF0ZShub2RlLnRpbWVzdGFtcCksDQogICAgbXRpbWU6IG5ldyBEYXRlKG5vZGUudGltZXN0YW1wKSwNCiAgICBjdGltZTogbmV3IERhdGUobm9kZS50aW1lc3RhbXApLA0KICAgIGJsa3NpemU6IDQwOTYsDQogICAgYmxvY2tzOiBNYXRoLmNlaWwobm9kZS5zaXplIC8gNDA5NikNCiAgIH07DQogIH0sDQogIHNldGF0dHI6IGZ1bmN0aW9uKG5vZGUsIGF0dHIpIHsNCiAgIGlmIChhdHRyLm1vZGUgIT09IHVuZGVmaW5lZCkgew0KICAgIG5vZGUubW9kZSA9IGF0dHIubW9kZTsNCiAgIH0NCiAgIGlmIChhdHRyLnRpbWVzdGFtcCAhPT0gdW5kZWZpbmVkKSB7DQogICAgbm9kZS50aW1lc3RhbXAgPSBhdHRyLnRpbWVzdGFtcDsNCiAgIH0NCiAgfSwNCiAgbG9va3VwOiBmdW5jdGlvbihwYXJlbnQsIG5hbWUpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT0VOVCk7DQogIH0sDQogIG1rbm9kOiBmdW5jdGlvbihwYXJlbnQsIG5hbWUsIG1vZGUsIGRldikgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pOw0KICB9LA0KICByZW5hbWU6IGZ1bmN0aW9uKG9sZE5vZGUsIG5ld0RpciwgbmV3TmFtZSkgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pOw0KICB9LA0KICB1bmxpbms6IGZ1bmN0aW9uKHBhcmVudCwgbmFtZSkgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pOw0KICB9LA0KICBybWRpcjogZnVuY3Rpb24ocGFyZW50LCBuYW1lKSB7DQogICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSk7DQogIH0sDQogIHJlYWRkaXI6IGZ1bmN0aW9uKG5vZGUpIHsNCiAgIHZhciBlbnRyaWVzID0gWyAiLiIsICIuLiIgXTsNCiAgIGZvciAodmFyIGtleSBpbiBub2RlLmNvbnRlbnRzKSB7DQogICAgaWYgKCFub2RlLmNvbnRlbnRzLmhhc093blByb3BlcnR5KGtleSkpIHsNCiAgICAgY29udGludWU7DQogICAgfQ0KICAgIGVudHJpZXMucHVzaChrZXkpOw0KICAgfQ0KICAgcmV0dXJuIGVudHJpZXM7DQogIH0sDQogIHN5bWxpbms6IGZ1bmN0aW9uKHBhcmVudCwgbmV3TmFtZSwgb2xkUGF0aCkgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pOw0KICB9LA0KICByZWFkbGluazogZnVuY3Rpb24obm9kZSkgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pOw0KICB9DQogfSwNCiBzdHJlYW1fb3BzOiB7DQogIHJlYWQ6IGZ1bmN0aW9uKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24pIHsNCiAgIGlmIChwb3NpdGlvbiA+PSBzdHJlYW0ubm9kZS5zaXplKSByZXR1cm4gMDsNCiAgIHZhciBjaHVuayA9IHN0cmVhbS5ub2RlLmNvbnRlbnRzLnNsaWNlKHBvc2l0aW9uLCBwb3NpdGlvbiArIGxlbmd0aCk7DQogICB2YXIgYWIgPSBXT1JLRVJGUy5yZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoY2h1bmspOw0KICAgYnVmZmVyLnNldChuZXcgVWludDhBcnJheShhYiksIG9mZnNldCk7DQogICByZXR1cm4gY2h1bmsuc2l6ZTsNCiAgfSwNCiAgd3JpdGU6IGZ1bmN0aW9uKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24pIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTyk7DQogIH0sDQogIGxsc2VlazogZnVuY3Rpb24oc3RyZWFtLCBvZmZzZXQsIHdoZW5jZSkgew0KICAgdmFyIHBvc2l0aW9uID0gb2Zmc2V0Ow0KICAgaWYgKHdoZW5jZSA9PT0gMSkgew0KICAgIHBvc2l0aW9uICs9IHN0cmVhbS5wb3NpdGlvbjsNCiAgIH0gZWxzZSBpZiAod2hlbmNlID09PSAyKSB7DQogICAgaWYgKEZTLmlzRmlsZShzdHJlYW0ubm9kZS5tb2RlKSkgew0KICAgICBwb3NpdGlvbiArPSBzdHJlYW0ubm9kZS5zaXplOw0KICAgIH0NCiAgIH0NCiAgIGlmIChwb3NpdGlvbiA8IDApIHsNCiAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpOw0KICAgfQ0KICAgcmV0dXJuIHBvc2l0aW9uOw0KICB9DQogfQ0KfTsNCg0KdmFyIEZTID0gew0KIHJvb3Q6IG51bGwsDQogbW91bnRzOiBbXSwNCiBkZXZpY2VzOiB7fSwNCiBzdHJlYW1zOiBbXSwNCiBuZXh0SW5vZGU6IDEsDQogbmFtZVRhYmxlOiBudWxsLA0KIGN1cnJlbnRQYXRoOiAiLyIsDQogaW5pdGlhbGl6ZWQ6IGZhbHNlLA0KIGlnbm9yZVBlcm1pc3Npb25zOiB0cnVlLA0KIHRyYWNraW5nRGVsZWdhdGU6IHt9LA0KIHRyYWNraW5nOiB7DQogIG9wZW5GbGFnczogew0KICAgUkVBRDogMSwNCiAgIFdSSVRFOiAyDQogIH0NCiB9LA0KIEVycm5vRXJyb3I6IG51bGwsDQogZ2VuZXJpY0Vycm9yczoge30sDQogZmlsZXN5c3RlbXM6IG51bGwsDQogc3luY0ZTUmVxdWVzdHM6IDAsDQogaGFuZGxlRlNFcnJvcjogZnVuY3Rpb24oZSkgew0KICBpZiAoIShlIGluc3RhbmNlb2YgRlMuRXJybm9FcnJvcikpIHRocm93IGUgKyAiIDogIiArIHN0YWNrVHJhY2UoKTsNCiAgcmV0dXJuIF9fX3NldEVyck5vKGUuZXJybm8pOw0KIH0sDQogbG9va3VwUGF0aDogZnVuY3Rpb24ocGF0aCwgb3B0cykgew0KICBwYXRoID0gUEFUSC5yZXNvbHZlKEZTLmN3ZCgpLCBwYXRoKTsNCiAgb3B0cyA9IG9wdHMgfHwge307DQogIGlmICghcGF0aCkgcmV0dXJuIHsNCiAgIHBhdGg6ICIiLA0KICAgbm9kZTogbnVsbA0KICB9Ow0KICB2YXIgZGVmYXVsdHMgPSB7DQogICBmb2xsb3dfbW91bnQ6IHRydWUsDQogICByZWN1cnNlX2NvdW50OiAwDQogIH07DQogIGZvciAodmFyIGtleSBpbiBkZWZhdWx0cykgew0KICAgaWYgKG9wdHNba2V5XSA9PT0gdW5kZWZpbmVkKSB7DQogICAgb3B0c1trZXldID0gZGVmYXVsdHNba2V5XTsNCiAgIH0NCiAgfQ0KICBpZiAob3B0cy5yZWN1cnNlX2NvdW50ID4gOCkgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNDApOw0KICB9DQogIHZhciBwYXJ0cyA9IFBBVEgubm9ybWFsaXplQXJyYXkocGF0aC5zcGxpdCgiLyIpLmZpbHRlcihmdW5jdGlvbihwKSB7DQogICByZXR1cm4gISFwOw0KICB9KSwgZmFsc2UpOw0KICB2YXIgY3VycmVudCA9IEZTLnJvb3Q7DQogIHZhciBjdXJyZW50X3BhdGggPSAiLyI7DQogIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHsNCiAgIHZhciBpc2xhc3QgPSBpID09PSBwYXJ0cy5sZW5ndGggLSAxOw0KICAgaWYgKGlzbGFzdCAmJiBvcHRzLnBhcmVudCkgew0KICAgIGJyZWFrOw0KICAgfQ0KICAgY3VycmVudCA9IEZTLmxvb2t1cE5vZGUoY3VycmVudCwgcGFydHNbaV0pOw0KICAgY3VycmVudF9wYXRoID0gUEFUSC5qb2luMihjdXJyZW50X3BhdGgsIHBhcnRzW2ldKTsNCiAgIGlmIChGUy5pc01vdW50cG9pbnQoY3VycmVudCkpIHsNCiAgICBpZiAoIWlzbGFzdCB8fCBpc2xhc3QgJiYgb3B0cy5mb2xsb3dfbW91bnQpIHsNCiAgICAgY3VycmVudCA9IGN1cnJlbnQubW91bnRlZC5yb290Ow0KICAgIH0NCiAgIH0NCiAgIGlmICghaXNsYXN0IHx8IG9wdHMuZm9sbG93KSB7DQogICAgdmFyIGNvdW50ID0gMDsNCiAgICB3aGlsZSAoRlMuaXNMaW5rKGN1cnJlbnQubW9kZSkpIHsNCiAgICAgdmFyIGxpbmsgPSBGUy5yZWFkbGluayhjdXJyZW50X3BhdGgpOw0KICAgICBjdXJyZW50X3BhdGggPSBQQVRILnJlc29sdmUoUEFUSC5kaXJuYW1lKGN1cnJlbnRfcGF0aCksIGxpbmspOw0KICAgICB2YXIgbG9va3VwID0gRlMubG9va3VwUGF0aChjdXJyZW50X3BhdGgsIHsNCiAgICAgIHJlY3Vyc2VfY291bnQ6IG9wdHMucmVjdXJzZV9jb3VudA0KICAgICB9KTsNCiAgICAgY3VycmVudCA9IGxvb2t1cC5ub2RlOw0KICAgICBpZiAoY291bnQrKyA+IDQwKSB7DQogICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig0MCk7DQogICAgIH0NCiAgICB9DQogICB9DQogIH0NCiAgcmV0dXJuIHsNCiAgIHBhdGg6IGN1cnJlbnRfcGF0aCwNCiAgIG5vZGU6IGN1cnJlbnQNCiAgfTsNCiB9LA0KIGdldFBhdGg6IGZ1bmN0aW9uKG5vZGUpIHsNCiAgdmFyIHBhdGg7DQogIHdoaWxlICh0cnVlKSB7DQogICBpZiAoRlMuaXNSb290KG5vZGUpKSB7DQogICAgdmFyIG1vdW50ID0gbm9kZS5tb3VudC5tb3VudHBvaW50Ow0KICAgIGlmICghcGF0aCkgcmV0dXJuIG1vdW50Ow0KICAgIHJldHVybiBtb3VudFttb3VudC5sZW5ndGggLSAxXSAhPT0gIi8iID8gbW91bnQgKyAiLyIgKyBwYXRoIDogbW91bnQgKyBwYXRoOw0KICAgfQ0KICAgcGF0aCA9IHBhdGggPyBub2RlLm5hbWUgKyAiLyIgKyBwYXRoIDogbm9kZS5uYW1lOw0KICAgbm9kZSA9IG5vZGUucGFyZW50Ow0KICB9DQogfSwNCiBoYXNoTmFtZTogZnVuY3Rpb24ocGFyZW50aWQsIG5hbWUpIHsNCiAgdmFyIGhhc2ggPSAwOw0KICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWUubGVuZ3RoOyBpKyspIHsNCiAgIGhhc2ggPSAoaGFzaCA8PCA1KSAtIGhhc2ggKyBuYW1lLmNoYXJDb2RlQXQoaSkgfCAwOw0KICB9DQogIHJldHVybiAocGFyZW50aWQgKyBoYXNoID4+PiAwKSAlIEZTLm5hbWVUYWJsZS5sZW5ndGg7DQogfSwNCiBoYXNoQWRkTm9kZTogZnVuY3Rpb24obm9kZSkgew0KICB2YXIgaGFzaCA9IEZTLmhhc2hOYW1lKG5vZGUucGFyZW50LmlkLCBub2RlLm5hbWUpOw0KICBub2RlLm5hbWVfbmV4dCA9IEZTLm5hbWVUYWJsZVtoYXNoXTsNCiAgRlMubmFtZVRhYmxlW2hhc2hdID0gbm9kZTsNCiB9LA0KIGhhc2hSZW1vdmVOb2RlOiBmdW5jdGlvbihub2RlKSB7DQogIHZhciBoYXNoID0gRlMuaGFzaE5hbWUobm9kZS5wYXJlbnQuaWQsIG5vZGUubmFtZSk7DQogIGlmIChGUy5uYW1lVGFibGVbaGFzaF0gPT09IG5vZGUpIHsNCiAgIEZTLm5hbWVUYWJsZVtoYXNoXSA9IG5vZGUubmFtZV9uZXh0Ow0KICB9IGVsc2Ugew0KICAgdmFyIGN1cnJlbnQgPSBGUy5uYW1lVGFibGVbaGFzaF07DQogICB3aGlsZSAoY3VycmVudCkgew0KICAgIGlmIChjdXJyZW50Lm5hbWVfbmV4dCA9PT0gbm9kZSkgew0KICAgICBjdXJyZW50Lm5hbWVfbmV4dCA9IG5vZGUubmFtZV9uZXh0Ow0KICAgICBicmVhazsNCiAgICB9DQogICAgY3VycmVudCA9IGN1cnJlbnQubmFtZV9uZXh0Ow0KICAgfQ0KICB9DQogfSwNCiBsb29rdXBOb2RlOiBmdW5jdGlvbihwYXJlbnQsIG5hbWUpIHsNCiAgdmFyIGVyciA9IEZTLm1heUxvb2t1cChwYXJlbnQpOw0KICBpZiAoZXJyKSB7DQogICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnIsIHBhcmVudCk7DQogIH0NCiAgdmFyIGhhc2ggPSBGUy5oYXNoTmFtZShwYXJlbnQuaWQsIG5hbWUpOw0KICBmb3IgKHZhciBub2RlID0gRlMubmFtZVRhYmxlW2hhc2hdOyBub2RlOyBub2RlID0gbm9kZS5uYW1lX25leHQpIHsNCiAgIHZhciBub2RlTmFtZSA9IG5vZGUubmFtZTsNCiAgIGlmIChub2RlLnBhcmVudC5pZCA9PT0gcGFyZW50LmlkICYmIG5vZGVOYW1lID09PSBuYW1lKSB7DQogICAgcmV0dXJuIG5vZGU7DQogICB9DQogIH0NCiAgcmV0dXJuIEZTLmxvb2t1cChwYXJlbnQsIG5hbWUpOw0KIH0sDQogY3JlYXRlTm9kZTogZnVuY3Rpb24ocGFyZW50LCBuYW1lLCBtb2RlLCByZGV2KSB7DQogIGlmICghRlMuRlNOb2RlKSB7DQogICBGUy5GU05vZGUgPSBmdW5jdGlvbihwYXJlbnQsIG5hbWUsIG1vZGUsIHJkZXYpIHsNCiAgICBpZiAoIXBhcmVudCkgew0KICAgICBwYXJlbnQgPSB0aGlzOw0KICAgIH0NCiAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsNCiAgICB0aGlzLm1vdW50ID0gcGFyZW50Lm1vdW50Ow0KICAgIHRoaXMubW91bnRlZCA9IG51bGw7DQogICAgdGhpcy5pZCA9IEZTLm5leHRJbm9kZSsrOw0KICAgIHRoaXMubmFtZSA9IG5hbWU7DQogICAgdGhpcy5tb2RlID0gbW9kZTsNCiAgICB0aGlzLm5vZGVfb3BzID0ge307DQogICAgdGhpcy5zdHJlYW1fb3BzID0ge307DQogICAgdGhpcy5yZGV2ID0gcmRldjsNCiAgIH07DQogICBGUy5GU05vZGUucHJvdG90eXBlID0ge307DQogICB2YXIgcmVhZE1vZGUgPSAyOTIgfCA3MzsNCiAgIHZhciB3cml0ZU1vZGUgPSAxNDY7DQogICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhGUy5GU05vZGUucHJvdG90eXBlLCB7DQogICAgcmVhZDogew0KICAgICBnZXQ6IGZ1bmN0aW9uKCkgew0KICAgICAgcmV0dXJuICh0aGlzLm1vZGUgJiByZWFkTW9kZSkgPT09IHJlYWRNb2RlOw0KICAgICB9LA0KICAgICBzZXQ6IGZ1bmN0aW9uKHZhbCkgew0KICAgICAgdmFsID8gdGhpcy5tb2RlIHw9IHJlYWRNb2RlIDogdGhpcy5tb2RlICY9IH5yZWFkTW9kZTsNCiAgICAgfQ0KICAgIH0sDQogICAgd3JpdGU6IHsNCiAgICAgZ2V0OiBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiAodGhpcy5tb2RlICYgd3JpdGVNb2RlKSA9PT0gd3JpdGVNb2RlOw0KICAgICB9LA0KICAgICBzZXQ6IGZ1bmN0aW9uKHZhbCkgew0KICAgICAgdmFsID8gdGhpcy5tb2RlIHw9IHdyaXRlTW9kZSA6IHRoaXMubW9kZSAmPSB+d3JpdGVNb2RlOw0KICAgICB9DQogICAgfSwNCiAgICBpc0ZvbGRlcjogew0KICAgICBnZXQ6IGZ1bmN0aW9uKCkgew0KICAgICAgcmV0dXJuIEZTLmlzRGlyKHRoaXMubW9kZSk7DQogICAgIH0NCiAgICB9LA0KICAgIGlzRGV2aWNlOiB7DQogICAgIGdldDogZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gRlMuaXNDaHJkZXYodGhpcy5tb2RlKTsNCiAgICAgfQ0KICAgIH0NCiAgIH0pOw0KICB9DQogIHZhciBub2RlID0gbmV3IEZTLkZTTm9kZShwYXJlbnQsIG5hbWUsIG1vZGUsIHJkZXYpOw0KICBGUy5oYXNoQWRkTm9kZShub2RlKTsNCiAgcmV0dXJuIG5vZGU7DQogfSwNCiBkZXN0cm95Tm9kZTogZnVuY3Rpb24obm9kZSkgew0KICBGUy5oYXNoUmVtb3ZlTm9kZShub2RlKTsNCiB9LA0KIGlzUm9vdDogZnVuY3Rpb24obm9kZSkgew0KICByZXR1cm4gbm9kZSA9PT0gbm9kZS5wYXJlbnQ7DQogfSwNCiBpc01vdW50cG9pbnQ6IGZ1bmN0aW9uKG5vZGUpIHsNCiAgcmV0dXJuICEhbm9kZS5tb3VudGVkOw0KIH0sDQogaXNGaWxlOiBmdW5jdGlvbihtb2RlKSB7DQogIHJldHVybiAobW9kZSAmIDYxNDQwKSA9PT0gMzI3Njg7DQogfSwNCiBpc0RpcjogZnVuY3Rpb24obW9kZSkgew0KICByZXR1cm4gKG1vZGUgJiA2MTQ0MCkgPT09IDE2Mzg0Ow0KIH0sDQogaXNMaW5rOiBmdW5jdGlvbihtb2RlKSB7DQogIHJldHVybiAobW9kZSAmIDYxNDQwKSA9PT0gNDA5NjA7DQogfSwNCiBpc0NocmRldjogZnVuY3Rpb24obW9kZSkgew0KICByZXR1cm4gKG1vZGUgJiA2MTQ0MCkgPT09IDgxOTI7DQogfSwNCiBpc0Jsa2RldjogZnVuY3Rpb24obW9kZSkgew0KICByZXR1cm4gKG1vZGUgJiA2MTQ0MCkgPT09IDI0NTc2Ow0KIH0sDQogaXNGSUZPOiBmdW5jdGlvbihtb2RlKSB7DQogIHJldHVybiAobW9kZSAmIDYxNDQwKSA9PT0gNDA5NjsNCiB9LA0KIGlzU29ja2V0OiBmdW5jdGlvbihtb2RlKSB7DQogIHJldHVybiAobW9kZSAmIDQ5MTUyKSA9PT0gNDkxNTI7DQogfSwNCiBmbGFnTW9kZXM6IHsNCiAgInIiOiAwLA0KICAicnMiOiAxMDUyNjcyLA0KICAicisiOiAyLA0KICAidyI6IDU3NywNCiAgInd4IjogNzA1LA0KICAieHciOiA3MDUsDQogICJ3KyI6IDU3OCwNCiAgInd4KyI6IDcwNiwNCiAgInh3KyI6IDcwNiwNCiAgImEiOiAxMDg5LA0KICAiYXgiOiAxMjE3LA0KICAieGEiOiAxMjE3LA0KICAiYSsiOiAxMDkwLA0KICAiYXgrIjogMTIxOCwNCiAgInhhKyI6IDEyMTgNCiB9LA0KIG1vZGVTdHJpbmdUb0ZsYWdzOiBmdW5jdGlvbihzdHIpIHsNCiAgdmFyIGZsYWdzID0gRlMuZmxhZ01vZGVzW3N0cl07DQogIGlmICh0eXBlb2YgZmxhZ3MgPT09ICJ1bmRlZmluZWQiKSB7DQogICB0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gZmlsZSBvcGVuIG1vZGU6ICIgKyBzdHIpOw0KICB9DQogIHJldHVybiBmbGFnczsNCiB9LA0KIGZsYWdzVG9QZXJtaXNzaW9uU3RyaW5nOiBmdW5jdGlvbihmbGFnKSB7DQogIHZhciBwZXJtcyA9IFsgInIiLCAidyIsICJydyIgXVtmbGFnICYgM107DQogIGlmIChmbGFnICYgNTEyKSB7DQogICBwZXJtcyArPSAidyI7DQogIH0NCiAgcmV0dXJuIHBlcm1zOw0KIH0sDQogbm9kZVBlcm1pc3Npb25zOiBmdW5jdGlvbihub2RlLCBwZXJtcykgew0KICBpZiAoRlMuaWdub3JlUGVybWlzc2lvbnMpIHsNCiAgIHJldHVybiAwOw0KICB9DQogIGlmIChwZXJtcy5pbmRleE9mKCJyIikgIT09IC0xICYmICEobm9kZS5tb2RlICYgMjkyKSkgew0KICAgcmV0dXJuIDEzOw0KICB9IGVsc2UgaWYgKHBlcm1zLmluZGV4T2YoInciKSAhPT0gLTEgJiYgIShub2RlLm1vZGUgJiAxNDYpKSB7DQogICByZXR1cm4gMTM7DQogIH0gZWxzZSBpZiAocGVybXMuaW5kZXhPZigieCIpICE9PSAtMSAmJiAhKG5vZGUubW9kZSAmIDczKSkgew0KICAgcmV0dXJuIDEzOw0KICB9DQogIHJldHVybiAwOw0KIH0sDQogbWF5TG9va3VwOiBmdW5jdGlvbihkaXIpIHsNCiAgdmFyIGVyciA9IEZTLm5vZGVQZXJtaXNzaW9ucyhkaXIsICJ4Iik7DQogIGlmIChlcnIpIHJldHVybiBlcnI7DQogIGlmICghZGlyLm5vZGVfb3BzLmxvb2t1cCkgcmV0dXJuIDEzOw0KICByZXR1cm4gMDsNCiB9LA0KIG1heUNyZWF0ZTogZnVuY3Rpb24oZGlyLCBuYW1lKSB7DQogIHRyeSB7DQogICB2YXIgbm9kZSA9IEZTLmxvb2t1cE5vZGUoZGlyLCBuYW1lKTsNCiAgIHJldHVybiAxNzsNCiAgfSBjYXRjaCAoZSkge30NCiAgcmV0dXJuIEZTLm5vZGVQZXJtaXNzaW9ucyhkaXIsICJ3eCIpOw0KIH0sDQogbWF5RGVsZXRlOiBmdW5jdGlvbihkaXIsIG5hbWUsIGlzZGlyKSB7DQogIHZhciBub2RlOw0KICB0cnkgew0KICAgbm9kZSA9IEZTLmxvb2t1cE5vZGUoZGlyLCBuYW1lKTsNCiAgfSBjYXRjaCAoZSkgew0KICAgcmV0dXJuIGUuZXJybm87DQogIH0NCiAgdmFyIGVyciA9IEZTLm5vZGVQZXJtaXNzaW9ucyhkaXIsICJ3eCIpOw0KICBpZiAoZXJyKSB7DQogICByZXR1cm4gZXJyOw0KICB9DQogIGlmIChpc2Rpcikgew0KICAgaWYgKCFGUy5pc0Rpcihub2RlLm1vZGUpKSB7DQogICAgcmV0dXJuIDIwOw0KICAgfQ0KICAgaWYgKEZTLmlzUm9vdChub2RlKSB8fCBGUy5nZXRQYXRoKG5vZGUpID09PSBGUy5jd2QoKSkgew0KICAgIHJldHVybiAxNjsNCiAgIH0NCiAgfSBlbHNlIHsNCiAgIGlmIChGUy5pc0Rpcihub2RlLm1vZGUpKSB7DQogICAgcmV0dXJuIDIxOw0KICAgfQ0KICB9DQogIHJldHVybiAwOw0KIH0sDQogbWF5T3BlbjogZnVuY3Rpb24obm9kZSwgZmxhZ3MpIHsNCiAgaWYgKCFub2RlKSB7DQogICByZXR1cm4gMjsNCiAgfQ0KICBpZiAoRlMuaXNMaW5rKG5vZGUubW9kZSkpIHsNCiAgIHJldHVybiA0MDsNCiAgfSBlbHNlIGlmIChGUy5pc0Rpcihub2RlLm1vZGUpKSB7DQogICBpZiAoRlMuZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcoZmxhZ3MpICE9PSAiciIgfHwgZmxhZ3MgJiA1MTIpIHsNCiAgICByZXR1cm4gMjE7DQogICB9DQogIH0NCiAgcmV0dXJuIEZTLm5vZGVQZXJtaXNzaW9ucyhub2RlLCBGUy5mbGFnc1RvUGVybWlzc2lvblN0cmluZyhmbGFncykpOw0KIH0sDQogTUFYX09QRU5fRkRTOiA0MDk2LA0KIG5leHRmZDogZnVuY3Rpb24oZmRfc3RhcnQsIGZkX2VuZCkgew0KICBmZF9zdGFydCA9IGZkX3N0YXJ0IHx8IDA7DQogIGZkX2VuZCA9IGZkX2VuZCB8fCBGUy5NQVhfT1BFTl9GRFM7DQogIGZvciAodmFyIGZkID0gZmRfc3RhcnQ7IGZkIDw9IGZkX2VuZDsgZmQrKykgew0KICAgaWYgKCFGUy5zdHJlYW1zW2ZkXSkgew0KICAgIHJldHVybiBmZDsNCiAgIH0NCiAgfQ0KICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyNCk7DQogfSwNCiBnZXRTdHJlYW06IGZ1bmN0aW9uKGZkKSB7DQogIHJldHVybiBGUy5zdHJlYW1zW2ZkXTsNCiB9LA0KIGNyZWF0ZVN0cmVhbTogZnVuY3Rpb24oc3RyZWFtLCBmZF9zdGFydCwgZmRfZW5kKSB7DQogIGlmICghRlMuRlNTdHJlYW0pIHsNCiAgIEZTLkZTU3RyZWFtID0gZnVuY3Rpb24oKSB7fTsNCiAgIEZTLkZTU3RyZWFtLnByb3RvdHlwZSA9IHt9Ow0KICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRlMuRlNTdHJlYW0ucHJvdG90eXBlLCB7DQogICAgb2JqZWN0OiB7DQogICAgIGdldDogZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gdGhpcy5ub2RlOw0KICAgICB9LA0KICAgICBzZXQ6IGZ1bmN0aW9uKHZhbCkgew0KICAgICAgdGhpcy5ub2RlID0gdmFsOw0KICAgICB9DQogICAgfSwNCiAgICBpc1JlYWQ6IHsNCiAgICAgZ2V0OiBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiAodGhpcy5mbGFncyAmIDIwOTcxNTUpICE9PSAxOw0KICAgICB9DQogICAgfSwNCiAgICBpc1dyaXRlOiB7DQogICAgIGdldDogZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gKHRoaXMuZmxhZ3MgJiAyMDk3MTU1KSAhPT0gMDsNCiAgICAgfQ0KICAgIH0sDQogICAgaXNBcHBlbmQ6IHsNCiAgICAgZ2V0OiBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiB0aGlzLmZsYWdzICYgMTAyNDsNCiAgICAgfQ0KICAgIH0NCiAgIH0pOw0KICB9DQogIHZhciBuZXdTdHJlYW0gPSBuZXcgRlMuRlNTdHJlYW0oKTsNCiAgZm9yICh2YXIgcCBpbiBzdHJlYW0pIHsNCiAgIG5ld1N0cmVhbVtwXSA9IHN0cmVhbVtwXTsNCiAgfQ0KICBzdHJlYW0gPSBuZXdTdHJlYW07DQogIHZhciBmZCA9IEZTLm5leHRmZChmZF9zdGFydCwgZmRfZW5kKTsNCiAgc3RyZWFtLmZkID0gZmQ7DQogIEZTLnN0cmVhbXNbZmRdID0gc3RyZWFtOw0KICByZXR1cm4gc3RyZWFtOw0KIH0sDQogY2xvc2VTdHJlYW06IGZ1bmN0aW9uKGZkKSB7DQogIEZTLnN0cmVhbXNbZmRdID0gbnVsbDsNCiB9LA0KIGNocmRldl9zdHJlYW1fb3BzOiB7DQogIG9wZW46IGZ1bmN0aW9uKHN0cmVhbSkgew0KICAgdmFyIGRldmljZSA9IEZTLmdldERldmljZShzdHJlYW0ubm9kZS5yZGV2KTsNCiAgIHN0cmVhbS5zdHJlYW1fb3BzID0gZGV2aWNlLnN0cmVhbV9vcHM7DQogICBpZiAoc3RyZWFtLnN0cmVhbV9vcHMub3Blbikgew0KICAgIHN0cmVhbS5zdHJlYW1fb3BzLm9wZW4oc3RyZWFtKTsNCiAgIH0NCiAgfSwNCiAgbGxzZWVrOiBmdW5jdGlvbigpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDI5KTsNCiAgfQ0KIH0sDQogbWFqb3I6IGZ1bmN0aW9uKGRldikgew0KICByZXR1cm4gZGV2ID4+IDg7DQogfSwNCiBtaW5vcjogZnVuY3Rpb24oZGV2KSB7DQogIHJldHVybiBkZXYgJiAyNTU7DQogfSwNCiBtYWtlZGV2OiBmdW5jdGlvbihtYSwgbWkpIHsNCiAgcmV0dXJuIG1hIDw8IDggfCBtaTsNCiB9LA0KIHJlZ2lzdGVyRGV2aWNlOiBmdW5jdGlvbihkZXYsIG9wcykgew0KICBGUy5kZXZpY2VzW2Rldl0gPSB7DQogICBzdHJlYW1fb3BzOiBvcHMNCiAgfTsNCiB9LA0KIGdldERldmljZTogZnVuY3Rpb24oZGV2KSB7DQogIHJldHVybiBGUy5kZXZpY2VzW2Rldl07DQogfSwNCiBnZXRNb3VudHM6IGZ1bmN0aW9uKG1vdW50KSB7DQogIHZhciBtb3VudHMgPSBbXTsNCiAgdmFyIGNoZWNrID0gWyBtb3VudCBdOw0KICB3aGlsZSAoY2hlY2subGVuZ3RoKSB7DQogICB2YXIgbSA9IGNoZWNrLnBvcCgpOw0KICAgbW91bnRzLnB1c2gobSk7DQogICBjaGVjay5wdXNoLmFwcGx5KGNoZWNrLCBtLm1vdW50cyk7DQogIH0NCiAgcmV0dXJuIG1vdW50czsNCiB9LA0KIHN5bmNmczogZnVuY3Rpb24ocG9wdWxhdGUsIGNhbGxiYWNrKSB7DQogIGlmICh0eXBlb2YgcG9wdWxhdGUgPT09ICJmdW5jdGlvbiIpIHsNCiAgIGNhbGxiYWNrID0gcG9wdWxhdGU7DQogICBwb3B1bGF0ZSA9IGZhbHNlOw0KICB9DQogIEZTLnN5bmNGU1JlcXVlc3RzKys7DQogIGlmIChGUy5zeW5jRlNSZXF1ZXN0cyA+IDEpIHsNCiAgIGNvbnNvbGUubG9nKCJ3YXJuaW5nOiAiICsgRlMuc3luY0ZTUmVxdWVzdHMgKyAiIEZTLnN5bmNmcyBvcGVyYXRpb25zIGluIGZsaWdodCBhdCBvbmNlLCBwcm9iYWJseSBqdXN0IGRvaW5nIGV4dHJhIHdvcmsiKTsNCiAgfQ0KICB2YXIgbW91bnRzID0gRlMuZ2V0TW91bnRzKEZTLnJvb3QubW91bnQpOw0KICB2YXIgY29tcGxldGVkID0gMDsNCiAgZnVuY3Rpb24gZG9DYWxsYmFjayhlcnIpIHsNCiAgIGFzc2VydChGUy5zeW5jRlNSZXF1ZXN0cyA+IDApOw0KICAgRlMuc3luY0ZTUmVxdWVzdHMtLTsNCiAgIHJldHVybiBjYWxsYmFjayhlcnIpOw0KICB9DQogIGZ1bmN0aW9uIGRvbmUoZXJyKSB7DQogICBpZiAoZXJyKSB7DQogICAgaWYgKCFkb25lLmVycm9yZWQpIHsNCiAgICAgZG9uZS5lcnJvcmVkID0gdHJ1ZTsNCiAgICAgcmV0dXJuIGRvQ2FsbGJhY2soZXJyKTsNCiAgICB9DQogICAgcmV0dXJuOw0KICAgfQ0KICAgaWYgKCsrY29tcGxldGVkID49IG1vdW50cy5sZW5ndGgpIHsNCiAgICBkb0NhbGxiYWNrKG51bGwpOw0KICAgfQ0KICB9DQogIG1vdW50cy5mb3JFYWNoKGZ1bmN0aW9uKG1vdW50KSB7DQogICBpZiAoIW1vdW50LnR5cGUuc3luY2ZzKSB7DQogICAgcmV0dXJuIGRvbmUobnVsbCk7DQogICB9DQogICBtb3VudC50eXBlLnN5bmNmcyhtb3VudCwgcG9wdWxhdGUsIGRvbmUpOw0KICB9KTsNCiB9LA0KIG1vdW50OiBmdW5jdGlvbih0eXBlLCBvcHRzLCBtb3VudHBvaW50KSB7DQogIHZhciByb290ID0gbW91bnRwb2ludCA9PT0gIi8iOw0KICB2YXIgcHNldWRvID0gIW1vdW50cG9pbnQ7DQogIHZhciBub2RlOw0KICBpZiAocm9vdCAmJiBGUy5yb290KSB7DQogICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigxNik7DQogIH0gZWxzZSBpZiAoIXJvb3QgJiYgIXBzZXVkbykgew0KICAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgobW91bnRwb2ludCwgew0KICAgIGZvbGxvd19tb3VudDogZmFsc2UNCiAgIH0pOw0KICAgbW91bnRwb2ludCA9IGxvb2t1cC5wYXRoOw0KICAgbm9kZSA9IGxvb2t1cC5ub2RlOw0KICAgaWYgKEZTLmlzTW91bnRwb2ludChub2RlKSkgew0KICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDE2KTsNCiAgIH0NCiAgIGlmICghRlMuaXNEaXIobm9kZS5tb2RlKSkgew0KICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDIwKTsNCiAgIH0NCiAgfQ0KICB2YXIgbW91bnQgPSB7DQogICB0eXBlOiB0eXBlLA0KICAgb3B0czogb3B0cywNCiAgIG1vdW50cG9pbnQ6IG1vdW50cG9pbnQsDQogICBtb3VudHM6IFtdDQogIH07DQogIHZhciBtb3VudFJvb3QgPSB0eXBlLm1vdW50KG1vdW50KTsNCiAgbW91bnRSb290Lm1vdW50ID0gbW91bnQ7DQogIG1vdW50LnJvb3QgPSBtb3VudFJvb3Q7DQogIGlmIChyb290KSB7DQogICBGUy5yb290ID0gbW91bnRSb290Ow0KICB9IGVsc2UgaWYgKG5vZGUpIHsNCiAgIG5vZGUubW91bnRlZCA9IG1vdW50Ow0KICAgaWYgKG5vZGUubW91bnQpIHsNCiAgICBub2RlLm1vdW50Lm1vdW50cy5wdXNoKG1vdW50KTsNCiAgIH0NCiAgfQ0KICByZXR1cm4gbW91bnRSb290Ow0KIH0sDQogdW5tb3VudDogZnVuY3Rpb24obW91bnRwb2ludCkgew0KICB2YXIgbG9va3VwID0gRlMubG9va3VwUGF0aChtb3VudHBvaW50LCB7DQogICBmb2xsb3dfbW91bnQ6IGZhbHNlDQogIH0pOw0KICBpZiAoIUZTLmlzTW91bnRwb2ludChsb29rdXAubm9kZSkpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDIyKTsNCiAgfQ0KICB2YXIgbm9kZSA9IGxvb2t1cC5ub2RlOw0KICB2YXIgbW91bnQgPSBub2RlLm1vdW50ZWQ7DQogIHZhciBtb3VudHMgPSBGUy5nZXRNb3VudHMobW91bnQpOw0KICBPYmplY3Qua2V5cyhGUy5uYW1lVGFibGUpLmZvckVhY2goZnVuY3Rpb24oaGFzaCkgew0KICAgdmFyIGN1cnJlbnQgPSBGUy5uYW1lVGFibGVbaGFzaF07DQogICB3aGlsZSAoY3VycmVudCkgew0KICAgIHZhciBuZXh0ID0gY3VycmVudC5uYW1lX25leHQ7DQogICAgaWYgKG1vdW50cy5pbmRleE9mKGN1cnJlbnQubW91bnQpICE9PSAtMSkgew0KICAgICBGUy5kZXN0cm95Tm9kZShjdXJyZW50KTsNCiAgICB9DQogICAgY3VycmVudCA9IG5leHQ7DQogICB9DQogIH0pOw0KICBub2RlLm1vdW50ZWQgPSBudWxsOw0KICB2YXIgaWR4ID0gbm9kZS5tb3VudC5tb3VudHMuaW5kZXhPZihtb3VudCk7DQogIGFzc2VydChpZHggIT09IC0xKTsNCiAgbm9kZS5tb3VudC5tb3VudHMuc3BsaWNlKGlkeCwgMSk7DQogfSwNCiBsb29rdXA6IGZ1bmN0aW9uKHBhcmVudCwgbmFtZSkgew0KICByZXR1cm4gcGFyZW50Lm5vZGVfb3BzLmxvb2t1cChwYXJlbnQsIG5hbWUpOw0KIH0sDQogbWtub2Q6IGZ1bmN0aW9uKHBhdGgsIG1vZGUsIGRldikgew0KICB2YXIgbG9va3VwID0gRlMubG9va3VwUGF0aChwYXRoLCB7DQogICBwYXJlbnQ6IHRydWUNCiAgfSk7DQogIHZhciBwYXJlbnQgPSBsb29rdXAubm9kZTsNCiAgdmFyIG5hbWUgPSBQQVRILmJhc2VuYW1lKHBhdGgpOw0KICBpZiAoIW5hbWUgfHwgbmFtZSA9PT0gIi4iIHx8IG5hbWUgPT09ICIuLiIpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDIyKTsNCiAgfQ0KICB2YXIgZXJyID0gRlMubWF5Q3JlYXRlKHBhcmVudCwgbmFtZSk7DQogIGlmIChlcnIpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycik7DQogIH0NCiAgaWYgKCFwYXJlbnQubm9kZV9vcHMubWtub2QpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDEpOw0KICB9DQogIHJldHVybiBwYXJlbnQubm9kZV9vcHMubWtub2QocGFyZW50LCBuYW1lLCBtb2RlLCBkZXYpOw0KIH0sDQogY3JlYXRlOiBmdW5jdGlvbihwYXRoLCBtb2RlKSB7DQogIG1vZGUgPSBtb2RlICE9PSB1bmRlZmluZWQgPyBtb2RlIDogNDM4Ow0KICBtb2RlICY9IDQwOTU7DQogIG1vZGUgfD0gMzI3Njg7DQogIHJldHVybiBGUy5ta25vZChwYXRoLCBtb2RlLCAwKTsNCiB9LA0KIG1rZGlyOiBmdW5jdGlvbihwYXRoLCBtb2RlKSB7DQogIG1vZGUgPSBtb2RlICE9PSB1bmRlZmluZWQgPyBtb2RlIDogNTExOw0KICBtb2RlICY9IDUxMSB8IDUxMjsNCiAgbW9kZSB8PSAxNjM4NDsNCiAgcmV0dXJuIEZTLm1rbm9kKHBhdGgsIG1vZGUsIDApOw0KIH0sDQogbWtkaXJUcmVlOiBmdW5jdGlvbihwYXRoLCBtb2RlKSB7DQogIHZhciBkaXJzID0gcGF0aC5zcGxpdCgiLyIpOw0KICB2YXIgZCA9ICIiOw0KICBmb3IgKHZhciBpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyArK2kpIHsNCiAgIGlmICghZGlyc1tpXSkgY29udGludWU7DQogICBkICs9ICIvIiArIGRpcnNbaV07DQogICB0cnkgew0KICAgIEZTLm1rZGlyKGQsIG1vZGUpOw0KICAgfSBjYXRjaCAoZSkgew0KICAgIGlmIChlLmVycm5vICE9IDE3KSB0aHJvdyBlOw0KICAgfQ0KICB9DQogfSwNCiBta2RldjogZnVuY3Rpb24ocGF0aCwgbW9kZSwgZGV2KSB7DQogIGlmICh0eXBlb2YgZGV2ID09PSAidW5kZWZpbmVkIikgew0KICAgZGV2ID0gbW9kZTsNCiAgIG1vZGUgPSA0Mzg7DQogIH0NCiAgbW9kZSB8PSA4MTkyOw0KICByZXR1cm4gRlMubWtub2QocGF0aCwgbW9kZSwgZGV2KTsNCiB9LA0KIHN5bWxpbms6IGZ1bmN0aW9uKG9sZHBhdGgsIG5ld3BhdGgpIHsNCiAgaWYgKCFQQVRILnJlc29sdmUob2xkcGF0aCkpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDIpOw0KICB9DQogIHZhciBsb29rdXAgPSBGUy5sb29rdXBQYXRoKG5ld3BhdGgsIHsNCiAgIHBhcmVudDogdHJ1ZQ0KICB9KTsNCiAgdmFyIHBhcmVudCA9IGxvb2t1cC5ub2RlOw0KICBpZiAoIXBhcmVudCkgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMik7DQogIH0NCiAgdmFyIG5ld25hbWUgPSBQQVRILmJhc2VuYW1lKG5ld3BhdGgpOw0KICB2YXIgZXJyID0gRlMubWF5Q3JlYXRlKHBhcmVudCwgbmV3bmFtZSk7DQogIGlmIChlcnIpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycik7DQogIH0NCiAgaWYgKCFwYXJlbnQubm9kZV9vcHMuc3ltbGluaykgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMSk7DQogIH0NCiAgcmV0dXJuIHBhcmVudC5ub2RlX29wcy5zeW1saW5rKHBhcmVudCwgbmV3bmFtZSwgb2xkcGF0aCk7DQogfSwNCiByZW5hbWU6IGZ1bmN0aW9uKG9sZF9wYXRoLCBuZXdfcGF0aCkgew0KICB2YXIgb2xkX2Rpcm5hbWUgPSBQQVRILmRpcm5hbWUob2xkX3BhdGgpOw0KICB2YXIgbmV3X2Rpcm5hbWUgPSBQQVRILmRpcm5hbWUobmV3X3BhdGgpOw0KICB2YXIgb2xkX25hbWUgPSBQQVRILmJhc2VuYW1lKG9sZF9wYXRoKTsNCiAgdmFyIG5ld19uYW1lID0gUEFUSC5iYXNlbmFtZShuZXdfcGF0aCk7DQogIHZhciBsb29rdXAsIG9sZF9kaXIsIG5ld19kaXI7DQogIHRyeSB7DQogICBsb29rdXAgPSBGUy5sb29rdXBQYXRoKG9sZF9wYXRoLCB7DQogICAgcGFyZW50OiB0cnVlDQogICB9KTsNCiAgIG9sZF9kaXIgPSBsb29rdXAubm9kZTsNCiAgIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgobmV3X3BhdGgsIHsNCiAgICBwYXJlbnQ6IHRydWUNCiAgIH0pOw0KICAgbmV3X2RpciA9IGxvb2t1cC5ub2RlOw0KICB9IGNhdGNoIChlKSB7DQogICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigxNik7DQogIH0NCiAgaWYgKCFvbGRfZGlyIHx8ICFuZXdfZGlyKSB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyKTsNCiAgaWYgKG9sZF9kaXIubW91bnQgIT09IG5ld19kaXIubW91bnQpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDE4KTsNCiAgfQ0KICB2YXIgb2xkX25vZGUgPSBGUy5sb29rdXBOb2RlKG9sZF9kaXIsIG9sZF9uYW1lKTsNCiAgdmFyIHJlbGF0aXZlID0gUEFUSC5yZWxhdGl2ZShvbGRfcGF0aCwgbmV3X2Rpcm5hbWUpOw0KICBpZiAocmVsYXRpdmUuY2hhckF0KDApICE9PSAiLiIpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDIyKTsNCiAgfQ0KICByZWxhdGl2ZSA9IFBBVEgucmVsYXRpdmUobmV3X3BhdGgsIG9sZF9kaXJuYW1lKTsNCiAgaWYgKHJlbGF0aXZlLmNoYXJBdCgwKSAhPT0gIi4iKSB7DQogICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigzOSk7DQogIH0NCiAgdmFyIG5ld19ub2RlOw0KICB0cnkgew0KICAgbmV3X25vZGUgPSBGUy5sb29rdXBOb2RlKG5ld19kaXIsIG5ld19uYW1lKTsNCiAgfSBjYXRjaCAoZSkge30NCiAgaWYgKG9sZF9ub2RlID09PSBuZXdfbm9kZSkgew0KICAgcmV0dXJuOw0KICB9DQogIHZhciBpc2RpciA9IEZTLmlzRGlyKG9sZF9ub2RlLm1vZGUpOw0KICB2YXIgZXJyID0gRlMubWF5RGVsZXRlKG9sZF9kaXIsIG9sZF9uYW1lLCBpc2Rpcik7DQogIGlmIChlcnIpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycik7DQogIH0NCiAgZXJyID0gbmV3X25vZGUgPyBGUy5tYXlEZWxldGUobmV3X2RpciwgbmV3X25hbWUsIGlzZGlyKSA6IEZTLm1heUNyZWF0ZShuZXdfZGlyLCBuZXdfbmFtZSk7DQogIGlmIChlcnIpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycik7DQogIH0NCiAgaWYgKCFvbGRfZGlyLm5vZGVfb3BzLnJlbmFtZSkgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMSk7DQogIH0NCiAgaWYgKEZTLmlzTW91bnRwb2ludChvbGRfbm9kZSkgfHwgbmV3X25vZGUgJiYgRlMuaXNNb3VudHBvaW50KG5ld19ub2RlKSkgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMTYpOw0KICB9DQogIGlmIChuZXdfZGlyICE9PSBvbGRfZGlyKSB7DQogICBlcnIgPSBGUy5ub2RlUGVybWlzc2lvbnMob2xkX2RpciwgInciKTsNCiAgIGlmIChlcnIpIHsNCiAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnIpOw0KICAgfQ0KICB9DQogIHRyeSB7DQogICBpZiAoRlMudHJhY2tpbmdEZWxlZ2F0ZVsid2lsbE1vdmVQYXRoIl0pIHsNCiAgICBGUy50cmFja2luZ0RlbGVnYXRlWyJ3aWxsTW92ZVBhdGgiXShvbGRfcGF0aCwgbmV3X3BhdGgpOw0KICAgfQ0KICB9IGNhdGNoIChlKSB7DQogICBjb25zb2xlLmxvZygiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnd2lsbE1vdmVQYXRoJ10oJyIgKyBvbGRfcGF0aCArICInLCAnIiArIG5ld19wYXRoICsgIicpIHRocmV3IGFuIGV4Y2VwdGlvbjogIiArIGUubWVzc2FnZSk7DQogIH0NCiAgRlMuaGFzaFJlbW92ZU5vZGUob2xkX25vZGUpOw0KICB0cnkgew0KICAgb2xkX2Rpci5ub2RlX29wcy5yZW5hbWUob2xkX25vZGUsIG5ld19kaXIsIG5ld19uYW1lKTsNCiAgfSBjYXRjaCAoZSkgew0KICAgdGhyb3cgZTsNCiAgfSBmaW5hbGx5IHsNCiAgIEZTLmhhc2hBZGROb2RlKG9sZF9ub2RlKTsNCiAgfQ0KICB0cnkgew0KICAgaWYgKEZTLnRyYWNraW5nRGVsZWdhdGVbIm9uTW92ZVBhdGgiXSkgRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25Nb3ZlUGF0aCJdKG9sZF9wYXRoLCBuZXdfcGF0aCk7DQogIH0gY2F0Y2ggKGUpIHsNCiAgIGNvbnNvbGUubG9nKCJGUy50cmFja2luZ0RlbGVnYXRlWydvbk1vdmVQYXRoJ10oJyIgKyBvbGRfcGF0aCArICInLCAnIiArIG5ld19wYXRoICsgIicpIHRocmV3IGFuIGV4Y2VwdGlvbjogIiArIGUubWVzc2FnZSk7DQogIH0NCiB9LA0KIHJtZGlyOiBmdW5jdGlvbihwYXRoKSB7DQogIHZhciBsb29rdXAgPSBGUy5sb29rdXBQYXRoKHBhdGgsIHsNCiAgIHBhcmVudDogdHJ1ZQ0KICB9KTsNCiAgdmFyIHBhcmVudCA9IGxvb2t1cC5ub2RlOw0KICB2YXIgbmFtZSA9IFBBVEguYmFzZW5hbWUocGF0aCk7DQogIHZhciBub2RlID0gRlMubG9va3VwTm9kZShwYXJlbnQsIG5hbWUpOw0KICB2YXIgZXJyID0gRlMubWF5RGVsZXRlKHBhcmVudCwgbmFtZSwgdHJ1ZSk7DQogIGlmIChlcnIpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycik7DQogIH0NCiAgaWYgKCFwYXJlbnQubm9kZV9vcHMucm1kaXIpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDEpOw0KICB9DQogIGlmIChGUy5pc01vdW50cG9pbnQobm9kZSkpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDE2KTsNCiAgfQ0KICB0cnkgew0KICAgaWYgKEZTLnRyYWNraW5nRGVsZWdhdGVbIndpbGxEZWxldGVQYXRoIl0pIHsNCiAgICBGUy50cmFja2luZ0RlbGVnYXRlWyJ3aWxsRGVsZXRlUGF0aCJdKHBhdGgpOw0KICAgfQ0KICB9IGNhdGNoIChlKSB7DQogICBjb25zb2xlLmxvZygiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnd2lsbERlbGV0ZVBhdGgnXSgnIiArIHBhdGggKyAiJykgdGhyZXcgYW4gZXhjZXB0aW9uOiAiICsgZS5tZXNzYWdlKTsNCiAgfQ0KICBwYXJlbnQubm9kZV9vcHMucm1kaXIocGFyZW50LCBuYW1lKTsNCiAgRlMuZGVzdHJveU5vZGUobm9kZSk7DQogIHRyeSB7DQogICBpZiAoRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25EZWxldGVQYXRoIl0pIEZTLnRyYWNraW5nRGVsZWdhdGVbIm9uRGVsZXRlUGF0aCJdKHBhdGgpOw0KICB9IGNhdGNoIChlKSB7DQogICBjb25zb2xlLmxvZygiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnb25EZWxldGVQYXRoJ10oJyIgKyBwYXRoICsgIicpIHRocmV3IGFuIGV4Y2VwdGlvbjogIiArIGUubWVzc2FnZSk7DQogIH0NCiB9LA0KIHJlYWRkaXI6IGZ1bmN0aW9uKHBhdGgpIHsNCiAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgocGF0aCwgew0KICAgZm9sbG93OiB0cnVlDQogIH0pOw0KICB2YXIgbm9kZSA9IGxvb2t1cC5ub2RlOw0KICBpZiAoIW5vZGUubm9kZV9vcHMucmVhZGRpcikgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjApOw0KICB9DQogIHJldHVybiBub2RlLm5vZGVfb3BzLnJlYWRkaXIobm9kZSk7DQogfSwNCiB1bmxpbms6IGZ1bmN0aW9uKHBhdGgpIHsNCiAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgocGF0aCwgew0KICAgcGFyZW50OiB0cnVlDQogIH0pOw0KICB2YXIgcGFyZW50ID0gbG9va3VwLm5vZGU7DQogIHZhciBuYW1lID0gUEFUSC5iYXNlbmFtZShwYXRoKTsNCiAgdmFyIG5vZGUgPSBGUy5sb29rdXBOb2RlKHBhcmVudCwgbmFtZSk7DQogIHZhciBlcnIgPSBGUy5tYXlEZWxldGUocGFyZW50LCBuYW1lLCBmYWxzZSk7DQogIGlmIChlcnIpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycik7DQogIH0NCiAgaWYgKCFwYXJlbnQubm9kZV9vcHMudW5saW5rKSB7DQogICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigxKTsNCiAgfQ0KICBpZiAoRlMuaXNNb3VudHBvaW50KG5vZGUpKSB7DQogICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigxNik7DQogIH0NCiAgdHJ5IHsNCiAgIGlmIChGUy50cmFja2luZ0RlbGVnYXRlWyJ3aWxsRGVsZXRlUGF0aCJdKSB7DQogICAgRlMudHJhY2tpbmdEZWxlZ2F0ZVsid2lsbERlbGV0ZVBhdGgiXShwYXRoKTsNCiAgIH0NCiAgfSBjYXRjaCAoZSkgew0KICAgY29uc29sZS5sb2coIkZTLnRyYWNraW5nRGVsZWdhdGVbJ3dpbGxEZWxldGVQYXRoJ10oJyIgKyBwYXRoICsgIicpIHRocmV3IGFuIGV4Y2VwdGlvbjogIiArIGUubWVzc2FnZSk7DQogIH0NCiAgcGFyZW50Lm5vZGVfb3BzLnVubGluayhwYXJlbnQsIG5hbWUpOw0KICBGUy5kZXN0cm95Tm9kZShub2RlKTsNCiAgdHJ5IHsNCiAgIGlmIChGUy50cmFja2luZ0RlbGVnYXRlWyJvbkRlbGV0ZVBhdGgiXSkgRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25EZWxldGVQYXRoIl0ocGF0aCk7DQogIH0gY2F0Y2ggKGUpIHsNCiAgIGNvbnNvbGUubG9nKCJGUy50cmFja2luZ0RlbGVnYXRlWydvbkRlbGV0ZVBhdGgnXSgnIiArIHBhdGggKyAiJykgdGhyZXcgYW4gZXhjZXB0aW9uOiAiICsgZS5tZXNzYWdlKTsNCiAgfQ0KIH0sDQogcmVhZGxpbms6IGZ1bmN0aW9uKHBhdGgpIHsNCiAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgocGF0aCk7DQogIHZhciBsaW5rID0gbG9va3VwLm5vZGU7DQogIGlmICghbGluaykgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMik7DQogIH0NCiAgaWYgKCFsaW5rLm5vZGVfb3BzLnJlYWRsaW5rKSB7DQogICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyMik7DQogIH0NCiAgcmV0dXJuIFBBVEgucmVzb2x2ZShGUy5nZXRQYXRoKGxpbmsucGFyZW50KSwgbGluay5ub2RlX29wcy5yZWFkbGluayhsaW5rKSk7DQogfSwNCiBzdGF0OiBmdW5jdGlvbihwYXRoLCBkb250Rm9sbG93KSB7DQogIHZhciBsb29rdXAgPSBGUy5sb29rdXBQYXRoKHBhdGgsIHsNCiAgIGZvbGxvdzogIWRvbnRGb2xsb3cNCiAgfSk7DQogIHZhciBub2RlID0gbG9va3VwLm5vZGU7DQogIGlmICghbm9kZSkgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMik7DQogIH0NCiAgaWYgKCFub2RlLm5vZGVfb3BzLmdldGF0dHIpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDEpOw0KICB9DQogIHJldHVybiBub2RlLm5vZGVfb3BzLmdldGF0dHIobm9kZSk7DQogfSwNCiBsc3RhdDogZnVuY3Rpb24ocGF0aCkgew0KICByZXR1cm4gRlMuc3RhdChwYXRoLCB0cnVlKTsNCiB9LA0KIGNobW9kOiBmdW5jdGlvbihwYXRoLCBtb2RlLCBkb250Rm9sbG93KSB7DQogIHZhciBub2RlOw0KICBpZiAodHlwZW9mIHBhdGggPT09ICJzdHJpbmciKSB7DQogICB2YXIgbG9va3VwID0gRlMubG9va3VwUGF0aChwYXRoLCB7DQogICAgZm9sbG93OiAhZG9udEZvbGxvdw0KICAgfSk7DQogICBub2RlID0gbG9va3VwLm5vZGU7DQogIH0gZWxzZSB7DQogICBub2RlID0gcGF0aDsNCiAgfQ0KICBpZiAoIW5vZGUubm9kZV9vcHMuc2V0YXR0cikgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMSk7DQogIH0NCiAgbm9kZS5ub2RlX29wcy5zZXRhdHRyKG5vZGUsIHsNCiAgIG1vZGU6IG1vZGUgJiA0MDk1IHwgbm9kZS5tb2RlICYgfjQwOTUsDQogICB0aW1lc3RhbXA6IERhdGUubm93KCkNCiAgfSk7DQogfSwNCiBsY2htb2Q6IGZ1bmN0aW9uKHBhdGgsIG1vZGUpIHsNCiAgRlMuY2htb2QocGF0aCwgbW9kZSwgdHJ1ZSk7DQogfSwNCiBmY2htb2Q6IGZ1bmN0aW9uKGZkLCBtb2RlKSB7DQogIHZhciBzdHJlYW0gPSBGUy5nZXRTdHJlYW0oZmQpOw0KICBpZiAoIXN0cmVhbSkgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOSk7DQogIH0NCiAgRlMuY2htb2Qoc3RyZWFtLm5vZGUsIG1vZGUpOw0KIH0sDQogY2hvd246IGZ1bmN0aW9uKHBhdGgsIHVpZCwgZ2lkLCBkb250Rm9sbG93KSB7DQogIHZhciBub2RlOw0KICBpZiAodHlwZW9mIHBhdGggPT09ICJzdHJpbmciKSB7DQogICB2YXIgbG9va3VwID0gRlMubG9va3VwUGF0aChwYXRoLCB7DQogICAgZm9sbG93OiAhZG9udEZvbGxvdw0KICAgfSk7DQogICBub2RlID0gbG9va3VwLm5vZGU7DQogIH0gZWxzZSB7DQogICBub2RlID0gcGF0aDsNCiAgfQ0KICBpZiAoIW5vZGUubm9kZV9vcHMuc2V0YXR0cikgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMSk7DQogIH0NCiAgbm9kZS5ub2RlX29wcy5zZXRhdHRyKG5vZGUsIHsNCiAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKQ0KICB9KTsNCiB9LA0KIGxjaG93bjogZnVuY3Rpb24ocGF0aCwgdWlkLCBnaWQpIHsNCiAgRlMuY2hvd24ocGF0aCwgdWlkLCBnaWQsIHRydWUpOw0KIH0sDQogZmNob3duOiBmdW5jdGlvbihmZCwgdWlkLCBnaWQpIHsNCiAgdmFyIHN0cmVhbSA9IEZTLmdldFN0cmVhbShmZCk7DQogIGlmICghc3RyZWFtKSB7DQogICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig5KTsNCiAgfQ0KICBGUy5jaG93bihzdHJlYW0ubm9kZSwgdWlkLCBnaWQpOw0KIH0sDQogdHJ1bmNhdGU6IGZ1bmN0aW9uKHBhdGgsIGxlbikgew0KICBpZiAobGVuIDwgMCkgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjIpOw0KICB9DQogIHZhciBub2RlOw0KICBpZiAodHlwZW9mIHBhdGggPT09ICJzdHJpbmciKSB7DQogICB2YXIgbG9va3VwID0gRlMubG9va3VwUGF0aChwYXRoLCB7DQogICAgZm9sbG93OiB0cnVlDQogICB9KTsNCiAgIG5vZGUgPSBsb29rdXAubm9kZTsNCiAgfSBlbHNlIHsNCiAgIG5vZGUgPSBwYXRoOw0KICB9DQogIGlmICghbm9kZS5ub2RlX29wcy5zZXRhdHRyKSB7DQogICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigxKTsNCiAgfQ0KICBpZiAoRlMuaXNEaXIobm9kZS5tb2RlKSkgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjEpOw0KICB9DQogIGlmICghRlMuaXNGaWxlKG5vZGUubW9kZSkpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDIyKTsNCiAgfQ0KICB2YXIgZXJyID0gRlMubm9kZVBlcm1pc3Npb25zKG5vZGUsICJ3Iik7DQogIGlmIChlcnIpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycik7DQogIH0NCiAgbm9kZS5ub2RlX29wcy5zZXRhdHRyKG5vZGUsIHsNCiAgIHNpemU6IGxlbiwNCiAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKQ0KICB9KTsNCiB9LA0KIGZ0cnVuY2F0ZTogZnVuY3Rpb24oZmQsIGxlbikgew0KICB2YXIgc3RyZWFtID0gRlMuZ2V0U3RyZWFtKGZkKTsNCiAgaWYgKCFzdHJlYW0pIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDkpOw0KICB9DQogIGlmICgoc3RyZWFtLmZsYWdzICYgMjA5NzE1NSkgPT09IDApIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDIyKTsNCiAgfQ0KICBGUy50cnVuY2F0ZShzdHJlYW0ubm9kZSwgbGVuKTsNCiB9LA0KIHV0aW1lOiBmdW5jdGlvbihwYXRoLCBhdGltZSwgbXRpbWUpIHsNCiAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgocGF0aCwgew0KICAgZm9sbG93OiB0cnVlDQogIH0pOw0KICB2YXIgbm9kZSA9IGxvb2t1cC5ub2RlOw0KICBub2RlLm5vZGVfb3BzLnNldGF0dHIobm9kZSwgew0KICAgdGltZXN0YW1wOiBNYXRoLm1heChhdGltZSwgbXRpbWUpDQogIH0pOw0KIH0sDQogb3BlbjogZnVuY3Rpb24ocGF0aCwgZmxhZ3MsIG1vZGUsIGZkX3N0YXJ0LCBmZF9lbmQpIHsNCiAgaWYgKHBhdGggPT09ICIiKSB7DQogICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyKTsNCiAgfQ0KICBmbGFncyA9IHR5cGVvZiBmbGFncyA9PT0gInN0cmluZyIgPyBGUy5tb2RlU3RyaW5nVG9GbGFncyhmbGFncykgOiBmbGFnczsNCiAgbW9kZSA9IHR5cGVvZiBtb2RlID09PSAidW5kZWZpbmVkIiA/IDQzOCA6IG1vZGU7DQogIGlmIChmbGFncyAmIDY0KSB7DQogICBtb2RlID0gbW9kZSAmIDQwOTUgfCAzMjc2ODsNCiAgfSBlbHNlIHsNCiAgIG1vZGUgPSAwOw0KICB9DQogIHZhciBub2RlOw0KICBpZiAodHlwZW9mIHBhdGggPT09ICJvYmplY3QiKSB7DQogICBub2RlID0gcGF0aDsNCiAgfSBlbHNlIHsNCiAgIHBhdGggPSBQQVRILm5vcm1hbGl6ZShwYXRoKTsNCiAgIHRyeSB7DQogICAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgocGF0aCwgew0KICAgICBmb2xsb3c6ICEoZmxhZ3MgJiAxMzEwNzIpDQogICAgfSk7DQogICAgbm9kZSA9IGxvb2t1cC5ub2RlOw0KICAgfSBjYXRjaCAoZSkge30NCiAgfQ0KICB2YXIgY3JlYXRlZCA9IGZhbHNlOw0KICBpZiAoZmxhZ3MgJiA2NCkgew0KICAgaWYgKG5vZGUpIHsNCiAgICBpZiAoZmxhZ3MgJiAxMjgpIHsNCiAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMTcpOw0KICAgIH0NCiAgIH0gZWxzZSB7DQogICAgbm9kZSA9IEZTLm1rbm9kKHBhdGgsIG1vZGUsIDApOw0KICAgIGNyZWF0ZWQgPSB0cnVlOw0KICAgfQ0KICB9DQogIGlmICghbm9kZSkgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMik7DQogIH0NCiAgaWYgKEZTLmlzQ2hyZGV2KG5vZGUubW9kZSkpIHsNCiAgIGZsYWdzICY9IH41MTI7DQogIH0NCiAgaWYgKGZsYWdzICYgNjU1MzYgJiYgIUZTLmlzRGlyKG5vZGUubW9kZSkpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDIwKTsNCiAgfQ0KICBpZiAoIWNyZWF0ZWQpIHsNCiAgIHZhciBlcnIgPSBGUy5tYXlPcGVuKG5vZGUsIGZsYWdzKTsNCiAgIGlmIChlcnIpIHsNCiAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcihlcnIpOw0KICAgfQ0KICB9DQogIGlmIChmbGFncyAmIDUxMikgew0KICAgRlMudHJ1bmNhdGUobm9kZSwgMCk7DQogIH0NCiAgZmxhZ3MgJj0gfigxMjggfCA1MTIpOw0KICB2YXIgc3RyZWFtID0gRlMuY3JlYXRlU3RyZWFtKHsNCiAgIG5vZGU6IG5vZGUsDQogICBwYXRoOiBGUy5nZXRQYXRoKG5vZGUpLA0KICAgZmxhZ3M6IGZsYWdzLA0KICAgc2Vla2FibGU6IHRydWUsDQogICBwb3NpdGlvbjogMCwNCiAgIHN0cmVhbV9vcHM6IG5vZGUuc3RyZWFtX29wcywNCiAgIHVuZ290dGVuOiBbXSwNCiAgIGVycm9yOiBmYWxzZQ0KICB9LCBmZF9zdGFydCwgZmRfZW5kKTsNCiAgaWYgKHN0cmVhbS5zdHJlYW1fb3BzLm9wZW4pIHsNCiAgIHN0cmVhbS5zdHJlYW1fb3BzLm9wZW4oc3RyZWFtKTsNCiAgfQ0KICBpZiAoTW9kdWxlWyJsb2dSZWFkRmlsZXMiXSAmJiAhKGZsYWdzICYgMSkpIHsNCiAgIGlmICghRlMucmVhZEZpbGVzKSBGUy5yZWFkRmlsZXMgPSB7fTsNCiAgIGlmICghKHBhdGggaW4gRlMucmVhZEZpbGVzKSkgew0KICAgIEZTLnJlYWRGaWxlc1twYXRoXSA9IDE7DQogICAgY29uc29sZS5sb2coIkZTLnRyYWNraW5nRGVsZWdhdGUgZXJyb3Igb24gcmVhZCBmaWxlOiAiICsgcGF0aCk7DQogICB9DQogIH0NCiAgdHJ5IHsNCiAgIGlmIChGUy50cmFja2luZ0RlbGVnYXRlWyJvbk9wZW5GaWxlIl0pIHsNCiAgICB2YXIgdHJhY2tpbmdGbGFncyA9IDA7DQogICAgaWYgKChmbGFncyAmIDIwOTcxNTUpICE9PSAxKSB7DQogICAgIHRyYWNraW5nRmxhZ3MgfD0gRlMudHJhY2tpbmcub3BlbkZsYWdzLlJFQUQ7DQogICAgfQ0KICAgIGlmICgoZmxhZ3MgJiAyMDk3MTU1KSAhPT0gMCkgew0KICAgICB0cmFja2luZ0ZsYWdzIHw9IEZTLnRyYWNraW5nLm9wZW5GbGFncy5XUklURTsNCiAgICB9DQogICAgRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25PcGVuRmlsZSJdKHBhdGgsIHRyYWNraW5nRmxhZ3MpOw0KICAgfQ0KICB9IGNhdGNoIChlKSB7DQogICBjb25zb2xlLmxvZygiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnb25PcGVuRmlsZSddKCciICsgcGF0aCArICInLCBmbGFncykgdGhyZXcgYW4gZXhjZXB0aW9uOiAiICsgZS5tZXNzYWdlKTsNCiAgfQ0KICByZXR1cm4gc3RyZWFtOw0KIH0sDQogY2xvc2U6IGZ1bmN0aW9uKHN0cmVhbSkgew0KICBpZiAoRlMuaXNDbG9zZWQoc3RyZWFtKSkgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOSk7DQogIH0NCiAgaWYgKHN0cmVhbS5nZXRkZW50cykgc3RyZWFtLmdldGRlbnRzID0gbnVsbDsNCiAgdHJ5IHsNCiAgIGlmIChzdHJlYW0uc3RyZWFtX29wcy5jbG9zZSkgew0KICAgIHN0cmVhbS5zdHJlYW1fb3BzLmNsb3NlKHN0cmVhbSk7DQogICB9DQogIH0gY2F0Y2ggKGUpIHsNCiAgIHRocm93IGU7DQogIH0gZmluYWxseSB7DQogICBGUy5jbG9zZVN0cmVhbShzdHJlYW0uZmQpOw0KICB9DQogIHN0cmVhbS5mZCA9IG51bGw7DQogfSwNCiBpc0Nsb3NlZDogZnVuY3Rpb24oc3RyZWFtKSB7DQogIHJldHVybiBzdHJlYW0uZmQgPT09IG51bGw7DQogfSwNCiBsbHNlZWs6IGZ1bmN0aW9uKHN0cmVhbSwgb2Zmc2V0LCB3aGVuY2UpIHsNCiAgaWYgKEZTLmlzQ2xvc2VkKHN0cmVhbSkpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDkpOw0KICB9DQogIGlmICghc3RyZWFtLnNlZWthYmxlIHx8ICFzdHJlYW0uc3RyZWFtX29wcy5sbHNlZWspIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDI5KTsNCiAgfQ0KICBpZiAod2hlbmNlICE9IDAgJiYgd2hlbmNlICE9IDEgJiYgd2hlbmNlICE9IDIpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDIyKTsNCiAgfQ0KICBzdHJlYW0ucG9zaXRpb24gPSBzdHJlYW0uc3RyZWFtX29wcy5sbHNlZWsoc3RyZWFtLCBvZmZzZXQsIHdoZW5jZSk7DQogIHN0cmVhbS51bmdvdHRlbiA9IFtdOw0KICByZXR1cm4gc3RyZWFtLnBvc2l0aW9uOw0KIH0sDQogcmVhZDogZnVuY3Rpb24oc3RyZWFtLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbikgew0KICBpZiAobGVuZ3RoIDwgMCB8fCBwb3NpdGlvbiA8IDApIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDIyKTsNCiAgfQ0KICBpZiAoRlMuaXNDbG9zZWQoc3RyZWFtKSkgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOSk7DQogIH0NCiAgaWYgKChzdHJlYW0uZmxhZ3MgJiAyMDk3MTU1KSA9PT0gMSkgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOSk7DQogIH0NCiAgaWYgKEZTLmlzRGlyKHN0cmVhbS5ub2RlLm1vZGUpKSB7DQogICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyMSk7DQogIH0NCiAgaWYgKCFzdHJlYW0uc3RyZWFtX29wcy5yZWFkKSB7DQogICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyMik7DQogIH0NCiAgdmFyIHNlZWtpbmcgPSB0eXBlb2YgcG9zaXRpb24gIT09ICJ1bmRlZmluZWQiOw0KICBpZiAoIXNlZWtpbmcpIHsNCiAgIHBvc2l0aW9uID0gc3RyZWFtLnBvc2l0aW9uOw0KICB9IGVsc2UgaWYgKCFzdHJlYW0uc2Vla2FibGUpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDI5KTsNCiAgfQ0KICB2YXIgYnl0ZXNSZWFkID0gc3RyZWFtLnN0cmVhbV9vcHMucmVhZChzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uKTsNCiAgaWYgKCFzZWVraW5nKSBzdHJlYW0ucG9zaXRpb24gKz0gYnl0ZXNSZWFkOw0KICByZXR1cm4gYnl0ZXNSZWFkOw0KIH0sDQogd3JpdGU6IGZ1bmN0aW9uKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbk93bikgew0KICBpZiAobGVuZ3RoIDwgMCB8fCBwb3NpdGlvbiA8IDApIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDIyKTsNCiAgfQ0KICBpZiAoRlMuaXNDbG9zZWQoc3RyZWFtKSkgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOSk7DQogIH0NCiAgaWYgKChzdHJlYW0uZmxhZ3MgJiAyMDk3MTU1KSA9PT0gMCkgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOSk7DQogIH0NCiAgaWYgKEZTLmlzRGlyKHN0cmVhbS5ub2RlLm1vZGUpKSB7DQogICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyMSk7DQogIH0NCiAgaWYgKCFzdHJlYW0uc3RyZWFtX29wcy53cml0ZSkgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjIpOw0KICB9DQogIGlmIChzdHJlYW0uZmxhZ3MgJiAxMDI0KSB7DQogICBGUy5sbHNlZWsoc3RyZWFtLCAwLCAyKTsNCiAgfQ0KICB2YXIgc2Vla2luZyA9IHR5cGVvZiBwb3NpdGlvbiAhPT0gInVuZGVmaW5lZCI7DQogIGlmICghc2Vla2luZykgew0KICAgcG9zaXRpb24gPSBzdHJlYW0ucG9zaXRpb247DQogIH0gZWxzZSBpZiAoIXN0cmVhbS5zZWVrYWJsZSkgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjkpOw0KICB9DQogIHZhciBieXRlc1dyaXR0ZW4gPSBzdHJlYW0uc3RyZWFtX29wcy53cml0ZShzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uLCBjYW5Pd24pOw0KICBpZiAoIXNlZWtpbmcpIHN0cmVhbS5wb3NpdGlvbiArPSBieXRlc1dyaXR0ZW47DQogIHRyeSB7DQogICBpZiAoc3RyZWFtLnBhdGggJiYgRlMudHJhY2tpbmdEZWxlZ2F0ZVsib25Xcml0ZVRvRmlsZSJdKSBGUy50cmFja2luZ0RlbGVnYXRlWyJvbldyaXRlVG9GaWxlIl0oc3RyZWFtLnBhdGgpOw0KICB9IGNhdGNoIChlKSB7DQogICBjb25zb2xlLmxvZygiRlMudHJhY2tpbmdEZWxlZ2F0ZVsnb25Xcml0ZVRvRmlsZSddKCciICsgc3RyZWFtLnBhdGggKyAiJykgdGhyZXcgYW4gZXhjZXB0aW9uOiAiICsgZS5tZXNzYWdlKTsNCiAgfQ0KICByZXR1cm4gYnl0ZXNXcml0dGVuOw0KIH0sDQogYWxsb2NhdGU6IGZ1bmN0aW9uKHN0cmVhbSwgb2Zmc2V0LCBsZW5ndGgpIHsNCiAgaWYgKEZTLmlzQ2xvc2VkKHN0cmVhbSkpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDkpOw0KICB9DQogIGlmIChvZmZzZXQgPCAwIHx8IGxlbmd0aCA8PSAwKSB7DQogICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigyMik7DQogIH0NCiAgaWYgKChzdHJlYW0uZmxhZ3MgJiAyMDk3MTU1KSA9PT0gMCkgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOSk7DQogIH0NCiAgaWYgKCFGUy5pc0ZpbGUoc3RyZWFtLm5vZGUubW9kZSkgJiYgIUZTLmlzRGlyKHN0cmVhbS5ub2RlLm1vZGUpKSB7DQogICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcigxOSk7DQogIH0NCiAgaWYgKCFzdHJlYW0uc3RyZWFtX29wcy5hbGxvY2F0ZSkgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOTUpOw0KICB9DQogIHN0cmVhbS5zdHJlYW1fb3BzLmFsbG9jYXRlKHN0cmVhbSwgb2Zmc2V0LCBsZW5ndGgpOw0KIH0sDQogbW1hcDogZnVuY3Rpb24oc3RyZWFtLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgcHJvdCwgZmxhZ3MpIHsNCiAgaWYgKChzdHJlYW0uZmxhZ3MgJiAyMDk3MTU1KSA9PT0gMSkgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMTMpOw0KICB9DQogIGlmICghc3RyZWFtLnN0cmVhbV9vcHMubW1hcCkgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMTkpOw0KICB9DQogIHJldHVybiBzdHJlYW0uc3RyZWFtX29wcy5tbWFwKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIHByb3QsIGZsYWdzKTsNCiB9LA0KIG1zeW5jOiBmdW5jdGlvbihzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIG1tYXBGbGFncykgew0KICBpZiAoIXN0cmVhbSB8fCAhc3RyZWFtLnN0cmVhbV9vcHMubXN5bmMpIHsNCiAgIHJldHVybiAwOw0KICB9DQogIHJldHVybiBzdHJlYW0uc3RyZWFtX29wcy5tc3luYyhzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIG1tYXBGbGFncyk7DQogfSwNCiBtdW5tYXA6IGZ1bmN0aW9uKHN0cmVhbSkgew0KICByZXR1cm4gMDsNCiB9LA0KIGlvY3RsOiBmdW5jdGlvbihzdHJlYW0sIGNtZCwgYXJnKSB7DQogIGlmICghc3RyZWFtLnN0cmVhbV9vcHMuaW9jdGwpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDI1KTsNCiAgfQ0KICByZXR1cm4gc3RyZWFtLnN0cmVhbV9vcHMuaW9jdGwoc3RyZWFtLCBjbWQsIGFyZyk7DQogfSwNCiByZWFkRmlsZTogZnVuY3Rpb24ocGF0aCwgb3B0cykgew0KICBvcHRzID0gb3B0cyB8fCB7fTsNCiAgb3B0cy5mbGFncyA9IG9wdHMuZmxhZ3MgfHwgInIiOw0KICBvcHRzLmVuY29kaW5nID0gb3B0cy5lbmNvZGluZyB8fCAiYmluYXJ5IjsNCiAgaWYgKG9wdHMuZW5jb2RpbmcgIT09ICJ1dGY4IiAmJiBvcHRzLmVuY29kaW5nICE9PSAiYmluYXJ5Iikgew0KICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVuY29kaW5nIHR5cGUgIicgKyBvcHRzLmVuY29kaW5nICsgJyInKTsNCiAgfQ0KICB2YXIgcmV0Ow0KICB2YXIgc3RyZWFtID0gRlMub3BlbihwYXRoLCBvcHRzLmZsYWdzKTsNCiAgdmFyIHN0YXQgPSBGUy5zdGF0KHBhdGgpOw0KICB2YXIgbGVuZ3RoID0gc3RhdC5zaXplOw0KICB2YXIgYnVmID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTsNCiAgRlMucmVhZChzdHJlYW0sIGJ1ZiwgMCwgbGVuZ3RoLCAwKTsNCiAgaWYgKG9wdHMuZW5jb2RpbmcgPT09ICJ1dGY4Iikgew0KICAgcmV0ID0gVVRGOEFycmF5VG9TdHJpbmcoYnVmLCAwKTsNCiAgfSBlbHNlIGlmIChvcHRzLmVuY29kaW5nID09PSAiYmluYXJ5Iikgew0KICAgcmV0ID0gYnVmOw0KICB9DQogIEZTLmNsb3NlKHN0cmVhbSk7DQogIHJldHVybiByZXQ7DQogfSwNCiB3cml0ZUZpbGU6IGZ1bmN0aW9uKHBhdGgsIGRhdGEsIG9wdHMpIHsNCiAgb3B0cyA9IG9wdHMgfHwge307DQogIG9wdHMuZmxhZ3MgPSBvcHRzLmZsYWdzIHx8ICJ3IjsNCiAgdmFyIHN0cmVhbSA9IEZTLm9wZW4ocGF0aCwgb3B0cy5mbGFncywgb3B0cy5tb2RlKTsNCiAgaWYgKHR5cGVvZiBkYXRhID09PSAic3RyaW5nIikgew0KICAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGxlbmd0aEJ5dGVzVVRGOChkYXRhKSArIDEpOw0KICAgdmFyIGFjdHVhbE51bUJ5dGVzID0gc3RyaW5nVG9VVEY4QXJyYXkoZGF0YSwgYnVmLCAwLCBidWYubGVuZ3RoKTsNCiAgIEZTLndyaXRlKHN0cmVhbSwgYnVmLCAwLCBhY3R1YWxOdW1CeXRlcywgdW5kZWZpbmVkLCBvcHRzLmNhbk93bik7DQogIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGRhdGEpKSB7DQogICBGUy53cml0ZShzdHJlYW0sIGRhdGEsIDAsIGRhdGEuYnl0ZUxlbmd0aCwgdW5kZWZpbmVkLCBvcHRzLmNhbk93bik7DQogIH0gZWxzZSB7DQogICB0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIGRhdGEgdHlwZSIpOw0KICB9DQogIEZTLmNsb3NlKHN0cmVhbSk7DQogfSwNCiBjd2Q6IGZ1bmN0aW9uKCkgew0KICByZXR1cm4gRlMuY3VycmVudFBhdGg7DQogfSwNCiBjaGRpcjogZnVuY3Rpb24ocGF0aCkgew0KICB2YXIgbG9va3VwID0gRlMubG9va3VwUGF0aChwYXRoLCB7DQogICBmb2xsb3c6IHRydWUNCiAgfSk7DQogIGlmIChsb29rdXAubm9kZSA9PT0gbnVsbCkgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMik7DQogIH0NCiAgaWYgKCFGUy5pc0Rpcihsb29rdXAubm9kZS5tb2RlKSkgew0KICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoMjApOw0KICB9DQogIHZhciBlcnIgPSBGUy5ub2RlUGVybWlzc2lvbnMobG9va3VwLm5vZGUsICJ4Iik7DQogIGlmIChlcnIpIHsNCiAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKGVycik7DQogIH0NCiAgRlMuY3VycmVudFBhdGggPSBsb29rdXAucGF0aDsNCiB9LA0KIGNyZWF0ZURlZmF1bHREaXJlY3RvcmllczogZnVuY3Rpb24oKSB7DQogIEZTLm1rZGlyKCIvdG1wIik7DQogIEZTLm1rZGlyKCIvaG9tZSIpOw0KICBGUy5ta2RpcigiL2hvbWUvd2ViX3VzZXIiKTsNCiB9LA0KIGNyZWF0ZURlZmF1bHREZXZpY2VzOiBmdW5jdGlvbigpIHsNCiAgRlMubWtkaXIoIi9kZXYiKTsNCiAgRlMucmVnaXN0ZXJEZXZpY2UoRlMubWFrZWRldigxLCAzKSwgew0KICAgcmVhZDogZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIDA7DQogICB9LA0KICAgd3JpdGU6IGZ1bmN0aW9uKHN0cmVhbSwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zKSB7DQogICAgcmV0dXJuIGxlbmd0aDsNCiAgIH0NCiAgfSk7DQogIEZTLm1rZGV2KCIvZGV2L251bGwiLCBGUy5tYWtlZGV2KDEsIDMpKTsNCiAgVFRZLnJlZ2lzdGVyKEZTLm1ha2VkZXYoNSwgMCksIFRUWS5kZWZhdWx0X3R0eV9vcHMpOw0KICBUVFkucmVnaXN0ZXIoRlMubWFrZWRldig2LCAwKSwgVFRZLmRlZmF1bHRfdHR5MV9vcHMpOw0KICBGUy5ta2RldigiL2Rldi90dHkiLCBGUy5tYWtlZGV2KDUsIDApKTsNCiAgRlMubWtkZXYoIi9kZXYvdHR5MSIsIEZTLm1ha2VkZXYoNiwgMCkpOw0KICB2YXIgcmFuZG9tX2RldmljZTsNCiAgaWYgKHR5cGVvZiBjcnlwdG8gPT09ICJvYmplY3QiICYmIHR5cGVvZiBjcnlwdG9bImdldFJhbmRvbVZhbHVlcyJdID09PSAiZnVuY3Rpb24iKSB7DQogICB2YXIgcmFuZG9tQnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMSk7DQogICByYW5kb21fZGV2aWNlID0gZnVuY3Rpb24oKSB7DQogICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhyYW5kb21CdWZmZXIpOw0KICAgIHJldHVybiByYW5kb21CdWZmZXJbMF07DQogICB9Ow0KICB9IGVsc2UgaWYgKEVOVklST05NRU5UX0lTX05PREUpIHsNCiAgIHRyeSB7DQogICAgdmFyIGNyeXB0b19tb2R1bGUgPSByZXF1aXJlKCJjcnlwdG8iKTsNCiAgICByYW5kb21fZGV2aWNlID0gZnVuY3Rpb24oKSB7DQogICAgIHJldHVybiBjcnlwdG9fbW9kdWxlWyJyYW5kb21CeXRlcyJdKDEpWzBdOw0KICAgIH07DQogICB9IGNhdGNoIChlKSB7DQogICAgcmFuZG9tX2RldmljZSA9IGZ1bmN0aW9uKCkgew0KICAgICByZXR1cm4gTWF0aC5yYW5kb20oKSAqIDI1NiB8IDA7DQogICAgfTsNCiAgIH0NCiAgfSBlbHNlIHsNCiAgIHJhbmRvbV9kZXZpY2UgPSBmdW5jdGlvbigpIHsNCiAgICBhYm9ydCgicmFuZG9tX2RldmljZSIpOw0KICAgfTsNCiAgfQ0KICBGUy5jcmVhdGVEZXZpY2UoIi9kZXYiLCAicmFuZG9tIiwgcmFuZG9tX2RldmljZSk7DQogIEZTLmNyZWF0ZURldmljZSgiL2RldiIsICJ1cmFuZG9tIiwgcmFuZG9tX2RldmljZSk7DQogIEZTLm1rZGlyKCIvZGV2L3NobSIpOw0KICBGUy5ta2RpcigiL2Rldi9zaG0vdG1wIik7DQogfSwNCiBjcmVhdGVTcGVjaWFsRGlyZWN0b3JpZXM6IGZ1bmN0aW9uKCkgew0KICBGUy5ta2RpcigiL3Byb2MiKTsNCiAgRlMubWtkaXIoIi9wcm9jL3NlbGYiKTsNCiAgRlMubWtkaXIoIi9wcm9jL3NlbGYvZmQiKTsNCiAgRlMubW91bnQoew0KICAgbW91bnQ6IGZ1bmN0aW9uKCkgew0KICAgIHZhciBub2RlID0gRlMuY3JlYXRlTm9kZSgiL3Byb2Mvc2VsZiIsICJmZCIsIDE2Mzg0IHwgNTExLCA3Myk7DQogICAgbm9kZS5ub2RlX29wcyA9IHsNCiAgICAgbG9va3VwOiBmdW5jdGlvbihwYXJlbnQsIG5hbWUpIHsNCiAgICAgIHZhciBmZCA9ICtuYW1lOw0KICAgICAgdmFyIHN0cmVhbSA9IEZTLmdldFN0cmVhbShmZCk7DQogICAgICBpZiAoIXN0cmVhbSkgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoOSk7DQogICAgICB2YXIgcmV0ID0gew0KICAgICAgIHBhcmVudDogbnVsbCwNCiAgICAgICBtb3VudDogew0KICAgICAgICBtb3VudHBvaW50OiAiZmFrZSINCiAgICAgICB9LA0KICAgICAgIG5vZGVfb3BzOiB7DQogICAgICAgIHJlYWRsaW5rOiBmdW5jdGlvbigpIHsNCiAgICAgICAgIHJldHVybiBzdHJlYW0ucGF0aDsNCiAgICAgICAgfQ0KICAgICAgIH0NCiAgICAgIH07DQogICAgICByZXQucGFyZW50ID0gcmV0Ow0KICAgICAgcmV0dXJuIHJldDsNCiAgICAgfQ0KICAgIH07DQogICAgcmV0dXJuIG5vZGU7DQogICB9DQogIH0sIHt9LCAiL3Byb2Mvc2VsZi9mZCIpOw0KIH0sDQogY3JlYXRlU3RhbmRhcmRTdHJlYW1zOiBmdW5jdGlvbigpIHsNCiAgaWYgKE1vZHVsZVsic3RkaW4iXSkgew0KICAgRlMuY3JlYXRlRGV2aWNlKCIvZGV2IiwgInN0ZGluIiwgTW9kdWxlWyJzdGRpbiJdKTsNCiAgfSBlbHNlIHsNCiAgIEZTLnN5bWxpbmsoIi9kZXYvdHR5IiwgIi9kZXYvc3RkaW4iKTsNCiAgfQ0KICBpZiAoTW9kdWxlWyJzdGRvdXQiXSkgew0KICAgRlMuY3JlYXRlRGV2aWNlKCIvZGV2IiwgInN0ZG91dCIsIG51bGwsIE1vZHVsZVsic3Rkb3V0Il0pOw0KICB9IGVsc2Ugew0KICAgRlMuc3ltbGluaygiL2Rldi90dHkiLCAiL2Rldi9zdGRvdXQiKTsNCiAgfQ0KICBpZiAoTW9kdWxlWyJzdGRlcnIiXSkgew0KICAgRlMuY3JlYXRlRGV2aWNlKCIvZGV2IiwgInN0ZGVyciIsIG51bGwsIE1vZHVsZVsic3RkZXJyIl0pOw0KICB9IGVsc2Ugew0KICAgRlMuc3ltbGluaygiL2Rldi90dHkxIiwgIi9kZXYvc3RkZXJyIik7DQogIH0NCiAgdmFyIHN0ZGluID0gRlMub3BlbigiL2Rldi9zdGRpbiIsICJyIik7DQogIGFzc2VydChzdGRpbi5mZCA9PT0gMCwgImludmFsaWQgaGFuZGxlIGZvciBzdGRpbiAoIiArIHN0ZGluLmZkICsgIikiKTsNCiAgdmFyIHN0ZG91dCA9IEZTLm9wZW4oIi9kZXYvc3Rkb3V0IiwgInciKTsNCiAgYXNzZXJ0KHN0ZG91dC5mZCA9PT0gMSwgImludmFsaWQgaGFuZGxlIGZvciBzdGRvdXQgKCIgKyBzdGRvdXQuZmQgKyAiKSIpOw0KICB2YXIgc3RkZXJyID0gRlMub3BlbigiL2Rldi9zdGRlcnIiLCAidyIpOw0KICBhc3NlcnQoc3RkZXJyLmZkID09PSAyLCAiaW52YWxpZCBoYW5kbGUgZm9yIHN0ZGVyciAoIiArIHN0ZGVyci5mZCArICIpIik7DQogfSwNCiBlbnN1cmVFcnJub0Vycm9yOiBmdW5jdGlvbigpIHsNCiAgaWYgKEZTLkVycm5vRXJyb3IpIHJldHVybjsNCiAgRlMuRXJybm9FcnJvciA9IGZ1bmN0aW9uIEVycm5vRXJyb3IoZXJybm8sIG5vZGUpIHsNCiAgIHRoaXMubm9kZSA9IG5vZGU7DQogICB0aGlzLnNldEVycm5vID0gZnVuY3Rpb24oZXJybm8pIHsNCiAgICB0aGlzLmVycm5vID0gZXJybm87DQogICB9Ow0KICAgdGhpcy5zZXRFcnJubyhlcnJubyk7DQogICB0aGlzLm1lc3NhZ2UgPSAiRlMgZXJyb3IiOw0KICAgaWYgKHRoaXMuc3RhY2spIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAic3RhY2siLCB7DQogICAgdmFsdWU6IG5ldyBFcnJvcigpLnN0YWNrLA0KICAgIHdyaXRhYmxlOiB0cnVlDQogICB9KTsNCiAgfTsNCiAgRlMuRXJybm9FcnJvci5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKTsNCiAgRlMuRXJybm9FcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBGUy5FcnJub0Vycm9yOw0KICBbIDIgXS5mb3JFYWNoKGZ1bmN0aW9uKGNvZGUpIHsNCiAgIEZTLmdlbmVyaWNFcnJvcnNbY29kZV0gPSBuZXcgRlMuRXJybm9FcnJvcihjb2RlKTsNCiAgIEZTLmdlbmVyaWNFcnJvcnNbY29kZV0uc3RhY2sgPSAiPGdlbmVyaWMgZXJyb3IsIG5vIHN0YWNrPiI7DQogIH0pOw0KIH0sDQogc3RhdGljSW5pdDogZnVuY3Rpb24oKSB7DQogIEZTLmVuc3VyZUVycm5vRXJyb3IoKTsNCiAgRlMubmFtZVRhYmxlID0gbmV3IEFycmF5KDQwOTYpOw0KICBGUy5tb3VudChNRU1GUywge30sICIvIik7DQogIEZTLmNyZWF0ZURlZmF1bHREaXJlY3RvcmllcygpOw0KICBGUy5jcmVhdGVEZWZhdWx0RGV2aWNlcygpOw0KICBGUy5jcmVhdGVTcGVjaWFsRGlyZWN0b3JpZXMoKTsNCiAgRlMuZmlsZXN5c3RlbXMgPSB7DQogICAiTUVNRlMiOiBNRU1GUywNCiAgICJJREJGUyI6IElEQkZTLA0KICAgIk5PREVGUyI6IE5PREVGUywNCiAgICJXT1JLRVJGUyI6IFdPUktFUkZTDQogIH07DQogfSwNCiBpbml0OiBmdW5jdGlvbihpbnB1dCwgb3V0cHV0LCBlcnJvcikgew0KICBhc3NlcnQoIUZTLmluaXQuaW5pdGlhbGl6ZWQsICJGUy5pbml0IHdhcyBwcmV2aW91c2x5IGNhbGxlZC4gSWYgeW91IHdhbnQgdG8gaW5pdGlhbGl6ZSBsYXRlciB3aXRoIGN1c3RvbSBwYXJhbWV0ZXJzLCByZW1vdmUgYW55IGVhcmxpZXIgY2FsbHMgKG5vdGUgdGhhdCBvbmUgaXMgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGUgZ2VuZXJhdGVkIGNvZGUpIik7DQogIEZTLmluaXQuaW5pdGlhbGl6ZWQgPSB0cnVlOw0KICBGUy5lbnN1cmVFcnJub0Vycm9yKCk7DQogIE1vZHVsZVsic3RkaW4iXSA9IGlucHV0IHx8IE1vZHVsZVsic3RkaW4iXTsNCiAgTW9kdWxlWyJzdGRvdXQiXSA9IG91dHB1dCB8fCBNb2R1bGVbInN0ZG91dCJdOw0KICBNb2R1bGVbInN0ZGVyciJdID0gZXJyb3IgfHwgTW9kdWxlWyJzdGRlcnIiXTsNCiAgRlMuY3JlYXRlU3RhbmRhcmRTdHJlYW1zKCk7DQogfSwNCiBxdWl0OiBmdW5jdGlvbigpIHsNCiAgRlMuaW5pdC5pbml0aWFsaXplZCA9IGZhbHNlOw0KICB2YXIgZmZsdXNoID0gTW9kdWxlWyJfZmZsdXNoIl07DQogIGlmIChmZmx1c2gpIGZmbHVzaCgwKTsNCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBGUy5zdHJlYW1zLmxlbmd0aDsgaSsrKSB7DQogICB2YXIgc3RyZWFtID0gRlMuc3RyZWFtc1tpXTsNCiAgIGlmICghc3RyZWFtKSB7DQogICAgY29udGludWU7DQogICB9DQogICBGUy5jbG9zZShzdHJlYW0pOw0KICB9DQogfSwNCiBnZXRNb2RlOiBmdW5jdGlvbihjYW5SZWFkLCBjYW5Xcml0ZSkgew0KICB2YXIgbW9kZSA9IDA7DQogIGlmIChjYW5SZWFkKSBtb2RlIHw9IDI5MiB8IDczOw0KICBpZiAoY2FuV3JpdGUpIG1vZGUgfD0gMTQ2Ow0KICByZXR1cm4gbW9kZTsNCiB9LA0KIGpvaW5QYXRoOiBmdW5jdGlvbihwYXJ0cywgZm9yY2VSZWxhdGl2ZSkgew0KICB2YXIgcGF0aCA9IFBBVEguam9pbi5hcHBseShudWxsLCBwYXJ0cyk7DQogIGlmIChmb3JjZVJlbGF0aXZlICYmIHBhdGhbMF0gPT0gIi8iKSBwYXRoID0gcGF0aC5zdWJzdHIoMSk7DQogIHJldHVybiBwYXRoOw0KIH0sDQogYWJzb2x1dGVQYXRoOiBmdW5jdGlvbihyZWxhdGl2ZSwgYmFzZSkgew0KICByZXR1cm4gUEFUSC5yZXNvbHZlKGJhc2UsIHJlbGF0aXZlKTsNCiB9LA0KIHN0YW5kYXJkaXplUGF0aDogZnVuY3Rpb24ocGF0aCkgew0KICByZXR1cm4gUEFUSC5ub3JtYWxpemUocGF0aCk7DQogfSwNCiBmaW5kT2JqZWN0OiBmdW5jdGlvbihwYXRoLCBkb250UmVzb2x2ZUxhc3RMaW5rKSB7DQogIHZhciByZXQgPSBGUy5hbmFseXplUGF0aChwYXRoLCBkb250UmVzb2x2ZUxhc3RMaW5rKTsNCiAgaWYgKHJldC5leGlzdHMpIHsNCiAgIHJldHVybiByZXQub2JqZWN0Ow0KICB9IGVsc2Ugew0KICAgX19fc2V0RXJyTm8ocmV0LmVycm9yKTsNCiAgIHJldHVybiBudWxsOw0KICB9DQogfSwNCiBhbmFseXplUGF0aDogZnVuY3Rpb24ocGF0aCwgZG9udFJlc29sdmVMYXN0TGluaykgew0KICB0cnkgew0KICAgdmFyIGxvb2t1cCA9IEZTLmxvb2t1cFBhdGgocGF0aCwgew0KICAgIGZvbGxvdzogIWRvbnRSZXNvbHZlTGFzdExpbmsNCiAgIH0pOw0KICAgcGF0aCA9IGxvb2t1cC5wYXRoOw0KICB9IGNhdGNoIChlKSB7fQ0KICB2YXIgcmV0ID0gew0KICAgaXNSb290OiBmYWxzZSwNCiAgIGV4aXN0czogZmFsc2UsDQogICBlcnJvcjogMCwNCiAgIG5hbWU6IG51bGwsDQogICBwYXRoOiBudWxsLA0KICAgb2JqZWN0OiBudWxsLA0KICAgcGFyZW50RXhpc3RzOiBmYWxzZSwNCiAgIHBhcmVudFBhdGg6IG51bGwsDQogICBwYXJlbnRPYmplY3Q6IG51bGwNCiAgfTsNCiAgdHJ5IHsNCiAgIHZhciBsb29rdXAgPSBGUy5sb29rdXBQYXRoKHBhdGgsIHsNCiAgICBwYXJlbnQ6IHRydWUNCiAgIH0pOw0KICAgcmV0LnBhcmVudEV4aXN0cyA9IHRydWU7DQogICByZXQucGFyZW50UGF0aCA9IGxvb2t1cC5wYXRoOw0KICAgcmV0LnBhcmVudE9iamVjdCA9IGxvb2t1cC5ub2RlOw0KICAgcmV0Lm5hbWUgPSBQQVRILmJhc2VuYW1lKHBhdGgpOw0KICAgbG9va3VwID0gRlMubG9va3VwUGF0aChwYXRoLCB7DQogICAgZm9sbG93OiAhZG9udFJlc29sdmVMYXN0TGluaw0KICAgfSk7DQogICByZXQuZXhpc3RzID0gdHJ1ZTsNCiAgIHJldC5wYXRoID0gbG9va3VwLnBhdGg7DQogICByZXQub2JqZWN0ID0gbG9va3VwLm5vZGU7DQogICByZXQubmFtZSA9IGxvb2t1cC5ub2RlLm5hbWU7DQogICByZXQuaXNSb290ID0gbG9va3VwLnBhdGggPT09ICIvIjsNCiAgfSBjYXRjaCAoZSkgew0KICAgcmV0LmVycm9yID0gZS5lcnJubzsNCiAgfQ0KICByZXR1cm4gcmV0Ow0KIH0sDQogY3JlYXRlRm9sZGVyOiBmdW5jdGlvbihwYXJlbnQsIG5hbWUsIGNhblJlYWQsIGNhbldyaXRlKSB7DQogIHZhciBwYXRoID0gUEFUSC5qb2luMih0eXBlb2YgcGFyZW50ID09PSAic3RyaW5nIiA/IHBhcmVudCA6IEZTLmdldFBhdGgocGFyZW50KSwgbmFtZSk7DQogIHZhciBtb2RlID0gRlMuZ2V0TW9kZShjYW5SZWFkLCBjYW5Xcml0ZSk7DQogIHJldHVybiBGUy5ta2RpcihwYXRoLCBtb2RlKTsNCiB9LA0KIGNyZWF0ZVBhdGg6IGZ1bmN0aW9uKHBhcmVudCwgcGF0aCwgY2FuUmVhZCwgY2FuV3JpdGUpIHsNCiAgcGFyZW50ID0gdHlwZW9mIHBhcmVudCA9PT0gInN0cmluZyIgPyBwYXJlbnQgOiBGUy5nZXRQYXRoKHBhcmVudCk7DQogIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQoIi8iKS5yZXZlcnNlKCk7DQogIHdoaWxlIChwYXJ0cy5sZW5ndGgpIHsNCiAgIHZhciBwYXJ0ID0gcGFydHMucG9wKCk7DQogICBpZiAoIXBhcnQpIGNvbnRpbnVlOw0KICAgdmFyIGN1cnJlbnQgPSBQQVRILmpvaW4yKHBhcmVudCwgcGFydCk7DQogICB0cnkgew0KICAgIEZTLm1rZGlyKGN1cnJlbnQpOw0KICAgfSBjYXRjaCAoZSkge30NCiAgIHBhcmVudCA9IGN1cnJlbnQ7DQogIH0NCiAgcmV0dXJuIGN1cnJlbnQ7DQogfSwNCiBjcmVhdGVGaWxlOiBmdW5jdGlvbihwYXJlbnQsIG5hbWUsIHByb3BlcnRpZXMsIGNhblJlYWQsIGNhbldyaXRlKSB7DQogIHZhciBwYXRoID0gUEFUSC5qb2luMih0eXBlb2YgcGFyZW50ID09PSAic3RyaW5nIiA/IHBhcmVudCA6IEZTLmdldFBhdGgocGFyZW50KSwgbmFtZSk7DQogIHZhciBtb2RlID0gRlMuZ2V0TW9kZShjYW5SZWFkLCBjYW5Xcml0ZSk7DQogIHJldHVybiBGUy5jcmVhdGUocGF0aCwgbW9kZSk7DQogfSwNCiBjcmVhdGVEYXRhRmlsZTogZnVuY3Rpb24ocGFyZW50LCBuYW1lLCBkYXRhLCBjYW5SZWFkLCBjYW5Xcml0ZSwgY2FuT3duKSB7DQogIHZhciBwYXRoID0gbmFtZSA/IFBBVEguam9pbjIodHlwZW9mIHBhcmVudCA9PT0gInN0cmluZyIgPyBwYXJlbnQgOiBGUy5nZXRQYXRoKHBhcmVudCksIG5hbWUpIDogcGFyZW50Ow0KICB2YXIgbW9kZSA9IEZTLmdldE1vZGUoY2FuUmVhZCwgY2FuV3JpdGUpOw0KICB2YXIgbm9kZSA9IEZTLmNyZWF0ZShwYXRoLCBtb2RlKTsNCiAgaWYgKGRhdGEpIHsNCiAgIGlmICh0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIpIHsNCiAgICB2YXIgYXJyID0gbmV3IEFycmF5KGRhdGEubGVuZ3RoKTsNCiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZGF0YS5sZW5ndGg7IGkgPCBsZW47ICsraSkgYXJyW2ldID0gZGF0YS5jaGFyQ29kZUF0KGkpOw0KICAgIGRhdGEgPSBhcnI7DQogICB9DQogICBGUy5jaG1vZChub2RlLCBtb2RlIHwgMTQ2KTsNCiAgIHZhciBzdHJlYW0gPSBGUy5vcGVuKG5vZGUsICJ3Iik7DQogICBGUy53cml0ZShzdHJlYW0sIGRhdGEsIDAsIGRhdGEubGVuZ3RoLCAwLCBjYW5Pd24pOw0KICAgRlMuY2xvc2Uoc3RyZWFtKTsNCiAgIEZTLmNobW9kKG5vZGUsIG1vZGUpOw0KICB9DQogIHJldHVybiBub2RlOw0KIH0sDQogY3JlYXRlRGV2aWNlOiBmdW5jdGlvbihwYXJlbnQsIG5hbWUsIGlucHV0LCBvdXRwdXQpIHsNCiAgdmFyIHBhdGggPSBQQVRILmpvaW4yKHR5cGVvZiBwYXJlbnQgPT09ICJzdHJpbmciID8gcGFyZW50IDogRlMuZ2V0UGF0aChwYXJlbnQpLCBuYW1lKTsNCiAgdmFyIG1vZGUgPSBGUy5nZXRNb2RlKCEhaW5wdXQsICEhb3V0cHV0KTsNCiAgaWYgKCFGUy5jcmVhdGVEZXZpY2UubWFqb3IpIEZTLmNyZWF0ZURldmljZS5tYWpvciA9IDY0Ow0KICB2YXIgZGV2ID0gRlMubWFrZWRldihGUy5jcmVhdGVEZXZpY2UubWFqb3IrKywgMCk7DQogIEZTLnJlZ2lzdGVyRGV2aWNlKGRldiwgew0KICAgb3BlbjogZnVuY3Rpb24oc3RyZWFtKSB7DQogICAgc3RyZWFtLnNlZWthYmxlID0gZmFsc2U7DQogICB9LA0KICAgY2xvc2U6IGZ1bmN0aW9uKHN0cmVhbSkgew0KICAgIGlmIChvdXRwdXQgJiYgb3V0cHV0LmJ1ZmZlciAmJiBvdXRwdXQuYnVmZmVyLmxlbmd0aCkgew0KICAgICBvdXRwdXQoMTApOw0KICAgIH0NCiAgIH0sDQogICByZWFkOiBmdW5jdGlvbihzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvcykgew0KICAgIHZhciBieXRlc1JlYWQgPSAwOw0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgdmFyIHJlc3VsdDsNCiAgICAgdHJ5IHsNCiAgICAgIHJlc3VsdCA9IGlucHV0KCk7DQogICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDUpOw0KICAgICB9DQogICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCAmJiBieXRlc1JlYWQgPT09IDApIHsNCiAgICAgIHRocm93IG5ldyBGUy5FcnJub0Vycm9yKDExKTsNCiAgICAgfQ0KICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHJlc3VsdCA9PT0gdW5kZWZpbmVkKSBicmVhazsNCiAgICAgYnl0ZXNSZWFkKys7DQogICAgIGJ1ZmZlcltvZmZzZXQgKyBpXSA9IHJlc3VsdDsNCiAgICB9DQogICAgaWYgKGJ5dGVzUmVhZCkgew0KICAgICBzdHJlYW0ubm9kZS50aW1lc3RhbXAgPSBEYXRlLm5vdygpOw0KICAgIH0NCiAgICByZXR1cm4gYnl0ZXNSZWFkOw0KICAgfSwNCiAgIHdyaXRlOiBmdW5jdGlvbihzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvcykgew0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgdHJ5IHsNCiAgICAgIG91dHB1dChidWZmZXJbb2Zmc2V0ICsgaV0pOw0KICAgICB9IGNhdGNoIChlKSB7DQogICAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig1KTsNCiAgICAgfQ0KICAgIH0NCiAgICBpZiAobGVuZ3RoKSB7DQogICAgIHN0cmVhbS5ub2RlLnRpbWVzdGFtcCA9IERhdGUubm93KCk7DQogICAgfQ0KICAgIHJldHVybiBpOw0KICAgfQ0KICB9KTsNCiAgcmV0dXJuIEZTLm1rZGV2KHBhdGgsIG1vZGUsIGRldik7DQogfSwNCiBjcmVhdGVMaW5rOiBmdW5jdGlvbihwYXJlbnQsIG5hbWUsIHRhcmdldCwgY2FuUmVhZCwgY2FuV3JpdGUpIHsNCiAgdmFyIHBhdGggPSBQQVRILmpvaW4yKHR5cGVvZiBwYXJlbnQgPT09ICJzdHJpbmciID8gcGFyZW50IDogRlMuZ2V0UGF0aChwYXJlbnQpLCBuYW1lKTsNCiAgcmV0dXJuIEZTLnN5bWxpbmsodGFyZ2V0LCBwYXRoKTsNCiB9LA0KIGZvcmNlTG9hZEZpbGU6IGZ1bmN0aW9uKG9iaikgew0KICBpZiAob2JqLmlzRGV2aWNlIHx8IG9iai5pc0ZvbGRlciB8fCBvYmoubGluayB8fCBvYmouY29udGVudHMpIHJldHVybiB0cnVlOw0KICB2YXIgc3VjY2VzcyA9IHRydWU7DQogIGlmICh0eXBlb2YgWE1MSHR0cFJlcXVlc3QgIT09ICJ1bmRlZmluZWQiKSB7DQogICB0aHJvdyBuZXcgRXJyb3IoIkxhenkgbG9hZGluZyBzaG91bGQgaGF2ZSBiZWVuIHBlcmZvcm1lZCAoY29udGVudHMgc2V0KSBpbiBjcmVhdGVMYXp5RmlsZSwgYnV0IGl0IHdhcyBub3QuIExhenkgbG9hZGluZyBvbmx5IHdvcmtzIGluIHdlYiB3b3JrZXJzLiBVc2UgLS1lbWJlZC1maWxlIG9yIC0tcHJlbG9hZC1maWxlIGluIGVtY2Mgb24gdGhlIG1haW4gdGhyZWFkLiIpOw0KICB9IGVsc2UgaWYgKE1vZHVsZVsicmVhZCJdKSB7DQogICB0cnkgew0KICAgIG9iai5jb250ZW50cyA9IGludEFycmF5RnJvbVN0cmluZyhNb2R1bGVbInJlYWQiXShvYmoudXJsKSwgdHJ1ZSk7DQogICAgb2JqLnVzZWRCeXRlcyA9IG9iai5jb250ZW50cy5sZW5ndGg7DQogICB9IGNhdGNoIChlKSB7DQogICAgc3VjY2VzcyA9IGZhbHNlOw0KICAgfQ0KICB9IGVsc2Ugew0KICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgbG9hZCB3aXRob3V0IHJlYWQoKSBvciBYTUxIdHRwUmVxdWVzdC4iKTsNCiAgfQ0KICBpZiAoIXN1Y2Nlc3MpIF9fX3NldEVyck5vKDUpOw0KICByZXR1cm4gc3VjY2VzczsNCiB9LA0KIGNyZWF0ZUxhenlGaWxlOiBmdW5jdGlvbihwYXJlbnQsIG5hbWUsIHVybCwgY2FuUmVhZCwgY2FuV3JpdGUpIHsNCiAgZnVuY3Rpb24gTGF6eVVpbnQ4QXJyYXkoKSB7DQogICB0aGlzLmxlbmd0aEtub3duID0gZmFsc2U7DQogICB0aGlzLmNodW5rcyA9IFtdOw0KICB9DQogIExhenlVaW50OEFycmF5LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBMYXp5VWludDhBcnJheV9nZXQoaWR4KSB7DQogICBpZiAoaWR4ID4gdGhpcy5sZW5ndGggLSAxIHx8IGlkeCA8IDApIHsNCiAgICByZXR1cm4gdW5kZWZpbmVkOw0KICAgfQ0KICAgdmFyIGNodW5rT2Zmc2V0ID0gaWR4ICUgdGhpcy5jaHVua1NpemU7DQogICB2YXIgY2h1bmtOdW0gPSBpZHggLyB0aGlzLmNodW5rU2l6ZSB8IDA7DQogICByZXR1cm4gdGhpcy5nZXR0ZXIoY2h1bmtOdW0pW2NodW5rT2Zmc2V0XTsNCiAgfTsNCiAgTGF6eVVpbnQ4QXJyYXkucHJvdG90eXBlLnNldERhdGFHZXR0ZXIgPSBmdW5jdGlvbiBMYXp5VWludDhBcnJheV9zZXREYXRhR2V0dGVyKGdldHRlcikgew0KICAgdGhpcy5nZXR0ZXIgPSBnZXR0ZXI7DQogIH07DQogIExhenlVaW50OEFycmF5LnByb3RvdHlwZS5jYWNoZUxlbmd0aCA9IGZ1bmN0aW9uIExhenlVaW50OEFycmF5X2NhY2hlTGVuZ3RoKCkgew0KICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOw0KICAgeGhyLm9wZW4oIkhFQUQiLCB1cmwsIGZhbHNlKTsNCiAgIHhoci5zZW5kKG51bGwpOw0KICAgaWYgKCEoeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMCB8fCB4aHIuc3RhdHVzID09PSAzMDQpKSB0aHJvdyBuZXcgRXJyb3IoIkNvdWxkbid0IGxvYWQgIiArIHVybCArICIuIFN0YXR1czogIiArIHhoci5zdGF0dXMpOw0KICAgdmFyIGRhdGFsZW5ndGggPSBOdW1iZXIoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LWxlbmd0aCIpKTsNCiAgIHZhciBoZWFkZXI7DQogICB2YXIgaGFzQnl0ZVNlcnZpbmcgPSAoaGVhZGVyID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCJBY2NlcHQtUmFuZ2VzIikpICYmIGhlYWRlciA9PT0gImJ5dGVzIjsNCiAgIHZhciB1c2VzR3ppcCA9IChoZWFkZXIgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtRW5jb2RpbmciKSkgJiYgaGVhZGVyID09PSAiZ3ppcCI7DQogICB2YXIgY2h1bmtTaXplID0gMTAyNCAqIDEwMjQ7DQogICBpZiAoIWhhc0J5dGVTZXJ2aW5nKSBjaHVua1NpemUgPSBkYXRhbGVuZ3RoOw0KICAgdmFyIGRvWEhSID0gZnVuY3Rpb24oZnJvbSwgdG8pIHsNCiAgICBpZiAoZnJvbSA+IHRvKSB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgcmFuZ2UgKCIgKyBmcm9tICsgIiwgIiArIHRvICsgIikgb3Igbm8gYnl0ZXMgcmVxdWVzdGVkISIpOw0KICAgIGlmICh0byA+IGRhdGFsZW5ndGggLSAxKSB0aHJvdyBuZXcgRXJyb3IoIm9ubHkgIiArIGRhdGFsZW5ndGggKyAiIGJ5dGVzIGF2YWlsYWJsZSEgcHJvZ3JhbW1lciBlcnJvciEiKTsNCiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7DQogICAgeGhyLm9wZW4oIkdFVCIsIHVybCwgZmFsc2UpOw0KICAgIGlmIChkYXRhbGVuZ3RoICE9PSBjaHVua1NpemUpIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCJSYW5nZSIsICJieXRlcz0iICsgZnJvbSArICItIiArIHRvKTsNCiAgICBpZiAodHlwZW9mIFVpbnQ4QXJyYXkgIT0gInVuZGVmaW5lZCIpIHhoci5yZXNwb25zZVR5cGUgPSAiYXJyYXlidWZmZXIiOw0KICAgIGlmICh4aHIub3ZlcnJpZGVNaW1lVHlwZSkgew0KICAgICB4aHIub3ZlcnJpZGVNaW1lVHlwZSgidGV4dC9wbGFpbjsgY2hhcnNldD14LXVzZXItZGVmaW5lZCIpOw0KICAgIH0NCiAgICB4aHIuc2VuZChudWxsKTsNCiAgICBpZiAoISh4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgMzAwIHx8IHhoci5zdGF0dXMgPT09IDMwNCkpIHRocm93IG5ldyBFcnJvcigiQ291bGRuJ3QgbG9hZCAiICsgdXJsICsgIi4gU3RhdHVzOiAiICsgeGhyLnN0YXR1cyk7DQogICAgaWYgKHhoci5yZXNwb25zZSAhPT0gdW5kZWZpbmVkKSB7DQogICAgIHJldHVybiBuZXcgVWludDhBcnJheSh4aHIucmVzcG9uc2UgfHwgW10pOw0KICAgIH0gZWxzZSB7DQogICAgIHJldHVybiBpbnRBcnJheUZyb21TdHJpbmcoeGhyLnJlc3BvbnNlVGV4dCB8fCAiIiwgdHJ1ZSk7DQogICAgfQ0KICAgfTsNCiAgIHZhciBsYXp5QXJyYXkgPSB0aGlzOw0KICAgbGF6eUFycmF5LnNldERhdGFHZXR0ZXIoZnVuY3Rpb24oY2h1bmtOdW0pIHsNCiAgICB2YXIgc3RhcnQgPSBjaHVua051bSAqIGNodW5rU2l6ZTsNCiAgICB2YXIgZW5kID0gKGNodW5rTnVtICsgMSkgKiBjaHVua1NpemUgLSAxOw0KICAgIGVuZCA9IE1hdGgubWluKGVuZCwgZGF0YWxlbmd0aCAtIDEpOw0KICAgIGlmICh0eXBlb2YgbGF6eUFycmF5LmNodW5rc1tjaHVua051bV0gPT09ICJ1bmRlZmluZWQiKSB7DQogICAgIGxhenlBcnJheS5jaHVua3NbY2h1bmtOdW1dID0gZG9YSFIoc3RhcnQsIGVuZCk7DQogICAgfQ0KICAgIGlmICh0eXBlb2YgbGF6eUFycmF5LmNodW5rc1tjaHVua051bV0gPT09ICJ1bmRlZmluZWQiKSB0aHJvdyBuZXcgRXJyb3IoImRvWEhSIGZhaWxlZCEiKTsNCiAgICByZXR1cm4gbGF6eUFycmF5LmNodW5rc1tjaHVua051bV07DQogICB9KTsNCiAgIGlmICh1c2VzR3ppcCB8fCAhZGF0YWxlbmd0aCkgew0KICAgIGNodW5rU2l6ZSA9IGRhdGFsZW5ndGggPSAxOw0KICAgIGRhdGFsZW5ndGggPSB0aGlzLmdldHRlcigwKS5sZW5ndGg7DQogICAgY2h1bmtTaXplID0gZGF0YWxlbmd0aDsNCiAgICBjb25zb2xlLmxvZygiTGF6eUZpbGVzIG9uIGd6aXAgZm9yY2VzIGRvd25sb2FkIG9mIHRoZSB3aG9sZSBmaWxlIHdoZW4gbGVuZ3RoIGlzIGFjY2Vzc2VkIik7DQogICB9DQogICB0aGlzLl9sZW5ndGggPSBkYXRhbGVuZ3RoOw0KICAgdGhpcy5fY2h1bmtTaXplID0gY2h1bmtTaXplOw0KICAgdGhpcy5sZW5ndGhLbm93biA9IHRydWU7DQogIH07DQogIGlmICh0eXBlb2YgWE1MSHR0cFJlcXVlc3QgIT09ICJ1bmRlZmluZWQiKSB7DQogICBpZiAoIUVOVklST05NRU5UX0lTX1dPUktFUikgdGhyb3cgIkNhbm5vdCBkbyBzeW5jaHJvbm91cyBiaW5hcnkgWEhScyBvdXRzaWRlIHdlYndvcmtlcnMgaW4gbW9kZXJuIGJyb3dzZXJzLiBVc2UgLS1lbWJlZC1maWxlIG9yIC0tcHJlbG9hZC1maWxlIGluIGVtY2MiOw0KICAgdmFyIGxhenlBcnJheSA9IG5ldyBMYXp5VWludDhBcnJheSgpOw0KICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobGF6eUFycmF5LCB7DQogICAgbGVuZ3RoOiB7DQogICAgIGdldDogZnVuY3Rpb24oKSB7DQogICAgICBpZiAoIXRoaXMubGVuZ3RoS25vd24pIHsNCiAgICAgICB0aGlzLmNhY2hlTGVuZ3RoKCk7DQogICAgICB9DQogICAgICByZXR1cm4gdGhpcy5fbGVuZ3RoOw0KICAgICB9DQogICAgfSwNCiAgICBjaHVua1NpemU6IHsNCiAgICAgZ2V0OiBmdW5jdGlvbigpIHsNCiAgICAgIGlmICghdGhpcy5sZW5ndGhLbm93bikgew0KICAgICAgIHRoaXMuY2FjaGVMZW5ndGgoKTsNCiAgICAgIH0NCiAgICAgIHJldHVybiB0aGlzLl9jaHVua1NpemU7DQogICAgIH0NCiAgICB9DQogICB9KTsNCiAgIHZhciBwcm9wZXJ0aWVzID0gew0KICAgIGlzRGV2aWNlOiBmYWxzZSwNCiAgICBjb250ZW50czogbGF6eUFycmF5DQogICB9Ow0KICB9IGVsc2Ugew0KICAgdmFyIHByb3BlcnRpZXMgPSB7DQogICAgaXNEZXZpY2U6IGZhbHNlLA0KICAgIHVybDogdXJsDQogICB9Ow0KICB9DQogIHZhciBub2RlID0gRlMuY3JlYXRlRmlsZShwYXJlbnQsIG5hbWUsIHByb3BlcnRpZXMsIGNhblJlYWQsIGNhbldyaXRlKTsNCiAgaWYgKHByb3BlcnRpZXMuY29udGVudHMpIHsNCiAgIG5vZGUuY29udGVudHMgPSBwcm9wZXJ0aWVzLmNvbnRlbnRzOw0KICB9IGVsc2UgaWYgKHByb3BlcnRpZXMudXJsKSB7DQogICBub2RlLmNvbnRlbnRzID0gbnVsbDsNCiAgIG5vZGUudXJsID0gcHJvcGVydGllcy51cmw7DQogIH0NCiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobm9kZSwgew0KICAgdXNlZEJ5dGVzOiB7DQogICAgZ2V0OiBmdW5jdGlvbigpIHsNCiAgICAgcmV0dXJuIHRoaXMuY29udGVudHMubGVuZ3RoOw0KICAgIH0NCiAgIH0NCiAgfSk7DQogIHZhciBzdHJlYW1fb3BzID0ge307DQogIHZhciBrZXlzID0gT2JqZWN0LmtleXMobm9kZS5zdHJlYW1fb3BzKTsNCiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkgew0KICAgdmFyIGZuID0gbm9kZS5zdHJlYW1fb3BzW2tleV07DQogICBzdHJlYW1fb3BzW2tleV0gPSBmdW5jdGlvbiBmb3JjZUxvYWRMYXp5RmlsZSgpIHsNCiAgICBpZiAoIUZTLmZvcmNlTG9hZEZpbGUobm9kZSkpIHsNCiAgICAgdGhyb3cgbmV3IEZTLkVycm5vRXJyb3IoNSk7DQogICAgfQ0KICAgIHJldHVybiBmbi5hcHBseShudWxsLCBhcmd1bWVudHMpOw0KICAgfTsNCiAgfSk7DQogIHN0cmVhbV9vcHMucmVhZCA9IGZ1bmN0aW9uIHN0cmVhbV9vcHNfcmVhZChzdHJlYW0sIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uKSB7DQogICBpZiAoIUZTLmZvcmNlTG9hZEZpbGUobm9kZSkpIHsNCiAgICB0aHJvdyBuZXcgRlMuRXJybm9FcnJvcig1KTsNCiAgIH0NCiAgIHZhciBjb250ZW50cyA9IHN0cmVhbS5ub2RlLmNvbnRlbnRzOw0KICAgaWYgKHBvc2l0aW9uID49IGNvbnRlbnRzLmxlbmd0aCkgcmV0dXJuIDA7DQogICB2YXIgc2l6ZSA9IE1hdGgubWluKGNvbnRlbnRzLmxlbmd0aCAtIHBvc2l0aW9uLCBsZW5ndGgpOw0KICAgYXNzZXJ0KHNpemUgPj0gMCk7DQogICBpZiAoY29udGVudHMuc2xpY2UpIHsNCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykgew0KICAgICBidWZmZXJbb2Zmc2V0ICsgaV0gPSBjb250ZW50c1twb3NpdGlvbiArIGldOw0KICAgIH0NCiAgIH0gZWxzZSB7DQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsNCiAgICAgYnVmZmVyW29mZnNldCArIGldID0gY29udGVudHMuZ2V0KHBvc2l0aW9uICsgaSk7DQogICAgfQ0KICAgfQ0KICAgcmV0dXJuIHNpemU7DQogIH07DQogIG5vZGUuc3RyZWFtX29wcyA9IHN0cmVhbV9vcHM7DQogIHJldHVybiBub2RlOw0KIH0sDQogY3JlYXRlUHJlbG9hZGVkRmlsZTogZnVuY3Rpb24ocGFyZW50LCBuYW1lLCB1cmwsIGNhblJlYWQsIGNhbldyaXRlLCBvbmxvYWQsIG9uZXJyb3IsIGRvbnRDcmVhdGVGaWxlLCBjYW5Pd24sIHByZUZpbmlzaCkgew0KICBCcm93c2VyLmluaXQoKTsNCiAgdmFyIGZ1bGxuYW1lID0gbmFtZSA/IFBBVEgucmVzb2x2ZShQQVRILmpvaW4yKHBhcmVudCwgbmFtZSkpIDogcGFyZW50Ow0KICB2YXIgZGVwID0gZ2V0VW5pcXVlUnVuRGVwZW5kZW5jeSgiY3AgIiArIGZ1bGxuYW1lKTsNCiAgZnVuY3Rpb24gcHJvY2Vzc0RhdGEoYnl0ZUFycmF5KSB7DQogICBmdW5jdGlvbiBmaW5pc2goYnl0ZUFycmF5KSB7DQogICAgaWYgKHByZUZpbmlzaCkgcHJlRmluaXNoKCk7DQogICAgaWYgKCFkb250Q3JlYXRlRmlsZSkgew0KICAgICBGUy5jcmVhdGVEYXRhRmlsZShwYXJlbnQsIG5hbWUsIGJ5dGVBcnJheSwgY2FuUmVhZCwgY2FuV3JpdGUsIGNhbk93bik7DQogICAgfQ0KICAgIGlmIChvbmxvYWQpIG9ubG9hZCgpOw0KICAgIHJlbW92ZVJ1bkRlcGVuZGVuY3koZGVwKTsNCiAgIH0NCiAgIHZhciBoYW5kbGVkID0gZmFsc2U7DQogICBNb2R1bGVbInByZWxvYWRQbHVnaW5zIl0uZm9yRWFjaChmdW5jdGlvbihwbHVnaW4pIHsNCiAgICBpZiAoaGFuZGxlZCkgcmV0dXJuOw0KICAgIGlmIChwbHVnaW5bImNhbkhhbmRsZSJdKGZ1bGxuYW1lKSkgew0KICAgICBwbHVnaW5bImhhbmRsZSJdKGJ5dGVBcnJheSwgZnVsbG5hbWUsIGZpbmlzaCwgZnVuY3Rpb24oKSB7DQogICAgICBpZiAob25lcnJvcikgb25lcnJvcigpOw0KICAgICAgcmVtb3ZlUnVuRGVwZW5kZW5jeShkZXApOw0KICAgICB9KTsNCiAgICAgaGFuZGxlZCA9IHRydWU7DQogICAgfQ0KICAgfSk7DQogICBpZiAoIWhhbmRsZWQpIGZpbmlzaChieXRlQXJyYXkpOw0KICB9DQogIGFkZFJ1bkRlcGVuZGVuY3koZGVwKTsNCiAgaWYgKHR5cGVvZiB1cmwgPT0gInN0cmluZyIpIHsNCiAgIEJyb3dzZXIuYXN5bmNMb2FkKHVybCwgZnVuY3Rpb24oYnl0ZUFycmF5KSB7DQogICAgcHJvY2Vzc0RhdGEoYnl0ZUFycmF5KTsNCiAgIH0sIG9uZXJyb3IpOw0KICB9IGVsc2Ugew0KICAgcHJvY2Vzc0RhdGEodXJsKTsNCiAgfQ0KIH0sDQogaW5kZXhlZERCOiBmdW5jdGlvbigpIHsNCiAgcmV0dXJuIHdpbmRvdy5pbmRleGVkREIgfHwgd2luZG93Lm1vekluZGV4ZWREQiB8fCB3aW5kb3cud2Via2l0SW5kZXhlZERCIHx8IHdpbmRvdy5tc0luZGV4ZWREQjsNCiB9LA0KIERCX05BTUU6IGZ1bmN0aW9uKCkgew0KICByZXR1cm4gIkVNX0ZTXyIgKyB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7DQogfSwNCiBEQl9WRVJTSU9OOiAyMCwNCiBEQl9TVE9SRV9OQU1FOiAiRklMRV9EQVRBIiwNCiBzYXZlRmlsZXNUb0RCOiBmdW5jdGlvbihwYXRocywgb25sb2FkLCBvbmVycm9yKSB7DQogIG9ubG9hZCA9IG9ubG9hZCB8fCBmdW5jdGlvbigpIHt9Ow0KICBvbmVycm9yID0gb25lcnJvciB8fCBmdW5jdGlvbigpIHt9Ow0KICB2YXIgaW5kZXhlZERCID0gRlMuaW5kZXhlZERCKCk7DQogIHRyeSB7DQogICB2YXIgb3BlblJlcXVlc3QgPSBpbmRleGVkREIub3BlbihGUy5EQl9OQU1FKCksIEZTLkRCX1ZFUlNJT04pOw0KICB9IGNhdGNoIChlKSB7DQogICByZXR1cm4gb25lcnJvcihlKTsNCiAgfQ0KICBvcGVuUmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSBmdW5jdGlvbiBvcGVuUmVxdWVzdF9vbnVwZ3JhZGVuZWVkZWQoKSB7DQogICBjb25zb2xlLmxvZygiY3JlYXRpbmcgZGIiKTsNCiAgIHZhciBkYiA9IG9wZW5SZXF1ZXN0LnJlc3VsdDsNCiAgIGRiLmNyZWF0ZU9iamVjdFN0b3JlKEZTLkRCX1NUT1JFX05BTUUpOw0KICB9Ow0KICBvcGVuUmVxdWVzdC5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiBvcGVuUmVxdWVzdF9vbnN1Y2Nlc3MoKSB7DQogICB2YXIgZGIgPSBvcGVuUmVxdWVzdC5yZXN1bHQ7DQogICB2YXIgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbihbIEZTLkRCX1NUT1JFX05BTUUgXSwgInJlYWR3cml0ZSIpOw0KICAgdmFyIGZpbGVzID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoRlMuREJfU1RPUkVfTkFNRSk7DQogICB2YXIgb2sgPSAwLCBmYWlsID0gMCwgdG90YWwgPSBwYXRocy5sZW5ndGg7DQogICBmdW5jdGlvbiBmaW5pc2goKSB7DQogICAgaWYgKGZhaWwgPT0gMCkgb25sb2FkKCk7IGVsc2Ugb25lcnJvcigpOw0KICAgfQ0KICAgcGF0aHMuZm9yRWFjaChmdW5jdGlvbihwYXRoKSB7DQogICAgdmFyIHB1dFJlcXVlc3QgPSBmaWxlcy5wdXQoRlMuYW5hbHl6ZVBhdGgocGF0aCkub2JqZWN0LmNvbnRlbnRzLCBwYXRoKTsNCiAgICBwdXRSZXF1ZXN0Lm9uc3VjY2VzcyA9IGZ1bmN0aW9uIHB1dFJlcXVlc3Rfb25zdWNjZXNzKCkgew0KICAgICBvaysrOw0KICAgICBpZiAob2sgKyBmYWlsID09IHRvdGFsKSBmaW5pc2goKTsNCiAgICB9Ow0KICAgIHB1dFJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uIHB1dFJlcXVlc3Rfb25lcnJvcigpIHsNCiAgICAgZmFpbCsrOw0KICAgICBpZiAob2sgKyBmYWlsID09IHRvdGFsKSBmaW5pc2goKTsNCiAgICB9Ow0KICAgfSk7DQogICB0cmFuc2FjdGlvbi5vbmVycm9yID0gb25lcnJvcjsNCiAgfTsNCiAgb3BlblJlcXVlc3Qub25lcnJvciA9IG9uZXJyb3I7DQogfSwNCiBsb2FkRmlsZXNGcm9tREI6IGZ1bmN0aW9uKHBhdGhzLCBvbmxvYWQsIG9uZXJyb3IpIHsNCiAgb25sb2FkID0gb25sb2FkIHx8IGZ1bmN0aW9uKCkge307DQogIG9uZXJyb3IgPSBvbmVycm9yIHx8IGZ1bmN0aW9uKCkge307DQogIHZhciBpbmRleGVkREIgPSBGUy5pbmRleGVkREIoKTsNCiAgdHJ5IHsNCiAgIHZhciBvcGVuUmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKEZTLkRCX05BTUUoKSwgRlMuREJfVkVSU0lPTik7DQogIH0gY2F0Y2ggKGUpIHsNCiAgIHJldHVybiBvbmVycm9yKGUpOw0KICB9DQogIG9wZW5SZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IG9uZXJyb3I7DQogIG9wZW5SZXF1ZXN0Lm9uc3VjY2VzcyA9IGZ1bmN0aW9uIG9wZW5SZXF1ZXN0X29uc3VjY2VzcygpIHsNCiAgIHZhciBkYiA9IG9wZW5SZXF1ZXN0LnJlc3VsdDsNCiAgIHRyeSB7DQogICAgdmFyIHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24oWyBGUy5EQl9TVE9SRV9OQU1FIF0sICJyZWFkb25seSIpOw0KICAgfSBjYXRjaCAoZSkgew0KICAgIG9uZXJyb3IoZSk7DQogICAgcmV0dXJuOw0KICAgfQ0KICAgdmFyIGZpbGVzID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoRlMuREJfU1RPUkVfTkFNRSk7DQogICB2YXIgb2sgPSAwLCBmYWlsID0gMCwgdG90YWwgPSBwYXRocy5sZW5ndGg7DQogICBmdW5jdGlvbiBmaW5pc2goKSB7DQogICAgaWYgKGZhaWwgPT0gMCkgb25sb2FkKCk7IGVsc2Ugb25lcnJvcigpOw0KICAgfQ0KICAgcGF0aHMuZm9yRWFjaChmdW5jdGlvbihwYXRoKSB7DQogICAgdmFyIGdldFJlcXVlc3QgPSBmaWxlcy5nZXQocGF0aCk7DQogICAgZ2V0UmVxdWVzdC5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiBnZXRSZXF1ZXN0X29uc3VjY2VzcygpIHsNCiAgICAgaWYgKEZTLmFuYWx5emVQYXRoKHBhdGgpLmV4aXN0cykgew0KICAgICAgRlMudW5saW5rKHBhdGgpOw0KICAgICB9DQogICAgIEZTLmNyZWF0ZURhdGFGaWxlKFBBVEguZGlybmFtZShwYXRoKSwgUEFUSC5iYXNlbmFtZShwYXRoKSwgZ2V0UmVxdWVzdC5yZXN1bHQsIHRydWUsIHRydWUsIHRydWUpOw0KICAgICBvaysrOw0KICAgICBpZiAob2sgKyBmYWlsID09IHRvdGFsKSBmaW5pc2goKTsNCiAgICB9Ow0KICAgIGdldFJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uIGdldFJlcXVlc3Rfb25lcnJvcigpIHsNCiAgICAgZmFpbCsrOw0KICAgICBpZiAob2sgKyBmYWlsID09IHRvdGFsKSBmaW5pc2goKTsNCiAgICB9Ow0KICAgfSk7DQogICB0cmFuc2FjdGlvbi5vbmVycm9yID0gb25lcnJvcjsNCiAgfTsNCiAgb3BlblJlcXVlc3Qub25lcnJvciA9IG9uZXJyb3I7DQogfQ0KfTsNCg0KZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fc2V0X21haW5fbG9vcF90aW1pbmcobW9kZSwgdmFsdWUpIHsNCiBCcm93c2VyLm1haW5Mb29wLnRpbWluZ01vZGUgPSBtb2RlOw0KIEJyb3dzZXIubWFpbkxvb3AudGltaW5nVmFsdWUgPSB2YWx1ZTsNCiBpZiAoIUJyb3dzZXIubWFpbkxvb3AuZnVuYykgew0KICByZXR1cm4gMTsNCiB9DQogaWYgKG1vZGUgPT0gMCkgew0KICBCcm93c2VyLm1haW5Mb29wLnNjaGVkdWxlciA9IGZ1bmN0aW9uIEJyb3dzZXJfbWFpbkxvb3Bfc2NoZWR1bGVyX3NldFRpbWVvdXQoKSB7DQogICB2YXIgdGltZVVudGlsTmV4dFRpY2sgPSBNYXRoLm1heCgwLCBCcm93c2VyLm1haW5Mb29wLnRpY2tTdGFydFRpbWUgKyB2YWx1ZSAtIF9lbXNjcmlwdGVuX2dldF9ub3coKSkgfCAwOw0KICAgc2V0VGltZW91dChCcm93c2VyLm1haW5Mb29wLnJ1bm5lciwgdGltZVVudGlsTmV4dFRpY2spOw0KICB9Ow0KICBCcm93c2VyLm1haW5Mb29wLm1ldGhvZCA9ICJ0aW1lb3V0IjsNCiB9IGVsc2UgaWYgKG1vZGUgPT0gMSkgew0KICBCcm93c2VyLm1haW5Mb29wLnNjaGVkdWxlciA9IGZ1bmN0aW9uIEJyb3dzZXJfbWFpbkxvb3Bfc2NoZWR1bGVyX3JBRigpIHsNCiAgIEJyb3dzZXIucmVxdWVzdEFuaW1hdGlvbkZyYW1lKEJyb3dzZXIubWFpbkxvb3AucnVubmVyKTsNCiAgfTsNCiAgQnJvd3Nlci5tYWluTG9vcC5tZXRob2QgPSAickFGIjsNCiB9IGVsc2UgaWYgKG1vZGUgPT0gMikgew0KICBpZiAodHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gInVuZGVmaW5lZCIpIHsNCiAgIHZhciBzZXRJbW1lZGlhdGVzID0gW107DQogICB2YXIgZW1zY3JpcHRlbk1haW5Mb29wTWVzc2FnZUlkID0gInNldGltbWVkaWF0ZSI7DQogICB2YXIgQnJvd3Nlcl9zZXRJbW1lZGlhdGVfbWVzc2FnZUhhbmRsZXIgPSBmdW5jdGlvbihldmVudCkgew0KICAgIGlmIChldmVudC5kYXRhID09PSBlbXNjcmlwdGVuTWFpbkxvb3BNZXNzYWdlSWQgfHwgZXZlbnQuZGF0YS50YXJnZXQgPT09IGVtc2NyaXB0ZW5NYWluTG9vcE1lc3NhZ2VJZCkgew0KICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsNCiAgICAgc2V0SW1tZWRpYXRlcy5zaGlmdCgpKCk7DQogICAgfQ0KICAgfTsNCiAgIGFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCBCcm93c2VyX3NldEltbWVkaWF0ZV9tZXNzYWdlSGFuZGxlciwgdHJ1ZSk7DQogICBzZXRJbW1lZGlhdGUgPSBmdW5jdGlvbiBCcm93c2VyX2VtdWxhdGVkX3NldEltbWVkaWF0ZShmdW5jKSB7DQogICAgc2V0SW1tZWRpYXRlcy5wdXNoKGZ1bmMpOw0KICAgIGlmIChFTlZJUk9OTUVOVF9JU19XT1JLRVIpIHsNCiAgICAgaWYgKE1vZHVsZVsic2V0SW1tZWRpYXRlcyJdID09PSB1bmRlZmluZWQpIE1vZHVsZVsic2V0SW1tZWRpYXRlcyJdID0gW107DQogICAgIE1vZHVsZVsic2V0SW1tZWRpYXRlcyJdLnB1c2goZnVuYyk7DQogICAgIHBvc3RNZXNzYWdlKHsNCiAgICAgIHRhcmdldDogZW1zY3JpcHRlbk1haW5Mb29wTWVzc2FnZUlkDQogICAgIH0pOw0KICAgIH0gZWxzZSBwb3N0TWVzc2FnZShlbXNjcmlwdGVuTWFpbkxvb3BNZXNzYWdlSWQsICIqIik7DQogICB9Ow0KICB9DQogIEJyb3dzZXIubWFpbkxvb3Auc2NoZWR1bGVyID0gZnVuY3Rpb24gQnJvd3Nlcl9tYWluTG9vcF9zY2hlZHVsZXJfc2V0SW1tZWRpYXRlKCkgew0KICAgc2V0SW1tZWRpYXRlKEJyb3dzZXIubWFpbkxvb3AucnVubmVyKTsNCiAgfTsNCiAgQnJvd3Nlci5tYWluTG9vcC5tZXRob2QgPSAiaW1tZWRpYXRlIjsNCiB9DQogcmV0dXJuIDA7DQp9DQoNCmZ1bmN0aW9uIF9lbXNjcmlwdGVuX2dldF9ub3coKSB7DQogYWJvcnQoKTsNCn0NCg0KZnVuY3Rpb24gX2Vtc2NyaXB0ZW5fc2V0X21haW5fbG9vcChmdW5jLCBmcHMsIHNpbXVsYXRlSW5maW5pdGVMb29wLCBhcmcsIG5vU2V0VGltaW5nKSB7DQogTW9kdWxlWyJub0V4aXRSdW50aW1lIl0gPSB0cnVlOw0KIGFzc2VydCghQnJvd3Nlci5tYWluTG9vcC5mdW5jLCAiZW1zY3JpcHRlbl9zZXRfbWFpbl9sb29wOiB0aGVyZSBjYW4gb25seSBiZSBvbmUgbWFpbiBsb29wIGZ1bmN0aW9uIGF0IG9uY2U6IGNhbGwgZW1zY3JpcHRlbl9jYW5jZWxfbWFpbl9sb29wIHRvIGNhbmNlbCB0aGUgcHJldmlvdXMgb25lIGJlZm9yZSBzZXR0aW5nIGEgbmV3IG9uZSB3aXRoIGRpZmZlcmVudCBwYXJhbWV0ZXJzLiIpOw0KIEJyb3dzZXIubWFpbkxvb3AuZnVuYyA9IGZ1bmM7DQogQnJvd3Nlci5tYWluTG9vcC5hcmcgPSBhcmc7DQogdmFyIGJyb3dzZXJJdGVyYXRpb25GdW5jOw0KIGlmICh0eXBlb2YgYXJnICE9PSAidW5kZWZpbmVkIikgew0KICBicm93c2VySXRlcmF0aW9uRnVuYyA9IGZ1bmN0aW9uKCkgew0KICAgTW9kdWxlWyJkeW5DYWxsX3ZpIl0oZnVuYywgYXJnKTsNCiAgfTsNCiB9IGVsc2Ugew0KICBicm93c2VySXRlcmF0aW9uRnVuYyA9IGZ1bmN0aW9uKCkgew0KICAgTW9kdWxlWyJkeW5DYWxsX3YiXShmdW5jKTsNCiAgfTsNCiB9DQogdmFyIHRoaXNNYWluTG9vcElkID0gQnJvd3Nlci5tYWluTG9vcC5jdXJyZW50bHlSdW5uaW5nTWFpbmxvb3A7DQogQnJvd3Nlci5tYWluTG9vcC5ydW5uZXIgPSBmdW5jdGlvbiBCcm93c2VyX21haW5Mb29wX3J1bm5lcigpIHsNCiAgaWYgKEFCT1JUKSByZXR1cm47DQogIGlmIChCcm93c2VyLm1haW5Mb29wLnF1ZXVlLmxlbmd0aCA+IDApIHsNCiAgIHZhciBzdGFydCA9IERhdGUubm93KCk7DQogICB2YXIgYmxvY2tlciA9IEJyb3dzZXIubWFpbkxvb3AucXVldWUuc2hpZnQoKTsNCiAgIGJsb2NrZXIuZnVuYyhibG9ja2VyLmFyZyk7DQogICBpZiAoQnJvd3Nlci5tYWluTG9vcC5yZW1haW5pbmdCbG9ja2Vycykgew0KICAgIHZhciByZW1haW5pbmcgPSBCcm93c2VyLm1haW5Mb29wLnJlbWFpbmluZ0Jsb2NrZXJzOw0KICAgIHZhciBuZXh0ID0gcmVtYWluaW5nICUgMSA9PSAwID8gcmVtYWluaW5nIC0gMSA6IE1hdGguZmxvb3IocmVtYWluaW5nKTsNCiAgICBpZiAoYmxvY2tlci5jb3VudGVkKSB7DQogICAgIEJyb3dzZXIubWFpbkxvb3AucmVtYWluaW5nQmxvY2tlcnMgPSBuZXh0Ow0KICAgIH0gZWxzZSB7DQogICAgIG5leHQgPSBuZXh0ICsgLjU7DQogICAgIEJyb3dzZXIubWFpbkxvb3AucmVtYWluaW5nQmxvY2tlcnMgPSAoOCAqIHJlbWFpbmluZyArIG5leHQpIC8gOTsNCiAgICB9DQogICB9DQogICBjb25zb2xlLmxvZygnbWFpbiBsb29wIGJsb2NrZXIgIicgKyBibG9ja2VyLm5hbWUgKyAnIiB0b29rICcgKyAoRGF0ZS5ub3coKSAtIHN0YXJ0KSArICIgbXMiKTsNCiAgIEJyb3dzZXIubWFpbkxvb3AudXBkYXRlU3RhdHVzKCk7DQogICBpZiAodGhpc01haW5Mb29wSWQgPCBCcm93c2VyLm1haW5Mb29wLmN1cnJlbnRseVJ1bm5pbmdNYWlubG9vcCkgcmV0dXJuOw0KICAgc2V0VGltZW91dChCcm93c2VyLm1haW5Mb29wLnJ1bm5lciwgMCk7DQogICByZXR1cm47DQogIH0NCiAgaWYgKHRoaXNNYWluTG9vcElkIDwgQnJvd3Nlci5tYWluTG9vcC5jdXJyZW50bHlSdW5uaW5nTWFpbmxvb3ApIHJldHVybjsNCiAgQnJvd3Nlci5tYWluTG9vcC5jdXJyZW50RnJhbWVOdW1iZXIgPSBCcm93c2VyLm1haW5Mb29wLmN1cnJlbnRGcmFtZU51bWJlciArIDEgfCAwOw0KICBpZiAoQnJvd3Nlci5tYWluTG9vcC50aW1pbmdNb2RlID09IDEgJiYgQnJvd3Nlci5tYWluTG9vcC50aW1pbmdWYWx1ZSA+IDEgJiYgQnJvd3Nlci5tYWluTG9vcC5jdXJyZW50RnJhbWVOdW1iZXIgJSBCcm93c2VyLm1haW5Mb29wLnRpbWluZ1ZhbHVlICE9IDApIHsNCiAgIEJyb3dzZXIubWFpbkxvb3Auc2NoZWR1bGVyKCk7DQogICByZXR1cm47DQogIH0gZWxzZSBpZiAoQnJvd3Nlci5tYWluTG9vcC50aW1pbmdNb2RlID09IDApIHsNCiAgIEJyb3dzZXIubWFpbkxvb3AudGlja1N0YXJ0VGltZSA9IF9lbXNjcmlwdGVuX2dldF9ub3coKTsNCiAgfQ0KICBpZiAoQnJvd3Nlci5tYWluTG9vcC5tZXRob2QgPT09ICJ0aW1lb3V0IiAmJiBNb2R1bGUuY3R4KSB7DQogICBlcnIoIkxvb2tzIGxpa2UgeW91IGFyZSByZW5kZXJpbmcgd2l0aG91dCB1c2luZyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgZm9yIHRoZSBtYWluIGxvb3AuIFlvdSBzaG91bGQgdXNlIDAgZm9yIHRoZSBmcmFtZSByYXRlIGluIGVtc2NyaXB0ZW5fc2V0X21haW5fbG9vcCBpbiBvcmRlciB0byB1c2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lLCBhcyB0aGF0IGNhbiBncmVhdGx5IGltcHJvdmUgeW91ciBmcmFtZSByYXRlcyEiKTsNCiAgIEJyb3dzZXIubWFpbkxvb3AubWV0aG9kID0gIiI7DQogIH0NCiAgQnJvd3Nlci5tYWluTG9vcC5ydW5JdGVyKGJyb3dzZXJJdGVyYXRpb25GdW5jKTsNCiAgaWYgKHRoaXNNYWluTG9vcElkIDwgQnJvd3Nlci5tYWluTG9vcC5jdXJyZW50bHlSdW5uaW5nTWFpbmxvb3ApIHJldHVybjsNCiAgaWYgKHR5cGVvZiBTREwgPT09ICJvYmplY3QiICYmIFNETC5hdWRpbyAmJiBTREwuYXVkaW8ucXVldWVOZXdBdWRpb0RhdGEpIFNETC5hdWRpby5xdWV1ZU5ld0F1ZGlvRGF0YSgpOw0KICBCcm93c2VyLm1haW5Mb29wLnNjaGVkdWxlcigpOw0KIH07DQogaWYgKCFub1NldFRpbWluZykgew0KICBpZiAoZnBzICYmIGZwcyA+IDApIF9lbXNjcmlwdGVuX3NldF9tYWluX2xvb3BfdGltaW5nKDAsIDFlMyAvIGZwcyk7IGVsc2UgX2Vtc2NyaXB0ZW5fc2V0X21haW5fbG9vcF90aW1pbmcoMSwgMSk7DQogIEJyb3dzZXIubWFpbkxvb3Auc2NoZWR1bGVyKCk7DQogfQ0KIGlmIChzaW11bGF0ZUluZmluaXRlTG9vcCkgew0KICB0aHJvdyAiU2ltdWxhdGVJbmZpbml0ZUxvb3AiOw0KIH0NCn0NCg0KdmFyIEJyb3dzZXIgPSB7DQogbWFpbkxvb3A6IHsNCiAgc2NoZWR1bGVyOiBudWxsLA0KICBtZXRob2Q6ICIiLA0KICBjdXJyZW50bHlSdW5uaW5nTWFpbmxvb3A6IDAsDQogIGZ1bmM6IG51bGwsDQogIGFyZzogMCwNCiAgdGltaW5nTW9kZTogMCwNCiAgdGltaW5nVmFsdWU6IDAsDQogIGN1cnJlbnRGcmFtZU51bWJlcjogMCwNCiAgcXVldWU6IFtdLA0KICBwYXVz",
  "sig": "201e54552374c0700902a8f1c0731175d484af879e76933ed2af4c05c6c3104a46e16e6e0c2230895cfb7c65d79b2cbc734ae055f21646187d904430f9ea80de"
}

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