country-flag-cli 0.0.18 → 0.0.19

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. package/dist/cli.js +1 -1
  2. package/package.json +6 -6
package/dist/cli.js CHANGED
@@ -68,4 +68,4 @@ PERFORMANCE OF THIS SOFTWARE.
68
68
  * https://github.com/felixge/node-stack-trace/
69
69
  * @license MIT
70
70
  */
71
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL2NvbW1hbmRlci9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHlwZXMvc3JjL2xvZ2xldmVsLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3R5cGVzL3NyYy9zZXNzaW9uLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3R5cGVzL3NyYy9zZXZlcml0eS50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90eXBlcy9zcmMvc3RhdHVzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3R5cGVzL3NyYy90cmFuc2FjdGlvbi50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90eXBlcy9zcmMvdHJhbnNwb3J0LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3R5cGVzL3NyYy9pbmRleC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9zcmMvYXN5bmMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL25vZGUudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL2dsb2JhbC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9zcmMvaXMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL2Jyb3dzZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL3BvbHlmaWxsLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL3NyYy9lcnJvci50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9zcmMvZHNuLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL3NyYy9sb2dnZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL21lbW8udHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL3N0YWNrdHJhY2UudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL3N0cmluZy50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9zcmMvb2JqZWN0LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL3NyYy9zdXBwb3J0cy50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9zcmMvaW5zdHJ1bWVudC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9zcmMvbWlzYy50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9zcmMvcGF0aC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9zcmMvc3luY3Byb21pc2UudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL3Byb21pc2VidWZmZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL3RpbWUudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL2luZGV4LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2h1Yi9zcmMvc2NvcGUudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvaHViL3NyYy9zZXNzaW9uLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2h1Yi9zcmMvaHViLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2h1Yi9zcmMvc2Vzc2lvbmZsdXNoZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvaHViL3NyYy9pbmRleC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9taW5pbWFsL3NyYy9pbmRleC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL3NyYy9hcGkudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9zcmMvaW50ZWdyYXRpb24udHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9zcmMvYmFzZWNsaWVudC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL3NyYy90cmFuc3BvcnRzL25vb3AudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9zcmMvYmFzZWJhY2tlbmQudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9zcmMvcmVxdWVzdC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL3NyYy9zZGsudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9zcmMvdmVyc2lvbi50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL3NyYy9pbnRlZ3JhdGlvbnMvZnVuY3Rpb250b3N0cmluZy50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL3NyYy9pbnRlZ3JhdGlvbnMvaW5ib3VuZGZpbHRlcnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9zcmMvaW50ZWdyYXRpb25zL2luZGV4LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2NvcmUvc3JjL2luZGV4LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9scnVfbWFwL2xydS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9ub2RlL3NyYy9zdGFja3RyYWNlLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L25vZGUvc3JjL3BhcnNlcnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvdmVyc2lvbi50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9ub2RlL3NyYy90cmFuc3BvcnRzL2Jhc2UvaW5kZXgudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21zL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvY29tbW9uLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvYnJvd3Nlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvaGFzLWZsYWcvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL3N1cHBvcnRzLWNvbG9yL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hZ2VudC1iYXNlL3NyYy9wcm9taXNpZnkudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2FnZW50LWJhc2Uvc3JjL2luZGV4LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9odHRwcy1wcm94eS1hZ2VudC9zcmMvcGFyc2UtcHJveHktcmVzcG9uc2UudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2h0dHBzLXByb3h5LWFnZW50L3NyYy9hZ2VudC50cyIsICIuLi9ub2RlX21vZHVsZXMvaHR0cHMtcHJveHktYWdlbnQvc3JjL2luZGV4LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L25vZGUvc3JjL3RyYW5zcG9ydHMvaHR0cC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9ub2RlL3NyYy90cmFuc3BvcnRzL2h0dHBzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L25vZGUvc3JjL3RyYW5zcG9ydHMvaW5kZXgudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvYmFja2VuZC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9ub2RlL3NyYy9jbGllbnQudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW50ZWdyYXRpb25zL2NvbnNvbGUudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW50ZWdyYXRpb25zL3V0aWxzL2h0dHAudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW50ZWdyYXRpb25zL2h0dHAudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW50ZWdyYXRpb25zL3V0aWxzL2Vycm9yaGFuZGxpbmcudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW50ZWdyYXRpb25zL29udW5jYXVnaHRleGNlcHRpb24udHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW50ZWdyYXRpb25zL29udW5oYW5kbGVkcmVqZWN0aW9uLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L25vZGUvc3JjL2ludGVncmF0aW9ucy9saW5rZWRlcnJvcnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW50ZWdyYXRpb25zL21vZHVsZXMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW50ZWdyYXRpb25zL2luZGV4LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L25vZGUvc3JjL3Nkay50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9ub2RlL3NyYy91dGlscy50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9zcGFuc3RhdHVzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL3V0aWxzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2Vycm9ycy50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9jb25zdGFudHMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHJhY2luZy9zcmMvc3Bhbi50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy90cmFuc2FjdGlvbi50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9pZGxldHJhbnNhY3Rpb24udHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHJhY2luZy9zcmMvaHViZXh0ZW5zaW9ucy50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9pbnRlZ3JhdGlvbnMvbm9kZS9leHByZXNzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2ludGVncmF0aW9ucy9ub2RlL3Bvc3RncmVzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2ludGVncmF0aW9ucy9ub2RlL215c3FsLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2ludGVncmF0aW9ucy9ub2RlL21vbmdvLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2Jyb3dzZXIvYmFja2dyb3VuZHRhYi50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9icm93c2VyL3dlYi12aXRhbHMvbGliL2JpbmRSZXBvcnRlci50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9icm93c2VyL3dlYi12aXRhbHMvbGliL2dlbmVyYXRlVW5pcXVlSUQudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHJhY2luZy9zcmMvYnJvd3Nlci93ZWItdml0YWxzL2xpYi9pbml0TWV0cmljLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2Jyb3dzZXIvd2ViLXZpdGFscy9saWIvb2JzZXJ2ZS50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9icm93c2VyL3dlYi12aXRhbHMvbGliL29uSGlkZGVuLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2Jyb3dzZXIvd2ViLXZpdGFscy9nZXRDTFMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHJhY2luZy9zcmMvYnJvd3Nlci93ZWItdml0YWxzL2xpYi9nZXRWaXNpYmlsaXR5V2F0Y2hlci50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9icm93c2VyL3dlYi12aXRhbHMvZ2V0RklELnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2Jyb3dzZXIvd2ViLXZpdGFscy9nZXRMQ1AudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHJhY2luZy9zcmMvYnJvd3Nlci9tZXRyaWNzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2Jyb3dzZXIvcmVxdWVzdC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9icm93c2VyL3JvdXRlci50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9icm93c2VyL2Jyb3dzZXJ0cmFjaW5nLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2Jyb3dzZXIvaW5kZXgudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHJhY2luZy9zcmMvaW50ZWdyYXRpb25zL2luZGV4LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2luZGV4LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9jb29raWUvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaGFuZGxlcnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW5kZXgudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvaW50ZWdyYXRpb25zL3NyYy9hbmd1bGFyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2ludGVncmF0aW9ucy9zcmMvY2FwdHVyZWNvbnNvbGUudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvaW50ZWdyYXRpb25zL3NyYy9kZWJ1Zy50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9pbnRlZ3JhdGlvbnMvc3JjL2RlZHVwZS50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9pbnRlZ3JhdGlvbnMvc3JjL2VtYmVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2ludGVncmF0aW9ucy9zcmMvZXh0cmFlcnJvcmRhdGEudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2xvY2FsZm9yYWdlL2Rpc3QvbG9jYWxmb3JhZ2UuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvaW50ZWdyYXRpb25zL3NyYy9vZmZsaW5lLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2ludGVncmF0aW9ucy9zcmMvcmVwb3J0aW5nb2JzZXJ2ZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvaW50ZWdyYXRpb25zL3NyYy9yZXdyaXRlZnJhbWVzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2ludGVncmF0aW9ucy9zcmMvc2Vzc2lvbnRpbWluZy50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9pbnRlZ3JhdGlvbnMvc3JjL3RyYW5zYWN0aW9uLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2ludGVncmF0aW9ucy9zcmMvdnVlLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2ludGVncmF0aW9ucy9zcmMvaW5kZXgudHMiLCAiLi4vc3JjL2NsaS50cyIsICIuLi9zcmMvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xudmFyIHNwYXduID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLnNwYXduO1xudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG52YXIgZGlybmFtZSA9IHBhdGguZGlybmFtZTtcbnZhciBiYXNlbmFtZSA9IHBhdGguYmFzZW5hbWU7XG52YXIgZnMgPSByZXF1aXJlKCdmcycpO1xuXG4vKipcbiAqIEluaGVyaXQgYENvbW1hbmRgIGZyb20gYEV2ZW50RW1pdHRlci5wcm90b3R5cGVgLlxuICovXG5cbnJlcXVpcmUoJ3V0aWwnKS5pbmhlcml0cyhDb21tYW5kLCBFdmVudEVtaXR0ZXIpO1xuXG4vKipcbiAqIEV4cG9zZSB0aGUgcm9vdCBjb21tYW5kLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IG5ldyBDb21tYW5kKCk7XG5cbi8qKlxuICogRXhwb3NlIGBDb21tYW5kYC5cbiAqL1xuXG5leHBvcnRzLkNvbW1hbmQgPSBDb21tYW5kO1xuXG4vKipcbiAqIEV4cG9zZSBgT3B0aW9uYC5cbiAqL1xuXG5leHBvcnRzLk9wdGlvbiA9IE9wdGlvbjtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBPcHRpb25gIHdpdGggdGhlIGdpdmVuIGBmbGFnc2AgYW5kIGBkZXNjcmlwdGlvbmAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZsYWdzXG4gKiBAcGFyYW0ge1N0cmluZ30gZGVzY3JpcHRpb25cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbikge1xuICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gIHRoaXMucmVxdWlyZWQgPSBmbGFncy5pbmRleE9mKCc8JykgPj0gMDtcbiAgdGhpcy5vcHRpb25hbCA9IGZsYWdzLmluZGV4T2YoJ1snKSA+PSAwO1xuICB0aGlzLmJvb2wgPSBmbGFncy5pbmRleE9mKCctbm8tJykgPT09IC0xO1xuICBmbGFncyA9IGZsYWdzLnNwbGl0KC9bICx8XSsvKTtcbiAgaWYgKGZsYWdzLmxlbmd0aCA+IDEgJiYgIS9eW1s8XS8udGVzdChmbGFnc1sxXSkpIHRoaXMuc2hvcnQgPSBmbGFncy5zaGlmdCgpO1xuICB0aGlzLmxvbmcgPSBmbGFncy5zaGlmdCgpO1xuICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gfHwgJyc7XG59XG5cbi8qKlxuICogUmV0dXJuIG9wdGlvbiBuYW1lLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbk9wdGlvbi5wcm90b3R5cGUubmFtZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5sb25nXG4gICAgLnJlcGxhY2UoJy0tJywgJycpXG4gICAgLnJlcGxhY2UoJ25vLScsICcnKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIG9wdGlvbiBuYW1lLCBpbiBhIGNhbWVsY2FzZSBmb3JtYXQgdGhhdCBjYW4gYmUgdXNlZFxuICogYXMgYSBvYmplY3QgYXR0cmlidXRlIGtleS5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5PcHRpb24ucHJvdG90eXBlLmF0dHJpYnV0ZU5hbWUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIGNhbWVsY2FzZSh0aGlzLm5hbWUoKSk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGBhcmdgIG1hdGNoZXMgdGhlIHNob3J0IG9yIGxvbmcgZmxhZy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYXJnXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuT3B0aW9uLnByb3RvdHlwZS5pcyA9IGZ1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdGhpcy5zaG9ydCA9PT0gYXJnIHx8IHRoaXMubG9uZyA9PT0gYXJnO1xufTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBDb21tYW5kYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBDb21tYW5kKG5hbWUpIHtcbiAgdGhpcy5jb21tYW5kcyA9IFtdO1xuICB0aGlzLm9wdGlvbnMgPSBbXTtcbiAgdGhpcy5fZXhlY3MgPSB7fTtcbiAgdGhpcy5fYWxsb3dVbmtub3duT3B0aW9uID0gZmFsc2U7XG4gIHRoaXMuX2FyZ3MgPSBbXTtcbiAgdGhpcy5fbmFtZSA9IG5hbWUgfHwgJyc7XG59XG5cbi8qKlxuICogQWRkIGNvbW1hbmQgYG5hbWVgLlxuICpcbiAqIFRoZSBgLmFjdGlvbigpYCBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gdGhlXG4gKiBjb21tYW5kIGBuYW1lYCBpcyBzcGVjaWZpZWQgdmlhIF9fQVJHVl9fLFxuICogYW5kIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIGFyZSBhcHBsaWVkIHRvIHRoZVxuICogZnVuY3Rpb24gZm9yIGFjY2Vzcy5cbiAqXG4gKiBXaGVuIHRoZSBgbmFtZWAgaXMgXCIqXCIgYW4gdW4tbWF0Y2hlZCBjb21tYW5kXG4gKiB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJnLCBmb2xsb3dlZCBieVxuICogdGhlIHJlc3Qgb2YgX19BUkdWX18gcmVtYWluaW5nLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgcHJvZ3JhbVxuICogICAgICAgIC52ZXJzaW9uKCcwLjAuMScpXG4gKiAgICAgICAgLm9wdGlvbignLUMsIC0tY2hkaXIgPHBhdGg+JywgJ2NoYW5nZSB0aGUgd29ya2luZyBkaXJlY3RvcnknKVxuICogICAgICAgIC5vcHRpb24oJy1jLCAtLWNvbmZpZyA8cGF0aD4nLCAnc2V0IGNvbmZpZyBwYXRoLiBkZWZhdWx0cyB0byAuL2RlcGxveS5jb25mJylcbiAqICAgICAgICAub3B0aW9uKCctVCwgLS1uby10ZXN0cycsICdpZ25vcmUgdGVzdCBob29rJylcbiAqXG4gKiAgICAgIHByb2dyYW1cbiAqICAgICAgICAuY29tbWFuZCgnc2V0dXAnKVxuICogICAgICAgIC5kZXNjcmlwdGlvbigncnVuIHJlbW90ZSBzZXR1cCBjb21tYW5kcycpXG4gKiAgICAgICAgLmFjdGlvbihmdW5jdGlvbigpIHtcbiAqICAgICAgICAgIGNvbnNvbGUubG9nKCdzZXR1cCcpO1xuICogICAgICAgIH0pO1xuICpcbiAqICAgICAgcHJvZ3JhbVxuICogICAgICAgIC5jb21tYW5kKCdleGVjIDxjbWQ+JylcbiAqICAgICAgICAuZGVzY3JpcHRpb24oJ3J1biB0aGUgZ2l2ZW4gcmVtb3RlIGNvbW1hbmQnKVxuICogICAgICAgIC5hY3Rpb24oZnVuY3Rpb24oY21kKSB7XG4gKiAgICAgICAgICBjb25zb2xlLmxvZygnZXhlYyBcIiVzXCInLCBjbWQpO1xuICogICAgICAgIH0pO1xuICpcbiAqICAgICAgcHJvZ3JhbVxuICogICAgICAgIC5jb21tYW5kKCd0ZWFyZG93biA8ZGlyPiBbb3RoZXJEaXJzLi4uXScpXG4gKiAgICAgICAgLmRlc2NyaXB0aW9uKCdydW4gdGVhcmRvd24gY29tbWFuZHMnKVxuICogICAgICAgIC5hY3Rpb24oZnVuY3Rpb24oZGlyLCBvdGhlckRpcnMpIHtcbiAqICAgICAgICAgIGNvbnNvbGUubG9nKCdkaXIgXCIlc1wiJywgZGlyKTtcbiAqICAgICAgICAgIGlmIChvdGhlckRpcnMpIHtcbiAqICAgICAgICAgICAgb3RoZXJEaXJzLmZvckVhY2goZnVuY3Rpb24gKG9EaXIpIHtcbiAqICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZGlyIFwiJXNcIicsIG9EaXIpO1xuICogICAgICAgICAgICB9KTtcbiAqICAgICAgICAgIH1cbiAqICAgICAgICB9KTtcbiAqXG4gKiAgICAgIHByb2dyYW1cbiAqICAgICAgICAuY29tbWFuZCgnKicpXG4gKiAgICAgICAgLmRlc2NyaXB0aW9uKCdkZXBsb3kgdGhlIGdpdmVuIGVudicpXG4gKiAgICAgICAgLmFjdGlvbihmdW5jdGlvbihlbnYpIHtcbiAqICAgICAgICAgIGNvbnNvbGUubG9nKCdkZXBsb3lpbmcgXCIlc1wiJywgZW52KTtcbiAqICAgICAgICB9KTtcbiAqXG4gKiAgICAgIHByb2dyYW0ucGFyc2UocHJvY2Vzcy5hcmd2KTtcbiAgKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7U3RyaW5nfSBbZGVzY10gZm9yIGdpdC1zdHlsZSBzdWItY29tbWFuZHNcbiAqIEByZXR1cm4ge0NvbW1hbmR9IHRoZSBuZXcgY29tbWFuZFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS5jb21tYW5kID0gZnVuY3Rpb24obmFtZSwgZGVzYywgb3B0cykge1xuICBpZiAodHlwZW9mIGRlc2MgPT09ICdvYmplY3QnICYmIGRlc2MgIT09IG51bGwpIHtcbiAgICBvcHRzID0gZGVzYztcbiAgICBkZXNjID0gbnVsbDtcbiAgfVxuICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgdmFyIGFyZ3MgPSBuYW1lLnNwbGl0KC8gKy8pO1xuICB2YXIgY21kID0gbmV3IENvbW1hbmQoYXJncy5zaGlmdCgpKTtcblxuICBpZiAoZGVzYykge1xuICAgIGNtZC5kZXNjcmlwdGlvbihkZXNjKTtcbiAgICB0aGlzLmV4ZWN1dGFibGVzID0gdHJ1ZTtcbiAgICB0aGlzLl9leGVjc1tjbWQuX25hbWVdID0gdHJ1ZTtcbiAgICBpZiAob3B0cy5pc0RlZmF1bHQpIHRoaXMuZGVmYXVsdEV4ZWN1dGFibGUgPSBjbWQuX25hbWU7XG4gIH1cbiAgY21kLl9ub0hlbHAgPSAhIW9wdHMubm9IZWxwO1xuICB0aGlzLmNvbW1hbmRzLnB1c2goY21kKTtcbiAgY21kLnBhcnNlRXhwZWN0ZWRBcmdzKGFyZ3MpO1xuICBjbWQucGFyZW50ID0gdGhpcztcblxuICBpZiAoZGVzYykgcmV0dXJuIHRoaXM7XG4gIHJldHVybiBjbWQ7XG59O1xuXG4vKipcbiAqIERlZmluZSBhcmd1bWVudCBzeW50YXggZm9yIHRoZSB0b3AtbGV2ZWwgY29tbWFuZC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkNvbW1hbmQucHJvdG90eXBlLmFyZ3VtZW50cyA9IGZ1bmN0aW9uKGRlc2MpIHtcbiAgcmV0dXJuIHRoaXMucGFyc2VFeHBlY3RlZEFyZ3MoZGVzYy5zcGxpdCgvICsvKSk7XG59O1xuXG4vKipcbiAqIEFkZCBhbiBpbXBsaWNpdCBgaGVscCBbY21kXWAgc3ViY29tbWFuZFxuICogd2hpY2ggaW52b2tlcyBgLS1oZWxwYCBmb3IgdGhlIGdpdmVuIGNvbW1hbmQuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUuYWRkSW1wbGljaXRIZWxwQ29tbWFuZCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmNvbW1hbmQoJ2hlbHAgW2NtZF0nLCAnZGlzcGxheSBoZWxwIGZvciBbY21kXScpO1xufTtcblxuLyoqXG4gKiBQYXJzZSBleHBlY3RlZCBgYXJnc2AuXG4gKlxuICogRm9yIGV4YW1wbGUgYFtcIlt0eXBlXVwiXWAgYmVjb21lcyBgW3sgcmVxdWlyZWQ6IGZhbHNlLCBuYW1lOiAndHlwZScgfV1gLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3NcbiAqIEByZXR1cm4ge0NvbW1hbmR9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS5wYXJzZUV4cGVjdGVkQXJncyA9IGZ1bmN0aW9uKGFyZ3MpIHtcbiAgaWYgKCFhcmdzLmxlbmd0aCkgcmV0dXJuO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGFyZ3MuZm9yRWFjaChmdW5jdGlvbihhcmcpIHtcbiAgICB2YXIgYXJnRGV0YWlscyA9IHtcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIG5hbWU6ICcnLFxuICAgICAgdmFyaWFkaWM6IGZhbHNlXG4gICAgfTtcblxuICAgIHN3aXRjaCAoYXJnWzBdKSB7XG4gICAgICBjYXNlICc8JzpcbiAgICAgICAgYXJnRGV0YWlscy5yZXF1aXJlZCA9IHRydWU7XG4gICAgICAgIGFyZ0RldGFpbHMubmFtZSA9IGFyZy5zbGljZSgxLCAtMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnWyc6XG4gICAgICAgIGFyZ0RldGFpbHMubmFtZSA9IGFyZy5zbGljZSgxLCAtMSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChhcmdEZXRhaWxzLm5hbWUubGVuZ3RoID4gMyAmJiBhcmdEZXRhaWxzLm5hbWUuc2xpY2UoLTMpID09PSAnLi4uJykge1xuICAgICAgYXJnRGV0YWlscy52YXJpYWRpYyA9IHRydWU7XG4gICAgICBhcmdEZXRhaWxzLm5hbWUgPSBhcmdEZXRhaWxzLm5hbWUuc2xpY2UoMCwgLTMpO1xuICAgIH1cbiAgICBpZiAoYXJnRGV0YWlscy5uYW1lKSB7XG4gICAgICBzZWxmLl9hcmdzLnB1c2goYXJnRGV0YWlscyk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJlZ2lzdGVyIGNhbGxiYWNrIGBmbmAgZm9yIHRoZSBjb21tYW5kLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgcHJvZ3JhbVxuICogICAgICAgIC5jb21tYW5kKCdoZWxwJylcbiAqICAgICAgICAuZGVzY3JpcHRpb24oJ2Rpc3BsYXkgdmVyYm9zZSBoZWxwJylcbiAqICAgICAgICAuYWN0aW9uKGZ1bmN0aW9uKCkge1xuICogICAgICAgICAgIC8vIG91dHB1dCBoZWxwIGhlcmVcbiAqICAgICAgICB9KTtcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7Q29tbWFuZH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkNvbW1hbmQucHJvdG90eXBlLmFjdGlvbiA9IGZ1bmN0aW9uKGZuKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24oYXJncywgdW5rbm93bikge1xuICAgIC8vIFBhcnNlIGFueSBzby1mYXIgdW5rbm93biBvcHRpb25zXG4gICAgYXJncyA9IGFyZ3MgfHwgW107XG4gICAgdW5rbm93biA9IHVua25vd24gfHwgW107XG5cbiAgICB2YXIgcGFyc2VkID0gc2VsZi5wYXJzZU9wdGlvbnModW5rbm93bik7XG5cbiAgICAvLyBPdXRwdXQgaGVscCBpZiBuZWNlc3NhcnlcbiAgICBvdXRwdXRIZWxwSWZOZWNlc3Nhcnkoc2VsZiwgcGFyc2VkLnVua25vd24pO1xuXG4gICAgLy8gSWYgdGhlcmUgYXJlIHN0aWxsIGFueSB1bmtub3duIG9wdGlvbnMsIHRoZW4gd2Ugc2ltcGx5XG4gICAgLy8gZGllLCB1bmxlc3Mgc29tZW9uZSBhc2tlZCBmb3IgaGVscCwgaW4gd2hpY2ggY2FzZSB3ZSBnaXZlIGl0XG4gICAgLy8gdG8gdGhlbSwgYW5kIHRoZW4gd2UgZGllLlxuICAgIGlmIChwYXJzZWQudW5rbm93bi5sZW5ndGggPiAwKSB7XG4gICAgICBzZWxmLnVua25vd25PcHRpb24ocGFyc2VkLnVua25vd25bMF0pO1xuICAgIH1cblxuICAgIC8vIExlZnRvdmVyIGFyZ3VtZW50cyBuZWVkIHRvIGJlIHB1c2hlZCBiYWNrLiBGaXhlcyBpc3N1ZSAjNTZcbiAgICBpZiAocGFyc2VkLmFyZ3MubGVuZ3RoKSBhcmdzID0gcGFyc2VkLmFyZ3MuY29uY2F0KGFyZ3MpO1xuXG4gICAgc2VsZi5fYXJncy5mb3JFYWNoKGZ1bmN0aW9uKGFyZywgaSkge1xuICAgICAgaWYgKGFyZy5yZXF1aXJlZCAmJiBhcmdzW2ldID09IG51bGwpIHtcbiAgICAgICAgc2VsZi5taXNzaW5nQXJndW1lbnQoYXJnLm5hbWUpO1xuICAgICAgfSBlbHNlIGlmIChhcmcudmFyaWFkaWMpIHtcbiAgICAgICAgaWYgKGkgIT09IHNlbGYuX2FyZ3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHNlbGYudmFyaWFkaWNBcmdOb3RMYXN0KGFyZy5uYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFyZ3NbaV0gPSBhcmdzLnNwbGljZShpKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEFsd2F5cyBhcHBlbmQgb3Vyc2VsdmVzIHRvIHRoZSBlbmQgb2YgdGhlIGFyZ3VtZW50cyxcbiAgICAvLyB0byBtYWtlIHN1cmUgd2UgbWF0Y2ggdGhlIG51bWJlciBvZiBhcmd1bWVudHMgdGhlIHVzZXJcbiAgICAvLyBleHBlY3RzXG4gICAgaWYgKHNlbGYuX2FyZ3MubGVuZ3RoKSB7XG4gICAgICBhcmdzW3NlbGYuX2FyZ3MubGVuZ3RoXSA9IHNlbGY7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3MucHVzaChzZWxmKTtcbiAgICB9XG5cbiAgICBmbi5hcHBseShzZWxmLCBhcmdzKTtcbiAgfTtcbiAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50IHx8IHRoaXM7XG4gIHZhciBuYW1lID0gcGFyZW50ID09PSB0aGlzID8gJyonIDogdGhpcy5fbmFtZTtcbiAgcGFyZW50Lm9uKCdjb21tYW5kOicgKyBuYW1lLCBsaXN0ZW5lcik7XG4gIGlmICh0aGlzLl9hbGlhcykgcGFyZW50Lm9uKCdjb21tYW5kOicgKyB0aGlzLl9hbGlhcywgbGlzdGVuZXIpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogRGVmaW5lIG9wdGlvbiB3aXRoIGBmbGFnc2AsIGBkZXNjcmlwdGlvbmAgYW5kIG9wdGlvbmFsXG4gKiBjb2VyY2lvbiBgZm5gLlxuICpcbiAqIFRoZSBgZmxhZ3NgIHN0cmluZyBzaG91bGQgY29udGFpbiBib3RoIHRoZSBzaG9ydCBhbmQgbG9uZyBmbGFncyxcbiAqIHNlcGFyYXRlZCBieSBjb21tYSwgYSBwaXBlIG9yIHNwYWNlLiBUaGUgZm9sbG93aW5nIGFyZSBhbGwgdmFsaWRcbiAqIGFsbCB3aWxsIG91dHB1dCB0aGlzIHdheSB3aGVuIGAtLWhlbHBgIGlzIHVzZWQuXG4gKlxuICogICAgXCItcCwgLS1wZXBwZXJcIlxuICogICAgXCItcHwtLXBlcHBlclwiXG4gKiAgICBcIi1wIC0tcGVwcGVyXCJcbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgLy8gc2ltcGxlIGJvb2xlYW4gZGVmYXVsdGluZyB0byBmYWxzZVxuICogICAgIHByb2dyYW0ub3B0aW9uKCctcCwgLS1wZXBwZXInLCAnYWRkIHBlcHBlcicpO1xuICpcbiAqICAgICAtLXBlcHBlclxuICogICAgIHByb2dyYW0ucGVwcGVyXG4gKiAgICAgLy8gPT4gQm9vbGVhblxuICpcbiAqICAgICAvLyBzaW1wbGUgYm9vbGVhbiBkZWZhdWx0aW5nIHRvIHRydWVcbiAqICAgICBwcm9ncmFtLm9wdGlvbignLUMsIC0tbm8tY2hlZXNlJywgJ3JlbW92ZSBjaGVlc2UnKTtcbiAqXG4gKiAgICAgcHJvZ3JhbS5jaGVlc2VcbiAqICAgICAvLyA9PiB0cnVlXG4gKlxuICogICAgIC0tbm8tY2hlZXNlXG4gKiAgICAgcHJvZ3JhbS5jaGVlc2VcbiAqICAgICAvLyA9PiBmYWxzZVxuICpcbiAqICAgICAvLyByZXF1aXJlZCBhcmd1bWVudFxuICogICAgIHByb2dyYW0ub3B0aW9uKCctQywgLS1jaGRpciA8cGF0aD4nLCAnY2hhbmdlIHRoZSB3b3JraW5nIGRpcmVjdG9yeScpO1xuICpcbiAqICAgICAtLWNoZGlyIC90bXBcbiAqICAgICBwcm9ncmFtLmNoZGlyXG4gKiAgICAgLy8gPT4gXCIvdG1wXCJcbiAqXG4gKiAgICAgLy8gb3B0aW9uYWwgYXJndW1lbnRcbiAqICAgICBwcm9ncmFtLm9wdGlvbignLWMsIC0tY2hlZXNlIFt0eXBlXScsICdhZGQgY2hlZXNlIFttYXJibGVdJyk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZsYWdzXG4gKiBAcGFyYW0ge1N0cmluZ30gZGVzY3JpcHRpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb258Kn0gW2ZuXSBvciBkZWZhdWx0XG4gKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdXG4gKiBAcmV0dXJuIHtDb21tYW5kfSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUub3B0aW9uID0gZnVuY3Rpb24oZmxhZ3MsIGRlc2NyaXB0aW9uLCBmbiwgZGVmYXVsdFZhbHVlKSB7XG4gIHZhciBzZWxmID0gdGhpcyxcbiAgICBvcHRpb24gPSBuZXcgT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbiksXG4gICAgb25hbWUgPSBvcHRpb24ubmFtZSgpLFxuICAgIG5hbWUgPSBvcHRpb24uYXR0cmlidXRlTmFtZSgpO1xuXG4gIC8vIGRlZmF1bHQgYXMgM3JkIGFyZ1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKGZuIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICB2YXIgcmVnZXggPSBmbjtcbiAgICAgIGZuID0gZnVuY3Rpb24odmFsLCBkZWYpIHtcbiAgICAgICAgdmFyIG0gPSByZWdleC5leGVjKHZhbCk7XG4gICAgICAgIHJldHVybiBtID8gbVswXSA6IGRlZjtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlZmF1bHRWYWx1ZSA9IGZuO1xuICAgICAgZm4gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIHByZWFzc2lnbiBkZWZhdWx0IHZhbHVlIG9ubHkgZm9yIC0tbm8tKiwgW29wdGlvbmFsXSwgb3IgPHJlcXVpcmVkPlxuICBpZiAoIW9wdGlvbi5ib29sIHx8IG9wdGlvbi5vcHRpb25hbCB8fCBvcHRpb24ucmVxdWlyZWQpIHtcbiAgICAvLyB3aGVuIC0tbm8tKiB3ZSBtYWtlIHN1cmUgZGVmYXVsdCBpcyB0cnVlXG4gICAgaWYgKCFvcHRpb24uYm9vbCkgZGVmYXVsdFZhbHVlID0gdHJ1ZTtcbiAgICAvLyBwcmVhc3NpZ24gb25seSBpZiB3ZSBoYXZlIGEgZGVmYXVsdFxuICAgIGlmIChkZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2VsZltuYW1lXSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgIG9wdGlvbi5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLy8gcmVnaXN0ZXIgdGhlIG9wdGlvblxuICB0aGlzLm9wdGlvbnMucHVzaChvcHRpb24pO1xuXG4gIC8vIHdoZW4gaXQncyBwYXNzZWQgYXNzaWduIHRoZSB2YWx1ZVxuICAvLyBhbmQgY29uZGl0aW9uYWxseSBpbnZva2UgdGhlIGNhbGxiYWNrXG4gIHRoaXMub24oJ29wdGlvbjonICsgb25hbWUsIGZ1bmN0aW9uKHZhbCkge1xuICAgIC8vIGNvZXJjaW9uXG4gICAgaWYgKHZhbCAhPT0gbnVsbCAmJiBmbikge1xuICAgICAgdmFsID0gZm4odmFsLCBzZWxmW25hbWVdID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiBzZWxmW25hbWVdKTtcbiAgICB9XG5cbiAgICAvLyB1bmFzc2lnbmVkIG9yIGJvb2xcbiAgICBpZiAodHlwZW9mIHNlbGZbbmFtZV0gPT09ICdib29sZWFuJyB8fCB0eXBlb2Ygc2VsZltuYW1lXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIGlmIG5vIHZhbHVlLCBib29sIHRydWUsIGFuZCB3ZSBoYXZlIGEgZGVmYXVsdCwgdGhlbiB1c2UgaXQhXG4gICAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgICAgc2VsZltuYW1lXSA9IG9wdGlvbi5ib29sXG4gICAgICAgICAgPyBkZWZhdWx0VmFsdWUgfHwgdHJ1ZVxuICAgICAgICAgIDogZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmW25hbWVdID0gdmFsO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodmFsICE9PSBudWxsKSB7XG4gICAgICAvLyByZWFzc2lnblxuICAgICAgc2VsZltuYW1lXSA9IHZhbDtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBbGxvdyB1bmtub3duIG9wdGlvbnMgb24gdGhlIGNvbW1hbmQgbGluZS5cbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGFyZyBpZiBgdHJ1ZWAgb3Igb21pdHRlZCwgbm8gZXJyb3Igd2lsbCBiZSB0aHJvd25cbiAqIGZvciB1bmtub3duIG9wdGlvbnMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5Db21tYW5kLnByb3RvdHlwZS5hbGxvd1Vua25vd25PcHRpb24gPSBmdW5jdGlvbihhcmcpIHtcbiAgdGhpcy5fYWxsb3dVbmtub3duT3B0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA9PT0gMCB8fCBhcmc7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBQYXJzZSBgYXJndmAsIHNldHRpbmdzIG9wdGlvbnMgYW5kIGludm9raW5nIGNvbW1hbmRzIHdoZW4gZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcmd2XG4gKiBAcmV0dXJuIHtDb21tYW5kfSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbihhcmd2KSB7XG4gIC8vIGltcGxpY2l0IGhlbHBcbiAgaWYgKHRoaXMuZXhlY3V0YWJsZXMpIHRoaXMuYWRkSW1wbGljaXRIZWxwQ29tbWFuZCgpO1xuXG4gIC8vIHN0b3JlIHJhdyBhcmdzXG4gIHRoaXMucmF3QXJncyA9IGFyZ3Y7XG5cbiAgLy8gZ3Vlc3MgbmFtZVxuICB0aGlzLl9uYW1lID0gdGhpcy5fbmFtZSB8fCBiYXNlbmFtZShhcmd2WzFdLCAnLmpzJyk7XG5cbiAgLy8gZ2l0aHViLXN0eWxlIHN1Yi1jb21tYW5kcyB3aXRoIG5vIHN1Yi1jb21tYW5kXG4gIGlmICh0aGlzLmV4ZWN1dGFibGVzICYmIGFyZ3YubGVuZ3RoIDwgMyAmJiAhdGhpcy5kZWZhdWx0RXhlY3V0YWJsZSkge1xuICAgIC8vIHRoaXMgdXNlciBuZWVkcyBoZWxwXG4gICAgYXJndi5wdXNoKCctLWhlbHAnKTtcbiAgfVxuXG4gIC8vIHByb2Nlc3MgYXJndlxuICB2YXIgcGFyc2VkID0gdGhpcy5wYXJzZU9wdGlvbnModGhpcy5ub3JtYWxpemUoYXJndi5zbGljZSgyKSkpO1xuICB2YXIgYXJncyA9IHRoaXMuYXJncyA9IHBhcnNlZC5hcmdzO1xuXG4gIHZhciByZXN1bHQgPSB0aGlzLnBhcnNlQXJncyh0aGlzLmFyZ3MsIHBhcnNlZC51bmtub3duKTtcblxuICAvLyBleGVjdXRhYmxlIHN1Yi1jb21tYW5kc1xuICB2YXIgbmFtZSA9IHJlc3VsdC5hcmdzWzBdO1xuXG4gIHZhciBhbGlhc0NvbW1hbmQgPSBudWxsO1xuICAvLyBjaGVjayBhbGlhcyBvZiBzdWIgY29tbWFuZHNcbiAgaWYgKG5hbWUpIHtcbiAgICBhbGlhc0NvbW1hbmQgPSB0aGlzLmNvbW1hbmRzLmZpbHRlcihmdW5jdGlvbihjb21tYW5kKSB7XG4gICAgICByZXR1cm4gY29tbWFuZC5hbGlhcygpID09PSBuYW1lO1xuICAgIH0pWzBdO1xuICB9XG5cbiAgaWYgKHRoaXMuX2V4ZWNzW25hbWVdID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN1YkNvbW1hbmQoYXJndiwgYXJncywgcGFyc2VkLnVua25vd24pO1xuICB9IGVsc2UgaWYgKGFsaWFzQ29tbWFuZCkge1xuICAgIC8vIGlzIGFsaWFzIG9mIGEgc3ViQ29tbWFuZFxuICAgIGFyZ3NbMF0gPSBhbGlhc0NvbW1hbmQuX25hbWU7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN1YkNvbW1hbmQoYXJndiwgYXJncywgcGFyc2VkLnVua25vd24pO1xuICB9IGVsc2UgaWYgKHRoaXMuZGVmYXVsdEV4ZWN1dGFibGUpIHtcbiAgICAvLyB1c2UgdGhlIGRlZmF1bHQgc3ViY29tbWFuZFxuICAgIGFyZ3MudW5zaGlmdCh0aGlzLmRlZmF1bHRFeGVjdXRhYmxlKTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlU3ViQ29tbWFuZChhcmd2LCBhcmdzLCBwYXJzZWQudW5rbm93bik7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBFeGVjdXRlIGEgc3ViLWNvbW1hbmQgZXhlY3V0YWJsZS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcmd2XG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzXG4gKiBAcGFyYW0ge0FycmF5fSB1bmtub3duXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS5leGVjdXRlU3ViQ29tbWFuZCA9IGZ1bmN0aW9uKGFyZ3YsIGFyZ3MsIHVua25vd24pIHtcbiAgYXJncyA9IGFyZ3MuY29uY2F0KHVua25vd24pO1xuXG4gIGlmICghYXJncy5sZW5ndGgpIHRoaXMuaGVscCgpO1xuICBpZiAoYXJnc1swXSA9PT0gJ2hlbHAnICYmIGFyZ3MubGVuZ3RoID09PSAxKSB0aGlzLmhlbHAoKTtcblxuICAvLyA8Y21kPiAtLWhlbHBcbiAgaWYgKGFyZ3NbMF0gPT09ICdoZWxwJykge1xuICAgIGFyZ3NbMF0gPSBhcmdzWzFdO1xuICAgIGFyZ3NbMV0gPSAnLS1oZWxwJztcbiAgfVxuXG4gIC8vIGV4ZWN1dGFibGVcbiAgdmFyIGYgPSBhcmd2WzFdO1xuICAvLyBuYW1lIG9mIHRoZSBzdWJjb21tYW5kLCBsaW5rIGBwbS1pbnN0YWxsYFxuICB2YXIgYmluID0gYmFzZW5hbWUoZiwgcGF0aC5leHRuYW1lKGYpKSArICctJyArIGFyZ3NbMF07XG5cbiAgLy8gSW4gY2FzZSBvZiBnbG9iYWxseSBpbnN0YWxsZWQsIGdldCB0aGUgYmFzZSBkaXIgd2hlcmUgZXhlY3V0YWJsZVxuICAvLyAgc3ViY29tbWFuZCBmaWxlIHNob3VsZCBiZSBsb2NhdGVkIGF0XG4gIHZhciBiYXNlRGlyO1xuXG4gIHZhciByZXNvbHZlZExpbmsgPSBmcy5yZWFscGF0aFN5bmMoZik7XG5cbiAgYmFzZURpciA9IGRpcm5hbWUocmVzb2x2ZWRMaW5rKTtcblxuICAvLyBwcmVmZXIgbG9jYWwgYC4vPGJpbj5gIHRvIGJpbiBpbiB0aGUgJFBBVEhcbiAgdmFyIGxvY2FsQmluID0gcGF0aC5qb2luKGJhc2VEaXIsIGJpbik7XG5cbiAgLy8gd2hldGhlciBiaW4gZmlsZSBpcyBhIGpzIHNjcmlwdCB3aXRoIGV4cGxpY2l0IGAuanNgIG9yIGAudHNgIGV4dGVuc2lvblxuICB2YXIgaXNFeHBsaWNpdEpTID0gZmFsc2U7XG4gIGlmIChleGlzdHMobG9jYWxCaW4gKyAnLmpzJykpIHtcbiAgICBiaW4gPSBsb2NhbEJpbiArICcuanMnO1xuICAgIGlzRXhwbGljaXRKUyA9IHRydWU7XG4gIH0gZWxzZSBpZiAoZXhpc3RzKGxvY2FsQmluICsgJy50cycpKSB7XG4gICAgYmluID0gbG9jYWxCaW4gKyAnLnRzJztcbiAgICBpc0V4cGxpY2l0SlMgPSB0cnVlO1xuICB9IGVsc2UgaWYgKGV4aXN0cyhsb2NhbEJpbikpIHtcbiAgICBiaW4gPSBsb2NhbEJpbjtcbiAgfVxuXG4gIGFyZ3MgPSBhcmdzLnNsaWNlKDEpO1xuXG4gIHZhciBwcm9jO1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSAhPT0gJ3dpbjMyJykge1xuICAgIGlmIChpc0V4cGxpY2l0SlMpIHtcbiAgICAgIGFyZ3MudW5zaGlmdChiaW4pO1xuICAgICAgLy8gYWRkIGV4ZWN1dGFibGUgYXJndW1lbnRzIHRvIHNwYXduXG4gICAgICBhcmdzID0gKHByb2Nlc3MuZXhlY0FyZ3YgfHwgW10pLmNvbmNhdChhcmdzKTtcblxuICAgICAgcHJvYyA9IHNwYXduKHByb2Nlc3MuYXJndlswXSwgYXJncywgeyBzdGRpbzogJ2luaGVyaXQnLCBjdXN0b21GZHM6IFswLCAxLCAyXSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvYyA9IHNwYXduKGJpbiwgYXJncywgeyBzdGRpbzogJ2luaGVyaXQnLCBjdXN0b21GZHM6IFswLCAxLCAyXSB9KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYXJncy51bnNoaWZ0KGJpbik7XG4gICAgcHJvYyA9IHNwYXduKHByb2Nlc3MuZXhlY1BhdGgsIGFyZ3MsIHsgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgfVxuXG4gIHZhciBzaWduYWxzID0gWydTSUdVU1IxJywgJ1NJR1VTUjInLCAnU0lHVEVSTScsICdTSUdJTlQnLCAnU0lHSFVQJ107XG4gIHNpZ25hbHMuZm9yRWFjaChmdW5jdGlvbihzaWduYWwpIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwgZnVuY3Rpb24oKSB7XG4gICAgICBpZiAocHJvYy5raWxsZWQgPT09IGZhbHNlICYmIHByb2MuZXhpdENvZGUgPT09IG51bGwpIHtcbiAgICAgICAgcHJvYy5raWxsKHNpZ25hbCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICBwcm9jLm9uKCdjbG9zZScsIHByb2Nlc3MuZXhpdC5iaW5kKHByb2Nlc3MpKTtcbiAgcHJvYy5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHtcbiAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdlcnJvcjogJXMoMSkgZG9lcyBub3QgZXhpc3QsIHRyeSAtLWhlbHAnLCBiaW4pO1xuICAgIH0gZWxzZSBpZiAoZXJyLmNvZGUgPT09ICdFQUNDRVMnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdlcnJvcjogJXMoMSkgbm90IGV4ZWN1dGFibGUuIHRyeSBjaG1vZCBvciBydW4gd2l0aCByb290JywgYmluKTtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9KTtcblxuICAvLyBTdG9yZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBjaGlsZCBwcm9jZXNzXG4gIHRoaXMucnVubmluZ0NvbW1hbmQgPSBwcm9jO1xufTtcblxuLyoqXG4gKiBOb3JtYWxpemUgYGFyZ3NgLCBzcGxpdHRpbmcgam9pbmVkIHNob3J0IGZsYWdzLiBGb3IgZXhhbXBsZVxuICogdGhlIGFyZyBcIi1hYmNcIiBpcyBlcXVpdmFsZW50IHRvIFwiLWEgLWIgLWNcIi5cbiAqIFRoaXMgYWxzbyBub3JtYWxpemVzIGVxdWFsIHNpZ24gYW5kIHNwbGl0cyBcIi0tYWJjPWRlZlwiIGludG8gXCItLWFiYyBkZWZcIi5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbkNvbW1hbmQucHJvdG90eXBlLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKGFyZ3MpIHtcbiAgdmFyIHJldCA9IFtdLFxuICAgIGFyZyxcbiAgICBsYXN0T3B0LFxuICAgIGluZGV4O1xuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcmdzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgYXJnID0gYXJnc1tpXTtcbiAgICBpZiAoaSA+IDApIHtcbiAgICAgIGxhc3RPcHQgPSB0aGlzLm9wdGlvbkZvcihhcmdzW2kgLSAxXSk7XG4gICAgfVxuXG4gICAgaWYgKGFyZyA9PT0gJy0tJykge1xuICAgICAgLy8gSG9ub3Igb3B0aW9uIHRlcm1pbmF0b3JcbiAgICAgIHJldCA9IHJldC5jb25jYXQoYXJncy5zbGljZShpKSk7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2UgaWYgKGxhc3RPcHQgJiYgbGFzdE9wdC5yZXF1aXJlZCkge1xuICAgICAgcmV0LnB1c2goYXJnKTtcbiAgICB9IGVsc2UgaWYgKGFyZy5sZW5ndGggPiAxICYmIGFyZ1swXSA9PT0gJy0nICYmIGFyZ1sxXSAhPT0gJy0nKSB7XG4gICAgICBhcmcuc2xpY2UoMSkuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24oYykge1xuICAgICAgICByZXQucHVzaCgnLScgKyBjKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoL14tLS8udGVzdChhcmcpICYmIH4oaW5kZXggPSBhcmcuaW5kZXhPZignPScpKSkge1xuICAgICAgcmV0LnB1c2goYXJnLnNsaWNlKDAsIGluZGV4KSwgYXJnLnNsaWNlKGluZGV4ICsgMSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXQucHVzaChhcmcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59O1xuXG4vKipcbiAqIFBhcnNlIGNvbW1hbmQgYGFyZ3NgLlxuICpcbiAqIFdoZW4gbGlzdGVuZXIocykgYXJlIGF2YWlsYWJsZSB0aG9zZVxuICogY2FsbGJhY2tzIGFyZSBpbnZva2VkLCBvdGhlcndpc2UgdGhlIFwiKlwiXG4gKiBldmVudCBpcyBlbWl0dGVkIGFuZCB0aG9zZSBhY3Rpb25zIGFyZSBpbnZva2VkLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3NcbiAqIEByZXR1cm4ge0NvbW1hbmR9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUucGFyc2VBcmdzID0gZnVuY3Rpb24oYXJncywgdW5rbm93bikge1xuICB2YXIgbmFtZTtcblxuICBpZiAoYXJncy5sZW5ndGgpIHtcbiAgICBuYW1lID0gYXJnc1swXTtcbiAgICBpZiAodGhpcy5saXN0ZW5lcnMoJ2NvbW1hbmQ6JyArIG5hbWUpLmxlbmd0aCkge1xuICAgICAgdGhpcy5lbWl0KCdjb21tYW5kOicgKyBhcmdzLnNoaWZ0KCksIGFyZ3MsIHVua25vd24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXQoJ2NvbW1hbmQ6KicsIGFyZ3MpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXRwdXRIZWxwSWZOZWNlc3NhcnkodGhpcywgdW5rbm93bik7XG5cbiAgICAvLyBJZiB0aGVyZSB3ZXJlIG5vIGFyZ3MgYW5kIHdlIGhhdmUgdW5rbm93biBvcHRpb25zLFxuICAgIC8vIHRoZW4gdGhleSBhcmUgZXh0cmFuZW91cyBhbmQgd2UgbmVlZCB0byBlcnJvci5cbiAgICBpZiAodW5rbm93bi5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnVua25vd25PcHRpb24odW5rbm93blswXSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbW1hbmRzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICB0aGlzLl9hcmdzLmZpbHRlcihmdW5jdGlvbihhKSB7IHJldHVybiBhLnJlcXVpcmVkOyB9KS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuZW1pdCgnY29tbWFuZDoqJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJldHVybiBhbiBvcHRpb24gbWF0Y2hpbmcgYGFyZ2AgaWYgYW55LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBhcmdcbiAqIEByZXR1cm4ge09wdGlvbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbkNvbW1hbmQucHJvdG90eXBlLm9wdGlvbkZvciA9IGZ1bmN0aW9uKGFyZykge1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5vcHRpb25zLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXMub3B0aW9uc1tpXS5pcyhhcmcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zW2ldO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBQYXJzZSBvcHRpb25zIGZyb20gYGFyZ3ZgIHJldHVybmluZyBgYXJndmBcbiAqIHZvaWQgb2YgdGhlc2Ugb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcmd2XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUucGFyc2VPcHRpb25zID0gZnVuY3Rpb24oYXJndikge1xuICB2YXIgYXJncyA9IFtdLFxuICAgIGxlbiA9IGFyZ3YubGVuZ3RoLFxuICAgIGxpdGVyYWwsXG4gICAgb3B0aW9uLFxuICAgIGFyZztcblxuICB2YXIgdW5rbm93bk9wdGlvbnMgPSBbXTtcblxuICAvLyBwYXJzZSBvcHRpb25zXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBhcmcgPSBhcmd2W2ldO1xuXG4gICAgLy8gbGl0ZXJhbCBhcmdzIGFmdGVyIC0tXG4gICAgaWYgKGxpdGVyYWwpIHtcbiAgICAgIGFyZ3MucHVzaChhcmcpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGFyZyA9PT0gJy0tJykge1xuICAgICAgbGl0ZXJhbCA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBmaW5kIG1hdGNoaW5nIE9wdGlvblxuICAgIG9wdGlvbiA9IHRoaXMub3B0aW9uRm9yKGFyZyk7XG5cbiAgICAvLyBvcHRpb24gaXMgZGVmaW5lZFxuICAgIGlmIChvcHRpb24pIHtcbiAgICAgIC8vIHJlcXVpcmVzIGFyZ1xuICAgICAgaWYgKG9wdGlvbi5yZXF1aXJlZCkge1xuICAgICAgICBhcmcgPSBhcmd2WysraV07XG4gICAgICAgIGlmIChhcmcgPT0gbnVsbCkgcmV0dXJuIHRoaXMub3B0aW9uTWlzc2luZ0FyZ3VtZW50KG9wdGlvbik7XG4gICAgICAgIHRoaXMuZW1pdCgnb3B0aW9uOicgKyBvcHRpb24ubmFtZSgpLCBhcmcpO1xuICAgICAgLy8gb3B0aW9uYWwgYXJnXG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbi5vcHRpb25hbCkge1xuICAgICAgICBhcmcgPSBhcmd2W2kgKyAxXTtcbiAgICAgICAgaWYgKGFyZyA9PSBudWxsIHx8IChhcmdbMF0gPT09ICctJyAmJiBhcmcgIT09ICctJykpIHtcbiAgICAgICAgICBhcmcgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICsraTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXQoJ29wdGlvbjonICsgb3B0aW9uLm5hbWUoKSwgYXJnKTtcbiAgICAgIC8vIGJvb2xcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZW1pdCgnb3B0aW9uOicgKyBvcHRpb24ubmFtZSgpKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIGxvb2tzIGxpa2UgYW4gb3B0aW9uXG4gICAgaWYgKGFyZy5sZW5ndGggPiAxICYmIGFyZ1swXSA9PT0gJy0nKSB7XG4gICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGFyZyk7XG5cbiAgICAgIC8vIElmIHRoZSBuZXh0IGFyZ3VtZW50IGxvb2tzIGxpa2UgaXQgbWlnaHQgYmVcbiAgICAgIC8vIGFuIGFyZ3VtZW50IGZvciB0aGlzIG9wdGlvbiwgd2UgcGFzcyBpdCBvbi5cbiAgICAgIC8vIElmIGl0IGlzbid0LCB0aGVuIGl0J2xsIHNpbXBseSBiZSBpZ25vcmVkXG4gICAgICBpZiAoKGkgKyAxKSA8IGFyZ3YubGVuZ3RoICYmIGFyZ3ZbaSArIDFdWzBdICE9PSAnLScpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChhcmd2WysraV0pO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gYXJnXG4gICAgYXJncy5wdXNoKGFyZyk7XG4gIH1cblxuICByZXR1cm4geyBhcmdzOiBhcmdzLCB1bmtub3duOiB1bmtub3duT3B0aW9ucyB9O1xufTtcblxuLyoqXG4gKiBSZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcgb3B0aW9ucyBhcyBrZXktdmFsdWUgcGFpcnNcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5Db21tYW5kLnByb3RvdHlwZS5vcHRzID0gZnVuY3Rpb24oKSB7XG4gIHZhciByZXN1bHQgPSB7fSxcbiAgICBsZW4gPSB0aGlzLm9wdGlvbnMubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIga2V5ID0gdGhpcy5vcHRpb25zW2ldLmF0dHJpYnV0ZU5hbWUoKTtcbiAgICByZXN1bHRba2V5XSA9IGtleSA9PT0gdGhpcy5fdmVyc2lvbk9wdGlvbk5hbWUgPyB0aGlzLl92ZXJzaW9uIDogdGhpc1trZXldO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEFyZ3VtZW50IGBuYW1lYCBpcyBtaXNzaW5nLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS5taXNzaW5nQXJndW1lbnQgPSBmdW5jdGlvbihuYW1lKSB7XG4gIGNvbnNvbGUuZXJyb3IoXCJlcnJvcjogbWlzc2luZyByZXF1aXJlZCBhcmd1bWVudCBgJXMnXCIsIG5hbWUpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59O1xuXG4vKipcbiAqIGBPcHRpb25gIGlzIG1pc3NpbmcgYW4gYXJndW1lbnQsIGJ1dCByZWNlaXZlZCBgZmxhZ2Agb3Igbm90aGluZy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9uXG4gKiBAcGFyYW0ge1N0cmluZ30gZmxhZ1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUub3B0aW9uTWlzc2luZ0FyZ3VtZW50ID0gZnVuY3Rpb24ob3B0aW9uLCBmbGFnKSB7XG4gIGlmIChmbGFnKSB7XG4gICAgY29uc29sZS5lcnJvcihcImVycm9yOiBvcHRpb24gYCVzJyBhcmd1bWVudCBtaXNzaW5nLCBnb3QgYCVzJ1wiLCBvcHRpb24uZmxhZ3MsIGZsYWcpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvcjogb3B0aW9uIGAlcycgYXJndW1lbnQgbWlzc2luZ1wiLCBvcHRpb24uZmxhZ3MpO1xuICB9XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn07XG5cbi8qKlxuICogVW5rbm93biBvcHRpb24gYGZsYWdgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmbGFnXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS51bmtub3duT3B0aW9uID0gZnVuY3Rpb24oZmxhZykge1xuICBpZiAodGhpcy5fYWxsb3dVbmtub3duT3B0aW9uKSByZXR1cm47XG4gIGNvbnNvbGUuZXJyb3IoXCJlcnJvcjogdW5rbm93biBvcHRpb24gYCVzJ1wiLCBmbGFnKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufTtcblxuLyoqXG4gKiBWYXJpYWRpYyBhcmd1bWVudCB3aXRoIGBuYW1lYCBpcyBub3QgdGhlIGxhc3QgYXJndW1lbnQgYXMgcmVxdWlyZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbkNvbW1hbmQucHJvdG90eXBlLnZhcmlhZGljQXJnTm90TGFzdCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgY29uc29sZS5lcnJvcihcImVycm9yOiB2YXJpYWRpYyBhcmd1bWVudHMgbXVzdCBiZSBsYXN0IGAlcydcIiwgbmFtZSk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBwcm9ncmFtIHZlcnNpb24gdG8gYHN0cmAuXG4gKlxuICogVGhpcyBtZXRob2QgYXV0by1yZWdpc3RlcnMgdGhlIFwiLVYsIC0tdmVyc2lvblwiIGZsYWdcbiAqIHdoaWNoIHdpbGwgcHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIHdoZW4gcGFzc2VkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBbZmxhZ3NdXG4gKiBAcmV0dXJuIHtDb21tYW5kfSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUudmVyc2lvbiA9IGZ1bmN0aW9uKHN0ciwgZmxhZ3MpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB0aGlzLl92ZXJzaW9uO1xuICB0aGlzLl92ZXJzaW9uID0gc3RyO1xuICBmbGFncyA9IGZsYWdzIHx8ICctViwgLS12ZXJzaW9uJztcbiAgdmFyIHZlcnNpb25PcHRpb24gPSBuZXcgT3B0aW9uKGZsYWdzLCAnb3V0cHV0IHRoZSB2ZXJzaW9uIG51bWJlcicpO1xuICB0aGlzLl92ZXJzaW9uT3B0aW9uTmFtZSA9IHZlcnNpb25PcHRpb24ubG9uZy5zdWJzdHIoMikgfHwgJ3ZlcnNpb24nO1xuICB0aGlzLm9wdGlvbnMucHVzaCh2ZXJzaW9uT3B0aW9uKTtcbiAgdGhpcy5vbignb3B0aW9uOicgKyB0aGlzLl92ZXJzaW9uT3B0aW9uTmFtZSwgZnVuY3Rpb24oKSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoc3RyICsgJ1xcbicpO1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGRlc2NyaXB0aW9uIHRvIGBzdHJgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzRGVzY3JpcHRpb25cbiAqIEByZXR1cm4ge1N0cmluZ3xDb21tYW5kfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS5kZXNjcmlwdGlvbiA9IGZ1bmN0aW9uKHN0ciwgYXJnc0Rlc2NyaXB0aW9uKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdGhpcy5fZGVzY3JpcHRpb247XG4gIHRoaXMuX2Rlc2NyaXB0aW9uID0gc3RyO1xuICB0aGlzLl9hcmdzRGVzY3JpcHRpb24gPSBhcmdzRGVzY3JpcHRpb247XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgYW4gYWxpYXMgZm9yIHRoZSBjb21tYW5kXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGFsaWFzXG4gKiBAcmV0dXJuIHtTdHJpbmd8Q29tbWFuZH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUuYWxpYXMgPSBmdW5jdGlvbihhbGlhcykge1xuICB2YXIgY29tbWFuZCA9IHRoaXM7XG4gIGlmICh0aGlzLmNvbW1hbmRzLmxlbmd0aCAhPT0gMCkge1xuICAgIGNvbW1hbmQgPSB0aGlzLmNvbW1hbmRzW3RoaXMuY29tbWFuZHMubGVuZ3RoIC0gMV07XG4gIH1cblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGNvbW1hbmQuX2FsaWFzO1xuXG4gIGlmIChhbGlhcyA9PT0gY29tbWFuZC5fbmFtZSkgdGhyb3cgbmV3IEVycm9yKCdDb21tYW5kIGFsaWFzIGNhblxcJ3QgYmUgdGhlIHNhbWUgYXMgaXRzIG5hbWUnKTtcblxuICBjb21tYW5kLl9hbGlhcyA9IGFsaWFzO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IC8gZ2V0IHRoZSBjb21tYW5kIHVzYWdlIGBzdHJgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge1N0cmluZ3xDb21tYW5kfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS51c2FnZSA9IGZ1bmN0aW9uKHN0cikge1xuICB2YXIgYXJncyA9IHRoaXMuX2FyZ3MubWFwKGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBodW1hblJlYWRhYmxlQXJnTmFtZShhcmcpO1xuICB9KTtcblxuICB2YXIgdXNhZ2UgPSAnW29wdGlvbnNdJyArXG4gICAgKHRoaXMuY29tbWFuZHMubGVuZ3RoID8gJyBbY29tbWFuZF0nIDogJycpICtcbiAgICAodGhpcy5fYXJncy5sZW5ndGggPyAnICcgKyBhcmdzLmpvaW4oJyAnKSA6ICcnKTtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRoaXMuX3VzYWdlIHx8IHVzYWdlO1xuICB0aGlzLl91c2FnZSA9IHN0cjtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogR2V0IG9yIHNldCB0aGUgbmFtZSBvZiB0aGUgY29tbWFuZFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge1N0cmluZ3xDb21tYW5kfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS5uYW1lID0gZnVuY3Rpb24oc3RyKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdGhpcy5fbmFtZTtcbiAgdGhpcy5fbmFtZSA9IHN0cjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJldHVybiBwcmVwYXJlZCBjb21tYW5kcy5cbiAqXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbkNvbW1hbmQucHJvdG90eXBlLnByZXBhcmVDb21tYW5kcyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5jb21tYW5kcy5maWx0ZXIoZnVuY3Rpb24oY21kKSB7XG4gICAgcmV0dXJuICFjbWQuX25vSGVscDtcbiAgfSkubWFwKGZ1bmN0aW9uKGNtZCkge1xuICAgIHZhciBhcmdzID0gY21kLl9hcmdzLm1hcChmdW5jdGlvbihhcmcpIHtcbiAgICAgIHJldHVybiBodW1hblJlYWRhYmxlQXJnTmFtZShhcmcpO1xuICAgIH0pLmpvaW4oJyAnKTtcblxuICAgIHJldHVybiBbXG4gICAgICBjbWQuX25hbWUgK1xuICAgICAgICAoY21kLl9hbGlhcyA/ICd8JyArIGNtZC5fYWxpYXMgOiAnJykgK1xuICAgICAgICAoY21kLm9wdGlvbnMubGVuZ3RoID8gJyBbb3B0aW9uc10nIDogJycpICtcbiAgICAgICAgKGFyZ3MgPyAnICcgKyBhcmdzIDogJycpLFxuICAgICAgY21kLl9kZXNjcmlwdGlvblxuICAgIF07XG4gIH0pO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGxhcmdlc3QgY29tbWFuZCBsZW5ndGguXG4gKlxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUubGFyZ2VzdENvbW1hbmRMZW5ndGggPSBmdW5jdGlvbigpIHtcbiAgdmFyIGNvbW1hbmRzID0gdGhpcy5wcmVwYXJlQ29tbWFuZHMoKTtcbiAgcmV0dXJuIGNvbW1hbmRzLnJlZHVjZShmdW5jdGlvbihtYXgsIGNvbW1hbmQpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgobWF4LCBjb21tYW5kWzBdLmxlbmd0aCk7XG4gIH0sIDApO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGxhcmdlc3Qgb3B0aW9uIGxlbmd0aC5cbiAqXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS5sYXJnZXN0T3B0aW9uTGVuZ3RoID0gZnVuY3Rpb24oKSB7XG4gIHZhciBvcHRpb25zID0gW10uc2xpY2UuY2FsbCh0aGlzLm9wdGlvbnMpO1xuICBvcHRpb25zLnB1c2goe1xuICAgIGZsYWdzOiAnLWgsIC0taGVscCdcbiAgfSk7XG4gIHJldHVybiBvcHRpb25zLnJlZHVjZShmdW5jdGlvbihtYXgsIG9wdGlvbikge1xuICAgIHJldHVybiBNYXRoLm1heChtYXgsIG9wdGlvbi5mbGFncy5sZW5ndGgpO1xuICB9LCAwKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBsYXJnZXN0IGFyZyBsZW5ndGguXG4gKlxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUubGFyZ2VzdEFyZ0xlbmd0aCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fYXJncy5yZWR1Y2UoZnVuY3Rpb24obWF4LCBhcmcpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgobWF4LCBhcmcubmFtZS5sZW5ndGgpO1xuICB9LCAwKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBwYWQgd2lkdGguXG4gKlxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUucGFkV2lkdGggPSBmdW5jdGlvbigpIHtcbiAgdmFyIHdpZHRoID0gdGhpcy5sYXJnZXN0T3B0aW9uTGVuZ3RoKCk7XG4gIGlmICh0aGlzLl9hcmdzRGVzY3JpcHRpb24gJiYgdGhpcy5fYXJncy5sZW5ndGgpIHtcbiAgICBpZiAodGhpcy5sYXJnZXN0QXJnTGVuZ3RoKCkgPiB3aWR0aCkge1xuICAgICAgd2lkdGggPSB0aGlzLmxhcmdlc3RBcmdMZW5ndGgoKTtcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5jb21tYW5kcyAmJiB0aGlzLmNvbW1hbmRzLmxlbmd0aCkge1xuICAgIGlmICh0aGlzLmxhcmdlc3RDb21tYW5kTGVuZ3RoKCkgPiB3aWR0aCkge1xuICAgICAgd2lkdGggPSB0aGlzLmxhcmdlc3RDb21tYW5kTGVuZ3RoKCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdpZHRoO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gaGVscCBmb3Igb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS5vcHRpb25IZWxwID0gZnVuY3Rpb24oKSB7XG4gIHZhciB3aWR0aCA9IHRoaXMucGFkV2lkdGgoKTtcblxuICAvLyBBcHBlbmQgdGhlIGhlbHAgaW5mb3JtYXRpb25cbiAgcmV0dXJuIHRoaXMub3B0aW9ucy5tYXAoZnVuY3Rpb24ob3B0aW9uKSB7XG4gICAgcmV0dXJuIHBhZChvcHRpb24uZmxhZ3MsIHdpZHRoKSArICcgICcgKyBvcHRpb24uZGVzY3JpcHRpb24gK1xuICAgICAgKChvcHRpb24uYm9vbCAmJiBvcHRpb24uZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpID8gJyAoZGVmYXVsdDogJyArIEpTT04uc3RyaW5naWZ5KG9wdGlvbi5kZWZhdWx0VmFsdWUpICsgJyknIDogJycpO1xuICB9KS5jb25jYXQoW3BhZCgnLWgsIC0taGVscCcsIHdpZHRoKSArICcgICcgKyAnb3V0cHV0IHVzYWdlIGluZm9ybWF0aW9uJ10pXG4gICAgLmpvaW4oJ1xcbicpO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gY29tbWFuZCBoZWxwIGRvY3VtZW50YXRpb24uXG4gKlxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUuY29tbWFuZEhlbHAgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCF0aGlzLmNvbW1hbmRzLmxlbmd0aCkgcmV0dXJuICcnO1xuXG4gIHZhciBjb21tYW5kcyA9IHRoaXMucHJlcGFyZUNvbW1hbmRzKCk7XG4gIHZhciB3aWR0aCA9IHRoaXMucGFkV2lkdGgoKTtcblxuICByZXR1cm4gW1xuICAgICdDb21tYW5kczonLFxuICAgIGNvbW1hbmRzLm1hcChmdW5jdGlvbihjbWQpIHtcbiAgICAgIHZhciBkZXNjID0gY21kWzFdID8gJyAgJyArIGNtZFsxXSA6ICcnO1xuICAgICAgcmV0dXJuIChkZXNjID8gcGFkKGNtZFswXSwgd2lkdGgpIDogY21kWzBdKSArIGRlc2M7XG4gICAgfSkuam9pbignXFxuJykucmVwbGFjZSgvXi9nbSwgJyAgJyksXG4gICAgJydcbiAgXS5qb2luKCdcXG4nKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHByb2dyYW0gaGVscCBkb2N1bWVudGF0aW9uLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbkNvbW1hbmQucHJvdG90eXBlLmhlbHBJbmZvcm1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZGVzYyA9IFtdO1xuICBpZiAodGhpcy5fZGVzY3JpcHRpb24pIHtcbiAgICBkZXNjID0gW1xuICAgICAgdGhpcy5fZGVzY3JpcHRpb24sXG4gICAgICAnJ1xuICAgIF07XG5cbiAgICB2YXIgYXJnc0Rlc2NyaXB0aW9uID0gdGhpcy5fYXJnc0Rlc2NyaXB0aW9uO1xuICAgIGlmIChhcmdzRGVzY3JpcHRpb24gJiYgdGhpcy5fYXJncy5sZW5ndGgpIHtcbiAgICAgIHZhciB3aWR0aCA9IHRoaXMucGFkV2lkdGgoKTtcbiAgICAgIGRlc2MucHVzaCgnQXJndW1lbnRzOicpO1xuICAgICAgZGVzYy5wdXNoKCcnKTtcbiAgICAgIHRoaXMuX2FyZ3MuZm9yRWFjaChmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgZGVzYy5wdXNoKCcgICcgKyBwYWQoYXJnLm5hbWUsIHdpZHRoKSArICcgICcgKyBhcmdzRGVzY3JpcHRpb25bYXJnLm5hbWVdKTtcbiAgICAgIH0pO1xuICAgICAgZGVzYy5wdXNoKCcnKTtcbiAgICB9XG4gIH1cblxuICB2YXIgY21kTmFtZSA9IHRoaXMuX25hbWU7XG4gIGlmICh0aGlzLl9hbGlhcykge1xuICAgIGNtZE5hbWUgPSBjbWROYW1lICsgJ3wnICsgdGhpcy5fYWxpYXM7XG4gIH1cbiAgdmFyIHVzYWdlID0gW1xuICAgICdVc2FnZTogJyArIGNtZE5hbWUgKyAnICcgKyB0aGlzLnVzYWdlKCksXG4gICAgJydcbiAgXTtcblxuICB2YXIgY21kcyA9IFtdO1xuICB2YXIgY29tbWFuZEhlbHAgPSB0aGlzLmNvbW1hbmRIZWxwKCk7XG4gIGlmIChjb21tYW5kSGVscCkgY21kcyA9IFtjb21tYW5kSGVscF07XG5cbiAgdmFyIG9wdGlvbnMgPSBbXG4gICAgJ09wdGlvbnM6JyxcbiAgICAnJyArIHRoaXMub3B0aW9uSGVscCgpLnJlcGxhY2UoL14vZ20sICcgICcpLFxuICAgICcnXG4gIF07XG5cbiAgcmV0dXJuIHVzYWdlXG4gICAgLmNvbmNhdChkZXNjKVxuICAgIC5jb25jYXQob3B0aW9ucylcbiAgICAuY29uY2F0KGNtZHMpXG4gICAgLmpvaW4oJ1xcbicpO1xufTtcblxuLyoqXG4gKiBPdXRwdXQgaGVscCBpbmZvcm1hdGlvbiBmb3IgdGhpcyBjb21tYW5kXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS5vdXRwdXRIZWxwID0gZnVuY3Rpb24oY2IpIHtcbiAgaWYgKCFjYikge1xuICAgIGNiID0gZnVuY3Rpb24ocGFzc3RocnUpIHtcbiAgICAgIHJldHVybiBwYXNzdGhydTtcbiAgICB9O1xuICB9XG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGNiKHRoaXMuaGVscEluZm9ybWF0aW9uKCkpKTtcbiAgdGhpcy5lbWl0KCctLWhlbHAnKTtcbn07XG5cbi8qKlxuICogT3V0cHV0IGhlbHAgaW5mb3JtYXRpb24gYW5kIGV4aXQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS5oZWxwID0gZnVuY3Rpb24oY2IpIHtcbiAgdGhpcy5vdXRwdXRIZWxwKGNiKTtcbiAgcHJvY2Vzcy5leGl0KCk7XG59O1xuXG4vKipcbiAqIENhbWVsLWNhc2UgdGhlIGdpdmVuIGBmbGFnYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmbGFnXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjYW1lbGNhc2UoZmxhZykge1xuICByZXR1cm4gZmxhZy5zcGxpdCgnLScpLnJlZHVjZShmdW5jdGlvbihzdHIsIHdvcmQpIHtcbiAgICByZXR1cm4gc3RyICsgd29yZFswXS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUGFkIGBzdHJgIHRvIGB3aWR0aGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYWQoc3RyLCB3aWR0aCkge1xuICB2YXIgbGVuID0gTWF0aC5tYXgoMCwgd2lkdGggLSBzdHIubGVuZ3RoKTtcbiAgcmV0dXJuIHN0ciArIEFycmF5KGxlbiArIDEpLmpvaW4oJyAnKTtcbn1cblxuLyoqXG4gKiBPdXRwdXQgaGVscCBpbmZvcm1hdGlvbiBpZiBuZWNlc3NhcnlcbiAqXG4gKiBAcGFyYW0ge0NvbW1hbmR9IGNvbW1hbmQgdG8gb3V0cHV0IGhlbHAgZm9yXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBvcHRpb25zIHRvIHNlYXJjaCBmb3IgLWggb3IgLS1oZWxwXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBvdXRwdXRIZWxwSWZOZWNlc3NhcnkoY21kLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAob3B0aW9uc1tpXSA9PT0gJy0taGVscCcgfHwgb3B0aW9uc1tpXSA9PT0gJy1oJykge1xuICAgICAgY21kLm91dHB1dEhlbHAoKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUYWtlcyBhbiBhcmd1bWVudCBhbiByZXR1cm5zIGl0cyBodW1hbiByZWFkYWJsZSBlcXVpdmFsZW50IGZvciBoZWxwIHVzYWdlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGh1bWFuUmVhZGFibGVBcmdOYW1lKGFyZykge1xuICB2YXIgbmFtZU91dHB1dCA9IGFyZy5uYW1lICsgKGFyZy52YXJpYWRpYyA9PT0gdHJ1ZSA/ICcuLi4nIDogJycpO1xuXG4gIHJldHVybiBhcmcucmVxdWlyZWRcbiAgICA/ICc8JyArIG5hbWVPdXRwdXQgKyAnPidcbiAgICA6ICdbJyArIG5hbWVPdXRwdXQgKyAnXSc7XG59XG5cbi8vIGZvciB2ZXJzaW9ucyBiZWZvcmUgbm9kZSB2MC44IHdoZW4gdGhlcmUgd2VyZW4ndCBgZnMuZXhpc3RzU3luY2BcbmZ1bmN0aW9uIGV4aXN0cyhmaWxlKSB7XG4gIHRyeSB7XG4gICAgaWYgKGZzLnN0YXRTeW5jKGZpbGUpLmlzRmlsZSgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsICIvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuLyogZ2xvYmFsIGdsb2JhbCwgZGVmaW5lLCBTeXN0ZW0sIFJlZmxlY3QsIFByb21pc2UgKi9cclxudmFyIF9fZXh0ZW5kcztcclxudmFyIF9fYXNzaWduO1xyXG52YXIgX19yZXN0O1xyXG52YXIgX19kZWNvcmF0ZTtcclxudmFyIF9fcGFyYW07XHJcbnZhciBfX21ldGFkYXRhO1xyXG52YXIgX19hd2FpdGVyO1xyXG52YXIgX19nZW5lcmF0b3I7XHJcbnZhciBfX2V4cG9ydFN0YXI7XHJcbnZhciBfX3ZhbHVlcztcclxudmFyIF9fcmVhZDtcclxudmFyIF9fc3ByZWFkO1xyXG52YXIgX19zcHJlYWRBcnJheXM7XHJcbnZhciBfX2F3YWl0O1xyXG52YXIgX19hc3luY0dlbmVyYXRvcjtcclxudmFyIF9fYXN5bmNEZWxlZ2F0b3I7XHJcbnZhciBfX2FzeW5jVmFsdWVzO1xyXG52YXIgX19tYWtlVGVtcGxhdGVPYmplY3Q7XHJcbnZhciBfX2ltcG9ydFN0YXI7XHJcbnZhciBfX2ltcG9ydERlZmF1bHQ7XHJcbnZhciBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0O1xyXG52YXIgX19jbGFzc1ByaXZhdGVGaWVsZFNldDtcclxudmFyIF9fY3JlYXRlQmluZGluZztcclxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XHJcbiAgICB2YXIgcm9vdCA9IHR5cGVvZiBnbG9iYWwgPT09IFwib2JqZWN0XCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiA9PT0gXCJvYmplY3RcIiA/IHNlbGYgOiB0eXBlb2YgdGhpcyA9PT0gXCJvYmplY3RcIiA/IHRoaXMgOiB7fTtcclxuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xyXG4gICAgICAgIGRlZmluZShcInRzbGliXCIsIFtcImV4cG9ydHNcIl0sIGZ1bmN0aW9uIChleHBvcnRzKSB7IGZhY3RvcnkoY3JlYXRlRXhwb3J0ZXIocm9vdCwgY3JlYXRlRXhwb3J0ZXIoZXhwb3J0cykpKTsgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgIGZhY3RvcnkoY3JlYXRlRXhwb3J0ZXIocm9vdCwgY3JlYXRlRXhwb3J0ZXIobW9kdWxlLmV4cG9ydHMpKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBmYWN0b3J5KGNyZWF0ZUV4cG9ydGVyKHJvb3QpKTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGNyZWF0ZUV4cG9ydGVyKGV4cG9ydHMsIHByZXZpb3VzKSB7XHJcbiAgICAgICAgaWYgKGV4cG9ydHMgIT09IHJvb3QpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChpZCwgdikgeyByZXR1cm4gZXhwb3J0c1tpZF0gPSBwcmV2aW91cyA/IHByZXZpb3VzKGlkLCB2KSA6IHY7IH07XHJcbiAgICB9XHJcbn0pXHJcbihmdW5jdGlvbiAoZXhwb3J0ZXIpIHtcclxuICAgIHZhciBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9O1xyXG5cclxuICAgIF9fZXh0ZW5kcyA9IGZ1bmN0aW9uIChkLCBiKSB7XHJcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH07XHJcblxyXG4gICAgX19yZXN0ID0gZnVuY3Rpb24gKHMsIGUpIHtcclxuICAgICAgICB2YXIgdCA9IHt9O1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgICAgICB0W3BdID0gc1twXTtcclxuICAgICAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2RlY29yYXRlID0gZnVuY3Rpb24gKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICAgICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICAgICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxuICAgIH07XHJcblxyXG4gICAgX19wYXJhbSA9IGZ1bmN0aW9uIChwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxuICAgIH07XHJcblxyXG4gICAgX19tZXRhZGF0YSA9IGZ1bmN0aW9uIChtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fYXdhaXRlciA9IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgICAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgICAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2dlbmVyYXRvciA9IGZ1bmN0aW9uICh0aGlzQXJnLCBib2R5KSB7XHJcbiAgICAgICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgICAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgICAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICAgICAgd2hpbGUgKF8pIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIF9fY3JlYXRlQmluZGluZyA9IGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICAgICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgICAgICBvW2syXSA9IG1ba107XHJcbiAgICB9O1xyXG5cclxuICAgIF9fZXhwb3J0U3RhciA9IGZ1bmN0aW9uIChtLCBleHBvcnRzKSB7XHJcbiAgICAgICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIWV4cG9ydHMuaGFzT3duUHJvcGVydHkocCkpIGV4cG9ydHNbcF0gPSBtW3BdO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX3ZhbHVlcyA9IGZ1bmN0aW9uIChvKSB7XHJcbiAgICAgICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgICAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgICAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIH07XHJcblxyXG4gICAgX19yZWFkID0gZnVuY3Rpb24gKG8sIG4pIHtcclxuICAgICAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICAgICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgICAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFyO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX3NwcmVhZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgICAgIHJldHVybiBhcjtcclxuICAgIH07XHJcblxyXG4gICAgX19zcHJlYWRBcnJheXMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICAgICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgICAgIHJldHVybiByO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2F3YWl0ID0gZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxuICAgIH07XHJcblxyXG4gICAgX19hc3luY0dlbmVyYXRvciA9IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICAgICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7ICB9XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgICAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbiAgICB9O1xyXG5cclxuICAgIF9fYXN5bmNEZWxlZ2F0b3IgPSBmdW5jdGlvbiAobykge1xyXG4gICAgICAgIHZhciBpLCBwO1xyXG4gICAgICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICAgICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG4gICAgfTtcclxuXHJcbiAgICBfX2FzeW5jVmFsdWVzID0gZnVuY3Rpb24gKG8pIHtcclxuICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICAgICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgICAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbiAgICB9O1xyXG5cclxuICAgIF9fbWFrZVRlbXBsYXRlT2JqZWN0ID0gZnVuY3Rpb24gKGNvb2tlZCwgcmF3KSB7XHJcbiAgICAgICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgICAgICByZXR1cm4gY29va2VkO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2ltcG9ydFN0YXIgPSBmdW5jdGlvbiAobW9kKSB7XHJcbiAgICAgICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgICAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICAgICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcclxuICAgICAgICByZXN1bHRbXCJkZWZhdWx0XCJdID0gbW9kO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9O1xyXG5cclxuICAgIF9faW1wb3J0RGVmYXVsdCA9IGZ1bmN0aW9uIChtb2QpIHtcclxuICAgICAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcclxuICAgIH07XHJcblxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCA9IGZ1bmN0aW9uIChyZWNlaXZlciwgcHJpdmF0ZU1hcCkge1xyXG4gICAgICAgIGlmICghcHJpdmF0ZU1hcC5oYXMocmVjZWl2ZXIpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gZ2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcHJpdmF0ZU1hcC5nZXQocmVjZWl2ZXIpO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0ID0gZnVuY3Rpb24gKHJlY2VpdmVyLCBwcml2YXRlTWFwLCB2YWx1ZSkge1xyXG4gICAgICAgIGlmICghcHJpdmF0ZU1hcC5oYXMocmVjZWl2ZXIpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gc2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwcml2YXRlTWFwLnNldChyZWNlaXZlciwgdmFsdWUpO1xyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH07XHJcblxyXG4gICAgZXhwb3J0ZXIoXCJfX2V4dGVuZHNcIiwgX19leHRlbmRzKTtcclxuICAgIGV4cG9ydGVyKFwiX19hc3NpZ25cIiwgX19hc3NpZ24pO1xyXG4gICAgZXhwb3J0ZXIoXCJfX3Jlc3RcIiwgX19yZXN0KTtcclxuICAgIGV4cG9ydGVyKFwiX19kZWNvcmF0ZVwiLCBfX2RlY29yYXRlKTtcclxuICAgIGV4cG9ydGVyKFwiX19wYXJhbVwiLCBfX3BhcmFtKTtcclxuICAgIGV4cG9ydGVyKFwiX19tZXRhZGF0YVwiLCBfX21ldGFkYXRhKTtcclxuICAgIGV4cG9ydGVyKFwiX19hd2FpdGVyXCIsIF9fYXdhaXRlcik7XHJcbiAgICBleHBvcnRlcihcIl9fZ2VuZXJhdG9yXCIsIF9fZ2VuZXJhdG9yKTtcclxuICAgIGV4cG9ydGVyKFwiX19leHBvcnRTdGFyXCIsIF9fZXhwb3J0U3Rhcik7XHJcbiAgICBleHBvcnRlcihcIl9fY3JlYXRlQmluZGluZ1wiLCBfX2NyZWF0ZUJpbmRpbmcpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX3ZhbHVlc1wiLCBfX3ZhbHVlcyk7XHJcbiAgICBleHBvcnRlcihcIl9fcmVhZFwiLCBfX3JlYWQpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX3NwcmVhZFwiLCBfX3NwcmVhZCk7XHJcbiAgICBleHBvcnRlcihcIl9fc3ByZWFkQXJyYXlzXCIsIF9fc3ByZWFkQXJyYXlzKTtcclxuICAgIGV4cG9ydGVyKFwiX19hd2FpdFwiLCBfX2F3YWl0KTtcclxuICAgIGV4cG9ydGVyKFwiX19hc3luY0dlbmVyYXRvclwiLCBfX2FzeW5jR2VuZXJhdG9yKTtcclxuICAgIGV4cG9ydGVyKFwiX19hc3luY0RlbGVnYXRvclwiLCBfX2FzeW5jRGVsZWdhdG9yKTtcclxuICAgIGV4cG9ydGVyKFwiX19hc3luY1ZhbHVlc1wiLCBfX2FzeW5jVmFsdWVzKTtcclxuICAgIGV4cG9ydGVyKFwiX19tYWtlVGVtcGxhdGVPYmplY3RcIiwgX19tYWtlVGVtcGxhdGVPYmplY3QpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2ltcG9ydFN0YXJcIiwgX19pbXBvcnRTdGFyKTtcclxuICAgIGV4cG9ydGVyKFwiX19pbXBvcnREZWZhdWx0XCIsIF9faW1wb3J0RGVmYXVsdCk7XHJcbiAgICBleHBvcnRlcihcIl9fY2xhc3NQcml2YXRlRmllbGRHZXRcIiwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCk7XHJcbiAgICBleHBvcnRlcihcIl9fY2xhc3NQcml2YXRlRmllbGRTZXRcIiwgX19jbGFzc1ByaXZhdGVGaWVsZFNldCk7XHJcbn0pO1xyXG4iLCAiLyoqIENvbnNvbGUgbG9nZ2luZyB2ZXJib3NpdHkgZm9yIHRoZSBTREsuICovXG5leHBvcnQgZW51bSBMb2dMZXZlbCB7XG4gIC8qKiBObyBsb2dzIHdpbGwgYmUgZ2VuZXJhdGVkLiAqL1xuICBOb25lID0gMCxcbiAgLyoqIE9ubHkgU0RLIGludGVybmFsIGVycm9ycyB3aWxsIGJlIGxvZ2dlZC4gKi9cbiAgRXJyb3IgPSAxLFxuICAvKiogSW5mb3JtYXRpb24gdXNlZnVsIGZvciBkZWJ1Z2dpbmcgdGhlIFNESyB3aWxsIGJlIGxvZ2dlZC4gKi9cbiAgRGVidWcgPSAyLFxuICAvKiogQWxsIFNESyBhY3Rpb25zIHdpbGwgYmUgbG9nZ2VkLiAqL1xuICBWZXJib3NlID0gMyxcbn1cbiIsICJpbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi91c2VyJztcblxuLyoqXG4gKiBAaW5oZXJpdGRvY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlc3Npb24gZXh0ZW5kcyBTZXNzaW9uQ29udGV4dCB7XG4gIC8qKiBKU0RvYyAqL1xuICB1cGRhdGUoY29udGV4dD86IFNlc3Npb25Db250ZXh0KTogdm9pZDtcblxuICAvKiogSlNEb2MgKi9cbiAgY2xvc2Uoc3RhdHVzPzogU2Vzc2lvblN0YXR1cyk6IHZvaWQ7XG5cbiAgLyoqIEpTRG9jICovXG4gIHRvSlNPTigpOiB7XG4gICAgaW5pdDogYm9vbGVhbjtcbiAgICBzaWQ6IHN0cmluZztcbiAgICBkaWQ/OiBzdHJpbmc7XG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgc3RhcnRlZDogc3RyaW5nO1xuICAgIGR1cmF0aW9uPzogbnVtYmVyO1xuICAgIHN0YXR1czogU2Vzc2lvblN0YXR1cztcbiAgICBlcnJvcnM6IG51bWJlcjtcbiAgICBhdHRycz86IHtcbiAgICAgIHJlbGVhc2U/OiBzdHJpbmc7XG4gICAgICBlbnZpcm9ubWVudD86IHN0cmluZztcbiAgICAgIHVzZXJfYWdlbnQ/OiBzdHJpbmc7XG4gICAgICBpcF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdFNlc3Npb24ge1xuICBzdGF0dXM/OiBSZXF1ZXN0U2Vzc2lvblN0YXR1cztcbn1cblxuLyoqXG4gKiBTZXNzaW9uIENvbnRleHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXNzaW9uQ29udGV4dCB7XG4gIHNpZD86IHN0cmluZztcbiAgZGlkPzogc3RyaW5nO1xuICBpbml0PzogYm9vbGVhbjtcbiAgLy8gc2Vjb25kcyBzaW5jZSB0aGUgVU5JWCBlcG9jaFxuICB0aW1lc3RhbXA/OiBudW1iZXI7XG4gIC8vIHNlY29uZHMgc2luY2UgdGhlIFVOSVggZXBvY2hcbiAgc3RhcnRlZD86IG51bWJlcjtcbiAgZHVyYXRpb24/OiBudW1iZXI7XG4gIHN0YXR1cz86IFNlc3Npb25TdGF0dXM7XG4gIHJlbGVhc2U/OiBzdHJpbmc7XG4gIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICB1c2VyQWdlbnQ/OiBzdHJpbmc7XG4gIGlwQWRkcmVzcz86IHN0cmluZztcbiAgZXJyb3JzPzogbnVtYmVyO1xuICB1c2VyPzogVXNlciB8IG51bGw7XG4gIGlnbm9yZUR1cmF0aW9uPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBTZXNzaW9uIFN0YXR1c1xuICovXG5leHBvcnQgZW51bSBTZXNzaW9uU3RhdHVzIHtcbiAgLyoqIEpTRG9jICovXG4gIE9rID0gJ29rJyxcbiAgLyoqIEpTRG9jICovXG4gIEV4aXRlZCA9ICdleGl0ZWQnLFxuICAvKiogSlNEb2MgKi9cbiAgQ3Jhc2hlZCA9ICdjcmFzaGVkJyxcbiAgLyoqIEpTRG9jICovXG4gIEFibm9ybWFsID0gJ2Fibm9ybWFsJyxcbn1cblxuZXhwb3J0IGVudW0gUmVxdWVzdFNlc3Npb25TdGF0dXMge1xuICAvKiogSlNEb2MgKi9cbiAgT2sgPSAnb2snLFxuICAvKiogSlNEb2MgKi9cbiAgRXJyb3JlZCA9ICdlcnJvcmVkJyxcbiAgLyoqIEpTRG9jICovXG4gIENyYXNoZWQgPSAnY3Jhc2hlZCcsXG59XG5cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXNzaW9uQWdncmVnYXRlcyB7XG4gIGF0dHJzPzoge1xuICAgIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICAgIHJlbGVhc2U/OiBzdHJpbmc7XG4gIH07XG4gIGFnZ3JlZ2F0ZXM6IEFycmF5PEFnZ3JlZ2F0aW9uQ291bnRzPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXNzaW9uRmx1c2hlckxpa2Uge1xuICAvKipcbiAgICogSW5jcmVtZW50cyB0aGUgU2Vzc2lvbiBTdGF0dXMgYnVja2V0IGluIFNlc3Npb25BZ2dyZWdhdGVzIE9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdGF0dXMgb2YgdGhlIHNlc3Npb25cbiAgICogY2FwdHVyZWRcbiAgICovXG4gIGluY3JlbWVudFNlc3Npb25TdGF0dXNDb3VudCgpOiB2b2lkO1xuXG4gIC8qKiBTdWJtaXRzIHRoZSBhZ2dyZWdhdGVzIHJlcXVlc3QgbW9kZSBzZXNzaW9ucyB0byBTZW50cnkgKi9cbiAgc2VuZFNlc3Npb25BZ2dyZWdhdGVzKHNlc3Npb25BZ2dyZWdhdGVzOiBTZXNzaW9uQWdncmVnYXRlcyk6IHZvaWQ7XG5cbiAgLyoqIEVtcHRpZXMgQWdncmVnYXRlIEJ1Y2tldHMgYW5kIFNlbmRzIHRoZW0gdG8gVHJhbnNwb3J0IEJ1ZmZlciAqL1xuICBmbHVzaCgpOiB2b2lkO1xuXG4gIC8qKiBDbGVhcnMgc2V0SW50ZXJ2YWwgYW5kIGNhbGxzIGZsdXNoICovXG4gIGNsb3NlKCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWdncmVnYXRpb25Db3VudHMge1xuICBzdGFydGVkOiBzdHJpbmc7XG4gIGVycm9yZWQ/OiBudW1iZXI7XG4gIGV4aXRlZD86IG51bWJlcjtcbiAgY3Jhc2hlZD86IG51bWJlcjtcbn1cbiIsICIvKiogSlNEb2MgKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvZXhwb3J0XG5leHBvcnQgZW51bSBTZXZlcml0eSB7XG4gIC8qKiBKU0RvYyAqL1xuICBGYXRhbCA9ICdmYXRhbCcsXG4gIC8qKiBKU0RvYyAqL1xuICBFcnJvciA9ICdlcnJvcicsXG4gIC8qKiBKU0RvYyAqL1xuICBXYXJuaW5nID0gJ3dhcm5pbmcnLFxuICAvKiogSlNEb2MgKi9cbiAgTG9nID0gJ2xvZycsXG4gIC8qKiBKU0RvYyAqL1xuICBJbmZvID0gJ2luZm8nLFxuICAvKiogSlNEb2MgKi9cbiAgRGVidWcgPSAnZGVidWcnLFxuICAvKiogSlNEb2MgKi9cbiAgQ3JpdGljYWwgPSAnY3JpdGljYWwnLFxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5hbWVzcGFjZSwgaW1wb3J0L2V4cG9ydFxuZXhwb3J0IG5hbWVzcGFjZSBTZXZlcml0eSB7XG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHN0cmluZy1iYXNlZCBsZXZlbCBpbnRvIGEge0BsaW5rIFNldmVyaXR5fS5cbiAgICpcbiAgICogQHBhcmFtIGxldmVsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBTZXZlcml0eVxuICAgKiBAcmV0dXJucyBTZXZlcml0eVxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGZyb21TdHJpbmcobGV2ZWw6IHN0cmluZyk6IFNldmVyaXR5IHtcbiAgICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgICBjYXNlICdkZWJ1Zyc6XG4gICAgICAgIHJldHVybiBTZXZlcml0eS5EZWJ1ZztcbiAgICAgIGNhc2UgJ2luZm8nOlxuICAgICAgICByZXR1cm4gU2V2ZXJpdHkuSW5mbztcbiAgICAgIGNhc2UgJ3dhcm4nOlxuICAgICAgY2FzZSAnd2FybmluZyc6XG4gICAgICAgIHJldHVybiBTZXZlcml0eS5XYXJuaW5nO1xuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICByZXR1cm4gU2V2ZXJpdHkuRXJyb3I7XG4gICAgICBjYXNlICdmYXRhbCc6XG4gICAgICAgIHJldHVybiBTZXZlcml0eS5GYXRhbDtcbiAgICAgIGNhc2UgJ2NyaXRpY2FsJzpcbiAgICAgICAgcmV0dXJuIFNldmVyaXR5LkNyaXRpY2FsO1xuICAgICAgY2FzZSAnbG9nJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBTZXZlcml0eS5Mb2c7XG4gICAgfVxuICB9XG59XG4iLCAiLyoqIFRoZSBzdGF0dXMgb2YgYW4gZXZlbnQuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L2V4cG9ydFxuZXhwb3J0IGVudW0gU3RhdHVzIHtcbiAgLyoqIFRoZSBzdGF0dXMgY291bGQgbm90IGJlIGRldGVybWluZWQuICovXG4gIFVua25vd24gPSAndW5rbm93bicsXG4gIC8qKiBUaGUgZXZlbnQgd2FzIHNraXBwZWQgZHVlIHRvIGNvbmZpZ3VyYXRpb24gb3IgY2FsbGJhY2tzLiAqL1xuICBTa2lwcGVkID0gJ3NraXBwZWQnLFxuICAvKiogVGhlIGV2ZW50IHdhcyBzZW50IHRvIFNlbnRyeSBzdWNjZXNzZnVsbHkuICovXG4gIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gIC8qKiBUaGUgY2xpZW50IGlzIGN1cnJlbnRseSByYXRlIGxpbWl0ZWQgYW5kIHdpbGwgdHJ5IGFnYWluIGxhdGVyLiAqL1xuICBSYXRlTGltaXQgPSAncmF0ZV9saW1pdCcsXG4gIC8qKiBUaGUgZXZlbnQgY291bGQgbm90IGJlIHByb2Nlc3NlZC4gKi9cbiAgSW52YWxpZCA9ICdpbnZhbGlkJyxcbiAgLyoqIEEgc2VydmVyLXNpZGUgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHN1Ym1pc3Npb24uICovXG4gIEZhaWxlZCA9ICdmYWlsZWQnLFxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5hbWVzcGFjZSwgaW1wb3J0L2V4cG9ydFxuZXhwb3J0IG5hbWVzcGFjZSBTdGF0dXMge1xuICAvKipcbiAgICogQ29udmVydHMgYSBIVFRQIHN0YXR1cyBjb2RlIGludG8gYSB7QGxpbmsgU3RhdHVzfS5cbiAgICpcbiAgICogQHBhcmFtIGNvZGUgVGhlIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGUuXG4gICAqIEByZXR1cm5zIFRoZSBzZW5kIHN0YXR1cyBvciB7QGxpbmsgU3RhdHVzLlVua25vd259LlxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGZyb21IdHRwQ29kZShjb2RlOiBudW1iZXIpOiBTdGF0dXMge1xuICAgIGlmIChjb2RlID49IDIwMCAmJiBjb2RlIDwgMzAwKSB7XG4gICAgICByZXR1cm4gU3RhdHVzLlN1Y2Nlc3M7XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IDQyOSkge1xuICAgICAgcmV0dXJuIFN0YXR1cy5SYXRlTGltaXQ7XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPj0gNDAwICYmIGNvZGUgPCA1MDApIHtcbiAgICAgIHJldHVybiBTdGF0dXMuSW52YWxpZDtcbiAgICB9XG5cbiAgICBpZiAoY29kZSA+PSA1MDApIHtcbiAgICAgIHJldHVybiBTdGF0dXMuRmFpbGVkO1xuICAgIH1cblxuICAgIHJldHVybiBTdGF0dXMuVW5rbm93bjtcbiAgfVxufVxuIiwgImltcG9ydCB7IEV4dHJhY3RlZE5vZGVSZXF1ZXN0RGF0YSwgUHJpbWl0aXZlLCBXb3JrZXJMb2NhdGlvbiB9IGZyb20gJy4vbWlzYyc7XG5pbXBvcnQgeyBTcGFuLCBTcGFuQ29udGV4dCB9IGZyb20gJy4vc3Bhbic7XG5cbi8qKlxuICogSW50ZXJmYWNlIGhvbGRpbmcgVHJhbnNhY3Rpb24tc3BlY2lmaWMgcHJvcGVydGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uQ29udGV4dCBleHRlbmRzIFNwYW5Db250ZXh0IHtcbiAgLyoqXG4gICAqIEh1bWFuLXJlYWRhYmxlIGlkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBzZXRzIHRoZSBlbmQgdGltZXN0YW1wIG9mIHRoZSB0cmFuc2FjdGlvbiB0byB0aGUgaGlnaGVzdCB0aW1lc3RhbXAgb2YgY2hpbGQgc3BhbnMsIHRyaW1taW5nXG4gICAqIHRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgaXMgdXNlZnVsIHRvIGRpc2NhcmQgZXh0cmEgdGltZSBpbiB0aGUgdHJhbnNhY3Rpb24gdGhhdCBpcyBub3RcbiAgICogYWNjb3VudGVkIGZvciBpbiBjaGlsZCBzcGFucywgbGlrZSB3aGF0IGhhcHBlbnMgaW4gdGhlIGlkbGUgdHJhbnNhY3Rpb24gVHJhY2luZyBpbnRlZ3JhdGlvbiwgd2hlcmUgd2UgZmluaXNoIHRoZVxuICAgKiB0cmFuc2FjdGlvbiBhZnRlciBhIGdpdmVuIFwiaWRsZSB0aW1lXCIgYW5kIHdlIGRvbid0IHdhbnQgdGhpcyBcImlkbGUgdGltZVwiIHRvIGJlIHBhcnQgb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgdHJpbUVuZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgdHJhbnNhY3Rpb24gaGFzIGEgcGFyZW50LCB0aGUgcGFyZW50J3Mgc2FtcGxpbmcgZGVjaXNpb25cbiAgICovXG4gIHBhcmVudFNhbXBsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBNZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLCBmb3IgaW50ZXJuYWwgU0RLIHVzZS5cbiAgICovXG4gIG1ldGFkYXRhPzogVHJhbnNhY3Rpb25NZXRhZGF0YTtcbn1cblxuLyoqXG4gKiBEYXRhIHB1bGxlZCBmcm9tIGEgYHNlbnRyeS10cmFjZWAgaGVhZGVyXG4gKi9cbmV4cG9ydCB0eXBlIFRyYWNlcGFyZW50RGF0YSA9IFBpY2s8VHJhbnNhY3Rpb25Db250ZXh0LCAndHJhY2VJZCcgfCAncGFyZW50U3BhbklkJyB8ICdwYXJlbnRTYW1wbGVkJz47XG5cbi8qKlxuICogVHJhbnNhY3Rpb24gXCJDbGFzc1wiLCBpbmhlcml0cyBTcGFuIG9ubHkgaGFzIGBzZXROYW1lYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uIGV4dGVuZHMgVHJhbnNhY3Rpb25Db250ZXh0LCBTcGFuIHtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBzcGFuSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHRyYWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHN0YXJ0VGltZXN0YW1wOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICB0YWdzOiB7IFtrZXk6IHN0cmluZ106IFByaW1pdGl2ZSB9O1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgZGF0YTogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcblxuICAvKipcbiAgICogTWV0YWRhdGEgYWJvdXQgdGhlIHRyYW5zYWN0aW9uXG4gICAqL1xuICBtZXRhZGF0YTogVHJhbnNhY3Rpb25NZXRhZGF0YTtcblxuICAvKipcbiAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSB0cmFuc2FjdGlvblxuICAgKi9cbiAgc2V0TmFtZShuYW1lOiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8qKiBSZXR1cm5zIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIHByb3BlcnRpZXMgYXMgYSBgVHJhbnNhY3Rpb25Db250ZXh0YCAqL1xuICB0b0NvbnRleHQoKTogVHJhbnNhY3Rpb25Db250ZXh0O1xuXG4gIC8qKiBVcGRhdGVzIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIHdpdGggYSBuZXcgYFRyYW5zYWN0aW9uQ29udGV4dGAgKi9cbiAgdXBkYXRlV2l0aENvbnRleHQodHJhbnNhY3Rpb25Db250ZXh0OiBUcmFuc2FjdGlvbkNvbnRleHQpOiB0aGlzO1xufVxuXG4vKipcbiAqIENvbnRleHQgZGF0YSBwYXNzZWQgYnkgdGhlIHVzZXIgd2hlbiBzdGFydGluZyBhIHRyYW5zYWN0aW9uLCB0byBiZSB1c2VkIGJ5IHRoZSB0cmFjZXNTYW1wbGVyIG1ldGhvZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21TYW1wbGluZ0NvbnRleHQge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKlxuICogRGF0YSBwYXNzZWQgdG8gdGhlIGB0cmFjZXNTYW1wbGVyYCBmdW5jdGlvbiwgd2hpY2ggZm9ybXMgdGhlIGJhc2lzIGZvciB3aGF0ZXZlciBkZWNpc2lvbnMgaXQgbWlnaHQgbWFrZS5cbiAqXG4gKiBBZGRzIGRlZmF1bHQgZGF0YSB0byBkYXRhIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLiBTZWUge0BsaW5rIEh1Yi5zdGFydFRyYW5zYWN0aW9ufVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbXBsaW5nQ29udGV4dCBleHRlbmRzIEN1c3RvbVNhbXBsaW5nQ29udGV4dCB7XG4gIC8qKlxuICAgKiBDb250ZXh0IGRhdGEgd2l0aCB3aGljaCB0cmFuc2FjdGlvbiBiZWluZyBzYW1wbGVkIHdhcyBjcmVhdGVkXG4gICAqL1xuICB0cmFuc2FjdGlvbkNvbnRleHQ6IFRyYW5zYWN0aW9uQ29udGV4dDtcblxuICAvKipcbiAgICogU2FtcGxpbmcgZGVjaXNpb24gZnJvbSB0aGUgcGFyZW50IHRyYW5zYWN0aW9uLCBpZiBhbnkuXG4gICAqL1xuICBwYXJlbnRTYW1wbGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT2JqZWN0IHJlcHJlc2VudGluZyB0aGUgVVJMIG9mIHRoZSBjdXJyZW50IHBhZ2Ugb3Igd29ya2VyIHNjcmlwdC4gUGFzc2VkIGJ5IGRlZmF1bHQgd2hlbiB1c2luZyB0aGUgYEJyb3dzZXJUcmFjaW5nYFxuICAgKiBpbnRlZ3JhdGlvbi5cbiAgICovXG4gIGxvY2F0aW9uPzogV29ya2VyTG9jYXRpb247XG5cbiAgLyoqXG4gICAqIE9iamVjdCByZXByZXNlbnRpbmcgdGhlIGluY29taW5nIHJlcXVlc3QgdG8gYSBub2RlIHNlcnZlci4gUGFzc2VkIGJ5IGRlZmF1bHQgd2hlbiB1c2luZyB0aGUgVHJhY2luZ0hhbmRsZXIuXG4gICAqL1xuICByZXF1ZXN0PzogRXh0cmFjdGVkTm9kZVJlcXVlc3REYXRhO1xufVxuXG5leHBvcnQgdHlwZSBNZWFzdXJlbWVudHMgPSBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiBudW1iZXIgfT47XG5cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uU2FtcGxpbmdNZXRob2Qge1xuICBFeHBsaWNpdCA9ICdleHBsaWNpdGx5X3NldCcsXG4gIFNhbXBsZXIgPSAnY2xpZW50X3NhbXBsZXInLFxuICBSYXRlID0gJ2NsaWVudF9yYXRlJyxcbiAgSW5oZXJpdGFuY2UgPSAnaW5oZXJpdGFuY2UnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uTWV0YWRhdGEge1xuICB0cmFuc2FjdGlvblNhbXBsaW5nPzogeyByYXRlPzogbnVtYmVyOyBtZXRob2Q/OiBzdHJpbmcgfTtcblxuICAvKiogVGhlIHR3byBoYWx2ZXMgKHNlbnRyeSBhbmQgdGhpcmQtcGFydHkpIG9mIGEgdHJhbnNhY3Rpb24ncyB0cmFjZXN0YXRlIGhlYWRlciwgdXNlZCBmb3IgZHluYW1pYyBzYW1wbGluZyAqL1xuICB0cmFjZXN0YXRlPzoge1xuICAgIHNlbnRyeT86IHN0cmluZztcbiAgICB0aGlyZHBhcnR5Pzogc3RyaW5nO1xuICB9O1xuXG4gIC8qKiBGb3IgdHJhbnNhY3Rpb25zIHRyYWNpbmcgc2VydmVyLXNpZGUgcmVxdWVzdCBoYW5kbGluZywgdGhlIHBhdGggb2YgdGhlIHJlcXVlc3QgYmVpbmcgdHJhY2tlZC4gKi9cbiAgcmVxdWVzdFBhdGg/OiBzdHJpbmc7XG59XG4iLCAiaW1wb3J0IHsgRHNuTGlrZSB9IGZyb20gJy4vZHNuJztcbmltcG9ydCB7IEV2ZW50IH0gZnJvbSAnLi9ldmVudCc7XG5pbXBvcnQgeyBTZW50cnlSZXF1ZXN0VHlwZSB9IGZyb20gJy4vcmVxdWVzdCc7XG5pbXBvcnQgeyBSZXNwb25zZSB9IGZyb20gJy4vcmVzcG9uc2UnO1xuaW1wb3J0IHsgU2RrTWV0YWRhdGEgfSBmcm9tICcuL3Nka21ldGFkYXRhJztcbmltcG9ydCB7IFNlc3Npb24sIFNlc3Npb25BZ2dyZWdhdGVzIH0gZnJvbSAnLi9zZXNzaW9uJztcblxuZXhwb3J0IGVudW0gT3V0Y29tZSB7XG4gIEJlZm9yZVNlbmQgPSAnYmVmb3JlX3NlbmQnLFxuICBFdmVudFByb2Nlc3NvciA9ICdldmVudF9wcm9jZXNzb3InLFxuICBOZXR3b3JrRXJyb3IgPSAnbmV0d29ya19lcnJvcicsXG4gIFF1ZXVlT3ZlcmZsb3cgPSAncXVldWVfb3ZlcmZsb3cnLFxuICBSYXRlTGltaXRCYWNrb2ZmID0gJ3JhdGVsaW1pdF9iYWNrb2ZmJyxcbiAgU2FtcGxlUmF0ZSA9ICdzYW1wbGVfcmF0ZScsXG59XG5cbi8qKiBUcmFuc3BvcnQgdXNlZCBzZW5kaW5nIGRhdGEgdG8gU2VudHJ5ICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zcG9ydCB7XG4gIC8qKlxuICAgKiBTZW5kcyB0aGUgZXZlbnQgdG8gdGhlIFN0b3JlIGVuZHBvaW50IGluIFNlbnRyeS5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IEV2ZW50IHRoYXQgc2hvdWxkIGJlIHNlbnQgdG8gU2VudHJ5LlxuICAgKi9cbiAgc2VuZEV2ZW50KGV2ZW50OiBFdmVudCk6IFByb21pc2VMaWtlPFJlc3BvbnNlPjtcblxuICAvKipcbiAgICogU2VuZHMgdGhlIHNlc3Npb24gdG8gdGhlIEVudmVsb3BlIGVuZHBvaW50IGluIFNlbnRyeS5cbiAgICpcbiAgICogQHBhcmFtIHNlc3Npb24gU2Vzc2lvbiB0aGF0IHNob3VsZCBiZSBzZW50IHRvIFNlbnRyeSB8IFNlc3Npb24gQWdncmVnYXRlcyB0aGF0IHNob3VsZCBiZSBzZW50IHRvIFNlbnRyeS5cbiAgICovXG4gIHNlbmRTZXNzaW9uPyhzZXNzaW9uOiBTZXNzaW9uIHwgU2Vzc2lvbkFnZ3JlZ2F0ZXMpOiBQcm9taXNlTGlrZTxSZXNwb25zZT47XG5cbiAgLyoqXG4gICAqIFdhaXQgZm9yIGFsbCBldmVudHMgdG8gYmUgc2VudCBvciB0aGUgdGltZW91dCB0byBleHBpcmUsIHdoaWNoZXZlciBjb21lcyBmaXJzdC5cbiAgICpcbiAgICogQHBhcmFtIHRpbWVvdXQgTWF4aW11bSB0aW1lIGluIG1zIHRoZSB0cmFuc3BvcnQgc2hvdWxkIHdhaXQgZm9yIGV2ZW50cyB0byBiZSBmbHVzaGVkLiBPbWl0dGluZyB0aGlzIHBhcmFtZXRlciB3aWxsXG4gICAqICAgY2F1c2UgdGhlIHRyYW5zcG9ydCB0byB3YWl0IHVudGlsIGFsbCBldmVudHMgYXJlIHNlbnQgYmVmb3JlIHJlc29sdmluZyB0aGUgcHJvbWlzZS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgd2lsbCByZXNvbHZlIHdpdGggYHRydWVgIGlmIGFsbCBldmVudHMgYXJlIHNlbnQgYmVmb3JlIHRoZSB0aW1lb3V0LCBvciBgZmFsc2VgIGlmIHRoZXJlIGFyZVxuICAgKiBzdGlsbCBldmVudHMgaW4gdGhlIHF1ZXVlIHdoZW4gdGhlIHRpbWVvdXQgaXMgcmVhY2hlZC5cbiAgICovXG4gIGNsb3NlKHRpbWVvdXQ/OiBudW1iZXIpOiBQcm9taXNlTGlrZTxib29sZWFuPjtcblxuICAvKipcbiAgICogSW5jcmVtZW50IHRoZSBjb3VudGVyIGZvciB0aGUgc3BlY2lmaWMgY2xpZW50IG91dGNvbWVcbiAgICovXG4gIHJlY29yZExvc3RFdmVudD8odHlwZTogT3V0Y29tZSwgY2F0ZWdvcnk6IFNlbnRyeVJlcXVlc3RUeXBlKTogdm9pZDtcbn1cblxuLyoqIEpTRG9jICovXG5leHBvcnQgdHlwZSBUcmFuc3BvcnRDbGFzczxUIGV4dGVuZHMgVHJhbnNwb3J0PiA9IG5ldyAob3B0aW9uczogVHJhbnNwb3J0T3B0aW9ucykgPT4gVDtcblxuLyoqIEpTRG9jICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zcG9ydE9wdGlvbnMge1xuICAvKiogU2VudHJ5IERTTiAqL1xuICBkc246IERzbkxpa2U7XG4gIC8qKiBEZWZpbmUgY3VzdG9tIGhlYWRlcnMgKi9cbiAgaGVhZGVycz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gIC8qKiBTZXQgYSBIVFRQIHByb3h5IHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIG91dGJvdW5kIHJlcXVlc3RzLiAqL1xuICBodHRwUHJveHk/OiBzdHJpbmc7XG4gIC8qKiBTZXQgYSBIVFRQUyBwcm94eSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBvdXRib3VuZCByZXF1ZXN0cy4gKi9cbiAgaHR0cHNQcm94eT86IHN0cmluZztcbiAgLyoqIEhUVFBTIHByb3h5IGNlcnRpZmljYXRlcyBwYXRoICovXG4gIGNhQ2VydHM/OiBzdHJpbmc7XG4gIC8qKiBGZXRjaCBBUEkgaW5pdCBwYXJhbWV0ZXJzICovXG4gIGZldGNoUGFyYW1ldGVycz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gIC8qKiBUaGUgZW52ZWxvcGUgdHVubmVsIHRvIHVzZS4gKi9cbiAgdHVubmVsPzogc3RyaW5nO1xuICAvKiogU2VuZCBTREsgQ2xpZW50IFJlcG9ydHMuIEVuYWJsZWQgYnkgZGVmYXVsdC4gKi9cbiAgc2VuZENsaWVudFJlcG9ydHM/OiBib29sZWFuO1xuICAvKipcbiAgICogU2V0IG9mIG1ldGFkYXRhIGFib3V0IHRoZSBTREsgdGhhdCBjYW4gYmUgaW50ZXJuYWxseSB1c2VkIHRvIGVuaGFuY2UgZW52ZWxvcGVzIGFuZCBldmVudHMsXG4gICAqIGFuZCBwcm92aWRlIGFkZGl0aW9uYWwgZGF0YSBhYm91dCBldmVyeSByZXF1ZXN0LlxuICAgKiAqL1xuICBfbWV0YWRhdGE/OiBTZGtNZXRhZGF0YTtcbn1cbiIsICJleHBvcnQgeyBCcmVhZGNydW1iLCBCcmVhZGNydW1iSGludCB9IGZyb20gJy4vYnJlYWRjcnVtYic7XG5leHBvcnQgeyBDbGllbnQgfSBmcm9tICcuL2NsaWVudCc7XG5leHBvcnQgeyBDb250ZXh0LCBDb250ZXh0cyB9IGZyb20gJy4vY29udGV4dCc7XG5leHBvcnQgeyBEc24sIERzbkNvbXBvbmVudHMsIERzbkxpa2UsIERzblByb3RvY29sIH0gZnJvbSAnLi9kc24nO1xuZXhwb3J0IHsgRGVidWdJbWFnZSwgRGVidWdJbWFnZVR5cGUsIERlYnVnTWV0YSB9IGZyb20gJy4vZGVidWdNZXRhJztcbmV4cG9ydCB7IEV4dGVuZGVkRXJyb3IgfSBmcm9tICcuL2Vycm9yJztcbmV4cG9ydCB7IEV2ZW50LCBFdmVudEhpbnQgfSBmcm9tICcuL2V2ZW50JztcbmV4cG9ydCB7IEV2ZW50UHJvY2Vzc29yIH0gZnJvbSAnLi9ldmVudHByb2Nlc3Nvcic7XG5leHBvcnQgeyBFeGNlcHRpb24gfSBmcm9tICcuL2V4Y2VwdGlvbic7XG5leHBvcnQgeyBFeHRyYSwgRXh0cmFzIH0gZnJvbSAnLi9leHRyYSc7XG5leHBvcnQgeyBIdWIgfSBmcm9tICcuL2h1Yic7XG5leHBvcnQgeyBJbnRlZ3JhdGlvbiwgSW50ZWdyYXRpb25DbGFzcyB9IGZyb20gJy4vaW50ZWdyYXRpb24nO1xuZXhwb3J0IHsgTG9nTGV2ZWwgfSBmcm9tICcuL2xvZ2xldmVsJztcbmV4cG9ydCB7IE1lY2hhbmlzbSB9IGZyb20gJy4vbWVjaGFuaXNtJztcbmV4cG9ydCB7IEV4dHJhY3RlZE5vZGVSZXF1ZXN0RGF0YSwgUHJpbWl0aXZlLCBXb3JrZXJMb2NhdGlvbiB9IGZyb20gJy4vbWlzYyc7XG5leHBvcnQgeyBPcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zJztcbmV4cG9ydCB7IFBhY2thZ2UgfSBmcm9tICcuL3BhY2thZ2UnO1xuZXhwb3J0IHsgUXVlcnlQYXJhbXMsIFJlcXVlc3QsIFNlbnRyeVJlcXVlc3QsIFNlbnRyeVJlcXVlc3RUeXBlIH0gZnJvbSAnLi9yZXF1ZXN0JztcbmV4cG9ydCB7IFJlc3BvbnNlIH0gZnJvbSAnLi9yZXNwb25zZSc7XG5leHBvcnQgeyBSdW50aW1lIH0gZnJvbSAnLi9ydW50aW1lJztcbmV4cG9ydCB7IENhcHR1cmVDb250ZXh0LCBTY29wZSwgU2NvcGVDb250ZXh0IH0gZnJvbSAnLi9zY29wZSc7XG5leHBvcnQgeyBTZGtJbmZvIH0gZnJvbSAnLi9zZGtpbmZvJztcbmV4cG9ydCB7IFNka01ldGFkYXRhIH0gZnJvbSAnLi9zZGttZXRhZGF0YSc7XG5leHBvcnQge1xuICBTZXNzaW9uQWdncmVnYXRlcyxcbiAgQWdncmVnYXRpb25Db3VudHMsXG4gIFNlc3Npb24sXG4gIFNlc3Npb25Db250ZXh0LFxuICBTZXNzaW9uU3RhdHVzLFxuICBSZXF1ZXN0U2Vzc2lvbixcbiAgUmVxdWVzdFNlc3Npb25TdGF0dXMsXG4gIFNlc3Npb25GbHVzaGVyTGlrZSxcbn0gZnJvbSAnLi9zZXNzaW9uJztcbmV4cG9ydCB7IFNldmVyaXR5IH0gZnJvbSAnLi9zZXZlcml0eSc7XG5leHBvcnQgeyBTcGFuLCBTcGFuQ29udGV4dCB9IGZyb20gJy4vc3Bhbic7XG5leHBvcnQgeyBTdGFja0ZyYW1lIH0gZnJvbSAnLi9zdGFja2ZyYW1lJztcbmV4cG9ydCB7IFN0YWNrdHJhY2UgfSBmcm9tICcuL3N0YWNrdHJhY2UnO1xuZXhwb3J0IHsgU3RhdHVzIH0gZnJvbSAnLi9zdGF0dXMnO1xuZXhwb3J0IHtcbiAgQ3VzdG9tU2FtcGxpbmdDb250ZXh0LFxuICBNZWFzdXJlbWVudHMsXG4gIFNhbXBsaW5nQ29udGV4dCxcbiAgVHJhY2VwYXJlbnREYXRhLFxuICBUcmFuc2FjdGlvbixcbiAgVHJhbnNhY3Rpb25Db250ZXh0LFxuICBUcmFuc2FjdGlvbk1ldGFkYXRhLFxuICBUcmFuc2FjdGlvblNhbXBsaW5nTWV0aG9kLFxufSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmV4cG9ydCB7IFRocmVhZCB9IGZyb20gJy4vdGhyZWFkJztcbmV4cG9ydCB7IE91dGNvbWUsIFRyYW5zcG9ydCwgVHJhbnNwb3J0T3B0aW9ucywgVHJhbnNwb3J0Q2xhc3MgfSBmcm9tICcuL3RyYW5zcG9ydCc7XG5leHBvcnQgeyBVc2VyIH0gZnJvbSAnLi91c2VyJztcbmV4cG9ydCB7IFdyYXBwZWRGdW5jdGlvbiB9IGZyb20gJy4vd3JhcHBlZGZ1bmN0aW9uJztcbiIsICIvKipcbiAqIENvbnN1bWVzIHRoZSBwcm9taXNlIGFuZCBsb2dzIHRoZSBlcnJvciB3aGVuIGl0IHJlamVjdHMuXG4gKiBAcGFyYW0gcHJvbWlzZSBBIHByb21pc2UgdG8gZm9yZ2V0LlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGZ1bmN0aW9uIGZvcmdldChwcm9taXNlOiBQcm9taXNlTGlrZTxhbnk+KTogdm9pZCB7XG4gIHZvaWQgcHJvbWlzZS50aGVuKG51bGwsIGUgPT4ge1xuICAgIC8vIFRPRE86IFVzZSBhIGJldHRlciBsb2dnaW5nIG1lY2hhbmlzbVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5lcnJvcihlKTtcbiAgfSk7XG59XG4iLCAiLyoqXG4gKiBOT1RFOiBJbiBvcmRlciB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmNpZXMsIGlmIHlvdSBhZGQgYSBmdW5jdGlvbiB0byB0aGlzIG1vZHVsZSBhbmQgaXQgbmVlZHMgdG8gcHJpbnQgc29tZXRoaW5nLFxuICogeW91IG11c3QgZWl0aGVyIGEpIHVzZSBgY29uc29sZS5sb2dgIHJhdGhlciB0aGFuIHRoZSBsb2dnZXIsIG9yIGIpIHB1dCB5b3VyIGZ1bmN0aW9uIGVsc2V3aGVyZS5cbiAqL1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHdlJ3JlIGluIHRoZSBOb2RlLmpzIG9yIEJyb3dzZXIgZW52aXJvbm1lbnRcbiAqXG4gKiBAcmV0dXJucyBBbnN3ZXIgdG8gZ2l2ZW4gcXVlc3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm9kZUVudigpOiBib29sZWFuIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgPyBwcm9jZXNzIDogMCkgPT09ICdbb2JqZWN0IHByb2Nlc3NdJztcbn1cblxuLyoqXG4gKiBSZXF1aXJlcyBhIG1vZHVsZSB3aGljaCBpcyBwcm90ZWN0ZWQgYWdhaW5zdCBidW5kbGVyIG1pbmlmaWNhdGlvbi5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdCBUaGUgbW9kdWxlIHBhdGggdG8gcmVzb2x2ZVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGZ1bmN0aW9uIGR5bmFtaWNSZXF1aXJlKG1vZDogYW55LCByZXF1ZXN0OiBzdHJpbmcpOiBhbnkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gIHJldHVybiBtb2QucmVxdWlyZShyZXF1ZXN0KTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZm9yIGR5bmFtaWNhbGx5IGxvYWRpbmcgbW9kdWxlIHRoYXQgc2hvdWxkIHdvcmsgd2l0aCBsaW5rZWQgZGVwZW5kZW5jaWVzLlxuICogVGhlIHByb2JsZW0gaXMgdGhhdCB3ZSBfc2hvdWxkXyBiZSB1c2luZyBgcmVxdWlyZShyZXF1aXJlLnJlc29sdmUobW9kdWxlTmFtZSwgeyBwYXRoczogW2N3ZCgpXSB9KSlgXG4gKiBIb3dldmVyIGl0J3MgX25vdCBwb3NzaWJsZV8gdG8gZG8gdGhhdCB3aXRoIFdlYnBhY2ssIGFzIGl0IGhhcyB0byBrbm93IGFsbCB0aGUgZGVwZW5kZW5jaWVzIGR1cmluZ1xuICogYnVpbGQgdGltZS4gYHJlcXVpcmUucmVzb2x2ZWAgaXMgYWxzbyBub3QgYXZhaWxhYmxlIGluIGFueSBvdGhlciB3YXksIHNvIHdlIGNhbm5vdCBjcmVhdGUsXG4gKiBhIGZha2UgaGVscGVyIGxpa2Ugd2UgZG8gd2l0aCBgZHluYW1pY1JlcXVpcmVgLlxuICpcbiAqIFdlIGFsd2F5cyBwcmVmZXIgdG8gdXNlIGxvY2FsIHBhY2thZ2UsIHRodXMgdGhlIHZhbHVlIGlzIG5vdCByZXR1cm5lZCBlYXJseSBmcm9tIGVhY2ggYHRyeS9jYXRjaGAgYmxvY2suXG4gKiBUaGF0IGlzIHRvIG1pbWljIHRoZSBiZWhhdmlvciBvZiBgcmVxdWlyZS5yZXNvbHZlYCBleGFjdGx5LlxuICpcbiAqIEBwYXJhbSBtb2R1bGVOYW1lIG1vZHVsZSBuYW1lIHRvIHJlcXVpcmVcbiAqIEByZXR1cm5zIHBvc3NpYmx5IHJlcXVpcmVkIG1vZHVsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZE1vZHVsZTxUPihtb2R1bGVOYW1lOiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgbGV0IG1vZDogVCB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIG1vZCA9IGR5bmFtaWNSZXF1aXJlKG1vZHVsZSwgbW9kdWxlTmFtZSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBuby1lbXB0eVxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB7IGN3ZCB9ID0gZHluYW1pY1JlcXVpcmUobW9kdWxlLCAncHJvY2VzcycpO1xuICAgIG1vZCA9IGR5bmFtaWNSZXF1aXJlKG1vZHVsZSwgYCR7Y3dkKCl9L25vZGVfbW9kdWxlcy8ke21vZHVsZU5hbWV9YCkgYXMgVDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIG5vLWVtcHR5XG4gIH1cblxuICByZXR1cm4gbW9kO1xufVxuIiwgIi8qKlxuICogTk9URTogSW4gb3JkZXIgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzLCBpZiB5b3UgYWRkIGEgZnVuY3Rpb24gdG8gdGhpcyBtb2R1bGUgYW5kIGl0IG5lZWRzIHRvIHByaW50IHNvbWV0aGluZyxcbiAqIHlvdSBtdXN0IGVpdGhlciBhKSB1c2UgYGNvbnNvbGUubG9nYCByYXRoZXIgdGhhbiB0aGUgbG9nZ2VyLCBvciBiKSBwdXQgeW91ciBmdW5jdGlvbiBlbHNld2hlcmUuXG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG5pbXBvcnQgeyBJbnRlZ3JhdGlvbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuXG5pbXBvcnQgeyBpc05vZGVFbnYgfSBmcm9tICcuL25vZGUnO1xuXG4vKiogSW50ZXJuYWwgKi9cbmludGVyZmFjZSBTZW50cnlHbG9iYWwge1xuICBTZW50cnk/OiB7XG4gICAgSW50ZWdyYXRpb25zPzogSW50ZWdyYXRpb25bXTtcbiAgfTtcbiAgU0VOVFJZX0VOVklST05NRU5UPzogc3RyaW5nO1xuICBTRU5UUllfRFNOPzogc3RyaW5nO1xuICBTRU5UUllfUkVMRUFTRT86IHtcbiAgICBpZD86IHN0cmluZztcbiAgfTtcbiAgX19TRU5UUllfXzoge1xuICAgIGdsb2JhbEV2ZW50UHJvY2Vzc29yczogYW55O1xuICAgIGh1YjogYW55O1xuICAgIGxvZ2dlcjogYW55O1xuICB9O1xufVxuXG5jb25zdCBmYWxsYmFja0dsb2JhbE9iamVjdCA9IHt9O1xuXG4vKipcbiAqIFNhZmVseSBnZXQgZ2xvYmFsIHNjb3BlIG9iamVjdFxuICpcbiAqIEByZXR1cm5zIEdsb2JhbCBzY29wZSBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdsb2JhbE9iamVjdDxUPigpOiBUICYgU2VudHJ5R2xvYmFsIHtcbiAgcmV0dXJuIChpc05vZGVFbnYoKVxuICAgID8gZ2xvYmFsXG4gICAgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFsc1xuICAgID8gd2luZG93IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXG4gICAgOiB0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCdcbiAgICA/IHNlbGZcbiAgICA6IGZhbGxiYWNrR2xvYmFsT2JqZWN0KSBhcyBUICYgU2VudHJ5R2xvYmFsO1xufVxuIiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXMgKi9cblxuaW1wb3J0IHsgUHJpbWl0aXZlIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBvbmUgb2YgYSBmZXcgRXJyb3Igb3IgRXJyb3ItbGlrZVxuICoge0BsaW5rIGlzRXJyb3J9LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybnMgQSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFcnJvcih3YXQ6IGFueSk6IGJvb2xlYW4ge1xuICBzd2l0Y2ggKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3YXQpKSB7XG4gICAgY2FzZSAnW29iamVjdCBFcnJvcl0nOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgY2FzZSAnW29iamVjdCBFeGNlcHRpb25dJzpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgJ1tvYmplY3QgRE9NRXhjZXB0aW9uXSc6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGlzSW5zdGFuY2VPZih3YXQsIEVycm9yKTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBFcnJvckV2ZW50XG4gKiB7QGxpbmsgaXNFcnJvckV2ZW50fS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXJyb3JFdmVudCh3YXQ6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdhdCkgPT09ICdbb2JqZWN0IEVycm9yRXZlbnRdJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSdzIHR5cGUgaXMgRE9NRXJyb3JcbiAqIHtAbGluayBpc0RPTUVycm9yfS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRE9NRXJyb3Iod2F0OiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3YXQpID09PSAnW29iamVjdCBET01FcnJvcl0nO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBET01FeGNlcHRpb25cbiAqIHtAbGluayBpc0RPTUV4Y2VwdGlvbn0uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RPTUV4Y2VwdGlvbih3YXQ6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdhdCkgPT09ICdbb2JqZWN0IERPTUV4Y2VwdGlvbl0nO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBhIHN0cmluZ1xuICoge0BsaW5rIGlzU3RyaW5nfS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKHdhdDogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2F0KSA9PT0gJ1tvYmplY3QgU3RyaW5nXSc7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyBpcyBhIHByaW1pdGl2ZSAodW5kZWZpbmVkLCBudWxsLCBudW1iZXIsIGJvb2xlYW4sIHN0cmluZywgYmlnaW50LCBzeW1ib2wpXG4gKiB7QGxpbmsgaXNQcmltaXRpdmV9LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybnMgQSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQcmltaXRpdmUod2F0OiBhbnkpOiB3YXQgaXMgUHJpbWl0aXZlIHtcbiAgcmV0dXJuIHdhdCA9PT0gbnVsbCB8fCAodHlwZW9mIHdhdCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHdhdCAhPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyB0eXBlIGlzIGFuIG9iamVjdCBsaXRlcmFsXG4gKiB7QGxpbmsgaXNQbGFpbk9iamVjdH0uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHdhdDogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2F0KSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyB0eXBlIGlzIGFuIEV2ZW50IGluc3RhbmNlXG4gKiB7QGxpbmsgaXNFdmVudH0uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0V2ZW50KHdhdDogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgRXZlbnQgIT09ICd1bmRlZmluZWQnICYmIGlzSW5zdGFuY2VPZih3YXQsIEV2ZW50KTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSdzIHR5cGUgaXMgYW4gRWxlbWVudCBpbnN0YW5jZVxuICoge0BsaW5rIGlzRWxlbWVudH0uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0VsZW1lbnQod2F0OiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBpc0luc3RhbmNlT2Yod2F0LCBFbGVtZW50KTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSdzIHR5cGUgaXMgYW4gcmVnZXhwXG4gKiB7QGxpbmsgaXNSZWdFeHB9LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybnMgQSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZWdFeHAod2F0OiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3YXQpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSBoYXMgYSB0aGVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RoZW5hYmxlKHdhdDogYW55KTogYm9vbGVhbiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgcmV0dXJuIEJvb2xlYW4od2F0ICYmIHdhdC50aGVuICYmIHR5cGVvZiB3YXQudGhlbiA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyB0eXBlIGlzIGEgU3ludGhldGljRXZlbnRcbiAqIHtAbGluayBpc1N5bnRoZXRpY0V2ZW50fS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3ludGhldGljRXZlbnQod2F0OiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzUGxhaW5PYmplY3Qod2F0KSAmJiAnbmF0aXZlRXZlbnQnIGluIHdhdCAmJiAncHJldmVudERlZmF1bHQnIGluIHdhdCAmJiAnc3RvcFByb3BhZ2F0aW9uJyBpbiB3YXQ7XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBhbiBpbnN0YW5jZSBvZiBwcm92aWRlZCBjb25zdHJ1Y3Rvci5cbiAqIHtAbGluayBpc0luc3RhbmNlT2Z9LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHBhcmFtIGJhc2UgQSBjb25zdHJ1Y3RvciB0byBiZSB1c2VkIGluIGEgY2hlY2suXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0luc3RhbmNlT2Yod2F0OiBhbnksIGJhc2U6IGFueSk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiB3YXQgaW5zdGFuY2VvZiBiYXNlO1xuICB9IGNhdGNoIChfZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGdldEdsb2JhbE9iamVjdCB9IGZyb20gJy4vZ2xvYmFsJztcbmltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnLi9pcyc7XG5cbi8qKlxuICogR2l2ZW4gYSBjaGlsZCBET00gZWxlbWVudCwgcmV0dXJucyBhIHF1ZXJ5LXNlbGVjdG9yIHN0YXRlbWVudCBkZXNjcmliaW5nIHRoYXRcbiAqIGFuZCBpdHMgYW5jZXN0b3JzXG4gKiBlLmcuIFtIVE1MRWxlbWVudF0gPT4gYm9keSA+IGRpdiA+IGlucHV0I2Zvby5idG5bbmFtZT1iYXpdXG4gKiBAcmV0dXJucyBnZW5lcmF0ZWQgRE9NIHBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGh0bWxUcmVlQXNTdHJpbmcoZWxlbTogdW5rbm93biwga2V5QXR0cnM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHR5cGUgU2ltcGxlTm9kZSA9IHtcbiAgICBwYXJlbnROb2RlOiBTaW1wbGVOb2RlO1xuICB9IHwgbnVsbDtcblxuICAvLyB0cnkvY2F0Y2ggYm90aDpcbiAgLy8gLSBhY2Nlc3NpbmcgZXZlbnQudGFyZ2V0IChzZWUgZ2V0c2VudHJ5L3JhdmVuLWpzIzgzOCwgIzc2OClcbiAgLy8gLSBgaHRtbFRyZWVBc1N0cmluZ2AgYmVjYXVzZSBpdCdzIGNvbXBsZXgsIGFuZCBqdXN0IGFjY2Vzc2luZyB0aGUgRE9NIGluY29ycmVjdGx5XG4gIC8vIC0gY2FuIHRocm93IGFuIGV4Y2VwdGlvbiBpbiBzb21lIGNpcmN1bXN0YW5jZXMuXG4gIHRyeSB7XG4gICAgbGV0IGN1cnJlbnRFbGVtID0gZWxlbSBhcyBTaW1wbGVOb2RlO1xuICAgIGNvbnN0IE1BWF9UUkFWRVJTRV9IRUlHSFQgPSA1O1xuICAgIGNvbnN0IE1BWF9PVVRQVVRfTEVOID0gODA7XG4gICAgY29uc3Qgb3V0ID0gW107XG4gICAgbGV0IGhlaWdodCA9IDA7XG4gICAgbGV0IGxlbiA9IDA7XG4gICAgY29uc3Qgc2VwYXJhdG9yID0gJyA+ICc7XG4gICAgY29uc3Qgc2VwTGVuZ3RoID0gc2VwYXJhdG9yLmxlbmd0aDtcbiAgICBsZXQgbmV4dFN0cjtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wbHVzcGx1c1xuICAgIHdoaWxlIChjdXJyZW50RWxlbSAmJiBoZWlnaHQrKyA8IE1BWF9UUkFWRVJTRV9IRUlHSFQpIHtcbiAgICAgIG5leHRTdHIgPSBfaHRtbEVsZW1lbnRBc1N0cmluZyhjdXJyZW50RWxlbSwga2V5QXR0cnMpO1xuICAgICAgLy8gYmFpbCBvdXQgaWZcbiAgICAgIC8vIC0gbmV4dFN0ciBpcyB0aGUgJ2h0bWwnIGVsZW1lbnRcbiAgICAgIC8vIC0gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHRoYXQgd291bGQgYmUgY3JlYXRlZCBleGNlZWRzIE1BWF9PVVRQVVRfTEVOXG4gICAgICAvLyAgIChpZ25vcmUgdGhpcyBsaW1pdCBpZiB3ZSBhcmUgb24gdGhlIGZpcnN0IGl0ZXJhdGlvbilcbiAgICAgIGlmIChuZXh0U3RyID09PSAnaHRtbCcgfHwgKGhlaWdodCA+IDEgJiYgbGVuICsgb3V0Lmxlbmd0aCAqIHNlcExlbmd0aCArIG5leHRTdHIubGVuZ3RoID49IE1BWF9PVVRQVVRfTEVOKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgb3V0LnB1c2gobmV4dFN0cik7XG5cbiAgICAgIGxlbiArPSBuZXh0U3RyLmxlbmd0aDtcbiAgICAgIGN1cnJlbnRFbGVtID0gY3VycmVudEVsZW0ucGFyZW50Tm9kZTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0LnJldmVyc2UoKS5qb2luKHNlcGFyYXRvcik7XG4gIH0gY2F0Y2ggKF9vTykge1xuICAgIHJldHVybiAnPHVua25vd24+JztcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBzaW1wbGUsIHF1ZXJ5LXNlbGVjdG9yIHJlcHJlc2VudGF0aW9uIG9mIGEgRE9NIGVsZW1lbnRcbiAqIGUuZy4gW0hUTUxFbGVtZW50XSA9PiBpbnB1dCNmb28uYnRuW25hbWU9YmF6XVxuICogQHJldHVybnMgZ2VuZXJhdGVkIERPTSBwYXRoXG4gKi9cbmZ1bmN0aW9uIF9odG1sRWxlbWVudEFzU3RyaW5nKGVsOiB1bmtub3duLCBrZXlBdHRycz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgZWxlbSA9IGVsIGFzIHtcbiAgICB0YWdOYW1lPzogc3RyaW5nO1xuICAgIGlkPzogc3RyaW5nO1xuICAgIGNsYXNzTmFtZT86IHN0cmluZztcbiAgICBnZXRBdHRyaWJ1dGUoa2V5OiBzdHJpbmcpOiBzdHJpbmc7XG4gIH07XG5cbiAgY29uc3Qgb3V0ID0gW107XG4gIGxldCBjbGFzc05hbWU7XG4gIGxldCBjbGFzc2VzO1xuICBsZXQga2V5O1xuICBsZXQgYXR0cjtcbiAgbGV0IGk7XG5cbiAgaWYgKCFlbGVtIHx8ICFlbGVtLnRhZ05hbWUpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBvdXQucHVzaChlbGVtLnRhZ05hbWUudG9Mb3dlckNhc2UoKSk7XG5cbiAgLy8gUGFpcnMgb2YgYXR0cmlidXRlIGtleXMgZGVmaW5lZCBpbiBgc2VyaWFsaXplQXR0cmlidXRlYCBhbmQgdGhlaXIgdmFsdWVzIG9uIGVsZW1lbnQuXG4gIGNvbnN0IGtleUF0dHJQYWlycyA9IGtleUF0dHJzPy5sZW5ndGhcbiAgICA/IGtleUF0dHJzLmZpbHRlcihrZXlBdHRyID0+IGVsZW0uZ2V0QXR0cmlidXRlKGtleUF0dHIpKS5tYXAoa2V5QXR0ciA9PiBba2V5QXR0ciwgZWxlbS5nZXRBdHRyaWJ1dGUoa2V5QXR0cildKVxuICAgIDogbnVsbDtcblxuICBpZiAoa2V5QXR0clBhaXJzPy5sZW5ndGgpIHtcbiAgICBrZXlBdHRyUGFpcnMuZm9yRWFjaChrZXlBdHRyUGFpciA9PiB7XG4gICAgICBvdXQucHVzaChgWyR7a2V5QXR0clBhaXJbMF19PVwiJHtrZXlBdHRyUGFpclsxXX1cIl1gKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoZWxlbS5pZCkge1xuICAgICAgb3V0LnB1c2goYCMke2VsZW0uaWR9YCk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGNsYXNzTmFtZSA9IGVsZW0uY2xhc3NOYW1lO1xuICAgIGlmIChjbGFzc05hbWUgJiYgaXNTdHJpbmcoY2xhc3NOYW1lKSkge1xuICAgICAgY2xhc3NlcyA9IGNsYXNzTmFtZS5zcGxpdCgvXFxzKy8pO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgb3V0LnB1c2goYC4ke2NsYXNzZXNbaV19YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IGFsbG93ZWRBdHRycyA9IFsndHlwZScsICduYW1lJywgJ3RpdGxlJywgJ2FsdCddO1xuICBmb3IgKGkgPSAwOyBpIDwgYWxsb3dlZEF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0gYWxsb3dlZEF0dHJzW2ldO1xuICAgIGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZShrZXkpO1xuICAgIGlmIChhdHRyKSB7XG4gICAgICBvdXQucHVzaChgWyR7a2V5fT1cIiR7YXR0cn1cIl1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dC5qb2luKCcnKTtcbn1cblxuLyoqXG4gKiBBIHNhZmUgZm9ybSBvZiBsb2NhdGlvbi5ocmVmXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2NhdGlvbkhyZWYoKTogc3RyaW5nIHtcbiAgY29uc3QgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0PFdpbmRvdz4oKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZ2xvYmFsLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY7XG4gIH0gY2F0Y2ggKG9PKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IHNldFByb3RvdHlwZU9mID1cbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ID8gc2V0UHJvdG9PZiA6IG1peGluUHJvcGVydGllcyk7XG5cbi8qKlxuICogc2V0UHJvdG90eXBlT2YgcG9seWZpbGwgdXNpbmcgX19wcm90b19fXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG5mdW5jdGlvbiBzZXRQcm90b09mPFRUYXJnZXQgZXh0ZW5kcyBvYmplY3QsIFRQcm90bz4ob2JqOiBUVGFyZ2V0LCBwcm90bzogVFByb3RvKTogVFRhcmdldCAmIFRQcm90byB7XG4gIC8vIEB0cy1pZ25vcmUgX19wcm90b19fIGRvZXMgbm90IGV4aXN0IG9uIG9ialxuICBvYmouX19wcm90b19fID0gcHJvdG87XG4gIHJldHVybiBvYmogYXMgVFRhcmdldCAmIFRQcm90bztcbn1cblxuLyoqXG4gKiBzZXRQcm90b3R5cGVPZiBwb2x5ZmlsbCB1c2luZyBtaXhpblxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuZnVuY3Rpb24gbWl4aW5Qcm9wZXJ0aWVzPFRUYXJnZXQgZXh0ZW5kcyBvYmplY3QsIFRQcm90bz4ob2JqOiBUVGFyZ2V0LCBwcm90bzogVFByb3RvKTogVFRhcmdldCAmIFRQcm90byB7XG4gIGZvciAoY29uc3QgcHJvcCBpbiBwcm90bykge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmUgdHlwZXNjcmlwdCBjb21wbGFpbnMgYWJvdXQgaW5kZXhpbmcgc28gd2UgcmVtb3ZlXG4gICAgICBvYmpbcHJvcF0gPSBwcm90b1twcm9wXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqIGFzIFRUYXJnZXQgJiBUUHJvdG87XG59XG4iLCAiaW1wb3J0IHsgc2V0UHJvdG90eXBlT2YgfSBmcm9tICcuL3BvbHlmaWxsJztcblxuLyoqIEFuIGVycm9yIGVtaXR0ZWQgYnkgU2VudHJ5IFNES3MgYW5kIHJlbGF0ZWQgdXRpbGl0aWVzLiAqL1xuZXhwb3J0IGNsYXNzIFNlbnRyeUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKiogRGlzcGxheSBuYW1lIG9mIHRoaXMgZXJyb3IgaW5zdGFuY2UuICovXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcblxuICAgIHRoaXMubmFtZSA9IG5ldy50YXJnZXQucHJvdG90eXBlLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgc2V0UHJvdG90eXBlT2YodGhpcywgbmV3LnRhcmdldC5wcm90b3R5cGUpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgRHNuQ29tcG9uZW50cywgRHNuTGlrZSwgRHNuUHJvdG9jb2wgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcblxuaW1wb3J0IHsgU2VudHJ5RXJyb3IgfSBmcm9tICcuL2Vycm9yJztcblxuLyoqIFJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIHRvIHBhcnNlIGEgRHNuLiAqL1xuY29uc3QgRFNOX1JFR0VYID0gL14oPzooXFx3Kyk6KVxcL1xcLyg/OihcXHcrKSg/OjooXFx3KykpP0ApKFtcXHcuLV0rKSg/OjooXFxkKykpP1xcLyguKykvO1xuXG4vKiogRXJyb3IgbWVzc2FnZSAqL1xuY29uc3QgRVJST1JfTUVTU0FHRSA9ICdJbnZhbGlkIERzbic7XG5cbi8qKiBUaGUgU2VudHJ5IERzbiwgaWRlbnRpZnlpbmcgYSBTZW50cnkgaW5zdGFuY2UgYW5kIHByb2plY3QuICovXG5leHBvcnQgY2xhc3MgRHNuIGltcGxlbWVudHMgRHNuQ29tcG9uZW50cyB7XG4gIC8qKiBQcm90b2NvbCB1c2VkIHRvIGNvbm5lY3QgdG8gU2VudHJ5LiAqL1xuICBwdWJsaWMgcHJvdG9jb2whOiBEc25Qcm90b2NvbDtcbiAgLyoqIFB1YmxpYyBhdXRob3JpemF0aW9uIGtleSAoZGVwcmVjYXRlZCwgcmVuYW1lZCB0byBwdWJsaWNLZXkpLiAqL1xuICBwdWJsaWMgdXNlciE6IHN0cmluZztcbiAgLyoqIFB1YmxpYyBhdXRob3JpemF0aW9uIGtleS4gKi9cbiAgcHVibGljIHB1YmxpY0tleSE6IHN0cmluZztcbiAgLyoqIFByaXZhdGUgYXV0aG9yaXphdGlvbiBrZXkgKGRlcHJlY2F0ZWQsIG9wdGlvbmFsKS4gKi9cbiAgcHVibGljIHBhc3MhOiBzdHJpbmc7XG4gIC8qKiBIb3N0bmFtZSBvZiB0aGUgU2VudHJ5IGluc3RhbmNlLiAqL1xuICBwdWJsaWMgaG9zdCE6IHN0cmluZztcbiAgLyoqIFBvcnQgb2YgdGhlIFNlbnRyeSBpbnN0YW5jZS4gKi9cbiAgcHVibGljIHBvcnQhOiBzdHJpbmc7XG4gIC8qKiBQYXRoICovXG4gIHB1YmxpYyBwYXRoITogc3RyaW5nO1xuICAvKiogUHJvamVjdCBJRCAqL1xuICBwdWJsaWMgcHJvamVjdElkITogc3RyaW5nO1xuXG4gIC8qKiBDcmVhdGVzIGEgbmV3IERzbiBjb21wb25lbnQgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGZyb206IERzbkxpa2UpIHtcbiAgICBpZiAodHlwZW9mIGZyb20gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl9mcm9tU3RyaW5nKGZyb20pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9mcm9tQ29tcG9uZW50cyhmcm9tKTtcbiAgICB9XG5cbiAgICB0aGlzLl92YWxpZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERzbi5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgdGhpcyB3aWxsIHJlbmRlciB0aGUgcHVibGljIHJlcHJlc2VudGF0aW9uIHdpdGhvdXQgdGhlIHBhc3N3b3JkXG4gICAqIGNvbXBvbmVudC4gVG8gZ2V0IHRoZSBkZXByZWNhdGVkIHByaXZhdGUgcmVwcmVzZW50YXRpb24sIHNldCBgd2l0aFBhc3N3b3JkYFxuICAgKiB0byB0cnVlLlxuICAgKlxuICAgKiBAcGFyYW0gd2l0aFBhc3N3b3JkIFdoZW4gc2V0IHRvIHRydWUsIHRoZSBwYXNzd29yZCB3aWxsIGJlIGluY2x1ZGVkLlxuICAgKi9cbiAgcHVibGljIHRvU3RyaW5nKHdpdGhQYXNzd29yZDogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IGhvc3QsIHBhdGgsIHBhc3MsIHBvcnQsIHByb2plY3RJZCwgcHJvdG9jb2wsIHB1YmxpY0tleSB9ID0gdGhpcztcbiAgICByZXR1cm4gKFxuICAgICAgYCR7cHJvdG9jb2x9Oi8vJHtwdWJsaWNLZXl9JHt3aXRoUGFzc3dvcmQgJiYgcGFzcyA/IGA6JHtwYXNzfWAgOiAnJ31gICtcbiAgICAgIGBAJHtob3N0fSR7cG9ydCA/IGA6JHtwb3J0fWAgOiAnJ30vJHtwYXRoID8gYCR7cGF0aH0vYCA6IHBhdGh9JHtwcm9qZWN0SWR9YFxuICAgICk7XG4gIH1cblxuICAvKiogUGFyc2VzIGEgc3RyaW5nIGludG8gdGhpcyBEc24uICovXG4gIHByaXZhdGUgX2Zyb21TdHJpbmcoc3RyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBtYXRjaCA9IERTTl9SRUdFWC5leGVjKHN0cik7XG5cbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgU2VudHJ5RXJyb3IoRVJST1JfTUVTU0FHRSk7XG4gICAgfVxuXG4gICAgY29uc3QgW3Byb3RvY29sLCBwdWJsaWNLZXksIHBhc3MgPSAnJywgaG9zdCwgcG9ydCA9ICcnLCBsYXN0UGF0aF0gPSBtYXRjaC5zbGljZSgxKTtcbiAgICBsZXQgcGF0aCA9ICcnO1xuICAgIGxldCBwcm9qZWN0SWQgPSBsYXN0UGF0aDtcblxuICAgIGNvbnN0IHNwbGl0ID0gcHJvamVjdElkLnNwbGl0KCcvJyk7XG4gICAgaWYgKHNwbGl0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIHBhdGggPSBzcGxpdC5zbGljZSgwLCAtMSkuam9pbignLycpO1xuICAgICAgcHJvamVjdElkID0gc3BsaXQucG9wKCkgYXMgc3RyaW5nO1xuICAgIH1cblxuICAgIGlmIChwcm9qZWN0SWQpIHtcbiAgICAgIGNvbnN0IHByb2plY3RNYXRjaCA9IHByb2plY3RJZC5tYXRjaCgvXlxcZCsvKTtcbiAgICAgIGlmIChwcm9qZWN0TWF0Y2gpIHtcbiAgICAgICAgcHJvamVjdElkID0gcHJvamVjdE1hdGNoWzBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2Zyb21Db21wb25lbnRzKHsgaG9zdCwgcGFzcywgcGF0aCwgcHJvamVjdElkLCBwb3J0LCBwcm90b2NvbDogcHJvdG9jb2wgYXMgRHNuUHJvdG9jb2wsIHB1YmxpY0tleSB9KTtcbiAgfVxuXG4gIC8qKiBNYXBzIERzbiBjb21wb25lbnRzIGludG8gdGhpcyBpbnN0YW5jZS4gKi9cbiAgcHJpdmF0ZSBfZnJvbUNvbXBvbmVudHMoY29tcG9uZW50czogRHNuQ29tcG9uZW50cyk6IHZvaWQge1xuICAgIC8vIFRPRE8gdGhpcyBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGFuZCBjYW4gYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uXG4gICAgaWYgKCd1c2VyJyBpbiBjb21wb25lbnRzICYmICEoJ3B1YmxpY0tleScgaW4gY29tcG9uZW50cykpIHtcbiAgICAgIGNvbXBvbmVudHMucHVibGljS2V5ID0gY29tcG9uZW50cy51c2VyO1xuICAgIH1cbiAgICB0aGlzLnVzZXIgPSBjb21wb25lbnRzLnB1YmxpY0tleSB8fCAnJztcblxuICAgIHRoaXMucHJvdG9jb2wgPSBjb21wb25lbnRzLnByb3RvY29sO1xuICAgIHRoaXMucHVibGljS2V5ID0gY29tcG9uZW50cy5wdWJsaWNLZXkgfHwgJyc7XG4gICAgdGhpcy5wYXNzID0gY29tcG9uZW50cy5wYXNzIHx8ICcnO1xuICAgIHRoaXMuaG9zdCA9IGNvbXBvbmVudHMuaG9zdDtcbiAgICB0aGlzLnBvcnQgPSBjb21wb25lbnRzLnBvcnQgfHwgJyc7XG4gICAgdGhpcy5wYXRoID0gY29tcG9uZW50cy5wYXRoIHx8ICcnO1xuICAgIHRoaXMucHJvamVjdElkID0gY29tcG9uZW50cy5wcm9qZWN0SWQ7XG4gIH1cblxuICAvKiogVmFsaWRhdGVzIHRoaXMgRHNuIGFuZCB0aHJvd3Mgb24gZXJyb3IuICovXG4gIHByaXZhdGUgX3ZhbGlkYXRlKCk6IHZvaWQge1xuICAgIFsncHJvdG9jb2wnLCAncHVibGljS2V5JywgJ2hvc3QnLCAncHJvamVjdElkJ10uZm9yRWFjaChjb21wb25lbnQgPT4ge1xuICAgICAgaWYgKCF0aGlzW2NvbXBvbmVudCBhcyBrZXlvZiBEc25Db21wb25lbnRzXSkge1xuICAgICAgICB0aHJvdyBuZXcgU2VudHJ5RXJyb3IoYCR7RVJST1JfTUVTU0FHRX06ICR7Y29tcG9uZW50fSBtaXNzaW5nYCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIXRoaXMucHJvamVjdElkLm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKGAke0VSUk9SX01FU1NBR0V9OiBJbnZhbGlkIHByb2plY3RJZCAke3RoaXMucHJvamVjdElkfWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3RvY29sICE9PSAnaHR0cCcgJiYgdGhpcy5wcm90b2NvbCAhPT0gJ2h0dHBzJykge1xuICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKGAke0VSUk9SX01FU1NBR0V9OiBJbnZhbGlkIHByb3RvY29sICR7dGhpcy5wcm90b2NvbH1gKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wb3J0ICYmIGlzTmFOKHBhcnNlSW50KHRoaXMucG9ydCwgMTApKSkge1xuICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKGAke0VSUk9SX01FU1NBR0V9OiBJbnZhbGlkIHBvcnQgJHt0aGlzLnBvcnR9YCk7XG4gICAgfVxuICB9XG59XG4iLCAiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgV3JhcHBlZEZ1bmN0aW9uIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5cbmltcG9ydCB7IGdldEdsb2JhbE9iamVjdCB9IGZyb20gJy4vZ2xvYmFsJztcblxuLy8gVE9ETzogSW1wbGVtZW50IGRpZmZlcmVudCBsb2dnZXJzIGZvciBkaWZmZXJlbnQgZW52aXJvbm1lbnRzXG5jb25zdCBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3Q8V2luZG93IHwgTm9kZUpTLkdsb2JhbD4oKTtcblxuLyoqIFByZWZpeCBmb3IgbG9nZ2luZyBzdHJpbmdzICovXG5jb25zdCBQUkVGSVggPSAnU2VudHJ5IExvZ2dlciAnO1xuXG4vKiogSlNEb2MgKi9cbmludGVyZmFjZSBFeHRlbnNpYmxlQ29uc29sZSBleHRlbmRzIENvbnNvbGUge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKlxuICogVGVtcG9yYXJpbHkgdW53cmFwIGBjb25zb2xlLmxvZ2AgYW5kIGZyaWVuZHMgaW4gb3JkZXIgdG8gcGVyZm9ybSB0aGUgZ2l2ZW4gY2FsbGJhY2sgdXNpbmcgdGhlIG9yaWdpbmFsIG1ldGhvZHMuXG4gKiBSZXN0b3JlcyB3cmFwcGluZyBhZnRlciB0aGUgY2FsbGJhY2sgY29tcGxldGVzLlxuICpcbiAqIEBwYXJhbSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdG8gcnVuIGFnYWluc3QgdGhlIG9yaWdpbmFsIGBjb25zb2xlYCBtZXNzYWdlc1xuICogQHJldHVybnMgVGhlIHJlc3VsdHMgb2YgdGhlIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zb2xlU2FuZGJveChjYWxsYmFjazogKCkgPT4gYW55KTogYW55IHtcbiAgY29uc3QgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0PFdpbmRvdz4oKTtcbiAgY29uc3QgbGV2ZWxzID0gWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InLCAnbG9nJywgJ2Fzc2VydCddO1xuXG4gIGlmICghKCdjb25zb2xlJyBpbiBnbG9iYWwpKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gIGNvbnN0IG9yaWdpbmFsQ29uc29sZSA9IChnbG9iYWwgYXMgYW55KS5jb25zb2xlIGFzIEV4dGVuc2libGVDb25zb2xlO1xuICBjb25zdCB3cmFwcGVkTGV2ZWxzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG5cbiAgLy8gUmVzdG9yZSBhbGwgd3JhcHBlZCBjb25zb2xlIG1ldGhvZHNcbiAgbGV2ZWxzLmZvckVhY2gobGV2ZWwgPT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICBpZiAobGV2ZWwgaW4gKGdsb2JhbCBhcyBhbnkpLmNvbnNvbGUgJiYgKG9yaWdpbmFsQ29uc29sZVtsZXZlbF0gYXMgV3JhcHBlZEZ1bmN0aW9uKS5fX3NlbnRyeV9vcmlnaW5hbF9fKSB7XG4gICAgICB3cmFwcGVkTGV2ZWxzW2xldmVsXSA9IG9yaWdpbmFsQ29uc29sZVtsZXZlbF0gYXMgV3JhcHBlZEZ1bmN0aW9uO1xuICAgICAgb3JpZ2luYWxDb25zb2xlW2xldmVsXSA9IChvcmlnaW5hbENvbnNvbGVbbGV2ZWxdIGFzIFdyYXBwZWRGdW5jdGlvbikuX19zZW50cnlfb3JpZ2luYWxfXztcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFBlcmZvcm0gY2FsbGJhY2sgbWFuaXB1bGF0aW9uc1xuICBjb25zdCByZXN1bHQgPSBjYWxsYmFjaygpO1xuXG4gIC8vIFJldmVydCByZXN0b3JhdGlvbiB0byB3cmFwcGVkIHN0YXRlXG4gIE9iamVjdC5rZXlzKHdyYXBwZWRMZXZlbHMpLmZvckVhY2gobGV2ZWwgPT4ge1xuICAgIG9yaWdpbmFsQ29uc29sZVtsZXZlbF0gPSB3cmFwcGVkTGV2ZWxzW2xldmVsXTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqIEpTRG9jICovXG5jbGFzcyBMb2dnZXIge1xuICAvKiogSlNEb2MgKi9cbiAgcHJpdmF0ZSBfZW5hYmxlZDogYm9vbGVhbjtcblxuICAvKiogSlNEb2MgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwdWJsaWMgZGlzYWJsZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9lbmFibGVkID0gZmFsc2U7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHVibGljIGVuYWJsZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9lbmFibGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwdWJsaWMgbG9nKC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9lbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnNvbGVTYW5kYm94KCgpID0+IHtcbiAgICAgIGdsb2JhbC5jb25zb2xlLmxvZyhgJHtQUkVGSVh9W0xvZ106ICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHVibGljIHdhcm4oLi4uYXJnczogYW55W10pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZVNhbmRib3goKCkgPT4ge1xuICAgICAgZ2xvYmFsLmNvbnNvbGUud2FybihgJHtQUkVGSVh9W1dhcm5dOiAke2FyZ3Muam9pbignICcpfWApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHB1YmxpYyBlcnJvciguLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zb2xlU2FuZGJveCgoKSA9PiB7XG4gICAgICBnbG9iYWwuY29uc29sZS5lcnJvcihgJHtQUkVGSVh9W0Vycm9yXTogJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBFbnN1cmUgd2Ugb25seSBoYXZlIGEgc2luZ2xlIGxvZ2dlciBpbnN0YW5jZSwgZXZlbiBpZiBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBAc2VudHJ5L3V0aWxzIGFyZSBiZWluZyB1c2VkXG5nbG9iYWwuX19TRU5UUllfXyA9IGdsb2JhbC5fX1NFTlRSWV9fIHx8IHt9O1xuY29uc3QgbG9nZ2VyID0gKGdsb2JhbC5fX1NFTlRSWV9fLmxvZ2dlciBhcyBMb2dnZXIpIHx8IChnbG9iYWwuX19TRU5UUllfXy5sb2dnZXIgPSBuZXcgTG9nZ2VyKCkpO1xuXG5leHBvcnQgeyBsb2dnZXIgfTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXMgKi9cbi8qKlxuICogTWVtbyBjbGFzcyB1c2VkIGZvciBkZWN5Y2xlIGpzb24gb2JqZWN0cy4gVXNlcyBXZWFrU2V0IGlmIGF2YWlsYWJsZSBvdGhlcndpc2UgYXJyYXkuXG4gKi9cbmV4cG9ydCBjbGFzcyBNZW1vIHtcbiAgLyoqIERldGVybWluZXMgaWYgV2Vha1NldCBpcyBhdmFpbGFibGUgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfaGFzV2Vha1NldDogYm9vbGVhbjtcbiAgLyoqIEVpdGhlciBXZWFrU2V0IG9yIEFycmF5ICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2lubmVyOiBhbnk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2hhc1dlYWtTZXQgPSB0eXBlb2YgV2Vha1NldCA9PT0gJ2Z1bmN0aW9uJztcbiAgICB0aGlzLl9pbm5lciA9IHRoaXMuX2hhc1dlYWtTZXQgPyBuZXcgV2Vha1NldCgpIDogW107XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBvYmogdG8gcmVtZW1iZXIuXG4gICAqIEBwYXJhbSBvYmogT2JqZWN0IHRvIHJlbWVtYmVyXG4gICAqL1xuICBwdWJsaWMgbWVtb2l6ZShvYmo6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9oYXNXZWFrU2V0KSB7XG4gICAgICBpZiAodGhpcy5faW5uZXIuaGFzKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICB0aGlzLl9pbm5lci5hZGQob2JqKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItZm9yLW9mXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9pbm5lci5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl9pbm5lcltpXTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gb2JqKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9pbm5lci5wdXNoKG9iaik7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgb2JqZWN0IGZyb20gaW50ZXJuYWwgc3RvcmFnZS5cbiAgICogQHBhcmFtIG9iaiBPYmplY3QgdG8gZm9yZ2V0XG4gICAqL1xuICBwdWJsaWMgdW5tZW1vaXplKG9iajogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2hhc1dlYWtTZXQpIHtcbiAgICAgIHRoaXMuX2lubmVyLmRlbGV0ZShvYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2lubmVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLl9pbm5lcltpXSA9PT0gb2JqKSB7XG4gICAgICAgICAgdGhpcy5faW5uZXIuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiY29uc3QgZGVmYXVsdEZ1bmN0aW9uTmFtZSA9ICc8YW5vbnltb3VzPic7XG5cbi8qKlxuICogU2FmZWx5IGV4dHJhY3QgZnVuY3Rpb24gbmFtZSBmcm9tIGl0c2VsZlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RnVuY3Rpb25OYW1lKGZuOiB1bmtub3duKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBpZiAoIWZuIHx8IHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGRlZmF1bHRGdW5jdGlvbk5hbWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5uYW1lIHx8IGRlZmF1bHRGdW5jdGlvbk5hbWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBKdXN0IGFjY2Vzc2luZyBjdXN0b20gcHJvcHMgaW4gc29tZSBTZWxlbml1bSBlbnZpcm9ubWVudHNcbiAgICAvLyBjYW4gY2F1c2UgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXhjZXB0aW9uIChzZWUgcmF2ZW4tanMjNDk1KS5cbiAgICByZXR1cm4gZGVmYXVsdEZ1bmN0aW9uTmFtZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGlzUmVnRXhwLCBpc1N0cmluZyB9IGZyb20gJy4vaXMnO1xuXG4vKipcbiAqIFRydW5jYXRlcyBnaXZlbiBzdHJpbmcgdG8gdGhlIG1heGltdW0gY2hhcmFjdGVycyBjb3VudFxuICpcbiAqIEBwYXJhbSBzdHIgQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgc2VyaWFsaXphYmxlIHZhbHVlc1xuICogQHBhcmFtIG1heCBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRydW5jYXRlZCBzdHJpbmcgKDAgPSB1bmxpbWl0ZWQpXG4gKiBAcmV0dXJucyBzdHJpbmcgRW5jb2RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ1bmNhdGUoc3RyOiBzdHJpbmcsIG1heDogbnVtYmVyID0gMCk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJyB8fCBtYXggPT09IDApIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIHJldHVybiBzdHIubGVuZ3RoIDw9IG1heCA/IHN0ciA6IGAke3N0ci5zdWJzdHIoMCwgbWF4KX0uLi5gO1xufVxuXG4vKipcbiAqIFRoaXMgaXMgYmFzaWNhbGx5IGp1c3QgYHRyaW1fbGluZWAgZnJvbVxuICogaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnkvYmxvYi9tYXN0ZXIvc3JjL3NlbnRyeS9sYW5nL2phdmFzY3JpcHQvcHJvY2Vzc29yLnB5I0w2N1xuICpcbiAqIEBwYXJhbSBzdHIgQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgc2VyaWFsaXphYmxlIHZhbHVlc1xuICogQHBhcmFtIG1heCBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRydW5jYXRlZCBzdHJpbmdcbiAqIEByZXR1cm5zIHN0cmluZyBFbmNvZGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbmlwTGluZShsaW5lOiBzdHJpbmcsIGNvbG5vOiBudW1iZXIpOiBzdHJpbmcge1xuICBsZXQgbmV3TGluZSA9IGxpbmU7XG4gIGNvbnN0IGxsID0gbmV3TGluZS5sZW5ndGg7XG4gIGlmIChsbCA8PSAxNTApIHtcbiAgICByZXR1cm4gbmV3TGluZTtcbiAgfVxuICBpZiAoY29sbm8gPiBsbCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgIGNvbG5vID0gbGw7XG4gIH1cblxuICBsZXQgc3RhcnQgPSBNYXRoLm1heChjb2xubyAtIDYwLCAwKTtcbiAgaWYgKHN0YXJ0IDwgNSkge1xuICAgIHN0YXJ0ID0gMDtcbiAgfVxuXG4gIGxldCBlbmQgPSBNYXRoLm1pbihzdGFydCArIDE0MCwgbGwpO1xuICBpZiAoZW5kID4gbGwgLSA1KSB7XG4gICAgZW5kID0gbGw7XG4gIH1cbiAgaWYgKGVuZCA9PT0gbGwpIHtcbiAgICBzdGFydCA9IE1hdGgubWF4KGVuZCAtIDE0MCwgMCk7XG4gIH1cblxuICBuZXdMaW5lID0gbmV3TGluZS5zbGljZShzdGFydCwgZW5kKTtcbiAgaWYgKHN0YXJ0ID4gMCkge1xuICAgIG5ld0xpbmUgPSBgJ3tzbmlwfSAke25ld0xpbmV9YDtcbiAgfVxuICBpZiAoZW5kIDwgbGwpIHtcbiAgICBuZXdMaW5lICs9ICcge3NuaXB9JztcbiAgfVxuXG4gIHJldHVybiBuZXdMaW5lO1xufVxuXG4vKipcbiAqIEpvaW4gdmFsdWVzIGluIGFycmF5XG4gKiBAcGFyYW0gaW5wdXQgYXJyYXkgb2YgdmFsdWVzIHRvIGJlIGpvaW5lZCB0b2dldGhlclxuICogQHBhcmFtIGRlbGltaXRlciBzdHJpbmcgdG8gYmUgcGxhY2VkIGluLWJldHdlZW4gdmFsdWVzXG4gKiBAcmV0dXJucyBKb2luZWQgdmFsdWVzXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgZnVuY3Rpb24gc2FmZUpvaW4oaW5wdXQ6IGFueVtdLCBkZWxpbWl0ZXI/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0ID0gW107XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLWZvci1vZlxuICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdmFsdWUgPSBpbnB1dFtpXTtcbiAgICB0cnkge1xuICAgICAgb3V0cHV0LnB1c2goU3RyaW5nKHZhbHVlKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgb3V0cHV0LnB1c2goJ1t2YWx1ZSBjYW5ub3QgYmUgc2VyaWFsaXplZF0nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3V0cHV0LmpvaW4oZGVsaW1pdGVyKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIHZhbHVlIG1hdGNoZXMgYSByZWdleCBvciBpbmNsdWRlcyB0aGUgc3RyaW5nXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHN0cmluZyB2YWx1ZSB0byBiZSBjaGVja2VkIGFnYWluc3RcbiAqIEBwYXJhbSBwYXR0ZXJuIEVpdGhlciBhIHJlZ2V4IG9yIGEgc3RyaW5nIHRoYXQgbXVzdCBiZSBjb250YWluZWQgaW4gdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTWF0Y2hpbmdQYXR0ZXJuKHZhbHVlOiBzdHJpbmcsIHBhdHRlcm46IFJlZ0V4cCB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChpc1JlZ0V4cChwYXR0ZXJuKSkge1xuICAgIHJldHVybiAocGF0dGVybiBhcyBSZWdFeHApLnRlc3QodmFsdWUpO1xuICB9XG4gIGlmICh0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUuaW5kZXhPZihwYXR0ZXJuKSAhPT0gLTE7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEdpdmVuIGEgc3RyaW5nLCBlc2NhcGUgY2hhcmFjdGVycyB3aGljaCBoYXZlIG1lYW5pbmcgaW4gdGhlIHJlZ2V4IGdyYW1tYXIsIHN1Y2ggdGhhdCB0aGUgcmVzdWx0IGlzIHNhZmUgdG8gZmVlZCB0b1xuICogYG5ldyBSZWdFeHAoKWAuXG4gKlxuICogQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9lc2NhcGUtc3RyaW5nLXJlZ2V4cC4gVmVuZG9yZWQgdG8gYSkgcmVkdWNlIHRoZSBzaXplIGJ5IHNraXBwaW5nIHRoZSBydW50aW1lXG4gKiB0eXBlLWNoZWNraW5nLCBhbmQgYikgZW5zdXJlIGl0IGdldHMgZG93bi1jb21waWxlZCBmb3Igb2xkIHZlcnNpb25zIG9mIE5vZGUgKHRoZSBwdWJsaXNoZWQgcGFja2FnZSBvbmx5IHN1cHBvcnRzIE5vZGVcbiAqIDEyKykuXG4gKlxuICogQHBhcmFtIHJlZ2V4U3RyaW5nIFRoZSBzdHJpbmcgdG8gZXNjYXBlXG4gKiBAcmV0dXJucyBBbiB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcgd2l0aCBhbGwgc3BlY2lhbCByZWdleCBjaGFyYWN0ZXJzIGVzY2FwZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVN0cmluZ0ZvclJlZ2V4KHJlZ2V4U3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBlc2NhcGUgdGhlIGh5cGhlbiBzZXBhcmF0ZWx5IHNvIHdlIGNhbiBhbHNvIHJlcGxhY2UgaXQgd2l0aCBhIHVuaWNvZGUgbGl0ZXJhbCBoeXBoZW4sIHRvIGF2b2lkIHRoZSBwcm9ibGVtc1xuICAvLyBkaXNjdXNzZWQgaW4gaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9lc2NhcGUtc3RyaW5nLXJlZ2V4cC9pc3N1ZXMvMjAuXG4gIHJldHVybiByZWdleFN0cmluZy5yZXBsYWNlKC9bfFxcXFx7fSgpW1xcXV4kKyo/Ll0vZywgJ1xcXFwkJicpLnJlcGxhY2UoLy0vZywgJ1xcXFx4MmQnKTtcbn1cbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGluZXMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IEV4dGVuZGVkRXJyb3IsIFdyYXBwZWRGdW5jdGlvbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuXG5pbXBvcnQgeyBodG1sVHJlZUFzU3RyaW5nIH0gZnJvbSAnLi9icm93c2VyJztcbmltcG9ydCB7IGlzRWxlbWVudCwgaXNFcnJvciwgaXNFdmVudCwgaXNJbnN0YW5jZU9mLCBpc1BsYWluT2JqZWN0LCBpc1ByaW1pdGl2ZSwgaXNTeW50aGV0aWNFdmVudCB9IGZyb20gJy4vaXMnO1xuaW1wb3J0IHsgTWVtbyB9IGZyb20gJy4vbWVtbyc7XG5pbXBvcnQgeyBnZXRGdW5jdGlvbk5hbWUgfSBmcm9tICcuL3N0YWNrdHJhY2UnO1xuaW1wb3J0IHsgdHJ1bmNhdGUgfSBmcm9tICcuL3N0cmluZyc7XG5cbi8qKlxuICogUmVwbGFjZSBhIG1ldGhvZCBpbiBhbiBvYmplY3Qgd2l0aCBhIHdyYXBwZWQgdmVyc2lvbiBvZiBpdHNlbGYuXG4gKlxuICogQHBhcmFtIHNvdXJjZSBBbiBvYmplY3QgdGhhdCBjb250YWlucyBhIG1ldGhvZCB0byBiZSB3cmFwcGVkLlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBiZSB3cmFwcGVkLlxuICogQHBhcmFtIHJlcGxhY2VtZW50RmFjdG9yeSBBIGhpZ2hlci1vcmRlciBmdW5jdGlvbiB0aGF0IHRha2VzIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBnaXZlbiBtZXRob2QgYW5kIHJldHVybnMgYVxuICogd3JhcHBlZCB2ZXJzaW9uLiBOb3RlOiBUaGUgZnVuY3Rpb24gcmV0dXJuZWQgYnkgYHJlcGxhY2VtZW50RmFjdG9yeWAgbmVlZHMgdG8gYmUgYSBub24tYXJyb3cgZnVuY3Rpb24sIGluIG9yZGVyIHRvXG4gKiBwcmVzZXJ2ZSB0aGUgY29ycmVjdCB2YWx1ZSBvZiBgdGhpc2AsIGFuZCB0aGUgb3JpZ2luYWwgbWV0aG9kIG11c3QgYmUgY2FsbGVkIHVzaW5nIGBvcmlnTWV0aG9kLmNhbGwodGhpcywgPG90aGVyXG4gKiBhcmdzPilgIG9yIGBvcmlnTWV0aG9kLmFwcGx5KHRoaXMsIFs8b3RoZXIgYXJncz5dKWAgKHJhdGhlciB0aGFuIGJlaW5nIGNhbGxlZCBkaXJlY3RseSksIGFnYWluIHRvIHByZXNlcnZlIGB0aGlzYC5cbiAqIEByZXR1cm5zIHZvaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGwoc291cmNlOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBuYW1lOiBzdHJpbmcsIHJlcGxhY2VtZW50RmFjdG9yeTogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpOiB2b2lkIHtcbiAgaWYgKCEobmFtZSBpbiBzb3VyY2UpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb3JpZ2luYWwgPSBzb3VyY2VbbmFtZV0gYXMgKCkgPT4gYW55O1xuICBjb25zdCB3cmFwcGVkID0gcmVwbGFjZW1lbnRGYWN0b3J5KG9yaWdpbmFsKSBhcyBXcmFwcGVkRnVuY3Rpb247XG5cbiAgLy8gTWFrZSBzdXJlIGl0J3MgYSBmdW5jdGlvbiBmaXJzdCwgYXMgd2UgbmVlZCB0byBhdHRhY2ggYW4gZW1wdHkgcHJvdG90eXBlIGZvciBgZGVmaW5lUHJvcGVydGllc2AgdG8gd29ya1xuICAvLyBvdGhlcndpc2UgaXQnbGwgdGhyb3cgXCJUeXBlRXJyb3I6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIGNhbGxlZCBvbiBub24tb2JqZWN0XCJcbiAgaWYgKHR5cGVvZiB3cmFwcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHdyYXBwZWQucHJvdG90eXBlID0gd3JhcHBlZC5wcm90b3R5cGUgfHwge307XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh3cmFwcGVkLCB7XG4gICAgICAgIF9fc2VudHJ5X29yaWdpbmFsX186IHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB2YWx1ZTogb3JpZ2luYWwsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChfT28pIHtcbiAgICAgIC8vIFRoaXMgY2FuIHRocm93IGlmIG11bHRpcGxlIGZpbGwgaGFwcGVucyBvbiBhIGdsb2JhbCBvYmplY3QgbGlrZSBYTUxIdHRwUmVxdWVzdFxuICAgICAgLy8gRml4ZXMgaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnktamF2YXNjcmlwdC9pc3N1ZXMvMjA0M1xuICAgIH1cbiAgfVxuXG4gIHNvdXJjZVtuYW1lXSA9IHdyYXBwZWQ7XG59XG5cbi8qKlxuICogRW5jb2RlcyBnaXZlbiBvYmplY3QgaW50byB1cmwtZnJpZW5kbHkgZm9ybWF0XG4gKlxuICogQHBhcmFtIG9iamVjdCBBbiBvYmplY3QgdGhhdCBjb250YWlucyBzZXJpYWxpemFibGUgdmFsdWVzXG4gKiBAcmV0dXJucyBzdHJpbmcgRW5jb2RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXJsRW5jb2RlKG9iamVjdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSk6IHN0cmluZyB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmplY3QpXG4gICAgLm1hcChrZXkgPT4gYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGtleSl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KG9iamVjdFtrZXldKX1gKVxuICAgIC5qb2luKCcmJyk7XG59XG5cbi8qKlxuICogVHJhbnNmb3JtcyBhbnkgb2JqZWN0IGludG8gYW4gb2JqZWN0IGxpdGVyYWwgd2l0aCBhbGwgaXRzIGF0dHJpYnV0ZXNcbiAqIGF0dGFjaGVkIHRvIGl0LlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBJbml0aWFsIHNvdXJjZSB0aGF0IHdlIGhhdmUgdG8gdHJhbnNmb3JtIGluIG9yZGVyIGZvciBpdCB0byBiZSB1c2FibGUgYnkgdGhlIHNlcmlhbGl6ZXJcbiAqL1xuZnVuY3Rpb24gZ2V0V2Fsa1NvdXJjZShcbiAgdmFsdWU6IGFueSxcbik6IHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufSB7XG4gIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgIGNvbnN0IGVycm9yID0gdmFsdWUgYXMgRXh0ZW5kZWRFcnJvcjtcbiAgICBjb25zdCBlcnI6IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgIHN0YWNrOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgfSA9IHtcbiAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICBuYW1lOiBlcnJvci5uYW1lLFxuICAgICAgc3RhY2s6IGVycm9yLnN0YWNrLFxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IGkgaW4gZXJyb3IpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXJyb3IsIGkpKSB7XG4gICAgICAgIGVycltpXSA9IGVycm9yW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlcnI7XG4gIH1cblxuICBpZiAoaXNFdmVudCh2YWx1ZSkpIHtcbiAgICAvKipcbiAgICAgKiBFdmVudC1saWtlIGludGVyZmFjZSB0aGF0J3MgdXNhYmxlIGluIGJyb3dzZXIgYW5kIG5vZGVcbiAgICAgKi9cbiAgICBpbnRlcmZhY2UgU2ltcGxlRXZlbnQge1xuICAgICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgICAgIHR5cGU6IHN0cmluZztcbiAgICAgIHRhcmdldD86IHVua25vd247XG4gICAgICBjdXJyZW50VGFyZ2V0PzogdW5rbm93bjtcbiAgICB9XG5cbiAgICBjb25zdCBldmVudCA9IHZhbHVlIGFzIFNpbXBsZUV2ZW50O1xuXG4gICAgY29uc3Qgc291cmNlOiB7XG4gICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgfSA9IHt9O1xuXG4gICAgLy8gQWNjZXNzaW5nIGV2ZW50IGF0dHJpYnV0ZXMgY2FuIHRocm93IChzZWUgaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnktamF2YXNjcmlwdC9pc3N1ZXMvNzY4IGFuZFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzgzOCksIGJ1dCBhY2Nlc3NpbmcgYHR5cGVgIGhhc24ndCBiZWVuIHdyYXBwZWQgaW4gYVxuICAgIC8vIHRyeS1jYXRjaCBpbiBhdCBsZWFzdCB0d28geWVhcnMgYW5kIG5vIG9uZSdzIGNvbXBsYWluZWQsIHNvIHRoYXQncyBsaWtlbHkgbm90IGFuIGlzc3VlIGFueW1vcmVcbiAgICBzb3VyY2UudHlwZSA9IGV2ZW50LnR5cGU7XG5cbiAgICB0cnkge1xuICAgICAgc291cmNlLnRhcmdldCA9IGlzRWxlbWVudChldmVudC50YXJnZXQpXG4gICAgICAgID8gaHRtbFRyZWVBc1N0cmluZyhldmVudC50YXJnZXQpXG4gICAgICAgIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGV2ZW50LnRhcmdldCk7XG4gICAgfSBjYXRjaCAoX29PKSB7XG4gICAgICBzb3VyY2UudGFyZ2V0ID0gJzx1bmtub3duPic7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHNvdXJjZS5jdXJyZW50VGFyZ2V0ID0gaXNFbGVtZW50KGV2ZW50LmN1cnJlbnRUYXJnZXQpXG4gICAgICAgID8gaHRtbFRyZWVBc1N0cmluZyhldmVudC5jdXJyZW50VGFyZ2V0KVxuICAgICAgICA6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChldmVudC5jdXJyZW50VGFyZ2V0KTtcbiAgICB9IGNhdGNoIChfb08pIHtcbiAgICAgIHNvdXJjZS5jdXJyZW50VGFyZ2V0ID0gJzx1bmtub3duPic7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBDdXN0b21FdmVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNJbnN0YW5jZU9mKHZhbHVlLCBDdXN0b21FdmVudCkpIHtcbiAgICAgIHNvdXJjZS5kZXRhaWwgPSBldmVudC5kZXRhaWw7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhdHRyIGluIGV2ZW50KSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV2ZW50LCBhdHRyKSkge1xuICAgICAgICBzb3VyY2VbYXR0cl0gPSBldmVudFthdHRyXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc291cmNlO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlIGFzIHtcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIH07XG59XG5cbi8qKiBDYWxjdWxhdGVzIGJ5dGVzIHNpemUgb2YgaW5wdXQgc3RyaW5nICovXG5mdW5jdGlvbiB1dGY4TGVuZ3RoKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICByZXR1cm4gfi1lbmNvZGVVUkkodmFsdWUpLnNwbGl0KC8lLi58Li8pLmxlbmd0aDtcbn1cblxuLyoqIENhbGN1bGF0ZXMgYnl0ZXMgc2l6ZSBvZiBpbnB1dCBvYmplY3QgKi9cbmZ1bmN0aW9uIGpzb25TaXplKHZhbHVlOiBhbnkpOiBudW1iZXIge1xuICByZXR1cm4gdXRmOExlbmd0aChKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xufVxuXG4vKiogSlNEb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVUb1NpemU8VD4oXG4gIG9iamVjdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSxcbiAgLy8gRGVmYXVsdCBOb2RlLmpzIFJFUEwgZGVwdGhcbiAgZGVwdGg6IG51bWJlciA9IDMsXG4gIC8vIDEwMGtCLCBhcyAyMDBrQiBpcyBtYXggcGF5bG9hZCBzaXplLCBzbyBoYWxmIHNvdW5kcyByZWFzb25hYmxlXG4gIG1heFNpemU6IG51bWJlciA9IDEwMCAqIDEwMjQsXG4pOiBUIHtcbiAgY29uc3Qgc2VyaWFsaXplZCA9IG5vcm1hbGl6ZShvYmplY3QsIGRlcHRoKTtcblxuICBpZiAoanNvblNpemUoc2VyaWFsaXplZCkgPiBtYXhTaXplKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVRvU2l6ZShvYmplY3QsIGRlcHRoIC0gMSwgbWF4U2l6ZSk7XG4gIH1cblxuICByZXR1cm4gc2VyaWFsaXplZCBhcyBUO1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybSBhbnkgbm9uLXByaW1pdGl2ZSwgQmlnSW50LCBvciBTeW1ib2wtdHlwZSB2YWx1ZSBpbnRvIGEgc3RyaW5nLiBBY3RzIGFzIGEgbm8tb3Agb24gc3RyaW5ncywgbnVtYmVycyxcbiAqIGJvb2xlYW5zLCBudWxsLCBhbmQgdW5kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc3RyaW5naWZ5XG4gKiBAcmV0dXJucyBGb3Igbm9uLXByaW1pdGl2ZSwgQmlnSW50LCBhbmQgU3ltYm9sLXR5cGUgdmFsdWVzLCBhIHN0cmluZyBkZW5vdGluZyB0aGUgdmFsdWUncyB0eXBlLCB0eXBlIGFuZCB2YWx1ZSwgb3JcbiAqICB0eXBlIGFuZCBgZGVzY3JpcHRpb25gIHByb3BlcnR5LCByZXNwZWN0aXZlbHkuIEZvciBub24tQmlnSW50LCBub24tU3ltYm9sIHByaW1pdGl2ZXMsIHJldHVybnMgdGhlIG9yaWdpbmFsIHZhbHVlLFxuICogIHVuY2hhbmdlZC5cbiAqL1xuZnVuY3Rpb24gc2VyaWFsaXplVmFsdWUodmFsdWU6IGFueSk6IGFueSB7XG4gIGNvbnN0IHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuXG4gIC8vIE5vZGUuanMgUkVQTCBub3RhdGlvblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICByZXR1cm4gJ1tPYmplY3RdJztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgQXJyYXldJykge1xuICAgIHJldHVybiAnW0FycmF5XSc7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplVmFsdWUodmFsdWUpO1xuICByZXR1cm4gaXNQcmltaXRpdmUobm9ybWFsaXplZCkgPyBub3JtYWxpemVkIDogdHlwZTtcbn1cblxuLyoqXG4gKiBub3JtYWxpemVWYWx1ZSgpXG4gKlxuICogVGFrZXMgdW5zZXJpYWxpemFibGUgaW5wdXQgYW5kIG1ha2UgaXQgc2VyaWFsaXphYmxlIGZyaWVuZGx5XG4gKlxuICogLSB0cmFuc2xhdGVzIHVuZGVmaW5lZC9OYU4gdmFsdWVzIHRvIFwiW3VuZGVmaW5lZF1cIi9cIltOYU5dXCIgcmVzcGVjdGl2ZWx5LFxuICogLSBzZXJpYWxpemVzIEVycm9yIG9iamVjdHNcbiAqIC0gZmlsdGVyIGdsb2JhbCBvYmplY3RzXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlPFQ+KHZhbHVlOiBULCBrZXk/OiBhbnkpOiBUIHwgc3RyaW5nIHtcbiAgaWYgKGtleSA9PT0gJ2RvbWFpbicgJiYgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAoKHZhbHVlIGFzIHVua25vd24pIGFzIHsgX2V2ZW50czogYW55IH0pLl9ldmVudHMpIHtcbiAgICByZXR1cm4gJ1tEb21haW5dJztcbiAgfVxuXG4gIGlmIChrZXkgPT09ICdkb21haW5FbWl0dGVyJykge1xuICAgIHJldHVybiAnW0RvbWFpbkVtaXR0ZXJdJztcbiAgfVxuXG4gIGlmICh0eXBlb2YgKGdsb2JhbCBhcyBhbnkpICE9PSAndW5kZWZpbmVkJyAmJiAodmFsdWUgYXMgdW5rbm93bikgPT09IGdsb2JhbCkge1xuICAgIHJldHVybiAnW0dsb2JhbF0nO1xuICB9XG5cbiAgLy8gSXQncyBzYWZlIHRvIHVzZSBgd2luZG93YCBhbmQgYGRvY3VtZW50YCBoZXJlIGluIHRoaXMgbWFubmVyLCBhcyB3ZSBhcmUgYXNzZXJ0aW5nIHVzaW5nIGB0eXBlb2ZgIGZpcnN0XG4gIC8vIHdoaWNoIHdvbid0IHRocm93IGlmIHRoZXkgYXJlIG5vdCBwcmVzZW50LlxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcbiAgaWYgKHR5cGVvZiAod2luZG93IGFzIGFueSkgIT09ICd1bmRlZmluZWQnICYmICh2YWx1ZSBhcyB1bmtub3duKSA9PT0gd2luZG93KSB7XG4gICAgcmV0dXJuICdbV2luZG93XSc7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXG4gIGlmICh0eXBlb2YgKGRvY3VtZW50IGFzIGFueSkgIT09ICd1bmRlZmluZWQnICYmICh2YWx1ZSBhcyB1bmtub3duKSA9PT0gZG9jdW1lbnQpIHtcbiAgICByZXR1cm4gJ1tEb2N1bWVudF0nO1xuICB9XG5cbiAgLy8gUmVhY3QncyBTeW50aGV0aWNFdmVudCB0aGluZ3lcbiAgaWYgKGlzU3ludGhldGljRXZlbnQodmFsdWUpKSB7XG4gICAgcmV0dXJuICdbU3ludGhldGljRXZlbnRdJztcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHZhbHVlICE9PSB2YWx1ZSkge1xuICAgIHJldHVybiAnW05hTl0nO1xuICB9XG5cbiAgaWYgKHZhbHVlID09PSB2b2lkIDApIHtcbiAgICByZXR1cm4gJ1t1bmRlZmluZWRdJztcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gYFtGdW5jdGlvbjogJHtnZXRGdW5jdGlvbk5hbWUodmFsdWUpfV1gO1xuICB9XG5cbiAgLy8gc3ltYm9scyBhbmQgYmlnaW50cyBhcmUgY29uc2lkZXJlZCBwcmltaXRpdmVzIGJ5IFRTLCBidXQgYXJlbid0IG5hdGl2ZWx5IEpTT04tc2VyaWxhaXphYmxlXG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICByZXR1cm4gYFske1N0cmluZyh2YWx1ZSl9XWA7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiBgW0JpZ0ludDogJHtTdHJpbmcodmFsdWUpfV1gO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIFdhbGtzIGFuIG9iamVjdCB0byBwZXJmb3JtIGEgbm9ybWFsaXphdGlvbiBvbiBpdFxuICpcbiAqIEBwYXJhbSBrZXkgb2Ygb2JqZWN0IHRoYXQncyB3YWxrZWQgaW4gY3VycmVudCBpdGVyYXRpb25cbiAqIEBwYXJhbSB2YWx1ZSBvYmplY3QgdG8gYmUgd2Fsa2VkXG4gKiBAcGFyYW0gZGVwdGggT3B0aW9uYWwgbnVtYmVyIGluZGljYXRpbmcgaG93IGRlZXAgc2hvdWxkIHdhbGtpbmcgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0gbWVtbyBPcHRpb25hbCBNZW1vIGNsYXNzIGhhbmRsaW5nIGRlY3ljbGluZ1xuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuZXhwb3J0IGZ1bmN0aW9uIHdhbGsoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIGRlcHRoOiBudW1iZXIgPSArSW5maW5pdHksIG1lbW86IE1lbW8gPSBuZXcgTWVtbygpKTogYW55IHtcbiAgLy8gSWYgd2UgcmVhY2ggdGhlIG1heGltdW0gZGVwdGgsIHNlcmlhbGl6ZSB3aGF0ZXZlciBoYXMgbGVmdFxuICBpZiAoZGVwdGggPT09IDApIHtcbiAgICByZXR1cm4gc2VyaWFsaXplVmFsdWUodmFsdWUpO1xuICB9XG5cbiAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzICovXG4gIC8vIElmIHZhbHVlIGltcGxlbWVudHMgYHRvSlNPTmAgbWV0aG9kLCBjYWxsIGl0IGFuZCByZXR1cm4gZWFybHlcbiAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHZhbHVlLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB2YWx1ZS50b0pTT04oKTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xuXG4gIC8vIElmIG5vcm1hbGl6ZWQgdmFsdWUgaXMgYSBwcmltaXRpdmUsIHRoZXJlIGFyZSBubyBicmFuY2hlcyBsZWZ0IHRvIHdhbGssIHNvIHdlIGNhbiBqdXN0IGJhaWwgb3V0LCBhcyB0aGVyZXMgbm8gcG9pbnQgaW4gZ29pbmcgZG93biB0aGF0IGJyYW5jaCBhbnkgZnVydGhlclxuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplVmFsdWUodmFsdWUsIGtleSk7XG4gIGlmIChpc1ByaW1pdGl2ZShub3JtYWxpemVkKSkge1xuICAgIHJldHVybiBub3JtYWxpemVkO1xuICB9XG5cbiAgLy8gQ3JlYXRlIHNvdXJjZSB0aGF0IHdlIHdpbGwgdXNlIGZvciBuZXh0IGl0dGVyYXRpb25zLCBlaXRoZXIgb2JqZWN0aWZpZWQgZXJyb3Igb2JqZWN0IChFcnJvciB0eXBlIHdpdGggZXh0cmFjdGVkIGtleXM6dmFsdWUgcGFpcnMpIG9yIHRoZSBpbnB1dCBpdHNlbGZcbiAgY29uc3Qgc291cmNlID0gZ2V0V2Fsa1NvdXJjZSh2YWx1ZSk7XG5cbiAgLy8gQ3JlYXRlIGFuIGFjY3VtdWxhdG9yIHRoYXQgd2lsbCBhY3QgYXMgYSBwYXJlbnQgZm9yIGFsbCBmdXR1cmUgaXR0ZXJhdGlvbnMgb2YgdGhhdCBicmFuY2hcbiAgY29uc3QgYWNjID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbXSA6IHt9O1xuXG4gIC8vIElmIHdlIGFscmVhZHkgd2Fsa2VkIHRoYXQgYnJhbmNoLCBiYWlsIG91dCwgYXMgaXQncyBjaXJjdWxhciByZWZlcmVuY2VcbiAgaWYgKG1lbW8ubWVtb2l6ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gJ1tDaXJjdWxhciB+XSc7XG4gIH1cblxuICAvLyBXYWxrIGFsbCBrZXlzIG9mIHRoZSBzb3VyY2VcbiAgZm9yIChjb25zdCBpbm5lcktleSBpbiBzb3VyY2UpIHtcbiAgICAvLyBBdm9pZCBpdGVyYXRpbmcgb3ZlciBmaWVsZHMgaW4gdGhlIHByb3RvdHlwZSBpZiB0aGV5J3ZlIHNvbWVob3cgYmVlbiBleHBvc2VkIHRvIGVudW1lcmF0aW9uLlxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwgaW5uZXJLZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gUmVjdXJzaXZlbHkgd2FsayB0aHJvdWdoIGFsbCB0aGUgY2hpbGQgbm9kZXNcbiAgICAoYWNjIGFzIHsgW2tleTogc3RyaW5nXTogYW55IH0pW2lubmVyS2V5XSA9IHdhbGsoaW5uZXJLZXksIHNvdXJjZVtpbm5lcktleV0sIGRlcHRoIC0gMSwgbWVtbyk7XG4gIH1cblxuICAvLyBPbmNlIHdhbGtlZCB0aHJvdWdoIGFsbCB0aGUgYnJhbmNoZXMsIHJlbW92ZSB0aGUgcGFyZW50IGZyb20gbWVtbyBzdG9yYWdlXG4gIG1lbW8udW5tZW1vaXplKHZhbHVlKTtcblxuICAvLyBSZXR1cm4gYWNjdW11bGF0ZWQgdmFsdWVzXG4gIHJldHVybiBhY2M7XG59XG5cbi8qKlxuICogbm9ybWFsaXplKClcbiAqXG4gKiAtIENyZWF0ZXMgYSBjb3B5IHRvIHByZXZlbnQgb3JpZ2luYWwgaW5wdXQgbXV0YXRpb25cbiAqIC0gU2tpcCBub24tZW51bWVyYWJsZXJzXG4gKiAtIENhbGxzIGB0b0pTT05gIGlmIGltcGxlbWVudGVkXG4gKiAtIFJlbW92ZXMgY2lyY3VsYXIgcmVmZXJlbmNlc1xuICogLSBUcmFuc2xhdGVzIG5vbi1zZXJpYWxpemVhYmxlIHZhbHVlcyAodW5kZWZpbmVkL05hTi9GdW5jdGlvbnMpIHRvIHNlcmlhbGl6YWJsZSBmb3JtYXRcbiAqIC0gVHJhbnNsYXRlcyBrbm93biBnbG9iYWwgb2JqZWN0cy9DbGFzc2VzIHRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uc1xuICogLSBUYWtlcyBjYXJlIG9mIEVycm9yIG9iamVjdHMgc2VyaWFsaXphdGlvblxuICogLSBPcHRpb25hbGx5IGxpbWl0IGRlcHRoIG9mIGZpbmFsIG91dHB1dFxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShpbnB1dDogYW55LCBkZXB0aD86IG51bWJlcik6IGFueSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaW5wdXQsIChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gd2FsayhrZXksIHZhbHVlLCBkZXB0aCkpKTtcbiAgfSBjYXRjaCAoX29PKSB7XG4gICAgcmV0dXJuICcqKm5vbi1zZXJpYWxpemFibGUqKic7XG4gIH1cbn1cblxuLyoqXG4gKiBHaXZlbiBhbnkgY2FwdHVyZWQgZXhjZXB0aW9uLCBleHRyYWN0IGl0cyBrZXlzIGFuZCBjcmVhdGUgYSBzb3J0ZWRcbiAqIGFuZCB0cnVuY2F0ZWQgbGlzdCB0aGF0IHdpbGwgYmUgdXNlZCBpbnNpZGUgdGhlIGV2ZW50IG1lc3NhZ2UuXG4gKiBlZy4gYE5vbi1lcnJvciBleGNlcHRpb24gY2FwdHVyZWQgd2l0aCBrZXlzOiBmb28sIGJhciwgYmF6YFxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RFeGNlcHRpb25LZXlzRm9yTWVzc2FnZShleGNlcHRpb246IGFueSwgbWF4TGVuZ3RoOiBudW1iZXIgPSA0MCk6IHN0cmluZyB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhnZXRXYWxrU291cmNlKGV4Y2VwdGlvbikpO1xuICBrZXlzLnNvcnQoKTtcblxuICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICdbb2JqZWN0IGhhcyBubyBrZXlzXSc7XG4gIH1cblxuICBpZiAoa2V5c1swXS5sZW5ndGggPj0gbWF4TGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRydW5jYXRlKGtleXNbMF0sIG1heExlbmd0aCk7XG4gIH1cblxuICBmb3IgKGxldCBpbmNsdWRlZEtleXMgPSBrZXlzLmxlbmd0aDsgaW5jbHVkZWRLZXlzID4gMDsgaW5jbHVkZWRLZXlzLS0pIHtcbiAgICBjb25zdCBzZXJpYWxpemVkID0ga2V5cy5zbGljZSgwLCBpbmNsdWRlZEtleXMpLmpvaW4oJywgJyk7XG4gICAgaWYgKHNlcmlhbGl6ZWQubGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGluY2x1ZGVkS2V5cyA9PT0ga2V5cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1bmNhdGUoc2VyaWFsaXplZCwgbWF4TGVuZ3RoKTtcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuLyoqXG4gKiBHaXZlbiBhbnkgb2JqZWN0LCByZXR1cm4gdGhlIG5ldyBvYmplY3Qgd2l0aCByZW1vdmVkIGtleXMgdGhhdCB2YWx1ZSB3YXMgYHVuZGVmaW5lZGAuXG4gKiBXb3JrcyByZWN1cnNpdmVseSBvbiBvYmplY3RzIGFuZCBhcnJheXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcm9wVW5kZWZpbmVkS2V5czxUPih2YWw6IFQpOiBUIHtcbiAgaWYgKGlzUGxhaW5PYmplY3QodmFsKSkge1xuICAgIGNvbnN0IG9iaiA9IHZhbCBhcyB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuICAgIGNvbnN0IHJ2OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcnZba2V5XSA9IGRyb3BVbmRlZmluZWRLZXlzKG9ialtrZXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJ2IGFzIFQ7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgcmV0dXJuICh2YWwgYXMgYW55W10pLm1hcChkcm9wVW5kZWZpbmVkS2V5cykgYXMgYW55O1xuICB9XG5cbiAgcmV0dXJuIHZhbDtcbn1cblxuLyoqXG4gKiBFbnN1cmUgdGhhdCBzb21ldGhpbmcgaXMgYW4gb2JqZWN0LlxuICpcbiAqIFR1cm5zIGB1bmRlZmluZWRgIGFuZCBgbnVsbGAgaW50byBgU3RyaW5nYHMgYW5kIGFsbCBvdGhlciBwcmltaXRpdmVzIGludG8gaW5zdGFuY2VzIG9mIHRoZWlyIHJlc3BlY3RpdmUgd3JhcHBlclxuICogY2xhc3NlcyAoU3RyaW5nLCBCb29sZWFuLCBOdW1iZXIsIGV0Yy4pLiBBY3RzIGFzIHRoZSBpZGVudGl0eSBmdW5jdGlvbiBvbiBub24tcHJpbWl0aXZlcy5cbiAqXG4gKiBAcGFyYW0gd2F0IFRoZSBzdWJqZWN0IG9mIHRoZSBvYmplY3RpZmljYXRpb25cbiAqIEByZXR1cm5zIEEgdmVyc2lvbiBvZiBgd2F0YCB3aGljaCBjYW4gc2FmZWx5IGJlIHVzZWQgd2l0aCBgT2JqZWN0YCBjbGFzcyBtZXRob2RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RpZnkod2F0OiB1bmtub3duKTogdHlwZW9mIE9iamVjdCB7XG4gIGxldCBvYmplY3RpZmllZDtcbiAgc3dpdGNoICh0cnVlKSB7XG4gICAgY2FzZSB3YXQgPT09IHVuZGVmaW5lZCB8fCB3YXQgPT09IG51bGw6XG4gICAgICBvYmplY3RpZmllZCA9IG5ldyBTdHJpbmcod2F0KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgLy8gVGhvdWdoIHN5bWJvbHMgYW5kIGJpZ2ludHMgZG8gaGF2ZSB3cmFwcGVyIGNsYXNzZXMgKGBTeW1ib2xgIGFuZCBgQmlnSW50YCwgcmVzcGVjdGl2ZWx5KSwgZm9yIHdoYXRldmVyIHJlYXNvblxuICAgIC8vIHRob3NlIGNsYXNzZXMgZG9uJ3QgaGF2ZSBjb25zdHJ1Y3RvcnMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCB0aGUgYG5ld2Aga2V5d29yZC4gV2UgdGhlcmVmb3JlIG5lZWQgdG8gY2FzdCBlYWNoIGFzXG4gICAgLy8gYW4gb2JqZWN0IGluIG9yZGVyIHRvIHdyYXAgaXQuXG4gICAgY2FzZSB0eXBlb2Ygd2F0ID09PSAnc3ltYm9sJyB8fCB0eXBlb2Ygd2F0ID09PSAnYmlnaW50JzpcbiAgICAgIG9iamVjdGlmaWVkID0gT2JqZWN0KHdhdCk7XG4gICAgICBicmVhaztcblxuICAgIC8vIHRoaXMgd2lsbCBjYXRjaCB0aGUgcmVtYWluaW5nIHByaW1pdGl2ZXM6IGBTdHJpbmdgLCBgTnVtYmVyYCwgYW5kIGBCb29sZWFuYFxuICAgIGNhc2UgaXNQcmltaXRpdmUod2F0KTpcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgIG9iamVjdGlmaWVkID0gbmV3ICh3YXQgYXMgYW55KS5jb25zdHJ1Y3Rvcih3YXQpO1xuICAgICAgYnJlYWs7XG5cbiAgICAvLyBieSBwcm9jZXNzIG9mIGVsaW1pbmF0aW9uLCBhdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCBgd2F0YCBtdXN0IGFscmVhZHkgYmUgYW4gb2JqZWN0XG4gICAgZGVmYXVsdDpcbiAgICAgIG9iamVjdGlmaWVkID0gd2F0O1xuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIG9iamVjdGlmaWVkO1xufVxuIiwgImltcG9ydCB7IGdldEdsb2JhbE9iamVjdCB9IGZyb20gJy4vZ2xvYmFsJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJztcblxuLyoqXG4gKiBUZWxscyB3aGV0aGVyIGN1cnJlbnQgZW52aXJvbm1lbnQgc3VwcG9ydHMgRXJyb3JFdmVudCBvYmplY3RzXG4gKiB7QGxpbmsgc3VwcG9ydHNFcnJvckV2ZW50fS5cbiAqXG4gKiBAcmV0dXJucyBBbnN3ZXIgdG8gdGhlIGdpdmVuIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNFcnJvckV2ZW50KCk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIG5ldyBFcnJvckV2ZW50KCcnKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgY3VycmVudCBlbnZpcm9ubWVudCBzdXBwb3J0cyBET01FcnJvciBvYmplY3RzXG4gKiB7QGxpbmsgc3VwcG9ydHNET01FcnJvcn0uXG4gKlxuICogQHJldHVybnMgQW5zd2VyIHRvIHRoZSBnaXZlbiBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzRE9NRXJyb3IoKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgLy8gQ2hyb21lOiBWTTg5OjEgVW5jYXVnaHQgVHlwZUVycm9yOiBGYWlsZWQgdG8gY29uc3RydWN0ICdET01FcnJvcic6XG4gICAgLy8gMSBhcmd1bWVudCByZXF1aXJlZCwgYnV0IG9ubHkgMCBwcmVzZW50LlxuICAgIC8vIEB0cy1pZ25vcmUgSXQgcmVhbGx5IG5lZWRzIDEgYXJndW1lbnQsIG5vdCAwLlxuICAgIG5ldyBET01FcnJvcignJyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBUZWxscyB3aGV0aGVyIGN1cnJlbnQgZW52aXJvbm1lbnQgc3VwcG9ydHMgRE9NRXhjZXB0aW9uIG9iamVjdHNcbiAqIHtAbGluayBzdXBwb3J0c0RPTUV4Y2VwdGlvbn0uXG4gKlxuICogQHJldHVybnMgQW5zd2VyIHRvIHRoZSBnaXZlbiBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzRE9NRXhjZXB0aW9uKCk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIG5ldyBET01FeGNlcHRpb24oJycpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciBjdXJyZW50IGVudmlyb25tZW50IHN1cHBvcnRzIEZldGNoIEFQSVxuICoge0BsaW5rIHN1cHBvcnRzRmV0Y2h9LlxuICpcbiAqIEByZXR1cm5zIEFuc3dlciB0byB0aGUgZ2l2ZW4gcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c0ZldGNoKCk6IGJvb2xlYW4ge1xuICBpZiAoISgnZmV0Y2gnIGluIGdldEdsb2JhbE9iamVjdDxXaW5kb3c+KCkpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBuZXcgSGVhZGVycygpO1xuICAgIG5ldyBSZXF1ZXN0KCcnKTtcbiAgICBuZXcgUmVzcG9uc2UoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuLyoqXG4gKiBpc05hdGl2ZUZldGNoIGNoZWNrcyBpZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gaXMgYSBuYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgZmV0Y2goKVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuZXhwb3J0IGZ1bmN0aW9uIGlzTmF0aXZlRmV0Y2goZnVuYzogRnVuY3Rpb24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGZ1bmMgJiYgL15mdW5jdGlvbiBmZXRjaFxcKFxcKVxccytcXHtcXHMrXFxbbmF0aXZlIGNvZGVcXF1cXHMrXFx9JC8udGVzdChmdW5jLnRvU3RyaW5nKCkpO1xufVxuXG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgY3VycmVudCBlbnZpcm9ubWVudCBzdXBwb3J0cyBGZXRjaCBBUEkgbmF0aXZlbHlcbiAqIHtAbGluayBzdXBwb3J0c05hdGl2ZUZldGNofS5cbiAqXG4gKiBAcmV0dXJucyB0cnVlIGlmIGB3aW5kb3cuZmV0Y2hgIGlzIG5hdGl2ZWx5IGltcGxlbWVudGVkLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzTmF0aXZlRmV0Y2goKTogYm9vbGVhbiB7XG4gIGlmICghc3VwcG9ydHNGZXRjaCgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0PFdpbmRvdz4oKTtcblxuICAvLyBGYXN0IHBhdGggdG8gYXZvaWQgRE9NIEkvT1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXG4gIGlmIChpc05hdGl2ZUZldGNoKGdsb2JhbC5mZXRjaCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIHdpbmRvdy5mZXRjaCBpcyBpbXBsZW1lbnRlZCwgYnV0IGlzIHBvbHlmaWxsZWQgb3IgYWxyZWFkeSB3cmFwcGVkIChlLmc6IGJ5IGEgY2hyb21lIGV4dGVuc2lvbilcbiAgLy8gc28gY3JlYXRlIGEgXCJwdXJlXCIgaWZyYW1lIHRvIHNlZSBpZiB0aGF0IGhhcyBuYXRpdmUgZmV0Y2hcbiAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICBjb25zdCBkb2MgPSBnbG9iYWwuZG9jdW1lbnQ7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuICBpZiAoZG9jICYmIHR5cGVvZiAoZG9jLmNyZWF0ZUVsZW1lbnQgYXMgdW5rbm93bikgPT09IGBmdW5jdGlvbmApIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuZGJveCA9IGRvYy5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICAgIHNhbmRib3guaGlkZGVuID0gdHJ1ZTtcbiAgICAgIGRvYy5oZWFkLmFwcGVuZENoaWxkKHNhbmRib3gpO1xuICAgICAgaWYgKHNhbmRib3guY29udGVudFdpbmRvdyAmJiBzYW5kYm94LmNvbnRlbnRXaW5kb3cuZmV0Y2gpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuICAgICAgICByZXN1bHQgPSBpc05hdGl2ZUZldGNoKHNhbmRib3guY29udGVudFdpbmRvdy5mZXRjaCk7XG4gICAgICB9XG4gICAgICBkb2MuaGVhZC5yZW1vdmVDaGlsZChzYW5kYm94KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdDb3VsZCBub3QgY3JlYXRlIHNhbmRib3ggaWZyYW1lIGZvciBwdXJlIGZldGNoIGNoZWNrLCBiYWlsaW5nIHRvIHdpbmRvdy5mZXRjaDogJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgY3VycmVudCBlbnZpcm9ubWVudCBzdXBwb3J0cyBSZXBvcnRpbmdPYnNlcnZlciBBUElcbiAqIHtAbGluayBzdXBwb3J0c1JlcG9ydGluZ09ic2VydmVyfS5cbiAqXG4gKiBAcmV0dXJucyBBbnN3ZXIgdG8gdGhlIGdpdmVuIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNSZXBvcnRpbmdPYnNlcnZlcigpOiBib29sZWFuIHtcbiAgcmV0dXJuICdSZXBvcnRpbmdPYnNlcnZlcicgaW4gZ2V0R2xvYmFsT2JqZWN0KCk7XG59XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciBjdXJyZW50IGVudmlyb25tZW50IHN1cHBvcnRzIFJlZmVycmVyIFBvbGljeSBBUElcbiAqIHtAbGluayBzdXBwb3J0c1JlZmVycmVyUG9saWN5fS5cbiAqXG4gKiBAcmV0dXJucyBBbnN3ZXIgdG8gdGhlIGdpdmVuIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNSZWZlcnJlclBvbGljeSgpOiBib29sZWFuIHtcbiAgLy8gRGVzcGl0ZSBhbGwgc3RhcnMgaW4gdGhlIHNreSBzYXlpbmcgdGhhdCBFZGdlIHN1cHBvcnRzIG9sZCBkcmFmdCBzeW50YXgsIGFrYSAnbmV2ZXInLCAnYWx3YXlzJywgJ29yaWdpbicgYW5kICdkZWZhdWx0XG4gIC8vIGh0dHBzOi8vY2FuaXVzZS5jb20vI2ZlYXQ9cmVmZXJyZXItcG9saWN5XG4gIC8vIEl0IGRvZXNuJ3QuIEFuZCBpdCB0aHJvdyBleGNlcHRpb24gaW5zdGVhZCBvZiBpZ25vcmluZyB0aGlzIHBhcmFtZXRlci4uLlxuICAvLyBSRUY6IGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvcmF2ZW4tanMvaXNzdWVzLzEyMzNcblxuICBpZiAoIXN1cHBvcnRzRmV0Y2goKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgbmV3IFJlcXVlc3QoJ18nLCB7XG4gICAgICByZWZlcnJlclBvbGljeTogJ29yaWdpbicgYXMgUmVmZXJyZXJQb2xpY3ksXG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBUZWxscyB3aGV0aGVyIGN1cnJlbnQgZW52aXJvbm1lbnQgc3VwcG9ydHMgSGlzdG9yeSBBUElcbiAqIHtAbGluayBzdXBwb3J0c0hpc3Rvcnl9LlxuICpcbiAqIEByZXR1cm5zIEFuc3dlciB0byB0aGUgZ2l2ZW4gcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c0hpc3RvcnkoKTogYm9vbGVhbiB7XG4gIC8vIE5PVEU6IGluIENocm9tZSBBcHAgZW52aXJvbm1lbnQsIHRvdWNoaW5nIGhpc3RvcnkucHVzaFN0YXRlLCAqZXZlbiBpbnNpZGVcbiAgLy8gICAgICAgYSB0cnkvY2F0Y2ggYmxvY2sqLCB3aWxsIGNhdXNlIENocm9tZSB0byBvdXRwdXQgYW4gZXJyb3IgdG8gY29uc29sZS5lcnJvclxuICAvLyBib3Jyb3dlZCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL3B1bGwvMTM5NDUvZmlsZXNcbiAgY29uc3QgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0PFdpbmRvdz4oKTtcbiAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGNvbnN0IGNocm9tZSA9IChnbG9iYWwgYXMgYW55KS5jaHJvbWU7XG4gIGNvbnN0IGlzQ2hyb21lUGFja2FnZWRBcHAgPSBjaHJvbWUgJiYgY2hyb21lLmFwcCAmJiBjaHJvbWUuYXBwLnJ1bnRpbWU7XG4gIC8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzICovXG4gIGNvbnN0IGhhc0hpc3RvcnlBcGkgPSAnaGlzdG9yeScgaW4gZ2xvYmFsICYmICEhZ2xvYmFsLmhpc3RvcnkucHVzaFN0YXRlICYmICEhZ2xvYmFsLmhpc3RvcnkucmVwbGFjZVN0YXRlO1xuXG4gIHJldHVybiAhaXNDaHJvbWVQYWNrYWdlZEFwcCAmJiBoYXNIaXN0b3J5QXBpO1xufVxuIiwgIi8qIGVzbGludC1kaXNhYmxlIG1heC1saW5lcyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlcyAqL1xuaW1wb3J0IHsgV3JhcHBlZEZ1bmN0aW9uIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5cbmltcG9ydCB7IGdldEdsb2JhbE9iamVjdCB9IGZyb20gJy4vZ2xvYmFsJztcbmltcG9ydCB7IGlzSW5zdGFuY2VPZiwgaXNTdHJpbmcgfSBmcm9tICcuL2lzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IGZpbGwgfSBmcm9tICcuL29iamVjdCc7XG5pbXBvcnQgeyBnZXRGdW5jdGlvbk5hbWUgfSBmcm9tICcuL3N0YWNrdHJhY2UnO1xuaW1wb3J0IHsgc3VwcG9ydHNIaXN0b3J5LCBzdXBwb3J0c05hdGl2ZUZldGNoIH0gZnJvbSAnLi9zdXBwb3J0cyc7XG5cbmNvbnN0IGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdDxXaW5kb3c+KCk7XG5cbi8qKiBPYmplY3QgZGVzY3JpYmluZyBoYW5kbGVyIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgZm9yIGEgZ2l2ZW4gYHR5cGVgIG9mIGluc3RydW1lbnRhdGlvbiAqL1xuaW50ZXJmYWNlIEluc3RydW1lbnRIYW5kbGVyIHtcbiAgdHlwZTogSW5zdHJ1bWVudEhhbmRsZXJUeXBlO1xuICBjYWxsYmFjazogSW5zdHJ1bWVudEhhbmRsZXJDYWxsYmFjaztcbn1cbnR5cGUgSW5zdHJ1bWVudEhhbmRsZXJUeXBlID1cbiAgfCAnY29uc29sZSdcbiAgfCAnZG9tJ1xuICB8ICdmZXRjaCdcbiAgfCAnaGlzdG9yeSdcbiAgfCAnc2VudHJ5J1xuICB8ICd4aHInXG4gIHwgJ2Vycm9yJ1xuICB8ICd1bmhhbmRsZWRyZWplY3Rpb24nO1xudHlwZSBJbnN0cnVtZW50SGFuZGxlckNhbGxiYWNrID0gKGRhdGE6IGFueSkgPT4gdm9pZDtcblxuLyoqXG4gKiBJbnN0cnVtZW50IG5hdGl2ZSBBUElzIHRvIGNhbGwgaGFuZGxlcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYnJlYWRjcnVtYnMsIEFQTSBzcGFucyBldGMuXG4gKiAgLSBDb25zb2xlIEFQSVxuICogIC0gRmV0Y2ggQVBJXG4gKiAgLSBYSFIgQVBJXG4gKiAgLSBIaXN0b3J5IEFQSVxuICogIC0gRE9NIEFQSSAoY2xpY2svdHlwaW5nKVxuICogIC0gRXJyb3IgQVBJXG4gKiAgLSBVbmhhbmRsZWRSZWplY3Rpb24gQVBJXG4gKi9cblxuY29uc3QgaGFuZGxlcnM6IHsgW2tleSBpbiBJbnN0cnVtZW50SGFuZGxlclR5cGVdPzogSW5zdHJ1bWVudEhhbmRsZXJDYWxsYmFja1tdIH0gPSB7fTtcbmNvbnN0IGluc3RydW1lbnRlZDogeyBba2V5IGluIEluc3RydW1lbnRIYW5kbGVyVHlwZV0/OiBib29sZWFuIH0gPSB7fTtcblxuLyoqIEluc3RydW1lbnRzIGdpdmVuIEFQSSAqL1xuZnVuY3Rpb24gaW5zdHJ1bWVudCh0eXBlOiBJbnN0cnVtZW50SGFuZGxlclR5cGUpOiB2b2lkIHtcbiAgaWYgKGluc3RydW1lbnRlZFt0eXBlXSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGluc3RydW1lbnRlZFt0eXBlXSA9IHRydWU7XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnY29uc29sZSc6XG4gICAgICBpbnN0cnVtZW50Q29uc29sZSgpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZG9tJzpcbiAgICAgIGluc3RydW1lbnRET00oKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3hocic6XG4gICAgICBpbnN0cnVtZW50WEhSKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdmZXRjaCc6XG4gICAgICBpbnN0cnVtZW50RmV0Y2goKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2hpc3RvcnknOlxuICAgICAgaW5zdHJ1bWVudEhpc3RvcnkoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgIGluc3RydW1lbnRFcnJvcigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndW5oYW5kbGVkcmVqZWN0aW9uJzpcbiAgICAgIGluc3RydW1lbnRVbmhhbmRsZWRSZWplY3Rpb24oKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBsb2dnZXIud2FybigndW5rbm93biBpbnN0cnVtZW50YXRpb24gdHlwZTonLCB0eXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIEFkZCBoYW5kbGVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiBnaXZlbiB0eXBlIG9mIGluc3RydW1lbnRhdGlvbiB0cmlnZ2Vycy5cbiAqIFVzZSBhdCB5b3VyIG93biByaXNrLCB0aGlzIG1pZ2h0IGJyZWFrIHdpdGhvdXQgY2hhbmdlbG9nIG5vdGljZSwgb25seSB1c2VkIGludGVybmFsbHkuXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRJbnN0cnVtZW50YXRpb25IYW5kbGVyKGhhbmRsZXI6IEluc3RydW1lbnRIYW5kbGVyKTogdm9pZCB7XG4gIGlmICghaGFuZGxlciB8fCB0eXBlb2YgaGFuZGxlci50eXBlICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgaGFuZGxlci5jYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybjtcbiAgfVxuICBoYW5kbGVyc1toYW5kbGVyLnR5cGVdID0gaGFuZGxlcnNbaGFuZGxlci50eXBlXSB8fCBbXTtcbiAgKGhhbmRsZXJzW2hhbmRsZXIudHlwZV0gYXMgSW5zdHJ1bWVudEhhbmRsZXJDYWxsYmFja1tdKS5wdXNoKGhhbmRsZXIuY2FsbGJhY2spO1xuICBpbnN0cnVtZW50KGhhbmRsZXIudHlwZSk7XG59XG5cbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gdHJpZ2dlckhhbmRsZXJzKHR5cGU6IEluc3RydW1lbnRIYW5kbGVyVHlwZSwgZGF0YTogYW55KTogdm9pZCB7XG4gIGlmICghdHlwZSB8fCAhaGFuZGxlcnNbdHlwZV0pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnNbdHlwZV0gfHwgW10pIHtcbiAgICB0cnkge1xuICAgICAgaGFuZGxlcihkYXRhKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgIGBFcnJvciB3aGlsZSB0cmlnZ2VyaW5nIGluc3RydW1lbnRhdGlvbiBoYW5kbGVyLlxcblR5cGU6ICR7dHlwZX1cXG5OYW1lOiAke2dldEZ1bmN0aW9uTmFtZShcbiAgICAgICAgICBoYW5kbGVyLFxuICAgICAgICApfVxcbkVycm9yOiAke2V9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gaW5zdHJ1bWVudENvbnNvbGUoKTogdm9pZCB7XG4gIGlmICghKCdjb25zb2xlJyBpbiBnbG9iYWwpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InLCAnbG9nJywgJ2Fzc2VydCddLmZvckVhY2goZnVuY3Rpb24obGV2ZWw6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghKGxldmVsIGluIGdsb2JhbC5jb25zb2xlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZpbGwoZ2xvYmFsLmNvbnNvbGUsIGxldmVsLCBmdW5jdGlvbihvcmlnaW5hbENvbnNvbGVMZXZlbDogKCkgPT4gYW55KTogRnVuY3Rpb24ge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIHRyaWdnZXJIYW5kbGVycygnY29uc29sZScsIHsgYXJncywgbGV2ZWwgfSk7XG5cbiAgICAgICAgLy8gdGhpcyBmYWlscyBmb3Igc29tZSBicm93c2Vycy4gOihcbiAgICAgICAgaWYgKG9yaWdpbmFsQ29uc29sZUxldmVsKSB7XG4gICAgICAgICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwob3JpZ2luYWxDb25zb2xlTGV2ZWwsIGdsb2JhbC5jb25zb2xlLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gaW5zdHJ1bWVudEZldGNoKCk6IHZvaWQge1xuICBpZiAoIXN1cHBvcnRzTmF0aXZlRmV0Y2goKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZpbGwoZ2xvYmFsLCAnZmV0Y2gnLCBmdW5jdGlvbihvcmlnaW5hbEZldGNoOiAoKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgICBjb25zdCBoYW5kbGVyRGF0YSA9IHtcbiAgICAgICAgYXJncyxcbiAgICAgICAgZmV0Y2hEYXRhOiB7XG4gICAgICAgICAgbWV0aG9kOiBnZXRGZXRjaE1ldGhvZChhcmdzKSxcbiAgICAgICAgICB1cmw6IGdldEZldGNoVXJsKGFyZ3MpLFxuICAgICAgICB9LFxuICAgICAgICBzdGFydFRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIH07XG5cbiAgICAgIHRyaWdnZXJIYW5kbGVycygnZmV0Y2gnLCB7XG4gICAgICAgIC4uLmhhbmRsZXJEYXRhLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgIHJldHVybiBvcmlnaW5hbEZldGNoLmFwcGx5KGdsb2JhbCwgYXJncykudGhlbihcbiAgICAgICAgKHJlc3BvbnNlOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRyaWdnZXJIYW5kbGVycygnZmV0Y2gnLCB7XG4gICAgICAgICAgICAuLi5oYW5kbGVyRGF0YSxcbiAgICAgICAgICAgIGVuZFRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgfSxcbiAgICAgICAgKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgIHRyaWdnZXJIYW5kbGVycygnZmV0Y2gnLCB7XG4gICAgICAgICAgICAuLi5oYW5kbGVyRGF0YSxcbiAgICAgICAgICAgIGVuZFRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIE5PVEU6IElmIHlvdSBhcmUgYSBTZW50cnkgdXNlciwgYW5kIHlvdSBhcmUgc2VlaW5nIHRoaXMgc3RhY2sgZnJhbWUsXG4gICAgICAgICAgLy8gICAgICAgaXQgbWVhbnMgdGhlIHNlbnRyeS5qYXZhc2NyaXB0IFNESyBjYXVnaHQgYW4gZXJyb3IgaW52b2tpbmcgeW91ciBhcHBsaWNhdGlvbiBjb2RlLlxuICAgICAgICAgIC8vICAgICAgIFRoaXMgaXMgZXhwZWN0ZWQgYmVoYXZpb3IgYW5kIE5PVCBpbmRpY2F0aXZlIG9mIGEgYnVnIHdpdGggc2VudHJ5LmphdmFzY3JpcHQuXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH07XG4gIH0pO1xufVxuXG50eXBlIFhIUlNlbmRJbnB1dCA9IG51bGwgfCBCbG9iIHwgQnVmZmVyU291cmNlIHwgRm9ybURhdGEgfCBVUkxTZWFyY2hQYXJhbXMgfCBzdHJpbmc7XG5cbi8qKiBKU0RvYyAqL1xuaW50ZXJmYWNlIFNlbnRyeVdyYXBwZWRYTUxIdHRwUmVxdWVzdCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0IHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBfX3NlbnRyeV94aHJfXz86IHtcbiAgICBtZXRob2Q/OiBzdHJpbmc7XG4gICAgdXJsPzogc3RyaW5nO1xuICAgIHN0YXR1c19jb2RlPzogbnVtYmVyO1xuICAgIGJvZHk/OiBYSFJTZW5kSW5wdXQ7XG4gIH07XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xuLyoqIEV4dHJhY3QgYG1ldGhvZGAgZnJvbSBmZXRjaCBjYWxsIGFyZ3VtZW50cyAqL1xuZnVuY3Rpb24gZ2V0RmV0Y2hNZXRob2QoZmV0Y2hBcmdzOiBhbnlbXSA9IFtdKTogc3RyaW5nIHtcbiAgaWYgKCdSZXF1ZXN0JyBpbiBnbG9iYWwgJiYgaXNJbnN0YW5jZU9mKGZldGNoQXJnc1swXSwgUmVxdWVzdCkgJiYgZmV0Y2hBcmdzWzBdLm1ldGhvZCkge1xuICAgIHJldHVybiBTdHJpbmcoZmV0Y2hBcmdzWzBdLm1ldGhvZCkudG9VcHBlckNhc2UoKTtcbiAgfVxuICBpZiAoZmV0Y2hBcmdzWzFdICYmIGZldGNoQXJnc1sxXS5tZXRob2QpIHtcbiAgICByZXR1cm4gU3RyaW5nKGZldGNoQXJnc1sxXS5tZXRob2QpLnRvVXBwZXJDYXNlKCk7XG4gIH1cbiAgcmV0dXJuICdHRVQnO1xufVxuXG4vKiogRXh0cmFjdCBgdXJsYCBmcm9tIGZldGNoIGNhbGwgYXJndW1lbnRzICovXG5mdW5jdGlvbiBnZXRGZXRjaFVybChmZXRjaEFyZ3M6IGFueVtdID0gW10pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGZldGNoQXJnc1swXSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmV0Y2hBcmdzWzBdO1xuICB9XG4gIGlmICgnUmVxdWVzdCcgaW4gZ2xvYmFsICYmIGlzSW5zdGFuY2VPZihmZXRjaEFyZ3NbMF0sIFJlcXVlc3QpKSB7XG4gICAgcmV0dXJuIGZldGNoQXJnc1swXS51cmw7XG4gIH1cbiAgcmV0dXJuIFN0cmluZyhmZXRjaEFyZ3NbMF0pO1xufVxuLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgKi9cblxuLyoqIEpTRG9jICovXG5mdW5jdGlvbiBpbnN0cnVtZW50WEhSKCk6IHZvaWQge1xuICBpZiAoISgnWE1MSHR0cFJlcXVlc3QnIGluIGdsb2JhbCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBQb29yIG1hbidzIGltcGxlbWVudGF0aW9uIG9mIEVTNiBgTWFwYCwgdHJhY2tpbmcgYW5kIGtlZXBpbmcgaW4gc3luYyBrZXkgYW5kIHZhbHVlIHNlcGFyYXRlbHkuXG4gIGNvbnN0IHJlcXVlc3RLZXlzOiBYTUxIdHRwUmVxdWVzdFtdID0gW107XG4gIGNvbnN0IHJlcXVlc3RWYWx1ZXM6IEFycmF5PGFueT5bXSA9IFtdO1xuICBjb25zdCB4aHJwcm90byA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZTtcblxuICBmaWxsKHhocnByb3RvLCAnb3BlbicsIGZ1bmN0aW9uKG9yaWdpbmFsT3BlbjogKCkgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiBmdW5jdGlvbih0aGlzOiBTZW50cnlXcmFwcGVkWE1MSHR0cFJlcXVlc3QsIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgIGNvbnN0IHhociA9IHRoaXM7XG4gICAgICBjb25zdCB1cmwgPSBhcmdzWzFdO1xuICAgICAgeGhyLl9fc2VudHJ5X3hocl9fID0ge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgIG1ldGhvZDogaXNTdHJpbmcoYXJnc1swXSkgPyBhcmdzWzBdLnRvVXBwZXJDYXNlKCkgOiBhcmdzWzBdLFxuICAgICAgICB1cmw6IGFyZ3NbMV0sXG4gICAgICB9O1xuXG4gICAgICAvLyBpZiBTZW50cnkga2V5IGFwcGVhcnMgaW4gVVJMLCBkb24ndCBjYXB0dXJlIGl0IGFzIGEgcmVxdWVzdFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgaWYgKGlzU3RyaW5nKHVybCkgJiYgeGhyLl9fc2VudHJ5X3hocl9fLm1ldGhvZCA9PT0gJ1BPU1QnICYmIHVybC5tYXRjaCgvc2VudHJ5X2tleS8pKSB7XG4gICAgICAgIHhoci5fX3NlbnRyeV9vd25fcmVxdWVzdF9fID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb25yZWFkeXN0YXRlY2hhbmdlSGFuZGxlciA9IGZ1bmN0aW9uKCk6IHZvaWQge1xuICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gdG91Y2hpbmcgc3RhdHVzQ29kZSBpbiBzb21lIHBsYXRmb3JtcyB0aHJvd3NcbiAgICAgICAgICAgIC8vIGFuIGV4Y2VwdGlvblxuICAgICAgICAgICAgaWYgKHhoci5fX3NlbnRyeV94aHJfXykge1xuICAgICAgICAgICAgICB4aHIuX19zZW50cnlfeGhyX18uc3RhdHVzX2NvZGUgPSB4aHIuc3RhdHVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi9cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdFBvcyA9IHJlcXVlc3RLZXlzLmluZGV4T2YoeGhyKTtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0UG9zICE9PSAtMSkge1xuICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdG8gcG9wIGJvdGgga2V5IGFuZCB2YWx1ZSB0byBrZWVwIGl0IGluIHN5bmMuXG4gICAgICAgICAgICAgIHJlcXVlc3RLZXlzLnNwbGljZShyZXF1ZXN0UG9zKTtcbiAgICAgICAgICAgICAgY29uc3QgYXJncyA9IHJlcXVlc3RWYWx1ZXMuc3BsaWNlKHJlcXVlc3RQb3MpWzBdO1xuICAgICAgICAgICAgICBpZiAoeGhyLl9fc2VudHJ5X3hocl9fICYmIGFyZ3NbMF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHhoci5fX3NlbnRyeV94aHJfXy5ib2R5ID0gYXJnc1swXSBhcyBYSFJTZW5kSW5wdXQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvKiBkbyBub3RoaW5nICovXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdHJpZ2dlckhhbmRsZXJzKCd4aHInLCB7XG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgZW5kVGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgc3RhcnRUaW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICB4aHIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmICgnb25yZWFkeXN0YXRlY2hhbmdlJyBpbiB4aHIgJiYgdHlwZW9mIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZmlsbCh4aHIsICdvbnJlYWR5c3RhdGVjaGFuZ2UnLCBmdW5jdGlvbihvcmlnaW5hbDogV3JhcHBlZEZ1bmN0aW9uKTogRnVuY3Rpb24ge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiguLi5yZWFkeVN0YXRlQXJnczogYW55W10pOiB2b2lkIHtcbiAgICAgICAgICAgIG9ucmVhZHlzdGF0ZWNoYW5nZUhhbmRsZXIoKTtcbiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbC5hcHBseSh4aHIsIHJlYWR5U3RhdGVBcmdzKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHhoci5hZGRFdmVudExpc3RlbmVyKCdyZWFkeXN0YXRlY2hhbmdlJywgb25yZWFkeXN0YXRlY2hhbmdlSGFuZGxlcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvcmlnaW5hbE9wZW4uYXBwbHkoeGhyLCBhcmdzKTtcbiAgICB9O1xuICB9KTtcblxuICBmaWxsKHhocnByb3RvLCAnc2VuZCcsIGZ1bmN0aW9uKG9yaWdpbmFsU2VuZDogKCkgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiBmdW5jdGlvbih0aGlzOiBTZW50cnlXcmFwcGVkWE1MSHR0cFJlcXVlc3QsIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgICByZXF1ZXN0S2V5cy5wdXNoKHRoaXMpO1xuICAgICAgcmVxdWVzdFZhbHVlcy5wdXNoKGFyZ3MpO1xuXG4gICAgICB0cmlnZ2VySGFuZGxlcnMoJ3hocicsIHtcbiAgICAgICAgYXJncyxcbiAgICAgICAgc3RhcnRUaW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgIHhocjogdGhpcyxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gb3JpZ2luYWxTZW5kLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG4gIH0pO1xufVxuXG5sZXQgbGFzdEhyZWY6IHN0cmluZztcblxuLyoqIEpTRG9jICovXG5mdW5jdGlvbiBpbnN0cnVtZW50SGlzdG9yeSgpOiB2b2lkIHtcbiAgaWYgKCFzdXBwb3J0c0hpc3RvcnkoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG9sZE9uUG9wU3RhdGUgPSBnbG9iYWwub25wb3BzdGF0ZTtcbiAgZ2xvYmFsLm9ucG9wc3RhdGUgPSBmdW5jdGlvbih0aGlzOiBXaW5kb3dFdmVudEhhbmRsZXJzLCAuLi5hcmdzOiBhbnlbXSk6IGFueSB7XG4gICAgY29uc3QgdG8gPSBnbG9iYWwubG9jYXRpb24uaHJlZjtcbiAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IFVSTCBzdGF0ZSwgYXMgd2UgYWx3YXlzIHJlY2VpdmUgb25seSB0aGUgdXBkYXRlZCBzdGF0ZVxuICAgIGNvbnN0IGZyb20gPSBsYXN0SHJlZjtcbiAgICBsYXN0SHJlZiA9IHRvO1xuICAgIHRyaWdnZXJIYW5kbGVycygnaGlzdG9yeScsIHtcbiAgICAgIGZyb20sXG4gICAgICB0byxcbiAgICB9KTtcbiAgICBpZiAob2xkT25Qb3BTdGF0ZSkge1xuICAgICAgLy8gQXBwYXJlbnRseSB0aGlzIGNhbiB0aHJvdyBpbiBGaXJlZm94IHdoZW4gaW5jb3JyZWN0bHkgaW1wbGVtZW50ZWQgcGx1Z2luIGlzIGluc3RhbGxlZC5cbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzMzNDRcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9idWdzbmFnL2J1Z3NuYWctanMvaXNzdWVzLzQ2OVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG9sZE9uUG9wU3RhdGUuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICB9IGNhdGNoIChfb08pIHtcbiAgICAgICAgLy8gbm8tZW1wdHlcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqIEBoaWRkZW4gKi9cbiAgZnVuY3Rpb24gaGlzdG9yeVJlcGxhY2VtZW50RnVuY3Rpb24ob3JpZ2luYWxIaXN0b3J5RnVuY3Rpb246ICgpID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gZnVuY3Rpb24odGhpczogSGlzdG9yeSwgLi4uYXJnczogYW55W10pOiB2b2lkIHtcbiAgICAgIGNvbnN0IHVybCA9IGFyZ3MubGVuZ3RoID4gMiA/IGFyZ3NbMl0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIC8vIGNvZXJjZSB0byBzdHJpbmcgKHRoaXMgaXMgd2hhdCBwdXNoU3RhdGUgZG9lcylcbiAgICAgICAgY29uc3QgZnJvbSA9IGxhc3RIcmVmO1xuICAgICAgICBjb25zdCB0byA9IFN0cmluZyh1cmwpO1xuICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IFVSTCBzdGF0ZSwgYXMgd2UgYWx3YXlzIHJlY2VpdmUgb25seSB0aGUgdXBkYXRlZCBzdGF0ZVxuICAgICAgICBsYXN0SHJlZiA9IHRvO1xuICAgICAgICB0cmlnZ2VySGFuZGxlcnMoJ2hpc3RvcnknLCB7XG4gICAgICAgICAgZnJvbSxcbiAgICAgICAgICB0byxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3JpZ2luYWxIaXN0b3J5RnVuY3Rpb24uYXBwbHkodGhpcywgYXJncyk7XG4gICAgfTtcbiAgfVxuXG4gIGZpbGwoZ2xvYmFsLmhpc3RvcnksICdwdXNoU3RhdGUnLCBoaXN0b3J5UmVwbGFjZW1lbnRGdW5jdGlvbik7XG4gIGZpbGwoZ2xvYmFsLmhpc3RvcnksICdyZXBsYWNlU3RhdGUnLCBoaXN0b3J5UmVwbGFjZW1lbnRGdW5jdGlvbik7XG59XG5cbmNvbnN0IGRlYm91bmNlRHVyYXRpb24gPSAxMDAwO1xubGV0IGRlYm91bmNlVGltZXJJRDogbnVtYmVyIHwgdW5kZWZpbmVkO1xubGV0IGxhc3RDYXB0dXJlZEV2ZW50OiBFdmVudCB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBEZWNpZGUgd2hldGhlciB0aGUgY3VycmVudCBldmVudCBzaG91bGQgZmluaXNoIHRoZSBkZWJvdW5jZSBvZiBwcmV2aW91c2x5IGNhcHR1cmVkIG9uZS5cbiAqIEBwYXJhbSBwcmV2aW91cyBwcmV2aW91c2x5IGNhcHR1cmVkIGV2ZW50XG4gKiBAcGFyYW0gY3VycmVudCBldmVudCB0byBiZSBjYXB0dXJlZFxuICovXG5mdW5jdGlvbiBzaG91bGRTaG9ydGNpcmN1aXRQcmV2aW91c0RlYm91bmNlKHByZXZpb3VzOiBFdmVudCB8IHVuZGVmaW5lZCwgY3VycmVudDogRXZlbnQpOiBib29sZWFuIHtcbiAgLy8gSWYgdGhlcmUgd2FzIG5vIHByZXZpb3VzIGV2ZW50LCBpdCBzaG91bGQgYWx3YXlzIGJlIHN3YXBwZWQgZm9yIHRoZSBuZXcgb25lLlxuICBpZiAoIXByZXZpb3VzKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBJZiBib3RoIGV2ZW50cyBoYXZlIGRpZmZlcmVudCB0eXBlLCB0aGVuIHVzZXIgZGVmaW5pdGVseSBwZXJmb3JtZWQgdHdvIHNlcGFyYXRlIGFjdGlvbnMuIGUuZy4gY2xpY2sgKyBrZXlwcmVzcy5cbiAgaWYgKHByZXZpb3VzLnR5cGUgIT09IGN1cnJlbnQudHlwZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBJZiBib3RoIGV2ZW50cyBoYXZlIHRoZSBzYW1lIHR5cGUsIGl0J3Mgc3RpbGwgcG9zc2libGUgdGhhdCBhY3Rpb25zIHdlcmUgcGVyZm9ybWVkIG9uIGRpZmZlcmVudCB0YXJnZXRzLlxuICAgIC8vIGUuZy4gMiBjbGlja3Mgb24gZGlmZmVyZW50IGJ1dHRvbnMuXG4gICAgaWYgKHByZXZpb3VzLnRhcmdldCAhPT0gY3VycmVudC50YXJnZXQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGp1c3QgYWNjZXNzaW5nIGB0YXJnZXRgIHByb3BlcnR5IGNhbiB0aHJvdyBhbiBleGNlcHRpb24gaW4gc29tZSByYXJlIGNpcmN1bXN0YW5jZXNcbiAgICAvLyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzgzOFxuICB9XG5cbiAgLy8gSWYgYm90aCBldmVudHMgaGF2ZSB0aGUgc2FtZSB0eXBlIF9hbmRfIHNhbWUgYHRhcmdldGAgKGFuIGVsZW1lbnQgd2hpY2ggdHJpZ2dlcmVkIGFuIGV2ZW50LCBfbm90IG5lY2Vzc2FyaWx5X1xuICAvLyB0byB3aGljaCBhbiBldmVudCBsaXN0ZW5lciB3YXMgYXR0YWNoZWQpLCB3ZSB0cmVhdCB0aGVtIGFzIHRoZSBzYW1lIGFjdGlvbiwgYXMgd2Ugd2FudCB0byBjYXB0dXJlXG4gIC8vIG9ubHkgb25lIGJyZWFkY3J1bWIuIGUuZy4gbXVsdGlwbGUgY2xpY2tzIG9uIHRoZSBzYW1lIGJ1dHRvbiwgb3IgdHlwaW5nIGluc2lkZSBhIHVzZXIgaW5wdXQgYm94LlxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogRGVjaWRlIHdoZXRoZXIgYW4gZXZlbnQgc2hvdWxkIGJlIGNhcHR1cmVkLlxuICogQHBhcmFtIGV2ZW50IGV2ZW50IHRvIGJlIGNhcHR1cmVkXG4gKi9cbmZ1bmN0aW9uIHNob3VsZFNraXBET01FdmVudChldmVudDogRXZlbnQpOiBib29sZWFuIHtcbiAgLy8gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBmaWx0ZXJpbmcgYGtleXByZXNzYCBldmVudHMgZm9yIG5vdy5cbiAgaWYgKGV2ZW50LnR5cGUgIT09ICdrZXlwcmVzcycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcblxuICAgIGlmICghdGFyZ2V0IHx8ICF0YXJnZXQudGFnTmFtZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gT25seSBjb25zaWRlciBrZXlwcmVzcyBldmVudHMgb24gYWN0dWFsIGlucHV0IGVsZW1lbnRzLiBUaGlzIHdpbGwgZGlzcmVnYXJkIGtleXByZXNzZXMgdGFyZ2V0aW5nIGJvZHlcbiAgICAvLyBlLmcudGFiYmluZyB0aHJvdWdoIGVsZW1lbnRzLCBob3RrZXlzLCBldGMuXG4gICAgaWYgKHRhcmdldC50YWdOYW1lID09PSAnSU5QVVQnIHx8IHRhcmdldC50YWdOYW1lID09PSAnVEVYVEFSRUEnIHx8IHRhcmdldC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGp1c3QgYWNjZXNzaW5nIGB0YXJnZXRgIHByb3BlcnR5IGNhbiB0aHJvdyBhbiBleGNlcHRpb24gaW4gc29tZSByYXJlIGNpcmN1bXN0YW5jZXNcbiAgICAvLyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzgzOFxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogV3JhcHMgYWRkRXZlbnRMaXN0ZW5lciB0byBjYXB0dXJlIFVJIGJyZWFkY3J1bWJzXG4gKiBAcGFyYW0gaGFuZGxlciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkXG4gKiBAcGFyYW0gZ2xvYmFsTGlzdGVuZXIgaW5kaWNhdGVzIHdoZXRoZXIgZXZlbnQgd2FzIGNhcHR1cmVkIGJ5IHRoZSBnbG9iYWwgZXZlbnQgbGlzdGVuZXJcbiAqIEByZXR1cm5zIHdyYXBwZWQgYnJlYWRjcnVtYiBldmVudHMgaGFuZGxlclxuICogQGhpZGRlblxuICovXG5mdW5jdGlvbiBtYWtlRE9NRXZlbnRIYW5kbGVyKGhhbmRsZXI6IEZ1bmN0aW9uLCBnbG9iYWxMaXN0ZW5lcjogYm9vbGVhbiA9IGZhbHNlKTogKGV2ZW50OiBFdmVudCkgPT4gdm9pZCB7XG4gIHJldHVybiAoZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XG4gICAgLy8gSXQncyBwb3NzaWJsZSB0aGlzIGhhbmRsZXIgbWlnaHQgdHJpZ2dlciBtdWx0aXBsZSB0aW1lcyBmb3IgdGhlIHNhbWVcbiAgICAvLyBldmVudCAoZS5nLiBldmVudCBwcm9wYWdhdGlvbiB0aHJvdWdoIG5vZGUgYW5jZXN0b3JzKS5cbiAgICAvLyBJZ25vcmUgaWYgd2UndmUgYWxyZWFkeSBjYXB0dXJlZCB0aGF0IGV2ZW50LlxuICAgIGlmICghZXZlbnQgfHwgbGFzdENhcHR1cmVkRXZlbnQgPT09IGV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gV2UgYWx3YXlzIHdhbnQgdG8gc2tpcCBfc29tZV8gZXZlbnRzLlxuICAgIGlmIChzaG91bGRTa2lwRE9NRXZlbnQoZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmFtZSA9IGV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycgPyAnaW5wdXQnIDogZXZlbnQudHlwZTtcblxuICAgIC8vIElmIHRoZXJlIGlzIG5vIGRlYm91bmNlIHRpbWVyLCBpdCBtZWFucyB0aGF0IHdlIGNhbiBzYWZlbHkgY2FwdHVyZSB0aGUgbmV3IGV2ZW50IGFuZCBzdG9yZSBpdCBmb3IgZnV0dXJlIGNvbXBhcmlzb25zLlxuICAgIGlmIChkZWJvdW5jZVRpbWVySUQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFuZGxlcih7XG4gICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZ2xvYmFsOiBnbG9iYWxMaXN0ZW5lcixcbiAgICAgIH0pO1xuICAgICAgbGFzdENhcHR1cmVkRXZlbnQgPSBldmVudDtcbiAgICB9XG4gICAgLy8gSWYgdGhlcmUgaXMgYSBkZWJvdW5jZSBhd2FpdGluZywgc2VlIGlmIHRoZSBuZXcgZXZlbnQgaXMgZGlmZmVyZW50IGVub3VnaCB0byB0cmVhdCBpdCBhcyBhIHVuaXF1ZSBvbmUuXG4gICAgLy8gSWYgdGhhdCdzIHRoZSBjYXNlLCBlbWl0IHRoZSBwcmV2aW91cyBldmVudCBhbmQgc3RvcmUgbG9jYWxseSB0aGUgbmV3bHktY2FwdHVyZWQgRE9NIGV2ZW50LlxuICAgIGVsc2UgaWYgKHNob3VsZFNob3J0Y2lyY3VpdFByZXZpb3VzRGVib3VuY2UobGFzdENhcHR1cmVkRXZlbnQsIGV2ZW50KSkge1xuICAgICAgaGFuZGxlcih7XG4gICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZ2xvYmFsOiBnbG9iYWxMaXN0ZW5lcixcbiAgICAgIH0pO1xuICAgICAgbGFzdENhcHR1cmVkRXZlbnQgPSBldmVudDtcbiAgICB9XG5cbiAgICAvLyBTdGFydCBhIG5ldyBkZWJvdW5jZSB0aW1lciB0aGF0IHdpbGwgcHJldmVudCB1cyBmcm9tIGNhcHR1cmluZyBtdWx0aXBsZSBldmVudHMgdGhhdCBzaG91bGQgYmUgZ3JvdXBlZCB0b2dldGhlci5cbiAgICBjbGVhclRpbWVvdXQoZGVib3VuY2VUaW1lcklEKTtcbiAgICBkZWJvdW5jZVRpbWVySUQgPSBnbG9iYWwuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBkZWJvdW5jZVRpbWVySUQgPSB1bmRlZmluZWQ7XG4gICAgfSwgZGVib3VuY2VEdXJhdGlvbik7XG4gIH07XG59XG5cbnR5cGUgQWRkRXZlbnRMaXN0ZW5lciA9IChcbiAgdHlwZTogc3RyaW5nLFxuICBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCxcbiAgb3B0aW9ucz86IGJvb2xlYW4gfCBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyxcbikgPT4gdm9pZDtcbnR5cGUgUmVtb3ZlRXZlbnRMaXN0ZW5lciA9IChcbiAgdHlwZTogc3RyaW5nLFxuICBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCxcbiAgb3B0aW9ucz86IGJvb2xlYW4gfCBFdmVudExpc3RlbmVyT3B0aW9ucyxcbikgPT4gdm9pZDtcblxudHlwZSBJbnN0cnVtZW50ZWRFbGVtZW50ID0gRWxlbWVudCAmIHtcbiAgX19zZW50cnlfaW5zdHJ1bWVudGF0aW9uX2hhbmRsZXJzX18/OiB7XG4gICAgW2tleSBpbiAnY2xpY2snIHwgJ2tleXByZXNzJ10/OiB7XG4gICAgICBoYW5kbGVyPzogRnVuY3Rpb247XG4gICAgICAvKiogVGhlIG51bWJlciBvZiBjdXN0b20gbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoaXMgZWxlbWVudCAqL1xuICAgICAgcmVmQ291bnQ6IG51bWJlcjtcbiAgICB9O1xuICB9O1xufTtcblxuLyoqIEpTRG9jICovXG5mdW5jdGlvbiBpbnN0cnVtZW50RE9NKCk6IHZvaWQge1xuICBpZiAoISgnZG9jdW1lbnQnIGluIGdsb2JhbCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBNYWtlIGl0IHNvIHRoYXQgYW55IGNsaWNrIG9yIGtleXByZXNzIHRoYXQgaXMgdW5oYW5kbGVkIC8gYnViYmxlZCB1cCBhbGwgdGhlIHdheSB0byB0aGUgZG9jdW1lbnQgdHJpZ2dlcnMgb3VyIGRvbVxuICAvLyBoYW5kbGVycy4gKE5vcm1hbGx5IHdlIGhhdmUgb25seSBvbmUsIHdoaWNoIGNhcHR1cmVzIGEgYnJlYWRjcnVtYiBmb3IgZWFjaCBjbGljayBvciBrZXlwcmVzcy4pIERvIHRoaXMgYmVmb3JlXG4gIC8vIHdlIGluc3RydW1lbnQgYGFkZEV2ZW50TGlzdGVuZXJgIHNvIHRoYXQgd2UgZG9uJ3QgZW5kIHVwIGF0dGFjaGluZyB0aGlzIGhhbmRsZXIgdHdpY2UuXG4gIGNvbnN0IHRyaWdnZXJET01IYW5kbGVyID0gdHJpZ2dlckhhbmRsZXJzLmJpbmQobnVsbCwgJ2RvbScpO1xuICBjb25zdCBnbG9iYWxET01FdmVudEhhbmRsZXIgPSBtYWtlRE9NRXZlbnRIYW5kbGVyKHRyaWdnZXJET01IYW5kbGVyLCB0cnVlKTtcbiAgZ2xvYmFsLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZ2xvYmFsRE9NRXZlbnRIYW5kbGVyLCBmYWxzZSk7XG4gIGdsb2JhbC5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIGdsb2JhbERPTUV2ZW50SGFuZGxlciwgZmFsc2UpO1xuXG4gIC8vIEFmdGVyIGhvb2tpbmcgaW50byBjbGljayBhbmQga2V5cHJlc3MgZXZlbnRzIGJ1YmJsZWQgdXAgdG8gYGRvY3VtZW50YCwgd2UgYWxzbyBob29rIGludG8gdXNlci1oYW5kbGVkXG4gIC8vIGNsaWNrcyAmIGtleXByZXNzZXMsIGJ5IGFkZGluZyBhbiBldmVudCBsaXN0ZW5lciBvZiBvdXIgb3duIHRvIGFueSBlbGVtZW50IHRvIHdoaWNoIHRoZXkgYWRkIGEgbGlzdGVuZXIuIFRoYXRcbiAgLy8gd2F5LCB3aGVuZXZlciBvbmUgb2YgdGhlaXIgaGFuZGxlcnMgaXMgdHJpZ2dlcmVkLCBvdXJzIHdpbGwgYmUsIHRvby4gKFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlaXIgaGFuZGxlclxuICAvLyBjb3VsZCBwb3RlbnRpYWxseSBwcmV2ZW50IHRoZSBldmVudCBmcm9tIGJ1YmJsaW5nIHVwIHRvIG91ciBnbG9iYWwgbGlzdGVuZXJzLiBUaGlzIHdheSwgb3VyIGhhbmRsZXIgYXJlIHN0aWxsXG4gIC8vIGd1YXJhbnRlZWQgdG8gZmlyZSBhdCBsZWFzdCBvbmNlLilcbiAgWydFdmVudFRhcmdldCcsICdOb2RlJ10uZm9yRWFjaCgodGFyZ2V0OiBzdHJpbmcpID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgY29uc3QgcHJvdG8gPSAoZ2xvYmFsIGFzIGFueSlbdGFyZ2V0XSAmJiAoZ2xvYmFsIGFzIGFueSlbdGFyZ2V0XS5wcm90b3R5cGU7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzcywgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgaWYgKCFwcm90byB8fCAhcHJvdG8uaGFzT3duUHJvcGVydHkgfHwgIXByb3RvLmhhc093blByb3BlcnR5KCdhZGRFdmVudExpc3RlbmVyJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmaWxsKHByb3RvLCAnYWRkRXZlbnRMaXN0ZW5lcicsIGZ1bmN0aW9uKG9yaWdpbmFsQWRkRXZlbnRMaXN0ZW5lcjogQWRkRXZlbnRMaXN0ZW5lcik6IEFkZEV2ZW50TGlzdGVuZXIge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKFxuICAgICAgICB0aGlzOiBFbGVtZW50LFxuICAgICAgICB0eXBlOiBzdHJpbmcsXG4gICAgICAgIGxpc3RlbmVyOiBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0LFxuICAgICAgICBvcHRpb25zPzogYm9vbGVhbiB8IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zLFxuICAgICAgKTogQWRkRXZlbnRMaXN0ZW5lciB7XG4gICAgICAgIGlmICh0eXBlID09PSAnY2xpY2snIHx8IHR5cGUgPT0gJ2tleXByZXNzJykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBlbCA9IHRoaXMgYXMgSW5zdHJ1bWVudGVkRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXJzID0gKGVsLl9fc2VudHJ5X2luc3RydW1lbnRhdGlvbl9oYW5kbGVyc19fID0gZWwuX19zZW50cnlfaW5zdHJ1bWVudGF0aW9uX2hhbmRsZXJzX18gfHwge30pO1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlckZvclR5cGUgPSAoaGFuZGxlcnNbdHlwZV0gPSBoYW5kbGVyc1t0eXBlXSB8fCB7IHJlZkNvdW50OiAwIH0pO1xuXG4gICAgICAgICAgICBpZiAoIWhhbmRsZXJGb3JUeXBlLmhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IG1ha2VET01FdmVudEhhbmRsZXIodHJpZ2dlckRPTUhhbmRsZXIpO1xuICAgICAgICAgICAgICBoYW5kbGVyRm9yVHlwZS5oYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgICAgICAgb3JpZ2luYWxBZGRFdmVudExpc3RlbmVyLmNhbGwodGhpcywgdHlwZSwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGhhbmRsZXJGb3JUeXBlLnJlZkNvdW50ICs9IDE7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gQWNjZXNzaW5nIGRvbSBwcm9wZXJ0aWVzIGlzIGFsd2F5cyBmcmFnaWxlLlxuICAgICAgICAgICAgLy8gQWxzbyBhbGxvd3MgdXMgdG8gc2tpcCBgYWRkRXZlbnRMaXN0ZW5yc2AgY2FsbHMgd2l0aCBubyBwcm9wZXIgYHRoaXNgIGNvbnRleHQuXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsQWRkRXZlbnRMaXN0ZW5lci5jYWxsKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBmaWxsKHByb3RvLCAncmVtb3ZlRXZlbnRMaXN0ZW5lcicsIGZ1bmN0aW9uKG9yaWdpbmFsUmVtb3ZlRXZlbnRMaXN0ZW5lcjogUmVtb3ZlRXZlbnRMaXN0ZW5lcik6IFJlbW92ZUV2ZW50TGlzdGVuZXIge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKFxuICAgICAgICB0aGlzOiBFbGVtZW50LFxuICAgICAgICB0eXBlOiBzdHJpbmcsXG4gICAgICAgIGxpc3RlbmVyOiBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0LFxuICAgICAgICBvcHRpb25zPzogYm9vbGVhbiB8IEV2ZW50TGlzdGVuZXJPcHRpb25zLFxuICAgICAgKTogKCkgPT4gdm9pZCB7XG4gICAgICAgIGlmICh0eXBlID09PSAnY2xpY2snIHx8IHR5cGUgPT0gJ2tleXByZXNzJykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBlbCA9IHRoaXMgYXMgSW5zdHJ1bWVudGVkRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXJzID0gZWwuX19zZW50cnlfaW5zdHJ1bWVudGF0aW9uX2hhbmRsZXJzX18gfHwge307XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyRm9yVHlwZSA9IGhhbmRsZXJzW3R5cGVdO1xuXG4gICAgICAgICAgICBpZiAoaGFuZGxlckZvclR5cGUpIHtcbiAgICAgICAgICAgICAgaGFuZGxlckZvclR5cGUucmVmQ291bnQgLT0gMTtcbiAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGxvbmdlciBhbnkgY3VzdG9tIGhhbmRsZXJzIG9mIHRoZSBjdXJyZW50IHR5cGUgb24gdGhpcyBlbGVtZW50LCB3ZSBjYW4gcmVtb3ZlIG91cnMsIHRvby5cbiAgICAgICAgICAgICAgaWYgKGhhbmRsZXJGb3JUeXBlLnJlZkNvdW50IDw9IDApIHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbFJlbW92ZUV2ZW50TGlzdGVuZXIuY2FsbCh0aGlzLCB0eXBlLCBoYW5kbGVyRm9yVHlwZS5oYW5kbGVyLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVyRm9yVHlwZS5oYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBoYW5kbGVyc1t0eXBlXTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBsb25nZXIgYW55IGN1c3RvbSBoYW5kbGVycyBvZiBhbnkgdHlwZSBvbiB0aGlzIGVsZW1lbnQsIGNsZWFudXAgZXZlcnl0aGluZy5cbiAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGhhbmRsZXJzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgZWwuX19zZW50cnlfaW5zdHJ1bWVudGF0aW9uX2hhbmRsZXJzX187XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBBY2Nlc3NpbmcgZG9tIHByb3BlcnRpZXMgaXMgYWx3YXlzIGZyYWdpbGUuXG4gICAgICAgICAgICAvLyBBbHNvIGFsbG93cyB1cyB0byBza2lwIGBhZGRFdmVudExpc3RlbnJzYCBjYWxscyB3aXRoIG5vIHByb3BlciBgdGhpc2AgY29udGV4dC5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3JpZ2luYWxSZW1vdmVFdmVudExpc3RlbmVyLmNhbGwodGhpcywgdHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmxldCBfb2xkT25FcnJvckhhbmRsZXI6IE9uRXJyb3JFdmVudEhhbmRsZXIgPSBudWxsO1xuLyoqIEpTRG9jICovXG5mdW5jdGlvbiBpbnN0cnVtZW50RXJyb3IoKTogdm9pZCB7XG4gIF9vbGRPbkVycm9ySGFuZGxlciA9IGdsb2JhbC5vbmVycm9yO1xuXG4gIGdsb2JhbC5vbmVycm9yID0gZnVuY3Rpb24obXNnOiBhbnksIHVybDogYW55LCBsaW5lOiBhbnksIGNvbHVtbjogYW55LCBlcnJvcjogYW55KTogYm9vbGVhbiB7XG4gICAgdHJpZ2dlckhhbmRsZXJzKCdlcnJvcicsIHtcbiAgICAgIGNvbHVtbixcbiAgICAgIGVycm9yLFxuICAgICAgbGluZSxcbiAgICAgIG1zZyxcbiAgICAgIHVybCxcbiAgICB9KTtcblxuICAgIGlmIChfb2xkT25FcnJvckhhbmRsZXIpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcbiAgICAgIHJldHVybiBfb2xkT25FcnJvckhhbmRsZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG59XG5cbmxldCBfb2xkT25VbmhhbmRsZWRSZWplY3Rpb25IYW5kbGVyOiAoKGU6IGFueSkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gaW5zdHJ1bWVudFVuaGFuZGxlZFJlamVjdGlvbigpOiB2b2lkIHtcbiAgX29sZE9uVW5oYW5kbGVkUmVqZWN0aW9uSGFuZGxlciA9IGdsb2JhbC5vbnVuaGFuZGxlZHJlamVjdGlvbjtcblxuICBnbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb24gPSBmdW5jdGlvbihlOiBhbnkpOiBib29sZWFuIHtcbiAgICB0cmlnZ2VySGFuZGxlcnMoJ3VuaGFuZGxlZHJlamVjdGlvbicsIGUpO1xuXG4gICAgaWYgKF9vbGRPblVuaGFuZGxlZFJlamVjdGlvbkhhbmRsZXIpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcbiAgICAgIHJldHVybiBfb2xkT25VbmhhbmRsZWRSZWplY3Rpb25IYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG59XG4iLCAiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgRXZlbnQsIE1lY2hhbmlzbSwgU3RhY2tGcmFtZSB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuXG5pbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QgfSBmcm9tICcuL2dsb2JhbCc7XG5pbXBvcnQgeyBzbmlwTGluZSB9IGZyb20gJy4vc3RyaW5nJztcblxuLyoqXG4gKiBFeHRlbmRlZCBXaW5kb3cgaW50ZXJmYWNlIHRoYXQgYWxsb3dzIGZvciBDcnlwdG8gQVBJIHVzYWdlIGluIElFIGJyb3dzZXJzXG4gKi9cbmludGVyZmFjZSBNc0NyeXB0b1dpbmRvdyBleHRlbmRzIFdpbmRvdyB7XG4gIG1zQ3J5cHRvPzogQ3J5cHRvO1xufVxuXG4vKipcbiAqIFVVSUQ0IGdlbmVyYXRvclxuICpcbiAqIEByZXR1cm5zIHN0cmluZyBHZW5lcmF0ZWQgVVVJRDQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1dWlkNCgpOiBzdHJpbmcge1xuICBjb25zdCBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3QoKSBhcyBNc0NyeXB0b1dpbmRvdztcbiAgY29uc3QgY3J5cHRvID0gZ2xvYmFsLmNyeXB0byB8fCBnbG9iYWwubXNDcnlwdG87XG5cbiAgaWYgKCEoY3J5cHRvID09PSB2b2lkIDApICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBVc2Ugd2luZG93LmNyeXB0byBBUEkgaWYgYXZhaWxhYmxlXG4gICAgY29uc3QgYXJyID0gbmV3IFVpbnQxNkFycmF5KDgpO1xuICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyKTtcblxuICAgIC8vIHNldCA0IGluIGJ5dGUgN1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgYXJyWzNdID0gKGFyclszXSAmIDB4ZmZmKSB8IDB4NDAwMDtcbiAgICAvLyBzZXQgMiBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgYnl0ZSA5IHRvICcxMCdcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgIGFycls0XSA9IChhcnJbNF0gJiAweDNmZmYpIHwgMHg4MDAwO1xuXG4gICAgY29uc3QgcGFkID0gKG51bTogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgICAgIGxldCB2ID0gbnVtLnRvU3RyaW5nKDE2KTtcbiAgICAgIHdoaWxlICh2Lmxlbmd0aCA8IDQpIHtcbiAgICAgICAgdiA9IGAwJHt2fWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gdjtcbiAgICB9O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHBhZChhcnJbMF0pICsgcGFkKGFyclsxXSkgKyBwYWQoYXJyWzJdKSArIHBhZChhcnJbM10pICsgcGFkKGFycls0XSkgKyBwYWQoYXJyWzVdKSArIHBhZChhcnJbNl0pICsgcGFkKGFycls3XSlcbiAgICApO1xuICB9XG4gIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTA1MDM0L2hvdy10by1jcmVhdGUtYS1ndWlkLXV1aWQtaW4tamF2YXNjcmlwdC8yMTE3NTIzIzIxMTc1MjNcbiAgcmV0dXJuICd4eHh4eHh4eHh4eHg0eHh4eXh4eHh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBjID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgIGNvbnN0IHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2KSB8IDA7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4ODtcbiAgICByZXR1cm4gdi50b1N0cmluZygxNik7XG4gIH0pO1xufVxuXG4vKipcbiAqIFBhcnNlcyBzdHJpbmcgZm9ybSBvZiBVUkwgaW50byBhbiBvYmplY3RcbiAqIC8vIGJvcnJvd2VkIGZyb20gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjYXBwZW5kaXgtQlxuICogLy8gaW50ZW50aW9uYWxseSB1c2luZyByZWdleCBhbmQgbm90IDxhLz4gaHJlZiBwYXJzaW5nIHRyaWNrIGJlY2F1c2UgUmVhY3QgTmF0aXZlIGFuZCBvdGhlclxuICogLy8gZW52aXJvbm1lbnRzIHdoZXJlIERPTSBtaWdodCBub3QgYmUgYXZhaWxhYmxlXG4gKiBAcmV0dXJucyBwYXJzZWQgVVJMIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVcmwoXG4gIHVybDogc3RyaW5nLFxuKToge1xuICBob3N0Pzogc3RyaW5nO1xuICBwYXRoPzogc3RyaW5nO1xuICBwcm90b2NvbD86IHN0cmluZztcbiAgcmVsYXRpdmU/OiBzdHJpbmc7XG59IHtcbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCBtYXRjaCA9IHVybC5tYXRjaCgvXigoW146Lz8jXSspOik/KFxcL1xcLyhbXi8/I10qKSk/KFtePyNdKikoXFw/KFteI10qKSk/KCMoLiopKT8kLyk7XG5cbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIC8vIGNvZXJjZSB0byB1bmRlZmluZWQgdmFsdWVzIHRvIGVtcHR5IHN0cmluZyBzbyB3ZSBkb24ndCBnZXQgJ3VuZGVmaW5lZCdcbiAgY29uc3QgcXVlcnkgPSBtYXRjaFs2XSB8fCAnJztcbiAgY29uc3QgZnJhZ21lbnQgPSBtYXRjaFs4XSB8fCAnJztcbiAgcmV0dXJuIHtcbiAgICBob3N0OiBtYXRjaFs0XSxcbiAgICBwYXRoOiBtYXRjaFs1XSxcbiAgICBwcm90b2NvbDogbWF0Y2hbMl0sXG4gICAgcmVsYXRpdmU6IG1hdGNoWzVdICsgcXVlcnkgKyBmcmFnbWVudCwgLy8gZXZlcnl0aGluZyBtaW51cyBvcmlnaW5cbiAgfTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBlaXRoZXIgbWVzc2FnZSBvciB0eXBlK3ZhbHVlIGZyb20gYW4gZXZlbnQgdGhhdCBjYW4gYmUgdXNlZCBmb3IgdXNlci1mYWNpbmcgbG9nc1xuICogQHJldHVybnMgZXZlbnQncyBkZXNjcmlwdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXZlbnREZXNjcmlwdGlvbihldmVudDogRXZlbnQpOiBzdHJpbmcge1xuICBpZiAoZXZlbnQubWVzc2FnZSkge1xuICAgIHJldHVybiBldmVudC5tZXNzYWdlO1xuICB9XG4gIGlmIChldmVudC5leGNlcHRpb24gJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyAmJiBldmVudC5leGNlcHRpb24udmFsdWVzWzBdKSB7XG4gICAgY29uc3QgZXhjZXB0aW9uID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXTtcblxuICAgIGlmIChleGNlcHRpb24udHlwZSAmJiBleGNlcHRpb24udmFsdWUpIHtcbiAgICAgIHJldHVybiBgJHtleGNlcHRpb24udHlwZX06ICR7ZXhjZXB0aW9uLnZhbHVlfWA7XG4gICAgfVxuICAgIHJldHVybiBleGNlcHRpb24udHlwZSB8fCBleGNlcHRpb24udmFsdWUgfHwgZXZlbnQuZXZlbnRfaWQgfHwgJzx1bmtub3duPic7XG4gIH1cbiAgcmV0dXJuIGV2ZW50LmV2ZW50X2lkIHx8ICc8dW5rbm93bj4nO1xufVxuXG4vKipcbiAqIEFkZHMgZXhjZXB0aW9uIHZhbHVlcywgdHlwZSBhbmQgdmFsdWUgdG8gYW4gc3ludGhldGljIEV4Y2VwdGlvbi5cbiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHZhbHVlIFZhbHVlIG9mIHRoZSBleGNlcHRpb24uXG4gKiBAcGFyYW0gdHlwZSBUeXBlIG9mIHRoZSBleGNlcHRpb24uXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRFeGNlcHRpb25UeXBlVmFsdWUoZXZlbnQ6IEV2ZW50LCB2YWx1ZT86IHN0cmluZywgdHlwZT86IHN0cmluZyk6IHZvaWQge1xuICBldmVudC5leGNlcHRpb24gPSBldmVudC5leGNlcHRpb24gfHwge307XG4gIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgPSBldmVudC5leGNlcHRpb24udmFsdWVzIHx8IFtdO1xuICBldmVudC5leGNlcHRpb24udmFsdWVzWzBdID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXSB8fCB7fTtcbiAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS52YWx1ZSA9IGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0udmFsdWUgfHwgdmFsdWUgfHwgJyc7XG4gIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0udHlwZSA9IGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0udHlwZSB8fCB0eXBlIHx8ICdFcnJvcic7XG59XG5cbi8qKlxuICogQWRkcyBleGNlcHRpb24gbWVjaGFuaXNtIGRhdGEgdG8gYSBnaXZlbiBldmVudC4gVXNlcyBkZWZhdWx0cyBpZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyBub3QgcGFzc2VkLlxuICpcbiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gbW9kaWZ5LlxuICogQHBhcmFtIG5ld01lY2hhbmlzbSBNZWNoYW5pc20gZGF0YSB0byBhZGQgdG8gdGhlIGV2ZW50LlxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRXhjZXB0aW9uTWVjaGFuaXNtKGV2ZW50OiBFdmVudCwgbmV3TWVjaGFuaXNtPzogUGFydGlhbDxNZWNoYW5pc20+KTogdm9pZCB7XG4gIGlmICghZXZlbnQuZXhjZXB0aW9uIHx8ICFldmVudC5leGNlcHRpb24udmFsdWVzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGV4Y2VwdGlvblZhbHVlMCA9IGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF07XG5cbiAgY29uc3QgZGVmYXVsdE1lY2hhbmlzbSA9IHsgdHlwZTogJ2dlbmVyaWMnLCBoYW5kbGVkOiB0cnVlIH07XG4gIGNvbnN0IGN1cnJlbnRNZWNoYW5pc20gPSBleGNlcHRpb25WYWx1ZTAubWVjaGFuaXNtO1xuICBleGNlcHRpb25WYWx1ZTAubWVjaGFuaXNtID0geyAuLi5kZWZhdWx0TWVjaGFuaXNtLCAuLi5jdXJyZW50TWVjaGFuaXNtLCAuLi5uZXdNZWNoYW5pc20gfTtcblxuICBpZiAobmV3TWVjaGFuaXNtICYmICdkYXRhJyBpbiBuZXdNZWNoYW5pc20pIHtcbiAgICBjb25zdCBtZXJnZWREYXRhID0geyAuLi5jdXJyZW50TWVjaGFuaXNtPy5kYXRhLCAuLi5uZXdNZWNoYW5pc20uZGF0YSB9O1xuICAgIGV4Y2VwdGlvblZhbHVlMC5tZWNoYW5pc20uZGF0YSA9IG1lcmdlZERhdGE7XG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9zZW12ZXIub3JnLyNpcy10aGVyZS1hLXN1Z2dlc3RlZC1yZWd1bGFyLWV4cHJlc3Npb24tcmVnZXgtdG8tY2hlY2stYS1zZW12ZXItc3RyaW5nXG5jb25zdCBTRU1WRVJfUkVHRVhQID0gL14oMHxbMS05XVxcZCopXFwuKDB8WzEtOV1cXGQqKVxcLigwfFsxLTldXFxkKikoPzotKCg/OjB8WzEtOV1cXGQqfFxcZCpbYS16QS1aLV1bMC05YS16QS1aLV0qKSg/OlxcLig/OjB8WzEtOV1cXGQqfFxcZCpbYS16QS1aLV1bMC05YS16QS1aLV0qKSkqKSk/KD86XFwrKFswLTlhLXpBLVotXSsoPzpcXC5bMC05YS16QS1aLV0rKSopKT8kLztcblxuLyoqXG4gKiBSZXByZXNlbnRzIFNlbWFudGljIFZlcnNpb25pbmcgb2JqZWN0XG4gKi9cbmludGVyZmFjZSBTZW1WZXIge1xuICBtYWpvcj86IG51bWJlcjtcbiAgbWlub3I/OiBudW1iZXI7XG4gIHBhdGNoPzogbnVtYmVyO1xuICBwcmVyZWxlYXNlPzogc3RyaW5nO1xuICBidWlsZG1ldGFkYXRhPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcnNlcyBpbnB1dCBpbnRvIGEgU2VtVmVyIGludGVyZmFjZVxuICogQHBhcmFtIGlucHV0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHNlbXZlciB2ZXJzaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNlbXZlcihpbnB1dDogc3RyaW5nKTogU2VtVmVyIHtcbiAgY29uc3QgbWF0Y2ggPSBpbnB1dC5tYXRjaChTRU1WRVJfUkVHRVhQKSB8fCBbXTtcbiAgY29uc3QgbWFqb3IgPSBwYXJzZUludChtYXRjaFsxXSwgMTApO1xuICBjb25zdCBtaW5vciA9IHBhcnNlSW50KG1hdGNoWzJdLCAxMCk7XG4gIGNvbnN0IHBhdGNoID0gcGFyc2VJbnQobWF0Y2hbM10sIDEwKTtcbiAgcmV0dXJuIHtcbiAgICBidWlsZG1ldGFkYXRhOiBtYXRjaFs1XSxcbiAgICBtYWpvcjogaXNOYU4obWFqb3IpID8gdW5kZWZpbmVkIDogbWFqb3IsXG4gICAgbWlub3I6IGlzTmFOKG1pbm9yKSA/IHVuZGVmaW5lZCA6IG1pbm9yLFxuICAgIHBhdGNoOiBpc05hTihwYXRjaCkgPyB1bmRlZmluZWQgOiBwYXRjaCxcbiAgICBwcmVyZWxlYXNlOiBtYXRjaFs0XSxcbiAgfTtcbn1cblxuY29uc3QgZGVmYXVsdFJldHJ5QWZ0ZXIgPSA2MCAqIDEwMDA7IC8vIDYwIHNlY29uZHNcblxuLyoqXG4gKiBFeHRyYWN0cyBSZXRyeS1BZnRlciB2YWx1ZSBmcm9tIHRoZSByZXF1ZXN0IGhlYWRlciBvciByZXR1cm5zIGRlZmF1bHQgdmFsdWVcbiAqIEBwYXJhbSBub3cgY3VycmVudCB1bml4IHRpbWVzdGFtcFxuICogQHBhcmFtIGhlYWRlciBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgJ1JldHJ5LUFmdGVyJyBoZWFkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmV0cnlBZnRlckhlYWRlcihub3c6IG51bWJlciwgaGVhZGVyPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCk6IG51bWJlciB7XG4gIGlmICghaGVhZGVyKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRSZXRyeUFmdGVyO1xuICB9XG5cbiAgY29uc3QgaGVhZGVyRGVsYXkgPSBwYXJzZUludChgJHtoZWFkZXJ9YCwgMTApO1xuICBpZiAoIWlzTmFOKGhlYWRlckRlbGF5KSkge1xuICAgIHJldHVybiBoZWFkZXJEZWxheSAqIDEwMDA7XG4gIH1cblxuICBjb25zdCBoZWFkZXJEYXRlID0gRGF0ZS5wYXJzZShgJHtoZWFkZXJ9YCk7XG4gIGlmICghaXNOYU4oaGVhZGVyRGF0ZSkpIHtcbiAgICByZXR1cm4gaGVhZGVyRGF0ZSAtIG5vdztcbiAgfVxuXG4gIHJldHVybiBkZWZhdWx0UmV0cnlBZnRlcjtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGFkZHMgY29udGV4dCAocHJlL3Bvc3QvbGluZSkgbGluZXMgdG8gdGhlIHByb3ZpZGVkIGZyYW1lXG4gKlxuICogQHBhcmFtIGxpbmVzIHN0cmluZ1tdIGNvbnRhaW5pbmcgYWxsIGxpbmVzXG4gKiBAcGFyYW0gZnJhbWUgU3RhY2tGcmFtZSB0aGF0IHdpbGwgYmUgbXV0YXRlZFxuICogQHBhcmFtIGxpbmVzT2ZDb250ZXh0IG51bWJlciBvZiBjb250ZXh0IGxpbmVzIHdlIHdhbnQgdG8gYWRkIHByZS9wb3N0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRDb250ZXh0VG9GcmFtZShsaW5lczogc3RyaW5nW10sIGZyYW1lOiBTdGFja0ZyYW1lLCBsaW5lc09mQ29udGV4dDogbnVtYmVyID0gNSk6IHZvaWQge1xuICBjb25zdCBsaW5lbm8gPSBmcmFtZS5saW5lbm8gfHwgMDtcbiAgY29uc3QgbWF4TGluZXMgPSBsaW5lcy5sZW5ndGg7XG4gIGNvbnN0IHNvdXJjZUxpbmUgPSBNYXRoLm1heChNYXRoLm1pbihtYXhMaW5lcywgbGluZW5vIC0gMSksIDApO1xuXG4gIGZyYW1lLnByZV9jb250ZXh0ID0gbGluZXNcbiAgICAuc2xpY2UoTWF0aC5tYXgoMCwgc291cmNlTGluZSAtIGxpbmVzT2ZDb250ZXh0KSwgc291cmNlTGluZSlcbiAgICAubWFwKChsaW5lOiBzdHJpbmcpID0+IHNuaXBMaW5lKGxpbmUsIDApKTtcblxuICBmcmFtZS5jb250ZXh0X2xpbmUgPSBzbmlwTGluZShsaW5lc1tNYXRoLm1pbihtYXhMaW5lcyAtIDEsIHNvdXJjZUxpbmUpXSwgZnJhbWUuY29sbm8gfHwgMCk7XG5cbiAgZnJhbWUucG9zdF9jb250ZXh0ID0gbGluZXNcbiAgICAuc2xpY2UoTWF0aC5taW4oc291cmNlTGluZSArIDEsIG1heExpbmVzKSwgc291cmNlTGluZSArIDEgKyBsaW5lc09mQ29udGV4dClcbiAgICAubWFwKChsaW5lOiBzdHJpbmcpID0+IHNuaXBMaW5lKGxpbmUsIDApKTtcbn1cblxuLyoqXG4gKiBTdHJpcCB0aGUgcXVlcnkgc3RyaW5nIGFuZCBmcmFnbWVudCBvZmYgb2YgYSBnaXZlbiBVUkwgb3IgcGF0aCAoaWYgcHJlc2VudClcbiAqXG4gKiBAcGFyYW0gdXJsUGF0aCBGdWxsIFVSTCBvciBwYXRoLCBpbmNsdWRpbmcgcG9zc2libGUgcXVlcnkgc3RyaW5nIGFuZC9vciBmcmFnbWVudFxuICogQHJldHVybnMgVVJMIG9yIHBhdGggd2l0aG91dCBxdWVyeSBzdHJpbmcgb3IgZnJhZ21lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwVXJsUXVlcnlBbmRGcmFnbWVudCh1cmxQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbiAgcmV0dXJuIHVybFBhdGguc3BsaXQoL1tcXD8jXS8sIDEpWzBdO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB3ZSd2ZSBhbHJlYWR5IGNhcHR1cmVkIHRoZSBnaXZlbiBleGNlcHRpb24gKG5vdGU6IG5vdCBhbiBpZGVudGljYWwgZXhjZXB0aW9uIC0gdGhlIHZlcnkgb2JqZWN0XG4gKiBpbiBxdWVzdGlvbiksIGFuZCBtYXJrcyBpdCBjYXB0dXJlZCBpZiBub3QuXG4gKlxuICogVGhpcyBpcyB1c2VmdWwgYmVjYXVzZSBpdCdzIHBvc3NpYmxlIGZvciBhbiBlcnJvciB0byBnZXQgY2FwdHVyZWQgYnkgbW9yZSB0aGFuIG9uZSBtZWNoYW5pc20uIEFmdGVyIHdlIGludGVyY2VwdCBhbmRcbiAqIHJlY29yZCBhbiBlcnJvciwgd2UgcmV0aHJvdyBpdCAoYXNzdW1pbmcgd2UndmUgaW50ZXJjZXB0ZWQgaXQgYmVmb3JlIGl0J3MgcmVhY2hlZCB0aGUgdG9wLWxldmVsIGdsb2JhbCBoYW5kbGVycyksIHNvXG4gKiB0aGF0IHdlIGRvbid0IGludGVyZmVyZSB3aXRoIHdoYXRldmVyIGVmZmVjdHMgdGhlIGVycm9yIG1pZ2h0IGhhdmUgaGFkIHdlcmUgdGhlIFNESyBub3QgdGhlcmUuIEF0IHRoYXQgcG9pbnQsIGJlY2F1c2VcbiAqIHRoZSBlcnJvciBoYXMgYmVlbiByZXRocm93biwgaXQncyBwb3NzaWJsZSBmb3IgaXQgdG8gYnViYmxlIHVwIHRvIHNvbWUgb3RoZXIgY29kZSB3ZSd2ZSBpbnN0cnVtZW50ZWQuIElmIGl0J3Mgbm90XG4gKiBjYXVnaHQgYWZ0ZXIgdGhhdCwgaXQgd2lsbCBidWJibGUgYWxsIHRoZSB3YXkgdXAgdG8gdGhlIGdsb2JhbCBoYW5kbGVycyAod2hpY2ggb2YgY291cnNlIHdlIGFsc28gaW5zdHJ1bWVudCkuIFRoaXNcbiAqIGZ1bmN0aW9uIGhlbHBzIHVzIGVuc3VyZSB0aGF0IGV2ZW4gaWYgd2UgZW5jb3VudGVyIHRoZSBzYW1lIGVycm9yIG1vcmUgdGhhbiBvbmNlLCB3ZSBvbmx5IHJlY29yZCBpdCB0aGUgZmlyc3QgdGltZSB3ZVxuICogc2VlIGl0LlxuICpcbiAqIE5vdGU6IEl0IHdpbGwgaWdub3JlIHByaW1pdGl2ZXMgKGFsd2F5cyByZXR1cm4gYGZhbHNlYCBhbmQgbm90IG1hcmsgdGhlbSBhcyBzZWVuKSwgYXMgcHJvcGVydGllcyBjYW4ndCBiZSBzZXQgb25cbiAqIHRoZW0uIHtAbGluazogT2JqZWN0Lm9iamVjdGlmeX0gY2FuIGJlIHVzZWQgb24gZXhjZXB0aW9ucyB0byBjb252ZXJ0IGFueSB0aGF0IGFyZSBwcmltaXRpdmVzIGludG8gdGhlaXIgZXF1aXZhbGVudFxuICogb2JqZWN0IHdyYXBwZXIgZm9ybXMgc28gdGhhdCB0aGlzIGNoZWNrIHdpbGwgYWx3YXlzIHdvcmsuIEhvd2V2ZXIsIGJlY2F1c2Ugd2UgbmVlZCB0byBmbGFnIHRoZSBleGFjdCBvYmplY3Qgd2hpY2hcbiAqIHdpbGwgZ2V0IHJldGhyb3duLCBhbmQgYmVjYXVzZSB0aGF0IHJldGhyb3dpbmcgaGFwcGVucyBvdXRzaWRlIG9mIHRoZSBldmVudCBwcm9jZXNzaW5nIHBpcGVsaW5lLCB0aGUgb2JqZWN0aWZpY2F0aW9uXG4gKiBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoZSBleGNlcHRpb24gY2FwdHVyZWQuXG4gKlxuICogQHBhcmFtIEEgdGhyb3duIGV4Y2VwdGlvbiB0byBjaGVjayBvciBmbGFnIGFzIGhhdmluZyBiZWVuIHNlZW5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgZXhjZXB0aW9uIGhhcyBhbHJlYWR5IGJlZW4gY2FwdHVyZWQsIGBmYWxzZWAgaWYgbm90ICh3aXRoIHRoZSBzaWRlIGVmZmVjdCBvZiBtYXJraW5nIGl0IHNlZW4pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja09yU2V0QWxyZWFkeUNhdWdodChleGNlcHRpb246IHVua25vd24pOiBib29sZWFuIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICBpZiAoKGV4Y2VwdGlvbiBhcyBhbnkpPy5fX3NlbnRyeV9jYXB0dXJlZF9fKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIHNldCBpdCB0aGlzIHdheSByYXRoZXIgdGhhbiBieSBhc3NpZ25tZW50IHNvIHRoYXQgaXQncyBub3QgZW5udW1lcmFibGUgYW5kIHRoZXJlZm9yZSBpc24ndCByZWNvcmRlZCBieSB0aGVcbiAgICAvLyBgRXh0cmFFcnJvckRhdGFgIGludGVncmF0aW9uXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4Y2VwdGlvbiwgJ19fc2VudHJ5X2NhcHR1cmVkX18nLCB7XG4gICAgICB2YWx1ZTogdHJ1ZSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gYGV4Y2VwdGlvbmAgaXMgYSBwcmltaXRpdmUsIHNvIHdlIGNhbid0IG1hcmsgaXQgc2VlblxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuIiwgIi8vIFNsaWdodGx5IG1vZGlmaWVkIChubyBJRTggc3VwcG9ydCwgRVM2KSBhbmQgdHJhbnNjcmliZWQgdG8gVHlwZVNjcmlwdFxuLy8gaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2NhbHZpbm1ldGNhbGYvcm9sbHVwLXBsdWdpbi1ub2RlLWJ1aWx0aW5zL21hc3Rlci9zcmMvZXM2L3BhdGguanNcblxuLyoqIEpTRG9jICovXG5mdW5jdGlvbiBub3JtYWxpemVBcnJheShwYXJ0czogc3RyaW5nW10sIGFsbG93QWJvdmVSb290PzogYm9vbGVhbik6IHN0cmluZ1tdIHtcbiAgLy8gaWYgdGhlIHBhdGggdHJpZXMgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIGB1cGAgZW5kcyB1cCA+IDBcbiAgbGV0IHVwID0gMDtcbiAgZm9yIChsZXQgaSA9IHBhcnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgY29uc3QgbGFzdCA9IHBhcnRzW2ldO1xuICAgIGlmIChsYXN0ID09PSAnLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2UgaWYgKGxhc3QgPT09ICcuLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wbHVzcGx1c1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXNcbiAgICAgIHVwLS07XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIHBhdGggaXMgYWxsb3dlZCB0byBnbyBhYm92ZSB0aGUgcm9vdCwgcmVzdG9yZSBsZWFkaW5nIC4uc1xuICBpZiAoYWxsb3dBYm92ZVJvb3QpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXNcbiAgICBmb3IgKDsgdXAtLTsgdXApIHtcbiAgICAgIHBhcnRzLnVuc2hpZnQoJy4uJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcnRzO1xufVxuXG4vLyBTcGxpdCBhIGZpbGVuYW1lIGludG8gW3Jvb3QsIGRpciwgYmFzZW5hbWUsIGV4dF0sIHVuaXggdmVyc2lvblxuLy8gJ3Jvb3QnIGlzIGp1c3QgYSBzbGFzaCwgb3Igbm90aGluZy5cbmNvbnN0IHNwbGl0UGF0aFJlID0gL14oXFwvP3wpKFtcXHNcXFNdKj8pKCg/OlxcLnsxLDJ9fFteL10rP3wpKFxcLlteLi9dKnwpKSg/OlsvXSopJC87XG4vKiogSlNEb2MgKi9cbmZ1bmN0aW9uIHNwbGl0UGF0aChmaWxlbmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBwYXJ0cyA9IHNwbGl0UGF0aFJlLmV4ZWMoZmlsZW5hbWUpO1xuICByZXR1cm4gcGFydHMgPyBwYXJ0cy5zbGljZSgxKSA6IFtdO1xufVxuXG4vLyBwYXRoLnJlc29sdmUoW2Zyb20gLi4uXSwgdG8pXG4vLyBwb3NpeCB2ZXJzaW9uXG4vKiogSlNEb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKC4uLmFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgbGV0IHJlc29sdmVkUGF0aCA9ICcnO1xuICBsZXQgcmVzb2x2ZWRBYnNvbHV0ZSA9IGZhbHNlO1xuXG4gIGZvciAobGV0IGkgPSBhcmdzLmxlbmd0aCAtIDE7IGkgPj0gLTEgJiYgIXJlc29sdmVkQWJzb2x1dGU7IGktLSkge1xuICAgIGNvbnN0IHBhdGggPSBpID49IDAgPyBhcmdzW2ldIDogJy8nO1xuXG4gICAgLy8gU2tpcCBlbXB0eSBlbnRyaWVzXG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXNvbHZlZFBhdGggPSBgJHtwYXRofS8ke3Jlc29sdmVkUGF0aH1gO1xuICAgIHJlc29sdmVkQWJzb2x1dGUgPSBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nO1xuICB9XG5cbiAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcGF0aCBzaG91bGQgYmUgcmVzb2x2ZWQgdG8gYSBmdWxsIGFic29sdXRlIHBhdGgsIGJ1dFxuICAvLyBoYW5kbGUgcmVsYXRpdmUgcGF0aHMgdG8gYmUgc2FmZSAobWlnaHQgaGFwcGVuIHdoZW4gcHJvY2Vzcy5jd2QoKSBmYWlscylcblxuICAvLyBOb3JtYWxpemUgdGhlIHBhdGhcbiAgcmVzb2x2ZWRQYXRoID0gbm9ybWFsaXplQXJyYXkoXG4gICAgcmVzb2x2ZWRQYXRoLnNwbGl0KCcvJykuZmlsdGVyKHAgPT4gISFwKSxcbiAgICAhcmVzb2x2ZWRBYnNvbHV0ZSxcbiAgKS5qb2luKCcvJyk7XG5cbiAgcmV0dXJuIChyZXNvbHZlZEFic29sdXRlID8gJy8nIDogJycpICsgcmVzb2x2ZWRQYXRoIHx8ICcuJztcbn1cblxuLyoqIEpTRG9jICovXG5mdW5jdGlvbiB0cmltKGFycjogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGxldCBzdGFydCA9IDA7XG4gIGZvciAoOyBzdGFydCA8IGFyci5sZW5ndGg7IHN0YXJ0KyspIHtcbiAgICBpZiAoYXJyW3N0YXJ0XSAhPT0gJycpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGxldCBlbmQgPSBhcnIubGVuZ3RoIC0gMTtcbiAgZm9yICg7IGVuZCA+PSAwOyBlbmQtLSkge1xuICAgIGlmIChhcnJbZW5kXSAhPT0gJycpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdGFydCA+IGVuZCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gYXJyLnNsaWNlKHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpO1xufVxuXG4vLyBwYXRoLnJlbGF0aXZlKGZyb20sIHRvKVxuLy8gcG9zaXggdmVyc2lvblxuLyoqIEpTRG9jICovXG5leHBvcnQgZnVuY3Rpb24gcmVsYXRpdmUoZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nKTogc3RyaW5nIHtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbiAgZnJvbSA9IHJlc29sdmUoZnJvbSkuc3Vic3RyKDEpO1xuICB0byA9IHJlc29sdmUodG8pLnN1YnN0cigxKTtcbiAgLyogZXNsaW50LWVuYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuXG4gIGNvbnN0IGZyb21QYXJ0cyA9IHRyaW0oZnJvbS5zcGxpdCgnLycpKTtcbiAgY29uc3QgdG9QYXJ0cyA9IHRyaW0odG8uc3BsaXQoJy8nKSk7XG5cbiAgY29uc3QgbGVuZ3RoID0gTWF0aC5taW4oZnJvbVBhcnRzLmxlbmd0aCwgdG9QYXJ0cy5sZW5ndGgpO1xuICBsZXQgc2FtZVBhcnRzTGVuZ3RoID0gbGVuZ3RoO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZyb21QYXJ0c1tpXSAhPT0gdG9QYXJ0c1tpXSkge1xuICAgICAgc2FtZVBhcnRzTGVuZ3RoID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGxldCBvdXRwdXRQYXJ0cyA9IFtdO1xuICBmb3IgKGxldCBpID0gc2FtZVBhcnRzTGVuZ3RoOyBpIDwgZnJvbVBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3V0cHV0UGFydHMucHVzaCgnLi4nKTtcbiAgfVxuXG4gIG91dHB1dFBhcnRzID0gb3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7XG5cbiAgcmV0dXJuIG91dHB1dFBhcnRzLmpvaW4oJy8nKTtcbn1cblxuLy8gcGF0aC5ub3JtYWxpemUocGF0aClcbi8vIHBvc2l4IHZlcnNpb25cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgaXNQYXRoQWJzb2x1dGUgPSBpc0Fic29sdXRlKHBhdGgpO1xuICBjb25zdCB0cmFpbGluZ1NsYXNoID0gcGF0aC5zdWJzdHIoLTEpID09PSAnLyc7XG5cbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gIGxldCBub3JtYWxpemVkUGF0aCA9IG5vcm1hbGl6ZUFycmF5KFxuICAgIHBhdGguc3BsaXQoJy8nKS5maWx0ZXIocCA9PiAhIXApLFxuICAgICFpc1BhdGhBYnNvbHV0ZSxcbiAgKS5qb2luKCcvJyk7XG5cbiAgaWYgKCFub3JtYWxpemVkUGF0aCAmJiAhaXNQYXRoQWJzb2x1dGUpIHtcbiAgICBub3JtYWxpemVkUGF0aCA9ICcuJztcbiAgfVxuICBpZiAobm9ybWFsaXplZFBhdGggJiYgdHJhaWxpbmdTbGFzaCkge1xuICAgIG5vcm1hbGl6ZWRQYXRoICs9ICcvJztcbiAgfVxuXG4gIHJldHVybiAoaXNQYXRoQWJzb2x1dGUgPyAnLycgOiAnJykgKyBub3JtYWxpemVkUGF0aDtcbn1cblxuLy8gcG9zaXggdmVyc2lvblxuLyoqIEpTRG9jICovXG5leHBvcnQgZnVuY3Rpb24gaXNBYnNvbHV0ZShwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnLyc7XG59XG5cbi8vIHBvc2l4IHZlcnNpb25cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpvaW4oLi4uYXJnczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gbm9ybWFsaXplUGF0aChhcmdzLmpvaW4oJy8nKSk7XG59XG5cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpcm5hbWUocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzdWx0ID0gc3BsaXRQYXRoKHBhdGgpO1xuICBjb25zdCByb290ID0gcmVzdWx0WzBdO1xuICBsZXQgZGlyID0gcmVzdWx0WzFdO1xuXG4gIGlmICghcm9vdCAmJiAhZGlyKSB7XG4gICAgLy8gTm8gZGlybmFtZSB3aGF0c29ldmVyXG4gICAgcmV0dXJuICcuJztcbiAgfVxuXG4gIGlmIChkaXIpIHtcbiAgICAvLyBJdCBoYXMgYSBkaXJuYW1lLCBzdHJpcCB0cmFpbGluZyBzbGFzaFxuICAgIGRpciA9IGRpci5zdWJzdHIoMCwgZGlyLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgcmV0dXJuIHJvb3QgKyBkaXI7XG59XG5cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2VuYW1lKHBhdGg6IHN0cmluZywgZXh0Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGYgPSBzcGxpdFBhdGgocGF0aClbMl07XG4gIGlmIChleHQgJiYgZi5zdWJzdHIoZXh0Lmxlbmd0aCAqIC0xKSA9PT0gZXh0KSB7XG4gICAgZiA9IGYuc3Vic3RyKDAsIGYubGVuZ3RoIC0gZXh0Lmxlbmd0aCk7XG4gIH1cbiAgcmV0dXJuIGY7XG59XG4iLCAiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LWZ1bmN0aW9uLXJldHVybi10eXBlICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvdHlwZWRlZiAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlcyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgaXNUaGVuYWJsZSB9IGZyb20gJy4vaXMnO1xuXG4vKiogU3luY1Byb21pc2UgaW50ZXJuYWwgc3RhdGVzICovXG5jb25zdCBlbnVtIFN0YXRlcyB7XG4gIC8qKiBQZW5kaW5nICovXG4gIFBFTkRJTkcgPSAnUEVORElORycsXG4gIC8qKiBSZXNvbHZlZCAvIE9LICovXG4gIFJFU09MVkVEID0gJ1JFU09MVkVEJyxcbiAgLyoqIFJlamVjdGVkIC8gRXJyb3IgKi9cbiAgUkVKRUNURUQgPSAnUkVKRUNURUQnLFxufVxuXG4vKipcbiAqIFRoZW5hYmxlIGNsYXNzIHRoYXQgYmVoYXZlcyBsaWtlIGEgUHJvbWlzZSBhbmQgZm9sbG93cyBpdCdzIGludGVyZmFjZVxuICogYnV0IGlzIG5vdCBhc3luYyBpbnRlcm5hbGx5XG4gKi9cbmNsYXNzIFN5bmNQcm9taXNlPFQ+IGltcGxlbWVudHMgUHJvbWlzZUxpa2U8VD4ge1xuICBwcml2YXRlIF9zdGF0ZTogU3RhdGVzID0gU3RhdGVzLlBFTkRJTkc7XG4gIHByaXZhdGUgX2hhbmRsZXJzOiBBcnJheTx7XG4gICAgZG9uZTogYm9vbGVhbjtcbiAgICBvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFQpID0+IFQgfCBQcm9taXNlTGlrZTxUPikgfCBudWxsO1xuICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBhbnkpIHwgbnVsbDtcbiAgfT4gPSBbXTtcbiAgcHJpdmF0ZSBfdmFsdWU6IGFueTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgZXhlY3V0b3I6IChyZXNvbHZlOiAodmFsdWU/OiBUIHwgUHJvbWlzZUxpa2U8VD4gfCBudWxsKSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpID0+IHZvaWQsXG4gICkge1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcih0aGlzLl9yZXNvbHZlLCB0aGlzLl9yZWplY3QpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuX3JlamVjdChlKTtcbiAgICB9XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHVibGljIHN0YXRpYyByZXNvbHZlPFQ+KHZhbHVlOiBUIHwgUHJvbWlzZUxpa2U8VD4pOiBQcm9taXNlTGlrZTxUPiB7XG4gICAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHB1YmxpYyBzdGF0aWMgcmVqZWN0PFQgPSBuZXZlcj4ocmVhc29uPzogYW55KTogUHJvbWlzZUxpa2U8VD4ge1xuICAgIHJldHVybiBuZXcgU3luY1Byb21pc2UoKF8sIHJlamVjdCkgPT4ge1xuICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgfSk7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHVibGljIHN0YXRpYyBhbGw8VSA9IGFueT4oY29sbGVjdGlvbjogQXJyYXk8VSB8IFByb21pc2VMaWtlPFU+Pik6IFByb21pc2VMaWtlPFVbXT4ge1xuICAgIHJldHVybiBuZXcgU3luY1Byb21pc2U8VVtdPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29sbGVjdGlvbikpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoYFByb21pc2UuYWxsIHJlcXVpcmVzIGFuIGFycmF5IGFzIGlucHV0LmApKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29sbGVjdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmVzb2x2ZShbXSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGNvdW50ZXIgPSBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgICAgIGNvbnN0IHJlc29sdmVkQ29sbGVjdGlvbjogVVtdID0gW107XG5cbiAgICAgIGNvbGxlY3Rpb24uZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgdm9pZCBTeW5jUHJvbWlzZS5yZXNvbHZlKGl0ZW0pXG4gICAgICAgICAgLnRoZW4odmFsdWUgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZWRDb2xsZWN0aW9uW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgICAgY291bnRlciAtPSAxO1xuXG4gICAgICAgICAgICBpZiAoY291bnRlciAhPT0gMCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKHJlc29sdmVkQ29sbGVjdGlvbik7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAudGhlbihudWxsLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHVibGljIHRoZW48VFJlc3VsdDEgPSBULCBUUmVzdWx0MiA9IG5ldmVyPihcbiAgICBvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFQpID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+KSB8IG51bGwsXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGwsXG4gICk6IFByb21pc2VMaWtlPFRSZXN1bHQxIHwgVFJlc3VsdDI+IHtcbiAgICByZXR1cm4gbmV3IFN5bmNQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuX2F0dGFjaEhhbmRsZXIoe1xuICAgICAgICBkb25lOiBmYWxzZSxcbiAgICAgICAgb25mdWxmaWxsZWQ6IHJlc3VsdCA9PiB7XG4gICAgICAgICAgaWYgKCFvbmZ1bGZpbGxlZCkge1xuICAgICAgICAgICAgLy8gVE9ETzogXHUwMEFGXFxfKFx1MzBDNClfL1x1MDBBRlxuICAgICAgICAgICAgLy8gVE9ETzogRklYTUVcbiAgICAgICAgICAgIHJlc29sdmUocmVzdWx0IGFzIGFueSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXNvbHZlKG9uZnVsZmlsbGVkKHJlc3VsdCkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9ucmVqZWN0ZWQ6IHJlYXNvbiA9PiB7XG4gICAgICAgICAgaWYgKCFvbnJlamVjdGVkKSB7XG4gICAgICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc29sdmUob25yZWplY3RlZChyZWFzb24pKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHVibGljIGNhdGNoPFRSZXN1bHQgPSBuZXZlcj4oXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQgfCBQcm9taXNlTGlrZTxUUmVzdWx0PikgfCBudWxsLFxuICApOiBQcm9taXNlTGlrZTxUIHwgVFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnRoZW4odmFsID0+IHZhbCwgb25yZWplY3RlZCk7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHVibGljIGZpbmFsbHk8VFJlc3VsdD4ob25maW5hbGx5PzogKCgpID0+IHZvaWQpIHwgbnVsbCk6IFByb21pc2VMaWtlPFRSZXN1bHQ+IHtcbiAgICByZXR1cm4gbmV3IFN5bmNQcm9taXNlPFRSZXN1bHQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCB2YWw6IFRSZXN1bHQgfCBhbnk7XG4gICAgICBsZXQgaXNSZWplY3RlZDogYm9vbGVhbjtcblxuICAgICAgcmV0dXJuIHRoaXMudGhlbihcbiAgICAgICAgdmFsdWUgPT4ge1xuICAgICAgICAgIGlzUmVqZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICB2YWwgPSB2YWx1ZTtcbiAgICAgICAgICBpZiAob25maW5hbGx5KSB7XG4gICAgICAgICAgICBvbmZpbmFsbHkoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlYXNvbiA9PiB7XG4gICAgICAgICAgaXNSZWplY3RlZCA9IHRydWU7XG4gICAgICAgICAgdmFsID0gcmVhc29uO1xuICAgICAgICAgIGlmIChvbmZpbmFsbHkpIHtcbiAgICAgICAgICAgIG9uZmluYWxseSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICkudGhlbigoKSA9PiB7XG4gICAgICAgIGlmIChpc1JlamVjdGVkKSB7XG4gICAgICAgICAgcmVqZWN0KHZhbCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZSgodmFsIGFzIHVua25vd24pIGFzIGFueSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ1tvYmplY3QgU3luY1Byb21pc2VdJztcbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZXNvbHZlID0gKHZhbHVlPzogVCB8IFByb21pc2VMaWtlPFQ+IHwgbnVsbCkgPT4ge1xuICAgIHRoaXMuX3NldFJlc3VsdChTdGF0ZXMuUkVTT0xWRUQsIHZhbHVlKTtcbiAgfTtcblxuICAvKiogSlNEb2MgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfcmVqZWN0ID0gKHJlYXNvbj86IGFueSkgPT4ge1xuICAgIHRoaXMuX3NldFJlc3VsdChTdGF0ZXMuUkVKRUNURUQsIHJlYXNvbik7XG4gIH07XG5cbiAgLyoqIEpTRG9jICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3NldFJlc3VsdCA9IChzdGF0ZTogU3RhdGVzLCB2YWx1ZT86IFQgfCBQcm9taXNlTGlrZTxUPiB8IGFueSkgPT4ge1xuICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gU3RhdGVzLlBFTkRJTkcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNUaGVuYWJsZSh2YWx1ZSkpIHtcbiAgICAgIHZvaWQgKHZhbHVlIGFzIFByb21pc2VMaWtlPFQ+KS50aGVuKHRoaXMuX3Jlc29sdmUsIHRoaXMuX3JlamVjdCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuXG4gICAgdGhpcy5fZXhlY3V0ZUhhbmRsZXJzKCk7XG4gIH07XG5cbiAgLy8gVE9ETzogRklYTUVcbiAgLyoqIEpTRG9jICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2F0dGFjaEhhbmRsZXIgPSAoaGFuZGxlcjoge1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIGRvbmU6IGJvb2xlYW47XG4gICAgLyoqIEpTRG9jICovXG4gICAgb25mdWxmaWxsZWQ/KHZhbHVlOiBUKTogYW55O1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIG9ucmVqZWN0ZWQ/KHJlYXNvbjogYW55KTogYW55O1xuICB9KSA9PiB7XG4gICAgdGhpcy5faGFuZGxlcnMgPSB0aGlzLl9oYW5kbGVycy5jb25jYXQoaGFuZGxlcik7XG4gICAgdGhpcy5fZXhlY3V0ZUhhbmRsZXJzKCk7XG4gIH07XG5cbiAgLyoqIEpTRG9jICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2V4ZWN1dGVIYW5kbGVycyA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5fc3RhdGUgPT09IFN0YXRlcy5QRU5ESU5HKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2FjaGVkSGFuZGxlcnMgPSB0aGlzLl9oYW5kbGVycy5zbGljZSgpO1xuICAgIHRoaXMuX2hhbmRsZXJzID0gW107XG5cbiAgICBjYWNoZWRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgaWYgKGhhbmRsZXIuZG9uZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gU3RhdGVzLlJFU09MVkVEKSB7XG4gICAgICAgIGlmIChoYW5kbGVyLm9uZnVsZmlsbGVkKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgICAgICAgIGhhbmRsZXIub25mdWxmaWxsZWQoKHRoaXMuX3ZhbHVlIGFzIHVua25vd24pIGFzIGFueSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSBTdGF0ZXMuUkVKRUNURUQpIHtcbiAgICAgICAgaWYgKGhhbmRsZXIub25yZWplY3RlZCkge1xuICAgICAgICAgIGhhbmRsZXIub25yZWplY3RlZCh0aGlzLl92YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaGFuZGxlci5kb25lID0gdHJ1ZTtcbiAgICB9KTtcbiAgfTtcbn1cblxuZXhwb3J0IHsgU3luY1Byb21pc2UgfTtcbiIsICJpbXBvcnQgeyBTZW50cnlFcnJvciB9IGZyb20gJy4vZXJyb3InO1xuaW1wb3J0IHsgU3luY1Byb21pc2UgfSBmcm9tICcuL3N5bmNwcm9taXNlJztcblxuLyoqIEEgc2ltcGxlIHF1ZXVlIHRoYXQgaG9sZHMgcHJvbWlzZXMuICovXG5leHBvcnQgY2xhc3MgUHJvbWlzZUJ1ZmZlcjxUPiB7XG4gIC8qKiBJbnRlcm5hbCBzZXQgb2YgcXVldWVkIFByb21pc2VzICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2J1ZmZlcjogQXJyYXk8UHJvbWlzZUxpa2U8VD4+ID0gW107XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfbGltaXQ/OiBudW1iZXIpIHt9XG5cbiAgLyoqXG4gICAqIFNheXMgaWYgdGhlIGJ1ZmZlciBpcyByZWFkeSB0byB0YWtlIG1vcmUgcmVxdWVzdHNcbiAgICovXG4gIHB1YmxpYyBpc1JlYWR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9saW1pdCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMubGVuZ3RoKCkgPCB0aGlzLl9saW1pdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBwcm9taXNlIChyZXByZXNlbnRpbmcgYW4gaW4tZmxpZ2h0IGFjdGlvbikgdG8gdGhlIHF1ZXVlLCBhbmQgc2V0IGl0IHRvIHJlbW92ZSBpdHNlbGYgb24gZnVsZmlsbG1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB0YXNrUHJvZHVjZXIgQSBmdW5jdGlvbiBwcm9kdWNpbmcgYW55IFByb21pc2VMaWtlPFQ+OyBJbiBwcmV2aW91cyB2ZXJzaW9ucyB0aGlzIHVzZWQgdG8gYmUgYHRhc2s6XG4gICAqICAgICAgICBQcm9taXNlTGlrZTxUPmAsIGJ1dCB1bmRlciB0aGF0IG1vZGVsLCBQcm9taXNlcyB3ZXJlIGluc3RhbnRseSBjcmVhdGVkIG9uIHRoZSBjYWxsLXNpdGUgYW5kIHRoZWlyIGV4ZWN1dG9yXG4gICAqICAgICAgICBmdW5jdGlvbnMgdGhlcmVmb3JlIHJhbiBpbW1lZGlhdGVseS4gVGh1cywgZXZlbiBpZiB0aGUgYnVmZmVyIHdhcyBmdWxsLCB0aGUgYWN0aW9uIHN0aWxsIGhhcHBlbmVkLiBCeVxuICAgKiAgICAgICAgcmVxdWlyaW5nIHRoZSBwcm9taXNlIHRvIGJlIHdyYXBwZWQgaW4gYSBmdW5jdGlvbiwgd2UgY2FuIGRlZmVyIHByb21pc2UgY3JlYXRpb24gdW50aWwgYWZ0ZXIgdGhlIGJ1ZmZlclxuICAgKiAgICAgICAgbGltaXQgY2hlY2suXG4gICAqIEByZXR1cm5zIFRoZSBvcmlnaW5hbCBwcm9taXNlLlxuICAgKi9cbiAgcHVibGljIGFkZCh0YXNrUHJvZHVjZXI6ICgpID0+IFByb21pc2VMaWtlPFQ+KTogUHJvbWlzZUxpa2U8VD4ge1xuICAgIGlmICghdGhpcy5pc1JlYWR5KCkpIHtcbiAgICAgIHJldHVybiBTeW5jUHJvbWlzZS5yZWplY3QobmV3IFNlbnRyeUVycm9yKCdOb3QgYWRkaW5nIFByb21pc2UgZHVlIHRvIGJ1ZmZlciBsaW1pdCByZWFjaGVkLicpKTtcbiAgICB9XG5cbiAgICAvLyBzdGFydCB0aGUgdGFzayBhbmQgYWRkIGl0cyBwcm9taXNlIHRvIHRoZSBxdWV1ZVxuICAgIGNvbnN0IHRhc2sgPSB0YXNrUHJvZHVjZXIoKTtcbiAgICBpZiAodGhpcy5fYnVmZmVyLmluZGV4T2YodGFzaykgPT09IC0xKSB7XG4gICAgICB0aGlzLl9idWZmZXIucHVzaCh0YXNrKTtcbiAgICB9XG4gICAgdm9pZCB0YXNrXG4gICAgICAudGhlbigoKSA9PiB0aGlzLnJlbW92ZSh0YXNrKSlcbiAgICAgIC8vIFVzZSBgdGhlbihudWxsLCByZWplY3Rpb25IYW5kbGVyKWAgcmF0aGVyIHRoYW4gYGNhdGNoKHJlamVjdGlvbkhhbmRsZXIpYCBzbyB0aGF0IHdlIGNhbiB1c2UgYFByb21pc2VMaWtlYFxuICAgICAgLy8gcmF0aGVyIHRoYW4gYFByb21pc2VgLiBgUHJvbWlzZUxpa2VgIGRvZXNuJ3QgaGF2ZSBhIGAuY2F0Y2hgIG1ldGhvZCwgbWFraW5nIGl0cyBwb2x5ZmlsbCBzbWFsbGVyLiAoRVM1IGRpZG4ndFxuICAgICAgLy8gaGF2ZSBwcm9taXNlcywgc28gVFMgaGFzIHRvIHBvbHlmaWxsIHdoZW4gZG93bi1jb21waWxpbmcuKVxuICAgICAgLnRoZW4obnVsbCwgKCkgPT5cbiAgICAgICAgdGhpcy5yZW1vdmUodGFzaykudGhlbihudWxsLCAoKSA9PiB7XG4gICAgICAgICAgLy8gV2UgaGF2ZSB0byBhZGQgYW5vdGhlciBjYXRjaCBoZXJlIGJlY2F1c2UgYHRoaXMucmVtb3ZlKClgIHN0YXJ0cyBhIG5ldyBwcm9taXNlIGNoYWluLlxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgcmV0dXJuIHRhc2s7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgcHJvbWlzZSBmcm9tIHRoZSBxdWV1ZS5cbiAgICpcbiAgICogQHBhcmFtIHRhc2sgQ2FuIGJlIGFueSBQcm9taXNlTGlrZTxUPlxuICAgKiBAcmV0dXJucyBSZW1vdmVkIHByb21pc2UuXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlKHRhc2s6IFByb21pc2VMaWtlPFQ+KTogUHJvbWlzZUxpa2U8VD4ge1xuICAgIGNvbnN0IHJlbW92ZWRUYXNrID0gdGhpcy5fYnVmZmVyLnNwbGljZSh0aGlzLl9idWZmZXIuaW5kZXhPZih0YXNrKSwgMSlbMF07XG4gICAgcmV0dXJuIHJlbW92ZWRUYXNrO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVucmVzb2x2ZWQgcHJvbWlzZXMgaW4gdGhlIHF1ZXVlLlxuICAgKi9cbiAgcHVibGljIGxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9idWZmZXIubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhaXQgZm9yIGFsbCBwcm9taXNlcyBpbiB0aGUgcXVldWUgdG8gcmVzb2x2ZSBvciBmb3IgdGltZW91dCB0byBleHBpcmUsIHdoaWNoZXZlciBjb21lcyBmaXJzdC5cbiAgICpcbiAgICogQHBhcmFtIHRpbWVvdXQgVGhlIHRpbWUsIGluIG1zLCBhZnRlciB3aGljaCB0byByZXNvbHZlIHRvIGBmYWxzZWAgaWYgdGhlIHF1ZXVlIGlzIHN0aWxsIG5vbi1lbXB0eS4gUGFzc2luZyBgMGAgKG9yXG4gICAqIG5vdCBwYXNzaW5nIGFueXRoaW5nKSB3aWxsIG1ha2UgdGhlIHByb21pc2Ugd2FpdCBhcyBsb25nIGFzIGl0IHRha2VzIGZvciB0aGUgcXVldWUgdG8gZHJhaW4gYmVmb3JlIHJlc29sdmluZyB0b1xuICAgKiBgdHJ1ZWAuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCB3aWxsIHJlc29sdmUgdG8gYHRydWVgIGlmIHRoZSBxdWV1ZSBpcyBhbHJlYWR5IGVtcHR5IG9yIGRyYWlucyBiZWZvcmUgdGhlIHRpbWVvdXQsIGFuZFxuICAgKiBgZmFsc2VgIG90aGVyd2lzZVxuICAgKi9cbiAgcHVibGljIGRyYWluKHRpbWVvdXQ/OiBudW1iZXIpOiBQcm9taXNlTGlrZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZTxib29sZWFuPihyZXNvbHZlID0+IHtcbiAgICAgIC8vIHdhaXQgZm9yIGB0aW1lb3V0YCBtcyBhbmQgdGhlbiByZXNvbHZlIHRvIGBmYWxzZWAgKGlmIG5vdCBjYW5jZWxsZWQgZmlyc3QpXG4gICAgICBjb25zdCBjYXB0dXJlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRpbWVvdXQgJiYgdGltZW91dCA+IDApIHtcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSwgdGltZW91dCk7XG5cbiAgICAgIC8vIGlmIGFsbCBwcm9taXNlcyByZXNvbHZlIGluIHRpbWUsIGNhbmNlbCB0aGUgdGltZXIgYW5kIHJlc29sdmUgdG8gYHRydWVgXG4gICAgICB2b2lkIFN5bmNQcm9taXNlLmFsbCh0aGlzLl9idWZmZXIpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoY2FwdHVyZWRTZXRUaW1lb3V0KTtcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICB9KVxuICAgICAgICAudGhlbihudWxsLCAoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QgfSBmcm9tICcuL2dsb2JhbCc7XG5pbXBvcnQgeyBkeW5hbWljUmVxdWlyZSwgaXNOb2RlRW52IH0gZnJvbSAnLi9ub2RlJztcblxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBjYW4gcmV0dXJuIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBpbiBzZWNvbmRzIHNpbmNlIHRoZSBVTklYIGVwb2NoLlxuICovXG5pbnRlcmZhY2UgVGltZXN0YW1wU291cmNlIHtcbiAgbm93U2Vjb25kcygpOiBudW1iZXI7XG59XG5cbi8qKlxuICogQSBUaW1lc3RhbXBTb3VyY2UgaW1wbGVtZW50YXRpb24gZm9yIGVudmlyb25tZW50cyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZSBQZXJmb3JtYW5jZSBXZWIgQVBJIG5hdGl2ZWx5LlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIFRpbWVzdGFtcFNvdXJjZSBkb2VzIG5vdCB1c2UgYSBtb25vdG9uaWMgY2xvY2suIEEgY2FsbCB0byBgbm93U2Vjb25kc2AgbWF5IHJldHVybiBhIHRpbWVzdGFtcCBlYXJsaWVyXG4gKiB0aGFuIGEgcHJldmlvdXNseSByZXR1cm5lZCB2YWx1ZS4gV2UgZG8gbm90IHRyeSB0byBlbXVsYXRlIGEgbW9ub3RvbmljIGJlaGF2aW9yIGluIG9yZGVyIHRvIGZhY2lsaXRhdGUgZGVidWdnaW5nLiBJdFxuICogaXMgbW9yZSBvYnZpb3VzIHRvIGV4cGxhaW4gXCJ3aHkgZG9lcyBteSBzcGFuIGhhdmUgbmVnYXRpdmUgZHVyYXRpb25cIiB0aGFuIFwid2h5IG15IHNwYW5zIGhhdmUgemVybyBkdXJhdGlvblwiLlxuICovXG5jb25zdCBkYXRlVGltZXN0YW1wU291cmNlOiBUaW1lc3RhbXBTb3VyY2UgPSB7XG4gIG5vd1NlY29uZHM6ICgpID0+IERhdGUubm93KCkgLyAxMDAwLFxufTtcblxuLyoqXG4gKiBBIHBhcnRpYWwgZGVmaW5pdGlvbiBvZiB0aGUgW1BlcmZvcm1hbmNlIFdlYiBBUElde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9QZXJmb3JtYW5jZX1cbiAqIGZvciBhY2Nlc3NpbmcgYSBoaWdoIHJlc29sdXRpb24gbW9ub3RvbmljIGNsb2NrLlxuICovXG5pbnRlcmZhY2UgUGVyZm9ybWFuY2Uge1xuICAvKipcbiAgICogVGhlIG1pbGxpc2Vjb25kIHRpbWVzdGFtcCBhdCB3aGljaCBtZWFzdXJlbWVudCBiZWdhbiwgbWVhc3VyZWQgaW4gVW5peCB0aW1lLlxuICAgKi9cbiAgdGltZU9yaWdpbjogbnVtYmVyO1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBtaWxsaXNlY29uZCB0aW1lc3RhbXAsIHdoZXJlIDAgcmVwcmVzZW50cyB0aGUgc3RhcnQgb2YgbWVhc3VyZW1lbnQuXG4gICAqL1xuICBub3coKTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgbmF0aXZlIFBlcmZvcm1hbmNlIEFQSSBicm93c2VyIGltcGxlbWVudGF0aW9uLCBvciB1bmRlZmluZWQgZm9yIGJyb3dzZXJzIHRoYXQgZG8gbm90XG4gKiBzdXBwb3J0IHRoZSBBUEkuXG4gKlxuICogV3JhcHBpbmcgdGhlIG5hdGl2ZSBBUEkgd29ya3MgYXJvdW5kIGRpZmZlcmVuY2VzIGluIGJlaGF2aW9yIGZyb20gZGlmZmVyZW50IGJyb3dzZXJzLlxuICovXG5mdW5jdGlvbiBnZXRCcm93c2VyUGVyZm9ybWFuY2UoKTogUGVyZm9ybWFuY2UgfCB1bmRlZmluZWQge1xuICBjb25zdCB7IHBlcmZvcm1hbmNlIH0gPSBnZXRHbG9iYWxPYmplY3Q8V2luZG93PigpO1xuICBpZiAoIXBlcmZvcm1hbmNlIHx8ICFwZXJmb3JtYW5jZS5ub3cpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gUmVwbGFjZSBwZXJmb3JtYW5jZS50aW1lT3JpZ2luIHdpdGggb3VyIG93biB0aW1lT3JpZ2luIGJhc2VkIG9uIERhdGUubm93KCkuXG4gIC8vXG4gIC8vIFRoaXMgaXMgYSBwYXJ0aWFsIHdvcmthcm91bmQgZm9yIGJyb3dzZXJzIHJlcG9ydGluZyBwZXJmb3JtYW5jZS50aW1lT3JpZ2luIHN1Y2ggdGhhdCBwZXJmb3JtYW5jZS50aW1lT3JpZ2luICtcbiAgLy8gcGVyZm9ybWFuY2Uubm93KCkgZ2l2ZXMgYSBkYXRlIGFyYml0cmFyaWx5IGluIHRoZSBwYXN0LlxuICAvL1xuICAvLyBBZGRpdGlvbmFsbHksIGNvbXB1dGluZyB0aW1lT3JpZ2luIGluIHRoaXMgd2F5IGZpbGxzIHRoZSBnYXAgZm9yIGJyb3dzZXJzIHdoZXJlIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gaXNcbiAgLy8gdW5kZWZpbmVkLlxuICAvL1xuICAvLyBUaGUgYXNzdW1wdGlvbiB0aGF0IHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gKyBwZXJmb3JtYW5jZS5ub3coKSB+PSBEYXRlLm5vdygpIGlzIGZsYXdlZCwgYnV0IHdlIGRlcGVuZCBvbiBpdCB0b1xuICAvLyBpbnRlcmFjdCB3aXRoIGRhdGEgY29taW5nIG91dCBvZiBwZXJmb3JtYW5jZSBlbnRyaWVzLlxuICAvL1xuICAvLyBOb3RlIHRoYXQgZGVzcGl0ZSByZWNvbW1lbmRhdGlvbnMgYWdhaW5zdCBpdCBpbiB0aGUgc3BlYywgYnJvd3NlcnMgaW1wbGVtZW50IHRoZSBQZXJmb3JtYW5jZSBBUEkgd2l0aCBhIGNsb2NrIHRoYXRcbiAgLy8gbWlnaHQgc3RvcCB3aGVuIHRoZSBjb21wdXRlciBpcyBhc2xlZXAgKGFuZCBwZXJoYXBzIHVuZGVyIG90aGVyIGNpcmN1bXN0YW5jZXMpLiBTdWNoIGJlaGF2aW9yIGNhdXNlc1xuICAvLyBwZXJmb3JtYW5jZS50aW1lT3JpZ2luICsgcGVyZm9ybWFuY2Uubm93KCkgdG8gaGF2ZSBhbiBhcmJpdHJhcnkgc2tldyBvdmVyIERhdGUubm93KCkuIEluIGxhcHRvcCBjb21wdXRlcnMsIHdlIGhhdmVcbiAgLy8gb2JzZXJ2ZWQgc2tld3MgdGhhdCBjYW4gYmUgYXMgbG9uZyBhcyBkYXlzLCB3ZWVrcyBvciBtb250aHMuXG4gIC8vXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0L2lzc3Vlcy8yNTkwLlxuICAvL1xuICAvLyBCVUc6IGRlc3BpdGUgb3VyIGJlc3QgaW50ZW50aW9ucywgdGhpcyB3b3JrYXJvdW5kIGhhcyBpdHMgbGltaXRhdGlvbnMuIEl0IG1vc3RseSBhZGRyZXNzZXMgdGltaW5ncyBvZiBwYWdlbG9hZFxuICAvLyB0cmFuc2FjdGlvbnMsIGJ1dCBpZ25vcmVzIHRoZSBza2V3IGJ1aWx0IHVwIG92ZXIgdGltZSB0aGF0IGNhbiBhdmVyc2VseSBhZmZlY3QgdGltZXN0YW1wcyBvZiBuYXZpZ2F0aW9uXG4gIC8vIHRyYW5zYWN0aW9ucyBvZiBsb25nLWxpdmVkIHdlYiBwYWdlcy5cbiAgY29uc3QgdGltZU9yaWdpbiA9IERhdGUubm93KCkgLSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICByZXR1cm4ge1xuICAgIG5vdzogKCkgPT4gcGVyZm9ybWFuY2Uubm93KCksXG4gICAgdGltZU9yaWdpbixcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBuYXRpdmUgUGVyZm9ybWFuY2UgQVBJIGltcGxlbWVudGF0aW9uIGZyb20gTm9kZS5qcy4gUmV0dXJucyB1bmRlZmluZWQgaW4gb2xkIE5vZGUuanMgdmVyc2lvbnMgdGhhdCBkb24ndFxuICogaW1wbGVtZW50IHRoZSBBUEkuXG4gKi9cbmZ1bmN0aW9uIGdldE5vZGVQZXJmb3JtYW5jZSgpOiBQZXJmb3JtYW5jZSB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGVyZkhvb2tzID0gZHluYW1pY1JlcXVpcmUobW9kdWxlLCAncGVyZl9ob29rcycpIGFzIHsgcGVyZm9ybWFuY2U6IFBlcmZvcm1hbmNlIH07XG4gICAgcmV0dXJuIHBlcmZIb29rcy5wZXJmb3JtYW5jZTtcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgUGVyZm9ybWFuY2UgQVBJIGltcGxlbWVudGF0aW9uIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybSwgaWYgYXZhaWxhYmxlLlxuICovXG5jb25zdCBwbGF0Zm9ybVBlcmZvcm1hbmNlOiBQZXJmb3JtYW5jZSB8IHVuZGVmaW5lZCA9IGlzTm9kZUVudigpID8gZ2V0Tm9kZVBlcmZvcm1hbmNlKCkgOiBnZXRCcm93c2VyUGVyZm9ybWFuY2UoKTtcblxuY29uc3QgdGltZXN0YW1wU291cmNlOiBUaW1lc3RhbXBTb3VyY2UgPVxuICBwbGF0Zm9ybVBlcmZvcm1hbmNlID09PSB1bmRlZmluZWRcbiAgICA/IGRhdGVUaW1lc3RhbXBTb3VyY2VcbiAgICA6IHtcbiAgICAgICAgbm93U2Vjb25kczogKCkgPT4gKHBsYXRmb3JtUGVyZm9ybWFuY2UudGltZU9yaWdpbiArIHBsYXRmb3JtUGVyZm9ybWFuY2Uubm93KCkpIC8gMTAwMCxcbiAgICAgIH07XG5cbi8qKlxuICogUmV0dXJucyBhIHRpbWVzdGFtcCBpbiBzZWNvbmRzIHNpbmNlIHRoZSBVTklYIGVwb2NoIHVzaW5nIHRoZSBEYXRlIEFQSS5cbiAqL1xuZXhwb3J0IGNvbnN0IGRhdGVUaW1lc3RhbXBJblNlY29uZHM6ICgpID0+IG51bWJlciA9IGRhdGVUaW1lc3RhbXBTb3VyY2Uubm93U2Vjb25kcy5iaW5kKGRhdGVUaW1lc3RhbXBTb3VyY2UpO1xuXG4vKipcbiAqIFJldHVybnMgYSB0aW1lc3RhbXAgaW4gc2Vjb25kcyBzaW5jZSB0aGUgVU5JWCBlcG9jaCB1c2luZyBlaXRoZXIgdGhlIFBlcmZvcm1hbmNlIG9yIERhdGUgQVBJcywgZGVwZW5kaW5nIG9uIHRoZVxuICogYXZhaWxhYmlsaXR5IG9mIHRoZSBQZXJmb3JtYW5jZSBBUEkuXG4gKlxuICogU2VlIGB1c2luZ1BlcmZvcm1hbmNlQVBJYCB0byB0ZXN0IHdoZXRoZXIgdGhlIFBlcmZvcm1hbmNlIEFQSSBpcyB1c2VkLlxuICpcbiAqIEJVRzogTm90ZSB0aGF0IGJlY2F1c2Ugb2YgaG93IGJyb3dzZXJzIGltcGxlbWVudCB0aGUgUGVyZm9ybWFuY2UgQVBJLCB0aGUgY2xvY2sgbWlnaHQgc3RvcCB3aGVuIHRoZSBjb21wdXRlciBpc1xuICogYXNsZWVwLiBUaGlzIGNyZWF0ZXMgYSBza2V3IGJldHdlZW4gYGRhdGVUaW1lc3RhbXBJblNlY29uZHNgIGFuZCBgdGltZXN0YW1wSW5TZWNvbmRzYC4gVGhlXG4gKiBza2V3IGNhbiBncm93IHRvIGFyYml0cmFyeSBhbW91bnRzIGxpa2UgZGF5cywgd2Vla3Mgb3IgbW9udGhzLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzI1OTAuXG4gKi9cbmV4cG9ydCBjb25zdCB0aW1lc3RhbXBJblNlY29uZHM6ICgpID0+IG51bWJlciA9IHRpbWVzdGFtcFNvdXJjZS5ub3dTZWNvbmRzLmJpbmQodGltZXN0YW1wU291cmNlKTtcblxuLy8gUmUtZXhwb3J0ZWQgd2l0aCBhbiBvbGQgbmFtZSBmb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkuXG5leHBvcnQgY29uc3QgdGltZXN0YW1wV2l0aE1zID0gdGltZXN0YW1wSW5TZWNvbmRzO1xuXG4vKipcbiAqIEEgYm9vbGVhbiB0aGF0IGlzIHRydWUgd2hlbiB0aW1lc3RhbXBJblNlY29uZHMgdXNlcyB0aGUgUGVyZm9ybWFuY2UgQVBJIHRvIHByb2R1Y2UgbW9ub3RvbmljIHRpbWVzdGFtcHMuXG4gKi9cbmV4cG9ydCBjb25zdCB1c2luZ1BlcmZvcm1hbmNlQVBJID0gcGxhdGZvcm1QZXJmb3JtYW5jZSAhPT0gdW5kZWZpbmVkO1xuXG4vKipcbiAqIEludGVybmFsIGhlbHBlciB0byBzdG9yZSB3aGF0IGlzIHRoZSBzb3VyY2Ugb2YgYnJvd3NlclBlcmZvcm1hbmNlVGltZU9yaWdpbiBiZWxvdy4gRm9yIGRlYnVnZ2luZyBvbmx5LlxuICovXG5leHBvcnQgbGV0IF9icm93c2VyUGVyZm9ybWFuY2VUaW1lT3JpZ2luTW9kZTogc3RyaW5nO1xuXG4vKipcbiAqIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBVTklYIGVwb2NoLiBUaGlzIHZhbHVlIGlzIG9ubHkgdXNhYmxlIGluIGEgYnJvd3NlciwgYW5kIG9ubHkgd2hlbiB0aGVcbiAqIHBlcmZvcm1hbmNlIEFQSSBpcyBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBjb25zdCBicm93c2VyUGVyZm9ybWFuY2VUaW1lT3JpZ2luID0gKCgpOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICAvLyBVbmZvcnR1bmF0ZWx5IGJyb3dzZXJzIG1heSByZXBvcnQgYW4gaW5hY2N1cmF0ZSB0aW1lIG9yaWdpbiBkYXRhLCB0aHJvdWdoIGVpdGhlciBwZXJmb3JtYW5jZS50aW1lT3JpZ2luIG9yXG4gIC8vIHBlcmZvcm1hbmNlLnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQsIHdoaWNoIHJlc3VsdHMgaW4gcG9vciByZXN1bHRzIGluIHBlcmZvcm1hbmNlIGRhdGEuIFdlIG9ubHkgdHJlYXQgdGltZSBvcmlnaW5cbiAgLy8gZGF0YSBhcyByZWxpYWJsZSBpZiB0aGV5IGFyZSB3aXRoaW4gYSByZWFzb25hYmxlIHRocmVzaG9sZCBvZiB0aGUgY3VycmVudCB0aW1lLlxuXG4gIGNvbnN0IHsgcGVyZm9ybWFuY2UgfSA9IGdldEdsb2JhbE9iamVjdDxXaW5kb3c+KCk7XG4gIGlmICghcGVyZm9ybWFuY2UgfHwgIXBlcmZvcm1hbmNlLm5vdykge1xuICAgIF9icm93c2VyUGVyZm9ybWFuY2VUaW1lT3JpZ2luTW9kZSA9ICdub25lJztcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgdGhyZXNob2xkID0gMzYwMCAqIDEwMDA7XG4gIGNvbnN0IHBlcmZvcm1hbmNlTm93ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gIGNvbnN0IGRhdGVOb3cgPSBEYXRlLm5vdygpO1xuXG4gIC8vIGlmIHRpbWVPcmlnaW4gaXNuJ3QgYXZhaWxhYmxlIHNldCBkZWx0YSB0byB0aHJlc2hvbGQgc28gaXQgaXNuJ3QgdXNlZFxuICBjb25zdCB0aW1lT3JpZ2luRGVsdGEgPSBwZXJmb3JtYW5jZS50aW1lT3JpZ2luXG4gICAgPyBNYXRoLmFicyhwZXJmb3JtYW5jZS50aW1lT3JpZ2luICsgcGVyZm9ybWFuY2VOb3cgLSBkYXRlTm93KVxuICAgIDogdGhyZXNob2xkO1xuICBjb25zdCB0aW1lT3JpZ2luSXNSZWxpYWJsZSA9IHRpbWVPcmlnaW5EZWx0YSA8IHRocmVzaG9sZDtcblxuICAvLyBXaGlsZSBwZXJmb3JtYW5jZS50aW1pbmcubmF2aWdhdGlvblN0YXJ0IGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgcGVyZm9ybWFuY2UudGltZU9yaWdpbiwgcGVyZm9ybWFuY2UudGltZU9yaWdpblxuICAvLyBpcyBub3QgYXMgd2lkZWx5IHN1cHBvcnRlZC4gTmFtZWx5LCBwZXJmb3JtYW5jZS50aW1lT3JpZ2luIGlzIHVuZGVmaW5lZCBpbiBTYWZhcmkgYXMgb2Ygd3JpdGluZy5cbiAgLy8gQWxzbyBhcyBvZiB3cml0aW5nLCBwZXJmb3JtYW5jZS50aW1pbmcgaXMgbm90IGF2YWlsYWJsZSBpbiBXZWIgV29ya2VycyBpbiBtYWluc3RyZWFtIGJyb3dzZXJzLCBzbyBpdCBpcyBub3QgYWx3YXlzXG4gIC8vIGEgdmFsaWQgZmFsbGJhY2suIEluIHRoZSBhYnNlbmNlIG9mIGFuIGluaXRpYWwgdGltZSBwcm92aWRlZCBieSB0aGUgYnJvd3NlciwgZmFsbGJhY2sgdG8gdGhlIGN1cnJlbnQgdGltZSBmcm9tIHRoZVxuICAvLyBEYXRlIEFQSS5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG4gIGNvbnN0IG5hdmlnYXRpb25TdGFydCA9IHBlcmZvcm1hbmNlLnRpbWluZyAmJiBwZXJmb3JtYW5jZS50aW1pbmcubmF2aWdhdGlvblN0YXJ0O1xuICBjb25zdCBoYXNOYXZpZ2F0aW9uU3RhcnQgPSB0eXBlb2YgbmF2aWdhdGlvblN0YXJ0ID09PSAnbnVtYmVyJztcbiAgLy8gaWYgbmF2aWdhdGlvblN0YXJ0IGlzbid0IGF2YWlsYWJsZSBzZXQgZGVsdGEgdG8gdGhyZXNob2xkIHNvIGl0IGlzbid0IHVzZWRcbiAgY29uc3QgbmF2aWdhdGlvblN0YXJ0RGVsdGEgPSBoYXNOYXZpZ2F0aW9uU3RhcnQgPyBNYXRoLmFicyhuYXZpZ2F0aW9uU3RhcnQgKyBwZXJmb3JtYW5jZU5vdyAtIGRhdGVOb3cpIDogdGhyZXNob2xkO1xuICBjb25zdCBuYXZpZ2F0aW9uU3RhcnRJc1JlbGlhYmxlID0gbmF2aWdhdGlvblN0YXJ0RGVsdGEgPCB0aHJlc2hvbGQ7XG5cbiAgaWYgKHRpbWVPcmlnaW5Jc1JlbGlhYmxlIHx8IG5hdmlnYXRpb25TdGFydElzUmVsaWFibGUpIHtcbiAgICAvLyBVc2UgdGhlIG1vcmUgcmVsaWFibGUgdGltZSBvcmlnaW5cbiAgICBpZiAodGltZU9yaWdpbkRlbHRhIDw9IG5hdmlnYXRpb25TdGFydERlbHRhKSB7XG4gICAgICBfYnJvd3NlclBlcmZvcm1hbmNlVGltZU9yaWdpbk1vZGUgPSAndGltZU9yaWdpbic7XG4gICAgICByZXR1cm4gcGVyZm9ybWFuY2UudGltZU9yaWdpbjtcbiAgICB9IGVsc2Uge1xuICAgICAgX2Jyb3dzZXJQZXJmb3JtYW5jZVRpbWVPcmlnaW5Nb2RlID0gJ25hdmlnYXRpb25TdGFydCc7XG4gICAgICByZXR1cm4gbmF2aWdhdGlvblN0YXJ0O1xuICAgIH1cbiAgfVxuXG4gIC8vIEVpdGhlciBib3RoIHRpbWVPcmlnaW4gYW5kIG5hdmlnYXRpb25TdGFydCBhcmUgc2tld2VkIG9yIG5laXRoZXIgaXMgYXZhaWxhYmxlLCBmYWxsYmFjayB0byBEYXRlLlxuICBfYnJvd3NlclBlcmZvcm1hbmNlVGltZU9yaWdpbk1vZGUgPSAnZGF0ZU5vdyc7XG4gIHJldHVybiBkYXRlTm93O1xufSkoKTtcbiIsICJleHBvcnQgKiBmcm9tICcuL2FzeW5jJztcbmV4cG9ydCAqIGZyb20gJy4vYnJvd3Nlcic7XG5leHBvcnQgKiBmcm9tICcuL2Rzbic7XG5leHBvcnQgKiBmcm9tICcuL2Vycm9yJztcbmV4cG9ydCAqIGZyb20gJy4vZ2xvYmFsJztcbmV4cG9ydCAqIGZyb20gJy4vaW5zdHJ1bWVudCc7XG5leHBvcnQgKiBmcm9tICcuL2lzJztcbmV4cG9ydCAqIGZyb20gJy4vbG9nZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vbWVtbyc7XG5leHBvcnQgKiBmcm9tICcuL21pc2MnO1xuZXhwb3J0ICogZnJvbSAnLi9ub2RlJztcbmV4cG9ydCAqIGZyb20gJy4vb2JqZWN0JztcbmV4cG9ydCAqIGZyb20gJy4vcGF0aCc7XG5leHBvcnQgKiBmcm9tICcuL3Byb21pc2VidWZmZXInO1xuZXhwb3J0ICogZnJvbSAnLi9zdGFja3RyYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc3RyaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vc3VwcG9ydHMnO1xuZXhwb3J0ICogZnJvbSAnLi9zeW5jcHJvbWlzZSc7XG5leHBvcnQgKiBmcm9tICcuL3RpbWUnO1xuIiwgIi8qIGVzbGludC1kaXNhYmxlIG1heC1saW5lcyAqL1xuaW1wb3J0IHtcbiAgQnJlYWRjcnVtYixcbiAgQ2FwdHVyZUNvbnRleHQsXG4gIENvbnRleHQsXG4gIENvbnRleHRzLFxuICBFdmVudCxcbiAgRXZlbnRIaW50LFxuICBFdmVudFByb2Nlc3NvcixcbiAgRXh0cmEsXG4gIEV4dHJhcyxcbiAgUHJpbWl0aXZlLFxuICBSZXF1ZXN0U2Vzc2lvbixcbiAgU2NvcGUgYXMgU2NvcGVJbnRlcmZhY2UsXG4gIFNjb3BlQ29udGV4dCxcbiAgU2V2ZXJpdHksXG4gIFNwYW4sXG4gIFRyYW5zYWN0aW9uLFxuICBVc2VyLFxufSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGRhdGVUaW1lc3RhbXBJblNlY29uZHMsIGdldEdsb2JhbE9iamVjdCwgaXNQbGFpbk9iamVjdCwgaXNUaGVuYWJsZSwgU3luY1Byb21pc2UgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW1wb3J0IHsgU2Vzc2lvbiB9IGZyb20gJy4vc2Vzc2lvbic7XG5cbi8qKlxuICogQWJzb2x1dGUgbWF4aW11bSBudW1iZXIgb2YgYnJlYWRjcnVtYnMgYWRkZWQgdG8gYW4gZXZlbnQuXG4gKiBUaGUgYG1heEJyZWFkY3J1bWJzYCBvcHRpb24gY2Fubm90IGJlIGhpZ2hlciB0aGFuIHRoaXMgdmFsdWUuXG4gKi9cbmNvbnN0IE1BWF9CUkVBRENSVU1CUyA9IDEwMDtcblxuLyoqXG4gKiBIb2xkcyBhZGRpdGlvbmFsIGV2ZW50IGluZm9ybWF0aW9uLiB7QGxpbmsgU2NvcGUuYXBwbHlUb0V2ZW50fSB3aWxsIGJlXG4gKiBjYWxsZWQgYnkgdGhlIGNsaWVudCBiZWZvcmUgYW4gZXZlbnQgd2lsbCBiZSBzZW50LlxuICovXG5leHBvcnQgY2xhc3MgU2NvcGUgaW1wbGVtZW50cyBTY29wZUludGVyZmFjZSB7XG4gIC8qKiBGbGFnIGlmIG5vdGlmeWluZyBpcyBoYXBwZW5pbmcuICovXG4gIHByb3RlY3RlZCBfbm90aWZ5aW5nTGlzdGVuZXJzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIENhbGxiYWNrIGZvciBjbGllbnQgdG8gcmVjZWl2ZSBzY29wZSBjaGFuZ2VzLiAqL1xuICBwcm90ZWN0ZWQgX3Njb3BlTGlzdGVuZXJzOiBBcnJheTwoc2NvcGU6IFNjb3BlKSA9PiB2b2lkPiA9IFtdO1xuXG4gIC8qKiBDYWxsYmFjayBsaXN0IHRoYXQgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIge0BsaW5rIGFwcGx5VG9FdmVudH0uICovXG4gIHByb3RlY3RlZCBfZXZlbnRQcm9jZXNzb3JzOiBFdmVudFByb2Nlc3NvcltdID0gW107XG5cbiAgLyoqIEFycmF5IG9mIGJyZWFkY3J1bWJzLiAqL1xuICBwcm90ZWN0ZWQgX2JyZWFkY3J1bWJzOiBCcmVhZGNydW1iW10gPSBbXTtcblxuICAvKiogVXNlciAqL1xuICBwcm90ZWN0ZWQgX3VzZXI6IFVzZXIgPSB7fTtcblxuICAvKiogVGFncyAqL1xuICBwcm90ZWN0ZWQgX3RhZ3M6IHsgW2tleTogc3RyaW5nXTogUHJpbWl0aXZlIH0gPSB7fTtcblxuICAvKiogRXh0cmEgKi9cbiAgcHJvdGVjdGVkIF9leHRyYTogRXh0cmFzID0ge307XG5cbiAgLyoqIENvbnRleHRzICovXG4gIHByb3RlY3RlZCBfY29udGV4dHM6IENvbnRleHRzID0ge307XG5cbiAgLyoqIEZpbmdlcnByaW50ICovXG4gIHByb3RlY3RlZCBfZmluZ2VycHJpbnQ/OiBzdHJpbmdbXTtcblxuICAvKiogU2V2ZXJpdHkgKi9cbiAgcHJvdGVjdGVkIF9sZXZlbD86IFNldmVyaXR5O1xuXG4gIC8qKiBUcmFuc2FjdGlvbiBOYW1lICovXG4gIHByb3RlY3RlZCBfdHJhbnNhY3Rpb25OYW1lPzogc3RyaW5nO1xuXG4gIC8qKiBTcGFuICovXG4gIHByb3RlY3RlZCBfc3Bhbj86IFNwYW47XG5cbiAgLyoqIFNlc3Npb24gKi9cbiAgcHJvdGVjdGVkIF9zZXNzaW9uPzogU2Vzc2lvbjtcblxuICAvKiogUmVxdWVzdCBNb2RlIFNlc3Npb24gU3RhdHVzICovXG4gIHByb3RlY3RlZCBfcmVxdWVzdFNlc3Npb24/OiBSZXF1ZXN0U2Vzc2lvbjtcblxuICAvKipcbiAgICogSW5oZXJpdCB2YWx1ZXMgZnJvbSB0aGUgcGFyZW50IHNjb3BlLlxuICAgKiBAcGFyYW0gc2NvcGUgdG8gY2xvbmUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNsb25lKHNjb3BlPzogU2NvcGUpOiBTY29wZSB7XG4gICAgY29uc3QgbmV3U2NvcGUgPSBuZXcgU2NvcGUoKTtcbiAgICBpZiAoc2NvcGUpIHtcbiAgICAgIG5ld1Njb3BlLl9icmVhZGNydW1icyA9IFsuLi5zY29wZS5fYnJlYWRjcnVtYnNdO1xuICAgICAgbmV3U2NvcGUuX3RhZ3MgPSB7IC4uLnNjb3BlLl90YWdzIH07XG4gICAgICBuZXdTY29wZS5fZXh0cmEgPSB7IC4uLnNjb3BlLl9leHRyYSB9O1xuICAgICAgbmV3U2NvcGUuX2NvbnRleHRzID0geyAuLi5zY29wZS5fY29udGV4dHMgfTtcbiAgICAgIG5ld1Njb3BlLl91c2VyID0gc2NvcGUuX3VzZXI7XG4gICAgICBuZXdTY29wZS5fbGV2ZWwgPSBzY29wZS5fbGV2ZWw7XG4gICAgICBuZXdTY29wZS5fc3BhbiA9IHNjb3BlLl9zcGFuO1xuICAgICAgbmV3U2NvcGUuX3Nlc3Npb24gPSBzY29wZS5fc2Vzc2lvbjtcbiAgICAgIG5ld1Njb3BlLl90cmFuc2FjdGlvbk5hbWUgPSBzY29wZS5fdHJhbnNhY3Rpb25OYW1lO1xuICAgICAgbmV3U2NvcGUuX2ZpbmdlcnByaW50ID0gc2NvcGUuX2ZpbmdlcnByaW50O1xuICAgICAgbmV3U2NvcGUuX2V2ZW50UHJvY2Vzc29ycyA9IFsuLi5zY29wZS5fZXZlbnRQcm9jZXNzb3JzXTtcbiAgICAgIG5ld1Njb3BlLl9yZXF1ZXN0U2Vzc2lvbiA9IHNjb3BlLl9yZXF1ZXN0U2Vzc2lvbjtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1Njb3BlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBpbnRlcm5hbCBvbiBjaGFuZ2UgbGlzdGVuZXIuIFVzZWQgZm9yIHN1YiBTREtzIHRoYXQgbmVlZCB0byBzdG9yZSB0aGUgc2NvcGUuXG4gICAqIEBoaWRkZW5cbiAgICovXG4gIHB1YmxpYyBhZGRTY29wZUxpc3RlbmVyKGNhbGxiYWNrOiAoc2NvcGU6IFNjb3BlKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fc2NvcGVMaXN0ZW5lcnMucHVzaChjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBhZGRFdmVudFByb2Nlc3NvcihjYWxsYmFjazogRXZlbnRQcm9jZXNzb3IpOiB0aGlzIHtcbiAgICB0aGlzLl9ldmVudFByb2Nlc3NvcnMucHVzaChjYWxsYmFjayk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXRVc2VyKHVzZXI6IFVzZXIgfCBudWxsKTogdGhpcyB7XG4gICAgdGhpcy5fdXNlciA9IHVzZXIgfHwge307XG4gICAgaWYgKHRoaXMuX3Nlc3Npb24pIHtcbiAgICAgIHRoaXMuX3Nlc3Npb24udXBkYXRlKHsgdXNlciB9KTtcbiAgICB9XG4gICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGdldFVzZXIoKTogVXNlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXI7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBnZXRSZXF1ZXN0U2Vzc2lvbigpOiBSZXF1ZXN0U2Vzc2lvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RTZXNzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0UmVxdWVzdFNlc3Npb24ocmVxdWVzdFNlc3Npb24/OiBSZXF1ZXN0U2Vzc2lvbik6IHRoaXMge1xuICAgIHRoaXMuX3JlcXVlc3RTZXNzaW9uID0gcmVxdWVzdFNlc3Npb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXRUYWdzKHRhZ3M6IHsgW2tleTogc3RyaW5nXTogUHJpbWl0aXZlIH0pOiB0aGlzIHtcbiAgICB0aGlzLl90YWdzID0ge1xuICAgICAgLi4udGhpcy5fdGFncyxcbiAgICAgIC4uLnRhZ3MsXG4gICAgfTtcbiAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0VGFnKGtleTogc3RyaW5nLCB2YWx1ZTogUHJpbWl0aXZlKTogdGhpcyB7XG4gICAgdGhpcy5fdGFncyA9IHsgLi4udGhpcy5fdGFncywgW2tleV06IHZhbHVlIH07XG4gICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldEV4dHJhcyhleHRyYXM6IEV4dHJhcyk6IHRoaXMge1xuICAgIHRoaXMuX2V4dHJhID0ge1xuICAgICAgLi4udGhpcy5fZXh0cmEsXG4gICAgICAuLi5leHRyYXMsXG4gICAgfTtcbiAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0RXh0cmEoa2V5OiBzdHJpbmcsIGV4dHJhOiBFeHRyYSk6IHRoaXMge1xuICAgIHRoaXMuX2V4dHJhID0geyAuLi50aGlzLl9leHRyYSwgW2tleV06IGV4dHJhIH07XG4gICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldEZpbmdlcnByaW50KGZpbmdlcnByaW50OiBzdHJpbmdbXSk6IHRoaXMge1xuICAgIHRoaXMuX2ZpbmdlcnByaW50ID0gZmluZ2VycHJpbnQ7XG4gICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldExldmVsKGxldmVsOiBTZXZlcml0eSk6IHRoaXMge1xuICAgIHRoaXMuX2xldmVsID0gbGV2ZWw7XG4gICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldFRyYW5zYWN0aW9uTmFtZShuYW1lPzogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb25OYW1lID0gbmFtZTtcbiAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbiBiZSByZW1vdmVkIGluIG1ham9yIHZlcnNpb24uXG4gICAqIEBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHtAbGluayB0aGlzLnNldFRyYW5zYWN0aW9uTmFtZX1cbiAgICovXG4gIHB1YmxpYyBzZXRUcmFuc2FjdGlvbihuYW1lPzogc3RyaW5nKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuc2V0VHJhbnNhY3Rpb25OYW1lKG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0Q29udGV4dChrZXk6IHN0cmluZywgY29udGV4dDogQ29udGV4dCB8IG51bGwpOiB0aGlzIHtcbiAgICBpZiAoY29udGV4dCA9PT0gbnVsbCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIHRoaXMuX2NvbnRleHRzW2tleV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NvbnRleHRzID0geyAuLi50aGlzLl9jb250ZXh0cywgW2tleV06IGNvbnRleHQgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0U3BhbihzcGFuPzogU3Bhbik6IHRoaXMge1xuICAgIHRoaXMuX3NwYW4gPSBzcGFuO1xuICAgIHRoaXMuX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBnZXRTcGFuKCk6IFNwYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zcGFuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgZ2V0VHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb24gfCB1bmRlZmluZWQge1xuICAgIC8vIG9mdGVuLCB0aGlzIHNwYW4gd2lsbCBiZSBhIHRyYW5zYWN0aW9uLCBidXQgaXQncyBub3QgZ3VhcmFudGVlZCB0byBiZVxuICAgIGNvbnN0IHNwYW4gPSB0aGlzLmdldFNwYW4oKSBhcyB1bmRlZmluZWQgfCAoU3BhbiAmIHsgc3BhblJlY29yZGVyOiB7IHNwYW5zOiBTcGFuW10gfSB9KTtcblxuICAgIC8vIHRyeSBpdCB0aGUgbmV3IHdheSBmaXJzdFxuICAgIGlmIChzcGFuPy50cmFuc2FjdGlvbikge1xuICAgICAgcmV0dXJuIHNwYW4/LnRyYW5zYWN0aW9uO1xuICAgIH1cblxuICAgIC8vIGZhbGxiYWNrIHRvIHRoZSBvbGQgd2F5IChrbm93biBidWc6IHRoaXMgb25seSBmaW5kcyB0cmFuc2FjdGlvbnMgd2l0aCBzYW1wbGVkID0gdHJ1ZSlcbiAgICBpZiAoc3Bhbj8uc3BhblJlY29yZGVyPy5zcGFuc1swXSkge1xuICAgICAgcmV0dXJuIHNwYW4uc3BhblJlY29yZGVyLnNwYW5zWzBdIGFzIFRyYW5zYWN0aW9uO1xuICAgIH1cblxuICAgIC8vIG5laXRoZXIgd2F5IGZvdW5kIGEgdHJhbnNhY3Rpb25cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0U2Vzc2lvbihzZXNzaW9uPzogU2Vzc2lvbik6IHRoaXMge1xuICAgIGlmICghc2Vzc2lvbikge1xuICAgICAgZGVsZXRlIHRoaXMuX3Nlc3Npb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3Nlc3Npb24gPSBzZXNzaW9uO1xuICAgIH1cbiAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgZ2V0U2Vzc2lvbigpOiBTZXNzaW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHVwZGF0ZShjYXB0dXJlQ29udGV4dD86IENhcHR1cmVDb250ZXh0KTogdGhpcyB7XG4gICAgaWYgKCFjYXB0dXJlQ29udGV4dCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjYXB0dXJlQ29udGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgdXBkYXRlZFNjb3BlID0gKGNhcHR1cmVDb250ZXh0IGFzIDxUPihzY29wZTogVCkgPT4gVCkodGhpcyk7XG4gICAgICByZXR1cm4gdXBkYXRlZFNjb3BlIGluc3RhbmNlb2YgU2NvcGUgPyB1cGRhdGVkU2NvcGUgOiB0aGlzO1xuICAgIH1cblxuICAgIGlmIChjYXB0dXJlQ29udGV4dCBpbnN0YW5jZW9mIFNjb3BlKSB7XG4gICAgICB0aGlzLl90YWdzID0geyAuLi50aGlzLl90YWdzLCAuLi5jYXB0dXJlQ29udGV4dC5fdGFncyB9O1xuICAgICAgdGhpcy5fZXh0cmEgPSB7IC4uLnRoaXMuX2V4dHJhLCAuLi5jYXB0dXJlQ29udGV4dC5fZXh0cmEgfTtcbiAgICAgIHRoaXMuX2NvbnRleHRzID0geyAuLi50aGlzLl9jb250ZXh0cywgLi4uY2FwdHVyZUNvbnRleHQuX2NvbnRleHRzIH07XG4gICAgICBpZiAoY2FwdHVyZUNvbnRleHQuX3VzZXIgJiYgT2JqZWN0LmtleXMoY2FwdHVyZUNvbnRleHQuX3VzZXIpLmxlbmd0aCkge1xuICAgICAgICB0aGlzLl91c2VyID0gY2FwdHVyZUNvbnRleHQuX3VzZXI7XG4gICAgICB9XG4gICAgICBpZiAoY2FwdHVyZUNvbnRleHQuX2xldmVsKSB7XG4gICAgICAgIHRoaXMuX2xldmVsID0gY2FwdHVyZUNvbnRleHQuX2xldmVsO1xuICAgICAgfVxuICAgICAgaWYgKGNhcHR1cmVDb250ZXh0Ll9maW5nZXJwcmludCkge1xuICAgICAgICB0aGlzLl9maW5nZXJwcmludCA9IGNhcHR1cmVDb250ZXh0Ll9maW5nZXJwcmludDtcbiAgICAgIH1cbiAgICAgIGlmIChjYXB0dXJlQ29udGV4dC5fcmVxdWVzdFNlc3Npb24pIHtcbiAgICAgICAgdGhpcy5fcmVxdWVzdFNlc3Npb24gPSBjYXB0dXJlQ29udGV4dC5fcmVxdWVzdFNlc3Npb247XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KGNhcHR1cmVDb250ZXh0KSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICBjYXB0dXJlQ29udGV4dCA9IGNhcHR1cmVDb250ZXh0IGFzIFNjb3BlQ29udGV4dDtcbiAgICAgIHRoaXMuX3RhZ3MgPSB7IC4uLnRoaXMuX3RhZ3MsIC4uLmNhcHR1cmVDb250ZXh0LnRhZ3MgfTtcbiAgICAgIHRoaXMuX2V4dHJhID0geyAuLi50aGlzLl9leHRyYSwgLi4uY2FwdHVyZUNvbnRleHQuZXh0cmEgfTtcbiAgICAgIHRoaXMuX2NvbnRleHRzID0geyAuLi50aGlzLl9jb250ZXh0cywgLi4uY2FwdHVyZUNvbnRleHQuY29udGV4dHMgfTtcbiAgICAgIGlmIChjYXB0dXJlQ29udGV4dC51c2VyKSB7XG4gICAgICAgIHRoaXMuX3VzZXIgPSBjYXB0dXJlQ29udGV4dC51c2VyO1xuICAgICAgfVxuICAgICAgaWYgKGNhcHR1cmVDb250ZXh0LmxldmVsKSB7XG4gICAgICAgIHRoaXMuX2xldmVsID0gY2FwdHVyZUNvbnRleHQubGV2ZWw7XG4gICAgICB9XG4gICAgICBpZiAoY2FwdHVyZUNvbnRleHQuZmluZ2VycHJpbnQpIHtcbiAgICAgICAgdGhpcy5fZmluZ2VycHJpbnQgPSBjYXB0dXJlQ29udGV4dC5maW5nZXJwcmludDtcbiAgICAgIH1cbiAgICAgIGlmIChjYXB0dXJlQ29udGV4dC5yZXF1ZXN0U2Vzc2lvbikge1xuICAgICAgICB0aGlzLl9yZXF1ZXN0U2Vzc2lvbiA9IGNhcHR1cmVDb250ZXh0LnJlcXVlc3RTZXNzaW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoKTogdGhpcyB7XG4gICAgdGhpcy5fYnJlYWRjcnVtYnMgPSBbXTtcbiAgICB0aGlzLl90YWdzID0ge307XG4gICAgdGhpcy5fZXh0cmEgPSB7fTtcbiAgICB0aGlzLl91c2VyID0ge307XG4gICAgdGhpcy5fY29udGV4dHMgPSB7fTtcbiAgICB0aGlzLl9sZXZlbCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl90cmFuc2FjdGlvbk5hbWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fZmluZ2VycHJpbnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcmVxdWVzdFNlc3Npb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc3BhbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9zZXNzaW9uID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBhZGRCcmVhZGNydW1iKGJyZWFkY3J1bWI6IEJyZWFkY3J1bWIsIG1heEJyZWFkY3J1bWJzPzogbnVtYmVyKTogdGhpcyB7XG4gICAgY29uc3QgbWF4Q3J1bWJzID0gdHlwZW9mIG1heEJyZWFkY3J1bWJzID09PSAnbnVtYmVyJyA/IE1hdGgubWluKG1heEJyZWFkY3J1bWJzLCBNQVhfQlJFQURDUlVNQlMpIDogTUFYX0JSRUFEQ1JVTUJTO1xuXG4gICAgLy8gTm8gZGF0YSBoYXMgYmVlbiBjaGFuZ2VkLCBzbyBkb24ndCBub3RpZnkgc2NvcGUgbGlzdGVuZXJzXG4gICAgaWYgKG1heENydW1icyA8PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBjb25zdCBtZXJnZWRCcmVhZGNydW1iID0ge1xuICAgICAgdGltZXN0YW1wOiBkYXRlVGltZXN0YW1wSW5TZWNvbmRzKCksXG4gICAgICAuLi5icmVhZGNydW1iLFxuICAgIH07XG4gICAgdGhpcy5fYnJlYWRjcnVtYnMgPSBbLi4udGhpcy5fYnJlYWRjcnVtYnMsIG1lcmdlZEJyZWFkY3J1bWJdLnNsaWNlKC1tYXhDcnVtYnMpO1xuICAgIHRoaXMuX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNsZWFyQnJlYWRjcnVtYnMoKTogdGhpcyB7XG4gICAgdGhpcy5fYnJlYWRjcnVtYnMgPSBbXTtcbiAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhlIGN1cnJlbnQgY29udGV4dCBhbmQgZmluZ2VycHJpbnQgdG8gdGhlIGV2ZW50LlxuICAgKiBOb3RlIHRoYXQgYnJlYWRjcnVtYnMgd2lsbCBiZSBhZGRlZCBieSB0aGUgY2xpZW50LlxuICAgKiBBbHNvIGlmIHRoZSBldmVudCBoYXMgYWxyZWFkeSBicmVhZGNydW1icyBvbiBpdCwgd2UgZG8gbm90IG1lcmdlIHRoZW0uXG4gICAqIEBwYXJhbSBldmVudCBFdmVudFxuICAgKiBAcGFyYW0gaGludCBNYXkgY29udGFpbiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBleGNlcHRpb24uXG4gICAqIEBoaWRkZW5cbiAgICovXG4gIHB1YmxpYyBhcHBseVRvRXZlbnQoZXZlbnQ6IEV2ZW50LCBoaW50PzogRXZlbnRIaW50KTogUHJvbWlzZUxpa2U8RXZlbnQgfCBudWxsPiB7XG4gICAgaWYgKHRoaXMuX2V4dHJhICYmIE9iamVjdC5rZXlzKHRoaXMuX2V4dHJhKS5sZW5ndGgpIHtcbiAgICAgIGV2ZW50LmV4dHJhID0geyAuLi50aGlzLl9leHRyYSwgLi4uZXZlbnQuZXh0cmEgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3RhZ3MgJiYgT2JqZWN0LmtleXModGhpcy5fdGFncykubGVuZ3RoKSB7XG4gICAgICBldmVudC50YWdzID0geyAuLi50aGlzLl90YWdzLCAuLi5ldmVudC50YWdzIH07XG4gICAgfVxuICAgIGlmICh0aGlzLl91c2VyICYmIE9iamVjdC5rZXlzKHRoaXMuX3VzZXIpLmxlbmd0aCkge1xuICAgICAgZXZlbnQudXNlciA9IHsgLi4udGhpcy5fdXNlciwgLi4uZXZlbnQudXNlciB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5fY29udGV4dHMgJiYgT2JqZWN0LmtleXModGhpcy5fY29udGV4dHMpLmxlbmd0aCkge1xuICAgICAgZXZlbnQuY29udGV4dHMgPSB7IC4uLnRoaXMuX2NvbnRleHRzLCAuLi5ldmVudC5jb250ZXh0cyB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5fbGV2ZWwpIHtcbiAgICAgIGV2ZW50LmxldmVsID0gdGhpcy5fbGV2ZWw7XG4gICAgfVxuICAgIGlmICh0aGlzLl90cmFuc2FjdGlvbk5hbWUpIHtcbiAgICAgIGV2ZW50LnRyYW5zYWN0aW9uID0gdGhpcy5fdHJhbnNhY3Rpb25OYW1lO1xuICAgIH1cbiAgICAvLyBXZSB3YW50IHRvIHNldCB0aGUgdHJhY2UgY29udGV4dCBmb3Igbm9ybWFsIGV2ZW50cyBvbmx5IGlmIHRoZXJlIGlzbid0IGFscmVhZHlcbiAgICAvLyBhIHRyYWNlIGNvbnRleHQgb24gdGhlIGV2ZW50LiBUaGVyZSBpcyBhIHByb2R1Y3QgZmVhdHVyZSBpbiBwbGFjZSB3aGVyZSB3ZSBsaW5rXG4gICAgLy8gZXJyb3JzIHdpdGggdHJhbnNhY3Rpb24gYW5kIGl0IHJlbGllcyBvbiB0aGF0LlxuICAgIGlmICh0aGlzLl9zcGFuKSB7XG4gICAgICBldmVudC5jb250ZXh0cyA9IHsgdHJhY2U6IHRoaXMuX3NwYW4uZ2V0VHJhY2VDb250ZXh0KCksIC4uLmV2ZW50LmNvbnRleHRzIH07XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbk5hbWUgPSB0aGlzLl9zcGFuLnRyYW5zYWN0aW9uPy5uYW1lO1xuICAgICAgaWYgKHRyYW5zYWN0aW9uTmFtZSkge1xuICAgICAgICBldmVudC50YWdzID0geyB0cmFuc2FjdGlvbjogdHJhbnNhY3Rpb25OYW1lLCAuLi5ldmVudC50YWdzIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fYXBwbHlGaW5nZXJwcmludChldmVudCk7XG5cbiAgICBldmVudC5icmVhZGNydW1icyA9IFsuLi4oZXZlbnQuYnJlYWRjcnVtYnMgfHwgW10pLCAuLi50aGlzLl9icmVhZGNydW1ic107XG4gICAgZXZlbnQuYnJlYWRjcnVtYnMgPSBldmVudC5icmVhZGNydW1icy5sZW5ndGggPiAwID8gZXZlbnQuYnJlYWRjcnVtYnMgOiB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gdGhpcy5fbm90aWZ5RXZlbnRQcm9jZXNzb3JzKFsuLi5nZXRHbG9iYWxFdmVudFByb2Nlc3NvcnMoKSwgLi4udGhpcy5fZXZlbnRQcm9jZXNzb3JzXSwgZXZlbnQsIGhpbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIge0BsaW5rIGFwcGx5VG9FdmVudH0gaXMgZmluaXNoZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgX25vdGlmeUV2ZW50UHJvY2Vzc29ycyhcbiAgICBwcm9jZXNzb3JzOiBFdmVudFByb2Nlc3NvcltdLFxuICAgIGV2ZW50OiBFdmVudCB8IG51bGwsXG4gICAgaGludD86IEV2ZW50SGludCxcbiAgICBpbmRleDogbnVtYmVyID0gMCxcbiAgKTogUHJvbWlzZUxpa2U8RXZlbnQgfCBudWxsPiB7XG4gICAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZTxFdmVudCB8IG51bGw+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHByb2Nlc3NvciA9IHByb2Nlc3NvcnNbaW5kZXhdO1xuICAgICAgaWYgKGV2ZW50ID09PSBudWxsIHx8IHR5cGVvZiBwcm9jZXNzb3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmVzb2x2ZShldmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBwcm9jZXNzb3IoeyAuLi5ldmVudCB9LCBoaW50KSBhcyBFdmVudCB8IG51bGw7XG4gICAgICAgIGlmIChpc1RoZW5hYmxlKHJlc3VsdCkpIHtcbiAgICAgICAgICB2b2lkIChyZXN1bHQgYXMgUHJvbWlzZUxpa2U8RXZlbnQgfCBudWxsPilcbiAgICAgICAgICAgIC50aGVuKGZpbmFsID0+IHRoaXMuX25vdGlmeUV2ZW50UHJvY2Vzc29ycyhwcm9jZXNzb3JzLCBmaW5hbCwgaGludCwgaW5kZXggKyAxKS50aGVuKHJlc29sdmUpKVxuICAgICAgICAgICAgLnRoZW4obnVsbCwgcmVqZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2b2lkIHRoaXMuX25vdGlmeUV2ZW50UHJvY2Vzc29ycyhwcm9jZXNzb3JzLCByZXN1bHQsIGhpbnQsIGluZGV4ICsgMSlcbiAgICAgICAgICAgIC50aGVuKHJlc29sdmUpXG4gICAgICAgICAgICAudGhlbihudWxsLCByZWplY3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyB3aWxsIGJlIGNhbGxlZCBvbiBldmVyeSBzZXQgY2FsbC5cbiAgICovXG4gIHByb3RlY3RlZCBfbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgLy8gV2UgbmVlZCB0aGlzIGNoZWNrIGZvciB0aGlzLl9ub3RpZnlpbmdMaXN0ZW5lcnMgdG8gYmUgYWJsZSB0byB3b3JrIG9uIHNjb3BlIGR1cmluZyB1cGRhdGVzXG4gICAgLy8gSWYgdGhpcyBjaGVjayBpcyBub3QgaGVyZSB3ZSdsbCBwcm9kdWNlIGVuZGxlc3MgcmVjdXJzaW9uIHdoZW4gc29tZXRoaW5nIGlzIGRvbmUgd2l0aCB0aGUgc2NvcGVcbiAgICAvLyBkdXJpbmcgdGhlIGNhbGxiYWNrLlxuICAgIGlmICghdGhpcy5fbm90aWZ5aW5nTGlzdGVuZXJzKSB7XG4gICAgICB0aGlzLl9ub3RpZnlpbmdMaXN0ZW5lcnMgPSB0cnVlO1xuICAgICAgdGhpcy5fc2NvcGVMaXN0ZW5lcnMuZm9yRWFjaChjYWxsYmFjayA9PiB7XG4gICAgICAgIGNhbGxiYWNrKHRoaXMpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9ub3RpZnlpbmdMaXN0ZW5lcnMgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBmaW5nZXJwcmludCBmcm9tIHRoZSBzY29wZSB0byB0aGUgZXZlbnQgaWYgdGhlcmUncyBvbmUsXG4gICAqIHVzZXMgbWVzc2FnZSBpZiB0aGVyZSdzIG9uZSBpbnN0ZWFkIG9yIGdldCByaWQgb2YgZW1wdHkgZmluZ2VycHJpbnRcbiAgICovXG4gIHByaXZhdGUgX2FwcGx5RmluZ2VycHJpbnQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgLy8gTWFrZSBzdXJlIGl0J3MgYW4gYXJyYXkgZmlyc3QgYW5kIHdlIGFjdHVhbGx5IGhhdmUgc29tZXRoaW5nIGluIHBsYWNlXG4gICAgZXZlbnQuZmluZ2VycHJpbnQgPSBldmVudC5maW5nZXJwcmludFxuICAgICAgPyBBcnJheS5pc0FycmF5KGV2ZW50LmZpbmdlcnByaW50KVxuICAgICAgICA/IGV2ZW50LmZpbmdlcnByaW50XG4gICAgICAgIDogW2V2ZW50LmZpbmdlcnByaW50XVxuICAgICAgOiBbXTtcblxuICAgIC8vIElmIHdlIGhhdmUgc29tZXRoaW5nIG9uIHRoZSBzY29wZSwgdGhlbiBtZXJnZSBpdCB3aXRoIGV2ZW50XG4gICAgaWYgKHRoaXMuX2ZpbmdlcnByaW50KSB7XG4gICAgICBldmVudC5maW5nZXJwcmludCA9IGV2ZW50LmZpbmdlcnByaW50LmNvbmNhdCh0aGlzLl9maW5nZXJwcmludCk7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgaGF2ZSBubyBkYXRhIGF0IGFsbCwgcmVtb3ZlIGVtcHR5IGFycmF5IGRlZmF1bHRcbiAgICBpZiAoZXZlbnQuZmluZ2VycHJpbnQgJiYgIWV2ZW50LmZpbmdlcnByaW50Lmxlbmd0aCkge1xuICAgICAgZGVsZXRlIGV2ZW50LmZpbmdlcnByaW50O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGdsb2JhbCBldmVudCBwcm9jZXNzb3JzLlxuICovXG5mdW5jdGlvbiBnZXRHbG9iYWxFdmVudFByb2Nlc3NvcnMoKTogRXZlbnRQcm9jZXNzb3JbXSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAgKi9cbiAgY29uc3QgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0PGFueT4oKTtcbiAgZ2xvYmFsLl9fU0VOVFJZX18gPSBnbG9iYWwuX19TRU5UUllfXyB8fCB7fTtcbiAgZ2xvYmFsLl9fU0VOVFJZX18uZ2xvYmFsRXZlbnRQcm9jZXNzb3JzID0gZ2xvYmFsLl9fU0VOVFJZX18uZ2xvYmFsRXZlbnRQcm9jZXNzb3JzIHx8IFtdO1xuICByZXR1cm4gZ2xvYmFsLl9fU0VOVFJZX18uZ2xvYmFsRXZlbnRQcm9jZXNzb3JzO1xuICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xufVxuXG4vKipcbiAqIEFkZCBhIEV2ZW50UHJvY2Vzc29yIHRvIGJlIGtlcHQgZ2xvYmFsbHkuXG4gKiBAcGFyYW0gY2FsbGJhY2sgRXZlbnRQcm9jZXNzb3IgdG8gYWRkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRHbG9iYWxFdmVudFByb2Nlc3NvcihjYWxsYmFjazogRXZlbnRQcm9jZXNzb3IpOiB2b2lkIHtcbiAgZ2V0R2xvYmFsRXZlbnRQcm9jZXNzb3JzKCkucHVzaChjYWxsYmFjayk7XG59XG4iLCAiaW1wb3J0IHsgU2Vzc2lvbiBhcyBTZXNzaW9uSW50ZXJmYWNlLCBTZXNzaW9uQ29udGV4dCwgU2Vzc2lvblN0YXR1cyB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgZHJvcFVuZGVmaW5lZEtleXMsIHRpbWVzdGFtcEluU2Vjb25kcywgdXVpZDQgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuLyoqXG4gKiBAaW5oZXJpdGRvY1xuICovXG5leHBvcnQgY2xhc3MgU2Vzc2lvbiBpbXBsZW1lbnRzIFNlc3Npb25JbnRlcmZhY2Uge1xuICBwdWJsaWMgdXNlckFnZW50Pzogc3RyaW5nO1xuICBwdWJsaWMgZXJyb3JzOiBudW1iZXIgPSAwO1xuICBwdWJsaWMgcmVsZWFzZT86IHN0cmluZztcbiAgcHVibGljIHNpZDogc3RyaW5nID0gdXVpZDQoKTtcbiAgcHVibGljIGRpZD86IHN0cmluZztcbiAgcHVibGljIHRpbWVzdGFtcDogbnVtYmVyO1xuICBwdWJsaWMgc3RhcnRlZDogbnVtYmVyO1xuICBwdWJsaWMgZHVyYXRpb24/OiBudW1iZXIgPSAwO1xuICBwdWJsaWMgc3RhdHVzOiBTZXNzaW9uU3RhdHVzID0gU2Vzc2lvblN0YXR1cy5PaztcbiAgcHVibGljIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICBwdWJsaWMgaXBBZGRyZXNzPzogc3RyaW5nO1xuICBwdWJsaWMgaW5pdDogYm9vbGVhbiA9IHRydWU7XG4gIHB1YmxpYyBpZ25vcmVEdXJhdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb250ZXh0PzogT21pdDxTZXNzaW9uQ29udGV4dCwgJ3N0YXJ0ZWQnIHwgJ3N0YXR1cyc+KSB7XG4gICAgLy8gQm90aCB0aW1lc3RhbXAgYW5kIHN0YXJ0ZWQgYXJlIGluIHNlY29uZHMgc2luY2UgdGhlIFVOSVggZXBvY2guXG4gICAgY29uc3Qgc3RhcnRpbmdUaW1lID0gdGltZXN0YW1wSW5TZWNvbmRzKCk7XG4gICAgdGhpcy50aW1lc3RhbXAgPSBzdGFydGluZ1RpbWU7XG4gICAgdGhpcy5zdGFydGVkID0gc3RhcnRpbmdUaW1lO1xuICAgIGlmIChjb250ZXh0KSB7XG4gICAgICB0aGlzLnVwZGF0ZShjb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgcHVibGljIHVwZGF0ZShjb250ZXh0OiBTZXNzaW9uQ29udGV4dCA9IHt9KTogdm9pZCB7XG4gICAgaWYgKGNvbnRleHQudXNlcikge1xuICAgICAgaWYgKCF0aGlzLmlwQWRkcmVzcyAmJiBjb250ZXh0LnVzZXIuaXBfYWRkcmVzcykge1xuICAgICAgICB0aGlzLmlwQWRkcmVzcyA9IGNvbnRleHQudXNlci5pcF9hZGRyZXNzO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuZGlkICYmICFjb250ZXh0LmRpZCkge1xuICAgICAgICB0aGlzLmRpZCA9IGNvbnRleHQudXNlci5pZCB8fCBjb250ZXh0LnVzZXIuZW1haWwgfHwgY29udGV4dC51c2VyLnVzZXJuYW1lO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudGltZXN0YW1wID0gY29udGV4dC50aW1lc3RhbXAgfHwgdGltZXN0YW1wSW5TZWNvbmRzKCk7XG4gICAgaWYgKGNvbnRleHQuaWdub3JlRHVyYXRpb24pIHtcbiAgICAgIHRoaXMuaWdub3JlRHVyYXRpb24gPSBjb250ZXh0Lmlnbm9yZUR1cmF0aW9uO1xuICAgIH1cbiAgICBpZiAoY29udGV4dC5zaWQpIHtcbiAgICAgIC8vIEdvb2QgZW5vdWdoIHV1aWQgdmFsaWRhdGlvbi4gXHUyMDE0IEthbWlsXG4gICAgICB0aGlzLnNpZCA9IGNvbnRleHQuc2lkLmxlbmd0aCA9PT0gMzIgPyBjb250ZXh0LnNpZCA6IHV1aWQ0KCk7XG4gICAgfVxuICAgIGlmIChjb250ZXh0LmluaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pbml0ID0gY29udGV4dC5pbml0O1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZGlkICYmIGNvbnRleHQuZGlkKSB7XG4gICAgICB0aGlzLmRpZCA9IGAke2NvbnRleHQuZGlkfWA7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29udGV4dC5zdGFydGVkID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5zdGFydGVkID0gY29udGV4dC5zdGFydGVkO1xuICAgIH1cbiAgICBpZiAodGhpcy5pZ25vcmVEdXJhdGlvbikge1xuICAgICAgdGhpcy5kdXJhdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb250ZXh0LmR1cmF0aW9uID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5kdXJhdGlvbiA9IGNvbnRleHQuZHVyYXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy50aW1lc3RhbXAgLSB0aGlzLnN0YXJ0ZWQ7XG4gICAgICB0aGlzLmR1cmF0aW9uID0gZHVyYXRpb24gPj0gMCA/IGR1cmF0aW9uIDogMDtcbiAgICB9XG4gICAgaWYgKGNvbnRleHQucmVsZWFzZSkge1xuICAgICAgdGhpcy5yZWxlYXNlID0gY29udGV4dC5yZWxlYXNlO1xuICAgIH1cbiAgICBpZiAoY29udGV4dC5lbnZpcm9ubWVudCkge1xuICAgICAgdGhpcy5lbnZpcm9ubWVudCA9IGNvbnRleHQuZW52aXJvbm1lbnQ7XG4gICAgfVxuICAgIGlmICghdGhpcy5pcEFkZHJlc3MgJiYgY29udGV4dC5pcEFkZHJlc3MpIHtcbiAgICAgIHRoaXMuaXBBZGRyZXNzID0gY29udGV4dC5pcEFkZHJlc3M7XG4gICAgfVxuICAgIGlmICghdGhpcy51c2VyQWdlbnQgJiYgY29udGV4dC51c2VyQWdlbnQpIHtcbiAgICAgIHRoaXMudXNlckFnZW50ID0gY29udGV4dC51c2VyQWdlbnQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29udGV4dC5lcnJvcnMgPT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLmVycm9ycyA9IGNvbnRleHQuZXJyb3JzO1xuICAgIH1cbiAgICBpZiAoY29udGV4dC5zdGF0dXMpIHtcbiAgICAgIHRoaXMuc3RhdHVzID0gY29udGV4dC5zdGF0dXM7XG4gICAgfVxuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHB1YmxpYyBjbG9zZShzdGF0dXM/OiBFeGNsdWRlPFNlc3Npb25TdGF0dXMsIFNlc3Npb25TdGF0dXMuT2s+KTogdm9pZCB7XG4gICAgaWYgKHN0YXR1cykge1xuICAgICAgdGhpcy51cGRhdGUoeyBzdGF0dXMgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXR1cyA9PT0gU2Vzc2lvblN0YXR1cy5Paykge1xuICAgICAgdGhpcy51cGRhdGUoeyBzdGF0dXM6IFNlc3Npb25TdGF0dXMuRXhpdGVkIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwdWJsaWMgdG9KU09OKCk6IHtcbiAgICBpbml0OiBib29sZWFuO1xuICAgIHNpZDogc3RyaW5nO1xuICAgIGRpZD86IHN0cmluZztcbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICBzdGFydGVkOiBzdHJpbmc7XG4gICAgZHVyYXRpb24/OiBudW1iZXI7XG4gICAgc3RhdHVzOiBTZXNzaW9uU3RhdHVzO1xuICAgIGVycm9yczogbnVtYmVyO1xuICAgIGF0dHJzPzoge1xuICAgICAgcmVsZWFzZT86IHN0cmluZztcbiAgICAgIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICAgICAgdXNlcl9hZ2VudD86IHN0cmluZztcbiAgICAgIGlwX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgfTtcbiAgfSB7XG4gICAgcmV0dXJuIGRyb3BVbmRlZmluZWRLZXlzKHtcbiAgICAgIHNpZDogYCR7dGhpcy5zaWR9YCxcbiAgICAgIGluaXQ6IHRoaXMuaW5pdCxcbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHNlYyBpcyBjb252ZXJ0ZWQgdG8gbXMgZm9yIGRhdGUgY29uc3RydWN0b3JcbiAgICAgIHN0YXJ0ZWQ6IG5ldyBEYXRlKHRoaXMuc3RhcnRlZCAqIDEwMDApLnRvSVNPU3RyaW5nKCksXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKHRoaXMudGltZXN0YW1wICogMTAwMCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICBlcnJvcnM6IHRoaXMuZXJyb3JzLFxuICAgICAgZGlkOiB0eXBlb2YgdGhpcy5kaWQgPT09ICdudW1iZXInIHx8IHR5cGVvZiB0aGlzLmRpZCA9PT0gJ3N0cmluZycgPyBgJHt0aGlzLmRpZH1gIDogdW5kZWZpbmVkLFxuICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICBhdHRyczogZHJvcFVuZGVmaW5lZEtleXMoe1xuICAgICAgICByZWxlYXNlOiB0aGlzLnJlbGVhc2UsXG4gICAgICAgIGVudmlyb25tZW50OiB0aGlzLmVudmlyb25tZW50LFxuICAgICAgICBpcF9hZGRyZXNzOiB0aGlzLmlwQWRkcmVzcyxcbiAgICAgICAgdXNlcl9hZ2VudDogdGhpcy51c2VyQWdlbnQsXG4gICAgICB9KSxcbiAgICB9KTtcbiAgfVxufVxuIiwgIi8qIGVzbGludC1kaXNhYmxlIG1heC1saW5lcyAqL1xuaW1wb3J0IHtcbiAgQnJlYWRjcnVtYixcbiAgQnJlYWRjcnVtYkhpbnQsXG4gIENsaWVudCxcbiAgQ3VzdG9tU2FtcGxpbmdDb250ZXh0LFxuICBFdmVudCxcbiAgRXZlbnRIaW50LFxuICBFeHRyYSxcbiAgRXh0cmFzLFxuICBIdWIgYXMgSHViSW50ZXJmYWNlLFxuICBJbnRlZ3JhdGlvbixcbiAgSW50ZWdyYXRpb25DbGFzcyxcbiAgUHJpbWl0aXZlLFxuICBTZXNzaW9uQ29udGV4dCxcbiAgU2Vzc2lvblN0YXR1cyxcbiAgU2V2ZXJpdHksXG4gIFNwYW4sXG4gIFNwYW5Db250ZXh0LFxuICBUcmFuc2FjdGlvbixcbiAgVHJhbnNhY3Rpb25Db250ZXh0LFxuICBVc2VyLFxufSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGNvbnNvbGVTYW5kYm94LCBkYXRlVGltZXN0YW1wSW5TZWNvbmRzLCBnZXRHbG9iYWxPYmplY3QsIGlzTm9kZUVudiwgbG9nZ2VyLCB1dWlkNCB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG5pbXBvcnQgeyBTY29wZSB9IGZyb20gJy4vc2NvcGUnO1xuaW1wb3J0IHsgU2Vzc2lvbiB9IGZyb20gJy4vc2Vzc2lvbic7XG5cbi8qKlxuICogQVBJIGNvbXBhdGliaWxpdHkgdmVyc2lvbiBvZiB0aGlzIGh1Yi5cbiAqXG4gKiBXQVJOSU5HOiBUaGlzIG51bWJlciBzaG91bGQgb25seSBiZSBpbmNyZWFzZWQgd2hlbiB0aGUgZ2xvYmFsIGludGVyZmFjZVxuICogY2hhbmdlcyBhbmQgbmV3IG1ldGhvZHMgYXJlIGludHJvZHVjZWQuXG4gKlxuICogQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgQVBJX1ZFUlNJT04gPSA0O1xuXG4vKipcbiAqIERlZmF1bHQgbWF4aW11bSBudW1iZXIgb2YgYnJlYWRjcnVtYnMgYWRkZWQgdG8gYW4gZXZlbnQuIENhbiBiZSBvdmVyd3JpdHRlblxuICogd2l0aCB7QGxpbmsgT3B0aW9ucy5tYXhCcmVhZGNydW1ic30uXG4gKi9cbmNvbnN0IERFRkFVTFRfQlJFQURDUlVNQlMgPSAxMDA7XG5cbi8qKlxuICogQSBsYXllciBpbiB0aGUgcHJvY2VzcyBzdGFjay5cbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYXllciB7XG4gIGNsaWVudD86IENsaWVudDtcbiAgc2NvcGU/OiBTY29wZTtcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBjb250YWlucyBhIGh1YiBhbmQgbWFpbnRhaW5zIGEgc2NvcGUgc3RhY2suXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FycmllciB7XG4gIF9fU0VOVFJZX18/OiB7XG4gICAgaHViPzogSHViO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIEh1YiBwcm9wZXJ0aWVzIGluamVjdGVkIGJ5IHZhcmlvdXMgU0RLc1xuICAgICAqL1xuICAgIGludGVncmF0aW9ucz86IEludGVncmF0aW9uW107XG4gICAgZXh0ZW5zaW9ucz86IHtcbiAgICAgIC8qKiBIYWNrIHRvIHByZXZlbnQgYnVuZGxlcnMgZnJvbSBicmVha2luZyBvdXIgdXNhZ2Ugb2YgdGhlIGRvbWFpbiBwYWNrYWdlIGluIHRoZSBjcm9zcy1wbGF0Zm9ybSBIdWIgcGFja2FnZSAqL1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGRvbWFpbj86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG4gICAgfSAmIHtcbiAgICAgIC8qKiBFeHRlbnNpb24gbWV0aG9kcyBmb3IgdGhlIGh1Yiwgd2hpY2ggYXJlIGJvdW5kIHRvIHRoZSBjdXJyZW50IEh1YiBpbnN0YW5jZSAqL1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbiAgICAgIFtrZXk6IHN0cmluZ106IEZ1bmN0aW9uO1xuICAgIH07XG4gIH07XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgQ2FuIGJlIHJlbW92ZWQgb25jZSBgSHViLmdldEFjdGl2ZURvbWFpbmAgaXMgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb21haW5Bc0NhcnJpZXIgZXh0ZW5kcyBDYXJyaWVyIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgbWVtYmVyczogeyBba2V5OiBzdHJpbmddOiBhbnkgfVtdO1xufVxuXG4vKipcbiAqIEBpbmhlcml0RG9jXG4gKi9cbmV4cG9ydCBjbGFzcyBIdWIgaW1wbGVtZW50cyBIdWJJbnRlcmZhY2Uge1xuICAvKiogSXMgYSB7QGxpbmsgTGF5ZXJ9W10gY29udGFpbmluZyB0aGUgY2xpZW50IGFuZCBzY29wZSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9zdGFjazogTGF5ZXJbXSA9IFt7fV07XG5cbiAgLyoqIENvbnRhaW5zIHRoZSBsYXN0IGV2ZW50IGlkIG9mIGEgY2FwdHVyZWQgZXZlbnQuICAqL1xuICBwcml2YXRlIF9sYXN0RXZlbnRJZD86IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgaHViLCB3aWxsIHB1c2ggb25lIHtAbGluayBMYXllcn0gaW50byB0aGVcbiAgICogaW50ZXJuYWwgc3RhY2sgb24gY3JlYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBjbGllbnQgYm91bmQgdG8gdGhlIGh1Yi5cbiAgICogQHBhcmFtIHNjb3BlIGJvdW5kIHRvIHRoZSBodWIuXG4gICAqIEBwYXJhbSB2ZXJzaW9uIG51bWJlciwgaGlnaGVyIG51bWJlciBtZWFucyBoaWdoZXIgcHJpb3JpdHkuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoY2xpZW50PzogQ2xpZW50LCBzY29wZTogU2NvcGUgPSBuZXcgU2NvcGUoKSwgcHJpdmF0ZSByZWFkb25seSBfdmVyc2lvbjogbnVtYmVyID0gQVBJX1ZFUlNJT04pIHtcbiAgICB0aGlzLmdldFN0YWNrVG9wKCkuc2NvcGUgPSBzY29wZTtcbiAgICBpZiAoY2xpZW50KSB7XG4gICAgICB0aGlzLmJpbmRDbGllbnQoY2xpZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBpc09sZGVyVGhhbih2ZXJzaW9uOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdmVyc2lvbiA8IHZlcnNpb247XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBiaW5kQ2xpZW50KGNsaWVudD86IENsaWVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRvcCA9IHRoaXMuZ2V0U3RhY2tUb3AoKTtcbiAgICB0b3AuY2xpZW50ID0gY2xpZW50O1xuICAgIGlmIChjbGllbnQgJiYgY2xpZW50LnNldHVwSW50ZWdyYXRpb25zKSB7XG4gICAgICBjbGllbnQuc2V0dXBJbnRlZ3JhdGlvbnMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBwdXNoU2NvcGUoKTogU2NvcGUge1xuICAgIC8vIFdlIHdhbnQgdG8gY2xvbmUgdGhlIGNvbnRlbnQgb2YgcHJldiBzY29wZVxuICAgIGNvbnN0IHNjb3BlID0gU2NvcGUuY2xvbmUodGhpcy5nZXRTY29wZSgpKTtcbiAgICB0aGlzLmdldFN0YWNrKCkucHVzaCh7XG4gICAgICBjbGllbnQ6IHRoaXMuZ2V0Q2xpZW50KCksXG4gICAgICBzY29wZSxcbiAgICB9KTtcbiAgICByZXR1cm4gc2NvcGU7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBwb3BTY29wZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5nZXRTdGFjaygpLmxlbmd0aCA8PSAxKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRTdGFjaygpLnBvcCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgd2l0aFNjb3BlKGNhbGxiYWNrOiAoc2NvcGU6IFNjb3BlKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLnB1c2hTY29wZSgpO1xuICAgIHRyeSB7XG4gICAgICBjYWxsYmFjayhzY29wZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMucG9wU2NvcGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBnZXRDbGllbnQ8QyBleHRlbmRzIENsaWVudD4oKTogQyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RhY2tUb3AoKS5jbGllbnQgYXMgQztcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBzY29wZSBvZiB0aGUgdG9wIHN0YWNrLiAqL1xuICBwdWJsaWMgZ2V0U2NvcGUoKTogU2NvcGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldFN0YWNrVG9wKCkuc2NvcGU7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgc2NvcGUgc3RhY2sgZm9yIGRvbWFpbnMgb3IgdGhlIHByb2Nlc3MuICovXG4gIHB1YmxpYyBnZXRTdGFjaygpOiBMYXllcltdIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhY2s7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgdG9wbW9zdCBzY29wZSBsYXllciBpbiB0aGUgb3JkZXIgZG9tYWluID4gbG9jYWwgPiBwcm9jZXNzLiAqL1xuICBwdWJsaWMgZ2V0U3RhY2tUb3AoKTogTGF5ZXIge1xuICAgIHJldHVybiB0aGlzLl9zdGFja1t0aGlzLl9zdGFjay5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcbiAgcHVibGljIGNhcHR1cmVFeGNlcHRpb24oZXhjZXB0aW9uOiBhbnksIGhpbnQ/OiBFdmVudEhpbnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IGV2ZW50SWQgPSAodGhpcy5fbGFzdEV2ZW50SWQgPSB1dWlkNCgpKTtcbiAgICBsZXQgZmluYWxIaW50ID0gaGludDtcblxuICAgIC8vIElmIHRoZXJlJ3Mgbm8gZXhwbGljaXQgaGludCBwcm92aWRlZCwgbWltaWMgdGhlIHNhbWUgdGhpbmcgdGhhdCB3b3VsZCBoYXBwZW5cbiAgICAvLyBpbiB0aGUgbWluaW1hbCBpdHNlbGYgdG8gY3JlYXRlIGEgY29uc2lzdGVudCBiZWhhdmlvci5cbiAgICAvLyBXZSBkb24ndCBkbyB0aGlzIGluIHRoZSBjbGllbnQsIGFzIGl0J3MgdGhlIGxvd2VzdCBsZXZlbCBBUEksIGFuZCBkb2luZyB0aGlzLFxuICAgIC8vIHdvdWxkIHByZXZlbnQgdXNlciBmcm9tIGhhdmluZyBmdWxsIGNvbnRyb2wgb3ZlciBkaXJlY3QgY2FsbHMuXG4gICAgaWYgKCFoaW50KSB7XG4gICAgICBsZXQgc3ludGhldGljRXhjZXB0aW9uOiBFcnJvcjtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU2VudHJ5IHN5bnRoZXRpY0V4Y2VwdGlvbicpO1xuICAgICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgIHN5bnRoZXRpY0V4Y2VwdGlvbiA9IGV4Y2VwdGlvbiBhcyBFcnJvcjtcbiAgICAgIH1cbiAgICAgIGZpbmFsSGludCA9IHtcbiAgICAgICAgb3JpZ2luYWxFeGNlcHRpb246IGV4Y2VwdGlvbixcbiAgICAgICAgc3ludGhldGljRXhjZXB0aW9uLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9pbnZva2VDbGllbnQoJ2NhcHR1cmVFeGNlcHRpb24nLCBleGNlcHRpb24sIHtcbiAgICAgIC4uLmZpbmFsSGludCxcbiAgICAgIGV2ZW50X2lkOiBldmVudElkLFxuICAgIH0pO1xuICAgIHJldHVybiBldmVudElkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgY2FwdHVyZU1lc3NhZ2UobWVzc2FnZTogc3RyaW5nLCBsZXZlbD86IFNldmVyaXR5LCBoaW50PzogRXZlbnRIaW50KTogc3RyaW5nIHtcbiAgICBjb25zdCBldmVudElkID0gKHRoaXMuX2xhc3RFdmVudElkID0gdXVpZDQoKSk7XG4gICAgbGV0IGZpbmFsSGludCA9IGhpbnQ7XG5cbiAgICAvLyBJZiB0aGVyZSdzIG5vIGV4cGxpY2l0IGhpbnQgcHJvdmlkZWQsIG1pbWljIHRoZSBzYW1lIHRoaW5nIHRoYXQgd291bGQgaGFwcGVuXG4gICAgLy8gaW4gdGhlIG1pbmltYWwgaXRzZWxmIHRvIGNyZWF0ZSBhIGNvbnNpc3RlbnQgYmVoYXZpb3IuXG4gICAgLy8gV2UgZG9uJ3QgZG8gdGhpcyBpbiB0aGUgY2xpZW50LCBhcyBpdCdzIHRoZSBsb3dlc3QgbGV2ZWwgQVBJLCBhbmQgZG9pbmcgdGhpcyxcbiAgICAvLyB3b3VsZCBwcmV2ZW50IHVzZXIgZnJvbSBoYXZpbmcgZnVsbCBjb250cm9sIG92ZXIgZGlyZWN0IGNhbGxzLlxuICAgIGlmICghaGludCkge1xuICAgICAgbGV0IHN5bnRoZXRpY0V4Y2VwdGlvbjogRXJyb3I7XG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICB9IGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgc3ludGhldGljRXhjZXB0aW9uID0gZXhjZXB0aW9uIGFzIEVycm9yO1xuICAgICAgfVxuICAgICAgZmluYWxIaW50ID0ge1xuICAgICAgICBvcmlnaW5hbEV4Y2VwdGlvbjogbWVzc2FnZSxcbiAgICAgICAgc3ludGhldGljRXhjZXB0aW9uLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9pbnZva2VDbGllbnQoJ2NhcHR1cmVNZXNzYWdlJywgbWVzc2FnZSwgbGV2ZWwsIHtcbiAgICAgIC4uLmZpbmFsSGludCxcbiAgICAgIGV2ZW50X2lkOiBldmVudElkLFxuICAgIH0pO1xuICAgIHJldHVybiBldmVudElkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgY2FwdHVyZUV2ZW50KGV2ZW50OiBFdmVudCwgaGludD86IEV2ZW50SGludCk6IHN0cmluZyB7XG4gICAgY29uc3QgZXZlbnRJZCA9IHV1aWQ0KCk7XG4gICAgaWYgKGV2ZW50LnR5cGUgIT09ICd0cmFuc2FjdGlvbicpIHtcbiAgICAgIHRoaXMuX2xhc3RFdmVudElkID0gZXZlbnRJZDtcbiAgICB9XG5cbiAgICB0aGlzLl9pbnZva2VDbGllbnQoJ2NhcHR1cmVFdmVudCcsIGV2ZW50LCB7XG4gICAgICAuLi5oaW50LFxuICAgICAgZXZlbnRfaWQ6IGV2ZW50SWQsXG4gICAgfSk7XG4gICAgcmV0dXJuIGV2ZW50SWQ7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBsYXN0RXZlbnRJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9sYXN0RXZlbnRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGFkZEJyZWFkY3J1bWIoYnJlYWRjcnVtYjogQnJlYWRjcnVtYiwgaGludD86IEJyZWFkY3J1bWJIaW50KTogdm9pZCB7XG4gICAgY29uc3QgeyBzY29wZSwgY2xpZW50IH0gPSB0aGlzLmdldFN0YWNrVG9wKCk7XG5cbiAgICBpZiAoIXNjb3BlIHx8ICFjbGllbnQpIHJldHVybjtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2RcbiAgICBjb25zdCB7IGJlZm9yZUJyZWFkY3J1bWIgPSBudWxsLCBtYXhCcmVhZGNydW1icyA9IERFRkFVTFRfQlJFQURDUlVNQlMgfSA9XG4gICAgICAoY2xpZW50LmdldE9wdGlvbnMgJiYgY2xpZW50LmdldE9wdGlvbnMoKSkgfHwge307XG5cbiAgICBpZiAobWF4QnJlYWRjcnVtYnMgPD0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgdGltZXN0YW1wID0gZGF0ZVRpbWVzdGFtcEluU2Vjb25kcygpO1xuICAgIGNvbnN0IG1lcmdlZEJyZWFkY3J1bWIgPSB7IHRpbWVzdGFtcCwgLi4uYnJlYWRjcnVtYiB9O1xuICAgIGNvbnN0IGZpbmFsQnJlYWRjcnVtYiA9IGJlZm9yZUJyZWFkY3J1bWJcbiAgICAgID8gKGNvbnNvbGVTYW5kYm94KCgpID0+IGJlZm9yZUJyZWFkY3J1bWIobWVyZ2VkQnJlYWRjcnVtYiwgaGludCkpIGFzIEJyZWFkY3J1bWIgfCBudWxsKVxuICAgICAgOiBtZXJnZWRCcmVhZGNydW1iO1xuXG4gICAgaWYgKGZpbmFsQnJlYWRjcnVtYiA9PT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgc2NvcGUuYWRkQnJlYWRjcnVtYihmaW5hbEJyZWFkY3J1bWIsIG1heEJyZWFkY3J1bWJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldFVzZXIodXNlcjogVXNlciB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuZ2V0U2NvcGUoKTtcbiAgICBpZiAoc2NvcGUpIHNjb3BlLnNldFVzZXIodXNlcik7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXRUYWdzKHRhZ3M6IHsgW2tleTogc3RyaW5nXTogUHJpbWl0aXZlIH0pOiB2b2lkIHtcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuZ2V0U2NvcGUoKTtcbiAgICBpZiAoc2NvcGUpIHNjb3BlLnNldFRhZ3ModGFncyk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXRFeHRyYXMoZXh0cmFzOiBFeHRyYXMpOiB2b2lkIHtcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuZ2V0U2NvcGUoKTtcbiAgICBpZiAoc2NvcGUpIHNjb3BlLnNldEV4dHJhcyhleHRyYXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0VGFnKGtleTogc3RyaW5nLCB2YWx1ZTogUHJpbWl0aXZlKTogdm9pZCB7XG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLmdldFNjb3BlKCk7XG4gICAgaWYgKHNjb3BlKSBzY29wZS5zZXRUYWcoa2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXRFeHRyYShrZXk6IHN0cmluZywgZXh0cmE6IEV4dHJhKTogdm9pZCB7XG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLmdldFNjb3BlKCk7XG4gICAgaWYgKHNjb3BlKSBzY29wZS5zZXRFeHRyYShrZXksIGV4dHJhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHVibGljIHNldENvbnRleHQobmFtZTogc3RyaW5nLCBjb250ZXh0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5nZXRTY29wZSgpO1xuICAgIGlmIChzY29wZSkgc2NvcGUuc2V0Q29udGV4dChuYW1lLCBjb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNvbmZpZ3VyZVNjb3BlKGNhbGxiYWNrOiAoc2NvcGU6IFNjb3BlKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3QgeyBzY29wZSwgY2xpZW50IH0gPSB0aGlzLmdldFN0YWNrVG9wKCk7XG4gICAgaWYgKHNjb3BlICYmIGNsaWVudCkge1xuICAgICAgY2FsbGJhY2soc2NvcGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHJ1bihjYWxsYmFjazogKGh1YjogSHViKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3Qgb2xkSHViID0gbWFrZU1haW4odGhpcyk7XG4gICAgdHJ5IHtcbiAgICAgIGNhbGxiYWNrKHRoaXMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBtYWtlTWFpbihvbGRIdWIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGdldEludGVncmF0aW9uPFQgZXh0ZW5kcyBJbnRlZ3JhdGlvbj4oaW50ZWdyYXRpb246IEludGVncmF0aW9uQ2xhc3M8VD4pOiBUIHwgbnVsbCB7XG4gICAgY29uc3QgY2xpZW50ID0gdGhpcy5nZXRDbGllbnQoKTtcbiAgICBpZiAoIWNsaWVudCkgcmV0dXJuIG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBjbGllbnQuZ2V0SW50ZWdyYXRpb24oaW50ZWdyYXRpb24pO1xuICAgIH0gY2F0Y2ggKF9vTykge1xuICAgICAgbG9nZ2VyLndhcm4oYENhbm5vdCByZXRyaWV2ZSBpbnRlZ3JhdGlvbiAke2ludGVncmF0aW9uLmlkfSBmcm9tIHRoZSBjdXJyZW50IEh1YmApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3RhcnRTcGFuKGNvbnRleHQ6IFNwYW5Db250ZXh0KTogU3BhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxFeHRlbnNpb25NZXRob2QoJ3N0YXJ0U3BhbicsIGNvbnRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3RhcnRUcmFuc2FjdGlvbihjb250ZXh0OiBUcmFuc2FjdGlvbkNvbnRleHQsIGN1c3RvbVNhbXBsaW5nQ29udGV4dD86IEN1c3RvbVNhbXBsaW5nQ29udGV4dCk6IFRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbEV4dGVuc2lvbk1ldGhvZCgnc3RhcnRUcmFuc2FjdGlvbicsIGNvbnRleHQsIGN1c3RvbVNhbXBsaW5nQ29udGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyB0cmFjZUhlYWRlcnMoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxFeHRlbnNpb25NZXRob2Q8eyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfT4oJ3RyYWNlSGVhZGVycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgY2FwdHVyZVNlc3Npb24oZW5kU2Vzc2lvbjogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgLy8gYm90aCBzZW5kIHRoZSB1cGRhdGUgYW5kIHB1bGwgdGhlIHNlc3Npb24gZnJvbSB0aGUgc2NvcGVcbiAgICBpZiAoZW5kU2Vzc2lvbikge1xuICAgICAgcmV0dXJuIHRoaXMuZW5kU2Vzc2lvbigpO1xuICAgIH1cblxuICAgIC8vIG9ubHkgc2VuZCB0aGUgdXBkYXRlXG4gICAgdGhpcy5fc2VuZFNlc3Npb25VcGRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGVuZFNlc3Npb24oKTogdm9pZCB7XG4gICAgdGhpcy5nZXRTdGFja1RvcCgpXG4gICAgICA/LnNjb3BlPy5nZXRTZXNzaW9uKClcbiAgICAgID8uY2xvc2UoKTtcbiAgICB0aGlzLl9zZW5kU2Vzc2lvblVwZGF0ZSgpO1xuXG4gICAgLy8gdGhlIHNlc3Npb24gaXMgb3ZlcjsgdGFrZSBpdCBvZmYgb2YgdGhlIHNjb3BlXG4gICAgdGhpcy5nZXRTdGFja1RvcCgpPy5zY29wZT8uc2V0U2Vzc2lvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3RhcnRTZXNzaW9uKGNvbnRleHQ/OiBTZXNzaW9uQ29udGV4dCk6IFNlc3Npb24ge1xuICAgIGNvbnN0IHsgc2NvcGUsIGNsaWVudCB9ID0gdGhpcy5nZXRTdGFja1RvcCgpO1xuICAgIGNvbnN0IHsgcmVsZWFzZSwgZW52aXJvbm1lbnQgfSA9IChjbGllbnQgJiYgY2xpZW50LmdldE9wdGlvbnMoKSkgfHwge307XG5cbiAgICAvLyBXaWxsIGZldGNoIHVzZXJBZ2VudCBpZiBjYWxsZWQgZnJvbSBicm93c2VyIHNka1xuICAgIGNvbnN0IGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdDx7IG5hdmlnYXRvcj86IHsgdXNlckFnZW50Pzogc3RyaW5nIH0gfT4oKTtcbiAgICBjb25zdCB7IHVzZXJBZ2VudCB9ID0gZ2xvYmFsLm5hdmlnYXRvciB8fCB7fTtcblxuICAgIGNvbnN0IHNlc3Npb24gPSBuZXcgU2Vzc2lvbih7XG4gICAgICByZWxlYXNlLFxuICAgICAgZW52aXJvbm1lbnQsXG4gICAgICAuLi4oc2NvcGUgJiYgeyB1c2VyOiBzY29wZS5nZXRVc2VyKCkgfSksXG4gICAgICAuLi4odXNlckFnZW50ICYmIHsgdXNlckFnZW50IH0pLFxuICAgICAgLi4uY29udGV4dCxcbiAgICB9KTtcblxuICAgIGlmIChzY29wZSkge1xuICAgICAgLy8gRW5kIGV4aXN0aW5nIHNlc3Npb24gaWYgdGhlcmUncyBvbmVcbiAgICAgIGNvbnN0IGN1cnJlbnRTZXNzaW9uID0gc2NvcGUuZ2V0U2Vzc2lvbiAmJiBzY29wZS5nZXRTZXNzaW9uKCk7XG4gICAgICBpZiAoY3VycmVudFNlc3Npb24gJiYgY3VycmVudFNlc3Npb24uc3RhdHVzID09PSBTZXNzaW9uU3RhdHVzLk9rKSB7XG4gICAgICAgIGN1cnJlbnRTZXNzaW9uLnVwZGF0ZSh7IHN0YXR1czogU2Vzc2lvblN0YXR1cy5FeGl0ZWQgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmVuZFNlc3Npb24oKTtcblxuICAgICAgLy8gQWZ0ZXJ3YXJkcyB3ZSBzZXQgdGhlIG5ldyBzZXNzaW9uIG9uIHRoZSBzY29wZVxuICAgICAgc2NvcGUuc2V0U2Vzc2lvbihzZXNzaW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2Vzc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyB0aGUgY3VycmVudCBTZXNzaW9uIG9uIHRoZSBzY29wZVxuICAgKi9cbiAgcHJpdmF0ZSBfc2VuZFNlc3Npb25VcGRhdGUoKTogdm9pZCB7XG4gICAgY29uc3QgeyBzY29wZSwgY2xpZW50IH0gPSB0aGlzLmdldFN0YWNrVG9wKCk7XG4gICAgaWYgKCFzY29wZSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2Vzc2lvbiA9IHNjb3BlLmdldFNlc3Npb24gJiYgc2NvcGUuZ2V0U2Vzc2lvbigpO1xuICAgIGlmIChzZXNzaW9uKSB7XG4gICAgICBpZiAoY2xpZW50ICYmIGNsaWVudC5jYXB0dXJlU2Vzc2lvbikge1xuICAgICAgICBjbGllbnQuY2FwdHVyZVNlc3Npb24oc2Vzc2lvbik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIGhlbHBlciBmdW5jdGlvbiB0byBjYWxsIGEgbWV0aG9kIG9uIHRoZSB0b3AgY2xpZW50IGlmIGl0IGV4aXN0cy5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZCBUaGUgbWV0aG9kIHRvIGNhbGwgb24gdGhlIGNsaWVudC5cbiAgICogQHBhcmFtIGFyZ3MgQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNsaWVudCBmdW5jdGlvbi5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgX2ludm9rZUNsaWVudDxNIGV4dGVuZHMga2V5b2YgQ2xpZW50PihtZXRob2Q6IE0sIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgY29uc3QgeyBzY29wZSwgY2xpZW50IH0gPSB0aGlzLmdldFN0YWNrVG9wKCk7XG4gICAgaWYgKGNsaWVudCAmJiBjbGllbnRbbWV0aG9kXSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgKGNsaWVudCBhcyBhbnkpW21ldGhvZF0oLi4uYXJncywgc2NvcGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyBnbG9iYWwgZXh0ZW5zaW9uIG1ldGhvZCBhbmQgYmluZGluZyBjdXJyZW50IGluc3RhbmNlIHRvIHRoZSBmdW5jdGlvbiBjYWxsXG4gICAqL1xuICAvLyBAdHMtaWdub3JlIEZ1bmN0aW9uIGxhY2tzIGVuZGluZyByZXR1cm4gc3RhdGVtZW50IGFuZCByZXR1cm4gdHlwZSBkb2VzIG5vdCBpbmNsdWRlICd1bmRlZmluZWQnLiB0cygyMzY2KVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIF9jYWxsRXh0ZW5zaW9uTWV0aG9kPFQ+KG1ldGhvZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFQge1xuICAgIGNvbnN0IGNhcnJpZXIgPSBnZXRNYWluQ2FycmllcigpO1xuICAgIGNvbnN0IHNlbnRyeSA9IGNhcnJpZXIuX19TRU5UUllfXztcbiAgICBpZiAoc2VudHJ5ICYmIHNlbnRyeS5leHRlbnNpb25zICYmIHR5cGVvZiBzZW50cnkuZXh0ZW5zaW9uc1ttZXRob2RdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gc2VudHJ5LmV4dGVuc2lvbnNbbWV0aG9kXS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG4gICAgbG9nZ2VyLndhcm4oYEV4dGVuc2lvbiBtZXRob2QgJHttZXRob2R9IGNvdWxkbid0IGJlIGZvdW5kLCBkb2luZyBub3RoaW5nLmApO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZ2xvYmFsIHNoaW0gcmVnaXN0cnkuXG4gKlxuICogRklYTUU6IFRoaXMgZnVuY3Rpb24gaXMgcHJvYmxlbWF0aWMsIGJlY2F1c2UgZGVzcGl0ZSBhbHdheXMgcmV0dXJuaW5nIGEgdmFsaWQgQ2FycmllcixcbiAqIGl0IGhhcyBhbiBvcHRpb25hbCBgX19TRU5UUllfX2AgcHJvcGVydHksIHdoaWNoIHRoZW4gaW4gdHVybiByZXF1aXJlcyB1cyB0byBhbHdheXMgcGVyZm9ybSBhbiB1bm5lY2Vzc2FyeSBjaGVja1xuICogYXQgdGhlIGNhbGwtc2l0ZS4gV2UgYWx3YXlzIGFjY2VzcyB0aGUgY2FycmllciB0aHJvdWdoIHRoaXMgZnVuY3Rpb24sIHNvIHdlIGNhbiBndWFyYW50ZWUgdGhhdCBgX19TRU5UUllfX2AgaXMgdGhlcmUuXG4gKiovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFpbkNhcnJpZXIoKTogQ2FycmllciB7XG4gIGNvbnN0IGNhcnJpZXIgPSBnZXRHbG9iYWxPYmplY3QoKTtcbiAgY2Fycmllci5fX1NFTlRSWV9fID0gY2Fycmllci5fX1NFTlRSWV9fIHx8IHtcbiAgICBleHRlbnNpb25zOiB7fSxcbiAgICBodWI6IHVuZGVmaW5lZCxcbiAgfTtcbiAgcmV0dXJuIGNhcnJpZXI7XG59XG5cbi8qKlxuICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgbWFpbiBodWIgd2l0aCB0aGUgcGFzc2VkIG9uZSBvbiB0aGUgZ2xvYmFsIG9iamVjdFxuICpcbiAqIEByZXR1cm5zIFRoZSBvbGQgcmVwbGFjZWQgaHViXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlTWFpbihodWI6IEh1Yik6IEh1YiB7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gZ2V0TWFpbkNhcnJpZXIoKTtcbiAgY29uc3Qgb2xkSHViID0gZ2V0SHViRnJvbUNhcnJpZXIocmVnaXN0cnkpO1xuICBzZXRIdWJPbkNhcnJpZXIocmVnaXN0cnksIGh1Yik7XG4gIHJldHVybiBvbGRIdWI7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZGVmYXVsdCBodWIgaW5zdGFuY2UuXG4gKlxuICogSWYgYSBodWIgaXMgYWxyZWFkeSByZWdpc3RlcmVkIGluIHRoZSBnbG9iYWwgY2FycmllciBidXQgdGhpcyBtb2R1bGVcbiAqIGNvbnRhaW5zIGEgbW9yZSByZWNlbnQgdmVyc2lvbiwgaXQgcmVwbGFjZXMgdGhlIHJlZ2lzdGVyZWQgdmVyc2lvbi5cbiAqIE90aGVyd2lzZSwgdGhlIGN1cnJlbnRseSByZWdpc3RlcmVkIGh1YiB3aWxsIGJlIHJldHVybmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudEh1YigpOiBIdWIge1xuICAvLyBHZXQgbWFpbiBjYXJyaWVyIChnbG9iYWwgZm9yIGV2ZXJ5IGVudmlyb25tZW50KVxuICBjb25zdCByZWdpc3RyeSA9IGdldE1haW5DYXJyaWVyKCk7XG5cbiAgLy8gSWYgdGhlcmUncyBubyBodWIsIG9yIGl0cyBhbiBvbGQgQVBJLCBhc3NpZ24gYSBuZXcgb25lXG4gIGlmICghaGFzSHViT25DYXJyaWVyKHJlZ2lzdHJ5KSB8fCBnZXRIdWJGcm9tQ2FycmllcihyZWdpc3RyeSkuaXNPbGRlclRoYW4oQVBJX1ZFUlNJT04pKSB7XG4gICAgc2V0SHViT25DYXJyaWVyKHJlZ2lzdHJ5LCBuZXcgSHViKCkpO1xuICB9XG5cbiAgLy8gUHJlZmVyIGRvbWFpbnMgb3ZlciBnbG9iYWwgaWYgdGhleSBhcmUgdGhlcmUgKGFwcGxpY2FibGUgb25seSB0byBOb2RlIGVudmlyb25tZW50KVxuICBpZiAoaXNOb2RlRW52KCkpIHtcbiAgICByZXR1cm4gZ2V0SHViRnJvbUFjdGl2ZURvbWFpbihyZWdpc3RyeSk7XG4gIH1cbiAgLy8gUmV0dXJuIGh1YiB0aGF0IGxpdmVzIG9uIGEgZ2xvYmFsIG9iamVjdFxuICByZXR1cm4gZ2V0SHViRnJvbUNhcnJpZXIocmVnaXN0cnkpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGFjdGl2ZSBkb21haW4sIGlmIG9uZSBleGlzdHNcbiAqIEBkZXByZWNhdGVkIE5vIGxvbmdlciB1c2VkOyByZW1vdmUgaW4gdjdcbiAqIEByZXR1cm5zIFRoZSBkb21haW4sIG9yIHVuZGVmaW5lZCBpZiB0aGVyZSBpcyBubyBhY3RpdmUgZG9tYWluXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGl2ZURvbWFpbigpOiBEb21haW5Bc0NhcnJpZXIgfCB1bmRlZmluZWQge1xuICBsb2dnZXIud2FybignRnVuY3Rpb24gYGdldEFjdGl2ZURvbWFpbmAgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uJyk7XG5cbiAgY29uc3Qgc2VudHJ5ID0gZ2V0TWFpbkNhcnJpZXIoKS5fX1NFTlRSWV9fO1xuXG4gIHJldHVybiBzZW50cnkgJiYgc2VudHJ5LmV4dGVuc2lvbnMgJiYgc2VudHJ5LmV4dGVuc2lvbnMuZG9tYWluICYmIHNlbnRyeS5leHRlbnNpb25zLmRvbWFpbi5hY3RpdmU7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgdGhlIGh1YiBmcm9tIGFuIGFjdGl2ZSBkb21haW4sIGFuZCBmYWxsYmFjayB0byB0aGUgcmVnaXN0cnkgaWYgb25lIGRvZXNuJ3QgZXhpc3RcbiAqIEByZXR1cm5zIGRpc2NvdmVyZWQgaHViXG4gKi9cbmZ1bmN0aW9uIGdldEh1YkZyb21BY3RpdmVEb21haW4ocmVnaXN0cnk6IENhcnJpZXIpOiBIdWIge1xuICB0cnkge1xuICAgIGNvbnN0IGFjdGl2ZURvbWFpbiA9IGdldE1haW5DYXJyaWVyKCkuX19TRU5UUllfXz8uZXh0ZW5zaW9ucz8uZG9tYWluPy5hY3RpdmU7XG5cbiAgICAvLyBJZiB0aGVyZSdzIG5vIGFjdGl2ZSBkb21haW4sIGp1c3QgcmV0dXJuIGdsb2JhbCBodWJcbiAgICBpZiAoIWFjdGl2ZURvbWFpbikge1xuICAgICAgcmV0dXJuIGdldEh1YkZyb21DYXJyaWVyKHJlZ2lzdHJ5KTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSdzIG5vIGh1YiBvbiBjdXJyZW50IGRvbWFpbiwgb3IgaXQncyBhbiBvbGQgQVBJLCBhc3NpZ24gYSBuZXcgb25lXG4gICAgaWYgKCFoYXNIdWJPbkNhcnJpZXIoYWN0aXZlRG9tYWluKSB8fCBnZXRIdWJGcm9tQ2FycmllcihhY3RpdmVEb21haW4pLmlzT2xkZXJUaGFuKEFQSV9WRVJTSU9OKSkge1xuICAgICAgY29uc3QgcmVnaXN0cnlIdWJUb3BTdGFjayA9IGdldEh1YkZyb21DYXJyaWVyKHJlZ2lzdHJ5KS5nZXRTdGFja1RvcCgpO1xuICAgICAgc2V0SHViT25DYXJyaWVyKGFjdGl2ZURvbWFpbiwgbmV3IEh1YihyZWdpc3RyeUh1YlRvcFN0YWNrLmNsaWVudCwgU2NvcGUuY2xvbmUocmVnaXN0cnlIdWJUb3BTdGFjay5zY29wZSkpKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gaHViIHRoYXQgbGl2ZXMgb24gYSBkb21haW5cbiAgICByZXR1cm4gZ2V0SHViRnJvbUNhcnJpZXIoYWN0aXZlRG9tYWluKTtcbiAgfSBjYXRjaCAoX09vKSB7XG4gICAgLy8gUmV0dXJuIGh1YiB0aGF0IGxpdmVzIG9uIGEgZ2xvYmFsIG9iamVjdFxuICAgIHJldHVybiBnZXRIdWJGcm9tQ2FycmllcihyZWdpc3RyeSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIHdpbGwgdGVsbCB3aGV0aGVyIGEgY2FycmllciBoYXMgYSBodWIgb24gaXQgb3Igbm90XG4gKiBAcGFyYW0gY2FycmllciBvYmplY3RcbiAqL1xuZnVuY3Rpb24gaGFzSHViT25DYXJyaWVyKGNhcnJpZXI6IENhcnJpZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhKGNhcnJpZXIgJiYgY2Fycmllci5fX1NFTlRSWV9fICYmIGNhcnJpZXIuX19TRU5UUllfXy5odWIpO1xufVxuXG4vKipcbiAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcge0BsaW5rIEh1Yn0gYW5kIGFkZCB0byB0aGUgcGFzc2VkIG9iamVjdCBvblxuICogX19TRU5UUllfXy5odWIuXG4gKiBAcGFyYW0gY2FycmllciBvYmplY3RcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEh1YkZyb21DYXJyaWVyKGNhcnJpZXI6IENhcnJpZXIpOiBIdWIge1xuICBpZiAoY2FycmllciAmJiBjYXJyaWVyLl9fU0VOVFJZX18gJiYgY2Fycmllci5fX1NFTlRSWV9fLmh1YikgcmV0dXJuIGNhcnJpZXIuX19TRU5UUllfXy5odWI7XG4gIGNhcnJpZXIuX19TRU5UUllfXyA9IGNhcnJpZXIuX19TRU5UUllfXyB8fCB7fTtcbiAgY2Fycmllci5fX1NFTlRSWV9fLmh1YiA9IG5ldyBIdWIoKTtcbiAgcmV0dXJuIGNhcnJpZXIuX19TRU5UUllfXy5odWI7XG59XG5cbi8qKlxuICogVGhpcyB3aWxsIHNldCBwYXNzZWQge0BsaW5rIEh1Yn0gb24gdGhlIHBhc3NlZCBvYmplY3QncyBfX1NFTlRSWV9fLmh1YiBhdHRyaWJ1dGVcbiAqIEBwYXJhbSBjYXJyaWVyIG9iamVjdFxuICogQHBhcmFtIGh1YiBIdWJcbiAqIEByZXR1cm5zIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHN1Y2Nlc3Mgb3IgZmFpbHVyZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SHViT25DYXJyaWVyKGNhcnJpZXI6IENhcnJpZXIsIGh1YjogSHViKTogYm9vbGVhbiB7XG4gIGlmICghY2FycmllcikgcmV0dXJuIGZhbHNlO1xuICBjYXJyaWVyLl9fU0VOVFJZX18gPSBjYXJyaWVyLl9fU0VOVFJZX18gfHwge307XG4gIGNhcnJpZXIuX19TRU5UUllfXy5odWIgPSBodWI7XG4gIHJldHVybiB0cnVlO1xufVxuIiwgImltcG9ydCB7XG4gIEFnZ3JlZ2F0aW9uQ291bnRzLFxuICBSZXF1ZXN0U2Vzc2lvblN0YXR1cyxcbiAgU2Vzc2lvbkFnZ3JlZ2F0ZXMsXG4gIFNlc3Npb25GbHVzaGVyTGlrZSxcbiAgVHJhbnNwb3J0LFxufSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGRyb3BVbmRlZmluZWRLZXlzLCBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW1wb3J0IHsgZ2V0Q3VycmVudEh1YiB9IGZyb20gJy4vaHViJztcblxudHlwZSBSZWxlYXNlSGVhbHRoQXR0cmlidXRlcyA9IHtcbiAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gIHJlbGVhc2U6IHN0cmluZztcbn07XG5cbi8qKlxuICogQGluaGVyaXRkb2NcbiAqL1xuZXhwb3J0IGNsYXNzIFNlc3Npb25GbHVzaGVyIGltcGxlbWVudHMgU2Vzc2lvbkZsdXNoZXJMaWtlIHtcbiAgcHVibGljIHJlYWRvbmx5IGZsdXNoVGltZW91dDogbnVtYmVyID0gNjA7XG4gIHByaXZhdGUgX3BlbmRpbmdBZ2dyZWdhdGVzOiBSZWNvcmQ8bnVtYmVyLCBBZ2dyZWdhdGlvbkNvdW50cz4gPSB7fTtcbiAgcHJpdmF0ZSBfc2Vzc2lvbkF0dHJzOiBSZWxlYXNlSGVhbHRoQXR0cmlidXRlcztcbiAgcHJpdmF0ZSBfaW50ZXJ2YWxJZDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+O1xuICBwcml2YXRlIF9pc0VuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIF90cmFuc3BvcnQ6IFRyYW5zcG9ydDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IodHJhbnNwb3J0OiBUcmFuc3BvcnQsIGF0dHJzOiBSZWxlYXNlSGVhbHRoQXR0cmlidXRlcykge1xuICAgIHRoaXMuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydDtcbiAgICAvLyBDYWxsIHRvIHNldEludGVydmFsLCBzbyB0aGF0IGZsdXNoIGlzIGNhbGxlZCBldmVyeSA2MCBzZWNvbmRzXG4gICAgdGhpcy5faW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHRoaXMuZmx1c2goKSwgdGhpcy5mbHVzaFRpbWVvdXQgKiAxMDAwKTtcbiAgICB0aGlzLl9zZXNzaW9uQXR0cnMgPSBhdHRycztcbiAgfVxuXG4gIC8qKiBTZW5kcyBzZXNzaW9uIGFnZ3JlZ2F0ZXMgdG8gVHJhbnNwb3J0ICovXG4gIHB1YmxpYyBzZW5kU2Vzc2lvbkFnZ3JlZ2F0ZXMoc2Vzc2lvbkFnZ3JlZ2F0ZXM6IFNlc3Npb25BZ2dyZWdhdGVzKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl90cmFuc3BvcnQuc2VuZFNlc3Npb24pIHtcbiAgICAgIGxvZ2dlci53YXJuKFwiRHJvcHBpbmcgc2Vzc2lvbiBiZWNhdXNlIGN1c3RvbSB0cmFuc3BvcnQgZG9lc24ndCBpbXBsZW1lbnQgc2VuZFNlc3Npb25cIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZvaWQgdGhpcy5fdHJhbnNwb3J0LnNlbmRTZXNzaW9uKHNlc3Npb25BZ2dyZWdhdGVzKS50aGVuKG51bGwsIHJlYXNvbiA9PiB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIHdoaWxlIHNlbmRpbmcgc2Vzc2lvbjogJHtyZWFzb259YCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQ2hlY2tzIGlmIGBwZW5kaW5nQWdncmVnYXRlc2AgaGFzIGVudHJpZXMsIGFuZCBpZiBpdCBkb2VzIGZsdXNoZXMgdGhlbSBieSBjYWxsaW5nIGBzZW5kU2Vzc2lvbnNgICovXG4gIHB1YmxpYyBmbHVzaCgpOiB2b2lkIHtcbiAgICBjb25zdCBzZXNzaW9uQWdncmVnYXRlcyA9IHRoaXMuZ2V0U2Vzc2lvbkFnZ3JlZ2F0ZXMoKTtcbiAgICBpZiAoc2Vzc2lvbkFnZ3JlZ2F0ZXMuYWdncmVnYXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fcGVuZGluZ0FnZ3JlZ2F0ZXMgPSB7fTtcbiAgICB0aGlzLnNlbmRTZXNzaW9uQWdncmVnYXRlcyhzZXNzaW9uQWdncmVnYXRlcyk7XG4gIH1cblxuICAvKiogTWFzc2FnZXMgdGhlIGVudHJpZXMgaW4gYHBlbmRpbmdBZ2dyZWdhdGVzYCBhbmQgcmV0dXJucyBhZ2dyZWdhdGVkIHNlc3Npb25zICovXG4gIHB1YmxpYyBnZXRTZXNzaW9uQWdncmVnYXRlcygpOiBTZXNzaW9uQWdncmVnYXRlcyB7XG4gICAgY29uc3QgYWdncmVnYXRlczogQWdncmVnYXRpb25Db3VudHNbXSA9IE9iamVjdC5rZXlzKHRoaXMuX3BlbmRpbmdBZ2dyZWdhdGVzKS5tYXAoKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5fcGVuZGluZ0FnZ3JlZ2F0ZXNbcGFyc2VJbnQoa2V5KV07XG4gICAgfSk7XG5cbiAgICBjb25zdCBzZXNzaW9uQWdncmVnYXRlczogU2Vzc2lvbkFnZ3JlZ2F0ZXMgPSB7XG4gICAgICBhdHRyczogdGhpcy5fc2Vzc2lvbkF0dHJzLFxuICAgICAgYWdncmVnYXRlcyxcbiAgICB9O1xuICAgIHJldHVybiBkcm9wVW5kZWZpbmVkS2V5cyhzZXNzaW9uQWdncmVnYXRlcyk7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHVibGljIGNsb3NlKCk6IHZvaWQge1xuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5faW50ZXJ2YWxJZCk7XG4gICAgdGhpcy5faXNFbmFibGVkID0gZmFsc2U7XG4gICAgdGhpcy5mbHVzaCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXBwZXIgZnVuY3Rpb24gZm9yIF9pbmNyZW1lbnRTZXNzaW9uU3RhdHVzQ291bnQgdGhhdCBjaGVja3MgaWYgdGhlIGluc3RhbmNlIG9mIFNlc3Npb25GbHVzaGVyIGlzIGVuYWJsZWQgdGhlblxuICAgKiBmZXRjaGVzIHRoZSBzZXNzaW9uIHN0YXR1cyBvZiB0aGUgcmVxdWVzdCBmcm9tIGBTY29wZS5nZXRSZXF1ZXN0U2Vzc2lvbigpLnN0YXR1c2Agb24gdGhlIHNjb3BlIGFuZCBwYXNzZXMgdGhlbSB0b1xuICAgKiBgX2luY3JlbWVudFNlc3Npb25TdGF0dXNDb3VudGAgYWxvbmcgd2l0aCB0aGUgc3RhcnQgZGF0ZVxuICAgKi9cbiAgcHVibGljIGluY3JlbWVudFNlc3Npb25TdGF0dXNDb3VudCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzY29wZSA9IGdldEN1cnJlbnRIdWIoKS5nZXRTY29wZSgpO1xuICAgIGNvbnN0IHJlcXVlc3RTZXNzaW9uID0gc2NvcGU/LmdldFJlcXVlc3RTZXNzaW9uKCk7XG5cbiAgICBpZiAocmVxdWVzdFNlc3Npb24gJiYgcmVxdWVzdFNlc3Npb24uc3RhdHVzKSB7XG4gICAgICB0aGlzLl9pbmNyZW1lbnRTZXNzaW9uU3RhdHVzQ291bnQocmVxdWVzdFNlc3Npb24uc3RhdHVzLCBuZXcgRGF0ZSgpKTtcbiAgICAgIC8vIFRoaXMgaXMgbm90IGVudGlyZWx5IG5lY2Vzc2FyaWx5IGJ1dCBpcyBhZGRlZCBhcyBhIHNhZmUgZ3VhcmQgdG8gaW5kaWNhdGUgdGhlIGJvdW5kcyBvZiBhIHJlcXVlc3QgYW5kIHNvIGluXG4gICAgICAvLyBjYXNlIGNhcHR1cmVSZXF1ZXN0U2Vzc2lvbiBpcyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UgdG8gcHJldmVudCBkb3VibGUgY291bnRcbiAgICAgIHNjb3BlPy5zZXRSZXF1ZXN0U2Vzc2lvbih1bmRlZmluZWQpO1xuXG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbmNyZW1lbnRzIHN0YXR1cyBidWNrZXQgaW4gcGVuZGluZ0FnZ3JlZ2F0ZXMgYnVmZmVyIChpbnRlcm5hbCBzdGF0ZSkgY29ycmVzcG9uZGluZyB0byBzdGF0dXMgb2ZcbiAgICogdGhlIHNlc3Npb24gcmVjZWl2ZWRcbiAgICovXG4gIHByaXZhdGUgX2luY3JlbWVudFNlc3Npb25TdGF0dXNDb3VudChzdGF0dXM6IFJlcXVlc3RTZXNzaW9uU3RhdHVzLCBkYXRlOiBEYXRlKTogbnVtYmVyIHtcbiAgICAvLyBUcnVuY2F0ZSBtaW51dGVzIGFuZCBzZWNvbmRzIG9uIFNlc3Npb24gU3RhcnRlZCBhdHRyaWJ1dGUgdG8gaGF2ZSBvbmUgbWludXRlIGJ1Y2tldCBrZXlzXG4gICAgY29uc3Qgc2Vzc2lvblN0YXJ0ZWRUcnVuYyA9IG5ldyBEYXRlKGRhdGUpLnNldFNlY29uZHMoMCwgMCk7XG4gICAgdGhpcy5fcGVuZGluZ0FnZ3JlZ2F0ZXNbc2Vzc2lvblN0YXJ0ZWRUcnVuY10gPSB0aGlzLl9wZW5kaW5nQWdncmVnYXRlc1tzZXNzaW9uU3RhcnRlZFRydW5jXSB8fCB7fTtcblxuICAgIC8vIGNvcnJlc3BvbmRzIHRvIGFnZ3JlZ2F0ZWQgc2Vzc2lvbnMgaW4gb25lIHNwZWNpZmljIG1pbnV0ZSBidWNrZXRcbiAgICAvLyBmb3IgZXhhbXBsZSwge1wic3RhcnRlZFwiOlwiMjAyMS0wMy0xNlQwODowMDowMC4wMDBaXCIsXCJleGl0ZWRcIjo0LCBcImVycm9yZWRcIjogMX1cbiAgICBjb25zdCBhZ2dyZWdhdGlvbkNvdW50czogQWdncmVnYXRpb25Db3VudHMgPSB0aGlzLl9wZW5kaW5nQWdncmVnYXRlc1tzZXNzaW9uU3RhcnRlZFRydW5jXTtcbiAgICBpZiAoIWFnZ3JlZ2F0aW9uQ291bnRzLnN0YXJ0ZWQpIHtcbiAgICAgIGFnZ3JlZ2F0aW9uQ291bnRzLnN0YXJ0ZWQgPSBuZXcgRGF0ZShzZXNzaW9uU3RhcnRlZFRydW5jKS50b0lTT1N0cmluZygpO1xuICAgIH1cblxuICAgIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgICBjYXNlIFJlcXVlc3RTZXNzaW9uU3RhdHVzLkVycm9yZWQ6XG4gICAgICAgIGFnZ3JlZ2F0aW9uQ291bnRzLmVycm9yZWQgPSAoYWdncmVnYXRpb25Db3VudHMuZXJyb3JlZCB8fCAwKSArIDE7XG4gICAgICAgIHJldHVybiBhZ2dyZWdhdGlvbkNvdW50cy5lcnJvcmVkO1xuICAgICAgY2FzZSBSZXF1ZXN0U2Vzc2lvblN0YXR1cy5PazpcbiAgICAgICAgYWdncmVnYXRpb25Db3VudHMuZXhpdGVkID0gKGFnZ3JlZ2F0aW9uQ291bnRzLmV4aXRlZCB8fCAwKSArIDE7XG4gICAgICAgIHJldHVybiBhZ2dyZWdhdGlvbkNvdW50cy5leGl0ZWQ7XG4gICAgICBjYXNlIFJlcXVlc3RTZXNzaW9uU3RhdHVzLkNyYXNoZWQ6XG4gICAgICAgIGFnZ3JlZ2F0aW9uQ291bnRzLmNyYXNoZWQgPSAoYWdncmVnYXRpb25Db3VudHMuY3Jhc2hlZCB8fCAwKSArIDE7XG4gICAgICAgIHJldHVybiBhZ2dyZWdhdGlvbkNvdW50cy5jcmFzaGVkO1xuICAgIH1cbiAgfVxufVxuIiwgImV4cG9ydCB7IGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yLCBTY29wZSB9IGZyb20gJy4vc2NvcGUnO1xuZXhwb3J0IHsgU2Vzc2lvbiB9IGZyb20gJy4vc2Vzc2lvbic7XG5leHBvcnQgeyBTZXNzaW9uRmx1c2hlciB9IGZyb20gJy4vc2Vzc2lvbmZsdXNoZXInO1xuZXhwb3J0IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG4gIGdldEFjdGl2ZURvbWFpbixcbiAgZ2V0Q3VycmVudEh1YixcbiAgZ2V0SHViRnJvbUNhcnJpZXIsXG4gIGdldE1haW5DYXJyaWVyLFxuICBIdWIsXG4gIG1ha2VNYWluLFxuICBzZXRIdWJPbkNhcnJpZXIsXG4gIENhcnJpZXIsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuICBEb21haW5Bc0NhcnJpZXIsXG4gIExheWVyLFxufSBmcm9tICcuL2h1Yic7XG4iLCAiaW1wb3J0IHsgZ2V0Q3VycmVudEh1YiwgSHViLCBTY29wZSB9IGZyb20gJ0BzZW50cnkvaHViJztcbmltcG9ydCB7XG4gIEJyZWFkY3J1bWIsXG4gIENhcHR1cmVDb250ZXh0LFxuICBDdXN0b21TYW1wbGluZ0NvbnRleHQsXG4gIEV2ZW50LFxuICBFeHRyYSxcbiAgRXh0cmFzLFxuICBQcmltaXRpdmUsXG4gIFNldmVyaXR5LFxuICBUcmFuc2FjdGlvbixcbiAgVHJhbnNhY3Rpb25Db250ZXh0LFxuICBVc2VyLFxufSBmcm9tICdAc2VudHJ5L3R5cGVzJztcblxuLyoqXG4gKiBUaGlzIGNhbGxzIGEgZnVuY3Rpb24gb24gdGhlIGN1cnJlbnQgaHViLlxuICogQHBhcmFtIG1ldGhvZCBmdW5jdGlvbiB0byBjYWxsIG9uIGh1Yi5cbiAqIEBwYXJhbSBhcmdzIHRvIHBhc3MgdG8gZnVuY3Rpb24uXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5mdW5jdGlvbiBjYWxsT25IdWI8VD4obWV0aG9kOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogVCB7XG4gIGNvbnN0IGh1YiA9IGdldEN1cnJlbnRIdWIoKTtcbiAgaWYgKGh1YiAmJiBodWJbbWV0aG9kIGFzIGtleW9mIEh1Yl0pIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHJldHVybiAoaHViW21ldGhvZCBhcyBrZXlvZiBIdWJdIGFzIGFueSkoLi4uYXJncyk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBObyBodWIgZGVmaW5lZCBvciAke21ldGhvZH0gd2FzIG5vdCBmb3VuZCBvbiB0aGUgaHViLCBwbGVhc2Ugb3BlbiBhIGJ1ZyByZXBvcnQuYCk7XG59XG5cbi8qKlxuICogQ2FwdHVyZXMgYW4gZXhjZXB0aW9uIGV2ZW50IGFuZCBzZW5kcyBpdCB0byBTZW50cnkuXG4gKlxuICogQHBhcmFtIGV4Y2VwdGlvbiBBbiBleGNlcHRpb24tbGlrZSBvYmplY3QuXG4gKiBAcmV0dXJucyBUaGUgZ2VuZXJhdGVkIGV2ZW50SWQuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXG5leHBvcnQgZnVuY3Rpb24gY2FwdHVyZUV4Y2VwdGlvbihleGNlcHRpb246IGFueSwgY2FwdHVyZUNvbnRleHQ/OiBDYXB0dXJlQ29udGV4dCk6IHN0cmluZyB7XG4gIGxldCBzeW50aGV0aWNFeGNlcHRpb246IEVycm9yO1xuICB0cnkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2VudHJ5IHN5bnRoZXRpY0V4Y2VwdGlvbicpO1xuICB9IGNhdGNoIChleGNlcHRpb24pIHtcbiAgICBzeW50aGV0aWNFeGNlcHRpb24gPSBleGNlcHRpb24gYXMgRXJyb3I7XG4gIH1cbiAgcmV0dXJuIGNhbGxPbkh1YignY2FwdHVyZUV4Y2VwdGlvbicsIGV4Y2VwdGlvbiwge1xuICAgIGNhcHR1cmVDb250ZXh0LFxuICAgIG9yaWdpbmFsRXhjZXB0aW9uOiBleGNlcHRpb24sXG4gICAgc3ludGhldGljRXhjZXB0aW9uLFxuICB9KTtcbn1cblxuLyoqXG4gKiBDYXB0dXJlcyBhIG1lc3NhZ2UgZXZlbnQgYW5kIHNlbmRzIGl0IHRvIFNlbnRyeS5cbiAqXG4gKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzZW5kIHRvIFNlbnRyeS5cbiAqIEBwYXJhbSBsZXZlbCBEZWZpbmUgdGhlIGxldmVsIG9mIHRoZSBtZXNzYWdlLlxuICogQHJldHVybnMgVGhlIGdlbmVyYXRlZCBldmVudElkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FwdHVyZU1lc3NhZ2UobWVzc2FnZTogc3RyaW5nLCBjYXB0dXJlQ29udGV4dD86IENhcHR1cmVDb250ZXh0IHwgU2V2ZXJpdHkpOiBzdHJpbmcge1xuICBsZXQgc3ludGhldGljRXhjZXB0aW9uOiBFcnJvcjtcbiAgdHJ5IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgIHN5bnRoZXRpY0V4Y2VwdGlvbiA9IGV4Y2VwdGlvbiBhcyBFcnJvcjtcbiAgfVxuXG4gIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHByb3ZpZGUgZXhwbGljaXQgc2NvcGVzIHVwZ3JhZGUsIHdpdGhvdXQgY2hhbmdpbmcgdGhlIG9yaWdpbmFsXG4gIC8vIGFyaXR5IG9mIHRoZSBgY2FwdHVyZU1lc3NhZ2UobWVzc2FnZSwgbGV2ZWwpYCBtZXRob2QuXG4gIGNvbnN0IGxldmVsID0gdHlwZW9mIGNhcHR1cmVDb250ZXh0ID09PSAnc3RyaW5nJyA/IGNhcHR1cmVDb250ZXh0IDogdW5kZWZpbmVkO1xuICBjb25zdCBjb250ZXh0ID0gdHlwZW9mIGNhcHR1cmVDb250ZXh0ICE9PSAnc3RyaW5nJyA/IHsgY2FwdHVyZUNvbnRleHQgfSA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4gY2FsbE9uSHViKCdjYXB0dXJlTWVzc2FnZScsIG1lc3NhZ2UsIGxldmVsLCB7XG4gICAgb3JpZ2luYWxFeGNlcHRpb246IG1lc3NhZ2UsXG4gICAgc3ludGhldGljRXhjZXB0aW9uLFxuICAgIC4uLmNvbnRleHQsXG4gIH0pO1xufVxuXG4vKipcbiAqIENhcHR1cmVzIGEgbWFudWFsbHkgY3JlYXRlZCBldmVudCBhbmQgc2VuZHMgaXQgdG8gU2VudHJ5LlxuICpcbiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gc2VuZCB0byBTZW50cnkuXG4gKiBAcmV0dXJucyBUaGUgZ2VuZXJhdGVkIGV2ZW50SWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXB0dXJlRXZlbnQoZXZlbnQ6IEV2ZW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIGNhbGxPbkh1YignY2FwdHVyZUV2ZW50JywgZXZlbnQpO1xufVxuXG4vKipcbiAqIENhbGxiYWNrIHRvIHNldCBjb250ZXh0IGluZm9ybWF0aW9uIG9udG8gdGhlIHNjb3BlLlxuICogQHBhcmFtIGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgU2NvcGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVTY29wZShjYWxsYmFjazogKHNjb3BlOiBTY29wZSkgPT4gdm9pZCk6IHZvaWQge1xuICBjYWxsT25IdWI8dm9pZD4oJ2NvbmZpZ3VyZVNjb3BlJywgY2FsbGJhY2spO1xufVxuXG4vKipcbiAqIFJlY29yZHMgYSBuZXcgYnJlYWRjcnVtYiB3aGljaCB3aWxsIGJlIGF0dGFjaGVkIHRvIGZ1dHVyZSBldmVudHMuXG4gKlxuICogQnJlYWRjcnVtYnMgd2lsbCBiZSBhZGRlZCB0byBzdWJzZXF1ZW50IGV2ZW50cyB0byBwcm92aWRlIG1vcmUgY29udGV4dCBvblxuICogdXNlcidzIGFjdGlvbnMgcHJpb3IgdG8gYW4gZXJyb3Igb3IgY3Jhc2guXG4gKlxuICogQHBhcmFtIGJyZWFkY3J1bWIgVGhlIGJyZWFkY3J1bWIgdG8gcmVjb3JkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkQnJlYWRjcnVtYihicmVhZGNydW1iOiBCcmVhZGNydW1iKTogdm9pZCB7XG4gIGNhbGxPbkh1Yjx2b2lkPignYWRkQnJlYWRjcnVtYicsIGJyZWFkY3J1bWIpO1xufVxuXG4vKipcbiAqIFNldHMgY29udGV4dCBkYXRhIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gKiBAcGFyYW0gbmFtZSBvZiB0aGUgY29udGV4dFxuICogQHBhcmFtIGNvbnRleHQgQW55IGtpbmQgb2YgZGF0YS4gVGhpcyBkYXRhIHdpbGwgYmUgbm9ybWFsaXplZC5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBmdW5jdGlvbiBzZXRDb250ZXh0KG5hbWU6IHN0cmluZywgY29udGV4dDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwpOiB2b2lkIHtcbiAgY2FsbE9uSHViPHZvaWQ+KCdzZXRDb250ZXh0JywgbmFtZSwgY29udGV4dCk7XG59XG5cbi8qKlxuICogU2V0IGFuIG9iamVjdCB0aGF0IHdpbGwgYmUgbWVyZ2VkIHNlbnQgYXMgZXh0cmEgZGF0YSB3aXRoIHRoZSBldmVudC5cbiAqIEBwYXJhbSBleHRyYXMgRXh0cmFzIG9iamVjdCB0byBtZXJnZSBpbnRvIGN1cnJlbnQgY29udGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEV4dHJhcyhleHRyYXM6IEV4dHJhcyk6IHZvaWQge1xuICBjYWxsT25IdWI8dm9pZD4oJ3NldEV4dHJhcycsIGV4dHJhcyk7XG59XG5cbi8qKlxuICogU2V0IGFuIG9iamVjdCB0aGF0IHdpbGwgYmUgbWVyZ2VkIHNlbnQgYXMgdGFncyBkYXRhIHdpdGggdGhlIGV2ZW50LlxuICogQHBhcmFtIHRhZ3MgVGFncyBjb250ZXh0IG9iamVjdCB0byBtZXJnZSBpbnRvIGN1cnJlbnQgY29udGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFRhZ3ModGFnczogeyBba2V5OiBzdHJpbmddOiBQcmltaXRpdmUgfSk6IHZvaWQge1xuICBjYWxsT25IdWI8dm9pZD4oJ3NldFRhZ3MnLCB0YWdzKTtcbn1cblxuLyoqXG4gKiBTZXQga2V5OnZhbHVlIHRoYXQgd2lsbCBiZSBzZW50IGFzIGV4dHJhIGRhdGEgd2l0aCB0aGUgZXZlbnQuXG4gKiBAcGFyYW0ga2V5IFN0cmluZyBvZiBleHRyYVxuICogQHBhcmFtIGV4dHJhIEFueSBraW5kIG9mIGRhdGEuIFRoaXMgZGF0YSB3aWxsIGJlIG5vcm1hbGl6ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRFeHRyYShrZXk6IHN0cmluZywgZXh0cmE6IEV4dHJhKTogdm9pZCB7XG4gIGNhbGxPbkh1Yjx2b2lkPignc2V0RXh0cmEnLCBrZXksIGV4dHJhKTtcbn1cblxuLyoqXG4gKiBTZXQga2V5OnZhbHVlIHRoYXQgd2lsbCBiZSBzZW50IGFzIHRhZ3MgZGF0YSB3aXRoIHRoZSBldmVudC5cbiAqXG4gKiBDYW4gYWxzbyBiZSB1c2VkIHRvIHVuc2V0IGEgdGFnLCBieSBwYXNzaW5nIGB1bmRlZmluZWRgLlxuICpcbiAqIEBwYXJhbSBrZXkgU3RyaW5nIGtleSBvZiB0YWdcbiAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSBvZiB0YWdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFRhZyhrZXk6IHN0cmluZywgdmFsdWU6IFByaW1pdGl2ZSk6IHZvaWQge1xuICBjYWxsT25IdWI8dm9pZD4oJ3NldFRhZycsIGtleSwgdmFsdWUpO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdXNlciBjb250ZXh0IGluZm9ybWF0aW9uIGZvciBmdXR1cmUgZXZlbnRzLlxuICpcbiAqIEBwYXJhbSB1c2VyIFVzZXIgY29udGV4dCBvYmplY3QgdG8gYmUgc2V0IGluIHRoZSBjdXJyZW50IGNvbnRleHQuIFBhc3MgYG51bGxgIHRvIHVuc2V0IHRoZSB1c2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0VXNlcih1c2VyOiBVc2VyIHwgbnVsbCk6IHZvaWQge1xuICBjYWxsT25IdWI8dm9pZD4oJ3NldFVzZXInLCB1c2VyKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHNjb3BlIHdpdGggYW5kIGV4ZWN1dGVzIHRoZSBnaXZlbiBvcGVyYXRpb24gd2l0aGluLlxuICogVGhlIHNjb3BlIGlzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBvbmNlIHRoZSBvcGVyYXRpb25cbiAqIGZpbmlzaGVzIG9yIHRocm93cy5cbiAqXG4gKiBUaGlzIGlzIGVzc2VudGlhbGx5IGEgY29udmVuaWVuY2UgZnVuY3Rpb24gZm9yOlxuICpcbiAqICAgICBwdXNoU2NvcGUoKTtcbiAqICAgICBjYWxsYmFjaygpO1xuICogICAgIHBvcFNjb3BlKCk7XG4gKlxuICogQHBhcmFtIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBlbmNsb3NlZCBpbnRvIHB1c2gvcG9wU2NvcGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoU2NvcGUoY2FsbGJhY2s6IChzY29wZTogU2NvcGUpID0+IHZvaWQpOiB2b2lkIHtcbiAgY2FsbE9uSHViPHZvaWQ+KCd3aXRoU2NvcGUnLCBjYWxsYmFjayk7XG59XG5cbi8qKlxuICogQ2FsbHMgYSBmdW5jdGlvbiBvbiB0aGUgbGF0ZXN0IGNsaWVudC4gVXNlIHRoaXMgd2l0aCBjYXV0aW9uLCBpdCdzIG1lYW50IGFzXG4gKiBpbiBcImludGVybmFsXCIgaGVscGVyIHNvIHdlIGRvbid0IG5lZWQgdG8gZXhwb3NlIGV2ZXJ5IHBvc3NpYmxlIGZ1bmN0aW9uIGluXG4gKiB0aGUgc2hpbS4gSXQgaXMgbm90IGd1YXJhbnRlZWQgdGhhdCB0aGUgY2xpZW50IGFjdHVhbGx5IGltcGxlbWVudHMgdGhlXG4gKiBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gbWV0aG9kIFRoZSBtZXRob2QgdG8gY2FsbCBvbiB0aGUgY2xpZW50L2NsaWVudC5cbiAqIEBwYXJhbSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjbGllbnQvZm9udGVuZC5cbiAqIEBoaWRkZW5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBmdW5jdGlvbiBfY2FsbE9uQ2xpZW50KG1ldGhvZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICBjYWxsT25IdWI8dm9pZD4oJ19pbnZva2VDbGllbnQnLCBtZXRob2QsIC4uLmFyZ3MpO1xufVxuXG4vKipcbiAqIFN0YXJ0cyBhIG5ldyBgVHJhbnNhY3Rpb25gIGFuZCByZXR1cm5zIGl0LiBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCB0byBtYW51YWwgdHJhY2luZyBpbnN0cnVtZW50YXRpb24uXG4gKlxuICogQSB0cmVlIHN0cnVjdHVyZSBjYW4gYmUgYnVpbHQgYnkgYWRkaW5nIGNoaWxkIHNwYW5zIHRvIHRoZSB0cmFuc2FjdGlvbiwgYW5kIGNoaWxkIHNwYW5zIHRvIG90aGVyIHNwYW5zLiBUbyBzdGFydCBhXG4gKiBuZXcgY2hpbGQgc3BhbiB3aXRoaW4gdGhlIHRyYW5zYWN0aW9uIG9yIGFueSBzcGFuLCBjYWxsIHRoZSByZXNwZWN0aXZlIGAuc3RhcnRDaGlsZCgpYCBtZXRob2QuXG4gKlxuICogRXZlcnkgY2hpbGQgc3BhbiBtdXN0IGJlIGZpbmlzaGVkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gaXMgZmluaXNoZWQsIG90aGVyd2lzZSB0aGUgdW5maW5pc2hlZCBzcGFucyBhcmUgZGlzY2FyZGVkLlxuICpcbiAqIFRoZSB0cmFuc2FjdGlvbiBtdXN0IGJlIGZpbmlzaGVkIHdpdGggYSBjYWxsIHRvIGl0cyBgLmZpbmlzaCgpYCBtZXRob2QsIGF0IHdoaWNoIHBvaW50IHRoZSB0cmFuc2FjdGlvbiB3aXRoIGFsbCBpdHNcbiAqIGZpbmlzaGVkIGNoaWxkIHNwYW5zIHdpbGwgYmUgc2VudCB0byBTZW50cnkuXG4gKlxuICogQHBhcmFtIGNvbnRleHQgUHJvcGVydGllcyBvZiB0aGUgbmV3IGBUcmFuc2FjdGlvbmAuXG4gKiBAcGFyYW0gY3VzdG9tU2FtcGxpbmdDb250ZXh0IEluZm9ybWF0aW9uIGdpdmVuIHRvIHRoZSB0cmFuc2FjdGlvbiBzYW1wbGluZyBmdW5jdGlvbiAoYWxvbmcgd2l0aCBjb250ZXh0LWRlcGVuZGVudFxuICogZGVmYXVsdCB2YWx1ZXMpLiBTZWUge0BsaW5rIE9wdGlvbnMudHJhY2VzU2FtcGxlcn0uXG4gKlxuICogQHJldHVybnMgVGhlIHRyYW5zYWN0aW9uIHdoaWNoIHdhcyBqdXN0IHN0YXJ0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0VHJhbnNhY3Rpb24oXG4gIGNvbnRleHQ6IFRyYW5zYWN0aW9uQ29udGV4dCxcbiAgY3VzdG9tU2FtcGxpbmdDb250ZXh0PzogQ3VzdG9tU2FtcGxpbmdDb250ZXh0LFxuKTogVHJhbnNhY3Rpb24ge1xuICByZXR1cm4gY2FsbE9uSHViKCdzdGFydFRyYW5zYWN0aW9uJywgeyAuLi5jb250ZXh0IH0sIGN1c3RvbVNhbXBsaW5nQ29udGV4dCk7XG59XG4iLCAiaW1wb3J0IHsgRHNuTGlrZSwgU2RrTWV0YWRhdGEgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IERzbiwgdXJsRW5jb2RlIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmNvbnN0IFNFTlRSWV9BUElfVkVSU0lPTiA9ICc3JztcblxuLyoqXG4gKiBIZWxwZXIgY2xhc3MgdG8gcHJvdmlkZSB1cmxzLCBoZWFkZXJzIGFuZCBtZXRhZGF0YSB0aGF0IGNhbiBiZSB1c2VkIHRvIGZvcm1cbiAqIGRpZmZlcmVudCB0eXBlcyBvZiByZXF1ZXN0cyB0byBTZW50cnkgZW5kcG9pbnRzLlxuICogU3VwcG9ydHMgYm90aCBlbnZlbG9wZXMgYW5kIHJlZ3VsYXIgZXZlbnQgcmVxdWVzdHMuXG4gKiovXG5leHBvcnQgY2xhc3MgQVBJIHtcbiAgLyoqIFRoZSBEU04gYXMgcGFzc2VkIHRvIFNlbnRyeS5pbml0KCkgKi9cbiAgcHVibGljIGRzbjogRHNuTGlrZTtcblxuICAvKiogTWV0YWRhdGEgYWJvdXQgdGhlIFNESyAobmFtZSwgdmVyc2lvbiwgZXRjKSBmb3IgaW5jbHVzaW9uIGluIGVudmVsb3BlIGhlYWRlcnMgKi9cbiAgcHVibGljIG1ldGFkYXRhOiBTZGtNZXRhZGF0YTtcblxuICAvKiogVGhlIGludGVybmFsbHkgdXNlZCBEc24gb2JqZWN0LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9kc25PYmplY3Q6IERzbjtcblxuICAvKiogVGhlIGVudmVsb3BlIHR1bm5lbCB0byB1c2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3R1bm5lbD86IHN0cmluZztcblxuICAvKiogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEFQSSAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoZHNuOiBEc25MaWtlLCBtZXRhZGF0YTogU2RrTWV0YWRhdGEgPSB7fSwgdHVubmVsPzogc3RyaW5nKSB7XG4gICAgdGhpcy5kc24gPSBkc247XG4gICAgdGhpcy5fZHNuT2JqZWN0ID0gbmV3IERzbihkc24pO1xuICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgICB0aGlzLl90dW5uZWwgPSB0dW5uZWw7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgRHNuIG9iamVjdC4gKi9cbiAgcHVibGljIGdldERzbigpOiBEc24ge1xuICAgIHJldHVybiB0aGlzLl9kc25PYmplY3Q7XG4gIH1cblxuICAvKiogRG9lcyB0aGlzIHRyYW5zcG9ydCBmb3JjZSBlbnZlbG9wZXM/ICovXG4gIHB1YmxpYyBmb3JjZUVudmVsb3BlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuX3R1bm5lbDtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBwcmVmaXggdG8gY29uc3RydWN0IFNlbnRyeSBpbmdlc3Rpb24gQVBJIGVuZHBvaW50cy4gKi9cbiAgcHVibGljIGdldEJhc2VBcGlFbmRwb2ludCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRzbiA9IHRoaXMuZ2V0RHNuKCk7XG4gICAgY29uc3QgcHJvdG9jb2wgPSBkc24ucHJvdG9jb2wgPyBgJHtkc24ucHJvdG9jb2x9OmAgOiAnJztcbiAgICBjb25zdCBwb3J0ID0gZHNuLnBvcnQgPyBgOiR7ZHNuLnBvcnR9YCA6ICcnO1xuICAgIHJldHVybiBgJHtwcm90b2NvbH0vLyR7ZHNuLmhvc3R9JHtwb3J0fSR7ZHNuLnBhdGggPyBgLyR7ZHNuLnBhdGh9YCA6ICcnfS9hcGkvYDtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBzdG9yZSBlbmRwb2ludCBVUkwuICovXG4gIHB1YmxpYyBnZXRTdG9yZUVuZHBvaW50KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEluZ2VzdEVuZHBvaW50KCdzdG9yZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN0b3JlIGVuZHBvaW50IFVSTCB3aXRoIGF1dGggaW4gdGhlIHF1ZXJ5IHN0cmluZy5cbiAgICpcbiAgICogU2VuZGluZyBhdXRoIGFzIHBhcnQgb2YgdGhlIHF1ZXJ5IHN0cmluZyBhbmQgbm90IGFzIGN1c3RvbSBIVFRQIGhlYWRlcnMgYXZvaWRzIENPUlMgcHJlZmxpZ2h0IHJlcXVlc3RzLlxuICAgKi9cbiAgcHVibGljIGdldFN0b3JlRW5kcG9pbnRXaXRoVXJsRW5jb2RlZEF1dGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5nZXRTdG9yZUVuZHBvaW50KCl9PyR7dGhpcy5fZW5jb2RlZEF1dGgoKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGVudmVsb3BlIGVuZHBvaW50IFVSTCB3aXRoIGF1dGggaW4gdGhlIHF1ZXJ5IHN0cmluZy5cbiAgICpcbiAgICogU2VuZGluZyBhdXRoIGFzIHBhcnQgb2YgdGhlIHF1ZXJ5IHN0cmluZyBhbmQgbm90IGFzIGN1c3RvbSBIVFRQIGhlYWRlcnMgYXZvaWRzIENPUlMgcHJlZmxpZ2h0IHJlcXVlc3RzLlxuICAgKi9cbiAgcHVibGljIGdldEVudmVsb3BlRW5kcG9pbnRXaXRoVXJsRW5jb2RlZEF1dGgoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5mb3JjZUVudmVsb3BlKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl90dW5uZWwgYXMgc3RyaW5nO1xuICAgIH1cblxuICAgIHJldHVybiBgJHt0aGlzLl9nZXRFbnZlbG9wZUVuZHBvaW50KCl9PyR7dGhpcy5fZW5jb2RlZEF1dGgoKX1gO1xuICB9XG5cbiAgLyoqIFJldHVybnMgb25seSB0aGUgcGF0aCBjb21wb25lbnQgZm9yIHRoZSBzdG9yZSBlbmRwb2ludC4gKi9cbiAgcHVibGljIGdldFN0b3JlRW5kcG9pbnRQYXRoKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZHNuID0gdGhpcy5nZXREc24oKTtcbiAgICByZXR1cm4gYCR7ZHNuLnBhdGggPyBgLyR7ZHNuLnBhdGh9YCA6ICcnfS9hcGkvJHtkc24ucHJvamVjdElkfS9zdG9yZS9gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgaW4gcmVxdWVzdCBoZWFkZXJzLlxuICAgKiBUaGlzIGlzIG5lZWRlZCBmb3Igbm9kZSBhbmQgdGhlIG9sZCAvc3RvcmUgZW5kcG9pbnQgaW4gc2VudHJ5XG4gICAqL1xuICBwdWJsaWMgZ2V0UmVxdWVzdEhlYWRlcnMoY2xpZW50TmFtZTogc3RyaW5nLCBjbGllbnRWZXJzaW9uOiBzdHJpbmcpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICAvLyBDSEFOR0UgVEhJUyB0byB1c2UgbWV0YWRhdGEgYnV0IGtlZXAgY2xpZW50TmFtZSBhbmQgY2xpZW50VmVyc2lvbiBjb21wYXRpYmxlXG4gICAgY29uc3QgZHNuID0gdGhpcy5nZXREc24oKTtcbiAgICBjb25zdCBoZWFkZXIgPSBbYFNlbnRyeSBzZW50cnlfdmVyc2lvbj0ke1NFTlRSWV9BUElfVkVSU0lPTn1gXTtcbiAgICBoZWFkZXIucHVzaChgc2VudHJ5X2NsaWVudD0ke2NsaWVudE5hbWV9LyR7Y2xpZW50VmVyc2lvbn1gKTtcbiAgICBoZWFkZXIucHVzaChgc2VudHJ5X2tleT0ke2Rzbi5wdWJsaWNLZXl9YCk7XG4gICAgaWYgKGRzbi5wYXNzKSB7XG4gICAgICBoZWFkZXIucHVzaChgc2VudHJ5X3NlY3JldD0ke2Rzbi5wYXNzfWApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICdYLVNlbnRyeS1BdXRoJzogaGVhZGVyLmpvaW4oJywgJyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSB1cmwgdG8gdGhlIHJlcG9ydCBkaWFsb2cgZW5kcG9pbnQuICovXG4gIHB1YmxpYyBnZXRSZXBvcnREaWFsb2dFbmRwb2ludChcbiAgICBkaWFsb2dPcHRpb25zOiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgdXNlcj86IHsgbmFtZT86IHN0cmluZzsgZW1haWw/OiBzdHJpbmcgfTtcbiAgICB9ID0ge30sXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgZHNuID0gdGhpcy5nZXREc24oKTtcbiAgICBjb25zdCBlbmRwb2ludCA9IGAke3RoaXMuZ2V0QmFzZUFwaUVuZHBvaW50KCl9ZW1iZWQvZXJyb3ItcGFnZS9gO1xuXG4gICAgY29uc3QgZW5jb2RlZE9wdGlvbnMgPSBbXTtcbiAgICBlbmNvZGVkT3B0aW9ucy5wdXNoKGBkc249JHtkc24udG9TdHJpbmcoKX1gKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkaWFsb2dPcHRpb25zKSB7XG4gICAgICBpZiAoa2V5ID09PSAnZHNuJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGtleSA9PT0gJ3VzZXInKSB7XG4gICAgICAgIGlmICghZGlhbG9nT3B0aW9ucy51c2VyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpYWxvZ09wdGlvbnMudXNlci5uYW1lKSB7XG4gICAgICAgICAgZW5jb2RlZE9wdGlvbnMucHVzaChgbmFtZT0ke2VuY29kZVVSSUNvbXBvbmVudChkaWFsb2dPcHRpb25zLnVzZXIubmFtZSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpYWxvZ09wdGlvbnMudXNlci5lbWFpbCkge1xuICAgICAgICAgIGVuY29kZWRPcHRpb25zLnB1c2goYGVtYWlsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGRpYWxvZ09wdGlvbnMudXNlci5lbWFpbCl9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuY29kZWRPcHRpb25zLnB1c2goYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGtleSl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KGRpYWxvZ09wdGlvbnNba2V5XSBhcyBzdHJpbmcpfWApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5jb2RlZE9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gYCR7ZW5kcG9pbnR9PyR7ZW5jb2RlZE9wdGlvbnMuam9pbignJicpfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuZHBvaW50O1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIGVudmVsb3BlIGVuZHBvaW50IFVSTC4gKi9cbiAgcHJpdmF0ZSBfZ2V0RW52ZWxvcGVFbmRwb2ludCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9nZXRJbmdlc3RFbmRwb2ludCgnZW52ZWxvcGUnKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBpbmdlc3QgQVBJIGVuZHBvaW50IGZvciB0YXJnZXQuICovXG4gIHByaXZhdGUgX2dldEluZ2VzdEVuZHBvaW50KHRhcmdldDogJ3N0b3JlJyB8ICdlbnZlbG9wZScpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl90dW5uZWwpIHtcbiAgICAgIHJldHVybiB0aGlzLl90dW5uZWw7XG4gICAgfVxuICAgIGNvbnN0IGJhc2UgPSB0aGlzLmdldEJhc2VBcGlFbmRwb2ludCgpO1xuICAgIGNvbnN0IGRzbiA9IHRoaXMuZ2V0RHNuKCk7XG4gICAgcmV0dXJuIGAke2Jhc2V9JHtkc24ucHJvamVjdElkfS8ke3RhcmdldH0vYDtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgVVJMLWVuY29kZWQgc3RyaW5nIHdpdGggYXV0aCBjb25maWcgc3VpdGFibGUgZm9yIGEgcXVlcnkgc3RyaW5nLiAqL1xuICBwcml2YXRlIF9lbmNvZGVkQXV0aCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRzbiA9IHRoaXMuZ2V0RHNuKCk7XG4gICAgY29uc3QgYXV0aCA9IHtcbiAgICAgIC8vIFdlIHNlbmQgb25seSB0aGUgbWluaW11bSBzZXQgb2YgcmVxdWlyZWQgaW5mb3JtYXRpb24uIFNlZVxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnktamF2YXNjcmlwdC9pc3N1ZXMvMjU3Mi5cbiAgICAgIHNlbnRyeV9rZXk6IGRzbi5wdWJsaWNLZXksXG4gICAgICBzZW50cnlfdmVyc2lvbjogU0VOVFJZX0FQSV9WRVJTSU9OLFxuICAgIH07XG4gICAgcmV0dXJuIHVybEVuY29kZShhdXRoKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yLCBnZXRDdXJyZW50SHViIH0gZnJvbSAnQHNlbnRyeS9odWInO1xuaW1wb3J0IHsgSW50ZWdyYXRpb24sIE9wdGlvbnMgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgaW5zdGFsbGVkSW50ZWdyYXRpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4vKiogTWFwIG9mIGludGVncmF0aW9ucyBhc3NpZ25lZCB0byBhIGNsaWVudCAqL1xuZXhwb3J0IHR5cGUgSW50ZWdyYXRpb25JbmRleCA9IHtcbiAgW2tleTogc3RyaW5nXTogSW50ZWdyYXRpb247XG59ICYgeyBpbml0aWFsaXplZD86IGJvb2xlYW4gfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBmaWx0ZXJEdXBsaWNhdGVzKGludGVncmF0aW9uczogSW50ZWdyYXRpb25bXSk6IEludGVncmF0aW9uW10ge1xuICByZXR1cm4gaW50ZWdyYXRpb25zLnJlZHVjZSgoYWNjLCBpbnRlZ3JhdGlvbnMpID0+IHtcbiAgICBpZiAoYWNjLmV2ZXJ5KGFjY0ludGVncmF0aW9uID0+IGludGVncmF0aW9ucy5uYW1lICE9PSBhY2NJbnRlZ3JhdGlvbi5uYW1lKSkge1xuICAgICAgYWNjLnB1c2goaW50ZWdyYXRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgW10gYXMgSW50ZWdyYXRpb25bXSk7XG59XG5cbi8qKiBHZXRzIGludGVncmF0aW9uIHRvIGluc3RhbGwgKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlZ3JhdGlvbnNUb1NldHVwKG9wdGlvbnM6IE9wdGlvbnMpOiBJbnRlZ3JhdGlvbltdIHtcbiAgY29uc3QgZGVmYXVsdEludGVncmF0aW9ucyA9IChvcHRpb25zLmRlZmF1bHRJbnRlZ3JhdGlvbnMgJiYgWy4uLm9wdGlvbnMuZGVmYXVsdEludGVncmF0aW9uc10pIHx8IFtdO1xuICBjb25zdCB1c2VySW50ZWdyYXRpb25zID0gb3B0aW9ucy5pbnRlZ3JhdGlvbnM7XG5cbiAgbGV0IGludGVncmF0aW9uczogSW50ZWdyYXRpb25bXSA9IFsuLi5maWx0ZXJEdXBsaWNhdGVzKGRlZmF1bHRJbnRlZ3JhdGlvbnMpXTtcblxuICBpZiAoQXJyYXkuaXNBcnJheSh1c2VySW50ZWdyYXRpb25zKSkge1xuICAgIC8vIEZpbHRlciBvdXQgaW50ZWdyYXRpb25zIHRoYXQgYXJlIGFsc28gaW5jbHVkZWQgaW4gdXNlciBvcHRpb25zXG4gICAgaW50ZWdyYXRpb25zID0gW1xuICAgICAgLi4uaW50ZWdyYXRpb25zLmZpbHRlcihpbnRlZ3JhdGlvbnMgPT5cbiAgICAgICAgdXNlckludGVncmF0aW9ucy5ldmVyeSh1c2VySW50ZWdyYXRpb24gPT4gdXNlckludGVncmF0aW9uLm5hbWUgIT09IGludGVncmF0aW9ucy5uYW1lKSxcbiAgICAgICksXG4gICAgICAvLyBBbmQgZmlsdGVyIG91dCBkdXBsaWNhdGVkIHVzZXIgb3B0aW9ucyBpbnRlZ3JhdGlvbnNcbiAgICAgIC4uLmZpbHRlckR1cGxpY2F0ZXModXNlckludGVncmF0aW9ucyksXG4gICAgXTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdXNlckludGVncmF0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGludGVncmF0aW9ucyA9IHVzZXJJbnRlZ3JhdGlvbnMoaW50ZWdyYXRpb25zKTtcbiAgICBpbnRlZ3JhdGlvbnMgPSBBcnJheS5pc0FycmF5KGludGVncmF0aW9ucykgPyBpbnRlZ3JhdGlvbnMgOiBbaW50ZWdyYXRpb25zXTtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSB0aGF0IGlmIHByZXNlbnQsIGBEZWJ1Z2AgaW50ZWdyYXRpb24gd2lsbCBhbHdheXMgcnVuIGxhc3RcbiAgY29uc3QgaW50ZWdyYXRpb25zTmFtZXMgPSBpbnRlZ3JhdGlvbnMubWFwKGkgPT4gaS5uYW1lKTtcbiAgY29uc3QgYWx3YXlzTGFzdFRvUnVuID0gJ0RlYnVnJztcbiAgaWYgKGludGVncmF0aW9uc05hbWVzLmluZGV4T2YoYWx3YXlzTGFzdFRvUnVuKSAhPT0gLTEpIHtcbiAgICBpbnRlZ3JhdGlvbnMucHVzaCguLi5pbnRlZ3JhdGlvbnMuc3BsaWNlKGludGVncmF0aW9uc05hbWVzLmluZGV4T2YoYWx3YXlzTGFzdFRvUnVuKSwgMSkpO1xuICB9XG5cbiAgcmV0dXJuIGludGVncmF0aW9ucztcbn1cblxuLyoqIFNldHVwIGdpdmVuIGludGVncmF0aW9uICovXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBJbnRlZ3JhdGlvbihpbnRlZ3JhdGlvbjogSW50ZWdyYXRpb24pOiB2b2lkIHtcbiAgaWYgKGluc3RhbGxlZEludGVncmF0aW9ucy5pbmRleE9mKGludGVncmF0aW9uLm5hbWUpICE9PSAtMSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpbnRlZ3JhdGlvbi5zZXR1cE9uY2UoYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3IsIGdldEN1cnJlbnRIdWIpO1xuICBpbnN0YWxsZWRJbnRlZ3JhdGlvbnMucHVzaChpbnRlZ3JhdGlvbi5uYW1lKTtcbiAgbG9nZ2VyLmxvZyhgSW50ZWdyYXRpb24gaW5zdGFsbGVkOiAke2ludGVncmF0aW9uLm5hbWV9YCk7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBsaXN0IG9mIGludGVncmF0aW9uIGluc3RhbmNlcyB0aGlzIGluc3RhbGxzIHRoZW0gYWxsLiBXaGVuIGB3aXRoRGVmYXVsdHNgIGlzIHNldCB0byBgdHJ1ZWAgdGhlbiBhbGwgZGVmYXVsdFxuICogaW50ZWdyYXRpb25zIGFyZSBhZGRlZCB1bmxlc3MgdGhleSB3ZXJlIGFscmVhZHkgcHJvdmlkZWQgYmVmb3JlLlxuICogQHBhcmFtIGludGVncmF0aW9ucyBhcnJheSBvZiBpbnRlZ3JhdGlvbiBpbnN0YW5jZXNcbiAqIEBwYXJhbSB3aXRoRGVmYXVsdCBzaG91bGQgZW5hYmxlIGRlZmF1bHQgaW50ZWdyYXRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cEludGVncmF0aW9uczxPIGV4dGVuZHMgT3B0aW9ucz4ob3B0aW9uczogTyk6IEludGVncmF0aW9uSW5kZXgge1xuICBjb25zdCBpbnRlZ3JhdGlvbnM6IEludGVncmF0aW9uSW5kZXggPSB7fTtcbiAgZ2V0SW50ZWdyYXRpb25zVG9TZXR1cChvcHRpb25zKS5mb3JFYWNoKGludGVncmF0aW9uID0+IHtcbiAgICBpbnRlZ3JhdGlvbnNbaW50ZWdyYXRpb24ubmFtZV0gPSBpbnRlZ3JhdGlvbjtcbiAgICBzZXR1cEludGVncmF0aW9uKGludGVncmF0aW9uKTtcbiAgfSk7XG4gIC8vIHNldCB0aGUgYGluaXRpYWxpemVkYCBmbGFnIHNvIHdlIGRvbid0IHJ1biB0aHJvdWdoIHRoZSBwcm9jZXNzIGFnYWluIHVuZWNlc3NhcmlseTsgdXNlIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgXG4gIC8vIGJlY2F1c2UgYnkgZGVmYXVsdCBpdCBjcmVhdGVzIGEgcHJvcGVydHkgd2hpY2ggaXMgbm9uZW51bWVyYWJsZSwgd2hpY2ggd2Ugd2FudCBzaW5jZSBgaW5pdGlhbGl6ZWRgIHNob3VsZG4ndCBiZVxuICAvLyBjb25zaWRlcmVkIGEgbWVtYmVyIG9mIHRoZSBpbmRleCB0aGUgd2F5IHRoZSBhY3R1YWwgaW50ZWdyYXRpb25zIGFyZVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW50ZWdyYXRpb25zLCAnaW5pdGlhbGl6ZWQnLCB7IHZhbHVlOiB0cnVlIH0pO1xuICByZXR1cm4gaW50ZWdyYXRpb25zO1xufVxuIiwgIi8qIGVzbGludC1kaXNhYmxlIG1heC1saW5lcyAqL1xuaW1wb3J0IHsgU2NvcGUsIFNlc3Npb24gfSBmcm9tICdAc2VudHJ5L2h1Yic7XG5pbXBvcnQge1xuICBDbGllbnQsXG4gIEV2ZW50LFxuICBFdmVudEhpbnQsXG4gIEludGVncmF0aW9uLFxuICBJbnRlZ3JhdGlvbkNsYXNzLFxuICBPcHRpb25zLFxuICBPdXRjb21lLFxuICBTZXNzaW9uU3RhdHVzLFxuICBTZXZlcml0eSxcbiAgVHJhbnNwb3J0LFxufSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7XG4gIGNoZWNrT3JTZXRBbHJlYWR5Q2F1Z2h0LFxuICBkYXRlVGltZXN0YW1wSW5TZWNvbmRzLFxuICBEc24sXG4gIGlzUGxhaW5PYmplY3QsXG4gIGlzUHJpbWl0aXZlLFxuICBpc1RoZW5hYmxlLFxuICBsb2dnZXIsXG4gIG5vcm1hbGl6ZSxcbiAgU2VudHJ5RXJyb3IsXG4gIFN5bmNQcm9taXNlLFxuICB0cnVuY2F0ZSxcbiAgdXVpZDQsXG59IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG5pbXBvcnQgeyBCYWNrZW5kLCBCYWNrZW5kQ2xhc3MgfSBmcm9tICcuL2Jhc2ViYWNrZW5kJztcbmltcG9ydCB7IEludGVncmF0aW9uSW5kZXgsIHNldHVwSW50ZWdyYXRpb25zIH0gZnJvbSAnLi9pbnRlZ3JhdGlvbic7XG5cbmNvbnN0IEFMUkVBRFlfU0VFTl9FUlJPUiA9IFwiTm90IGNhcHR1cmluZyBleGNlcHRpb24gYmVjYXVzZSBpdCdzIGFscmVhZHkgYmVlbiBjYXB0dXJlZC5cIjtcblxuLyoqXG4gKiBCYXNlIGltcGxlbWVudGF0aW9uIGZvciBhbGwgSmF2YVNjcmlwdCBTREsgY2xpZW50cy5cbiAqXG4gKiBDYWxsIHRoZSBjb25zdHJ1Y3RvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGJhY2tlbmQgY29uc3RydWN0b3IgYW5kIG9wdGlvbnNcbiAqIHNwZWNpZmljIHRvIHRoZSBjbGllbnQgc3ViY2xhc3MuIFRvIGFjY2VzcyB0aGVzZSBvcHRpb25zIGxhdGVyLCB1c2VcbiAqIHtAbGluayBDbGllbnQuZ2V0T3B0aW9uc30uIEFsc28sIHRoZSBCYWNrZW5kIGluc3RhbmNlIGlzIGF2YWlsYWJsZSB2aWFcbiAqIHtAbGluayBDbGllbnQuZ2V0QmFja2VuZH0uXG4gKlxuICogSWYgYSBEc24gaXMgc3BlY2lmaWVkIGluIHRoZSBvcHRpb25zLCBpdCB3aWxsIGJlIHBhcnNlZCBhbmQgc3RvcmVkLiBVc2VcbiAqIHtAbGluayBDbGllbnQuZ2V0RHNufSB0byByZXRyaWV2ZSB0aGUgRHNuIGF0IGFueSBtb21lbnQuIEluIGNhc2UgdGhlIERzbiBpc1xuICogaW52YWxpZCwgdGhlIGNvbnN0cnVjdG9yIHdpbGwgdGhyb3cgYSB7QGxpbmsgU2VudHJ5RXhjZXB0aW9ufS4gTm90ZSB0aGF0XG4gKiB3aXRob3V0IGEgdmFsaWQgRHNuLCB0aGUgU0RLIHdpbGwgbm90IHNlbmQgYW55IGV2ZW50cyB0byBTZW50cnkuXG4gKlxuICogQmVmb3JlIHNlbmRpbmcgYW4gZXZlbnQgdmlhIHRoZSBiYWNrZW5kLCBpdCBpcyBwYXNzZWQgdGhyb3VnaFxuICoge0BsaW5rIEJhc2VDbGllbnQuX3ByZXBhcmVFdmVudH0gdG8gYWRkIFNESyBpbmZvcm1hdGlvbiBhbmQgc2NvcGUgZGF0YVxuICogKGJyZWFkY3J1bWJzIGFuZCBjb250ZXh0KS4gVG8gYWRkIG1vcmUgY3VzdG9tIGluZm9ybWF0aW9uLCBvdmVycmlkZSB0aGlzXG4gKiBtZXRob2QgYW5kIGV4dGVuZCB0aGUgcmVzdWx0aW5nIHByZXBhcmVkIGV2ZW50LlxuICpcbiAqIFRvIGlzc3VlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBldmVudHMgKGUuZy4gdmlhIGluc3RydW1lbnRhdGlvbiksIHVzZVxuICoge0BsaW5rIENsaWVudC5jYXB0dXJlRXZlbnR9LiBJdCB3aWxsIHByZXBhcmUgdGhlIGV2ZW50IGFuZCBwYXNzIGl0IHRocm91Z2hcbiAqIHRoZSBjYWxsYmFjayBsaWZlY3ljbGUuIFRvIGlzc3VlIGF1dG8tYnJlYWRjcnVtYnMsIHVzZVxuICoge0BsaW5rIENsaWVudC5hZGRCcmVhZGNydW1ifS5cbiAqXG4gKiBAZXhhbXBsZVxuICogY2xhc3MgTm9kZUNsaWVudCBleHRlbmRzIEJhc2VDbGllbnQ8Tm9kZUJhY2tlbmQsIE5vZGVPcHRpb25zPiB7XG4gKiAgIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiBOb2RlT3B0aW9ucykge1xuICogICAgIHN1cGVyKE5vZGVCYWNrZW5kLCBvcHRpb25zKTtcbiAqICAgfVxuICpcbiAqICAgLy8gLi4uXG4gKiB9XG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ2xpZW50PEIgZXh0ZW5kcyBCYWNrZW5kLCBPIGV4dGVuZHMgT3B0aW9ucz4gaW1wbGVtZW50cyBDbGllbnQ8Tz4ge1xuICAvKipcbiAgICogVGhlIGJhY2tlbmQgdXNlZCB0byBwaHlzaWNhbGx5IGludGVyYWN0IGluIHRoZSBlbnZpcm9ubWVudC4gVXN1YWxseSwgdGhpc1xuICAgKiB3aWxsIGNvcnJlc3BvbmQgdG8gdGhlIGNsaWVudC4gV2hlbiBjb21wb3NpbmcgU0RLcywgaG93ZXZlciwgdGhlIEJhY2tlbmRcbiAgICogZnJvbSB0aGUgcm9vdCBTREsgd2lsbCBiZSB1c2VkLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9iYWNrZW5kOiBCO1xuXG4gIC8qKiBPcHRpb25zIHBhc3NlZCB0byB0aGUgU0RLLiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX29wdGlvbnM6IE87XG5cbiAgLyoqIFRoZSBjbGllbnQgRHNuLCBpZiBzcGVjaWZpZWQgaW4gb3B0aW9ucy4gV2l0aG91dCB0aGlzIERzbiwgdGhlIFNESyB3aWxsIGJlIGRpc2FibGVkLiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2Rzbj86IERzbjtcblxuICAvKiogQXJyYXkgb2YgdXNlZCBpbnRlZ3JhdGlvbnMuICovXG4gIHByb3RlY3RlZCBfaW50ZWdyYXRpb25zOiBJbnRlZ3JhdGlvbkluZGV4ID0ge307XG5cbiAgLyoqIE51bWJlciBvZiBjYWxscyBiZWluZyBwcm9jZXNzZWQgKi9cbiAgcHJvdGVjdGVkIF9udW1Qcm9jZXNzaW5nOiBudW1iZXIgPSAwO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGlzIGNsaWVudCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGJhY2tlbmRDbGFzcyBBIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgYmFja2VuZC5cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGNsaWVudC5cbiAgICovXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihiYWNrZW5kQ2xhc3M6IEJhY2tlbmRDbGFzczxCLCBPPiwgb3B0aW9uczogTykge1xuICAgIHRoaXMuX2JhY2tlbmQgPSBuZXcgYmFja2VuZENsYXNzKG9wdGlvbnMpO1xuICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgaWYgKG9wdGlvbnMuZHNuKSB7XG4gICAgICB0aGlzLl9kc24gPSBuZXcgRHNuKG9wdGlvbnMuZHNuKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXG4gIHB1YmxpYyBjYXB0dXJlRXhjZXB0aW9uKGV4Y2VwdGlvbjogYW55LCBoaW50PzogRXZlbnRIaW50LCBzY29wZT86IFNjb3BlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBlbnN1cmUgd2UgaGF2ZW4ndCBjYXB0dXJlZCB0aGlzIHZlcnkgb2JqZWN0IGJlZm9yZVxuICAgIGlmIChjaGVja09yU2V0QWxyZWFkeUNhdWdodChleGNlcHRpb24pKSB7XG4gICAgICBsb2dnZXIubG9nKEFMUkVBRFlfU0VFTl9FUlJPUik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGV2ZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGhpbnQgJiYgaGludC5ldmVudF9pZDtcblxuICAgIHRoaXMuX3Byb2Nlc3MoXG4gICAgICB0aGlzLl9nZXRCYWNrZW5kKClcbiAgICAgICAgLmV2ZW50RnJvbUV4Y2VwdGlvbihleGNlcHRpb24sIGhpbnQpXG4gICAgICAgIC50aGVuKGV2ZW50ID0+IHRoaXMuX2NhcHR1cmVFdmVudChldmVudCwgaGludCwgc2NvcGUpKVxuICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgIGV2ZW50SWQgPSByZXN1bHQ7XG4gICAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gZXZlbnRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNhcHR1cmVNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZywgbGV2ZWw/OiBTZXZlcml0eSwgaGludD86IEV2ZW50SGludCwgc2NvcGU/OiBTY29wZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGV2ZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGhpbnQgJiYgaGludC5ldmVudF9pZDtcblxuICAgIGNvbnN0IHByb21pc2VkRXZlbnQgPSBpc1ByaW1pdGl2ZShtZXNzYWdlKVxuICAgICAgPyB0aGlzLl9nZXRCYWNrZW5kKCkuZXZlbnRGcm9tTWVzc2FnZShTdHJpbmcobWVzc2FnZSksIGxldmVsLCBoaW50KVxuICAgICAgOiB0aGlzLl9nZXRCYWNrZW5kKCkuZXZlbnRGcm9tRXhjZXB0aW9uKG1lc3NhZ2UsIGhpbnQpO1xuXG4gICAgdGhpcy5fcHJvY2VzcyhcbiAgICAgIHByb21pc2VkRXZlbnRcbiAgICAgICAgLnRoZW4oZXZlbnQgPT4gdGhpcy5fY2FwdHVyZUV2ZW50KGV2ZW50LCBoaW50LCBzY29wZSkpXG4gICAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgZXZlbnRJZCA9IHJlc3VsdDtcbiAgICAgICAgfSksXG4gICAgKTtcblxuICAgIHJldHVybiBldmVudElkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgY2FwdHVyZUV2ZW50KGV2ZW50OiBFdmVudCwgaGludD86IEV2ZW50SGludCwgc2NvcGU/OiBTY29wZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gZW5zdXJlIHdlIGhhdmVuJ3QgY2FwdHVyZWQgdGhpcyB2ZXJ5IG9iamVjdCBiZWZvcmVcbiAgICBpZiAoaGludD8ub3JpZ2luYWxFeGNlcHRpb24gJiYgY2hlY2tPclNldEFscmVhZHlDYXVnaHQoaGludC5vcmlnaW5hbEV4Y2VwdGlvbikpIHtcbiAgICAgIGxvZ2dlci5sb2coQUxSRUFEWV9TRUVOX0VSUk9SKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgZXZlbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gaGludCAmJiBoaW50LmV2ZW50X2lkO1xuXG4gICAgdGhpcy5fcHJvY2VzcyhcbiAgICAgIHRoaXMuX2NhcHR1cmVFdmVudChldmVudCwgaGludCwgc2NvcGUpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgZXZlbnRJZCA9IHJlc3VsdDtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gZXZlbnRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNhcHR1cmVTZXNzaW9uKHNlc3Npb246IFNlc3Npb24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCgpKSB7XG4gICAgICBsb2dnZXIud2FybignU0RLIG5vdCBlbmFibGVkLCB3aWxsIG5vdCBjYXB0dXJlIHNlc3Npb24uJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCEodHlwZW9mIHNlc3Npb24ucmVsZWFzZSA9PT0gJ3N0cmluZycpKSB7XG4gICAgICBsb2dnZXIud2FybignRGlzY2FyZGVkIHNlc3Npb24gYmVjYXVzZSBvZiBtaXNzaW5nIG9yIG5vbi1zdHJpbmcgcmVsZWFzZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZW5kU2Vzc2lvbihzZXNzaW9uKTtcbiAgICAgIC8vIEFmdGVyIHNlbmRpbmcsIHdlIHNldCBpbml0IGZhbHNlIHRvIGluZGljYXRlIGl0J3Mgbm90IHRoZSBmaXJzdCBvY2N1cnJlbmNlXG4gICAgICBzZXNzaW9uLnVwZGF0ZSh7IGluaXQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGdldERzbigpOiBEc24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kc247XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBnZXRPcHRpb25zKCk6IE8ge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgZ2V0VHJhbnNwb3J0KCk6IFRyYW5zcG9ydCB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEJhY2tlbmQoKS5nZXRUcmFuc3BvcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGZsdXNoKHRpbWVvdXQ/OiBudW1iZXIpOiBQcm9taXNlTGlrZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzQ2xpZW50RG9uZVByb2Nlc3NpbmcodGltZW91dCkudGhlbihjbGllbnRGaW5pc2hlZCA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRUcmFuc3BvcnQoKVxuICAgICAgICAuY2xvc2UodGltZW91dClcbiAgICAgICAgLnRoZW4odHJhbnNwb3J0Rmx1c2hlZCA9PiBjbGllbnRGaW5pc2hlZCAmJiB0cmFuc3BvcnRGbHVzaGVkKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNsb3NlKHRpbWVvdXQ/OiBudW1iZXIpOiBQcm9taXNlTGlrZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuZmx1c2godGltZW91dCkudGhlbihyZXN1bHQgPT4ge1xuICAgICAgdGhpcy5nZXRPcHRpb25zKCkuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIHRoZSBpbnRlZ3JhdGlvbnNcbiAgICovXG4gIHB1YmxpYyBzZXR1cEludGVncmF0aW9ucygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faXNFbmFibGVkKCkgJiYgIXRoaXMuX2ludGVncmF0aW9ucy5pbml0aWFsaXplZCkge1xuICAgICAgdGhpcy5faW50ZWdyYXRpb25zID0gc2V0dXBJbnRlZ3JhdGlvbnModGhpcy5fb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgZ2V0SW50ZWdyYXRpb248VCBleHRlbmRzIEludGVncmF0aW9uPihpbnRlZ3JhdGlvbjogSW50ZWdyYXRpb25DbGFzczxUPik6IFQgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICh0aGlzLl9pbnRlZ3JhdGlvbnNbaW50ZWdyYXRpb24uaWRdIGFzIFQpIHx8IG51bGw7XG4gICAgfSBjYXRjaCAoX29PKSB7XG4gICAgICBsb2dnZXIud2FybihgQ2Fubm90IHJldHJpZXZlIGludGVncmF0aW9uICR7aW50ZWdyYXRpb24uaWR9IGZyb20gdGhlIGN1cnJlbnQgQ2xpZW50YCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKiogVXBkYXRlcyBleGlzdGluZyBzZXNzaW9uIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBldmVudCAqL1xuICBwcm90ZWN0ZWQgX3VwZGF0ZVNlc3Npb25Gcm9tRXZlbnQoc2Vzc2lvbjogU2Vzc2lvbiwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgbGV0IGNyYXNoZWQgPSBmYWxzZTtcbiAgICBsZXQgZXJyb3JlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGV4Y2VwdGlvbnMgPSBldmVudC5leGNlcHRpb24gJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlcztcblxuICAgIGlmIChleGNlcHRpb25zKSB7XG4gICAgICBlcnJvcmVkID0gdHJ1ZTtcblxuICAgICAgZm9yIChjb25zdCBleCBvZiBleGNlcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG1lY2hhbmlzbSA9IGV4Lm1lY2hhbmlzbTtcbiAgICAgICAgaWYgKG1lY2hhbmlzbSAmJiBtZWNoYW5pc20uaGFuZGxlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBjcmFzaGVkID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEEgc2Vzc2lvbiBpcyB1cGRhdGVkIGFuZCB0aGF0IHNlc3Npb24gdXBkYXRlIGlzIHNlbnQgaW4gb25seSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmcgc2NlbmFyaW9zOlxuICAgIC8vIDEuIFNlc3Npb24gd2l0aCBub24gdGVybWluYWwgc3RhdHVzIGFuZCAwIGVycm9ycyArIGFuIGVycm9yIG9jY3VycmVkIC0+IFdpbGwgc2V0IGVycm9yIGNvdW50IHRvIDEgYW5kIHNlbmQgdXBkYXRlXG4gICAgLy8gMi4gU2Vzc2lvbiB3aXRoIG5vbiB0ZXJtaW5hbCBzdGF0dXMgYW5kIDEgZXJyb3IgKyBhIGNyYXNoIG9jY3VycmVkIC0+IFdpbGwgc2V0IHN0YXR1cyBjcmFzaGVkIGFuZCBzZW5kIHVwZGF0ZVxuICAgIGNvbnN0IHNlc3Npb25Ob25UZXJtaW5hbCA9IHNlc3Npb24uc3RhdHVzID09PSBTZXNzaW9uU3RhdHVzLk9rO1xuICAgIGNvbnN0IHNob3VsZFVwZGF0ZUFuZFNlbmQgPSAoc2Vzc2lvbk5vblRlcm1pbmFsICYmIHNlc3Npb24uZXJyb3JzID09PSAwKSB8fCAoc2Vzc2lvbk5vblRlcm1pbmFsICYmIGNyYXNoZWQpO1xuXG4gICAgaWYgKHNob3VsZFVwZGF0ZUFuZFNlbmQpIHtcbiAgICAgIHNlc3Npb24udXBkYXRlKHtcbiAgICAgICAgLi4uKGNyYXNoZWQgJiYgeyBzdGF0dXM6IFNlc3Npb25TdGF0dXMuQ3Jhc2hlZCB9KSxcbiAgICAgICAgZXJyb3JzOiBzZXNzaW9uLmVycm9ycyB8fCBOdW1iZXIoZXJyb3JlZCB8fCBjcmFzaGVkKSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jYXB0dXJlU2Vzc2lvbihzZXNzaW9uKTtcbiAgICB9XG4gIH1cblxuICAvKiogRGVsaXZlciBjYXB0dXJlZCBzZXNzaW9uIHRvIFNlbnRyeSAqL1xuICBwcm90ZWN0ZWQgX3NlbmRTZXNzaW9uKHNlc3Npb246IFNlc3Npb24pOiB2b2lkIHtcbiAgICB0aGlzLl9nZXRCYWNrZW5kKCkuc2VuZFNlc3Npb24oc2Vzc2lvbik7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGlmIHRoZSBjbGllbnQgaXMgZmluaXNoZWQgcHJvY2Vzc2luZy4gUmV0dXJucyBhIHByb21pc2UgYmVjYXVzZSBpdCB3aWxsIHdhaXQgYHRpbWVvdXRgIG1zIGJlZm9yZSBzYXlpbmdcbiAgICogXCJub1wiIChyZXNvbHZpbmcgdG8gYGZhbHNlYCkgaW4gb3JkZXIgdG8gZ2l2ZSB0aGUgY2xpZW50IGEgY2hhbmNlIHRvIHBvdGVudGlhbGx5IGZpbmlzaCBmaXJzdC5cbiAgICpcbiAgICogQHBhcmFtIHRpbWVvdXQgVGhlIHRpbWUsIGluIG1zLCBhZnRlciB3aGljaCB0byByZXNvbHZlIHRvIGBmYWxzZWAgaWYgdGhlIGNsaWVudCBpcyBzdGlsbCBidXN5LiBQYXNzaW5nIGAwYCAob3Igbm90XG4gICAqIHBhc3NpbmcgYW55dGhpbmcpIHdpbGwgbWFrZSB0aGUgcHJvbWlzZSB3YWl0IGFzIGxvbmcgYXMgaXQgdGFrZXMgZm9yIHByb2Nlc3NpbmcgdG8gZmluaXNoIGJlZm9yZSByZXNvbHZpbmcgdG9cbiAgICogYHRydWVgLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggd2lsbCByZXNvbHZlIHRvIGB0cnVlYCBpZiBwcm9jZXNzaW5nIGlzIGFscmVhZHkgZG9uZSBvciBmaW5pc2hlcyBiZWZvcmUgdGhlIHRpbWVvdXQsIGFuZFxuICAgKiBgZmFsc2VgIG90aGVyd2lzZVxuICAgKi9cbiAgcHJvdGVjdGVkIF9pc0NsaWVudERvbmVQcm9jZXNzaW5nKHRpbWVvdXQ/OiBudW1iZXIpOiBQcm9taXNlTGlrZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGxldCB0aWNrZWQ6IG51bWJlciA9IDA7XG4gICAgICBjb25zdCB0aWNrOiBudW1iZXIgPSAxO1xuXG4gICAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX251bVByb2Nlc3NpbmcgPT0gMCkge1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGlja2VkICs9IHRpY2s7XG4gICAgICAgICAgaWYgKHRpbWVvdXQgJiYgdGlja2VkID49IHRpbWVvdXQpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCB0aWNrKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBjdXJyZW50IGJhY2tlbmQuICovXG4gIHByb3RlY3RlZCBfZ2V0QmFja2VuZCgpOiBCIHtcbiAgICByZXR1cm4gdGhpcy5fYmFja2VuZDtcbiAgfVxuXG4gIC8qKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBTREsgaXMgZW5hYmxlZCBhbmQgYSB2YWxpZCBEc24gaXMgcHJlc2VudC4gKi9cbiAgcHJvdGVjdGVkIF9pc0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3B0aW9ucygpLmVuYWJsZWQgIT09IGZhbHNlICYmIHRoaXMuX2RzbiAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgY29tbW9uIGluZm9ybWF0aW9uIHRvIGV2ZW50cy5cbiAgICpcbiAgICogVGhlIGluZm9ybWF0aW9uIGluY2x1ZGVzIHJlbGVhc2UgYW5kIGVudmlyb25tZW50IGZyb20gYG9wdGlvbnNgLFxuICAgKiBicmVhZGNydW1icyBhbmQgY29udGV4dCAoZXh0cmEsIHRhZ3MgYW5kIHVzZXIpIGZyb20gdGhlIHNjb3BlLlxuICAgKlxuICAgKiBJbmZvcm1hdGlvbiB0aGF0IGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgZXZlbnQgaXMgbmV2ZXIgb3ZlcndyaXR0ZW4uIEZvclxuICAgKiBuZXN0ZWQgb2JqZWN0cywgc3VjaCBhcyB0aGUgY29udGV4dCwga2V5cyBhcmUgbWVyZ2VkLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIG9yaWdpbmFsIGV2ZW50LlxuICAgKiBAcGFyYW0gaGludCBNYXkgY29udGFpbiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBleGNlcHRpb24uXG4gICAqIEBwYXJhbSBzY29wZSBBIHNjb3BlIGNvbnRhaW5pbmcgZXZlbnQgbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIEEgbmV3IGV2ZW50IHdpdGggbW9yZSBpbmZvcm1hdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBfcHJlcGFyZUV2ZW50KGV2ZW50OiBFdmVudCwgc2NvcGU/OiBTY29wZSwgaGludD86IEV2ZW50SGludCk6IFByb21pc2VMaWtlPEV2ZW50IHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgbm9ybWFsaXplRGVwdGggPSAzIH0gPSB0aGlzLmdldE9wdGlvbnMoKTtcbiAgICBjb25zdCBwcmVwYXJlZDogRXZlbnQgPSB7XG4gICAgICAuLi5ldmVudCxcbiAgICAgIGV2ZW50X2lkOiBldmVudC5ldmVudF9pZCB8fCAoaGludCAmJiBoaW50LmV2ZW50X2lkID8gaGludC5ldmVudF9pZCA6IHV1aWQ0KCkpLFxuICAgICAgdGltZXN0YW1wOiBldmVudC50aW1lc3RhbXAgfHwgZGF0ZVRpbWVzdGFtcEluU2Vjb25kcygpLFxuICAgIH07XG5cbiAgICB0aGlzLl9hcHBseUNsaWVudE9wdGlvbnMocHJlcGFyZWQpO1xuICAgIHRoaXMuX2FwcGx5SW50ZWdyYXRpb25zTWV0YWRhdGEocHJlcGFyZWQpO1xuXG4gICAgLy8gSWYgd2UgaGF2ZSBzY29wZSBnaXZlbiB0byB1cywgdXNlIGl0IGFzIHRoZSBiYXNlIGZvciBmdXJ0aGVyIG1vZGlmaWNhdGlvbnMuXG4gICAgLy8gVGhpcyBhbGxvd3MgdXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSBjb3B5aW5nIG9mIGRhdGEgaWYgYGNhcHR1cmVDb250ZXh0YCBpcyBub3QgcHJvdmlkZWQuXG4gICAgbGV0IGZpbmFsU2NvcGUgPSBzY29wZTtcbiAgICBpZiAoaGludCAmJiBoaW50LmNhcHR1cmVDb250ZXh0KSB7XG4gICAgICBmaW5hbFNjb3BlID0gU2NvcGUuY2xvbmUoZmluYWxTY29wZSkudXBkYXRlKGhpbnQuY2FwdHVyZUNvbnRleHQpO1xuICAgIH1cblxuICAgIC8vIFdlIHByZXBhcmUgdGhlIHJlc3VsdCBoZXJlIHdpdGggYSByZXNvbHZlZCBFdmVudC5cbiAgICBsZXQgcmVzdWx0ID0gU3luY1Byb21pc2UucmVzb2x2ZTxFdmVudCB8IG51bGw+KHByZXBhcmVkKTtcblxuICAgIC8vIFRoaXMgc2hvdWxkIGJlIHRoZSBsYXN0IHRoaW5nIGNhbGxlZCwgc2luY2Ugd2Ugd2FudCB0aGF0XG4gICAgLy8ge0BsaW5rIEh1Yi5hZGRFdmVudFByb2Nlc3Nvcn0gZ2V0cyB0aGUgZmluaXNoZWQgcHJlcGFyZWQgZXZlbnQuXG4gICAgaWYgKGZpbmFsU2NvcGUpIHtcbiAgICAgIC8vIEluIGNhc2Ugd2UgaGF2ZSBhIGh1YiB3ZSByZWFzc2lnbiBpdC5cbiAgICAgIHJlc3VsdCA9IGZpbmFsU2NvcGUuYXBwbHlUb0V2ZW50KHByZXBhcmVkLCBoaW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0LnRoZW4oZXZ0ID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygbm9ybWFsaXplRGVwdGggPT09ICdudW1iZXInICYmIG5vcm1hbGl6ZURlcHRoID4gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbm9ybWFsaXplRXZlbnQoZXZ0LCBub3JtYWxpemVEZXB0aCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXZ0O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYG5vcm1hbGl6ZWAgZnVuY3Rpb24gb24gbmVjZXNzYXJ5IGBFdmVudGAgYXR0cmlidXRlcyB0byBtYWtlIHRoZW0gc2FmZSBmb3Igc2VyaWFsaXphdGlvbi5cbiAgICogTm9ybWFsaXplZCBrZXlzOlxuICAgKiAtIGBicmVhZGNydW1icy5kYXRhYFxuICAgKiAtIGB1c2VyYFxuICAgKiAtIGBjb250ZXh0c2BcbiAgICogLSBgZXh0cmFgXG4gICAqIEBwYXJhbSBldmVudCBFdmVudFxuICAgKiBAcmV0dXJucyBOb3JtYWxpemVkIGV2ZW50XG4gICAqL1xuICBwcm90ZWN0ZWQgX25vcm1hbGl6ZUV2ZW50KGV2ZW50OiBFdmVudCB8IG51bGwsIGRlcHRoOiBudW1iZXIpOiBFdmVudCB8IG51bGwge1xuICAgIGlmICghZXZlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB7XG4gICAgICAuLi5ldmVudCxcbiAgICAgIC4uLihldmVudC5icmVhZGNydW1icyAmJiB7XG4gICAgICAgIGJyZWFkY3J1bWJzOiBldmVudC5icmVhZGNydW1icy5tYXAoYiA9PiAoe1xuICAgICAgICAgIC4uLmIsXG4gICAgICAgICAgLi4uKGIuZGF0YSAmJiB7XG4gICAgICAgICAgICBkYXRhOiBub3JtYWxpemUoYi5kYXRhLCBkZXB0aCksXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pKSxcbiAgICAgIH0pLFxuICAgICAgLi4uKGV2ZW50LnVzZXIgJiYge1xuICAgICAgICB1c2VyOiBub3JtYWxpemUoZXZlbnQudXNlciwgZGVwdGgpLFxuICAgICAgfSksXG4gICAgICAuLi4oZXZlbnQuY29udGV4dHMgJiYge1xuICAgICAgICBjb250ZXh0czogbm9ybWFsaXplKGV2ZW50LmNvbnRleHRzLCBkZXB0aCksXG4gICAgICB9KSxcbiAgICAgIC4uLihldmVudC5leHRyYSAmJiB7XG4gICAgICAgIGV4dHJhOiBub3JtYWxpemUoZXZlbnQuZXh0cmEsIGRlcHRoKSxcbiAgICAgIH0pLFxuICAgIH07XG4gICAgLy8gZXZlbnQuY29udGV4dHMudHJhY2Ugc3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGEgVHJhbnNhY3Rpb24uIFNpbWlsYXJseSxcbiAgICAvLyBldmVudC5zcGFuc1tdIHN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBjaGlsZCBTcGFucy4gR2l2ZW4gdGhhdCBhXG4gICAgLy8gVHJhbnNhY3Rpb24gaXMgY29uY2VwdHVhbGx5IGEgU3Bhbiwgbm9ybWFsaXphdGlvbiBzaG91bGQgYXBwbHkgdG8gYm90aFxuICAgIC8vIFRyYW5zYWN0aW9ucyBhbmQgU3BhbnMgY29uc2lzdGVudGx5LlxuICAgIC8vIEZvciBub3cgdGhlIGRlY2lzaW9uIGlzIHRvIHNraXAgbm9ybWFsaXphdGlvbiBvZiBUcmFuc2FjdGlvbnMgYW5kIFNwYW5zLFxuICAgIC8vIHNvIHRoaXMgYmxvY2sgb3ZlcndyaXRlcyB0aGUgbm9ybWFsaXplZCBldmVudCB0byBhZGQgYmFjayB0aGUgb3JpZ2luYWxcbiAgICAvLyBUcmFuc2FjdGlvbiBpbmZvcm1hdGlvbiBwcmlvciB0byBub3JtYWxpemF0aW9uLlxuICAgIGlmIChldmVudC5jb250ZXh0cyAmJiBldmVudC5jb250ZXh0cy50cmFjZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgbm9ybWFsaXplZC5jb250ZXh0cy50cmFjZSA9IGV2ZW50LmNvbnRleHRzLnRyYWNlO1xuICAgIH1cblxuICAgIGNvbnN0IHsgX2V4cGVyaW1lbnRzID0ge30gfSA9IHRoaXMuZ2V0T3B0aW9ucygpO1xuICAgIGlmIChfZXhwZXJpbWVudHMuZW5zdXJlTm9DaXJjdWxhclN0cnVjdHVyZXMpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemUobm9ybWFsaXplZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG4gIH1cblxuICAvKipcbiAgICogIEVuaGFuY2VzIGV2ZW50IHVzaW5nIHRoZSBjbGllbnQgY29uZmlndXJhdGlvbi5cbiAgICogIEl0IHRha2VzIGNhcmUgb2YgYWxsIFwic3RhdGljXCIgdmFsdWVzIGxpa2UgZW52aXJvbm1lbnQsIHJlbGVhc2UgYW5kIGBkaXN0YCxcbiAgICogIGFzIHdlbGwgYXMgdHJ1bmNhdGluZyBvdmVybHkgbG9uZyB2YWx1ZXMuXG4gICAqIEBwYXJhbSBldmVudCBldmVudCBpbnN0YW5jZSB0byBiZSBlbmhhbmNlZFxuICAgKi9cbiAgcHJvdGVjdGVkIF9hcHBseUNsaWVudE9wdGlvbnMoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZ2V0T3B0aW9ucygpO1xuICAgIGNvbnN0IHsgZW52aXJvbm1lbnQsIHJlbGVhc2UsIGRpc3QsIG1heFZhbHVlTGVuZ3RoID0gMjUwIH0gPSBvcHRpb25zO1xuXG4gICAgaWYgKCEoJ2Vudmlyb25tZW50JyBpbiBldmVudCkpIHtcbiAgICAgIGV2ZW50LmVudmlyb25tZW50ID0gJ2Vudmlyb25tZW50JyBpbiBvcHRpb25zID8gZW52aXJvbm1lbnQgOiAncHJvZHVjdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnJlbGVhc2UgPT09IHVuZGVmaW5lZCAmJiByZWxlYXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV2ZW50LnJlbGVhc2UgPSByZWxlYXNlO1xuICAgIH1cblxuICAgIGlmIChldmVudC5kaXN0ID09PSB1bmRlZmluZWQgJiYgZGlzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBldmVudC5kaXN0ID0gZGlzdDtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQubWVzc2FnZSkge1xuICAgICAgZXZlbnQubWVzc2FnZSA9IHRydW5jYXRlKGV2ZW50Lm1lc3NhZ2UsIG1heFZhbHVlTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBjb25zdCBleGNlcHRpb24gPSBldmVudC5leGNlcHRpb24gJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyAmJiBldmVudC5leGNlcHRpb24udmFsdWVzWzBdO1xuICAgIGlmIChleGNlcHRpb24gJiYgZXhjZXB0aW9uLnZhbHVlKSB7XG4gICAgICBleGNlcHRpb24udmFsdWUgPSB0cnVuY2F0ZShleGNlcHRpb24udmFsdWUsIG1heFZhbHVlTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gZXZlbnQucmVxdWVzdDtcbiAgICBpZiAocmVxdWVzdCAmJiByZXF1ZXN0LnVybCkge1xuICAgICAgcmVxdWVzdC51cmwgPSB0cnVuY2F0ZShyZXF1ZXN0LnVybCwgbWF4VmFsdWVMZW5ndGgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGFkZHMgYWxsIHVzZWQgaW50ZWdyYXRpb25zIHRvIHRoZSBTREsgaW5mbyBpbiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoIGFsbCBpbnRlZ3JhdGlvbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2FwcGx5SW50ZWdyYXRpb25zTWV0YWRhdGEoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgaW50ZWdyYXRpb25zQXJyYXkgPSBPYmplY3Qua2V5cyh0aGlzLl9pbnRlZ3JhdGlvbnMpO1xuICAgIGlmIChpbnRlZ3JhdGlvbnNBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICBldmVudC5zZGsgPSBldmVudC5zZGsgfHwge307XG4gICAgICBldmVudC5zZGsuaW50ZWdyYXRpb25zID0gWy4uLihldmVudC5zZGsuaW50ZWdyYXRpb25zIHx8IFtdKSwgLi4uaW50ZWdyYXRpb25zQXJyYXldO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUZWxscyB0aGUgYmFja2VuZCB0byBzZW5kIHRoaXMgZXZlbnRcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBTZW50cnkgZXZlbnQgdG8gc2VuZFxuICAgKi9cbiAgcHJvdGVjdGVkIF9zZW5kRXZlbnQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5fZ2V0QmFja2VuZCgpLnNlbmRFdmVudChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogUHJvY2Vzc2VzIHRoZSBldmVudCBhbmQgbG9ncyBhbiBlcnJvciBpbiBjYXNlIG9mIHJlamVjdGlvblxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICogQHBhcmFtIGhpbnRcbiAgICogQHBhcmFtIHNjb3BlXG4gICAqL1xuICBwcm90ZWN0ZWQgX2NhcHR1cmVFdmVudChldmVudDogRXZlbnQsIGhpbnQ/OiBFdmVudEhpbnQsIHNjb3BlPzogU2NvcGUpOiBQcm9taXNlTGlrZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc0V2ZW50KGV2ZW50LCBoaW50LCBzY29wZSkudGhlbihcbiAgICAgIGZpbmFsRXZlbnQgPT4ge1xuICAgICAgICByZXR1cm4gZmluYWxFdmVudC5ldmVudF9pZDtcbiAgICAgIH0sXG4gICAgICByZWFzb24gPT4ge1xuICAgICAgICBsb2dnZXIuZXJyb3IocmVhc29uKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgYW4gZXZlbnQgKGVpdGhlciBlcnJvciBvciBtZXNzYWdlKSBhbmQgc2VuZHMgaXQgdG8gU2VudHJ5LlxuICAgKlxuICAgKiBUaGlzIGFsc28gYWRkcyBicmVhZGNydW1icyBhbmQgY29udGV4dCBpbmZvcm1hdGlvbiB0byB0aGUgZXZlbnQuIEhvd2V2ZXIsXG4gICAqIHBsYXRmb3JtIHNwZWNpZmljIG1ldGEgZGF0YSAoc3VjaCBhcyB0aGUgVXNlcidzIElQIGFkZHJlc3MpIG11c3QgYmUgYWRkZWRcbiAgICogYnkgdGhlIFNESyBpbXBsZW1lbnRvci5cbiAgICpcbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBzZW5kIHRvIFNlbnRyeS5cbiAgICogQHBhcmFtIGhpbnQgTWF5IGNvbnRhaW4gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uLlxuICAgKiBAcGFyYW0gc2NvcGUgQSBzY29wZSBjb250YWluaW5nIGV2ZW50IG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyBBIFN5bmNQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgZXZlbnQgb3IgcmVqZWN0cyBpbiBjYXNlIGV2ZW50IHdhcy93aWxsIG5vdCBiZSBzZW5kLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9wcm9jZXNzRXZlbnQoZXZlbnQ6IEV2ZW50LCBoaW50PzogRXZlbnRIaW50LCBzY29wZT86IFNjb3BlKTogUHJvbWlzZUxpa2U8RXZlbnQ+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXG4gICAgY29uc3QgeyBiZWZvcmVTZW5kLCBzYW1wbGVSYXRlIH0gPSB0aGlzLmdldE9wdGlvbnMoKTtcbiAgICBjb25zdCB0cmFuc3BvcnQgPSB0aGlzLmdldFRyYW5zcG9ydCgpO1xuXG4gICAgaWYgKCF0aGlzLl9pc0VuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIFN5bmNQcm9taXNlLnJlamVjdChuZXcgU2VudHJ5RXJyb3IoJ1NESyBub3QgZW5hYmxlZCwgd2lsbCBub3QgY2FwdHVyZSBldmVudC4nKSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNUcmFuc2FjdGlvbiA9IGV2ZW50LnR5cGUgPT09ICd0cmFuc2FjdGlvbic7XG4gICAgLy8gMS4wID09PSAxMDAlIGV2ZW50cyBhcmUgc2VudFxuICAgIC8vIDAuMCA9PT0gMCUgZXZlbnRzIGFyZSBzZW50XG4gICAgLy8gU2FtcGxpbmcgZm9yIHRyYW5zYWN0aW9uIGhhcHBlbnMgc29tZXdoZXJlIGVsc2VcbiAgICBpZiAoIWlzVHJhbnNhY3Rpb24gJiYgdHlwZW9mIHNhbXBsZVJhdGUgPT09ICdudW1iZXInICYmIE1hdGgucmFuZG9tKCkgPiBzYW1wbGVSYXRlKSB7XG4gICAgICB0cmFuc3BvcnQucmVjb3JkTG9zdEV2ZW50Py4oT3V0Y29tZS5TYW1wbGVSYXRlLCAnZXZlbnQnKTtcbiAgICAgIHJldHVybiBTeW5jUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBTZW50cnlFcnJvcihcbiAgICAgICAgICBgRGlzY2FyZGluZyBldmVudCBiZWNhdXNlIGl0J3Mgbm90IGluY2x1ZGVkIGluIHRoZSByYW5kb20gc2FtcGxlIChzYW1wbGluZyByYXRlID0gJHtzYW1wbGVSYXRlfSlgLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZUV2ZW50KGV2ZW50LCBzY29wZSwgaGludClcbiAgICAgIC50aGVuKHByZXBhcmVkID0+IHtcbiAgICAgICAgaWYgKHByZXBhcmVkID09PSBudWxsKSB7XG4gICAgICAgICAgdHJhbnNwb3J0LnJlY29yZExvc3RFdmVudD8uKE91dGNvbWUuRXZlbnRQcm9jZXNzb3IsIGV2ZW50LnR5cGUgfHwgJ2V2ZW50Jyk7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKCdBbiBldmVudCBwcm9jZXNzb3IgcmV0dXJuZWQgbnVsbCwgd2lsbCBub3Qgc2VuZCBldmVudC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzSW50ZXJuYWxFeGNlcHRpb24gPSBoaW50ICYmIGhpbnQuZGF0YSAmJiAoaGludC5kYXRhIGFzIHsgX19zZW50cnlfXzogYm9vbGVhbiB9KS5fX3NlbnRyeV9fID09PSB0cnVlO1xuICAgICAgICBpZiAoaXNJbnRlcm5hbEV4Y2VwdGlvbiB8fCBpc1RyYW5zYWN0aW9uIHx8ICFiZWZvcmVTZW5kKSB7XG4gICAgICAgICAgcmV0dXJuIHByZXBhcmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmVmb3JlU2VuZFJlc3VsdCA9IGJlZm9yZVNlbmQocHJlcGFyZWQsIGhpbnQpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5zdXJlQmVmb3JlU2VuZFJ2KGJlZm9yZVNlbmRSZXN1bHQpO1xuICAgICAgfSlcbiAgICAgIC50aGVuKHByb2Nlc3NlZEV2ZW50ID0+IHtcbiAgICAgICAgaWYgKHByb2Nlc3NlZEV2ZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgdHJhbnNwb3J0LnJlY29yZExvc3RFdmVudD8uKE91dGNvbWUuQmVmb3JlU2VuZCwgZXZlbnQudHlwZSB8fCAnZXZlbnQnKTtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VudHJ5RXJyb3IoJ2BiZWZvcmVTZW5kYCByZXR1cm5lZCBgbnVsbGAsIHdpbGwgbm90IHNlbmQgZXZlbnQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZXNzaW9uID0gc2NvcGUgJiYgc2NvcGUuZ2V0U2Vzc2lvbiAmJiBzY29wZS5nZXRTZXNzaW9uKCk7XG4gICAgICAgIGlmICghaXNUcmFuc2FjdGlvbiAmJiBzZXNzaW9uKSB7XG4gICAgICAgICAgdGhpcy5fdXBkYXRlU2Vzc2lvbkZyb21FdmVudChzZXNzaW9uLCBwcm9jZXNzZWRFdmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zZW5kRXZlbnQocHJvY2Vzc2VkRXZlbnQpO1xuICAgICAgICByZXR1cm4gcHJvY2Vzc2VkRXZlbnQ7XG4gICAgICB9KVxuICAgICAgLnRoZW4obnVsbCwgcmVhc29uID0+IHtcbiAgICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIFNlbnRyeUVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYXB0dXJlRXhjZXB0aW9uKHJlYXNvbiwge1xuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIF9fc2VudHJ5X186IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcmlnaW5hbEV4Y2VwdGlvbjogcmVhc29uIGFzIEVycm9yLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKFxuICAgICAgICAgIGBFdmVudCBwcm9jZXNzaW5nIHBpcGVsaW5lIHRocmV3IGFuIGVycm9yLCBvcmlnaW5hbCBldmVudCB3aWxsIG5vdCBiZSBzZW50LiBEZXRhaWxzIGhhdmUgYmVlbiBzZW50IGFzIGEgbmV3IGV2ZW50LlxcblJlYXNvbjogJHtyZWFzb259YCxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VwaWVzIHRoZSBjbGllbnQgd2l0aCBwcm9jZXNzaW5nIGFuZCBldmVudFxuICAgKi9cbiAgcHJvdGVjdGVkIF9wcm9jZXNzPFQ+KHByb21pc2U6IFByb21pc2VMaWtlPFQ+KTogdm9pZCB7XG4gICAgdGhpcy5fbnVtUHJvY2Vzc2luZyArPSAxO1xuICAgIHZvaWQgcHJvbWlzZS50aGVuKFxuICAgICAgdmFsdWUgPT4ge1xuICAgICAgICB0aGlzLl9udW1Qcm9jZXNzaW5nIC09IDE7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0sXG4gICAgICByZWFzb24gPT4ge1xuICAgICAgICB0aGlzLl9udW1Qcm9jZXNzaW5nIC09IDE7XG4gICAgICAgIHJldHVybiByZWFzb247XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCByZXR1cm4gdmFsdWUgb2YgY29uZmlndXJlZCBgYmVmb3JlU2VuZGAgaXMgb2YgZXhwZWN0ZWQgdHlwZS5cbiAgICovXG4gIHByb3RlY3RlZCBfZW5zdXJlQmVmb3JlU2VuZFJ2KFxuICAgIHJ2OiBQcm9taXNlTGlrZTxFdmVudCB8IG51bGw+IHwgRXZlbnQgfCBudWxsLFxuICApOiBQcm9taXNlTGlrZTxFdmVudCB8IG51bGw+IHwgRXZlbnQgfCBudWxsIHtcbiAgICBjb25zdCBudWxsRXJyID0gJ2BiZWZvcmVTZW5kYCBtZXRob2QgaGFzIHRvIHJldHVybiBgbnVsbGAgb3IgYSB2YWxpZCBldmVudC4nO1xuICAgIGlmIChpc1RoZW5hYmxlKHJ2KSkge1xuICAgICAgcmV0dXJuIChydiBhcyBQcm9taXNlTGlrZTxFdmVudCB8IG51bGw+KS50aGVuKFxuICAgICAgICBldmVudCA9PiB7XG4gICAgICAgICAgaWYgKCEoaXNQbGFpbk9iamVjdChldmVudCkgfHwgZXZlbnQgPT09IG51bGwpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgU2VudHJ5RXJyb3IobnVsbEVycik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBldmVudDtcbiAgICAgICAgfSxcbiAgICAgICAgZSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKGBiZWZvcmVTZW5kIHJlamVjdGVkIHdpdGggJHtlfWApO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKCEoaXNQbGFpbk9iamVjdChydikgfHwgcnYgPT09IG51bGwpKSB7XG4gICAgICB0aHJvdyBuZXcgU2VudHJ5RXJyb3IobnVsbEVycik7XG4gICAgfVxuICAgIHJldHVybiBydjtcbiAgfVxufVxuIiwgImltcG9ydCB7IEV2ZW50LCBSZXNwb25zZSwgU3RhdHVzLCBUcmFuc3BvcnQgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IFN5bmNQcm9taXNlIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbi8qKiBOb29wIHRyYW5zcG9ydCAqL1xuZXhwb3J0IGNsYXNzIE5vb3BUcmFuc3BvcnQgaW1wbGVtZW50cyBUcmFuc3BvcnQge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZW5kRXZlbnQoXzogRXZlbnQpOiBQcm9taXNlTGlrZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiBTeW5jUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgIHJlYXNvbjogYE5vb3BUcmFuc3BvcnQ6IEV2ZW50IGhhcyBiZWVuIHNraXBwZWQgYmVjYXVzZSBubyBEc24gaXMgY29uZmlndXJlZC5gLFxuICAgICAgc3RhdHVzOiBTdGF0dXMuU2tpcHBlZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNsb3NlKF8/OiBudW1iZXIpOiBQcm9taXNlTGlrZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIFN5bmNQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBFdmVudCwgRXZlbnRIaW50LCBPcHRpb25zLCBTZXNzaW9uLCBTZXZlcml0eSwgVHJhbnNwb3J0IH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBsb2dnZXIsIFNlbnRyeUVycm9yIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmltcG9ydCB7IE5vb3BUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydHMvbm9vcCc7XG5cbi8qKlxuICogSW50ZXJuYWwgcGxhdGZvcm0tZGVwZW5kZW50IFNlbnRyeSBTREsgQmFja2VuZC5cbiAqXG4gKiBXaGlsZSB7QGxpbmsgQ2xpZW50fSBjb250YWlucyBidXNpbmVzcyBsb2dpYyBzcGVjaWZpYyB0byBhbiBTREssIHRoZVxuICogQmFja2VuZCBvZmZlcnMgcGxhdGZvcm0gc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIGZvciBsb3ctbGV2ZWwgb3BlcmF0aW9ucy5cbiAqIFRoZXNlIGFyZSBwZXJzaXN0aW5nIGFuZCBsb2FkaW5nIGluZm9ybWF0aW9uLCBzZW5kaW5nIGV2ZW50cywgYW5kIGhvb2tpbmdcbiAqIGludG8gdGhlIGVudmlyb25tZW50LlxuICpcbiAqIEJhY2tlbmRzIHJlY2VpdmUgYSBoYW5kbGUgdG8gdGhlIENsaWVudCBpbiB0aGVpciBjb25zdHJ1Y3Rvci4gV2hlbiBhXG4gKiBCYWNrZW5kIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIGV2ZW50cywgaXQgbXVzdCBwYXNzIHRoZW0gdG9cbiAqIHRoZSBDbGllbnQgZm9yIHZhbGlkYXRpb24gYW5kIHByb2Nlc3NpbmcgZmlyc3QuXG4gKlxuICogVXN1YWxseSwgdGhlIENsaWVudCB3aWxsIGJlIG9mIGNvcnJlc3BvbmRpbmcgdHlwZSwgZS5nLiBOb2RlQmFja2VuZFxuICogcmVjZWl2ZXMgTm9kZUNsaWVudC4gSG93ZXZlciwgaGlnaGVyLWxldmVsIFNES3MgY2FuIGNob29zZSB0byBpbnN0YW50aWF0ZVxuICogbXVsdGlwbGUgQmFja2VuZHMgYW5kIGRlbGVnYXRlIHRhc2tzIGJldHdlZW4gdGhlbS4gSW4gdGhpcyBjYXNlLCBhbiBldmVudFxuICogZ2VuZXJhdGVkIGJ5IG9uZSBiYWNrZW5kIG1pZ2h0IHZlcnkgd2VsbCBiZSBzZW50IGJ5IGFub3RoZXIgb25lLlxuICpcbiAqIFRoZSBjbGllbnQgYWxzbyBwcm92aWRlcyBhY2Nlc3MgdG8gb3B0aW9ucyB2aWEge0BsaW5rIENsaWVudC5nZXRPcHRpb25zfS5cbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYWNrZW5kIHtcbiAgLyoqIENyZWF0ZXMgYSB7QGxpbmsgRXZlbnR9IGZyb20gYW4gZXhjZXB0aW9uLiAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBldmVudEZyb21FeGNlcHRpb24oZXhjZXB0aW9uOiBhbnksIGhpbnQ/OiBFdmVudEhpbnQpOiBQcm9taXNlTGlrZTxFdmVudD47XG5cbiAgLyoqIENyZWF0ZXMgYSB7QGxpbmsgRXZlbnR9IGZyb20gYSBwbGFpbiBtZXNzYWdlLiAqL1xuICBldmVudEZyb21NZXNzYWdlKG1lc3NhZ2U6IHN0cmluZywgbGV2ZWw/OiBTZXZlcml0eSwgaGludD86IEV2ZW50SGludCk6IFByb21pc2VMaWtlPEV2ZW50PjtcblxuICAvKiogU3VibWl0cyB0aGUgZXZlbnQgdG8gU2VudHJ5ICovXG4gIHNlbmRFdmVudChldmVudDogRXZlbnQpOiB2b2lkO1xuXG4gIC8qKiBTdWJtaXRzIHRoZSBzZXNzaW9uIHRvIFNlbnRyeSAqL1xuICBzZW5kU2Vzc2lvbihzZXNzaW9uOiBTZXNzaW9uKTogdm9pZDtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdHJhbnNwb3J0IHRoYXQgaXMgdXNlZCBieSB0aGUgYmFja2VuZC5cbiAgICogUGxlYXNlIG5vdGUgdGhhdCB0aGUgdHJhbnNwb3J0IGdldHMgbGF6eSBpbml0aWFsaXplZCBzbyBpdCB3aWxsIG9ubHkgYmUgdGhlcmUgb25jZSB0aGUgZmlyc3QgZXZlbnQgaGFzIGJlZW4gc2VudC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHRyYW5zcG9ydC5cbiAgICovXG4gIGdldFRyYW5zcG9ydCgpOiBUcmFuc3BvcnQ7XG59XG5cbi8qKlxuICogQSBjbGFzcyBvYmplY3QgdGhhdCBjYW4gaW5zdGFudGlhdGUgQmFja2VuZCBvYmplY3RzLlxuICogQGhpZGRlblxuICovXG5leHBvcnQgdHlwZSBCYWNrZW5kQ2xhc3M8QiBleHRlbmRzIEJhY2tlbmQsIE8gZXh0ZW5kcyBPcHRpb25zPiA9IG5ldyAob3B0aW9uczogTykgPT4gQjtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBiYXNlIGltcGxlbWVudGlvbiBvZiBhIEJhY2tlbmQuXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQmFja2VuZDxPIGV4dGVuZHMgT3B0aW9ucz4gaW1wbGVtZW50cyBCYWNrZW5kIHtcbiAgLyoqIE9wdGlvbnMgcGFzc2VkIHRvIHRoZSBTREsuICovXG4gIHByb3RlY3RlZCByZWFkb25seSBfb3B0aW9uczogTztcblxuICAvKiogQ2FjaGVkIHRyYW5zcG9ydCB1c2VkIGludGVybmFsbHkuICovXG4gIHByb3RlY3RlZCBfdHJhbnNwb3J0OiBUcmFuc3BvcnQ7XG5cbiAgLyoqIENyZWF0ZXMgYSBuZXcgYmFja2VuZCBpbnN0YW5jZS4gKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE8pIHtcbiAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcbiAgICBpZiAoIXRoaXMuX29wdGlvbnMuZHNuKSB7XG4gICAgICBsb2dnZXIud2FybignTm8gRFNOIHByb3ZpZGVkLCBiYWNrZW5kIHdpbGwgbm90IGRvIGFueXRoaW5nLicpO1xuICAgIH1cbiAgICB0aGlzLl90cmFuc3BvcnQgPSB0aGlzLl9zZXR1cFRyYW5zcG9ydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuICBwdWJsaWMgZXZlbnRGcm9tRXhjZXB0aW9uKF9leGNlcHRpb246IGFueSwgX2hpbnQ/OiBFdmVudEhpbnQpOiBQcm9taXNlTGlrZTxFdmVudD4ge1xuICAgIHRocm93IG5ldyBTZW50cnlFcnJvcignQmFja2VuZCBoYXMgdG8gaW1wbGVtZW50IGBldmVudEZyb21FeGNlcHRpb25gIG1ldGhvZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgZXZlbnRGcm9tTWVzc2FnZShfbWVzc2FnZTogc3RyaW5nLCBfbGV2ZWw/OiBTZXZlcml0eSwgX2hpbnQ/OiBFdmVudEhpbnQpOiBQcm9taXNlTGlrZTxFdmVudD4ge1xuICAgIHRocm93IG5ldyBTZW50cnlFcnJvcignQmFja2VuZCBoYXMgdG8gaW1wbGVtZW50IGBldmVudEZyb21NZXNzYWdlYCBtZXRob2QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNlbmRFdmVudChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICB2b2lkIHRoaXMuX3RyYW5zcG9ydC5zZW5kRXZlbnQoZXZlbnQpLnRoZW4obnVsbCwgcmVhc29uID0+IHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRXJyb3Igd2hpbGUgc2VuZGluZyBldmVudDogJHtyZWFzb259YCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZW5kU2Vzc2lvbihzZXNzaW9uOiBTZXNzaW9uKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl90cmFuc3BvcnQuc2VuZFNlc3Npb24pIHtcbiAgICAgIGxvZ2dlci53YXJuKFwiRHJvcHBpbmcgc2Vzc2lvbiBiZWNhdXNlIGN1c3RvbSB0cmFuc3BvcnQgZG9lc24ndCBpbXBsZW1lbnQgc2VuZFNlc3Npb25cIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdm9pZCB0aGlzLl90cmFuc3BvcnQuc2VuZFNlc3Npb24oc2Vzc2lvbikudGhlbihudWxsLCByZWFzb24gPT4ge1xuICAgICAgbG9nZ2VyLmVycm9yKGBFcnJvciB3aGlsZSBzZW5kaW5nIHNlc3Npb246ICR7cmVhc29ufWApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgZ2V0VHJhbnNwb3J0KCk6IFRyYW5zcG9ydCB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIHRoZSB0cmFuc3BvcnQgc28gaXQgY2FuIGJlIHVzZWQgbGF0ZXIgdG8gc2VuZCByZXF1ZXN0cy5cbiAgICovXG4gIHByb3RlY3RlZCBfc2V0dXBUcmFuc3BvcnQoKTogVHJhbnNwb3J0IHtcbiAgICByZXR1cm4gbmV3IE5vb3BUcmFuc3BvcnQoKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IEV2ZW50LCBTZGtJbmZvLCBTZW50cnlSZXF1ZXN0LCBTZW50cnlSZXF1ZXN0VHlwZSwgU2Vzc2lvbiwgU2Vzc2lvbkFnZ3JlZ2F0ZXMgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcblxuaW1wb3J0IHsgQVBJIH0gZnJvbSAnLi9hcGknO1xuXG4vKiogRXh0cmFjdCBzZGsgaW5mbyBmcm9tIGZyb20gdGhlIEFQSSBtZXRhZGF0YSAqL1xuZnVuY3Rpb24gZ2V0U2RrTWV0YWRhdGFGb3JFbnZlbG9wZUhlYWRlcihhcGk6IEFQSSk6IFNka0luZm8gfCB1bmRlZmluZWQge1xuICBpZiAoIWFwaS5tZXRhZGF0YSB8fCAhYXBpLm1ldGFkYXRhLnNkaykge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB7IG5hbWUsIHZlcnNpb24gfSA9IGFwaS5tZXRhZGF0YS5zZGs7XG4gIHJldHVybiB7IG5hbWUsIHZlcnNpb24gfTtcbn1cblxuLyoqXG4gKiBBcHBseSBTZGtJbmZvIChuYW1lLCB2ZXJzaW9uLCBwYWNrYWdlcywgaW50ZWdyYXRpb25zKSB0byB0aGUgY29ycmVzcG9uZGluZyBldmVudCBrZXkuXG4gKiBNZXJnZSB3aXRoIGV4aXN0aW5nIGRhdGEgaWYgYW55LlxuICoqL1xuZnVuY3Rpb24gZW5oYW5jZUV2ZW50V2l0aFNka0luZm8oZXZlbnQ6IEV2ZW50LCBzZGtJbmZvPzogU2RrSW5mbyk6IEV2ZW50IHtcbiAgaWYgKCFzZGtJbmZvKSB7XG4gICAgcmV0dXJuIGV2ZW50O1xuICB9XG4gIGV2ZW50LnNkayA9IGV2ZW50LnNkayB8fCB7fTtcbiAgZXZlbnQuc2RrLm5hbWUgPSBldmVudC5zZGsubmFtZSB8fCBzZGtJbmZvLm5hbWU7XG4gIGV2ZW50LnNkay52ZXJzaW9uID0gZXZlbnQuc2RrLnZlcnNpb24gfHwgc2RrSW5mby52ZXJzaW9uO1xuICBldmVudC5zZGsuaW50ZWdyYXRpb25zID0gWy4uLihldmVudC5zZGsuaW50ZWdyYXRpb25zIHx8IFtdKSwgLi4uKHNka0luZm8uaW50ZWdyYXRpb25zIHx8IFtdKV07XG4gIGV2ZW50LnNkay5wYWNrYWdlcyA9IFsuLi4oZXZlbnQuc2RrLnBhY2thZ2VzIHx8IFtdKSwgLi4uKHNka0luZm8ucGFja2FnZXMgfHwgW10pXTtcbiAgcmV0dXJuIGV2ZW50O1xufVxuXG4vKiogQ3JlYXRlcyBhIFNlbnRyeVJlcXVlc3QgZnJvbSBhIFNlc3Npb24uICovXG5leHBvcnQgZnVuY3Rpb24gc2Vzc2lvblRvU2VudHJ5UmVxdWVzdChzZXNzaW9uOiBTZXNzaW9uIHwgU2Vzc2lvbkFnZ3JlZ2F0ZXMsIGFwaTogQVBJKTogU2VudHJ5UmVxdWVzdCB7XG4gIGNvbnN0IHNka0luZm8gPSBnZXRTZGtNZXRhZGF0YUZvckVudmVsb3BlSGVhZGVyKGFwaSk7XG4gIGNvbnN0IGVudmVsb3BlSGVhZGVycyA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICBzZW50X2F0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgLi4uKHNka0luZm8gJiYgeyBzZGs6IHNka0luZm8gfSksXG4gICAgLi4uKGFwaS5mb3JjZUVudmVsb3BlKCkgJiYgeyBkc246IGFwaS5nZXREc24oKS50b1N0cmluZygpIH0pLFxuICB9KTtcbiAgLy8gSSBrbm93IHRoaXMgaXMgaGFja3kgYnV0IHdlIGRvbid0IHdhbnQgdG8gYWRkIGBzZXNzaW9uYCB0byByZXF1ZXN0IHR5cGUgc2luY2UgaXQncyBuZXZlciByYXRlIGxpbWl0ZWRcbiAgY29uc3QgdHlwZTogU2VudHJ5UmVxdWVzdFR5cGUgPSAnYWdncmVnYXRlcycgaW4gc2Vzc2lvbiA/ICgnc2Vzc2lvbnMnIGFzIFNlbnRyeVJlcXVlc3RUeXBlKSA6ICdzZXNzaW9uJztcbiAgY29uc3QgaXRlbUhlYWRlcnMgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgdHlwZSxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBib2R5OiBgJHtlbnZlbG9wZUhlYWRlcnN9XFxuJHtpdGVtSGVhZGVyc31cXG4ke0pTT04uc3RyaW5naWZ5KHNlc3Npb24pfWAsXG4gICAgdHlwZSxcbiAgICB1cmw6IGFwaS5nZXRFbnZlbG9wZUVuZHBvaW50V2l0aFVybEVuY29kZWRBdXRoKCksXG4gIH07XG59XG5cbi8qKiBDcmVhdGVzIGEgU2VudHJ5UmVxdWVzdCBmcm9tIGFuIGV2ZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZW50VG9TZW50cnlSZXF1ZXN0KGV2ZW50OiBFdmVudCwgYXBpOiBBUEkpOiBTZW50cnlSZXF1ZXN0IHtcbiAgY29uc3Qgc2RrSW5mbyA9IGdldFNka01ldGFkYXRhRm9yRW52ZWxvcGVIZWFkZXIoYXBpKTtcbiAgY29uc3QgZXZlbnRUeXBlID0gZXZlbnQudHlwZSB8fCAnZXZlbnQnO1xuICBjb25zdCB1c2VFbnZlbG9wZSA9IGV2ZW50VHlwZSA9PT0gJ3RyYW5zYWN0aW9uJyB8fCBhcGkuZm9yY2VFbnZlbG9wZSgpO1xuXG4gIGNvbnN0IHsgdHJhbnNhY3Rpb25TYW1wbGluZywgLi4ubWV0YWRhdGEgfSA9IGV2ZW50LmRlYnVnX21ldGEgfHwge307XG4gIGNvbnN0IHsgbWV0aG9kOiBzYW1wbGluZ01ldGhvZCwgcmF0ZTogc2FtcGxlUmF0ZSB9ID0gdHJhbnNhY3Rpb25TYW1wbGluZyB8fCB7fTtcbiAgaWYgKE9iamVjdC5rZXlzKG1ldGFkYXRhKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUgZXZlbnQuZGVidWdfbWV0YTtcbiAgfSBlbHNlIHtcbiAgICBldmVudC5kZWJ1Z19tZXRhID0gbWV0YWRhdGE7XG4gIH1cblxuICBjb25zdCByZXE6IFNlbnRyeVJlcXVlc3QgPSB7XG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoc2RrSW5mbyA/IGVuaGFuY2VFdmVudFdpdGhTZGtJbmZvKGV2ZW50LCBhcGkubWV0YWRhdGEuc2RrKSA6IGV2ZW50KSxcbiAgICB0eXBlOiBldmVudFR5cGUsXG4gICAgdXJsOiB1c2VFbnZlbG9wZSA/IGFwaS5nZXRFbnZlbG9wZUVuZHBvaW50V2l0aFVybEVuY29kZWRBdXRoKCkgOiBhcGkuZ2V0U3RvcmVFbmRwb2ludFdpdGhVcmxFbmNvZGVkQXV0aCgpLFxuICB9O1xuXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcC5zZW50cnkuZGV2L3Nkay9lbnZlbG9wZXMvXG5cbiAgLy8gU2luY2Ugd2UgZG9uJ3QgbmVlZCB0byBtYW5pcHVsYXRlIGVudmVsb3BlcyBub3Igc3RvcmUgdGhlbSwgdGhlcmUgaXMgbm9cbiAgLy8gZXhwb3J0ZWQgY29uY2VwdCBvZiBhbiBFbnZlbG9wZSB3aXRoIG9wZXJhdGlvbnMgaW5jbHVkaW5nIHNlcmlhbGl6YXRpb24gYW5kXG4gIC8vIGRlc2VyaWFsaXphdGlvbi4gSW5zdGVhZCwgd2Ugb25seSBpbXBsZW1lbnQgYSBtaW5pbWFsIHN1YnNldCBvZiB0aGUgc3BlYyB0b1xuICAvLyBzZXJpYWxpemUgZXZlbnRzIGlubGluZSBoZXJlLlxuICBpZiAodXNlRW52ZWxvcGUpIHtcbiAgICBjb25zdCBlbnZlbG9wZUhlYWRlcnMgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudF9pZDogZXZlbnQuZXZlbnRfaWQsXG4gICAgICBzZW50X2F0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAuLi4oc2RrSW5mbyAmJiB7IHNkazogc2RrSW5mbyB9KSxcbiAgICAgIC4uLihhcGkuZm9yY2VFbnZlbG9wZSgpICYmIHsgZHNuOiBhcGkuZ2V0RHNuKCkudG9TdHJpbmcoKSB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBpdGVtSGVhZGVycyA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHR5cGU6IGV2ZW50VHlwZSxcblxuICAgICAgLy8gVE9ETzogUmlnaHQgbm93LCBzYW1wbGVSYXRlIG1heSBvciBtYXkgbm90IGJlIGRlZmluZWQgKGl0IHdvbid0IGJlIGluIHRoZSBjYXNlcyBvZiBpbmhlcml0YW5jZSBhbmRcbiAgICAgIC8vIGV4cGxpY2l0bHktc2V0IHNhbXBsaW5nIGRlY2lzaW9ucykuIEFyZSB3ZSBnb29kIHdpdGggdGhhdD9cbiAgICAgIHNhbXBsZV9yYXRlczogW3sgaWQ6IHNhbXBsaW5nTWV0aG9kLCByYXRlOiBzYW1wbGVSYXRlIH1dLFxuXG4gICAgICAvLyBUaGUgY29udGVudC10eXBlIGlzIGFzc3VtZWQgdG8gYmUgJ2FwcGxpY2F0aW9uL2pzb24nIGFuZCBub3QgcGFydCBvZlxuICAgICAgLy8gdGhlIGN1cnJlbnQgc3BlYyBmb3IgdHJhbnNhY3Rpb24gaXRlbXMsIHNvIHdlIGRvbid0IGJsb2F0IHRoZSByZXF1ZXN0XG4gICAgICAvLyBib2R5IHdpdGggaXQuXG4gICAgICAvL1xuICAgICAgLy8gY29udGVudF90eXBlOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAvL1xuICAgICAgLy8gVGhlIGxlbmd0aCBpcyBvcHRpb25hbC4gSXQgbXVzdCBiZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHJlcS5Cb2R5XG4gICAgICAvLyBlbmNvZGVkIGFzIFVURi04LiBTaW5jZSB0aGUgc2VydmVyIGNhbiBmaWd1cmUgdGhpcyBvdXQgYW5kIHdvdWxkXG4gICAgICAvLyBvdGhlcndpc2UgcmVmdXNlIGV2ZW50cyB0aGF0IHJlcG9ydCB0aGUgbGVuZ3RoIGluY29ycmVjdGx5LCB3ZSBkZWNpZGVkXG4gICAgICAvLyBub3QgdG8gc2VuZCB0aGUgbGVuZ3RoIHRvIGF2b2lkIHByb2JsZW1zIHJlbGF0ZWQgdG8gcmVwb3J0aW5nIHRoZSB3cm9uZ1xuICAgICAgLy8gc2l6ZSBhbmQgdG8gcmVkdWNlIHJlcXVlc3QgYm9keSBzaXplLlxuICAgICAgLy9cbiAgICAgIC8vIGxlbmd0aDogbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHJlcS5ib2R5KS5sZW5ndGgsXG4gICAgfSk7XG4gICAgLy8gVGhlIHRyYWlsaW5nIG5ld2xpbmUgaXMgb3B0aW9uYWwuIFdlIGludGVudGlvbmFsbHkgZG9uJ3Qgc2VuZCBpdCB0byBhdm9pZFxuICAgIC8vIHNlbmRpbmcgdW5uZWNlc3NhcnkgYnl0ZXMuXG4gICAgLy9cbiAgICAvLyBjb25zdCBlbnZlbG9wZSA9IGAke2VudmVsb3BlSGVhZGVyc31cXG4ke2l0ZW1IZWFkZXJzfVxcbiR7cmVxLmJvZHl9XFxuYDtcbiAgICBjb25zdCBlbnZlbG9wZSA9IGAke2VudmVsb3BlSGVhZGVyc31cXG4ke2l0ZW1IZWFkZXJzfVxcbiR7cmVxLmJvZHl9YDtcbiAgICByZXEuYm9keSA9IGVudmVsb3BlO1xuICB9XG5cbiAgcmV0dXJuIHJlcTtcbn1cbiIsICJpbXBvcnQgeyBnZXRDdXJyZW50SHViIH0gZnJvbSAnQHNlbnRyeS9odWInO1xuaW1wb3J0IHsgQ2xpZW50LCBPcHRpb25zIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuLyoqIEEgY2xhc3Mgb2JqZWN0IHRoYXQgY2FuIGluc3RhbnRpYXRlIENsaWVudCBvYmplY3RzLiAqL1xuZXhwb3J0IHR5cGUgQ2xpZW50Q2xhc3M8RiBleHRlbmRzIENsaWVudCwgTyBleHRlbmRzIE9wdGlvbnM+ID0gbmV3IChvcHRpb25zOiBPKSA9PiBGO1xuXG4vKipcbiAqIEludGVybmFsIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBTREsgY2xpZW50IGluc3RhbmNlLiBUaGUgY2xpZW50IGlzXG4gKiBpbnN0YWxsZWQgYW5kIHRoZW4gYm91bmQgdG8gdGhlIGN1cnJlbnQgc2NvcGUuXG4gKlxuICogQHBhcmFtIGNsaWVudENsYXNzIFRoZSBjbGllbnQgY2xhc3MgdG8gaW5zdGFudGlhdGUuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNsaWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRBbmRCaW5kPEYgZXh0ZW5kcyBDbGllbnQsIE8gZXh0ZW5kcyBPcHRpb25zPihjbGllbnRDbGFzczogQ2xpZW50Q2xhc3M8RiwgTz4sIG9wdGlvbnM6IE8pOiB2b2lkIHtcbiAgaWYgKG9wdGlvbnMuZGVidWcgPT09IHRydWUpIHtcbiAgICBsb2dnZXIuZW5hYmxlKCk7XG4gIH1cbiAgY29uc3QgaHViID0gZ2V0Q3VycmVudEh1YigpO1xuICBodWIuZ2V0U2NvcGUoKT8udXBkYXRlKG9wdGlvbnMuaW5pdGlhbFNjb3BlKTtcbiAgY29uc3QgY2xpZW50ID0gbmV3IGNsaWVudENsYXNzKG9wdGlvbnMpO1xuICBodWIuYmluZENsaWVudChjbGllbnQpO1xufVxuIiwgImV4cG9ydCBjb25zdCBTREtfVkVSU0lPTiA9ICc2LjE2LjEnO1xuIiwgImltcG9ydCB7IEludGVncmF0aW9uLCBXcmFwcGVkRnVuY3Rpb24gfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcblxubGV0IG9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZzogKCkgPT4gdm9pZDtcblxuLyoqIFBhdGNoIHRvU3RyaW5nIGNhbGxzIHRvIHJldHVybiBwcm9wZXIgbmFtZSBmb3Igd3JhcHBlZCBmdW5jdGlvbnMgKi9cbmV4cG9ydCBjbGFzcyBGdW5jdGlvblRvU3RyaW5nIGltcGxlbWVudHMgSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWQ6IHN0cmluZyA9ICdGdW5jdGlvblRvU3RyaW5nJztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBGdW5jdGlvblRvU3RyaW5nLmlkO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldHVwT25jZSgpOiB2b2lkIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXG4gICAgb3JpZ2luYWxGdW5jdGlvblRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbih0aGlzOiBXcmFwcGVkRnVuY3Rpb24sIC4uLmFyZ3M6IGFueVtdKTogc3RyaW5nIHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9fc2VudHJ5X29yaWdpbmFsX18gfHwgdGhpcztcbiAgICAgIHJldHVybiBvcmlnaW5hbEZ1bmN0aW9uVG9TdHJpbmcuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgfTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yLCBnZXRDdXJyZW50SHViIH0gZnJvbSAnQHNlbnRyeS9odWInO1xuaW1wb3J0IHsgRXZlbnQsIEludGVncmF0aW9uLCBTdGFja0ZyYW1lIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBnZXRFdmVudERlc2NyaXB0aW9uLCBpc01hdGNoaW5nUGF0dGVybiwgbG9nZ2VyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbi8vIFwiU2NyaXB0IGVycm9yLlwiIGlzIGhhcmQgY29kZWQgaW50byBicm93c2VycyBmb3IgZXJyb3JzIHRoYXQgaXQgY2FuJ3QgcmVhZC5cbi8vIHRoaXMgaXMgdGhlIHJlc3VsdCBvZiBhIHNjcmlwdCBiZWluZyBwdWxsZWQgaW4gZnJvbSBhbiBleHRlcm5hbCBkb21haW4gYW5kIENPUlMuXG5jb25zdCBERUZBVUxUX0lHTk9SRV9FUlJPUlMgPSBbL15TY3JpcHQgZXJyb3JcXC4/JC8sIC9eSmF2YXNjcmlwdCBlcnJvcjogU2NyaXB0IGVycm9yXFwuPyBvbiBsaW5lIDAkL107XG5cbi8qKiBKU0RvYyAqL1xuaW50ZXJmYWNlIEluYm91bmRGaWx0ZXJzT3B0aW9ucyB7XG4gIGFsbG93VXJsczogQXJyYXk8c3RyaW5nIHwgUmVnRXhwPjtcbiAgZGVueVVybHM6IEFycmF5PHN0cmluZyB8IFJlZ0V4cD47XG4gIGlnbm9yZUVycm9yczogQXJyYXk8c3RyaW5nIHwgUmVnRXhwPjtcbiAgaWdub3JlSW50ZXJuYWw6IGJvb2xlYW47XG5cbiAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgSW5ib3VuZEZpbHRlcnNPcHRpb25zLmFsbG93VXJsc30gaW5zdGVhZC4gKi9cbiAgd2hpdGVsaXN0VXJsczogQXJyYXk8c3RyaW5nIHwgUmVnRXhwPjtcbiAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgSW5ib3VuZEZpbHRlcnNPcHRpb25zLmRlbnlVcmxzfSBpbnN0ZWFkLiAqL1xuICBibGFja2xpc3RVcmxzOiBBcnJheTxzdHJpbmcgfCBSZWdFeHA+O1xufVxuXG4vKiogSW5ib3VuZCBmaWx0ZXJzIGNvbmZpZ3VyYWJsZSBieSB0aGUgdXNlciAqL1xuZXhwb3J0IGNsYXNzIEluYm91bmRGaWx0ZXJzIGltcGxlbWVudHMgSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWQ6IHN0cmluZyA9ICdJbmJvdW5kRmlsdGVycyc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgbmFtZTogc3RyaW5nID0gSW5ib3VuZEZpbHRlcnMuaWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnM6IFBhcnRpYWw8SW5ib3VuZEZpbHRlcnNPcHRpb25zPiA9IHt9KSB7fVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldHVwT25jZSgpOiB2b2lkIHtcbiAgICBhZGRHbG9iYWxFdmVudFByb2Nlc3NvcigoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBodWIgPSBnZXRDdXJyZW50SHViKCk7XG4gICAgICBpZiAoIWh1Yikge1xuICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgICB9XG4gICAgICBjb25zdCBzZWxmID0gaHViLmdldEludGVncmF0aW9uKEluYm91bmRGaWx0ZXJzKTtcbiAgICAgIGlmIChzZWxmKSB7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IGh1Yi5nZXRDbGllbnQoKTtcbiAgICAgICAgY29uc3QgY2xpZW50T3B0aW9ucyA9IGNsaWVudCA/IGNsaWVudC5nZXRPcHRpb25zKCkgOiB7fTtcbiAgICAgICAgLy8gVGhpcyBjaGVja3MgcHJldmVudHMgbW9zdCBvZiB0aGUgb2NjdXJyZW5jZXMgb2YgdGhlIGJ1ZyBsaW5rZWQgYmVsb3c6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzI2MjJcbiAgICAgICAgLy8gVGhlIGJ1ZyBpcyBjYXVzZWQgYnkgbXVsdGlwbGUgU0RLIGluc3RhbmNlcywgd2hlcmUgb25lIGlzIG1pbmlmaWVkIGFuZCBvbmUgaXMgdXNpbmcgbm9uLW1hbmdsZWQgY29kZS5cbiAgICAgICAgLy8gVW5mb3J0dW5hdGVsbHkgd2UgY2Fubm90IGZpeCBpdCByZWxpYWJseSAodGh1cyByZXNlcnZlZCBwcm9wZXJ0eSBpbiByb2xsdXAncyB0ZXJzZXIgY29uZmlnKSxcbiAgICAgICAgLy8gYXMgd2UgY2Fubm90IGZvcmNlIHBlb3BsZSB1c2luZyBtdWx0aXBsZSBpbnN0YW5jZXMgaW4gdGhlaXIgYXBwcyB0byBzeW5jIFNESyB2ZXJzaW9ucy5cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHR5cGVvZiBzZWxmLl9tZXJnZU9wdGlvbnMgPT09ICdmdW5jdGlvbicgPyBzZWxmLl9tZXJnZU9wdGlvbnMoY2xpZW50T3B0aW9ucykgOiB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBzZWxmLl9zaG91bGREcm9wRXZlbnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlbGYuX3Nob3VsZERyb3BFdmVudChldmVudCwgb3B0aW9ucykgPyBudWxsIDogZXZlbnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfSk7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHJpdmF0ZSBfc2hvdWxkRHJvcEV2ZW50KGV2ZW50OiBFdmVudCwgb3B0aW9uczogUGFydGlhbDxJbmJvdW5kRmlsdGVyc09wdGlvbnM+KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2lzU2VudHJ5RXJyb3IoZXZlbnQsIG9wdGlvbnMpKSB7XG4gICAgICBsb2dnZXIud2FybihgRXZlbnQgZHJvcHBlZCBkdWUgdG8gYmVpbmcgaW50ZXJuYWwgU2VudHJ5IEVycm9yLlxcbkV2ZW50OiAke2dldEV2ZW50RGVzY3JpcHRpb24oZXZlbnQpfWApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9pc0lnbm9yZWRFcnJvcihldmVudCwgb3B0aW9ucykpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgRXZlbnQgZHJvcHBlZCBkdWUgdG8gYmVpbmcgbWF0Y2hlZCBieSBcXGBpZ25vcmVFcnJvcnNcXGAgb3B0aW9uLlxcbkV2ZW50OiAke2dldEV2ZW50RGVzY3JpcHRpb24oZXZlbnQpfWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9pc0RlbmllZFVybChldmVudCwgb3B0aW9ucykpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgRXZlbnQgZHJvcHBlZCBkdWUgdG8gYmVpbmcgbWF0Y2hlZCBieSBcXGBkZW55VXJsc1xcYCBvcHRpb24uXFxuRXZlbnQ6ICR7Z2V0RXZlbnREZXNjcmlwdGlvbihcbiAgICAgICAgICBldmVudCxcbiAgICAgICAgKX0uXFxuVXJsOiAke3RoaXMuX2dldEV2ZW50RmlsdGVyVXJsKGV2ZW50KX1gLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2lzQWxsb3dlZFVybChldmVudCwgb3B0aW9ucykpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgRXZlbnQgZHJvcHBlZCBkdWUgdG8gbm90IGJlaW5nIG1hdGNoZWQgYnkgXFxgYWxsb3dVcmxzXFxgIG9wdGlvbi5cXG5FdmVudDogJHtnZXRFdmVudERlc2NyaXB0aW9uKFxuICAgICAgICAgIGV2ZW50LFxuICAgICAgICApfS5cXG5Vcmw6ICR7dGhpcy5fZ2V0RXZlbnRGaWx0ZXJVcmwoZXZlbnQpfWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwcml2YXRlIF9pc1NlbnRyeUVycm9yKGV2ZW50OiBFdmVudCwgb3B0aW9uczogUGFydGlhbDxJbmJvdW5kRmlsdGVyc09wdGlvbnM+KTogYm9vbGVhbiB7XG4gICAgaWYgKCFvcHRpb25zLmlnbm9yZUludGVybmFsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChldmVudCAmJlxuICAgICAgICAgIGV2ZW50LmV4Y2VwdGlvbiAmJlxuICAgICAgICAgIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgJiZcbiAgICAgICAgICBldmVudC5leGNlcHRpb24udmFsdWVzWzBdICYmXG4gICAgICAgICAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS50eXBlID09PSAnU2VudHJ5RXJyb3InKSB8fFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChfb08pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHJpdmF0ZSBfaXNJZ25vcmVkRXJyb3IoZXZlbnQ6IEV2ZW50LCBvcHRpb25zOiBQYXJ0aWFsPEluYm91bmRGaWx0ZXJzT3B0aW9ucz4pOiBib29sZWFuIHtcbiAgICBpZiAoIW9wdGlvbnMuaWdub3JlRXJyb3JzIHx8ICFvcHRpb25zLmlnbm9yZUVycm9ycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZ2V0UG9zc2libGVFdmVudE1lc3NhZ2VzKGV2ZW50KS5zb21lKG1lc3NhZ2UgPT5cbiAgICAgIC8vIE5vdCBzdXJlIHdoeSBUeXBlU2NyaXB0IGNvbXBsYWlucyBoZXJlLi4uXG4gICAgICAob3B0aW9ucy5pZ25vcmVFcnJvcnMgYXMgQXJyYXk8UmVnRXhwIHwgc3RyaW5nPikuc29tZShwYXR0ZXJuID0+IGlzTWF0Y2hpbmdQYXR0ZXJuKG1lc3NhZ2UsIHBhdHRlcm4pKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHByaXZhdGUgX2lzRGVuaWVkVXJsKGV2ZW50OiBFdmVudCwgb3B0aW9uczogUGFydGlhbDxJbmJvdW5kRmlsdGVyc09wdGlvbnM+KTogYm9vbGVhbiB7XG4gICAgLy8gVE9ETzogVXNlIEdsb2IgaW5zdGVhZD9cbiAgICBpZiAoIW9wdGlvbnMuZGVueVVybHMgfHwgIW9wdGlvbnMuZGVueVVybHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHRoaXMuX2dldEV2ZW50RmlsdGVyVXJsKGV2ZW50KTtcbiAgICByZXR1cm4gIXVybCA/IGZhbHNlIDogb3B0aW9ucy5kZW55VXJscy5zb21lKHBhdHRlcm4gPT4gaXNNYXRjaGluZ1BhdHRlcm4odXJsLCBwYXR0ZXJuKSk7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHJpdmF0ZSBfaXNBbGxvd2VkVXJsKGV2ZW50OiBFdmVudCwgb3B0aW9uczogUGFydGlhbDxJbmJvdW5kRmlsdGVyc09wdGlvbnM+KTogYm9vbGVhbiB7XG4gICAgLy8gVE9ETzogVXNlIEdsb2IgaW5zdGVhZD9cbiAgICBpZiAoIW9wdGlvbnMuYWxsb3dVcmxzIHx8ICFvcHRpb25zLmFsbG93VXJscy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSB0aGlzLl9nZXRFdmVudEZpbHRlclVybChldmVudCk7XG4gICAgcmV0dXJuICF1cmwgPyB0cnVlIDogb3B0aW9ucy5hbGxvd1VybHMuc29tZShwYXR0ZXJuID0+IGlzTWF0Y2hpbmdQYXR0ZXJuKHVybCwgcGF0dGVybikpO1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHByaXZhdGUgX21lcmdlT3B0aW9ucyhjbGllbnRPcHRpb25zOiBQYXJ0aWFsPEluYm91bmRGaWx0ZXJzT3B0aW9ucz4gPSB7fSk6IFBhcnRpYWw8SW5ib3VuZEZpbHRlcnNPcHRpb25zPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFsbG93VXJsczogW1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cbiAgICAgICAgLi4uKHRoaXMuX29wdGlvbnMud2hpdGVsaXN0VXJscyB8fCBbXSksXG4gICAgICAgIC4uLih0aGlzLl9vcHRpb25zLmFsbG93VXJscyB8fCBbXSksXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuICAgICAgICAuLi4oY2xpZW50T3B0aW9ucy53aGl0ZWxpc3RVcmxzIHx8IFtdKSxcbiAgICAgICAgLi4uKGNsaWVudE9wdGlvbnMuYWxsb3dVcmxzIHx8IFtdKSxcbiAgICAgIF0sXG4gICAgICBkZW55VXJsczogW1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cbiAgICAgICAgLi4uKHRoaXMuX29wdGlvbnMuYmxhY2tsaXN0VXJscyB8fCBbXSksXG4gICAgICAgIC4uLih0aGlzLl9vcHRpb25zLmRlbnlVcmxzIHx8IFtdKSxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG4gICAgICAgIC4uLihjbGllbnRPcHRpb25zLmJsYWNrbGlzdFVybHMgfHwgW10pLFxuICAgICAgICAuLi4oY2xpZW50T3B0aW9ucy5kZW55VXJscyB8fCBbXSksXG4gICAgICBdLFxuICAgICAgaWdub3JlRXJyb3JzOiBbXG4gICAgICAgIC4uLih0aGlzLl9vcHRpb25zLmlnbm9yZUVycm9ycyB8fCBbXSksXG4gICAgICAgIC4uLihjbGllbnRPcHRpb25zLmlnbm9yZUVycm9ycyB8fCBbXSksXG4gICAgICAgIC4uLkRFRkFVTFRfSUdOT1JFX0VSUk9SUyxcbiAgICAgIF0sXG4gICAgICBpZ25vcmVJbnRlcm5hbDogdHlwZW9mIHRoaXMuX29wdGlvbnMuaWdub3JlSW50ZXJuYWwgIT09ICd1bmRlZmluZWQnID8gdGhpcy5fb3B0aW9ucy5pZ25vcmVJbnRlcm5hbCA6IHRydWUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwcml2YXRlIF9nZXRQb3NzaWJsZUV2ZW50TWVzc2FnZXMoZXZlbnQ6IEV2ZW50KTogc3RyaW5nW10ge1xuICAgIGlmIChldmVudC5tZXNzYWdlKSB7XG4gICAgICByZXR1cm4gW2V2ZW50Lm1lc3NhZ2VdO1xuICAgIH1cbiAgICBpZiAoZXZlbnQuZXhjZXB0aW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IHR5cGUgPSAnJywgdmFsdWUgPSAnJyB9ID0gKGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXSkgfHwge307XG4gICAgICAgIHJldHVybiBbYCR7dmFsdWV9YCwgYCR7dHlwZX06ICR7dmFsdWV9YF07XG4gICAgICB9IGNhdGNoIChvTykge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYENhbm5vdCBleHRyYWN0IG1lc3NhZ2UgZm9yIGV2ZW50ICR7Z2V0RXZlbnREZXNjcmlwdGlvbihldmVudCl9YCk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHByaXZhdGUgX2dldExhc3RWYWxpZFVybChmcmFtZXM6IFN0YWNrRnJhbWVbXSA9IFtdKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgZm9yIChsZXQgaSA9IGZyYW1lcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgZnJhbWUgPSBmcmFtZXNbaV07XG5cbiAgICAgIGlmIChmcmFtZT8uZmlsZW5hbWUgIT09ICc8YW5vbnltb3VzPicgJiYgZnJhbWU/LmZpbGVuYW1lICE9PSAnW25hdGl2ZSBjb2RlXScpIHtcbiAgICAgICAgcmV0dXJuIGZyYW1lLmZpbGVuYW1lIHx8IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHJpdmF0ZSBfZ2V0RXZlbnRGaWx0ZXJVcmwoZXZlbnQ6IEV2ZW50KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChldmVudC5zdGFja3RyYWNlKSB7XG4gICAgICAgIGNvbnN0IGZyYW1lcyA9IGV2ZW50LnN0YWNrdHJhY2UuZnJhbWVzO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TGFzdFZhbGlkVXJsKGZyYW1lcyk7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQuZXhjZXB0aW9uKSB7XG4gICAgICAgIGNvbnN0IGZyYW1lcyA9XG4gICAgICAgICAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyAmJiBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLnN0YWNrdHJhY2UgJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS5zdGFja3RyYWNlLmZyYW1lcztcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldExhc3RWYWxpZFVybChmcmFtZXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBjYXRjaCAob08pIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgQ2Fubm90IGV4dHJhY3QgdXJsIGZvciBldmVudCAke2dldEV2ZW50RGVzY3JpcHRpb24oZXZlbnQpfWApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG4iLCAiZXhwb3J0IHsgRnVuY3Rpb25Ub1N0cmluZyB9IGZyb20gJy4vZnVuY3Rpb250b3N0cmluZyc7XG5leHBvcnQgeyBJbmJvdW5kRmlsdGVycyB9IGZyb20gJy4vaW5ib3VuZGZpbHRlcnMnO1xuIiwgImV4cG9ydCB7XG4gIGFkZEJyZWFkY3J1bWIsXG4gIGNhcHR1cmVFeGNlcHRpb24sXG4gIGNhcHR1cmVFdmVudCxcbiAgY2FwdHVyZU1lc3NhZ2UsXG4gIGNvbmZpZ3VyZVNjb3BlLFxuICBzdGFydFRyYW5zYWN0aW9uLFxuICBzZXRDb250ZXh0LFxuICBzZXRFeHRyYSxcbiAgc2V0RXh0cmFzLFxuICBzZXRUYWcsXG4gIHNldFRhZ3MsXG4gIHNldFVzZXIsXG4gIHdpdGhTY29wZSxcbn0gZnJvbSAnQHNlbnRyeS9taW5pbWFsJztcbmV4cG9ydCB7IGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yLCBnZXRDdXJyZW50SHViLCBnZXRIdWJGcm9tQ2FycmllciwgSHViLCBtYWtlTWFpbiwgU2NvcGUgfSBmcm9tICdAc2VudHJ5L2h1Yic7XG5leHBvcnQgeyBBUEkgfSBmcm9tICcuL2FwaSc7XG5leHBvcnQgeyBCYXNlQ2xpZW50IH0gZnJvbSAnLi9iYXNlY2xpZW50JztcbmV4cG9ydCB7IEJhY2tlbmRDbGFzcywgQmFzZUJhY2tlbmQgfSBmcm9tICcuL2Jhc2ViYWNrZW5kJztcbmV4cG9ydCB7IGV2ZW50VG9TZW50cnlSZXF1ZXN0LCBzZXNzaW9uVG9TZW50cnlSZXF1ZXN0IH0gZnJvbSAnLi9yZXF1ZXN0JztcbmV4cG9ydCB7IGluaXRBbmRCaW5kLCBDbGllbnRDbGFzcyB9IGZyb20gJy4vc2RrJztcbmV4cG9ydCB7IE5vb3BUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydHMvbm9vcCc7XG5leHBvcnQgeyBTREtfVkVSU0lPTiB9IGZyb20gJy4vdmVyc2lvbic7XG5cbmltcG9ydCAqIGFzIEludGVncmF0aW9ucyBmcm9tICcuL2ludGVncmF0aW9ucyc7XG5cbmV4cG9ydCB7IEludGVncmF0aW9ucyB9O1xuIiwgIi8qKlxuICogQSBkb3VibHkgbGlua2VkIGxpc3QtYmFzZWQgTGVhc3QgUmVjZW50bHkgVXNlZCAoTFJVKSBjYWNoZS4gV2lsbCBrZWVwIG1vc3RcbiAqIHJlY2VudGx5IHVzZWQgaXRlbXMgd2hpbGUgZGlzY2FyZGluZyBsZWFzdCByZWNlbnRseSB1c2VkIGl0ZW1zIHdoZW4gaXRzIGxpbWl0XG4gKiBpcyByZWFjaGVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVC4gQ29weXJpZ2h0IChjKSAyMDEwIFJhc211cyBBbmRlcnNzb24gPGh0dHA6Ly9odW5jaC5zZS8+XG4gKiBTZWUgUkVBRE1FLm1kIGZvciBkZXRhaWxzLlxuICpcbiAqIElsbHVzdHJhdGlvbiBvZiB0aGUgZGVzaWduOlxuICpcbiAqICAgICAgIGVudHJ5ICAgICAgICAgICAgIGVudHJ5ICAgICAgICAgICAgIGVudHJ5ICAgICAgICAgICAgIGVudHJ5XG4gKiAgICAgICBfX19fX18gICAgICAgICAgICBfX19fX18gICAgICAgICAgICBfX19fX18gICAgICAgICAgICBfX19fX19cbiAqICAgICAgfCBoZWFkIHwubmV3ZXIgPT4gfCAgICAgIHwubmV3ZXIgPT4gfCAgICAgIHwubmV3ZXIgPT4gfCB0YWlsIHxcbiAqICAgICAgfCAgQSAgIHwgICAgICAgICAgfCAgQiAgIHwgICAgICAgICAgfCAgQyAgIHwgICAgICAgICAgfCAgRCAgIHxcbiAqICAgICAgfF9fX19fX3wgPD0gb2xkZXIufF9fX19fX3wgPD0gb2xkZXIufF9fX19fX3wgPD0gb2xkZXIufF9fX19fX3xcbiAqXG4gKiAgcmVtb3ZlZCAgPC0tICA8LS0gIDwtLSAgPC0tICA8LS0gIDwtLSAgPC0tICA8LS0gIDwtLSAgPC0tICA8LS0gIGFkZGVkXG4gKi9cbihmdW5jdGlvbihnLGYpe1xuICBjb25zdCBlID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgPyBleHBvcnRzIDogdHlwZW9mIGcgPT0gJ29iamVjdCcgPyBnIDoge307XG4gIGYoZSk7XG4gIGlmICh0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgeyBkZWZpbmUoJ2xydScsIGUpOyB9XG59KSh0aGlzLCBmdW5jdGlvbihleHBvcnRzKSB7XG5cbmNvbnN0IE5FV0VSID0gU3ltYm9sKCduZXdlcicpO1xuY29uc3QgT0xERVIgPSBTeW1ib2woJ29sZGVyJyk7XG5cbmZ1bmN0aW9uIExSVU1hcChsaW1pdCwgZW50cmllcykge1xuICBpZiAodHlwZW9mIGxpbWl0ICE9PSAnbnVtYmVyJykge1xuICAgIC8vIGNhbGxlZCBhcyAoZW50cmllcylcbiAgICBlbnRyaWVzID0gbGltaXQ7XG4gICAgbGltaXQgPSAwO1xuICB9XG5cbiAgdGhpcy5zaXplID0gMDtcbiAgdGhpcy5saW1pdCA9IGxpbWl0O1xuICB0aGlzLm9sZGVzdCA9IHRoaXMubmV3ZXN0ID0gdW5kZWZpbmVkO1xuICB0aGlzLl9rZXltYXAgPSBuZXcgTWFwKCk7XG5cbiAgaWYgKGVudHJpZXMpIHtcbiAgICB0aGlzLmFzc2lnbihlbnRyaWVzKTtcbiAgICBpZiAobGltaXQgPCAxKSB7XG4gICAgICB0aGlzLmxpbWl0ID0gdGhpcy5zaXplO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnRzLkxSVU1hcCA9IExSVU1hcDtcblxuZnVuY3Rpb24gRW50cnkoa2V5LCB2YWx1ZSkge1xuICB0aGlzLmtleSA9IGtleTtcbiAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB0aGlzW05FV0VSXSA9IHVuZGVmaW5lZDtcbiAgdGhpc1tPTERFUl0gPSB1bmRlZmluZWQ7XG59XG5cblxuTFJVTWFwLnByb3RvdHlwZS5fbWFya0VudHJ5QXNVc2VkID0gZnVuY3Rpb24oZW50cnkpIHtcbiAgaWYgKGVudHJ5ID09PSB0aGlzLm5ld2VzdCkge1xuICAgIC8vIEFscmVhZHkgdGhlIG1vc3QgcmVjZW5sdHkgdXNlZCBlbnRyeSwgc28gbm8gbmVlZCB0byB1cGRhdGUgdGhlIGxpc3RcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gSEVBRC0tLS0tLS0tLS0tLS0tVEFJTFxuICAvLyAgIDwub2xkZXIgICAubmV3ZXI+XG4gIC8vICA8LS0tIGFkZCBkaXJlY3Rpb24gLS1cbiAgLy8gICBBICBCICBDICA8RD4gIEVcbiAgaWYgKGVudHJ5W05FV0VSXSkge1xuICAgIGlmIChlbnRyeSA9PT0gdGhpcy5vbGRlc3QpIHtcbiAgICAgIHRoaXMub2xkZXN0ID0gZW50cnlbTkVXRVJdO1xuICAgIH1cbiAgICBlbnRyeVtORVdFUl1bT0xERVJdID0gZW50cnlbT0xERVJdOyAvLyBDIDwtLSBFLlxuICB9XG4gIGlmIChlbnRyeVtPTERFUl0pIHtcbiAgICBlbnRyeVtPTERFUl1bTkVXRVJdID0gZW50cnlbTkVXRVJdOyAvLyBDLiAtLT4gRVxuICB9XG4gIGVudHJ5W05FV0VSXSA9IHVuZGVmaW5lZDsgLy8gRCAtLXhcbiAgZW50cnlbT0xERVJdID0gdGhpcy5uZXdlc3Q7IC8vIEQuIC0tPiBFXG4gIGlmICh0aGlzLm5ld2VzdCkge1xuICAgIHRoaXMubmV3ZXN0W05FV0VSXSA9IGVudHJ5OyAvLyBFLiA8LS0gRFxuICB9XG4gIHRoaXMubmV3ZXN0ID0gZW50cnk7XG59O1xuXG5MUlVNYXAucHJvdG90eXBlLmFzc2lnbiA9IGZ1bmN0aW9uKGVudHJpZXMpIHtcbiAgbGV0IGVudHJ5LCBsaW1pdCA9IHRoaXMubGltaXQgfHwgTnVtYmVyLk1BWF9WQUxVRTtcbiAgdGhpcy5fa2V5bWFwLmNsZWFyKCk7XG4gIGxldCBpdCA9IGVudHJpZXNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICBmb3IgKGxldCBpdHYgPSBpdC5uZXh0KCk7ICFpdHYuZG9uZTsgaXR2ID0gaXQubmV4dCgpKSB7XG4gICAgbGV0IGUgPSBuZXcgRW50cnkoaXR2LnZhbHVlWzBdLCBpdHYudmFsdWVbMV0pO1xuICAgIHRoaXMuX2tleW1hcC5zZXQoZS5rZXksIGUpO1xuICAgIGlmICghZW50cnkpIHtcbiAgICAgIHRoaXMub2xkZXN0ID0gZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW50cnlbTkVXRVJdID0gZTtcbiAgICAgIGVbT0xERVJdID0gZW50cnk7XG4gICAgfVxuICAgIGVudHJ5ID0gZTtcbiAgICBpZiAobGltaXQtLSA9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ292ZXJmbG93Jyk7XG4gICAgfVxuICB9XG4gIHRoaXMubmV3ZXN0ID0gZW50cnk7XG4gIHRoaXMuc2l6ZSA9IHRoaXMuX2tleW1hcC5zaXplO1xufTtcblxuTFJVTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihrZXkpIHtcbiAgLy8gRmlyc3QsIGZpbmQgb3VyIGNhY2hlIGVudHJ5XG4gIHZhciBlbnRyeSA9IHRoaXMuX2tleW1hcC5nZXQoa2V5KTtcbiAgaWYgKCFlbnRyeSkgcmV0dXJuOyAvLyBOb3QgY2FjaGVkLiBTb3JyeS5cbiAgLy8gQXMgPGtleT4gd2FzIGZvdW5kIGluIHRoZSBjYWNoZSwgcmVnaXN0ZXIgaXQgYXMgYmVpbmcgcmVxdWVzdGVkIHJlY2VudGx5XG4gIHRoaXMuX21hcmtFbnRyeUFzVXNlZChlbnRyeSk7XG4gIHJldHVybiBlbnRyeS52YWx1ZTtcbn07XG5cbkxSVU1hcC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICB2YXIgZW50cnkgPSB0aGlzLl9rZXltYXAuZ2V0KGtleSk7XG5cbiAgaWYgKGVudHJ5KSB7XG4gICAgLy8gdXBkYXRlIGV4aXN0aW5nXG4gICAgZW50cnkudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLl9tYXJrRW50cnlBc1VzZWQoZW50cnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gbmV3IGVudHJ5XG4gIHRoaXMuX2tleW1hcC5zZXQoa2V5LCAoZW50cnkgPSBuZXcgRW50cnkoa2V5LCB2YWx1ZSkpKTtcblxuICBpZiAodGhpcy5uZXdlc3QpIHtcbiAgICAvLyBsaW5rIHByZXZpb3VzIHRhaWwgdG8gdGhlIG5ldyB0YWlsIChlbnRyeSlcbiAgICB0aGlzLm5ld2VzdFtORVdFUl0gPSBlbnRyeTtcbiAgICBlbnRyeVtPTERFUl0gPSB0aGlzLm5ld2VzdDtcbiAgfSBlbHNlIHtcbiAgICAvLyB3ZSdyZSBmaXJzdCBpbiAtLSB5YXlcbiAgICB0aGlzLm9sZGVzdCA9IGVudHJ5O1xuICB9XG5cbiAgLy8gYWRkIG5ldyBlbnRyeSB0byB0aGUgZW5kIG9mIHRoZSBsaW5rZWQgbGlzdCAtLSBpdCdzIG5vdyB0aGUgZnJlc2hlc3QgZW50cnkuXG4gIHRoaXMubmV3ZXN0ID0gZW50cnk7XG4gICsrdGhpcy5zaXplO1xuICBpZiAodGhpcy5zaXplID4gdGhpcy5saW1pdCkge1xuICAgIC8vIHdlIGhpdCB0aGUgbGltaXQgLS0gcmVtb3ZlIHRoZSBoZWFkXG4gICAgdGhpcy5zaGlmdCgpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5MUlVNYXAucHJvdG90eXBlLnNoaWZ0ID0gZnVuY3Rpb24oKSB7XG4gIC8vIHRvZG86IGhhbmRsZSBzcGVjaWFsIGNhc2Ugd2hlbiBsaW1pdCA9PSAxXG4gIHZhciBlbnRyeSA9IHRoaXMub2xkZXN0O1xuICBpZiAoZW50cnkpIHtcbiAgICBpZiAodGhpcy5vbGRlc3RbTkVXRVJdKSB7XG4gICAgICAvLyBhZHZhbmNlIHRoZSBsaXN0XG4gICAgICB0aGlzLm9sZGVzdCA9IHRoaXMub2xkZXN0W05FV0VSXTtcbiAgICAgIHRoaXMub2xkZXN0W09MREVSXSA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhlIGNhY2hlIGlzIGV4aGF1c3RlZFxuICAgICAgdGhpcy5vbGRlc3QgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLm5ld2VzdCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gUmVtb3ZlIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZSB0byA8ZW50cnk+IGFuZCByZW1vdmUgbGlua3MgZnJvbSB0aGUgcHVyZ2VkXG4gICAgLy8gZW50cnkgYmVpbmcgcmV0dXJuZWQ6XG4gICAgZW50cnlbTkVXRVJdID0gZW50cnlbT0xERVJdID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2tleW1hcC5kZWxldGUoZW50cnkua2V5KTtcbiAgICAtLXRoaXMuc2l6ZTtcbiAgICByZXR1cm4gW2VudHJ5LmtleSwgZW50cnkudmFsdWVdO1xuICB9XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBGb2xsb3dpbmcgY29kZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIHJlbW92ZWQgd2l0aG91dCBicmVha2luZyB0aGUgY29yZVxuLy8gZnVuY3Rpb25hbGl0eS5cblxuTFJVTWFwLnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24oa2V5KSB7XG4gIGxldCBlID0gdGhpcy5fa2V5bWFwLmdldChrZXkpO1xuICByZXR1cm4gZSA/IGUudmFsdWUgOiB1bmRlZmluZWQ7XG59O1xuXG5MUlVNYXAucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uKGtleSkge1xuICByZXR1cm4gdGhpcy5fa2V5bWFwLmhhcyhrZXkpO1xufTtcblxuTFJVTWFwLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBmdW5jdGlvbihrZXkpIHtcbiAgdmFyIGVudHJ5ID0gdGhpcy5fa2V5bWFwLmdldChrZXkpO1xuICBpZiAoIWVudHJ5KSByZXR1cm47XG4gIHRoaXMuX2tleW1hcC5kZWxldGUoZW50cnkua2V5KTtcbiAgaWYgKGVudHJ5W05FV0VSXSAmJiBlbnRyeVtPTERFUl0pIHtcbiAgICAvLyByZWxpbmsgdGhlIG9sZGVyIGVudHJ5IHdpdGggdGhlIG5ld2VyIGVudHJ5XG4gICAgZW50cnlbT0xERVJdW05FV0VSXSA9IGVudHJ5W05FV0VSXTtcbiAgICBlbnRyeVtORVdFUl1bT0xERVJdID0gZW50cnlbT0xERVJdO1xuICB9IGVsc2UgaWYgKGVudHJ5W05FV0VSXSkge1xuICAgIC8vIHJlbW92ZSB0aGUgbGluayB0byB1c1xuICAgIGVudHJ5W05FV0VSXVtPTERFUl0gPSB1bmRlZmluZWQ7XG4gICAgLy8gbGluayB0aGUgbmV3ZXIgZW50cnkgdG8gaGVhZFxuICAgIHRoaXMub2xkZXN0ID0gZW50cnlbTkVXRVJdO1xuICB9IGVsc2UgaWYgKGVudHJ5W09MREVSXSkge1xuICAgIC8vIHJlbW92ZSB0aGUgbGluayB0byB1c1xuICAgIGVudHJ5W09MREVSXVtORVdFUl0gPSB1bmRlZmluZWQ7XG4gICAgLy8gbGluayB0aGUgbmV3ZXIgZW50cnkgdG8gaGVhZFxuICAgIHRoaXMubmV3ZXN0ID0gZW50cnlbT0xERVJdO1xuICB9IGVsc2Ugey8vIGlmKGVudHJ5W09MREVSXSA9PT0gdW5kZWZpbmVkICYmIGVudHJ5Lm5ld2VyID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzLm9sZGVzdCA9IHRoaXMubmV3ZXN0ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgdGhpcy5zaXplLS07XG4gIHJldHVybiBlbnRyeS52YWx1ZTtcbn07XG5cbkxSVU1hcC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbigpIHtcbiAgLy8gTm90IGNsZWFyaW5nIGxpbmtzIHNob3VsZCBiZSBzYWZlLCBhcyB3ZSBkb24ndCBleHBvc2UgbGl2ZSBsaW5rcyB0byB1c2VyXG4gIHRoaXMub2xkZXN0ID0gdGhpcy5uZXdlc3QgPSB1bmRlZmluZWQ7XG4gIHRoaXMuc2l6ZSA9IDA7XG4gIHRoaXMuX2tleW1hcC5jbGVhcigpO1xufTtcblxuXG5mdW5jdGlvbiBFbnRyeUl0ZXJhdG9yKG9sZGVzdEVudHJ5KSB7IHRoaXMuZW50cnkgPSBvbGRlc3RFbnRyeTsgfVxuRW50cnlJdGVyYXRvci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfVxuRW50cnlJdGVyYXRvci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKCkge1xuICBsZXQgZW50ID0gdGhpcy5lbnRyeTtcbiAgaWYgKGVudCkge1xuICAgIHRoaXMuZW50cnkgPSBlbnRbTkVXRVJdO1xuICAgIHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogW2VudC5rZXksIGVudC52YWx1ZV0gfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gIH1cbn07XG5cblxuZnVuY3Rpb24gS2V5SXRlcmF0b3Iob2xkZXN0RW50cnkpIHsgdGhpcy5lbnRyeSA9IG9sZGVzdEVudHJ5OyB9XG5LZXlJdGVyYXRvci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfVxuS2V5SXRlcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbigpIHtcbiAgbGV0IGVudCA9IHRoaXMuZW50cnk7XG4gIGlmIChlbnQpIHtcbiAgICB0aGlzLmVudHJ5ID0gZW50W05FV0VSXTtcbiAgICByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IGVudC5rZXkgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gIH1cbn07XG5cbmZ1bmN0aW9uIFZhbHVlSXRlcmF0b3Iob2xkZXN0RW50cnkpIHsgdGhpcy5lbnRyeSA9IG9sZGVzdEVudHJ5OyB9XG5WYWx1ZUl0ZXJhdG9yLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9XG5WYWx1ZUl0ZXJhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gIGxldCBlbnQgPSB0aGlzLmVudHJ5O1xuICBpZiAoZW50KSB7XG4gICAgdGhpcy5lbnRyeSA9IGVudFtORVdFUl07XG4gICAgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBlbnQudmFsdWUgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gIH1cbn07XG5cblxuTFJVTWFwLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgS2V5SXRlcmF0b3IodGhpcy5vbGRlc3QpO1xufTtcblxuTFJVTWFwLnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBWYWx1ZUl0ZXJhdG9yKHRoaXMub2xkZXN0KTtcbn07XG5cbkxSVU1hcC5wcm90b3R5cGUuZW50cmllcyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcztcbn07XG5cbkxSVU1hcC5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IEVudHJ5SXRlcmF0b3IodGhpcy5vbGRlc3QpO1xufTtcblxuTFJVTWFwLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24oZnVuLCB0aGlzT2JqKSB7XG4gIGlmICh0eXBlb2YgdGhpc09iaiAhPT0gJ29iamVjdCcpIHtcbiAgICB0aGlzT2JqID0gdGhpcztcbiAgfVxuICBsZXQgZW50cnkgPSB0aGlzLm9sZGVzdDtcbiAgd2hpbGUgKGVudHJ5KSB7XG4gICAgZnVuLmNhbGwodGhpc09iaiwgZW50cnkudmFsdWUsIGVudHJ5LmtleSwgdGhpcyk7XG4gICAgZW50cnkgPSBlbnRyeVtORVdFUl07XG4gIH1cbn07XG5cbi8qKiBSZXR1cm5zIGEgSlNPTiAoYXJyYXkpIHJlcHJlc2VudGF0aW9uICovXG5MUlVNYXAucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcyA9IG5ldyBBcnJheSh0aGlzLnNpemUpLCBpID0gMCwgZW50cnkgPSB0aGlzLm9sZGVzdDtcbiAgd2hpbGUgKGVudHJ5KSB7XG4gICAgc1tpKytdID0geyBrZXk6IGVudHJ5LmtleSwgdmFsdWU6IGVudHJ5LnZhbHVlIH07XG4gICAgZW50cnkgPSBlbnRyeVtORVdFUl07XG4gIH1cbiAgcmV0dXJuIHM7XG59O1xuXG4vKiogUmV0dXJucyBhIFN0cmluZyByZXByZXNlbnRhdGlvbiAqL1xuTFJVTWFwLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcyA9ICcnLCBlbnRyeSA9IHRoaXMub2xkZXN0O1xuICB3aGlsZSAoZW50cnkpIHtcbiAgICBzICs9IFN0cmluZyhlbnRyeS5rZXkpKyc6JytlbnRyeS52YWx1ZTtcbiAgICBlbnRyeSA9IGVudHJ5W05FV0VSXTtcbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIHMgKz0gJyA8ICc7XG4gICAgfVxuICB9XG4gIHJldHVybiBzO1xufTtcblxufSk7XG4iLCAiLyoqXG4gKiBzdGFjay10cmFjZSAtIFBhcnNlcyBub2RlLmpzIHN0YWNrIHRyYWNlc1xuICpcbiAqIFRoaXMgd2FzIG9yaWdpbmFsbHkgZm9ya2VkIHRvIGZpeCB0aGlzIGlzc3VlOlxuICogaHR0cHM6Ly9naXRodWIuY29tL2ZlbGl4Z2Uvbm9kZS1zdGFjay10cmFjZS9pc3N1ZXMvMzFcbiAqXG4gKiBNYXIgMTksMjAxOSAtICM0ZmQzNzllXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL2ZlbGl4Z2Uvbm9kZS1zdGFjay10cmFjZS9cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbi8qKiBEZWNvZGVkIFN0YWNrRnJhbWUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tGcmFtZSB7XG4gIGZpbGVOYW1lOiBzdHJpbmc7XG4gIGxpbmVOdW1iZXI6IG51bWJlcjtcbiAgZnVuY3Rpb25OYW1lOiBzdHJpbmc7XG4gIHR5cGVOYW1lOiBzdHJpbmc7XG4gIG1ldGhvZE5hbWU6IHN0cmluZztcbiAgbmF0aXZlOiBib29sZWFuO1xuICBjb2x1bW5OdW1iZXI6IG51bWJlcjtcbn1cblxuLyoqIEV4dHJhY3RzIFN0YWNrRnJhbWVzIGZyb20gdGhlIEVycm9yICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2UoZXJyOiBFcnJvcik6IFN0YWNrRnJhbWVbXSB7XG4gIGlmICghZXJyLnN0YWNrKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgbGluZXMgPSBlcnIuc3RhY2suc3BsaXQoJ1xcbicpLnNsaWNlKDEpO1xuXG4gIHJldHVybiBsaW5lc1xuICAgIC5tYXAobGluZSA9PiB7XG4gICAgICBpZiAobGluZS5tYXRjaCgvXlxccypbLV17NCx9JC8pKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29sdW1uTnVtYmVyOiBudWxsLFxuICAgICAgICAgIGZpbGVOYW1lOiBsaW5lLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogbnVsbCxcbiAgICAgICAgICBsaW5lTnVtYmVyOiBudWxsLFxuICAgICAgICAgIG1ldGhvZE5hbWU6IG51bGwsXG4gICAgICAgICAgbmF0aXZlOiBudWxsLFxuICAgICAgICAgIHR5cGVOYW1lOiBudWxsLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsaW5lTWF0Y2ggPSBsaW5lLm1hdGNoKC9hdCAoPzooLis/KVxccytcXCgpPyg/OiguKz8pOihcXGQrKSg/OjooXFxkKykpP3woW14pXSspKVxcKT8vKTtcbiAgICAgIGlmICghbGluZU1hdGNoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGxldCBvYmplY3QgPSBudWxsO1xuICAgICAgbGV0IG1ldGhvZCA9IG51bGw7XG4gICAgICBsZXQgZnVuY3Rpb25OYW1lID0gbnVsbDtcbiAgICAgIGxldCB0eXBlTmFtZSA9IG51bGw7XG4gICAgICBsZXQgbWV0aG9kTmFtZSA9IG51bGw7XG4gICAgICBjb25zdCBpc05hdGl2ZSA9IGxpbmVNYXRjaFs1XSA9PT0gJ25hdGl2ZSc7XG5cbiAgICAgIGlmIChsaW5lTWF0Y2hbMV0pIHtcbiAgICAgICAgZnVuY3Rpb25OYW1lID0gbGluZU1hdGNoWzFdO1xuICAgICAgICBsZXQgbWV0aG9kU3RhcnQgPSBmdW5jdGlvbk5hbWUubGFzdEluZGV4T2YoJy4nKTtcbiAgICAgICAgaWYgKGZ1bmN0aW9uTmFtZVttZXRob2RTdGFydCAtIDFdID09PSAnLicpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXNcbiAgICAgICAgICBtZXRob2RTdGFydC0tO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRob2RTdGFydCA+IDApIHtcbiAgICAgICAgICBvYmplY3QgPSBmdW5jdGlvbk5hbWUuc3Vic3RyKDAsIG1ldGhvZFN0YXJ0KTtcbiAgICAgICAgICBtZXRob2QgPSBmdW5jdGlvbk5hbWUuc3Vic3RyKG1ldGhvZFN0YXJ0ICsgMSk7XG4gICAgICAgICAgY29uc3Qgb2JqZWN0RW5kID0gb2JqZWN0LmluZGV4T2YoJy5Nb2R1bGUnKTtcbiAgICAgICAgICBpZiAob2JqZWN0RW5kID4gMCkge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lID0gZnVuY3Rpb25OYW1lLnN1YnN0cihvYmplY3RFbmQgKyAxKTtcbiAgICAgICAgICAgIG9iamVjdCA9IG9iamVjdC5zdWJzdHIoMCwgb2JqZWN0RW5kKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdHlwZU5hbWUgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAobWV0aG9kKSB7XG4gICAgICAgIHR5cGVOYW1lID0gb2JqZWN0O1xuICAgICAgICBtZXRob2ROYW1lID0gbWV0aG9kO1xuICAgICAgfVxuXG4gICAgICBpZiAobWV0aG9kID09PSAnPGFub255bW91cz4nKSB7XG4gICAgICAgIG1ldGhvZE5hbWUgPSBudWxsO1xuICAgICAgICBmdW5jdGlvbk5hbWUgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0ge1xuICAgICAgICBjb2x1bW5OdW1iZXI6IHBhcnNlSW50KGxpbmVNYXRjaFs0XSwgMTApIHx8IG51bGwsXG4gICAgICAgIGZpbGVOYW1lOiBsaW5lTWF0Y2hbMl0gfHwgbnVsbCxcbiAgICAgICAgZnVuY3Rpb25OYW1lLFxuICAgICAgICBsaW5lTnVtYmVyOiBwYXJzZUludChsaW5lTWF0Y2hbM10sIDEwKSB8fCBudWxsLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBuYXRpdmU6IGlzTmF0aXZlLFxuICAgICAgICB0eXBlTmFtZSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgIH0pXG4gICAgLmZpbHRlcihjYWxsU2l0ZSA9PiAhIWNhbGxTaXRlKSBhcyBTdGFja0ZyYW1lW107XG59XG4iLCAiaW1wb3J0IHsgRXZlbnQsIEV4Y2VwdGlvbiwgRXh0ZW5kZWRFcnJvciwgU3RhY2tGcmFtZSB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgYWRkQ29udGV4dFRvRnJhbWUsIGJhc2VuYW1lLCBkaXJuYW1lLCBTeW5jUHJvbWlzZSB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBMUlVNYXAgfSBmcm9tICdscnVfbWFwJztcblxuaW1wb3J0ICogYXMgc3RhY2t0cmFjZSBmcm9tICcuL3N0YWNrdHJhY2UnO1xuaW1wb3J0IHsgTm9kZU9wdGlvbnMgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgREVGQVVMVF9MSU5FU19PRl9DT05URVhUOiBudW1iZXIgPSA3O1xuY29uc3QgRklMRV9DT05URU5UX0NBQ0hFID0gbmV3IExSVU1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KDEwMCk7XG5cbi8qKlxuICogUmVzZXRzIHRoZSBmaWxlIGNhY2hlLiBFeGlzdHMgZm9yIHRlc3RpbmcgcHVycG9zZXMuXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldEZpbGVDb250ZW50Q2FjaGUoKTogdm9pZCB7XG4gIEZJTEVfQ09OVEVOVF9DQUNIRS5jbGVhcigpO1xufVxuXG4vKiogSlNEb2MgKi9cbmZ1bmN0aW9uIGdldEZ1bmN0aW9uKGZyYW1lOiBzdGFja3RyYWNlLlN0YWNrRnJhbWUpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIHJldHVybiBmcmFtZS5mdW5jdGlvbk5hbWUgfHwgYCR7ZnJhbWUudHlwZU5hbWV9LiR7ZnJhbWUubWV0aG9kTmFtZSB8fCAnPGFub255bW91cz4nfWA7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBUaGlzIHNlZW1zIHRvIGhhcHBlbiBzb21ldGltZXMgd2hlbiB1c2luZyAndXNlIHN0cmljdCcsXG4gICAgLy8gc3RlbW1pbmcgZnJvbSBgZ2V0VHlwZU5hbWVgLlxuICAgIC8vIFtUeXBlRXJyb3I6IENhbm5vdCByZWFkIHByb3BlcnR5ICdjb25zdHJ1Y3Rvcicgb2YgdW5kZWZpbmVkXVxuICAgIHJldHVybiAnPGFub255bW91cz4nO1xuICB9XG59XG5cbmNvbnN0IG1haW5Nb2R1bGU6IHN0cmluZyA9IGAkeyhyZXF1aXJlLm1haW4gJiYgcmVxdWlyZS5tYWluLmZpbGVuYW1lICYmIGRpcm5hbWUocmVxdWlyZS5tYWluLmZpbGVuYW1lKSkgfHxcbiAgZ2xvYmFsLnByb2Nlc3MuY3dkKCl9L2A7XG5cbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gZ2V0TW9kdWxlKGZpbGVuYW1lOiBzdHJpbmcsIGJhc2U/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIWJhc2UpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICBiYXNlID0gbWFpbk1vZHVsZTtcbiAgfVxuXG4gIC8vIEl0J3Mgc3BlY2lmaWNhbGx5IGEgbW9kdWxlXG4gIGNvbnN0IGZpbGUgPSBiYXNlbmFtZShmaWxlbmFtZSwgJy5qcycpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgZmlsZW5hbWUgPSBkaXJuYW1lKGZpbGVuYW1lKTtcbiAgbGV0IG4gPSBmaWxlbmFtZS5sYXN0SW5kZXhPZignL25vZGVfbW9kdWxlcy8nKTtcbiAgaWYgKG4gPiAtMSkge1xuICAgIC8vIC9ub2RlX21vZHVsZXMvIGlzIDE0IGNoYXJzXG4gICAgcmV0dXJuIGAke2ZpbGVuYW1lLnN1YnN0cihuICsgMTQpLnJlcGxhY2UoL1xcLy9nLCAnLicpfToke2ZpbGV9YDtcbiAgfVxuICAvLyBMZXQncyBzZWUgaWYgaXQncyBhIHBhcnQgb2YgdGhlIG1haW4gbW9kdWxlXG4gIC8vIFRvIGJlIGEgcGFydCBvZiBtYWluIG1vZHVsZSwgaXQgaGFzIHRvIHNoYXJlIHRoZSBzYW1lIGJhc2VcbiAgbiA9IGAke2ZpbGVuYW1lfS9gLmxhc3RJbmRleE9mKGJhc2UsIDApO1xuICBpZiAobiA9PT0gMCkge1xuICAgIGxldCBtb2R1bGVOYW1lID0gZmlsZW5hbWUuc3Vic3RyKGJhc2UubGVuZ3RoKS5yZXBsYWNlKC9cXC8vZywgJy4nKTtcbiAgICBpZiAobW9kdWxlTmFtZSkge1xuICAgICAgbW9kdWxlTmFtZSArPSAnOic7XG4gICAgfVxuICAgIG1vZHVsZU5hbWUgKz0gZmlsZTtcbiAgICByZXR1cm4gbW9kdWxlTmFtZTtcbiAgfVxuICByZXR1cm4gZmlsZTtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGZpbGUgY29udGVudHMgYW5kIGNhY2hlcyB0aGVtIGluIGEgZ2xvYmFsIExSVSBjYWNoZS5cbiAqIFJldHVybnMgYSBQcm9taXNlIGZpbGVwYXRoID0+IGNvbnRlbnQgYXJyYXkgZm9yIGFsbCBmaWxlcyB0aGF0IHdlIHdlcmUgYWJsZSB0byByZWFkLlxuICpcbiAqIEBwYXJhbSBmaWxlbmFtZXMgQXJyYXkgb2YgZmlsZXBhdGhzIHRvIHJlYWQgY29udGVudCBmcm9tLlxuICovXG5mdW5jdGlvbiByZWFkU291cmNlRmlsZXMoZmlsZW5hbWVzOiBzdHJpbmdbXSk6IFByb21pc2VMaWtlPHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVsbCB9PiB7XG4gIC8vIHdlJ3JlIHJlbHlpbmcgb24gZmlsZW5hbWVzIGJlaW5nIGRlLWR1cGVkIGFscmVhZHlcbiAgaWYgKGZpbGVuYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gU3luY1Byb21pc2UucmVzb2x2ZSh7fSk7XG4gIH1cblxuICByZXR1cm4gbmV3IFN5bmNQcm9taXNlPHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudWxsO1xuICB9PihyZXNvbHZlID0+IHtcbiAgICBjb25zdCBzb3VyY2VGaWxlczoge1xuICAgICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVsbDtcbiAgICB9ID0ge307XG5cbiAgICBsZXQgY291bnQgPSAwO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLWZvci1vZlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZW5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IGZpbGVuYW1lc1tpXTtcblxuICAgICAgY29uc3QgY2FjaGUgPSBGSUxFX0NPTlRFTlRfQ0FDSEUuZ2V0KGZpbGVuYW1lKTtcbiAgICAgIC8vIFdlIGhhdmUgYSBjYWNoZSBoaXRcbiAgICAgIGlmIChjYWNoZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIElmIGl0J3Mgbm90IG51bGwgKHdoaWNoIG1lYW5zIHdlIGZvdW5kIGEgZmlsZSBhbmQgaGF2ZSBhIGNvbnRlbnQpXG4gICAgICAgIC8vIHdlIHNldCB0aGUgY29udGVudCBhbmQgcmV0dXJuIGl0IGxhdGVyLlxuICAgICAgICBpZiAoY2FjaGUgIT09IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2VGaWxlc1tmaWxlbmFtZV0gPSBjYWNoZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXNcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgLy8gSW4gYW55IGNhc2Ugd2Ugd2FudCB0byBza2lwIGhlcmUgdGhlbiBzaW5jZSB3ZSBoYXZlIGEgY29udGVudCBhbHJlYWR5IG9yIHdlIGNvdWxkbid0XG4gICAgICAgIC8vIHJlYWQgdGhlIGZpbGUgYW5kIGRvbid0IHdhbnQgdG8gdHJ5IGFnYWluLlxuICAgICAgICBpZiAoY291bnQgPT09IGZpbGVuYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgICByZXNvbHZlKHNvdXJjZUZpbGVzKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcmVhZEZpbGUoZmlsZW5hbWUsIChlcnI6IEVycm9yIHwgbnVsbCwgZGF0YTogQnVmZmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBlcnIgPyBudWxsIDogZGF0YS50b1N0cmluZygpO1xuICAgICAgICBzb3VyY2VGaWxlc1tmaWxlbmFtZV0gPSBjb250ZW50O1xuXG4gICAgICAgIC8vIFdlIGFsd2F5cyB3YW50IHRvIHNldCB0aGUgY2FjaGUsIGV2ZW4gdG8gbnVsbCB3aGljaCBtZWFucyB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyB0aGUgZmlsZS5cbiAgICAgICAgLy8gV2UgZG8gbm90IHdhbnQgdG8gdHJ5IHRvIHJlYWQgdGhlIGZpbGUgYWdhaW4uXG4gICAgICAgIEZJTEVfQ09OVEVOVF9DQUNIRS5zZXQoZmlsZW5hbWUsIGNvbnRlbnQpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXNcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgaWYgKGNvdW50ID09PSBmaWxlbmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgcmVzb2x2ZShzb3VyY2VGaWxlcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFN0YWNrRnJvbUVycm9yKGVycm9yOiBFcnJvcik6IHN0YWNrdHJhY2UuU3RhY2tGcmFtZVtdIHtcbiAgY29uc3Qgc3RhY2sgPSBzdGFja3RyYWNlLnBhcnNlKGVycm9yKTtcbiAgaWYgKCFzdGFjaykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gc3RhY2s7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdGFjayhzdGFjazogc3RhY2t0cmFjZS5TdGFja0ZyYW1lW10sIG9wdGlvbnM/OiBOb2RlT3B0aW9ucyk6IFByb21pc2VMaWtlPFN0YWNrRnJhbWVbXT4ge1xuICBjb25zdCBmaWxlc1RvUmVhZDogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdCBsaW5lc09mQ29udGV4dCA9XG4gICAgb3B0aW9ucyAmJiBvcHRpb25zLmZyYW1lQ29udGV4dExpbmVzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmZyYW1lQ29udGV4dExpbmVzIDogREVGQVVMVF9MSU5FU19PRl9DT05URVhUO1xuXG4gIGNvbnN0IGZyYW1lczogU3RhY2tGcmFtZVtdID0gc3RhY2subWFwKGZyYW1lID0+IHtcbiAgICBjb25zdCBwYXJzZWRGcmFtZTogU3RhY2tGcmFtZSA9IHtcbiAgICAgIGNvbG5vOiBmcmFtZS5jb2x1bW5OdW1iZXIsXG4gICAgICBmaWxlbmFtZTogZnJhbWUuZmlsZU5hbWU/LnN0YXJ0c1dpdGgoJ2ZpbGU6Ly8nKSA/IGZyYW1lLmZpbGVOYW1lLnN1YnN0cig3KSA6IGZyYW1lLmZpbGVOYW1lIHx8ICcnLFxuICAgICAgZnVuY3Rpb246IGdldEZ1bmN0aW9uKGZyYW1lKSxcbiAgICAgIGxpbmVubzogZnJhbWUubGluZU51bWJlcixcbiAgICB9O1xuXG4gICAgY29uc3QgaXNJbnRlcm5hbCA9XG4gICAgICBmcmFtZS5uYXRpdmUgfHxcbiAgICAgIChwYXJzZWRGcmFtZS5maWxlbmFtZSAmJlxuICAgICAgICAhcGFyc2VkRnJhbWUuZmlsZW5hbWUuc3RhcnRzV2l0aCgnLycpICYmXG4gICAgICAgICFwYXJzZWRGcmFtZS5maWxlbmFtZS5zdGFydHNXaXRoKCcuJykgJiZcbiAgICAgICAgcGFyc2VkRnJhbWUuZmlsZW5hbWUuaW5kZXhPZignOlxcXFwnKSAhPT0gMSk7XG5cbiAgICAvLyBpbl9hcHAgaXMgYWxsIHRoYXQncyBub3QgYW4gaW50ZXJuYWwgTm9kZSBmdW5jdGlvbiBvciBhIG1vZHVsZSB3aXRoaW4gbm9kZV9tb2R1bGVzXG4gICAgLy8gbm90ZSB0aGF0IGlzTmF0aXZlIGFwcGVhcnMgdG8gcmV0dXJuIHRydWUgZXZlbiBmb3Igbm9kZSBjb3JlIGxpYnJhcmllc1xuICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3JhdmVuLW5vZGUvaXNzdWVzLzE3NlxuICAgIHBhcnNlZEZyYW1lLmluX2FwcCA9XG4gICAgICAhaXNJbnRlcm5hbCAmJiBwYXJzZWRGcmFtZS5maWxlbmFtZSAhPT0gdW5kZWZpbmVkICYmIHBhcnNlZEZyYW1lLmZpbGVuYW1lLmluZGV4T2YoJ25vZGVfbW9kdWxlcy8nKSA9PT0gLTE7XG5cbiAgICAvLyBFeHRyYWN0IGEgbW9kdWxlIG5hbWUgYmFzZWQgb24gdGhlIGZpbGVuYW1lXG4gICAgaWYgKHBhcnNlZEZyYW1lLmZpbGVuYW1lKSB7XG4gICAgICBwYXJzZWRGcmFtZS5tb2R1bGUgPSBnZXRNb2R1bGUocGFyc2VkRnJhbWUuZmlsZW5hbWUpO1xuXG4gICAgICBpZiAoIWlzSW50ZXJuYWwgJiYgbGluZXNPZkNvbnRleHQgPiAwICYmIGZpbGVzVG9SZWFkLmluZGV4T2YocGFyc2VkRnJhbWUuZmlsZW5hbWUpID09PSAtMSkge1xuICAgICAgICBmaWxlc1RvUmVhZC5wdXNoKHBhcnNlZEZyYW1lLmZpbGVuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VkRnJhbWU7XG4gIH0pO1xuXG4gIC8vIFdlIGRvIGFuIGVhcmx5IHJldHVybiBpZiB3ZSBkbyBub3Qgd2FudCB0byBmZXRjaCBjb250ZXh0IGxpZW5zXG4gIGlmIChsaW5lc09mQ29udGV4dCA8PSAwKSB7XG4gICAgcmV0dXJuIFN5bmNQcm9taXNlLnJlc29sdmUoZnJhbWVzKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGFkZFByZVBvc3RDb250ZXh0KGZpbGVzVG9SZWFkLCBmcmFtZXMsIGxpbmVzT2ZDb250ZXh0KTtcbiAgfSBjYXRjaCAoXykge1xuICAgIC8vIFRoaXMgaGFwcGVucyBpbiBlbGVjdHJvbiBmb3IgZXhhbXBsZSB3aGVyZSB3ZSBhcmUgbm90IGFibGUgdG8gcmVhZCBmaWxlcyBmcm9tIGFzYXIuXG4gICAgLy8gU28gaXQncyBmaW5lLCB3ZSByZWNvdmVyIGJlIGp1c3QgcmV0dXJuaW5nIGFsbCBmcmFtZXMgd2l0aG91dCBwcmUvcG9zdCBjb250ZXh0LlxuICAgIHJldHVybiBTeW5jUHJvbWlzZS5yZXNvbHZlKGZyYW1lcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIHJlYWQgdGhlIHNvdXJjZSBmaWxlcyArIGFkZGluZyBwcmUgYW5kIHBvc3QgY29udGV4dCAoc291cmNlIGNvZGUpXG4gKiB0byBhIGZyYW1lLlxuICogQHBhcmFtIGZpbGVzVG9SZWFkIHN0cmluZ1tdIG9mIGZpbGVwYXRoc1xuICogQHBhcmFtIGZyYW1lcyBTdGFja0ZyYW1lW10gY29udGFpbmcgYWxsIGZyYW1lc1xuICovXG5mdW5jdGlvbiBhZGRQcmVQb3N0Q29udGV4dChcbiAgZmlsZXNUb1JlYWQ6IHN0cmluZ1tdLFxuICBmcmFtZXM6IFN0YWNrRnJhbWVbXSxcbiAgbGluZXNPZkNvbnRleHQ6IG51bWJlcixcbik6IFByb21pc2VMaWtlPFN0YWNrRnJhbWVbXT4ge1xuICByZXR1cm4gbmV3IFN5bmNQcm9taXNlPFN0YWNrRnJhbWVbXT4ocmVzb2x2ZSA9PlxuICAgIHJlYWRTb3VyY2VGaWxlcyhmaWxlc1RvUmVhZCkudGhlbihzb3VyY2VGaWxlcyA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBmcmFtZXMubWFwKGZyYW1lID0+IHtcbiAgICAgICAgaWYgKGZyYW1lLmZpbGVuYW1lICYmIHNvdXJjZUZpbGVzW2ZyYW1lLmZpbGVuYW1lXSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lcyA9IChzb3VyY2VGaWxlc1tmcmFtZS5maWxlbmFtZV0gYXMgc3RyaW5nKS5zcGxpdCgnXFxuJyk7XG5cbiAgICAgICAgICAgIGFkZENvbnRleHRUb0ZyYW1lKGxpbmVzLCBmcmFtZSwgbGluZXNPZkNvbnRleHQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIGFub21hbHksIGJlaW5nIGRlZmVuc2l2ZSBpbiBjYXNlXG4gICAgICAgICAgICAvLyB1bmxpa2VseSB0byBldmVyIGhhcHBlbiBpbiBwcmFjdGljZSBidXQgY2FuIGRlZmluaXRlbHkgaGFwcGVuIGluIHRoZW9yeVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnJhbWU7XG4gICAgICB9KTtcblxuICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgIH0pLFxuICApO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEV4Y2VwdGlvbkZyb21FcnJvcihlcnJvcjogRXJyb3IsIG9wdGlvbnM/OiBOb2RlT3B0aW9ucyk6IFByb21pc2VMaWtlPEV4Y2VwdGlvbj4ge1xuICBjb25zdCBuYW1lID0gZXJyb3IubmFtZSB8fCBlcnJvci5jb25zdHJ1Y3Rvci5uYW1lO1xuICBjb25zdCBzdGFjayA9IGV4dHJhY3RTdGFja0Zyb21FcnJvcihlcnJvcik7XG4gIHJldHVybiBuZXcgU3luY1Byb21pc2U8RXhjZXB0aW9uPihyZXNvbHZlID0+XG4gICAgcGFyc2VTdGFjayhzdGFjaywgb3B0aW9ucykudGhlbihmcmFtZXMgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICBzdGFja3RyYWNlOiB7XG4gICAgICAgICAgZnJhbWVzOiBwcmVwYXJlRnJhbWVzRm9yRXZlbnQoZnJhbWVzKSxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZTogbmFtZSxcbiAgICAgICAgdmFsdWU6IGVycm9yLm1lc3NhZ2UsXG4gICAgICB9O1xuICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgIH0pLFxuICApO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRXJyb3IoZXJyb3I6IEV4dGVuZGVkRXJyb3IsIG9wdGlvbnM/OiBOb2RlT3B0aW9ucyk6IFByb21pc2VMaWtlPEV2ZW50PiB7XG4gIHJldHVybiBuZXcgU3luY1Byb21pc2U8RXZlbnQ+KHJlc29sdmUgPT5cbiAgICBnZXRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyb3IsIG9wdGlvbnMpLnRoZW4oKGV4Y2VwdGlvbjogRXhjZXB0aW9uKSA9PiB7XG4gICAgICByZXNvbHZlKHtcbiAgICAgICAgZXhjZXB0aW9uOiB7XG4gICAgICAgICAgdmFsdWVzOiBbZXhjZXB0aW9uXSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pLFxuICApO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVGcmFtZXNGb3JFdmVudChzdGFjazogU3RhY2tGcmFtZVtdKTogU3RhY2tGcmFtZVtdIHtcbiAgaWYgKCFzdGFjayB8fCAhc3RhY2subGVuZ3RoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgbGV0IGxvY2FsU3RhY2sgPSBzdGFjaztcbiAgY29uc3QgZmlyc3RGcmFtZUZ1bmN0aW9uID0gbG9jYWxTdGFja1swXS5mdW5jdGlvbiB8fCAnJztcblxuICBpZiAoZmlyc3RGcmFtZUZ1bmN0aW9uLmluZGV4T2YoJ2NhcHR1cmVNZXNzYWdlJykgIT09IC0xIHx8IGZpcnN0RnJhbWVGdW5jdGlvbi5pbmRleE9mKCdjYXB0dXJlRXhjZXB0aW9uJykgIT09IC0xKSB7XG4gICAgbG9jYWxTdGFjayA9IGxvY2FsU3RhY2suc2xpY2UoMSk7XG4gIH1cblxuICAvLyBUaGUgZnJhbWUgd2hlcmUgdGhlIGNyYXNoIGhhcHBlbmVkLCBzaG91bGQgYmUgdGhlIGxhc3QgZW50cnkgaW4gdGhlIGFycmF5XG4gIHJldHVybiBsb2NhbFN0YWNrLnJldmVyc2UoKTtcbn1cbiIsICIvLyBUT0RPOiBSZW1vdmUgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZSBhbmQgcmVseSBvbmx5IG9uIEBzZW50cnkvY29yZSBTREtfVkVSU0lPTiBhbmQgU2RrTWV0YWRhdGFcbmV4cG9ydCBjb25zdCBTREtfTkFNRSA9ICdzZW50cnkuamF2YXNjcmlwdC5ub2RlJztcbiIsICJpbXBvcnQgeyBBUEksIFNES19WRVJTSU9OIH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7XG4gIERzblByb3RvY29sLFxuICBFdmVudCxcbiAgUmVzcG9uc2UsXG4gIFNlbnRyeVJlcXVlc3QsXG4gIFNlbnRyeVJlcXVlc3RUeXBlLFxuICBTZXNzaW9uLFxuICBTZXNzaW9uQWdncmVnYXRlcyxcbiAgU3RhdHVzLFxuICBUcmFuc3BvcnQsXG4gIFRyYW5zcG9ydE9wdGlvbnMsXG59IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgbG9nZ2VyLCBwYXJzZVJldHJ5QWZ0ZXJIZWFkZXIsIFByb21pc2VCdWZmZXIsIFNlbnRyeUVycm9yIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0ICogYXMgaHR0cHMgZnJvbSAnaHR0cHMnO1xuaW1wb3J0IHsgVVJMIH0gZnJvbSAndXJsJztcblxuaW1wb3J0IHsgU0RLX05BTUUgfSBmcm9tICcuLi8uLi92ZXJzaW9uJztcbmltcG9ydCB7IEhUVFBNb2R1bGUgfSBmcm9tICcuL2h0dHAtbW9kdWxlJztcblxuZXhwb3J0IHR5cGUgVVJMUGFydHMgPSBQaWNrPFVSTCwgJ2hvc3RuYW1lJyB8ICdwYXRobmFtZScgfCAncG9ydCcgfCAncHJvdG9jb2wnPjtcbmV4cG9ydCB0eXBlIFVybFBhcnNlciA9ICh1cmw6IHN0cmluZykgPT4gVVJMUGFydHM7XG5cbmNvbnN0IENBVEVHT1JZX01BUFBJTkc6IHtcbiAgW2tleSBpbiBTZW50cnlSZXF1ZXN0VHlwZV06IHN0cmluZztcbn0gPSB7XG4gIGV2ZW50OiAnZXJyb3InLFxuICB0cmFuc2FjdGlvbjogJ3RyYW5zYWN0aW9uJyxcbiAgc2Vzc2lvbjogJ3Nlc3Npb24nLFxuICBhdHRhY2htZW50OiAnYXR0YWNobWVudCcsXG59O1xuXG4vKiogQmFzZSBUcmFuc3BvcnQgY2xhc3MgaW1wbGVtZW50YXRpb24gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlVHJhbnNwb3J0IGltcGxlbWVudHMgVHJhbnNwb3J0IHtcbiAgLyoqIFRoZSBBZ2VudCB1c2VkIGZvciBjb3JyZXNwb25kaW5nIHRyYW5zcG9ydCAqL1xuICBwdWJsaWMgbW9kdWxlPzogSFRUUE1vZHVsZTtcblxuICAvKiogVGhlIEFnZW50IHVzZWQgZm9yIGNvcnJlc3BvbmRpbmcgdHJhbnNwb3J0ICovXG4gIHB1YmxpYyBjbGllbnQ/OiBodHRwLkFnZW50IHwgaHR0cHMuQWdlbnQ7XG5cbiAgLyoqIEFQSSBvYmplY3QgKi9cbiAgcHJvdGVjdGVkIF9hcGk6IEFQSTtcblxuICAvKiogQSBzaW1wbGUgYnVmZmVyIGhvbGRpbmcgYWxsIHJlcXVlc3RzLiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2J1ZmZlcjogUHJvbWlzZUJ1ZmZlcjxSZXNwb25zZT4gPSBuZXcgUHJvbWlzZUJ1ZmZlcigzMCk7XG5cbiAgLyoqIExvY2tzIHRyYW5zcG9ydCBhZnRlciByZWNlaXZpbmcgcmF0ZSBsaW1pdHMgaW4gYSByZXNwb25zZSAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3JhdGVMaW1pdHM6IFJlY29yZDxzdHJpbmcsIERhdGU+ID0ge307XG5cbiAgLyoqIENyZWF0ZSBpbnN0YW5jZSBhbmQgc2V0IHRoaXMuZHNuICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgb3B0aW9uczogVHJhbnNwb3J0T3B0aW9ucykge1xuICAgIHRoaXMuX2FwaSA9IG5ldyBBUEkob3B0aW9ucy5kc24sIG9wdGlvbnMuX21ldGFkYXRhLCBvcHRpb25zLnR1bm5lbCk7XG4gIH1cblxuICAvKiogRGVmYXVsdCBmdW5jdGlvbiB1c2VkIHRvIHBhcnNlIFVSTHMgKi9cbiAgcHVibGljIHVybFBhcnNlcjogVXJsUGFyc2VyID0gdXJsID0+IG5ldyBVUkwodXJsKTtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZW5kRXZlbnQoXzogRXZlbnQpOiBQcm9taXNlTGlrZTxSZXNwb25zZT4ge1xuICAgIHRocm93IG5ldyBTZW50cnlFcnJvcignVHJhbnNwb3J0IENsYXNzIGhhcyB0byBpbXBsZW1lbnQgYHNlbmRFdmVudGAgbWV0aG9kLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgY2xvc2UodGltZW91dD86IG51bWJlcik6IFByb21pc2VMaWtlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fYnVmZmVyLmRyYWluKHRpbWVvdXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3RzIHByb3h5IHNldHRpbmdzIGZyb20gY2xpZW50IG9wdGlvbnMgYW5kIGVudiB2YXJpYWJsZXMuXG4gICAqXG4gICAqIEhvbm9ycyBgbm9fcHJveHlgIGVudiB2YXJpYWJsZSB3aXRoIHRoZSBoaWdoZXN0IHByaW9yaXR5IHRvIGFsbG93IGZvciBob3N0cyBleGNsdXNpb24uXG4gICAqXG4gICAqIEFuIG9yZGVyIG9mIHByaW9yaXR5IGZvciBhdmFpbGFibGUgcHJvdG9jb2xzIGlzOlxuICAgKiBgaHR0cGAgID0+IGBvcHRpb25zLmh0dHBQcm94eWAgfCBgcHJvY2Vzcy5lbnYuaHR0cF9wcm94eWBcbiAgICogYGh0dHBzYCA9PiBgb3B0aW9ucy5odHRwc1Byb3h5YCB8IGBvcHRpb25zLmh0dHBQcm94eWAgfCBgcHJvY2Vzcy5lbnYuaHR0cHNfcHJveHlgIHwgYHByb2Nlc3MuZW52Lmh0dHBfcHJveHlgXG4gICAqL1xuICBwcm90ZWN0ZWQgX2dldFByb3h5KHByb3RvY29sOiBEc25Qcm90b2NvbCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgeyBub19wcm94eSwgaHR0cF9wcm94eSwgaHR0cHNfcHJveHkgfSA9IHByb2Nlc3MuZW52O1xuICAgIGNvbnN0IHsgaHR0cFByb3h5LCBodHRwc1Byb3h5IH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgcHJveHkgPSBwcm90b2NvbCA9PT0gJ2h0dHAnID8gaHR0cFByb3h5IHx8IGh0dHBfcHJveHkgOiBodHRwc1Byb3h5IHx8IGh0dHBQcm94eSB8fCBodHRwc19wcm94eSB8fCBodHRwX3Byb3h5O1xuXG4gICAgaWYgKCFub19wcm94eSkge1xuICAgICAgcmV0dXJuIHByb3h5O1xuICAgIH1cblxuICAgIGNvbnN0IHsgaG9zdCwgcG9ydCB9ID0gdGhpcy5fYXBpLmdldERzbigpO1xuICAgIGZvciAoY29uc3QgbnAgb2Ygbm9fcHJveHkuc3BsaXQoJywnKSkge1xuICAgICAgaWYgKGhvc3QuZW5kc1dpdGgobnApIHx8IGAke2hvc3R9OiR7cG9ydH1gLmVuZHNXaXRoKG5wKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3h5O1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBidWlsZCByZXF1ZXN0IG9wdGlvbiBvYmplY3QgdXNlZCBieSByZXF1ZXN0ICovXG4gIHByb3RlY3RlZCBfZ2V0UmVxdWVzdE9wdGlvbnModXJsUGFydHM6IFVSTFBhcnRzKTogaHR0cC5SZXF1ZXN0T3B0aW9ucyB8IGh0dHBzLlJlcXVlc3RPcHRpb25zIHtcbiAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgLi4udGhpcy5fYXBpLmdldFJlcXVlc3RIZWFkZXJzKFNES19OQU1FLCBTREtfVkVSU0lPTiksXG4gICAgICAuLi50aGlzLm9wdGlvbnMuaGVhZGVycyxcbiAgICB9O1xuICAgIGNvbnN0IHsgaG9zdG5hbWUsIHBhdGhuYW1lLCBwb3J0LCBwcm90b2NvbCB9ID0gdXJsUGFydHM7XG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iLzM4MTQ2ZTcxN2ZlZDJmYWJlM2FhY2I2NTQwZDgzOTQ3NWUwY2UxYzYvbGliL2ludGVybmFsL3VybC5qcyNMMTI2OC1MMTI5MFxuICAgIC8vIFdlIGlnbm9yZSB0aGUgcXVlcnkgc3RyaW5nIG9uIHB1cnBvc2VcbiAgICBjb25zdCBwYXRoID0gYCR7cGF0aG5hbWV9YDtcblxuICAgIHJldHVybiB7XG4gICAgICBhZ2VudDogdGhpcy5jbGllbnQsXG4gICAgICBoZWFkZXJzLFxuICAgICAgaG9zdG5hbWUsXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIHBhdGgsXG4gICAgICBwb3J0LFxuICAgICAgcHJvdG9jb2wsXG4gICAgICAuLi4odGhpcy5vcHRpb25zLmNhQ2VydHMgJiYge1xuICAgICAgICBjYTogZnMucmVhZEZpbGVTeW5jKHRoaXMub3B0aW9ucy5jYUNlcnRzKSxcbiAgICAgIH0pLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdGltZSB0aGF0IGdpdmVuIGNhdGVnb3J5IGlzIGRpc2FibGVkIHVudGlsIGZvciByYXRlIGxpbWl0aW5nXG4gICAqL1xuICBwcm90ZWN0ZWQgX2Rpc2FibGVkVW50aWwocmVxdWVzdFR5cGU6IFNlbnRyeVJlcXVlc3RUeXBlKTogRGF0ZSB7XG4gICAgY29uc3QgY2F0ZWdvcnkgPSBDQVRFR09SWV9NQVBQSU5HW3JlcXVlc3RUeXBlXTtcbiAgICByZXR1cm4gdGhpcy5fcmF0ZUxpbWl0c1tjYXRlZ29yeV0gfHwgdGhpcy5fcmF0ZUxpbWl0cy5hbGw7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgY2F0ZWdvcnkgaXMgcmF0ZSBsaW1pdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgX2lzUmF0ZUxpbWl0ZWQocmVxdWVzdFR5cGU6IFNlbnRyeVJlcXVlc3RUeXBlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkVW50aWwocmVxdWVzdFR5cGUpID4gbmV3IERhdGUoRGF0ZS5ub3coKSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBpbnRlcm5hbCBfcmF0ZUxpbWl0cyBmcm9tIGluY29taW5nIGhlYWRlcnMuIFJldHVybnMgdHJ1ZSBpZiBoZWFkZXJzIGNvbnRhaW5zIGEgbm9uLWVtcHR5IHJhdGUgbGltaXRpbmcgaGVhZGVyLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9oYW5kbGVSYXRlTGltaXQoaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD4pOiBib29sZWFuIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHJsSGVhZGVyID0gaGVhZGVyc1sneC1zZW50cnktcmF0ZS1saW1pdHMnXTtcbiAgICBjb25zdCByYUhlYWRlciA9IGhlYWRlcnNbJ3JldHJ5LWFmdGVyJ107XG5cbiAgICBpZiAocmxIZWFkZXIpIHtcbiAgICAgIC8vIHJhdGUgbGltaXQgaGVhZGVycyBhcmUgb2YgdGhlIGZvcm1cbiAgICAgIC8vICAgICA8aGVhZGVyPiw8aGVhZGVyPiwuLlxuICAgICAgLy8gd2hlcmUgZWFjaCA8aGVhZGVyPiBpcyBvZiB0aGUgZm9ybVxuICAgICAgLy8gICAgIDxyZXRyeV9hZnRlcj46IDxjYXRlZ29yaWVzPjogPHNjb3BlPjogPHJlYXNvbl9jb2RlPlxuICAgICAgLy8gd2hlcmVcbiAgICAgIC8vICAgICA8cmV0cnlfYWZ0ZXI+IGlzIGEgZGVsYXkgaW4gbXNcbiAgICAgIC8vICAgICA8Y2F0ZWdvcmllcz4gaXMgdGhlIGV2ZW50IHR5cGUocykgKGVycm9yLCB0cmFuc2FjdGlvbiwgZXRjKSBiZWluZyByYXRlIGxpbWl0ZWQgYW5kIGlzIG9mIHRoZSBmb3JtXG4gICAgICAvLyAgICAgICAgIDxjYXRlZ29yeT47PGNhdGVnb3J5PjsuLi5cbiAgICAgIC8vICAgICA8c2NvcGU+IGlzIHdoYXQncyBiZWluZyBsaW1pdGVkIChvcmcsIHByb2plY3QsIG9yIGtleSkgLSBpZ25vcmVkIGJ5IFNES1xuICAgICAgLy8gICAgIDxyZWFzb25fY29kZT4gaXMgYW4gYXJiaXRyYXJ5IHN0cmluZyBsaWtlIFwib3JnX3F1b3RhXCIgLSBpZ25vcmVkIGJ5IFNES1xuICAgICAgZm9yIChjb25zdCBsaW1pdCBvZiBybEhlYWRlci50cmltKCkuc3BsaXQoJywnKSkge1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gbGltaXQuc3BsaXQoJzonLCAyKTtcbiAgICAgICAgY29uc3QgaGVhZGVyRGVsYXkgPSBwYXJzZUludChwYXJhbWV0ZXJzWzBdLCAxMCk7XG4gICAgICAgIGNvbnN0IGRlbGF5ID0gKCFpc05hTihoZWFkZXJEZWxheSkgPyBoZWFkZXJEZWxheSA6IDYwKSAqIDEwMDA7IC8vIDYwc2VjIGRlZmF1bHRcbiAgICAgICAgZm9yIChjb25zdCBjYXRlZ29yeSBvZiAocGFyYW1ldGVyc1sxXSAmJiBwYXJhbWV0ZXJzWzFdLnNwbGl0KCc7JykpIHx8IFsnYWxsJ10pIHtcbiAgICAgICAgICAvLyBjYXRlZ29yaWVzQWxsb3dlZCBpcyBhZGRlZCBoZXJlIHRvIGVuc3VyZSB3ZSBhcmUgb25seSBzdG9yaW5nIHJhdGUgbGltaXRzIGZvciBjYXRlZ29yaWVzIHdlIHN1cHBvcnQgaW4gdGhpc1xuICAgICAgICAgIC8vIHNkayBhbmQgYW55IGNhdGVnb3JpZXMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCB3aWxsIG5vdCBiZSBhZGRlZCByZWR1bmRhbnRseSB0byB0aGUgcmF0ZUxpbWl0cyBvYmplY3RcbiAgICAgICAgICBjb25zdCBjYXRlZ29yaWVzQWxsb3dlZCA9IFtcbiAgICAgICAgICAgIC4uLihPYmplY3Qua2V5cyhDQVRFR09SWV9NQVBQSU5HKSBhcyBbU2VudHJ5UmVxdWVzdFR5cGVdKS5tYXAoayA9PiBDQVRFR09SWV9NQVBQSU5HW2tdKSxcbiAgICAgICAgICAgICdhbGwnLFxuICAgICAgICAgIF07XG4gICAgICAgICAgaWYgKGNhdGVnb3JpZXNBbGxvd2VkLmluY2x1ZGVzKGNhdGVnb3J5KSkgdGhpcy5fcmF0ZUxpbWl0c1tjYXRlZ29yeV0gPSBuZXcgRGF0ZShub3cgKyBkZWxheSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAocmFIZWFkZXIpIHtcbiAgICAgIHRoaXMuX3JhdGVMaW1pdHMuYWxsID0gbmV3IERhdGUobm93ICsgcGFyc2VSZXRyeUFmdGVySGVhZGVyKG5vdywgcmFIZWFkZXIpKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIF9zZW5kKFxuICAgIHNlbnRyeVJlcXVlc3Q6IFNlbnRyeVJlcXVlc3QsXG4gICAgb3JpZ2luYWxQYXlsb2FkPzogRXZlbnQgfCBTZXNzaW9uIHwgU2Vzc2lvbkFnZ3JlZ2F0ZXMsXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBpZiAoIXRoaXMubW9kdWxlKSB7XG4gICAgICB0aHJvdyBuZXcgU2VudHJ5RXJyb3IoJ05vIG1vZHVsZSBhdmFpbGFibGUnKTtcbiAgICB9XG4gICAgaWYgKG9yaWdpbmFsUGF5bG9hZCAmJiB0aGlzLl9pc1JhdGVMaW1pdGVkKHNlbnRyeVJlcXVlc3QudHlwZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh7XG4gICAgICAgIHBheWxvYWQ6IG9yaWdpbmFsUGF5bG9hZCxcbiAgICAgICAgdHlwZTogc2VudHJ5UmVxdWVzdC50eXBlLFxuICAgICAgICByZWFzb246IGBUcmFuc3BvcnQgZm9yICR7c2VudHJ5UmVxdWVzdC50eXBlfSByZXF1ZXN0cyBsb2NrZWQgdGlsbCAke3RoaXMuX2Rpc2FibGVkVW50aWwoXG4gICAgICAgICAgc2VudHJ5UmVxdWVzdC50eXBlLFxuICAgICAgICApfSBkdWUgdG8gdG9vIG1hbnkgcmVxdWVzdHMuYCxcbiAgICAgICAgc3RhdHVzOiA0MjksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fYnVmZmVyLmFkZChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBQcm9taXNlPFJlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLm1vZHVsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKCdObyBtb2R1bGUgYXZhaWxhYmxlJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9nZXRSZXF1ZXN0T3B0aW9ucyh0aGlzLnVybFBhcnNlcihzZW50cnlSZXF1ZXN0LnVybCkpO1xuICAgICAgICAgIGNvbnN0IHJlcSA9IHRoaXMubW9kdWxlLnJlcXVlc3Qob3B0aW9ucywgcmVzID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1c0NvZGUgPSByZXMuc3RhdHVzQ29kZSB8fCA1MDA7XG4gICAgICAgICAgICBjb25zdCBzdGF0dXMgPSBTdGF0dXMuZnJvbUh0dHBDb2RlKHN0YXR1c0NvZGUpO1xuXG4gICAgICAgICAgICByZXMuc2V0RW5jb2RpbmcoJ3V0ZjgnKTtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBcIktleS12YWx1ZSBwYWlycyBvZiBoZWFkZXIgbmFtZXMgYW5kIHZhbHVlcy4gSGVhZGVyIG5hbWVzIGFyZSBsb3dlci1jYXNlZC5cIlxuICAgICAgICAgICAgICogaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9odHRwLmh0bWwjaHR0cF9tZXNzYWdlX2hlYWRlcnNcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgbGV0IHJldHJ5QWZ0ZXJIZWFkZXIgPSByZXMuaGVhZGVycyA/IHJlcy5oZWFkZXJzWydyZXRyeS1hZnRlciddIDogJyc7XG4gICAgICAgICAgICByZXRyeUFmdGVySGVhZGVyID0gKEFycmF5LmlzQXJyYXkocmV0cnlBZnRlckhlYWRlcikgPyByZXRyeUFmdGVySGVhZGVyWzBdIDogcmV0cnlBZnRlckhlYWRlcikgYXMgc3RyaW5nO1xuXG4gICAgICAgICAgICBsZXQgcmxIZWFkZXIgPSByZXMuaGVhZGVycyA/IHJlcy5oZWFkZXJzWyd4LXNlbnRyeS1yYXRlLWxpbWl0cyddIDogJyc7XG4gICAgICAgICAgICBybEhlYWRlciA9IChBcnJheS5pc0FycmF5KHJsSGVhZGVyKSA/IHJsSGVhZGVyWzBdIDogcmxIZWFkZXIpIGFzIHN0cmluZztcblxuICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICAgICAgICAgJ3gtc2VudHJ5LXJhdGUtbGltaXRzJzogcmxIZWFkZXIsXG4gICAgICAgICAgICAgICdyZXRyeS1hZnRlcic6IHJldHJ5QWZ0ZXJIZWFkZXIsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBsaW1pdGVkID0gdGhpcy5faGFuZGxlUmF0ZUxpbWl0KGhlYWRlcnMpO1xuICAgICAgICAgICAgaWYgKGxpbWl0ZWQpXG4gICAgICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgIGBUb28gbWFueSAke3NlbnRyeVJlcXVlc3QudHlwZX0gcmVxdWVzdHMsIGJhY2tpbmcgb2ZmIHVudGlsOiAke3RoaXMuX2Rpc2FibGVkVW50aWwoXG4gICAgICAgICAgICAgICAgICBzZW50cnlSZXF1ZXN0LnR5cGUsXG4gICAgICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoc3RhdHVzID09PSBTdGF0dXMuU3VjY2Vzcykge1xuICAgICAgICAgICAgICByZXNvbHZlKHsgc3RhdHVzIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbGV0IHJlamVjdGlvbk1lc3NhZ2UgPSBgSFRUUCBFcnJvciAoJHtzdGF0dXNDb2RlfSlgO1xuICAgICAgICAgICAgICBpZiAocmVzLmhlYWRlcnMgJiYgcmVzLmhlYWRlcnNbJ3gtc2VudHJ5LWVycm9yJ10pIHtcbiAgICAgICAgICAgICAgICByZWplY3Rpb25NZXNzYWdlICs9IGA6ICR7cmVzLmhlYWRlcnNbJ3gtc2VudHJ5LWVycm9yJ119YDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZWplY3QobmV3IFNlbnRyeUVycm9yKHJlamVjdGlvbk1lc3NhZ2UpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRm9yY2UgdGhlIHNvY2tldCB0byBkcmFpblxuICAgICAgICAgICAgcmVzLm9uKCdkYXRhJywgKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBEcmFpblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXMub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgLy8gRHJhaW5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlcS5vbignZXJyb3InLCByZWplY3QpO1xuICAgICAgICAgIHJlcS5lbmQoc2VudHJ5UmVxdWVzdC5ib2R5KTtcbiAgICAgICAgfSksXG4gICAgKTtcbiAgfVxufVxuIiwgIi8qKlxuICogSGVscGVycy5cbiAqL1xuXG52YXIgcyA9IDEwMDA7XG52YXIgbSA9IHMgKiA2MDtcbnZhciBoID0gbSAqIDYwO1xudmFyIGQgPSBoICogMjQ7XG52YXIgdyA9IGQgKiA3O1xudmFyIHkgPSBkICogMzY1LjI1O1xuXG4vKipcbiAqIFBhcnNlIG9yIGZvcm1hdCB0aGUgZ2l2ZW4gYHZhbGAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgLSBgbG9uZ2AgdmVyYm9zZSBmb3JtYXR0aW5nIFtmYWxzZV1cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHZhbFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHRocm93cyB7RXJyb3J9IHRocm93IGFuIGVycm9yIGlmIHZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHZhbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuICBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gcGFyc2UodmFsKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWwpKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubG9uZyA/IGZtdExvbmcodmFsKSA6IGZtdFNob3J0KHZhbCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICd2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPScgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkodmFsKVxuICApO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbWF0Y2ggPSAvXigtPyg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoXG4gICAgc3RyXG4gICk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgJ21zJykudG9Mb3dlckNhc2UoKTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAneWVhcnMnOlxuICAgIGNhc2UgJ3llYXInOlxuICAgIGNhc2UgJ3lycyc6XG4gICAgY2FzZSAneXInOlxuICAgIGNhc2UgJ3knOlxuICAgICAgcmV0dXJuIG4gKiB5O1xuICAgIGNhc2UgJ3dlZWtzJzpcbiAgICBjYXNlICd3ZWVrJzpcbiAgICBjYXNlICd3JzpcbiAgICAgIHJldHVybiBuICogdztcbiAgICBjYXNlICdkYXlzJzpcbiAgICBjYXNlICdkYXknOlxuICAgIGNhc2UgJ2QnOlxuICAgICAgcmV0dXJuIG4gKiBkO1xuICAgIGNhc2UgJ2hvdXJzJzpcbiAgICBjYXNlICdob3VyJzpcbiAgICBjYXNlICdocnMnOlxuICAgIGNhc2UgJ2hyJzpcbiAgICBjYXNlICdoJzpcbiAgICAgIHJldHVybiBuICogaDtcbiAgICBjYXNlICdtaW51dGVzJzpcbiAgICBjYXNlICdtaW51dGUnOlxuICAgIGNhc2UgJ21pbnMnOlxuICAgIGNhc2UgJ21pbic6XG4gICAgY2FzZSAnbSc6XG4gICAgICByZXR1cm4gbiAqIG07XG4gICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgY2FzZSAnc2Vjb25kJzpcbiAgICBjYXNlICdzZWNzJzpcbiAgICBjYXNlICdzZWMnOlxuICAgIGNhc2UgJ3MnOlxuICAgICAgcmV0dXJuIG4gKiBzO1xuICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgIGNhc2UgJ21zZWNzJzpcbiAgICBjYXNlICdtc2VjJzpcbiAgICBjYXNlICdtcyc6XG4gICAgICByZXR1cm4gbjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGQpICsgJ2QnO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBoKSArICdoJztcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbSkgKyAnbSc7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIHMpICsgJ3MnO1xuICB9XG4gIHJldHVybiBtcyArICdtcyc7XG59XG5cbi8qKlxuICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRMb25nKG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgZCwgJ2RheScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGgsICdob3VyJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IG0pIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgbSwgJ21pbnV0ZScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBzKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIHMsICdzZWNvbmQnKTtcbiAgfVxuICByZXR1cm4gbXMgKyAnIG1zJztcbn1cblxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqL1xuXG5mdW5jdGlvbiBwbHVyYWwobXMsIG1zQWJzLCBuLCBuYW1lKSB7XG4gIHZhciBpc1BsdXJhbCA9IG1zQWJzID49IG4gKiAxLjU7XG4gIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbikgKyAnICcgKyBuYW1lICsgKGlzUGx1cmFsID8gJ3MnIDogJycpO1xufVxuIiwgIlxuLyoqXG4gKiBUaGlzIGlzIHRoZSBjb21tb24gbG9naWMgZm9yIGJvdGggdGhlIE5vZGUuanMgYW5kIHdlYiBicm93c2VyXG4gKiBpbXBsZW1lbnRhdGlvbnMgb2YgYGRlYnVnKClgLlxuICovXG5cbmZ1bmN0aW9uIHNldHVwKGVudikge1xuXHRjcmVhdGVEZWJ1Zy5kZWJ1ZyA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5kZWZhdWx0ID0gY3JlYXRlRGVidWc7XG5cdGNyZWF0ZURlYnVnLmNvZXJjZSA9IGNvZXJjZTtcblx0Y3JlYXRlRGVidWcuZGlzYWJsZSA9IGRpc2FibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZSA9IGVuYWJsZTtcblx0Y3JlYXRlRGVidWcuZW5hYmxlZCA9IGVuYWJsZWQ7XG5cdGNyZWF0ZURlYnVnLmh1bWFuaXplID0gcmVxdWlyZSgnbXMnKTtcblx0Y3JlYXRlRGVidWcuZGVzdHJveSA9IGRlc3Ryb3k7XG5cblx0T2JqZWN0LmtleXMoZW52KS5mb3JFYWNoKGtleSA9PiB7XG5cdFx0Y3JlYXRlRGVidWdba2V5XSA9IGVudltrZXldO1xuXHR9KTtcblxuXHQvKipcblx0KiBUaGUgY3VycmVudGx5IGFjdGl2ZSBkZWJ1ZyBtb2RlIG5hbWVzLCBhbmQgbmFtZXMgdG8gc2tpcC5cblx0Ki9cblxuXHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRjcmVhdGVEZWJ1Zy5za2lwcyA9IFtdO1xuXG5cdC8qKlxuXHQqIE1hcCBvZiBzcGVjaWFsIFwiJW5cIiBoYW5kbGluZyBmdW5jdGlvbnMsIGZvciB0aGUgZGVidWcgXCJmb3JtYXRcIiBhcmd1bWVudC5cblx0KlxuXHQqIFZhbGlkIGtleSBuYW1lcyBhcmUgYSBzaW5nbGUsIGxvd2VyIG9yIHVwcGVyLWNhc2UgbGV0dGVyLCBpLmUuIFwiblwiIGFuZCBcIk5cIi5cblx0Ki9cblx0Y3JlYXRlRGVidWcuZm9ybWF0dGVycyA9IHt9O1xuXG5cdC8qKlxuXHQqIFNlbGVjdHMgYSBjb2xvciBmb3IgYSBkZWJ1ZyBuYW1lc3BhY2Vcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2Ugc3RyaW5nIGZvciB0aGUgZGVidWcgaW5zdGFuY2UgdG8gYmUgY29sb3JlZFxuXHQqIEByZXR1cm4ge051bWJlcnxTdHJpbmd9IEFuIEFOU0kgY29sb3IgY29kZSBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiBzZWxlY3RDb2xvcihuYW1lc3BhY2UpIHtcblx0XHRsZXQgaGFzaCA9IDA7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzcGFjZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0aGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgbmFtZXNwYWNlLmNoYXJDb2RlQXQoaSk7XG5cdFx0XHRoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuXHRcdH1cblxuXHRcdHJldHVybiBjcmVhdGVEZWJ1Zy5jb2xvcnNbTWF0aC5hYnMoaGFzaCkgJSBjcmVhdGVEZWJ1Zy5jb2xvcnMubGVuZ3RoXTtcblx0fVxuXHRjcmVhdGVEZWJ1Zy5zZWxlY3RDb2xvciA9IHNlbGVjdENvbG9yO1xuXG5cdC8qKlxuXHQqIENyZWF0ZSBhIGRlYnVnZ2VyIHdpdGggdGhlIGdpdmVuIGBuYW1lc3BhY2VgLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuXHQqIEByZXR1cm4ge0Z1bmN0aW9ufVxuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGNyZWF0ZURlYnVnKG5hbWVzcGFjZSkge1xuXHRcdGxldCBwcmV2VGltZTtcblx0XHRsZXQgZW5hYmxlT3ZlcnJpZGUgPSBudWxsO1xuXHRcdGxldCBuYW1lc3BhY2VzQ2FjaGU7XG5cdFx0bGV0IGVuYWJsZWRDYWNoZTtcblxuXHRcdGZ1bmN0aW9uIGRlYnVnKC4uLmFyZ3MpIHtcblx0XHRcdC8vIERpc2FibGVkP1xuXHRcdFx0aWYgKCFkZWJ1Zy5lbmFibGVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgc2VsZiA9IGRlYnVnO1xuXG5cdFx0XHQvLyBTZXQgYGRpZmZgIHRpbWVzdGFtcFxuXHRcdFx0Y29uc3QgY3VyciA9IE51bWJlcihuZXcgRGF0ZSgpKTtcblx0XHRcdGNvbnN0IG1zID0gY3VyciAtIChwcmV2VGltZSB8fCBjdXJyKTtcblx0XHRcdHNlbGYuZGlmZiA9IG1zO1xuXHRcdFx0c2VsZi5wcmV2ID0gcHJldlRpbWU7XG5cdFx0XHRzZWxmLmN1cnIgPSBjdXJyO1xuXHRcdFx0cHJldlRpbWUgPSBjdXJyO1xuXG5cdFx0XHRhcmdzWzBdID0gY3JlYXRlRGVidWcuY29lcmNlKGFyZ3NbMF0pO1xuXG5cdFx0XHRpZiAodHlwZW9mIGFyZ3NbMF0gIT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdC8vIEFueXRoaW5nIGVsc2UgbGV0J3MgaW5zcGVjdCB3aXRoICVPXG5cdFx0XHRcdGFyZ3MudW5zaGlmdCgnJU8nKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQXBwbHkgYW55IGBmb3JtYXR0ZXJzYCB0cmFuc2Zvcm1hdGlvbnNcblx0XHRcdGxldCBpbmRleCA9IDA7XG5cdFx0XHRhcmdzWzBdID0gYXJnc1swXS5yZXBsYWNlKC8lKFthLXpBLVolXSkvZywgKG1hdGNoLCBmb3JtYXQpID0+IHtcblx0XHRcdFx0Ly8gSWYgd2UgZW5jb3VudGVyIGFuIGVzY2FwZWQgJSB0aGVuIGRvbid0IGluY3JlYXNlIHRoZSBhcnJheSBpbmRleFxuXHRcdFx0XHRpZiAobWF0Y2ggPT09ICclJScpIHtcblx0XHRcdFx0XHRyZXR1cm4gJyUnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHRcdGNvbnN0IGZvcm1hdHRlciA9IGNyZWF0ZURlYnVnLmZvcm1hdHRlcnNbZm9ybWF0XTtcblx0XHRcdFx0aWYgKHR5cGVvZiBmb3JtYXR0ZXIgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHRjb25zdCB2YWwgPSBhcmdzW2luZGV4XTtcblx0XHRcdFx0XHRtYXRjaCA9IGZvcm1hdHRlci5jYWxsKHNlbGYsIHZhbCk7XG5cblx0XHRcdFx0XHQvLyBOb3cgd2UgbmVlZCB0byByZW1vdmUgYGFyZ3NbaW5kZXhdYCBzaW5jZSBpdCdzIGlubGluZWQgaW4gdGhlIGBmb3JtYXRgXG5cdFx0XHRcdFx0YXJncy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0XHRcdGluZGV4LS07XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG1hdGNoO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIEFwcGx5IGVudi1zcGVjaWZpYyBmb3JtYXR0aW5nIChjb2xvcnMsIGV0Yy4pXG5cdFx0XHRjcmVhdGVEZWJ1Zy5mb3JtYXRBcmdzLmNhbGwoc2VsZiwgYXJncyk7XG5cblx0XHRcdGNvbnN0IGxvZ0ZuID0gc2VsZi5sb2cgfHwgY3JlYXRlRGVidWcubG9nO1xuXHRcdFx0bG9nRm4uYXBwbHkoc2VsZiwgYXJncyk7XG5cdFx0fVxuXG5cdFx0ZGVidWcubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuXHRcdGRlYnVnLnVzZUNvbG9ycyA9IGNyZWF0ZURlYnVnLnVzZUNvbG9ycygpO1xuXHRcdGRlYnVnLmNvbG9yID0gY3JlYXRlRGVidWcuc2VsZWN0Q29sb3IobmFtZXNwYWNlKTtcblx0XHRkZWJ1Zy5leHRlbmQgPSBleHRlbmQ7XG5cdFx0ZGVidWcuZGVzdHJveSA9IGNyZWF0ZURlYnVnLmRlc3Ryb3k7IC8vIFhYWCBUZW1wb3JhcnkuIFdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLlxuXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGRlYnVnLCAnZW5hYmxlZCcsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuXHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdGlmIChlbmFibGVPdmVycmlkZSAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdHJldHVybiBlbmFibGVPdmVycmlkZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAobmFtZXNwYWNlc0NhY2hlICE9PSBjcmVhdGVEZWJ1Zy5uYW1lc3BhY2VzKSB7XG5cdFx0XHRcdFx0bmFtZXNwYWNlc0NhY2hlID0gY3JlYXRlRGVidWcubmFtZXNwYWNlcztcblx0XHRcdFx0XHRlbmFibGVkQ2FjaGUgPSBjcmVhdGVEZWJ1Zy5lbmFibGVkKG5hbWVzcGFjZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZW5hYmxlZENhY2hlO1xuXHRcdFx0fSxcblx0XHRcdHNldDogdiA9PiB7XG5cdFx0XHRcdGVuYWJsZU92ZXJyaWRlID0gdjtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIEVudi1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBsb2dpYyBmb3IgZGVidWcgaW5zdGFuY2VzXG5cdFx0aWYgKHR5cGVvZiBjcmVhdGVEZWJ1Zy5pbml0ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRjcmVhdGVEZWJ1Zy5pbml0KGRlYnVnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVidWc7XG5cdH1cblxuXHRmdW5jdGlvbiBleHRlbmQobmFtZXNwYWNlLCBkZWxpbWl0ZXIpIHtcblx0XHRjb25zdCBuZXdEZWJ1ZyA9IGNyZWF0ZURlYnVnKHRoaXMubmFtZXNwYWNlICsgKHR5cGVvZiBkZWxpbWl0ZXIgPT09ICd1bmRlZmluZWQnID8gJzonIDogZGVsaW1pdGVyKSArIG5hbWVzcGFjZSk7XG5cdFx0bmV3RGVidWcubG9nID0gdGhpcy5sb2c7XG5cdFx0cmV0dXJuIG5ld0RlYnVnO1xuXHR9XG5cblx0LyoqXG5cdCogRW5hYmxlcyBhIGRlYnVnIG1vZGUgYnkgbmFtZXNwYWNlcy4gVGhpcyBjYW4gaW5jbHVkZSBtb2Rlc1xuXHQqIHNlcGFyYXRlZCBieSBhIGNvbG9uIGFuZCB3aWxkY2FyZHMuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGVuYWJsZShuYW1lc3BhY2VzKSB7XG5cdFx0Y3JlYXRlRGVidWcuc2F2ZShuYW1lc3BhY2VzKTtcblx0XHRjcmVhdGVEZWJ1Zy5uYW1lc3BhY2VzID0gbmFtZXNwYWNlcztcblxuXHRcdGNyZWF0ZURlYnVnLm5hbWVzID0gW107XG5cdFx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHRcdGxldCBpO1xuXHRcdGNvbnN0IHNwbGl0ID0gKHR5cGVvZiBuYW1lc3BhY2VzID09PSAnc3RyaW5nJyA/IG5hbWVzcGFjZXMgOiAnJykuc3BsaXQoL1tcXHMsXSsvKTtcblx0XHRjb25zdCBsZW4gPSBzcGxpdC5sZW5ndGg7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmICghc3BsaXRbaV0pIHtcblx0XHRcdFx0Ly8gaWdub3JlIGVtcHR5IHN0cmluZ3Ncblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdG5hbWVzcGFjZXMgPSBzcGxpdFtpXS5yZXBsYWNlKC9cXCovZywgJy4qPycpO1xuXG5cdFx0XHRpZiAobmFtZXNwYWNlc1swXSA9PT0gJy0nKSB7XG5cdFx0XHRcdGNyZWF0ZURlYnVnLnNraXBzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzLnN1YnN0cigxKSArICckJykpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3JlYXRlRGVidWcubmFtZXMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMgKyAnJCcpKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0KiBEaXNhYmxlIGRlYnVnIG91dHB1dC5cblx0KlxuXHQqIEByZXR1cm4ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGRpc2FibGUoKSB7XG5cdFx0Y29uc3QgbmFtZXNwYWNlcyA9IFtcblx0XHRcdC4uLmNyZWF0ZURlYnVnLm5hbWVzLm1hcCh0b05hbWVzcGFjZSksXG5cdFx0XHQuLi5jcmVhdGVEZWJ1Zy5za2lwcy5tYXAodG9OYW1lc3BhY2UpLm1hcChuYW1lc3BhY2UgPT4gJy0nICsgbmFtZXNwYWNlKVxuXHRcdF0uam9pbignLCcpO1xuXHRcdGNyZWF0ZURlYnVnLmVuYWJsZSgnJyk7XG5cdFx0cmV0dXJuIG5hbWVzcGFjZXM7XG5cdH1cblxuXHQvKipcblx0KiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1vZGUgbmFtZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuXHQqIEByZXR1cm4ge0Jvb2xlYW59XG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gZW5hYmxlZChuYW1lKSB7XG5cdFx0aWYgKG5hbWVbbmFtZS5sZW5ndGggLSAxXSA9PT0gJyonKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRsZXQgaTtcblx0XHRsZXQgbGVuO1xuXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gY3JlYXRlRGVidWcuc2tpcHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmIChjcmVhdGVEZWJ1Zy5za2lwc1tpXS50ZXN0KG5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBsZW4gPSBjcmVhdGVEZWJ1Zy5uYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0aWYgKGNyZWF0ZURlYnVnLm5hbWVzW2ldLnRlc3QobmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCogQ29udmVydCByZWdleHAgdG8gbmFtZXNwYWNlXG5cdCpcblx0KiBAcGFyYW0ge1JlZ0V4cH0gcmVneGVwXG5cdCogQHJldHVybiB7U3RyaW5nfSBuYW1lc3BhY2Vcblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gdG9OYW1lc3BhY2UocmVnZXhwKSB7XG5cdFx0cmV0dXJuIHJlZ2V4cC50b1N0cmluZygpXG5cdFx0XHQuc3Vic3RyaW5nKDIsIHJlZ2V4cC50b1N0cmluZygpLmxlbmd0aCAtIDIpXG5cdFx0XHQucmVwbGFjZSgvXFwuXFwqXFw/JC8sICcqJyk7XG5cdH1cblxuXHQvKipcblx0KiBDb2VyY2UgYHZhbGAuXG5cdCpcblx0KiBAcGFyYW0ge01peGVkfSB2YWxcblx0KiBAcmV0dXJuIHtNaXhlZH1cblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gY29lcmNlKHZhbCkge1xuXHRcdGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikge1xuXHRcdFx0cmV0dXJuIHZhbC5zdGFjayB8fCB2YWwubWVzc2FnZTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhbDtcblx0fVxuXG5cdC8qKlxuXHQqIFhYWCBETyBOT1QgVVNFLiBUaGlzIGlzIGEgdGVtcG9yYXJ5IHN0dWIgZnVuY3Rpb24uXG5cdCogWFhYIEl0IFdJTEwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLlxuXHQqL1xuXHRmdW5jdGlvbiBkZXN0cm95KCkge1xuXHRcdGNvbnNvbGUud2FybignSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLicpO1xuXHR9XG5cblx0Y3JlYXRlRGVidWcuZW5hYmxlKGNyZWF0ZURlYnVnLmxvYWQoKSk7XG5cblx0cmV0dXJuIGNyZWF0ZURlYnVnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldHVwO1xuIiwgIi8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHdlYiBicm93c2VyIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuc3RvcmFnZSA9IGxvY2Fsc3RvcmFnZSgpO1xuZXhwb3J0cy5kZXN0cm95ID0gKCgpID0+IHtcblx0bGV0IHdhcm5lZCA9IGZhbHNlO1xuXG5cdHJldHVybiAoKSA9PiB7XG5cdFx0aWYgKCF3YXJuZWQpIHtcblx0XHRcdHdhcm5lZCA9IHRydWU7XG5cdFx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0XHR9XG5cdH07XG59KSgpO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFtcblx0JyMwMDAwQ0MnLFxuXHQnIzAwMDBGRicsXG5cdCcjMDAzM0NDJyxcblx0JyMwMDMzRkYnLFxuXHQnIzAwNjZDQycsXG5cdCcjMDA2NkZGJyxcblx0JyMwMDk5Q0MnLFxuXHQnIzAwOTlGRicsXG5cdCcjMDBDQzAwJyxcblx0JyMwMENDMzMnLFxuXHQnIzAwQ0M2NicsXG5cdCcjMDBDQzk5Jyxcblx0JyMwMENDQ0MnLFxuXHQnIzAwQ0NGRicsXG5cdCcjMzMwMENDJyxcblx0JyMzMzAwRkYnLFxuXHQnIzMzMzNDQycsXG5cdCcjMzMzM0ZGJyxcblx0JyMzMzY2Q0MnLFxuXHQnIzMzNjZGRicsXG5cdCcjMzM5OUNDJyxcblx0JyMzMzk5RkYnLFxuXHQnIzMzQ0MwMCcsXG5cdCcjMzNDQzMzJyxcblx0JyMzM0NDNjYnLFxuXHQnIzMzQ0M5OScsXG5cdCcjMzNDQ0NDJyxcblx0JyMzM0NDRkYnLFxuXHQnIzY2MDBDQycsXG5cdCcjNjYwMEZGJyxcblx0JyM2NjMzQ0MnLFxuXHQnIzY2MzNGRicsXG5cdCcjNjZDQzAwJyxcblx0JyM2NkNDMzMnLFxuXHQnIzk5MDBDQycsXG5cdCcjOTkwMEZGJyxcblx0JyM5OTMzQ0MnLFxuXHQnIzk5MzNGRicsXG5cdCcjOTlDQzAwJyxcblx0JyM5OUNDMzMnLFxuXHQnI0NDMDAwMCcsXG5cdCcjQ0MwMDMzJyxcblx0JyNDQzAwNjYnLFxuXHQnI0NDMDA5OScsXG5cdCcjQ0MwMENDJyxcblx0JyNDQzAwRkYnLFxuXHQnI0NDMzMwMCcsXG5cdCcjQ0MzMzMzJyxcblx0JyNDQzMzNjYnLFxuXHQnI0NDMzM5OScsXG5cdCcjQ0MzM0NDJyxcblx0JyNDQzMzRkYnLFxuXHQnI0NDNjYwMCcsXG5cdCcjQ0M2NjMzJyxcblx0JyNDQzk5MDAnLFxuXHQnI0NDOTkzMycsXG5cdCcjQ0NDQzAwJyxcblx0JyNDQ0NDMzMnLFxuXHQnI0ZGMDAwMCcsXG5cdCcjRkYwMDMzJyxcblx0JyNGRjAwNjYnLFxuXHQnI0ZGMDA5OScsXG5cdCcjRkYwMENDJyxcblx0JyNGRjAwRkYnLFxuXHQnI0ZGMzMwMCcsXG5cdCcjRkYzMzMzJyxcblx0JyNGRjMzNjYnLFxuXHQnI0ZGMzM5OScsXG5cdCcjRkYzM0NDJyxcblx0JyNGRjMzRkYnLFxuXHQnI0ZGNjYwMCcsXG5cdCcjRkY2NjMzJyxcblx0JyNGRjk5MDAnLFxuXHQnI0ZGOTkzMycsXG5cdCcjRkZDQzAwJyxcblx0JyNGRkNDMzMnXG5dO1xuXG4vKipcbiAqIEN1cnJlbnRseSBvbmx5IFdlYktpdC1iYXNlZCBXZWIgSW5zcGVjdG9ycywgRmlyZWZveCA+PSB2MzEsXG4gKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cbiAqIHRvIHN1cHBvcnQgXCIlY1wiIENTUyBjdXN0b21pemF0aW9ucy5cbiAqXG4gKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG5cdC8vIE5COiBJbiBhbiBFbGVjdHJvbiBwcmVsb2FkIHNjcmlwdCwgZG9jdW1lbnQgd2lsbCBiZSBkZWZpbmVkIGJ1dCBub3QgZnVsbHlcblx0Ly8gaW5pdGlhbGl6ZWQuIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gQ2hyb21lLCB3ZSdsbCBqdXN0IGRldGVjdCB0aGlzIGNhc2Vcblx0Ly8gZXhwbGljaXRseVxuXHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnByb2Nlc3MgJiYgKHdpbmRvdy5wcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicgfHwgd2luZG93LnByb2Nlc3MuX19ud2pzKSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8gSW50ZXJuZXQgRXhwbG9yZXIgYW5kIEVkZ2UgZG8gbm90IHN1cHBvcnQgY29sb3JzLlxuXHRpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goLyhlZGdlfHRyaWRlbnQpXFwvKFxcZCspLykpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvLyBJcyB3ZWJraXQ/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE2NDU5NjA2LzM3Njc3M1xuXHQvLyBkb2N1bWVudCBpcyB1bmRlZmluZWQgaW4gcmVhY3QtbmF0aXZlOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QtbmF0aXZlL3B1bGwvMTYzMlxuXHRyZXR1cm4gKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuV2Via2l0QXBwZWFyYW5jZSkgfHxcblx0XHQvLyBJcyBmaXJlYnVnPyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zOTgxMjAvMzc2NzczXG5cdFx0KHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS5maXJlYnVnIHx8ICh3aW5kb3cuY29uc29sZS5leGNlcHRpb24gJiYgd2luZG93LmNvbnNvbGUudGFibGUpKSkgfHxcblx0XHQvLyBJcyBmaXJlZm94ID49IHYzMT9cblx0XHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1Rvb2xzL1dlYl9Db25zb2xlI1N0eWxpbmdfbWVzc2FnZXNcblx0XHQodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSAmJiBwYXJzZUludChSZWdFeHAuJDEsIDEwKSA+PSAzMSkgfHxcblx0XHQvLyBEb3VibGUgY2hlY2sgd2Via2l0IGluIHVzZXJBZ2VudCBqdXN0IGluIGNhc2Ugd2UgYXJlIGluIGEgd29ya2VyXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pKTtcbn1cblxuLyoqXG4gKiBDb2xvcml6ZSBsb2cgYXJndW1lbnRzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0YXJnc1swXSA9ICh0aGlzLnVzZUNvbG9ycyA/ICclYycgOiAnJykgK1xuXHRcdHRoaXMubmFtZXNwYWNlICtcblx0XHQodGhpcy51c2VDb2xvcnMgPyAnICVjJyA6ICcgJykgK1xuXHRcdGFyZ3NbMF0gK1xuXHRcdCh0aGlzLnVzZUNvbG9ycyA/ICclYyAnIDogJyAnKSArXG5cdFx0JysnICsgbW9kdWxlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuXHRpZiAoIXRoaXMudXNlQ29sb3JzKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgYyA9ICdjb2xvcjogJyArIHRoaXMuY29sb3I7XG5cdGFyZ3Muc3BsaWNlKDEsIDAsIGMsICdjb2xvcjogaW5oZXJpdCcpO1xuXG5cdC8vIFRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG5cdC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cblx0Ly8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG5cdGxldCBpbmRleCA9IDA7XG5cdGxldCBsYXN0QyA9IDA7XG5cdGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBtYXRjaCA9PiB7XG5cdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGluZGV4Kys7XG5cdFx0aWYgKG1hdGNoID09PSAnJWMnKSB7XG5cdFx0XHQvLyBXZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcblx0XHRcdC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG5cdFx0XHRsYXN0QyA9IGluZGV4O1xuXHRcdH1cblx0fSk7XG5cblx0YXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUuZGVidWcoKWAgd2hlbiBhdmFpbGFibGUuXG4gKiBOby1vcCB3aGVuIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYSBcImZ1bmN0aW9uXCIuXG4gKiBJZiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGF2YWlsYWJsZSwgZmFsbHMgYmFja1xuICogdG8gYGNvbnNvbGUubG9nYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5leHBvcnRzLmxvZyA9IGNvbnNvbGUuZGVidWcgfHwgY29uc29sZS5sb2cgfHwgKCgpID0+IHt9KTtcblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuXHR0cnkge1xuXHRcdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0XHRleHBvcnRzLnN0b3JhZ2Uuc2V0SXRlbSgnZGVidWcnLCBuYW1lc3BhY2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZXhwb3J0cy5zdG9yYWdlLnJlbW92ZUl0ZW0oJ2RlYnVnJyk7XG5cdFx0fVxuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBsb2FkKCkge1xuXHRsZXQgcjtcblx0dHJ5IHtcblx0XHRyID0gZXhwb3J0cy5zdG9yYWdlLmdldEl0ZW0oJ2RlYnVnJyk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG5cblx0Ly8gSWYgZGVidWcgaXNuJ3Qgc2V0IGluIExTLCBhbmQgd2UncmUgaW4gRWxlY3Ryb24sIHRyeSB0byBsb2FkICRERUJVR1xuXHRpZiAoIXIgJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICdlbnYnIGluIHByb2Nlc3MpIHtcblx0XHRyID0gcHJvY2Vzcy5lbnYuREVCVUc7XG5cdH1cblxuXHRyZXR1cm4gcjtcbn1cblxuLyoqXG4gKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG4gKlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzYWZhcmkgdGhyb3dzXG4gKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuICogYW5kIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBpdC5cbiAqXG4gKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG5cdHRyeSB7XG5cdFx0Ly8gVFZNTEtpdCAoQXBwbGUgVFYgSlMgUnVudGltZSkgZG9lcyBub3QgaGF2ZSBhIHdpbmRvdyBvYmplY3QsIGp1c3QgbG9jYWxTdG9yYWdlIGluIHRoZSBnbG9iYWwgY29udGV4dFxuXHRcdC8vIFRoZSBCcm93c2VyIGFsc28gaGFzIGxvY2FsU3RvcmFnZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHQuXG5cdFx0cmV0dXJuIGxvY2FsU3RvcmFnZTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NvbW1vbicpKGV4cG9ydHMpO1xuXG5jb25zdCB7Zm9ybWF0dGVyc30gPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBNYXAgJWogdG8gYEpTT04uc3RyaW5naWZ5KClgLCBzaW5jZSBubyBXZWIgSW5zcGVjdG9ycyBkbyB0aGF0IGJ5IGRlZmF1bHQuXG4gKi9cblxuZm9ybWF0dGVycy5qID0gZnVuY3Rpb24gKHYpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0cmV0dXJuICdbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogJyArIGVycm9yLm1lc3NhZ2U7XG5cdH1cbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChmbGFnLCBhcmd2ID0gcHJvY2Vzcy5hcmd2KSA9PiB7XG5cdGNvbnN0IHByZWZpeCA9IGZsYWcuc3RhcnRzV2l0aCgnLScpID8gJycgOiAoZmxhZy5sZW5ndGggPT09IDEgPyAnLScgOiAnLS0nKTtcblx0Y29uc3QgcG9zaXRpb24gPSBhcmd2LmluZGV4T2YocHJlZml4ICsgZmxhZyk7XG5cdGNvbnN0IHRlcm1pbmF0b3JQb3NpdGlvbiA9IGFyZ3YuaW5kZXhPZignLS0nKTtcblx0cmV0dXJuIHBvc2l0aW9uICE9PSAtMSAmJiAodGVybWluYXRvclBvc2l0aW9uID09PSAtMSB8fCBwb3NpdGlvbiA8IHRlcm1pbmF0b3JQb3NpdGlvbik7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbmNvbnN0IG9zID0gcmVxdWlyZSgnb3MnKTtcbmNvbnN0IHR0eSA9IHJlcXVpcmUoJ3R0eScpO1xuY29uc3QgaGFzRmxhZyA9IHJlcXVpcmUoJ2hhcy1mbGFnJyk7XG5cbmNvbnN0IHtlbnZ9ID0gcHJvY2VzcztcblxubGV0IGZvcmNlQ29sb3I7XG5pZiAoaGFzRmxhZygnbm8tY29sb3InKSB8fFxuXHRoYXNGbGFnKCduby1jb2xvcnMnKSB8fFxuXHRoYXNGbGFnKCdjb2xvcj1mYWxzZScpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9yPW5ldmVyJykpIHtcblx0Zm9yY2VDb2xvciA9IDA7XG59IGVsc2UgaWYgKGhhc0ZsYWcoJ2NvbG9yJykgfHxcblx0aGFzRmxhZygnY29sb3JzJykgfHxcblx0aGFzRmxhZygnY29sb3I9dHJ1ZScpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9yPWFsd2F5cycpKSB7XG5cdGZvcmNlQ29sb3IgPSAxO1xufVxuXG5pZiAoJ0ZPUkNFX0NPTE9SJyBpbiBlbnYpIHtcblx0aWYgKGVudi5GT1JDRV9DT0xPUiA9PT0gJ3RydWUnKSB7XG5cdFx0Zm9yY2VDb2xvciA9IDE7XG5cdH0gZWxzZSBpZiAoZW52LkZPUkNFX0NPTE9SID09PSAnZmFsc2UnKSB7XG5cdFx0Zm9yY2VDb2xvciA9IDA7XG5cdH0gZWxzZSB7XG5cdFx0Zm9yY2VDb2xvciA9IGVudi5GT1JDRV9DT0xPUi5sZW5ndGggPT09IDAgPyAxIDogTWF0aC5taW4ocGFyc2VJbnQoZW52LkZPUkNFX0NPTE9SLCAxMCksIDMpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHRyYW5zbGF0ZUxldmVsKGxldmVsKSB7XG5cdGlmIChsZXZlbCA9PT0gMCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0bGV2ZWwsXG5cdFx0aGFzQmFzaWM6IHRydWUsXG5cdFx0aGFzMjU2OiBsZXZlbCA+PSAyLFxuXHRcdGhhczE2bTogbGV2ZWwgPj0gM1xuXHR9O1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c0NvbG9yKGhhdmVTdHJlYW0sIHN0cmVhbUlzVFRZKSB7XG5cdGlmIChmb3JjZUNvbG9yID09PSAwKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRpZiAoaGFzRmxhZygnY29sb3I9MTZtJykgfHxcblx0XHRoYXNGbGFnKCdjb2xvcj1mdWxsJykgfHxcblx0XHRoYXNGbGFnKCdjb2xvcj10cnVlY29sb3InKSkge1xuXHRcdHJldHVybiAzO1xuXHR9XG5cblx0aWYgKGhhc0ZsYWcoJ2NvbG9yPTI1NicpKSB7XG5cdFx0cmV0dXJuIDI7XG5cdH1cblxuXHRpZiAoaGF2ZVN0cmVhbSAmJiAhc3RyZWFtSXNUVFkgJiYgZm9yY2VDb2xvciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRjb25zdCBtaW4gPSBmb3JjZUNvbG9yIHx8IDA7XG5cblx0aWYgKGVudi5URVJNID09PSAnZHVtYicpIHtcblx0XHRyZXR1cm4gbWluO1xuXHR9XG5cblx0aWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcblx0XHQvLyBXaW5kb3dzIDEwIGJ1aWxkIDEwNTg2IGlzIHRoZSBmaXJzdCBXaW5kb3dzIHJlbGVhc2UgdGhhdCBzdXBwb3J0cyAyNTYgY29sb3JzLlxuXHRcdC8vIFdpbmRvd3MgMTAgYnVpbGQgMTQ5MzEgaXMgdGhlIGZpcnN0IHJlbGVhc2UgdGhhdCBzdXBwb3J0cyAxNm0vVHJ1ZUNvbG9yLlxuXHRcdGNvbnN0IG9zUmVsZWFzZSA9IG9zLnJlbGVhc2UoKS5zcGxpdCgnLicpO1xuXHRcdGlmIChcblx0XHRcdE51bWJlcihvc1JlbGVhc2VbMF0pID49IDEwICYmXG5cdFx0XHROdW1iZXIob3NSZWxlYXNlWzJdKSA+PSAxMDU4NlxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIE51bWJlcihvc1JlbGVhc2VbMl0pID49IDE0OTMxID8gMyA6IDI7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIDE7XG5cdH1cblxuXHRpZiAoJ0NJJyBpbiBlbnYpIHtcblx0XHRpZiAoWydUUkFWSVMnLCAnQ0lSQ0xFQ0knLCAnQVBQVkVZT1InLCAnR0lUTEFCX0NJJywgJ0dJVEhVQl9BQ1RJT05TJywgJ0JVSUxES0lURSddLnNvbWUoc2lnbiA9PiBzaWduIGluIGVudikgfHwgZW52LkNJX05BTUUgPT09ICdjb2Rlc2hpcCcpIHtcblx0XHRcdHJldHVybiAxO1xuXHRcdH1cblxuXHRcdHJldHVybiBtaW47XG5cdH1cblxuXHRpZiAoJ1RFQU1DSVRZX1ZFUlNJT04nIGluIGVudikge1xuXHRcdHJldHVybiAvXig5XFwuKDAqWzEtOV1cXGQqKVxcLnxcXGR7Mix9XFwuKS8udGVzdChlbnYuVEVBTUNJVFlfVkVSU0lPTikgPyAxIDogMDtcblx0fVxuXG5cdGlmIChlbnYuQ09MT1JURVJNID09PSAndHJ1ZWNvbG9yJykge1xuXHRcdHJldHVybiAzO1xuXHR9XG5cblx0aWYgKCdURVJNX1BST0dSQU0nIGluIGVudikge1xuXHRcdGNvbnN0IHZlcnNpb24gPSBwYXJzZUludCgoZW52LlRFUk1fUFJPR1JBTV9WRVJTSU9OIHx8ICcnKS5zcGxpdCgnLicpWzBdLCAxMCk7XG5cblx0XHRzd2l0Y2ggKGVudi5URVJNX1BST0dSQU0pIHtcblx0XHRcdGNhc2UgJ2lUZXJtLmFwcCc6XG5cdFx0XHRcdHJldHVybiB2ZXJzaW9uID49IDMgPyAzIDogMjtcblx0XHRcdGNhc2UgJ0FwcGxlX1Rlcm1pbmFsJzpcblx0XHRcdFx0cmV0dXJuIDI7XG5cdFx0XHQvLyBObyBkZWZhdWx0XG5cdFx0fVxuXHR9XG5cblx0aWYgKC8tMjU2KGNvbG9yKT8kL2kudGVzdChlbnYuVEVSTSkpIHtcblx0XHRyZXR1cm4gMjtcblx0fVxuXG5cdGlmICgvXnNjcmVlbnxeeHRlcm18XnZ0MTAwfF52dDIyMHxecnh2dHxjb2xvcnxhbnNpfGN5Z3dpbnxsaW51eC9pLnRlc3QoZW52LlRFUk0pKSB7XG5cdFx0cmV0dXJuIDE7XG5cdH1cblxuXHRpZiAoJ0NPTE9SVEVSTScgaW4gZW52KSB7XG5cdFx0cmV0dXJuIDE7XG5cdH1cblxuXHRyZXR1cm4gbWluO1xufVxuXG5mdW5jdGlvbiBnZXRTdXBwb3J0TGV2ZWwoc3RyZWFtKSB7XG5cdGNvbnN0IGxldmVsID0gc3VwcG9ydHNDb2xvcihzdHJlYW0sIHN0cmVhbSAmJiBzdHJlYW0uaXNUVFkpO1xuXHRyZXR1cm4gdHJhbnNsYXRlTGV2ZWwobGV2ZWwpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0c3VwcG9ydHNDb2xvcjogZ2V0U3VwcG9ydExldmVsLFxuXHRzdGRvdXQ6IHRyYW5zbGF0ZUxldmVsKHN1cHBvcnRzQ29sb3IodHJ1ZSwgdHR5LmlzYXR0eSgxKSkpLFxuXHRzdGRlcnI6IHRyYW5zbGF0ZUxldmVsKHN1cHBvcnRzQ29sb3IodHJ1ZSwgdHR5LmlzYXR0eSgyKSkpXG59O1xuIiwgIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG5jb25zdCB0dHkgPSByZXF1aXJlKCd0dHknKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgTm9kZS5qcyBpbXBsZW1lbnRhdGlvbiBvZiBgZGVidWcoKWAuXG4gKi9cblxuZXhwb3J0cy5pbml0ID0gaW5pdDtcbmV4cG9ydHMubG9nID0gbG9nO1xuZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcbmV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5leHBvcnRzLmxvYWQgPSBsb2FkO1xuZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5leHBvcnRzLmRlc3Ryb3kgPSB1dGlsLmRlcHJlY2F0ZShcblx0KCkgPT4ge30sXG5cdCdJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuJ1xuKTtcblxuLyoqXG4gKiBDb2xvcnMuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSBbNiwgMiwgMywgNCwgNSwgMV07XG5cbnRyeSB7XG5cdC8vIE9wdGlvbmFsIGRlcGVuZGVuY3kgKGFzIGluLCBkb2Vzbid0IG5lZWQgdG8gYmUgaW5zdGFsbGVkLCBOT1QgbGlrZSBvcHRpb25hbERlcGVuZGVuY2llcyBpbiBwYWNrYWdlLmpzb24pXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcblx0Y29uc3Qgc3VwcG9ydHNDb2xvciA9IHJlcXVpcmUoJ3N1cHBvcnRzLWNvbG9yJyk7XG5cblx0aWYgKHN1cHBvcnRzQ29sb3IgJiYgKHN1cHBvcnRzQ29sb3Iuc3RkZXJyIHx8IHN1cHBvcnRzQ29sb3IpLmxldmVsID49IDIpIHtcblx0XHRleHBvcnRzLmNvbG9ycyA9IFtcblx0XHRcdDIwLFxuXHRcdFx0MjEsXG5cdFx0XHQyNixcblx0XHRcdDI3LFxuXHRcdFx0MzIsXG5cdFx0XHQzMyxcblx0XHRcdDM4LFxuXHRcdFx0MzksXG5cdFx0XHQ0MCxcblx0XHRcdDQxLFxuXHRcdFx0NDIsXG5cdFx0XHQ0Myxcblx0XHRcdDQ0LFxuXHRcdFx0NDUsXG5cdFx0XHQ1Nixcblx0XHRcdDU3LFxuXHRcdFx0NjIsXG5cdFx0XHQ2Myxcblx0XHRcdDY4LFxuXHRcdFx0NjksXG5cdFx0XHQ3NCxcblx0XHRcdDc1LFxuXHRcdFx0NzYsXG5cdFx0XHQ3Nyxcblx0XHRcdDc4LFxuXHRcdFx0NzksXG5cdFx0XHQ4MCxcblx0XHRcdDgxLFxuXHRcdFx0OTIsXG5cdFx0XHQ5Myxcblx0XHRcdDk4LFxuXHRcdFx0OTksXG5cdFx0XHQxMTIsXG5cdFx0XHQxMTMsXG5cdFx0XHQxMjgsXG5cdFx0XHQxMjksXG5cdFx0XHQxMzQsXG5cdFx0XHQxMzUsXG5cdFx0XHQxNDgsXG5cdFx0XHQxNDksXG5cdFx0XHQxNjAsXG5cdFx0XHQxNjEsXG5cdFx0XHQxNjIsXG5cdFx0XHQxNjMsXG5cdFx0XHQxNjQsXG5cdFx0XHQxNjUsXG5cdFx0XHQxNjYsXG5cdFx0XHQxNjcsXG5cdFx0XHQxNjgsXG5cdFx0XHQxNjksXG5cdFx0XHQxNzAsXG5cdFx0XHQxNzEsXG5cdFx0XHQxNzIsXG5cdFx0XHQxNzMsXG5cdFx0XHQxNzgsXG5cdFx0XHQxNzksXG5cdFx0XHQxODQsXG5cdFx0XHQxODUsXG5cdFx0XHQxOTYsXG5cdFx0XHQxOTcsXG5cdFx0XHQxOTgsXG5cdFx0XHQxOTksXG5cdFx0XHQyMDAsXG5cdFx0XHQyMDEsXG5cdFx0XHQyMDIsXG5cdFx0XHQyMDMsXG5cdFx0XHQyMDQsXG5cdFx0XHQyMDUsXG5cdFx0XHQyMDYsXG5cdFx0XHQyMDcsXG5cdFx0XHQyMDgsXG5cdFx0XHQyMDksXG5cdFx0XHQyMTQsXG5cdFx0XHQyMTUsXG5cdFx0XHQyMjAsXG5cdFx0XHQyMjFcblx0XHRdO1xuXHR9XG59IGNhdGNoIChlcnJvcikge1xuXHQvLyBTd2FsbG93IC0gd2Ugb25seSBjYXJlIGlmIGBzdXBwb3J0cy1jb2xvcmAgaXMgYXZhaWxhYmxlOyBpdCBkb2Vzbid0IGhhdmUgdG8gYmUuXG59XG5cbi8qKlxuICogQnVpbGQgdXAgdGhlIGRlZmF1bHQgYGluc3BlY3RPcHRzYCBvYmplY3QgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICpcbiAqICAgJCBERUJVR19DT0xPUlM9bm8gREVCVUdfREVQVEg9MTAgREVCVUdfU0hPV19ISURERU49ZW5hYmxlZCBub2RlIHNjcmlwdC5qc1xuICovXG5cbmV4cG9ydHMuaW5zcGVjdE9wdHMgPSBPYmplY3Qua2V5cyhwcm9jZXNzLmVudikuZmlsdGVyKGtleSA9PiB7XG5cdHJldHVybiAvXmRlYnVnXy9pLnRlc3Qoa2V5KTtcbn0pLnJlZHVjZSgob2JqLCBrZXkpID0+IHtcblx0Ly8gQ2FtZWwtY2FzZVxuXHRjb25zdCBwcm9wID0ga2V5XG5cdFx0LnN1YnN0cmluZyg2KVxuXHRcdC50b0xvd2VyQ2FzZSgpXG5cdFx0LnJlcGxhY2UoL18oW2Etel0pL2csIChfLCBrKSA9PiB7XG5cdFx0XHRyZXR1cm4gay50b1VwcGVyQ2FzZSgpO1xuXHRcdH0pO1xuXG5cdC8vIENvZXJjZSBzdHJpbmcgdmFsdWUgaW50byBKUyB2YWx1ZVxuXHRsZXQgdmFsID0gcHJvY2Vzcy5lbnZba2V5XTtcblx0aWYgKC9eKHllc3xvbnx0cnVlfGVuYWJsZWQpJC9pLnRlc3QodmFsKSkge1xuXHRcdHZhbCA9IHRydWU7XG5cdH0gZWxzZSBpZiAoL14obm98b2ZmfGZhbHNlfGRpc2FibGVkKSQvaS50ZXN0KHZhbCkpIHtcblx0XHR2YWwgPSBmYWxzZTtcblx0fSBlbHNlIGlmICh2YWwgPT09ICdudWxsJykge1xuXHRcdHZhbCA9IG51bGw7XG5cdH0gZWxzZSB7XG5cdFx0dmFsID0gTnVtYmVyKHZhbCk7XG5cdH1cblxuXHRvYmpbcHJvcF0gPSB2YWw7XG5cdHJldHVybiBvYmo7XG59LCB7fSk7XG5cbi8qKlxuICogSXMgc3Rkb3V0IGEgVFRZPyBDb2xvcmVkIG91dHB1dCBpcyBlbmFibGVkIHdoZW4gYHRydWVgLlxuICovXG5cbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcblx0cmV0dXJuICdjb2xvcnMnIGluIGV4cG9ydHMuaW5zcGVjdE9wdHMgP1xuXHRcdEJvb2xlYW4oZXhwb3J0cy5pbnNwZWN0T3B0cy5jb2xvcnMpIDpcblx0XHR0dHkuaXNhdHR5KHByb2Nlc3Muc3RkZXJyLmZkKTtcbn1cblxuLyoqXG4gKiBBZGRzIEFOU0kgY29sb3IgZXNjYXBlIGNvZGVzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0Y29uc3Qge25hbWVzcGFjZTogbmFtZSwgdXNlQ29sb3JzfSA9IHRoaXM7XG5cblx0aWYgKHVzZUNvbG9ycykge1xuXHRcdGNvbnN0IGMgPSB0aGlzLmNvbG9yO1xuXHRcdGNvbnN0IGNvbG9yQ29kZSA9ICdcXHUwMDFCWzMnICsgKGMgPCA4ID8gYyA6ICc4OzU7JyArIGMpO1xuXHRcdGNvbnN0IHByZWZpeCA9IGAgICR7Y29sb3JDb2RlfTsxbSR7bmFtZX0gXFx1MDAxQlswbWA7XG5cblx0XHRhcmdzWzBdID0gcHJlZml4ICsgYXJnc1swXS5zcGxpdCgnXFxuJykuam9pbignXFxuJyArIHByZWZpeCk7XG5cdFx0YXJncy5wdXNoKGNvbG9yQ29kZSArICdtKycgKyBtb2R1bGUuZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpICsgJ1xcdTAwMUJbMG0nKTtcblx0fSBlbHNlIHtcblx0XHRhcmdzWzBdID0gZ2V0RGF0ZSgpICsgbmFtZSArICcgJyArIGFyZ3NbMF07XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0RGF0ZSgpIHtcblx0aWYgKGV4cG9ydHMuaW5zcGVjdE9wdHMuaGlkZURhdGUpIHtcblx0XHRyZXR1cm4gJyc7XG5cdH1cblx0cmV0dXJuIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSArICcgJztcbn1cblxuLyoqXG4gKiBJbnZva2VzIGB1dGlsLmZvcm1hdCgpYCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzIGFuZCB3cml0ZXMgdG8gc3RkZXJyLlxuICovXG5cbmZ1bmN0aW9uIGxvZyguLi5hcmdzKSB7XG5cdHJldHVybiBwcm9jZXNzLnN0ZGVyci53cml0ZSh1dGlsLmZvcm1hdCguLi5hcmdzKSArICdcXG4nKTtcbn1cblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuXHRpZiAobmFtZXNwYWNlcykge1xuXHRcdHByb2Nlc3MuZW52LkRFQlVHID0gbmFtZXNwYWNlcztcblx0fSBlbHNlIHtcblx0XHQvLyBJZiB5b3Ugc2V0IGEgcHJvY2Vzcy5lbnYgZmllbGQgdG8gbnVsbCBvciB1bmRlZmluZWQsIGl0IGdldHMgY2FzdCB0byB0aGVcblx0XHQvLyBzdHJpbmcgJ251bGwnIG9yICd1bmRlZmluZWQnLiBKdXN0IGRlbGV0ZSBpbnN0ZWFkLlxuXHRcdGRlbGV0ZSBwcm9jZXNzLmVudi5ERUJVRztcblx0fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvYWQoKSB7XG5cdHJldHVybiBwcm9jZXNzLmVudi5ERUJVRztcbn1cblxuLyoqXG4gKiBJbml0IGxvZ2ljIGZvciBgZGVidWdgIGluc3RhbmNlcy5cbiAqXG4gKiBDcmVhdGUgYSBuZXcgYGluc3BlY3RPcHRzYCBvYmplY3QgaW4gY2FzZSBgdXNlQ29sb3JzYCBpcyBzZXRcbiAqIGRpZmZlcmVudGx5IGZvciBhIHBhcnRpY3VsYXIgYGRlYnVnYCBpbnN0YW5jZS5cbiAqL1xuXG5mdW5jdGlvbiBpbml0KGRlYnVnKSB7XG5cdGRlYnVnLmluc3BlY3RPcHRzID0ge307XG5cblx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGV4cG9ydHMuaW5zcGVjdE9wdHMpO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcblx0XHRkZWJ1Zy5pbnNwZWN0T3B0c1trZXlzW2ldXSA9IGV4cG9ydHMuaW5zcGVjdE9wdHNba2V5c1tpXV07XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NvbW1vbicpKGV4cG9ydHMpO1xuXG5jb25zdCB7Zm9ybWF0dGVyc30gPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBNYXAgJW8gdG8gYHV0aWwuaW5zcGVjdCgpYCwgYWxsIG9uIGEgc2luZ2xlIGxpbmUuXG4gKi9cblxuZm9ybWF0dGVycy5vID0gZnVuY3Rpb24gKHYpIHtcblx0dGhpcy5pbnNwZWN0T3B0cy5jb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcblx0cmV0dXJuIHV0aWwuaW5zcGVjdCh2LCB0aGlzLmluc3BlY3RPcHRzKVxuXHRcdC5zcGxpdCgnXFxuJylcblx0XHQubWFwKHN0ciA9PiBzdHIudHJpbSgpKVxuXHRcdC5qb2luKCcgJyk7XG59O1xuXG4vKipcbiAqIE1hcCAlTyB0byBgdXRpbC5pbnNwZWN0KClgLCBhbGxvd2luZyBtdWx0aXBsZSBsaW5lcyBpZiBuZWVkZWQuXG4gKi9cblxuZm9ybWF0dGVycy5PID0gZnVuY3Rpb24gKHYpIHtcblx0dGhpcy5pbnNwZWN0T3B0cy5jb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcblx0cmV0dXJuIHV0aWwuaW5zcGVjdCh2LCB0aGlzLmluc3BlY3RPcHRzKTtcbn07XG4iLCAiLyoqXG4gKiBEZXRlY3QgRWxlY3Ryb24gcmVuZGVyZXIgLyBud2pzIHByb2Nlc3MsIHdoaWNoIGlzIG5vZGUsIGJ1dCB3ZSBzaG91bGRcbiAqIHRyZWF0IGFzIGEgYnJvd3Nlci5cbiAqL1xuXG5pZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnIHx8IHByb2Nlc3MudHlwZSA9PT0gJ3JlbmRlcmVyJyB8fCBwcm9jZXNzLmJyb3dzZXIgPT09IHRydWUgfHwgcHJvY2Vzcy5fX253anMpIHtcblx0bW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Jyb3dzZXIuanMnKTtcbn0gZWxzZSB7XG5cdG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9ub2RlLmpzJyk7XG59XG4iLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAiaW1wb3J0IHsgZXZlbnRUb1NlbnRyeVJlcXVlc3QsIHNlc3Npb25Ub1NlbnRyeVJlcXVlc3QgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgRXZlbnQsIFJlc3BvbnNlLCBTZXNzaW9uLCBTZXNzaW9uQWdncmVnYXRlcywgVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0ICogYXMgaHR0cCBmcm9tICdodHRwJztcblxuaW1wb3J0IHsgQmFzZVRyYW5zcG9ydCB9IGZyb20gJy4vYmFzZSc7XG5cbi8qKiBOb2RlIGh0dHAgbW9kdWxlIHRyYW5zcG9ydCAqL1xuZXhwb3J0IGNsYXNzIEhUVFBUcmFuc3BvcnQgZXh0ZW5kcyBCYXNlVHJhbnNwb3J0IHtcbiAgLyoqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBhbmQgc2V0IHRoaXMuYWdlbnQgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBvcHRpb25zOiBUcmFuc3BvcnRPcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gICAgY29uc3QgcHJveHkgPSB0aGlzLl9nZXRQcm94eSgnaHR0cCcpO1xuICAgIHRoaXMubW9kdWxlID0gaHR0cDtcbiAgICB0aGlzLmNsaWVudCA9IHByb3h5XG4gICAgICA/IChuZXcgKHJlcXVpcmUoJ2h0dHBzLXByb3h5LWFnZW50JykpKHByb3h5KSBhcyBodHRwLkFnZW50KVxuICAgICAgOiBuZXcgaHR0cC5BZ2VudCh7IGtlZXBBbGl2ZTogZmFsc2UsIG1heFNvY2tldHM6IDMwLCB0aW1lb3V0OiAyMDAwIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2VuZEV2ZW50KGV2ZW50OiBFdmVudCk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5fc2VuZChldmVudFRvU2VudHJ5UmVxdWVzdChldmVudCwgdGhpcy5fYXBpKSwgZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2VuZFNlc3Npb24oc2Vzc2lvbjogU2Vzc2lvbiB8IFNlc3Npb25BZ2dyZWdhdGVzKTogUHJvbWlzZUxpa2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5fc2VuZChzZXNzaW9uVG9TZW50cnlSZXF1ZXN0KHNlc3Npb24sIHRoaXMuX2FwaSksIHNlc3Npb24pO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgZXZlbnRUb1NlbnRyeVJlcXVlc3QsIHNlc3Npb25Ub1NlbnRyeVJlcXVlc3QgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgRXZlbnQsIFJlc3BvbnNlLCBTZXNzaW9uLCBTZXNzaW9uQWdncmVnYXRlcywgVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0ICogYXMgaHR0cHMgZnJvbSAnaHR0cHMnO1xuXG5pbXBvcnQgeyBCYXNlVHJhbnNwb3J0IH0gZnJvbSAnLi9iYXNlJztcblxuLyoqIE5vZGUgaHR0cHMgbW9kdWxlIHRyYW5zcG9ydCAqL1xuZXhwb3J0IGNsYXNzIEhUVFBTVHJhbnNwb3J0IGV4dGVuZHMgQmFzZVRyYW5zcG9ydCB7XG4gIC8qKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2UgYW5kIHNldCB0aGlzLmFnZW50ICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgb3B0aW9uczogVHJhbnNwb3J0T3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIGNvbnN0IHByb3h5ID0gdGhpcy5fZ2V0UHJveHkoJ2h0dHBzJyk7XG4gICAgdGhpcy5tb2R1bGUgPSBodHRwcztcbiAgICB0aGlzLmNsaWVudCA9IHByb3h5XG4gICAgICA/IChuZXcgKHJlcXVpcmUoJ2h0dHBzLXByb3h5LWFnZW50JykpKHByb3h5KSBhcyBodHRwcy5BZ2VudClcbiAgICAgIDogbmV3IGh0dHBzLkFnZW50KHsga2VlcEFsaXZlOiBmYWxzZSwgbWF4U29ja2V0czogMzAsIHRpbWVvdXQ6IDIwMDAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZW5kRXZlbnQoZXZlbnQ6IEV2ZW50KTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLl9zZW5kKGV2ZW50VG9TZW50cnlSZXF1ZXN0KGV2ZW50LCB0aGlzLl9hcGkpLCBldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZW5kU2Vzc2lvbihzZXNzaW9uOiBTZXNzaW9uIHwgU2Vzc2lvbkFnZ3JlZ2F0ZXMpOiBQcm9taXNlTGlrZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLl9zZW5kKHNlc3Npb25Ub1NlbnRyeVJlcXVlc3Qoc2Vzc2lvbiwgdGhpcy5fYXBpKSwgc2Vzc2lvbik7XG4gIH1cbn1cbiIsICJleHBvcnQgeyBCYXNlVHJhbnNwb3J0IH0gZnJvbSAnLi9iYXNlJztcbmV4cG9ydCB7IEhUVFBUcmFuc3BvcnQgfSBmcm9tICcuL2h0dHAnO1xuZXhwb3J0IHsgSFRUUFNUcmFuc3BvcnQgfSBmcm9tICcuL2h0dHBzJztcbiIsICJpbXBvcnQgeyBCYXNlQmFja2VuZCwgZ2V0Q3VycmVudEh1YiB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBFdmVudCwgRXZlbnRIaW50LCBNZWNoYW5pc20sIFNldmVyaXR5LCBUcmFuc3BvcnQsIFRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7XG4gIGFkZEV4Y2VwdGlvbk1lY2hhbmlzbSxcbiAgYWRkRXhjZXB0aW9uVHlwZVZhbHVlLFxuICBEc24sXG4gIGV4dHJhY3RFeGNlcHRpb25LZXlzRm9yTWVzc2FnZSxcbiAgaXNFcnJvcixcbiAgaXNQbGFpbk9iamVjdCxcbiAgbm9ybWFsaXplVG9TaXplLFxuICBTeW5jUHJvbWlzZSxcbn0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmltcG9ydCB7IGV4dHJhY3RTdGFja0Zyb21FcnJvciwgcGFyc2VFcnJvciwgcGFyc2VTdGFjaywgcHJlcGFyZUZyYW1lc0ZvckV2ZW50IH0gZnJvbSAnLi9wYXJzZXJzJztcbmltcG9ydCB7IEhUVFBTVHJhbnNwb3J0LCBIVFRQVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnRzJztcbmltcG9ydCB7IE5vZGVPcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogVGhlIFNlbnRyeSBOb2RlIFNESyBCYWNrZW5kLlxuICogQGhpZGRlblxuICovXG5leHBvcnQgY2xhc3MgTm9kZUJhY2tlbmQgZXh0ZW5kcyBCYXNlQmFja2VuZDxOb2RlT3B0aW9ucz4ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXG4gIHB1YmxpYyBldmVudEZyb21FeGNlcHRpb24oZXhjZXB0aW9uOiBhbnksIGhpbnQ/OiBFdmVudEhpbnQpOiBQcm9taXNlTGlrZTxFdmVudD4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgbGV0IGV4OiBhbnkgPSBleGNlcHRpb247XG4gICAgY29uc3QgcHJvdmlkZWRNZWNoYW5pc206IE1lY2hhbmlzbSB8IHVuZGVmaW5lZCA9XG4gICAgICBoaW50ICYmIGhpbnQuZGF0YSAmJiAoaGludC5kYXRhIGFzIHsgbWVjaGFuaXNtOiBNZWNoYW5pc20gfSkubWVjaGFuaXNtO1xuICAgIGNvbnN0IG1lY2hhbmlzbTogTWVjaGFuaXNtID0gcHJvdmlkZWRNZWNoYW5pc20gfHwge1xuICAgICAgaGFuZGxlZDogdHJ1ZSxcbiAgICAgIHR5cGU6ICdnZW5lcmljJyxcbiAgICB9O1xuXG4gICAgaWYgKCFpc0Vycm9yKGV4Y2VwdGlvbikpIHtcbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KGV4Y2VwdGlvbikpIHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIGFsbG93IHVzIHRvIGdyb3VwIGV2ZW50cyBiYXNlZCBvbiB0b3AtbGV2ZWwga2V5c1xuICAgICAgICAvLyB3aGljaCBpcyBtdWNoIGJldHRlciB0aGFuIGNyZWF0aW5nIG5ldyBncm91cCB3aGVuIGFueSBrZXkvdmFsdWUgY2hhbmdlXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgTm9uLUVycm9yIGV4Y2VwdGlvbiBjYXB0dXJlZCB3aXRoIGtleXM6ICR7ZXh0cmFjdEV4Y2VwdGlvbktleXNGb3JNZXNzYWdlKGV4Y2VwdGlvbil9YDtcblxuICAgICAgICBnZXRDdXJyZW50SHViKCkuY29uZmlndXJlU2NvcGUoc2NvcGUgPT4ge1xuICAgICAgICAgIHNjb3BlLnNldEV4dHJhKCdfX3NlcmlhbGl6ZWRfXycsIG5vcm1hbGl6ZVRvU2l6ZShleGNlcHRpb24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXggPSAoaGludCAmJiBoaW50LnN5bnRoZXRpY0V4Y2VwdGlvbikgfHwgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAoZXggYXMgRXJyb3IpLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBoYW5kbGVzIHdoZW4gc29tZW9uZSBkb2VzOiBgdGhyb3cgXCJzb21ldGhpbmcgYXdlc29tZVwiO2BcbiAgICAgICAgLy8gV2UgdXNlIHN5bnRoZXNpemVkIEVycm9yIGhlcmUgc28gd2UgY2FuIGV4dHJhY3QgYSAocm91Z2gpIHN0YWNrIHRyYWNlLlxuICAgICAgICBleCA9IChoaW50ICYmIGhpbnQuc3ludGhldGljRXhjZXB0aW9uKSB8fCBuZXcgRXJyb3IoZXhjZXB0aW9uIGFzIHN0cmluZyk7XG4gICAgICAgIChleCBhcyBFcnJvcikubWVzc2FnZSA9IGV4Y2VwdGlvbjtcbiAgICAgIH1cbiAgICAgIG1lY2hhbmlzbS5zeW50aGV0aWMgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgU3luY1Byb21pc2U8RXZlbnQ+KChyZXNvbHZlLCByZWplY3QpID0+XG4gICAgICBwYXJzZUVycm9yKGV4IGFzIEVycm9yLCB0aGlzLl9vcHRpb25zKVxuICAgICAgICAudGhlbihldmVudCA9PiB7XG4gICAgICAgICAgYWRkRXhjZXB0aW9uVHlwZVZhbHVlKGV2ZW50LCB1bmRlZmluZWQsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgYWRkRXhjZXB0aW9uTWVjaGFuaXNtKGV2ZW50LCBtZWNoYW5pc20pO1xuXG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAuLi5ldmVudCxcbiAgICAgICAgICAgIGV2ZW50X2lkOiBoaW50ICYmIGhpbnQuZXZlbnRfaWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKG51bGwsIHJlamVjdCksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGV2ZW50RnJvbU1lc3NhZ2UobWVzc2FnZTogc3RyaW5nLCBsZXZlbDogU2V2ZXJpdHkgPSBTZXZlcml0eS5JbmZvLCBoaW50PzogRXZlbnRIaW50KTogUHJvbWlzZUxpa2U8RXZlbnQ+IHtcbiAgICBjb25zdCBldmVudDogRXZlbnQgPSB7XG4gICAgICBldmVudF9pZDogaGludCAmJiBoaW50LmV2ZW50X2lkLFxuICAgICAgbGV2ZWwsXG4gICAgICBtZXNzYWdlLFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFN5bmNQcm9taXNlPEV2ZW50PihyZXNvbHZlID0+IHtcbiAgICAgIGlmICh0aGlzLl9vcHRpb25zLmF0dGFjaFN0YWNrdHJhY2UgJiYgaGludCAmJiBoaW50LnN5bnRoZXRpY0V4Y2VwdGlvbikge1xuICAgICAgICBjb25zdCBzdGFjayA9IGhpbnQuc3ludGhldGljRXhjZXB0aW9uID8gZXh0cmFjdFN0YWNrRnJvbUVycm9yKGhpbnQuc3ludGhldGljRXhjZXB0aW9uKSA6IFtdO1xuICAgICAgICB2b2lkIHBhcnNlU3RhY2soc3RhY2ssIHRoaXMuX29wdGlvbnMpXG4gICAgICAgICAgLnRoZW4oZnJhbWVzID0+IHtcbiAgICAgICAgICAgIGV2ZW50LnN0YWNrdHJhY2UgPSB7XG4gICAgICAgICAgICAgIGZyYW1lczogcHJlcGFyZUZyYW1lc0ZvckV2ZW50KGZyYW1lcyksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVzb2x2ZShldmVudCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAudGhlbihudWxsLCAoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKGV2ZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoZXZlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwcm90ZWN0ZWQgX3NldHVwVHJhbnNwb3J0KCk6IFRyYW5zcG9ydCB7XG4gICAgaWYgKCF0aGlzLl9vcHRpb25zLmRzbikge1xuICAgICAgLy8gV2UgcmV0dXJuIHRoZSBub29wIHRyYW5zcG9ydCBoZXJlIGluIGNhc2UgdGhlcmUgaXMgbm8gRHNuLlxuICAgICAgcmV0dXJuIHN1cGVyLl9zZXR1cFRyYW5zcG9ydCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGRzbiA9IG5ldyBEc24odGhpcy5fb3B0aW9ucy5kc24pO1xuXG4gICAgY29uc3QgdHJhbnNwb3J0T3B0aW9uczogVHJhbnNwb3J0T3B0aW9ucyA9IHtcbiAgICAgIC4uLnRoaXMuX29wdGlvbnMudHJhbnNwb3J0T3B0aW9ucyxcbiAgICAgIC4uLih0aGlzLl9vcHRpb25zLmh0dHBQcm94eSAmJiB7IGh0dHBQcm94eTogdGhpcy5fb3B0aW9ucy5odHRwUHJveHkgfSksXG4gICAgICAuLi4odGhpcy5fb3B0aW9ucy5odHRwc1Byb3h5ICYmIHsgaHR0cHNQcm94eTogdGhpcy5fb3B0aW9ucy5odHRwc1Byb3h5IH0pLFxuICAgICAgLi4uKHRoaXMuX29wdGlvbnMuY2FDZXJ0cyAmJiB7IGNhQ2VydHM6IHRoaXMuX29wdGlvbnMuY2FDZXJ0cyB9KSxcbiAgICAgIGRzbjogdGhpcy5fb3B0aW9ucy5kc24sXG4gICAgICB0dW5uZWw6IHRoaXMuX29wdGlvbnMudHVubmVsLFxuICAgICAgX21ldGFkYXRhOiB0aGlzLl9vcHRpb25zLl9tZXRhZGF0YSxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuX29wdGlvbnMudHJhbnNwb3J0KSB7XG4gICAgICByZXR1cm4gbmV3IHRoaXMuX29wdGlvbnMudHJhbnNwb3J0KHRyYW5zcG9ydE9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoZHNuLnByb3RvY29sID09PSAnaHR0cCcpIHtcbiAgICAgIHJldHVybiBuZXcgSFRUUFRyYW5zcG9ydCh0cmFuc3BvcnRPcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBIVFRQU1RyYW5zcG9ydCh0cmFuc3BvcnRPcHRpb25zKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IEJhc2VDbGllbnQsIFNjb3BlLCBTREtfVkVSU0lPTiB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBTZXNzaW9uRmx1c2hlciB9IGZyb20gJ0BzZW50cnkvaHViJztcbmltcG9ydCB7IEV2ZW50LCBFdmVudEhpbnQsIFJlcXVlc3RTZXNzaW9uU3RhdHVzIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW1wb3J0IHsgTm9kZUJhY2tlbmQgfSBmcm9tICcuL2JhY2tlbmQnO1xuaW1wb3J0IHsgTm9kZU9wdGlvbnMgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBUaGUgU2VudHJ5IE5vZGUgU0RLIENsaWVudC5cbiAqXG4gKiBAc2VlIE5vZGVPcHRpb25zIGZvciBkb2N1bWVudGF0aW9uIG9uIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAqIEBzZWUgU2VudHJ5Q2xpZW50IGZvciB1c2FnZSBkb2N1bWVudGF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgTm9kZUNsaWVudCBleHRlbmRzIEJhc2VDbGllbnQ8Tm9kZUJhY2tlbmQsIE5vZGVPcHRpb25zPiB7XG4gIHByb3RlY3RlZCBfc2Vzc2lvbkZsdXNoZXI6IFNlc3Npb25GbHVzaGVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IE5vZGUgU0RLIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoaXMgU0RLLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE5vZGVPcHRpb25zKSB7XG4gICAgb3B0aW9ucy5fbWV0YWRhdGEgPSBvcHRpb25zLl9tZXRhZGF0YSB8fCB7fTtcbiAgICBvcHRpb25zLl9tZXRhZGF0YS5zZGsgPSBvcHRpb25zLl9tZXRhZGF0YS5zZGsgfHwge1xuICAgICAgbmFtZTogJ3NlbnRyeS5qYXZhc2NyaXB0Lm5vZGUnLFxuICAgICAgcGFja2FnZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICducG06QHNlbnRyeS9ub2RlJyxcbiAgICAgICAgICB2ZXJzaW9uOiBTREtfVkVSU0lPTixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICB2ZXJzaW9uOiBTREtfVkVSU0lPTixcbiAgICB9O1xuXG4gICAgc3VwZXIoTm9kZUJhY2tlbmQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuICBwdWJsaWMgY2FwdHVyZUV4Y2VwdGlvbihleGNlcHRpb246IGFueSwgaGludD86IEV2ZW50SGludCwgc2NvcGU/OiBTY29wZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGZsYWcgYGF1dG9TZXNzaW9uVHJhY2tpbmdgIGlzIGVuYWJsZWQsIGFuZCBpZiBgX3Nlc3Npb25GbHVzaGVyYCBleGlzdHMgYmVjYXVzZSBpdCBpcyBpbml0aWFsaXNlZCBvbmx5XG4gICAgLy8gd2hlbiB0aGUgYHJlcXVlc3RIYW5kbGVyYCBtaWRkbGV3YXJlIGlzIHVzZWQsIGFuZCBoZW5jZSB0aGUgZXhwZWN0YXRpb24gaXMgdG8gaGF2ZSBTZXNzaW9uQWdncmVnYXRlcyBwYXlsb2FkXG4gICAgLy8gc2VudCB0byB0aGUgU2VydmVyIG9ubHkgd2hlbiB0aGUgYHJlcXVlc3RIYW5kbGVyYCBtaWRkbGV3YXJlIGlzIHVzZWRcbiAgICBpZiAodGhpcy5fb3B0aW9ucy5hdXRvU2Vzc2lvblRyYWNraW5nICYmIHRoaXMuX3Nlc3Npb25GbHVzaGVyICYmIHNjb3BlKSB7XG4gICAgICBjb25zdCByZXF1ZXN0U2Vzc2lvbiA9IHNjb3BlLmdldFJlcXVlc3RTZXNzaW9uKCk7XG5cbiAgICAgIC8vIE5lY2Vzc2FyeSBjaGVja3MgdG8gZW5zdXJlIHRoaXMgaXMgY29kZSBibG9jayBpcyBleGVjdXRlZCBvbmx5IHdpdGhpbiBhIHJlcXVlc3RcbiAgICAgIC8vIFNob3VsZCBvdmVycmlkZSB0aGUgc3RhdHVzIG9ubHkgaWYgYHJlcXVlc3RTZXNzaW9uLnN0YXR1c2AgaXMgYE9rYCwgd2hpY2ggaXMgaXRzIGluaXRpYWwgc3RhZ2VcbiAgICAgIGlmIChyZXF1ZXN0U2Vzc2lvbiAmJiByZXF1ZXN0U2Vzc2lvbi5zdGF0dXMgPT09IFJlcXVlc3RTZXNzaW9uU3RhdHVzLk9rKSB7XG4gICAgICAgIHJlcXVlc3RTZXNzaW9uLnN0YXR1cyA9IFJlcXVlc3RTZXNzaW9uU3RhdHVzLkVycm9yZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLmNhcHR1cmVFeGNlcHRpb24oZXhjZXB0aW9uLCBoaW50LCBzY29wZSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBjYXB0dXJlRXZlbnQoZXZlbnQ6IEV2ZW50LCBoaW50PzogRXZlbnRIaW50LCBzY29wZT86IFNjb3BlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgZmxhZyBgYXV0b1Nlc3Npb25UcmFja2luZ2AgaXMgZW5hYmxlZCwgYW5kIGlmIGBfc2Vzc2lvbkZsdXNoZXJgIGV4aXN0cyBiZWNhdXNlIGl0IGlzIGluaXRpYWxpc2VkIG9ubHlcbiAgICAvLyB3aGVuIHRoZSBgcmVxdWVzdEhhbmRsZXJgIG1pZGRsZXdhcmUgaXMgdXNlZCwgYW5kIGhlbmNlIHRoZSBleHBlY3RhdGlvbiBpcyB0byBoYXZlIFNlc3Npb25BZ2dyZWdhdGVzIHBheWxvYWRcbiAgICAvLyBzZW50IHRvIHRoZSBTZXJ2ZXIgb25seSB3aGVuIHRoZSBgcmVxdWVzdEhhbmRsZXJgIG1pZGRsZXdhcmUgaXMgdXNlZFxuICAgIGlmICh0aGlzLl9vcHRpb25zLmF1dG9TZXNzaW9uVHJhY2tpbmcgJiYgdGhpcy5fc2Vzc2lvbkZsdXNoZXIgJiYgc2NvcGUpIHtcbiAgICAgIGNvbnN0IGV2ZW50VHlwZSA9IGV2ZW50LnR5cGUgfHwgJ2V4Y2VwdGlvbic7XG4gICAgICBjb25zdCBpc0V4Y2VwdGlvbiA9XG4gICAgICAgIGV2ZW50VHlwZSA9PT0gJ2V4Y2VwdGlvbicgJiYgZXZlbnQuZXhjZXB0aW9uICYmIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlcy5sZW5ndGggPiAwO1xuXG4gICAgICAvLyBJZiB0aGUgZXZlbnQgaXMgb2YgdHlwZSBFeGNlcHRpb24sIHRoZW4gYSByZXF1ZXN0IHNlc3Npb24gc2hvdWxkIGJlIGNhcHR1cmVkXG4gICAgICBpZiAoaXNFeGNlcHRpb24pIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdFNlc3Npb24gPSBzY29wZS5nZXRSZXF1ZXN0U2Vzc2lvbigpO1xuXG4gICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoaXMgaXMgaGFwcGVuaW5nIHdpdGhpbiB0aGUgYm91bmRzIG9mIGEgcmVxdWVzdCwgYW5kIG1ha2Ugc3VyZSBub3QgdG8gb3ZlcnJpZGVcbiAgICAgICAgLy8gU2Vzc2lvbiBTdGF0dXMgaWYgRXJyb3JlZCAvIENyYXNoZWRcbiAgICAgICAgaWYgKHJlcXVlc3RTZXNzaW9uICYmIHJlcXVlc3RTZXNzaW9uLnN0YXR1cyA9PT0gUmVxdWVzdFNlc3Npb25TdGF0dXMuT2spIHtcbiAgICAgICAgICByZXF1ZXN0U2Vzc2lvbi5zdGF0dXMgPSBSZXF1ZXN0U2Vzc2lvblN0YXR1cy5FcnJvcmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLmNhcHR1cmVFdmVudChldmVudCwgaGludCwgc2NvcGUpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBwdWJsaWMgY2xvc2UodGltZW91dD86IG51bWJlcik6IFByb21pc2VMaWtlPGJvb2xlYW4+IHtcbiAgICB0aGlzLl9zZXNzaW9uRmx1c2hlcj8uY2xvc2UoKTtcbiAgICByZXR1cm4gc3VwZXIuY2xvc2UodGltZW91dCk7XG4gIH1cblxuICAvKiogTWV0aG9kIHRoYXQgaW5pdGlhbGlzZXMgYW4gaW5zdGFuY2Ugb2YgU2Vzc2lvbkZsdXNoZXIgb24gQ2xpZW50ICovXG4gIHB1YmxpYyBpbml0U2Vzc2lvbkZsdXNoZXIoKTogdm9pZCB7XG4gICAgY29uc3QgeyByZWxlYXNlLCBlbnZpcm9ubWVudCB9ID0gdGhpcy5fb3B0aW9ucztcbiAgICBpZiAoIXJlbGVhc2UpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdDYW5ub3QgaW5pdGlhbGlzZSBhbiBpbnN0YW5jZSBvZiBTZXNzaW9uRmx1c2hlciBpZiBubyByZWxlYXNlIGlzIHByb3ZpZGVkIScpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXNzaW9uRmx1c2hlciA9IG5ldyBTZXNzaW9uRmx1c2hlcih0aGlzLmdldFRyYW5zcG9ydCgpLCB7XG4gICAgICAgIHJlbGVhc2UsXG4gICAgICAgIGVudmlyb25tZW50LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwcm90ZWN0ZWQgX3ByZXBhcmVFdmVudChldmVudDogRXZlbnQsIHNjb3BlPzogU2NvcGUsIGhpbnQ/OiBFdmVudEhpbnQpOiBQcm9taXNlTGlrZTxFdmVudCB8IG51bGw+IHtcbiAgICBldmVudC5wbGF0Zm9ybSA9IGV2ZW50LnBsYXRmb3JtIHx8ICdub2RlJztcbiAgICBpZiAodGhpcy5nZXRPcHRpb25zKCkuc2VydmVyTmFtZSkge1xuICAgICAgZXZlbnQuc2VydmVyX25hbWUgPSB0aGlzLmdldE9wdGlvbnMoKS5zZXJ2ZXJOYW1lO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIuX3ByZXBhcmVFdmVudChldmVudCwgc2NvcGUsIGhpbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXNwb25zaWJsZSBmb3IgY2FwdHVyaW5nL2VuZGluZyBhIHJlcXVlc3Qgc2Vzc2lvbiBieSBjYWxsaW5nIGBpbmNyZW1lbnRTZXNzaW9uU3RhdHVzQ291bnRgIHRvIGluY3JlbWVudFxuICAgKiBhcHByb3ByaWF0ZSBzZXNzaW9uIGFnZ3JlZ2F0ZXMgYnVja2V0XG4gICAqL1xuICBwcm90ZWN0ZWQgX2NhcHR1cmVSZXF1ZXN0U2Vzc2lvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3Nlc3Npb25GbHVzaGVyKSB7XG4gICAgICBsb2dnZXIud2FybignRGlzY2FyZGVkIHJlcXVlc3QgbW9kZSBzZXNzaW9uIGJlY2F1c2UgYXV0b1Nlc3Npb25UcmFja2luZyBvcHRpb24gd2FzIGRpc2FibGVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3Nlc3Npb25GbHVzaGVyLmluY3JlbWVudFNlc3Npb25TdGF0dXNDb3VudCgpO1xuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7IGdldEN1cnJlbnRIdWIgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgSW50ZWdyYXRpb24sIFNldmVyaXR5IH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBmaWxsIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJ3V0aWwnO1xuXG4vKiogQ29uc29sZSBtb2R1bGUgaW50ZWdyYXRpb24gKi9cbmV4cG9ydCBjbGFzcyBDb25zb2xlIGltcGxlbWVudHMgSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWQ6IHN0cmluZyA9ICdDb25zb2xlJztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBDb25zb2xlLmlkO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldHVwT25jZSgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGxldmVsIG9mIFsnZGVidWcnLCAnaW5mbycsICd3YXJuJywgJ2Vycm9yJywgJ2xvZyddKSB7XG4gICAgICBmaWxsKGNvbnNvbGUsIGxldmVsLCBjcmVhdGVDb25zb2xlV3JhcHBlcihsZXZlbCkpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFdyYXBwZXIgZnVuY3Rpb24gdGhhdCdsbCBiZSB1c2VkIGZvciBldmVyeSBjb25zb2xlIGxldmVsXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNvbnNvbGVXcmFwcGVyKGxldmVsOiBzdHJpbmcpOiAob3JpZ2luYWxDb25zb2xlTWV0aG9kOiAoKSA9PiB2b2lkKSA9PiB2b2lkIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbnNvbGVXcmFwcGVyKG9yaWdpbmFsQ29uc29sZU1ldGhvZDogKCkgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgIGxldCBzZW50cnlMZXZlbDogU2V2ZXJpdHk7XG5cbiAgICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgICBjYXNlICdkZWJ1Zyc6XG4gICAgICAgIHNlbnRyeUxldmVsID0gU2V2ZXJpdHkuRGVidWc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICBzZW50cnlMZXZlbCA9IFNldmVyaXR5LkVycm9yO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2luZm8nOlxuICAgICAgICBzZW50cnlMZXZlbCA9IFNldmVyaXR5LkluZm87XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd2Fybic6XG4gICAgICAgIHNlbnRyeUxldmVsID0gU2V2ZXJpdHkuV2FybmluZztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBzZW50cnlMZXZlbCA9IFNldmVyaXR5LkxvZztcbiAgICB9XG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBwcmVmZXItcmVzdC1wYXJhbXMgKi9cbiAgICByZXR1cm4gZnVuY3Rpb24odGhpczogdHlwZW9mIGNvbnNvbGUpOiB2b2lkIHtcbiAgICAgIGlmIChnZXRDdXJyZW50SHViKCkuZ2V0SW50ZWdyYXRpb24oQ29uc29sZSkpIHtcbiAgICAgICAgZ2V0Q3VycmVudEh1YigpLmFkZEJyZWFkY3J1bWIoXG4gICAgICAgICAge1xuICAgICAgICAgICAgY2F0ZWdvcnk6ICdjb25zb2xlJyxcbiAgICAgICAgICAgIGxldmVsOiBzZW50cnlMZXZlbCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHV0aWwuZm9ybWF0LmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlucHV0OiBbLi4uYXJndW1lbnRzXSxcbiAgICAgICAgICAgIGxldmVsLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIG9yaWdpbmFsQ29uc29sZU1ldGhvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gICAgLyogZXNsaW50LWVuYWJsZSBwcmVmZXItcmVzdC1wYXJhbXMgKi9cbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBnZXRDdXJyZW50SHViIH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7IHBhcnNlU2VtdmVyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0ICogYXMgaHR0cHMgZnJvbSAnaHR0cHMnO1xuaW1wb3J0IHsgVVJMIH0gZnJvbSAndXJsJztcblxuY29uc3QgTk9ERV9WRVJTSU9OID0gcGFyc2VTZW12ZXIocHJvY2Vzcy52ZXJzaW9ucy5ub2RlKTtcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB1cmwgcG9pbnRzIHRvIFNlbnRyeSBzZXJ2ZXJcbiAqIEBwYXJhbSB1cmwgdXJsIHRvIHZlcmlmeVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTZW50cnlSZXF1ZXN0KHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRzbiA9IGdldEN1cnJlbnRIdWIoKVxuICAgIC5nZXRDbGllbnQoKVxuICAgID8uZ2V0RHNuKCk7XG4gIHJldHVybiBkc24gPyB1cmwuaW5jbHVkZXMoZHNuLmhvc3QpIDogZmFsc2U7XG59XG5cbi8qKlxuICogQXNzZW1ibGUgYSBVUkwgdG8gYmUgdXNlZCBmb3IgYnJlYWRjcnVtYnMgYW5kIHNwYW5zLlxuICpcbiAqIEBwYXJhbSByZXF1ZXN0T3B0aW9ucyBSZXF1ZXN0T3B0aW9ucyBvYmplY3QgY29udGFpbmluZyB0aGUgY29tcG9uZW50IHBhcnRzIGZvciBhIFVSTFxuICogQHJldHVybnMgRnVsbHktZm9ybWVkIFVSTFxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFVybChyZXF1ZXN0T3B0aW9uczogUmVxdWVzdE9wdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCBwcm90b2NvbCA9IHJlcXVlc3RPcHRpb25zLnByb3RvY29sIHx8ICcnO1xuICBjb25zdCBob3N0bmFtZSA9IHJlcXVlc3RPcHRpb25zLmhvc3RuYW1lIHx8IHJlcXVlc3RPcHRpb25zLmhvc3QgfHwgJyc7XG4gIC8vIERvbid0IGxvZyBzdGFuZGFyZCA6ODAgKGh0dHApIGFuZCA6NDQzIChodHRwcykgcG9ydHMgdG8gcmVkdWNlIHRoZSBub2lzZVxuICBjb25zdCBwb3J0ID1cbiAgICAhcmVxdWVzdE9wdGlvbnMucG9ydCB8fCByZXF1ZXN0T3B0aW9ucy5wb3J0ID09PSA4MCB8fCByZXF1ZXN0T3B0aW9ucy5wb3J0ID09PSA0NDMgPyAnJyA6IGA6JHtyZXF1ZXN0T3B0aW9ucy5wb3J0fWA7XG4gIGNvbnN0IHBhdGggPSByZXF1ZXN0T3B0aW9ucy5wYXRoID8gcmVxdWVzdE9wdGlvbnMucGF0aCA6ICcvJztcblxuICByZXR1cm4gYCR7cHJvdG9jb2x9Ly8ke2hvc3RuYW1lfSR7cG9ydH0ke3BhdGh9YDtcbn1cblxuLyoqXG4gKiBIYW5kbGUgdmFyaW91cyBlZGdlIGNhc2VzIGluIHRoZSBzcGFuIGRlc2NyaXB0aW9uIChmb3Igc3BhbnMgcmVwcmVzZW50aW5nIGh0dHAocykgcmVxdWVzdHMpLlxuICpcbiAqIEBwYXJhbSBkZXNjcmlwdGlvbiBjdXJyZW50IGBkZXNjcmlwdGlvbmAgcHJvcGVydHkgb2YgdGhlIHNwYW4gcmVwcmVzZW50aW5nIHRoZSByZXF1ZXN0XG4gKiBAcGFyYW0gcmVxdWVzdE9wdGlvbnMgQ29uZmlndXJhdGlvbiBkYXRhIGZvciB0aGUgcmVxdWVzdFxuICogQHBhcmFtIFJlcXVlc3QgUmVxdWVzdCBvYmplY3RcbiAqXG4gKiBAcmV0dXJucyBUaGUgY2xlYW5lZCBkZXNjcmlwdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5TcGFuRGVzY3JpcHRpb24oXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHJlcXVlc3RPcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyxcbiAgcmVxdWVzdDogaHR0cC5DbGllbnRSZXF1ZXN0LFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgLy8gbm90aGluZyB0byBjbGVhblxuICBpZiAoIWRlc2NyaXB0aW9uKSB7XG4gICAgcmV0dXJuIGRlc2NyaXB0aW9uO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICBsZXQgW21ldGhvZCwgcmVxdWVzdFVybF0gPSBkZXNjcmlwdGlvbi5zcGxpdCgnICcpO1xuXG4gIC8vIHN1cGVyYWdlbnQgc3RpY2tzIHRoZSBwcm90b2NvbCBpbiBhIHdlaXJkIHBsYWNlICh3ZSBjaGVjayBmb3IgaG9zdCBiZWNhdXNlIGlmIGJvdGggaG9zdCAqYW5kKiBwcm90b2NvbCBhcmUgbWlzc2luZyxcbiAgLy8gd2UncmUgbGlrZWx5IGRlYWxpbmcgd2l0aCBhbiBpbnRlcm5hbCByb3V0ZSBhbmQgdGhpcyBkb2Vzbid0IGFwcGx5KVxuICBpZiAocmVxdWVzdE9wdGlvbnMuaG9zdCAmJiAhcmVxdWVzdE9wdGlvbnMucHJvdG9jb2wpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcmVxdWVzdE9wdGlvbnMucHJvdG9jb2wgPSAocmVxdWVzdCBhcyBhbnkpPy5hZ2VudD8ucHJvdG9jb2w7IC8vIHdvcnN0IGNvbWVzIHRvIHdvcnN0LCB0aGlzIGlzIHVuZGVmaW5lZCBhbmQgbm90aGluZyBjaGFuZ2VzXG4gICAgcmVxdWVzdFVybCA9IGV4dHJhY3RVcmwocmVxdWVzdE9wdGlvbnMpO1xuICB9XG5cbiAgLy8gaW50ZXJuYWwgcm91dGVzIGNhbiBlbmQgdXAgc3RhcnRpbmcgd2l0aCBhIHRyaXBsZSBzbGFzaCByYXRoZXIgdGhhbiBhIHNpbmdsZSBvbmVcbiAgaWYgKHJlcXVlc3RVcmw/LnN0YXJ0c1dpdGgoJy8vLycpKSB7XG4gICAgcmVxdWVzdFVybCA9IHJlcXVlc3RVcmwuc2xpY2UoMik7XG4gIH1cblxuICByZXR1cm4gYCR7bWV0aG9kfSAke3JlcXVlc3RVcmx9YDtcbn1cblxuLy8gdGhlIG5vZGUgdHlwZXMgYXJlIG1pc3NpbmcgYSBmZXcgcHJvcGVydGllcyB3aGljaCBub2RlJ3MgYHVybFRvT3B0aW9uc2AgZnVuY3Rpb24gc3BpdHMgb3V0XG5leHBvcnQgdHlwZSBSZXF1ZXN0T3B0aW9ucyA9IGh0dHAuUmVxdWVzdE9wdGlvbnMgJiB7IGhhc2g/OiBzdHJpbmc7IHNlYXJjaD86IHN0cmluZzsgcGF0aG5hbWU/OiBzdHJpbmc7IGhyZWY/OiBzdHJpbmcgfTtcbnR5cGUgUmVxdWVzdENhbGxiYWNrID0gKHJlc3BvbnNlOiBodHRwLkluY29taW5nTWVzc2FnZSkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIFJlcXVlc3RNZXRob2RBcmdzID1cbiAgfCBbUmVxdWVzdE9wdGlvbnMgfCBzdHJpbmcgfCBVUkwsIFJlcXVlc3RDYWxsYmFjaz9dXG4gIHwgW3N0cmluZyB8IFVSTCwgUmVxdWVzdE9wdGlvbnMsIFJlcXVlc3RDYWxsYmFjaz9dO1xuZXhwb3J0IHR5cGUgUmVxdWVzdE1ldGhvZCA9ICguLi5hcmdzOiBSZXF1ZXN0TWV0aG9kQXJncykgPT4gaHR0cC5DbGllbnRSZXF1ZXN0O1xuXG4vKipcbiAqIENvbnZlcnQgYSBVUkwgb2JqZWN0IGludG8gYSBSZXF1ZXN0T3B0aW9ucyBvYmplY3QuXG4gKlxuICogQ29waWVkIGZyb20gTm9kZSdzIGludGVybmFscyAod2hlcmUgaXQncyB1c2VkIGluIGh0dHAocykucmVxdWVzdCgpIGFuZCBodHRwKHMpLmdldCgpKSwgbW9kaWZpZWQgb25seSB0byB1c2UgdGhlXG4gKiBSZXF1ZXN0T3B0aW9ucyB0eXBlIGFib3ZlLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi9tYXN0ZXIvbGliL2ludGVybmFsL3VybC5qcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVybFRvT3B0aW9ucyh1cmw6IFVSTCk6IFJlcXVlc3RPcHRpb25zIHtcbiAgY29uc3Qgb3B0aW9uczogUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgcHJvdG9jb2w6IHVybC5wcm90b2NvbCxcbiAgICBob3N0bmFtZTpcbiAgICAgIHR5cGVvZiB1cmwuaG9zdG5hbWUgPT09ICdzdHJpbmcnICYmIHVybC5ob3N0bmFtZS5zdGFydHNXaXRoKCdbJykgPyB1cmwuaG9zdG5hbWUuc2xpY2UoMSwgLTEpIDogdXJsLmhvc3RuYW1lLFxuICAgIGhhc2g6IHVybC5oYXNoLFxuICAgIHNlYXJjaDogdXJsLnNlYXJjaCxcbiAgICBwYXRobmFtZTogdXJsLnBhdGhuYW1lLFxuICAgIHBhdGg6IGAke3VybC5wYXRobmFtZSB8fCAnJ30ke3VybC5zZWFyY2ggfHwgJyd9YCxcbiAgICBocmVmOiB1cmwuaHJlZixcbiAgfTtcbiAgaWYgKHVybC5wb3J0ICE9PSAnJykge1xuICAgIG9wdGlvbnMucG9ydCA9IE51bWJlcih1cmwucG9ydCk7XG4gIH1cbiAgaWYgKHVybC51c2VybmFtZSB8fCB1cmwucGFzc3dvcmQpIHtcbiAgICBvcHRpb25zLmF1dGggPSBgJHt1cmwudXNlcm5hbWV9OiR7dXJsLnBhc3N3b3JkfWA7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGlucHV0cyB0byBgaHR0cChzKS5yZXF1ZXN0KClgIGFuZCBgaHR0cChzKS5nZXQoKWAuXG4gKlxuICogTGVnYWwgaW5wdXRzIHRvIGBodHRwKHMpLnJlcXVlc3QoKWAgYW5kIGBodHRwKHMpLmdldCgpYCBjYW4gdGFrZSBvbmUgb2YgdGVuIGZvcm1zOlxuICogICAgIFsgUmVxdWVzdE9wdGlvbnMgfCBzdHJpbmcgfCBVUkwgXSxcbiAqICAgICBbIFJlcXVlc3RPcHRpb25zIHwgc3RyaW5nIHwgVVJMLCBSZXF1ZXN0Q2FsbGJhY2sgXSxcbiAqICAgICBbIHN0cmluZyB8IFVSTCwgUmVxdWVzdE9wdGlvbnMgXSwgYW5kXG4gKiAgICAgWyBzdHJpbmcgfCBVUkwsIFJlcXVlc3RPcHRpb25zLCBSZXF1ZXN0Q2FsbGJhY2sgXS5cbiAqXG4gKiBUaGlzIHN0YW5kYXJkaXplcyB0byBvbmUgb2YgdHdvIGZvcm1zOiBbIFJlcXVlc3RPcHRpb25zIF0gYW5kIFsgUmVxdWVzdE9wdGlvbnMsIFJlcXVlc3RDYWxsYmFjayBdLiBBIHNpbWlsYXIgdGhpbmcgaXNcbiAqIGRvbmUgYXMgdGhlIGZpcnN0IHN0ZXAgb2YgYGh0dHAocykucmVxdWVzdCgpYCBhbmQgYGh0dHAocykuZ2V0KClgOyB0aGlzIGp1c3QgZG9lcyBpdCBlYXJseSBzbyB0aGF0IHdlIGNhbiBpbnRlcmFjdFxuICogd2l0aCB0aGUgYXJncyBpbiBhIHN0YW5kYXJkIHdheS5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdEFyZ3MgVGhlIGlucHV0cyB0byBgaHR0cChzKS5yZXF1ZXN0KClgIG9yIGBodHRwKHMpLmdldCgpYCwgYXMgYW4gYXJyYXkuXG4gKlxuICogQHJldHVybnMgRXF1aXZhbGVudCBhcmdzIG9mIHRoZSBmb3JtIFsgUmVxdWVzdE9wdGlvbnMgXSBvciBbIFJlcXVlc3RPcHRpb25zLCBSZXF1ZXN0Q2FsbGJhY2sgXS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVJlcXVlc3RBcmdzKFxuICBodHRwTW9kdWxlOiB0eXBlb2YgaHR0cCB8IHR5cGVvZiBodHRwcyxcbiAgcmVxdWVzdEFyZ3M6IFJlcXVlc3RNZXRob2RBcmdzLFxuKTogW1JlcXVlc3RPcHRpb25zXSB8IFtSZXF1ZXN0T3B0aW9ucywgUmVxdWVzdENhbGxiYWNrXSB7XG4gIGxldCBjYWxsYmFjaywgcmVxdWVzdE9wdGlvbnM7XG5cbiAgLy8gcG9wIG9mZiB0aGUgY2FsbGJhY2ssIGlmIHRoZXJlIGlzIG9uZVxuICBpZiAodHlwZW9mIHJlcXVlc3RBcmdzW3JlcXVlc3RBcmdzLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSByZXF1ZXN0QXJncy5wb3AoKSBhcyBSZXF1ZXN0Q2FsbGJhY2s7XG4gIH1cblxuICAvLyBjcmVhdGUgYSBSZXF1ZXN0T3B0aW9ucyBvYmplY3Qgb2Ygd2hhdGV2ZXIncyBhdCBpbmRleCAwXG4gIGlmICh0eXBlb2YgcmVxdWVzdEFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgcmVxdWVzdE9wdGlvbnMgPSB1cmxUb09wdGlvbnMobmV3IFVSTChyZXF1ZXN0QXJnc1swXSkpO1xuICB9IGVsc2UgaWYgKHJlcXVlc3RBcmdzWzBdIGluc3RhbmNlb2YgVVJMKSB7XG4gICAgcmVxdWVzdE9wdGlvbnMgPSB1cmxUb09wdGlvbnMocmVxdWVzdEFyZ3NbMF0pO1xuICB9IGVsc2Uge1xuICAgIHJlcXVlc3RPcHRpb25zID0gcmVxdWVzdEFyZ3NbMF07XG4gIH1cblxuICAvLyBpZiB0aGUgb3B0aW9ucyB3ZXJlIGdpdmVuIHNlcGFyYXRlbHkgZnJvbSB0aGUgVVJMLCBmb2xkIHRoZW0gaW5cbiAgaWYgKHJlcXVlc3RBcmdzLmxlbmd0aCA9PT0gMikge1xuICAgIHJlcXVlc3RPcHRpb25zID0geyAuLi5yZXF1ZXN0T3B0aW9ucywgLi4ucmVxdWVzdEFyZ3NbMV0gfTtcbiAgfVxuXG4gIC8vIEZpZ3VyZSBvdXQgdGhlIHByb3RvY29sIGlmIGl0J3MgY3VycmVudGx5IG1pc3NpbmdcbiAgaWYgKHJlcXVlc3RPcHRpb25zLnByb3RvY29sID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBXb3JzdCBjYXNlIHdlIGVuZCB1cCBwb3B1bGF0aW5nIHByb3RvY29sIHdpdGggdW5kZWZpbmVkLCB3aGljaCBpdCBhbHJlYWR5IGlzXG4gICAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbiAgICAvLyBOT1RFOiBQcmlvciB0byBOb2RlIDksIGBodHRwc2AgdXNlZCBpbnRlcm5hbHMgb2YgYGh0dHBgIG1vZHVsZSwgdGh1cyB3ZSBkb24ndCBwYXRjaCBpdC5cbiAgICAvLyBCZWNhdXNlIG9mIHRoYXQsIHdlIGNhbm5vdCByZWx5IG9uIGBodHRwTW9kdWxlYCB0byBwcm92aWRlIHVzIHdpdGggdmFsaWQgcHJvdG9jb2wsXG4gICAgLy8gYXMgaXQgd2lsbCBhbHdheXMgcmV0dXJuIGBodHRwYCwgZXZlbiB3aGVuIHVzaW5nIGBodHRwc2AgbW9kdWxlLlxuICAgIC8vXG4gICAgLy8gU2VlIHRlc3QvaW50ZWdyYXRpb25zL2h0dHAudGVzdC50cyBmb3IgbW9yZSBkZXRhaWxzIG9uIE5vZGUgPD12OCBwcm90b2NvbCBpc3N1ZS5cbiAgICBpZiAoTk9ERV9WRVJTSU9OLm1ham9yICYmIE5PREVfVkVSU0lPTi5tYWpvciA+IDgpIHtcbiAgICAgIHJlcXVlc3RPcHRpb25zLnByb3RvY29sID1cbiAgICAgICAgKGh0dHBNb2R1bGU/Lmdsb2JhbEFnZW50IGFzIGFueSk/LnByb3RvY29sIHx8XG4gICAgICAgIChyZXF1ZXN0T3B0aW9ucy5hZ2VudCBhcyBhbnkpPy5wcm90b2NvbCB8fFxuICAgICAgICAocmVxdWVzdE9wdGlvbnMuX2RlZmF1bHRBZ2VudCBhcyBhbnkpPy5wcm90b2NvbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxdWVzdE9wdGlvbnMucHJvdG9jb2wgPVxuICAgICAgICAocmVxdWVzdE9wdGlvbnMuYWdlbnQgYXMgYW55KT8ucHJvdG9jb2wgfHxcbiAgICAgICAgKHJlcXVlc3RPcHRpb25zLl9kZWZhdWx0QWdlbnQgYXMgYW55KT8ucHJvdG9jb2wgfHxcbiAgICAgICAgKGh0dHBNb2R1bGU/Lmdsb2JhbEFnZW50IGFzIGFueSk/LnByb3RvY29sO1xuICAgIH1cbiAgICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuICB9XG5cbiAgLy8gcmV0dXJuIGFyZ3MgaW4gc3RhbmRhcmRpemVkIGZvcm1cbiAgaWYgKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIFtyZXF1ZXN0T3B0aW9ucywgY2FsbGJhY2tdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBbcmVxdWVzdE9wdGlvbnNdO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgZ2V0Q3VycmVudEh1YiB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBJbnRlZ3JhdGlvbiwgU3BhbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgZmlsbCwgbG9nZ2VyLCBwYXJzZVNlbXZlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0ICogYXMgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCAqIGFzIGh0dHBzIGZyb20gJ2h0dHBzJztcblxuaW1wb3J0IHtcbiAgY2xlYW5TcGFuRGVzY3JpcHRpb24sXG4gIGV4dHJhY3RVcmwsXG4gIGlzU2VudHJ5UmVxdWVzdCxcbiAgbm9ybWFsaXplUmVxdWVzdEFyZ3MsXG4gIFJlcXVlc3RNZXRob2QsXG4gIFJlcXVlc3RNZXRob2RBcmdzLFxufSBmcm9tICcuL3V0aWxzL2h0dHAnO1xuXG5jb25zdCBOT0RFX1ZFUlNJT04gPSBwYXJzZVNlbXZlcihwcm9jZXNzLnZlcnNpb25zLm5vZGUpO1xuXG4vKiogaHR0cCBtb2R1bGUgaW50ZWdyYXRpb24gKi9cbmV4cG9ydCBjbGFzcyBIdHRwIGltcGxlbWVudHMgSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWQ6IHN0cmluZyA9ICdIdHRwJztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBIdHRwLmlkO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfYnJlYWRjcnVtYnM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF90cmFjaW5nOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHsgYnJlYWRjcnVtYnM/OiBib29sZWFuOyB0cmFjaW5nPzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICB0aGlzLl9icmVhZGNydW1icyA9IHR5cGVvZiBvcHRpb25zLmJyZWFkY3J1bWJzID09PSAndW5kZWZpbmVkJyA/IHRydWUgOiBvcHRpb25zLmJyZWFkY3J1bWJzO1xuICAgIHRoaXMuX3RyYWNpbmcgPSB0eXBlb2Ygb3B0aW9ucy50cmFjaW5nID09PSAndW5kZWZpbmVkJyA/IGZhbHNlIDogb3B0aW9ucy50cmFjaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0dXBPbmNlKCk6IHZvaWQge1xuICAgIC8vIE5vIG5lZWQgdG8gaW5zdHJ1bWVudCBpZiB3ZSBkb24ndCB3YW50IHRvIHRyYWNrIGFueXRoaW5nXG4gICAgaWYgKCF0aGlzLl9icmVhZGNydW1icyAmJiAhdGhpcy5fdHJhY2luZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdyYXBwZWRIYW5kbGVyTWFrZXIgPSBfY3JlYXRlV3JhcHBlZFJlcXVlc3RNZXRob2RGYWN0b3J5KHRoaXMuX2JyZWFkY3J1bWJzLCB0aGlzLl90cmFjaW5nKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG4gICAgY29uc3QgaHR0cE1vZHVsZSA9IHJlcXVpcmUoJ2h0dHAnKTtcbiAgICBmaWxsKGh0dHBNb2R1bGUsICdnZXQnLCB3cmFwcGVkSGFuZGxlck1ha2VyKTtcbiAgICBmaWxsKGh0dHBNb2R1bGUsICdyZXF1ZXN0Jywgd3JhcHBlZEhhbmRsZXJNYWtlcik7XG5cbiAgICAvLyBOT1RFOiBQcmlvciB0byBOb2RlIDksIGBodHRwc2AgdXNlZCBpbnRlcm5hbHMgb2YgYGh0dHBgIG1vZHVsZSwgdGh1cyB3ZSBkb24ndCBwYXRjaCBpdC5cbiAgICAvLyBJZiB3ZSBkbywgd2UnZCBnZXQgZG91YmxlIGJyZWFkY3J1bWJzIGFuZCBkb3VibGUgc3BhbnMgZm9yIGBodHRwc2AgY2FsbHMuXG4gICAgLy8gSXQgaGFzIGJlZW4gY2hhbmdlZCBpbiBOb2RlIDksIHNvIGZvciBhbGwgdmVyc2lvbnMgZXF1YWwgYW5kIGFib3ZlLCB3ZSBwYXRjaCBgaHR0cHNgIHNlcGFyYXRlbHkuXG4gICAgaWYgKE5PREVfVkVSU0lPTi5tYWpvciAmJiBOT0RFX1ZFUlNJT04ubWFqb3IgPiA4KSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuICAgICAgY29uc3QgaHR0cHNNb2R1bGUgPSByZXF1aXJlKCdodHRwcycpO1xuICAgICAgZmlsbChodHRwc01vZHVsZSwgJ2dldCcsIHdyYXBwZWRIYW5kbGVyTWFrZXIpO1xuICAgICAgZmlsbChodHRwc01vZHVsZSwgJ3JlcXVlc3QnLCB3cmFwcGVkSGFuZGxlck1ha2VyKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gZm9yIGVhc2Ugb2YgcmVhZGluZyBiZWxvd1xudHlwZSBPcmlnaW5hbFJlcXVlc3RNZXRob2QgPSBSZXF1ZXN0TWV0aG9kO1xudHlwZSBXcmFwcGVkUmVxdWVzdE1ldGhvZCA9IFJlcXVlc3RNZXRob2Q7XG50eXBlIFdyYXBwZWRSZXF1ZXN0TWV0aG9kRmFjdG9yeSA9IChvcmlnaW5hbDogT3JpZ2luYWxSZXF1ZXN0TWV0aG9kKSA9PiBXcmFwcGVkUmVxdWVzdE1ldGhvZDtcblxuLyoqXG4gKiBGdW5jdGlvbiB3aGljaCBjcmVhdGVzIGEgZnVuY3Rpb24gd2hpY2ggY3JlYXRlcyB3cmFwcGVkIHZlcnNpb25zIG9mIGludGVybmFsIGByZXF1ZXN0YCBhbmQgYGdldGAgY2FsbHMgd2l0aGluIGBodHRwYFxuICogYW5kIGBodHRwc2AgbW9kdWxlcy4gKE5COiBOb3QgYSB0eXBvIC0gdGhpcyBpcyBhIGNyZWF0b3JeMiEpXG4gKlxuICogQHBhcmFtIGJyZWFkY3J1bWJzRW5hYmxlZCBXaGV0aGVyIG9yIG5vdCB0byByZWNvcmQgb3V0Z29pbmcgcmVxdWVzdHMgYXMgYnJlYWRjcnVtYnNcbiAqIEBwYXJhbSB0cmFjaW5nRW5hYmxlZCBXaGV0aGVyIG9yIG5vdCB0byByZWNvcmQgb3V0Z29pbmcgcmVxdWVzdHMgYXMgdHJhY2luZyBzcGFuc1xuICpcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gd2hpY2ggYWNjZXB0cyB0aGUgZXhpdGluZyBoYW5kbGVyIGFuZCByZXR1cm5zIGEgd3JhcHBlZCBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIF9jcmVhdGVXcmFwcGVkUmVxdWVzdE1ldGhvZEZhY3RvcnkoXG4gIGJyZWFkY3J1bWJzRW5hYmxlZDogYm9vbGVhbixcbiAgdHJhY2luZ0VuYWJsZWQ6IGJvb2xlYW4sXG4pOiBXcmFwcGVkUmVxdWVzdE1ldGhvZEZhY3Rvcnkge1xuICByZXR1cm4gZnVuY3Rpb24gd3JhcHBlZFJlcXVlc3RNZXRob2RGYWN0b3J5KG9yaWdpbmFsUmVxdWVzdE1ldGhvZDogT3JpZ2luYWxSZXF1ZXN0TWV0aG9kKTogV3JhcHBlZFJlcXVlc3RNZXRob2Qge1xuICAgIHJldHVybiBmdW5jdGlvbiB3cmFwcGVkTWV0aG9kKHRoaXM6IHR5cGVvZiBodHRwIHwgdHlwZW9mIGh0dHBzLCAuLi5hcmdzOiBSZXF1ZXN0TWV0aG9kQXJncyk6IGh0dHAuQ2xpZW50UmVxdWVzdCB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgIGNvbnN0IGh0dHBNb2R1bGUgPSB0aGlzO1xuXG4gICAgICBjb25zdCByZXF1ZXN0QXJncyA9IG5vcm1hbGl6ZVJlcXVlc3RBcmdzKHRoaXMsIGFyZ3MpO1xuICAgICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSByZXF1ZXN0QXJnc1swXTtcbiAgICAgIGNvbnN0IHJlcXVlc3RVcmwgPSBleHRyYWN0VXJsKHJlcXVlc3RPcHRpb25zKTtcblxuICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0byByZWNvcmQgcmVxdWVzdHMgdG8gU2VudHJ5IGFzIGVpdGhlciBicmVhZGNydW1icyBvciBzcGFucywgc28ganVzdCB1c2UgdGhlIG9yaWdpbmFsIG1ldGhvZFxuICAgICAgaWYgKGlzU2VudHJ5UmVxdWVzdChyZXF1ZXN0VXJsKSkge1xuICAgICAgICByZXR1cm4gb3JpZ2luYWxSZXF1ZXN0TWV0aG9kLmFwcGx5KGh0dHBNb2R1bGUsIHJlcXVlc3RBcmdzKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHNwYW46IFNwYW4gfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgcGFyZW50U3BhbjogU3BhbiB8IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3Qgc2NvcGUgPSBnZXRDdXJyZW50SHViKCkuZ2V0U2NvcGUoKTtcbiAgICAgIGlmIChzY29wZSAmJiB0cmFjaW5nRW5hYmxlZCkge1xuICAgICAgICBwYXJlbnRTcGFuID0gc2NvcGUuZ2V0U3BhbigpO1xuICAgICAgICBpZiAocGFyZW50U3Bhbikge1xuICAgICAgICAgIHNwYW4gPSBwYXJlbnRTcGFuLnN0YXJ0Q2hpbGQoe1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IGAke3JlcXVlc3RPcHRpb25zLm1ldGhvZCB8fCAnR0VUJ30gJHtyZXF1ZXN0VXJsfWAsXG4gICAgICAgICAgICBvcDogJ2h0dHAuY2xpZW50JyxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IHNlbnRyeVRyYWNlSGVhZGVyID0gc3Bhbi50b1RyYWNlcGFyZW50KCk7XG4gICAgICAgICAgbG9nZ2VyLmxvZyhcbiAgICAgICAgICAgIGBbVHJhY2luZ10gQWRkaW5nIHNlbnRyeS10cmFjZSBoZWFkZXIgJHtzZW50cnlUcmFjZUhlYWRlcn0gdG8gb3V0Z29pbmcgcmVxdWVzdCB0byAke3JlcXVlc3RVcmx9OiBgLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsgLi4ucmVxdWVzdE9wdGlvbnMuaGVhZGVycywgJ3NlbnRyeS10cmFjZSc6IHNlbnRyeVRyYWNlSGVhZGVyIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgcmV0dXJuIG9yaWdpbmFsUmVxdWVzdE1ldGhvZFxuICAgICAgICAuYXBwbHkoaHR0cE1vZHVsZSwgcmVxdWVzdEFyZ3MpXG4gICAgICAgIC5vbmNlKCdyZXNwb25zZScsIGZ1bmN0aW9uKHRoaXM6IGh0dHAuQ2xpZW50UmVxdWVzdCwgcmVzOiBodHRwLkluY29taW5nTWVzc2FnZSk6IHZvaWQge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgICAgIGNvbnN0IHJlcSA9IHRoaXM7XG4gICAgICAgICAgaWYgKGJyZWFkY3J1bWJzRW5hYmxlZCkge1xuICAgICAgICAgICAgYWRkUmVxdWVzdEJyZWFkY3J1bWIoJ3Jlc3BvbnNlJywgcmVxdWVzdFVybCwgcmVxLCByZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJhY2luZ0VuYWJsZWQgJiYgc3Bhbikge1xuICAgICAgICAgICAgaWYgKHJlcy5zdGF0dXNDb2RlKSB7XG4gICAgICAgICAgICAgIHNwYW4uc2V0SHR0cFN0YXR1cyhyZXMuc3RhdHVzQ29kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzcGFuLmRlc2NyaXB0aW9uID0gY2xlYW5TcGFuRGVzY3JpcHRpb24oc3Bhbi5kZXNjcmlwdGlvbiwgcmVxdWVzdE9wdGlvbnMsIHJlcSk7XG4gICAgICAgICAgICBzcGFuLmZpbmlzaCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLm9uY2UoJ2Vycm9yJywgZnVuY3Rpb24odGhpczogaHR0cC5DbGllbnRSZXF1ZXN0KTogdm9pZCB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICAgICAgY29uc3QgcmVxID0gdGhpcztcblxuICAgICAgICAgIGlmIChicmVhZGNydW1ic0VuYWJsZWQpIHtcbiAgICAgICAgICAgIGFkZFJlcXVlc3RCcmVhZGNydW1iKCdlcnJvcicsIHJlcXVlc3RVcmwsIHJlcSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmFjaW5nRW5hYmxlZCAmJiBzcGFuKSB7XG4gICAgICAgICAgICBzcGFuLnNldEh0dHBTdGF0dXMoNTAwKTtcbiAgICAgICAgICAgIHNwYW4uZGVzY3JpcHRpb24gPSBjbGVhblNwYW5EZXNjcmlwdGlvbihzcGFuLmRlc2NyaXB0aW9uLCByZXF1ZXN0T3B0aW9ucywgcmVxKTtcbiAgICAgICAgICAgIHNwYW4uZmluaXNoKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICB9O1xufVxuXG4vKipcbiAqIENhcHR1cmVzIEJyZWFkY3J1bWIgYmFzZWQgb24gcHJvdmlkZWQgcmVxdWVzdC9yZXNwb25zZSBwYWlyXG4gKi9cbmZ1bmN0aW9uIGFkZFJlcXVlc3RCcmVhZGNydW1iKGV2ZW50OiBzdHJpbmcsIHVybDogc3RyaW5nLCByZXE6IGh0dHAuQ2xpZW50UmVxdWVzdCwgcmVzPzogaHR0cC5JbmNvbWluZ01lc3NhZ2UpOiB2b2lkIHtcbiAgaWYgKCFnZXRDdXJyZW50SHViKCkuZ2V0SW50ZWdyYXRpb24oSHR0cCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBnZXRDdXJyZW50SHViKCkuYWRkQnJlYWRjcnVtYihcbiAgICB7XG4gICAgICBjYXRlZ29yeTogJ2h0dHAnLFxuICAgICAgZGF0YToge1xuICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgIHN0YXR1c19jb2RlOiByZXMgJiYgcmVzLnN0YXR1c0NvZGUsXG4gICAgICAgIHVybCxcbiAgICAgIH0sXG4gICAgICB0eXBlOiAnaHR0cCcsXG4gICAgfSxcbiAgICB7XG4gICAgICBldmVudCxcbiAgICAgIHJlcXVlc3Q6IHJlcSxcbiAgICAgIHJlc3BvbnNlOiByZXMsXG4gICAgfSxcbiAgKTtcbn1cbiIsICJpbXBvcnQgeyBnZXRDdXJyZW50SHViIH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7IGZvcmdldCwgbG9nZ2VyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmltcG9ydCB7IE5vZGVDbGllbnQgfSBmcm9tICcuLi8uLi9jbGllbnQnO1xuXG5jb25zdCBERUZBVUxUX1NIVVRET1dOX1RJTUVPVVQgPSAyMDAwO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZ0FuZEV4aXRQcm9jZXNzKGVycm9yOiBFcnJvcik6IHZvaWQge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICBjb25zb2xlLmVycm9yKGVycm9yICYmIGVycm9yLnN0YWNrID8gZXJyb3Iuc3RhY2sgOiBlcnJvcik7XG5cbiAgY29uc3QgY2xpZW50ID0gZ2V0Q3VycmVudEh1YigpLmdldENsaWVudDxOb2RlQ2xpZW50PigpO1xuXG4gIGlmIChjbGllbnQgPT09IHVuZGVmaW5lZCkge1xuICAgIGxvZ2dlci53YXJuKCdObyBOb2RlQ2xpZW50IHdhcyBkZWZpbmVkLCB3ZSBhcmUgZXhpdGluZyB0aGUgcHJvY2VzcyBub3cuJyk7XG4gICAgZ2xvYmFsLnByb2Nlc3MuZXhpdCgxKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvcHRpb25zID0gY2xpZW50LmdldE9wdGlvbnMoKTtcbiAgY29uc3QgdGltZW91dCA9XG4gICAgKG9wdGlvbnMgJiYgb3B0aW9ucy5zaHV0ZG93blRpbWVvdXQgJiYgb3B0aW9ucy5zaHV0ZG93blRpbWVvdXQgPiAwICYmIG9wdGlvbnMuc2h1dGRvd25UaW1lb3V0KSB8fFxuICAgIERFRkFVTFRfU0hVVERPV05fVElNRU9VVDtcbiAgZm9yZ2V0KFxuICAgIGNsaWVudC5jbG9zZSh0aW1lb3V0KS50aGVuKChyZXN1bHQ6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdXZSByZWFjaGVkIHRoZSB0aW1lb3V0IGZvciBlbXB0eWluZyB0aGUgcmVxdWVzdCBidWZmZXIsIHN0aWxsIGV4aXRpbmcgbm93IScpO1xuICAgICAgfVxuICAgICAgZ2xvYmFsLnByb2Nlc3MuZXhpdCgxKTtcbiAgICB9KSxcbiAgKTtcbn1cbiIsICJpbXBvcnQgeyBnZXRDdXJyZW50SHViLCBTY29wZSB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBJbnRlZ3JhdGlvbiwgU2V2ZXJpdHkgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG5pbXBvcnQgeyBOb2RlQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcbmltcG9ydCB7IGxvZ0FuZEV4aXRQcm9jZXNzIH0gZnJvbSAnLi91dGlscy9lcnJvcmhhbmRsaW5nJztcblxudHlwZSBPbkZhdGFsRXJyb3JIYW5kbGVyID0gKGZpcnN0RXJyb3I6IEVycm9yLCBzZWNvbmRFcnJvcj86IEVycm9yKSA9PiB2b2lkO1xuXG4vKiogR2xvYmFsIFByb21pc2UgUmVqZWN0aW9uIGhhbmRsZXIgKi9cbmV4cG9ydCBjbGFzcyBPblVuY2F1Z2h0RXhjZXB0aW9uIGltcGxlbWVudHMgSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWQ6IHN0cmluZyA9ICdPblVuY2F1Z2h0RXhjZXB0aW9uJztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBPblVuY2F1Z2h0RXhjZXB0aW9uLmlkO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGhhbmRsZXI6IChlcnJvcjogRXJyb3IpID0+IHZvaWQgPSB0aGlzLl9tYWtlRXJyb3JIYW5kbGVyKCk7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uczoge1xuICAgICAgLyoqXG4gICAgICAgKiBEZWZhdWx0IG9uRmF0YWxFcnJvciBoYW5kbGVyXG4gICAgICAgKiBAcGFyYW0gZmlyc3RFcnJvciBFcnJvciB0aGF0IGhhcyBiZWVuIHRocm93blxuICAgICAgICogQHBhcmFtIHNlY29uZEVycm9yIElmIHRoaXMgd2FzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB0aGlzIHdpbGwgYmUgc2V0XG4gICAgICAgKi9cbiAgICAgIG9uRmF0YWxFcnJvcj8oZmlyc3RFcnJvcjogRXJyb3IsIHNlY29uZEVycm9yPzogRXJyb3IpOiB2b2lkO1xuICAgIH0gPSB7fSxcbiAgKSB7fVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXR1cE9uY2UoKTogdm9pZCB7XG4gICAgZ2xvYmFsLnByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgdGhpcy5oYW5kbGVyLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBoaWRkZW5cbiAgICovXG4gIHByaXZhdGUgX21ha2VFcnJvckhhbmRsZXIoKTogKGVycm9yOiBFcnJvcikgPT4gdm9pZCB7XG4gICAgY29uc3QgdGltZW91dCA9IDIwMDA7XG4gICAgbGV0IGNhdWdodEZpcnN0RXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBsZXQgY2F1Z2h0U2Vjb25kRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBsZXQgY2FsbGVkRmF0YWxFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGxldCBmaXJzdEVycm9yOiBFcnJvcjtcblxuICAgIHJldHVybiAoZXJyb3I6IEVycm9yKTogdm9pZCA9PiB7XG4gICAgICBsZXQgb25GYXRhbEVycm9yOiBPbkZhdGFsRXJyb3JIYW5kbGVyID0gbG9nQW5kRXhpdFByb2Nlc3M7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRDdXJyZW50SHViKCkuZ2V0Q2xpZW50PE5vZGVDbGllbnQ+KCk7XG5cbiAgICAgIGlmICh0aGlzLl9vcHRpb25zLm9uRmF0YWxFcnJvcikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXG4gICAgICAgIG9uRmF0YWxFcnJvciA9IHRoaXMuX29wdGlvbnMub25GYXRhbEVycm9yO1xuICAgICAgfSBlbHNlIGlmIChjbGllbnQgJiYgY2xpZW50LmdldE9wdGlvbnMoKS5vbkZhdGFsRXJyb3IpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuICAgICAgICBvbkZhdGFsRXJyb3IgPSBjbGllbnQuZ2V0T3B0aW9ucygpLm9uRmF0YWxFcnJvciBhcyBPbkZhdGFsRXJyb3JIYW5kbGVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWNhdWdodEZpcnN0RXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHViID0gZ2V0Q3VycmVudEh1YigpO1xuXG4gICAgICAgIC8vIHRoaXMgaXMgdGhlIGZpcnN0IHVuY2F1Z2h0IGVycm9yIGFuZCB0aGUgdWx0aW1hdGUgcmVhc29uIGZvciBzaHV0dGluZyBkb3duXG4gICAgICAgIC8vIHdlIHdhbnQgdG8gZG8gYWJzb2x1dGVseSBldmVyeXRoaW5nIHBvc3NpYmxlIHRvIGVuc3VyZSBpdCBnZXRzIGNhcHR1cmVkXG4gICAgICAgIC8vIGFsc28gd2Ugd2FudCB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgZ28gcmVjdXJzaW9uIGNyYXp5IGlmIG1vcmUgZXJyb3JzIGhhcHBlbiBhZnRlciB0aGlzIG9uZVxuICAgICAgICBmaXJzdEVycm9yID0gZXJyb3I7XG4gICAgICAgIGNhdWdodEZpcnN0RXJyb3IgPSB0cnVlO1xuXG4gICAgICAgIGlmIChodWIuZ2V0SW50ZWdyYXRpb24oT25VbmNhdWdodEV4Y2VwdGlvbikpIHtcbiAgICAgICAgICBodWIud2l0aFNjb3BlKChzY29wZTogU2NvcGUpID0+IHtcbiAgICAgICAgICAgIHNjb3BlLnNldExldmVsKFNldmVyaXR5LkZhdGFsKTtcbiAgICAgICAgICAgIGh1Yi5jYXB0dXJlRXhjZXB0aW9uKGVycm9yLCB7XG4gICAgICAgICAgICAgIG9yaWdpbmFsRXhjZXB0aW9uOiBlcnJvcixcbiAgICAgICAgICAgICAgZGF0YTogeyBtZWNoYW5pc206IHsgaGFuZGxlZDogZmFsc2UsIHR5cGU6ICdvbnVuY2F1Z2h0ZXhjZXB0aW9uJyB9IH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghY2FsbGVkRmF0YWxFcnJvcikge1xuICAgICAgICAgICAgICBjYWxsZWRGYXRhbEVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgb25GYXRhbEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIWNhbGxlZEZhdGFsRXJyb3IpIHtcbiAgICAgICAgICAgIGNhbGxlZEZhdGFsRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgb25GYXRhbEVycm9yKGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2FsbGVkRmF0YWxFcnJvcikge1xuICAgICAgICAvLyB3ZSBoaXQgYW4gZXJyb3IgKmFmdGVyKiBjYWxsaW5nIG9uRmF0YWxFcnJvciAtIHByZXR0eSBib25lZCBhdCB0aGlzIHBvaW50LCBqdXN0IHNodXQgaXQgZG93blxuICAgICAgICBsb2dnZXIud2FybigndW5jYXVnaHQgZXhjZXB0aW9uIGFmdGVyIGNhbGxpbmcgZmF0YWwgZXJyb3Igc2h1dGRvd24gY2FsbGJhY2sgLSB0aGlzIGlzIGJhZCEgZm9yY2luZyBzaHV0ZG93bicpO1xuICAgICAgICBsb2dBbmRFeGl0UHJvY2VzcyhlcnJvcik7XG4gICAgICB9IGVsc2UgaWYgKCFjYXVnaHRTZWNvbmRFcnJvcikge1xuICAgICAgICAvLyB0d28gY2FzZXMgZm9yIGhvdyB3ZSBjYW4gaGl0IHRoaXMgYnJhbmNoOlxuICAgICAgICAvLyAgIC0gY2FwdHVyaW5nIG9mIGZpcnN0IGVycm9yIGJsZXcgdXAgYW5kIHdlIGp1c3QgY2F1Z2h0IHRoZSBleGNlcHRpb24gZnJvbSB0aGF0XG4gICAgICAgIC8vICAgICAtIHF1aXQgdHJ5aW5nIHRvIGNhcHR1cmUsIHByb2NlZWQgd2l0aCBzaHV0ZG93blxuICAgICAgICAvLyAgIC0gYSBzZWNvbmQgaW5kZXBlbmRlbnQgZXJyb3IgaGFwcGVuZWQgd2hpbGUgd2FpdGluZyBmb3IgZmlyc3QgZXJyb3IgdG8gY2FwdHVyZVxuICAgICAgICAvLyAgICAgLSB3YW50IHRvIGF2b2lkIGNhdXNpbmcgcHJlbWF0dXJlIHNodXRkb3duIGJlZm9yZSBmaXJzdCBlcnJvciBjYXB0dXJlIGZpbmlzaGVzXG4gICAgICAgIC8vIGl0J3MgaGFyZCB0byBpbW1lZGlhdGVseSB0ZWxsIGNhc2UgMSBmcm9tIGNhc2UgMiB3aXRob3V0IGRvaW5nIHNvbWUgZmFuY3kvcXVlc3Rpb25hYmxlIGRvbWFpbiBzdHVmZlxuICAgICAgICAvLyBzbyBsZXQncyBpbnN0ZWFkIGp1c3QgZGVsYXkgYSBiaXQgYmVmb3JlIHdlIHByb2NlZWQgd2l0aCBvdXIgYWN0aW9uIGhlcmVcbiAgICAgICAgLy8gaW4gY2FzZSAxLCB3ZSBqdXN0IHdhaXQgYSBiaXQgdW5uZWNlc3NhcmlseSBidXQgdWx0aW1hdGVseSBkbyB0aGUgc2FtZSB0aGluZ1xuICAgICAgICAvLyBpbiBjYXNlIDIsIHRoZSBkZWxheSBob3BlZnVsbHkgbWFkZSB1cyB3YWl0IGxvbmcgZW5vdWdoIGZvciB0aGUgY2FwdHVyZSB0byBmaW5pc2hcbiAgICAgICAgLy8gdHdvIHBvdGVudGlhbCBub25pZGVhbCBvdXRjb21lczpcbiAgICAgICAgLy8gICBub25pZGVhbCBjYXNlIDE6IGNhcHR1cmluZyBmYWlscyBmYXN0LCB3ZSBzaXQgYXJvdW5kIGZvciBhIGZldyBzZWNvbmRzIHVubmVjZXNzYXJpbHkgYmVmb3JlIHByb2NlZWRpbmcgY29ycmVjdGx5IGJ5IGNhbGxpbmcgb25GYXRhbEVycm9yXG4gICAgICAgIC8vICAgbm9uaWRlYWwgY2FzZSAyOiBjYXNlIDIgaGFwcGVucywgMXN0IGVycm9yIGlzIGNhcHR1cmVkIGJ1dCBzbG93bHksIHRpbWVvdXQgY29tcGxldGVzIGJlZm9yZSBjYXB0dXJlIGFuZCB3ZSB0cmVhdCBzZWNvbmQgZXJyb3IgYXMgdGhlIHNlbmRFcnIgb2YgKG5vbmV4aXN0ZW50KSBmYWlsdXJlIGZyb20gdHJ5aW5nIHRvIGNhcHR1cmUgZmlyc3QgZXJyb3JcbiAgICAgICAgLy8gbm90ZSB0aGF0IGFmdGVyIGhpdHRpbmcgdGhpcyBicmFuY2gsIHdlIG1pZ2h0IGNhdGNoIG1vcmUgZXJyb3JzIHdoZXJlIChjYXVnaHRTZWNvbmRFcnJvciAmJiAhY2FsbGVkRmF0YWxFcnJvcilcbiAgICAgICAgLy8gICB3ZSBpZ25vcmUgdGhlbSAtIHRoZXkgZG9uJ3QgbWF0dGVyIHRvIHVzLCB3ZSdyZSBqdXN0IHdhaXRpbmcgZm9yIHRoZSBzZWNvbmQgZXJyb3IgdGltZW91dCB0byBmaW5pc2hcbiAgICAgICAgY2F1Z2h0U2Vjb25kRXJyb3IgPSB0cnVlO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAoIWNhbGxlZEZhdGFsRXJyb3IpIHtcbiAgICAgICAgICAgIC8vIGl0IHdhcyBwcm9iYWJseSBjYXNlIDEsIGxldCdzIHRyZWF0IGVyciBhcyB0aGUgc2VuZEVyciBhbmQgY2FsbCBvbkZhdGFsRXJyb3JcbiAgICAgICAgICAgIGNhbGxlZEZhdGFsRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgb25GYXRhbEVycm9yKGZpcnN0RXJyb3IsIGVycm9yKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaXQgd2FzIHByb2JhYmx5IGNhc2UgMiwgb3VyIGZpcnN0IGVycm9yIGZpbmlzaGVkIGNhcHR1cmluZyB3aGlsZSB3ZSB3YWl0ZWQsIGNvb2wsIGRvIG5vdGhpbmdcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHRpbWVvdXQpOyAvLyBjYXB0dXJpbmcgY291bGQgdGFrZSBhdCBsZWFzdCBzZW5kVGltZW91dCB0byBmYWlsLCBwbHVzIGFuIGFyYml0cmFyeSBzZWNvbmQgZm9yIGhvdyBsb25nIGl0IHRha2VzIHRvIGNvbGxlY3Qgc3Vycm91bmRpbmcgc291cmNlIGV0Y1xuICAgICAgfVxuICAgIH07XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBnZXRDdXJyZW50SHViLCBTY29wZSB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBJbnRlZ3JhdGlvbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgY29uc29sZVNhbmRib3ggfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW1wb3J0IHsgbG9nQW5kRXhpdFByb2Nlc3MgfSBmcm9tICcuL3V0aWxzL2Vycm9yaGFuZGxpbmcnO1xuXG50eXBlIFVuaGFuZGxlZFJlamVjdGlvbk1vZGUgPSAnbm9uZScgfCAnd2FybicgfCAnc3RyaWN0JztcblxuLyoqIEdsb2JhbCBQcm9taXNlIFJlamVjdGlvbiBoYW5kbGVyICovXG5leHBvcnQgY2xhc3MgT25VbmhhbmRsZWRSZWplY3Rpb24gaW1wbGVtZW50cyBJbnRlZ3JhdGlvbiB7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpZDogc3RyaW5nID0gJ09uVW5oYW5kbGVkUmVqZWN0aW9uJztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBPblVuaGFuZGxlZFJlamVjdGlvbi5pZDtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zOiB7XG4gICAgICAvKipcbiAgICAgICAqIE9wdGlvbiBkZWNpZGluZyB3aGF0IHRvIGRvIGFmdGVyIGNhcHR1cmluZyB1bmhhbmRsZWRSZWplY3Rpb24sXG4gICAgICAgKiB0aGF0IG1pbWlja3MgYmVoYXZpb3Igb2Ygbm9kZSdzIC0tdW5oYW5kbGVkLXJlamVjdGlvbiBmbGFnLlxuICAgICAgICovXG4gICAgICBtb2RlOiBVbmhhbmRsZWRSZWplY3Rpb25Nb2RlO1xuICAgIH0gPSB7IG1vZGU6ICd3YXJuJyB9LFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0dXBPbmNlKCk6IHZvaWQge1xuICAgIGdsb2JhbC5wcm9jZXNzLm9uKCd1bmhhbmRsZWRSZWplY3Rpb24nLCB0aGlzLnNlbmRVbmhhbmRsZWRQcm9taXNlLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYW4gZXhjZXB0aW9uIHdpdGggcmVhc29uXG4gICAqIEBwYXJhbSByZWFzb24gc3RyaW5nXG4gICAqIEBwYXJhbSBwcm9taXNlIHByb21pc2VcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHB1YmxpYyBzZW5kVW5oYW5kbGVkUHJvbWlzZShyZWFzb246IGFueSwgcHJvbWlzZTogYW55KTogdm9pZCB7XG4gICAgY29uc3QgaHViID0gZ2V0Q3VycmVudEh1YigpO1xuXG4gICAgaWYgKCFodWIuZ2V0SW50ZWdyYXRpb24oT25VbmhhbmRsZWRSZWplY3Rpb24pKSB7XG4gICAgICB0aGlzLl9oYW5kbGVSZWplY3Rpb24ocmVhc29uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgKi9cbiAgICBjb25zdCBjb250ZXh0ID0gKHByb21pc2UuZG9tYWluICYmIHByb21pc2UuZG9tYWluLnNlbnRyeUNvbnRleHQpIHx8IHt9O1xuXG4gICAgaHViLndpdGhTY29wZSgoc2NvcGU6IFNjb3BlKSA9PiB7XG4gICAgICBzY29wZS5zZXRFeHRyYSgndW5oYW5kbGVkUHJvbWlzZVJlamVjdGlvbicsIHRydWUpO1xuXG4gICAgICAvLyBQcmVzZXJ2ZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIHJhdmVuLW5vZGUgZm9yIG5vd1xuICAgICAgaWYgKGNvbnRleHQudXNlcikge1xuICAgICAgICBzY29wZS5zZXRVc2VyKGNvbnRleHQudXNlcik7XG4gICAgICB9XG4gICAgICBpZiAoY29udGV4dC50YWdzKSB7XG4gICAgICAgIHNjb3BlLnNldFRhZ3MoY29udGV4dC50YWdzKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb250ZXh0LmV4dHJhKSB7XG4gICAgICAgIHNjb3BlLnNldEV4dHJhcyhjb250ZXh0LmV4dHJhKTtcbiAgICAgIH1cblxuICAgICAgaHViLmNhcHR1cmVFeGNlcHRpb24ocmVhc29uLCB7XG4gICAgICAgIG9yaWdpbmFsRXhjZXB0aW9uOiBwcm9taXNlLFxuICAgICAgICBkYXRhOiB7IG1lY2hhbmlzbTogeyBoYW5kbGVkOiBmYWxzZSwgdHlwZTogJ29udW5oYW5kbGVkcmVqZWN0aW9uJyB9IH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgKi9cblxuICAgIHRoaXMuX2hhbmRsZVJlamVjdGlvbihyZWFzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIGBtb2RlYCBvcHRpb25cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgX2hhbmRsZVJlamVjdGlvbihyZWFzb246IGFueSk6IHZvaWQge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iLzdjZjZmOWU5NjRhYTAwNzcyOTY1MzkxYzIzYWNkYTZkNzE5NzJhOWEvbGliL2ludGVybmFsL3Byb2Nlc3MvcHJvbWlzZXMuanMjTDIzNC1MMjQwXG4gICAgY29uc3QgcmVqZWN0aW9uV2FybmluZyA9XG4gICAgICAnVGhpcyBlcnJvciBvcmlnaW5hdGVkIGVpdGhlciBieSAnICtcbiAgICAgICd0aHJvd2luZyBpbnNpZGUgb2YgYW4gYXN5bmMgZnVuY3Rpb24gd2l0aG91dCBhIGNhdGNoIGJsb2NrLCAnICtcbiAgICAgICdvciBieSByZWplY3RpbmcgYSBwcm9taXNlIHdoaWNoIHdhcyBub3QgaGFuZGxlZCB3aXRoIC5jYXRjaCgpLicgK1xuICAgICAgJyBUaGUgcHJvbWlzZSByZWplY3RlZCB3aXRoIHRoZSByZWFzb246JztcblxuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbiAgICBpZiAodGhpcy5fb3B0aW9ucy5tb2RlID09PSAnd2FybicpIHtcbiAgICAgIGNvbnNvbGVTYW5kYm94KCgpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKHJlamVjdGlvbldhcm5pbmcpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgIGNvbnNvbGUuZXJyb3IocmVhc29uICYmIHJlYXNvbi5zdGFjayA/IHJlYXNvbi5zdGFjayA6IHJlYXNvbik7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX29wdGlvbnMubW9kZSA9PT0gJ3N0cmljdCcpIHtcbiAgICAgIGNvbnNvbGVTYW5kYm94KCgpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKHJlamVjdGlvbldhcm5pbmcpO1xuICAgICAgfSk7XG4gICAgICBsb2dBbmRFeGl0UHJvY2VzcyhyZWFzb24pO1xuICAgIH1cbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnNvbGUgKi9cbiAgfVxufVxuIiwgImltcG9ydCB7IGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yLCBnZXRDdXJyZW50SHViIH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7IEV2ZW50LCBFdmVudEhpbnQsIEV4Y2VwdGlvbiwgRXh0ZW5kZWRFcnJvciwgSW50ZWdyYXRpb24gfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGlzSW5zdGFuY2VPZiwgU3luY1Byb21pc2UgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW1wb3J0IHsgZ2V0RXhjZXB0aW9uRnJvbUVycm9yIH0gZnJvbSAnLi4vcGFyc2Vycyc7XG5cbmNvbnN0IERFRkFVTFRfS0VZID0gJ2NhdXNlJztcbmNvbnN0IERFRkFVTFRfTElNSVQgPSA1O1xuXG4vKiogQWRkcyBTREsgaW5mbyB0byBhbiBldmVudC4gKi9cbmV4cG9ydCBjbGFzcyBMaW5rZWRFcnJvcnMgaW1wbGVtZW50cyBJbnRlZ3JhdGlvbiB7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpZDogc3RyaW5nID0gJ0xpbmtlZEVycm9ycyc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nID0gTGlua2VkRXJyb3JzLmlkO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfa2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9saW1pdDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHsga2V5Pzogc3RyaW5nOyBsaW1pdD86IG51bWJlciB9ID0ge30pIHtcbiAgICB0aGlzLl9rZXkgPSBvcHRpb25zLmtleSB8fCBERUZBVUxUX0tFWTtcbiAgICB0aGlzLl9saW1pdCA9IG9wdGlvbnMubGltaXQgfHwgREVGQVVMVF9MSU1JVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldHVwT25jZSgpOiB2b2lkIHtcbiAgICBhZGRHbG9iYWxFdmVudFByb2Nlc3NvcigoZXZlbnQ6IEV2ZW50LCBoaW50PzogRXZlbnRIaW50KSA9PiB7XG4gICAgICBjb25zdCBzZWxmID0gZ2V0Q3VycmVudEh1YigpLmdldEludGVncmF0aW9uKExpbmtlZEVycm9ycyk7XG4gICAgICBpZiAoc2VsZikge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gc2VsZi5faGFuZGxlciAmJiBzZWxmLl9oYW5kbGVyLmJpbmQoc2VsZik7XG4gICAgICAgIHJldHVybiB0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJyA/IGhhbmRsZXIoZXZlbnQsIGhpbnQpIDogZXZlbnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZXIoZXZlbnQ6IEV2ZW50LCBoaW50PzogRXZlbnRIaW50KTogUHJvbWlzZUxpa2U8RXZlbnQ+IHtcbiAgICBpZiAoIWV2ZW50LmV4Y2VwdGlvbiB8fCAhZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyB8fCAhaGludCB8fCAhaXNJbnN0YW5jZU9mKGhpbnQub3JpZ2luYWxFeGNlcHRpb24sIEVycm9yKSkge1xuICAgICAgcmV0dXJuIFN5bmNQcm9taXNlLnJlc29sdmUoZXZlbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgU3luY1Byb21pc2U8RXZlbnQ+KHJlc29sdmUgPT4ge1xuICAgICAgdm9pZCB0aGlzLl93YWxrRXJyb3JUcmVlKGhpbnQub3JpZ2luYWxFeGNlcHRpb24gYXMgRXJyb3IsIHRoaXMuX2tleSlcbiAgICAgICAgLnRoZW4oKGxpbmtlZEVycm9yczogRXhjZXB0aW9uW10pID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQgJiYgZXZlbnQuZXhjZXB0aW9uICYmIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMpIHtcbiAgICAgICAgICAgIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgPSBbLi4ubGlua2VkRXJyb3JzLCAuLi5ldmVudC5leGNlcHRpb24udmFsdWVzXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZShldmVudCk7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKG51bGwsICgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHByaXZhdGUgX3dhbGtFcnJvclRyZWUoZXJyb3I6IEV4dGVuZGVkRXJyb3IsIGtleTogc3RyaW5nLCBzdGFjazogRXhjZXB0aW9uW10gPSBbXSk6IFByb21pc2VMaWtlPEV4Y2VwdGlvbltdPiB7XG4gICAgaWYgKCFpc0luc3RhbmNlT2YoZXJyb3Jba2V5XSwgRXJyb3IpIHx8IHN0YWNrLmxlbmd0aCArIDEgPj0gdGhpcy5fbGltaXQpIHtcbiAgICAgIHJldHVybiBTeW5jUHJvbWlzZS5yZXNvbHZlKHN0YWNrKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZTxFeGNlcHRpb25bXT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdm9pZCBnZXRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyb3Jba2V5XSlcbiAgICAgICAgLnRoZW4oKGV4Y2VwdGlvbjogRXhjZXB0aW9uKSA9PiB7XG4gICAgICAgICAgdm9pZCB0aGlzLl93YWxrRXJyb3JUcmVlKGVycm9yW2tleV0sIGtleSwgW2V4Y2VwdGlvbiwgLi4uc3RhY2tdKVxuICAgICAgICAgICAgLnRoZW4ocmVzb2x2ZSlcbiAgICAgICAgICAgIC50aGVuKG51bGwsICgpID0+IHtcbiAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4obnVsbCwgKCkgPT4ge1xuICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIiwgImltcG9ydCB7IEV2ZW50UHJvY2Vzc29yLCBIdWIsIEludGVncmF0aW9uIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSAncGF0aCc7XG5cbmxldCBtb2R1bGVDYWNoZTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuLyoqIEV4dHJhY3QgaW5mb3JtYXRpb24gYWJvdXQgcGF0aHMgKi9cbmZ1bmN0aW9uIGdldFBhdGhzKCk6IHN0cmluZ1tdIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVxdWlyZS5jYWNoZSA/IE9iamVjdC5rZXlzKHJlcXVpcmUuY2FjaGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIDogW107XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuLyoqIEV4dHJhY3QgaW5mb3JtYXRpb24gYWJvdXQgcGFja2FnZS5qc29uIG1vZHVsZXMgKi9cbmZ1bmN0aW9uIGNvbGxlY3RNb2R1bGVzKCk6IHtcbiAgW25hbWU6IHN0cmluZ106IHN0cmluZztcbn0ge1xuICBjb25zdCBtYWluUGF0aHMgPSAocmVxdWlyZS5tYWluICYmIHJlcXVpcmUubWFpbi5wYXRocykgfHwgW107XG4gIGNvbnN0IHBhdGhzID0gZ2V0UGF0aHMoKTtcbiAgY29uc3QgaW5mb3M6IHtcbiAgICBbbmFtZTogc3RyaW5nXTogc3RyaW5nO1xuICB9ID0ge307XG4gIGNvbnN0IHNlZW46IHtcbiAgICBbcGF0aDogc3RyaW5nXTogYm9vbGVhbjtcbiAgfSA9IHt9O1xuXG4gIHBhdGhzLmZvckVhY2gocGF0aCA9PiB7XG4gICAgbGV0IGRpciA9IHBhdGg7XG5cbiAgICAvKiogVHJhdmVyc2UgZGlyZWN0b3JpZXMgdXB3YXJkIGluIHRoZSBzZWFyY2ggb2YgcGFja2FnZS5qc29uIGZpbGUgKi9cbiAgICBjb25zdCB1cGRpciA9ICgpOiB2b2lkIHwgKCgpID0+IHZvaWQpID0+IHtcbiAgICAgIGNvbnN0IG9yaWcgPSBkaXI7XG4gICAgICBkaXIgPSBkaXJuYW1lKG9yaWcpO1xuXG4gICAgICBpZiAoIWRpciB8fCBvcmlnID09PSBkaXIgfHwgc2VlbltvcmlnXSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKG1haW5QYXRocy5pbmRleE9mKGRpcikgPCAwKSB7XG4gICAgICAgIHJldHVybiB1cGRpcigpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwa2dmaWxlID0gam9pbihvcmlnLCAncGFja2FnZS5qc29uJyk7XG4gICAgICBzZWVuW29yaWddID0gdHJ1ZTtcblxuICAgICAgaWYgKCFleGlzdHNTeW5jKHBrZ2ZpbGUpKSB7XG4gICAgICAgIHJldHVybiB1cGRpcigpO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpbmZvID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMocGtnZmlsZSwgJ3V0ZjgnKSkgYXMge1xuICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICAgIGluZm9zW2luZm8ubmFtZV0gPSBpbmZvLnZlcnNpb247XG4gICAgICB9IGNhdGNoIChfb08pIHtcbiAgICAgICAgLy8gbm8tZW1wdHlcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdXBkaXIoKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGluZm9zO1xufVxuXG4vKiogQWRkIG5vZGUgbW9kdWxlcyAvIHBhY2thZ2VzIHRvIHRoZSBldmVudCAqL1xuZXhwb3J0IGNsYXNzIE1vZHVsZXMgaW1wbGVtZW50cyBJbnRlZ3JhdGlvbiB7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpZDogc3RyaW5nID0gJ01vZHVsZXMnO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIG5hbWU6IHN0cmluZyA9IE1vZHVsZXMuaWQ7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0dXBPbmNlKGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yOiAoY2FsbGJhY2s6IEV2ZW50UHJvY2Vzc29yKSA9PiB2b2lkLCBnZXRDdXJyZW50SHViOiAoKSA9PiBIdWIpOiB2b2lkIHtcbiAgICBhZGRHbG9iYWxFdmVudFByb2Nlc3NvcihldmVudCA9PiB7XG4gICAgICBpZiAoIWdldEN1cnJlbnRIdWIoKS5nZXRJbnRlZ3JhdGlvbihNb2R1bGVzKSkge1xuICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5ldmVudCxcbiAgICAgICAgbW9kdWxlczogdGhpcy5fZ2V0TW9kdWxlcygpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBGZXRjaGVzIHRoZSBsaXN0IG9mIG1vZHVsZXMgYW5kIHRoZSB2ZXJzaW9ucyBsb2FkZWQgYnkgdGhlIGVudHJ5IGZpbGUgZm9yIHlvdXIgbm9kZS5qcyBhcHAuICovXG4gIHByaXZhdGUgX2dldE1vZHVsZXMoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgaWYgKCFtb2R1bGVDYWNoZSkge1xuICAgICAgbW9kdWxlQ2FjaGUgPSBjb2xsZWN0TW9kdWxlcygpO1xuICAgIH1cbiAgICByZXR1cm4gbW9kdWxlQ2FjaGU7XG4gIH1cbn1cbiIsICJleHBvcnQgeyBDb25zb2xlIH0gZnJvbSAnLi9jb25zb2xlJztcbmV4cG9ydCB7IEh0dHAgfSBmcm9tICcuL2h0dHAnO1xuZXhwb3J0IHsgT25VbmNhdWdodEV4Y2VwdGlvbiB9IGZyb20gJy4vb251bmNhdWdodGV4Y2VwdGlvbic7XG5leHBvcnQgeyBPblVuaGFuZGxlZFJlamVjdGlvbiB9IGZyb20gJy4vb251bmhhbmRsZWRyZWplY3Rpb24nO1xuZXhwb3J0IHsgTGlua2VkRXJyb3JzIH0gZnJvbSAnLi9saW5rZWRlcnJvcnMnO1xuZXhwb3J0IHsgTW9kdWxlcyB9IGZyb20gJy4vbW9kdWxlcyc7XG4iLCAiaW1wb3J0IHsgZ2V0Q3VycmVudEh1YiwgaW5pdEFuZEJpbmQsIEludGVncmF0aW9ucyBhcyBDb3JlSW50ZWdyYXRpb25zIH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7IGdldE1haW5DYXJyaWVyLCBzZXRIdWJPbkNhcnJpZXIgfSBmcm9tICdAc2VudHJ5L2h1Yic7XG5pbXBvcnQgeyBTZXNzaW9uU3RhdHVzIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QsIGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0ICogYXMgZG9tYWluIGZyb20gJ2RvbWFpbic7XG5cbmltcG9ydCB7IE5vZGVDbGllbnQgfSBmcm9tICcuL2NsaWVudCc7XG5pbXBvcnQgeyBDb25zb2xlLCBIdHRwLCBMaW5rZWRFcnJvcnMsIE9uVW5jYXVnaHRFeGNlcHRpb24sIE9uVW5oYW5kbGVkUmVqZWN0aW9uIH0gZnJvbSAnLi9pbnRlZ3JhdGlvbnMnO1xuaW1wb3J0IHsgTm9kZU9wdGlvbnMgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRJbnRlZ3JhdGlvbnMgPSBbXG4gIC8vIENvbW1vblxuICBuZXcgQ29yZUludGVncmF0aW9ucy5JbmJvdW5kRmlsdGVycygpLFxuICBuZXcgQ29yZUludGVncmF0aW9ucy5GdW5jdGlvblRvU3RyaW5nKCksXG4gIC8vIE5hdGl2ZSBXcmFwcGVyc1xuICBuZXcgQ29uc29sZSgpLFxuICBuZXcgSHR0cCgpLFxuICAvLyBHbG9iYWwgSGFuZGxlcnNcbiAgbmV3IE9uVW5jYXVnaHRFeGNlcHRpb24oKSxcbiAgbmV3IE9uVW5oYW5kbGVkUmVqZWN0aW9uKCksXG4gIC8vIE1pc2NcbiAgbmV3IExpbmtlZEVycm9ycygpLFxuXTtcblxuLyoqXG4gKiBUaGUgU2VudHJ5IE5vZGUgU0RLIENsaWVudC5cbiAqXG4gKiBUbyB1c2UgdGhpcyBTREssIGNhbGwgdGhlIHtAbGluayBpbml0fSBmdW5jdGlvbiBhcyBlYXJseSBhcyBwb3NzaWJsZSBpbiB0aGVcbiAqIG1haW4gZW50cnkgbW9kdWxlLiBUbyBzZXQgY29udGV4dCBpbmZvcm1hdGlvbiBvciBzZW5kIG1hbnVhbCBldmVudHMsIHVzZSB0aGVcbiAqIHByb3ZpZGVkIG1ldGhvZHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYFxuICpcbiAqIGNvbnN0IHsgaW5pdCB9ID0gcmVxdWlyZSgnQHNlbnRyeS9ub2RlJyk7XG4gKlxuICogaW5pdCh7XG4gKiAgIGRzbjogJ19fRFNOX18nLFxuICogICAvLyAuLi5cbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYFxuICpcbiAqIGNvbnN0IHsgY29uZmlndXJlU2NvcGUgfSA9IHJlcXVpcmUoJ0BzZW50cnkvbm9kZScpO1xuICogY29uZmlndXJlU2NvcGUoKHNjb3BlOiBTY29wZSkgPT4ge1xuICogICBzY29wZS5zZXRFeHRyYSh7IGJhdHRlcnk6IDAuNyB9KTtcbiAqICAgc2NvcGUuc2V0VGFnKHsgdXNlcl9tb2RlOiAnYWRtaW4nIH0pO1xuICogICBzY29wZS5zZXRVc2VyKHsgaWQ6ICc0NzExJyB9KTtcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYFxuICpcbiAqIGNvbnN0IHsgYWRkQnJlYWRjcnVtYiB9ID0gcmVxdWlyZSgnQHNlbnRyeS9ub2RlJyk7XG4gKiBhZGRCcmVhZGNydW1iKHtcbiAqICAgbWVzc2FnZTogJ015IEJyZWFkY3J1bWInLFxuICogICAvLyAuLi5cbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYFxuICpcbiAqIGNvbnN0IFNlbnRyeSA9IHJlcXVpcmUoJ0BzZW50cnkvbm9kZScpO1xuICogU2VudHJ5LmNhcHR1cmVNZXNzYWdlKCdIZWxsbywgd29ybGQhJyk7XG4gKiBTZW50cnkuY2FwdHVyZUV4Y2VwdGlvbihuZXcgRXJyb3IoJ0dvb2QgYnllJykpO1xuICogU2VudHJ5LmNhcHR1cmVFdmVudCh7XG4gKiAgIG1lc3NhZ2U6ICdNYW51YWwnLFxuICogICBzdGFja3RyYWNlOiBbXG4gKiAgICAgLy8gLi4uXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBzZWUge0BsaW5rIE5vZGVPcHRpb25zfSBmb3IgZG9jdW1lbnRhdGlvbiBvbiBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0KG9wdGlvbnM6IE5vZGVPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgY29uc3QgY2FycmllciA9IGdldE1haW5DYXJyaWVyKCk7XG4gIGNvbnN0IGF1dG9sb2FkZWRJbnRlZ3JhdGlvbnMgPSBjYXJyaWVyLl9fU0VOVFJZX18/LmludGVncmF0aW9ucyB8fCBbXTtcblxuICBvcHRpb25zLmRlZmF1bHRJbnRlZ3JhdGlvbnMgPVxuICAgIG9wdGlvbnMuZGVmYXVsdEludGVncmF0aW9ucyA9PT0gZmFsc2VcbiAgICAgID8gW11cbiAgICAgIDogW1xuICAgICAgICAgIC4uLihBcnJheS5pc0FycmF5KG9wdGlvbnMuZGVmYXVsdEludGVncmF0aW9ucykgPyBvcHRpb25zLmRlZmF1bHRJbnRlZ3JhdGlvbnMgOiBkZWZhdWx0SW50ZWdyYXRpb25zKSxcbiAgICAgICAgICAuLi5hdXRvbG9hZGVkSW50ZWdyYXRpb25zLFxuICAgICAgICBdO1xuXG4gIGlmIChvcHRpb25zLmRzbiA9PT0gdW5kZWZpbmVkICYmIHByb2Nlc3MuZW52LlNFTlRSWV9EU04pIHtcbiAgICBvcHRpb25zLmRzbiA9IHByb2Nlc3MuZW52LlNFTlRSWV9EU047XG4gIH1cblxuICBpZiAob3B0aW9ucy50cmFjZXNTYW1wbGVSYXRlID09PSB1bmRlZmluZWQgJiYgcHJvY2Vzcy5lbnYuU0VOVFJZX1RSQUNFU19TQU1QTEVfUkFURSkge1xuICAgIGNvbnN0IHRyYWNlc1NhbXBsZVJhdGUgPSBwYXJzZUZsb2F0KHByb2Nlc3MuZW52LlNFTlRSWV9UUkFDRVNfU0FNUExFX1JBVEUpO1xuICAgIGlmIChpc0Zpbml0ZSh0cmFjZXNTYW1wbGVSYXRlKSkge1xuICAgICAgb3B0aW9ucy50cmFjZXNTYW1wbGVSYXRlID0gdHJhY2VzU2FtcGxlUmF0ZTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0aW9ucy5yZWxlYXNlID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBkZXRlY3RlZFJlbGVhc2UgPSBnZXRTZW50cnlSZWxlYXNlKCk7XG4gICAgaWYgKGRldGVjdGVkUmVsZWFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvcHRpb25zLnJlbGVhc2UgPSBkZXRlY3RlZFJlbGVhc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHJlbGVhc2UgaXMgbm90IHByb3ZpZGVkLCB0aGVuIHdlIHNob3VsZCBkaXNhYmxlIGF1dG9TZXNzaW9uVHJhY2tpbmdcbiAgICAgIG9wdGlvbnMuYXV0b1Nlc3Npb25UcmFja2luZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRpb25zLmVudmlyb25tZW50ID09PSB1bmRlZmluZWQgJiYgcHJvY2Vzcy5lbnYuU0VOVFJZX0VOVklST05NRU5UKSB7XG4gICAgb3B0aW9ucy5lbnZpcm9ubWVudCA9IHByb2Nlc3MuZW52LlNFTlRSWV9FTlZJUk9OTUVOVDtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmF1dG9TZXNzaW9uVHJhY2tpbmcgPT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmRzbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgb3B0aW9ucy5hdXRvU2Vzc2lvblRyYWNraW5nID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MsIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgaWYgKChkb21haW4gYXMgYW55KS5hY3RpdmUpIHtcbiAgICBzZXRIdWJPbkNhcnJpZXIoY2FycmllciwgZ2V0Q3VycmVudEh1YigpKTtcbiAgfVxuXG4gIGluaXRBbmRCaW5kKE5vZGVDbGllbnQsIG9wdGlvbnMpO1xuXG4gIGlmIChvcHRpb25zLmF1dG9TZXNzaW9uVHJhY2tpbmcpIHtcbiAgICBzdGFydFNlc3Npb25UcmFja2luZygpO1xuICB9XG59XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgZ2V0dGVyIGZvciBsYXN0RXZlbnRJZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbGFzdCBldmVudCBpZCBvZiBhIGNhcHR1cmVkIGV2ZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGFzdEV2ZW50SWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdldEN1cnJlbnRIdWIoKS5sYXN0RXZlbnRJZCgpO1xufVxuXG4vKipcbiAqIENhbGwgYGZsdXNoKClgIG9uIHRoZSBjdXJyZW50IGNsaWVudCwgaWYgdGhlcmUgaXMgb25lLiBTZWUge0BsaW5rIENsaWVudC5mbHVzaH0uXG4gKlxuICogQHBhcmFtIHRpbWVvdXQgTWF4aW11bSB0aW1lIGluIG1zIHRoZSBjbGllbnQgc2hvdWxkIHdhaXQgdG8gZmx1c2ggaXRzIGV2ZW50IHF1ZXVlLiBPbWl0dGluZyB0aGlzIHBhcmFtZXRlciB3aWxsIGNhdXNlXG4gKiB0aGUgY2xpZW50IHRvIHdhaXQgdW50aWwgYWxsIGV2ZW50cyBhcmUgc2VudCBiZWZvcmUgcmVzb2x2aW5nIHRoZSBwcm9taXNlLlxuICogQHJldHVybnMgQSBwcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIGB0cnVlYCBpZiB0aGUgcXVldWUgc3VjY2Vzc2Z1bGx5IGRyYWlucyBiZWZvcmUgdGhlIHRpbWVvdXQsIG9yIGBmYWxzZWAgaWYgaXRcbiAqIGRvZXNuJ3QgKG9yIGlmIHRoZXJlJ3Mgbm8gY2xpZW50IGRlZmluZWQpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmx1c2godGltZW91dD86IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBjbGllbnQgPSBnZXRDdXJyZW50SHViKCkuZ2V0Q2xpZW50PE5vZGVDbGllbnQ+KCk7XG4gIGlmIChjbGllbnQpIHtcbiAgICByZXR1cm4gY2xpZW50LmZsdXNoKHRpbWVvdXQpO1xuICB9XG4gIGxvZ2dlci53YXJuKCdDYW5ub3QgZmx1c2ggZXZlbnRzLiBObyBjbGllbnQgZGVmaW5lZC4nKTtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG59XG5cbi8qKlxuICogQ2FsbCBgY2xvc2UoKWAgb24gdGhlIGN1cnJlbnQgY2xpZW50LCBpZiB0aGVyZSBpcyBvbmUuIFNlZSB7QGxpbmsgQ2xpZW50LmNsb3NlfS5cbiAqXG4gKiBAcGFyYW0gdGltZW91dCBNYXhpbXVtIHRpbWUgaW4gbXMgdGhlIGNsaWVudCBzaG91bGQgd2FpdCB0byBmbHVzaCBpdHMgZXZlbnQgcXVldWUgYmVmb3JlIHNodXR0aW5nIGRvd24uIE9taXR0aW5nIHRoaXNcbiAqIHBhcmFtZXRlciB3aWxsIGNhdXNlIHRoZSBjbGllbnQgdG8gd2FpdCB1bnRpbCBhbGwgZXZlbnRzIGFyZSBzZW50IGJlZm9yZSBkaXNhYmxpbmcgaXRzZWxmLlxuICogQHJldHVybnMgQSBwcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIGB0cnVlYCBpZiB0aGUgcXVldWUgc3VjY2Vzc2Z1bGx5IGRyYWlucyBiZWZvcmUgdGhlIHRpbWVvdXQsIG9yIGBmYWxzZWAgaWYgaXRcbiAqIGRvZXNuJ3QgKG9yIGlmIHRoZXJlJ3Mgbm8gY2xpZW50IGRlZmluZWQpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xvc2UodGltZW91dD86IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBjbGllbnQgPSBnZXRDdXJyZW50SHViKCkuZ2V0Q2xpZW50PE5vZGVDbGllbnQ+KCk7XG4gIGlmIChjbGllbnQpIHtcbiAgICByZXR1cm4gY2xpZW50LmNsb3NlKHRpbWVvdXQpO1xuICB9XG4gIGxvZ2dlci53YXJuKCdDYW5ub3QgZmx1c2ggZXZlbnRzIGFuZCBkaXNhYmxlIFNESy4gTm8gY2xpZW50IGRlZmluZWQuJyk7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRoYXQgdGFrZXMgYW4gaW5zdGFuY2Ugb2YgTm9kZUNsaWVudCBhbmQgY2hlY2tzIGlmIGF1dG9TZXNzaW9uVHJhY2tpbmcgb3B0aW9uIGlzIGVuYWJsZWQgZm9yIHRoYXQgY2xpZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0F1dG9TZXNzaW9uVHJhY2tpbmdFbmFibGVkKGNsaWVudD86IE5vZGVDbGllbnQpOiBib29sZWFuIHtcbiAgaWYgKGNsaWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGNsaWVudE9wdGlvbnM6IE5vZGVPcHRpb25zID0gY2xpZW50ICYmIGNsaWVudC5nZXRPcHRpb25zKCk7XG4gIGlmIChjbGllbnRPcHRpb25zICYmIGNsaWVudE9wdGlvbnMuYXV0b1Nlc3Npb25UcmFja2luZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNsaWVudE9wdGlvbnMuYXV0b1Nlc3Npb25UcmFja2luZztcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHJlbGVhc2UgZHluYW1pY2FsbHkgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZW50cnlSZWxlYXNlKGZhbGxiYWNrPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgLy8gQWx3YXlzIHJlYWQgZmlyc3QgYXMgU2VudHJ5IHRha2VzIHRoaXMgYXMgcHJlY2VkZW5jZVxuICBpZiAocHJvY2Vzcy5lbnYuU0VOVFJZX1JFTEVBU0UpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuU0VOVFJZX1JFTEVBU0U7XG4gIH1cblxuICAvLyBUaGlzIHN1cHBvcnRzIHRoZSB2YXJpYWJsZSB0aGF0IHNlbnRyeS13ZWJwYWNrLXBsdWdpbiBpbmplY3RzXG4gIGNvbnN0IGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdCgpO1xuICBpZiAoZ2xvYmFsLlNFTlRSWV9SRUxFQVNFICYmIGdsb2JhbC5TRU5UUllfUkVMRUFTRS5pZCkge1xuICAgIHJldHVybiBnbG9iYWwuU0VOVFJZX1JFTEVBU0UuaWQ7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIC8vIEdpdEh1YiBBY3Rpb25zIC0gaHR0cHM6Ly9oZWxwLmdpdGh1Yi5jb20vZW4vYWN0aW9ucy9jb25maWd1cmluZy1hbmQtbWFuYWdpbmctd29ya2Zsb3dzL3VzaW5nLWVudmlyb25tZW50LXZhcmlhYmxlcyNkZWZhdWx0LWVudmlyb25tZW50LXZhcmlhYmxlc1xuICAgIHByb2Nlc3MuZW52LkdJVEhVQl9TSEEgfHxcbiAgICAvLyBOZXRsaWZ5IC0gaHR0cHM6Ly9kb2NzLm5ldGxpZnkuY29tL2NvbmZpZ3VyZS1idWlsZHMvZW52aXJvbm1lbnQtdmFyaWFibGVzLyNidWlsZC1tZXRhZGF0YVxuICAgIHByb2Nlc3MuZW52LkNPTU1JVF9SRUYgfHxcbiAgICAvLyBWZXJjZWwgLSBodHRwczovL3ZlcmNlbC5jb20vZG9jcy92Mi9idWlsZC1zdGVwI3N5c3RlbS1lbnZpcm9ubWVudC12YXJpYWJsZXNcbiAgICBwcm9jZXNzLmVudi5WRVJDRUxfR0lUX0NPTU1JVF9TSEEgfHxcbiAgICBwcm9jZXNzLmVudi5WRVJDRUxfR0lUSFVCX0NPTU1JVF9TSEEgfHxcbiAgICBwcm9jZXNzLmVudi5WRVJDRUxfR0lUTEFCX0NPTU1JVF9TSEEgfHxcbiAgICBwcm9jZXNzLmVudi5WRVJDRUxfQklUQlVDS0VUX0NPTU1JVF9TSEEgfHxcbiAgICAvLyBaZWl0IChub3cga25vd24gYXMgVmVyY2VsKVxuICAgIHByb2Nlc3MuZW52LlpFSVRfR0lUSFVCX0NPTU1JVF9TSEEgfHxcbiAgICBwcm9jZXNzLmVudi5aRUlUX0dJVExBQl9DT01NSVRfU0hBIHx8XG4gICAgcHJvY2Vzcy5lbnYuWkVJVF9CSVRCVUNLRVRfQ09NTUlUX1NIQSB8fFxuICAgIGZhbGxiYWNrXG4gICk7XG59XG5cbi8qKlxuICogRW5hYmxlIGF1dG9tYXRpYyBTZXNzaW9uIFRyYWNraW5nIGZvciB0aGUgbm9kZSBwcm9jZXNzLlxuICovXG5mdW5jdGlvbiBzdGFydFNlc3Npb25UcmFja2luZygpOiB2b2lkIHtcbiAgY29uc3QgaHViID0gZ2V0Q3VycmVudEh1YigpO1xuICBodWIuc3RhcnRTZXNzaW9uKCk7XG4gIC8vIEVtaXR0ZWQgaW4gdGhlIGNhc2Ugb2YgaGVhbHRoeSBzZXNzaW9ucywgZXJyb3Igb2YgYG1lY2hhbmlzbS5oYW5kbGVkOiB0cnVlYCBhbmQgdW5oYW5kbGVkcmVqZWN0aW9ucyBiZWNhdXNlXG4gIC8vIFRoZSAnYmVmb3JlRXhpdCcgZXZlbnQgaXMgbm90IGVtaXR0ZWQgZm9yIGNvbmRpdGlvbnMgY2F1c2luZyBleHBsaWNpdCB0ZXJtaW5hdGlvbixcbiAgLy8gc3VjaCBhcyBjYWxsaW5nIHByb2Nlc3MuZXhpdCgpIG9yIHVuY2F1Z2h0IGV4Y2VwdGlvbnMuXG4gIC8vIFJlZjogaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9wcm9jZXNzLmh0bWwjcHJvY2Vzc19ldmVudF9iZWZvcmVleGl0XG4gIHByb2Nlc3Mub24oJ2JlZm9yZUV4aXQnLCAoKSA9PiB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IGh1Yi5nZXRTY29wZSgpPy5nZXRTZXNzaW9uKCk7XG4gICAgY29uc3QgdGVybWluYWxTdGF0ZXMgPSBbU2Vzc2lvblN0YXR1cy5FeGl0ZWQsIFNlc3Npb25TdGF0dXMuQ3Jhc2hlZF07XG4gICAgLy8gT25seSBjYWxsIGVuZFNlc3Npb24sIGlmIHRoZSBTZXNzaW9uIGV4aXN0cyBvbiBTY29wZSBhbmQgU2Vzc2lvblN0YXR1cyBpcyBub3QgYVxuICAgIC8vIFRlcm1pbmFsIFN0YXR1cyBpLmUuIEV4aXRlZCBvciBDcmFzaGVkIGJlY2F1c2VcbiAgICAvLyBcIldoZW4gYSBzZXNzaW9uIGlzIG1vdmVkIGF3YXkgZnJvbSBvayBpdCBtdXN0IG5vdCBiZSB1cGRhdGVkIGFueW1vcmUuXCJcbiAgICAvLyBSZWY6IGh0dHBzOi8vZGV2ZWxvcC5zZW50cnkuZGV2L3Nkay9zZXNzaW9ucy9cbiAgICBpZiAoc2Vzc2lvbiAmJiAhdGVybWluYWxTdGF0ZXMuaW5jbHVkZXMoc2Vzc2lvbi5zdGF0dXMpKSBodWIuZW5kU2Vzc2lvbigpO1xuICB9KTtcbn1cbiIsICJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IHJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgZGlyZWN0b3J5LlxuICpcbiAqIEBwYXJhbSB0YXJnZXREaXIgQWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aCBvZiB0aGUgZGlyZWN0b3J5IHRvIHNjYW4uIEFsbCByZXR1cm5lZCBwYXRocyB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoaXNcbiAqIGRpcmVjdG9yeS5cbiAqIEByZXR1cm5zIEFycmF5IGhvbGRpbmcgYWxsIHJlbGF0aXZlIHBhdGhzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwUmVhZERpclN5bmModGFyZ2V0RGlyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHRhcmdldERpckFic1BhdGggPSBwYXRoLnJlc29sdmUodGFyZ2V0RGlyKTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0RGlyQWJzUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZWFkIGNvbnRlbnRzIG9mICR7dGFyZ2V0RGlyQWJzUGF0aH0uIERpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC5gKTtcbiAgfVxuXG4gIGlmICghZnMuc3RhdFN5bmModGFyZ2V0RGlyQWJzUGF0aCkuaXNEaXJlY3RvcnkoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlYWQgY29udGVudHMgb2YgJHt0YXJnZXREaXJBYnNQYXRofSwgYmVjYXVzZSBpdCBpcyBub3QgYSBkaXJlY3RvcnkuYCk7XG4gIH1cblxuICAvLyBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgaXRzIGNvbnRhaW5pbmcgZnVuY3Rpb24sIGBkZWVwUmVhZERpclN5bmNgIChleGNlcHQgdGhhdCAtIHB1cmVseSBmb3IgY29udmVuaWVuY2UgLSBpdFxuICAvLyBkZWFscyBpbiBhYnNvbHV0ZSBwYXRocyByYXRoZXIgdGhhbiByZWxhdGl2ZSBvbmVzKS4gV2UgbmVlZCB0aGlzIHRvIGJlIHNlcGFyYXRlIGZyb20gdGhlIG91dGVyIGZ1bmN0aW9uIHRvIHByZXNlcnZlXG4gIC8vIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYHRhcmdldERpckFic1BhdGhgIGFuZCBgY3VycmVudERpckFic1BhdGhgLlxuICBjb25zdCBkZWVwUmVhZEN1cnJlbnREaXIgPSAoY3VycmVudERpckFic1BhdGg6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgICByZXR1cm4gZnMucmVhZGRpclN5bmMoY3VycmVudERpckFic1BhdGgpLnJlZHVjZSgoYWJzUGF0aHM6IHN0cmluZ1tdLCBpdGVtTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBpdGVtQWJzUGF0aCA9IHBhdGguam9pbihjdXJyZW50RGlyQWJzUGF0aCwgaXRlbU5hbWUpO1xuXG4gICAgICBpZiAoZnMuc3RhdFN5bmMoaXRlbUFic1BhdGgpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgcmV0dXJuIFsuLi5hYnNQYXRocywgLi4uZGVlcFJlYWRDdXJyZW50RGlyKGl0ZW1BYnNQYXRoKV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbLi4uYWJzUGF0aHMsIGl0ZW1BYnNQYXRoXTtcbiAgICB9LCBbXSk7XG4gIH07XG5cbiAgcmV0dXJuIGRlZXBSZWFkQ3VycmVudERpcih0YXJnZXREaXJBYnNQYXRoKS5tYXAoYWJzUGF0aCA9PiBwYXRoLnJlbGF0aXZlKHRhcmdldERpckFic1BhdGgsIGFic1BhdGgpKTtcbn1cbiIsICIvKiogVGhlIHN0YXR1cyBvZiBhbiBTcGFuLiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9leHBvcnRcbmV4cG9ydCBlbnVtIFNwYW5TdGF0dXMge1xuICAvKiogVGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiAqL1xuICBPayA9ICdvaycsXG4gIC8qKiBEZWFkbGluZSBleHBpcmVkIGJlZm9yZSBvcGVyYXRpb24gY291bGQgY29tcGxldGUuICovXG4gIERlYWRsaW5lRXhjZWVkZWQgPSAnZGVhZGxpbmVfZXhjZWVkZWQnLFxuICAvKiogNDAxIFVuYXV0aG9yaXplZCAoYWN0dWFsbHkgZG9lcyBtZWFuIHVuYXV0aGVudGljYXRlZCBhY2NvcmRpbmcgdG8gUkZDIDcyMzUpICovXG4gIFVuYXV0aGVudGljYXRlZCA9ICd1bmF1dGhlbnRpY2F0ZWQnLFxuICAvKiogNDAzIEZvcmJpZGRlbiAqL1xuICBQZXJtaXNzaW9uRGVuaWVkID0gJ3Blcm1pc3Npb25fZGVuaWVkJyxcbiAgLyoqIDQwNCBOb3QgRm91bmQuIFNvbWUgcmVxdWVzdGVkIGVudGl0eSAoZmlsZSBvciBkaXJlY3RvcnkpIHdhcyBub3QgZm91bmQuICovXG4gIE5vdEZvdW5kID0gJ25vdF9mb3VuZCcsXG4gIC8qKiA0MjkgVG9vIE1hbnkgUmVxdWVzdHMgKi9cbiAgUmVzb3VyY2VFeGhhdXN0ZWQgPSAncmVzb3VyY2VfZXhoYXVzdGVkJyxcbiAgLyoqIENsaWVudCBzcGVjaWZpZWQgYW4gaW52YWxpZCBhcmd1bWVudC4gNHh4LiAqL1xuICBJbnZhbGlkQXJndW1lbnQgPSAnaW52YWxpZF9hcmd1bWVudCcsXG4gIC8qKiA1MDEgTm90IEltcGxlbWVudGVkICovXG4gIFVuaW1wbGVtZW50ZWQgPSAndW5pbXBsZW1lbnRlZCcsXG4gIC8qKiA1MDMgU2VydmljZSBVbmF2YWlsYWJsZSAqL1xuICBVbmF2YWlsYWJsZSA9ICd1bmF2YWlsYWJsZScsXG4gIC8qKiBPdGhlci9nZW5lcmljIDV4eC4gKi9cbiAgSW50ZXJuYWxFcnJvciA9ICdpbnRlcm5hbF9lcnJvcicsXG4gIC8qKiBVbmtub3duLiBBbnkgbm9uLXN0YW5kYXJkIEhUVFAgc3RhdHVzIGNvZGUuICovXG4gIFVua25vd25FcnJvciA9ICd1bmtub3duX2Vycm9yJyxcbiAgLyoqIFRoZSBvcGVyYXRpb24gd2FzIGNhbmNlbGxlZCAodHlwaWNhbGx5IGJ5IHRoZSB1c2VyKS4gKi9cbiAgQ2FuY2VsbGVkID0gJ2NhbmNlbGxlZCcsXG4gIC8qKiBBbHJlYWR5IGV4aXN0cyAoNDA5KSAqL1xuICBBbHJlYWR5RXhpc3RzID0gJ2FscmVhZHlfZXhpc3RzJyxcbiAgLyoqIE9wZXJhdGlvbiB3YXMgcmVqZWN0ZWQgYmVjYXVzZSB0aGUgc3lzdGVtIGlzIG5vdCBpbiBhIHN0YXRlIHJlcXVpcmVkIGZvciB0aGUgb3BlcmF0aW9uJ3MgKi9cbiAgRmFpbGVkUHJlY29uZGl0aW9uID0gJ2ZhaWxlZF9wcmVjb25kaXRpb24nLFxuICAvKiogVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZCwgdHlwaWNhbGx5IGR1ZSB0byBhIGNvbmN1cnJlbmN5IGlzc3VlLiAqL1xuICBBYm9ydGVkID0gJ2Fib3J0ZWQnLFxuICAvKiogT3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgcGFzdCB0aGUgdmFsaWQgcmFuZ2UuICovXG4gIE91dE9mUmFuZ2UgPSAnb3V0X29mX3JhbmdlJyxcbiAgLyoqIFVucmVjb3ZlcmFibGUgZGF0YSBsb3NzIG9yIGNvcnJ1cHRpb24gKi9cbiAgRGF0YUxvc3MgPSAnZGF0YV9sb3NzJyxcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2UsIGltcG9ydC9leHBvcnRcbmV4cG9ydCBuYW1lc3BhY2UgU3BhblN0YXR1cyB7XG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIEhUVFAgc3RhdHVzIGNvZGUgaW50byBhIHtAbGluayBTcGFuU3RhdHVzfS5cbiAgICpcbiAgICogQHBhcmFtIGh0dHBTdGF0dXMgVGhlIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGUuXG4gICAqIEByZXR1cm5zIFRoZSBzcGFuIHN0YXR1cyBvciB7QGxpbmsgU3BhblN0YXR1cy5Vbmtub3duRXJyb3J9LlxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGZyb21IdHRwQ29kZShodHRwU3RhdHVzOiBudW1iZXIpOiBTcGFuU3RhdHVzIHtcbiAgICBpZiAoaHR0cFN0YXR1cyA8IDQwMCAmJiBodHRwU3RhdHVzID49IDEwMCkge1xuICAgICAgcmV0dXJuIFNwYW5TdGF0dXMuT2s7XG4gICAgfVxuXG4gICAgaWYgKGh0dHBTdGF0dXMgPj0gNDAwICYmIGh0dHBTdGF0dXMgPCA1MDApIHtcbiAgICAgIHN3aXRjaCAoaHR0cFN0YXR1cykge1xuICAgICAgICBjYXNlIDQwMTpcbiAgICAgICAgICByZXR1cm4gU3BhblN0YXR1cy5VbmF1dGhlbnRpY2F0ZWQ7XG4gICAgICAgIGNhc2UgNDAzOlxuICAgICAgICAgIHJldHVybiBTcGFuU3RhdHVzLlBlcm1pc3Npb25EZW5pZWQ7XG4gICAgICAgIGNhc2UgNDA0OlxuICAgICAgICAgIHJldHVybiBTcGFuU3RhdHVzLk5vdEZvdW5kO1xuICAgICAgICBjYXNlIDQwOTpcbiAgICAgICAgICByZXR1cm4gU3BhblN0YXR1cy5BbHJlYWR5RXhpc3RzO1xuICAgICAgICBjYXNlIDQxMzpcbiAgICAgICAgICByZXR1cm4gU3BhblN0YXR1cy5GYWlsZWRQcmVjb25kaXRpb247XG4gICAgICAgIGNhc2UgNDI5OlxuICAgICAgICAgIHJldHVybiBTcGFuU3RhdHVzLlJlc291cmNlRXhoYXVzdGVkO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBTcGFuU3RhdHVzLkludmFsaWRBcmd1bWVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaHR0cFN0YXR1cyA+PSA1MDAgJiYgaHR0cFN0YXR1cyA8IDYwMCkge1xuICAgICAgc3dpdGNoIChodHRwU3RhdHVzKSB7XG4gICAgICAgIGNhc2UgNTAxOlxuICAgICAgICAgIHJldHVybiBTcGFuU3RhdHVzLlVuaW1wbGVtZW50ZWQ7XG4gICAgICAgIGNhc2UgNTAzOlxuICAgICAgICAgIHJldHVybiBTcGFuU3RhdHVzLlVuYXZhaWxhYmxlO1xuICAgICAgICBjYXNlIDUwNDpcbiAgICAgICAgICByZXR1cm4gU3BhblN0YXR1cy5EZWFkbGluZUV4Y2VlZGVkO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBTcGFuU3RhdHVzLkludGVybmFsRXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFNwYW5TdGF0dXMuVW5rbm93bkVycm9yO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgZ2V0Q3VycmVudEh1YiwgSHViIH0gZnJvbSAnQHNlbnRyeS9odWInO1xuaW1wb3J0IHsgT3B0aW9ucywgVHJhY2VwYXJlbnREYXRhLCBUcmFuc2FjdGlvbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgVFJBQ0VQQVJFTlRfUkVHRVhQID0gbmV3IFJlZ0V4cChcbiAgJ15bIFxcXFx0XSonICsgLy8gd2hpdGVzcGFjZVxuICAnKFswLTlhLWZdezMyfSk/JyArIC8vIHRyYWNlX2lkXG4gICctPyhbMC05YS1mXXsxNn0pPycgKyAvLyBzcGFuX2lkXG4gICctPyhbMDFdKT8nICsgLy8gc2FtcGxlZFxuICAgICdbIFxcXFx0XSokJywgLy8gd2hpdGVzcGFjZVxuKTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRyYWNpbmcgaXMgY3VycmVudGx5IGVuYWJsZWQuXG4gKlxuICogVHJhY2luZyBpcyBlbmFibGVkIHdoZW4gYXQgbGVhc3Qgb25lIG9mIGB0cmFjZXNTYW1wbGVSYXRlYCBhbmQgYHRyYWNlc1NhbXBsZXJgIGlzIGRlZmluZWQgaW4gdGhlIFNESyBjb25maWcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNUcmFjaW5nRW5hYmxlZChcbiAgb3B0aW9uczogT3B0aW9ucyB8IHVuZGVmaW5lZCA9IGdldEN1cnJlbnRIdWIoKVxuICAgIC5nZXRDbGllbnQoKVxuICAgID8uZ2V0T3B0aW9ucygpLFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIW9wdGlvbnMgJiYgKCd0cmFjZXNTYW1wbGVSYXRlJyBpbiBvcHRpb25zIHx8ICd0cmFjZXNTYW1wbGVyJyBpbiBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IHRyYW5zYWN0aW9uIGNvbnRleHQgZGF0YSBmcm9tIGEgYHNlbnRyeS10cmFjZWAgaGVhZGVyLlxuICpcbiAqIEBwYXJhbSB0cmFjZXBhcmVudCBUcmFjZXBhcmVudCBzdHJpbmdcbiAqXG4gKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyBkYXRhIGZyb20gdGhlIGhlYWRlciwgb3IgdW5kZWZpbmVkIGlmIHRyYWNlcGFyZW50IHN0cmluZyBpcyBtYWxmb3JtZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RUcmFjZXBhcmVudERhdGEodHJhY2VwYXJlbnQ6IHN0cmluZyk6IFRyYWNlcGFyZW50RGF0YSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hdGNoZXMgPSB0cmFjZXBhcmVudC5tYXRjaChUUkFDRVBBUkVOVF9SRUdFWFApO1xuICBpZiAobWF0Y2hlcykge1xuICAgIGxldCBwYXJlbnRTYW1wbGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgIGlmIChtYXRjaGVzWzNdID09PSAnMScpIHtcbiAgICAgIHBhcmVudFNhbXBsZWQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAobWF0Y2hlc1szXSA9PT0gJzAnKSB7XG4gICAgICBwYXJlbnRTYW1wbGVkID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0cmFjZUlkOiBtYXRjaGVzWzFdLFxuICAgICAgcGFyZW50U2FtcGxlZCxcbiAgICAgIHBhcmVudFNwYW5JZDogbWF0Y2hlc1syXSxcbiAgICB9O1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKiBHcmFicyBhY3RpdmUgdHJhbnNhY3Rpb24gb2ZmIHNjb3BlLCBpZiBhbnkgKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBY3RpdmVUcmFuc2FjdGlvbjxUIGV4dGVuZHMgVHJhbnNhY3Rpb24+KGh1YjogSHViID0gZ2V0Q3VycmVudEh1YigpKTogVCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBodWI/LmdldFNjb3BlKCk/LmdldFRyYW5zYWN0aW9uKCkgYXMgVCB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBmcm9tIG1pbGxpc2Vjb25kcyB0byBzZWNvbmRzXG4gKiBAcGFyYW0gdGltZSB0aW1lIGluIG1zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtc1RvU2VjKHRpbWU6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiB0aW1lIC8gMTAwMDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBmcm9tIHNlY29uZHMgdG8gbWlsbGlzZWNvbmRzXG4gKiBAcGFyYW0gdGltZSB0aW1lIGluIHNlY29uZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlY1RvTXModGltZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIHRpbWUgKiAxMDAwO1xufVxuXG4vLyBzbyBpdCBjYW4gYmUgdXNlZCBpbiBtYW51YWwgaW5zdHJ1bWVudGF0aW9uIHdpdGhvdXQgbmVjZXNzaXRhdGluZyBhIGhhcmQgZGVwZW5kZW5jeSBvbiBAc2VudHJ5L3V0aWxzXG5leHBvcnQgeyBzdHJpcFVybFF1ZXJ5QW5kRnJhZ21lbnQgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbiIsICJpbXBvcnQgeyBhZGRJbnN0cnVtZW50YXRpb25IYW5kbGVyLCBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW1wb3J0IHsgU3BhblN0YXR1cyB9IGZyb20gJy4vc3BhbnN0YXR1cyc7XG5pbXBvcnQgeyBnZXRBY3RpdmVUcmFuc2FjdGlvbiB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIENvbmZpZ3VyZXMgZ2xvYmFsIGVycm9yIGxpc3RlbmVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJFcnJvckluc3RydW1lbnRhdGlvbigpOiB2b2lkIHtcbiAgYWRkSW5zdHJ1bWVudGF0aW9uSGFuZGxlcih7XG4gICAgY2FsbGJhY2s6IGVycm9yQ2FsbGJhY2ssXG4gICAgdHlwZTogJ2Vycm9yJyxcbiAgfSk7XG4gIGFkZEluc3RydW1lbnRhdGlvbkhhbmRsZXIoe1xuICAgIGNhbGxiYWNrOiBlcnJvckNhbGxiYWNrLFxuICAgIHR5cGU6ICd1bmhhbmRsZWRyZWplY3Rpb24nLFxuICB9KTtcbn1cblxuLyoqXG4gKiBJZiBhbiBlcnJvciBvciB1bmhhbmRsZWQgcHJvbWlzZSBvY2N1cnMsIHdlIG1hcmsgdGhlIGFjdGl2ZSB0cmFuc2FjdGlvbiBhcyBmYWlsZWRcbiAqL1xuZnVuY3Rpb24gZXJyb3JDYWxsYmFjaygpOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZlVHJhbnNhY3Rpb24gPSBnZXRBY3RpdmVUcmFuc2FjdGlvbigpO1xuICBpZiAoYWN0aXZlVHJhbnNhY3Rpb24pIHtcbiAgICBsb2dnZXIubG9nKGBbVHJhY2luZ10gVHJhbnNhY3Rpb246ICR7U3BhblN0YXR1cy5JbnRlcm5hbEVycm9yfSAtPiBHbG9iYWwgZXJyb3Igb2NjdXJlZGApO1xuICAgIGFjdGl2ZVRyYW5zYWN0aW9uLnNldFN0YXR1cyhTcGFuU3RhdHVzLkludGVybmFsRXJyb3IpO1xuICB9XG59XG4iLCAiLy8gU3RvcmUgZmluaXNoIHJlYXNvbnMgaW4gdHVwbGUgdG8gc2F2ZSBvbiBidW5kbGUgc2l6ZVxuLy8gUmVhZG9ubHkgdHlwZSBzaG91bGQgZW5mb3JjZSB0aGF0IHRoaXMgaXMgbm90IG11dGF0ZWQuXG5leHBvcnQgY29uc3QgRklOSVNIX1JFQVNPTl9UQUcgPSAnZmluaXNoUmVhc29uJztcblxuZXhwb3J0IGNvbnN0IElETEVfVFJBTlNBQ1RJT05fRklOSVNIX1JFQVNPTlMgPSBbJ2hlYXJ0YmVhdEZhaWxlZCcsICdpZGxlVGltZW91dCcsICdkb2N1bWVudEhpZGRlbiddIGFzIGNvbnN0O1xuIiwgIi8qIGVzbGludC1kaXNhYmxlIG1heC1saW5lcyAqL1xuaW1wb3J0IHsgUHJpbWl0aXZlLCBTcGFuIGFzIFNwYW5JbnRlcmZhY2UsIFNwYW5Db250ZXh0LCBUcmFuc2FjdGlvbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgZHJvcFVuZGVmaW5lZEtleXMsIHRpbWVzdGFtcFdpdGhNcywgdXVpZDQgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW1wb3J0IHsgU3BhblN0YXR1cyB9IGZyb20gJy4vc3BhbnN0YXR1cyc7XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgZmluaXNoZWQgc3BhbnMgZm9yIGEgZ2l2ZW4gdHJhbnNhY3Rpb25cbiAqIEBpbnRlcm5hbFxuICogQGhpZGVjb25zdHJ1Y3RvclxuICogQGhpZGRlblxuICovXG5leHBvcnQgY2xhc3MgU3BhblJlY29yZGVyIHtcbiAgcHVibGljIHNwYW5zOiBTcGFuW10gPSBbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9tYXhsZW46IG51bWJlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IobWF4bGVuOiBudW1iZXIgPSAxMDAwKSB7XG4gICAgdGhpcy5fbWF4bGVuID0gbWF4bGVuO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMganVzdCBzbyB0aGF0IHdlIGRvbid0IHJ1biBvdXQgb2YgbWVtb3J5IHdoaWxlIHJlY29yZGluZyBhIGxvdFxuICAgKiBvZiBzcGFucy4gQXQgc29tZSBwb2ludCB3ZSBqdXN0IHN0b3AgYW5kIGZsdXNoIG91dCB0aGUgc3RhcnQgb2YgdGhlXG4gICAqIHRyYWNlIHRyZWUgKGkuZS50aGUgZmlyc3QgbiBzcGFucyB3aXRoIHRoZSBzbWFsbGVzdFxuICAgKiBzdGFydF90aW1lc3RhbXApLlxuICAgKi9cbiAgcHVibGljIGFkZChzcGFuOiBTcGFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3BhbnMubGVuZ3RoID4gdGhpcy5fbWF4bGVuKSB7XG4gICAgICBzcGFuLnNwYW5SZWNvcmRlciA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zcGFucy5wdXNoKHNwYW4pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNwYW4gY29udGFpbnMgYWxsIGRhdGEgYWJvdXQgYSBzcGFuXG4gKi9cbmV4cG9ydCBjbGFzcyBTcGFuIGltcGxlbWVudHMgU3BhbkludGVyZmFjZSB7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHRyYWNlSWQ6IHN0cmluZyA9IHV1aWQ0KCk7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3BhbklkOiBzdHJpbmcgPSB1dWlkNCgpLnN1YnN0cmluZygxNik7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgcGFyZW50U3BhbklkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBrZWVwZXIgb2YgdGhlIHN0YXR1c1xuICAgKi9cbiAgcHVibGljIHN0YXR1cz86IFNwYW5TdGF0dXMgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2FtcGxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcCBpbiBzZWNvbmRzIHdoZW4gdGhlIHNwYW4gd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhcnRUaW1lc3RhbXA6IG51bWJlciA9IHRpbWVzdGFtcFdpdGhNcygpO1xuXG4gIC8qKlxuICAgKiBUaW1lc3RhbXAgaW4gc2Vjb25kcyB3aGVuIHRoZSBzcGFuIGVuZGVkLlxuICAgKi9cbiAgcHVibGljIGVuZFRpbWVzdGFtcD86IG51bWJlcjtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBvcD86IHN0cmluZztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyB0YWdzOiB7IFtrZXk6IHN0cmluZ106IFByaW1pdGl2ZSB9ID0ge307XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwdWJsaWMgZGF0YTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIHNwYW5zIHRoYXQgd2VyZSBmaW5hbGl6ZWRcbiAgICovXG4gIHB1YmxpYyBzcGFuUmVjb3JkZXI/OiBTcGFuUmVjb3JkZXI7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgdHJhbnNhY3Rpb24/OiBUcmFuc2FjdGlvbjtcblxuICAvKipcbiAgICogWW91IHNob3VsZCBuZXZlciBjYWxsIHRoZSBjb25zdHJ1Y3RvciBtYW51YWxseSwgYWx3YXlzIHVzZSBgU2VudHJ5LnN0YXJ0VHJhbnNhY3Rpb24oKWBcbiAgICogb3IgY2FsbCBgc3RhcnRDaGlsZCgpYCBvbiBhbiBleGlzdGluZyBzcGFuLlxuICAgKiBAaW50ZXJuYWxcbiAgICogQGhpZGVjb25zdHJ1Y3RvclxuICAgKiBAaGlkZGVuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3Ioc3BhbkNvbnRleHQ/OiBTcGFuQ29udGV4dCkge1xuICAgIGlmICghc3BhbkNvbnRleHQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAoc3BhbkNvbnRleHQudHJhY2VJZCkge1xuICAgICAgdGhpcy50cmFjZUlkID0gc3BhbkNvbnRleHQudHJhY2VJZDtcbiAgICB9XG4gICAgaWYgKHNwYW5Db250ZXh0LnNwYW5JZCkge1xuICAgICAgdGhpcy5zcGFuSWQgPSBzcGFuQ29udGV4dC5zcGFuSWQ7XG4gICAgfVxuICAgIGlmIChzcGFuQ29udGV4dC5wYXJlbnRTcGFuSWQpIHtcbiAgICAgIHRoaXMucGFyZW50U3BhbklkID0gc3BhbkNvbnRleHQucGFyZW50U3BhbklkO1xuICAgIH1cbiAgICAvLyBXZSB3YW50IHRvIGluY2x1ZGUgYm9vbGVhbnMgYXMgd2VsbCBoZXJlXG4gICAgaWYgKCdzYW1wbGVkJyBpbiBzcGFuQ29udGV4dCkge1xuICAgICAgdGhpcy5zYW1wbGVkID0gc3BhbkNvbnRleHQuc2FtcGxlZDtcbiAgICB9XG4gICAgaWYgKHNwYW5Db250ZXh0Lm9wKSB7XG4gICAgICB0aGlzLm9wID0gc3BhbkNvbnRleHQub3A7XG4gICAgfVxuICAgIGlmIChzcGFuQ29udGV4dC5kZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IHNwYW5Db250ZXh0LmRlc2NyaXB0aW9uO1xuICAgIH1cbiAgICBpZiAoc3BhbkNvbnRleHQuZGF0YSkge1xuICAgICAgdGhpcy5kYXRhID0gc3BhbkNvbnRleHQuZGF0YTtcbiAgICB9XG4gICAgaWYgKHNwYW5Db250ZXh0LnRhZ3MpIHtcbiAgICAgIHRoaXMudGFncyA9IHNwYW5Db250ZXh0LnRhZ3M7XG4gICAgfVxuICAgIGlmIChzcGFuQ29udGV4dC5zdGF0dXMpIHtcbiAgICAgIHRoaXMuc3RhdHVzID0gc3BhbkNvbnRleHQuc3RhdHVzO1xuICAgIH1cbiAgICBpZiAoc3BhbkNvbnRleHQuc3RhcnRUaW1lc3RhbXApIHtcbiAgICAgIHRoaXMuc3RhcnRUaW1lc3RhbXAgPSBzcGFuQ29udGV4dC5zdGFydFRpbWVzdGFtcDtcbiAgICB9XG4gICAgaWYgKHNwYW5Db250ZXh0LmVuZFRpbWVzdGFtcCkge1xuICAgICAgdGhpcy5lbmRUaW1lc3RhbXAgPSBzcGFuQ29udGV4dC5lbmRUaW1lc3RhbXA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBwdWJsaWMgY2hpbGQoXG4gICAgc3BhbkNvbnRleHQ/OiBQaWNrPFNwYW5Db250ZXh0LCBFeGNsdWRlPGtleW9mIFNwYW5Db250ZXh0LCAnc3BhbklkJyB8ICdzYW1wbGVkJyB8ICd0cmFjZUlkJyB8ICdwYXJlbnRTcGFuSWQnPj4sXG4gICk6IFNwYW4ge1xuICAgIHJldHVybiB0aGlzLnN0YXJ0Q2hpbGQoc3BhbkNvbnRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3RhcnRDaGlsZChcbiAgICBzcGFuQ29udGV4dD86IFBpY2s8U3BhbkNvbnRleHQsIEV4Y2x1ZGU8a2V5b2YgU3BhbkNvbnRleHQsICdzcGFuSWQnIHwgJ3NhbXBsZWQnIHwgJ3RyYWNlSWQnIHwgJ3BhcmVudFNwYW5JZCc+PixcbiAgKTogU3BhbiB7XG4gICAgY29uc3QgY2hpbGRTcGFuID0gbmV3IFNwYW4oe1xuICAgICAgLi4uc3BhbkNvbnRleHQsXG4gICAgICBwYXJlbnRTcGFuSWQ6IHRoaXMuc3BhbklkLFxuICAgICAgc2FtcGxlZDogdGhpcy5zYW1wbGVkLFxuICAgICAgdHJhY2VJZDogdGhpcy50cmFjZUlkLFxuICAgIH0pO1xuXG4gICAgY2hpbGRTcGFuLnNwYW5SZWNvcmRlciA9IHRoaXMuc3BhblJlY29yZGVyO1xuICAgIGlmIChjaGlsZFNwYW4uc3BhblJlY29yZGVyKSB7XG4gICAgICBjaGlsZFNwYW4uc3BhblJlY29yZGVyLmFkZChjaGlsZFNwYW4pO1xuICAgIH1cblxuICAgIGNoaWxkU3Bhbi50cmFuc2FjdGlvbiA9IHRoaXMudHJhbnNhY3Rpb247XG5cbiAgICByZXR1cm4gY2hpbGRTcGFuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0VGFnKGtleTogc3RyaW5nLCB2YWx1ZTogUHJpbWl0aXZlKTogdGhpcyB7XG4gICAgdGhpcy50YWdzID0geyAuLi50aGlzLnRhZ3MsIFtrZXldOiB2YWx1ZSB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuICBwdWJsaWMgc2V0RGF0YShrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHRoaXMge1xuICAgIHRoaXMuZGF0YSA9IHsgLi4udGhpcy5kYXRhLCBba2V5XTogdmFsdWUgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldFN0YXR1cyh2YWx1ZTogU3BhblN0YXR1cyk6IHRoaXMge1xuICAgIHRoaXMuc3RhdHVzID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXRIdHRwU3RhdHVzKGh0dHBTdGF0dXM6IG51bWJlcik6IHRoaXMge1xuICAgIHRoaXMuc2V0VGFnKCdodHRwLnN0YXR1c19jb2RlJywgU3RyaW5nKGh0dHBTdGF0dXMpKTtcbiAgICBjb25zdCBzcGFuU3RhdHVzID0gU3BhblN0YXR1cy5mcm9tSHR0cENvZGUoaHR0cFN0YXR1cyk7XG4gICAgaWYgKHNwYW5TdGF0dXMgIT09IFNwYW5TdGF0dXMuVW5rbm93bkVycm9yKSB7XG4gICAgICB0aGlzLnNldFN0YXR1cyhzcGFuU3RhdHVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBpc1N1Y2Nlc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBTcGFuU3RhdHVzLk9rO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgZmluaXNoKGVuZFRpbWVzdGFtcD86IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZW5kVGltZXN0YW1wID0gdHlwZW9mIGVuZFRpbWVzdGFtcCA9PT0gJ251bWJlcicgPyBlbmRUaW1lc3RhbXAgOiB0aW1lc3RhbXBXaXRoTXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHRvVHJhY2VwYXJlbnQoKTogc3RyaW5nIHtcbiAgICBsZXQgc2FtcGxlZFN0cmluZyA9ICcnO1xuICAgIGlmICh0aGlzLnNhbXBsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2FtcGxlZFN0cmluZyA9IHRoaXMuc2FtcGxlZCA/ICctMScgOiAnLTAnO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGhpcy50cmFjZUlkfS0ke3RoaXMuc3BhbklkfSR7c2FtcGxlZFN0cmluZ31gO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgdG9Db250ZXh0KCk6IFNwYW5Db250ZXh0IHtcbiAgICByZXR1cm4gZHJvcFVuZGVmaW5lZEtleXMoe1xuICAgICAgZGF0YTogdGhpcy5kYXRhLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICBlbmRUaW1lc3RhbXA6IHRoaXMuZW5kVGltZXN0YW1wLFxuICAgICAgb3A6IHRoaXMub3AsXG4gICAgICBwYXJlbnRTcGFuSWQ6IHRoaXMucGFyZW50U3BhbklkLFxuICAgICAgc2FtcGxlZDogdGhpcy5zYW1wbGVkLFxuICAgICAgc3BhbklkOiB0aGlzLnNwYW5JZCxcbiAgICAgIHN0YXJ0VGltZXN0YW1wOiB0aGlzLnN0YXJ0VGltZXN0YW1wLFxuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgIHRhZ3M6IHRoaXMudGFncyxcbiAgICAgIHRyYWNlSWQ6IHRoaXMudHJhY2VJZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHVwZGF0ZVdpdGhDb250ZXh0KHNwYW5Db250ZXh0OiBTcGFuQ29udGV4dCk6IHRoaXMge1xuICAgIHRoaXMuZGF0YSA9IHNwYW5Db250ZXh0LmRhdGEgPz8ge307XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IHNwYW5Db250ZXh0LmRlc2NyaXB0aW9uO1xuICAgIHRoaXMuZW5kVGltZXN0YW1wID0gc3BhbkNvbnRleHQuZW5kVGltZXN0YW1wO1xuICAgIHRoaXMub3AgPSBzcGFuQ29udGV4dC5vcDtcbiAgICB0aGlzLnBhcmVudFNwYW5JZCA9IHNwYW5Db250ZXh0LnBhcmVudFNwYW5JZDtcbiAgICB0aGlzLnNhbXBsZWQgPSBzcGFuQ29udGV4dC5zYW1wbGVkO1xuICAgIHRoaXMuc3BhbklkID0gc3BhbkNvbnRleHQuc3BhbklkID8/IHRoaXMuc3BhbklkO1xuICAgIHRoaXMuc3RhcnRUaW1lc3RhbXAgPSBzcGFuQ29udGV4dC5zdGFydFRpbWVzdGFtcCA/PyB0aGlzLnN0YXJ0VGltZXN0YW1wO1xuICAgIHRoaXMuc3RhdHVzID0gc3BhbkNvbnRleHQuc3RhdHVzO1xuICAgIHRoaXMudGFncyA9IHNwYW5Db250ZXh0LnRhZ3MgPz8ge307XG4gICAgdGhpcy50cmFjZUlkID0gc3BhbkNvbnRleHQudHJhY2VJZCA/PyB0aGlzLnRyYWNlSWQ7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGdldFRyYWNlQ29udGV4dCgpOiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBkYXRhPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICBvcD86IHN0cmluZztcbiAgICBwYXJlbnRfc3Bhbl9pZD86IHN0cmluZztcbiAgICBzcGFuX2lkOiBzdHJpbmc7XG4gICAgc3RhdHVzPzogc3RyaW5nO1xuICAgIHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IFByaW1pdGl2ZSB9O1xuICAgIHRyYWNlX2lkOiBzdHJpbmc7XG4gIH0ge1xuICAgIHJldHVybiBkcm9wVW5kZWZpbmVkS2V5cyh7XG4gICAgICBkYXRhOiBPYmplY3Qua2V5cyh0aGlzLmRhdGEpLmxlbmd0aCA+IDAgPyB0aGlzLmRhdGEgOiB1bmRlZmluZWQsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIG9wOiB0aGlzLm9wLFxuICAgICAgcGFyZW50X3NwYW5faWQ6IHRoaXMucGFyZW50U3BhbklkLFxuICAgICAgc3Bhbl9pZDogdGhpcy5zcGFuSWQsXG4gICAgICBzdGF0dXM6IHRoaXMuc3RhdHVzLFxuICAgICAgdGFnczogT2JqZWN0LmtleXModGhpcy50YWdzKS5sZW5ndGggPiAwID8gdGhpcy50YWdzIDogdW5kZWZpbmVkLFxuICAgICAgdHJhY2VfaWQ6IHRoaXMudHJhY2VJZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHRvSlNPTigpOiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBkYXRhPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICBvcD86IHN0cmluZztcbiAgICBwYXJlbnRfc3Bhbl9pZD86IHN0cmluZztcbiAgICBzcGFuX2lkOiBzdHJpbmc7XG4gICAgc3RhcnRfdGltZXN0YW1wOiBudW1iZXI7XG4gICAgc3RhdHVzPzogc3RyaW5nO1xuICAgIHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IFByaW1pdGl2ZSB9O1xuICAgIHRpbWVzdGFtcD86IG51bWJlcjtcbiAgICB0cmFjZV9pZDogc3RyaW5nO1xuICB9IHtcbiAgICByZXR1cm4gZHJvcFVuZGVmaW5lZEtleXMoe1xuICAgICAgZGF0YTogT2JqZWN0LmtleXModGhpcy5kYXRhKS5sZW5ndGggPiAwID8gdGhpcy5kYXRhIDogdW5kZWZpbmVkLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICBvcDogdGhpcy5vcCxcbiAgICAgIHBhcmVudF9zcGFuX2lkOiB0aGlzLnBhcmVudFNwYW5JZCxcbiAgICAgIHNwYW5faWQ6IHRoaXMuc3BhbklkLFxuICAgICAgc3RhcnRfdGltZXN0YW1wOiB0aGlzLnN0YXJ0VGltZXN0YW1wLFxuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgIHRhZ3M6IE9iamVjdC5rZXlzKHRoaXMudGFncykubGVuZ3RoID4gMCA/IHRoaXMudGFncyA6IHVuZGVmaW5lZCxcbiAgICAgIHRpbWVzdGFtcDogdGhpcy5lbmRUaW1lc3RhbXAsXG4gICAgICB0cmFjZV9pZDogdGhpcy50cmFjZUlkLFxuICAgIH0pO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgZ2V0Q3VycmVudEh1YiwgSHViIH0gZnJvbSAnQHNlbnRyeS9odWInO1xuaW1wb3J0IHtcbiAgRXZlbnQsXG4gIE1lYXN1cmVtZW50cyxcbiAgT3V0Y29tZSxcbiAgVHJhbnNhY3Rpb24gYXMgVHJhbnNhY3Rpb25JbnRlcmZhY2UsXG4gIFRyYW5zYWN0aW9uQ29udGV4dCxcbiAgVHJhbnNhY3Rpb25NZXRhZGF0YSxcbn0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBkcm9wVW5kZWZpbmVkS2V5cywgaXNJbnN0YW5jZU9mLCBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW1wb3J0IHsgU3BhbiBhcyBTcGFuQ2xhc3MsIFNwYW5SZWNvcmRlciB9IGZyb20gJy4vc3Bhbic7XG5cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uIGV4dGVuZHMgU3BhbkNsYXNzIGltcGxlbWVudHMgVHJhbnNhY3Rpb25JbnRlcmZhY2Uge1xuICBwdWJsaWMgbmFtZTogc3RyaW5nO1xuXG4gIHB1YmxpYyBtZXRhZGF0YTogVHJhbnNhY3Rpb25NZXRhZGF0YTtcblxuICBwcml2YXRlIF9tZWFzdXJlbWVudHM6IE1lYXN1cmVtZW50cyA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGh1Yi5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2h1YjogSHViID0gKGdldEN1cnJlbnRIdWIoKSBhcyB1bmtub3duKSBhcyBIdWI7XG5cbiAgcHJpdmF0ZSBfdHJpbUVuZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoaXMgY29uc3RydWN0b3Igc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBtYW51YWxseS4gVGhvc2UgaW5zdHJ1bWVudGluZyB0cmFjaW5nIHNob3VsZCB1c2VcbiAgICogYFNlbnRyeS5zdGFydFRyYW5zYWN0aW9uKClgLCBhbmQgaW50ZXJuYWwgbWV0aG9kcyBzaG91bGQgdXNlIGBodWIuc3RhcnRUcmFuc2FjdGlvbigpYC5cbiAgICogQGludGVybmFsXG4gICAqIEBoaWRlY29uc3RydWN0b3JcbiAgICogQGhpZGRlblxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRyYW5zYWN0aW9uQ29udGV4dDogVHJhbnNhY3Rpb25Db250ZXh0LCBodWI/OiBIdWIpIHtcbiAgICBzdXBlcih0cmFuc2FjdGlvbkNvbnRleHQpO1xuXG4gICAgaWYgKGlzSW5zdGFuY2VPZihodWIsIEh1YikpIHtcbiAgICAgIHRoaXMuX2h1YiA9IGh1YiBhcyBIdWI7XG4gICAgfVxuXG4gICAgdGhpcy5uYW1lID0gdHJhbnNhY3Rpb25Db250ZXh0Lm5hbWUgfHwgJyc7XG5cbiAgICB0aGlzLm1ldGFkYXRhID0gdHJhbnNhY3Rpb25Db250ZXh0Lm1ldGFkYXRhIHx8IHt9O1xuICAgIHRoaXMuX3RyaW1FbmQgPSB0cmFuc2FjdGlvbkNvbnRleHQudHJpbUVuZDtcblxuICAgIC8vIHRoaXMgaXMgYmVjYXVzZSB0cmFuc2FjdGlvbnMgYXJlIGFsc28gc3BhbnMsIGFuZCBzcGFucyBoYXZlIGEgdHJhbnNhY3Rpb24gcG9pbnRlclxuICAgIHRoaXMudHJhbnNhY3Rpb24gPSB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTRG9jXG4gICAqL1xuICBwdWJsaWMgc2V0TmFtZShuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaGVzIFNwYW5SZWNvcmRlciB0byB0aGUgc3BhbiBpdHNlbGZcbiAgICogQHBhcmFtIG1heGxlbiBtYXhpbXVtIG51bWJlciBvZiBzcGFucyB0aGF0IGNhbiBiZSByZWNvcmRlZFxuICAgKi9cbiAgcHVibGljIGluaXRTcGFuUmVjb3JkZXIobWF4bGVuOiBudW1iZXIgPSAxMDAwKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNwYW5SZWNvcmRlcikge1xuICAgICAgdGhpcy5zcGFuUmVjb3JkZXIgPSBuZXcgU3BhblJlY29yZGVyKG1heGxlbik7XG4gICAgfVxuICAgIHRoaXMuc3BhblJlY29yZGVyLmFkZCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgb2JzZXJ2ZWQgbWVhc3VyZW1lbnRzIGZvciB0aGlzIHRyYW5zYWN0aW9uLlxuICAgKiBAaGlkZGVuXG4gICAqL1xuICBwdWJsaWMgc2V0TWVhc3VyZW1lbnRzKG1lYXN1cmVtZW50czogTWVhc3VyZW1lbnRzKTogdm9pZCB7XG4gICAgdGhpcy5fbWVhc3VyZW1lbnRzID0geyAuLi5tZWFzdXJlbWVudHMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWV0YWRhdGEgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAqIEBoaWRkZW5cbiAgICovXG4gIHB1YmxpYyBzZXRNZXRhZGF0YShuZXdNZXRhZGF0YTogVHJhbnNhY3Rpb25NZXRhZGF0YSk6IHZvaWQge1xuICAgIHRoaXMubWV0YWRhdGEgPSB7IC4uLnRoaXMubWV0YWRhdGEsIC4uLm5ld01ldGFkYXRhIH07XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBmaW5pc2goZW5kVGltZXN0YW1wPzogbnVtYmVyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBUaGlzIHRyYW5zYWN0aW9uIGlzIGFscmVhZHkgZmluaXNoZWQsIHNvIHdlIHNob3VsZCBub3QgZmx1c2ggaXQgYWdhaW4uXG4gICAgaWYgKHRoaXMuZW5kVGltZXN0YW1wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm5hbWUpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdUcmFuc2FjdGlvbiBoYXMgbm8gbmFtZSwgZmFsbGluZyBiYWNrIHRvIGA8dW5sYWJlbGVkIHRyYW5zYWN0aW9uPmAuJyk7XG4gICAgICB0aGlzLm5hbWUgPSAnPHVubGFiZWxlZCB0cmFuc2FjdGlvbj4nO1xuICAgIH1cblxuICAgIC8vIGp1c3Qgc2V0cyB0aGUgZW5kIHRpbWVzdGFtcFxuICAgIHN1cGVyLmZpbmlzaChlbmRUaW1lc3RhbXApO1xuXG4gICAgaWYgKHRoaXMuc2FtcGxlZCAhPT0gdHJ1ZSkge1xuICAgICAgLy8gQXQgdGhpcyBwb2ludCBpZiBgc2FtcGxlZCAhPT0gdHJ1ZWAgd2Ugd2FudCB0byBkaXNjYXJkIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgIGxvZ2dlci5sb2coJ1tUcmFjaW5nXSBEaXNjYXJkaW5nIHRyYW5zYWN0aW9uIGJlY2F1c2UgaXRzIHRyYWNlIHdhcyBub3QgY2hvc2VuIHRvIGJlIHNhbXBsZWQuJyk7XG5cbiAgICAgIHRoaXMuX2h1YlxuICAgICAgICAuZ2V0Q2xpZW50KClcbiAgICAgICAgPy5nZXRUcmFuc3BvcnQ/LigpXG4gICAgICAgIC5yZWNvcmRMb3N0RXZlbnQ/LihPdXRjb21lLlNhbXBsZVJhdGUsICd0cmFuc2FjdGlvbicpO1xuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmlzaGVkU3BhbnMgPSB0aGlzLnNwYW5SZWNvcmRlciA/IHRoaXMuc3BhblJlY29yZGVyLnNwYW5zLmZpbHRlcihzID0+IHMgIT09IHRoaXMgJiYgcy5lbmRUaW1lc3RhbXApIDogW107XG5cbiAgICBpZiAodGhpcy5fdHJpbUVuZCAmJiBmaW5pc2hlZFNwYW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZW5kVGltZXN0YW1wID0gZmluaXNoZWRTcGFucy5yZWR1Y2UoKHByZXY6IFNwYW5DbGFzcywgY3VycmVudDogU3BhbkNsYXNzKSA9PiB7XG4gICAgICAgIGlmIChwcmV2LmVuZFRpbWVzdGFtcCAmJiBjdXJyZW50LmVuZFRpbWVzdGFtcCkge1xuICAgICAgICAgIHJldHVybiBwcmV2LmVuZFRpbWVzdGFtcCA+IGN1cnJlbnQuZW5kVGltZXN0YW1wID8gcHJldiA6IGN1cnJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByZXY7XG4gICAgICB9KS5lbmRUaW1lc3RhbXA7XG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNhY3Rpb246IEV2ZW50ID0ge1xuICAgICAgY29udGV4dHM6IHtcbiAgICAgICAgdHJhY2U6IHRoaXMuZ2V0VHJhY2VDb250ZXh0KCksXG4gICAgICB9LFxuICAgICAgc3BhbnM6IGZpbmlzaGVkU3BhbnMsXG4gICAgICBzdGFydF90aW1lc3RhbXA6IHRoaXMuc3RhcnRUaW1lc3RhbXAsXG4gICAgICB0YWdzOiB0aGlzLnRhZ3MsXG4gICAgICB0aW1lc3RhbXA6IHRoaXMuZW5kVGltZXN0YW1wLFxuICAgICAgdHJhbnNhY3Rpb246IHRoaXMubmFtZSxcbiAgICAgIHR5cGU6ICd0cmFuc2FjdGlvbicsXG4gICAgICBkZWJ1Z19tZXRhOiB0aGlzLm1ldGFkYXRhLFxuICAgIH07XG5cbiAgICBjb25zdCBoYXNNZWFzdXJlbWVudHMgPSBPYmplY3Qua2V5cyh0aGlzLl9tZWFzdXJlbWVudHMpLmxlbmd0aCA+IDA7XG5cbiAgICBpZiAoaGFzTWVhc3VyZW1lbnRzKSB7XG4gICAgICBsb2dnZXIubG9nKCdbTWVhc3VyZW1lbnRzXSBBZGRpbmcgbWVhc3VyZW1lbnRzIHRvIHRyYW5zYWN0aW9uJywgSlNPTi5zdHJpbmdpZnkodGhpcy5fbWVhc3VyZW1lbnRzLCB1bmRlZmluZWQsIDIpKTtcbiAgICAgIHRyYW5zYWN0aW9uLm1lYXN1cmVtZW50cyA9IHRoaXMuX21lYXN1cmVtZW50cztcbiAgICB9XG5cbiAgICBsb2dnZXIubG9nKGBbVHJhY2luZ10gRmluaXNoaW5nICR7dGhpcy5vcH0gdHJhbnNhY3Rpb246ICR7dGhpcy5uYW1lfS5gKTtcblxuICAgIHJldHVybiB0aGlzLl9odWIuY2FwdHVyZUV2ZW50KHRyYW5zYWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHRvQ29udGV4dCgpOiBUcmFuc2FjdGlvbkNvbnRleHQge1xuICAgIGNvbnN0IHNwYW5Db250ZXh0ID0gc3VwZXIudG9Db250ZXh0KCk7XG5cbiAgICByZXR1cm4gZHJvcFVuZGVmaW5lZEtleXMoe1xuICAgICAgLi4uc3BhbkNvbnRleHQsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICB0cmltRW5kOiB0aGlzLl90cmltRW5kLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlV2l0aENvbnRleHQodHJhbnNhY3Rpb25Db250ZXh0OiBUcmFuc2FjdGlvbkNvbnRleHQpOiB0aGlzIHtcbiAgICBzdXBlci51cGRhdGVXaXRoQ29udGV4dCh0cmFuc2FjdGlvbkNvbnRleHQpO1xuXG4gICAgdGhpcy5uYW1lID0gdHJhbnNhY3Rpb25Db250ZXh0Lm5hbWUgPz8gJyc7XG5cbiAgICB0aGlzLl90cmltRW5kID0gdHJhbnNhY3Rpb25Db250ZXh0LnRyaW1FbmQ7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuIiwgImltcG9ydCB7IEh1YiB9IGZyb20gJ0BzZW50cnkvaHViJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ29udGV4dCB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgbG9nZ2VyLCB0aW1lc3RhbXBXaXRoTXMgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW1wb3J0IHsgRklOSVNIX1JFQVNPTl9UQUcsIElETEVfVFJBTlNBQ1RJT05fRklOSVNIX1JFQVNPTlMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBTcGFuLCBTcGFuUmVjb3JkZXIgfSBmcm9tICcuL3NwYW4nO1xuaW1wb3J0IHsgU3BhblN0YXR1cyB9IGZyb20gJy4vc3BhbnN0YXR1cyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9JRExFX1RJTUVPVVQgPSAxMDAwO1xuZXhwb3J0IGNvbnN0IEhFQVJUQkVBVF9JTlRFUlZBTCA9IDUwMDA7XG5cbi8qKlxuICogQGluaGVyaXREb2NcbiAqL1xuZXhwb3J0IGNsYXNzIElkbGVUcmFuc2FjdGlvblNwYW5SZWNvcmRlciBleHRlbmRzIFNwYW5SZWNvcmRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9wdXNoQWN0aXZpdHk6IChpZDogc3RyaW5nKSA9PiB2b2lkLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3BvcEFjdGl2aXR5OiAoaWQ6IHN0cmluZykgPT4gdm9pZCxcbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25TcGFuSWQ6IHN0cmluZyA9ICcnLFxuICAgIG1heGxlbj86IG51bWJlcixcbiAgKSB7XG4gICAgc3VwZXIobWF4bGVuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGFkZChzcGFuOiBTcGFuKTogdm9pZCB7XG4gICAgLy8gV2Ugc2hvdWxkIG1ha2Ugc3VyZSB3ZSBkbyBub3QgcHVzaCBhbmQgcG9wIGFjdGl2aXRpZXMgZm9yXG4gICAgLy8gdGhlIHRyYW5zYWN0aW9uIHRoYXQgdGhpcyBzcGFuIHJlY29yZGVyIGJlbG9uZ3MgdG8uXG4gICAgaWYgKHNwYW4uc3BhbklkICE9PSB0aGlzLnRyYW5zYWN0aW9uU3BhbklkKSB7XG4gICAgICAvLyBXZSBwYXRjaCBzcGFuLmZpbmlzaCgpIHRvIHBvcCBhbiBhY3Rpdml0eSBhZnRlciBzZXR0aW5nIGFuIGVuZFRpbWVzdGFtcC5cbiAgICAgIHNwYW4uZmluaXNoID0gKGVuZFRpbWVzdGFtcD86IG51bWJlcikgPT4ge1xuICAgICAgICBzcGFuLmVuZFRpbWVzdGFtcCA9IHR5cGVvZiBlbmRUaW1lc3RhbXAgPT09ICdudW1iZXInID8gZW5kVGltZXN0YW1wIDogdGltZXN0YW1wV2l0aE1zKCk7XG4gICAgICAgIHRoaXMuX3BvcEFjdGl2aXR5KHNwYW4uc3BhbklkKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFdlIHNob3VsZCBvbmx5IHB1c2ggbmV3IGFjdGl2aXRpZXMgaWYgdGhlIHNwYW4gZG9lcyBub3QgaGF2ZSBhbiBlbmQgdGltZXN0YW1wLlxuICAgICAgaWYgKHNwYW4uZW5kVGltZXN0YW1wID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fcHVzaEFjdGl2aXR5KHNwYW4uc3BhbklkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdXBlci5hZGQoc3Bhbik7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgQmVmb3JlRmluaXNoQ2FsbGJhY2sgPSAodHJhbnNhY3Rpb25TcGFuOiBJZGxlVHJhbnNhY3Rpb24sIGVuZFRpbWVzdGFtcDogbnVtYmVyKSA9PiB2b2lkO1xuXG4vKipcbiAqIEFuIElkbGVUcmFuc2FjdGlvbiBpcyBhIHRyYW5zYWN0aW9uIHRoYXQgYXV0b21hdGljYWxseSBmaW5pc2hlcy4gSXQgZG9lcyB0aGlzIGJ5IHRyYWNraW5nIGNoaWxkIHNwYW5zIGFzIGFjdGl2aXRpZXMuXG4gKiBZb3UgY2FuIGhhdmUgbXVsdGlwbGUgSWRsZVRyYW5zYWN0aW9ucyBhY3RpdmUsIGJ1dCBpZiB0aGUgYG9uU2NvcGVgIG9wdGlvbiBpcyBzcGVjaWZpZWQsIHRoZSBpZGxlIHRyYW5zYWN0aW9uIHdpbGxcbiAqIHB1dCBpdHNlbGYgb24gdGhlIHNjb3BlIG9uIGNyZWF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgSWRsZVRyYW5zYWN0aW9uIGV4dGVuZHMgVHJhbnNhY3Rpb24ge1xuICAvLyBBY3Rpdml0aWVzIHN0b3JlIGEgbGlzdCBvZiBhY3RpdmUgc3BhbnNcbiAgcHVibGljIGFjdGl2aXRpZXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG5cbiAgLy8gVHJhY2sgc3RhdGUgb2YgYWN0aXZpdGllcyBpbiBwcmV2aW91cyBoZWFydGJlYXRcbiAgcHJpdmF0ZSBfcHJldkhlYXJ0YmVhdFN0cmluZzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8vIEFtb3VudCBvZiB0aW1lcyBoZWFydGJlYXQgaGFzIGNvdW50ZWQuIFdpbGwgY2F1c2UgdHJhbnNhY3Rpb24gdG8gZmluaXNoIGFmdGVyIDMgYmVhdHMuXG4gIHByaXZhdGUgX2hlYXJ0YmVhdENvdW50ZXI6IG51bWJlciA9IDA7XG5cbiAgLy8gV2Ugc2hvdWxkIG5vdCB1c2UgaGVhcnRiZWF0IGlmIHdlIGZpbmlzaGVkIGEgdHJhbnNhY3Rpb25cbiAgcHJpdmF0ZSBfZmluaXNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9iZWZvcmVGaW5pc2hDYWxsYmFja3M6IEJlZm9yZUZpbmlzaENhbGxiYWNrW10gPSBbXTtcblxuICAvKipcbiAgICogSWYgYSB0cmFuc2FjdGlvbiBpcyBjcmVhdGVkIGFuZCBubyBhY3Rpdml0aWVzIGFyZSBhZGRlZCwgd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdFxuICAgKiBpdCB0aW1lcyBvdXQgcHJvcGVybHkuIFRoaXMgaXMgY2xlYXJlZCBhbmQgbm90IHVzZWQgd2hlbiBhY3Rpdml0aWVzIGFyZSBhZGRlZC5cbiAgICovXG4gIHByaXZhdGUgX2luaXRUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgdHJhbnNhY3Rpb25Db250ZXh0OiBUcmFuc2FjdGlvbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaWRsZUh1Yj86IEh1YixcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB0byB3YWl0IGluIG1zIHVudGlsIHRoZSBpZGxlIHRyYW5zYWN0aW9uIHdpbGwgYmUgZmluaXNoZWQuXG4gICAgICogQGRlZmF1bHQgMTAwMFxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2lkbGVUaW1lb3V0OiBudW1iZXIgPSBERUZBVUxUX0lETEVfVElNRU9VVCxcbiAgICAvLyBJZiBhbiBpZGxlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBwdXQgaXRzZWxmIG9uIGFuZCBvZmYgdGhlIHNjb3BlIGF1dG9tYXRpY2FsbHkuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb25TY29wZTogYm9vbGVhbiA9IGZhbHNlLFxuICApIHtcbiAgICBzdXBlcih0cmFuc2FjdGlvbkNvbnRleHQsIF9pZGxlSHViKTtcblxuICAgIGlmIChfaWRsZUh1YiAmJiBfb25TY29wZSkge1xuICAgICAgLy8gVGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIGFjdGl2ZSB0cmFuc2FjdGlvbiBvbiB0aGUgc2NvcGVcbiAgICAgIGNsZWFyQWN0aXZlVHJhbnNhY3Rpb24oX2lkbGVIdWIpO1xuXG4gICAgICAvLyBXZSBzZXQgdGhlIHRyYW5zYWN0aW9uIGhlcmUgb24gdGhlIHNjb3BlIHNvIGVycm9yIGV2ZW50cyBwaWNrIHVwIHRoZSB0cmFjZVxuICAgICAgLy8gY29udGV4dCBhbmQgYXR0YWNoIGl0IHRvIHRoZSBlcnJvci5cbiAgICAgIGxvZ2dlci5sb2coYFNldHRpbmcgaWRsZSB0cmFuc2FjdGlvbiBvbiBzY29wZS4gU3BhbiBJRDogJHt0aGlzLnNwYW5JZH1gKTtcbiAgICAgIF9pZGxlSHViLmNvbmZpZ3VyZVNjb3BlKHNjb3BlID0+IHNjb3BlLnNldFNwYW4odGhpcykpO1xuICAgIH1cblxuICAgIHRoaXMuX2luaXRUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2ZpbmlzaGVkKSB7XG4gICAgICAgIHRoaXMuZmluaXNoKCk7XG4gICAgICB9XG4gICAgfSwgdGhpcy5faWRsZVRpbWVvdXQpO1xuICB9XG5cbiAgLyoqIHtAaW5oZXJpdERvY30gKi9cbiAgcHVibGljIGZpbmlzaChlbmRUaW1lc3RhbXA6IG51bWJlciA9IHRpbWVzdGFtcFdpdGhNcygpKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICB0aGlzLl9maW5pc2hlZCA9IHRydWU7XG4gICAgdGhpcy5hY3Rpdml0aWVzID0ge307XG5cbiAgICBpZiAodGhpcy5zcGFuUmVjb3JkZXIpIHtcbiAgICAgIGxvZ2dlci5sb2coJ1tUcmFjaW5nXSBmaW5pc2hpbmcgSWRsZVRyYW5zYWN0aW9uJywgbmV3IERhdGUoZW5kVGltZXN0YW1wICogMTAwMCkudG9JU09TdHJpbmcoKSwgdGhpcy5vcCk7XG5cbiAgICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgdGhpcy5fYmVmb3JlRmluaXNoQ2FsbGJhY2tzKSB7XG4gICAgICAgIGNhbGxiYWNrKHRoaXMsIGVuZFRpbWVzdGFtcCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3BhblJlY29yZGVyLnNwYW5zID0gdGhpcy5zcGFuUmVjb3JkZXIuc3BhbnMuZmlsdGVyKChzcGFuOiBTcGFuKSA9PiB7XG4gICAgICAgIC8vIElmIHdlIGFyZSBkZWFsaW5nIHdpdGggdGhlIHRyYW5zYWN0aW9uIGl0c2VsZiwgd2UganVzdCByZXR1cm4gaXRcbiAgICAgICAgaWYgKHNwYW4uc3BhbklkID09PSB0aGlzLnNwYW5JZCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgY2FuY2VsIGFsbCBwZW5kaW5nIHNwYW5zIHdpdGggc3RhdHVzIFwiY2FuY2VsbGVkXCIgdG8gaW5kaWNhdGUgdGhlIGlkbGUgdHJhbnNhY3Rpb24gd2FzIGZpbmlzaGVkIGVhcmx5XG4gICAgICAgIGlmICghc3Bhbi5lbmRUaW1lc3RhbXApIHtcbiAgICAgICAgICBzcGFuLmVuZFRpbWVzdGFtcCA9IGVuZFRpbWVzdGFtcDtcbiAgICAgICAgICBzcGFuLnNldFN0YXR1cyhTcGFuU3RhdHVzLkNhbmNlbGxlZCk7XG4gICAgICAgICAgbG9nZ2VyLmxvZygnW1RyYWNpbmddIGNhbmNlbGxpbmcgc3BhbiBzaW5jZSB0cmFuc2FjdGlvbiBlbmRlZCBlYXJseScsIEpTT04uc3RyaW5naWZ5KHNwYW4sIHVuZGVmaW5lZCwgMikpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2VlcFNwYW4gPSBzcGFuLnN0YXJ0VGltZXN0YW1wIDwgZW5kVGltZXN0YW1wO1xuICAgICAgICBpZiAoIWtlZXBTcGFuKSB7XG4gICAgICAgICAgbG9nZ2VyLmxvZyhcbiAgICAgICAgICAgICdbVHJhY2luZ10gZGlzY2FyZGluZyBTcGFuIHNpbmNlIGl0IGhhcHBlbmVkIGFmdGVyIFRyYW5zYWN0aW9uIHdhcyBmaW5pc2hlZCcsXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShzcGFuLCB1bmRlZmluZWQsIDIpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtlZXBTcGFuO1xuICAgICAgfSk7XG5cbiAgICAgIGxvZ2dlci5sb2coJ1tUcmFjaW5nXSBmbHVzaGluZyBJZGxlVHJhbnNhY3Rpb24nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmxvZygnW1RyYWNpbmddIE5vIGFjdGl2ZSBJZGxlVHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzLl9vblNjb3BlIGlzIHRydWUgaWYgdGhlIHRyYW5zYWN0aW9uIHdhcyBwcmV2aW91c2x5IG9uIHRoZSBzY29wZS5cbiAgICBpZiAodGhpcy5fb25TY29wZSkge1xuICAgICAgY2xlYXJBY3RpdmVUcmFuc2FjdGlvbih0aGlzLl9pZGxlSHViKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuZmluaXNoKGVuZFRpbWVzdGFtcCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGdldHMgZXhjZWN1dGVkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gZmluaXNoZXMuXG4gICAqIFVzZWZ1bCBmb3IgY2xlYW51cCBvciBpZiB5b3Ugd2FudCB0byBhZGQgYW55IGFkZGl0aW9uYWwgc3BhbnMgYmFzZWQgb24gY3VycmVudCBjb250ZXh0LlxuICAgKlxuICAgKiBUaGlzIGlzIGV4cG9zZWQgYmVjYXVzZSB1c2VycyBoYXZlIG5vIG90aGVyIHdheSBvZiBydW5uaW5nIHNvbWV0aGluZyBiZWZvcmUgYW4gaWRsZSB0cmFuc2FjdGlvblxuICAgKiBmaW5pc2hlcy5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlckJlZm9yZUZpbmlzaENhbGxiYWNrKGNhbGxiYWNrOiBCZWZvcmVGaW5pc2hDYWxsYmFjayk6IHZvaWQge1xuICAgIHRoaXMuX2JlZm9yZUZpbmlzaENhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGluaXRTcGFuUmVjb3JkZXIobWF4bGVuPzogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNwYW5SZWNvcmRlcikge1xuICAgICAgY29uc3QgcHVzaEFjdGl2aXR5ID0gKGlkOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2ZpbmlzaGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3B1c2hBY3Rpdml0eShpZCk7XG4gICAgICB9O1xuICAgICAgY29uc3QgcG9wQWN0aXZpdHkgPSAoaWQ6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAodGhpcy5fZmluaXNoZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcG9wQWN0aXZpdHkoaWQpO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5zcGFuUmVjb3JkZXIgPSBuZXcgSWRsZVRyYW5zYWN0aW9uU3BhblJlY29yZGVyKHB1c2hBY3Rpdml0eSwgcG9wQWN0aXZpdHksIHRoaXMuc3BhbklkLCBtYXhsZW4pO1xuXG4gICAgICAvLyBTdGFydCBoZWFydGJlYXQgc28gdGhhdCB0cmFuc2FjdGlvbnMgZG8gbm90IHJ1biBmb3JldmVyLlxuICAgICAgbG9nZ2VyLmxvZygnU3RhcnRpbmcgaGVhcnRiZWF0Jyk7XG4gICAgICB0aGlzLl9waW5nSGVhcnRiZWF0KCk7XG4gICAgfVxuICAgIHRoaXMuc3BhblJlY29yZGVyLmFkZCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCB0cmFja2luZyBhIHNwZWNpZmljIGFjdGl2aXR5LlxuICAgKiBAcGFyYW0gc3BhbklkIFRoZSBzcGFuIGlkIHRoYXQgcmVwcmVzZW50cyB0aGUgYWN0aXZpdHlcbiAgICovXG4gIHByaXZhdGUgX3B1c2hBY3Rpdml0eShzcGFuSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pbml0VGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2luaXRUaW1lb3V0KTtcbiAgICAgIHRoaXMuX2luaXRUaW1lb3V0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsb2dnZXIubG9nKGBbVHJhY2luZ10gcHVzaEFjdGl2aXR5OiAke3NwYW5JZH1gKTtcbiAgICB0aGlzLmFjdGl2aXRpZXNbc3BhbklkXSA9IHRydWU7XG4gICAgbG9nZ2VyLmxvZygnW1RyYWNpbmddIG5ldyBhY3Rpdml0aWVzIGNvdW50JywgT2JqZWN0LmtleXModGhpcy5hY3Rpdml0aWVzKS5sZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBhY3Rpdml0eSBmcm9tIHVzYWdlXG4gICAqIEBwYXJhbSBzcGFuSWQgVGhlIHNwYW4gaWQgdGhhdCByZXByZXNlbnRzIHRoZSBhY3Rpdml0eVxuICAgKi9cbiAgcHJpdmF0ZSBfcG9wQWN0aXZpdHkoc3BhbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hY3Rpdml0aWVzW3NwYW5JZF0pIHtcbiAgICAgIGxvZ2dlci5sb2coYFtUcmFjaW5nXSBwb3BBY3Rpdml0eSAke3NwYW5JZH1gKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSB0aGlzLmFjdGl2aXRpZXNbc3BhbklkXTtcbiAgICAgIGxvZ2dlci5sb2coJ1tUcmFjaW5nXSBuZXcgYWN0aXZpdGllcyBjb3VudCcsIE9iamVjdC5rZXlzKHRoaXMuYWN0aXZpdGllcykubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5hY3Rpdml0aWVzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLl9pZGxlVGltZW91dDtcbiAgICAgIC8vIFdlIG5lZWQgdG8gYWRkIHRoZSB0aW1lb3V0IGhlcmUgdG8gaGF2ZSB0aGUgcmVhbCBlbmR0aW1lc3RhbXAgb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAgICAvLyBSZW1lbWJlciB0aW1lc3RhbXBXaXRoTXMgaXMgaW4gc2Vjb25kcywgdGltZW91dCBpcyBpbiBtc1xuICAgICAgY29uc3QgZW5kID0gdGltZXN0YW1wV2l0aE1zKCkgKyB0aW1lb3V0IC8gMTAwMDtcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5fZmluaXNoZWQpIHtcbiAgICAgICAgICB0aGlzLnNldFRhZyhGSU5JU0hfUkVBU09OX1RBRywgSURMRV9UUkFOU0FDVElPTl9GSU5JU0hfUkVBU09OU1sxXSk7XG4gICAgICAgICAgdGhpcy5maW5pc2goZW5kKTtcbiAgICAgICAgfVxuICAgICAgfSwgdGltZW91dCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGVuIGVudHJpZXMgb2YgdGhpcy5hY3Rpdml0aWVzIGFyZSBub3QgY2hhbmdpbmcgZm9yIDMgYmVhdHMuXG4gICAqIElmIHRoaXMgb2NjdXJzIHdlIGZpbmlzaCB0aGUgdHJhbnNhY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIF9iZWF0KCk6IHZvaWQge1xuICAgIC8vIFdlIHNob3VsZCBub3QgYmUgcnVubmluZyBoZWFydGJlYXQgaWYgdGhlIGlkbGUgdHJhbnNhY3Rpb24gaXMgZmluaXNoZWQuXG4gICAgaWYgKHRoaXMuX2ZpbmlzaGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaGVhcnRiZWF0U3RyaW5nID0gT2JqZWN0LmtleXModGhpcy5hY3Rpdml0aWVzKS5qb2luKCcnKTtcblxuICAgIGlmIChoZWFydGJlYXRTdHJpbmcgPT09IHRoaXMuX3ByZXZIZWFydGJlYXRTdHJpbmcpIHtcbiAgICAgIHRoaXMuX2hlYXJ0YmVhdENvdW50ZXIgKz0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faGVhcnRiZWF0Q291bnRlciA9IDE7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJldkhlYXJ0YmVhdFN0cmluZyA9IGhlYXJ0YmVhdFN0cmluZztcblxuICAgIGlmICh0aGlzLl9oZWFydGJlYXRDb3VudGVyID49IDMpIHtcbiAgICAgIGxvZ2dlci5sb2coYFtUcmFjaW5nXSBUcmFuc2FjdGlvbiBmaW5pc2hlZCBiZWNhdXNlIG9mIG5vIGNoYW5nZSBmb3IgMyBoZWFydCBiZWF0c2ApO1xuICAgICAgdGhpcy5zZXRTdGF0dXMoU3BhblN0YXR1cy5EZWFkbGluZUV4Y2VlZGVkKTtcbiAgICAgIHRoaXMuc2V0VGFnKEZJTklTSF9SRUFTT05fVEFHLCBJRExFX1RSQU5TQUNUSU9OX0ZJTklTSF9SRUFTT05TWzBdKTtcbiAgICAgIHRoaXMuZmluaXNoKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3BpbmdIZWFydGJlYXQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGluZ3MgdGhlIGhlYXJ0YmVhdFxuICAgKi9cbiAgcHJpdmF0ZSBfcGluZ0hlYXJ0YmVhdCgpOiB2b2lkIHtcbiAgICBsb2dnZXIubG9nKGBwaW5naW5nIEhlYXJ0YmVhdCAtPiBjdXJyZW50IGNvdW50ZXI6ICR7dGhpcy5faGVhcnRiZWF0Q291bnRlcn1gKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX2JlYXQoKTtcbiAgICB9LCBIRUFSVEJFQVRfSU5URVJWQUwpO1xuICB9XG59XG5cbi8qKlxuICogUmVzZXQgYWN0aXZlIHRyYW5zYWN0aW9uIG9uIHNjb3BlXG4gKi9cbmZ1bmN0aW9uIGNsZWFyQWN0aXZlVHJhbnNhY3Rpb24oaHViPzogSHViKTogdm9pZCB7XG4gIGlmIChodWIpIHtcbiAgICBjb25zdCBzY29wZSA9IGh1Yi5nZXRTY29wZSgpO1xuICAgIGlmIChzY29wZSkge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBzY29wZS5nZXRUcmFuc2FjdGlvbigpO1xuICAgICAgaWYgKHRyYW5zYWN0aW9uKSB7XG4gICAgICAgIHNjb3BlLnNldFNwYW4odW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBnZXRNYWluQ2FycmllciwgSHViIH0gZnJvbSAnQHNlbnRyeS9odWInO1xuaW1wb3J0IHtcbiAgQ3VzdG9tU2FtcGxpbmdDb250ZXh0LFxuICBJbnRlZ3JhdGlvbixcbiAgSW50ZWdyYXRpb25DbGFzcyxcbiAgT3B0aW9ucyxcbiAgU2FtcGxpbmdDb250ZXh0LFxuICBUcmFuc2FjdGlvbkNvbnRleHQsXG4gIFRyYW5zYWN0aW9uU2FtcGxpbmdNZXRob2QsXG59IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgZHluYW1pY1JlcXVpcmUsIGlzTm9kZUVudiwgbG9hZE1vZHVsZSwgbG9nZ2VyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmltcG9ydCB7IHJlZ2lzdGVyRXJyb3JJbnN0cnVtZW50YXRpb24gfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBJZGxlVHJhbnNhY3Rpb24gfSBmcm9tICcuL2lkbGV0cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgaGFzVHJhY2luZ0VuYWJsZWQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqIFJldHVybnMgYWxsIHRyYWNlIGhlYWRlcnMgdGhhdCBhcmUgY3VycmVudGx5IG9uIHRoZSB0b3Agc2NvcGUuICovXG5mdW5jdGlvbiB0cmFjZUhlYWRlcnModGhpczogSHViKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gIGNvbnN0IHNjb3BlID0gdGhpcy5nZXRTY29wZSgpO1xuICBpZiAoc2NvcGUpIHtcbiAgICBjb25zdCBzcGFuID0gc2NvcGUuZ2V0U3BhbigpO1xuICAgIGlmIChzcGFuKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnc2VudHJ5LXRyYWNlJzogc3Bhbi50b1RyYWNlcGFyZW50KCksXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4ge307XG59XG5cbi8qKlxuICogTWFrZXMgYSBzYW1wbGluZyBkZWNpc2lvbiBmb3IgdGhlIGdpdmVuIHRyYW5zYWN0aW9uIGFuZCBzdG9yZXMgaXQgb24gdGhlIHRyYW5zYWN0aW9uLlxuICpcbiAqIENhbGxlZCBldmVyeSB0aW1lIGEgdHJhbnNhY3Rpb24gaXMgY3JlYXRlZC4gT25seSB0cmFuc2FjdGlvbnMgd2hpY2ggZW1lcmdlIHdpdGggYSBgc2FtcGxlZGAgdmFsdWUgb2YgYHRydWVgIHdpbGwgYmVcbiAqIHNlbnQgdG8gU2VudHJ5LlxuICpcbiAqIEBwYXJhbSBodWI6IFRoZSBodWIgb2ZmIG9mIHdoaWNoIHRvIHJlYWQgY29uZmlnIG9wdGlvbnNcbiAqIEBwYXJhbSB0cmFuc2FjdGlvbjogVGhlIHRyYW5zYWN0aW9uIG5lZWRpbmcgYSBzYW1wbGluZyBkZWNpc2lvblxuICogQHBhcmFtIHNhbXBsaW5nQ29udGV4dDogRGVmYXVsdCBhbmQgdXNlci1wcm92aWRlZCBkYXRhIHdoaWNoIG1heSBiZSB1c2VkIHRvIGhlbHAgbWFrZSB0aGUgZGVjaXNpb25cbiAqXG4gKiBAcmV0dXJucyBUaGUgZ2l2ZW4gdHJhbnNhY3Rpb24gd2l0aCBpdHMgYHNhbXBsZWRgIHZhbHVlIHNldFxuICovXG5mdW5jdGlvbiBzYW1wbGU8VCBleHRlbmRzIFRyYW5zYWN0aW9uPih0cmFuc2FjdGlvbjogVCwgb3B0aW9uczogT3B0aW9ucywgc2FtcGxpbmdDb250ZXh0OiBTYW1wbGluZ0NvbnRleHQpOiBUIHtcbiAgLy8gbm90aGluZyB0byBkbyBpZiB0cmFjaW5nIGlzIG5vdCBlbmFibGVkXG4gIGlmICghaGFzVHJhY2luZ0VuYWJsZWQob3B0aW9ucykpIHtcbiAgICB0cmFuc2FjdGlvbi5zYW1wbGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLy8gaWYgdGhlIHVzZXIgaGFzIGZvcmNlZCBhIHNhbXBsaW5nIGRlY2lzaW9uIGJ5IHBhc3NpbmcgYSBgc2FtcGxlZGAgdmFsdWUgaW4gdGhlaXIgdHJhbnNhY3Rpb24gY29udGV4dCwgZ28gd2l0aCB0aGF0XG4gIGlmICh0cmFuc2FjdGlvbi5zYW1wbGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICB0cmFuc2FjdGlvbi5zZXRNZXRhZGF0YSh7XG4gICAgICB0cmFuc2FjdGlvblNhbXBsaW5nOiB7IG1ldGhvZDogVHJhbnNhY3Rpb25TYW1wbGluZ01ldGhvZC5FeHBsaWNpdCB9LFxuICAgIH0pO1xuICAgIHJldHVybiB0cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8vIHdlIHdvdWxkIGhhdmUgYmFpbGVkIGFscmVhZHkgaWYgbmVpdGhlciBgdHJhY2VzU2FtcGxlcmAgbm9yIGB0cmFjZXNTYW1wbGVSYXRlYCB3ZXJlIGRlZmluZWQsIHNvIG9uZSBvZiB0aGVzZSBzaG91bGRcbiAgLy8gd29yazsgcHJlZmVyIHRoZSBob29rIGlmIHNvXG4gIGxldCBzYW1wbGVSYXRlO1xuICBpZiAodHlwZW9mIG9wdGlvbnMudHJhY2VzU2FtcGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHNhbXBsZVJhdGUgPSBvcHRpb25zLnRyYWNlc1NhbXBsZXIoc2FtcGxpbmdDb250ZXh0KTtcbiAgICB0cmFuc2FjdGlvbi5zZXRNZXRhZGF0YSh7XG4gICAgICB0cmFuc2FjdGlvblNhbXBsaW5nOiB7XG4gICAgICAgIG1ldGhvZDogVHJhbnNhY3Rpb25TYW1wbGluZ01ldGhvZC5TYW1wbGVyLFxuICAgICAgICAvLyBjYXN0IHRvIG51bWJlciBpbiBjYXNlIGl0J3MgYSBib29sZWFuXG4gICAgICAgIHJhdGU6IE51bWJlcihzYW1wbGVSYXRlKSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoc2FtcGxpbmdDb250ZXh0LnBhcmVudFNhbXBsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgIHNhbXBsZVJhdGUgPSBzYW1wbGluZ0NvbnRleHQucGFyZW50U2FtcGxlZDtcbiAgICB0cmFuc2FjdGlvbi5zZXRNZXRhZGF0YSh7XG4gICAgICB0cmFuc2FjdGlvblNhbXBsaW5nOiB7IG1ldGhvZDogVHJhbnNhY3Rpb25TYW1wbGluZ01ldGhvZC5Jbmhlcml0YW5jZSB9LFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHNhbXBsZVJhdGUgPSBvcHRpb25zLnRyYWNlc1NhbXBsZVJhdGU7XG4gICAgdHJhbnNhY3Rpb24uc2V0TWV0YWRhdGEoe1xuICAgICAgdHJhbnNhY3Rpb25TYW1wbGluZzoge1xuICAgICAgICBtZXRob2Q6IFRyYW5zYWN0aW9uU2FtcGxpbmdNZXRob2QuUmF0ZSxcbiAgICAgICAgLy8gY2FzdCB0byBudW1iZXIgaW4gY2FzZSBpdCdzIGEgYm9vbGVhblxuICAgICAgICByYXRlOiBOdW1iZXIoc2FtcGxlUmF0ZSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gU2luY2UgdGhpcyBpcyBjb21pbmcgZnJvbSB0aGUgdXNlciAob3IgZnJvbSBhIGZ1bmN0aW9uIHByb3ZpZGVkIGJ5IHRoZSB1c2VyKSwgd2hvIGtub3dzIHdoYXQgd2UgbWlnaHQgZ2V0LiAoVGhlXG4gIC8vIG9ubHkgdmFsaWQgdmFsdWVzIGFyZSBib29sZWFucyBvciBudW1iZXJzIGJldHdlZW4gMCBhbmQgMS4pXG4gIGlmICghaXNWYWxpZFNhbXBsZVJhdGUoc2FtcGxlUmF0ZSkpIHtcbiAgICBsb2dnZXIud2FybihgW1RyYWNpbmddIERpc2NhcmRpbmcgdHJhbnNhY3Rpb24gYmVjYXVzZSBvZiBpbnZhbGlkIHNhbXBsZSByYXRlLmApO1xuICAgIHRyYW5zYWN0aW9uLnNhbXBsZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gdHJhbnNhY3Rpb247XG4gIH1cblxuICAvLyBpZiB0aGUgZnVuY3Rpb24gcmV0dXJuZWQgMCAob3IgZmFsc2UpLCBvciBpZiBgdHJhY2VzU2FtcGxlUmF0ZWAgaXMgMCwgaXQncyBhIHNpZ24gdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBkcm9wcGVkXG4gIGlmICghc2FtcGxlUmF0ZSkge1xuICAgIGxvZ2dlci5sb2coXG4gICAgICBgW1RyYWNpbmddIERpc2NhcmRpbmcgdHJhbnNhY3Rpb24gYmVjYXVzZSAke1xuICAgICAgICB0eXBlb2Ygb3B0aW9ucy50cmFjZXNTYW1wbGVyID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgPyAndHJhY2VzU2FtcGxlciByZXR1cm5lZCAwIG9yIGZhbHNlJ1xuICAgICAgICAgIDogJ2EgbmVnYXRpdmUgc2FtcGxpbmcgZGVjaXNpb24gd2FzIGluaGVyaXRlZCBvciB0cmFjZXNTYW1wbGVSYXRlIGlzIHNldCB0byAwJ1xuICAgICAgfWAsXG4gICAgKTtcbiAgICB0cmFuc2FjdGlvbi5zYW1wbGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLy8gTm93IHdlIHJvbGwgdGhlIGRpY2UuIE1hdGgucmFuZG9tIGlzIGluY2x1c2l2ZSBvZiAwLCBidXQgbm90IG9mIDEsIHNvIHN0cmljdCA8IGlzIHNhZmUgaGVyZS4gSW4gY2FzZSBzYW1wbGVSYXRlIGlzXG4gIC8vIGEgYm9vbGVhbiwgdGhlIDwgY29tcGFyaXNvbiB3aWxsIGNhdXNlIGl0IHRvIGJlIGF1dG9tYXRpY2FsbHkgY2FzdCB0byAxIGlmIGl0J3MgdHJ1ZSBhbmQgMCBpZiBpdCdzIGZhbHNlLlxuICB0cmFuc2FjdGlvbi5zYW1wbGVkID0gTWF0aC5yYW5kb20oKSA8IChzYW1wbGVSYXRlIGFzIG51bWJlciB8IGJvb2xlYW4pO1xuXG4gIC8vIGlmIHdlJ3JlIG5vdCBnb2luZyB0byBrZWVwIGl0LCB3ZSdyZSBkb25lXG4gIGlmICghdHJhbnNhY3Rpb24uc2FtcGxlZCkge1xuICAgIGxvZ2dlci5sb2coXG4gICAgICBgW1RyYWNpbmddIERpc2NhcmRpbmcgdHJhbnNhY3Rpb24gYmVjYXVzZSBpdCdzIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmFuZG9tIHNhbXBsZSAoc2FtcGxpbmcgcmF0ZSA9ICR7TnVtYmVyKFxuICAgICAgICBzYW1wbGVSYXRlLFxuICAgICAgKX0pYCxcbiAgICApO1xuICAgIHJldHVybiB0cmFuc2FjdGlvbjtcbiAgfVxuXG4gIGxvZ2dlci5sb2coYFtUcmFjaW5nXSBzdGFydGluZyAke3RyYW5zYWN0aW9uLm9wfSB0cmFuc2FjdGlvbiAtICR7dHJhbnNhY3Rpb24ubmFtZX1gKTtcbiAgcmV0dXJuIHRyYW5zYWN0aW9uO1xufVxuXG4vKipcbiAqIENoZWNrcyB0aGUgZ2l2ZW4gc2FtcGxlIHJhdGUgdG8gbWFrZSBzdXJlIGl0IGlzIHZhbGlkIHR5cGUgYW5kIHZhbHVlIChhIGJvb2xlYW4sIG9yIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMSkuXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRTYW1wbGVSYXRlKHJhdGU6IHVua25vd24pOiBib29sZWFuIHtcbiAgLy8gd2UgbmVlZCB0byBjaGVjayBOYU4gZXhwbGljaXRseSBiZWNhdXNlIGl0J3Mgb2YgdHlwZSAnbnVtYmVyJyBhbmQgdGhlcmVmb3JlIHdvdWxkbid0IGdldCBjYXVnaHQgYnkgdGhpcyB0eXBlY2hlY2tcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgaWYgKGlzTmFOKHJhdGUgYXMgYW55KSB8fCAhKHR5cGVvZiByYXRlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgcmF0ZSA9PT0gJ2Jvb2xlYW4nKSkge1xuICAgIGxvZ2dlci53YXJuKFxuICAgICAgYFtUcmFjaW5nXSBHaXZlbiBzYW1wbGUgcmF0ZSBpcyBpbnZhbGlkLiBTYW1wbGUgcmF0ZSBtdXN0IGJlIGEgYm9vbGVhbiBvciBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEuIEdvdCAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICByYXRlLFxuICAgICAgKX0gb2YgdHlwZSAke0pTT04uc3RyaW5naWZ5KHR5cGVvZiByYXRlKX0uYCxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGluIGNhc2Ugc2FtcGxlUmF0ZSBpcyBhIGJvb2xlYW4sIGl0IHdpbGwgZ2V0IGF1dG9tYXRpY2FsbHkgY2FzdCB0byAxIGlmIGl0J3MgdHJ1ZSBhbmQgMCBpZiBpdCdzIGZhbHNlXG4gIGlmIChyYXRlIDwgMCB8fCByYXRlID4gMSkge1xuICAgIGxvZ2dlci53YXJuKGBbVHJhY2luZ10gR2l2ZW4gc2FtcGxlIHJhdGUgaXMgaW52YWxpZC4gU2FtcGxlIHJhdGUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEuIEdvdCAke3JhdGV9LmApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHRyYW5zYWN0aW9uIGFuZCBhZGRzIGEgc2FtcGxpbmcgZGVjaXNpb24gaWYgaXQgZG9lc24ndCB5ZXQgaGF2ZSBvbmUuXG4gKlxuICogVGhlIEh1Yi5zdGFydFRyYW5zYWN0aW9uIG1ldGhvZCBkZWxlZ2F0ZXMgdG8gdGhpcyBtZXRob2QgdG8gZG8gaXRzIHdvcmssIHBhc3NpbmcgdGhlIEh1YiBpbnN0YW5jZSBpbiBhcyBgdGhpc2AsIGFzIGlmXG4gKiBpdCBoYWQgYmVlbiBjYWxsZWQgb24gdGhlIGh1YiBkaXJlY3RseS4gRXhpc3RzIGFzIGEgc2VwYXJhdGUgZnVuY3Rpb24gc28gdGhhdCBpdCBjYW4gYmUgaW5qZWN0ZWQgaW50byB0aGUgY2xhc3MgYXMgYW5cbiAqIFwiZXh0ZW5zaW9uIG1ldGhvZC5cIlxuICpcbiAqIEBwYXJhbSB0aGlzOiBUaGUgSHViIHN0YXJ0aW5nIHRoZSB0cmFuc2FjdGlvblxuICogQHBhcmFtIHRyYW5zYWN0aW9uQ29udGV4dDogRGF0YSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgdHJhbnNhY3Rpb25cbiAqIEBwYXJhbSBDdXN0b21TYW1wbGluZ0NvbnRleHQ6IE9wdGlvbmFsIGRhdGEgdG8gYmUgcHJvdmlkZWQgdG8gdGhlIGB0cmFjZXNTYW1wbGVyYCBmdW5jdGlvbiAoaWYgYW55KVxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgdHJhbnNhY3Rpb25cbiAqXG4gKiBAc2VlIHtAbGluayBIdWIuc3RhcnRUcmFuc2FjdGlvbn1cbiAqL1xuZnVuY3Rpb24gX3N0YXJ0VHJhbnNhY3Rpb24oXG4gIHRoaXM6IEh1YixcbiAgdHJhbnNhY3Rpb25Db250ZXh0OiBUcmFuc2FjdGlvbkNvbnRleHQsXG4gIGN1c3RvbVNhbXBsaW5nQ29udGV4dD86IEN1c3RvbVNhbXBsaW5nQ29udGV4dCxcbik6IFRyYW5zYWN0aW9uIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZ2V0Q2xpZW50KCk/LmdldE9wdGlvbnMoKSB8fCB7fTtcblxuICBsZXQgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25Db250ZXh0LCB0aGlzKTtcbiAgdHJhbnNhY3Rpb24gPSBzYW1wbGUodHJhbnNhY3Rpb24sIG9wdGlvbnMsIHtcbiAgICBwYXJlbnRTYW1wbGVkOiB0cmFuc2FjdGlvbkNvbnRleHQucGFyZW50U2FtcGxlZCxcbiAgICB0cmFuc2FjdGlvbkNvbnRleHQsXG4gICAgLi4uY3VzdG9tU2FtcGxpbmdDb250ZXh0LFxuICB9KTtcbiAgaWYgKHRyYW5zYWN0aW9uLnNhbXBsZWQpIHtcbiAgICB0cmFuc2FjdGlvbi5pbml0U3BhblJlY29yZGVyKG9wdGlvbnMuX2V4cGVyaW1lbnRzPy5tYXhTcGFucyBhcyBudW1iZXIpO1xuICB9XG4gIHJldHVybiB0cmFuc2FjdGlvbjtcbn1cblxuLyoqXG4gKiBDcmVhdGUgbmV3IGlkbGUgdHJhbnNhY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydElkbGVUcmFuc2FjdGlvbihcbiAgaHViOiBIdWIsXG4gIHRyYW5zYWN0aW9uQ29udGV4dDogVHJhbnNhY3Rpb25Db250ZXh0LFxuICBpZGxlVGltZW91dD86IG51bWJlcixcbiAgb25TY29wZT86IGJvb2xlYW4sXG4gIGN1c3RvbVNhbXBsaW5nQ29udGV4dD86IEN1c3RvbVNhbXBsaW5nQ29udGV4dCxcbik6IElkbGVUcmFuc2FjdGlvbiB7XG4gIGNvbnN0IG9wdGlvbnMgPSBodWIuZ2V0Q2xpZW50KCk/LmdldE9wdGlvbnMoKSB8fCB7fTtcblxuICBsZXQgdHJhbnNhY3Rpb24gPSBuZXcgSWRsZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uQ29udGV4dCwgaHViLCBpZGxlVGltZW91dCwgb25TY29wZSk7XG4gIHRyYW5zYWN0aW9uID0gc2FtcGxlKHRyYW5zYWN0aW9uLCBvcHRpb25zLCB7XG4gICAgcGFyZW50U2FtcGxlZDogdHJhbnNhY3Rpb25Db250ZXh0LnBhcmVudFNhbXBsZWQsXG4gICAgdHJhbnNhY3Rpb25Db250ZXh0LFxuICAgIC4uLmN1c3RvbVNhbXBsaW5nQ29udGV4dCxcbiAgfSk7XG4gIGlmICh0cmFuc2FjdGlvbi5zYW1wbGVkKSB7XG4gICAgdHJhbnNhY3Rpb24uaW5pdFNwYW5SZWNvcmRlcihvcHRpb25zLl9leHBlcmltZW50cz8ubWF4U3BhbnMgYXMgbnVtYmVyKTtcbiAgfVxuICByZXR1cm4gdHJhbnNhY3Rpb247XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9hZGRUcmFjaW5nRXh0ZW5zaW9ucygpOiB2b2lkIHtcbiAgY29uc3QgY2FycmllciA9IGdldE1haW5DYXJyaWVyKCk7XG4gIGlmICghY2Fycmllci5fX1NFTlRSWV9fKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNhcnJpZXIuX19TRU5UUllfXy5leHRlbnNpb25zID0gY2Fycmllci5fX1NFTlRSWV9fLmV4dGVuc2lvbnMgfHwge307XG4gIGlmICghY2Fycmllci5fX1NFTlRSWV9fLmV4dGVuc2lvbnMuc3RhcnRUcmFuc2FjdGlvbikge1xuICAgIGNhcnJpZXIuX19TRU5UUllfXy5leHRlbnNpb25zLnN0YXJ0VHJhbnNhY3Rpb24gPSBfc3RhcnRUcmFuc2FjdGlvbjtcbiAgfVxuICBpZiAoIWNhcnJpZXIuX19TRU5UUllfXy5leHRlbnNpb25zLnRyYWNlSGVhZGVycykge1xuICAgIGNhcnJpZXIuX19TRU5UUllfXy5leHRlbnNpb25zLnRyYWNlSGVhZGVycyA9IHRyYWNlSGVhZGVycztcbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIF9hdXRvbG9hZERhdGFiYXNlSW50ZWdyYXRpb25zKCk6IHZvaWQge1xuICBjb25zdCBjYXJyaWVyID0gZ2V0TWFpbkNhcnJpZXIoKTtcbiAgaWYgKCFjYXJyaWVyLl9fU0VOVFJZX18pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwYWNrYWdlVG9JbnRlZ3JhdGlvbk1hcHBpbmc6IFJlY29yZDxzdHJpbmcsICgpID0+IEludGVncmF0aW9uPiA9IHtcbiAgICBtb25nb2RiKCkge1xuICAgICAgY29uc3QgaW50ZWdyYXRpb24gPSBkeW5hbWljUmVxdWlyZShtb2R1bGUsICcuL2ludGVncmF0aW9ucy9ub2RlL21vbmdvJykgYXMge1xuICAgICAgICBNb25nbzogSW50ZWdyYXRpb25DbGFzczxJbnRlZ3JhdGlvbj47XG4gICAgICB9O1xuICAgICAgcmV0dXJuIG5ldyBpbnRlZ3JhdGlvbi5Nb25nbygpO1xuICAgIH0sXG4gICAgbW9uZ29vc2UoKSB7XG4gICAgICBjb25zdCBpbnRlZ3JhdGlvbiA9IGR5bmFtaWNSZXF1aXJlKG1vZHVsZSwgJy4vaW50ZWdyYXRpb25zL25vZGUvbW9uZ28nKSBhcyB7XG4gICAgICAgIE1vbmdvOiBJbnRlZ3JhdGlvbkNsYXNzPEludGVncmF0aW9uPjtcbiAgICAgIH07XG4gICAgICByZXR1cm4gbmV3IGludGVncmF0aW9uLk1vbmdvKHsgbW9uZ29vc2U6IHRydWUgfSk7XG4gICAgfSxcbiAgICBteXNxbCgpIHtcbiAgICAgIGNvbnN0IGludGVncmF0aW9uID0gZHluYW1pY1JlcXVpcmUobW9kdWxlLCAnLi9pbnRlZ3JhdGlvbnMvbm9kZS9teXNxbCcpIGFzIHtcbiAgICAgICAgTXlzcWw6IEludGVncmF0aW9uQ2xhc3M8SW50ZWdyYXRpb24+O1xuICAgICAgfTtcbiAgICAgIHJldHVybiBuZXcgaW50ZWdyYXRpb24uTXlzcWwoKTtcbiAgICB9LFxuICAgIHBnKCkge1xuICAgICAgY29uc3QgaW50ZWdyYXRpb24gPSBkeW5hbWljUmVxdWlyZShtb2R1bGUsICcuL2ludGVncmF0aW9ucy9ub2RlL3Bvc3RncmVzJykgYXMge1xuICAgICAgICBQb3N0Z3JlczogSW50ZWdyYXRpb25DbGFzczxJbnRlZ3JhdGlvbj47XG4gICAgICB9O1xuICAgICAgcmV0dXJuIG5ldyBpbnRlZ3JhdGlvbi5Qb3N0Z3JlcygpO1xuICAgIH0sXG4gIH07XG5cbiAgY29uc3QgbWFwcGVkUGFja2FnZXMgPSBPYmplY3Qua2V5cyhwYWNrYWdlVG9JbnRlZ3JhdGlvbk1hcHBpbmcpXG4gICAgLmZpbHRlcihtb2R1bGVOYW1lID0+ICEhbG9hZE1vZHVsZShtb2R1bGVOYW1lKSlcbiAgICAubWFwKHBrZyA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcGFja2FnZVRvSW50ZWdyYXRpb25NYXBwaW5nW3BrZ10oKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KVxuICAgIC5maWx0ZXIocCA9PiBwKSBhcyBJbnRlZ3JhdGlvbltdO1xuXG4gIGlmIChtYXBwZWRQYWNrYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgY2Fycmllci5fX1NFTlRSWV9fLmludGVncmF0aW9ucyA9IFsuLi4oY2Fycmllci5fX1NFTlRSWV9fLmludGVncmF0aW9ucyB8fCBbXSksIC4uLm1hcHBlZFBhY2thZ2VzXTtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgcGF0Y2hlcyB0aGUgZ2xvYmFsIG9iamVjdCBhbmQgaW5qZWN0cyB0aGUgVHJhY2luZyBleHRlbnNpb25zIG1ldGhvZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEV4dGVuc2lvbk1ldGhvZHMoKTogdm9pZCB7XG4gIF9hZGRUcmFjaW5nRXh0ZW5zaW9ucygpO1xuXG4gIC8vIERldGVjdCBhbmQgYXV0b21hdGljYWxseSBsb2FkIHNwZWNpZmllZCBpbnRlZ3JhdGlvbnMuXG4gIGlmIChpc05vZGVFbnYoKSkge1xuICAgIF9hdXRvbG9hZERhdGFiYXNlSW50ZWdyYXRpb25zKCk7XG4gIH1cblxuICAvLyBJZiBhbiBlcnJvciBoYXBwZW5zIGdsb2JhbGx5LCB3ZSBzaG91bGQgbWFrZSBzdXJlIHRyYW5zYWN0aW9uIHN0YXR1cyBpcyBzZXQgdG8gZXJyb3IuXG4gIHJlZ2lzdGVyRXJyb3JJbnN0cnVtZW50YXRpb24oKTtcbn1cbiIsICJpbXBvcnQgeyBJbnRlZ3JhdGlvbiwgVHJhbnNhY3Rpb24gfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG50eXBlIE1ldGhvZCA9XG4gIHwgJ2FsbCdcbiAgfCAnZ2V0J1xuICB8ICdwb3N0J1xuICB8ICdwdXQnXG4gIHwgJ2RlbGV0ZSdcbiAgfCAncGF0Y2gnXG4gIHwgJ29wdGlvbnMnXG4gIHwgJ2hlYWQnXG4gIHwgJ2NoZWNrb3V0J1xuICB8ICdjb3B5J1xuICB8ICdsb2NrJ1xuICB8ICdtZXJnZSdcbiAgfCAnbWthY3Rpdml0eSdcbiAgfCAnbWtjb2wnXG4gIHwgJ21vdmUnXG4gIHwgJ20tc2VhcmNoJ1xuICB8ICdub3RpZnknXG4gIHwgJ3B1cmdlJ1xuICB8ICdyZXBvcnQnXG4gIHwgJ3NlYXJjaCdcbiAgfCAnc3Vic2NyaWJlJ1xuICB8ICd0cmFjZSdcbiAgfCAndW5sb2NrJ1xuICB8ICd1bnN1YnNjcmliZSdcbiAgfCAndXNlJztcblxudHlwZSBSb3V0ZXIgPSB7XG4gIFttZXRob2QgaW4gTWV0aG9kXTogKC4uLmFyZ3M6IGFueSkgPT4gYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbn07XG5cbmludGVyZmFjZSBFeHByZXNzUmVzcG9uc2Uge1xuICBvbmNlKG5hbWU6IHN0cmluZywgY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkO1xufVxuXG4vKipcbiAqIEludGVybmFsIGhlbHBlciBmb3IgYF9fc2VudHJ5X3RyYW5zYWN0aW9uYFxuICogQGhpZGRlblxuICovXG5pbnRlcmZhY2UgU2VudHJ5VHJhY2luZ1Jlc3BvbnNlIHtcbiAgX19zZW50cnlfdHJhbnNhY3Rpb24/OiBUcmFuc2FjdGlvbjtcbn1cblxuLyoqXG4gKiBFeHByZXNzIGludGVncmF0aW9uXG4gKlxuICogUHJvdmlkZXMgYW4gcmVxdWVzdCBhbmQgZXJyb3IgaGFuZGxlciBmb3IgRXhwcmVzcyBmcmFtZXdvcmsgYXMgd2VsbCBhcyB0cmFjaW5nIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgY2xhc3MgRXhwcmVzcyBpbXBsZW1lbnRzIEludGVncmF0aW9uIHtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkOiBzdHJpbmcgPSAnRXhwcmVzcyc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgbmFtZTogc3RyaW5nID0gRXhwcmVzcy5pZDtcblxuICAvKipcbiAgICogRXhwcmVzcyBBcHAgaW5zdGFuY2VcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3JvdXRlcj86IFJvdXRlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBfbWV0aG9kcz86IE1ldGhvZFtdO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHsgYXBwPzogUm91dGVyOyByb3V0ZXI/OiBSb3V0ZXI7IG1ldGhvZHM/OiBNZXRob2RbXSB9ID0ge30pIHtcbiAgICB0aGlzLl9yb3V0ZXIgPSBvcHRpb25zLnJvdXRlciB8fCBvcHRpb25zLmFwcDtcbiAgICB0aGlzLl9tZXRob2RzID0gKEFycmF5LmlzQXJyYXkob3B0aW9ucy5tZXRob2RzKSA/IG9wdGlvbnMubWV0aG9kcyA6IFtdKS5jb25jYXQoJ3VzZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0dXBPbmNlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fcm91dGVyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0V4cHJlc3NJbnRlZ3JhdGlvbiBpcyBtaXNzaW5nIGFuIEV4cHJlc3MgaW5zdGFuY2UnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaW5zdHJ1bWVudE1pZGRsZXdhcmVzKHRoaXMuX3JvdXRlciwgdGhpcy5fbWV0aG9kcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBXcmFwcyBvcmlnaW5hbCBtaWRkbGV3YXJlIGZ1bmN0aW9uIGluIGEgdHJhY2luZyBjYWxsLCB3aGljaCBzdG9yZXMgdGhlIGluZm8gYWJvdXQgdGhlIGNhbGwgYXMgYSBzcGFuLFxuICogYW5kIGZpbmlzaGVzIGl0IG9uY2UgdGhlIG1pZGRsZXdhcmUgaXMgZG9uZSBpbnZva2luZy5cbiAqXG4gKiBFeHByZXNzIG1pZGRsZXdhcmVzIGhhdmUgMyB2YXJpb3VzIGZvcm1zLCB0aHVzIHdlIGhhdmUgdG8gdGFrZSBjYXJlIG9mIGFsbCBvZiB0aGVtOlxuICogLy8gc3luY1xuICogYXBwLnVzZShmdW5jdGlvbiAocmVxLCByZXMpIHsgLi4uIH0pXG4gKiAvLyBhc3luY1xuICogYXBwLnVzZShmdW5jdGlvbiAocmVxLCByZXMsIG5leHQpIHsgLi4uIH0pXG4gKiAvLyBlcnJvciBoYW5kbGVyXG4gKiBhcHAudXNlKGZ1bmN0aW9uIChlcnIsIHJlcSwgcmVzLCBuZXh0KSB7IC4uLiB9KVxuICpcbiAqIFRoZXkgYWxsIGludGVybmFsbHkgZGVsZWdhdGUgdG8gdGhlIGByb3V0ZXJbbWV0aG9kXWAgb2YgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZnVuY3Rpb24gd3JhcChmbjogRnVuY3Rpb24sIG1ldGhvZDogTWV0aG9kKTogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkIHtcbiAgY29uc3QgYXJpdHkgPSBmbi5sZW5ndGg7XG5cbiAgc3dpdGNoIChhcml0eSkge1xuICAgIGNhc2UgMjoge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHRoaXM6IE5vZGVKUy5HbG9iYWwsIHJlcTogdW5rbm93biwgcmVzOiBFeHByZXNzUmVzcG9uc2UgJiBTZW50cnlUcmFjaW5nUmVzcG9uc2UpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSByZXMuX19zZW50cnlfdHJhbnNhY3Rpb247XG4gICAgICAgIGlmICh0cmFuc2FjdGlvbikge1xuICAgICAgICAgIGNvbnN0IHNwYW4gPSB0cmFuc2FjdGlvbi5zdGFydENoaWxkKHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBmbi5uYW1lLFxuICAgICAgICAgICAgb3A6IGBleHByZXNzLm1pZGRsZXdhcmUuJHttZXRob2R9YCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXMub25jZSgnZmluaXNoJywgKCkgPT4ge1xuICAgICAgICAgICAgc3Bhbi5maW5pc2goKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCByZXEsIHJlcyk7XG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlIDM6IHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihcbiAgICAgICAgdGhpczogTm9kZUpTLkdsb2JhbCxcbiAgICAgICAgcmVxOiB1bmtub3duLFxuICAgICAgICByZXM6IEV4cHJlc3NSZXNwb25zZSAmIFNlbnRyeVRyYWNpbmdSZXNwb25zZSxcbiAgICAgICAgbmV4dDogKCkgPT4gdm9pZCxcbiAgICAgICk6IHZvaWQge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHJlcy5fX3NlbnRyeV90cmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3Qgc3BhbiA9IHRyYW5zYWN0aW9uPy5zdGFydENoaWxkKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogZm4ubmFtZSxcbiAgICAgICAgICBvcDogYGV4cHJlc3MubWlkZGxld2FyZS4ke21ldGhvZH1gLFxuICAgICAgICB9KTtcbiAgICAgICAgZm4uY2FsbCh0aGlzLCByZXEsIHJlcywgZnVuY3Rpb24odGhpczogTm9kZUpTLkdsb2JhbCwgLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgICAgICAgc3Bhbj8uZmluaXNoKCk7XG4gICAgICAgICAgbmV4dC5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgNDoge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKFxuICAgICAgICB0aGlzOiBOb2RlSlMuR2xvYmFsLFxuICAgICAgICBlcnI6IEVycm9yLFxuICAgICAgICByZXE6IFJlcXVlc3QsXG4gICAgICAgIHJlczogUmVzcG9uc2UgJiBTZW50cnlUcmFjaW5nUmVzcG9uc2UsXG4gICAgICAgIG5leHQ6ICgpID0+IHZvaWQsXG4gICAgICApOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSByZXMuX19zZW50cnlfdHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IHNwYW4gPSB0cmFuc2FjdGlvbj8uc3RhcnRDaGlsZCh7XG4gICAgICAgICAgZGVzY3JpcHRpb246IGZuLm5hbWUsXG4gICAgICAgICAgb3A6IGBleHByZXNzLm1pZGRsZXdhcmUuJHttZXRob2R9YCxcbiAgICAgICAgfSk7XG4gICAgICAgIGZuLmNhbGwodGhpcywgZXJyLCByZXEsIHJlcywgZnVuY3Rpb24odGhpczogTm9kZUpTLkdsb2JhbCwgLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgICAgICAgc3Bhbj8uZmluaXNoKCk7XG4gICAgICAgICAgbmV4dC5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwcmVzcyBtaWRkbGV3YXJlIHRha2VzIDItNCBhcmd1bWVudHMuIEdvdDogJHthcml0eX1gKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUYWtlcyBhbGwgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIG9yaWdpbmFsIGBhcHBgIG9yIGByb3V0ZXJgIG1ldGhvZCwgZWcuIGBhcHAudXNlYCBvciBgcm91dGVyLnVzZWBcbiAqIGFuZCB3cmFwcyBldmVyeSBmdW5jdGlvbiwgYXMgd2VsbCBhcyBhcnJheSBvZiBmdW5jdGlvbnMgd2l0aCBhIGNhbGwgdG8gb3VyIGB3cmFwYCBtZXRob2QuXG4gKiBXZSBoYXZlIHRvIHRha2UgY2FyZSBvZiB0aGUgYXJyYXlzIGFzIHdlbGwgYXMgaXRlcmF0ZSBvdmVyIGFsbCBvZiB0aGUgYXJndW1lbnRzLFxuICogYXMgYGFwcC51c2VgIGNhbiBhY2NlcHQgbWlkZGxld2FyZXMgaW4gZmV3IHZhcmlvdXMgZm9ybXMuXG4gKlxuICogYXBwLnVzZShbPHBhdGg+XSwgPGZuPilcbiAqIGFwcC51c2UoWzxwYXRoPl0sIDxmbj4sIC4uLjxmbj4pXG4gKiBhcHAudXNlKFs8cGF0aD5dLCAuLi48Zm4+W10pXG4gKi9cbmZ1bmN0aW9uIHdyYXBNaWRkbGV3YXJlQXJncyhhcmdzOiB1bmtub3duW10sIG1ldGhvZDogTWV0aG9kKTogdW5rbm93bltdIHtcbiAgcmV0dXJuIGFyZ3MubWFwKChhcmc6IHVua25vd24pID0+IHtcbiAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHdyYXAoYXJnLCBtZXRob2QpO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcbiAgICAgIHJldHVybiBhcmcubWFwKChhOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiB3cmFwKGEsIG1ldGhvZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGE7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJnO1xuICB9KTtcbn1cblxuLyoqXG4gKiBQYXRjaGVzIG9yaWdpbmFsIHJvdXRlciB0byB1dGlsaXplIG91ciB0cmFjaW5nIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZnVuY3Rpb24gcGF0Y2hNaWRkbGV3YXJlKHJvdXRlcjogUm91dGVyLCBtZXRob2Q6IE1ldGhvZCk6IFJvdXRlciB7XG4gIGNvbnN0IG9yaWdpbmFsQ2FsbGJhY2sgPSByb3V0ZXJbbWV0aG9kXTtcblxuICByb3V0ZXJbbWV0aG9kXSA9IGZ1bmN0aW9uKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHJldHVybiBvcmlnaW5hbENhbGxiYWNrLmNhbGwodGhpcywgLi4ud3JhcE1pZGRsZXdhcmVBcmdzKGFyZ3MsIG1ldGhvZCkpO1xuICB9O1xuXG4gIHJldHVybiByb3V0ZXI7XG59XG5cbi8qKlxuICogUGF0Y2hlcyBvcmlnaW5hbCByb3V0ZXIgbWV0aG9kc1xuICovXG5mdW5jdGlvbiBpbnN0cnVtZW50TWlkZGxld2FyZXMocm91dGVyOiBSb3V0ZXIsIG1ldGhvZHM6IE1ldGhvZFtdID0gW10pOiB2b2lkIHtcbiAgbWV0aG9kcy5mb3JFYWNoKChtZXRob2Q6IE1ldGhvZCkgPT4gcGF0Y2hNaWRkbGV3YXJlKHJvdXRlciwgbWV0aG9kKSk7XG59XG4iLCAiaW1wb3J0IHsgSHViIH0gZnJvbSAnQHNlbnRyeS9odWInO1xuaW1wb3J0IHsgRXZlbnRQcm9jZXNzb3IsIEludGVncmF0aW9uIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBmaWxsLCBpc1RoZW5hYmxlLCBsb2FkTW9kdWxlLCBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW50ZXJmYWNlIFBnQ2xpZW50IHtcbiAgcHJvdG90eXBlOiB7XG4gICAgcXVlcnk6ICgpID0+IHZvaWQgfCBQcm9taXNlPHVua25vd24+O1xuICB9O1xufVxuXG5pbnRlcmZhY2UgUGdPcHRpb25zIHtcbiAgdXNlUGdOYXRpdmU/OiBib29sZWFuO1xufVxuXG4vKiogVHJhY2luZyBpbnRlZ3JhdGlvbiBmb3Igbm9kZS1wb3N0Z3JlcyBwYWNrYWdlICovXG5leHBvcnQgY2xhc3MgUG9zdGdyZXMgaW1wbGVtZW50cyBJbnRlZ3JhdGlvbiB7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpZDogc3RyaW5nID0gJ1Bvc3RncmVzJztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBQb3N0Z3Jlcy5pZDtcblxuICBwcml2YXRlIF91c2VQZ05hdGl2ZTogYm9vbGVhbjtcblxuICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogUGdPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLl91c2VQZ05hdGl2ZSA9ICEhb3B0aW9ucy51c2VQZ05hdGl2ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldHVwT25jZShfOiAoY2FsbGJhY2s6IEV2ZW50UHJvY2Vzc29yKSA9PiB2b2lkLCBnZXRDdXJyZW50SHViOiAoKSA9PiBIdWIpOiB2b2lkIHtcbiAgICBjb25zdCBwa2cgPSBsb2FkTW9kdWxlPHsgQ2xpZW50OiBQZ0NsaWVudDsgbmF0aXZlOiB7IENsaWVudDogUGdDbGllbnQgfSB9PigncGcnKTtcblxuICAgIGlmICghcGtnKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1Bvc3RncmVzIEludGVncmF0aW9uIHdhcyB1bmFibGUgdG8gcmVxdWlyZSBgcGdgIHBhY2thZ2UuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3VzZVBnTmF0aXZlICYmICFwa2cubmF0aXZlPy5DbGllbnQpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgUG9zdGdyZXMgSW50ZWdyYXRpb24gd2FzIHVuYWJsZSB0byBhY2Nlc3MgJ3BnLW5hdGl2ZScgYmluZGluZ3MuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBDbGllbnQgfSA9IHRoaXMuX3VzZVBnTmF0aXZlID8gcGtnLm5hdGl2ZSA6IHBrZztcblxuICAgIC8qKlxuICAgICAqIGZ1bmN0aW9uIChxdWVyeSwgY2FsbGJhY2spID0+IHZvaWRcbiAgICAgKiBmdW5jdGlvbiAocXVlcnksIHBhcmFtcywgY2FsbGJhY2spID0+IHZvaWRcbiAgICAgKiBmdW5jdGlvbiAocXVlcnkpID0+IFByb21pc2VcbiAgICAgKiBmdW5jdGlvbiAocXVlcnksIHBhcmFtcykgPT4gUHJvbWlzZVxuICAgICAqIGZ1bmN0aW9uIChwZy5DdXJzb3IpID0+IHBnLkN1cnNvclxuICAgICAqL1xuICAgIGZpbGwoQ2xpZW50LnByb3RvdHlwZSwgJ3F1ZXJ5JywgZnVuY3Rpb24ob3JpZzogKCkgPT4gdm9pZCB8IFByb21pc2U8dW5rbm93bj4pIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbih0aGlzOiB1bmtub3duLCBjb25maWc6IHVua25vd24sIHZhbHVlczogdW5rbm93biwgY2FsbGJhY2s6IHVua25vd24pIHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSBnZXRDdXJyZW50SHViKCkuZ2V0U2NvcGUoKTtcbiAgICAgICAgY29uc3QgcGFyZW50U3BhbiA9IHNjb3BlPy5nZXRTcGFuKCk7XG4gICAgICAgIGNvbnN0IHNwYW4gPSBwYXJlbnRTcGFuPy5zdGFydENoaWxkKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogdHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycgPyBjb25maWcgOiAoY29uZmlnIGFzIHsgdGV4dDogc3RyaW5nIH0pLnRleHQsXG4gICAgICAgICAgb3A6IGBkYmAsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gb3JpZy5jYWxsKHRoaXMsIGNvbmZpZywgdmFsdWVzLCBmdW5jdGlvbihlcnI6IEVycm9yLCByZXN1bHQ6IHVua25vd24pIHtcbiAgICAgICAgICAgIHNwYW4/LmZpbmlzaCgpO1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gb3JpZy5jYWxsKHRoaXMsIGNvbmZpZywgZnVuY3Rpb24oZXJyOiBFcnJvciwgcmVzdWx0OiB1bmtub3duKSB7XG4gICAgICAgICAgICBzcGFuPy5maW5pc2goKTtcbiAgICAgICAgICAgIHZhbHVlcyhlcnIsIHJlc3VsdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBydiA9IHR5cGVvZiB2YWx1ZXMgIT09ICd1bmRlZmluZWQnID8gb3JpZy5jYWxsKHRoaXMsIGNvbmZpZywgdmFsdWVzKSA6IG9yaWcuY2FsbCh0aGlzLCBjb25maWcpO1xuXG4gICAgICAgIGlmIChpc1RoZW5hYmxlKHJ2KSkge1xuICAgICAgICAgIHJldHVybiAocnYgYXMgUHJvbWlzZTx1bmtub3duPikudGhlbigocmVzOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICBzcGFuPy5maW5pc2goKTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBzcGFuPy5maW5pc2goKTtcbiAgICAgICAgcmV0dXJuIHJ2O1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuIiwgImltcG9ydCB7IEh1YiB9IGZyb20gJ0BzZW50cnkvaHViJztcbmltcG9ydCB7IEV2ZW50UHJvY2Vzc29yLCBJbnRlZ3JhdGlvbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgZmlsbCwgbG9hZE1vZHVsZSwgbG9nZ2VyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmludGVyZmFjZSBNeXNxbENvbm5lY3Rpb24ge1xuICBjcmVhdGVRdWVyeTogKCkgPT4gdm9pZDtcbn1cblxuLyoqIFRyYWNpbmcgaW50ZWdyYXRpb24gZm9yIG5vZGUtbXlzcWwgcGFja2FnZSAqL1xuZXhwb3J0IGNsYXNzIE15c3FsIGltcGxlbWVudHMgSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWQ6IHN0cmluZyA9ICdNeXNxbCc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgbmFtZTogc3RyaW5nID0gTXlzcWwuaWQ7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0dXBPbmNlKF86IChjYWxsYmFjazogRXZlbnRQcm9jZXNzb3IpID0+IHZvaWQsIGdldEN1cnJlbnRIdWI6ICgpID0+IEh1Yik6IHZvaWQge1xuICAgIGNvbnN0IHBrZyA9IGxvYWRNb2R1bGU8TXlzcWxDb25uZWN0aW9uPignbXlzcWwvbGliL0Nvbm5lY3Rpb24uanMnKTtcblxuICAgIGlmICghcGtnKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ015c3FsIEludGVncmF0aW9uIHdhcyB1bmFibGUgdG8gcmVxdWlyZSBgbXlzcWxgIHBhY2thZ2UuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIG9yaWdpbmFsIGZ1bmN0aW9uIHdpbGwgaGF2ZSBvbmUgb2YgdGhlc2Ugc2lnbmF0dXJlczpcbiAgICAvLyAgICBmdW5jdGlvbiAoY2FsbGJhY2spID0+IHZvaWRcbiAgICAvLyAgICBmdW5jdGlvbiAob3B0aW9ucywgY2FsbGJhY2spID0+IHZvaWRcbiAgICAvLyAgICBmdW5jdGlvbiAob3B0aW9ucywgdmFsdWVzLCBjYWxsYmFjaykgPT4gdm9pZFxuICAgIGZpbGwocGtnLCAnY3JlYXRlUXVlcnknLCBmdW5jdGlvbihvcmlnOiAoKSA9PiB2b2lkKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odGhpczogdW5rbm93biwgb3B0aW9uczogdW5rbm93biwgdmFsdWVzOiB1bmtub3duLCBjYWxsYmFjazogdW5rbm93bikge1xuICAgICAgICBjb25zdCBzY29wZSA9IGdldEN1cnJlbnRIdWIoKS5nZXRTY29wZSgpO1xuICAgICAgICBjb25zdCBwYXJlbnRTcGFuID0gc2NvcGU/LmdldFNwYW4oKTtcbiAgICAgICAgY29uc3Qgc3BhbiA9IHBhcmVudFNwYW4/LnN0YXJ0Q2hpbGQoe1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycgPyBvcHRpb25zIDogKG9wdGlvbnMgYXMgeyBzcWw6IHN0cmluZyB9KS5zcWwsXG4gICAgICAgICAgb3A6IGBkYmAsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gb3JpZy5jYWxsKHRoaXMsIG9wdGlvbnMsIHZhbHVlcywgZnVuY3Rpb24oZXJyOiBFcnJvciwgcmVzdWx0OiB1bmtub3duLCBmaWVsZHM6IHVua25vd24pIHtcbiAgICAgICAgICAgIHNwYW4/LmZpbmlzaCgpO1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHQsIGZpZWxkcyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBvcmlnLmNhbGwodGhpcywgb3B0aW9ucywgZnVuY3Rpb24oZXJyOiBFcnJvciwgcmVzdWx0OiB1bmtub3duLCBmaWVsZHM6IHVua25vd24pIHtcbiAgICAgICAgICAgIHNwYW4/LmZpbmlzaCgpO1xuICAgICAgICAgICAgdmFsdWVzKGVyciwgcmVzdWx0LCBmaWVsZHMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9yaWcuY2FsbCh0aGlzLCBvcHRpb25zLCB2YWx1ZXMsIGNhbGxiYWNrKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBIdWIgfSBmcm9tICdAc2VudHJ5L2h1Yic7XG5pbXBvcnQgeyBFdmVudFByb2Nlc3NvciwgSW50ZWdyYXRpb24sIFNwYW5Db250ZXh0IH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBmaWxsLCBpc1RoZW5hYmxlLCBsb2FkTW9kdWxlLCBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuLy8gVGhpcyBhbGxvd3MgdXMgdG8gdXNlIHRoZSBzYW1lIGFycmF5IGZvciBib3RoIGRlZmF1bHRzIG9wdGlvbnMgYW5kIHRoZSB0eXBlIGl0c2VsZi5cbi8vIChub3RlIGBhcyBjb25zdGAgYXQgdGhlIGVuZCB0byBtYWtlIGl0IGEgdW5pb24gb2Ygc3RyaW5nIGxpdGVyYWwgdHlwZXMgKGkuZS4gXCJhXCIgfCBcImJcIiB8IC4uLiApXG4vLyBhbmQgbm90IGp1c3QgYSBzdHJpbmdbXSlcbnR5cGUgT3BlcmF0aW9uID0gdHlwZW9mIE9QRVJBVElPTlNbbnVtYmVyXTtcbmNvbnN0IE9QRVJBVElPTlMgPSBbXG4gICdhZ2dyZWdhdGUnLCAvLyBhZ2dyZWdhdGUocGlwZWxpbmUsIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnYnVsa1dyaXRlJywgLy8gYnVsa1dyaXRlKG9wZXJhdGlvbnMsIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnY291bnREb2N1bWVudHMnLCAvLyBjb3VudERvY3VtZW50cyhxdWVyeSwgb3B0aW9ucywgY2FsbGJhY2spXG4gICdjcmVhdGVJbmRleCcsIC8vIGNyZWF0ZUluZGV4KGZpZWxkT3JTcGVjLCBvcHRpb25zLCBjYWxsYmFjaylcbiAgJ2NyZWF0ZUluZGV4ZXMnLCAvLyBjcmVhdGVJbmRleGVzKGluZGV4U3BlY3MsIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnZGVsZXRlTWFueScsIC8vIGRlbGV0ZU1hbnkoZmlsdGVyLCBvcHRpb25zLCBjYWxsYmFjaylcbiAgJ2RlbGV0ZU9uZScsIC8vIGRlbGV0ZU9uZShmaWx0ZXIsIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnZGlzdGluY3QnLCAvLyBkaXN0aW5jdChrZXksIHF1ZXJ5LCBvcHRpb25zLCBjYWxsYmFjaylcbiAgJ2Ryb3AnLCAvLyBkcm9wKG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnZHJvcEluZGV4JywgLy8gZHJvcEluZGV4KGluZGV4TmFtZSwgb3B0aW9ucywgY2FsbGJhY2spXG4gICdkcm9wSW5kZXhlcycsIC8vIGRyb3BJbmRleGVzKG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnZXN0aW1hdGVkRG9jdW1lbnRDb3VudCcsIC8vIGVzdGltYXRlZERvY3VtZW50Q291bnQob3B0aW9ucywgY2FsbGJhY2spXG4gICdmaW5kJywgLy8gZmluZChxdWVyeSwgb3B0aW9ucywgY2FsbGJhY2spXG4gICdmaW5kT25lJywgLy8gZmluZE9uZShxdWVyeSwgb3B0aW9ucywgY2FsbGJhY2spXG4gICdmaW5kT25lQW5kRGVsZXRlJywgLy8gZmluZE9uZUFuZERlbGV0ZShmaWx0ZXIsIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnZmluZE9uZUFuZFJlcGxhY2UnLCAvLyBmaW5kT25lQW5kUmVwbGFjZShmaWx0ZXIsIHJlcGxhY2VtZW50LCBvcHRpb25zLCBjYWxsYmFjaylcbiAgJ2ZpbmRPbmVBbmRVcGRhdGUnLCAvLyBmaW5kT25lQW5kVXBkYXRlKGZpbHRlciwgdXBkYXRlLCBvcHRpb25zLCBjYWxsYmFjaylcbiAgJ2luZGV4ZXMnLCAvLyBpbmRleGVzKG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnaW5kZXhFeGlzdHMnLCAvLyBpbmRleEV4aXN0cyhpbmRleGVzLCBvcHRpb25zLCBjYWxsYmFjaylcbiAgJ2luZGV4SW5mb3JtYXRpb24nLCAvLyBpbmRleEluZm9ybWF0aW9uKG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnaW5pdGlhbGl6ZU9yZGVyZWRCdWxrT3AnLCAvLyBpbml0aWFsaXplT3JkZXJlZEJ1bGtPcChvcHRpb25zLCBjYWxsYmFjaylcbiAgJ2luc2VydE1hbnknLCAvLyBpbnNlcnRNYW55KGRvY3MsIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnaW5zZXJ0T25lJywgLy8gaW5zZXJ0T25lKGRvYywgb3B0aW9ucywgY2FsbGJhY2spXG4gICdpc0NhcHBlZCcsIC8vIGlzQ2FwcGVkKG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnbWFwUmVkdWNlJywgLy8gbWFwUmVkdWNlKG1hcCwgcmVkdWNlLCBvcHRpb25zLCBjYWxsYmFjaylcbiAgJ29wdGlvbnMnLCAvLyBvcHRpb25zKG9wdGlvbnMsIGNhbGxiYWNrKVxuICAncGFyYWxsZWxDb2xsZWN0aW9uU2NhbicsIC8vIHBhcmFsbGVsQ29sbGVjdGlvblNjYW4ob3B0aW9ucywgY2FsbGJhY2spXG4gICdyZW5hbWUnLCAvLyByZW5hbWUobmV3TmFtZSwgb3B0aW9ucywgY2FsbGJhY2spXG4gICdyZXBsYWNlT25lJywgLy8gcmVwbGFjZU9uZShmaWx0ZXIsIGRvYywgb3B0aW9ucywgY2FsbGJhY2spXG4gICdzdGF0cycsIC8vIHN0YXRzKG9wdGlvbnMsIGNhbGxiYWNrKVxuICAndXBkYXRlTWFueScsIC8vIHVwZGF0ZU1hbnkoZmlsdGVyLCB1cGRhdGUsIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAndXBkYXRlT25lJywgLy8gdXBkYXRlT25lKGZpbHRlciwgdXBkYXRlLCBvcHRpb25zLCBjYWxsYmFjaylcbl0gYXMgY29uc3Q7XG5cbi8vIEFsbCBvZiB0aGUgb3BlcmF0aW9ucyBhYm92ZSB0YWtlIGBvcHRpb25zYCBhbmQgYGNhbGxiYWNrYCBhcyB0aGVpciBmaW5hbCBwYXJhbWV0ZXJzLCBidXQgc29tZSBvZiB0aGVtXG4vLyB0YWtlIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBhcyB3ZWxsLiBGb3IgdGhvc2Ugb3BlcmF0aW9ucywgdGhpcyBpcyBhIG1hcCBvZlxuLy8geyA8b3BlcmF0aW9uIG5hbWU+OiAgWzxuYW1lcyBvZiBhZGRpdGlvbmFsIHBhcmFtZXRlcnM+XSB9LCBhcyBhIHdheSB0byBrbm93IHdoYXQgdG8gY2FsbCB0aGUgb3BlcmF0aW9uJ3Ncbi8vIHBvc2l0aW9uYWwgYXJndW1lbnRzIHdoZW4gd2UgYWRkIHRoZW0gdG8gdGhlIHNwYW4ncyBgZGF0YWAgb2JqZWN0IGxhdGVyXG5jb25zdCBPUEVSQVRJT05fU0lHTkFUVVJFUzoge1xuICBbb3AgaW4gT3BlcmF0aW9uXT86IHN0cmluZ1tdO1xufSA9IHtcbiAgLy8gYWdncmVnYXRlIGludGVudGlvbmFsbHkgbm90IGluY2x1ZGVkIGJlY2F1c2UgYHBpcGVsaW5lYCBhcmd1bWVudHMgYXJlIHRvbyBjb21wbGV4IHRvIHNlcmlhbGl6ZSB3ZWxsXG4gIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0L3B1bGwvMzEwMlxuICBidWxrV3JpdGU6IFsnb3BlcmF0aW9ucyddLFxuICBjb3VudERvY3VtZW50czogWydxdWVyeSddLFxuICBjcmVhdGVJbmRleDogWydmaWVsZE9yU3BlYyddLFxuICBjcmVhdGVJbmRleGVzOiBbJ2luZGV4U3BlY3MnXSxcbiAgZGVsZXRlTWFueTogWydmaWx0ZXInXSxcbiAgZGVsZXRlT25lOiBbJ2ZpbHRlciddLFxuICBkaXN0aW5jdDogWydrZXknLCAncXVlcnknXSxcbiAgZHJvcEluZGV4OiBbJ2luZGV4TmFtZSddLFxuICBmaW5kOiBbJ3F1ZXJ5J10sXG4gIGZpbmRPbmU6IFsncXVlcnknXSxcbiAgZmluZE9uZUFuZERlbGV0ZTogWydmaWx0ZXInXSxcbiAgZmluZE9uZUFuZFJlcGxhY2U6IFsnZmlsdGVyJywgJ3JlcGxhY2VtZW50J10sXG4gIGZpbmRPbmVBbmRVcGRhdGU6IFsnZmlsdGVyJywgJ3VwZGF0ZSddLFxuICBpbmRleEV4aXN0czogWydpbmRleGVzJ10sXG4gIGluc2VydE1hbnk6IFsnZG9jcyddLFxuICBpbnNlcnRPbmU6IFsnZG9jJ10sXG4gIG1hcFJlZHVjZTogWydtYXAnLCAncmVkdWNlJ10sXG4gIHJlbmFtZTogWyduZXdOYW1lJ10sXG4gIHJlcGxhY2VPbmU6IFsnZmlsdGVyJywgJ2RvYyddLFxuICB1cGRhdGVNYW55OiBbJ2ZpbHRlcicsICd1cGRhdGUnXSxcbiAgdXBkYXRlT25lOiBbJ2ZpbHRlcicsICd1cGRhdGUnXSxcbn07XG5cbmludGVyZmFjZSBNb25nb0NvbGxlY3Rpb24ge1xuICBjb2xsZWN0aW9uTmFtZTogc3RyaW5nO1xuICBkYk5hbWU6IHN0cmluZztcbiAgbmFtZXNwYWNlOiBzdHJpbmc7XG4gIHByb3RvdHlwZToge1xuICAgIFtvcGVyYXRpb24gaW4gT3BlcmF0aW9uXTogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bjtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIE1vbmdvT3B0aW9ucyB7XG4gIG9wZXJhdGlvbnM/OiBPcGVyYXRpb25bXTtcbiAgZGVzY3JpYmVPcGVyYXRpb25zPzogYm9vbGVhbiB8IE9wZXJhdGlvbltdO1xuICB1c2VNb25nb29zZT86IGJvb2xlYW47XG59XG5cbi8qKiBUcmFjaW5nIGludGVncmF0aW9uIGZvciBtb25nbyBwYWNrYWdlICovXG5leHBvcnQgY2xhc3MgTW9uZ28gaW1wbGVtZW50cyBJbnRlZ3JhdGlvbiB7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpZDogc3RyaW5nID0gJ01vbmdvJztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBNb25nby5pZDtcblxuICBwcml2YXRlIF9vcGVyYXRpb25zOiBPcGVyYXRpb25bXTtcbiAgcHJpdmF0ZSBfZGVzY3JpYmVPcGVyYXRpb25zPzogYm9vbGVhbiB8IE9wZXJhdGlvbltdO1xuICBwcml2YXRlIF91c2VNb25nb29zZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiBNb25nb09wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuX29wZXJhdGlvbnMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMub3BlcmF0aW9ucylcbiAgICAgID8gb3B0aW9ucy5vcGVyYXRpb25zXG4gICAgICA6ICgoT1BFUkFUSU9OUyBhcyB1bmtub3duKSBhcyBPcGVyYXRpb25bXSk7XG4gICAgdGhpcy5fZGVzY3JpYmVPcGVyYXRpb25zID0gJ2Rlc2NyaWJlT3BlcmF0aW9ucycgaW4gb3B0aW9ucyA/IG9wdGlvbnMuZGVzY3JpYmVPcGVyYXRpb25zIDogdHJ1ZTtcbiAgICB0aGlzLl91c2VNb25nb29zZSA9ICEhb3B0aW9ucy51c2VNb25nb29zZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldHVwT25jZShfOiAoY2FsbGJhY2s6IEV2ZW50UHJvY2Vzc29yKSA9PiB2b2lkLCBnZXRDdXJyZW50SHViOiAoKSA9PiBIdWIpOiB2b2lkIHtcbiAgICBjb25zdCBtb2R1bGVOYW1lID0gdGhpcy5fdXNlTW9uZ29vc2UgPyAnbW9uZ29vc2UnIDogJ21vbmdvZGInO1xuICAgIGNvbnN0IHBrZyA9IGxvYWRNb2R1bGU8eyBDb2xsZWN0aW9uOiBNb25nb0NvbGxlY3Rpb24gfT4obW9kdWxlTmFtZSk7XG5cbiAgICBpZiAoIXBrZykge1xuICAgICAgbG9nZ2VyLmVycm9yKGBNb25nbyBJbnRlZ3JhdGlvbiB3YXMgdW5hYmxlIHRvIHJlcXVpcmUgXFxgJHttb2R1bGVOYW1lfVxcYCBwYWNrYWdlLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2luc3RydW1lbnRPcGVyYXRpb25zKHBrZy5Db2xsZWN0aW9uLCB0aGlzLl9vcGVyYXRpb25zLCBnZXRDdXJyZW50SHViKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRjaGVzIG9yaWdpbmFsIGNvbGxlY3Rpb24gbWV0aG9kc1xuICAgKi9cbiAgcHJpdmF0ZSBfaW5zdHJ1bWVudE9wZXJhdGlvbnMoY29sbGVjdGlvbjogTW9uZ29Db2xsZWN0aW9uLCBvcGVyYXRpb25zOiBPcGVyYXRpb25bXSwgZ2V0Q3VycmVudEh1YjogKCkgPT4gSHViKTogdm9pZCB7XG4gICAgb3BlcmF0aW9ucy5mb3JFYWNoKChvcGVyYXRpb246IE9wZXJhdGlvbikgPT4gdGhpcy5fcGF0Y2hPcGVyYXRpb24oY29sbGVjdGlvbiwgb3BlcmF0aW9uLCBnZXRDdXJyZW50SHViKSk7XG4gIH1cblxuICAvKipcbiAgICogUGF0Y2hlcyBvcmlnaW5hbCBjb2xsZWN0aW9uIHRvIHV0aWxpemUgb3VyIHRyYWNpbmcgZnVuY3Rpb25hbGl0eVxuICAgKi9cbiAgcHJpdmF0ZSBfcGF0Y2hPcGVyYXRpb24oY29sbGVjdGlvbjogTW9uZ29Db2xsZWN0aW9uLCBvcGVyYXRpb246IE9wZXJhdGlvbiwgZ2V0Q3VycmVudEh1YjogKCkgPT4gSHViKTogdm9pZCB7XG4gICAgaWYgKCEob3BlcmF0aW9uIGluIGNvbGxlY3Rpb24ucHJvdG90eXBlKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZ2V0U3BhbkNvbnRleHQgPSB0aGlzLl9nZXRTcGFuQ29udGV4dEZyb21PcGVyYXRpb25Bcmd1bWVudHMuYmluZCh0aGlzKTtcblxuICAgIGZpbGwoY29sbGVjdGlvbi5wcm90b3R5cGUsIG9wZXJhdGlvbiwgZnVuY3Rpb24ob3JpZzogKCkgPT4gdm9pZCB8IFByb21pc2U8dW5rbm93bj4pIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbih0aGlzOiB1bmtub3duLCAuLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgICAgY29uc3QgbGFzdEFyZyA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSBnZXRDdXJyZW50SHViKCkuZ2V0U2NvcGUoKTtcbiAgICAgICAgY29uc3QgcGFyZW50U3BhbiA9IHNjb3BlPy5nZXRTcGFuKCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG9wZXJhdGlvbiB3YXMgcGFzc2VkIGEgY2FsbGJhY2suIChtYXBSZWR1Y2UgcmVxdWlyZXMgYSBkaWZmZXJlbnQgY2hlY2ssIGFzXG4gICAgICAgIC8vIGl0cyAobm9uLWNhbGxiYWNrKSBhcmd1bWVudHMgY2FuIGFsc28gYmUgZnVuY3Rpb25zLilcbiAgICAgICAgaWYgKHR5cGVvZiBsYXN0QXJnICE9PSAnZnVuY3Rpb24nIHx8IChvcGVyYXRpb24gPT09ICdtYXBSZWR1Y2UnICYmIGFyZ3MubGVuZ3RoID09PSAyKSkge1xuICAgICAgICAgIGNvbnN0IHNwYW4gPSBwYXJlbnRTcGFuPy5zdGFydENoaWxkKGdldFNwYW5Db250ZXh0KHRoaXMsIG9wZXJhdGlvbiwgYXJncykpO1xuICAgICAgICAgIGNvbnN0IG1heWJlUHJvbWlzZSA9IG9yaWcuY2FsbCh0aGlzLCAuLi5hcmdzKSBhcyBQcm9taXNlPHVua25vd24+O1xuXG4gICAgICAgICAgaWYgKGlzVGhlbmFibGUobWF5YmVQcm9taXNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG1heWJlUHJvbWlzZS50aGVuKChyZXM6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgc3Bhbj8uZmluaXNoKCk7XG4gICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3Bhbj8uZmluaXNoKCk7XG4gICAgICAgICAgICByZXR1cm4gbWF5YmVQcm9taXNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwYW4gPSBwYXJlbnRTcGFuPy5zdGFydENoaWxkKGdldFNwYW5Db250ZXh0KHRoaXMsIG9wZXJhdGlvbiwgYXJncy5zbGljZSgwLCAtMSkpKTtcbiAgICAgICAgcmV0dXJuIG9yaWcuY2FsbCh0aGlzLCAuLi5hcmdzLnNsaWNlKDAsIC0xKSwgZnVuY3Rpb24oZXJyOiBFcnJvciwgcmVzdWx0OiB1bmtub3duKSB7XG4gICAgICAgICAgc3Bhbj8uZmluaXNoKCk7XG4gICAgICAgICAgbGFzdEFyZyhlcnIsIHJlc3VsdCk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtIGEgU3BhbkNvbnRleHQgYmFzZWQgb24gdGhlIHVzZXIgaW5wdXQgdG8gYSBnaXZlbiBvcGVyYXRpb24uXG4gICAqL1xuICBwcml2YXRlIF9nZXRTcGFuQ29udGV4dEZyb21PcGVyYXRpb25Bcmd1bWVudHMoXG4gICAgY29sbGVjdGlvbjogTW9uZ29Db2xsZWN0aW9uLFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uLFxuICAgIGFyZ3M6IHVua25vd25bXSxcbiAgKTogU3BhbkNvbnRleHQge1xuICAgIGNvbnN0IGRhdGE6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICBjb2xsZWN0aW9uTmFtZTogY29sbGVjdGlvbi5jb2xsZWN0aW9uTmFtZSxcbiAgICAgIGRiTmFtZTogY29sbGVjdGlvbi5kYk5hbWUsXG4gICAgICBuYW1lc3BhY2U6IGNvbGxlY3Rpb24ubmFtZXNwYWNlLFxuICAgIH07XG4gICAgY29uc3Qgc3BhbkNvbnRleHQ6IFNwYW5Db250ZXh0ID0ge1xuICAgICAgb3A6IGBkYmAsXG4gICAgICBkZXNjcmlwdGlvbjogb3BlcmF0aW9uLFxuICAgICAgZGF0YSxcbiAgICB9O1xuXG4gICAgLy8gSWYgdGhlIG9wZXJhdGlvbiB0YWtlcyBubyBhcmd1bWVudHMgYmVzaWRlcyBgb3B0aW9uc2AgYW5kIGBjYWxsYmFja2AsIG9yIGlmIGFyZ3VtZW50XG4gICAgLy8gY29sbGVjdGlvbiBpcyBkaXNhYmxlZCBmb3IgdGhpcyBvcGVyYXRpb24sIGp1c3QgcmV0dXJuIGVhcmx5LlxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IE9QRVJBVElPTl9TSUdOQVRVUkVTW29wZXJhdGlvbl07XG4gICAgY29uc3Qgc2hvdWxkRGVzY3JpYmUgPSBBcnJheS5pc0FycmF5KHRoaXMuX2Rlc2NyaWJlT3BlcmF0aW9ucylcbiAgICAgID8gdGhpcy5fZGVzY3JpYmVPcGVyYXRpb25zLmluY2x1ZGVzKG9wZXJhdGlvbilcbiAgICAgIDogdGhpcy5fZGVzY3JpYmVPcGVyYXRpb25zO1xuXG4gICAgaWYgKCFzaWduYXR1cmUgfHwgIXNob3VsZERlc2NyaWJlKSB7XG4gICAgICByZXR1cm4gc3BhbkNvbnRleHQ7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgYG1hcFJlZHVjZWAsIGFzIHRoZSBvbmx5IG9uZSBhY2NlcHRpbmcgZnVuY3Rpb25zIGFzIGFyZ3VtZW50cy5cbiAgICAgIGlmIChvcGVyYXRpb24gPT09ICdtYXBSZWR1Y2UnKSB7XG4gICAgICAgIGNvbnN0IFttYXAsIHJlZHVjZV0gPSBhcmdzIGFzIHsgbmFtZT86IHN0cmluZyB9W107XG4gICAgICAgIGRhdGFbc2lnbmF0dXJlWzBdXSA9IHR5cGVvZiBtYXAgPT09ICdzdHJpbmcnID8gbWFwIDogbWFwLm5hbWUgfHwgJzxhbm9ueW1vdXM+JztcbiAgICAgICAgZGF0YVtzaWduYXR1cmVbMV1dID0gdHlwZW9mIHJlZHVjZSA9PT0gJ3N0cmluZycgPyByZWR1Y2UgOiByZWR1Y2UubmFtZSB8fCAnPGFub255bW91cz4nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaWduYXR1cmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBkYXRhW3NpZ25hdHVyZVtpXV0gPSBKU09OLnN0cmluZ2lmeShhcmdzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKF9vTykge1xuICAgICAgLy8gbm8tZW1wdHlcbiAgICB9XG5cbiAgICByZXR1cm4gc3BhbkNvbnRleHQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QsIGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG5pbXBvcnQgeyBGSU5JU0hfUkVBU09OX1RBRywgSURMRV9UUkFOU0FDVElPTl9GSU5JU0hfUkVBU09OUyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBJZGxlVHJhbnNhY3Rpb24gfSBmcm9tICcuLi9pZGxldHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgU3BhblN0YXR1cyB9IGZyb20gJy4uL3NwYW5zdGF0dXMnO1xuaW1wb3J0IHsgZ2V0QWN0aXZlVHJhbnNhY3Rpb24gfSBmcm9tICcuLi91dGlscyc7XG5cbmNvbnN0IGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdDxXaW5kb3c+KCk7XG5cbi8qKlxuICogQWRkIGEgbGlzdGVuZXIgdGhhdCBjYW5jZWxzIGFuZCBmaW5pc2hlcyBhIHRyYW5zYWN0aW9uIHdoZW4gdGhlIGdsb2JhbFxuICogZG9jdW1lbnQgaXMgaGlkZGVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJCYWNrZ3JvdW5kVGFiRGV0ZWN0aW9uKCk6IHZvaWQge1xuICBpZiAoZ2xvYmFsICYmIGdsb2JhbC5kb2N1bWVudCkge1xuICAgIGdsb2JhbC5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgKCkgPT4ge1xuICAgICAgY29uc3QgYWN0aXZlVHJhbnNhY3Rpb24gPSBnZXRBY3RpdmVUcmFuc2FjdGlvbigpIGFzIElkbGVUcmFuc2FjdGlvbjtcbiAgICAgIGlmIChnbG9iYWwuZG9jdW1lbnQuaGlkZGVuICYmIGFjdGl2ZVRyYW5zYWN0aW9uKSB7XG4gICAgICAgIGxvZ2dlci5sb2coXG4gICAgICAgICAgYFtUcmFjaW5nXSBUcmFuc2FjdGlvbjogJHtTcGFuU3RhdHVzLkNhbmNlbGxlZH0gLT4gc2luY2UgdGFiIG1vdmVkIHRvIHRoZSBiYWNrZ3JvdW5kLCBvcDogJHthY3RpdmVUcmFuc2FjdGlvbi5vcH1gLFxuICAgICAgICApO1xuICAgICAgICAvLyBXZSBzaG91bGQgbm90IHNldCBzdGF0dXMgaWYgaXQgaXMgYWxyZWFkeSBzZXQsIHRoaXMgcHJldmVudCBpbXBvcnRhbnQgc3RhdHVzZXMgbGlrZVxuICAgICAgICAvLyBlcnJvciBvciBkYXRhIGxvc3MgZnJvbSBiZWluZyBvdmVyd3JpdHRlbiBvbiB0cmFuc2FjdGlvbi5cbiAgICAgICAgaWYgKCFhY3RpdmVUcmFuc2FjdGlvbi5zdGF0dXMpIHtcbiAgICAgICAgICBhY3RpdmVUcmFuc2FjdGlvbi5zZXRTdGF0dXMoU3BhblN0YXR1cy5DYW5jZWxsZWQpO1xuICAgICAgICB9XG4gICAgICAgIGFjdGl2ZVRyYW5zYWN0aW9uLnNldFRhZygndmlzaWJpbGl0eWNoYW5nZScsICdkb2N1bWVudC5oaWRkZW4nKTtcbiAgICAgICAgYWN0aXZlVHJhbnNhY3Rpb24uc2V0VGFnKEZJTklTSF9SRUFTT05fVEFHLCBJRExFX1RSQU5TQUNUSU9OX0ZJTklTSF9SRUFTT05TWzJdKTtcbiAgICAgICAgYWN0aXZlVHJhbnNhY3Rpb24uZmluaXNoKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLndhcm4oJ1tUcmFjaW5nXSBDb3VsZCBub3Qgc2V0IHVwIGJhY2tncm91bmQgdGFiIGRldGVjdGlvbiBkdWUgdG8gbGFjayBvZiBnbG9iYWwgZG9jdW1lbnQnKTtcbiAgfVxufVxuIiwgIi8qXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBNZXRyaWMsIFJlcG9ydEhhbmRsZXIgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBiaW5kUmVwb3J0ZXIgPSAoXG4gIGNhbGxiYWNrOiBSZXBvcnRIYW5kbGVyLFxuICBtZXRyaWM6IE1ldHJpYyxcbiAgcmVwb3J0QWxsQ2hhbmdlcz86IGJvb2xlYW4sXG4pOiAoKGZvcmNlUmVwb3J0PzogYm9vbGVhbikgPT4gdm9pZCkgPT4ge1xuICBsZXQgcHJldlZhbHVlOiBudW1iZXI7XG4gIHJldHVybiAoZm9yY2VSZXBvcnQ/OiBib29sZWFuKSA9PiB7XG4gICAgaWYgKG1ldHJpYy52YWx1ZSA+PSAwKSB7XG4gICAgICBpZiAoZm9yY2VSZXBvcnQgfHwgcmVwb3J0QWxsQ2hhbmdlcykge1xuICAgICAgICBtZXRyaWMuZGVsdGEgPSBtZXRyaWMudmFsdWUgLSAocHJldlZhbHVlIHx8IDApO1xuXG4gICAgICAgIC8vIFJlcG9ydCB0aGUgbWV0cmljIGlmIHRoZXJlJ3MgYSBub24temVybyBkZWx0YSBvciBpZiBubyBwcmV2aW91c1xuICAgICAgICAvLyB2YWx1ZSBleGlzdHMgKHdoaWNoIGNhbiBoYXBwZW4gaW4gdGhlIGNhc2Ugb2YgdGhlIGRvY3VtZW50IGJlY29taW5nXG4gICAgICAgIC8vIGhpZGRlbiB3aGVuIHRoZSBtZXRyaWMgdmFsdWUgaXMgMCkuXG4gICAgICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL0dvb2dsZUNocm9tZS93ZWItdml0YWxzL2lzc3Vlcy8xNFxuICAgICAgICBpZiAobWV0cmljLmRlbHRhIHx8IHByZXZWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcHJldlZhbHVlID0gbWV0cmljLnZhbHVlO1xuICAgICAgICAgIGNhbGxiYWNrKG1ldHJpYyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuIiwgIi8qXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIFBlcmZvcm1hbnRseSBnZW5lcmF0ZSBhIHVuaXF1ZSwgMzAtY2hhciBzdHJpbmcgYnkgY29tYmluaW5nIGEgdmVyc2lvblxuICogbnVtYmVyLCB0aGUgY3VycmVudCB0aW1lc3RhbXAgd2l0aCBhIDEzLWRpZ2l0IG51bWJlciBpbnRlZ2VyLlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVVbmlxdWVJRCA9ICgpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gYHYyLSR7RGF0ZS5ub3coKX0tJHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoOWUxMiAtIDEpKSArIDFlMTJ9YDtcbn07XG4iLCAiLypcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IE1ldHJpYyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGdlbmVyYXRlVW5pcXVlSUQgfSBmcm9tICcuL2dlbmVyYXRlVW5pcXVlSUQnO1xuXG5leHBvcnQgY29uc3QgaW5pdE1ldHJpYyA9IChuYW1lOiBNZXRyaWNbJ25hbWUnXSwgdmFsdWU/OiBudW1iZXIpOiBNZXRyaWMgPT4ge1xuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgdmFsdWU6IHZhbHVlID8/IC0xLFxuICAgIGRlbHRhOiAwLFxuICAgIGVudHJpZXM6IFtdLFxuICAgIGlkOiBnZW5lcmF0ZVVuaXF1ZUlEKCksXG4gIH07XG59O1xuIiwgIi8qXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIFBlcmZvcm1hbmNlRW50cnlIYW5kbGVyIHtcbiAgKGVudHJ5OiBQZXJmb3JtYW5jZUVudHJ5KTogdm9pZDtcbn1cblxuLyoqXG4gKiBUYWtlcyBhIHBlcmZvcm1hbmNlIGVudHJ5IHR5cGUgYW5kIGEgY2FsbGJhY2sgZnVuY3Rpb24sIGFuZCBjcmVhdGVzIGFcbiAqIGBQZXJmb3JtYW5jZU9ic2VydmVyYCBpbnN0YW5jZSB0aGF0IHdpbGwgb2JzZXJ2ZSB0aGUgc3BlY2lmaWVkIGVudHJ5IHR5cGVcbiAqIHdpdGggYnVmZmVyaW5nIGVuYWJsZWQgYW5kIGNhbGwgdGhlIGNhbGxiYWNrIF9mb3IgZWFjaCBlbnRyeV8uXG4gKlxuICogVGhpcyBmdW5jdGlvbiBhbHNvIGZlYXR1cmUtZGV0ZWN0cyBlbnRyeSBzdXBwb3J0IGFuZCB3cmFwcyB0aGUgbG9naWMgaW4gYVxuICogdHJ5L2NhdGNoIHRvIGF2b2lkIGVycm9ycyBpbiB1bnN1cHBvcnRpbmcgYnJvd3NlcnMuXG4gKi9cbmV4cG9ydCBjb25zdCBvYnNlcnZlID0gKHR5cGU6IHN0cmluZywgY2FsbGJhY2s6IFBlcmZvcm1hbmNlRW50cnlIYW5kbGVyKTogUGVyZm9ybWFuY2VPYnNlcnZlciB8IHVuZGVmaW5lZCA9PiB7XG4gIHRyeSB7XG4gICAgaWYgKFBlcmZvcm1hbmNlT2JzZXJ2ZXIuc3VwcG9ydGVkRW50cnlUeXBlcy5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgLy8gTW9yZSBleHRlbnNpdmUgZmVhdHVyZSBkZXRlY3QgbmVlZGVkIGZvciBGaXJlZm94IGR1ZSB0bzpcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Hb29nbGVDaHJvbWUvd2ViLXZpdGFscy9pc3N1ZXMvMTQyXG4gICAgICBpZiAodHlwZSA9PT0gJ2ZpcnN0LWlucHV0JyAmJiAhKCdQZXJmb3JtYW5jZUV2ZW50VGltaW5nJyBpbiBzZWxmKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBvOiBQZXJmb3JtYW5jZU9ic2VydmVyID0gbmV3IFBlcmZvcm1hbmNlT2JzZXJ2ZXIobCA9PiBsLmdldEVudHJpZXMoKS5tYXAoY2FsbGJhY2spKTtcblxuICAgICAgcG8ub2JzZXJ2ZSh7IHR5cGUsIGJ1ZmZlcmVkOiB0cnVlIH0pO1xuICAgICAgcmV0dXJuIHBvO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIERvIG5vdGhpbmcuXG4gIH1cbiAgcmV0dXJuO1xufTtcbiIsICIvKlxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgZ2V0R2xvYmFsT2JqZWN0IH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT25IaWRkZW5DYWxsYmFjayB7XG4gIChldmVudDogRXZlbnQpOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3Qgb25IaWRkZW4gPSAoY2I6IE9uSGlkZGVuQ2FsbGJhY2ssIG9uY2U/OiBib29sZWFuKTogdm9pZCA9PiB7XG4gIGNvbnN0IG9uSGlkZGVuT3JQYWdlSGlkZSA9IChldmVudDogRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ3BhZ2VoaWRlJyB8fCBnZXRHbG9iYWxPYmplY3Q8V2luZG93PigpLmRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ2hpZGRlbicpIHtcbiAgICAgIGNiKGV2ZW50KTtcbiAgICAgIGlmIChvbmNlKSB7XG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBvbkhpZGRlbk9yUGFnZUhpZGUsIHRydWUpO1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKCdwYWdlaGlkZScsIG9uSGlkZGVuT3JQYWdlSGlkZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBhZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgb25IaWRkZW5PclBhZ2VIaWRlLCB0cnVlKTtcbiAgLy8gU29tZSBicm93c2VycyBoYXZlIGJ1Z2d5IGltcGxlbWVudGF0aW9ucyBvZiB2aXNpYmlsaXR5Y2hhbmdlLFxuICAvLyBzbyB3ZSB1c2UgcGFnZWhpZGUgaW4gYWRkaXRpb24sIGp1c3QgdG8gYmUgc2FmZS5cbiAgYWRkRXZlbnRMaXN0ZW5lcigncGFnZWhpZGUnLCBvbkhpZGRlbk9yUGFnZUhpZGUsIHRydWUpO1xufTtcbiIsICIvKlxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgYmluZFJlcG9ydGVyIH0gZnJvbSAnLi9saWIvYmluZFJlcG9ydGVyJztcbmltcG9ydCB7IGluaXRNZXRyaWMgfSBmcm9tICcuL2xpYi9pbml0TWV0cmljJztcbmltcG9ydCB7IG9ic2VydmUsIFBlcmZvcm1hbmNlRW50cnlIYW5kbGVyIH0gZnJvbSAnLi9saWIvb2JzZXJ2ZSc7XG5pbXBvcnQgeyBvbkhpZGRlbiB9IGZyb20gJy4vbGliL29uSGlkZGVuJztcbmltcG9ydCB7IFJlcG9ydEhhbmRsZXIgfSBmcm9tICcuL3R5cGVzJztcblxuLy8gaHR0cHM6Ly93aWNnLmdpdGh1Yi5pby9sYXlvdXQtaW5zdGFiaWxpdHkvI3NlYy1sYXlvdXQtc2hpZnRcbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0U2hpZnQgZXh0ZW5kcyBQZXJmb3JtYW5jZUVudHJ5IHtcbiAgdmFsdWU6IG51bWJlcjtcbiAgaGFkUmVjZW50SW5wdXQ6IGJvb2xlYW47XG4gIHNvdXJjZXM6IEFycmF5PExheW91dFNoaWZ0QXR0cmlidXRpb24+O1xuICB0b0pTT04oKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0U2hpZnRBdHRyaWJ1dGlvbiB7XG4gIG5vZGU/OiBOb2RlO1xuICBwcmV2aW91c1JlY3Q6IERPTVJlY3RSZWFkT25seTtcbiAgY3VycmVudFJlY3Q6IERPTVJlY3RSZWFkT25seTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldENMUyA9IChvblJlcG9ydDogUmVwb3J0SGFuZGxlciwgcmVwb3J0QWxsQ2hhbmdlcz86IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgY29uc3QgbWV0cmljID0gaW5pdE1ldHJpYygnQ0xTJywgMCk7XG4gIGxldCByZXBvcnQ6IFJldHVyblR5cGU8dHlwZW9mIGJpbmRSZXBvcnRlcj47XG5cbiAgbGV0IHNlc3Npb25WYWx1ZSA9IDA7XG4gIGxldCBzZXNzaW9uRW50cmllczogUGVyZm9ybWFuY2VFbnRyeVtdID0gW107XG5cbiAgY29uc3QgZW50cnlIYW5kbGVyID0gKGVudHJ5OiBMYXlvdXRTaGlmdCk6IHZvaWQgPT4ge1xuICAgIC8vIE9ubHkgY291bnQgbGF5b3V0IHNoaWZ0cyB3aXRob3V0IHJlY2VudCB1c2VyIGlucHV0LlxuICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2h5IGVudHJ5IGNhbiBiZSB1bmRlZmluZWRcbiAgICBpZiAoZW50cnkgJiYgIWVudHJ5LmhhZFJlY2VudElucHV0KSB7XG4gICAgICBjb25zdCBmaXJzdFNlc3Npb25FbnRyeSA9IHNlc3Npb25FbnRyaWVzWzBdO1xuICAgICAgY29uc3QgbGFzdFNlc3Npb25FbnRyeSA9IHNlc3Npb25FbnRyaWVzW3Nlc3Npb25FbnRyaWVzLmxlbmd0aCAtIDFdO1xuXG4gICAgICAvLyBJZiB0aGUgZW50cnkgb2NjdXJyZWQgbGVzcyB0aGFuIDEgc2Vjb25kIGFmdGVyIHRoZSBwcmV2aW91cyBlbnRyeSBhbmRcbiAgICAgIC8vIGxlc3MgdGhhbiA1IHNlY29uZHMgYWZ0ZXIgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBzZXNzaW9uLCBpbmNsdWRlIHRoZVxuICAgICAgLy8gZW50cnkgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4gT3RoZXJ3aXNlLCBzdGFydCBhIG5ldyBzZXNzaW9uLlxuICAgICAgaWYgKFxuICAgICAgICBzZXNzaW9uVmFsdWUgJiZcbiAgICAgICAgc2Vzc2lvbkVudHJpZXMubGVuZ3RoICE9PSAwICYmXG4gICAgICAgIGVudHJ5LnN0YXJ0VGltZSAtIGxhc3RTZXNzaW9uRW50cnkuc3RhcnRUaW1lIDwgMTAwMCAmJlxuICAgICAgICBlbnRyeS5zdGFydFRpbWUgLSBmaXJzdFNlc3Npb25FbnRyeS5zdGFydFRpbWUgPCA1MDAwXG4gICAgICApIHtcbiAgICAgICAgc2Vzc2lvblZhbHVlICs9IGVudHJ5LnZhbHVlO1xuICAgICAgICBzZXNzaW9uRW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlc3Npb25WYWx1ZSA9IGVudHJ5LnZhbHVlO1xuICAgICAgICBzZXNzaW9uRW50cmllcyA9IFtlbnRyeV07XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBjdXJyZW50IHNlc3Npb24gdmFsdWUgaXMgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgQ0xTIHZhbHVlLFxuICAgICAgLy8gdXBkYXRlIENMUyBhbmQgdGhlIGVudHJpZXMgY29udHJpYnV0aW5nIHRvIGl0LlxuICAgICAgaWYgKHNlc3Npb25WYWx1ZSA+IG1ldHJpYy52YWx1ZSkge1xuICAgICAgICBtZXRyaWMudmFsdWUgPSBzZXNzaW9uVmFsdWU7XG4gICAgICAgIG1ldHJpYy5lbnRyaWVzID0gc2Vzc2lvbkVudHJpZXM7XG4gICAgICAgIGlmIChyZXBvcnQpIHtcbiAgICAgICAgICByZXBvcnQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBwbyA9IG9ic2VydmUoJ2xheW91dC1zaGlmdCcsIGVudHJ5SGFuZGxlciBhcyBQZXJmb3JtYW5jZUVudHJ5SGFuZGxlcik7XG4gIGlmIChwbykge1xuICAgIHJlcG9ydCA9IGJpbmRSZXBvcnRlcihvblJlcG9ydCwgbWV0cmljLCByZXBvcnRBbGxDaGFuZ2VzKTtcblxuICAgIG9uSGlkZGVuKCgpID0+IHtcbiAgICAgIHBvLnRha2VSZWNvcmRzKCkubWFwKGVudHJ5SGFuZGxlciBhcyBQZXJmb3JtYW5jZUVudHJ5SGFuZGxlcik7XG4gICAgICByZXBvcnQodHJ1ZSk7XG4gICAgfSk7XG4gIH1cbn07XG4iLCAiLypcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGdldEdsb2JhbE9iamVjdCB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG5pbXBvcnQgeyBvbkhpZGRlbiB9IGZyb20gJy4vb25IaWRkZW4nO1xuXG5sZXQgZmlyc3RIaWRkZW5UaW1lID0gLTE7XG5cbmNvbnN0IGluaXRIaWRkZW5UaW1lID0gKCk6IG51bWJlciA9PiB7XG4gIHJldHVybiBnZXRHbG9iYWxPYmplY3Q8V2luZG93PigpLmRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ2hpZGRlbicgPyAwIDogSW5maW5pdHk7XG59O1xuXG5jb25zdCB0cmFja0NoYW5nZXMgPSAoKTogdm9pZCA9PiB7XG4gIC8vIFVwZGF0ZSB0aGUgdGltZSBpZi93aGVuIHRoZSBkb2N1bWVudCBiZWNvbWVzIGhpZGRlbi5cbiAgb25IaWRkZW4oKHsgdGltZVN0YW1wIH0pID0+IHtcbiAgICBmaXJzdEhpZGRlblRpbWUgPSB0aW1lU3RhbXA7XG4gIH0sIHRydWUpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFZpc2liaWxpdHlXYXRjaGVyID0gKCk6IHtcbiAgcmVhZG9ubHkgZmlyc3RIaWRkZW5UaW1lOiBudW1iZXI7XG59ID0+IHtcbiAgaWYgKGZpcnN0SGlkZGVuVGltZSA8IDApIHtcbiAgICAvLyBJZiB0aGUgZG9jdW1lbnQgaXMgaGlkZGVuIHdoZW4gdGhpcyBjb2RlIHJ1bnMsIGFzc3VtZSBpdCB3YXMgaGlkZGVuXG4gICAgLy8gc2luY2UgbmF2aWdhdGlvbiBzdGFydC4gVGhpcyBpc24ndCBhIHBlcmZlY3QgaGV1cmlzdGljLCBidXQgaXQncyB0aGVcbiAgICAvLyBiZXN0IHdlIGNhbiBkbyB1bnRpbCBhbiBBUEkgaXMgYXZhaWxhYmxlIHRvIHN1cHBvcnQgcXVlcnlpbmcgcGFzdFxuICAgIC8vIHZpc2liaWxpdHlTdGF0ZS5cbiAgICBmaXJzdEhpZGRlblRpbWUgPSBpbml0SGlkZGVuVGltZSgpO1xuICAgIHRyYWNrQ2hhbmdlcygpO1xuICB9XG4gIHJldHVybiB7XG4gICAgZ2V0IGZpcnN0SGlkZGVuVGltZSgpIHtcbiAgICAgIHJldHVybiBmaXJzdEhpZGRlblRpbWU7XG4gICAgfSxcbiAgfTtcbn07XG4iLCAiLypcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGJpbmRSZXBvcnRlciB9IGZyb20gJy4vbGliL2JpbmRSZXBvcnRlcic7XG5pbXBvcnQgeyBnZXRWaXNpYmlsaXR5V2F0Y2hlciB9IGZyb20gJy4vbGliL2dldFZpc2liaWxpdHlXYXRjaGVyJztcbmltcG9ydCB7IGluaXRNZXRyaWMgfSBmcm9tICcuL2xpYi9pbml0TWV0cmljJztcbmltcG9ydCB7IG9ic2VydmUsIFBlcmZvcm1hbmNlRW50cnlIYW5kbGVyIH0gZnJvbSAnLi9saWIvb2JzZXJ2ZSc7XG5pbXBvcnQgeyBvbkhpZGRlbiB9IGZyb20gJy4vbGliL29uSGlkZGVuJztcbmltcG9ydCB7IFBlcmZvcm1hbmNlRXZlbnRUaW1pbmcsIFJlcG9ydEhhbmRsZXIgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGdldEZJRCA9IChvblJlcG9ydDogUmVwb3J0SGFuZGxlciwgcmVwb3J0QWxsQ2hhbmdlcz86IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgY29uc3QgdmlzaWJpbGl0eVdhdGNoZXIgPSBnZXRWaXNpYmlsaXR5V2F0Y2hlcigpO1xuICBjb25zdCBtZXRyaWMgPSBpbml0TWV0cmljKCdGSUQnKTtcbiAgbGV0IHJlcG9ydDogUmV0dXJuVHlwZTx0eXBlb2YgYmluZFJlcG9ydGVyPjtcblxuICBjb25zdCBlbnRyeUhhbmRsZXIgPSAoZW50cnk6IFBlcmZvcm1hbmNlRXZlbnRUaW1pbmcpOiB2b2lkID0+IHtcbiAgICAvLyBPbmx5IHJlcG9ydCBpZiB0aGUgcGFnZSB3YXNuJ3QgaGlkZGVuIHByaW9yIHRvIHRoZSBmaXJzdCBpbnB1dC5cbiAgICBpZiAocmVwb3J0ICYmIGVudHJ5LnN0YXJ0VGltZSA8IHZpc2liaWxpdHlXYXRjaGVyLmZpcnN0SGlkZGVuVGltZSkge1xuICAgICAgbWV0cmljLnZhbHVlID0gZW50cnkucHJvY2Vzc2luZ1N0YXJ0IC0gZW50cnkuc3RhcnRUaW1lO1xuICAgICAgbWV0cmljLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICByZXBvcnQodHJ1ZSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHBvID0gb2JzZXJ2ZSgnZmlyc3QtaW5wdXQnLCBlbnRyeUhhbmRsZXIgYXMgUGVyZm9ybWFuY2VFbnRyeUhhbmRsZXIpO1xuICBpZiAocG8pIHtcbiAgICByZXBvcnQgPSBiaW5kUmVwb3J0ZXIob25SZXBvcnQsIG1ldHJpYywgcmVwb3J0QWxsQ2hhbmdlcyk7XG4gICAgb25IaWRkZW4oKCkgPT4ge1xuICAgICAgcG8udGFrZVJlY29yZHMoKS5tYXAoZW50cnlIYW5kbGVyIGFzIFBlcmZvcm1hbmNlRW50cnlIYW5kbGVyKTtcbiAgICAgIHBvLmRpc2Nvbm5lY3QoKTtcbiAgICB9LCB0cnVlKTtcbiAgfVxufTtcbiIsICIvKlxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgYmluZFJlcG9ydGVyIH0gZnJvbSAnLi9saWIvYmluZFJlcG9ydGVyJztcbmltcG9ydCB7IGdldFZpc2liaWxpdHlXYXRjaGVyIH0gZnJvbSAnLi9saWIvZ2V0VmlzaWJpbGl0eVdhdGNoZXInO1xuaW1wb3J0IHsgaW5pdE1ldHJpYyB9IGZyb20gJy4vbGliL2luaXRNZXRyaWMnO1xuaW1wb3J0IHsgb2JzZXJ2ZSwgUGVyZm9ybWFuY2VFbnRyeUhhbmRsZXIgfSBmcm9tICcuL2xpYi9vYnNlcnZlJztcbmltcG9ydCB7IG9uSGlkZGVuIH0gZnJvbSAnLi9saWIvb25IaWRkZW4nO1xuaW1wb3J0IHsgUmVwb3J0SGFuZGxlciB9IGZyb20gJy4vdHlwZXMnO1xuXG4vLyBodHRwczovL3dpY2cuZ2l0aHViLmlvL2xhcmdlc3QtY29udGVudGZ1bC1wYWludC8jc2VjLWxhcmdlc3QtY29udGVudGZ1bC1wYWludC1pbnRlcmZhY2VcbmV4cG9ydCBpbnRlcmZhY2UgTGFyZ2VzdENvbnRlbnRmdWxQYWludCBleHRlbmRzIFBlcmZvcm1hbmNlRW50cnkge1xuICByZW5kZXJUaW1lOiBET01IaWdoUmVzVGltZVN0YW1wO1xuICBsb2FkVGltZTogRE9NSGlnaFJlc1RpbWVTdGFtcDtcbiAgc2l6ZTogbnVtYmVyO1xuICBpZDogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgZWxlbWVudD86IEVsZW1lbnQ7XG4gIHRvSlNPTigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG5jb25zdCByZXBvcnRlZE1ldHJpY0lEczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcblxuZXhwb3J0IGNvbnN0IGdldExDUCA9IChvblJlcG9ydDogUmVwb3J0SGFuZGxlciwgcmVwb3J0QWxsQ2hhbmdlcz86IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgY29uc3QgdmlzaWJpbGl0eVdhdGNoZXIgPSBnZXRWaXNpYmlsaXR5V2F0Y2hlcigpO1xuICBjb25zdCBtZXRyaWMgPSBpbml0TWV0cmljKCdMQ1AnKTtcbiAgbGV0IHJlcG9ydDogUmV0dXJuVHlwZTx0eXBlb2YgYmluZFJlcG9ydGVyPjtcblxuICBjb25zdCBlbnRyeUhhbmRsZXIgPSAoZW50cnk6IFBlcmZvcm1hbmNlRW50cnkpOiB2b2lkID0+IHtcbiAgICAvLyBUaGUgc3RhcnRUaW1lIGF0dHJpYnV0ZSByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcmVuZGVyVGltZSBpZiBpdCBpcyBub3QgMCxcbiAgICAvLyBhbmQgdGhlIHZhbHVlIG9mIHRoZSBsb2FkVGltZSBvdGhlcndpc2UuXG4gICAgY29uc3QgdmFsdWUgPSBlbnRyeS5zdGFydFRpbWU7XG5cbiAgICAvLyBJZiB0aGUgcGFnZSB3YXMgaGlkZGVuIHByaW9yIHRvIHBhaW50IHRpbWUgb2YgdGhlIGVudHJ5LFxuICAgIC8vIGlnbm9yZSBpdCBhbmQgbWFyayB0aGUgbWV0cmljIGFzIGZpbmFsLCBvdGhlcndpc2UgYWRkIHRoZSBlbnRyeS5cbiAgICBpZiAodmFsdWUgPCB2aXNpYmlsaXR5V2F0Y2hlci5maXJzdEhpZGRlblRpbWUpIHtcbiAgICAgIG1ldHJpYy52YWx1ZSA9IHZhbHVlO1xuICAgICAgbWV0cmljLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgfVxuXG4gICAgaWYgKHJlcG9ydCkge1xuICAgICAgcmVwb3J0KCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHBvID0gb2JzZXJ2ZSgnbGFyZ2VzdC1jb250ZW50ZnVsLXBhaW50JywgZW50cnlIYW5kbGVyKTtcblxuICBpZiAocG8pIHtcbiAgICByZXBvcnQgPSBiaW5kUmVwb3J0ZXIob25SZXBvcnQsIG1ldHJpYywgcmVwb3J0QWxsQ2hhbmdlcyk7XG5cbiAgICBjb25zdCBzdG9wTGlzdGVuaW5nID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFyZXBvcnRlZE1ldHJpY0lEc1ttZXRyaWMuaWRdKSB7XG4gICAgICAgIHBvLnRha2VSZWNvcmRzKCkubWFwKGVudHJ5SGFuZGxlciBhcyBQZXJmb3JtYW5jZUVudHJ5SGFuZGxlcik7XG4gICAgICAgIHBvLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgcmVwb3J0ZWRNZXRyaWNJRHNbbWV0cmljLmlkXSA9IHRydWU7XG4gICAgICAgIHJlcG9ydCh0cnVlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gU3RvcCBsaXN0ZW5pbmcgYWZ0ZXIgaW5wdXQuIE5vdGU6IHdoaWxlIHNjcm9sbGluZyBpcyBhbiBpbnB1dCB0aGF0XG4gICAgLy8gc3RvcCBMQ1Agb2JzZXJ2YXRpb24sIGl0J3MgdW5yZWxpYWJsZSBzaW5jZSBpdCBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseVxuICAgIC8vIGdlbmVyYXRlZC4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vR29vZ2xlQ2hyb21lL3dlYi12aXRhbHMvaXNzdWVzLzc1XG4gICAgWydrZXlkb3duJywgJ2NsaWNrJ10uZm9yRWFjaCh0eXBlID0+IHtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIodHlwZSwgc3RvcExpc3RlbmluZywgeyBvbmNlOiB0cnVlLCBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIH0pO1xuXG4gICAgb25IaWRkZW4oc3RvcExpc3RlbmluZywgdHJ1ZSk7XG4gIH1cbn07XG4iLCAiLyogZXNsaW50LWRpc2FibGUgbWF4LWxpbmVzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBNZWFzdXJlbWVudHMsIFNwYW5Db250ZXh0IH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBicm93c2VyUGVyZm9ybWFuY2VUaW1lT3JpZ2luLCBnZXRHbG9iYWxPYmplY3QsIGh0bWxUcmVlQXNTdHJpbmcsIGlzTm9kZUVudiwgbG9nZ2VyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmltcG9ydCB7IFNwYW4gfSBmcm9tICcuLi9zcGFuJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgbXNUb1NlYyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IGdldENMUywgTGF5b3V0U2hpZnQgfSBmcm9tICcuL3dlYi12aXRhbHMvZ2V0Q0xTJztcbmltcG9ydCB7IGdldEZJRCB9IGZyb20gJy4vd2ViLXZpdGFscy9nZXRGSUQnO1xuaW1wb3J0IHsgZ2V0TENQLCBMYXJnZXN0Q29udGVudGZ1bFBhaW50IH0gZnJvbSAnLi93ZWItdml0YWxzL2dldExDUCc7XG5pbXBvcnQgeyBnZXRWaXNpYmlsaXR5V2F0Y2hlciB9IGZyb20gJy4vd2ViLXZpdGFscy9saWIvZ2V0VmlzaWJpbGl0eVdhdGNoZXInO1xuaW1wb3J0IHsgTmF2aWdhdG9yRGV2aWNlTWVtb3J5LCBOYXZpZ2F0b3JOZXR3b3JrSW5mb3JtYXRpb24gfSBmcm9tICcuL3dlYi12aXRhbHMvdHlwZXMnO1xuXG5jb25zdCBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3Q8V2luZG93PigpO1xuXG4vKiogQ2xhc3MgdHJhY2tpbmcgbWV0cmljcyAgKi9cbmV4cG9ydCBjbGFzcyBNZXRyaWNzSW5zdHJ1bWVudGF0aW9uIHtcbiAgcHJpdmF0ZSBfbWVhc3VyZW1lbnRzOiBNZWFzdXJlbWVudHMgPSB7fTtcblxuICBwcml2YXRlIF9wZXJmb3JtYW5jZUN1cnNvcjogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfbGNwRW50cnk6IExhcmdlc3RDb250ZW50ZnVsUGFpbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2Nsc0VudHJ5OiBMYXlvdXRTaGlmdCB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfcmVwb3J0QWxsQ2hhbmdlczogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKCFpc05vZGVFbnYoKSAmJiBnbG9iYWw/LnBlcmZvcm1hbmNlICYmIGdsb2JhbD8uZG9jdW1lbnQpIHtcbiAgICAgIGlmIChnbG9iYWwucGVyZm9ybWFuY2UubWFyaykge1xuICAgICAgICBnbG9iYWwucGVyZm9ybWFuY2UubWFyaygnc2VudHJ5LXRyYWNpbmctaW5pdCcpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl90cmFja0NMUygpO1xuICAgICAgdGhpcy5fdHJhY2tMQ1AoKTtcbiAgICAgIHRoaXMuX3RyYWNrRklEKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEFkZCBwZXJmb3JtYW5jZSByZWxhdGVkIHNwYW5zIHRvIGEgdHJhbnNhY3Rpb24gKi9cbiAgcHVibGljIGFkZFBlcmZvcm1hbmNlRW50cmllcyh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAoIWdsb2JhbCB8fCAhZ2xvYmFsLnBlcmZvcm1hbmNlIHx8ICFnbG9iYWwucGVyZm9ybWFuY2UuZ2V0RW50cmllcyB8fCAhYnJvd3NlclBlcmZvcm1hbmNlVGltZU9yaWdpbikge1xuICAgICAgLy8gR2F0ZWtlZXBlciBpZiBwZXJmb3JtYW5jZSBBUEkgbm90IGF2YWlsYWJsZVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZ2dlci5sb2coJ1tUcmFjaW5nXSBBZGRpbmcgJiBhZGp1c3Rpbmcgc3BhbnMgdXNpbmcgUGVyZm9ybWFuY2UgQVBJJyk7XG5cbiAgICBjb25zdCB0aW1lT3JpZ2luID0gbXNUb1NlYyhicm93c2VyUGVyZm9ybWFuY2VUaW1lT3JpZ2luKTtcbiAgICBsZXQgZW50cnlTY3JpcHRTcmM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChnbG9iYWwuZG9jdW1lbnQgJiYgZ2xvYmFsLmRvY3VtZW50LnNjcmlwdHMpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLWZvci1vZlxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnbG9iYWwuZG9jdW1lbnQuc2NyaXB0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBXZSBnbyB0aHJvdWdoIGFsbCBzY3JpcHRzIG9uIHRoZSBwYWdlIGFuZCBsb29rIGZvciAnZGF0YS1lbnRyeSdcbiAgICAgICAgLy8gV2UgcmVtZW1iZXIgdGhlIG5hbWUgYW5kIG1lYXN1cmUgdGhlIHRpbWUgYmV0d2VlbiB0aGlzIHNjcmlwdCBmaW5pc2hlZCBsb2FkaW5nIGFuZFxuICAgICAgICAvLyBvdXIgbWFyayAnc2VudHJ5LXRyYWNpbmctaW5pdCdcbiAgICAgICAgaWYgKGdsb2JhbC5kb2N1bWVudC5zY3JpcHRzW2ldLmRhdGFzZXQuZW50cnkgPT09ICd0cnVlJykge1xuICAgICAgICAgIGVudHJ5U2NyaXB0U3JjID0gZ2xvYmFsLmRvY3VtZW50LnNjcmlwdHNbaV0uc3JjO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGVudHJ5U2NyaXB0U3RhcnRUaW1lc3RhbXA6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgdHJhY2luZ0luaXRNYXJrU3RhcnRUaW1lOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlc3BvbnNlU3RhcnRUaW1lc3RhbXA6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVxdWVzdFN0YXJ0VGltZXN0YW1wOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgICBnbG9iYWwucGVyZm9ybWFuY2VcbiAgICAgIC5nZXRFbnRyaWVzKClcbiAgICAgIC5zbGljZSh0aGlzLl9wZXJmb3JtYW5jZUN1cnNvcilcbiAgICAgIC5mb3JFYWNoKChlbnRyeTogUmVjb3JkPHN0cmluZywgYW55PikgPT4ge1xuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBtc1RvU2VjKGVudHJ5LnN0YXJ0VGltZSBhcyBudW1iZXIpO1xuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IG1zVG9TZWMoZW50cnkuZHVyYXRpb24gYXMgbnVtYmVyKTtcblxuICAgICAgICBpZiAodHJhbnNhY3Rpb24ub3AgPT09ICduYXZpZ2F0aW9uJyAmJiB0aW1lT3JpZ2luICsgc3RhcnRUaW1lIDwgdHJhbnNhY3Rpb24uc3RhcnRUaW1lc3RhbXApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGVudHJ5LmVudHJ5VHlwZSkge1xuICAgICAgICAgIGNhc2UgJ25hdmlnYXRpb24nOiB7XG4gICAgICAgICAgICBhZGROYXZpZ2F0aW9uU3BhbnModHJhbnNhY3Rpb24sIGVudHJ5LCB0aW1lT3JpZ2luKTtcbiAgICAgICAgICAgIHJlc3BvbnNlU3RhcnRUaW1lc3RhbXAgPSB0aW1lT3JpZ2luICsgbXNUb1NlYyhlbnRyeS5yZXNwb25zZVN0YXJ0IGFzIG51bWJlcik7XG4gICAgICAgICAgICByZXF1ZXN0U3RhcnRUaW1lc3RhbXAgPSB0aW1lT3JpZ2luICsgbXNUb1NlYyhlbnRyeS5yZXF1ZXN0U3RhcnQgYXMgbnVtYmVyKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdtYXJrJzpcbiAgICAgICAgICBjYXNlICdwYWludCc6XG4gICAgICAgICAgY2FzZSAnbWVhc3VyZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZXN0YW1wID0gYWRkTWVhc3VyZVNwYW5zKHRyYW5zYWN0aW9uLCBlbnRyeSwgc3RhcnRUaW1lLCBkdXJhdGlvbiwgdGltZU9yaWdpbik7XG4gICAgICAgICAgICBpZiAodHJhY2luZ0luaXRNYXJrU3RhcnRUaW1lID09PSB1bmRlZmluZWQgJiYgZW50cnkubmFtZSA9PT0gJ3NlbnRyeS10cmFjaW5nLWluaXQnKSB7XG4gICAgICAgICAgICAgIHRyYWNpbmdJbml0TWFya1N0YXJ0VGltZSA9IHN0YXJ0VGltZXN0YW1wO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjYXB0dXJlIHdlYiB2aXRhbHNcblxuICAgICAgICAgICAgY29uc3QgZmlyc3RIaWRkZW4gPSBnZXRWaXNpYmlsaXR5V2F0Y2hlcigpO1xuICAgICAgICAgICAgLy8gT25seSByZXBvcnQgaWYgdGhlIHBhZ2Ugd2Fzbid0IGhpZGRlbiBwcmlvciB0byB0aGUgd2ViIHZpdGFsLlxuICAgICAgICAgICAgY29uc3Qgc2hvdWxkUmVjb3JkID0gZW50cnkuc3RhcnRUaW1lIDwgZmlyc3RIaWRkZW4uZmlyc3RIaWRkZW5UaW1lO1xuXG4gICAgICAgICAgICBpZiAoZW50cnkubmFtZSA9PT0gJ2ZpcnN0LXBhaW50JyAmJiBzaG91bGRSZWNvcmQpIHtcbiAgICAgICAgICAgICAgbG9nZ2VyLmxvZygnW01lYXN1cmVtZW50c10gQWRkaW5nIEZQJyk7XG4gICAgICAgICAgICAgIHRoaXMuX21lYXN1cmVtZW50c1snZnAnXSA9IHsgdmFsdWU6IGVudHJ5LnN0YXJ0VGltZSB9O1xuICAgICAgICAgICAgICB0aGlzLl9tZWFzdXJlbWVudHNbJ21hcmsuZnAnXSA9IHsgdmFsdWU6IHN0YXJ0VGltZXN0YW1wIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbnRyeS5uYW1lID09PSAnZmlyc3QtY29udGVudGZ1bC1wYWludCcgJiYgc2hvdWxkUmVjb3JkKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci5sb2coJ1tNZWFzdXJlbWVudHNdIEFkZGluZyBGQ1AnKTtcbiAgICAgICAgICAgICAgdGhpcy5fbWVhc3VyZW1lbnRzWydmY3AnXSA9IHsgdmFsdWU6IGVudHJ5LnN0YXJ0VGltZSB9O1xuICAgICAgICAgICAgICB0aGlzLl9tZWFzdXJlbWVudHNbJ21hcmsuZmNwJ10gPSB7IHZhbHVlOiBzdGFydFRpbWVzdGFtcCB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAncmVzb3VyY2UnOiB7XG4gICAgICAgICAgICBjb25zdCByZXNvdXJjZU5hbWUgPSAoZW50cnkubmFtZSBhcyBzdHJpbmcpLnJlcGxhY2UoZ2xvYmFsLmxvY2F0aW9uLm9yaWdpbiwgJycpO1xuICAgICAgICAgICAgY29uc3QgZW5kVGltZXN0YW1wID0gYWRkUmVzb3VyY2VTcGFucyh0cmFuc2FjdGlvbiwgZW50cnksIHJlc291cmNlTmFtZSwgc3RhcnRUaW1lLCBkdXJhdGlvbiwgdGltZU9yaWdpbik7XG4gICAgICAgICAgICAvLyBXZSByZW1lbWJlciB0aGUgZW50cnkgc2NyaXB0IGVuZCB0aW1lIHRvIGNhbGN1bGF0ZSB0aGUgZGlmZmVyZW5jZSB0byB0aGUgZmlyc3QgaW5pdCBtYXJrXG4gICAgICAgICAgICBpZiAoZW50cnlTY3JpcHRTdGFydFRpbWVzdGFtcCA9PT0gdW5kZWZpbmVkICYmIChlbnRyeVNjcmlwdFNyYyB8fCAnJykuaW5kZXhPZihyZXNvdXJjZU5hbWUpID4gLTEpIHtcbiAgICAgICAgICAgICAgZW50cnlTY3JpcHRTdGFydFRpbWVzdGFtcCA9IGVuZFRpbWVzdGFtcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIElnbm9yZSBvdGhlciBlbnRyeSB0eXBlcy5cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBpZiAoZW50cnlTY3JpcHRTdGFydFRpbWVzdGFtcCAhPT0gdW5kZWZpbmVkICYmIHRyYWNpbmdJbml0TWFya1N0YXJ0VGltZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBfc3RhcnRDaGlsZCh0cmFuc2FjdGlvbiwge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ2V2YWx1YXRpb24nLFxuICAgICAgICBlbmRUaW1lc3RhbXA6IHRyYWNpbmdJbml0TWFya1N0YXJ0VGltZSxcbiAgICAgICAgb3A6ICdzY3JpcHQnLFxuICAgICAgICBzdGFydFRpbWVzdGFtcDogZW50cnlTY3JpcHRTdGFydFRpbWVzdGFtcCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX3BlcmZvcm1hbmNlQ3Vyc29yID0gTWF0aC5tYXgocGVyZm9ybWFuY2UuZ2V0RW50cmllcygpLmxlbmd0aCAtIDEsIDApO1xuXG4gICAgdGhpcy5fdHJhY2tOYXZpZ2F0b3IodHJhbnNhY3Rpb24pO1xuXG4gICAgLy8gTWVhc3VyZW1lbnRzIGFyZSBvbmx5IGF2YWlsYWJsZSBmb3IgcGFnZWxvYWQgdHJhbnNhY3Rpb25zXG4gICAgaWYgKHRyYW5zYWN0aW9uLm9wID09PSAncGFnZWxvYWQnKSB7XG4gICAgICAvLyBub3JtYWxpemUgYXBwbGljYWJsZSB3ZWIgdml0YWwgdmFsdWVzIHRvIGJlIHJlbGF0aXZlIHRvIHRyYW5zYWN0aW9uLnN0YXJ0VGltZXN0YW1wXG5cbiAgICAgIGNvbnN0IHRpbWVPcmlnaW4gPSBtc1RvU2VjKGJyb3dzZXJQZXJmb3JtYW5jZVRpbWVPcmlnaW4pO1xuXG4gICAgICAvLyBHZW5lcmF0ZSBUVEZCIChUaW1lIHRvIEZpcnN0IEJ5dGUpLCB3aGljaCBtZWFzdXJlZCBhcyB0aGUgdGltZSBiZXR3ZWVuIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRyYW5zYWN0aW9uIGFuZCB0aGVcbiAgICAgIC8vIHN0YXJ0IG9mIHRoZSByZXNwb25zZSBpbiBtaWxsaXNlY29uZHNcbiAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2VTdGFydFRpbWVzdGFtcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgbG9nZ2VyLmxvZygnW01lYXN1cmVtZW50c10gQWRkaW5nIFRURkInKTtcbiAgICAgICAgdGhpcy5fbWVhc3VyZW1lbnRzWyd0dGZiJ10gPSB7IHZhbHVlOiAocmVzcG9uc2VTdGFydFRpbWVzdGFtcCAtIHRyYW5zYWN0aW9uLnN0YXJ0VGltZXN0YW1wKSAqIDEwMDAgfTtcblxuICAgICAgICBpZiAodHlwZW9mIHJlcXVlc3RTdGFydFRpbWVzdGFtcCA9PT0gJ251bWJlcicgJiYgcmVxdWVzdFN0YXJ0VGltZXN0YW1wIDw9IHJlc3BvbnNlU3RhcnRUaW1lc3RhbXApIHtcbiAgICAgICAgICAvLyBDYXB0dXJlIHRoZSB0aW1lIHNwZW50IG1ha2luZyB0aGUgcmVxdWVzdCBhbmQgcmVjZWl2aW5nIHRoZSBmaXJzdCBieXRlIG9mIHRoZSByZXNwb25zZS5cbiAgICAgICAgICAvLyBUaGlzIGlzIHRoZSB0aW1lIGJldHdlZW4gdGhlIHN0YXJ0IG9mIHRoZSByZXF1ZXN0IGFuZCB0aGUgc3RhcnQgb2YgdGhlIHJlc3BvbnNlIGluIG1pbGxpc2Vjb25kcy5cbiAgICAgICAgICB0aGlzLl9tZWFzdXJlbWVudHNbJ3R0ZmIucmVxdWVzdFRpbWUnXSA9IHsgdmFsdWU6IChyZXNwb25zZVN0YXJ0VGltZXN0YW1wIC0gcmVxdWVzdFN0YXJ0VGltZXN0YW1wKSAqIDEwMDAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBbJ2ZjcCcsICdmcCcsICdsY3AnXS5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuX21lYXN1cmVtZW50c1tuYW1lXSB8fCB0aW1lT3JpZ2luID49IHRyYW5zYWN0aW9uLnN0YXJ0VGltZXN0YW1wKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHdlYiB2aXRhbHMsIGZjcCwgZnAsIGxjcCwgYW5kIHR0ZmIsIGFsbCBtZWFzdXJlIHJlbGF0aXZlIHRvIHRpbWVPcmlnaW4uXG4gICAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHRpbWVPcmlnaW4gaXMgbm90IGNhcHR1cmVkIHdpdGhpbiB0aGUgdHJhbnNhY3Rpb24gc3BhbiBkYXRhLCBzbyB0aGVzZSB3ZWIgdml0YWxzIHdpbGwgbmVlZFxuICAgICAgICAvLyB0byBiZSBhZGp1c3RlZCB0byBiZSByZWxhdGl2ZSB0byB0cmFuc2FjdGlvbi5zdGFydFRpbWVzdGFtcC5cblxuICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX21lYXN1cmVtZW50c1tuYW1lXS52YWx1ZTtcbiAgICAgICAgY29uc3QgbWVhc3VyZW1lbnRUaW1lc3RhbXAgPSB0aW1lT3JpZ2luICsgbXNUb1NlYyhvbGRWYWx1ZSk7XG4gICAgICAgIC8vIG5vcm1hbGl6ZWRWYWx1ZSBzaG91bGQgYmUgaW4gbWlsbGlzZWNvbmRzXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IE1hdGguYWJzKChtZWFzdXJlbWVudFRpbWVzdGFtcCAtIHRyYW5zYWN0aW9uLnN0YXJ0VGltZXN0YW1wKSAqIDEwMDApO1xuXG4gICAgICAgIGNvbnN0IGRlbHRhID0gbm9ybWFsaXplZFZhbHVlIC0gb2xkVmFsdWU7XG4gICAgICAgIGxvZ2dlci5sb2coYFtNZWFzdXJlbWVudHNdIE5vcm1hbGl6ZWQgJHtuYW1lfSBmcm9tICR7b2xkVmFsdWV9IHRvICR7bm9ybWFsaXplZFZhbHVlfSAoJHtkZWx0YX0pYCk7XG5cbiAgICAgICAgdGhpcy5fbWVhc3VyZW1lbnRzW25hbWVdLnZhbHVlID0gbm9ybWFsaXplZFZhbHVlO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLl9tZWFzdXJlbWVudHNbJ21hcmsuZmlkJ10gJiYgdGhpcy5fbWVhc3VyZW1lbnRzWydmaWQnXSkge1xuICAgICAgICAvLyBjcmVhdGUgc3BhbiBmb3IgRklEXG5cbiAgICAgICAgX3N0YXJ0Q2hpbGQodHJhbnNhY3Rpb24sIHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ2ZpcnN0IGlucHV0IGRlbGF5JyxcbiAgICAgICAgICBlbmRUaW1lc3RhbXA6IHRoaXMuX21lYXN1cmVtZW50c1snbWFyay5maWQnXS52YWx1ZSArIG1zVG9TZWModGhpcy5fbWVhc3VyZW1lbnRzWydmaWQnXS52YWx1ZSksXG4gICAgICAgICAgb3A6ICd3ZWIudml0YWxzJyxcbiAgICAgICAgICBzdGFydFRpbWVzdGFtcDogdGhpcy5fbWVhc3VyZW1lbnRzWydtYXJrLmZpZCddLnZhbHVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgRkNQIGlzIG5vdCByZWNvcmRlZCB3ZSBzaG91bGQgbm90IHJlY29yZCB0aGUgY2xzIHZhbHVlXG4gICAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIG5ldyBkZWZpbml0aW9uIG9mIENMUy5cbiAgICAgIGlmICghKCdmY3AnIGluIHRoaXMuX21lYXN1cmVtZW50cykpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX21lYXN1cmVtZW50cy5jbHM7XG4gICAgICB9XG5cbiAgICAgIHRyYW5zYWN0aW9uLnNldE1lYXN1cmVtZW50cyh0aGlzLl9tZWFzdXJlbWVudHMpO1xuICAgICAgdGhpcy5fdGFnTWV0cmljSW5mbyh0cmFuc2FjdGlvbik7XG5cbiAgICAgIHRyYW5zYWN0aW9uLnNldFRhZygnc2VudHJ5X3JlcG9ydEFsbENoYW5nZXMnLCB0aGlzLl9yZXBvcnRBbGxDaGFuZ2VzKTtcbiAgICB9XG4gIH1cblxuICAvKiogQWRkIExDUCAvIENMUyBkYXRhIHRvIHRyYW5zYWN0aW9uIHRvIGFsbG93IGRlYnVnZ2luZyAqL1xuICBwcml2YXRlIF90YWdNZXRyaWNJbmZvKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9sY3BFbnRyeSkge1xuICAgICAgbG9nZ2VyLmxvZygnW01lYXN1cmVtZW50c10gQWRkaW5nIExDUCBEYXRhJyk7XG4gICAgICAvLyBDYXB0dXJlIFByb3BlcnRpZXMgb2YgdGhlIExDUCBlbGVtZW50IHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIExDUC5cblxuICAgICAgaWYgKHRoaXMuX2xjcEVudHJ5LmVsZW1lbnQpIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0VGFnKCdsY3AuZWxlbWVudCcsIGh0bWxUcmVlQXNTdHJpbmcodGhpcy5fbGNwRW50cnkuZWxlbWVudCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fbGNwRW50cnkuaWQpIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0VGFnKCdsY3AuaWQnLCB0aGlzLl9sY3BFbnRyeS5pZCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9sY3BFbnRyeS51cmwpIHtcbiAgICAgICAgLy8gVHJpbSBVUkwgdG8gdGhlIGZpcnN0IDIwMCBjaGFyYWN0ZXJzLlxuICAgICAgICB0cmFuc2FjdGlvbi5zZXRUYWcoJ2xjcC51cmwnLCB0aGlzLl9sY3BFbnRyeS51cmwudHJpbSgpLnNsaWNlKDAsIDIwMCkpO1xuICAgICAgfVxuXG4gICAgICB0cmFuc2FjdGlvbi5zZXRUYWcoJ2xjcC5zaXplJywgdGhpcy5fbGNwRW50cnkuc2l6ZSk7XG4gICAgfVxuXG4gICAgLy8gU2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTGF5b3V0U2hpZnRcbiAgICBpZiAodGhpcy5fY2xzRW50cnkgJiYgdGhpcy5fY2xzRW50cnkuc291cmNlcykge1xuICAgICAgbG9nZ2VyLmxvZygnW01lYXN1cmVtZW50c10gQWRkaW5nIENMUyBEYXRhJyk7XG4gICAgICB0aGlzLl9jbHNFbnRyeS5zb3VyY2VzLmZvckVhY2goKHNvdXJjZSwgaW5kZXgpID0+XG4gICAgICAgIHRyYW5zYWN0aW9uLnNldFRhZyhgY2xzLnNvdXJjZS4ke2luZGV4ICsgMX1gLCBodG1sVHJlZUFzU3RyaW5nKHNvdXJjZS5ub2RlKSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTdGFydHMgdHJhY2tpbmcgdGhlIEN1bXVsYXRpdmUgTGF5b3V0IFNoaWZ0IG9uIHRoZSBjdXJyZW50IHBhZ2UuICovXG4gIHByaXZhdGUgX3RyYWNrQ0xTKCk6IHZvaWQge1xuICAgIC8vIFNlZTpcbiAgICAvLyBodHRwczovL3dlYi5kZXYvZXZvbHZpbmctY2xzL1xuICAgIC8vIGh0dHBzOi8vd2ViLmRldi9jbHMtd2ViLXRvb2xpbmcvXG4gICAgZ2V0Q0xTKG1ldHJpYyA9PiB7XG4gICAgICBjb25zdCBlbnRyeSA9IG1ldHJpYy5lbnRyaWVzLnBvcCgpO1xuICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5sb2coJ1tNZWFzdXJlbWVudHNdIEFkZGluZyBDTFMnKTtcbiAgICAgIHRoaXMuX21lYXN1cmVtZW50c1snY2xzJ10gPSB7IHZhbHVlOiBtZXRyaWMudmFsdWUgfTtcbiAgICAgIHRoaXMuX2Nsc0VudHJ5ID0gZW50cnkgYXMgTGF5b3V0U2hpZnQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FwdHVyZSB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIHVzZXIgYWdlbnQuXG4gICAqL1xuICBwcml2YXRlIF90cmFja05hdmlnYXRvcih0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBuYXZpZ2F0b3IgPSBnbG9iYWwubmF2aWdhdG9yIGFzIG51bGwgfCAoTmF2aWdhdG9yICYgTmF2aWdhdG9yTmV0d29ya0luZm9ybWF0aW9uICYgTmF2aWdhdG9yRGV2aWNlTWVtb3J5KTtcbiAgICBpZiAoIW5hdmlnYXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHRyYWNrIG5ldHdvcmsgY29ubmVjdGl2aXR5XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IG5hdmlnYXRvci5jb25uZWN0aW9uO1xuICAgIGlmIChjb25uZWN0aW9uKSB7XG4gICAgICBpZiAoY29ubmVjdGlvbi5lZmZlY3RpdmVUeXBlKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLnNldFRhZygnZWZmZWN0aXZlQ29ubmVjdGlvblR5cGUnLCBjb25uZWN0aW9uLmVmZmVjdGl2ZVR5cGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29ubmVjdGlvbi50eXBlKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLnNldFRhZygnY29ubmVjdGlvblR5cGUnLCBjb25uZWN0aW9uLnR5cGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNNZWFzdXJlbWVudFZhbHVlKGNvbm5lY3Rpb24ucnR0KSkge1xuICAgICAgICB0aGlzLl9tZWFzdXJlbWVudHNbJ2Nvbm5lY3Rpb24ucnR0J10gPSB7IHZhbHVlOiBjb25uZWN0aW9uLnJ0dCBhcyBudW1iZXIgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTWVhc3VyZW1lbnRWYWx1ZShjb25uZWN0aW9uLmRvd25saW5rKSkge1xuICAgICAgICB0aGlzLl9tZWFzdXJlbWVudHNbJ2Nvbm5lY3Rpb24uZG93bmxpbmsnXSA9IHsgdmFsdWU6IGNvbm5lY3Rpb24uZG93bmxpbmsgYXMgbnVtYmVyIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzTWVhc3VyZW1lbnRWYWx1ZShuYXZpZ2F0b3IuZGV2aWNlTWVtb3J5KSkge1xuICAgICAgdHJhbnNhY3Rpb24uc2V0VGFnKCdkZXZpY2VNZW1vcnknLCBTdHJpbmcobmF2aWdhdG9yLmRldmljZU1lbW9yeSkpO1xuICAgIH1cblxuICAgIGlmIChpc01lYXN1cmVtZW50VmFsdWUobmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3kpKSB7XG4gICAgICB0cmFuc2FjdGlvbi5zZXRUYWcoJ2hhcmR3YXJlQ29uY3VycmVuY3knLCBTdHJpbmcobmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3kpKTtcbiAgICB9XG4gIH1cblxuICAvKiogU3RhcnRzIHRyYWNraW5nIHRoZSBMYXJnZXN0IENvbnRlbnRmdWwgUGFpbnQgb24gdGhlIGN1cnJlbnQgcGFnZS4gKi9cbiAgcHJpdmF0ZSBfdHJhY2tMQ1AoKTogdm9pZCB7XG4gICAgZ2V0TENQKG1ldHJpYyA9PiB7XG4gICAgICBjb25zdCBlbnRyeSA9IG1ldHJpYy5lbnRyaWVzLnBvcCgpO1xuXG4gICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGltZU9yaWdpbiA9IG1zVG9TZWMoYnJvd3NlclBlcmZvcm1hbmNlVGltZU9yaWdpbiBhcyBudW1iZXIpO1xuICAgICAgY29uc3Qgc3RhcnRUaW1lID0gbXNUb1NlYyhlbnRyeS5zdGFydFRpbWUgYXMgbnVtYmVyKTtcbiAgICAgIGxvZ2dlci5sb2coJ1tNZWFzdXJlbWVudHNdIEFkZGluZyBMQ1AnKTtcbiAgICAgIHRoaXMuX21lYXN1cmVtZW50c1snbGNwJ10gPSB7IHZhbHVlOiBtZXRyaWMudmFsdWUgfTtcbiAgICAgIHRoaXMuX21lYXN1cmVtZW50c1snbWFyay5sY3AnXSA9IHsgdmFsdWU6IHRpbWVPcmlnaW4gKyBzdGFydFRpbWUgfTtcbiAgICAgIHRoaXMuX2xjcEVudHJ5ID0gZW50cnkgYXMgTGFyZ2VzdENvbnRlbnRmdWxQYWludDtcbiAgICB9LCB0aGlzLl9yZXBvcnRBbGxDaGFuZ2VzKTtcbiAgfVxuXG4gIC8qKiBTdGFydHMgdHJhY2tpbmcgdGhlIEZpcnN0IElucHV0IERlbGF5IG9uIHRoZSBjdXJyZW50IHBhZ2UuICovXG4gIHByaXZhdGUgX3RyYWNrRklEKCk6IHZvaWQge1xuICAgIGdldEZJRChtZXRyaWMgPT4ge1xuICAgICAgY29uc3QgZW50cnkgPSBtZXRyaWMuZW50cmllcy5wb3AoKTtcblxuICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRpbWVPcmlnaW4gPSBtc1RvU2VjKGJyb3dzZXJQZXJmb3JtYW5jZVRpbWVPcmlnaW4gYXMgbnVtYmVyKTtcbiAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IG1zVG9TZWMoZW50cnkuc3RhcnRUaW1lIGFzIG51bWJlcik7XG4gICAgICBsb2dnZXIubG9nKCdbTWVhc3VyZW1lbnRzXSBBZGRpbmcgRklEJyk7XG4gICAgICB0aGlzLl9tZWFzdXJlbWVudHNbJ2ZpZCddID0geyB2YWx1ZTogbWV0cmljLnZhbHVlIH07XG4gICAgICB0aGlzLl9tZWFzdXJlbWVudHNbJ21hcmsuZmlkJ10gPSB7IHZhbHVlOiB0aW1lT3JpZ2luICsgc3RhcnRUaW1lIH07XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqIEluc3RydW1lbnQgbmF2aWdhdGlvbiBlbnRyaWVzICovXG5mdW5jdGlvbiBhZGROYXZpZ2F0aW9uU3BhbnModHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uLCBlbnRyeTogUmVjb3JkPHN0cmluZywgYW55PiwgdGltZU9yaWdpbjogbnVtYmVyKTogdm9pZCB7XG4gIGFkZFBlcmZvcm1hbmNlTmF2aWdhdGlvblRpbWluZyh7IHRyYW5zYWN0aW9uLCBlbnRyeSwgZXZlbnQ6ICd1bmxvYWRFdmVudCcsIHRpbWVPcmlnaW4gfSk7XG4gIGFkZFBlcmZvcm1hbmNlTmF2aWdhdGlvblRpbWluZyh7IHRyYW5zYWN0aW9uLCBlbnRyeSwgZXZlbnQ6ICdyZWRpcmVjdCcsIHRpbWVPcmlnaW4gfSk7XG4gIGFkZFBlcmZvcm1hbmNlTmF2aWdhdGlvblRpbWluZyh7IHRyYW5zYWN0aW9uLCBlbnRyeSwgZXZlbnQ6ICdkb21Db250ZW50TG9hZGVkRXZlbnQnLCB0aW1lT3JpZ2luIH0pO1xuICBhZGRQZXJmb3JtYW5jZU5hdmlnYXRpb25UaW1pbmcoeyB0cmFuc2FjdGlvbiwgZW50cnksIGV2ZW50OiAnbG9hZEV2ZW50JywgdGltZU9yaWdpbiB9KTtcbiAgYWRkUGVyZm9ybWFuY2VOYXZpZ2F0aW9uVGltaW5nKHsgdHJhbnNhY3Rpb24sIGVudHJ5LCBldmVudDogJ2Nvbm5lY3QnLCB0aW1lT3JpZ2luIH0pO1xuICBhZGRQZXJmb3JtYW5jZU5hdmlnYXRpb25UaW1pbmcoe1xuICAgIHRyYW5zYWN0aW9uLFxuICAgIGVudHJ5LFxuICAgIGV2ZW50OiAnc2VjdXJlQ29ubmVjdGlvbicsXG4gICAgdGltZU9yaWdpbixcbiAgICBldmVudEVuZDogJ2Nvbm5lY3RFbmQnLFxuICAgIGRlc2NyaXB0aW9uOiAnVExTL1NTTCcsXG4gIH0pO1xuICBhZGRQZXJmb3JtYW5jZU5hdmlnYXRpb25UaW1pbmcoe1xuICAgIHRyYW5zYWN0aW9uLFxuICAgIGVudHJ5LFxuICAgIGV2ZW50OiAnZmV0Y2gnLFxuICAgIHRpbWVPcmlnaW4sXG4gICAgZXZlbnRFbmQ6ICdkb21haW5Mb29rdXBTdGFydCcsXG4gICAgZGVzY3JpcHRpb246ICdjYWNoZScsXG4gIH0pO1xuICBhZGRQZXJmb3JtYW5jZU5hdmlnYXRpb25UaW1pbmcoeyB0cmFuc2FjdGlvbiwgZW50cnksIGV2ZW50OiAnZG9tYWluTG9va3VwJywgdGltZU9yaWdpbiwgZGVzY3JpcHRpb246ICdETlMnIH0pO1xuICBhZGRSZXF1ZXN0KHRyYW5zYWN0aW9uLCBlbnRyeSwgdGltZU9yaWdpbik7XG59XG5cbi8qKiBDcmVhdGUgbWVhc3VyZSByZWxhdGVkIHNwYW5zICovXG5mdW5jdGlvbiBhZGRNZWFzdXJlU3BhbnMoXG4gIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbixcbiAgZW50cnk6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHN0YXJ0VGltZTogbnVtYmVyLFxuICBkdXJhdGlvbjogbnVtYmVyLFxuICB0aW1lT3JpZ2luOiBudW1iZXIsXG4pOiBudW1iZXIge1xuICBjb25zdCBtZWFzdXJlU3RhcnRUaW1lc3RhbXAgPSB0aW1lT3JpZ2luICsgc3RhcnRUaW1lO1xuICBjb25zdCBtZWFzdXJlRW5kVGltZXN0YW1wID0gbWVhc3VyZVN0YXJ0VGltZXN0YW1wICsgZHVyYXRpb247XG5cbiAgX3N0YXJ0Q2hpbGQodHJhbnNhY3Rpb24sIHtcbiAgICBkZXNjcmlwdGlvbjogZW50cnkubmFtZSBhcyBzdHJpbmcsXG4gICAgZW5kVGltZXN0YW1wOiBtZWFzdXJlRW5kVGltZXN0YW1wLFxuICAgIG9wOiBlbnRyeS5lbnRyeVR5cGUgYXMgc3RyaW5nLFxuICAgIHN0YXJ0VGltZXN0YW1wOiBtZWFzdXJlU3RhcnRUaW1lc3RhbXAsXG4gIH0pO1xuXG4gIHJldHVybiBtZWFzdXJlU3RhcnRUaW1lc3RhbXA7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VFbnRyeSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaW5pdGlhdG9yVHlwZT86IHN0cmluZztcbiAgdHJhbnNmZXJTaXplPzogbnVtYmVyO1xuICBlbmNvZGVkQm9keVNpemU/OiBudW1iZXI7XG4gIGRlY29kZWRCb2R5U2l6ZT86IG51bWJlcjtcbn1cblxuLyoqIENyZWF0ZSByZXNvdXJjZS1yZWxhdGVkIHNwYW5zICovXG5leHBvcnQgZnVuY3Rpb24gYWRkUmVzb3VyY2VTcGFucyhcbiAgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uLFxuICBlbnRyeTogUmVzb3VyY2VFbnRyeSxcbiAgcmVzb3VyY2VOYW1lOiBzdHJpbmcsXG4gIHN0YXJ0VGltZTogbnVtYmVyLFxuICBkdXJhdGlvbjogbnVtYmVyLFxuICB0aW1lT3JpZ2luOiBudW1iZXIsXG4pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAvLyB3ZSBhbHJlYWR5IGluc3RydW1lbnQgYmFzZWQgb24gZmV0Y2ggYW5kIHhociwgc28gd2UgZG9uJ3QgbmVlZCB0b1xuICAvLyBkdXBsaWNhdGUgc3BhbnMgaGVyZS5cbiAgaWYgKGVudHJ5LmluaXRpYXRvclR5cGUgPT09ICd4bWxodHRwcmVxdWVzdCcgfHwgZW50cnkuaW5pdGlhdG9yVHlwZSA9PT0gJ2ZldGNoJykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGlmICgndHJhbnNmZXJTaXplJyBpbiBlbnRyeSkge1xuICAgIGRhdGFbJ1RyYW5zZmVyIFNpemUnXSA9IGVudHJ5LnRyYW5zZmVyU2l6ZTtcbiAgfVxuICBpZiAoJ2VuY29kZWRCb2R5U2l6ZScgaW4gZW50cnkpIHtcbiAgICBkYXRhWydFbmNvZGVkIEJvZHkgU2l6ZSddID0gZW50cnkuZW5jb2RlZEJvZHlTaXplO1xuICB9XG4gIGlmICgnZGVjb2RlZEJvZHlTaXplJyBpbiBlbnRyeSkge1xuICAgIGRhdGFbJ0RlY29kZWQgQm9keSBTaXplJ10gPSBlbnRyeS5kZWNvZGVkQm9keVNpemU7XG4gIH1cblxuICBjb25zdCBzdGFydFRpbWVzdGFtcCA9IHRpbWVPcmlnaW4gKyBzdGFydFRpbWU7XG4gIGNvbnN0IGVuZFRpbWVzdGFtcCA9IHN0YXJ0VGltZXN0YW1wICsgZHVyYXRpb247XG5cbiAgX3N0YXJ0Q2hpbGQodHJhbnNhY3Rpb24sIHtcbiAgICBkZXNjcmlwdGlvbjogcmVzb3VyY2VOYW1lLFxuICAgIGVuZFRpbWVzdGFtcCxcbiAgICBvcDogZW50cnkuaW5pdGlhdG9yVHlwZSA/IGByZXNvdXJjZS4ke2VudHJ5LmluaXRpYXRvclR5cGV9YCA6ICdyZXNvdXJjZScsXG4gICAgc3RhcnRUaW1lc3RhbXAsXG4gICAgZGF0YSxcbiAgfSk7XG5cbiAgcmV0dXJuIGVuZFRpbWVzdGFtcDtcbn1cblxuLyoqIENyZWF0ZSBwZXJmb3JtYW5jZSBuYXZpZ2F0aW9uIHJlbGF0ZWQgc3BhbnMgKi9cbmZ1bmN0aW9uIGFkZFBlcmZvcm1hbmNlTmF2aWdhdGlvblRpbWluZyhwcm9wczoge1xuICB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb247XG4gIGVudHJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBldmVudDogc3RyaW5nO1xuICB0aW1lT3JpZ2luOiBudW1iZXI7XG4gIGV2ZW50RW5kPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn0pOiB2b2lkIHtcbiAgY29uc3QgeyB0cmFuc2FjdGlvbiwgZW50cnksIGV2ZW50LCB0aW1lT3JpZ2luLCBldmVudEVuZCwgZGVzY3JpcHRpb24gfSA9IHByb3BzO1xuXG4gIGNvbnN0IGVuZCA9IGV2ZW50RW5kID8gKGVudHJ5W2V2ZW50RW5kXSBhcyBudW1iZXIgfCB1bmRlZmluZWQpIDogKGVudHJ5W2Ake2V2ZW50fUVuZGBdIGFzIG51bWJlciB8IHVuZGVmaW5lZCk7XG4gIGNvbnN0IHN0YXJ0ID0gZW50cnlbYCR7ZXZlbnR9U3RhcnRgXSBhcyBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGlmICghc3RhcnQgfHwgIWVuZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBfc3RhcnRDaGlsZCh0cmFuc2FjdGlvbiwge1xuICAgIG9wOiAnYnJvd3NlcicsXG4gICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uID8/IGV2ZW50LFxuICAgIHN0YXJ0VGltZXN0YW1wOiB0aW1lT3JpZ2luICsgbXNUb1NlYyhzdGFydCksXG4gICAgZW5kVGltZXN0YW1wOiB0aW1lT3JpZ2luICsgbXNUb1NlYyhlbmQpLFxuICB9KTtcbn1cblxuLyoqIENyZWF0ZSByZXF1ZXN0IGFuZCByZXNwb25zZSByZWxhdGVkIHNwYW5zICovXG5mdW5jdGlvbiBhZGRSZXF1ZXN0KHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbiwgZW50cnk6IFJlY29yZDxzdHJpbmcsIGFueT4sIHRpbWVPcmlnaW46IG51bWJlcik6IHZvaWQge1xuICBfc3RhcnRDaGlsZCh0cmFuc2FjdGlvbiwge1xuICAgIG9wOiAnYnJvd3NlcicsXG4gICAgZGVzY3JpcHRpb246ICdyZXF1ZXN0JyxcbiAgICBzdGFydFRpbWVzdGFtcDogdGltZU9yaWdpbiArIG1zVG9TZWMoZW50cnkucmVxdWVzdFN0YXJ0IGFzIG51bWJlciksXG4gICAgZW5kVGltZXN0YW1wOiB0aW1lT3JpZ2luICsgbXNUb1NlYyhlbnRyeS5yZXNwb25zZUVuZCBhcyBudW1iZXIpLFxuICB9KTtcblxuICBfc3RhcnRDaGlsZCh0cmFuc2FjdGlvbiwge1xuICAgIG9wOiAnYnJvd3NlcicsXG4gICAgZGVzY3JpcHRpb246ICdyZXNwb25zZScsXG4gICAgc3RhcnRUaW1lc3RhbXA6IHRpbWVPcmlnaW4gKyBtc1RvU2VjKGVudHJ5LnJlc3BvbnNlU3RhcnQgYXMgbnVtYmVyKSxcbiAgICBlbmRUaW1lc3RhbXA6IHRpbWVPcmlnaW4gKyBtc1RvU2VjKGVudHJ5LnJlc3BvbnNlRW5kIGFzIG51bWJlciksXG4gIH0pO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBzdGFydCBjaGlsZCBvbiB0cmFuc2FjdGlvbnMuIFRoaXMgZnVuY3Rpb24gd2lsbCBtYWtlIHN1cmUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gd2lsbFxuICogdXNlIHRoZSBzdGFydCB0aW1lc3RhbXAgb2YgdGhlIGNyZWF0ZWQgY2hpbGQgc3BhbiBpZiBpdCBpcyBlYXJsaWVyIHRoYW4gdGhlIHRyYW5zYWN0aW9ucyBhY3R1YWxcbiAqIHN0YXJ0IHRpbWVzdGFtcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9zdGFydENoaWxkKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbiwgeyBzdGFydFRpbWVzdGFtcCwgLi4uY3R4IH06IFNwYW5Db250ZXh0KTogU3BhbiB7XG4gIGlmIChzdGFydFRpbWVzdGFtcCAmJiB0cmFuc2FjdGlvbi5zdGFydFRpbWVzdGFtcCA+IHN0YXJ0VGltZXN0YW1wKSB7XG4gICAgdHJhbnNhY3Rpb24uc3RhcnRUaW1lc3RhbXAgPSBzdGFydFRpbWVzdGFtcDtcbiAgfVxuXG4gIHJldHVybiB0cmFuc2FjdGlvbi5zdGFydENoaWxkKHtcbiAgICBzdGFydFRpbWVzdGFtcCxcbiAgICAuLi5jdHgsXG4gIH0pO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGdpdmVuIHZhbHVlIGlzIGEgdmFsaWQgbWVhc3VyZW1lbnQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGlzTWVhc3VyZW1lbnRWYWx1ZSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbHVlKTtcbn1cbiIsICJpbXBvcnQgeyBhZGRJbnN0cnVtZW50YXRpb25IYW5kbGVyLCBpc0luc3RhbmNlT2YsIGlzTWF0Y2hpbmdQYXR0ZXJuIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmltcG9ydCB7IFNwYW4gfSBmcm9tICcuLi9zcGFuJztcbmltcG9ydCB7IFNwYW5TdGF0dXMgfSBmcm9tICcuLi9zcGFuc3RhdHVzJztcbmltcG9ydCB7IGdldEFjdGl2ZVRyYW5zYWN0aW9uLCBoYXNUcmFjaW5nRW5hYmxlZCB9IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfVFJBQ0lOR19PUklHSU5TID0gWydsb2NhbGhvc3QnLCAvXlxcLy9dO1xuXG4vKiogT3B0aW9ucyBmb3IgUmVxdWVzdCBJbnN0cnVtZW50YXRpb24gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdEluc3RydW1lbnRhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogTGlzdCBvZiBzdHJpbmdzIC8gcmVnZXggd2hlcmUgdGhlIGludGVncmF0aW9uIHNob3VsZCBjcmVhdGUgU3BhbnMgb3V0IG9mLiBBZGRpdGlvbmFsbHkgdGhpcyB3aWxsIGJlIHVzZWRcbiAgICogdG8gZGVmaW5lIHdoaWNoIG91dGdvaW5nIHJlcXVlc3RzIHRoZSBgc2VudHJ5LXRyYWNlYCBoZWFkZXIgd2lsbCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogRGVmYXVsdDogWydsb2NhbGhvc3QnLCAvXlxcLy9dIHtAc2VlIERFRkFVTFRfVFJBQ0lOR19PUklHSU5TfVxuICAgKi9cbiAgdHJhY2luZ09yaWdpbnM6IEFycmF5PHN0cmluZyB8IFJlZ0V4cD47XG5cbiAgLyoqXG4gICAqIEZsYWcgdG8gZGlzYWJsZSBwYXRjaGluZyBhbGwgdG9nZXRoZXIgZm9yIGZldGNoIHJlcXVlc3RzLlxuICAgKlxuICAgKiBEZWZhdWx0OiB0cnVlXG4gICAqL1xuICB0cmFjZUZldGNoOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBGbGFnIHRvIGRpc2FibGUgcGF0Y2hpbmcgYWxsIHRvZ2V0aGVyIGZvciB4aHIgcmVxdWVzdHMuXG4gICAqXG4gICAqIERlZmF1bHQ6IHRydWVcbiAgICovXG4gIHRyYWNlWEhSOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBjcmVhdGluZyBhIHNwYW4gZm9yIGEgcmVxdWVzdCB3aXRoIHRoZSBnaXZlbiB1cmwuXG4gICAqIFJldHVybiBmYWxzZSBpZiB5b3UgZG9uJ3Qgd2FudCBhIHNwYW4gZm9yIHRoZSBnaXZlbiB1cmwuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQgaXQgdXNlcyB0aGUgYHRyYWNpbmdPcmlnaW5zYCBvcHRpb25zIGFzIGEgdXJsIG1hdGNoLlxuICAgKi9cbiAgc2hvdWxkQ3JlYXRlU3BhbkZvclJlcXVlc3Q/KHVybDogc3RyaW5nKTogYm9vbGVhbjtcbn1cblxuLyoqIERhdGEgcmV0dXJuZWQgZnJvbSBmZXRjaCBjYWxsYmFjayAqL1xuZXhwb3J0IGludGVyZmFjZSBGZXRjaERhdGEge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBhcmdzOiBhbnlbXTsgLy8gdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGZldGNoIGNhbGwgaXRzZWxmXG4gIGZldGNoRGF0YT86IHtcbiAgICBtZXRob2Q6IHN0cmluZztcbiAgICB1cmw6IHN0cmluZztcbiAgICAvLyBzcGFuX2lkXG4gICAgX19zcGFuPzogc3RyaW5nO1xuICB9O1xuXG4gIC8vIFRPRE8gU2hvdWxkIHRoaXMgYmUgdW5rbm93biBpbnN0ZWFkPyBJZiB3ZSB2ZW5kb3IgdHlwZXMsIG1ha2UgaXQgYSBSZXNwb25zZVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICByZXNwb25zZT86IGFueTtcbiAgZXJyb3I/OiB1bmtub3duO1xuXG4gIHN0YXJ0VGltZXN0YW1wOiBudW1iZXI7XG4gIGVuZFRpbWVzdGFtcD86IG51bWJlcjtcbn1cblxuLyoqIERhdGEgcmV0dXJuZWQgZnJvbSBYSFIgcmVxdWVzdCAqL1xuZXhwb3J0IGludGVyZmFjZSBYSFJEYXRhIHtcbiAgeGhyPzoge1xuICAgIF9fc2VudHJ5X3hocl9fPzoge1xuICAgICAgbWV0aG9kOiBzdHJpbmc7XG4gICAgICB1cmw6IHN0cmluZztcbiAgICAgIHN0YXR1c19jb2RlOiBudW1iZXI7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICB9O1xuICAgIF9fc2VudHJ5X3hocl9zcGFuX2lkX18/OiBzdHJpbmc7XG4gICAgc2V0UmVxdWVzdEhlYWRlcj86IChrZXk6IHN0cmluZywgdmFsOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgX19zZW50cnlfb3duX3JlcXVlc3RfXz86IGJvb2xlYW47XG4gIH07XG4gIHN0YXJ0VGltZXN0YW1wOiBudW1iZXI7XG4gIGVuZFRpbWVzdGFtcD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uT3B0aW9uczogUmVxdWVzdEluc3RydW1lbnRhdGlvbk9wdGlvbnMgPSB7XG4gIHRyYWNlRmV0Y2g6IHRydWUsXG4gIHRyYWNlWEhSOiB0cnVlLFxuICB0cmFjaW5nT3JpZ2luczogREVGQVVMVF9UUkFDSU5HX09SSUdJTlMsXG59O1xuXG4vKiogUmVnaXN0ZXJzIHNwYW4gY3JlYXRvcnMgZm9yIHhociBhbmQgZmV0Y2ggcmVxdWVzdHMgICovXG5leHBvcnQgZnVuY3Rpb24gaW5zdHJ1bWVudE91dGdvaW5nUmVxdWVzdHMoX29wdGlvbnM/OiBQYXJ0aWFsPFJlcXVlc3RJbnN0cnVtZW50YXRpb25PcHRpb25zPik6IHZvaWQge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXG4gIGNvbnN0IHsgdHJhY2VGZXRjaCwgdHJhY2VYSFIsIHRyYWNpbmdPcmlnaW5zLCBzaG91bGRDcmVhdGVTcGFuRm9yUmVxdWVzdCB9ID0ge1xuICAgIC4uLmRlZmF1bHRSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uT3B0aW9ucyxcbiAgICAuLi5fb3B0aW9ucyxcbiAgfTtcblxuICAvLyBXZSBzaG91bGQgY2FjaGUgdXJsIC0+IGRlY2lzaW9uIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjb21wdXRlXG4gIC8vIHJlZ2V4cCBldmVyeXRpbWUgd2UgY3JlYXRlIGEgcmVxdWVzdC5cbiAgY29uc3QgdXJsTWFwOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuXG4gIGNvbnN0IGRlZmF1bHRTaG91bGRDcmVhdGVTcGFuID0gKHVybDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKHVybE1hcFt1cmxdKSB7XG4gICAgICByZXR1cm4gdXJsTWFwW3VybF07XG4gICAgfVxuICAgIGNvbnN0IG9yaWdpbnMgPSB0cmFjaW5nT3JpZ2lucztcbiAgICB1cmxNYXBbdXJsXSA9XG4gICAgICBvcmlnaW5zLnNvbWUoKG9yaWdpbjogc3RyaW5nIHwgUmVnRXhwKSA9PiBpc01hdGNoaW5nUGF0dGVybih1cmwsIG9yaWdpbikpICYmXG4gICAgICAhaXNNYXRjaGluZ1BhdHRlcm4odXJsLCAnc2VudHJ5X2tleScpO1xuICAgIHJldHVybiB1cmxNYXBbdXJsXTtcbiAgfTtcblxuICAvLyBXZSB3YW50IHRoYXQgb3VyIHVzZXJzIGRvbid0IGhhdmUgdG8gcmUtaW1wbGVtZW50IHNob3VsZENyZWF0ZVNwYW5Gb3JSZXF1ZXN0IHRoZW1zZWx2ZXNcbiAgLy8gVGhhdCdzIHdoeSB3ZSBmaWx0ZXIgb3V0IGFscmVhZHkgdW53YW50ZWQgU3BhbnMgZnJvbSB0cmFjaW5nT3JpZ2luc1xuICBsZXQgc2hvdWxkQ3JlYXRlU3BhbiA9IGRlZmF1bHRTaG91bGRDcmVhdGVTcGFuO1xuICBpZiAodHlwZW9mIHNob3VsZENyZWF0ZVNwYW5Gb3JSZXF1ZXN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc2hvdWxkQ3JlYXRlU3BhbiA9ICh1cmw6IHN0cmluZykgPT4ge1xuICAgICAgcmV0dXJuIGRlZmF1bHRTaG91bGRDcmVhdGVTcGFuKHVybCkgJiYgc2hvdWxkQ3JlYXRlU3BhbkZvclJlcXVlc3QodXJsKTtcbiAgICB9O1xuICB9XG5cbiAgY29uc3Qgc3BhbnM6IFJlY29yZDxzdHJpbmcsIFNwYW4+ID0ge307XG5cbiAgaWYgKHRyYWNlRmV0Y2gpIHtcbiAgICBhZGRJbnN0cnVtZW50YXRpb25IYW5kbGVyKHtcbiAgICAgIGNhbGxiYWNrOiAoaGFuZGxlckRhdGE6IEZldGNoRGF0YSkgPT4ge1xuICAgICAgICBmZXRjaENhbGxiYWNrKGhhbmRsZXJEYXRhLCBzaG91bGRDcmVhdGVTcGFuLCBzcGFucyk7XG4gICAgICB9LFxuICAgICAgdHlwZTogJ2ZldGNoJyxcbiAgICB9KTtcbiAgfVxuXG4gIGlmICh0cmFjZVhIUikge1xuICAgIGFkZEluc3RydW1lbnRhdGlvbkhhbmRsZXIoe1xuICAgICAgY2FsbGJhY2s6IChoYW5kbGVyRGF0YTogWEhSRGF0YSkgPT4ge1xuICAgICAgICB4aHJDYWxsYmFjayhoYW5kbGVyRGF0YSwgc2hvdWxkQ3JlYXRlU3Bhbiwgc3BhbnMpO1xuICAgICAgfSxcbiAgICAgIHR5cGU6ICd4aHInLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuZCB0cmFjayBmZXRjaCByZXF1ZXN0IHNwYW5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmZXRjaENhbGxiYWNrKFxuICBoYW5kbGVyRGF0YTogRmV0Y2hEYXRhLFxuICBzaG91bGRDcmVhdGVTcGFuOiAodXJsOiBzdHJpbmcpID0+IGJvb2xlYW4sXG4gIHNwYW5zOiBSZWNvcmQ8c3RyaW5nLCBTcGFuPixcbik6IHZvaWQge1xuICBpZiAoIWhhc1RyYWNpbmdFbmFibGVkKCkgfHwgIShoYW5kbGVyRGF0YS5mZXRjaERhdGEgJiYgc2hvdWxkQ3JlYXRlU3BhbihoYW5kbGVyRGF0YS5mZXRjaERhdGEudXJsKSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaGFuZGxlckRhdGEuZW5kVGltZXN0YW1wICYmIGhhbmRsZXJEYXRhLmZldGNoRGF0YS5fX3NwYW4pIHtcbiAgICBjb25zdCBzcGFuID0gc3BhbnNbaGFuZGxlckRhdGEuZmV0Y2hEYXRhLl9fc3Bhbl07XG4gICAgaWYgKHNwYW4pIHtcbiAgICAgIGlmIChoYW5kbGVyRGF0YS5yZXNwb25zZSkge1xuICAgICAgICAvLyBUT0RPIChrbWNsYikgcmVtb3ZlIHRoaXMgb25jZSB0eXBlcyBQUiBnb2VzIHRocm91Z2hcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICBzcGFuLnNldEh0dHBTdGF0dXMoaGFuZGxlckRhdGEucmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgIH0gZWxzZSBpZiAoaGFuZGxlckRhdGEuZXJyb3IpIHtcbiAgICAgICAgc3Bhbi5zZXRTdGF0dXMoU3BhblN0YXR1cy5JbnRlcm5hbEVycm9yKTtcbiAgICAgIH1cbiAgICAgIHNwYW4uZmluaXNoKCk7XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBzcGFuc1toYW5kbGVyRGF0YS5mZXRjaERhdGEuX19zcGFuXTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYWN0aXZlVHJhbnNhY3Rpb24gPSBnZXRBY3RpdmVUcmFuc2FjdGlvbigpO1xuICBpZiAoYWN0aXZlVHJhbnNhY3Rpb24pIHtcbiAgICBjb25zdCBzcGFuID0gYWN0aXZlVHJhbnNhY3Rpb24uc3RhcnRDaGlsZCh7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIC4uLmhhbmRsZXJEYXRhLmZldGNoRGF0YSxcbiAgICAgICAgdHlwZTogJ2ZldGNoJyxcbiAgICAgIH0sXG4gICAgICBkZXNjcmlwdGlvbjogYCR7aGFuZGxlckRhdGEuZmV0Y2hEYXRhLm1ldGhvZH0gJHtoYW5kbGVyRGF0YS5mZXRjaERhdGEudXJsfWAsXG4gICAgICBvcDogJ2h0dHAuY2xpZW50JyxcbiAgICB9KTtcblxuICAgIGhhbmRsZXJEYXRhLmZldGNoRGF0YS5fX3NwYW4gPSBzcGFuLnNwYW5JZDtcbiAgICBzcGFuc1tzcGFuLnNwYW5JZF0gPSBzcGFuO1xuXG4gICAgY29uc3QgcmVxdWVzdCA9IChoYW5kbGVyRGF0YS5hcmdzWzBdID0gaGFuZGxlckRhdGEuYXJnc1swXSBhcyBzdHJpbmcgfCBSZXF1ZXN0KTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IG9wdGlvbnMgPSAoaGFuZGxlckRhdGEuYXJnc1sxXSA9IChoYW5kbGVyRGF0YS5hcmdzWzFdIGFzIHsgW2tleTogc3RyaW5nXTogYW55IH0pIHx8IHt9KTtcbiAgICBsZXQgaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycztcbiAgICBpZiAoaXNJbnN0YW5jZU9mKHJlcXVlc3QsIFJlcXVlc3QpKSB7XG4gICAgICBoZWFkZXJzID0gKHJlcXVlc3QgYXMgUmVxdWVzdCkuaGVhZGVycztcbiAgICB9XG4gICAgaWYgKGhlYWRlcnMpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgIGlmICh0eXBlb2YgaGVhZGVycy5hcHBlbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICBoZWFkZXJzLmFwcGVuZCgnc2VudHJ5LXRyYWNlJywgc3Bhbi50b1RyYWNlcGFyZW50KCkpO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGhlYWRlcnMpKSB7XG4gICAgICAgIGhlYWRlcnMgPSBbLi4uaGVhZGVycywgWydzZW50cnktdHJhY2UnLCBzcGFuLnRvVHJhY2VwYXJlbnQoKV1dO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGVhZGVycyA9IHsgLi4uaGVhZGVycywgJ3NlbnRyeS10cmFjZSc6IHNwYW4udG9UcmFjZXBhcmVudCgpIH07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlYWRlcnMgPSB7ICdzZW50cnktdHJhY2UnOiBzcGFuLnRvVHJhY2VwYXJlbnQoKSB9O1xuICAgIH1cbiAgICBvcHRpb25zLmhlYWRlcnMgPSBoZWFkZXJzO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuZCB0cmFjayB4aHIgcmVxdWVzdCBzcGFuc1xuICovXG5leHBvcnQgZnVuY3Rpb24geGhyQ2FsbGJhY2soXG4gIGhhbmRsZXJEYXRhOiBYSFJEYXRhLFxuICBzaG91bGRDcmVhdGVTcGFuOiAodXJsOiBzdHJpbmcpID0+IGJvb2xlYW4sXG4gIHNwYW5zOiBSZWNvcmQ8c3RyaW5nLCBTcGFuPixcbik6IHZvaWQge1xuICBpZiAoXG4gICAgIWhhc1RyYWNpbmdFbmFibGVkKCkgfHxcbiAgICBoYW5kbGVyRGF0YS54aHI/Ll9fc2VudHJ5X293bl9yZXF1ZXN0X18gfHxcbiAgICAhKGhhbmRsZXJEYXRhLnhocj8uX19zZW50cnlfeGhyX18gJiYgc2hvdWxkQ3JlYXRlU3BhbihoYW5kbGVyRGF0YS54aHIuX19zZW50cnlfeGhyX18udXJsKSlcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgeGhyID0gaGFuZGxlckRhdGEueGhyLl9fc2VudHJ5X3hocl9fO1xuXG4gIC8vIGNoZWNrIGZpcnN0IGlmIHRoZSByZXF1ZXN0IGhhcyBmaW5pc2hlZCBhbmQgaXMgdHJhY2tlZCBieSBhbiBleGlzdGluZyBzcGFuIHdoaWNoIHNob3VsZCBub3cgZW5kXG4gIGlmIChoYW5kbGVyRGF0YS5lbmRUaW1lc3RhbXAgJiYgaGFuZGxlckRhdGEueGhyLl9fc2VudHJ5X3hocl9zcGFuX2lkX18pIHtcbiAgICBjb25zdCBzcGFuID0gc3BhbnNbaGFuZGxlckRhdGEueGhyLl9fc2VudHJ5X3hocl9zcGFuX2lkX19dO1xuICAgIGlmIChzcGFuKSB7XG4gICAgICBzcGFuLnNldEh0dHBTdGF0dXMoeGhyLnN0YXR1c19jb2RlKTtcbiAgICAgIHNwYW4uZmluaXNoKCk7XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBzcGFuc1toYW5kbGVyRGF0YS54aHIuX19zZW50cnlfeGhyX3NwYW5faWRfX107XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGlmIG5vdCwgY3JlYXRlIGEgbmV3IHNwYW4gdG8gdHJhY2sgaXRcbiAgY29uc3QgYWN0aXZlVHJhbnNhY3Rpb24gPSBnZXRBY3RpdmVUcmFuc2FjdGlvbigpO1xuICBpZiAoYWN0aXZlVHJhbnNhY3Rpb24pIHtcbiAgICBjb25zdCBzcGFuID0gYWN0aXZlVHJhbnNhY3Rpb24uc3RhcnRDaGlsZCh7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIC4uLnhoci5kYXRhLFxuICAgICAgICB0eXBlOiAneGhyJyxcbiAgICAgICAgbWV0aG9kOiB4aHIubWV0aG9kLFxuICAgICAgICB1cmw6IHhoci51cmwsXG4gICAgICB9LFxuICAgICAgZGVzY3JpcHRpb246IGAke3hoci5tZXRob2R9ICR7eGhyLnVybH1gLFxuICAgICAgb3A6ICdodHRwLmNsaWVudCcsXG4gICAgfSk7XG5cbiAgICBoYW5kbGVyRGF0YS54aHIuX19zZW50cnlfeGhyX3NwYW5faWRfXyA9IHNwYW4uc3BhbklkO1xuICAgIHNwYW5zW2hhbmRsZXJEYXRhLnhoci5fX3NlbnRyeV94aHJfc3Bhbl9pZF9fXSA9IHNwYW47XG5cbiAgICBpZiAoaGFuZGxlckRhdGEueGhyLnNldFJlcXVlc3RIZWFkZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhbmRsZXJEYXRhLnhoci5zZXRSZXF1ZXN0SGVhZGVyKCdzZW50cnktdHJhY2UnLCBzcGFuLnRvVHJhY2VwYXJlbnQoKSk7XG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIC8vIEVycm9yOiBJbnZhbGlkU3RhdGVFcnJvcjogRmFpbGVkIHRvIGV4ZWN1dGUgJ3NldFJlcXVlc3RIZWFkZXInIG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSBvYmplY3QncyBzdGF0ZSBtdXN0IGJlIE9QRU5FRC5cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb25Db250ZXh0IH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBhZGRJbnN0cnVtZW50YXRpb25IYW5kbGVyLCBnZXRHbG9iYWxPYmplY3QsIGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG5jb25zdCBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3Q8V2luZG93PigpO1xuXG4vKipcbiAqIERlZmF1bHQgZnVuY3Rpb24gaW1wbGVtZW50aW5nIHBhZ2Vsb2FkIGFuZCBuYXZpZ2F0aW9uIHRyYW5zYWN0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zdHJ1bWVudFJvdXRpbmdXaXRoRGVmYXVsdHM8VCBleHRlbmRzIFRyYW5zYWN0aW9uPihcbiAgY3VzdG9tU3RhcnRUcmFuc2FjdGlvbjogKGNvbnRleHQ6IFRyYW5zYWN0aW9uQ29udGV4dCkgPT4gVCB8IHVuZGVmaW5lZCxcbiAgc3RhcnRUcmFuc2FjdGlvbk9uUGFnZUxvYWQ6IGJvb2xlYW4gPSB0cnVlLFxuICBzdGFydFRyYW5zYWN0aW9uT25Mb2NhdGlvbkNoYW5nZTogYm9vbGVhbiA9IHRydWUsXG4pOiB2b2lkIHtcbiAgaWYgKCFnbG9iYWwgfHwgIWdsb2JhbC5sb2NhdGlvbikge1xuICAgIGxvZ2dlci53YXJuKCdDb3VsZCBub3QgaW5pdGlhbGl6ZSByb3V0aW5nIGluc3RydW1lbnRhdGlvbiBkdWUgdG8gaW52YWxpZCBsb2NhdGlvbicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBzdGFydGluZ1VybDogc3RyaW5nIHwgdW5kZWZpbmVkID0gZ2xvYmFsLmxvY2F0aW9uLmhyZWY7XG5cbiAgbGV0IGFjdGl2ZVRyYW5zYWN0aW9uOiBUIHwgdW5kZWZpbmVkO1xuICBpZiAoc3RhcnRUcmFuc2FjdGlvbk9uUGFnZUxvYWQpIHtcbiAgICBhY3RpdmVUcmFuc2FjdGlvbiA9IGN1c3RvbVN0YXJ0VHJhbnNhY3Rpb24oeyBuYW1lOiBnbG9iYWwubG9jYXRpb24ucGF0aG5hbWUsIG9wOiAncGFnZWxvYWQnIH0pO1xuICB9XG5cbiAgaWYgKHN0YXJ0VHJhbnNhY3Rpb25PbkxvY2F0aW9uQ2hhbmdlKSB7XG4gICAgYWRkSW5zdHJ1bWVudGF0aW9uSGFuZGxlcih7XG4gICAgICBjYWxsYmFjazogKHsgdG8sIGZyb20gfTogeyB0bzogc3RyaW5nOyBmcm9tPzogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZWFybHkgcmV0dXJuIGlzIHRoZXJlIHRvIGFjY291bnQgZm9yIHNvbWUgY2FzZXMgd2hlcmUgYSBuYXZpZ2F0aW9uIHRyYW5zYWN0aW9uIHN0YXJ0cyByaWdodCBhZnRlclxuICAgICAgICAgKiBsb25nLXJ1bm5pbmcgcGFnZWxvYWQuIFdlIG1ha2Ugc3VyZSB0aGF0IGlmIGBmcm9tYCBpcyB1bmRlZmluZWQgYW5kIGEgdmFsaWQgYHN0YXJ0aW5nVVJMYCBleGlzdHMsIHdlIGRvbid0XG4gICAgICAgICAqIGNyZWF0ZSBhbiB1bmVjY2Vzc2FyeSBuYXZpZ2F0aW9uIHRyYW5zYWN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGlzIHdhcyBoYXJkIHRvIGR1cGxpY2F0ZSwgYnV0IHRoaXMgYmVoYXZpb3Igc3RvcHBlZCBhcyBzb29uIGFzIHRoaXMgZml4IHdhcyBhcHBsaWVkLiBUaGlzIGlzc3VlIG1pZ2h0IGFsc29cbiAgICAgICAgICogb25seSBiZSBjYXVzZWQgaW4gY2VydGFpbiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMgd2hlcmUgdGhlIHVzYWdlIG9mIGEgaG90IG1vZHVsZSByZWxvYWRlciBpcyBjYXVzaW5nXG4gICAgICAgICAqIGVycm9ycy5cbiAgICAgICAgICovXG4gICAgICAgIGlmIChmcm9tID09PSB1bmRlZmluZWQgJiYgc3RhcnRpbmdVcmwgJiYgc3RhcnRpbmdVcmwuaW5kZXhPZih0bykgIT09IC0xKSB7XG4gICAgICAgICAgc3RhcnRpbmdVcmwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZyb20gIT09IHRvKSB7XG4gICAgICAgICAgc3RhcnRpbmdVcmwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKGFjdGl2ZVRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgICBsb2dnZXIubG9nKGBbVHJhY2luZ10gRmluaXNoaW5nIGN1cnJlbnQgdHJhbnNhY3Rpb24gd2l0aCBvcDogJHthY3RpdmVUcmFuc2FjdGlvbi5vcH1gKTtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gb3BlbiB0cmFuc2FjdGlvbiBvbiB0aGUgc2NvcGUsIHdlIG5lZWQgdG8gZmluaXNoIGl0IGJlZm9yZSBjcmVhdGluZyBhbiBuZXcgb25lLlxuICAgICAgICAgICAgYWN0aXZlVHJhbnNhY3Rpb24uZmluaXNoKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGl2ZVRyYW5zYWN0aW9uID0gY3VzdG9tU3RhcnRUcmFuc2FjdGlvbih7IG5hbWU6IGdsb2JhbC5sb2NhdGlvbi5wYXRobmFtZSwgb3A6ICduYXZpZ2F0aW9uJyB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHR5cGU6ICdoaXN0b3J5JyxcbiAgICB9KTtcbiAgfVxufVxuIiwgImltcG9ydCB7IEh1YiB9IGZyb20gJ0BzZW50cnkvaHViJztcbmltcG9ydCB7IEV2ZW50UHJvY2Vzc29yLCBJbnRlZ3JhdGlvbiwgVHJhbnNhY3Rpb24sIFRyYW5zYWN0aW9uQ29udGV4dCB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsT2JqZWN0LCBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW1wb3J0IHsgc3RhcnRJZGxlVHJhbnNhY3Rpb24gfSBmcm9tICcuLi9odWJleHRlbnNpb25zJztcbmltcG9ydCB7IERFRkFVTFRfSURMRV9USU1FT1VULCBJZGxlVHJhbnNhY3Rpb24gfSBmcm9tICcuLi9pZGxldHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgU3BhblN0YXR1cyB9IGZyb20gJy4uL3NwYW5zdGF0dXMnO1xuaW1wb3J0IHsgZXh0cmFjdFRyYWNlcGFyZW50RGF0YSwgc2VjVG9NcyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IHJlZ2lzdGVyQmFja2dyb3VuZFRhYkRldGVjdGlvbiB9IGZyb20gJy4vYmFja2dyb3VuZHRhYic7XG5pbXBvcnQgeyBNZXRyaWNzSW5zdHJ1bWVudGF0aW9uIH0gZnJvbSAnLi9tZXRyaWNzJztcbmltcG9ydCB7XG4gIGRlZmF1bHRSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uT3B0aW9ucyxcbiAgaW5zdHJ1bWVudE91dGdvaW5nUmVxdWVzdHMsXG4gIFJlcXVlc3RJbnN0cnVtZW50YXRpb25PcHRpb25zLFxufSBmcm9tICcuL3JlcXVlc3QnO1xuaW1wb3J0IHsgaW5zdHJ1bWVudFJvdXRpbmdXaXRoRGVmYXVsdHMgfSBmcm9tICcuL3JvdXRlcic7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX01BWF9UUkFOU0FDVElPTl9EVVJBVElPTl9TRUNPTkRTID0gNjAwO1xuXG4vKiogT3B0aW9ucyBmb3IgQnJvd3NlciBUcmFjaW5nIGludGVncmF0aW9uICovXG5leHBvcnQgaW50ZXJmYWNlIEJyb3dzZXJUcmFjaW5nT3B0aW9ucyBleHRlbmRzIFJlcXVlc3RJbnN0cnVtZW50YXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB0aW1lIHRvIHdhaXQgaW4gbXMgdW50aWwgdGhlIHRyYW5zYWN0aW9uIHdpbGwgYmUgZmluaXNoZWQuIFRoZSB0cmFuc2FjdGlvbiB3aWxsIHVzZSB0aGUgZW5kIHRpbWVzdGFtcCBvZlxuICAgKiB0aGUgbGFzdCBmaW5pc2hlZCBzcGFuIGFzIHRoZSBlbmR0aW1lIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIFRpbWUgaXMgaW4gbXMuXG4gICAqXG4gICAqIERlZmF1bHQ6IDEwMDBcbiAgICovXG4gIGlkbGVUaW1lb3V0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEZsYWcgdG8gZW5hYmxlL2Rpc2FibGUgY3JlYXRpb24gb2YgYG5hdmlnYXRpb25gIHRyYW5zYWN0aW9uIG9uIGhpc3RvcnkgY2hhbmdlcy5cbiAgICpcbiAgICogRGVmYXVsdDogdHJ1ZVxuICAgKi9cbiAgc3RhcnRUcmFuc2FjdGlvbk9uTG9jYXRpb25DaGFuZ2U6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEZsYWcgdG8gZW5hYmxlL2Rpc2FibGUgY3JlYXRpb24gb2YgYHBhZ2Vsb2FkYCB0cmFuc2FjdGlvbiBvbiBmaXJzdCBwYWdlbG9hZC5cbiAgICpcbiAgICogRGVmYXVsdDogdHJ1ZVxuICAgKi9cbiAgc3RhcnRUcmFuc2FjdGlvbk9uUGFnZUxvYWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIGR1cmF0aW9uIG9mIGEgdHJhbnNhY3Rpb24gYmVmb3JlIGl0IHdpbGwgYmUgbWFya2VkIGFzIFwiZGVhZGxpbmVfZXhjZWVkZWRcIi5cbiAgICogSWYgeW91IG5ldmVyIHdhbnQgdG8gbWFyayBhIHRyYW5zYWN0aW9uIHNldCBpdCB0byAwLlxuICAgKiBUaW1lIGlzIGluIHNlY29uZHMuXG4gICAqXG4gICAqIERlZmF1bHQ6IDYwMFxuICAgKi9cbiAgbWF4VHJhbnNhY3Rpb25EdXJhdGlvbjogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBGbGFnIFRyYW5zYWN0aW9ucyB3aGVyZSB0YWJzIG1vdmVkIHRvIGJhY2tncm91bmQgd2l0aCBcImNhbmNlbGxlZFwiLiBCcm93c2VyIGJhY2tncm91bmQgdGFiIHRpbWluZyBpc1xuICAgKiBub3Qgc3VpdGVkIHRvd2FyZHMgZG9pbmcgcHJlY2lzZSBtZWFzdXJlbWVudHMgb2Ygb3BlcmF0aW9ucy4gQnkgZGVmYXVsdCwgd2UgcmVjb21tZW5kIHRoYXQgdGhpcyBvcHRpb25cbiAgICogYmUgZW5hYmxlZCBhcyBiYWNrZ3JvdW5kIHRyYW5zYWN0aW9ucyBjYW4gbWVzcyB1cCB5b3VyIHN0YXRpc3RpY3MgaW4gbm9uZGV0ZXJtaW5pc3RpYyB3YXlzLlxuICAgKlxuICAgKiBEZWZhdWx0OiB0cnVlXG4gICAqL1xuICBtYXJrQmFja2dyb3VuZFRyYW5zYWN0aW9uczogYm9vbGVhbjtcblxuICAvKipcbiAgICogX21ldHJpY09wdGlvbnMgYWxsb3dzIHRoZSB1c2VyIHRvIHNlbmQgb3B0aW9ucyB0byBjaGFuZ2UgaG93IG1ldHJpY3MgYXJlIGNvbGxlY3RlZC5cbiAgICpcbiAgICogX21ldHJpY09wdGlvbnMgaXMgY3VycmVudGx5IGV4cGVyaW1lbnRhbC5cbiAgICpcbiAgICogRGVmYXVsdDogdW5kZWZpbmVkXG4gICAqL1xuICBfbWV0cmljT3B0aW9ucz86IFBhcnRpYWw8eyBfcmVwb3J0QWxsQ2hhbmdlczogYm9vbGVhbiB9PjtcblxuICAvKipcbiAgICogYmVmb3JlTmF2aWdhdGUgaXMgY2FsbGVkIGJlZm9yZSBhIHBhZ2Vsb2FkL25hdmlnYXRpb24gdHJhbnNhY3Rpb24gaXMgY3JlYXRlZCBhbmQgYWxsb3dzIHVzZXJzIHRvIG1vZGlmeSB0cmFuc2FjdGlvblxuICAgKiBjb250ZXh0IGRhdGEsIG9yIGRyb3AgdGhlIHRyYW5zYWN0aW9uIGVudGlyZWx5IChieSBzZXR0aW5nIGBzYW1wbGVkID0gZmFsc2VgIGluIHRoZSBjb250ZXh0KS5cbiAgICpcbiAgICogTm90ZTogRm9yIGxlZ2FjeSByZWFzb25zLCB0cmFuc2FjdGlvbnMgY2FuIGFsc28gYmUgZHJvcHBlZCBieSByZXR1cm5pbmcgYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0OiBUaGUgY29udGV4dCBkYXRhIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIGBzdGFydFRyYW5zYWN0aW9uYCBieSBkZWZhdWx0XG4gICAqXG4gICAqIEByZXR1cm5zIEEgKHBvdGVudGlhbGx5KSBtb2RpZmllZCBjb250ZXh0IG9iamVjdCwgd2l0aCBgc2FtcGxlZCA9IGZhbHNlYCBpZiB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGRyb3BwZWQuXG4gICAqL1xuICBiZWZvcmVOYXZpZ2F0ZT8oY29udGV4dDogVHJhbnNhY3Rpb25Db250ZXh0KTogVHJhbnNhY3Rpb25Db250ZXh0IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBJbnN0cnVtZW50YXRpb24gdGhhdCBjcmVhdGVzIHJvdXRpbmcgY2hhbmdlIHRyYW5zYWN0aW9ucy4gQnkgZGVmYXVsdCBjcmVhdGVzXG4gICAqIHBhZ2Vsb2FkIGFuZCBuYXZpZ2F0aW9uIHRyYW5zYWN0aW9ucy5cbiAgICovXG4gIHJvdXRpbmdJbnN0cnVtZW50YXRpb248VCBleHRlbmRzIFRyYW5zYWN0aW9uPihcbiAgICBjdXN0b21TdGFydFRyYW5zYWN0aW9uOiAoY29udGV4dDogVHJhbnNhY3Rpb25Db250ZXh0KSA9PiBUIHwgdW5kZWZpbmVkLFxuICAgIHN0YXJ0VHJhbnNhY3Rpb25PblBhZ2VMb2FkPzogYm9vbGVhbixcbiAgICBzdGFydFRyYW5zYWN0aW9uT25Mb2NhdGlvbkNoYW5nZT86IGJvb2xlYW4sXG4gICk6IHZvaWQ7XG59XG5cbmNvbnN0IERFRkFVTFRfQlJPV1NFUl9UUkFDSU5HX09QVElPTlMgPSB7XG4gIGlkbGVUaW1lb3V0OiBERUZBVUxUX0lETEVfVElNRU9VVCxcbiAgbWFya0JhY2tncm91bmRUcmFuc2FjdGlvbnM6IHRydWUsXG4gIG1heFRyYW5zYWN0aW9uRHVyYXRpb246IERFRkFVTFRfTUFYX1RSQU5TQUNUSU9OX0RVUkFUSU9OX1NFQ09ORFMsXG4gIHJvdXRpbmdJbnN0cnVtZW50YXRpb246IGluc3RydW1lbnRSb3V0aW5nV2l0aERlZmF1bHRzLFxuICBzdGFydFRyYW5zYWN0aW9uT25Mb2NhdGlvbkNoYW5nZTogdHJ1ZSxcbiAgc3RhcnRUcmFuc2FjdGlvbk9uUGFnZUxvYWQ6IHRydWUsXG4gIC4uLmRlZmF1bHRSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uT3B0aW9ucyxcbn07XG5cbi8qKlxuICogVGhlIEJyb3dzZXIgVHJhY2luZyBpbnRlZ3JhdGlvbiBhdXRvbWF0aWNhbGx5IGluc3RydW1lbnRzIGJyb3dzZXIgcGFnZWxvYWQvbmF2aWdhdGlvblxuICogYWN0aW9ucyBhcyB0cmFuc2FjdGlvbnMsIGFuZCBjYXB0dXJlcyByZXF1ZXN0cywgbWV0cmljcyBhbmQgZXJyb3JzIGFzIHNwYW5zLlxuICpcbiAqIFRoZSBpbnRlZ3JhdGlvbiBjYW4gYmUgY29uZmlndXJlZCB3aXRoIGEgdmFyaWV0eSBvZiBvcHRpb25zLCBhbmQgY2FuIGJlIGV4dGVuZGVkIHRvIHVzZVxuICogYW55IHJvdXRpbmcgbGlicmFyeS4gVGhpcyBpbnRlZ3JhdGlvbiB1c2VzIHtAc2VlIElkbGVUcmFuc2FjdGlvbn0gdG8gY3JlYXRlIHRyYW5zYWN0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJyb3dzZXJUcmFjaW5nIGltcGxlbWVudHMgSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWQ6IHN0cmluZyA9ICdCcm93c2VyVHJhY2luZyc7XG5cbiAgLyoqIEJyb3dzZXIgVHJhY2luZyBpbnRlZ3JhdGlvbiBvcHRpb25zICovXG4gIHB1YmxpYyBvcHRpb25zOiBCcm93c2VyVHJhY2luZ09wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgbmFtZTogc3RyaW5nID0gQnJvd3NlclRyYWNpbmcuaWQ7XG5cbiAgcHJpdmF0ZSBfZ2V0Q3VycmVudEh1Yj86ICgpID0+IEh1YjtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9tZXRyaWNzOiBNZXRyaWNzSW5zdHJ1bWVudGF0aW9uO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2VtaXRPcHRpb25zV2FybmluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBTdG9yZSBjb25maWd1cmVkIGlkbGUgdGltZW91dCBzbyB0aGF0IGl0IGNhbiBiZSBhZGRlZCBhcyBhIHRhZyB0byB0cmFuc2FjdGlvbnMgKi9cbiAgcHJpdmF0ZSBfY29uZmlndXJlZElkbGVUaW1lb3V0OiBCcm93c2VyVHJhY2luZ09wdGlvbnNbJ2lkbGVUaW1lb3V0J10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKF9vcHRpb25zPzogUGFydGlhbDxCcm93c2VyVHJhY2luZ09wdGlvbnM+KSB7XG4gICAgbGV0IHRyYWNpbmdPcmlnaW5zID0gZGVmYXVsdFJlcXVlc3RJbnN0cnVtZW50YXRpb25PcHRpb25zLnRyYWNpbmdPcmlnaW5zO1xuICAgIC8vIE5PVEU6IExvZ2dlciBkb2Vzbid0IHdvcmsgaW4gY29uc3RydWN0b3JzLCBhcyBpdCdzIGluaXRpYWxpemVkIGFmdGVyIGludGVncmF0aW9ucyBpbnN0YW5jZXNcbiAgICBpZiAoX29wdGlvbnMpIHtcbiAgICAgIHRoaXMuX2NvbmZpZ3VyZWRJZGxlVGltZW91dCA9IF9vcHRpb25zLmlkbGVUaW1lb3V0O1xuICAgICAgaWYgKF9vcHRpb25zLnRyYWNpbmdPcmlnaW5zICYmIEFycmF5LmlzQXJyYXkoX29wdGlvbnMudHJhY2luZ09yaWdpbnMpICYmIF9vcHRpb25zLnRyYWNpbmdPcmlnaW5zLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICB0cmFjaW5nT3JpZ2lucyA9IF9vcHRpb25zLnRyYWNpbmdPcmlnaW5zO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZW1pdE9wdGlvbnNXYXJuaW5nID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAuLi5ERUZBVUxUX0JST1dTRVJfVFJBQ0lOR19PUFRJT05TLFxuICAgICAgLi4uX29wdGlvbnMsXG4gICAgICB0cmFjaW5nT3JpZ2lucyxcbiAgICB9O1xuXG4gICAgY29uc3QgeyBfbWV0cmljT3B0aW9ucyB9ID0gdGhpcy5vcHRpb25zO1xuICAgIHRoaXMuX21ldHJpY3MgPSBuZXcgTWV0cmljc0luc3RydW1lbnRhdGlvbihfbWV0cmljT3B0aW9ucyAmJiBfbWV0cmljT3B0aW9ucy5fcmVwb3J0QWxsQ2hhbmdlcyk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXR1cE9uY2UoXzogKGNhbGxiYWNrOiBFdmVudFByb2Nlc3NvcikgPT4gdm9pZCwgZ2V0Q3VycmVudEh1YjogKCkgPT4gSHViKTogdm9pZCB7XG4gICAgdGhpcy5fZ2V0Q3VycmVudEh1YiA9IGdldEN1cnJlbnRIdWI7XG5cbiAgICBpZiAodGhpcy5fZW1pdE9wdGlvbnNXYXJuaW5nKSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgJ1tUcmFjaW5nXSBZb3UgbmVlZCB0byBkZWZpbmUgYHRyYWNpbmdPcmlnaW5zYCBpbiB0aGUgb3B0aW9ucy4gU2V0IGFuIGFycmF5IG9mIHVybHMgb3IgcGF0dGVybnMgdG8gdHJhY2UuJyxcbiAgICAgICk7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYFtUcmFjaW5nXSBXZSBhZGRlZCBhIHJlYXNvbmFibGUgZGVmYXVsdCBmb3IgeW91OiAke2RlZmF1bHRSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uT3B0aW9ucy50cmFjaW5nT3JpZ2luc31gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXG4gICAgY29uc3Qge1xuICAgICAgcm91dGluZ0luc3RydW1lbnRhdGlvbjogaW5zdHJ1bWVudFJvdXRpbmcsXG4gICAgICBzdGFydFRyYW5zYWN0aW9uT25Mb2NhdGlvbkNoYW5nZSxcbiAgICAgIHN0YXJ0VHJhbnNhY3Rpb25PblBhZ2VMb2FkLFxuICAgICAgbWFya0JhY2tncm91bmRUcmFuc2FjdGlvbnMsXG4gICAgICB0cmFjZUZldGNoLFxuICAgICAgdHJhY2VYSFIsXG4gICAgICB0cmFjaW5nT3JpZ2lucyxcbiAgICAgIHNob3VsZENyZWF0ZVNwYW5Gb3JSZXF1ZXN0LFxuICAgIH0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBpbnN0cnVtZW50Um91dGluZyhcbiAgICAgIChjb250ZXh0OiBUcmFuc2FjdGlvbkNvbnRleHQpID0+IHRoaXMuX2NyZWF0ZVJvdXRlVHJhbnNhY3Rpb24oY29udGV4dCksXG4gICAgICBzdGFydFRyYW5zYWN0aW9uT25QYWdlTG9hZCxcbiAgICAgIHN0YXJ0VHJhbnNhY3Rpb25PbkxvY2F0aW9uQ2hhbmdlLFxuICAgICk7XG5cbiAgICBpZiAobWFya0JhY2tncm91bmRUcmFuc2FjdGlvbnMpIHtcbiAgICAgIHJlZ2lzdGVyQmFja2dyb3VuZFRhYkRldGVjdGlvbigpO1xuICAgIH1cblxuICAgIGluc3RydW1lbnRPdXRnb2luZ1JlcXVlc3RzKHsgdHJhY2VGZXRjaCwgdHJhY2VYSFIsIHRyYWNpbmdPcmlnaW5zLCBzaG91bGRDcmVhdGVTcGFuRm9yUmVxdWVzdCB9KTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgcm91dGluZyBpZGxlIHRyYW5zYWN0aW9uLiAqL1xuICBwcml2YXRlIF9jcmVhdGVSb3V0ZVRyYW5zYWN0aW9uKGNvbnRleHQ6IFRyYW5zYWN0aW9uQ29udGV4dCk6IFRyYW5zYWN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuX2dldEN1cnJlbnRIdWIpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBbVHJhY2luZ10gRGlkIG5vdCBjcmVhdGUgJHtjb250ZXh0Lm9wfSB0cmFuc2FjdGlvbiBiZWNhdXNlIF9nZXRDdXJyZW50SHViIGlzIGludmFsaWQuYCk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2RcbiAgICBjb25zdCB7IGJlZm9yZU5hdmlnYXRlLCBpZGxlVGltZW91dCwgbWF4VHJhbnNhY3Rpb25EdXJhdGlvbiB9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgY29uc3QgcGFyZW50Q29udGV4dEZyb21IZWFkZXIgPSBjb250ZXh0Lm9wID09PSAncGFnZWxvYWQnID8gZ2V0SGVhZGVyQ29udGV4dCgpIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgZXhwYW5kZWRDb250ZXh0ID0ge1xuICAgICAgLi4uY29udGV4dCxcbiAgICAgIC4uLnBhcmVudENvbnRleHRGcm9tSGVhZGVyLFxuICAgICAgdHJpbUVuZDogdHJ1ZSxcbiAgICB9O1xuICAgIGNvbnN0IG1vZGlmaWVkQ29udGV4dCA9IHR5cGVvZiBiZWZvcmVOYXZpZ2F0ZSA9PT0gJ2Z1bmN0aW9uJyA/IGJlZm9yZU5hdmlnYXRlKGV4cGFuZGVkQ29udGV4dCkgOiBleHBhbmRlZENvbnRleHQ7XG5cbiAgICAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29ucywgYmVmb3JlTmF2aWdhdGUgY2FuIHJldHVybiB1bmRlZmluZWQgdG8gXCJkcm9wXCIgdGhlIHRyYW5zYWN0aW9uIChwcmV2ZW50IGl0XG4gICAgLy8gZnJvbSBiZWluZyBzZW50IHRvIFNlbnRyeSkuXG4gICAgY29uc3QgZmluYWxDb250ZXh0ID0gbW9kaWZpZWRDb250ZXh0ID09PSB1bmRlZmluZWQgPyB7IC4uLmV4cGFuZGVkQ29udGV4dCwgc2FtcGxlZDogZmFsc2UgfSA6IG1vZGlmaWVkQ29udGV4dDtcblxuICAgIGlmIChmaW5hbENvbnRleHQuc2FtcGxlZCA9PT0gZmFsc2UpIHtcbiAgICAgIGxvZ2dlci5sb2coYFtUcmFjaW5nXSBXaWxsIG5vdCBzZW5kICR7ZmluYWxDb250ZXh0Lm9wfSB0cmFuc2FjdGlvbiBiZWNhdXNlIG9mIGJlZm9yZU5hdmlnYXRlLmApO1xuICAgIH1cblxuICAgIGxvZ2dlci5sb2coYFtUcmFjaW5nXSBTdGFydGluZyAke2ZpbmFsQ29udGV4dC5vcH0gdHJhbnNhY3Rpb24gb24gc2NvcGVgKTtcblxuICAgIGNvbnN0IGh1YiA9IHRoaXMuX2dldEN1cnJlbnRIdWIoKTtcbiAgICBjb25zdCB7IGxvY2F0aW9uIH0gPSBnZXRHbG9iYWxPYmplY3QoKSBhcyBXaW5kb3dPcldvcmtlckdsb2JhbFNjb3BlICYgeyBsb2NhdGlvbjogTG9jYXRpb24gfTtcblxuICAgIGNvbnN0IGlkbGVUcmFuc2FjdGlvbiA9IHN0YXJ0SWRsZVRyYW5zYWN0aW9uKFxuICAgICAgaHViLFxuICAgICAgZmluYWxDb250ZXh0LFxuICAgICAgaWRsZVRpbWVvdXQsXG4gICAgICB0cnVlLFxuICAgICAgeyBsb2NhdGlvbiB9LCAvLyBmb3IgdXNlIGluIHRoZSB0cmFjZXNTYW1wbGVyXG4gICAgKTtcbiAgICBpZGxlVHJhbnNhY3Rpb24ucmVnaXN0ZXJCZWZvcmVGaW5pc2hDYWxsYmFjaygodHJhbnNhY3Rpb24sIGVuZFRpbWVzdGFtcCkgPT4ge1xuICAgICAgdGhpcy5fbWV0cmljcy5hZGRQZXJmb3JtYW5jZUVudHJpZXModHJhbnNhY3Rpb24pO1xuICAgICAgYWRqdXN0VHJhbnNhY3Rpb25EdXJhdGlvbihzZWNUb01zKG1heFRyYW5zYWN0aW9uRHVyYXRpb24pLCB0cmFuc2FjdGlvbiwgZW5kVGltZXN0YW1wKTtcbiAgICB9KTtcblxuICAgIGlkbGVUcmFuc2FjdGlvbi5zZXRUYWcoJ2lkbGVUaW1lb3V0JywgdGhpcy5fY29uZmlndXJlZElkbGVUaW1lb3V0KTtcblxuICAgIHJldHVybiBpZGxlVHJhbnNhY3Rpb24gYXMgVHJhbnNhY3Rpb247XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIHRyYW5zYWN0aW9uIGNvbnRleHQgZnJvbSBhIHNlbnRyeS10cmFjZSBtZXRhLlxuICpcbiAqIEByZXR1cm5zIFRyYW5zYWN0aW9uIGNvbnRleHQgZGF0YSBmcm9tIHRoZSBoZWFkZXIgb3IgdW5kZWZpbmVkIGlmIHRoZXJlJ3Mgbm8gaGVhZGVyIG9yIHRoZSBoZWFkZXIgaXMgbWFsZm9ybWVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRIZWFkZXJDb250ZXh0KCk6IFBhcnRpYWw8VHJhbnNhY3Rpb25Db250ZXh0PiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGhlYWRlciA9IGdldE1ldGFDb250ZW50KCdzZW50cnktdHJhY2UnKTtcbiAgaWYgKGhlYWRlcikge1xuICAgIHJldHVybiBleHRyYWN0VHJhY2VwYXJlbnREYXRhKGhlYWRlcik7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKiogUmV0dXJucyB0aGUgdmFsdWUgb2YgYSBtZXRhIHRhZyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1ldGFDb250ZW50KG1ldGFOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgZWwgPSBnZXRHbG9iYWxPYmplY3Q8V2luZG93PigpLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYG1ldGFbbmFtZT0ke21ldGFOYW1lfV1gKTtcbiAgcmV0dXJuIGVsID8gZWwuZ2V0QXR0cmlidXRlKCdjb250ZW50JykgOiBudWxsO1xufVxuXG4vKiogQWRqdXN0cyB0cmFuc2FjdGlvbiB2YWx1ZSBiYXNlZCBvbiBtYXggdHJhbnNhY3Rpb24gZHVyYXRpb24gKi9cbmZ1bmN0aW9uIGFkanVzdFRyYW5zYWN0aW9uRHVyYXRpb24obWF4RHVyYXRpb246IG51bWJlciwgdHJhbnNhY3Rpb246IElkbGVUcmFuc2FjdGlvbiwgZW5kVGltZXN0YW1wOiBudW1iZXIpOiB2b2lkIHtcbiAgY29uc3QgZGlmZiA9IGVuZFRpbWVzdGFtcCAtIHRyYW5zYWN0aW9uLnN0YXJ0VGltZXN0YW1wO1xuICBjb25zdCBpc091dGRhdGVkVHJhbnNhY3Rpb24gPSBlbmRUaW1lc3RhbXAgJiYgKGRpZmYgPiBtYXhEdXJhdGlvbiB8fCBkaWZmIDwgMCk7XG4gIGlmIChpc091dGRhdGVkVHJhbnNhY3Rpb24pIHtcbiAgICB0cmFuc2FjdGlvbi5zZXRTdGF0dXMoU3BhblN0YXR1cy5EZWFkbGluZUV4Y2VlZGVkKTtcbiAgICB0cmFuc2FjdGlvbi5zZXRUYWcoJ21heFRyYW5zYWN0aW9uRHVyYXRpb25FeGNlZWRlZCcsICd0cnVlJyk7XG4gIH1cbn1cbiIsICJleHBvcnQgeyBCcm93c2VyVHJhY2luZyB9IGZyb20gJy4vYnJvd3NlcnRyYWNpbmcnO1xuZXhwb3J0IHtcbiAgaW5zdHJ1bWVudE91dGdvaW5nUmVxdWVzdHMsXG4gIFJlcXVlc3RJbnN0cnVtZW50YXRpb25PcHRpb25zLFxuICBkZWZhdWx0UmVxdWVzdEluc3RydW1lbnRhdGlvbk9wdGlvbnMsXG59IGZyb20gJy4vcmVxdWVzdCc7XG4iLCAiZXhwb3J0IHsgRXhwcmVzcyB9IGZyb20gJy4vbm9kZS9leHByZXNzJztcbmV4cG9ydCB7IFBvc3RncmVzIH0gZnJvbSAnLi9ub2RlL3Bvc3RncmVzJztcbmV4cG9ydCB7IE15c3FsIH0gZnJvbSAnLi9ub2RlL215c3FsJztcbmV4cG9ydCB7IE1vbmdvIH0gZnJvbSAnLi9ub2RlL21vbmdvJztcblxuLy8gVE9ETyh2Nyk6IFJlbW92ZSB0aGlzIGV4cG9ydFxuLy8gUGxlYXNlIHNlZSBgc3JjL2luZGV4LnRzYCBmb3IgbW9yZSBkZXRhaWxzLlxuZXhwb3J0IHsgQnJvd3NlclRyYWNpbmcgfSBmcm9tICcuLi9icm93c2VyJztcbiIsICJpbXBvcnQgeyBhZGRFeHRlbnNpb25NZXRob2RzIH0gZnJvbSAnLi9odWJleHRlbnNpb25zJztcbmltcG9ydCAqIGFzIEludGVncmF0aW9ucyBmcm9tICcuL2ludGVncmF0aW9ucyc7XG5cbmV4cG9ydCB7IEludGVncmF0aW9ucyB9O1xuXG4vLyBUaGlzIGlzIGFscmVhZHkgZXhwb3J0ZWQgYXMgcGFydCBvZiBgSW50ZWdyYXRpb25zYCBhYm92ZSAoYW5kIGZvciB0aGUgbW9tZW50IHdpbGwgcmVtYWluIHNvIGZvclxuLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpLCBidXQgdGhhdCBpbnRlcmZlcmVzIHdpdGggdHJlZXNoYWtpbmcsIHNvIHdlIGFsc28gZXhwb3J0IGl0IHNlcGFyYXRlbHlcbi8vIGhlcmUuXG4vL1xuLy8gUHJldmlvdXNseSB3ZSBleHBlY3RlZCB1c2VycyB0byBpbXBvcnQgdHJhY2luZyBpbnRlZ3JhdGlvbnMgbGlrZVxuLy9cbi8vIGltcG9ydCB7IEludGVncmF0aW9ucyB9IGZyb20gJ0BzZW50cnkvdHJhY2luZyc7XG4vLyBjb25zdCBpbnN0YW5jZSA9IG5ldyBJbnRlZ3JhdGlvbnMuQnJvd3NlclRyYWNpbmcoKTtcbi8vXG4vLyBUaGlzIG1ha2VzIHRoZSBpbnRlZ3JhdGlvbnMgdW5hYmxlIHRvIGJlIHRyZWVzaGFrZW4gdGhvdWdoLiBUbyBhZGRyZXNzIHRoaXMsIHdlIG5vdyBoYXZlXG4vLyB0aGlzIGluZGl2aWR1YWwgZXhwb3J0LiBXZSBub3cgZXhwZWN0IHVzZXJzIHRvIGNvbnN1bWUgQnJvd3NlclRyYWNpbmcgbGlrZSBzbzpcbi8vXG4vLyBpbXBvcnQgeyBCcm93c2VyVHJhY2luZyB9IGZyb20gJ0BzZW50cnkvdHJhY2luZyc7XG4vLyBjb25zdCBpbnN0YW5jZSA9IG5ldyBCcm93c2VyVHJhY2luZygpO1xuLy9cbi8vIEZvciBhbiBleGFtcGxlIG9mIG9mIHRoZSBuZXcgdXNhZ2Ugb2YgQnJvd3NlclRyYWNpbmcsIHNlZSBAc2VudHJ5L25leHRqcyBpbmRleC5jbGllbnQudHNcbmV4cG9ydCB7IEJyb3dzZXJUcmFjaW5nIH0gZnJvbSAnLi9icm93c2VyJztcblxuZXhwb3J0IHsgU3BhbiB9IGZyb20gJy4vc3Bhbic7XG5leHBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuZXhwb3J0IHtcbiAgLy8gVE9ETyBkZXByZWNhdGUgb2xkIG5hbWUgaW4gdjdcbiAgaW5zdHJ1bWVudE91dGdvaW5nUmVxdWVzdHMgYXMgcmVnaXN0ZXJSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uLFxuICBSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uT3B0aW9ucyxcbiAgZGVmYXVsdFJlcXVlc3RJbnN0cnVtZW50YXRpb25PcHRpb25zLFxufSBmcm9tICcuL2Jyb3dzZXInO1xuZXhwb3J0IHsgU3BhblN0YXR1cyB9IGZyb20gJy4vc3BhbnN0YXR1cyc7XG5leHBvcnQgeyBJZGxlVHJhbnNhY3Rpb24gfSBmcm9tICcuL2lkbGV0cmFuc2FjdGlvbic7XG5leHBvcnQgeyBzdGFydElkbGVUcmFuc2FjdGlvbiB9IGZyb20gJy4vaHViZXh0ZW5zaW9ucyc7XG5cbi8vIFdlIGFyZSBwYXRjaGluZyB0aGUgZ2xvYmFsIG9iamVjdCB3aXRoIG91ciBodWIgZXh0ZW5zaW9uIG1ldGhvZHNcbmFkZEV4dGVuc2lvbk1ldGhvZHMoKTtcblxuZXhwb3J0IHsgYWRkRXh0ZW5zaW9uTWV0aG9kcyB9O1xuXG5leHBvcnQge1xuICBleHRyYWN0VHJhY2VwYXJlbnREYXRhLFxuICBnZXRBY3RpdmVUcmFuc2FjdGlvbixcbiAgaGFzVHJhY2luZ0VuYWJsZWQsXG4gIHN0cmlwVXJsUXVlcnlBbmRGcmFnbWVudCxcbiAgVFJBQ0VQQVJFTlRfUkVHRVhQLFxufSBmcm9tICcuL3V0aWxzJztcbiIsICIvKiFcbiAqIGNvb2tpZVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBSb21hbiBTaHR5bG1hblxuICogQ29weXJpZ2h0KGMpIDIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLnBhcnNlID0gcGFyc2U7XG5leHBvcnRzLnNlcmlhbGl6ZSA9IHNlcmlhbGl6ZTtcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgZGVjb2RlID0gZGVjb2RlVVJJQ29tcG9uZW50O1xudmFyIGVuY29kZSA9IGVuY29kZVVSSUNvbXBvbmVudDtcbnZhciBwYWlyU3BsaXRSZWdFeHAgPSAvOyAqLztcblxuLyoqXG4gKiBSZWdFeHAgdG8gbWF0Y2ggZmllbGQtY29udGVudCBpbiBSRkMgNzIzMCBzZWMgMy4yXG4gKlxuICogZmllbGQtY29udGVudCA9IGZpZWxkLXZjaGFyIFsgMSooIFNQIC8gSFRBQiApIGZpZWxkLXZjaGFyIF1cbiAqIGZpZWxkLXZjaGFyICAgPSBWQ0hBUiAvIG9icy10ZXh0XG4gKiBvYnMtdGV4dCAgICAgID0gJXg4MC1GRlxuICovXG5cbnZhciBmaWVsZENvbnRlbnRSZWdFeHAgPSAvXltcXHUwMDA5XFx1MDAyMC1cXHUwMDdlXFx1MDA4MC1cXHUwMGZmXSskLztcblxuLyoqXG4gKiBQYXJzZSBhIGNvb2tpZSBoZWFkZXIuXG4gKlxuICogUGFyc2UgdGhlIGdpdmVuIGNvb2tpZSBoZWFkZXIgc3RyaW5nIGludG8gYW4gb2JqZWN0XG4gKiBUaGUgb2JqZWN0IGhhcyB0aGUgdmFyaW91cyBjb29raWVzIGFzIGtleXMobmFtZXMpID0+IHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge29iamVjdH1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdHIsIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgc3RyIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgfVxuXG4gIHZhciBvYmogPSB7fVxuICB2YXIgb3B0ID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHBhaXJzID0gc3RyLnNwbGl0KHBhaXJTcGxpdFJlZ0V4cCk7XG4gIHZhciBkZWMgPSBvcHQuZGVjb2RlIHx8IGRlY29kZTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhaXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHBhaXIgPSBwYWlyc1tpXTtcbiAgICB2YXIgZXFfaWR4ID0gcGFpci5pbmRleE9mKCc9Jyk7XG5cbiAgICAvLyBza2lwIHRoaW5ncyB0aGF0IGRvbid0IGxvb2sgbGlrZSBrZXk9dmFsdWVcbiAgICBpZiAoZXFfaWR4IDwgMCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGtleSA9IHBhaXIuc3Vic3RyKDAsIGVxX2lkeCkudHJpbSgpXG4gICAgdmFyIHZhbCA9IHBhaXIuc3Vic3RyKCsrZXFfaWR4LCBwYWlyLmxlbmd0aCkudHJpbSgpO1xuXG4gICAgLy8gcXVvdGVkIHZhbHVlc1xuICAgIGlmICgnXCInID09IHZhbFswXSkge1xuICAgICAgdmFsID0gdmFsLnNsaWNlKDEsIC0xKTtcbiAgICB9XG5cbiAgICAvLyBvbmx5IGFzc2lnbiBvbmNlXG4gICAgaWYgKHVuZGVmaW5lZCA9PSBvYmpba2V5XSkge1xuICAgICAgb2JqW2tleV0gPSB0cnlEZWNvZGUodmFsLCBkZWMpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogU2VyaWFsaXplIGRhdGEgaW50byBhIGNvb2tpZSBoZWFkZXIuXG4gKlxuICogU2VyaWFsaXplIHRoZSBhIG5hbWUgdmFsdWUgcGFpciBpbnRvIGEgY29va2llIHN0cmluZyBzdWl0YWJsZSBmb3JcbiAqIGh0dHAgaGVhZGVycy4gQW4gb3B0aW9uYWwgb3B0aW9ucyBvYmplY3Qgc3BlY2lmaWVkIGNvb2tpZSBwYXJhbWV0ZXJzLlxuICpcbiAqIHNlcmlhbGl6ZSgnZm9vJywgJ2JhcicsIHsgaHR0cE9ubHk6IHRydWUgfSlcbiAqICAgPT4gXCJmb289YmFyOyBodHRwT25seVwiXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWxcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBzZXJpYWxpemUobmFtZSwgdmFsLCBvcHRpb25zKSB7XG4gIHZhciBvcHQgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgZW5jID0gb3B0LmVuY29kZSB8fCBlbmNvZGU7XG5cbiAgaWYgKHR5cGVvZiBlbmMgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gZW5jb2RlIGlzIGludmFsaWQnKTtcbiAgfVxuXG4gIGlmICghZmllbGRDb250ZW50UmVnRXhwLnRlc3QobmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBuYW1lIGlzIGludmFsaWQnKTtcbiAgfVxuXG4gIHZhciB2YWx1ZSA9IGVuYyh2YWwpO1xuXG4gIGlmICh2YWx1ZSAmJiAhZmllbGRDb250ZW50UmVnRXhwLnRlc3QodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgdmFsIGlzIGludmFsaWQnKTtcbiAgfVxuXG4gIHZhciBzdHIgPSBuYW1lICsgJz0nICsgdmFsdWU7XG5cbiAgaWYgKG51bGwgIT0gb3B0Lm1heEFnZSkge1xuICAgIHZhciBtYXhBZ2UgPSBvcHQubWF4QWdlIC0gMDtcblxuICAgIGlmIChpc05hTihtYXhBZ2UpIHx8ICFpc0Zpbml0ZShtYXhBZ2UpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gbWF4QWdlIGlzIGludmFsaWQnKVxuICAgIH1cblxuICAgIHN0ciArPSAnOyBNYXgtQWdlPScgKyBNYXRoLmZsb29yKG1heEFnZSk7XG4gIH1cblxuICBpZiAob3B0LmRvbWFpbikge1xuICAgIGlmICghZmllbGRDb250ZW50UmVnRXhwLnRlc3Qob3B0LmRvbWFpbikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBkb21haW4gaXMgaW52YWxpZCcpO1xuICAgIH1cblxuICAgIHN0ciArPSAnOyBEb21haW49JyArIG9wdC5kb21haW47XG4gIH1cblxuICBpZiAob3B0LnBhdGgpIHtcbiAgICBpZiAoIWZpZWxkQ29udGVudFJlZ0V4cC50ZXN0KG9wdC5wYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIHBhdGggaXMgaW52YWxpZCcpO1xuICAgIH1cblxuICAgIHN0ciArPSAnOyBQYXRoPScgKyBvcHQucGF0aDtcbiAgfVxuXG4gIGlmIChvcHQuZXhwaXJlcykge1xuICAgIGlmICh0eXBlb2Ygb3B0LmV4cGlyZXMudG9VVENTdHJpbmcgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBleHBpcmVzIGlzIGludmFsaWQnKTtcbiAgICB9XG5cbiAgICBzdHIgKz0gJzsgRXhwaXJlcz0nICsgb3B0LmV4cGlyZXMudG9VVENTdHJpbmcoKTtcbiAgfVxuXG4gIGlmIChvcHQuaHR0cE9ubHkpIHtcbiAgICBzdHIgKz0gJzsgSHR0cE9ubHknO1xuICB9XG5cbiAgaWYgKG9wdC5zZWN1cmUpIHtcbiAgICBzdHIgKz0gJzsgU2VjdXJlJztcbiAgfVxuXG4gIGlmIChvcHQuc2FtZVNpdGUpIHtcbiAgICB2YXIgc2FtZVNpdGUgPSB0eXBlb2Ygb3B0LnNhbWVTaXRlID09PSAnc3RyaW5nJ1xuICAgICAgPyBvcHQuc2FtZVNpdGUudG9Mb3dlckNhc2UoKSA6IG9wdC5zYW1lU2l0ZTtcblxuICAgIHN3aXRjaCAoc2FtZVNpdGUpIHtcbiAgICAgIGNhc2UgdHJ1ZTpcbiAgICAgICAgc3RyICs9ICc7IFNhbWVTaXRlPVN0cmljdCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbGF4JzpcbiAgICAgICAgc3RyICs9ICc7IFNhbWVTaXRlPUxheCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3RyaWN0JzpcbiAgICAgICAgc3RyICs9ICc7IFNhbWVTaXRlPVN0cmljdCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHN0ciArPSAnOyBTYW1lU2l0ZT1Ob25lJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gc2FtZVNpdGUgaXMgaW52YWxpZCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdHI7XG59XG5cbi8qKlxuICogVHJ5IGRlY29kaW5nIGEgc3RyaW5nIHVzaW5nIGEgZGVjb2RpbmcgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHBhcmFtIHtmdW5jdGlvbn0gZGVjb2RlXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHRyeURlY29kZShzdHIsIGRlY29kZSkge1xuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGUoc3RyKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGluZXMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IGNhcHR1cmVFeGNlcHRpb24sIGdldEN1cnJlbnRIdWIsIHN0YXJ0VHJhbnNhY3Rpb24sIHdpdGhTY29wZSB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBleHRyYWN0VHJhY2VwYXJlbnREYXRhLCBTcGFuIH0gZnJvbSAnQHNlbnRyeS90cmFjaW5nJztcbmltcG9ydCB7IEV2ZW50LCBFeHRyYWN0ZWROb2RlUmVxdWVzdERhdGEsIFJlcXVlc3RTZXNzaW9uU3RhdHVzLCBUcmFuc2FjdGlvbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgaXNQbGFpbk9iamVjdCwgaXNTdHJpbmcsIGxvZ2dlciwgbm9ybWFsaXplLCBzdHJpcFVybFF1ZXJ5QW5kRnJhZ21lbnQgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCAqIGFzIGNvb2tpZSBmcm9tICdjb29raWUnO1xuaW1wb3J0ICogYXMgZG9tYWluIGZyb20gJ2RvbWFpbic7XG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0ICogYXMgdXJsIGZyb20gJ3VybCc7XG5cbmltcG9ydCB7IE5vZGVDbGllbnQgfSBmcm9tICcuL2NsaWVudCc7XG5pbXBvcnQgeyBmbHVzaCwgaXNBdXRvU2Vzc2lvblRyYWNraW5nRW5hYmxlZCB9IGZyb20gJy4vc2RrJztcblxuZXhwb3J0IGludGVyZmFjZSBFeHByZXNzUmVxdWVzdCB7XG4gIGJhc2VVcmw/OiBzdHJpbmc7XG4gIGNvbm5lY3Rpb24/OiB7XG4gICAgcmVtb3RlQWRkcmVzcz86IHN0cmluZztcbiAgfTtcbiAgaXA/OiBzdHJpbmc7XG4gIG1ldGhvZD86IHN0cmluZztcbiAgb3JpZ2luYWxVcmw/OiBzdHJpbmc7XG4gIHJvdXRlPzoge1xuICAgIHBhdGg6IHN0cmluZztcbiAgICBzdGFjazogW1xuICAgICAge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICB9LFxuICAgIF07XG4gIH07XG4gIHF1ZXJ5Pzoge1xuICAgIC8vIEl0IGNhbiBiZTogdW5kZWZpbmVkIHwgc3RyaW5nIHwgc3RyaW5nW10gfCBQYXJzZWRRcyB8IFBhcnNlZFFzW10gKGZyb20gYHFzYCBwYWNrYWdlKSwgYnV0IHdlIGRvbnQgd2FudCB0byBwdWxsIGl0LlxuICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gIH07XG4gIHVybD86IHN0cmluZztcbiAgdXNlcj86IHtcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIH07XG59XG5cbi8qKlxuICogRXhwcmVzcy1jb21wYXRpYmxlIHRyYWNpbmcgaGFuZGxlci5cbiAqIEBzZWUgRXhwb3NlZCBhcyBgSGFuZGxlcnMudHJhY2luZ0hhbmRsZXJgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFjaW5nSGFuZGxlcigpOiAoXG4gIHJlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2UsXG4gIHJlczogaHR0cC5TZXJ2ZXJSZXNwb25zZSxcbiAgbmV4dDogKGVycm9yPzogYW55KSA9PiB2b2lkLFxuKSA9PiB2b2lkIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNlbnRyeVRyYWNpbmdNaWRkbGV3YXJlKFxuICAgIHJlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2UsXG4gICAgcmVzOiBodHRwLlNlcnZlclJlc3BvbnNlLFxuICAgIG5leHQ6IChlcnJvcj86IGFueSkgPT4gdm9pZCxcbiAgKTogdm9pZCB7XG4gICAgLy8gSWYgdGhlcmUgaXMgYSB0cmFjZSBoZWFkZXIgc2V0LCB3ZSBleHRyYWN0IHRoZSBkYXRhIGZyb20gaXQgKHBhcmVudFNwYW5JZCwgdHJhY2VJZCwgYW5kIHNhbXBsaW5nIGRlY2lzaW9uKVxuICAgIGxldCB0cmFjZXBhcmVudERhdGE7XG4gICAgaWYgKHJlcS5oZWFkZXJzICYmIGlzU3RyaW5nKHJlcS5oZWFkZXJzWydzZW50cnktdHJhY2UnXSkpIHtcbiAgICAgIHRyYWNlcGFyZW50RGF0YSA9IGV4dHJhY3RUcmFjZXBhcmVudERhdGEocmVxLmhlYWRlcnNbJ3NlbnRyeS10cmFjZSddIGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBzdGFydFRyYW5zYWN0aW9uKFxuICAgICAge1xuICAgICAgICBuYW1lOiBleHRyYWN0RXhwcmVzc1RyYW5zYWN0aW9uTmFtZShyZXEsIHsgcGF0aDogdHJ1ZSwgbWV0aG9kOiB0cnVlIH0pLFxuICAgICAgICBvcDogJ2h0dHAuc2VydmVyJyxcbiAgICAgICAgLi4udHJhY2VwYXJlbnREYXRhLFxuICAgICAgfSxcbiAgICAgIC8vIGV4dHJhIGNvbnRleHQgcGFzc2VkIHRvIHRoZSB0cmFjZXNTYW1wbGVyXG4gICAgICB7IHJlcXVlc3Q6IGV4dHJhY3RSZXF1ZXN0RGF0YShyZXEpIH0sXG4gICAgKTtcblxuICAgIC8vIFdlIHB1dCB0aGUgdHJhbnNhY3Rpb24gb24gdGhlIHNjb3BlIHNvIHVzZXJzIGNhbiBhdHRhY2ggY2hpbGRyZW4gdG8gaXRcbiAgICBnZXRDdXJyZW50SHViKCkuY29uZmlndXJlU2NvcGUoc2NvcGUgPT4ge1xuICAgICAgc2NvcGUuc2V0U3Bhbih0cmFuc2FjdGlvbik7XG4gICAgfSk7XG5cbiAgICAvLyBXZSBhbHNvIHNldCBfX3NlbnRyeV90cmFuc2FjdGlvbiBvbiB0aGUgcmVzcG9uc2Ugc28gcGVvcGxlIGNhbiBncmFiIHRoZSB0cmFuc2FjdGlvbiB0aGVyZSB0byBhZGRcbiAgICAvLyBzcGFucyB0byBpdCBsYXRlci5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgKHJlcyBhcyBhbnkpLl9fc2VudHJ5X3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247XG5cbiAgICByZXMub25jZSgnZmluaXNoJywgKCkgPT4ge1xuICAgICAgLy8gUHVzaCBgdHJhbnNhY3Rpb24uZmluaXNoYCB0byB0aGUgbmV4dCBldmVudCBsb29wIHNvIG9wZW4gc3BhbnMgaGF2ZSBhIGNoYW5jZSB0byBmaW5pc2ggYmVmb3JlIHRoZSB0cmFuc2FjdGlvblxuICAgICAgLy8gY2xvc2VzXG4gICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICBhZGRFeHByZXNzUmVxVG9UcmFuc2FjdGlvbih0cmFuc2FjdGlvbiwgcmVxKTtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0SHR0cFN0YXR1cyhyZXMuc3RhdHVzQ29kZSk7XG4gICAgICAgIHRyYW5zYWN0aW9uLmZpbmlzaCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBuZXh0KCk7XG4gIH07XG59XG5cbi8qKlxuICogU2V0IHBhcmFtZXRlcml6ZWQgYXMgdHJhbnNhY3Rpb24gbmFtZSBlLmcuOiBgR0VUIC91c2Vycy86aWRgXG4gKiBBbHNvIGFkZHMgbW9yZSBjb250ZXh0IGRhdGEgb24gdGhlIHRyYW5zYWN0aW9uIGZyb20gdGhlIHJlcXVlc3RcbiAqL1xuZnVuY3Rpb24gYWRkRXhwcmVzc1JlcVRvVHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uIHwgdW5kZWZpbmVkLCByZXE6IEV4cHJlc3NSZXF1ZXN0KTogdm9pZCB7XG4gIGlmICghdHJhbnNhY3Rpb24pIHJldHVybjtcbiAgdHJhbnNhY3Rpb24ubmFtZSA9IGV4dHJhY3RFeHByZXNzVHJhbnNhY3Rpb25OYW1lKHJlcSwgeyBwYXRoOiB0cnVlLCBtZXRob2Q6IHRydWUgfSk7XG4gIHRyYW5zYWN0aW9uLnNldERhdGEoJ3VybCcsIHJlcS5vcmlnaW5hbFVybCk7XG4gIHRyYW5zYWN0aW9uLnNldERhdGEoJ2Jhc2VVcmwnLCByZXEuYmFzZVVybCk7XG4gIHRyYW5zYWN0aW9uLnNldERhdGEoJ3F1ZXJ5JywgcmVxLnF1ZXJ5KTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBjb21wbGV0ZSBnZW5lcmFsaXplZCBwYXRoIGZyb20gdGhlIHJlcXVlc3Qgb2JqZWN0IGFuZCB1c2VzIGl0IHRvIGNvbnN0cnVjdCB0cmFuc2FjdGlvbiBuYW1lLlxuICpcbiAqIGVnLiBHRVQgL21vdW50cG9pbnQvdXNlci86aWRcbiAqXG4gKiBAcGFyYW0gcmVxIFRoZSBFeHByZXNzUmVxdWVzdCBvYmplY3RcbiAqIEBwYXJhbSBvcHRpb25zIFdoYXQgdG8gaW5jbHVkZSBpbiB0aGUgdHJhbnNhY3Rpb24gbmFtZSAobWV0aG9kLCBwYXRoLCBvciBib3RoKVxuICpcbiAqIEByZXR1cm5zIFRoZSBmdWxseSBjb25zdHJ1Y3RlZCB0cmFuc2FjdGlvbiBuYW1lXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RFeHByZXNzVHJhbnNhY3Rpb25OYW1lKFxuICByZXE6IEV4cHJlc3NSZXF1ZXN0LFxuICBvcHRpb25zOiB7IHBhdGg/OiBib29sZWFuOyBtZXRob2Q/OiBib29sZWFuIH0gPSB7fSxcbik6IHN0cmluZyB7XG4gIGNvbnN0IG1ldGhvZCA9IHJlcS5tZXRob2Q/LnRvVXBwZXJDYXNlKCk7XG5cbiAgbGV0IHBhdGggPSAnJztcbiAgaWYgKHJlcS5yb3V0ZSkge1xuICAgIHBhdGggPSBgJHtyZXEuYmFzZVVybCB8fCAnJ30ke3JlcS5yb3V0ZS5wYXRofWA7XG4gIH0gZWxzZSBpZiAocmVxLm9yaWdpbmFsVXJsIHx8IHJlcS51cmwpIHtcbiAgICBwYXRoID0gc3RyaXBVcmxRdWVyeUFuZEZyYWdtZW50KHJlcS5vcmlnaW5hbFVybCB8fCByZXEudXJsIHx8ICcnKTtcbiAgfVxuXG4gIGxldCBpbmZvID0gJyc7XG4gIGlmIChvcHRpb25zLm1ldGhvZCAmJiBtZXRob2QpIHtcbiAgICBpbmZvICs9IG1ldGhvZDtcbiAgfVxuICBpZiAob3B0aW9ucy5tZXRob2QgJiYgb3B0aW9ucy5wYXRoKSB7XG4gICAgaW5mbyArPSBgIGA7XG4gIH1cbiAgaWYgKG9wdGlvbnMucGF0aCAmJiBwYXRoKSB7XG4gICAgaW5mbyArPSBwYXRoO1xuICB9XG5cbiAgcmV0dXJuIGluZm87XG59XG5cbnR5cGUgVHJhbnNhY3Rpb25OYW1pbmdTY2hlbWUgPSAncGF0aCcgfCAnbWV0aG9kUGF0aCcgfCAnaGFuZGxlcic7XG5cbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gZXh0cmFjdFRyYW5zYWN0aW9uKHJlcTogRXhwcmVzc1JlcXVlc3QsIHR5cGU6IGJvb2xlYW4gfCBUcmFuc2FjdGlvbk5hbWluZ1NjaGVtZSk6IHN0cmluZyB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3BhdGgnOiB7XG4gICAgICByZXR1cm4gZXh0cmFjdEV4cHJlc3NUcmFuc2FjdGlvbk5hbWUocmVxLCB7IHBhdGg6IHRydWUgfSk7XG4gICAgfVxuICAgIGNhc2UgJ2hhbmRsZXInOiB7XG4gICAgICByZXR1cm4gcmVxLnJvdXRlPy5zdGFja1swXS5uYW1lIHx8ICc8YW5vbnltb3VzPic7XG4gICAgfVxuICAgIGNhc2UgJ21ldGhvZFBhdGgnOlxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiBleHRyYWN0RXhwcmVzc1RyYW5zYWN0aW9uTmFtZShyZXEsIHsgcGF0aDogdHJ1ZSwgbWV0aG9kOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKiogRGVmYXVsdCB1c2VyIGtleXMgdGhhdCdsbCBiZSB1c2VkIHRvIGV4dHJhY3QgZGF0YSBmcm9tIHRoZSByZXF1ZXN0ICovXG5jb25zdCBERUZBVUxUX1VTRVJfS0VZUyA9IFsnaWQnLCAndXNlcm5hbWUnLCAnZW1haWwnXTtcblxuLyoqIEpTRG9jICovXG5mdW5jdGlvbiBleHRyYWN0VXNlckRhdGEoXG4gIHVzZXI6IHtcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIH0sXG4gIGtleXM6IGJvb2xlYW4gfCBzdHJpbmdbXSxcbik6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xuICBjb25zdCBleHRyYWN0ZWRVc2VyOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gIGNvbnN0IGF0dHJpYnV0ZXMgPSBBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IERFRkFVTFRfVVNFUl9LRVlTO1xuXG4gIGF0dHJpYnV0ZXMuZm9yRWFjaChrZXkgPT4ge1xuICAgIGlmICh1c2VyICYmIGtleSBpbiB1c2VyKSB7XG4gICAgICBleHRyYWN0ZWRVc2VyW2tleV0gPSB1c2VyW2tleV07XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZXh0cmFjdGVkVXNlcjtcbn1cblxuLyoqIERlZmF1bHQgcmVxdWVzdCBrZXlzIHRoYXQnbGwgYmUgdXNlZCB0byBleHRyYWN0IGRhdGEgZnJvbSB0aGUgcmVxdWVzdCAqL1xuY29uc3QgREVGQVVMVF9SRVFVRVNUX0tFWVMgPSBbJ2Nvb2tpZXMnLCAnZGF0YScsICdoZWFkZXJzJywgJ21ldGhvZCcsICdxdWVyeV9zdHJpbmcnLCAndXJsJ107XG5cbi8qKlxuICogTm9ybWFsaXplcyBkYXRhIGZyb20gdGhlIHJlcXVlc3Qgb2JqZWN0LCBhY2NvdW50aW5nIGZvciBmcmFtZXdvcmsgZGlmZmVyZW5jZXMuXG4gKlxuICogQHBhcmFtIHJlcSBUaGUgcmVxdWVzdCBvYmplY3QgZnJvbSB3aGljaCB0byBleHRyYWN0IGRhdGFcbiAqIEBwYXJhbSBrZXlzIEFuIG9wdGlvbmFsIGFycmF5IG9mIGtleXMgdG8gaW5jbHVkZSBpbiB0aGUgbm9ybWFsaXplZCBkYXRhLiBEZWZhdWx0cyB0byBERUZBVUxUX1JFUVVFU1RfS0VZUyBpZiBub3RcbiAqIHByb3ZpZGVkLlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgbm9ybWFsaXplZCByZXF1ZXN0IGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RSZXF1ZXN0RGF0YShcbiAgcmVxOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LFxuICBrZXlzOiBzdHJpbmdbXSA9IERFRkFVTFRfUkVRVUVTVF9LRVlTLFxuKTogRXh0cmFjdGVkTm9kZVJlcXVlc3REYXRhIHtcbiAgY29uc3QgcmVxdWVzdERhdGE6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcblxuICAvLyBoZWFkZXJzOlxuICAvLyAgIG5vZGUsIGV4cHJlc3MsIG5leHRqczogcmVxLmhlYWRlcnNcbiAgLy8gICBrb2E6IHJlcS5oZWFkZXJcbiAgY29uc3QgaGVhZGVycyA9IChyZXEuaGVhZGVycyB8fCByZXEuaGVhZGVyIHx8IHt9KSBhcyB7XG4gICAgaG9zdD86IHN0cmluZztcbiAgICBjb29raWU/OiBzdHJpbmc7XG4gIH07XG4gIC8vIG1ldGhvZDpcbiAgLy8gICBub2RlLCBleHByZXNzLCBrb2EsIG5leHRqczogcmVxLm1ldGhvZFxuICBjb25zdCBtZXRob2QgPSByZXEubWV0aG9kO1xuICAvLyBob3N0OlxuICAvLyAgIGV4cHJlc3M6IHJlcS5ob3N0bmFtZSBpbiA+IDQgYW5kIHJlcS5ob3N0IGluIDwgNFxuICAvLyAgIGtvYTogcmVxLmhvc3RcbiAgLy8gICBub2RlLCBuZXh0anM6IHJlcS5oZWFkZXJzLmhvc3RcbiAgY29uc3QgaG9zdCA9IHJlcS5ob3N0bmFtZSB8fCByZXEuaG9zdCB8fCBoZWFkZXJzLmhvc3QgfHwgJzxubyBob3N0Pic7XG4gIC8vIHByb3RvY29sOlxuICAvLyAgIG5vZGUsIG5leHRqczogPG4vYT5cbiAgLy8gICBleHByZXNzLCBrb2E6IHJlcS5wcm90b2NvbFxuICBjb25zdCBwcm90b2NvbCA9XG4gICAgcmVxLnByb3RvY29sID09PSAnaHR0cHMnIHx8IHJlcS5zZWN1cmUgfHwgKChyZXEuc29ja2V0IHx8IHt9KSBhcyB7IGVuY3J5cHRlZD86IGJvb2xlYW4gfSkuZW5jcnlwdGVkXG4gICAgICA/ICdodHRwcydcbiAgICAgIDogJ2h0dHAnO1xuICAvLyB1cmwgKGluY2x1ZGluZyBwYXRoIGFuZCBxdWVyeSBzdHJpbmcpOlxuICAvLyAgIG5vZGUsIGV4cHJlc3M6IHJlcS5vcmlnaW5hbFVybFxuICAvLyAgIGtvYSwgbmV4dGpzOiByZXEudXJsXG4gIGNvbnN0IG9yaWdpbmFsVXJsID0gKHJlcS5vcmlnaW5hbFVybCB8fCByZXEudXJsIHx8ICcnKSBhcyBzdHJpbmc7XG4gIC8vIGFic29sdXRlIHVybFxuICBjb25zdCBhYnNvbHV0ZVVybCA9IGAke3Byb3RvY29sfTovLyR7aG9zdH0ke29yaWdpbmFsVXJsfWA7XG5cbiAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgc3dpdGNoIChrZXkpIHtcbiAgICAgIGNhc2UgJ2hlYWRlcnMnOlxuICAgICAgICByZXF1ZXN0RGF0YS5oZWFkZXJzID0gaGVhZGVycztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtZXRob2QnOlxuICAgICAgICByZXF1ZXN0RGF0YS5tZXRob2QgPSBtZXRob2Q7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndXJsJzpcbiAgICAgICAgcmVxdWVzdERhdGEudXJsID0gYWJzb2x1dGVVcmw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY29va2llcyc6XG4gICAgICAgIC8vIGNvb2tpZXM6XG4gICAgICAgIC8vICAgbm9kZSwgZXhwcmVzcywga29hOiByZXEuaGVhZGVycy5jb29raWVcbiAgICAgICAgLy8gICB2ZXJjZWwsIHNhaWxzLmpzLCBleHByZXNzICh3LyBjb29raWUgbWlkZGxld2FyZSksIG5leHRqczogcmVxLmNvb2tpZXNcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICByZXF1ZXN0RGF0YS5jb29raWVzID0gcmVxLmNvb2tpZXMgfHwgY29va2llLnBhcnNlKGhlYWRlcnMuY29va2llIHx8ICcnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdxdWVyeV9zdHJpbmcnOlxuICAgICAgICAvLyBxdWVyeSBzdHJpbmc6XG4gICAgICAgIC8vICAgbm9kZTogcmVxLnVybCAocmF3KVxuICAgICAgICAvLyAgIGV4cHJlc3MsIGtvYSwgbmV4dGpzOiByZXEucXVlcnlcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICByZXF1ZXN0RGF0YS5xdWVyeV9zdHJpbmcgPSByZXEucXVlcnkgfHwgdXJsLnBhcnNlKG9yaWdpbmFsVXJsIHx8ICcnLCBmYWxzZSkucXVlcnk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGF0YSc6XG4gICAgICAgIGlmIChtZXRob2QgPT09ICdHRVQnIHx8IG1ldGhvZCA9PT0gJ0hFQUQnKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYm9keSBkYXRhOlxuICAgICAgICAvLyAgIGV4cHJlc3MsIGtvYSwgbmV4dGpzOiByZXEuYm9keVxuICAgICAgICAvL1xuICAgICAgICAvLyAgIHdoZW4gdXNpbmcgbm9kZSBieSBpdHNlbGYsIHlvdSBoYXZlIHRvIHJlYWQgdGhlIGluY29taW5nIHN0cmVhbShzZWVcbiAgICAgICAgLy8gICBodHRwczovL25vZGVqcy5kZXYvbGVhcm4vZ2V0LWh0dHAtcmVxdWVzdC1ib2R5LWRhdGEtdXNpbmctbm9kZWpzKTsgaWYgYSB1c2VyIGlzIGRvaW5nIHRoYXQsIHdlIGNhbid0IGtub3dcbiAgICAgICAgLy8gICB3aGVyZSB0aGV5J3JlIGdvaW5nIHRvIHN0b3JlIHRoZSBmaW5hbCByZXN1bHQsIHNvIHRoZXknbGwgaGF2ZSB0byBjYXB0dXJlIHRoaXMgZGF0YSB0aGVtc2VsdmVzXG4gICAgICAgIGlmIChyZXEuYm9keSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVxdWVzdERhdGEuZGF0YSA9IGlzU3RyaW5nKHJlcS5ib2R5KSA/IHJlcS5ib2R5IDogSlNPTi5zdHJpbmdpZnkobm9ybWFsaXplKHJlcS5ib2R5KSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoe30uaGFzT3duUHJvcGVydHkuY2FsbChyZXEsIGtleSkpIHtcbiAgICAgICAgICByZXF1ZXN0RGF0YVtrZXldID0gKHJlcSBhcyB7IFtrZXk6IHN0cmluZ106IGFueSB9KVtrZXldO1xuICAgICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVxdWVzdERhdGE7XG59XG5cbi8qKlxuICogT3B0aW9ucyBkZWNpZGluZyB3aGF0IHBhcnRzIG9mIHRoZSByZXF1ZXN0IHRvIHVzZSB3aGVuIGVuaGFuY2luZyBhbiBldmVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlUmVxdWVzdE9wdGlvbnMge1xuICBpcD86IGJvb2xlYW47XG4gIHJlcXVlc3Q/OiBib29sZWFuIHwgc3RyaW5nW107XG4gIHNlcnZlck5hbWU/OiBib29sZWFuO1xuICB0cmFuc2FjdGlvbj86IGJvb2xlYW4gfCBUcmFuc2FjdGlvbk5hbWluZ1NjaGVtZTtcbiAgdXNlcj86IGJvb2xlYW4gfCBzdHJpbmdbXTtcbiAgdmVyc2lvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRW5yaWNoZXMgcGFzc2VkIGV2ZW50IHdpdGggcmVxdWVzdCBkYXRhLlxuICpcbiAqIEBwYXJhbSBldmVudCBXaWxsIGJlIG11dGF0ZWQgYW5kIGVucmljaGVkIHdpdGggcmVxIGRhdGFcbiAqIEBwYXJhbSByZXEgUmVxdWVzdCBvYmplY3RcbiAqIEBwYXJhbSBvcHRpb25zIG9iamVjdCBjb250YWluaW5nIGZsYWdzIHRvIGVuYWJsZSBmdW5jdGlvbmFsaXR5XG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlcXVlc3QoZXZlbnQ6IEV2ZW50LCByZXE6IEV4cHJlc3NSZXF1ZXN0LCBvcHRpb25zPzogUGFyc2VSZXF1ZXN0T3B0aW9ucyk6IEV2ZW50IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIG9wdGlvbnMgPSB7XG4gICAgaXA6IGZhbHNlLFxuICAgIHJlcXVlc3Q6IHRydWUsXG4gICAgc2VydmVyTmFtZTogdHJ1ZSxcbiAgICB0cmFuc2FjdGlvbjogdHJ1ZSxcbiAgICB1c2VyOiB0cnVlLFxuICAgIHZlcnNpb246IHRydWUsXG4gICAgLi4ub3B0aW9ucyxcbiAgfTtcblxuICBpZiAob3B0aW9ucy52ZXJzaW9uKSB7XG4gICAgZXZlbnQuY29udGV4dHMgPSB7XG4gICAgICAuLi5ldmVudC5jb250ZXh0cyxcbiAgICAgIHJ1bnRpbWU6IHtcbiAgICAgICAgbmFtZTogJ25vZGUnLFxuICAgICAgICB2ZXJzaW9uOiBnbG9iYWwucHJvY2Vzcy52ZXJzaW9uLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKG9wdGlvbnMucmVxdWVzdCkge1xuICAgIC8vIGlmIHRoZSBvcHRpb24gdmFsdWUgaXMgYHRydWVgLCB1c2UgdGhlIGRlZmF1bHQgc2V0IG9mIGtleXMgYnkgbm90IHBhc3NpbmcgYW55dGhpbmcgdG8gYGV4dHJhY3RSZXF1ZXN0RGF0YSgpYFxuICAgIGNvbnN0IGV4dHJhY3RlZFJlcXVlc3REYXRhID0gQXJyYXkuaXNBcnJheShvcHRpb25zLnJlcXVlc3QpXG4gICAgICA/IGV4dHJhY3RSZXF1ZXN0RGF0YShyZXEsIG9wdGlvbnMucmVxdWVzdClcbiAgICAgIDogZXh0cmFjdFJlcXVlc3REYXRhKHJlcSk7XG4gICAgZXZlbnQucmVxdWVzdCA9IHtcbiAgICAgIC4uLmV2ZW50LnJlcXVlc3QsXG4gICAgICAuLi5leHRyYWN0ZWRSZXF1ZXN0RGF0YSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuc2VydmVyTmFtZSAmJiAhZXZlbnQuc2VydmVyX25hbWUpIHtcbiAgICBldmVudC5zZXJ2ZXJfbmFtZSA9IGdsb2JhbC5wcm9jZXNzLmVudi5TRU5UUllfTkFNRSB8fCBvcy5ob3N0bmFtZSgpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMudXNlcikge1xuICAgIGNvbnN0IGV4dHJhY3RlZFVzZXIgPSByZXEudXNlciAmJiBpc1BsYWluT2JqZWN0KHJlcS51c2VyKSA/IGV4dHJhY3RVc2VyRGF0YShyZXEudXNlciwgb3B0aW9ucy51c2VyKSA6IHt9O1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKGV4dHJhY3RlZFVzZXIpKSB7XG4gICAgICBldmVudC51c2VyID0ge1xuICAgICAgICAuLi5ldmVudC51c2VyLFxuICAgICAgICAuLi5leHRyYWN0ZWRVc2VyLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBjbGllbnQgaXA6XG4gIC8vICAgbm9kZSwgbmV4dGpzOiByZXEuY29ubmVjdGlvbi5yZW1vdGVBZGRyZXNzXG4gIC8vICAgZXhwcmVzcywga29hOiByZXEuaXBcbiAgaWYgKG9wdGlvbnMuaXApIHtcbiAgICBjb25zdCBpcCA9IHJlcS5pcCB8fCAocmVxLmNvbm5lY3Rpb24gJiYgcmVxLmNvbm5lY3Rpb24ucmVtb3RlQWRkcmVzcyk7XG4gICAgaWYgKGlwKSB7XG4gICAgICBldmVudC51c2VyID0ge1xuICAgICAgICAuLi5ldmVudC51c2VyLFxuICAgICAgICBpcF9hZGRyZXNzOiBpcCxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdGlvbnMudHJhbnNhY3Rpb24gJiYgIWV2ZW50LnRyYW5zYWN0aW9uKSB7XG4gICAgLy8gVE9ETyBkbyB3ZSBldmVuIG5lZWQgdGhpcyBhbnltb3JlP1xuICAgIC8vIFRPRE8gbWFrZSB0aGlzIHdvcmsgZm9yIG5leHRqc1xuICAgIGV2ZW50LnRyYW5zYWN0aW9uID0gZXh0cmFjdFRyYW5zYWN0aW9uKHJlcSwgb3B0aW9ucy50cmFuc2FjdGlvbik7XG4gIH1cblxuICByZXR1cm4gZXZlbnQ7XG59XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RIYW5kbGVyT3B0aW9ucyA9IFBhcnNlUmVxdWVzdE9wdGlvbnMgJiB7XG4gIGZsdXNoVGltZW91dD86IG51bWJlcjtcbn07XG5cbi8qKlxuICogRXhwcmVzcyBjb21wYXRpYmxlIHJlcXVlc3QgaGFuZGxlci5cbiAqIEBzZWUgRXhwb3NlZCBhcyBgSGFuZGxlcnMucmVxdWVzdEhhbmRsZXJgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0SGFuZGxlcihcbiAgb3B0aW9ucz86IFJlcXVlc3RIYW5kbGVyT3B0aW9ucyxcbik6IChyZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlLCByZXM6IGh0dHAuU2VydmVyUmVzcG9uc2UsIG5leHQ6IChlcnJvcj86IGFueSkgPT4gdm9pZCkgPT4gdm9pZCB7XG4gIGNvbnN0IGN1cnJlbnRIdWIgPSBnZXRDdXJyZW50SHViKCk7XG4gIGNvbnN0IGNsaWVudCA9IGN1cnJlbnRIdWIuZ2V0Q2xpZW50PE5vZGVDbGllbnQ+KCk7XG4gIC8vIEluaXRpYWxpc2UgYW4gaW5zdGFuY2Ugb2YgU2Vzc2lvbkZsdXNoZXIgb24gdGhlIGNsaWVudCB3aGVuIGBhdXRvU2Vzc2lvblRyYWNraW5nYCBpcyBlbmFibGVkIGFuZCB0aGVcbiAgLy8gYHJlcXVlc3RIYW5kbGVyYCBtaWRkbGV3YXJlIGlzIHVzZWQgaW5kaWNhdGluZyB0aGF0IHdlIGFyZSBydW5uaW5nIGluIFNlc3Npb25BZ2dyZWdhdGVzIG1vZGVcbiAgaWYgKGNsaWVudCAmJiBpc0F1dG9TZXNzaW9uVHJhY2tpbmdFbmFibGVkKGNsaWVudCkpIHtcbiAgICBjbGllbnQuaW5pdFNlc3Npb25GbHVzaGVyKCk7XG5cbiAgICAvLyBJZiBTY29wZSBjb250YWlucyBhIFNpbmdsZSBtb2RlIFNlc3Npb24sIGl0IGlzIHJlbW92ZWQgaW4gZmF2b3Igb2YgdXNpbmcgU2Vzc2lvbiBBZ2dyZWdhdGVzIG1vZGVcbiAgICBjb25zdCBzY29wZSA9IGN1cnJlbnRIdWIuZ2V0U2NvcGUoKTtcbiAgICBpZiAoc2NvcGUgJiYgc2NvcGUuZ2V0U2Vzc2lvbigpKSB7XG4gICAgICBzY29wZS5zZXRTZXNzaW9uKCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBmdW5jdGlvbiBzZW50cnlSZXF1ZXN0TWlkZGxld2FyZShcbiAgICByZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlLFxuICAgIHJlczogaHR0cC5TZXJ2ZXJSZXNwb25zZSxcbiAgICBuZXh0OiAoZXJyb3I/OiBhbnkpID0+IHZvaWQsXG4gICk6IHZvaWQge1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZmx1c2hUaW1lb3V0ICYmIG9wdGlvbnMuZmx1c2hUaW1lb3V0ID4gMCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuICAgICAgY29uc3QgX2VuZCA9IHJlcy5lbmQ7XG4gICAgICByZXMuZW5kID0gZnVuY3Rpb24oY2h1bms/OiBhbnkgfCAoKCkgPT4gdm9pZCksIGVuY29kaW5nPzogc3RyaW5nIHwgKCgpID0+IHZvaWQpLCBjYj86ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdm9pZCBmbHVzaChvcHRpb25zLmZsdXNoVGltZW91dClcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBfZW5kLmNhbGwodGhpcywgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAudGhlbihudWxsLCBlID0+IHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGxvY2FsID0gZG9tYWluLmNyZWF0ZSgpO1xuICAgIGxvY2FsLmFkZChyZXEpO1xuICAgIGxvY2FsLmFkZChyZXMpO1xuICAgIGxvY2FsLm9uKCdlcnJvcicsIG5leHQpO1xuXG4gICAgbG9jYWwucnVuKCgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRIdWIgPSBnZXRDdXJyZW50SHViKCk7XG5cbiAgICAgIGN1cnJlbnRIdWIuY29uZmlndXJlU2NvcGUoc2NvcGUgPT4ge1xuICAgICAgICBzY29wZS5hZGRFdmVudFByb2Nlc3NvcigoZXZlbnQ6IEV2ZW50KSA9PiBwYXJzZVJlcXVlc3QoZXZlbnQsIHJlcSwgb3B0aW9ucykpO1xuICAgICAgICBjb25zdCBjbGllbnQgPSBjdXJyZW50SHViLmdldENsaWVudDxOb2RlQ2xpZW50PigpO1xuICAgICAgICBpZiAoaXNBdXRvU2Vzc2lvblRyYWNraW5nRW5hYmxlZChjbGllbnQpKSB7XG4gICAgICAgICAgY29uc3Qgc2NvcGUgPSBjdXJyZW50SHViLmdldFNjb3BlKCk7XG4gICAgICAgICAgaWYgKHNjb3BlKSB7XG4gICAgICAgICAgICAvLyBTZXQgYHN0YXR1c2Agb2YgYFJlcXVlc3RTZXNzaW9uYCB0byBPaywgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVxdWVzdFxuICAgICAgICAgICAgc2NvcGUuc2V0UmVxdWVzdFNlc3Npb24oeyBzdGF0dXM6IFJlcXVlc3RTZXNzaW9uU3RhdHVzLk9rIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJlcy5vbmNlKCdmaW5pc2gnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IGN1cnJlbnRIdWIuZ2V0Q2xpZW50PE5vZGVDbGllbnQ+KCk7XG4gICAgICAgIGlmIChpc0F1dG9TZXNzaW9uVHJhY2tpbmdFbmFibGVkKGNsaWVudCkpIHtcbiAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICAgICAgaWYgKGNsaWVudCAmJiAoY2xpZW50IGFzIGFueSkuX2NhcHR1cmVSZXF1ZXN0U2Vzc2lvbikge1xuICAgICAgICAgICAgICAvLyBDYWxsaW5nIF9jYXB0dXJlUmVxdWVzdFNlc3Npb24gdG8gY2FwdHVyZSByZXF1ZXN0IHNlc3Npb24gYXQgdGhlIGVuZCBvZiB0aGUgcmVxdWVzdCBieSBpbmNyZW1lbnRpbmdcbiAgICAgICAgICAgICAgLy8gdGhlIGNvcnJlY3QgU2Vzc2lvbkFnZ3JlZ2F0ZXMgYnVja2V0IGkuZS4gY3Jhc2hlZCwgZXJyb3JlZCBvciBleGl0ZWRcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICAgICAgICAoY2xpZW50IGFzIGFueSkuX2NhcHR1cmVSZXF1ZXN0U2Vzc2lvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfTtcbn1cblxuLyoqIEpTRG9jICovXG5pbnRlcmZhY2UgTWlkZGxld2FyZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBzdGF0dXM/OiBudW1iZXIgfCBzdHJpbmc7XG4gIHN0YXR1c0NvZGU/OiBudW1iZXIgfCBzdHJpbmc7XG4gIHN0YXR1c19jb2RlPzogbnVtYmVyIHwgc3RyaW5nO1xuICBvdXRwdXQ/OiB7XG4gICAgc3RhdHVzQ29kZT86IG51bWJlciB8IHN0cmluZztcbiAgfTtcbn1cblxuLyoqIEpTRG9jICovXG5mdW5jdGlvbiBnZXRTdGF0dXNDb2RlRnJvbVJlc3BvbnNlKGVycm9yOiBNaWRkbGV3YXJlRXJyb3IpOiBudW1iZXIge1xuICBjb25zdCBzdGF0dXNDb2RlID0gZXJyb3Iuc3RhdHVzIHx8IGVycm9yLnN0YXR1c0NvZGUgfHwgZXJyb3Iuc3RhdHVzX2NvZGUgfHwgKGVycm9yLm91dHB1dCAmJiBlcnJvci5vdXRwdXQuc3RhdHVzQ29kZSk7XG4gIHJldHVybiBzdGF0dXNDb2RlID8gcGFyc2VJbnQoc3RhdHVzQ29kZSBhcyBzdHJpbmcsIDEwKSA6IDUwMDtcbn1cblxuLyoqIFJldHVybnMgdHJ1ZSBpZiByZXNwb25zZSBjb2RlIGlzIGludGVybmFsIHNlcnZlciBlcnJvciAqL1xuZnVuY3Rpb24gZGVmYXVsdFNob3VsZEhhbmRsZUVycm9yKGVycm9yOiBNaWRkbGV3YXJlRXJyb3IpOiBib29sZWFuIHtcbiAgY29uc3Qgc3RhdHVzID0gZ2V0U3RhdHVzQ29kZUZyb21SZXNwb25zZShlcnJvcik7XG4gIHJldHVybiBzdGF0dXMgPj0gNTAwO1xufVxuXG4vKipcbiAqIEV4cHJlc3MgY29tcGF0aWJsZSBlcnJvciBoYW5kbGVyLlxuICogQHNlZSBFeHBvc2VkIGFzIGBIYW5kbGVycy5lcnJvckhhbmRsZXJgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvckhhbmRsZXIob3B0aW9ucz86IHtcbiAgLyoqXG4gICAqIENhbGxiYWNrIG1ldGhvZCBkZWNpZGluZyB3aGV0aGVyIGVycm9yIHNob3VsZCBiZSBjYXB0dXJlZCBhbmQgc2VudCB0byBTZW50cnlcbiAgICogQHBhcmFtIGVycm9yIENhcHR1cmVkIG1pZGRsZXdhcmUgZXJyb3JcbiAgICovXG4gIHNob3VsZEhhbmRsZUVycm9yPyhlcnJvcjogTWlkZGxld2FyZUVycm9yKTogYm9vbGVhbjtcbn0pOiAoXG4gIGVycm9yOiBNaWRkbGV3YXJlRXJyb3IsXG4gIHJlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2UsXG4gIHJlczogaHR0cC5TZXJ2ZXJSZXNwb25zZSxcbiAgbmV4dDogKGVycm9yOiBNaWRkbGV3YXJlRXJyb3IpID0+IHZvaWQsXG4pID0+IHZvaWQge1xuICByZXR1cm4gZnVuY3Rpb24gc2VudHJ5RXJyb3JNaWRkbGV3YXJlKFxuICAgIGVycm9yOiBNaWRkbGV3YXJlRXJyb3IsXG4gICAgX3JlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2UsXG4gICAgcmVzOiBodHRwLlNlcnZlclJlc3BvbnNlLFxuICAgIG5leHQ6IChlcnJvcjogTWlkZGxld2FyZUVycm9yKSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXG4gICAgY29uc3Qgc2hvdWxkSGFuZGxlRXJyb3IgPSAob3B0aW9ucyAmJiBvcHRpb25zLnNob3VsZEhhbmRsZUVycm9yKSB8fCBkZWZhdWx0U2hvdWxkSGFuZGxlRXJyb3I7XG5cbiAgICBpZiAoc2hvdWxkSGFuZGxlRXJyb3IoZXJyb3IpKSB7XG4gICAgICB3aXRoU2NvcGUoX3Njb3BlID0+IHtcbiAgICAgICAgLy8gRm9yIHNvbWUgcmVhc29uIHdlIG5lZWQgdG8gc2V0IHRoZSB0cmFuc2FjdGlvbiBvbiB0aGUgc2NvcGUgYWdhaW5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IChyZXMgYXMgYW55KS5fX3NlbnRyeV90cmFuc2FjdGlvbiBhcyBTcGFuO1xuICAgICAgICBpZiAodHJhbnNhY3Rpb24gJiYgX3Njb3BlLmdldFNwYW4oKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgX3Njb3BlLnNldFNwYW4odHJhbnNhY3Rpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xpZW50ID0gZ2V0Q3VycmVudEh1YigpLmdldENsaWVudDxOb2RlQ2xpZW50PigpO1xuICAgICAgICBpZiAoY2xpZW50ICYmIGlzQXV0b1Nlc3Npb25UcmFja2luZ0VuYWJsZWQoY2xpZW50KSkge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBgU2Vzc2lvbkZsdXNoZXJgIGlzIGluc3RhbnRpYXRlZCBvbiB0aGUgY2xpZW50IHRvIGdvIGludG8gdGhpcyBicmFuY2ggdGhhdCBtYXJrcyB0aGVcbiAgICAgICAgICAvLyBgcmVxdWVzdFNlc3Npb24uc3RhdHVzYCBhcyBgQ3Jhc2hlZGAsIGFuZCB0aGlzIGNoZWNrIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBgU2Vzc2lvbkZsdXNoZXJgIGlzIG9ubHlcbiAgICAgICAgICAvLyBpbnN0YW50aWF0ZWQgd2hlbiB0aGUgdGhlYHJlcXVlc3RIYW5kbGVyYCBtaWRkbGV3YXJlIGlzIGluaXRpYWxpc2VkLCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB3ZSBzaG91bGQgYmVcbiAgICAgICAgICAvLyBydW5uaW5nIGluIFNlc3Npb25BZ2dyZWdhdGVzIG1vZGVcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgICAgY29uc3QgaXNTZXNzaW9uQWdncmVnYXRlc01vZGUgPSAoY2xpZW50IGFzIGFueSkuX3Nlc3Npb25GbHVzaGVyICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKGlzU2Vzc2lvbkFnZ3JlZ2F0ZXNNb2RlKSB7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0U2Vzc2lvbiA9IF9zY29wZS5nZXRSZXF1ZXN0U2Vzc2lvbigpO1xuICAgICAgICAgICAgLy8gSWYgYW4gZXJyb3IgYnViYmxlcyB0byB0aGUgYGVycm9ySGFuZGxlcmAsIHRoZW4gdGhpcyBpcyBhbiB1bmhhbmRsZWQgZXJyb3IsIGFuZCBzaG91bGQgYmUgcmVwb3J0ZWQgYXMgYVxuICAgICAgICAgICAgLy8gQ3Jhc2hlZCBzZXNzaW9uLiBUaGUgYF9yZXF1ZXN0U2Vzc2lvbi5zdGF0dXNgIGlzIGNoZWNrZWQgdG8gZW5zdXJlIHRoYXQgdGhpcyBlcnJvciBpcyBoYXBwZW5pbmcgd2l0aGluXG4gICAgICAgICAgICAvLyB0aGUgYm91bmRzIG9mIGEgcmVxdWVzdCwgYW5kIGlmIHNvIHRoZSBzdGF0dXMgaXMgdXBkYXRlZFxuICAgICAgICAgICAgaWYgKHJlcXVlc3RTZXNzaW9uICYmIHJlcXVlc3RTZXNzaW9uLnN0YXR1cyAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICByZXF1ZXN0U2Vzc2lvbi5zdGF0dXMgPSBSZXF1ZXN0U2Vzc2lvblN0YXR1cy5DcmFzaGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50SWQgPSBjYXB0dXJlRXhjZXB0aW9uKGVycm9yKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICAocmVzIGFzIGFueSkuc2VudHJ5ID0gZXZlbnRJZDtcbiAgICAgICAgbmV4dChlcnJvcik7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHQoZXJyb3IpO1xuICB9O1xufVxuIiwgImV4cG9ydCB7XG4gIEJyZWFkY3J1bWIsXG4gIEJyZWFkY3J1bWJIaW50LFxuICBSZXF1ZXN0LFxuICBTZGtJbmZvLFxuICBFdmVudCxcbiAgRXZlbnRIaW50LFxuICBFeGNlcHRpb24sXG4gIFJlc3BvbnNlLFxuICBTZXZlcml0eSxcbiAgU3RhY2tGcmFtZSxcbiAgU3RhY2t0cmFjZSxcbiAgU3RhdHVzLFxuICBUaHJlYWQsXG4gIFVzZXIsXG59IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuXG5leHBvcnQge1xuICBhZGRHbG9iYWxFdmVudFByb2Nlc3NvcixcbiAgYWRkQnJlYWRjcnVtYixcbiAgY2FwdHVyZUV4Y2VwdGlvbixcbiAgY2FwdHVyZUV2ZW50LFxuICBjYXB0dXJlTWVzc2FnZSxcbiAgY29uZmlndXJlU2NvcGUsXG4gIGdldEh1YkZyb21DYXJyaWVyLFxuICBnZXRDdXJyZW50SHViLFxuICBIdWIsXG4gIG1ha2VNYWluLFxuICBTY29wZSxcbiAgc3RhcnRUcmFuc2FjdGlvbixcbiAgU0RLX1ZFUlNJT04sXG4gIHNldENvbnRleHQsXG4gIHNldEV4dHJhLFxuICBzZXRFeHRyYXMsXG4gIHNldFRhZyxcbiAgc2V0VGFncyxcbiAgc2V0VXNlcixcbiAgd2l0aFNjb3BlLFxufSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuXG5leHBvcnQgeyBOb2RlT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0IHsgTm9kZUJhY2tlbmQgfSBmcm9tICcuL2JhY2tlbmQnO1xuZXhwb3J0IHsgTm9kZUNsaWVudCB9IGZyb20gJy4vY2xpZW50JztcbmV4cG9ydCB7IGRlZmF1bHRJbnRlZ3JhdGlvbnMsIGluaXQsIGxhc3RFdmVudElkLCBmbHVzaCwgY2xvc2UsIGdldFNlbnRyeVJlbGVhc2UgfSBmcm9tICcuL3Nkayc7XG5leHBvcnQgeyBkZWVwUmVhZERpclN5bmMgfSBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCB7IFNES19OQU1FIH0gZnJvbSAnLi92ZXJzaW9uJztcblxuaW1wb3J0IHsgSW50ZWdyYXRpb25zIGFzIENvcmVJbnRlZ3JhdGlvbnMgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgZ2V0TWFpbkNhcnJpZXIgfSBmcm9tICdAc2VudHJ5L2h1Yic7XG5pbXBvcnQgKiBhcyBkb21haW4gZnJvbSAnZG9tYWluJztcblxuaW1wb3J0ICogYXMgSGFuZGxlcnMgZnJvbSAnLi9oYW5kbGVycyc7XG5pbXBvcnQgKiBhcyBOb2RlSW50ZWdyYXRpb25zIGZyb20gJy4vaW50ZWdyYXRpb25zJztcbmltcG9ydCAqIGFzIFRyYW5zcG9ydHMgZnJvbSAnLi90cmFuc3BvcnRzJztcblxuY29uc3QgSU5URUdSQVRJT05TID0ge1xuICAuLi5Db3JlSW50ZWdyYXRpb25zLFxuICAuLi5Ob2RlSW50ZWdyYXRpb25zLFxufTtcblxuZXhwb3J0IHsgSU5URUdSQVRJT05TIGFzIEludGVncmF0aW9ucywgVHJhbnNwb3J0cywgSGFuZGxlcnMgfTtcblxuLy8gV2UgbmVlZCB0byBwYXRjaCBkb21haW4gb24gdGhlIGdsb2JhbCBfX1NFTlRSWV9fIG9iamVjdCB0byBtYWtlIGl0IHdvcmsgZm9yIG5vZGUgaW4gY3Jvc3MtcGxhdGZvcm0gcGFja2FnZXMgbGlrZVxuLy8gQHNlbnRyeS9odWIuIElmIHdlIGRvbid0IGRvIHRoaXMsIGJyb3dzZXIgYnVuZGxlcnMgd2lsbCBoYXZlIHRyb3VibGVzIHJlc29sdmluZyBgcmVxdWlyZSgnZG9tYWluJylgLlxuY29uc3QgY2FycmllciA9IGdldE1haW5DYXJyaWVyKCk7XG5pZiAoY2Fycmllci5fX1NFTlRSWV9fKSB7XG4gIGNhcnJpZXIuX19TRU5UUllfXy5leHRlbnNpb25zID0gY2Fycmllci5fX1NFTlRSWV9fLmV4dGVuc2lvbnMgfHwge307XG4gIGNhcnJpZXIuX19TRU5UUllfXy5leHRlbnNpb25zLmRvbWFpbiA9IGNhcnJpZXIuX19TRU5UUllfXy5leHRlbnNpb25zLmRvbWFpbiB8fCBkb21haW47XG59XG4iLCAiaW1wb3J0IHsgRXZlbnQsIEV2ZW50UHJvY2Vzc29yLCBIdWIsIEludGVncmF0aW9uIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QsIGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9ibG9iL3YxLjQuNy9zcmMvbWluRXJyLmpzXG5jb25zdCBhbmd1bGFyUGF0dGVybiA9IC9eXFxbKCg/OlskYS16QS1aMC05XSs6KT8oPzpbJGEtekEtWjAtOV0rKSlcXF0gKC4qPylcXG4/KFxcUyspJC87XG5cbi8qKlxuICogQW5ndWxhckpTIGludGVncmF0aW9uXG4gKlxuICogUHJvdmlkZXMgYW4gJGV4Y2VwdGlvbkhhbmRsZXIgZm9yIEFuZ3VsYXJKU1xuICovXG5leHBvcnQgY2xhc3MgQW5ndWxhciBpbXBsZW1lbnRzIEludGVncmF0aW9uIHtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkOiBzdHJpbmcgPSAnQW5ndWxhckpTJztcblxuICAvKipcbiAgICogbW9kdWxlTmFtZSB1c2VkIGluIEFuZ3VsYXIncyBESSByZXNvbHV0aW9uIGFsZ29yaXRobVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBtb2R1bGVOYW1lOiBzdHJpbmcgPSAnbmdTZW50cnknO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIG5hbWU6IHN0cmluZyA9IEFuZ3VsYXIuaWQ7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIncyBpbnN0YW5jZVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSByZWFkb25seSBfYW5ndWxhcjogYW55O1xuXG4gIC8qKlxuICAgKiBuZ1NlbnRyeSBtb2R1bGUgaW5zdGFuY2VcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgcmVhZG9ubHkgX21vZHVsZTogYW55O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGN1cnJlbnQgaHViLlxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q3VycmVudEh1Yj86ICgpID0+IEh1YjtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiB7IGFuZ3VsYXI/OiBhbnkgfSA9IHt9KSB7XG4gICAgbG9nZ2VyLmxvZygnWW91IGFyZSBzdGlsbCB1c2luZyB0aGUgQW5ndWxhciBpbnRlZ3JhdGlvbiwgY29uc2lkZXIgbW92aW5nIHRvIEBzZW50cnkvYW5ndWxhcicpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgIHRoaXMuX2FuZ3VsYXIgPSBvcHRpb25zLmFuZ3VsYXIgfHwgZ2V0R2xvYmFsT2JqZWN0PGFueT4oKS5hbmd1bGFyO1xuXG4gICAgaWYgKCF0aGlzLl9hbmd1bGFyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0FuZ3VsYXJJbnRlZ3JhdGlvbiBpcyBtaXNzaW5nIGFuIEFuZ3VsYXIgaW5zdGFuY2UnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgdGhpcy5fbW9kdWxlID0gdGhpcy5fYW5ndWxhci5tb2R1bGUoQW5ndWxhci5tb2R1bGVOYW1lLCBbXSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXR1cE9uY2UoXzogKGNhbGxiYWNrOiBFdmVudFByb2Nlc3NvcikgPT4gdm9pZCwgZ2V0Q3VycmVudEh1YjogKCkgPT4gSHViKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9tb2R1bGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9nZXRDdXJyZW50SHViID0gZ2V0Q3VycmVudEh1YjtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICB0aGlzLl9tb2R1bGUuY29uZmlnKFtcbiAgICAgICckcHJvdmlkZScsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgKCRwcm92aWRlOiBhbnkpOiB2b2lkID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICAkcHJvdmlkZS5kZWNvcmF0b3IoJyRleGNlcHRpb25IYW5kbGVyJywgWyckZGVsZWdhdGUnLCB0aGlzLl8kZXhjZXB0aW9uSGFuZGxlckRlY29yYXRvci5iaW5kKHRoaXMpXSk7XG4gICAgICB9LFxuICAgIF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIncyBleGNlcHRpb25IYW5kbGVyIGZvciBTZW50cnkgaW50ZWdyYXRpb25cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgXyRleGNlcHRpb25IYW5kbGVyRGVjb3JhdG9yKCRkZWxlZ2F0ZTogYW55KTogYW55IHtcbiAgICByZXR1cm4gKGV4Y2VwdGlvbjogRXJyb3IsIGNhdXNlPzogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBodWIgPSB0aGlzLl9nZXRDdXJyZW50SHViICYmIHRoaXMuX2dldEN1cnJlbnRIdWIoKTtcblxuICAgICAgaWYgKGh1YiAmJiBodWIuZ2V0SW50ZWdyYXRpb24oQW5ndWxhcikpIHtcbiAgICAgICAgaHViLndpdGhTY29wZShzY29wZSA9PiB7XG4gICAgICAgICAgaWYgKGNhdXNlKSB7XG4gICAgICAgICAgICBzY29wZS5zZXRFeHRyYSgnY2F1c2UnLCBjYXVzZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2NvcGUuYWRkRXZlbnRQcm9jZXNzb3IoKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXggPSBldmVudC5leGNlcHRpb24gJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyAmJiBldmVudC5leGNlcHRpb24udmFsdWVzWzBdO1xuXG4gICAgICAgICAgICBpZiAoZXgpIHtcbiAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IGFuZ3VsYXJQYXR0ZXJuLmV4ZWMoZXgudmFsdWUgfHwgJycpO1xuXG4gICAgICAgICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyB0eXBlIG5vdyBiZWNvbWVzIHNvbWV0aGluZyBsaWtlOiAkcm9vdFNjb3BlOmlucHJvZ1xuICAgICAgICAgICAgICAgIGV4LnR5cGUgPSBtYXRjaGVzWzFdO1xuICAgICAgICAgICAgICAgIGV4LnZhbHVlID0gbWF0Y2hlc1syXTtcbiAgICAgICAgICAgICAgICBldmVudC5tZXNzYWdlID0gYCR7ZXgudHlwZX06ICR7ZXgudmFsdWV9YDtcbiAgICAgICAgICAgICAgICAvLyBhdXRvIHNldCBhIG5ldyB0YWcgc3BlY2lmaWNhbGx5IGZvciB0aGUgYW5ndWxhciBlcnJvciB1cmxcbiAgICAgICAgICAgICAgICBldmVudC5leHRyYSA9IHtcbiAgICAgICAgICAgICAgICAgIC4uLmV2ZW50LmV4dHJhLFxuICAgICAgICAgICAgICAgICAgYW5ndWxhckRvY3M6IG1hdGNoZXNbM10uc3Vic3RyKDAsIDI1MCksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBodWIuY2FwdHVyZUV4Y2VwdGlvbihleGNlcHRpb24pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgICRkZWxlZ2F0ZShleGNlcHRpb24sIGNhdXNlKTtcbiAgICB9O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgRXZlbnRQcm9jZXNzb3IsIEh1YiwgSW50ZWdyYXRpb24sIFNldmVyaXR5IH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBmaWxsLCBnZXRHbG9iYWxPYmplY3QsIHNhZmVKb2luIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmNvbnN0IGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdDxXaW5kb3cgfCBOb2RlSlMuR2xvYmFsPigpO1xuXG4vKiogU2VuZCBDb25zb2xlIEFQSSBjYWxscyBhcyBTZW50cnkgRXZlbnRzICovXG5leHBvcnQgY2xhc3MgQ2FwdHVyZUNvbnNvbGUgaW1wbGVtZW50cyBJbnRlZ3JhdGlvbiB7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpZDogc3RyaW5nID0gJ0NhcHR1cmVDb25zb2xlJztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBDYXB0dXJlQ29uc29sZS5pZDtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2xldmVsczogc3RyaW5nW10gPSBbJ2xvZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InLCAnZGVidWcnLCAnYXNzZXJ0J107XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogeyBsZXZlbHM/OiBzdHJpbmdbXSB9ID0ge30pIHtcbiAgICBpZiAob3B0aW9ucy5sZXZlbHMpIHtcbiAgICAgIHRoaXMuX2xldmVscyA9IG9wdGlvbnMubGV2ZWxzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldHVwT25jZShfOiAoY2FsbGJhY2s6IEV2ZW50UHJvY2Vzc29yKSA9PiB2b2lkLCBnZXRDdXJyZW50SHViOiAoKSA9PiBIdWIpOiB2b2lkIHtcbiAgICBpZiAoISgnY29uc29sZScgaW4gZ2xvYmFsKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2xldmVscy5mb3JFYWNoKChsZXZlbDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIShsZXZlbCBpbiBnbG9iYWwuY29uc29sZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgZmlsbChnbG9iYWwuY29uc29sZSwgbGV2ZWwsIChvcmlnaW5hbENvbnNvbGVMZXZlbDogKCkgPT4gYW55KSA9PiAoLi4uYXJnczogYW55W10pOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgaHViID0gZ2V0Q3VycmVudEh1YigpO1xuXG4gICAgICAgIGlmIChodWIuZ2V0SW50ZWdyYXRpb24oQ2FwdHVyZUNvbnNvbGUpKSB7XG4gICAgICAgICAgaHViLndpdGhTY29wZShzY29wZSA9PiB7XG4gICAgICAgICAgICBzY29wZS5zZXRMZXZlbChTZXZlcml0eS5mcm9tU3RyaW5nKGxldmVsKSk7XG4gICAgICAgICAgICBzY29wZS5zZXRFeHRyYSgnYXJndW1lbnRzJywgYXJncyk7XG4gICAgICAgICAgICBzY29wZS5hZGRFdmVudFByb2Nlc3NvcihldmVudCA9PiB7XG4gICAgICAgICAgICAgIGV2ZW50LmxvZ2dlciA9ICdjb25zb2xlJztcbiAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxldCBtZXNzYWdlID0gc2FmZUpvaW4oYXJncywgJyAnKTtcbiAgICAgICAgICAgIGlmIChsZXZlbCA9PT0gJ2Fzc2VydCcpIHtcbiAgICAgICAgICAgICAgaWYgKGFyZ3NbMF0gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBBc3NlcnRpb24gZmFpbGVkOiAke3NhZmVKb2luKGFyZ3Muc2xpY2UoMSksICcgJykgfHwgJ2NvbnNvbGUuYXNzZXJ0J31gO1xuICAgICAgICAgICAgICAgIHNjb3BlLnNldEV4dHJhKCdhcmd1bWVudHMnLCBhcmdzLnNsaWNlKDEpKTtcbiAgICAgICAgICAgICAgICBodWIuY2FwdHVyZU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGV2ZWwgPT09ICdlcnJvcicgJiYgYXJnc1swXSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgIGh1Yi5jYXB0dXJlRXhjZXB0aW9uKGFyZ3NbMF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaHViLmNhcHR1cmVNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGhpcyBmYWlscyBmb3Igc29tZSBicm93c2Vycy4gOihcbiAgICAgICAgaWYgKG9yaWdpbmFsQ29uc29sZUxldmVsKSB7XG4gICAgICAgICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwob3JpZ2luYWxDb25zb2xlTGV2ZWwsIGdsb2JhbC5jb25zb2xlLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBFdmVudCwgRXZlbnRIaW50LCBFdmVudFByb2Nlc3NvciwgSHViLCBJbnRlZ3JhdGlvbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgY29uc29sZVNhbmRib3ggfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuLyoqIEpTRG9jICovXG5pbnRlcmZhY2UgRGVidWdPcHRpb25zIHtcbiAgc3RyaW5naWZ5PzogYm9vbGVhbjtcbiAgZGVidWdnZXI/OiBib29sZWFuO1xufVxuXG4vKiogSlNEb2MgKi9cbmV4cG9ydCBjbGFzcyBEZWJ1ZyBpbXBsZW1lbnRzIEludGVncmF0aW9uIHtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkOiBzdHJpbmcgPSAnRGVidWcnO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIG5hbWU6IHN0cmluZyA9IERlYnVnLmlkO1xuXG4gIC8qKiBKU0RvYyAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zOiBEZWJ1Z09wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9ucz86IERlYnVnT3B0aW9ucykge1xuICAgIHRoaXMuX29wdGlvbnMgPSB7XG4gICAgICBkZWJ1Z2dlcjogZmFsc2UsXG4gICAgICBzdHJpbmdpZnk6IGZhbHNlLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0dXBPbmNlKGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yOiAoY2FsbGJhY2s6IEV2ZW50UHJvY2Vzc29yKSA9PiB2b2lkLCBnZXRDdXJyZW50SHViOiAoKSA9PiBIdWIpOiB2b2lkIHtcbiAgICBhZGRHbG9iYWxFdmVudFByb2Nlc3NvcigoZXZlbnQ6IEV2ZW50LCBoaW50PzogRXZlbnRIaW50KSA9PiB7XG4gICAgICBjb25zdCBzZWxmID0gZ2V0Q3VycmVudEh1YigpLmdldEludGVncmF0aW9uKERlYnVnKTtcbiAgICAgIGlmIChzZWxmKSB7XG4gICAgICAgIGlmIChzZWxmLl9vcHRpb25zLmRlYnVnZ2VyKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyXG4gICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gICAgICAgIGNvbnNvbGVTYW5kYm94KCgpID0+IHtcbiAgICAgICAgICBpZiAoc2VsZi5fb3B0aW9ucy5zdHJpbmdpZnkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGV2ZW50LCBudWxsLCAyKSk7XG4gICAgICAgICAgICBpZiAoaGludCkge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShoaW50LCBudWxsLCAyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV2ZW50KTtcbiAgICAgICAgICAgIGlmIChoaW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGhpbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuICAgICAgfVxuICAgICAgcmV0dXJuIGV2ZW50O1xuICAgIH0pO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgRXZlbnQsIEV2ZW50UHJvY2Vzc29yLCBFeGNlcHRpb24sIEh1YiwgSW50ZWdyYXRpb24sIFN0YWNrRnJhbWUgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG4vKiogRGVkdXBsaWNhdGlvbiBmaWx0ZXIgKi9cbmV4cG9ydCBjbGFzcyBEZWR1cGUgaW1wbGVtZW50cyBJbnRlZ3JhdGlvbiB7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpZDogc3RyaW5nID0gJ0RlZHVwZSc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgbmFtZTogc3RyaW5nID0gRGVkdXBlLmlkO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHJpdmF0ZSBfcHJldmlvdXNFdmVudD86IEV2ZW50O1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldHVwT25jZShhZGRHbG9iYWxFdmVudFByb2Nlc3NvcjogKGNhbGxiYWNrOiBFdmVudFByb2Nlc3NvcikgPT4gdm9pZCwgZ2V0Q3VycmVudEh1YjogKCkgPT4gSHViKTogdm9pZCB7XG4gICAgYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3IoKGN1cnJlbnRFdmVudDogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHNlbGYgPSBnZXRDdXJyZW50SHViKCkuZ2V0SW50ZWdyYXRpb24oRGVkdXBlKTtcbiAgICAgIGlmIChzZWxmKSB7XG4gICAgICAgIC8vIEp1dXVzdCBpbiBjYXNlIHNvbWV0aGluZyBnb2VzIHdyb25nXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHNlbGYuX3Nob3VsZERyb3BFdmVudChjdXJyZW50RXZlbnQsIHNlbGYuX3ByZXZpb3VzRXZlbnQpKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihgRXZlbnQgZHJvcHBlZCBkdWUgdG8gYmVpbmcgYSBkdXBsaWNhdGUgb2YgcHJldmlvdXNseSBjYXB0dXJlZCBldmVudC5gKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoX29PKSB7XG4gICAgICAgICAgcmV0dXJuIChzZWxmLl9wcmV2aW91c0V2ZW50ID0gY3VycmVudEV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoc2VsZi5fcHJldmlvdXNFdmVudCA9IGN1cnJlbnRFdmVudCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3VycmVudEV2ZW50O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHByaXZhdGUgX3Nob3VsZERyb3BFdmVudChjdXJyZW50RXZlbnQ6IEV2ZW50LCBwcmV2aW91c0V2ZW50PzogRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoIXByZXZpb3VzRXZlbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5faXNTYW1lTWVzc2FnZUV2ZW50KGN1cnJlbnRFdmVudCwgcHJldmlvdXNFdmVudCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9pc1NhbWVFeGNlcHRpb25FdmVudChjdXJyZW50RXZlbnQsIHByZXZpb3VzRXZlbnQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHJpdmF0ZSBfaXNTYW1lTWVzc2FnZUV2ZW50KGN1cnJlbnRFdmVudDogRXZlbnQsIHByZXZpb3VzRXZlbnQ6IEV2ZW50KTogYm9vbGVhbiB7XG4gICAgY29uc3QgY3VycmVudE1lc3NhZ2UgPSBjdXJyZW50RXZlbnQubWVzc2FnZTtcbiAgICBjb25zdCBwcmV2aW91c01lc3NhZ2UgPSBwcmV2aW91c0V2ZW50Lm1lc3NhZ2U7XG5cbiAgICAvLyBJZiBuZWl0aGVyIGV2ZW50IGhhcyBhIG1lc3NhZ2UgcHJvcGVydHksIHRoZXkgd2VyZSBib3RoIGV4Y2VwdGlvbnMsIHNvIGJhaWwgb3V0XG4gICAgaWYgKCFjdXJyZW50TWVzc2FnZSAmJiAhcHJldmlvdXNNZXNzYWdlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gSWYgb25seSBvbmUgZXZlbnQgaGFzIGEgc3RhY2t0cmFjZSwgYnV0IG5vdCB0aGUgb3RoZXIgb25lLCB0aGV5IGFyZSBub3QgdGhlIHNhbWVcbiAgICBpZiAoKGN1cnJlbnRNZXNzYWdlICYmICFwcmV2aW91c01lc3NhZ2UpIHx8ICghY3VycmVudE1lc3NhZ2UgJiYgcHJldmlvdXNNZXNzYWdlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50TWVzc2FnZSAhPT0gcHJldmlvdXNNZXNzYWdlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9pc1NhbWVGaW5nZXJwcmludChjdXJyZW50RXZlbnQsIHByZXZpb3VzRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9pc1NhbWVTdGFja3RyYWNlKGN1cnJlbnRFdmVudCwgcHJldmlvdXNFdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwcml2YXRlIF9nZXRGcmFtZXNGcm9tRXZlbnQoZXZlbnQ6IEV2ZW50KTogU3RhY2tGcmFtZVtdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBleGNlcHRpb24gPSBldmVudC5leGNlcHRpb247XG5cbiAgICBpZiAoZXhjZXB0aW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBAdHMtaWdub3JlIE9iamVjdCBjb3VsZCBiZSB1bmRlZmluZWRcbiAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbi52YWx1ZXNbMF0uc3RhY2t0cmFjZS5mcmFtZXM7XG4gICAgICB9IGNhdGNoIChfb08pIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGV2ZW50LnN0YWNrdHJhY2UpIHtcbiAgICAgIHJldHVybiBldmVudC5zdGFja3RyYWNlLmZyYW1lcztcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwcml2YXRlIF9pc1NhbWVTdGFja3RyYWNlKGN1cnJlbnRFdmVudDogRXZlbnQsIHByZXZpb3VzRXZlbnQ6IEV2ZW50KTogYm9vbGVhbiB7XG4gICAgbGV0IGN1cnJlbnRGcmFtZXMgPSB0aGlzLl9nZXRGcmFtZXNGcm9tRXZlbnQoY3VycmVudEV2ZW50KTtcbiAgICBsZXQgcHJldmlvdXNGcmFtZXMgPSB0aGlzLl9nZXRGcmFtZXNGcm9tRXZlbnQocHJldmlvdXNFdmVudCk7XG5cbiAgICAvLyBJZiBuZWl0aGVyIGV2ZW50IGhhcyBhIHN0YWNrdHJhY2UsIHRoZXkgYXJlIGFzc3VtZWQgdG8gYmUgdGhlIHNhbWVcbiAgICBpZiAoIWN1cnJlbnRGcmFtZXMgJiYgIXByZXZpb3VzRnJhbWVzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJZiBvbmx5IG9uZSBldmVudCBoYXMgYSBzdGFja3RyYWNlLCBidXQgbm90IHRoZSBvdGhlciBvbmUsIHRoZXkgYXJlIG5vdCB0aGUgc2FtZVxuICAgIGlmICgoY3VycmVudEZyYW1lcyAmJiAhcHJldmlvdXNGcmFtZXMpIHx8ICghY3VycmVudEZyYW1lcyAmJiBwcmV2aW91c0ZyYW1lcykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjdXJyZW50RnJhbWVzID0gY3VycmVudEZyYW1lcyBhcyBTdGFja0ZyYW1lW107XG4gICAgcHJldmlvdXNGcmFtZXMgPSBwcmV2aW91c0ZyYW1lcyBhcyBTdGFja0ZyYW1lW107XG5cbiAgICAvLyBJZiBudW1iZXIgb2YgZnJhbWVzIGRpZmZlciwgdGhleSBhcmUgbm90IHRoZSBzYW1lXG4gICAgaWYgKHByZXZpb3VzRnJhbWVzLmxlbmd0aCAhPT0gY3VycmVudEZyYW1lcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIGNvbXBhcmUgdGhlIHR3b1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldmlvdXNGcmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGZyYW1lQSA9IHByZXZpb3VzRnJhbWVzW2ldO1xuICAgICAgY29uc3QgZnJhbWVCID0gY3VycmVudEZyYW1lc1tpXTtcblxuICAgICAgaWYgKFxuICAgICAgICBmcmFtZUEuZmlsZW5hbWUgIT09IGZyYW1lQi5maWxlbmFtZSB8fFxuICAgICAgICBmcmFtZUEubGluZW5vICE9PSBmcmFtZUIubGluZW5vIHx8XG4gICAgICAgIGZyYW1lQS5jb2xubyAhPT0gZnJhbWVCLmNvbG5vIHx8XG4gICAgICAgIGZyYW1lQS5mdW5jdGlvbiAhPT0gZnJhbWVCLmZ1bmN0aW9uXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHByaXZhdGUgX2dldEV4Y2VwdGlvbkZyb21FdmVudChldmVudDogRXZlbnQpOiBFeGNlcHRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBldmVudC5leGNlcHRpb24gJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyAmJiBldmVudC5leGNlcHRpb24udmFsdWVzWzBdO1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHByaXZhdGUgX2lzU2FtZUV4Y2VwdGlvbkV2ZW50KGN1cnJlbnRFdmVudDogRXZlbnQsIHByZXZpb3VzRXZlbnQ6IEV2ZW50KTogYm9vbGVhbiB7XG4gICAgY29uc3QgcHJldmlvdXNFeGNlcHRpb24gPSB0aGlzLl9nZXRFeGNlcHRpb25Gcm9tRXZlbnQocHJldmlvdXNFdmVudCk7XG4gICAgY29uc3QgY3VycmVudEV4Y2VwdGlvbiA9IHRoaXMuX2dldEV4Y2VwdGlvbkZyb21FdmVudChjdXJyZW50RXZlbnQpO1xuXG4gICAgaWYgKCFwcmV2aW91c0V4Y2VwdGlvbiB8fCAhY3VycmVudEV4Y2VwdGlvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChwcmV2aW91c0V4Y2VwdGlvbi50eXBlICE9PSBjdXJyZW50RXhjZXB0aW9uLnR5cGUgfHwgcHJldmlvdXNFeGNlcHRpb24udmFsdWUgIT09IGN1cnJlbnRFeGNlcHRpb24udmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2lzU2FtZUZpbmdlcnByaW50KGN1cnJlbnRFdmVudCwgcHJldmlvdXNFdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2lzU2FtZVN0YWNrdHJhY2UoY3VycmVudEV2ZW50LCBwcmV2aW91c0V2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHByaXZhdGUgX2lzU2FtZUZpbmdlcnByaW50KGN1cnJlbnRFdmVudDogRXZlbnQsIHByZXZpb3VzRXZlbnQ6IEV2ZW50KTogYm9vbGVhbiB7XG4gICAgbGV0IGN1cnJlbnRGaW5nZXJwcmludCA9IGN1cnJlbnRFdmVudC5maW5nZXJwcmludDtcbiAgICBsZXQgcHJldmlvdXNGaW5nZXJwcmludCA9IHByZXZpb3VzRXZlbnQuZmluZ2VycHJpbnQ7XG5cbiAgICAvLyBJZiBuZWl0aGVyIGV2ZW50IGhhcyBhIGZpbmdlcnByaW50LCB0aGV5IGFyZSBhc3N1bWVkIHRvIGJlIHRoZSBzYW1lXG4gICAgaWYgKCFjdXJyZW50RmluZ2VycHJpbnQgJiYgIXByZXZpb3VzRmluZ2VycHJpbnQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIElmIG9ubHkgb25lIGV2ZW50IGhhcyBhIGZpbmdlcnByaW50LCBidXQgbm90IHRoZSBvdGhlciBvbmUsIHRoZXkgYXJlIG5vdCB0aGUgc2FtZVxuICAgIGlmICgoY3VycmVudEZpbmdlcnByaW50ICYmICFwcmV2aW91c0ZpbmdlcnByaW50KSB8fCAoIWN1cnJlbnRGaW5nZXJwcmludCAmJiBwcmV2aW91c0ZpbmdlcnByaW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGN1cnJlbnRGaW5nZXJwcmludCA9IGN1cnJlbnRGaW5nZXJwcmludCBhcyBzdHJpbmdbXTtcbiAgICBwcmV2aW91c0ZpbmdlcnByaW50ID0gcHJldmlvdXNGaW5nZXJwcmludCBhcyBzdHJpbmdbXTtcblxuICAgIC8vIE90aGVyd2lzZSwgY29tcGFyZSB0aGUgdHdvXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIShjdXJyZW50RmluZ2VycHJpbnQuam9pbignJykgPT09IHByZXZpb3VzRmluZ2VycHJpbnQuam9pbignJykpO1xuICAgIH0gY2F0Y2ggKF9vTykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7IEV2ZW50UHJvY2Vzc29yLCBIdWIsIEludGVncmF0aW9uIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QsIGlzSW5zdGFuY2VPZiwgbG9nZ2VyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGNsYXNzIEVtYmVyIGltcGxlbWVudHMgSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWQ6IHN0cmluZyA9ICdFbWJlcic7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgbmFtZTogc3RyaW5nID0gRW1iZXIuaWQ7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgcmVhZG9ubHkgX0VtYmVyOiBhbnk7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogeyBFbWJlcj86IGFueSB9ID0ge30pIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgdGhpcy5fRW1iZXIgPSBvcHRpb25zLkVtYmVyIHx8IGdldEdsb2JhbE9iamVjdDxhbnk+KCkuRW1iZXI7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXR1cE9uY2UoXzogKGNhbGxiYWNrOiBFdmVudFByb2Nlc3NvcikgPT4gdm9pZCwgZ2V0Q3VycmVudEh1YjogKCkgPT4gSHViKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9FbWJlcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdFbWJlckludGVncmF0aW9uIGlzIG1pc3NpbmcgYW4gRW1iZXIgaW5zdGFuY2UnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgKi9cbiAgICBjb25zdCBvbGRPbkVycm9yID0gdGhpcy5fRW1iZXIub25lcnJvcjtcblxuICAgIHRoaXMuX0VtYmVyLm9uZXJyb3IgPSAoZXJyb3I6IEVycm9yKTogdm9pZCA9PiB7XG4gICAgICBpZiAoZ2V0Q3VycmVudEh1YigpLmdldEludGVncmF0aW9uKEVtYmVyKSkge1xuICAgICAgICBnZXRDdXJyZW50SHViKCkuY2FwdHVyZUV4Y2VwdGlvbihlcnJvciwgeyBvcmlnaW5hbEV4Y2VwdGlvbjogZXJyb3IgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygb2xkT25FcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvbGRPbkVycm9yLmNhbGwodGhpcy5fRW1iZXIsIGVycm9yKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fRW1iZXIudGVzdGluZykge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICB0aGlzLl9FbWJlci5SU1ZQLm9uKCdlcnJvcicsIChyZWFzb246IHVua25vd24pOiB2b2lkID0+IHtcbiAgICAgIGlmIChnZXRDdXJyZW50SHViKCkuZ2V0SW50ZWdyYXRpb24oRW1iZXIpKSB7XG4gICAgICAgIGdldEN1cnJlbnRIdWIoKS53aXRoU2NvcGUoc2NvcGUgPT4ge1xuICAgICAgICAgIGlmIChpc0luc3RhbmNlT2YocmVhc29uLCBFcnJvcikpIHtcbiAgICAgICAgICAgIHNjb3BlLnNldEV4dHJhKCdjb250ZXh0JywgJ1VuaGFuZGxlZCBQcm9taXNlIGVycm9yIGRldGVjdGVkJyk7XG4gICAgICAgICAgICBnZXRDdXJyZW50SHViKCkuY2FwdHVyZUV4Y2VwdGlvbihyZWFzb24sIHsgb3JpZ2luYWxFeGNlcHRpb246IHJlYXNvbiBhcyBFcnJvciB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2NvcGUuc2V0RXh0cmEoJ3JlYXNvbicsIHJlYXNvbik7XG4gICAgICAgICAgICBnZXRDdXJyZW50SHViKCkuY2FwdHVyZU1lc3NhZ2UoJ1VuaGFuZGxlZCBQcm9taXNlIGVycm9yIGRldGVjdGVkJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xufVxuIiwgImltcG9ydCB7IEV2ZW50LCBFdmVudEhpbnQsIEV2ZW50UHJvY2Vzc29yLCBFeHRlbmRlZEVycm9yLCBIdWIsIEludGVncmF0aW9uIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBpc0Vycm9yLCBpc1BsYWluT2JqZWN0LCBsb2dnZXIsIG5vcm1hbGl6ZSB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG4vKiogSlNEb2MgKi9cbmludGVyZmFjZSBFeHRyYUVycm9yRGF0YU9wdGlvbnMge1xuICBkZXB0aD86IG51bWJlcjtcbn1cblxuLyoqIFBhdGNoIHRvU3RyaW5nIGNhbGxzIHRvIHJldHVybiBwcm9wZXIgbmFtZSBmb3Igd3JhcHBlZCBmdW5jdGlvbnMgKi9cbmV4cG9ydCBjbGFzcyBFeHRyYUVycm9yRGF0YSBpbXBsZW1lbnRzIEludGVncmF0aW9uIHtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkOiBzdHJpbmcgPSAnRXh0cmFFcnJvckRhdGEnO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIG5hbWU6IHN0cmluZyA9IEV4dHJhRXJyb3JEYXRhLmlkO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnM6IEV4dHJhRXJyb3JEYXRhT3B0aW9ucyA9IHsgZGVwdGg6IDMgfSkge31cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXR1cE9uY2UoYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3I6IChjYWxsYmFjazogRXZlbnRQcm9jZXNzb3IpID0+IHZvaWQsIGdldEN1cnJlbnRIdWI6ICgpID0+IEh1Yik6IHZvaWQge1xuICAgIGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yKChldmVudDogRXZlbnQsIGhpbnQ/OiBFdmVudEhpbnQpID0+IHtcbiAgICAgIGNvbnN0IHNlbGYgPSBnZXRDdXJyZW50SHViKCkuZ2V0SW50ZWdyYXRpb24oRXh0cmFFcnJvckRhdGEpO1xuICAgICAgaWYgKCFzZWxmKSB7XG4gICAgICAgIHJldHVybiBldmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWxmLmVuaGFuY2VFdmVudFdpdGhFcnJvckRhdGEoZXZlbnQsIGhpbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaGVzIGV4dHJhY3RlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBFcnJvciBvYmplY3QgdG8gZXh0cmEgZmllbGQgaW4gdGhlIEV2ZW50XG4gICAqL1xuICBwdWJsaWMgZW5oYW5jZUV2ZW50V2l0aEVycm9yRGF0YShldmVudDogRXZlbnQsIGhpbnQ/OiBFdmVudEhpbnQpOiBFdmVudCB7XG4gICAgaWYgKCFoaW50IHx8ICFoaW50Lm9yaWdpbmFsRXhjZXB0aW9uIHx8ICFpc0Vycm9yKGhpbnQub3JpZ2luYWxFeGNlcHRpb24pKSB7XG4gICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSAoaGludC5vcmlnaW5hbEV4Y2VwdGlvbiBhcyBFeHRlbmRlZEVycm9yKS5uYW1lIHx8IGhpbnQub3JpZ2luYWxFeGNlcHRpb24uY29uc3RydWN0b3IubmFtZTtcblxuICAgIGNvbnN0IGVycm9yRGF0YSA9IHRoaXMuX2V4dHJhY3RFcnJvckRhdGEoaGludC5vcmlnaW5hbEV4Y2VwdGlvbiBhcyBFeHRlbmRlZEVycm9yKTtcblxuICAgIGlmIChlcnJvckRhdGEpIHtcbiAgICAgIGxldCBjb250ZXh0cyA9IHtcbiAgICAgICAgLi4uZXZlbnQuY29udGV4dHMsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBub3JtYWxpemVkRXJyb3JEYXRhID0gbm9ybWFsaXplKGVycm9yRGF0YSwgdGhpcy5fb3B0aW9ucy5kZXB0aCk7XG4gICAgICBpZiAoaXNQbGFpbk9iamVjdChub3JtYWxpemVkRXJyb3JEYXRhKSkge1xuICAgICAgICBjb250ZXh0cyA9IHtcbiAgICAgICAgICAuLi5ldmVudC5jb250ZXh0cyxcbiAgICAgICAgICBbbmFtZV06IHtcbiAgICAgICAgICAgIC4uLm5vcm1hbGl6ZWRFcnJvckRhdGEsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZXZlbnQsXG4gICAgICAgIGNvbnRleHRzLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXZlbnQ7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBleHRyYSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBFcnJvciBvYmplY3RcbiAgICovXG4gIHByaXZhdGUgX2V4dHJhY3RFcnJvckRhdGEoZXJyb3I6IEV4dGVuZGVkRXJyb3IpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwge1xuICAgIC8vIFdlIGFyZSB0cnlpbmcgdG8gZW5oYW5jZSBhbHJlYWR5IGV4aXN0aW5nIGV2ZW50LCBzbyBubyBoYXJtIGRvbmUgaWYgaXQgd29uJ3Qgc3VjY2VlZFxuICAgIHRyeSB7XG4gICAgICBjb25zdCBuYXRpdmVLZXlzID0gW1xuICAgICAgICAnbmFtZScsXG4gICAgICAgICdtZXNzYWdlJyxcbiAgICAgICAgJ3N0YWNrJyxcbiAgICAgICAgJ2xpbmUnLFxuICAgICAgICAnY29sdW1uJyxcbiAgICAgICAgJ2ZpbGVOYW1lJyxcbiAgICAgICAgJ2xpbmVOdW1iZXInLFxuICAgICAgICAnY29sdW1uTnVtYmVyJyxcbiAgICAgICAgJ3RvSlNPTicsXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBleHRyYUVycm9ySW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgICAgLy8gV2Ugd2FudCBvbmx5IGVudW1lcmFibGUgcHJvcGVydGllcywgdGh1cyBgZ2V0T3duUHJvcGVydHlOYW1lc2AgaXMgcmVkdW5kYW50IGhlcmUsIGFzIHdlIGZpbHRlciBrZXlzIGFueXdheS5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVycm9yKSkge1xuICAgICAgICBpZiAobmF0aXZlS2V5cy5pbmRleE9mKGtleSkgIT09IC0xKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSBlcnJvcltrZXldO1xuICAgICAgICBleHRyYUVycm9ySW5mb1trZXldID0gaXNFcnJvcih2YWx1ZSkgPyAodmFsdWUgYXMgRXJyb3IpLnRvU3RyaW5nKCkgOiB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgc29tZW9uZSBhdHRhY2hlZCBgdG9KU09OYCBtZXRob2QgdG8gZ3JhYiBldmVuIG1vcmUgcHJvcGVydGllcyAoZWcuIGF4aW9zIGlzIGRvaW5nIHRoYXQpXG4gICAgICBpZiAodHlwZW9mIGVycm9yLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkRXJyb3IgPSBlcnJvci50b0pTT04oKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzZXJpYWxpemVkRXJyb3IpKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBzZXJpYWxpemVkRXJyb3Jba2V5XTtcbiAgICAgICAgICBleHRyYUVycm9ySW5mb1trZXldID0gaXNFcnJvcih2YWx1ZSkgPyAodmFsdWUgYXMgRXJyb3IpLnRvU3RyaW5nKCkgOiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXh0cmFFcnJvckluZm87XG4gICAgfSBjYXRjaCAob08pIHtcbiAgICAgIGxvZ2dlci5lcnJvcignVW5hYmxlIHRvIGV4dHJhY3QgZXh0cmEgZGF0YSBmcm9tIHRoZSBFcnJvciBvYmplY3Q6Jywgb08pO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iLCAiLyohXG4gICAgbG9jYWxGb3JhZ2UgLS0gT2ZmbGluZSBTdG9yYWdlLCBJbXByb3ZlZFxuICAgIFZlcnNpb24gMS4xMC4wXG4gICAgaHR0cHM6Ly9sb2NhbGZvcmFnZS5naXRodWIuaW8vbG9jYWxGb3JhZ2VcbiAgICAoYykgMjAxMy0yMDE3IE1vemlsbGEsIEFwYWNoZSBMaWNlbnNlIDIuMFxuKi9cbihmdW5jdGlvbihmKXtpZih0eXBlb2YgZXhwb3J0cz09PVwib2JqZWN0XCImJnR5cGVvZiBtb2R1bGUhPT1cInVuZGVmaW5lZFwiKXttb2R1bGUuZXhwb3J0cz1mKCl9ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT09XCJmdW5jdGlvblwiJiZkZWZpbmUuYW1kKXtkZWZpbmUoW10sZil9ZWxzZXt2YXIgZztpZih0eXBlb2Ygd2luZG93IT09XCJ1bmRlZmluZWRcIil7Zz13aW5kb3d9ZWxzZSBpZih0eXBlb2YgZ2xvYmFsIT09XCJ1bmRlZmluZWRcIil7Zz1nbG9iYWx9ZWxzZSBpZih0eXBlb2Ygc2VsZiE9PVwidW5kZWZpbmVkXCIpe2c9c2VsZn1lbHNle2c9dGhpc31nLmxvY2FsZm9yYWdlID0gZigpfX0pKGZ1bmN0aW9uKCl7dmFyIGRlZmluZSxtb2R1bGUsZXhwb3J0cztyZXR1cm4gKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IChmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsIGYpfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkoezE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuKGZ1bmN0aW9uIChnbG9iYWwpe1xuJ3VzZSBzdHJpY3QnO1xudmFyIE11dGF0aW9uID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG5cbnZhciBzY2hlZHVsZURyYWluO1xuXG57XG4gIGlmIChNdXRhdGlvbikge1xuICAgIHZhciBjYWxsZWQgPSAwO1xuICAgIHZhciBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbihuZXh0VGljayk7XG4gICAgdmFyIGVsZW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgIG9ic2VydmVyLm9ic2VydmUoZWxlbWVudCwge1xuICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZVxuICAgIH0pO1xuICAgIHNjaGVkdWxlRHJhaW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBlbGVtZW50LmRhdGEgPSAoY2FsbGVkID0gKytjYWxsZWQgJSAyKTtcbiAgICB9O1xuICB9IGVsc2UgaWYgKCFnbG9iYWwuc2V0SW1tZWRpYXRlICYmIHR5cGVvZiBnbG9iYWwuTWVzc2FnZUNoYW5uZWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgdmFyIGNoYW5uZWwgPSBuZXcgZ2xvYmFsLk1lc3NhZ2VDaGFubmVsKCk7XG4gICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBuZXh0VGljaztcbiAgICBzY2hlZHVsZURyYWluID0gZnVuY3Rpb24gKCkge1xuICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSgwKTtcbiAgICB9O1xuICB9IGVsc2UgaWYgKCdkb2N1bWVudCcgaW4gZ2xvYmFsICYmICdvbnJlYWR5c3RhdGVjaGFuZ2UnIGluIGdsb2JhbC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKSkge1xuICAgIHNjaGVkdWxlRHJhaW4gPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAgIC8vIENyZWF0ZSBhIDxzY3JpcHQ+IGVsZW1lbnQ7IGl0cyByZWFkeXN0YXRlY2hhbmdlIGV2ZW50IHdpbGwgYmUgZmlyZWQgYXN5bmNocm9ub3VzbHkgb25jZSBpdCBpcyBpbnNlcnRlZFxuICAgICAgLy8gaW50byB0aGUgZG9jdW1lbnQuIERvIHNvLCB0aHVzIHF1ZXVpbmcgdXAgdGhlIHRhc2suIFJlbWVtYmVyIHRvIGNsZWFuIHVwIG9uY2UgaXQncyBiZWVuIGNhbGxlZC5cbiAgICAgIHZhciBzY3JpcHRFbCA9IGdsb2JhbC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgIHNjcmlwdEVsLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbmV4dFRpY2soKTtcblxuICAgICAgICBzY3JpcHRFbC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuICAgICAgICBzY3JpcHRFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNjcmlwdEVsKTtcbiAgICAgICAgc2NyaXB0RWwgPSBudWxsO1xuICAgICAgfTtcbiAgICAgIGdsb2JhbC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2NyaXB0RWwpO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgc2NoZWR1bGVEcmFpbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHNldFRpbWVvdXQobmV4dFRpY2ssIDApO1xuICAgIH07XG4gIH1cbn1cblxudmFyIGRyYWluaW5nO1xudmFyIHF1ZXVlID0gW107XG4vL25hbWVkIG5leHRUaWNrIGZvciBsZXNzIGNvbmZ1c2luZyBzdGFjayB0cmFjZXNcbmZ1bmN0aW9uIG5leHRUaWNrKCkge1xuICBkcmFpbmluZyA9IHRydWU7XG4gIHZhciBpLCBvbGRRdWV1ZTtcbiAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgd2hpbGUgKGxlbikge1xuICAgIG9sZFF1ZXVlID0gcXVldWU7XG4gICAgcXVldWUgPSBbXTtcbiAgICBpID0gLTE7XG4gICAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgICAgb2xkUXVldWVbaV0oKTtcbiAgICB9XG4gICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICB9XG4gIGRyYWluaW5nID0gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW1tZWRpYXRlO1xuZnVuY3Rpb24gaW1tZWRpYXRlKHRhc2spIHtcbiAgaWYgKHF1ZXVlLnB1c2godGFzaykgPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgc2NoZWR1bGVEcmFpbigpO1xuICB9XG59XG5cbn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KVxufSx7fV0sMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG52YXIgaW1tZWRpYXRlID0gX2RlcmVxXygxKTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmZ1bmN0aW9uIElOVEVSTkFMKCkge31cblxudmFyIGhhbmRsZXJzID0ge307XG5cbnZhciBSRUpFQ1RFRCA9IFsnUkVKRUNURUQnXTtcbnZhciBGVUxGSUxMRUQgPSBbJ0ZVTEZJTExFRCddO1xudmFyIFBFTkRJTkcgPSBbJ1BFTkRJTkcnXTtcblxubW9kdWxlLmV4cG9ydHMgPSBQcm9taXNlO1xuXG5mdW5jdGlvbiBQcm9taXNlKHJlc29sdmVyKSB7XG4gIGlmICh0eXBlb2YgcmVzb2x2ZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZXNvbHZlciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuICB0aGlzLnN0YXRlID0gUEVORElORztcbiAgdGhpcy5xdWV1ZSA9IFtdO1xuICB0aGlzLm91dGNvbWUgPSB2b2lkIDA7XG4gIGlmIChyZXNvbHZlciAhPT0gSU5URVJOQUwpIHtcbiAgICBzYWZlbHlSZXNvbHZlVGhlbmFibGUodGhpcywgcmVzb2x2ZXIpO1xuICB9XG59XG5cblByb21pc2UucHJvdG90eXBlW1wiY2F0Y2hcIl0gPSBmdW5jdGlvbiAob25SZWplY3RlZCkge1xuICByZXR1cm4gdGhpcy50aGVuKG51bGwsIG9uUmVqZWN0ZWQpO1xufTtcblByb21pc2UucHJvdG90eXBlLnRoZW4gPSBmdW5jdGlvbiAob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgaWYgKHR5cGVvZiBvbkZ1bGZpbGxlZCAhPT0gJ2Z1bmN0aW9uJyAmJiB0aGlzLnN0YXRlID09PSBGVUxGSUxMRUQgfHxcbiAgICB0eXBlb2Ygb25SZWplY3RlZCAhPT0gJ2Z1bmN0aW9uJyAmJiB0aGlzLnN0YXRlID09PSBSRUpFQ1RFRCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHZhciBwcm9taXNlID0gbmV3IHRoaXMuY29uc3RydWN0b3IoSU5URVJOQUwpO1xuICBpZiAodGhpcy5zdGF0ZSAhPT0gUEVORElORykge1xuICAgIHZhciByZXNvbHZlciA9IHRoaXMuc3RhdGUgPT09IEZVTEZJTExFRCA/IG9uRnVsZmlsbGVkIDogb25SZWplY3RlZDtcbiAgICB1bndyYXAocHJvbWlzZSwgcmVzb2x2ZXIsIHRoaXMub3V0Y29tZSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5xdWV1ZS5wdXNoKG5ldyBRdWV1ZUl0ZW0ocHJvbWlzZSwgb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpKTtcbiAgfVxuXG4gIHJldHVybiBwcm9taXNlO1xufTtcbmZ1bmN0aW9uIFF1ZXVlSXRlbShwcm9taXNlLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICB0aGlzLnByb21pc2UgPSBwcm9taXNlO1xuICBpZiAodHlwZW9mIG9uRnVsZmlsbGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhpcy5vbkZ1bGZpbGxlZCA9IG9uRnVsZmlsbGVkO1xuICAgIHRoaXMuY2FsbEZ1bGZpbGxlZCA9IHRoaXMub3RoZXJDYWxsRnVsZmlsbGVkO1xuICB9XG4gIGlmICh0eXBlb2Ygb25SZWplY3RlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMub25SZWplY3RlZCA9IG9uUmVqZWN0ZWQ7XG4gICAgdGhpcy5jYWxsUmVqZWN0ZWQgPSB0aGlzLm90aGVyQ2FsbFJlamVjdGVkO1xuICB9XG59XG5RdWV1ZUl0ZW0ucHJvdG90eXBlLmNhbGxGdWxmaWxsZWQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgaGFuZGxlcnMucmVzb2x2ZSh0aGlzLnByb21pc2UsIHZhbHVlKTtcbn07XG5RdWV1ZUl0ZW0ucHJvdG90eXBlLm90aGVyQ2FsbEZ1bGZpbGxlZCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB1bndyYXAodGhpcy5wcm9taXNlLCB0aGlzLm9uRnVsZmlsbGVkLCB2YWx1ZSk7XG59O1xuUXVldWVJdGVtLnByb3RvdHlwZS5jYWxsUmVqZWN0ZWQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgaGFuZGxlcnMucmVqZWN0KHRoaXMucHJvbWlzZSwgdmFsdWUpO1xufTtcblF1ZXVlSXRlbS5wcm90b3R5cGUub3RoZXJDYWxsUmVqZWN0ZWQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdW53cmFwKHRoaXMucHJvbWlzZSwgdGhpcy5vblJlamVjdGVkLCB2YWx1ZSk7XG59O1xuXG5mdW5jdGlvbiB1bndyYXAocHJvbWlzZSwgZnVuYywgdmFsdWUpIHtcbiAgaW1tZWRpYXRlKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmV0dXJuVmFsdWU7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVyblZhbHVlID0gZnVuYyh2YWx1ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGhhbmRsZXJzLnJlamVjdChwcm9taXNlLCBlKTtcbiAgICB9XG4gICAgaWYgKHJldHVyblZhbHVlID09PSBwcm9taXNlKSB7XG4gICAgICBoYW5kbGVycy5yZWplY3QocHJvbWlzZSwgbmV3IFR5cGVFcnJvcignQ2Fubm90IHJlc29sdmUgcHJvbWlzZSB3aXRoIGl0c2VsZicpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGFuZGxlcnMucmVzb2x2ZShwcm9taXNlLCByZXR1cm5WYWx1ZSk7XG4gICAgfVxuICB9KTtcbn1cblxuaGFuZGxlcnMucmVzb2x2ZSA9IGZ1bmN0aW9uIChzZWxmLCB2YWx1ZSkge1xuICB2YXIgcmVzdWx0ID0gdHJ5Q2F0Y2goZ2V0VGhlbiwgdmFsdWUpO1xuICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ2Vycm9yJykge1xuICAgIHJldHVybiBoYW5kbGVycy5yZWplY3Qoc2VsZiwgcmVzdWx0LnZhbHVlKTtcbiAgfVxuICB2YXIgdGhlbmFibGUgPSByZXN1bHQudmFsdWU7XG5cbiAgaWYgKHRoZW5hYmxlKSB7XG4gICAgc2FmZWx5UmVzb2x2ZVRoZW5hYmxlKHNlbGYsIHRoZW5hYmxlKTtcbiAgfSBlbHNlIHtcbiAgICBzZWxmLnN0YXRlID0gRlVMRklMTEVEO1xuICAgIHNlbGYub3V0Y29tZSA9IHZhbHVlO1xuICAgIHZhciBpID0gLTE7XG4gICAgdmFyIGxlbiA9IHNlbGYucXVldWUubGVuZ3RoO1xuICAgIHdoaWxlICgrK2kgPCBsZW4pIHtcbiAgICAgIHNlbGYucXVldWVbaV0uY2FsbEZ1bGZpbGxlZCh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzZWxmO1xufTtcbmhhbmRsZXJzLnJlamVjdCA9IGZ1bmN0aW9uIChzZWxmLCBlcnJvcikge1xuICBzZWxmLnN0YXRlID0gUkVKRUNURUQ7XG4gIHNlbGYub3V0Y29tZSA9IGVycm9yO1xuICB2YXIgaSA9IC0xO1xuICB2YXIgbGVuID0gc2VsZi5xdWV1ZS5sZW5ndGg7XG4gIHdoaWxlICgrK2kgPCBsZW4pIHtcbiAgICBzZWxmLnF1ZXVlW2ldLmNhbGxSZWplY3RlZChlcnJvcik7XG4gIH1cbiAgcmV0dXJuIHNlbGY7XG59O1xuXG5mdW5jdGlvbiBnZXRUaGVuKG9iaikge1xuICAvLyBNYWtlIHN1cmUgd2Ugb25seSBhY2Nlc3MgdGhlIGFjY2Vzc29yIG9uY2UgYXMgcmVxdWlyZWQgYnkgdGhlIHNwZWNcbiAgdmFyIHRoZW4gPSBvYmogJiYgb2JqLnRoZW47XG4gIGlmIChvYmogJiYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnIHx8IHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpICYmIHR5cGVvZiB0aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGFwcHlUaGVuKCkge1xuICAgICAgdGhlbi5hcHBseShvYmosIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzYWZlbHlSZXNvbHZlVGhlbmFibGUoc2VsZiwgdGhlbmFibGUpIHtcbiAgLy8gRWl0aGVyIGZ1bGZpbGwsIHJlamVjdCBvciByZWplY3Qgd2l0aCBlcnJvclxuICB2YXIgY2FsbGVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIG9uRXJyb3IodmFsdWUpIHtcbiAgICBpZiAoY2FsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNhbGxlZCA9IHRydWU7XG4gICAgaGFuZGxlcnMucmVqZWN0KHNlbGYsIHZhbHVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uU3VjY2Vzcyh2YWx1ZSkge1xuICAgIGlmIChjYWxsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2FsbGVkID0gdHJ1ZTtcbiAgICBoYW5kbGVycy5yZXNvbHZlKHNlbGYsIHZhbHVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyeVRvVW53cmFwKCkge1xuICAgIHRoZW5hYmxlKG9uU3VjY2Vzcywgb25FcnJvcik7XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gdHJ5Q2F0Y2godHJ5VG9VbndyYXApO1xuICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ2Vycm9yJykge1xuICAgIG9uRXJyb3IocmVzdWx0LnZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0cnlDYXRjaChmdW5jLCB2YWx1ZSkge1xuICB2YXIgb3V0ID0ge307XG4gIHRyeSB7XG4gICAgb3V0LnZhbHVlID0gZnVuYyh2YWx1ZSk7XG4gICAgb3V0LnN0YXR1cyA9ICdzdWNjZXNzJztcbiAgfSBjYXRjaCAoZSkge1xuICAgIG91dC5zdGF0dXMgPSAnZXJyb3InO1xuICAgIG91dC52YWx1ZSA9IGU7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuUHJvbWlzZS5yZXNvbHZlID0gcmVzb2x2ZTtcbmZ1bmN0aW9uIHJlc29sdmUodmFsdWUpIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgdGhpcykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gaGFuZGxlcnMucmVzb2x2ZShuZXcgdGhpcyhJTlRFUk5BTCksIHZhbHVlKTtcbn1cblxuUHJvbWlzZS5yZWplY3QgPSByZWplY3Q7XG5mdW5jdGlvbiByZWplY3QocmVhc29uKSB7XG4gIHZhciBwcm9taXNlID0gbmV3IHRoaXMoSU5URVJOQUwpO1xuICByZXR1cm4gaGFuZGxlcnMucmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG59XG5cblByb21pc2UuYWxsID0gYWxsO1xuZnVuY3Rpb24gYWxsKGl0ZXJhYmxlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVyYWJsZSkgIT09ICdbb2JqZWN0IEFycmF5XScpIHtcbiAgICByZXR1cm4gdGhpcy5yZWplY3QobmV3IFR5cGVFcnJvcignbXVzdCBiZSBhbiBhcnJheScpKTtcbiAgfVxuXG4gIHZhciBsZW4gPSBpdGVyYWJsZS5sZW5ndGg7XG4gIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgaWYgKCFsZW4pIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlKFtdKTtcbiAgfVxuXG4gIHZhciB2YWx1ZXMgPSBuZXcgQXJyYXkobGVuKTtcbiAgdmFyIHJlc29sdmVkID0gMDtcbiAgdmFyIGkgPSAtMTtcbiAgdmFyIHByb21pc2UgPSBuZXcgdGhpcyhJTlRFUk5BTCk7XG5cbiAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgIGFsbFJlc29sdmVyKGl0ZXJhYmxlW2ldLCBpKTtcbiAgfVxuICByZXR1cm4gcHJvbWlzZTtcbiAgZnVuY3Rpb24gYWxsUmVzb2x2ZXIodmFsdWUsIGkpIHtcbiAgICBzZWxmLnJlc29sdmUodmFsdWUpLnRoZW4ocmVzb2x2ZUZyb21BbGwsIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgaWYgKCFjYWxsZWQpIHtcbiAgICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgaGFuZGxlcnMucmVqZWN0KHByb21pc2UsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBmdW5jdGlvbiByZXNvbHZlRnJvbUFsbChvdXRWYWx1ZSkge1xuICAgICAgdmFsdWVzW2ldID0gb3V0VmFsdWU7XG4gICAgICBpZiAoKytyZXNvbHZlZCA9PT0gbGVuICYmICFjYWxsZWQpIHtcbiAgICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgaGFuZGxlcnMucmVzb2x2ZShwcm9taXNlLCB2YWx1ZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5Qcm9taXNlLnJhY2UgPSByYWNlO1xuZnVuY3Rpb24gcmFjZShpdGVyYWJsZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlcmFibGUpICE9PSAnW29iamVjdCBBcnJheV0nKSB7XG4gICAgcmV0dXJuIHRoaXMucmVqZWN0KG5ldyBUeXBlRXJyb3IoJ211c3QgYmUgYW4gYXJyYXknKSk7XG4gIH1cblxuICB2YXIgbGVuID0gaXRlcmFibGUubGVuZ3RoO1xuICB2YXIgY2FsbGVkID0gZmFsc2U7XG4gIGlmICghbGVuKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZShbXSk7XG4gIH1cblxuICB2YXIgaSA9IC0xO1xuICB2YXIgcHJvbWlzZSA9IG5ldyB0aGlzKElOVEVSTkFMKTtcblxuICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgcmVzb2x2ZXIoaXRlcmFibGVbaV0pO1xuICB9XG4gIHJldHVybiBwcm9taXNlO1xuICBmdW5jdGlvbiByZXNvbHZlcih2YWx1ZSkge1xuICAgIHNlbGYucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIGlmICghY2FsbGVkKSB7XG4gICAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgICAgIGhhbmRsZXJzLnJlc29sdmUocHJvbWlzZSwgcmVzcG9uc2UpO1xuICAgICAgfVxuICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgaWYgKCFjYWxsZWQpIHtcbiAgICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgaGFuZGxlcnMucmVqZWN0KHByb21pc2UsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG59LHtcIjFcIjoxfV0sMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4oZnVuY3Rpb24gKGdsb2JhbCl7XG4ndXNlIHN0cmljdCc7XG5pZiAodHlwZW9mIGdsb2JhbC5Qcm9taXNlICE9PSAnZnVuY3Rpb24nKSB7XG4gIGdsb2JhbC5Qcm9taXNlID0gX2RlcmVxXygyKTtcbn1cblxufSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge30pXG59LHtcIjJcIjoyfV0sNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gZ2V0SURCKCkge1xuICAgIC8qIGdsb2JhbCBpbmRleGVkREIsd2Via2l0SW5kZXhlZERCLG1vekluZGV4ZWREQixPSW5kZXhlZERCLG1zSW5kZXhlZERCICovXG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbmRleGVkREIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5kZXhlZERCO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygd2Via2l0SW5kZXhlZERCICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHdlYmtpdEluZGV4ZWREQjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG1vekluZGV4ZWREQiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBtb3pJbmRleGVkREI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBPSW5kZXhlZERCICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIE9JbmRleGVkREI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBtc0luZGV4ZWREQiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBtc0luZGV4ZWREQjtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbn1cblxudmFyIGlkYiA9IGdldElEQigpO1xuXG5mdW5jdGlvbiBpc0luZGV4ZWREQlZhbGlkKCkge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIEluaXRpYWxpemUgSW5kZXhlZERCOyBmYWxsIGJhY2sgdG8gdmVuZG9yLXByZWZpeGVkIHZlcnNpb25zXG4gICAgICAgIC8vIGlmIG5lZWRlZC5cbiAgICAgICAgaWYgKCFpZGIgfHwgIWlkYi5vcGVuKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgbWltaWMgUG91Y2hEQiBoZXJlO1xuICAgICAgICAvL1xuICAgICAgICAvLyBXZSB0ZXN0IGZvciBvcGVuRGF0YWJhc2UgYmVjYXVzZSBJRSBNb2JpbGUgaWRlbnRpZmllcyBpdHNlbGZcbiAgICAgICAgLy8gYXMgU2FmYXJpLiBPaCB0aGUgbHVsei4uLlxuICAgICAgICB2YXIgaXNTYWZhcmkgPSB0eXBlb2Ygb3BlbkRhdGFiYXNlICE9PSAndW5kZWZpbmVkJyAmJiAvKFNhZmFyaXxpUGhvbmV8aVBhZHxpUG9kKS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAhL0Nocm9tZS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAhL0JsYWNrQmVycnkvLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKTtcblxuICAgICAgICB2YXIgaGFzRmV0Y2ggPSB0eXBlb2YgZmV0Y2ggPT09ICdmdW5jdGlvbicgJiYgZmV0Y2gudG9TdHJpbmcoKS5pbmRleE9mKCdbbmF0aXZlIGNvZGUnKSAhPT0gLTE7XG5cbiAgICAgICAgLy8gU2FmYXJpIDwxMC4xIGRvZXMgbm90IG1lZXQgb3VyIHJlcXVpcmVtZW50cyBmb3IgSURCIHN1cHBvcnRcbiAgICAgICAgLy8gKHNlZTogaHR0cHM6Ly9naXRodWIuY29tL3BvdWNoZGIvcG91Y2hkYi9pc3N1ZXMvNTU3MikuXG4gICAgICAgIC8vIFNhZmFyaSAxMC4xIHNoaXBwZWQgd2l0aCBmZXRjaCwgd2UgY2FuIHVzZSB0aGF0IHRvIGRldGVjdCBpdC5cbiAgICAgICAgLy8gTm90ZTogdGhpcyBjcmVhdGVzIGlzc3VlcyB3aXRoIGB3aW5kb3cuZmV0Y2hgIHBvbHlmaWxscyBhbmRcbiAgICAgICAgLy8gb3ZlcnJpZGVzOyBzZWU6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2NhbEZvcmFnZS9sb2NhbEZvcmFnZS9pc3N1ZXMvODU2XG4gICAgICAgIHJldHVybiAoIWlzU2FmYXJpIHx8IGhhc0ZldGNoKSAmJiB0eXBlb2YgaW5kZXhlZERCICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAvLyBzb21lIG91dGRhdGVkIGltcGxlbWVudGF0aW9ucyBvZiBJREIgdGhhdCBhcHBlYXIgb24gU2Ftc3VuZ1xuICAgICAgICAvLyBhbmQgSFRDIEFuZHJvaWQgZGV2aWNlcyA8NC40IGFyZSBtaXNzaW5nIElEQktleVJhbmdlXG4gICAgICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvbG9jYWxGb3JhZ2UvaXNzdWVzLzEyOFxuICAgICAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL2xvY2FsRm9yYWdlL2lzc3Vlcy8yNzJcbiAgICAgICAgdHlwZW9mIElEQktleVJhbmdlICE9PSAndW5kZWZpbmVkJztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbi8vIEFic3RyYWN0cyBjb25zdHJ1Y3RpbmcgYSBCbG9iIG9iamVjdCwgc28gaXQgYWxzbyB3b3JrcyBpbiBvbGRlclxuLy8gYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZSBuYXRpdmUgQmxvYiBjb25zdHJ1Y3Rvci4gKGkuZS5cbi8vIG9sZCBRdFdlYktpdCB2ZXJzaW9ucywgYXQgbGVhc3QpLlxuLy8gQWJzdHJhY3RzIGNvbnN0cnVjdGluZyBhIEJsb2Igb2JqZWN0LCBzbyBpdCBhbHNvIHdvcmtzIGluIG9sZGVyXG4vLyBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgdGhlIG5hdGl2ZSBCbG9iIGNvbnN0cnVjdG9yLiAoaS5lLlxuLy8gb2xkIFF0V2ViS2l0IHZlcnNpb25zLCBhdCBsZWFzdCkuXG5mdW5jdGlvbiBjcmVhdGVCbG9iKHBhcnRzLCBwcm9wZXJ0aWVzKSB7XG4gICAgLyogZ2xvYmFsIEJsb2JCdWlsZGVyLE1TQmxvYkJ1aWxkZXIsTW96QmxvYkJ1aWxkZXIsV2ViS2l0QmxvYkJ1aWxkZXIgKi9cbiAgICBwYXJ0cyA9IHBhcnRzIHx8IFtdO1xuICAgIHByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzIHx8IHt9O1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBuZXcgQmxvYihwYXJ0cywgcHJvcGVydGllcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZS5uYW1lICE9PSAnVHlwZUVycm9yJykge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgQnVpbGRlciA9IHR5cGVvZiBCbG9iQnVpbGRlciAhPT0gJ3VuZGVmaW5lZCcgPyBCbG9iQnVpbGRlciA6IHR5cGVvZiBNU0Jsb2JCdWlsZGVyICE9PSAndW5kZWZpbmVkJyA/IE1TQmxvYkJ1aWxkZXIgOiB0eXBlb2YgTW96QmxvYkJ1aWxkZXIgIT09ICd1bmRlZmluZWQnID8gTW96QmxvYkJ1aWxkZXIgOiBXZWJLaXRCbG9iQnVpbGRlcjtcbiAgICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgQnVpbGRlcigpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChwYXJ0c1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0QmxvYihwcm9wZXJ0aWVzLnR5cGUpO1xuICAgIH1cbn1cblxuLy8gVGhpcyBpcyBDb21tb25KUyBiZWNhdXNlIGxpZSBpcyBhbiBleHRlcm5hbCBkZXBlbmRlbmN5LCBzbyBSb2xsdXBcbi8vIGNhbiBqdXN0IGlnbm9yZSBpdC5cbmlmICh0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBJbiB0aGUgXCJub3Byb21pc2VzXCIgYnVpbGQgdGhpcyB3aWxsIGp1c3QgdGhyb3cgaWYgeW91IGRvbid0IGhhdmVcbiAgICAvLyBhIGdsb2JhbCBwcm9taXNlIG9iamVjdCwgYnV0IGl0IHdvdWxkIHRocm93IGFueXdheSBsYXRlci5cbiAgICBfZGVyZXFfKDMpO1xufVxudmFyIFByb21pc2UkMSA9IFByb21pc2U7XG5cbmZ1bmN0aW9uIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjaykge1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZXhlY3V0ZVR3b0NhbGxiYWNrcyhwcm9taXNlLCBjYWxsYmFjaywgZXJyb3JDYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcHJvbWlzZS50aGVuKGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGVycm9yQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcHJvbWlzZVtcImNhdGNoXCJdKGVycm9yQ2FsbGJhY2spO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplS2V5KGtleSkge1xuICAgIC8vIENhc3QgdGhlIGtleSB0byBhIHN0cmluZywgYXMgdGhhdCdzIGFsbCB3ZSBjYW4gc2V0IGFzIGEga2V5LlxuICAgIGlmICh0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zb2xlLndhcm4oa2V5ICsgJyB1c2VkIGFzIGEga2V5LCBidXQgaXQgaXMgbm90IGEgc3RyaW5nLicpO1xuICAgICAgICBrZXkgPSBTdHJpbmcoa2V5KTtcbiAgICB9XG5cbiAgICByZXR1cm4ga2V5O1xufVxuXG5mdW5jdGlvbiBnZXRDYWxsYmFjaygpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCAmJiB0eXBlb2YgYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTtcbiAgICB9XG59XG5cbi8vIFNvbWUgY29kZSBvcmlnaW5hbGx5IGZyb20gYXN5bmNfc3RvcmFnZS5qcyBpblxuLy8gW0dhaWFdKGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhLWIyZy9nYWlhKS5cblxudmFyIERFVEVDVF9CTE9CX1NVUFBPUlRfU1RPUkUgPSAnbG9jYWwtZm9yYWdlLWRldGVjdC1ibG9iLXN1cHBvcnQnO1xudmFyIHN1cHBvcnRzQmxvYnMgPSB2b2lkIDA7XG52YXIgZGJDb250ZXh0cyA9IHt9O1xudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLy8gVHJhbnNhY3Rpb24gTW9kZXNcbnZhciBSRUFEX09OTFkgPSAncmVhZG9ubHknO1xudmFyIFJFQURfV1JJVEUgPSAncmVhZHdyaXRlJztcblxuLy8gVHJhbnNmb3JtIGEgYmluYXJ5IHN0cmluZyB0byBhbiBhcnJheSBidWZmZXIsIGJlY2F1c2Ugb3RoZXJ3aXNlXG4vLyB3ZWlyZCBzdHVmZiBoYXBwZW5zIHdoZW4geW91IHRyeSB0byB3b3JrIHdpdGggdGhlIGJpbmFyeSBzdHJpbmcgZGlyZWN0bHkuXG4vLyBJdCBpcyBrbm93bi5cbi8vIEZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNDk2NzY0Ny8gKGNvbnRpbnVlcyBvbiBuZXh0IGxpbmUpXG4vLyBlbmNvZGUtZGVjb2RlLWltYWdlLXdpdGgtYmFzZTY0LWJyZWFrcy1pbWFnZSAoMjAxMy0wNC0yMSlcbmZ1bmN0aW9uIF9iaW5TdHJpbmdUb0FycmF5QnVmZmVyKGJpbikge1xuICAgIHZhciBsZW5ndGggPSBiaW4ubGVuZ3RoO1xuICAgIHZhciBidWYgPSBuZXcgQXJyYXlCdWZmZXIobGVuZ3RoKTtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFycltpXSA9IGJpbi5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gYnVmO1xufVxuXG4vL1xuLy8gQmxvYnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gYWxsIHZlcnNpb25zIG9mIEluZGV4ZWREQiwgbm90YWJseVxuLy8gQ2hyb21lIDwzNyBhbmQgQW5kcm9pZCA8NS4gSW4gdGhvc2UgdmVyc2lvbnMsIHN0b3JpbmcgYSBibG9iIHdpbGwgdGhyb3cuXG4vL1xuLy8gVmFyaW91cyBvdGhlciBibG9iIGJ1Z3MgZXhpc3QgaW4gQ2hyb21lIHYzNy00MiAoaW5jbHVzaXZlKS5cbi8vIERldGVjdGluZyB0aGVtIGlzIGV4cGVuc2l2ZSBhbmQgY29uZnVzaW5nIHRvIHVzZXJzLCBhbmQgQ2hyb21lIDM3LTQyXG4vLyBpcyBhdCB2ZXJ5IGxvdyB1c2FnZSB3b3JsZHdpZGUsIHNvIHdlIGRvIGEgaGFja3kgdXNlckFnZW50IGNoZWNrIGluc3RlYWQuXG4vL1xuLy8gY29udGVudC10eXBlIGJ1ZzogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQwODEyMFxuLy8gNDA0IGJ1ZzogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0NzkxNlxuLy8gRmlsZVJlYWRlciBidWc6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NDc4MzZcbi8vXG4vLyBDb2RlIGJvcnJvd2VkIGZyb20gUG91Y2hEQi4gU2VlOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3BvdWNoZGIvcG91Y2hkYi9ibG9iL21hc3Rlci9wYWNrYWdlcy9ub2RlX21vZHVsZXMvcG91Y2hkYi1hZGFwdGVyLWlkYi9zcmMvYmxvYlN1cHBvcnQuanNcbi8vXG5mdW5jdGlvbiBfY2hlY2tCbG9iU3VwcG9ydFdpdGhvdXRDYWNoaW5nKGlkYikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIHZhciB0eG4gPSBpZGIudHJhbnNhY3Rpb24oREVURUNUX0JMT0JfU1VQUE9SVF9TVE9SRSwgUkVBRF9XUklURSk7XG4gICAgICAgIHZhciBibG9iID0gY3JlYXRlQmxvYihbJyddKTtcbiAgICAgICAgdHhuLm9iamVjdFN0b3JlKERFVEVDVF9CTE9CX1NVUFBPUlRfU1RPUkUpLnB1dChibG9iLCAna2V5Jyk7XG5cbiAgICAgICAgdHhuLm9uYWJvcnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIHRyYW5zYWN0aW9uIGFib3J0cyBub3cgaXRzIGR1ZSB0byBub3QgYmVpbmcgYWJsZSB0b1xuICAgICAgICAgICAgLy8gd3JpdGUgdG8gdGhlIGRhdGFiYXNlLCBsaWtlbHkgZHVlIHRvIHRoZSBkaXNrIGJlaW5nIGZ1bGxcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfTtcblxuICAgICAgICB0eG4ub25jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBtYXRjaGVkQ2hyb21lID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQ2hyb21lXFwvKFxcZCspLyk7XG4gICAgICAgICAgICB2YXIgbWF0Y2hlZEVkZ2UgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9FZGdlXFwvLyk7XG4gICAgICAgICAgICAvLyBNUyBFZGdlIHByZXRlbmRzIHRvIGJlIENocm9tZSA0MjpcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaGg4NjkzMDElMjh2PXZzLjg1JTI5LmFzcHhcbiAgICAgICAgICAgIHJlc29sdmUobWF0Y2hlZEVkZ2UgfHwgIW1hdGNoZWRDaHJvbWUgfHwgcGFyc2VJbnQobWF0Y2hlZENocm9tZVsxXSwgMTApID49IDQzKTtcbiAgICAgICAgfTtcbiAgICB9KVtcImNhdGNoXCJdKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBlcnJvciwgc28gYXNzdW1lIHVuc3VwcG9ydGVkXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIF9jaGVja0Jsb2JTdXBwb3J0KGlkYikge1xuICAgIGlmICh0eXBlb2Ygc3VwcG9ydHNCbG9icyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlJDEucmVzb2x2ZShzdXBwb3J0c0Jsb2JzKTtcbiAgICB9XG4gICAgcmV0dXJuIF9jaGVja0Jsb2JTdXBwb3J0V2l0aG91dENhY2hpbmcoaWRiKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBzdXBwb3J0c0Jsb2JzID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBzdXBwb3J0c0Jsb2JzO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBfZGVmZXJSZWFkaW5lc3MoZGJJbmZvKSB7XG4gICAgdmFyIGRiQ29udGV4dCA9IGRiQ29udGV4dHNbZGJJbmZvLm5hbWVdO1xuXG4gICAgLy8gQ3JlYXRlIGEgZGVmZXJyZWQgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBkYXRhYmFzZSBvcGVyYXRpb24uXG4gICAgdmFyIGRlZmVycmVkT3BlcmF0aW9uID0ge307XG5cbiAgICBkZWZlcnJlZE9wZXJhdGlvbi5wcm9taXNlID0gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGRlZmVycmVkT3BlcmF0aW9uLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICBkZWZlcnJlZE9wZXJhdGlvbi5yZWplY3QgPSByZWplY3Q7XG4gICAgfSk7XG5cbiAgICAvLyBFbnF1ZXVlIHRoZSBkZWZlcnJlZCBvcGVyYXRpb24uXG4gICAgZGJDb250ZXh0LmRlZmVycmVkT3BlcmF0aW9ucy5wdXNoKGRlZmVycmVkT3BlcmF0aW9uKTtcblxuICAgIC8vIENoYWluIGl0cyBwcm9taXNlIHRvIHRoZSBkYXRhYmFzZSByZWFkaW5lc3MuXG4gICAgaWYgKCFkYkNvbnRleHQuZGJSZWFkeSkge1xuICAgICAgICBkYkNvbnRleHQuZGJSZWFkeSA9IGRlZmVycmVkT3BlcmF0aW9uLnByb21pc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZGJDb250ZXh0LmRiUmVhZHkgPSBkYkNvbnRleHQuZGJSZWFkeS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZE9wZXJhdGlvbi5wcm9taXNlO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIF9hZHZhbmNlUmVhZGluZXNzKGRiSW5mbykge1xuICAgIHZhciBkYkNvbnRleHQgPSBkYkNvbnRleHRzW2RiSW5mby5uYW1lXTtcblxuICAgIC8vIERlcXVldWUgYSBkZWZlcnJlZCBvcGVyYXRpb24uXG4gICAgdmFyIGRlZmVycmVkT3BlcmF0aW9uID0gZGJDb250ZXh0LmRlZmVycmVkT3BlcmF0aW9ucy5wb3AoKTtcblxuICAgIC8vIFJlc29sdmUgaXRzIHByb21pc2UgKHdoaWNoIGlzIHBhcnQgb2YgdGhlIGRhdGFiYXNlIHJlYWRpbmVzc1xuICAgIC8vIGNoYWluIG9mIHByb21pc2VzKS5cbiAgICBpZiAoZGVmZXJyZWRPcGVyYXRpb24pIHtcbiAgICAgICAgZGVmZXJyZWRPcGVyYXRpb24ucmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm4gZGVmZXJyZWRPcGVyYXRpb24ucHJvbWlzZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIF9yZWplY3RSZWFkaW5lc3MoZGJJbmZvLCBlcnIpIHtcbiAgICB2YXIgZGJDb250ZXh0ID0gZGJDb250ZXh0c1tkYkluZm8ubmFtZV07XG5cbiAgICAvLyBEZXF1ZXVlIGEgZGVmZXJyZWQgb3BlcmF0aW9uLlxuICAgIHZhciBkZWZlcnJlZE9wZXJhdGlvbiA9IGRiQ29udGV4dC5kZWZlcnJlZE9wZXJhdGlvbnMucG9wKCk7XG5cbiAgICAvLyBSZWplY3QgaXRzIHByb21pc2UgKHdoaWNoIGlzIHBhcnQgb2YgdGhlIGRhdGFiYXNlIHJlYWRpbmVzc1xuICAgIC8vIGNoYWluIG9mIHByb21pc2VzKS5cbiAgICBpZiAoZGVmZXJyZWRPcGVyYXRpb24pIHtcbiAgICAgICAgZGVmZXJyZWRPcGVyYXRpb24ucmVqZWN0KGVycik7XG4gICAgICAgIHJldHVybiBkZWZlcnJlZE9wZXJhdGlvbi5wcm9taXNlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gX2dldENvbm5lY3Rpb24oZGJJbmZvLCB1cGdyYWRlTmVlZGVkKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBkYkNvbnRleHRzW2RiSW5mby5uYW1lXSA9IGRiQ29udGV4dHNbZGJJbmZvLm5hbWVdIHx8IGNyZWF0ZURiQ29udGV4dCgpO1xuXG4gICAgICAgIGlmIChkYkluZm8uZGIpIHtcbiAgICAgICAgICAgIGlmICh1cGdyYWRlTmVlZGVkKSB7XG4gICAgICAgICAgICAgICAgX2RlZmVyUmVhZGluZXNzKGRiSW5mbyk7XG4gICAgICAgICAgICAgICAgZGJJbmZvLmRiLmNsb3NlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGRiSW5mby5kYik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGJBcmdzID0gW2RiSW5mby5uYW1lXTtcblxuICAgICAgICBpZiAodXBncmFkZU5lZWRlZCkge1xuICAgICAgICAgICAgZGJBcmdzLnB1c2goZGJJbmZvLnZlcnNpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG9wZW5yZXEgPSBpZGIub3Blbi5hcHBseShpZGIsIGRiQXJncyk7XG5cbiAgICAgICAgaWYgKHVwZ3JhZGVOZWVkZWQpIHtcbiAgICAgICAgICAgIG9wZW5yZXEub251cGdyYWRlbmVlZGVkID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGIgPSBvcGVucmVxLnJlc3VsdDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShkYkluZm8uc3RvcmVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUub2xkVmVyc2lvbiA8PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGRlZCB3aGVuIHN1cHBvcnQgZm9yIGJsb2Igc2hpbXMgd2FzIGFkZGVkXG4gICAgICAgICAgICAgICAgICAgICAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShERVRFQ1RfQkxPQl9TVVBQT1JUX1NUT1JFKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleC5uYW1lID09PSAnQ29uc3RyYWludEVycm9yJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdUaGUgZGF0YWJhc2UgXCInICsgZGJJbmZvLm5hbWUgKyAnXCInICsgJyBoYXMgYmVlbiB1cGdyYWRlZCBmcm9tIHZlcnNpb24gJyArIGUub2xkVmVyc2lvbiArICcgdG8gdmVyc2lvbiAnICsgZS5uZXdWZXJzaW9uICsgJywgYnV0IHRoZSBzdG9yYWdlIFwiJyArIGRiSW5mby5zdG9yZU5hbWUgKyAnXCIgYWxyZWFkeSBleGlzdHMuJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBvcGVucmVxLm9uZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmVqZWN0KG9wZW5yZXEuZXJyb3IpO1xuICAgICAgICB9O1xuXG4gICAgICAgIG9wZW5yZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGRiID0gb3BlbnJlcS5yZXN1bHQ7XG4gICAgICAgICAgICBkYi5vbnZlcnNpb25jaGFuZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIC8vIFRyaWdnZXJlZCB3aGVuIHRoZSBkYXRhYmFzZSBpcyBtb2RpZmllZCAoZS5nLiBhZGRpbmcgYW4gb2JqZWN0U3RvcmUpIG9yXG4gICAgICAgICAgICAgICAgLy8gZGVsZXRlZCAoZXZlbiB3aGVuIGluaXRpYXRlZCBieSBvdGhlciBzZXNzaW9ucyBpbiBkaWZmZXJlbnQgdGFicykuXG4gICAgICAgICAgICAgICAgLy8gQ2xvc2luZyB0aGUgY29ubmVjdGlvbiBoZXJlIHByZXZlbnRzIHRob3NlIG9wZXJhdGlvbnMgZnJvbSBiZWluZyBibG9ja2VkLlxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBkYXRhYmFzZSBpcyBhY2Nlc3NlZCBhZ2FpbiBsYXRlciBieSB0aGlzIGluc3RhbmNlLCB0aGUgY29ubmVjdGlvblxuICAgICAgICAgICAgICAgIC8vIHdpbGwgYmUgcmVvcGVuZWQgb3IgdGhlIGRhdGFiYXNlIHJlY3JlYXRlZCBhcyBuZWVkZWQuXG4gICAgICAgICAgICAgICAgZS50YXJnZXQuY2xvc2UoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXNvbHZlKGRiKTtcbiAgICAgICAgICAgIF9hZHZhbmNlUmVhZGluZXNzKGRiSW5mbyk7XG4gICAgICAgIH07XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIF9nZXRPcmlnaW5hbENvbm5lY3Rpb24oZGJJbmZvKSB7XG4gICAgcmV0dXJuIF9nZXRDb25uZWN0aW9uKGRiSW5mbywgZmFsc2UpO1xufVxuXG5mdW5jdGlvbiBfZ2V0VXBncmFkZWRDb25uZWN0aW9uKGRiSW5mbykge1xuICAgIHJldHVybiBfZ2V0Q29ubmVjdGlvbihkYkluZm8sIHRydWUpO1xufVxuXG5mdW5jdGlvbiBfaXNVcGdyYWRlTmVlZGVkKGRiSW5mbywgZGVmYXVsdFZlcnNpb24pIHtcbiAgICBpZiAoIWRiSW5mby5kYikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgaXNOZXdTdG9yZSA9ICFkYkluZm8uZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhkYkluZm8uc3RvcmVOYW1lKTtcbiAgICB2YXIgaXNEb3duZ3JhZGUgPSBkYkluZm8udmVyc2lvbiA8IGRiSW5mby5kYi52ZXJzaW9uO1xuICAgIHZhciBpc1VwZ3JhZGUgPSBkYkluZm8udmVyc2lvbiA+IGRiSW5mby5kYi52ZXJzaW9uO1xuXG4gICAgaWYgKGlzRG93bmdyYWRlKSB7XG4gICAgICAgIC8vIElmIHRoZSB2ZXJzaW9uIGlzIG5vdCB0aGUgZGVmYXVsdCBvbmVcbiAgICAgICAgLy8gdGhlbiB3YXJuIGZvciBpbXBvc3NpYmxlIGRvd25ncmFkZS5cbiAgICAgICAgaWYgKGRiSW5mby52ZXJzaW9uICE9PSBkZWZhdWx0VmVyc2lvbikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdUaGUgZGF0YWJhc2UgXCInICsgZGJJbmZvLm5hbWUgKyAnXCInICsgXCIgY2FuJ3QgYmUgZG93bmdyYWRlZCBmcm9tIHZlcnNpb24gXCIgKyBkYkluZm8uZGIudmVyc2lvbiArICcgdG8gdmVyc2lvbiAnICsgZGJJbmZvLnZlcnNpb24gKyAnLicpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFsaWduIHRoZSB2ZXJzaW9ucyB0byBwcmV2ZW50IGVycm9ycy5cbiAgICAgICAgZGJJbmZvLnZlcnNpb24gPSBkYkluZm8uZGIudmVyc2lvbjtcbiAgICB9XG5cbiAgICBpZiAoaXNVcGdyYWRlIHx8IGlzTmV3U3RvcmUpIHtcbiAgICAgICAgLy8gSWYgdGhlIHN0b3JlIGlzIG5ldyB0aGVuIGluY3JlbWVudCB0aGUgdmVyc2lvbiAoaWYgbmVlZGVkKS5cbiAgICAgICAgLy8gVGhpcyB3aWxsIHRyaWdnZXIgYW4gXCJ1cGdyYWRlbmVlZGVkXCIgZXZlbnQgd2hpY2ggaXMgcmVxdWlyZWRcbiAgICAgICAgLy8gZm9yIGNyZWF0aW5nIGEgc3RvcmUuXG4gICAgICAgIGlmIChpc05ld1N0b3JlKSB7XG4gICAgICAgICAgICB2YXIgaW5jVmVyc2lvbiA9IGRiSW5mby5kYi52ZXJzaW9uICsgMTtcbiAgICAgICAgICAgIGlmIChpbmNWZXJzaW9uID4gZGJJbmZvLnZlcnNpb24pIHtcbiAgICAgICAgICAgICAgICBkYkluZm8udmVyc2lvbiA9IGluY1ZlcnNpb247XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIGVuY29kZSBhIGJsb2IgZm9yIGluZGV4ZWRkYiBlbmdpbmVzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBibG9ic1xuZnVuY3Rpb24gX2VuY29kZUJsb2IoYmxvYikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgIHJlYWRlci5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgICByZWFkZXIub25sb2FkZW5kID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHZhciBiYXNlNjQgPSBidG9hKGUudGFyZ2V0LnJlc3VsdCB8fCAnJyk7XG4gICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICBfX2xvY2FsX2ZvcmFnZV9lbmNvZGVkX2Jsb2I6IHRydWUsXG4gICAgICAgICAgICAgICAgZGF0YTogYmFzZTY0LFxuICAgICAgICAgICAgICAgIHR5cGU6IGJsb2IudHlwZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHJlYWRlci5yZWFkQXNCaW5hcnlTdHJpbmcoYmxvYik7XG4gICAgfSk7XG59XG5cbi8vIGRlY29kZSBhbiBlbmNvZGVkIGJsb2JcbmZ1bmN0aW9uIF9kZWNvZGVCbG9iKGVuY29kZWRCbG9iKSB7XG4gICAgdmFyIGFycmF5QnVmZiA9IF9iaW5TdHJpbmdUb0FycmF5QnVmZmVyKGF0b2IoZW5jb2RlZEJsb2IuZGF0YSkpO1xuICAgIHJldHVybiBjcmVhdGVCbG9iKFthcnJheUJ1ZmZdLCB7IHR5cGU6IGVuY29kZWRCbG9iLnR5cGUgfSk7XG59XG5cbi8vIGlzIHRoaXMgb25lIG9mIG91ciBmYW5jeSBlbmNvZGVkIGJsb2JzP1xuZnVuY3Rpb24gX2lzRW5jb2RlZEJsb2IodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgdmFsdWUuX19sb2NhbF9mb3JhZ2VfZW5jb2RlZF9ibG9iO1xufVxuXG4vLyBTcGVjaWFsaXplIHRoZSBkZWZhdWx0IGByZWFkeSgpYCBmdW5jdGlvbiBieSBtYWtpbmcgaXQgZGVwZW5kZW50XG4vLyBvbiB0aGUgY3VycmVudCBkYXRhYmFzZSBvcGVyYXRpb25zLiBUaHVzLCB0aGUgZHJpdmVyIHdpbGwgYmUgYWN0dWFsbHlcbi8vIHJlYWR5IHdoZW4gaXQncyBiZWVuIGluaXRpYWxpemVkIChkZWZhdWx0KSAqYW5kKiB0aGVyZSBhcmUgbm8gcGVuZGluZ1xuLy8gb3BlcmF0aW9ucyBvbiB0aGUgZGF0YWJhc2UgKGluaXRpYXRlZCBieSBzb21lIG90aGVyIGluc3RhbmNlcykuXG5mdW5jdGlvbiBfZnVsbHlSZWFkeShjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHZhciBwcm9taXNlID0gc2VsZi5faW5pdFJlYWR5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkYkNvbnRleHQgPSBkYkNvbnRleHRzW3NlbGYuX2RiSW5mby5uYW1lXTtcblxuICAgICAgICBpZiAoZGJDb250ZXh0ICYmIGRiQ29udGV4dC5kYlJlYWR5KSB7XG4gICAgICAgICAgICByZXR1cm4gZGJDb250ZXh0LmRiUmVhZHk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGV4ZWN1dGVUd29DYWxsYmFja3MocHJvbWlzZSwgY2FsbGJhY2ssIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cblxuLy8gVHJ5IHRvIGVzdGFibGlzaCBhIG5ldyBkYiBjb25uZWN0aW9uIHRvIHJlcGxhY2UgdGhlXG4vLyBjdXJyZW50IG9uZSB3aGljaCBpcyBicm9rZW4gKGkuZS4gZXhwZXJpZW5jaW5nXG4vLyBJbnZhbGlkU3RhdGVFcnJvciB3aGlsZSBjcmVhdGluZyBhIHRyYW5zYWN0aW9uKS5cbmZ1bmN0aW9uIF90cnlSZWNvbm5lY3QoZGJJbmZvKSB7XG4gICAgX2RlZmVyUmVhZGluZXNzKGRiSW5mbyk7XG5cbiAgICB2YXIgZGJDb250ZXh0ID0gZGJDb250ZXh0c1tkYkluZm8ubmFtZV07XG4gICAgdmFyIGZvcmFnZXMgPSBkYkNvbnRleHQuZm9yYWdlcztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm9yYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZm9yYWdlID0gZm9yYWdlc1tpXTtcbiAgICAgICAgaWYgKGZvcmFnZS5fZGJJbmZvLmRiKSB7XG4gICAgICAgICAgICBmb3JhZ2UuX2RiSW5mby5kYi5jbG9zZSgpO1xuICAgICAgICAgICAgZm9yYWdlLl9kYkluZm8uZGIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRiSW5mby5kYiA9IG51bGw7XG5cbiAgICByZXR1cm4gX2dldE9yaWdpbmFsQ29ubmVjdGlvbihkYkluZm8pLnRoZW4oZnVuY3Rpb24gKGRiKSB7XG4gICAgICAgIGRiSW5mby5kYiA9IGRiO1xuICAgICAgICBpZiAoX2lzVXBncmFkZU5lZWRlZChkYkluZm8pKSB7XG4gICAgICAgICAgICAvLyBSZW9wZW4gdGhlIGRhdGFiYXNlIGZvciB1cGdyYWRpbmcuXG4gICAgICAgICAgICByZXR1cm4gX2dldFVwZ3JhZGVkQ29ubmVjdGlvbihkYkluZm8pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYjtcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChkYikge1xuICAgICAgICAvLyBzdG9yZSB0aGUgbGF0ZXN0IGRiIHJlZmVyZW5jZVxuICAgICAgICAvLyBpbiBjYXNlIHRoZSBkYiB3YXMgdXBncmFkZWRcbiAgICAgICAgZGJJbmZvLmRiID0gZGJDb250ZXh0LmRiID0gZGI7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm9yYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yYWdlc1tpXS5fZGJJbmZvLmRiID0gZGI7XG4gICAgICAgIH1cbiAgICB9KVtcImNhdGNoXCJdKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgX3JlamVjdFJlYWRpbmVzcyhkYkluZm8sIGVycik7XG4gICAgICAgIHRocm93IGVycjtcbiAgICB9KTtcbn1cblxuLy8gRkYgZG9lc24ndCBsaWtlIFByb21pc2VzIChtaWNyby10YXNrcykgYW5kIElEREIgc3RvcmUgb3BlcmF0aW9ucyxcbi8vIHNvIHdlIGhhdmUgdG8gZG8gaXQgd2l0aCBjYWxsYmFja3NcbmZ1bmN0aW9uIGNyZWF0ZVRyYW5zYWN0aW9uKGRiSW5mbywgbW9kZSwgY2FsbGJhY2ssIHJldHJpZXMpIHtcbiAgICBpZiAocmV0cmllcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHJpZXMgPSAxO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIHZhciB0eCA9IGRiSW5mby5kYi50cmFuc2FjdGlvbihkYkluZm8uc3RvcmVOYW1lLCBtb2RlKTtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgdHgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAocmV0cmllcyA+IDAgJiYgKCFkYkluZm8uZGIgfHwgZXJyLm5hbWUgPT09ICdJbnZhbGlkU3RhdGVFcnJvcicgfHwgZXJyLm5hbWUgPT09ICdOb3RGb3VuZEVycm9yJykpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlJDEucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghZGJJbmZvLmRiIHx8IGVyci5uYW1lID09PSAnTm90Rm91bmRFcnJvcicgJiYgIWRiSW5mby5kYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKGRiSW5mby5zdG9yZU5hbWUpICYmIGRiSW5mby52ZXJzaW9uIDw9IGRiSW5mby5kYi52ZXJzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGluY3JlYXNlIHRoZSBkYiB2ZXJzaW9uLCB0byBjcmVhdGUgdGhlIG5ldyBPYmplY3RTdG9yZVxuICAgICAgICAgICAgICAgICAgICBpZiAoZGJJbmZvLmRiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYkluZm8udmVyc2lvbiA9IGRiSW5mby5kYi52ZXJzaW9uICsgMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBSZW9wZW4gdGhlIGRhdGFiYXNlIGZvciB1cGdyYWRpbmcuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfZ2V0VXBncmFkZWRDb25uZWN0aW9uKGRiSW5mbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90cnlSZWNvbm5lY3QoZGJJbmZvKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlVHJhbnNhY3Rpb24oZGJJbmZvLCBtb2RlLCBjYWxsYmFjaywgcmV0cmllcyAtIDEpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlbXCJjYXRjaFwiXShjYWxsYmFjayk7XG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRGJDb250ZXh0KCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIC8vIFJ1bm5pbmcgbG9jYWxGb3JhZ2VzIHNoYXJpbmcgYSBkYXRhYmFzZS5cbiAgICAgICAgZm9yYWdlczogW10sXG4gICAgICAgIC8vIFNoYXJlZCBkYXRhYmFzZS5cbiAgICAgICAgZGI6IG51bGwsXG4gICAgICAgIC8vIERhdGFiYXNlIHJlYWRpbmVzcyAocHJvbWlzZSkuXG4gICAgICAgIGRiUmVhZHk6IG51bGwsXG4gICAgICAgIC8vIERlZmVycmVkIG9wZXJhdGlvbnMgb24gdGhlIGRhdGFiYXNlLlxuICAgICAgICBkZWZlcnJlZE9wZXJhdGlvbnM6IFtdXG4gICAgfTtcbn1cblxuLy8gT3BlbiB0aGUgSW5kZXhlZERCIGRhdGFiYXNlIChhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgb25lIGlmIG9uZSBkaWRuJ3Rcbi8vIHByZXZpb3VzbHkgZXhpc3QpLCB1c2luZyBhbnkgb3B0aW9ucyBzZXQgaW4gdGhlIGNvbmZpZy5cbmZ1bmN0aW9uIF9pbml0U3RvcmFnZShvcHRpb25zKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBkYkluZm8gPSB7XG4gICAgICAgIGRiOiBudWxsXG4gICAgfTtcblxuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgIGZvciAodmFyIGkgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgZGJJbmZvW2ldID0gb3B0aW9uc1tpXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdldCB0aGUgY3VycmVudCBjb250ZXh0IG9mIHRoZSBkYXRhYmFzZTtcbiAgICB2YXIgZGJDb250ZXh0ID0gZGJDb250ZXh0c1tkYkluZm8ubmFtZV07XG5cbiAgICAvLyAuLi5vciBjcmVhdGUgYSBuZXcgY29udGV4dC5cbiAgICBpZiAoIWRiQ29udGV4dCkge1xuICAgICAgICBkYkNvbnRleHQgPSBjcmVhdGVEYkNvbnRleHQoKTtcbiAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIG5ldyBjb250ZXh0IGluIHRoZSBnbG9iYWwgY29udGFpbmVyLlxuICAgICAgICBkYkNvbnRleHRzW2RiSW5mby5uYW1lXSA9IGRiQ29udGV4dDtcbiAgICB9XG5cbiAgICAvLyBSZWdpc3RlciBpdHNlbGYgYXMgYSBydW5uaW5nIGxvY2FsRm9yYWdlIGluIHRoZSBjdXJyZW50IGNvbnRleHQuXG4gICAgZGJDb250ZXh0LmZvcmFnZXMucHVzaChzZWxmKTtcblxuICAgIC8vIFJlcGxhY2UgdGhlIGRlZmF1bHQgYHJlYWR5KClgIGZ1bmN0aW9uIHdpdGggdGhlIHNwZWNpYWxpemVkIG9uZS5cbiAgICBpZiAoIXNlbGYuX2luaXRSZWFkeSkge1xuICAgICAgICBzZWxmLl9pbml0UmVhZHkgPSBzZWxmLnJlYWR5O1xuICAgICAgICBzZWxmLnJlYWR5ID0gX2Z1bGx5UmVhZHk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGFuIGFycmF5IG9mIGluaXRpYWxpemF0aW9uIHN0YXRlcyBvZiB0aGUgcmVsYXRlZCBsb2NhbEZvcmFnZXMuXG4gICAgdmFyIGluaXRQcm9taXNlcyA9IFtdO1xuXG4gICAgZnVuY3Rpb24gaWdub3JlRXJyb3JzKCkge1xuICAgICAgICAvLyBEb24ndCBoYW5kbGUgZXJyb3JzIGhlcmUsXG4gICAgICAgIC8vIGp1c3QgbWFrZXMgc3VyZSByZWxhdGVkIGxvY2FsRm9yYWdlcyBhcmVuJ3QgcGVuZGluZy5cbiAgICAgICAgcmV0dXJuIFByb21pc2UkMS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBkYkNvbnRleHQuZm9yYWdlcy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgZm9yYWdlID0gZGJDb250ZXh0LmZvcmFnZXNbal07XG4gICAgICAgIGlmIChmb3JhZ2UgIT09IHNlbGYpIHtcbiAgICAgICAgICAgIC8vIERvbid0IHdhaXQgZm9yIGl0c2VsZi4uLlxuICAgICAgICAgICAgaW5pdFByb21pc2VzLnB1c2goZm9yYWdlLl9pbml0UmVhZHkoKVtcImNhdGNoXCJdKGlnbm9yZUVycm9ycykpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGFrZSBhIHNuYXBzaG90IG9mIHRoZSByZWxhdGVkIGxvY2FsRm9yYWdlcy5cbiAgICB2YXIgZm9yYWdlcyA9IGRiQ29udGV4dC5mb3JhZ2VzLnNsaWNlKDApO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgY29ubmVjdGlvbiBwcm9jZXNzIG9ubHkgd2hlblxuICAgIC8vIGFsbCB0aGUgcmVsYXRlZCBsb2NhbEZvcmFnZXMgYXJlbid0IHBlbmRpbmcuXG4gICAgcmV0dXJuIFByb21pc2UkMS5hbGwoaW5pdFByb21pc2VzKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGJJbmZvLmRiID0gZGJDb250ZXh0LmRiO1xuICAgICAgICAvLyBHZXQgdGhlIGNvbm5lY3Rpb24gb3Igb3BlbiBhIG5ldyBvbmUgd2l0aG91dCB1cGdyYWRlLlxuICAgICAgICByZXR1cm4gX2dldE9yaWdpbmFsQ29ubmVjdGlvbihkYkluZm8pO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKGRiKSB7XG4gICAgICAgIGRiSW5mby5kYiA9IGRiO1xuICAgICAgICBpZiAoX2lzVXBncmFkZU5lZWRlZChkYkluZm8sIHNlbGYuX2RlZmF1bHRDb25maWcudmVyc2lvbikpIHtcbiAgICAgICAgICAgIC8vIFJlb3BlbiB0aGUgZGF0YWJhc2UgZm9yIHVwZ3JhZGluZy5cbiAgICAgICAgICAgIHJldHVybiBfZ2V0VXBncmFkZWRDb25uZWN0aW9uKGRiSW5mbyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRiO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKGRiKSB7XG4gICAgICAgIGRiSW5mby5kYiA9IGRiQ29udGV4dC5kYiA9IGRiO1xuICAgICAgICBzZWxmLl9kYkluZm8gPSBkYkluZm87XG4gICAgICAgIC8vIFNoYXJlIHRoZSBmaW5hbCBjb25uZWN0aW9uIGFtb25nc3QgcmVsYXRlZCBsb2NhbEZvcmFnZXMuXG4gICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgZm9yYWdlcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgdmFyIGZvcmFnZSA9IGZvcmFnZXNba107XG4gICAgICAgICAgICBpZiAoZm9yYWdlICE9PSBzZWxmKSB7XG4gICAgICAgICAgICAgICAgLy8gU2VsZiBpcyBhbHJlYWR5IHVwLXRvLWRhdGUuXG4gICAgICAgICAgICAgICAgZm9yYWdlLl9kYkluZm8uZGIgPSBkYkluZm8uZGI7XG4gICAgICAgICAgICAgICAgZm9yYWdlLl9kYkluZm8udmVyc2lvbiA9IGRiSW5mby52ZXJzaW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldEl0ZW0oa2V5LCBjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGtleSA9IG5vcm1hbGl6ZUtleShrZXkpO1xuXG4gICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgc2VsZi5yZWFkeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY3JlYXRlVHJhbnNhY3Rpb24oc2VsZi5fZGJJbmZvLCBSRUFEX09OTFksIGZ1bmN0aW9uIChlcnIsIHRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc2VsZi5fZGJJbmZvLnN0b3JlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXEgPSBzdG9yZS5nZXQoa2V5KTtcblxuICAgICAgICAgICAgICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gcmVxLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9pc0VuY29kZWRCbG9iKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gX2RlY29kZUJsb2IodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgcmVxLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QocmVxLmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlbXCJjYXRjaFwiXShyZWplY3QpO1xuICAgIH0pO1xuXG4gICAgZXhlY3V0ZUNhbGxiYWNrKHByb21pc2UsIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cblxuLy8gSXRlcmF0ZSBvdmVyIGFsbCBpdGVtcyBzdG9yZWQgaW4gZGF0YWJhc2UuXG5mdW5jdGlvbiBpdGVyYXRlKGl0ZXJhdG9yLCBjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHNlbGYucmVhZHkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNyZWF0ZVRyYW5zYWN0aW9uKHNlbGYuX2RiSW5mbywgUkVBRF9PTkxZLCBmdW5jdGlvbiAoZXJyLCB0cmFuc2FjdGlvbikge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHNlbGYuX2RiSW5mby5zdG9yZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVxID0gc3RvcmUub3BlbkN1cnNvcigpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlcmF0aW9uTnVtYmVyID0gMTtcblxuICAgICAgICAgICAgICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnNvciA9IHJlcS5yZXN1bHQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBjdXJzb3IudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9pc0VuY29kZWRCbG9iKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF9kZWNvZGVCbG9iKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGl0ZXJhdG9yKHZhbHVlLCBjdXJzb3Iua2V5LCBpdGVyYXRpb25OdW1iZXIrKyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBpdGVyYXRvciBjYWxsYmFjayByZXR1cm5zIGFueVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChub24tYHVuZGVmaW5lZGApIHZhbHVlLCB0aGVuIHdlIHN0b3BcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaXRlcmF0aW9uIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3JbXCJjb250aW51ZVwiXSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIHJlcS5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlcS5lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pW1wiY2F0Y2hcIl0ocmVqZWN0KTtcbiAgICB9KTtcblxuICAgIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayk7XG5cbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gc2V0SXRlbShrZXksIHZhbHVlLCBjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGtleSA9IG5vcm1hbGl6ZUtleShrZXkpO1xuXG4gICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIGRiSW5mbztcbiAgICAgICAgc2VsZi5yZWFkeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZGJJbmZvID0gc2VsZi5fZGJJbmZvO1xuICAgICAgICAgICAgaWYgKHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBCbG9iXScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NoZWNrQmxvYlN1cHBvcnQoZGJJbmZvLmRiKS50aGVuKGZ1bmN0aW9uIChibG9iU3VwcG9ydCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmxvYlN1cHBvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2VuY29kZUJsb2IodmFsdWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgY3JlYXRlVHJhbnNhY3Rpb24oc2VsZi5fZGJJbmZvLCBSRUFEX1dSSVRFLCBmdW5jdGlvbiAoZXJyLCB0cmFuc2FjdGlvbikge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHNlbGYuX2RiSW5mby5zdG9yZU5hbWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZWFzb24gd2UgZG9uJ3QgX3NhdmVfIG51bGwgaXMgYmVjYXVzZSBJRSAxMCBkb2VzXG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdCBzdXBwb3J0IHNhdmluZyB0aGUgYG51bGxgIHR5cGUgaW4gSW5kZXhlZERCLiBIb3dcbiAgICAgICAgICAgICAgICAgICAgLy8gaXJvbmljLCBnaXZlbiB0aGUgYnVnIGJlbG93IVxuICAgICAgICAgICAgICAgICAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL2xvY2FsRm9yYWdlL2lzc3Vlcy8xNjFcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXEgPSBzdG9yZS5wdXQodmFsdWUsIGtleSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhc3QgdG8gdW5kZWZpbmVkIHNvIHRoZSB2YWx1ZSBwYXNzZWQgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrL3Byb21pc2UgaXMgdGhlIHNhbWUgYXMgd2hhdCBvbmUgd291bGQgZ2V0IG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgYGdldEl0ZW0oKWAgbGF0ZXIuIFRoaXMgbGVhZHMgdG8gc29tZSB3ZWlyZG5lc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIChzZXRJdGVtKCdmb28nLCB1bmRlZmluZWQpIHdpbGwgcmV0dXJuIGBudWxsYCksIGJ1dFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBub3QgbXkgZmF1bHQgbG9jYWxTdG9yYWdlIGlzIG91ciBiYXNlbGluZSBhbmQgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQncyB3ZWlyZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24ub25hYm9ydCA9IHRyYW5zYWN0aW9uLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gcmVxLmVycm9yID8gcmVxLmVycm9yIDogcmVxLnRyYW5zYWN0aW9uLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pW1wiY2F0Y2hcIl0ocmVqZWN0KTtcbiAgICB9KTtcblxuICAgIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUl0ZW0oa2V5LCBjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGtleSA9IG5vcm1hbGl6ZUtleShrZXkpO1xuXG4gICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgc2VsZi5yZWFkeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY3JlYXRlVHJhbnNhY3Rpb24oc2VsZi5fZGJJbmZvLCBSRUFEX1dSSVRFLCBmdW5jdGlvbiAoZXJyLCB0cmFuc2FjdGlvbikge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHNlbGYuX2RiSW5mby5zdG9yZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSB1c2UgYSBHcnVudCB0YXNrIHRvIG1ha2UgdGhpcyBzYWZlIGZvciBJRSBhbmQgc29tZVxuICAgICAgICAgICAgICAgICAgICAvLyB2ZXJzaW9ucyBvZiBBbmRyb2lkIChpbmNsdWRpbmcgdGhvc2UgdXNlZCBieSBDb3Jkb3ZhKS5cbiAgICAgICAgICAgICAgICAgICAgLy8gTm9ybWFsbHkgSUUgd29uJ3QgbGlrZSBgLmRlbGV0ZSgpYCBhbmQgd2lsbCBpbnNpc3Qgb25cbiAgICAgICAgICAgICAgICAgICAgLy8gdXNpbmcgYFsnZGVsZXRlJ10oKWAsIGJ1dCB3ZSBoYXZlIGEgYnVpbGQgc3RlcCB0aGF0XG4gICAgICAgICAgICAgICAgICAgIC8vIGZpeGVzIHRoaXMgZm9yIHVzIG5vdy5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcSA9IHN0b3JlW1wiZGVsZXRlXCJdKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24ub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChyZXEuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IHdpbGwgYmUgYWxzbyBiZSBhYm9ydGVkIGlmIHdlJ3ZlIGV4Y2VlZGVkIG91ciBzdG9yYWdlXG4gICAgICAgICAgICAgICAgICAgIC8vIHNwYWNlLlxuICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbi5vbmFib3J0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IHJlcS5lcnJvciA/IHJlcS5lcnJvciA6IHJlcS50cmFuc2FjdGlvbi5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVtcImNhdGNoXCJdKHJlamVjdCk7XG4gICAgfSk7XG5cbiAgICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuXG5mdW5jdGlvbiBjbGVhcihjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHNlbGYucmVhZHkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNyZWF0ZVRyYW5zYWN0aW9uKHNlbGYuX2RiSW5mbywgUkVBRF9XUklURSwgZnVuY3Rpb24gKGVyciwgdHJhbnNhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzZWxmLl9kYkluZm8uc3RvcmVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcSA9IHN0b3JlLmNsZWFyKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbi5vbmFib3J0ID0gdHJhbnNhY3Rpb24ub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcnIgPSByZXEuZXJyb3IgPyByZXEuZXJyb3IgOiByZXEudHJhbnNhY3Rpb24uZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlbXCJjYXRjaFwiXShyZWplY3QpO1xuICAgIH0pO1xuXG4gICAgZXhlY3V0ZUNhbGxiYWNrKHByb21pc2UsIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gbGVuZ3RoKGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgc2VsZi5yZWFkeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY3JlYXRlVHJhbnNhY3Rpb24oc2VsZi5fZGJJbmZvLCBSRUFEX09OTFksIGZ1bmN0aW9uIChlcnIsIHRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc2VsZi5fZGJJbmZvLnN0b3JlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXEgPSBzdG9yZS5jb3VudCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcS5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIHJlcS5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlcS5lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pW1wiY2F0Y2hcIl0ocmVqZWN0KTtcbiAgICB9KTtcblxuICAgIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5cbmZ1bmN0aW9uIGtleShuLCBjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGlmIChuIDwgMCkge1xuICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VsZi5yZWFkeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY3JlYXRlVHJhbnNhY3Rpb24oc2VsZi5fZGJJbmZvLCBSRUFEX09OTFksIGZ1bmN0aW9uIChlcnIsIHRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc2VsZi5fZGJJbmZvLnN0b3JlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhZHZhbmNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVxID0gc3RvcmUub3BlbktleUN1cnNvcigpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3Vyc29yID0gcmVxLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBtZWFucyB0aGVyZSB3ZXJlbid0IGVub3VnaCBrZXlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRoZSBmaXJzdCBrZXksIHJldHVybiBpdCBpZiB0aGF0J3Mgd2hhdCB0aGV5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FudGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY3Vyc29yLmtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWR2YW5jZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBhc2sgdGhlIGN1cnNvciB0byBza2lwIGFoZWFkIG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3Jkcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3IuYWR2YW5jZShuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHdlIGdldCBoZXJlLCB3ZSd2ZSBnb3QgdGhlIG50aCBrZXkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY3Vyc29yLmtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIHJlcS5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlcS5lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pW1wiY2F0Y2hcIl0ocmVqZWN0KTtcbiAgICB9KTtcblxuICAgIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5cbmZ1bmN0aW9uIGtleXMoY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBzZWxmLnJlYWR5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjcmVhdGVUcmFuc2FjdGlvbihzZWxmLl9kYkluZm8sIFJFQURfT05MWSwgZnVuY3Rpb24gKGVyciwgdHJhbnNhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzZWxmLl9kYkluZm8uc3RvcmVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcSA9IHN0b3JlLm9wZW5LZXlDdXJzb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtleXMgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnNvciA9IHJlcS5yZXN1bHQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShrZXlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChjdXJzb3Iua2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcltcImNvbnRpbnVlXCJdKCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgcmVxLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QocmVxLmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlbXCJjYXRjaFwiXShyZWplY3QpO1xuICAgIH0pO1xuXG4gICAgZXhlY3V0ZUNhbGxiYWNrKHByb21pc2UsIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gZHJvcEluc3RhbmNlKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sgPSBnZXRDYWxsYmFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgdmFyIGN1cnJlbnRDb25maWcgPSB0aGlzLmNvbmZpZygpO1xuICAgIG9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyAhPT0gJ2Z1bmN0aW9uJyAmJiBvcHRpb25zIHx8IHt9O1xuICAgIGlmICghb3B0aW9ucy5uYW1lKSB7XG4gICAgICAgIG9wdGlvbnMubmFtZSA9IG9wdGlvbnMubmFtZSB8fCBjdXJyZW50Q29uZmlnLm5hbWU7XG4gICAgICAgIG9wdGlvbnMuc3RvcmVOYW1lID0gb3B0aW9ucy5zdG9yZU5hbWUgfHwgY3VycmVudENvbmZpZy5zdG9yZU5hbWU7XG4gICAgfVxuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBwcm9taXNlO1xuICAgIGlmICghb3B0aW9ucy5uYW1lKSB7XG4gICAgICAgIHByb21pc2UgPSBQcm9taXNlJDEucmVqZWN0KCdJbnZhbGlkIGFyZ3VtZW50cycpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBpc0N1cnJlbnREYiA9IG9wdGlvbnMubmFtZSA9PT0gY3VycmVudENvbmZpZy5uYW1lICYmIHNlbGYuX2RiSW5mby5kYjtcblxuICAgICAgICB2YXIgZGJQcm9taXNlID0gaXNDdXJyZW50RGIgPyBQcm9taXNlJDEucmVzb2x2ZShzZWxmLl9kYkluZm8uZGIpIDogX2dldE9yaWdpbmFsQ29ubmVjdGlvbihvcHRpb25zKS50aGVuKGZ1bmN0aW9uIChkYikge1xuICAgICAgICAgICAgdmFyIGRiQ29udGV4dCA9IGRiQ29udGV4dHNbb3B0aW9ucy5uYW1lXTtcbiAgICAgICAgICAgIHZhciBmb3JhZ2VzID0gZGJDb250ZXh0LmZvcmFnZXM7XG4gICAgICAgICAgICBkYkNvbnRleHQuZGIgPSBkYjtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm9yYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGZvcmFnZXNbaV0uX2RiSW5mby5kYiA9IGRiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRiO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMuc3RvcmVOYW1lKSB7XG4gICAgICAgICAgICBwcm9taXNlID0gZGJQcm9taXNlLnRoZW4oZnVuY3Rpb24gKGRiKSB7XG4gICAgICAgICAgICAgICAgX2RlZmVyUmVhZGluZXNzKG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAgICAgdmFyIGRiQ29udGV4dCA9IGRiQ29udGV4dHNbb3B0aW9ucy5uYW1lXTtcbiAgICAgICAgICAgICAgICB2YXIgZm9yYWdlcyA9IGRiQ29udGV4dC5mb3JhZ2VzO1xuXG4gICAgICAgICAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvcmFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcmFnZSA9IGZvcmFnZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGZvcmFnZS5fZGJJbmZvLmRiID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgZHJvcERCUHJvbWlzZSA9IG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVxID0gaWRiLmRlbGV0ZURhdGFiYXNlKG9wdGlvbnMubmFtZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVxLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGIgPSByZXEucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChyZXEuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIHJlcS5vbmJsb2NrZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDbG9zaW5nIGFsbCBvcGVuIGNvbm5lY3Rpb25zIGluIG9udmVyc2lvbmNoYW5nZSBoYW5kbGVyIHNob3VsZCBwcmV2ZW50IHRoaXMgc2l0dWF0aW9uLCBidXQgaWZcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvIGdldCBoZXJlLCBpdCBqdXN0IG1lYW5zIHRoZSByZXF1ZXN0IHJlbWFpbnMgcGVuZGluZyAtIGV2ZW50dWFsbHkgaXQgd2lsbCBzdWNjZWVkIG9yIGVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ2Ryb3BJbnN0YW5jZSBibG9ja2VkIGZvciBkYXRhYmFzZSBcIicgKyBvcHRpb25zLm5hbWUgKyAnXCIgdW50aWwgYWxsIG9wZW4gY29ubmVjdGlvbnMgYXJlIGNsb3NlZCcpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGIgPSByZXEucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGIpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRyb3BEQlByb21pc2UudGhlbihmdW5jdGlvbiAoZGIpIHtcbiAgICAgICAgICAgICAgICAgICAgZGJDb250ZXh0LmRiID0gZGI7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm9yYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9mb3JhZ2UgPSBmb3JhZ2VzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2FkdmFuY2VSZWFkaW5lc3MoX2ZvcmFnZS5fZGJJbmZvKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgICAoX3JlamVjdFJlYWRpbmVzcyhvcHRpb25zLCBlcnIpIHx8IFByb21pc2UkMS5yZXNvbHZlKCkpW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKCkge30pO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByb21pc2UgPSBkYlByb21pc2UudGhlbihmdW5jdGlvbiAoZGIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMob3B0aW9ucy5zdG9yZU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgbmV3VmVyc2lvbiA9IGRiLnZlcnNpb24gKyAxO1xuXG4gICAgICAgICAgICAgICAgX2RlZmVyUmVhZGluZXNzKG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAgICAgdmFyIGRiQ29udGV4dCA9IGRiQ29udGV4dHNbb3B0aW9ucy5uYW1lXTtcbiAgICAgICAgICAgICAgICB2YXIgZm9yYWdlcyA9IGRiQ29udGV4dC5mb3JhZ2VzO1xuXG4gICAgICAgICAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvcmFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcmFnZSA9IGZvcmFnZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGZvcmFnZS5fZGJJbmZvLmRiID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgZm9yYWdlLl9kYkluZm8udmVyc2lvbiA9IG5ld1ZlcnNpb247XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGRyb3BPYmplY3RQcm9taXNlID0gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXEgPSBpZGIub3BlbihvcHRpb25zLm5hbWUsIG5ld1ZlcnNpb24pO1xuXG4gICAgICAgICAgICAgICAgICAgIHJlcS5vbmVycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRiID0gcmVxLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICByZXEub251cGdyYWRlbmVlZGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRiID0gcmVxLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRiLmRlbGV0ZU9iamVjdFN0b3JlKG9wdGlvbnMuc3RvcmVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRiID0gcmVxLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRiKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBkcm9wT2JqZWN0UHJvbWlzZS50aGVuKGZ1bmN0aW9uIChkYikge1xuICAgICAgICAgICAgICAgICAgICBkYkNvbnRleHQuZGIgPSBkYjtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBmb3JhZ2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2ZvcmFnZTIgPSBmb3JhZ2VzW2pdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2ZvcmFnZTIuX2RiSW5mby5kYiA9IGRiO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2FkdmFuY2VSZWFkaW5lc3MoX2ZvcmFnZTIuX2RiSW5mbyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVtcImNhdGNoXCJdKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgKF9yZWplY3RSZWFkaW5lc3Mob3B0aW9ucywgZXJyKSB8fCBQcm9taXNlJDEucmVzb2x2ZSgpKVtcImNhdGNoXCJdKGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuXG52YXIgYXN5bmNTdG9yYWdlID0ge1xuICAgIF9kcml2ZXI6ICdhc3luY1N0b3JhZ2UnLFxuICAgIF9pbml0U3RvcmFnZTogX2luaXRTdG9yYWdlLFxuICAgIF9zdXBwb3J0OiBpc0luZGV4ZWREQlZhbGlkKCksXG4gICAgaXRlcmF0ZTogaXRlcmF0ZSxcbiAgICBnZXRJdGVtOiBnZXRJdGVtLFxuICAgIHNldEl0ZW06IHNldEl0ZW0sXG4gICAgcmVtb3ZlSXRlbTogcmVtb3ZlSXRlbSxcbiAgICBjbGVhcjogY2xlYXIsXG4gICAgbGVuZ3RoOiBsZW5ndGgsXG4gICAga2V5OiBrZXksXG4gICAga2V5czoga2V5cyxcbiAgICBkcm9wSW5zdGFuY2U6IGRyb3BJbnN0YW5jZVxufTtcblxuZnVuY3Rpb24gaXNXZWJTUUxWYWxpZCgpIHtcbiAgICByZXR1cm4gdHlwZW9mIG9wZW5EYXRhYmFzZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLy8gU2FkbHksIHRoZSBiZXN0IHdheSB0byBzYXZlIGJpbmFyeSBkYXRhIGluIFdlYlNRTC9sb2NhbFN0b3JhZ2UgaXMgc2VyaWFsaXppbmdcbi8vIGl0IHRvIEJhc2U2NCwgc28gdGhpcyBpcyBob3cgd2Ugc3RvcmUgaXQgdG8gcHJldmVudCB2ZXJ5IHN0cmFuZ2UgZXJyb3JzIHdpdGggbGVzc1xuLy8gdmVyYm9zZSB3YXlzIG9mIGJpbmFyeSA8LT4gc3RyaW5nIGRhdGEgc3RvcmFnZS5cbnZhciBCQVNFX0NIQVJTID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuXG52YXIgQkxPQl9UWVBFX1BSRUZJWCA9ICd+fmxvY2FsX2ZvcmFnZV90eXBlfic7XG52YXIgQkxPQl9UWVBFX1BSRUZJWF9SRUdFWCA9IC9efn5sb2NhbF9mb3JhZ2VfdHlwZX4oW15+XSspfi87XG5cbnZhciBTRVJJQUxJWkVEX01BUktFUiA9ICdfX2xmc2NfXzonO1xudmFyIFNFUklBTElaRURfTUFSS0VSX0xFTkdUSCA9IFNFUklBTElaRURfTUFSS0VSLmxlbmd0aDtcblxuLy8gT01HIHRoZSBzZXJpYWxpemF0aW9ucyFcbnZhciBUWVBFX0FSUkFZQlVGRkVSID0gJ2FyYmYnO1xudmFyIFRZUEVfQkxPQiA9ICdibG9iJztcbnZhciBUWVBFX0lOVDhBUlJBWSA9ICdzaTA4JztcbnZhciBUWVBFX1VJTlQ4QVJSQVkgPSAndWkwOCc7XG52YXIgVFlQRV9VSU5UOENMQU1QRURBUlJBWSA9ICd1aWM4JztcbnZhciBUWVBFX0lOVDE2QVJSQVkgPSAnc2kxNic7XG52YXIgVFlQRV9JTlQzMkFSUkFZID0gJ3NpMzInO1xudmFyIFRZUEVfVUlOVDE2QVJSQVkgPSAndXIxNic7XG52YXIgVFlQRV9VSU5UMzJBUlJBWSA9ICd1aTMyJztcbnZhciBUWVBFX0ZMT0FUMzJBUlJBWSA9ICdmbDMyJztcbnZhciBUWVBFX0ZMT0FUNjRBUlJBWSA9ICdmbDY0JztcbnZhciBUWVBFX1NFUklBTElaRURfTUFSS0VSX0xFTkdUSCA9IFNFUklBTElaRURfTUFSS0VSX0xFTkdUSCArIFRZUEVfQVJSQVlCVUZGRVIubGVuZ3RoO1xuXG52YXIgdG9TdHJpbmckMSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbmZ1bmN0aW9uIHN0cmluZ1RvQnVmZmVyKHNlcmlhbGl6ZWRTdHJpbmcpIHtcbiAgICAvLyBGaWxsIHRoZSBzdHJpbmcgaW50byBhIEFycmF5QnVmZmVyLlxuICAgIHZhciBidWZmZXJMZW5ndGggPSBzZXJpYWxpemVkU3RyaW5nLmxlbmd0aCAqIDAuNzU7XG4gICAgdmFyIGxlbiA9IHNlcmlhbGl6ZWRTdHJpbmcubGVuZ3RoO1xuICAgIHZhciBpO1xuICAgIHZhciBwID0gMDtcbiAgICB2YXIgZW5jb2RlZDEsIGVuY29kZWQyLCBlbmNvZGVkMywgZW5jb2RlZDQ7XG5cbiAgICBpZiAoc2VyaWFsaXplZFN0cmluZ1tzZXJpYWxpemVkU3RyaW5nLmxlbmd0aCAtIDFdID09PSAnPScpIHtcbiAgICAgICAgYnVmZmVyTGVuZ3RoLS07XG4gICAgICAgIGlmIChzZXJpYWxpemVkU3RyaW5nW3NlcmlhbGl6ZWRTdHJpbmcubGVuZ3RoIC0gMl0gPT09ICc9Jykge1xuICAgICAgICAgICAgYnVmZmVyTGVuZ3RoLS07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ1ZmZlckxlbmd0aCk7XG4gICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgICAgICBlbmNvZGVkMSA9IEJBU0VfQ0hBUlMuaW5kZXhPZihzZXJpYWxpemVkU3RyaW5nW2ldKTtcbiAgICAgICAgZW5jb2RlZDIgPSBCQVNFX0NIQVJTLmluZGV4T2Yoc2VyaWFsaXplZFN0cmluZ1tpICsgMV0pO1xuICAgICAgICBlbmNvZGVkMyA9IEJBU0VfQ0hBUlMuaW5kZXhPZihzZXJpYWxpemVkU3RyaW5nW2kgKyAyXSk7XG4gICAgICAgIGVuY29kZWQ0ID0gQkFTRV9DSEFSUy5pbmRleE9mKHNlcmlhbGl6ZWRTdHJpbmdbaSArIDNdKTtcblxuICAgICAgICAvKmpzbGludCBiaXR3aXNlOiB0cnVlICovXG4gICAgICAgIGJ5dGVzW3ArK10gPSBlbmNvZGVkMSA8PCAyIHwgZW5jb2RlZDIgPj4gNDtcbiAgICAgICAgYnl0ZXNbcCsrXSA9IChlbmNvZGVkMiAmIDE1KSA8PCA0IHwgZW5jb2RlZDMgPj4gMjtcbiAgICAgICAgYnl0ZXNbcCsrXSA9IChlbmNvZGVkMyAmIDMpIDw8IDYgfCBlbmNvZGVkNCAmIDYzO1xuICAgIH1cbiAgICByZXR1cm4gYnVmZmVyO1xufVxuXG4vLyBDb252ZXJ0cyBhIGJ1ZmZlciB0byBhIHN0cmluZyB0byBzdG9yZSwgc2VyaWFsaXplZCwgaW4gdGhlIGJhY2tlbmRcbi8vIHN0b3JhZ2UgbGlicmFyeS5cbmZ1bmN0aW9uIGJ1ZmZlclRvU3RyaW5nKGJ1ZmZlcikge1xuICAgIC8vIGJhc2U2NC1hcnJheWJ1ZmZlclxuICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgdmFyIGJhc2U2NFN0cmluZyA9ICcnO1xuICAgIHZhciBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIC8qanNsaW50IGJpdHdpc2U6IHRydWUgKi9cbiAgICAgICAgYmFzZTY0U3RyaW5nICs9IEJBU0VfQ0hBUlNbYnl0ZXNbaV0gPj4gMl07XG4gICAgICAgIGJhc2U2NFN0cmluZyArPSBCQVNFX0NIQVJTWyhieXRlc1tpXSAmIDMpIDw8IDQgfCBieXRlc1tpICsgMV0gPj4gNF07XG4gICAgICAgIGJhc2U2NFN0cmluZyArPSBCQVNFX0NIQVJTWyhieXRlc1tpICsgMV0gJiAxNSkgPDwgMiB8IGJ5dGVzW2kgKyAyXSA+PiA2XTtcbiAgICAgICAgYmFzZTY0U3RyaW5nICs9IEJBU0VfQ0hBUlNbYnl0ZXNbaSArIDJdICYgNjNdO1xuICAgIH1cblxuICAgIGlmIChieXRlcy5sZW5ndGggJSAzID09PSAyKSB7XG4gICAgICAgIGJhc2U2NFN0cmluZyA9IGJhc2U2NFN0cmluZy5zdWJzdHJpbmcoMCwgYmFzZTY0U3RyaW5nLmxlbmd0aCAtIDEpICsgJz0nO1xuICAgIH0gZWxzZSBpZiAoYnl0ZXMubGVuZ3RoICUgMyA9PT0gMSkge1xuICAgICAgICBiYXNlNjRTdHJpbmcgPSBiYXNlNjRTdHJpbmcuc3Vic3RyaW5nKDAsIGJhc2U2NFN0cmluZy5sZW5ndGggLSAyKSArICc9PSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhc2U2NFN0cmluZztcbn1cblxuLy8gU2VyaWFsaXplIGEgdmFsdWUsIGFmdGVyd2FyZHMgZXhlY3V0aW5nIGEgY2FsbGJhY2sgKHdoaWNoIHVzdWFsbHlcbi8vIGluc3RydWN0cyB0aGUgYHNldEl0ZW0oKWAgY2FsbGJhY2svcHJvbWlzZSB0byBiZSBleGVjdXRlZCkuIFRoaXMgaXMgaG93XG4vLyB3ZSBzdG9yZSBiaW5hcnkgZGF0YSB3aXRoIGxvY2FsU3RvcmFnZS5cbmZ1bmN0aW9uIHNlcmlhbGl6ZSh2YWx1ZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgdmFsdWVUeXBlID0gJyc7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHZhbHVlVHlwZSA9IHRvU3RyaW5nJDEuY2FsbCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gQ2Fubm90IHVzZSBgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcmAgb3Igc3VjaCBoZXJlLCBhcyB0aGVzZVxuICAgIC8vIGNoZWNrcyBmYWlsIHdoZW4gcnVubmluZyB0aGUgdGVzdHMgdXNpbmcgY2FzcGVyLmpzLi4uXG4gICAgLy9cbiAgICAvLyBUT0RPOiBTZWUgd2h5IHRob3NlIHRlc3RzIGZhaWwgYW5kIHVzZSBhIGJldHRlciBzb2x1dGlvbi5cbiAgICBpZiAodmFsdWUgJiYgKHZhbHVlVHlwZSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyB8fCB2YWx1ZS5idWZmZXIgJiYgdG9TdHJpbmckMS5jYWxsKHZhbHVlLmJ1ZmZlcikgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpKSB7XG4gICAgICAgIC8vIENvbnZlcnQgYmluYXJ5IGFycmF5cyB0byBhIHN0cmluZyBhbmQgcHJlZml4IHRoZSBzdHJpbmcgd2l0aFxuICAgICAgICAvLyBhIHNwZWNpYWwgbWFya2VyLlxuICAgICAgICB2YXIgYnVmZmVyO1xuICAgICAgICB2YXIgbWFya2VyID0gU0VSSUFMSVpFRF9NQVJLRVI7XG5cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgIGJ1ZmZlciA9IHZhbHVlO1xuICAgICAgICAgICAgbWFya2VyICs9IFRZUEVfQVJSQVlCVUZGRVI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBidWZmZXIgPSB2YWx1ZS5idWZmZXI7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZVR5cGUgPT09ICdbb2JqZWN0IEludDhBcnJheV0nKSB7XG4gICAgICAgICAgICAgICAgbWFya2VyICs9IFRZUEVfSU5UOEFSUkFZO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT09ICdbb2JqZWN0IFVpbnQ4QXJyYXldJykge1xuICAgICAgICAgICAgICAgIG1hcmtlciArPSBUWVBFX1VJTlQ4QVJSQVk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PT0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJykge1xuICAgICAgICAgICAgICAgIG1hcmtlciArPSBUWVBFX1VJTlQ4Q0xBTVBFREFSUkFZO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT09ICdbb2JqZWN0IEludDE2QXJyYXldJykge1xuICAgICAgICAgICAgICAgIG1hcmtlciArPSBUWVBFX0lOVDE2QVJSQVk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PT0gJ1tvYmplY3QgVWludDE2QXJyYXldJykge1xuICAgICAgICAgICAgICAgIG1hcmtlciArPSBUWVBFX1VJTlQxNkFSUkFZO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT09ICdbb2JqZWN0IEludDMyQXJyYXldJykge1xuICAgICAgICAgICAgICAgIG1hcmtlciArPSBUWVBFX0lOVDMyQVJSQVk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PT0gJ1tvYmplY3QgVWludDMyQXJyYXldJykge1xuICAgICAgICAgICAgICAgIG1hcmtlciArPSBUWVBFX1VJTlQzMkFSUkFZO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT09ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nKSB7XG4gICAgICAgICAgICAgICAgbWFya2VyICs9IFRZUEVfRkxPQVQzMkFSUkFZO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT09ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nKSB7XG4gICAgICAgICAgICAgICAgbWFya2VyICs9IFRZUEVfRkxPQVQ2NEFSUkFZO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgdHlwZSBmb3IgQmluYXJ5QXJyYXknKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayhtYXJrZXIgKyBidWZmZXJUb1N0cmluZyhidWZmZXIpKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlVHlwZSA9PT0gJ1tvYmplY3QgQmxvYl0nKSB7XG4gICAgICAgIC8vIENvbnZlciB0aGUgYmxvYiB0byBhIGJpbmFyeUFycmF5IGFuZCB0aGVuIHRvIGEgc3RyaW5nLlxuICAgICAgICB2YXIgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICAgICAgZmlsZVJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBCYWNrd2FyZHMtY29tcGF0aWJsZSBwcmVmaXggZm9yIHRoZSBibG9iIHR5cGUuXG4gICAgICAgICAgICB2YXIgc3RyID0gQkxPQl9UWVBFX1BSRUZJWCArIHZhbHVlLnR5cGUgKyAnficgKyBidWZmZXJUb1N0cmluZyh0aGlzLnJlc3VsdCk7XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKFNFUklBTElaRURfTUFSS0VSICsgVFlQRV9CTE9CICsgc3RyKTtcbiAgICAgICAgfTtcblxuICAgICAgICBmaWxlUmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY2FsbGJhY2soSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkNvdWxkbid0IGNvbnZlcnQgdmFsdWUgaW50byBhIEpTT04gc3RyaW5nOiBcIiwgdmFsdWUpO1xuXG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCBlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gRGVzZXJpYWxpemUgZGF0YSB3ZSd2ZSBpbnNlcnRlZCBpbnRvIGEgdmFsdWUgY29sdW1uL2ZpZWxkLiBXZSBwbGFjZVxuLy8gc3BlY2lhbCBtYXJrZXJzIGludG8gb3VyIHN0cmluZ3MgdG8gbWFyayB0aGVtIGFzIGVuY29kZWQ7IHRoaXMgaXNuJ3Rcbi8vIGFzIG5pY2UgYXMgYSBtZXRhIGZpZWxkLCBidXQgaXQncyB0aGUgb25seSBzYW5lIHRoaW5nIHdlIGNhbiBkbyB3aGlsc3Rcbi8vIGtlZXBpbmcgbG9jYWxTdG9yYWdlIHN1cHBvcnQgaW50YWN0LlxuLy9cbi8vIE9mdGVudGltZXMgdGhpcyB3aWxsIGp1c3QgZGVzZXJpYWxpemUgSlNPTiBjb250ZW50LCBidXQgaWYgd2UgaGF2ZSBhXG4vLyBzcGVjaWFsIG1hcmtlciAoU0VSSUFMSVpFRF9NQVJLRVIsIGRlZmluZWQgYWJvdmUpLCB3ZSB3aWxsIGV4dHJhY3Rcbi8vIHNvbWUga2luZCBvZiBhcnJheWJ1ZmZlci9iaW5hcnkgZGF0YS90eXBlZCBhcnJheSBvdXQgb2YgdGhlIHN0cmluZy5cbmZ1bmN0aW9uIGRlc2VyaWFsaXplKHZhbHVlKSB7XG4gICAgLy8gSWYgd2UgaGF2ZW4ndCBtYXJrZWQgdGhpcyBzdHJpbmcgYXMgYmVpbmcgc3BlY2lhbGx5IHNlcmlhbGl6ZWQgKGkuZS5cbiAgICAvLyBzb21ldGhpbmcgb3RoZXIgdGhhbiBzZXJpYWxpemVkIEpTT04pLCB3ZSBjYW4ganVzdCByZXR1cm4gaXQgYW5kIGJlXG4gICAgLy8gZG9uZSB3aXRoIGl0LlxuICAgIGlmICh2YWx1ZS5zdWJzdHJpbmcoMCwgU0VSSUFMSVpFRF9NQVJLRVJfTEVOR1RIKSAhPT0gU0VSSUFMSVpFRF9NQVJLRVIpIHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpO1xuICAgIH1cblxuICAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBkZWFscyB3aXRoIGRlc2VyaWFsaXppbmcgc29tZSBraW5kIG9mIEJsb2Igb3JcbiAgICAvLyBUeXBlZEFycmF5LiBGaXJzdCB3ZSBzZXBhcmF0ZSBvdXQgdGhlIHR5cGUgb2YgZGF0YSB3ZSdyZSBkZWFsaW5nXG4gICAgLy8gd2l0aCBmcm9tIHRoZSBkYXRhIGl0c2VsZi5cbiAgICB2YXIgc2VyaWFsaXplZFN0cmluZyA9IHZhbHVlLnN1YnN0cmluZyhUWVBFX1NFUklBTElaRURfTUFSS0VSX0xFTkdUSCk7XG4gICAgdmFyIHR5cGUgPSB2YWx1ZS5zdWJzdHJpbmcoU0VSSUFMSVpFRF9NQVJLRVJfTEVOR1RILCBUWVBFX1NFUklBTElaRURfTUFSS0VSX0xFTkdUSCk7XG5cbiAgICB2YXIgYmxvYlR5cGU7XG4gICAgLy8gQmFja3dhcmRzLWNvbXBhdGlibGUgYmxvYiB0eXBlIHNlcmlhbGl6YXRpb24gc3RyYXRlZ3kuXG4gICAgLy8gREJzIGNyZWF0ZWQgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBsb2NhbEZvcmFnZSB3aWxsIHNpbXBseSBub3QgaGF2ZSB0aGUgYmxvYiB0eXBlLlxuICAgIGlmICh0eXBlID09PSBUWVBFX0JMT0IgJiYgQkxPQl9UWVBFX1BSRUZJWF9SRUdFWC50ZXN0KHNlcmlhbGl6ZWRTdHJpbmcpKSB7XG4gICAgICAgIHZhciBtYXRjaGVyID0gc2VyaWFsaXplZFN0cmluZy5tYXRjaChCTE9CX1RZUEVfUFJFRklYX1JFR0VYKTtcbiAgICAgICAgYmxvYlR5cGUgPSBtYXRjaGVyWzFdO1xuICAgICAgICBzZXJpYWxpemVkU3RyaW5nID0gc2VyaWFsaXplZFN0cmluZy5zdWJzdHJpbmcobWF0Y2hlclswXS5sZW5ndGgpO1xuICAgIH1cbiAgICB2YXIgYnVmZmVyID0gc3RyaW5nVG9CdWZmZXIoc2VyaWFsaXplZFN0cmluZyk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHJpZ2h0IHR5cGUgYmFzZWQgb24gdGhlIGNvZGUvdHlwZSBzZXQgZHVyaW5nXG4gICAgLy8gc2VyaWFsaXphdGlvbi5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBUWVBFX0FSUkFZQlVGRkVSOlxuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgY2FzZSBUWVBFX0JMT0I6XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlQmxvYihbYnVmZmVyXSwgeyB0eXBlOiBibG9iVHlwZSB9KTtcbiAgICAgICAgY2FzZSBUWVBFX0lOVDhBUlJBWTpcbiAgICAgICAgICAgIHJldHVybiBuZXcgSW50OEFycmF5KGJ1ZmZlcik7XG4gICAgICAgIGNhc2UgVFlQRV9VSU5UOEFSUkFZOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgICAgIGNhc2UgVFlQRV9VSU5UOENMQU1QRURBUlJBWTpcbiAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhDbGFtcGVkQXJyYXkoYnVmZmVyKTtcbiAgICAgICAgY2FzZSBUWVBFX0lOVDE2QVJSQVk6XG4gICAgICAgICAgICByZXR1cm4gbmV3IEludDE2QXJyYXkoYnVmZmVyKTtcbiAgICAgICAgY2FzZSBUWVBFX1VJTlQxNkFSUkFZOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50MTZBcnJheShidWZmZXIpO1xuICAgICAgICBjYXNlIFRZUEVfSU5UMzJBUlJBWTpcbiAgICAgICAgICAgIHJldHVybiBuZXcgSW50MzJBcnJheShidWZmZXIpO1xuICAgICAgICBjYXNlIFRZUEVfVUlOVDMyQVJSQVk6XG4gICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQzMkFycmF5KGJ1ZmZlcik7XG4gICAgICAgIGNhc2UgVFlQRV9GTE9BVDMyQVJSQVk6XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShidWZmZXIpO1xuICAgICAgICBjYXNlIFRZUEVfRkxPQVQ2NEFSUkFZOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdDY0QXJyYXkoYnVmZmVyKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rb3duIHR5cGU6ICcgKyB0eXBlKTtcbiAgICB9XG59XG5cbnZhciBsb2NhbGZvcmFnZVNlcmlhbGl6ZXIgPSB7XG4gICAgc2VyaWFsaXplOiBzZXJpYWxpemUsXG4gICAgZGVzZXJpYWxpemU6IGRlc2VyaWFsaXplLFxuICAgIHN0cmluZ1RvQnVmZmVyOiBzdHJpbmdUb0J1ZmZlcixcbiAgICBidWZmZXJUb1N0cmluZzogYnVmZmVyVG9TdHJpbmdcbn07XG5cbi8qXG4gKiBJbmNsdWRlcyBjb2RlIGZyb206XG4gKlxuICogYmFzZTY0LWFycmF5YnVmZmVyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbmlrbGFzdmgvYmFzZTY0LWFycmF5YnVmZmVyXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEyIE5pa2xhcyB2b24gSGVydHplblxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZURiVGFibGUodCwgZGJJbmZvLCBjYWxsYmFjaywgZXJyb3JDYWxsYmFjaykge1xuICAgIHQuZXhlY3V0ZVNxbCgnQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgJyArIGRiSW5mby5zdG9yZU5hbWUgKyAnICcgKyAnKGlkIElOVEVHRVIgUFJJTUFSWSBLRVksIGtleSB1bmlxdWUsIHZhbHVlKScsIFtdLCBjYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7XG59XG5cbi8vIE9wZW4gdGhlIFdlYlNRTCBkYXRhYmFzZSAoYXV0b21hdGljYWxseSBjcmVhdGVzIG9uZSBpZiBvbmUgZGlkbid0XG4vLyBwcmV2aW91c2x5IGV4aXN0KSwgdXNpbmcgYW55IG9wdGlvbnMgc2V0IGluIHRoZSBjb25maWcuXG5mdW5jdGlvbiBfaW5pdFN0b3JhZ2UkMShvcHRpb25zKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBkYkluZm8gPSB7XG4gICAgICAgIGRiOiBudWxsXG4gICAgfTtcblxuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgIGZvciAodmFyIGkgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgZGJJbmZvW2ldID0gdHlwZW9mIG9wdGlvbnNbaV0gIT09ICdzdHJpbmcnID8gb3B0aW9uc1tpXS50b1N0cmluZygpIDogb3B0aW9uc1tpXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkYkluZm9Qcm9taXNlID0gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIC8vIE9wZW4gdGhlIGRhdGFiYXNlOyB0aGUgb3BlbkRhdGFiYXNlIEFQSSB3aWxsIGF1dG9tYXRpY2FsbHlcbiAgICAgICAgLy8gY3JlYXRlIGl0IGZvciB1cyBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZGJJbmZvLmRiID0gb3BlbkRhdGFiYXNlKGRiSW5mby5uYW1lLCBTdHJpbmcoZGJJbmZvLnZlcnNpb24pLCBkYkluZm8uZGVzY3JpcHRpb24sIGRiSW5mby5zaXplKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBvdXIga2V5L3ZhbHVlIHRhYmxlIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gICAgICAgIGRiSW5mby5kYi50cmFuc2FjdGlvbihmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgY3JlYXRlRGJUYWJsZSh0LCBkYkluZm8sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzZWxmLl9kYkluZm8gPSBkYkluZm87XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHQsIGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgIH0pO1xuXG4gICAgZGJJbmZvLnNlcmlhbGl6ZXIgPSBsb2NhbGZvcmFnZVNlcmlhbGl6ZXI7XG4gICAgcmV0dXJuIGRiSW5mb1Byb21pc2U7XG59XG5cbmZ1bmN0aW9uIHRyeUV4ZWN1dGVTcWwodCwgZGJJbmZvLCBzcWxTdGF0ZW1lbnQsIGFyZ3MsIGNhbGxiYWNrLCBlcnJvckNhbGxiYWNrKSB7XG4gICAgdC5leGVjdXRlU3FsKHNxbFN0YXRlbWVudCwgYXJncywgY2FsbGJhY2ssIGZ1bmN0aW9uICh0LCBlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gZXJyb3IuU1lOVEFYX0VSUikge1xuICAgICAgICAgICAgdC5leGVjdXRlU3FsKCdTRUxFQ1QgbmFtZSBGUk9NIHNxbGl0ZV9tYXN0ZXIgJyArIFwiV0hFUkUgdHlwZT0ndGFibGUnIEFORCBuYW1lID0gP1wiLCBbZGJJbmZvLnN0b3JlTmFtZV0sIGZ1bmN0aW9uICh0LCByZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRzLnJvd3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0YWJsZSBpcyBtaXNzaW5nICh3YXMgZGVsZXRlZClcbiAgICAgICAgICAgICAgICAgICAgLy8gcmUtY3JlYXRlIGl0IHRhYmxlIGFuZCByZXRyeVxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVEYlRhYmxlKHQsIGRiSW5mbywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdC5leGVjdXRlU3FsKHNxbFN0YXRlbWVudCwgYXJncywgY2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICB9LCBlcnJvckNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlcnJvckNhbGxiYWNrKHQsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBlcnJvckNhbGxiYWNrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9yQ2FsbGJhY2sodCwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgfSwgZXJyb3JDYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIGdldEl0ZW0kMShrZXksIGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAga2V5ID0gbm9ybWFsaXplS2V5KGtleSk7XG5cbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBzZWxmLnJlYWR5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZGJJbmZvID0gc2VsZi5fZGJJbmZvO1xuICAgICAgICAgICAgZGJJbmZvLmRiLnRyYW5zYWN0aW9uKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgdHJ5RXhlY3V0ZVNxbCh0LCBkYkluZm8sICdTRUxFQ1QgKiBGUk9NICcgKyBkYkluZm8uc3RvcmVOYW1lICsgJyBXSEVSRSBrZXkgPSA/IExJTUlUIDEnLCBba2V5XSwgZnVuY3Rpb24gKHQsIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlc3VsdHMucm93cy5sZW5ndGggPyByZXN1bHRzLnJvd3MuaXRlbSgwKS52YWx1ZSA6IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgc2VyaWFsaXplZCBjb250ZW50IHdlIG5lZWQgdG9cbiAgICAgICAgICAgICAgICAgICAgLy8gdW5wYWNrLlxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkYkluZm8uc2VyaWFsaXplci5kZXNlcmlhbGl6ZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICh0LCBlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pW1wiY2F0Y2hcIl0ocmVqZWN0KTtcbiAgICB9KTtcblxuICAgIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5cbmZ1bmN0aW9uIGl0ZXJhdGUkMShpdGVyYXRvciwgY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBzZWxmLnJlYWR5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZGJJbmZvID0gc2VsZi5fZGJJbmZvO1xuXG4gICAgICAgICAgICBkYkluZm8uZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICB0cnlFeGVjdXRlU3FsKHQsIGRiSW5mbywgJ1NFTEVDVCAqIEZST00gJyArIGRiSW5mby5zdG9yZU5hbWUsIFtdLCBmdW5jdGlvbiAodCwgcmVzdWx0cykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcm93cyA9IHJlc3VsdHMucm93cztcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxlbmd0aCA9IHJvd3MubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gcm93cy5pdGVtKGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGl0ZW0udmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIHNlcmlhbGl6ZWQgY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byB1bnBhY2suXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZGJJbmZvLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gaXRlcmF0b3IocmVzdWx0LCBpdGVtLmtleSwgaSArIDEpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB2b2lkKDApIHByZXZlbnRzIHByb2JsZW1zIHdpdGggcmVkZWZpbml0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiBgdW5kZWZpbmVkYC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHQsIGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlbXCJjYXRjaFwiXShyZWplY3QpO1xuICAgIH0pO1xuXG4gICAgZXhlY3V0ZUNhbGxiYWNrKHByb21pc2UsIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gX3NldEl0ZW0oa2V5LCB2YWx1ZSwgY2FsbGJhY2ssIHJldHJpZXNMZWZ0KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAga2V5ID0gbm9ybWFsaXplS2V5KGtleSk7XG5cbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBzZWxmLnJlYWR5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBUaGUgbG9jYWxTdG9yYWdlIEFQSSBkb2Vzbid0IHJldHVybiB1bmRlZmluZWQgdmFsdWVzIGluIGFuXG4gICAgICAgICAgICAvLyBcImV4cGVjdGVkXCIgd2F5LCBzbyB1bmRlZmluZWQgaXMgYWx3YXlzIGNhc3QgdG8gbnVsbCBpbiBhbGxcbiAgICAgICAgICAgIC8vIGRyaXZlcnMuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvbG9jYWxGb3JhZ2UvcHVsbC80MlxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIG9yaWdpbmFsIHZhbHVlIHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrLlxuICAgICAgICAgICAgdmFyIG9yaWdpbmFsVmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICAgICAgdmFyIGRiSW5mbyA9IHNlbGYuX2RiSW5mbztcbiAgICAgICAgICAgIGRiSW5mby5zZXJpYWxpemVyLnNlcmlhbGl6ZSh2YWx1ZSwgZnVuY3Rpb24gKHZhbHVlLCBlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRiSW5mby5kYi50cmFuc2FjdGlvbihmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5RXhlY3V0ZVNxbCh0LCBkYkluZm8sICdJTlNFUlQgT1IgUkVQTEFDRSBJTlRPICcgKyBkYkluZm8uc3RvcmVOYW1lICsgJyAnICsgJyhrZXksIHZhbHVlKSBWQUxVRVMgKD8sID8pJywgW2tleSwgdmFsdWVdLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShvcmlnaW5hbFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICh0LCBlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHNxbEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdHJhbnNhY3Rpb24gZmFpbGVkOyBjaGVja1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gc2VlIGlmIGl0J3MgYSBxdW90YSBlcnJvci5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcWxFcnJvci5jb2RlID09PSBzcWxFcnJvci5RVU9UQV9FUlIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSByZWplY3QgdGhlIGNhbGxiYWNrIG91dHJpZ2h0IGZvciBub3csIGJ1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0J3Mgd29ydGggdHJ5aW5nIHRvIHJlLXJ1biB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXZlbiBpZiB0aGUgdXNlciBhY2NlcHRzIHRoZSBwcm9tcHQgdG8gdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9yZSBzdG9yYWdlIG9uIFNhZmFyaSwgdGhpcyBlcnJvciB3aWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmUgY2FsbGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIHJlLXJ1biB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHJpZXNMZWZ0ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKF9zZXRJdGVtLmFwcGx5KHNlbGYsIFtrZXksIG9yaWdpbmFsVmFsdWUsIGNhbGxiYWNrLCByZXRyaWVzTGVmdCAtIDFdKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHNxbEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pW1wiY2F0Y2hcIl0ocmVqZWN0KTtcbiAgICB9KTtcblxuICAgIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5cbmZ1bmN0aW9uIHNldEl0ZW0kMShrZXksIHZhbHVlLCBjYWxsYmFjaykge1xuICAgIHJldHVybiBfc2V0SXRlbS5hcHBseSh0aGlzLCBba2V5LCB2YWx1ZSwgY2FsbGJhY2ssIDFdKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlSXRlbSQxKGtleSwgY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBrZXkgPSBub3JtYWxpemVLZXkoa2V5KTtcblxuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHNlbGYucmVhZHkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBkYkluZm8gPSBzZWxmLl9kYkluZm87XG4gICAgICAgICAgICBkYkluZm8uZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICB0cnlFeGVjdXRlU3FsKHQsIGRiSW5mbywgJ0RFTEVURSBGUk9NICcgKyBkYkluZm8uc3RvcmVOYW1lICsgJyBXSEVSRSBrZXkgPSA/JywgW2tleV0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICh0LCBlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pW1wiY2F0Y2hcIl0ocmVqZWN0KTtcbiAgICB9KTtcblxuICAgIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5cbi8vIERlbGV0ZXMgZXZlcnkgaXRlbSBpbiB0aGUgdGFibGUuXG4vLyBUT0RPOiBGaW5kIG91dCBpZiB0aGlzIHJlc2V0cyB0aGUgQVVUT19JTkNSRU1FTlQgbnVtYmVyLlxuZnVuY3Rpb24gY2xlYXIkMShjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHNlbGYucmVhZHkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBkYkluZm8gPSBzZWxmLl9kYkluZm87XG4gICAgICAgICAgICBkYkluZm8uZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICB0cnlFeGVjdXRlU3FsKHQsIGRiSW5mbywgJ0RFTEVURSBGUk9NICcgKyBkYkluZm8uc3RvcmVOYW1lLCBbXSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHQsIGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlbXCJjYXRjaFwiXShyZWplY3QpO1xuICAgIH0pO1xuXG4gICAgZXhlY3V0ZUNhbGxiYWNrKHByb21pc2UsIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cblxuLy8gRG9lcyBhIHNpbXBsZSBgQ09VTlQoa2V5KWAgdG8gZ2V0IHRoZSBudW1iZXIgb2YgaXRlbXMgc3RvcmVkIGluXG4vLyBsb2NhbEZvcmFnZS5cbmZ1bmN0aW9uIGxlbmd0aCQxKGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgc2VsZi5yZWFkeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGRiSW5mbyA9IHNlbGYuX2RiSW5mbztcbiAgICAgICAgICAgIGRiSW5mby5kYi50cmFuc2FjdGlvbihmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIC8vIEFoaGgsIFNRTCBtYWtlcyB0aGlzIG9uZSBzb29vb29vIGVhc3kuXG4gICAgICAgICAgICAgICAgdHJ5RXhlY3V0ZVNxbCh0LCBkYkluZm8sICdTRUxFQ1QgQ09VTlQoa2V5KSBhcyBjIEZST00gJyArIGRiSW5mby5zdG9yZU5hbWUsIFtdLCBmdW5jdGlvbiAodCwgcmVzdWx0cykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVzdWx0cy5yb3dzLml0ZW0oMCkuYztcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICh0LCBlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pW1wiY2F0Y2hcIl0ocmVqZWN0KTtcbiAgICB9KTtcblxuICAgIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5cbi8vIFJldHVybiB0aGUga2V5IGxvY2F0ZWQgYXQga2V5IGluZGV4IFg7IGVzc2VudGlhbGx5IGdldHMgdGhlIGtleSBmcm9tIGFcbi8vIGBXSEVSRSBpZCA9ID9gLiBUaGlzIGlzIHRoZSBtb3N0IGVmZmljaWVudCB3YXkgSSBjYW4gdGhpbmsgdG8gaW1wbGVtZW50XG4vLyB0aGlzIHJhcmVseS11c2VkIChpbiBteSBleHBlcmllbmNlKSBwYXJ0IG9mIHRoZSBBUEksIGJ1dCBpdCBjYW4gc2VlbVxuLy8gaW5jb25zaXN0ZW50LCBiZWNhdXNlIHdlIGRvIGBJTlNFUlQgT1IgUkVQTEFDRSBJTlRPYCBvbiBgc2V0SXRlbSgpYCwgc29cbi8vIHRoZSBJRCBvZiBlYWNoIGtleSB3aWxsIGNoYW5nZSBldmVyeSB0aW1lIGl0J3MgdXBkYXRlZC4gUGVyaGFwcyBhIHN0b3JlZFxuLy8gcHJvY2VkdXJlIGZvciB0aGUgYHNldEl0ZW0oKWAgU1FMIHdvdWxkIHNvbHZlIHRoaXMgcHJvYmxlbT9cbi8vIFRPRE86IERvbid0IGNoYW5nZSBJRCBvbiBgc2V0SXRlbSgpYC5cbmZ1bmN0aW9uIGtleSQxKG4sIGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgc2VsZi5yZWFkeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGRiSW5mbyA9IHNlbGYuX2RiSW5mbztcbiAgICAgICAgICAgIGRiSW5mby5kYi50cmFuc2FjdGlvbihmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIHRyeUV4ZWN1dGVTcWwodCwgZGJJbmZvLCAnU0VMRUNUIGtleSBGUk9NICcgKyBkYkluZm8uc3RvcmVOYW1lICsgJyBXSEVSRSBpZCA9ID8gTElNSVQgMScsIFtuICsgMV0sIGZ1bmN0aW9uICh0LCByZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByZXN1bHRzLnJvd3MubGVuZ3RoID8gcmVzdWx0cy5yb3dzLml0ZW0oMCkua2V5IDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICh0LCBlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pW1wiY2F0Y2hcIl0ocmVqZWN0KTtcbiAgICB9KTtcblxuICAgIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5cbmZ1bmN0aW9uIGtleXMkMShjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHNlbGYucmVhZHkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBkYkluZm8gPSBzZWxmLl9kYkluZm87XG4gICAgICAgICAgICBkYkluZm8uZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICB0cnlFeGVjdXRlU3FsKHQsIGRiSW5mbywgJ1NFTEVDVCBrZXkgRlJPTSAnICsgZGJJbmZvLnN0b3JlTmFtZSwgW10sIGZ1bmN0aW9uICh0LCByZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBrZXlzID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHRzLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChyZXN1bHRzLnJvd3MuaXRlbShpKS5rZXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShrZXlzKTtcbiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAodCwgZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVtcImNhdGNoXCJdKHJlamVjdCk7XG4gICAgfSk7XG5cbiAgICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViZGF0YWJhc2UvI2RhdGFiYXNlc1xuLy8gPiBUaGVyZSBpcyBubyB3YXkgdG8gZW51bWVyYXRlIG9yIGRlbGV0ZSB0aGUgZGF0YWJhc2VzIGF2YWlsYWJsZSBmb3IgYW4gb3JpZ2luIGZyb20gdGhpcyBBUEkuXG5mdW5jdGlvbiBnZXRBbGxTdG9yZU5hbWVzKGRiKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBkYi50cmFuc2FjdGlvbihmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgdC5leGVjdXRlU3FsKCdTRUxFQ1QgbmFtZSBGUk9NIHNxbGl0ZV9tYXN0ZXIgJyArIFwiV0hFUkUgdHlwZT0ndGFibGUnIEFORCBuYW1lIDw+ICdfX1dlYktpdERhdGFiYXNlSW5mb1RhYmxlX18nXCIsIFtdLCBmdW5jdGlvbiAodCwgcmVzdWx0cykge1xuICAgICAgICAgICAgICAgIHZhciBzdG9yZU5hbWVzID0gW107XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdHMucm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZU5hbWVzLnB1c2gocmVzdWx0cy5yb3dzLml0ZW0oaSkubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIGRiOiBkYixcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVOYW1lczogc3RvcmVOYW1lc1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHQsIGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCBmdW5jdGlvbiAoc3FsRXJyb3IpIHtcbiAgICAgICAgICAgIHJlamVjdChzcWxFcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBkcm9wSW5zdGFuY2UkMShvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrID0gZ2V0Q2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIHZhciBjdXJyZW50Q29uZmlnID0gdGhpcy5jb25maWcoKTtcbiAgICBvcHRpb25zID0gdHlwZW9mIG9wdGlvbnMgIT09ICdmdW5jdGlvbicgJiYgb3B0aW9ucyB8fCB7fTtcbiAgICBpZiAoIW9wdGlvbnMubmFtZSkge1xuICAgICAgICBvcHRpb25zLm5hbWUgPSBvcHRpb25zLm5hbWUgfHwgY3VycmVudENvbmZpZy5uYW1lO1xuICAgICAgICBvcHRpb25zLnN0b3JlTmFtZSA9IG9wdGlvbnMuc3RvcmVOYW1lIHx8IGN1cnJlbnRDb25maWcuc3RvcmVOYW1lO1xuICAgIH1cblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgcHJvbWlzZTtcbiAgICBpZiAoIW9wdGlvbnMubmFtZSkge1xuICAgICAgICBwcm9taXNlID0gUHJvbWlzZSQxLnJlamVjdCgnSW52YWxpZCBhcmd1bWVudHMnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBwcm9taXNlID0gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgdmFyIGRiO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMubmFtZSA9PT0gY3VycmVudENvbmZpZy5uYW1lKSB7XG4gICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBkYiByZWZlcmVuY2Ugb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2VcbiAgICAgICAgICAgICAgICBkYiA9IHNlbGYuX2RiSW5mby5kYjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGIgPSBvcGVuRGF0YWJhc2Uob3B0aW9ucy5uYW1lLCAnJywgJycsIDApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuc3RvcmVOYW1lKSB7XG4gICAgICAgICAgICAgICAgLy8gZHJvcCBhbGwgZGF0YWJhc2UgdGFibGVzXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShnZXRBbGxTdG9yZU5hbWVzKGRiKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICBkYjogZGIsXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlTmFtZXM6IFtvcHRpb25zLnN0b3JlTmFtZV1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAob3BlcmF0aW9uSW5mbykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbkluZm8uZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZHJvcFRhYmxlKHN0b3JlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZXhlY3V0ZVNxbCgnRFJPUCBUQUJMRSBJRiBFWElTVFMgJyArIHN0b3JlTmFtZSwgW10sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICh0LCBlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YXIgb3BlcmF0aW9ucyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gb3BlcmF0aW9uSW5mby5zdG9yZU5hbWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zLnB1c2goZHJvcFRhYmxlKG9wZXJhdGlvbkluZm8uc3RvcmVOYW1lc1tpXSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgUHJvbWlzZSQxLmFsbChvcGVyYXRpb25zKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSlbXCJjYXRjaFwiXShmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoc3FsRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHNxbEVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuXG52YXIgd2ViU1FMU3RvcmFnZSA9IHtcbiAgICBfZHJpdmVyOiAnd2ViU1FMU3RvcmFnZScsXG4gICAgX2luaXRTdG9yYWdlOiBfaW5pdFN0b3JhZ2UkMSxcbiAgICBfc3VwcG9ydDogaXNXZWJTUUxWYWxpZCgpLFxuICAgIGl0ZXJhdGU6IGl0ZXJhdGUkMSxcbiAgICBnZXRJdGVtOiBnZXRJdGVtJDEsXG4gICAgc2V0SXRlbTogc2V0SXRlbSQxLFxuICAgIHJlbW92ZUl0ZW06IHJlbW92ZUl0ZW0kMSxcbiAgICBjbGVhcjogY2xlYXIkMSxcbiAgICBsZW5ndGg6IGxlbmd0aCQxLFxuICAgIGtleToga2V5JDEsXG4gICAga2V5czoga2V5cyQxLFxuICAgIGRyb3BJbnN0YW5jZTogZHJvcEluc3RhbmNlJDFcbn07XG5cbmZ1bmN0aW9uIGlzTG9jYWxTdG9yYWdlVmFsaWQoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBsb2NhbFN0b3JhZ2UgIT09ICd1bmRlZmluZWQnICYmICdzZXRJdGVtJyBpbiBsb2NhbFN0b3JhZ2UgJiZcbiAgICAgICAgLy8gaW4gSUU4IHR5cGVvZiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSA9PT0gJ29iamVjdCdcbiAgICAgICAgISFsb2NhbFN0b3JhZ2Uuc2V0SXRlbTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIF9nZXRLZXlQcmVmaXgob3B0aW9ucywgZGVmYXVsdENvbmZpZykge1xuICAgIHZhciBrZXlQcmVmaXggPSBvcHRpb25zLm5hbWUgKyAnLyc7XG5cbiAgICBpZiAob3B0aW9ucy5zdG9yZU5hbWUgIT09IGRlZmF1bHRDb25maWcuc3RvcmVOYW1lKSB7XG4gICAgICAgIGtleVByZWZpeCArPSBvcHRpb25zLnN0b3JlTmFtZSArICcvJztcbiAgICB9XG4gICAgcmV0dXJuIGtleVByZWZpeDtcbn1cblxuLy8gQ2hlY2sgaWYgbG9jYWxTdG9yYWdlIHRocm93cyB3aGVuIHNhdmluZyBhbiBpdGVtXG5mdW5jdGlvbiBjaGVja0lmTG9jYWxTdG9yYWdlVGhyb3dzKCkge1xuICAgIHZhciBsb2NhbFN0b3JhZ2VUZXN0S2V5ID0gJ19sb2NhbGZvcmFnZV9zdXBwb3J0X3Rlc3QnO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obG9jYWxTdG9yYWdlVGVzdEtleSwgdHJ1ZSk7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGxvY2FsU3RvcmFnZVRlc3RLZXkpO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cblxuLy8gQ2hlY2sgaWYgbG9jYWxTdG9yYWdlIGlzIHVzYWJsZSBhbmQgYWxsb3dzIHRvIHNhdmUgYW4gaXRlbVxuLy8gVGhpcyBtZXRob2QgY2hlY2tzIGlmIGxvY2FsU3RvcmFnZSBpcyB1c2FibGUgaW4gU2FmYXJpIFByaXZhdGUgQnJvd3Npbmdcbi8vIG1vZGUsIG9yIGluIGFueSBvdGhlciBjYXNlIHdoZXJlIHRoZSBhdmFpbGFibGUgcXVvdGEgZm9yIGxvY2FsU3RvcmFnZVxuLy8gaXMgMCBhbmQgdGhlcmUgd2Fzbid0IGFueSBzYXZlZCBpdGVtcyB5ZXQuXG5mdW5jdGlvbiBfaXNMb2NhbFN0b3JhZ2VVc2FibGUoKSB7XG4gICAgcmV0dXJuICFjaGVja0lmTG9jYWxTdG9yYWdlVGhyb3dzKCkgfHwgbG9jYWxTdG9yYWdlLmxlbmd0aCA+IDA7XG59XG5cbi8vIENvbmZpZyB0aGUgbG9jYWxTdG9yYWdlIGJhY2tlbmQsIHVzaW5nIG9wdGlvbnMgc2V0IGluIHRoZSBjb25maWcuXG5mdW5jdGlvbiBfaW5pdFN0b3JhZ2UkMihvcHRpb25zKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBkYkluZm8gPSB7fTtcbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgICBmb3IgKHZhciBpIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGRiSW5mb1tpXSA9IG9wdGlvbnNbaV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkYkluZm8ua2V5UHJlZml4ID0gX2dldEtleVByZWZpeChvcHRpb25zLCBzZWxmLl9kZWZhdWx0Q29uZmlnKTtcblxuICAgIGlmICghX2lzTG9jYWxTdG9yYWdlVXNhYmxlKCkpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UkMS5yZWplY3QoKTtcbiAgICB9XG5cbiAgICBzZWxmLl9kYkluZm8gPSBkYkluZm87XG4gICAgZGJJbmZvLnNlcmlhbGl6ZXIgPSBsb2NhbGZvcmFnZVNlcmlhbGl6ZXI7XG5cbiAgICByZXR1cm4gUHJvbWlzZSQxLnJlc29sdmUoKTtcbn1cblxuLy8gUmVtb3ZlIGFsbCBrZXlzIGZyb20gdGhlIGRhdGFzdG9yZSwgZWZmZWN0aXZlbHkgZGVzdHJveWluZyBhbGwgZGF0YSBpblxuLy8gdGhlIGFwcCdzIGtleS92YWx1ZSBzdG9yZSFcbmZ1bmN0aW9uIGNsZWFyJDIoY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHByb21pc2UgPSBzZWxmLnJlYWR5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBrZXlQcmVmaXggPSBzZWxmLl9kYkluZm8ua2V5UHJlZml4O1xuXG4gICAgICAgIGZvciAodmFyIGkgPSBsb2NhbFN0b3JhZ2UubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBsb2NhbFN0b3JhZ2Uua2V5KGkpO1xuXG4gICAgICAgICAgICBpZiAoa2V5LmluZGV4T2Yoa2V5UHJlZml4KSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5cbi8vIFJldHJpZXZlIGFuIGl0ZW0gZnJvbSB0aGUgc3RvcmUuIFVubGlrZSB0aGUgb3JpZ2luYWwgYXN5bmNfc3RvcmFnZVxuLy8gbGlicmFyeSBpbiBHYWlhLCB3ZSBkb24ndCBtb2RpZnkgcmV0dXJuIHZhbHVlcyBhdCBhbGwuIElmIGEga2V5J3MgdmFsdWVcbi8vIGlzIGB1bmRlZmluZWRgLCB3ZSBwYXNzIHRoYXQgdmFsdWUgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuZnVuY3Rpb24gZ2V0SXRlbSQyKGtleSwgY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBrZXkgPSBub3JtYWxpemVLZXkoa2V5KTtcblxuICAgIHZhciBwcm9taXNlID0gc2VsZi5yZWFkeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGJJbmZvID0gc2VsZi5fZGJJbmZvO1xuICAgICAgICB2YXIgcmVzdWx0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oZGJJbmZvLmtleVByZWZpeCArIGtleSk7XG5cbiAgICAgICAgLy8gSWYgYSByZXN1bHQgd2FzIGZvdW5kLCBwYXJzZSBpdCBmcm9tIHRoZSBzZXJpYWxpemVkXG4gICAgICAgIC8vIHN0cmluZyBpbnRvIGEgSlMgb2JqZWN0LiBJZiByZXN1bHQgaXNuJ3QgdHJ1dGh5LCB0aGUga2V5XG4gICAgICAgIC8vIGlzIGxpa2VseSB1bmRlZmluZWQgYW5kIHdlJ2xsIHBhc3MgaXQgc3RyYWlnaHQgdG8gdGhlXG4gICAgICAgIC8vIGNhbGxiYWNrLlxuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICByZXN1bHQgPSBkYkluZm8uc2VyaWFsaXplci5kZXNlcmlhbGl6ZShyZXN1bHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5cbi8vIEl0ZXJhdGUgb3ZlciBhbGwgaXRlbXMgaW4gdGhlIHN0b3JlLlxuZnVuY3Rpb24gaXRlcmF0ZSQyKGl0ZXJhdG9yLCBjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHZhciBwcm9taXNlID0gc2VsZi5yZWFkeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGJJbmZvID0gc2VsZi5fZGJJbmZvO1xuICAgICAgICB2YXIga2V5UHJlZml4ID0gZGJJbmZvLmtleVByZWZpeDtcbiAgICAgICAgdmFyIGtleVByZWZpeExlbmd0aCA9IGtleVByZWZpeC5sZW5ndGg7XG4gICAgICAgIHZhciBsZW5ndGggPSBsb2NhbFN0b3JhZ2UubGVuZ3RoO1xuXG4gICAgICAgIC8vIFdlIHVzZSBhIGRlZGljYXRlZCBpdGVyYXRvciBpbnN0ZWFkIG9mIHRoZSBgaWAgdmFyaWFibGUgYmVsb3dcbiAgICAgICAgLy8gc28gb3RoZXIga2V5cyB3ZSBmZXRjaCBpbiBsb2NhbFN0b3JhZ2UgYXJlbid0IGNvdW50ZWQgaW5cbiAgICAgICAgLy8gdGhlIGBpdGVyYXRpb25OdW1iZXJgIGFyZ3VtZW50IHBhc3NlZCB0byB0aGUgYGl0ZXJhdGUoKWBcbiAgICAgICAgLy8gY2FsbGJhY2suXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNlZTogZ2l0aHViLmNvbS9tb3ppbGxhL2xvY2FsRm9yYWdlL3B1bGwvNDM1I2Rpc2N1c3Npb25fcjM4MDYxNTMwXG4gICAgICAgIHZhciBpdGVyYXRpb25OdW1iZXIgPSAxO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBsb2NhbFN0b3JhZ2Uua2V5KGkpO1xuICAgICAgICAgICAgaWYgKGtleS5pbmRleE9mKGtleVByZWZpeCkgIT09IDApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG5cbiAgICAgICAgICAgIC8vIElmIGEgcmVzdWx0IHdhcyBmb3VuZCwgcGFyc2UgaXQgZnJvbSB0aGUgc2VyaWFsaXplZFxuICAgICAgICAgICAgLy8gc3RyaW5nIGludG8gYSBKUyBvYmplY3QuIElmIHJlc3VsdCBpc24ndCB0cnV0aHksIHRoZVxuICAgICAgICAgICAgLy8ga2V5IGlzIGxpa2VseSB1bmRlZmluZWQgYW5kIHdlJ2xsIHBhc3MgaXQgc3RyYWlnaHRcbiAgICAgICAgICAgIC8vIHRvIHRoZSBpdGVyYXRvci5cbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gZGJJbmZvLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YWx1ZSA9IGl0ZXJhdG9yKHZhbHVlLCBrZXkuc3Vic3RyaW5nKGtleVByZWZpeExlbmd0aCksIGl0ZXJhdGlvbk51bWJlcisrKTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5cbi8vIFNhbWUgYXMgbG9jYWxTdG9yYWdlJ3Mga2V5KCkgbWV0aG9kLCBleGNlcHQgdGFrZXMgYSBjYWxsYmFjay5cbmZ1bmN0aW9uIGtleSQyKG4sIGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBwcm9taXNlID0gc2VsZi5yZWFkeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGJJbmZvID0gc2VsZi5fZGJJbmZvO1xuICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0ID0gbG9jYWxTdG9yYWdlLmtleShuKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgdGhlIHByZWZpeCBmcm9tIHRoZSBrZXksIGlmIGEga2V5IGlzIGZvdW5kLlxuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKGRiSW5mby5rZXlQcmVmaXgubGVuZ3RoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuXG5mdW5jdGlvbiBrZXlzJDIoY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHByb21pc2UgPSBzZWxmLnJlYWR5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkYkluZm8gPSBzZWxmLl9kYkluZm87XG4gICAgICAgIHZhciBsZW5ndGggPSBsb2NhbFN0b3JhZ2UubGVuZ3RoO1xuICAgICAgICB2YXIga2V5cyA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBpdGVtS2V5ID0gbG9jYWxTdG9yYWdlLmtleShpKTtcbiAgICAgICAgICAgIGlmIChpdGVtS2V5LmluZGV4T2YoZGJJbmZvLmtleVByZWZpeCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2goaXRlbUtleS5zdWJzdHJpbmcoZGJJbmZvLmtleVByZWZpeC5sZW5ndGgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBrZXlzO1xuICAgIH0pO1xuXG4gICAgZXhlY3V0ZUNhbGxiYWNrKHByb21pc2UsIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cblxuLy8gU3VwcGx5IHRoZSBudW1iZXIgb2Yga2V5cyBpbiB0aGUgZGF0YXN0b3JlIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbmZ1bmN0aW9uIGxlbmd0aCQyKGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBwcm9taXNlID0gc2VsZi5rZXlzKCkudGhlbihmdW5jdGlvbiAoa2V5cykge1xuICAgICAgICByZXR1cm4ga2V5cy5sZW5ndGg7XG4gICAgfSk7XG5cbiAgICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuXG4vLyBSZW1vdmUgYW4gaXRlbSBmcm9tIHRoZSBzdG9yZSwgbmljZSBhbmQgc2ltcGxlLlxuZnVuY3Rpb24gcmVtb3ZlSXRlbSQyKGtleSwgY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBrZXkgPSBub3JtYWxpemVLZXkoa2V5KTtcblxuICAgIHZhciBwcm9taXNlID0gc2VsZi5yZWFkeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGJJbmZvID0gc2VsZi5fZGJJbmZvO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShkYkluZm8ua2V5UHJlZml4ICsga2V5KTtcbiAgICB9KTtcblxuICAgIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5cbi8vIFNldCBhIGtleSdzIHZhbHVlIGFuZCBydW4gYW4gb3B0aW9uYWwgY2FsbGJhY2sgb25jZSB0aGUgdmFsdWUgaXMgc2V0LlxuLy8gVW5saWtlIEdhaWEncyBpbXBsZW1lbnRhdGlvbiwgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIHBhc3NlZCB0aGUgdmFsdWUsXG4vLyBpbiBjYXNlIHlvdSB3YW50IHRvIG9wZXJhdGUgb24gdGhhdCB2YWx1ZSBvbmx5IGFmdGVyIHlvdSdyZSBzdXJlIGl0XG4vLyBzYXZlZCwgb3Igc29tZXRoaW5nIGxpa2UgdGhhdC5cbmZ1bmN0aW9uIHNldEl0ZW0kMihrZXksIHZhbHVlLCBjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGtleSA9IG5vcm1hbGl6ZUtleShrZXkpO1xuXG4gICAgdmFyIHByb21pc2UgPSBzZWxmLnJlYWR5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIENvbnZlcnQgdW5kZWZpbmVkIHZhbHVlcyB0byBudWxsLlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9sb2NhbEZvcmFnZS9wdWxsLzQyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTYXZlIHRoZSBvcmlnaW5hbCB2YWx1ZSB0byBwYXNzIHRvIHRoZSBjYWxsYmFjay5cbiAgICAgICAgdmFyIG9yaWdpbmFsVmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgZGJJbmZvID0gc2VsZi5fZGJJbmZvO1xuICAgICAgICAgICAgZGJJbmZvLnNlcmlhbGl6ZXIuc2VyaWFsaXplKHZhbHVlLCBmdW5jdGlvbiAodmFsdWUsIGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGRiSW5mby5rZXlQcmVmaXggKyBrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUob3JpZ2luYWxWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvY2FsU3RvcmFnZSBjYXBhY2l0eSBleGNlZWRlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IE1ha2UgdGhpcyBhIHNwZWNpZmljIGVycm9yL2V2ZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUubmFtZSA9PT0gJ1F1b3RhRXhjZWVkZWRFcnJvcicgfHwgZS5uYW1lID09PSAnTlNfRVJST1JfRE9NX1FVT1RBX1JFQUNIRUQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZXhlY3V0ZUNhbGxiYWNrKHByb21pc2UsIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gZHJvcEluc3RhbmNlJDIob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjayA9IGdldENhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICBvcHRpb25zID0gdHlwZW9mIG9wdGlvbnMgIT09ICdmdW5jdGlvbicgJiYgb3B0aW9ucyB8fCB7fTtcbiAgICBpZiAoIW9wdGlvbnMubmFtZSkge1xuICAgICAgICB2YXIgY3VycmVudENvbmZpZyA9IHRoaXMuY29uZmlnKCk7XG4gICAgICAgIG9wdGlvbnMubmFtZSA9IG9wdGlvbnMubmFtZSB8fCBjdXJyZW50Q29uZmlnLm5hbWU7XG4gICAgICAgIG9wdGlvbnMuc3RvcmVOYW1lID0gb3B0aW9ucy5zdG9yZU5hbWUgfHwgY3VycmVudENvbmZpZy5zdG9yZU5hbWU7XG4gICAgfVxuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBwcm9taXNlO1xuICAgIGlmICghb3B0aW9ucy5uYW1lKSB7XG4gICAgICAgIHByb21pc2UgPSBQcm9taXNlJDEucmVqZWN0KCdJbnZhbGlkIGFyZ3VtZW50cycpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHByb21pc2UgPSBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuc3RvcmVOYW1lKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShvcHRpb25zLm5hbWUgKyAnLycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKF9nZXRLZXlQcmVmaXgob3B0aW9ucywgc2VsZi5fZGVmYXVsdENvbmZpZykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChrZXlQcmVmaXgpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBsb2NhbFN0b3JhZ2UubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gbG9jYWxTdG9yYWdlLmtleShpKTtcblxuICAgICAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZihrZXlQcmVmaXgpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuXG52YXIgbG9jYWxTdG9yYWdlV3JhcHBlciA9IHtcbiAgICBfZHJpdmVyOiAnbG9jYWxTdG9yYWdlV3JhcHBlcicsXG4gICAgX2luaXRTdG9yYWdlOiBfaW5pdFN0b3JhZ2UkMixcbiAgICBfc3VwcG9ydDogaXNMb2NhbFN0b3JhZ2VWYWxpZCgpLFxuICAgIGl0ZXJhdGU6IGl0ZXJhdGUkMixcbiAgICBnZXRJdGVtOiBnZXRJdGVtJDIsXG4gICAgc2V0SXRlbTogc2V0SXRlbSQyLFxuICAgIHJlbW92ZUl0ZW06IHJlbW92ZUl0ZW0kMixcbiAgICBjbGVhcjogY2xlYXIkMixcbiAgICBsZW5ndGg6IGxlbmd0aCQyLFxuICAgIGtleToga2V5JDIsXG4gICAga2V5czoga2V5cyQyLFxuICAgIGRyb3BJbnN0YW5jZTogZHJvcEluc3RhbmNlJDJcbn07XG5cbnZhciBzYW1lVmFsdWUgPSBmdW5jdGlvbiBzYW1lVmFsdWUoeCwgeSkge1xuICAgIHJldHVybiB4ID09PSB5IHx8IHR5cGVvZiB4ID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgeSA9PT0gJ251bWJlcicgJiYgaXNOYU4oeCkgJiYgaXNOYU4oeSk7XG59O1xuXG52YXIgaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyhhcnJheSwgc2VhcmNoRWxlbWVudCkge1xuICAgIHZhciBsZW4gPSBhcnJheS5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICAgIGlmIChzYW1lVmFsdWUoYXJyYXlbaV0sIHNlYXJjaEVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblxudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcmcpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuXG4vLyBEcml2ZXJzIGFyZSBzdG9yZWQgaGVyZSB3aGVuIGBkZWZpbmVEcml2ZXIoKWAgaXMgY2FsbGVkLlxuLy8gVGhleSBhcmUgc2hhcmVkIGFjcm9zcyBhbGwgaW5zdGFuY2VzIG9mIGxvY2FsRm9yYWdlLlxudmFyIERlZmluZWREcml2ZXJzID0ge307XG5cbnZhciBEcml2ZXJTdXBwb3J0ID0ge307XG5cbnZhciBEZWZhdWx0RHJpdmVycyA9IHtcbiAgICBJTkRFWEVEREI6IGFzeW5jU3RvcmFnZSxcbiAgICBXRUJTUUw6IHdlYlNRTFN0b3JhZ2UsXG4gICAgTE9DQUxTVE9SQUdFOiBsb2NhbFN0b3JhZ2VXcmFwcGVyXG59O1xuXG52YXIgRGVmYXVsdERyaXZlck9yZGVyID0gW0RlZmF1bHREcml2ZXJzLklOREVYRUREQi5fZHJpdmVyLCBEZWZhdWx0RHJpdmVycy5XRUJTUUwuX2RyaXZlciwgRGVmYXVsdERyaXZlcnMuTE9DQUxTVE9SQUdFLl9kcml2ZXJdO1xuXG52YXIgT3B0aW9uYWxEcml2ZXJNZXRob2RzID0gWydkcm9wSW5zdGFuY2UnXTtcblxudmFyIExpYnJhcnlNZXRob2RzID0gWydjbGVhcicsICdnZXRJdGVtJywgJ2l0ZXJhdGUnLCAna2V5JywgJ2tleXMnLCAnbGVuZ3RoJywgJ3JlbW92ZUl0ZW0nLCAnc2V0SXRlbSddLmNvbmNhdChPcHRpb25hbERyaXZlck1ldGhvZHMpO1xuXG52YXIgRGVmYXVsdENvbmZpZyA9IHtcbiAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgZHJpdmVyOiBEZWZhdWx0RHJpdmVyT3JkZXIuc2xpY2UoKSxcbiAgICBuYW1lOiAnbG9jYWxmb3JhZ2UnLFxuICAgIC8vIERlZmF1bHQgREIgc2l6ZSBpcyBfSlVTVCBVTkRFUl8gNU1CLCBhcyBpdCdzIHRoZSBoaWdoZXN0IHNpemVcbiAgICAvLyB3ZSBjYW4gdXNlIHdpdGhvdXQgYSBwcm9tcHQuXG4gICAgc2l6ZTogNDk4MDczNixcbiAgICBzdG9yZU5hbWU6ICdrZXl2YWx1ZXBhaXJzJyxcbiAgICB2ZXJzaW9uOiAxLjBcbn07XG5cbmZ1bmN0aW9uIGNhbGxXaGVuUmVhZHkobG9jYWxGb3JhZ2VJbnN0YW5jZSwgbGlicmFyeU1ldGhvZCkge1xuICAgIGxvY2FsRm9yYWdlSW5zdGFuY2VbbGlicmFyeU1ldGhvZF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgcmV0dXJuIGxvY2FsRm9yYWdlSW5zdGFuY2UucmVhZHkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbEZvcmFnZUluc3RhbmNlW2xpYnJhcnlNZXRob2RdLmFwcGx5KGxvY2FsRm9yYWdlSW5zdGFuY2UsIF9hcmdzKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZXh0ZW5kKCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBhcmcgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgICAgaWYgKGFyZykge1xuICAgICAgICAgICAgZm9yICh2YXIgX2tleSBpbiBhcmcpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJnLmhhc093blByb3BlcnR5KF9rZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KGFyZ1tfa2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50c1swXVtfa2V5XSA9IGFyZ1tfa2V5XS5zbGljZSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzWzBdW19rZXldID0gYXJnW19rZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyZ3VtZW50c1swXTtcbn1cblxudmFyIExvY2FsRm9yYWdlID0gZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIExvY2FsRm9yYWdlKG9wdGlvbnMpIHtcbiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIExvY2FsRm9yYWdlKTtcblxuICAgICAgICBmb3IgKHZhciBkcml2ZXJUeXBlS2V5IGluIERlZmF1bHREcml2ZXJzKSB7XG4gICAgICAgICAgICBpZiAoRGVmYXVsdERyaXZlcnMuaGFzT3duUHJvcGVydHkoZHJpdmVyVHlwZUtleSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZHJpdmVyID0gRGVmYXVsdERyaXZlcnNbZHJpdmVyVHlwZUtleV07XG4gICAgICAgICAgICAgICAgdmFyIGRyaXZlck5hbWUgPSBkcml2ZXIuX2RyaXZlcjtcbiAgICAgICAgICAgICAgICB0aGlzW2RyaXZlclR5cGVLZXldID0gZHJpdmVyTmFtZTtcblxuICAgICAgICAgICAgICAgIGlmICghRGVmaW5lZERyaXZlcnNbZHJpdmVyTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgbmVlZCB0byB3YWl0IGZvciB0aGUgcHJvbWlzZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIGRlZmF1bHQgZHJpdmVycyBjYW4gYmUgZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAvLyBpbiBhIGJsb2NraW5nIG1hbm5lclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmluZURyaXZlcihkcml2ZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2RlZmF1bHRDb25maWcgPSBleHRlbmQoe30sIERlZmF1bHRDb25maWcpO1xuICAgICAgICB0aGlzLl9jb25maWcgPSBleHRlbmQoe30sIHRoaXMuX2RlZmF1bHRDb25maWcsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLl9kcml2ZXJTZXQgPSBudWxsO1xuICAgICAgICB0aGlzLl9pbml0RHJpdmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcmVhZHkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZGJJbmZvID0gbnVsbDtcblxuICAgICAgICB0aGlzLl93cmFwTGlicmFyeU1ldGhvZHNXaXRoUmVhZHkoKTtcbiAgICAgICAgdGhpcy5zZXREcml2ZXIodGhpcy5fY29uZmlnLmRyaXZlcilbXCJjYXRjaFwiXShmdW5jdGlvbiAoKSB7fSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGFueSBjb25maWcgdmFsdWVzIGZvciBsb2NhbEZvcmFnZTsgY2FuIGJlIGNhbGxlZCBhbnl0aW1lIGJlZm9yZVxuICAgIC8vIHRoZSBmaXJzdCBBUEkgY2FsbCAoZS5nLiBgZ2V0SXRlbWAsIGBzZXRJdGVtYCkuXG4gICAgLy8gV2UgbG9vcCB0aHJvdWdoIG9wdGlvbnMgc28gd2UgZG9uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGNvbmZpZ1xuICAgIC8vIHZhbHVlcy5cblxuXG4gICAgTG9jYWxGb3JhZ2UucHJvdG90eXBlLmNvbmZpZyA9IGZ1bmN0aW9uIGNvbmZpZyhvcHRpb25zKSB7XG4gICAgICAgIC8vIElmIHRoZSBvcHRpb25zIGFyZ3VtZW50IGlzIGFuIG9iamVjdCwgd2UgdXNlIGl0IHRvIHNldCB2YWx1ZXMuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgd2UgcmV0dXJuIGVpdGhlciBhIHNwZWNpZmllZCBjb25maWcgdmFsdWUgb3IgYWxsXG4gICAgICAgIC8vIGNvbmZpZyB2YWx1ZXMuXG4gICAgICAgIGlmICgodHlwZW9mIG9wdGlvbnMgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG9wdGlvbnMpKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIC8vIElmIGxvY2FsZm9yYWdlIGlzIHJlYWR5IGFuZCBmdWxseSBpbml0aWFsaXplZCwgd2UgY2FuJ3Qgc2V0XG4gICAgICAgICAgICAvLyBhbnkgbmV3IGNvbmZpZ3VyYXRpb24gdmFsdWVzLiBJbnN0ZWFkLCB3ZSByZXR1cm4gYW4gZXJyb3IuXG4gICAgICAgICAgICBpZiAodGhpcy5fcmVhZHkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKFwiQ2FuJ3QgY2FsbCBjb25maWcoKSBhZnRlciBsb2NhbGZvcmFnZSBcIiArICdoYXMgYmVlbiB1c2VkLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gJ3N0b3JlTmFtZScpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1tpXSA9IG9wdGlvbnNbaV0ucmVwbGFjZSgvXFxXL2csICdfJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGkgPT09ICd2ZXJzaW9uJyAmJiB0eXBlb2Ygb3B0aW9uc1tpXSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignRGF0YWJhc2UgdmVyc2lvbiBtdXN0IGJlIGEgbnVtYmVyLicpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbmZpZ1tpXSA9IG9wdGlvbnNbaV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGFmdGVyIGFsbCBjb25maWcgb3B0aW9ucyBhcmUgc2V0IGFuZFxuICAgICAgICAgICAgLy8gdGhlIGRyaXZlciBvcHRpb24gaXMgdXNlZCwgdHJ5IHNldHRpbmcgaXRcbiAgICAgICAgICAgIGlmICgnZHJpdmVyJyBpbiBvcHRpb25zICYmIG9wdGlvbnMuZHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0RHJpdmVyKHRoaXMuX2NvbmZpZy5kcml2ZXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb25maWdbb3B0aW9uc107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vIFVzZWQgdG8gZGVmaW5lIGEgY3VzdG9tIGRyaXZlciwgc2hhcmVkIGFjcm9zcyBhbGwgaW5zdGFuY2VzIG9mXG4gICAgLy8gbG9jYWxGb3JhZ2UuXG5cblxuICAgIExvY2FsRm9yYWdlLnByb3RvdHlwZS5kZWZpbmVEcml2ZXIgPSBmdW5jdGlvbiBkZWZpbmVEcml2ZXIoZHJpdmVyT2JqZWN0LCBjYWxsYmFjaywgZXJyb3JDYWxsYmFjaykge1xuICAgICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YXIgZHJpdmVyTmFtZSA9IGRyaXZlck9iamVjdC5fZHJpdmVyO1xuICAgICAgICAgICAgICAgIHZhciBjb21wbGlhbmNlRXJyb3IgPSBuZXcgRXJyb3IoJ0N1c3RvbSBkcml2ZXIgbm90IGNvbXBsaWFudDsgc2VlICcgKyAnaHR0cHM6Ly9tb3ppbGxhLmdpdGh1Yi5pby9sb2NhbEZvcmFnZS8jZGVmaW5lZHJpdmVyJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBBIGRyaXZlciBuYW1lIHNob3VsZCBiZSBkZWZpbmVkIGFuZCBub3Qgb3ZlcmxhcCB3aXRoIHRoZVxuICAgICAgICAgICAgICAgIC8vIGxpYnJhcnktZGVmaW5lZCwgZGVmYXVsdCBkcml2ZXJzLlxuICAgICAgICAgICAgICAgIGlmICghZHJpdmVyT2JqZWN0Ll9kcml2ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGNvbXBsaWFuY2VFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgZHJpdmVyTWV0aG9kcyA9IExpYnJhcnlNZXRob2RzLmNvbmNhdCgnX2luaXRTdG9yYWdlJyk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGRyaXZlck1ldGhvZHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRyaXZlck1ldGhvZE5hbWUgPSBkcml2ZXJNZXRob2RzW2ldO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIHByb3BlcnR5IGlzIHRoZXJlLFxuICAgICAgICAgICAgICAgICAgICAvLyBpdCBzaG91bGQgYmUgYSBtZXRob2QgZXZlbiB3aGVuIG9wdGlvbmFsXG4gICAgICAgICAgICAgICAgICAgIHZhciBpc1JlcXVpcmVkID0gIWluY2x1ZGVzKE9wdGlvbmFsRHJpdmVyTWV0aG9kcywgZHJpdmVyTWV0aG9kTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoaXNSZXF1aXJlZCB8fCBkcml2ZXJPYmplY3RbZHJpdmVyTWV0aG9kTmFtZV0pICYmIHR5cGVvZiBkcml2ZXJPYmplY3RbZHJpdmVyTWV0aG9kTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChjb21wbGlhbmNlRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGNvbmZpZ3VyZU1pc3NpbmdNZXRob2RzID0gZnVuY3Rpb24gY29uZmlndXJlTWlzc2luZ01ldGhvZHMoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtZXRob2ROb3RJbXBsZW1lbnRlZEZhY3RvcnkgPSBmdW5jdGlvbiBtZXRob2ROb3RJbXBsZW1lbnRlZEZhY3RvcnkobWV0aG9kTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ01ldGhvZCAnICsgbWV0aG9kTmFtZSArICcgaXMgbm90IGltcGxlbWVudGVkIGJ5IHRoZSBjdXJyZW50IGRyaXZlcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9taXNlID0gUHJvbWlzZSQxLnJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUNhbGxiYWNrKHByb21pc2UsIGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9sZW4gPSBPcHRpb25hbERyaXZlck1ldGhvZHMubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25hbERyaXZlck1ldGhvZCA9IE9wdGlvbmFsRHJpdmVyTWV0aG9kc1tfaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRyaXZlck9iamVjdFtvcHRpb25hbERyaXZlck1ldGhvZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXJPYmplY3Rbb3B0aW9uYWxEcml2ZXJNZXRob2RdID0gbWV0aG9kTm90SW1wbGVtZW50ZWRGYWN0b3J5KG9wdGlvbmFsRHJpdmVyTWV0aG9kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBjb25maWd1cmVNaXNzaW5nTWV0aG9kcygpO1xuXG4gICAgICAgICAgICAgICAgdmFyIHNldERyaXZlclN1cHBvcnQgPSBmdW5jdGlvbiBzZXREcml2ZXJTdXBwb3J0KHN1cHBvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKERlZmluZWREcml2ZXJzW2RyaXZlck5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oJ1JlZGVmaW5pbmcgTG9jYWxGb3JhZ2UgZHJpdmVyOiAnICsgZHJpdmVyTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgRGVmaW5lZERyaXZlcnNbZHJpdmVyTmFtZV0gPSBkcml2ZXJPYmplY3Q7XG4gICAgICAgICAgICAgICAgICAgIERyaXZlclN1cHBvcnRbZHJpdmVyTmFtZV0gPSBzdXBwb3J0O1xuICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCB1c2UgYSB0aGVuLCBzbyB0aGF0IHdlIGNhbiBkZWZpbmVcbiAgICAgICAgICAgICAgICAgICAgLy8gZHJpdmVycyB0aGF0IGhhdmUgc2ltcGxlIF9zdXBwb3J0IG1ldGhvZHNcbiAgICAgICAgICAgICAgICAgICAgLy8gaW4gYSBibG9ja2luZyBtYW5uZXJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoJ19zdXBwb3J0JyBpbiBkcml2ZXJPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRyaXZlck9iamVjdC5fc3VwcG9ydCAmJiB0eXBlb2YgZHJpdmVyT2JqZWN0Ll9zdXBwb3J0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXJPYmplY3QuX3N1cHBvcnQoKS50aGVuKHNldERyaXZlclN1cHBvcnQsIHJlamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXREcml2ZXJTdXBwb3J0KCEhZHJpdmVyT2JqZWN0Ll9zdXBwb3J0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNldERyaXZlclN1cHBvcnQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXhlY3V0ZVR3b0NhbGxiYWNrcyhwcm9taXNlLCBjYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG5cbiAgICBMb2NhbEZvcmFnZS5wcm90b3R5cGUuZHJpdmVyID0gZnVuY3Rpb24gZHJpdmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZHJpdmVyIHx8IG51bGw7XG4gICAgfTtcblxuICAgIExvY2FsRm9yYWdlLnByb3RvdHlwZS5nZXREcml2ZXIgPSBmdW5jdGlvbiBnZXREcml2ZXIoZHJpdmVyTmFtZSwgY2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGdldERyaXZlclByb21pc2UgPSBEZWZpbmVkRHJpdmVyc1tkcml2ZXJOYW1lXSA/IFByb21pc2UkMS5yZXNvbHZlKERlZmluZWREcml2ZXJzW2RyaXZlck5hbWVdKSA6IFByb21pc2UkMS5yZWplY3QobmV3IEVycm9yKCdEcml2ZXIgbm90IGZvdW5kLicpKTtcblxuICAgICAgICBleGVjdXRlVHdvQ2FsbGJhY2tzKGdldERyaXZlclByb21pc2UsIGNhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuIGdldERyaXZlclByb21pc2U7XG4gICAgfTtcblxuICAgIExvY2FsRm9yYWdlLnByb3RvdHlwZS5nZXRTZXJpYWxpemVyID0gZnVuY3Rpb24gZ2V0U2VyaWFsaXplcihjYWxsYmFjaykge1xuICAgICAgICB2YXIgc2VyaWFsaXplclByb21pc2UgPSBQcm9taXNlJDEucmVzb2x2ZShsb2NhbGZvcmFnZVNlcmlhbGl6ZXIpO1xuICAgICAgICBleGVjdXRlVHdvQ2FsbGJhY2tzKHNlcmlhbGl6ZXJQcm9taXNlLCBjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVyUHJvbWlzZTtcbiAgICB9O1xuXG4gICAgTG9jYWxGb3JhZ2UucHJvdG90eXBlLnJlYWR5ID0gZnVuY3Rpb24gcmVhZHkoY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIHZhciBwcm9taXNlID0gc2VsZi5fZHJpdmVyU2V0LnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHNlbGYuX3JlYWR5ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5fcmVhZHkgPSBzZWxmLl9pbml0RHJpdmVyKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZWFkeTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXhlY3V0ZVR3b0NhbGxiYWNrcyhwcm9taXNlLCBjYWxsYmFjaywgY2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9O1xuXG4gICAgTG9jYWxGb3JhZ2UucHJvdG90eXBlLnNldERyaXZlciA9IGZ1bmN0aW9uIHNldERyaXZlcihkcml2ZXJzLCBjYWxsYmFjaywgZXJyb3JDYWxsYmFjaykge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgaWYgKCFpc0FycmF5KGRyaXZlcnMpKSB7XG4gICAgICAgICAgICBkcml2ZXJzID0gW2RyaXZlcnNdO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN1cHBvcnRlZERyaXZlcnMgPSB0aGlzLl9nZXRTdXBwb3J0ZWREcml2ZXJzKGRyaXZlcnMpO1xuXG4gICAgICAgIGZ1bmN0aW9uIHNldERyaXZlclRvQ29uZmlnKCkge1xuICAgICAgICAgICAgc2VsZi5fY29uZmlnLmRyaXZlciA9IHNlbGYuZHJpdmVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBleHRlbmRTZWxmV2l0aERyaXZlcihkcml2ZXIpIHtcbiAgICAgICAgICAgIHNlbGYuX2V4dGVuZChkcml2ZXIpO1xuICAgICAgICAgICAgc2V0RHJpdmVyVG9Db25maWcoKTtcblxuICAgICAgICAgICAgc2VsZi5fcmVhZHkgPSBzZWxmLl9pbml0U3RvcmFnZShzZWxmLl9jb25maWcpO1xuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWR5O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaW5pdERyaXZlcihzdXBwb3J0ZWREcml2ZXJzKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBjdXJyZW50RHJpdmVySW5kZXggPSAwO1xuXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gZHJpdmVyUHJvbWlzZUxvb3AoKSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjdXJyZW50RHJpdmVySW5kZXggPCBzdXBwb3J0ZWREcml2ZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRyaXZlck5hbWUgPSBzdXBwb3J0ZWREcml2ZXJzW2N1cnJlbnREcml2ZXJJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RHJpdmVySW5kZXgrKztcblxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGJJbmZvID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlYWR5ID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0RHJpdmVyKGRyaXZlck5hbWUpLnRoZW4oZXh0ZW5kU2VsZldpdGhEcml2ZXIpW1wiY2F0Y2hcIl0oZHJpdmVyUHJvbWlzZUxvb3ApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgc2V0RHJpdmVyVG9Db25maWcoKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdObyBhdmFpbGFibGUgc3RvcmFnZSBtZXRob2QgZm91bmQuJyk7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX2RyaXZlclNldCA9IFByb21pc2UkMS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZHJpdmVyU2V0O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBkcml2ZXJQcm9taXNlTG9vcCgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZXJlIG1pZ2h0IGJlIGEgZHJpdmVyIGluaXRpYWxpemF0aW9uIGluIHByb2dyZXNzXG4gICAgICAgIC8vIHNvIHdhaXQgZm9yIGl0IHRvIGZpbmlzaCBpbiBvcmRlciB0byBhdm9pZCBhIHBvc3NpYmxlXG4gICAgICAgIC8vIHJhY2UgY29uZGl0aW9uIHRvIHNldCBfZGJJbmZvXG4gICAgICAgIHZhciBvbGREcml2ZXJTZXREb25lID0gdGhpcy5fZHJpdmVyU2V0ICE9PSBudWxsID8gdGhpcy5fZHJpdmVyU2V0W1wiY2F0Y2hcIl0oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UkMS5yZXNvbHZlKCk7XG4gICAgICAgIH0pIDogUHJvbWlzZSQxLnJlc29sdmUoKTtcblxuICAgICAgICB0aGlzLl9kcml2ZXJTZXQgPSBvbGREcml2ZXJTZXREb25lLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGRyaXZlck5hbWUgPSBzdXBwb3J0ZWREcml2ZXJzWzBdO1xuICAgICAgICAgICAgc2VsZi5fZGJJbmZvID0gbnVsbDtcbiAgICAgICAgICAgIHNlbGYuX3JlYWR5ID0gbnVsbDtcblxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0RHJpdmVyKGRyaXZlck5hbWUpLnRoZW4oZnVuY3Rpb24gKGRyaXZlcikge1xuICAgICAgICAgICAgICAgIHNlbGYuX2RyaXZlciA9IGRyaXZlci5fZHJpdmVyO1xuICAgICAgICAgICAgICAgIHNldERyaXZlclRvQ29uZmlnKCk7XG4gICAgICAgICAgICAgICAgc2VsZi5fd3JhcExpYnJhcnlNZXRob2RzV2l0aFJlYWR5KCk7XG4gICAgICAgICAgICAgICAgc2VsZi5faW5pdERyaXZlciA9IGluaXREcml2ZXIoc3VwcG9ydGVkRHJpdmVycyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlbXCJjYXRjaFwiXShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZXREcml2ZXJUb0NvbmZpZygpO1xuICAgICAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdObyBhdmFpbGFibGUgc3RvcmFnZSBtZXRob2QgZm91bmQuJyk7XG4gICAgICAgICAgICBzZWxmLl9kcml2ZXJTZXQgPSBQcm9taXNlJDEucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9kcml2ZXJTZXQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV4ZWN1dGVUd29DYWxsYmFja3ModGhpcy5fZHJpdmVyU2V0LCBjYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7XG4gICAgICAgIHJldHVybiB0aGlzLl9kcml2ZXJTZXQ7XG4gICAgfTtcblxuICAgIExvY2FsRm9yYWdlLnByb3RvdHlwZS5zdXBwb3J0cyA9IGZ1bmN0aW9uIHN1cHBvcnRzKGRyaXZlck5hbWUpIHtcbiAgICAgICAgcmV0dXJuICEhRHJpdmVyU3VwcG9ydFtkcml2ZXJOYW1lXTtcbiAgICB9O1xuXG4gICAgTG9jYWxGb3JhZ2UucHJvdG90eXBlLl9leHRlbmQgPSBmdW5jdGlvbiBfZXh0ZW5kKGxpYnJhcnlNZXRob2RzQW5kUHJvcGVydGllcykge1xuICAgICAgICBleHRlbmQodGhpcywgbGlicmFyeU1ldGhvZHNBbmRQcm9wZXJ0aWVzKTtcbiAgICB9O1xuXG4gICAgTG9jYWxGb3JhZ2UucHJvdG90eXBlLl9nZXRTdXBwb3J0ZWREcml2ZXJzID0gZnVuY3Rpb24gX2dldFN1cHBvcnRlZERyaXZlcnMoZHJpdmVycykge1xuICAgICAgICB2YXIgc3VwcG9ydGVkRHJpdmVycyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZHJpdmVycy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdmFyIGRyaXZlck5hbWUgPSBkcml2ZXJzW2ldO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3VwcG9ydHMoZHJpdmVyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBzdXBwb3J0ZWREcml2ZXJzLnB1c2goZHJpdmVyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cHBvcnRlZERyaXZlcnM7XG4gICAgfTtcblxuICAgIExvY2FsRm9yYWdlLnByb3RvdHlwZS5fd3JhcExpYnJhcnlNZXRob2RzV2l0aFJlYWR5ID0gZnVuY3Rpb24gX3dyYXBMaWJyYXJ5TWV0aG9kc1dpdGhSZWFkeSgpIHtcbiAgICAgICAgLy8gQWRkIGEgc3R1YiBmb3IgZWFjaCBkcml2ZXIgQVBJIG1ldGhvZCB0aGF0IGRlbGF5cyB0aGUgY2FsbCB0byB0aGVcbiAgICAgICAgLy8gY29ycmVzcG9uZGluZyBkcml2ZXIgbWV0aG9kIHVudGlsIGxvY2FsRm9yYWdlIGlzIHJlYWR5LiBUaGVzZSBzdHVic1xuICAgICAgICAvLyB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBkcml2ZXIgbWV0aG9kcyBhcyBzb29uIGFzIHRoZSBkcml2ZXIgaXNcbiAgICAgICAgLy8gbG9hZGVkLCBzbyB0aGVyZSBpcyBubyBwZXJmb3JtYW5jZSBpbXBhY3QuXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBMaWJyYXJ5TWV0aG9kcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgY2FsbFdoZW5SZWFkeSh0aGlzLCBMaWJyYXJ5TWV0aG9kc1tpXSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgTG9jYWxGb3JhZ2UucHJvdG90eXBlLmNyZWF0ZUluc3RhbmNlID0gZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2Uob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IExvY2FsRm9yYWdlKG9wdGlvbnMpO1xuICAgIH07XG5cbiAgICByZXR1cm4gTG9jYWxGb3JhZ2U7XG59KCk7XG5cbi8vIFRoZSBhY3R1YWwgbG9jYWxGb3JhZ2Ugb2JqZWN0IHRoYXQgd2UgZXhwb3NlIGFzIGEgbW9kdWxlIG9yIHZpYSBhXG4vLyBnbG9iYWwuIEl0J3MgZXh0ZW5kZWQgYnkgcHVsbGluZyBpbiBvbmUgb2Ygb3VyIG90aGVyIGxpYnJhcmllcy5cblxuXG52YXIgbG9jYWxmb3JhZ2VfanMgPSBuZXcgTG9jYWxGb3JhZ2UoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBsb2NhbGZvcmFnZV9qcztcblxufSx7XCIzXCI6M31dfSx7fSxbNF0pKDQpXG59KTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgKi9cbmltcG9ydCB7IEV2ZW50LCBFdmVudFByb2Nlc3NvciwgSHViLCBJbnRlZ3JhdGlvbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsT2JqZWN0LCBsb2dnZXIsIG5vcm1hbGl6ZSwgdXVpZDQgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCBsb2NhbEZvcmFnZSBmcm9tICdsb2NhbGZvcmFnZSc7XG5cbnR5cGUgTG9jYWxGb3JhZ2UgPSB7XG4gIHNldEl0ZW08VD4oa2V5OiBzdHJpbmcsIHZhbHVlOiBULCBjYWxsYmFjaz86IChlcnI6IGFueSwgdmFsdWU6IFQpID0+IHZvaWQpOiBQcm9taXNlPFQ+O1xuICBpdGVyYXRlPFQsIFU+KFxuICAgIGl0ZXJhdGVlOiAodmFsdWU6IFQsIGtleTogc3RyaW5nLCBpdGVyYXRpb25OdW1iZXI6IG51bWJlcikgPT4gVSxcbiAgICBjYWxsYmFjaz86IChlcnI6IGFueSwgcmVzdWx0OiBVKSA9PiB2b2lkLFxuICApOiBQcm9taXNlPFU+O1xuICByZW1vdmVJdGVtKGtleTogc3RyaW5nLCBjYWxsYmFjaz86IChlcnI6IGFueSkgPT4gdm9pZCk6IFByb21pc2U8dm9pZD47XG59O1xuXG4vKipcbiAqIGNhY2hlIG9mZmxpbmUgZXJyb3JzIGFuZCBzZW5kIHdoZW4gY29ubmVjdGVkXG4gKi9cbmV4cG9ydCBjbGFzcyBPZmZsaW5lIGltcGxlbWVudHMgSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWQ6IHN0cmluZyA9ICdPZmZsaW5lJztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmcgPSBPZmZsaW5lLmlkO1xuXG4gIC8qKlxuICAgKiB0aGUgZ2xvYmFsIGluc3RhbmNlXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwdWJsaWMgZ2xvYmFsOiBhbnk7XG5cbiAgLyoqXG4gICAqIHRoZSBjdXJyZW50IGh1YiBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIGh1Yj86IEh1YjtcblxuICAvKipcbiAgICogbWF4aW11bSBudW1iZXIgb2YgZXZlbnRzIHRvIHN0b3JlIHdoaWxlIG9mZmxpbmVcbiAgICovXG4gIHB1YmxpYyBtYXhTdG9yZWRFdmVudHM6IG51bWJlcjtcblxuICAvKipcbiAgICogZXZlbnQgY2FjaGVcbiAgICovXG4gIHB1YmxpYyBvZmZsaW5lRXZlbnRTdG9yZTogTG9jYWxGb3JhZ2U7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogeyBtYXhTdG9yZWRFdmVudHM/OiBudW1iZXIgfSA9IHt9KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICB0aGlzLmdsb2JhbCA9IGdldEdsb2JhbE9iamVjdDxhbnk+KCk7XG4gICAgdGhpcy5tYXhTdG9yZWRFdmVudHMgPSBvcHRpb25zLm1heFN0b3JlZEV2ZW50cyB8fCAzMDsgLy8gc2V0IGEgcmVhc29uYWJsZSBkZWZhdWx0XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgIHRoaXMub2ZmbGluZUV2ZW50U3RvcmUgPSBsb2NhbEZvcmFnZS5jcmVhdGVJbnN0YW5jZSh7XG4gICAgICBuYW1lOiAnc2VudHJ5L29mZmxpbmVFdmVudFN0b3JlJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldHVwT25jZShhZGRHbG9iYWxFdmVudFByb2Nlc3NvcjogKGNhbGxiYWNrOiBFdmVudFByb2Nlc3NvcikgPT4gdm9pZCwgZ2V0Q3VycmVudEh1YjogKCkgPT4gSHViKTogdm9pZCB7XG4gICAgdGhpcy5odWIgPSBnZXRDdXJyZW50SHViKCk7XG5cbiAgICBpZiAoJ2FkZEV2ZW50TGlzdGVuZXInIGluIHRoaXMuZ2xvYmFsKSB7XG4gICAgICB0aGlzLmdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdvbmxpbmUnLCAoKSA9PiB7XG4gICAgICAgIHZvaWQgdGhpcy5fc2VuZEV2ZW50cygpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2FybignY291bGQgbm90IHNlbmQgY2FjaGVkIGV2ZW50cycpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yKChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIGlmICh0aGlzLmh1YiAmJiB0aGlzLmh1Yi5nZXRJbnRlZ3JhdGlvbihPZmZsaW5lKSkge1xuICAgICAgICAvLyBjYWNoZSBpZiB3ZSBhcmUgcG9zaXRpdmVseSBvZmZsaW5lXG4gICAgICAgIGlmICgnbmF2aWdhdG9yJyBpbiB0aGlzLmdsb2JhbCAmJiAnb25MaW5lJyBpbiB0aGlzLmdsb2JhbC5uYXZpZ2F0b3IgJiYgIXRoaXMuZ2xvYmFsLm5hdmlnYXRvci5vbkxpbmUpIHtcbiAgICAgICAgICB2b2lkIHRoaXMuX2NhY2hlRXZlbnQoZXZlbnQpXG4gICAgICAgICAgICAudGhlbigoX2V2ZW50OiBFdmVudCk6IFByb21pc2U8dm9pZD4gPT4gdGhpcy5fZW5mb3JjZU1heEV2ZW50cygpKVxuICAgICAgICAgICAgLmNhdGNoKChfZXJyb3IpOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ2NvdWxkIG5vdCBjYWNoZSBldmVudCB3aGlsZSBvZmZsaW5lJyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIHJldHVybiBudWxsIG9uIHN1Y2Nlc3Mgb3IgZmFpbHVyZSwgYmVjYXVzZSBiZWluZyBvZmZsaW5lIHdpbGwgc3RpbGwgcmVzdWx0IGluIGFuIGVycm9yXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV2ZW50O1xuICAgIH0pO1xuXG4gICAgLy8gaWYgb25saW5lIG5vdywgc2VuZCBhbnkgZXZlbnRzIHN0b3JlZCBpbiBhIHByZXZpb3VzIG9mZmxpbmUgc2Vzc2lvblxuICAgIGlmICgnbmF2aWdhdG9yJyBpbiB0aGlzLmdsb2JhbCAmJiAnb25MaW5lJyBpbiB0aGlzLmdsb2JhbC5uYXZpZ2F0b3IgJiYgdGhpcy5nbG9iYWwubmF2aWdhdG9yLm9uTGluZSkge1xuICAgICAgdm9pZCB0aGlzLl9zZW5kRXZlbnRzKCkuY2F0Y2goKCkgPT4ge1xuICAgICAgICBsb2dnZXIud2FybignY291bGQgbm90IHNlbmQgY2FjaGVkIGV2ZW50cycpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGNhY2hlIGFuIGV2ZW50IHRvIHNlbmQgbGF0ZXJcbiAgICogQHBhcmFtIGV2ZW50IGFuIGV2ZW50XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9jYWNoZUV2ZW50KGV2ZW50OiBFdmVudCk6IFByb21pc2U8RXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5vZmZsaW5lRXZlbnRTdG9yZS5zZXRJdGVtPEV2ZW50Pih1dWlkNCgpLCBub3JtYWxpemUoZXZlbnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBwdXJnZSBleGNlc3MgZXZlbnRzIGlmIG5lY2Vzc2FyeVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfZW5mb3JjZU1heEV2ZW50cygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBldmVudHM6IEFycmF5PHsgZXZlbnQ6IEV2ZW50OyBjYWNoZUtleTogc3RyaW5nIH0+ID0gW107XG5cbiAgICByZXR1cm4gdGhpcy5vZmZsaW5lRXZlbnRTdG9yZVxuICAgICAgLml0ZXJhdGU8RXZlbnQsIHZvaWQ+KChldmVudDogRXZlbnQsIGNhY2hlS2V5OiBzdHJpbmcsIF9pbmRleDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIC8vIGFnZ3JlZ2F0ZSBldmVudHNcbiAgICAgICAgZXZlbnRzLnB1c2goeyBjYWNoZUtleSwgZXZlbnQgfSk7XG4gICAgICB9KVxuICAgICAgLnRoZW4oXG4gICAgICAgICgpOiBQcm9taXNlPHZvaWQ+ID0+XG4gICAgICAgICAgLy8gdGhpcyBwcm9taXNlIHJlc29sdmVzIHdoZW4gdGhlIGl0ZXJhdGlvbiBpcyBmaW5pc2hlZFxuICAgICAgICAgIHRoaXMuX3B1cmdlRXZlbnRzKFxuICAgICAgICAgICAgLy8gcHVyZ2UgYWxsIGV2ZW50cyBwYXN0IG1heFN0b3JlZEV2ZW50cyBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXJcbiAgICAgICAgICAgIGV2ZW50c1xuICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gKGIuZXZlbnQudGltZXN0YW1wIHx8IDApIC0gKGEuZXZlbnQudGltZXN0YW1wIHx8IDApKVxuICAgICAgICAgICAgICAuc2xpY2UodGhpcy5tYXhTdG9yZWRFdmVudHMgPCBldmVudHMubGVuZ3RoID8gdGhpcy5tYXhTdG9yZWRFdmVudHMgOiBldmVudHMubGVuZ3RoKVxuICAgICAgICAgICAgICAubWFwKGV2ZW50ID0+IGV2ZW50LmNhY2hlS2V5KSxcbiAgICAgICAgICApLFxuICAgICAgKVxuICAgICAgLmNhdGNoKChfZXJyb3IpOiB2b2lkID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ2NvdWxkIG5vdCBlbmZvcmNlIG1heCBldmVudHMnKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIHB1cmdlIGV2ZW50IGZyb20gY2FjaGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3B1cmdlRXZlbnQoY2FjaGVLZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLm9mZmxpbmVFdmVudFN0b3JlLnJlbW92ZUl0ZW0oY2FjaGVLZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIHB1cmdlIGV2ZW50cyBmcm9tIGNhY2hlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9wdXJnZUV2ZW50cyhjYWNoZUtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gdHJhaWwgd2l0aCAudGhlbiB0byBlbnN1cmUgdGhlIHJldHVybiB0eXBlIGFzIHZvaWQgYW5kIG5vdCB2b2lkfHZvaWRbXVxuICAgIHJldHVybiBQcm9taXNlLmFsbChjYWNoZUtleXMubWFwKGNhY2hlS2V5ID0+IHRoaXMuX3B1cmdlRXZlbnQoY2FjaGVLZXkpKSkudGhlbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIHNlbmQgYWxsIGV2ZW50c1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfc2VuZEV2ZW50cygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5vZmZsaW5lRXZlbnRTdG9yZS5pdGVyYXRlPEV2ZW50LCB2b2lkPigoZXZlbnQ6IEV2ZW50LCBjYWNoZUtleTogc3RyaW5nLCBfaW5kZXg6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgaWYgKHRoaXMuaHViKSB7XG4gICAgICAgIHRoaXMuaHViLmNhcHR1cmVFdmVudChldmVudCk7XG5cbiAgICAgICAgdm9pZCB0aGlzLl9wdXJnZUV2ZW50KGNhY2hlS2V5KS5jYXRjaCgoX2Vycm9yKTogdm9pZCA9PiB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ2NvdWxkIG5vdCBwdXJnZSBldmVudCBmcm9tIGNhY2hlJyk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ25vIGh1YiBmb3VuZCAtIGNvdWxkIG5vdCBzZW5kIGNhY2hlZCBldmVudCcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCAiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgRXZlbnRQcm9jZXNzb3IsIEh1YiwgSW50ZWdyYXRpb24gfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGdldEdsb2JhbE9iamVjdCwgc3VwcG9ydHNSZXBvcnRpbmdPYnNlcnZlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG4vKiogSlNEb2MgKi9cbmludGVyZmFjZSBSZXBvcnQge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIHR5cGU6IFJlcG9ydFR5cGVzO1xuICB1cmw6IHN0cmluZztcbiAgYm9keT86IFJlcG9ydEJvZHk7XG59XG5cbi8qKiBKU0RvYyAqL1xuY29uc3QgZW51bSBSZXBvcnRUeXBlcyB7XG4gIC8qKiBKU0RvYyAqL1xuICBDcmFzaCA9ICdjcmFzaCcsXG4gIC8qKiBKU0RvYyAqL1xuICBEZXByZWNhdGlvbiA9ICdkZXByZWNhdGlvbicsXG4gIC8qKiBKU0RvYyAqL1xuICBJbnRlcnZlbnRpb24gPSAnaW50ZXJ2ZW50aW9uJyxcbn1cblxuLyoqIEpTRG9jICovXG50eXBlIFJlcG9ydEJvZHkgPSBDcmFzaFJlcG9ydEJvZHkgfCBEZXByZWNhdGlvblJlcG9ydEJvZHkgfCBJbnRlcnZlbnRpb25SZXBvcnRCb2R5O1xuXG4vKiogSlNEb2MgKi9cbmludGVyZmFjZSBDcmFzaFJlcG9ydEJvZHkge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIGNyYXNoSWQ6IHN0cmluZztcbiAgcmVhc29uPzogc3RyaW5nO1xufVxuXG4vKiogSlNEb2MgKi9cbmludGVyZmFjZSBEZXByZWNhdGlvblJlcG9ydEJvZHkge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIGlkOiBzdHJpbmc7XG4gIGFudGljaXBhdGVkUmVtb3ZhbD86IERhdGU7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgc291cmNlRmlsZT86IHN0cmluZztcbiAgbGluZU51bWJlcj86IG51bWJlcjtcbiAgY29sdW1uTnVtYmVyPzogbnVtYmVyO1xufVxuXG4vKiogSlNEb2MgKi9cbmludGVyZmFjZSBJbnRlcnZlbnRpb25SZXBvcnRCb2R5IHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBpZDogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHNvdXJjZUZpbGU/OiBzdHJpbmc7XG4gIGxpbmVOdW1iZXI/OiBudW1iZXI7XG4gIGNvbHVtbk51bWJlcj86IG51bWJlcjtcbn1cblxuLyoqIFJlcG9ydGluZyBBUEkgaW50ZWdyYXRpb24gLSBodHRwczovL3czYy5naXRodWIuaW8vcmVwb3J0aW5nLyAqL1xuZXhwb3J0IGNsYXNzIFJlcG9ydGluZ09ic2VydmVyIGltcGxlbWVudHMgSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWQ6IHN0cmluZyA9ICdSZXBvcnRpbmdPYnNlcnZlcic7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nID0gUmVwb3J0aW5nT2JzZXJ2ZXIuaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgY3VycmVudCBodWIuXG4gICAqL1xuICBwcml2YXRlIF9nZXRDdXJyZW50SHViPzogKCkgPT4gSHViO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnM6IHtcbiAgICAgIHR5cGVzPzogUmVwb3J0VHlwZXNbXTtcbiAgICB9ID0ge1xuICAgICAgdHlwZXM6IFtSZXBvcnRUeXBlcy5DcmFzaCwgUmVwb3J0VHlwZXMuRGVwcmVjYXRpb24sIFJlcG9ydFR5cGVzLkludGVydmVudGlvbl0sXG4gICAgfSxcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldHVwT25jZShfOiAoY2FsbGJhY2s6IEV2ZW50UHJvY2Vzc29yKSA9PiB2b2lkLCBnZXRDdXJyZW50SHViOiAoKSA9PiBIdWIpOiB2b2lkIHtcbiAgICBpZiAoIXN1cHBvcnRzUmVwb3J0aW5nT2JzZXJ2ZXIoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2dldEN1cnJlbnRIdWIgPSBnZXRDdXJyZW50SHViO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IChnZXRHbG9iYWxPYmplY3Q8YW55PigpLlJlcG9ydGluZ09ic2VydmVyKSh0aGlzLmhhbmRsZXIuYmluZCh0aGlzKSwge1xuICAgICAgYnVmZmVyZWQ6IHRydWUsXG4gICAgICB0eXBlczogdGhpcy5fb3B0aW9ucy50eXBlcyxcbiAgICB9KTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICBvYnNlcnZlci5vYnNlcnZlKCk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBoYW5kbGVyKHJlcG9ydHM6IFJlcG9ydFtdKTogdm9pZCB7XG4gICAgY29uc3QgaHViID0gdGhpcy5fZ2V0Q3VycmVudEh1YiAmJiB0aGlzLl9nZXRDdXJyZW50SHViKCk7XG4gICAgaWYgKCFodWIgfHwgIWh1Yi5nZXRJbnRlZ3JhdGlvbihSZXBvcnRpbmdPYnNlcnZlcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCByZXBvcnQgb2YgcmVwb3J0cykge1xuICAgICAgaHViLndpdGhTY29wZShzY29wZSA9PiB7XG4gICAgICAgIHNjb3BlLnNldEV4dHJhKCd1cmwnLCByZXBvcnQudXJsKTtcblxuICAgICAgICBjb25zdCBsYWJlbCA9IGBSZXBvcnRpbmdPYnNlcnZlciBbJHtyZXBvcnQudHlwZX1dYDtcbiAgICAgICAgbGV0IGRldGFpbHMgPSAnTm8gZGV0YWlscyBhdmFpbGFibGUnO1xuXG4gICAgICAgIGlmIChyZXBvcnQuYm9keSkge1xuICAgICAgICAgIC8vIE9iamVjdC5rZXlzIGRvZXNuJ3Qgd29yayBvbiBSZXBvcnRCb2R5LCBhcyBhbGwgcHJvcGVydGllcyBhcmUgaW5oZWlydGVkXG4gICAgICAgICAgY29uc3QgcGxhaW5Cb2R5OiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgICAgfSA9IHt9O1xuXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGd1YXJkLWZvci1pblxuICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiByZXBvcnQuYm9keSkge1xuICAgICAgICAgICAgcGxhaW5Cb2R5W3Byb3BdID0gcmVwb3J0LmJvZHlbcHJvcF07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2NvcGUuc2V0RXh0cmEoJ2JvZHknLCBwbGFpbkJvZHkpO1xuXG4gICAgICAgICAgaWYgKHJlcG9ydC50eXBlID09PSBSZXBvcnRUeXBlcy5DcmFzaCkge1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IHJlcG9ydC5ib2R5IGFzIENyYXNoUmVwb3J0Qm9keTtcbiAgICAgICAgICAgIC8vIEEgZmFuY3kgd2F5IHRvIGNyZWF0ZSBhIG1lc3NhZ2Ugb3V0IG9mIGNyYXNoSWQgT1IgcmVhc29uIE9SIGJvdGggT1IgZmFsbGJhY2tcbiAgICAgICAgICAgIGRldGFpbHMgPSBbYm9keS5jcmFzaElkIHx8ICcnLCBib2R5LnJlYXNvbiB8fCAnJ10uam9pbignICcpLnRyaW0oKSB8fCBkZXRhaWxzO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBib2R5ID0gcmVwb3J0LmJvZHkgYXMgRGVwcmVjYXRpb25SZXBvcnRCb2R5IHwgSW50ZXJ2ZW50aW9uUmVwb3J0Qm9keTtcbiAgICAgICAgICAgIGRldGFpbHMgPSBib2R5Lm1lc3NhZ2UgfHwgZGV0YWlscztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBodWIuY2FwdHVyZU1lc3NhZ2UoYCR7bGFiZWx9OiAke2RldGFpbHN9YCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBFdmVudCwgRXZlbnRQcm9jZXNzb3IsIEh1YiwgSW50ZWdyYXRpb24sIFN0YWNrRnJhbWUsIFN0YWNrdHJhY2UgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGJhc2VuYW1lLCByZWxhdGl2ZSB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG50eXBlIFN0YWNrRnJhbWVJdGVyYXRlZSA9IChmcmFtZTogU3RhY2tGcmFtZSkgPT4gU3RhY2tGcmFtZTtcblxuLyoqIFJld3JpdGUgZXZlbnQgZnJhbWVzIHBhdGhzICovXG5leHBvcnQgY2xhc3MgUmV3cml0ZUZyYW1lcyBpbXBsZW1lbnRzIEludGVncmF0aW9uIHtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkOiBzdHJpbmcgPSAnUmV3cml0ZUZyYW1lcyc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgbmFtZTogc3RyaW5nID0gUmV3cml0ZUZyYW1lcy5pZDtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Jvb3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9wcmVmaXg6IHN0cmluZyA9ICdhcHA6Ly8vJztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiB7IHJvb3Q/OiBzdHJpbmc7IHByZWZpeD86IHN0cmluZzsgaXRlcmF0ZWU/OiBTdGFja0ZyYW1lSXRlcmF0ZWUgfSA9IHt9KSB7XG4gICAgaWYgKG9wdGlvbnMucm9vdCkge1xuICAgICAgdGhpcy5fcm9vdCA9IG9wdGlvbnMucm9vdDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMucHJlZml4KSB7XG4gICAgICB0aGlzLl9wcmVmaXggPSBvcHRpb25zLnByZWZpeDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXRlcmF0ZWUpIHtcbiAgICAgIHRoaXMuX2l0ZXJhdGVlID0gb3B0aW9ucy5pdGVyYXRlZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXR1cE9uY2UoYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3I6IChjYWxsYmFjazogRXZlbnRQcm9jZXNzb3IpID0+IHZvaWQsIGdldEN1cnJlbnRIdWI6ICgpID0+IEh1Yik6IHZvaWQge1xuICAgIGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yKGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IHNlbGYgPSBnZXRDdXJyZW50SHViKCkuZ2V0SW50ZWdyYXRpb24oUmV3cml0ZUZyYW1lcyk7XG4gICAgICBpZiAoc2VsZikge1xuICAgICAgICByZXR1cm4gc2VsZi5wcm9jZXNzKGV2ZW50KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBldmVudDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwdWJsaWMgcHJvY2VzcyhvcmlnaW5hbEV2ZW50OiBFdmVudCk6IEV2ZW50IHtcbiAgICBsZXQgcHJvY2Vzc2VkRXZlbnQgPSBvcmlnaW5hbEV2ZW50O1xuXG4gICAgaWYgKG9yaWdpbmFsRXZlbnQuZXhjZXB0aW9uICYmIEFycmF5LmlzQXJyYXkob3JpZ2luYWxFdmVudC5leGNlcHRpb24udmFsdWVzKSkge1xuICAgICAgcHJvY2Vzc2VkRXZlbnQgPSB0aGlzLl9wcm9jZXNzRXhjZXB0aW9uc0V2ZW50KHByb2Nlc3NlZEV2ZW50KTtcbiAgICB9XG5cbiAgICBpZiAob3JpZ2luYWxFdmVudC5zdGFja3RyYWNlKSB7XG4gICAgICBwcm9jZXNzZWRFdmVudCA9IHRoaXMuX3Byb2Nlc3NTdGFja3RyYWNlRXZlbnQocHJvY2Vzc2VkRXZlbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9jZXNzZWRFdmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfaXRlcmF0ZWU6IFN0YWNrRnJhbWVJdGVyYXRlZSA9IChmcmFtZTogU3RhY2tGcmFtZSkgPT4ge1xuICAgIGlmICghZnJhbWUuZmlsZW5hbWUpIHtcbiAgICAgIHJldHVybiBmcmFtZTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGZyYW1lIGZpbGVuYW1lIGJlZ2lucyB3aXRoIGAvYCBvciBhIFdpbmRvd3Mtc3R5bGUgcHJlZml4IHN1Y2ggYXMgYEM6XFxgXG4gICAgY29uc3QgaXNXaW5kb3dzRnJhbWUgPSAvXltBLVpdOlxcXFwvLnRlc3QoZnJhbWUuZmlsZW5hbWUpO1xuICAgIGNvbnN0IHN0YXJ0c1dpdGhTbGFzaCA9IC9eXFwvLy50ZXN0KGZyYW1lLmZpbGVuYW1lKTtcbiAgICBpZiAoaXNXaW5kb3dzRnJhbWUgfHwgc3RhcnRzV2l0aFNsYXNoKSB7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IGlzV2luZG93c0ZyYW1lXG4gICAgICAgID8gZnJhbWUuZmlsZW5hbWVcbiAgICAgICAgICAgIC5yZXBsYWNlKC9eW0EtWl06LywgJycpIC8vIHJlbW92ZSBXaW5kb3dzLXN0eWxlIHByZWZpeFxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFwvZywgJy8nKSAvLyByZXBsYWNlIGFsbCBgXFxcXGAgaW5zdGFuY2VzIHdpdGggYC9gXG4gICAgICAgIDogZnJhbWUuZmlsZW5hbWU7XG4gICAgICBjb25zdCBiYXNlID0gdGhpcy5fcm9vdCA/IHJlbGF0aXZlKHRoaXMuX3Jvb3QsIGZpbGVuYW1lKSA6IGJhc2VuYW1lKGZpbGVuYW1lKTtcbiAgICAgIGZyYW1lLmZpbGVuYW1lID0gYCR7dGhpcy5fcHJlZml4fSR7YmFzZX1gO1xuICAgIH1cbiAgICByZXR1cm4gZnJhbWU7XG4gIH07XG5cbiAgLyoqIEpTRG9jICovXG4gIHByaXZhdGUgX3Byb2Nlc3NFeGNlcHRpb25zRXZlbnQoZXZlbnQ6IEV2ZW50KTogRXZlbnQge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5ldmVudCxcbiAgICAgICAgZXhjZXB0aW9uOiB7XG4gICAgICAgICAgLi4uZXZlbnQuZXhjZXB0aW9uLFxuICAgICAgICAgIC8vIFRoZSBjaGVjayBmb3IgdGhpcyBpcyBwZXJmb3JtZWQgaW5zaWRlIGBwcm9jZXNzYCBjYWxsIGl0c2VsZiwgc2FmZSB0byBza2lwIGhlcmVcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICAgIHZhbHVlczogZXZlbnQuZXhjZXB0aW9uIS52YWx1ZXMhLm1hcCh2YWx1ZSA9PiAoe1xuICAgICAgICAgICAgLi4udmFsdWUsXG4gICAgICAgICAgICBzdGFja3RyYWNlOiB0aGlzLl9wcm9jZXNzU3RhY2t0cmFjZSh2YWx1ZS5zdGFja3RyYWNlKSxcbiAgICAgICAgICB9KSksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKF9vTykge1xuICAgICAgcmV0dXJuIGV2ZW50O1xuICAgIH1cbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwcml2YXRlIF9wcm9jZXNzU3RhY2t0cmFjZUV2ZW50KGV2ZW50OiBFdmVudCk6IEV2ZW50IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZXZlbnQsXG4gICAgICAgIHN0YWNrdHJhY2U6IHRoaXMuX3Byb2Nlc3NTdGFja3RyYWNlKGV2ZW50LnN0YWNrdHJhY2UpLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChfb08pIHtcbiAgICAgIHJldHVybiBldmVudDtcbiAgICB9XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHJpdmF0ZSBfcHJvY2Vzc1N0YWNrdHJhY2Uoc3RhY2t0cmFjZT86IFN0YWNrdHJhY2UpOiBTdGFja3RyYWNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhY2t0cmFjZSxcbiAgICAgIGZyYW1lczogc3RhY2t0cmFjZSAmJiBzdGFja3RyYWNlLmZyYW1lcyAmJiBzdGFja3RyYWNlLmZyYW1lcy5tYXAoZiA9PiB0aGlzLl9pdGVyYXRlZShmKSksXG4gICAgfTtcbiAgfVxufVxuIiwgImltcG9ydCB7IEV2ZW50LCBFdmVudFByb2Nlc3NvciwgSHViLCBJbnRlZ3JhdGlvbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuXG4vKiogVGhpcyBmdW5jdGlvbiBhZGRzIGR1cmF0aW9uIHNpbmNlIFNlbnRyeSB3YXMgaW5pdGlhbGl6ZWQgdGlsbCB0aGUgdGltZSBldmVudCB3YXMgc2VudCAqL1xuZXhwb3J0IGNsYXNzIFNlc3Npb25UaW1pbmcgaW1wbGVtZW50cyBJbnRlZ3JhdGlvbiB7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpZDogc3RyaW5nID0gJ1Nlc3Npb25UaW1pbmcnO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIG5hbWU6IHN0cmluZyA9IFNlc3Npb25UaW1pbmcuaWQ7XG5cbiAgLyoqIEV4YWN0IHRpbWUgQ2xpZW50IHdhcyBpbml0aWFsaXplZCBleHByZXNzZWQgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIFVuaXggRXBvY2guICovXG4gIHByb3RlY3RlZCByZWFkb25seSBfc3RhcnRUaW1lOiBudW1iZXIgPSBEYXRlLm5vdygpO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldHVwT25jZShhZGRHbG9iYWxFdmVudFByb2Nlc3NvcjogKGNhbGxiYWNrOiBFdmVudFByb2Nlc3NvcikgPT4gdm9pZCwgZ2V0Q3VycmVudEh1YjogKCkgPT4gSHViKTogdm9pZCB7XG4gICAgYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3IoZXZlbnQgPT4ge1xuICAgICAgY29uc3Qgc2VsZiA9IGdldEN1cnJlbnRIdWIoKS5nZXRJbnRlZ3JhdGlvbihTZXNzaW9uVGltaW5nKTtcbiAgICAgIGlmIChzZWxmKSB7XG4gICAgICAgIHJldHVybiBzZWxmLnByb2Nlc3MoZXZlbnQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGV2ZW50O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgcHJvY2VzcyhldmVudDogRXZlbnQpOiBFdmVudCB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5ldmVudCxcbiAgICAgIGV4dHJhOiB7XG4gICAgICAgIC4uLmV2ZW50LmV4dHJhLFxuICAgICAgICBbJ3Nlc3Npb246c3RhcnQnXTogdGhpcy5fc3RhcnRUaW1lLFxuICAgICAgICBbJ3Nlc3Npb246ZHVyYXRpb24nXTogbm93IC0gdGhpcy5fc3RhcnRUaW1lLFxuICAgICAgICBbJ3Nlc3Npb246ZW5kJ106IG5vdyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIiwgImltcG9ydCB7IEV2ZW50LCBFdmVudFByb2Nlc3NvciwgSHViLCBJbnRlZ3JhdGlvbiwgU3RhY2tGcmFtZSB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuXG4vKiogQWRkIG5vZGUgdHJhbnNhY3Rpb24gdG8gdGhlIGV2ZW50ICovXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb24gaW1wbGVtZW50cyBJbnRlZ3JhdGlvbiB7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpZDogc3RyaW5nID0gJ1RyYW5zYWN0aW9uJztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBUcmFuc2FjdGlvbi5pZDtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXR1cE9uY2UoYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3I6IChjYWxsYmFjazogRXZlbnRQcm9jZXNzb3IpID0+IHZvaWQsIGdldEN1cnJlbnRIdWI6ICgpID0+IEh1Yik6IHZvaWQge1xuICAgIGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yKGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IHNlbGYgPSBnZXRDdXJyZW50SHViKCkuZ2V0SW50ZWdyYXRpb24oVHJhbnNhY3Rpb24pO1xuICAgICAgaWYgKHNlbGYpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYucHJvY2VzcyhldmVudCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBwcm9jZXNzKGV2ZW50OiBFdmVudCk6IEV2ZW50IHtcbiAgICBjb25zdCBmcmFtZXMgPSB0aGlzLl9nZXRGcmFtZXNGcm9tRXZlbnQoZXZlbnQpO1xuXG4gICAgLy8gdXNlIGZvciBsb29wIHNvIHdlIGRvbid0IGhhdmUgdG8gcmV2ZXJzZSB3aG9sZSBmcmFtZXMgYXJyYXlcbiAgICBmb3IgKGxldCBpID0gZnJhbWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBmcmFtZSA9IGZyYW1lc1tpXTtcblxuICAgICAgaWYgKGZyYW1lLmluX2FwcCA9PT0gdHJ1ZSkge1xuICAgICAgICBldmVudC50cmFuc2FjdGlvbiA9IHRoaXMuX2dldFRyYW5zYWN0aW9uKGZyYW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGV2ZW50O1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHByaXZhdGUgX2dldEZyYW1lc0Zyb21FdmVudChldmVudDogRXZlbnQpOiBTdGFja0ZyYW1lW10ge1xuICAgIGNvbnN0IGV4Y2VwdGlvbiA9IGV2ZW50LmV4Y2VwdGlvbiAmJiBldmVudC5leGNlcHRpb24udmFsdWVzICYmIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF07XG4gICAgcmV0dXJuIChleGNlcHRpb24gJiYgZXhjZXB0aW9uLnN0YWNrdHJhY2UgJiYgZXhjZXB0aW9uLnN0YWNrdHJhY2UuZnJhbWVzKSB8fCBbXTtcbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwcml2YXRlIF9nZXRUcmFuc2FjdGlvbihmcmFtZTogU3RhY2tGcmFtZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZyYW1lLm1vZHVsZSB8fCBmcmFtZS5mdW5jdGlvbiA/IGAke2ZyYW1lLm1vZHVsZSB8fCAnPyd9LyR7ZnJhbWUuZnVuY3Rpb24gfHwgJz8nfWAgOiAnPHVua25vd24+JztcbiAgfVxufVxuIiwgIi8qIGVzbGludC1kaXNhYmxlIG1heC1saW5lcyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgRXZlbnRQcm9jZXNzb3IsIEh1YiwgSW50ZWdyYXRpb24sIEludGVncmF0aW9uQ2xhc3MsIFNjb3BlLCBTcGFuLCBUcmFuc2FjdGlvbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgYmFzZW5hbWUsIGdldEdsb2JhbE9iamVjdCwgbG9nZ2VyLCB0aW1lc3RhbXBXaXRoTXMgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuLyoqXG4gKiBVc2VkIHRvIGV4dHJhY3QgVHJhY2luZyBpbnRlZ3JhdGlvbiBmcm9tIHRoZSBjdXJyZW50IGNsaWVudCxcbiAqIHdpdGhvdXQgdGhlIG5lZWQgdG8gaW1wb3J0IGBUcmFjaW5nYCBpdHNlbGYgZnJvbSB0aGUgQHNlbnRyeS9hcG0gcGFja2FnZS5cbiAqIEBkZXByZWNhdGVkIGFzIEBzZW50cnkvdHJhY2luZyBzaG91bGQgYmUgdXNlZCBvdmVyIEBzZW50cnkvYXBtLlxuICovXG5jb25zdCBUUkFDSU5HX0dFVFRFUiA9ICh7XG4gIGlkOiAnVHJhY2luZycsXG59IGFzIGFueSkgYXMgSW50ZWdyYXRpb25DbGFzczxJbnRlZ3JhdGlvbj47XG5cbi8qKlxuICogVXNlZCB0byBleHRyYWN0IEJyb3dzZXJUcmFjaW5nIGludGVncmF0aW9uIGZyb20gQHNlbnRyeS90cmFjaW5nXG4gKi9cbmNvbnN0IEJST1dTRVJfVFJBQ0lOR19HRVRURVIgPSAoe1xuICBpZDogJ0Jyb3dzZXJUcmFjaW5nJyxcbn0gYXMgYW55KSBhcyBJbnRlZ3JhdGlvbkNsYXNzPEludGVncmF0aW9uPjtcblxuY29uc3QgVlVFX09QID0gJ3VpLnZ1ZSc7XG5cbi8qKiBHbG9iYWwgVnVlIG9iamVjdCBsaW1pdGVkIHRvIHRoZSBtZXRob2RzL2F0dHJpYnV0ZXMgd2UgcmVxdWlyZSAqL1xuaW50ZXJmYWNlIFZ1ZUluc3RhbmNlIHtcbiAgY29uZmlnOiB7XG4gICAgZXJyb3JIYW5kbGVyPyhlcnJvcjogRXJyb3IsIHZtPzogVmlld01vZGVsLCBpbmZvPzogc3RyaW5nKTogdm9pZDtcbiAgfTtcbiAgdXRpbD86IHtcbiAgICB3YXJuKC4uLmlucHV0OiBhbnkpOiB2b2lkO1xuICB9O1xuICBtaXhpbihob29rczogeyBba2V5OiBzdHJpbmddOiAoKSA9PiB2b2lkIH0pOiB2b2lkO1xufVxuXG4vKiogUmVwcmVzZW50YXRpb24gb2YgVnVlIGNvbXBvbmVudCBpbnRlcm5hbHMgKi9cbmludGVyZmFjZSBWaWV3TW9kZWwge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG4gICRyb290OiBvYmplY3Q7XG4gICRvcHRpb25zOiB7XG4gICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgcHJvcHNEYXRhPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbiAgICBfY29tcG9uZW50VGFnPzogc3RyaW5nO1xuICAgIF9fZmlsZT86IHN0cmluZztcbiAgICAkX3NlbnRyeVBlcmZIb29rPzogYm9vbGVhbjtcbiAgfTtcbiAgJG9uY2UoaG9vazogc3RyaW5nLCBjYjogKCkgPT4gdm9pZCk6IHZvaWQ7XG59XG5cbi8qKiBWdWUgSW50ZWdyYXRpb24gY29uZmlndXJhdGlvbiAqL1xuaW50ZXJmYWNlIEludGVncmF0aW9uT3B0aW9ucyB7XG4gIC8qKiBWdWUgaW5zdGFuY2UgdG8gYmUgdXNlZCBpbnNpZGUgdGhlIGludGVncmF0aW9uICovXG4gIFZ1ZTogVnVlSW5zdGFuY2U7XG5cbiAgLyoqXG4gICAqIFdoZW4gc2V0IHRvIGBmYWxzZWAsIFNlbnRyeSB3aWxsIHN1cHByZXNzIHJlcG9ydGluZyBvZiBhbGwgcHJvcHMgZGF0YVxuICAgKiBmcm9tIHlvdXIgVnVlIGNvbXBvbmVudHMgZm9yIHByaXZhY3kgY29uY2VybnMuXG4gICAqL1xuICBhdHRhY2hQcm9wczogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoZW4gc2V0IHRvIGB0cnVlYCwgb3JpZ2luYWwgVnVlJ3MgYGxvZ0Vycm9yYCB3aWxsIGJlIGNhbGxlZCBhcyB3ZWxsLlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlL2Jsb2IvYzJiMWNmZTljY2QwODgzNWYyZDk5ZjZjZTYwZjY3YjRkZTU1MTg3Zi9zcmMvY29yZS91dGlsL2Vycm9yLmpzI0wzOC1MNDhcbiAgICovXG4gIGxvZ0Vycm9yczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hlbiBzZXQgdG8gYHRydWVgLCBlbmFibGVzIHRyYWNraW5nIG9mIGNvbXBvbmVudHMgbGlmZWN5Y2xlIHBlcmZvcm1hbmNlLlxuICAgKiBJdCByZXF1aXJlcyBgVHJhY2luZ2AgaW50ZWdyYXRpb24gdG8gYmUgYWxzbyBlbmFibGVkLlxuICAgKi9cbiAgdHJhY2luZzogYm9vbGVhbjtcblxuICAvKioge0BsaW5rIFRyYWNpbmdPcHRpb25zfSAqL1xuICB0cmFjaW5nT3B0aW9uczogVHJhY2luZ09wdGlvbnM7XG59XG5cbi8qKiBWdWUgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmb3IgVHJhY2luZyBJbnRlZ3JhdGlvbiAgKi9cbmludGVyZmFjZSBUcmFjaW5nT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgdG8gdHJhY2sgY29tcG9uZW50cyBieSBob29raW5nIGludG8gaXRzIGxpZmVjeWNsZSBtZXRob2RzLlxuICAgKiBDYW4gYmUgZWl0aGVyIHNldCB0byBgYm9vbGVhbmAgdG8gZW5hYmxlL2Rpc2FibGUgdHJhY2tpbmcgZm9yIGFsbCBvZiB0aGVtLlxuICAgKiBPciB0byBhbiBhcnJheSBvZiBzcGVjaWZpYyBjb21wb25lbnQgbmFtZXMgKGNhc2Utc2Vuc2l0aXZlKS5cbiAgICovXG4gIHRyYWNrQ29tcG9uZW50czogYm9vbGVhbiB8IHN0cmluZ1tdO1xuICAvKiogSG93IGxvbmcgdG8gd2FpdCB1bnRpbCB0aGUgdHJhY2tlZCByb290IGFjdGl2aXR5IGlzIG1hcmtlZCBhcyBmaW5pc2hlZCBhbmQgc2VudCBvZiB0byBTZW50cnkgKi9cbiAgdGltZW91dDogbnVtYmVyO1xuICAvKipcbiAgICogTGlzdCBvZiBob29rcyB0byBrZWVwIHRyYWNrIG9mIGR1cmluZyBjb21wb25lbnQgbGlmZWN5Y2xlLlxuICAgKiBBdmFpbGFibGUgaG9va3M6ICdhY3RpdmF0ZScgfCAnY3JlYXRlJyB8ICdkZXN0cm95JyB8ICdtb3VudCcgfCAndXBkYXRlJ1xuICAgKiBCYXNlZCBvbiBodHRwczovL3Z1ZWpzLm9yZy92Mi9hcGkvI09wdGlvbnMtTGlmZWN5Y2xlLUhvb2tzXG4gICAqL1xuICBob29rczogT3BlcmF0aW9uW107XG59XG5cbi8qKiBPcHRpb25hbCBtZXRhZGF0YSBhdHRhY2hlZCB0byBTZW50cnkgRXZlbnQgKi9cbmludGVyZmFjZSBNZXRhZGF0YSB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbiAgY29tcG9uZW50TmFtZT86IHN0cmluZztcbiAgcHJvcHNEYXRhPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbiAgbGlmZWN5Y2xlSG9vaz86IHN0cmluZztcbn1cblxuLy8gaHR0cHM6Ly92dWVqcy5vcmcvdjIvYXBpLyNPcHRpb25zLUxpZmVjeWNsZS1Ib29rc1xudHlwZSBIb29rID1cbiAgfCAnYWN0aXZhdGVkJ1xuICB8ICdiZWZvcmVDcmVhdGUnXG4gIHwgJ2JlZm9yZURlc3Ryb3knXG4gIHwgJ2JlZm9yZU1vdW50J1xuICB8ICdiZWZvcmVVcGRhdGUnXG4gIHwgJ2NyZWF0ZWQnXG4gIHwgJ2RlYWN0aXZhdGVkJ1xuICB8ICdkZXN0cm95ZWQnXG4gIHwgJ21vdW50ZWQnXG4gIHwgJ3VwZGF0ZWQnO1xuXG50eXBlIE9wZXJhdGlvbiA9ICdhY3RpdmF0ZScgfCAnY3JlYXRlJyB8ICdkZXN0cm95JyB8ICdtb3VudCcgfCAndXBkYXRlJztcblxuLy8gTWFwcGluZ3MgZnJvbSBvcGVyYXRpb24gdG8gY29ycmVzcG9uZGluZyBsaWZlY3ljbGUgaG9vay5cbmNvbnN0IEhPT0tTOiB7IFtrZXkgaW4gT3BlcmF0aW9uXTogSG9va1tdIH0gPSB7XG4gIGFjdGl2YXRlOiBbJ2FjdGl2YXRlZCcsICdkZWFjdGl2YXRlZCddLFxuICBjcmVhdGU6IFsnYmVmb3JlQ3JlYXRlJywgJ2NyZWF0ZWQnXSxcbiAgZGVzdHJveTogWydiZWZvcmVEZXN0cm95JywgJ2Rlc3Ryb3llZCddLFxuICBtb3VudDogWydiZWZvcmVNb3VudCcsICdtb3VudGVkJ10sXG4gIHVwZGF0ZTogWydiZWZvcmVVcGRhdGUnLCAndXBkYXRlZCddLFxufTtcblxuY29uc3QgQ09NUE9ORU5UX05BTUVfUkVHRVhQID0gLyg/Ol58Wy1fL10pKFxcdykvZztcbmNvbnN0IFJPT1RfQ09NUE9ORU5UX05BTUUgPSAncm9vdCc7XG5jb25zdCBBTk9OWU1PVVNfQ09NUE9ORU5UX05BTUUgPSAnYW5vbnltb3VzIGNvbXBvbmVudCc7XG5cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGNsYXNzIFZ1ZSBpbXBsZW1lbnRzIEludGVncmF0aW9uIHtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkOiBzdHJpbmcgPSAnVnVlJztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBWdWUuaWQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uczogSW50ZWdyYXRpb25PcHRpb25zO1xuXG4gIC8qKlxuICAgKiBDYWNoZSBob2xkaW5nIGFscmVhZHkgcHJvY2Vzc2VkIGNvbXBvbmVudCBuYW1lc1xuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfY29tcG9uZW50c0NhY2hlOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gIHByaXZhdGUgX3Jvb3RTcGFuPzogU3BhbjtcbiAgcHJpdmF0ZSBfcm9vdFNwYW5UaW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBwcml2YXRlIF90cmFjaW5nQWN0aXZpdHk/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgb3B0aW9uczogUGFydGlhbDxPbWl0PEludGVncmF0aW9uT3B0aW9ucywgJ3RyYWNpbmdPcHRpb25zJz4gJiB7IHRyYWNpbmdPcHRpb25zOiBQYXJ0aWFsPFRyYWNpbmdPcHRpb25zPiB9PixcbiAgKSB7XG4gICAgbG9nZ2VyLmxvZygnWW91IGFyZSBzdGlsbCB1c2luZyB0aGUgVnVlLmpzIGludGVncmF0aW9uLCBjb25zaWRlciBtb3ZpbmcgdG8gQHNlbnRyeS92dWUnKTtcbiAgICB0aGlzLl9vcHRpb25zID0ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgVnVlOiBnZXRHbG9iYWxPYmplY3Q8YW55PigpLlZ1ZSxcbiAgICAgIGF0dGFjaFByb3BzOiB0cnVlLFxuICAgICAgbG9nRXJyb3JzOiBmYWxzZSxcbiAgICAgIHRyYWNpbmc6IGZhbHNlLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHRyYWNpbmdPcHRpb25zOiB7XG4gICAgICAgIGhvb2tzOiBbJ21vdW50JywgJ3VwZGF0ZSddLFxuICAgICAgICB0aW1lb3V0OiAyMDAwLFxuICAgICAgICB0cmFja0NvbXBvbmVudHM6IGZhbHNlLFxuICAgICAgICAuLi5vcHRpb25zLnRyYWNpbmdPcHRpb25zLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0dXBPbmNlKF86IChjYWxsYmFjazogRXZlbnRQcm9jZXNzb3IpID0+IHZvaWQsIGdldEN1cnJlbnRIdWI6ICgpID0+IEh1Yik6IHZvaWQge1xuICAgIGlmICghdGhpcy5fb3B0aW9ucy5WdWUpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignVnVlIGludGVncmF0aW9uIGlzIG1pc3NpbmcgYSBWdWUgaW5zdGFuY2UnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9hdHRhY2hFcnJvckhhbmRsZXIoZ2V0Q3VycmVudEh1Yik7XG5cbiAgICBpZiAodGhpcy5fb3B0aW9ucy50cmFjaW5nKSB7XG4gICAgICB0aGlzLl9zdGFydFRyYWNpbmcoZ2V0Q3VycmVudEh1Yik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgY29tcG9uZW50IG5hbWUgZnJvbSB0aGUgVmlld01vZGVsXG4gICAqL1xuICBwcml2YXRlIF9nZXRDb21wb25lbnROYW1lKHZtOiBWaWV3TW9kZWwpOiBzdHJpbmcge1xuICAgIC8vIFN1Y2ggbGV2ZWwgb2YgZ3JhbnVsYXJpdHkgaXMgbW9zdCBsaWtlbHkgbm90IG5lY2Vzc2FyeSwgYnV0IGJldHRlciBzYWZlIHRoYW4gc29ycnkuIFx1MjAxNCBLYW1pbFxuICAgIGlmICghdm0pIHtcbiAgICAgIHJldHVybiBBTk9OWU1PVVNfQ09NUE9ORU5UX05BTUU7XG4gICAgfVxuXG4gICAgaWYgKHZtLiRyb290ID09PSB2bSkge1xuICAgICAgcmV0dXJuIFJPT1RfQ09NUE9ORU5UX05BTUU7XG4gICAgfVxuXG4gICAgaWYgKCF2bS4kb3B0aW9ucykge1xuICAgICAgcmV0dXJuIEFOT05ZTU9VU19DT01QT05FTlRfTkFNRTtcbiAgICB9XG5cbiAgICBpZiAodm0uJG9wdGlvbnMubmFtZSkge1xuICAgICAgcmV0dXJuIHZtLiRvcHRpb25zLm5hbWU7XG4gICAgfVxuXG4gICAgaWYgKHZtLiRvcHRpb25zLl9jb21wb25lbnRUYWcpIHtcbiAgICAgIHJldHVybiB2bS4kb3B0aW9ucy5fY29tcG9uZW50VGFnO1xuICAgIH1cblxuICAgIC8vIGluamVjdGVkIGJ5IHZ1ZS1sb2FkZXJcbiAgICBpZiAodm0uJG9wdGlvbnMuX19maWxlKSB7XG4gICAgICBjb25zdCB1bmlmaWVkRmlsZSA9IHZtLiRvcHRpb25zLl9fZmlsZS5yZXBsYWNlKC9eW2EtekEtWl06LywgJycpLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gYmFzZW5hbWUodW5pZmllZEZpbGUsICcudnVlJyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLl9jb21wb25lbnRzQ2FjaGVbZmlsZW5hbWVdIHx8XG4gICAgICAgICh0aGlzLl9jb21wb25lbnRzQ2FjaGVbZmlsZW5hbWVdID0gZmlsZW5hbWUucmVwbGFjZShDT01QT05FTlRfTkFNRV9SRUdFWFAsIChfLCBjOiBzdHJpbmcpID0+XG4gICAgICAgICAgYyA/IGMudG9VcHBlckNhc2UoKSA6ICcnLFxuICAgICAgICApKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gQU5PTllNT1VTX0NPTVBPTkVOVF9OQU1FO1xuICB9XG5cbiAgLyoqIEtlZXAgaXQgYXMgYXR0cmlidXRlIGZ1bmN0aW9uLCB0byBrZWVwIGNvcnJlY3QgYHRoaXNgIGJpbmRpbmcgaW5zaWRlIHRoZSBob29rcyBjYWxsYmFja3MgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvdHlwZWRlZlxuICBwcml2YXRlIHJlYWRvbmx5IF9hcHBseVRyYWNpbmdIb29rcyA9ICh2bTogVmlld01vZGVsLCBnZXRDdXJyZW50SHViOiAoKSA9PiBIdWIpOiB2b2lkID0+IHtcbiAgICAvLyBEb24ndCBhdHRhY2ggdHdpY2UsIGp1c3QgaW4gY2FzZVxuICAgIGlmICh2bS4kb3B0aW9ucy4kX3NlbnRyeVBlcmZIb29rKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZtLiRvcHRpb25zLiRfc2VudHJ5UGVyZkhvb2sgPSB0cnVlO1xuXG4gICAgY29uc3QgbmFtZSA9IHRoaXMuX2dldENvbXBvbmVudE5hbWUodm0pO1xuICAgIGNvbnN0IHJvb3RNb3VudCA9IG5hbWUgPT09IFJPT1RfQ09NUE9ORU5UX05BTUU7XG4gICAgY29uc3Qgc3BhbnM6IHsgW2tleTogc3RyaW5nXTogU3BhbiB9ID0ge307XG5cbiAgICAvLyBSZW5kZXIgaG9vayBzdGFydHMgYWZ0ZXIgb25jZSBldmVudCBpcyBlbWl0dGVkLFxuICAgIC8vIGJ1dCBpdCBlbmRzIGJlZm9yZSB0aGUgc2Vjb25kIGV2ZW50IG9mIHRoZSBzYW1lIHR5cGUuXG4gICAgLy9cbiAgICAvLyBCZWNhdXNlIG9mIHRoaXMsIHdlIHN0YXJ0IG1lYXN1cmluZyBpbnNpZGUgdGhlIGZpcnN0IGV2ZW50LFxuICAgIC8vIGJ1dCBmaW5pc2ggaXQgYmVmb3JlIGl0IHRyaWdnZXJzLCB0byBza2lwIHRoZSBldmVudCBlbWl0dGVyIHRpbWluZyBpdHNlbGYuXG4gICAgY29uc3Qgcm9vdEhhbmRsZXIgPSAoaG9vazogSG9vayk6IHZvaWQgPT4ge1xuICAgICAgY29uc3Qgbm93ID0gdGltZXN0YW1wV2l0aE1zKCk7XG5cbiAgICAgIC8vIE9uIHRoZSBmaXJzdCBoYW5kbGVyIGNhbGwgKGJlZm9yZSksIGl0J2xsIGJlIHVuZGVmaW5lZCwgYXMgYCRvbmNlYCB3aWxsIGFkZCBpdCBpbiB0aGUgZnV0dXJlLlxuICAgICAgLy8gSG93ZXZlciwgb24gdGhlIHNlY29uZCBjYWxsIChhZnRlciksIGl0J2xsIGJlIGFscmVhZHkgaW4gcGxhY2UuXG4gICAgICBpZiAodGhpcy5fcm9vdFNwYW4pIHtcbiAgICAgICAgdGhpcy5fZmluaXNoUm9vdFNwYW4obm93LCBnZXRDdXJyZW50SHViKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZtLiRvbmNlKGBob29rOiR7aG9va31gLCAoKSA9PiB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGFuIGFjdGl2aXR5IG9uIHRoZSBmaXJzdCBldmVudCBjYWxsLiBUaGVyZSdsbCBiZSBubyBzZWNvbmQgY2FsbCwgYXMgcm9vdFNwYW4gd2lsbCBiZSBpbiBwbGFjZSxcbiAgICAgICAgICAvLyB0aHVzIG5ldyBldmVudCBoYW5kbGVyIHdvbid0IGJlIGF0dGFjaGVkLlxuXG4gICAgICAgICAgLy8gV2UgZG8gdGhpcyB3aG9sZSBkYW5jZSB3aXRoIGBUUkFDSU5HX0dFVFRFUmAgdG8gcHJldmVudCBgQHNlbnRyeS9hcG1gIGZyb20gYmVjb21pbmcgYSBwZWVyRGVwZW5kZW5jeS5cbiAgICAgICAgICAvLyBXZSBhbHNvIG5lZWQgdG8gYXNrIGZvciB0aGUgYC5jb25zdHJ1Y3RvcmAsIGFzIGBwdXNoQWN0aXZpdHlgIGFuZCBgcG9wQWN0aXZpdHlgIGFyZSBzdGF0aWMsIG5vdCBpbnN0YW5jZSBtZXRob2RzLlxuICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuICAgICAgICAgIGNvbnN0IHRyYWNpbmdJbnRlZ3JhdGlvbiA9IGdldEN1cnJlbnRIdWIoKS5nZXRJbnRlZ3JhdGlvbihUUkFDSU5HX0dFVFRFUik7XG4gICAgICAgICAgaWYgKHRyYWNpbmdJbnRlZ3JhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fdHJhY2luZ0FjdGl2aXR5ID0gKHRyYWNpbmdJbnRlZ3JhdGlvbiBhcyBhbnkpLmNvbnN0cnVjdG9yLnB1c2hBY3Rpdml0eSgnVnVlIEFwcGxpY2F0aW9uIFJlbmRlcicpO1xuICAgICAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSAodHJhY2luZ0ludGVncmF0aW9uIGFzIGFueSkuY29uc3RydWN0b3IuZ2V0VHJhbnNhY3Rpb24oKTtcbiAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvbikge1xuICAgICAgICAgICAgICB0aGlzLl9yb290U3BhbiA9IHRyYW5zYWN0aW9uLnN0YXJ0Q2hpbGQoe1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnQXBwbGljYXRpb24gUmVuZGVyJyxcbiAgICAgICAgICAgICAgICBvcDogVlVFX09QLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFVzZSBmdW5jdGlvbmFsaXR5IGZyb20gQHNlbnRyeS90cmFjaW5nXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZVRyYW5zYWN0aW9uID0gZ2V0QWN0aXZlVHJhbnNhY3Rpb24oZ2V0Q3VycmVudEh1YigpKTtcbiAgICAgICAgICAgIGlmIChhY3RpdmVUcmFuc2FjdGlvbikge1xuICAgICAgICAgICAgICB0aGlzLl9yb290U3BhbiA9IGFjdGl2ZVRyYW5zYWN0aW9uLnN0YXJ0Q2hpbGQoe1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnQXBwbGljYXRpb24gUmVuZGVyJyxcbiAgICAgICAgICAgICAgICBvcDogVlVFX09QLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgKi9cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGNoaWxkSGFuZGxlciA9IChob29rOiBIb29rLCBvcGVyYXRpb246IE9wZXJhdGlvbik6IHZvaWQgPT4ge1xuICAgICAgLy8gU2tpcCBjb21wb25lbnRzIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byB0cmFjayB0byBtaW5pbWl6ZSB0aGUgbm9pc2UgYW5kIGdpdmUgYSBtb3JlIGdyYW51bGFyIGNvbnRyb2wgdG8gdGhlIHVzZXJcbiAgICAgIGNvbnN0IHNob3VsZFRyYWNrID0gQXJyYXkuaXNBcnJheSh0aGlzLl9vcHRpb25zLnRyYWNpbmdPcHRpb25zLnRyYWNrQ29tcG9uZW50cylcbiAgICAgICAgPyB0aGlzLl9vcHRpb25zLnRyYWNpbmdPcHRpb25zLnRyYWNrQ29tcG9uZW50cy5pbmRleE9mKG5hbWUpID4gLTFcbiAgICAgICAgOiB0aGlzLl9vcHRpb25zLnRyYWNpbmdPcHRpb25zLnRyYWNrQ29tcG9uZW50cztcblxuICAgICAgaWYgKCF0aGlzLl9yb290U3BhbiB8fCAhc2hvdWxkVHJhY2spIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBub3cgPSB0aW1lc3RhbXBXaXRoTXMoKTtcbiAgICAgIGNvbnN0IHNwYW4gPSBzcGFuc1tvcGVyYXRpb25dO1xuXG4gICAgICAvLyBPbiB0aGUgZmlyc3QgaGFuZGxlciBjYWxsIChiZWZvcmUpLCBpdCdsbCBiZSB1bmRlZmluZWQsIGFzIGAkb25jZWAgd2lsbCBhZGQgaXQgaW4gdGhlIGZ1dHVyZS5cbiAgICAgIC8vIEhvd2V2ZXIsIG9uIHRoZSBzZWNvbmQgY2FsbCAoYWZ0ZXIpLCBpdCdsbCBiZSBhbHJlYWR5IGluIHBsYWNlLlxuICAgICAgaWYgKHNwYW4pIHtcbiAgICAgICAgc3Bhbi5maW5pc2goKTtcbiAgICAgICAgdGhpcy5fZmluaXNoUm9vdFNwYW4obm93LCBnZXRDdXJyZW50SHViKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZtLiRvbmNlKGBob29rOiR7aG9va31gLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuX3Jvb3RTcGFuKSB7XG4gICAgICAgICAgICBzcGFuc1tvcGVyYXRpb25dID0gdGhpcy5fcm9vdFNwYW4uc3RhcnRDaGlsZCh7XG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgVnVlIDwke25hbWV9PmAsXG4gICAgICAgICAgICAgIG9wOiBgJHtWVUVfT1B9LiR7b3BlcmF0aW9ufWAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBFYWNoIGNvbXBvbmVudCBoYXMgaXQncyBvd24gc2NvcGUsIHNvIGFsbCBhY3Rpdml0aWVzIGFyZSBvbmx5IHJlbGF0ZWQgdG8gb25lIG9mIHRoZW1cbiAgICB0aGlzLl9vcHRpb25zLnRyYWNpbmdPcHRpb25zLmhvb2tzLmZvckVhY2gob3BlcmF0aW9uID0+IHtcbiAgICAgIC8vIFJldHJpZXZlIGNvcnJlc3BvbmRpbmcgaG9va3MgZnJvbSBWdWUgbGlmZWN5Y2xlLlxuICAgICAgLy8gZWcuIG1vdW50ID0+IFsnYmVmb3JlTW91bnQnLCAnbW91bnRlZCddXG4gICAgICBjb25zdCBpbnRlcm5hbEhvb2tzID0gSE9PS1Nbb3BlcmF0aW9uXTtcblxuICAgICAgaWYgKCFpbnRlcm5hbEhvb2tzKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBVbmtub3duIGhvb2s6ICR7b3BlcmF0aW9ufWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGludGVybmFsSG9va3MuZm9yRWFjaChpbnRlcm5hbEhvb2sgPT4ge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gcm9vdE1vdW50XG4gICAgICAgICAgPyByb290SGFuZGxlci5iaW5kKHRoaXMsIGludGVybmFsSG9vaylcbiAgICAgICAgICA6IGNoaWxkSGFuZGxlci5iaW5kKHRoaXMsIGludGVybmFsSG9vaywgb3BlcmF0aW9uKTtcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdm0uJG9wdGlvbnNbaW50ZXJuYWxIb29rXTtcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50VmFsdWUpKSB7XG4gICAgICAgICAgdm0uJG9wdGlvbnNbaW50ZXJuYWxIb29rXSA9IFtoYW5kbGVyLCAuLi5jdXJyZW50VmFsdWVdO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjdXJyZW50VmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2bS4kb3B0aW9uc1tpbnRlcm5hbEhvb2tdID0gW2hhbmRsZXIsIGN1cnJlbnRWYWx1ZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdm0uJG9wdGlvbnNbaW50ZXJuYWxIb29rXSA9IFtoYW5kbGVyXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqIEZpbmlzaCB0b3AtbGV2ZWwgc3BhbiBhbmQgYWN0aXZpdHkgd2l0aCBhIGRlYm91bmNlIGNvbmZpZ3VyZWQgdXNpbmcgYHRpbWVvdXRgIG9wdGlvbiAqL1xuICBwcml2YXRlIF9maW5pc2hSb290U3Bhbih0aW1lc3RhbXA6IG51bWJlciwgZ2V0Q3VycmVudEh1YjogKCkgPT4gSHViKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Jvb3RTcGFuVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9yb290U3BhblRpbWVyKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yb290U3BhblRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fdHJhY2luZ0FjdGl2aXR5KSB7XG4gICAgICAgIC8vIFdlIGRvIHRoaXMgd2hvbGUgZGFuY2Ugd2l0aCBgVFJBQ0lOR19HRVRURVJgIHRvIHByZXZlbnQgYEBzZW50cnkvYXBtYCBmcm9tIGJlY29taW5nIGEgcGVlckRlcGVuZGVuY3kuXG4gICAgICAgIC8vIFdlIGFsc28gbmVlZCB0byBhc2sgZm9yIHRoZSBgLmNvbnN0cnVjdG9yYCwgYXMgYHB1c2hBY3Rpdml0eWAgYW5kIGBwb3BBY3Rpdml0eWAgYXJlIHN0YXRpYywgbm90IGluc3RhbmNlIG1ldGhvZHMuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuICAgICAgICBjb25zdCB0cmFjaW5nSW50ZWdyYXRpb24gPSBnZXRDdXJyZW50SHViKCkuZ2V0SW50ZWdyYXRpb24oVFJBQ0lOR19HRVRURVIpO1xuICAgICAgICBpZiAodHJhY2luZ0ludGVncmF0aW9uKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICAgICh0cmFjaW5nSW50ZWdyYXRpb24gYXMgYW55KS5jb25zdHJ1Y3Rvci5wb3BBY3Rpdml0eSh0aGlzLl90cmFjaW5nQWN0aXZpdHkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFdlIHNob3VsZCBhbHdheXMgZmluaXNoIHRoZSBzcGFuLCBvbmx5IHNob3VsZCBwb3AgYWN0aXZpdHkgaWYgdXNpbmcgQHNlbnRyeS9hcG1cbiAgICAgIGlmICh0aGlzLl9yb290U3Bhbikge1xuICAgICAgICB0aGlzLl9yb290U3Bhbi5maW5pc2godGltZXN0YW1wKTtcbiAgICAgIH1cbiAgICB9LCB0aGlzLl9vcHRpb25zLnRyYWNpbmdPcHRpb25zLnRpbWVvdXQpO1xuICB9XG5cbiAgLyoqIEluamVjdCBjb25maWd1cmVkIHRyYWNpbmcgaG9va3MgaW50byBWdWUncyBjb21wb25lbnQgbGlmZWN5Y2xlcyAqL1xuICBwcml2YXRlIF9zdGFydFRyYWNpbmcoZ2V0Q3VycmVudEh1YjogKCkgPT4gSHViKTogdm9pZCB7XG4gICAgY29uc3QgYXBwbHlUcmFjaW5nSG9va3MgPSB0aGlzLl9hcHBseVRyYWNpbmdIb29rcztcblxuICAgIHRoaXMuX29wdGlvbnMuVnVlLm1peGluKHtcbiAgICAgIGJlZm9yZUNyZWF0ZSh0aGlzOiBWaWV3TW9kZWwpOiB2b2lkIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG4gICAgICAgIGlmIChnZXRDdXJyZW50SHViKCkuZ2V0SW50ZWdyYXRpb24oVFJBQ0lOR19HRVRURVIpIHx8IGdldEN1cnJlbnRIdWIoKS5nZXRJbnRlZ3JhdGlvbihCUk9XU0VSX1RSQUNJTkdfR0VUVEVSKSkge1xuICAgICAgICAgIC8vIGB0aGlzYCBwb2ludHMgdG8gY3VycmVudGx5IHJlbmRlcmVkIGNvbXBvbmVudFxuICAgICAgICAgIGFwcGx5VHJhY2luZ0hvb2tzKHRoaXMsIGdldEN1cnJlbnRIdWIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignVnVlIGludGVncmF0aW9uIGhhcyB0cmFjaW5nIGVuYWJsZWQsIGJ1dCBUcmFjaW5nIGludGVncmF0aW9uIGlzIG5vdCBjb25maWd1cmVkJyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogSW5qZWN0IFNlbnRyeSdzIGhhbmRsZXIgaW50byBvd25zIFZ1ZSdzIGVycm9yIGhhbmRsZXIgICovXG4gIHByaXZhdGUgX2F0dGFjaEVycm9ySGFuZGxlcihnZXRDdXJyZW50SHViOiAoKSA9PiBIdWIpOiB2b2lkIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXG4gICAgY29uc3QgY3VycmVudEVycm9ySGFuZGxlciA9IHRoaXMuX29wdGlvbnMuVnVlLmNvbmZpZy5lcnJvckhhbmRsZXI7XG5cbiAgICB0aGlzLl9vcHRpb25zLlZ1ZS5jb25maWcuZXJyb3JIYW5kbGVyID0gKGVycm9yOiBFcnJvciwgdm0/OiBWaWV3TW9kZWwsIGluZm8/OiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IG1ldGFkYXRhOiBNZXRhZGF0YSA9IHt9O1xuXG4gICAgICBpZiAodm0pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBtZXRhZGF0YS5jb21wb25lbnROYW1lID0gdGhpcy5fZ2V0Q29tcG9uZW50TmFtZSh2bSk7XG5cbiAgICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5hdHRhY2hQcm9wcykge1xuICAgICAgICAgICAgbWV0YWRhdGEucHJvcHNEYXRhID0gdm0uJG9wdGlvbnMucHJvcHNEYXRhO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoX29PKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ1VuYWJsZSB0byBleHRyYWN0IG1ldGFkYXRhIGZyb20gVnVlIGNvbXBvbmVudC4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaW5mbykge1xuICAgICAgICBtZXRhZGF0YS5saWZlY3ljbGVIb29rID0gaW5mbztcbiAgICAgIH1cblxuICAgICAgaWYgKGdldEN1cnJlbnRIdWIoKS5nZXRJbnRlZ3JhdGlvbihWdWUpKSB7XG4gICAgICAgIC8vIENhcHR1cmUgZXhjZXB0aW9uIGluIHRoZSBuZXh0IGV2ZW50IGxvb3AsIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCBicmVhZGNydW1icyBhcmUgcmVjb3JkZWQgaW4gdGltZS5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgZ2V0Q3VycmVudEh1YigpLndpdGhTY29wZShzY29wZSA9PiB7XG4gICAgICAgICAgICBzY29wZS5zZXRDb250ZXh0KCd2dWUnLCBtZXRhZGF0YSk7XG4gICAgICAgICAgICBnZXRDdXJyZW50SHViKCkuY2FwdHVyZUV4Y2VwdGlvbihlcnJvcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGN1cnJlbnRFcnJvckhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY3VycmVudEVycm9ySGFuZGxlci5jYWxsKHRoaXMuX29wdGlvbnMuVnVlLCBlcnJvciwgdm0sIGluZm8pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fb3B0aW9ucy5sb2dFcnJvcnMpIHtcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuVnVlLnV0aWwpIHtcbiAgICAgICAgICB0aGlzLl9vcHRpb25zLlZ1ZS51dGlsLndhcm4oYEVycm9yIGluICR7aW5mb306IFwiJHtlcnJvciAmJiBlcnJvci50b1N0cmluZygpfVwiYCwgdm0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn1cblxuaW50ZXJmYWNlIEh1YlR5cGUgZXh0ZW5kcyBIdWIge1xuICBnZXRTY29wZT8oKTogU2NvcGUgfCB1bmRlZmluZWQ7XG59XG5cbi8qKiBHcmFicyBhY3RpdmUgdHJhbnNhY3Rpb24gb2ZmIHNjb3BlICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0aXZlVHJhbnNhY3Rpb248VCBleHRlbmRzIFRyYW5zYWN0aW9uPihodWI6IEh1YlR5cGUpOiBUIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGh1YiAmJiBodWIuZ2V0U2NvcGUpIHtcbiAgICBjb25zdCBzY29wZSA9IGh1Yi5nZXRTY29wZSgpIGFzIFNjb3BlO1xuICAgIGlmIChzY29wZSkge1xuICAgICAgcmV0dXJuIHNjb3BlLmdldFRyYW5zYWN0aW9uKCkgYXMgVCB8IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIiwgImV4cG9ydCB7IEFuZ3VsYXIgfSBmcm9tICcuL2FuZ3VsYXInO1xuZXhwb3J0IHsgQ2FwdHVyZUNvbnNvbGUgfSBmcm9tICcuL2NhcHR1cmVjb25zb2xlJztcbmV4cG9ydCB7IERlYnVnIH0gZnJvbSAnLi9kZWJ1Zyc7XG5leHBvcnQgeyBEZWR1cGUgfSBmcm9tICcuL2RlZHVwZSc7XG5leHBvcnQgeyBFbWJlciB9IGZyb20gJy4vZW1iZXInO1xuZXhwb3J0IHsgRXh0cmFFcnJvckRhdGEgfSBmcm9tICcuL2V4dHJhZXJyb3JkYXRhJztcbmV4cG9ydCB7IE9mZmxpbmUgfSBmcm9tICcuL29mZmxpbmUnO1xuZXhwb3J0IHsgUmVwb3J0aW5nT2JzZXJ2ZXIgfSBmcm9tICcuL3JlcG9ydGluZ29ic2VydmVyJztcbmV4cG9ydCB7IFJld3JpdGVGcmFtZXMgfSBmcm9tICcuL3Jld3JpdGVmcmFtZXMnO1xuZXhwb3J0IHsgU2Vzc2lvblRpbWluZyB9IGZyb20gJy4vc2Vzc2lvbnRpbWluZyc7XG5leHBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuZXhwb3J0IHsgVnVlIH0gZnJvbSAnLi92dWUnO1xuIiwgIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuaW1wb3J0IHByb2dyYW0gZnJvbSAnY29tbWFuZGVyJ1xuXG5pbXBvcnQgeyBnZXRDb3VudHJ5RmxhZyB9IGZyb20gJy4vaW5kZXgnXG5pbXBvcnQgKiBhcyBTZW50cnkgZnJvbSBcIkBzZW50cnkvbm9kZVwiO1xuXG4vLyBJbXBvcnRpbmcgQHNlbnRyeS90cmFjaW5nIHBhdGNoZXMgdGhlIGdsb2JhbCBodWIgZm9yIHRyYWNpbmcgdG8gd29yay5cbmltcG9ydCAqIGFzIFRyYWNpbmcgZnJvbSBcIkBzZW50cnkvdHJhY2luZ1wiO1xuaW1wb3J0IHsgUmV3cml0ZUZyYW1lcyB9IGZyb20gJ0BzZW50cnkvaW50ZWdyYXRpb25zJztcblxuU2VudHJ5LmluaXQoe1xuICBkc246IFwiaHR0cHM6Ly9hZWMwODczZTc1MGM0OWIwODJmZTM1OTRkZWYxNWFmMUBvMTExNjEzMi5pbmdlc3Quc2VudHJ5LmlvLzYxNDkyODBcIixcblxuICAvLyBXZSByZWNvbW1lbmQgYWRqdXN0aW5nIHRoaXMgdmFsdWUgaW4gcHJvZHVjdGlvbiwgb3IgdXNpbmcgdHJhY2VzU2FtcGxlclxuICAvLyBmb3IgZmluZXIgY29udHJvbFxuICB0cmFjZXNTYW1wbGVSYXRlOiAxLjAsXG4gIGludGVncmF0aW9uczogW25ldyBSZXdyaXRlRnJhbWVzKHtyb290OiBnbG9iYWwuX19yb290ZGlyX199KV1cbn0pO1xuXG5wcm9ncmFtXG4gIC52ZXJzaW9uKCcwLjEuMCcpXG4gIC5uYW1lKCdjb3VudHJ5LWZsYWctY2xpJylcbiAgLmNvbW1hbmQoJ2dldCA8ZmxhZz4nKVxuICAuYWN0aW9uKChmbGFnKSA9PiB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBTZW50cnkuc3RhcnRUcmFuc2FjdGlvbih7XG4gICAgICBvcDogXCJnZXQgZmxhZyBmcm9tIDIgYWxwaGEgY29kZVwiLFxuICAgICAgbmFtZTogXCJHRVQgZmxhZyBmcm9tIDIgYWxwaGEgY29kZVwiXG4gICAgfSlcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0Q291bnRyeUZsYWcoZmxhZyk7XG4gICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihgRmxhZzogJHtmbGFnfSBcXG5SZXN1bHQ6ICR7cmVzdWx0fVxcbmApXG4gICAgICBjb25zb2xlLmxvZyhyZXN1bHQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIFNlbnRyeS5jYXB0dXJlRXhjZXB0aW9uKGUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0cmFuc2FjdGlvbi5maW5pc2goKVxuICAgIH1cbiAgfSlcblxucHJvZ3JhbS5wYXJzZShwcm9jZXNzLmFyZ3YpXG4iLCAiZXhwb3J0IGZ1bmN0aW9uIGdldENvdW50cnlGbGFnIChjb3VudHJ5Q29kZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNvdW50cnlDb2RlLmxlbmd0aCAhPSAyKSB7IHJldHVybiB1bmRlZmluZWR9XG4gIHJldHVybiBjb3VudHJ5Q29kZS50b1VwcGVyQ2FzZSgpLnJlcGxhY2UoLy4vZywgY2hhciA9PiBcbiAgICAgIFN0cmluZy5mcm9tQ29kZVBvaW50KDEyNzM5NyArIGNoYXIuY2hhckNvZGVBdCgwKSkpO1xufVxuICAiXSwKICAibWFwcGluZ3MiOiAiO3FtQkFBQSxtQkFJQSxHQUFJLElBQWUsUUFBUSxVQUFVLGFBQ2pDLEdBQVEsUUFBUSxpQkFBaUIsTUFDakMsR0FBTyxRQUFRLFFBQ2YsR0FBVSxHQUFLLFFBQ2YsR0FBVyxHQUFLLFNBQ2hCLEdBQUssUUFBUSxNQU1qQixRQUFRLFFBQVEsU0FBUyxFQUFTLElBTWxDLEdBQVUsR0FBTyxRQUFVLEdBQUksR0FNL0IsR0FBUSxRQUFVLEVBTWxCLEdBQVEsT0FBUyxHQVVqQixZQUFnQixFQUFPLEVBQWEsQ0FDbEMsS0FBSyxNQUFRLEVBQ2IsS0FBSyxTQUFXLEVBQU0sUUFBUSxNQUFRLEVBQ3RDLEtBQUssU0FBVyxFQUFNLFFBQVEsTUFBUSxFQUN0QyxLQUFLLEtBQU8sRUFBTSxRQUFRLFVBQVksR0FDdEMsRUFBUSxFQUFNLE1BQU0sVUFDaEIsRUFBTSxPQUFTLEdBQUssQ0FBQyxRQUFRLEtBQUssRUFBTSxLQUFLLE1BQUssTUFBUSxFQUFNLFNBQ3BFLEtBQUssS0FBTyxFQUFNLFFBQ2xCLEtBQUssWUFBYyxHQUFlLEdBVXBDLEdBQU8sVUFBVSxLQUFPLFVBQVcsQ0FDakMsTUFBTyxNQUFLLEtBQ1QsUUFBUSxLQUFNLElBQ2QsUUFBUSxNQUFPLEtBV3BCLEdBQU8sVUFBVSxjQUFnQixVQUFXLENBQzFDLE1BQU8sSUFBVSxLQUFLLFNBV3hCLEdBQU8sVUFBVSxHQUFLLFNBQVMsRUFBSyxDQUNsQyxNQUFPLE1BQUssUUFBVSxHQUFPLEtBQUssT0FBUyxHQVU3QyxXQUFpQixFQUFNLENBQ3JCLEtBQUssU0FBVyxHQUNoQixLQUFLLFFBQVUs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
71
+ //# sourceMappingURL=cli.js.map