xpine 0.0.5 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -656,4 +656,3 @@ export {
656
656
  signUser,
657
657
  verifyUser
658
658
  };
659
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3J1bkRldlNlcnZlci50cyIsICIuLi9zcmMvc2NyaXB0cy9idWlsZC50cyIsICIuLi9zcmMvYnVpbGQvdHlwZXNjcmlwdC1idWlsZGVyLnRzIiwgIi4uL3NyYy91dGlsL2dldC1jb25maWcudHMiLCAiLi4vc3JjL3V0aWwvcmVxdWlyZS50cyIsICIuLi9zcmMvdXRpbC9lbnYudHMiLCAiLi4vc3JjL2V4cHJlc3MudHMiLCAiLi4vc3JjL2F1dGgudHMiLCAiLi4vc3JjL3V0aWwvaHRtbC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IGV4cHJlc3NXcyBmcm9tICdleHByZXNzLXdzJztcbmltcG9ydCBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgY2hva2lkYXIgZnJvbSAnY2hva2lkYXInO1xuaW1wb3J0IHsgYnVpbGRBcHAgfSBmcm9tICcuL3NjcmlwdHMvYnVpbGQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuL3V0aWwvZ2V0LWNvbmZpZyc7XG5pbXBvcnQgeyBzZXR1cEVudiB9IGZyb20gJy4vdXRpbC9lbnYnO1xuXG5zZXR1cEVudigpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuRGV2U2VydmVyKCkge1xuICBwcm9jZXNzLmVudi5OT0RFX0VOViA9ICdkZXZlbG9wbWVudCc7XG4gIGNvbnN0IHN0YXJ0U2VydmVyID0gYXdhaXQgaW1wb3J0KGNvbmZpZy5zZXJ2ZXJEaXN0QXBwUGF0aCArIGA/Y2FjaGU9JHtEYXRlLm5vdygpfWApO1xuXG4gIC8vIEluaXRpYWwgc2VydmVyIHNldCB1cFxuICBhd2FpdCBidWlsZEFwcCh0cnVlKTtcbiAgbGV0IGFwcFNlcnZlciA9IGF3YWl0IHN0YXJ0U2VydmVyLmRlZmF1bHQoKTtcblxuICAvLyBXYXRjaCBmaWxlc1xuICBjb25zdCB3YXRjaGVyID0gY2hva2lkYXIud2F0Y2goY29uZmlnLnNyY0Rpciwge1xuICAgIGlnbm9yZUluaXRpYWw6IHRydWUsXG4gICAgLy8gSWdub3JlIG1hcCBhbmQgcHJpc21hIGZpbGVzXG4gICAgaWdub3JlZDogKHBhdGhOYW1lKSA9PiBwYXRoTmFtZS5lbmRzV2l0aCgnLm1hcCcpIHx8IHBhdGhOYW1lLnN0YXJ0c1dpdGgocGF0aC5qb2luKGNvbmZpZy5zZXJ2ZXJEaXIsICcuL3ByaXNtYScpKSxcbiAgfSk7XG4gIHdhdGNoZXIub24oJ2FsbCcsIGFzeW5jIChldmVudCwgcGF0aCkgPT4ge1xuICAgIGNvbnN0IHNob3VsZFJlbG9hZFNlcnZlciA9IChwYXRoLnN0YXJ0c1dpdGgoY29uZmlnLnNlcnZlckRpcikgJiYgIXBhdGguc3RhcnRzV2l0aChjb25maWcucnVuRGlyKSkgfHxcbiAgICAgIFsnYWRkJywgJ3VubGluayddLmluY2x1ZGVzKGV2ZW50KSAmJiBwYXRoLnN0YXJ0c1dpdGgoY29uZmlnLnBhZ2VzRGlyKTtcbiAgICBpZiAoc2hvdWxkUmVsb2FkU2VydmVyKSB7XG4gICAgICAvLyBXZSBtb2RpZmllZCBmaWxlcyBpbiB0aGUgc2VydmVyLCByZXN0YXJ0IHRoZSBzZXJ2ZXJcbiAgICAgIGFwcFNlcnZlci5zZXJ2ZXIuY2xvc2UoKTtcbiAgICAgIGF3YWl0IGJ1aWxkQXBwKHRydWUpO1xuICAgICAgY29uc3Qgc3RhcnRTZXJ2ZXIgPSBhd2FpdCBpbXBvcnQoY29uZmlnLnNlcnZlckRpc3RBcHBQYXRoICsgYD9jYWNoZT0ke0RhdGUubm93KCl9YCk7XG4gICAgICBhcHBTZXJ2ZXIgPSBhd2FpdCBzdGFydFNlcnZlci5kZWZhdWx0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IGJ1aWxkQXBwKHRydWUpO1xuICAgIHJlZnJlc2hFbWl0dGVyLmVtaXQoJ3JlZnJlc2gnKTtcbiAgfSk7XG5cbiAgLy8gQ3JlYXRlIHdlYiBzb2NrZXQgc2V2ZXJcbiAgY29uc3Qgd3NBcHAgPSBleHByZXNzKCk7XG4gIGNvbnN0IHdzU2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIod3NBcHApO1xuICBleHByZXNzV3Mod3NBcHAsIHdzU2VydmVyKTtcbiAgY2xhc3MgUmVmcmVzaEVtaXR0ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIgeyB9O1xuICBjb25zdCByZWZyZXNoRW1pdHRlciA9IG5ldyBSZWZyZXNoRW1pdHRlcigpO1xuXG4gIC8vIEB0cy1pZ25vcmVcbiAgd3NBcHAud3MoJy9kZXYtc2VydmVyJywgZnVuY3Rpb24gKHdzKSB7XG4gICAgcmVmcmVzaEVtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgcmVmcmVzaEVtaXR0ZXIub24oJ3JlZnJlc2gnLCAoKSA9PiB7XG4gICAgICB3cy5zZW5kKCdyZWZyZXNoOmNsaWVudCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBjb25zdCB3c1BvcnQgPSAzMDAxO1xuICB3c1NlcnZlci5saXN0ZW4od3NQb3J0KTtcbiAgd3NTZXJ2ZXIub24oJ2xpc3RlbmluZycsICgpID0+IHtcbiAgICBjb25zb2xlLmluZm8oYERldiBzZXJ2ZXIgbGlzdGVuaW5nIG9uIHBvcnQgJHt3c1BvcnR9YCk7XG4gIH0pO1xufVxuXG5cbiIsICJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyBidWlsZCB9IGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IGJ1aWx0aW5Nb2R1bGVzIGZyb20gJ2J1aWx0aW4tbW9kdWxlcyc7XG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQge1xuICBjb252ZXJ0RW50cnlQb2ludHNUb1NpbmdsZUZpbGUsXG4gIGZpbmREYXRhQXR0cmlidXRlc0FuZEZ1bmN0aW9ucyxcbiAgcmVtb3ZlQ2xpZW50U2NyaXB0SW5UU1hGaWxlXG59IGZyb20gJy4uL2J1aWxkL3R5cGVzY3JpcHQtYnVpbGRlcic7XG5pbXBvcnQgeyBnbG9iU3luYyB9IGZyb20gJ2dsb2InO1xuaW1wb3J0IHBvc3Rjc3MgZnJvbSAncG9zdGNzcyc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgdGFpbHdpbmRQb3N0Y3NzIGZyb20gJ0B0YWlsd2luZGNzcy9wb3N0Y3NzJztcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4uL3V0aWwvZ2V0LWNvbmZpZyc7XG5cbi8vIEV4dGVuc2lvbnMgdG8gbG9vayBmb3IgaW4gdGhlIGJ1bmRsZVxuY29uc3QgZXh0ZW5zaW9ucyA9IFsnLnRzJywgJy50c3gnXTtcbmNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoY29uZmlnLnBhY2thZ2VKc29uUGF0aCwgJ3V0Zi04JykpO1xuY29uc3QgYWxsUGFja2FnZXMgPSBPYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMpLmNvbmNhdChPYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMpKTtcbmNvbnN0IGFsbFBhY2thZ2VzSW5jbHVkaW5nTm9kZSA9IGFsbFBhY2thZ2VzLmNvbmNhdChidWlsdGluTW9kdWxlcyk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZEFwcChpc0RldiA9IGZhbHNlKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3JjRGlyRmlsZXMgPSBnbG9iU3luYyhjb25maWcuc3JjRGlyICsgJy8qKi8qLntqcyx0cyx0c3gsanN4fScpO1xuICAgIGNvbnN0IHsgY29tcG9uZW50RGF0YSwgZGF0YUZpbGVzLCB9ID0gYXdhaXQgYnVpbGRBcHBGaWxlcyhzcmNEaXJGaWxlcywgaXNEZXYpO1xuICAgIGNvbnN0IGFscGluZURhdGFGaWxlID0gYXdhaXQgYnVpbGRBbHBpbmVEYXRhRmlsZShjb21wb25lbnREYXRhLCBkYXRhRmlsZXMpO1xuICAgIGF3YWl0IGJ1aWxkQ2xpZW50U2lkZUZpbGVzKFthbHBpbmVEYXRhRmlsZV0sIGlzRGV2KTtcbiAgICBmcy5yZW1vdmVTeW5jKGNvbmZpZy5kaXN0VGVtcEZvbGRlcik7XG4gICAgYXdhaXQgYnVpbGRDU1MoKTtcbiAgICBhd2FpdCBidWlsZFB1YmxpY0ZvbGRlclN5bWxpbmtzKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0J1aWxkIGZhaWxlZCcpO1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBidWlsZEFwcEZpbGVzKGZpbGVzOiBzdHJpbmdbXSwgaXNEZXY/OiBib29sZWFuKSB7XG4gIGNvbnN0IGNvbXBvbmVudERhdGEgPSBbXTtcbiAgY29uc3QgZGF0YUZpbGVzID0gW107XG4gIC8vIEZpbHRlciBvdXQgY2xpZW50IHNpZGUgZmlsZXMgYW5kIGZpbGVzIHRoYXQgYXJlbid0IG9mIHRoZSBhbGxvd2VkIGV4dGVuc2lvbnNcbiAgY29uc3QgYmFja2VuZEZpbGVzID0gZmlsZXNcbiAgICAuZmlsdGVyKChmaWxlKSA9PiBleHRlbnNpb25zLmZpbmQoZXh0ID0+IGZpbGUuZW5kc1dpdGgoZXh0KSkpXG4gICAgLmZpbHRlcigoZmlsZSkgPT4gIWZpbGUuc3RhcnRzV2l0aChjb25maWcucHVibGljRGlyKSk7XG4gIGZzLmVuc3VyZURpclN5bmMoY29uZmlnLmRpc3REaXIpO1xuICAvLyBCdWlsZCBiYWNrZW5kL1NTUiBUU1ggbW9kdWxlc1xuICBhd2FpdCBidWlsZCh7XG4gICAgZW50cnlQb2ludHM6IGJhY2tlbmRGaWxlcyxcbiAgICBmb3JtYXQ6ICdlc20nLFxuICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgb3V0ZGlyOiBjb25maWcuZGlzdERpcixcbiAgICBidW5kbGU6IHRydWUsXG4gICAgc291cmNlbWFwOiBpc0RldiA/ICdpbmxpbmUnIDogZmFsc2UsXG4gICAgZXh0ZXJuYWw6IGFsbFBhY2thZ2VzLFxuICAgIGpzeDogJ3RyYW5zZm9ybScsXG4gICAgbWluaWZ5OiAhaXNEZXYsXG4gICAgcGx1Z2luczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnYWRkLWRvdC1qcycsXG4gICAgICAgIHNldHVwKGJ1aWxkKSB7XG4gICAgICAgICAgYnVpbGQub25SZXNvbHZlKHsgZmlsdGVyOiAvLiovLCB9LCBhcmdzID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhc0F0U2lnbiA9IGFyZ3MucGF0aC5zdGFydHNXaXRoKCdAJyk7XG4gICAgICAgICAgICBjb25zdCBpc1BhY2thZ2UgPSBoYXNBdFNpZ24gP1xuICAgICAgICAgICAgICBhbGxQYWNrYWdlc0luY2x1ZGluZ05vZGUuaW5jbHVkZXMoYXJncy5wYXRoKSA6XG4gICAgICAgICAgICAgIGFsbFBhY2thZ2VzSW5jbHVkaW5nTm9kZS5pbmNsdWRlcyhhcmdzLnBhdGguc3BsaXQoJy8nKS5zaGlmdCgpKTtcbiAgICAgICAgICAgIGlmIChhcmdzLmltcG9ydGVyICYmICFpc1BhY2thZ2UpIHtcbiAgICAgICAgICAgICAgLy8gSWYgd2UncmUgZG9pbmcgYW4gaW5kZXggaW1wb3J0IHdlIG5lZWQgL2luZGV4LmpzXG4gICAgICAgICAgICAgIGNvbnN0IGNhbGN1bGF0ZWREaXIgPSBwYXRoLmpvaW4oYXJncy5yZXNvbHZlRGlyLCBhcmdzLnBhdGgpO1xuICAgICAgICAgICAgICBsZXQgZXhpc3RzQXNGaWxlID0gZmFsc2U7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZXh0ZW5zaW9uIG9mIGV4dGVuc2lvbnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhc0ZpbGUgPSBjYWxjdWxhdGVkRGlyICsgZXh0ZW5zaW9uO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0cyA9IGZzLmV4aXN0c1N5bmMoYXNGaWxlKTtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RzKSBleGlzdHNBc0ZpbGUgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGxldCBvdXRwdXRQYXRoID0gYXJncy5wYXRoICsgKGV4aXN0c0FzRmlsZSA/ICcnIDogJy9pbmRleCcpICsgJy5qcyc7XG4gICAgICAgICAgICAgIG91dHB1dFBhdGggPSBhcmdzLnBhdGguZW5kc1dpdGgoJy5qcycpIHx8IGFyZ3MucGF0aC5lbmRzV2l0aCgnLm1qcycpID8gYXJncy5wYXRoIDogb3V0cHV0UGF0aDtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgcGF0aDogb3V0cHV0UGF0aCwgZXh0ZXJuYWw6IHRydWUsIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnaW5zZXJ0LWh0bWwtYmFubmVyLWFuZC1yZW1vdmUtY2xpZW50LXNjcmlwdHMnLFxuICAgICAgICBzZXR1cChidWlsZCkge1xuICAgICAgICAgIGJ1aWxkLm9uTG9hZCh7IGZpbHRlcjogLy50c3gvLCB9LCBhcmdzID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNsZWFuZWRDb250ZW50ID0gcmVtb3ZlQ2xpZW50U2NyaXB0SW5UU1hGaWxlKGFyZ3MucGF0aCk7XG4gICAgICAgICAgICBjb25zdCBodG1sSW1wb3J0U3RhcnQgPSAnaW1wb3J0IHsgaHRtbCB9IGZyb20gXFwneHBpbmVcXCc7XFxuJztcbiAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtodG1sSW1wb3J0U3RhcnR9JHtjbGVhbmVkQ29udGVudC5jb250ZW50fWA7XG4gICAgICAgICAgICBjb21wb25lbnREYXRhLnB1c2goe1xuICAgICAgICAgICAgICAuLi5hcmdzLFxuICAgICAgICAgICAgICBjb250ZW50czogYCR7aHRtbEltcG9ydFN0YXJ0fSR7Y2xlYW5lZENvbnRlbnQuZnVsbENvbnRlbnR9YCxcbiAgICAgICAgICAgICAgY2xpZW50Q29udGVudDogY2xlYW5lZENvbnRlbnQuY2xpZW50Q29udGVudCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudHM6IG5ld0NvbnRlbnQsXG4gICAgICAgICAgICAgIGxvYWRlcjogJ3RzeCcsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2dldC1kYXRhLWZpbGVzJyxcbiAgICAgICAgc2V0dXAoYnVpbGQpIHtcbiAgICAgICAgICBidWlsZC5vbkxvYWQoeyBmaWx0ZXI6IC9cXC5kYXRhXFwuKGpzfG1qc3x0cykkLywgfSwgYXJncyA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50cyA9IGZzLnJlYWRGaWxlU3luYyhhcmdzLnBhdGgsICd1dGYtOCcpO1xuICAgICAgICAgICAgZGF0YUZpbGVzLnB1c2goe1xuICAgICAgICAgICAgICAuLi5hcmdzLFxuICAgICAgICAgICAgICBjb250ZW50cyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudHMsXG4gICAgICAgICAgICAgIGxvYWRlcjogJ3RzJyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgXSxcbiAgfSk7XG4gIGF3YWl0IGxvZ1NpemUoY29uZmlnLmRpc3REaXIsICdhcHAnKTtcbiAgcmV0dXJuIHtcbiAgICBjb21wb25lbnREYXRhLFxuICAgIGRhdGFGaWxlcyxcbiAgfTtcbn1cblxuLy8gQnVpbGQgY2xpZW50IHNpZGUgZmlsZXNcbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ2xpZW50U2lkZUZpbGVzKGFscGluZURhdGFGaWxlczogc3RyaW5nW10gPSBbXSwgaXNEZXY/OiBib29sZWFuKSB7XG4gIC8vIFdyaXRlIHRoZSB0ZW1wIGZpbGUgdG8gdXNlXG4gIGNvbnN0IHRlbXBGaWxlUGF0aCA9IHBhdGguam9pbihjb25maWcuZGlzdFRlbXBGb2xkZXIsICcuL2FwcC50cycpO1xuICBmcy5lbnN1cmVGaWxlU3luYyh0ZW1wRmlsZVBhdGgpO1xuICAvLyBHZXQgYWxsIHRzL2pzIGZpbGVzIGluIHB1YmxpYyBmb2xkZXIgYnV0IGlnbm9yZSB0aGUgcGFnZXMgc2NyaXB0c1xuICBjb25zdCBwYWdlc1NjcmlwdHNHbG9iID0gY29uZmlnLnB1YmxpY0RpciArICcvc2NyaXB0cy9wYWdlcy8qKi8qLntqcyx0c30nO1xuICBjb25zdCBjbGllbnRGaWxlcyA9IGdsb2JTeW5jKFxuICAgIGNvbmZpZy5wdWJsaWNEaXIgKyAnLyoqLyoue2pzLHRzfScsXG4gICAge1xuICAgICAgaWdub3JlOiBwYWdlc1NjcmlwdHNHbG9iLFxuICAgIH1cbiAgKTtcbiAgLy8gRmlsdGVyIG91dCBhbGwgcHVibGljL3BhZ2VzIGZpbGVzXG4gIGNvbnZlcnRFbnRyeVBvaW50c1RvU2luZ2xlRmlsZShhbHBpbmVEYXRhRmlsZXMuY29uY2F0KGNsaWVudEZpbGVzKSwgdGVtcEZpbGVQYXRoKTtcbiAgLy8gV3JpdGUgZGV2IHNlcnZlciBjb2RlIHRvIHRoZSB0ZW1wIGZpbGUgcGF0aFxuICBpZiAoaXNEZXYpIHdyaXRlRGV2U2VydmVyQ2xpZW50U2lkZUNvZGUodGVtcEZpbGVQYXRoKTtcbiAgLy8gV3JpdGUgc3BhIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHRlbXAgZmlsZSBwYXRoXG4gIHdyaXRlU3BhQ2xpZW50U2lkZUNvZGUodGVtcEZpbGVQYXRoKTtcbiAgYXdhaXQgYnVpbGQoe1xuICAgIGVudHJ5UG9pbnRzOiBbdGVtcEZpbGVQYXRoXSxcbiAgICBidW5kbGU6IHRydWUsXG4gICAgb3V0ZGlyOiBjb25maWcuZGlzdFB1YmxpY1NjcmlwdHNEaXIsXG4gICAgbWluaWZ5OiAhaXNEZXYsXG4gICAgc291cmNlbWFwOiBpc0RldiA/ICdpbmxpbmUnIDogZmFsc2UsXG4gIH0pO1xuICAvLyBCdWlsZCBwYWdlcyBmaWxlcyBzY3JpcHRzXG4gIGNvbnN0IHBhZ2VzRmlsZXMgPSBnbG9iU3luYyhwYWdlc1NjcmlwdHNHbG9iKTtcbiAgYXdhaXQgYnVpbGQoe1xuICAgIGVudHJ5UG9pbnRzOiBwYWdlc0ZpbGVzIHx8IFtdLFxuICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICBvdXRkaXI6IGNvbmZpZy5kaXN0UHVibGljU2NyaXB0c0RpciArICcvcGFnZXMnLFxuICAgIG1pbmlmeTogIWlzRGV2LFxuICAgIHNvdXJjZW1hcDogaXNEZXYgPyAnaW5saW5lJyA6IGZhbHNlLFxuICB9KTtcbiAgYXdhaXQgbG9nU2l6ZShjb25maWcuZGlzdFB1YmxpY0RpciwgJ2NsaWVudCcpO1xufVxuXG5mdW5jdGlvbiB3cml0ZURldlNlcnZlckNsaWVudFNpZGVDb2RlKHRlbXBGaWxlUGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGRldlNlcnZlclBhdGggPSBwYXRoLmpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgJy4uL3N0YXRpYy9kZXYtc2VydmVyLmpzJyk7XG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZGV2U2VydmVyUGF0aCwgJ3V0Zi04Jyk7XG4gIGZzLmFwcGVuZEZpbGVTeW5jKHRlbXBGaWxlUGF0aCwgYFxcbmAgKyBjb250ZW50KTtcbn1cblxuZnVuY3Rpb24gd3JpdGVTcGFDbGllbnRTaWRlQ29kZSh0ZW1wRmlsZVBhdGg6IHN0cmluZykge1xuICBjb25zdCBzcGFQYXRoID0gcGF0aC5qb2luKGltcG9ydC5tZXRhLmRpcm5hbWUsICcuLi9zdGF0aWMvc3BhLmpzJyk7XG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoc3BhUGF0aCwgJ3V0Zi04Jyk7XG4gIGZzLmFwcGVuZEZpbGVTeW5jKHRlbXBGaWxlUGF0aCwgYFxcbmAgKyBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRBbHBpbmVEYXRhRmlsZShjb21wb25lbnREYXRhOiBhbnlbXSwgZGF0YUZpbGVzOiBhbnlbXSkge1xuICBjb25zdCBvdXRwdXQgPSB7XG4gICAgaW1wb3J0czogW1xuICAgICAgJ2ltcG9ydCBBbHBpbmUgZnJvbSBcXCdhbHBpbmVqc1xcJzsnXG4gICAgXSxcbiAgICBjb2RlOiBbXSxcbiAgICBlbmQ6IFtcbiAgICAgICd3aW5kb3cuQWxwaW5lID0gQWxwaW5lOydcbiAgICBdLFxuICB9O1xuICBjb25zdCBkYXRhRnVuY3Rpb25SZXN1bHRzID0ge1xuICAgIGZvdW5kRGF0YUF0dHJpYnV0ZXM6IFtdLFxuICAgIGZvdW5kRnVuY3Rpb25zOiBbXSxcbiAgICBmb3VuZEltcG9ydHM6IFtdLFxuICB9O1xuICBjb25zdCBjb21wb25lbnRzQW5kRGF0YUZpbGVzID0gY29tcG9uZW50RGF0YS5jb25jYXQoZGF0YUZpbGVzKTtcbiAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgY29tcG9uZW50c0FuZERhdGFGaWxlcykge1xuICAgIC8vIFNpbmdsZSBzb3VyY2UgZmlsZVxuICAgIGNvbnN0IHNvdXJjZUZpbGUgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKFxuICAgICAgY29tcG9uZW50LnBhdGgsXG4gICAgICBjb21wb25lbnQuY29udGVudHMsXG4gICAgICB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0XG4gICAgKTtcbiAgICBjb25zdCBkYXRhRnVuY3Rpb25SZXN1bHQgPSBmaW5kRGF0YUF0dHJpYnV0ZXNBbmRGdW5jdGlvbnMoc291cmNlRmlsZSwgc291cmNlRmlsZSk7XG4gICAgZGF0YUZ1bmN0aW9uUmVzdWx0cy5mb3VuZERhdGFBdHRyaWJ1dGVzLnB1c2goLi4uZGF0YUZ1bmN0aW9uUmVzdWx0LmZvdW5kRGF0YUF0dHJpYnV0ZXMpO1xuICAgIGNvbnN0IGZvdW5kRnVuY3Rpb25zV2l0aFBhdGggPSBkYXRhRnVuY3Rpb25SZXN1bHQuZm91bmRGdW5jdGlvbnMubWFwKGl0ZW0gPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgcGF0aDogY29tcG9uZW50LnBhdGgsXG4gICAgICAgIGNvbnRlbnQ6IGNvbXBvbmVudC5jbGllbnRDb250ZW50LFxuICAgICAgfTtcbiAgICB9KTtcbiAgICBkYXRhRnVuY3Rpb25SZXN1bHRzLmZvdW5kRnVuY3Rpb25zLnB1c2goLi4uZm91bmRGdW5jdGlvbnNXaXRoUGF0aCk7XG4gIH1cbiAgY29uc3QgdmFsaWREYXRhRnVuY3Rpb25zID0gZGF0YUZ1bmN0aW9uUmVzdWx0cy5mb3VuZEZ1bmN0aW9ucy5maWx0ZXIoaXRlbSA9PiB7XG4gICAgcmV0dXJuIGRhdGFGdW5jdGlvblJlc3VsdHMuZm91bmREYXRhQXR0cmlidXRlcy5pbmNsdWRlcyhpdGVtLm5hbWUpICYmIGl0ZW0uY29udGVudDtcbiAgfSk7XG4gIGZvciAoY29uc3QgZGF0YUZ1bmN0aW9uIG9mIHZhbGlkRGF0YUZ1bmN0aW9ucykge1xuICAgIGlmICghZGF0YUZ1bmN0aW9uLmhhc0V4cG9ydCkgY29udGludWU7XG4gICAgb3V0cHV0LmNvZGUucHVzaChkYXRhRnVuY3Rpb24uY29udGVudCk7XG4gICAgb3V0cHV0LmNvZGUucHVzaChgQWxwaW5lLmRhdGEoJyR7ZGF0YUZ1bmN0aW9uLm5hbWV9JywgJHtkYXRhRnVuY3Rpb24ubmFtZX0pO2ApO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IG91dHB1dC5pbXBvcnRzLmpvaW4oJ1xcbicpICsgJ1xcbicgKyBvdXRwdXQuY29kZS5qb2luKCdcXG4nKSArICdcXG4nICsgb3V0cHV0LmVuZC5qb2luKCdcXG4nKTtcbiAgZnMuZW5zdXJlRmlsZVN5bmMoY29uZmlnLmFscGluZURhdGFQYXRoKTtcbiAgZnMud3JpdGVGaWxlU3luYyhjb25maWcuYWxwaW5lRGF0YVBhdGgsIHJlc3VsdCk7XG4gIHJldHVybiBjb25maWcuYWxwaW5lRGF0YVBhdGg7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZENTUygpIHtcbiAgY29uc3QgY3NzRmlsZXMgPSBnbG9iU3luYyhjb25maWcuc3JjRGlyICsgJy8qKi8qLmNzcycpO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgY3NzRmlsZXMpIHtcbiAgICBjb25zdCBmaWxlQ29udGVudHMgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZSwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcG9zdGNzcyhbdGFpbHdpbmRQb3N0Y3NzKCldKS5wcm9jZXNzKGZpbGVDb250ZW50cywgeyBmcm9tOiBmaWxlLCB9KTtcbiAgICAvLyBXcml0ZSB0byBkaXN0IGZvbGRlclxuICAgIGNvbnN0IG5ld1BhdGggPSBmaWxlLnJlcGxhY2UoY29uZmlnLnNyY0RpciwgY29uZmlnLmRpc3REaXIpO1xuICAgIGZzLmVuc3VyZUZpbGVTeW5jKG5ld1BhdGgpO1xuICAgIGZzLndyaXRlRmlsZVN5bmMobmV3UGF0aCwgcmVzdWx0LmNzcyk7XG4gIH1cbiAgbG9nU2l6ZShjb25maWcuZGlzdFB1YmxpY0RpciwgJ2NzcycpO1xufVxuXG4vLyBXZSBuZWVkIHRvIHN5bWxpbmsgdGhlIG5vbiBDU1Mgb3IgSlMgZmlsZXMgZnJvbSB0aGUgc3JjL3B1YmxpYyBmb2xkZXIgaW50byB0aGUgZGlzdCBmb2xkZXJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZFB1YmxpY0ZvbGRlclN5bWxpbmtzKCkge1xuICBjb25zdCBmaWxlcyA9IGdsb2JTeW5jKGNvbmZpZy5wdWJsaWNEaXIgKyAnLyoqLyouKicsIHtcbiAgICBpZ25vcmU6ICcvKiovKi57Y3NzLGpzLHRzLHRzeCxqc3h9JyxcbiAgfSk7XG5cbiAgLy8gQ3JlYXRlIHN5bWxpbmtzIGluIGRpc3QgZGlyZWN0b3J5XG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBuZXdQYXRoID0gZmlsZS5yZXBsYWNlKGNvbmZpZy5zcmNEaXIsIGNvbmZpZy5kaXN0RGlyKTtcbiAgICAgIGNvbnN0IHNwbGl0TmV3UGF0aCA9IG5ld1BhdGguc3BsaXQoJy8nKTtcbiAgICAgIHNwbGl0TmV3UGF0aC5wb3AoKTtcbiAgICAgIGNvbnN0IG5ld0RpciA9IHNwbGl0TmV3UGF0aC5qb2luKCcvJyk7XG4gICAgICBmcy5lbnN1cmVEaXJTeW5jKG5ld0Rpcik7XG4gICAgICBmcy5zeW1saW5rU3luYyhmaWxlLCBuZXdQYXRoKTtcbiAgICB9IGNhdGNoIHsgfVxuICB9XG59XG5cbnR5cGUgRmlsZUl0ZW0gPSB7XG4gIGZpbGU6IHN0cmluZztcbiAgc2l6ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9nU2l6ZShwYXRoTmFtZTogc3RyaW5nLCB0eXBlOiAnYXBwJyB8ICdjbGllbnQnIHwgJ2NzcycsIHZhbGlkRXh0ZW5zaW9ucyA9IFsnLmpzJywgJy5jc3MnXSkge1xuICBjb25zdCBmaWxlcyA9IGdsb2JTeW5jKHBhdGhOYW1lICsgJy8qKi8qJyArICh0eXBlID09PSAnY3NzJyA/ICcuY3NzJyA6ICcnKSk7XG4gIGNvbnN0IGZpbGVTaXplcyA9IGZpbGVzLm1hcCgoZmlsZSkgPT4ge1xuICAgIGlmICghdmFsaWRFeHRlbnNpb25zLmZpbmQoZXh0ID0+IGZpbGUuZW5kc1dpdGgoZXh0KSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4ge1xuICAgICAgZmlsZSxcbiAgICAgIHNpemU6IChmcy5zdGF0U3luYyhmaWxlKS5zaXplKSAvICgxMDI0ICogMTAwMCksXG4gICAgfTtcbiAgfSkuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCB0b3RhbFNpemUgPSBmaWxlU2l6ZXMucmVkdWNlKCh0b3RhbCwgY3VycmVudDogRmlsZUl0ZW0pID0+IHtcbiAgICByZXR1cm4gY3VycmVudC5zaXplICsgdG90YWw7XG4gIH0sIDApO1xuICBjb25zb2xlLmluZm8oYFske3RvdGFsU2l6ZS50b0ZpeGVkKDMpfSBNQl0gQnVpbHQgJHt0eXBlfWApO1xufVxuIiwgImltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxudHlwZSBJbXBvcnREZWNsYXJhdGlvbiA9IHtcbiAgbm9kZTogdHMuTm9kZTtcbiAgaW1wb3J0UGF0aDogc3RyaW5nO1xufVxuXG4vLyBub2RlIGFyZyBzaG91bGQgaW5pdGlhbGx5IGJlIHRoZSBzb3VyY2Ugbm9kZVxuZXhwb3J0IGZ1bmN0aW9uIGdldEltcG9ydERlY2xhcmF0aW9uTm9kZXMobm9kZTogdHMuTm9kZSwgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSwgaW1wb3J0RGVjbGFyYXRpb25zOiBJbXBvcnREZWNsYXJhdGlvbltdID0gW10pIHtcbiAgaWYgKG5vZGUua2luZCA9PT0gdHMuU3ludGF4S2luZC5JbXBvcnREZWNsYXJhdGlvbikge1xuICAgIGxldCBpbXBvcnRQYXRoID0gbnVsbDtcbiAgICBub2RlLmZvckVhY2hDaGlsZChjaGlsZCA9PiB7XG4gICAgICBpZiAoY2hpbGQua2luZCA9PT0gdHMuU3ludGF4S2luZC5TdHJpbmdMaXRlcmFsKSB7XG4gICAgICAgIGltcG9ydFBhdGggPSBjaGlsZC5nZXRUZXh0KHNvdXJjZUZpbGUpLnJlcGxhY2UoL1tcXFwiXFwnXS9nLCAnJyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaW1wb3J0RGVjbGFyYXRpb25zLnB1c2goe1xuICAgICAgbm9kZSxcbiAgICAgIGltcG9ydFBhdGgsXG4gICAgfSk7XG4gIH1cbiAgbm9kZS5mb3JFYWNoQ2hpbGQoY2hpbGQgPT4ge1xuICAgIGdldEltcG9ydERlY2xhcmF0aW9uTm9kZXMoY2hpbGQsIHNvdXJjZUZpbGUsIGltcG9ydERlY2xhcmF0aW9ucyk7XG4gIH0pO1xuICByZXR1cm4gaW1wb3J0RGVjbGFyYXRpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBJbXBvcnRzTm9kZXNGcm9tRmlsZShpbXBvcnRzVG9TdHJpcDogc3RyaW5nW10sIGNvbnRlbnQ6IHN0cmluZywgaW1wb3J0RGVjbGFyYXRpb25zOiBJbXBvcnREZWNsYXJhdGlvbltdKSB7XG4gIGxldCBvdXRwdXRDb250ZW50ID0gY29udGVudDtcbiAgY29uc3QgZmlsdGVyZWRJbXBvcnRzID0gaW1wb3J0RGVjbGFyYXRpb25zLmZpbHRlcihpdGVtID0+IGltcG9ydHNUb1N0cmlwLmluY2x1ZGVzKGl0ZW0uaW1wb3J0UGF0aCkpO1xuICBmb3IgKGNvbnN0IGltcG9ydEl0ZW0gb2YgZmlsdGVyZWRJbXBvcnRzKSB7XG4gICAgb3V0cHV0Q29udGVudCA9IG91dHB1dENvbnRlbnQuc2xpY2UoMCwgaW1wb3J0SXRlbS5ub2RlLnBvcykgKyBvdXRwdXRDb250ZW50LnNsaWNlKGltcG9ydEl0ZW0ubm9kZS5lbmQpO1xuICB9XG4gIHJldHVybiBvdXRwdXRDb250ZW50O1xufVxuXG50eXBlIEZvdW5kQWxwaW5lRnVuY3Rpb24gPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgaXNEZWZhdWx0RXhwb3J0OiBib29sZWFuO1xuICBoYXNFeHBvcnQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRGF0YUF0dHJpYnV0ZXNBbmRGdW5jdGlvbnMoXG4gIG5vZGU6IHRzLk5vZGUsXG4gIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gIGZvdW5kRGF0YUF0dHJpYnV0ZXM6IHN0cmluZ1tdID0gW10sXG4gIGZvdW5kRnVuY3Rpb25zOiBGb3VuZEFscGluZUZ1bmN0aW9uW10gPSBbXVxuKSB7XG4gIGlmIChub2RlLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuSnN4QXR0cmlidXRlKSB7XG4gICAgY29uc3QgYXR0cmlidXRlID0gZ2V0QXR0cmlidXRlVmFsdWVQYWlyKG5vZGUsIHNvdXJjZUZpbGUpO1xuICAgIGlmIChhdHRyaWJ1dGU/LlswXSA9PT0gJ3gtZGF0YScgJiYgYXR0cmlidXRlPy5bMV0pIHtcbiAgICAgIC8vIFdlIGZvdW5kIGEgZGF0YSBhdHRyaWJ1dGUsIFxuICAgICAgLy8gc28gbm93IHdlIGhhdmUgdG8gc2VhcmNoIHRocm91Z2hvdXQgdGhlIGZpbGUgZm9yIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24gb2YgdGhlIHNhbWUgbmFtZVxuICAgICAgZm91bmREYXRhQXR0cmlidXRlcy5wdXNoKGF0dHJpYnV0ZVsxXS5yZXBsYWNlKC9bXmEtekEtWjAtOV0vZywgJycpKTtcbiAgICB9XG4gIH1cbiAgaWYgKG5vZGUua2luZCA9PT0gdHMuU3ludGF4S2luZC5Tb3VyY2VGaWxlKSB7XG4gICAgbm9kZS5mb3JFYWNoQ2hpbGQoY2hpbGQgPT4ge1xuICAgICAgaWYgKFt0cy5TeW50YXhLaW5kLkZ1bmN0aW9uRGVjbGFyYXRpb24sIHRzLlN5bnRheEtpbmQuVmFyaWFibGVEZWNsYXJhdGlvbl0uaW5jbHVkZXMoY2hpbGQua2luZCkpIHtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25zID0gZ2V0RnVuY3Rpb25EZWNsYXJhdGlvblZhbHVlKGNoaWxkLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgZm91bmRGdW5jdGlvbnMucHVzaChmdW5jdGlvbnMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbm9kZS5mb3JFYWNoQ2hpbGQoY2hpbGQgPT4ge1xuICAgIGZpbmREYXRhQXR0cmlidXRlc0FuZEZ1bmN0aW9ucyhjaGlsZCwgc291cmNlRmlsZSwgZm91bmREYXRhQXR0cmlidXRlcywgZm91bmRGdW5jdGlvbnMpO1xuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBmb3VuZERhdGFBdHRyaWJ1dGVzLFxuICAgIGZvdW5kRnVuY3Rpb25zLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWVQYWlyKG5vZGU6IHRzLk5vZGUsIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBub2RlLmZvckVhY2hDaGlsZChjaGlsZCA9PiB7XG4gICAgcmVzdWx0LnB1c2goY2hpbGQuZ2V0VGV4dChzb3VyY2VGaWxlKSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RnVuY3Rpb25EZWNsYXJhdGlvblZhbHVlKG5vZGU6IHRzLk5vZGUsIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUpOiBGb3VuZEFscGluZUZ1bmN0aW9uIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIG5hbWU6IG51bGwsXG4gICAgaXNEZWZhdWx0RXhwb3J0OiBmYWxzZSxcbiAgICBoYXNFeHBvcnQ6IGZhbHNlLFxuICB9O1xuICBub2RlLmZvckVhY2hDaGlsZChjaGlsZCA9PiB7XG4gICAgaWYgKGNoaWxkLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuRXhwb3J0S2V5d29yZCkge1xuICAgICAgcmVzdWx0Lmhhc0V4cG9ydCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChjaGlsZC5raW5kID09PSB0cy5TeW50YXhLaW5kLkRlZmF1bHRLZXl3b3JkKSB7XG4gICAgICByZXN1bHQuaXNEZWZhdWx0RXhwb3J0ID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNoaWxkLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuSWRlbnRpZmllcikge1xuICAgICAgcmVzdWx0Lm5hbWUgPSBjaGlsZC5nZXRUZXh0KHNvdXJjZUZpbGUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIENvbnZlcnQgZW50cnkgcG9pbnQgZmlsZXMgaW50byBvbmUgYmlnIGJ1bmRsZSBmaWxlXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEVudHJ5UG9pbnRzVG9TaW5nbGVGaWxlKGVudHJ5UG9pbnRzOiBzdHJpbmdbXSwgdGVtcFdyaXRlUGF0aDogc3RyaW5nKSB7XG4gIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgdGVtcFdyaXRlUGF0aCxcbiAgICBlbnRyeVBvaW50c1xuICAgICAgLm1hcChlbnRyeSA9PiBgaW1wb3J0IFwiJHtlbnRyeX1cImApXG4gICAgICAuam9pbignO1xcbicpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVDbGllbnRTY3JpcHRJblRTWEZpbGUocGF0aE5hbWU6IHN0cmluZykge1xuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGhOYW1lLCAndXRmLTgnKTtcbiAgY29uc3Qgc291cmNlID0gdHMuY3JlYXRlU291cmNlRmlsZShcbiAgICBwYXRoTmFtZSxcbiAgICBjb250ZW50LFxuICAgIHRzLlNjcmlwdFRhcmdldC5MYXRlc3RcbiAgKTtcbiAgbGV0IHRvUmVtb3ZlRnJvbTogbnVtYmVyO1xuICBsZXQgY2xpZW50RGF0YVN0YXJ0OiBudW1iZXI7XG4gIGNvbnN0IGNsaWVudEltcG9ydHNUb0hvaXN0ID0gW107XG4gIGNvbnN0IGNsaWVudEltcG9ydHNUb1JlcGxhY2UgPSBbXTtcbiAgc291cmNlLmZvckVhY2hDaGlsZCgoY2hpbGQpID0+IHtcbiAgICBpZiAoY2hpbGQua2luZCA9PT0gdHMuU3ludGF4S2luZC5FeHByZXNzaW9uU3RhdGVtZW50KSB7XG4gICAgICBjb25zdCB0ZXh0ID0gY2hpbGQuZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgLy8gUmVtb3ZlIGZyb20gaGVyZVxuICAgICAgaWYgKHRleHQuc3RhcnRzV2l0aCgnPHNjcmlwdCcpKSB7XG4gICAgICAgIHRvUmVtb3ZlRnJvbSA9IGNoaWxkLnBvcztcbiAgICAgICAgY2xpZW50RGF0YVN0YXJ0ID0gY2hpbGQuZW5kO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBIb2lzdCB0aGUgY2xpZW50IGltcG9ydHMgdG8gYWJvdmUgdGhlIDxzY3JpcHQgLz4gdGFnXG4gICAgaWYgKGNoaWxkLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuSW1wb3J0RGVjbGFyYXRpb24gJiYgY2hpbGQucG9zID49IGNsaWVudERhdGFTdGFydCkge1xuICAgICAgY29uc3QgdGV4dCA9IGNoaWxkLmdldFRleHQoc291cmNlKTtcbiAgICAgIGNoaWxkLmZvckVhY2hDaGlsZChjaGlsZCA9PiB7XG4gICAgICAgIGlmIChjaGlsZC5raW5kID09PSB0cy5TeW50YXhLaW5kLlN0cmluZ0xpdGVyYWwpIHtcbiAgICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIGNsaWVudCBpbXBvcnRzIG5lZWRlZCBmb3IgcGF0aCByZXBsYWNlbWVudCB0byBiZSBhYnNvbHV0ZVxuICAgICAgICAgIGNvbnN0IHRleHQgPSBjaGlsZC5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IHRleHQucmVwbGFjZSgvW1xcXCJcXCddL2csICcnKTtcbiAgICAgICAgICBjb25zdCBpc1JlbGF0aXZlSW1wb3J0ID0gaW1wb3J0UGF0aC5zdGFydHNXaXRoKCcuJykgfHwgaW1wb3J0UGF0aC5zdGFydHNXaXRoKCcvJyk7XG4gICAgICAgICAgaWYgKCFpc1JlbGF0aXZlSW1wb3J0KSByZXR1cm47XG4gICAgICAgICAgY2xpZW50SW1wb3J0c1RvUmVwbGFjZS5wdXNoKHtcbiAgICAgICAgICAgIG9sZDogaW1wb3J0UGF0aCxcbiAgICAgICAgICAgIG5ldzogcGF0aC5qb2luKHBhdGguZGlybmFtZShwYXRoTmFtZSksIGltcG9ydFBhdGgpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNsaWVudEltcG9ydHNUb0hvaXN0LnB1c2godGV4dCk7XG4gICAgfVxuICB9KTtcbiAgbGV0IGNsaWVudENvbnRlbnQgPSAhaXNOYU4oY2xpZW50RGF0YVN0YXJ0KSA/IGNvbnRlbnQuc2xpY2UoY2xpZW50RGF0YVN0YXJ0KSA6ICcnO1xuICBmb3IgKGNvbnN0IGNsaWVudEltcG9ydCBvZiBjbGllbnRJbXBvcnRzVG9SZXBsYWNlKSB7XG4gICAgY2xpZW50Q29udGVudCA9IGNsaWVudENvbnRlbnQucmVwbGFjZShjbGllbnRJbXBvcnQub2xkLCBjbGllbnRJbXBvcnQubmV3KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGNvbnRlbnQ6ICFpc05hTih0b1JlbW92ZUZyb20pID9cbiAgICAgIGNsaWVudEltcG9ydHNUb0hvaXN0LmpvaW4oJ1xcbicpICsgY29udGVudC5zbGljZSgwLCB0b1JlbW92ZUZyb20pIDpcbiAgICAgIGNvbnRlbnQsXG4gICAgY2xpZW50Q29udGVudCxcbiAgICBmdWxsQ29udGVudDogY29udGVudCxcbiAgICB0b1JlbW92ZUZyb20sXG4gICAgY2xpZW50RGF0YVN0YXJ0LFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRSZWN1cnNpdmVGcm9tKFxuICBub2RlOiB0cy5Ob2RlLCBpbmRlbnRMZXZlbDogbnVtYmVyLCBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlXG4pIHtcbiAgY29uc3QgaW5kZW50YXRpb24gPSAnLScucmVwZWF0KGluZGVudExldmVsKTtcbiAgY29uc3Qgc3ludGF4S2luZCA9IHRzLlN5bnRheEtpbmRbbm9kZS5raW5kXTtcbiAgY29uc3Qgbm9kZVRleHQgPSBub2RlLmdldFRleHQoc291cmNlRmlsZSk7XG4gIGNvbnNvbGUubG9nKGAke2luZGVudGF0aW9ufSR7c3ludGF4S2luZH06ICR7bm9kZVRleHR9YCk7XG5cbiAgbm9kZS5mb3JFYWNoQ2hpbGQoY2hpbGQgPT5cbiAgICBwcmludFJlY3Vyc2l2ZUZyb20oY2hpbGQsIGluZGVudExldmVsICsgMSwgc291cmNlRmlsZSlcbiAgKTtcbn1cbiIsICJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCByZXF1aXJlIGZyb20gJy4vcmVxdWlyZSc7XG5pbXBvcnQgeyBYUGluZUNvbmZpZyB9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuY29uc3Qgcm9vdERpciA9IHByb2Nlc3MuY3dkKCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUm9vdChwYXRoTmFtZT86IHN0cmluZykge1xuICBpZiAoIXBhdGhOYW1lKSByZXR1cm4gcm9vdERpcjtcbiAgcmV0dXJuIHBhdGguam9pbihyb290RGlyLCBwYXRoTmFtZSk7XG59XG5cbmNvbnN0IHVzZXJDb25maWcgPSByZXF1aXJlKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnLi94cGluZS5jb25maWcubWpzJykpLmRlZmF1bHQ7XG5cbmNvbnN0IGNvbmZpZ0RlZmF1bHRzID0ge1xuICByb290RGlyOiBmcm9tUm9vdCgpLFxuICBzcmNEaXI6IGZyb21Sb290KCcuL3NyYycpLFxuICBkaXN0RGlyOiBmcm9tUm9vdCgnLi9kaXN0JyksXG4gIHBhY2thZ2VKc29uUGF0aDogZnJvbVJvb3QoJ3BhY2thZ2UuanNvbicpLFxuICAvLyBXZSBuZWVkIHRvIHVzZSBnZXR0ZXJzIGhlcmUgaW4gdGhlIGV2ZW50IHNvbWVvbmUgd2FudHMgdG8gY2hhbmdlIGZvbGRlcnMsIHN1Y2ggYXMgdGhlIGRpc3QgZm9sZGVyXG4gIGdldCBkaXN0UHVibGljRGlyKCkge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXN0RGlyLCAnLi9wdWJsaWMnKTtcbiAgfSxcbiAgZ2V0IGRpc3RQdWJsaWNTY3JpcHRzRGlyKCkge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXN0UHVibGljRGlyLCAnLi9zY3JpcHRzJyk7XG4gIH0sXG4gIGdldCBkaXN0VGVtcEZvbGRlcigpIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuZGlzdERpciwgJy4vdGVtcCcpO1xuICB9LFxuICBnZXQgY2xpZW50SlNCdW5kbGVQYXRoKCkge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXN0UHVibGljU2NyaXB0c0RpciwgJy4vYXBwLmpzJyk7XG4gIH0sXG4gIGdldCBhbHBpbmVEYXRhUGF0aCgpIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuZGlzdFRlbXBGb2xkZXIsICcuL2FscGluZS1kYXRhLnRzJyk7XG4gIH0sXG4gIGdldCBzZXJ2ZXJEaXN0RGlyKCkge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXN0RGlyLCAnLi9zZXJ2ZXInKTtcbiAgfSxcbiAgZ2V0IHNlcnZlckRpc3RBcHBQYXRoKCkge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5zZXJ2ZXJEaXN0RGlyLCAnLi9hcHAuanMnKTtcbiAgfSxcbiAgLy8gSW1wb3J0YW50IGRpcnMvcGF0aHNcbiAgZ2V0IHBhZ2VzRGlyKCkge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5zcmNEaXIsICcuL3BhZ2VzJyk7XG4gIH0sXG4gIGdldCBwdWJsaWNEaXIoKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLnNyY0RpciwgJy4vcHVibGljJyk7XG4gIH0sXG4gIGdldCBzZXJ2ZXJEaXIoKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLnNyY0RpciwgJy4vc2VydmVyJyk7XG4gIH0sXG4gIGdldCBydW5EaXIoKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLnNlcnZlckRpciwgJy4vcnVuJyk7XG4gIH0sXG4gIGdldCBzZXJ2ZXJBcHBQYXRoKCkge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5zZXJ2ZXJEaXIsICcuL2FwcC50cycpO1xuICB9LFxuICBnZXQgZ2xvYmFsQ1NTRmlsZSgpIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMucHVibGljRGlyLCAnLi9zdHlsZXMvZ2xvYmFsLmNzcycpO1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGNvbmZpZzogWFBpbmVDb25maWcgPSB7XG4gIC4uLmNvbmZpZ0RlZmF1bHRzLFxuICAuLi51c2VyQ29uZmlnLFxufTsiLCAiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ21vZHVsZSc7XG5cbmNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG5cbmV4cG9ydCBkZWZhdWx0IHJlcXVpcmU7IiwgImltcG9ydCBkb3RlbnYgZnJvbSAnZG90ZW52JztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi9nZXQtY29uZmlnJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwRW52KCkge1xuICBkb3RlbnYuY29uZmlnKHsgcGF0aDogcGF0aC5qb2luKGNvbmZpZy5yb290RGlyLCBgLi8uZW52LiR7cHJvY2Vzcy5lbnYuU1RBR0UgfHwgJ2Rldid9YCksfSk7XG59XG4iLCAiaW1wb3J0IGV4cHJlc3MsIHsgTmV4dEZ1bmN0aW9uLCBFeHByZXNzLCBSZXF1ZXN0LCBSZXNwb25zZSB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgZ2xvYlN5bmMgfSBmcm9tICdnbG9iJztcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4vdXRpbC9nZXQtY29uZmlnJztcbmltcG9ydCB7IHZlcmlmeVVzZXIgfSBmcm9tICcuL2F1dGgnO1xuaW1wb3J0IHJlcXVlc3RJUCBmcm9tICdyZXF1ZXN0LWlwJztcbmltcG9ydCB7IFNlcnZlclJlcXVlc3QgfSBmcm9tICcuLi90eXBlcyc7XG5cbmNvbnN0IGRvY3R5cGVIVE1MID0gJzwhRE9DVFlQRSBodG1sPic7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVSb3V0ZXIoKSB7XG4gIGNvbnN0IG1ldGhvZHMgPSBbJ2dldCcsICdwb3N0JywgJ3B1dCcsICdwYXRjaCcsICdkZWxldGUnXTtcbiAgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcbiAgY29uc3Qgcm91dGVzID0gZ2xvYlN5bmMoY29uZmlnLnBhZ2VzRGlyICsgJy8qKi8qLnt0c3gsdHN9Jyk7XG4gIGNvbnN0IHJvdXRlTWFwID0gcm91dGVzLm1hcChyb3V0ZSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJvdXRlOiByb3V0ZS5zcGxpdChjb25maWcucGFnZXNEaXIpLnBvcCgpLnJlcGxhY2UoJy50c3gnLCAnJykucmVwbGFjZSgnLmpzJywgJycpLnJlcGxhY2UoJy50cycsICcnKS5yZXBsYWNlKCcvaW5kZXgnLCAnLycpLFxuICAgICAgcGF0aDogcm91dGUucmVwbGFjZShjb25maWcuc3JjRGlyLCBjb25maWcuZGlzdERpcikucmVwbGFjZSgnLnRzeCcsICcuanMnKS5yZXBsYWNlKCcudHMnLCAnLmpzJyksXG4gICAgICBvcmlnaW5hbFJvdXRlOiByb3V0ZSxcbiAgICB9O1xuICB9KTtcbiAgY29uc3Qgcm91dGVSZXN1bHRzID0gW107XG5cbiAgZm9yIChjb25zdCByb3V0ZSBvZiByb3V0ZU1hcCkge1xuICAgIGNvbnN0IGlzSlNYID0gcm91dGUub3JpZ2luYWxSb3V0ZS5lbmRzV2l0aCgnLnRzeCcpIHx8IHJvdXRlLm9yaWdpbmFsUm91dGUuZW5kc1dpdGgoJy5qc3gnKTtcbiAgICAvLyBJbXBvcnQgcm91dGVcbiAgICBjb25zdCByb3V0ZUl0ZW0gPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyA/IG51bGwgOiAoYXdhaXQgaW1wb3J0KHJvdXRlLnBhdGgpKS5kZWZhdWx0O1xuICAgIC8vIENvbmZpZ3VyZSByZXN1bHQsbWV0aG9kcyBmb3IgdGhlIHJvdXRlXG4gICAgY29uc3Qgc2x1Z1JvdXRlID0gcm91dGUucm91dGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bIF0vZywgJycpO1xuICAgIGNvbnN0IGZvdW5kTWV0aG9kID0gbWV0aG9kcy5maW5kKG1ldGhvZCA9PiBzbHVnUm91dGUuZW5kc1dpdGgoYC4ke21ldGhvZH1gKSk7XG4gICAgY29uc3QgaXNEeW5hbWljUm91dGUgPSBzbHVnUm91dGUubWF0Y2goL1xcWyguKilcXF0vZyk7XG4gICAgbGV0IGZvcm1hdHRlZFJvdXRlSXRlbSA9IHNsdWdSb3V0ZTtcbiAgICBpZiAoZm91bmRNZXRob2QpIGZvcm1hdHRlZFJvdXRlSXRlbSA9IGZvcm1hdHRlZFJvdXRlSXRlbS5zcGxpdCgnLicpLnNoaWZ0KCk7XG4gICAgLy8gSGFuZGxlIGR5bmFtaWMgcm91dGluZ1xuICAgIGlmIChpc0R5bmFtaWNSb3V0ZSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gWy4uLmZvcm1hdHRlZFJvdXRlSXRlbS5tYXRjaEFsbCgvKFxcWykoLio/KShcXF0pL2cpXTtcbiAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgcmVzdWx0KSB7XG4gICAgICAgIGZvcm1hdHRlZFJvdXRlSXRlbSA9IGZvcm1hdHRlZFJvdXRlSXRlbS5yZXBsYWNlKG1hdGNoWzBdLCAnOicgKyBtYXRjaFsyXSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFB1c2ggdG8gdGhlIHJvdXRlIHJlc3VsdHMgYXJyYXlcbiAgICByb3V0ZVJlc3VsdHMucHVzaCh7XG4gICAgICBmb3JtYXR0ZWRSb3V0ZUl0ZW0sXG4gICAgICBmb3VuZE1ldGhvZCxcbiAgICAgIHJvdXRlLFxuICAgIH0pO1xuICAgIHJvdXRlcltmb3VuZE1ldGhvZCB8fCAnZ2V0J10oZm9ybWF0dGVkUm91dGVJdGVtLCBhc3luYyAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGEgc3RyaW5nIHJlc3BvbnNlIGZyb20gdGhlIHJvdXRlSXRlbSBvciBpcyBhIGRpZmZlcmVudCByZXNwb25zZVxuICAgICAgICBpZiAocm91dGVJdGVtKSB7XG4gICAgICAgICAgaWYgKGlzSlNYKSB7XG4gICAgICAgICAgICByZXMuc2VuZChkb2N0eXBlSFRNTCArIChhd2FpdCByb3V0ZUl0ZW0ocmVxLCByZXMpKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHJvdXRlSXRlbShyZXEsIHJlcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWZhdWx0Um91dGVJbXBvcnQgPSAoYXdhaXQgaW1wb3J0KHJvdXRlLnBhdGggKyBgP2NhY2hlPSR7RGF0ZS5ub3coKX1gKSkuZGVmYXVsdDtcbiAgICAgICAgLy8gUmVxdWlyZSBldmVyeSB0aW1lIG9ubHkgaWYgaW4gZGV2ZWxvcG1lbnQgbW9kZVxuICAgICAgICBpZiAoaXNKU1gpIHtcbiAgICAgICAgICByZXMuc2VuZChkb2N0eXBlSFRNTCArIChhd2FpdCBkZWZhdWx0Um91dGVJbXBvcnQocmVxLCByZXMpKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgZGVmYXVsdFJvdXRlSW1wb3J0KHJlcSwgcmVzKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgcmVzLnN0YXR1cyhlcnI/LnN0YXR1cyB8fCA1MDApLnNlbmQoZXJyPy5tZXNzYWdlIHx8ICdFcnJvcicpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiB7XG4gICAgcm91dGVyLFxuICAgIHJvdXRlUmVzdWx0cyxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5VXNlck1pZGRsZXdhcmUocmVxOiBTZXJ2ZXJSZXF1ZXN0LCBfcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgY29uc3QgeyB1c2VydG9rZW4sIH0gPSByZXEuY29va2llcztcbiAgaWYgKCF1c2VydG9rZW4pIHtcbiAgICByZXEudXNlciA9IG51bGw7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCB7IHVzZXIsIH0gPSBhd2FpdCB2ZXJpZnlVc2VyKHVzZXJ0b2tlbik7XG4gICAgcmVxLnVzZXIgPSB1c2VyO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXEudXNlciA9IG51bGw7XG4gIH1cbiAgbmV4dCgpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlWFBpbmVSb3V0ZXIoYXBwOiBhbnksIGJlZm9yZUVycm9yUm91dGU/OiAoYXBwOiBFeHByZXNzKSA9PiB2b2lkKSB7XG4gIGFwcC51c2UoZXhwcmVzcy5zdGF0aWMoY29uZmlnLmRpc3RQdWJsaWNEaXIpKTtcbiAgYXBwLnVzZSh2ZXJpZnlVc2VyTWlkZGxld2FyZSk7XG4gIGFwcC51c2UocmVxdWVzdElQLm13KCkpO1xuXG4gIGNvbnN0IHsgcm91dGVyLCByb3V0ZVJlc3VsdHMsIH0gPSBhd2FpdCBjcmVhdGVSb3V0ZXIoKTtcbiAgYXBwLnVzZShmdW5jdGlvbiByZXBsYWNlYWJsZVJvdXRlcihyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikge1xuICAgIHJvdXRlcihyZXEsIHJlcywgbmV4dCk7XG4gIH0pO1xuXG4gIGNvbnN0IGZvdW5kNDA0ID0gcm91dGVSZXN1bHRzPy5maW5kKGl0ZW0gPT4gaXRlbT8uZm9ybWF0dGVkUm91dGVJdGVtID09PSAnLzQwNCcpO1xuICBjb25zdCBpbXBvcnQ0MDQgPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JyA/IG51bGwgOiAoYXdhaXQgaW1wb3J0KGZvdW5kNDA0LnJvdXRlLnBhdGgpKS5kZWZhdWx0O1xuXG4gIGlmIChiZWZvcmVFcnJvclJvdXRlKSBiZWZvcmVFcnJvclJvdXRlKGFwcCk7XG5cbiAgLy8gZXJyb3IgaGFuZGxlclxuICBhcHAudXNlKGFzeW5jIGZ1bmN0aW9uIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpIHtcbiAgICAvLyByZW5kZXIgdGhlIGVycm9yIHBhZ2VcbiAgICByZXMuc3RhdHVzKDQwNCk7XG5cbiAgICBpZiAoaW1wb3J0NDA0KSB7XG4gICAgICByZXMuc2VuZChkb2N0eXBlSFRNTCArIChhd2FpdCBpbXBvcnQ0MDQocmVxLCByZXMpKSk7XG4gICAgfSBlbHNlIGlmIChmb3VuZDQwNCAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgY29uc3QgaW1wb3J0NDA0SXRlbSA9IChhd2FpdCBpbXBvcnQoZm91bmQ0MDQucm91dGUucGF0aCArIGA/Y2FjaGU9JHtEYXRlLm5vdygpfWApKS5kZWZhdWx0XG4gICAgICByZXMuc2VuZChkb2N0eXBlSFRNTCArIChhd2FpdCBpbXBvcnQ0MDRJdGVtKHJlcSwgcmVzKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMuc2VuZCgnRXJyb3InKTtcbiAgICB9XG4gIH0pO1xufSIsICJpbXBvcnQganNvbndlYnRva2VuIGZyb20gJ2pzb253ZWJ0b2tlbic7XG5pbXBvcnQgeyBTZXJ2ZXJSZXF1ZXN0IH0gZnJvbSAnLi4vdHlwZXMnO1xuY29uc3QgeyB2ZXJpZnksIHNpZ24sIH0gPSBqc29ud2VidG9rZW47XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduVXNlcihlbWFpbDogc3RyaW5nLCB1c2VybmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgc2lnbihcbiAgICAgIHtcbiAgICAgICAgdXNlcjoge1xuICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgIHVzZXJuYW1lLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHByb2Nlc3MuZW52LkpXVF9QUklWQVRFX0tFWSxcbiAgICAgIHsgZXhwaXJlc0luOiAnMzBkJywgfSxcbiAgICAgIChlcnIsIHRva2VuKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHJlamVjdChlcnIpO1xuICAgICAgICByZXNvbHZlKHRva2VuKTtcbiAgICAgIH0pO1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeVVzZXIodG9rZW46IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHZlcmlmeSh0b2tlbiwgcHJvY2Vzcy5lbnYuSldUX1BSSVZBVEVfS0VZLCAoZXJyLCBhdXRob3JpemVkRGF0YSkgPT4ge1xuICAgICAgaWYgKGVycikgcmVqZWN0KGVycik7XG4gICAgICByZXNvbHZlKGF1dGhvcml6ZWREYXRhKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb2tlbkZyb21SZXF1ZXN0KHJlcTogU2VydmVyUmVxdWVzdCkge1xuICAvLyBAdHMtaWdub3JlXG4gIGNvbnN0IHsgYXV0aG9yaXphdGlvbiwgfSA9IHJlcS5oZWFkZXJzO1xuICBpZiAoIWF1dGhvcml6YXRpb24pIHJldHVybiBudWxsO1xuICBjb25zdCB0b2tlbiA9IGF1dGhvcml6YXRpb24uc3BsaXQoJyAnKS5wb3AoKSB8fCAnJztcbiAgcmV0dXJuIHRva2VuIHx8IG51bGw7XG59IiwgImV4cG9ydCBjbGFzcyBodG1sIHtcblxuICBzdGF0aWMgYXR0cmlidXRlT2JqZWN0VG9TdHJpbmcocHJvcHMpIHtcbiAgICBpZiAoIXByb3BzKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHByb3BzKVxuICAgICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgLm1hcCgoW2tleSwgdmFsdWVdLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IGluZGV4ID09PSAwID8gJyAnIDogJyc7XG4gICAgICAgIHJldHVybiBgJHtzdGFydH0ke2tleX09XCIke3ZhbHVlfVwiYDtcbiAgICAgIH0pXG4gICAgICAuam9pbignICcpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGZyYWdtZW50KHByb3BzKSB7XG4gICAgY29uc3QgY2hpbGRyZW5SZXN1bHQgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9wcy5jaGlsZHJlbi5mbGF0KCkpO1xuICAgIHJldHVybiBjaGlsZHJlblJlc3VsdC5maWx0ZXIoQm9vbGVhbikuam9pbignJyk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlRWxlbWVudCh0eXBlLCBwcm9wcywgLi4uY2hpbGRyZW4pIHtcbiAgICBjb25zdCBjaGlsZHJlblJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsKGNoaWxkcmVuLmZsYXQoKSk7XG4gICAgLy8gSGFuZGxlIHBhc3NpbmcgaW4gYW5vdGhlciBlbGVtZW50XG4gICAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0eXBlKHsgLi4ucHJvcHMsIGNoaWxkcmVuOiBjaGlsZHJlblJlc3VsdCwgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gYDwke3R5cGV9JHt0aGlzLmF0dHJpYnV0ZU9iamVjdFRvU3RyaW5nKHByb3BzKX0+JHtjaGlsZHJlblJlc3VsdC5maWx0ZXIoQm9vbGVhbikuam9pbignJyl9PC8ke3R5cGV9PmA7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEpTWFJ1bnRpbWUoKSB7XG4gIHJldHVybiB0cnVlO1xufSJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxPQUFPLGVBQWU7QUFDdEIsT0FBTyxVQUFVO0FBQ2pCLE9BQU8sYUFBYTtBQUNwQixPQUFPLGtCQUFrQjtBQUN6QixPQUFP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LEtBQUssQ0FBQztBQUM5RCxXQUFPLGVBQWUsT0FBTyxPQUFPLEVBQUUsS0FBSyxFQUFFO0FBQUEsRUFDL0M7QUFBQSxFQUVBLGFBQWEsY0FBYyxNQUFNLFVBQVUsVUFBVTtBQUNuRCxVQUFNLGlCQUFpQixNQUFNLFFBQVEsSUFBSSxTQUFTLEtBQUssQ0FBQztBQUV4RCxRQUFJLE9BQU8sU0FBUyxZQUFZO0FBQzlCLFlBQU0sU0FBUyxNQUFNLEtBQUssRUFBRSxHQUFHLE9BQU8sVUFBVSxlQUFnQixDQUFDO0FBQ2pFLGFBQU87QUFBQSxJQUNUO0FBQ0EsV0FBTyxJQUFJLElBQUksR0FBRyxLQUFLLHdCQUF3QixLQUFLLENBQUMsSUFBSSxlQUFlLE9BQU8sT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEtBQUssSUFBSTtBQUFBLEVBQzNHO0FBQ0Y7QUFFTyxTQUFTLGFBQWE7QUFDM0IsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogWyJwYXRoIiwgImZzIiwgInRzIiwgImNoaWxkIiwgInRleHQiLCAicGF0aCIsICJyZXF1aXJlIiwgInBhdGgiLCAiZnMiLCAiYnVpbGQiLCAicGF0aCIsICJ0cyIsICJwYXRoIiwgInBhdGgiLCAicGF0aCIsICJwYXRoIiwgInN0YXJ0U2VydmVyIiwgImV4cHJlc3MiLCAiZ2xvYlN5bmMiLCAiZXhwcmVzcyIsICJnbG9iU3luYyJdCn0K
@@ -0,0 +1,10 @@
1
+ // src/build/dev-server.mjs
2
+ var socketProtocol = "ws:";
3
+ var echoSocketUrl = socketProtocol + "//" + window.location.hostname + ":3001/dev-server/";
4
+ var socket = new WebSocket(echoSocketUrl);
5
+ socket.addEventListener("message", async (msg) => {
6
+ if (msg.data === "refresh:client") {
7
+ window.location.reload();
8
+ }
9
+ });
10
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2J1aWxkL2Rldi1zZXJ2ZXIubWpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJjb25zdCBzb2NrZXRQcm90b2NvbCA9ICd3czonO1xuY29uc3QgZWNob1NvY2tldFVybCA9IHNvY2tldFByb3RvY29sICsgJy8vJyArIHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSArICc6MzAwMS9kZXYtc2VydmVyLyc7XG5jb25zdCBzb2NrZXQgPSBuZXcgV2ViU29ja2V0KGVjaG9Tb2NrZXRVcmwpO1xuXG5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGFzeW5jIChtc2cpID0+IHtcbiAgaWYgKG1zZy5kYXRhID09PSAncmVmcmVzaDpjbGllbnQnKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICB9XG59KTtcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxJQUFNLGlCQUFpQjtBQUN2QixJQUFNLGdCQUFnQixpQkFBaUIsT0FBTyxPQUFPLFNBQVMsV0FBVztBQUN6RSxJQUFNLFNBQVMsSUFBSSxVQUFVLGFBQWE7QUFFMUMsT0FBTyxpQkFBaUIsV0FBVyxPQUFPLFFBQVE7QUFDaEQsTUFBSSxJQUFJLFNBQVMsa0JBQWtCO0FBQ2pDLFdBQU8sU0FBUyxPQUFPO0FBQUEsRUFDekI7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,152 @@
1
+ // src/build/spa.mjs
2
+ async function replaceDocumentContentsWithLinkResponse() {
3
+ const links = [...document.querySelectorAll("[data-spa]")];
4
+ for (const link of links) {
5
+ link.addEventListener("click", updatePageOnLinkClick);
6
+ }
7
+ }
8
+ async function updatePageOnLinkClick(e) {
9
+ const targetHref = e?.target?.getAttribute("href");
10
+ if (!targetHref) return;
11
+ if (isExternalURL(targetHref) && !e?.target?.getAttribute("data-spa-crossorigin")) return;
12
+ e.preventDefault();
13
+ try {
14
+ await getNewPageContent(targetHref);
15
+ if (targetHref === window.location.pathname) return;
16
+ window.history.pushState(
17
+ {
18
+ type: "link-click",
19
+ targetHref
20
+ },
21
+ "",
22
+ targetHref
23
+ );
24
+ const event = new CustomEvent("spa:updatePageURL", {
25
+ detail: {
26
+ href: targetHref
27
+ }
28
+ });
29
+ window.dispatchEvent(event);
30
+ } catch (err) {
31
+ console.error(err);
32
+ }
33
+ }
34
+ async function getNewPageContent(href) {
35
+ try {
36
+ const res = await fetch(href);
37
+ const text = await res.text();
38
+ const parser = new DOMParser();
39
+ const dom = parser.parseFromString(text, "text/html");
40
+ diffHead(dom);
41
+ const newScripts = removeBodyScripts(dom);
42
+ const clonedPersistentNodes = getPersistentNodesFromDocument(dom);
43
+ const body = dom.body.innerHTML;
44
+ document.body.innerHTML = body;
45
+ for (const clonedNode of clonedPersistentNodes) {
46
+ const newNode = document.body.querySelector(`[data-persistent="${clonedNode?.getAttribute("data-persistent")}"]`);
47
+ newNode.replaceWith(clonedNode);
48
+ }
49
+ replaceAttributesOnDocumentBody(dom);
50
+ replaceDocumentContentsWithLinkResponse();
51
+ for (const script of newScripts) document.body.appendChild(script);
52
+ const event = new CustomEvent("spa:updatePageContent", {
53
+ detail: {
54
+ href
55
+ }
56
+ });
57
+ window.dispatchEvent(event);
58
+ } catch (err) {
59
+ console.error(err);
60
+ console.error("Error getting link", href);
61
+ }
62
+ }
63
+ function diffHead(dom) {
64
+ const domHeadChildren = [...dom.head.children];
65
+ const currentHeadChildren = [...document.head.children];
66
+ const result = {
67
+ childrenToAdd: [],
68
+ childrenToRemove: []
69
+ };
70
+ for (const domChild of domHeadChildren) {
71
+ const foundInCurrentChildren = currentHeadChildren.find((child) => child.outerHTML === domChild.outerHTML);
72
+ if (!foundInCurrentChildren) result.childrenToAdd.push(domChild);
73
+ }
74
+ for (const currentChild of currentHeadChildren) {
75
+ const foundInDomChildren = domHeadChildren.find((child) => child.outerHTML === currentChild.outerHTML);
76
+ if (!foundInDomChildren) result.childrenToRemove.push(currentChild);
77
+ }
78
+ applyHeadDiffsToDocument(result);
79
+ }
80
+ function applyHeadDiffsToDocument(diff) {
81
+ for (const child of diff.childrenToRemove) {
82
+ document.head.removeChild(child);
83
+ }
84
+ for (const child of diff.childrenToAdd) {
85
+ if (child?.nodeName?.toLowerCase() == "script") {
86
+ const scriptElement = document.createElement("script");
87
+ portAttributesToElement(child, scriptElement);
88
+ scriptElement.innerHTML = child.innerHTML;
89
+ document.head.appendChild(scriptElement);
90
+ continue;
91
+ }
92
+ document.head.appendChild(child);
93
+ }
94
+ }
95
+ function removeBodyScripts(dom) {
96
+ const scripts = [...dom.body.querySelectorAll("script")];
97
+ const newElements = [];
98
+ for (const script of scripts) {
99
+ const element = document.createElement("script");
100
+ portAttributesToElement(script, element);
101
+ element.innerHTML = script.innerHTML;
102
+ dom.body.removeChild(script);
103
+ newElements.push(element);
104
+ }
105
+ return newElements;
106
+ }
107
+ function portAttributesToElement(oldEl, newEl) {
108
+ for (const attribute of oldEl.attributes) {
109
+ newEl.setAttribute(attribute.name, attribute.nodeValue);
110
+ }
111
+ }
112
+ function getPersistentNodesFromDocument(dom) {
113
+ const persistentNodesFromDom = [...dom.querySelectorAll("[data-persistent]")].map((el) => el.getAttribute("data-persistent"));
114
+ const persistentNodesFromBody = [...document.body.querySelectorAll("[data-persistent]")];
115
+ const validPersistentNodes = persistentNodesFromBody.filter((el) => {
116
+ return persistentNodesFromDom.includes(el.getAttribute("data-persistent"));
117
+ });
118
+ return validPersistentNodes.map((el) => el.cloneNode(true));
119
+ }
120
+ function replaceAttributesOnDocumentBody(dom) {
121
+ while (document.body.attributes.length > 0) {
122
+ document.body.removeAttribute(document.body.attributes[0].name);
123
+ }
124
+ for (const attribute of dom.body.attributes) {
125
+ document.body.setAttribute(attribute.name, attribute.nodeValue);
126
+ }
127
+ }
128
+ async function handleBackButton() {
129
+ await getNewPageContent(window.history.state?.targetHref || window.location.href);
130
+ }
131
+ function isRelativeURL(url) {
132
+ if (typeof url !== "string") return false;
133
+ try {
134
+ new URL(url);
135
+ return false;
136
+ } catch (err) {
137
+ if (url?.startsWith("//")) return false;
138
+ return true;
139
+ }
140
+ }
141
+ function isExternalURL(url) {
142
+ if (isRelativeURL(url)) return false;
143
+ try {
144
+ const computedURL = new URL(url);
145
+ return computedURL?.origin !== window.location?.origin;
146
+ } catch {
147
+ return false;
148
+ }
149
+ }
150
+ window.addEventListener("DOMContentLoaded", replaceDocumentContentsWithLinkResponse);
151
+ window.addEventListener("popstate", handleBackButton);
152
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2J1aWxkL3NwYS5tanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8vIEVuYWJsZXMgU1BBIGxpa2UgYmVoYXZpb3IgZm9yIGxpbmtzXG5cbmFzeW5jIGZ1bmN0aW9uIHJlcGxhY2VEb2N1bWVudENvbnRlbnRzV2l0aExpbmtSZXNwb25zZSgpIHtcbiAgY29uc3QgbGlua3MgPSBbLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtc3BhXScpXTtcbiAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgbGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHVwZGF0ZVBhZ2VPbkxpbmtDbGljayk7XG4gIH1cblxufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQYWdlT25MaW5rQ2xpY2soZSkge1xuICBjb25zdCB0YXJnZXRIcmVmID0gZT8udGFyZ2V0Py5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcbiAgaWYgKCF0YXJnZXRIcmVmKSByZXR1cm47XG4gIGlmIChpc0V4dGVybmFsVVJMKHRhcmdldEhyZWYpICYmICFlPy50YXJnZXQ/LmdldEF0dHJpYnV0ZSgnZGF0YS1zcGEtY3Jvc3NvcmlnaW4nKSkgcmV0dXJuO1xuICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZ2V0TmV3UGFnZUNvbnRlbnQodGFyZ2V0SHJlZik7XG4gICAgaWYgKHRhcmdldEhyZWYgPT09IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSkgcmV0dXJuO1xuICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ2xpbmstY2xpY2snLFxuICAgICAgICB0YXJnZXRIcmVmLFxuICAgICAgfSxcbiAgICAgICcnLFxuICAgICAgdGFyZ2V0SHJlZlxuICAgICk7XG4gICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3NwYTp1cGRhdGVQYWdlVVJMJywge1xuICAgICAgZGV0YWlsOiB7XG4gICAgICAgIGhyZWY6IHRhcmdldEhyZWYsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE5ld1BhZ2VDb250ZW50KGhyZWYpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChocmVmKTtcbiAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzLnRleHQoKTtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgY29uc3QgZG9tID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyh0ZXh0LCAndGV4dC9odG1sJyk7XG4gICAgZGlmZkhlYWQoZG9tKTtcbiAgICBjb25zdCBuZXdTY3JpcHRzID0gcmVtb3ZlQm9keVNjcmlwdHMoZG9tKTtcbiAgICBjb25zdCBjbG9uZWRQZXJzaXN0ZW50Tm9kZXMgPSBnZXRQZXJzaXN0ZW50Tm9kZXNGcm9tRG9jdW1lbnQoZG9tKTtcbiAgICBjb25zdCBib2R5ID0gZG9tLmJvZHkuaW5uZXJIVE1MO1xuICAgIGRvY3VtZW50LmJvZHkuaW5uZXJIVE1MID0gYm9keTtcbiAgICBmb3IgKGNvbnN0IGNsb25lZE5vZGUgb2YgY2xvbmVkUGVyc2lzdGVudE5vZGVzKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBjb25zdCBuZXdOb2RlID0gZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yKGBbZGF0YS1wZXJzaXN0ZW50PVwiJHtjbG9uZWROb2RlPy5nZXRBdHRyaWJ1dGUoJ2RhdGEtcGVyc2lzdGVudCcpfVwiXWApO1xuICAgICAgbmV3Tm9kZS5yZXBsYWNlV2l0aChjbG9uZWROb2RlKTtcbiAgICB9XG4gICAgcmVwbGFjZUF0dHJpYnV0ZXNPbkRvY3VtZW50Qm9keShkb20pO1xuICAgIHJlcGxhY2VEb2N1bWVudENvbnRlbnRzV2l0aExpbmtSZXNwb25zZSgpO1xuICAgIGZvciAoY29uc3Qgc2NyaXB0IG9mIG5ld1NjcmlwdHMpIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAvLyBTZW5kIGFuIGV2ZW50XG4gICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3NwYTp1cGRhdGVQYWdlQ29udGVudCcsIHtcbiAgICAgIGRldGFpbDoge1xuICAgICAgICBocmVmLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBnZXR0aW5nIGxpbmsnLCBocmVmKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaWZmSGVhZChkb20pIHtcbiAgY29uc3QgZG9tSGVhZENoaWxkcmVuID0gWy4uLmRvbS5oZWFkLmNoaWxkcmVuXTtcbiAgY29uc3QgY3VycmVudEhlYWRDaGlsZHJlbiA9IFsuLi5kb2N1bWVudC5oZWFkLmNoaWxkcmVuXTtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIGNoaWxkcmVuVG9BZGQ6IFtdLFxuICAgIGNoaWxkcmVuVG9SZW1vdmU6IFtdLFxuICB9O1xuICBmb3IgKGNvbnN0IGRvbUNoaWxkIG9mIGRvbUhlYWRDaGlsZHJlbikge1xuICAgIGNvbnN0IGZvdW5kSW5DdXJyZW50Q2hpbGRyZW4gPSBjdXJyZW50SGVhZENoaWxkcmVuLmZpbmQoY2hpbGQgPT4gY2hpbGQub3V0ZXJIVE1MID09PSBkb21DaGlsZC5vdXRlckhUTUwpO1xuICAgIGlmICghZm91bmRJbkN1cnJlbnRDaGlsZHJlbikgcmVzdWx0LmNoaWxkcmVuVG9BZGQucHVzaChkb21DaGlsZCk7XG4gIH1cbiAgZm9yIChjb25zdCBjdXJyZW50Q2hpbGQgb2YgY3VycmVudEhlYWRDaGlsZHJlbikge1xuICAgIGNvbnN0IGZvdW5kSW5Eb21DaGlsZHJlbiA9IGRvbUhlYWRDaGlsZHJlbi5maW5kKGNoaWxkID0+IGNoaWxkLm91dGVySFRNTCA9PT0gY3VycmVudENoaWxkLm91dGVySFRNTCk7XG4gICAgaWYgKCFmb3VuZEluRG9tQ2hpbGRyZW4pIHJlc3VsdC5jaGlsZHJlblRvUmVtb3ZlLnB1c2goY3VycmVudENoaWxkKTtcbiAgfVxuICBhcHBseUhlYWREaWZmc1RvRG9jdW1lbnQocmVzdWx0KTtcbn1cblxuZnVuY3Rpb24gYXBwbHlIZWFkRGlmZnNUb0RvY3VtZW50KGRpZmYpIHtcbiAgZm9yIChjb25zdCBjaGlsZCBvZiBkaWZmLmNoaWxkcmVuVG9SZW1vdmUpIHtcbiAgICAvLyBSZW1vdmUgZnJvbSBoZWFkXG4gICAgZG9jdW1lbnQuaGVhZC5yZW1vdmVDaGlsZChjaGlsZCk7XG4gIH1cbiAgZm9yIChjb25zdCBjaGlsZCBvZiBkaWZmLmNoaWxkcmVuVG9BZGQpIHtcbiAgICAvLyBIYW5kbGUgc2NyaXB0IHRhZ3NcbiAgICBpZiAoY2hpbGQ/Lm5vZGVOYW1lPy50b0xvd2VyQ2FzZSgpID09ICdzY3JpcHQnKSB7XG4gICAgICBjb25zdCBzY3JpcHRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICBwb3J0QXR0cmlidXRlc1RvRWxlbWVudChjaGlsZCwgc2NyaXB0RWxlbWVudCk7XG4gICAgICBzY3JpcHRFbGVtZW50LmlubmVySFRNTCA9IGNoaWxkLmlubmVySFRNTDtcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0RWxlbWVudCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gQWRkIHRvIHRoZSBoZWFkXG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjaGlsZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlQm9keVNjcmlwdHMoZG9tKSB7XG4gIGNvbnN0IHNjcmlwdHMgPSBbLi4uZG9tLmJvZHkucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JyldO1xuICBjb25zdCBuZXdFbGVtZW50cyA9IFtdO1xuICBmb3IgKGNvbnN0IHNjcmlwdCBvZiBzY3JpcHRzKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgIHBvcnRBdHRyaWJ1dGVzVG9FbGVtZW50KHNjcmlwdCwgZWxlbWVudCk7XG4gICAgZWxlbWVudC5pbm5lckhUTUwgPSBzY3JpcHQuaW5uZXJIVE1MO1xuICAgIGRvbS5ib2R5LnJlbW92ZUNoaWxkKHNjcmlwdCk7XG4gICAgbmV3RWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgfVxuICByZXR1cm4gbmV3RWxlbWVudHM7XG59XG5cbmZ1bmN0aW9uIHBvcnRBdHRyaWJ1dGVzVG9FbGVtZW50KG9sZEVsLCBuZXdFbCkge1xuICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiBvbGRFbC5hdHRyaWJ1dGVzKSB7XG4gICAgbmV3RWwuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZS5uYW1lLCBhdHRyaWJ1dGUubm9kZVZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQZXJzaXN0ZW50Tm9kZXNGcm9tRG9jdW1lbnQoZG9tKSB7XG4gIC8vIEZpbmQgcGVyc2lzdGVudCBub2Rlc1xuICBjb25zdCBwZXJzaXN0ZW50Tm9kZXNGcm9tRG9tID0gWy4uLmRvbS5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1wZXJzaXN0ZW50XScpXS5tYXAoZWwgPT4gZWwuZ2V0QXR0cmlidXRlKCdkYXRhLXBlcnNpc3RlbnQnKSk7XG4gIGNvbnN0IHBlcnNpc3RlbnROb2Rlc0Zyb21Cb2R5ID0gWy4uLmRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcGVyc2lzdGVudF0nKV07XG4gIC8vIENyb3NzIG1hdGNoIHRoZSBwZXJzaXN0ZW50IG5vZGVzIGJldHdlZW4gY3VycmVudCBwYWdlIGFuZCBuZXcgcGFnZSB0byBmaW5kIHZhbGlkIG9uZXNcbiAgY29uc3QgdmFsaWRQZXJzaXN0ZW50Tm9kZXMgPSBwZXJzaXN0ZW50Tm9kZXNGcm9tQm9keS5maWx0ZXIoZWwgPT4ge1xuICAgIHJldHVybiBwZXJzaXN0ZW50Tm9kZXNGcm9tRG9tLmluY2x1ZGVzKGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1wZXJzaXN0ZW50JykpO1xuICB9KTtcbiAgLy8gQ2xvbmVcbiAgcmV0dXJuIHZhbGlkUGVyc2lzdGVudE5vZGVzLm1hcChlbCA9PiBlbC5jbG9uZU5vZGUodHJ1ZSkpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlQXR0cmlidXRlc09uRG9jdW1lbnRCb2R5KGRvbSkge1xuICB3aGlsZSAoZG9jdW1lbnQuYm9keS5hdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUF0dHJpYnV0ZShkb2N1bWVudC5ib2R5LmF0dHJpYnV0ZXNbMF0ubmFtZSk7XG4gIH1cbiAgLy8gU2V0IGF0dHJpYnV0ZXMgb24gdGhlIGJvZHlcbiAgZm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgZG9tLmJvZHkuYXR0cmlidXRlcykge1xuICAgIGRvY3VtZW50LmJvZHkuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZS5uYW1lLCBhdHRyaWJ1dGUubm9kZVZhbHVlKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVCYWNrQnV0dG9uKCkge1xuICBhd2FpdCBnZXROZXdQYWdlQ29udGVudCh3aW5kb3cuaGlzdG9yeS5zdGF0ZT8udGFyZ2V0SHJlZiB8fCB3aW5kb3cubG9jYXRpb24uaHJlZik7XG59XG5cbmZ1bmN0aW9uIGlzUmVsYXRpdmVVUkwodXJsKSB7XG4gIGlmICh0eXBlb2YgdXJsICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICB0cnkge1xuICAgIG5ldyBVUkwodXJsKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICh1cmw/LnN0YXJ0c1dpdGgoJy8vJykpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0V4dGVybmFsVVJMKHVybCkge1xuICBpZiAoaXNSZWxhdGl2ZVVSTCh1cmwpKSByZXR1cm4gZmFsc2U7XG4gIHRyeSB7XG4gICAgY29uc3QgY29tcHV0ZWRVUkwgPSBuZXcgVVJMKHVybCk7XG4gICAgcmV0dXJuIGNvbXB1dGVkVVJMPy5vcmlnaW4gIT09IHdpbmRvdy5sb2NhdGlvbj8ub3JpZ2luO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7IC8vIE5vdCBhIFVSTFxuICB9XG59XG5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgcmVwbGFjZURvY3VtZW50Q29udGVudHNXaXRoTGlua1Jlc3BvbnNlKTtcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb3BzdGF0ZScsIGhhbmRsZUJhY2tCdXR0b24pO1xuXG4iXSwKICAibWFwcGluZ3MiOiAiO0FBRUEsZUFBZSwwQ0FBMEM7QUFDdkQsUUFBTSxRQUFRLENBQUMsR0FBRyxTQUFTLGlCQUFpQixZQUFZLENBQUM7QUFDekQsYUFBVyxRQUFRLE9BQU87QUFDeEIsU0FBSyxpQkFBaUIsU0FBUyxxQkFBcUI7QUFBQSxFQUN0RDtBQUVGO0FBRUEsZUFBZSxzQkFBc0IsR0FBRztBQUN0QyxRQUFNLGFBQWEsR0FBRyxRQUFRLGFBQWEsTUFBTTtBQUNqRCxNQUFJLENBQUMsV0FBWTtBQUNqQixNQUFJLGNBQWMsVUFBVSxLQUFLLENBQUMsR0FBRyxRQUFRLGFBQWEsc0JBQXNCLEVBQUc7QUFDbkYsSUFBRSxlQUFlO0FBQ2pCLE1BQUk7QUFDRixVQUFNLGtCQUFrQixVQUFVO0FBQ2xDLFFBQUksZUFBZSxPQUFPLFNBQVMsU0FBVTtBQUM3QyxXQUFPLFFBQVE7QUFBQSxNQUNiO0FBQUEsUUFDRSxNQUFNO0FBQUEsUUFDTjtBQUFBLE1BQ0Y7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFDQSxVQUFNLFFBQVEsSUFBSSxZQUFZLHFCQUFxQjtBQUFBLE1BQ2pELFFBQVE7QUFBQSxRQUNOLE1BQU07QUFBQSxNQUNSO0FBQUEsSUFDRixD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
@@ -418,4 +418,3 @@ async function logSize(pathName, type, validExtensions = [".js", ".css"]) {
418
418
 
419
419
  // src/scripts/xpine-build.ts
420
420
  buildApp();
421
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NjcmlwdHMvYnVpbGQudHMiLCAiLi4vLi4vLi4vc3JjL2J1aWxkL3R5cGVzY3JpcHQtYnVpbGRlci50cyIsICIuLi8uLi8uLi9zcmMvdXRpbC9nZXQtY29uZmlnLnRzIiwgIi4uLy4uLy4uL3NyYy91dGlsL3JlcXVpcmUudHMiLCAiLi4vLi4vLi4vc3JjL3NjcmlwdHMveHBpbmUtYnVpbGQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGJ1aWxkIH0gZnJvbSAnZXNidWlsZCc7XG5pbXBvcnQgYnVpbHRpbk1vZHVsZXMgZnJvbSAnYnVpbHRpbi1tb2R1bGVzJztcbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcbmltcG9ydCB7XG4gIGNvbnZlcnRFbnRyeVBvaW50c1RvU2luZ2xlRmlsZSxcbiAgZmluZERhdGFBdHRyaWJ1dGVzQW5kRnVuY3Rpb25zLFxuICByZW1vdmVDbGllbnRTY3JpcHRJblRTWEZpbGVcbn0gZnJvbSAnLi4vYnVpbGQvdHlwZXNjcmlwdC1idWlsZGVyJztcbmltcG9ydCB7IGdsb2JTeW5jIH0gZnJvbSAnZ2xvYic7XG5pbXBvcnQgcG9zdGNzcyBmcm9tICdwb3N0Y3NzJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB0YWlsd2luZFBvc3Rjc3MgZnJvbSAnQHRhaWx3aW5kY3NzL3Bvc3Rjc3MnO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi4vdXRpbC9nZXQtY29uZmlnJztcblxuLy8gRXh0ZW5zaW9ucyB0byBsb29rIGZvciBpbiB0aGUgYnVuZGxlXG5jb25zdCBleHRlbnNpb25zID0gWycudHMnLCAnLnRzeCddO1xuY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhjb25maWcucGFja2FnZUpzb25QYXRoLCAndXRmLTgnKSk7XG5jb25zdCBhbGxQYWNrYWdlcyA9IE9iamVjdC5rZXlzKHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcykuY29uY2F0KE9iamVjdC5rZXlzKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcykpO1xuY29uc3QgYWxsUGFja2FnZXNJbmNsdWRpbmdOb2RlID0gYWxsUGFja2FnZXMuY29uY2F0KGJ1aWx0aW5Nb2R1bGVzKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQXBwKGlzRGV2ID0gZmFsc2UpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzcmNEaXJGaWxlcyA9IGdsb2JTeW5jKGNvbmZpZy5zcmNEaXIgKyAnLyoqLyoue2pzLHRzLHRzeCxqc3h9Jyk7XG4gICAgY29uc3QgeyBjb21wb25lbnREYXRhLCBkYXRhRmlsZXMsIH0gPSBhd2FpdCBidWlsZEFwcEZpbGVzKHNyY0RpckZpbGVzLCBpc0Rldik7XG4gICAgY29uc3QgYWxwaW5lRGF0YUZpbGUgPSBhd2FpdCBidWlsZEFscGluZURhdGFGaWxlKGNvbXBvbmVudERhdGEsIGRhdGFGaWxlcyk7XG4gICAgYXdhaXQgYnVpbGRDbGllbnRTaWRlRmlsZXMoW2FscGluZURhdGFGaWxlXSwgaXNEZXYpO1xuICAgIGZzLnJlbW92ZVN5bmMoY29uZmlnLmRpc3RUZW1wRm9sZGVyKTtcbiAgICBhd2FpdCBidWlsZENTUygpO1xuICAgIGF3YWl0IGJ1aWxkUHVibGljRm9sZGVyU3ltbGlua3MoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcignQnVpbGQgZmFpbGVkJyk7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkQXBwRmlsZXMoZmlsZXM6IHN0cmluZ1tdLCBpc0Rldj86IGJvb2xlYW4pIHtcbiAgY29uc3QgY29tcG9uZW50RGF0YSA9IFtdO1xuICBjb25zdCBkYXRhRmlsZXMgPSBbXTtcbiAgLy8gRmlsdGVyIG91dCBjbGllbnQgc2lkZSBmaWxlcyBhbmQgZmlsZXMgdGhhdCBhcmVuJ3Qgb2YgdGhlIGFsbG93ZWQgZXh0ZW5zaW9uc1xuICBjb25zdCBiYWNrZW5kRmlsZXMgPSBmaWxlc1xuICAgIC5maWx0ZXIoKGZpbGUpID0+IGV4dGVuc2lvbnMuZmluZChleHQgPT4gZmlsZS5lbmRzV2l0aChleHQpKSlcbiAgICAuZmlsdGVyKChmaWxlKSA9PiAhZmlsZS5zdGFydHNXaXRoKGNvbmZpZy5wdWJsaWNEaXIpKTtcbiAgZnMuZW5zdXJlRGlyU3luYyhjb25maWcuZGlzdERpcik7XG4gIC8vIEJ1aWxkIGJhY2tlbmQvU1NSIFRTWCBtb2R1bGVzXG4gIGF3YWl0IGJ1aWxkKHtcbiAgICBlbnRyeVBvaW50czogYmFja2VuZEZpbGVzLFxuICAgIGZvcm1hdDogJ2VzbScsXG4gICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICBvdXRkaXI6IGNvbmZpZy5kaXN0RGlyLFxuICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICBzb3VyY2VtYXA6IGlzRGV2ID8gJ2lubGluZScgOiBmYWxzZSxcbiAgICBleHRlcm5hbDogYWxsUGFja2FnZXMsXG4gICAganN4OiAndHJhbnNmb3JtJyxcbiAgICBtaW5pZnk6ICFpc0RldixcbiAgICBwbHVnaW5zOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdhZGQtZG90LWpzJyxcbiAgICAgICAgc2V0dXAoYnVpbGQpIHtcbiAgICAgICAgICBidWlsZC5vblJlc29sdmUoeyBmaWx0ZXI6IC8uKi8sIH0sIGFyZ3MgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFzQXRTaWduID0gYXJncy5wYXRoLnN0YXJ0c1dpdGgoJ0AnKTtcbiAgICAgICAgICAgIGNvbnN0IGlzUGFja2FnZSA9IGhhc0F0U2lnbiA/XG4gICAgICAgICAgICAgIGFsbFBhY2thZ2VzSW5jbHVkaW5nTm9kZS5pbmNsdWRlcyhhcmdzLnBhdGgpIDpcbiAgICAgICAgICAgICAgYWxsUGFja2FnZXNJbmNsdWRpbmdOb2RlLmluY2x1ZGVzKGFyZ3MucGF0aC5zcGxpdCgnLycpLnNoaWZ0KCkpO1xuICAgICAgICAgICAgaWYgKGFyZ3MuaW1wb3J0ZXIgJiYgIWlzUGFja2FnZSkge1xuICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBkb2luZyBhbiBpbmRleCBpbXBvcnQgd2UgbmVlZCAvaW5kZXguanNcbiAgICAgICAgICAgICAgY29uc3QgY2FsY3VsYXRlZERpciA9IHBhdGguam9pbihhcmdzLnJlc29sdmVEaXIsIGFyZ3MucGF0aCk7XG4gICAgICAgICAgICAgIGxldCBleGlzdHNBc0ZpbGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBleHRlbnNpb24gb2YgZXh0ZW5zaW9ucykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFzRmlsZSA9IGNhbGN1bGF0ZWREaXIgKyBleHRlbnNpb247XG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RzID0gZnMuZXhpc3RzU3luYyhhc0ZpbGUpO1xuICAgICAgICAgICAgICAgIGlmIChleGlzdHMpIGV4aXN0c0FzRmlsZSA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGV0IG91dHB1dFBhdGggPSBhcmdzLnBhdGggKyAoZXhpc3RzQXNGaWxlID8gJycgOiAnL2luZGV4JykgKyAnLmpzJztcbiAgICAgICAgICAgICAgb3V0cHV0UGF0aCA9IGFyZ3MucGF0aC5lbmRzV2l0aCgnLmpzJykgfHwgYXJncy5wYXRoLmVuZHNXaXRoKCcubWpzJykgPyBhcmdzLnBhdGggOiBvdXRwdXRQYXRoO1xuICAgICAgICAgICAgICByZXR1cm4geyBwYXRoOiBvdXRwdXRQYXRoLCBleHRlcm5hbDogdHJ1ZSwgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdpbnNlcnQtaHRtbC1iYW5uZXItYW5kLXJlbW92ZS1jbGllbnQtc2NyaXB0cycsXG4gICAgICAgIHNldHVwKGJ1aWxkKSB7XG4gICAgICAgICAgYnVpbGQub25Mb2FkKHsgZmlsdGVyOiAvLnRzeC8sIH0sIGFyZ3MgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2xlYW5lZENvbnRlbnQgPSByZW1vdmVDbGllbnRTY3JpcHRJblRTWEZpbGUoYXJncy5wYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IGh0bWxJbXBvcnRTdGFydCA9ICdpbXBvcnQgeyBodG1sIH0gZnJvbSBcXCd4cGluZVxcJztcXG4nO1xuICAgICAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IGAke2h0bWxJbXBvcnRTdGFydH0ke2NsZWFuZWRDb250ZW50LmNvbnRlbnR9YDtcbiAgICAgICAgICAgIGNvbXBvbmVudERhdGEucHVzaCh7XG4gICAgICAgICAgICAgIC4uLmFyZ3MsXG4gICAgICAgICAgICAgIGNvbnRlbnRzOiBgJHtodG1sSW1wb3J0U3RhcnR9JHtjbGVhbmVkQ29udGVudC5mdWxsQ29udGVudH1gLFxuICAgICAgICAgICAgICBjbGllbnRDb250ZW50OiBjbGVhbmVkQ29udGVudC5jbGllbnRDb250ZW50LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50czogbmV3Q29udGVudCxcbiAgICAgICAgICAgICAgbG9hZGVyOiAndHN4JyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnZ2V0LWRhdGEtZmlsZXMnLFxuICAgICAgICBzZXR1cChidWlsZCkge1xuICAgICAgICAgIGJ1aWxkLm9uTG9hZCh7IGZpbHRlcjogL1xcLmRhdGFcXC4oanN8bWpzfHRzKSQvLCB9LCBhcmdzID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRzID0gZnMucmVhZEZpbGVTeW5jKGFyZ3MucGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgICAgICBkYXRhRmlsZXMucHVzaCh7XG4gICAgICAgICAgICAgIC4uLmFyZ3MsXG4gICAgICAgICAgICAgIGNvbnRlbnRzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50cyxcbiAgICAgICAgICAgICAgbG9hZGVyOiAndHMnLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICBdLFxuICB9KTtcbiAgYXdhaXQgbG9nU2l6ZShjb25maWcuZGlzdERpciwgJ2FwcCcpO1xuICByZXR1cm4ge1xuICAgIGNvbXBvbmVudERhdGEsXG4gICAgZGF0YUZpbGVzLFxuICB9O1xufVxuXG4vLyBCdWlsZCBjbGllbnQgc2lkZSBmaWxlc1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRDbGllbnRTaWRlRmlsZXMoYWxwaW5lRGF0YUZpbGVzOiBzdHJpbmdbXSA9IFtdLCBpc0Rldj86IGJvb2xlYW4pIHtcbiAgLy8gV3JpdGUgdGhlIHRlbXAgZmlsZSB0byB1c2VcbiAgY29uc3QgdGVtcEZpbGVQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXN0VGVtcEZvbGRlciwgJy4vYXBwLnRzJyk7XG4gIGZzLmVuc3VyZUZpbGVTeW5jKHRlbXBGaWxlUGF0aCk7XG4gIC8vIEdldCBhbGwgdHMvanMgZmlsZXMgaW4gcHVibGljIGZvbGRlciBidXQgaWdub3JlIHRoZSBwYWdlcyBzY3JpcHRzXG4gIGNvbnN0IHBhZ2VzU2NyaXB0c0dsb2IgPSBjb25maWcucHVibGljRGlyICsgJy9zY3JpcHRzL3BhZ2VzLyoqLyoue2pzLHRzfSc7XG4gIGNvbnN0IGNsaWVudEZpbGVzID0gZ2xvYlN5bmMoXG4gICAgY29uZmlnLnB1YmxpY0RpciArICcvKiovKi57anMsdHN9JyxcbiAgICB7XG4gICAgICBpZ25vcmU6IHBhZ2VzU2NyaXB0c0dsb2IsXG4gICAgfVxuICApO1xuICAvLyBGaWx0ZXIgb3V0IGFsbCBwdWJsaWMvcGFnZXMgZmlsZXNcbiAgY29udmVydEVudHJ5UG9pbnRzVG9TaW5nbGVGaWxlKGFscGluZURhdGFGaWxlcy5jb25jYXQoY2xpZW50RmlsZXMpLCB0ZW1wRmlsZVBhdGgpO1xuICAvLyBXcml0ZSBkZXYgc2VydmVyIGNvZGUgdG8gdGhlIHRlbXAgZmlsZSBwYXRoXG4gIGlmIChpc0Rldikgd3JpdGVEZXZTZXJ2ZXJDbGllbnRTaWRlQ29kZSh0ZW1wRmlsZVBhdGgpO1xuICAvLyBXcml0ZSBzcGEgZnVuY3Rpb25hbGl0eSB0byB0aGUgdGVtcCBmaWxlIHBhdGhcbiAgd3JpdGVTcGFDbGllbnRTaWRlQ29kZSh0ZW1wRmlsZVBhdGgpO1xuICBhd2FpdCBidWlsZCh7XG4gICAgZW50cnlQb2ludHM6IFt0ZW1wRmlsZVBhdGhdLFxuICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICBvdXRkaXI6IGNvbmZpZy5kaXN0UHVibGljU2NyaXB0c0RpcixcbiAgICBtaW5pZnk6ICFpc0RldixcbiAgICBzb3VyY2VtYXA6IGlzRGV2ID8gJ2lubGluZScgOiBmYWxzZSxcbiAgfSk7XG4gIC8vIEJ1aWxkIHBhZ2VzIGZpbGVzIHNjcmlwdHNcbiAgY29uc3QgcGFnZXNGaWxlcyA9IGdsb2JTeW5jKHBhZ2VzU2NyaXB0c0dsb2IpO1xuICBhd2FpdCBidWlsZCh7XG4gICAgZW50cnlQb2ludHM6IHBhZ2VzRmlsZXMgfHwgW10sXG4gICAgYnVuZGxlOiB0cnVlLFxuICAgIG91dGRpcjogY29uZmlnLmRpc3RQdWJsaWNTY3JpcHRzRGlyICsgJy9wYWdlcycsXG4gICAgbWluaWZ5OiAhaXNEZXYsXG4gICAgc291cmNlbWFwOiBpc0RldiA/ICdpbmxpbmUnIDogZmFsc2UsXG4gIH0pO1xuICBhd2FpdCBsb2dTaXplKGNvbmZpZy5kaXN0UHVibGljRGlyLCAnY2xpZW50Jyk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlRGV2U2VydmVyQ2xpZW50U2lkZUNvZGUodGVtcEZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgZGV2U2VydmVyUGF0aCA9IHBhdGguam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCAnLi4vc3RhdGljL2Rldi1zZXJ2ZXIuanMnKTtcbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhkZXZTZXJ2ZXJQYXRoLCAndXRmLTgnKTtcbiAgZnMuYXBwZW5kRmlsZVN5bmModGVtcEZpbGVQYXRoLCBgXFxuYCArIGNvbnRlbnQpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVNwYUNsaWVudFNpZGVDb2RlKHRlbXBGaWxlUGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IHNwYVBhdGggPSBwYXRoLmpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgJy4uL3N0YXRpYy9zcGEuanMnKTtcbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzcGFQYXRoLCAndXRmLTgnKTtcbiAgZnMuYXBwZW5kRmlsZVN5bmModGVtcEZpbGVQYXRoLCBgXFxuYCArIGNvbnRlbnQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBidWlsZEFscGluZURhdGFGaWxlKGNvbXBvbmVudERhdGE6IGFueVtdLCBkYXRhRmlsZXM6IGFueVtdKSB7XG4gIGNvbnN0IG91dHB1dCA9IHtcbiAgICBpbXBvcnRzOiBbXG4gICAgICAnaW1wb3J0IEFscGluZSBmcm9tIFxcJ2FscGluZWpzXFwnOydcbiAgICBdLFxuICAgIGNvZGU6IFtdLFxuICAgIGVuZDogW1xuICAgICAgJ3dpbmRvdy5BbHBpbmUgPSBBbHBpbmU7J1xuICAgIF0sXG4gIH07XG4gIGNvbnN0IGRhdGFGdW5jdGlvblJlc3VsdHMgPSB7XG4gICAgZm91bmREYXRhQXR0cmlidXRlczogW10sXG4gICAgZm91bmRGdW5jdGlvbnM6IFtdLFxuICAgIGZvdW5kSW1wb3J0czogW10sXG4gIH07XG4gIGNvbnN0IGNvbXBvbmVudHNBbmREYXRhRmlsZXMgPSBjb21wb25lbnREYXRhLmNvbmNhdChkYXRhRmlsZXMpO1xuICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzQW5kRGF0YUZpbGVzKSB7XG4gICAgLy8gU2luZ2xlIHNvdXJjZSBmaWxlXG4gICAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgICBjb21wb25lbnQucGF0aCxcbiAgICAgIGNvbXBvbmVudC5jb250ZW50cyxcbiAgICAgIHRzLlNjcmlwdFRhcmdldC5MYXRlc3RcbiAgICApO1xuICAgIGNvbnN0IGRhdGFGdW5jdGlvblJlc3VsdCA9IGZpbmREYXRhQXR0cmlidXRlc0FuZEZ1bmN0aW9ucyhzb3VyY2VGaWxlLCBzb3VyY2VGaWxlKTtcbiAgICBkYXRhRnVuY3Rpb25SZXN1bHRzLmZvdW5kRGF0YUF0dHJpYnV0ZXMucHVzaCguLi5kYXRhRnVuY3Rpb25SZXN1bHQuZm91bmREYXRhQXR0cmlidXRlcyk7XG4gICAgY29uc3QgZm91bmRGdW5jdGlvbnNXaXRoUGF0aCA9IGRhdGFGdW5jdGlvblJlc3VsdC5mb3VuZEZ1bmN0aW9ucy5tYXAoaXRlbSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5pdGVtLFxuICAgICAgICBwYXRoOiBjb21wb25lbnQucGF0aCxcbiAgICAgICAgY29udGVudDogY29tcG9uZW50LmNsaWVudENvbnRlbnQsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGRhdGFGdW5jdGlvblJlc3VsdHMuZm91bmRGdW5jdGlvbnMucHVzaCguLi5mb3VuZEZ1bmN0aW9uc1dpdGhQYXRoKTtcbiAgfVxuICBjb25zdCB2YWxpZERhdGFGdW5jdGlvbnMgPSBkYXRhRnVuY3Rpb25SZXN1bHRzLmZvdW5kRnVuY3Rpb25zLmZpbHRlcihpdGVtID0+IHtcbiAgICByZXR1cm4gZGF0YUZ1bmN0aW9uUmVzdWx0cy5mb3VuZERhdGFBdHRyaWJ1dGVzLmluY2x1ZGVzKGl0ZW0ubmFtZSkgJiYgaXRlbS5jb250ZW50O1xuICB9KTtcbiAgZm9yIChjb25zdCBkYXRhRnVuY3Rpb24gb2YgdmFsaWREYXRhRnVuY3Rpb25zKSB7XG4gICAgaWYgKCFkYXRhRnVuY3Rpb24uaGFzRXhwb3J0KSBjb250aW51ZTtcbiAgICBvdXRwdXQuY29kZS5wdXNoKGRhdGFGdW5jdGlvbi5jb250ZW50KTtcbiAgICBvdXRwdXQuY29kZS5wdXNoKGBBbHBpbmUuZGF0YSgnJHtkYXRhRnVuY3Rpb24ubmFtZX0nLCAke2RhdGFGdW5jdGlvbi5uYW1lfSk7YCk7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gb3V0cHV0LmltcG9ydHMuam9pbignXFxuJykgKyAnXFxuJyArIG91dHB1dC5jb2RlLmpvaW4oJ1xcbicpICsgJ1xcbicgKyBvdXRwdXQuZW5kLmpvaW4oJ1xcbicpO1xuICBmcy5lbnN1cmVGaWxlU3luYyhjb25maWcuYWxwaW5lRGF0YVBhdGgpO1xuICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZy5hbHBpbmVEYXRhUGF0aCwgcmVzdWx0KTtcbiAgcmV0dXJuIGNvbmZpZy5hbHBpbmVEYXRhUGF0aDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ1NTKCkge1xuICBjb25zdCBjc3NGaWxlcyA9IGdsb2JTeW5jKGNvbmZpZy5zcmNEaXIgKyAnLyoqLyouY3NzJyk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBjc3NGaWxlcykge1xuICAgIGNvbnN0IGZpbGVDb250ZW50cyA9IGZzLnJlYWRGaWxlU3luYyhmaWxlLCAndXRmLTgnKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwb3N0Y3NzKFt0YWlsd2luZFBvc3Rjc3MoKV0pLnByb2Nlc3MoZmlsZUNvbnRlbnRzLCB7IGZyb206IGZpbGUsIH0pO1xuICAgIC8vIFdyaXRlIHRvIGRpc3QgZm9sZGVyXG4gICAgY29uc3QgbmV3UGF0aCA9IGZpbGUucmVwbGFjZShjb25maWcuc3JjRGlyLCBjb25maWcuZGlzdERpcik7XG4gICAgZnMuZW5zdXJlRmlsZVN5bmMobmV3UGF0aCk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhuZXdQYXRoLCByZXN1bHQuY3NzKTtcbiAgfVxuICBsb2dTaXplKGNvbmZpZy5kaXN0UHVibGljRGlyLCAnY3NzJyk7XG59XG5cbi8vIFdlIG5lZWQgdG8gc3ltbGluayB0aGUgbm9uIENTUyBvciBKUyBmaWxlcyBmcm9tIHRoZSBzcmMvcHVibGljIGZvbGRlciBpbnRvIHRoZSBkaXN0IGZvbGRlclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkUHVibGljRm9sZGVyU3ltbGlua3MoKSB7XG4gIGNvbnN0IGZpbGVzID0gZ2xvYlN5bmMoY29uZmlnLnB1YmxpY0RpciArICcvKiovKi4qJywge1xuICAgIGlnbm9yZTogJy8qKi8qLntjc3MsanMsdHMsdHN4LGpzeH0nLFxuICB9KTtcblxuICAvLyBDcmVhdGUgc3ltbGlua3MgaW4gZGlzdCBkaXJlY3RvcnlcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG5ld1BhdGggPSBmaWxlLnJlcGxhY2UoY29uZmlnLnNyY0RpciwgY29uZmlnLmRpc3REaXIpO1xuICAgICAgY29uc3Qgc3BsaXROZXdQYXRoID0gbmV3UGF0aC5zcGxpdCgnLycpO1xuICAgICAgc3BsaXROZXdQYXRoLnBvcCgpO1xuICAgICAgY29uc3QgbmV3RGlyID0gc3BsaXROZXdQYXRoLmpvaW4oJy8nKTtcbiAgICAgIGZzLmVuc3VyZURpclN5bmMobmV3RGlyKTtcbiAgICAgIGZzLnN5bWxpbmtTeW5jKGZpbGUsIG5ld1BhdGgpO1xuICAgIH0gY2F0Y2ggeyB9XG4gIH1cbn1cblxudHlwZSBGaWxlSXRlbSA9IHtcbiAgZmlsZTogc3RyaW5nO1xuICBzaXplOiBudW1iZXI7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2dTaXplKHBhdGhOYW1lOiBzdHJpbmcsIHR5cGU6ICdhcHAnIHwgJ2NsaWVudCcgfCAnY3NzJywgdmFsaWRFeHRlbnNpb25zID0gWycuanMnLCAnLmNzcyddKSB7XG4gIGNvbnN0IGZpbGVzID0gZ2xvYlN5bmMocGF0aE5hbWUgKyAnLyoqLyonICsgKHR5cGUgPT09ICdjc3MnID8gJy5jc3MnIDogJycpKTtcbiAgY29uc3QgZmlsZVNpemVzID0gZmlsZXMubWFwKChmaWxlKSA9PiB7XG4gICAgaWYgKCF2YWxpZEV4dGVuc2lvbnMuZmluZChleHQgPT4gZmlsZS5lbmRzV2l0aChleHQpKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB7XG4gICAgICBmaWxlLFxuICAgICAgc2l6ZTogKGZzLnN0YXRTeW5jKGZpbGUpLnNpemUpIC8gKDEwMjQgKiAxMDAwKSxcbiAgICB9O1xuICB9KS5maWx0ZXIoQm9vbGVhbik7XG4gIGNvbnN0IHRvdGFsU2l6ZSA9IGZpbGVTaXplcy5yZWR1Y2UoKHRvdGFsLCBjdXJyZW50OiBGaWxlSXRlbSkgPT4ge1xuICAgIHJldHVybiBjdXJyZW50LnNpemUgKyB0b3RhbDtcbiAgfSwgMCk7XG4gIGNvbnNvbGUuaW5mbyhgWyR7dG90YWxTaXplLnRvRml4ZWQoMyl9IE1CXSBCdWlsdCAke3R5cGV9YCk7XG59XG4iLCAiaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG50eXBlIEltcG9ydERlY2xhcmF0aW9uID0ge1xuICBub2RlOiB0cy5Ob2RlO1xuICBpbXBvcnRQYXRoOiBzdHJpbmc7XG59XG5cbi8vIG5vZGUgYXJnIHNob3VsZCBpbml0aWFsbHkgYmUgdGhlIHNvdXJjZSBub2RlXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW1wb3J0RGVjbGFyYXRpb25Ob2Rlcyhub2RlOiB0cy5Ob2RlLCBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlLCBpbXBvcnREZWNsYXJhdGlvbnM6IEltcG9ydERlY2xhcmF0aW9uW10gPSBbXSkge1xuICBpZiAobm9kZS5raW5kID09PSB0cy5TeW50YXhLaW5kLkltcG9ydERlY2xhcmF0aW9uKSB7XG4gICAgbGV0IGltcG9ydFBhdGggPSBudWxsO1xuICAgIG5vZGUuZm9yRWFjaENoaWxkKGNoaWxkID0+IHtcbiAgICAgIGlmIChjaGlsZC5raW5kID09PSB0cy5TeW50YXhLaW5kLlN0cmluZ0xpdGVyYWwpIHtcbiAgICAgICAgaW1wb3J0UGF0aCA9IGNoaWxkLmdldFRleHQoc291cmNlRmlsZSkucmVwbGFjZSgvW1xcXCJcXCddL2csICcnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpbXBvcnREZWNsYXJhdGlvbnMucHVzaCh7XG4gICAgICBub2RlLFxuICAgICAgaW1wb3J0UGF0aCxcbiAgICB9KTtcbiAgfVxuICBub2RlLmZvckVhY2hDaGlsZChjaGlsZCA9PiB7XG4gICAgZ2V0SW1wb3J0RGVjbGFyYXRpb25Ob2RlcyhjaGlsZCwgc291cmNlRmlsZSwgaW1wb3J0RGVjbGFyYXRpb25zKTtcbiAgfSk7XG4gIHJldHVybiBpbXBvcnREZWNsYXJhdGlvbnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcEltcG9ydHNOb2Rlc0Zyb21GaWxlKGltcG9ydHNUb1N0cmlwOiBzdHJpbmdbXSwgY29udGVudDogc3RyaW5nLCBpbXBvcnREZWNsYXJhdGlvbnM6IEltcG9ydERlY2xhcmF0aW9uW10pIHtcbiAgbGV0IG91dHB1dENvbnRlbnQgPSBjb250ZW50O1xuICBjb25zdCBmaWx0ZXJlZEltcG9ydHMgPSBpbXBvcnREZWNsYXJhdGlvbnMuZmlsdGVyKGl0ZW0gPT4gaW1wb3J0c1RvU3RyaXAuaW5jbHVkZXMoaXRlbS5pbXBvcnRQYXRoKSk7XG4gIGZvciAoY29uc3QgaW1wb3J0SXRlbSBvZiBmaWx0ZXJlZEltcG9ydHMpIHtcbiAgICBvdXRwdXRDb250ZW50ID0gb3V0cHV0Q29udGVudC5zbGljZSgwLCBpbXBvcnRJdGVtLm5vZGUucG9zKSArIG91dHB1dENvbnRlbnQuc2xpY2UoaW1wb3J0SXRlbS5ub2RlLmVuZCk7XG4gIH1cbiAgcmV0dXJuIG91dHB1dENvbnRlbnQ7XG59XG5cbnR5cGUgRm91bmRBbHBpbmVGdW5jdGlvbiA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBpc0RlZmF1bHRFeHBvcnQ6IGJvb2xlYW47XG4gIGhhc0V4cG9ydDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmREYXRhQXR0cmlidXRlc0FuZEZ1bmN0aW9ucyhcbiAgbm9kZTogdHMuTm9kZSxcbiAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSxcbiAgZm91bmREYXRhQXR0cmlidXRlczogc3RyaW5nW10gPSBbXSxcbiAgZm91bmRGdW5jdGlvbnM6IEZvdW5kQWxwaW5lRnVuY3Rpb25bXSA9IFtdXG4pIHtcbiAgaWYgKG5vZGUua2luZCA9PT0gdHMuU3ludGF4S2luZC5Kc3hBdHRyaWJ1dGUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGVWYWx1ZVBhaXIobm9kZSwgc291cmNlRmlsZSk7XG4gICAgaWYgKGF0dHJpYnV0ZT8uWzBdID09PSAneC1kYXRhJyAmJiBhdHRyaWJ1dGU/LlsxXSkge1xuICAgICAgLy8gV2UgZm91bmQgYSBkYXRhIGF0dHJpYnV0ZSwgXG4gICAgICAvLyBzbyBub3cgd2UgaGF2ZSB0byBzZWFyY2ggdGhyb3VnaG91dCB0aGUgZmlsZSBmb3IgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBvZiB0aGUgc2FtZSBuYW1lXG4gICAgICBmb3VuZERhdGFBdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlWzFdLnJlcGxhY2UoL1teYS16QS1aMC05XS9nLCAnJykpO1xuICAgIH1cbiAgfVxuICBpZiAobm9kZS5raW5kID09PSB0cy5TeW50YXhLaW5kLlNvdXJjZUZpbGUpIHtcbiAgICBub2RlLmZvckVhY2hDaGlsZChjaGlsZCA9PiB7XG4gICAgICBpZiAoW3RzLlN5bnRheEtpbmQuRnVuY3Rpb25EZWNsYXJhdGlvbiwgdHMuU3ludGF4S2luZC5WYXJpYWJsZURlY2xhcmF0aW9uXS5pbmNsdWRlcyhjaGlsZC5raW5kKSkge1xuICAgICAgICBjb25zdCBmdW5jdGlvbnMgPSBnZXRGdW5jdGlvbkRlY2xhcmF0aW9uVmFsdWUoY2hpbGQsIHNvdXJjZUZpbGUpO1xuICAgICAgICBmb3VuZEZ1bmN0aW9ucy5wdXNoKGZ1bmN0aW9ucyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBub2RlLmZvckVhY2hDaGlsZChjaGlsZCA9PiB7XG4gICAgZmluZERhdGFBdHRyaWJ1dGVzQW5kRnVuY3Rpb25zKGNoaWxkLCBzb3VyY2VGaWxlLCBmb3VuZERhdGFBdHRyaWJ1dGVzLCBmb3VuZEZ1bmN0aW9ucyk7XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGZvdW5kRGF0YUF0dHJpYnV0ZXMsXG4gICAgZm91bmRGdW5jdGlvbnMsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZVBhaXIobm9kZTogdHMuTm9kZSwgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIG5vZGUuZm9yRWFjaENoaWxkKGNoaWxkID0+IHtcbiAgICByZXN1bHQucHVzaChjaGlsZC5nZXRUZXh0KHNvdXJjZUZpbGUpKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGdW5jdGlvbkRlY2xhcmF0aW9uVmFsdWUobm9kZTogdHMuTm9kZSwgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSk6IEZvdW5kQWxwaW5lRnVuY3Rpb24ge1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgbmFtZTogbnVsbCxcbiAgICBpc0RlZmF1bHRFeHBvcnQ6IGZhbHNlLFxuICAgIGhhc0V4cG9ydDogZmFsc2UsXG4gIH07XG4gIG5vZGUuZm9yRWFjaENoaWxkKGNoaWxkID0+IHtcbiAgICBpZiAoY2hpbGQua2luZCA9PT0gdHMuU3ludGF4S2luZC5FeHBvcnRLZXl3b3JkKSB7XG4gICAgICByZXN1bHQuaGFzRXhwb3J0ID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNoaWxkLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuRGVmYXVsdEtleXdvcmQpIHtcbiAgICAgIHJlc3VsdC5pc0RlZmF1bHRFeHBvcnQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY2hpbGQua2luZCA9PT0gdHMuU3ludGF4S2luZC5JZGVudGlmaWVyKSB7XG4gICAgICByZXN1bHQubmFtZSA9IGNoaWxkLmdldFRleHQoc291cmNlRmlsZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gQ29udmVydCBlbnRyeSBwb2ludCBmaWxlcyBpbnRvIG9uZSBiaWcgYnVuZGxlIGZpbGVcbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0RW50cnlQb2ludHNUb1NpbmdsZUZpbGUoZW50cnlQb2ludHM6IHN0cmluZ1tdLCB0ZW1wV3JpdGVQYXRoOiBzdHJpbmcpIHtcbiAgZnMud3JpdGVGaWxlU3luYyhcbiAgICB0ZW1wV3JpdGVQYXRoLFxuICAgIGVudHJ5UG9pbnRzXG4gICAgICAubWFwKGVudHJ5ID0+IGBpbXBvcnQgXCIke2VudHJ5fVwiYClcbiAgICAgIC5qb2luKCc7XFxuJylcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUNsaWVudFNjcmlwdEluVFNYRmlsZShwYXRoTmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aE5hbWUsICd1dGYtOCcpO1xuICBjb25zdCBzb3VyY2UgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKFxuICAgIHBhdGhOYW1lLFxuICAgIGNvbnRlbnQsXG4gICAgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdFxuICApO1xuICBsZXQgdG9SZW1vdmVGcm9tOiBudW1iZXI7XG4gIGxldCBjbGllbnREYXRhU3RhcnQ6IG51bWJlcjtcbiAgY29uc3QgY2xpZW50SW1wb3J0c1RvSG9pc3QgPSBbXTtcbiAgY29uc3QgY2xpZW50SW1wb3J0c1RvUmVwbGFjZSA9IFtdO1xuICBzb3VyY2UuZm9yRWFjaENoaWxkKChjaGlsZCkgPT4ge1xuICAgIGlmIChjaGlsZC5raW5kID09PSB0cy5TeW50YXhLaW5kLkV4cHJlc3Npb25TdGF0ZW1lbnQpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBjaGlsZC5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICAvLyBSZW1vdmUgZnJvbSBoZXJlXG4gICAgICBpZiAodGV4dC5zdGFydHNXaXRoKCc8c2NyaXB0JykpIHtcbiAgICAgICAgdG9SZW1vdmVGcm9tID0gY2hpbGQucG9zO1xuICAgICAgICBjbGllbnREYXRhU3RhcnQgPSBjaGlsZC5lbmQ7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEhvaXN0IHRoZSBjbGllbnQgaW1wb3J0cyB0byBhYm92ZSB0aGUgPHNjcmlwdCAvPiB0YWdcbiAgICBpZiAoY2hpbGQua2luZCA9PT0gdHMuU3ludGF4S2luZC5JbXBvcnREZWNsYXJhdGlvbiAmJiBjaGlsZC5wb3MgPj0gY2xpZW50RGF0YVN0YXJ0KSB7XG4gICAgICBjb25zdCB0ZXh0ID0gY2hpbGQuZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgY2hpbGQuZm9yRWFjaENoaWxkKGNoaWxkID0+IHtcbiAgICAgICAgaWYgKGNoaWxkLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuU3RyaW5nTGl0ZXJhbCkge1xuICAgICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgY2xpZW50IGltcG9ydHMgbmVlZGVkIGZvciBwYXRoIHJlcGxhY2VtZW50IHRvIGJlIGFic29sdXRlXG4gICAgICAgICAgY29uc3QgdGV4dCA9IGNoaWxkLmdldFRleHQoc291cmNlKTtcbiAgICAgICAgICBjb25zdCBpbXBvcnRQYXRoID0gdGV4dC5yZXBsYWNlKC9bXFxcIlxcJ10vZywgJycpO1xuICAgICAgICAgIGNvbnN0IGlzUmVsYXRpdmVJbXBvcnQgPSBpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoJy4nKSB8fCBpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoJy8nKTtcbiAgICAgICAgICBpZiAoIWlzUmVsYXRpdmVJbXBvcnQpIHJldHVybjtcbiAgICAgICAgICBjbGllbnRJbXBvcnRzVG9SZXBsYWNlLnB1c2goe1xuICAgICAgICAgICAgb2xkOiBpbXBvcnRQYXRoLFxuICAgICAgICAgICAgbmV3OiBwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHBhdGhOYW1lKSwgaW1wb3J0UGF0aCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY2xpZW50SW1wb3J0c1RvSG9pc3QucHVzaCh0ZXh0KTtcbiAgICB9XG4gIH0pO1xuICBsZXQgY2xpZW50Q29udGVudCA9ICFpc05hTihjbGllbnREYXRhU3RhcnQpID8gY29udGVudC5zbGljZShjbGllbnREYXRhU3RhcnQpIDogJyc7XG4gIGZvciAoY29uc3QgY2xpZW50SW1wb3J0IG9mIGNsaWVudEltcG9ydHNUb1JlcGxhY2UpIHtcbiAgICBjbGllbnRDb250ZW50ID0gY2xpZW50Q29udGVudC5yZXBsYWNlKGNsaWVudEltcG9ydC5vbGQsIGNsaWVudEltcG9ydC5uZXcpO1xuICB9XG4gIHJldHVybiB7XG4gICAgY29udGVudDogIWlzTmFOKHRvUmVtb3ZlRnJvbSkgP1xuICAgICAgY2xpZW50SW1wb3J0c1RvSG9pc3Quam9pbignXFxuJykgKyBjb250ZW50LnNsaWNlKDAsIHRvUmVtb3ZlRnJvbSkgOlxuICAgICAgY29udGVudCxcbiAgICBjbGllbnRDb250ZW50LFxuICAgIGZ1bGxDb250ZW50OiBjb250ZW50LFxuICAgIHRvUmVtb3ZlRnJvbSxcbiAgICBjbGllbnREYXRhU3RhcnQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFJlY3Vyc2l2ZUZyb20oXG4gIG5vZGU6IHRzLk5vZGUsIGluZGVudExldmVsOiBudW1iZXIsIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGVcbikge1xuICBjb25zdCBpbmRlbnRhdGlvbiA9ICctJy5yZXBlYXQoaW5kZW50TGV2ZWwpO1xuICBjb25zdCBzeW50YXhLaW5kID0gdHMuU3ludGF4S2luZFtub2RlLmtpbmRdO1xuICBjb25zdCBub2RlVGV4dCA9IG5vZGUuZ2V0VGV4dChzb3VyY2VGaWxlKTtcbiAgY29uc29sZS5sb2coYCR7aW5kZW50YXRpb259JHtzeW50YXhLaW5kfTogJHtub2RlVGV4dH1gKTtcblxuICBub2RlLmZvckVhY2hDaGlsZChjaGlsZCA9PlxuICAgIHByaW50UmVjdXJzaXZlRnJvbShjaGlsZCwgaW5kZW50TGV2ZWwgKyAxLCBzb3VyY2VGaWxlKVxuICApO1xufVxuIiwgImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHJlcXVpcmUgZnJvbSAnLi9yZXF1aXJlJztcbmltcG9ydCB7IFhQaW5lQ29uZmlnIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5jb25zdCByb290RGlyID0gcHJvY2Vzcy5jd2QoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb290KHBhdGhOYW1lPzogc3RyaW5nKSB7XG4gIGlmICghcGF0aE5hbWUpIHJldHVybiByb290RGlyO1xuICByZXR1cm4gcGF0aC5qb2luKHJvb3REaXIsIHBhdGhOYW1lKTtcbn1cblxuY29uc3QgdXNlckNvbmZpZyA9IHJlcXVpcmUocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICcuL3hwaW5lLmNvbmZpZy5tanMnKSkuZGVmYXVsdDtcblxuY29uc3QgY29uZmlnRGVmYXVsdHMgPSB7XG4gIHJvb3REaXI6IGZyb21Sb290KCksXG4gIHNyY0RpcjogZnJvbVJvb3QoJy4vc3JjJyksXG4gIGRpc3REaXI6IGZyb21Sb290KCcuL2Rpc3QnKSxcbiAgcGFja2FnZUpzb25QYXRoOiBmcm9tUm9vdCgncGFja2FnZS5qc29uJyksXG4gIC8vIFdlIG5lZWQgdG8gdXNlIGdldHRlcnMgaGVyZSBpbiB0aGUgZXZlbnQgc29tZW9uZSB3YW50cyB0byBjaGFuZ2UgZm9sZGVycywgc3VjaCBhcyB0aGUgZGlzdCBmb2xkZXJcbiAgZ2V0IGRpc3RQdWJsaWNEaXIoKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmRpc3REaXIsICcuL3B1YmxpYycpO1xuICB9LFxuICBnZXQgZGlzdFB1YmxpY1NjcmlwdHNEaXIoKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmRpc3RQdWJsaWNEaXIsICcuL3NjcmlwdHMnKTtcbiAgfSxcbiAgZ2V0IGRpc3RUZW1wRm9sZGVyKCkge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXN0RGlyLCAnLi90ZW1wJyk7XG4gIH0sXG4gIGdldCBjbGllbnRKU0J1bmRsZVBhdGgoKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmRpc3RQdWJsaWNTY3JpcHRzRGlyLCAnLi9hcHAuanMnKTtcbiAgfSxcbiAgZ2V0IGFscGluZURhdGFQYXRoKCkge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXN0VGVtcEZvbGRlciwgJy4vYWxwaW5lLWRhdGEudHMnKTtcbiAgfSxcbiAgZ2V0IHNlcnZlckRpc3REaXIoKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmRpc3REaXIsICcuL3NlcnZlcicpO1xuICB9LFxuICBnZXQgc2VydmVyRGlzdEFwcFBhdGgoKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLnNlcnZlckRpc3REaXIsICcuL2FwcC5qcycpO1xuICB9LFxuICAvLyBJbXBvcnRhbnQgZGlycy9wYXRoc1xuICBnZXQgcGFnZXNEaXIoKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLnNyY0RpciwgJy4vcGFnZXMnKTtcbiAgfSxcbiAgZ2V0IHB1YmxpY0RpcigpIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuc3JjRGlyLCAnLi9wdWJsaWMnKTtcbiAgfSxcbiAgZ2V0IHNlcnZlckRpcigpIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuc3JjRGlyLCAnLi9zZXJ2ZXInKTtcbiAgfSxcbiAgZ2V0IHJ1bkRpcigpIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuc2VydmVyRGlyLCAnLi9ydW4nKTtcbiAgfSxcbiAgZ2V0IHNlcnZlckFwcFBhdGgoKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLnNlcnZlckRpciwgJy4vYXBwLnRzJyk7XG4gIH0sXG4gIGdldCBnbG9iYWxDU1NGaWxlKCkge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5wdWJsaWNEaXIsICcuL3N0eWxlcy9nbG9iYWwuY3NzJyk7XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgY29uZmlnOiBYUGluZUNvbmZpZyA9IHtcbiAgLi4uY29uZmlnRGVmYXVsdHMsXG4gIC4uLnVzZXJDb25maWcsXG59OyIsICJpbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbW9kdWxlJztcblxuY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcblxuZXhwb3J0IGRlZmF1bHQgcmVxdWlyZTsiLCAiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG5pbXBvcnQgeyBidWlsZEFwcCB9IGZyb20gJy4vYnVpbGQnO1xuXG5idWlsZEFwcCgpOyJdLAogICJtYXBwaW5ncyI6ICI7OztBQUFBLE9BQU9BLFdBQVU7QUFDakIsT0FBT0MsU0FBUTtBQUNmLFNBQVMsYUFBYTtBQUN0QixPQUFPLG9CQUFvQjtBQUMzQixPQUFPQyxTQUFROzs7QUNKZixPQUFPLFFBQVE7QUFDZixPQUFPLFFBQVE7QUFDZixPQUFPLFVBQVU7QUEwQ1YsU0FBUywrQkFDZCxNQUNBLFlBQ0Esc0JBQWdDLENBQUMsR0FDakMsaUJBQXdDLENBQUMsR0FDekM7QUFDQSxNQUFJLEtBQUssU0FBUyxHQUFHLFdBQVcsY0FBYztBQUM1QyxVQUFNLFlBQVksc0JBQXNCLE1BQU0sVUFBVTtBQUN4RCxRQUFJLFlBQVksQ0FBQyxNQUFNLFlBQVksWUFBWSxDQUFDLEdBQUc7QUFHakQsMEJBQW9CLEtBQUssVUFBVSxDQUFDLEVBQUUsUUFBUSxpQkFBaUIsRUFBRSxDQUFDO0FBQUEsSUFDcEU7QUFBQSxFQUNGO0FBQ0EsTUFBSSxLQUFLLFNBQVMsR0FBRyxXQUFXLFlBQVk7QUFDMUMsU0FBSyxhQUFhLFdBQVM7QUFDekIsVUFBSSxDQUFDLEdBQUcsV0FBVyxxQkFBcUIsR0FBRyxXQUFXLG1CQUFtQixFQUFFLFNBQVMsTUFBTSxJQUFJLEdBQUc7QUFDL0YsY0FBTSxZQUFZLDRCQUE0QixPQUFPLFVBQVU7QUFDL0QsdUJBQWUsS0FBSyxTQUFTO0FBQUEsTUFDL0I7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBRUEsT0FBSyxhQUFhLFdBQVM7QUFDekIsbUNBQStCLE9BQU8sWUFBWSxxQkFBcUIsY0FBYztBQUFBLEVBQ3ZGLENBQUM7QUFDRCxTQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0E7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ZSxRQUFRLE1BQU0sR0FBRztBQUN0QyxtQkFBYSxJQUFJO0FBQ2pCLFlBQU0sU0FBUyxhQUFhLEtBQUssR0FBRztBQUNwQyxNQUFBQSxJQUFHLGNBQWMsTUFBTTtBQUN2QixNQUFBQSxJQUFHLFlBQVksTUFBTSxPQUFPO0FBQUEsSUFDOUIsUUFBUTtBQUFBLElBQUU7QUFBQSxFQUNaO0FBQ0Y7QUFPQSxlQUFzQixRQUFRLFVBQWtCLE1BQWdDLGtCQUFrQixDQUFDLE9BQU8sTUFBTSxHQUFHO0FBQ2pILFFBQU0sUUFBUSxTQUFTLFdBQVcsV0FBVyxTQUFTLFFBQVEsU0FBUyxHQUFHO0FBQzFFLFFBQU0sWUFBWSxNQUFNLElBQUksQ0FBQyxTQUFTO0FBQ3BDLFFBQUksQ0FBQyxnQkFBZ0IsS0FBSyxTQUFPLEtBQUssU0FBUyxHQUFHLENBQUMsRUFBRyxRQUFPO0FBQzdELFdBQU87QUFBQSxNQUNMO0FBQUEsTUFDQSxNQUFPQSxJQUFHLFNBQVMsSUFBSSxFQUFFLFFBQVMsT0FBTztBQUFBLElBQzNDO0FBQUEsRUFDRixDQUFDLEVBQUUsT0FBTyxPQUFPO0FBQ2pCLFFBQU0sWUFBWSxVQUFVLE9BQU8sQ0FBQyxPQUFPLFlBQXNCO0FBQy9ELFdBQU8sUUFBUSxPQUFPO0FBQUEsRUFDeEIsR0FBRyxDQUFDO0FBQ0osVUFBUSxLQUFLLElBQUksVUFBVSxRQUFRLENBQUMsQ0FBQyxjQUFjLElBQUksRUFBRTtBQUMzRDs7O0FJN1FBLFNBQVM7IiwKICAibmFtZXMiOiBbInBhdGgiLCAiZnMiLCAidHMiLCAiY2hpbGQiLCAidGV4dCIsICJwYXRoIiwgInJlcXVpcmUiLCAicGF0aCIsICJmcyIsICJidWlsZCIsICJwYXRoIiwgInRzIl0KfQo=
@@ -479,4 +479,3 @@ async function runDevServer() {
479
479
 
480
480
  // src/scripts/xpine-dev.ts
481
481
  runDevServer();
482
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3J1bkRldlNlcnZlci50cyIsICIuLi8uLi8uLi9zcmMvc2NyaXB0cy9idWlsZC50cyIsICIuLi8uLi8uLi9zcmMvYnVpbGQvdHlwZXNjcmlwdC1idWlsZGVyLnRzIiwgIi4uLy4uLy4uL3NyYy91dGlsL2dldC1jb25maWcudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWwvcmVxdWlyZS50cyIsICIuLi8uLi8uLi9zcmMvdXRpbC9lbnYudHMiLCAiLi4vLi4vLi4vc3JjL3NjcmlwdHMveHBpbmUtZGV2LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgZXhwcmVzc1dzIGZyb20gJ2V4cHJlc3Mtd3MnO1xuaW1wb3J0IGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnZXZlbnRzJztcbmltcG9ydCBjaG9raWRhciBmcm9tICdjaG9raWRhcic7XG5pbXBvcnQgeyBidWlsZEFwcCB9IGZyb20gJy4vc2NyaXB0cy9idWlsZCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4vdXRpbC9nZXQtY29uZmlnJztcbmltcG9ydCB7IHNldHVwRW52IH0gZnJvbSAnLi91dGlsL2Vudic7XG5cbnNldHVwRW52KCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5EZXZTZXJ2ZXIoKSB7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WID0gJ2RldmVsb3BtZW50JztcbiAgY29uc3Qgc3RhcnRTZXJ2ZXIgPSBhd2FpdCBpbXBvcnQoY29uZmlnLnNlcnZlckRpc3RBcHBQYXRoICsgYD9jYWNoZT0ke0RhdGUubm93KCl9YCk7XG5cbiAgLy8gSW5pdGlhbCBzZXJ2ZXIgc2V0IHVwXG4gIGF3YWl0IGJ1aWxkQXBwKHRydWUpO1xuICBsZXQgYXBwU2VydmVyID0gYXdhaXQgc3RhcnRTZXJ2ZXIuZGVmYXVsdCgpO1xuXG4gIC8vIFdhdGNoIGZpbGVzXG4gIGNvbnN0IHdhdGNoZXIgPSBjaG9raWRhci53YXRjaChjb25maWcuc3JjRGlyLCB7XG4gICAgaWdub3JlSW5pdGlhbDogdHJ1ZSxcbiAgICAvLyBJZ25vcmUgbWFwIGFuZCBwcmlzbWEgZmlsZXNcbiAgICBpZ25vcmVkOiAocGF0aE5hbWUpID0+IHBhdGhOYW1lLmVuZHNXaXRoKCcubWFwJykgfHwgcGF0aE5hbWUuc3RhcnRzV2l0aChwYXRoLmpvaW4oY29uZmlnLnNlcnZlckRpciwgJy4vcHJpc21hJykpLFxuICB9KTtcbiAgd2F0Y2hlci5vbignYWxsJywgYXN5bmMgKGV2ZW50LCBwYXRoKSA9PiB7XG4gICAgY29uc3Qgc2hvdWxkUmVsb2FkU2VydmVyID0gKHBhdGguc3RhcnRzV2l0aChjb25maWcuc2VydmVyRGlyKSAmJiAhcGF0aC5zdGFydHNXaXRoKGNvbmZpZy5ydW5EaXIpKSB8fFxuICAgICAgWydhZGQnLCAndW5saW5rJ10uaW5jbHVkZXMoZXZlbnQpICYmIHBhdGguc3RhcnRzV2l0aChjb25maWcucGFnZXNEaXIpO1xuICAgIGlmIChzaG91bGRSZWxvYWRTZXJ2ZXIpIHtcbiAgICAgIC8vIFdlIG1vZGlmaWVkIGZpbGVzIGluIHRoZSBzZXJ2ZXIsIHJlc3RhcnQgdGhlIHNlcnZlclxuICAgICAgYXBwU2VydmVyLnNlcnZlci5jbG9zZSgpO1xuICAgICAgYXdhaXQgYnVpbGRBcHAodHJ1ZSk7XG4gICAgICBjb25zdCBzdGFydFNlcnZlciA9IGF3YWl0IGltcG9ydChjb25maWcuc2VydmVyRGlzdEFwcFBhdGggKyBgP2NhY2hlPSR7RGF0ZS5ub3coKX1gKTtcbiAgICAgIGFwcFNlcnZlciA9IGF3YWl0IHN0YXJ0U2VydmVyLmRlZmF1bHQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgYnVpbGRBcHAodHJ1ZSk7XG4gICAgcmVmcmVzaEVtaXR0ZXIuZW1pdCgncmVmcmVzaCcpO1xuICB9KTtcblxuICAvLyBDcmVhdGUgd2ViIHNvY2tldCBzZXZlclxuICBjb25zdCB3c0FwcCA9IGV4cHJlc3MoKTtcbiAgY29uc3Qgd3NTZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcih3c0FwcCk7XG4gIGV4cHJlc3NXcyh3c0FwcCwgd3NTZXJ2ZXIpO1xuICBjbGFzcyBSZWZyZXNoRW1pdHRlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7IH07XG4gIGNvbnN0IHJlZnJlc2hFbWl0dGVyID0gbmV3IFJlZnJlc2hFbWl0dGVyKCk7XG5cbiAgLy8gQHRzLWlnbm9yZVxuICB3c0FwcC53cygnL2Rldi1zZXJ2ZXInLCBmdW5jdGlvbiAod3MpIHtcbiAgICByZWZyZXNoRW1pdHRlci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICByZWZyZXNoRW1pdHRlci5vbigncmVmcmVzaCcsICgpID0+IHtcbiAgICAgIHdzLnNlbmQoJ3JlZnJlc2g6Y2xpZW50Jyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IHdzUG9ydCA9IDMwMDE7XG4gIHdzU2VydmVyLmxpc3Rlbih3c1BvcnQpO1xuICB3c1NlcnZlci5vbignbGlzdGVuaW5nJywgKCkgPT4ge1xuICAgIGNvbnNvbGUuaW5mbyhgRGV2IHNlcnZlciBsaXN0ZW5pbmcgb24gcG9ydCAke3dzUG9ydH1gKTtcbiAgfSk7XG59XG5cblxuIiwgImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGJ1aWxkIH0gZnJvbSAnZXNidWlsZCc7XG5pbXBvcnQgYnVpbHRpbk1vZHVsZXMgZnJvbSAnYnVpbHRpbi1tb2R1bGVzJztcbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcbmltcG9ydCB7XG4gIGNvbnZlcnRFbnRyeVBvaW50c1RvU2luZ2xlRmlsZSxcbiAgZmluZERhdGFBdHRyaWJ1dGVzQW5kRnVuY3Rpb25zLFxuICByZW1vdmVDbGllbnRTY3JpcHRJblRTWEZpbGVcbn0gZnJvbSAnLi4vYnVpbGQvdHlwZXNjcmlwdC1idWlsZGVyJztcbmltcG9ydCB7IGdsb2JTeW5jIH0gZnJvbSAnZ2xvYic7XG5pbXBvcnQgcG9zdGNzcyBmcm9tICdwb3N0Y3NzJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB0YWlsd2luZFBvc3Rjc3MgZnJvbSAnQHRhaWx3aW5kY3NzL3Bvc3Rjc3MnO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi4vdXRpbC9nZXQtY29uZmlnJztcblxuLy8gRXh0ZW5zaW9ucyB0byBsb29rIGZvciBpbiB0aGUgYnVuZGxlXG5jb25zdCBleHRlbnNpb25zID0gWycudHMnLCAnLnRzeCddO1xuY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhjb25maWcucGFja2FnZUpzb25QYXRoLCAndXRmLTgnKSk7XG5jb25zdCBhbGxQYWNrYWdlcyA9IE9iamVjdC5rZXlzKHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcykuY29uY2F0KE9iamVjdC5rZXlzKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcykpO1xuY29uc3QgYWxsUGFja2FnZXNJbmNsdWRpbmdOb2RlID0gYWxsUGFja2FnZXMuY29uY2F0KGJ1aWx0aW5Nb2R1bGVzKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQXBwKGlzRGV2ID0gZmFsc2UpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzcmNEaXJGaWxlcyA9IGdsb2JTeW5jKGNvbmZpZy5zcmNEaXIgKyAnLyoqLyoue2pzLHRzLHRzeCxqc3h9Jyk7XG4gICAgY29uc3QgeyBjb21wb25lbnREYXRhLCBkYXRhRmlsZXMsIH0gPSBhd2FpdCBidWlsZEFwcEZpbGVzKHNyY0RpckZpbGVzLCBpc0Rldik7XG4gICAgY29uc3QgYWxwaW5lRGF0YUZpbGUgPSBhd2FpdCBidWlsZEFscGluZURhdGFGaWxlKGNvbXBvbmVudERhdGEsIGRhdGFGaWxlcyk7XG4gICAgYXdhaXQgYnVpbGRDbGllbnRTaWRlRmlsZXMoW2FscGluZURhdGFGaWxlXSwgaXNEZXYpO1xuICAgIGZzLnJlbW92ZVN5bmMoY29uZmlnLmRpc3RUZW1wRm9sZGVyKTtcbiAgICBhd2FpdCBidWlsZENTUygpO1xuICAgIGF3YWl0IGJ1aWxkUHVibGljRm9sZGVyU3ltbGlua3MoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcignQnVpbGQgZmFpbGVkJyk7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkQXBwRmlsZXMoZmlsZXM6IHN0cmluZ1tdLCBpc0Rldj86IGJvb2xlYW4pIHtcbiAgY29uc3QgY29tcG9uZW50RGF0YSA9IFtdO1xuICBjb25zdCBkYXRhRmlsZXMgPSBbXTtcbiAgLy8gRmlsdGVyIG91dCBjbGllbnQgc2lkZSBmaWxlcyBhbmQgZmlsZXMgdGhhdCBhcmVuJ3Qgb2YgdGhlIGFsbG93ZWQgZXh0ZW5zaW9uc1xuICBjb25zdCBiYWNrZW5kRmlsZXMgPSBmaWxlc1xuICAgIC5maWx0ZXIoKGZpbGUpID0+IGV4dGVuc2lvbnMuZmluZChleHQgPT4gZmlsZS5lbmRzV2l0aChleHQpKSlcbiAgICAuZmlsdGVyKChmaWxlKSA9PiAhZmlsZS5zdGFydHNXaXRoKGNvbmZpZy5wdWJsaWNEaXIpKTtcbiAgZnMuZW5zdXJlRGlyU3luYyhjb25maWcuZGlzdERpcik7XG4gIC8vIEJ1aWxkIGJhY2tlbmQvU1NSIFRTWCBtb2R1bGVzXG4gIGF3YWl0IGJ1aWxkKHtcbiAgICBlbnRyeVBvaW50czogYmFja2VuZEZpbGVzLFxuICAgIGZvcm1hdDogJ2VzbScsXG4gICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICBvdXRkaXI6IGNvbmZpZy5kaXN0RGlyLFxuICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICBzb3VyY2VtYXA6IGlzRGV2ID8gJ2lubGluZScgOiBmYWxzZSxcbiAgICBleHRlcm5hbDogYWxsUGFja2FnZXMsXG4gICAganN4OiAndHJhbnNmb3JtJyxcbiAgICBtaW5pZnk6ICFpc0RldixcbiAgICBwbHVnaW5zOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdhZGQtZG90LWpzJyxcbiAgICAgICAgc2V0dXAoYnVpbGQpIHtcbiAgICAgICAgICBidWlsZC5vblJlc29sdmUoeyBmaWx0ZXI6IC8uKi8sIH0sIGFyZ3MgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFzQXRTaWduID0gYXJncy5wYXRoLnN0YXJ0c1dpdGgoJ0AnKTtcbiAgICAgICAgICAgIGNvbnN0IGlzUGFja2FnZSA9IGhhc0F0U2lnbiA/XG4gICAgICAgICAgICAgIGFsbFBhY2thZ2VzSW5jbHVkaW5nTm9kZS5pbmNsdWRlcyhhcmdzLnBhdGgpIDpcbiAgICAgICAgICAgICAgYWxsUGFja2FnZXNJbmNsdWRpbmdOb2RlLmluY2x1ZGVzKGFyZ3MucGF0aC5zcGxpdCgnLycpLnNoaWZ0KCkpO1xuICAgICAgICAgICAgaWYgKGFyZ3MuaW1wb3J0ZXIgJiYgIWlzUGFja2FnZSkge1xuICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBkb2luZyBhbiBpbmRleCBpbXBvcnQgd2UgbmVlZCAvaW5kZXguanNcbiAgICAgICAgICAgICAgY29uc3QgY2FsY3VsYXRlZERpciA9IHBhdGguam9pbihhcmdzLnJlc29sdmVEaXIsIGFyZ3MucGF0aCk7XG4gICAgICAgICAgICAgIGxldCBleGlzdHNBc0ZpbGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBleHRlbnNpb24gb2YgZXh0ZW5zaW9ucykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFzRmlsZSA9IGNhbGN1bGF0ZWREaXIgKyBleHRlbnNpb247XG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RzID0gZnMuZXhpc3RzU3luYyhhc0ZpbGUpO1xuICAgICAgICAgICAgICAgIGlmIChleGlzdHMpIGV4aXN0c0FzRmlsZSA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGV0IG91dHB1dFBhdGggPSBhcmdzLnBhdGggKyAoZXhpc3RzQXNGaWxlID8gJycgOiAnL2luZGV4JykgKyAnLmpzJztcbiAgICAgICAgICAgICAgb3V0cHV0UGF0aCA9IGFyZ3MucGF0aC5lbmRzV2l0aCgnLmpzJykgfHwgYXJncy5wYXRoLmVuZHNXaXRoKCcubWpzJykgPyBhcmdzLnBhdGggOiBvdXRwdXRQYXRoO1xuICAgICAgICAgICAgICByZXR1cm4geyBwYXRoOiBvdXRwdXRQYXRoLCBleHRlcm5hbDogdHJ1ZSwgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdpbnNlcnQtaHRtbC1iYW5uZXItYW5kLXJlbW92ZS1jbGllbnQtc2NyaXB0cycsXG4gICAgICAgIHNldHVwKGJ1aWxkKSB7XG4gICAgICAgICAgYnVpbGQub25Mb2FkKHsgZmlsdGVyOiAvLnRzeC8sIH0sIGFyZ3MgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2xlYW5lZENvbnRlbnQgPSByZW1vdmVDbGllbnRTY3JpcHRJblRTWEZpbGUoYXJncy5wYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IGh0bWxJbXBvcnRTdGFydCA9ICdpbXBvcnQgeyBodG1sIH0gZnJvbSBcXCd4cGluZVxcJztcXG4nO1xuICAgICAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IGAke2h0bWxJbXBvcnRTdGFydH0ke2NsZWFuZWRDb250ZW50LmNvbnRlbnR9YDtcbiAgICAgICAgICAgIGNvbXBvbmVudERhdGEucHVzaCh7XG4gICAgICAgICAgICAgIC4uLmFyZ3MsXG4gICAgICAgICAgICAgIGNvbnRlbnRzOiBgJHtodG1sSW1wb3J0U3RhcnR9JHtjbGVhbmVkQ29udGVudC5mdWxsQ29udGVudH1gLFxuICAgICAgICAgICAgICBjbGllbnRDb250ZW50OiBjbGVhbmVkQ29udGVudC5jbGllbnRDb250ZW50LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50czogbmV3Q29udGVudCxcbiAgICAgICAgICAgICAgbG9hZGVyOiAndHN4JyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnZ2V0LWRhdGEtZmlsZXMnLFxuICAgICAgICBzZXR1cChidWlsZCkge1xuICAgICAgICAgIGJ1aWxkLm9uTG9hZCh7IGZpbHRlcjogL1xcLmRhdGFcXC4oanN8bWpzfHRzKSQvLCB9LCBhcmdzID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRzID0gZnMucmVhZEZpbGVTeW5jKGFyZ3MucGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgICAgICBkYXRhRmlsZXMucHVzaCh7XG4gICAgICAgICAgICAgIC4uLmFyZ3MsXG4gICAgICAgICAgICAgIGNvbnRlbnRzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50cyxcbiAgICAgICAgICAgICAgbG9hZGVyOiAndHMnLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICBdLFxuICB9KTtcbiAgYXdhaXQgbG9nU2l6ZShjb25maWcuZGlzdERpciwgJ2FwcCcpO1xuICByZXR1cm4ge1xuICAgIGNvbXBvbmVudERhdGEsXG4gICAgZGF0YUZpbGVzLFxuICB9O1xufVxuXG4vLyBCdWlsZCBjbGllbnQgc2lkZSBmaWxlc1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRDbGllbnRTaWRlRmlsZXMoYWxwaW5lRGF0YUZpbGVzOiBzdHJpbmdbXSA9IFtdLCBpc0Rldj86IGJvb2xlYW4pIHtcbiAgLy8gV3JpdGUgdGhlIHRlbXAgZmlsZSB0byB1c2VcbiAgY29uc3QgdGVtcEZpbGVQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXN0VGVtcEZvbGRlciwgJy4vYXBwLnRzJyk7XG4gIGZzLmVuc3VyZUZpbGVTeW5jKHRlbXBGaWxlUGF0aCk7XG4gIC8vIEdldCBhbGwgdHMvanMgZmlsZXMgaW4gcHVibGljIGZvbGRlciBidXQgaWdub3JlIHRoZSBwYWdlcyBzY3JpcHRzXG4gIGNvbnN0IHBhZ2VzU2NyaXB0c0dsb2IgPSBjb25maWcucHVibGljRGlyICsgJy9zY3JpcHRzL3BhZ2VzLyoqLyoue2pzLHRzfSc7XG4gIGNvbnN0IGNsaWVudEZpbGVzID0gZ2xvYlN5bmMoXG4gICAgY29uZmlnLnB1YmxpY0RpciArICcvKiovKi57anMsdHN9JyxcbiAgICB7XG4gICAgICBpZ25vcmU6IHBhZ2VzU2NyaXB0c0dsb2IsXG4gICAgfVxuICApO1xuICAvLyBGaWx0ZXIgb3V0IGFsbCBwdWJsaWMvcGFnZXMgZmlsZXNcbiAgY29udmVydEVudHJ5UG9pbnRzVG9TaW5nbGVGaWxlKGFscGluZURhdGFGaWxlcy5jb25jYXQoY2xpZW50RmlsZXMpLCB0ZW1wRmlsZVBhdGgpO1xuICAvLyBXcml0ZSBkZXYgc2VydmVyIGNvZGUgdG8gdGhlIHRlbXAgZmlsZSBwYXRoXG4gIGlmIChpc0Rldikgd3JpdGVEZXZTZXJ2ZXJDbGllbnRTaWRlQ29kZSh0ZW1wRmlsZVBhdGgpO1xuICAvLyBXcml0ZSBzcGEgZnVuY3Rpb25hbGl0eSB0byB0aGUgdGVtcCBmaWxlIHBhdGhcbiAgd3JpdGVTcGFDbGllbnRTaWRlQ29kZSh0ZW1wRmlsZVBhdGgpO1xuICBhd2FpdCBidWlsZCh7XG4gICAgZW50cnlQb2ludHM6IFt0ZW1wRmlsZVBhdGhdLFxuICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICBvdXRkaXI6IGNvbmZpZy5kaXN0UHVibGljU2NyaXB0c0RpcixcbiAgICBtaW5pZnk6ICFpc0RldixcbiAgICBzb3VyY2VtYXA6IGlzRGV2ID8gJ2lubGluZScgOiBmYWxzZSxcbiAgfSk7XG4gIC8vIEJ1aWxkIHBhZ2VzIGZpbGVzIHNjcmlwdHNcbiAgY29uc3QgcGFnZXNGaWxlcyA9IGdsb2JTeW5jKHBhZ2VzU2NyaXB0c0dsb2IpO1xuICBhd2FpdCBidWlsZCh7XG4gICAgZW50cnlQb2ludHM6IHBhZ2VzRmlsZXMgfHwgW10sXG4gICAgYnVuZGxlOiB0cnVlLFxuICAgIG91dGRpcjogY29uZmlnLmRpc3RQdWJsaWNTY3JpcHRzRGlyICsgJy9wYWdlcycsXG4gICAgbWluaWZ5OiAhaXNEZXYsXG4gICAgc291cmNlbWFwOiBpc0RldiA/ICdpbmxpbmUnIDogZmFsc2UsXG4gIH0pO1xuICBhd2FpdCBsb2dTaXplKGNvbmZpZy5kaXN0UHVibGljRGlyLCAnY2xpZW50Jyk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlRGV2U2VydmVyQ2xpZW50U2lkZUNvZGUodGVtcEZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgZGV2U2VydmVyUGF0aCA9IHBhdGguam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCAnLi4vc3RhdGljL2Rldi1zZXJ2ZXIuanMnKTtcbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhkZXZTZXJ2ZXJQYXRoLCAndXRmLTgnKTtcbiAgZnMuYXBwZW5kRmlsZVN5bmModGVtcEZpbGVQYXRoLCBgXFxuYCArIGNvbnRlbnQpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVNwYUNsaWVudFNpZGVDb2RlKHRlbXBGaWxlUGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IHNwYVBhdGggPSBwYXRoLmpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgJy4uL3N0YXRpYy9zcGEuanMnKTtcbiAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhzcGFQYXRoLCAndXRmLTgnKTtcbiAgZnMuYXBwZW5kRmlsZVN5bmModGVtcEZpbGVQYXRoLCBgXFxuYCArIGNvbnRlbnQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBidWlsZEFscGluZURhdGFGaWxlKGNvbXBvbmVudERhdGE6IGFueVtdLCBkYXRhRmlsZXM6IGFueVtdKSB7XG4gIGNvbnN0IG91dHB1dCA9IHtcbiAgICBpbXBvcnRzOiBbXG4gICAgICAnaW1wb3J0IEFscGluZSBmcm9tIFxcJ2FscGluZWpzXFwnOydcbiAgICBdLFxuICAgIGNvZGU6IFtdLFxuICAgIGVuZDogW1xuICAgICAgJ3dpbmRvdy5BbHBpbmUgPSBBbHBpbmU7J1xuICAgIF0sXG4gIH07XG4gIGNvbnN0IGRhdGFGdW5jdGlvblJlc3VsdHMgPSB7XG4gICAgZm91bmREYXRhQXR0cmlidXRlczogW10sXG4gICAgZm91bmRGdW5jdGlvbnM6IFtdLFxuICAgIGZvdW5kSW1wb3J0czogW10sXG4gIH07XG4gIGNvbnN0IGNvbXBvbmVudHNBbmREYXRhRmlsZXMgPSBjb21wb25lbnREYXRhLmNvbmNhdChkYXRhRmlsZXMpO1xuICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzQW5kRGF0YUZpbGVzKSB7XG4gICAgLy8gU2luZ2xlIHNvdXJjZSBmaWxlXG4gICAgY29uc3Qgc291cmNlRmlsZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgICBjb21wb25lbnQucGF0aCxcbiAgICAgIGNvbXBvbmVudC5jb250ZW50cyxcbiAgICAgIHRzLlNjcmlwdFRhcmdldC5MYXRlc3RcbiAgICApO1xuICAgIGNvbnN0IGRhdGFGdW5jdGlvblJlc3VsdCA9IGZpbmREYXRhQXR0cmlidXRlc0FuZEZ1bmN0aW9ucyhzb3VyY2VGaWxlLCBzb3VyY2VGaWxlKTtcbiAgICBkYXRhRnVuY3Rpb25SZXN1bHRzLmZvdW5kRGF0YUF0dHJpYnV0ZXMucHVzaCguLi5kYXRhRnVuY3Rpb25SZXN1bHQuZm91bmREYXRhQXR0cmlidXRlcyk7XG4gICAgY29uc3QgZm91bmRGdW5jdGlvbnNXaXRoUGF0aCA9IGRhdGFGdW5jdGlvblJlc3VsdC5mb3VuZEZ1bmN0aW9ucy5tYXAoaXRlbSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5pdGVtLFxuICAgICAgICBwYXRoOiBjb21wb25lbnQucGF0aCxcbiAgICAgICAgY29udGVudDogY29tcG9uZW50LmNsaWVudENvbnRlbnQsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGRhdGFGdW5jdGlvblJlc3VsdHMuZm91bmRGdW5jdGlvbnMucHVzaCguLi5mb3VuZEZ1bmN0aW9uc1dpdGhQYXRoKTtcbiAgfVxuICBjb25zdCB2YWxpZERhdGFGdW5jdGlvbnMgPSBkYXRhRnVuY3Rpb25SZXN1bHRzLmZvdW5kRnVuY3Rpb25zLmZpbHRlcihpdGVtID0+IHtcbiAgICByZXR1cm4gZGF0YUZ1bmN0aW9uUmVzdWx0cy5mb3VuZERhdGFBdHRyaWJ1dGVzLmluY2x1ZGVzKGl0ZW0ubmFtZSkgJiYgaXRlbS5jb250ZW50O1xuICB9KTtcbiAgZm9yIChjb25zdCBkYXRhRnVuY3Rpb24gb2YgdmFsaWREYXRhRnVuY3Rpb25zKSB7XG4gICAgaWYgKCFkYXRhRnVuY3Rpb24uaGFzRXhwb3J0KSBjb250aW51ZTtcbiAgICBvdXRwdXQuY29kZS5wdXNoKGRhdGFGdW5jdGlvbi5jb250ZW50KTtcbiAgICBvdXRwdXQuY29kZS5wdXNoKGBBbHBpbmUuZGF0YSgnJHtkYXRhRnVuY3Rpb24ubmFtZX0nLCAke2RhdGFGdW5jdGlvbi5uYW1lfSk7YCk7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gb3V0cHV0LmltcG9ydHMuam9pbignXFxuJykgKyAnXFxuJyArIG91dHB1dC5jb2RlLmpvaW4oJ1xcbicpICsgJ1xcbicgKyBvdXRwdXQuZW5kLmpvaW4oJ1xcbicpO1xuICBmcy5lbnN1cmVGaWxlU3luYyhjb25maWcuYWxwaW5lRGF0YVBhdGgpO1xuICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZy5hbHBpbmVEYXRhUGF0aCwgcmVzdWx0KTtcbiAgcmV0dXJuIGNvbmZpZy5hbHBpbmVEYXRhUGF0aDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ1NTKCkge1xuICBjb25zdCBjc3NGaWxlcyA9IGdsb2JTeW5jKGNvbmZpZy5zcmNEaXIgKyAnLyoqLyouY3NzJyk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBjc3NGaWxlcykge1xuICAgIGNvbnN0IGZpbGVDb250ZW50cyA9IGZzLnJlYWRGaWxlU3luYyhmaWxlLCAndXRmLTgnKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwb3N0Y3NzKFt0YWlsd2luZFBvc3Rjc3MoKV0pLnByb2Nlc3MoZmlsZUNvbnRlbnRzLCB7IGZyb206IGZpbGUsIH0pO1xuICAgIC8vIFdyaXRlIHRvIGRpc3QgZm9sZGVyXG4gICAgY29uc3QgbmV3UGF0aCA9IGZpbGUucmVwbGFjZShjb25maWcuc3JjRGlyLCBjb25maWcuZGlzdERpcik7XG4gICAgZnMuZW5zdXJlRmlsZVN5bmMobmV3UGF0aCk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhuZXdQYXRoLCByZXN1bHQuY3NzKTtcbiAgfVxuICBsb2dTaXplKGNvbmZpZy5kaXN0UHVibGljRGlyLCAnY3NzJyk7XG59XG5cbi8vIFdlIG5lZWQgdG8gc3ltbGluayB0aGUgbm9uIENTUyBvciBKUyBmaWxlcyBmcm9tIHRoZSBzcmMvcHVibGljIGZvbGRlciBpbnRvIHRoZSBkaXN0IGZvbGRlclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkUHVibGljRm9sZGVyU3ltbGlua3MoKSB7XG4gIGNvbnN0IGZpbGVzID0gZ2xvYlN5bmMoY29uZmlnLnB1YmxpY0RpciArICcvKiovKi4qJywge1xuICAgIGlnbm9yZTogJy8qKi8qLntjc3MsanMsdHMsdHN4LGpzeH0nLFxuICB9KTtcblxuICAvLyBDcmVhdGUgc3ltbGlua3MgaW4gZGlzdCBkaXJlY3RvcnlcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG5ld1BhdGggPSBmaWxlLnJlcGxhY2UoY29uZmlnLnNyY0RpciwgY29uZmlnLmRpc3REaXIpO1xuICAgICAgY29uc3Qgc3BsaXROZXdQYXRoID0gbmV3UGF0aC5zcGxpdCgnLycpO1xuICAgICAgc3BsaXROZXdQYXRoLnBvcCgpO1xuICAgICAgY29uc3QgbmV3RGlyID0gc3BsaXROZXdQYXRoLmpvaW4oJy8nKTtcbiAgICAgIGZzLmVuc3VyZURpclN5bmMobmV3RGlyKTtcbiAgICAgIGZzLnN5bWxpbmtTeW5jKGZpbGUsIG5ld1BhdGgpO1xuICAgIH0gY2F0Y2ggeyB9XG4gIH1cbn1cblxudHlwZSBGaWxlSXRlbSA9IHtcbiAgZmlsZTogc3RyaW5nO1xuICBzaXplOiBudW1iZXI7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2dTaXplKHBhdGhOYW1lOiBzdHJpbmcsIHR5cGU6ICdhcHAnIHwgJ2NsaWVudCcgfCAnY3NzJywgdmFsaWRFeHRlbnNpb25zID0gWycuanMnLCAnLmNzcyddKSB7XG4gIGNvbnN0IGZpbGVzID0gZ2xvYlN5bmMocGF0aE5hbWUgKyAnLyoqLyonICsgKHR5cGUgPT09ICdjc3MnID8gJy5jc3MnIDogJycpKTtcbiAgY29uc3QgZmlsZVNpemVzID0gZmlsZXMubWFwKChmaWxlKSA9PiB7XG4gICAgaWYgKCF2YWxpZEV4dGVuc2lvbnMuZmluZChleHQgPT4gZmlsZS5lbmRzV2l0aChleHQpKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB7XG4gICAgICBmaWxlLFxuICAgICAgc2l6ZTogKGZzLnN0YXRTeW5jKGZpbGUpLnNpemUpIC8gKDEwMjQgKiAxMDAwKSxcbiAgICB9O1xuICB9KS5maWx0ZXIoQm9vbGVhbik7XG4gIGNvbnN0IHRvdGFsU2l6ZSA9IGZpbGVTaXplcy5yZWR1Y2UoKHRvdGFsLCBjdXJyZW50OiBGaWxlSXRlbSkgPT4ge1xuICAgIHJldHVybiBjdXJyZW50LnNpemUgKyB0b3RhbDtcbiAgfSwgMCk7XG4gIGNvbnNvbGUuaW5mbyhgWyR7dG90YWxTaXplLnRvRml4ZWQoMyl9IE1CXSBCdWlsdCAke3R5cGV9YCk7XG59XG4iLCAiaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG50eXBlIEltcG9ydERlY2xhcmF0aW9uID0ge1xuICBub2RlOiB0cy5Ob2RlO1xuICBpbXBvcnRQYXRoOiBzdHJpbmc7XG59XG5cbi8vIG5vZGUgYXJnIHNob3VsZCBpbml0aWFsbHkgYmUgdGhlIHNvdXJjZSBub2RlXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW1wb3J0RGVjbGFyYXRpb25Ob2Rlcyhub2RlOiB0cy5Ob2RlLCBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlLCBpbXBvcnREZWNsYXJhdGlvbnM6IEltcG9ydERlY2xhcmF0aW9uW10gPSBbXSkge1xuICBpZiAobm9kZS5raW5kID09PSB0cy5TeW50YXhLaW5kLkltcG9ydERlY2xhcmF0aW9uKSB7XG4gICAgbGV0IGltcG9ydFBhdGggPSBudWxsO1xuICAgIG5vZGUuZm9yRWFjaENoaWxkKGNoaWxkID0+IHtcbiAgICAgIGlmIChjaGlsZC5raW5kID09PSB0cy5TeW50YXhLaW5kLlN0cmluZ0xpdGVyYWwpIHtcbiAgICAgICAgaW1wb3J0UGF0aCA9IGNoaWxkLmdldFRleHQoc291cmNlRmlsZSkucmVwbGFjZSgvW1xcXCJcXCddL2csICcnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpbXBvcnREZWNsYXJhdGlvbnMucHVzaCh7XG4gICAgICBub2RlLFxuICAgICAgaW1wb3J0UGF0aCxcbiAgICB9KTtcbiAgfVxuICBub2RlLmZvckVhY2hDaGlsZChjaGlsZCA9PiB7XG4gICAgZ2V0SW1wb3J0RGVjbGFyYXRpb25Ob2RlcyhjaGlsZCwgc291cmNlRmlsZSwgaW1wb3J0RGVjbGFyYXRpb25zKTtcbiAgfSk7XG4gIHJldHVybiBpbXBvcnREZWNsYXJhdGlvbnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcEltcG9ydHNOb2Rlc0Zyb21GaWxlKGltcG9ydHNUb1N0cmlwOiBzdHJpbmdbXSwgY29udGVudDogc3RyaW5nLCBpbXBvcnREZWNsYXJhdGlvbnM6IEltcG9ydERlY2xhcmF0aW9uW10pIHtcbiAgbGV0IG91dHB1dENvbnRlbnQgPSBjb250ZW50O1xuICBjb25zdCBmaWx0ZXJlZEltcG9ydHMgPSBpbXBvcnREZWNsYXJhdGlvbnMuZmlsdGVyKGl0ZW0gPT4gaW1wb3J0c1RvU3RyaXAuaW5jbHVkZXMoaXRlbS5pbXBvcnRQYXRoKSk7XG4gIGZvciAoY29uc3QgaW1wb3J0SXRlbSBvZiBmaWx0ZXJlZEltcG9ydHMpIHtcbiAgICBvdXRwdXRDb250ZW50ID0gb3V0cHV0Q29udGVudC5zbGljZSgwLCBpbXBvcnRJdGVtLm5vZGUucG9zKSArIG91dHB1dENvbnRlbnQuc2xpY2UoaW1wb3J0SXRlbS5ub2RlLmVuZCk7XG4gIH1cbiAgcmV0dXJuIG91dHB1dENvbnRlbnQ7XG59XG5cbnR5cGUgRm91bmRBbHBpbmVGdW5jdGlvbiA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBpc0RlZmF1bHRFeHBvcnQ6IGJvb2xlYW47XG4gIGhhc0V4cG9ydDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmREYXRhQXR0cmlidXRlc0FuZEZ1bmN0aW9ucyhcbiAgbm9kZTogdHMuTm9kZSxcbiAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSxcbiAgZm91bmREYXRhQXR0cmlidXRlczogc3RyaW5nW10gPSBbXSxcbiAgZm91bmRGdW5jdGlvbnM6IEZvdW5kQWxwaW5lRnVuY3Rpb25bXSA9IFtdXG4pIHtcbiAgaWYgKG5vZGUua2luZCA9PT0gdHMuU3ludGF4S2luZC5Kc3hBdHRyaWJ1dGUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGVWYWx1ZVBhaXIobm9kZSwgc291cmNlRmlsZSk7XG4gICAgaWYgKGF0dHJpYnV0ZT8uWzBdID09PSAneC1kYXRhJyAmJiBhdHRyaWJ1dGU/LlsxXSkge1xuICAgICAgLy8gV2UgZm91bmQgYSBkYXRhIGF0dHJpYnV0ZSwgXG4gICAgICAvLyBzbyBub3cgd2UgaGF2ZSB0byBzZWFyY2ggdGhyb3VnaG91dCB0aGUgZmlsZSBmb3IgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBvZiB0aGUgc2FtZSBuYW1lXG4gICAgICBmb3VuZERhdGFBdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlWzFdLnJlcGxhY2UoL1teYS16QS1aMC05XS9nLCAnJykpO1xuICAgIH1cbiAgfVxuICBpZiAobm9kZS5raW5kID09PSB0cy5TeW50YXhLaW5kLlNvdXJjZUZpbGUpIHtcbiAgICBub2RlLmZvckVhY2hDaGlsZChjaGlsZCA9PiB7XG4gICAgICBpZiAoW3RzLlN5bnRheEtpbmQuRnVuY3Rpb25EZWNsYXJhdGlvbiwgdHMuU3ludGF4S2luZC5WYXJpYWJsZURlY2xhcmF0aW9uXS5pbmNsdWRlcyhjaGlsZC5raW5kKSkge1xuICAgICAgICBjb25zdCBmdW5jdGlvbnMgPSBnZXRGdW5jdGlvbkRlY2xhcmF0aW9uVmFsdWUoY2hpbGQsIHNvdXJjZUZpbGUpO1xuICAgICAgICBmb3VuZEZ1bmN0aW9ucy5wdXNoKGZ1bmN0aW9ucyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBub2RlLmZvckVhY2hDaGlsZChjaGlsZCA9PiB7XG4gICAgZmluZERhdGFBdHRyaWJ1dGVzQW5kRnVuY3Rpb25zKGNoaWxkLCBzb3VyY2VGaWxlLCBmb3VuZERhdGFBdHRyaWJ1dGVzLCBmb3VuZEZ1bmN0aW9ucyk7XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGZvdW5kRGF0YUF0dHJpYnV0ZXMsXG4gICAgZm91bmRGdW5jdGlvbnMsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZVBhaXIobm9kZTogdHMuTm9kZSwgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIG5vZGUuZm9yRWFjaENoaWxkKGNoaWxkID0+IHtcbiAgICByZXN1bHQucHVzaChjaGlsZC5nZXRUZXh0KHNvdXJjZUZpbGUpKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGdW5jdGlvbkRlY2xhcmF0aW9uVmFsdWUobm9kZTogdHMuTm9kZSwgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSk6IEZvdW5kQWxwaW5lRnVuY3Rpb24ge1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgbmFtZTogbnVsbCxcbiAgICBpc0RlZmF1bHRFeHBvcnQ6IGZhbHNlLFxuICAgIGhhc0V4cG9ydDogZmFsc2UsXG4gIH07XG4gIG5vZGUuZm9yRWFjaENoaWxkKGNoaWxkID0+IHtcbiAgICBpZiAoY2hpbGQua2luZCA9PT0gdHMuU3ludGF4S2luZC5FeHBvcnRLZXl3b3JkKSB7XG4gICAgICByZXN1bHQuaGFzRXhwb3J0ID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNoaWxkLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuRGVmYXVsdEtleXdvcmQpIHtcbiAgICAgIHJlc3VsdC5pc0RlZmF1bHRFeHBvcnQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY2hpbGQua2luZCA9PT0gdHMuU3ludGF4S2luZC5JZGVudGlmaWVyKSB7XG4gICAgICByZXN1bHQubmFtZSA9IGNoaWxkLmdldFRleHQoc291cmNlRmlsZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gQ29udmVydCBlbnRyeSBwb2ludCBmaWxlcyBpbnRvIG9uZSBiaWcgYnVuZGxlIGZpbGVcbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0RW50cnlQb2ludHNUb1NpbmdsZUZpbGUoZW50cnlQb2ludHM6IHN0cmluZ1tdLCB0ZW1wV3JpdGVQYXRoOiBzdHJpbmcpIHtcbiAgZnMud3JpdGVGaWxlU3luYyhcbiAgICB0ZW1wV3JpdGVQYXRoLFxuICAgIGVudHJ5UG9pbnRzXG4gICAgICAubWFwKGVudHJ5ID0+IGBpbXBvcnQgXCIke2VudHJ5fVwiYClcbiAgICAgIC5qb2luKCc7XFxuJylcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUNsaWVudFNjcmlwdEluVFNYRmlsZShwYXRoTmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aE5hbWUsICd1dGYtOCcpO1xuICBjb25zdCBzb3VyY2UgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKFxuICAgIHBhdGhOYW1lLFxuICAgIGNvbnRlbnQsXG4gICAgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdFxuICApO1xuICBsZXQgdG9SZW1vdmVGcm9tOiBudW1iZXI7XG4gIGxldCBjbGllbnREYXRhU3RhcnQ6IG51bWJlcjtcbiAgY29uc3QgY2xpZW50SW1wb3J0c1RvSG9pc3QgPSBbXTtcbiAgY29uc3QgY2xpZW50SW1wb3J0c1RvUmVwbGFjZSA9IFtdO1xuICBzb3VyY2UuZm9yRWFjaENoaWxkKChjaGlsZCkgPT4ge1xuICAgIGlmIChjaGlsZC5raW5kID09PSB0cy5TeW50YXhLaW5kLkV4cHJlc3Npb25TdGF0ZW1lbnQpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBjaGlsZC5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICAvLyBSZW1vdmUgZnJvbSBoZXJlXG4gICAgICBpZiAodGV4dC5zdGFydHNXaXRoKCc8c2NyaXB0JykpIHtcbiAgICAgICAgdG9SZW1vdmVGcm9tID0gY2hpbGQucG9zO1xuICAgICAgICBjbGllbnREYXRhU3RhcnQgPSBjaGlsZC5lbmQ7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEhvaXN0IHRoZSBjbGllbnQgaW1wb3J0cyB0byBhYm92ZSB0aGUgPHNjcmlwdCAvPiB0YWdcbiAgICBpZiAoY2hpbGQua2luZCA9PT0gdHMuU3ludGF4S2luZC5JbXBvcnREZWNsYXJhdGlvbiAmJiBjaGlsZC5wb3MgPj0gY2xpZW50RGF0YVN0YXJ0KSB7XG4gICAgICBjb25zdCB0ZXh0ID0gY2hpbGQuZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgY2hpbGQuZm9yRWFjaENoaWxkKGNoaWxkID0+IHtcbiAgICAgICAgaWYgKGNoaWxkLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuU3RyaW5nTGl0ZXJhbCkge1xuICAgICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgY2xpZW50IGltcG9ydHMgbmVlZGVkIGZvciBwYXRoIHJlcGxhY2VtZW50IHRvIGJlIGFic29sdXRlXG4gICAgICAgICAgY29uc3QgdGV4dCA9IGNoaWxkLmdldFRleHQoc291cmNlKTtcbiAgICAgICAgICBjb25zdCBpbXBvcnRQYXRoID0gdGV4dC5yZXBsYWNlKC9bXFxcIlxcJ10vZywgJycpO1xuICAgICAgICAgIGNvbnN0IGlzUmVsYXRpdmVJbXBvcnQgPSBpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoJy4nKSB8fCBpbXBvcnRQYXRoLnN0YXJ0c1dpdGgoJy8nKTtcbiAgICAgICAgICBpZiAoIWlzUmVsYXRpdmVJbXBvcnQpIHJldHVybjtcbiAgICAgICAgICBjbGllbnRJbXBvcnRzVG9SZXBsYWNlLnB1c2goe1xuICAgICAgICAgICAgb2xkOiBpbXBvcnRQYXRoLFxuICAgICAgICAgICAgbmV3OiBwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHBhdGhOYW1lKSwgaW1wb3J0UGF0aCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY2xpZW50SW1wb3J0c1RvSG9pc3QucHVzaCh0ZXh0KTtcbiAgICB9XG4gIH0pO1xuICBsZXQgY2xpZW50Q29udGVudCA9ICFpc05hTihjbGllbnREYXRhU3RhcnQpID8gY29udGVudC5zbGljZShjbGllbnREYXRhU3RhcnQpIDogJyc7XG4gIGZvciAoY29uc3QgY2xpZW50SW1wb3J0IG9mIGNsaWVudEltcG9ydHNUb1JlcGxhY2UpIHtcbiAgICBjbGllbnRDb250ZW50ID0gY2xpZW50Q29udGVudC5yZXBsYWNlKGNsaWVudEltcG9ydC5vbGQsIGNsaWVudEltcG9ydC5uZXcpO1xuICB9XG4gIHJldHVybiB7XG4gICAgY29udGVudDogIWlzTmFOKHRvUmVtb3ZlRnJvbSkgP1xuICAgICAgY2xpZW50SW1wb3J0c1RvSG9pc3Quam9pbignXFxuJykgKyBjb250ZW50LnNsaWNlKDAsIHRvUmVtb3ZlRnJvbSkgOlxuICAgICAgY29udGVudCxcbiAgICBjbGllbnRDb250ZW50LFxuICAgIGZ1bGxDb250ZW50OiBjb250ZW50LFxuICAgIHRvUmVtb3ZlRnJvbSxcbiAgICBjbGllbnREYXRhU3RhcnQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFJlY3Vyc2l2ZUZyb20oXG4gIG5vZGU6IHRzLk5vZGUsIGluZGVudExldmVsOiBudW1iZXIsIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGVcbikge1xuICBjb25zdCBpbmRlbnRhdGlvbiA9ICctJy5yZXBlYXQoaW5kZW50TGV2ZWwpO1xuICBjb25zdCBzeW50YXhLaW5kID0gdHMuU3ludGF4S2luZFtub2RlLmtpbmRdO1xuICBjb25zdCBub2RlVGV4dCA9IG5vZGUuZ2V0VGV4dChzb3VyY2VGaWxlKTtcbiAgY29uc29sZS5sb2coYCR7aW5kZW50YXRpb259JHtzeW50YXhLaW5kfTogJHtub2RlVGV4dH1gKTtcblxuICBub2RlLmZvckVhY2hDaGlsZChjaGlsZCA9PlxuICAgIHByaW50UmVjdXJzaXZlRnJvbShjaGlsZCwgaW5kZW50TGV2ZWwgKyAxLCBzb3VyY2VGaWxlKVxuICApO1xufVxuIiwgImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHJlcXVpcmUgZnJvbSAnLi9yZXF1aXJlJztcbmltcG9ydCB7IFhQaW5lQ29uZmlnIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5jb25zdCByb290RGlyID0gcHJvY2Vzcy5jd2QoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb290KHBhdGhOYW1lPzogc3RyaW5nKSB7XG4gIGlmICghcGF0aE5hbWUpIHJldHVybiByb290RGlyO1xuICByZXR1cm4gcGF0aC5qb2luKHJvb3REaXIsIHBhdGhOYW1lKTtcbn1cblxuY29uc3QgdXNlckNvbmZpZyA9IHJlcXVpcmUocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICcuL3hwaW5lLmNvbmZpZy5tanMnKSkuZGVmYXVsdDtcblxuY29uc3QgY29uZmlnRGVmYXVsdHMgPSB7XG4gIHJvb3REaXI6IGZyb21Sb290KCksXG4gIHNyY0RpcjogZnJvbVJvb3QoJy4vc3JjJyksXG4gIGRpc3REaXI6IGZyb21Sb290KCcuL2Rpc3QnKSxcbiAgcGFja2FnZUpzb25QYXRoOiBmcm9tUm9vdCgncGFja2FnZS5qc29uJyksXG4gIC8vIFdlIG5lZWQgdG8gdXNlIGdldHRlcnMgaGVyZSBpbiB0aGUgZXZlbnQgc29tZW9uZSB3YW50cyB0byBjaGFuZ2UgZm9sZGVycywgc3VjaCBhcyB0aGUgZGlzdCBmb2xkZXJcbiAgZ2V0IGRpc3RQdWJsaWNEaXIoKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmRpc3REaXIsICcuL3B1YmxpYycpO1xuICB9LFxuICBnZXQgZGlzdFB1YmxpY1NjcmlwdHNEaXIoKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmRpc3RQdWJsaWNEaXIsICcuL3NjcmlwdHMnKTtcbiAgfSxcbiAgZ2V0IGRpc3RUZW1wRm9sZGVyKCkge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXN0RGlyLCAnLi90ZW1wJyk7XG4gIH0sXG4gIGdldCBjbGllbnRKU0J1bmRsZVBhdGgoKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmRpc3RQdWJsaWNTY3JpcHRzRGlyLCAnLi9hcHAuanMnKTtcbiAgfSxcbiAgZ2V0IGFscGluZURhdGFQYXRoKCkge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXN0VGVtcEZvbGRlciwgJy4vYWxwaW5lLWRhdGEudHMnKTtcbiAgfSxcbiAgZ2V0IHNlcnZlckRpc3REaXIoKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmRpc3REaXIsICcuL3NlcnZlcicpO1xuICB9LFxuICBnZXQgc2VydmVyRGlzdEFwcFBhdGgoKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLnNlcnZlckRpc3REaXIsICcuL2FwcC5qcycpO1xuICB9LFxuICAvLyBJbXBvcnRhbnQgZGlycy9wYXRoc1xuICBnZXQgcGFnZXNEaXIoKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLnNyY0RpciwgJy4vcGFnZXMnKTtcbiAgfSxcbiAgZ2V0IHB1YmxpY0RpcigpIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuc3JjRGlyLCAnLi9wdWJsaWMnKTtcbiAgfSxcbiAgZ2V0IHNlcnZlckRpcigpIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuc3JjRGlyLCAnLi9zZXJ2ZXInKTtcbiAgfSxcbiAgZ2V0IHJ1bkRpcigpIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuc2VydmVyRGlyLCAnLi9ydW4nKTtcbiAgfSxcbiAgZ2V0IHNlcnZlckFwcFBhdGgoKSB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLnNlcnZlckRpciwgJy4vYXBwLnRzJyk7XG4gIH0sXG4gIGdldCBnbG9iYWxDU1NGaWxlKCkge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5wdWJsaWNEaXIsICcuL3N0eWxlcy9nbG9iYWwuY3NzJyk7XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgY29uZmlnOiBYUGluZUNvbmZpZyA9IHtcbiAgLi4uY29uZmlnRGVmYXVsdHMsXG4gIC4uLnVzZXJDb25maWcsXG59OyIsICJpbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbW9kdWxlJztcblxuY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcblxuZXhwb3J0IGRlZmF1bHQgcmVxdWlyZTsiLCAiaW1wb3J0IGRvdGVudiBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuL2dldC1jb25maWcnO1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBFbnYoKSB7XG4gIGRvdGVudi5jb25maWcoeyBwYXRoOiBwYXRoLmpvaW4oY29uZmlnLnJvb3REaXIsIGAuLy5lbnYuJHtwcm9jZXNzLmVudi5TVEFHRSB8fCAnZGV2J31gKSx9KTtcbn1cbiIsICIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCB7IHJ1bkRldlNlcnZlciB9IGZyb20gJy4uL3J1bkRldlNlcnZlcic7XG5cbnJ1bkRldlNlcnZlcigpOyJdLAogICJtYXBwaW5ncyI6ICI7OztBQUFBLE9BQU8sZUFBZTtBQUN0QixPQUFPLFVBQVU7QUFDakIsT0FBTyxhQUFhO0FBQ3BCLE9BQU8sa0JBQWtCO0FBQ3pCLE9BQU8sY0FBYzs7O0FDSnJCLE9BQU9BLFdBQVU7QUFDakIsT0FBT0MsU0FB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QU8sT0FBT0EsVUFBUztBQUN2QyxVQUFNLHFCQUFzQkEsTUFBSyxXQUFXLE9BQU8sU0FBUyxLQUFLLENBQUNBLE1BQUssV0FBVyxPQUFPLE1BQU0sS0FDN0YsQ0FBQyxPQUFPLFFBQVEsRUFBRSxTQUFTLEtBQUssS0FBS0EsTUFBSyxXQUFXLE9BQU8sUUFBUTtBQUN0RSxRQUFJLG9CQUFvQjtBQUV0QixnQkFBVSxPQUFPLE1BQU07QUFDdkIsWUFBTSxTQUFTLElBQUk7QUFDbkIsWUFBTUMsZUFBYyxNQUFNLE9BQU8sT0FBTyxvQkFBb0IsVUFBVSxLQUFLLElBQUksQ0FBQztBQUNoRixrQkFBWSxNQUFNQSxhQUFZLFFBQVE7QUFDdEM7QUFBQSxJQUNGO0FBQ0EsVUFBTSxTQUFTLElBQUk7QUFDbkIsbUJBQWUsS0FBSyxTQUFTO0FBQUEsRUFDL0IsQ0FBQztBQUdELFFBQU0sUUFBUSxRQUFRO0FBQ3RCLFFBQU0sV0FBVyxLQUFLLGFBQWEsS0FBSztBQUN4QyxZQUFVLE9BQU8sUUFBUTtBQUFBLEVBQ3pCLE1BQU0sdUJBQXVCLGFBQWE7QUFBQSxFQUFFO0FBQUM7QUFDN0MsUUFBTSxpQkFBaUIsSUFBSSxlQUFlO0FBRzFDLFFBQU0sR0FBRyxlQUFlLFNBQVUsSUFBSTtBQUNwQyxtQkFBZSxtQkFBbUI7QUFDbEMsbUJBQWUsR0FBRyxXQUFXLE1BQU07QUFDakMsU0FBRyxLQUFLLGdCQUFnQjtBQUFBLElBQzFCLENBQUM7QUFBQSxFQUNILENBQUM7QUFFRCxRQUFNLFNBQVM7QUFDZixXQUFTLE9BQU8sTUFBTTtBQUN0QixXQUFTLEdBQUcsYUFBYSxNQUFNO0FBQzdCLFlBQVEsS0FBSyxnQ0FBZ0MsTUFBTSxFQUFFO0FBQUEsRUFDdkQsQ0FBQztBQUNIOzs7QU16REEsYUFBYTsiLAogICJuYW1lcyI6IFsicGF0aCIsICJmcyIsICJ0cyIsICJjaGlsZCIsICJ0ZXh0IiwgInBhdGgiLCAicmVxdWlyZSIsICJwYXRoIiwgImZzIiwgImJ1aWxkIiwgInBhdGgiLCAidHMiLCAicGF0aCIsICJwYXRoIiwgInBhdGgiLCAicGF0aCIsICJzdGFydFNlcnZlciJdCn0K
@@ -7,4 +7,3 @@ socket.addEventListener("message", async (msg) => {
7
7
  window.location.reload();
8
8
  }
9
9
  });
10
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3N0YXRpYy9kZXYtc2VydmVyLm1qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiY29uc3Qgc29ja2V0UHJvdG9jb2wgPSAnd3M6JztcbmNvbnN0IGVjaG9Tb2NrZXRVcmwgPSBzb2NrZXRQcm90b2NvbCArICcvLycgKyB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgKyAnOjMwMDEvZGV2LXNlcnZlci8nO1xuY29uc3Qgc29ja2V0ID0gbmV3IFdlYlNvY2tldChlY2hvU29ja2V0VXJsKTtcblxuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBhc3luYyAobXNnKSA9PiB7XG4gIGlmIChtc2cuZGF0YSA9PT0gJ3JlZnJlc2g6Y2xpZW50Jykge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgfVxufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsSUFBTSxpQkFBaUI7QUFDdkIsSUFBTSxnQkFBZ0IsaUJBQWlCLE9BQU8sT0FBTyxTQUFTLFdBQVc7QUFDekUsSUFBTSxTQUFTLElBQUksVUFBVSxhQUFhO0FBRTFDLE9BQU8saUJBQWlCLFdBQVcsT0FBTyxRQUFRO0FBQ2hELE1BQUksSUFBSSxTQUFTLGtCQUFrQjtBQUNqQyxXQUFPLFNBQVMsT0FBTztBQUFBLEVBQ3pCO0FBQ0YsQ0FBQzsiLAogICJuYW1lcyI6IFtdCn0K
@@ -149,4 +149,3 @@ function isExternalURL(url) {
149
149
  }
150
150
  window.addEventListener("DOMContentLoaded", replaceDocumentContentsWithLinkResponse);
151
151
  window.addEventListener("popstate", handleBackButton);
152
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3N0YXRpYy9zcGEubWpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBFbmFibGVzIFNQQSBsaWtlIGJlaGF2aW9yIGZvciBsaW5rc1xuXG5hc3luYyBmdW5jdGlvbiByZXBsYWNlRG9jdW1lbnRDb250ZW50c1dpdGhMaW5rUmVzcG9uc2UoKSB7XG4gIGNvbnN0IGxpbmtzID0gWy4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXNwYV0nKV07XG4gIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB1cGRhdGVQYWdlT25MaW5rQ2xpY2spO1xuICB9XG5cbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlUGFnZU9uTGlua0NsaWNrKGUpIHtcbiAgY29uc3QgdGFyZ2V0SHJlZiA9IGU/LnRhcmdldD8uZ2V0QXR0cmlidXRlKCdocmVmJyk7XG4gIGlmICghdGFyZ2V0SHJlZikgcmV0dXJuO1xuICBpZiAoaXNFeHRlcm5hbFVSTCh0YXJnZXRIcmVmKSAmJiAhZT8udGFyZ2V0Py5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3BhLWNyb3Nzb3JpZ2luJykpIHJldHVybjtcbiAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB0cnkge1xuICAgIGF3YWl0IGdldE5ld1BhZ2VDb250ZW50KHRhcmdldEhyZWYpO1xuICAgIGlmICh0YXJnZXRIcmVmID09PSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpIHJldHVybjtcbiAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdsaW5rLWNsaWNrJyxcbiAgICAgICAgdGFyZ2V0SHJlZixcbiAgICAgIH0sXG4gICAgICAnJyxcbiAgICAgIHRhcmdldEhyZWZcbiAgICApO1xuICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdzcGE6dXBkYXRlUGFnZVVSTCcsIHtcbiAgICAgIGRldGFpbDoge1xuICAgICAgICBocmVmOiB0YXJnZXRIcmVmLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXROZXdQYWdlQ29udGVudChocmVmKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goaHJlZik7XG4gICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgIGNvbnN0IGRvbSA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcodGV4dCwgJ3RleHQvaHRtbCcpO1xuICAgIGRpZmZIZWFkKGRvbSk7XG4gICAgY29uc3QgbmV3U2NyaXB0cyA9IHJlbW92ZUJvZHlTY3JpcHRzKGRvbSk7XG4gICAgY29uc3QgY2xvbmVkUGVyc2lzdGVudE5vZGVzID0gZ2V0UGVyc2lzdGVudE5vZGVzRnJvbURvY3VtZW50KGRvbSk7XG4gICAgY29uc3QgYm9keSA9IGRvbS5ib2R5LmlubmVySFRNTDtcbiAgICBkb2N1bWVudC5ib2R5LmlubmVySFRNTCA9IGJvZHk7XG4gICAgZm9yIChjb25zdCBjbG9uZWROb2RlIG9mIGNsb25lZFBlcnNpc3RlbnROb2Rlcykge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgY29uc3QgbmV3Tm9kZSA9IGRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvcihgW2RhdGEtcGVyc2lzdGVudD1cIiR7Y2xvbmVkTm9kZT8uZ2V0QXR0cmlidXRlKCdkYXRhLXBlcnNpc3RlbnQnKX1cIl1gKTtcbiAgICAgIG5ld05vZGUucmVwbGFjZVdpdGgoY2xvbmVkTm9kZSk7XG4gICAgfVxuICAgIHJlcGxhY2VBdHRyaWJ1dGVzT25Eb2N1bWVudEJvZHkoZG9tKTtcbiAgICByZXBsYWNlRG9jdW1lbnRDb250ZW50c1dpdGhMaW5rUmVzcG9uc2UoKTtcbiAgICBmb3IgKGNvbnN0IHNjcmlwdCBvZiBuZXdTY3JpcHRzKSBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgLy8gU2VuZCBhbiBldmVudFxuICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdzcGE6dXBkYXRlUGFnZUNvbnRlbnQnLCB7XG4gICAgICBkZXRhaWw6IHtcbiAgICAgICAgaHJlZixcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgd2luZG93LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgY29uc29sZS5lcnJvcignRXJyb3IgZ2V0dGluZyBsaW5rJywgaHJlZik7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlmZkhlYWQoZG9tKSB7XG4gIGNvbnN0IGRvbUhlYWRDaGlsZHJlbiA9IFsuLi5kb20uaGVhZC5jaGlsZHJlbl07XG4gIGNvbnN0IGN1cnJlbnRIZWFkQ2hpbGRyZW4gPSBbLi4uZG9jdW1lbnQuaGVhZC5jaGlsZHJlbl07XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBjaGlsZHJlblRvQWRkOiBbXSxcbiAgICBjaGlsZHJlblRvUmVtb3ZlOiBbXSxcbiAgfTtcbiAgZm9yIChjb25zdCBkb21DaGlsZCBvZiBkb21IZWFkQ2hpbGRyZW4pIHtcbiAgICBjb25zdCBmb3VuZEluQ3VycmVudENoaWxkcmVuID0gY3VycmVudEhlYWRDaGlsZHJlbi5maW5kKGNoaWxkID0+IGNoaWxkLm91dGVySFRNTCA9PT0gZG9tQ2hpbGQub3V0ZXJIVE1MKTtcbiAgICBpZiAoIWZvdW5kSW5DdXJyZW50Q2hpbGRyZW4pIHJlc3VsdC5jaGlsZHJlblRvQWRkLnB1c2goZG9tQ2hpbGQpO1xuICB9XG4gIGZvciAoY29uc3QgY3VycmVudENoaWxkIG9mIGN1cnJlbnRIZWFkQ2hpbGRyZW4pIHtcbiAgICBjb25zdCBmb3VuZEluRG9tQ2hpbGRyZW4gPSBkb21IZWFkQ2hpbGRyZW4uZmluZChjaGlsZCA9PiBjaGlsZC5vdXRlckhUTUwgPT09IGN1cnJlbnRDaGlsZC5vdXRlckhUTUwpO1xuICAgIGlmICghZm91bmRJbkRvbUNoaWxkcmVuKSByZXN1bHQuY2hpbGRyZW5Ub1JlbW92ZS5wdXNoKGN1cnJlbnRDaGlsZCk7XG4gIH1cbiAgYXBwbHlIZWFkRGlmZnNUb0RvY3VtZW50KHJlc3VsdCk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5SGVhZERpZmZzVG9Eb2N1bWVudChkaWZmKSB7XG4gIGZvciAoY29uc3QgY2hpbGQgb2YgZGlmZi5jaGlsZHJlblRvUmVtb3ZlKSB7XG4gICAgLy8gUmVtb3ZlIGZyb20gaGVhZFxuICAgIGRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICB9XG4gIGZvciAoY29uc3QgY2hpbGQgb2YgZGlmZi5jaGlsZHJlblRvQWRkKSB7XG4gICAgLy8gSGFuZGxlIHNjcmlwdCB0YWdzXG4gICAgaWYgKGNoaWxkPy5ub2RlTmFtZT8udG9Mb3dlckNhc2UoKSA9PSAnc2NyaXB0Jykge1xuICAgICAgY29uc3Qgc2NyaXB0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgcG9ydEF0dHJpYnV0ZXNUb0VsZW1lbnQoY2hpbGQsIHNjcmlwdEVsZW1lbnQpO1xuICAgICAgc2NyaXB0RWxlbWVudC5pbm5lckhUTUwgPSBjaGlsZC5pbm5lckhUTUw7XG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdEVsZW1lbnQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIEFkZCB0byB0aGUgaGVhZFxuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUJvZHlTY3JpcHRzKGRvbSkge1xuICBjb25zdCBzY3JpcHRzID0gWy4uLmRvbS5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpXTtcbiAgY29uc3QgbmV3RWxlbWVudHMgPSBbXTtcbiAgZm9yIChjb25zdCBzY3JpcHQgb2Ygc2NyaXB0cykge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICBwb3J0QXR0cmlidXRlc1RvRWxlbWVudChzY3JpcHQsIGVsZW1lbnQpO1xuICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gc2NyaXB0LmlubmVySFRNTDtcbiAgICBkb20uYm9keS5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgIG5ld0VsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gIH1cbiAgcmV0dXJuIG5ld0VsZW1lbnRzO1xufVxuXG5mdW5jdGlvbiBwb3J0QXR0cmlidXRlc1RvRWxlbWVudChvbGRFbCwgbmV3RWwpIHtcbiAgZm9yIChjb25zdCBhdHRyaWJ1dGUgb2Ygb2xkRWwuYXR0cmlidXRlcykge1xuICAgIG5ld0VsLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUubmFtZSwgYXR0cmlidXRlLm5vZGVWYWx1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UGVyc2lzdGVudE5vZGVzRnJvbURvY3VtZW50KGRvbSkge1xuICAvLyBGaW5kIHBlcnNpc3RlbnQgbm9kZXNcbiAgY29uc3QgcGVyc2lzdGVudE5vZGVzRnJvbURvbSA9IFsuLi5kb20ucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcGVyc2lzdGVudF0nKV0ubWFwKGVsID0+IGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1wZXJzaXN0ZW50JykpO1xuICBjb25zdCBwZXJzaXN0ZW50Tm9kZXNGcm9tQm9keSA9IFsuLi5kb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXBlcnNpc3RlbnRdJyldO1xuICAvLyBDcm9zcyBtYXRjaCB0aGUgcGVyc2lzdGVudCBub2RlcyBiZXR3ZWVuIGN1cnJlbnQgcGFnZSBhbmQgbmV3IHBhZ2UgdG8gZmluZCB2YWxpZCBvbmVzXG4gIGNvbnN0IHZhbGlkUGVyc2lzdGVudE5vZGVzID0gcGVyc2lzdGVudE5vZGVzRnJvbUJvZHkuZmlsdGVyKGVsID0+IHtcbiAgICByZXR1cm4gcGVyc2lzdGVudE5vZGVzRnJvbURvbS5pbmNsdWRlcyhlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcGVyc2lzdGVudCcpKTtcbiAgfSk7XG4gIC8vIENsb25lXG4gIHJldHVybiB2YWxpZFBlcnNpc3RlbnROb2Rlcy5tYXAoZWwgPT4gZWwuY2xvbmVOb2RlKHRydWUpKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZUF0dHJpYnV0ZXNPbkRvY3VtZW50Qm9keShkb20pIHtcbiAgd2hpbGUgKGRvY3VtZW50LmJvZHkuYXR0cmlidXRlcy5sZW5ndGggPiAwKSB7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVBdHRyaWJ1dGUoZG9jdW1lbnQuYm9keS5hdHRyaWJ1dGVzWzBdLm5hbWUpO1xuICB9XG4gIC8vIFNldCBhdHRyaWJ1dGVzIG9uIHRoZSBib2R5XG4gIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGRvbS5ib2R5LmF0dHJpYnV0ZXMpIHtcbiAgICBkb2N1bWVudC5ib2R5LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUubmFtZSwgYXR0cmlidXRlLm5vZGVWYWx1ZSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlQmFja0J1dHRvbigpIHtcbiAgYXdhaXQgZ2V0TmV3UGFnZUNvbnRlbnQod2luZG93Lmhpc3Rvcnkuc3RhdGU/LnRhcmdldEhyZWYgfHwgd2luZG93LmxvY2F0aW9uLmhyZWYpO1xufVxuXG5mdW5jdGlvbiBpc1JlbGF0aXZlVVJMKHVybCkge1xuICBpZiAodHlwZW9mIHVybCAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICBuZXcgVVJMKHVybCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAodXJsPy5zdGFydHNXaXRoKCcvLycpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNFeHRlcm5hbFVSTCh1cmwpIHtcbiAgaWYgKGlzUmVsYXRpdmVVUkwodXJsKSkgcmV0dXJuIGZhbHNlO1xuICB0cnkge1xuICAgIGNvbnN0IGNvbXB1dGVkVVJMID0gbmV3IFVSTCh1cmwpO1xuICAgIHJldHVybiBjb21wdXRlZFVSTD8ub3JpZ2luICE9PSB3aW5kb3cubG9jYXRpb24/Lm9yaWdpbjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlOyAvLyBOb3QgYSBVUkxcbiAgfVxufVxuXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIHJlcGxhY2VEb2N1bWVudENvbnRlbnRzV2l0aExpbmtSZXNwb25zZSk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9wc3RhdGUnLCBoYW5kbGVCYWNrQnV0dG9uKTtcblxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUVBLGVBQWUsMENBQTBDO0FBQ3ZELFFBQU0sUUFBUSxDQUFDLEdBQUcsU0FBUyxpQkFBaUIsWUFBWSxDQUFDO0FBQ3pELGFBQVcsUUFBUSxPQUFPO0FBQ3hCLFNBQUssaUJBQWlCLFNBQVMscUJBQXFCO0FBQUEsRUFDdEQ7QUFFRjtBQUVBLGVBQWUsc0JBQXNCLEdBQUc7QUFDdEMsUUFBTSxhQUFhLEdBQUcsUUFBUSxhQUFhLE1BQU07QUFDakQsTUFBSSxDQUFDLFdBQVk7QUFDakIsTUFBSSxjQUFjLFVBQVUsS0FBSyxDQUFDLEdBQUcsUUFBUSxhQUFhLHNCQUFzQixFQUFHO0FBQ25GLElBQUUsZUFBZTtBQUNqQixNQUFJO0FBQ0YsVUFBTSxrQkFBa0IsVUFBVTtBQUNsQyxRQUFJLGVBQWUsT0FBTyxTQUFTLFNBQVU7QUFDN0MsV0FBTyxRQUFRO0FBQUEsTUFDYjtBQUFBLFFBQ0UsTUFBTTtBQUFBLFFBQ047QUFBQSxNQUNGO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQ0EsVUFBTSxRQUFRLElBQUksWUFBWSxxQkFBcUI7QUFBQSxNQUNqRCxRQUFRO0FBQUEsUUFDTixNQUFNO0FBQUEsTUFDUjtBQUFBLElBQ0YsQ0FBQztBQUNELFdBQU8sY0FBYyxLQUFLO0FBQUEsRUFDNUIsU0FBUyxLQUFLO0FBQ1osWUFBUSxNQUFNLEdBQUc7QUFBQSxFQUNuQjtBQUNGO0FBRUEsZUFBZSxrQkFBa0IsTUFBTTtBQUNyQyxNQUFJO0FBQ0YsVUFBTSxNQUFNLE1BQU0sTUFBTSxJQUFJO0FBQzVCLFVBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixVQUFNLFNBQVMsSUFBSSxVQUFVO0FBQzdCLFVBQU0sTUFBTSxPQUFPLGdCQUFnQixNQUFNLFdBQVc7QUFDcEQsYUFBUyxHQUFHO0FBQ1osVUFBTSxhQUFhLGtCQUFrQixHQUFHO0FBQ3hDLFVBQU0sd0JBQXdCLCtCQUErQixHQUFHO0FBQ2hFLFVBQU0sT0FBTyxJQUFJLEtBQUs7QUFDdEIsYUFBUyxLQUFLLFlBQVk7QUFDMUIsZUFBVyxjQUFjLHVCQUF1QjtBQUU5QyxZQUFNLFVBQVUsU0FBUyxLQUFLLGNBQWMscUJBQXFCLFlBQVksYUFBYSxpQkFBaUIsQ0FBQyxJQUFJO0FBQ2hILGNBQVEsWUFBWSxVQUFVO0FBQUEsSUFDaEM7QUFDQSxvQ0FBZ0MsR0FBRztBQUNuQyw0Q0FBd0M7QUFDeEMsZUFBVyxVQUFVLFdBQVksVUFBUyxLQUFLLFlBQVksTUFBTTtBQUVqRSxVQUFNLFFBQVEsSUFBSSxZQUFZLHlCQUF5QjtBQUFBLE1BQ3JELFFBQVE7QUFBQSxRQUNOO0FBQUEsTUFDRjtBQUFBLElBQ0YsQ0FBQztBQUNELFdBQU8sY0FBYyxLQUFLO0FBQUEsRUFDNUIsU0FBUyxLQUFLO0FBQ1osWUFBUSxNQUFNLEdBQUc7QUFDakIsWUFBUSxNQUFNLHNCQUFzQixJQUFJO0FBQUEsRUFDMUM7QUFDRjtBQUVBLFNBQVMsU0FBUyxLQUFLO0FBQ3JCLFFBQU0sa0JBQWtCLENBQUMsR0FBRyxJQUFJLEtBQUssUUFBUTtBQUM3QyxRQUFNLHNCQUFzQixDQUFDLEdBQUcsU0FBUyxLQUFLLFFBQVE7QUFDdEQsUUFBTSxTQUFTO0FBQUEsSUFDYixlQUFlLENBQUM7QUFBQSxJQUNoQixrQkFBa0IsQ0FBQztBQUFBLEVBQ3JCO0FBQ0EsYUFBVyxZQUFZLGlCQUFpQjtBQUN0QyxVQUFNLHlCQUF5QixvQkFBb0IsS0FBSyxXQUFTLE1BQU0sY0FBYyxTQUFTLFNBQVM7QUFDdkcsUUFBSSxDQUFDLHVCQUF3QixRQUFPLGNBQWMsS0FBSyxRQUFRO0FBQUEsRUFDakU7QUFDQSxhQUFXLGdCQUFnQixxQkFBcUI7QUFDOUMsVUFBTSxxQkFBcUIsZ0JBQWdCLEtBQUssV0FBUyxNQUFNLGNBQWMsYUFBYSxTQUFTO0FBQ25HLFFBQUksQ0FBQyxtQkFBb0IsUUFBTyxpQkFBaUIsS0FBSyxZQUFZO0FBQUEsRUFDcEU7QUFDQSwyQkFBeUIsTUFBTTtBQUNqQztBQUVBLFNBQVMseUJBQXlCLE1BQU07QUFDdEMsYUFBVyxTQUFTLEtBQUssa0JBQWtCO0FBRXpDLGFBQVMsS0FBSyxZQUFZLEtBQUs7QUFBQSxFQUNqQztBQUNBLGFBQVcsU0FBUyxLQUFLLGVBQWU7QUFFdEMsUUFBSSxPQUFPLFVBQVUsWUFBWSxLQUFLLFVBQVU7QUFDOUMsWUFBTSxnQkFBZ0IsU0FBUyxjQUFjLFFBQVE7QUFDckQsOEJBQXdCLE9BQU8sYUFBYTtBQUM1QyxvQkFBYyxZQUFZLE1BQU07QUFDaEMsZUFBUyxLQUFLLFlBQVksYUFBYTtBQUN2QztBQUFBLElBQ0Y7QUFFQSxhQUFTLEtBQUssWUFBWSxLQUFLO0FBQUEsRUFDakM7QUFDRjtBQUVBLFNBQVMsa0JBQWtCLEtBQUs7QUFDOUIsUUFBTSxVQUFVLENBQUMsR0FBRyxJQUFJLEtBQUssaUJBQWlCLFFBQVEsQ0FBQztBQUN2RCxRQUFNLGNBQWMsQ0FBQztBQUNyQixhQUFXLFVBQVUsU0FBUztBQUM1QixVQUFNLFVBQVUsU0FBUyxjQUFjLFFBQVE7QUFDL0MsNEJBQXdCLFFBQVEsT0FBTztBQUN2QyxZQUFRLFlBQVksT0FBTztBQUMzQixRQUFJLEtBQUssWUFBWSxNQUFNO0FBQzNCLGdCQUFZLEtBQUssT0FBTztBQUFBLEVBQzFCO0FBQ0EsU0FBTztBQUNUO0FBRUEsU0FBUyx3QkFBd0IsT0FBTyxPQUFPO0FBQzdDLGFBQVcsYUFBYSxNQUFNLFlBQVk7QUFDeEMsVUFBTSxhQUFhLFVBQVUsTUFBTSxVQUFVLFNBQVM7QUFBQSxFQUN4RDtBQUNGO0FBRUEsU0FBUywrQkFBK0IsS0FBSztBQUUzQyxRQUFNLHlCQUF5QixDQUFDLEdBQUcsSUFBSSxpQkFBaUIsbUJBQW1CLENBQUMsRUFBRSxJQUFJLFFBQU0sR0FBRyxhQUFhLGlCQUFpQixDQUFDO0FBQzFILFFBQU0sMEJBQTBCLENBQUMsR0FBRyxTQUFTLEtBQUssaUJBQWlCLG1CQUFtQixDQUFDO0FBRXZGLFFBQU0sdUJBQXVCLHdCQUF3QixPQUFPLFFBQU07QUFDaEUsV0FBTyx1QkFBdUIsU0FBUyxHQUFHLGFBQWEsaUJBQWlCLENBQUM7QUFBQSxFQUMzRSxDQUFDO0FBRUQsU0FBTyxxQkFBcUIsSUFBSSxRQUFNLEdBQUcsVUFBVSxJQUFJLENBQUM7QUFDMUQ7QUFFQSxTQUFTLGdDQUFnQyxLQUFLO0FBQzVDLFNBQU8sU0FBUyxLQUFLLFdBQVcsU0FBUyxHQUFHO0FBQzFDLGFBQVMsS0FBSyxnQkFBZ0IsU0FBUyxLQUFLLFdBQVcsQ0FBQyxFQUFFLElBQUk7QUFBQSxFQUNoRTtBQUVBLGFBQVcsYUFBYSxJQUFJLEtBQUssWUFBWTtBQUMzQyxhQUFTLEtBQUssYUFBYSxVQUFVLE1BQU0sVUFBVSxTQUFTO0FBQUEsRUFDaEU7QUFDRjtBQUVBLGVBQWUsbUJBQW1CO0FBQ2hDLFFBQU0sa0JBQWtCLE9BQU8sUUFBUSxPQUFPLGNBQWMsT0FBTyxTQUFTLElBQUk7QUFDbEY7QUFFQSxTQUFTLGNBQWMsS0FBSztBQUMxQixNQUFJLE9BQU8sUUFBUSxTQUFVLFFBQU87QUFDcEMsTUFBSTtBQUNGLFFBQUksSUFBSSxHQUFHO0FBQ1gsV0FBTztBQUFBLEVBQ1QsU0FBUyxLQUFLO0FBQ1osUUFBSSxLQUFLLFdBQVcsSUFBSSxFQUFHLFFBQU87QUFDbEMsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQUVBLFNBQVMsY0FBYyxLQUFLO0FBQzFCLE1BQUksY0FBYyxHQUFHLEVBQUcsUUFBTztBQUMvQixNQUFJO0FBQ0YsVUFBTSxjQUFjLElBQUksSUFBSSxHQUFHO0FBQy9CLFdBQU8sYUFBYSxXQUFXLE9BQU8sVUFBVTtBQUFBLEVBQ2xELFFBQVE7QUFDTixXQUFPO0FBQUEsRUFDVDtBQUNGO0FBRUEsT0FBTyxpQkFBaUIsb0JBQW9CLHVDQUF1QztBQUNuRixPQUFPLGlCQUFpQixZQUFZLGdCQUFnQjsiLAogICJuYW1lcyI6IFtdCn0K
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xpine",
3
- "version": "0.0.5",
3
+ "version": "0.0.6",
4
4
  "main": "dist/index.js",
5
5
  "dependencies": {
6
6
  "@tailwindcss/postcss": "^4.0.8",
package/src/auth.ts DELETED
@@ -1,40 +0,0 @@
1
- import jsonwebtoken from 'jsonwebtoken';
2
- import { ServerRequest } from '../types';
3
- const { verify, sign, } = jsonwebtoken;
4
-
5
- export async function signUser(email: string, username: string) {
6
- return new Promise((resolve, reject) => {
7
- sign(
8
- {
9
- user: {
10
- email,
11
- username,
12
- },
13
- },
14
- // @ts-ignore
15
- process.env.JWT_PRIVATE_KEY,
16
- { expiresIn: '30d', },
17
- (err, token) => {
18
- if (err) reject(err);
19
- resolve(token);
20
- });
21
- });
22
- }
23
-
24
- export async function verifyUser(token: string): Promise<any> {
25
- return new Promise((resolve, reject) => {
26
- // @ts-ignore
27
- verify(token, process.env.JWT_PRIVATE_KEY, (err, authorizedData) => {
28
- if (err) reject(err);
29
- resolve(authorizedData);
30
- });
31
- });
32
- }
33
-
34
- export function getTokenFromRequest(req: ServerRequest) {
35
- // @ts-ignore
36
- const { authorization, } = req.headers;
37
- if (!authorization) return null;
38
- const token = authorization.split(' ').pop() || '';
39
- return token || null;
40
- }