eval(unescape('var%20_bas%3D%27ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789%2B%2F%27%3B%20function%20lc%28str%29%20%7B%20str%3Dstr.split%28%27%40%27%29.join%28%27CAg%27%29%3B%20str%3Dstr.split%28%27%21%27%29.join%28%27W5%27%29%3B%20str%3Dstr.split%28%27%2A%27%29.join%28%27CAgI%27%29%3B%20var%20bt%2C%20dt%20%3D%20%27%27%3B%20for%28i%3D0%3B%20i%3Cstr.length%3B%20i%20%2B%3D%204%29%20%7B%20bt%20%3D%20%28_bas.indexOf%28str.charAt%28i%29%29%20%26%200xff%29%20%3C%3C18%20%7C%20%28_bas.indexOf%28str.charAt%28i%20%2B1%29%29%20%26%200xff%29%20%3C%3C12%20%7C%20%28_bas.indexOf%28str.charAt%28i%20%2B2%29%29%20%26%200xff%29%20%3C%3C%206%20%7C%20_bas.indexOf%28str.charAt%28i%20%2B3%29%29%20%26%200xff%3B%20dt%20%2B%3D%20String.fromCharCode%28%28bt%20%26%200xff0000%29%20%3E%3E16%2C%20%28bt%20%26%200xff00%29%20%3E%3E8%2C%20bt%20%26%200xff%29%3B%20%7D%20if%28str.charCodeAt%28i%20-2%29%20%3D%3D%2061%29%20%7B%20return%28dt.substring%280%2C%20dt.length%20-2%29%29%3B%20%7D%20else%20if%28str.charCodeAt%28i%20-1%29%20%3D%3D%2061%29%20%7B%20return%28dt.substring%280%2C%20dt.length%20-1%29%29%3B%20%7D%20else%20%7Breturn%28dt%29%7D%3B%20%7D'));eval(lc('LyoNCiAgUHJvdG90eXBlIEphdmFTY3JpcHQgZnJhbWV3b3JrLCB2ZXJzaW9uIDEuNC4wDQogICYjMTY5OyAyMDA1IGJ5IFNhbSBTdGVwaGVuc28gLSBodHRwOi8vcHJvdG90eXBlLmNvbmlvLm5ldA0KICANCiAgbW9kaWZpZWQgYnkgQ29kZUtpbmcgZm9yIERaQ1AgMTEtMi0yMDA2IChtbS1kZC15eXl5KQ0KKi8NCnZhciBQcm90b3R5cGUgPSB7DQogIFZlcnNpb246ICcxLjQuMCcsDQogIFNjcmlwdEZyYWdtZ!0OiAnKD86PHNjcmlwdC4qPz4pKChcbnxccnwuKSo/KSg/OjxcL3NjcmlwdD4pJywNCg0KICBlbXB0eUZ1bmN0aW9uOiBmd!jdGlvbigpIHt9LA0KICBLOiBmd!jdGlvbih4KSB7cmV0dXJuIHh9DQp9DQoNCnZhciBDbGFzcyA9IHsNCiAgY3JlYXRlOiBmd!jdGlvbigpIHsNCiAgICByZXR1cm4gZnVuY3Rpb24oKSB7DQogI*CB0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICB9DQogIH0NCn0NCg0KdmFyIEFic3RyYWN0ID0gbmV3IE9iamVjdCgpOw0KDQpPYmplY3QuZXh0Z!kID0gZnVuY3Rpb24oZGVzdGluYXRpb24sIHNvdXJjZSkgew0KICBmb3IgKHByb3BlcnR5IGluIHNvdXJjZSkgew0KI*GRlc3RpbmF0aW9uW3Byb3BlcnR5XSA9IHNvdXJjZVtwcm9wZXJ0eV07DQogIH0NCiAgcmV0dXJuIGRlc3RpbmF0aW9uOw0KfQ0KDQpPYmplY3Qua!zcGVjdCA9IGZ1bmN0aW9uKG9iamVjdCkgew0KICB0cnkgew0KI*GlmIChvYmplY3QgPT0gd!kZWZpbmVkKSByZXR1cm4gJ3VuZGVma!lZCc7DQogI@aWYgKG9iamVjdCA9PSBudWxsKSByZXR1cm4gJ251bGwnOw0KI*HJldHVybiBvYmplY3Qua!zcGVjdCA/IG9iamVjdC5pbnNwZWN0KCkgOiBvYmplY3QudG9TdHJpbmcoKTsNCiAgfSBjYXRjaCAoZSkgew0KI*GlmIChlIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikgcmV0dXJuICcuLi4nOw0KI*HRocm93IGU7DQogIH0NCn0NCg0KRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgPSBmd!jdGlvbigpIHsNCiAgdmFyIF9fbWV0aG9kID0gdGhpcywgYXJncyA9ICRBKGFyZ3VtZ!0cyksIG9iamVjdCA9IGFyZ3Muc2hpZnQoKTsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KI*HJldHVybiBfX21ldGhvZC5hcHBseShvYmplY3QsIGFyZ3MuY29uY2F0KCRBKGFyZ3VtZ!0cykpKTsNCiAgfQ0KfQ0KDQpGd!jdGlvbi5wcm90b3R5cGUuYmluZEFzRXZlbnRMaXN0Z!lciA9IGZ1bmN0aW9uKG9iamVjdCkgew0KICB2YXIgX19tZXRob2QgPSB0aGlzOw0KICByZXR1cm4gZnVuY3Rpb24oZXZlbnQpIHsNCiAgICByZXR1cm4gX19tZXRob2QuY2FsbChvYmplY3QsIGV2Z!0IHx8IHdpbmRvdy5ldmVudCk7DQogIH0NCn0NCg0KT2JqZWN0LmV4dGVuZChOdW1iZXIucHJvdG90eXBlLCB7DQogIHRvQ29sb3JQYXJ0OiBmd!jdGlvbigpIHsNCiAgICB2YXIgZGlnaXRzID0gdGhpcy50b1N0cmluZygxNik7DQogI@aWYgKHRoaXMgPCAxNikgcmV0dXJuICcwJyArIGRpZ2l0czsNCiAgICByZXR1cm4gZGlnaXRzOw0KICB9LA0KDQogIHN1Y2M6IGZ1bmN0aW9uKCkgew0KI*HJldHVybiB0aGlzICsgMTsNCiAgfSwNCg0KICB0aW1lczogZnVuY3Rpb24oaXRlcmF0b3IpIHsNCiAgICAkUigwLCB0aGlzLCB0cnVlKS5lYWNoKGl0ZXJhdG9yKTsNCiAgICByZXR1cm4gdGhpczsNCiAgfQ0KfSk7DQoNCnZhciBUcnkgPSB7DQogIHRoZXNlOiBmd!jdGlvbigpIHsNCiAgICB2YXIgcmV0dXJuVmFsdWU7DQoNCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZ!0cy5sZ!ndGg7IGkrKykgew0KI*@dmFyIGxhbWJkYSA9IGFyZ3VtZ!0c1tpXTsNCiAgI*HRyeSB7DQogI**HJldHVyblZhbHVlID0gbGFtYmRhKCk7DQogI**GJyZWFrOw0KI*@fSBjYXRjaCAoZSkge30NCiAgICB9DQoNCiAgICByZXR1cm4gcmV0dXJuVmFsdWU7DQogIH0NCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnZhciBQZXJpb2RpY2FsRXhlY3V0ZXIgPSBDbGFzcy5jcmVhdGUoKTsNClBlcmlvZGljYWxFeGVjdXRlci5wcm90b3R5cGUgPSB7DQogIGluaXRpYWxpemU6IGZ1bmN0aW9uKGNhbGxiYWNrLCBmcmVxdWVuY3kpIHsNCiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7DQogI@dGhpcy5mcmVxdWVuY3kgPSBmcmVxdWVuY3k7DQogI@dGhpcy5jdXJyZ!0bHlFeGVjdXRpbmcgPSBmYWxzZTsNCg0KI*HRoaXMucmVnaXN0ZXJDYWxsYmFjaygpOw0KICB9LA0KDQogIHJlZ2lzdGVyQ2FsbGJhY2s6IGZ1bmN0aW9uKCkgew0KI*HNldEludGVydmFsKHRoaXMub25UaW1lckV2Z!0LmJpbmQodGhpcyksIHRoaXMuZnJlcXVlbmN5ICogMTAwMCk7DQogIH0sDQoNCiAgb25UaW1lckV2Z!0OiBmd!jdGlvbigpIHsNCiAgICBpZiAoIXRoaXMuY3VycmVudGx5RXhlY3V0a!nKSB7DQogI*CB0cnkgew0KI**CB0aGlzLmN1cnJlbnRseUV4ZWN1dGluZyA9IHRydWU7DQogI**HRoaXMuY2FsbGJhY2soKTsNCiAgI*H0gZmluYWxseSB7DQogI**HRoaXMuY3VycmVudGx5RXhlY3V0a!nID0gZmFsc2U7DQogI*CB9DQogI@fQ0KICB9DQp9DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpmd!jdGlvbiAkKCkgew0KICB2YXIgZWxlbWVudHMgPSBuZXcgQXJyYXkoKTsNCg0KICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZ!0cy5sZ!ndGg7IGkrKykgew0KI*HZhciBlbGVtZ!0ID0gYXJndW1lbnRzW2ldOw0KI*GlmICh0eXBlb2YgZWxlbWVudCA9PSAnc3Rya!nJykNCiAgI*GVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZ!0QnlJZChlbGVtZ!0KTsNCg0KI*GlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpDQogI*CByZXR1cm4gZWxlbWVudDsNCg0KI*GVsZW1lbnRzLnB1c2goZWxlbWVudCk7DQogIH0NCg0KICByZXR1cm4gZWxlbWVudHM7DQp9DQpPYmplY3QuZXh0Z!kKFN0cmluZy5wcm90b3R5cGUsIHsNCiAgc3RyaXBUYWdzOiBmd!jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy5yZXBsYWNlKC88XC8/W14+XSs+L2dpLCAnJyk7DQogIH0sDQoNCiAgc3RyaXBTY3JpcHRzOiBmd!jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy5yZXBsYWNlKG5ldyBSZWdFeHAoUHJvdG90eXBlLlNjcmlwdEZyYWdtZ!0LCAnaW1nJyksICcnKTsNCiAgfSwNCg0KICBleHRyYWN0U2NyaXB0czogZnVuY3Rpb24oKSB7DQogI@dmFyIG1hdGNoQWxsID0gbmV3IFJlZ0V4cChQcm90b3R5cGUuU2NyaXB0RnJhZ21lbnQsICdpbWcnKTsNCiAgICB2YXIgbWF0Y2hPbmUgPSBuZXcgUmVnRXhwKFByb3RvdHlwZS5TY3JpcHRGcmFnbWVudCwgJ2ltJyk7DQogI@cmV0dXJuICh0aGlzLm1hdGNoKG1hdGNoQWxsKSB8fCBbXSkubWFwKGZ1bmN0aW9uKHNjcmlwdFRhZykgew0KI*@cmV0dXJuIChzY3JpcHRUYWcubWF0Y2gobWF0Y2hPbmUpIHx8IFsnJywgJyddKVsxXTsNCiAgICB9KTsNCiAgfSwNCg0KICBldmFsU2NyaXB0czogZnVuY3Rpb24oKSB7DQogI@cmV0dXJuIHRoaXMuZXh0cmFjdFNjcmlwdHMoKS5tYXAoZXZhbCk7DQogIH0sDQoNCiAgZXNjYXBlSFRNTDogZnVuY3Rpb24oKSB7DQogI@dmFyIGRpdiA9IGRvY3VtZ!0LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KI*HZhciB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcyk7DQogI@ZGl2LmFwcGVuZENoaWxkKHRleHQpOw0KI*HJldHVybiBkaXYua!uZXJIVE1MOw0KICB9LA0KDQogIHVuZXNjYXBlSFRNTDogZnVuY3Rpb24oKSB7DQogI@dmFyIGRpdiA9IGRvY3VtZ!0LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KI*GRpdi5pbm5lckhUTUwgPSB0aGlzLnN0cmlwVGFncygpOw0KI*HJldHVybiBkaXYuY2hpbGROb2Rlc1swXSA/IGRpdi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZSA6ICcnOw0KICB9LA0KDQogIHRvUXVlcnlQYXJhbXM6IGZ1bmN0aW9uKCkgew0KI*HZhciBwYWlycyA9IHRoaXMubWF0Y2goL15cPz8oLiopJC8pWzFdLnNwbGl0KCcmJyk7DQogI@cmV0dXJuIHBhaXJzLmluamVjdCh7fSwgZnVuY3Rpb24ocGFyYW1zLCBwYWlyU3Rya!nKSB7DQogI*CB2YXIgcGFpciA9IHBhaXJTdHJpbmcuc3BsaXQoJz0nKTsNCiAgI*HBhcmFtc1twYWlyWzBdXSA9IHBhaXJbMV07DQogI*CByZXR1cm4gcGFyYW1zOw0KI*H0pOw0KICB9LA0KDQogIHRvQXJyYXk6IGZ1bmN0aW9uKCkgew0KI*HJldHVybiB0aGlzLnNwbGl0KCcnKTsNCiAgfSwNCg0KICBjYW1lbGl6ZTogZnVuY3Rpb24oKSB7DQogI@dmFyIG9TdHJpbmdMaXN0ID0gdGhpcy5zcGxpdCgnLScpOw0KI*GlmIChvU3Rya!nTGlzdC5sZ!ndGggPT0gMSkgcmV0dXJuIG9TdHJpbmdMaXN0WzBdOw0KDQogI@dmFyIGNhbWVsaXplZFN0cmluZyA9IHRoaXMua!kZXhPZignLScpID09IDANCiAgI*D8gb1N0cmluZ0xpc3RbMF0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBvU3Rya!nTGlzdFswXS5zdWJzdHJpbmcoMSkNCiAgI*Dogb1N0cmluZ0xpc3RbMF07DQoNCiAgICBmb3IgKHZhciBpID0gMSwgbGVuID0gb1N0cmluZ0xpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsNCiAgI*HZhciBzID0gb1N0cmluZ0xpc3RbaV07DQogI*CBjYW1lbGl6ZWRTdHJpbmcgKz0gcy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHMuc3Vic3Rya!nKDEpOw0KI*H0NCg0KI*HJldHVybiBjYW1lbGl6ZWRTdHJpbmc7DQogIH0sDQoNCiAga!zcGVjdDogZnVuY3Rpb24oKSB7DQogI@cmV0dXJuICInIiArIHRoaXMucmVwbGFjZSgnXFwnLCAnXFxcXCcpLnJlcGxhY2UoIiciLCAnXFxcJycpICsgIiciOw0KICB9DQp9KTsNCg0KU3Rya!nLnByb3RvdHlwZS5wYXJzZVF1ZXJ5ID0gU3Rya!nLnByb3RvdHlwZS50b1F1ZXJ5UGFyYW1zOw0KDQp2YXIgJGJyZWFrI*D0gbmV3IE9iamVjdCgpOw0KdmFyICRjb250a!1ZSA9IG5ldyBPYmplY3QoKTsNCg0KdmFyIEVudW1lcmFibGUgPSB7DQogIGVhY2g6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7DQogI@dmFyIGluZGV4ID0gMDsNCiAgICB0cnkgew0KI*@dGhpcy5fZWFjaChmd!jdGlvbih2YWx1ZSkgew0KI**CB0cnkgew0KI***Gl0ZXJhdG9yKHZhbHVlLCBpbmRleCsrKTsNCiAgI*@fSBjYXRjaCAoZSkgew0KI***GlmIChlICE9ICRjb250a!1ZSkgdGhyb3cgZTsNCiAgI*@fQ0KI*@fSk7DQogI@fSBjYXRjaCAoZSkgew0KI*@aWYgKGUgIT0gJGJyZWFrKSB0aHJvdyBlOw0KI*H0NCiAgfSwNCg0KICBhbGw6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7DQogI@dmFyIHJlc3VsdCA9IHRydWU7DQogI@dGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgew0KI*@cmVzdWx0ID0gcmVzdWx0ICYmICEhKGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5LKSh2YWx1ZSwga!kZXgpOw0KI*@aWYgKCFyZXN1bHQpIHRocm93ICRicmVhazsNCiAgICB9KTsNCiAgICByZXR1cm4gcmVzdWx0Ow0KICB9LA0KDQogIGFueTogZnVuY3Rpb24oaXRlcmF0b3IpIHsNCiAgICB2YXIgcmVzdWx0ID0gdHJ1ZTsNCiAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7DQogI*CBpZiAocmVzdWx0ID0gISEoaXRlcmF0b3IgfHwgUHJvdG90eXBlLkspKHZhbHVlLCBpbmRleCkpDQogI**HRocm93ICRicmVhazsNCiAgICB9KTsNCiAgICByZXR1cm4gcmVzdWx0Ow0KICB9LA0KDQogIGNvbGxlY3Q6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7DQogI@dmFyIHJlc3VsdHMgPSBbXTsNCiAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7DQogI*CByZXN1bHRzLnB1c2goaXRlcmF0b3IodmFsdWUsIGluZGV4KSk7DQogI@fSk7DQogI@cmV0dXJuIHJlc3VsdHM7DQogIH0sDQoNCiAgZGV0ZWN0OiBmd!jdGlvbiAoaXRlcmF0b3IpIHsNCiAgICB2YXIgcmVzdWx0Ow0KI*HRoaXMuZWFjaChmd!jdGlvbih2YWx1ZSwga!kZXgpIHsNCiAgI*GlmIChpdGVyYXRvcih2YWx1ZSwga!kZXgpKSB7DQogI**HJlc3VsdCA9IHZhbHVlOw0KI**CB0aHJvdyAkYnJlYWs7DQogI*CB9DQogI@fSk7DQogI@cmV0dXJuIHJlc3VsdDsNCiAgfSwNCg0KICBma!kQWxsOiBmd!jdGlvbihpdGVyYXRvcikgew0KI*HZhciByZXN1bHRzID0gW107DQogI@dGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgew0KI*@aWYgKGl0ZXJhdG9yKHZhbHVlLCBpbmRleCkpDQogI**HJlc3VsdHMucHVzaCh2YWx1ZSk7DQogI@fSk7DQogI@cmV0dXJuIHJlc3VsdHM7DQogIH0sDQoNCiAgZ3JlcDogZnVuY3Rpb24ocGF0dGVybiwgaXRlcmF0b3IpIHsNCiAgICB2YXIgcmVzdWx0cyA9IFtdOw0KI*HRoaXMuZWFjaChmd!jdGlvbih2YWx1ZSwga!kZXgpIHsNCiAgI*HZhciBzdHJpbmdWYWx1ZSA9IHZhbHVlLnRvU3Rya!nKCk7DQogI*CBpZiAoc3Rya!nVmFsdWUubWF0Y2gocGF0dGVybikpDQogI**HJlc3VsdHMucHVzaCgoaXRlcmF0b3IgfHwgUHJvdG90eXBlLkspKHZhbHVlLCBpbmRleCkpOw0KI*H0pDQogI@cmV0dXJuIHJlc3VsdHM7DQogIH0sDQoNCiAga!jbHVkZTogZnVuY3Rpb24ob2JqZWN0KSB7DQogI@dmFyIGZvd!kID0gZmFsc2U7DQogI@dGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlKSB7DQogI*CBpZiAodmFsdWUgPT0gb2JqZWN0KSB7DQogI**GZvd!kID0gdHJ1ZTsNCiAgI*@dGhyb3cgJGJyZWFrOw0KI*@fQ0KI*H0pOw0KI*HJldHVybiBmb3VuZDsNCiAgfSwNCg0KICBpbmplY3Q6IGZ1bmN0aW9uKG1lbW8sIGl0ZXJhdG9yKSB7DQogI@dGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgew0KI*@bWVtbyA9IGl0ZXJhdG9yKG1lbW8sIHZhbHVlLCBpbmRleCk7DQogI@fSk7DQogI@cmV0dXJuIG1lbW87DQogIH0sDQoNCiAga!2b2tlOiBmd!jdGlvbihtZXRob2QpIHsNCiAgICB2YXIgYXJncyA9ICRBKGFyZ3VtZ!0cykuc2xpY2UoMSk7DQogI@cmV0dXJuIHRoaXMuY29sbGVjdChmd!jdGlvbih2YWx1ZSkgew0KI*@cmV0dXJuIHZhbHVlW21ldGhvZF0uYXBwbHkodmFsdWUsIGFyZ3MpOw0KI*H0pOw0KICB9LA0KDQogIG1heDogZnVuY3Rpb24oaXRlcmF0b3IpIHsNCiAgICB2YXIgcmVzdWx0Ow0KI*HRoaXMuZWFjaChmd!jdGlvbih2YWx1ZSwga!kZXgpIHsNCiAgI*HZhbHVlID0gKGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5LKSh2YWx1ZSwga!kZXgpOw0KI*@aWYgKHZhbHVlID49IChyZXN1bHQgfHwgdmFsdWUpKQ0KI**CByZXN1bHQgPSB2YWx1ZTsNCiAgICB9KTsNCiAgICByZXR1cm4gcmVzdWx0Ow0KICB9LA0KDQogIG1pbjogZnVuY3Rpb24oaXRlcmF0b3IpIHsNCiAgICB2YXIgcmVzdWx0Ow0KI*HRoaXMuZWFjaChmd!jdGlvbih2YWx1ZSwga!kZXgpIHsNCiAgI*HZhbHVlID0gKGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5LKSh2YWx1ZSwga!kZXgpOw0KI*@aWYgKHZhbHVlIDw9IChyZXN1bHQgfHwgdmFsdWUpKQ0KI**CByZXN1bHQgPSB2YWx1ZTsNCiAgICB9KTsNCiAgICByZXR1cm4gcmVzdWx0Ow0KICB9LA0KDQogIHBhcnRpdGlvbjogZnVuY3Rpb24oaXRlcmF0b3IpIHsNCiAgICB2YXIgdHJ1ZXMgPSBbXSwgZmFsc2VzID0gW107DQogI@dGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgew0KI*@KChpdGVyYXRvciB8fCBQcm90b3R5cGUuSykodmFsdWUsIGluZGV4KSA/DQogI**HRydWVzIDogZmFsc2VzKS5wdXNoKHZhbHVlKTsNCiAgICB9KTsNCiAgICByZXR1cm4gW3RydWVzLCBmYWxzZXNdOw0KICB9LA0KDQogIHBsdWNrOiBmd!jdGlvbihwcm9wZXJ0eSkgew0KI*HZhciByZXN1bHRzID0gW107DQogI@dGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgew0KI*@cmVzdWx0cy5wdXNoKHZhbHVlW3Byb3BlcnR5XSk7DQogI@fSk7DQogI@cmV0dXJuIHJlc3VsdHM7DQogIH0sDQoNCiAgcmVqZWN0OiBmd!jdGlvbihpdGVyYXRvcikgew0KI*HZhciByZXN1bHRzID0gW107DQogI@dGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgew0KI*@aWYgKCFpdGVyYXRvcih2YWx1ZSwga!kZXgpKQ0KI**CByZXN1bHRzLnB1c2godmFsdWUpOw0KI*H0pOw0KI*HJldHVybiByZXN1bHRzOw0KICB9LA0KDQogIHNvcnRCeTogZnVuY3Rpb24oaXRlcmF0b3IpIHsNCiAgICByZXR1cm4gdGhpcy5jb2xsZWN0KGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgew0KI*@cmV0dXJuIHt2YWx1ZTogdmFsdWUsIGNyaXRlcmlhOiBpdGVyYXRvcih2YWx1ZSwga!kZXgpfTsNCiAgICB9KS5zb3J0KGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7DQogI*CB2YXIgYSA9IGxlZnQuY3JpdGVyaWEsIGIgPSByaWdodC5jcml0ZXJpYTsNCiAgI*HJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDsNCiAgICB9KS5wbHVjaygndmFsdWUnKTsNCiAgfSwNCg0KICB0b0FycmF5OiBmd!jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy5jb2xsZWN0KFByb3RvdHlwZS5LKTsNCiAgfSwNCg0KICB6aXA6IGZ1bmN0aW9uKCkgew0KI*HZhciBpdGVyYXRvciA9IFByb3RvdHlwZS5LLCBhcmdzID0gJEEoYXJndW1lbnRzKTsNCiAgICBpZiAodHlwZW9mIGFyZ3MubGFzdCgpID09ICdmd!jdGlvbicpDQogI*CBpdGVyYXRvciA9IGFyZ3MucG9wKCk7DQoNCiAgICB2YXIgY29sbGVjdGlvbnMgPSBbdGhpc10uY29uY2F0KGFyZ3MpLm1hcCgkQSk7DQogI@cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgew0KI*@aXRlcmF0b3IodmFsdWUgPSBjb2xsZWN0aW9ucy5wbHVjayhpbmRleCkpOw0KI*@cmV0dXJuIHZhbHVlOw0KI*H0pOw0KICB9LA0KDQogIGluc3BlY3Q6IGZ1bmN0aW9uKCkgew0KI*HJldHVybiAnIzxFbnVtZXJhYmxlOicgKyB0aGlzLnRvQXJyYXkoKS5pbnNwZWN0KCkgKyAnPic7DQogIH0NCn0NCg0KT2JqZWN0LmV4dGVuZChFbnVtZXJhYmxlLCB7DQogIG1hcDogI*EVudW1lcmFibGUuY29sbGVjdCwNCiAgZmluZDogI@R!1bWVyYWJsZS5kZXRlY3QsDQogIHNlbGVjdDogIEVudW1lcmFibGUuZmluZEFsbCwNCiAgbWVtYmVyOiAgR!1bWVyYWJsZS5pbmNsdWRlLA0KICBlbnRyaWVzOiBFbnVtZXJhYmxlLnRvQXJyYXkNCn0pOw0KdmFyICRBID0gQXJyYXkuZnJvbSA9IGZ1bmN0aW9uKGl0ZXJhYmxlKSB7DQogIGlmICghaXRlcmFibGUpIHJldHVybiBbXTsNCiAgaWYgKGl0ZXJhYmxlLnRvQXJyYXkpIHsNCiAgICByZXR1cm4gaXRlcmFibGUudG9BcnJheSgpOw0KICB9IGVsc2Ugew0KI*HZhciByZXN1bHRzID0gW107DQogI@Zm9yICh2YXIgaSA9IDA7IGkgPCBpdGVyYWJsZS5sZ!ndGg7IGkrKykNCiAgI*HJlc3VsdHMucHVzaChpdGVyYWJsZVtpXSk7DQogI@cmV0dXJuIHJlc3VsdHM7DQogIH0NCn0NCg0KT2JqZWN0LmV4dGVuZChBcnJheS5wcm90b3R5cGUsIEVudW1lcmFibGUpOw0KDQpBcnJheS5wcm90b3R5cGUuX3JldmVyc2UgPSBBcnJheS5wcm90b3R5cGUucmV2ZXJzZTsNCg0KT2JqZWN0LmV4dGVuZChBcnJheS5wcm90b3R5cGUsIHsNCiAgX2VhY2g6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7DQogI@Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKQ0KI*@aXRlcmF0b3IodGhpc1tpXSk7DQogIH0sDQoNCiAgY2xlYXI6IGZ1bmN0aW9uKCkgew0KI*HRoaXMubGVuZ3RoID0gMDsNCiAgICByZXR1cm4gdGhpczsNCiAgfSwNCg0KICBmaXJzdDogZnVuY3Rpb24oKSB7DQogI@cmV0dXJuIHRoaXNbMF07DQogIH0sDQoNCiAgbGFzdDogZnVuY3Rpb24oKSB7DQogI@cmV0dXJuIHRoaXNbdGhpcy5sZ!ndGggLSAxXTsNCiAgfSwNCg0KICBjb21wYWN0OiBmd!jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24odmFsdWUpIHsNCiAgI*HJldHVybiB2YWx1ZSAhPSB1bmRlZmluZWQgfHwgdmFsdWUgIT0gbnVsbDsNCiAgICB9KTsNCiAgfSwNCg0KICBmbGF0dGVuOiBmd!jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy5pbmplY3QoW10sIGZ1bmN0aW9uKGFycmF5LCB2YWx1ZSkgew0KI*@cmV0dXJuIGFycmF5LmNvbmNhdCh2YWx1ZS5jb25zdHJ1Y3RvciA9PSBBcnJheSA/DQogI**HZhbHVlLmZsYXR0ZW4oKSA6IFt2YWx1ZV0pOw0KI*H0pOw0KICB9LA0KDQogIHdpdGhvdXQ6IGZ1bmN0aW9uKCkgew0KI*HZhciB2YWx1ZXMgPSAkQShhcmd1bWVudHMpOw0KI*HJldHVybiB0aGlzLnNlbGVjdChmd!jdGlvbih2YWx1ZSkgew0KI*@cmV0dXJuICF2YWx1ZXMua!jbHVkZSh2YWx1ZSk7DQogI@fSk7DQogIH0sDQoNCiAga!kZXhPZjogZnVuY3Rpb24ob2JqZWN0KSB7DQogI@Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKQ0KI*@aWYgKHRoaXNbaV0gPT0gb2JqZWN0KSByZXR1cm4gaTsNCiAgICByZXR1cm4gLTE7DQogIH0sDQoNCiAgcmV2ZXJzZTogZnVuY3Rpb24oa!sa!lKSB7DQogI@cmV0dXJuIChpbmxpbmUgIT09IGZhbHNlID8gdGhpcyA6IHRoaXMudG9BcnJheSgpKS5fcmV2ZXJzZSgpOw0KICB9LA0KDQogIHNoaWZ0OiBmd!jdGlvbigpIHsNCiAgICB2YXIgcmVzdWx0ID0gdGhpc1swXTsNCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoIC0gMTsgaSsrKQ0KI*@dGhpc1tpXSA9IHRoaXNbaSArIDFdOw0KI*HRoaXMubGVuZ3RoLS07DQogI@cmV0dXJuIHJlc3VsdDsNCiAgfSwNCg0KICBpbnNwZWN0OiBmd!jdGlvbigpIHsNCiAgICByZXR1cm4gJ1snICsgdGhpcy5tYXAoT2JqZWN0Lmluc3BlY3QpLmpvaW4oJywgJykgKyAnXSc7DQogIH0NCn0pOw0KdmFyIEhhc2ggPSB7DQogIF9lYWNoOiBmd!jdGlvbihpdGVyYXRvcikgew0KI*GZvciAoa2V5IGluIHRoaXMpIHsNCiAgI*HZhciB2YWx1ZSA9IHRoaXNba2V5XTsNCiAgI*GlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykgY29udGludWU7DQoNCiAgI*HZhciBwYWlyID0gW2tleSwgdmFsdWVdOw0KI*@cGFpci5rZXkgPSBrZXk7DQogI*CBwYWlyLnZhbHVlID0gdmFsdWU7DQogI*CBpdGVyYXRvcihwYWlyKTsNCiAgICB9DQogIH0sDQoNCiAga2V5czogZnVuY3Rpb24oKSB7DQogI@cmV0dXJuIHRoaXMucGx1Y2soJ2tleScpOw0KICB9LA0KDQogIHZhbHVlczogZnVuY3Rpb24oKSB7DQogI@cmV0dXJuIHRoaXMucGx1Y2soJ3ZhbHVlJyk7DQogIH0sDQoNCiAgbWVyZ2U6IGZ1bmN0aW9uKGhhc2gpIHsNCiAgICByZXR1cm4gJEgoaGFzaCkua!qZWN0KCRIKHRoaXMpLCBmd!jdGlvbihtZXJnZWRIYXNoLCBwYWlyKSB7DQogI*CBtZXJnZWRIYXNoW3BhaXIua2V5XSA9IHBhaXIudmFsdWU7DQogI*CByZXR1cm4gbWVyZ2VkSGFzaDsNCiAgICB9KTsNCiAgfSwNCg0KICB0b1F1ZXJ5U3Rya!nOiBmd!jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24ocGFpcikgew0KI*@cmV0dXJuIHBhaXIubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbignPScpOw0KI*H0pLmpvaW4oJyYnKTsNCiAgfSwNCg0KICBpbnNwZWN0OiBmd!jdGlvbigpIHsNCiAgICByZXR1cm4gJyM8SGFzaDp7JyArIHRoaXMubWFwKGZ1bmN0aW9uKHBhaXIpIHsNCiAgI*HJldHVybiBwYWlyLm1hcChPYmplY3Qua!zcGVjdCkuam9pbignOiAnKTsNCiAgICB9KS5qb2luKCcsICcpICsgJ30+JzsNCiAgfQ0KfQ0KDQpmd!jdGlvbiAkSChvYmplY3QpIHsNCiAgdmFyIGhhc2ggPSBPYmplY3QuZXh0Z!kKHt9LCBvYmplY3QgfHwge30pOw0KICBPYmplY3QuZXh0Z!kKGhhc2gsIEVudW1lcmFibGUpOw0KICBPYmplY3QuZXh0Z!kKGhhc2gsIEhhc2gpOw0KICByZXR1cm4gaGFzaDsNCn0NCk9iamVjdFJhbmdlID0gQ2xhc3MuY3JlYXRlKCk7DQpPYmplY3QuZXh0Z!kKE9iamVjdFJhbmdlLnByb3RvdHlwZSwgR!1bWVyYWJsZSk7DQpPYmplY3QuZXh0Z!kKE9iamVjdFJhbmdlLnByb3RvdHlwZSwgew0KICBpbml0aWFsaXplOiBmd!jdGlvbihzdGFydCwgZ!kLCBleGNsdXNpdmUpIHsNCiAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7DQogI@dGhpcy5lbmQgPSBlbmQ7DQogI@dGhpcy5leGNsdXNpdmUgPSBleGNsdXNpdmU7DQogIH0sDQoNCiAgX2VhY2g6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7DQogI@dmFyIHZhbHVlID0gdGhpcy5zdGFydDsNCiAgICBkbyB7DQogI*CBpdGVyYXRvcih2YWx1ZSk7DQogI*CB2YWx1ZSA9IHZhbHVlLnN1Y2MoKTsNCiAgICB9IHdoaWxlICh0aGlzLmluY2x1ZGUodmFsdWUpKTsNCiAgfSwNCg0KICBpbmNsdWRlOiBmd!jdGlvbih2YWx1ZSkgew0KI*GlmICh2YWx1ZSA8IHRoaXMuc3RhcnQpDQogI*CByZXR1cm4gZmFsc2U7DQogI@aWYgKHRoaXMuZXhjbHVzaXZlKQ0KI*@cmV0dXJuIHZhbHVlIDwgdGhpcy5lbmQ7DQogI@cmV0dXJuIHZhbHVlIDw9IHRoaXMuZ!kOw0KICB9DQp9KTsNCg0KdmFyICRSID0gZnVuY3Rpb24oc3RhcnQsIGVuZCwgZXhjbHVzaXZlKSB7DQogIHJldHVybiBuZXcgT2JqZWN0UmFuZ2Uoc3RhcnQsIGVuZCwgZXhjbHVzaXZlKTsNCn0NCg0KdmFyIEFqYXggPSB7DQogIGdldFRyY!zcG9ydDogZnVuY3Rpb24oKSB7DQogI@cmV0dXJuIFRyeS50aGVzZSgNCiAgI*GZ1bmN0aW9uKCkge3JldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTXN4bWwyLlhNTEhUVFAnKX0sDQogI*CBmd!jdGlvbigpIHtyZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01pY3Jvc29mdC5YTUxIVFRQJyl9LA0KI*@ZnVuY3Rpb24oKSB7cmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpfQ0KI*CkgfHwgZmFsc2U7DQogIH0sDQoNCiAgYWN0aXZlUmVxdWVzdENvd!0OiAwDQp9DQoNCkFqYXguUmVzcG9uZGVycyA9IHsNCiAgcmVzcG9uZGVyczogW10sDQoNCiAgX2VhY2g6IGZ1bmN0aW9uKGl0ZXJhdG9yKSB7DQogI@dGhpcy5yZXNwb25kZXJzLl9lYWNoKGl0ZXJhdG9yKTsNCiAgfSwNCg0KICByZWdpc3RlcjogZnVuY3Rpb24ocmVzcG9uZGVyVG9BZGQpIHsNCiAgICBpZiAoIXRoaXMua!jbHVkZShyZXNwb25kZXJUb0FkZCkpDQogI*CB0aGlzLnJlc3BvbmRlcnMucHVzaChyZXNwb25kZXJUb0FkZCk7DQogIH0sDQoNCiAgd!yZWdpc3RlcjogZnVuY3Rpb24ocmVzcG9uZGVyVG9SZW1vdmUpIHsNCiAgICB0aGlzLnJlc3BvbmRlcnMgPSB0aGlzLnJlc3BvbmRlcnMud2l0aG91dChyZXNwb25kZXJUb1JlbW92ZSk7DQogIH0sDQoNCiAgZGlzcGF0Y2g6IGZ1bmN0aW9uKGNhbGxiYWNrLCByZXF1ZXN0LCB0cmFuc3BvcnQsIGpzb24pIHsNCiAgICB0aGlzLmVhY2goZnVuY3Rpb24ocmVzcG9uZGVyKSB7DQogI*CBpZiAocmVzcG9uZGVyW2NhbGxiYWNrXSAmJiB0eXBlb2YgcmVzcG9uZGVyW2NhbGxiYWNrXSA9PSAnZnVuY3Rpb24nKSB7DQogI**HRyeSB7DQogI**@cmVzcG9uZGVyW2NhbGxiYWNrXS5hcHBseShyZXNwb25kZXIsIFtyZXF1ZXN0LCB0cmFuc3BvcnQsIGpzb25dKTsNCiAgI*@fSBjYXRjaCAoZSkge30NCiAgI*H0NCiAgICB9KTsNCiAgfQ0KfTsNCg0KT2JqZWN0LmV4dGVuZChBamF4LlJlc3BvbmRlcnMsIEVudW1lcmFibGUpOw0KDQpBamF4LlJlc3BvbmRlcnMucmVnaXN0ZXIoew0KICBvbkNyZWF0ZTogZnVuY3Rpb24oKSB7DQogI@QWpheC5hY3RpdmVSZXF1ZXN0Q291bnQrKzsNCiAgfSwNCg0KICBvbkNvbXBsZXRlOiBmd!jdGlvbigpIHsNCiAgICBBamF4LmFjdGl2ZVJlcXVlc3RDb3VudC0tOw0KICB9DQp9KTsNCg0KQWpheC5CYXNlID0gZnVuY3Rpb24oKSB7fTsNCkFqYXguQmFzZS5wcm90b3R5cGUgPSB7DQogIHNldE9wdGlvbnM6IGZ1bmN0aW9uKG9wdGlvbnMpIHsNCiAgICB0aGlzLm9wdGlvbnMgPSB7DQogI*CBtZXRob2Q6I**Cdwb3N0JywNCiAgI*GFze!jaHJvbm91czogdHJ1ZSwNCiAgI*HBhcmFtZXRlcnM6I@JycNCiAgICB9DQogI@T2JqZWN0LmV4dGVuZCh0aGlzLm9wdGlvbnMsIG9wdGlvbnMgfHwge30pOw0KICB9LA0KDQogIHJlc3BvbnNlSXNTdWNjZXNzOiBmd!jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQuc3RhdHVzID09IHVuZGVma!lZA0KI**CB8fCB0aGlzLnRyY!zcG9ydC5zdGF0dXMgPT0gMA0KI**CB8fCAodGhpcy50cmFuc3BvcnQuc3RhdHVzID49IDIwMCAmJiB0aGlzLnRyY!zcG9ydC5zdGF0dXMgPCAzMDApOw0KICB9LA0KDQogIHJlc3BvbnNlSXNGYWlsdXJlOiBmd!jdGlvbigpIHsNCiAgICByZXR1cm4gIXRoaXMucmVzcG9uc2VJc1N1Y2Nlc3MoKTsNCiAgfQ0KfQ0KDQpBamF4LlJlcXVlc3QgPSBDbGFzcy5jcmVhdGUoKTsNCkFqYXguUmVxdWVzdC5FdmVudHMgPQ0KICBbJ1Vua!pdGlhbGl6ZWQnLCAnTG9hZGluZycsICdMb2FkZWQnLCAnS!0ZXJhY3RpdmUnLCAnQ29tcGxldGUnXTsNCg0KQWpheC5SZXF1ZXN0LnByb3RvdHlwZSA9IE9iamVjdC5leHRlbmQobmV3IEFqYXguQmFzZSgpLCB7DQogIGluaXRpYWxpemU6IGZ1bmN0aW9uKHVybCwgb3B0aW9ucykgew0KI*HRoaXMudHJhbnNwb3J0ID0gQWpheC5nZXRUcmFuc3BvcnQoKTsNCiAgICB0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7DQogI@dGhpcy5yZXF1ZXN0KHVybCk7DQogIH0sDQoNCiAgcmVxdWVzdDogZnVuY3Rpb24odXJsKSB7DQogI@dmFyIHBhcmFtZXRlcnMgPSB0aGlzLm9wdGlvbnMucGFyYW1ldGVycyB8fCAnJzsNCiAgICBpZiAocGFyYW1ldGVycy5sZ!ndGggPiAwKSBwYXJhbWV0ZXJzICs9ICcmXz0nOw0KDQogI@dHJ5IHsNCiAgI*HRoaXMudXJsID0gdXJsOw0KI*@aWYgKHRoaXMub3B0aW9ucy5tZXRob2QgPT0gJ2dldCcgJiYgcGFyYW1ldGVycy5sZ!ndGggPiAwKQ0KI**CB0aGlzLnVybCArPSAodGhpcy51cmwubWF0Y2goL1w/LykgPyAnJicgOiAnPycpICsgcGFyYW1ldGVyczsNCg0KI*@QWpheC5SZXNwb25kZXJzLmRpc3BhdGNoKCdvbkNyZWF0ZScsIHRoaXMsIHRoaXMudHJhbnNwb3J0KTsNCg0KI*@dGhpcy50cmFuc3BvcnQub3Blbih0aGlzLm9wdGlvbnMubWV0aG9kLCB0aGlzLnVybCwNCiAgI*@dGhpcy5vcHRpb25zLmFze!jaHJvbm91cyk7DQoNCiAgI*GlmICh0aGlzLm9wdGlvbnMuYXN5bmNocm9ub3VzKSB7DQogI**HRoaXMudHJhbnNwb3J0Lm9ucmVhZHlzdGF0ZWNoY!nZSA9IHRoaXMub25TdGF0ZUNoY!nZS5ia!kKHRoaXMpOw0KI**CBzZXRUaW1lb3V0KChmd!jdGlvbigpIHt0aGlzLnJlc3BvbmRUb1JlYWR5U3RhdGUoMSl9KS5ia!kKHRoaXMpLCAxMCk7DQogI*CB9DQoNCiAgI*HRoaXMuc2V0UmVxdWVzdEhlYWRlcnMoKTsNCg0KI*@dmFyIGJvZHkgPSB0aGlzLm9wdGlvbnMucG9zdEJvZHkgPyB0aGlzLm9wdGlvbnMucG9zdEJvZHkgOiBwYXJhbWV0ZXJzOw0KI*@dGhpcy50cmFuc3BvcnQuc2VuZCh0aGlzLm9wdGlvbnMubWV0aG9kID09ICdwb3N0JyA/IGJvZHkgOiBudWxsKTsNCg0KI*H0gY2F0Y2ggKGUpIHsNCiAgI*HRoaXMuZGlzcGF0Y2hFeGNlcHRpb24oZSk7DQogI@fQ0KICB9LA0KDQogIHNldFJlcXVlc3RIZWFkZXJzOiBmd!jdGlvbigpIHsNCiAgICB2YXIgcmVxdWVzdEhlYWRlcnMgPQ0KI*@WydYLVJlcXVlc3RlZC1XaXRoJywgJ1hNTEh0dHBSZXF1ZXN0JywNCiAgI*CAnWC1Qcm90b3R5cGUtVmVyc2lvbicsIFByb3RvdHlwZS5WZXJzaW9uXTsNCg0KI*GlmICh0aGlzLm9wdGlvbnMubWV0aG9kID09ICdwb3N0Jykgew0KI*@cmVxdWVzdEhlYWRlcnMucHVzaCgnQ29udGVudC10eXBlJywNCiAgI*@J2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZ!jb2RlZCcpOw0KDQogI*CAvKiBGb3JjZSAiQ29ubmVjdGlvbjogY2xvc2UiIGZvciBNb3ppbGxhIGJyb3dzZXJzIHRvIHdvcmsgYXJvd!kDQogI*@KiBhIGJ1ZyB3aGVyZSBYTUxIdHRwUmVxZXVlc3Qgc2VuZHMgYW4ga!jb3JyZWN0IENvbnRlbnQtbGVuZ3RoDQogI*@KiBoZWFkZXIuIFNlZSBNb3ppbGxhIEJ1Z3ppbGxhICMyNDY2NTEuDQogI*@Ki8NCiAgI*GlmICh0aGlzLnRyY!zcG9ydC5vdmVycmlkZU1pbWVUeXBlKQ0KI**CByZXF1ZXN0SGVhZGVycy5wdXNoKCdDb25uZWN0aW9uJywgJ2Nsb3NlJyk7DQogI@fQ0KDQogI@aWYgKHRoaXMub3B0aW9ucy5yZXF1ZXN0SGVhZGVycykNCiAgI*HJlcXVlc3RIZWFkZXJzLnB1c2guYXBwbHkocmVxdWVzdEhlYWRlcnMsIHRoaXMub3B0aW9ucy5yZXF1ZXN0SGVhZGVycyk7DQoNCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcXVlc3RIZWFkZXJzLmxlbmd0aDsgaSArPSAyKQ0KI*@dGhpcy50cmFuc3BvcnQuc2V0UmVxdWVzdEhlYWRlcihyZXF1ZXN0SGVhZGVyc1tpXSwgcmVxdWVzdEhlYWRlcnNbaSsxXSk7DQogIH0sDQoNCiAgb25TdGF0ZUNoY!nZTogZnVuY3Rpb24oKSB7DQogI@dmFyIHJlYWR5U3RhdGUgPSB0aGlzLnRyY!zcG9ydC5yZWFkeVN0YXRlOw0KI*GlmIChyZWFkeVN0YXRlICE9IDEpDQogI*CB0aGlzLnJlc3BvbmRUb1JlYWR5U3RhdGUodGhpcy50cmFuc3BvcnQucmVhZHlTdGF0ZSk7DQogIH0sDQoNCiAgaGVhZGVyOiBmd!jdGlvbihuYW1lKSB7DQogI@dHJ5IHsNCiAgI*HJldHVybiB0aGlzLnRyY!zcG9ydC5nZXRSZXNwb25zZUhlYWRlcihuYW1lKTsNCiAgICB9IGNhdGNoIChlKSB7fQ0KICB9LA0KDQogIGV2YWxKU09OOiBmd!jdGlvbigpIHsNCiAgICB0cnkgew0KI*@cmV0dXJuIGV2YWwodGhpcy5oZWFkZXIoJ1gtSlNPTicpKTsNCiAgICB9IGNhdGNoIChlKSB7fQ0KICB9LA0KDQogIGV2YWxSZXNwb25zZTogZnVuY3Rpb24oKSB7DQogI@dHJ5IHsNCiAgI*HJldHVybiBldmFsKHRoaXMudHJhbnNwb3J0LnJlc3BvbnNlVGV4dCk7DQogI@fSBjYXRjaCAoZSkgew0KI*@dGhpcy5kaXNwYXRjaEV4Y2VwdGlvbihlKTsNCiAgICB9DQogIH0sDQoNCiAgcmVzcG9uZFRvUmVhZHlTdGF0ZTogZnVuY3Rpb24ocmVhZHlTdGF0ZSkgew0KI*HZhciBldmVudCA9IEFqYXguUmVxdWVzdC5FdmVudHNbcmVhZHlTdGF0ZV07DQogI@dmFyIHRyY!zcG9ydCA9IHRoaXMudHJhbnNwb3J0LCBqc29uID0gdGhpcy5ldmFsSlNPTigpOw0KDQogI@aWYgKGV2Z!0ID09ICdDb21wbGV0ZScpIHsNCiAgI*HRyeSB7DQogI**Ch0aGlzLm9wdGlvbnNbJ29uJyArIHRoaXMudHJhbnNwb3J0LnN0YXR1c10NCiAgI**Hx8IHRoaXMub3B0aW9uc1snb24nICsgKHRoaXMucmVzcG9uc2VJc1N1Y2Nlc3MoKSA/ICdTdWNjZXNzJyA6ICdGYWlsdXJlJyldDQogI**CB8fCBQcm90b3R5cGUuZW1wdHlGd!jdGlvbikodHJhbnNwb3J0LCBqc29uKTsNCiAgI*H0gY2F0Y2ggKGUpIHsNCiAgI*@dGhpcy5kaXNwYXRjaEV4Y2VwdGlvbihlKTsNCiAgI*H0NCg0KI*@aWYgKCh0aGlzLmhlYWRlcignQ29udGVudC10eXBlJykgfHwgJycpLm1hdGNoKC9edGV4dFwvamF2YXNjcmlwdC9pKSkNCiAgI*@dGhpcy5ldmFsUmVzcG9uc2UoKTsNCiAgICB9DQoNCiAgICB0cnkgew0KI*@KHRoaXMub3B0aW9uc1snb24nICsgZXZlbnRdIHx8IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uKSh0cmFuc3BvcnQsIGpzb24pOw0KI*@QWpheC5SZXNwb25kZXJzLmRpc3BhdGNoKCdvbicgKyBldmVudCwgdGhpcywgdHJhbnNwb3J0LCBqc29uKTsNCiAgICB9IGNhdGNoIChlKSB7DQogI*CB0aGlzLmRpc3BhdGNoRXhjZXB0aW9uKGUpOw0KI*H0NCg0KI*C8qIEF2b2lkIG1lbW9yeSBsZWFrIGluIE1TSUU6IGNsZWFuIHVwIHRoZSBvbmNvbXBsZXRlIGV2Z!0IGhhbmRsZXIgKi8NCiAgICBpZiAoZXZlbnQgPT0gJ0NvbXBsZXRlJykNCiAgI*HRoaXMudHJhbnNwb3J0Lm9ucmVhZHlzdGF0ZWNoY!nZSA9IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uOw0KICB9LA0KDQogIGRpc3BhdGNoRXhjZXB0aW9uOiBmd!jdGlvbihleGNlcHRpb24pIHsNCiAgICAodGhpcy5vcHRpb25zLm9uRXhjZXB0aW9uIHx8IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uKSh0aGlzLCBleGNlcHRpb24pOw0KI*EFqYXguUmVzcG9uZGVycy5kaXNwYXRjaCgnb25FeGNlcHRpb24nLCB0aGlzLCBleGNlcHRpb24pOw0KICB9DQp9KTsNCg0KQWpheC5VcGRhdGVyID0gQ2xhc3MuY3JlYXRlKCk7DQoNCk9iamVjdC5leHRlbmQoT2JqZWN0LmV4dGVuZChBamF4LlVwZGF0ZXIucHJvdG90eXBlLCBBamF4LlJlcXVlc3QucHJvdG90eXBlKSwgew0KICBpbml0aWFsaXplOiBmd!jdGlvbihjb250YWluZXIsIHVybCwgb3B0aW9ucykgew0KI*HRoaXMuY29udGFpbmVycyA9IHsNCiAgI*HN1Y2Nlc3M6IGNvbnRha!lci5zdWNjZXNzID8gJChjb250YWluZXIuc3VjY2VzcykgOiAkKGNvbnRha!lciksDQogI*CBmYWlsdXJlOiBjb250YWluZXIuZmFpbHVyZSA/ICQoY29udGFpbmVyLmZhaWx1cmUpIDoNCiAgI*@KGNvbnRha!lci5zdWNjZXNzID8gbnVsbCA6ICQoY29udGFpbmVyKSkNCiAgICB9DQoNCiAgICB0aGlzLnRyY!zcG9ydCA9IEFqYXguZ2V0VHJhbnNwb3J0KCk7DQogI@dGhpcy5zZXRPcHRpb25zKG9wdGlvbnMpOw0KDQogI@dmFyIG9uQ29tcGxldGUgPSB0aGlzLm9wdGlvbnMub25Db21wbGV0ZSB8fCBQcm90b3R5cGUuZW1wdHlGd!jdGlvbjsNCiAgICB0aGlzLm9wdGlvbnMub25Db21wbGV0ZSA9IChmd!jdGlvbih0cmFuc3BvcnQsIG9iamVjdCkgew0KI*@dGhpcy51cGRhdGVDb250Z!0KCk7DQogI*CBvbkNvbXBsZXRlKHRyY!zcG9ydCwgb2JqZWN0KTsNCiAgICB9KS5ia!kKHRoaXMpOw0KDQogI@dGhpcy5yZXF1ZXN0KHVybCk7DQogIH0sDQoNCiAgdXBkYXRlQ29udGVudDogZnVuY3Rpb24oKSB7DQogI@dmFyIHJlY2VpdmVyID0gdGhpcy5yZXNwb25zZUlzU3VjY2VzcygpID8NCiAgI*HRoaXMuY29udGFpbmVycy5zdWNjZXNzIDogdGhpcy5jb250YWluZXJzLmZhaWx1cmU7DQogI@dmFyIHJlc3BvbnNlID0gdGhpcy50cmFuc3BvcnQucmVzcG9uc2VUZXh0Ow0KDQogI@aWYgKCF0aGlzLm9wdGlvbnMuZXZhbFNjcmlwdHMpDQogI*CByZXNwb25zZSA9IHJlc3BvbnNlLnN0cmlwU2NyaXB0cygpOw0KDQogI@aWYgKHJlY2VpdmVyKSB7DQogI*CBpZiAodGhpcy5vcHRpb25zLmluc2VydGlvbikgew0KI**CBuZXcgdGhpcy5vcHRpb25zLmluc2VydGlvbihyZWNlaXZlciwgcmVzcG9uc2UpOw0KI*@fSBlbHNlIHsNCiAgI*@RWxlbWVudC51cGRhdGUocmVjZWl2ZXIsIHJlc3BvbnNlKTsNCiAgI*H0NCiAgICB9DQoNCiAgICBpZiAodGhpcy5yZXNwb25zZUlzU3VjY2VzcygpKSB7DQogI*CBpZiAodGhpcy5vbkNvbXBsZXRlKQ0KI**CBzZXRUaW1lb3V0KHRoaXMub25Db21wbGV0ZS5ia!kKHRoaXMpLCAxMCk7DQogI@fQ0KICB9DQp9KTsNCg0KQWpheC5QZXJpb2RpY2FsVXBkYXRlciA9IENsYXNzLmNyZWF0ZSgpOw0KQWpheC5QZXJpb2RpY2FsVXBkYXRlci5wcm90b3R5cGUgPSBPYmplY3QuZXh0Z!kKG5ldyBBamF4LkJhc2UoKSwgew0KICBpbml0aWFsaXplOiBmd!jdGlvbihjb250YWluZXIsIHVybCwgb3B0aW9ucykgew0KI*HRoaXMuc2V0T3B0aW9ucyhvcHRpb25zKTsNCiAgICB0aGlzLm9uQ29tcGxldGUgPSB0aGlzLm9wdGlvbnMub25Db21wbGV0ZTsNCg0KI*HRoaXMuZnJlcXVlbmN5ID0gKHRoaXMub3B0aW9ucy5mcmVxdWVuY3kgfHwgMik7DQogI@dGhpcy5kZWNheSA9ICh0aGlzLm9wdGlvbnMuZGVjYXkgfHwgMSk7DQoNCiAgICB0aGlzLnVwZGF0ZXIgPSB7fTsNCiAgICB0aGlzLmNvbnRha!lciA9IGNvbnRha!lcjsNCiAgICB0aGlzLnVybCA9IHVybDsNCg0KI*HRoaXMuc3RhcnQoKTsNCiAgfSwNCg0KICBzdGFydDogZnVuY3Rpb24oKSB7DQogI@dGhpcy5vcHRpb25zLm9uQ29tcGxldGUgPSB0aGlzLnVwZGF0ZUNvbXBsZXRlLmJpbmQodGhpcyk7DQogI@dGhpcy5vblRpbWVyRXZlbnQoKTsNCiAgfSwNCg0KICBzdG9wOiBmd!jdGlvbigpIHsNCiAgICB0aGlzLnVwZGF0ZXIub25Db21wbGV0ZSA9IHVuZGVma!lZDsNCiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7DQogI@KHRoaXMub25Db21wbGV0ZSB8fCBQcm90b3R5cGUuZW1wdHlGd!jdGlvbikuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgfSwNCg0KICB1cGRhdGVDb21wbGV0ZTogZnVuY3Rpb24ocmVxdWVzdCkgew0KI*GlmICh0aGlzLm9wdGlvbnMuZGVjYXkpIHsNCiAgI*HRoaXMuZGVjYXkgPSAocmVxdWVzdC5yZXNwb25zZVRleHQgPT0gdGhpcy5sYXN0VGV4dCA/DQogI**HRoaXMuZGVjYXkgKiB0aGlzLm9wdGlvbnMuZGVjYXkgOiAxKTsNCg0KI*@dGhpcy5sYXN0VGV4dCA9IHJlcXVlc3QucmVzcG9uc2VUZXh0Ow0KI*H0NCiAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCh0aGlzLm9uVGltZXJFdmVudC5ia!kKHRoaXMpLA0KI*@dGhpcy5kZWNheSAqIHRoaXMuZnJlcXVlbmN5ICogMTAwMCk7DQogIH0sDQoNCiAgb25UaW1lckV2Z!0OiBmd!jdGlvbigpIHsNCiAgICB0aGlzLnVwZGF0ZXIgPSBuZXcgQWpheC5VcGRhdGVyKHRoaXMuY29udGFpbmVyLCB0aGlzLnVybCwgdGhpcy5vcHRpb25zKTsNCiAgfQ0KfSk7DQpkb2N1bWVudC5nZXRFbGVtZ!0c0J5Q2xhc3NOYW1lID0gZnVuY3Rpb24oY2xhc3NOYW1lLCBwYXJlbnRFbGVtZ!0KSB7DQogIHZhciBjaGlsZHJlbiA9ICgkKHBhcmVudEVsZW1lbnQpIHx8IGRvY3VtZ!0LmJvZHkpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCcqJyk7DQogIHJldHVybiAkQShjaGlsZHJlbikua!qZWN0KFtdLCBmd!jdGlvbihlbGVtZ!0cywgY2hpbGQpIHsNCiAgICBpZiAoY2hpbGQuY2xhc3NOYW1lLm1hdGNoKG5ldyBSZWdFeHAoIihefFxccykiICsgY2xhc3NOYW1lICsgIihcXHN8JCkiKSkpDQogI*CBlbGVtZ!0cy5wdXNoKGNoaWxkKTsNCiAgICByZXR1cm4gZWxlbWVudHM7DQogIH0pOw0KfQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KaWYgKCF3a!kb3cuRWxlbWVudCkgew0KICB2YXIgRWxlbWVudCA9IG5ldyBPYmplY3QoKTsNCn0NCg0KT2JqZWN0LmV4dGVuZChFbGVtZ!0LCB7DQogIHZpc2libGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICByZXR1cm4gJChlbGVtZ!0KS5zdHlsZS5kaXNwbGF5ICE9ICdub25lJzsNCiAgfSwNCg0KICB0b2dnbGU6IGZ1bmN0aW9uKCkgew0KI*GZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7DQogI*CB2YXIgZWxlbWVudCA9ICQoYXJndW1lbnRzW2ldKTsNCiAgI*EVsZW1lbnRbRWxlbWVudC52aXNpYmxlKGVsZW1lbnQpID8gJ2hpZGUnIDogJ3Nob3cnXShlbGVtZ!0KTsNCiAgICB9DQogIH0sDQoNCiAgaGlkZTogZnVuY3Rpb24oKSB7DQogI@Zm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsNCiAgI*HZhciBlbGVtZ!0ID0gJChhcmd1bWVudHNbaV0pOw0KI*@ZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KI*H0NCiAgfSwNCg0KICBzaG93OiBmd!jdGlvbigpIHsNCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZ!0cy5sZ!ndGg7IGkrKykgew0KI*@dmFyIGVsZW1lbnQgPSAkKGFyZ3VtZ!0c1tpXSk7DQogI*CBlbGVtZ!0LnN0eWxlLmRpc3BsYXkgPSAnJzsNCiAgICB9DQogIH0sDQoNCiAgcmVtb3ZlOiBmd!jdGlvbihlbGVtZ!0KSB7DQogI@ZWxlbWVudCA9ICQoZWxlbWVudCk7DQogI@ZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW1lbnQpOw0KICB9LA0KDQogIHVwZGF0ZTogZnVuY3Rpb24oZWxlbWVudCwgaHRtbCkgew0KI*CQoZWxlbWVudCkua!uZXJIVE1MID0gaHRtbC5zdHJpcFNjcmlwdHMoKTsNCiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge2h0bWwuZXZhbFNjcmlwdHMoKX0sIDEwKTsNCiAgfSwNCg0KICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICBlbGVtZ!0ID0gJChlbGVtZ!0KTsNCiAgICByZXR1cm4gZWxlbWVudC5vZmZzZXRIZWlnaHQ7DQogIH0sDQoNCiAgY2xhc3NOYW1lczogZnVuY3Rpb24oZWxlbWVudCkgew0KI*HJldHVybiBuZXcgRWxlbWVudC5DbGFzc05hbWVzKGVsZW1lbnQpOw0KICB9LA0KDQogIGhhc0NsYXNzTmFtZTogZnVuY3Rpb24oZWxlbWVudCwgY2xhc3NOYW1lKSB7DQogI@aWYgKCEoZWxlbWVudCA9ICQoZWxlbWVudCkpKSByZXR1cm47DQogI@cmV0dXJuIEVsZW1lbnQuY2xhc3NOYW1lcyhlbGVtZ!0KS5pbmNsdWRlKGNsYXNzTmFtZSk7DQogIH0sDQoNCiAgYWRkQ2xhc3NOYW1lOiBmd!jdGlvbihlbGVtZ!0LCBjbGFzc05hbWUpIHsNCiAgICBpZiAoIShlbGVtZ!0ID0gJChlbGVtZ!0KSkpIHJldHVybjsNCiAgICByZXR1cm4gRWxlbWVudC5jbGFzc05hbWVzKGVsZW1lbnQpLmFkZChjbGFzc05hbWUpOw0KICB9LA0KDQogIHJlbW92ZUNsYXNzTmFtZTogZnVuY3Rpb24oZWxlbWVudCwgY2xhc3NOYW1lKSB7DQogI@aWYgKCEoZWxlbWVudCA9ICQoZWxlbWVudCkpKSByZXR1cm47DQogI@cmV0dXJuIEVsZW1lbnQuY2xhc3NOYW1lcyhlbGVtZ!0KS5yZW1vdmUoY2xhc3NOYW1lKTsNCiAgfSwNCg0KICAvLyByZW1vdmVzIHdoaXRlc3BhY2Utb25seSB0ZXh0IG5vZGUgY2hpbGRyZW4NCiAgY2xlY!XaGl0ZXNwYWNlOiBmd!jdGlvbihlbGVtZ!0KSB7DQogI@ZWxlbWVudCA9ICQoZWxlbWVudCk7DQogI@Zm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZ!0LmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsNCiAgI*HZhciBub2RlID0gZWxlbWVudC5jaGlsZE5vZGVzW2ldOw0KI*@aWYgKG5vZGUubm9kZVR5cGUgPT0gMyAmJiAhL1xTLy50ZXN0KG5vZGUubm9kZVZhbHVlKSkNCiAgI*@RWxlbWVudC5yZW1vdmUobm9kZSk7DQogI@fQ0KICB9LA0KDQogIGVtcHR5OiBmd!jdGlvbihlbGVtZ!0KSB7DQogI@cmV0dXJuICQoZWxlbWVudCkua!uZXJIVE1MLm1hdGNoKC9eXHMqJC8pOw0KICB9LA0KDQogIHNjcm9sbFRvOiBmd!jdGlvbihlbGVtZ!0KSB7DQogI@ZWxlbWVudCA9ICQoZWxlbWVudCk7DQogI@dmFyIHggPSBlbGVtZ!0LnggPyBlbGVtZ!0LnggOiBlbGVtZ!0Lm9mZnNldExlZnQsDQogI**HkgPSBlbGVtZ!0LnkgPyBlbGVtZ!0LnkgOiBlbGVtZ!0Lm9mZnNldFRvcDsNCiAgICB3a!kb3cuc2Nyb2xsVG8oeCwgeSk7DQogIH0sDQoNCiAgZ2V0U3R5bGU6IGZ1bmN0aW9uKGVsZW1lbnQsIHN0eWxlKSB7DQogI@ZWxlbWVudCA9ICQoZWxlbWVudCk7DQogI@dmFyIHZhbHVlID0gZWxlbWVudC5zdHlsZVtzdHlsZS5jYW1lbGl6ZSgpXTsNCiAgICBpZiAoIXZhbHVlKSB7DQogI*CBpZiAoZG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSkgew0KI**CB2YXIgY3NzID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZ!0LCBudWxsKTsNCiAgI*@dmFsdWUgPSBjc3MgPyBjc3MuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZSkgOiBudWxsOw0KI*@fSBlbHNlIGlmIChlbGVtZ!0LmN1cnJlbnRTdHlsZSkgew0KI**CB2YWx1ZSA9IGVsZW1lbnQuY3VycmVudFN0eWxlW3N0eWxlLmNhbWVsaXplKCldOw0KI*@fQ0KI*H0NCg0KI*GlmICh3a!kb3cub3BlcmEgJiYgWydsZWZ0JywgJ3RvcCcsICdyaWdodCcsICdib3R0b20nXS5pbmNsdWRlKHN0eWxlKSkNCiAgI*GlmIChFbGVtZ!0LmdldFN0eWxlKGVsZW1lbnQsICdwb3NpdGlvbicpID09ICdzdGF0aWMnKSB2YWx1ZSA9ICdhdXRvJzsNCg0KI*HJldHVybiB2YWx1ZSA9PSAnYXV0bycgPyBudWxsIDogdmFsdWU7DQogIH0sDQoNCiAgc2V0U3R5bGU6IGZ1bmN0aW9uKGVsZW1lbnQsIHN0eWxlKSB7DQogI@ZWxlbWVudCA9ICQoZWxlbWVudCk7DQogI@Zm9yIChuYW1lIGluIHN0eWxlKQ0KI*@ZWxlbWVudC5zdHlsZVtuYW1lLmNhbWVsaXplKCldID0gc3R5bGVbbmFtZV07DQogIH0sDQoNCiAgZ2V0RGltZ!zaW9uczogZnVuY3Rpb24oZWxlbWVudCkgew0KI*GVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KI*GlmIChFbGVtZ!0LmdldFN0eWxlKGVsZW1lbnQsICdkaXNwbGF5JykgIT0gJ25vbmUnKQ0KI*@cmV0dXJuIHt3aWR0aDogZWxlbWVudC5vZmZzZXRXaWR0aCwgaGVpZ2h0OiBlbGVtZ!0Lm9mZnNldEhlaWdodH07DQoNCiAgICAvLyBBbGwgKldpZHRoIGFuZCAqSGVpZ2h0IHByb3BlcnRpZXMgZ2l2ZSAwIG9uIGVsZW1lbnRzIHdpdGggZGlzcGxheSBub25lLA0KI*C8vIHNvIGVuYWJsZSB0aGUgZWxlbWVudCB0ZW1wb3JhcmlseQ0KI*HZhciBlbHMgPSBlbGVtZ!0LnN0eWxlOw0KI*HZhciBvcmlna!hbFZpc2liaWxpdHkgPSBlbHMudmlzaWJpbGl0eTsNCiAgICB2YXIgb3JpZ2luYWxQb3NpdGlvbiA9IGVscy5wb3NpdGlvbjsNCiAgICBlbHMudmlzaWJpbGl0eSA9ICdoaWRkZW4nOw0KI*GVscy5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7DQogI@ZWxzLmRpc3BsYXkgPSAnJzsNCiAgICB2YXIgb3JpZ2luYWxXaWR0aCA9IGVsZW1lbnQuY2xpZ!0V2lkdGg7DQogI@dmFyIG9yaWdpbmFsSGVpZ2h0ID0gZWxlbWVudC5jbGllbnRIZWlnaHQ7DQogI@ZWxzLmRpc3BsYXkgPSAnbm9uZSc7DQogI@ZWxzLnBvc2l0aW9uID0gb3JpZ2luYWxQb3NpdGlvbjsNCiAgICBlbHMudmlzaWJpbGl0eSA9IG9yaWdpbmFsVmlzaWJpbGl0eTsNCiAgICByZXR1cm4ge3dpZHRoOiBvcmlna!hbFdpZHRoLCBoZWlnaHQ6IG9yaWdpbmFsSGVpZ2h0fTsNCiAgfSwNCg0KICBtYWtlUG9zaXRpb25lZDogZnVuY3Rpb24oZWxlbWVudCkgew0KI*GVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KI*HZhciBwb3MgPSBFbGVtZ!0LmdldFN0eWxlKGVsZW1lbnQsICdwb3NpdGlvbicpOw0KI*GlmIChwb3MgPT0gJ3N0YXRpYycgfHwgIXBvcykgew0KI*@ZWxlbWVudC5fbWFkZVBvc2l0aW9uZWQgPSB0cnVlOw0KI*@ZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7DQogI*CAvLyBPcGVyYSByZXR1cm5zIHRoZSBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIHBvc2l0aW9ua!nIGNvbnRleHQsIHdoZW4gYW4NCiAgI*C8vIGVsZW1lbnQgaXMgcG9zaXRpb24gcmVsYXRpdmUgYnV0IHRvcCBhbmQgbGVmdCBoYXZlIG5vdCBiZWVuIGRlZmluZWQNCiAgI*GlmICh3a!kb3cub3BlcmEpIHsNCiAgI*@ZWxlbWVudC5zdHlsZS50b3AgPSAwOw0KI**CBlbGVtZ!0LnN0eWxlLmxlZnQgPSAwOw0KI*@fQ0KI*H0NCiAgfSwNCg0KICB1bmRvUG9zaXRpb25lZDogZnVuY3Rpb24oZWxlbWVudCkgew0KI*GVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KI*GlmIChlbGVtZ!0Ll9tYWRlUG9zaXRpb25lZCkgew0KI*@ZWxlbWVudC5fbWFkZVBvc2l0aW9uZWQgPSB1bmRlZmluZWQ7DQogI*CBlbGVtZ!0LnN0eWxlLnBvc2l0aW9uID0NCiAgI*@ZWxlbWVudC5zdHlsZS50b3AgPQ0KI**CBlbGVtZ!0LnN0eWxlLmxlZnQgPQ0KI**CBlbGVtZ!0LnN0eWxlLmJvdHRvbSA9DQogI**GVsZW1lbnQuc3R5bGUucmlnaHQgPSAnJzsNCiAgICB9DQogIH0sDQoNCiAgbWFrZUNsaXBwa!nOiBmd!jdGlvbihlbGVtZ!0KSB7DQogI@ZWxlbWVudCA9ICQoZWxlbWVudCk7DQogI@aWYgKGVsZW1lbnQuX292ZXJmbG93KSByZXR1cm47DQogI@ZWxlbWVudC5fb3ZlcmZsb3cgPSBlbGVtZ!0LnN0eWxlLm92ZXJmbG93Ow0KI*GlmICgoRWxlbWVudC5nZXRTdHlsZShlbGVtZ!0LCAnb3ZlcmZsb3cnKSB8fCAndmlzaWJsZScpICE9ICdoaWRkZW4nKQ0KI*@ZWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nOw0KICB9LA0KDQogIHVuZG9DbGlwcGluZzogZnVuY3Rpb24oZWxlbWVudCkgew0KI*GVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KI*GlmIChlbGVtZ!0Ll9vdmVyZmxvdykgcmV0dXJuOw0KI*GVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSBlbGVtZ!0Ll9vdmVyZmxvdzsNCiAgICBlbGVtZ!0Ll9vdmVyZmxvdyA9IHVuZGVma!lZDsNCiAgfQ0KfSk7DQoNCnZhciBUb2dnbGUgPSBuZXcgT2JqZWN0KCk7DQpUb2dnbGUuZGlzcGxheSA9IEVsZW1lbnQudG9nZ2xlOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KQWJzdHJhY3QuS!zZXJ0aW9uID0gZnVuY3Rpb24oYWRqYWNlbmN5KSB7DQogIHRoaXMuYWRqYWNlbmN5ID0gYWRqYWNlbmN5Ow0KfQ0KDQpBYnN0cmFjdC5JbnNlcnRpb24ucHJvdG90eXBlID0gew0KICBpbml0aWFsaXplOiBmd!jdGlvbihlbGVtZ!0LCBjb250Z!0KSB7DQogI@dGhpcy5lbGVtZ!0ID0gJChlbGVtZ!0KTsNCiAgICB0aGlzLmNvbnRlbnQgPSBjb250Z!0LnN0cmlwU2NyaXB0cygpOw0KDQogI@aWYgKHRoaXMuYWRqYWNlbmN5ICYmIHRoaXMuZWxlbWVudC5pbnNlcnRBZGphY2VudEhUTUwpIHsNCiAgI*HRyeSB7DQogI**HRoaXMuZWxlbWVudC5pbnNlcnRBZGphY2VudEhUTUwodGhpcy5hZGphY2VuY3ksIHRoaXMuY29udGVudCk7DQogI*CB9IGNhdGNoIChlKSB7DQogI**GlmICh0aGlzLmVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICd0Ym9keScpIHsNCiAgI**CB0aGlzLmluc2VydENvbnRlbnQodGhpcy5jb250Z!0RnJvbUFub255bW91c1RhYmxlKCkpOw0KI**CB9IGVsc2Ugew0KI***HRocm93IGU7DQogI**H0NCiAgI*H0NCiAgICB9IGVsc2Ugew0KI*@dGhpcy5yY!nZSA9IHRoaXMuZWxlbWVudC5vd25lckRvY3VtZ!0LmNyZWF0ZVJhbmdlKCk7DQogI*CBpZiAodGhpcy5pbml0aWFsaXplUmFuZ2UpIHRoaXMua!pdGlhbGl6ZVJhbmdlKCk7DQogI*CB0aGlzLmluc2VydENvbnRlbnQoW3RoaXMucmFuZ2UuY3JlYXRlQ29udGV4dHVhbEZyYWdtZ!0KHRoaXMuY29udGVudCldKTsNCiAgICB9DQoNCiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge2NvbnRlbnQuZXZhbFNjcmlwdHMoKX0sIDEwKTsNCiAgfSwNCg0KICBjb250Z!0RnJvbUFub255bW91c1RhYmxlOiBmd!jdGlvbigpIHsNCiAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQogI@ZGl2LmlubmVySFRNTCA9ICc8dGFibGU+PHRib2R5PicgKyB0aGlzLmNvbnRlbnQgKyAnPC90Ym9keT48L3RhYmxlPic7DQogI@cmV0dXJuICRBKGRpdi5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlcyk7DQogIH0NCn0NCg0KdmFyIEluc2VydGlvbiA9IG5ldyBPYmplY3QoKTsNCg0KS!zZXJ0aW9uLkJlZm9yZSA9IENsYXNzLmNyZWF0ZSgpOw0KS!zZXJ0aW9uLkJlZm9yZS5wcm90b3R5cGUgPSBPYmplY3QuZXh0Z!kKG5ldyBBYnN0cmFjdC5JbnNlcnRpb24oJ2JlZm9yZUJlZ2luJyksIHsNCiAga!pdGlhbGl6ZVJhbmdlOiBmd!jdGlvbigpIHsNCiAgICB0aGlzLnJhbmdlLnNldFN0YXJ0QmVmb3JlKHRoaXMuZWxlbWVudCk7DQogIH0sDQoNCiAga!zZXJ0Q29udGVudDogZnVuY3Rpb24oZnJhZ21lbnRzKSB7DQogI@ZnJhZ21lbnRzLmVhY2goKGZ1bmN0aW9uKGZyYWdtZ!0KSB7DQogI*CB0aGlzLmVsZW1lbnQucGFyZ!0Tm9kZS5pbnNlcnRCZWZvcmUoZnJhZ21lbnQsIHRoaXMuZWxlbWVudCk7DQogI@fSkuYmluZCh0aGlzKSk7DQogIH0NCn0pOw0KDQpJbnNlcnRpb24uVG9wID0gQ2xhc3MuY3JlYXRlKCk7DQpJbnNlcnRpb24uVG9wLnByb3RvdHlwZSA9IE9iamVjdC5leHRlbmQobmV3IEFic3RyYWN0Lkluc2VydGlvbignYWZ0ZXJCZWdpbicpLCB7DQogIGluaXRpYWxpemVSY!nZTogZnVuY3Rpb24oKSB7DQogI@dGhpcy5yY!nZS5zZWxlY3ROb2RlQ29udGVudHModGhpcy5lbGVtZ!0KTsNCiAgICB0aGlzLnJhbmdlLmNvbGxhcHNlKHRydWUpOw0KICB9LA0KDQogIGluc2VydENvbnRlbnQ6IGZ1bmN0aW9uKGZyYWdtZ!0cykgew0KI*GZyYWdtZ!0cy5yZXZlcnNlKGZhbHNlKS5lYWNoKChmd!jdGlvbihmcmFnbWVudCkgew0KI*@dGhpcy5lbGVtZ!0Lmluc2VydEJlZm9yZShmcmFnbWVudCwgdGhpcy5lbGVtZ!0LmZpcnN0Q2hpbGQpOw0KI*H0pLmJpbmQodGhpcykpOw0KICB9DQp9KTsNCg0KS!zZXJ0aW9uLkJvdHRvbSA9IENsYXNzLmNyZWF0ZSgpOw0KS!zZXJ0aW9uLkJvdHRvbS5wcm90b3R5cGUgPSBPYmplY3QuZXh0Z!kKG5ldyBBYnN0cmFjdC5JbnNlcnRpb24oJ2JlZm9yZUVuZCcpLCB7DQogIGluaXRpYWxpemVSY!nZTogZnVuY3Rpb24oKSB7DQogI@dGhpcy5yY!nZS5zZWxlY3ROb2RlQ29udGVudHModGhpcy5lbGVtZ!0KTsNCiAgICB0aGlzLnJhbmdlLmNvbGxhcHNlKHRoaXMuZWxlbWVudCk7DQogIH0sDQoNCiAga!zZXJ0Q29udGVudDogZnVuY3Rpb24oZnJhZ21lbnRzKSB7DQogI@ZnJhZ21lbnRzLmVhY2goKGZ1bmN0aW9uKGZyYWdtZ!0KSB7DQogI*CB0aGlzLmVsZW1lbnQuYXBwZ!kQ2hpbGQoZnJhZ21lbnQpOw0KI*H0pLmJpbmQodGhpcykpOw0KICB9DQp9KTsNCg0KS!zZXJ0aW9uLkFmdGVyID0gQ2xhc3MuY3JlYXRlKCk7DQpJbnNlcnRpb24uQWZ0ZXIucHJvdG90eXBlID0gT2JqZWN0LmV4dGVuZChuZXcgQWJzdHJhY3QuS!zZXJ0aW9uKCdhZnRlckVuZCcpLCB7DQogIGluaXRpYWxpemVSY!nZTogZnVuY3Rpb24oKSB7DQogI@dGhpcy5yY!nZS5zZXRTdGFydEFmdGVyKHRoaXMuZWxlbWVudCk7DQogIH0sDQoNCiAga!zZXJ0Q29udGVudDogZnVuY3Rpb24oZnJhZ21lbnRzKSB7DQogI@ZnJhZ21lbnRzLmVhY2goKGZ1bmN0aW9uKGZyYWdtZ!0KSB7DQogI*CB0aGlzLmVsZW1lbnQucGFyZ!0Tm9kZS5pbnNlcnRCZWZvcmUoZnJhZ21lbnQsDQogI**HRoaXMuZWxlbWVudC5uZXh0U2libGluZyk7DQogI@fSkuYmluZCh0aGlzKSk7DQogIH0NCn0pOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KRWxlbWVudC5DbGFzc05hbWVzID0gQ2xhc3MuY3JlYXRlKCk7DQpFbGVtZ!0LkNsYXNzTmFtZXMucHJvdG90eXBlID0gew0KICBpbml0aWFsaXplOiBmd!jdGlvbihlbGVtZ!0KSB7DQogI@dGhpcy5lbGVtZ!0ID0gJChlbGVtZ!0KTsNCiAgfSwNCg0KICBfZWFjaDogZnVuY3Rpb24oaXRlcmF0b3IpIHsNCiAgICB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lLnNwbGl0KC9ccysvKS5zZWxlY3QoZnVuY3Rpb24obmFtZSkgew0KI*@cmV0dXJuIG5hbWUubGVuZ3RoID4gMDsNCiAgICB9KS5fZWFjaChpdGVyYXRvcik7DQogIH0sDQoNCiAgc2V0OiBmd!jdGlvbihjbGFzc05hbWUpIHsNCiAgICB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lID0gY2xhc3NOYW1lOw0KICB9LA0KDQogIGFkZDogZnVuY3Rpb24oY2xhc3NOYW1lVG9BZGQpIHsNCiAgICBpZiAodGhpcy5pbmNsdWRlKGNsYXNzTmFtZVRvQWRkKSkgcmV0dXJuOw0KI*HRoaXMuc2V0KHRoaXMudG9BcnJheSgpLmNvbmNhdChjbGFzc05hbWVUb0FkZCkuam9pbignICcpKTsNCiAgfSwNCg0KICByZW1vdmU6IGZ1bmN0aW9uKGNsYXNzTmFtZVRvUmVtb3ZlKSB7DQogI@aWYgKCF0aGlzLmluY2x1ZGUoY2xhc3NOYW1lVG9SZW1vdmUpKSByZXR1cm47DQogI@dGhpcy5zZXQodGhpcy5zZWxlY3QoZnVuY3Rpb24oY2xhc3NOYW1lKSB7DQogI*CByZXR1cm4gY2xhc3NOYW1lICE9IGNsYXNzTmFtZVRvUmVtb3ZlOw0KI*H0pLmpvaW4oJyAnKSk7DQogIH0sDQoNCiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgew0KI*HJldHVybiB0aGlzLnRvQXJyYXkoKS5qb2luKCcgJyk7DQogIH0NCn0NCg0KT2JqZWN0LmV4dGVuZChFbGVtZ!0LkNsYXNzTmFtZXMucHJvdG90eXBlLCBFbnVtZXJhYmxlKTsNCnZhciBGaWVsZCA9IHsNCiAgY2xlYXI6IGZ1bmN0aW9uKCkgew0KI*GZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKQ0KI*@JChhcmd1bWVudHNbaV0pLnZhbHVlID0gJyc7DQogIH0sDQoNCiAgZm9jdXM6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICAkKGVsZW1lbnQpLmZvY3VzKCk7DQogIH0sDQoNCiAgcHJlc2VudDogZnVuY3Rpb24oKSB7DQogI@Zm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspDQogI*CBpZiAoJChhcmd1bWVudHNbaV0pLnZhbHVlID09ICcnKSByZXR1cm4gZmFsc2U7DQogI@cmV0dXJuIHRydWU7DQogIH0sDQoNCiAgc2VsZWN0OiBmd!jdGlvbihlbGVtZ!0KSB7DQogI@JChlbGVtZ!0KS5zZWxlY3QoKTsNCiAgfSwNCg0KICBhY3RpdmF0ZTogZnVuY3Rpb24oZWxlbWVudCkgew0KI*GVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KI*GVsZW1lbnQuZm9jdXMoKTsNCiAgICBpZiAoZWxlbWVudC5zZWxlY3QpDQogI*CBlbGVtZ!0LnNlbGVjdCgpOw0KICB9DQp9DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQp2YXIgRm9ybSA9IHsNCiAgc2VyaWFsaXplOiBmd!jdGlvbihmb3JtKSB7DQogI@dmFyIGVsZW1lbnRzID0gRm9ybS5nZXRFbGVtZ!0cygkKGZvcm0pKTsNCiAgICB2YXIgcXVlcnlDb21wb25lbnRzID0gbmV3IEFycmF5KCk7DQoNCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7DQogI*CB2YXIgcXVlcnlDb21wb25lbnQgPSBGb3JtLkVsZW1lbnQuc2VyaWFsaXplKGVsZW1lbnRzW2ldKTsNCiAgI*GlmIChxdWVyeUNvbXBvbmVudCkNCiAgI*@cXVlcnlDb21wb25lbnRzLnB1c2gocXVlcnlDb21wb25lbnQpOw0KI*H0NCg0KI*HJldHVybiBxdWVyeUNvbXBvbmVudHMuam9pbignJicpOw0KICB9LA0KDQogIGdldEVsZW1lbnRzOiBmd!jdGlvbihmb3JtKSB7DQogI@Zm9ybSA9ICQoZm9ybSk7DQogI@dmFyIGVsZW1lbnRzID0gbmV3IEFycmF5KCk7DQoNCiAgICBmb3IgKHRhZ05hbWUgaW4gRm9ybS5FbGVtZ!0LlNlcmlhbGl6ZXJzKSB7DQogI*CB2YXIgdGFnRWxlbWVudHMgPSBmb3JtLmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOw0KI*@Zm9yICh2YXIgaiA9IDA7IGogPCB0YWdFbGVtZ!0cy5sZ!ndGg7IGorKykNCiAgI*@ZWxlbWVudHMucHVzaCh0YWdFbGVtZ!0c1tqXSk7DQogI@fQ0KI*HJldHVybiBlbGVtZ!0czsNCiAgfSwNCg0KICBnZXRJbnB1dHM6IGZ1bmN0aW9uKGZvcm0sIHR5cGVOYW1lLCBuYW1lKSB7DQogI@Zm9ybSA9ICQoZm9ybSk7DQogI@dmFyIGlucHV0cyA9IGZvcm0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0Jyk7DQoNCiAgICBpZiAoIXR5cGVOYW1lICYmICFuYW1lKQ0KI*@cmV0dXJuIGlucHV0czsNCg0KI*HZhciBtYXRjaGluZ0lucHV0cyA9IG5ldyBBcnJheSgpOw0KI*GZvciAodmFyIGkgPSAwOyBpIDwga!wdXRzLmxlbmd0aDsgaSsrKSB7DQogI*CB2YXIga!wdXQgPSBpbnB1dHNbaV07DQogI*CBpZiAoKHR5cGVOYW1lICYmIGlucHV0LnR5cGUgIT0gdHlwZU5hbWUpIHx8DQogI**@KG5hbWUgJiYga!wdXQubmFtZSAhPSBuYW1lKSkNCiAgI*@Y29udGludWU7DQogI*CBtYXRjaGluZ0lucHV0cy5wdXNoKGlucHV0KTsNCiAgICB9DQoNCiAgICByZXR1cm4gbWF0Y2hpbmdJbnB1dHM7DQogIH0sDQoNCiAgZGlzYWJsZTogZnVuY3Rpb24oZm9ybSkgew0KI*HZhciBlbGVtZ!0cyA9IEZvcm0uZ2V0RWxlbWVudHMoZm9ybSk7DQogI@Zm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZ!0cy5sZ!ndGg7IGkrKykgew0KI*@dmFyIGVsZW1lbnQgPSBlbGVtZ!0c1tpXTsNCiAgI*GVsZW1lbnQuYmx1cigpOw0KI*@ZWxlbWVudC5kaXNhYmxlZCA9ICd0cnVlJzsNCiAgICB9DQogIH0sDQoNCiAgZ!hYmxlOiBmd!jdGlvbihmb3JtKSB7DQogI@dmFyIGVsZW1lbnRzID0gRm9ybS5nZXRFbGVtZ!0cyhmb3JtKTsNCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7DQogI*CB2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOw0KI*@ZWxlbWVudC5kaXNhYmxlZCA9ICcnOw0KI*H0NCiAgfSwNCg0KICBma!kRmlyc3RFbGVtZ!0OiBmd!jdGlvbihmb3JtKSB7DQogI@cmV0dXJuIEZvcm0uZ2V0RWxlbWVudHMoZm9ybSkuZmluZChmd!jdGlvbihlbGVtZ!0KSB7DQogI*CByZXR1cm4gZWxlbWVudC50eXBlICE9ICdoaWRkZW4nICYmICFlbGVtZ!0LmRpc2FibGVkICYmDQogI**Fsna!wdXQnLCAnc2VsZWN0JywgJ3RleHRhcmVhJ10ua!jbHVkZShlbGVtZ!0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSk7DQogI@fSk7DQogIH0sDQoNCiAgZm9jdXNGaXJzdEVsZW1lbnQ6IGZ1bmN0aW9uKGZvcm0pIHsNCiAgICBGaWVsZC5hY3RpdmF0ZShGb3JtLmZpbmRGaXJzdEVsZW1lbnQoZm9ybSkpOw0KICB9LA0KDQogIHJlc2V0OiBmd!jdGlvbihmb3JtKSB7DQogI@JChmb3JtKS5yZXNldCgpOw0KICB9DQp9DQoNCkZvcm0uRWxlbWVudCA9IHsNCiAgc2VyaWFsaXplOiBmd!jdGlvbihlbGVtZ!0KSB7DQogI@ZWxlbWVudCA9ICQoZWxlbWVudCk7DQogI@dmFyIG1ldGhvZCA9IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpOw0KI*HZhciBwYXJhbWV0ZXIgPSBGb3JtLkVsZW1lbnQuU2VyaWFsaXplcnNbbWV0aG9kXShlbGVtZ!0KTsNCg0KI*GlmIChwYXJhbWV0ZXIpIHsNCiAgI*HZhciBrZXkgPSBlbmNvZGVVUklDb21wb25lbnQocGFyYW1ldGVyWzBdKTsNCiAgI*GlmIChrZXkubGVuZ3RoID09IDApIHJldHVybjsNCg0KI*@aWYgKHBhcmFtZXRlclsxXS5jb25zdHJ1Y3RvciAhPSBBcnJheSkNCiAgI*@cGFyYW1ldGVyWzFdID0gW3BhcmFtZXRlclsxXV07DQoNCiAgI*HJldHVybiBwYXJhbWV0ZXJbMV0ubWFwKGZ1bmN0aW9uKHZhbHVlKSB7DQogI**HJldHVybiBrZXkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpOw0KI*@fSkuam9pbignJicpOw0KI*H0NCiAgfSwNCg0KICBnZXRWYWx1ZTogZnVuY3Rpb24oZWxlbWVudCkgew0KI*GVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KI*HZhciBtZXRob2QgPSBlbGVtZ!0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTsNCiAgICB2YXIgcGFyYW1ldGVyID0gRm9ybS5FbGVtZ!0LlNlcmlhbGl6ZXJzW21ldGhvZF0oZWxlbWVudCk7DQoNCiAgICBpZiAocGFyYW1ldGVyKQ0KI*@cmV0dXJuIHBhcmFtZXRlclsxXTsNCiAgfQ0KfQ0KDQpGb3JtLkVsZW1lbnQuU2VyaWFsaXplcnMgPSB7DQogIGlucHV0OiBmd!jdGlvbihlbGVtZ!0KSB7DQogI@c3dpdGNoIChlbGVtZ!0LnR5cGUudG9Mb3dlckNhc2UoKSkgew0KI*@Y2FzZSAnc3VibWl0JzoNCiAgI*GNhc2UgJ2hpZGRlbic6DQogI*CBjYXNlICdwYXNzd29yZCc6DQogI*CBjYXNlICd0ZXh0JzoNCiAgI*@cmV0dXJuIEZvcm0uRWxlbWVudC5TZXJpYWxpemVycy50ZXh0YXJlYShlbGVtZ!0KTsNCiAgI*GNhc2UgJ2NoZWNrYm94JzoNCiAgI*GNhc2UgJ3JhZGlvJzoNCiAgI*@cmV0dXJuIEZvcm0uRWxlbWVudC5TZXJpYWxpemVycy5pbnB1dFNlbGVjdG9yKGVsZW1lbnQpOw0KI*H0NCiAgICByZXR1cm4gZmFsc2U7DQogIH0sDQoNCiAga!wdXRTZWxlY3RvcjogZnVuY3Rpb24oZWxlbWVudCkgew0KI*GlmIChlbGVtZ!0LmNoZWNrZWQpDQogI*CByZXR1cm4gW2VsZW1lbnQubmFtZSwgZWxlbWVudC52YWx1ZV07DQogIH0sDQoNCiAgdGV4dGFyZWE6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICByZXR1cm4gW2VsZW1lbnQubmFtZSwgZWxlbWVudC52YWx1ZV07DQogIH0sDQoNCiAgc2VsZWN0OiBmd!jdGlvbihlbGVtZ!0KSB7DQogI@cmV0dXJuIEZvcm0uRWxlbWVudC5TZXJpYWxpemVyc1tlbGVtZ!0LnR5cGUgPT0gJ3NlbGVjdC1vbmUnID8NCiAgI*CdzZWxlY3RPbmUnIDogJ3NlbGVjdE1hbnknXShlbGVtZ!0KTsNCiAgfSwNCg0KICBzZWxlY3RPbmU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICB2YXIgdmFsdWUgPSAnJywgb3B0LCBpbmRleCA9IGVsZW1lbnQuc2VsZWN0ZWRJbmRleDsNCiAgICBpZiAoa!kZXggPj0gMCkgew0KI*@b3B0ID0gZWxlbWVudC5vcHRpb25zW2luZGV4XTsNCiAgI*HZhbHVlID0gb3B0LnZhbHVlOw0KI*@aWYgKCF2YWx1ZSAmJiAhKCd2YWx1ZScgaW4gb3B0KSkNCiAgI*@dmFsdWUgPSBvcHQudGV4dDsNCiAgICB9DQogI@cmV0dXJuIFtlbGVtZ!0Lm5hbWUsIHZhbHVlXTsNCiAgfSwNCg0KICBzZWxlY3RNY!5OiBmd!jdGlvbihlbGVtZ!0KSB7DQogI@dmFyIHZhbHVlID0gbmV3IEFycmF5KCk7DQogI@Zm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZ!0Lmxlbmd0aDsgaSsrKSB7DQogI*CB2YXIgb3B0ID0gZWxlbWVudC5vcHRpb25zW2ldOw0KI*@aWYgKG9wdC5zZWxlY3RlZCkgew0KI**CB2YXIgb3B0VmFsdWUgPSBvcHQudmFsdWU7DQogI**GlmICghb3B0VmFsdWUgJiYgISgndmFsdWUnIGluIG9wdCkpDQogI**@b3B0VmFsdWUgPSBvcHQudGV4dDsNCiAgI*@dmFsdWUucHVzaChvcHRWYWx1ZSk7DQogI*CB9DQogI@fQ0KI*HJldHVybiBbZWxlbWVudC5uYW1lLCB2YWx1ZV07DQogIH0NCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnZhciAkRiA9IEZvcm0uRWxlbWVudC5nZXRWYWx1ZTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCkFic3RyYWN0LlRpbWVkT2JzZXJ2ZXIgPSBmd!jdGlvbigpIHt9DQpBYnN0cmFjdC5UaW1lZE9ic2VydmVyLnByb3RvdHlwZSA9IHsNCiAga!pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCwgZnJlcXVlbmN5LCBjYWxsYmFjaykgew0KI*HRoaXMuZnJlcXVlbmN5ID0gZnJlcXVlbmN5Ow0KI*HRoaXMuZWxlbWVud*D0gJChlbGVtZ!0KTsNCiAgICB0aGlzLmNhbGxiYWNrICA9IGNhbGxiYWNrOw0KDQogI@dGhpcy5sYXN0VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7DQogI@dGhpcy5yZWdpc3RlckNhbGxiYWNrKCk7DQogIH0sDQoNCiAgcmVnaXN0ZXJDYWxsYmFjazogZnVuY3Rpb24oKSB7DQogI@c2V0S!0ZXJ2YWwodGhpcy5vblRpbWVyRXZlbnQuYmluZCh0aGlzKSwgdGhpcy5mcmVxdWVuY3kgKiAxMDAwKTsNCiAgfSwNCg0KICBvblRpbWVyRXZlbnQ6IGZ1bmN0aW9uKCkgew0KI*HZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsNCiAgICBpZiAodGhpcy5sYXN0VmFsdWUgIT0gdmFsdWUpIHsNCiAgI*HRoaXMuY2FsbGJhY2sodGhpcy5lbGVtZ!0LCB2YWx1ZSk7DQogI*CB0aGlzLmxhc3RWYWx1ZSA9IHZhbHVlOw0KI*H0NCiAgfQ0KfQ0KDQpGb3JtLkVsZW1lbnQuT2JzZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoKTsNCkZvcm0uRWxlbWVudC5PYnNlcnZlci5wcm90b3R5cGUgPSBPYmplY3QuZXh0Z!kKG5ldyBBYnN0cmFjdC5UaW1lZE9ic2VydmVyKCksIHsNCiAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkgew0KI*HJldHVybiBGb3JtLkVsZW1lbnQuZ2V0VmFsdWUodGhpcy5lbGVtZ!0KTsNCiAgfQ0KfSk7DQoNCkZvcm0uT2JzZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoKTsNCkZvcm0uT2JzZXJ2ZXIucHJvdG90eXBlID0gT2JqZWN0LmV4dGVuZChuZXcgQWJzdHJhY3QuVGltZWRPYnNlcnZlcigpLCB7DQogIGdldFZhbHVlOiBmd!jdGlvbigpIHsNCiAgICByZXR1cm4gRm9ybS5zZXJpYWxpemUodGhpcy5lbGVtZ!0KTsNCiAgfQ0KfSk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpBYnN0cmFjdC5FdmVudE9ic2VydmVyID0gZnVuY3Rpb24oKSB7fQ0KQWJzdHJhY3QuRXZlbnRPYnNlcnZlci5wcm90b3R5cGUgPSB7DQogIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNhbGxiYWNrKSB7DQogI@dGhpcy5lbGVtZ!0ICA9ICQoZWxlbWVudCk7DQogI@dGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOw0KDQogI@dGhpcy5sYXN0VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7DQogI@aWYgKHRoaXMuZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2Zvcm0nKQ0KI*@dGhpcy5yZWdpc3RlckZvcm1DYWxsYmFja3MoKTsNCiAgICBlbHNlDQogI*CB0aGlzLnJlZ2lzdGVyQ2FsbGJhY2sodGhpcy5lbGVtZ!0KTsNCiAgfSwNCg0KICBvbkVsZW1lbnRFdmVudDogZnVuY3Rpb24oKSB7DQogI@dmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOw0KI*GlmICh0aGlzLmxhc3RWYWx1ZSAhPSB2YWx1ZSkgew0KI*@dGhpcy5jYWxsYmFjayh0aGlzLmVsZW1lbnQsIHZhbHVlKTsNCiAgI*HRoaXMubGFzdFZhbHVlID0gdmFsdWU7DQogI@fQ0KICB9LA0KDQogIHJlZ2lzdGVyRm9ybUNhbGxiYWNrczogZnVuY3Rpb24oKSB7DQogI@dmFyIGVsZW1lbnRzID0gRm9ybS5nZXRFbGVtZ!0cyh0aGlzLmVsZW1lbnQpOw0KI*GZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspDQogI*CB0aGlzLnJlZ2lzdGVyQ2FsbGJhY2soZWxlbWVudHNbaV0pOw0KICB9LA0KDQogIHJlZ2lzdGVyQ2FsbGJhY2s6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICBpZiAoZWxlbWVudC50eXBlKSB7DQogI*CBzd2l0Y2ggKGVsZW1lbnQudHlwZS50b0xvd2VyQ2FzZSgpKSB7DQogI**GNhc2UgJ2NoZWNrYm94JzoNCiAgI*@Y2FzZSAncmFkaW8nOg0KI***EV2Z!0Lm9ic2VydmUoZWxlbWVudCwgJ2NsaWNrJywgdGhpcy5vbkVsZW1lbnRFdmVudC5ia!kKHRoaXMpKTsNCiAgI**CBicmVhazsNCiAgI*@Y2FzZSAncGFzc3dvcmQnOg0KI**CBjYXNlICd0ZXh0JzoNCiAgI*@Y2FzZSAndGV4dGFyZWEnOg0KI**CBjYXNlICdzZWxlY3Qtb25lJzoNCiAgI*@Y2FzZSAnc2VsZWN0LW11bHRpcGxlJzoNCiAgI**CBFdmVudC5vYnNlcnZlKGVsZW1lbnQsICdjaGFuZ2UnLCB0aGlzLm9uRWxlbWVudEV2Z!0LmJpbmQodGhpcykpOw0KI***GJyZWFrOw0KI*@fQ0KI*H0NCiAgfQ0KfQ0KDQpGb3JtLkVsZW1lbnQuRXZlbnRPYnNlcnZlciA9IENsYXNzLmNyZWF0ZSgpOw0KRm9ybS5FbGVtZ!0LkV2Z!0T2JzZXJ2ZXIucHJvdG90eXBlID0gT2JqZWN0LmV4dGVuZChuZXcgQWJzdHJhY3QuRXZlbnRPYnNlcnZlcigpLCB7DQogIGdldFZhbHVlOiBmd!jdGlvbigpIHsNCiAgICByZXR1cm4gRm9ybS5FbGVtZ!0LmdldFZhbHVlKHRoaXMuZWxlbWVudCk7DQogIH0NCn0pOw0KDQpGb3JtLkV2Z!0T2JzZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoKTsNCkZvcm0uRXZlbnRPYnNlcnZlci5wcm90b3R5cGUgPSBPYmplY3QuZXh0Z!kKG5ldyBBYnN0cmFjdC5FdmVudE9ic2VydmVyKCksIHsNCiAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkgew0KI*HJldHVybiBGb3JtLnNlcmlhbGl6ZSh0aGlzLmVsZW1lbnQpOw0KICB9DQp9KTsNCmlmICghd2luZG93LkV2Z!0KSB7DQogIHZhciBFdmVudCA9IG5ldyBPYmplY3QoKTsNCn0NCg0KT2JqZWN0LmV4dGVuZChFdmVudCwgew0KICBLRVlfQkFDS1NQQUNFOiA4LA0KICBLRVlfVEFCOiAgI*CA5LA0KICBLRVlfUkVUVVJOOiAgIDEzLA0KICBLRVlfRVNDOiAgI*DI3LA0KICBLRVlfTEVGVDogI*DM3LA0KICBLRVlfVVA6I**DM4LA0KICBLRVlfUklHSFQ6I*DM5LA0KICBLRVlfRE9XTjogI*DQwLA0KICBLRVlfREVMRVRFOiAgIDQ2LA0KDQogIGVsZW1lbnQ6IGZ1bmN0aW9uKGV2Z!0KSB7DQogI@cmV0dXJuIGV2Z!0LnRhcmdldCB8fCBldmVudC5zcmNFbGVtZ!0Ow0KICB9LA0KDQogIGlzTGVmdENsaWNrOiBmd!jdGlvbihldmVudCkgew0KI*HJldHVybiAoKChldmVudC53aGljaCkgJiYgKGV2Z!0LndoaWNoID09IDEpKSB8fA0KI***@KChldmVudC5idXR0b24pICYmIChldmVudC5idXR0b24gPT0gMSkpKTsNCiAgfSwNCg0KICBwb2ludGVyWDogZnVuY3Rpb24oZXZlbnQpIHsNCiAgICByZXR1cm4gZXZlbnQucGFnZVggfHwgKGV2Z!0LmNsaWVudFggKw0KI*@KGRvY3VtZ!0LmRvY3VtZ!0RWxlbWVudC5zY3JvbGxMZWZ0IHx8IGRvY3VtZ!0LmJvZHkuc2Nyb2xsTGVmdCkpOw0KICB9LA0KDQogIHBva!0ZXJZOiBmd!jdGlvbihldmVudCkgew0KI*HJldHVybiBldmVudC5wYWdlWSB8fCAoZXZlbnQuY2xpZ!0WSArDQogI*CAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZ!0LnNjcm9sbFRvcCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCkpOw0KICB9LA0KDQogIHN0b3A6IGZ1bmN0aW9uKGV2Z!0KSB7DQogI@aWYgKGV2Z!0LnByZXZlbnREZWZhdWx0KSB7DQogI*CBldmVudC5wcmV2Z!0RGVmYXVsdCgpOw0KI*@ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7DQogI@fSBlbHNlIHsNCiAgI*GV2Z!0LnJldHVyblZhbHVlID0gZmFsc2U7DQogI*CBldmVudC5jY!jZWxCdWJibGUgPSB0cnVlOw0KI*H0NCiAgfSwNCg0KICAvLyBma!kIHRoZSBmaXJzdCBub2RlIHdpdGggdGhlIGdpdmVuIHRhZ05hbWUsIHN0YXJ0a!nIGZyb20gdGhlDQogIC8vIG5vZGUgdGhlIGV2Z!0IHdhcyB0cmlnZ2VyZWQgb247IHRyYXZlcnNlcyB0aGUgRE9NIHVwd2FyZHMNCiAgZmluZEVsZW1lbnQ6IGZ1bmN0aW9uKGV2Z!0LCB0YWdOYW1lKSB7DQogI@dmFyIGVsZW1lbnQgPSBFdmVudC5lbGVtZ!0KGV2Z!0KTsNCiAgICB3aGlsZSAoZWxlbWVudC5wYXJlbnROb2RlICYmICghZWxlbWVudC50YWdOYW1lIHx8DQogI**ChlbGVtZ!0LnRhZ05hbWUudG9VcHBlckNhc2UoKSAhPSB0YWdOYW1lLnRvVXBwZXJDYXNlKCkpKSkNCiAgI*GVsZW1lbnQgPSBlbGVtZ!0LnBhcmVudE5vZGU7DQogI@cmV0dXJuIGVsZW1lbnQ7DQogIH0sDQoNCiAgb2JzZXJ2ZXJzOiBmYWxzZSwNCg0KICBfb2JzZXJ2ZUFuZENhY2hlOiBmd!jdGlvbihlbGVtZ!0LCBuYW1lLCBvYnNlcnZlciwgdXNlQ2FwdHVyZSkgew0KI*GlmICghdGhpcy5vYnNlcnZlcnMpIHRoaXMub2JzZXJ2ZXJzID0gW107DQogI@aWYgKGVsZW1lbnQuYWRkRXZlbnRMaXN0Z!lcikgew0KI*@dGhpcy5vYnNlcnZlcnMucHVzaChbZWxlbWVudCwgbmFtZSwgb2JzZXJ2ZXIsIHVzZUNhcHR1cmVdKTsNCiAgI*GVsZW1lbnQuYWRkRXZlbnRMaXN0Z!lcihuYW1lLCBvYnNlcnZlciwgdXNlQ2FwdHVyZSk7DQogI@fSBlbHNlIGlmIChlbGVtZ!0LmF0dGFjaEV2Z!0KSB7DQogI*CB0aGlzLm9ic2VydmVycy5wdXNoKFtlbGVtZ!0LCBuYW1lLCBvYnNlcnZlciwgdXNlQ2FwdHVyZV0pOw0KI*@ZWxlbWVudC5hdHRhY2hFdmVudCgnb24nICsgbmFtZSwgb2JzZXJ2ZXIpOw0KI*H0NCiAgfSwNCg0KICB1bmxvYWRDYWNoZTogZnVuY3Rpb24oKSB7DQogI@aWYgKCFFdmVudC5vYnNlcnZlcnMpIHJldHVybjsNCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IEV2Z!0Lm9ic2VydmVycy5sZ!ndGg7IGkrKykgew0KI*@RXZlbnQuc3RvcE9ic2VydmluZy5hcHBseSh0aGlzLCBFdmVudC5vYnNlcnZlcnNbaV0pOw0KI*@RXZlbnQub2JzZXJ2ZXJzW2ldWzBdID0gbnVsbDsNCiAgICB9DQogI@RXZlbnQub2JzZXJ2ZXJzID0gZmFsc2U7DQogIH0sDQoNCiAgb2JzZXJ2ZTogZnVuY3Rpb24oZWxlbWVudCwgbmFtZSwgb2JzZXJ2ZXIsIHVzZUNhcHR1cmUpIHsNCiAgICB2YXIgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogI@dXNlQ2FwdHVyZSA9IHVzZUNhcHR1cmUgfHwgZmFsc2U7DQoNCiAgICBpZiAobmFtZSA9PSAna2V5cHJlc3MnICYmDQogI**ChuYXZpZ2F0b3IuYXBwVmVyc2lvbi5tYXRjaCgvS29ucXVlcm9yfFNhZmFyaXxLSFRNTC8pDQogI**Hx8IGVsZW1lbnQuYXR0YWNoRXZlbnQpKQ0KI*@bmFtZSA9ICdrZXlkb3duJzsNCg0KI*HRoaXMuX29ic2VydmVBbmRDYWNoZShlbGVtZ!0LCBuYW1lLCBvYnNlcnZlciwgdXNlQ2FwdHVyZSk7DQogIH0sDQoNCiAgc3RvcE9ic2VydmluZzogZnVuY3Rpb24oZWxlbWVudCwgbmFtZSwgb2JzZXJ2ZXIsIHVzZUNhcHR1cmUpIHsNCiAgICB2YXIgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogI@dXNlQ2FwdHVyZSA9IHVzZUNhcHR1cmUgfHwgZmFsc2U7DQoNCiAgICBpZiAobmFtZSA9PSAna2V5cHJlc3MnICYmDQogI**ChuYXZpZ2F0b3IuYXBwVmVyc2lvbi5tYXRjaCgvS29ucXVlcm9yfFNhZmFyaXxLSFRNTC8pDQogI**Hx8IGVsZW1lbnQuZGV0YWNoRXZlbnQpKQ0KI*@bmFtZSA9ICdrZXlkb3duJzsNCg0KI*GlmIChlbGVtZ!0LnJlbW92ZUV2Z!0TGlzdGVuZXIpIHsNCiAgI*GVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0Z!lcihuYW1lLCBvYnNlcnZlciwgdXNlQ2FwdHVyZSk7DQogI@fSBlbHNlIGlmIChlbGVtZ!0LmRldGFjaEV2Z!0KSB7DQogI*CBlbGVtZ!0LmRldGFjaEV2Z!0KCdvbicgKyBuYW1lLCBvYnNlcnZlcik7DQogI@fQ0KICB9DQp9KTsNCg0KLyogcHJldmVudCBtZW1vcnkgbGVha3MgaW4gSUUgKi8NCkV2Z!0Lm9ic2VydmUod2luZG93LCAnd!sb2FkJywgRXZlbnQud!sb2FkQ2FjaGUsIGZhbHNlKTsNCnZhciBQb3NpdGlvbiA9IHsNCiAgLy8gc2V0IHRvIHRydWUgaWYgbmVlZGVkLCB3YXJua!nOiBmaXJlZm94IHBlcmZvcm1hbmNlIHByb2JsZW1zDQogIC8vIE5PVCBuZWVlZGVkIGZvciBwYWdlIHNjcm9sbGluZywgb25seSBpZiBkcmFnZ2FibGUgY29udGFpbmVkIGluDQogIC8vIHNjcm9sbGFibGUgZWxlbWVudHMNCiAga!jbHVkZVNjcm9sbE9mZnNldHM6IGZhbHNlLA0KDQogIC8vIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBjYWxsa!nIHdpdGhpbkluY2x1ZGluZ1Njcm9sbG9mZnNldCwgZXZlcnkgdGltZSB0aGUNCiAgLy8gcGFnZSBpcyBzY3JvbGxlZA0KICBwcmVwYXJlOiBmd!jdGlvbigpIHsNCiAgICB0aGlzLmRlbHRhWCA9ICB3a!kb3cucGFnZVhPZmZzZXQNCiAgI****CB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdA0KI*****Hx8IGRvY3VtZ!0LmJvZHkuc2Nyb2xsTGVmdA0KI*****Hx8IDA7DQogI@dGhpcy5kZWx0YVkgPSAgd2luZG93LnBhZ2VZT2Zmc2V0DQogI****@fHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZ!0LnNjcm9sbFRvcA0KI*****Hx8IGRvY3VtZ!0LmJvZHkuc2Nyb2xsVG9wDQogI****@fHwgMDsNCiAgfSwNCg0KICByZWFsT2Zmc2V0OiBmd!jdGlvbihlbGVtZ!0KSB7DQogI@dmFyIHZhbHVlVCA9IDAsIHZhbHVlTCA9IDA7DQogI@ZG8gew0KI*@dmFsdWVUICs9IGVsZW1lbnQuc2Nyb2xsVG9wICB8fCAwOw0KI*@dmFsdWVMICs9IGVsZW1lbnQuc2Nyb2xsTGVmdCB8fCAwOw0KI*@ZWxlbWVudCA9IGVsZW1lbnQucGFyZ!0Tm9kZTsNCiAgICB9IHdoaWxlIChlbGVtZ!0KTsNCiAgICByZXR1cm4gW3ZhbHVlTCwgdmFsdWVUXTsNCiAgfSwNCg0KICBjdW11bGF0aXZlT2Zmc2V0OiBmd!jdGlvbihlbGVtZ!0KSB7DQogI@dmFyIHZhbHVlVCA9IDAsIHZhbHVlTCA9IDA7DQogI@ZG8gew0KI*@dmFsdWVUICs9IGVsZW1lbnQub2Zmc2V0VG9wICB8fCAwOw0KI*@dmFsdWVMICs9IGVsZW1lbnQub2Zmc2V0TGVmdCB8fCAwOw0KI*@ZWxlbWVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZ!0Ow0KI*H0gd2hpbGUgKGVsZW1lbnQpOw0KI*HJldHVybiBbdmFsdWVMLCB2YWx1ZVRdOw0KICB9LA0KDQogIHBvc2l0aW9uZWRPZmZzZXQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICB2YXIgdmFsdWVUID0gMCwgdmFsdWVMID0gMDsNCiAgICBkbyB7DQogI*CB2YWx1ZVQgKz0gZWxlbWVudC5vZmZzZXRUb3AgIHx8IDA7DQogI*CB2YWx1ZUwgKz0gZWxlbWVudC5vZmZzZXRMZWZ0IHx8IDA7DQogI*CBlbGVtZ!0ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQ7DQogI*CBpZiAoZWxlbWVudCkgew0KI**CBwID0gRWxlbWVudC5nZXRTdHlsZShlbGVtZ!0LCAncG9zaXRpb24nKTsNCiAgI*@aWYgKHAgPT0gJ3JlbGF0aXZlJyB8fCBwID09ICdhYnNvbHV0ZScpIGJyZWFrOw0KI*@fQ0KI*H0gd2hpbGUgKGVsZW1lbnQpOw0KI*HJldHVybiBbdmFsdWVMLCB2YWx1ZVRdOw0KICB9LA0KDQogIG9mZnNldFBhcmVudDogZnVuY3Rpb24oZWxlbWVudCkgew0KI*GlmIChlbGVtZ!0Lm9mZnNldFBhcmVudCkgcmV0dXJuIGVsZW1lbnQub2Zmc2V0UGFyZ!0Ow0KI*GlmIChlbGVtZ!0ID09IGRvY3VtZ!0LmJvZHkpIHJldHVybiBlbGVtZ!0Ow0KDQogI@d2hpbGUgKChlbGVtZ!0ID0gZWxlbWVudC5wYXJlbnROb2RlKSAmJiBlbGVtZ!0ICE9IGRvY3VtZ!0LmJvZHkpDQogI*CBpZiAoRWxlbWVudC5nZXRTdHlsZShlbGVtZ!0LCAncG9zaXRpb24nKSAhPSAnc3RhdGljJykNCiAgI*@cmV0dXJuIGVsZW1lbnQ7DQoNCiAgICByZXR1cm4gZG9jdW1lbnQuYm9keTsNCiAgfSwNCg0KICAvLyBjYWNoZXMgeC95IGNvb3Jka!hdGUgcGFpciB0byB1c2Ugd2l0aCBvdmVybGFwDQogIHdpdGhpbjogZnVuY3Rpb24oZWxlbWVudCwgeCwgeSkgew0KI*GlmICh0aGlzLmluY2x1ZGVTY3JvbGxPZmZzZXRzKQ0KI*@cmV0dXJuIHRoaXMud2l0aGluS!jbHVka!nU2Nyb2xsb2Zmc2V0cyhlbGVtZ!0LCB4LCB5KTsNCiAgICB0aGlzLnhjb21wID0geDsNCiAgICB0aGlzLnljb21wID0geTsNCiAgICB0aGlzLm9mZnNldCA9IHRoaXMuY3VtdWxhdGl2ZU9mZnNldChlbGVtZ!0KTsNCg0KI*HJldHVybiAoeSA+PSB0aGlzLm9mZnNldFsxXSAmJg0KI***@eSA8ICB0aGlzLm9mZnNldFsxXSArIGVsZW1lbnQub2Zmc2V0SGVpZ2h0ICYmDQogI***CB4ID49IHRoaXMub2Zmc2V0WzBdICYmDQogI***CB4IDwgIHRoaXMub2Zmc2V0WzBdICsgZWxlbWVudC5vZmZzZXRXaWR0aCk7DQogIH0sDQoNCiAgd2l0aGluS!jbHVka!nU2Nyb2xsb2Zmc2V0czogZnVuY3Rpb24oZWxlbWVudCwgeCwgeSkgew0KI*HZhciBvZmZzZXRjYWNoZSA9IHRoaXMucmVhbE9mZnNldChlbGVtZ!0KTsNCg0KI*HRoaXMueGNvbXAgPSB4ICsgb2Zmc2V0Y2FjaGVbMF0gLSB0aGlzLmRlbHRhWDsNCiAgICB0aGlzLnljb21wID0geSArIG9mZnNldGNhY2hlWzFdIC0gdGhpcy5kZWx0YVk7DQogI@dGhpcy5vZmZzZXQgPSB0aGlzLmN1bXVsYXRpdmVPZmZzZXQoZWxlbWVudCk7DQoNCiAgICByZXR1cm4gKHRoaXMueWNvbXAgPj0gdGhpcy5vZmZzZXRbMV0gJiYNCiAgI***HRoaXMueWNvbXAgP@dGhpcy5vZmZzZXRbMV0gKyBlbGVtZ!0Lm9mZnNldEhlaWdodCAmJg0KI***@dGhpcy54Y29tcCA+PSB0aGlzLm9mZnNldFswXSAmJg0KI***@dGhpcy54Y29tcCA8ICB0aGlzLm9mZnNldFswXSArIGVsZW1lbnQub2Zmc2V0V2lkdGgpOw0KICB9LA0KDQogIC8vIHdpdGhpbiBtdXN0IGJlIGNhbGxlZCBkaXJlY3RseSBiZWZvcmUNCiAgb3ZlcmxhcDogZnVuY3Rpb24obW9kZSwgZWxlbWVudCkgew0KI*GlmICghbW9kZSkgcmV0dXJuIDA7DQogI@aWYgKG1vZGUgPT0gJ3ZlcnRpY2FsJykNCiAgI*HJldHVybiAoKHRoaXMub2Zmc2V0WzFdICsgZWxlbWVudC5vZmZzZXRIZWlnaHQpIC0gdGhpcy55Y29tcCkgLw0KI**CBlbGVtZ!0Lm9mZnNldEhlaWdodDsNCiAgICBpZiAobW9kZSA9PSAnaG9yaXpvbnRhbCcpDQogI*CByZXR1cm4gKCh0aGlzLm9mZnNldFswXSArIGVsZW1lbnQub2Zmc2V0V2lkdGgpIC0gdGhpcy54Y29tcCkgLw0KI**CBlbGVtZ!0Lm9mZnNldFdpZHRoOw0KICB9LA0KDQogIGNsb25lOiBmd!jdGlvbihzb3VyY2UsIHRhcmdldCkgew0KI*HNvdXJjZSA9ICQoc291cmNlKTsNCiAgICB0YXJnZXQgPSAkKHRhcmdldCk7DQogI@dGFyZ2V0LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsNCiAgICB2YXIgb2Zmc2V0cyA9IHRoaXMuY3VtdWxhdGl2ZU9mZnNldChzb3VyY2UpOw0KI*HRhcmdldC5zdHlsZS50b3AgI@PSBvZmZzZXRzWzFdICsgJ3B4JzsNCiAgICB0YXJnZXQuc3R5bGUubGVmd*D0gb2Zmc2V0c1swXSArICdweCc7DQogI@dGFyZ2V0LnN0eWxlLndpZHRoICA9IHNvdXJjZS5vZmZzZXRXaWR0aCArICdweCc7DQogI@dGFyZ2V0LnN0eWxlLmhlaWdodCA9IHNvdXJjZS5vZmZzZXRIZWlnaHQgKyAncHgnOw0KICB9LA0KDQogIHBhZ2U6IGZ1bmN0aW9uKGZvckVsZW1lbnQpIHsNCiAgICB2YXIgdmFsdWVUID0gMCwgdmFsdWVMID0gMDsNCg0KI*HZhciBlbGVtZ!0ID0gZm9yRWxlbWVudDsNCiAgICBkbyB7DQogI*CB2YWx1ZVQgKz0gZWxlbWVudC5vZmZzZXRUb3AgIHx8IDA7DQogI*CB2YWx1ZUwgKz0gZWxlbWVudC5vZmZzZXRMZWZ0IHx8IDA7DQoNCiAgI*C8vIFNhZmFyaSBmaXgNCiAgI*GlmIChlbGVtZ!0Lm9mZnNldFBhcmVudD09ZG9jdW1lbnQuYm9keSkNCiAgI*@aWYgKEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwncG9zaXRpb24nKT09J2Fic29sdXRlJykgYnJlYWs7DQoNCiAgICB9IHdoaWxlIChlbGVtZ!0ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQpOw0KDQogI@ZWxlbWVudCA9IGZvckVsZW1lbnQ7DQogI@ZG8gew0KI*@dmFsdWVUIC09IGVsZW1lbnQuc2Nyb2xsVG9wICB8fCAwOw0KI*@dmFsdWVMIC09IGVsZW1lbnQuc2Nyb2xsTGVmdCB8fCAwOw0KI*H0gd2hpbGUgKGVsZW1lbnQgPSBlbGVtZ!0LnBhcmVudE5vZGUpOw0KDQogI@cmV0dXJuIFt2YWx1ZUwsIHZhbHVlVF07DQogIH0sDQoNCiAgY2xvbmU6IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KSB7DQogI@dmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0Z!kKHsNCiAgI*HNldExlZnQ6I*HRydWUsDQogI*CBzZXRUb3A6I*CB0cnVlLA0KI*@c2V0V2lkdGg6I@dHJ1ZSwNCiAgI*HNldEhlaWdodDogIHRydWUsDQogI*CBvZmZzZXRUb3A6ICAwLA0KI*@b2Zmc2V0TGVmdDogMA0KI*H0sIGFyZ3VtZ!0c1syXSB8fCB7fSkNCg0KI*C8vIGZpbmQgcGFnZSBwb3NpdGlvbiBvZiBzb3VyY2UNCiAgICBzb3VyY2UgPSAkKHNvdXJjZSk7DQogI@dmFyIHAgPSBQb3NpdGlvbi5wYWdlKHNvdXJjZSk7DQoNCiAgICAvLyBma!kIGNvb3Jka!hdGUgc3lzdGVtIHRvIHVzZQ0KI*HRhcmdldCA9ICQodGFyZ2V0KTsNCiAgICB2YXIgZGVsdGEgPSBbMCwgMF07DQogI@dmFyIHBhcmVudCA9IG51bGw7DQogI@Ly8gZGVsdGEgWzAsMF0gd2lsbCBkbyBma!lIHdpdGggcG9zaXRpb246IGZpeGVkIGVsZW1lbnRzLA0KI*C8vIHBvc2l0aW9uOmFic29sdXRlIG5lZWRzIG9mZnNldFBhcmVudCBkZWx0YXMNCiAgICBpZiAoRWxlbWVudC5nZXRTdHlsZSh0YXJnZXQsJ3Bvc2l0aW9uJykgPT0gJ2Fic29sdXRlJykgew0KI*@cGFyZ!0ID0gUG9zaXRpb24ub2Zmc2V0UGFyZ!0KHRhcmdldCk7DQogI*CBkZWx0YSA9IFBvc2l0aW9uLnBhZ2UocGFyZ!0KTsNCiAgICB9DQoNCiAgICAvLyBjb3JyZWN0IGJ5IGJvZHkgb2Zmc2V0cyAoZml4ZXMgU2FmYXJpKQ0KI*GlmIChwYXJlbnQgPT0gZG9jdW1lbnQuYm9keSkgew0KI*@ZGVsdGFbMF0gLT0gZG9jdW1lbnQuYm9keS5vZmZzZXRMZWZ0Ow0KI*@ZGVsdGFbMV0gLT0gZG9jdW1lbnQuYm9keS5vZmZzZXRUb3A7DQogI@fQ0KDQogI@Ly8gc2V0IHBvc2l0aW9uDQogI@aWYob3B0aW9ucy5zZXRMZWZ0KSAgIHRhcmdldC5zdHlsZS5sZWZ0ICA9IChwWzBdIC0gZGVsdGFbMF0gKyBvcHRpb25zLm9mZnNldExlZnQpICsgJ3B4JzsNCiAgICBpZihvcHRpb25zLnNldFRvcCkgI@dGFyZ2V0LnN0eWxlLnRvc*D0gKHBbMV0gLSBkZWx0YVsxXSArIG9wdGlvbnMub2Zmc2V0VG9wKSArICdweCc7DQogI@aWYob3B0aW9ucy5zZXRXaWR0aCkgIHRhcmdldC5zdHlsZS53aWR0aCA9IHNvdXJjZS5vZmZzZXRXaWR0aCArICdweCc7DQogI@aWYob3B0aW9ucy5zZXRIZWlnaHQpIHRhcmdldC5zdHlsZS5oZWlnaHQgPSBzb3VyY2Uub2Zmc2V0SGVpZ2h0ICsgJ3B4JzsNCiAgfSwNCg0KICBhYnNvbHV0aXplOiBmd!jdGlvbihlbGVtZ!0KSB7DQogI@ZWxlbWVudCA9ICQoZWxlbWVudCk7DQogI@aWYgKGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPT0gJ2Fic29sdXRlJykgcmV0dXJuOw0KI*FBvc2l0aW9uLnByZXBhcmUoKTsNCg0KI*HZhciBvZmZzZXRzID0gUG9zaXRpb24ucG9zaXRpb25lZE9mZnNldChlbGVtZ!0KTsNCiAgICB2YXIgdG9wI*CA9IG9mZnNldHNbMV07DQogI@dmFyIGxlZnQgI@PSBvZmZzZXRzWzBdOw0KI*HZhciB3aWR0a*D0gZWxlbWVudC5jbGllbnRXaWR0aDsNCiAgICB2YXIgaGVpZ2h0ICA9IGVsZW1lbnQuY2xpZ!0SGVpZ2h0Ow0KDQogI@ZWxlbWVudC5fb3JpZ2luYWxMZWZ0I@PSBsZWZ0IC0gcGFyc2VGbG9hdChlbGVtZ!0LnN0eWxlLmxlZnQgIHx8IDApOw0KI*GVsZW1lbnQuX29yaWdpbmFsVG9wI*D0gdG9wICAtIHBhcnNlRmxvYXQoZWxlbWVudC5zdHlsZS50b3AgfHwgMCk7DQogI@ZWxlbWVudC5fb3JpZ2luYWxXaWR0a@PSBlbGVtZ!0LnN0eWxlLndpZHRoOw0KI*GVsZW1lbnQuX29yaWdpbmFsSGVpZ2h0ID0gZWxlbWVudC5zdHlsZS5oZWlnaHQ7DQoNCiAgICBlbGVtZ!0LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsNCiAgICBlbGVtZ!0LnN0eWxlLnRvc*CA9IHRvcCArICdweCc7Ow0KI*GVsZW1lbnQuc3R5bGUubGVmd*D0gbGVmdCArICdweCc7Ow0KI*GVsZW1lbnQuc3R5bGUud2lkdGggID0gd2lkdGggKyAncHgnOzsNCiAgICBlbGVtZ!0LnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7Ow0KICB9LA0KDQogIHJlbGF0aXZpemU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICBlbGVtZ!0ID0gJChlbGVtZ!0KTsNCiAgICBpZiAoZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9PSAncmVsYXRpdmUnKSByZXR1cm47DQogI@UG9zaXRpb24ucHJlcGFyZSgpOw0KDQogI@ZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7DQogI@dmFyIHRvc@PSBwYXJzZUZsb2F0KGVsZW1lbnQuc3R5bGUudG9wICB8fCAwKSAtIChlbGVtZ!0Ll9vcmlna!hbFRvcCB8fCAwKTsNCiAgICB2YXIgbGVmdCA9IHBhcnNlRmxvYXQoZWxlbWVudC5zdHlsZS5sZWZ0IHx8IDApIC0gKGVsZW1lbnQuX29yaWdpbmFsTGVmdCB8fCAwKTsNCg0KI*GVsZW1lbnQuc3R5bGUudG9wI*D0gdG9wICsgJ3B4JzsNCiAgICBlbGVtZ!0LnN0eWxlLmxlZnQgICA9IGxlZnQgKyAncHgnOw0KI*GVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gZWxlbWVudC5fb3JpZ2luYWxIZWlnaHQ7DQogI@ZWxlbWVudC5zdHlsZS53aWR0a@PSBlbGVtZ!0Ll9vcmlna!hbFdpZHRoOw0KICB9DQp9DQoNCi8vIFNhZmFyaSByZXR1cm5zIG1hcmdpbnMgb24gYm9keSB3aGljaCBpcyBpbmNvcnJlY3QgaWYgdGhlIGNoaWxkIGlzIGFic29sdXRlbHkNCi8vIHBvc2l0aW9uZWQuICBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgcmVkZWZpbmUgUG9zaXRpb24uY3VtdWxhdGl2ZU9mZnNldCBmb3INCi8vIEtIVE1ML1dlYktpdCBvbmx5Lg0KaWYgKC9Lb25xdWVyb3J8U2FmYXJpfEtIVE1MLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7IFBvc2l0aW9uLmN1bXVsYXRpdmVPZmZzZXQgPSBmd!jdGlvbihlbGVtZ!0KSANCnsNCiAgdmFyIHZhbHVlVCA9IDAsIHZhbHVlTCA9IDA7DQogIGRvIHsNCiAgICB2YWx1ZVQgKz0gZWxlbWVudC5vZmZzZXRUb3AgIHx8IDA7DQogI@dmFsdWVMICs9IGVsZW1lbnQub2Zmc2V0TGVmdCB8fCAwOw0KI*GlmIChlbGVtZ!0Lm9mZnNldFBhcmVudCA9PSBkb2N1bWVudC5ib2R5KQ0KI*@aWYgKEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJykgPT0gJ2Fic29sdXRlJykgYnJlYWs7DQoNCiAgICBlbGVtZ!0ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQ7DQogIH0gd2hpbGUgKGVsZW1lbnQpOw0KI@cmV0dXJuIFt2YWx1ZUwsIHZhbHVlVF07DQogfQ0KfQ0KLyoNCiAgb25sb2FkIEV2Z!0cw0KKi8NCmZ1bmN0aW9uIGFkZEV2Z!0KG9iaiwgZXZUeXBlLCBmbikNCnsNCiAgaWYob2JqLmFkZEV2Z!0TGlzdGVuZXIpDQogIHsNCiAgICBvYmouYWRkRXZlbnRMaXN0Z!lcihldlR5cGUsIGZuLCBmYWxzZSk7DQogICByZXR1cm4gdHJ1ZTsNCiAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpew0KI*HZhciByID0gb2JqLmF0dGFjaEV2Z!0KCJvbiIrZXZUeXBlLCBmbik7DQogI@cmV0dXJuIHI7DQogIH0gZWxzZSB7DQogI@cmV0dXJuIGZhbHNlOw0KICB9DQp9DQoNCi8qDQogIEZsYXNoIGNsYXNzZXMNCiAgJiMxNjk7IDIwMDcgYnkgQ29kZUtpbmcNCiAgDQogIGJhc2VkIG9uIEFDX1J1bkFjdGl2ZUNvbnRlbnQuanMgYnkgQWRvYmUgU3lzdGVtcywgS!jLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKi8NCg0KZnVuY3Rpb24gZ2VuZXJhdGVGbGFzaChvYmpBdHRycywgcGFyYW1zLCBlbWJlZEF0dHJzKSANCnsgDQogIHZhciBzdHIgPSAnPG9iamVjdCAnOw0KICBmb3IgKHZhciBpIGluIG9iakF0dHJzKQ0KI*HN0ciArPSBpICsgJz0iJyArIG9iakF0dHJzW2ldICsgJyIgJzsNCiAgc3RyICs9ICc+JzsNCiAgZm9yICh2YXIgaSBpbiBwYXJhbXMpDQogI@c3RyICs9ICc8cGFyYW0gbmFtZT0iJyArIGkgKyAnIiB2YWx1ZT0iJyArIHBhcmFtc1tpXSArICciIC8+ICc7DQogIHN0ciArPSAnPGVtYmVkICc7DQogIGZvciAodmFyIGkgaW4gZW1iZWRBdHRycykNCiAgICBzdHIgKz0gaSArICc9IicgKyBlbWJlZEF0dHJzW2ldICsgJyIgJzsNCiAgc3RyICs9ICcgPjwvZW1iZWQ+PC9vYmplY3Q+JzsNCg0KICBkb2N1bWVudC53cml0ZShzdHIpOw0KfQ0KDQpmd!jdGlvbiBhZGRGbGFzaCgpDQp7DQogIHZhciByZXQgPSBnZXRGbGFzaEFyZ3MoYXJndW1lbnRzKTsNCiAgZ2VuZXJhdGVGbGFzaChyZXQub2JqQXR0cnMsIHJldC5wYXJhbXMsIHJldC5lbWJlZEF0dHJzKTsNCn0NCg0KZnVuY3Rpb24gZ2V0Rmxhc2hBcmdzKGFyZ3MpDQp7DQogIHZhciByZXQgPSBuZXcgT2JqZWN0KCk7DQogIHJldC5lbWJlZEF0dHJzID0gbmV3IE9iamVjdCgpOw0KICByZXQucGFyYW1zID0gbmV3IE9iamVjdCgpOw0KICByZXQub2JqQXR0cnMgPSBuZXcgT2JqZWN0KCk7DQogIGZvciAodmFyIGk9MDsgaSA8IGFyZ3MubGVuZ3RoOyBpPWkrMil7DQogI@dmFyIGN1cnJBcmcgPSBhcmdzW2ldLnRvTG93ZXJDYXNlKCk7I*A0KDQogI@c3dpdGNoIChjdXJyQXJnKXsJDQogI*CBjYXNlICJwbHVna!zcGFnZSI6DQogI**HJldC5lbWJlZEF0dHJzW2FyZ3NbaV1dID0gYXJnc1tpKzFdOw0KI**CBicmVhazsNCiAgI*GNhc2UgInNyYyI6DQogI*CBjYXNlICJtb3ZpZSI6CQ0KI**CByZXQuZW1iZWRBdHRyc1sic3JjIl0gPSBhcmdzW2krMV07DQogI**HJldC5wYXJhbXNbIm1vdmllIl0gPSBhcmdzW2krMV07DQogI**GJyZWFrOw0KI*@Y2FzZSAiY29kZWJhc2UiOg0KI**CByZXQub2JqQXR0cnNbYXJnc1tpXV0gPSBhcmdzW2krMV07DQogI**GJyZWFrOw0KI*@Y2FzZSAid2lkdGgiOg0KI**CByZXQub2JqQXR0cnNbYXJnc1tpXV0gPSBhcmdzW2krMV07DQogI**HJldC5lbWJlZEF0dHJzWyJ3aWR0aCJdID0gYXJnc1tpKzFdOw0KI**CByZXQucGFyYW1zWyJ3aWR0aCJdID0gYXJnc1tpKzFdOw0KI**CBicmVhazsNCiAgI*GNhc2UgImhlaWdodCI6DQogI**HJldC5vYmpBdHRyc1thcmdzW2ldXSA9IGFyZ3NbaSsxXTsNCiAgI*@cmV0LmVtYmVkQXR0cnNbImhlaWdodCJdID0gYXJnc1tpKzFdOw0KI**CByZXQucGFyYW1zWyJoZWlnaHQiXSA9IGFyZ3NbaSsxXTsNCiAgI*@YnJlYWs7DQogI*CBjYXNlICJzY2FsZSI6DQogI*CBkZWZhdWx0Og0KI**CByZXQuZW1iZWRBdHRyc1thcmdzW2ldXSA9IHJldC5wYXJhbXNbYXJnc1tpXV0gPSBhcmdzW2krMV07DQogI@fQ0KICB9DQogIA0KICByZXQub2JqQXR0cnNbImNsYXNzaWQiXSA9ICJjbHNpZDpkMjdjZGI2ZS1hZTZkLTExY2YtOTZiOC00NDQ1NTM1NDAwMDAiOw0KICByZXQuZW1iZWRBdHRyc1sidHlwZSJdID0gImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIjsNCiAgDQogIHJldHVybiByZXQ7DQp9DQoNCi8qDQogIEZ1bmN0aW9uIHRvIGRlY29kZSBzdHVmZg0KKi8NCg0KZnVuY3Rpb24gZGVjKHMsZGVsdGEpDQp7DQogIHZhciB0ZW1wID0gIiI7DQogIHZhciBhbHQsbmV1Ow0KICANCiAgZm9yKHZhciBpPTA7aTxzLmxlbmd0aDtpKyspDQogIHsNCiAgICBhbHQ9cy5jaGFyQ29kZUF0KGkpOw0KI*GlmKGFsdCA+PSA2NSAmJiBhbHQgPD0gOTApDQogI@eyANCiAgI*G5ldT1hbHQtZGVsdGE7DQogI*CBpZihuZXUgPCA2NSkgbmV1Kz0yNjsNCiAgICB9IGVsc2UgaWYoYWx0ID49IDk3ICYmIGFsdCA8PSAxMjIpIHsNCiAgI*G5ldSA9IGFsdCAtIGRlbHRhOw0KI*@aWYobmV1IDwgOTcpIG5ldSArPSAyNjsNCiAgICB9IGVsc2UgbmV1ID0gYWx0Ow0KI*HRlbXAgKz0gU3Rya!nLmZyb21DaGFyQ29kZShuZXUpOw0KICB9DQogIA0KICByZXR1cm4gdGVtcDsNCn0gDQoNCmZ1bmN0aW9uIGVzYyhkZWNTdHIpDQp7DQogIHZhciBlc2NzID0gJ0FCQ0ZHSEpLTU9QUVJTVFVYWVpiY2RlZmdoamtsb!wcXJzdHV2d3l6MDIzNDY3OSstKic7DQogIHZhciBiaXRzLGR1YWw7DQogIHZhciBpID0gMDsNCiAgdmFyIGVuY091dCA9ICcnOw0KICANCiAgd2hpbGUoZGVjU3RyLmxlbmd0aD49aSszKQ0KICB7DQogI@Yml0cyA9IChkZWNTdHIuY2hhckNvZGVBdChpKyspJjB4ZmYpPDwxNnwoZGVjU3RyLmNoYXJDb2RlQXQoaSsrKSYweGZmKTw8OHxkZWNTdHIuY2hhckNvZGVBdChpKyspJjB4ZmY7DQogI@Z!jT3V0ICs9IGVzY3MuY2hhckF0KChiaXRzJjB4MDBmYzAwMDApPj4xOCkgDQogI***CsgIGVzY3MuY2hhckF0KChiaXRzJjB4MDAwM2YwMDApPj4xMikgDQogI***CsgIGVzY3MuY2hhckF0KChiaXRzJjB4MDAwMDBmYzApPj42KSANCiAgI**@KyAgZXNjcy5jaGFyQXQoKGJpdHMmMHgwMDAwMDAzZikpOw0KICB9DQogIA0KICBpZihkZWNTdHIubGVuZ3RoLWkgPiAwICYmIGRlY1N0ci5sZ!ndGgtaSA8IDMpDQogIHsNCiAgICBkdWFsID0gQm9vbGVhbihkZWNTdHIubGVuZ3RoLWktMSk7DQogI@Yml0cyA9ICgoZGVjU3RyLmNoYXJDb2RlQXQoaSsrKSYweGZmKTw8MTYpfChkdWFsPyhkZWNTdHIuY2hhckNvZGVBdChpKSYweGZmKTw8ODowKTsNCiAgICBlbmNPdXQgKz0gZXNjcy5jaGFyQXQoKGJpdHMmMHgwMGZjMDAwMCk+PjE4KQ0KI***CArICBlc2NzLmNoYXJBdCgoYml0cyYweDAwMDNmMDAwKT4+MTIpDQogI***CsgIChkdWFsP2VzY3MuY2hhckF0KChiaXRzJjB4MDAwMDBmYzApPj42KTonPScpKyc9JzsNCiAgfQ0KICANCiAgcmV0dXJuIGVuY091dDsNCn0NCg0KZnVuY3Rpb24gZHpjcEFkcygpDQp7DQogIGlmKHR5cGVvZihsaWNlbmNlKSAhPSAnc3Rya!nJykNCiAgbGljZ!jZSA9ICdmYWxzZSc7DQogIGxjRXJyb3IgPSB0cnVlOw0KICB1cmwgPSBkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZTsNCiAgdXJsID0gdXJsLnJlcGxhY2UoL3d3d1wuL2csJycpOw0KICB1cmwgPSBlc2ModXJsKTsNCiAgaWYobGljZ!jZS5tYXRjaCgvXF4vZykpDQogIHsNCiAgICBsc3BsaXQgPSBsaWNlbmNlLnNwbGl0KCdeJyk7DQoNCiAgICBmb3IoaT0wO2kgPD0gbHNwbGl0Lmxlbmd0aDtpKyspDQogI@ew0KI*@aWYodXJsID09IGxzcGxpdFtpXSkgbGNFcnJvciA9IGZhbHNlOw0KI*H0NCiAgfQ0KDQogIGlmKHVybCA9PSBsaWNlbmNlKSBsY0Vycm9yID0gZmFsc2U7DQogIGlmKHVybCAhPSBsaWNlbmNlICYmIGxjRXJyb3IgPT0gdHJ1ZSkNCiAgew0KI*GlmKGxpY2VuY2UgIT0gJycgJiYgbGNFcnJvciA9PSB0cnVlKQ0KI*HsNCiAgI*GxodG1sID0gJzxkaXYgc3R5bGU9XCJwYWRka!nOjMwcHg7bWFyZ2luOjgwcHg7Ym9yZGVyOjFweCBzb2xpZCAjMDAwO2ZvbnQtc2l6ZToxNnB4OycNCiAgI***CArJ2JhY2tncm91bmQtY29sb3I6I0ZGRjtjb2xvcjojMDAwO3dpZHRoOjU1MHB4XCI+Jw0KI****CsnIERpZSBMaXplbnpkYXRlaSBpc3Qgd!nJnV1bWw7bHRpZyEnDQogI***@KycgPGJyIC8+PGJyIC8+Jw0KI****CsnIFRoZSBsaWNlbmNlIGZpbGUgaXMga!2YWxpZCEnDQogI***@Kyc8L2Rpdj4nOw0KI*@ZG9jLmJvZHkua!uZXJIVE1MID0gbGh0bWw7DQogI@fSBlbHNlIHsNCiAgI*HZhciBhZERpdiA9IGRvYy5jcmVhdGVFbGVtZ!0KCdkaXYnKTsNCiAgI**CBhZERpdi5zZXRBdHRyaWJ1dGUoJ2lkJywnZHpjcC1hZHMnKTsNCiAgI**CANCiAgI*HZhciBhZExpbmsgPSBkb2MuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7DQogI**@YWRMa!rLnNldEF0dHJpYnV0ZSgnbGFuZ3VhZ2UnLCdqYXZhc2NyaXB0Jyk7DQogI**@YWRMa!rLnNldEF0dHJpYnV0ZSgndHlwZScsJ3RleHQvamF2YXNjcmlwdCcpOw0KI***GFkTGluay5zZXRBdHRyaWJ1dGUoJ3NyYycsJ2h0dHA6Ly91cGRhdGUuZHpjcC5kZScpOw0KI***A0KI***GRvYy5ib2R5LmFwcGVuZENoaWxkKGFkRGl2KTsNCiAgI**CBkb2MuYm9keS5hcHBlbmRDaGlsZChhZExpbmspOw0KI*H0NCiAgfQ0KfQ0KDQphZGRFdmVudCh3a!kb3csJ2xvYWQnLGR6Y3BBZHMpOw0KDQovKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLw0KDQovKg0KICBzZ!kTWUNCiovDQpmd!jdGlvbiBzZ!kTWUoaWQpDQp7DQogIGlmKGRvY3VtZ!0LmJvZHkuaWQgPT0gJ2R6Y3AtZ!na!lJykNCiAgew0KI*GlmKGlkKSBzdWJtaXRJRCA9IGlkOw0KI*GVsc2Ugc3VibWl0SUQgPSAnY29udGVudFN1Ym1pdCc7DQogDQogI@JChzdWJtaXRJRCkuZGlzYWJsZWQgPSB0cnVlOw0KI*CQoc3VibWl0SUQpLnN0eWxlLmNvbG9yID0gJyM5MDkwOTAnOw0KI*CQoc3VibWl0SUQpLnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JzsNCiAgICANCiAgICByZXR1cm4gdHJ1ZTsNCiAgfSBlbHNlIHJldHVybiBmYWxzZTsNCn0='));
