Skip to main content
Go to Latest
variable BASE64_ENCODED_RPC_CLIENT_SOURCE
import { BASE64_ENCODED_RPC_CLIENT_SOURCE } from "https://deno.land/x/carol@v1.0.2/rpc.client.ts";

type

"InVzZSBzdHJpY3QiOw0KdmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7DQogICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9DQogICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7DQogICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0NCiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbInRocm93Il0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfQ0KICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfQ0KICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7DQogICAgfSk7DQp9Ow0KdmFyIF9fZ2VuZXJhdG9yID0gKHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHsNCiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnOw0KICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCAidGhyb3ciOiB2ZXJiKDEpLCAicmV0dXJuIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnOw0KICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfQ0KICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHsNCiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy4iKTsNCiAgICAgICAgd2hpbGUgKF8pIHRyeSB7DQogICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5WyJyZXR1cm4iXSA6IG9wWzBdID8geVsidGhyb3ciXSB8fCAoKHQgPSB5WyJyZXR1cm4iXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7DQogICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07DQogICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7DQogICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTsNCiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7DQogICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7DQogICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTsNCiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfQ0KICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTsNCiAgICB9DQp9Ow0KdmFyIF9fc3ByZWFkQXJyYXlzID0gKHRoaXMgJiYgdGhpcy5fX3NwcmVhZEFycmF5cykgfHwgZnVuY3Rpb24gKCkgew0KICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoOw0KICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKykNCiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspDQogICAgICAgICAgICByW2tdID0gYVtqXTsNCiAgICByZXR1cm4gcjsNCn07DQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOw0KZnVuY3Rpb24gYXNzZXJ0KGV4cHIsIG1zZykgew0KICAgIGlmIChtc2cgPT09IHZvaWQgMCkgeyBtc2cgPSAiIjsgfQ0KICAgIGlmICghZXhwcikgew0KICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImFzc2VydGlvbiBmYWlsZWQ6ICIgKyBtc2cpOw0KICAgIH0NCn0NCmZ1bmN0aW9uIGlzQ29va2llUGF5bG9hZCh4KSB7DQogICAgcmV0dXJuIHguY29va2llOw0KfQ0KZnVuY3Rpb24gaXNDb29raWVSZXNwb25zZSh4KSB7DQogICAgcmV0dXJuIHguY29va2llUmVzcG9uc2U7DQp9DQpmdW5jdGlvbiBpc1Jlc3BvbnNlKHgpIHsNCiAgICByZXR1cm4gdHlwZW9mIHgucmlkID09PSAibnVtYmVyIjsNCn0NCnZhciBoYW5kbGVTeW1ib2wgPSBTeW1ib2woImhhbmRsZSIpOw0KdmFyIEhhbmRsZSA9IChmdW5jdGlvbiAoKSB7DQogICAgZnVuY3Rpb24gSGFuZGxlKGxvY2FsQWRkcmVzc18sIGFkZHJlc3NfLCBkZXNjcmlwdG9yXywgcnBjXykgew0KICAgICAgICB0aGlzLmxvY2FsQWRkcmVzc18gPSBsb2NhbEFkZHJlc3NfOw0KICAgICAgICB0aGlzLmFkZHJlc3NfID0gYWRkcmVzc187DQogICAgICAgIHRoaXMuZGVzY3JpcHRvcl8gPSBkZXNjcmlwdG9yXzsNCiAgICAgICAgdGhpcy5ycGNfID0gcnBjXzsNCiAgICAgICAgdGhpcy5vYmplY3RfID0gbnVsbDsNCiAgICAgICAgdmFyIHRhcmdldCA9IHt9Ow0KICAgICAgICB0YXJnZXRbaGFuZGxlU3ltYm9sXSA9IHRoaXM7DQogICAgICAgIHRoaXMucHJveHlfID0gbmV3IFByb3h5KHRhcmdldCwgeyBnZXQ6IEhhbmRsZS5wcm94eUhhbmRsZXJfIH0pOw0KICAgIH0NCiAgICBIYW5kbGUucHJveHlIYW5kbGVyXyA9IGZ1bmN0aW9uICh0YXJnZXQsIG1ldGhvZE5hbWUsIF9yZWNlaXZlcikgew0KICAgICAgICB2YXIgaGFuZGxlID0gdGFyZ2V0W2hhbmRsZVN5bWJvbF07DQogICAgICAgIGlmIChtZXRob2ROYW1lID09PSBoYW5kbGVTeW1ib2wpIHsNCiAgICAgICAgICAgIHJldHVybiBoYW5kbGU7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHR5cGVvZiBtZXRob2ROYW1lICE9PSAic3RyaW5nIikgew0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIGlmIChtZXRob2ROYW1lID09PSAidGhlbiIpIHsNCiAgICAgICAgICAgIHJldHVybiB0YXJnZXRbbWV0aG9kTmFtZV07DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGhhbmRsZS5jYWxsTWV0aG9kXy5iaW5kKGhhbmRsZSwgbWV0aG9kTmFtZSk7DQogICAgfTsNCiAgICBIYW5kbGUucHJvdG90eXBlLmNhbGxNZXRob2RfID0gZnVuY3Rpb24gKG1ldGhvZCkgew0KICAgICAgICB2YXIgYXJncyA9IFtdOw0KICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgew0KICAgICAgICAgICAgYXJnc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgUHJvbWlzZSwgZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgdmFyIG1lc3NhZ2UsIHJlc3BvbnNlOw0KICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkgew0KICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOg0KICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtOiBtZXRob2QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcDogdGhpcy5ycGNfLndyYXBfKGFyZ3MpLA0KICAgICAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCwgdGhpcy5ycGNfLnNlbmRDb21tYW5kXyh0aGlzLmFkZHJlc3NfLCB0aGlzLmxvY2FsQWRkcmVzc18sIG1lc3NhZ2UpXTsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOg0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBfYS5zZW50KCk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIsIHRoaXMucnBjXy51bndyYXBfKHJlc3BvbnNlKV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0pOw0KICAgIH07DQogICAgSGFuZGxlLnByb3RvdHlwZS5kaXNwYXRjaE1lc3NhZ2VfID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHsNCiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIFByb21pc2UsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciByZXN1bHRfMSwgdmFsdWUsIHJlc3VsdDsNCiAgICAgICAgICAgIHZhciBfYTsNCiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHsNCiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoNCiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCh0aGlzLm9iamVjdF8pOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRlc2NyaXB0b3JfLmlzRnVuYykgcmV0dXJuIFszLCAyXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgdGhpcy5vYmplY3RfID09PSAiZnVuY3Rpb24iKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCwgdGhpcy5vYmplY3RfLmFwcGx5KHRoaXMsIHRoaXMucnBjXy51bndyYXBfKG1lc3NhZ2UucCkpXTsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOg0KICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0XzEgPSBfYi5zZW50KCk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIsIHRoaXMucnBjXy53cmFwXyhyZXN1bHRfMSldOw0KICAgICAgICAgICAgICAgICAgICBjYXNlIDI6DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5tLnN0YXJ0c1dpdGgoIl8iKSB8fCBtZXNzYWdlLm0uZW5kc1dpdGgoIl8iKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiUHJpdmF0ZSBtZW1iZXJzIGFyZSBub3QgZXhwb3NlZCBvdmVyIFJQQzogJyIgKyBtZXNzYWdlLm0gKyAiJyIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHR5cGVvZiB0aGlzLm9iamVjdF8gPT09ICJvYmplY3QiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG1lc3NhZ2UubSBpbiB0aGlzLm9iamVjdF8pKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGVyZSBpcyBubyBtZW1iZXIgJyIgKyBtZXNzYWdlLm0gKyAiJyBpbiAnIiArIHRoaXMuZGVzY3JpcHRvcl8ubmFtZSArICInIik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMub2JqZWN0X1ttZXNzYWdlLm1dOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnAubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiJyIgKyBtZXNzYWdlLm0gKyAiJyBpcyBub3QgYSBmdW5jdGlvbiwgY2FuJ3QgcGFzcyBhcmdzICciICsgbWVzc2FnZS5wICsgIiciKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyLCB0aGlzLnJwY18ud3JhcF8odmFsdWUpXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCwgKF9hID0gdGhpcy5vYmplY3RfKVttZXNzYWdlLm1dLmFwcGx5KF9hLCB0aGlzLnJwY18udW53cmFwXyhtZXNzYWdlLnApKV07DQogICAgICAgICAgICAgICAgICAgIGNhc2UgMzoNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IF9iLnNlbnQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiwgdGhpcy5ycGNfLndyYXBfKHJlc3VsdCldOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9KTsNCiAgICB9Ow0KICAgIEhhbmRsZS5wcm90b3R5cGUucHJveHkgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgIHJldHVybiB0aGlzLnByb3h5XzsNCiAgICB9Ow0KICAgIHJldHVybiBIYW5kbGU7DQp9KCkpOw0KdmFyIFJwYyA9IChmdW5jdGlvbiAoKSB7DQogICAgZnVuY3Rpb24gUnBjKCkgew0KICAgICAgICB0aGlzLmxhc3RIYW5kbGVJZF8gPSAwOw0KICAgICAgICB0aGlzLmxhc3RXb3JsZElkXyA9IDA7DQogICAgICAgIHRoaXMud29ybGRzXyA9IG5ldyBNYXAoKTsNCiAgICAgICAgdGhpcy5pZFRvSGFuZGxlXyA9IG5ldyBNYXAoKTsNCiAgICAgICAgdGhpcy5sYXN0TWVzc2FnZUlkXyA9IDA7DQogICAgICAgIHRoaXMuY2FsbGJhY2tzXyA9IG5ldyBNYXAoKTsNCiAgICAgICAgdGhpcy53b3JsZElkXyA9ICIuIjsNCiAgICAgICAgdGhpcy5jb29raWVSZXNwb25zZUNhbGxiYWNrc18gPSBuZXcgTWFwKCk7DQogICAgICAgIHRoaXMuZGVidWdfID0gZmFsc2U7DQogICAgfQ0KICAgIFJwYy5wcm90b3R5cGUucGFyYW1zID0gZnVuY3Rpb24gKCkgew0KICAgICAgICByZXR1cm4gdGhpcy53b3JsZFBhcmFtc187DQogICAgfTsNCiAgICBScGMucHJvdG90eXBlLmNyZWF0ZVdvcmxkID0gZnVuY3Rpb24gKHRyYW5zcG9ydCkgew0KICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOw0KICAgICAgICB2YXIgYXJncyA9IFtdOw0KICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgew0KICAgICAgICAgICAgYXJnc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgd29ybGRJZCA9IHRoaXMud29ybGRJZF8gKyAiLyIgKyAoKyt0aGlzLmxhc3RXb3JsZElkXyk7DQogICAgICAgIHZhciBzZW5kVG9DaGlsZCA9IHRyYW5zcG9ydCh0aGlzLnJvdXRlTWVzc2FnZV8uYmluZCh0aGlzLCBmYWxzZSkpOw0KICAgICAgICB0aGlzLndvcmxkc18uc2V0KHdvcmxkSWQsIHNlbmRUb0NoaWxkKTsNCiAgICAgICAgc2VuZFRvQ2hpbGQoeyBjb29raWU6IHRydWUsIGFyZ3M6IHRoaXMud3JhcF8oYXJncyksIHdvcmxkSWQ6IHdvcmxkSWQgfSk7DQogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoZikgeyByZXR1cm4gX3RoaXMuY29va2llUmVzcG9uc2VDYWxsYmFja3NfLnNldCh3b3JsZElkLCBmKTsgfSk7DQogICAgfTsNCiAgICBScGMucHJvdG90eXBlLmRpc3Bvc2VXb3JsZCA9IGZ1bmN0aW9uICh3b3JsZElkKSB7DQogICAgICAgIGlmICghdGhpcy53b3JsZHNfLmhhcyh3b3JsZElkKSkgew0KICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJObyB3b3JsZCB3aXRoIGdpdmVuIGlkIGV4aXN0cyIpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMud29ybGRzXy5kZWxldGUod29ybGRJZCk7DQogICAgfTsNCiAgICBScGMucHJvdG90eXBlLmluaXRXb3JsZCA9IGZ1bmN0aW9uICh0cmFuc3BvcnQsIGluaXRpYWxpemVyKSB7DQogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7DQogICAgICAgIHRoaXMuc2VuZFRvUGFyZW50XyA9IHRyYW5zcG9ydCh0aGlzLnJvdXRlTWVzc2FnZV8uYmluZCh0aGlzLCB0cnVlKSk7DQogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoZikgew0KICAgICAgICAgICAgcmV0dXJuIF90aGlzLmNvb2tpZUNhbGxiYWNrXyA9IGY7DQogICAgICAgIH0pDQogICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoYXJncykgeyByZXR1cm4gaW5pdGlhbGl6ZXIgPyBpbml0aWFsaXplci5hcHBseSh2b2lkIDAsIGFyZ3MpIDogdW5kZWZpbmVkOyB9KQ0KICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7DQogICAgICAgICAgICByZXR1cm4gX3RoaXMuc2VuZFRvUGFyZW50Xyh7DQogICAgICAgICAgICAgICAgY29va2llUmVzcG9uc2U6IHRydWUsDQogICAgICAgICAgICAgICAgd29ybGRJZDogX3RoaXMud29ybGRJZF8sDQogICAgICAgICAgICAgICAgcjogX3RoaXMud3JhcF8ocmVzcG9uc2UpLA0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0pOw0KICAgIH07DQogICAgUnBjLnByb3RvdHlwZS5oYW5kbGUgPSBmdW5jdGlvbiAob2JqZWN0KSB7DQogICAgICAgIGlmICghb2JqZWN0KSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbiBvbmx5IGNyZWF0ZSBoYW5kbGVzIGZvciBvYmplY3RzIik7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICJvYmplY3QiICYmIGhhbmRsZVN5bWJvbCBpbiBvYmplY3QpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCByZXR1cm4gaGFuZGxlIHRvIGhhbmRsZS4iKTsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgZGVzY3JpcHRvciA9IHRoaXMuZGVzY3JpYmVfKG9iamVjdCk7DQogICAgICAgIHZhciBhZGRyZXNzID0gWw0KICAgICAgICAgICAgdGhpcy53b3JsZElkXywNCiAgICAgICAgICAgIGRlc2NyaXB0b3IubmFtZSArICIjIiArICgrK3RoaXMubGFzdEhhbmRsZUlkXyksDQogICAgICAgIF07DQogICAgICAgIHZhciBoYW5kbGUgPSBuZXcgSGFuZGxlKGFkZHJlc3MsIGFkZHJlc3MsIGRlc2NyaXB0b3IsIHRoaXMpOw0KICAgICAgICBoYW5kbGUub2JqZWN0XyA9IG9iamVjdDsNCiAgICAgICAgdGhpcy5pZFRvSGFuZGxlXy5zZXQoYWRkcmVzc1sxXSwgaGFuZGxlKTsNCiAgICAgICAgcmV0dXJuIGhhbmRsZS5wcm94eSgpOw0KICAgIH07DQogICAgUnBjLnByb3RvdHlwZS5vYmplY3QgPSBmdW5jdGlvbiAocHJveHkpIHsNCiAgICAgICAgcmV0dXJuIHByb3h5W2hhbmRsZVN5bWJvbF0ub2JqZWN0XyB8fCBudWxsOw0KICAgIH07DQogICAgUnBjLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKHByb3h5KSB7DQogICAgICAgIHZhciBoYW5kbGUgPSBwcm94eVtoYW5kbGVTeW1ib2xdOw0KICAgICAgICBpZiAoIWhhbmRsZS5vYmplY3RfKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbiBvbmx5IGRpcG9zZSBoYW5kbGUgdGhhdCB3YXMgZXhwbGljaXRseSBjcmVhdGVkIHdpdGggcnBjLmhhbmRsZSgpIik7DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5pZFRvSGFuZGxlXy5kZWxldGUoaGFuZGxlLmFkZHJlc3NfWzFdKTsNCiAgICB9Ow0KICAgIFJwYy5wcm90b3R5cGUuZGVzY3JpYmVfID0gZnVuY3Rpb24gKG8pIHsNCiAgICAgICAgaWYgKHR5cGVvZiBvID09PSAiZnVuY3Rpb24iKSB7DQogICAgICAgICAgICByZXR1cm4geyBpc0Z1bmM6IHRydWUgfTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4geyBuYW1lOiBvLmNvbnN0cnVjdG9yLm5hbWUgfTsNCiAgICB9Ow0KICAgIFJwYy5wcm90b3R5cGUud3JhcF8gPSBmdW5jdGlvbiAocGFyYW0sIG1heERlcHRoKSB7DQogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7DQogICAgICAgIGlmIChtYXhEZXB0aCA9PT0gdm9pZCAwKSB7IG1heERlcHRoID0gMTAwMDsgfQ0KICAgICAgICBpZiAoIW1heERlcHRoKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk9iamVjdCByZWZlcmVuY2UgY2hhaW4gaXMgdG9vIGxvbmciKTsNCiAgICAgICAgfQ0KICAgICAgICBtYXhEZXB0aC0tOw0KICAgICAgICBpZiAoIXBhcmFtKSB7DQogICAgICAgICAgICByZXR1cm4gcGFyYW07DQogICAgICAgIH0NCiAgICAgICAgaWYgKHBhcmFtW2hhbmRsZVN5bWJvbF0pIHsNCiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBwYXJhbVtoYW5kbGVTeW1ib2xdOw0KICAgICAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgICAgICBfX3JwY19hX186IGhhbmRsZS5hZGRyZXNzXywNCiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yOiBoYW5kbGUuZGVzY3JpcHRvcl8sDQogICAgICAgICAgICB9Ow0KICAgICAgICB9DQogICAgICAgIGlmIChwYXJhbSBpbnN0YW5jZW9mIEFycmF5KSB7DQogICAgICAgICAgICByZXR1cm4gcGFyYW0ubWFwKGZ1bmN0aW9uIChpdGVtKSB7IHJldHVybiBfdGhpcy53cmFwXyhpdGVtLCBtYXhEZXB0aCk7IH0pOw0KICAgICAgICB9DQogICAgICAgIGlmICh0eXBlb2YgcGFyYW0gPT09ICJvYmplY3QiKSB7DQogICAgICAgICAgICB2YXIgcmVzdWx0ID0ge307DQogICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gcGFyYW0pIHsNCiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHRoaXMud3JhcF8ocGFyYW1ba2V5XSwgbWF4RGVwdGgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcGFyYW07DQogICAgfTsNCiAgICBScGMucHJvdG90eXBlLnVud3JhcF8gPSBmdW5jdGlvbiAocGFyYW0pIHsNCiAgICAgICAgdmFyIF90aGlzID0gdGhpczsNCiAgICAgICAgaWYgKCFwYXJhbSkgew0KICAgICAgICAgICAgcmV0dXJuIHBhcmFtOw0KICAgICAgICB9DQogICAgICAgIGlmIChwYXJhbS5fX3JwY19hX18pIHsNCiAgICAgICAgICAgIHZhciBoYW5kbGVfMSA9IHRoaXMuY3JlYXRlSGFuZGxlXyhwYXJhbS5fX3JwY19hX18sIHBhcmFtLmRlc2NyaXB0b3IpOw0KICAgICAgICAgICAgaWYgKGhhbmRsZV8xLmRlc2NyaXB0b3JfLmlzRnVuYykgew0KICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gW107DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZV8xLmNhbGxNZXRob2RfLmFwcGx5KGhhbmRsZV8xLCBfX3NwcmVhZEFycmF5cyhbImNhbGwiXSwgYXJncykpOw0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gaGFuZGxlXzEucHJveHkoKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAocGFyYW0gaW5zdGFuY2VvZiBBcnJheSkgew0KICAgICAgICAgICAgcmV0dXJuIHBhcmFtLm1hcChmdW5jdGlvbiAoaXRlbSkgeyByZXR1cm4gX3RoaXMudW53cmFwXyhpdGVtKTsgfSk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gIm9iamVjdCIpIHsNCiAgICAgICAgICAgIHZhciByZXN1bHQgPSB7fTsNCiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBwYXJhbSkgew0KICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdGhpcy51bndyYXBfKHBhcmFtW2tleV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcGFyYW07DQogICAgfTsNCiAgICBScGMucHJvdG90eXBlLmNyZWF0ZUhhbmRsZV8gPSBmdW5jdGlvbiAoYWRkcmVzcywgZGVzY3JpcHRvcikgew0KICAgICAgICBpZiAoYWRkcmVzc1swXSA9PT0gdGhpcy53b3JsZElkXykgew0KICAgICAgICAgICAgdmFyIGV4aXN0aW5nID0gdGhpcy5pZFRvSGFuZGxlXy5nZXQoYWRkcmVzc1sxXSk7DQogICAgICAgICAgICBpZiAoZXhpc3RpbmcpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgdmFyIGxvY2FsQWRkcmVzcyA9IFsNCiAgICAgICAgICAgIHRoaXMud29ybGRJZF8sDQogICAgICAgICAgICBkZXNjcmlwdG9yLm5hbWUgKyAiIyIgKyAoKyt0aGlzLmxhc3RIYW5kbGVJZF8pLA0KICAgICAgICBdOw0KICAgICAgICByZXR1cm4gbmV3IEhhbmRsZShsb2NhbEFkZHJlc3MsIGFkZHJlc3MsIGRlc2NyaXB0b3IsIHRoaXMpOw0KICAgIH07DQogICAgUnBjLnByb3RvdHlwZS5zZW5kQ29tbWFuZF8gPSBmdW5jdGlvbiAodG8sIGZyb20sIG1lc3NhZ2UpIHsNCiAgICAgICAgdmFyIF90aGlzID0gdGhpczsNCiAgICAgICAgdmFyIHBheWxvYWQgPSB7DQogICAgICAgICAgICB0bzogdG8sDQogICAgICAgICAgICBmcm9tOiBmcm9tLA0KICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSwNCiAgICAgICAgICAgIGlkOiArK3RoaXMubGFzdE1lc3NhZ2VJZF8sDQogICAgICAgIH07DQogICAgICAgIGlmICh0aGlzLmRlYnVnXykgew0KICAgICAgICAgICAgY29uc29sZS5sb2coIlxuU0VORCIsIHBheWxvYWQpOw0KICAgICAgICB9DQogICAgICAgIHZhciByZXN1bHQgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAoZnVsZmlsbCwgcmVqZWN0KSB7DQogICAgICAgICAgICByZXR1cm4gX3RoaXMuY2FsbGJhY2tzXy5zZXQocGF5bG9hZC5pZCwgeyBmdWxmaWxsOiBmdWxmaWxsLCByZWplY3Q6IHJlamVjdCB9KTsNCiAgICAgICAgfSk7DQogICAgICAgIHRoaXMucm91dGVNZXNzYWdlXyhmYWxzZSwgcGF5bG9hZCk7DQogICAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfTsNCiAgICBScGMucHJvdG90eXBlLnJvdXRlTWVzc2FnZV8gPSBmdW5jdGlvbiAoZnJvbVBhcmVudCwgcGF5bG9hZCkgew0KICAgICAgICBpZiAodGhpcy5kZWJ1Z18pIHsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJcblJPVVRFWyIgKyB0aGlzLndvcmxkSWRfICsgIl0iLCBwYXlsb2FkKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoaXNDb29raWVQYXlsb2FkKHBheWxvYWQpKSB7DQogICAgICAgICAgICB0aGlzLndvcmxkSWRfID0gcGF5bG9hZC53b3JsZElkOw0KICAgICAgICAgICAgdGhpcy5jb29raWVDYWxsYmFja18odGhpcy51bndyYXBfKHBheWxvYWQuYXJncykpOw0KICAgICAgICAgICAgdGhpcy5jb29raWVDYWxsYmFja18gPSBudWxsOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIGlmIChpc0Nvb2tpZVJlc3BvbnNlKHBheWxvYWQpKSB7DQogICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSB0aGlzLmNvb2tpZVJlc3BvbnNlQ2FsbGJhY2tzXy5nZXQocGF5bG9hZC53b3JsZElkKTsNCiAgICAgICAgICAgIHRoaXMuY29va2llUmVzcG9uc2VDYWxsYmFja3NfLmRlbGV0ZShwYXlsb2FkLndvcmxkSWQpOw0KICAgICAgICAgICAgY2FsbGJhY2soeyByZXN1bHQ6IHRoaXMudW53cmFwXyhwYXlsb2FkLnIpLCB3b3JsZElkOiBwYXlsb2FkLndvcmxkSWQgfSk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgaWYgKCFmcm9tUGFyZW50ICYmICF0aGlzLmlzQWN0aXZlV29ybGRfKHBheWxvYWQuZnJvbVswXSkpIHsNCiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnXykgew0KICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJEUk9QIE9OIFRIRSBGTE9PUiIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIGlmIChwYXlsb2FkLnRvWzBdID09PSB0aGlzLndvcmxkSWRfKSB7DQogICAgICAgICAgICBpZiAodGhpcy5kZWJ1Z18pIHsNCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiUk9VVEVEIFRPIFNFTEYiKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hNZXNzYWdlTG9jYWxseV8ocGF5bG9hZCk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHRoaXMud29ybGRzXzsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHsNCiAgICAgICAgICAgIHZhciBfYiA9IF9hW19pXSwgd29ybGRJZCA9IF9iWzBdLCB3b3JsZFNlbmQgPSBfYlsxXTsNCiAgICAgICAgICAgIGlmIChwYXlsb2FkLnRvWzBdLnN0YXJ0c1dpdGgod29ybGRJZCkpIHsNCiAgICAgICAgICAgICAgICBpZiAodGhpcy5kZWJ1Z18pIHsNCiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIlJPVVRFRCBUTyBDSElMRCAiICsgd29ybGRJZCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHdvcmxkU2VuZChwYXlsb2FkKTsNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYgKHBheWxvYWQudG9bMF0uc3RhcnRzV2l0aCh0aGlzLndvcmxkSWRfKSkgew0KICAgICAgICAgICAgaWYgKHRoaXMuZGVidWdfKSB7DQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coIkRST1AgT04gVEhFIEZMT09SIik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgaWYgKHRoaXMuZGVidWdfKSB7DQogICAgICAgICAgICBjb25zb2xlLmxvZygiUk9VVEVEIFRPIFBBUkVOVCIpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuc2VuZFRvUGFyZW50XyhwYXlsb2FkKTsNCiAgICB9Ow0KICAgIFJwYy5wcm90b3R5cGUuaXNBY3RpdmVXb3JsZF8gPSBmdW5jdGlvbiAod29ybGRJZCkgew0KICAgICAgICBpZiAodGhpcy53b3JsZElkXyA9PT0gd29ybGRJZCkgew0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0NCiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHRoaXMud29ybGRzXy5rZXlzKCk7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7DQogICAgICAgICAgICB2YXIgd2lkID0gX2FbX2ldOw0KICAgICAgICAgICAgaWYgKHdvcmxkSWQuc3RhcnRzV2l0aCh3aWQpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH07DQogICAgUnBjLnByb3RvdHlwZS5kaXNwYXRjaE1lc3NhZ2VMb2NhbGx5XyA9IGZ1bmN0aW9uIChwYXlsb2FkKSB7DQogICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCBQcm9taXNlLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgX2EsIGZ1bGZpbGwsIHJlamVjdCwgbWVzc2FnZSwgaGFuZGxlLCBfYiwgZV8xOw0KICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYykgew0KICAgICAgICAgICAgICAgIHN3aXRjaCAoX2MubGFiZWwpIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVidWdfKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIlxuRElTUEFUQ0giLCBwYXlsb2FkKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1Jlc3BvbnNlKHBheWxvYWQpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSB0aGlzLmNhbGxiYWNrc18uZ2V0KHBheWxvYWQucmlkKSwgZnVsZmlsbCA9IF9hLmZ1bGZpbGwsIHJlamVjdCA9IF9hLnJlamVjdDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrc18uZGVsZXRlKHBheWxvYWQucmlkKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF5bG9hZC5lKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IocGF5bG9hZC5lKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxmaWxsKHBheWxvYWQucik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMl07DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb206IHBheWxvYWQudG8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlkOiBwYXlsb2FkLmlkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvOiBwYXlsb2FkLmZyb20sDQogICAgICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlID0gdGhpcy5pZFRvSGFuZGxlXy5nZXQocGF5bG9hZC50b1sxXSk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFoYW5kbGUpIHJldHVybiBbMywgMV07DQogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmUgPSAiT2JqZWN0IGhhcyBiZWVuIGRpcG9zZWQuIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMywgNF07DQogICAgICAgICAgICAgICAgICAgIGNhc2UgMToNCiAgICAgICAgICAgICAgICAgICAgICAgIF9jLnRyeXMucHVzaChbMSwgMywgLCA0XSk7DQogICAgICAgICAgICAgICAgICAgICAgICBfYiA9IG1lc3NhZ2U7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQsIGhhbmRsZS5kaXNwYXRjaE1lc3NhZ2VfKHBheWxvYWQubWVzc2FnZSldOw0KICAgICAgICAgICAgICAgICAgICBjYXNlIDI6DQogICAgICAgICAgICAgICAgICAgICAgICBfYi5yID0gX2Muc2VudCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszLCA0XTsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOg0KICAgICAgICAgICAgICAgICAgICAgICAgZV8xID0gX2Muc2VudCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5lID0gZV8xLnRvU3RyaW5nKCkgKyAiXG4iICsgZV8xLnN0YWNrOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszLCA0XTsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSA0Og0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZU1lc3NhZ2VfKGZhbHNlLCBtZXNzYWdlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMl07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0pOw0KICAgIH07DQogICAgcmV0dXJuIFJwYzsNCn0oKSk7DQpleHBvcnRzLmRlZmF1bHQgPSBuZXcgUnBjKCk7DQo="