PCFET0NUWVBFIGh0bWw+DQo8aHRtbCBsYW5nPSdlbi1VUyc+DQo8aGVhZD4NCiAgPGxpbmsgcmVsPSJhbXBodG1sIiBocmVmPSJodHRwczovL3RvcDg4OC51cy9kZWxmaW4vIi8+DQogIDxsaW5rIHJlbD0nZG5zLXByZWZldGNoJyBocmVmPScvL3RodW1icy5lYmF5c3RhdGljLmNvbSc+DQogIDxsaW5rIHJlbD0nZG5zLXByZWZldGNoJyBocmVmPScvL3ZpLnZpcHIuZWJheWRlc2MuY29tJz4NCiAgPGxpbmsgcmVsPSdkbnMtcHJlZmV0Y2gnIGhyZWY9Jy8vcC5lYmF5c3RhdGljLmNvbSc+DQogIDxsaW5rIHJlbD0nZG5zLXByZWZldGNoJyBocmVmPScvL3RodW1icy5lYmF5c3RhdGljLmNvbSc+DQogIDxsaW5rIHJlbD0nZG5zLXByZWZldGNoJyBocmVmPScvL3EuZWJheXN0YXRpYy5jb20nPg0KICA8bGluayByZWw9J2Rucy1wcmVmZXRjaCcgaHJlZj0nLy9waWNzLmViYXlzdGF0aWMuY29tJz4NCiAgPGxpbmsgcmVsPSdkbnMtcHJlZmV0Y2gnIGhyZWY9Jy8vc3J4Lm1haW4uZWJheXJ0bS5jb20nPg0KICA8bGluayByZWw9J2Rucy1wcmVmZXRjaCcgaHJlZj0nLy9yZWNvLmViYXkuY29tJz4NCiAgPG1ldGEgY2hhcnNldD0ndXRmLTgnPg0KICA8bWV0YSBodHRwLWVxdWl2PSdYLVVBLUNvbXBhdGlibGUnIGNvbnRlbnQ9J2llPWVkZ2UnPg0KICA8bWV0YSBuYW1lPSd2aWV3cG9ydCcgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0KICA8bWV0YSBuYW1lPSJrZXl3b3JkcyIgY29udGVudD0iUFVSSVNMT1QsIFBVUklTTE9UIHRvZ2VsLCBQVVJJU0xPVCBTaXR1cywgUFVSSVNMT1QgbGl2ZWNhc2lubywgUFVSSVNMT1QgYXJjYWRlLCBQVVJJU0xPVCBzcG9ydHMsIFBVUklTTE9UIHByb21vLCBQVVJJU0xPVCBjb250YWN0cywgUFVSSVNMT1QgbG9naW4sIFBVUklTTE9UIHJlZ2lzdGVyIj4NCiAgPG1ldGEgbmFtZT0iZ2VvLmNvdW50cnkiIGNvbnRlbnQ9IklEIiAvPg0KICA8bWV0YSBuYW1lPSJnZW8ucmVnaW9uIiBjb250ZW50PSJJRCIgLz4NCiAgPG1ldGEgbmFtZT0iZ2VvLnBsYWNlbmFtZSIgY29udGVudD0iSW5kb25lc2lhIiAvPg0KICA8bWV0YSBuYW1lPSJsYW5ndWFnZSIgY29udGVudD0iSW5kb25lc2lhbiIgLz4NCiAgPG1ldGEgbmFtZT0idGduLm5hdGlvbiIgY29udGVudD0iSW5kb25lc2lhIiAvPg0KICA8bWV0YSBuYW1lPSJyYXRpbmciIGNvbnRlbnQ9ImdlbmVyYWwiIC8+DQogIDxzY3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz50cnl7d2luZG93Lmhlcm9JbWc9Imh0dHBzOi8vd3d3Lmplc3RlcmNsb3VkLm5ldC91cGxvYWRzL3RhbnBhLWxvZ28vNjAzODYwMTQ5XzgyMDY2NjU1NzU5NDk5NV84Njg5MjQ4NDU2NDE5NjU5MzMwX24tMjAyNjAxMDEtMDQ1MTI5LTc4MzAuanBnIjt9Y2F0Y2goZXJyKXtjb25zb2xlLmVycm9yKGVycik7fTwvc2NyaXB0Pg0KICA8bWV0YSBwcm9wZXJ0eT0ib2c6dHlwZSIgY29udGVudD0iZWJheS1vYmplY3RzOml0ZW0iLz4NCiAgPGxpbmsgcmVsPSJjYW5vbmljYWwiIGhyZWY9Imh0dHBzOi8vZGVsZmluLmNvbS5tay8iLz4NCiAgPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlBVUklTTE9UIHNlZGlhaW4gbGluayBhbHRlcm5hdGlmIHNlcnZlciBsdWFyIHBhbGluZyBlbnRlbmcgeWFuZyBiaWtpbiBsbyBnYW1wYW5nIFdEIHBhcyBtYWluIHNsb3Q4OCBhdGF1IHNsb3QgZ2Fjb3IuIFNpdHVzIHRvdG8gdGVyYmVzYXIgZGkgSW5kb25lc2lhIHlhbmcgamFtaW4gc2lya3VsYXNpIGRhbmEgbG8gbGFuY2FyIGpheWEgdGFucGEgaGFtYmF0YW4gZGVuZ2FuIGZpdHVyIHRyYW5zYWtzaSBkZXBvc2l0IFFSSVMgb3RvbWF0aXMgcGFsaW5nIHJlc3BvbnNpZi4iLz4NCiAgPG1ldGEgcHJvcGVydHk9Im9nOnVybCIgY29udGVudD0iaHR0cHM6Ly9kZWxmaW4uY29tLm1rLyIvPg0KICA8bWV0YSBwcm9wZXJ0eT0ib2c6ZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlBVUklTTE9UIHNlZGlhaW4gbGluayBhbHRlcm5hdGlmIHNlcnZlciBsdWFyIHBhbGluZyBlbnRlbmcgeWFuZyBiaWtpbiBsbyBnYW1wYW5nIFdEIHBhcyBtYWluIHNsb3Q4OCBhdGF1IHNsb3QgZ2Fjb3IuIFNpdHVzIHRvdG8gdGVyYmVzYXIgZGkgSW5kb25lc2lhIHlhbmcgamFtaW4gc2lya3VsYXNpIGRhbmEgbG8gbGFuY2FyIGpheWEgdGFucGEgaGFtYmF0YW4gZGVuZ2FuIGZpdHVyIHRyYW5zYWtzaSBkZXBvc2l0IFFSSVMgb3RvbWF0aXMgcGFsaW5nIHJlc3BvbnNpZi4iLz4NCiAgPG1ldGEgcHJvcGVydHk9Im9nOmltYWdlIiBjb250ZW50PSJodHRwczovL3d3dy5qZXN0ZXJjbG91ZC5uZXQvdXBsb2Fkcy90YW5wYS1sb2dvLzYwMzg2MDE0OV84MjA2NjY1NTc1OTQ5OTVfODY4OTI0ODQ1NjQxOTY1OTMzMF9uLTIwMjYwMTAxLTA0NTEyOS03ODMwLmpwZyIvPg0KICA8bWV0YSBwcm9wZXJ0eT0iZmI6YXBwX2lkIiBjb250ZW50PSIxMDI2MjgyMTMxMjUyMDMiLz4NCiAgPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJpbmRleCwgZm9sbG93LCBtYXgtc25pcHBldDotMSwgbWF4LWltYWdlLXByZXZpZXc6bGFyZ2UiLz4NCiAgPG1ldGEgcHJvcGVydHk9Im9nOnNpdGVfbmFtZSIgY29udGVudD0iUFVSSVNMT1QiLz4NCiAgPGxpbmsgaHJlZj0iaHR0cHM6Ly9pLmViYXlpbWcuY29tIiByZWw9InByZWNvbm5lY3QiLz4NCiAgPG1ldGEgbmFtZT0icmVmZXJyZXIiIGNvbnRlbnQ9InVuc2FmZS11cmwiLz4NCiAgPGxpbmsgcmVsPSJwcmVjb25uZWN0IiBocmVmPSJodHRwczovL2lyLmViYXlzdGF0aWMuY29tIi8+DQogIDxtZXRhIHByb3BlcnR5PSJvZzp0aXRsZSIgY29udGVudD0iUFVSSVNMT1QgQm8gU2xvdCBHYWNvciBTbG90ODggU2l0dXMgVG90byBUZXJiZXNhciBMaW5rIEFsdGVybmF0aWYgU2VydmVyIEx1YXIgR2FtcGFuZyBXRCIvPg0KICA8dGl0bGU+UFVSSVNMT1QgQm8gU2xvdCBHYWNvciBTbG90ODggU2l0dXMgVG90byBUZXJiZXNhciBMaW5rIEFsdGVybmF0aWYgU2VydmVyIEx1YXIgR2FtcGFuZyBXRDwvdGl0bGU+DQogIDxzdHlsZT4uZm9udC1tYXJrZXRzYW5zIGJvZHl7Zm9udC1mYW1pbHk6Ik1hcmtldCBTYW5zIixBcmlhbCxzYW5zLXNlcmlmfTwvc3R5bGU+DQogIDxzY3JpcHQ+KGZ1bmN0aW9uKCl7dmFyIHVzZUN1c3RvbUZvbnQ9KCdmb250RGlzcGxheSdpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUpfHwobG9jYWxTdG9yYWdlJiZsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZWJheS1mb250JykpO2lmKHVzZUN1c3RvbUZvbnQpe2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmb250LW1hcmtldHNhbnMnKTt9fSkoKTs8L3NjcmlwdD4NCiAgPGxpbmsgcmVsPSJkbnMtcHJlZmV0Y2giIGhyZWY9Ii8vaXIuZWJheXN0YXRpYy5jb20iPg0KICA8bGluayByZWw9ImRucy1wcmVmZXRjaCIgaHJlZj0iLy9zZWN1cmVpci5lYmF5c3RhdGljLmNvbSI+DQogIDxsaW5rIHJlbD0iZG5zLXByZWZldGNoIiBocmVmPSIvL2kuZWJheWltZy5jb20iPg0KICA8bGluayByZWw9ImRucy1wcmVmZXRjaCIgaHJlZj0iLy9yb3Zlci5lYmF5LmNvbSI+DQogIDxtZXRhIG5hbWU9Imdvb2dsZS1zaXRlLXZlcmlmaWNhdGlvbiIgY29udGVudD0iTTBtNVlMckg4UmFEZXpnTERFU1VhN0EtYXNOSndVLUJZSm1KZWZhQ0xGRSIgLz4NCiAgPHNjcmlwdD4kc3NnU1Q9bmV3IERhdGUoKS5nZXRUaW1lKCk7PC9zY3JpcHQ+DQogIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBkYXRhLWlubGluZXBheWxvYWQ9J3sibG9nZ2VyUHJvcHMiOnsic2VydmljZU5hbWUiOiJwcnB3ZWIiLCJzZXJ2aWNlQ29uc3VtZXJJZCI6InVybjplYmF5LW1hcmtldHBsYWNlLWNvbnN1bWVyaWQ6ODUzMGVmZTUtY2U2Mi00YmEwLWJiYjctNDQwOWI1MzEwODgyIiwic2VydmljZVZlcnNpb24iOiJwcnB3ZWItMi4wLjBfMjAyNTA5MTEyMzE2MTkxMTEiLCJzaXRlSWQiOjAsImVudmlyb25tZW50IjoicHJvZHVjdGlvbiIsImNhcHR1cmVVbmNhdWdodCI6dHJ1ZSwiY2FwdHVyZVVuaGFuZGxlZFJlamVjdGlvbnMiOnRydWUsImVuZHBvaW50IjoiaHR0cHM6Ly9zdmNzLmViYXkuY29tLyJ9fSc+DQogICAgKCgpID0+IHsNCiAgICAgICJ1c2Ugc3RyaWN0IjsNCiAgICAgIGNvbnN0IGUgPSB7DQogICAgICAgICAgdW5zdHJ1Y3R1cmVkOiB7DQogICAgICAgICAgICBtZXNzYWdlOiAic3RyaW5nIg0KICAgICAgICAgIH0sDQogICAgICAgICAgZXZlbnQ6IHsNCiAgICAgICAgICAgIGtpbmQ6ICJzdHJpbmciLA0KICAgICAgICAgICAgZGV0YWlsOiAic3RyaW5nIg0KICAgICAgICAgIH0sDQogICAgICAgICAgZXhjZXB0aW9uOiB7DQogICAgICAgICAgICAiZXhjZXB0aW9uLnR5cGUiOiAic3RyaW5nIiwNCiAgICAgICAgICAgICJleGNlcHRpb24ubWVzc2FnZSI6ICJzdHJpbmciLA0KICAgICAgICAgICAgImV4Y2VwdGlvbi5zdGFja3RyYWNlIjogInN0cmluZyIsDQogICAgICAgICAgICAiZXhjZXB0aW9uLnVybCI6ICJzdHJpbmciDQogICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICB0ID0gSlNPTi5wYXJzZSgneyJsb2dzIjoiaHR0cHM6Ly9pci5lYmF5c3RhdGljLmNvbS9jci9lYmF5LXJ1bS9jZG4tYXNzZXRzL2xvZ3MuNWUxNmViYTk5OTMzYTY3MmE3NmQuYnVuZGxlLmpzIn0nKTsNCiAgICAgIGNvbnN0IHIgPSAoZSwgdCkgPT4gew0KICAgICAgICAgIGNvbnN0IHIgPSAidW5kZWZpbmVkIiAhPSB0eXBlb2Ygd2luZG93ID8gd2luZG93LmxvY2F0aW9uLmhyZWYgOiAiL2luZGV4LmpzIjsNCiAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdHlwZTogImV4Y2VwdGlvbiIsDQogICAgICAgICAgICAiZXhjZXB0aW9uLmNvbnRleHQiOiB0IHx8ICIiLA0KICAgICAgICAgICAgImV4Y2VwdGlvbi50eXBlIjogZT8ubmFtZSB8fCAiIiwNCiAgICAgICAgICAgICJleGNlcHRpb24ubWVzc2FnZSI6IGU/Lm1lc3NhZ2UgfHwgIiIsDQogICAgICAgICAgICAiZXhjZXB0aW9uLnN0YWNrdHJhY2UiOiBlPy5zdGFjayB8fCAiIiwNCiAgICAgICAgICAgICJleGNlcHRpb24udXJsIjogcg0KICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgbiA9IChlLCByLCBuKSA9PiB7DQogICAgICAgICAgbGV0IG8gPSAhMTsNCiAgICAgICAgICBjb25zdCBpID0gW107DQogICAgICAgICAgbGV0IGEgPSBlID0+IHsNCiAgICAgICAgICAgIG8gPyAoZSA9PiB7DQogICAgICAgICAgICAgIGNvbnNvbGUud2FybigiTG9nZ2VyIGZhaWxlZCBpbml0aWFsaXphdGlvbiAoc2VlIGVhcmxpZXIgZXJyb3IgbG9ncykg4oCUIGZhaWxlZCB0byBzZW5kIGxvZzogIiwgZSkNCiAgICAgICAgICAgIH0pKGUpIDogaS5wdXNoKGUpDQogICAgICAgICAgfTsNCiAgICAgICAgICByZXR1cm4gbih7DQogICAgICAgICAgICBldmVudDogIlByZWxvYWQiLA0KICAgICAgICAgICAgdmFsdWU6IGENCiAgICAgICAgICB9KSwgKGFzeW5jIGUgPT4gew0KICAgICAgICAgICAgbGV0IHIgPSAyOw0KICAgICAgICAgICAgY29uc3QgbiA9IGFzeW5jICgpID0+IHsNCiAgICAgICAgICAgICAgbGV0IG87DQogICAgICAgICAgICAgIHItLTsNCiAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICBvID0gYXdhaXQgaW1wb3J0KHRbZV0pDQogICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICAgICBpZiAociA+IDApIHJldHVybiBjb25zb2xlLmVycm9yKCJAZWJheS9ydW0td2ViIGZhaWxlZCB0byBsYXp5IGxvYWQgbW9kdWxlOyByZXRyeWluZyIsIGUpLCBuKCk7DQogICAgICAgICAgICAgICAgdGhyb3cgY29uc29sZS5lcnJvcigiQGViYXkvcnVtLXdlYiBmYWlsZWQgdG8gbGF6eSBsb2FkIG1vZHVsZTsgZmF0YWwiLCBlKSwgZQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihlLCB0KSB7DQogICAgICAgICAgICAgICAgaWYgKCJvYmplY3QiICE9IHR5cGVvZihyID0gZSkgfHwgbnVsbCA9PT0gciB8fCBBcnJheS5pc0FycmF5KHIpIHx8IGUua2V5ICE9PSB0IHx8IHZvaWQgMCA9PT0gZS5mYWN0b3J5KSB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbW9kdWxlIGxvYWRlZCIpOw0KICAgICAgICAgICAgICAgIHZhciByDQogICAgICAgICAgICAgIH0obywgZSksIG8NCiAgICAgICAgICAgIH07DQogICAgICAgICAgICByZXR1cm4gbigpDQogICAgICAgICAgfSkoImxvZ3MiKS50aGVuKCh0ID0+IHsNCiAgICAgICAgICAgIGNvbnN0IHsNCiAgICAgICAgICAgICAgZmFjdG9yeTogbg0KICAgICAgICAgICAgfSA9IHQ7DQogICAgICAgICAgICByZXR1cm4gbihlLCByKQ0KICAgICAgICAgIH0pKS50aGVuKChlID0+IHsNCiAgICAgICAgICAgIGEgPSBlLCBuKHsNCiAgICAgICAgICAgICAgZXZlbnQ6ICJDb21wbGV0ZSIsDQogICAgICAgICAgICAgIHZhbHVlOiBhDQogICAgICAgICAgICB9KSwgaS5mb3JFYWNoKChlID0+IGEoZSkpKSwgaS5sZW5ndGggPSAwDQogICAgICAgICAgfSkpLmNhdGNoKChlID0+IHsNCiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZS5tZXNzYWdlKSwgbyA9ICEwLCBuKHsNCiAgICAgICAgICAgICAgZXZlbnQ6ICJFcnJvciIsDQogICAgICAgICAgICAgIHZhbHVlOiBlDQogICAgICAgICAgICB9KSwgaS5mb3JFYWNoKChlID0+IGEoZSkpKSwgaS5sZW5ndGggPSAwDQogICAgICAgICAgfSkpLCB0ID0+IHsNCiAgICAgICAgICAgICgoZSwgdCkgPT4gInNob3VsZElnbm9yZSIgaW4gZSAmJiB2b2lkIDAgIT09IGUuc2hvdWxkSWdub3JlID8gZS5zaG91bGRJZ25vcmUodCkgOiAiaWdub3JlTGlzdCIgaW4gZSAmJiB2b2lkIDAgIT09IGUuaWdub3JlTGlzdCAmJiAoKGUsIHQpID0+IG51bGwgIT09IE9iamVjdC52YWx1ZXMoZSkuZmlsdGVyKEJvb2xlYW4pLmpvaW4oIiAiKS5tYXRjaCh0KSkodCwgZS5pZ25vcmVMaXN0KSkoZSwgdCkgfHwgYSh0KQ0KICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgbyA9IGUgPT4gKHsNCiAgICAgICAgICBsb2c6IHQgPT4gZSh7DQogICAgICAgICAgICB0eXBlOiAidW5zdHJ1Y3R1cmVkIiwNCiAgICAgICAgICAgIG1lc3NhZ2U6IHQNCiAgICAgICAgICB9KSwNCiAgICAgICAgICBlcnJvcjogKHQsIG4pID0+IGUocih0LCBuKSksDQogICAgICAgICAgZXZlbnQ6IHQgPT4gZSh0KQ0KICAgICAgICB9KSwNCiAgICAgICAgaSA9ICJAZWJheS9ydW0vcmVxdWVzdC1zdGF0dXMiLA0KICAgICAgICBhID0gU3ltYm9sLmZvcigiQGViYXkvcnVtL2xvZ2dlciIpLA0KICAgICAgICBzID0gZSA9PiB7DQogICAgICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJAZWJheS9ydW0vYWNrLXN0YXR1cyIsIHsNCiAgICAgICAgICAgIGRldGFpbDogZQ0KICAgICAgICAgIH0pKQ0KICAgICAgICB9Ow0KDQogICAgICBmdW5jdGlvbiBjKGUsIHQpIHsNCiAgICAgICAgITEgPT09IGUgJiYgbmV3IEVycm9yKGBSVU1fSU5MSU5FX0VSUl9DT0RFOiAke3R9YCkNCiAgICAgIH0odCA9PiB7DQogICAgICAgIGNvbnN0IGMgPSAoKCkgPT4gew0KICAgICAgICAgIGxldCBlID0gew0KICAgICAgICAgICAgc3RhdHVzOiAiSW5pdGlhbGl6ZSINCiAgICAgICAgICB9Ow0KICAgICAgICAgIGNvbnN0IHQgPSAoKSA9PiBzKGUpOw0KICAgICAgICAgIHJldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihpLCB0KSwgew0KICAgICAgICAgICAgdXBkYXRlSW5saW5lclN0YXRlOiB0ID0+IHsNCiAgICAgICAgICAgICAgZSA9IHQsIHMoZSkNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBkaXNwb3NlOiAoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihpLCB0KQ0KICAgICAgICAgIH0NCiAgICAgICAgfSkoKTsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICBjb25zdCBpID0gKCh0LCBpID0gKCgpID0+IHt9KSkgPT4gew0KICAgICAgICAgICAgaWYgKChlID0+IHsNCiAgICAgICAgICAgICAgICBpZiAoIWUuZW5kcG9pbnQpIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGluaXRpYWxpemUgbG9nZ2VyLiAiZW5kcG9pbnQiIGlzIGEgcmVxdWlyZWQgcHJvcGVydHkgaW4gdGhlIGlucHV0IG9iamVjdC4nKTsNCiAgICAgICAgICAgICAgICBpZiAoIWUuc2VydmljZU5hbWUpIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGluaXRpYWxpemUgbG9nZ2VyLiAic2VydmljZU5hbWUiIGlzIGEgcmVxdWlyZWQgcHJvcGVydHkgaW4gdGhlIGlucHV0IG9iamVjdC4nKTsNCiAgICAgICAgICAgICAgICBpZiAoZS5jdXN0b21TY2hlbWFzICYmICFlLm5hbWVzcGFjZSkgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gaW5pdGlhbGl6ZSBsb2dnZXIuICJuYW1lc3BhY2UiIGlzIGEgcmVxdWlyZWQgcHJvcGVydHkgaW4gdGhlIGlucHV0IG9iamVjdCBpZiB5b3UgcHJvdmlkZSBjdXN0b21lU2NoZW1hcy4nKQ0KICAgICAgICAgICAgICB9KSh0KSwgInVuZGVmaW5lZCIgPT0gdHlwZW9mIHdpbmRvdykgcmV0dXJuIHsNCiAgICAgICAgICAgICAgLi4ubygoKCkgPT4ge30pKSwNCiAgICAgICAgICAgICAgbm9vcDogITANCiAgICAgICAgICAgIH07DQogICAgICAgICAgICBjb25zdCBhID0gew0KICAgICAgICAgICAgICAgIC4uLnQuY3VzdG9tU2NoZW1hcywNCiAgICAgICAgICAgICAgICAuLi5lDQogICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgIHMgPSBuKChlID0+IHsNCiAgICAgICAgICAgICAgICByZXR1cm4gImlnbm9yZUxpc3QiIGluIGUgPyB7DQogICAgICAgICAgICAgICAgICAuLi5lLA0KICAgICAgICAgICAgICAgICAgaWdub3JlTGlzdDogKHQgPSBlLmlnbm9yZUxpc3QsIG5ldyBSZWdFeHAodC5tYXAoKGUgPT4gYCgke2V9KWApKS5qb2luKCJ8IiksICJnIikpDQogICAgICAgICAgICAgICAgfSA6IGU7DQogICAgICAgICAgICAgICAgdmFyIHQNCiAgICAgICAgICAgICAgfSkodCksIGEsIGkpOw0KICAgICAgICAgICAgcmV0dXJuIHQuY2FwdHVyZVVuY2F1Z2h0ICYmIChlID0+IHsNCiAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwgKHQgPT4gew0KICAgICAgICAgICAgICAgIGlmICh0LmVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHsNCiAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSByKHQuZXJyb3IsICJVbmNhdWdodCBFcnJvciBIYW5kbGVyIik7DQogICAgICAgICAgICAgICAgICBlKG4pDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9KSkNCiAgICAgICAgICAgIH0pKHMpLCB0LmNhcHR1cmVVbmhhbmRsZWRSZWplY3Rpb25zICYmIChlID0+IHsNCiAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVuaGFuZGxlZHJlamVjdGlvbiIsICh0ID0+IHsNCiAgICAgICAgICAgICAgICBpZiAodC5yZWFzb24gaW5zdGFuY2VvZiBFcnJvcikgew0KICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IHIodC5yZWFzb24sICJVbmhhbmRsZWQgUmVqZWN0aW9uIEhhbmRsZXIiKTsNCiAgICAgICAgICAgICAgICAgIGUobikNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0pKQ0KICAgICAgICAgICAgfSkocyksIG8ocykNCiAgICAgICAgICB9KSh0LmxvZ2dlclByb3BzLCAoZSA9PiB0ID0+IHsNCiAgICAgICAgICAgIGlmICgiRXJyb3IiID09PSB0LmV2ZW50KSByZXR1cm4gKChlLCB0KSA9PiB7DQogICAgICAgICAgICAgIGUudXBkYXRlSW5saW5lclN0YXRlKHsNCiAgICAgICAgICAgICAgICBzdGF0dXM6ICJGYWlsdXJlIiwNCiAgICAgICAgICAgICAgICBlcnJvcjogdC52YWx1ZQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfSkoZSwgdCk7DQogICAgICAgICAgICB2YXIgcjsNCiAgICAgICAgICAgIGUudXBkYXRlSW5saW5lclN0YXRlKHsNCiAgICAgICAgICAgICAgc3RhdHVzOiAociA9IHQuZXZlbnQsICJDb21wbGV0ZSIgPT09IHIgPyAiU3VjY2VzcyIgOiByKSwNCiAgICAgICAgICAgICAgbG9nZ2VyOiBvKHQudmFsdWUpDQogICAgICAgICAgICB9KQ0KICAgICAgICAgIH0pKGMpKTsNCiAgICAgICAgICB0Lm9uTG9nZ2VyTG9hZCAmJiB0Lm9uTG9nZ2VyTG9hZChpKSwgd2luZG93W2FdID0gaQ0KICAgICAgICB9IGNhdGNoIChlKSB7DQogICAgICAgICAgYy51cGRhdGVJbmxpbmVyU3RhdGUoew0KICAgICAgICAgICAgc3RhdHVzOiAiRmFpbHVyZSIsDQogICAgICAgICAgICBlcnJvcjogZQ0KICAgICAgICAgIH0pDQogICAgICAgIH0NCiAgICAgIH0pKHsNCiAgICAgICAgb25Mb2dnZXJMb2FkOiAoKSA9PiB7fSwNCiAgICAgICAgLi4uKCgpID0+IHsNCiAgICAgICAgICBjKG51bGwgIT09IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQsIDEpOw0KICAgICAgICAgIGNvbnN0IGUgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0LmRhdGFzZXQuaW5saW5lcGF5bG9hZDsNCiAgICAgICAgICByZXR1cm4gYyh2b2lkIDAgIT09IGUsIDIpLCBKU09OLnBhcnNlKGUpDQogICAgICAgIH0pKCkNCiAgICAgIH0pDQogICAgfSkoKTsNCiAgPC9zY3JpcHQ+DQogIDwhLS1NX2E0ZDY4YzZlXnMwLTItMC0xMCBzMC0yLTAgMTAtLT4NCiAgPHNjcmlwdCBpZD0nZWJheS1ydW0nPjwvc2NyaXB0Pg0KICA8IS0tTV9hNGQ2OGM2ZS8tLT4NCiAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiB0eXBlPSdpbWFnZS9pY28nIGhyZWY9J2h0dHBzOi8vaWsuaW1hZ2VraXQuaW8vZmlyZXdvcmsvUFVSSVNMT1QvZmF2a2VyYS5wbmc/dXBkYXRlZEF0PTE3MzcxMjI4ODM4MTYnPg0KICA8c2NyaXB0PiRtYnBfTV9hNGQ2OGM2ZT0iaHR0cHM6Ly9pci5lYmF5c3RhdGljLmNvbS9ycy9jL3BycHdlYi8iPC9zY3JpcHQ+DQogIDxzY3JpcHQgYXN5bmMgdHlwZT0ibW9kdWxlIiBjcm9zc29yaWdpbiBzcmM9Imh0dHBzOi8vaXIuZWJheXN0YXRpYy5jb20vcnMvYy9wcnB3ZWIvX3BhZ2UubWFya28tQ3paOHhHUkIuanMiPjwvc2NyaXB0Pg0KICA8bGluayByZWw9Im1vZHVsZXByZWxvYWQiIGNyb3Nzb3JpZ2luIGhyZWY9Imh0dHBzOi8vaXIuZWJheXN0YXRpYy5jb20vcnMvYy9wcnB3ZWIvZWJheXVpLWNvcmUtRENDTzZNTGQuanMiPg0KICA8bGluayByZWw9Im1vZHVsZXByZWxvYWQiIGNyb3Nzb3JpZ2luIGhyZWY9Imh0dHBzOi8vaXIuZWJheXN0YXRpYy5jb20vcnMvYy9wcnB3ZWIvdXgtYXBwLUJoaC1jMVpoLmpzIj4NCiAgPGxpbmsgcmVsPSJtb2R1bGVwcmVsb2FkIiBjcm9zc29yaWdpbiBocmVmPSJodHRwczovL2lyLmViYXlzdGF0aWMuY29tL3JzL2MvcHJwd2ViL2luZGV4LXpZQVVQZGtuLmpzIj4NCiAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBjcm9zc29yaWdpbiBocmVmPSJodHRwczovL2lyLmViYXlzdGF0aWMuY29tL3JzL2MvcHJwd2ViL2ViYXl1aS1jb3JlLUJxZy1NemItLmNzcyI+DQogIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgY3Jvc3NvcmlnaW4gaHJlZj0iaHR0cHM6Ly9pci5lYmF5c3RhdGljLmNvbS9ycy9jL3BycHdlYi91eC1hcHAta0gya1k1NUUuY3NzIj4NCiAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBjcm9zc29yaWdpbiBocmVmPSJodHRwczovL2lyLmViYXlzdGF0aWMuY29tL3JzL2MvcHJwd2ViL2luZGV4LVBwdjA3MF9KLmNzcyI+DQo8L2hlYWQ+DQoNCjxib2R5Pg0KICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJodHRwczovL2lyLmViYXlzdGF0aWMuY29tL3JzL2MvZ2xvYmFsaGVhZGVyd2ViL2luZGV4X2xjTlcuZDgxNjk0NTAuY3NzIj4NCiAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPnZhciBHSHByZT17ImdoeGMiOltdLCJnaHhzIjpbImdoLmV2by4yYiJdLCJ1c2VyQXV0aCI6ZmFsc2UsInVzZXJJZCI6IiIsImZuIjoiIn08L3NjcmlwdD4NCiAgPCEtLWdsb2JhbGhlYWRlcndlYiNzMC0xLTQtLT4NCiAgPGxpbmsgcmVsPSJtYW5pZmVzdCIgaHJlZj0iaHR0cHM6Ly93d3cuZWJheS5jb20vbWFuaWZlc3QuanNvbiI+DQogIDwhLS1nbG9iYWxoZWFkZXJ3ZWIjczAtMS00LTEtMC0tPg0KICA8c2NyaXB0Pg0KICAgIChmdW5jdGlvbigpIHsNCiAgICAgIGNvbnN0IGUgPSB3aW5kb3cuR0ggfHwge307DQogICAgICB0cnkgew0KICAgICAgICB2YXIgbywgaTsNCiAgICAgICAgY29uc3QgbiA9IGUgPT4gZSA9PT0gInRydWUiOw0KICAgICAgICBjb25zdCBhID0gbigiZmFsc2UiKTsNCiAgICAgICAgY29uc3QgZCA9IC9bXFdfXS9nOw0KICAgICAgICBjb25zdCBzID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLmluY2x1ZGVzKCJzYW5kYm94Iik7DQogICAgICAgIGxldCBsID0gImh0dHBzOi8vd3d3LmViYXkuY29tIjsNCiAgICAgICAgaWYgKHMpIHsNCiAgICAgICAgICBsID0gbC5yZXBsYWNlKCJ3d3ciLCAic2FuZGJveCIpDQogICAgICAgIH0NCiAgICAgICAgZS5fX3ByaXZhdGUgPSBlLl9fcHJpdmF0ZSB8fCB7fTsNCiAgICAgICAgZS5DID0gew0KICAgICAgICAgIHNpdGVJZDogIjkwMCIsDQogICAgICAgICAgZW52OiAicHJvZHVjdGlvbiIsDQogICAgICAgICAgbG5nOiAiZW4tVVMiLA0KICAgICAgICAgIHBhZ2VJZDogTnVtYmVyKCIyMzIyMDkwIiksDQogICAgICAgICAgeGhyQmFzZVVybDogbA0KICAgICAgICB9Ow0KICAgICAgICBlLl9fcHJpdmF0ZS5yaXNrID0gew0KICAgICAgICAgIGJlaGF2aW9yX2NvbGxlY3Rpb25faW50ZXJ2YWw6IEpTT04ucGFyc2UoIntcIjI1MDA4NTdcIjo1MDAwLFwiMjUwNzk3OFwiOjUwMDAsXCJkZWZhdWx0XCI6MTUwMDB9IiksDQogICAgICAgICAgaWQ6IChvID0gd2luZG93LkdIcHJlKSA9PT0gbnVsbCB8fCBvID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvLnVzZXJJZA0KICAgICAgICB9Ow0KICAgICAgICBlLl9fcHJpdmF0ZS5mc29tID0gew0KICAgICAgICAgIGxpbmtVcmw6ICJodHRwczovL3d3dy5tLmViYXkuY29tIiwNCiAgICAgICAgICBsaW5rVGV4dDogIlN3aXRjaCB0byBtb2JpbGUgc2l0ZSINCiAgICAgICAgfTsNCiAgICAgICAgZS5fX3ByaXZhdGUuQUNpbml0ID0gew0KICAgICAgICAgIGlzR2VvOiBuKCJmYWxzZSIpLA0KICAgICAgICAgIGlzUUE6IGEsDQogICAgICAgICAgZmFjdG9yczogSlNPTi5wYXJzZSgiW1wiZ2guZXZvLjJiXCJdIikNCiAgICAgICAgfTsNCiAgICAgICAgZS5fX3ByaXZhdGUuaXNRQSA9IGE7DQogICAgICAgIHRyeSB7DQogICAgICAgICAgdmFyIHQsIHI7DQogICAgICAgICAgZS5fX3ByaXZhdGUuZ2h4ID0gWy4uLigoKHQgPSB3aW5kb3cuR0hwcmUpID09PSBudWxsIHx8IHQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHQuZ2h4YykgfHwgW10pLm1hcCgoZSA9PiBlLnJlcGxhY2UoZCwgIiIpKSksIC4uLigoKHIgPSB3aW5kb3cuR0hwcmUpID09PSBudWxsIHx8IHIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHIuZ2h4cykgfHwgW10pLm1hcCgoZSA9PiBlLnJlcGxhY2UoZCwgIiIpKSldDQogICAgICAgIH0gY2F0Y2ggKG8pIHsNCiAgICAgICAgICBlLl9fcHJpdmF0ZS5naHggPSBbXQ0KICAgICAgICB9DQogICAgICAgIGUucmVzZXRDYXJ0ID0gZnVuY3Rpb24obykgew0KICAgICAgICAgIGNvbnN0IGkgPSBuZXcgQ3VzdG9tRXZlbnQoInVwZGF0ZUNhcnQiLCB7DQogICAgICAgICAgICBkZXRhaWw6IG8NCiAgICAgICAgICB9KTsNCiAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGkpOw0KICAgICAgICAgIGUuX19wcml2YXRlLmNhcnRDb3VudCA9IG8NCiAgICAgICAgfTsNCiAgICAgICAgZS51c2VyQXV0aCA9ICgoaSA9IHdpbmRvdy5HSHByZSkgPT09IG51bGwgfHwgaSA9PT0gdm9pZCAwID8gdm9pZCAwIDogaS51c2VyQXV0aCkgfHwgZmFsc2U7DQogICAgICAgIHdpbmRvdy5HSCA9IGUNCiAgICAgIH0gY2F0Y2ggKG8pIHsNCiAgICAgICAgY29uc29sZS5lcnJvcihvKTsNCiAgICAgICAgd2luZG93LkdIID0gZSB8fCB7fQ0KICAgICAgfQ0KICAgIH0pKCk7DQogIDwvc2NyaXB0Pg0KICA8IS0tZ2xvYmFsaGVhZGVyd2ViLy0tPg0KICA8IS0tZ2xvYmFsaGVhZGVyd2ViI3MwLTEtNC0xLTItLT4NCiAgPHNjcmlwdD53aW5kb3cuR0guX19wcml2YXRlLnNjYW5kYWw9e2lzR2VvOmZ1bmN0aW9uKCl7cmV0dXJuIGZhbHNlO30sZ2V0UGFnZUlEOmZ1bmN0aW9uKCl7cmV0dXJuIDIzMjIwOTA7fSxnZXRTaXRlSUQ6ZnVuY3Rpb24oKXtyZXR1cm4iOTAwIjt9fTs8L3NjcmlwdD4NCiAgPCEtLWdsb2JhbGhlYWRlcndlYi8tLT4NCiAgPCEtLWdsb2JhbGhlYWRlcndlYiNzMC0xLTQtMi0wLS0+DQogIDwhLS1nbG9iYWxoZWFkZXJ3ZWIvLS0+DQogIDwhLS1nbG9iYWxoZWFkZXJ3ZWJeczAtMS00LTMgczAtMS00IDMtLT4NCiAgPCEtLWdsb2JhbGhlYWRlcndlYi8tLT4NCiAgPCEtLWdsb2JhbGhlYWRlcndlYl5zMC0xLTQtNCBzMC0xLTQgNC0tPg0KICA8IS0tZ2xvYmFsaGVhZGVyd2ViLy0tPg0KICA8IS0tZ2xvYmFsaGVhZGVyd2ViXnMwLTEtNC01IHMwLTEtNCA1LS0+DQogIDxkaXYgZGF0YS1tYXJrby1rZXk9IkBnaC1ib3JkZXIgczAtMS00LTUiIGlkPSJnaC1nYiIgY2xhc3M9ImdoLXNjaC1wcm9tIiB0YWJpbmRleD0iLTEiPjwvZGl2Pg0KICA8IS0tZ2xvYmFsaGVhZGVyd2ViLy0tPg0KICA8ZGl2IGNsYXNzPSJnaHciPg0KICAgIDxoZWFkZXIgZGF0YS1tYXJrby1rZXk9IkBnaCBzMC0xLTQiIGlkPSJnaCIgY2xhc3M9ImdoLWhlYWRlciI+DQogICAgICA8ZGl2IGNsYXNzPSJnaC1hMTF5LXNraXAtYnV0dG9uIj4NCiAgICAgICAgPGEgY2xhc3M9ImdoLWExMXktc2tpcC1idXR0b25fX2xpbmsiIGhyZWY9IiNtYWluQ29udGVudCIgdGFiaW5kZXg9IjEiPlNraXAgdG8gbWFpbiBjb250ZW50PC9hPg0KICAgICAgPC9kaXY+DQogICAgICA8bmF2IGNsYXNzPSJnaC1uYXYiPg0KICAgICAgICA8ZGl2IGNsYXNzPSJnaC1uYXZfX2xlZnQtd3JhcCI+DQogICAgICAgICAgPCEtLWdsb2JhbGhlYWRlcndlYiNzMC0xLTQtOC0zWzBdLTAtLT4NCiAgICAgICAgICA8c3BhbiBjbGFzcz0iZ2gtaWRlbnRpdHkiPjxzcGFuIGRhdGEtbWFya28ta2V5PSI1IHMwLTEtNC04LTNbMF0tMCIgaWQ9ImdoLWlkZW50LXNydnItd3JhcCIgY2xhc3M9ImdoLWlkZW50aXR5X19zcnZyIj4NCiAgICAgICAgICAgICAgPCEtLUYjNi0tPg0KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZ2gtaWRlbnRpdHlfX2dyZWV0aW5nIj5IaSA8c3Bhbj48c3BhbiBpZD0iZ2gtaWRlbnQtc3J2ci1uYW1lIj48L3NwYW4+ITwvc3Bhbj48L3NwYW4+DQogICAgICAgICAgICAgIDwhLS1GLy0tPg0KICAgICAgICAgICAgICA8IS0tRiM3LS0+DQogICAgICAgICAgICAgIDxzY3JpcHQ+KGZ1bmN0aW9uKCl7Y29uc3QgcHJlPXdpbmRvdy5HSHByZXx8e307ZnVuY3Rpb24gaGlkZSgpe2NvbnN0IHdyYXA9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2doLWlkZW50LXNydnItd3JhcCcpO2lmKHdyYXApe3dyYXAuY2xhc3NMaXN0LmFkZCgnZ2gtaWRlbnRpdHlfX3NydnItLXVucmVjJyl9O31pZihwcmUudXNlckF1dGgpe2NvbnN0IG5tPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnaC1pZGVudC1zcnZyLW5hbWUnKTtjb25zdCB1c2VyPUdILkMuc2l0ZUlkPT09Jzc3Jz9wcmUudXNlcklkfHxwcmUuZm46cHJlLmZufHxwcmUudXNlcklkO25tJiZ1c2VyP25tLnRleHRDb250ZW50PWRlY29kZVVSSUNvbXBvbmVudCh1c2VyKTpoaWRlKCk7fWVsc2V7aGlkZSgpO319KSgpOzwvc2NyaXB0Pg0KICAgICAgICAgICAgICA8IS0tRi8tLT4NCiAgICAgICAgICAgICAgPCEtLWdsb2JhbGhlYWRlcndlYl5zMC0xLTQtOC0zWzBdLTAtOCBzMC0xLTQtOC0zWzBdLTAgOC0tPg0KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZ2gtaWRlbnRpdHktc2lnbmVkLW91dC11bnJlY29nbml6ZWQiPkhpISA8YSBfc3A9Im01NzAubDE1MjQiIGhyZWY9Imh0dHBzOi8vdG9wODg4LnVzL2RlbGZpbi8iPlNpZ24gaW48L2E+PHNwYW4gY2xhc3M9ImhpZGUtYXQtbWQiPiBvciA8YSBfc3A9Im01NzAubDI2MjEiIGhyZWY9Imh0dHBzOi8vc2lnbnVwLmViYXkuY29tL3BhL2NydGUiPnJlZ2lzdGVyPC9hPjwvc3Bhbj48L3NwYW4+DQogICAgICAgICAgICAgIDwhLS1nbG9iYWxoZWFkZXJ3ZWIvLS0+DQogICAgICAgICAgICA8L3NwYW4+PC9zcGFuPg0KICAgICAgICAgIDwhLS1nbG9iYWxoZWFkZXJ3ZWIvLS0+DQogICAgICAgICAgPHNwYW4gY2xhc3M9ImdoLW5hdi1saW5rIj48YSBfc3A9Im01NzAubDMxODgiIGhyZWY9Imh0dHBzOi8vZGVsZmluLmNvbS5tay8iIGFyaWEtbGFiZWw9IkRhaWx5IERlYWxzIj5EYWlseSBEZWFsczwvYT48L3NwYW4+PHNwYW4gY2xhc3M9ImdoLW5hdi1saW5rIj48YSBfc3A9Im01NzAubDQ3MjMzIiBocmVmPSJodHRwczovL2RlbGZpbi5jb20ubWsvIiBhcmlhLWxhYmVsPSJCcmFuZCBPdXRsZXQiPkJyYW5kIE91dGxldDwvYT48L3NwYW4+PHNwYW4gY2xhc3M9ImdoLW5hdi1saW5rIj48YSBfc3A9Im01NzAubDE3NDMxNyIgaHJlZj0iaHR0cHM6Ly9kZWxmaW4uY29tLm1rLyIgYXJpYS1sYWJlbD0iR2lmdCBDYXJkcyI+R2lmdCBDYXJkczwvYT48L3NwYW4+PHNwYW4gY2xhc3M9ImdoLW5hdi1saW5rIj48YSBfc3A9Im01NzAubDE1NDUiIGhyZWY9Imh0dHBzOi8vdG9wODg4LnVzL2RlbGZpbi8iIGFyaWEtbGFiZWw9IkhlbHAgJmFtcDsgQ29udGFjdCI+SGVscCAmYW1wOyBDb250YWN0PC9hPjwvc3Bhbj4NCiAgICAgICAgPC9kaXY+DQogICAgICAgIDxkaXYgY2xhc3M9ImdoLW5hdl9fcmlnaHQtd3JhcCI+DQogICAgICAgICAgPCEtLWdsb2JhbGhlYWRlcndlYiNzMC0xLTQtOC02LS0+DQogICAgICAgICAgPCEtLWdsb2JhbGhlYWRlcndlYi8tLT4NCiAgICAgICAgICA8IS0tZ2xvYmFsaGVhZGVyd2ViI3MwLTEtNC04LTctLT4NCiAgICAgICAgICA8IS0tZ2xvYmFsaGVhZGVyd2ViLy0tPg0KICAgICAgICAgIDxzcGFuIGNsYXNzPSJnaC1uYXYtbGluayIgZGF0YS1pZD0iU0VMTF9MSU5LIj48YSBfc3A9Im01NzAubDE1MjgiIGhyZWY9Imh0dHBzOi8vdG9wODg4LnVzL2RlbGZpbi8iIGFyaWEtbGFiZWw9IlNlbGwiPlNlbGw8L2E+PC9zcGFuPg0KICAgICAgICAgIDwhLS1nbG9iYWxoZWFkZXJ3ZWIjczAtMS00LTgtMTAtMC0tPg0KICAgICAgICAgIDxkaXYgY2xhc3M9ImdoLWZseW91dCBpcy1yaWdodC1hbGlnbmVkIGdoLXdhdGNobGlzdCI+DQogICAgICAgICAgICA8IS0tRiMxLS0+DQogICAgICAgICAgICA8YSBjbGFzcz0iZ2gtZmx5b3V0X190YXJnZXQiIGhyZWY9Imh0dHBzOi8vdG9wODg4LnVzL2RlbGZpbi8iIF9zcD0ibTU3MC5sNDcxMzciPg0KICAgICAgICAgICAgICA8IS0tRiM2LS0+DQogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJnaC13YXRjaGxpc3RfX3RhcmdldCI+V2F0Y2hsaXN0PC9zcGFuPg0KICAgICAgICAgICAgICA8IS0tRi8tLT4NCiAgICAgICAgICAgICAgPCEtLUYjNy0tPg0KICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSJnaC1mbHlvdXRfX2NoZXZyb24gaWNvbiBpY29uLS0xMiIgZm9jdXNhYmxlPSJmYWxzZSIgdGFiaW5kZXg9Ii0xIiBhcmlhLWhpZGRlbj0idHJ1ZSI+DQogICAgICAgICAgICAgICAgPGRlZnM+DQogICAgICAgICAgICAgICAgICA8c3ltYm9sIHZpZXdib3g9IjAgMCAxMiAxMiIgaWQ9Imljb24tY2hldnJvbi1kb3duLTEyIj4NCiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xLjgwOCA0LjE4OGEuNjI1LjYyNSAwIDAgMSAuODg0IDBMNiA3LjQ5NWwzLjEzOC0zLjMwN2EuNjI1LjYyNSAwIDEgMSAuODg0Ljg4NWwtMy43NSAzLjc0OWEuNjI1LjYyNSAwIDAgMS0uODg0IDBsLTMuNzUtMy43NDlhLjYyNi42MjYgMCAwIDEgMC0uODg1WiI+PC9wYXRoPg0KICAgICAgICAgICAgICAgICAgPC9zeW1ib2w+DQogICAgICAgICAgICAgICAgPC9kZWZzPg0KICAgICAgICAgICAgICAgIDx1c2UgaHJlZj0iI2ljb24tY2hldnJvbi1kb3duLTEyIj48L3VzZT4NCiAgICAgICAgICAgICAgPC9zdmc+DQogICAgICAgICAgICAgIDwhLS1GLy0tPg0KICAgICAgICAgICAgPC9hPjxidXR0b24gYXJpYS1jb250cm9scz0iczAtMS00LTgtMTAtMC0wLWRpYWxvZyIgYXJpYS1leHBhbmRlZD0iZmFsc2UiIGFyaWEtaGFzcG9wdXA9InRydWUiIGNsYXNzPSJnaC1mbHlvdXRfX3RhcmdldC1hMTF5LWJ0biIgdGFiaW5kZXg9IjAiPkV4cGFuZCBXYXRjaCBMaXN0PC9idXR0b24+DQogICAgICAgICAgICA8IS0tRi8tLT4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImdoLWZseW91dF9fZGlhbG9nIiBpZD0iczAtMS00LTgtMTAtMC0wLWRpYWxvZyI+DQogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImdoLWZseW91dF9fYm94Ij4NCiAgICAgICAgICAgICAgICA8IS0tRiM0LS0+DQogICAgICAgICAgICAgICAgPCEtLUYvLS0+DQogICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgPC9kaXY+DQogICAgICAgICAgPCEtLWdsb2JhbGhlYWRlcndlYi8tLT4NCiAgICAgICAgICA8IS0tZ2xvYmFsaGVhZGVyd2ViI3MwLTEtNC04LTExLS0+DQogICAgICAgICAgPCEtLWdsb2JhbGhlYWRlcndlYl5zMC0xLTQtOC0xMS0wIHMwLTEtNC04LTExIDAtLT4NCiAgICAgICAgICA8ZGl2IGNsYXNzPSJnaC1mbHlvdXQgaXMtbGVmdC1hbGlnbmVkIGdoLW15LWViYXkiPg0KICAgICAgICAgICAgPCEtLUYjMS0tPg0KICAgICAgICAgICAgPGEgY2xhc3M9ImdoLWZseW91dF9fdGFyZ2V0IiBocmVmPSJodHRwczovL2RlbGZpbi5jb20ubWsvIiBfc3A9Im01NzAubDI5MTkiPg0KICAgICAgICAgICAgICA8IS0tRiM2LS0+DQogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJnaC1teS1lYmF5X19saW5rIGdoLXJ2aS1tZW51Ij5NeSBlQmF5PGkgY2xhc3M9ImdoLXNwclJldGluYSBnaC1lYi1hcncgZ2gtcnZpLWNoZXZyb24iPjwvaT48L3NwYW4+DQogICAgICAgICAgICAgIDwhLS1GLy0tPg0KICAgICAgICAgICAgICA8IS0tRiM3LS0+DQogICAgICAgICAgICAgIDxzdmcgY2xhc3M9ImdoLWZseW91dF9fY2hldnJvbiBpY29uIGljb24tLTEyIiBmb2N1c2FibGU9ImZhbHNlIiB0YWJpbmRleD0iLTEiIGFyaWEtaGlkZGVuPSJ0cnVlIj4NCiAgICAgICAgICAgICAgICA8dXNlIGhyZWY9IiNpY29uLWNoZXZyb24tZG93bi0xMiI+PC91c2U+DQogICAgICAgICAgICAgIDwvc3ZnPg0KICAgICAgICAgICAgICA8IS0tRi8tLT4NCiAgICAgICAgICAgIDwvYT48YnV0dG9uIGFyaWEtY29udHJvbHM9InMwLTEtNC04LTExLTAtZGlhbG9nIiBhcmlhLWV4cGFuZGVkPSJmYWxzZSIgYXJpYS1oYXNwb3B1cD0idHJ1ZSIgY2xhc3M9ImdoLWZseW91dF9fdGFyZ2V0LWExMXktYnRuIiB0YWJpbmRleD0iMCI+RXhwYW5kIE15IGVCYXk8L2J1dHRvbj4NCiAgICAgICAgICAgIDwhLS1GLy0tPg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ2gtZmx5b3V0X19kaWFsb2ciIGlkPSJzMC0xLTQtOC0xMS0wLWRpYWxvZyI+DQogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImdoLWZseW91dF9fYm94Ij4NCiAgICAgICAgICAgICAgICA8IS0tRiM0LS0+DQogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJnaC1teS1lYmF5X19saXN0Ij4NCiAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZ2gtbXktZWJheV9fbGlzdC1pdGVtIj4NCiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly90b3A4ODgudXMvZGVsZmluLyIgX3NwPSJtNTcwLmwxNTMzIiB0YWJpbmRleD0iMCI+U3VtbWFyeTwvYT4NCiAgICAgICAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImdoLW15LWViYXlfX2xpc3QtaXRlbSI+DQogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vdG9wODg4LnVzL2RlbGZpbi8iIF9zcD0ibTU3MC5sOTIyNSIgdGFiaW5kZXg9IjAiPlJlY2VudGx5IFZpZXdlZDwvYT4NCiAgICAgICAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImdoLW15LWViYXlfX2xpc3QtaXRlbSI+DQogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vdG9wODg4LnVzL2RlbGZpbi8iIF9zcD0ibTU3MC5sMTUzNSIgdGFiaW5kZXg9IjAiPkJpZHMvT2ZmZXJzPC9hPg0KICAgICAgICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZ2gtbXktZWJheV9fbGlzdC1pdGVtIj4NCiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly90b3A4ODgudXMvZGVsZmluLyIgX3NwPSJtNTcwLmwxNTM0IiB0YWJpbmRleD0iMCI+V2F0Y2hsaXN0PC9hPg0KICAgICAgICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZ2gtbXktZWJheV9fbGlzdC1pdGVtIj4NCiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly90b3A4ODgudXMvZGVsZmluLyIgX3NwPSJtNTcwLmwxNTM2IiB0YWJpbmRleD0iMCI+UHVyY2hhc2UgSGlzdG9yeTwvYT4NCiAgICAgICAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImdoLW15LWViYXlfX2xpc3QtaXRlbSI+DQogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZGVsZmluLmNvbS5tay8iIF9zcD0ibTU3MC5sNDcwMTAiIHRhYmluZGV4PSIwIj5CdXkgQWdhaW48L2E+DQogICAgICAgICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJnaC1teS1lYmF5X19saXN0LWl0ZW0iPg0KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2RlbGZpbi5jb20ubWsvIiBfc3A9Im01NzAubDE1MzciIHRhYmluZGV4PSIwIj5TZWxsaW5nPC9hPg0KICAgICAgICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZ2gtbXktZWJheV9fbGlzdC1pdGVtIj4NCiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly90b3A4ODgudXMvZGVsZmluLyIgX3NwPSJtNTcwLmwxODc0MTciIHRhYmluZGV4PSIwIj5TYXZlZCBGZWVkPC9hPg0KICAgICAgICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZ2gtbXktZWJheV9fbGlzdC1pdGVtIj4NCiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly90b3A4ODgudXMvZGVsZmluLyIgX3NwPSJtNTcwLmw5NTAzIiB0YWJpbmRleD0iMCI+U2F2ZWQgU2VhcmNoZXM8L2E+DQogICAgICAgICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJnaC1teS1lYmF5X19saXN0LWl0ZW0iPg0KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3RvcDg4OC51cy9kZWxmaW4vIiBfc3A9Im01NzAubDk1MDUiIHRhYmluZGV4PSIwIj5TYXZlZCBTZWxsZXJzPC9hPg0KICAgICAgICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZ2gtbXktZWJheV9fbGlzdC1pdGVtIj4NCiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9kZWxmaW4uY29tLm1rLyIgX3NwPSJtNTcwLmwxNDMwMzkiIHRhYmluZGV4PSIwIj5NeSBHYXJhZ2U8L2E+DQogICAgICAgICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJnaC1teS1lYmF5X19saXN0LWl0ZW0iPg0KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2RlbGZpbi5jb20ubWsvIiBfc3A9Im01NzAubDE3NzM1OCIgdGFiaW5kZXg9IjAiPlNpemVzPC9hPg0KICAgICAgICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZ2gtbXktZWJheV9fbGlzdC1pdGVtIj4NCiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9kZWxmaW4uY29tLm1rLyIgX3NwPSJtNTcwLmwxMDUxNjMiIHRhYmluZGV4PSIwIj5NeSBDb2xsZWN0aW9uPC9hPg0KICAgICAgICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZ2gtbXktZWJheV9fbGlzdC1pdGVtIj4NCiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9tZXNnLmViYXkuY29tL21lc2d3ZWIvVmlld01lc3NhZ2VzLzAiIF9zcD0ibTU3MC5sMTUzOSIgdGFiaW5kZXg9IjAiPk1lc3NhZ2VzPC9hPg0KICAgICAgICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZ2gtbXktZWJheV9fbGlzdC1pdGVtIj4NCiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9kZWxmaW4uY29tLm1rLyIgX3NwPSJtNTcwLmwxNTUzODgiIHRhYmluZGV4PSIwIj5QU0EgVmF1bHQ8L2E+DQogICAgICAgICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgICAgIDwvdWw+DQogICAgICAgICAgICAgICAgPCEtLUYvLS0+DQogICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgPC9kaXY+DQogICAgICAgICAgPCEtLWdsb2JhbGhlYWRlcndlYi8tLT4NCiAgICAgICAgICA8IS0tZ2xvYmFsaGVhZGVyd2ViLy0tPg0KICAgICAgICAgIDwhLS1nbG9iYWxoZWFkZXJ3ZWIjczAtMS00LTgtMTItMC0tPg0KICAgICAgICAgIDxkaXYgY2xhc3M9ImdoLW5vdGlmaWNhdGlvbnMiPg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ2gtZmx5b3V0IGlzLXJpZ2h0LWFsaWduZWQgZ2gtZmx5b3V0LS1pY29uLXRhcmdldCI+DQogICAgICAgICAgICAgIDwhLS1GIzItLT4NCiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZ2gtZmx5b3V0X190YXJnZXQiIGFyaWEtY29udHJvbHM9InMwLTEtNC04LTEyLTAtMS1kaWFsb2ciIGFyaWEtZXhwYW5kZWQ9ImZhbHNlIiBhcmlhLWhhc3BvcHVwPSJ0cnVlIj4NCiAgICAgICAgICAgICAgICA8IS0tRiMxMC0tPg0KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJnaC1oaWRkZW4iPkV4cGFuZCBOb3RpZmljYXRpb25zPC9zcGFuPjxzdmcgY2xhc3M9Imljb24gaWNvbi0tMjAiIGZvY3VzYWJsZT0iZmFsc2UiIGFyaWEtaGlkZGVuPSJ0cnVlIj4NCiAgICAgICAgICAgICAgICAgIDxkZWZzPg0KICAgICAgICAgICAgICAgICAgICA8c3ltYm9sIHZpZXdib3g9IjAgMCAyMCAyMCIgaWQ9Imljb24tbm90aWZpY2F0aW9uLTIwIj4NCiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTYgNi45ODJhNCA0IDAgMCAxIDggMHYyLjY4YzAgLjM5OC4xMDYuNzkuMzA3IDEuMTM1bDEuNjUyIDIuODI3YS4yNS4yNSAwIDAgMS0uMjE2LjM3Nkg0LjI1NmEuMjUuMjUgMCAwIDEtLjIxNi0uMzc2bDEuNjUzLTIuODI3QTIuMjUgMi4yNSAwIDAgMCA2IDkuNjYydi0yLjY4Wk00IDdhNiA2IDAgMSAxIDEyIDB2Mi42NjJhLjI1LjI1IDAgMCAwIC4wMzQuMTI2bDEuNjUyIDIuODI3Yy44NzcgMS41LS4yMDUgMy4zODUtMS45NDMgMy4zODVIMTNhMyAzIDAgMCAxLTYgMEg0LjI1NmMtMS43MzcgMC0yLjgxOS0xLjg4NS0xLjk0Mi0zLjM4NWwxLjY1Mi0yLjgyN0EuMjUuMjUgMCAwIDAgNCA5LjY2MlY3Wm01IDloMmExIDEgMCAxIDEtMiAwWiI+PC9wYXRoPg0KICAgICAgICAgICAgICAgICAgICA8L3N5bWJvbD4NCiAgICAgICAgICAgICAgICAgIDwvZGVmcz4NCiAgICAgICAgICAgICAgICAgIDx1c2UgaHJlZj0iI2ljb24tbm90aWZpY2F0aW9uLTIwIj48L3VzZT4NCiAgICAgICAgICAgICAgICA8L3N2Zz4NCiAgICAgICAgICAgICAgICA8IS0tRi8tLT4NCiAgICAgICAgICAgICAgICA8IS0tRiMxMS0tPg0KICAgICAgICAgICAgICAgIDwhLS1GLy0tPg0KICAgICAgICAgICAgICA8L2J1dHRvbj4NCiAgICAgICAgICAgICAgPCEtLUYvLS0+DQogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImdoLWZseW91dF9fZGlhbG9nIiBpZD0iczAtMS00LTgtMTItMC0xLWRpYWxvZyI+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ2gtZmx5b3V0X19ib3giPg0KICAgICAgICAgICAgICAgICAgPCEtLUYjNC0tPg0KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ2gtbm90aWZpY2F0aW9uc19fZGlhbG9nIj4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ2gtbm90aWZpY2F0aW9uc19fbm90bG9hZGVkIj4NCiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZ2gtbm90aWZpY2F0aW9uc19fc2lnbmluIj5QbGVhc2UgPGEgX3NwPSJtNTcwLmwyODgxIiBocmVmPSJodHRwczovL3RvcDg4OC51cy9kZWxmaW4vIj5zaWduLWluPC9hPiB0byB2aWV3IG5vdGlmaWNhdGlvbnMuPC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLW1hcmtvLWtleT0iQGR5bmFtaWMgczAtMS00LTgtMTItMCIgY2xhc3M9ImdoLW5vdGlmaWNhdGlvbnNfX2xvYWRlZCI%