eyJuYl90eXBlIjoiZXNib29rIiwibmJfdmVyc2lvbiI6IjIuMC4wIiwiZWxlbWVudHMiOlt7ImlkIjoiaWQtYmI1MjI5ZWMtMWY3NS00NjhlLWI2NDktYjJmYmM5ODZlMTU4IiwiaW5wdXQiOiIvLyBhdXRvZXZhbCIsIm91dHB1dCI6W10sImZvcm1hdHRpbmdfb3B0aW9ucyI6eyJhbGlnbiI6ImxlZnQiLCJpbmRlbnQiOiIwZW0ifX0seyJpZCI6ImlkLTY1YWZlNmM5LTY3YWItNDY0Ni1hNWFlLWEzMGFiZmViYTdhNCIsImlucHV0IjoiVGhpcyBub3RlYm9vayB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZXZhbHVhdGVkIHdoZW4gbG9hZGVkLlxuT25jZSBldmFsdWF0aW9uIGNvbXBsZXRlcywgY2xpY2sgdGhlIEdvIGJ1dHRvbiB0byBzdGFydC5cbiQgJFxuRXF1YXRpb25zIGFuZCBwYXJhbWV0ZXJzIG1heSBiZSBtb2RpZmllZCBpbiBjb2RlIGluIHRoZSBsYXN0IGVsZW1lbnQuXG5UbyBzZWUgdGhlIGVmZmVjdCBvZiBtb2RpZmljYXRpb25zLCBldmFsdWF0ZSB0aGUgbGFzdCBlbGVtZW50LCBvclxuc2ltcGx5IHJlLWV2YWx1YXRlIHRoZSBlbnRpcmUgbm90ZWJvb2sgKGZyb20gdGhlIG1lbnU6IEVsZW1lbnQtPkV2YWwgbm90ZWJvb2spXG4iLCJvdXRwdXQiOlt7InR5cGUiOiJ0ZXh0IiwidGV4dCI6IlRoaXMgbm90ZWJvb2sgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGV2YWx1YXRlZCB3aGVuIGxvYWRlZC5cbk9uY2UgZXZhbHVhdGlvbiBjb21wbGV0ZXMsIGNsaWNrIHRoZSBHbyBidXR0b24gdG8gc3RhcnQuXG4kICRcbkVxdWF0aW9ucyBhbmQgcGFyYW1ldGVycyBtYXkgYmUgbW9kaWZpZWQgaW4gY29kZSBpbiB0aGUgbGFzdCBlbGVtZW50LlxuVG8gc2VlIHRoZSBlZmZlY3Qgb2YgbW9kaWZpY2F0aW9ucywgZXZhbHVhdGUgdGhlIGxhc3QgZWxlbWVudCwgb3JcbnNpbXBseSByZS1ldmFsdWF0ZSB0aGUgZW50aXJlIG5vdGVib29rIChmcm9tIHRoZSBtZW51OiBFbGVtZW50LT5FdmFsIG5vdGVib29rKVxuIn1dLCJmb3JtYXR0aW5nX29wdGlvbnMiOnsiYWxpZ24iOiJsZWZ0IiwiaW5kZW50IjoiMGVtIn19LHsiaWQiOiJpZC02MjU4Njg5Ni0yNmRiLTQ1NmYtYTkzMi0wMTBiNzQzNjllNzIiLCJpbnB1dCI6Ii8vIGF1dG9oaWRlXG5cbmNsYXNzIFdvcmtlclBvb2wge1xuICAgIGNvbnN0cnVjdG9yKHdvcmtlcl9jb3VudD1uYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgICAgICB3b3JrZXJfY291bnQ6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogd29ya2VyX2NvdW50LFxuICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fd29ya2VycyA9IFtdO1xuICAgICAgICB0aGlzLl91cGRhdGVfcG9vbCgpO1xuICAgIH1cblxuICAgIGdldCB3b3JrZXJzICgpe1xuICAgICAgICBpZiAodGhpcy5fd29ya2Vycy5zb21lKHcgPT4gdy50ZXJtaW5hdGVkKSkge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlX3Bvb2woKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fd29ya2VycztcbiAgICB9XG5cbiAgICBfdXBkYXRlX3Bvb2woKSB7XG4gICAgICAgIHRoaXMuX3dvcmtlcnMgPSB0aGlzLl93b3JrZXJzLmZpbHRlcih3ID0+ICF3LnRlcm1pbmF0ZWQpO1xuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5fd29ya2Vycy5sZW5ndGg7IGkgPCB0aGlzLndvcmtlcl9jb3VudDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLl93b3JrZXJzLnB1c2goY3JlYXRlX3dvcmtlcigpKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbnZhcnMoeyB3b3JrZXJfcG9vbDogdGhpcy5ldmFsX2NvbnRleHQud29ya2VyX3Bvb2wgPz8gbmV3IFdvcmtlclBvb2woKSB9KTsiLCJvdXRwdXQiOltdLCJmb3JtYXR0aW5nX29wdGlvbnMiOnsiYWxpZ24iOiJsZWZ0IiwiaW5kZW50IjoiMGVtIn19LHsiaWQiOiJpZC0yMjExMzdkNC00Y2MwLTQwMWUtOWQxMi04MGY3ODc4MTE0MGQiLCJpbnB1dCI6Ii8vIGF1dG9oaWRlXG5jb25zdCB7XG4gICAgUGxvdGx5LFxufSA9IGF3YWl0IGltcG9ydCgnLi9vdXRwdXQtaGFuZGxlcnMvcGxvdGx5LmpzJyk7XG5cbmNvbnN0IGh0bWwgPSBgXG48c3R5bGU+XG4gICAgI29kZV9wbG90dGVyX2luZm9fZGlzcGxheSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGdhcDogMnJlbTtcbiAgICB9XG5cbiAgICAjb2RlX3Bsb3R0ZXJfcGxheV9jb250cm9scyB7XG4gICAgICAgIHBhZGRpbmctdG9wOiAwLjVyZW07XG4gICAgICAgIHBhZGRpbmctYm90dG9tOiAwLjVyZW07XG4gICAgfVxuXG4gICAgI29kZV9wbG90dGVyX2NvbnRyb2xzIHtcbiAgICAgICAgd2lkdGg6IGZpdC1jb250ZW50O1xuICAgIH1cbiAgICAjb2RlX3Bsb3R0ZXJfY29udHJvbHMgZGl2ICoge1xuICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgIH1cblxuICAgICNvZGVfcGxvdHRlcl9hZGp1c3RtZW50cyB7XG4gICAgICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogbWF4LWNvbnRlbnQgbWF4LWNvbnRlbnQ7XG4gICAgICAgIGdhcDogMC41cmVtO1xuICAgIH1cbiAgICAjb2RlX3Bsb3R0ZXJfYWRqdXN0bWVudHMgbGFiZWwge1xuICAgICAgICBqdXN0aWZ5LXNlbGY6IGVuZDtcbiAgICB9XG5cbiAgICAjb2RlX3Bsb3R0ZXJfY29uZmlnX2Rpc3BsYXkge1xuICAgICAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XG4gICAgfVxuXG4gICAgLm9kZV9wbG90dGVyX2Rpc3BsYXkge1xuICAgICAgICBtYXJnaW4tbGVmdDogMC4xcmVtO1xuICAgICAgICBwYWRkaW5nOiAwIDAuNXJlbTtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTtcbiAgICB9XG5cbiAgICAuaGlkZGVuIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG48L3N0eWxlPlxuXG48ZGl2IGlkPVwib2RlX3Bsb3R0ZXJfcGxheV9jb250cm9sc1wiPlxuICAgIDxidXR0b24gaWQ9XCJvZGVfcGxvdHRlcl9nb1wiPkdvPC9idXR0b24+XG4gICAgPGJ1dHRvbiBpZD1cIm9kZV9wbG90dGVyX3BhdXNlXCIgY2xhc3M9XCJoaWRkZW5cIj5QYXVzZTwvYnV0dG9uPlxuPC9kaXY+XG48ZGl2IGlkPVwib2RlX3Bsb3R0ZXJfaW5mb19kaXNwbGF5XCI+XG4gICAgPGRpdiBpZD1cIm9kZV9wbG90dGVyX2NvbnRyb2xzXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJvZGVfcGxvdHRlcl9hZGp1c3RtZW50c1wiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBvaW50c19wZXJfbG9vcFwiPlRpbWUgc3RlcHMgcGVyIGxvb3A8L2xhYmVsPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJwb2ludHNfcGVyX2xvb3BcIiB0eXBlPVwicmFuZ2VcIiBtaW49XCIxXCIgbWF4PVwiMTAwMDBcIiB2YWx1ZT1cIjEwMDBcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBpZD1cInBvaW50c19wZXJfbG9vcF9kaXNwbGF5XCIgY2xhc3M9XCJvZGVfcGxvdHRlcl9kaXNwbGF5XCI+PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwibG9vcF9kZWxheVwiPkxvb3AgZGVsYXk8L2xhYmVsPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJsb29wX2RlbGF5XCIgdHlwZT1cInJhbmdlXCIgbWluPVwiMFwiIG1heD1cIjUwMFwiIHZhbHVlPVwiMFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGlkPVwibG9vcF9kZWxheV9kaXNwbGF5XCIgY2xhc3M9XCJvZGVfcGxvdHRlcl9kaXNwbGF5XCI+PC9zcGFuPiBtc1xuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwicG9pbnRzX3Nob3duXCI+VGltZSBzdGVwcyBzaG93bjwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cInBvaW50c19zaG93blwiIHR5cGU9XCJyYW5nZVwiIG1pbj1cIjBcIiBtYXg9XCIxMDAwMDBcIiBzdGVwPVwiMTBcIiB2YWx1ZT1cIjIwMDAwXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gaWQ9XCJwb2ludHNfc2hvd25fZGlzcGxheVwiIGNsYXNzPVwib2RlX3Bsb3R0ZXJfZGlzcGxheVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBvaW50X2NvdW50X2Rpc3BsYXlcIj5Ub3RhbCB0aW1lIHN0ZXBzPC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPHNwYW4gaWQ9XCJwb2ludF9jb3VudF9kaXNwbGF5XCIgY2xhc3M9XCJvZGVfcGxvdHRlcl9kaXNwbGF5XCI+PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJoaWRkZW5cIiBmb3I9XCJwb2ludF9jbG91ZF9sb29wX2Rpc3BsYXlcIj5Qb2ludCBjbG91ZCBzdGVwczwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gaWQ9XCJwb2ludF9jbG91ZF9sb29wX2Rpc3BsYXlcIiBjbGFzcz1cIm9kZV9wbG90dGVyX2Rpc3BsYXlcIj48L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImhpZGRlblwiIGZvcj1cInBvaW50X2Nsb3VkX3BvaW50c19wZXJfbG9vcFwiPlBDIHN0ZXBzIHBlciBsb29wPC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoaWRkZW5cIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJwb2ludF9jbG91ZF9wb2ludHNfcGVyX2xvb3BcIiB0eXBlPVwicmFuZ2VcIiBtaW49XCIxXCIgbWF4PVwiMTAwXCIgdmFsdWU9XCIxXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gaWQ9XCJwb2ludF9jbG91ZF9wb2ludHNfcGVyX2xvb3BfZGlzcGxheVwiIGNsYXNzPVwib2RlX3Bsb3R0ZXJfZGlzcGxheVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGlkPVwib2RlX3Bsb3R0ZXJfY29uZmlnX2Rpc3BsYXlcIj48L2Rpdj5cbjwvZGl2PlxuPGRpdiBpZD1cIm9kZV9wbG90dGVyX3Bsb3RcIj48L2Rpdj5cbmA7XG5cbmZ1bmN0aW9uIHNldHVwKHRoZV9vdXRwdXRfY29udGV4dCwgdGhlX2VxdWF0aW9uX2RlZikge1xuICAgIHRoZV9vdXRwdXRfY29udGV4dC5jcmVhdGVfb3V0cHV0X2VsZW1lbnQoKS5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgY29uc3QgcGxvdF9lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvZGVfcGxvdHRlcl9wbG90Jyk7XG5cbiAgICBjb25zdCBnb19idXR0b24gICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb2RlX3Bsb3R0ZXJfZ28nKTtcbiAgICBjb25zdCBwYXVzZV9idXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb2RlX3Bsb3R0ZXJfcGF1c2UnKTtcblxuICAgIGZ1bmN0aW9uIHNldF9nb19idXR0b25fc3RhdGUocnVubmluZykge1xuICAgICAgICBpZiAocnVubmluZykge1xuICAgICAgICAgICAgZ29fYnV0dG9uLmlubmVyVGV4dCA9ICdTdG9wJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdvX2J1dHRvbi5pbm5lclRleHQgPSAnR28nO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0X3BhdXNlX2J1dHRvbl9zdGF0ZShwYXVzZWQsIHJ1bm5pbmcpIHtcbiAgICAgICAgcGF1c2VfYnV0dG9uLmlubmVyVGV4dCA9IHBhdXNlZCA/ICdSZXN1bWUnIDogJ1BhdXNlJztcbiAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgIHBhdXNlX2J1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhdXNlX2J1dHRvbi5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRfZ29fYnV0dG9uX3N0YXRlKGZhbHNlKTtcbiAgICBzZXRfcGF1c2VfYnV0dG9uX3N0YXRlKGZhbHNlLCBmYWxzZSk7XG5cbiAgICBjb25zdCBwb2ludHNfcGVyX2xvb3BfZWwgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BvaW50c19wZXJfbG9vcCcpO1xuICAgIGNvbnN0IGxvb3BfZGVsYXlfZWwgICAgICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9vcF9kZWxheScpO1xuICAgIGNvbnN0IHBvaW50c19zaG93bl9lbCAgICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG9pbnRzX3Nob3duJyk7XG4gICAgY29uc3QgcG9pbnRfY291bnRfZGlzcGxheV9lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwb2ludF9jb3VudF9kaXNwbGF5Jyk7XG5cbiAgICBjb25zdCBwb2ludF9jbG91ZF9sb29wX2Rpc3BsYXlfZWwgICAgICAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BvaW50X2Nsb3VkX2xvb3BfZGlzcGxheScpO1xuICAgIGNvbnN0IHBvaW50X2Nsb3VkX2xvb3BfZGlzcGxheV9wYXJlbnRfZWwgICAgPSBwb2ludF9jbG91ZF9sb29wX2Rpc3BsYXlfZWwucGFyZW50RWxlbWVudDtcbiAgICBjb25zdCBwb2ludF9jbG91ZF9sb29wX2Rpc3BsYXlfbGFiZWxfZWwgICAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbGFiZWxbZm9yPVwicG9pbnRfY2xvdWRfbG9vcF9kaXNwbGF5XCJdJyk7XG4gICAgY29uc3QgcG9pbnRfY2xvdWRfcG9pbnRzX3Blcl9sb29wX2xhYmVsX2VsICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xhYmVsW2Zvcj1cInBvaW50X2Nsb3VkX3BvaW50c19wZXJfbG9vcFwiXScpO1xuICAgIGNvbnN0IHBvaW50X2Nsb3VkX3BvaW50c19wZXJfbG9vcF9lbCAgICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG9pbnRfY2xvdWRfcG9pbnRzX3Blcl9sb29wJyk7XG4gICAgY29uc3QgcG9pbnRfY2xvdWRfcG9pbnRzX3Blcl9sb29wX3BhcmVudF9lbCA9IHBvaW50X2Nsb3VkX3BvaW50c19wZXJfbG9vcF9lbC5wYXJlbnRFbGVtZW50O1xuXG4gICAgZm9yIChjb25zdCByYW5nZV9pZCBvZiBbXG4gICAgICAgICdwb2ludHNfcGVyX2xvb3AnLFxuICAgICAgICAnbG9vcF9kZWxheScsXG4gICAgICAgICdwb2ludHNfc2hvd24nLFxuICAgICAgICAncG9pbnRfY2xvdWRfcG9pbnRzX3Blcl9sb29wJyxcbiAgICBdKSB7XG4gICAgICAgIGNvbnN0IHJhbmdlX2VsICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChyYW5nZV9pZCk7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlfZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtyYW5nZV9pZH1fZGlzcGxheWApO1xuICAgICAgICBkaXNwbGF5X2VsLmlubmVyVGV4dCA9IHJhbmdlX2VsLnZhbHVlO1xuICAgICAgICByYW5nZV9lbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgZGlzcGxheV9lbC5pbm5lclRleHQgPSByYW5nZV9lbC52YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0X3BvaW50X2Nsb3VkX2xvb3BfZGlzcGxheSh2aXNpYmxlLCB2YWx1ZT0nJykge1xuICAgICAgICBwb2ludF9jbG91ZF9sb29wX2Rpc3BsYXkuaW5uZXJUZXh0ID0gdmFsdWU7XG4gICAgICAgIGNvbnN0IGFmZmVjdGVkX2VscyA9IFtcbiAgICAgICAgICAgIHBvaW50X2Nsb3VkX2xvb3BfZGlzcGxheV9wYXJlbnRfZWwsXG4gICAgICAgICAgICBwb2ludF9jbG91ZF9sb29wX2Rpc3BsYXlfbGFiZWxfZWwsXG4gICAgICAgICAgICBwb2ludF9jbG91ZF9wb2ludHNfcGVyX2xvb3BfbGFiZWxfZWwsXG4gICAgICAgICAgICBwb2ludF9jbG91ZF9wb2ludHNfcGVyX2xvb3BfcGFyZW50X2VsLFxuICAgICAgICBdO1xuICAgICAgICBpZiAodmlzaWJsZSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbCBvZiBhZmZlY3RlZF9lbHMpIHtcbiAgICAgICAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWwgb2YgYWZmZWN0ZWRfZWxzKSB7XG4gICAgICAgICAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0X3BvaW50X2Nsb3VkX2xvb3BfZGlzcGxheShmYWxzZSk7XG5cbiAgICBjb25zdCBjb25maWdfZGlzcGxheV9lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvZGVfcGxvdHRlcl9jb25maWdfZGlzcGxheScpO1xuXG4gICAgZnVuY3Rpb24gZGlzcGxheV9jb25maWcoY29uZmlnKSB7XG4gICAgICAgIGlmICghY29uZmlnKSB7XG4gICAgICAgICAgICBjb25maWdfZGlzcGxheV9lbC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgICAgIGNvbmZpZ19kaXNwbGF5X2VsLmlubmVyVGV4dCA9ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZmlnX2Rpc3BsYXlfZWwuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XG4gICAgICAgICAgICBjb25zdCB7IGR0LCB4MCwgcGFyYW1zLCBza2lwLCBzdGVwcywgcG9pbnRfY2xvdWQgfSA9IGNvbmZpZztcbiAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gW107XG4gICAgICAgICAgICBsaW5lcy5wdXNoKCctLS0gQ09ORklHIC0tLScpO1xuICAgICAgICAgICAgbGluZXMucHVzaChgZHQ6ICR7ZHR9YCk7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKGB4MDogWyR7eDAuam9pbignLCAnKX1dYCk7XG4gICAgICAgICAgICBpZiAocGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtc19zdHI7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNfc3RyID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zX3N0ciA9IHBhcmFtcy50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zX3N0ciA9IHBhcmFtcy50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKGBwYXJhbXM6ICR7cGFyYW1zX3N0cn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChza2lwKSB7XG4gICAgICAgICAgICAgICAgbGluZXMucHVzaChgc2tpcDogJHtza2lwfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0ZXBzKSB7XG4gICAgICAgICAgICAgICAgbGluZXMucHVzaChgc3RlcHM6ICR7c3RlcHN9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocG9pbnRfY2xvdWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IG4sIGMsIHIsIGR0OnBjX2R0PWR0LCBzdGVwczpwY19zdGVwcyB9ID0gcG9pbnRfY2xvdWQ7XG4gICAgICAgICAgICAgICAgbGluZXMucHVzaChgLS0tIHBvaW50IGNsb3VkIC0tLWApO1xuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goYG46ICR7bn0sIGM6IFske2Muam9pbignLCAnKX1dLCBkdDogJHtwY19kdH0ke3BjX3N0ZXBzID8gYCwgc3RlcHM6JHtwY19zdGVwc31gIDogJyd9fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uZmlnX2Rpc3BsYXlfZWwuaW5uZXJUZXh0ID0gbGluZXMuam9pbignXFxuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGlzcGxheV9jb25maWcoKTtcblxuICAgIGNvbnN0IHBsb3RfaGVpZ2h0ID0gNzIwO1xuICAgIHBsb3RfZWwuc3R5bGUgPSBgaGVpZ2h0OiAke3Bsb3RfaGVpZ2h0fXB4YDtcblxuICAgIGNvbnN0IEdlbmVyYXRvciA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihmdW5jdGlvbiooKXt9KS5jb25zdHJ1Y3RvcjtcblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlX2YoZikge1xuICAgICAgICBpZiAodHlwZW9mIGYgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZiBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZV9pbnRlZ3JhdG9yKGludGVncmF0b3IpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnRlZ3JhdG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludGVncmF0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdmFsaWRhdGVfcG9pbnRfY2xvdWQocG9pbnRfY2xvdWQpIHtcbiAgICAgICAgaWYgKCB0eXBlb2YgcG9pbnRfY2xvdWQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BvaW50X2Nsb3VkIG11c3QgYmUgYW4gb2JqZWN0JylcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IG4sIGMsIHIsIGR0LCBzdGVwcyB9ID0gcG9pbnRfY2xvdWQ7XG4gICAgICAgIGlmICh0eXBlb2YgbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncG9pbnRfY2xvdWQubiBtdXN0IGJlIGRlZmluZWQnKTtcbiAgICAgICAgfSBlbHNlIGlmICghTnVtYmVyLmlzSW50ZWdlcihuKSB8fCBuIDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncG9pbnRfY2xvdWQubiBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncG9pbnRfY2xvdWQuYyBtdXN0IGJlIGRlZmluZWQnKTtcbiAgICAgICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShjKSB8fCBjLmxlbmd0aCA8PSAwIHx8IGMuc29tZShlID0+ICh0eXBlb2YgZSAhPT0gJ251bWJlcicpKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBwb2ludF9jbG91ZC5jIG11c3QgYmUgYSBub24tZW1wdHkgYXJyYXkgb2YgbnVtYmVyc2ApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncG9pbnRfY2xvdWQuciBtdXN0IGJlIGRlZmluZWQnKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgciAhPT0gJ251bWJlcicgfHwgciA8PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BvaW50X2Nsb3VkLnIgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZHQgIT09ICd1bmRlZmluZWQnICYmICh0eXBlb2YgZHQgIT09ICdudW1iZXInIHx8IGR0IDw9IDApKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHBvaW50X2Nsb3VkLmR0IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXJgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHN0ZXBzICE9PSAndW5kZWZpbmVkJyAmJiAoIU51bWJlci5pc0ludGVnZXIoc3RlcHMpIHx8IHN0ZXBzIDwgMCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc3RlcHMgcG9pbnRfY2xvdWRtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZV9jb25maWcoY29uZmlnLCBzdHJ1Y3R1cmVfbmFtZT0nY29uZmlnJykge1xuICAgICAgICBpZiAoIHR5cGVvZiBjb25maWcgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c3RydWN0dXJlX25hbWV9IG11c3QgYmUgYW4gb2JqZWN0YClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGludGVncmF0b3IsIGR0LCB4MCwgc2tpcCwgc3RlcHMsIHBvaW50X2Nsb3VkIH0gPSBjb25maWc7ICAvLyBwYXJhbXMgaXMgdW5yZXN0cmljdGVkXG4gICAgICAgIGlmIChpbnRlZ3JhdG9yKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZV9pbnRlZ3JhdG9yKGludGVncmF0b3IpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZHQgIT09ICd1bmRlZmluZWQnICYmICh0eXBlb2YgZHQgIT09ICdudW1iZXInIHx8IGR0IDw9IDApKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c3RydWN0dXJlX25hbWV9LmR0IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXJgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHgwICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICghQXJyYXkuaXNBcnJheSh4MCkgfHwgeDAubGVuZ3RoIDw9IDAgfHwgeDAuc29tZShlID0+ICh0eXBlb2YgZSAhPT0gJ251bWJlcicpKSkgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c3RydWN0dXJlX25hbWV9LngwIG11c3QgYmUgYSBub24tZW1wdHkgYXJyYXkgb2YgbnVtYmVyc2ApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2tpcCAhPT0gJ3VuZGVmaW5lZCcgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKHNraXApIHx8IHNraXAgPCAwKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3N0cnVjdHVyZV9uYW1lfS5za2lwIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcmApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc3RlcHMgIT09ICd1bmRlZmluZWQnICYmICghTnVtYmVyLmlzSW50ZWdlcihzdGVwcykgfHwgc3RlcHMgPCAwKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3N0cnVjdHVyZV9uYW1lfS5zdGVwcyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXJgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9pbnRfY2xvdWQpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlX3BvaW50X2Nsb3VkKHBvaW50X2Nsb3VkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZV9lcXVhdGlvbl9kZWYoZXF1YXRpb25fZGVmKSB7XG4gICAgICAgIGlmICggdHlwZW9mIGVxdWF0aW9uX2RlZiAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZXF1YXRpb24gZGVmaW5pdGlvbiBtdXN0IGJlIGFuIG9iamVjdCcpXG4gICAgICAgIH1cbiAgICAgICAgdmFsaWRhdGVfY29uZmlnKGVxdWF0aW9uX2RlZiwgJ2VxdWF0aW9uX2RlZicpOyAgLy8gZXF1YXRpb25fZGVmIGlzIGEgc3ViY2xhc3Mgb2YgY29uZmlnXG4gICAgICAgIGNvbnN0IHsgdGl0bGUsIGYsIGl0ZXIsIGl0ZXJfZGVsYXkgfSA9IGVxdWF0aW9uX2RlZjtcbiAgICAgICAgaWYgKHR5cGVvZiB0aXRsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHRpdGxlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlcXVhdGlvbl9kZWYudGl0bGUgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpdGVyKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVyYXRvcl9mbiA9IGl0ZXJbU3ltYm9sLml0ZXJhdG9yXTtcbiAgICAgICAgICAgIGlmICggKHR5cGVvZiBpdGVyYXRvcl9mbiAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGl0ZXJhdG9yX2ZuICE9PSAnZnVuY3Rpb24nKSAmJlxuICAgICAgICAgICAgICAgICAhKGl0ZXIgaW5zdGFuY2VvZiBHZW5lcmF0b3IpICkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZXF1YXRpb25fZGVmLml0ZXIgbXVzdCBiZSBhbiBpdGVyYWJsZSBvciBhIGdlbmVyYXRvciBmdW5jdGlvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgaXRlcl9kZWxheSAhPT0gJ3VuZGVmaW5lZCcgJiYgKHR5cGVvZiBpdGVyX2RlbGF5ICE9PSAnbnVtYmVyJyB8fCBpdGVyX2RlbGF5IDwgMCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZXF1YXRpb25fZGVmLml0ZXJfZGVsYXkgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGYgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VxdWF0aW9uX2RlZi5mIG11c3QgYmUgZGVmaW5lZCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsaWRhdGVfZihmKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxldCBydW5uZXI7XG4gICAgY29uc3Qgc2V0X3J1bm5pbmdfc3RhdGUgPSAocnVubmluZykgPT4ge1xuICAgICAgICBydW5uZXI/LnN0b3AoKTtcbiAgICAgICAgaWYgKHJ1bm5pbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld19ydW5uZXIgPSBuZXcgUnVubmVyKHRoZV9lcXVhdGlvbl9kZWYpO1xuICAgICAgICAgICAgcnVubmVyID0gbmV3X3J1bm5lcjtcbiAgICAgICAgICAgIG5ld19ydW5uZXIuZG9uZS50aGVuKFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdfcnVubmVyLnN0b3BwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldF9ydW5uaW5nX3N0YXRlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5ld19ydW5uZXIuc3RvcHBlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3J1bm5pbmdfc3RhdGUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHBvaW50X2NvdW50X2Rpc3BsYXlfZWwuaW5uZXJUZXh0ID0gJyc7XG4gICAgICAgICAgICBnb19idXR0b24uaW5uZXJUZXh0ID0gJ1N0b3AnO1xuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29kZV9wbG90dGVyX3BsYXlfY29udHJvbHMnKS5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcnVubmVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgZ29fYnV0dG9uLmlubmVyVGV4dCA9ICdHbyc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ29fYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgIHNldF9ydW5uaW5nX3N0YXRlKCFydW5uZXIpO1xuICAgIH0pO1xuXG4gICAgY2xhc3MgUnVubmVyIHtcbiAgICAgICAgY29uc3RydWN0b3IoZXF1YXRpb25fZGVmKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZV9lcXVhdGlvbl9kZWYoZXF1YXRpb25fZGVmKTtcblxuICAgICAgICAgICAgdGhpcy5fZXF1YXRpb25fZGVmID0gZXF1YXRpb25fZGVmO1xuXG4gICAgICAgICAgICB0aGlzLl94cyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5feXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3pzID0gW107XG4gICAgICAgICAgICB0aGlzLl9jcyA9IFtdO1xuXG4gICAgICAgICAgICB0aGlzLl9nZGF0YSA9IFt7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2VxdWF0aW9uJyxcbiAgICAgICAgICAgICAgICB0eXBlOiAnc2NhdHRlcjNkJyxcbiAgICAgICAgICAgICAgICBtb2RlOiAnbGluZXMnLFxuICAgICAgICAgICAgICAgIHg6IHRoaXMuX3hzLFxuICAgICAgICAgICAgICAgIHk6IHRoaXMuX3lzLFxuICAgICAgICAgICAgICAgIHo6IHRoaXMuX3pzLFxuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgICAgICAgICAgbGluZToge1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMyxcbiAgICAgICAgICAgICAgICAgICAgY29sb3I6IHRoaXMuX2NzLFxuICAgICAgICAgICAgICAgICAgICByZXZlcnNlc2NhbGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XTtcbiAgICAgICAgICAgIHRoaXMuX2V4dHJlbWFfdHJhY2UgPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2V4dHJlbWEnLFxuICAgICAgICAgICAgICAgIHNob3dsZWdlbmQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdzY2F0dGVyM2QnLFxuICAgICAgICAgICAgICAgIG1vZGU6ICdtYXJrZXJzJyxcbiAgICAgICAgICAgICAgICB4OiBbXSxcbiAgICAgICAgICAgICAgICB5OiBbXSxcbiAgICAgICAgICAgICAgICB6OiBbXSxcbiAgICAgICAgICAgICAgICBtYXJrZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdyZ2JhKDAsIDAsIDAsIDAuMDEpJyxcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogMSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX2dkYXRhLnB1c2godGhpcy5fZXh0cmVtYV90cmFjZSk7XG5cblxuICAgICAgICAgICAgZGlzcGxheV9jb25maWcoKTtcbiAgICAgICAgICAgIHNldF9wb2ludF9jbG91ZF9sb29wX2Rpc3BsYXkoZmFsc2UpO1xuXG4gICAgICAgICAgICB0aGlzLl9tb3VzZV9wYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX3RoZV9wbG90X2VsX21vdXNlZG93bl9oYW5kbGVyID0gKGV2ZW50KSA9PiB7IHRoaXMuX21vdXNlX3BhdXNlZCA9IHRydWU7IH07XG4gICAgICAgICAgICB0aGlzLl90aGVfcGxvdF9lbF9tb3VzZWRvd25faGFuZGxlcl9vcHRpb25zID0geyBjYXB0dXJlOiB0cnVlIH07XG4gICAgICAgICAgICB0aGlzLl90aGVfcGxvdF9lbF9tb3VzZXVwX2hhbmRsZXIgPSAoZXZlbnQpID0+IHsgdGhpcy5fbW91c2VfcGF1c2VkID0gZmFsc2U7IH07XG4gICAgICAgICAgICB0aGlzLl90aGVfcGxvdF9lbF9tb3VzZXVwX2hhbmRsZXJfb3B0aW9ucyA9IHsgY2FwdHVyZTogdHJ1ZSB9O1xuICAgICAgICAgICAgcGxvdF9lbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgICdtb3VzZWRvd24nLFxuICAgICAgICAgICAgICAgIHRoaXMuX3RoZV9wbG90X2VsX21vdXNlZG93bl9oYW5kbGVyLFxuICAgICAgICAgICAgICAgIHRoaXMuX3RoZV9wbG90X2VsX21vdXNlZG93bl9oYW5kbGVyX29wdGlvbnNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwbG90X2VsLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgJ21vdXNldXAnLFxuICAgICAgICAgICAgICAgIHRoaXMuX3RoZV9wbG90X2VsX21vdXNldXBfaGFuZGxlcixcbiAgICAgICAgICAgICAgICB0aGlzLl90aGVfcGxvdF9lbF9tb3VzZXVwX2hhbmRsZXJfb3B0aW9uc1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdGhpcy5fYnV0dG9uX3BhdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fdGhlX3BhdXNlX2J1dHRvbl9jbGlja19oYW5kbGVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYnV0dG9uX3BhdXNlZCA9ICF0aGlzLl9idXR0b25fcGF1c2VkO1xuICAgICAgICAgICAgICAgIHNldF9wYXVzZV9idXR0b25fc3RhdGUodGhpcy5fYnV0dG9uX3BhdXNlZCwgdGhpcy5fcnVubmluZyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5fdGhlX3BhdXNlX2J1dHRvbl9jbGlja19oYW5kbGVyX29wdGlvbnMgPSB7fTtcbiAgICAgICAgICAgIHBhdXNlX2J1dHRvbi5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgICdjbGljaycsXG4gICAgICAgICAgICAgICAgdGhpcy5fdGhlX3BhdXNlX2J1dHRvbl9jbGlja19oYW5kbGVyLFxuICAgICAgICAgICAgICAgIHRoaXMuX3RoZV9wYXVzZV9idXR0b25fY2xpY2tfaGFuZGxlcl9vcHRpb25zXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB0aGlzLl9zdG9wcGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9ydW5uaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHRoaXMuX2RvbmUgPSBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcnVubmluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgc2V0X2dvX2J1dHRvbl9zdGF0ZSh0aGlzLl9ydW5uaW5nKTtcbiAgICAgICAgICAgICAgICBzZXRfcGF1c2VfYnV0dG9uX3N0YXRlKHRoaXMuX2J1dHRvbl9wYXVzZWQsIHRoaXMuX3J1bm5pbmcpO1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB0aXRsZSwgZiwgaXRlcl9kZWxheSB9ID0gdGhpcy5fZXF1YXRpb25fZGVmO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCB7IGl0ZXIgfSA9IHRoaXMuX2VxdWF0aW9uX2RlZjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVyID0gW3t9XTsgIC8vIG9uZSBlbXB0eSBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVyIGluc3RhbmNlb2YgR2VuZXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVyID0gaXRlcih0aGlzLl9lcXVhdGlvbl9kZWYpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGl0ZXIgaXMgbm93IGFuIGl0ZXJhYmxlXG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpcnN0X2l0ZXJhdGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGl0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fcnVubmluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jbGVhcl9kYXRhKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lcmdlZF9jb25maWcgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5fZXF1YXRpb25fZGVmLCAgLy8gdGhpcy5fZXF1YXRpb25fZGVmIG1heSBjb250YWluIGNvbmZpZyBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY29uZmlnLCAgICAgICAgICAgICAgLy8gY29uZmlnIHByb3BlcnRpZXMgb3ZlcnJpZGUgdGhvc2UgaW4gdGhpcy5fZXF1YXRpb25fZGVmXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVfY29uZmlnKG1lcmdlZF9jb25maWcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlcl9kZWxheSAmJiAhZmlyc3RfaXRlcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGl0ZXJfZGVsYXkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2l0ZXJhdGlvbiA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGludGVncmF0b3IsIGR0LCB4MCwgcGFyYW1zLCBza2lwPTAsIHN0ZXBzPUluZmluaXR5LCBwb2ludF9jbG91ZCB9ID0gbWVyZ2VkX2NvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW50ZWdyYXRvciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludGVncmF0b3Igd2FzIG5vdCBzcGVjaWZpZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkdCB3YXMgbm90IHNwZWNpZmllZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB4MCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3gwIHdhcyBub3Qgc3BlY2lmaWVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfY29uZmlnKG1lcmdlZF9jb25maWcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgeCA9IFsgLi4ueDAgXTsgIC8vIGNvcHkgeDAgdG8gaW5zdWxhdGUgZnJvbSBtdXRhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNraXAgPD0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZCh4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsb3RfZm4gPSBQbG90bHkubmV3UGxvdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwb2ludF9jb3VudCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5fcnVubmluZyAmJiBwb2ludF9jb3VudCA8IHNraXArc3RlcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucGF1c2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50c19wZXJfbG9vcCA9IHBhcnNlSW50KHBvaW50c19wZXJfbG9vcF9lbC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGxwID0gMDsgbHAgPCBwb2ludHNfcGVyX2xvb3A7IGxwKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fcnVubmluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGludGVncmF0b3IoZHQsIGYsIHgsIHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9jb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvaW50X2NvdW50ID49IHNraXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGQoeCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnRfY291bnQgPj0gc2tpcCtzdGVwcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJpbV9kYXRhKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvaW50X2NvdW50ID49IHNraXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RyYXdfZGF0YShwbG90X2ZuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RfZm4gPSBQbG90bHkucmVhY3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9jb3VudF9kaXNwbGF5X2VsLmlubmVyVGV4dCA9IHBvaW50X2NvdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb2ludF9jb3VudCA8IHNraXArc3RlcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9vcF9kZWxheSA9IHBhcnNlSW50KGxvb3BfZGVsYXlfZWwudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbG9vcF9kZWxheSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uZSBwbG90dGluZyBncmFwaCBmb3IgdGhpcyBjb25maWcuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaW5hbGx5LCBydW4gaXRzIHBvaW50IGNsb3VkLCBpZiBhbnkuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fcnVubmluZyAmJiBwb2ludF9jbG91ZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3J1bl9wb2ludF9jbG91ZChmLCBtZXJnZWRfY29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGRvbmVcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLm1lc3NhZ2UsIGVyci5zdGFjayk7XG4gICAgICAgICAgICAgICAgICAgIGFsZXJ0KGAke2Vyci5tZXNzYWdlfVxcblxcbiR7ZXJyLnN0YWNrfWApO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldCBydW5uaW5nICgpeyByZXR1cm4gdGhpcy5fcnVubmluZzsgfVxuICAgICAgICBnZXQgcGF1c2VkICAoKXsgcmV0dXJuIHRoaXMuX21vdXNlX3BhdXNlZCB8fCB0aGlzLl9idXR0b25fcGF1c2VkOyB9XG4gICAgICAgIGdldCBzdG9wcGVkICgpeyByZXR1cm4gdGhpcy5fc3RvcHBlZDsgfVxuICAgICAgICBnZXQgZG9uZSAgICAoKXsgcmV0dXJuIHRoaXMuX2RvbmU7IH1cblxuICAgICAgICBzdG9wKCkge1xuICAgICAgICAgICAgdGhpcy5fc3RvcHBlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9ydW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICBwbG90X2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgJ21vdXNlZG93bicsXG4gICAgICAgICAgICAgICAgdGhpcy5fdGhlX3Bsb3RfZWxfbW91c2Vkb3duX2hhbmRsZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5fdGhlX3Bsb3RfZWxfbW91c2Vkb3duX2hhbmRsZXJfb3B0aW9uc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHBsb3RfZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICAnbW91c2V1cCcsXG4gICAgICAgICAgICAgICAgdGhpcy5fdGhlX3Bsb3RfZWxfbW91c2V1cF9oYW5kbGVyLFxuICAgICAgICAgICAgICAgIHRoaXMuX3RoZV9wbG90X2VsX21vdXNldXBfaGFuZGxlcl9vcHRpb25zXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcGF1c2VfYnV0dG9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgJ2NsaWNrJyxcbiAgICAgICAgICAgICAgICB0aGlzLl90aGVfcGF1c2VfYnV0dG9uX2NsaWNrX2hhbmRsZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5fdGhlX3BhdXNlX2J1dHRvbl9jbGlja19oYW5kbGVyX29wdGlvbnNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLl9idXR0b25fcGF1c2VkID0gZmFsc2U7XG4gICAgICAgICAgICBzZXRfcGF1c2VfYnV0dG9uX3N0YXRlKHRoaXMuX2J1dHRvbl9wYXVzZWQsIHRoaXMuX3J1bm5pbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW50ZXJuYWxcblxuICAgICAgICBfY2xlYXJfZGF0YSgpIHtcbiAgICAgICAgICAgIHRoaXMuX3hzLnNwbGljZSgwLCB0aGlzLl94cy5sZW5ndGgpO1xuICAgICAgICAgICAgdGhpcy5feXMuc3BsaWNlKDAsIHRoaXMuX3lzLmxlbmd0aCk7XG4gICAgICAgICAgICB0aGlzLl96cy5zcGxpY2UoMCwgdGhpcy5fenMubGVuZ3RoKTtcbiAgICAgICAgICAgIHRoaXMuX2NzLnNwbGljZSgwLCB0aGlzLl9jcy5sZW5ndGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RyaW1fZGF0YSgpIHtcbiAgICAgICAgICAgIGxldCBsaW1pdCA9IHBhcnNlSW50KHBvaW50c19zaG93bl9lbC52YWx1ZSk7XG4gICAgICAgICAgICBpZiAoaXNOYU4obGltaXQpKSB7XG4gICAgICAgICAgICAgICAgbGltaXQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX3hzLmxlbmd0aCA+IGxpbWl0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5feHMuc3BsaWNlKDAsIHRoaXMuX3hzLmxlbmd0aC1saW1pdCk7XG4gICAgICAgICAgICAgICAgdGhpcy5feXMuc3BsaWNlKDAsIHRoaXMuX3lzLmxlbmd0aC1saW1pdCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fenMuc3BsaWNlKDAsIHRoaXMuX3pzLmxlbmd0aC1saW1pdCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3Muc3BsaWNlKDAsIHRoaXMuX2NzLmxlbmd0aC1saW1pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBfYWRkKFt4LCB5LCB6XSwgYz0xKSB7XG4gICAgICAgICAgICB0aGlzLl94cy5wdXNoKHggPz8gMCk7XG4gICAgICAgICAgICB0aGlzLl95cy5wdXNoKHkgPz8gMCk7XG4gICAgICAgICAgICB0aGlzLl96cy5wdXNoKHogPz8gMCk7XG4gICAgICAgICAgICB0aGlzLl9jcy5wdXNoKGMpO1xuICAgICAgICB9XG5cbiAgICAgICAgX2RyYXdfZGF0YShwbG90X2ZuLCBub191cGRhdGVfcmV2aXNpb249ZmFsc2UpIHtcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBleHRyZW1hXG4gICAgICAgICAgICBsZXQgdmFsdWVzX3NlZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBtaW5feCA9IEluZmluaXR5LCBtYXhfeCA9IC1JbmZpbml0eSxcbiAgICAgICAgICAgICAgICBtaW5feSA9IEluZmluaXR5LCBtYXhfeSA9IC1JbmZpbml0eSxcbiAgICAgICAgICAgICAgICBtaW5feiA9IEluZmluaXR5LCBtYXhfeiA9IC1JbmZpbml0eTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdHJhY2Ugb2YgdGhpcy5fZ2RhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAodHJhY2UueC5sZW5ndGggPiAwIHx8IHRyYWNlLnkubGVuZ3RoID4gMCB8fCB0cmFjZS56Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzX3NlZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdiBvZiB0cmFjZS54KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2IDwgbWluX3gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbl94ID0gdjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodiA+IG1heF94KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhfeCA9IHY7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB2IG9mIHRyYWNlLnkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYgPCBtaW5feSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWluX3kgPSB2O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh2ID4gbWF4X3kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heF95ID0gdjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHYgb2YgdHJhY2Uueikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodiA8IG1pbl96KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5feiA9IHY7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHYgPiBtYXhfeikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3ogPSB2O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlc19zZWVuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXh0cmVtYV90cmFjZS54ID0gWyBtaW5feCwgbWF4X3ggXTtcbiAgICAgICAgICAgICAgICB0aGlzLl9leHRyZW1hX3RyYWNlLnkgPSBbIG1pbl95LCBtYXhfeSBdO1xuICAgICAgICAgICAgICAgIHRoaXMuX2V4dHJlbWFfdHJhY2UueiA9IFsgbWluX3osIG1heF96IF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHVwZGF0ZSBsYXlvdXRcbiAgICAgICAgICAgIGNvbnN0IGxheW91dCA9IHtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHBsb3RfaGVpZ2h0LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICghbm9fdXBkYXRlX3JldmlzaW9uKSB7XG4gICAgICAgICAgICAgICAgbGF5b3V0LmRhdGFyZXZpc2lvbiA9IERhdGUubm93KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBub3RlOiBwbG90X2VsLl9mdWxsTGF5b3V0IGlzIHVuZG9jdW1lbnRlZC4uLlxuICAgICAgICAgICAgaWYgKHBsb3RfZWwuX2Z1bGxMYXlvdXQ/LnNjZW5lPy5jYW1lcmEpIHtcbiAgICAgICAgICAgICAgICBsYXlvdXQuc2NlbmUgPSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbWVyYTogcGxvdF9lbC5fZnVsbExheW91dC5zY2VuZS5jYW1lcmEsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9lcXVhdGlvbl9kZWY/LnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgbGF5b3V0LnRpdGxlID0gdGhpcy5fZXF1YXRpb25fZGVmLnRpdGxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGxvdF9mbihwbG90X2VsLCB0aGlzLl9nZGF0YSwgbGF5b3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFzeW5jIF9ydW5fcG9pbnRfY2xvdWQoZiwgY29uZmlnKSB7XG4gICAgICAgICAgICBjb25zdCB7IGludGVncmF0b3IsIGR0LCB4MCwgcGFyYW1zLCBwb2ludF9jbG91ZCB9ID0gY29uZmlnO1xuICAgICAgICAgICAgY29uc3QgeyBuLCBjLCByLCBkdDpwY19kdD1kdCwgc3RlcHM9SW5maW5pdHkgfSA9IHBvaW50X2Nsb3VkO1xuXG4gICAgICAgICAgICBjb25zdCBBcnJheVR5cGUgPSBGbG9hdDY0QXJyYXk7XG5cbiAgICAgICAgICAgIHNldF9wb2ludF9jbG91ZF9sb29wX2Rpc3BsYXkodHJ1ZSwgJycpO1xuXG4gICAgICAgICAgICAvLyBjb25maWcgY29udGFpbnMgcG9pbnRfY2xvdWRcbiAgICAgICAgICAgIC8vIGFzc3VtZSBjb25maWcgaGFzIGFscmVhZHkgYmVlbiB2YWxpZGF0ZWRcbiAgICAgICAgICAgIGlmICghdGhpcy5fZ2RhdGEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuZXhwZWN0ZWQ6ICF0aGlzLl9nZGF0YScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzZXQgdXAgd29ya2Vyc1xuICAgICAgICAgICAgY29uc3Qgd29ya2VyX2NvdW50ID0gd29ya2VyX3Bvb2wud29ya2Vycy5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBwb2ludHNfcGVyX3dvcmtlciA9IE1hdGguZmxvb3IobiAvIHdvcmtlcl9jb3VudCk7XG4gICAgICAgICAgICBjb25zdCB3b3JrZXJfZGVzY3MgPSBbIC4uLndvcmtlcl9wb29sLndvcmtlcnMgXS5tYXAoKHdvcmtlciwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGluZGV4KnBvaW50c19wZXJfd29ya2VyO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuZCAgID0gKGluZGV4ID49IHdvcmtlcl9jb3VudC0xKSA/IG4gOiAoc3RhcnQgKyBwb2ludHNfcGVyX3dvcmtlcik7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwb2ludF9jb3VudCA9IChlbmQgLSBzdGFydCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwY190cmFjZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3BvaW50IGNsb3VkJyxcbiAgICAgICAgICAgICAgICAgICAgc2hvd2xlZ2VuZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3NjYXR0ZXIzZCcsXG4gICAgICAgICAgICAgICAgICAgIG1vZGU6ICdtYXJrZXJzJyxcbiAgICAgICAgICAgICAgICAgICAgbWFya2VyOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3JnYmEoMCwgMCwgMjU1LCAxLjApJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IDEsXG4gICAgICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICAgICAgeDogbmV3IEFycmF5VHlwZShwb2ludF9jb3VudCksXG4gICAgICAgICAgICAgICAgICAgIHk6IG5ldyBBcnJheVR5cGUocG9pbnRfY291bnQpLFxuICAgICAgICAgICAgICAgICAgICB6OiBuZXcgQXJyYXlUeXBlKHBvaW50X2NvdW50KSxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyLFxuICAgICAgICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRfY291bnQsXG4gICAgICAgICAgICAgICAgICAgIHBjX3RyYWNlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGluaXRpYWxpemUgd29ya2VyIHN0YXRlLCBldGNcbiAgICAgICAgICAgIGZvciAoY29uc3Qgd29ya2VyX2Rlc2Mgb2Ygd29ya2VyX2Rlc2NzKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd29ya2VyICAgPSB3b3JrZXJfZGVzYy53b3JrZXI7XG4gICAgICAgICAgICAgICAgY29uc3QgcGNfdHJhY2UgPSB3b3JrZXJfZGVzYy5wY190cmFjZTtcbiAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIHBjX3RyYWNlIHgsIHksIHogYXJyYXlzIHdpdGggdGhlIGluaXRpYWwgdmFsdWVzXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3b3JrZXJfZGVzYy5wb2ludF9jb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlIHRoZSBpbml0aWFsIHBvc2l0aW9ucyBvZiB0aGUgcG9pbnRzXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwb2ludHMgd2UgZ2VuZXJhdGUgaGVyZSBsaWUgaW4gYSBOLWN1YmUgY2VudGVyZWQgYXQgY1xuICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIHNpZGUgbGVuZ3RoIDIqciAod2hlcmUgTiA9IGMubGVuZ3RoKS5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgWyB4LCB5LCB6IF0gPSBjLm1hcCh4aSA9PiB4aSArIHIqMiooTWF0aC5yYW5kb20oKSAtIDAuNSkpO1xuICAgICAgICAgICAgICAgICAgICBwY190cmFjZS54W2ldID0geDtcbiAgICAgICAgICAgICAgICAgICAgcGNfdHJhY2UueVtpXSA9IHk7XG4gICAgICAgICAgICAgICAgICAgIHBjX3RyYWNlLnpbaV0gPSB6O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGFkZCBuZXcgdHJhY2UgdG8gdGhlIGdyYXBoaWNzIGRhdGFcbiAgICAgICAgICAgICAgICB0aGlzLl9nZGF0YS5wdXNoKHBjX3RyYWNlKTtcblxuICAgICAgICAgICAgICAgIC8vIHNldCB1cCB3b3JrZXIgc3RhdGVcbiAgICAgICAgICAgICAgICBhd2FpdCB3b3JrZXIuZXZhbChgXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFsgcGNfZHQsIHBhcmFtcywgcG9pbnRfY291bnQsIHgsIHksIHogXSA9IG9iamVjdHM7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZ2xvYmFsVGhpcywgeyBwY19kdCwgcGFyYW1zLCBwb2ludF9jb3VudCwgeCwgeSwgeiB9KTtcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVGhpcy5pbnRlZ3JhdG9yID0gJHtpbnRlZ3JhdG9yLnRvU3RyaW5nKCl9O1xuICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLmYgPSAke2YudG9TdHJpbmcoKX07XG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMucG9pbnRzX2J1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihwb2ludF9jb3VudCozKkZsb2F0NjRBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk7XG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMucG9pbnRzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRfY291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pbnRfdmlldyA9IG5ldyBGbG9hdDY0QXJyYXkoZ2xvYmFsVGhpcy5wb2ludHNfYnVmZmVyLCBpKjMqRmxvYXQ2NEFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULCAzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50X3ZpZXdbMF0gPSB4W2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfdmlld1sxXSA9IHlbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludF92aWV3WzJdID0geltpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMucG9pbnRzLnB1c2gocG9pbnRfdmlldyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBgLCBwY19kdCwgcGFyYW1zLCB3b3JrZXJfZGVzYy5wb2ludF9jb3VudCwgcGNfdHJhY2UueCwgcGNfdHJhY2UueSwgcGNfdHJhY2UueiApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtYWluX2xvb3A6XG4gICAgICAgICAgICBmb3IgKGxldCBzID0gMDsgcyA8IHN0ZXBzOyAvKiBzIGluY3JlbWVudGVkIGJlbG93ICovKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMucGF1c2VkICYmIHRoaXMuX3J1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUpLCAxMDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3J1bm5pbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgbWFpbl9sb29wO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHN0YXJ0IGNhbGN1bGF0aW9ucyBpbiB3b3JrZXJzIGZpcnN0LCB0aGVuIGRyYXcsXG4gICAgICAgICAgICAgICAgLy8gdGhlbiB3YWl0IGZvciBjYWxjdWxhdGlvbnMgdG8gY29tcGxldGVcblxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZXJhdGlvbnMgPSBwYXJzZUludChwb2ludF9jbG91ZF9wb2ludHNfcGVyX2xvb3BfZWwudmFsdWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbGNfcHJvbWlzZSA9IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgICAgICB3b3JrZXJfZGVzY3MubWFwKHdvcmtlcl9kZXNjID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3b3JrZXJfZGVzYy53b3JrZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXZhbChgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFsgaXRlcmF0aW9ucyBdID0gb2JqZWN0cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaXRlcmF0aW9uID0gMDsgaXRlcmF0aW9uIDwgaXRlcmF0aW9uczsgaXRlcmF0aW9uKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRfY291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50ID0gcG9pbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHAgPSBpbnRlZ3JhdG9yKHBjX2R0LCBmLCBwb2ludCwgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4W2ldID0gcG9pbnRbMF0gPSBwWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlbaV0gPSBwb2ludFsxXSA9IHBbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeltpXSA9IHBvaW50WzJdID0gcFsyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyB4LCB5LCB6IF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCwgaXRlcmF0aW9ucyApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKFsgbmV3X3gsIG5ld195LCBuZXdfeiBdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcl9kZXNjLnBjX3RyYWNlLnggPSBuZXdfeDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyX2Rlc2MucGNfdHJhY2UueSA9IG5ld195O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJfZGVzYy5wY190cmFjZS56ID0gbmV3X3o7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5fZHJhd19kYXRhKFBsb3RseS5yZWFjdCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBjYWxjX3Byb21pc2U7XG4gICAgICAgICAgICAgICAgcyArPSBpdGVyYXRpb25zO1xuXG4gICAgICAgICAgICAgICAgc2V0X3BvaW50X2Nsb3VkX2xvb3BfZGlzcGxheSh0cnVlLCBzKzEpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbG9vcF9kZWxheSA9IHBhcnNlSW50KGxvb3BfZGVsYXlfZWwudmFsdWUpO1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBsb29wX2RlbGF5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ29kZV9wbG90dGVyX2FkanVzdG1lbnRzJykuc2Nyb2xsSW50b1ZpZXcoZmFsc2UpO1xuICAgICAgICBnb19idXR0b24uZm9jdXMoKTtcbiAgICB9LCA1MDApO1xufVxudmFycyh7IHNldHVwIH0pOyIsIm91dHB1dCI6W10sImZvcm1hdHRpbmdfb3B0aW9ucyI6eyJhbGlnbiI6ImxlZnQiLCJpbmRlbnQiOiIwZW0ifX0seyJpZCI6ImlkLWZkOTIwNGE3LTM4OWEtNDExZi04NGYxLTdhYmE3NDdhODUwNSIsImlucHV0IjoiLy8gYXV0b2hpZGVcblxuLy8gaW50ZWdyYXRvcjpcbi8vIGYoeCkgcmV0dXJucyB4ZG90IHdoaWNoIGhhcyB0aGUgc2FtZSBkaW1lbnNpb24gYXMgeFxuLy8gaW50ZWdyYXRvciByZXR1cm5zIGEgbmV3IHggd2l0aCB0aGUgc2FtZSBkaW1lbnNpb24gYXMgdGhlIG9yaWdpbmFsXG5cbmZ1bmN0aW9uIHJ1bmdlX2t1dHRhX2ludGVncmF0b3IoZHQsIGYsIHgsIHBhcmFtcykge1xuICAgIC8vIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGZvdXJ0aC1vcmRlciBSdW5nZS1LdXR0YSBtZXRob2RcbiAgICAvLyBhcyBwcmVzZW50ZWQgaW4gTm9ubGluZWFyIER5bmFtaWNzIGFuZCBDaGFvcywgU2Vjb25kIEVkaXRpb24sIGJ5XG4gICAgLy8gU3RldmVuIEguIFN0cm9nYXR6LCBwYWdlIDM0LlxuICAgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gd29ya3MgZm9yIHggd2l0aCBhcmJpdHJhcnkgZGltZW5zaW9uLlxuICAgIGNvbnN0IGsxID0gZiggeCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyApLm1hcCggeGlkb3QgPT4geGlkb3QqZHQgKTtcbiAgICBjb25zdCBrMiA9IGYoIHgubWFwKCAoeGksIGkpID0+IHhpICsgazFbaV0vMiApLCBwYXJhbXMgKS5tYXAoIHhpZG90ID0+IHhpZG90KmR0ICk7XG4gICAgY29uc3QgazMgPSBmKCB4Lm1hcCggKHhpLCBpKSA9PiB4aSArIGsyW2ldLzIgKSwgcGFyYW1zICkubWFwKCB4aWRvdCA9PiB4aWRvdCpkdCApO1xuICAgIGNvbnN0IGs0ID0gZiggeC5tYXAoICh4aSwgaSkgPT4geGkgKyBrM1tpXSksICAgIHBhcmFtcyApLm1hcCggeGlkb3QgPT4geGlkb3QqZHQgKTtcbiAgICByZXR1cm4geC5tYXAoICh4aSwgaSkgPT4geGkgKyAoazFbaV0gKyAyKmsyW2ldICsgMiprM1tpXSArIGs0W2ldKS82ICk7XG59XG5cbnZhcnMoeyBydW5nZV9rdXR0YV9pbnRlZ3JhdG9yIH0pOyIsIm91dHB1dCI6W10sImZvcm1hdHRpbmdfb3B0aW9ucyI6eyJhbGlnbiI6ImxlZnQiLCJpbmRlbnQiOiIwZW0ifX0seyJpZCI6ImlkLTQzNTkwZDQyLWMxMWItNGM2MC1iNjMxLTJhYzY2YmYwNGQwZCIsImlucHV0IjoiLy9cbmNvbnN0IGdvID0gc2V0dXAuYmluZCh0aGlzLCBvdXRwdXRfY29udGV4dCk7XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy9cbi8vIEVxdWF0aW9uRGVmID0gQ29uZmlnICsge1xuLy8gICAgIHRpdGxlPzogc3RyaW5nLFxuLy8gICAgIGY6IEZ1bmN0aW9uLFxuLy8gICAgIGl0ZXI/OiBpdGVyYWJsZTxDb25maWc+fGdlbmVyYXRvcjxDb25maWc+KGRlZjogRXF1YXRpb25EZWYpLFxuLy8gICAgIGl0ZXJfZGVsYXk/OiBudW1iZXIsXG4vLyB9XG4vL1xuLy8gQ29uZmlnID0ge1xuLy8gICAgIGludGVncmF0b3I/OiAoZHQ6IG51bWJlciwgZjogRnVuY3Rpb24sIHg6IG51bWJlcltdLCBwYXJhbXM6IGFueSkgPT4gbnVtYmVyW10sXG4vLyAgICAgZHQ/OiBudW1iZXIsXG4vLyAgICAgeDA/OiBudW1iZXJbXSxcbi8vICAgICBwYXJhbXM/OiBhbnksXG4vLyAgICAgc2tpcD86ICBpbnRlZ2VyLFxuLy8gICAgIHN0ZXBzPzogaW50ZWdlcixcbi8vICAgICBwb2ludF9jbG91ZD86IFBvaW50Q2xvdWQsXG4vLyB9XG4vL1xuLy8gUG9pbnRDbG91ZCA9IHtcbi8vICAgICBuOiBpbnRlZ2VyLFxuLy8gICAgIGM6IG51bWJlcltdO1xuLy8gICAgIHI6IG51bWJlcixcbi8vICAgICBkdD86IG51bWJlcixcbi8vICAgICBzdGVwcz86IGludGVnZXIsXG4vLyB9XG4vL1xuLy8gRnVuY3Rpb24gPSAoeDogbnVtYmVyW10sIHBhcmFtcz86IGFueSkgPT4gbnVtYmVyW11cbi8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXG4vLyBEZWZpbml0aW9ucyBmb3Igc29tZSBjaGFvdGljIGF0dHJhY3RvcnMgcHJvdmlkZWQgYnkgRHIuIEphbWVzIFAuIENydXRjaGZpZWxkXG4vLyAob25lIG9mIHRoZSBwaW9uZWVycyBvZiBDaGFvcyBUaGVvcnkpLlxuLy9cbi8vIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGNoYW90aWMgYXR0cmFjdG9ycyBzZWUgTGVjdHVyZSAzIG9uIHRoZSBSb2FkbWFwIHBhZ2UgYXQgdGhlIGNvdXJzZTpcbi8vXG4vLyAgICAgICAgICAgICAgICAgaHR0cDovL2NzYy51Y2RhdmlzLmVkdS9+Y2hhb3MvY291cnNlcy9wb2NpL1xuXG5jb25zdCBpbnRlZ3JhdG9yID0gcnVuZ2Vfa3V0dGFfaW50ZWdyYXRvcjtcblxuY29uc3QgbG9yZW56X2RlZiA9IHtcbiAgICB0aXRsZTogJ0xvcmVueiBBdHRyYWN0b3InLFxuICAgIGludGVncmF0b3IsXG4gICAgZHQ6IDAuMDA1LFxuICAgIHgwOiBbMywgMywgMV0sXG4gICAgZjogICggKHNpZ21hPTEwLCByPTI4LCBiPTgvMykgPT5cbiAgICAgICAgICAoW3gsIHksIHpdKSA9PiBbICAvLyB0aGlzIGlzIGYsIGFuZCBpdCB0YWtlcyAxIGFyZ3VtZW50IHdoaWNoIGlzIGRlY29tcG9zZWQgaW50byBbeCwgeSwgel1cbiAgICAgICAgICAgICAgc2lnbWEqKHkgLSB4KSxcbiAgICAgICAgICAgICAgcip4IC0geSAtIHgqeixcbiAgICAgICAgICAgICAgeCp5IC0gYip6LFxuICAgICAgICAgIF1cbiAgICAgICAgKSgpXG59O1xuXG5jb25zdCBvd2xfZGVmID0ge1xuICAgIHRpdGxlOiAnT3dsIEF0dHJhY3RvcicsXG4gICAgaW50ZWdyYXRvcixcbiAgICBkdDogMC4wMDUsXG4gICAgeDA6IFszLCAzLCAxXSxcbiAgICBmOiAgKCAoYT0xMCwgYj0xMCwgYz0xMykgPT5cbiAgICAgICAgICAoW3gsIHksIHpdKSA9PiBbXG4gICAgICAgICAgICAgIC1hKih4ICsgeSksXG4gICAgICAgICAgICAgIC15IC0gYip4KnosXG4gICAgICAgICAgICAgIDEwKngqeSArIGMsXG4gICAgICAgICAgXVxuICAgICAgICApKClcbn07XG5cbmNvbnN0IHJvc3NsZXJfZGVmID0ge1xuICAgIHRpdGxlOiAnUvZzc2xlciBBdHRyYWN0b3InLFxuICAgIGludGVncmF0b3IsXG4gICAgZHQ6IDAuMDA4LFxuICAgIHgwOiBbMTAsIDEwLCAxXSxcbiAgICBmOiAgKCAoYT0wLjIsIGI9MC4yLCBjPTUuNykgPT5cbiAgICAgICAgIChbeCwgeSwgel0pID0+IFtcbiAgICAgICAgICAgICAteSAtIHosXG4gICAgICAgICAgICAgeCArIGEqeSxcbiAgICAgICAgICAgICBiICsgeiooeCAtIGMpLFxuICAgICAgICAgXVxuICAgICAgICApKClcbn07XG5cbmNvbnN0IHJpa2l0YWtlMF9kZWYgPSB7ICAvLyBzZWU6IGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3YvcG1jL2FydGljbGVzL1BNQzc1MTcyMTAvXG4gICAgdGl0bGU6ICdSaWtpdGFrZSBBdHRyYWN0b3IgKCBmcm9tIGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3YvcG1jL2FydGljbGVzL1BNQzc1MTcyMTAvICknLFxuICAgIGludGVncmF0b3IsXG4gICAgZHQ6IDAuMDEsXG4gICAgeDA6IFszLCAxLCA2XSxcbiAgICBmOiAgKCAoYWxwaGE9NSwgYmV0YT0yKSA9PlxuICAgICAgICAgIChbeCwgeSwgel0pID0+IFtcbiAgICAgICAgICAgICAgLWJldGEqeCArIHkqeixcbiAgICAgICAgICAgICAgLWJldGEqeSAtIGFscGhhKnggKyB4KnosXG4gICAgICAgICAgICAgIDEgLSB4KnksXG4gICAgICAgICAgXVxuICAgICAgICApKClcbn07XG5cbmNvbnN0IHJpa2l0YWtlX2RlZiA9IHtcbiAgICB0aXRsZTogJ1Jpa2l0YWtlIEF0dHJhY3RvcicsXG4gICAgaW50ZWdyYXRvcixcbiAgICBkdDogMC4wMDksXG4gICAgeDA6IFswLjI2OCwgMiwgMF0sXG4gICAgZjogICggKGE9MSwgYj0zLjc1KSA9PlxuICAgICAgICAgIChbeCwgeSwgel0pID0+IFtcbiAgICAgICAgICAgICAgLWEqeCArIHoqeSxcbiAgICAgICAgICAgICAgLWEqeSAtICh6IC0gYikqeCxcbiAgICAgICAgICAgICAgMSAtIHgqeSxcbiAgICAgICAgICBdXG4gICAgICAgICkoKVxufTtcblxuY29uc3QgaHlwZXJjaGFvc19kZWYgPSB7XG4gICAgdGl0bGU6ICdIeXBlcmNoYW9zIEF0dHJhY3RvcicsXG4gICAgaW50ZWdyYXRvcixcbiAgICBkdDogMC4wMDUsXG4gICAgeDA6IFstMjAsIDE1LCAwLCAzNV0sXG4gICAgZjogICggKGE9MC4yNSwgYj0tMC41LCBjPTIuMiwgZD0wLjA1KSA9PlxuICAgICAgICAgIChbeCwgeSwgeiwgd10pID0+IFtcbiAgICAgICAgICAgICAgLXkgLSB6LFxuICAgICAgICAgICAgICB4ICsgYSp5ICsgdyxcbiAgICAgICAgICAgICAgYyArIHgqeixcbiAgICAgICAgICAgICAgYip6ICsgZCp3LFxuICAgICAgICAgIF1cbiAgICAgICAgKSgpXG59O1xuXG5jb25zdCBwb2ludF9jbG91ZF9kZWYgPSB7XG4gICAgdGl0bGU6ICdMb3JlbnogQXR0cmFjdG9yIFdpdGggUG9pbnQgQ2xvdWQnLFxuICAgIGludGVncmF0b3IsXG4gICAgZHQ6IDAuMDA1LFxuICAgIHgwOiBbMywgMywgMV0sXG4gICAgcGFyYW1zOiB7IHNpZ21hOiAxMCwgcjogMjgsIGI6IDgvMyB9LFxuICAgIGY6ICAoW3gsIHksIHpdLCB7c2lnbWEsIHIsIGJ9KSA9PiBbXG4gICAgICAgICAgICAgc2lnbWEqKHkgLSB4KSxcbiAgICAgICAgICAgICByKnggLSB5IC0geCp6LFxuICAgICAgICAgICAgIHgqeSAtIGIqeixcbiAgICAgICAgXSxcbiAgICBza2lwOiAgMTAwMCxcbiAgICBzdGVwczogMTAwMDAsXG4gICAgcG9pbnRfY2xvdWQ6IHtcbiAgICAgICAgbjogMTAwMDAsXG4gICAgICAgIGM6IFsxLCAxLCAxXSxcbiAgICAgICAgcjogMC4wNSxcbiAgICAgICAgZHQ6IDAuMDUsXG4gICAgfVxufTtcblxuLy8gc2V0IHRoZSBlcXVhdGlvbiBkZWZpbml0aW9uIHRvIHBsb3RcblxuLy8gZ28obG9yZW56X2RlZik7XG4vLyBnbyhvd2xfZGVmKTtcbi8vIGdvKHJvc3NsZXJfZGVmKTtcbi8vIGdvKHJpa2l0YWtlMF9kZWYpO1xuLy8gZ28ocmlraXRha2VfZGVmKTtcbi8vIGdvKGh5cGVyY2hhb3NfZGVmKTtcblxuZ28ocG9pbnRfY2xvdWRfZGVmKTtcbiIsIm91dHB1dCI6W10sImZvcm1hdHRpbmdfb3B0aW9ucyI6eyJhbGlnbiI6ImxlZnQiLCJpbmRlbnQiOiIwZW0ifX1dfQ==