discord-player 7.2.0-dev.0 → 7.2.0-dev.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
- var __create = Object.create;
3
2
  var __defProp = Object.defineProperty;
4
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
6
  var __typeError = (msg) => {
9
7
  throw TypeError(msg);
@@ -23,14 +21,6 @@ var __copyProps = (to, from, except, desc) => {
23
21
  return to;
24
22
  };
25
23
  var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
26
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
27
- // If the importer is in node compatibility mode or this is not an ESM
28
- // file that has been converted to a CommonJS file using a Babel-
29
- // compatible transform (i.e. "__esModule" has not been set), then set
30
- // "default" to the CommonJS "module.exports" for node compatibility.
31
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
32
- mod
33
- ));
34
24
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
35
25
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
36
26
  var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
@@ -110,6 +100,7 @@ __export(src_exports, {
110
100
  joinVoiceChannel: () => import_discord_voip6.joinVoiceChannel,
111
101
  onAfterCreateStream: () => onAfterCreateStream,
112
102
  onBeforeCreateStream: () => onBeforeCreateStream,
103
+ onStreamExtracted: () => onStreamExtracted,
113
104
  serialize: () => serialize,
114
105
  tryIntoThumbnailString: () => tryIntoThumbnailString,
115
106
  useContext: () => useContext,
@@ -1700,7 +1691,6 @@ __name(erisUsersProxy, "erisUsersProxy");
1700
1691
 
1701
1692
  // src/compat/createOceanicCompat.ts
1702
1693
  var import_v102 = require("discord-api-types/v10");
1703
- var Oceanic = __toESM(require("oceanic.js"));
1704
1694
  var DiscordPlayerClientSymbol3 = Symbol("DiscordPlayerClient");
1705
1695
  function declareProperty2(target, key, value) {
1706
1696
  Reflect.set(target, key, value);
@@ -1844,7 +1834,7 @@ function oceanicChannelsProxy(client, oceanic) {
1844
1834
  client
1845
1835
  );
1846
1836
  }
1847
- if (resolvable instanceof Oceanic.GuildChannel) {
1837
+ if (resolvable instanceof oceanic.GuildChannel) {
1848
1838
  return oceanicResolvedChannelProxy(resolvable, client);
1849
1839
  }
1850
1840
  },
@@ -2373,6 +2363,12 @@ function onBeforeCreateStream(handler) {
2373
2363
  }
2374
2364
  __name(onBeforeCreateStream, "onBeforeCreateStream");
2375
2365
 
2366
+ // src/hooks/stream/onStreamExtracted.ts
2367
+ function onStreamExtracted(handler) {
2368
+ getGlobalRegistry().set("@[onStreamExtracted]", handler);
2369
+ }
2370
+ __name(onStreamExtracted, "onStreamExtracted");
2371
+
2376
2372
  // src/hooks/useVolume.ts
2377
2373
  function useVolume(node) {
2378
2374
  const { context, player } = useHooksContext("useVolume");
@@ -3879,20 +3875,21 @@ var _GuildQueuePlayerNode = class _GuildQueuePlayerNode {
3879
3875
  attemptedExtractors: /* @__PURE__ */ new Set(),
3880
3876
  bridgeAttemptedExtractors: /* @__PURE__ */ new Set()
3881
3877
  },
3882
- () => __privateMethod(this, _GuildQueuePlayerNode_instances, createGenericStream_fn).call(this, track).then(
3883
- (r) => {
3884
- if (r?.result) {
3885
- streamSrc.stream = r.result;
3886
- return;
3887
- }
3888
- if (r?.error) {
3889
- streamSrc.error = r.error;
3890
- return;
3891
- }
3892
- streamSrc.stream = streamSrc.error = null;
3893
- },
3894
- (e) => streamSrc.error = e
3895
- )
3878
+ () => __privateMethod(this, _GuildQueuePlayerNode_instances, createGenericStream_fn).call(this, track).then(async (r) => {
3879
+ if (r?.result) {
3880
+ streamSrc.stream = await this.queue.onStreamExtracted?.(
3881
+ r.result,
3882
+ track,
3883
+ this.queue
3884
+ ) ?? r.result;
3885
+ return;
3886
+ }
3887
+ if (r?.error) {
3888
+ streamSrc.error = r.error;
3889
+ return;
3890
+ }
3891
+ streamSrc.stream = streamSrc.error = null;
3892
+ }).catch((e) => streamSrc.error = e)
3896
3893
  );
3897
3894
  }
3898
3895
  if (!streamSrc.stream) return __privateMethod(this, _GuildQueuePlayerNode_instances, throw_fn).call(this, track, streamSrc.error);
@@ -5147,6 +5144,7 @@ var _GuildQueue = class _GuildQueue {
5147
5144
  stream,
5148
5145
  type: import_discord_voip3.StreamType.Raw
5149
5146
  }), "onAfterCreateStream"));
5147
+ __publicField(this, "onStreamExtracted", /* @__PURE__ */ __name(async (stream) => stream, "onStreamExtracted"));
5150
5148
  __publicField(this, "repeatMode", QueueRepeatMode.OFF);
5151
5149
  __publicField(this, "timeouts", new import_utils6.Collection());
5152
5150
  __publicField(this, "stats", new GuildQueueStatistics(this));
@@ -5157,6 +5155,8 @@ var _GuildQueue = class _GuildQueue {
5157
5155
  this.onBeforeCreateStream = options.onBeforeCreateStream;
5158
5156
  if (TypeUtil.isFunction(options.onAfterCreateStream))
5159
5157
  this.onAfterCreateStream = options.onAfterCreateStream;
5158
+ if (TypeUtil.isFunction(options.onStreamExtracted))
5159
+ this.onStreamExtracted = options.onStreamExtracted;
5160
5160
  if (!TypeUtil.isNullish(options.repeatMode))
5161
5161
  this.repeatMode = options.repeatMode;
5162
5162
  options.selfDeaf ?? (options.selfDeaf = true);
@@ -6039,6 +6039,11 @@ var _GuildNodeManager = class _GuildNodeManager {
6039
6039
  options.disableFallbackStream ?? (options.disableFallbackStream = false);
6040
6040
  options.enableStreamInterceptor ?? (options.enableStreamInterceptor = false);
6041
6041
  options.verifyFallbackStream ?? (options.verifyFallbackStream = false);
6042
+ if (getGlobalRegistry().has("@[onStreamExtracted]") && !options.onStreamExtracted) {
6043
+ options.onStreamExtracted = getGlobalRegistry().get(
6044
+ "@[onStreamExtracted]"
6045
+ );
6046
+ }
6042
6047
  if (getGlobalRegistry().has("@[onBeforeCreateStream]") && !options.onBeforeCreateStream) {
6043
6048
  options.onBeforeCreateStream = getGlobalRegistry().get(
6044
6049
  "@[onBeforeCreateStream]"
@@ -6060,6 +6065,7 @@ var _GuildNodeManager = class _GuildNodeManager {
6060
6065
  disableHistory: options.disableHistory,
6061
6066
  onBeforeCreateStream: options.onBeforeCreateStream,
6062
6067
  onAfterCreateStream: options.onAfterCreateStream,
6068
+ onStreamExtracted: options.onStreamExtracted,
6063
6069
  repeatMode: options.repeatMode,
6064
6070
  leaveOnEmpty: options.leaveOnEmpty,
6065
6071
  leaveOnEmptyCooldown: options.leaveOnEmptyCooldown,
@@ -6614,7 +6620,7 @@ var import_ffmpeg2 = require("@discord-player/ffmpeg");
6614
6620
  // src/version.ts
6615
6621
  var version = (
6616
6622
  /* @__MACRO__ getVersion */
6617
- "7.2.0-dev.0"
6623
+ "7.2.0-dev.2"
6618
6624
  );
6619
6625
 
6620
6626
  // src/utils/DependencyReportGenerator.ts
@@ -7522,6 +7528,7 @@ var import_discord_voip6 = require("discord-voip");
7522
7528
  joinVoiceChannel,
7523
7529
  onAfterCreateStream,
7524
7530
  onBeforeCreateStream,
7531
+ onStreamExtracted,
7525
7532
  serialize,
7526
7533
  tryIntoThumbnailString,
7527
7534
  useContext,
@@ -7535,4 +7542,4 @@ var import_discord_voip6 = require("discord-voip");
7535
7542
  version,
7536
7543
  ...require("@discord-player/ffmpeg")
7537
7544
  });
7538
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9jb21wYXQvY3JlYXRlRXJpc0NvbXBhdC50cyIsICIuLi9zcmMvY29tcGF0L2NvbW1vbi50cyIsICIuLi9zcmMvdXRpbHMvVXRpbC50cyIsICIuLi9zcmMvZmFicmljL1RyYWNrLnRzIiwgIi4uL3NyYy9lcnJvcnMvaW5kZXgudHMiLCAiLi4vc3JjL3V0aWxzL1R5cGVVdGlsLnRzIiwgIi4uL3NyYy91dGlscy9zZXJkZS50cyIsICIuLi9zcmMvZmFicmljL1BsYXlsaXN0LnRzIiwgIi4uL3NyYy91dGlscy9RdWVyeVJlc29sdmVyLnRzIiwgIi4uL3NyYy9mYWJyaWMvU2VhcmNoUmVzdWx0LnRzIiwgIi4uL3NyYy91dGlscy9BdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL2NvbXBhdC9jcmVhdGVPY2VhbmljQ29tcGF0LnRzIiwgIi4uL3NyYy91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyLnRzIiwgIi4uL3NyYy9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3IudHMiLCAiLi4vc3JjL2V4dHJhY3RvcnMvRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dC50cyIsICIuLi9zcmMvaG9va3MvY29udGV4dC9hc3luYy1jb250ZXh0LnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vX2NvbnRhaW5lci50cyIsICIuLi9zcmMvdXRpbHMvX19pbnRlcm5hbF9fL2dldEdsb2JhbFJlZ2lzdHJ5LnRzIiwgIi4uL3NyYy9ob29rcy9jb21tb24udHMiLCAiLi4vc3JjL2hvb2tzL3VzZUhpc3RvcnkudHMiLCAiLi4vc3JjL2hvb2tzL3VzZVBsYXllci50cyIsICIuLi9zcmMvaG9va3MvdXNlUXVldWUudHMiLCAiLi4vc3JjL2hvb2tzL3VzZU1haW5QbGF5ZXIudHMiLCAiLi4vc3JjL2hvb2tzL3VzZU1ldGFkYXRhLnRzIiwgIi4uL3NyYy9ob29rcy91c2VUaW1lbGluZS50cyIsICIuLi9zcmMvaG9va3Mvc3RyZWFtL29uQWZ0ZXJDcmVhdGVTdHJlYW0udHMiLCAiLi4vc3JjL2hvb2tzL3N0cmVhbS9vbkJlZm9yZUNyZWF0ZVN0cmVhbS50cyIsICIuLi9zcmMvaG9va3MvdXNlVm9sdW1lLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZE5vZGVNYW5hZ2VyLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZFF1ZXVlLnRzIiwgIi4uL3NyYy9zdHJlYW0vU3RyZWFtRGlzcGF0Y2hlci50cyIsICIuLi9zcmMvc3RyZWFtL0ludGVyY2VwdGVkU3RyZWFtLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZFF1ZXVlSGlzdG9yeS50cyIsICIuLi9zcmMvcXVldWUvR3VpbGRRdWV1ZVBsYXllck5vZGUudHMiLCAiLi4vc3JjL3V0aWxzL0FzeW5jUXVldWUudHMiLCAiLi4vc3JjL3F1ZXVlL0d1aWxkUXVldWVBdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL3V0aWxzL0ZGbXBlZ1N0cmVhbS50cyIsICIuLi9zcmMvcXVldWUvR3VpbGRRdWV1ZVN0YXRpc3RpY3MudHMiLCAiLi4vc3JjL3F1ZXVlL1N5bmNlZEx5cmljc1Byb3ZpZGVyLnRzIiwgIi4uL3NyYy91dGlscy9TZXF1ZW50aWFsQnVja2V0LnRzIiwgIi4uL3NyYy9scmNsaWIvTHJjTGliLnRzIiwgIi4uL3NyYy9zdHJlYW0vVm9pY2VVdGlscy50cyIsICIuLi9zcmMvdXRpbHMvUXVlcnlDYWNoZS50cyIsICIuLi9zcmMvUGxheWVyLnRzIiwgIi4uL3NyYy9EZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXIudHMiLCAiLi4vc3JjL3V0aWxzL0RlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudHMiLCAiLi4vc3JjL3ZlcnNpb24udHMiLCAiLi4vc3JjL1BsYXllclN0cmVhbUludGVyY2VwdG9yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgeyBjcmVhdGVFcmlzQ29tcGF0IH0gZnJvbSAnLi9jb21wYXQvY3JlYXRlRXJpc0NvbXBhdCc7XG5leHBvcnQgeyBjcmVhdGVPY2VhbmljQ29tcGF0IH0gZnJvbSAnLi9jb21wYXQvY3JlYXRlT2NlYW5pY0NvbXBhdCc7XG5leHBvcnQgeyBpc0VyaXNQcm94eSwgaXNPY2VhbmljUHJveHkgfSBmcm9tICcuL2NvbXBhdC9jb21tb24nO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvQXVkaW9GaWx0ZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vZXh0cmFjdG9ycy9FeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vZmFicmljJztcbmV4cG9ydCAqIGZyb20gJy4vcXVldWUnO1xuZXhwb3J0ICogZnJvbSAnLi9scmNsaWIvTHJjTGliJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvU2VxdWVudGlhbEJ1Y2tldCc7XG5leHBvcnQgKiBmcm9tICcuL3N0cmVhbS9Wb2ljZVV0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vc3RyZWFtL1N0cmVhbURpc3BhdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9VdGlsJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvVHlwZVV0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9Bc3luY1F1ZXVlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvRkZtcGVnU3RyZWFtJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvUXVlcnlDYWNoZSc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuZXhwb3J0ICogZnJvbSAnQGRpc2NvcmQtcGxheWVyL2ZmbXBlZyc7XG5leHBvcnQgKiBmcm9tICcuL1BsYXllcic7XG5leHBvcnQgKiBmcm9tICcuL2hvb2tzJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvc2VyZGUnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9EZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vc3RyZWFtL0ludGVyY2VwdGVkU3RyZWFtJztcbmV4cG9ydCAqIGZyb20gJy4vUGxheWVyU3RyZWFtSW50ZXJjZXB0b3InO1xuZXhwb3J0IHtcbiAgQXVkaW9GaWx0ZXJzIGFzIFBDTUF1ZGlvRmlsdGVycyxcbiAgdHlwZSBCaXF1YWRGaWx0ZXJzLFxuICBGaWx0ZXJUeXBlIGFzIEJpcXVhZEZpbHRlclR5cGUsXG4gIHR5cGUgUENNRmlsdGVycyxcbiAgUV9CVVRURVJXT1JUSCxcbiAgVm9sdW1lVHJhbnNmb3JtZXIsXG4gIEJBU1NfRVFfQkFORFMsXG4gIEFGX05JR0hUQ09SRV9SQVRFLFxuICBBRl9WQVBPUldBVkVfUkFURSxcbiAgRmlsdGVyc0NoYWluIH0gZnJvbVxuJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuZXhwb3J0IHtcbiAgY3JlYXRlQXVkaW9QbGF5ZXIsXG4gIEF1ZGlvUGxheWVyLFxuICBnZXRWb2ljZUNvbm5lY3Rpb24sXG4gIGdldFZvaWNlQ29ubmVjdGlvbnMsXG4gIGpvaW5Wb2ljZUNoYW5uZWwsXG4gIFN0cmVhbVR5cGUsXG4gIGNyZWF0ZUF1ZGlvUmVzb3VyY2UsXG4gIHR5cGUgSm9pbkNvbmZpZyxcbiAgdHlwZSBKb2luVm9pY2VDaGFubmVsT3B0aW9ucyxcbiAgdHlwZSBDcmVhdGVBdWRpb1BsYXllck9wdGlvbnMgfSBmcm9tXG4nZGlzY29yZC12b2lwJztcblxuZXhwb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbic7IiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8vIEB0cy1ub2NoZWNrXG5cbmltcG9ydCB7IENoYW5uZWxUeXBlLCBHYXRld2F5RGlzcGF0Y2hFdmVudHMgfSBmcm9tICdkaXNjb3JkLWFwaS10eXBlcy92MTAnO1xuaW1wb3J0IHsgY3JlYXRlQ29tcGF0Q2xpZW50LCBDb21wYXRQcm92aWRlciB9IGZyb20gJy4vY29tbW9uJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcblxuaW1wb3J0IHR5cGUgeyBEaXNjb3JkR2F0ZXdheUFkYXB0ZXJDcmVhdG9yIH0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB7XG4gIENsaWVudCxcbiAgR2F0ZXdheVZvaWNlU2VydmVyVXBkYXRlRGlzcGF0Y2hEYXRhLFxuICBHYXRld2F5Vm9pY2VTdGF0ZVVwZGF0ZURpc3BhdGNoRGF0YSxcbiAgVm9pY2VTdGF0ZSB9IGZyb21cbidkaXNjb3JkLmpzJztcbmltcG9ydCB0eXBlIEVyaXMgZnJvbSAnZXJpcyc7XG5cbnR5cGUgRXJpc1VzZXJSZXNvbHZhYmxlID0gRXJpcy5Vc2VyIHwgc3RyaW5nIHwgRXJpcy5NZW1iZXI7XG50eXBlIEVyaXNHdWlsZFJlc29sdmFibGUgPVxuRXJpcy5HdWlsZCB8XG5zdHJpbmcgfFxuRXJpcy5NZW1iZXIgfFxuRXJpcy5HdWlsZENoYW5uZWwgfFxuRXJpcy5Sb2xlO1xudHlwZSBFcmlzQ2hhbm5lbFJlc29sdmFibGUgPSBFcmlzLkd1aWxkQ2hhbm5lbCB8IHN0cmluZztcblxuY29uc3QgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCA9IFN5bWJvbCgnRGlzY29yZFBsYXllckNsaWVudCcpO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNFcmlzQ2xpZW50KGNsaWVudDogYW55KTogY2xpZW50IGlzIEVyaXMuQ2xpZW50IHtcbiAgY29uc3QgeyBtb2R1bGUsIGVycm9yIH0gPSBVdGlsLnJlcXVpcmUoJ2VyaXMnKTtcblxuICBpZiAoZXJyb3IpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBlcmlzID0gbW9kdWxlIGFzIHR5cGVvZiBpbXBvcnQoJ2VyaXMnKTtcblxuICByZXR1cm4gY2xpZW50IGluc3RhbmNlb2YgZXJpcy5DbGllbnQ7XG59XG5cbmZ1bmN0aW9uIGRlY2xhcmVQcm9wZXJ0eSh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgUmVmbGVjdC5zZXQodGFyZ2V0LCBrZXksIHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJvcGVydHk8VD4odGFyZ2V0OiBhbnksIGtleTogc3RyaW5nKTogVCB7XG4gIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIGtleSk7XG59XG5cbi8qKlxuICogQWxsb3dzIEVyaXMgY2xpZW50cyB0byBiZSB1c2VkIHdpdGggZGlzY29yZC1wbGF5ZXIuIFdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBkaXNjb3JkLXBsYXllciBjcmVhdGVzIGEgcHJveHkgb2JqZWN0IHRoYXQgaW50ZXJjZXB0cyBjZXJ0YWluIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgdG8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGggZGlzY29yZC1wbGF5ZXIuXG4gKiBAcGFyYW0gY2xpZW50IFRoZSBFcmlzIGNsaWVudCB0byBiZSB1c2VkLlxuICogQHJldHVybnMgVGhlIEVyaXMgY2xpZW50IHdpdGggZGlzY29yZC1wbGF5ZXIgY29tcGF0aWJpbGl0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVyaXNDb21wYXQoY2xpZW50OiBFcmlzLkNsaWVudCk6IENsaWVudCB7XG4gIGNvbnN0IHsgbW9kdWxlLCBlcnJvciB9ID0gVXRpbC5yZXF1aXJlKCdlcmlzJyk7XG5cbiAgaWYgKGVycm9yKSB0aHJvdyBlcnJvcjtcblxuICBjb25zdCBlcmlzID0gbW9kdWxlIGFzIHR5cGVvZiBpbXBvcnQoJ2VyaXMnKTtcblxuICBlcmlzVm9pY2VFdmVudHNIYW5kbGVyKGNsaWVudCk7XG5cbiAgY29uc3QgZXJpc1Byb3h5ID0gbmV3IFByb3h5KGNsaWVudCwge1xuICAgIGdldCh0YXJnZXQsIHApIHtcbiAgICAgIHN3aXRjaCAocCkge1xuICAgICAgICBjYXNlICd1c2Vycyc6XG4gICAgICAgICAgcmV0dXJuIGVyaXNVc2Vyc1Byb3h5KHRhcmdldCwgZXJpcyk7XG4gICAgICAgIGNhc2UgJ2d1aWxkcyc6XG4gICAgICAgICAgcmV0dXJuIGVyaXNHdWlsZHNQcm94eSh0YXJnZXQsIGVyaXMpO1xuICAgICAgICBjYXNlICdjaGFubmVscyc6XG4gICAgICAgICAgcmV0dXJuIGVyaXNDaGFubmVsc1Byb3h5KHRhcmdldCwgZXJpcyk7XG4gICAgICAgIGNhc2UgJ19fZHBfdm9pY2VTdGF0ZVVwZGF0ZV9wcm94eSc6XG4gICAgICAgICAgcmV0dXJuIChoYW5kbGVyOiAoYSwgYikgPT4gdm9pZCkgPT5cbiAgICAgICAgICBlcmlzVm9pY2VTdGF0ZVVwZGF0ZVByb3h5KHRhcmdldCwgZXJpc1Byb3h5LCBoYW5kbGVyKTtcbiAgICAgICAgY2FzZSAnaW5jcmVtZW50TWF4TGlzdGVuZXJzJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgICAgY2xpZW50LnNldE1heExpc3RlbmVycyhjbGllbnQuZ2V0TWF4TGlzdGVuZXJzKCkgKyAxKTtcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlICdkZWNyZW1lbnRNYXhMaXN0ZW5lcnMnOlxuICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBjbGllbnQuZ2V0TWF4TGlzdGVuZXJzKCkgLSAxO1xuXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICBjbGllbnQuc2V0TWF4TGlzdGVuZXJzKGxpc3RlbmVycyA8IDAgPyAxIDogbGlzdGVuZXJzKTtcbiAgICAgICAgICB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgUmVmbGVjdC5zZXQoZXJpc1Byb3h5LCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sLCAnRXJpcycpO1xuXG4gIHJldHVybiBjcmVhdGVDb21wYXRDbGllbnQoZXJpc1Byb3h5LCAnRXJpcycpLmNsaWVudCBhcyB1bmtub3duIGFzIENsaWVudDtcbn1cblxuZnVuY3Rpb24gZXJpc1ZvaWNlU3RhdGVVcGRhdGVQcm94eShcbmNsaWVudDogRXJpcy5DbGllbnQsXG5wcm94eTogRXJpcy5DbGllbnQsXG5oYW5kbGVyOiAoYSwgYikgPT4gdm9pZClcbntcbiAgY2xpZW50Lm9uKCd2b2ljZVN0YXRlVXBkYXRlJywgKG1lbWJlciwgb2xkU3RhdGUpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJveGllZE9sZFN0YXRlID0ge1xuICAgICAgICBjaGFubmVsSWQ6IG9sZFN0YXRlLmNoYW5uZWxJRCxcbiAgICAgICAgc2VydmVyTXV0ZTogb2xkU3RhdGUubXV0ZSxcbiAgICAgICAgc3VwcHJlc3M6IG9sZFN0YXRlLnN1cHByZXNzLFxuICAgICAgICBndWlsZDoge1xuICAgICAgICAgIGlkOiBvbGRTdGF0ZS5ndWlsZC5pZFxuICAgICAgICB9LFxuICAgICAgICBtZW1iZXI6IHtcbiAgICAgICAgICBpZDogb2xkU3RhdGUudXNlci5pZFxuICAgICAgICB9XG4gICAgICB9IGFzIFZvaWNlU3RhdGU7XG5cbiAgICAgIGNvbnN0IG1lID0gbWVtYmVyLmd1aWxkLm1lbWJlcnMuZ2V0KGNsaWVudC51c2VyLmlkKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkQ2hhbm5lbCA9IG1lbWJlci5ndWlsZC5jaGFubmVscy5nZXQoXG4gICAgICAgIG1lbWJlci52b2ljZVN0YXRlLmNoYW5uZWxJRFxuICAgICAgKTtcblxuICAgICAgY29uc3QgcHJveGllZE5ld1N0YXRlID0ge1xuICAgICAgICBjaGFubmVsSWQ6IG1lbWJlci52b2ljZVN0YXRlLmNoYW5uZWxJRCxcbiAgICAgICAgc2VydmVyTXV0ZTogbWVtYmVyLnZvaWNlU3RhdGUubXV0ZSxcbiAgICAgICAgc3VwcHJlc3M6IG1lbWJlci52b2ljZVN0YXRlLnN1cHByZXNzLFxuICAgICAgICBjaGFubmVsOiBlcmlzUmVzb2x2ZWRDaGFubmVsUHJveHkocmVzb2x2ZWRDaGFubmVsLCBjbGllbnQpLFxuICAgICAgICBtZW1iZXI6IHtcbiAgICAgICAgICBpZDogbWVtYmVyLmlkXG4gICAgICAgIH0sXG4gICAgICAgIGd1aWxkOiB7XG4gICAgICAgICAgaWQ6IG1lbWJlci5ndWlsZC5pZCxcbiAgICAgICAgICBtZW1iZXJzOiB7XG4gICAgICAgICAgICBtZToge1xuICAgICAgICAgICAgICBpZDogbWU/LmlkLFxuICAgICAgICAgICAgICB2b2ljZToge1xuICAgICAgICAgICAgICAgIGFzeW5jIHNldFJlcXVlc3RUb1NwZWFrKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgICAgICAgICAgICB2b2lkIHZhbHVlO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lPy52b2ljZVN0YXRlO1xuICAgICAgICAgICAgICAgICAgLy8gaWYgKG1lKSB7XG4gICAgICAgICAgICAgICAgICAvLyAgIHJldHVybiBtZS52b2ljZS5zZXRSZXF1ZXN0VG9TcGVhayh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGFzIFZvaWNlU3RhdGU7XG5cbiAgICAgIHJldHVybiBoYW5kbGVyKHByb3hpZWROZXdTdGF0ZSwgcHJveGllZE9sZFN0YXRlKTtcbiAgICB9IGNhdGNoIHtcblxuICAgICAgLyogbm9vcCAqL31cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNWb2ljZUV2ZW50c0hhbmRsZXIoY2xpZW50OiBFcmlzLkNsaWVudCkge1xuICBsZXQgYWRhcHRlcnMgPSBnZXRQcm9wZXJ0eTxNYXA8c3RyaW5nLCBhbnk+PihjbGllbnQsICdhZGFwdGVycycpO1xuXG4gIGlmICghYWRhcHRlcnMpIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICBhZGFwdGVycyA9IGNvbGxlY3Rpb247XG4gICAgZGVjbGFyZVByb3BlcnR5KGNsaWVudCwgJ2FkYXB0ZXJzJywgY29sbGVjdGlvbik7XG4gIH1cblxuICBjbGllbnQub24oJ3NoYXJkRGlzY29ubmVjdCcsIChfLCBzaGFyZElkKSA9PiB7XG4gICAgZm9yIChjb25zdCBbZ3VpbGRJZCwgYWRhcHRlcl0gb2YgYWRhcHRlcnMuZW50cmllcygpKSB7XG4gICAgICBpZiAoY2xpZW50Lmd1aWxkcy5nZXQoZ3VpbGRJZCk/LnNoYXJkLmlkID09PSBzaGFyZElkKSB7XG4gICAgICAgIGFkYXB0ZXIuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgY2xpZW50Lm9uKCdyYXdXUycsIChwYWNrZXQpID0+IHtcbiAgICBzd2l0Y2ggKHBhY2tldC50KSB7XG4gICAgICBjYXNlIEdhdGV3YXlEaXNwYXRjaEV2ZW50cy5Wb2ljZVNlcnZlclVwZGF0ZTp7XG4gICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHBhY2tldC5kIGFzIEdhdGV3YXlWb2ljZVNlcnZlclVwZGF0ZURpc3BhdGNoRGF0YTtcbiAgICAgICAgICBhZGFwdGVycy5nZXQocGF5bG9hZC5ndWlsZF9pZCk/Lm9uVm9pY2VTZXJ2ZXJVcGRhdGUocGF5bG9hZCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICBjYXNlIEdhdGV3YXlEaXNwYXRjaEV2ZW50cy5Wb2ljZVN0YXRlVXBkYXRlOntcbiAgICAgICAgICBjb25zdCBwYXlsb2FkID0gcGFja2V0LmQgYXMgR2F0ZXdheVZvaWNlU3RhdGVVcGRhdGVEaXNwYXRjaERhdGE7XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgcGF5bG9hZC5ndWlsZF9pZCAmJlxuICAgICAgICAgIHBheWxvYWQuc2Vzc2lvbl9pZCAmJlxuICAgICAgICAgIHBheWxvYWQudXNlcl9pZCA9PT0gY2xpZW50LnVzZXIuaWQpXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRhcHRlcnMuZ2V0KHBheWxvYWQuZ3VpbGRfaWQpPy5vblZvaWNlU3RhdGVVcGRhdGUocGF5bG9hZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlcmlzQ2hhbm5lbHNQcm94eShjbGllbnQ6IEVyaXMuQ2xpZW50LCBlcmlzOiB0eXBlb2YgaW1wb3J0KCdlcmlzJykpIHtcbiAgY29uc3QgaGFuZGxlciA9IHtcbiAgICBjbGllbnQsXG4gICAgZ2V0IGNhY2hlKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0KGlkOiBzdHJpbmcpIHtcbiAgICAgICAgICByZXR1cm4gY2xpZW50LmdldENoYW5uZWwoaWQpO1xuICAgICAgICB9LFxuICAgICAgICBoYXMoaWQ6IHN0cmluZykge1xuICAgICAgICAgIHJldHVybiBpZCBpbiBjbGllbnQuY2hhbm5lbEd1aWxkTWFwO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sXG4gICAgcmVzb2x2ZShyZXNvbHZhYmxlOiBzdHJpbmcgfCBFcmlzQ2hhbm5lbFJlc29sdmFibGUpIHtcbiAgICAgIGlmICh0eXBlb2YgcmVzb2x2YWJsZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGVyaXNSZXNvbHZlZENoYW5uZWxQcm94eShcbiAgICAgICAgICB0aGlzLmNsaWVudC5nZXRDaGFubmVsKHJlc29sdmFibGUpIGFzIEVyaXMuR3VpbGRDaGFubmVsLFxuICAgICAgICAgIGNsaWVudFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuR3VpbGRDaGFubmVsKSB7XG4gICAgICAgIHJldHVybiBlcmlzUmVzb2x2ZWRDaGFubmVsUHJveHkocmVzb2x2YWJsZSwgY2xpZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlc29sdmVJZChyZXNvbHZhYmxlOiBFcmlzQ2hhbm5lbFJlc29sdmFibGUpIHtcbiAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLnJlc29sdmUocmVzb2x2YWJsZSk7XG4gICAgICByZXR1cm4gY2hhbm5lbD8uaWQ7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBoYW5kbGVyO1xufVxuXG5mdW5jdGlvbiBlcmlzUmVzb2x2ZWRDaGFubmVsUHJveHkoXG5jaGFubmVsOiBFcmlzLkd1aWxkQ2hhbm5lbCB8IHVuZGVmaW5lZCxcbmNsaWVudDogRXJpcy5DbGllbnQpXG46IEVyaXMuR3VpbGRDaGFubmVsIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjaGFubmVsKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm94eShjaGFubmVsLCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgc3dpdGNoIChwKSB7XG4gICAgICAgIGNhc2UgJ2d1aWxkJzpcbiAgICAgICAgICByZXR1cm4gZXJpc1ZvaWNlQWRhcHRlclByb3h5KHRhcmdldC5ndWlsZCwgY2xpZW50KTtcbiAgICAgICAgY2FzZSAnbWVtYmVycyc6XG4gICAgICAgICAgcmV0dXJuICh0YXJnZXQgYXMgRXJpcy5Wb2ljZUNoYW5uZWwpLnZvaWNlTWVtYmVycztcbiAgICAgICAgY2FzZSAnaXNWb2ljZUJhc2VkJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT5cbiAgICAgICAgICB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRWb2ljZSB8fFxuICAgICAgICAgIHRhcmdldC50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2U7XG4gICAgICAgIGNhc2UgJ2lzVm9pY2UnOlxuICAgICAgICAgIHJldHVybiAoKSA9PiB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRWb2ljZTtcbiAgICAgICAgY2FzZSAnaXNTdGFnZSc6XG4gICAgICAgICAgcmV0dXJuICgpID0+IHRhcmdldC50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2U7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXJpc1ZvaWNlQWRhcHRlclByb3h5KFxuZ3VpbGQ6IEVyaXMuR3VpbGQgfCB1bmRlZmluZWQsXG5jbGllbnQ6IEVyaXMuQ2xpZW50KVxuOiBFcmlzLkd1aWxkIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFndWlsZCkgcmV0dXJuO1xuXG4gIHJldHVybiBuZXcgUHJveHkoZ3VpbGQsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBpZiAocCA9PT0gJ3ZvaWNlQWRhcHRlckNyZWF0b3InKSB7XG4gICAgICAgIHJldHVybiBlcmlzVm9pY2VBZGFwdGVyQ3JlYXRvcih0YXJnZXQsIGNsaWVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXJpc1ZvaWNlQWRhcHRlckNyZWF0b3IoXG5ndWlsZDogRXJpcy5HdWlsZCxcbmNsaWVudDogRXJpcy5DbGllbnQpXG46IERpc2NvcmRHYXRld2F5QWRhcHRlckNyZWF0b3Ige1xuICByZXR1cm4gKG1ldGhvZHMpID0+IHtcbiAgICBsZXQgYWRhcHRlcnMgPSBnZXRQcm9wZXJ0eTxNYXA8c3RyaW5nLCB0eXBlb2YgbWV0aG9kcz4+KGNsaWVudCwgJ2FkYXB0ZXJzJyk7XG5cbiAgICBpZiAoIWFkYXB0ZXJzKSB7XG4gICAgICBjb25zdCBjb2xsZWN0aW9uID0gbmV3IE1hcDxzdHJpbmcsIHR5cGVvZiBtZXRob2RzPigpO1xuICAgICAgYWRhcHRlcnMgPSBjb2xsZWN0aW9uO1xuICAgICAgZGVjbGFyZVByb3BlcnR5KGNsaWVudCwgJ2FkYXB0ZXJzJywgY29sbGVjdGlvbik7XG4gICAgfVxuXG4gICAgYWRhcHRlcnMuc2V0KGd1aWxkLmlkLCBtZXRob2RzKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzZW5kUGF5bG9hZChwYXlsb2FkKSB7XG4gICAgICAgIGlmIChndWlsZC5zaGFyZC5zdGF0dXMgIT09ICdyZWFkeScpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZ3VpbGQuc2hhcmQuc2VuZFdTKHBheWxvYWQub3AsIHBheWxvYWQuZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGFkYXB0ZXJzLmRlbGV0ZShndWlsZC5pZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZXJpc0d1aWxkc1Byb3h5KGNsaWVudDogRXJpcy5DbGllbnQsIGVyaXM6IHR5cGVvZiBpbXBvcnQoJ2VyaXMnKSkge1xuICByZXR1cm4gbmV3IFByb3h5KGNsaWVudC5ndWlsZHMsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBpZiAocCA9PT0gJ2NhY2hlJykge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfVxuXG4gICAgICBpZiAocCA9PT0gJ3Jlc29sdmUnIHx8IHAgPT09ICdyZXNvbHZlSWQnKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVyID0gZnVuY3Rpb24gKHJlc29sdmFibGU6IEVyaXNHdWlsZFJlc29sdmFibGUpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmdldChyZXNvbHZhYmxlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuR3VpbGQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5NZW1iZXIgfHxcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5HdWlsZCB8fFxuICAgICAgICAgIHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLkd1aWxkQ2hhbm5lbCB8fFxuICAgICAgICAgIHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLlJvbGUpXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGUuZ3VpbGQ7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChwID09PSAncmVzb2x2ZScpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHJlc29sdmFibGU6IEVyaXNHdWlsZFJlc29sdmFibGUpID0+IHtcbiAgICAgICAgICBjb25zdCBndWlsZCA9IHJlc29sdmVyKHJlc29sdmFibGUpO1xuICAgICAgICAgIHJldHVybiBndWlsZD8uaWQ7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXJpc1VzZXJzUHJveHkoY2xpZW50OiBFcmlzLkNsaWVudCwgZXJpczogdHlwZW9mIGltcG9ydCgnZXJpcycpKSB7XG4gIHJldHVybiBuZXcgUHJveHkoY2xpZW50LnVzZXJzLCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgaWYgKHAgPT09ICdjYWNoZScpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH1cblxuICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJyB8fCBwID09PSAncmVzb2x2ZUlkJykge1xuICAgICAgICBjb25zdCByZXNvbHZlciA9IGZ1bmN0aW9uIChyZXNvbHZhYmxlOiBFcmlzVXNlclJlc29sdmFibGUpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmdldChyZXNvbHZhYmxlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuVXNlcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLk1lbWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGUudXNlcjtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJykge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAocmVzb2x2YWJsZTogRXJpc1VzZXJSZXNvbHZhYmxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgdXNlciA9IHJlc29sdmVyKHJlc29sdmFibGUpO1xuICAgICAgICAgIHJldHVybiB1c2VyPy5pZDtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICB9XG4gIH0pO1xufSIsICJleHBvcnQgY29uc3QgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCA9IFN5bWJvbCgnRGlzY29yZFBsYXllckNsaWVudCcpO1xuXG5leHBvcnQgdHlwZSBDb21wYXRQcm92aWRlciA9ICdFcmlzJyB8ICdPY2VhbmljJztcblxuZXhwb3J0IGludGVyZmFjZSBDb21wYXRDbGllbnQge1xuICBwcm92aWRlcjogQ29tcGF0UHJvdmlkZXI7XG4gIGNsaWVudDogYW55O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29tcGF0Q2xpZW50KGNsaWVudDogYW55LCBwcm92aWRlcjogQ29tcGF0UHJvdmlkZXIpOiBDb21wYXRDbGllbnQge1xuICBSZWZsZWN0LnNldChjbGllbnQsIERpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wsIHByb3ZpZGVyKTtcbiAgcmV0dXJuIHtcbiAgICBwcm92aWRlcixcbiAgICBjbGllbnRcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2xpZW50UHJveHkoY2xpZW50OiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIFJlZmxlY3QuZ2V0KGNsaWVudCwgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCkgIT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXBhdE5hbWUoY2xpZW50OiBhbnkpOiBDb21wYXRQcm92aWRlciB8IG51bGwge1xuICByZXR1cm4gUmVmbGVjdC5nZXQoY2xpZW50LCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sKSA/PyBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFcmlzUHJveHkoY2xpZW50OiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldENvbXBhdE5hbWUoY2xpZW50KSA9PT0gJ0VyaXMnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNPY2VhbmljUHJveHkoY2xpZW50OiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldENvbXBhdE5hbWUoY2xpZW50KSA9PT0gJ09jZWFuaWMnO1xufSIsICJpbXBvcnQgeyBTdGFnZUNoYW5uZWwsIFZvaWNlQ2hhbm5lbCB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJztcbmltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyBQbGF5bGlzdCwgVHJhY2ssIFRyYWNrU291cmNlIH0gZnJvbSAnLi4vZmFicmljJztcbmltcG9ydCB7IE91dE9mU3BhY2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyByYW5kb21JbnQgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQge1xuICBjcmVhdGVGaWx0ZXIsXG4gIGNyZWF0ZVNwb3RpZnlGaWx0ZXIsXG4gIGZpeFRyYWNrU3VmZml4LFxuICByZW1vdmVMaXZlLFxuICByZW1vdmVSZW1hc3RlcmVkLFxuICB5b3V0dWJlLFxuICByZW1vdmVaZXJvV2lkdGgsXG4gIHJlcGxhY2VOYnNwLFxuICByZXBsYWNlU21hcnRRdW90ZXMsXG4gIHJlbW92ZUNsZWFuRXhwbGljaXQgfSBmcm9tXG4nQHdlYi1zY3JvYmJsZXIvbWV0YWRhdGEtZmlsdGVyJztcblxuZXhwb3J0IHR5cGUgUnVudGltZVR5cGUgPSAnbm9kZScgfCAnZGVubycgfCAnYnVuJyB8ICd1bmtub3duJztcblxuZXhwb3J0IGludGVyZmFjZSBUaW1lRGF0YSB7XG4gIC8qKlxuICAgKiBUaW1lIGluIGRheXNcbiAgICovXG4gIGRheXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRpbWUgaW4gaG91cnNcbiAgICovXG4gIGhvdXJzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaW1lIGluIG1pbnV0ZXNcbiAgICovXG4gIG1pbnV0ZXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRpbWUgaW4gc2Vjb25kc1xuICAgKi9cbiAgc2Vjb25kczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWUge1xuICBuYW1lOiBSdW50aW1lVHlwZTtcbiAgdmVyc2lvbjogc3RyaW5nO1xufVxuXG5jbGFzcyBVdGlsIHtcbiAgLyoqXG4gICAqIFV0aWxzXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cblxuICAvKipcbiAgICogR2V0cyB0aGUgcnVudGltZSBpbmZvcm1hdGlvblxuICAgKi9cbiAgc3RhdGljIGdldFJ1bnRpbWUoKTogUnVudGltZSB7XG4gICAgY29uc3QgdmVyc2lvbiA9XG4gICAgdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgPyBuYXZpZ2F0b3IudXNlckFnZW50IDogbnVsbDtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAodHlwZW9mIERlbm8gIT09ICd1bmRlZmluZWQnICYmIERlbm8udmVyc2lvbikge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgcmV0dXJuIHsgbmFtZTogJ2Rlbm8nLCB2ZXJzaW9uOiBEZW5vLnZlcnNpb24uZGVubyB9O1xuICAgIH1cblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAodHlwZW9mIEJ1biAhPT0gJ3VuZGVmaW5lZCcgJiYgQnVuLnZlcnNpb24pIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHJldHVybiB7IG5hbWU6ICdidW4nLCB2ZXJzaW9uOiBCdW4udmVyc2lvbiB9O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy52ZXJzaW9uKVxuICAgIHJldHVybiB7IG5hbWU6ICdub2RlJywgdmVyc2lvbjogcHJvY2Vzcy52ZXJzaW9uIH07XG5cbiAgICByZXR1cm4geyBuYW1lOiAndW5rbm93bicsIHZlcnNpb246IHZlcnNpb24gPz8gJ3Vua25vd24nIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBkdXJhdGlvbiBzdHJpbmdcbiAgICogQHBhcmFtIHtvYmplY3R9IGR1ck9iaiBUaGUgZHVyYXRpb24gb2JqZWN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgZHVyYXRpb25TdHJpbmcoZHVyT2JqOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+KSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZHVyT2JqKS5cbiAgICBtYXAoKG0pID0+IGlzTmFOKG0pID8gMCA6IG0pLlxuICAgIGpvaW4oJzonKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgbWlsbGlzZWNvbmRzIHRvIGNvbnN1bWFibGUgdGltZSBvYmplY3RcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1pbGxpc2Vjb25kcyBUaGUgdGltZSBpbiBtc1xuICAgKiBAcmV0dXJucyB7VGltZURhdGF9XG4gICAqL1xuICBzdGF0aWMgcGFyc2VNUyhtaWxsaXNlY29uZHM6IG51bWJlcikge1xuICAgIGlmIChpc05hTihtaWxsaXNlY29uZHMpKSBtaWxsaXNlY29uZHMgPSAwO1xuICAgIGNvbnN0IHJvdW5kID0gbWlsbGlzZWNvbmRzID4gMCA/IE1hdGguZmxvb3IgOiBNYXRoLmNlaWw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF5czogcm91bmQobWlsbGlzZWNvbmRzIC8gODY0MDAwMDApLFxuICAgICAgaG91cnM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDM2MDAwMDApICUgMjQsXG4gICAgICBtaW51dGVzOiByb3VuZChtaWxsaXNlY29uZHMgLyA2MDAwMCkgJSA2MCxcbiAgICAgIHNlY29uZHM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDEwMDApICUgNjBcbiAgICB9IGFzIFRpbWVEYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aW1lIGNvZGVcbiAgICogQHBhcmFtIHtUaW1lRGF0YX0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIG9iamVjdFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgc3RhdGljIGJ1aWxkVGltZUNvZGUoZHVyYXRpb246IFRpbWVEYXRhKSB7XG4gICAgY29uc3QgaXRlbXMgPSBPYmplY3Qua2V5cyhkdXJhdGlvbik7XG4gICAgY29uc3QgcmVxdWlyZWQgPSBbJ2RheXMnLCAnaG91cnMnLCAnbWludXRlcycsICdzZWNvbmRzJ107XG5cbiAgICBjb25zdCBwYXJzZWQgPSBpdGVtcy5cbiAgICBmaWx0ZXIoKHgpID0+IHJlcXVpcmVkLmluY2x1ZGVzKHgpKS5cbiAgICBtYXAoKG0pID0+IGR1cmF0aW9uW20gYXMga2V5b2YgVGltZURhdGFdKTtcbiAgICBjb25zdCBmaW5hbCA9IHBhcnNlZC5cbiAgICBzbGljZShwYXJzZWQuZmluZEluZGV4KCh4KSA9PiB4ICE9PSAwKSkuXG4gICAgbWFwKCh4KSA9PiB4LnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSkuXG4gICAgam9pbignOicpO1xuXG4gICAgcmV0dXJuIGZpbmFsLmxlbmd0aCA8PSAzID8gYDA6JHtmaW5hbC5wYWRTdGFydCgyLCAnMCcpIHx8IDB9YCA6IGZpbmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgZHVyYXRpb25cbiAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBtc1xuICAgKi9cbiAgc3RhdGljIGZvcm1hdER1cmF0aW9uKGR1cmF0aW9uOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZFRpbWVDb2RlKHRoaXMucGFyc2VNUyhkdXJhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBpY2tzIGxhc3QgaXRlbSBvZiB0aGUgZ2l2ZW4gYXJyYXlcbiAgICogQHBhcmFtIHthbnlbXX0gYXJyIFRoZSBhcnJheVxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgc3RhdGljIGxhc3Q8VCA9IGFueT4oYXJyOiBUW10pOiBUIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbiAgICByZXR1cm4gYXJyW2Fyci5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHZvaWNlIGNoYW5uZWwgaXMgZW1wdHlcbiAgICogQHBhcmFtIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc3RhdGljIGlzVm9pY2VFbXB0eShjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwpIHtcbiAgICByZXR1cm4gKFxuICAgICAgY2hhbm5lbCAmJiBjaGFubmVsLm1lbWJlcnMuZmlsdGVyKChtZW1iZXIpID0+ICFtZW1iZXIudXNlci5ib3QpLnNpemUgPT09IDApO1xuXG4gIH1cblxuICAvKipcbiAgICogQ2xlYW5zIHRoZSB0cmFjayB0aXRsZVxuICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlXG4gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZVxuICAgKiBAcmV0dXJucyBDbGVhbmVkIHRpdGxlXG4gICAqL1xuICBzdGF0aWMgY2xlYW5UaXRsZSh0aXRsZTogc3RyaW5nLCBzb3VyY2U6IFRyYWNrU291cmNlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbHRlck9wdHMgPSB7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICB0cmFjazogW1xuICAgICAgICByZW1vdmVSZW1hc3RlcmVkLFxuICAgICAgICByZW1vdmVMaXZlLFxuICAgICAgICBmaXhUcmFja1N1ZmZpeCxcbiAgICAgICAgcmVtb3ZlWmVyb1dpZHRoLFxuICAgICAgICByZXBsYWNlTmJzcCxcbiAgICAgICAgcmVwbGFjZVNtYXJ0UXVvdGVzLFxuICAgICAgICByZW1vdmVDbGVhbkV4cGxpY2l0XVxuXG4gICAgICB9O1xuICAgICAgY29uc3Qgc3BvdGlmeUZpbHRlciA9IGNyZWF0ZUZpbHRlcihmaWx0ZXJPcHRzKTtcbiAgICAgIHNwb3RpZnlGaWx0ZXIuZXh0ZW5kKGNyZWF0ZVNwb3RpZnlGaWx0ZXIoKSk7XG4gICAgICBjb25zdCBkZWZhdWx0RmlsdGVyID0gY3JlYXRlRmlsdGVyKGZpbHRlck9wdHMpO1xuXG4gICAgICBzd2l0Y2ggKHNvdXJjZSkge1xuICAgICAgICBjYXNlICd5b3V0dWJlJzpcbiAgICAgICAgICByZXR1cm4geW91dHViZSh0aXRsZSk7XG4gICAgICAgIGNhc2UgJ3Nwb3RpZnknOlxuICAgICAgICAgIHJldHVybiBzcG90aWZ5RmlsdGVyLmZpbHRlckZpZWxkKCd0cmFjaycsIHRpdGxlKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdEZpbHRlci5maWx0ZXJGaWVsZCgndHJhY2snLCB0aXRsZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdGl0bGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhZmVyIHJlcXVpcmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkIE5vZGUgcmVxdWlyZSBpZFxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgc3RhdGljIHJlcXVpcmUoaWQ6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyBtb2R1bGU6IHJlcXVpcmUoaWQpLCBlcnJvcjogbnVsbCB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBtb2R1bGU6IG51bGwsIGVycm9yIH07XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGltcG9ydChpZDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1vZCA9IGF3YWl0IGltcG9ydChpZCk7XG4gICAgICByZXR1cm4geyBtb2R1bGU6IG1vZCwgZXJyb3I6IG51bGwgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgbW9kdWxlOiBudWxsLCBlcnJvciB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXMgdGltZW91dFxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSBUaGUgdGltZSBpbiBtcyB0byB3YWl0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHVua25vd24+fVxuICAgKi9cbiAgc3RhdGljIHdhaXQodGltZTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQodGltZSwgdW5kZWZpbmVkLCB7IHJlZjogZmFsc2UgfSk7XG4gIH1cblxuICBzdGF0aWMgbm9vcCgpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG5cbiAgc3RhdGljIGFzeW5jIGdldEZldGNoKCkge1xuICAgIGlmICgnZmV0Y2gnIGluIGdsb2JhbFRoaXMpIHJldHVybiBnbG9iYWxUaGlzLmZldGNoO1xuICAgIGZvciAoY29uc3QgbGliIG9mIFsnbm9kZS1mZXRjaCcsICd1bmRpY2knXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGltcG9ydChsaWIpLnRoZW4oXG4gICAgICAgICAgKHJlcykgPT4gcmVzLmZldGNoIHx8IHJlcy5kZWZhdWx0Py5mZXRjaCB8fCByZXMuZGVmYXVsdFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgY29uc3QgcmVzID0gcmVxdWlyZShsaWIpO1xuICAgICAgICAgIGlmIChyZXMpIHJldHVybiByZXMuZmV0Y2ggfHwgcmVzLmRlZmF1bHQ/LmZldGNoIHx8IHJlcy5kZWZhdWx0O1xuICAgICAgICB9IGNhdGNoIHtcblxuICAgICAgICAgIC8vIG5vP1xuICAgICAgICB9fVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgY29kZSA9ICdEZXByZWNhdGlvbldhcm5pbmcnLCBkZXRhaWw/OiBzdHJpbmcpIHtcbiAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKG1lc3NhZ2UsIHtcbiAgICAgIGNvZGUsXG4gICAgICBkZXRhaWxcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyByYW5kb21DaG9pY2U8VD4oc3JjOiBUW10pOiBUIHtcbiAgICByZXR1cm4gc3JjW3JhbmRvbUludChzcmMubGVuZ3RoKV07XG4gIH1cblxuICBzdGF0aWMgYXJyYXlDbG9uZVNodWZmbGU8VD4oc3JjOiBUW10pOiBUW10ge1xuICAgIGNvbnN0IGFyciA9IHNyYy5zbGljZSgpO1xuXG4gICAgbGV0IG0gPSBhcnIubGVuZ3RoO1xuXG4gICAgd2hpbGUgKG0pIHtcbiAgICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBtLS0pO1xuICAgICAgW2FyclttXSwgYXJyW2ldXSA9IFthcnJbaV0sIGFyclttXV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycjtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgVkFMSURBVEVfUVVFVUVfQ0FQID0gKFxucXVldWU6IEd1aWxkUXVldWUsXG5pdGVtczogUGxheWxpc3QgfCBUcmFjayB8IFRyYWNrW10gfCBudW1iZXIpID0+XG57XG4gIGlmIChxdWV1ZS5tYXhTaXplIDwgMSB8fCBxdWV1ZS5tYXhTaXplID09PSBJbmZpbml0eSkgcmV0dXJuO1xuXG4gIGNvbnN0IHRyYWNrcyA9XG4gIHR5cGVvZiBpdGVtcyA9PT0gJ251bWJlcicgP1xuICBpdGVtcyA6XG4gIChpdGVtcyBpbnN0YW5jZW9mIFBsYXlsaXN0ID9cbiAgaXRlbXMudHJhY2tzIDpcbiAgQXJyYXkuaXNBcnJheShpdGVtcykgP1xuICBpdGVtcyA6XG4gIFtpdGVtc10pLlxuICBsZW5ndGg7XG5cbiAgY29uc3QgbWF4Q2FwID0gcXVldWUuZ2V0Q2FwYWNpdHkoKTtcblxuICBpZiAobWF4Q2FwIDwgdHJhY2tzKSB7XG4gICAgdGhyb3cgbmV3IE91dE9mU3BhY2VFcnJvcigndHJhY2tzIHF1ZXVlJywgbWF4Q2FwLCB0cmFja3MpO1xuICB9XG59O1xuXG5leHBvcnQgeyBVdGlsIH07IiwgImltcG9ydCB7XG4gIFVzZXIsXG4gIGVzY2FwZU1hcmtkb3duLFxuICBTbm93Zmxha2VVdGlsLFxuICBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gIEFQSVVzZXIgfSBmcm9tXG4nZGlzY29yZC5qcyc7XG5pbXBvcnQge1xuICBQbGF5ZXIsXG4gIFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdCxcbiAgUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9ucyB9IGZyb21cbicuLi9QbGF5ZXInO1xuaW1wb3J0IHsgUGxheWxpc3QsIFBsYXlsaXN0SlNPTiB9IGZyb20gJy4vUGxheWxpc3QnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL3F1ZXVlL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4uL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgU2VyaWFsaXplZFR5cGUsIHRyeUludG9UaHVtYm5haWxTdHJpbmcgfSBmcm9tICcuLi91dGlscy9zZXJkZSc7XG5pbXBvcnQgeyBJbnZhbGlkQXJnVHlwZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuaW1wb3J0IHsgQXVkaW9SZXNvdXJjZSB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBTZWVrRXZlbnQgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcblxuZXhwb3J0IHR5cGUgVHJhY2tSZXNvbHZhYmxlID0gVHJhY2sgfCBzdHJpbmcgfCBudW1iZXI7XG5cbmV4cG9ydCB0eXBlIFdpdGhNZXRhZGF0YTxUIGV4dGVuZHMgb2JqZWN0LCBNPiA9IFQgJiB7XG4gIG1ldGFkYXRhOiBNO1xuICByZXF1ZXN0TWV0YWRhdGEoKTogUHJvbWlzZTxNPjtcbn07XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRUcmFjayA9IFJldHVyblR5cGU8VHJhY2tbJ3NlcmlhbGl6ZSddPjtcblxuLyoqXG4gKiBUaGUgdHJhY2sgc291cmNlOlxuICogLSBzb3VuZGNsb3VkXG4gKiAtIHlvdXR1YmVcbiAqIC0gc3BvdGlmeVxuICogLSBhcHBsZV9tdXNpY1xuICogLSBhcmJpdHJhcnlcbiAqL1xuZXhwb3J0IHR5cGUgVHJhY2tTb3VyY2UgPVxuJ3NvdW5kY2xvdWQnIHxcbid5b3V0dWJlJyB8XG4nc3BvdGlmeScgfFxuJ2FwcGxlX211c2ljJyB8XG4nYXJiaXRyYXJ5JztcblxuZXhwb3J0IGludGVyZmFjZSBSYXdUcmFja0RhdGEge1xuICAvKipcbiAgICogVGhlIHRpdGxlXG4gICAqL1xuICB0aXRsZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uXG4gICAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGF1dGhvclxuICAgKi9cbiAgYXV0aG9yOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdXJsXG4gICAqL1xuICB1cmw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0aHVtYm5haWxcbiAgICovXG4gIHRodW1ibmFpbDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGR1cmF0aW9uXG4gICAqL1xuICBkdXJhdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGR1cmF0aW9uIGluIG1zXG4gICAqL1xuICB2aWV3czogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHVzZXIgd2hvIHJlcXVlc3RlZCB0aGlzIHRyYWNrXG4gICAqL1xuICByZXF1ZXN0ZWRCeT86IFVzZXIgfCBudWxsO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0XG4gICAqL1xuICBwbGF5bGlzdD86IFBsYXlsaXN0O1xuICAvKipcbiAgICogVGhlIHNvdXJjZVxuICAgKi9cbiAgc291cmNlPzogVHJhY2tTb3VyY2U7XG4gIC8qKlxuICAgKiBUaGUgZW5naW5lXG4gICAqL1xuICBlbmdpbmU/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAvKipcbiAgICogSWYgdGhpcyB0cmFjayBpcyBsaXZlXG4gICAqL1xuICBsaXZlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSByYXcgZGF0YVxuICAgKi9cbiAgcmF3PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgLyoqXG4gICAqIFRoZSBxdWVyeSB0eXBlXG4gICAqL1xuICBxdWVyeVR5cGU/OiBTZWFyY2hRdWVyeVR5cGU7XG4gIC8qKlxuICAgKiBUaGUgc2VyaWFsaXplZCB0aXRsZVxuICAgKi9cbiAgY2xlYW5UaXRsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFja0pTT04ge1xuICAvKipcbiAgICogVGhlIHRyYWNrIGlkXG4gICAqL1xuICBpZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIHRpdGxlXG4gICAqL1xuICB0aXRsZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIGRlc2NyaXB0aW9uXG4gICAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIGF1dGhvclxuICAgKi9cbiAgYXV0aG9yOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgdXJsXG4gICAqL1xuICB1cmw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0cmFjayB0aHVtYm5haWxcbiAgICovXG4gIHRodW1ibmFpbDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIGR1cmF0aW9uXG4gICAqL1xuICBkdXJhdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIGR1cmF0aW9uIGluIG1zXG4gICAqL1xuICBkdXJhdGlvbk1TOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgdmlld3NcbiAgICovXG4gIHZpZXdzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgdXNlciBpZCB3aG8gcmVxdWVzdGVkIHRoaXMgdHJhY2tcbiAgICovXG4gIHJlcXVlc3RlZEJ5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgaW5mbyAoaWYgYW55KVxuICAgKi9cbiAgcGxheWxpc3Q/OiBQbGF5bGlzdEpTT047XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFjazxUID0gdW5rbm93bj4ge1xuICBwdWJsaWMgdGl0bGU6IHN0cmluZztcbiAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHB1YmxpYyBhdXRob3I6IHN0cmluZztcbiAgcHVibGljIHVybDogc3RyaW5nO1xuICBwdWJsaWMgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIHB1YmxpYyBkdXJhdGlvbjogc3RyaW5nO1xuICBwdWJsaWMgdmlld3M6IG51bWJlcjtcbiAgcHVibGljIHJlcXVlc3RlZEJ5OiBVc2VyIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBwbGF5bGlzdD86IFBsYXlsaXN0O1xuICBwdWJsaWMgcXVlcnlUeXBlOiBTZWFyY2hRdWVyeVR5cGUgfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHVibGljIHJhdzogYW55O1xuICBwdWJsaWMgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyByZWFkb25seSBpZCA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICBwcml2YXRlIF9fbWV0YWRhdGE6IFQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfX3JlcU1ldGFkYXRhRm46ICgpID0+IFByb21pc2U8VCB8IG51bGw+O1xuICBwdWJsaWMgY2xlYW5UaXRsZTogc3RyaW5nO1xuICBwdWJsaWMgbGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgYnJpZGdlZEV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgYnJpZGdlZFRyYWNrOiBUcmFjayB8IG51bGwgPSBudWxsO1xuXG4gICNvblNlZWs6ICgoZXZlbnQ6IFNlZWtFdmVudCkgPT4gQXdhaXRlZDx2b2lkPikgfCBudWxsID0gbnVsbDtcbiAgI3Jlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPiB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUcmFjayBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgdGhhdCBpbnN0YW50aWF0ZWQgdGhpcyBUcmFja1xuICAgKiBAcGFyYW0gZGF0YSBUcmFjayBkYXRhXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcixcbiAgZGF0YTogUGFydGlhbDxXaXRoTWV0YWRhdGE8UmF3VHJhY2tEYXRhLCBUPj4pXG4gIHtcbiAgICB0aGlzLnRpdGxlID0gZXNjYXBlTWFya2Rvd24oZGF0YS50aXRsZSA/PyAnJyk7XG4gICAgdGhpcy5hdXRob3IgPSBkYXRhLmF1dGhvciA/PyAnJztcbiAgICB0aGlzLnVybCA9IGRhdGEudXJsID8/ICcnO1xuICAgIHRoaXMudGh1bWJuYWlsID0gZGF0YS50aHVtYm5haWwgPz8gJyc7XG4gICAgdGhpcy5kdXJhdGlvbiA9IGRhdGEuZHVyYXRpb24gPz8gJyc7XG4gICAgdGhpcy52aWV3cyA9IGRhdGEudmlld3MgPz8gMDtcbiAgICB0aGlzLnF1ZXJ5VHlwZSA9IGRhdGEucXVlcnlUeXBlO1xuICAgIHRoaXMucmVxdWVzdGVkQnkgPSBkYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgdGhpcy5wbGF5bGlzdCA9IGRhdGEucGxheWxpc3Q7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGAke3RoaXMudGl0bGV9IGJ5ICR7dGhpcy5hdXRob3J9YDtcbiAgICB0aGlzLnJhdyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7fSxcbiAgICAgIHsgc291cmNlOiBkYXRhLnJhdz8uc291cmNlID8/IGRhdGEuc291cmNlIH0sXG4gICAgICBkYXRhLnJhdyA/PyBkYXRhXG4gICAgKTtcbiAgICB0aGlzLl9fbWV0YWRhdGEgPSBkYXRhLm1ldGFkYXRhID8/IG51bGw7XG4gICAgdGhpcy5fX3JlcU1ldGFkYXRhRm4gPVxuICAgIGRhdGEucmVxdWVzdE1ldGFkYXRhIHx8ICgoKSA9PiBQcm9taXNlLnJlc29sdmU8VCB8IG51bGw+KG51bGwpKTtcbiAgICB0aGlzLmNsZWFuVGl0bGUgPVxuICAgIGRhdGEuY2xlYW5UaXRsZSA/PyBVdGlsLmNsZWFuVGl0bGUodGhpcy50aXRsZSwgdGhpcy5zb3VyY2UpO1xuICAgIHRoaXMubGl2ZSA9IGRhdGEubGl2ZSA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgdHJhY2sgY2FuIGJlIHNlZWtlZFxuICAgKi9cbiAgcHVibGljIGdldCBzZWVrYWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jb25TZWVrICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgb25TZWVrIGV2ZW50XG4gICAqIEBwYXJhbSBmbiBUaGUgb25TZWVrIGV2ZW50XG4gICAqL1xuICBwdWJsaWMgaGFuZGxlU2VlayhmbjogKGV2ZW50OiBTZWVrRXZlbnQpID0+IEF3YWl0ZWQ8dm9pZD4pIHtcbiAgICB0aGlzLiNvblNlZWsgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IHNlZWtcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBzZWVrIGV2ZW50XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VlayhldmVudDogU2Vla0V2ZW50KSB7XG4gICAgaWYgKHRoaXMuI29uU2VlaykgcmV0dXJuIHRoaXMuI29uU2VlayhldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhdWRpbyByZXNvdXJjZSBmb3IgdGhpcyB0cmFjay4gVGhpcyBpcyBub3QgdXNlZnVsIG91dHNpZGUgb2YgdGhlIGxpYnJhcnkuXG4gICAqIEBwYXJhbSByZXNvdXJjZSBBdWRpbyByZXNvdXJjZVxuICAgKi9cbiAgcHVibGljIHNldFJlc291cmNlKHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPiB8IG51bGwpIHtcbiAgICB0aGlzLiNyZXNvdXJjZSA9IHJlc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYXVkaW8gcmVzb3VyY2UgZm9yIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Jlc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyB0cmFjayBoYXMgYW4gYXVkaW8gcmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Jlc291cmNlICE9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBtZXRhZGF0YSBmb3IgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcXVlc3RNZXRhZGF0YSgpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLl9fcmVxTWV0YWRhdGFGbigpO1xuXG4gICAgdGhpcy5zZXRNZXRhZGF0YShyZXMpO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWV0YWRhdGEgZm9yIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBzZXRNZXRhZGF0YShtOiBUIHwgbnVsbCkge1xuICAgIHRoaXMuX19tZXRhZGF0YSA9IG07XG4gIH1cblxuICAvKipcbiAgICogTWV0YWRhdGEgb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldCBtZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5fX21ldGFkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgdHJhY2sgaGFzIG1ldGFkYXRhXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc01ldGFkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLm1ldGFkYXRhICE9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHF1ZXVlIGluIHdoaWNoIHRoaXMgdHJhY2sgaXMgbG9jYXRlZFxuICAgKi9cbiAgcHVibGljIGdldCBxdWV1ZSgpOiBHdWlsZFF1ZXVlIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuZmluZCgocSkgPT5cbiAgICBxLnRyYWNrcy5zb21lKChhYikgPT4gYWIuaWQgPT09IHRoaXMuaWQpXG4gICAgKSE7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRyYWNrIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kXG4gICAqL1xuICBwdWJsaWMgZ2V0IGR1cmF0aW9uTVMoKTogbnVtYmVyIHtcbiAgICBjb25zdCB0aW1lcyA9IChuOiBudW1iZXIsIHQ6IG51bWJlcikgPT4ge1xuICAgICAgbGV0IHRuID0gMTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdDsgaSsrKSB0biAqPSBuO1xuICAgICAgcmV0dXJuIHQgPD0gMCA/IDEwMDAgOiB0biAqIDEwMDA7XG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmR1cmF0aW9uLlxuICAgIHNwbGl0KCc6JykuXG4gICAgcmV2ZXJzZSgpLlxuICAgIG1hcCgobSwgaSkgPT4gcGFyc2VJbnQobSkgKiB0aW1lcyg2MCwgaSkpLlxuICAgIHJlZHVjZSgoYSwgYykgPT4gYSArIGMsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2NvcmQgaHlwZXJsaW5rIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyB0b0h5cGVybGluaygpOiBzdHJpbmcgLyogbm90IHVzaW5nIGBbJHtzdHJpbmd9XSgke3N0cmluZ30pYCB5ZXQgKi8ge1xuICAgIHJldHVybiBgWyR7dGhpcy50aXRsZX1dKCR7dGhpcy51cmx9KWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBzb3VyY2Ugb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldCBzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucmF3Py5zb3VyY2UgPz8gJ2FyYml0cmFyeSc7XG4gIH1cblxuICAvKipcbiAgICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHJhY2tcbiAgICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnRpdGxlfSBieSAke3RoaXMuYXV0aG9yfWA7XG4gIH1cblxuICAvKipcbiAgICogUmF3IEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIHRvSlNPTihoaWRlUGxheWxpc3Q/OiBib29sZWFuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgdGh1bWJuYWlsOiB0aGlzLnRodW1ibmFpbCxcbiAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgZHVyYXRpb25NUzogdGhpcy5kdXJhdGlvbk1TLFxuICAgICAgdmlld3M6IHRoaXMudmlld3MsXG4gICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeT8uaWQgfHwgbnVsbCxcbiAgICAgIHBsYXlsaXN0OiBoaWRlUGxheWxpc3QgPyBudWxsIDogdGhpcy5wbGF5bGlzdD8udG9KU09OKCkgPz8gbnVsbFxuICAgIH0gYXMgVHJhY2tKU09OO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZWQgdHJhY2sgZGF0YSB0aGF0IGNhbiBiZSByZWNvbnN0cnVjdGVkXG4gICAqL1xuICBwdWJsaWMgc2VyaWFsaXplKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICB0aHVtYm5haWw6IFR5cGVVdGlsLmlzU3RyaW5nKHRoaXMudGh1bWJuYWlsKSA/XG4gICAgICB0aGlzLnRodW1ibmFpbCA6XG4gICAgICB0cnlJbnRvVGh1bWJuYWlsU3RyaW5nKHRoaXMudGh1bWJuYWlsKSxcbiAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgdmlld3M6IHRoaXMudmlld3MgPz8gMCxcbiAgICAgIHJlcXVlc3RlZF9ieTogdGhpcy5yZXF1ZXN0ZWRCeT8udG9KU09OKCkgPz8gbnVsbCxcbiAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICBsaXZlOiBmYWxzZSxcbiAgICAgIHF1ZXJ5X3R5cGU6IHRoaXMucXVlcnlUeXBlLFxuICAgICAgZXh0cmFjdG9yOiB0aGlzLmV4dHJhY3Rvcj8uaWRlbnRpZmllciA/PyBudWxsLFxuICAgICAgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGEsXG4gICAgICAkdHlwZTogU2VyaWFsaXplZFR5cGUuVHJhY2ssXG4gICAgICAkZW5jb2Rlcl92ZXJzaW9uOiB0aGlzLnBsYXllci52ZXJzaW9uXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgYSB0cmFjayBmcm9tIHNlcmlhbGl6ZWQgZGF0YVxuICAgKiBAcGFyYW0gcGxheWVyIFBsYXllciBpbnN0YW5jZVxuICAgKiBAcGFyYW0gZGF0YSBTZXJpYWxpemVkIGRhdGFcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVNlcmlhbGl6ZWQoXG4gIHBsYXllcjogUGxheWVyLFxuICBkYXRhOiBSZXR1cm5UeXBlPFRyYWNrWydzZXJpYWxpemUnXT4pXG4gIHtcbiAgICBpZiAoZGF0YS4kdHlwZSAhPT0gU2VyaWFsaXplZFR5cGUuVHJhY2spXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoXG4gICAgICAnZGF0YScsXG4gICAgICAnU2VyaWFsaXplZFRyYWNrJyxcbiAgICAgICdtYWxmb3JtZWQgZGF0YSdcbiAgICApO1xuICAgIGNvbnN0IHRyYWNrID0gbmV3IFRyYWNrKHBsYXllciwge1xuICAgICAgLi4uZGF0YSxcbiAgICAgIHJlcXVlc3RlZEJ5OiBkYXRhLnJlcXVlc3RlZF9ieSA/XG4gICAgICAoKCkgPT4ge1xuICAgICAgICBjb25zdCByZXMgPSBkYXRhLnJlcXVlc3RlZF9ieSBhcyBBUElVc2VyO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gcGxheWVyLmNsaWVudC51c2Vycy5yZXNvbHZlKHJlcy5pZCk7XG4gICAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgICAgICAgaWYgKHBsYXllci5jbGllbnQudXNlcnMuY2FjaGUuaGFzKHJlcy5pZCkpXG4gICAgICAgICAgcmV0dXJuIHBsYXllci5jbGllbnQudXNlcnMuY2FjaGUuZ2V0KHJlcy5pZCkhO1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICBjb25zdCB1c2VyID0gbmV3IFVzZXIocGxheWVyLmNsaWVudCwgcmVzKTtcbiAgICAgICAgICByZXR1cm4gdXNlcjtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pKCkgOlxuICAgICAgbnVsbCxcbiAgICAgIHF1ZXJ5VHlwZTogZGF0YS5xdWVyeV90eXBlID8/IHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgdHJhY2suc2V0TWV0YWRhdGEoZGF0YS5tZXRhZGF0YSk7XG5cbiAgICByZXR1cm4gdHJhY2s7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGJlbG9uZ2luZyBxdWV1ZXMgb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldEJlbG9uZ2luZ1F1ZXVlcygpIHtcbiAgICBjb25zdCBub2RlcyA9IHRoaXMucGxheWVyLm5vZGVzLmNhY2hlLmZpbHRlcigobm9kZSkgPT5cbiAgICBub2RlLnRyYWNrcy5zb21lKCh0KSA9PiB0LmlkID09PSB0aGlzLmlkKVxuICAgICk7XG5cbiAgICByZXR1cm4gbm9kZXMgYXMgQ29sbGVjdGlvbjxzdHJpbmcsIEd1aWxkUXVldWU8dW5rbm93bj4+O1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdGhpcyB0cmFjayB0byB0aGUgZ2l2ZW4gdm9pY2UgY2hhbm5lbC4gSWYgcXVldWUgZXhpc3RzIGFuZCBhbm90aGVyIHRyYWNrIGlzIGJlaW5nIHBsYXllZCwgdGhpcyB0cmFjayB3aWxsIGJlIGFkZGVkIHRvIHRoZSBxdWV1ZS5cbiAgICogQHBhcmFtIGNoYW5uZWwgVm9pY2UgY2hhbm5lbCBvbiB3aGljaCB0aGlzIHRyYWNrIHNoYWxsIGJlIHBsYXllZFxuICAgKiBAcGFyYW0gb3B0aW9ucyBOb2RlIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwbGF5PFQgPSB1bmtub3duPihcbiAgY2hhbm5lbDogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICBvcHRpb25zPzogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPilcbiAgOiBQcm9taXNlPFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUPj4ge1xuICAgIGNvbnN0IGZuID0gdGhpcy5wbGF5ZXIucGxheS5iaW5kKHRoaXMucGxheWVyKTtcblxuICAgIHJldHVybiBhd2FpdCBmbihjaGFubmVsLCB0aGlzLCBvcHRpb25zKTtcbiAgfVxufSIsICJleHBvcnQgY2xhc3MgRGlzY29yZFBsYXllckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY29kZTogRXJyb3JDb2RlcztcbiAgcHVibGljIHJlYWRvbmx5IHRpbWVzdGFtcDogbnVtYmVyID0gRGF0ZS5ub3coKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoY29kZTogRXJyb3JDb2RlcywgbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG5cbiAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHRoaXMuY29uc3RydWN0b3IubmFtZSxcbiAgICAgIGNvZGU6IHRoaXMuY29kZSxcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIHRpbWVzdGFtcDogdGhpcy50aW1lc3RhbXBcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPdXRPZlNwYWNlRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZywgY2FwYWNpdHk6IG51bWJlciwgdG90YWw6IG51bWJlcikge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfT1VUX09GX1NQQUNFLFxuICAgICAgYE1heCBjYXBhY2l0eSByZWFjaGVkIGZvciAke3RhcmdldH0gKENhcGFjaXR5ICR7Y2FwYWNpdHl9L1RvdGFsICR7dG90YWx9KWBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkQXJnVHlwZUVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIGV4cGVjdGF0aW9uOiBzdHJpbmcsIGZvdW5kOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX0lOVkFMSURfQVJHX1RZUEUsXG4gICAgICBgRXhwZWN0ZWQgJHt0YXJnZXR9IHRvIGJlIFwiJHtleHBlY3RhdGlvbn1cIiwgcmVjZWl2ZWQgXCIke2ZvdW5kfVwiYFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vUmVzdWx0RXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9OT19SRVNVTFQsIG1lc3NhZ2UpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb3RJbXBsZW1lbnRlZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9OT1RfSU1QTEVNRU5URUQsIGAke3RhcmdldH0gaXMgbm90IHlldCBpbXBsZW1lbnRlZGApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb3RFeGlzdGluZ0Vycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9OT1RfRVhJU1RJTkcsIGAke3RhcmdldH0gZG9lcyBub3QgZXhpc3RgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT3V0T2ZSYW5nZUVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIG1pbmltdW06IHN0cmluZywgbWF4aW11bTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9PVVRfT0ZfUkFOR0UsXG4gICAgICBgJHt0YXJnZXR9IGlzIG91dCBvZiByYW5nZSAoRXhwZWN0ZWQgbWluaW11bSAke21pbmltdW19IGFuZCBtYXhpbXVtICR7bWF4aW11bX0sIGdvdCAke3ZhbHVlfSlgXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9Wb2ljZUNvbm5lY3Rpb25FcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX05PX1ZPSUNFX0NPTk5FQ1RJT04sXG4gICAgICBtZXNzYWdlIHx8XG4gICAgICAnTm8gdm9pY2UgY29ubmVjdGlvbiBhdmFpbGFibGUsIG1heWJlIGNvbm5lY3QgdG8gYSB2b2ljZSBjaGFubmVsIGZpcnN0PydcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBWb2ljZUNvbm5lY3Rpb25EZXN0cm95ZWRFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfVk9JQ0VfQ09OTkVDVElPTl9ERVNUUk9ZRUQsXG4gICAgICAnQ2Fubm90IHVzZSBkZXN0cm95ZWQgdm9pY2UgY29ubmVjdGlvbidcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb1ZvaWNlQ2hhbm5lbEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfTk9fVk9JQ0VfQ0hBTk5FTCwgJ0NvdWxkIG5vdCBnZXQgdGhlIHZvaWNlIGNoYW5uZWwnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZFZvaWNlQ2hhbm5lbEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfSU5WQUxJRF9WT0lDRV9DSEFOTkVMLCAnRXhwZWN0ZWQgYSB2b2ljZSBjaGFubmVsJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vUmVjZWl2ZXJFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX05PX1JFQ0VJVkVSLFxuICAgICAgbWVzc2FnZSB8fFxuICAgICAgJ05vIHZvaWNlIHJlY2VpdmVyIGlzIGF2YWlsYWJsZSwgbWF5YmUgY29ubmVjdCB0byBhIHZvaWNlIGNoYW5uZWwgZmlyc3Q/J1xuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZGbXBlZ0Vycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfRkZNUEVHX0xPQ0FUT1IsIG1lc3NhZ2UpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb0F1ZGlvUmVzb3VyY2VFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX05PX0FVRElPX1JFU09VUkNFLFxuICAgICAgbWVzc2FnZSB8fCAnRXhwZWN0ZWQgYW4gYXVkaW8gcmVzb3VyY2UnXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9HdWlsZFF1ZXVlRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfTk9fR1VJTERfUVVFVUUsIG1lc3NhZ2UgfHwgJ0V4cGVjdGVkIGEgZ3VpbGQgcXVldWUnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9HdWlsZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX05PX0dVSUxELCBtZXNzYWdlIHx8ICdFeHBlY3RlZCBhIGd1aWxkJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEluZm9SZXF1aXJlZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIGFjdHVhbDogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9JTkZPX1JFUVVJUkVELFxuICAgICAgYEV4cGVjdGVkICR7dGFyZ2V0fSwgZm91bmQgXCIke2FjdHVhbH1cImBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemF0aW9uRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX1NFUklBTElaQVRJT05fRkFJTEVELFxuICAgICAgXCJEb24ndCBrbm93IGhvdyB0byBzZXJpYWxpemUgdGhpcyBkYXRhXCJcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZXNlcmlhbGl6YXRpb25FcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfREVTRVJJQUxJWkFUSU9OX0ZBSUxFRCxcbiAgICAgIFwiRG9uJ3Qga25vdyBob3cgdG8gZGVzZXJpYWxpemUgdGhpcyBkYXRhXCJcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbGxlZ2FsSG9va0ludm9jYXRpb25FcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHRhcmdldDogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTixcbiAgICAgIGBJbGxlZ2FsIGludm9jYXRpb24gb2YgJHt0YXJnZXR9IGhvb2suJHttZXNzYWdlID8gYCAke21lc3NhZ2V9YCA6ICcnfWBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNb2R1bGVOb3RGb3VuZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIGRlc2NyaXB0aW9uID0gJycpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX05PVF9FWElTVElOR19NT0RVTEUsXG4gICAgICBgJHt0YXJnZXR9IG1vZHVsZSBkb2VzIG5vdCBleGlzdC4gSW5zdGFsbCBpdCB3aXRoIFxcYG5wbSBpbnN0YWxsICR7dGFyZ2V0fVxcYC4ke1xuICAgICAgZGVzY3JpcHRpb24gPyAnICcgKyBkZXNjcmlwdGlvbiA6ICcnfWBcblxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJyaWRnZUZhaWxlZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IoaWQ6IHN0cmluZyB8IG51bGwsIGVycm9yOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX0JSSURHRV9GQUlMRUQsXG4gICAgICBgJHtcbiAgICAgIGlkID8gYChFeHRyYWN0b3IgRXhlY3V0aW9uIENvbnRleHQgSUQgaXMgJHtpZH0pYCA6ICcnfUZhaWxlZCB0byBicmlkZ2UgdGhpcyBxdWVyeTpcXG4ke1xuICAgICAgZXJyb3J9YFxuICAgICk7XG4gIH1cbn1cblxuLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5leHBvcnQgY29uc3QgRXJyb3JDb2RlcyA9IHtcbiAgRVJSX09VVF9PRl9TUEFDRTogJ0VSUl9PVVRfT0ZfU1BBQ0UnLFxuICBFUlJfSU5WQUxJRF9BUkdfVFlQRTogJ0VSUl9JTlZBTElEX0FSR19UWVBFJyxcbiAgRVJSX05PX1JFU1VMVDogJ0VSUl9OT19SRVNVTFQnLFxuICBFUlJfTk9UX0lNUExFTUVOVEVEOiAnRVJSX05PVF9JTVBMRU1FTlRFRCcsXG4gIEVSUl9OT1RfRVhJU1RJTkc6ICdFUlJfTk9UX0VYSVNUSU5HJyxcbiAgRVJSX09VVF9PRl9SQU5HRTogJ0VSUl9PVVRfT0ZfUkFOR0UnLFxuICBFUlJfTk9fVk9JQ0VfQ09OTkVDVElPTjogJ0VSUl9OT19WT0lDRV9DT05ORUNUSU9OJyxcbiAgRVJSX1ZPSUNFX0NPTk5FQ1RJT05fREVTVFJPWUVEOiAnRVJSX1ZPSUNFX0NPTk5FQ1RJT05fREVTVFJPWUVEJyxcbiAgRVJSX05PX1ZPSUNFX0NIQU5ORUw6ICdFUlJfTk9fVk9JQ0VfQ0hBTk5FTCcsXG4gIEVSUl9JTlZBTElEX1ZPSUNFX0NIQU5ORUw6ICdFUlJfSU5WQUxJRF9WT0lDRV9DSEFOTkVMJyxcbiAgRVJSX05PX1JFQ0VJVkVSOiAnRVJSX05PX1JFQ0VJVkVSJyxcbiAgRVJSX0ZGTVBFR19MT0NBVE9SOiAnRVJSX0ZGTVBFR19MT0NBVE9SJyxcbiAgRVJSX05PX0FVRElPX1JFU09VUkNFOiAnRVJSX05PX0FVRElPX1JFU09VUkNFJyxcbiAgRVJSX05PX0dVSUxEX1FVRVVFOiAnRVJSX05PX0dVSUxEX1FVRVVFJyxcbiAgRVJSX05PX0dVSUxEOiAnRVJSX05PX0dVSUxEJyxcbiAgRVJSX0lORk9fUkVRVUlSRUQ6ICdFUlJfSU5GT19SRVFVSVJFRCcsXG4gIEVSUl9TRVJJQUxJWkFUSU9OX0ZBSUxFRDogJ0VSUl9TRVJJQUxJWkFUSU9OX0ZBSUxFRCcsXG4gIEVSUl9ERVNFUklBTElaQVRJT05fRkFJTEVEOiAnRVJSX0RFU0VSSUFMSVpBVElPTl9GQUlMRUQnLFxuICBFUlJfSUxMRUdBTF9IT09LX0lOVk9DQVRJT046ICdFUlJfSUxMRUdBTF9IT09LX0lOVk9DQVRJT04nLFxuICBFUlJfTk9UX0VYSVNUSU5HX01PRFVMRTogJ0VSUl9OT1RfRVhJU1RJTkdfTU9EVUxFJyxcbiAgRVJSX0JSSURHRV9GQUlMRUQ6ICdFUlJfQlJJREdFX0ZBSUxFRCdcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEVycm9yQ29kZXMgPSAodHlwZW9mIEVycm9yQ29kZXMpW2tleW9mIHR5cGVvZiBFcnJvckNvZGVzXTtcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaXNEaXNjb3JkUGxheWVyRXJyb3IoZXJyb3I6IGFueSk6IGVycm9yIGlzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIHJldHVybiBlcnJvciAhPSBudWxsICYmIGVycm9yIGluc3RhbmNlb2YgRGlzY29yZFBsYXllckVycm9yO1xufVxuXG4vKipcbiAqIEhhbmRsZSBhIGBEaXNjb3JkUGxheWVyRXJyb3JgIGVycm9yLlxuICogQHBhcmFtIGVycm9yIFRoZSBlcnJvciB0byBoYW5kbGVcbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgdGhlIGVycm9yIGlzIGEgYERpc2NvcmRQbGF5ZXJFcnJvcmAuXG4gKiBAcGFyYW0gYXJncyBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGhhbmRsZXJcbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIGhhbmRsZXJcbiAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAqIHRyeSB7XG4gKiAgIC8vIC4uLlxuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICBoYW5kbGVEaXNjb3JkUGxheWVyRXJyb3IoZXJyb3IsIChlcnJvcikgPT4ge1xuICogICAgY29uc29sZS5lcnJvcihgQW4gZXJyb3Igb2NjdXJyZWQgZnJvbSBkaXNjb3JkLXBsYXllcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICogIH0pO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVEaXNjb3JkUGxheWVyRXJyb3I8XG4gIFQgZXh0ZW5kcyBhbnlbXSxcbiAgRiBleHRlbmRzIChlcnJvcjogRGlzY29yZFBsYXllckVycm9yLCAuLi5hcmdzOiBUKSA9PiBhbnksXG4gIFIgZXh0ZW5kcyBSZXR1cm5UeXBlPEY+PihcbmVycm9yOiBhbnksIGhhbmRsZXI6IEYsIGFyZ3M6IFQpOiBSIHtcbiAgaWYgKGlzRGlzY29yZFBsYXllckVycm9yKGVycm9yKSkge1xuICAgIHJldHVybiBoYW5kbGVyKGVycm9yLCAuLi5hcmdzKSBhcyBSO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZCBhcyBSO1xufVxuXG4vKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi8iLCAiaW1wb3J0IHsgRGlzY29yZFBsYXllckVycm9yLCBpc0Rpc2NvcmRQbGF5ZXJFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBjbGFzcyBUeXBlVXRpbCB7XG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgcmV0dXJuIFR5cGVVdGlsO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbiAgcHVibGljIHN0YXRpYyBpc0Z1bmN0aW9uKHQ6IHVua25vd24pOiB0IGlzIEZ1bmN0aW9uIHtcbiAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdmdW5jdGlvbic7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzTnVtYmVyKHQ6IHVua25vd24pOiB0IGlzIG51bWJlciB7XG4gICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzU3RyaW5nKHQ6IHVua25vd24pOiB0IGlzIHN0cmluZyB7XG4gICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnc3RyaW5nJztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNCb29sZWFuKHQ6IHVua25vd24pOiB0IGlzIGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgdCA9PT0gJ2Jvb2xlYW4nO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc051bGxpc2godDogdW5rbm93bik6IHQgaXMgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHQgPT0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNBcnJheSh0OiB1bmtub3duKTogdCBpcyB1bmtub3duW10ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHQpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0Vycm9yKHQ6IHVua25vd24pOiB0IGlzIEVycm9yIHtcbiAgICByZXR1cm4gdCBpbnN0YW5jZW9mIEVycm9yO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0Rpc2NvcmRQbGF5ZXJFcnJvcih0OiB1bmtub3duKTogdCBpcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICAgIHJldHVybiBpc0Rpc2NvcmRQbGF5ZXJFcnJvcih0KTtcbiAgfVxufSIsICIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbmltcG9ydCB7IERlc2VyaWFsaXphdGlvbkVycm9yLCBTZXJpYWxpemF0aW9uRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgUGxheWxpc3QsXG4gIHR5cGUgU2VyaWFsaXplZFRyYWNrLFxuICBUcmFjayxcbiAgU2VyaWFsaXplZFBsYXlsaXN0IH0gZnJvbVxuJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4vVHlwZVV0aWwnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5cbmV4cG9ydCBlbnVtIFNlcmlhbGl6ZWRUeXBlIHtcbiAgVHJhY2sgPSAndHJhY2snLFxuICBQbGF5bGlzdCA9ICdwbGF5bGlzdCcsXG59XG5cbmV4cG9ydCB0eXBlIEVuY29kYWJsZSA9IFNlcmlhbGl6ZWRUcmFjayB8IFNlcmlhbGl6ZWRQbGF5bGlzdDtcblxuY29uc3QgaXNUcmFjayA9IChkYXRhOiBhbnkpOiBkYXRhIGlzIFNlcmlhbGl6ZWRUcmFjayA9PlxuZGF0YS4kdHlwZSA9PT0gU2VyaWFsaXplZFR5cGUuVHJhY2s7XG5jb25zdCBpc1BsYXlsaXN0ID0gKGRhdGE6IGFueSk6IGRhdGEgaXMgU2VyaWFsaXplZFBsYXlsaXN0ID0+XG5kYXRhLiR0eXBlID09PSBTZXJpYWxpemVkVHlwZS5QbGF5bGlzdDtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZShkYXRhOiBUcmFjayB8IFBsYXlsaXN0IHwgYW55KSB7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgVHJhY2spIHJldHVybiBkYXRhLnNlcmlhbGl6ZSgpO1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIFBsYXlsaXN0KSByZXR1cm4gZGF0YS5zZXJpYWxpemUoKTtcblxuICB0cnkge1xuICAgIHJldHVybiBkYXRhLnRvSlNPTigpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplKHBsYXllcjogUGxheWVyLCBkYXRhOiBFbmNvZGFibGUpIHtcbiAgaWYgKGlzVHJhY2soZGF0YSkpIHJldHVybiBUcmFjay5mcm9tU2VyaWFsaXplZChwbGF5ZXIsIGRhdGEpO1xuICBpZiAoaXNQbGF5bGlzdChkYXRhKSkgcmV0dXJuIFBsYXlsaXN0LmZyb21TZXJpYWxpemVkKHBsYXllciwgZGF0YSk7XG5cbiAgdGhyb3cgbmV3IERlc2VyaWFsaXphdGlvbkVycm9yKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGUoZGF0YTogRW5jb2RhYmxlKSB7XG4gIGNvbnN0IHN0ciA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuXG4gIHJldHVybiBCdWZmZXIuZnJvbShzdHIpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZShkYXRhOiBzdHJpbmcpIHtcbiAgY29uc3Qgc3RyID0gQnVmZmVyLmZyb20oZGF0YSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCk7XG5cbiAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyeUludG9UaHVtYm5haWxTdHJpbmcoZGF0YTogYW55KSB7XG4gIGlmICghZGF0YSkgcmV0dXJuIG51bGw7XG4gIHRyeSB7XG4gICAgaWYgKFR5cGVVdGlsLmlzU3RyaW5nKGRhdGEpKSByZXR1cm4gZGF0YTtcbiAgICByZXR1cm4gZGF0YT8udXJsID8/IGRhdGE/LnRodW1ibmFpbD8udXJsID8/IG51bGw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59IiwgImltcG9ydCB7XG4gIFBsYXllcixcbiAgUGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0LFxuICBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zIH0gZnJvbVxuJy4uL1BsYXllcic7XG5pbXBvcnQgeyBUcmFjaywgVHJhY2tKU09OLCBUcmFja1NvdXJjZSB9IGZyb20gJy4vVHJhY2snO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBTZXJpYWxpemVkVHlwZSwgdHJ5SW50b1RodW1ibmFpbFN0cmluZyB9IGZyb20gJy4uL3V0aWxzL3NlcmRlJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgSW52YWxpZEFyZ1R5cGVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRQbGF5bGlzdCA9IFJldHVyblR5cGU8UGxheWxpc3RbJ3NlcmlhbGl6ZSddPjtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5bGlzdEluaXREYXRhIHtcbiAgLyoqXG4gICAqIFRoZSB0cmFja3Mgb2YgdGhpcyBwbGF5bGlzdFxuICAgKi9cbiAgdHJhY2tzOiBUcmFja1tdO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHRpdGxlXG4gICAqL1xuICB0aXRsZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uXG4gICAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRodW1ibmFpbFxuICAgKi9cbiAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgdHlwZTogYGFsYnVtYCB8IGBwbGF5bGlzdGBcbiAgICovXG4gIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHNvdXJjZVxuICAgKi9cbiAgc291cmNlOiBUcmFja1NvdXJjZTtcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCBhdXRob3JcbiAgICovXG4gIGF1dGhvcjoge1xuICAgIC8qKlxuICAgICAqIFRoZSBhdXRob3IgbmFtZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYXV0aG9yIHVybFxuICAgICAqL1xuICAgIHVybDogc3RyaW5nO1xuICB9O1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IGlkXG4gICAqL1xuICBpZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHVybFxuICAgKi9cbiAgdXJsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcmF3IHBsYXlsaXN0IGRhdGFcbiAgICovXG4gIHJhd1BsYXlsaXN0PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5bGlzdEpTT04ge1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IGlkXG4gICAqL1xuICBpZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHVybFxuICAgKi9cbiAgdXJsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgdGl0bGVcbiAgICovXG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgZGVzY3JpcHRpb25cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdGh1bWJuYWlsXG4gICAqL1xuICB0aHVtYm5haWw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCB0eXBlOiBgYWxidW1gIHwgYHBsYXlsaXN0YFxuICAgKi9cbiAgdHlwZTogJ2FsYnVtJyB8ICdwbGF5bGlzdCc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgc291cmNlXG4gICAqL1xuICBzb3VyY2U6IFRyYWNrU291cmNlO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IGF1dGhvclxuICAgKi9cbiAgYXV0aG9yOiB7XG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhvciBuYW1lXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdXRob3IgdXJsXG4gICAgICovXG4gICAgdXJsOiBzdHJpbmc7XG4gIH07XG4gIC8qKlxuICAgKiBUaGUgdHJhY2tzIGRhdGEgKGlmIGFueSlcbiAgICovXG4gIHRyYWNrczogVHJhY2tKU09OW107XG59XG5cbmV4cG9ydCBjbGFzcyBQbGF5bGlzdCB7XG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcjtcbiAgcHVibGljIHRyYWNrczogVHJhY2tbXTtcbiAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBwdWJsaWMgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIHB1YmxpYyB0eXBlOiAnYWxidW0nIHwgJ3BsYXlsaXN0JztcbiAgcHVibGljIHNvdXJjZTogVHJhY2tTb3VyY2U7XG4gIHB1YmxpYyBhdXRob3I6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdXJsOiBzdHJpbmc7XG4gIH07XG4gIHB1YmxpYyBpZDogc3RyaW5nO1xuICBwdWJsaWMgdXJsOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSByYXdQbGF5bGlzdD86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cbiAgLyoqXG4gICAqIFBsYXlsaXN0IGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIgVGhlIHBsYXllclxuICAgKiBAcGFyYW0ge1BsYXlsaXN0SW5pdERhdGF9IGRhdGEgVGhlIGRhdGFcbiAgICovXG4gIGNvbnN0cnVjdG9yKHBsYXllcjogUGxheWVyLCBkYXRhOiBQbGF5bGlzdEluaXREYXRhKSB7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYXllclxuICAgICAqIEBuYW1lIFBsYXlsaXN0I3BsYXllclxuICAgICAqIEB0eXBlIHtQbGF5ZXJ9XG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2tzIGluIHRoaXMgcGxheWxpc3RcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCN0cmFja3NcbiAgICAgKiBAdHlwZSB7VHJhY2tbXX1cbiAgICAgKi9cbiAgICB0aGlzLnRyYWNrcyA9IGRhdGEudHJhY2tzID8/IFtdO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhvciBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICogQG5hbWUgUGxheWxpc3QjYXV0aG9yXG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKi9cbiAgICB0aGlzLmF1dGhvciA9IGRhdGEuYXV0aG9yO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uXG4gICAgICogQG5hbWUgUGxheWxpc3QjZGVzY3JpcHRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkYXRhLmRlc2NyaXB0aW9uO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRodW1ibmFpbCBvZiB0aGlzIHBsYXlsaXN0XG4gICAgICogQG5hbWUgUGxheWxpc3QjdGh1bWJuYWlsXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnRodW1ibmFpbCA9IGRhdGEudGh1bWJuYWlsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IHR5cGU6XG4gICAgICogLSBgYWxidW1gXG4gICAgICogLSBgcGxheWxpc3RgXG4gICAgICogQG5hbWUgUGxheWxpc3QjdHlwZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy50eXBlID0gZGF0YS50eXBlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNvdXJjZSBvZiB0aGlzIHBsYXlsaXN0OlxuICAgICAqIC0gYHlvdXR1YmVgXG4gICAgICogLSBgc291bmRjbG91ZGBcbiAgICAgKiAtIGBzcG90aWZ5YFxuICAgICAqIC0gYGFyYml0cmFyeWBcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCNzb3VyY2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuc291cmNlID0gZGF0YS5zb3VyY2U7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgaWRcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCNpZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5pZCA9IGRhdGEuaWQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdXJsXG4gICAgICogQG5hbWUgUGxheWxpc3QjdXJsXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnVybCA9IGRhdGEudXJsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXlsaXN0IHRpdGxlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcblxuICAgIC8qKlxuICAgICAqIEBuYW1lIFBsYXlsaXN0I3Jhd1BsYXlsaXN0XG4gICAgICogQHR5cGUge2FueX1cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgfVxuXG4gICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICB5aWVsZCogdGhpcy50cmFja3M7XG4gIH1cblxuICAvKipcbiAgICogRXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICovXG4gIHB1YmxpYyBnZXQgZXN0aW1hdGVkRHVyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnJlZHVjZSgocCwgYykgPT4gcCArIGMuZHVyYXRpb25NUywgMCk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0dGVkIGVzdGltYXRlZCBkdXJhdGlvbiBvZiB0aGlzIHBsYXlsaXN0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGR1cmF0aW9uRm9ybWF0dGVkKCkge1xuICAgIHJldHVybiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRoaXMuZXN0aW1hdGVkRHVyYXRpb24pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICogQHBhcmFtIHtib29sZWFufSBbd2l0aFRyYWNrcz10cnVlXSBJZiBpdCBzaG91bGQgYnVpbGQganNvbiB3aXRoIHRyYWNrc1xuICAgKiBAcmV0dXJucyB7UGxheWxpc3RKU09OfVxuICAgKi9cbiAgdG9KU09OKHdpdGhUcmFja3MgPSB0cnVlKSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICB0aHVtYm5haWw6IHRoaXMudGh1bWJuYWlsLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICB0cmFja3M6IFtdIGFzIFRyYWNrSlNPTltdXG4gICAgfTtcblxuICAgIGlmICh3aXRoVHJhY2tzKSBwYXlsb2FkLnRyYWNrcyA9IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpO1xuXG4gICAgcmV0dXJuIHBheWxvYWQgYXMgUGxheWxpc3RKU09OO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSB0aGlzIHBsYXlsaXN0IGludG8gcmVjb25zdHJ1Y3RhYmxlIGRhdGFcbiAgICovXG4gIHB1YmxpYyBzZXJpYWxpemUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYWNrczogdGhpcy50cmFja3MubWFwKChtKSA9PiBtLnNlcmlhbGl6ZSgpKSxcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICB0aHVtYm5haWw6IFR5cGVVdGlsLmlzU3RyaW5nKHRoaXMudGh1bWJuYWlsKSA/XG4gICAgICB0aGlzLnRodW1ibmFpbCA6XG4gICAgICB0cnlJbnRvVGh1bWJuYWlsU3RyaW5nKHRoaXMudGh1bWJuYWlsKSxcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICBhdXRob3I6IHRoaXMuYXV0aG9yLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgJHR5cGU6IFNlcmlhbGl6ZWRUeXBlLlBsYXlsaXN0LFxuICAgICAgJGVuY29kZXJfdmVyc2lvbjogdGhpcy5wbGF5ZXIudmVyc2lvblxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgdGhpcyBwbGF5bGlzdCBmcm9tIHNlcmlhbGl6ZWQgZGF0YVxuICAgKiBAcGFyYW0gcGxheWVyIFBsYXllciBpbnN0YW5jZVxuICAgKiBAcGFyYW0gZGF0YSBTZXJpYWxpemVkIGRhdGFcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVNlcmlhbGl6ZWQocGxheWVyOiBQbGF5ZXIsIGRhdGE6IFNlcmlhbGl6ZWRQbGF5bGlzdCkge1xuICAgIGlmIChkYXRhLiR0eXBlICE9PSBTZXJpYWxpemVkVHlwZS5QbGF5bGlzdClcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICdkYXRhJyxcbiAgICAgICdTZXJpYWxpemVkUGxheWxpc3QnLFxuICAgICAgJ21hbGZvcm1lZCBkYXRhJ1xuICAgICk7XG4gICAgcmV0dXJuIG5ldyBQbGF5bGlzdChwbGF5ZXIsIHtcbiAgICAgIC4uLmRhdGEsXG4gICAgICB0cmFja3M6IGRhdGEudHJhY2tzLm1hcCgobSkgPT4gVHJhY2suZnJvbVNlcmlhbGl6ZWQocGxheWVyLCBtKSlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHRoaXMgcGxheWxpc3QgdG8gdGhlIGdpdmVuIHZvaWNlIGNoYW5uZWwuIElmIHF1ZXVlIGV4aXN0cyBhbmQgYW5vdGhlciB0cmFjayBpcyBiZWluZyBwbGF5ZWQsIHRoaXMgcGxheWxpc3Qgd2lsbCBiZSBhZGRlZCB0byB0aGUgcXVldWUuXG4gICAqIEBwYXJhbSBjaGFubmVsIFZvaWNlIGNoYW5uZWwgb24gd2hpY2ggdGhpcyBwbGF5bGlzdCBzaGFsbCBiZSBwbGF5ZWRcbiAgICogQHBhcmFtIG9wdGlvbnMgTm9kZSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcGxheTxUID0gdW5rbm93bj4oXG4gIGNoYW5uZWw6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSxcbiAgb3B0aW9ucz86IFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8VD4pXG4gIDogUHJvbWlzZTxQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQ8VD4+IHtcbiAgICBjb25zdCBmbiA9IHRoaXMucGxheWVyLnBsYXkuYmluZCh0aGlzLnBsYXllcik7XG5cbiAgICByZXR1cm4gYXdhaXQgZm4oY2hhbm5lbCwgdGhpcywgb3B0aW9ucyk7XG4gIH1cbn0iLCAiaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuL1R5cGVVdGlsJztcbmltcG9ydCB7IEluZm9SZXF1aXJlZEVycm9yLCBJbnZhbGlkQXJnVHlwZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IGZldGNoIH0gZnJvbSAndW5kaWNpJztcblxuLy8gI3JlZ2lvbiBzY2FyeSB0aGluZ3MgYmVsb3cgKnNpZ2gqXG5jb25zdCBzcG90aWZ5U29uZ1JlZ2V4ID1cbi9eaHR0cHM/OlxcL1xcLyg/OmVtYmVkXFwufG9wZW5cXC4pKD86c3BvdGlmeVxcLmNvbVxcLykoaW50bC0oW2Etel18W0EtWl0pK1xcLyk/KD86dHJhY2tcXC98XFw/dXJpPXNwb3RpZnk6dHJhY2s6KSgoXFx3fC0pezIyfSkoXFw/c2k9LispPyQvO1xuY29uc3Qgc3BvdGlmeVBsYXlsaXN0UmVnZXggPVxuL15odHRwcz86XFwvXFwvKD86ZW1iZWRcXC58b3BlblxcLikoPzpzcG90aWZ5XFwuY29tXFwvKShpbnRsLShbYS16XXxbQS1aXSkrXFwvKT8oPzpwbGF5bGlzdFxcL3xcXD91cmk9c3BvdGlmeTpwbGF5bGlzdDopKChcXHd8LSl7MjJ9KShcXD9zaT0uKyk/JC87XG5jb25zdCBzcG90aWZ5QWxidW1SZWdleCA9XG4vXmh0dHBzPzpcXC9cXC8oPzplbWJlZFxcLnxvcGVuXFwuKSg/OnNwb3RpZnlcXC5jb21cXC8pKGludGwtKFthLXpdfFtBLVpdKStcXC8pPyg/OmFsYnVtXFwvfFxcP3VyaT1zcG90aWZ5OmFsYnVtOikoKFxcd3wtKXsyMn0pKFxcP3NpPS4rKT8kLztcbmNvbnN0IHZpbWVvUmVnZXggPVxuL14oaHR0cHxodHRwcyk/OlxcL1xcLyh3d3dcXC58cGxheWVyXFwuKT92aW1lb1xcLmNvbVxcLyg/OmNoYW5uZWxzXFwvKD86XFx3K1xcLyk/fGdyb3Vwc1xcLyhbXi9dKilcXC92aWRlb3NcXC98dmlkZW9cXC98KShcXGQrKSg/OnxcXC9cXD8pJC87XG5jb25zdCByZXZlcmJuYXRpb25SZWdleCA9XG4vXmh0dHBzOlxcL1xcLyh3d3cuKT9yZXZlcmJuYXRpb24uY29tXFwvKC4rKVxcL3NvbmdcXC8oLispJC87XG5jb25zdCBhdHRhY2htZW50UmVnZXggPSAvXmh0dHBzPzpcXC9cXC8uKyQvO1xuY29uc3QgYXBwbGVNdXNpY1NvbmdSZWdleCA9XG4vXmh0dHBzPzpcXC9cXC9tdXNpY1xcLmFwcGxlXFwuY29tXFwvLis/XFwvKHNvbmd8YWxidW0pXFwvLis/KFxcLy4rP1xcP2k9fFxcLykoWzAtOV0rKSQvO1xuY29uc3QgYXBwbGVNdXNpY1BsYXlsaXN0UmVnZXggPVxuL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcL3BsYXlsaXN0XFwvLitcXC9wbFxcLih1LXxwbS0pP1thLXpBLVowLTldKyQvO1xuY29uc3QgYXBwbGVNdXNpY0FsYnVtUmVnZXggPVxuL15odHRwcz86XFwvXFwvbXVzaWNcXC5hcHBsZVxcLmNvbVxcLy4rP1xcL2FsYnVtXFwvLitcXC8oWzAtOV0rKSQvO1xuY29uc3Qgc291bmRjbG91ZFRyYWNrUmVnZXggPVxuL15odHRwcz86XFwvXFwvKG0ufHd3dy4pP3NvdW5kY2xvdWQuY29tXFwvKFxcd3wtKStcXC8oXFx3fC0pKyguKyk/JC87XG5jb25zdCBzb3VuZGNsb3VkUGxheWxpc3RSZWdleCA9XG4vXmh0dHBzPzpcXC9cXC8obS58d3d3Lik/c291bmRjbG91ZC5jb21cXC8oXFx3fC0pK1xcL3NldHNcXC8oXFx3fC0pKyguKyk/JC87XG5jb25zdCB5b3V0dWJlUGxheWxpc3RSZWdleCA9XG4vXmh0dHBzPzpcXC9cXC8od3d3Lik/eW91dHViZS5jb21cXC9wbGF5bGlzdFxcP2xpc3Q9KChQTHxGTHxVVXxMTHxSRHxPTClbYS16QS1aMC05LV9dezE2LDQxfSkkLztcbmNvbnN0IHlvdXR1YmVWaWRlb1VSTFJlZ2V4ID1cbi9eKCg/Omh0dHBzPzopP1xcL1xcLyk/KCg/Ond3d3xtKVxcLik/KCg/OnlvdXR1YmVcXC5jb218eW91dHUuYmUpKShcXC8oPzpbXFx3LV0rXFw/dj18ZW1iZWRcXC98dlxcLyk/KShbXFx3LV0rKShcXFMrKT8kLztcbmNvbnN0IHlvdXR1YmVWaWRlb0lkUmVnZXggPSAvXlthLXpBLVowLTktX117MTF9JC87XG4vLyBkaXNjb3JkLXBsYXllcjovL2Jsb2IvdXVpZC12NFxuY29uc3QgZGlzY29yZFBsYXllckJsb2JSZWdleCA9IC9eZGlzY29yZC1wbGF5ZXI6XFwvXFwvYmxvYlxcL1xcZCskLztcbi8vICNlbmRyZWdpb24gc2NhcnkgdGhpbmdzIGFib3ZlICpzaWdoKlxuXG5jb25zdCBEb21haW5zTWFwID0ge1xuICBEaXNjb3JkUGxheWVyOiBbJ2Rpc2NvcmQtcGxheWVyJ10sXG4gIFlvdVR1YmU6IFtcbiAgJ3lvdXR1YmUuY29tJyxcbiAgJ3lvdXR1LmJlJyxcbiAgJ211c2ljLnlvdXR1YmUuY29tJyxcbiAgJ2dhbWluZy55b3V0dWJlLmNvbScsXG4gICd3d3cueW91dHViZS5jb20nLFxuICAnbS55b3V0dWJlLmNvbSddLFxuXG4gIFNwb3RpZnk6IFsnb3Blbi5zcG90aWZ5LmNvbScsICdlbWJlZC5zcG90aWZ5LmNvbSddLFxuICBWaW1lbzogWyd2aW1lby5jb20nLCAncGxheWVyLnZpbWVvLmNvbSddLFxuICBSZXZlcmJOYXRpb246IFsncmV2ZXJibmF0aW9uLmNvbSddLFxuICBTb3VuZENsb3VkOiBbJ3NvdW5kY2xvdWQuY29tJ10sXG4gIEFwcGxlTXVzaWM6IFsnbXVzaWMuYXBwbGUuY29tJ11cbn07XG5cbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgcmVkaXJlY3REb21haW5zID0gbmV3IFNldChbXG4vXmh0dHBzPzpcXC9cXC9zcG90aWZ5LmxpbmtcXC9bQS1aYS16MC05XSskLyxcbi9eaHR0cHM6XFwvXFwvb25cXC5zb3VuZGNsb3VkXFwuY29tXFwvW2EtekEtWjEtOV17MCwxN30kL11cbik7XG5cbi8qKlxuICogVGhlIHNlYXJjaCBxdWVyeSB0eXBlXG4gKiBUaGlzIGNhbiBiZSBvbmUgb2Y6XG4gKiAtIEFVVE9cbiAqIC0gWU9VVFVCRVxuICogLSBZT1VUVUJFX1BMQVlMSVNUXG4gKiAtIFNPVU5EQ0xPVURfVFJBQ0tcbiAqIC0gU09VTkRDTE9VRF9QTEFZTElTVFxuICogLSBTT1VORENMT1VEXG4gKiAtIFNQT1RJRllfU09OR1xuICogLSBTUE9USUZZX0FMQlVNXG4gKiAtIFNQT1RJRllfUExBWUxJU1RcbiAqIC0gU1BPVElGWV9TRUFSQ0hcbiAqIC0gRkFDRUJPT0tcbiAqIC0gVklNRU9cbiAqIC0gQVJCSVRSQVJZXG4gKiAtIFJFVkVSQk5BVElPTlxuICogLSBZT1VUVUJFX1NFQVJDSFxuICogLSBZT1VUVUJFX1ZJREVPXG4gKiAtIFNPVU5EQ0xPVURfU0VBUkNIXG4gKiAtIEFQUExFX01VU0lDX1NPTkdcbiAqIC0gQVBQTEVfTVVTSUNfQUxCVU1cbiAqIC0gQVBQTEVfTVVTSUNfUExBWUxJU1RcbiAqIC0gQVBQTEVfTVVTSUNfU0VBUkNIXG4gKiAtIEZJTEVcbiAqIC0gQVVUT19TRUFSQ0hcbiAqIC0gRElTQ09SRF9QTEFZRVJfQkxPQlxuICogQHR5cGVkZWYge3N0cmluZ30gUXVlcnlUeXBlXG4gKi9cbmV4cG9ydCBjb25zdCBRdWVyeVR5cGUgPSB7XG4gIEFVVE86ICdhdXRvJyxcbiAgWU9VVFVCRTogJ3lvdXR1YmUnLFxuICBZT1VUVUJFX1BMQVlMSVNUOiAneW91dHViZVBsYXlsaXN0JyxcbiAgU09VTkRDTE9VRF9UUkFDSzogJ3NvdW5kY2xvdWRUcmFjaycsXG4gIFNPVU5EQ0xPVURfUExBWUxJU1Q6ICdzb3VuZGNsb3VkUGxheWxpc3QnLFxuICBTT1VORENMT1VEOiAnc291bmRjbG91ZCcsXG4gIFNQT1RJRllfU09ORzogJ3Nwb3RpZnlTb25nJyxcbiAgU1BPVElGWV9BTEJVTTogJ3Nwb3RpZnlBbGJ1bScsXG4gIFNQT1RJRllfUExBWUxJU1Q6ICdzcG90aWZ5UGxheWxpc3QnLFxuICBTUE9USUZZX1NFQVJDSDogJ3Nwb3RpZnlTZWFyY2gnLFxuICBGQUNFQk9PSzogJ2ZhY2Vib29rJyxcbiAgVklNRU86ICd2aW1lbycsXG4gIEFSQklUUkFSWTogJ2FyYml0cmFyeScsXG4gIFJFVkVSQk5BVElPTjogJ3JldmVyYm5hdGlvbicsXG4gIFlPVVRVQkVfU0VBUkNIOiAneW91dHViZVNlYXJjaCcsXG4gIFlPVVRVQkVfVklERU86ICd5b3V0dWJlVmlkZW8nLFxuICBTT1VORENMT1VEX1NFQVJDSDogJ3NvdW5kY2xvdWRTZWFyY2gnLFxuICBBUFBMRV9NVVNJQ19TT05HOiAnYXBwbGVNdXNpY1NvbmcnLFxuICBBUFBMRV9NVVNJQ19BTEJVTTogJ2FwcGxlTXVzaWNBbGJ1bScsXG4gIEFQUExFX01VU0lDX1BMQVlMSVNUOiAnYXBwbGVNdXNpY1BsYXlsaXN0JyxcbiAgQVBQTEVfTVVTSUNfU0VBUkNIOiAnYXBwbGVNdXNpY1NlYXJjaCcsXG4gIEZJTEU6ICdmaWxlJyxcbiAgQVVUT19TRUFSQ0g6ICdhdXRvU2VhcmNoJyxcbiAgRElTQ09SRF9QTEFZRVJfQkxPQjogJ2Rpc2NvcmRQbGF5ZXJCbG9iJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgUXVlcnlUeXBlID0gKHR5cGVvZiBRdWVyeVR5cGUpW2tleW9mIHR5cGVvZiBRdWVyeVR5cGVdO1xuXG5leHBvcnQgdHlwZSBTZWFyY2hRdWVyeVR5cGUgPSBrZXlvZiB0eXBlb2YgUXVlcnlUeXBlIHwgUXVlcnlUeXBlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkUXVlcnkge1xuICB0eXBlOiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG4gIHF1ZXJ5OiBzdHJpbmc7XG59XG5cbmNsYXNzIFF1ZXJ5UmVzb2x2ZXIge1xuICAvKipcbiAgICogUXVlcnkgcmVzb2x2ZXJcbiAgICovXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gIHN0YXRpYyBnZXQgcmVnZXgoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNwb3RpZnlBbGJ1bVJlZ2V4LFxuICAgICAgc3BvdGlmeVBsYXlsaXN0UmVnZXgsXG4gICAgICBzcG90aWZ5U29uZ1JlZ2V4LFxuICAgICAgdmltZW9SZWdleCxcbiAgICAgIHJldmVyYm5hdGlvblJlZ2V4LFxuICAgICAgYXR0YWNobWVudFJlZ2V4LFxuICAgICAgYXBwbGVNdXNpY0FsYnVtUmVnZXgsXG4gICAgICBhcHBsZU11c2ljUGxheWxpc3RSZWdleCxcbiAgICAgIGFwcGxlTXVzaWNTb25nUmVnZXgsXG4gICAgICBzb3VuZGNsb3VkVHJhY2tSZWdleCxcbiAgICAgIHNvdW5kY2xvdWRQbGF5bGlzdFJlZ2V4LFxuICAgICAgeW91dHViZVBsYXlsaXN0UmVnZXgsXG4gICAgICBkaXNjb3JkUGxheWVyQmxvYlJlZ2V4XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmUtcmVzb2x2ZSByZWRpcmVjdCB1cmxzXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcHJlUmVzb2x2ZShxdWVyeTogc3RyaW5nLCBtYXhEZXB0aCA9IDUpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghVHlwZVV0aWwuaXNTdHJpbmcocXVlcnkpKVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKHF1ZXJ5LCAnc3RyaW5nJywgdHlwZW9mIHF1ZXJ5KTtcblxuICAgIGZvciAoY29uc3QgZG9tYWluIG9mIHJlZGlyZWN0RG9tYWlucykge1xuICAgICAgaWYgKGRvbWFpbi50ZXN0KHF1ZXJ5KSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHF1ZXJ5LCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgcmVkaXJlY3Q6ICdmb2xsb3cnXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoIXJlcy5vaykgYnJlYWs7XG5cbiAgICAgICAgICAvLyBzcG90aWZ5IGRvZXMgbm90IFwicmVkaXJlY3RcIiwgaXQgcmV0dXJucyBhIHBhZ2Ugd2l0aCBqcyB0aGF0IHJlZGlyZWN0c1xuICAgICAgICAgIGlmICgvXmh0dHBzPzpcXC9cXC9zcG90aWZ5LmFwcC5saW5rXFwvKC4rKSQvLnRlc3QocmVzLnVybCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXMudGV4dCgpO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gYm9keS5cbiAgICAgICAgICAgIHNwbGl0KCdodHRwczovL29wZW4uc3BvdGlmeS5jb20vdHJhY2svJylbMV0uXG4gICAgICAgICAgICBzcGxpdCgnP3NpPScpWzBdO1xuXG4gICAgICAgICAgICBpZiAoIXRhcmdldCkgYnJlYWs7XG5cbiAgICAgICAgICAgIHJldHVybiBgaHR0cHM6Ly9vcGVuLnNwb3RpZnkuY29tL3RyYWNrLyR7dGFyZ2V0fWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBtYXhEZXB0aCA8IDEgP1xuICAgICAgICAgIHJlcy51cmwgOlxuICAgICAgICAgIHRoaXMucHJlUmVzb2x2ZShyZXMudXJsLCBtYXhEZXB0aCAtIDEpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gc2VhcmNoIHF1ZXJ5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSBUaGUgcXVlcnlcbiAgICovXG4gIHN0YXRpYyByZXNvbHZlKFxuICBxdWVyeTogc3RyaW5nLFxuICBmYWxsYmFja1NlYXJjaEVuZ2luZTogKHR5cGVvZiBRdWVyeVR5cGUpW2tleW9mIHR5cGVvZiBRdWVyeVR5cGVdID0gUXVlcnlUeXBlLkFVVE9fU0VBUkNIKVxuICA6IFJlc29sdmVkUXVlcnkge1xuICAgIGlmICghVHlwZVV0aWwuaXNTdHJpbmcocXVlcnkpKVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKHF1ZXJ5LCAnc3RyaW5nJywgdHlwZW9mIHF1ZXJ5KTtcbiAgICBpZiAoIXF1ZXJ5Lmxlbmd0aCkgdGhyb3cgbmV3IEluZm9SZXF1aXJlZEVycm9yKCdxdWVyeScsIFN0cmluZyhxdWVyeSkpO1xuXG4gICAgY29uc3QgcmVzb2x2ZXIgPSAodHlwZTogdHlwZW9mIGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeTogc3RyaW5nKSA9PiAoe1xuICAgICAgdHlwZSxcbiAgICAgIHF1ZXJ5XG4gICAgfSk7XG5cbiAgICBpZiAoZGlzY29yZFBsYXllckJsb2JSZWdleC50ZXN0KHF1ZXJ5KSlcbiAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkRJU0NPUkRfUExBWUVSX0JMT0IsIHF1ZXJ5KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHF1ZXJ5KTtcblxuICAgICAgaWYgKERvbWFpbnNNYXAuWW91VHViZS5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS5yZXBsYWNlKC8obSh1c2ljKT98Z2FtaW5nKVxcLi8sICcnKS50cmltKCk7XG4gICAgICAgIGNvbnN0IHBsYXlsaXN0SWQgPSB1cmwuc2VhcmNoUGFyYW1zLmdldCgnbGlzdCcpO1xuICAgICAgICBjb25zdCB2aWRlb0lkID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQoJ3YnKTtcbiAgICAgICAgaWYgKHBsYXlsaXN0SWQpIHtcbiAgICAgICAgICBpZiAodmlkZW9JZCAmJiBwbGF5bGlzdElkLnN0YXJ0c1dpdGgoJ1JEJykpXG4gICAgICAgICAgcmV0dXJuIHJlc29sdmVyKFxuICAgICAgICAgICAgUXVlcnlUeXBlLllPVVRVQkVfUExBWUxJU1QsXG4gICAgICAgICAgICBgaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj0ke3ZpZGVvSWR9Jmxpc3Q9JHtwbGF5bGlzdElkfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiByZXNvbHZlcihcbiAgICAgICAgICAgIFF1ZXJ5VHlwZS5ZT1VUVUJFX1BMQVlMSVNULFxuICAgICAgICAgICAgYGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3BsYXlsaXN0P2xpc3Q9JHtwbGF5bGlzdElkfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChRdWVyeVJlc29sdmVyLnZhbGlkYXRlSWQocXVlcnkpIHx8IFF1ZXJ5UmVzb2x2ZXIudmFsaWRhdGVVUkwocXVlcnkpKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLllPVVRVQkVfVklERU8sIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuU3BvdGlmeS5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS5yZXBsYWNlKC9pbnRsLShbYS16QS1aXSspXFwvLywgJycpO1xuICAgICAgICBpZiAoc3BvdGlmeVBsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU1BPVElGWV9QTEFZTElTVCwgcXVlcnkpO1xuICAgICAgICBpZiAoc3BvdGlmeUFsYnVtUmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU1BPVElGWV9BTEJVTSwgcXVlcnkpO1xuICAgICAgICBpZiAoc3BvdGlmeVNvbmdSZWdleC50ZXN0KHF1ZXJ5KSlcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TUE9USUZZX1NPTkcsIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuVmltZW8uaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgIGlmICh2aW1lb1JlZ2V4LnRlc3QocXVlcnkpKSByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlZJTUVPLCBxdWVyeSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLlJldmVyYk5hdGlvbi5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgaWYgKHJldmVyYm5hdGlvblJlZ2V4LnRlc3QocXVlcnkpKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlJFVkVSQk5BVElPTiwgcXVlcnkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5Tb3VuZENsb3VkLmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICBpZiAoc291bmRjbG91ZFBsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU09VTkRDTE9VRF9QTEFZTElTVCwgcXVlcnkpO1xuICAgICAgICBpZiAoc291bmRjbG91ZFRyYWNrUmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuU09VTkRDTE9VRF9UUkFDSywgcXVlcnkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5BcHBsZU11c2ljLmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICBpZiAoYXBwbGVNdXNpY0FsYnVtUmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuQVBQTEVfTVVTSUNfQUxCVU0sIHF1ZXJ5KTtcbiAgICAgICAgaWYgKGFwcGxlTXVzaWNQbGF5bGlzdFJlZ2V4LnRlc3QocXVlcnkpKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFQUExFX01VU0lDX1BMQVlMSVNULCBxdWVyeSk7XG4gICAgICAgIGlmIChhcHBsZU11c2ljU29uZ1JlZ2V4LnRlc3QocXVlcnkpKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFQUExFX01VU0lDX1NPTkcsIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLkFSQklUUkFSWSwgcXVlcnkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB2aW1lbyBpZCBmcm9tIHVybFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgVGhlIHF1ZXJ5XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgZ2V0VmltZW9JRChxdWVyeTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZShxdWVyeSkudHlwZSA9PT0gUXVlcnlUeXBlLlZJTUVPID9cbiAgICBxdWVyeS5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKS5wb3AoKSA6XG4gICAgbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZUlkKHE6IHN0cmluZykge1xuICAgIHJldHVybiB5b3V0dWJlVmlkZW9JZFJlZ2V4LnRlc3QocSk7XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVVUkwocTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHlvdXR1YmVWaWRlb1VSTFJlZ2V4LnRlc3QocSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUXVlcnlSZXNvbHZlciB9OyIsICJpbXBvcnQgeyBVc2VyLCBVc2VyUmVzb2x2YWJsZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4uL2V4dHJhY3RvcnMvQmFzZUV4dHJhY3Rvcic7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgUGxheWxpc3QgfSBmcm9tICcuL1BsYXlsaXN0JztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi9UcmFjayc7XG5pbXBvcnQgeyBRdWVyeVR5cGUsIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFJlc3VsdERhdGEge1xuICBxdWVyeTogc3RyaW5nO1xuICBxdWVyeVR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBRdWVyeUV4dHJhY3RvclNlYXJjaCB8IG51bGw7XG4gIGV4dHJhY3Rvcj86IEJhc2VFeHRyYWN0b3IgfCBudWxsO1xuICBwbGF5bGlzdD86IFBsYXlsaXN0IHwgbnVsbDtcbiAgdHJhY2tzPzogVHJhY2tbXTtcbiAgcmVxdWVzdGVkQnk/OiBVc2VyIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZiB0aGlzIHBsYXkgd2FzIHRyaWdnZXJlZCBmb3IgZmlsdGVycyB1cGRhdGVcbiAgICovXG4gIGZpbHRlcnNVcGRhdGU/OiBib29sZWFuO1xuICAvKipcbiAgICogRkZtcGVnIGFyZ3MgcGFzc2VkIHRvIGVuY29kZXJcbiAgICovXG4gIGVuY29kZXJBcmdzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaW1lIHRvIHNlZWsgdG8gYmVmb3JlIHBsYXlpbmdcbiAgICovXG4gIHNlZWs/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBJZiBpdCBzaG91bGQgc3RhcnQgcGxheWluZyB0aGUgcHJvdmlkZWQgdHJhY2sgaW1tZWRpYXRlbHlcbiAgICovXG4gIGltbWVkaWF0ZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5RXh0cmFjdG9yU2VhcmNoID0gYGV4dDoke3N0cmluZ31gO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHVzZXIgd2hvIHJlcXVlc3RlZCB0aGlzIHNlYXJjaFxuICAgKi9cbiAgcmVxdWVzdGVkQnk/OiBVc2VyUmVzb2x2YWJsZTtcbiAgLyoqXG4gICAqIFRoZSBxdWVyeSBzZWFyY2ggZW5naW5lLCBjYW4gYmUgZXh0cmFjdG9yIG5hbWUgdG8gdGFyZ2V0IHNwZWNpZmljIG9uZSAoY3VzdG9tKVxuICAgKi9cbiAgc2VhcmNoRW5naW5lPzogU2VhcmNoUXVlcnlUeXBlIHwgUXVlcnlFeHRyYWN0b3JTZWFyY2g7XG4gIC8qKlxuICAgKiBMaXN0IG9mIHRoZSBleHRyYWN0b3JzIHRvIGJsb2NrXG4gICAqL1xuICBibG9ja0V4dHJhY3RvcnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIElmIGl0IHNob3VsZCBpZ25vcmUgcXVlcnkgY2FjaGUgbG9va3VwXG4gICAqL1xuICBpZ25vcmVDYWNoZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBGYWxsYmFjayBzZWFyY2ggZW5naW5lIHRvIHVzZVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcmVxdWVzdE9wdGlvbnM/OiBhbnk7XG4gIC8qKlxuICAgKiBGYWxsYmFjayBzZWFyY2ggZW5naW5lIHRvIHVzZVxuICAgKi9cbiAgZmFsbGJhY2tTZWFyY2hFbmdpbmU/OiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyU2VhcmNoUmVzdWx0IHtcbiAgcGxheWxpc3Q6IFBsYXlsaXN0IHwgbnVsbDtcbiAgdHJhY2tzOiBUcmFja1tdO1xufVxuXG5leHBvcnQgY2xhc3MgU2VhcmNoUmVzdWx0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllciwgcHJpdmF0ZSBfZGF0YTogU2VhcmNoUmVzdWx0RGF0YSkge1xuICAgIHRoaXMuX2RhdGEudHJhY2tzPy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgdHJhY2suZXh0cmFjdG9yID8/PSB0aGlzLl9kYXRhLmV4dHJhY3RvciB8fCBudWxsO1xuICAgICAgdHJhY2sucmVxdWVzdGVkQnkgPz89IF9kYXRhLnJlcXVlc3RlZEJ5IHx8IG51bGw7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0UXVlcnlUeXBlKHR5cGU6IFNlYXJjaFF1ZXJ5VHlwZSB8IFF1ZXJ5RXh0cmFjdG9yU2VhcmNoKSB7XG4gICAgdGhpcy5fZGF0YS5xdWVyeVR5cGUgPSB0eXBlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHNldFJlcXVlc3RlZEJ5KHVzZXI6IFVzZXIpIHtcbiAgICB0aGlzLl9kYXRhLnJlcXVlc3RlZEJ5ID0gdXNlcjtcbiAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIHRyYWNrLnJlcXVlc3RlZEJ5ID0gdXNlcjtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBzZXRFeHRyYWN0b3IoZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKSB7XG4gICAgdGhpcy5fZGF0YS5leHRyYWN0b3IgPSBleHRyYWN0b3I7XG4gICAgdGhpcy5fZGF0YS50cmFja3M/LmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICB0cmFjay5leHRyYWN0b3IgPSBleHRyYWN0b3I7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgc2V0VHJhY2tzKHRyYWNrczogVHJhY2tbXSkge1xuICAgIHRoaXMuX2RhdGEudHJhY2tzID0gdHJhY2tzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHNldFF1ZXJ5KHF1ZXJ5OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kYXRhLnF1ZXJ5ID0gcXVlcnk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgc2V0UGxheWxpc3QocGxheWxpc3Q6IFBsYXlsaXN0KSB7XG4gICAgdGhpcy5fZGF0YS5wbGF5bGlzdCA9IHBsYXlsaXN0O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzZWFyY2ggcXVlcnlcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEucXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNlYXJjaCBxdWVyeSB0eXBlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXJ5VHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5xdWVyeVR5cGUgfHwgUXVlcnlUeXBlLkFVVE87XG4gIH1cblxuICAvKipcbiAgICogVGhlIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGdldCBleHRyYWN0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEuZXh0cmFjdG9yIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUGxheWxpc3QgcmVzdWx0XG4gICAqL1xuICBwdWJsaWMgZ2V0IHBsYXlsaXN0KCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnBsYXlsaXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrcyByZXN1bHRcbiAgICovXG4gIHB1YmxpYyBnZXQgdHJhY2tzKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnRyYWNrcyB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0ZWQgYnlcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVxdWVzdGVkQnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1leGVjdXRlIHRoaXMgc2VhcmNoXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5ZXIuc2VhcmNoKHRoaXMucXVlcnksIHtcbiAgICAgIHNlYXJjaEVuZ2luZTogdGhpcy5xdWVyeVR5cGUsXG4gICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeSFcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGlzIHNlYXJjaCByZXN1bHQgaXMgZW1wdHlcbiAgICovXG4gIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgIHJldHVybiAhdGhpcy50cmFja3MubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgcGxheWxpc3RcbiAgICovXG4gIHB1YmxpYyBoYXNQbGF5bGlzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5bGlzdCAhPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBoYXMgdHJhY2tzXG4gICAqL1xuICBwdWJsaWMgaGFzVHJhY2tzKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzZWFyY2hcbiAgICovXG4gIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJ5LFxuICAgICAgcXVlcnlUeXBlOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgIHBsYXlsaXN0OiB0aGlzLnBsYXlsaXN0Py50b0pTT04oZmFsc2UpIHx8IG51bGwsXG4gICAgICB0cmFja3M6IHRoaXMudHJhY2tzLm1hcCgobSkgPT4gbS50b0pTT04odHJ1ZSkpLFxuICAgICAgZXh0cmFjdG9yOiB0aGlzLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCBudWxsLFxuICAgICAgcmVxdWVzdGVkQnk6IHRoaXMucmVxdWVzdGVkQnk/LnRvSlNPTigpIHx8IG51bGxcbiAgICB9O1xuICB9XG59IiwgImV4cG9ydCB0eXBlIEZpbHRlcnNOYW1lID0ga2V5b2YgUXVldWVGaWx0ZXJzO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgRkZtcGVnIGZpbHRlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWV1ZUZpbHRlcnMge1xuICBiYXNzYm9vc3RfbG93PzogYm9vbGVhbjtcbiAgYmFzc2Jvb3N0PzogYm9vbGVhbjtcbiAgYmFzc2Jvb3N0X2hpZ2g/OiBib29sZWFuO1xuICAnOEQnPzogYm9vbGVhbjtcbiAgdmFwb3J3YXZlPzogYm9vbGVhbjtcbiAgbmlnaHRjb3JlPzogYm9vbGVhbjtcbiAgcGhhc2VyPzogYm9vbGVhbjtcbiAgdHJlbW9sbz86IGJvb2xlYW47XG4gIHZpYnJhdG8/OiBib29sZWFuO1xuICByZXZlcnNlPzogYm9vbGVhbjtcbiAgdHJlYmxlPzogYm9vbGVhbjtcbiAgbm9ybWFsaXplcj86IGJvb2xlYW47XG4gIG5vcm1hbGl6ZXIyPzogYm9vbGVhbjtcbiAgc3Vycm91bmRpbmc/OiBib29sZWFuO1xuICBwdWxzYXRvcj86IGJvb2xlYW47XG4gIHN1YmJvb3N0PzogYm9vbGVhbjtcbiAga2FyYW9rZT86IGJvb2xlYW47XG4gIGZsYW5nZXI/OiBib29sZWFuO1xuICBnYXRlPzogYm9vbGVhbjtcbiAgaGFhcz86IGJvb2xlYW47XG4gIG1jb21wYW5kPzogYm9vbGVhbjtcbiAgbW9ubz86IGJvb2xlYW47XG4gIG1zdGxyPzogYm9vbGVhbjtcbiAgbXN0cnI/OiBib29sZWFuO1xuICBjb21wcmVzc29yPzogYm9vbGVhbjtcbiAgZXhwYW5kZXI/OiBib29sZWFuO1xuICBzb2Z0bGltaXRlcj86IGJvb2xlYW47XG4gIGNob3J1cz86IGJvb2xlYW47XG4gIGNob3J1czJkPzogYm9vbGVhbjtcbiAgY2hvcnVzM2Q/OiBib29sZWFuO1xuICBmYWRlaW4/OiBib29sZWFuO1xuICBkaW0/OiBib29sZWFuO1xuICBlYXJyYXBlPzogYm9vbGVhbjtcbiAgbG9maT86IGJvb2xlYW47XG4gIHNpbGVuY2VyZW1vdmU/OiBib29sZWFuO1xufVxuXG5jb25zdCBiYXNzID0gKGc6IG51bWJlcikgPT4gYGJhc3M9Zz0ke2d9OmY9MTEwOnc9MC4zYDtcblxuZXhwb3J0IGNsYXNzIEF1ZGlvRmlsdGVycyB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICByZXR1cm4gQXVkaW9GaWx0ZXJzO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJzOiBSZWNvcmQ8RmlsdGVyc05hbWUsIHN0cmluZz4gPSB7XG4gICAgYmFzc2Jvb3N0X2xvdzogYmFzcygxNSksXG4gICAgYmFzc2Jvb3N0OiBiYXNzKDIwKSxcbiAgICBiYXNzYm9vc3RfaGlnaDogYmFzcygzMCksXG4gICAgJzhEJzogJ2FwdWxzYXRvcj1oej0wLjA5JyxcbiAgICB2YXBvcndhdmU6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMC44JyxcbiAgICBuaWdodGNvcmU6ICdhcmVzYW1wbGU9NDgwMDAsYXNldHJhdGU9NDgwMDAqMS4yNScsXG4gICAgbG9maTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCowLjksZXh0cmFzdGVyZW89bT0yLjU6Yz1kaXNhYmxlZCcsXG4gICAgcGhhc2VyOiAnYXBoYXNlcj1pbl9nYWluPTAuNCcsXG4gICAgdHJlbW9sbzogJ3RyZW1vbG8nLFxuICAgIHZpYnJhdG86ICd2aWJyYXRvPWY9Ni41JyxcbiAgICByZXZlcnNlOiAnYXJldmVyc2UnLFxuICAgIHRyZWJsZTogJ3RyZWJsZT1nPTUnLFxuICAgIG5vcm1hbGl6ZXIyOiAnZHluYXVkbm9ybT1nPTEwMScsXG4gICAgbm9ybWFsaXplcjogJ2Fjb21wcmVzc29yJyxcbiAgICBzdXJyb3VuZGluZzogJ3N1cnJvdW5kJyxcbiAgICBwdWxzYXRvcjogJ2FwdWxzYXRvcj1oej0xJyxcbiAgICBzdWJib29zdDogJ2FzdWJib29zdCcsXG4gICAga2FyYW9rZTogJ3N0ZXJlb3Rvb2xzPW1sZXY9MC4wMycsXG4gICAgZmxhbmdlcjogJ2ZsYW5nZXInLFxuICAgIGdhdGU6ICdhZ2F0ZScsXG4gICAgaGFhczogJ2hhYXMnLFxuICAgIG1jb21wYW5kOiAnbWNvbXBhbmQnLFxuICAgIG1vbm86ICdwYW49bW9ub3xjMD0uNSpjMCsuNSpjMScsXG4gICAgbXN0bHI6ICdzdGVyZW90b29scz1tb2RlPW1zPmxyJyxcbiAgICBtc3RycjogJ3N0ZXJlb3Rvb2xzPW1vZGU9bXM+cnInLFxuICAgIGNvbXByZXNzb3I6ICdjb21wYW5kPXBvaW50cz0tODAvLTEwNXwtNjIvLTgwfC0xNS40Ly0xNS40fDAvLTEyfDIwLy03LjYnLFxuICAgIGV4cGFuZGVyOlxuICAgICdjb21wYW5kPWF0dGFja3M9MDpwb2ludHM9LTgwLy0xNjl8LTU0Ly04MHwtNDkuNS8tNjQuNnwtNDEuMS8tNDEuMXwtMjUuOC8tMTV8LTEwLjgvLTQuNXwwLzB8MjAvOC4zJyxcbiAgICBzb2Z0bGltaXRlcjpcbiAgICAnY29tcGFuZD1hdHRhY2tzPTA6cG9pbnRzPS04MC8tODB8LTEyLjQvLTEyLjR8LTYvLTh8MC8tNi44fDIwLy0yLjgnLFxuICAgIGNob3J1czogJ2Nob3J1cz0wLjc6MC45OjU1OjAuNDowLjI1OjInLFxuICAgIGNob3J1czJkOiAnY2hvcnVzPTAuNjowLjk6NTB8NjA6MC40fDAuMzI6MC4yNXwwLjQ6MnwxLjMnLFxuICAgIGNob3J1czNkOiAnY2hvcnVzPTAuNTowLjk6NTB8NjB8NDA6MC40fDAuMzJ8MC4zOjAuMjV8MC40fDAuMzoyfDIuM3wxLjMnLFxuICAgIGZhZGVpbjogJ2FmYWRlPXQ9aW46c3M9MDpkPTEwJyxcbiAgICBkaW06IGBhZmZ0ZmlsdD1cIidyZWFsPXJlICogKDEtY2xpcCgoYi9uYikqYiwwLDEpKSc6aW1hZz0naW0gKiAoMS1jbGlwKChiL25iKSpiLDAsMSkpJ1wiYCxcbiAgICBlYXJyYXBlOiAnY2hhbm5lbHNwbGl0LHNpZGVjaGFpbmdhdGU9bGV2ZWxfaW49NjQnLFxuICAgIHNpbGVuY2VyZW1vdmU6ICdzaWxlbmNlcmVtb3ZlPTE6MDotNTBkQidcbiAgfTtcblxuICBwdWJsaWMgc3RhdGljIGdldDxLIGV4dGVuZHMgRmlsdGVyc05hbWU+KG5hbWU6IEspIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJzW25hbWVdID8/IG5hbWU7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGhhczxLIGV4dGVuZHMgRmlsdGVyc05hbWU+KG5hbWU6IEspIHtcbiAgICByZXR1cm4gbmFtZSBpbiB0aGlzLmZpbHRlcnM7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljICpbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYWJsZUl0ZXJhdG9yPHtcbiAgICBuYW1lOiBGaWx0ZXJzTmFtZTtcbiAgICB2YWx1ZTogc3RyaW5nO1xuICB9PiB7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5maWx0ZXJzKSkge1xuICAgICAgeWllbGQgeyBuYW1lOiBrIGFzIEZpbHRlcnNOYW1lLCB2YWx1ZTogdiBhcyBzdHJpbmcgfTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldCBuYW1lcygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5maWx0ZXJzKSBhcyBGaWx0ZXJzTmFtZVtdO1xuICB9XG5cbiAgLy8gQHRzLWlnbm9yZVxuICBwdWJsaWMgc3RhdGljIGdldCBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZXMubGVuZ3RoO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lcy5tYXAoKG0pID0+ICh0aGlzIGFzIGFueSlbbV0pLmpvaW4oJywnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGZmbXBlZyBhcmdzIGZyb20gdGhlIHNwZWNpZmllZCBmaWx0ZXJzIG5hbWVcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIG5hbWVcbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlPEsgZXh0ZW5kcyBGaWx0ZXJzTmFtZT4oZmlsdGVycz86IChLIHwgc3RyaW5nKVtdKSB7XG4gICAgaWYgKCFmaWx0ZXJzIHx8ICFBcnJheS5pc0FycmF5KGZpbHRlcnMpKSByZXR1cm4gdGhpcy50b1N0cmluZygpO1xuICAgIHJldHVybiBmaWx0ZXJzLlxuICAgIGZpbHRlcigocHJlZGljYXRlKSA9PiB0eXBlb2YgcHJlZGljYXRlID09PSAnc3RyaW5nJykuXG4gICAgbWFwKChtKSA9PiB0aGlzLmdldChtIGFzIEspKS5cbiAgICBqb2luKCcsJyk7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lcyBhdWRpbyBmaWx0ZXJcbiAgICogQHBhcmFtIGZpbHRlck5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbHRlclxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIGZmbXBlZyBhcmdzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGRlZmluZShmaWx0ZXJOYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZpbHRlcnNbZmlsdGVyTmFtZSBhcyBGaWx0ZXJzTmFtZV0gPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIG11bHRpcGxlIGF1ZGlvIGZpbHRlcnNcbiAgICogQHBhcmFtIGZpbHRlcnNBcnJheSBBcnJheSBvZiBmaWx0ZXJzIGNvbnRhaW5pbmcgdGhlIGZpbHRlciBuYW1lIGFuZCBmZm1wZWcgYXJnc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBkZWZpbmVCdWxrKGZpbHRlcnNBcnJheToge25hbWU6IHN0cmluZzt2YWx1ZTogc3RyaW5nO31bXSkge1xuICAgIGZpbHRlcnNBcnJheS5mb3JFYWNoKChhcnIpID0+IHRoaXMuZGVmaW5lKGFyci5uYW1lLCBhcnIudmFsdWUpKTtcbiAgfVxufSIsICIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4vLyBAdHMtbm9jaGVja1xuXG5pbXBvcnQgeyBDaGFubmVsVHlwZSwgR2F0ZXdheURpc3BhdGNoRXZlbnRzIH0gZnJvbSAnZGlzY29yZC1hcGktdHlwZXMvdjEwJztcbmltcG9ydCB7IGNyZWF0ZUNvbXBhdENsaWVudCwgQ29tcGF0UHJvdmlkZXIgfSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5cbmltcG9ydCB0eXBlIHsgRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvciB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQge1xuICBDbGllbnQsXG4gIEdhdGV3YXlWb2ljZVNlcnZlclVwZGF0ZURpc3BhdGNoRGF0YSxcbiAgR2F0ZXdheVZvaWNlU3RhdGVVcGRhdGVEaXNwYXRjaERhdGEsXG4gIFZvaWNlU3RhdGUgfSBmcm9tXG4nZGlzY29yZC5qcyc7XG5pbXBvcnQgKiBhcyBPY2VhbmljIGZyb20gJ29jZWFuaWMuanMnO1xuXG50eXBlIE9jZWFuaWNVc2VyUmVzb2x2YWJsZSA9IE9jZWFuaWMuVXNlciB8IHN0cmluZyB8IE9jZWFuaWMuTWVtYmVyO1xudHlwZSBPY2VhbmljR3VpbGRSZXNvbHZhYmxlID1cbk9jZWFuaWMuR3VpbGQgfFxuc3RyaW5nIHxcbk9jZWFuaWMuTWVtYmVyIHxcbk9jZWFuaWMuR3VpbGRDaGFubmVsIHxcbk9jZWFuaWMuUm9sZTtcbnR5cGUgT2NlYW5pY0NoYW5uZWxSZXNvbHZhYmxlID0gT2NlYW5pYy5HdWlsZENoYW5uZWwgfCBzdHJpbmc7XG5cbmNvbnN0IERpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wgPSBTeW1ib2woJ0Rpc2NvcmRQbGF5ZXJDbGllbnQnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2NlYW5pY0NsaWVudChjbGllbnQ6IGFueSk6IGNsaWVudCBpcyBPY2VhbmljLkNsaWVudCB7XG4gIGNvbnN0IHsgbW9kdWxlLCBlcnJvciB9ID0gVXRpbC5yZXF1aXJlKCdvY2VhbmljLmpzJyk7XG5cbiAgaWYgKGVycm9yKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3Qgb2NlYW5pYyA9IG1vZHVsZSBhcyB0eXBlb2YgaW1wb3J0KCdvY2VhbmljLmpzJyk7XG5cbiAgcmV0dXJuIGNsaWVudCBpbnN0YW5jZW9mIG9jZWFuaWMuQ2xpZW50O1xufVxuXG5mdW5jdGlvbiBkZWNsYXJlUHJvcGVydHkodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogVCB7XG4gIFJlZmxlY3Quc2V0KHRhcmdldCwga2V5LCB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGdldFByb3BlcnR5PFQ+KHRhcmdldDogYW55LCBrZXk6IHN0cmluZyk6IFQge1xuICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBrZXkpO1xufVxuXG4vKipcbiAqIEFsbG93cyBPY2VhbmljLmpzIGNsaWVudHMgdG8gYmUgdXNlZCB3aXRoIGRpc2NvcmQtcGxheWVyLiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgZGlzY29yZC1wbGF5ZXIgY3JlYXRlcyBhIHByb3h5IG9iamVjdCB0aGF0IGludGVyY2VwdHMgY2VydGFpbiBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIHRvIG1ha2UgaXQgY29tcGF0aWJsZSB3aXRoIGRpc2NvcmQtcGxheWVyLlxuICogQHBhcmFtIGNsaWVudCBUaGUgT2NlYW5pYy5qcyBjbGllbnQgdG8gYmUgdXNlZC5cbiAqIEByZXR1cm5zIFRoZSBPY2VhbmljLmpzIGNsaWVudCB3aXRoIGRpc2NvcmQtcGxheWVyIGNvbXBhdGliaWxpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVPY2VhbmljQ29tcGF0KGNsaWVudDogT2NlYW5pYy5DbGllbnQpOiBDbGllbnQge1xuICBjb25zdCB7IG1vZHVsZSwgZXJyb3IgfSA9IFV0aWwucmVxdWlyZSgnb2NlYW5pYy5qcycpO1xuXG4gIGlmIChlcnJvcikgdGhyb3cgZXJyb3I7XG5cbiAgY29uc3Qgb2NlYW5pYyA9IG1vZHVsZSBhcyB0eXBlb2YgaW1wb3J0KCdvY2VhbmljLmpzJyk7XG5cbiAgb2NlYW5pY1ZvaWNlRXZlbnRzSGFuZGxlcihjbGllbnQpO1xuXG4gIGNvbnN0IG9jZWFuaWNQcm94eSA9IG5ldyBQcm94eShjbGllbnQsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBzd2l0Y2ggKHApIHtcbiAgICAgICAgY2FzZSAndXNlcnMnOlxuICAgICAgICAgIHJldHVybiBvY2VhbmljVXNlcnNQcm94eSh0YXJnZXQsIG9jZWFuaWMpO1xuICAgICAgICBjYXNlICdndWlsZHMnOlxuICAgICAgICAgIHJldHVybiBvY2VhbmljR3VpbGRzUHJveHkodGFyZ2V0LCBvY2VhbmljKTtcbiAgICAgICAgY2FzZSAnY2hhbm5lbHMnOlxuICAgICAgICAgIHJldHVybiBvY2VhbmljQ2hhbm5lbHNQcm94eSh0YXJnZXQsIG9jZWFuaWMpO1xuICAgICAgICBjYXNlICdfX2RwX3ZvaWNlU3RhdGVVcGRhdGVfcHJveHknOlxuICAgICAgICAgIHJldHVybiAoaGFuZGxlcjogKGEsIGIpID0+IHZvaWQpID0+XG4gICAgICAgICAgb2NlYW5pY1ZvaWNlU3RhdGVVcGRhdGVQcm94eSh0YXJnZXQsIG9jZWFuaWNQcm94eSwgaGFuZGxlcik7XG4gICAgICAgIGNhc2UgJ2luY3JlbWVudE1heExpc3RlbmVycyc6XG4gICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICAgIGNsaWVudC5zZXRNYXhMaXN0ZW5lcnMoY2xpZW50LmdldE1heExpc3RlbmVycygpICsgMSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgY2FzZSAnZGVjcmVtZW50TWF4TGlzdGVuZXJzJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gY2xpZW50LmdldE1heExpc3RlbmVycygpIC0gMTtcblxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgICAgY2xpZW50LnNldE1heExpc3RlbmVycyhsaXN0ZW5lcnMgPCAwID8gMSA6IGxpc3RlbmVycyk7XG4gICAgICAgICAgfTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIFJlZmxlY3Quc2V0KG9jZWFuaWNQcm94eSwgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCwgJ09jZWFuaWMnKTtcblxuICByZXR1cm4gY3JlYXRlQ29tcGF0Q2xpZW50KG9jZWFuaWNQcm94eSwgJ09jZWFuaWMnKS5jbGllbnQgYXMgdW5rbm93biBhcyBDbGllbnQ7XG59XG5cbmZ1bmN0aW9uIG9jZWFuaWNWb2ljZVN0YXRlVXBkYXRlUHJveHkoXG5jbGllbnQ6IE9jZWFuaWMuQ2xpZW50LFxucHJveHk6IE9jZWFuaWMuQ2xpZW50LFxuaGFuZGxlcjogKGEsIGIpID0+IHZvaWQpXG57XG4gIGNsaWVudC5vbigndm9pY2VTdGF0ZVVwZGF0ZScsIChtZW1iZXIsIG9sZFN0YXRlKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb3hpZWRPbGRTdGF0ZSA9IHtcbiAgICAgICAgY2hhbm5lbElkOiBvbGRTdGF0ZS5jaGFubmVsSUQsXG4gICAgICAgIHNlcnZlck11dGU6IG9sZFN0YXRlLm11dGUsXG4gICAgICAgIHN1cHByZXNzOiBvbGRTdGF0ZS5zdXBwcmVzcyxcbiAgICAgICAgZ3VpbGQ6IHtcbiAgICAgICAgICBpZDogb2xkU3RhdGUuZ3VpbGQuaWRcbiAgICAgICAgfSxcbiAgICAgICAgbWVtYmVyOiB7XG4gICAgICAgICAgaWQ6IG9sZFN0YXRlLnVzZXIuaWRcbiAgICAgICAgfVxuICAgICAgfSBhcyBWb2ljZVN0YXRlO1xuXG4gICAgICBjb25zdCBtZSA9IG1lbWJlci5ndWlsZC5tZW1iZXJzLmdldChjbGllbnQudXNlci5pZCk7XG4gICAgICBjb25zdCByZXNvbHZlZENoYW5uZWwgPSBtZW1iZXIuZ3VpbGQuY2hhbm5lbHMuZ2V0KFxuICAgICAgICBtZW1iZXIudm9pY2VTdGF0ZS5jaGFubmVsSURcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHByb3hpZWROZXdTdGF0ZSA9IHtcbiAgICAgICAgY2hhbm5lbElkOiBtZW1iZXIudm9pY2VTdGF0ZS5jaGFubmVsSUQsXG4gICAgICAgIHNlcnZlck11dGU6IG1lbWJlci52b2ljZVN0YXRlLm11dGUsXG4gICAgICAgIHN1cHByZXNzOiBtZW1iZXIudm9pY2VTdGF0ZS5zdXBwcmVzcyxcbiAgICAgICAgY2hhbm5lbDogb2NlYW5pY1Jlc29sdmVkQ2hhbm5lbFByb3h5KHJlc29sdmVkQ2hhbm5lbCwgY2xpZW50KSxcbiAgICAgICAgbWVtYmVyOiB7XG4gICAgICAgICAgaWQ6IG1lbWJlci5pZFxuICAgICAgICB9LFxuICAgICAgICBndWlsZDoge1xuICAgICAgICAgIGlkOiBtZW1iZXIuZ3VpbGQuaWQsXG4gICAgICAgICAgbWVtYmVyczoge1xuICAgICAgICAgICAgbWU6IHtcbiAgICAgICAgICAgICAgaWQ6IG1lPy5pZCxcbiAgICAgICAgICAgICAgdm9pY2U6IHtcbiAgICAgICAgICAgICAgICBhc3luYyBzZXRSZXF1ZXN0VG9TcGVhayh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICAgICAgICAgICAgdm9pZCB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBtZT8udm9pY2VTdGF0ZTtcbiAgICAgICAgICAgICAgICAgIC8vIGlmIChtZSkge1xuICAgICAgICAgICAgICAgICAgLy8gICByZXR1cm4gbWUudm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBhcyBWb2ljZVN0YXRlO1xuXG4gICAgICByZXR1cm4gaGFuZGxlcihwcm94aWVkTmV3U3RhdGUsIHByb3hpZWRPbGRTdGF0ZSk7XG4gICAgfSBjYXRjaCB7XG5cbiAgICAgIC8qIG5vb3AgKi99XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvY2VhbmljVm9pY2VFdmVudHNIYW5kbGVyKGNsaWVudDogT2NlYW5pYy5DbGllbnQpIHtcbiAgbGV0IGFkYXB0ZXJzID0gZ2V0UHJvcGVydHk8TWFwPHN0cmluZywgYW55Pj4oY2xpZW50LCAnYWRhcHRlcnMnKTtcblxuICBpZiAoIWFkYXB0ZXJzKSB7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgYWRhcHRlcnMgPSBjb2xsZWN0aW9uO1xuICAgIGRlY2xhcmVQcm9wZXJ0eShjbGllbnQsICdhZGFwdGVycycsIGNvbGxlY3Rpb24pO1xuICB9XG5cbiAgY2xpZW50Lm9uKCdzaGFyZERpc2Nvbm5lY3QnLCAoXywgc2hhcmRJZCkgPT4ge1xuICAgIGZvciAoY29uc3QgW2d1aWxkSWQsIGFkYXB0ZXJdIG9mIGFkYXB0ZXJzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGNsaWVudC5ndWlsZHMuZ2V0KGd1aWxkSWQpPy5zaGFyZC5pZCA9PT0gc2hhcmRJZCkge1xuICAgICAgICBhZGFwdGVyLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGNsaWVudC5vbigncGFja2V0JywgKHBhY2tldCkgPT4ge1xuICAgIHN3aXRjaCAocGFja2V0LnQpIHtcbiAgICAgIGNhc2UgR2F0ZXdheURpc3BhdGNoRXZlbnRzLlZvaWNlU2VydmVyVXBkYXRlOntcbiAgICAgICAgICBjb25zdCBwYXlsb2FkID0gcGFja2V0LmQgYXMgR2F0ZXdheVZvaWNlU2VydmVyVXBkYXRlRGlzcGF0Y2hEYXRhO1xuICAgICAgICAgIGFkYXB0ZXJzLmdldChwYXlsb2FkLmd1aWxkX2lkKT8ub25Wb2ljZVNlcnZlclVwZGF0ZShwYXlsb2FkKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIGNhc2UgR2F0ZXdheURpc3BhdGNoRXZlbnRzLlZvaWNlU3RhdGVVcGRhdGU6e1xuICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBwYWNrZXQuZCBhcyBHYXRld2F5Vm9pY2VTdGF0ZVVwZGF0ZURpc3BhdGNoRGF0YTtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICBwYXlsb2FkLmd1aWxkX2lkICYmXG4gICAgICAgICAgcGF5bG9hZC5zZXNzaW9uX2lkICYmXG4gICAgICAgICAgcGF5bG9hZC51c2VyX2lkID09PSBjbGllbnQudXNlci5pZClcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGFwdGVycy5nZXQocGF5bG9hZC5ndWlsZF9pZCk/Lm9uVm9pY2VTdGF0ZVVwZGF0ZShwYXlsb2FkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9jZWFuaWNDaGFubmVsc1Byb3h5KGNsaWVudDogT2NlYW5pYy5DbGllbnQsIG9jZWFuaWM6IHR5cGVvZiBpbXBvcnQoJ29jZWFuaWMuanMnKSkge1xuICBjb25zdCBoYW5kbGVyID0ge1xuICAgIGNsaWVudCxcbiAgICBnZXQgY2FjaGUoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBnZXQoaWQ6IHN0cmluZykge1xuICAgICAgICAgIHJldHVybiBjbGllbnQuZ2V0Q2hhbm5lbChpZCk7XG4gICAgICAgIH0sXG4gICAgICAgIGhhcyhpZDogc3RyaW5nKSB7XG4gICAgICAgICAgcmV0dXJuIGlkIGluIGNsaWVudC5jaGFubmVsR3VpbGRNYXA7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcbiAgICByZXNvbHZlKHJlc29sdmFibGU6IHN0cmluZyB8IE9jZWFuaWNDaGFubmVsUmVzb2x2YWJsZSkge1xuICAgICAgaWYgKHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gb2NlYW5pY1Jlc29sdmVkQ2hhbm5lbFByb3h5KFxuICAgICAgICAgIHRoaXMuY2xpZW50LmdldENoYW5uZWwocmVzb2x2YWJsZSkgYXMgT2NlYW5pYy5HdWlsZENoYW5uZWwsXG4gICAgICAgICAgY2xpZW50XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNvbHZhYmxlIGluc3RhbmNlb2YgT2NlYW5pYy5HdWlsZENoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuIG9jZWFuaWNSZXNvbHZlZENoYW5uZWxQcm94eShyZXNvbHZhYmxlLCBjbGllbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcmVzb2x2ZUlkKHJlc29sdmFibGU6IE9jZWFuaWNDaGFubmVsUmVzb2x2YWJsZSkge1xuICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucmVzb2x2ZShyZXNvbHZhYmxlKTtcbiAgICAgIHJldHVybiBjaGFubmVsPy5pZDtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIGhhbmRsZXI7XG59XG5cbmZ1bmN0aW9uIG9jZWFuaWNSZXNvbHZlZENoYW5uZWxQcm94eShcbmNoYW5uZWw6IE9jZWFuaWMuR3VpbGRDaGFubmVsIHwgdW5kZWZpbmVkLFxuY2xpZW50OiBPY2VhbmljLkNsaWVudClcbjogT2NlYW5pYy5HdWlsZENoYW5uZWwgfCB1bmRlZmluZWQge1xuICBpZiAoIWNoYW5uZWwpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb3h5KGNoYW5uZWwsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBzd2l0Y2ggKHApIHtcbiAgICAgICAgY2FzZSAnZ3VpbGQnOlxuICAgICAgICAgIHJldHVybiBvY2VhbmljVm9pY2VBZGFwdGVyUHJveHkodGFyZ2V0Lmd1aWxkLCBjbGllbnQpO1xuICAgICAgICBjYXNlICdtZW1iZXJzJzpcbiAgICAgICAgICByZXR1cm4gKHRhcmdldCBhcyBPY2VhbmljLlZvaWNlQ2hhbm5lbCkudm9pY2VNZW1iZXJzO1xuICAgICAgICBjYXNlICdpc1ZvaWNlQmFzZWQnOlxuICAgICAgICAgIHJldHVybiAoKSA9PlxuICAgICAgICAgIHRhcmdldC50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFZvaWNlIHx8XG4gICAgICAgICAgdGFyZ2V0LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZTtcbiAgICAgICAgY2FzZSAnaXNWb2ljZSc6XG4gICAgICAgICAgcmV0dXJuICgpID0+IHRhcmdldC50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFZvaWNlO1xuICAgICAgICBjYXNlICdpc1N0YWdlJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4gdGFyZ2V0LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvY2VhbmljVm9pY2VBZGFwdGVyUHJveHkoXG5ndWlsZDogT2NlYW5pYy5HdWlsZCB8IHVuZGVmaW5lZCxcbmNsaWVudDogT2NlYW5pYy5DbGllbnQpXG46IE9jZWFuaWMuR3VpbGQgfCB1bmRlZmluZWQge1xuICBpZiAoIWd1aWxkKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm94eShndWlsZCwge1xuICAgIGdldCh0YXJnZXQsIHApIHtcbiAgICAgIGlmIChwID09PSAndm9pY2VBZGFwdGVyQ3JlYXRvcicpIHtcbiAgICAgICAgcmV0dXJuIG9jZWFuaWNWb2ljZUFkYXB0ZXJDcmVhdG9yKHRhcmdldCwgY2xpZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvY2VhbmljVm9pY2VBZGFwdGVyQ3JlYXRvcihcbmd1aWxkOiBPY2VhbmljLkd1aWxkLFxuY2xpZW50OiBPY2VhbmljLkNsaWVudClcbjogRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvciB7XG4gIHJldHVybiAobWV0aG9kcykgPT4ge1xuICAgIGxldCBhZGFwdGVycyA9IGdldFByb3BlcnR5PE1hcDxzdHJpbmcsIHR5cGVvZiBtZXRob2RzPj4oY2xpZW50LCAnYWRhcHRlcnMnKTtcblxuICAgIGlmICghYWRhcHRlcnMpIHtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBuZXcgTWFwPHN0cmluZywgdHlwZW9mIG1ldGhvZHM+KCk7XG4gICAgICBhZGFwdGVycyA9IGNvbGxlY3Rpb247XG4gICAgICBkZWNsYXJlUHJvcGVydHkoY2xpZW50LCAnYWRhcHRlcnMnLCBjb2xsZWN0aW9uKTtcbiAgICB9XG5cbiAgICBhZGFwdGVycy5zZXQoZ3VpbGQuaWQsIG1ldGhvZHMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbmRQYXlsb2FkKHBheWxvYWQpIHtcbiAgICAgICAgaWYgKGd1aWxkLnNoYXJkLnN0YXR1cyAhPT0gJ3JlYWR5JykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBndWlsZC5zaGFyZC5zZW5kKHBheWxvYWQub3AsIHBheWxvYWQuZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGFkYXB0ZXJzLmRlbGV0ZShndWlsZC5pZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb2NlYW5pY0d1aWxkc1Byb3h5KGNsaWVudDogT2NlYW5pYy5DbGllbnQsIG9jZWFuaWM6IHR5cGVvZiBpbXBvcnQoJ29jZWFuaWMuanMnKSkge1xuICByZXR1cm4gbmV3IFByb3h5KGNsaWVudC5ndWlsZHMsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBpZiAocCA9PT0gJ2NhY2hlJykge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfVxuXG4gICAgICBpZiAocCA9PT0gJ3Jlc29sdmUnIHx8IHAgPT09ICdyZXNvbHZlSWQnKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVyID0gZnVuY3Rpb24gKHJlc29sdmFibGU6IE9jZWFuaWNHdWlsZFJlc29sdmFibGUpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmdldChyZXNvbHZhYmxlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIG9jZWFuaWMuR3VpbGQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2Ygb2NlYW5pYy5NZW1iZXIgfHxcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2Ygb2NlYW5pYy5HdWlsZCB8fFxuICAgICAgICAgIHJlc29sdmFibGUgaW5zdGFuY2VvZiBvY2VhbmljLkd1aWxkQ2hhbm5lbCB8fFxuICAgICAgICAgIHJlc29sdmFibGUgaW5zdGFuY2VvZiBvY2VhbmljLlJvbGUpXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGUuZ3VpbGQ7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChwID09PSAncmVzb2x2ZScpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHJlc29sdmFibGU6IE9jZWFuaWNHdWlsZFJlc29sdmFibGUpID0+IHtcbiAgICAgICAgICBjb25zdCBndWlsZCA9IHJlc29sdmVyKHJlc29sdmFibGUpO1xuICAgICAgICAgIHJldHVybiBndWlsZD8uaWQ7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gb2NlYW5pY1VzZXJzUHJveHkoY2xpZW50OiBPY2VhbmljLkNsaWVudCwgb2NlYW5pYzogdHlwZW9mIGltcG9ydCgnb2NlYW5pYy5qcycpKSB7XG4gIHJldHVybiBuZXcgUHJveHkoY2xpZW50LnVzZXJzLCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgaWYgKHAgPT09ICdjYWNoZScpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH1cblxuICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJyB8fCBwID09PSAncmVzb2x2ZUlkJykge1xuICAgICAgICBjb25zdCByZXNvbHZlciA9IGZ1bmN0aW9uIChyZXNvbHZhYmxlOiBPY2VhbmljVXNlclJlc29sdmFibGUpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmdldChyZXNvbHZhYmxlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIG9jZWFuaWMuVXNlcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlc29sdmFibGUgaW5zdGFuY2VvZiBvY2VhbmljLk1lbWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmFibGUudXNlcjtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJykge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAocmVzb2x2YWJsZTogT2NlYW5pY1VzZXJSZXNvbHZhYmxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgdXNlciA9IHJlc29sdmVyKHJlc29sdmFibGUpO1xuICAgICAgICAgIHJldHVybiB1c2VyPy5pZDtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICB9XG4gIH0pO1xufSIsICJpbXBvcnQgeyBEZWZhdWx0TGlzdGVuZXIgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgTGlzdGVuZXJTaWduYXR1cmUgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgY2xhc3MgUGxheWVyRXZlbnRzRW1pdHRlcjxcbiAgTCBleHRlbmRzIExpc3RlbmVyU2lnbmF0dXJlPEw+ID0gRGVmYXVsdExpc3RlbmVyPiBleHRlbmRzXG5FdmVudEVtaXR0ZXI8TD4ge1xuICAjaGFzRGVidWdnZXIgPSBmYWxzZTtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZXF1aXJlZEV2ZW50czogQXJyYXk8a2V5b2YgTD4gPSBbXSkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgb248SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgaWYgKG5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIub24obmFtZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIG9uY2U8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgaWYgKG5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIub25jZShuYW1lLCBsaXN0ZW5lcik7XG4gIH1cblxuICBwdWJsaWMgYWRkTGlzdGVuZXI8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgaWYgKG5hbWUgPT09ICdkZWJ1ZycpIHtcbiAgICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuYWRkTGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIG9mZjxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICB0aGlzLiNoYXNEZWJ1Z2dlciA9IHRoaXMubGlzdGVuZXJDb3VudCgnZGVidWcnIGFzIEspID4gMDtcblxuICAgIHJldHVybiBzdXBlci5vZmYobmFtZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUxpc3RlbmVyPEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCBsaXN0ZW5lcjogTFtLXSkge1xuICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdGhpcy5saXN0ZW5lckNvdW50KCdkZWJ1ZycgYXMgSykgPiAwO1xuXG4gICAgcmV0dXJuIHN1cGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVBbGxMaXN0ZW5lcnM8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU/OiBLKSB7XG4gICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0aGlzLmxpc3RlbmVyQ291bnQoJ2RlYnVnJyBhcyBLKSA+IDA7XG5cbiAgICByZXR1cm4gc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKG5hbWUpO1xuICB9XG5cbiAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIC4uLmFyZ3M6IFBhcmFtZXRlcnM8TFtLXT4pIHtcbiAgICBpZiAoXG4gICAgdGhpcy5yZXF1aXJlZEV2ZW50cy5pbmNsdWRlcyhuYW1lKSAmJlxuICAgICF0aGlzLmV2ZW50TmFtZXMoKS5pbmNsdWRlcyhuYW1lKSlcbiAgICB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5lcnJvciguLi5hcmdzKTtcbiAgICAgIFV0aWwud2FybihcbiAgICAgICAgYE5vIGV2ZW50IGxpc3RlbmVyIGZvdW5kIGZvciBldmVudCBcIiR7U3RyaW5nKFxuICAgICAgICAgIG5hbWVcbiAgICAgICAgKX1cIi4gRXZlbnRzICR7dGhpcy5yZXF1aXJlZEV2ZW50cy5cbiAgICAgICAgbWFwKChtKSA9PiBgXCIke1N0cmluZyhtKX1cImApLlxuICAgICAgICBqb2luKCcsICcpfSBtdXN0IGhhdmUgZXZlbnQgbGlzdGVuZXJzLmAsXG4gICAgICAgICdVbmhhbmRsZWRFdmVudHNXYXJuaW5nJ1xuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuZW1pdChuYW1lLCAuLi5hcmdzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzRGVidWdnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2hhc0RlYnVnZ2VyO1xuICB9XG59IiwgImltcG9ydCB7IFVzZXIgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi4vZmFicmljL1BsYXlsaXN0JztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgTm90SW1wbGVtZW50ZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IEd1aWxkUXVldWVIaXN0b3J5IH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHMgfSBmcm9tICcuLi9QbGF5ZXInO1xuXG5leHBvcnQgdHlwZSBFeHRyYWN0b3JTdHJlYW1hYmxlID1cblJlYWRhYmxlIHxcbnN0cmluZyB8XG57XG4gICRmbXQ6IHN0cmluZztcbiAgc3RyZWFtOiBSZWFkYWJsZTtcbn07XG5cbmV4cG9ydCBjbGFzcyBCYXNlRXh0cmFjdG9yPFQgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIElkZW50aWZpZXIgZm9yIHRoaXMgZXh0cmFjdG9yXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkZW50aWZpZXIgPSAnY29tLmRpc2NvcmQtcGxheWVyLmV4dHJhY3Rvcic7XG5cbiAgLyoqXG4gICAqIFByaW9yaXR5IG9mIHRoaXMgZXh0cmFjdG9yLiBIaWdoZXIgdmFsdWUgbWVhbnMgaGlnaGVyIHByaW9yaXR5ICh3aWxsIGJlIGV4ZWN1dGVkIGZpcnN0KS5cbiAgICovXG4gIHB1YmxpYyBwcmlvcml0eSA9IDE7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBxdWVyeSBwcm90b2NvbHMgdGhhdCB0aGlzIGV4dHJhY3RvciBzdXBwb3J0cy5cbiAgICovXG4gIHB1YmxpYyBwcm90b2NvbHM6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBicmlkZ2UgcXVlcnkgY3JlYXRpb25cbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBidWlsZCBxdWVyeSBmb3JcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVCcmlkZ2VRdWVyeSA9ICh0cmFjazogVHJhY2spID0+XG4gIGAke3RyYWNrLnRpdGxlfSBieSAke3RyYWNrLmF1dGhvcn0gb2ZmaWNpYWwgYXVkaW9gO1xuXG4gIC8qKlxuICAgKiBFeHRyYWN0b3IgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0aGF0IGluc3RhbnRpYXRlZCB0aGlzIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gb3B0aW9ucyBJbml0aWFsaXphdGlvbiBvcHRpb25zIGZvciB0aGlzIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICBwdWJsaWMgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCxcbiAgcHVibGljIG9wdGlvbnM6IFQgPSA8VD4ge30pXG4gIHt9XG5cbiAgLyoqXG4gICAqIElkZW50aWZpZXIgb2YgdGhpcyBleHRyYWN0b3JcbiAgICovXG4gIHB1YmxpYyBnZXQgaWRlbnRpZmllcigpIHtcbiAgICByZXR1cm4gKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIEJhc2VFeHRyYWN0b3IpLmlkZW50aWZpZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVjb25maWd1cmVzIHRoaXMgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBuZXcgb3B0aW9ucyB0byBhcHBseVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlY29uZmlndXJlKG9wdGlvbnM6IFQpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIGF3YWl0IHRoaXMuZGVhY3RpdmF0ZSgpO1xuICAgIGF3YWl0IHRoaXMuYWN0aXZhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhpcyBleHRyYWN0b3IgaXMgYWN0aXZhdGVkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYWN0aXZhdGUoKSB7XG4gICAgLy8gZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBhY3RpdmF0ZWRcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGRlYWN0aXZhdGVkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVhY3RpdmF0ZSgpIHtcbiAgICAvLyBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGRlYWN0aXZhdGVkXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGluY29taW5nIHF1ZXJ5XG4gICAqIEBwYXJhbSBxdWVyeSBUaGUgcXVlcnkgdG8gdmFsaWRhdGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyB2YWxpZGF0ZShcbiAgcXVlcnk6IHN0cmluZyxcbiAgdHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IG51bGwpXG4gIDogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdm9pZCB0eXBlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJlYW0gdGhlIGdpdmVuIHRyYWNrXG4gICAqIEBwYXJhbSBpbmZvIFRoZSB0cmFjayB0byBzdHJlYW1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdHJlYW0oaW5mbzogVHJhY2spOiBQcm9taXNlPEV4dHJhY3RvclN0cmVhbWFibGU+IHtcbiAgICB2b2lkIGluZm87XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5zdHJlYW0oKWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgZ2l2ZW4gcXVlcnlcbiAgICogQHBhcmFtIHF1ZXJ5IFRoZSBxdWVyeSB0byBoYW5kbGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUoXG4gIHF1ZXJ5OiBzdHJpbmcsXG4gIGNvbnRleHQ6IEV4dHJhY3RvclNlYXJjaENvbnRleHQpXG4gIDogUHJvbWlzZTxFeHRyYWN0b3JJbmZvPiB7XG4gICAgdm9pZCBjb250ZXh0O1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uaGFuZGxlKClgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVsYXRlZCB0cmFja3MgZm9yIHRoZSBnaXZlbiB0cmFja1xuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHNvdXJjZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFJlbGF0ZWRUcmFja3MoXG4gIHRyYWNrOiBUcmFjayxcbiAgaGlzdG9yeTogR3VpbGRRdWV1ZUhpc3RvcnkpXG4gIDogUHJvbWlzZTxFeHRyYWN0b3JJbmZvPiB7XG4gICAgdm9pZCB0cmFjaztcbiAgICB2b2lkIGhpc3Rvcnk7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmdldFJlbGF0ZWRUcmFja3MoKWBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3RyZWFtIG1pZGRsZXdhcmUgdG8gaGFuZGxlIHN0cmVhbXMgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlIHBsYXllclxuICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBpbmNvbWluZyBzdHJlYW1cbiAgICogQHBhcmFtIG5leHQgVGhlIG5leHQgZnVuY3Rpb25cbiAgICovXG4gIHB1YmxpYyBoYW5kbGVQb3N0U3RyZWFtKHN0cmVhbTogUmVhZGFibGUsIG5leHQ6IE5leHRGdW5jdGlvbikge1xuICAgIHJldHVybiBuZXh0KG51bGwsIHN0cmVhbSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggYW4gZXZlbnQgdG8gdGhlIHBsYXllclxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIGRpc3BhdGNoXG4gICAqIEBwYXJhbSBhcmdzIFRoZSBkYXRhIHRvIGRpc3BhdGNoXG4gICAqL1xuICBwdWJsaWMgZW1pdDxLIGV4dGVuZHMga2V5b2YgUGxheWVyRXZlbnRzPihcbiAgZXZlbnQ6IEssXG4gIC4uLmFyZ3M6IFBhcmFtZXRlcnM8UGxheWVyRXZlbnRzW0tdPilcbiAge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQucGxheWVyLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBleHRyYWN0b3IgcmVzcG9uc2VcbiAgICogQHBhcmFtIHBsYXlsaXN0IFRoZSBwbGF5bGlzdFxuICAgKiBAcGFyYW0gdHJhY2tzIFRoZSB0cmFjayBhcnJheVxuICAgKi9cbiAgcHVibGljIGNyZWF0ZVJlc3BvbnNlKFxuICBwbGF5bGlzdD86IFBsYXlsaXN0IHwgbnVsbCxcbiAgdHJhY2tzOiBUcmFja1tdID0gcGxheWxpc3Q/LnRyYWNrcyB8fCBbXSlcbiAgOiBFeHRyYWN0b3JJbmZvIHtcbiAgICByZXR1cm4geyBwbGF5bGlzdDogcGxheWxpc3QgfHwgbnVsbCwgdHJhY2tzIH07XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgZGVidWcgbWVzc2FnZVxuICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZGVidWcgbWVzc2FnZVxuICAgKi9cbiAgcHVibGljIGRlYnVnKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQucGxheWVyLmRlYnVnKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgZmxhZyB0byBpbmRpY2F0ZSBgRGVtdXhhYmxlYCBzdHJlYW0gc3VwcG9ydCBmb3IgYG9wdXNgL2BvZ2cvb3B1c2AvYHdlYm0vb3B1c2AgZm9ybWF0cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3VwcG9ydHNEZW11eCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmNvbnRleHQucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZztcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc3RyZWFtIGV4dHJhY3Rpb24gZm9yIGFub3RoZXIgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gYnJpZGdlXG4gICAqIEBwYXJhbSBzb3VyY2VFeHRyYWN0b3IgVGhlIHNvdXJjZSBleHRyYWN0b3JcbiAgICovXG4gIHB1YmxpYyBhc3luYyBicmlkZ2UoXG4gIHRyYWNrOiBUcmFjayxcbiAgc291cmNlRXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbClcbiAgOiBQcm9taXNlPEV4dHJhY3RvclN0cmVhbWFibGUgfCBudWxsPiB7XG4gICAgdm9pZCBzb3VyY2VFeHRyYWN0b3I7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgTmV4dEZ1bmN0aW9uID0gKGVycm9yPzogRXJyb3IgfCBudWxsLCBzdHJlYW0/OiBSZWFkYWJsZSkgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JJbmZvIHtcbiAgcGxheWxpc3Q6IFBsYXlsaXN0IHwgbnVsbDtcbiAgdHJhY2tzOiBUcmFja1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvclNlYXJjaENvbnRleHQge1xuICB0eXBlPzogU2VhcmNoUXVlcnlUeXBlIHwgbnVsbDtcbiAgcmVxdWVzdGVkQnk/OiBVc2VyIHwgbnVsbDtcbiAgcmVxdWVzdE9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucztcbiAgcHJvdG9jb2w/OiBzdHJpbmcgfCBudWxsO1xufSIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yLCBFeHRyYWN0b3JTdHJlYW1hYmxlIH0gZnJvbSAnLi9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFBsYXllckV2ZW50c0VtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMnO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJy4uL2hvb2tzJztcbmltcG9ydCB7IEJyaWRnZUZhaWxlZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JTZXNzaW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgYXR0ZW1wdGVkRXh0cmFjdG9yczogU2V0PHN0cmluZz47XG4gIGJyaWRnZUF0dGVtcHRlZEV4dHJhY3RvcnM6IFNldDxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvckV4ZWN1dGlvbkV2ZW50cyB7XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgcmVnaXN0ZXJlZFxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSBleHRyYWN0b3Igd2FzIHJlZ2lzdGVyZWRcbiAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRoYXQgd2FzIHJlZ2lzdGVyZWRcbiAgICovXG4gIHJlZ2lzdGVyZWQ6IChcbiAgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCxcbiAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIHVucmVnaXN0ZXJlZFxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSBleHRyYWN0b3Igd2FzIHVucmVnaXN0ZXJlZFxuICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdGhhdCB3YXMgdW5yZWdpc3RlcmVkXG4gICAqL1xuICB1bnJlZ2lzdGVyZWQ6IChcbiAgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCxcbiAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGlzIGFjdGl2YXRlZFxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB3aGljaCB3YXMgYWN0aXZhdGVkXG4gICAqL1xuICBhY3RpdmF0ZTogKFxuICBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LFxuICBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgZGVhY3RpdmF0ZWRcbiAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGRlYWN0aXZhdGVkXG4gICAqL1xuICBkZWFjdGl2YXRlOiAoXG4gIGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsXG4gIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcilcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBmYWlscyB0byBhY3RpdmF0ZS9kZWFjdGl2YXRlXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHdoaWNoIHdhcyBkZWFjdGl2YXRlZFxuICAgKi9cbiAgZXJyb3I6IChcbiAgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCxcbiAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yLFxuICBlcnJvcjogRXJyb3IpXG4gID0+IHVua25vd247XG59XG5cbmV4cG9ydCBjbGFzcyBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0IGV4dGVuZHMgUGxheWVyRXZlbnRzRW1pdHRlcjxFeHRyYWN0b3JFeGVjdXRpb25FdmVudHM+IHtcbiAgLyoqXG4gICAqIFRoZSBleHRyYWN0b3JzIHN0b3JlXG4gICAqL1xuICBwdWJsaWMgc3RvcmUgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIEJhc2VFeHRyYWN0b3I+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNvbnRleHQgPSBjcmVhdGVDb250ZXh0PEV4dHJhY3RvclNlc3Npb24+KCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge1xuICAgIHN1cGVyKFsnZXJyb3InXSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBpZFxuICAgKi9cbiAgcHVibGljIGdldEV4ZWN1dGlvbklkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQuY29uc3VtZSgpPy5pZCA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBleGVjdXRpb24gY29udGV4dFxuICAgKi9cbiAgcHVibGljIGdldENvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5jb25zdW1lKCkgPz8gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsb2FkRGVmYXVsdCgpIHtcbiAgICBjb25zdCBzYW1wbGUgPSBgXFx0aW1wb3J0IHsgRGVmYXVsdEV4dHJhY3RvcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXh0cmFjdG9yJztcXG5cXHRhd2FpdCBwbGF5ZXIuZXh0cmFjdG9ycy5sb2FkTXVsdGkoRGVmYXVsdEV4dHJhY3RvcnMpO2A7XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgZXh0cmFjdG9ycy5sb2FkRGVmYXVsdCgpIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIFVzZSBleHRyYWN0b3JzLmxvYWRNdWx0aSBpbnN0ZWFkLiBFeGFtcGxlOlxcbiR7c2FtcGxlfVxcbmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYSBidW5kbGUgb2YgZXh0cmFjdG9ycy5cbiAgICogQGV4YW1wbGUgaW1wb3J0IHsgRGVmYXVsdEV4dHJhY3RvcnMgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZXh0cmFjdG9yJztcbiAgICpcbiAgICogYXdhaXQgcGxheWVyLmV4dHJhY3RvcnMubG9hZE11bHRpKERlZmF1bHRFeHRyYWN0b3JzKTtcbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2FkTXVsdGk8XG4gICAgTyBleHRlbmRzIG9iamVjdCxcbiAgICBUIGV4dGVuZHMgKHR5cGVvZiBCYXNlRXh0cmFjdG9yPE8+KVtdLFxuICAgIFIgZXh0ZW5kcyBSZWNvcmQ8XG4gICAgICBUW251bWJlcl1bJ2lkZW50aWZpZXInXSxcbiAgICAgIENvbnN0cnVjdG9yUGFyYW1ldGVyczxUW251bWJlcl0+WzFdPj4oXG5cbiAgYnVuZGxlOiBULCBvcHRpb25zOiBSID0ge30gYXMgUikge1xuICAgIGJ1bmRsZS5mb3JFYWNoKChleHQpID0+IHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMucmVnaXN0ZXIoZXh0LCBvcHRpb25zPy5bZXh0LmlkZW50aWZpZXJdIHx8IHt9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGVycm9yOiBudWxsIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgaWYgdGhlIGdpdmVuIGV4dHJhY3RvciBpcyByZWdpc3RlcmVkXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBleHRyYWN0b3IgaWRlbnRpZmllclxuICAgKi9cbiAgcHVibGljIGlzUmVnaXN0ZXJlZChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5oYXMoaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgcmVnaXN0ZXJlZCBleHRyYWN0b3JzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2luZ2xlIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgZXh0cmFjdG9yIHRvIGdldFxuICAgKi9cbiAgcHVibGljIGdldChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXQoaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgc2luZ2xlIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gX2V4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgc3VwcGxpZWQgdG8gdGhlIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlZ2lzdGVyPE8gZXh0ZW5kcyBvYmplY3QsIFQgZXh0ZW5kcyB0eXBlb2YgQmFzZUV4dHJhY3RvcjxPPj4oXG4gIF9leHRyYWN0b3I6IFQsXG4gIG9wdGlvbnM6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxUPlsnMSddKVxuICA6IFByb21pc2U8SW5zdGFuY2VUeXBlPFQ+IHwgbnVsbD4ge1xuICAgIGlmIChcbiAgICB0eXBlb2YgX2V4dHJhY3Rvci5pZGVudGlmaWVyICE9PSAnc3RyaW5nJyB8fFxuICAgIHRoaXMuc3RvcmUuaGFzKF9leHRyYWN0b3IuaWRlbnRpZmllcikpXG5cbiAgICByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBleHRyYWN0b3IgPSBuZXcgX2V4dHJhY3Rvcih0aGlzLCBvcHRpb25zKTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnN0b3JlLnNldChfZXh0cmFjdG9yLmlkZW50aWZpZXIsIGV4dHJhY3Rvcik7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBsb2FkZWQhYCk7XG4gICAgICB0aGlzLmVtaXQoJ3JlZ2lzdGVyZWQnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgYXdhaXQgZXh0cmFjdG9yLmFjdGl2YXRlKCk7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBhY3RpdmF0ZWQhYCk7XG4gICAgICB0aGlzLmVtaXQoJ2FjdGl2YXRlJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICAgIHJldHVybiBleHRyYWN0b3IgYXMgdW5rbm93biBhcyBJbnN0YW5jZVR5cGU8VD47XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5zdG9yZS5kZWxldGUoX2V4dHJhY3Rvci5pZGVudGlmaWVyKTtcbiAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucGxheWVyLmRlYnVnKFxuICAgICAgICBgJHtfZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBmYWlsZWQgdG8gYWN0aXZhdGUhIEVycm9yOiAke2V9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCB0aGlzLCBleHRyYWN0b3IsIGUgYXMgRXJyb3IpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXIgc2luZ2xlIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gX2V4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHRvIHVucmVnaXN0ZXJcbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyPEsgZXh0ZW5kcyBzdHJpbmcgfCBCYXNlRXh0cmFjdG9yPihfZXh0cmFjdG9yOiBLKSB7XG4gICAgY29uc3QgZXh0cmFjdG9yID1cbiAgICB0eXBlb2YgX2V4dHJhY3RvciA9PT0gJ3N0cmluZycgP1xuICAgIHRoaXMuc3RvcmUuZ2V0KF9leHRyYWN0b3IpIDpcbiAgICB0aGlzLnN0b3JlLmZpbmQoKHIpID0+IHIgPT09IF9leHRyYWN0b3IpO1xuICAgIGlmICghZXh0cmFjdG9yKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qga2V5ID1cbiAgICAgIGV4dHJhY3Rvci5pZGVudGlmaWVyIHx8IHRoaXMuc3RvcmUuZmluZEtleSgoZSkgPT4gZSA9PT0gZXh0cmFjdG9yKSE7XG4gICAgICB0aGlzLnN0b3JlLmRlbGV0ZShrZXkpO1xuICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoYCR7ZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBkaXNhYmxlZCFgKTtcbiAgICAgIHRoaXMuZW1pdCgndW5yZWdpc3RlcmVkJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICAgIGF3YWl0IGV4dHJhY3Rvci5kZWFjdGl2YXRlKCk7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGRlYWN0aXZhdGVkIWApO1xuICAgICAgdGhpcy5lbWl0KCdkZWFjdGl2YXRlJywgdGhpcywgZXh0cmFjdG9yKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhcbiAgICAgICAgYCR7ZXh0cmFjdG9yLmlkZW50aWZpZXJ9IGV4dHJhY3RvciBmYWlsZWQgdG8gZGVhY3RpdmF0ZSFgXG4gICAgICApO1xuICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIHRoaXMsIGV4dHJhY3RvciwgZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXIgYWxsIGV4dHJhY3RvcnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyQWxsKCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLnN0b3JlLm1hcCgoZSkgPT4gdGhpcy51bnJlZ2lzdGVyKGUpKSk7XG4gICAgfSBjYXRjaCB7XG5cbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9fVxuXG4gIC8qKlxuICAgKiBSdW4gYWxsIHRoZSBleHRyYWN0b3JzXG4gICAqIEBwYXJhbSBmbiBUaGUgcnVubmVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSBmaWx0ZXJCbG9ja2VkIEZpbHRlciBibG9ja2VkIGV4dHJhY3RvcnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBydW48VCA9IHVua25vd24+KFxuICBmbjogRXh0cmFjdG9yRXhlY3V0aW9uRk48VD4sXG4gIGZpbHRlckJsb2NrZWQgPSB0cnVlKVxuICB7XG4gICAgY29uc3QgYmxvY2tlZCA9IHRoaXMucGxheWVyLm9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzID8/IFtdO1xuXG4gICAgaWYgKCF0aGlzLnN0b3JlLnNpemUpIHtcbiAgICAgIFV0aWwud2FybihcbiAgICAgICAgJ1NraXBwaW5nIGV4dHJhY3RvcnMgZXhlY3V0aW9uIHNpbmNlIHplcm8gZXh0cmFjdG9ycyB3ZXJlIHJlZ2lzdGVyZWQnLFxuICAgICAgICAnTm9FeHRyYWN0b3JzJ1xuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBzb3J0IGJ5IHByaW9yaXR5IHNvIHRoYXQgZXh0cmFjdG9ycyB3aXRoIGhpZ2hlciBwcmlvcml0eSBhcmUgZXhlY3V0ZWQgZmlyc3RcbiAgICBjb25zdCBleHRyYWN0b3JzID0gdGhpcy5zdG9yZS5zb3J0KChhLCBiKSA9PiBiLnByaW9yaXR5IC0gYS5wcmlvcml0eSk7XG5cbiAgICBsZXQgZXJyOiBFcnJvciB8IG51bGwgPSBudWxsLFxuICAgICAgbGFzdEV4dDogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCBleHQgb2YgZXh0cmFjdG9ycy52YWx1ZXMoKSkge1xuICAgICAgaWYgKGZpbHRlckJsb2NrZWQgJiYgYmxvY2tlZC5zb21lKChlKSA9PiBlID09PSBleHQuaWRlbnRpZmllcikpIGNvbnRpbnVlO1xuICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoYEV4ZWN1dGluZyBleHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0uLi5gKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKGV4dCkudGhlbihcbiAgICAgICAgKHJlcykgPT4ge1xuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0sXG4gICAgICAgIChlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgIHRoaXMucGxheWVyLmRlYnVnKFxuICAgICAgICAgICAgYEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBmYWlsZWQgd2l0aCBlcnJvcjogJHtlfWBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmV0dXJuIFR5cGVVdGlsLmlzRXJyb3IoZSkgPyBlIDogbmV3IEVycm9yKGAke2V9YCk7XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGxhc3RFeHQgPSBleHQ7XG5cbiAgICAgIGlmIChyZXN1bHQgJiYgIVR5cGVVdGlsLmlzRXJyb3IocmVzdWx0KSkge1xuICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMucGxheWVyLmRlYnVnKFxuICAgICAgICAgIGBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5IWBcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGV4dHJhY3RvcjogZXh0LFxuICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICAgIHJlc3VsdFxuICAgICAgICB9IGFzIEV4dHJhY3RvckV4ZWN1dGlvblJlc3VsdDxUPjtcbiAgICAgIH0gZWxzZSBpZiAoVHlwZVV0aWwuaXNFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgIGVyciA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyKVxuICAgIHJldHVybiB7XG4gICAgICBleHRyYWN0b3I6IGxhc3RFeHQhLFxuICAgICAgZXJyb3I6IGVycixcbiAgICAgIHJlc3VsdDogZmFsc2VcbiAgICB9IGFzIEV4dHJhY3RvckV4ZWN1dGlvblJlc3VsdDxmYWxzZT47XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBicmlkZ2UgZm9yIGEgdHJhY2tcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byByZXF1ZXN0IGJyaWRnZSBmb3JcbiAgICogQHBhcmFtIHNvdXJjZUV4dHJhY3RvciBUaGUgc291cmNlIGV4dHJhY3RvciBvZiB0aGUgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXF1ZXN0QnJpZGdlKFxuICB0cmFjazogVHJhY2ssXG4gIHNvdXJjZUV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSB0cmFjay5leHRyYWN0b3IpXG4gIHtcbiAgICBjb25zdCBwcmV2aW91c2x5QXR0ZW1wdGVkID1cbiAgICB0aGlzLmdldENvbnRleHQoKT8uYnJpZGdlQXR0ZW1wdGVkRXh0cmFjdG9ycyA/PyBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuPEV4dHJhY3RvclN0cmVhbWFibGU+KGFzeW5jIChleHQpID0+IHtcbiAgICAgIGlmIChzb3VyY2VFeHRyYWN0b3IgJiYgZXh0LmlkZW50aWZpZXIgPT09IHNvdXJjZUV4dHJhY3Rvci5pZGVudGlmaWVyKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHByZXZpb3VzbHlBdHRlbXB0ZWQuaGFzKGV4dC5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBwcmV2aW91c2x5QXR0ZW1wdGVkLmFkZChleHQuaWRlbnRpZmllcik7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4dC5icmlkZ2UodHJhY2ssIHNvdXJjZUV4dHJhY3Rvcik7XG5cbiAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3VsdD8ucmVzdWx0KVxuICAgIHRocm93IG5ldyBCcmlkZ2VGYWlsZWRFcnJvcihcbiAgICAgIHRoaXMuZ2V0RXhlY3V0aW9uSWQoKSxcbiAgICAgIHJlc3VsdD8uZXJyb3I/LnN0YWNrIHx8XG4gICAgICByZXN1bHQ/LmVycm9yPy5tZXNzYWdlIHx8XG4gICAgICAnTm8gZXh0cmFjdG9ycyBhdmFpbGFibGUgdG8gYnJpZGdlJ1xuICAgICk7XG5cbiAgICB0cmFjay5icmlkZ2VkRXh0cmFjdG9yID0gcmVzdWx0LmV4dHJhY3RvcjtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBicmlkZ2UgZnJvbSB0aGUgc3BlY2lmaWVkIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlcXVlc3QgYnJpZGdlIGZvclxuICAgKiBAcGFyYW0gc291cmNlRXh0cmFjdG9yIFRoZSBzb3VyY2UgZXh0cmFjdG9yIG9mIHRoZSB0cmFja1xuICAgKiBAcGFyYW0gdGFyZ2V0RXh0cmFjdG9yIFRoZSB0YXJnZXQgZXh0cmFjdG9yIHRvIGJyaWRnZSB0b1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcXVlc3RCcmlkZ2VGcm9tKFxuICB0cmFjazogVHJhY2ssXG4gIHNvdXJjZUV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwsXG4gIHRhcmdldEV4dHJhY3RvcjogRXh0cmFjdG9yUmVzb2x2YWJsZSlcbiAge1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucmVzb2x2ZSh0YXJnZXRFeHRyYWN0b3IpO1xuICAgIGlmICghdGFyZ2V0KSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGFyZ2V0LmJyaWRnZSh0cmFjaywgc291cmNlRXh0cmFjdG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBleHRyYWN0b3IgaXMgZGlzYWJsZWRcbiAgICovXG4gIHB1YmxpYyBpc0Rpc2FibGVkKGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnBsYXllci5vcHRpb25zLmJsb2NrRXh0cmFjdG9ycz8uaW5jbHVkZXMoaWRlbnRpZmllcikgPz8gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZXh0cmFjdG9yIGlzIGVuYWJsZWRcbiAgICovXG4gIHB1YmxpYyBpc0VuYWJsZWQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuICF0aGlzLmlzRGlzYWJsZWQoaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBleHRyYWN0b3IgaWRlbnRpZmllclxuICAgKi9cbiAgcHVibGljIHJlc29sdmVJZChyZXNvbHZhYmxlOiBFeHRyYWN0b3JSZXNvbHZhYmxlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJyA/IHJlc29sdmFibGUgOiByZXNvbHZhYmxlLmlkZW50aWZpZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBleHRyYWN0b3JcbiAgICovXG4gIHB1YmxpYyByZXNvbHZlKHJlc29sdmFibGU6IEV4dHJhY3RvclJlc29sdmFibGUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnID8gdGhpcy5nZXQocmVzb2x2YWJsZSkgOiByZXNvbHZhYmxlO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PFQgPSB1bmtub3duPiB7XG4gIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcjtcbiAgZXJyb3I6IEVycm9yIHwgbnVsbDtcbiAgcmVzdWx0OiBUO1xufVxuXG5leHBvcnQgdHlwZSBFeHRyYWN0b3JFeGVjdXRpb25GTjxUID0gdW5rbm93bj4gPSAoXG5leHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpXG49PiBQcm9taXNlPFQgfCBib29sZWFuPjtcblxuZXhwb3J0IHR5cGUgRXh0cmFjdG9yUmVzb2x2YWJsZSA9IHN0cmluZyB8IEJhc2VFeHRyYWN0b3I7IiwgImltcG9ydCB7IEFzeW5jTG9jYWxTdG9yYWdlIH0gZnJvbSAnbm9kZTphc3luY19ob29rcyc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG50eXBlIHVuc2FmZSA9IGFueTtcblxuLyoqXG4gKiBUaGUgcmVjZWl2ZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBjb250ZXh0IGlzIHByb3ZpZGVkXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRleHRSZWNlaXZlcjxSPiA9ICgpID0+IFI7XG5cbmV4cG9ydCBjbGFzcyBDb250ZXh0PFQ+IHtcbiAgcHJpdmF0ZSBzdG9yYWdlID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlPFQ+KCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgZGVmYXVsdFZhbHVlPzogVCkge31cblxuICAvKipcbiAgICogRXhpdCBvdXQgb2YgdGhpcyBjb250ZXh0XG4gICAqL1xuICBwdWJsaWMgZXhpdChzY29wZTogQ29udGV4dFJlY2VpdmVyPHZvaWQ+KSB7XG4gICAgdGhpcy5zdG9yYWdlLmV4aXQoc2NvcGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNvbnRleHQgaXMgbG9zdFxuICAgKi9cbiAgcHVibGljIGdldCBpc0xvc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5nZXRTdG9yZSgpID09PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb250ZXh0LiBJZiB0aGUgY29udGV4dCBpcyBsb3N0IGFuZCBubyBkZWZhdWx0IHZhbHVlIGlzIHByb3ZpZGVkLCB1bmRlZmluZWQgd2lsbCBiZSByZXR1cm5lZC5cbiAgICovXG4gIHB1YmxpYyBjb25zdW1lKCk6IFQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnN0b3JhZ2UuZ2V0U3RvcmUoKTtcblxuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQgJiYgdGhpcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYSBmdW5jdGlvbiB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhpcyBwcm92aWRlclxuICAgKi9cbiAgcHVibGljIHByb3ZpZGU8UiA9IHVuc2FmZT4odmFsdWU6IFQsIHJlY2VpdmVyOiBDb250ZXh0UmVjZWl2ZXI8Uj4pOiBSIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250ZXh0IHZhbHVlIG1heSBub3QgYmUgdW5kZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZWNlaXZlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250ZXh0IHJlY2VpdmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0b3JhZ2UucnVuKHZhbHVlLCByZWNlaXZlcik7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgY29udGV4dC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgb3B0aW9uYWwuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBjb250ZXh0XG4gKiBAZXhhbXBsZSBjb25zdCB1c2VyQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoKTtcbiAqXG4gKiAgLy8gdGhlIHZhbHVlIHRvIHByb3ZpZGVcbiAqICBjb25zdCB1c2VyID0ge1xuICogICBpZDogMSxcbiAqICAgbmFtZTogJ0pvaG4gRG9lJ1xuICogIH07XG4gKlxuICogIC8vIHByb3ZpZGUgdGhlIGNvbnRleHQgdmFsdWUgdG8gdGhlIHJlY2VpdmVyXG4gKiAgY29udGV4dC5wcm92aWRlKHVzZXIsIGhhbmRsZXIpO1xuICpcbiAqICBmdW5jdGlvbiBoYW5kbGVyKCkge1xuICogICAgLy8gZ2V0IHRoZSBjb250ZXh0IHZhbHVlXG4gKiAgICBjb25zdCB7IGlkLCBuYW1lIH0gPSB1c2VDb250ZXh0KGNvbnRleHQpO1xuICpcbiAqICAgIGNvbnNvbGUubG9nKGlkLCBuYW1lKTsgLy8gMSwgSm9obiBEb2VcbiAqICB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb250ZXh0PFQgPSB1bnNhZmU+KGRlZmF1bHRWYWx1ZT86IFQpOiBDb250ZXh0PFQ+IHtcbiAgcmV0dXJuIG5ldyBDb250ZXh0KGRlZmF1bHRWYWx1ZSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb250ZXh0LiBJZiB0aGUgY29udGV4dCBpcyBsb3N0IGFuZCBubyBkZWZhdWx0IHZhbHVlIGlzIHByb3ZpZGVkLCB1bmRlZmluZWQgd2lsbCBiZSByZXR1cm5lZC5cbiAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGdldCB0aGUgdmFsdWUgZnJvbVxuICogQGV4YW1wbGUgY29uc3QgdmFsdWUgPSB1c2VDb250ZXh0KGNvbnRleHQpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQ29udGV4dDxUID0gdW5zYWZlPihjb250ZXh0OiBDb250ZXh0PFQ+KTogVCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZXh0LmNvbnN1bWUoKTtcbn0iLCAiaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBnbG9iYWxSZWdpc3RyeSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgdW5rbm93bj4oKTsiLCAiaW1wb3J0IHsgZ2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuL19jb250YWluZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2xvYmFsUmVnaXN0cnkoKSB7XG4gIHJldHVybiBnbG9iYWxSZWdpc3RyeTtcbn0iLCAiaW1wb3J0IHsgR3VpbGQgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBJbGxlZ2FsSG9va0ludm9jYXRpb25FcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0LCB1c2VDb250ZXh0IH0gZnJvbSAnLi9jb250ZXh0L2FzeW5jLWNvbnRleHQnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi91dGlscy9fX2ludGVybmFsX18nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEhvb2tzQ3R4IHtcbiAgZ3VpbGQ6IEd1aWxkO1xufVxuXG5leHBvcnQgY29uc3QgU1VQRVJfQ09OVEVYVCA9IGNyZWF0ZUNvbnRleHQ8UGxheWVyPigpO1xuXG5jb25zdCBnZXRGYWxsYmFja0NvbnRleHQgPSAoKSA9PiB7XG4gIHJldHVybiBnZXRHbG9iYWxSZWdpc3RyeSgpLmdldCgnQFtwbGF5ZXJdJykgYXMgUGxheWVyIHwgdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSG9va3NDb250ZXh0KGhvb2tOYW1lOiBzdHJpbmcsIG1haW5Pbmx5ID0gZmFsc2UpIHtcbiAgbGV0IGlzRmFsbGJhY2sgPSBmYWxzZTtcblxuICBsZXQgcGxheWVyOiBQbGF5ZXIgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKCEocGxheWVyID0gU1VQRVJfQ09OVEVYVC5jb25zdW1lKCkpKSB7XG4gICAgcGxheWVyID0gZ2V0RmFsbGJhY2tDb250ZXh0KCk7XG4gICAgaXNGYWxsYmFjayA9IHRydWU7XG4gIH1cblxuICBpZiAoIXBsYXllcilcbiAgdGhyb3cgbmV3IElsbGVnYWxIb29rSW52b2NhdGlvbkVycm9yKFxuICAgICdkaXNjb3JkLXBsYXllcicsXG4gICAgYFBsYXllciBjb250ZXh0IGlzIG5vdCBhdmFpbGFibGUsICR7XG4gICAgaXNGYWxsYmFjayA/XG4gICAgJ2RpZCB5b3UgZm9yZ2V0IHRvIGluaXRpYWxpemUgdGhlIHBsYXllciB3aXRoIGBuZXcgUGxheWVyKGNsaWVudClgPycgOlxuICAgICdpcyBpdCBiZWluZyBjYWxsZWQgaW5zaWRlIDxQbGF5ZXI+LmNvbnRleHQucHJvdmlkZSgpPyd9YFxuXG4gICk7XG5cbiAgaWYgKG1haW5Pbmx5KSByZXR1cm4geyBwbGF5ZXIsIGNvbnRleHQ6IHt9IGFzIEhvb2tzQ3R4LCBpc0ZhbGxiYWNrIH07XG5cbiAgbGV0IGNvbnRleHQ6IEhvb2tzQ3R4IHwgdW5kZWZpbmVkO1xuXG4gIGlmICghaXNGYWxsYmFjaykge1xuICAgIGNvbnRleHQgPSB1c2VDb250ZXh0KHBsYXllci5jb250ZXh0KTtcbiAgICBpZiAoIWNvbnRleHQpXG4gICAgdGhyb3cgbmV3IElsbGVnYWxIb29rSW52b2NhdGlvbkVycm9yKFxuICAgICAgaG9va05hbWUsXG4gICAgICBgJHtob29rTmFtZX0gbXVzdCBiZSBjYWxsZWQgaW5zaWRlIGEgcGxheWVyIGNvbnRleHQgY3JlYXRlZCBieSA8UGxheWVyPi5jb250ZXh0LnByb3ZpZGUoKWBcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGNvbnRleHQgPSB7XG4gICAgICBnZXQgZ3VpbGQoKSB7XG4gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsSG9va0ludm9jYXRpb25FcnJvcihcbiAgICAgICAgICBob29rTmFtZSxcbiAgICAgICAgICBgJHtob29rTmFtZX0gbXVzdCBiZSBjYWxsZWQgd2l0aCBhbiBleHBsaWNpdCBndWlsZCBhcmd1bWVudCB3aGVuIG5vdCBpbnNpZGUgYSBwbGF5ZXIgY29udGV4dGBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGFzIHVua25vd24gYXMgSG9va3NDdHg7XG4gIH1cblxuICByZXR1cm4geyBjb250ZXh0LCBwbGF5ZXIsIGlzRmFsbGJhY2sgfTtcbn0iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZUhpc3RvcnksIE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIEZldGNoIGd1aWxkIHF1ZXVlIGhpc3RvcnlcbiAqIEBwYXJhbSBub2RlIGd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSGlzdG9yeTxNZXRhID0gdW5rbm93bj4oKTogR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+KFxubm9kZTogTm9kZVJlc29sdmFibGUpXG46IEd1aWxkUXVldWVIaXN0b3J5PE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VIaXN0b3J5PE1ldGEgPSB1bmtub3duPihcbm5vZGU/OiBOb2RlUmVzb2x2YWJsZSlcbjogR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4gfCBudWxsIHtcbiAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlSGlzdG9yeScpO1xuXG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQ8TWV0YT4obm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgcmV0dXJuIHF1ZXVlLmhpc3Rvcnk7XG59IiwgImltcG9ydCB7IEd1aWxkUXVldWVQbGF5ZXJOb2RlLCBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBndWlsZCBxdWV1ZSBwbGF5ZXIgbm9kZVxuICogQHBhcmFtIG5vZGUgR3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KCk6IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KFxubm9kZTogTm9kZVJlc29sdmFibGUpXG46IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VQbGF5ZXI8TWV0YSA9IHVua25vd24+KFxubm9kZT86IE5vZGVSZXNvbHZhYmxlKVxuOiBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhPiB8IG51bGwge1xuICBjb25zdCB7IGNvbnRleHQsIHBsYXllciB9ID0gdXNlSG9va3NDb250ZXh0KCd1c2VQbGF5ZXInKTtcbiAgY29uc3QgcXVldWUgPSBwbGF5ZXIucXVldWVzLmdldDxNZXRhPihub2RlID8/IGNvbnRleHQuZ3VpbGQuaWQpO1xuICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICByZXR1cm4gcXVldWUubm9kZTtcbn0iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZSwgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggZ3VpbGQgcXVldWUuXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGUuIERlZmF1bHRzIHRvIGluZmVycmVkIGd1aWxkIGZyb20gY29udGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVF1ZXVlPE1ldGEgPSB1bmtub3duPigpOiBHdWlsZFF1ZXVlPE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VRdWV1ZTxNZXRhID0gdW5rbm93bj4oXG5ub2RlOiBOb2RlUmVzb2x2YWJsZSlcbjogR3VpbGRRdWV1ZTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlUXVldWU8TWV0YSA9IHVua25vd24+KFxubm9kZT86IE5vZGVSZXNvbHZhYmxlKVxuOiBHdWlsZFF1ZXVlPE1ldGE+IHwgbnVsbCB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZVF1ZXVlJyk7XG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5yZXNvbHZlPE1ldGE+KG5vZGUgPz8gY29udGV4dC5ndWlsZC5pZCk7XG4gIGlmICghcXVldWUpIHJldHVybiBudWxsO1xuXG4gIHJldHVybiBxdWV1ZTtcbn0iLCAiaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIEZldGNoIG1haW4gcGxheWVyIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VNYWluUGxheWVyKCkge1xuICBjb25zdCB7IHBsYXllciB9ID0gdXNlSG9va3NDb250ZXh0KCd1c2VNYWluUGxheWVyJywgdHJ1ZSk7XG5cbiAgcmV0dXJuIHBsYXllcjtcbn0iLCAiaW1wb3J0IHsgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuZXhwb3J0IHR5cGUgU2V0dGVyRk48VCwgUD4gPSAocHJldmlvdXM6IFApID0+IFQ7XG5leHBvcnQgdHlwZSBNZXRhZGF0YURpc3BhdGNoPFQ+ID0gcmVhZG9ubHkgW1xuICAoKSA9PiBULFxuICAobWV0YWRhdGE6IFQgfCBTZXR0ZXJGTjxULCBUPikgPT4gdm9pZF07XG5cblxuLyoqXG4gKiBGZXRjaCBvciBtYW5pcHVsYXRlIGd1aWxkIHF1ZXVlIG1ldGFkYXRhXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1ldGFkYXRhPFQgPSB1bmtub3duPigpOiBNZXRhZGF0YURpc3BhdGNoPFQ+O1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1ldGFkYXRhPFQgPSB1bmtub3duPihcbm5vZGU6IE5vZGVSZXNvbHZhYmxlKVxuOiBNZXRhZGF0YURpc3BhdGNoPFQ+O1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1ldGFkYXRhPFQgPSB1bmtub3duPihcbm5vZGU/OiBOb2RlUmVzb2x2YWJsZSlcbjogTWV0YWRhdGFEaXNwYXRjaDxUPiB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZU1ldGFkYXRhJyk7XG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQ8VD4obm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgY29uc3Qgc2V0dGVyID0gKG1ldGFkYXRhOiBUIHwgU2V0dGVyRk48VCwgVD4pID0+IHtcbiAgICBpZiAocXVldWUpIHtcbiAgICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG1ldGFkYXRhKSlcbiAgICAgIHJldHVybiBxdWV1ZS5zZXRNZXRhZGF0YShtZXRhZGF0YShxdWV1ZS5tZXRhZGF0YSkpO1xuICAgICAgcmV0dXJuIHF1ZXVlLnNldE1ldGFkYXRhKG1ldGFkYXRhKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZ2V0dGVyID0gKCkgPT4ge1xuICAgIHJldHVybiBxdWV1ZT8ubWV0YWRhdGEgYXMgVDtcbiAgfTtcblxuICByZXR1cm4gW2dldHRlciwgc2V0dGVyXSBhcyBjb25zdDtcbn0iLCAiaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMnO1xuaW1wb3J0IHsgTm9kZVJlc29sdmFibGUsIFBsYXllclRpbWVzdGFtcCB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBUaW1lbGluZURpc3BhdGNoZXJPcHRpb25zIHtcbiAgaWdub3JlRmlsdGVyczogYm9vbGVhbjtcbiAgbm9kZTogTm9kZVJlc29sdmFibGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZVRpbWVsaW5lIHtcbiAgcmVhZG9ubHkgdGltZXN0YW1wOiBQbGF5ZXJUaW1lc3RhbXA7XG4gIHJlYWRvbmx5IHZvbHVtZTogbnVtYmVyO1xuICByZWFkb25seSBwYXVzZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRyYWNrOiBUcmFjazx1bmtub3duPiB8IG51bGw7XG4gIHBhdXNlKCk6IGJvb2xlYW47XG4gIHJlc3VtZSgpOiBib29sZWFuO1xuICBzZXRWb2x1bWUodm9sOiBudW1iZXIpOiBib29sZWFuO1xuICBzZXRQb3NpdGlvbih0aW1lOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+O1xufVxuXG4vKipcbiAqIEZldGNoIG9yIG1hbmlwdWxhdGUgY3VycmVudCB0cmFja1xuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGltZWxpbmUgZGlzcGF0Y2hlclxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlVGltZWxpbmUoKTogR3VpbGRRdWV1ZVRpbWVsaW5lIHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VUaW1lbGluZShcbm9wdGlvbnM6IFBhcnRpYWw8VGltZWxpbmVEaXNwYXRjaGVyT3B0aW9ucz4pXG46IEd1aWxkUXVldWVUaW1lbGluZSB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlVGltZWxpbmUoXG5vcHRpb25zPzogUGFydGlhbDxUaW1lbGluZURpc3BhdGNoZXJPcHRpb25zPilcbjogR3VpbGRRdWV1ZVRpbWVsaW5lIHwgbnVsbCB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZVRpbWVsaW5lJyk7XG4gIGNvbnN0IHF1ZXVlID0gcGxheWVyLnF1ZXVlcy5nZXQob3B0aW9ucz8ubm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgdGltZWxpbmUgPSBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe1xuICAgIGdldCB0aW1lc3RhbXAoKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5nZXRUaW1lc3RhbXAob3B0aW9ucz8uaWdub3JlRmlsdGVycykhO1xuICAgIH0sXG4gICAgZ2V0IHZvbHVtZSgpIHtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnZvbHVtZTtcbiAgICB9LFxuICAgIGdldCBwYXVzZWQoKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5pc1BhdXNlZCgpO1xuICAgIH0sXG4gICAgZ2V0IHRyYWNrKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlLmN1cnJlbnRUcmFjaztcbiAgICB9LFxuICAgIHBhdXNlKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUucGF1c2UoKTtcbiAgICB9LFxuICAgIHJlc3VtZSgpIHtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnJlc3VtZSgpO1xuICAgIH0sXG4gICAgc2V0Vm9sdW1lKHZvbDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5zZXRWb2x1bWUodm9sKTtcbiAgICB9LFxuICAgIGFzeW5jIHNldFBvc2l0aW9uKHRpbWU6IG51bWJlcikge1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2Vlayh0aW1lKTtcbiAgICB9XG4gIH0gc2F0aXNmaWVzIEd1aWxkUXVldWVUaW1lbGluZSk7XG5cbiAgcmV0dXJuIHRpbWVsaW5lO1xufSIsICJpbXBvcnQgeyBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciB9IGZyb20gJy4uLy4uL3F1ZXVlJztcbmltcG9ydCB7IGdldEdsb2JhbFJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vdXRpbHMvX19pbnRlcm5hbF9fJztcblxuLyoqXG4gKiBHbG9iYWwgb25BZnRlckNyZWF0ZVN0cmVhbSBoYW5kbGVyXG4gKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBjYWxsYmFja1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25BZnRlckNyZWF0ZVN0cmVhbShoYW5kbGVyOiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcikge1xuICBnZXRHbG9iYWxSZWdpc3RyeSgpLnNldCgnQFtvbkFmdGVyQ3JlYXRlU3RyZWFtXScsIGhhbmRsZXIpO1xufSIsICJpbXBvcnQgeyBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgfSBmcm9tICcuLi8uLi9xdWV1ZSc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uLy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbi8qKlxuICogR2xvYmFsIG9uQmVmb3JlQ3JlYXRlU3RyZWFtIGhhbmRsZXJcbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkJlZm9yZUNyZWF0ZVN0cmVhbShoYW5kbGVyOiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIpIHtcbiAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5zZXQoJ0Bbb25CZWZvcmVDcmVhdGVTdHJlYW1dJywgaGFuZGxlcik7XG59IiwgImltcG9ydCB7IE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbnR5cGUgU2V0dGVyRk4gPSAocHJldmlvdXM6IG51bWJlcikgPT4gbnVtYmVyO1xudHlwZSBWb2x1bWVEaXNwYXRjaCA9IHJlYWRvbmx5IFtcbiAgKCkgPT4gbnVtYmVyLFxuICAodm9sdW1lOiBudW1iZXIgfCBTZXR0ZXJGTikgPT4gYm9vbGVhbiB8IHVuZGVmaW5lZF07XG5cblxuLyoqXG4gKiBGZXRjaCBvciBtYW5pcHVsYXRlIHBsYXllciB2b2x1bWVcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlVm9sdW1lKCk6IFZvbHVtZURpc3BhdGNoO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVZvbHVtZShub2RlOiBOb2RlUmVzb2x2YWJsZSk6IFZvbHVtZURpc3BhdGNoO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVZvbHVtZShub2RlPzogTm9kZVJlc29sdmFibGUpOiBWb2x1bWVEaXNwYXRjaCB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZVZvbHVtZScpO1xuICBjb25zdCBxdWV1ZSA9IHBsYXllci5xdWV1ZXMuZ2V0KG5vZGUgPz8gY29udGV4dC5ndWlsZC5pZCk7XG4gIGNvbnN0IHNldHRlciA9ICh2b2x1bWU6IG51bWJlciB8IFNldHRlckZOKSA9PiB7XG4gICAgaWYgKHF1ZXVlKSB7XG4gICAgICBpZiAoVHlwZVV0aWwuaXNGdW5jdGlvbih2b2x1bWUpKVxuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2V0Vm9sdW1lKHZvbHVtZShxdWV1ZS5ub2RlLnZvbHVtZSkpO1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUuc2V0Vm9sdW1lKHZvbHVtZSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGdldHRlciA9ICgpID0+IHtcbiAgICByZXR1cm4gcXVldWU/Lm5vZGUudm9sdW1lIGFzIG51bWJlcjtcbiAgfTtcblxuICByZXR1cm4gW2dldHRlciwgc2V0dGVyXSBhcyBjb25zdDtcbn0iLCAiaW1wb3J0IHtcbiAgRXF1YWxpemVyQmFuZCxcbiAgUENNRmlsdGVycyxcbiAgQmlxdWFkRmlsdGVycyB9IGZyb21cbidAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24sIFF1ZXVlU3RyYXRlZ3kgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgR3VpbGRSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHtcbiAgR3VpbGRRdWV1ZSxcbiAgT25BZnRlckNyZWF0ZVN0cmVhbUhhbmRsZXIsXG4gIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcixcbiAgUXVldWVSZXBlYXRNb2RlIH0gZnJvbVxuJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5pbXBvcnQgeyBOb0d1aWxkRXJyb3IsIE5vR3VpbGRRdWV1ZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IEZpbHRlcnNOYW1lIH0gZnJvbSAnLi4vZmFicmljJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUID0gYW55PiB7XG4gIHN0cmF0ZWd5PzogUXVldWVTdHJhdGVneTtcbiAgdm9sdW1lPzogbnVtYmVyO1xuICBlcXVhbGl6ZXI/OiBFcXVhbGl6ZXJCYW5kW107XG4gIGFfZmlsdGVyPzogUENNRmlsdGVyc1tdO1xuICBiaXF1YWQ/OiBCaXF1YWRGaWx0ZXJzO1xuICByZXNhbXBsZXI/OiBudW1iZXI7XG4gIGRpc2FibGVIaXN0b3J5PzogYm9vbGVhbjtcbiAgb25CZWZvcmVDcmVhdGVTdHJlYW0/OiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gIG9uQWZ0ZXJDcmVhdGVTdHJlYW0/OiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgcmVwZWF0TW9kZT86IFF1ZXVlUmVwZWF0TW9kZTtcbiAgcGF1c2VPbkVtcHR5PzogYm9vbGVhbjtcbiAgbGVhdmVPbkVtcHR5PzogYm9vbGVhbjtcbiAgbGVhdmVPbkVtcHR5Q29vbGRvd24/OiBudW1iZXI7XG4gIGxlYXZlT25FbmQ/OiBib29sZWFuO1xuICBsZWF2ZU9uRW5kQ29vbGRvd24/OiBudW1iZXI7XG4gIGxlYXZlT25TdG9wPzogYm9vbGVhbjtcbiAgbGVhdmVPblN0b3BDb29sZG93bj86IG51bWJlcjtcbiAgbWV0YWRhdGE/OiBUIHwgbnVsbDtcbiAgc2VsZkRlYWY/OiBib29sZWFuO1xuICBjb25uZWN0aW9uVGltZW91dD86IG51bWJlcjtcbiAgZGVmYXVsdEZGbXBlZ0ZpbHRlcnM/OiBGaWx0ZXJzTmFtZVtdO1xuICBidWZmZXJpbmdUaW1lb3V0PzogbnVtYmVyO1xuICBub0VtaXRJbnNlcnQ/OiBib29sZWFuO1xuICBtYXhTaXplPzogbnVtYmVyO1xuICBtYXhIaXN0b3J5U2l6ZT86IG51bWJlcjtcbiAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhPzogYm9vbGVhbjtcbiAgZGlzYWJsZVZvbHVtZT86IGJvb2xlYW47XG4gIGRpc2FibGVFcXVhbGl6ZXI/OiBib29sZWFuO1xuICBkaXNhYmxlRmlsdGVyZXI/OiBib29sZWFuO1xuICBkaXNhYmxlQmlxdWFkPzogYm9vbGVhbjtcbiAgZGlzYWJsZVJlc2FtcGxlcj86IGJvb2xlYW47XG4gIGRpc2FibGVDb21wcmVzc29yPzogYm9vbGVhbjtcbiAgZGlzYWJsZVNlZWtlcj86IGJvb2xlYW47XG4gIGRpc2FibGVSZXZlcmI/OiBib29sZWFuO1xuICBkaXNhYmxlRmFsbGJhY2tTdHJlYW0/OiBib29sZWFuO1xuICBlbmFibGVTdHJlYW1JbnRlcmNlcHRvcj86IGJvb2xlYW47XG4gIHZlcmlmeUZhbGxiYWNrU3RyZWFtPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgTm9kZVJlc29sdmFibGUgPSBHdWlsZFF1ZXVlIHwgR3VpbGRSZXNvbHZhYmxlO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIEd1aWxkTm9kZU1hbmFnZXI8TWV0YSA9IGFueT4ge1xuICBwdWJsaWMgY2FjaGUgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIEd1aWxkUXVldWU+KCk7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGxheWVyOiBQbGF5ZXIpIHt9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBndWlsZCBxdWV1ZSBpZiBpdCBkb2VzIG5vdCBleGlzdFxuICAgKiBAcGFyYW0gZ3VpbGQgVGhlIGd1aWxkIHdoaWNoIHdpbGwgYmUgdGhlIG93bmVyIG9mIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBRdWV1ZSBpbml0aWFsaXplciBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlPFQgPSBNZXRhPihcbiAgZ3VpbGQ6IEd1aWxkUmVzb2x2YWJsZSxcbiAgb3B0aW9uczogR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUPiA9IHt9KVxuICA6IEd1aWxkUXVldWU8VD4ge1xuICAgIGNvbnN0IHNlcnZlciA9IHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZShndWlsZCk7XG4gICAgaWYgKCFzZXJ2ZXIpIHtcbiAgICAgIHRocm93IG5ldyBOb0d1aWxkRXJyb3IoJ0ludmFsaWQgb3IgdW5rbm93biBndWlsZCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNhY2hlLmhhcyhzZXJ2ZXIuaWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoc2VydmVyLmlkKSBhcyBHdWlsZFF1ZXVlPFQ+O1xuICAgIH1cblxuICAgIG9wdGlvbnMuc3RyYXRlZ3kgPz89ICdGSUZPJztcbiAgICBvcHRpb25zLnZvbHVtZSA/Pz0gMTAwO1xuICAgIG9wdGlvbnMuZXF1YWxpemVyID8/PSBbXTtcbiAgICBvcHRpb25zLmFfZmlsdGVyID8/PSBbXTtcbiAgICBvcHRpb25zLmRpc2FibGVIaXN0b3J5ID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmxlYXZlT25FbXB0eSA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duID8/PSAwO1xuICAgIG9wdGlvbnMubGVhdmVPbkVuZCA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmxlYXZlT25FbmRDb29sZG93biA/Pz0gMDtcbiAgICBvcHRpb25zLmxlYXZlT25TdG9wID8/PSB0cnVlO1xuICAgIG9wdGlvbnMubGVhdmVPblN0b3BDb29sZG93biA/Pz0gMDtcbiAgICBvcHRpb25zLnJlc2FtcGxlciA/Pz0gNDgwMDA7XG4gICAgb3B0aW9ucy5zZWxmRGVhZiA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0ID8/PSB0aGlzLnBsYXllci5vcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0O1xuICAgIG9wdGlvbnMuYnVmZmVyaW5nVGltZW91dCA/Pz0gMTAwMDtcbiAgICBvcHRpb25zLm1heFNpemUgPz89IEluZmluaXR5O1xuICAgIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz89IEluZmluaXR5O1xuICAgIG9wdGlvbnMucHJlZmVyQnJpZGdlZE1ldGFkYXRhID8/PSB0cnVlO1xuICAgIG9wdGlvbnMucGF1c2VPbkVtcHR5ID8/PSB0cnVlO1xuXG4gICAgLy8gdG9kbyh0d2xpdGUpOiBtYXliZSBkaXNhYmxlIHRoZXNlIGJ5IGRlZmF1bHQ/XG4gICAgb3B0aW9ucy5kaXNhYmxlQmlxdWFkID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmRpc2FibGVFcXVhbGl6ZXIgPz89IGZhbHNlO1xuICAgIG9wdGlvbnMuZGlzYWJsZUZpbHRlcmVyID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmRpc2FibGVWb2x1bWUgPz89IGZhbHNlO1xuICAgIG9wdGlvbnMuZGlzYWJsZVJlc2FtcGxlciA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5kaXNhYmxlQ29tcHJlc3NvciA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmRpc2FibGVTZWVrZXIgPz89IHRydWU7XG4gICAgb3B0aW9ucy5kaXNhYmxlUmV2ZXJiID8/PSB0cnVlO1xuXG4gICAgb3B0aW9ucy5kaXNhYmxlRmFsbGJhY2tTdHJlYW0gPz89IGZhbHNlO1xuICAgIG9wdGlvbnMuZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3IgPz89IGZhbHNlO1xuICAgIG9wdGlvbnMudmVyaWZ5RmFsbGJhY2tTdHJlYW0gPz89IGZhbHNlO1xuXG4gICAgaWYgKFxuICAgIGdldEdsb2JhbFJlZ2lzdHJ5KCkuaGFzKCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScpICYmXG4gICAgIW9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0pXG4gICAge1xuICAgICAgb3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSA9IGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KFxuICAgICAgICAnQFtvbkJlZm9yZUNyZWF0ZVN0cmVhbV0nXG4gICAgICApIGFzIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5oYXMoJ0Bbb25BZnRlckNyZWF0ZVN0cmVhbV0nKSAmJlxuICAgICFvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0pXG4gICAge1xuICAgICAgb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtID0gZ2V0R2xvYmFsUmVnaXN0cnkoKS5nZXQoXG4gICAgICAgICdAW29uQWZ0ZXJDcmVhdGVTdHJlYW1dJ1xuICAgICAgKSBhcyBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICB9XG5cbiAgICBjb25zdCBxdWV1ZSA9IG5ldyBHdWlsZFF1ZXVlPFQ+KHRoaXMucGxheWVyLCB7XG4gICAgICBndWlsZDogc2VydmVyLFxuICAgICAgcXVldWVTdHJhdGVneTogb3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIHZvbHVtZTogb3B0aW9ucy52b2x1bWUsXG4gICAgICBlcXVhbGl6ZXI6IG9wdGlvbnMuZXF1YWxpemVyLFxuICAgICAgZmlsdGVyZXI6IG9wdGlvbnMuYV9maWx0ZXIsXG4gICAgICBiaXF1YWQ6IG9wdGlvbnMuYmlxdWFkLFxuICAgICAgcmVzYW1wbGVyOiBvcHRpb25zLnJlc2FtcGxlcixcbiAgICAgIGRpc2FibGVIaXN0b3J5OiBvcHRpb25zLmRpc2FibGVIaXN0b3J5LFxuICAgICAgb25CZWZvcmVDcmVhdGVTdHJlYW06IG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0sXG4gICAgICBvbkFmdGVyQ3JlYXRlU3RyZWFtOiBvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0sXG4gICAgICByZXBlYXRNb2RlOiBvcHRpb25zLnJlcGVhdE1vZGUsXG4gICAgICBsZWF2ZU9uRW1wdHk6IG9wdGlvbnMubGVhdmVPbkVtcHR5LFxuICAgICAgbGVhdmVPbkVtcHR5Q29vbGRvd246IG9wdGlvbnMubGVhdmVPbkVtcHR5Q29vbGRvd24sXG4gICAgICBsZWF2ZU9uRW5kOiBvcHRpb25zLmxlYXZlT25FbmQsXG4gICAgICBsZWF2ZU9uRW5kQ29vbGRvd246IG9wdGlvbnMubGVhdmVPbkVuZENvb2xkb3duLFxuICAgICAgbGVhdmVPblN0b3A6IG9wdGlvbnMubGVhdmVPblN0b3AsXG4gICAgICBsZWF2ZU9uU3RvcENvb2xkb3duOiBvcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24sXG4gICAgICBtZXRhZGF0YTogb3B0aW9ucy5tZXRhZGF0YSxcbiAgICAgIGNvbm5lY3Rpb25UaW1lb3V0OiBvcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0ID8/IDEyMF8wMDAsXG4gICAgICBzZWxmRGVhZjogb3B0aW9ucy5zZWxmRGVhZixcbiAgICAgIGZmbXBlZ0ZpbHRlcnM6IG9wdGlvbnMuZGVmYXVsdEZGbXBlZ0ZpbHRlcnMgPz8gW10sXG4gICAgICBidWZmZXJpbmdUaW1lb3V0OiBvcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXQsXG4gICAgICBub0VtaXRJbnNlcnQ6IG9wdGlvbnMubm9FbWl0SW5zZXJ0ID8/IGZhbHNlLFxuICAgICAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhOiBvcHRpb25zLnByZWZlckJyaWRnZWRNZXRhZGF0YSxcbiAgICAgIG1heEhpc3RvcnlTaXplOiBvcHRpb25zLm1heEhpc3RvcnlTaXplLFxuICAgICAgbWF4U2l6ZTogb3B0aW9ucy5tYXhTaXplLFxuICAgICAgcGF1c2VPbkVtcHR5OiBvcHRpb25zLnBhdXNlT25FbXB0eSxcbiAgICAgIGRpc2FibGVCaXF1YWQ6IG9wdGlvbnMuZGlzYWJsZUJpcXVhZCxcbiAgICAgIGRpc2FibGVFcXVhbGl6ZXI6IG9wdGlvbnMuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgIGRpc2FibGVGaWx0ZXJlcjogb3B0aW9ucy5kaXNhYmxlRmlsdGVyZXIsXG4gICAgICBkaXNhYmxlUmVzYW1wbGVyOiBvcHRpb25zLmRpc2FibGVSZXNhbXBsZXIsXG4gICAgICBkaXNhYmxlVm9sdW1lOiBvcHRpb25zLmRpc2FibGVWb2x1bWUsXG4gICAgICBkaXNhYmxlRmFsbGJhY2tTdHJlYW06IG9wdGlvbnMuZGlzYWJsZUZhbGxiYWNrU3RyZWFtLFxuICAgICAgZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3I6IG9wdGlvbnMuZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3IsXG4gICAgICB2ZXJpZnlGYWxsYmFja1N0cmVhbTogb3B0aW9ucy52ZXJpZnlGYWxsYmFja1N0cmVhbSxcbiAgICAgIGRpc2FibGVDb21wcmVzc29yOiBvcHRpb25zLmRpc2FibGVDb21wcmVzc29yLFxuICAgICAgZGlzYWJsZVNlZWtlcjogb3B0aW9ucy5kaXNhYmxlU2Vla2VyLFxuICAgICAgZGlzYWJsZVJldmVyYjogb3B0aW9ucy5kaXNhYmxlUmV2ZXJiXG4gICAgfSk7XG5cbiAgICB0aGlzLmNhY2hlLnNldChzZXJ2ZXIuaWQsIHF1ZXVlKTtcblxuICAgIHJldHVybiBxdWV1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZXhpc3RpbmcgcXVldWVcbiAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgKi9cbiAgcHVibGljIGdldDxUID0gTWV0YT4obm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICBjb25zdCBxdWV1ZSA9IHRoaXMucmVzb2x2ZShub2RlKTtcbiAgICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB0aGlzLmNhY2hlLmdldChxdWV1ZS5pZCkgYXMgR3VpbGRRdWV1ZTxUPiB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgcXVldWUgZXhpc3RzXG4gICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICovXG4gIHB1YmxpYyBoYXMobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICBjb25zdCBpZCA9XG4gICAgbm9kZSBpbnN0YW5jZW9mIEd1aWxkUXVldWUgP1xuICAgIG5vZGUuaWQgOlxuICAgIHRoaXMucGxheWVyLmNsaWVudC5ndWlsZHMucmVzb2x2ZUlkKG5vZGUpITtcbiAgICByZXR1cm4gdGhpcy5jYWNoZS5oYXMoaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBxdWV1ZVxuICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcXVldWUgPSB0aGlzLnJlc29sdmUobm9kZSk7XG4gICAgaWYgKCFxdWV1ZSkge1xuICAgICAgdGhyb3cgbmV3IE5vR3VpbGRRdWV1ZUVycm9yKCdDYW5ub3QgZGVsZXRlIG5vbi1leGlzdGluZyBxdWV1ZScpO1xuICAgIH1cblxuICAgIHF1ZXVlLnNldFRyYW5zaXRpb25pbmcodHJ1ZSk7XG4gICAgcXVldWUubm9kZS5zdG9wKHRydWUpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBxdWV1ZS5jb25uZWN0aW9uPy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBxdWV1ZS5kaXNwYXRjaGVyPy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBxdWV1ZS5kaXNwYXRjaGVyPy5kaXNjb25uZWN0KCk7XG4gICAgcXVldWUudGltZW91dHMuZm9yRWFjaCgodG0pID0+IGNsZWFyVGltZW91dCh0bSkpO1xuICAgIHF1ZXVlLmhpc3RvcnkuY2xlYXIoKTtcbiAgICBxdWV1ZS50cmFja3MuY2xlYXIoKTtcblxuICAgIHJldHVybiB0aGlzLmNhY2hlLmRlbGV0ZShxdWV1ZS5pZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBxdWV1ZVxuICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZTxUID0gTWV0YT4obm9kZTogTm9kZVJlc29sdmFibGUpOiBHdWlsZFF1ZXVlPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEd1aWxkUXVldWUpIHtcbiAgICAgIHJldHVybiBub2RlIGFzIEd1aWxkUXVldWU8VD47XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KFxuICAgICAgdGhpcy5wbGF5ZXIuY2xpZW50Lmd1aWxkcy5yZXNvbHZlSWQobm9kZSkhXG4gICAgKSBhcyBHdWlsZFF1ZXVlPFQ+O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgcXVldWUgaWRcbiAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgKi9cbiAgcHVibGljIHJlc29sdmVJZChub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IHEgPSB0aGlzLnJlc29sdmUobm9kZSk7XG4gICAgcmV0dXJuIHE/LmlkIHx8IG51bGw7XG4gIH1cbn0iLCAiaW1wb3J0IHsgUGxheWVyLCBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zLCBUcmFja0xpa2UgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHtcbiAgQ2hhbm5lbFR5cGUsXG4gIEd1aWxkLFxuICBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gIFZvaWNlQmFzZWRDaGFubmVsLFxuICBWb2ljZVN0YXRlIH0gZnJvbVxuJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiwgUXVldWUsIFF1ZXVlU3RyYXRlZ3kgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHtcbiAgQmlxdWFkRmlsdGVycyxcbiAgQ29tbW9uUmVzYW1wbGVyRmlsdGVyUHJlc2V0LFxuICBDb21wcmVzc29yUGFyYW1ldGVycyxcbiAgRXF1YWxpemVyQmFuZCxcbiAgUENNRmlsdGVycyxcbiAgUmV2ZXJiUGFyYW1ldGVycyxcbiAgU2Vla2VyUGFyYW1ldGVycyB9IGZyb21cbidAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IFRyYWNrLCBUcmFja1Jlc29sdmFibGUgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9IGZyb20gJy4uL3N0cmVhbS9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7XG4gIHR5cGUgQXVkaW9QbGF5ZXIsXG4gIEF1ZGlvUmVzb3VyY2UsXG4gIFN0cmVhbVR5cGUsXG4gIFZvaWNlQ29ubmVjdGlvbixcbiAgVm9pY2VDb25uZWN0aW9uU3RhdHVzIH0gZnJvbVxuJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBVdGlsLCBWQUxJREFURV9RVUVVRV9DQVAgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFBsYXlsaXN0IH0gZnJvbSAnLi4vZmFicmljL1BsYXlsaXN0JztcbmltcG9ydCB7IEd1aWxkUXVldWVIaXN0b3J5IH0gZnJvbSAnLi9HdWlsZFF1ZXVlSGlzdG9yeSc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlUGxheWVyTm9kZSwgU3RyZWFtQ29uZmlnIH0gZnJvbSAnLi9HdWlsZFF1ZXVlUGxheWVyTm9kZSc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzIH0gZnJvbSAnLi9HdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzJztcbmltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICd0aW1lcnMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZVN0YXRpc3RpY3MgfSBmcm9tICcuL0d1aWxkUXVldWVTdGF0aXN0aWNzJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgQXN5bmNRdWV1ZSB9IGZyb20gJy4uL3V0aWxzL0FzeW5jUXVldWUnO1xuaW1wb3J0IHtcbiAgSW52YWxpZEFyZ1R5cGVFcnJvcixcbiAgTm9Wb2ljZUNoYW5uZWxFcnJvcixcbiAgTm9Wb2ljZUNvbm5lY3Rpb25FcnJvcixcbiAgT3V0T2ZSYW5nZUVycm9yLFxuICBWb2ljZUNvbm5lY3Rpb25EZXN0cm95ZWRFcnJvciB9IGZyb21cbicuLi9lcnJvcnMnO1xuaW1wb3J0IHsgU3luY2VkTHlyaWNzUHJvdmlkZXIgfSBmcm9tICcuL1N5bmNlZEx5cmljc1Byb3ZpZGVyJztcbmltcG9ydCB7IExyY0dldFJlc3VsdCwgTHJjU2VhcmNoUmVzdWx0IH0gZnJvbSAnLi4vbHJjbGliL0xyY0xpYic7XG5pbXBvcnQgeyBGaWx0ZXJzTmFtZSB9IGZyb20gJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi91dGlscy9RdWVyeVJlc29sdmVyJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGROb2RlSW5pdDxNZXRhID0gYW55PiB7XG4gIGd1aWxkOiBHdWlsZDtcbiAgcXVldWVTdHJhdGVneTogUXVldWVTdHJhdGVneTtcbiAgZXF1YWxpemVyOiBFcXVhbGl6ZXJCYW5kW10gfCBib29sZWFuO1xuICB2b2x1bWU6IG51bWJlciB8IGJvb2xlYW47XG4gIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHJlc2FtcGxlcjogbnVtYmVyIHwgYm9vbGVhbjtcbiAgZmlsdGVyZXI6IFBDTUZpbHRlcnNbXSB8IGJvb2xlYW47XG4gIGZmbXBlZ0ZpbHRlcnM6IEZpbHRlcnNOYW1lW107XG4gIGRpc2FibGVIaXN0b3J5OiBib29sZWFuO1xuICBvbkJlZm9yZUNyZWF0ZVN0cmVhbT86IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgb25BZnRlckNyZWF0ZVN0cmVhbT86IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICByZXBlYXRNb2RlPzogUXVldWVSZXBlYXRNb2RlO1xuICBsZWF2ZU9uRW1wdHk6IGJvb2xlYW47XG4gIGxlYXZlT25FbXB0eUNvb2xkb3duOiBudW1iZXI7XG4gIGxlYXZlT25FbmQ6IGJvb2xlYW47XG4gIGxlYXZlT25FbmRDb29sZG93bjogbnVtYmVyO1xuICBsZWF2ZU9uU3RvcDogYm9vbGVhbjtcbiAgbGVhdmVPblN0b3BDb29sZG93bjogbnVtYmVyO1xuICBjb25uZWN0aW9uVGltZW91dDogbnVtYmVyO1xuICBzZWxmRGVhZj86IGJvb2xlYW47XG4gIG1ldGFkYXRhPzogTWV0YSB8IG51bGw7XG4gIGJ1ZmZlcmluZ1RpbWVvdXQ6IG51bWJlcjtcbiAgbm9FbWl0SW5zZXJ0OiBib29sZWFuO1xuICBtYXhTaXplPzogbnVtYmVyO1xuICBtYXhIaXN0b3J5U2l6ZT86IG51bWJlcjtcbiAgcHJlZmVyQnJpZGdlZE1ldGFkYXRhOiBib29sZWFuO1xuICBwYXVzZU9uRW1wdHk/OiBib29sZWFuO1xuICBkaXNhYmxlVm9sdW1lOiBib29sZWFuO1xuICBkaXNhYmxlRXF1YWxpemVyOiBib29sZWFuO1xuICBkaXNhYmxlRmlsdGVyZXI6IGJvb2xlYW47XG4gIGRpc2FibGVCaXF1YWQ6IGJvb2xlYW47XG4gIGRpc2FibGVSZXNhbXBsZXI6IGJvb2xlYW47XG4gIGRpc2FibGVDb21wcmVzc29yOiBib29sZWFuO1xuICBkaXNhYmxlUmV2ZXJiOiBib29sZWFuO1xuICBkaXNhYmxlU2Vla2VyOiBib29sZWFuO1xuICBkaXNhYmxlRmFsbGJhY2tTdHJlYW06IGJvb2xlYW47XG4gIGVuYWJsZVN0cmVhbUludGVyY2VwdG9yOiBib29sZWFuO1xuICB2ZXJpZnlGYWxsYmFja1N0cmVhbTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWb2ljZUNvbm5lY3RDb25maWcge1xuICBkZWFmPzogYm9vbGVhbjtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgZ3JvdXA/OiBzdHJpbmc7XG4gIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9zdFByb2Nlc3NlZFJlc3VsdCB7XG4gIHN0cmVhbTogUmVhZGFibGU7XG4gIHR5cGU6IFN0cmVhbVR5cGU7XG59XG5cbmV4cG9ydCB0eXBlIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciA9IChcbnRyYWNrOiBUcmFjayxcbnF1ZXJ5VHlwZTogU2VhcmNoUXVlcnlUeXBlLFxucXVldWU6IEd1aWxkUXVldWUpXG49PiBQcm9taXNlPFJlYWRhYmxlIHwgbnVsbD47XG5cbmV4cG9ydCB0eXBlIE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyPFQgPSB1bmtub3duPiA9IChcbnN0cmVhbTogUmVhZGFibGUsXG5xdWV1ZTogR3VpbGRRdWV1ZSxcbnRyYWNrOiBUcmFjazxUPilcbj0+IFByb21pc2U8UG9zdFByb2Nlc3NlZFJlc3VsdCB8IG51bGw+O1xuXG5leHBvcnQgdHlwZSBQbGF5ZXJUcmlnZ2VyZWRSZWFzb24gPSAnZmlsdGVycycgfCAnbm9ybWFsJztcblxuZXhwb3J0IGNvbnN0IEd1aWxkUXVldWVFdmVudCA9IHtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFjayBpcyBhZGRlZCB0byB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tBZGQ6ICdhdWRpb1RyYWNrQWRkJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3Mgd2VyZSBhZGRlZCB0byB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tzQWRkOiAnYXVkaW9UcmFja3NBZGQnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tSZW1vdmU6ICdhdWRpb1RyYWNrUmVtb3ZlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3MgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICovXG4gIEF1ZGlvVHJhY2tzUmVtb3ZlOiAnYXVkaW9UcmFja3NSZW1vdmUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyBjcmVhdGVkXG4gICAqL1xuICBDb25uZWN0aW9uOiAnY29ubmVjdGlvbicsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSB2b2ljZSBjb25uZWN0aW9uIGlzIGRlc3Ryb3llZFxuICAgKi9cbiAgQ29ubmVjdGlvbkRlc3Ryb3llZDogJ2Nvbm5lY3Rpb25EZXN0cm95ZWQnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBib3QgaXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIGNoYW5uZWxcbiAgICovXG4gIERpc2Nvbm5lY3Q6ICdkaXNjb25uZWN0JyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgc2VuZHMgYSBkZWJ1ZyBpbmZvXG4gICAqL1xuICBEZWJ1ZzogJ2RlYnVnJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgZW5jb3VudGVycyBlcnJvclxuICAgKi9cbiAgRXJyb3I6ICdlcnJvcicsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIGNoYW5uZWwgaXMgZW1wdHlcbiAgICovXG4gIEVtcHR5Q2hhbm5lbDogJ2VtcHR5Q2hhbm5lbCcsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGVtcHR5XG4gICAqL1xuICBFbXB0eVF1ZXVlOiAnZW1wdHlRdWV1ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBzdGFydHMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAqL1xuICBQbGF5ZXJTdGFydDogJ3BsYXllclN0YXJ0JyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGVycm9ycyB3aGlsZSBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICovXG4gIFBsYXllckVycm9yOiAncGxheWVyRXJyb3InLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZmluaXNoZXMgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAqL1xuICBQbGF5ZXJGaW5pc2g6ICdwbGF5ZXJGaW5pc2gnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc2tpcHMgY3VycmVudCB0cmFja1xuICAgKi9cbiAgUGxheWVyU2tpcDogJ3BsYXllclNraXAnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgaXMgdHJpZ2dlcmVkXG4gICAqL1xuICBQbGF5ZXJUcmlnZ2VyOiAncGxheWVyVHJpZ2dlcicsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIHN0YXRlIGlzIHVwZGF0ZWQuIENvbnN1bWluZyB0aGlzIGV2ZW50IG1heSBkaXNhYmxlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgYFBsYXllci5pc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKClgIHJldHVybnMgYGZhbHNlYC5cbiAgICovXG4gIFZvaWNlU3RhdGVVcGRhdGU6ICd2b2ljZVN0YXRlVXBkYXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB2b2x1bWUgaXMgdXBkYXRlZFxuICAgKi9cbiAgVm9sdW1lQ2hhbmdlOiAndm9sdW1lQ2hhbmdlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBwbGF5ZXIgaXMgcGF1c2VkXG4gICAqL1xuICBQbGF5ZXJQYXVzZTogJ3BsYXllclBhdXNlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBwbGF5ZXIgaXMgcmVzdW1lZFxuICAgKi9cbiAgUGxheWVyUmVzdW1lOiAncGxheWVyUmVzdW1lJyxcbiAgLyoqXG4gICAqIEJpcXVhZCBGaWx0ZXJzIFVwZGF0ZVxuICAgKi9cbiAgQmlxdWFkRmlsdGVyc1VwZGF0ZTogJ2JpcXVhZEZpbHRlcnNVcGRhdGUnLFxuICAvKipcbiAgICogRXF1YWxpemVyIFVwZGF0ZVxuICAgKi9cbiAgRXF1YWxpemVyVXBkYXRlOiAnZXF1YWxpemVyVXBkYXRlJyxcbiAgLyoqXG4gICAqIERTUCB1cGRhdGVcbiAgICovXG4gIERTUFVwZGF0ZTogJ2RzcFVwZGF0ZScsXG4gIC8qKlxuICAgKiBBdWRpbyBGaWx0ZXJzIFVwZGF0ZVxuICAgKi9cbiAgQXVkaW9GaWx0ZXJzVXBkYXRlOiAnYXVkaW9GaWx0ZXJzVXBkYXRlJyxcbiAgLyoqXG4gICAqIEF1ZGlvIHBsYXllciB3aWxsIHBsYXkgbmV4dCB0cmFja1xuICAgKi9cbiAgV2lsbFBsYXlUcmFjazogJ3dpbGxQbGF5VHJhY2snLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgdm9pY2UgY2hhbm5lbCBpcyByZXBvcHVsYXRlZFxuICAgKi9cbiAgQ2hhbm5lbFBvcHVsYXRlOiAnY2hhbm5lbFBvcHVsYXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXG4gICAqL1xuICBRdWV1ZUNyZWF0ZTogJ3F1ZXVlQ3JlYXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIGRlbGV0ZWRcbiAgICovXG4gIFF1ZXVlRGVsZXRlOiAncXVldWVEZWxldGUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgdHJ5aW5nIHRvIGFkZCBzaW1pbGFyIHRyYWNrIGZvciBhdXRvcGxheVxuICAgKi9cbiAgV2lsbEF1dG9QbGF5OiAnd2lsbEF1dG9QbGF5JyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBzYW1wbGUgcmF0ZSBpcyB1cGRhdGVkXG4gICAqL1xuICBTYW1wbGVSYXRlVXBkYXRlOiAnc2FtcGxlUmF0ZVVwZGF0ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBuYW1lZCBzYW1wbGUgcmF0ZSBmaWx0ZXIgaXMgdXBkYXRlZFxuICAgKi9cbiAgU2FtcGxlUmF0ZUZpbHRlclVwZGF0ZTogJ3NhbXBsZVJhdGVGaWx0ZXJVcGRhdGUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHJldmVyYiBmaWx0ZXIgaXMgdXBkYXRlZFxuICAgKi9cbiAgUmV2ZXJiVXBkYXRlOiAncmV2ZXJiVXBkYXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBjb21wcmVzc29yIGZpbHRlciBpcyB1cGRhdGVkXG4gICAqL1xuICBDb21wcmVzc29yVXBkYXRlOiAnY29tcHJlc3NvclVwZGF0ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gc2VlayBpcyBwZXJmb3JtZWRcbiAgICovXG4gIFBsYXllclNlZWs6ICdwbGF5ZXJTZWVrJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgR3VpbGRRdWV1ZUV2ZW50ID1cbih0eXBlb2YgR3VpbGRRdWV1ZUV2ZW50KVtrZXlvZiB0eXBlb2YgR3VpbGRRdWV1ZUV2ZW50XTtcblxuZXhwb3J0IGVudW0gVHJhY2tTa2lwUmVhc29uIHtcbiAgTm9TdHJlYW0gPSAnRVJSX05PX1NUUkVBTScsXG4gIE1hbnVhbCA9ICdNQU5VQUwnLFxuICBTRUVLX09WRVJfVEhSRVNIT0xEID0gJ1NFRUtfT1ZFUl9USFJFU0hPTEQnLFxuICBKdW1wID0gJ0pVTVBFRF9UT19BTk9USEVSX1RSQUNLJyxcbiAgU2tpcFRvID0gJ1NLSVBfVE9fQU5PVEhFUl9UUkFDSycsXG4gIEhpc3RvcnlOZXh0ID0gJ0hJU1RPUllfTkVYVF9UUkFDSycsXG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkUXVldWVFdmVudHM8TWV0YSA9IGFueT4ge1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrQWRkXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyB3ZXJlIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrcyBUaGUgdHJhY2tzIGFycmF5XG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tzQWRkXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrW10pXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrUmVtb3ZlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFja1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrc1JlbW92ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFja1tdKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyBjcmVhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5Db25uZWN0aW9uXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyBkZXN0cm95ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkNvbm5lY3Rpb25EZXN0cm95ZWRdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGJvdCBpcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgY2hhbm5lbFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRGlzY29ubmVjdF06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgc2VuZHMgYSBkZWJ1ZyBpbmZvXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZGVidWcgbWVzc2FnZVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5EZWJ1Z106IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIG1lc3NhZ2U6IHN0cmluZylcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgcXVldWUgZW5jb3VudGVycyBlcnJvclxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvclxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5FcnJvcl06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPiwgZXJyb3I6IEVycm9yKSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5FbXB0eUNoYW5uZWxdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGVtcHR5XG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5FbXB0eVF1ZXVlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc3RhcnRzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllclN0YXJ0XTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgZXJyb3JzIHdoaWxlIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvclxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRoYXQgaXMgYmVpbmcgc3RyZWFtZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyRXJyb3JdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBlcnJvcjogRXJyb3IsXG4gIHRyYWNrOiBUcmFjaylcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGZpbmlzaGVzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdhcyBiZWluZyBzdHJlYW1lZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJGaW5pc2hdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICB0cmFjazogVHJhY2spXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBza2lwcyBjdXJyZW50IHRyYWNrXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRoYXQgd2FzIHNraXBwZWRcbiAgICogQHBhcmFtIHJlYXNvbiBUaGUgcmVhc29uIGZvciBza2lwcGluZ1xuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIGZvciBza2lwcGluZ1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJTa2lwXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrLFxuICByZWFzb246IFRyYWNrU2tpcFJlYXNvbixcbiAgZGVzY3JpcHRpb246IHN0cmluZylcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGlzIHRyaWdnZXJlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB3aGljaCB3YXMgcGxheWVkIGluIHRoaXMgZXZlbnRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyVHJpZ2dlcl06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFjayxcbiAgcmVhc29uOiBQbGF5ZXJUcmlnZ2VyZWRSZWFzb24pXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHZvaWNlIHN0YXRlIGlzIHVwZGF0ZWQuIENvbnN1bWluZyB0aGlzIGV2ZW50IG1heSBkaXNhYmxlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgYFBsYXllci5pc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKClgIHJldHVybnMgYGZhbHNlYC5cbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRTdGF0ZSBUaGUgb2xkIHZvaWNlIHN0YXRlXG4gICAqIEBwYXJhbSBuZXdTdGF0ZSBUaGUgbmV3IHZvaWNlIHN0YXRlXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlZvaWNlU3RhdGVVcGRhdGVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRTdGF0ZTogVm9pY2VTdGF0ZSxcbiAgbmV3U3RhdGU6IFZvaWNlU3RhdGUpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyIGlzIHBhdXNlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyUGF1c2VdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyIGlzIHJlc3VtZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllclJlc3VtZV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyBwbGF5ZXIncyB2b2x1bWUgaXMgY2hhbmdlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZFZvbHVtZSBUaGUgb2xkIHZvbHVtZVxuICAgKiBAcGFyYW0gbmV3Vm9sdW1lIFRoZSB1cGRhdGVkIHZvbHVtZVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5Wb2x1bWVDaGFuZ2VdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRWb2x1bWU6IG51bWJlcixcbiAgbmV3Vm9sdW1lOiBudW1iZXIpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gZXF1YWxpemVyIGNvbmZpZyBpcyB1cGRhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5FcXVhbGl6ZXJVcGRhdGVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRGaWx0ZXJzOiBFcXVhbGl6ZXJCYW5kW10sXG4gIG5ld0ZpbHRlcnM6IEVxdWFsaXplckJhbmRbXSlcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBiaXF1YWQgZmlsdGVycyBpcyB1cGRhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5CaXF1YWRGaWx0ZXJzVXBkYXRlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgb2xkRmlsdGVyczogQmlxdWFkRmlsdGVycyB8IG51bGwsXG4gIG5ld0ZpbHRlcnM6IEJpcXVhZEZpbHRlcnMgfCBudWxsKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGRzcCBmaWx0ZXJzIGlzIHVwZGF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkRTUFVwZGF0ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIG9sZEZpbHRlcnM6IFBDTUZpbHRlcnNbXSxcbiAgbmV3RmlsdGVyczogUENNRmlsdGVyc1tdKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGZmbXBlZyBhdWRpbyBmaWx0ZXJzIGlzIHVwZGF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRGaWx0ZXJzIE9sZCBmaWx0ZXJzXG4gICAqIEBwYXJhbSBuZXdGaWx0ZXJzIE5ldyBmaWx0ZXJzXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvRmlsdGVyc1VwZGF0ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIG9sZEZpbHRlcnM6IEZpbHRlcnNOYW1lW10sXG4gIG5ld0ZpbHRlcnM6IEZpbHRlcnNOYW1lW10pXG4gID0+IHVua25vd247XG5cbiAgLyoqXG4gICAqIEVtaXR0ZWQgYmVmb3JlIHN0cmVhbWluZyBhbiBhdWRpbyB0cmFjay4gVGhpcyBldmVudCBjYW4gYmUgdXNlZCB0byBtb2RpZnkgc3RyZWFtIGNvbmZpZyBiZWZvcmUgcGxheWluZyBhIHRyYWNrLlxuICAgKiBMaXN0ZW5pbmcgdG8gdGhpcyBldmVudCB3aWxsIHBhdXNlIHRoZSBleGVjdXRpb24gb2YgYXVkaW8gcGxheWVyIHVudGlsIGBkb25lKClgIGlzIGludm9rZWQuXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRoYXQgd2lsbCBiZSBzdHJlYW1lZFxuICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb25zIGZvciBzdHJlYW1pbmdcbiAgICogQHBhcmFtIGRvbmUgRG9uZSBjYWxsYmFja1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5XaWxsUGxheVRyYWNrXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrPHVua25vd24+LFxuICBjb25maWc6IFN0cmVhbUNvbmZpZyxcbiAgZG9uZTogKCkgPT4gdm9pZClcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHZvaWNlIGNoYW5uZWwgaXMgcG9wdWxhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5DaGFubmVsUG9wdWxhdGVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUXVldWVDcmVhdGVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyBzdWNjZXNzZnVsbHkgZGVsZXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUXVldWVEZWxldGVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyB0cnlpbmcgdG8gYWRkIHNpbWlsYXIgdHJhY2sgZm9yIGF1dG9wbGF5XG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gdHJhY2tzIFRoZSBzaW1pbGFyIHRyYWNrcyB0aGF0IHdlcmUgZm91bmRcbiAgICogQHBhcmFtIGRvbmUgRG9uZSBjYWxsYmFja1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5XaWxsQXV0b1BsYXldOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICB0cmFja3M6IFRyYWNrW10sXG4gIGRvbmU6ICh0cmFjazogVHJhY2sgfCBudWxsKSA9PiB2b2lkKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHNhbXBsZSByYXRlIGlzIHVwZGF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRSYXRlIFRoZSBvbGQgc2FtcGxlIHJhdGVcbiAgICogQHBhcmFtIG5ld1JhdGUgVGhlIG5ldyBzYW1wbGUgcmF0ZVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5TYW1wbGVSYXRlVXBkYXRlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgb2xkUmF0ZTogbnVtYmVyLFxuICBuZXdSYXRlOiBudW1iZXIpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBuYW1lZCBzYW1wbGUgcmF0ZSBmaWx0ZXIgaXMgdXBkYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZFJhdGUgVGhlIG9sZCBzYW1wbGUgcmF0ZSBmaWx0ZXJcbiAgICogQHBhcmFtIG5ld1JhdGUgVGhlIG5ldyBzYW1wbGUgcmF0ZSBmaWx0ZXJcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuU2FtcGxlUmF0ZUZpbHRlclVwZGF0ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIG9sZEZpbHRlcjogQ29tbW9uUmVzYW1wbGVyRmlsdGVyUHJlc2V0IHwgbnVsbCxcbiAgbmV3RmlsdGVyOiBDb21tb25SZXNhbXBsZXJGaWx0ZXJQcmVzZXQgfCBudWxsKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHJldmVyYiBmaWx0ZXIgaXMgdXBkYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZEZpbHRlciBUaGUgb2xkIHJldmVyYiBmaWx0ZXJcbiAgICogQHBhcmFtIG5ld0ZpbHRlciBUaGUgbmV3IHJldmVyYiBmaWx0ZXJcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUmV2ZXJiVXBkYXRlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgb2xkRmlsdGVyOiBSZXZlcmJQYXJhbWV0ZXJzIHwgbnVsbCxcbiAgbmV3RmlsdGVyOiBSZXZlcmJQYXJhbWV0ZXJzIHwgbnVsbClcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBjb21wcmVzc29yIGZpbHRlciBpcyB1cGRhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkRmlsdGVyIFRoZSBvbGQgY29tcHJlc3NvciBmaWx0ZXJcbiAgICogQHBhcmFtIG5ld0ZpbHRlciBUaGUgbmV3IGNvbXByZXNzb3IgZmlsdGVyXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkNvbXByZXNzb3JVcGRhdGVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRGaWx0ZXI6IENvbXByZXNzb3JQYXJhbWV0ZXJzIHwgbnVsbCxcbiAgbmV3RmlsdGVyOiBDb21wcmVzc29yUGFyYW1ldGVycyB8IG51bGwpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gc2VlayBpcyBwZXJmb3JtZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgc2VlayBwb3NpdGlvblxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJTZWVrXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgcGFyYW1ldGVyczogU2Vla2VyUGFyYW1ldGVycylcbiAgPT4gdW5rbm93bjtcbn1cblxuLyoqXG4gKiBUaGUgcXVldWUgcmVwZWF0IG1vZGUuIFRoaXMgY2FuIGJlIG9uZSBvZjpcbiAqIC0gT0ZGXG4gKiAtIFRSQUNLXG4gKiAtIFFVRVVFXG4gKiAtIEFVVE9QTEFZXG4gKi9cbmV4cG9ydCBjb25zdCBRdWV1ZVJlcGVhdE1vZGUgPSB7XG4gIC8qKlxuICAgKiBEaXNhYmxlIHJlcGVhdCBtb2RlLlxuICAgKi9cbiAgT0ZGOiAwLFxuICAvKipcbiAgICogUmVwZWF0IHRoZSBjdXJyZW50IHRyYWNrLlxuICAgKi9cbiAgVFJBQ0s6IDEsXG4gIC8qKlxuICAgKiBSZXBlYXQgdGhlIGVudGlyZSBxdWV1ZS5cbiAgICovXG4gIFFVRVVFOiAyLFxuICAvKipcbiAgICogV2hlbiBsYXN0IHRyYWNrIGVuZHMsIHBsYXkgc2ltaWxhciB0cmFja3MgaW4gdGhlIGZ1dHVyZSBpZiBxdWV1ZSBpcyBlbXB0eS5cbiAgICovXG4gIEFVVE9QTEFZOiAzXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBRdWV1ZVJlcGVhdE1vZGUgPVxuKHR5cGVvZiBRdWV1ZVJlcGVhdE1vZGUpW2tleW9mIHR5cGVvZiBRdWV1ZVJlcGVhdE1vZGVdO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWU8TWV0YSA9IGFueT4ge1xuICAjdHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAjZGVsZXRlZCA9IGZhbHNlO1xuICAjc2h1ZmZsZSA9IGZhbHNlO1xuICBwcml2YXRlIF9fY3VycmVudDogVHJhY2sgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIHRyYWNrczogUXVldWU8VHJhY2s+O1xuICBwdWJsaWMgaGlzdG9yeSA9IG5ldyBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhPih0aGlzKTtcbiAgcHVibGljIGRpc3BhdGNoZXI6IFN0cmVhbURpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIG5vZGUgPSBuZXcgR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YT4odGhpcyk7XG4gIHB1YmxpYyBmaWx0ZXJzID0gbmV3IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4odGhpcyk7XG4gIHB1YmxpYyBvbkJlZm9yZUNyZWF0ZVN0cmVhbTogT25CZWZvcmVDcmVhdGVTdHJlYW1IYW5kbGVyID0gYXN5bmMgKCkgPT4gbnVsbDtcbiAgcHVibGljIG9uQWZ0ZXJDcmVhdGVTdHJlYW06IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyID0gYXN5bmMgKHN0cmVhbSkgPT4gKHtcbiAgICBzdHJlYW0sXG4gICAgdHlwZTogU3RyZWFtVHlwZS5SYXdcbiAgfSk7XG4gIHB1YmxpYyByZXBlYXRNb2RlOiBRdWV1ZVJlcGVhdE1vZGUgPSBRdWV1ZVJlcGVhdE1vZGUuT0ZGO1xuICBwdWJsaWMgdGltZW91dHMgPSBuZXcgQ29sbGVjdGlvbjxzdHJpbmcsIE5vZGVKUy5UaW1lb3V0PigpO1xuICBwdWJsaWMgc3RhdHMgPSBuZXcgR3VpbGRRdWV1ZVN0YXRpc3RpY3M8TWV0YT4odGhpcyk7XG4gIHB1YmxpYyB0YXNrc1F1ZXVlID0gbmV3IEFzeW5jUXVldWUoKTtcbiAgcHVibGljIHN5bmNlZEx5cmljc1Byb3ZpZGVyID0gbmV3IFN5bmNlZEx5cmljc1Byb3ZpZGVyKHRoaXMpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgcHVibGljIHBsYXllcjogUGxheWVyLFxuICBwdWJsaWMgb3B0aW9uczogR3VpbGROb2RlSW5pdDxNZXRhPilcbiAge1xuICAgIHRoaXMudHJhY2tzID0gbmV3IFF1ZXVlPFRyYWNrPihvcHRpb25zLnF1ZXVlU3RyYXRlZ3kpO1xuICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0pKVxuICAgIHRoaXMub25CZWZvcmVDcmVhdGVTdHJlYW0gPSBvcHRpb25zLm9uQmVmb3JlQ3JlYXRlU3RyZWFtO1xuICAgIGlmIChUeXBlVXRpbC5pc0Z1bmN0aW9uKG9wdGlvbnMub25BZnRlckNyZWF0ZVN0cmVhbSkpXG4gICAgdGhpcy5vbkFmdGVyQ3JlYXRlU3RyZWFtID0gb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtO1xuICAgIGlmICghVHlwZVV0aWwuaXNOdWxsaXNoKG9wdGlvbnMucmVwZWF0TW9kZSkpXG4gICAgdGhpcy5yZXBlYXRNb2RlID0gb3B0aW9ucy5yZXBlYXRNb2RlO1xuXG4gICAgb3B0aW9ucy5zZWxmRGVhZiA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLm1heFNpemUgPz89IEluZmluaXR5O1xuICAgIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz89IEluZmluaXR5O1xuICAgIG9wdGlvbnMucGF1c2VPbkVtcHR5ID8/PSB0cnVlO1xuXG4gICAgaWYgKFxuICAgICFUeXBlVXRpbC5pc051bGxpc2godGhpcy5vcHRpb25zLmJpcXVhZCkgJiZcbiAgICAhVHlwZVV0aWwuaXNCb29sZWFuKHRoaXMub3B0aW9ucy5iaXF1YWQpKVxuICAgIHtcbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgPSB0aGlzLm9wdGlvbnMuYmlxdWFkO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5lcXVhbGl6ZXIpKSB7XG4gICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyID0gdGhpcy5vcHRpb25zLmVxdWFsaXplcjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMuZmlsdGVyZXIpKSB7XG4gICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyA9IHRoaXMub3B0aW9ucy5maWx0ZXJlcjtcbiAgICB9XG5cbiAgICBpZiAoVHlwZVV0aWwuaXNOdW1iZXIodGhpcy5vcHRpb25zLnJlc2FtcGxlcikpIHtcbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5zYW1wbGVSYXRlID0gdGhpcy5vcHRpb25zLnJlc2FtcGxlcjtcbiAgICB9XG5cbiAgICBpZiAoVHlwZVV0aWwuaXNBcnJheSh0aGlzLm9wdGlvbnMuZmZtcGVnRmlsdGVycykpIHtcbiAgICAgIHRoaXMuZmlsdGVycy5mZm1wZWcuc2V0RGVmYXVsdHModGhpcy5vcHRpb25zLmZmbXBlZ0ZpbHRlcnMpO1xuICAgIH1cblxuICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIob3B0aW9ucy5tYXhTaXplKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoXG4gICAgICAgICdbR3VpbGROb2RlSW5pdC5tYXhTaXplXScsXG4gICAgICAgICdudW1iZXInLFxuICAgICAgICB0eXBlb2Ygb3B0aW9ucy5tYXhTaXplXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIob3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgICAnW0d1aWxkTm9kZUluaXQubWF4SGlzdG9yeVNpemVdJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgIHR5cGVvZiBvcHRpb25zLm1heEhpc3RvcnlTaXplXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm1heFNpemUgPCAxKSBvcHRpb25zLm1heFNpemUgPSBJbmZpbml0eTtcbiAgICBpZiAob3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA8IDEpIG9wdGlvbnMubWF4SGlzdG9yeVNpemUgPSBJbmZpbml0eTtcblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgR3VpbGRRdWV1ZSBpbml0aWFsaXplZCBmb3IgZ3VpbGQgJHt0aGlzLm9wdGlvbnMuZ3VpbGQubmFtZX0gKElEOiAke3RoaXMub3B0aW9ucy5ndWlsZC5pZH0pYFxuICAgICk7XG4gICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5RdWV1ZUNyZWF0ZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHF1ZXVlIGNhbiBpbnRlcmNlcHQgc3RyZWFtc1xuICAgKi9cbiAgcHVibGljIGNhbkludGVyY2VwdCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmVuYWJsZVN0cmVhbUludGVyY2VwdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlZCBkdXJhdGlvbiBvZiB0aGlzIHF1ZXVlIGluIG1zXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zdG9yZS5yZWR1Y2UoKGEsIGMpID0+IGEgKyBjLmR1cmF0aW9uTVMsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHRlZCBkdXJhdGlvbiBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGR1cmF0aW9uRm9ybWF0dGVkKCkge1xuICAgIHJldHVybiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRoaXMuZXN0aW1hdGVkRHVyYXRpb24pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc3luYyBseXJpY3MgcHJvdmlkZXIgZm9yIHRoaXMgcXVldWUuXG4gICAqIEBleGFtcGxlIGNvbnN0IGx5cmljcyA9IGF3YWl0IHBsYXllci5seXJpY3Muc2VhcmNoKHsgcTogJ0FsYW4gV2Fsa2VyIEZhZGVkJyB9KTtcbiAgICogY29uc3Qgc3luY2VkTHlyaWNzID0gcXVldWUuc3luY2VkTHlyaWNzKGx5cmljc1swXSk7XG4gICAqIGNvbnNvbGUubG9nKHN5bmNlZEx5cmljcy5hdCgxMF8wMDApKTtcbiAgICogLy8gc3Vic2NyaWJlIHRvIGx5cmljcyBjaGFuZ2VcbiAgICogY29uc3QgdW5zdWJzY3JpYmUgPSBzeW5jZWRMeXJpY3Mub25DaGFuZ2UoKGx5cmljcywgdGltZXN0YW1wKSA9PiB7XG4gICAqICAgIGNvbnNvbGUubG9nKGx5cmljcywgdGltZXN0YW1wKTtcbiAgICogfSk7XG4gICAqIC8vIHVuc3Vic2NyaWJlIGZyb20gbHlyaWNzIGNoYW5nZVxuICAgKiB1bnN1YnNjcmliZSgpOyAvLyBvclxuICAgKiBzeW5jZWRMeXJpY3MudW5zdWJzY3JpYmUoKTtcbiAgICovXG4gIHB1YmxpYyBzeW5jZWRMeXJpY3MobHlyaWNzOiBMcmNHZXRSZXN1bHQgfCBMcmNTZWFyY2hSZXN1bHQpIHtcbiAgICB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyLmxvYWQobHlyaWNzPy5zeW5jZWRMeXJpY3MgPz8gJycpO1xuICAgIHJldHVybiB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlIGEgZGVidWcgbWVzc2FnZSB0byB0aGlzIHF1ZXVlXG4gICAqIEBwYXJhbSBtIFRoZSBtZXNzYWdlIHRvIHdyaXRlXG4gICAqL1xuICBwdWJsaWMgZGVidWcobTogc3RyaW5nKSB7XG4gICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5EZWJ1ZywgdGhpcywgbSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1ldGFkYXRhIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgbWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tZXRhZGF0YSE7XG4gIH1cblxuICBwdWJsaWMgc2V0IG1ldGFkYXRhKG06IE1ldGEpIHtcbiAgICB0aGlzLm9wdGlvbnMubWV0YWRhdGEgPSBtO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBtZXRhZGF0YSBmb3IgdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gbSBNZXRhZGF0YSB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRNZXRhZGF0YShtOiBNZXRhKSB7XG4gICAgdGhpcy5vcHRpb25zLm1ldGFkYXRhID0gbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgY3VycmVudCB0cmFjayBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRUcmFjaygpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5tZXRhZGF0YSB8fCB0aGlzLl9fY3VycmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBxdWV1ZSB3YXMgZGVsZXRlZCBwcmV2aW91c2x5XG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlbGV0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2RlbGV0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZvaWNlIGNoYW5uZWwgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBjaGFubmVsKCkge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LmNoYW5uZWwgfHwgbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgY2hhbm5lbChjOiBWb2ljZUJhc2VkQ2hhbm5lbCB8IG51bGwpIHtcbiAgICBpZiAodGhpcy5kaXNwYXRjaGVyKSB7XG4gICAgICBpZiAoYykge1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuY2hhbm5lbCA9IGM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRlbGV0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvbiBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbm5lY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8udm9pY2VDb25uZWN0aW9uIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGd1aWxkIHRoaXMgcXVldWUgYmVsb25ncyB0b1xuICAgKi9cbiAgcHVibGljIGdldCBndWlsZCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmd1aWxkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmd1aWxkLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0cmFuc2l0aW9uIG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZSB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRUcmFuc2l0aW9uaW5nKHN0YXRlOiBib29sZWFuKSB7XG4gICAgdGhpcy4jdHJhbnNpdGlvbmluZyA9IHN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIGlmIHRoaXMgcXVldWUgaXMgY3VycmVudGx5IHVuZGVyIHRyYW5zaXRpb24gbW9kZVxuICAgKi9cbiAgcHVibGljIGlzVHJhbnNpdGlvbmluZygpIHtcbiAgICByZXR1cm4gdGhpcy4jdHJhbnNpdGlvbmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcmVwZWF0IG1vZGUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIG1vZGUgVGhlIHJlcGVhdCBtb2RlIHRvIGFwcGx5XG4gICAqL1xuICBwdWJsaWMgc2V0UmVwZWF0TW9kZShtb2RlOiBRdWV1ZVJlcGVhdE1vZGUpIHtcbiAgICB0aGlzLnJlcGVhdE1vZGUgPSBtb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1heCBzaXplIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4U2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1heFNpemUgPz8gSW5maW5pdHk7XG4gIH1cblxuICAvKipcbiAgICogTWF4IHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldE1heFNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWF4U2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXRTaXplKCkge1xuICAgIHJldHVybiB0aGlzLnNpemU7XG4gIH1cblxuICAvKipcbiAgICogTWF4IGhpc3Rvcnkgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heEhpc3RvcnlTaXplKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWF4SGlzdG9yeVNpemUgPz8gSW5maW5pdHk7XG4gIH1cblxuICAvKipcbiAgICogTWF4IGhpc3Rvcnkgc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0TWF4SGlzdG9yeVNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMubWF4SGlzdG9yeVNpemU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG1heCBoaXN0b3J5IHNpemUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgdG8gc2V0XG4gICAqL1xuICBwdWJsaWMgc2V0TWF4SGlzdG9yeVNpemUoc2l6ZTogbnVtYmVyKSB7XG4gICAgaWYgKCFUeXBlVXRpbC5pc051bWJlcihzaXplKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoJ3NpemUnLCAnbnVtYmVyJywgdHlwZW9mIHNpemUpO1xuICAgIH1cblxuICAgIGlmIChzaXplIDwgMSkgc2l6ZSA9IEluZmluaXR5O1xuXG4gICAgdGhpcy5vcHRpb25zLm1heEhpc3RvcnlTaXplID0gc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWF4IHNpemUgZm9yIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHNpemUgVGhlIHNpemUgdG8gc2V0XG4gICAqL1xuICBwdWJsaWMgc2V0TWF4U2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICBpZiAoIVR5cGVVdGlsLmlzTnVtYmVyKHNpemUpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcignc2l6ZScsICdudW1iZXInLCB0eXBlb2Ygc2l6ZSk7XG4gICAgfVxuXG4gICAgaWYgKHNpemUgPCAxKSBzaXplID0gSW5maW5pdHk7XG5cbiAgICB0aGlzLm9wdGlvbnMubWF4U2l6ZSA9IHNpemU7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMudHJhY2tzLmNsZWFyKCk7XG4gICAgdGhpcy5oaXN0b3J5LmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhpcyBxdWV1ZSBoYXMgbm8gdHJhY2tzIGxlZnQgaW4gaXRcbiAgICovXG4gIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplIDwgMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGlzIGZ1bGxcbiAgICovXG4gIHB1YmxpYyBpc0Z1bGwoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemUgPj0gdGhpcy5tYXhTaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBxdWV1ZSBjYXBhY2l0eVxuICAgKi9cbiAgcHVibGljIGdldENhcGFjaXR5KCkge1xuICAgIGlmICh0aGlzLmlzRnVsbCgpKSByZXR1cm4gMDtcbiAgICBjb25zdCBjYXAgPSB0aGlzLm1heFNpemUgLSB0aGlzLnNpemU7XG4gICAgcmV0dXJuIGNhcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGN1cnJlbnRseSBob2xkcyBhY3RpdmUgYXVkaW8gcmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyBpc1BsYXlpbmcoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZSAhPSBudWxsICYmXG4gICAgICAhdGhpcy5kaXNwYXRjaGVyLmF1ZGlvUmVzb3VyY2UuZW5kZWQpO1xuXG4gIH1cblxuICAvKipcbiAgICogQWRkIHRyYWNrIHRvIHRoZSBxdWV1ZS4gVGhpcyB3aWxsIGVtaXQgYGF1ZGlvVHJhY2tzQWRkYCB3aGVuIG11bHRpcGxlIHRyYWNrcyBhcmUgYWRkZWQsIG90aGVyd2lzZSBgYXVkaW9UcmFja0FkZGAuXG4gICAqIEBwYXJhbSB0cmFjayBUcmFjayBvciBwbGF5bGlzdCBvciBhcnJheSBvZiB0cmFja3MgdG8gYWRkXG4gICAqL1xuICBwdWJsaWMgYWRkVHJhY2sodHJhY2s6IFRyYWNrIHwgVHJhY2tbXSB8IFBsYXlsaXN0KSB7XG4gICAgY29uc3QgdG9BZGQgPSB0cmFjayBpbnN0YW5jZW9mIFBsYXlsaXN0ID8gdHJhY2sudHJhY2tzIDogdHJhY2s7XG4gICAgY29uc3QgaXNNdWx0aSA9IEFycmF5LmlzQXJyYXkodG9BZGQpO1xuXG4gICAgVkFMSURBVEVfUVVFVUVfQ0FQKHRoaXMsIHRvQWRkKTtcblxuICAgIHRoaXMudHJhY2tzLmFkZCh0b0FkZCk7XG5cbiAgICBpZiAoaXNNdWx0aSkge1xuICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrc0FkZCwgdGhpcywgdG9BZGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tBZGQsIHRoaXMsIHRvQWRkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgdHJhY2sgZnJvbSBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlbW92ZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZVRyYWNrKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLnJlbW92ZSh0cmFjayk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGVuZHMgYSB0cmFjayBvciB0cmFjayByZXNvbHZhYmxlIHRvIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHJlc29sdmFibGUgdG8gaW5zZXJ0XG4gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggdG8gaW5zZXJ0IHRoZSB0cmFjayBhdCAoZGVmYXVsdHMgdG8gMCkuIElmID4gMCwgdGhlIGluc2VydGVkIHRyYWNrIHdpbGwgYmUgcGxhY2VkIGJlZm9yZSB0aGUgdHJhY2sgYXQgdGhlIGdpdmVuIGluZGV4LlxuICAgKi9cbiAgcHVibGljIHByZXBlbmQodHJhY2s6IFRyYWNrIHwgUXVldWU8VHJhY2s+IHwgQXJyYXk8VHJhY2s+LCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gdGhpcy50cmFja3Muc2l6ZSkge1xuICAgICAgdGhyb3cgbmV3IE91dE9mUmFuZ2VFcnJvcihcbiAgICAgICAgJ2luZGV4JyxcbiAgICAgICAgYCR7aW5kZXh9YCxcbiAgICAgICAgJzAnLFxuICAgICAgICBgJHt0aGlzLnRyYWNrcy5zaXplfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY291bnQgPSBBcnJheS5pc0FycmF5KHRyYWNrKSA/XG4gICAgdHJhY2subGVuZ3RoIDpcbiAgICB0cmFjayBpbnN0YW5jZW9mIFF1ZXVlID9cbiAgICB0cmFjay5zaXplIDpcbiAgICAxO1xuXG4gICAgVkFMSURBVEVfUVVFVUVfQ0FQKHRoaXMsIGNvdW50KTtcblxuICAgIGNvbnN0IGluc2VydGlvbkluZGV4ID0gaW5kZXggPT09IDAgPyAwIDogaW5kZXggLSAxO1xuXG4gICAgaWYgKHRyYWNrIGluc3RhbmNlb2YgVHJhY2spIHtcbiAgICAgIHRoaXMubm9kZS5pbnNlcnQodHJhY2ssIGluc2VydGlvbkluZGV4KTtcbiAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja0FkZCwgdGhpcywgdHJhY2spO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrcyA9IHRyYWNrIGluc3RhbmNlb2YgUXVldWUgPyB0cmFjay5zdG9yZSA6IHRyYWNrO1xuXG4gICAgdGhpcy50cmFja3Muc3RvcmUuc3BsaWNlKGluc2VydGlvbkluZGV4LCAwLCAuLi50cmFja3MpO1xuXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMubm9FbWl0SW5zZXJ0KSB7XG4gICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tzQWRkLCB0aGlzLCB0cmFja3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGEgdHJhY2sgb3IgdHJhY2sgcmVzb2x2YWJsZSB0byB0aGUgcXVldWVcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayByZXNvbHZhYmxlIHRvIGluc2VydFxuICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IHRvIGluc2VydCB0aGUgdHJhY2sgYXQgKGRlZmF1bHRzIHRvIDApLiBJZiA+IDAsIHRoZSBpbnNlcnRlZCB0cmFjayB3aWxsIGJlIHBsYWNlZCBhZnRlciB0aGUgdHJhY2sgYXQgdGhlIGdpdmVuIGluZGV4LlxuICAgKi9cbiAgcHVibGljIGFwcGVuZCh0cmFjazogVHJhY2sgfCBRdWV1ZTxUcmFjaz4gfCBBcnJheTxUcmFjaz4sIGluZGV4ID0gMCk6IHZvaWQge1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiB0aGlzLnRyYWNrcy5zaXplKSB7XG4gICAgICB0aHJvdyBuZXcgT3V0T2ZSYW5nZUVycm9yKFxuICAgICAgICAnaW5kZXgnLFxuICAgICAgICBgJHtpbmRleH1gLFxuICAgICAgICAnMCcsXG4gICAgICAgIGAke3RoaXMudHJhY2tzLnNpemV9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb3VudCA9IEFycmF5LmlzQXJyYXkodHJhY2spID9cbiAgICB0cmFjay5sZW5ndGggOlxuICAgIHRyYWNrIGluc3RhbmNlb2YgUXVldWUgP1xuICAgIHRyYWNrLnNpemUgOlxuICAgIDE7XG5cbiAgICBWQUxJREFURV9RVUVVRV9DQVAodGhpcywgY291bnQpO1xuXG4gICAgaWYgKHRyYWNrIGluc3RhbmNlb2YgVHJhY2spIHtcbiAgICAgIHRoaXMubm9kZS5pbnNlcnQodHJhY2ssIGluZGV4KTtcbiAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja0FkZCwgdGhpcywgdHJhY2spO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrcyA9IHRyYWNrIGluc3RhbmNlb2YgUXVldWUgPyB0cmFjay5zdG9yZSA6IHRyYWNrO1xuXG4gICAgdGhpcy50cmFja3Muc3RvcmUuc3BsaWNlKGluZGV4LCAwLCAuLi50cmFja3MpO1xuXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMubm9FbWl0SW5zZXJ0KSB7XG4gICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tzQWRkLCB0aGlzLCB0cmFja3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnRzIHRoZSB0cmFjayB0byB0aGUgZ2l2ZW4gaW5kZXhcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBpbnNlcnRcbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB0byBpbnNlcnQgdGhlIHRyYWNrIGF0IChkZWZhdWx0cyB0byAwKVxuICAgKi9cbiAgcHVibGljIGluc2VydFRyYWNrKHRyYWNrOiBUcmFjaywgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubm9kZS5pbnNlcnQodHJhY2ssIGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gbW92ZVxuICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIG1vdmUgdG9cbiAgICovXG4gIHB1YmxpYyBtb3ZlVHJhY2sodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSwgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubm9kZS5tb3ZlKHRyYWNrLCBpbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogQ29weSBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gY2xvbmVcbiAgICogQHBhcmFtIHRvIFRoZSBwb3NpdGlvbiB0byBjbG9uZSBhdFxuICAgKi9cbiAgcHVibGljIGNvcHlUcmFjayh0cmFjazogVHJhY2tSZXNvbHZhYmxlLCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLmNvcHkodHJhY2ssIGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2FwIHR3byB0cmFja3MgaW4gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBzcmMgVGhlIGZpcnN0IHRyYWNrIHRvIHN3YXBcbiAgICogQHBhcmFtIGRlc3QgVGhlIHNlY29uZCB0cmFjayB0byBzd2FwXG4gICAqL1xuICBwdWJsaWMgc3dhcFRyYWNrcyhzcmM6IFRyYWNrUmVzb2x2YWJsZSwgZGVzdDogVHJhY2tSZXNvbHZhYmxlKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubm9kZS5zd2FwKHNyYywgZGVzdCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHN0cmVhbSBkaXNwYXRjaGVyIGZyb20gdGhlIGdpdmVuIGNvbm5lY3Rpb25cbiAgICogQHBhcmFtIGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24gdG8gdXNlXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlRGlzcGF0Y2hlcihcbiAgY29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uLFxuICBvcHRpb25zOiBQaWNrPFZvaWNlQ29ubmVjdENvbmZpZywgJ2F1ZGlvUGxheWVyJyB8ICd0aW1lb3V0Jz4gPSB7fSlcbiAge1xuICAgIGlmIChjb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCkge1xuICAgICAgdGhyb3cgbmV3IFZvaWNlQ29ubmVjdGlvbkRlc3Ryb3llZEVycm9yKCk7XG4gICAgfVxuXG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucGxheWVyLmNsaWVudC5jaGFubmVscy5jYWNoZS5nZXQoXG4gICAgICBjb25uZWN0aW9uLmpvaW5Db25maWcuY2hhbm5lbElkIVxuICAgICk7XG4gICAgaWYgKCFjaGFubmVsKSB0aHJvdyBuZXcgTm9Wb2ljZUNoYW5uZWxFcnJvcigpO1xuICAgIGlmICghY2hhbm5lbC5pc1ZvaWNlQmFzZWQoKSlcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICdjaGFubmVsJyxcbiAgICAgIGBWb2ljZUJhc2VkQ2hhbm5lbCAodHlwZSAke0NoYW5uZWxUeXBlLkd1aWxkVm9pY2V9LyR7Q2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlfSlgLFxuICAgICAgU3RyaW5nKGNoYW5uZWw/LnR5cGUpXG4gICAgKTtcblxuICAgIGlmICh0aGlzLmRpc3BhdGNoZXIpIHtcbiAgICAgIHRoaXMuI3JlbW92ZUxpc3RlbmVycyh0aGlzLmRpc3BhdGNoZXIpO1xuICAgICAgdGhpcy5kaXNwYXRjaGVyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5kaXNwYXRjaGVyID0gbmV3IFN0cmVhbURpc3BhdGNoZXIoXG4gICAgICBjb25uZWN0aW9uLFxuICAgICAgY2hhbm5lbCxcbiAgICAgIHRoaXMsXG4gICAgICBvcHRpb25zLnRpbWVvdXQgPz8gdGhpcy5vcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0LFxuICAgICAgb3B0aW9ucy5hdWRpb1BsYXllclxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ29ubmVjdCB0byBhIHZvaWNlIGNoYW5uZWxcbiAgICogQHBhcmFtIGNoYW5uZWxSZXNvbHZhYmxlIFRoZSB2b2ljZSBjaGFubmVsIHRvIGNvbm5lY3QgdG9cbiAgICogQHBhcmFtIG9wdGlvbnMgSm9pbiBjb25maWdcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjb25uZWN0KFxuICBjaGFubmVsUmVzb2x2YWJsZTogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICBvcHRpb25zOiBWb2ljZUNvbm5lY3RDb25maWcgPSB7fSlcbiAge1xuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLnBsYXllci5jbGllbnQuY2hhbm5lbHMucmVzb2x2ZShjaGFubmVsUmVzb2x2YWJsZSk7XG4gICAgaWYgKCFjaGFubmVsIHx8ICFjaGFubmVsLmlzVm9pY2VCYXNlZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICAgJ2NoYW5uZWwnLFxuICAgICAgICBgVm9pY2VCYXNlZENoYW5uZWwgKHR5cGUgJHtDaGFubmVsVHlwZS5HdWlsZFZvaWNlfS8ke0NoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZX0pYCxcbiAgICAgICAgU3RyaW5nKGNoYW5uZWw/LnR5cGUpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgQ29ubmVjdGluZyB0byAke1xuICAgICAgY2hhbm5lbC50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2UgPyAnc3RhZ2UnIDogJ3ZvaWNlJ30gY2hhbm5lbCAke1xuICAgICAgY2hhbm5lbC5uYW1lfSAoSUQ6ICR7Y2hhbm5lbC5pZH0pYFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5kaXNwYXRjaGVyICYmIGNoYW5uZWwuaWQgIT09IHRoaXMuZGlzcGF0Y2hlci5jaGFubmVsLmlkKSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRGVzdHJveWluZyBvbGQgY29ubmVjdGlvbicpO1xuICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3BhdGNoZXIgPSBhd2FpdCB0aGlzLnBsYXllci52b2ljZVV0aWxzLmNvbm5lY3QoY2hhbm5lbCwge1xuICAgICAgZGVhZjogb3B0aW9ucy5kZWFmID8/IHRoaXMub3B0aW9ucy5zZWxmRGVhZiA/PyB0cnVlLFxuICAgICAgbWF4VGltZTogb3B0aW9ucz8udGltZW91dCA/PyB0aGlzLm9wdGlvbnMuY29ubmVjdGlvblRpbWVvdXQgPz8gMTIwXzAwMCxcbiAgICAgIHF1ZXVlOiB0aGlzLFxuICAgICAgYXVkaW9QbGF5ZXI6IG9wdGlvbnM/LmF1ZGlvUGxheWVyLFxuICAgICAgZ3JvdXA6IG9wdGlvbnMuZ3JvdXAgPz8gdGhpcy5wbGF5ZXIuY2xpZW50LnVzZXI/LmlkXG4gICAgfSk7XG5cbiAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkNvbm5lY3Rpb24sIHRoaXMpO1xuXG4gICAgaWYgKHRoaXMuY2hhbm5lbCEudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlKSB7XG4gICAgICBhd2FpdCB0aGlzLmNoYW5uZWwhLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldFN1cHByZXNzZWQoZmFsc2UpLmNhdGNoKFxuICAgICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2hhbm5lbCEuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsoXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICAgKS5jYXRjaChVdGlsLm5vb3ApO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuI2F0dGFjaExpc3RlbmVycyh0aGlzLmRpc3BhdGNoZXIpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIHNodWZmbGUgbW9kZSBmb3IgdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gZHluYW1pYyBXaGV0aGVyIHRvIHNodWZmbGUgdGhlIHF1ZXVlIGR5bmFtaWNhbGx5LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqIER5bmFtaWMgc2h1ZmZsaW5nIHdpbGwgc2h1ZmZsZSB0aGUgcXVldWUgd2hlbiB0aGUgY3VycmVudCB0cmFjayBlbmRzLCB3aXRob3V0IG11dGF0aW5nIHRoZSBxdWV1ZS5cbiAgICogSWYgc2V0IHRvIGBmYWxzZWAsIHRoZSBxdWV1ZSB3aWxsIGJlIHNodWZmbGVkIGltbWVkaWF0ZWx5IGluLXBsYWNlLCB3aGljaCBjYW5ub3QgYmUgdW5kb25lLlxuICAgKi9cbiAgcHVibGljIGVuYWJsZVNodWZmbGUoZHluYW1pYyA9IHRydWUpIHtcbiAgICBpZiAoIWR5bmFtaWMpIHtcbiAgICAgIHRoaXMudHJhY2tzLnNodWZmbGUoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuI3NodWZmbGUgPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGUgc2h1ZmZsZSBtb2RlIGZvciB0aGlzIHF1ZXVlLlxuICAgKi9cbiAgcHVibGljIGRpc2FibGVTaHVmZmxlKCkge1xuICAgIHRoaXMuI3NodWZmbGUgPSBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgc2h1ZmZsZSBtb2RlIGZvciB0aGlzIHF1ZXVlLlxuICAgKiBAcGFyYW0gZHluYW1pYyBXaGV0aGVyIHRvIHNodWZmbGUgdGhlIHF1ZXVlIGR5bmFtaWNhbGx5LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgc2h1ZmZsZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLlxuICAgKi9cbiAgcHVibGljIHRvZ2dsZVNodWZmbGUoZHluYW1pYyA9IHRydWUpIHtcbiAgICBpZiAoZHluYW1pYykge1xuICAgICAgdGhpcy4jc2h1ZmZsZSA9ICF0aGlzLiNzaHVmZmxlO1xuICAgICAgcmV0dXJuIHRoaXMuI3NodWZmbGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJhY2tzLnNodWZmbGUoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHNodWZmbGUgbW9kZSBpcyBlbmFibGVkIGZvciB0aGlzIHF1ZXVlLlxuICAgKi9cbiAgcHVibGljIGdldCBpc1NodWZmbGluZygpIHtcbiAgICByZXR1cm4gdGhpcy4jc2h1ZmZsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvbiBsYXRlbmN5IG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgcGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uPy5waW5nLnVkcCA/PyAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGRlbGV0ZSgpIHtcbiAgICBpZiAodGhpcy5wbGF5ZXIubm9kZXMuZGVsZXRlKHRoaXMuaWQpKSB7XG4gICAgICB0aGlzLiNkZWxldGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5RdWV1ZURlbGV0ZSwgdGhpcyk7XG4gICAgICB0aGlzLm5vZGUudGFza3NRdWV1ZS5jYW5jZWxBbGwoKTtcbiAgICAgIHRoaXMudGFza3NRdWV1ZS5jYW5jZWxBbGwoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV2aXZlcyB0aGlzIHF1ZXVlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgcmV2aXZlKCkge1xuICAgIGlmICghdGhpcy5kZWxldGVkIHx8IHRoaXMucGxheWVyLm5vZGVzLmhhcyh0aGlzLmlkKSkgcmV0dXJuO1xuICAgIHRoaXMuI2RlbGV0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuICAgIHRoaXMucGxheWVyLm5vZGVzLmNhY2hlLnNldCh0aGlzLmlkLCB0aGlzKTtcbiAgICB0aGlzLnBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUXVldWVDcmVhdGUsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBzZWxmIGRlYWZcbiAgICogQHBhcmFtIG1vZGUgT24vT2ZmIHN0YXRlXG4gICAqIEBwYXJhbSByZWFzb24gUmVhc29uXG4gICAqL1xuICBwdWJsaWMgc2V0U2VsZkRlYWYobW9kZT86IGJvb2xlYW4sIHJlYXNvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldERlYWYobW9kZSwgcmVhc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgc2VsZiBtdXRlXG4gICAqIEBwYXJhbSBtb2RlIE9uL09mZiBzdGF0ZVxuICAgKiBAcGFyYW0gcmVhc29uIFJlYXNvblxuICAgKi9cbiAgcHVibGljIHNldFNlbGZNdXRlKG1vZGU/OiBib29sZWFuLCByZWFzb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5ndWlsZC5tZW1iZXJzLm1lIS52b2ljZS5zZXRNdXRlKG1vZGUsIHJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICogUGxheSBhIHRyYWNrIGluIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBiZSBwbGF5ZWRcbiAgICogQHBhcmFtIG9wdGlvbnMgUGxheWVyIG5vZGUgaW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHBsYXkoXG4gIHRyYWNrOiBUcmFja0xpa2UsXG4gIG9wdGlvbnM/OiBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPE1ldGE+KVxuICB7XG4gICAgaWYgKCF0aGlzLmNoYW5uZWwpIHRocm93IG5ldyBOb1ZvaWNlQ29ubmVjdGlvbkVycm9yKCk7XG5cbiAgICByZXR1cm4gdGhpcy5wbGF5ZXIucGxheSh0aGlzLmNoYW5uZWwsIHRyYWNrLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0IGFuIGV2ZW50IG9uIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBlbWl0XG4gICAqIEBwYXJhbSBhcmdzIFRoZSBhcmdzIGZvciB0aGUgZXZlbnRcbiAgICovXG4gIHB1YmxpYyBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBHdWlsZFF1ZXVlRXZlbnRzPE1ldGE+PihcbiAgZXZlbnQ6IEssXG4gIC4uLmFyZ3M6IFBhcmFtZXRlcnM8R3VpbGRRdWV1ZUV2ZW50czxNZXRhPltLXT4pXG4gIDogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZGVsZXRlZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnBsYXllci5ldmVudHMuZW1pdChldmVudCwgLi4uYXJncyk7XG4gIH1cblxuICAjYXR0YWNoTGlzdGVuZXJzKGRpc3BhdGNoZXI6IFN0cmVhbURpc3BhdGNoZXIpIHtcbiAgICBkaXNwYXRjaGVyLm9uKCdlcnJvcicsIChlKSA9PiB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkVycm9yLCB0aGlzLCBlKSk7XG4gICAgZGlzcGF0Y2hlci5vbihcbiAgICAgICdkZWJ1ZycsXG4gICAgICAobSkgPT4gdGhpcy5oYXNEZWJ1Z2dlciAmJiB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkRlYnVnLCB0aGlzLCBtKVxuICAgICk7XG4gICAgZGlzcGF0Y2hlci5vbignZmluaXNoJywgKHIpID0+IHRoaXMuI3BlcmZvcm1GaW5pc2gocikpO1xuICAgIGRpc3BhdGNoZXIub24oJ3N0YXJ0JywgKHIpID0+IHRoaXMuI3BlcmZvcm1TdGFydChyKSk7XG4gICAgZGlzcGF0Y2hlci5vbignZGVzdHJveWVkJywgKCkgPT4ge1xuICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKGRpc3BhdGNoZXIpO1xuICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbnVsbDtcbiAgICB9KTtcbiAgICBkaXNwYXRjaGVyLm9uKCdkc3AnLCAoZikgPT4ge1xuICAgICAgaWYgKCFPYmplY3QuaXModGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMsIGYpKSB7XG4gICAgICAgIHRoaXMuZW1pdChcbiAgICAgICAgICBHdWlsZFF1ZXVlRXZlbnQuRFNQVXBkYXRlLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMsXG4gICAgICAgICAgZlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmZpbHRlcnMgPSBmO1xuICAgIH0pO1xuICAgIGRpc3BhdGNoZXIub24oJ2JpcXVhZCcsIChmKSA9PiB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCAhPT0gZikge1xuICAgICAgICB0aGlzLmVtaXQoXG4gICAgICAgICAgR3VpbGRRdWV1ZUV2ZW50LkJpcXVhZEZpbHRlcnNVcGRhdGUsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkLFxuICAgICAgICAgIGZcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgPSBmO1xuICAgIH0pO1xuICAgIGRpc3BhdGNoZXIub24oJ2VxQmFuZHMnLCAoZikgPT4ge1xuICAgICAgaWYgKCFPYmplY3QuaXMoZiwgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplcikpIHtcbiAgICAgICAgdGhpcy5lbWl0KFxuICAgICAgICAgIEd1aWxkUXVldWVFdmVudC5FcXVhbGl6ZXJVcGRhdGUsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyLFxuICAgICAgICAgIGZcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIgPSBmO1xuICAgIH0pO1xuICAgIGRpc3BhdGNoZXIub24oJ3ZvbHVtZScsIChmKSA9PiB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSAhPT0gZilcbiAgICAgIHRoaXMuZW1pdChcbiAgICAgICAgR3VpbGRRdWV1ZUV2ZW50LlZvbHVtZUNoYW5nZSxcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSxcbiAgICAgICAgZlxuICAgICAgKTtcbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUgPSBmO1xuICAgIH0pO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBhcmVPYmplY3RzRGlmZmVyZW50ID0gKGE6IGFueSwgYjogYW55KSA9PiB7XG4gICAgICBpZiAoIWEgJiYgIWIpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghYSB8fCAhYikgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoT2JqZWN0LmtleXMoYSkubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhiKS5sZW5ndGgpIHJldHVybiB0cnVlO1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGEpLnNvbWUoKGspID0+IGFba10gIT09IGJba10pO1xuICAgIH07XG5cbiAgICBkaXNwYXRjaGVyLm9uKCdzYW1wbGVSYXRlJywgKGYpID0+IHtcbiAgICAgIGlmICh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZSAhPT0gZi5zYW1wbGVSYXRlKSB7XG4gICAgICAgIHRoaXMuZW1pdChcbiAgICAgICAgICBHdWlsZFF1ZXVlRXZlbnQuU2FtcGxlUmF0ZVVwZGF0ZSxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5zYW1wbGVSYXRlLFxuICAgICAgICAgIGYuc2FtcGxlUmF0ZVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5zYW1wbGVSYXRlID0gZi5zYW1wbGVSYXRlO1xuXG4gICAgICAgIHRoaXMuZmlsdGVycy5zZWVrZXI/LnNldFNhbXBsZVJhdGUoZi5zYW1wbGVSYXRlKTtcbiAgICAgICAgdGhpcy5maWx0ZXJzLnNlZWtlcj8uc2V0VG90YWxEdXJhdGlvbih0aGlzLm5vZGUuZXN0aW1hdGVkRHVyYXRpb24pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZi5jdXJyZW50RmlsdGVyICE9PSB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZUZpbHRlcikge1xuICAgICAgICB0aGlzLmVtaXQoXG4gICAgICAgICAgR3VpbGRRdWV1ZUV2ZW50LlNhbXBsZVJhdGVGaWx0ZXJVcGRhdGUsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZUZpbHRlciA/PyBudWxsLFxuICAgICAgICAgIGYuY3VycmVudEZpbHRlclxuICAgICAgICApO1xuICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZUZpbHRlciA9IGYuY3VycmVudEZpbHRlcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBkaXNwYXRjaGVyLm9uKCdyZXZlcmInLCAoZikgPT4ge1xuICAgICAgaWYgKGFyZU9iamVjdHNEaWZmZXJlbnQoZiwgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnJldmVyYikpIHtcbiAgICAgICAgdGhpcy5lbWl0KFxuICAgICAgICAgIEd1aWxkUXVldWVFdmVudC5SZXZlcmJVcGRhdGUsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUucmV2ZXJiID8/IG51bGwsXG4gICAgICAgICAgZlxuICAgICAgICApO1xuICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUucmV2ZXJiID0gZjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBkaXNwYXRjaGVyLm9uKCdzZWVrZXInLCAoZikgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICBgU2Vla2VyID4+IFNlZWtlZCB0byAke2Yuc2Vla1RhcmdldH1tcyBmb3IgVHJhY2sgJHt0aGlzLmN1cnJlbnRUcmFjaz8udGl0bGV9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoZi5zZWVrVGFyZ2V0ICE9IG51bGwpIHRoaXMubm9kZS5zZXRQcm9ncmVzcyhmLnNlZWtUYXJnZXQpO1xuXG4gICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllclNlZWssIHRoaXMsIGYpO1xuICAgIH0pO1xuXG4gICAgZGlzcGF0Y2hlci5vbignY29tcHJlc3NvcicsIChmKSA9PiB7XG4gICAgICBpZiAoYXJlT2JqZWN0c0RpZmZlcmVudChmLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuY29tcHJlc3NvcikpIHtcbiAgICAgICAgdGhpcy5lbWl0KFxuICAgICAgICAgIEd1aWxkUXVldWVFdmVudC5Db21wcmVzc29yVXBkYXRlLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmNvbXByZXNzb3IgPz8gbnVsbCxcbiAgICAgICAgICBmXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5jb21wcmVzc29yID0gZjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzRGVidWdnZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyLmV2ZW50cy5oYXNEZWJ1Z2dlcjtcbiAgfVxuXG4gICNyZW1vdmVMaXN0ZW5lcnM8VCBleHRlbmRzIHtyZW1vdmVBbGxMaXN0ZW5lcnM6ICgpID0+IHVua25vd247fT4odGFyZ2V0OiBUKSB7XG4gICAgdGFyZ2V0LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICB9XG5cbiAgI3BlcmZvcm1TdGFydChyZXNvdXJjZT86IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSB7XG4gICAgY29uc3QgdHJhY2sgPSByZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5jdXJyZW50VHJhY2s7XG4gICAgY29uc3QgcmVhc29uID0gdGhpcy5pc1RyYW5zaXRpb25pbmcoKSA/ICdmaWx0ZXJzJyA6ICdub3JtYWwnO1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBQbGF5ZXIgdHJpZ2dlcmVkIGZvciBUcmFjayAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdGl0bGU6IHRyYWNrPy50aXRsZSxcbiAgICAgICAgcmVhc29uXG4gICAgICB9KX1gXG4gICAgKTtcblxuICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUGxheWVyVHJpZ2dlciwgdGhpcywgdHJhY2shLCByZWFzb24pO1xuICAgIGlmICh0cmFjayAmJiAhdGhpcy5pc1RyYW5zaXRpb25pbmcoKSlcbiAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllclN0YXJ0LCB0aGlzLCB0cmFjayk7XG4gICAgdGhpcy5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgfVxuXG4gICNnZXROZXh0VHJhY2soKSB7XG4gICAgaWYgKCF0aGlzLmlzU2h1ZmZsaW5nKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFja3MuZGlzcGF0Y2goKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdG9yZSA9IHRoaXMudHJhY2tzLnN0b3JlO1xuXG4gICAgaWYgKCFzdG9yZS5sZW5ndGgpIHJldHVybjtcblxuICAgIGNvbnN0IHRyYWNrID0gVXRpbC5yYW5kb21DaG9pY2Uoc3RvcmUpO1xuXG4gICAgdGhpcy50cmFja3MucmVtb3ZlT25lKCh0KSA9PiB7XG4gICAgICByZXR1cm4gdC5pZCA9PT0gdHJhY2suaWQ7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHJhY2s7XG4gIH1cblxuICAjcGVyZm9ybUZpbmlzaChyZXNvdXJjZT86IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSB7XG4gICAgY29uc3QgdHJhY2sgPSByZXNvdXJjZT8ubWV0YWRhdGEgfHwgdGhpcy5jdXJyZW50VHJhY2s7XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgYFRyYWNrICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB0aXRsZTogdHJhY2s/LnRpdGxlLFxuICAgICAgICBpc1RyYW5zaXRpb25Nb2RlOiB0aGlzLmlzVHJhbnNpdGlvbmluZygpXG4gICAgICB9KX0gd2FzIG1hcmtlZCBhcyBmaW5pc2hlZGBcbiAgICApO1xuXG4gICAgaWYgKCF0aGlzLmlzVHJhbnNpdGlvbmluZygpKSB7XG4gICAgICB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLnN5bmNlZEx5cmljc1Byb3ZpZGVyLmx5cmljcy5jbGVhcigpO1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAnQWRkaW5nIHRyYWNrIHRvIGhpc3RvcnkgYW5kIGVtaXR0aW5nIGZpbmlzaCBldmVudCBzaW5jZSB0cmFuc2l0aW9uIG1vZGUgaXMgZGlzYWJsZWQuLi4nXG4gICAgICApO1xuICAgICAgaWYgKHRyYWNrKSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKHRyYWNrKTtcbiAgICAgICAgdGhpcy5ub2RlLnJlc2V0UHJvZ3Jlc3MoKTtcbiAgICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJGaW5pc2gsIHRoaXMsIHRyYWNrKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLiNkZWxldGVkKSByZXR1cm4gdGhpcy4jZW1pdEVuZCgpO1xuICAgICAgaWYgKHRoaXMudHJhY2tzLnNpemUgPCAxICYmIHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLk9GRikge1xuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAnTm8gbW9yZSB0cmFja3MgbGVmdCBpbiB0aGUgcXVldWUgdG8gcGxheSBhbmQgcmVwZWF0IG1vZGUgaXMgb2ZmLCBpbml0aWF0aW5nICNlbWl0RW5kKCknXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuI2VtaXRFbmQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnJlcGVhdE1vZGUgPT09IFF1ZXVlUmVwZWF0TW9kZS5UUkFDSykge1xuICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgICAnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIHRyYWNrLCByZXBlYXRpbmcgbGFzdCB0cmFjayBmcm9tIHRoZSBoaXN0b3J5Li4uJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSB0aGlzLmhpc3RvcnkudHJhY2tzLmRpc3BhdGNoKCkgfHwgdHJhY2s7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubm9kZS5wbGF5KHRoaXMuX19jdXJyZW50ISwgeyBxdWV1ZTogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLlFVRVVFKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgICdSZXBlYXQgbW9kZSBpcyBzZXQgdG8gcXVldWUsIG1vdmluZyBsYXN0IHRyYWNrIGZyb20gdGhlIGhpc3RvcnkgdG8gY3VycmVudCBxdWV1ZS4uLidcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmhpc3RvcnkudHJhY2tzLmRpc3BhdGNoKCkgfHwgdHJhY2s7XG4gICAgICAgICAgaWYgKG5leHQpIHRoaXMudHJhY2tzLmFkZChuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMudHJhY2tzLnNpemUgJiYgdHJhY2spIHtcbiAgICAgICAgICBpZiAodGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuQVVUT1BMQVkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgICAgJ1JlcGVhdCBtb2RlIGlzIHNldCB0byBhdXRvcGxheSwgaW5pdGlhdGluZyBhdXRvcGxheSBoYW5kbGVyLi4uJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuI2hhbmRsZUF1dG9wbGF5KHRyYWNrKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgdGhpcy5kZWJ1ZygnSW5pdGlhbGl6aW5nIG5leHQgdHJhY2sgb2YgdGhlIHF1ZXVlLi4uJyk7XG4gICAgICAgICAgdGhpcy5fX2N1cnJlbnQgPSB0aGlzLiNnZXROZXh0VHJhY2soKSE7XG4gICAgICAgICAgdGhpcy5ub2RlLnBsYXkodGhpcy5fX2N1cnJlbnQsIHtcbiAgICAgICAgICAgIHF1ZXVlOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgI2VtaXRFbmQoKSB7XG4gICAgdGhpcy5fX2N1cnJlbnQgPSBudWxsO1xuICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRW1wdHlRdWV1ZSwgdGhpcyk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5sZWF2ZU9uRW5kKSB7XG4gICAgICBjb25zdCB0bTogTm9kZUpTLlRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKCkpIHJldHVybiBjbGVhclRpbWVvdXQodG0pO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICAgIH0sIHRoaXMub3B0aW9ucy5sZWF2ZU9uRW5kQ29vbGRvd24pLnVucmVmKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgI2hhbmRsZUF1dG9wbGF5KHRyYWNrOiBUcmFjaykge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgIGBBdXRvcGxheSA+PiBGaW5kaW5nIHJlbGF0ZWQgdHJhY2tzIGZvciBUcmFjayAke3RyYWNrLnRpdGxlfSAoJHtcbiAgICAgICAgdHJhY2sudXJsfSkgW2V4dDoke1xuICAgICAgICB0cmFjay5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9XWBcbiAgICAgICk7XG4gICAgICBjb25zdCB0cmFja3MgPVxuICAgICAgKGF3YWl0IHRyYWNrLmV4dHJhY3Rvcj8uZ2V0UmVsYXRlZFRyYWNrcyh0cmFjaywgdGhpcy5oaXN0b3J5KSk/LlxuICAgICAgdHJhY2tzIHx8XG4gICAgICAoXG4gICAgICBhd2FpdCB0aGlzLnBsYXllci5leHRyYWN0b3JzLnJ1bihhc3luYyAoZXh0KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKGBBdXRvcGxheSA+PiBRdWVyeWluZyBleHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn1gKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZXh0LmdldFJlbGF0ZWRUcmFja3ModHJhY2ssIHRoaXMuaGlzdG9yeSk7XG4gICAgICAgIGlmICghcmVzLnRyYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgICAgYEF1dG9wbGF5ID4+IEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBmYWlsZWQgdG8gcHJvdmlkZSByZXN1bHRzLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgIGBBdXRvcGxheSA+PiBFeHRyYWN0b3IgJHtleHQuaWRlbnRpZmllcn0gc3VjY2Vzc2Z1bGx5IHJldHVybmVkIHJlc3VsdHMuYFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiByZXMudHJhY2tzO1xuICAgICAgfSkpPy5cbiAgICAgIHJlc3VsdCB8fFxuICAgICAgW107XG5cbiAgICAgIGxldCByZXNvbHZlcjogKHRyYWNrOiBUcmFjayB8IG51bGwpID0+IHZvaWQgPSBVdGlsLm5vb3A7XG4gICAgICBjb25zdCBkb25lUHJvbWlzZSA9IG5ldyBQcm9taXNlPFRyYWNrIHwgbnVsbD4oXG4gICAgICAgIChyZXNvbHZlKSA9PiByZXNvbHZlciA9IHJlc29sdmVcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmVtaXQoXG4gICAgICAgIEd1aWxkUXVldWVFdmVudC5XaWxsQXV0b1BsYXksXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRyYWNrcyxcbiAgICAgICAgcmVzb2x2ZXIhXG4gICAgICApO1xuXG4gICAgICAvLyBwcmV2ZW50IGRhbmdsaW5nIHByb21pc2VcbiAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICByZXNvbHZlcihcbiAgICAgICAgICB0cmFja3MubGVuZ3RoID9cbiAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlID0gdHJhY2tzLmZpbHRlcihcbiAgICAgICAgICAgICAgKHRyKSA9PiAhdGhpcy5oaXN0b3J5LnRyYWNrcy5maW5kKCh0KSA9PiB0LnVybCA9PT0gdHIudXJsKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiB1bmlxdWU/LlswXSA/PyBVdGlsLnJhbmRvbUNob2ljZSh0cmFja3Muc2xpY2UoMCwgNSkpO1xuICAgICAgICAgIH0pKCkgOlxuICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV4dFRyYWNrID0gYXdhaXQgZG9uZVByb21pc2U7XG5cbiAgICAgIGlmICghbmV4dFRyYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKCdBdXRvcGxheSA+PiBObyB0cmFjayB3YXMgZm91bmQsIGluaXRpYXRpbmcgI2VtaXRFbmQoKScpO1xuICAgICAgICB0aHJvdyAnTm8gdHJhY2sgd2FzIGZvdW5kJztcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5ub2RlLnBsYXkobmV4dFRyYWNrLCB7XG4gICAgICAgIHF1ZXVlOiBmYWxzZSxcbiAgICAgICAgc2VlazogMCxcbiAgICAgICAgdHJhbnNpdGlvbk1vZGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0aGlzLiNlbWl0RW5kKCk7XG4gICAgfVxuICB9XG59IiwgImltcG9ydCB7XG4gIEF1ZGlvUGxheWVyLFxuICBBdWRpb1BsYXllckVycm9yLFxuICBBdWRpb1BsYXllclN0YXR1cyxcbiAgQXVkaW9SZXNvdXJjZSxcbiAgY3JlYXRlQXVkaW9QbGF5ZXIsXG4gIGNyZWF0ZUF1ZGlvUmVzb3VyY2UsXG4gIGVudGVyc1N0YXRlLFxuICBTdHJlYW1UeXBlLFxuICBWb2ljZUNvbm5lY3Rpb24sXG4gIFZvaWNlQ29ubmVjdGlvblN0YXR1cyxcbiAgVm9pY2VDb25uZWN0aW9uRGlzY29ubmVjdFJlYXNvbiB9IGZyb21cbidkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgU3RhZ2VDaGFubmVsLCBWb2ljZUNoYW5uZWwgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB0eXBlIHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7XG4gIEVxdWFsaXplckJhbmQsXG4gIEJpcXVhZEZpbHRlcnMsXG4gIFBDTUZpbHRlcnMsXG4gIEZpbHRlcnNDaGFpbixcbiAgQ29tcHJlc3NvclBhcmFtZXRlcnMsXG4gIFJldmVyYlBhcmFtZXRlcnMsXG4gIFNlZWtlclBhcmFtZXRlcnMsXG4gIFJlc2FtcGxlUGFyYW1ldGVycyxcbiAgQ29tbW9uUmVzYW1wbGVyRmlsdGVyUHJlc2V0LFxuICBTZWVrRXZlbnQgfSBmcm9tXG4nQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQsIFBvc3RQcm9jZXNzZWRSZXN1bHQgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyBOb0F1ZGlvUmVzb3VyY2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBJbnRlcmNlcHRlZFN0cmVhbSB9IGZyb20gJy4vSW50ZXJjZXB0ZWRTdHJlYW0nO1xuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVN0cmVhbU9wcyB7XG4gIHR5cGU/OiBTdHJlYW1UeXBlO1xuICBkYXRhOiBUcmFjaztcbiAgZGlzYWJsZVZvbHVtZT86IGJvb2xlYW47XG4gIGRpc2FibGVFcXVhbGl6ZXI/OiBib29sZWFuO1xuICBkaXNhYmxlQmlxdWFkPzogYm9vbGVhbjtcbiAgZGlzYWJsZUNvbXByZXNzb3I/OiBib29sZWFuO1xuICBkaXNhYmxlUmVzYW1wbGVyPzogYm9vbGVhbjtcbiAgZGlzYWJsZVJldmVyYj86IGJvb2xlYW47XG4gIGRpc2FibGVTZWVrZXI/OiBib29sZWFuO1xuICBlcT86IEVxdWFsaXplckJhbmRbXTtcbiAgYmlxdWFkRmlsdGVyPzogQmlxdWFkRmlsdGVycztcbiAgZGlzYWJsZUZpbHRlcnM/OiBib29sZWFuO1xuICBkZWZhdWx0RmlsdGVycz86IFBDTUZpbHRlcnNbXTtcbiAgdm9sdW1lPzogbnVtYmVyO1xuICBzYW1wbGVSYXRlPzogbnVtYmVyO1xuICBzYW1wbGVSYXRlRmlsdGVycz86IENvbW1vblJlc2FtcGxlckZpbHRlclByZXNldDtcbiAgc2tpcEZGbXBlZz86IGJvb2xlYW47XG4gIGNvbXByZXNzb3I/OiB7XG4gICAgdGhyZXNob2xkOiBudW1iZXI7XG4gICAgcmF0aW86IG51bWJlcjtcbiAgICBhdHRhY2s6IG51bWJlcjtcbiAgICByZWxlYXNlOiBudW1iZXI7XG4gICAgbWFrZXVwR2FpbjogbnVtYmVyO1xuICAgIGtuZWVXaWR0aDogbnVtYmVyO1xuICB9O1xuICByZXZlcmI/OiB7XG4gICAgcm9vbVNpemU6IG51bWJlcjtcbiAgICBkYW1waW5nOiBudW1iZXI7XG4gICAgd2V0TGV2ZWw6IG51bWJlcjtcbiAgICBkcnlMZXZlbDogbnVtYmVyO1xuICB9O1xuICBzZWVrZXI/OiB7XG4gICAgc2Vla1RhcmdldDogbnVtYmVyIHwgbnVsbDtcbiAgICB0b3RhbER1cmF0aW9uOiBudW1iZXI7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9pY2VFdmVudHMge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4gIGVycm9yOiAoZXJyb3I6IEF1ZGlvUGxheWVyRXJyb3IpID0+IGFueTtcbiAgZGVidWc6IChtZXNzYWdlOiBzdHJpbmcpID0+IGFueTtcbiAgc3RhcnQ6IChyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pID0+IGFueTtcbiAgZmluaXNoOiAocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+KSA9PiBhbnk7XG4gIGRzcDogKGZpbHRlcnM6IFBDTUZpbHRlcnNbXSkgPT4gYW55O1xuICBlcUJhbmRzOiAoZmlsdGVyczogRXF1YWxpemVyQmFuZFtdKSA9PiBhbnk7XG4gIHNhbXBsZVJhdGU6IChmaWx0ZXJzOiBSZXNhbXBsZVBhcmFtZXRlcnMpID0+IGFueTtcbiAgYmlxdWFkOiAoZmlsdGVyczogQmlxdWFkRmlsdGVycykgPT4gYW55O1xuICBjb21wcmVzc29yOiAoZmlsdGVyczogQ29tcHJlc3NvclBhcmFtZXRlcnMpID0+IGFueTtcbiAgcmV2ZXJiOiAoZmlsdGVyczogUmV2ZXJiUGFyYW1ldGVycykgPT4gYW55O1xuICBzZWVrZXI6IChmaWx0ZXJzOiBTZWVrZXJQYXJhbWV0ZXJzKSA9PiBhbnk7XG4gIHZvbHVtZTogKHZvbHVtZTogbnVtYmVyKSA9PiBhbnk7XG4gIGRlc3Ryb3llZDogKCkgPT4gYW55O1xuICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbn1cblxuY2xhc3MgU3RyZWFtRGlzcGF0Y2hlciBleHRlbmRzIEV2ZW50RW1pdHRlcjxWb2ljZUV2ZW50cz4ge1xuICBwdWJsaWMgdm9pY2VDb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb247XG4gIHB1YmxpYyBhdWRpb1BsYXllcjogQXVkaW9QbGF5ZXI7XG4gIHB1YmxpYyBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWw7XG4gIHB1YmxpYyBhdWRpb1Jlc291cmNlPzogQXVkaW9SZXNvdXJjZTxUcmFjaz4gfCBudWxsO1xuICBwdWJsaWMgZHNwID0gbmV3IEZpbHRlcnNDaGFpbigpO1xuXG4gICNpbnRlcmNlcHRvcjogSW50ZXJjZXB0ZWRTdHJlYW0gfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBuZXcgY29ubmVjdGlvbiBvYmplY3RcbiAgICogQHBhcmFtIHtWb2ljZUNvbm5lY3Rpb259IGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb25cbiAgICogQHBhcmFtIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfSBjaGFubmVsIFRoZSBjb25uZWN0ZWQgY2hhbm5lbFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gIGNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbixcbiAgY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsLFxuICBwdWJsaWMgcXVldWU6IEd1aWxkUXVldWUsXG4gIHB1YmxpYyByZWFkb25seSBjb25uZWN0aW9uVGltZW91dDogbnVtYmVyID0gMjAwMDAsXG4gIGF1ZGlvUGxheWVyPzogQXVkaW9QbGF5ZXIpXG4gIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb25cbiAgICAgKiBAdHlwZSB7Vm9pY2VDb25uZWN0aW9ufVxuICAgICAqL1xuICAgIHRoaXMudm9pY2VDb25uZWN0aW9uID0gY29ubmVjdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhdWRpbyBwbGF5ZXJcbiAgICAgKiBAdHlwZSB7QXVkaW9QbGF5ZXJ9XG4gICAgICovXG4gICAgdGhpcy5hdWRpb1BsYXllciA9XG4gICAgYXVkaW9QbGF5ZXIgfHxcbiAgICBjcmVhdGVBdWRpb1BsYXllcih7XG4gICAgICBkZWJ1ZzogdGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlclxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHZvaWNlIGNoYW5uZWxcbiAgICAgKiBAdHlwZSB7Vm9pY2VDaGFubmVsfFN0YWdlQ2hhbm5lbH1cbiAgICAgKi9cbiAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsO1xuXG4gICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ub24oJ2RlYnVnJywgKG0pID0+IHZvaWQgdGhpcy5lbWl0KCdkZWJ1ZycsIG0pKTtcbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5vbihcbiAgICAgICdlcnJvcicsXG4gICAgICAoZXJyb3IpID0+IHZvaWQgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yIGFzIEF1ZGlvUGxheWVyRXJyb3IpXG4gICAgKTtcbiAgICB0aGlzLmF1ZGlvUGxheWVyLm9uKCdkZWJ1ZycsIChtKSA9PiB2b2lkIHRoaXMuZW1pdCgnZGVidWcnLCBtKSk7XG4gICAgdGhpcy5hdWRpb1BsYXllci5vbignZXJyb3InLCAoZXJyb3IpID0+IHZvaWQgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yKSk7XG5cbiAgICB0aGlzLmRzcC5vblVwZGF0ZSA9ICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5kc3ApIHJldHVybjtcblxuICAgICAgaWYgKHRoaXMuZHNwLmZpbHRlcnM/LmZpbHRlcnMpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdkc3AnLCB0aGlzLmRzcC5maWx0ZXJzPy5maWx0ZXJzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZHNwLmJpcXVhZD8uZmlsdGVycykge1xuICAgICAgICB0aGlzLmVtaXQoJ2JpcXVhZCcsIHRoaXMuZHNwLmJpcXVhZD8uZmlsdGVycyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmRzcC5lcXVhbGl6ZXIpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdlcUJhbmRzJywgdGhpcy5kc3AuZXF1YWxpemVyLmdldEVRKCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5kc3Audm9sdW1lKSB7XG4gICAgICAgIHRoaXMuZW1pdCgndm9sdW1lJywgdGhpcy5kc3Audm9sdW1lLnZvbHVtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmRzcC5yZXNhbXBsZXIpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdzYW1wbGVSYXRlJywgdGhpcy5kc3AucmVzYW1wbGVyLmdldFBhcmFtZXRlcnMoKSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kc3AuY29tcHJlc3Nvcikge1xuICAgICAgICB0aGlzLmVtaXQoJ2NvbXByZXNzb3InLCB0aGlzLmRzcC5jb21wcmVzc29yLmdldFBhcmFtZXRlcnMoKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmRzcC5yZXZlcmIpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdyZXZlcmInLCB0aGlzLmRzcC5yZXZlcmIuZ2V0UGFyYW1ldGVycygpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZHNwLnNlZWtlcikge1xuICAgICAgICB0aGlzLmVtaXQoJ3NlZWtlcicsIHRoaXMuZHNwLnNlZWtlci5nZXRQYXJhbWV0ZXJzKCkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmRzcC5vbkVycm9yID0gKGUpID0+IHRoaXMuZW1pdCgnZXJyb3InLCBlIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuXG4gICAgdGhpcy52b2ljZUNvbm5lY3Rpb24uXG4gICAgb24oVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRpc2Nvbm5lY3RlZCwgYXN5bmMgKG9sZFN0YXRlLCBuZXdTdGF0ZSkgPT4ge1xuICAgICAgaWYgKG5ld1N0YXRlLnJlYXNvbiA9PT0gVm9pY2VDb25uZWN0aW9uRGlzY29ubmVjdFJlYXNvbi5NYW51YWwpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgbmV3U3RhdGUucmVhc29uID09PSBWb2ljZUNvbm5lY3Rpb25EaXNjb25uZWN0UmVhc29uLldlYlNvY2tldENsb3NlICYmXG4gICAgICBuZXdTdGF0ZS5jbG9zZUNvZGUgPT09IDQwMTQpXG4gICAgICB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZW50ZXJzU3RhdGUoXG4gICAgICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbixcbiAgICAgICAgICAgIFZvaWNlQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nLFxuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uVGltZW91dFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09XG4gICAgICAgICAgICBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKVxuXG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbkF0dGVtcHRzIDwgNSkge1xuICAgICAgICBhd2FpdCBVdGlsLndhaXQoKHRoaXMudm9pY2VDb25uZWN0aW9uLnJlam9pbkF0dGVtcHRzICsgMSkgKiA1MDAwKTtcbiAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24ucmVqb2luKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09XG4gICAgICAgICAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZClcblxuICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkuXG4gICAgb24oVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCwgKCkgPT4ge1xuICAgICAgdGhpcy5lbmQoKTtcbiAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQ29ubmVjdGlvbkRlc3Ryb3llZCwgdGhpcy5xdWV1ZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmF1ZGlvUGxheWVyLm9uKCdzdGF0ZUNoYW5nZScsIChvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICAgIGlmIChcbiAgICAgIG9sZFN0YXRlLnN0YXR1cyAhPT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkICYmXG4gICAgICBuZXdTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZClcbiAgICAgIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJQYXVzZSwgdGhpcy5xdWV1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgIG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkICYmXG4gICAgICBuZXdTdGF0ZS5zdGF0dXMgIT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZClcbiAgICAgIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJSZXN1bWUsIHRoaXMucXVldWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QbGF5aW5nKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgb2xkU3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlIHx8XG4gICAgICAgIG9sZFN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQnVmZmVyaW5nKVxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnc3RhcnQnLCB0aGlzLmF1ZGlvUmVzb3VyY2UhKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgIG5ld1N0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZSAmJlxuICAgICAgb2xkU3RhdGUuc3RhdHVzICE9PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlKVxuICAgICAge1xuICAgICAgICB0aGlzLmVtaXQoJ2ZpbmlzaCcsIHRoaXMuYXVkaW9SZXNvdXJjZSEpO1xuICAgICAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuYXVkaW9SZXNvdXJjZSA9IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdWJzY3JpYmUodGhpcy5hdWRpb1BsYXllcik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIHBsYXllciBoYXMgYmVlbiBwYXVzZWQgbWFudWFsbHlcbiAgICovXG4gIGdldCBwYXVzZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQ7XG4gIH1cblxuICBzZXQgcGF1c2VkKHZhbDogYm9vbGVhbikge1xuICAgIHZhbCA/IHRoaXMucGF1c2UodHJ1ZSkgOiB0aGlzLnJlc3VtZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBhdXNlZCBhdXRvbWF0aWNhbGx5IG9yIG1hbnVhbGx5LlxuICAgKi9cbiAgaXNQYXVzZWQoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucGF1c2VkIHx8XG4gICAgICB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQXV0b1BhdXNlZCk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBidWZmZXJpbmdcbiAgICovXG4gIGlzQnVmZmVyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuQnVmZmVyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBsYXlpbmdcbiAgICovXG4gIGlzUGxheWluZygpIHtcbiAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBsYXlpbmc7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgaWRsZVxuICAgKi9cbiAgaXNJZGxlKCkge1xuICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuSWRsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBoYXMgYmVlbiBkZXN0cm95ZWRcbiAgICovXG4gIGlzRGVzdHJveWVkKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpO1xuXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaGFzIGJlZW4gZGVzdHJveWVkXG4gICAqL1xuICBpc0Rpc2Nvbm5lY3RlZCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGlzY29ubmVjdGVkKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGlzIHJlYWR5IHRvIHBsYXlcbiAgICovXG4gIGlzUmVhZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLlJlYWR5O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGlzIHNpZ25hbGxpbmdcbiAgICovXG4gIGlzU2lnbmFsbGluZygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuU2lnbmFsbGluZyk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBpcyBjb25uZWN0aW5nXG4gICAqL1xuICBpc0Nvbm5lY3RpbmcoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcpO1xuXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBzdHJlYW1cbiAgICogQHBhcmFtIHtSZWFkYWJsZX0gc3JjIFRoZSBzdHJlYW0gc291cmNlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3BzXSBPcHRpb25zXG4gICAqIEByZXR1cm5zIHtBdWRpb1Jlc291cmNlfVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlU3RyZWFtKHNyYzogUmVhZGFibGUsIG9wczogQ3JlYXRlU3RyZWFtT3BzKSB7XG4gICAgaWYgKCFvcHM/LmRpc2FibGVGaWx0ZXJzICYmIHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5xdWV1ZS5kZWJ1ZygnSW5pdGlhdGluZyBEU1AgZmlsdGVycyBwaXBlbGluZS4uLicpO1xuICAgIGNvbnN0IHN0cmVhbSA9ICFvcHM/LmRpc2FibGVGaWx0ZXJzID9cbiAgICB0aGlzLmRzcC5jcmVhdGUoc3JjLCB7XG4gICAgICBkc3A6IHtcbiAgICAgICAgZmlsdGVyczogb3BzPy5kZWZhdWx0RmlsdGVycyxcbiAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUZpbHRlcnNcbiAgICAgIH0sXG4gICAgICBiaXF1YWQ6IG9wcz8uYmlxdWFkRmlsdGVyID9cbiAgICAgIHtcbiAgICAgICAgZmlsdGVyOiBvcHMuYmlxdWFkRmlsdGVyLFxuICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlQmlxdWFkXG4gICAgICB9IDpcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHJlc2FtcGxlcjogb3BzPy5zYW1wbGVSYXRlID9cbiAgICAgIHtcbiAgICAgICAgaW5wdXRTYW1wbGVSYXRlOiA0ODAwMCxcbiAgICAgICAgdGFyZ2V0U2FtcGxlUmF0ZTogb3BzPy5zYW1wbGVSYXRlLFxuICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlUmVzYW1wbGVyXG4gICAgICB9IDpcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGVxdWFsaXplcjoge1xuICAgICAgICBiYW5kTXVsdGlwbGllcjogb3BzPy5lcSxcbiAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUVxdWFsaXplclxuICAgICAgfSxcbiAgICAgIHZvbHVtZToge1xuICAgICAgICB2b2x1bWU6IG9wcz8udm9sdW1lLFxuICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlVm9sdW1lXG4gICAgICB9LFxuICAgICAgY29tcHJlc3Nvcjogb3BzPy5jb21wcmVzc29yID9cbiAgICAgIHtcbiAgICAgICAgdGhyZXNob2xkOiBvcHM/LmNvbXByZXNzb3IudGhyZXNob2xkLFxuICAgICAgICByYXRpbzogb3BzPy5jb21wcmVzc29yLnJhdGlvLFxuICAgICAgICBhdHRhY2s6IG9wcz8uY29tcHJlc3Nvci5hdHRhY2ssXG4gICAgICAgIHJlbGVhc2U6IG9wcz8uY29tcHJlc3Nvci5yZWxlYXNlLFxuICAgICAgICBtYWtldXBHYWluOiBvcHM/LmNvbXByZXNzb3IubWFrZXVwR2FpbixcbiAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZUNvbXByZXNzb3IsXG4gICAgICAgIGtuZWVXaWR0aDogb3BzPy5jb21wcmVzc29yLmtuZWVXaWR0aFxuICAgICAgfSA6XG4gICAgICB1bmRlZmluZWQsXG4gICAgICByZXZlcmI6IG9wcz8ucmV2ZXJiID9cbiAgICAgIHtcbiAgICAgICAgcm9vbVNpemU6IG9wcz8ucmV2ZXJiLnJvb21TaXplLFxuICAgICAgICBkYW1waW5nOiBvcHM/LnJldmVyYi5kYW1waW5nLFxuICAgICAgICB3ZXRMZXZlbDogb3BzPy5yZXZlcmIud2V0TGV2ZWwsXG4gICAgICAgIGRyeUxldmVsOiBvcHM/LnJldmVyYi5kcnlMZXZlbCxcbiAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZVJldmVyYlxuICAgICAgfSA6XG4gICAgICB1bmRlZmluZWQsXG4gICAgICBzZWVrZXI6IG9wcz8uc2Vla2VyID9cbiAgICAgIHtcbiAgICAgICAgZGlzYWJsZWQ6IG9wcz8uZGlzYWJsZVNlZWtlcixcbiAgICAgICAgc2Vla1RhcmdldDogb3BzPy5zZWVrZXIuc2Vla1RhcmdldCxcbiAgICAgICAgc2FtcGxlUmF0ZTogNDgwMDAsXG4gICAgICAgIGNoYW5uZWxzOiAyLFxuICAgICAgICB0b3RhbER1cmF0aW9uOiBvcHM/LnNlZWtlci50b3RhbER1cmF0aW9uXG4gICAgICB9IDpcbiAgICAgIHVuZGVmaW5lZFxuICAgIH0pIDpcbiAgICBzcmM7XG5cbiAgICBpZiAodGhpcy5kc3Auc2Vla2VyKSB7XG4gICAgICAvLyB1c2VkIHRvIGhhbmRsZSBiYWNrd2FyZCBzZWVraW5nXG4gICAgICB0aGlzLmRzcC5zZWVrZXIub24oJ3NlZWsnLCAoZGF0YTogU2Vla0V2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMucXVldWUubm9kZS5yZXF1ZXN0U2VlayhkYXRhKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZygnRXhlY3V0aW5nIG9uQWZ0ZXJDcmVhdGVTdHJlYW0gaG9vay4uLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHBvc3RTdHJlYW0gPSBhd2FpdCB0aGlzLnF1ZXVlLlxuICAgIG9uQWZ0ZXJDcmVhdGVTdHJlYW0/LihzdHJlYW0sIHRoaXMucXVldWUsIG9wcz8uZGF0YSkuXG4gICAgY2F0Y2goXG4gICAgICAoKSA9PlxuICAgICAgKHtcbiAgICAgICAgc3RyZWFtOiBzdHJlYW0sXG4gICAgICAgIHR5cGU6IG9wcz8udHlwZSA/PyBTdHJlYW1UeXBlLkFyYml0cmFyeVxuICAgICAgfSkgYXMgUG9zdFByb2Nlc3NlZFJlc3VsdFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnUHJlcGFyaW5nIEF1ZGlvUmVzb3VyY2UuLi4nKTtcblxuICAgIGNvbnN0IGZvcm1hdCA9IHBvc3RTdHJlYW0/LnR5cGUgPz8gb3BzPy50eXBlID8/IFN0cmVhbVR5cGUuQXJiaXRyYXJ5O1xuXG4gICAgbGV0IF9zdHJlYW06IFJlYWRhYmxlO1xuXG4gICAgaWYgKHRoaXMucXVldWUuY2FuSW50ZXJjZXB0KCkpIHtcbiAgICAgIHRoaXMuI2ludGVyY2VwdG9yID0gbmV3IEludGVyY2VwdGVkU3RyZWFtKCk7XG5cbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIChwb3N0U3RyZWFtPy5zdHJlYW0gPz8gc3RyZWFtKS5waXBlKHRoaXMuI2ludGVyY2VwdG9yKTtcblxuICAgICAgX3N0cmVhbSA9IHRoaXMuI2ludGVyY2VwdG9yO1xuXG4gICAgICBhd2FpdCB0aGlzLnF1ZXVlLnBsYXllci5oYW5kbGVJbnRlcmNlcHRpbmdTdHJlYW0oXG4gICAgICAgIHRoaXMucXVldWUsXG4gICAgICAgIG9wcz8uZGF0YSxcbiAgICAgICAgZm9ybWF0LFxuICAgICAgICB0aGlzLiNpbnRlcmNlcHRvclxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3N0cmVhbSA9IHBvc3RTdHJlYW0/LnN0cmVhbSA/PyBzdHJlYW07XG4gICAgfVxuXG4gICAgdGhpcy5hdWRpb1Jlc291cmNlID0gY3JlYXRlQXVkaW9SZXNvdXJjZShfc3RyZWFtLCB7XG4gICAgICBpbnB1dFR5cGU6IGZvcm1hdCxcbiAgICAgIG1ldGFkYXRhOiBvcHM/LmRhdGEgYXMgVHJhY2ssXG4gICAgICAvLyB2b2x1bWUgY29udHJvbHMgaGFwcGVuIGZyb20gQXVkaW9GaWx0ZXIgRFNQIHV0aWxpdHlcbiAgICAgIGlubGluZVZvbHVtZTogZmFsc2VcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmF1ZGlvUmVzb3VyY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJlc2FtcGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LnJlc2FtcGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LmZpbHRlcnM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGJpcXVhZCgpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LmJpcXVhZCB8fCBudWxsO1xuICB9XG5cbiAgcHVibGljIGdldCBlcXVhbGl6ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZHNwPy5lcXVhbGl6ZXIgfHwgbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29tcHJlc3NvcigpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LmNvbXByZXNzb3IgfHwgbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmV2ZXJiKCkge1xuICAgIHJldHVybiB0aGlzLmRzcD8ucmV2ZXJiIHx8IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlZWtlcigpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LnNlZWtlciB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgc3RhdHVzXG4gICAqIEB0eXBlIHtBdWRpb1BsYXllclN0YXR1c31cbiAgICovXG4gIGdldCBzdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIGZyb20gdm9pY2VcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBkaXNjb25uZWN0KCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5hdWRpb1BsYXllcikgdGhpcy5hdWRpb1BsYXllci5zdG9wKHRydWUpO1xuICAgICAgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZClcbiAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICB9IGNhdGNoIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB0aGlzIGRpc3BhdGNoZXJcbiAgICovXG4gIHB1YmxpYyBkZXN0cm95KCkge1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLmF1ZGlvUGxheWVyLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgdGhpcy5hdWRpb1Jlc291cmNlID0gbnVsbDtcbiAgICB0aGlzLmVtaXQoJ2Rlc3Ryb3llZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBwbGF5ZXJcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBlbmQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuYXVkaW9QbGF5ZXIuc3RvcCgpO1xuICAgICAgdGhpcy5kc3AuZGVzdHJveSgpO1xuICAgIH0gY2F0Y2gge1xuXG4gICAgICAvL1xuICAgIH19XG5cbiAgLyoqXG4gICAqIFBhdXNlcyB0aGUgc3RyZWFtIHBsYXliYWNrXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ludGVycG9sYXRlU2lsZW5jZT1mYWxzZV0gSWYgdHJ1ZSwgdGhlIHBsYXllciB3aWxsIHBsYXkgNSBwYWNrZXRzIG9mIHNpbGVuY2UgYWZ0ZXIgcGF1c2luZyB0byBwcmV2ZW50IGF1ZGlvIGdsaXRjaGVzLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHBhdXNlKGludGVycG9sYXRlU2lsZW5jZT86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5hdWRpb1BsYXllci5wYXVzZShpbnRlcnBvbGF0ZVNpbGVuY2UpO1xuICAgIHJldHVybiBzdWNjZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZXMgdGhlIHN0cmVhbSBwbGF5YmFja1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHJlc3VtZSgpIHtcbiAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5hdWRpb1BsYXllci51bnBhdXNlKCk7XG4gICAgcmV0dXJuIHN1Y2Nlc3M7XG4gIH1cblxuICAvKipcbiAgICogUGxheSBzdHJlYW1cbiAgICogQHBhcmFtIHtBdWRpb1Jlc291cmNlPFRyYWNrPn0gW3Jlc291cmNlPXRoaXMuYXVkaW9SZXNvdXJjZV0gVGhlIGF1ZGlvIHJlc291cmNlIHRvIHBsYXlcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B1cz1mYWxzZV0gV2hldGhlciBvciBub3QgdG8gdXNlIG9wdXNcbiAgICogQHJldHVybnMge1Byb21pc2U8U3RyZWFtRGlzcGF0Y2hlcj59XG4gICAqL1xuICBhc3luYyBwbGF5U3RyZWFtKHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPiA9IHRoaXMuYXVkaW9SZXNvdXJjZSEpIHtcbiAgICBpZiAoIXJlc291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgTm9BdWRpb1Jlc291cmNlRXJyb3IoKTtcbiAgICB9XG4gICAgaWYgKHJlc291cmNlLmVuZGVkKSB7XG4gICAgICByZXR1cm4gdm9pZCB0aGlzLmVtaXQoJ2ZpbmlzaCcsIHJlc291cmNlKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmF1ZGlvUmVzb3VyY2UpIHRoaXMuYXVkaW9SZXNvdXJjZSA9IHJlc291cmNlO1xuICAgIGlmICh0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5SZWFkeSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZW50ZXJzU3RhdGUoXG4gICAgICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24sXG4gICAgICAgICAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLlJlYWR5LFxuICAgICAgICAgIHRoaXMuY29ubmVjdGlvblRpbWVvdXRcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB0aGlzLmF1ZGlvUGxheWVyLnBsYXkocmVzb3VyY2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlIGFzIEF1ZGlvUGxheWVyRXJyb3IpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgcGxheWJhY2sgdm9sdW1lXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgdm9sdW1lIGFtb3VudFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHNldFZvbHVtZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLmRzcC52b2x1bWUpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5kc3Audm9sdW1lLnNldFZvbHVtZSh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgdm9sdW1lXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgdm9sdW1lKCkge1xuICAgIGlmICghdGhpcy5kc3Audm9sdW1lKSByZXR1cm4gMTAwO1xuICAgIHJldHVybiB0aGlzLmRzcC52b2x1bWUudm9sdW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5YmFjayB0aW1lXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgc3RyZWFtVGltZSgpIHtcbiAgICBpZiAoIXRoaXMuYXVkaW9SZXNvdXJjZSkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9SZXNvdXJjZS5wbGF5YmFja0R1cmF0aW9uO1xuICB9XG59XG5cbmV4cG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgfTsiLCAiaW1wb3J0IHsgVHJhbnNmb3JtLCB0eXBlIFRyYW5zZm9ybUNhbGxiYWNrLCB0eXBlIFdyaXRhYmxlIH0gZnJvbSAnbm9kZTpzdHJlYW0nO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBzdHJlYW0gdGhhdCBjYW4gYmUgaW50ZXJjZXB0ZWQgYW5kIGNvbnN1bWVkIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBvcmlnaW5hbCBjb25zdW1lci5cbiAqIEBleGFtcGxlIGNvbnN0IHN0cmVhbSA9IG5ldyBJbnRlcmNlcHRlZFN0cmVhbSgpO1xuICpcbiAqIC8vIHJlYWwgY29uc3VtZXJcbiAqIHN0cmVhbS5waXBlKGZzLmNyZWF0ZVdyaXRlU3RyZWFtKCdmaWxlLnR4dCcpKTtcbiAqXG4gKiAvLyBtYW4gaW4gdGhlIG1pZGRsZSBjb25zdW1lclxuICogY29uc3QgbWFuSW5UaGVNaWRkbGUgPSBuZXcgV3JpdGFibGUoe1xuICogIHdyaXRlKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAqICAgY29uc29sZS5sb2coY2h1bmsudG9TdHJpbmcoKSk7XG4gKiAgIGNhbGxiYWNrKCk7XG4gKiAgfVxuICogfSk7XG4gKlxuICogLy8gc3RyZWFtLmludGVyY2VwdG9ycyBpcyBhIFNldCBvZiBXcml0YWJsZSBzdHJlYW1zXG4gKiBzdHJlYW0uaW50ZXJjZXB0b3JzLmFkZChtYW5JblRoZU1pZGRsZSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlcmNlcHRlZFN0cmVhbSBleHRlbmRzIFRyYW5zZm9ybSB7XG4gIHB1YmxpYyByZWFkb25seSBpbnRlcmNlcHRvcnMgPSBuZXcgU2V0PFdyaXRhYmxlPigpO1xuICAjaW50ZXJjZXB0aW5nID0gdHJ1ZTtcblxuICAvKipcbiAgICogU3RhcnQgaW50ZXJjZXB0aW5nIHRoZSBzdHJlYW0uIFRoaXMgaXMgdGhlIGRlZmF1bHQgc3RhdGUgb2YgSW50ZXJjZXB0ZWRTdHJlYW0uXG4gICAqL1xuICBwdWJsaWMgc3RhcnRJbnRlcmNlcHRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy4jaW50ZXJjZXB0aW5nID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIGludGVyY2VwdGluZyB0aGUgc3RyZWFtLiBUaGlzIHdpbGwgcHJldmVudCB0aGUgc3RyZWFtIGZyb20gYmVpbmcgY29uc3VtZWQgYnkgdGhlIGludGVyY2VwdG9ycy5cbiAgICogVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gdGVtcG9yYXJpbHkgc3RvcCB0aGUgaW50ZXJjZXB0aW9uLiBUaGUgc3RvcHBlZCBzdGF0ZSBjYW4gYmUgcmVzdW1lZCBieSBjYWxsaW5nIHN0YXJ0SW50ZXJjZXB0aW5nIGFnYWluLlxuICAgKi9cbiAgcHVibGljIHN0b3BJbnRlcmNlcHRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy4jaW50ZXJjZXB0aW5nID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgc3RyZWFtIGlzIGJlaW5nIGludGVyY2VwdGVkXG4gICAqL1xuICBwdWJsaWMgaXNJbnRlcmNlcHRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2ludGVyY2VwdGluZztcbiAgfVxuXG4gIHB1YmxpYyBfdHJhbnNmb3JtKFxuICBjaHVuazogQnVmZmVyLFxuICBlbmNvZGluZzogQnVmZmVyRW5jb2RpbmcsXG4gIGNhbGxiYWNrOiBUcmFuc2Zvcm1DYWxsYmFjaylcbiAgOiB2b2lkIHtcbiAgICB0aGlzLnB1c2goY2h1bmssIGVuY29kaW5nKTtcblxuICAgIGlmICh0aGlzLiNpbnRlcmNlcHRpbmcgJiYgdGhpcy5pbnRlcmNlcHRvcnMuc2l6ZSA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgY29uc3VtZXIgb2YgdGhpcy5pbnRlcmNlcHRvcnMpIHtcbiAgICAgICAgY29uc3VtZXIud3JpdGUoY2h1bmssIGVuY29kaW5nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgX2ZpbmFsKGNhbGxiYWNrOiBUcmFuc2Zvcm1DYWxsYmFjayk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgY29uc3VtZXIgb2YgdGhpcy5pbnRlcmNlcHRvcnMpIHtcbiAgICAgIGNvbnN1bWVyLmVuZCgpO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKCk7XG4gIH1cblxuICBwdWJsaWMgX2Rlc3Ryb3koZXJyb3I6IEVycm9yLCBjYWxsYmFjazogVHJhbnNmb3JtQ2FsbGJhY2spOiB2b2lkIHtcbiAgICBjb25zdCBpZ25vcmVFcnJvciA9IFN0cmluZyhlcnJvcikuaW5jbHVkZXMoJ0VSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFJyk7XG4gICAgY29uc3QgZXJyID0gaWdub3JlRXJyb3IgPyB1bmRlZmluZWQgOiBlcnJvcjtcblxuICAgIGZvciAoY29uc3QgY29uc3VtZXIgb2YgdGhpcy5pbnRlcmNlcHRvcnMpIHtcbiAgICAgIGNvbnN1bWVyLmRlc3Ryb3koZXJyKTtcbiAgICB9XG5cbiAgICB0aGlzLmludGVyY2VwdG9ycy5jbGVhcigpO1xuXG4gICAgY2FsbGJhY2soZXJyKTtcbiAgfVxufSIsICJpbXBvcnQgeyBRdWV1ZSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBOb1Jlc3VsdEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFRyYWNrIH0gZnJvbSAnLi4vZmFicmljL1RyYWNrJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIFRyYWNrU2tpcFJlYXNvbiB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YSA9IGFueT4ge1xuICBwdWJsaWMgdHJhY2tzID0gbmV3IFF1ZXVlPFRyYWNrPignTElGTycpO1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gIC8qKlxuICAgKiBDdXJyZW50IHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBjdXJyZW50VHJhY2soKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8ubWV0YWRhdGEgfHxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAodGhpcy5xdWV1ZSBhcyBhbnkpLl9fY3VycmVudCBhcyBUcmFjayB8IG51bGwpO1xuXG4gIH1cblxuICAvKipcbiAgICogTmV4dCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgbmV4dFRyYWNrKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLnRyYWNrcy5hdCgwKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBwcmV2aW91c1RyYWNrKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5hdCgwKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIGhpc3RvcnkgaXMgZGlzYWJsZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgZGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlSGlzdG9yeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplO1xuICB9XG5cbiAgcHVibGljIGdldFNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBoaXN0b3J5IGlzIGVtcHR5XG4gICAqL1xuICBwdWJsaWMgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZSA8IDE7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRyYWNrIHRvIHRyYWNrIGhpc3RvcnlcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBhZGRcbiAgICovXG4gIHB1YmxpYyBwdXNoKHRyYWNrOiBUcmFjayB8IFRyYWNrW10pIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMudHJhY2tzLmFkZCh0cmFjayk7XG5cbiAgICB0aGlzLnJlc2l6ZSgpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgaGlzdG9yeVxuICAgKi9cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMudHJhY2tzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogUGxheSB0aGUgbmV4dCB0cmFjayBpbiB0aGUgcXVldWVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBuZXh0KCkge1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5uZXh0VHJhY2s7XG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoJ05vIG5leHQgdHJhY2sgaW4gdGhlIHF1ZXVlJyk7XG4gICAgfVxuXG4gICAgdGhpcy5xdWV1ZS5ub2RlLnNraXAoe1xuICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uSGlzdG9yeU5leHQsXG4gICAgICBkZXNjcmlwdGlvbjogJ1NraXBwZWQgYnkgR3VpbGRRdWV1ZUhpc3RvcnkubmV4dCgpJ1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdGhlIHByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHByZXZpb3VzKHByZXNlcnZlQ3VycmVudCA9IHRydWUpIHtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMudHJhY2tzLmRpc3BhdGNoKCk7XG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoJ05vIHByZXZpb3VzIHRyYWNrIGluIHRoZSBxdWV1ZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnRUcmFjaztcblxuICAgIGF3YWl0IHRoaXMucXVldWUubm9kZS5wbGF5KHRyYWNrLCB7IHF1ZXVlOiBmYWxzZSB9KTtcbiAgICBpZiAoY3VycmVudCAmJiBwcmVzZXJ2ZUN1cnJlbnQpIHRoaXMucXVldWUubm9kZS5pbnNlcnQoY3VycmVudCwgMCk7XG4gIH1cblxuICAvKipcbiAgICogQWxpYXMgdG8gW0d1aWxkUXVldWVIaXN0b3J5XS5wcmV2aW91cygpXG4gICAqL1xuICBwdWJsaWMgYmFjayhwcmVzZXJ2ZUN1cnJlbnQgPSB0cnVlKSB7XG4gICAgcmV0dXJuIHRoaXMucHJldmlvdXMocHJlc2VydmVDdXJyZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNpemUgaGlzdG9yeSBzdG9yZVxuICAgKi9cbiAgcHVibGljIHJlc2l6ZSgpIHtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh0aGlzLnF1ZXVlLm1heEhpc3RvcnlTaXplKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnRyYWNrcy5zdG9yZS5sZW5ndGggPCB0aGlzLnF1ZXVlLm1heEhpc3RvcnlTaXplKSByZXR1cm47XG4gICAgdGhpcy50cmFja3Muc3RvcmUuc3BsaWNlKHRoaXMucXVldWUubWF4SGlzdG9yeVNpemUpO1xuICB9XG59IiwgImltcG9ydCB7IEF1ZGlvUmVzb3VyY2UsIFN0cmVhbVR5cGUgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgUXVlcnlSZXNvbHZlciwgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5pbXBvcnQgeyBVdGlsLCBWQUxJREFURV9RVUVVRV9DQVAgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFRyYWNrLCBUcmFja1Jlc29sdmFibGUgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgR3VpbGRRdWV1ZUV2ZW50LCBUcmFja1NraXBSZWFzb24gfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuaW1wb3J0IHsgc2V0VGltZW91dCBhcyB3YWl0Rm9yIH0gZnJvbSAndGltZXJzL3Byb21pc2VzJztcbmltcG9ydCB7IEFzeW5jUXVldWUgfSBmcm9tICcuLi91dGlscy9Bc3luY1F1ZXVlJztcbmltcG9ydCB7XG4gIEludmFsaWRBcmdUeXBlRXJyb3IsXG4gIE5vUmVzdWx0RXJyb3IsXG4gIE5vVm9pY2VDb25uZWN0aW9uRXJyb3IsXG4gIE91dE9mUmFuZ2VFcnJvciB9IGZyb21cbicuLi9lcnJvcnMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBDcmVhdGVTdHJlYW1PcHMgfSBmcm9tICcuLi9zdHJlYW0vU3RyZWFtRGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBFeHRyYWN0b3JTdHJlYW1hYmxlIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IE9nZ0RlbXV4ZXIsIE9wdXNEZWNvZGVyLCBXZWJtRGVtdXhlciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9vcHVzJztcbmltcG9ydCB7IFNlZWtFdmVudCB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuXG5leHBvcnQgY29uc3QgRkZNUEVHX1NSQVRFX1JFR0VYID0gL2FzZXRyYXRlPVxcZCtcXCooXFxkKFxcLlxcZCk/KS87XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyUHJvZ3Jlc3NiYXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIGl0IHNob3VsZCByZW5kZXIgdGltZSBjb2Rlc1xuICAgKi9cbiAgdGltZWNvZGVzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIElmIGl0IHNob3VsZCBjcmVhdGUgcHJvZ3Jlc3MgYmFyIGZvciB0aGUgd2hvbGUgcXVldWVcbiAgICovXG4gIGxlbmd0aD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBiYXIgbGVuZ3RoXG4gICAqL1xuICBsZWZ0Q2hhcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBlbGFwc2VkIHRpbWUgdHJhY2tcbiAgICovXG4gIHJpZ2h0Q2hhcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSByZW1haW5pbmcgdGltZSB0cmFja1xuICAgKi9cbiAgc2VwYXJhdG9yPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHNlcGFyYXRpb24gYmV0d2VlbiB0aW1lc3RhbXAgYW5kIGxpbmVcbiAgICovXG4gIGluZGljYXRvcj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBpbmRpY2F0b3JcbiAgICovXG4gIHF1ZXVlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZVBsYXlPcHRpb25zIHtcbiAgcXVldWU/OiBib29sZWFuO1xuICBzZWVrPzogbnVtYmVyO1xuICB0cmFuc2l0aW9uTW9kZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2tpcE9wdGlvbnMge1xuICByZWFzb246IFRyYWNrU2tpcFJlYXNvbjtcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJUaW1lc3RhbXAge1xuICBjdXJyZW50OiB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICB2YWx1ZTogbnVtYmVyO1xuICB9O1xuICB0b3RhbDoge1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgdmFsdWU6IG51bWJlcjtcbiAgfTtcbiAgcHJvZ3Jlc3M6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1Db25maWcge1xuICBkaXNwYXRjaGVyQ29uZmlnOiBDcmVhdGVTdHJlYW1PcHM7XG4gIHBsYXllckNvbmZpZzogUmVzb3VyY2VQbGF5T3B0aW9ucztcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlUGxheWVyTm9kZTxNZXRhID0gYW55PiB7XG4gICNwcm9ncmVzcyA9IDA7XG4gICNoYXNGRm1wZWdPcHRpbWl6YXRpb24gPSBmYWxzZTtcbiAgcHVibGljIHRhc2tzUXVldWUgPSBuZXcgQXN5bmNRdWV1ZSgpO1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7XG4gICAgdGhpcy4jaGFzRkZtcGVnT3B0aW1pemF0aW9uID0gL2xpYm9wdXM6ICh5ZXN8dHJ1ZSkvLnRlc3QoXG4gICAgICB0aGlzLnF1ZXVlLnBsYXllci5zY2FuRGVwcygpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBpbiBpZGxlIG1vZGVcbiAgICovXG4gIHB1YmxpYyBpc0lkbGUoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc0lkbGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBidWZmZXJpbmcgdGhlIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgaXNCdWZmZXJpbmcoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc0J1ZmZlcmluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBsYXlpbmcgYSB0cmFja1xuICAgKi9cbiAgcHVibGljIGlzUGxheWluZygpIHtcbiAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzUGxheWluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IHBhdXNlZFxuICAgKi9cbiAgcHVibGljIGlzUGF1c2VkKCkge1xuICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNQYXVzZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBwcm9ncmVzcyBoaXN0b3J5XG4gICAqL1xuICBwdWJsaWMgcmVzZXRQcm9ncmVzcygpIHtcbiAgICB0aGlzLiNwcm9ncmVzcyA9IDA7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHBsYXllciBwcm9ncmVzc1xuICAgKi9cbiAgcHVibGljIHNldFByb2dyZXNzKHByb2dyZXNzOiBudW1iZXIpIHtcbiAgICB0aGlzLiNwcm9ncmVzcyA9IHByb2dyZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzdHJlYW0gdGltZSBmb3IgY3VycmVudCBzZXNzaW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0cmVhbVRpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uc3RyZWFtVGltZSA/PyAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgcGxheWJhY2sgZHVyYXRpb24gd2l0aCBoaXN0b3J5IGluY2x1ZGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBsYXliYWNrVGltZSgpIHtcbiAgICBpZiAodGhpcy5xdWV1ZS5maWx0ZXJzLnNlZWtlcikge1xuICAgICAgY29uc3QgcG9zID0gdGhpcy5xdWV1ZS5maWx0ZXJzLnNlZWtlci5nZXRQb3NpdGlvbigpO1xuICAgICAgaWYgKHBvcyA+IDApIHJldHVybiBwb3M7XG4gICAgfVxuXG4gICAgY29uc3QgZHVyID0gdGhpcy4jcHJvZ3Jlc3MgKyB0aGlzLnN0cmVhbVRpbWU7XG5cbiAgICByZXR1cm4gZHVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkdXJhdGlvbiBtdWx0aXBsaWVyXG4gICAqL1xuICBwdWJsaWMgZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkge1xuICAgIGNvbnN0IHNyYXRlRmlsdGVycyA9IHRoaXMucXVldWUuZmlsdGVycy5mZm1wZWcuXG4gICAgdG9BcnJheSgpLlxuICAgIGZpbHRlcigoZmYpID0+IEZGTVBFR19TUkFURV9SRUdFWC50ZXN0KGZmKSk7XG4gICAgY29uc3QgbXVsdGlwbGllcnMgPSBzcmF0ZUZpbHRlcnMuXG4gICAgbWFwKChtKSA9PiB7XG4gICAgICByZXR1cm4gcGFyc2VGbG9hdChGRk1QRUdfU1JBVEVfUkVHRVguZXhlYyhtKT8uWzFdIGFzIHN0cmluZyk7XG4gICAgfSkuXG4gICAgZmlsdGVyKChmKSA9PiAhaXNOYU4oZikpO1xuXG4gICAgcmV0dXJuICFtdWx0aXBsaWVycy5sZW5ndGggP1xuICAgIDEgOlxuICAgIG11bHRpcGxpZXJzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnQpID0+IGN1cnJlbnQgKyBhY2N1bXVsYXRvcik7XG4gIH1cblxuICAvKipcbiAgICogRXN0aW1hdGVkIHByb2dyZXNzIG9mIHRoZSBwbGF5ZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgZXN0aW1hdGVkUGxheWJhY2tUaW1lKCkge1xuICAgIGNvbnN0IGR1ciA9IHRoaXMucGxheWJhY2tUaW1lO1xuICAgIGNvbnN0IHZhbCA9IHRoaXMuZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkgKiBkdXI7XG5cbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlZCB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgcGxheWVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVzdGltYXRlZER1cmF0aW9uKCkge1xuICAgIGNvbnN0IGR1ciA9IHRoaXMudG90YWxEdXJhdGlvbjtcblxuICAgIC8vIGR1cmF0aW9uIG11bHRpcGxpZXIgY2hlY2tzIGZmbXBlZyBmaWx0ZXJzIHRoYXQgbWF5IGFmZmVjdCB0aGUgZHVyYXRpb25cbiAgICBjb25zdCB2YWwgPSBNYXRoLnJvdW5kKGR1ciAvIHRoaXMuZ2V0RHVyYXRpb25NdWx0aXBsaWVyKCkpO1xuXG4gICAgLy8gd2UgYWxzbyBuZWVkIHRvIGNoZWNrIGlmIHdlIGhhdmUgYSBuYXRpdmUgcmVzYW1wbGVyIGZpbHRlciBhcyBpdCBtYXkgYWxzbyBhZmZlY3QgdGhlIGR1cmF0aW9uXG4gICAgaWYgKHRoaXMucXVldWUuZmlsdGVycy5yZXNhbXBsZXIpIHtcbiAgICAgIC8vIGdldCB0aGUgcmVzYW1wbGVyIHJhdGlvIGlmIHdlIGhhdmUgb25lXG4gICAgICBjb25zdCByYXRpbyA9IHRoaXMucXVldWUuZmlsdGVycy5yZXNhbXBsZXIuZ2V0UmF0aW8oKTtcbiAgICAgIGlmIChyYXRpbyA8PSAwKSByZXR1cm4gdmFsO1xuXG4gICAgICByZXR1cm4gTWF0aC5yb3VuZCh2YWwgLyByYXRpbyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb3RhbCBkdXJhdGlvbiBvZiB0aGUgY3VycmVudCBhdWRpbyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldCB0b3RhbER1cmF0aW9uKCkge1xuICAgIGNvbnN0IHByZWZlcnNCcmlkZ2VkTWV0YWRhdGEgPSB0aGlzLnF1ZXVlLm9wdGlvbnMucHJlZmVyQnJpZGdlZE1ldGFkYXRhO1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2s7XG5cbiAgICBpZiAocHJlZmVyc0JyaWRnZWRNZXRhZGF0YSkge1xuICAgICAgY29uc3QgdHJhY2tIYXNMZWdhY3lNZXRhZGF0YSA9XG4gICAgICB0cmFjaz8ubWV0YWRhdGEgIT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHRyYWNrLm1ldGFkYXRhID09PSAnb2JqZWN0JyAmJlxuICAgICAgJ2JyaWRnZScgaW4gdHJhY2subWV0YWRhdGEgJiZcbiAgICAgIHRyYWNrLm1ldGFkYXRhLmJyaWRnZSAhPSBudWxsO1xuICAgICAgY29uc3QgdHJhY2tIYXNNZXRhZGF0YSA9IHRyYWNrPy5icmlkZ2VkVHJhY2sgIT0gbnVsbDtcblxuICAgICAgaWYgKHRyYWNrSGFzTGVnYWN5TWV0YWRhdGEgfHwgdHJhY2tIYXNNZXRhZGF0YSkge1xuICAgICAgICBjb25zdCBkdXJhdGlvbiA9XG4gICAgICAgIHRyYWNrLmJyaWRnZWRUcmFjaz8uZHVyYXRpb25NUyA/P1xuICAgICAgICAoXG4gICAgICAgIHRyYWNrIGFzIFRyYWNrPHtcbiAgICAgICAgICBicmlkZ2U6IHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiBudW1iZXI7XG4gICAgICAgICAgfTtcbiAgICAgICAgfT4pLlxuICAgICAgICBtZXRhZGF0YT8uYnJpZGdlLmR1cmF0aW9uO1xuXG4gICAgICAgIGlmIChUeXBlVXRpbC5pc051bWJlcihkdXJhdGlvbikpIHJldHVybiBkdXJhdGlvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJhY2s/LmR1cmF0aW9uTVMgPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc3RyZWFtIHByb2dyZXNzXG4gICAqIEBwYXJhbSBpZ25vcmVGaWx0ZXJzIElnbm9yZSBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0VGltZXN0YW1wKGlnbm9yZUZpbHRlcnMgPSBmYWxzZSk6IFBsYXllclRpbWVzdGFtcCB8IG51bGwge1xuICAgIGlmICghdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2spIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgY3VycmVudCA9IGlnbm9yZUZpbHRlcnMgP1xuICAgIHRoaXMucGxheWJhY2tUaW1lIDpcbiAgICB0aGlzLmVzdGltYXRlZFBsYXliYWNrVGltZTtcbiAgICBjb25zdCB0b3RhbCA9IGlnbm9yZUZpbHRlcnMgPyB0aGlzLnRvdGFsRHVyYXRpb24gOiB0aGlzLmVzdGltYXRlZER1cmF0aW9uO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnQ6IHtcbiAgICAgICAgbGFiZWw6IFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVMoY3VycmVudCkpLFxuICAgICAgICB2YWx1ZTogY3VycmVudFxuICAgICAgfSxcbiAgICAgIHRvdGFsOiB7XG4gICAgICAgIGxhYmVsOiBVdGlsLmJ1aWxkVGltZUNvZGUoVXRpbC5wYXJzZU1TKHRvdGFsKSksXG4gICAgICAgIHZhbHVlOiB0b3RhbFxuICAgICAgfSxcbiAgICAgIHByb2dyZXNzOiBNYXRoLnJvdW5kKGN1cnJlbnQgLyB0b3RhbCAqIDEwMClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBwcm9ncmVzcyBiYXIgZm9yIGN1cnJlbnQgcHJvZ3Jlc3NcbiAgICogQHBhcmFtIG9wdGlvbnMgUHJvZ3Jlc3MgYmFyIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVQcm9ncmVzc0JhcihvcHRpb25zPzogUGxheWVyUHJvZ3Jlc3NiYXJPcHRpb25zKSB7XG4gICAgY29uc3QgdGltZXN0YW1wID0gdGhpcy5nZXRUaW1lc3RhbXAoKTtcbiAgICBpZiAoIXRpbWVzdGFtcCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qge1xuICAgICAgaW5kaWNhdG9yID0gJ1xcdXsxRjUxOH0nLFxuICAgICAgbGVmdENoYXIgPSAnXFx1MjVBQycsXG4gICAgICByaWdodENoYXIgPSAnXFx1MjVBQycsXG4gICAgICBsZW5ndGggPSAxNSxcbiAgICAgIHRpbWVjb2RlcyA9IHRydWUsXG4gICAgICBzZXBhcmF0b3IgPSAnXFx1MjUwMydcbiAgICB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgICBpZiAoaXNOYU4obGVuZ3RoKSB8fCBsZW5ndGggPCAwIHx8ICFOdW1iZXIuaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgdGhyb3cgbmV3IE91dE9mUmFuZ2VFcnJvcihcbiAgICAgICAgJ1tQbGF5ZXJQcm9ncmVzc0Jhck9wdGlvbnMubGVuZ3RoXScsXG4gICAgICAgIFN0cmluZyhsZW5ndGgpLFxuICAgICAgICAnMCcsXG4gICAgICAgICdGaW5pdGUgTnVtYmVyJ1xuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSBNYXRoLnJvdW5kKFxuICAgICAgdGltZXN0YW1wLmN1cnJlbnQudmFsdWUgLyB0aW1lc3RhbXAudG90YWwudmFsdWUgKiBsZW5ndGhcbiAgICApO1xuICAgIGlmIChpbmRleCA+PSAxICYmIGluZGV4IDw9IGxlbmd0aCkge1xuICAgICAgY29uc3QgYmFyID0gbGVmdENoYXIucmVwZWF0KGluZGV4IC0gMSkuc3BsaXQoJycpO1xuICAgICAgYmFyLnB1c2goaW5kaWNhdG9yKTtcbiAgICAgIGJhci5wdXNoKHJpZ2h0Q2hhci5yZXBlYXQobGVuZ3RoIC0gaW5kZXgpKTtcbiAgICAgIGlmICh0aW1lY29kZXMpIHtcbiAgICAgICAgcmV0dXJuIGAke3RpbWVzdGFtcC5jdXJyZW50LmxhYmVsfSAke3NlcGFyYXRvcn0gJHtiYXIuam9pbihcbiAgICAgICAgICAnJ1xuICAgICAgICApfSAke3NlcGFyYXRvcn0gJHt0aW1lc3RhbXAudG90YWwubGFiZWx9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBgJHtiYXIuam9pbignJyl9YDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRpbWVjb2Rlcykge1xuICAgICAgICByZXR1cm4gYCR7XG4gICAgICAgIHRpbWVzdGFtcC5jdXJyZW50LmxhYmVsfSAke1xuICAgICAgICBzZXBhcmF0b3J9ICR7aW5kaWNhdG9yfSR7cmlnaHRDaGFyLnJlcGVhdChcbiAgICAgICAgICBsZW5ndGggLSAxXG4gICAgICAgICl9ICR7c2VwYXJhdG9yfSAke3RpbWVzdGFtcC50b3RhbC5sYWJlbH1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGAke2luZGljYXRvcn0ke3JpZ2h0Q2hhci5yZXBlYXQobGVuZ3RoIC0gMSl9YDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VlayB0aGUgcGxheWVyXG4gICAqIEBwYXJhbSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gdG8gc2VlayB0b1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlZWsoZHVyYXRpb246IG51bWJlcikge1xuICAgIGlmICghdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2spIHJldHVybiBmYWxzZTtcbiAgICBpZiAoZHVyYXRpb24gPT09IHRoaXMuZXN0aW1hdGVkUGxheWJhY2tUaW1lKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZHVyYXRpb24gPiB0aGlzLnRvdGFsRHVyYXRpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnNraXAoe1xuICAgICAgICByZWFzb246IFRyYWNrU2tpcFJlYXNvbi5TRUVLX09WRVJfVEhSRVNIT0xELFxuICAgICAgICBkZXNjcmlwdGlvbjogbmV3IE91dE9mUmFuZ2VFcnJvcihcbiAgICAgICAgICAnW2R1cmF0aW9uXScsXG4gICAgICAgICAgU3RyaW5nKGR1cmF0aW9uKSxcbiAgICAgICAgICAnMCcsXG4gICAgICAgICAgU3RyaW5nKHRoaXMudG90YWxEdXJhdGlvbilcbiAgICAgICAgKS5tZXNzYWdlXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGR1cmF0aW9uIDwgMCkgZHVyYXRpb24gPSAwO1xuXG4gICAgY29uc3Qgc2Vla2VyID0gdGhpcy5xdWV1ZS5maWx0ZXJzLnNlZWtlcjtcblxuICAgIGlmIChzZWVrZXIpIHtcbiAgICAgIHNlZWtlci5zZWVrKGR1cmF0aW9uKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnF1ZXVlLmZpbHRlcnMudHJpZ2dlclJlcGxheShkdXJhdGlvbikudGhlbigodikgPT4ge1xuICAgICAgaWYgKHYpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJTZWVrLCB0aGlzLnF1ZXVlLCB7XG4gICAgICAgICAgY3VycmVudFBvc2l0aW9uOiB0aGlzLmVzdGltYXRlZFBsYXliYWNrVGltZSxcbiAgICAgICAgICBzZWVrVGFyZ2V0OiBkdXJhdGlvbixcbiAgICAgICAgICB0b3RhbER1cmF0aW9uOiB0aGlzLmVzdGltYXRlZER1cmF0aW9uXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXJyZW50IHZvbHVtZVxuICAgKi9cbiAgcHVibGljIGdldCB2b2x1bWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8udm9sdW1lID8/IDEwMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdm9sdW1lXG4gICAqIEBwYXJhbSB2b2wgVm9sdW1lIGFtb3VudCB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRWb2x1bWUodm9sOiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHJlcyA9IHRoaXMucXVldWUuZGlzcGF0Y2hlci5zZXRWb2x1bWUodm9sKTtcbiAgICBpZiAocmVzKSB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lID0gdm9sO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGJpdCByYXRlXG4gICAqIEBwYXJhbSByYXRlIFRoZSBiaXQgcmF0ZSB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRCaXRyYXRlKHJhdGU6IG51bWJlciB8ICdhdXRvJykge1xuICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYXVkaW9SZXNvdXJjZT8uZW5jb2Rlcj8uc2V0Qml0cmF0ZShcbiAgICAgIHJhdGUgPT09ICdhdXRvJyA/IHRoaXMucXVldWUuY2hhbm5lbD8uYml0cmF0ZSA/PyA2NDAwMCA6IHJhdGVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBwYXVzZWQgc3RhdGVcbiAgICogQHBhcmFtIHN0YXRlIFRoZSBzdGF0ZVxuICAgKi9cbiAgcHVibGljIHNldFBhdXNlZChzdGF0ZTogYm9vbGVhbikge1xuICAgIGlmIChzdGF0ZSkgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucGF1c2UodHJ1ZSkgfHwgZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucmVzdW1lKCkgfHwgZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUGF1c2UgdGhlIHBsYXliYWNrXG4gICAqL1xuICBwdWJsaWMgcGF1c2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0UGF1c2VkKHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZSB0aGUgcGxheWJhY2tcbiAgICovXG4gIHB1YmxpYyByZXN1bWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0UGF1c2VkKGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTa2lwIGN1cnJlbnQgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBza2lwKG9wdGlvbnM/OiBTa2lwT3B0aW9ucykge1xuICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaztcbiAgICBpZiAoIXRyYWNrKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5xdWV1ZS5zZXRUcmFuc2l0aW9uaW5nKGZhbHNlKTtcbiAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuZW5kKCk7XG4gICAgY29uc3QgeyByZWFzb24sIGRlc2NyaXB0aW9uIH0gPSBvcHRpb25zIHx8IHtcbiAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLk1hbnVhbCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHRyYWNrIHdhcyBza2lwcGVkIG1hbnVhbGx5J1xuICAgIH07XG4gICAgdGhpcy5xdWV1ZS5lbWl0KFxuICAgICAgR3VpbGRRdWV1ZUV2ZW50LlBsYXllclNraXAsXG4gICAgICB0aGlzLnF1ZXVlLFxuICAgICAgdHJhY2ssXG4gICAgICByZWFzb24sXG4gICAgICBkZXNjcmlwdGlvblxuICAgICk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBnaXZlbiB0cmFjayBmcm9tIHF1ZXVlXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSBlbWl0RXZlbnQgV2hldGhlciBvciBub3QgdG8gZW1pdCB0aGUgZXZlbnQgQGRlZmF1bHRWYWx1ZSB0cnVlXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlKHRyYWNrOiBUcmFja1Jlc29sdmFibGUsIGVtaXRFdmVudCA9IHRydWUpIHtcbiAgICBjb25zdCBmb3VuZFRyYWNrID0gdGhpcy5xdWV1ZS50cmFja3MuZmluZCgodCwgaWR4KSA9PiB7XG4gICAgICBpZiAodHJhY2sgaW5zdGFuY2VvZiBUcmFjayB8fCB0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJyA/IHRyYWNrIDogdHJhY2suaWQpID09PSB0LmlkO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHJldHVybiB0cmFjayA9PT0gdC5pZDtcbiAgICAgIHJldHVybiBpZHggPT09IHRyYWNrO1xuICAgIH0pO1xuICAgIGlmICghZm91bmRUcmFjaykgcmV0dXJuIG51bGw7XG5cbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5yZW1vdmVPbmUoKHQpID0+IHQuaWQgPT09IGZvdW5kVHJhY2suaWQpO1xuXG4gICAgaWYgKGVtaXRFdmVudClcbiAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tSZW1vdmUsIHRoaXMucXVldWUsIGZvdW5kVHJhY2spO1xuXG4gICAgcmV0dXJuIGZvdW5kVHJhY2s7XG4gIH1cblxuICAvKipcbiAgICogSnVtcCB0byBzcGVjaWZpYyB0cmFjayBvbiB0aGUgcXVldWVcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBqdW1wIHRvIHdpdGhvdXQgcmVtb3Zpbmcgb3RoZXIgdHJhY2tzXG4gICAqL1xuICBwdWJsaWMganVtcCh0cmFjazogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmVtb3ZlKHRyYWNrLCBmYWxzZSk7XG4gICAgaWYgKCFyZW1vdmVkKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUudW5zaGlmdChyZW1vdmVkKTtcbiAgICByZXR1cm4gdGhpcy5za2lwKHtcbiAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLkp1bXAsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSB0cmFjayB3YXMganVtcGVkIHRvIG1hbnVhbGx5J1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0cmFjayBwb3NpdGlvblxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0VHJhY2tQb3NpdGlvbih0cmFjazogVHJhY2tSZXNvbHZhYmxlKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS50cmFja3MudG9BcnJheSgpLmZpbmRJbmRleCgodCwgaWR4KSA9PiB7XG4gICAgICBpZiAodHJhY2sgaW5zdGFuY2VvZiBUcmFjayB8fCB0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJyA/IHRyYWNrIDogdHJhY2suaWQpID09PSB0LmlkO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHJldHVybiB0cmFjayA9PT0gdC5pZDtcbiAgICAgIHJldHVybiBpZHggPT09IHRyYWNrO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNraXAgdG8gdGhlIGdpdmVuIHRyYWNrLCByZW1vdmluZyBvdGhlcnMgb24gdGhlIHdheVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHNraXAgdG9cbiAgICovXG4gIHB1YmxpYyBza2lwVG8odHJhY2s6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IGlkeCA9IHRoaXMuZ2V0VHJhY2tQb3NpdGlvbih0cmFjayk7XG4gICAgaWYgKGlkeCA8IDApIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yZW1vdmUoaWR4KTtcbiAgICBpZiAoIXJlbW92ZWQpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB0b1JlbW92ZSA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlLmZpbHRlcigoXywgaSkgPT4gaSA8PSBpZHgpO1xuICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnNwbGljZSgwLCBpZHgsIHJlbW92ZWQpO1xuICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja3NSZW1vdmUsIHRoaXMucXVldWUsIHRvUmVtb3ZlKTtcbiAgICByZXR1cm4gdGhpcy5za2lwKHtcbiAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLlNraXBUbyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHBsYXllciB3YXMgc2tpcHBlZCB0byBhbm90aGVyIHRyYWNrIG1hbnVhbGx5J1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCBhIHRyYWNrIG9uIHRoZSBnaXZlbiBwb3NpdGlvbiBpbiBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGluc2VydFxuICAgKiBAcGFyYW0gaW5kZXggVGhlIHBvc2l0aW9uIHRvIGluc2VydCB0bywgZGVmYXVsdHMgdG8gMC5cbiAgICovXG4gIHB1YmxpYyBpbnNlcnQodHJhY2s6IFRyYWNrLCBpbmRleCA9IDApIHtcbiAgICBpZiAoISh0cmFjayBpbnN0YW5jZW9mIFRyYWNrKSlcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICd0cmFjayB2YWx1ZScsXG4gICAgICAnaW5zdGFuY2Ugb2YgVHJhY2snLFxuICAgICAgU3RyaW5nKHRyYWNrKVxuICAgICk7XG4gICAgVkFMSURBVEVfUVVFVUVfQ0FQKHRoaXMucXVldWUsIHRyYWNrKTtcbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZS5zcGxpY2UoaW5kZXgsIDAsIHRyYWNrKTtcbiAgICBpZiAoIXRoaXMucXVldWUub3B0aW9ucy5ub0VtaXRJbnNlcnQpIHtcbiAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja0FkZCwgdGhpcy5xdWV1ZSwgdHJhY2spO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gbW92ZVxuICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIG1vdmUgdG9cbiAgICovXG4gIHB1YmxpYyBtb3ZlKGZyb206IFRyYWNrUmVzb2x2YWJsZSwgdG86IG51bWJlcikge1xuICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJlbW92ZShmcm9tKTtcbiAgICBpZiAoIXJlbW92ZWQpIHtcbiAgICAgIHRocm93IG5ldyBOb1Jlc3VsdEVycm9yKCdpbnZhbGlkIHRyYWNrIHRvIG1vdmUnKTtcbiAgICB9XG4gICAgdGhpcy5pbnNlcnQocmVtb3ZlZCwgdG8pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgYSB0cmFjayBpbiB0aGUgcXVldWVcbiAgICogQHBhcmFtIGZyb20gVGhlIHRyYWNrIHRvIGNsb25lXG4gICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gY2xvbmUgYXRcbiAgICovXG4gIHB1YmxpYyBjb3B5KGZyb206IFRyYWNrUmVzb2x2YWJsZSwgdG86IG51bWJlcikge1xuICAgIGNvbnN0IHNyYyA9IHRoaXMucXVldWUudHJhY2tzLmF0KHRoaXMuZ2V0VHJhY2tQb3NpdGlvbihmcm9tKSk7XG4gICAgaWYgKCFzcmMpIHtcbiAgICAgIHRocm93IG5ldyBOb1Jlc3VsdEVycm9yKCdpbnZhbGlkIHRyYWNrIHRvIGNvcHknKTtcbiAgICB9XG4gICAgdGhpcy5pbnNlcnQoc3JjLCB0byk7XG4gIH1cblxuICAvKipcbiAgICogU3dhcCB0d28gdHJhY2tzIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZmlyc3QgVGhlIGZpcnN0IHRyYWNrIHRvIHN3YXBcbiAgICogQHBhcmFtIHNlY29uZCBUaGUgc2Vjb25kIHRyYWNrIHRvIHN3YXBcbiAgICovXG4gIHB1YmxpYyBzd2FwKGZpcnN0OiBUcmFja1Jlc29sdmFibGUsIHNlY29uZDogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgY29uc3Qgc3JjID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKGZpcnN0KTtcbiAgICBpZiAoc3JjIDwgMCkgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoJ2ludmFsaWQgc3JjIHRyYWNrIHRvIHN3YXAnKTtcblxuICAgIGNvbnN0IGRlc3QgPSB0aGlzLmdldFRyYWNrUG9zaXRpb24oc2Vjb25kKTtcbiAgICBpZiAoZGVzdCA8IDApIHRocm93IG5ldyBOb1Jlc3VsdEVycm9yKCdpbnZhbGlkIGRlc3QgdHJhY2sgdG8gc3dhcCcpO1xuXG4gICAgY29uc3Qgc3JjVCA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlW3NyY107XG4gICAgY29uc3QgZGVzdFQgPSB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtkZXN0XTtcblxuICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlW3NyY10gPSBkZXN0VDtcbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZVtkZXN0XSA9IHNyY1Q7XG4gIH1cblxuICAvKipcbiAgICogU3RvcCB0aGUgcGxheWJhY2tcbiAgICogQHBhcmFtIGZvcmNlIFdoZXRoZXIgb3Igbm90IHRvIGZvcmNlZnVsbHkgc3RvcCB0aGUgcGxheWJhY2tcbiAgICovXG4gIHB1YmxpYyBzdG9wKGZvcmNlID0gZmFsc2UpIHtcbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5jbGVhcigpO1xuICAgIHRoaXMucXVldWUuaGlzdG9yeS5jbGVhcigpO1xuICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmVuZCgpO1xuICAgIGlmIChmb3JjZSkge1xuICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLmRlc3Ryb3koKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdWV1ZS5vcHRpb25zLmxlYXZlT25TdG9wKSB7XG4gICAgICBjb25zdCB0bTogTm9kZUpTLlRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNQbGF5aW5nKCkgfHwgdGhpcy5xdWV1ZS50cmFja3Muc2l6ZSkgcmV0dXJuIGNsZWFyVGltZW91dCh0bSk7XG4gICAgICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZGVzdHJveSgpO1xuICAgICAgfSwgdGhpcy5xdWV1ZS5vcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24pLnVucmVmKCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgdGhlIHNvdXJjZSB0byBzZWVrXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBzZWVrIHBhcmFtZXRlcnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXF1ZXN0U2VlayhkYXRhOiBTZWVrRXZlbnQpIHtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMucXVldWUuY3VycmVudFRyYWNrO1xuICAgIGlmICghdHJhY2spIHJldHVybiBmYWxzZTtcblxuICAgIGlmICh0cmFjay5zZWVrYWJsZSkge1xuICAgICAgcmV0dXJuIHRyYWNrLnNlZWsoZGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucXVldWUuZmlsdGVycy50cmlnZ2VyUmVwbGF5KGRhdGEucG9zaXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdGhlIGdpdmVuIHRyYWNrXG4gICAqIEBwYXJhbSByZXMgVGhlIHRyYWNrIHRvIHBsYXlcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgcGxheWluZyB0aGUgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwbGF5KHJlcz86IFRyYWNrIHwgbnVsbCwgb3B0aW9ucz86IFJlc291cmNlUGxheU9wdGlvbnMpIHtcbiAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8udm9pY2VDb25uZWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgTm9Wb2ljZUNvbm5lY3Rpb25FcnJvcigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICBgUmVjZWl2ZWQgcGxheSByZXF1ZXN0IGZyb20gZ3VpbGQgJHt0aGlzLnF1ZXVlLmd1aWxkLm5hbWV9IChJRDogJHt0aGlzLnF1ZXVlLmd1aWxkLmlkfSlgXG4gICAgKTtcblxuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHF1ZXVlOiB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjayAhPSBudWxsLFxuICAgICAgICB0cmFuc2l0aW9uTW9kZTogZmFsc2UsXG4gICAgICAgIHNlZWs6IDBcbiAgICAgIH0gYXMgUmVzb3VyY2VQbGF5T3B0aW9ucyxcbiAgICAgIG9wdGlvbnNcbiAgICApITtcblxuICAgIGlmIChyZXMgJiYgb3B0aW9ucy5xdWV1ZSkge1xuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAnUmVxdWVzdGVkIG9wdGlvbiByZXF1aXJlcyB0byBxdWV1ZSB0aGUgdHJhY2ssIGFkZGluZyB0aGUgZ2l2ZW4gdHJhY2sgdG8gcXVldWUgaW5zdGVhZC4uLidcbiAgICAgICk7XG4gICAgICByZXR1cm4gdGhpcy5xdWV1ZS5hZGRUcmFjayhyZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYWNrID0gcmVzIHx8IHRoaXMucXVldWUudHJhY2tzLmRpc3BhdGNoKCk7XG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgTm9SZXN1bHRFcnJvcihcbiAgICAgICAgJ1BsYXkgcmVxdWVzdCByZWNlaXZlZCBidXQgdHJhY2sgd2FzIG5vdCBwcm92aWRlZCdcbiAgICAgICk7XG4gICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkVycm9yLCB0aGlzLnF1ZXVlLCBlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICdSZXF1ZXN0ZWQgb3B0aW9uIHJlcXVpcmVzIHRvIHBsYXkgdGhlIHRyYWNrLCBpbml0aWFsaXppbmcuLi4nXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBhc3NpZ25lZFJlc291cmNlID0gdHJhY2sucmVzb3VyY2U7XG5cbiAgICAgIGlmIChhc3NpZ25lZFJlc291cmNlKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICdUcmFjayBoYXMgYW4gYXVkaW8gcmVzb3VyY2UgYXNzaWduZWQsIHBsYXllciB3aWxsIG5vdyBwbGF5IHRoZSByZXNvdXJjZSBkaXJlY3RseS4uLidcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnF1ZXVlLnNldFRyYW5zaXRpb25pbmcoISFvcHRpb25zLnRyYW5zaXRpb25Nb2RlKTtcblxuICAgICAgICByZXR1cm4gdGhpcy4jcGVyZm9ybVBsYXkoYXNzaWduZWRSZXNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhgSW5pdGlhdGluZyBzdHJlYW0gZXh0cmFjdGlvbiBwcm9jZXNzLi4uYCk7XG4gICAgICBjb25zdCBzcmMgPSB0cmFjay5yYXc/LnNvdXJjZSB8fCB0cmFjay5zb3VyY2U7XG4gICAgICBjb25zdCBxdDogU2VhcmNoUXVlcnlUeXBlID1cbiAgICAgIHRyYWNrLnF1ZXJ5VHlwZSB8fCAoXG4gICAgICBzcmMgPT09ICdzcG90aWZ5JyA/XG4gICAgICAnc3BvdGlmeVNvbmcnIDpcbiAgICAgIHNyYyA9PT0gJ2FwcGxlX211c2ljJyA/XG4gICAgICAnYXBwbGVNdXNpY1NvbmcnIDpcbiAgICAgIHNyYyk7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgIGBFeGVjdXRpbmcgb25CZWZvcmVDcmVhdGVTdHJlYW0gaG9vayAoUXVlcnlUeXBlOiAke3F0fSkuLi5gXG4gICAgICApO1xuXG4gICAgICBjb25zdCBzdHJlYW1TcmMgPSB7XG4gICAgICAgIGVycm9yOiBudWxsIGFzIEVycm9yIHwgbnVsbCxcbiAgICAgICAgc3RyZWFtOiBudWxsIGFzIEV4dHJhY3RvclN0cmVhbWFibGUgfCBudWxsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCB0aGlzLnF1ZXVlLlxuICAgICAgb25CZWZvcmVDcmVhdGVTdHJlYW0/Lih0cmFjaywgcXQgfHwgJ2FyYml0cmFyeScsIHRoaXMucXVldWUpLlxuICAgICAgdGhlbihcbiAgICAgICAgKHMpID0+IHtcbiAgICAgICAgICBpZiAocykge1xuICAgICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSA9IHM7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoZTogRXJyb3IpID0+IHN0cmVhbVNyYy5lcnJvciA9IGVcbiAgICAgICk7XG5cbiAgICAgIC8vIHRocm93IGlmICdvbkJlZm9yZUNyZWF0ZVN0cmVhbScgcGFuaWNzXG4gICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0gJiYgc3RyZWFtU3JjLmVycm9yKVxuICAgICAgcmV0dXJuIHRoaXMuI3Rocm93KHRyYWNrLCBzdHJlYW1TcmMuZXJyb3IpO1xuXG4gICAgICAvLyBkZWZhdWx0IGJlaGF2aW9yIHdoZW4gJ29uQmVmb3JlQ3JlYXRlU3RyZWFtJyBkaWQgbm90IHBhbmljXG4gICAgICBpZiAoIXN0cmVhbVNyYy5zdHJlYW0pIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgJ0ZhaWxlZCB0byBnZXQgc3RyZWFtIGZyb20gb25CZWZvcmVDcmVhdGVTdHJlYW0sIGF0dGVtcHRpbmcgdG8gZXh0cmFjdCBzdHJlYW0gdXNpbmcgZXh0cmFjdG9ycy4uLidcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5wbGF5ZXIuZXh0cmFjdG9ycy5jb250ZXh0LnByb3ZpZGUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6IGNyeXB0by5yYW5kb21VVUlEKCksXG4gICAgICAgICAgICBhdHRlbXB0ZWRFeHRyYWN0b3JzOiBuZXcgU2V0PHN0cmluZz4oKSxcbiAgICAgICAgICAgIGJyaWRnZUF0dGVtcHRlZEV4dHJhY3RvcnM6IG5ldyBTZXQ8c3RyaW5nPigpXG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PlxuICAgICAgICAgIHRoaXMuI2NyZWF0ZUdlbmVyaWNTdHJlYW0odHJhY2spLnRoZW4oXG4gICAgICAgICAgICAocikgPT4ge1xuICAgICAgICAgICAgICBpZiAocj8ucmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSA9IDxSZWFkYWJsZT4gci5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKHI/LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtU3JjLmVycm9yID0gci5lcnJvcjtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gc3RyZWFtU3JjLmVycm9yID0gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZTogRXJyb3IpID0+IHN0cmVhbVNyYy5lcnJvciA9IGVcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSkgcmV0dXJuIHRoaXMuI3Rocm93KHRyYWNrLCBzdHJlYW1TcmMuZXJyb3IpO1xuXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMuc2VlayA9PT0gJ251bWJlcicgJiYgb3B0aW9ucy5zZWVrID49IDApIHtcbiAgICAgICAgdGhpcy4jcHJvZ3Jlc3MgPSBvcHRpb25zLnNlZWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLiNwcm9ncmVzcyA9IDA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyYWNrU3RyZWFtQ29uZmlnOiBTdHJlYW1Db25maWcgPSB7XG4gICAgICAgIGRpc3BhdGNoZXJDb25maWc6IHtcbiAgICAgICAgICBkaXNhYmxlQmlxdWFkOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUJpcXVhZCxcbiAgICAgICAgICBkaXNhYmxlRXF1YWxpemVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgICAgICBkaXNhYmxlVm9sdW1lOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZVZvbHVtZSxcbiAgICAgICAgICBkaXNhYmxlRmlsdGVyczogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVGaWx0ZXJlcixcbiAgICAgICAgICBkaXNhYmxlUmVzYW1wbGVyOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZVJlc2FtcGxlcixcbiAgICAgICAgICBkaXNhYmxlQ29tcHJlc3NvcjogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVDb21wcmVzc29yLFxuICAgICAgICAgIGRpc2FibGVSZXZlcmI6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlUmV2ZXJiLFxuICAgICAgICAgIGRpc2FibGVTZWVrZXI6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlU2Vla2VyLFxuICAgICAgICAgIGNvbXByZXNzb3I6XG4gICAgICAgICAgdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmNvbXByZXNzb3IgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIHJldmVyYjogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnJldmVyYiA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgc2Vla2VyOiB7XG4gICAgICAgICAgICBzZWVrVGFyZ2V0OlxuICAgICAgICAgICAgb3B0aW9ucy50cmFuc2l0aW9uTW9kZSAmJiBvcHRpb25zLnNlZWsgIT0gbnVsbCA/XG4gICAgICAgICAgICBvcHRpb25zLnNlZWsgOlxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHRvdGFsRHVyYXRpb246IHRyYWNrLmR1cmF0aW9uTVMgPz8gMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2FtcGxlUmF0ZTpcbiAgICAgICAgICB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuc2FtcGxlUmF0ZSA/PyAoXG4gICAgICAgICAgdHlwZW9mIHRoaXMucXVldWUub3B0aW9ucy5yZXNhbXBsZXIgPT09ICdudW1iZXInICYmXG4gICAgICAgICAgdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA+IDAgP1xuICAgICAgICAgIHRoaXMucXVldWUub3B0aW9ucy5yZXNhbXBsZXIgOlxuICAgICAgICAgIHVuZGVmaW5lZCksXG4gICAgICAgICAgYmlxdWFkRmlsdGVyOlxuICAgICAgICAgIHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGVxOiB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyLFxuICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzOiB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyxcbiAgICAgICAgICB2b2x1bWU6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUsXG4gICAgICAgICAgZGF0YTogdHJhY2ssXG4gICAgICAgICAgdHlwZTogU3RyZWFtVHlwZS5SYXcsXG4gICAgICAgICAgc2tpcEZGbXBlZzogdGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5za2lwRkZtcGVnXG4gICAgICAgIH0sXG4gICAgICAgIHBsYXllckNvbmZpZzogb3B0aW9uc1xuICAgICAgfTtcblxuICAgICAgbGV0IHJlc29sdmVyOiAoKSA9PiB2b2lkID0gVXRpbC5ub29wO1xuICAgICAgY29uc3QgZG9uZVByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gcmVzb2x2ZXIgPSByZXNvbHZlKTtcblxuICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMucXVldWUuZW1pdChcbiAgICAgICAgR3VpbGRRdWV1ZUV2ZW50LldpbGxQbGF5VHJhY2ssXG4gICAgICAgIHRoaXMucXVldWUsXG4gICAgICAgIHRyYWNrLFxuICAgICAgICB0cmFja1N0cmVhbUNvbmZpZyxcbiAgICAgICAgcmVzb2x2ZXIhXG4gICAgICApO1xuXG4gICAgICAvLyBwcmV2ZW50IGRhbmdsaW5nIHByb21pc2VcbiAgICAgIGlmICghc3VjY2VzcykgcmVzb2x2ZXIoKTtcblxuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnF1ZXVlLmRlYnVnKCdXYWl0aW5nIGZvciB3aWxsUGxheVRyYWNrIGV2ZW50IHRvIHJlc29sdmUuLi4nKTtcblxuICAgICAgYXdhaXQgZG9uZVByb21pc2U7XG5cbiAgICAgIGNvbnN0IGRhc3BEaXNhYmxlZCA9IFtcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUJpcXVhZCxcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUVxdWFsaXplcixcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUZpbHRlcnMsXG4gICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVSZXNhbXBsZXIsXG4gICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVWb2x1bWUsXG4gICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVDb21wcmVzc29yLFxuICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5kaXNhYmxlUmV2ZXJiLFxuICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5kaXNhYmxlU2Vla2VyXS5cbiAgICAgIGV2ZXJ5KChlKSA9PiAhIWUgPT09IHRydWUpO1xuXG4gICAgICBjb25zdCBuZWVkc0ZpbHRlcnMgPVxuICAgICAgISF0cmFja1N0cmVhbUNvbmZpZy5wbGF5ZXJDb25maWcuc2VlayB8fFxuICAgICAgISF0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLmFyZ3MubGVuZ3RoO1xuICAgICAgY29uc3Qgc2hvdWxkU2tpcEZGbXBlZyA9XG4gICAgICAhIXRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuc2tpcEZGbXBlZyAmJiAhbmVlZHNGaWx0ZXJzO1xuXG4gICAgICBsZXQgZmluYWxTdHJlYW06IFJlYWRhYmxlO1xuXG4gICAgICBjb25zdCBkZW11eGFibGUgPSAoZm10OiBzdHJpbmcpID0+XG4gICAgICBbXG4gICAgICBTdHJlYW1UeXBlLk9wdXMsXG4gICAgICBTdHJlYW1UeXBlLldlYm1PcHVzLFxuICAgICAgU3RyZWFtVHlwZS5PZ2dPcHVzLFxuICAgICAgU3RyZWFtVHlwZS5SYXcsXG4gICAgICAncGNtJ10uXG4gICAgICBpbmNsdWRlcyhmbXQgYXMgU3RyZWFtVHlwZSk7XG5cbiAgICAgIC8vIHNraXAgZmZtcGVnIHdoZW4gcG9zc2libGVcbiAgICAgIGlmIChcbiAgICAgIHNob3VsZFNraXBGRm1wZWcgJiZcbiAgICAgICEoc3RyZWFtU3JjLnN0cmVhbSBpbnN0YW5jZW9mIFJlYWRhYmxlKSAmJlxuICAgICAgdHlwZW9mIHN0cmVhbVNyYy5zdHJlYW0gIT09ICdzdHJpbmcnICYmXG4gICAgICBkZW11eGFibGUoc3RyZWFtU3JjLnN0cmVhbS4kZm10KSlcbiAgICAgIHtcbiAgICAgICAgY29uc3QgeyAkZm10LCBzdHJlYW0gfSA9IHN0cmVhbVNyYy5zdHJlYW07XG4gICAgICAgIGNvbnN0IHNob3VsZFBDTSA9ICFkYXNwRGlzYWJsZWQ7XG5cbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgYHNraXBGRm1wZWcgaXMgc2V0IHRvIHRydWUgYW5kIHN0cmVhbSBpcyBkZW11eGFibGUsIGNyZWF0aW5nIHN0cmVhbSB3aXRoIHR5cGUgJHtcbiAgICAgICAgICBzaG91bGRQQ00gPyAncGNtJyA6ICdvcHVzJ31gXG5cbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBpc1JhdyA9ICRmbXQgPT09ICdwY20nIHx8ICRmbXQgPT09IFN0cmVhbVR5cGUuUmF3O1xuXG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICBjb25zdCBvcHVzU3RyZWFtID1cbiAgICAgICAgaXNSYXcgfHwgJGZtdCA9PT0gU3RyZWFtVHlwZS5PcHVzID9cbiAgICAgICAgc3RyZWFtIDpcbiAgICAgICAgJGZtdCA9PT0gU3RyZWFtVHlwZS5PZ2dPcHVzID9cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgc3RyZWFtLnBpcGUobmV3IE9nZ0RlbXV4ZXIoKSBhcyBhbnkpIDpcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgc3RyZWFtLnBpcGUobmV3IFdlYm1EZW11eGVyKCkgYXMgYW55KTtcblxuICAgICAgICBpZiAoc2hvdWxkUENNKSB7XG4gICAgICAgICAgaWYgKGlzUmF3KSB7XG4gICAgICAgICAgICBmaW5hbFN0cmVhbSA9IG9wdXNTdHJlYW07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW55IGZpbHRlcnMgZW5hYmxlZCwgd2UgbmVlZCB0byBkZWNvZGUgdGhlIG9wdXMgc3RyZWFtIHRvIHBjbVxuICAgICAgICAgICAgZmluYWxTdHJlYW0gPSBvcHVzU3RyZWFtLnBpcGUoXG4gICAgICAgICAgICAgIG5ldyBPcHVzRGVjb2Rlcih7XG4gICAgICAgICAgICAgICAgY2hhbm5lbHM6IDIsXG4gICAgICAgICAgICAgICAgZnJhbWVTaXplOiA5NjAsXG4gICAgICAgICAgICAgICAgcmF0ZTogNDgwMDBcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBTdHJlYW1UeXBlLlJhdztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmluYWxTdHJlYW0gPSBvcHVzU3RyZWFtO1xuICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcudHlwZSA9IFN0cmVhbVR5cGUuT3B1cztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY29uc3Qgb3B1cyA9IGRhc3BEaXNhYmxlZCAmJiB0aGlzLiNoYXNGRm1wZWdPcHRpbWl6YXRpb247XG4gICAgICAgIC8vIGlmIChvcHVzICYmIHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0Rpc2FibGluZyBQQ00gb3V0cHV0IHNpbmNlIGFsbCBmaWx0ZXJzIGFyZSBkaXNhYmxlZCBhbmQgb3B1cyBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuLi4nKTtcblxuICAgICAgICBmaW5hbFN0cmVhbSA9IHRoaXMuI2NyZWF0ZUZGbXBlZ1N0cmVhbShcbiAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtIGluc3RhbmNlb2YgUmVhZGFibGUgfHxcbiAgICAgICAgICB0eXBlb2Ygc3RyZWFtU3JjLnN0cmVhbSA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gOlxuICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0uc3RyZWFtLFxuICAgICAgICAgIHRyYWNrLFxuICAgICAgICAgIG9wdGlvbnMuc2VlayA/PyAwXG4gICAgICAgICAgLy8gb3B1c1xuICAgICAgICApO1xuICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBTdHJlYW1UeXBlLlJhdztcbiAgICAgICAgLy8gRklYTUU6IE9nZ09wdXMgcmVzdWx0cyBpbiBzdGF0aWMgbm9pc2VcbiAgICAgICAgLy8gdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy50eXBlID0gb3B1cyA/IFN0cmVhbVR5cGUuT2dnT3B1cyA6IFN0cmVhbVR5cGUuUmF3O1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy50cmFuc2l0aW9uTW9kZSkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICBgVHJhbnNpdGlvbiBtb2RlIGRldGVjdGVkLCBwbGF5ZXIgd2lsbCB3YWl0IGZvciBidWZmZXJpbmcgdGltZW91dCB0byBleHBpcmUgKFRpbWVvdXQ6ICR7dGhpcy5xdWV1ZS5vcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXR9bXMpYFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCB3YWl0Rm9yKHRoaXMucXVldWUub3B0aW9ucy5idWZmZXJpbmdUaW1lb3V0KTtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoJ0J1ZmZlcmluZyB0aW1lb3V0IGhhcyBleHBpcmVkIScpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgIGBQcmVwYXJpbmcgZmluYWwgc3RyZWFtIGNvbmZpZzogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZyxcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIDJcbiAgICAgICAgKX1gXG4gICAgICApO1xuXG4gICAgICBjb25zdCBkaXNwYXRjaGVyID0gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyO1xuXG4gICAgICBpZiAoIWRpc3BhdGNoZXIpIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHtcbiAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICAgJ0Rpc3BhdGNoZXIgaXMgbm90IGF2YWlsYWJsZSwgdGhpcyBpcyBtb3N0IGxpa2VseSBkdWUgdG8gdGhlIHF1ZXVlIGJlaW5nIGRlbGV0ZWQgaW4gdGhlIG1pZGRsZSBvZiBvcGVyYXRpb24uIENhbmNlbGxpbmcgdGhlIHN0cmVhbS4uLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgZmluYWxTdHJlYW0uZGVzdHJveSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzb3VyY2UgPSBhd2FpdCBkaXNwYXRjaGVyLmNyZWF0ZVN0cmVhbShcbiAgICAgICAgICBmaW5hbFN0cmVhbSxcbiAgICAgICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5xdWV1ZS5zZXRUcmFuc2l0aW9uaW5nKCEhb3B0aW9ucy50cmFuc2l0aW9uTW9kZSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy4jcGVyZm9ybVBsYXkocmVzb3VyY2UpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhgRmFpbGVkIHRvIGluaXRpYWxpemUgYXVkaW8gcGxheWVyOiAke2V9YCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gICN0aHJvdyh0cmFjazogVHJhY2ssIGVycm9yPzogRXJyb3IgfCBudWxsKTogdm9pZCB7XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgY29uc3Qgc3RyZWFtRGVmaW5pdGVseUZhaWxlZE15RGVhclRfVFBsZWFzZVRydXN0TWVJdHNOb3RNeUZhdWx0ID1cbiAgICBuZXcgTm9SZXN1bHRFcnJvcihgQ291bGQgbm90IGV4dHJhY3Qgc3RyZWFtIGZvciB0aGlzIHRyYWNrJHtlcnJvciA/IGBcXG5cXG4ke2Vycm9yLnN0YWNrIHx8IGVycm9yfWAgOiAnJ31gKTtcblxuXG4gICAgdGhpcy5xdWV1ZS5lbWl0KFxuICAgICAgR3VpbGRRdWV1ZUV2ZW50LlBsYXllclNraXAsXG4gICAgICB0aGlzLnF1ZXVlLFxuICAgICAgdHJhY2ssXG4gICAgICBUcmFja1NraXBSZWFzb24uTm9TdHJlYW0sXG4gICAgICBzdHJlYW1EZWZpbml0ZWx5RmFpbGVkTXlEZWFyVF9UUGxlYXNlVHJ1c3RNZUl0c05vdE15RmF1bHQubWVzc2FnZVxuICAgICk7XG4gICAgdGhpcy5xdWV1ZS5lbWl0KFxuICAgICAgR3VpbGRRdWV1ZUV2ZW50LlBsYXllckVycm9yLFxuICAgICAgdGhpcy5xdWV1ZSxcbiAgICAgIHN0cmVhbURlZmluaXRlbHlGYWlsZWRNeURlYXJUX1RQbGVhc2VUcnVzdE1lSXRzTm90TXlGYXVsdCxcbiAgICAgIHRyYWNrXG4gICAgKTtcbiAgICBjb25zdCBuZXh0VHJhY2sgPSB0aGlzLnF1ZXVlLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgIGlmIChuZXh0VHJhY2spIHJldHVybiB2b2lkIHRoaXMucGxheShuZXh0VHJhY2ssIHsgcXVldWU6IGZhbHNlIH0pO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3Igc2hvdWxkIGJlIHJlc29sdmVkXG4gICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5lbWl0KCdmaW5pc2gnLCBudWxsKTtcbiAgfVxuXG4gIGFzeW5jICNwZXJmb3JtUGxheShyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICBpZiAoIXRoaXMucXVldWUuZGlzcGF0Y2hlcikge1xuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICAnRGlzcGF0Y2hlciBpcyBub3QgYXZhaWxhYmxlLCB0aGlzIGlzIG1vc3QgbGlrZWx5IGR1ZSB0byB0aGUgcXVldWUgYmVpbmcgZGVsZXRlZCBpbiB0aGUgbWlkZGxlIG9mIG9wZXJhdGlvbi4gQ2FuY2VsbGluZyB0aGUgc3RyZWFtLi4uJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoJ0luaXRpYWxpemluZyBhdWRpbyBwbGF5ZXIuLi4nKTtcbiAgICAgIGF3YWl0IHRoaXMucXVldWUuZGlzcGF0Y2hlci5wbGF5U3RyZWFtKHJlc291cmNlKTtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdEaXNwYXRjaGluZyBhdWRpby4uLicpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jICNjcmVhdGVHZW5lcmljU3RyZWFtKHRyYWNrOiBUcmFjaykge1xuICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICBgQXR0ZW1wdGluZyB0byBleHRyYWN0IHN0cmVhbSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgcmVnaXN0ZXJlZCBleHRyYWN0b3JzYFxuICAgICk7XG5cbiAgICBjb25zdCBhdHRlbXB0ZWRFeHRyYWN0b3JzID1cbiAgICB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLmdldENvbnRleHQoKT8uYXR0ZW1wdGVkRXh0cmFjdG9ycyB8fFxuICAgIG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3Qgc3RyZWFtSW5mbyA9IGF3YWl0IHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMucnVuKFxuICAgICAgYXN5bmMgKGV4dHJhY3RvcikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgIHRoaXMucXVldWUucGxheWVyLm9wdGlvbnMuYmxvY2tTdHJlYW1Gcm9tPy5zb21lKFxuICAgICAgICAgIChleHQpID0+IGV4dCA9PT0gZXh0cmFjdG9yLmlkZW50aWZpZXJcbiAgICAgICAgKSlcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChhdHRlbXB0ZWRFeHRyYWN0b3JzLmhhcyhleHRyYWN0b3IuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgYXR0ZW1wdGVkRXh0cmFjdG9ycy5hZGQoZXh0cmFjdG9yLmlkZW50aWZpZXIpO1xuICAgICAgICBjb25zdCBjYW5TdHJlYW0gPSBhd2FpdCBleHRyYWN0b3IudmFsaWRhdGUoXG4gICAgICAgICAgdHJhY2sudXJsLFxuICAgICAgICAgIHRyYWNrLnF1ZXJ5VHlwZSB8fCBRdWVyeVJlc29sdmVyLnJlc29sdmUodHJhY2sudXJsKS50eXBlXG4gICAgICAgICk7XG4gICAgICAgIGlmICghY2FuU3RyZWFtKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBhd2FpdCBleHRyYWN0b3Iuc3RyZWFtKHRyYWNrKTtcbiAgICAgIH0sXG4gICAgICBmYWxzZVxuICAgICk7XG5cbiAgICBpZiAoIXN0cmVhbUluZm8gfHwgIXN0cmVhbUluZm8ucmVzdWx0KSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgIGBGYWlsZWQgdG8gZXh0cmFjdCBzdHJlYW0gZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nIHJlZ2lzdGVyZWQgZXh0cmFjdG9yc2BcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUZhbGxiYWNrU3RyZWFtKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgIGBHZW5lcmljIHN0cmVhbSBleHRyYWN0aW9uIGZhaWxlZCBhbmQgZmFsbGJhY2sgc3RyZWFtIGV4dHJhY3Rpb24gaXMgZW5hYmxlZGBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NyZWF0ZUZhbGxiYWNrU3RyZWFtKHRyYWNrKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0cmVhbUluZm8gfHwgbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgYFN0cmVhbSBleHRyYWN0aW9uIHdhcyBzdWNjZXNzZnVsIGZvciBUcmFjayB7IHRpdGxlOiAke1xuICAgICAgdHJhY2sudGl0bGV9LCB1cmw6ICR7XG4gICAgICB0cmFjay51cmx9IH0gKEV4dHJhY3RvcjogJHtcbiAgICAgIHN0cmVhbUluZm8uZXh0cmFjdG9yPy5pZGVudGlmaWVyIHx8ICdOL0EnfSlgXG5cbiAgICApO1xuXG4gICAgcmV0dXJuIHN0cmVhbUluZm87XG4gIH1cblxuICBhc3luYyAjY3JlYXRlRmFsbGJhY2tTdHJlYW0odHJhY2s6IFRyYWNrKSB7XG4gICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgIGBBdHRlbXB0aW5nIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyBmYWxsYmFjayBzdHJlYW1pbmcgbWV0aG9kLi4uYFxuICAgICk7XG5cbiAgICBjb25zdCB2ZXJpZnlGYWxsYmFja1N0cmVhbSA9IHRoaXMucXVldWUub3B0aW9ucy52ZXJpZnlGYWxsYmFja1N0cmVhbTtcblxuICAgIGNvbnN0IGZhbGxiYWNrU3RyZWFtID0gYXdhaXQgdGhpcy5xdWV1ZS5wbGF5ZXIuZXh0cmFjdG9ycy5ydW4oXG4gICAgICBhc3luYyAoZXh0cmFjdG9yKSA9PiB7XG4gICAgICAgIGlmIChleHRyYWN0b3IuaWRlbnRpZmllciA9PT0gdHJhY2suZXh0cmFjdG9yPy5pZGVudGlmaWVyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChcbiAgICAgICAgdGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5ibG9ja1N0cmVhbUZyb20/LnNvbWUoXG4gICAgICAgICAgKGV4dCkgPT4gZXh0ID09PSBleHRyYWN0b3IuaWRlbnRpZmllclxuICAgICAgICApKVxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcXVlcnkgPSBgJHt0cmFjay50aXRsZX0gJHt0cmFjay5hdXRob3J9YDtcblxuICAgICAgICBpZiAodmVyaWZ5RmFsbGJhY2tTdHJlYW0pIHtcbiAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICAgICAgYEZhbGxiYWNrIHN0cmVhbSB2ZXJpZmljYXRpb24gaXMgZW5hYmxlZCwgdmFsaWRhdGluZyBxdWVyeSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0uLi5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHNob3VsZFByb2NlZWQgPSBhd2FpdCBleHRyYWN0b3IudmFsaWRhdGUoXG4gICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgIHRyYWNrLnF1ZXJ5VHlwZSB8fCB0cmFjay5zb3VyY2VcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKCFzaG91bGRQcm9jZWVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gdmFsaWRhdGUgcXVlcnkgZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nICR7ZXh0cmFjdG9yLmlkZW50aWZpZXJ9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICAgICBgUXVlcnkgZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHdhcyB2YWxpZGF0ZWQgdXNpbmcgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0uIFByb2NlZWRpbmcgd2l0aCBleHRyYWN0aW9uLi4uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmYWxsYmFja1RyYWNrcyA9IGF3YWl0IGV4dHJhY3Rvci5oYW5kbGUocXVlcnksIHtcbiAgICAgICAgICByZXF1ZXN0ZWRCeTogdHJhY2sucmVxdWVzdGVkQnlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZmFsbGJhY2tUcmFjayA9IGZhbGxiYWNrVHJhY2tzLnRyYWNrc1swXTtcblxuICAgICAgICBpZiAoIWZhbGxiYWNrVHJhY2spIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBleHRyYWN0b3Iuc3RyZWFtKGZhbGxiYWNrVHJhY2spO1xuXG4gICAgICAgIGlmICghc3RyZWFtKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgdHJhY2suYnJpZGdlZFRyYWNrID0gZmFsbGJhY2tUcmFjaztcblxuICAgICAgICByZXR1cm4gc3RyZWFtO1xuICAgICAgfSxcbiAgICAgIHRydWVcbiAgICApO1xuXG4gICAgaWYgKCFmYWxsYmFja1N0cmVhbSB8fCAhZmFsbGJhY2tTdHJlYW0ucmVzdWx0KSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgIGBGYWlsZWQgdG8gZXh0cmFjdCBzdHJlYW0gZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nIGZhbGxiYWNrIHN0cmVhbWluZyBtZXRob2RgXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrU3RyZWFtIHx8IG51bGw7XG4gICAgfVxuXG4gICAgdHJhY2suYnJpZGdlZEV4dHJhY3RvciA9IGZhbGxiYWNrU3RyZWFtLmV4dHJhY3RvcjtcblxuICAgIHJldHVybiBmYWxsYmFja1N0cmVhbTtcbiAgfVxuXG4gICNjcmVhdGVGRm1wZWdTdHJlYW0oXG4gIHN0cmVhbTogUmVhZGFibGUgfCBzdHJpbmcsXG4gIHRyYWNrOiBUcmFjayxcbiAgc2VlayA9IDAsXG4gIG9wdXM/OiBib29sZWFuKVxuICB7XG4gICAgY29uc3QgZmZtcGVnU3RyZWFtID0gdGhpcy5xdWV1ZS5maWx0ZXJzLmZmbXBlZy5cbiAgICBjcmVhdGVTdHJlYW0oc3RyZWFtLCB7XG4gICAgICBlbmNvZGVyQXJnczogdGhpcy5xdWV1ZS5maWx0ZXJzLmZmbXBlZy5hcmdzLFxuICAgICAgc2Vlazogc2VlayAvIDEwMDAsXG4gICAgICBmbXQ6IG9wdXMgPyAnb3B1cycgOiAnczE2bGUnXG4gICAgfSkuXG4gICAgb24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgY29uc3QgbSA9IGAke2Vycn1gLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgYFN0cmVhbSBjbG9zZWQgZHVlIHRvIGFuIGVycm9yIGZyb20gRkZtcGVnIHN0cmVhbTogJHtcbiAgICAgICAgZXJyLnN0YWNrIHx8IGVyci5tZXNzYWdlIHx8IGVycn1gXG5cbiAgICAgICk7XG5cbiAgICAgIGlmIChtLmluY2x1ZGVzKCdwcmVtYXR1cmUgY2xvc2UnKSB8fCBtLmluY2x1ZGVzKCdlcGlwZScpKSByZXR1cm47XG5cbiAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUGxheWVyRXJyb3IsIHRoaXMucXVldWUsIGVyciwgdHJhY2spO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZmbXBlZ1N0cmVhbTtcbiAgfVxufSIsICJpbXBvcnQgeyBTbm93Zmxha2VVdGlsIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNRdWV1ZUFjcXVpc2l0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBYm9ydFNpZ25hbCB0byBjYW5jZWwgdGhpcyBlbnRyeVxuICAgKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbmV4cG9ydCB0eXBlIEFzeW5jUXVldWVFeGNlcHRpb25IYW5kbGVyID0gKGV4Y2VwdGlvbjogRXJyb3IpID0+IHZvaWQ7XG5cbmV4cG9ydCBjbGFzcyBBc3luY1F1ZXVlIHtcbiAgLyoqXG4gICAqIFRoZSBxdWV1ZWQgZW50cmllc1xuICAgKi9cbiAgcHVibGljIGVudHJpZXM6IEFycmF5PEFzeW5jUXVldWVFbnRyeT4gPSBbXTtcblxuICBwdWJsaWMgZXhjZXB0aW9uSGFuZGxlcj86IEFzeW5jUXVldWVFeGNlcHRpb25IYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBDbGVhciBlbnRyaWVzIHF1ZXVlXG4gICAqIEBwYXJhbSBjb25zdW1lIFdoZXRoZXIgb3Igbm90IHRvIGNvbnN1bWUgYWxsIGVudHJpZXMgYmVmb3JlIGNsZWFyaW5nXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoY29uc3VtZSA9IGZhbHNlKSB7XG4gICAgaWYgKGNvbnN1bWUpIHtcbiAgICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4gZW50cnkuY29uc3VtZSgpKTtcbiAgICB9XG5cbiAgICB0aGlzLmVudHJpZXMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyBxdWV1ZS4gUmV0dXJucyBgMGAgaWYgbm8gZW50cmllcyBhcmUgYXZhaWxhYmxlLlxuICAgKi9cbiAgcHVibGljIGdldCBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjcXVpcmUgYW4gZW50cnkuXG4gICAqXG4gICAqIEBleGFtcGxlIC8vIGxvY2sgdGhlIHF1ZXVlXG4gICAqIGNvbnN0IGVudHJ5ID0gYXN5bmNRdWV1ZS5hY3F1aXJlKCk7XG4gICAqIC8vIHdhaXQgdW50aWwgcHJldmlvdXMgdGFzayBpcyBjb21wbGV0ZWRcbiAgICogYXdhaXQgZW50cnkuZ2V0VGFzaygpO1xuICAgKiAvLyBkbyBzb21ldGhpbmcgZXhwZW5zaXZlXG4gICAqIGF3YWl0IHBlcmZvcm1Tb21ldGhpbmdFeHBlbnNpdmUoKTtcbiAgICogLy8gbWFrZSBzdXJlIHRvIHJlbGVhc2UgdGhlIGxvY2sgb25jZSBkb25lXG4gICAqIGFzeW5jUXVldWUucmVsZWFzZSgpO1xuICAgKlxuICAgKi9cbiAgcHVibGljIGFjcXVpcmUob3B0aW9ucz86IEFzeW5jUXVldWVBY3F1aXNpdGlvbk9wdGlvbnMpIHtcbiAgICBjb25zdCBlbnRyeSA9IG5ldyBBc3luY1F1ZXVlRW50cnkodGhpcywgb3B0aW9ucyk7XG5cbiAgICBpZiAodGhpcy5leGNlcHRpb25IYW5kbGVyKSBlbnRyeS5nZXRUYXNrKCkuY2F0Y2godGhpcy5leGNlcHRpb25IYW5kbGVyKTtcblxuICAgIGlmICh0aGlzLmVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICBlbnRyeS5jb25zdW1lKCk7XG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuXG4gICAgdGhpcy5lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgIHJldHVybiBlbnRyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlIHRoZSBjdXJyZW50IGFjcXVpc2l0aW9uIGFuZCBtb3ZlIHRvIG5leHQgZW50cnkuXG4gICAqL1xuICBwdWJsaWMgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZW50cmllcy5sZW5ndGgpIHJldHVybjtcblxuICAgIHRoaXMuZW50cmllcy5zaGlmdCgpO1xuICAgIHRoaXMuZW50cmllc1swXT8uY29uc3VtZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCBhbGwgZW50cmllc1xuICAgKi9cbiAgcHVibGljIGNhbmNlbEFsbCgpIHtcbiAgICB0aGlzLmVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IGVudHJ5LmNhbmNlbCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIGdpdmVuIGVudHJ5IGZyb20gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBlbnRyeSBUaGUgZW50cnkgdG8gcmVtb3ZlXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlRW50cnkoZW50cnk6IEFzeW5jUXVldWVFbnRyeSkge1xuICAgIGNvbnN0IGVudHJ5SWR4ID0gdGhpcy5lbnRyaWVzLmluZGV4T2YoZW50cnkpO1xuXG4gICAgaWYgKGVudHJ5SWR4ICE9PSAtMSkge1xuICAgICAgdGhpcy5lbnRyaWVzLnNwbGljZShlbnRyeUlkeCwgMSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFzeW5jUXVldWVFbnRyeSB7XG4gIHB1YmxpYyByZWFkb25seSBpZCA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb21pc2U6IFByb21pc2U8dm9pZD47XG4gIHB1YmxpYyBzaWduYWw6IEFib3J0U2lnbmFsIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBvbkFib3J0OiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZXNvbHZlITogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWplY3QhOiAoZXJyOiBFcnJvcikgPT4gdm9pZDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyBxdWV1ZTogQXN5bmNRdWV1ZSxcbiAgcHVibGljIG9wdGlvbnM/OiBBc3luY1F1ZXVlQWNxdWlzaXRpb25PcHRpb25zKVxuICB7XG4gICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgIHRoaXMucmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucz8uc2lnbmFsKSB7XG4gICAgICB0aGlzLnNldEFib3J0U2lnbmFsKHRoaXMub3B0aW9ucy5zaWduYWwpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRBYm9ydFNpZ25hbChzaWduYWw6IEFib3J0U2lnbmFsKSB7XG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgdGhpcy5zaWduYWwgPSBzaWduYWw7XG4gICAgdGhpcy5vbkFib3J0ID0gKCkgPT4ge1xuICAgICAgdGhpcy5xdWV1ZS5yZW1vdmVFbnRyeSh0aGlzKTtcbiAgICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgfTtcblxuICAgIHRoaXMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpcy5vbkFib3J0KTtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdW1lKCkge1xuICAgIHRoaXMuY2xlYW51cCgpO1xuICAgIHRoaXMucmVzb2x2ZSgpO1xuICB9XG5cbiAgcHVibGljIHJlbGVhc2UoKSB7XG4gICAgdGhpcy5jb25zdW1lKCk7XG4gICAgdGhpcy5xdWV1ZS5yZWxlYXNlKCk7XG4gIH1cblxuICBwdWJsaWMgY2FuY2VsKCkge1xuICAgIHRoaXMuY2xlYW51cCgpO1xuICAgIHRoaXMucmVqZWN0KG5ldyBFcnJvcignQ2FuY2VsbGVkJykpO1xuICB9XG5cbiAgcHVibGljIGNsZWFudXAoKSB7XG4gICAgaWYgKHRoaXMub25BYm9ydCkgdGhpcy5zaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpcy5vbkFib3J0KTtcbiAgICB0aGlzLnNpZ25hbCA9IG51bGw7XG4gICAgdGhpcy5vbkFib3J0ID0gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnByb21pc2U7XG4gIH1cbn0iLCAiaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgQXVkaW9GaWx0ZXJzLCBGaWx0ZXJzTmFtZSwgUXVldWVGaWx0ZXJzIH0gZnJvbSAnLi4vdXRpbHMvQXVkaW9GaWx0ZXJzJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIEd1aWxkUXVldWVFdmVudCB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQge1xuICBCaXF1YWRGaWx0ZXJzLFxuICBFcXVhbGl6ZXIsXG4gIEVxdWFsaXplckJhbmQsXG4gIFBDTUZpbHRlcnMgfSBmcm9tXG4nQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBGRm1wZWdTdHJlYW1PcHRpb25zLCBjcmVhdGVGRm1wZWdTdHJlYW0gfSBmcm9tICcuLi91dGlscy9GRm1wZWdTdHJlYW0nO1xuaW1wb3J0IHsgSW52YWxpZEFyZ1R5cGVFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBTdHJlYW1Db25maWcgfSBmcm9tICcuL0d1aWxkUXVldWVQbGF5ZXJOb2RlJztcblxudHlwZSBGaWx0ZXJzID0ga2V5b2YgdHlwZW9mIEF1ZGlvRmlsdGVycy5maWx0ZXJzO1xuXG5jb25zdCBtYWtlQmFuZHMgPSAoYXJyOiBudW1iZXJbXSkgPT4ge1xuICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICB7XG4gICAgICBsZW5ndGg6IEVxdWFsaXplci5CQU5EX0NPVU5UXG4gICAgfSxcbiAgICAoXywgaSkgPT4gKHtcbiAgICAgIGJhbmQ6IGksXG4gICAgICBnYWluOiBhcnJbaV0gPyBhcnJbaV0gLyAzMCA6IDBcbiAgICB9KVxuICApIGFzIEVxdWFsaXplckJhbmRbXTtcbn07XG5cbnR5cGUgRVFQcmVzZXQgPSB7XG4gIEZsYXQ6IEVxdWFsaXplckJhbmRbXTtcbiAgQ2xhc3NpY2FsOiBFcXVhbGl6ZXJCYW5kW107XG4gIENsdWI6IEVxdWFsaXplckJhbmRbXTtcbiAgRGFuY2U6IEVxdWFsaXplckJhbmRbXTtcbiAgRnVsbEJhc3M6IEVxdWFsaXplckJhbmRbXTtcbiAgRnVsbEJhc3NUcmVibGU6IEVxdWFsaXplckJhbmRbXTtcbiAgRnVsbFRyZWJsZTogRXF1YWxpemVyQmFuZFtdO1xuICBIZWFkcGhvbmVzOiBFcXVhbGl6ZXJCYW5kW107XG4gIExhcmdlSGFsbDogRXF1YWxpemVyQmFuZFtdO1xuICBMaXZlOiBFcXVhbGl6ZXJCYW5kW107XG4gIFBhcnR5OiBFcXVhbGl6ZXJCYW5kW107XG4gIFBvcDogRXF1YWxpemVyQmFuZFtdO1xuICBSZWdnYWU6IEVxdWFsaXplckJhbmRbXTtcbiAgUm9jazogRXF1YWxpemVyQmFuZFtdO1xuICBTa2E6IEVxdWFsaXplckJhbmRbXTtcbiAgU29mdDogRXF1YWxpemVyQmFuZFtdO1xuICBTb2Z0Um9jazogRXF1YWxpemVyQmFuZFtdO1xuICBUZWNobm86IEVxdWFsaXplckJhbmRbXTtcbn07XG5cbmV4cG9ydCBjb25zdCBFcXVhbGl6ZXJDb25maWd1cmF0aW9uUHJlc2V0OiBSZWFkb25seTxFUVByZXNldD4gPSBPYmplY3QuZnJlZXplKHtcbiAgRmxhdDogbWFrZUJhbmRzKFtdKSxcbiAgQ2xhc3NpY2FsOiBtYWtlQmFuZHMoW1xuICAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSxcbiAgLTEuMTEwMjJlLTE1LCAtNy4yLCAtNy4yLCAtNy4yLCAtOS42XVxuICApLFxuICBDbHViOiBtYWtlQmFuZHMoW1xuICAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgOC4wLCA1LjYsIDUuNiwgNS42LCAzLjIsIC0xLjExMDIyZS0xNSxcbiAgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTVdXG4gICksXG4gIERhbmNlOiBtYWtlQmFuZHMoW1xuICA5LjYsIDcuMiwgMi40LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTcuMiwgLTcuMiwgLTEuMTEwMjJlLTE1LFxuICAtMS4xMTAyMmUtMTVdXG4gICksXG4gIEZ1bGxCYXNzOiBtYWtlQmFuZHMoW1xuICAtOC4wLCA5LjYsIDkuNiwgNS42LCAxLjYsIC00LjAsIC04LjAsIC0xMC40LCAtMTEuMiwgLTExLjJdXG4gICksXG4gIEZ1bGxCYXNzVHJlYmxlOiBtYWtlQmFuZHMoW1xuICA3LjIsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNy4yLCAtNC44LCAxLjYsIDguMCwgMTEuMiwgMTIuMCwgMTIuMF1cbiAgKSxcbiAgRnVsbFRyZWJsZTogbWFrZUJhbmRzKFtcbiAgLTkuNiwgLTkuNiwgLTkuNiwgLTQuMCwgMi40LCAxMS4yLCAxNi4wLCAxNi4wLCAxNi4wLCAxNi44XVxuICApLFxuICBIZWFkcGhvbmVzOiBtYWtlQmFuZHMoW1xuICA0LjgsIDExLjIsIDUuNiwgLTMuMiwgLTIuNCwgMS42LCA0LjgsIDkuNiwgMTIuOCwgMTQuNF1cbiAgKSxcbiAgTGFyZ2VIYWxsOiBtYWtlQmFuZHMoW1xuICAxMC40LCAxMC40LCA1LjYsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNC44LCAtNC44LCAtNC44LCAtMS4xMTAyMmUtMTUsXG4gIC0xLjExMDIyZS0xNV1cbiAgKSxcbiAgTGl2ZTogbWFrZUJhbmRzKFstNC44LCAtMS4xMTAyMmUtMTUsIDQuMCwgNS42LCA1LjYsIDUuNiwgNC4wLCAyLjQsIDIuNCwgMi40XSksXG4gIFBhcnR5OiBtYWtlQmFuZHMoW1xuICA3LjIsIDcuMiwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LFxuICAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgNy4yLCA3LjJdXG4gICksXG4gIFBvcDogbWFrZUJhbmRzKFtcbiAgLTEuNiwgNC44LCA3LjIsIDguMCwgNS42LCAtMS4xMTAyMmUtMTUsIC0yLjQsIC0yLjQsIC0xLjYsIC0xLjZdXG4gICksXG4gIFJlZ2dhZTogbWFrZUJhbmRzKFtcbiAgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTEuMTEwMjJlLTE1LCA2LjQsIDYuNCxcbiAgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV1cbiAgKSxcbiAgUm9jazogbWFrZUJhbmRzKFs4LjAsIDQuOCwgLTUuNiwgLTguMCwgLTMuMiwgNC4wLCA4LjgsIDExLjIsIDExLjIsIDExLjJdKSxcbiAgU2thOiBtYWtlQmFuZHMoW1xuICAtMi40LCAtNC44LCAtNC4wLCAtMS4xMTAyMmUtMTUsIDQuMCwgNS42LCA4LjgsIDkuNiwgMTEuMiwgOS42XVxuICApLFxuICBTb2Z0OiBtYWtlQmFuZHMoW1xuICA0LjgsIDEuNiwgLTEuMTEwMjJlLTE1LCAtMi40LCAtMS4xMTAyMmUtMTUsIDQuMCwgOC4wLCA5LjYsIDExLjIsIDEyLjBdXG4gICksXG4gIFNvZnRSb2NrOiBtYWtlQmFuZHMoW1xuICA0LjAsIDQuMCwgMi40LCAtMS4xMTAyMmUtMTUsIC00LjAsIC01LjYsIC0zLjIsIC0xLjExMDIyZS0xNSwgMi40LCA4LjhdXG4gICksXG4gIFRlY2hubzogbWFrZUJhbmRzKFtcbiAgOC4wLCA1LjYsIC0xLjExMDIyZS0xNSwgLTUuNiwgLTQuOCwgLTEuMTEwMjJlLTE1LCA4LjAsIDkuNiwgOS42LCA4LjhdXG4gIClcbn0pO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIEZGbXBlZ0ZpbHRlcmVyPE1ldGEgPSBhbnk+IHtcbiAgI2ZmbXBlZ0ZpbHRlcnM6IEZpbHRlcnNbXSA9IFtdO1xuICAjaW5wdXRBcmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgYWY6IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YT4pIHt9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIGZmbXBlZyBtYXkgYmUgc2tpcHBlZFxuICAgKi9cbiAgcHVibGljIGdldCBza2lwcGFibGUoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5hZi5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5za2lwRkZtcGVnO1xuICB9XG5cbiAgI3NldEZpbHRlcnMoZmlsdGVyczogRmlsdGVyc1tdKSB7XG4gICAgY29uc3QgeyBxdWV1ZSB9ID0gdGhpcy5hZjtcbiAgICAvLyBza2lwIGlmIGZpbHRlcnMgYXJlIHRoZSBzYW1lXG4gICAgaWYgKFxuICAgIGZpbHRlcnMuZXZlcnkoKGYpID0+IHRoaXMuI2ZmbXBlZ0ZpbHRlcnMuaW5jbHVkZXMoZikpICYmXG4gICAgdGhpcy4jZmZtcGVnRmlsdGVycy5ldmVyeSgoZikgPT4gZmlsdGVycy5pbmNsdWRlcyhmKSkpXG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICBjb25zdCBpZ25vcmVGaWx0ZXJzID1cbiAgICB0aGlzLmZpbHRlcnMuc29tZSgoZmYpID0+IGZmID09PSAnbmlnaHRjb3JlJyB8fCBmZiA9PT0gJ3ZhcG9yd2F2ZScpICYmXG4gICAgIWZpbHRlcnMuc29tZSgoZmYpID0+IGZmID09PSAnbmlnaHRjb3JlJyB8fCBmZiA9PT0gJ3ZhcG9yd2F2ZScpO1xuICAgIGNvbnN0IHNlZWtUaW1lID0gcXVldWUubm9kZS5nZXRUaW1lc3RhbXAoaWdub3JlRmlsdGVycyk/LmN1cnJlbnQudmFsdWUgfHwgMDtcbiAgICBjb25zdCBwcmV2ID0gdGhpcy4jZmZtcGVnRmlsdGVycy5zbGljZSgpO1xuICAgIHRoaXMuI2ZmbXBlZ0ZpbHRlcnMgPSBbLi4ubmV3IFNldChmaWx0ZXJzKV07XG5cbiAgICByZXR1cm4gdGhpcy5hZi50cmlnZ2VyUmVwbGF5KHNlZWtUaW1lKS50aGVuKCh0KSA9PiB7XG4gICAgICBxdWV1ZS5lbWl0KFxuICAgICAgICBHdWlsZFF1ZXVlRXZlbnQuQXVkaW9GaWx0ZXJzVXBkYXRlLFxuICAgICAgICBxdWV1ZSxcbiAgICAgICAgcHJldixcbiAgICAgICAgdGhpcy4jZmZtcGVnRmlsdGVycy5zbGljZSgpXG4gICAgICApO1xuICAgICAgcmV0dXJuIHQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGlucHV0IGFyZ3MgZm9yIEZGbXBlZ1xuICAgKi9cbiAgcHVibGljIHNldElucHV0QXJncyhhcmdzOiBzdHJpbmdbXSkge1xuICAgIGlmICghYXJncy5ldmVyeSgoYXJnKSA9PiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJykpXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoJ2FyZ3MnLCAnQXJyYXk8c3RyaW5nPicsICdpbnZhbGlkIGl0ZW0ocyknKTtcbiAgICB0aGlzLiNpbnB1dEFyZ3MgPSBhcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBpbnB1dCBhcmdzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlucHV0QXJncygpIHtcbiAgICByZXR1cm4gdGhpcy4jaW5wdXRBcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBlbmNvZGVyIGFyZ3NcbiAgICovXG4gIHB1YmxpYyBnZXQgZW5jb2RlckFyZ3MoKSB7XG4gICAgaWYgKCF0aGlzLmZpbHRlcnMubGVuZ3RoKSByZXR1cm4gW107XG5cbiAgICByZXR1cm4gWyctYWYnLCB0aGlzLnRvU3RyaW5nKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBmaW5hbCBmZm1wZWcgYXJnc1xuICAgKi9cbiAgcHVibGljIGdldCBhcmdzKCkge1xuICAgIHJldHVybiB0aGlzLmlucHV0QXJncy5jb25jYXQodGhpcy5lbmNvZGVyQXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGZmbXBlZyBzdHJlYW1cbiAgICogQHBhcmFtIHNvdXJjZSBUaGUgc3RyZWFtIHNvdXJjZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgc3RyZWFtIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVTdHJlYW0oc291cmNlOiBzdHJpbmcgfCBSZWFkYWJsZSwgb3B0aW9uczogRkZtcGVnU3RyZWFtT3B0aW9ucykge1xuICAgIGlmICh0aGlzLiNpbnB1dEFyZ3MubGVuZ3RoKVxuICAgIG9wdGlvbnMuZW5jb2RlckFyZ3MgPSBbXG4gICAgLi4udGhpcy4jaW5wdXRBcmdzLFxuICAgIC4uLihvcHRpb25zLmVuY29kZXJBcmdzIHx8IFtdKV07XG5cblxuICAgIGNvbnN0IHN0cmVhbSA9IGNyZWF0ZUZGbXBlZ1N0cmVhbShzb3VyY2UsIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHN0cmVhbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZmZtcGVnIGZpbHRlcnNcbiAgICogQHBhcmFtIGZpbHRlcnMgVGhlIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBzZXRGaWx0ZXJzKFxuICBmaWx0ZXJzOiBGaWx0ZXJzW10gfCBSZWNvcmQ8RmlsdGVycywgYm9vbGVhbj4gfCBzdHJpbmdbXSB8IGJvb2xlYW4pXG4gIHtcbiAgICBsZXQgX2ZpbHRlcnM6IEZpbHRlcnNbXSA9IFtdO1xuICAgIGlmICh0eXBlb2YgZmlsdGVycyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBfZmlsdGVycyA9ICFmaWx0ZXJzID9cbiAgICAgIFtdIDpcbiAgICAgIE9iamVjdC5rZXlzKEF1ZGlvRmlsdGVycy5maWx0ZXJzKSBhcyBGaWx0ZXJzW107XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcnMpKSB7XG4gICAgICBfZmlsdGVycyA9IGZpbHRlcnMgYXMgRmlsdGVyc1tdO1xuICAgIH0gZWxzZSB7XG4gICAgICBfZmlsdGVycyA9IE9iamVjdC5lbnRyaWVzKGZpbHRlcnMpLlxuICAgICAgZmlsdGVyKChyZXMpID0+IHJlc1sxXSA9PT0gdHJ1ZSkuXG4gICAgICBtYXAoKG0pID0+IG1bMF0pIGFzIEZpbHRlcnNbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jc2V0RmlsdGVycyhfZmlsdGVycyk7XG4gIH1cblxuICAvKipcbiAgICogQ3VycmVudGx5IGFjdGl2ZSBmZm1wZWcgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzO1xuICB9XG5cbiAgcHVibGljIHNldCBmaWx0ZXJzKGZpbHRlcnM6IEZpbHRlcnNbXSkge1xuICAgIHRoaXMuc2V0RmlsdGVycyhmaWx0ZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgZ2l2ZW4gZmZtcGVnIGZpbHRlcihzKVxuICAgKiBAcGFyYW0gZmlsdGVycyBUaGUgZmlsdGVyKHMpXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlKGZpbHRlcnM6IEZpbHRlcnNbXSB8IEZpbHRlcnMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVycykpIGZpbHRlcnMgPSBbZmlsdGVyc107XG4gICAgY29uc3QgZnJlc2g6IEZpbHRlcnNbXSA9IFtdO1xuXG4gICAgZmlsdGVycy5mb3JFYWNoKChmKSA9PiB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJzLmluY2x1ZGVzKGYpKSByZXR1cm47XG4gICAgICBmcmVzaC5wdXNoKGYpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuI3NldEZpbHRlcnMoXG4gICAgICB0aGlzLiNmZm1wZWdGaWx0ZXJzLmZpbHRlcigocikgPT4gIWZpbHRlcnMuaW5jbHVkZXMocikpLmNvbmNhdChmcmVzaClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBkZWZhdWx0IGZpbHRlcnNcbiAgICogQHBhcmFtIGZmIEZpbHRlcnMgbGlzdFxuICAgKi9cbiAgcHVibGljIHNldERlZmF1bHRzKGZmOiBGaWx0ZXJzW10pIHtcbiAgICB0aGlzLiNmZm1wZWdGaWx0ZXJzID0gZmY7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZW5hYmxlZCBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0RmlsdGVyc0VuYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2ZmbXBlZ0ZpbHRlcnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZGlzYWJsZWQgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIGdldEZpbHRlcnNEaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gQXVkaW9GaWx0ZXJzLm5hbWVzLmZpbHRlcigoZikgPT4gIXRoaXMuI2ZmbXBlZ0ZpbHRlcnMuaW5jbHVkZXMoZikpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWx0ZXIgaXMgZW5hYmxlZFxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXJcbiAgICovXG4gIHB1YmxpYyBpc0VuYWJsZWQ8VCBleHRlbmRzIEZpbHRlcnM+KGZpbHRlcjogVCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNmZm1wZWdGaWx0ZXJzLmluY2x1ZGVzKGZpbHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBkaXNhYmxlZFxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXJcbiAgICovXG4gIHB1YmxpYyBpc0Rpc2FibGVkPFQgZXh0ZW5kcyBGaWx0ZXJzPihmaWx0ZXI6IFQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNFbmFibGVkKGZpbHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBhIHZhbGlkIGZpbHRlclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gdGVzdFxuICAgKi9cbiAgcHVibGljIGlzVmFsaWRGaWx0ZXIoZmlsdGVyOiBzdHJpbmcpOiBmaWx0ZXIgaXMgRmlsdGVyc05hbWUge1xuICAgIHJldHVybiBBdWRpb0ZpbHRlcnMuaGFzKGZpbHRlciBhcyBGaWx0ZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGN1cnJlbnQgZmlsdGVycyB0byBhcnJheVxuICAgKi9cbiAgcHVibGljIHRvQXJyYXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVycy5tYXAoKGZpbHRlcikgPT4gQXVkaW9GaWx0ZXJzLmdldChmaWx0ZXIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGN1cnJlbnQgZmlsdGVycyB0byBKU09OIG9iamVjdFxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICBjb25zdCBvYmogPSB7fSBhcyBSZWNvcmQ8a2V5b2YgUXVldWVGaWx0ZXJzLCBzdHJpbmc+O1xuXG4gICAgdGhpcy5maWx0ZXJzLmZvckVhY2goKGZpbHRlcikgPT4gb2JqW2ZpbHRlcl0gPSBBdWRpb0ZpbHRlcnMuZ2V0KGZpbHRlcikpO1xuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgY3VycmVudCBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5jcmVhdGUodGhpcy5maWx0ZXJzKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkUXVldWVBRmlsdGVyc0NhY2hlIHtcbiAgZXF1YWxpemVyOiBFcXVhbGl6ZXJCYW5kW107XG4gIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IG51bGw7XG4gIGZpbHRlcnM6IFBDTUZpbHRlcnNbXTtcbiAgdm9sdW1lOiBudW1iZXI7XG4gIHNhbXBsZVJhdGU6IG51bWJlcjtcbiAgc2FtcGxlUmF0ZUZpbHRlcjpcbiAgU3RyZWFtQ29uZmlnWydkaXNwYXRjaGVyQ29uZmlnJ11bJ3NhbXBsZVJhdGVGaWx0ZXJzJ10gfFxuICBudWxsO1xuICBjb21wcmVzc29yOiBTdHJlYW1Db25maWdbJ2Rpc3BhdGNoZXJDb25maWcnXVsnY29tcHJlc3NvciddIHwgbnVsbDtcbiAgcmV2ZXJiOiBTdHJlYW1Db25maWdbJ2Rpc3BhdGNoZXJDb25maWcnXVsncmV2ZXJiJ10gfCBudWxsO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVBdWRpb0ZpbHRlcnM8TWV0YSA9IGFueT4ge1xuICBwdWJsaWMgZ3JhcGggPSBuZXcgQUZpbHRlckdyYXBoPE1ldGE+KHRoaXMpO1xuICBwdWJsaWMgZmZtcGVnID0gbmV3IEZGbXBlZ0ZpbHRlcmVyPE1ldGE+KHRoaXMpO1xuICBwdWJsaWMgZXF1YWxpemVyUHJlc2V0cyA9IEVxdWFsaXplckNvbmZpZ3VyYXRpb25QcmVzZXQ7XG4gIHB1YmxpYyBfbGFzdEZpbHRlcnNDYWNoZTogR3VpbGRRdWV1ZUFGaWx0ZXJzQ2FjaGUgPSB7XG4gICAgYmlxdWFkOiBudWxsLFxuICAgIGVxdWFsaXplcjogW10sXG4gICAgZmlsdGVyczogW10sXG4gICAgdm9sdW1lOiAxMDAsXG4gICAgc2FtcGxlUmF0ZTogLTEsXG4gICAgY29tcHJlc3NvcjogbnVsbCxcbiAgICByZXZlcmI6IG51bGwsXG4gICAgc2FtcGxlUmF0ZUZpbHRlcjogbnVsbFxuICB9O1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnF1ZXVlLm9wdGlvbnMudm9sdW1lID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUgPSB0aGlzLnF1ZXVlLm9wdGlvbnMudm9sdW1lO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE86IGVuYWJsZSB0aGlzIGluIHRoZSBmdXR1cmVcbiAgLy8gcHVibGljIGdldCBmZm1wZWcoKTogRkZtcGVnRmlsdGVyZXI8TWV0YT4gfCBudWxsIHtcbiAgLy8gICAgIGlmICh0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLnNraXBGRm1wZWcpIHtcbiAgLy8gICAgICAgICBpZiAodGhpcy4jZmZtcGVnKSB0aGlzLiNmZm1wZWcgPSBudWxsO1xuICAvLyAgICAgICAgIHJldHVybiBudWxsO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICBpZiAoIXRoaXMuI2ZmbXBlZykge1xuICAvLyAgICAgICAgIHRoaXMuI2ZmbXBlZyA9IG5ldyBGRm1wZWdGaWx0ZXJlcjxNZXRhPih0aGlzKTtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgcmV0dXJuIHRoaXMuI2ZmbXBlZztcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBWb2x1bWUgdHJhbnNmb3JtZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgdm9sdW1lKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmRzcD8udm9sdW1lIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogMTUgQmFuZCBFcXVhbGl6ZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgZXF1YWxpemVyKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmVxdWFsaXplciB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIERpZ2l0YWwgYmlxdWFkIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmJpcXVhZCB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIERTUCBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZpbHRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZmlsdGVycyB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1ZGlvIHJlc2FtcGxlclxuICAgKi9cbiAgcHVibGljIGdldCByZXNhbXBsZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucmVzYW1wbGVyIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHJlc3NvciB0cmFuc2Zvcm1lclxuICAgKi9cbiAgcHVibGljIGdldCBjb21wcmVzc29yKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmNvbXByZXNzb3IgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZlcmIgdHJhbnNmb3JtZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgcmV2ZXJiKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnJldmVyYiB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFBDTSBTZWVrZXIgdHJhbnNmb3JtZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgc2Vla2VyKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LnNlZWtlciB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxheSBjdXJyZW50IHRyYWNrIGluIHRyYW5zaXRpb24gbW9kZVxuICAgKiBAcGFyYW0gc2VlayBUaGUgZHVyYXRpb24gdG8gc2VlayB0b1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHRyaWdnZXJSZXBsYXkoc2VlayA9IDApIHtcbiAgICBpZiAoIXRoaXMucXVldWUuY3VycmVudFRyYWNrKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLnF1ZXVlLm5vZGUudGFza3NRdWV1ZS5hY3F1aXJlKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcbiAgICAgIGF3YWl0IHRoaXMucXVldWUubm9kZS5wbGF5KHRoaXMucXVldWUuY3VycmVudFRyYWNrLCB7XG4gICAgICAgIHF1ZXVlOiBmYWxzZSxcbiAgICAgICAgc2VlayxcbiAgICAgICAgdHJhbnNpdGlvbk1vZGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgdGhpcy5xdWV1ZS5ub2RlLnRhc2tzUXVldWUucmVsZWFzZSgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLnF1ZXVlLm5vZGUudGFza3NRdWV1ZS5yZWxlYXNlKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY2xhc3MgQUZpbHRlckdyYXBoPE1ldGEgPSBhbnk+IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBhZjogR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPikge31cblxuICBwdWJsaWMgZ2V0IGZmbXBlZygpIHtcbiAgICByZXR1cm4gdGhpcy5hZi5mZm1wZWc/LmZpbHRlcnMgPz8gW107XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVxdWFsaXplcigpIHtcbiAgICByZXR1cm4gKHRoaXMuYWYuZXF1YWxpemVyPy5iYW5kTXVsdGlwbGllcnMgfHwgW10pLm1hcCgobSwgaSkgPT4gKHtcbiAgICAgIGJhbmQ6IGksXG4gICAgICBnYWluOiBtXG4gICAgfSkpIGFzIEVxdWFsaXplckJhbmRbXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmFmLmJpcXVhZD8uZ2V0RmlsdGVyTmFtZSgpIGFzIEV4Y2x1ZGU8XG4gICAgICAgIEJpcXVhZEZpbHRlcnMsXG4gICAgICAgIG51bWJlcj4gfFxuICAgICAgbnVsbCB8fCBudWxsKTtcblxuICB9XG5cbiAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLmFmLmZpbHRlcnM/LmZpbHRlcnMgfHwgW107XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZvbHVtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5hZi52b2x1bWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJlc2FtcGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5hZi5yZXNhbXBsZXI7XG4gIH1cblxuICBwdWJsaWMgZHVtcCgpOiBGaWx0ZXJHcmFwaCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZmbXBlZzogdGhpcy5mZm1wZWcsXG4gICAgICBlcXVhbGl6ZXI6IHRoaXMuZXF1YWxpemVyLFxuICAgICAgYmlxdWFkOiB0aGlzLmJpcXVhZCxcbiAgICAgIGZpbHRlcnM6IHRoaXMuZmlsdGVycyxcbiAgICAgIHNhbXBsZVJhdGU6IHRoaXMucmVzYW1wbGVyPy5zYW1wbGVSYXRlIHx8IDQ4MDAwLFxuICAgICAgdm9sdW1lOiB0aGlzLnZvbHVtZT8udm9sdW1lID8/IDEwMFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJHcmFwaCB7XG4gIGZmbXBlZzogRmlsdGVyc1tdO1xuICBlcXVhbGl6ZXI6IEVxdWFsaXplckJhbmRbXTtcbiAgYmlxdWFkOiBFeGNsdWRlPEJpcXVhZEZpbHRlcnMsIG51bWJlcj4gfCBudWxsO1xuICBmaWx0ZXJzOiBQQ01GaWx0ZXJzW107XG4gIHZvbHVtZTogbnVtYmVyO1xuICBzYW1wbGVSYXRlOiBudW1iZXI7XG59IiwgImltcG9ydCB0eXBlIHsgRHVwbGV4LCBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBGRm1wZWcsIGNyZWF0ZUZGbXBlZ0FyZ3MgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcblxuZXhwb3J0IGludGVyZmFjZSBGRm1wZWdTdHJlYW1PcHRpb25zIHtcbiAgZm10Pzogc3RyaW5nO1xuICBlbmNvZGVyQXJncz86IHN0cmluZ1tdO1xuICBzZWVrPzogbnVtYmVyO1xuICBza2lwPzogYm9vbGVhbjtcbiAgY29va2llcz86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZGTVBFR19BUkdTX1NUUklORyhcbnN0cmVhbTogc3RyaW5nLFxuZm10Pzogc3RyaW5nLFxuY29va2llcz86IHN0cmluZylcbntcbiAgY29uc3QgYXJncyA9IGNyZWF0ZUZGbXBlZ0FyZ3Moe1xuICAgIHJlY29ubmVjdDogMSxcbiAgICByZWNvbm5lY3Rfc3RyZWFtZWQ6IDEsXG4gICAgcmVjb25uZWN0X2RlbGF5X21heDogNSxcbiAgICBpOiBzdHJlYW0sXG4gICAgYW5hbHl6ZWR1cmF0aW9uOiAwLFxuICAgIGxvZ2xldmVsOiAwLFxuICAgIGFyOiA0ODAwMCxcbiAgICBhYzogMixcbiAgICBmOiBgJHt0eXBlb2YgZm10ID09PSAnc3RyaW5nJyA/IGZtdCA6ICdzMTZsZSd9YCxcbiAgICBhY29kZWM6IGZtdCA9PT0gJ29wdXMnID8gJ2xpYm9wdXMnIDogbnVsbCxcbiAgICBjb29raWVzOlxuICAgIHR5cGVvZiBjb29raWVzID09PSAnc3RyaW5nJyA/XG4gICAgIWNvb2tpZXMuaW5jbHVkZXMoJyAnKSA/XG4gICAgY29va2llcyA6XG4gICAgYFwiJHtjb29raWVzfVwiYCA6XG4gICAgbnVsbFxuICB9KTtcblxuICByZXR1cm4gYXJncztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZGTVBFR19BUkdTX1BJUEVEKGZtdD86IHN0cmluZykge1xuICBjb25zdCBhcmdzID0gY3JlYXRlRkZtcGVnQXJncyh7XG4gICAgYW5hbHl6ZWR1cmF0aW9uOiAwLFxuICAgIGxvZ2xldmVsOiAwLFxuICAgIGFyOiA0ODAwMCxcbiAgICBhYzogMixcbiAgICBmOiBgJHt0eXBlb2YgZm10ID09PSAnc3RyaW5nJyA/IGZtdCA6ICdzMTZsZSd9YCxcbiAgICBhY29kZWM6IGZtdCA9PT0gJ29wdXMnID8gJ2xpYm9wdXMnIDogbnVsbFxuICB9KTtcblxuICByZXR1cm4gYXJncztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIEZGbXBlZyBzdHJlYW1cbiAqIEBwYXJhbSBzdHJlYW0gVGhlIHNvdXJjZSBzdHJlYW1cbiAqIEBwYXJhbSBvcHRpb25zIEZGbXBlZyBzdHJlYW0gb3B0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRkZtcGVnU3RyZWFtKFxuc3RyZWFtOiBSZWFkYWJsZSB8IER1cGxleCB8IHN0cmluZyxcbm9wdGlvbnM/OiBGRm1wZWdTdHJlYW1PcHRpb25zKVxuOiBSZWFkYWJsZSB7XG4gIGlmIChvcHRpb25zPy5za2lwICYmIHR5cGVvZiBzdHJlYW0gIT09ICdzdHJpbmcnKSByZXR1cm4gc3RyZWFtO1xuICBvcHRpb25zID8/PSB7fTtcbiAgY29uc3QgYXJncyA9XG4gIHR5cGVvZiBzdHJlYW0gPT09ICdzdHJpbmcnID9cbiAgRkZNUEVHX0FSR1NfU1RSSU5HKHN0cmVhbSwgb3B0aW9ucy5mbXQsIG9wdGlvbnMuY29va2llcykgOlxuICBGRk1QRUdfQVJHU19QSVBFRChvcHRpb25zLmZtdCk7XG5cbiAgaWYgKCFOdW1iZXIuaXNOYU4ob3B0aW9ucy5zZWVrKSkgYXJncy51bnNoaWZ0KCctc3MnLCBTdHJpbmcob3B0aW9ucy5zZWVrKSk7XG4gIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuZW5jb2RlckFyZ3MpKSBhcmdzLnB1c2goLi4ub3B0aW9ucy5lbmNvZGVyQXJncyk7XG5cbiAgY29uc3QgdHJhbnNjb2RlciA9IG5ldyBGRm1wZWcoeyBzaGVsbDogZmFsc2UsIGFyZ3MgfSk7XG5cbiAgdHJhbnNjb2Rlci5vbignY2xvc2UnLCAoKSA9PiB0cmFuc2NvZGVyLmRlc3Ryb3koKSk7XG5cbiAgaWYgKHR5cGVvZiBzdHJlYW0gIT09ICdzdHJpbmcnKSB7XG4gICAgc3RyZWFtLm9uKCdlcnJvcicsICgpID0+IHRyYW5zY29kZXIuZGVzdHJveSgpKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHN0cmVhbS5waXBlKHRyYW5zY29kZXIgYXMgYW55KTtcbiAgfVxuXG4gIHJldHVybiB0cmFuc2NvZGVyO1xufSIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhIHtcbiAgbGF0ZW5jeToge1xuICAgIGV2ZW50TG9vcDogbnVtYmVyO1xuICAgIHZvaWNlQ29ubmVjdGlvbjogbnVtYmVyO1xuICB9O1xuICBzdGF0dXM6IHtcbiAgICBidWZmZXJpbmc6IGJvb2xlYW47XG4gICAgcGxheWluZzogYm9vbGVhbjtcbiAgICBwYXVzZWQ6IGJvb2xlYW47XG4gICAgaWRsZTogYm9vbGVhbjtcbiAgfTtcbiAgdHJhY2tzQ291bnQ6IG51bWJlcjtcbiAgaGlzdG9yeVNpemU6IG51bWJlcjtcbiAgZXh0cmFjdG9yczogbnVtYmVyO1xuICBsaXN0ZW5lcnM6IG51bWJlcjtcbiAgbWVtb3J5VXNhZ2U6IE5vZGVKUy5NZW1vcnlVc2FnZTtcbiAgdmVyc2lvbnM6IHtcbiAgICBub2RlOiBzdHJpbmc7XG4gICAgcGxheWVyOiBzdHJpbmc7XG4gIH07XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZVN0YXRpc3RpY3M8TWV0YSA9IGFueT4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSB7fVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBzdGF0aXN0aWNzIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGF0ZW5jeToge1xuICAgICAgICBldmVudExvb3A6IHRoaXMucXVldWUucGxheWVyLmV2ZW50TG9vcExhZyxcbiAgICAgICAgdm9pY2VDb25uZWN0aW9uOiB0aGlzLnF1ZXVlLnBpbmdcbiAgICAgIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgYnVmZmVyaW5nOiB0aGlzLnF1ZXVlLm5vZGUuaXNCdWZmZXJpbmcoKSxcbiAgICAgICAgcGxheWluZzogdGhpcy5xdWV1ZS5ub2RlLmlzUGxheWluZygpLFxuICAgICAgICBwYXVzZWQ6IHRoaXMucXVldWUubm9kZS5pc1BhdXNlZCgpLFxuICAgICAgICBpZGxlOiB0aGlzLnF1ZXVlLm5vZGUuaXNJZGxlKClcbiAgICAgIH0sXG4gICAgICB0cmFja3NDb3VudDogdGhpcy5xdWV1ZS50cmFja3Muc2l6ZSxcbiAgICAgIGhpc3RvcnlTaXplOiB0aGlzLnF1ZXVlLmhpc3RvcnkudHJhY2tzLnNpemUsXG4gICAgICBleHRyYWN0b3JzOiB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLnNpemUsXG4gICAgICBsaXN0ZW5lcnM6XG4gICAgICB0aGlzLnF1ZXVlLmd1aWxkLm1lbWJlcnMubWU/LnZvaWNlLmNoYW5uZWw/Lm1lbWJlcnMuZmlsdGVyKFxuICAgICAgICAobSkgPT4gIW0udXNlci5ib3RcbiAgICAgICkuc2l6ZSB8fCAwLFxuICAgICAgbWVtb3J5VXNhZ2U6IHByb2Nlc3MubWVtb3J5VXNhZ2UoKSxcbiAgICAgIHZlcnNpb25zOiB7XG4gICAgICAgIG5vZGU6IHByb2Nlc3MudmVyc2lvbixcbiAgICAgICAgcGxheWVyOiB0aGlzLnF1ZXVlLnBsYXllci52ZXJzaW9uXG4gICAgICB9XG4gICAgfSBhcyBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhO1xuICB9XG59IiwgImltcG9ydCB7IE5vdEV4aXN0aW5nRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgTHJjR2V0UmVzdWx0LCBMcmNTZWFyY2hSZXN1bHQgfSBmcm9tICcuLi9scmNsaWIvTHJjTGliJztcbmltcG9ydCB0eXBlIHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5cbmV4cG9ydCB0eXBlIEx5cmljc0RhdGEgPSBNYXA8bnVtYmVyLCBzdHJpbmc+O1xuZXhwb3J0IHR5cGUgVW5zdWJzY3JpYmUgPSAoKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgTHlyaWNzQ2FsbGJhY2sgPSAobHlyaWNzOiBzdHJpbmcsIHRpbWVzdGFtcDogbnVtYmVyKSA9PiB1bmtub3duO1xuZXhwb3J0IHR5cGUgTHlyaWNzQXQgPSB7dGltZXN0YW1wOiBudW1iZXI7bGluZTogc3RyaW5nO307XG5cbmNvbnN0IHRpbWVzdGFtcFBhdHRlcm4gPSAvXFxbKFxcZHsyfSk6KFxcZHsyfSlcXC4oXFxkezJ9KVxcXS87XG5cbmV4cG9ydCBjbGFzcyBTeW5jZWRMeXJpY3NQcm92aWRlciB7XG4gICNsb29wOiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuICAjY2FsbGJhY2s6IEx5cmljc0NhbGxiYWNrIHwgbnVsbCA9IG51bGw7XG4gICNvblVuc3Vic2NyaWJlOiBVbnN1YnNjcmliZSB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBpbnRlcnZhbCA9IDEwMDtcbiAgcHVibGljIHJlYWRvbmx5IGx5cmljczogTHlyaWNzRGF0YSA9IG5ldyBNYXAoKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyByZWFkb25seSBxdWV1ZTogR3VpbGRRdWV1ZSxcbiAgcHVibGljIHJlYWRvbmx5IHJhdz86IExyY0dldFJlc3VsdCB8IExyY1NlYXJjaFJlc3VsdClcbiAge1xuICAgIGlmIChyYXc/LnN5bmNlZEx5cmljcykgdGhpcy5sb2FkKHJhdz8uc3luY2VkTHlyaWNzKTtcbiAgfVxuXG4gIHB1YmxpYyBpc1N1YnNjcmliZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NhbGxiYWNrICE9PSBudWxsO1xuICB9XG5cbiAgcHVibGljIGxvYWQobHlyaWNzOiBzdHJpbmcpIHtcbiAgICBpZiAoIWx5cmljcykgdGhyb3cgbmV3IE5vdEV4aXN0aW5nRXJyb3IoJ3N5bmNlZEx5cmljcycpO1xuXG4gICAgdGhpcy5seXJpY3MuY2xlYXIoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlKCk7XG5cbiAgICBjb25zdCBsaW5lcyA9IGx5cmljcy5zcGxpdCgnXFxuJyk7XG5cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gbGluZS5tYXRjaCh0aW1lc3RhbXBQYXR0ZXJuKTtcblxuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IFssIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpc2Vjb25kc10gPSBtYXRjaDtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID1cbiAgICAgICAgcGFyc2VJbnQobWludXRlcykgKiA2MCAqIDEwMDAgK1xuICAgICAgICBwYXJzZUludChzZWNvbmRzKSAqIDEwMDAgK1xuICAgICAgICBwYXJzZUludChtaWxsaXNlY29uZHMpO1xuXG4gICAgICAgIHRoaXMubHlyaWNzLnNldCh0aW1lc3RhbXAsIGxpbmUucmVwbGFjZSh0aW1lc3RhbXBQYXR0ZXJuLCAnJykudHJpbSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbHlyaWNzIGF0IGEgc3BlY2lmaWMgdGltZSBvciBhdCB0aGUgY2xvc2VzdCB0aW1lIChcdTAwQjEyIHNlY29uZHMpXG4gICAqIEBwYXJhbSB0aW1lIFRoZSB0aW1lIGluIG1pbGxpc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIGF0KHRpbWU6IG51bWJlcik6IEx5cmljc0F0IHwgbnVsbCB7XG4gICAgY29uc3QgbG93ZXN0VGltZSA9IHRoaXMubHlyaWNzLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgaWYgKGxvd2VzdFRpbWUgPT0gbnVsbCB8fCB0aW1lIDwgbG93ZXN0VGltZSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMubHlyaWNzLmhhcyh0aW1lKSlcbiAgICByZXR1cm4geyBsaW5lOiB0aGlzLmx5cmljcy5nZXQodGltZSkgYXMgc3RyaW5nLCB0aW1lc3RhbXA6IHRpbWUgfTtcblxuICAgIGNvbnN0IGtleXMgPSBBcnJheS5mcm9tKHRoaXMubHlyaWNzLmtleXMoKSk7XG5cbiAgICBjb25zdCBjbG9zZXN0ID0ga2V5cy5yZWR1Y2UoKGEsIGIpID0+XG4gICAgTWF0aC5hYnMoYiAtIHRpbWUpIDwgTWF0aC5hYnMoYSAtIHRpbWUpID8gYiA6IGFcbiAgICApO1xuXG4gICAgaWYgKGNsb3Nlc3QgPiB0aW1lKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChNYXRoLmFicyhjbG9zZXN0IC0gdGltZSkgPiAyMDAwKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGxpbmUgPSB0aGlzLmx5cmljcy5nZXQoY2xvc2VzdCk7XG5cbiAgICBpZiAoIWxpbmUpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHsgdGltZXN0YW1wOiBjbG9zZXN0LCBsaW5lIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGJhY2sgZm9yIHRoZSBseXJpY3MgY2hhbmdlLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqL1xuICBwdWJsaWMgb25DaGFuZ2UoY2FsbGJhY2s6IEx5cmljc0NhbGxiYWNrKSB7XG4gICAgdGhpcy4jY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBkZXRlY3Qgd2hlbiB0aGUgcHJvdmlkZXIgaXMgdW5zdWJzY3JpYmVkLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqL1xuICBwdWJsaWMgb25VbnN1YnNjcmliZShjYWxsYmFjazogVW5zdWJzY3JpYmUpIHtcbiAgICB0aGlzLiNvblVuc3Vic2NyaWJlID0gY2FsbGJhY2s7XG4gIH1cblxuICAvKipcbiAgICogVW5zdWJzY3JpYmVzIGZyb20gdGhlIHF1ZXVlLlxuICAgKi9cbiAgcHVibGljIHVuc3Vic2NyaWJlKCkge1xuICAgIGlmICh0aGlzLiNsb29wKSBjbGVhckludGVydmFsKHRoaXMuI2xvb3ApO1xuICAgIGlmICh0aGlzLiNvblVuc3Vic2NyaWJlKSB0aGlzLiNvblVuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLiNjYWxsYmFjayA9IG51bGw7XG4gICAgdGhpcy4jb25VbnN1YnNjcmliZSA9IG51bGw7XG4gICAgdGhpcy4jbG9vcCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byB0aGUgcXVldWUgdG8gbW9uaXRvciB0aGUgY3VycmVudCB0aW1lLlxuICAgKiBAcmV0dXJucyBUaGUgdW5zdWJzY3JpYmUgZnVuY3Rpb25cbiAgICovXG4gIHB1YmxpYyBzdWJzY3JpYmUoKTogVW5zdWJzY3JpYmUge1xuICAgIGlmICh0aGlzLiNsb29wKSByZXR1cm4gKCkgPT4gdGhpcy51bnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy4jY3JlYXRlTG9vcCgpO1xuXG4gICAgcmV0dXJuICgpID0+IHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZXMgdGhlIGx5cmljcyBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyBwYXVzZSgpIHtcbiAgICBjb25zdCBoYXNMb29wID0gdGhpcy4jbG9vcCAhPT0gbnVsbDtcblxuICAgIGlmIChoYXNMb29wKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuI2xvb3AhKTtcbiAgICAgIHRoaXMuI2xvb3AgPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBoYXNMb29wO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZXMgdGhlIGx5cmljcyBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyByZXN1bWUoKSB7XG4gICAgY29uc3QgaGFzTG9vcCA9IHRoaXMuI2xvb3AgIT09IG51bGw7XG5cbiAgICBpZiAoIWhhc0xvb3ApIHRoaXMuI2NyZWF0ZUxvb3AoKTtcblxuICAgIHJldHVybiAhaGFzTG9vcDtcbiAgfVxuXG4gICNjcmVhdGVMb29wKCkge1xuICAgIGlmICghdGhpcy4jY2FsbGJhY2spIHJldHVybjtcbiAgICBpZiAodGhpcy4jbG9vcCkgY2xlYXJJbnRlcnZhbCh0aGlzLiNsb29wKTtcblxuICAgIGxldCBsYXN0VmFsdWU6IEx5cmljc0F0IHwgbnVsbCA9IG51bGw7XG5cbiAgICB0aGlzLiNsb29wID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucXVldWUuZGVsZXRlZCkgcmV0dXJuIHRoaXMudW5zdWJzY3JpYmUoKTtcblxuICAgICAgaWYgKCF0aGlzLiNjYWxsYmFjayB8fCAhdGhpcy5xdWV1ZS5pc1BsYXlpbmcoKSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0aW1lID0gdGhpcy5xdWV1ZS5ub2RlLmdldFRpbWVzdGFtcCgpO1xuICAgICAgaWYgKCF0aW1lKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGx5cmljcyA9IHRoaXMuYXQodGltZS5jdXJyZW50LnZhbHVlKTtcblxuICAgICAgaWYgKCFseXJpY3MpIHJldHVybjtcblxuICAgICAgaWYgKFxuICAgICAgbGFzdFZhbHVlICE9PSBudWxsICYmXG4gICAgICBseXJpY3MubGluZSA9PT0gbGFzdFZhbHVlLmxpbmUgJiZcbiAgICAgIGx5cmljcy50aW1lc3RhbXAgPT09IGxhc3RWYWx1ZS50aW1lc3RhbXApXG5cbiAgICAgIHJldHVybjtcblxuICAgICAgbGFzdFZhbHVlID0gbHlyaWNzO1xuXG4gICAgICB0aGlzLiNjYWxsYmFjayhseXJpY3MubGluZSwgbHlyaWNzLnRpbWVzdGFtcCk7XG4gICAgfSwgdGhpcy5pbnRlcnZhbCkudW5yZWYoKTtcbiAgfVxufSIsICJpbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAndGltZXJzL3Byb21pc2VzJztcbmltcG9ydCB7IEFzeW5jUXVldWUgfSBmcm9tICcuL0FzeW5jUXVldWUnO1xuXG5leHBvcnQgdHlwZSBSZXF1ZXN0RW50aXR5ID0gKCkgPT4gUHJvbWlzZTxSZXNwb25zZT47XG5cbmV4cG9ydCBjbGFzcyBTZXF1ZW50aWFsQnVja2V0IHtcbiAgcHVibGljIGxpbWl0ID0gMTtcbiAgcHVibGljIHJlbWFpbmluZyA9IDE7XG4gIHB1YmxpYyByZXNldEFmdGVyID0gMDtcbiAgcHVibGljIHF1ZXVlID0gbmV3IEFzeW5jUXVldWUoKTtcbiAgcHVibGljIE1BWF9SRVRSSUVTID0gNTtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBidWNrZXQgaXMgcmF0ZSBsaW1pdGVkLlxuICAgKi9cbiAgcHVibGljIGlzUmF0ZUxpbWl0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVtYWluaW5nIDw9IDAgJiYgRGF0ZS5ub3coKSA8IHRoaXMucmVzZXRBZnRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnF1ZXVlcyBhIHJlcXVlc3QuXG4gICAqIEBwYXJhbSByZXEgVGhlIHJlcXVlc3QgZnVuY3Rpb24gdG8gZW5xdWV1ZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVucXVldWUocmVxOiBSZXF1ZXN0RW50aXR5KSB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLnF1ZXVlLmFjcXVpcmUoKTtcbiAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QocmVxKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZW50cnkucmVsZWFzZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3JlcXVlc3QocmVxOiBSZXF1ZXN0RW50aXR5LCByZXRyaWVzID0gMCk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICB3aGlsZSAodGhpcy5pc1JhdGVMaW1pdGVkKCkpIHtcbiAgICAgIGNvbnN0IHJlc2V0ID0gdGhpcy5yZXNldEFmdGVyIC0gRGF0ZS5ub3coKTtcbiAgICAgIGF3YWl0IHNldFRpbWVvdXQocmVzZXQpO1xuICAgIH1cblxuICAgIGxldCBwYXNzID0gZmFsc2U7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgcmVxKCk7XG5cbiAgICAgIHRoaXMuX3BhdGNoSGVhZGVycyhyZXMpO1xuXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDI5KSB7XG4gICAgICAgIGNvbnN0IHJlc2V0ID0gdGhpcy5yZXNldEFmdGVyIC0gRGF0ZS5ub3coKTtcbiAgICAgICAgYXdhaXQgc2V0VGltZW91dChyZXNldCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KHJlcSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgIGxldCBlcnI6IEVycm9yO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYm9keToge1xuICAgICAgICAgICAgY29kZTogbnVtYmVyO1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgICAgbWVzc2FnZTogc3RyaW5nO1xuICAgICAgICAgIH0gPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYm9keS5tZXNzYWdlKSBhcyBFcnJvciAmIHtjb2RlOiBudW1iZXI7fTtcblxuICAgICAgICAgIGVycm9yLm5hbWUgPSBib2R5Lm5hbWU7XG4gICAgICAgICAgZXJyb3IuY29kZSA9IGJvZHkuY29kZTtcblxuICAgICAgICAgIGVyciA9IGVycm9yO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBlcnIgPSBuZXcgRXJyb3IoYEhUVFAgRXJyb3I6ICR7cmVzLnN0YXR1c30gJHtyZXMuc3RhdHVzVGV4dH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhc3MgPSB0cnVlO1xuXG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAocGFzcykgdGhyb3cgZTtcblxuICAgICAgY29uc3QgYmFkUmVxID0gZSBpbnN0YW5jZW9mIEVycm9yICYmIC9FcnJvcjogNFswLTldezJ9Ly50ZXN0KGUubWVzc2FnZSk7XG5cbiAgICAgIGlmICghYmFkUmVxICYmIHJldHJpZXMgPCB0aGlzLk1BWF9SRVRSSUVTKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KHJlcSwgKytyZXRyaWVzKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wYXRjaEhlYWRlcnMocmVzOiBSZXNwb25zZSkge1xuICAgIGNvbnN0IGxpbWl0ID0gTnVtYmVyKHJlcy5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtTGltaXQnKSk7XG4gICAgY29uc3QgcmVtYWluaW5nID0gTnVtYmVyKHJlcy5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtUmVtYWluaW5nJykpO1xuICAgIGNvbnN0IHJlc2V0QWZ0ZXIgPVxuICAgIE51bWJlcihyZXMuaGVhZGVycy5nZXQoJ1gtUmF0ZUxpbWl0LVJlc2V0JykpICogMTAwMCArIERhdGUubm93KCk7XG5cbiAgICBpZiAoIU51bWJlci5pc05hTihsaW1pdCkpIHRoaXMubGltaXQgPSBsaW1pdDtcbiAgICBpZiAoIU51bWJlci5pc05hTihyZW1haW5pbmcpKSB0aGlzLnJlbWFpbmluZyA9IHJlbWFpbmluZztcbiAgICBpZiAoIU51bWJlci5pc05hTihyZXNldEFmdGVyKSkgdGhpcy5yZXNldEFmdGVyID0gcmVzZXRBZnRlcjtcbiAgfVxufSIsICJpbXBvcnQgeyBJbnZhbGlkQXJnVHlwZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlscy9VdGlsJztcbmltcG9ydCB7IFNlcXVlbnRpYWxCdWNrZXQgfSBmcm9tICcuLi91dGlscy9TZXF1ZW50aWFsQnVja2V0JztcblxuZXhwb3J0IGludGVyZmFjZSBMcmNTZWFyY2hQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHF1ZXJ5IHRvIHNlYXJjaCBmb3IuIEVpdGhlciB0aGlzIG9yIHRyYWNrTmFtZSBpcyByZXF1aXJlZC5cbiAgICovXG4gIHE/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgbmFtZSB0byBzZWFyY2ggZm9yLiBFaXRoZXIgdGhpcyBvciBxdWVyeSBpcyByZXF1aXJlZC5cbiAgICovXG4gIHRyYWNrTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhcnRpc3QgbmFtZVxuICAgKi9cbiAgYXJ0aXN0TmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhbGJ1bSBuYW1lXG4gICAqL1xuICBhbGJ1bU5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTHJjR2V0UGFyYW1zIGV4dGVuZHMgUmVxdWlyZWQ8T21pdDxMcmNTZWFyY2hQYXJhbXMsICdxdWVyeSc+PiB7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gb2YgdGhlIHRyYWNrXG4gICAqL1xuICBkdXJhdGlvbjogbnVtYmVyO1xufVxuXG5jb25zdCB0b1NuYWtlQ2FzZSA9IChvYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+IHtcbiAgY29uc3Qgc25ha2VPYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIGNvbnRpbnVlO1xuICAgIGNvbnN0IG5ld0tleSA9IGtleS5yZXBsYWNlKFxuICAgICAgL1tBLVpdL2csXG4gICAgICAobGV0dGVyKSA9PiBgXyR7bGV0dGVyLnRvTG93ZXJDYXNlKCl9YFxuICAgICk7XG4gICAgc25ha2VPYmpbbmV3S2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHNuYWtlT2JqO1xufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmNvbnN0IGNyZWF0ZVF1ZXJ5ID0gKHBhcmFtczogYW55KSA9PlxubmV3IFVSTFNlYXJjaFBhcmFtcyh0b1NuYWtlQ2FzZShwYXJhbXMpKS50b1N0cmluZygpO1xuXG5leHBvcnQgaW50ZXJmYWNlIExyY1NlYXJjaFJlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgaWRcbiAgICovXG4gIGlkOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgbmFtZVxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGFydGlzdCBuYW1lXG4gICAqL1xuICB0cmFja05hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhbGJ1bSBuYW1lXG4gICAqL1xuICBhcnRpc3ROYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYWxidW0gbmFtZVxuICAgKi9cbiAgYWxidW1OYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gb2YgdGhlIHRyYWNrXG4gICAqL1xuICBkdXJhdGlvbjogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHJlbGVhc2UgZGF0ZSBvZiB0aGUgdHJhY2tcbiAgICovXG4gIGluc3RydW1lbnRhbDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSByZWxlYXNlIGRhdGUgb2YgdGhlIHRyYWNrXG4gICAqL1xuICBwbGFpbkx5cmljczogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJlbGVhc2UgZGF0ZSBvZiB0aGUgdHJhY2tcbiAgICovXG4gIHN5bmNlZEx5cmljcz86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgTHJjR2V0UmVzdWx0ID0gT21pdDxMcmNTZWFyY2hSZXN1bHQsICduYW1lJz47XG5cbmV4cG9ydCBjbGFzcyBMcmNMaWIge1xuICAvKipcbiAgICogVGhlIEFQSSBVUkxcbiAgICovXG4gIHB1YmxpYyBhcGkgPSAnaHR0cHM6Ly9scmNsaWIubmV0L2FwaSc7XG4gIC8qKlxuICAgKiBUaGUgcmVxdWVzdCB0aW1lb3V0LiBEZWZhdWx0IGlzIDE1IHNlY29uZHMuXG4gICAqL1xuICBwdWJsaWMgdGltZW91dCA9IDE1XzAwMDtcbiAgLyoqXG4gICAqIFRoZSByZXF1ZXN0IGJ1Y2tldFxuICAgKi9cbiAgcHVibGljIGJ1Y2tldCA9IG5ldyBTZXF1ZW50aWFsQnVja2V0KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgTHJjTGliIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7UGxheWVyfSBwbGF5ZXIgVGhlIHBsYXllciBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcikge31cblxuICAvKipcbiAgICogU2V0cyB0aGUgcmVxdWVzdCB0aW1lb3V0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IFRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIHNldFJlcXVlc3RUaW1lb3V0KHRpbWVvdXQ6IG51bWJlcikge1xuICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgcmV0cnkgbGltaXQuIERlZmF1bHQgaXMgNS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGxpbWl0IFRoZSByZXRyeSBsaW1pdFxuICAgKi9cbiAgcHVibGljIHNldFJldHJ5TGltaXQobGltaXQ6IG51bWJlcikge1xuICAgIHRoaXMuYnVja2V0Lk1BWF9SRVRSSUVTID0gbGltaXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBseXJpY3NcbiAgICogQHBhcmFtIHBhcmFtcyBUaGUgZ2V0IHBhcmFtc1xuICAgKi9cbiAgcHVibGljIGdldChwYXJhbXM6IExyY0dldFBhcmFtcykge1xuICAgIGNvbnN0IHBhdGggPSBgZ2V0PyR7Y3JlYXRlUXVlcnkocGFyYW1zKX1gO1xuXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxMcmNTZWFyY2hSZXN1bHQ+KHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgbHlyaWNzIGJ5IElEXG4gICAqIEBwYXJhbSBpZCBUaGUgbHlyaWNzIElEXG4gICAqL1xuICBwdWJsaWMgZ2V0QnlJZChpZDogYCR7bnVtYmVyfWAgfCBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PExyY1NlYXJjaFJlc3VsdD4oYGdldC8ke2lkfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgY2FjaGVkIGx5cmljc1xuICAgKiBAcGFyYW0gcGFyYW1zIFRoZSBnZXQgcGFyYW1zXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2FjaGVkKHBhcmFtczogTHJjR2V0UGFyYW1zKSB7XG4gICAgY29uc3QgcGF0aCA9IGBnZXQtY2FjaGVkPyR7Y3JlYXRlUXVlcnkocGFyYW1zKX1gO1xuXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxMcmNTZWFyY2hSZXN1bHQ+KHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaGVzIGZvciBseXJpY3NcbiAgICogQHBhcmFtIHBhcmFtcyBUaGUgc2VhcmNoIHBhcmFtc1xuICAgKi9cbiAgcHVibGljIHNlYXJjaChwYXJhbXM6IExyY1NlYXJjaFBhcmFtcykge1xuICAgIGlmICghcGFyYW1zLnEgJiYgIXBhcmFtcy50cmFja05hbWUpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgICAnb25lIG9mIHEgb3IgdHJhY2tOYW1lJyxcbiAgICAgICAgJ3N0cmluZycsXG4gICAgICAgIFtTdHJpbmcocGFyYW1zLnEpLCBTdHJpbmcocGFyYW1zLnRyYWNrTmFtZSldLmpvaW4oJywgJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IGBzZWFyY2g/JHtjcmVhdGVRdWVyeShwYXJhbXMpfWA7XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PExyY1NlYXJjaFJlc3VsdFtdPihwYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyB0aGUgQVBJXG4gICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSByZXF1ZXN0IG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXF1ZXN0PFQ+KHBhdGg6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RJbml0KTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgZGlzcGF0Y2hlciA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgdmVyc2lvbiB9ID0gVXRpbC5nZXRSdW50aW1lKCk7XG5cbiAgICAgIGNvbnN0IHJ1bnRpbWVWZXJzaW9uID1cbiAgICAgIG5hbWUgPT09ICd1bmtub3duJyA/IHZlcnNpb24gOiBgJHtuYW1lfS8ke3ZlcnNpb259YDtcblxuICAgICAgY29uc3QgaW5pdDogUmVxdWVzdEluaXQgPSB7XG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIHJlZGlyZWN0OiAnZm9sbG93JyxcbiAgICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KHRoaXMudGltZW91dCksXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnVXNlci1BZ2VudCc6IGBEaXNjb3JkLVBsYXllci8ke3RoaXMucGxheWVyLnZlcnNpb259ICR7XG4gICAgICAgICAgcnVudGltZVZlcnNpb24gPz8gJyd9YC5cbiAgICAgICAgICB0cmltRW5kKCksXG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAuLi5vcHRpb25zPy5oZWFkZXJzXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHRoaXMucGxheWVyLmRlYnVnKGBbTHJjTGliXSBSZXF1ZXN0aW5nICR7cGF0aH1gKTtcblxuICAgICAgcmV0dXJuIGZldGNoKFxuICAgICAgICBgJHt0aGlzLmFwaX0ke3BhdGguc3RhcnRzV2l0aCgnLycpID8gcGF0aCA6ICcvJyArIHBhdGh9YCxcbiAgICAgICAgaW5pdFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5idWNrZXQuZW5xdWV1ZShkaXNwYXRjaGVyKTtcblxuICAgIHJldHVybiByZXMuanNvbigpO1xuICB9XG59IiwgImltcG9ydCB7IFZvaWNlQ2hhbm5lbCwgU3RhZ2VDaGFubmVsLCBTbm93Zmxha2UgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7XG4gIERpc2NvcmRHYXRld2F5QWRhcHRlckNyZWF0b3IsXG4gIGpvaW5Wb2ljZUNoYW5uZWwsXG4gIFZvaWNlQ29ubmVjdGlvbixcbiAgZ2V0Vm9pY2VDb25uZWN0aW9uLFxuICBWb2ljZUNvbm5lY3Rpb25TdGF0dXMsXG4gIEF1ZGlvUGxheWVyIH0gZnJvbVxuJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBTdHJlYW1EaXNwYXRjaGVyIH0gZnJvbSAnLi9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB0eXBlIHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IE5vR3VpbGRRdWV1ZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuY2xhc3MgVm9pY2VVdGlscyB7XG4gIC8qKlxuICAgKiBWb2ljZSBjb25uZWN0aW9uIGNhY2hlIHRvIHN0b3JlIHZvaWNlIGNvbm5lY3Rpb25zIG9mIHRoZSBQbGF5ZXIgY29tcG9uZW50cy5cbiAgICogVGhpcyBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS5cbiAgICogSXQgb25seSBleGlzdHMgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy5cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIHB1YmxpYyBjYWNoZTogQ29sbGVjdGlvbjxTbm93Zmxha2UsIFN0cmVhbURpc3BhdGNoZXI+ID0gbmV3IENvbGxlY3Rpb248XG4gICAgU25vd2ZsYWtlLFxuICAgIFN0cmVhbURpc3BhdGNoZXI+KFxuICApO1xuXG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgdXRpbHMgY29uc3RydWN0b3JcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF5ZXI6IFBsYXllcikge31cblxuICAvKipcbiAgICogSm9pbnMgYSB2b2ljZSBjaGFubmVsLCBjcmVhdGluZyBiYXNpYyBzdHJlYW0gZGlzcGF0Y2ggbWFuYWdlclxuICAgKiBAcGFyYW0ge1N0YWdlQ2hhbm5lbHxWb2ljZUNoYW5uZWx9IGNoYW5uZWwgVGhlIHZvaWNlIGNoYW5uZWxcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSBKb2luIG9wdGlvbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8U3RyZWFtRGlzcGF0Y2hlcj59XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY29ubmVjdChcbiAgY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsLFxuICBvcHRpb25zPzoge1xuICAgIGRlYWY/OiBib29sZWFuO1xuICAgIG1heFRpbWU/OiBudW1iZXI7XG4gICAgcXVldWU6IEd1aWxkUXVldWU7XG4gICAgYXVkaW9QbGF5ZXI/OiBBdWRpb1BsYXllcjtcbiAgICBncm91cD86IHN0cmluZztcbiAgfSlcbiAgOiBQcm9taXNlPFN0cmVhbURpc3BhdGNoZXI+IHtcbiAgICBpZiAoIW9wdGlvbnM/LnF1ZXVlKSB0aHJvdyBuZXcgTm9HdWlsZFF1ZXVlRXJyb3IoKTtcbiAgICBjb25zdCBjb25uID0gYXdhaXQgdGhpcy5qb2luKGNoYW5uZWwsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHN1YiA9IG5ldyBTdHJlYW1EaXNwYXRjaGVyKFxuICAgICAgY29ubixcbiAgICAgIGNoYW5uZWwsXG4gICAgICBvcHRpb25zLnF1ZXVlLFxuICAgICAgb3B0aW9ucy5tYXhUaW1lLFxuICAgICAgb3B0aW9ucy5hdWRpb1BsYXllclxuICAgICk7XG4gICAgcmV0dXJuIHN1YjtcbiAgfVxuXG4gIC8qKlxuICAgKiBKb2lucyBhIHZvaWNlIGNoYW5uZWxcbiAgICogQHBhcmFtIHtTdGFnZUNoYW5uZWx8Vm9pY2VDaGFubmVsfSBbY2hhbm5lbF0gVGhlIHZvaWNlL3N0YWdlIGNoYW5uZWwgdG8gam9pblxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIEpvaW4gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Vm9pY2VDb25uZWN0aW9ufVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGpvaW4oXG4gIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCxcbiAgb3B0aW9ucz86IHtcbiAgICBkZWFmPzogYm9vbGVhbjtcbiAgICBtYXhUaW1lPzogbnVtYmVyO1xuICAgIGdyb3VwPzogc3RyaW5nO1xuICB9KVxuICB7XG4gICAgY29uc3QgZXhpc3RpbmdDb25uZWN0aW9uID0gdGhpcy5nZXRDb25uZWN0aW9uKFxuICAgICAgY2hhbm5lbC5ndWlsZC5pZCxcbiAgICAgIG9wdGlvbnM/Lmdyb3VwXG4gICAgKTtcblxuICAgIGlmIChcbiAgICBleGlzdGluZ0Nvbm5lY3Rpb24/LmpvaW5Db25maWcuY2hhbm5lbElkID09PSBjaGFubmVsPy5pZCAmJlxuICAgIGV4aXN0aW5nQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgIT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpXG4gICAge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nQ29ubmVjdGlvbjtcbiAgICB9XG5cbiAgICBjb25zdCBjb25uID0gam9pblZvaWNlQ2hhbm5lbCh7XG4gICAgICBndWlsZElkOiBjaGFubmVsLmd1aWxkLmlkLFxuICAgICAgY2hhbm5lbElkOiBjaGFubmVsLmlkLFxuICAgICAgYWRhcHRlckNyZWF0b3I6IGNoYW5uZWwuZ3VpbGQuXG4gICAgICB2b2ljZUFkYXB0ZXJDcmVhdG9yIGFzIHVua25vd24gYXMgRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvcixcbiAgICAgIHNlbGZEZWFmOiBCb29sZWFuKG9wdGlvbnM/LmRlYWYpLFxuICAgICAgZGVidWc6IHRoaXMucGxheWVyLmV2ZW50cy5saXN0ZW5lckNvdW50KCdkZWJ1ZycpID4gMCxcbiAgICAgIGdyb3VwOiBvcHRpb25zPy5ncm91cFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbm47XG4gIH1cblxuICAvKipcbiAgICogRGlzY29ubmVjdHMgdm9pY2UgY29ubmVjdGlvblxuICAgKiBAcGFyYW0ge1ZvaWNlQ29ubmVjdGlvbn0gY29ubmVjdGlvbiBUaGUgdm9pY2UgY29ubmVjdGlvblxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHB1YmxpYyBkaXNjb25uZWN0KGNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbiB8IFN0cmVhbURpc3BhdGNoZXIpIHtcbiAgICBpZiAoY29ubmVjdGlvbiBpbnN0YW5jZW9mIFN0cmVhbURpc3BhdGNoZXIpXG4gICAgY29ubmVjdGlvbiA9IGNvbm5lY3Rpb24udm9pY2VDb25uZWN0aW9uO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChjb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZClcbiAgICAgIHJldHVybiBjb25uZWN0aW9uLmRlc3Ryb3koKTtcbiAgICB9IGNhdGNoIHtcblxuICAgICAgLy9cbiAgICB9fVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIERpc2NvcmQgUGxheWVyIHZvaWNlIGNvbm5lY3Rpb25cbiAgICogQHBhcmFtIHtTbm93Zmxha2V9IGd1aWxkIFRoZSBndWlsZCBpZFxuICAgKiBAcmV0dXJucyB7U3RyZWFtRGlzcGF0Y2hlcn1cbiAgICovXG4gIHB1YmxpYyBnZXRDb25uZWN0aW9uKGd1aWxkOiBTbm93Zmxha2UsIGdyb3VwPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGdldFZvaWNlQ29ubmVjdGlvbihndWlsZCwgZ3JvdXApO1xuICB9XG59XG5cbmV4cG9ydCB7IFZvaWNlVXRpbHMgfTsiLCAiaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IFNlYXJjaFJlc3VsdCB9IGZyb20gJy4uL2ZhYnJpYy9TZWFyY2hSZXN1bHQnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi9RdWVyeVJlc29sdmVyJztcblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNhY2hlT3B0aW9ucyB7XG4gIGNoZWNrSW50ZXJ2YWw/OiBudW1iZXI7XG59XG5cbi8vIDVoXG5jb25zdCBERUZBVUxUX0VYUElSWV9USU1FT1VUID0gMThfMDAwXzAwMDtcblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNhY2hlUHJvdmlkZXI8VD4ge1xuICBnZXREYXRhKCk6IFByb21pc2U8RGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGU8VD5bXT47XG4gIGFkZERhdGEoZGF0YTogU2VhcmNoUmVzdWx0KTogUHJvbWlzZTx2b2lkPjtcbiAgcmVzb2x2ZShjb250ZXh0OiBRdWVyeUNhY2hlUmVzb2x2ZXJDb250ZXh0KTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+O1xufVxuXG5leHBvcnQgY2xhc3MgUXVlcnlDYWNoZSBpbXBsZW1lbnRzIFF1ZXJ5Q2FjaGVQcm92aWRlcjxUcmFjaz4ge1xuICAjZGVmYXVsdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlPFRyYWNrPj4oKTtcbiAgcHVibGljIHRpbWVyOiBOb2RlSlMuVGltZXI7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgcHVibGljIHBsYXllcjogUGxheWVyLFxuICBwdWJsaWMgb3B0aW9uczogUXVlcnlDYWNoZU9wdGlvbnMgPSB7XG4gICAgY2hlY2tJbnRlcnZhbDogREVGQVVMVF9FWFBJUllfVElNRU9VVFxuICB9KVxuICB7XG4gICAgdGhpcy50aW1lciA9IHNldEludGVydmFsKFxuICAgICAgdGhpcy5jbGVhbnVwLmJpbmQodGhpcyksXG4gICAgICB0aGlzLmNoZWNrSW50ZXJ2YWxcbiAgICApLnVucmVmKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNoZWNrSW50ZXJ2YWwoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jaGVja0ludGVydmFsID8/IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQ7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2xlYW51cCgpIHtcbiAgICBmb3IgKGNvbnN0IFtpZCwgdmFsdWVdIG9mIHRoaXMuI2RlZmF1bHRDYWNoZSkge1xuICAgICAgaWYgKHZhbHVlLmhhc0V4cGlyZWQoKSkge1xuICAgICAgICB0aGlzLiNkZWZhdWx0Q2FjaGUuZGVsZXRlKGlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY2xlYXIoKSB7XG4gICAgdGhpcy4jZGVmYXVsdENhY2hlLmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGF0YSgpIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuI2RlZmF1bHRDYWNoZS52YWx1ZXMoKV07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYWRkRGF0YShkYXRhOiBTZWFyY2hSZXN1bHQpIHtcbiAgICBkYXRhLnRyYWNrcy5mb3JFYWNoKChkKSA9PiB7XG4gICAgICBpZiAodGhpcy4jZGVmYXVsdENhY2hlLmhhcyhkLnVybCkpIHJldHVybjtcbiAgICAgIHRoaXMuI2RlZmF1bHRDYWNoZS5zZXQoZC51cmwsIG5ldyBEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZShkKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVzb2x2ZShjb250ZXh0OiBRdWVyeUNhY2hlUmVzb2x2ZXJDb250ZXh0KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy4jZGVmYXVsdENhY2hlLmdldChjb250ZXh0LnF1ZXJ5KTtcbiAgICBpZiAoIXJlc3VsdClcbiAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLnBsYXllciwge1xuICAgICAgcXVlcnk6IGNvbnRleHQucXVlcnksXG4gICAgICByZXF1ZXN0ZWRCeTogY29udGV4dC5yZXF1ZXN0ZWRCeSxcbiAgICAgIHF1ZXJ5VHlwZTogY29udGV4dC5xdWVyeVR5cGVcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMucGxheWVyLCB7XG4gICAgICBxdWVyeTogY29udGV4dC5xdWVyeSxcbiAgICAgIHRyYWNrczogW3Jlc3VsdC5kYXRhXSxcbiAgICAgIHBsYXlsaXN0OiBudWxsLFxuICAgICAgcXVlcnlUeXBlOiBjb250ZXh0LnF1ZXJ5VHlwZSxcbiAgICAgIHJlcXVlc3RlZEJ5OiBjb250ZXh0LnJlcXVlc3RlZEJ5XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlPFQgPSB1bmtub3duPiB7XG4gIHB1YmxpYyBleHBpcmVBZnRlciA9IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQ7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgcHVibGljIGRhdGE6IFQsXG4gIGV4cGlyZUFmdGVyOiBudW1iZXIgPSBERUZBVUxUX0VYUElSWV9USU1FT1VUKVxuICB7XG4gICAgaWYgKHR5cGVvZiBleHBpcmVBZnRlciA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuZXhwaXJlQWZ0ZXIgPSBEYXRlLm5vdygpICsgZXhwaXJlQWZ0ZXI7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhhc0V4cGlyZWQoKSB7XG4gICAgaWYgKFxuICAgIHR5cGVvZiB0aGlzLmV4cGlyZUFmdGVyICE9PSAnbnVtYmVyJyB8fFxuICAgIGlzTmFOKHRoaXMuZXhwaXJlQWZ0ZXIpIHx8XG4gICAgdGhpcy5leHBpcmVBZnRlciA8IDEpXG5cbiAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIERhdGUubm93KCkgPD0gdGhpcy5leHBpcmVBZnRlcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2FjaGVSZXNvbHZlckNvbnRleHQge1xuICBxdWVyeTogc3RyaW5nO1xuICByZXF1ZXN0ZWRCeT86IFVzZXI7XG4gIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IGBleHQ6JHtzdHJpbmd9YDtcbn0iLCAiaW1wb3J0IHsgRkZtcGVnIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2ZmbXBlZyc7XG5pbXBvcnQge1xuICBDbGllbnQsXG4gIFNub3dmbGFrZVV0aWwsXG4gIFZvaWNlU3RhdGUsXG4gIEludGVudHNCaXRGaWVsZCxcbiAgVXNlcixcbiAgR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICB2ZXJzaW9uIGFzIGRqc1ZlcnNpb24sXG4gIEV2ZW50cyB9IGZyb21cbidkaXNjb3JkLmpzJztcbmltcG9ydCB7XG4gIFBsYXlsaXN0LFxuICBUcmFjayxcbiAgU2VhcmNoUmVzdWx0LFxuICBTZWFyY2hPcHRpb25zLFxuICBQbGF5bGlzdEluaXREYXRhIH0gZnJvbVxuJy4vZmFicmljJztcbmltcG9ydCB7XG4gIEd1aWxkUXVldWVFdmVudHMsXG4gIFZvaWNlQ29ubmVjdENvbmZpZyxcbiAgR3VpbGROb2RlQ3JlYXRlT3B0aW9ucyxcbiAgR3VpbGROb2RlTWFuYWdlcixcbiAgR3VpbGRRdWV1ZSxcbiAgUmVzb3VyY2VQbGF5T3B0aW9ucyxcbiAgR3VpbGRRdWV1ZUV2ZW50IH0gZnJvbVxuJy4vcXVldWUnO1xuaW1wb3J0IHsgVm9pY2VVdGlscyB9IGZyb20gJy4vc3RyZWFtL1ZvaWNlVXRpbHMnO1xuaW1wb3J0IHtcbiAgUXVlcnlSZXNvbHZlcixcbiAgUXVlcnlUeXBlLFxuICBSZXNvbHZlZFF1ZXJ5LFxuICBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tXG4nLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHtcbiAgQXVkaW9SZXNvdXJjZSxcbiAgdmVyc2lvbiBhcyBkVm9pY2VWZXJzaW9uLFxuICBTdHJlYW1UeXBlIH0gZnJvbVxuJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0IH0gZnJvbSAnLi9leHRyYWN0b3JzL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuaW1wb3J0IHsgQmFzZUV4dHJhY3RvciB9IGZyb20gJy4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFF1ZXJ5Q2FjaGUsIFF1ZXJ5Q2FjaGVQcm92aWRlciB9IGZyb20gJy4vdXRpbHMvUXVlcnlDYWNoZSc7XG5pbXBvcnQgeyBQbGF5ZXJFdmVudHNFbWl0dGVyIH0gZnJvbSAnLi91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyJztcbmltcG9ydCB7IEludmFsaWRBcmdUeXBlRXJyb3IsIE5vUmVzdWx0RXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBkZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXIgfSBmcm9tICcuL0RlZmF1bHRWb2ljZVN0YXRlSGFuZGxlcic7XG5pbXBvcnQgeyBDb250ZXh0LCBjcmVhdGVDb250ZXh0IH0gZnJvbSAnLi9ob29rcyc7XG5pbXBvcnQgeyBIb29rc0N0eCwgU1VQRVJfQ09OVEVYVCB9IGZyb20gJy4vaG9va3MvY29tbW9uJztcbmltcG9ydCB7IExyY0xpYiB9IGZyb20gJy4vbHJjbGliL0xyY0xpYic7XG5pbXBvcnQgeyBnZXRDb21wYXROYW1lLCBpc0NsaWVudFByb3h5IH0gZnJvbSAnLi9jb21wYXQvY29tbW9uJztcbmltcG9ydCB7IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IgfSBmcm9tICcuL3V0aWxzL0RlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3InO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuL3V0aWxzL19faW50ZXJuYWxfXyc7XG5pbXBvcnQgeyB2ZXJzaW9uIGFzIGRwVmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbic7XG5pbXBvcnQge1xuICBQbGF5ZXJTdHJlYW1JbnRlcmNlcHRvcixcbiAgdHlwZSBQbGF5ZXJTdHJlYW1JbnRlcmNlcHRvck9wdGlvbnMgfSBmcm9tXG4nLi9QbGF5ZXJTdHJlYW1JbnRlcmNlcHRvcic7XG5pbXBvcnQgdHlwZSB7IEludGVyY2VwdGVkU3RyZWFtIH0gZnJvbSAnLi9zdHJlYW0vSW50ZXJjZXB0ZWRTdHJlYW0nO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllckV2ZW50cyB7XG4gIGRlYnVnOiAobWVzc2FnZTogc3RyaW5nKSA9PiBhbnk7XG4gIGVycm9yOiAoZXJyb3I6IEVycm9yKSA9PiBhbnk7XG4gIHZvaWNlU3RhdGVVcGRhdGU6IChcbiAgcXVldWU6IEd1aWxkUXVldWUsXG4gIG9sZFN0YXRlOiBWb2ljZVN0YXRlLFxuICBuZXdTdGF0ZTogVm9pY2VTdGF0ZSlcbiAgPT4gYW55O1xufVxuXG5leHBvcnQgY29uc3QgUGxheWVyRXZlbnQgPSB7XG4gIGRlYnVnOiAnZGVidWcnLFxuICBEZWJ1ZzogJ2RlYnVnJyxcbiAgZXJyb3I6ICdlcnJvcicsXG4gIEVycm9yOiAnZXJyb3InLFxuICB2b2ljZVN0YXRlVXBkYXRlOiAndm9pY2VTdGF0ZVVwZGF0ZScsXG4gIFZvaWNlU3RhdGVVcGRhdGU6ICd2b2ljZVN0YXRlVXBkYXRlJ1xufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFBsYXllckV2ZW50ID0gKHR5cGVvZiBQbGF5ZXJFdmVudClba2V5b2YgdHlwZW9mIFBsYXllckV2ZW50XTtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQ8VCA9IGFueT4ge1xuICB0cmFjazogVHJhY2s7XG4gIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGw7XG4gIHNlYXJjaFJlc3VsdDogU2VhcmNoUmVzdWx0O1xuICBxdWV1ZTogR3VpbGRRdWV1ZTxUPjtcbn1cblxuLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbmV4cG9ydCB0eXBlIFRyYWNrTGlrZSA9XG5zdHJpbmcgfFxuVHJhY2sgfFxuU2VhcmNoUmVzdWx0IHxcblRyYWNrW10gfFxuUGxheWxpc3QgfFxuQXVkaW9SZXNvdXJjZTtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPFQ+IGV4dGVuZHMgU2VhcmNoT3B0aW9ucyB7XG4gIG5vZGVPcHRpb25zPzogR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUPjtcbiAgY29ubmVjdGlvbk9wdGlvbnM/OiBWb2ljZUNvbm5lY3RDb25maWc7XG4gIGF1ZGlvUGxheWVyT3B0aW9ucz86IFJlc291cmNlUGxheU9wdGlvbnM7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICBhZnRlclNlYXJjaD86IChyZXN1bHQ6IFNlYXJjaFJlc3VsdCkgPT4gUHJvbWlzZTxTZWFyY2hSZXN1bHQ+O1xufVxuXG5leHBvcnQgdHlwZSBWb2ljZVN0YXRlSGFuZGxlciA9IChcbnBsYXllcjogUGxheWVyLFxucXVldWU6IEd1aWxkUXVldWUsXG5vbGRWb2ljZVN0YXRlOiBWb2ljZVN0YXRlLFxubmV3Vm9pY2VTdGF0ZTogVm9pY2VTdGF0ZSlcbj0+IEF3YWl0ZWQ8dm9pZD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVySW5pdE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHZvaWNlIGNvbm5lY3Rpb24gdGltZW91dFxuICAgKi9cbiAgY29ubmVjdGlvblRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaW1lIGluIG1zIHRvIHJlLW1vbml0b3IgZXZlbnQgbG9vcCBsYWdcbiAgICovXG4gIGxhZ01vbml0b3I/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBQcmV2ZW50IHZvaWNlIHN0YXRlIGhhbmRsZXIgZnJvbSBiZWluZyBvdmVycmlkZGVuXG4gICAqL1xuICBsb2NrVm9pY2VTdGF0ZUhhbmRsZXI/OiBib29sZWFuO1xuICAvKipcbiAgICogTGlzdCBvZiBleHRyYWN0b3JzIHRvIGRpc2FibGUgcXVlcnlpbmcgbWV0YWRhdGEgZnJvbVxuICAgKi9cbiAgYmxvY2tFeHRyYWN0b3JzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBMaXN0IG9mIGV4dHJhY3RvcnMgdG8gZGlzYWJsZSBzdHJlYW1pbmcgZnJvbVxuICAgKi9cbiAgYmxvY2tTdHJlYW1Gcm9tPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBRdWVyeSBjYWNoZSBwcm92aWRlclxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcXVlcnlDYWNoZT86IFF1ZXJ5Q2FjaGVQcm92aWRlcjxhbnk+IHwgbnVsbDtcbiAgLyoqXG4gICAqIFNraXAgZmZtcGVnIHByb2Nlc3Mgd2hlbiBwb3NzaWJsZVxuICAgKi9cbiAgc2tpcEZGbXBlZz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgcHJvYmUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIDUwMDAuXG4gICAqL1xuICBwcm9iZVRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBDb25maWd1cmUgZmZtcGVnIHBhdGhcbiAgICovXG4gIGZmbXBlZ1BhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIG92ZXJyaWRlIHRoZSBmYWxsYmFjayBjb250ZXh0LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICBvdmVycmlkZUZhbGxiYWNrQ29udGV4dD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBQbGF5ZXIgZXh0ZW5kcyBQbGF5ZXJFdmVudHNFbWl0dGVyPFBsYXllckV2ZW50cz4ge1xuICAjbGFzdExhdGVuY3kgPSAtMTtcbiAgI3ZvaWNlU3RhdGVVcGRhdGVMaXN0ZW5lciA9IHRoaXMuaGFuZGxlVm9pY2VTdGF0ZS5iaW5kKHRoaXMpO1xuICAjbGFnTW9uaXRvclRpbWVvdXQ6IE5vZGVKUy5UaW1lb3V0O1xuICAjbGFnTW9uaXRvckludGVydmFsOiBOb2RlSlMuVGltZW91dDtcbiAgI29uVm9pY2VTdGF0ZVVwZGF0ZTogVm9pY2VTdGF0ZUhhbmRsZXIgPSBkZWZhdWx0Vm9pY2VTdGF0ZUhhbmRsZXI7XG4gICNob29rc0N0eDogQ29udGV4dDxIb29rc0N0eD4gfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIGRpc2NvcmQtcGxheWVyXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZyA9IGRwVmVyc2lvbjtcbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGlzIHBsYXllciBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gIC8qKlxuICAgKiBUaGUgZGlzY29yZC5qcyBjbGllbnRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQhOiBDbGllbnQ7XG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBvcHRpb25zITogUGxheWVySW5pdE9wdGlvbnM7XG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIG5vZGVzIChxdWV1ZSkgbWFuYWdlclxuICAgKi9cbiAgcHVibGljIG5vZGVzID0gbmV3IEd1aWxkTm9kZU1hbmFnZXIodGhpcyk7XG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgYXBpIHV0aWxpdGllc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZvaWNlVXRpbHMgPSBuZXcgVm9pY2VVdGlscyh0aGlzKTtcbiAgLyoqXG4gICAqIFRoZSBleHRyYWN0b3JzIG1hbmFnZXJcbiAgICovXG4gIHB1YmxpYyBleHRyYWN0b3JzID0gbmV3IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQodGhpcyk7XG4gIC8qKlxuICAgKiBUaGUgcGxheWVyIGV2ZW50cyBjaGFubmVsXG4gICAqL1xuICBwdWJsaWMgZXZlbnRzID0gbmV3IFBsYXllckV2ZW50c0VtaXR0ZXI8R3VpbGRRdWV1ZUV2ZW50cz4oW1xuICBHdWlsZFF1ZXVlRXZlbnQuRXJyb3IsXG4gIEd1aWxkUXVldWVFdmVudC5QbGF5ZXJFcnJvcl1cbiAgKTtcbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgdmVyc2lvblxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZlcnNpb24gPSBQbGF5ZXIudmVyc2lvbjtcbiAgLyoqXG4gICAqIFRoZSBseXJpY3MgYXBpXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbHlyaWNzID0gbmV3IExyY0xpYih0aGlzKTtcblxuICAjc3RyZWFtSW50ZXJjZXB0b3I6IFBsYXllclN0cmVhbUludGVyY2VwdG9yIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbmV3IERpc2NvcmQgUGxheWVyXG4gICAqIEBwYXJhbSB7Q2xpZW50fSBjbGllbnQgVGhlIERpc2NvcmQgQ2xpZW50XG4gICAqIEBwYXJhbSB7UGxheWVySW5pdE9wdGlvbnN9IFtvcHRpb25zXSBUaGUgcGxheWVyIGluaXQgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50LCBvcHRpb25zOiBQbGF5ZXJJbml0T3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoW1BsYXllckV2ZW50LkVycm9yXSk7XG5cbiAgICBpZiAob3B0aW9ucy5mZm1wZWdQYXRoKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmZtcGVnUGF0aCAhPT0gJ3N0cmluZycpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBgRXhwZWN0ZWQgdHlwZSBcInN0cmluZ1wiIGZvciBvcHRpb25zLmZmbXBlZ1BhdGguIEdvdCAke3R5cGVvZiBvcHRpb25zLmZmbXBlZ1BhdGh9IGluc3RlYWRgXG4gICAgICApO1xuXG4gICAgICBwcm9jZXNzLmVudi5GRk1QRUdfUEFUSCA9IG9wdGlvbnMuZmZtcGVnUGF0aDtcbiAgICB9XG5cbiAgICBjb25zdCBpc0NvbXBhdE1vZGUgPSBpc0NsaWVudFByb3h5KGNsaWVudCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGlzY29yZCBjbGllbnRcbiAgICAgKiBAdHlwZSB7Q2xpZW50fVxuICAgICAqL1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuXG4gICAgaWYgKCFpc0NvbXBhdE1vZGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghKGNsaWVudCBpbnN0YW5jZW9mIENsaWVudCkpIHtcbiAgICAgICAgICBVdGlsLndhcm4oXG4gICAgICAgICAgICBgQ2xpZW50IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBkaXNjb3JkLmpzQCR7ZGpzVmVyc2lvbn0gY2xpZW50LCBzb21lIHRoaW5ncyBtYXkgbm90IHdvcmsgY29ycmVjdGx5LiBUaGlzIGNhbiBoYXBwZW4gZHVlIHRvIGNvcnJ1cHQgZGVwZW5kZW5jaWVzIG9yIGhhdmluZyBtdWx0aXBsZSBpbnN0YWxsYXRpb25zIG9mIGRpc2NvcmQuanMuYCxcbiAgICAgICAgICAgICdJbnZhbGlkQ2xpZW50SW5zdGFuY2UnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGliZiA9XG4gICAgICAgIHRoaXMuY2xpZW50Lm9wdGlvbnMuaW50ZW50cyBpbnN0YW5jZW9mIEludGVudHNCaXRGaWVsZCA/XG4gICAgICAgIHRoaXMuY2xpZW50Lm9wdGlvbnMuaW50ZW50cyA6XG4gICAgICAgIG5ldyBJbnRlbnRzQml0RmllbGQodGhpcy5jbGllbnQub3B0aW9ucy5pbnRlbnRzKTtcblxuICAgICAgICBpZiAoIWliZi5oYXMoSW50ZW50c0JpdEZpZWxkLkZsYWdzLkd1aWxkVm9pY2VTdGF0ZXMpKSB7XG4gICAgICAgICAgVXRpbC53YXJuKFxuICAgICAgICAgICAgJ2NsaWVudCBpcyBtaXNzaW5nIFwiR3VpbGRWb2ljZVN0YXRlc1wiIGludGVudCcsXG4gICAgICAgICAgICAnSW52YWxpZEludGVudHNCaXRGaWVsZCdcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcblxuICAgICAgICAvLyBub29wXG4gICAgICB9fVxuXG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgbG9ja1ZvaWNlU3RhdGVIYW5kbGVyOiBmYWxzZSxcbiAgICAgIGJsb2NrRXh0cmFjdG9yczogW10sXG4gICAgICBibG9ja1N0cmVhbUZyb206IFtdLFxuICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IDIwMDAwLFxuICAgICAgbGFnTW9uaXRvcjogMzAwMDAsXG4gICAgICBxdWVyeUNhY2hlOlxuICAgICAgb3B0aW9ucy5xdWVyeUNhY2hlID09PSBudWxsID9cbiAgICAgIG51bGwgOlxuICAgICAgb3B0aW9ucy5xdWVyeUNhY2hlIHx8IG5ldyBRdWVyeUNhY2hlKHRoaXMpLFxuICAgICAgc2tpcEZGbXBlZzogdHJ1ZSxcbiAgICAgIHByb2JlVGltZW91dDogNTAwMCxcbiAgICAgIG92ZXJyaWRlRmFsbGJhY2tDb250ZXh0OiB0cnVlLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0gc2F0aXNmaWVzIFBsYXllckluaXRPcHRpb25zO1xuXG4gICAgaWYgKCFpc0NvbXBhdE1vZGUpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmUgcHJpdmF0ZSBtZXRob2RcbiAgICAgIHRoaXMuY2xpZW50LmluY3JlbWVudE1heExpc3RlbmVycygpO1xuICAgICAgdGhpcy5jbGllbnQub24oRXZlbnRzLlZvaWNlU3RhdGVVcGRhdGUsIHRoaXMuI3ZvaWNlU3RhdGVVcGRhdGVMaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgcHJpdmF0ZSBtZXRob2RcbiAgICAgICAgdGhpcy5jbGllbnQuX19kcF92b2ljZVN0YXRlVXBkYXRlX3Byb3h5KHRoaXMuI3ZvaWNlU3RhdGVVcGRhdGVMaXN0ZW5lcik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIFV0aWwud2FybihcbiAgICAgICAgICAnRmFpbGVkIHRvIGF0dGFjaCB2b2ljZSBzdGF0ZSB1cGRhdGUgcHJveHksIHZvaWNlIHN0YXRlIGhhbmRsZXIgd2lsbCBub3Qgd29yayBwcm9wZXJseScsXG4gICAgICAgICAgJ0NvbXBhdE1vZGVFcnJvcidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgdHlwZW9mIHRoaXMub3B0aW9ucy5sYWdNb25pdG9yID09PSAnbnVtYmVyJyAmJlxuICAgIHRoaXMub3B0aW9ucy5sYWdNb25pdG9yID4gMClcbiAgICB7XG4gICAgICB0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgIHRoaXMuI2xhZ01vbml0b3JUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jbGFzdExhdGVuY3kgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0O1xuICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgICBgW0xhZyBNb25pdG9yXSBFdmVudCBsb29wIGxhdGVuY3k6ICR7dGhpcy4jbGFzdExhdGVuY3l9bXNgXG4gICAgICAgICAgKTtcbiAgICAgICAgfSwgMCkudW5yZWYoKTtcbiAgICAgIH0sIHRoaXMub3B0aW9ucy5sYWdNb25pdG9yKS51bnJlZigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMub3ZlcnJpZGVGYWxsYmFja0NvbnRleHQpIHtcbiAgICAgIGdldEdsb2JhbFJlZ2lzdHJ5KCkuc2V0KCdAW3BsYXllcl0nLCB0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGhvb2tzIGNvbnRleHQgZm9yIHRoaXMgcGxheWVyIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGdldCBjb250ZXh0KCkge1xuICAgIGlmICghdGhpcy4jaG9va3NDdHgpIHtcbiAgICAgIHRoaXMuI2hvb2tzQ3R4ID0gY3JlYXRlQ29udGV4dCgpO1xuXG4gICAgICBjb25zdCBvcmlnaW5hbFByb3ZpZGVyID0gdGhpcy4jaG9va3NDdHgucHJvdmlkZS5iaW5kKHRoaXMuI2hvb2tzQ3R4KTtcblxuICAgICAgdGhpcy4jaG9va3NDdHgucHJvdmlkZSA9ICh2YWx1ZSwgcmVjZWl2ZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIFNVUEVSX0NPTlRFWFQucHJvdmlkZSh0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUHJvdmlkZXIodmFsdWUsICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZWNlaXZlcigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI2hvb2tzQ3R4O1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgY2FsbGJhY2tcbiAgICovXG4gIHB1YmxpYyBvblZvaWNlU3RhdGVVcGRhdGUoaGFuZGxlcjogVm9pY2VTdGF0ZUhhbmRsZXIpIHtcbiAgICB0aGlzLiNvblZvaWNlU3RhdGVVcGRhdGUgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIGRlYnVnKG06IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmVtaXQoJ2RlYnVnJywgbSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBuZXcgZGlzY29yZC1wbGF5ZXIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBjbGllbnQgVGhlIGNsaWVudCB0aGF0IGluc3RhbnRpYXRlZCBwbGF5ZXJcbiAgICogQHBhcmFtIG9wdGlvbnMgUGxheWVyIGluaXRpYWxpemVyIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlKGNsaWVudDogQ2xpZW50LCBvcHRpb25zOiBQbGF5ZXJJbml0T3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBQbGF5ZXIoY2xpZW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBxdWVyeSBjYWNoZSBwcm92aWRlciBpbiB1c2VcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlcnlDYWNoZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLnF1ZXJ5Q2FjaGUgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGlhcyB0byBgUGxheWVyLm5vZGVzYC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcXVldWVzKCkge1xuICAgIHJldHVybiB0aGlzLm5vZGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGxvb3AgbGF0ZW5jeSBpbiBtcy4gSWYgeW91ciBib3QgaXMgbGFnZ3kgYW5kIHRoaXMgcmV0dXJucyBhIG51bWJlciBhYm92ZSAyMG1zIGZvciBleGFtcGxlLFxuICAgKiBzb21lIGV4cGVuc2l2ZSB0YXNrIGlzIGJlaW5nIGV4ZWN1dGVkIG9uIHRoZSBjdXJyZW50IHRocmVhZCB3aGljaCBpcyBzbG93aW5nIGRvd24gdGhlIGV2ZW50IGxvb3AuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBwdWJsaWMgZ2V0IGV2ZW50TG9vcExhZygpIHtcbiAgICByZXR1cm4gdGhpcy4jbGFzdExhdGVuY3k7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIHN0YXRpc3RpY3MgdGhhdCBjb3VsZCBiZSB1c2VmdWwuIFN0YXRpc3RpY3MgZ2VuZXJhdG9yIGlzIHN0aWxsIGV4cGVyaW1lbnRhbC5cbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0cyA9IHBsYXllci5nZW5lcmF0ZVN0YXRpc3RpY3MoKTtcbiAgICpcbiAgICogY29uc29sZS5sb2coc3RhdHMpO1xuICAgKlxuICAgKiAvLyBvdXRwdXRzIHNvbWV0aGluZyBsaWtlXG4gICAqIC8vIHtcbiAgICogLy8gICBxdWV1ZXNDb3VudDogbnVtYmVyLFxuICAgKiAvLyAgIHF1ZXJ5Q2FjaGVFbmFibGVkOiBib29sZWFuLFxuICAgKiAvLyAgIHF1ZXVlczogW1xuICAgKiAvLyAgICAgIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGEsXG4gICAqIC8vICAgICAgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSxcbiAgICogLy8gICAgICBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhLFxuICAgKiAvLyAgICAgIC4uLlxuICAgKiAvLyAgIF1cbiAgICogLy8gfVxuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZVN0YXRpc3RpY3MoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXVlc0NvdW50OiB0aGlzLnF1ZXVlcy5jYWNoZS5zaXplLFxuICAgICAgcXVlcnlDYWNoZUVuYWJsZWQ6IHRoaXMucXVlcnlDYWNoZSAhPSBudWxsLFxuICAgICAgcXVldWVzOiB0aGlzLnF1ZXVlcy5jYWNoZS5tYXAoKG0pID0+IG0uc3RhdHMuZ2VuZXJhdGUoKSlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBsYXllciBpcyBpbiBjb21wYXRpYmlsaXR5IG1vZGUuIENvbXBhdGliaWxpdHkgbW9kZSBpcyBlbmFibGVkIHdoZW4gbm9uLWRpc2NvcmQuanMgY2xpZW50IGlzIHVzZWQuXG4gICAqL1xuICBwdWJsaWMgaXNDb21wYXRNb2RlKCkge1xuICAgIHJldHVybiBpc0NsaWVudFByb3h5KHRoaXMuY2xpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95IGV2ZXJ5IHNpbmdsZSBxdWV1ZXMgbWFuYWdlZCBieSB0aGlzIG1hc3RlciBwbGF5ZXIgaW5zdGFuY2VcbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiAvLyB1c2UgbWUgd2hlbiB5b3Ugd2FudCB0byBpbW1lZGlhdGVseSB0ZXJtaW5hdGUgZXZlcnkgc2luZ2xlIHF1ZXVlcyBpbiBleGlzdGVuY2UgXHVEODNEXHVERDJBXG4gICAqIGF3YWl0IHBsYXllci5kZXN0cm95KCk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5ub2Rlcy5jYWNoZS5mb3JFYWNoKChub2RlKSA9PiBub2RlLmRlbGV0ZSgpKTtcblxuICAgIGlmICghdGhpcy5pc0NvbXBhdE1vZGUoKSkge1xuICAgICAgdGhpcy5jbGllbnQub2ZmKEV2ZW50cy5Wb2ljZVN0YXRlVXBkYXRlLCB0aGlzLiN2b2ljZVN0YXRlVXBkYXRlTGlzdGVuZXIpO1xuICAgICAgLy8gQHRzLWlnbm9yZSBwcml2YXRlIG1ldGhvZFxuICAgICAgdGhpcy5jbGllbnQuZGVjcmVtZW50TWF4TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLmV2ZW50cy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBhd2FpdCB0aGlzLmV4dHJhY3RvcnMudW5yZWdpc3RlckFsbCgpO1xuICAgIGlmICh0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwpIGNsZWFySW50ZXJ2YWwodGhpcy4jbGFnTW9uaXRvckludGVydmFsKTtcbiAgICBpZiAodGhpcy4jbGFnTW9uaXRvclRpbWVvdXQpIGNsZWFySW50ZXJ2YWwodGhpcy4jbGFnTW9uaXRvclRpbWVvdXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpIHtcbiAgICBjb25zdCBxdWV1ZSA9IHRoaXMubm9kZXMuZ2V0KG9sZFN0YXRlLmd1aWxkLmlkKTtcbiAgICBpZiAoIXF1ZXVlIHx8ICFxdWV1ZS5jb25uZWN0aW9uIHx8ICFxdWV1ZS5jaGFubmVsKSByZXR1cm47XG5cbiAgICAvLyBkaXNwYXRjaCB2b2ljZSBzdGF0ZSB1cGRhdGVcbiAgICBjb25zdCB3YXNIYW5kbGVkID0gdGhpcy5ldmVudHMuZW1pdChcbiAgICAgIEd1aWxkUXVldWVFdmVudC5Wb2ljZVN0YXRlVXBkYXRlLFxuICAgICAgcXVldWUsXG4gICAgICBvbGRTdGF0ZSxcbiAgICAgIG5ld1N0YXRlXG4gICAgKTtcbiAgICAvLyBpZiB0aGUgZXZlbnQgd2FzIGhhbmRsZWQsIHJldHVybiBhc3N1bWluZyB0aGUgbGlzdGVuZXIgaW1wbGVtZW50ZWQgYWxsIG9mIHRoZSBsb2dpYyBiZWxvd1xuICAgIGlmICh3YXNIYW5kbGVkICYmICF0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyKSByZXR1cm47XG5cbiAgICByZXR1cm4gdGhpcy4jb25Wb2ljZVN0YXRlVXBkYXRlKHRoaXMsIHF1ZXVlLCBvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdm9pY2Ugc3RhdGUgdXBkYXRlXG4gICAqIEBwYXJhbSB7Vm9pY2VTdGF0ZX0gb2xkU3RhdGUgVGhlIG9sZCB2b2ljZSBzdGF0ZVxuICAgKiBAcGFyYW0ge1ZvaWNlU3RhdGV9IG5ld1N0YXRlIFRoZSBuZXcgdm9pY2Ugc3RhdGVcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gcGFzc2luZyB2b2ljZSBzdGF0ZSB1cGRhdGUgZGF0YSB0byB0aGlzIG1ldGhvZCB3aWxsIHRyaWdnZXIgdm9pY2Ugc3RhdGUgaGFuZGxlclxuICAgKlxuICAgKiBjbGllbnQub24oJ3ZvaWNlU3RhdGVVcGRhdGUnLCAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAqICAgLy8gdGhpcyBpcyBkZWZpbml0ZWx5IGEgcm9ja2V0IHNjaWVuY2UsIHJpZ2h0IGhlcmVcbiAgICogICBwbGF5ZXIuaGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgaGFuZGxlVm9pY2VTdGF0ZShvbGRTdGF0ZTogVm9pY2VTdGF0ZSwgbmV3U3RhdGU6IFZvaWNlU3RhdGUpOiB2b2lkIHtcbiAgICB0aGlzLl9oYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogTG9jayB2b2ljZSBzdGF0ZSBoYW5kbGVyLiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgZGlzY29yZC1wbGF5ZXIgd2lsbCBrZWVwIHVzaW5nIHRoZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyLCBldmVuIGlmIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBleGlzdHMuXG4gICAqL1xuICBwdWJsaWMgbG9ja1ZvaWNlU3RhdGVIYW5kbGVyKCkge1xuICAgIHRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFVubG9jayB2b2ljZSBzdGF0ZSBoYW5kbGVyLiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgZGlzY29yZC1wbGF5ZXIgd2lsbCBzdG9wIHVzaW5nIHRoZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBleGlzdHMuXG4gICAqL1xuICBwdWJsaWMgdW5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIoKSB7XG4gICAgdGhpcy5vcHRpb25zLmxvY2tWb2ljZVN0YXRlSGFuZGxlciA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB2b2ljZSBzdGF0ZSBoYW5kbGVyIGlzIGxvY2tlZC5cbiAgICovXG4gIHB1YmxpYyBpc1ZvaWNlU3RhdGVIYW5kbGVyTG9ja2VkKCkge1xuICAgIHJldHVybiAhIXRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXI7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhdGUgYXVkaW8gcGxheWVyXG4gICAqIEBwYXJhbSBjaGFubmVsIFRoZSB2b2ljZSBjaGFubmVsIG9uIHdoaWNoIHRoZSBtdXNpYyBzaG91bGQgYmUgcGxheWVkXG4gICAqIEBwYXJhbSBxdWVyeSBUaGUgdHJhY2sgb3Igc291cmNlIHRvIHBsYXlcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgcGxheWVyXG4gICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gbm8gbmVlZCB0byB3b3JyeSBhYm91dCBxdWV1ZSBtYW5hZ2VtZW50LCBqdXN0IHVzZSB0aGlzIG1ldGhvZCBcdUQ4M0RcdURFMDRcbiAgICogY29uc3QgcXVlcnkgPSAndGhpcyBpcyBteSBzdXBlciBjb29sIHNlYXJjaCBxdWVyeSB0aGF0IEkgd2FudCB0byBwbGF5JztcbiAgICpcbiAgICogdHJ5IHtcbiAgICogICAgY29uc3QgeyB0cmFjayB9ID0gYXdhaXQgcGxheWVyLnBsYXkodm9pY2VDaGFubmVsLCBxdWVyeSk7XG4gICAqICAgY29uc29sZS5sb2coYFx1RDgzQ1x1REY4OSBJIGFtIHBsYXlpbmcgJHt0cmFjay50aXRsZX0gXHVEODNDXHVERjg5YCk7XG4gICAqIH0gY2F0Y2goZSkge1xuICAgKiAgIGNvbnNvbGUubG9nKGBcdUQ4M0RcdURFMkQgRmFpbGVkIHRvIHBsYXkgZXJyb3Igb2ggbm86XFxuXFxuJHtlfWApO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHBsYXk8VCA9IHVua25vd24+KFxuICBjaGFubmVsOiBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gIHF1ZXJ5OiBUcmFja0xpa2UsXG4gIG9wdGlvbnM6IFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8VD4gPSB7fSlcbiAgOiBQcm9taXNlPFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUPj4ge1xuICAgIGNvbnN0IHZjID0gdGhpcy5jbGllbnQuY2hhbm5lbHMucmVzb2x2ZShjaGFubmVsKTtcbiAgICBpZiAoIXZjPy5pc1ZvaWNlQmFzZWQoKSlcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICdjaGFubmVsJyxcbiAgICAgICdWb2ljZUJhc2VkQ2hhbm5lbCcsXG4gICAgICAhdmMgPyAndW5kZWZpbmVkJyA6IGBjaGFubmVsIHR5cGUgJHt2Yy50eXBlfWBcbiAgICApO1xuXG4gICAgY29uc3Qgb3JpZ2luYWxSZXN1bHQgPVxuICAgIHF1ZXJ5IGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0ID8gcXVlcnkgOiBhd2FpdCB0aGlzLnNlYXJjaChxdWVyeSwgb3B0aW9ucyk7XG4gICAgY29uc3QgcmVzdWx0ID1cbiAgICAoYXdhaXQgb3B0aW9ucy5hZnRlclNlYXJjaD8uKG9yaWdpbmFsUmVzdWx0KSkgfHwgb3JpZ2luYWxSZXN1bHQ7XG4gICAgaWYgKHJlc3VsdC5pc0VtcHR5KCkpIHtcbiAgICAgIHRocm93IG5ldyBOb1Jlc3VsdEVycm9yKFxuICAgICAgICBgTm8gcmVzdWx0cyBmb3VuZCBmb3IgXCIke3F1ZXJ5fVwiIChFeHRyYWN0b3I6ICR7XG4gICAgICAgIHJlc3VsdC5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9KWBcblxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBxdWV1ZSA9IHRoaXMubm9kZXMuY3JlYXRlKHZjLmd1aWxkLCBvcHRpb25zLm5vZGVPcHRpb25zKTtcblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gQWNxdWlyaW5nIGFuIGVudHJ5Li4uYCk7XG4gICAgY29uc3QgZW50cnkgPSBxdWV1ZS50YXNrc1F1ZXVlLmFjcXVpcmUoeyBzaWduYWw6IG9wdGlvbnMuc2lnbmFsIH0pO1xuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBFbnRyeSAke2VudHJ5LmlkfSB3YXMgYWNxdWlyZWQgc3VjY2Vzc2Z1bGx5IWApO1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIFdhaXRpbmcgZm9yIHRoZSBxdWV1ZSB0byByZXNvbHZlLi4uYCk7XG4gICAgYXdhaXQgZW50cnkuZ2V0VGFzaygpO1xuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBFbnRyeSAke2VudHJ5LmlkfSB3YXMgcmVzb2x2ZWQhYCk7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKCFxdWV1ZS5jaGFubmVsKSBhd2FpdCBxdWV1ZS5jb25uZWN0KHZjLCBvcHRpb25zLmNvbm5lY3Rpb25PcHRpb25zKTtcblxuICAgICAgaWYgKCFyZXN1bHQucGxheWxpc3QpIHtcbiAgICAgICAgcXVldWUuYWRkVHJhY2socmVzdWx0LnRyYWNrc1swXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZS5hZGRUcmFjayhyZXN1bHQucGxheWxpc3QpO1xuICAgICAgfVxuICAgICAgaWYgKCFxdWV1ZS5pc1BsYXlpbmcoKSlcbiAgICAgIGF3YWl0IHF1ZXVlLm5vZGUucGxheShudWxsLCBvcHRpb25zLmF1ZGlvUGxheWVyT3B0aW9ucyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIFJlbGVhc2luZyBhbiBlbnRyeSBmcm9tIHRoZSBxdWV1ZS4uLmApO1xuICAgICAgcXVldWUudGFza3NRdWV1ZS5yZWxlYXNlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYWNrOiByZXN1bHQudHJhY2tzWzBdLFxuICAgICAgZXh0cmFjdG9yOiByZXN1bHQuZXh0cmFjdG9yLFxuICAgICAgc2VhcmNoUmVzdWx0OiByZXN1bHQsXG4gICAgICBxdWV1ZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIHRyYWNrc1xuICAgKiBAcGFyYW0ge3N0cmluZyB8IFRyYWNrIHwgVHJhY2tbXSB8IFBsYXlsaXN0IHwgU2VhcmNoUmVzdWx0fSBxdWVyeSBUaGUgc2VhcmNoIHF1ZXJ5XG4gICAqIEBwYXJhbSB7U2VhcmNoT3B0aW9uc30gb3B0aW9ucyBUaGUgc2VhcmNoIG9wdGlvbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8U2VhcmNoUmVzdWx0Pn1cbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzZWFyY2hRdWVyeSA9ICdwYXNzIHVybCBvciB0ZXh0IG9yIGRpc2NvcmQtcGxheWVyIHRyYWNrIGNvbnN0cnVjdGFibGUgb2JqZWN0cywgd2UgZ290IHlvdSBjb3ZlcmVkIFx1RDgzRFx1REUwRSc7XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBsYXllci5zZWFyY2goc2VhcmNoUXVlcnkpO1xuICAgKlxuICAgKiBjb25zb2xlLmxvZyhyZXN1bHQpOyAvLyBMb2dzIGBTZWFyY2hSZXN1bHRgIG9iamVjdFxuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZWFyY2goXG4gIHNlYXJjaFF1ZXJ5OiBUcmFja0xpa2UsXG4gIG9wdGlvbnM6IFNlYXJjaE9wdGlvbnMgPSB7fSlcbiAgOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgIGlmIChzZWFyY2hRdWVyeSBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdCkgcmV0dXJuIHNlYXJjaFF1ZXJ5O1xuXG4gICAgaWYgKHNlYXJjaFF1ZXJ5IGluc3RhbmNlb2YgQXVkaW9SZXNvdXJjZSkge1xuICAgICAgc2VhcmNoUXVlcnkgPSB0aGlzLmNyZWF0ZVRyYWNrRnJvbUF1ZGlvUmVzb3VyY2Uoc2VhcmNoUXVlcnkpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnJlcXVlc3RlZEJ5ICE9IG51bGwpXG4gICAgb3B0aW9ucy5yZXF1ZXN0ZWRCeSA9IHRoaXMuY2xpZW50LnVzZXJzLnJlc29sdmUob3B0aW9ucy5yZXF1ZXN0ZWRCeSkhO1xuXG4gICAgb3B0aW9ucy5ibG9ja0V4dHJhY3RvcnMgPz89IHRoaXMub3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM7XG4gICAgb3B0aW9ucy5mYWxsYmFja1NlYXJjaEVuZ2luZSA/Pz0gUXVlcnlUeXBlLkFVVE9fU0VBUkNIO1xuXG4gICAgaWYgKHNlYXJjaFF1ZXJ5IGluc3RhbmNlb2YgVHJhY2spIHtcbiAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgcGxheWxpc3Q6IHNlYXJjaFF1ZXJ5LnBsYXlsaXN0IHx8IG51bGwsXG4gICAgICAgIHRyYWNrczogW3NlYXJjaFF1ZXJ5XSxcbiAgICAgICAgcXVlcnk6IHNlYXJjaFF1ZXJ5LnRpdGxlLFxuICAgICAgICBleHRyYWN0b3I6IHNlYXJjaFF1ZXJ5LmV4dHJhY3RvcixcbiAgICAgICAgcXVlcnlUeXBlOiBzZWFyY2hRdWVyeS5xdWVyeVR5cGUsXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoc2VhcmNoUXVlcnkgaW5zdGFuY2VvZiBQbGF5bGlzdCkge1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBwbGF5bGlzdDogc2VhcmNoUXVlcnksXG4gICAgICAgIHRyYWNrczogc2VhcmNoUXVlcnkudHJhY2tzLFxuICAgICAgICBxdWVyeTogc2VhcmNoUXVlcnkudGl0bGUsXG4gICAgICAgIGV4dHJhY3Rvcjogc2VhcmNoUXVlcnkudHJhY2tzWzBdPy5leHRyYWN0b3IsXG4gICAgICAgIHF1ZXJ5VHlwZTogUXVlcnlUeXBlLkFVVE8sXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzZWFyY2hRdWVyeSkpIHtcbiAgICAgIGNvbnN0IHRyYWNrcyA9IHNlYXJjaFF1ZXJ5LmZpbHRlcigodCkgPT4gdCBpbnN0YW5jZW9mIFRyYWNrKTtcbiAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgcGxheWxpc3Q6IG51bGwsXG4gICAgICAgIHRyYWNrcyxcbiAgICAgICAgcXVlcnk6ICdAQCMle3tVc2VyTG9hZGVkQ29udGVudH19JSNAQCcsXG4gICAgICAgIGV4dHJhY3RvcjogbnVsbCxcbiAgICAgICAgcXVlcnlUeXBlOiBRdWVyeVR5cGUuQVVUTyxcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBTZWFyY2hpbmcgJHtzZWFyY2hRdWVyeX1gKTtcblxuICAgIGxldCBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsID0gbnVsbCxcbiAgICAgIHByb3RvY29sOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIG9wdGlvbnMuc2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUTztcbiAgICBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUT19TRUFSQ0g7XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgYFNlYXJjaCBlbmdpbmUgc2V0IHRvICR7b3B0aW9ucy5zZWFyY2hFbmdpbmV9LCBmYWxsYmFjayBzZWFyY2ggZW5naW5lIHNldCB0byAke29wdGlvbnMuZmFsbGJhY2tTZWFyY2hFbmdpbmV9YFxuICAgICk7XG5cbiAgICBpZiAoL15cXHcrOi8udGVzdChzZWFyY2hRdWVyeSkpIHtcbiAgICAgIGNvbnN0IFtwcm90b2NvbE5hbWUsIC4uLnF1ZXJ5XSA9IHNlYXJjaFF1ZXJ5LnNwbGl0KCc6Jyk7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMuZGVidWcoYFByb3RvY29sICR7cHJvdG9jb2xOYW1lfSBkZXRlY3RlZCBpbiBxdWVyeWApO1xuXG4gICAgICBjb25zdCBtYXRjaGluZ0V4dHJhY3RvciA9IHRoaXMuZXh0cmFjdG9ycy5zdG9yZS5maW5kKFxuICAgICAgICAoZSkgPT5cbiAgICAgICAgIXRoaXMuZXh0cmFjdG9ycy5pc0Rpc2FibGVkKGUuaWRlbnRpZmllcikgJiZcbiAgICAgICAgZS5wcm90b2NvbHMuaW5jbHVkZXMocHJvdG9jb2xOYW1lKVxuICAgICAgKTtcblxuICAgICAgaWYgKG1hdGNoaW5nRXh0cmFjdG9yKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgIGBQcm90b2NvbCAke3Byb3RvY29sTmFtZX0gaXMgc3VwcG9ydGVkIGJ5ICR7bWF0Y2hpbmdFeHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIWBcbiAgICAgICAgKTtcbiAgICAgICAgZXh0cmFjdG9yID0gbWF0Y2hpbmdFeHRyYWN0b3I7XG4gICAgICAgIHNlYXJjaFF1ZXJ5ID0gcXVlcnkuam9pbignOicpO1xuICAgICAgICBwcm90b2NvbCA9IHByb3RvY29sTmFtZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBhbiBleHRyYWN0b3IgdGhhdCBzdXBwb3J0cyAke3Byb3RvY29sTmFtZX0gcHJvdG9jb2wuIEZhbGxpbmcgYmFjayB0byBkZWZhdWx0IGJlaGF2aW9yLi4uYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlZGlyZWN0ZWQgPSBhd2FpdCBRdWVyeVJlc29sdmVyLnByZVJlc29sdmUoc2VhcmNoUXVlcnkpO1xuICAgIGNvbnN0IHsgdHlwZTogcXVlcnlUeXBlLCBxdWVyeSB9ID1cbiAgICBvcHRpb25zLnNlYXJjaEVuZ2luZSA9PT0gUXVlcnlUeXBlLkFVVE8gP1xuICAgIFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZShyZWRpcmVjdGVkLCBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lKSA6XG4gICAgeyB0eXBlOiBvcHRpb25zLnNlYXJjaEVuZ2luZSwgcXVlcnk6IHJlZGlyZWN0ZWQgfSBhcyBSZXNvbHZlZFF1ZXJ5O1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBRdWVyeSB0eXBlIGlkZW50aWZpZWQgYXMgJHtxdWVyeVR5cGV9JHtcbiAgICAgIGV4dHJhY3RvciAmJiBwcm90b2NvbCA/XG4gICAgICAnIGJ1dCBtaWdodCBub3QgYmUgdXNlZCBkdWUgdG8gdGhlIHByZXNlbmNlIG9mIHByb3RvY29sJyA6XG4gICAgICAnJ31gXG5cbiAgICApO1xuXG4gICAgLy8gZm9yY2UgcGFydGljdWxhciBleHRyYWN0b3JcbiAgICBpZiAob3B0aW9ucy5zZWFyY2hFbmdpbmUuc3RhcnRzV2l0aCgnZXh0OicpKSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMuZGVidWcoYEZvcmNpbmcgJHtvcHRpb25zLnNlYXJjaEVuZ2luZS5zdWJzdHJpbmcoNCl9IGV4dHJhY3Rvci4uLmApO1xuICAgICAgZXh0cmFjdG9yID0gdGhpcy5leHRyYWN0b3JzLmdldChvcHRpb25zLnNlYXJjaEVuZ2luZS5zdWJzdHJpbmcoNCkpITtcbiAgICAgIGlmICghZXh0cmFjdG9yKVxuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICBleHRyYWN0b3IsXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBxdWVyeSBhbGwgZXh0cmFjdG9yc1xuICAgIGlmICghZXh0cmFjdG9yKSB7XG4gICAgICAvLyBjYWNoZSB2YWxpZGF0aW9uXG4gICAgICBpZiAoIW9wdGlvbnMuaWdub3JlQ2FjaGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYENoZWNraW5nIGNhY2hlLi4uYCk7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMucXVlcnlDYWNoZT8ucmVzb2x2ZSh7XG4gICAgICAgICAgcXVlcnksXG4gICAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBjYWNoZSBoaXRcbiAgICAgICAgaWYgKHJlcz8uaGFzVHJhY2tzKCkpIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2FjaGUgaGl0IGZvciBxdWVyeSAke3F1ZXJ5fWApO1xuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2FjaGUgbWlzcyBmb3IgcXVlcnkgJHtxdWVyeX1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEV4ZWN1dGluZyBleHRyYWN0b3JzLi4uYCk7XG5cbiAgICAgIC8vIGNhY2hlIG1pc3NcbiAgICAgIGV4dHJhY3RvciA9XG4gICAgICAoXG4gICAgICBhd2FpdCB0aGlzLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHQpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzPy5pbmNsdWRlcyhleHQuaWRlbnRpZmllcikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGV4dC52YWxpZGF0ZShxdWVyeSwgcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSk7XG4gICAgICB9KSk/LlxuICAgICAgZXh0cmFjdG9yIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLy8gbm8gZXh0cmFjdG9ycyBhdmFpbGFibGVcbiAgICBpZiAoIWV4dHJhY3Rvcikge1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoJ0ZhaWxlZCB0byBmaW5kIGFwcHJvcHJpYXRlIGV4dHJhY3RvcicpO1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBFeGVjdXRpbmcgbWV0YWRhdGEgcXVlcnkgdXNpbmcgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yLi4uYFxuICAgICk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZXh0cmFjdG9yLlxuICAgIGhhbmRsZShxdWVyeSwge1xuICAgICAgdHlwZTogcXVlcnlUeXBlIGFzIFNlYXJjaFF1ZXJ5VHlwZSxcbiAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5IGFzIFVzZXIsXG4gICAgICByZXF1ZXN0T3B0aW9uczogb3B0aW9ucy5yZXF1ZXN0T3B0aW9ucyxcbiAgICAgIHByb3RvY29sXG4gICAgfSkuXG4gICAgY2F0Y2goKCkgPT4gbnVsbCk7XG5cbiAgICBpZiAocmVzKSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnTWV0YWRhdGEgcXVlcnkgd2FzIHN1Y2Nlc3NmdWwhJyk7XG4gICAgICBjb25zdCByZXN1bHQgPSBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgcXVlcnksXG4gICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgcGxheWxpc3Q6IHJlcy5wbGF5bGlzdCxcbiAgICAgICAgdHJhY2tzOiByZXMudHJhY2tzLFxuICAgICAgICBleHRyYWN0b3IsXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZUNhY2hlKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBBZGRpbmcgZGF0YSB0byBjYWNoZS4uLmApO1xuICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5Q2FjaGU/LmFkZERhdGEocmVzdWx0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgJ0ZhaWxlZCB0byBmaW5kIHJlc3VsdCB1c2luZyBhcHByb3ByaWF0ZSBleHRyYWN0b3IuIFF1ZXJ5aW5nIGFsbCBleHRyYWN0b3JzLi4uJ1xuICAgICk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leHRyYWN0b3JzLnJ1bihcbiAgICAgIGFzeW5jIChleHQpID0+XG4gICAgICAhb3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM/LmluY2x1ZGVzKGV4dC5pZGVudGlmaWVyKSAmJiAoXG4gICAgICBhd2FpdCBleHQudmFsaWRhdGUocXVlcnkpKSAmJlxuICAgICAgZXh0LmhhbmRsZShxdWVyeSwge1xuICAgICAgICB0eXBlOiBxdWVyeVR5cGUgYXMgU2VhcmNoUXVlcnlUeXBlLFxuICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeSBhcyBVc2VyLFxuICAgICAgICByZXF1ZXN0T3B0aW9uczogb3B0aW9ucy5yZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgcHJvdG9jb2xcbiAgICAgIH0pXG4gICAgKTtcbiAgICBpZiAoIXJlc3VsdD8ucmVzdWx0KSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgIGBGYWlsZWQgdG8gcXVlcnkgbWV0YWRhdGEgcXVlcnkgdXNpbmcgJHtcbiAgICAgICAgcmVzdWx0Py5leHRyYWN0b3IuaWRlbnRpZmllciB8fCAnTi9BJ30gZXh0cmFjdG9yLmBcblxuICAgICAgKTtcbiAgICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMsIHtcbiAgICAgICAgcXVlcnksXG4gICAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnksXG4gICAgICAgIGV4dHJhY3RvcjogcmVzdWx0Py5leHRyYWN0b3JcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgTWV0YWRhdGEgcXVlcnkgd2FzIHN1Y2Nlc3NmdWwgdXNpbmcgJHtyZXN1bHQuZXh0cmFjdG9yLmlkZW50aWZpZXJ9IWBcbiAgICApO1xuXG4gICAgY29uc3QgZGF0YSA9IG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgcXVlcnksXG4gICAgICBxdWVyeVR5cGUsXG4gICAgICBwbGF5bGlzdDogcmVzdWx0LnJlc3VsdC5wbGF5bGlzdCxcbiAgICAgIHRyYWNrczogcmVzdWx0LnJlc3VsdC50cmFja3MsXG4gICAgICBleHRyYWN0b3I6IHJlc3VsdC5leHRyYWN0b3IsXG4gICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgIH0pO1xuXG4gICAgaWYgKCFvcHRpb25zLmlnbm9yZUNhY2hlKSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQWRkaW5nIGRhdGEgdG8gY2FjaGUuLi5gKTtcbiAgICAgIGF3YWl0IHRoaXMucXVlcnlDYWNoZT8uYWRkRGF0YShkYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSByZXBvcnQgb2YgdGhlIGRlcGVuZGVuY2llcyB1c2VkIGJ5IHRoZSBgZGlzY29yZC12b2lwYCBtb2R1bGUuIFVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnNvbGUubG9nKHBsYXllci5zY2FuRGVwcygpKTtcbiAgICogLy8gLT4gbG9ncyBkZXBlbmRlbmNpZXMgcmVwb3J0XG4gICAqIGBgYFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgcHVibGljIHNjYW5EZXBzKCkge1xuICAgIGNvbnN0IGxpbmUgPSAnLScucmVwZWF0KDUwKTtcbiAgICBjb25zdCBydW50aW1lID1cbiAgICAnQnVuJyBpbiBnbG9iYWxUaGlzID8gJ0J1bicgOiAnRGVubycgaW4gZ2xvYmFsVGhpcyA/ICdEZW5vJyA6ICdOb2RlJztcbiAgICBjb25zdCBkZXBzUmVwb3J0ID0gW1xuICAgICdEaXNjb3JkIFBsYXllcicsXG4gICAgbGluZSxcbiAgICBgLSBkaXNjb3JkLXBsYXllcjogJHtQbGF5ZXIudmVyc2lvbn0ke1xuICAgIHRoaXMuaXNDb21wYXRNb2RlKCkgP1xuICAgIGAgKCR7Z2V0Q29tcGF0TmFtZSh0aGlzLmNsaWVudCl9IGNvbXBhdGliaWxpdHkgbW9kZSlgIDpcbiAgICAnJ31gLFxuXG4gICAgYC0gZGlzY29yZC12b2lwOiAke2RWb2ljZVZlcnNpb259YCxcbiAgICBgLSBkaXNjb3JkLmpzOiAke2Rqc1ZlcnNpb259YCxcbiAgICBgLSBOb2RlIHZlcnNpb246ICR7cHJvY2Vzcy52ZXJzaW9ufSAoRGV0ZWN0ZWQgUnVudGltZTogJHtydW50aW1lfSwgUGxhdGZvcm06ICR7cHJvY2Vzcy5wbGF0Zm9ybX0gWyR7cHJvY2Vzcy5hcmNofV0pYCxcbiAgICAoKCkgPT4ge1xuICAgICAgY29uc3QgaW5mbyA9IEZGbXBlZy5yZXNvbHZlU2FmZSgpO1xuICAgICAgaWYgKCFpbmZvKSByZXR1cm4gJ0ZGbXBlZy9BdmNvbnYgbm90IGZvdW5kJztcblxuICAgICAgcmV0dXJuIFtcbiAgICAgIGAtIGZmbXBlZzogJHtpbmZvLnZlcnNpb259YCxcbiAgICAgIGAtIGNvbW1hbmQ6ICR7aW5mby5jb21tYW5kfWAsXG4gICAgICBgLSBzdGF0aWM6ICR7aW5mby5tb2R1bGV9YCxcbiAgICAgIGAtIGxpYm9wdXM6ICR7aW5mby5yZXN1bHQhLmluY2x1ZGVzKCctLWVuYWJsZS1saWJvcHVzJyl9YF0uXG4gICAgICBqb2luKCdcXG4nKTtcbiAgICB9KSgpLFxuICAgICdcXG4nLFxuICAgICdMb2FkZWQgRXh0cmFjdG9yczonLFxuICAgIGxpbmUsXG4gICAgdGhpcy5leHRyYWN0b3JzLnN0b3JlLlxuICAgIG1hcCgobSkgPT4ge1xuICAgICAgcmV0dXJuIG0uaWRlbnRpZmllcjtcbiAgICB9KS5cbiAgICBqb2luKCdcXG4nKSB8fCAnTi9BJyxcbiAgICAnXFxuXFxuZGlzY29yZC12b2lwJyxcbiAgICBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLmdlbmVyYXRlU3RyaW5nKCldO1xuXG5cbiAgICByZXR1cm4gZGVwc1JlcG9ydC5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIHB1YmxpYyAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgeWllbGQqIHRoaXMubm9kZXMuY2FjaGUudmFsdWVzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBgUGxheWxpc3RgIGluc3RhbmNlXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGluaXRpYWxpemUgYSBwbGF5bGlzdFxuICAgKi9cbiAgcHVibGljIGNyZWF0ZVBsYXlsaXN0KGRhdGE6IFBsYXlsaXN0SW5pdERhdGEpIHtcbiAgICByZXR1cm4gbmV3IFBsYXlsaXN0KHRoaXMsIGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0cmFjayBmcm9tIGFuIGF1ZGlvIHJlc291cmNlLlxuICAgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIGF1ZGlvIHJlc291cmNlXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlVHJhY2tGcm9tQXVkaW9SZXNvdXJjZShyZXNvdXJjZTogQXVkaW9SZXNvdXJjZSkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gKHJlc291cmNlLm1ldGFkYXRhIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCByZWYgPSBTbm93Zmxha2VVdGlsLmdlbmVyYXRlKCkudG9TdHJpbmcoKTtcbiAgICBjb25zdCBtYXliZVRpdGxlID1cbiAgICAndGl0bGUnIGluIG1ldGFkYXRhID8gYCR7bWV0YWRhdGEudGl0bGV9YCA6IGBUcmFjayAke3JlZn1gO1xuICAgIGNvbnN0IG1heWJlQXV0aG9yID1cbiAgICAnYXV0aG9yJyBpbiBtZXRhZGF0YSA/IGAke21ldGFkYXRhLmF1dGhvcn1gIDogJ1Vua25vd24gYXV0aG9yJztcbiAgICBjb25zdCBtYXliZUR1cmF0aW9uID1cbiAgICAnZHVyYXRpb24nIGluIG1ldGFkYXRhID8gYCR7bWV0YWRhdGEuZHVyYXRpb259YCA6ICcwMDowMCc7XG4gICAgY29uc3QgbWF5YmVUaHVtYm5haWwgPVxuICAgICd0aHVtYm5haWwnIGluIG1ldGFkYXRhID8gYCR7bWV0YWRhdGEudGh1bWJuYWlsfWAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWF5YmVVUkwgPVxuICAgICd1cmwnIGluIG1ldGFkYXRhID8gYCR7bWV0YWRhdGEudXJsfWAgOiBgZGlzY29yZC1wbGF5ZXI6Ly9ibG9iLyR7cmVmfWA7XG4gICAgY29uc3QgbWF5YmVEZXNjcmlwdGlvbiA9XG4gICAgJ2Rlc2NyaXB0aW9uJyBpbiBtZXRhZGF0YSA/XG4gICAgYCR7bWV0YWRhdGEuZGVzY3JpcHRpb259YCA6XG4gICAgJ05vIGRlc2NyaXB0aW9uIGF2YWlsYWJsZS4nO1xuICAgIGNvbnN0IG1heWJlVmlld3MgPSAndmlld3MnIGluIG1ldGFkYXRhID8gTnVtYmVyKG1ldGFkYXRhLnZpZXdzKSB8fCAwIDogMDtcblxuICAgIGNvbnN0IHRyYWNrID0gbmV3IFRyYWNrKHRoaXMsIHtcbiAgICAgIHRpdGxlOiBtYXliZVRpdGxlLFxuICAgICAgYXV0aG9yOiBtYXliZUF1dGhvcixcbiAgICAgIGR1cmF0aW9uOiBtYXliZUR1cmF0aW9uLFxuICAgICAgdGh1bWJuYWlsOiBtYXliZVRodW1ibmFpbCxcbiAgICAgIHVybDogbWF5YmVVUkwsXG4gICAgICBkZXNjcmlwdGlvbjogbWF5YmVEZXNjcmlwdGlvbixcbiAgICAgIHF1ZXJ5VHlwZTogUXVlcnlUeXBlLkRJU0NPUkRfUExBWUVSX0JMT0IsXG4gICAgICBzb3VyY2U6ICdhcmJpdHJhcnknLFxuICAgICAgbWV0YWRhdGEsXG4gICAgICBsaXZlOiBmYWxzZSxcbiAgICAgIHZpZXdzOiBtYXliZVZpZXdzXG4gICAgfSk7XG5cbiAgICByZXNvdXJjZS5tZXRhZGF0YSA9IHRyYWNrO1xuXG4gICAgdHJhY2suc2V0UmVzb3VyY2UocmVzb3VyY2UgYXMgQXVkaW9SZXNvdXJjZTxUcmFjaz4pO1xuXG4gICAgcmV0dXJuIHRyYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgaW50ZXJjZXB0aW5nIHN0cmVhbXNcbiAgICogQHBhcmFtIHN0cmVhbSBUaGUgc3RyZWFtIHRvIGludGVyY2VwdFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGhhbmRsZUludGVyY2VwdGluZ1N0cmVhbShcbiAgcXVldWU6IEd1aWxkUXVldWUsXG4gIHRyYWNrOiBUcmFjayxcbiAgZm9ybWF0OiBTdHJlYW1UeXBlLFxuICBzdHJlYW06IEludGVyY2VwdGVkU3RyZWFtKVxuICB7XG4gICAgaWYgKCF0aGlzLiNzdHJlYW1JbnRlcmNlcHRvcikgcmV0dXJuO1xuXG4gICAgcmV0dXJuIHRoaXMuI3N0cmVhbUludGVyY2VwdG9yLmhhbmRsZShxdWV1ZSwgdHJhY2ssIGZvcm1hdCwgc3RyZWFtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZ2xvYmFsIHN0cmVhbSBpbnRlcmNlcHRvclxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgc3RyZWFtIGludGVyY2VwdG9yIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVTdHJlYW1JbnRlcmNlcHRvcihvcHRpb25zOiBQbGF5ZXJTdHJlYW1JbnRlcmNlcHRvck9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy4jc3RyZWFtSW50ZXJjZXB0b3IpIHtcbiAgICAgIHJldHVybiB0aGlzLiNzdHJlYW1JbnRlcmNlcHRvcjtcbiAgICB9XG5cbiAgICB0aGlzLiNzdHJlYW1JbnRlcmNlcHRvciA9IG5ldyBQbGF5ZXJTdHJlYW1JbnRlcmNlcHRvcih0aGlzLCBvcHRpb25zKTtcblxuICAgIHJldHVybiB0aGlzLiNzdHJlYW1JbnRlcmNlcHRvcjtcbiAgfVxufSIsICJpbXBvcnQgeyBDaGFubmVsVHlwZSwgVm9pY2VTdGF0ZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgR3VpbGRRdWV1ZUV2ZW50IH0gZnJvbSAnLi9xdWV1ZSc7XG5pbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuL1BsYXllcic7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi91dGlscy9VdGlsJztcblxuZnVuY3Rpb24gaGFuZGxlRW1wdHlDaGFubmVsKFxucGxheWVyOiBQbGF5ZXIsXG5xdWV1ZTogR3VpbGRRdWV1ZSxcbmd1aWxkSWQ6IHN0cmluZylcbntcbiAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGlmICghVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpIHx8ICFwbGF5ZXIubm9kZXMuaGFzKHF1ZXVlLmd1aWxkLmlkKSlcbiAgICByZXR1cm47XG4gICAgaWYgKHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5KSBxdWV1ZS5kZWxldGUoKTtcbiAgICBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkVtcHR5Q2hhbm5lbCwgcXVldWUpO1xuICB9LCBxdWV1ZS5vcHRpb25zLmxlYXZlT25FbXB0eUNvb2xkb3duIHx8IDApLnVucmVmKCk7XG4gIHF1ZXVlLnRpbWVvdXRzLnNldChgZW1wdHlfJHtndWlsZElkfWAsIHRpbWVvdXQpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVDaGFubmVsUG9wdWxhdGUoXG5wbGF5ZXI6IFBsYXllcixcbnF1ZXVlOiBHdWlsZFF1ZXVlLFxuZ3VpbGRJZDogc3RyaW5nKVxue1xuICBjb25zdCBlbXB0eVRpbWVvdXQgPSBxdWV1ZS50aW1lb3V0cy5nZXQoYGVtcHR5XyR7Z3VpbGRJZH1gKTtcbiAgaWYgKCFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsISkgJiYgZW1wdHlUaW1lb3V0KSB7XG4gICAgY2xlYXJUaW1lb3V0KGVtcHR5VGltZW91dCk7XG4gICAgcXVldWUudGltZW91dHMuZGVsZXRlKGBlbXB0eV8ke2d1aWxkSWR9YCk7XG4gICAgcGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5DaGFubmVsUG9wdWxhdGUsIHF1ZXVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVQYXVzZU9uRW1wdHkocXVldWU6IEd1aWxkUXVldWUpIHtcbiAgY29uc3QgaXNFbXB0eSA9IFV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKTtcbiAgY29uc3Qgd2FzUGF1c2VkT25FbXB0eSA9IFJlZmxlY3QuZ2V0KHF1ZXVlLCAnX19wYXVzZWRPbkVtcHR5Jyk7XG5cbiAgaWYgKGlzRW1wdHkgJiYgIXdhc1BhdXNlZE9uRW1wdHkpIHtcbiAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZCh0cnVlKTtcbiAgICBSZWZsZWN0LnNldChxdWV1ZSwgJ19fcGF1c2VkT25FbXB0eScsIHRydWUpO1xuICAgIGlmIChxdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgcXVldWUuZGVidWcoXG4gICAgICAgICdWb2ljZSBjaGFubmVsIGlzIGVtcHR5IGFuZCBvcHRpb25zI3BhdXNlT25FbXB0eSBpcyB0cnVlLCBwYXVzaW5nLi4uJ1xuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIWlzRW1wdHkgJiYgd2FzUGF1c2VkT25FbXB0eSkge1xuICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKGZhbHNlKTtcbiAgICBSZWZsZWN0LnNldChxdWV1ZSwgJ19fcGF1c2VkT25FbXB0eScsIGZhbHNlKTtcbiAgICBpZiAocXVldWUuaGFzRGVidWdnZXIpIHtcbiAgICAgIHF1ZXVlLmRlYnVnKFxuICAgICAgICAnVm9pY2UgY2hhbm5lbCBpcyBub3QgZW1wdHkgYW5kIG9wdGlvbnMjcGF1c2VPbkVtcHR5IGlzIHRydWUsIHJlc3VtaW5nLi4uJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlQm90Vm9pY2VTdGF0ZVVwZGF0ZShcbnF1ZXVlOiBHdWlsZFF1ZXVlLFxub2xkU3RhdGU6IFZvaWNlU3RhdGUsXG5uZXdTdGF0ZTogVm9pY2VTdGF0ZSlcbntcbiAgaWYgKFxuICBuZXdTdGF0ZS5zZXJ2ZXJNdXRlICE9IG51bGwgJiZcbiAgb2xkU3RhdGUuc2VydmVyTXV0ZSAhPT0gbmV3U3RhdGUuc2VydmVyTXV0ZSlcbiAge1xuICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKG5ld1N0YXRlLnNlcnZlck11dGUpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChcbiAgbmV3U3RhdGUuY2hhbm5lbD8udHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlICYmXG4gIG5ld1N0YXRlLnN1cHByZXNzICE9IG51bGwgJiZcbiAgb2xkU3RhdGUuc3VwcHJlc3MgIT09IG5ld1N0YXRlLnN1cHByZXNzKVxuICB7XG4gICAgcXVldWUubm9kZS5zZXRQYXVzZWQobmV3U3RhdGUuc3VwcHJlc3MpO1xuICAgIGlmIChuZXdTdGF0ZS5zdXBwcmVzcykge1xuICAgICAgbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8udm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsodHJ1ZSkuY2F0Y2goVXRpbC5ub29wKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlZmF1bHRWb2ljZVN0YXRlSGFuZGxlcihcbnBsYXllcjogUGxheWVyLFxucXVldWU6IEd1aWxkUXVldWUsXG5vbGRTdGF0ZTogVm9pY2VTdGF0ZSxcbm5ld1N0YXRlOiBWb2ljZVN0YXRlKVxue1xuICBpZiAoIXF1ZXVlPy5jb25uZWN0aW9uIHx8ICFxdWV1ZS5jaGFubmVsKSByZXR1cm47XG5cbiAgY29uc3QgaXNCb3RTdGF0ZSA9IG5ld1N0YXRlLm1lbWJlcj8uaWQgPT09IG5ld1N0YXRlLmd1aWxkLm1lbWJlcnMubWU/LmlkO1xuICBjb25zdCBndWlsZElkID0gb2xkU3RhdGUuZ3VpbGQuaWQ7XG5cbiAgLy8gQm90IGRpc2Nvbm5lY3RlZFxuICBpZiAoaXNCb3RTdGF0ZSAmJiBvbGRTdGF0ZS5jaGFubmVsSWQgJiYgIW5ld1N0YXRlLmNoYW5uZWxJZCkge1xuICAgIHRyeSB7XG4gICAgICBxdWV1ZS5kZWxldGUoKTtcbiAgICB9IGNhdGNoIHtcblxuICAgICAgLyogbm9vcCAqL31cbiAgICByZXR1cm4gdm9pZCBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkRpc2Nvbm5lY3QsIHF1ZXVlKTtcbiAgfVxuXG4gIGlmIChxdWV1ZS5vcHRpb25zLnBhdXNlT25FbXB0eSkge1xuICAgIGhhbmRsZVBhdXNlT25FbXB0eShxdWV1ZSk7XG4gIH1cblxuICAvLyBCb3Qgam9pbmVkIGNoYW5uZWwgb3IgY2hhbmdlZCBzdGF0ZVxuICBpZiAoXG4gIGlzQm90U3RhdGUgJiZcbiAgbmV3U3RhdGUuY2hhbm5lbElkICYmIChcbiAgIW9sZFN0YXRlLmNoYW5uZWxJZCB8fCBvbGRTdGF0ZS5jaGFubmVsSWQgIT09IG5ld1N0YXRlLmNoYW5uZWxJZCkpXG4gIHtcbiAgICBpZiAocXVldWUuY29ubmVjdGlvbikgcXVldWUuY2hhbm5lbCA9IG5ld1N0YXRlLmNoYW5uZWwhO1xuICAgIGhhbmRsZUJvdFZvaWNlU3RhdGVVcGRhdGUocXVldWUsIG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gIH1cblxuICAvLyBIYW5kbGUgY2hhbm5lbCBlbXB0eS9wb3B1bGF0ZSBldmVudHNcbiAgaWYgKCFuZXdTdGF0ZS5jaGFubmVsSWQgJiYgb2xkU3RhdGUuY2hhbm5lbElkID09PSBxdWV1ZS5jaGFubmVsLmlkKSB7XG4gICAgaWYgKCFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsKSkgcmV0dXJuO1xuICAgIGhhbmRsZUVtcHR5Q2hhbm5lbChwbGF5ZXIsIHF1ZXVlLCBndWlsZElkKTtcbiAgfSBlbHNlIGlmIChuZXdTdGF0ZS5jaGFubmVsSWQgPT09IHF1ZXVlLmNoYW5uZWwuaWQpIHtcbiAgICBoYW5kbGVDaGFubmVsUG9wdWxhdGUocGxheWVyLCBxdWV1ZSwgZ3VpbGRJZCk7XG4gIH0gZWxzZSBpZiAob2xkU3RhdGUuY2hhbm5lbElkICE9PSBuZXdTdGF0ZS5jaGFubmVsSWQpIHtcbiAgICBpZiAoXG4gICAgbmV3U3RhdGUuY2hhbm5lbElkICE9PSBxdWV1ZS5jaGFubmVsLmlkICYmXG4gICAgIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwpKVxuXG4gICAgcmV0dXJuO1xuICAgIGlmICghcXVldWUudGltZW91dHMuaGFzKGBlbXB0eV8ke2d1aWxkSWR9YCkpIHtcbiAgICAgIGhhbmRsZUVtcHR5Q2hhbm5lbChwbGF5ZXIsIHF1ZXVlLCBndWlsZElkKTtcbiAgICB9XG4gIH1cbn0iLCAiaW1wb3J0IHsgcmVzb2x2ZSwgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBGRm1wZWcsIEZGbXBlZ0xpYiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9mZm1wZWcnO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4uL3ZlcnNpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VKU09OIHtcbiAgbmFtZTogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIE1heWJlTnVsbDxUPiA9IFQgfCBudWxsO1xuXG5leHBvcnQgaW50ZXJmYWNlIERlcGVuZGVuY2llc1JlcG9ydCB7XG4gIGNvcmU6IHtcbiAgICAnZGlzY29yZC1wbGF5ZXInOiBzdHJpbmc7XG4gICAgJ2Rpc2NvcmQtdm9pcCc6IHN0cmluZztcbiAgfTtcbiAgbGlib3B1czoge1xuICAgIG1lZGlhcGxleDogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ0BkaXNjb3JkanMvb3B1cyc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgICdAZXZhbi9vcHVzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgb3B1c3NjcmlwdDogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ25vZGUtb3B1cyc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICB9O1xuICBsaWJzb2RpdW06IHtcbiAgICAnc29kaXVtLW5hdGl2ZSc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgIHNvZGl1bTogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ2xpYnNvZGl1bS13cmFwcGVycyc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgICdzb2RpdW0tamF2YXNjcmlwdCc6IE1heWJlTnVsbDxzdHJpbmc+O1xuICAgICdAc3RhYmxlbGliL3hjaGFjaGEyMHBvbHkxMzA1JzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ0Bub2JlbC9jaXBoZXJzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gIH07XG4gIGZmbXBlZzogRkZtcGVnUmVwb3J0O1xufVxuXG5leHBvcnQgdHlwZSBGRm1wZWdSZXBvcnQgPSBSZWNvcmQ8XG4gIEZGbXBlZ0xpYixcbiAgTWF5YmVOdWxsPHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gICAgaGFzTGlib3B1czogYm9vbGVhbjtcbiAgfT4+O1xuXG5cbi8qKlxuICogQSB1dGlsaXR5IHRvIGdlbmVyYXRlIGEgcmVwb3J0IG9mIHRoZSBkZXBlbmRlbmNpZXMgdXNlZCBieSB0aGUgZGlzY29yZC1wbGF5ZXIgbW9kdWxlLlxuICovXG5leHBvcnQgY29uc3QgRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvciA9IHtcbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBvZiBhIHBhY2thZ2UuXG4gICAqIEBwYXJhbSBkaXIgLSBUaGUgZGlyZWN0b3J5IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tXG4gICAqIEBwYXJhbSBwYWNrYWdlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGZpbmRcbiAgICogQHBhcmFtIGRlcHRoIC0gVGhlIG1heGltdW0gZGVwdGggdG8gc2VhcmNoXG4gICAqIEByZXR1cm5zIFRoZSBwYWNrYWdlLmpzb24gZmlsZSwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICovXG4gIGZpbmRQYWNrYWdlSlNPTihcbiAgZGlyOiBzdHJpbmcsXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gIGRlcHRoOiBudW1iZXIpXG4gIDogUGFja2FnZUpTT04gfCBudWxsIHtcbiAgICBpZiAoZGVwdGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gcmVzb2x2ZShkaXIsICdwYWNrYWdlLmpzb24nKTtcblxuICAgIGNvbnN0IG5leHQgPSAoKSA9PlxuICAgIERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IuZmluZFBhY2thZ2VKU09OKFxuICAgICAgcmVzb2x2ZShkaXIsICcuLicpLFxuICAgICAgcGFja2FnZU5hbWUsXG4gICAgICBkZXB0aCAtIDFcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG4gICAgICBjb25zdCBwa2dKU09OOiBQYWNrYWdlSlNPTiA9IHJlcXVpcmUodGFyZ2V0KTtcblxuICAgICAgaWYgKHBrZ0pTT04ubmFtZSAhPT0gcGFja2FnZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBrZ0pTT047XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIFRyaWVzIHRvIGZpbmQgdGhlIHZlcnNpb24gb2YgYSBkZXBlbmRlbmN5LlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBwYWNrYWdlIHRvIGZpbmQgdGhlIHZlcnNpb24gb2ZcbiAgICogQHBhcmFtIG1heExvb2t1cERlcHRoIC0gVGhlIG1heGltdW0gZGVwdGggdG8gc2VhcmNoIGZvciB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgICogQHJldHVybnMgVGhlIHZlcnNpb24gb2YgdGhlIHBhY2thZ2UsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAqL1xuICB2ZXJzaW9uKG5hbWU6IHN0cmluZywgbWF4TG9va3VwRGVwdGggPSAzKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChuYW1lID09PSAnZGlzY29yZC1wbGF5ZXInKSB7XG4gICAgICAgIHJldHVybiB2ZXJzaW9uO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwa2cgPSBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLmZpbmRQYWNrYWdlSlNPTihcbiAgICAgICAgZGlybmFtZShyZXF1aXJlLnJlc29sdmUobmFtZSkpLFxuICAgICAgICBuYW1lLFxuICAgICAgICBtYXhMb29rdXBEZXB0aFxuICAgICAgKTtcbiAgICAgIHJldHVybiBwa2c/LnZlcnNpb24gPz8gbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHJlcG9ydCBvZiB0aGUgZGVwZW5kZW5jaWVzIHVzZWQgYnkgdGhlIGRpc2NvcmQtcGxheWVyIG1vZHVsZS5cbiAgICogQHJldHVybnMgVGhlIHJlcG9ydCBvYmplY3RcbiAgICovXG4gIGdlbmVyYXRlKCk6IERlcGVuZGVuY2llc1JlcG9ydCB7XG4gICAgY29uc3QgZmZtcGVnUmVwb3J0ID0ge30gYXMgRkZtcGVnUmVwb3J0O1xuXG4gICAgZm9yIChjb25zdCBsaWIgb2YgRkZtcGVnLnNvdXJjZXMpIHtcbiAgICAgIGZmbXBlZ1JlcG9ydFtsaWIubmFtZV0gPSBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGZmbXBlZyA9IEZGbXBlZy5yZXNvbHZlU2FmZSgpO1xuXG4gICAgaWYgKGZmbXBlZykge1xuICAgICAgZmZtcGVnUmVwb3J0W2ZmbXBlZy5uYW1lXSA9IHtcbiAgICAgICAgaGFzTGlib3B1czogZmZtcGVnLmNvbW1hbmQuaW5jbHVkZXMoJy0tZW5hYmxlLWxpYm9wdXMnKSxcbiAgICAgICAgdmVyc2lvbjogZmZtcGVnLnZlcnNpb25cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvcmU6IHtcbiAgICAgICAgJ2Rpc2NvcmQtcGxheWVyJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKFxuICAgICAgICAgICdkaXNjb3JkLXBsYXllcidcbiAgICAgICAgKSBhcyBzdHJpbmcsXG4gICAgICAgICdkaXNjb3JkLXZvaXAnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oXG4gICAgICAgICAgJ2Rpc2NvcmQtdm9pcCdcbiAgICAgICAgKSBhcyBzdHJpbmdcbiAgICAgIH0sXG4gICAgICBsaWJvcHVzOiB7XG4gICAgICAgIG1lZGlhcGxleDogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdtZWRpYXBsZXgnKSxcbiAgICAgICAgJ0BkaXNjb3JkanMvb3B1cyc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignQGRpc2NvcmRqcy9vcHVzJyksXG4gICAgICAgICdAZXZhbi9vcHVzJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdAZXZhbi9vcHVzJyksXG4gICAgICAgIG9wdXNzY3JpcHQ6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignb3B1c3NjcmlwdCcpLFxuICAgICAgICAnbm9kZS1vcHVzJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdub2RlLW9wdXMnKVxuICAgICAgfSxcbiAgICAgIGxpYnNvZGl1bToge1xuICAgICAgICAnc29kaXVtLW5hdGl2ZSc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignc29kaXVtLW5hdGl2ZScpLFxuICAgICAgICBzb2RpdW06IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignc29kaXVtJyksXG4gICAgICAgICdsaWJzb2RpdW0td3JhcHBlcnMnOlxuICAgICAgICBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ2xpYnNvZGl1bS13cmFwcGVycycpLFxuICAgICAgICAnQHN0YWJsZWxpYi94Y2hhY2hhMjBwb2x5MTMwNSc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbihcbiAgICAgICAgICAnQHN0YWJsZWxpYi94Y2hhY2hhMjBwb2x5MTMwNSdcbiAgICAgICAgKSxcbiAgICAgICAgJ3NvZGl1bS1qYXZhc2NyaXB0JzpcbiAgICAgICAgRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdzb2RpdW0tamF2YXNjcmlwdCcpLFxuICAgICAgICAnQG5vYmVsL2NpcGhlcnMnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ0Bub2JlbC9jaXBoZXJzJylcbiAgICAgIH0sXG4gICAgICBmZm1wZWc6IGZmbXBlZ1JlcG9ydFxuICAgIH07XG4gIH0sXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRlcGVuZGVuY2llcyByZXBvcnQuXG4gICAqIEByZXR1cm5zIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb25cbiAgICovXG4gIGdlbmVyYXRlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVwb3J0ID0gRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci5nZW5lcmF0ZSgpO1xuICAgIGNvbnN0IGxpbmUgPSAnLScucmVwZWF0KDUwKTtcblxuICAgIGNvbnN0IG91dHB1dDogc3RyaW5nW10gPSBbXTtcblxuICAgIG91dHB1dC5wdXNoKCdEZXBlbmRlbmNpZXMgUmVwb3J0Jyk7XG4gICAgb3V0cHV0LnB1c2gobGluZSk7XG5cbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocmVwb3J0KSBhcyAoa2V5b2YgRGVwZW5kZW5jaWVzUmVwb3J0KVtdO1xuXG4gICAgZm9yIChjb25zdCBfa2V5IG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IGtleSA9IF9rZXkgYXMga2V5b2YgRGVwZW5kZW5jaWVzUmVwb3J0O1xuXG4gICAgICBvdXRwdXQucHVzaChrZXkpO1xuXG4gICAgICBjb25zdCBzdWJLZXlzID0gT2JqZWN0LmtleXMocmVwb3J0W2tleV0pO1xuXG4gICAgICBmb3IgKGNvbnN0IF9zdWJLZXkgb2Ygc3ViS2V5cykge1xuICAgICAgICBjb25zdCBzdWJLZXkgPSBfc3ViS2V5IGFzIGtleW9mIERlcGVuZGVuY2llc1JlcG9ydFt0eXBlb2Yga2V5XTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByZXBvcnRba2V5XVtzdWJLZXldID8/ICdOL0EnO1xuXG4gICAgICAgIG91dHB1dC5wdXNoKFxuICAgICAgICAgIGAtICR7c3ViS2V5fTogJHtcbiAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpIDogdmFsdWV9YFxuXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICB9XG5cbiAgICBvdXRwdXQucHVzaChsaW5lKTtcblxuICAgIHJldHVybiBvdXRwdXQuam9pbignXFxuJyk7XG4gIH1cbn07IiwgIlxuXG5cblxuXG5cbmV4cG9ydCBjb25zdCB2ZXJzaW9uID0gLyogQF9fTUFDUk9fXyBnZXRWZXJzaW9uICovXCI3LjIuMC1kZXYuMFwiOyIsICJpbXBvcnQgeyBTdHJlYW1UeXBlIH0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB0eXBlIHsgVHJhY2sgfSBmcm9tICcuL2ZhYnJpYyc7XG5pbXBvcnQgdHlwZSB7IFBsYXllciB9IGZyb20gJy4vUGxheWVyJztcbmltcG9ydCB0eXBlIHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4vcXVldWUnO1xuaW1wb3J0IHR5cGUgeyBJbnRlcmNlcHRlZFN0cmVhbSB9IGZyb20gJy4vc3RyZWFtL0ludGVyY2VwdGVkU3RyZWFtJztcblxudHlwZSBBd2FpdGFibGU8VD4gPSBUIHwgUHJvbWlzZUxpa2U8VD47XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgdHlwZSBTaG91bGRJbnRlcmNlcHRGdW5jdGlvbiA9IDxUID0gYW55PihcbnF1ZXVlOiBHdWlsZFF1ZXVlPFQ+LFxudHJhY2s6IFRyYWNrLFxuZm9ybWF0OiBTdHJlYW1UeXBlLFxuc3RyZWFtOiBJbnRlcmNlcHRlZFN0cmVhbSlcbj0+IEF3YWl0YWJsZTxib29sZWFuPjtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCB0eXBlIE9uSW50ZXJjZXB0ZWRTdHJlYW1IYW5kbGVyID0gPFQgPSBhbnk+KFxucXVldWU6IEd1aWxkUXVldWU8VD4sXG50cmFjazogVHJhY2ssXG5mb3JtYXQ6IFN0cmVhbVR5cGUsXG5zdHJlYW06IEludGVyY2VwdGVkU3RyZWFtKVxuPT4gQXdhaXRhYmxlPHZvaWQ+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllclN0cmVhbUludGVyY2VwdG9yT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHN0cmVhbSBzaG91bGQgYmUgaW50ZXJjZXB0ZWQuXG4gICAqL1xuICBzaG91bGRJbnRlcmNlcHQ/OiBTaG91bGRJbnRlcmNlcHRGdW5jdGlvbjtcbn1cblxuZXhwb3J0IGNsYXNzIFBsYXllclN0cmVhbUludGVyY2VwdG9yIHtcbiAgI29uU3RyZWFtID0gbmV3IFNldDxPbkludGVyY2VwdGVkU3RyZWFtSGFuZGxlcj4oKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBQbGF5ZXJTdHJlYW1JbnRlcmNlcHRvciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBsYXllciBUaGUgcGxheWVyIGluc3RhbmNlXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBpbnRlcmNlcHRvciBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyByZWFkb25seSBwbGF5ZXI6IFBsYXllcixcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBQbGF5ZXJTdHJlYW1JbnRlcmNlcHRvck9wdGlvbnMpXG4gIHt9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIGludGVyY2VwdGVkIHN0cmVhbS5cbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBndWlsZCBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrXG4gICAqIEBwYXJhbSBzdHJlYW0gVGhlIGludGVyY2VwdGVkIHN0cmVhbVxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBzdHJlYW0gd2FzIGludGVyY2VwdGVkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaGFuZGxlPFQgPSB1bmtub3duPihcbiAgcXVldWU6IEd1aWxkUXVldWU8VD4sXG4gIHRyYWNrOiBUcmFjayxcbiAgdHlwZTogU3RyZWFtVHlwZSxcbiAgc3RyZWFtOiBJbnRlcmNlcHRlZFN0cmVhbSlcbiAgOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLm9wdGlvbnMuc2hvdWxkSW50ZXJjZXB0O1xuXG4gICAgaWYgKGZpbHRlcikge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmlsdGVyKHF1ZXVlLCB0cmFjaywgdHlwZSwgc3RyZWFtKTtcbiAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzTGlzdGVuZXJzID0gdGhpcy4jb25TdHJlYW0uc2l6ZTtcblxuICAgIGlmICghaGFzTGlzdGVuZXJzKSByZXR1cm4gZmFsc2U7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIFsuLi50aGlzLiNvblN0cmVhbV0ubWFwKChoYW5kbGVyKSA9PiBoYW5kbGVyKHF1ZXVlLCB0cmFjaywgdHlwZSwgc3RyZWFtKSlcbiAgICApO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG5ldyBpbnRlcmNlcHRlZCBzdHJlYW0gbGlzdGVuZXIuXG4gICAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyXG4gICAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lclxuICAgKi9cbiAgcHVibGljIG9uU3RyZWFtKGhhbmRsZXI6IE9uSW50ZXJjZXB0ZWRTdHJlYW1IYW5kbGVyKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy4jb25TdHJlYW0uYWRkKGhhbmRsZXIpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMuI29uU3RyZWFtLmRlbGV0ZShoYW5kbGVyKTtcbiAgICB9O1xuICB9XG59Il0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG9CQUFBQTtBQUFBLEVBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDR0EsaUJBQW1EOzs7QUNINUMsSUFBTSw0QkFBNEIsT0FBTyxxQkFBcUI7QUFTOUQsU0FBUyxtQkFBbUIsUUFBYSxVQUF3QztBQUN0RixVQUFRLElBQUksUUFBUSwyQkFBMkIsUUFBUTtBQUN2RCxTQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQ0Y7QUFOZ0I7QUFRVCxTQUFTLGNBQWMsUUFBc0I7QUFDbEQsU0FBTyxRQUFRLElBQUksUUFBUSx5QkFBeUIsS0FB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QUFBQyx1QkFXQTsiLAogICJuYW1lcyI6IFsiR3VpbGRRdWV1ZSIsICJTZXJpYWxpemVkVHlwZSIsICJxdWVyeSIsICJ2ZXJzaW9uIiwgIkRpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wiLCAibW9kdWxlIiwgIkRpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wiLCAiaW1wb3J0X3YxMCIsICJEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sIiwgImRlY2xhcmVQcm9wZXJ0eSIsICJnZXRQcm9wZXJ0eSIsICJtb2R1bGUiLCAiRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X3V0aWxzIiwgInJlc3VsdCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmQiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF9wcm9taXNlcyIsICJpbXBvcnRfZGlzY29yZCIsICJyZXNvbHZlIiwgInJlc29sdmUiLCAid2FpdEZvciIsICJpbXBvcnRfZXF1YWxpemVyIiwgIlRyYWNrU2tpcFJlYXNvbiIsICJyZXNvbHZlIiwgIkd1aWxkUXVldWUiLCAiR3VpbGRRdWV1ZSIsICJpbXBvcnRfcHJvbWlzZXMiLCAidmVyc2lvbiIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfZmZtcGVnIiwgImltcG9ydF9kaXNjb3JkIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiLCAiaW1wb3J0X2Rpc2NvcmQiLCAiaW1wb3J0X2ZmbXBlZyIsICJkanNWZXJzaW9uIiwgInF1ZXJ5IiwgInJlcyIsICJyZXN1bHQiLCAiZFZvaWNlVmVyc2lvbiIsICJpbXBvcnRfZXF1YWxpemVyIiwgImltcG9ydF9kaXNjb3JkX3ZvaXAiXQp9Cg==
7545
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9jb21wYXQvY3JlYXRlRXJpc0NvbXBhdC50cyIsICIuLi9zcmMvY29tcGF0L2NvbW1vbi50cyIsICIuLi9zcmMvdXRpbHMvVXRpbC50cyIsICIuLi9zcmMvZmFicmljL1RyYWNrLnRzIiwgIi4uL3NyYy9lcnJvcnMvaW5kZXgudHMiLCAiLi4vc3JjL3V0aWxzL1R5cGVVdGlsLnRzIiwgIi4uL3NyYy91dGlscy9zZXJkZS50cyIsICIuLi9zcmMvZmFicmljL1BsYXlsaXN0LnRzIiwgIi4uL3NyYy91dGlscy9RdWVyeVJlc29sdmVyLnRzIiwgIi4uL3NyYy9mYWJyaWMvU2VhcmNoUmVzdWx0LnRzIiwgIi4uL3NyYy91dGlscy9BdWRpb0ZpbHRlcnMudHMiLCAiLi4vc3JjL2NvbXBhdC9jcmVhdGVPY2VhbmljQ29tcGF0LnRzIiwgIi4uL3NyYy91dGlscy9QbGF5ZXJFdmVudHNFbWl0dGVyLnRzIiwgIi4uL3NyYy9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3IudHMiLCAiLi4vc3JjL2V4dHJhY3RvcnMvRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dC50cyIsICIuLi9zcmMvaG9va3MvY29udGV4dC9hc3luYy1jb250ZXh0LnRzIiwgIi4uL3NyYy91dGlscy9fX2ludGVybmFsX18vX2NvbnRhaW5lci50cyIsICIuLi9zcmMvdXRpbHMvX19pbnRlcm5hbF9fL2dldEdsb2JhbFJlZ2lzdHJ5LnRzIiwgIi4uL3NyYy9ob29rcy9jb21tb24udHMiLCAiLi4vc3JjL2hvb2tzL3VzZUhpc3RvcnkudHMiLCAiLi4vc3JjL2hvb2tzL3VzZVBsYXllci50cyIsICIuLi9zcmMvaG9va3MvdXNlUXVldWUudHMiLCAiLi4vc3JjL2hvb2tzL3VzZU1haW5QbGF5ZXIudHMiLCAiLi4vc3JjL2hvb2tzL3VzZU1ldGFkYXRhLnRzIiwgIi4uL3NyYy9ob29rcy91c2VUaW1lbGluZS50cyIsICIuLi9zcmMvaG9va3Mvc3RyZWFtL29uQWZ0ZXJDcmVhdGVTdHJlYW0udHMiLCAiLi4vc3JjL2hvb2tzL3N0cmVhbS9vbkJlZm9yZUNyZWF0ZVN0cmVhbS50cyIsICIuLi9zcmMvaG9va3Mvc3RyZWFtL29uU3RyZWFtRXh0cmFjdGVkLnRzIiwgIi4uL3NyYy9ob29rcy91c2VWb2x1bWUudHMiLCAiLi4vc3JjL3F1ZXVlL0d1aWxkTm9kZU1hbmFnZXIudHMiLCAiLi4vc3JjL3F1ZXVlL0d1aWxkUXVldWUudHMiLCAiLi4vc3JjL3N0cmVhbS9TdHJlYW1EaXNwYXRjaGVyLnRzIiwgIi4uL3NyYy9zdHJlYW0vSW50ZXJjZXB0ZWRTdHJlYW0udHMiLCAiLi4vc3JjL3F1ZXVlL0d1aWxkUXVldWVIaXN0b3J5LnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZFF1ZXVlUGxheWVyTm9kZS50cyIsICIuLi9zcmMvdXRpbHMvQXN5bmNRdWV1ZS50cyIsICIuLi9zcmMvcXVldWUvR3VpbGRRdWV1ZUF1ZGlvRmlsdGVycy50cyIsICIuLi9zcmMvdXRpbHMvRkZtcGVnU3RyZWFtLnRzIiwgIi4uL3NyYy9xdWV1ZS9HdWlsZFF1ZXVlU3RhdGlzdGljcy50cyIsICIuLi9zcmMvcXVldWUvU3luY2VkTHlyaWNzUHJvdmlkZXIudHMiLCAiLi4vc3JjL3V0aWxzL1NlcXVlbnRpYWxCdWNrZXQudHMiLCAiLi4vc3JjL2xyY2xpYi9McmNMaWIudHMiLCAiLi4vc3JjL3N0cmVhbS9Wb2ljZVV0aWxzLnRzIiwgIi4uL3NyYy91dGlscy9RdWVyeUNhY2hlLnRzIiwgIi4uL3NyYy9QbGF5ZXIudHMiLCAiLi4vc3JjL0RlZmF1bHRWb2ljZVN0YXRlSGFuZGxlci50cyIsICIuLi9zcmMvdXRpbHMvRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci50cyIsICIuLi9zcmMvdmVyc2lvbi50cyIsICIuLi9zcmMvUGxheWVyU3RyZWFtSW50ZXJjZXB0b3IudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCB7IGNyZWF0ZUVyaXNDb21wYXQgfSBmcm9tICcuL2NvbXBhdC9jcmVhdGVFcmlzQ29tcGF0JztcbmV4cG9ydCB7IGNyZWF0ZU9jZWFuaWNDb21wYXQgfSBmcm9tICcuL2NvbXBhdC9jcmVhdGVPY2VhbmljQ29tcGF0JztcbmV4cG9ydCB7IGlzRXJpc1Byb3h5LCBpc09jZWFuaWNQcm94eSB9IGZyb20gJy4vY29tcGF0L2NvbW1vbic7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9BdWRpb0ZpbHRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0V4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9mYWJyaWMnO1xuZXhwb3J0ICogZnJvbSAnLi9xdWV1ZSc7XG5leHBvcnQgKiBmcm9tICcuL2xyY2xpYi9McmNMaWInO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9TZXF1ZW50aWFsQnVja2V0JztcbmV4cG9ydCAqIGZyb20gJy4vc3RyZWFtL1ZvaWNlVXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9zdHJlYW0vU3RyZWFtRGlzcGF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL1V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9UeXBlVXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0FzeW5jUXVldWUnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9GRm1wZWdTdHJlYW0nO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9RdWVyeUNhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5leHBvcnQgKiBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcbmV4cG9ydCAqIGZyb20gJy4vUGxheWVyJztcbmV4cG9ydCAqIGZyb20gJy4vaG9va3MnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9zZXJkZSc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL0RlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9zdHJlYW0vSW50ZXJjZXB0ZWRTdHJlYW0nO1xuZXhwb3J0ICogZnJvbSAnLi9QbGF5ZXJTdHJlYW1JbnRlcmNlcHRvcic7XG5leHBvcnQge1xuICBBdWRpb0ZpbHRlcnMgYXMgUENNQXVkaW9GaWx0ZXJzLFxuICB0eXBlIEJpcXVhZEZpbHRlcnMsXG4gIEZpbHRlclR5cGUgYXMgQmlxdWFkRmlsdGVyVHlwZSxcbiAgdHlwZSBQQ01GaWx0ZXJzLFxuICBRX0JVVFRFUldPUlRILFxuICBWb2x1bWVUcmFuc2Zvcm1lcixcbiAgQkFTU19FUV9CQU5EUyxcbiAgQUZfTklHSFRDT1JFX1JBVEUsXG4gIEFGX1ZBUE9SV0FWRV9SQVRFLFxuICBGaWx0ZXJzQ2hhaW4gfSBmcm9tXG4nQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5leHBvcnQge1xuICBjcmVhdGVBdWRpb1BsYXllcixcbiAgQXVkaW9QbGF5ZXIsXG4gIGdldFZvaWNlQ29ubmVjdGlvbixcbiAgZ2V0Vm9pY2VDb25uZWN0aW9ucyxcbiAgam9pblZvaWNlQ2hhbm5lbCxcbiAgU3RyZWFtVHlwZSxcbiAgY3JlYXRlQXVkaW9SZXNvdXJjZSxcbiAgdHlwZSBKb2luQ29uZmlnLFxuICB0eXBlIEpvaW5Wb2ljZUNoYW5uZWxPcHRpb25zLFxuICB0eXBlIENyZWF0ZUF1ZGlvUGxheWVyT3B0aW9ucyB9IGZyb21cbidkaXNjb3JkLXZvaXAnO1xuXG5leHBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uJzsiLCAiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuLy8gQHRzLW5vY2hlY2tcblxuaW1wb3J0IHsgQ2hhbm5lbFR5cGUsIEdhdGV3YXlEaXNwYXRjaEV2ZW50cyB9IGZyb20gJ2Rpc2NvcmQtYXBpLXR5cGVzL3YxMCc7XG5pbXBvcnQgeyBjcmVhdGVDb21wYXRDbGllbnQgfSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5cbmltcG9ydCB0eXBlIHsgRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvciB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQge1xuICBDbGllbnQsXG4gIEdhdGV3YXlWb2ljZVNlcnZlclVwZGF0ZURpc3BhdGNoRGF0YSxcbiAgR2F0ZXdheVZvaWNlU3RhdGVVcGRhdGVEaXNwYXRjaERhdGEsXG4gIFZvaWNlU3RhdGUgfSBmcm9tXG4nZGlzY29yZC5qcyc7XG5pbXBvcnQgdHlwZSBFcmlzIGZyb20gJ2VyaXMnO1xuXG50eXBlIEVyaXNVc2VyUmVzb2x2YWJsZSA9IEVyaXMuVXNlciB8IHN0cmluZyB8IEVyaXMuTWVtYmVyO1xudHlwZSBFcmlzR3VpbGRSZXNvbHZhYmxlID1cbkVyaXMuR3VpbGQgfFxuc3RyaW5nIHxcbkVyaXMuTWVtYmVyIHxcbkVyaXMuR3VpbGRDaGFubmVsIHxcbkVyaXMuUm9sZTtcbnR5cGUgRXJpc0NoYW5uZWxSZXNvbHZhYmxlID0gRXJpcy5HdWlsZENoYW5uZWwgfCBzdHJpbmc7XG5cbmNvbnN0IERpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wgPSBTeW1ib2woJ0Rpc2NvcmRQbGF5ZXJDbGllbnQnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzRXJpc0NsaWVudChjbGllbnQ6IGFueSk6IGNsaWVudCBpcyBFcmlzLkNsaWVudCB7XG4gIGNvbnN0IHsgbW9kdWxlLCBlcnJvciB9ID0gVXRpbC5yZXF1aXJlKCdlcmlzJyk7XG5cbiAgaWYgKGVycm9yKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZXJpcyA9IG1vZHVsZSBhcyB0eXBlb2YgaW1wb3J0KCdlcmlzJyk7XG5cbiAgcmV0dXJuIGNsaWVudCBpbnN0YW5jZW9mIGVyaXMuQ2xpZW50O1xufVxuXG5mdW5jdGlvbiBkZWNsYXJlUHJvcGVydHkodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gIFJlZmxlY3Quc2V0KHRhcmdldCwga2V5LCB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGdldFByb3BlcnR5PFQ+KHRhcmdldDogYW55LCBrZXk6IHN0cmluZyk6IFQge1xuICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBrZXkpO1xufVxuXG4vKipcbiAqIEFsbG93cyBFcmlzIGNsaWVudHMgdG8gYmUgdXNlZCB3aXRoIGRpc2NvcmQtcGxheWVyLiBXaGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgZGlzY29yZC1wbGF5ZXIgY3JlYXRlcyBhIHByb3h5IG9iamVjdCB0aGF0IGludGVyY2VwdHMgY2VydGFpbiBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIHRvIG1ha2UgaXQgY29tcGF0aWJsZSB3aXRoIGRpc2NvcmQtcGxheWVyLlxuICogQHBhcmFtIGNsaWVudCBUaGUgRXJpcyBjbGllbnQgdG8gYmUgdXNlZC5cbiAqIEByZXR1cm5zIFRoZSBFcmlzIGNsaWVudCB3aXRoIGRpc2NvcmQtcGxheWVyIGNvbXBhdGliaWxpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFcmlzQ29tcGF0KGNsaWVudDogRXJpcy5DbGllbnQpOiBDbGllbnQge1xuICBjb25zdCB7IG1vZHVsZSwgZXJyb3IgfSA9IFV0aWwucmVxdWlyZSgnZXJpcycpO1xuXG4gIGlmIChlcnJvcikgdGhyb3cgZXJyb3I7XG5cbiAgY29uc3QgZXJpcyA9IG1vZHVsZSBhcyB0eXBlb2YgaW1wb3J0KCdlcmlzJyk7XG5cbiAgZXJpc1ZvaWNlRXZlbnRzSGFuZGxlcihjbGllbnQpO1xuXG4gIGNvbnN0IGVyaXNQcm94eSA9IG5ldyBQcm94eShjbGllbnQsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBzd2l0Y2ggKHApIHtcbiAgICAgICAgY2FzZSAndXNlcnMnOlxuICAgICAgICAgIHJldHVybiBlcmlzVXNlcnNQcm94eSh0YXJnZXQsIGVyaXMpO1xuICAgICAgICBjYXNlICdndWlsZHMnOlxuICAgICAgICAgIHJldHVybiBlcmlzR3VpbGRzUHJveHkodGFyZ2V0LCBlcmlzKTtcbiAgICAgICAgY2FzZSAnY2hhbm5lbHMnOlxuICAgICAgICAgIHJldHVybiBlcmlzQ2hhbm5lbHNQcm94eSh0YXJnZXQsIGVyaXMpO1xuICAgICAgICBjYXNlICdfX2RwX3ZvaWNlU3RhdGVVcGRhdGVfcHJveHknOlxuICAgICAgICAgIHJldHVybiAoaGFuZGxlcjogKGEsIGIpID0+IHZvaWQpID0+XG4gICAgICAgICAgZXJpc1ZvaWNlU3RhdGVVcGRhdGVQcm94eSh0YXJnZXQsIGVyaXNQcm94eSwgaGFuZGxlcik7XG4gICAgICAgIGNhc2UgJ2luY3JlbWVudE1heExpc3RlbmVycyc6XG4gICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICAgIGNsaWVudC5zZXRNYXhMaXN0ZW5lcnMoY2xpZW50LmdldE1heExpc3RlbmVycygpICsgMSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgY2FzZSAnZGVjcmVtZW50TWF4TGlzdGVuZXJzJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gY2xpZW50LmdldE1heExpc3RlbmVycygpIC0gMTtcblxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgICAgY2xpZW50LnNldE1heExpc3RlbmVycyhsaXN0ZW5lcnMgPCAwID8gMSA6IGxpc3RlbmVycyk7XG4gICAgICAgICAgfTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIFJlZmxlY3Quc2V0KGVyaXNQcm94eSwgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCwgJ0VyaXMnKTtcblxuICByZXR1cm4gY3JlYXRlQ29tcGF0Q2xpZW50KGVyaXNQcm94eSwgJ0VyaXMnKS5jbGllbnQgYXMgdW5rbm93biBhcyBDbGllbnQ7XG59XG5cbmZ1bmN0aW9uIGVyaXNWb2ljZVN0YXRlVXBkYXRlUHJveHkoXG5jbGllbnQ6IEVyaXMuQ2xpZW50LFxucHJveHk6IEVyaXMuQ2xpZW50LFxuaGFuZGxlcjogKGEsIGIpID0+IHZvaWQpXG57XG4gIGNsaWVudC5vbigndm9pY2VTdGF0ZVVwZGF0ZScsIChtZW1iZXIsIG9sZFN0YXRlKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb3hpZWRPbGRTdGF0ZSA9IHtcbiAgICAgICAgY2hhbm5lbElkOiBvbGRTdGF0ZS5jaGFubmVsSUQsXG4gICAgICAgIHNlcnZlck11dGU6IG9sZFN0YXRlLm11dGUsXG4gICAgICAgIHN1cHByZXNzOiBvbGRTdGF0ZS5zdXBwcmVzcyxcbiAgICAgICAgZ3VpbGQ6IHtcbiAgICAgICAgICBpZDogb2xkU3RhdGUuZ3VpbGQuaWRcbiAgICAgICAgfSxcbiAgICAgICAgbWVtYmVyOiB7XG4gICAgICAgICAgaWQ6IG9sZFN0YXRlLnVzZXIuaWRcbiAgICAgICAgfVxuICAgICAgfSBhcyBWb2ljZVN0YXRlO1xuXG4gICAgICBjb25zdCBtZSA9IG1lbWJlci5ndWlsZC5tZW1iZXJzLmdldChjbGllbnQudXNlci5pZCk7XG4gICAgICBjb25zdCByZXNvbHZlZENoYW5uZWwgPSBtZW1iZXIuZ3VpbGQuY2hhbm5lbHMuZ2V0KFxuICAgICAgICBtZW1iZXIudm9pY2VTdGF0ZS5jaGFubmVsSURcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHByb3hpZWROZXdTdGF0ZSA9IHtcbiAgICAgICAgY2hhbm5lbElkOiBtZW1iZXIudm9pY2VTdGF0ZS5jaGFubmVsSUQsXG4gICAgICAgIHNlcnZlck11dGU6IG1lbWJlci52b2ljZVN0YXRlLm11dGUsXG4gICAgICAgIHN1cHByZXNzOiBtZW1iZXIudm9pY2VTdGF0ZS5zdXBwcmVzcyxcbiAgICAgICAgY2hhbm5lbDogZXJpc1Jlc29sdmVkQ2hhbm5lbFByb3h5KHJlc29sdmVkQ2hhbm5lbCwgY2xpZW50KSxcbiAgICAgICAgbWVtYmVyOiB7XG4gICAgICAgICAgaWQ6IG1lbWJlci5pZFxuICAgICAgICB9LFxuICAgICAgICBndWlsZDoge1xuICAgICAgICAgIGlkOiBtZW1iZXIuZ3VpbGQuaWQsXG4gICAgICAgICAgbWVtYmVyczoge1xuICAgICAgICAgICAgbWU6IHtcbiAgICAgICAgICAgICAgaWQ6IG1lPy5pZCxcbiAgICAgICAgICAgICAgdm9pY2U6IHtcbiAgICAgICAgICAgICAgICBhc3luYyBzZXRSZXF1ZXN0VG9TcGVhayh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICAgICAgICAgICAgdm9pZCB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBtZT8udm9pY2VTdGF0ZTtcbiAgICAgICAgICAgICAgICAgIC8vIGlmIChtZSkge1xuICAgICAgICAgICAgICAgICAgLy8gICByZXR1cm4gbWUudm9pY2Uuc2V0UmVxdWVzdFRvU3BlYWsodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBhcyBWb2ljZVN0YXRlO1xuXG4gICAgICByZXR1cm4gaGFuZGxlcihwcm94aWVkTmV3U3RhdGUsIHByb3hpZWRPbGRTdGF0ZSk7XG4gICAgfSBjYXRjaCB7XG5cbiAgICAgIC8qIG5vb3AgKi99XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlcmlzVm9pY2VFdmVudHNIYW5kbGVyKGNsaWVudDogRXJpcy5DbGllbnQpIHtcbiAgbGV0IGFkYXB0ZXJzID0gZ2V0UHJvcGVydHk8TWFwPHN0cmluZywgYW55Pj4oY2xpZW50LCAnYWRhcHRlcnMnKTtcblxuICBpZiAoIWFkYXB0ZXJzKSB7XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgYWRhcHRlcnMgPSBjb2xsZWN0aW9uO1xuICAgIGRlY2xhcmVQcm9wZXJ0eShjbGllbnQsICdhZGFwdGVycycsIGNvbGxlY3Rpb24pO1xuICB9XG5cbiAgY2xpZW50Lm9uKCdzaGFyZERpc2Nvbm5lY3QnLCAoXywgc2hhcmRJZCkgPT4ge1xuICAgIGZvciAoY29uc3QgW2d1aWxkSWQsIGFkYXB0ZXJdIG9mIGFkYXB0ZXJzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGNsaWVudC5ndWlsZHMuZ2V0KGd1aWxkSWQpPy5zaGFyZC5pZCA9PT0gc2hhcmRJZCkge1xuICAgICAgICBhZGFwdGVyLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGNsaWVudC5vbigncmF3V1MnLCAocGFja2V0KSA9PiB7XG4gICAgc3dpdGNoIChwYWNrZXQudCkge1xuICAgICAgY2FzZSBHYXRld2F5RGlzcGF0Y2hFdmVudHMuVm9pY2VTZXJ2ZXJVcGRhdGU6e1xuICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBwYWNrZXQuZCBhcyBHYXRld2F5Vm9pY2VTZXJ2ZXJVcGRhdGVEaXNwYXRjaERhdGE7XG4gICAgICAgICAgYWRhcHRlcnMuZ2V0KHBheWxvYWQuZ3VpbGRfaWQpPy5vblZvaWNlU2VydmVyVXBkYXRlKHBheWxvYWQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5RGlzcGF0Y2hFdmVudHMuVm9pY2VTdGF0ZVVwZGF0ZTp7XG4gICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHBhY2tldC5kIGFzIEdhdGV3YXlWb2ljZVN0YXRlVXBkYXRlRGlzcGF0Y2hEYXRhO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgIHBheWxvYWQuZ3VpbGRfaWQgJiZcbiAgICAgICAgICBwYXlsb2FkLnNlc3Npb25faWQgJiZcbiAgICAgICAgICBwYXlsb2FkLnVzZXJfaWQgPT09IGNsaWVudC51c2VyLmlkKVxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkYXB0ZXJzLmdldChwYXlsb2FkLmd1aWxkX2lkKT8ub25Wb2ljZVN0YXRlVXBkYXRlKHBheWxvYWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXJpc0NoYW5uZWxzUHJveHkoY2xpZW50OiBFcmlzLkNsaWVudCwgZXJpczogdHlwZW9mIGltcG9ydCgnZXJpcycpKSB7XG4gIGNvbnN0IGhhbmRsZXIgPSB7XG4gICAgY2xpZW50LFxuICAgIGdldCBjYWNoZSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGdldChpZDogc3RyaW5nKSB7XG4gICAgICAgICAgcmV0dXJuIGNsaWVudC5nZXRDaGFubmVsKGlkKTtcbiAgICAgICAgfSxcbiAgICAgICAgaGFzKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgICByZXR1cm4gaWQgaW4gY2xpZW50LmNoYW5uZWxHdWlsZE1hcDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LFxuICAgIHJlc29sdmUocmVzb2x2YWJsZTogc3RyaW5nIHwgRXJpc0NoYW5uZWxSZXNvbHZhYmxlKSB7XG4gICAgICBpZiAodHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBlcmlzUmVzb2x2ZWRDaGFubmVsUHJveHkoXG4gICAgICAgICAgdGhpcy5jbGllbnQuZ2V0Q2hhbm5lbChyZXNvbHZhYmxlKSBhcyBFcmlzLkd1aWxkQ2hhbm5lbCxcbiAgICAgICAgICBjbGllbnRcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLkd1aWxkQ2hhbm5lbCkge1xuICAgICAgICByZXR1cm4gZXJpc1Jlc29sdmVkQ2hhbm5lbFByb3h5KHJlc29sdmFibGUsIGNsaWVudCk7XG4gICAgICB9XG4gICAgfSxcbiAgICByZXNvbHZlSWQocmVzb2x2YWJsZTogRXJpc0NoYW5uZWxSZXNvbHZhYmxlKSB7XG4gICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5yZXNvbHZlKHJlc29sdmFibGUpO1xuICAgICAgcmV0dXJuIGNoYW5uZWw/LmlkO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gaGFuZGxlcjtcbn1cblxuZnVuY3Rpb24gZXJpc1Jlc29sdmVkQ2hhbm5lbFByb3h5KFxuY2hhbm5lbDogRXJpcy5HdWlsZENoYW5uZWwgfCB1bmRlZmluZWQsXG5jbGllbnQ6IEVyaXMuQ2xpZW50KVxuOiBFcmlzLkd1aWxkQ2hhbm5lbCB8IHVuZGVmaW5lZCB7XG4gIGlmICghY2hhbm5lbCkgcmV0dXJuO1xuXG4gIHJldHVybiBuZXcgUHJveHkoY2hhbm5lbCwge1xuICAgIGdldCh0YXJnZXQsIHApIHtcbiAgICAgIHN3aXRjaCAocCkge1xuICAgICAgICBjYXNlICdndWlsZCc6XG4gICAgICAgICAgcmV0dXJuIGVyaXNWb2ljZUFkYXB0ZXJQcm94eSh0YXJnZXQuZ3VpbGQsIGNsaWVudCk7XG4gICAgICAgIGNhc2UgJ21lbWJlcnMnOlxuICAgICAgICAgIHJldHVybiAodGFyZ2V0IGFzIEVyaXMuVm9pY2VDaGFubmVsKS52b2ljZU1lbWJlcnM7XG4gICAgICAgIGNhc2UgJ2lzVm9pY2VCYXNlZCc6XG4gICAgICAgICAgcmV0dXJuICgpID0+XG4gICAgICAgICAgdGFyZ2V0LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkVm9pY2UgfHxcbiAgICAgICAgICB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlO1xuICAgICAgICBjYXNlICdpc1ZvaWNlJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4gdGFyZ2V0LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkVm9pY2U7XG4gICAgICAgIGNhc2UgJ2lzU3RhZ2UnOlxuICAgICAgICAgIHJldHVybiAoKSA9PiB0YXJnZXQudHlwZSA9PT0gQ2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNWb2ljZUFkYXB0ZXJQcm94eShcbmd1aWxkOiBFcmlzLkd1aWxkIHwgdW5kZWZpbmVkLFxuY2xpZW50OiBFcmlzLkNsaWVudClcbjogRXJpcy5HdWlsZCB8IHVuZGVmaW5lZCB7XG4gIGlmICghZ3VpbGQpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb3h5KGd1aWxkLCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgaWYgKHAgPT09ICd2b2ljZUFkYXB0ZXJDcmVhdG9yJykge1xuICAgICAgICByZXR1cm4gZXJpc1ZvaWNlQWRhcHRlckNyZWF0b3IodGFyZ2V0LCBjbGllbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNWb2ljZUFkYXB0ZXJDcmVhdG9yKFxuZ3VpbGQ6IEVyaXMuR3VpbGQsXG5jbGllbnQ6IEVyaXMuQ2xpZW50KVxuOiBEaXNjb3JkR2F0ZXdheUFkYXB0ZXJDcmVhdG9yIHtcbiAgcmV0dXJuIChtZXRob2RzKSA9PiB7XG4gICAgbGV0IGFkYXB0ZXJzID0gZ2V0UHJvcGVydHk8TWFwPHN0cmluZywgdHlwZW9mIG1ldGhvZHM+PihjbGllbnQsICdhZGFwdGVycycpO1xuXG4gICAgaWYgKCFhZGFwdGVycykge1xuICAgICAgY29uc3QgY29sbGVjdGlvbiA9IG5ldyBNYXA8c3RyaW5nLCB0eXBlb2YgbWV0aG9kcz4oKTtcbiAgICAgIGFkYXB0ZXJzID0gY29sbGVjdGlvbjtcbiAgICAgIGRlY2xhcmVQcm9wZXJ0eShjbGllbnQsICdhZGFwdGVycycsIGNvbGxlY3Rpb24pO1xuICAgIH1cblxuICAgIGFkYXB0ZXJzLnNldChndWlsZC5pZCwgbWV0aG9kcyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2VuZFBheWxvYWQocGF5bG9hZCkge1xuICAgICAgICBpZiAoZ3VpbGQuc2hhcmQuc3RhdHVzICE9PSAncmVhZHknKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGd1aWxkLnNoYXJkLnNlbmRXUyhwYXlsb2FkLm9wLCBwYXlsb2FkLmQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICBkZXN0cm95KCkge1xuICAgICAgICBhZGFwdGVycy5kZWxldGUoZ3VpbGQuaWQpO1xuICAgICAgfVxuICAgIH07XG4gIH07XG59XG5cbmZ1bmN0aW9uIGVyaXNHdWlsZHNQcm94eShjbGllbnQ6IEVyaXMuQ2xpZW50LCBlcmlzOiB0eXBlb2YgaW1wb3J0KCdlcmlzJykpIHtcbiAgcmV0dXJuIG5ldyBQcm94eShjbGllbnQuZ3VpbGRzLCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgaWYgKHAgPT09ICdjYWNoZScpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH1cblxuICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJyB8fCBwID09PSAncmVzb2x2ZUlkJykge1xuICAgICAgICBjb25zdCByZXNvbHZlciA9IGZ1bmN0aW9uIChyZXNvbHZhYmxlOiBFcmlzR3VpbGRSZXNvbHZhYmxlKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5nZXQocmVzb2x2YWJsZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLkd1aWxkKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2YWJsZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgcmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuTWVtYmVyIHx8XG4gICAgICAgICAgcmVzb2x2YWJsZSBpbnN0YW5jZW9mIGVyaXMuR3VpbGQgfHxcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5HdWlsZENoYW5uZWwgfHxcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5Sb2xlKVxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlLmd1aWxkO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAocCA9PT0gJ3Jlc29sdmUnKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChyZXNvbHZhYmxlOiBFcmlzR3VpbGRSZXNvbHZhYmxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgZ3VpbGQgPSByZXNvbHZlcihyZXNvbHZhYmxlKTtcbiAgICAgICAgICByZXR1cm4gZ3VpbGQ/LmlkO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVyaXNVc2Vyc1Byb3h5KGNsaWVudDogRXJpcy5DbGllbnQsIGVyaXM6IHR5cGVvZiBpbXBvcnQoJ2VyaXMnKSkge1xuICByZXR1cm4gbmV3IFByb3h5KGNsaWVudC51c2Vycywge1xuICAgIGdldCh0YXJnZXQsIHApIHtcbiAgICAgIGlmIChwID09PSAnY2FjaGUnKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChwID09PSAncmVzb2x2ZScgfHwgcCA9PT0gJ3Jlc29sdmVJZCcpIHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZXIgPSBmdW5jdGlvbiAocmVzb2x2YWJsZTogRXJpc1VzZXJSZXNvbHZhYmxlKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5nZXQocmVzb2x2YWJsZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlc29sdmFibGUgaW5zdGFuY2VvZiBlcmlzLlVzZXIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZXNvbHZhYmxlIGluc3RhbmNlb2YgZXJpcy5NZW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlLnVzZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChwID09PSAncmVzb2x2ZScpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHJlc29sdmFibGU6IEVyaXNVc2VyUmVzb2x2YWJsZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVzZXIgPSByZXNvbHZlcihyZXNvbHZhYmxlKTtcbiAgICAgICAgICByZXR1cm4gdXNlcj8uaWQ7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgfVxuICB9KTtcbn0iLCAiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG5leHBvcnQgY29uc3QgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCA9IFN5bWJvbCgnRGlzY29yZFBsYXllckNsaWVudCcpO1xuXG5leHBvcnQgdHlwZSBDb21wYXRQcm92aWRlciA9ICdFcmlzJyB8ICdPY2VhbmljJztcblxuZXhwb3J0IGludGVyZmFjZSBDb21wYXRDbGllbnQge1xuICBwcm92aWRlcjogQ29tcGF0UHJvdmlkZXI7XG4gIGNsaWVudDogYW55O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29tcGF0Q2xpZW50KFxuY2xpZW50OiBhbnksXG5wcm92aWRlcjogQ29tcGF0UHJvdmlkZXIpXG46IENvbXBhdENsaWVudCB7XG4gIFJlZmxlY3Quc2V0KGNsaWVudCwgRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCwgcHJvdmlkZXIpO1xuICByZXR1cm4ge1xuICAgIHByb3ZpZGVyLFxuICAgIGNsaWVudFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDbGllbnRQcm94eShjbGllbnQ6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gUmVmbGVjdC5nZXQoY2xpZW50LCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sKSAhPSBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tcGF0TmFtZShjbGllbnQ6IGFueSk6IENvbXBhdFByb3ZpZGVyIHwgbnVsbCB7XG4gIHJldHVybiBSZWZsZWN0LmdldChjbGllbnQsIERpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wpID8/IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VyaXNQcm94eShjbGllbnQ6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0Q29tcGF0TmFtZShjbGllbnQpID09PSAnRXJpcyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc09jZWFuaWNQcm94eShjbGllbnQ6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0Q29tcGF0TmFtZShjbGllbnQpID09PSAnT2NlYW5pYyc7XG59IiwgImltcG9ydCB7IFN0YWdlQ2hhbm5lbCwgVm9pY2VDaGFubmVsIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAnbm9kZTp0aW1lcnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IFBsYXlsaXN0LCBUcmFjaywgVHJhY2tTb3VyY2UgfSBmcm9tICcuLi9mYWJyaWMnO1xuaW1wb3J0IHsgT3V0T2ZTcGFjZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IHJhbmRvbUludCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7XG4gIGNyZWF0ZUZpbHRlcixcbiAgY3JlYXRlU3BvdGlmeUZpbHRlcixcbiAgZml4VHJhY2tTdWZmaXgsXG4gIHJlbW92ZUxpdmUsXG4gIHJlbW92ZVJlbWFzdGVyZWQsXG4gIHlvdXR1YmUsXG4gIHJlbW92ZVplcm9XaWR0aCxcbiAgcmVwbGFjZU5ic3AsXG4gIHJlcGxhY2VTbWFydFF1b3RlcyxcbiAgcmVtb3ZlQ2xlYW5FeHBsaWNpdCB9IGZyb21cbidAd2ViLXNjcm9iYmxlci9tZXRhZGF0YS1maWx0ZXInO1xuXG5leHBvcnQgdHlwZSBSdW50aW1lVHlwZSA9ICdub2RlJyB8ICdkZW5vJyB8ICdidW4nIHwgJ3Vua25vd24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVEYXRhIHtcbiAgLyoqXG4gICAqIFRpbWUgaW4gZGF5c1xuICAgKi9cbiAgZGF5czogbnVtYmVyO1xuICAvKipcbiAgICogVGltZSBpbiBob3Vyc1xuICAgKi9cbiAgaG91cnM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRpbWUgaW4gbWludXRlc1xuICAgKi9cbiAgbWludXRlczogbnVtYmVyO1xuICAvKipcbiAgICogVGltZSBpbiBzZWNvbmRzXG4gICAqL1xuICBzZWNvbmRzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZSB7XG4gIG5hbWU6IFJ1bnRpbWVUeXBlO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbmNsYXNzIFV0aWwge1xuICAvKipcbiAgICogVXRpbHNcbiAgICovXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBydW50aW1lIGluZm9ybWF0aW9uXG4gICAqL1xuICBzdGF0aWMgZ2V0UnVudGltZSgpOiBSdW50aW1lIHtcbiAgICBjb25zdCB2ZXJzaW9uID1cbiAgICB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyA/IG5hdmlnYXRvci51c2VyQWdlbnQgOiBudWxsO1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh0eXBlb2YgRGVubyAhPT0gJ3VuZGVmaW5lZCcgJiYgRGVuby52ZXJzaW9uKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICByZXR1cm4geyBuYW1lOiAnZGVubycsIHZlcnNpb246IERlbm8udmVyc2lvbi5kZW5vIH07XG4gICAgfVxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh0eXBlb2YgQnVuICE9PSAndW5kZWZpbmVkJyAmJiBCdW4udmVyc2lvbikge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgcmV0dXJuIHsgbmFtZTogJ2J1bicsIHZlcnNpb246IEJ1bi52ZXJzaW9uIH07XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLnZlcnNpb24pXG4gICAgcmV0dXJuIHsgbmFtZTogJ25vZGUnLCB2ZXJzaW9uOiBwcm9jZXNzLnZlcnNpb24gfTtcblxuICAgIHJldHVybiB7IG5hbWU6ICd1bmtub3duJywgdmVyc2lvbjogdmVyc2lvbiA/PyAndW5rbm93bicgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGR1cmF0aW9uIHN0cmluZ1xuICAgKiBAcGFyYW0ge29iamVjdH0gZHVyT2JqIFRoZSBkdXJhdGlvbiBvYmplY3RcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBkdXJhdGlvblN0cmluZyhkdXJPYmo6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4pIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhkdXJPYmopLlxuICAgIG1hcCgobSkgPT4gaXNOYU4obSkgPyAwIDogbSkuXG4gICAgam9pbignOicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBtaWxsaXNlY29uZHMgdG8gY29uc3VtYWJsZSB0aW1lIG9iamVjdFxuICAgKiBAcGFyYW0ge251bWJlcn0gbWlsbGlzZWNvbmRzIFRoZSB0aW1lIGluIG1zXG4gICAqIEByZXR1cm5zIHtUaW1lRGF0YX1cbiAgICovXG4gIHN0YXRpYyBwYXJzZU1TKG1pbGxpc2Vjb25kczogbnVtYmVyKSB7XG4gICAgaWYgKGlzTmFOKG1pbGxpc2Vjb25kcykpIG1pbGxpc2Vjb25kcyA9IDA7XG4gICAgY29uc3Qgcm91bmQgPSBtaWxsaXNlY29uZHMgPiAwID8gTWF0aC5mbG9vciA6IE1hdGguY2VpbDtcblxuICAgIHJldHVybiB7XG4gICAgICBkYXlzOiByb3VuZChtaWxsaXNlY29uZHMgLyA4NjQwMDAwMCksXG4gICAgICBob3Vyczogcm91bmQobWlsbGlzZWNvbmRzIC8gMzYwMDAwMCkgJSAyNCxcbiAgICAgIG1pbnV0ZXM6IHJvdW5kKG1pbGxpc2Vjb25kcyAvIDYwMDAwKSAlIDYwLFxuICAgICAgc2Vjb25kczogcm91bmQobWlsbGlzZWNvbmRzIC8gMTAwMCkgJSA2MFxuICAgIH0gYXMgVGltZURhdGE7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRpbWUgY29kZVxuICAgKiBAcGFyYW0ge1RpbWVEYXRhfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gb2JqZWN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBzdGF0aWMgYnVpbGRUaW1lQ29kZShkdXJhdGlvbjogVGltZURhdGEpIHtcbiAgICBjb25zdCBpdGVtcyA9IE9iamVjdC5rZXlzKGR1cmF0aW9uKTtcbiAgICBjb25zdCByZXF1aXJlZCA9IFsnZGF5cycsICdob3VycycsICdtaW51dGVzJywgJ3NlY29uZHMnXTtcblxuICAgIGNvbnN0IHBhcnNlZCA9IGl0ZW1zLlxuICAgIGZpbHRlcigoeCkgPT4gcmVxdWlyZWQuaW5jbHVkZXMoeCkpLlxuICAgIG1hcCgobSkgPT4gZHVyYXRpb25bbSBhcyBrZXlvZiBUaW1lRGF0YV0pO1xuICAgIGNvbnN0IGZpbmFsID0gcGFyc2VkLlxuICAgIHNsaWNlKHBhcnNlZC5maW5kSW5kZXgoKHgpID0+IHggIT09IDApKS5cbiAgICBtYXAoKHgpID0+IHgudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpKS5cbiAgICBqb2luKCc6Jyk7XG5cbiAgICByZXR1cm4gZmluYWwubGVuZ3RoIDw9IDMgPyBgMDoke2ZpbmFsLnBhZFN0YXJ0KDIsICcwJykgfHwgMH1gIDogZmluYWw7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0cyBkdXJhdGlvblxuICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIGluIG1zXG4gICAqL1xuICBzdGF0aWMgZm9ybWF0RHVyYXRpb24oZHVyYXRpb246IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkVGltZUNvZGUodGhpcy5wYXJzZU1TKGR1cmF0aW9uKSk7XG4gIH1cblxuICAvKipcbiAgICogUGlja3MgbGFzdCBpdGVtIG9mIHRoZSBnaXZlbiBhcnJheVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcnIgVGhlIGFycmF5XG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBzdGF0aWMgbGFzdDxUID0gYW55PihhcnI6IFRbXSk6IFQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xuICAgIHJldHVybiBhcnJbYXJyLmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgdm9pY2UgY2hhbm5lbCBpcyBlbXB0eVxuICAgKiBAcGFyYW0ge1ZvaWNlQ2hhbm5lbHxTdGFnZUNoYW5uZWx9IGNoYW5uZWwgVGhlIHZvaWNlIGNoYW5uZWxcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBzdGF0aWMgaXNWb2ljZUVtcHR5KGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbCkge1xuICAgIHJldHVybiAoXG4gICAgICBjaGFubmVsICYmIGNoYW5uZWwubWVtYmVycy5maWx0ZXIoKG1lbWJlcikgPT4gIW1lbWJlci51c2VyLmJvdCkuc2l6ZSA9PT0gMCk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbnMgdGhlIHRyYWNrIHRpdGxlXG4gICAqIEBwYXJhbSB0aXRsZSBUaGUgdGl0bGVcbiAgICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlXG4gICAqIEByZXR1cm5zIENsZWFuZWQgdGl0bGVcbiAgICovXG4gIHN0YXRpYyBjbGVhblRpdGxlKHRpdGxlOiBzdHJpbmcsIHNvdXJjZTogVHJhY2tTb3VyY2UpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsdGVyT3B0cyA9IHtcbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIHRyYWNrOiBbXG4gICAgICAgIHJlbW92ZVJlbWFzdGVyZWQsXG4gICAgICAgIHJlbW92ZUxpdmUsXG4gICAgICAgIGZpeFRyYWNrU3VmZml4LFxuICAgICAgICByZW1vdmVaZXJvV2lkdGgsXG4gICAgICAgIHJlcGxhY2VOYnNwLFxuICAgICAgICByZXBsYWNlU21hcnRRdW90ZXMsXG4gICAgICAgIHJlbW92ZUNsZWFuRXhwbGljaXRdXG5cbiAgICAgIH07XG4gICAgICBjb25zdCBzcG90aWZ5RmlsdGVyID0gY3JlYXRlRmlsdGVyKGZpbHRlck9wdHMpO1xuICAgICAgc3BvdGlmeUZpbHRlci5leHRlbmQoY3JlYXRlU3BvdGlmeUZpbHRlcigpKTtcbiAgICAgIGNvbnN0IGRlZmF1bHRGaWx0ZXIgPSBjcmVhdGVGaWx0ZXIoZmlsdGVyT3B0cyk7XG5cbiAgICAgIHN3aXRjaCAoc291cmNlKSB7XG4gICAgICAgIGNhc2UgJ3lvdXR1YmUnOlxuICAgICAgICAgIHJldHVybiB5b3V0dWJlKHRpdGxlKTtcbiAgICAgICAgY2FzZSAnc3BvdGlmeSc6XG4gICAgICAgICAgcmV0dXJuIHNwb3RpZnlGaWx0ZXIuZmlsdGVyRmllbGQoJ3RyYWNrJywgdGl0bGUpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBkZWZhdWx0RmlsdGVyLmZpbHRlckZpZWxkKCd0cmFjaycsIHRpdGxlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0aXRsZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2FmZXIgcmVxdWlyZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgTm9kZSByZXF1aXJlIGlkXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBzdGF0aWMgcmVxdWlyZShpZDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IG1vZHVsZTogcmVxdWlyZShpZCksIGVycm9yOiBudWxsIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IG1vZHVsZTogbnVsbCwgZXJyb3IgfTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgaW1wb3J0KGlkOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbW9kID0gYXdhaXQgaW1wb3J0KGlkKTtcbiAgICAgIHJldHVybiB7IG1vZHVsZTogbW9kLCBlcnJvcjogbnVsbCB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBtb2R1bGU6IG51bGwsIGVycm9yIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91cyB0aW1lb3V0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIFRoZSB0aW1lIGluIG1zIHRvIHdhaXRcbiAgICogQHJldHVybnMge1Byb21pc2U8dW5rbm93bj59XG4gICAqL1xuICBzdGF0aWMgd2FpdCh0aW1lOiBudW1iZXIpIHtcbiAgICByZXR1cm4gc2V0VGltZW91dCh0aW1lLCB1bmRlZmluZWQsIHsgcmVmOiBmYWxzZSB9KTtcbiAgfVxuXG4gIHN0YXRpYyBub29wKCkge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cblxuICBzdGF0aWMgYXN5bmMgZ2V0RmV0Y2goKSB7XG4gICAgaWYgKCdmZXRjaCcgaW4gZ2xvYmFsVGhpcykgcmV0dXJuIGdsb2JhbFRoaXMuZmV0Y2g7XG4gICAgZm9yIChjb25zdCBsaWIgb2YgWydub2RlLWZldGNoJywgJ3VuZGljaSddKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgaW1wb3J0KGxpYikudGhlbihcbiAgICAgICAgICAocmVzKSA9PiByZXMuZmV0Y2ggfHwgcmVzLmRlZmF1bHQ/LmZldGNoIHx8IHJlcy5kZWZhdWx0XG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICBjb25zdCByZXMgPSByZXF1aXJlKGxpYik7XG4gICAgICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcy5mZXRjaCB8fCByZXMuZGVmYXVsdD8uZmV0Y2ggfHwgcmVzLmRlZmF1bHQ7XG4gICAgICAgIH0gY2F0Y2gge1xuXG4gICAgICAgICAgLy8gbm8/XG4gICAgICAgIH19XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHdhcm4obWVzc2FnZTogc3RyaW5nLCBjb2RlID0gJ0RlcHJlY2F0aW9uV2FybmluZycsIGRldGFpbD86IHN0cmluZykge1xuICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcobWVzc2FnZSwge1xuICAgICAgY29kZSxcbiAgICAgIGRldGFpbFxuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIHJhbmRvbUNob2ljZTxUPihzcmM6IFRbXSk6IFQge1xuICAgIHJldHVybiBzcmNbcmFuZG9tSW50KHNyYy5sZW5ndGgpXTtcbiAgfVxuXG4gIHN0YXRpYyBhcnJheUNsb25lU2h1ZmZsZTxUPihzcmM6IFRbXSk6IFRbXSB7XG4gICAgY29uc3QgYXJyID0gc3JjLnNsaWNlKCk7XG5cbiAgICBsZXQgbSA9IGFyci5sZW5ndGg7XG5cbiAgICB3aGlsZSAobSkge1xuICAgICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG0tLSk7XG4gICAgICBbYXJyW21dLCBhcnJbaV1dID0gW2FycltpXSwgYXJyW21dXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBWQUxJREFURV9RVUVVRV9DQVAgPSAoXG5xdWV1ZTogR3VpbGRRdWV1ZSxcbml0ZW1zOiBQbGF5bGlzdCB8IFRyYWNrIHwgVHJhY2tbXSB8IG51bWJlcikgPT5cbntcbiAgaWYgKHF1ZXVlLm1heFNpemUgPCAxIHx8IHF1ZXVlLm1heFNpemUgPT09IEluZmluaXR5KSByZXR1cm47XG5cbiAgY29uc3QgdHJhY2tzID1cbiAgdHlwZW9mIGl0ZW1zID09PSAnbnVtYmVyJyA/XG4gIGl0ZW1zIDpcbiAgKGl0ZW1zIGluc3RhbmNlb2YgUGxheWxpc3QgP1xuICBpdGVtcy50cmFja3MgOlxuICBBcnJheS5pc0FycmF5KGl0ZW1zKSA/XG4gIGl0ZW1zIDpcbiAgW2l0ZW1zXSkuXG4gIGxlbmd0aDtcblxuICBjb25zdCBtYXhDYXAgPSBxdWV1ZS5nZXRDYXBhY2l0eSgpO1xuXG4gIGlmIChtYXhDYXAgPCB0cmFja3MpIHtcbiAgICB0aHJvdyBuZXcgT3V0T2ZTcGFjZUVycm9yKCd0cmFja3MgcXVldWUnLCBtYXhDYXAsIHRyYWNrcyk7XG4gIH1cbn07XG5cbmV4cG9ydCB7IFV0aWwgfTsiLCAiaW1wb3J0IHtcbiAgVXNlcixcbiAgZXNjYXBlTWFya2Rvd24sXG4gIFNub3dmbGFrZVV0aWwsXG4gIEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSxcbiAgQVBJVXNlciB9IGZyb21cbidkaXNjb3JkLmpzJztcbmltcG9ydCB7XG4gIFBsYXllcixcbiAgUGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0LFxuICBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zIH0gZnJvbVxuJy4uL1BsYXllcic7XG5pbXBvcnQgeyBQbGF5bGlzdCwgUGxheWxpc3RKU09OIH0gZnJvbSAnLi9QbGF5bGlzdCc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi4vcXVldWUvR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IENvbGxlY3Rpb24gfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBTZXJpYWxpemVkVHlwZSwgdHJ5SW50b1RodW1ibmFpbFN0cmluZyB9IGZyb20gJy4uL3V0aWxzL3NlcmRlJztcbmltcG9ydCB7IEludmFsaWRBcmdUeXBlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5pbXBvcnQgeyBBdWRpb1Jlc291cmNlIH0gZnJvbSAnZGlzY29yZC12b2lwJztcbmltcG9ydCB7IFNlZWtFdmVudCB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuXG5leHBvcnQgdHlwZSBUcmFja1Jlc29sdmFibGUgPSBUcmFjayB8IHN0cmluZyB8IG51bWJlcjtcblxuZXhwb3J0IHR5cGUgV2l0aE1ldGFkYXRhPFQgZXh0ZW5kcyBvYmplY3QsIE0+ID0gVCAmIHtcbiAgbWV0YWRhdGE6IE07XG4gIHJlcXVlc3RNZXRhZGF0YSgpOiBQcm9taXNlPE0+O1xufTtcblxuZXhwb3J0IHR5cGUgU2VyaWFsaXplZFRyYWNrID0gUmV0dXJuVHlwZTxUcmFja1snc2VyaWFsaXplJ10+O1xuXG4vKipcbiAqIFRoZSB0cmFjayBzb3VyY2U6XG4gKiAtIHNvdW5kY2xvdWRcbiAqIC0geW91dHViZVxuICogLSBzcG90aWZ5XG4gKiAtIGFwcGxlX211c2ljXG4gKiAtIGFyYml0cmFyeVxuICovXG5leHBvcnQgdHlwZSBUcmFja1NvdXJjZSA9XG4nc291bmRjbG91ZCcgfFxuJ3lvdXR1YmUnIHxcbidzcG90aWZ5JyB8XG4nYXBwbGVfbXVzaWMnIHxcbidhcmJpdHJhcnknO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJhd1RyYWNrRGF0YSB7XG4gIC8qKlxuICAgKiBUaGUgdGl0bGVcbiAgICovXG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb25cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYXV0aG9yXG4gICAqL1xuICBhdXRob3I6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB1cmxcbiAgICovXG4gIHVybDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRodW1ibmFpbFxuICAgKi9cbiAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb25cbiAgICovXG4gIGR1cmF0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gaW4gbXNcbiAgICovXG4gIHZpZXdzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgdXNlciB3aG8gcmVxdWVzdGVkIHRoaXMgdHJhY2tcbiAgICovXG4gIHJlcXVlc3RlZEJ5PzogVXNlciB8IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3RcbiAgICovXG4gIHBsYXlsaXN0PzogUGxheWxpc3Q7XG4gIC8qKlxuICAgKiBUaGUgc291cmNlXG4gICAqL1xuICBzb3VyY2U/OiBUcmFja1NvdXJjZTtcbiAgLyoqXG4gICAqIFRoZSBlbmdpbmVcbiAgICovXG4gIGVuZ2luZT86IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIC8qKlxuICAgKiBJZiB0aGlzIHRyYWNrIGlzIGxpdmVcbiAgICovXG4gIGxpdmU/OiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIHJhdyBkYXRhXG4gICAqL1xuICByYXc/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAvKipcbiAgICogVGhlIHF1ZXJ5IHR5cGVcbiAgICovXG4gIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZTtcbiAgLyoqXG4gICAqIFRoZSBzZXJpYWxpemVkIHRpdGxlXG4gICAqL1xuICBjbGVhblRpdGxlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYWNrSlNPTiB7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgaWRcbiAgICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgdGl0bGVcbiAgICovXG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgZGVzY3JpcHRpb25cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgYXV0aG9yXG4gICAqL1xuICBhdXRob3I6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0cmFjayB1cmxcbiAgICovXG4gIHVybDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRyYWNrIHRodW1ibmFpbFxuICAgKi9cbiAgdGh1bWJuYWlsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgZHVyYXRpb25cbiAgICovXG4gIGR1cmF0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgZHVyYXRpb24gaW4gbXNcbiAgICovXG4gIGR1cmF0aW9uTVM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSB0cmFjayB2aWV3c1xuICAgKi9cbiAgdmlld3M6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSB1c2VyIGlkIHdobyByZXF1ZXN0ZWQgdGhpcyB0cmFja1xuICAgKi9cbiAgcmVxdWVzdGVkQnk6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCBpbmZvIChpZiBhbnkpXG4gICAqL1xuICBwbGF5bGlzdD86IFBsYXlsaXN0SlNPTjtcbn1cblxuZXhwb3J0IGNsYXNzIFRyYWNrPFQgPSB1bmtub3duPiB7XG4gIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcHVibGljIGF1dGhvcjogc3RyaW5nO1xuICBwdWJsaWMgdXJsOiBzdHJpbmc7XG4gIHB1YmxpYyB0aHVtYm5haWw6IHN0cmluZztcbiAgcHVibGljIGR1cmF0aW9uOiBzdHJpbmc7XG4gIHB1YmxpYyB2aWV3czogbnVtYmVyO1xuICBwdWJsaWMgcmVxdWVzdGVkQnk6IFVzZXIgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIHBsYXlsaXN0PzogUGxheWxpc3Q7XG4gIHB1YmxpYyBxdWVyeVR5cGU6IFNlYXJjaFF1ZXJ5VHlwZSB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwdWJsaWMgcmF3OiBhbnk7XG4gIHB1YmxpYyBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gIHByaXZhdGUgX19tZXRhZGF0YTogVCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9fcmVxTWV0YWRhdGFGbjogKCkgPT4gUHJvbWlzZTxUIHwgbnVsbD47XG4gIHB1YmxpYyBjbGVhblRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyBsaXZlOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBicmlkZ2VkRXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBicmlkZ2VkVHJhY2s6IFRyYWNrIHwgbnVsbCA9IG51bGw7XG5cbiAgI29uU2VlazogKChldmVudDogU2Vla0V2ZW50KSA9PiBBd2FpdGVkPHZvaWQ+KSB8IG51bGwgPSBudWxsO1xuICAjcmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFRyYWNrIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSBwbGF5ZXIgVGhlIHBsYXllciB0aGF0IGluc3RhbnRpYXRlZCB0aGlzIFRyYWNrXG4gICAqIEBwYXJhbSBkYXRhIFRyYWNrIGRhdGFcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgcHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyLFxuICBkYXRhOiBQYXJ0aWFsPFdpdGhNZXRhZGF0YTxSYXdUcmFja0RhdGEsIFQ+PilcbiAge1xuICAgIHRoaXMudGl0bGUgPSBlc2NhcGVNYXJrZG93bihkYXRhLnRpdGxlID8/ICcnKTtcbiAgICB0aGlzLmF1dGhvciA9IGRhdGEuYXV0aG9yID8/ICcnO1xuICAgIHRoaXMudXJsID0gZGF0YS51cmwgPz8gJyc7XG4gICAgdGhpcy50aHVtYm5haWwgPSBkYXRhLnRodW1ibmFpbCA/PyAnJztcbiAgICB0aGlzLmR1cmF0aW9uID0gZGF0YS5kdXJhdGlvbiA/PyAnJztcbiAgICB0aGlzLnZpZXdzID0gZGF0YS52aWV3cyA/PyAwO1xuICAgIHRoaXMucXVlcnlUeXBlID0gZGF0YS5xdWVyeVR5cGU7XG4gICAgdGhpcy5yZXF1ZXN0ZWRCeSA9IGRhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgICB0aGlzLnBsYXlsaXN0ID0gZGF0YS5wbGF5bGlzdDtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gYCR7dGhpcy50aXRsZX0gYnkgJHt0aGlzLmF1dGhvcn1gO1xuICAgIHRoaXMucmF3ID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHt9LFxuICAgICAgeyBzb3VyY2U6IGRhdGEucmF3Py5zb3VyY2UgPz8gZGF0YS5zb3VyY2UgfSxcbiAgICAgIGRhdGEucmF3ID8/IGRhdGFcbiAgICApO1xuICAgIHRoaXMuX19tZXRhZGF0YSA9IGRhdGEubWV0YWRhdGEgPz8gbnVsbDtcbiAgICB0aGlzLl9fcmVxTWV0YWRhdGFGbiA9XG4gICAgZGF0YS5yZXF1ZXN0TWV0YWRhdGEgfHwgKCgpID0+IFByb21pc2UucmVzb2x2ZTxUIHwgbnVsbD4obnVsbCkpO1xuICAgIHRoaXMuY2xlYW5UaXRsZSA9XG4gICAgZGF0YS5jbGVhblRpdGxlID8/IFV0aWwuY2xlYW5UaXRsZSh0aGlzLnRpdGxlLCB0aGlzLnNvdXJjZSk7XG4gICAgdGhpcy5saXZlID0gZGF0YS5saXZlID8/IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyB0cmFjayBjYW4gYmUgc2Vla2VkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNlZWthYmxlKCkge1xuICAgIHJldHVybiB0aGlzLiNvblNlZWsgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBvblNlZWsgZXZlbnRcbiAgICogQHBhcmFtIGZuIFRoZSBvblNlZWsgZXZlbnRcbiAgICovXG4gIHB1YmxpYyBoYW5kbGVTZWVrKGZuOiAoZXZlbnQ6IFNlZWtFdmVudCkgPT4gQXdhaXRlZDx2b2lkPikge1xuICAgIHRoaXMuI29uU2VlayA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3Qgc2Vla1xuICAgKiBAcGFyYW0gZXZlbnQgVGhlIHNlZWsgZXZlbnRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZWVrKGV2ZW50OiBTZWVrRXZlbnQpIHtcbiAgICBpZiAodGhpcy4jb25TZWVrKSByZXR1cm4gdGhpcy4jb25TZWVrKGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGF1ZGlvIHJlc291cmNlIGZvciB0aGlzIHRyYWNrLiBUaGlzIGlzIG5vdCB1c2VmdWwgb3V0c2lkZSBvZiB0aGUgbGlicmFyeS5cbiAgICogQHBhcmFtIHJlc291cmNlIEF1ZGlvIHJlc291cmNlXG4gICAqL1xuICBwdWJsaWMgc2V0UmVzb3VyY2UocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+IHwgbnVsbCkge1xuICAgIHRoaXMuI3Jlc291cmNlID0gcmVzb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhdWRpbyByZXNvdXJjZSBmb3IgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIGdldCByZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jcmVzb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHRyYWNrIGhhcyBhbiBhdWRpbyByZXNvdXJjZVxuICAgKi9cbiAgcHVibGljIGdldCBoYXNSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jcmVzb3VyY2UgIT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IG1ldGFkYXRhIGZvciB0aGlzIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVxdWVzdE1ldGFkYXRhKCkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuX19yZXFNZXRhZGF0YUZuKCk7XG5cbiAgICB0aGlzLnNldE1ldGFkYXRhKHJlcyk7XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBtZXRhZGF0YSBmb3IgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIHNldE1ldGFkYXRhKG06IFQgfCBudWxsKSB7XG4gICAgdGhpcy5fX21ldGFkYXRhID0gbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRhZGF0YSBvZiB0aGlzIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1ldGFkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLl9fbWV0YWRhdGE7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhpcyB0cmFjayBoYXMgbWV0YWRhdGFcbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzTWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0YWRhdGEgIT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcXVldWUgaW4gd2hpY2ggdGhpcyB0cmFjayBpcyBsb2NhdGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXVlKCk6IEd1aWxkUXVldWUge1xuICAgIHJldHVybiB0aGlzLnBsYXllci5ub2Rlcy5jYWNoZS5maW5kKChxKSA9PlxuICAgIHEudHJhY2tzLnNvbWUoKGFiKSA9PiBhYi5pZCA9PT0gdGhpcy5pZClcbiAgICApITtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdHJhY2sgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRcbiAgICovXG4gIHB1YmxpYyBnZXQgZHVyYXRpb25NUygpOiBudW1iZXIge1xuICAgIGNvbnN0IHRpbWVzID0gKG46IG51bWJlciwgdDogbnVtYmVyKSA9PiB7XG4gICAgICBsZXQgdG4gPSAxO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0OyBpKyspIHRuICo9IG47XG4gICAgICByZXR1cm4gdCA8PSAwID8gMTAwMCA6IHRuICogMTAwMDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZHVyYXRpb24uXG4gICAgc3BsaXQoJzonKS5cbiAgICByZXZlcnNlKCkuXG4gICAgbWFwKChtLCBpKSA9PiBwYXJzZUludChtKSAqIHRpbWVzKDYwLCBpKSkuXG4gICAgcmVkdWNlKChhLCBjKSA9PiBhICsgYywgMCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzY29yZCBoeXBlcmxpbmsgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIHRvSHlwZXJsaW5rKCk6IHN0cmluZyAvKiBub3QgdXNpbmcgYFske3N0cmluZ31dKCR7c3RyaW5nfSlgIHlldCAqLyB7XG4gICAgcmV0dXJuIGBbJHt0aGlzLnRpdGxlfV0oJHt0aGlzLnVybH0pYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHNvdXJjZSBvZiB0aGlzIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy5yYXc/LnNvdXJjZSA/PyAnYXJiaXRyYXJ5JztcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0cmFja1xuICAgKi9cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMudGl0bGV9IGJ5ICR7dGhpcy5hdXRob3J9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSYXcgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgdG9KU09OKGhpZGVQbGF5bGlzdD86IGJvb2xlYW4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICB0aHVtYm5haWw6IHRoaXMudGh1bWJuYWlsLFxuICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICBkdXJhdGlvbk1TOiB0aGlzLmR1cmF0aW9uTVMsXG4gICAgICB2aWV3czogdGhpcy52aWV3cyxcbiAgICAgIHJlcXVlc3RlZEJ5OiB0aGlzLnJlcXVlc3RlZEJ5Py5pZCB8fCBudWxsLFxuICAgICAgcGxheWxpc3Q6IGhpZGVQbGF5bGlzdCA/IG51bGwgOiB0aGlzLnBsYXlsaXN0Py50b0pTT04oKSA/PyBudWxsXG4gICAgfSBhcyBUcmFja0pTT047XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplZCB0cmFjayBkYXRhIHRoYXQgY2FuIGJlIHJlY29uc3RydWN0ZWRcbiAgICovXG4gIHB1YmxpYyBzZXJpYWxpemUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICBhdXRob3I6IHRoaXMuYXV0aG9yLFxuICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgIHRodW1ibmFpbDogVHlwZVV0aWwuaXNTdHJpbmcodGhpcy50aHVtYm5haWwpID9cbiAgICAgIHRoaXMudGh1bWJuYWlsIDpcbiAgICAgIHRyeUludG9UaHVtYm5haWxTdHJpbmcodGhpcy50aHVtYm5haWwpLFxuICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICB2aWV3czogdGhpcy52aWV3cyA/PyAwLFxuICAgICAgcmVxdWVzdGVkX2J5OiB0aGlzLnJlcXVlc3RlZEJ5Py50b0pTT04oKSA/PyBudWxsLFxuICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgIGxpdmU6IGZhbHNlLFxuICAgICAgcXVlcnlfdHlwZTogdGhpcy5xdWVyeVR5cGUsXG4gICAgICBleHRyYWN0b3I6IHRoaXMuZXh0cmFjdG9yPy5pZGVudGlmaWVyID8/IG51bGwsXG4gICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YSxcbiAgICAgICR0eXBlOiBTZXJpYWxpemVkVHlwZS5UcmFjayxcbiAgICAgICRlbmNvZGVyX3ZlcnNpb246IHRoaXMucGxheWVyLnZlcnNpb25cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhIHRyYWNrIGZyb20gc2VyaWFsaXplZCBkYXRhXG4gICAqIEBwYXJhbSBwbGF5ZXIgUGxheWVyIGluc3RhbmNlXG4gICAqIEBwYXJhbSBkYXRhIFNlcmlhbGl6ZWQgZGF0YVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tU2VyaWFsaXplZChcbiAgcGxheWVyOiBQbGF5ZXIsXG4gIGRhdGE6IFJldHVyblR5cGU8VHJhY2tbJ3NlcmlhbGl6ZSddPilcbiAge1xuICAgIGlmIChkYXRhLiR0eXBlICE9PSBTZXJpYWxpemVkVHlwZS5UcmFjaylcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICdkYXRhJyxcbiAgICAgICdTZXJpYWxpemVkVHJhY2snLFxuICAgICAgJ21hbGZvcm1lZCBkYXRhJ1xuICAgICk7XG4gICAgY29uc3QgdHJhY2sgPSBuZXcgVHJhY2socGxheWVyLCB7XG4gICAgICAuLi5kYXRhLFxuICAgICAgcmVxdWVzdGVkQnk6IGRhdGEucmVxdWVzdGVkX2J5ID9cbiAgICAgICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGRhdGEucmVxdWVzdGVkX2J5IGFzIEFQSVVzZXI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBwbGF5ZXIuY2xpZW50LnVzZXJzLnJlc29sdmUocmVzLmlkKTtcbiAgICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZDtcbiAgICAgICAgICBpZiAocGxheWVyLmNsaWVudC51c2Vycy5jYWNoZS5oYXMocmVzLmlkKSlcbiAgICAgICAgICByZXR1cm4gcGxheWVyLmNsaWVudC51c2Vycy5jYWNoZS5nZXQocmVzLmlkKSE7XG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgIGNvbnN0IHVzZXIgPSBuZXcgVXNlcihwbGF5ZXIuY2xpZW50LCByZXMpO1xuICAgICAgICAgIHJldHVybiB1c2VyO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSkoKSA6XG4gICAgICBudWxsLFxuICAgICAgcXVlcnlUeXBlOiBkYXRhLnF1ZXJ5X3R5cGUgPz8gdW5kZWZpbmVkXG4gICAgfSk7XG5cbiAgICB0cmFjay5zZXRNZXRhZGF0YShkYXRhLm1ldGFkYXRhKTtcblxuICAgIHJldHVybiB0cmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYmVsb25naW5nIHF1ZXVlcyBvZiB0aGlzIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0QmVsb25naW5nUXVldWVzKCkge1xuICAgIGNvbnN0IG5vZGVzID0gdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuZmlsdGVyKChub2RlKSA9PlxuICAgIG5vZGUudHJhY2tzLnNvbWUoKHQpID0+IHQuaWQgPT09IHRoaXMuaWQpXG4gICAgKTtcblxuICAgIHJldHVybiBub2RlcyBhcyBDb2xsZWN0aW9uPHN0cmluZywgR3VpbGRRdWV1ZTx1bmtub3duPj47XG4gIH1cblxuICAvKipcbiAgICogUGxheSB0aGlzIHRyYWNrIHRvIHRoZSBnaXZlbiB2b2ljZSBjaGFubmVsLiBJZiBxdWV1ZSBleGlzdHMgYW5kIGFub3RoZXIgdHJhY2sgaXMgYmVpbmcgcGxheWVkLCB0aGlzIHRyYWNrIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHF1ZXVlLlxuICAgKiBAcGFyYW0gY2hhbm5lbCBWb2ljZSBjaGFubmVsIG9uIHdoaWNoIHRoaXMgdHJhY2sgc2hhbGwgYmUgcGxheWVkXG4gICAqIEBwYXJhbSBvcHRpb25zIE5vZGUgaW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHBsYXk8VCA9IHVua25vd24+KFxuICBjaGFubmVsOiBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gIG9wdGlvbnM/OiBQbGF5ZXJOb2RlSW5pdGlhbGl6ZXJPcHRpb25zPFQ+KVxuICA6IFByb21pc2U8UGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgY29uc3QgZm4gPSB0aGlzLnBsYXllci5wbGF5LmJpbmQodGhpcy5wbGF5ZXIpO1xuXG4gICAgcmV0dXJuIGF3YWl0IGZuKGNoYW5uZWwsIHRoaXMsIG9wdGlvbnMpO1xuICB9XG59IiwgImV4cG9ydCBjbGFzcyBEaXNjb3JkUGxheWVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSBjb2RlOiBFcnJvckNvZGVzO1xuICBwdWJsaWMgcmVhZG9ubHkgdGltZXN0YW1wOiBudW1iZXIgPSBEYXRlLm5vdygpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb2RlOiBFcnJvckNvZGVzLCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcblxuICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgdGltZXN0YW1wOiB0aGlzLnRpbWVzdGFtcFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE91dE9mU3BhY2VFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHRhcmdldDogc3RyaW5nLCBjYXBhY2l0eTogbnVtYmVyLCB0b3RhbDogbnVtYmVyKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9PVVRfT0ZfU1BBQ0UsXG4gICAgICBgTWF4IGNhcGFjaXR5IHJlYWNoZWQgZm9yICR7dGFyZ2V0fSAoQ2FwYWNpdHkgJHtjYXBhY2l0eX0vVG90YWwgJHt0b3RhbH0pYFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRBcmdUeXBlRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZywgZXhwZWN0YXRpb246IHN0cmluZywgZm91bmQ6IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfSU5WQUxJRF9BUkdfVFlQRSxcbiAgICAgIGBFeHBlY3RlZCAke3RhcmdldH0gdG8gYmUgXCIke2V4cGVjdGF0aW9ufVwiLCByZWNlaXZlZCBcIiR7Zm91bmR9XCJgXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9SZXN1bHRFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX05PX1JFU1VMVCwgbWVzc2FnZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vdEltcGxlbWVudGVkRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZykge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX05PVF9JTVBMRU1FTlRFRCwgYCR7dGFyZ2V0fSBpcyBub3QgeWV0IGltcGxlbWVudGVkYCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vdEV4aXN0aW5nRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZykge1xuICAgIHN1cGVyKEVycm9yQ29kZXMuRVJSX05PVF9FWElTVElORywgYCR7dGFyZ2V0fSBkb2VzIG5vdCBleGlzdGApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPdXRPZlJhbmdlRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZywgdmFsdWU6IHN0cmluZywgbWluaW11bTogc3RyaW5nLCBtYXhpbXVtOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX09VVF9PRl9SQU5HRSxcbiAgICAgIGAke3RhcmdldH0gaXMgb3V0IG9mIHJhbmdlIChFeHBlY3RlZCBtaW5pbXVtICR7bWluaW11bX0gYW5kIG1heGltdW0gJHttYXhpbXVtfSwgZ290ICR7dmFsdWV9KWBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb1ZvaWNlQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfTk9fVk9JQ0VfQ09OTkVDVElPTixcbiAgICAgIG1lc3NhZ2UgfHxcbiAgICAgICdObyB2b2ljZSBjb25uZWN0aW9uIGF2YWlsYWJsZSwgbWF5YmUgY29ubmVjdCB0byBhIHZvaWNlIGNoYW5uZWwgZmlyc3Q/J1xuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFZvaWNlQ29ubmVjdGlvbkRlc3Ryb3llZEVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9WT0lDRV9DT05ORUNUSU9OX0RFU1RST1lFRCxcbiAgICAgICdDYW5ub3QgdXNlIGRlc3Ryb3llZCB2b2ljZSBjb25uZWN0aW9uJ1xuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vVm9pY2VDaGFubmVsRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9OT19WT0lDRV9DSEFOTkVMLCAnQ291bGQgbm90IGdldCB0aGUgdm9pY2UgY2hhbm5lbCcpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkVm9pY2VDaGFubmVsRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9JTlZBTElEX1ZPSUNFX0NIQU5ORUwsICdFeHBlY3RlZCBhIHZvaWNlIGNoYW5uZWwnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9SZWNlaXZlckVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfTk9fUkVDRUlWRVIsXG4gICAgICBtZXNzYWdlIHx8XG4gICAgICAnTm8gdm9pY2UgcmVjZWl2ZXIgaXMgYXZhaWxhYmxlLCBtYXliZSBjb25uZWN0IHRvIGEgdm9pY2UgY2hhbm5lbCBmaXJzdD8nXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRkZtcGVnRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9GRk1QRUdfTE9DQVRPUiwgbWVzc2FnZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vQXVkaW9SZXNvdXJjZUVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfTk9fQVVESU9fUkVTT1VSQ0UsXG4gICAgICBtZXNzYWdlIHx8ICdFeHBlY3RlZCBhbiBhdWRpbyByZXNvdXJjZSdcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb0d1aWxkUXVldWVFcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihFcnJvckNvZGVzLkVSUl9OT19HVUlMRF9RVUVVRSwgbWVzc2FnZSB8fCAnRXhwZWN0ZWQgYSBndWlsZCBxdWV1ZScpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBOb0d1aWxkRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoRXJyb3JDb2Rlcy5FUlJfTk9fR1VJTEQsIG1lc3NhZ2UgfHwgJ0V4cGVjdGVkIGEgZ3VpbGQnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW5mb1JlcXVpcmVkRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZywgYWN0dWFsOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX0lORk9fUkVRVUlSRUQsXG4gICAgICBgRXhwZWN0ZWQgJHt0YXJnZXR9LCBmb3VuZCBcIiR7YWN0dWFsfVwiYFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlcmlhbGl6YXRpb25FcnJvciBleHRlbmRzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfU0VSSUFMSVpBVElPTl9GQUlMRUQsXG4gICAgICBcIkRvbid0IGtub3cgaG93IHRvIHNlcmlhbGl6ZSB0aGlzIGRhdGFcIlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlc2VyaWFsaXphdGlvbkVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXG4gICAgICBFcnJvckNvZGVzLkVSUl9ERVNFUklBTElaQVRJT05fRkFJTEVELFxuICAgICAgXCJEb24ndCBrbm93IGhvdyB0byBkZXNlcmlhbGl6ZSB0aGlzIGRhdGFcIlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIElsbGVnYWxIb29rSW52b2NhdGlvbkVycm9yIGV4dGVuZHMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBzdHJpbmcsIG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIEVycm9yQ29kZXMuRVJSX0lMTEVHQUxfSE9PS19JTlZPQ0FUSU9OLFxuICAgICAgYElsbGVnYWwgaW52b2NhdGlvbiBvZiAke3RhcmdldH0gaG9vay4ke21lc3NhZ2UgPyBgICR7bWVzc2FnZX1gIDogJyd9YFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1vZHVsZU5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IHN0cmluZywgZGVzY3JpcHRpb24gPSAnJykge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfTk9UX0VYSVNUSU5HX01PRFVMRSxcbiAgICAgIGAke3RhcmdldH0gbW9kdWxlIGRvZXMgbm90IGV4aXN0LiBJbnN0YWxsIGl0IHdpdGggXFxgbnBtIGluc3RhbGwgJHt0YXJnZXR9XFxgLiR7XG4gICAgICBkZXNjcmlwdGlvbiA/ICcgJyArIGRlc2NyaXB0aW9uIDogJyd9YFxuXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQnJpZGdlRmFpbGVkRXJyb3IgZXh0ZW5kcyBEaXNjb3JkUGxheWVyRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nIHwgbnVsbCwgZXJyb3I6IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgRXJyb3JDb2Rlcy5FUlJfQlJJREdFX0ZBSUxFRCxcbiAgICAgIGAke1xuICAgICAgaWQgPyBgKEV4dHJhY3RvciBFeGVjdXRpb24gQ29udGV4dCBJRCBpcyAke2lkfSlgIDogJyd9RmFpbGVkIHRvIGJyaWRnZSB0aGlzIHF1ZXJ5OlxcbiR7XG4gICAgICBlcnJvcn1gXG4gICAgKTtcbiAgfVxufVxuXG4vLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbmV4cG9ydCBjb25zdCBFcnJvckNvZGVzID0ge1xuICBFUlJfT1VUX09GX1NQQUNFOiAnRVJSX09VVF9PRl9TUEFDRScsXG4gIEVSUl9JTlZBTElEX0FSR19UWVBFOiAnRVJSX0lOVkFMSURfQVJHX1RZUEUnLFxuICBFUlJfTk9fUkVTVUxUOiAnRVJSX05PX1JFU1VMVCcsXG4gIEVSUl9OT1RfSU1QTEVNRU5URUQ6ICdFUlJfTk9UX0lNUExFTUVOVEVEJyxcbiAgRVJSX05PVF9FWElTVElORzogJ0VSUl9OT1RfRVhJU1RJTkcnLFxuICBFUlJfT1VUX09GX1JBTkdFOiAnRVJSX09VVF9PRl9SQU5HRScsXG4gIEVSUl9OT19WT0lDRV9DT05ORUNUSU9OOiAnRVJSX05PX1ZPSUNFX0NPTk5FQ1RJT04nLFxuICBFUlJfVk9JQ0VfQ09OTkVDVElPTl9ERVNUUk9ZRUQ6ICdFUlJfVk9JQ0VfQ09OTkVDVElPTl9ERVNUUk9ZRUQnLFxuICBFUlJfTk9fVk9JQ0VfQ0hBTk5FTDogJ0VSUl9OT19WT0lDRV9DSEFOTkVMJyxcbiAgRVJSX0lOVkFMSURfVk9JQ0VfQ0hBTk5FTDogJ0VSUl9JTlZBTElEX1ZPSUNFX0NIQU5ORUwnLFxuICBFUlJfTk9fUkVDRUlWRVI6ICdFUlJfTk9fUkVDRUlWRVInLFxuICBFUlJfRkZNUEVHX0xPQ0FUT1I6ICdFUlJfRkZNUEVHX0xPQ0FUT1InLFxuICBFUlJfTk9fQVVESU9fUkVTT1VSQ0U6ICdFUlJfTk9fQVVESU9fUkVTT1VSQ0UnLFxuICBFUlJfTk9fR1VJTERfUVVFVUU6ICdFUlJfTk9fR1VJTERfUVVFVUUnLFxuICBFUlJfTk9fR1VJTEQ6ICdFUlJfTk9fR1VJTEQnLFxuICBFUlJfSU5GT19SRVFVSVJFRDogJ0VSUl9JTkZPX1JFUVVJUkVEJyxcbiAgRVJSX1NFUklBTElaQVRJT05fRkFJTEVEOiAnRVJSX1NFUklBTElaQVRJT05fRkFJTEVEJyxcbiAgRVJSX0RFU0VSSUFMSVpBVElPTl9GQUlMRUQ6ICdFUlJfREVTRVJJQUxJWkFUSU9OX0ZBSUxFRCcsXG4gIEVSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTjogJ0VSUl9JTExFR0FMX0hPT0tfSU5WT0NBVElPTicsXG4gIEVSUl9OT1RfRVhJU1RJTkdfTU9EVUxFOiAnRVJSX05PVF9FWElTVElOR19NT0RVTEUnLFxuICBFUlJfQlJJREdFX0ZBSUxFRDogJ0VSUl9CUklER0VfRkFJTEVEJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRXJyb3JDb2RlcyA9ICh0eXBlb2YgRXJyb3JDb2Rlcylba2V5b2YgdHlwZW9mIEVycm9yQ29kZXNdO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Rpc2NvcmRQbGF5ZXJFcnJvcihlcnJvcjogYW55KTogZXJyb3IgaXMgRGlzY29yZFBsYXllckVycm9yIHtcbiAgcmV0dXJuIGVycm9yICE9IG51bGwgJiYgZXJyb3IgaW5zdGFuY2VvZiBEaXNjb3JkUGxheWVyRXJyb3I7XG59XG5cbi8qKlxuICogSGFuZGxlIGEgYERpc2NvcmRQbGF5ZXJFcnJvcmAgZXJyb3IuXG4gKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yIHRvIGhhbmRsZVxuICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gd2lsbCBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgZXJyb3IgaXMgYSBgRGlzY29yZFBsYXllckVycm9yYC5cbiAqIEBwYXJhbSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgaGFuZGxlclxuICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgaGFuZGxlclxuICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICogdHJ5IHtcbiAqICAgLy8gLi4uXG4gKiB9IGNhdGNoIChlcnJvcikge1xuICogIGhhbmRsZURpc2NvcmRQbGF5ZXJFcnJvcihlcnJvciwgKGVycm9yKSA9PiB7XG4gKiAgICBjb25zb2xlLmVycm9yKGBBbiBlcnJvciBvY2N1cnJlZCBmcm9tIGRpc2NvcmQtcGxheWVyOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gKiAgfSk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZURpc2NvcmRQbGF5ZXJFcnJvcjxcbiAgVCBleHRlbmRzIGFueVtdLFxuICBGIGV4dGVuZHMgKGVycm9yOiBEaXNjb3JkUGxheWVyRXJyb3IsIC4uLmFyZ3M6IFQpID0+IGFueSxcbiAgUiBleHRlbmRzIFJldHVyblR5cGU8Rj4+KFxuZXJyb3I6IGFueSwgaGFuZGxlcjogRiwgYXJnczogVCk6IFIge1xuICBpZiAoaXNEaXNjb3JkUGxheWVyRXJyb3IoZXJyb3IpKSB7XG4gICAgcmV0dXJuIGhhbmRsZXIoZXJyb3IsIC4uLmFyZ3MpIGFzIFI7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkIGFzIFI7XG59XG5cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqLyIsICJpbXBvcnQgeyBEaXNjb3JkUGxheWVyRXJyb3IsIGlzRGlzY29yZFBsYXllckVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGNsYXNzIFR5cGVVdGlsIHtcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICByZXR1cm4gVHlwZVV0aWw7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICBwdWJsaWMgc3RhdGljIGlzRnVuY3Rpb24odDogdW5rbm93bik6IHQgaXMgRnVuY3Rpb24ge1xuICAgIHJldHVybiB0eXBlb2YgdCA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNOdW1iZXIodDogdW5rbm93bik6IHQgaXMgbnVtYmVyIHtcbiAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdudW1iZXInICYmICFpc05hTih0KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNTdHJpbmcodDogdW5rbm93bik6IHQgaXMgc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZW9mIHQgPT09ICdzdHJpbmcnO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0Jvb2xlYW4odDogdW5rbm93bik6IHQgaXMgYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiB0ID09PSAnYm9vbGVhbic7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzTnVsbGlzaCh0OiB1bmtub3duKTogdCBpcyBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdCA9PSBudWxsO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBpc0FycmF5KHQ6IHVua25vd24pOiB0IGlzIHVua25vd25bXSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzRXJyb3IodDogdW5rbm93bik6IHQgaXMgRXJyb3Ige1xuICAgIHJldHVybiB0IGluc3RhbmNlb2YgRXJyb3I7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzRGlzY29yZFBsYXllckVycm9yKHQ6IHVua25vd24pOiB0IGlzIERpc2NvcmRQbGF5ZXJFcnJvciB7XG4gICAgcmV0dXJuIGlzRGlzY29yZFBsYXllckVycm9yKHQpO1xuICB9XG59IiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cblxuaW1wb3J0IHsgRGVzZXJpYWxpemF0aW9uRXJyb3IsIFNlcmlhbGl6YXRpb25FcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQge1xuICBQbGF5bGlzdCxcbiAgdHlwZSBTZXJpYWxpemVkVHJhY2ssXG4gIFRyYWNrLFxuICBTZXJpYWxpemVkUGxheWxpc3QgfSBmcm9tXG4nLi4vZmFicmljJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi9UeXBlVXRpbCc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcblxuZXhwb3J0IGVudW0gU2VyaWFsaXplZFR5cGUge1xuICBUcmFjayA9ICd0cmFjaycsXG4gIFBsYXlsaXN0ID0gJ3BsYXlsaXN0Jyxcbn1cblxuZXhwb3J0IHR5cGUgRW5jb2RhYmxlID0gU2VyaWFsaXplZFRyYWNrIHwgU2VyaWFsaXplZFBsYXlsaXN0O1xuXG5jb25zdCBpc1RyYWNrID0gKGRhdGE6IGFueSk6IGRhdGEgaXMgU2VyaWFsaXplZFRyYWNrID0+XG5kYXRhLiR0eXBlID09PSBTZXJpYWxpemVkVHlwZS5UcmFjaztcbmNvbnN0IGlzUGxheWxpc3QgPSAoZGF0YTogYW55KTogZGF0YSBpcyBTZXJpYWxpemVkUGxheWxpc3QgPT5cbmRhdGEuJHR5cGUgPT09IFNlcmlhbGl6ZWRUeXBlLlBsYXlsaXN0O1xuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplKGRhdGE6IFRyYWNrIHwgUGxheWxpc3QgfCBhbnkpIHtcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBUcmFjaykgcmV0dXJuIGRhdGEuc2VyaWFsaXplKCk7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgUGxheWxpc3QpIHJldHVybiBkYXRhLnNlcmlhbGl6ZSgpO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGRhdGEudG9KU09OKCk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemUocGxheWVyOiBQbGF5ZXIsIGRhdGE6IEVuY29kYWJsZSkge1xuICBpZiAoaXNUcmFjayhkYXRhKSkgcmV0dXJuIFRyYWNrLmZyb21TZXJpYWxpemVkKHBsYXllciwgZGF0YSk7XG4gIGlmIChpc1BsYXlsaXN0KGRhdGEpKSByZXR1cm4gUGxheWxpc3QuZnJvbVNlcmlhbGl6ZWQocGxheWVyLCBkYXRhKTtcblxuICB0aHJvdyBuZXcgRGVzZXJpYWxpemF0aW9uRXJyb3IoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZShkYXRhOiBFbmNvZGFibGUpIHtcbiAgY29uc3Qgc3RyID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG5cbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKHN0cikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlKGRhdGE6IHN0cmluZykge1xuICBjb25zdCBzdHIgPSBCdWZmZXIuZnJvbShkYXRhLCAnYmFzZTY0JykudG9TdHJpbmcoKTtcblxuICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJ5SW50b1RodW1ibmFpbFN0cmluZyhkYXRhOiBhbnkpIHtcbiAgaWYgKCFkYXRhKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICBpZiAoVHlwZVV0aWwuaXNTdHJpbmcoZGF0YSkpIHJldHVybiBkYXRhO1xuICAgIHJldHVybiBkYXRhPy51cmwgPz8gZGF0YT8udGh1bWJuYWlsPy51cmwgPz8gbnVsbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn0iLCAiaW1wb3J0IHtcbiAgUGxheWVyLFxuICBQbGF5ZXJOb2RlSW5pdGlhbGl6YXRpb25SZXN1bHQsXG4gIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnMgfSBmcm9tXG4nLi4vUGxheWVyJztcbmltcG9ydCB7IFRyYWNrLCBUcmFja0pTT04sIFRyYWNrU291cmNlIH0gZnJvbSAnLi9UcmFjayc7XG5pbXBvcnQgeyBVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVXRpbCc7XG5pbXBvcnQgeyBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUgfSBmcm9tICdkaXNjb3JkLmpzJztcbmltcG9ydCB7IFNlcmlhbGl6ZWRUeXBlLCB0cnlJbnRvVGh1bWJuYWlsU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvc2VyZGUnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBJbnZhbGlkQXJnVHlwZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IHR5cGUgU2VyaWFsaXplZFBsYXlsaXN0ID0gUmV0dXJuVHlwZTxQbGF5bGlzdFsnc2VyaWFsaXplJ10+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlsaXN0SW5pdERhdGEge1xuICAvKipcbiAgICogVGhlIHRyYWNrcyBvZiB0aGlzIHBsYXlsaXN0XG4gICAqL1xuICB0cmFja3M6IFRyYWNrW107XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgdGl0bGVcbiAgICovXG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb25cbiAgICovXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdGh1bWJuYWlsXG4gICAqL1xuICB0aHVtYm5haWw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCB0eXBlOiBgYWxidW1gIHwgYHBsYXlsaXN0YFxuICAgKi9cbiAgdHlwZTogJ2FsYnVtJyB8ICdwbGF5bGlzdCc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3Qgc291cmNlXG4gICAqL1xuICBzb3VyY2U6IFRyYWNrU291cmNlO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IGF1dGhvclxuICAgKi9cbiAgYXV0aG9yOiB7XG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhvciBuYW1lXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdXRob3IgdXJsXG4gICAgICovXG4gICAgdXJsOiBzdHJpbmc7XG4gIH07XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgaWRcbiAgICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgdXJsXG4gICAqL1xuICB1cmw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSByYXcgcGxheWxpc3QgZGF0YVxuICAgKi9cbiAgcmF3UGxheWxpc3Q/OiBhbnk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlsaXN0SlNPTiB7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgaWRcbiAgICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgdXJsXG4gICAqL1xuICB1cmw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCB0aXRsZVxuICAgKi9cbiAgdGl0bGU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwbGF5bGlzdCBkZXNjcmlwdGlvblxuICAgKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0aHVtYm5haWxcbiAgICovXG4gIHRodW1ibmFpbDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHBsYXlsaXN0IHR5cGU6IGBhbGJ1bWAgfCBgcGxheWxpc3RgXG4gICAqL1xuICB0eXBlOiAnYWxidW0nIHwgJ3BsYXlsaXN0JztcbiAgLyoqXG4gICAqIFRoZSB0cmFjayBzb3VyY2VcbiAgICovXG4gIHNvdXJjZTogVHJhY2tTb3VyY2U7XG4gIC8qKlxuICAgKiBUaGUgcGxheWxpc3QgYXV0aG9yXG4gICAqL1xuICBhdXRob3I6IHtcbiAgICAvKipcbiAgICAgKiBUaGUgYXV0aG9yIG5hbWVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhvciB1cmxcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbiAgfTtcbiAgLyoqXG4gICAqIFRoZSB0cmFja3MgZGF0YSAoaWYgYW55KVxuICAgKi9cbiAgdHJhY2tzOiBUcmFja0pTT05bXTtcbn1cblxuZXhwb3J0IGNsYXNzIFBsYXlsaXN0IHtcbiAgcHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyO1xuICBwdWJsaWMgdHJhY2tzOiBUcmFja1tdO1xuICBwdWJsaWMgdGl0bGU6IHN0cmluZztcbiAgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHB1YmxpYyB0aHVtYm5haWw6IHN0cmluZztcbiAgcHVibGljIHR5cGU6ICdhbGJ1bScgfCAncGxheWxpc3QnO1xuICBwdWJsaWMgc291cmNlOiBUcmFja1NvdXJjZTtcbiAgcHVibGljIGF1dGhvcjoge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB1cmw6IHN0cmluZztcbiAgfTtcbiAgcHVibGljIGlkOiBzdHJpbmc7XG4gIHB1YmxpYyB1cmw6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHJhd1BsYXlsaXN0PzogYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblxuICAvKipcbiAgICogUGxheWxpc3QgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllciBUaGUgcGxheWVyXG4gICAqIEBwYXJhbSB7UGxheWxpc3RJbml0RGF0YX0gZGF0YSBUaGUgZGF0YVxuICAgKi9cbiAgY29uc3RydWN0b3IocGxheWVyOiBQbGF5ZXIsIGRhdGE6IFBsYXlsaXN0SW5pdERhdGEpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWVyXG4gICAgICogQG5hbWUgUGxheWxpc3QjcGxheWVyXG4gICAgICogQHR5cGUge1BsYXllcn1cbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICB0aGlzLnBsYXllciA9IHBsYXllcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSB0cmFja3MgaW4gdGhpcyBwbGF5bGlzdFxuICAgICAqIEBuYW1lIFBsYXlsaXN0I3RyYWNrc1xuICAgICAqIEB0eXBlIHtUcmFja1tdfVxuICAgICAqL1xuICAgIHRoaXMudHJhY2tzID0gZGF0YS50cmFja3MgPz8gW107XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYXV0aG9yIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCNhdXRob3JcbiAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAqL1xuICAgIHRoaXMuYXV0aG9yID0gZGF0YS5hdXRob3I7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb25cbiAgICAgKiBAbmFtZSBQbGF5bGlzdCNkZXNjcmlwdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRhdGEuZGVzY3JpcHRpb247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGh1bWJuYWlsIG9mIHRoaXMgcGxheWxpc3RcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCN0aHVtYm5haWxcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMudGh1bWJuYWlsID0gZGF0YS50aHVtYm5haWw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdHlwZTpcbiAgICAgKiAtIGBhbGJ1bWBcbiAgICAgKiAtIGBwbGF5bGlzdGBcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCN0eXBlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLnR5cGUgPSBkYXRhLnR5cGU7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc291cmNlIG9mIHRoaXMgcGxheWxpc3Q6XG4gICAgICogLSBgeW91dHViZWBcbiAgICAgKiAtIGBzb3VuZGNsb3VkYFxuICAgICAqIC0gYHNwb3RpZnlgXG4gICAgICogLSBgYXJiaXRyYXJ5YFxuICAgICAqIEBuYW1lIFBsYXlsaXN0I3NvdXJjZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgdGhpcy5zb3VyY2UgPSBkYXRhLnNvdXJjZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCBpZFxuICAgICAqIEBuYW1lIFBsYXlsaXN0I2lkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwbGF5bGlzdCB1cmxcbiAgICAgKiBAbmFtZSBQbGF5bGlzdCN1cmxcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMudXJsID0gZGF0YS51cmw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGxheWxpc3QgdGl0bGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMudGl0bGUgPSBkYXRhLnRpdGxlO1xuXG4gICAgLyoqXG4gICAgICogQG5hbWUgUGxheWxpc3QjcmF3UGxheWxpc3RcbiAgICAgKiBAdHlwZSB7YW55fVxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICB9XG5cbiAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgIHlpZWxkKiB0aGlzLnRyYWNrcztcbiAgfVxuXG4gIC8qKlxuICAgKiBFc3RpbWF0ZWQgZHVyYXRpb24gb2YgdGhpcyBwbGF5bGlzdFxuICAgKi9cbiAgcHVibGljIGdldCBlc3RpbWF0ZWREdXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50cmFja3MucmVkdWNlKChwLCBjKSA9PiBwICsgYy5kdXJhdGlvbk1TLCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXR0ZWQgZXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoaXMgcGxheWxpc3RcbiAgICovXG4gIHB1YmxpYyBnZXQgZHVyYXRpb25Gb3JtYXR0ZWQoKSB7XG4gICAgcmV0dXJuIFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVModGhpcy5lc3RpbWF0ZWREdXJhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwbGF5bGlzdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt3aXRoVHJhY2tzPXRydWVdIElmIGl0IHNob3VsZCBidWlsZCBqc29uIHdpdGggdHJhY2tzXG4gICAqIEByZXR1cm5zIHtQbGF5bGlzdEpTT059XG4gICAqL1xuICB0b0pTT04od2l0aFRyYWNrcyA9IHRydWUpIHtcbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIHRodW1ibmFpbDogdGhpcy50aHVtYm5haWwsXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgYXV0aG9yOiB0aGlzLmF1dGhvcixcbiAgICAgIHRyYWNrczogW10gYXMgVHJhY2tKU09OW11cbiAgICB9O1xuXG4gICAgaWYgKHdpdGhUcmFja3MpIHBheWxvYWQudHJhY2tzID0gdGhpcy50cmFja3MubWFwKChtKSA9PiBtLnRvSlNPTih0cnVlKSk7XG5cbiAgICByZXR1cm4gcGF5bG9hZCBhcyBQbGF5bGlzdEpTT047XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIHRoaXMgcGxheWxpc3QgaW50byByZWNvbnN0cnVjdGFibGUgZGF0YVxuICAgKi9cbiAgcHVibGljIHNlcmlhbGl6ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHJhY2tzOiB0aGlzLnRyYWNrcy5tYXAoKG0pID0+IG0uc2VyaWFsaXplKCkpLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIHRodW1ibmFpbDogVHlwZVV0aWwuaXNTdHJpbmcodGhpcy50aHVtYm5haWwpID9cbiAgICAgIHRoaXMudGh1bWJuYWlsIDpcbiAgICAgIHRyeUludG9UaHVtYm5haWxTdHJpbmcodGhpcy50aHVtYm5haWwpLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgIGF1dGhvcjogdGhpcy5hdXRob3IsXG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAkdHlwZTogU2VyaWFsaXplZFR5cGUuUGxheWxpc3QsXG4gICAgICAkZW5jb2Rlcl92ZXJzaW9uOiB0aGlzLnBsYXllci52ZXJzaW9uXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSB0aGlzIHBsYXlsaXN0IGZyb20gc2VyaWFsaXplZCBkYXRhXG4gICAqIEBwYXJhbSBwbGF5ZXIgUGxheWVyIGluc3RhbmNlXG4gICAqIEBwYXJhbSBkYXRhIFNlcmlhbGl6ZWQgZGF0YVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tU2VyaWFsaXplZChwbGF5ZXI6IFBsYXllciwgZGF0YTogU2VyaWFsaXplZFBsYXlsaXN0KSB7XG4gICAgaWYgKGRhdGEuJHR5cGUgIT09IFNlcmlhbGl6ZWRUeXBlLlBsYXlsaXN0KVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgJ2RhdGEnLFxuICAgICAgJ1NlcmlhbGl6ZWRQbGF5bGlzdCcsXG4gICAgICAnbWFsZm9ybWVkIGRhdGEnXG4gICAgKTtcbiAgICByZXR1cm4gbmV3IFBsYXlsaXN0KHBsYXllciwge1xuICAgICAgLi4uZGF0YSxcbiAgICAgIHRyYWNrczogZGF0YS50cmFja3MubWFwKChtKSA9PiBUcmFjay5mcm9tU2VyaWFsaXplZChwbGF5ZXIsIG0pKVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdGhpcyBwbGF5bGlzdCB0byB0aGUgZ2l2ZW4gdm9pY2UgY2hhbm5lbC4gSWYgcXVldWUgZXhpc3RzIGFuZCBhbm90aGVyIHRyYWNrIGlzIGJlaW5nIHBsYXllZCwgdGhpcyBwbGF5bGlzdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBxdWV1ZS5cbiAgICogQHBhcmFtIGNoYW5uZWwgVm9pY2UgY2hhbm5lbCBvbiB3aGljaCB0aGlzIHBsYXlsaXN0IHNoYWxsIGJlIHBsYXllZFxuICAgKiBAcGFyYW0gb3B0aW9ucyBOb2RlIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBwbGF5PFQgPSB1bmtub3duPihcbiAgY2hhbm5lbDogR3VpbGRWb2ljZUNoYW5uZWxSZXNvbHZhYmxlLFxuICBvcHRpb25zPzogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPilcbiAgOiBQcm9taXNlPFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUPj4ge1xuICAgIGNvbnN0IGZuID0gdGhpcy5wbGF5ZXIucGxheS5iaW5kKHRoaXMucGxheWVyKTtcblxuICAgIHJldHVybiBhd2FpdCBmbihjaGFubmVsLCB0aGlzLCBvcHRpb25zKTtcbiAgfVxufSIsICJpbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4vVHlwZVV0aWwnO1xuaW1wb3J0IHsgSW5mb1JlcXVpcmVkRXJyb3IsIEludmFsaWRBcmdUeXBlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgZmV0Y2ggfSBmcm9tICd1bmRpY2knO1xuXG4vLyAjcmVnaW9uIHNjYXJ5IHRoaW5ncyBiZWxvdyAqc2lnaCpcbmNvbnN0IHNwb3RpZnlTb25nUmVnZXggPVxuL15odHRwcz86XFwvXFwvKD86ZW1iZWRcXC58b3BlblxcLikoPzpzcG90aWZ5XFwuY29tXFwvKShpbnRsLShbYS16XXxbQS1aXSkrXFwvKT8oPzp0cmFja1xcL3xcXD91cmk9c3BvdGlmeTp0cmFjazopKChcXHd8LSl7MjJ9KShcXD9zaT0uKyk/JC87XG5jb25zdCBzcG90aWZ5UGxheWxpc3RSZWdleCA9XG4vXmh0dHBzPzpcXC9cXC8oPzplbWJlZFxcLnxvcGVuXFwuKSg/OnNwb3RpZnlcXC5jb21cXC8pKGludGwtKFthLXpdfFtBLVpdKStcXC8pPyg/OnBsYXlsaXN0XFwvfFxcP3VyaT1zcG90aWZ5OnBsYXlsaXN0OikoKFxcd3wtKXsyMn0pKFxcP3NpPS4rKT8kLztcbmNvbnN0IHNwb3RpZnlBbGJ1bVJlZ2V4ID1cbi9eaHR0cHM/OlxcL1xcLyg/OmVtYmVkXFwufG9wZW5cXC4pKD86c3BvdGlmeVxcLmNvbVxcLykoaW50bC0oW2Etel18W0EtWl0pK1xcLyk/KD86YWxidW1cXC98XFw/dXJpPXNwb3RpZnk6YWxidW06KSgoXFx3fC0pezIyfSkoXFw/c2k9LispPyQvO1xuY29uc3QgdmltZW9SZWdleCA9XG4vXihodHRwfGh0dHBzKT86XFwvXFwvKHd3d1xcLnxwbGF5ZXJcXC4pP3ZpbWVvXFwuY29tXFwvKD86Y2hhbm5lbHNcXC8oPzpcXHcrXFwvKT98Z3JvdXBzXFwvKFteL10qKVxcL3ZpZGVvc1xcL3x2aWRlb1xcL3wpKFxcZCspKD86fFxcL1xcPykkLztcbmNvbnN0IHJldmVyYm5hdGlvblJlZ2V4ID1cbi9eaHR0cHM6XFwvXFwvKHd3dy4pP3JldmVyYm5hdGlvbi5jb21cXC8oLispXFwvc29uZ1xcLyguKykkLztcbmNvbnN0IGF0dGFjaG1lbnRSZWdleCA9IC9eaHR0cHM/OlxcL1xcLy4rJC87XG5jb25zdCBhcHBsZU11c2ljU29uZ1JlZ2V4ID1cbi9eaHR0cHM/OlxcL1xcL211c2ljXFwuYXBwbGVcXC5jb21cXC8uKz9cXC8oc29uZ3xhbGJ1bSlcXC8uKz8oXFwvLis/XFw/aT18XFwvKShbMC05XSspJC87XG5jb25zdCBhcHBsZU11c2ljUGxheWxpc3RSZWdleCA9XG4vXmh0dHBzPzpcXC9cXC9tdXNpY1xcLmFwcGxlXFwuY29tXFwvLis/XFwvcGxheWxpc3RcXC8uK1xcL3BsXFwuKHUtfHBtLSk/W2EtekEtWjAtOV0rJC87XG5jb25zdCBhcHBsZU11c2ljQWxidW1SZWdleCA9XG4vXmh0dHBzPzpcXC9cXC9tdXNpY1xcLmFwcGxlXFwuY29tXFwvLis/XFwvYWxidW1cXC8uK1xcLyhbMC05XSspJC87XG5jb25zdCBzb3VuZGNsb3VkVHJhY2tSZWdleCA9XG4vXmh0dHBzPzpcXC9cXC8obS58d3d3Lik/c291bmRjbG91ZC5jb21cXC8oXFx3fC0pK1xcLyhcXHd8LSkrKC4rKT8kLztcbmNvbnN0IHNvdW5kY2xvdWRQbGF5bGlzdFJlZ2V4ID1cbi9eaHR0cHM/OlxcL1xcLyhtLnx3d3cuKT9zb3VuZGNsb3VkLmNvbVxcLyhcXHd8LSkrXFwvc2V0c1xcLyhcXHd8LSkrKC4rKT8kLztcbmNvbnN0IHlvdXR1YmVQbGF5bGlzdFJlZ2V4ID1cbi9eaHR0cHM/OlxcL1xcLyh3d3cuKT95b3V0dWJlLmNvbVxcL3BsYXlsaXN0XFw/bGlzdD0oKFBMfEZMfFVVfExMfFJEfE9MKVthLXpBLVowLTktX117MTYsNDF9KSQvO1xuY29uc3QgeW91dHViZVZpZGVvVVJMUmVnZXggPVxuL14oKD86aHR0cHM/Oik/XFwvXFwvKT8oKD86d3d3fG0pXFwuKT8oKD86eW91dHViZVxcLmNvbXx5b3V0dS5iZSkpKFxcLyg/OltcXHctXStcXD92PXxlbWJlZFxcL3x2XFwvKT8pKFtcXHctXSspKFxcUyspPyQvO1xuY29uc3QgeW91dHViZVZpZGVvSWRSZWdleCA9IC9eW2EtekEtWjAtOS1fXXsxMX0kLztcbi8vIGRpc2NvcmQtcGxheWVyOi8vYmxvYi91dWlkLXY0XG5jb25zdCBkaXNjb3JkUGxheWVyQmxvYlJlZ2V4ID0gL15kaXNjb3JkLXBsYXllcjpcXC9cXC9ibG9iXFwvXFxkKyQvO1xuLy8gI2VuZHJlZ2lvbiBzY2FyeSB0aGluZ3MgYWJvdmUgKnNpZ2gqXG5cbmNvbnN0IERvbWFpbnNNYXAgPSB7XG4gIERpc2NvcmRQbGF5ZXI6IFsnZGlzY29yZC1wbGF5ZXInXSxcbiAgWW91VHViZTogW1xuICAneW91dHViZS5jb20nLFxuICAneW91dHUuYmUnLFxuICAnbXVzaWMueW91dHViZS5jb20nLFxuICAnZ2FtaW5nLnlvdXR1YmUuY29tJyxcbiAgJ3d3dy55b3V0dWJlLmNvbScsXG4gICdtLnlvdXR1YmUuY29tJ10sXG5cbiAgU3BvdGlmeTogWydvcGVuLnNwb3RpZnkuY29tJywgJ2VtYmVkLnNwb3RpZnkuY29tJ10sXG4gIFZpbWVvOiBbJ3ZpbWVvLmNvbScsICdwbGF5ZXIudmltZW8uY29tJ10sXG4gIFJldmVyYk5hdGlvbjogWydyZXZlcmJuYXRpb24uY29tJ10sXG4gIFNvdW5kQ2xvdWQ6IFsnc291bmRjbG91ZC5jb20nXSxcbiAgQXBwbGVNdXNpYzogWydtdXNpYy5hcHBsZS5jb20nXVxufTtcblxuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCByZWRpcmVjdERvbWFpbnMgPSBuZXcgU2V0KFtcbi9eaHR0cHM/OlxcL1xcL3Nwb3RpZnkubGlua1xcL1tBLVphLXowLTldKyQvLFxuL15odHRwczpcXC9cXC9vblxcLnNvdW5kY2xvdWRcXC5jb21cXC9bYS16QS1aMS05XXswLDE3fSQvXVxuKTtcblxuLyoqXG4gKiBUaGUgc2VhcmNoIHF1ZXJ5IHR5cGVcbiAqIFRoaXMgY2FuIGJlIG9uZSBvZjpcbiAqIC0gQVVUT1xuICogLSBZT1VUVUJFXG4gKiAtIFlPVVRVQkVfUExBWUxJU1RcbiAqIC0gU09VTkRDTE9VRF9UUkFDS1xuICogLSBTT1VORENMT1VEX1BMQVlMSVNUXG4gKiAtIFNPVU5EQ0xPVURcbiAqIC0gU1BPVElGWV9TT05HXG4gKiAtIFNQT1RJRllfQUxCVU1cbiAqIC0gU1BPVElGWV9QTEFZTElTVFxuICogLSBTUE9USUZZX1NFQVJDSFxuICogLSBGQUNFQk9PS1xuICogLSBWSU1FT1xuICogLSBBUkJJVFJBUllcbiAqIC0gUkVWRVJCTkFUSU9OXG4gKiAtIFlPVVRVQkVfU0VBUkNIXG4gKiAtIFlPVVRVQkVfVklERU9cbiAqIC0gU09VTkRDTE9VRF9TRUFSQ0hcbiAqIC0gQVBQTEVfTVVTSUNfU09OR1xuICogLSBBUFBMRV9NVVNJQ19BTEJVTVxuICogLSBBUFBMRV9NVVNJQ19QTEFZTElTVFxuICogLSBBUFBMRV9NVVNJQ19TRUFSQ0hcbiAqIC0gRklMRVxuICogLSBBVVRPX1NFQVJDSFxuICogLSBESVNDT1JEX1BMQVlFUl9CTE9CXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBRdWVyeVR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IFF1ZXJ5VHlwZSA9IHtcbiAgQVVUTzogJ2F1dG8nLFxuICBZT1VUVUJFOiAneW91dHViZScsXG4gIFlPVVRVQkVfUExBWUxJU1Q6ICd5b3V0dWJlUGxheWxpc3QnLFxuICBTT1VORENMT1VEX1RSQUNLOiAnc291bmRjbG91ZFRyYWNrJyxcbiAgU09VTkRDTE9VRF9QTEFZTElTVDogJ3NvdW5kY2xvdWRQbGF5bGlzdCcsXG4gIFNPVU5EQ0xPVUQ6ICdzb3VuZGNsb3VkJyxcbiAgU1BPVElGWV9TT05HOiAnc3BvdGlmeVNvbmcnLFxuICBTUE9USUZZX0FMQlVNOiAnc3BvdGlmeUFsYnVtJyxcbiAgU1BPVElGWV9QTEFZTElTVDogJ3Nwb3RpZnlQbGF5bGlzdCcsXG4gIFNQT1RJRllfU0VBUkNIOiAnc3BvdGlmeVNlYXJjaCcsXG4gIEZBQ0VCT09LOiAnZmFjZWJvb2snLFxuICBWSU1FTzogJ3ZpbWVvJyxcbiAgQVJCSVRSQVJZOiAnYXJiaXRyYXJ5JyxcbiAgUkVWRVJCTkFUSU9OOiAncmV2ZXJibmF0aW9uJyxcbiAgWU9VVFVCRV9TRUFSQ0g6ICd5b3V0dWJlU2VhcmNoJyxcbiAgWU9VVFVCRV9WSURFTzogJ3lvdXR1YmVWaWRlbycsXG4gIFNPVU5EQ0xPVURfU0VBUkNIOiAnc291bmRjbG91ZFNlYXJjaCcsXG4gIEFQUExFX01VU0lDX1NPTkc6ICdhcHBsZU11c2ljU29uZycsXG4gIEFQUExFX01VU0lDX0FMQlVNOiAnYXBwbGVNdXNpY0FsYnVtJyxcbiAgQVBQTEVfTVVTSUNfUExBWUxJU1Q6ICdhcHBsZU11c2ljUGxheWxpc3QnLFxuICBBUFBMRV9NVVNJQ19TRUFSQ0g6ICdhcHBsZU11c2ljU2VhcmNoJyxcbiAgRklMRTogJ2ZpbGUnLFxuICBBVVRPX1NFQVJDSDogJ2F1dG9TZWFyY2gnLFxuICBESVNDT1JEX1BMQVlFUl9CTE9COiAnZGlzY29yZFBsYXllckJsb2InXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBRdWVyeVR5cGUgPSAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV07XG5cbmV4cG9ydCB0eXBlIFNlYXJjaFF1ZXJ5VHlwZSA9IGtleW9mIHR5cGVvZiBRdWVyeVR5cGUgfCBRdWVyeVR5cGU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRRdWVyeSB7XG4gIHR5cGU6ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXTtcbiAgcXVlcnk6IHN0cmluZztcbn1cblxuY2xhc3MgUXVlcnlSZXNvbHZlciB7XG4gIC8qKlxuICAgKiBRdWVyeSByZXNvbHZlclxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG5cbiAgc3RhdGljIGdldCByZWdleCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3BvdGlmeUFsYnVtUmVnZXgsXG4gICAgICBzcG90aWZ5UGxheWxpc3RSZWdleCxcbiAgICAgIHNwb3RpZnlTb25nUmVnZXgsXG4gICAgICB2aW1lb1JlZ2V4LFxuICAgICAgcmV2ZXJibmF0aW9uUmVnZXgsXG4gICAgICBhdHRhY2htZW50UmVnZXgsXG4gICAgICBhcHBsZU11c2ljQWxidW1SZWdleCxcbiAgICAgIGFwcGxlTXVzaWNQbGF5bGlzdFJlZ2V4LFxuICAgICAgYXBwbGVNdXNpY1NvbmdSZWdleCxcbiAgICAgIHNvdW5kY2xvdWRUcmFja1JlZ2V4LFxuICAgICAgc291bmRjbG91ZFBsYXlsaXN0UmVnZXgsXG4gICAgICB5b3V0dWJlUGxheWxpc3RSZWdleCxcbiAgICAgIGRpc2NvcmRQbGF5ZXJCbG9iUmVnZXhcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFByZS1yZXNvbHZlIHJlZGlyZWN0IHVybHNcbiAgICovXG4gIHN0YXRpYyBhc3luYyBwcmVSZXNvbHZlKHF1ZXJ5OiBzdHJpbmcsIG1heERlcHRoID0gNSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFUeXBlVXRpbC5pc1N0cmluZyhxdWVyeSkpXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IocXVlcnksICdzdHJpbmcnLCB0eXBlb2YgcXVlcnkpO1xuXG4gICAgZm9yIChjb25zdCBkb21haW4gb2YgcmVkaXJlY3REb21haW5zKSB7XG4gICAgICBpZiAoZG9tYWluLnRlc3QocXVlcnkpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2gocXVlcnksIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICByZWRpcmVjdDogJ2ZvbGxvdydcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICghcmVzLm9rKSBicmVhaztcblxuICAgICAgICAgIC8vIHNwb3RpZnkgZG9lcyBub3QgXCJyZWRpcmVjdFwiLCBpdCByZXR1cm5zIGEgcGFnZSB3aXRoIGpzIHRoYXQgcmVkaXJlY3RzXG4gICAgICAgICAgaWYgKC9eaHR0cHM/OlxcL1xcL3Nwb3RpZnkuYXBwLmxpbmtcXC8oLispJC8udGVzdChyZXMudXJsKSkge1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBib2R5LlxuICAgICAgICAgICAgc3BsaXQoJ2h0dHBzOi8vb3Blbi5zcG90aWZ5LmNvbS90cmFjay8nKVsxXS5cbiAgICAgICAgICAgIHNwbGl0KCc/c2k9JylbMF07XG5cbiAgICAgICAgICAgIGlmICghdGFyZ2V0KSBicmVhaztcblxuICAgICAgICAgICAgcmV0dXJuIGBodHRwczovL29wZW4uc3BvdGlmeS5jb20vdHJhY2svJHt0YXJnZXR9YDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG1heERlcHRoIDwgMSA/XG4gICAgICAgICAgcmVzLnVybCA6XG4gICAgICAgICAgdGhpcy5wcmVSZXNvbHZlKHJlcy51cmwsIG1heERlcHRoIC0gMSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBnaXZlbiBzZWFyY2ggcXVlcnlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5IFRoZSBxdWVyeVxuICAgKi9cbiAgc3RhdGljIHJlc29sdmUoXG4gIHF1ZXJ5OiBzdHJpbmcsXG4gIGZhbGxiYWNrU2VhcmNoRW5naW5lOiAodHlwZW9mIFF1ZXJ5VHlwZSlba2V5b2YgdHlwZW9mIFF1ZXJ5VHlwZV0gPSBRdWVyeVR5cGUuQVVUT19TRUFSQ0gpXG4gIDogUmVzb2x2ZWRRdWVyeSB7XG4gICAgaWYgKCFUeXBlVXRpbC5pc1N0cmluZyhxdWVyeSkpXG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IocXVlcnksICdzdHJpbmcnLCB0eXBlb2YgcXVlcnkpO1xuICAgIGlmICghcXVlcnkubGVuZ3RoKSB0aHJvdyBuZXcgSW5mb1JlcXVpcmVkRXJyb3IoJ3F1ZXJ5JywgU3RyaW5nKHF1ZXJ5KSk7XG5cbiAgICBjb25zdCByZXNvbHZlciA9ICh0eXBlOiB0eXBlb2YgZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5OiBzdHJpbmcpID0+ICh7XG4gICAgICB0eXBlLFxuICAgICAgcXVlcnlcbiAgICB9KTtcblxuICAgIGlmIChkaXNjb3JkUGxheWVyQmxvYlJlZ2V4LnRlc3QocXVlcnkpKVxuICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuRElTQ09SRF9QTEFZRVJfQkxPQiwgcXVlcnkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocXVlcnkpO1xuXG4gICAgICBpZiAoRG9tYWluc01hcC5Zb3VUdWJlLmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LnJlcGxhY2UoLyhtKHVzaWMpP3xnYW1pbmcpXFwuLywgJycpLnRyaW0oKTtcbiAgICAgICAgY29uc3QgcGxheWxpc3RJZCA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KCdsaXN0Jyk7XG4gICAgICAgIGNvbnN0IHZpZGVvSWQgPSB1cmwuc2VhcmNoUGFyYW1zLmdldCgndicpO1xuICAgICAgICBpZiAocGxheWxpc3RJZCkge1xuICAgICAgICAgIGlmICh2aWRlb0lkICYmIHBsYXlsaXN0SWQuc3RhcnRzV2l0aCgnUkQnKSlcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZXIoXG4gICAgICAgICAgICBRdWVyeVR5cGUuWU9VVFVCRV9QTEFZTElTVCxcbiAgICAgICAgICAgIGBodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PSR7dmlkZW9JZH0mbGlzdD0ke3BsYXlsaXN0SWR9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmVyKFxuICAgICAgICAgICAgUXVlcnlUeXBlLllPVVRVQkVfUExBWUxJU1QsXG4gICAgICAgICAgICBgaHR0cHM6Ly93d3cueW91dHViZS5jb20vcGxheWxpc3Q/bGlzdD0ke3BsYXlsaXN0SWR9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFF1ZXJ5UmVzb2x2ZXIudmFsaWRhdGVJZChxdWVyeSkgfHwgUXVlcnlSZXNvbHZlci52YWxpZGF0ZVVSTChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuWU9VVFVCRV9WSURFTywgcXVlcnkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5TcG90aWZ5LmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LnJlcGxhY2UoL2ludGwtKFthLXpBLVpdKylcXC8vLCAnJyk7XG4gICAgICAgIGlmIChzcG90aWZ5UGxheWxpc3RSZWdleC50ZXN0KHF1ZXJ5KSlcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TUE9USUZZX1BMQVlMSVNULCBxdWVyeSk7XG4gICAgICAgIGlmIChzcG90aWZ5QWxidW1SZWdleC50ZXN0KHF1ZXJ5KSlcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TUE9USUZZX0FMQlVNLCBxdWVyeSk7XG4gICAgICAgIGlmIChzcG90aWZ5U29uZ1JlZ2V4LnRlc3QocXVlcnkpKVxuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoUXVlcnlUeXBlLlNQT1RJRllfU09ORywgcXVlcnkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgIH0gZWxzZSBpZiAoRG9tYWluc01hcC5WaW1lby5pbmNsdWRlcyh1cmwuaG9zdCkpIHtcbiAgICAgICAgaWYgKHZpbWVvUmVnZXgudGVzdChxdWVyeSkpIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuVklNRU8sIHF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKGZhbGxiYWNrU2VhcmNoRW5naW5lLCBxdWVyeSk7XG4gICAgICB9IGVsc2UgaWYgKERvbWFpbnNNYXAuUmV2ZXJiTmF0aW9uLmluY2x1ZGVzKHVybC5ob3N0KSkge1xuICAgICAgICBpZiAocmV2ZXJibmF0aW9uUmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuUkVWRVJCTkFUSU9OLCBxdWVyeSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLlNvdW5kQ2xvdWQuaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgIGlmIChzb3VuZGNsb3VkUGxheWxpc3RSZWdleC50ZXN0KHF1ZXJ5KSlcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TT1VORENMT1VEX1BMQVlMSVNULCBxdWVyeSk7XG4gICAgICAgIGlmIChzb3VuZGNsb3VkVHJhY2tSZWdleC50ZXN0KHF1ZXJ5KSlcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5TT1VORENMT1VEX1RSQUNLLCBxdWVyeSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlcihmYWxsYmFja1NlYXJjaEVuZ2luZSwgcXVlcnkpO1xuICAgICAgfSBlbHNlIGlmIChEb21haW5zTWFwLkFwcGxlTXVzaWMuaW5jbHVkZXModXJsLmhvc3QpKSB7XG4gICAgICAgIGlmIChhcHBsZU11c2ljQWxidW1SZWdleC50ZXN0KHF1ZXJ5KSlcbiAgICAgICAgcmV0dXJuIHJlc29sdmVyKFF1ZXJ5VHlwZS5BUFBMRV9NVVNJQ19BTEJVTSwgcXVlcnkpO1xuICAgICAgICBpZiAoYXBwbGVNdXNpY1BsYXlsaXN0UmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuQVBQTEVfTVVTSUNfUExBWUxJU1QsIHF1ZXJ5KTtcbiAgICAgICAgaWYgKGFwcGxlTXVzaWNTb25nUmVnZXgudGVzdChxdWVyeSkpXG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuQVBQTEVfTVVTSUNfU09ORywgcXVlcnkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlcihRdWVyeVR5cGUuQVJCSVRSQVJZLCBxdWVyeSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gcmVzb2x2ZXIoZmFsbGJhY2tTZWFyY2hFbmdpbmUsIHF1ZXJ5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHZpbWVvIGlkIGZyb20gdXJsXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSBUaGUgcXVlcnlcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHN0YXRpYyBnZXRWaW1lb0lEKHF1ZXJ5OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gUXVlcnlSZXNvbHZlci5yZXNvbHZlKHF1ZXJ5KS50eXBlID09PSBRdWVyeVR5cGUuVklNRU8gP1xuICAgIHF1ZXJ5LnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pLnBvcCgpIDpcbiAgICBudWxsO1xuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlSWQocTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHlvdXR1YmVWaWRlb0lkUmVnZXgudGVzdChxKTtcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZVVSTChxOiBzdHJpbmcpIHtcbiAgICByZXR1cm4geW91dHViZVZpZGVvVVJMUmVnZXgudGVzdChxKTtcbiAgfVxufVxuXG5leHBvcnQgeyBRdWVyeVJlc29sdmVyIH07IiwgImltcG9ydCB7IFVzZXIsIFVzZXJSZXNvbHZhYmxlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBQbGF5bGlzdCB9IGZyb20gJy4vUGxheWxpc3QnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuL1RyYWNrJztcbmltcG9ydCB7IFF1ZXJ5VHlwZSwgU2VhcmNoUXVlcnlUeXBlIH0gZnJvbSAnLi4vdXRpbHMvUXVlcnlSZXNvbHZlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoUmVzdWx0RGF0YSB7XG4gIHF1ZXJ5OiBzdHJpbmc7XG4gIHF1ZXJ5VHlwZT86IFNlYXJjaFF1ZXJ5VHlwZSB8IFF1ZXJ5RXh0cmFjdG9yU2VhcmNoIHwgbnVsbDtcbiAgZXh0cmFjdG9yPzogQmFzZUV4dHJhY3RvciB8IG51bGw7XG4gIHBsYXlsaXN0PzogUGxheWxpc3QgfCBudWxsO1xuICB0cmFja3M/OiBUcmFja1tdO1xuICByZXF1ZXN0ZWRCeT86IFVzZXIgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXlPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHRoaXMgcGxheSB3YXMgdHJpZ2dlcmVkIGZvciBmaWx0ZXJzIHVwZGF0ZVxuICAgKi9cbiAgZmlsdGVyc1VwZGF0ZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBGRm1wZWcgYXJncyBwYXNzZWQgdG8gZW5jb2RlclxuICAgKi9cbiAgZW5jb2RlckFyZ3M/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFRpbWUgdG8gc2VlayB0byBiZWZvcmUgcGxheWluZ1xuICAgKi9cbiAgc2Vlaz86IG51bWJlcjtcbiAgLyoqXG4gICAqIElmIGl0IHNob3VsZCBzdGFydCBwbGF5aW5nIHRoZSBwcm92aWRlZCB0cmFjayBpbW1lZGlhdGVseVxuICAgKi9cbiAgaW1tZWRpYXRlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgUXVlcnlFeHRyYWN0b3JTZWFyY2ggPSBgZXh0OiR7c3RyaW5nfWA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgdXNlciB3aG8gcmVxdWVzdGVkIHRoaXMgc2VhcmNoXG4gICAqL1xuICByZXF1ZXN0ZWRCeT86IFVzZXJSZXNvbHZhYmxlO1xuICAvKipcbiAgICogVGhlIHF1ZXJ5IHNlYXJjaCBlbmdpbmUsIGNhbiBiZSBleHRyYWN0b3IgbmFtZSB0byB0YXJnZXQgc3BlY2lmaWMgb25lIChjdXN0b20pXG4gICAqL1xuICBzZWFyY2hFbmdpbmU/OiBTZWFyY2hRdWVyeVR5cGUgfCBRdWVyeUV4dHJhY3RvclNlYXJjaDtcbiAgLyoqXG4gICAqIExpc3Qgb2YgdGhlIGV4dHJhY3RvcnMgdG8gYmxvY2tcbiAgICovXG4gIGJsb2NrRXh0cmFjdG9ycz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogSWYgaXQgc2hvdWxkIGlnbm9yZSBxdWVyeSBjYWNoZSBsb29rdXBcbiAgICovXG4gIGlnbm9yZUNhY2hlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEZhbGxiYWNrIHNlYXJjaCBlbmdpbmUgdG8gdXNlXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICByZXF1ZXN0T3B0aW9ucz86IGFueTtcbiAgLyoqXG4gICAqIEZhbGxiYWNrIHNlYXJjaCBlbmdpbmUgdG8gdXNlXG4gICAqL1xuICBmYWxsYmFja1NlYXJjaEVuZ2luZT86ICh0eXBlb2YgUXVlcnlUeXBlKVtrZXlvZiB0eXBlb2YgUXVlcnlUeXBlXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJTZWFyY2hSZXN1bHQge1xuICBwbGF5bGlzdDogUGxheWxpc3QgfCBudWxsO1xuICB0cmFja3M6IFRyYWNrW107XG59XG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hSZXN1bHQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyLCBwcml2YXRlIF9kYXRhOiBTZWFyY2hSZXN1bHREYXRhKSB7XG4gICAgdGhpcy5fZGF0YS50cmFja3M/LmZvckVhY2goKHRyYWNrKSA9PiB7XG4gICAgICB0cmFjay5leHRyYWN0b3IgPz89IHRoaXMuX2RhdGEuZXh0cmFjdG9yIHx8IG51bGw7XG4gICAgICB0cmFjay5yZXF1ZXN0ZWRCeSA/Pz0gX2RhdGEucmVxdWVzdGVkQnkgfHwgbnVsbDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRRdWVyeVR5cGUodHlwZTogU2VhcmNoUXVlcnlUeXBlIHwgUXVlcnlFeHRyYWN0b3JTZWFyY2gpIHtcbiAgICB0aGlzLl9kYXRhLnF1ZXJ5VHlwZSA9IHR5cGU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgc2V0UmVxdWVzdGVkQnkodXNlcjogVXNlcikge1xuICAgIHRoaXMuX2RhdGEucmVxdWVzdGVkQnkgPSB1c2VyO1xuICAgIHRoaXMuX2RhdGEudHJhY2tzPy5mb3JFYWNoKCh0cmFjaykgPT4ge1xuICAgICAgdHJhY2sucmVxdWVzdGVkQnkgPSB1c2VyO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHNldEV4dHJhY3RvcihleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpIHtcbiAgICB0aGlzLl9kYXRhLmV4dHJhY3RvciA9IGV4dHJhY3RvcjtcbiAgICB0aGlzLl9kYXRhLnRyYWNrcz8uZm9yRWFjaCgodHJhY2spID0+IHtcbiAgICAgIHRyYWNrLmV4dHJhY3RvciA9IGV4dHJhY3RvcjtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBzZXRUcmFja3ModHJhY2tzOiBUcmFja1tdKSB7XG4gICAgdGhpcy5fZGF0YS50cmFja3MgPSB0cmFja3M7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgc2V0UXVlcnkocXVlcnk6IHN0cmluZykge1xuICAgIHRoaXMuX2RhdGEucXVlcnkgPSBxdWVyeTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBzZXRQbGF5bGlzdChwbGF5bGlzdDogUGxheWxpc3QpIHtcbiAgICB0aGlzLl9kYXRhLnBsYXlsaXN0ID0gcGxheWxpc3Q7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNlYXJjaCBxdWVyeVxuICAgKi9cbiAgcHVibGljIGdldCBxdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5xdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2VhcmNoIHF1ZXJ5IHR5cGVcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlcnlUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnF1ZXJ5VHlwZSB8fCBRdWVyeVR5cGUuQVVUTztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZXh0cmFjdG9yXG4gICAqL1xuICBwdWJsaWMgZ2V0IGV4dHJhY3RvcigpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5leHRyYWN0b3IgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5bGlzdCByZXN1bHRcbiAgICovXG4gIHB1YmxpYyBnZXQgcGxheWxpc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEucGxheWxpc3Q7XG4gIH1cblxuICAvKipcbiAgICogVHJhY2tzIHJlc3VsdFxuICAgKi9cbiAgcHVibGljIGdldCB0cmFja3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEudHJhY2tzIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3RlZCBieVxuICAgKi9cbiAgcHVibGljIGdldCByZXF1ZXN0ZWRCeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5yZXF1ZXN0ZWRCeSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlLWV4ZWN1dGUgdGhpcyBzZWFyY2hcbiAgICovXG4gIHB1YmxpYyBhc3luYyBleGVjdXRlKCkge1xuICAgIHJldHVybiB0aGlzLnBsYXllci5zZWFyY2godGhpcy5xdWVyeSwge1xuICAgICAgc2VhcmNoRW5naW5lOiB0aGlzLnF1ZXJ5VHlwZSxcbiAgICAgIHJlcXVlc3RlZEJ5OiB0aGlzLnJlcXVlc3RlZEJ5IVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgc2VhcmNoIHJlc3VsdCBpcyBlbXB0eVxuICAgKi9cbiAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuICF0aGlzLnRyYWNrcy5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGhhcyBwbGF5bGlzdFxuICAgKi9cbiAgcHVibGljIGhhc1BsYXlsaXN0KCkge1xuICAgIHJldHVybiB0aGlzLnBsYXlsaXN0ICE9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhpcyBzZWFyY2ggcmVzdWx0IGhhcyB0cmFja3NcbiAgICovXG4gIHB1YmxpYyBoYXNUcmFja3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKipcbiAgICogSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNlYXJjaFxuICAgKi9cbiAgcHVibGljIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcXVlcnk6IHRoaXMucXVlcnksXG4gICAgICBxdWVyeVR5cGU6IHRoaXMucXVlcnlUeXBlLFxuICAgICAgcGxheWxpc3Q6IHRoaXMucGxheWxpc3Q/LnRvSlNPTihmYWxzZSkgfHwgbnVsbCxcbiAgICAgIHRyYWNrczogdGhpcy50cmFja3MubWFwKChtKSA9PiBtLnRvSlNPTih0cnVlKSksXG4gICAgICBleHRyYWN0b3I6IHRoaXMuZXh0cmFjdG9yPy5pZGVudGlmaWVyIHx8IG51bGwsXG4gICAgICByZXF1ZXN0ZWRCeTogdGhpcy5yZXF1ZXN0ZWRCeT8udG9KU09OKCkgfHwgbnVsbFxuICAgIH07XG4gIH1cbn0iLCAiZXhwb3J0IHR5cGUgRmlsdGVyc05hbWUgPSBrZXlvZiBRdWV1ZUZpbHRlcnM7XG5cbi8qKlxuICogUmVwcmVzZW50cyBGRm1wZWcgZmlsdGVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXVlRmlsdGVycyB7XG4gIGJhc3Nib29zdF9sb3c/OiBib29sZWFuO1xuICBiYXNzYm9vc3Q/OiBib29sZWFuO1xuICBiYXNzYm9vc3RfaGlnaD86IGJvb2xlYW47XG4gICc4RCc/OiBib29sZWFuO1xuICB2YXBvcndhdmU/OiBib29sZWFuO1xuICBuaWdodGNvcmU/OiBib29sZWFuO1xuICBwaGFzZXI/OiBib29sZWFuO1xuICB0cmVtb2xvPzogYm9vbGVhbjtcbiAgdmlicmF0bz86IGJvb2xlYW47XG4gIHJldmVyc2U/OiBib29sZWFuO1xuICB0cmVibGU/OiBib29sZWFuO1xuICBub3JtYWxpemVyPzogYm9vbGVhbjtcbiAgbm9ybWFsaXplcjI/OiBib29sZWFuO1xuICBzdXJyb3VuZGluZz86IGJvb2xlYW47XG4gIHB1bHNhdG9yPzogYm9vbGVhbjtcbiAgc3ViYm9vc3Q/OiBib29sZWFuO1xuICBrYXJhb2tlPzogYm9vbGVhbjtcbiAgZmxhbmdlcj86IGJvb2xlYW47XG4gIGdhdGU/OiBib29sZWFuO1xuICBoYWFzPzogYm9vbGVhbjtcbiAgbWNvbXBhbmQ/OiBib29sZWFuO1xuICBtb25vPzogYm9vbGVhbjtcbiAgbXN0bHI/OiBib29sZWFuO1xuICBtc3Rycj86IGJvb2xlYW47XG4gIGNvbXByZXNzb3I/OiBib29sZWFuO1xuICBleHBhbmRlcj86IGJvb2xlYW47XG4gIHNvZnRsaW1pdGVyPzogYm9vbGVhbjtcbiAgY2hvcnVzPzogYm9vbGVhbjtcbiAgY2hvcnVzMmQ/OiBib29sZWFuO1xuICBjaG9ydXMzZD86IGJvb2xlYW47XG4gIGZhZGVpbj86IGJvb2xlYW47XG4gIGRpbT86IGJvb2xlYW47XG4gIGVhcnJhcGU/OiBib29sZWFuO1xuICBsb2ZpPzogYm9vbGVhbjtcbiAgc2lsZW5jZXJlbW92ZT86IGJvb2xlYW47XG59XG5cbmNvbnN0IGJhc3MgPSAoZzogbnVtYmVyKSA9PiBgYmFzcz1nPSR7Z306Zj0xMTA6dz0wLjNgO1xuXG5leHBvcnQgY2xhc3MgQXVkaW9GaWx0ZXJzIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHJldHVybiBBdWRpb0ZpbHRlcnM7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGZpbHRlcnM6IFJlY29yZDxGaWx0ZXJzTmFtZSwgc3RyaW5nPiA9IHtcbiAgICBiYXNzYm9vc3RfbG93OiBiYXNzKDE1KSxcbiAgICBiYXNzYm9vc3Q6IGJhc3MoMjApLFxuICAgIGJhc3Nib29zdF9oaWdoOiBiYXNzKDMwKSxcbiAgICAnOEQnOiAnYXB1bHNhdG9yPWh6PTAuMDknLFxuICAgIHZhcG9yd2F2ZTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCowLjgnLFxuICAgIG5pZ2h0Y29yZTogJ2FyZXNhbXBsZT00ODAwMCxhc2V0cmF0ZT00ODAwMCoxLjI1JyxcbiAgICBsb2ZpOiAnYXJlc2FtcGxlPTQ4MDAwLGFzZXRyYXRlPTQ4MDAwKjAuOSxleHRyYXN0ZXJlbz1tPTIuNTpjPWRpc2FibGVkJyxcbiAgICBwaGFzZXI6ICdhcGhhc2VyPWluX2dhaW49MC40JyxcbiAgICB0cmVtb2xvOiAndHJlbW9sbycsXG4gICAgdmlicmF0bzogJ3ZpYnJhdG89Zj02LjUnLFxuICAgIHJldmVyc2U6ICdhcmV2ZXJzZScsXG4gICAgdHJlYmxlOiAndHJlYmxlPWc9NScsXG4gICAgbm9ybWFsaXplcjI6ICdkeW5hdWRub3JtPWc9MTAxJyxcbiAgICBub3JtYWxpemVyOiAnYWNvbXByZXNzb3InLFxuICAgIHN1cnJvdW5kaW5nOiAnc3Vycm91bmQnLFxuICAgIHB1bHNhdG9yOiAnYXB1bHNhdG9yPWh6PTEnLFxuICAgIHN1YmJvb3N0OiAnYXN1YmJvb3N0JyxcbiAgICBrYXJhb2tlOiAnc3RlcmVvdG9vbHM9bWxldj0wLjAzJyxcbiAgICBmbGFuZ2VyOiAnZmxhbmdlcicsXG4gICAgZ2F0ZTogJ2FnYXRlJyxcbiAgICBoYWFzOiAnaGFhcycsXG4gICAgbWNvbXBhbmQ6ICdtY29tcGFuZCcsXG4gICAgbW9ubzogJ3Bhbj1tb25vfGMwPS41KmMwKy41KmMxJyxcbiAgICBtc3RscjogJ3N0ZXJlb3Rvb2xzPW1vZGU9bXM+bHInLFxuICAgIG1zdHJyOiAnc3RlcmVvdG9vbHM9bW9kZT1tcz5ycicsXG4gICAgY29tcHJlc3NvcjogJ2NvbXBhbmQ9cG9pbnRzPS04MC8tMTA1fC02Mi8tODB8LTE1LjQvLTE1LjR8MC8tMTJ8MjAvLTcuNicsXG4gICAgZXhwYW5kZXI6XG4gICAgJ2NvbXBhbmQ9YXR0YWNrcz0wOnBvaW50cz0tODAvLTE2OXwtNTQvLTgwfC00OS41Ly02NC42fC00MS4xLy00MS4xfC0yNS44Ly0xNXwtMTAuOC8tNC41fDAvMHwyMC84LjMnLFxuICAgIHNvZnRsaW1pdGVyOlxuICAgICdjb21wYW5kPWF0dGFja3M9MDpwb2ludHM9LTgwLy04MHwtMTIuNC8tMTIuNHwtNi8tOHwwLy02Ljh8MjAvLTIuOCcsXG4gICAgY2hvcnVzOiAnY2hvcnVzPTAuNzowLjk6NTU6MC40OjAuMjU6MicsXG4gICAgY2hvcnVzMmQ6ICdjaG9ydXM9MC42OjAuOTo1MHw2MDowLjR8MC4zMjowLjI1fDAuNDoyfDEuMycsXG4gICAgY2hvcnVzM2Q6ICdjaG9ydXM9MC41OjAuOTo1MHw2MHw0MDowLjR8MC4zMnwwLjM6MC4yNXwwLjR8MC4zOjJ8Mi4zfDEuMycsXG4gICAgZmFkZWluOiAnYWZhZGU9dD1pbjpzcz0wOmQ9MTAnLFxuICAgIGRpbTogYGFmZnRmaWx0PVwiJ3JlYWw9cmUgKiAoMS1jbGlwKChiL25iKSpiLDAsMSkpJzppbWFnPSdpbSAqICgxLWNsaXAoKGIvbmIpKmIsMCwxKSknXCJgLFxuICAgIGVhcnJhcGU6ICdjaGFubmVsc3BsaXQsc2lkZWNoYWluZ2F0ZT1sZXZlbF9pbj02NCcsXG4gICAgc2lsZW5jZXJlbW92ZTogJ3NpbGVuY2VyZW1vdmU9MTowOi01MGRCJ1xuICB9O1xuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0PEsgZXh0ZW5kcyBGaWx0ZXJzTmFtZT4obmFtZTogSykge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcnNbbmFtZV0gPz8gbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaGFzPEsgZXh0ZW5kcyBGaWx0ZXJzTmFtZT4obmFtZTogSykge1xuICAgIHJldHVybiBuYW1lIGluIHRoaXMuZmlsdGVycztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgKltTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8e1xuICAgIG5hbWU6IEZpbHRlcnNOYW1lO1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gIH0+IHtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmZpbHRlcnMpKSB7XG4gICAgICB5aWVsZCB7IG5hbWU6IGsgYXMgRmlsdGVyc05hbWUsIHZhbHVlOiB2IGFzIHN0cmluZyB9O1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IG5hbWVzKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcnMpIGFzIEZpbHRlcnNOYW1lW107XG4gIH1cblxuICAvLyBAdHMtaWdub3JlXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IGxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lcy5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWVzLm1hcCgobSkgPT4gKHRoaXMgYXMgYW55KVttXSkuam9pbignLCcpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgZmZtcGVnIGFyZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbHRlcnMgbmFtZVxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgbmFtZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGU8SyBleHRlbmRzIEZpbHRlcnNOYW1lPihmaWx0ZXJzPzogKEsgfCBzdHJpbmcpW10pIHtcbiAgICBpZiAoIWZpbHRlcnMgfHwgIUFycmF5LmlzQXJyYXkoZmlsdGVycykpIHJldHVybiB0aGlzLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIGZpbHRlcnMuXG4gICAgZmlsdGVyKChwcmVkaWNhdGUpID0+IHR5cGVvZiBwcmVkaWNhdGUgPT09ICdzdHJpbmcnKS5cbiAgICBtYXAoKG0pID0+IHRoaXMuZ2V0KG0gYXMgSykpLlxuICAgIGpvaW4oJywnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGF1ZGlvIGZpbHRlclxuICAgKiBAcGFyYW0gZmlsdGVyTmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsdGVyXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgZmZtcGVnIGFyZ3NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZGVmaW5lKGZpbHRlck5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZmlsdGVyc1tmaWx0ZXJOYW1lIGFzIEZpbHRlcnNOYW1lXSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZXMgbXVsdGlwbGUgYXVkaW8gZmlsdGVyc1xuICAgKiBAcGFyYW0gZmlsdGVyc0FycmF5IEFycmF5IG9mIGZpbHRlcnMgY29udGFpbmluZyB0aGUgZmlsdGVyIG5hbWUgYW5kIGZmbXBlZyBhcmdzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGRlZmluZUJ1bGsoZmlsdGVyc0FycmF5OiB7bmFtZTogc3RyaW5nO3ZhbHVlOiBzdHJpbmc7fVtdKSB7XG4gICAgZmlsdGVyc0FycmF5LmZvckVhY2goKGFycikgPT4gdGhpcy5kZWZpbmUoYXJyLm5hbWUsIGFyci52YWx1ZSkpO1xuICB9XG59IiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8vIEB0cy1ub2NoZWNrXG5cbmltcG9ydCB7IENoYW5uZWxUeXBlLCBHYXRld2F5RGlzcGF0Y2hFdmVudHMgfSBmcm9tICdkaXNjb3JkLWFwaS10eXBlcy92MTAnO1xuaW1wb3J0IHsgY3JlYXRlQ29tcGF0Q2xpZW50IH0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuXG5pbXBvcnQgdHlwZSB7IERpc2NvcmRHYXRld2F5QWRhcHRlckNyZWF0b3IgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHtcbiAgQ2xpZW50LFxuICBHYXRld2F5Vm9pY2VTZXJ2ZXJVcGRhdGVEaXNwYXRjaERhdGEsXG4gIEdhdGV3YXlWb2ljZVN0YXRlVXBkYXRlRGlzcGF0Y2hEYXRhLFxuICBWb2ljZVN0YXRlIH0gZnJvbVxuJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHR5cGUgT2NlYW5pYyBmcm9tICdvY2VhbmljLmpzJztcblxudHlwZSBPY2VhbmljVXNlclJlc29sdmFibGUgPSBPY2VhbmljLlVzZXIgfCBzdHJpbmcgfCBPY2VhbmljLk1lbWJlcjtcbnR5cGUgT2NlYW5pY0d1aWxkUmVzb2x2YWJsZSA9XG5PY2VhbmljLkd1aWxkIHxcbnN0cmluZyB8XG5PY2VhbmljLk1lbWJlciB8XG5PY2VhbmljLkd1aWxkQ2hhbm5lbCB8XG5PY2VhbmljLlJvbGU7XG50eXBlIE9jZWFuaWNDaGFubmVsUmVzb2x2YWJsZSA9IE9jZWFuaWMuR3VpbGRDaGFubmVsIHwgc3RyaW5nO1xuXG5jb25zdCBEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sID0gU3ltYm9sKCdEaXNjb3JkUGxheWVyQ2xpZW50Jyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc09jZWFuaWNDbGllbnQoY2xpZW50OiBhbnkpOiBjbGllbnQgaXMgT2NlYW5pYy5DbGllbnQge1xuICBjb25zdCB7IG1vZHVsZSwgZXJyb3IgfSA9IFV0aWwucmVxdWlyZSgnb2NlYW5pYy5qcycpO1xuXG4gIGlmIChlcnJvcikgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IG9jZWFuaWMgPSBtb2R1bGUgYXMgdHlwZW9mIGltcG9ydCgnb2NlYW5pYy5qcycpO1xuXG4gIHJldHVybiBjbGllbnQgaW5zdGFuY2VvZiBvY2VhbmljLkNsaWVudDtcbn1cblxuZnVuY3Rpb24gZGVjbGFyZVByb3BlcnR5KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IFQge1xuICBSZWZsZWN0LnNldCh0YXJnZXQsIGtleSwgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiBnZXRQcm9wZXJ0eTxUPih0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcpOiBUIHtcbiAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwga2V5KTtcbn1cblxuLyoqXG4gKiBBbGxvd3MgT2NlYW5pYy5qcyBjbGllbnRzIHRvIGJlIHVzZWQgd2l0aCBkaXNjb3JkLXBsYXllci4gV2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGRpc2NvcmQtcGxheWVyIGNyZWF0ZXMgYSBwcm94eSBvYmplY3QgdGhhdCBpbnRlcmNlcHRzIGNlcnRhaW4gbWV0aG9kcyBhbmQgcHJvcGVydGllcyB0byBtYWtlIGl0IGNvbXBhdGlibGUgd2l0aCBkaXNjb3JkLXBsYXllci5cbiAqIEBwYXJhbSBjbGllbnQgVGhlIE9jZWFuaWMuanMgY2xpZW50IHRvIGJlIHVzZWQuXG4gKiBAcmV0dXJucyBUaGUgT2NlYW5pYy5qcyBjbGllbnQgd2l0aCBkaXNjb3JkLXBsYXllciBjb21wYXRpYmlsaXR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlT2NlYW5pY0NvbXBhdChjbGllbnQ6IE9jZWFuaWMuQ2xpZW50KTogQ2xpZW50IHtcbiAgY29uc3QgeyBtb2R1bGUsIGVycm9yIH0gPSBVdGlsLnJlcXVpcmUoJ29jZWFuaWMuanMnKTtcblxuICBpZiAoZXJyb3IpIHRocm93IGVycm9yO1xuXG4gIGNvbnN0IG9jZWFuaWMgPSBtb2R1bGUgYXMgdHlwZW9mIGltcG9ydCgnb2NlYW5pYy5qcycpO1xuXG4gIG9jZWFuaWNWb2ljZUV2ZW50c0hhbmRsZXIoY2xpZW50KTtcblxuICBjb25zdCBvY2VhbmljUHJveHkgPSBuZXcgUHJveHkoY2xpZW50LCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgc3dpdGNoIChwKSB7XG4gICAgICAgIGNhc2UgJ3VzZXJzJzpcbiAgICAgICAgICByZXR1cm4gb2NlYW5pY1VzZXJzUHJveHkodGFyZ2V0LCBvY2VhbmljKTtcbiAgICAgICAgY2FzZSAnZ3VpbGRzJzpcbiAgICAgICAgICByZXR1cm4gb2NlYW5pY0d1aWxkc1Byb3h5KHRhcmdldCwgb2NlYW5pYyk7XG4gICAgICAgIGNhc2UgJ2NoYW5uZWxzJzpcbiAgICAgICAgICByZXR1cm4gb2NlYW5pY0NoYW5uZWxzUHJveHkodGFyZ2V0LCBvY2VhbmljKTtcbiAgICAgICAgY2FzZSAnX19kcF92b2ljZVN0YXRlVXBkYXRlX3Byb3h5JzpcbiAgICAgICAgICByZXR1cm4gKGhhbmRsZXI6IChhLCBiKSA9PiB2b2lkKSA9PlxuICAgICAgICAgIG9jZWFuaWNWb2ljZVN0YXRlVXBkYXRlUHJveHkodGFyZ2V0LCBvY2VhbmljUHJveHksIGhhbmRsZXIpO1xuICAgICAgICBjYXNlICdpbmNyZW1lbnRNYXhMaXN0ZW5lcnMnOlxuICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgICBjbGllbnQuc2V0TWF4TGlzdGVuZXJzKGNsaWVudC5nZXRNYXhMaXN0ZW5lcnMoKSArIDEpO1xuICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgJ2RlY3JlbWVudE1heExpc3RlbmVycyc6XG4gICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGNsaWVudC5nZXRNYXhMaXN0ZW5lcnMoKSAtIDE7XG5cbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGF0Y2hpbmdcbiAgICAgICAgICAgIGNsaWVudC5zZXRNYXhMaXN0ZW5lcnMobGlzdGVuZXJzIDwgMCA/IDEgOiBsaXN0ZW5lcnMpO1xuICAgICAgICAgIH07XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgICAgIHJldHVybiB0YXJnZXRbcF07XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBSZWZsZWN0LnNldChvY2VhbmljUHJveHksIERpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wsICdPY2VhbmljJyk7XG5cbiAgcmV0dXJuIGNyZWF0ZUNvbXBhdENsaWVudChvY2VhbmljUHJveHksICdPY2VhbmljJykuXG4gIGNsaWVudCBhcyB1bmtub3duIGFzIENsaWVudDtcbn1cblxuZnVuY3Rpb24gb2NlYW5pY1ZvaWNlU3RhdGVVcGRhdGVQcm94eShcbmNsaWVudDogT2NlYW5pYy5DbGllbnQsXG5wcm94eTogT2NlYW5pYy5DbGllbnQsXG5oYW5kbGVyOiAoYSwgYikgPT4gdm9pZClcbntcbiAgY2xpZW50Lm9uKCd2b2ljZVN0YXRlVXBkYXRlJywgKG1lbWJlciwgb2xkU3RhdGUpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJveGllZE9sZFN0YXRlID0ge1xuICAgICAgICBjaGFubmVsSWQ6IG9sZFN0YXRlLmNoYW5uZWxJRCxcbiAgICAgICAgc2VydmVyTXV0ZTogb2xkU3RhdGUubXV0ZSxcbiAgICAgICAgc3VwcHJlc3M6IG9sZFN0YXRlLnN1cHByZXNzLFxuICAgICAgICBndWlsZDoge1xuICAgICAgICAgIGlkOiBvbGRTdGF0ZS5ndWlsZC5pZFxuICAgICAgICB9LFxuICAgICAgICBtZW1iZXI6IHtcbiAgICAgICAgICBpZDogb2xkU3RhdGUudXNlci5pZFxuICAgICAgICB9XG4gICAgICB9IGFzIFZvaWNlU3RhdGU7XG5cbiAgICAgIGNvbnN0IG1lID0gbWVtYmVyLmd1aWxkLm1lbWJlcnMuZ2V0KGNsaWVudC51c2VyLmlkKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkQ2hhbm5lbCA9IG1lbWJlci5ndWlsZC5jaGFubmVscy5nZXQoXG4gICAgICAgIG1lbWJlci52b2ljZVN0YXRlLmNoYW5uZWxJRFxuICAgICAgKTtcblxuICAgICAgY29uc3QgcHJveGllZE5ld1N0YXRlID0ge1xuICAgICAgICBjaGFubmVsSWQ6IG1lbWJlci52b2ljZVN0YXRlLmNoYW5uZWxJRCxcbiAgICAgICAgc2VydmVyTXV0ZTogbWVtYmVyLnZvaWNlU3RhdGUubXV0ZSxcbiAgICAgICAgc3VwcHJlc3M6IG1lbWJlci52b2ljZVN0YXRlLnN1cHByZXNzLFxuICAgICAgICBjaGFubmVsOiBvY2VhbmljUmVzb2x2ZWRDaGFubmVsUHJveHkocmVzb2x2ZWRDaGFubmVsLCBjbGllbnQpLFxuICAgICAgICBtZW1iZXI6IHtcbiAgICAgICAgICBpZDogbWVtYmVyLmlkXG4gICAgICAgIH0sXG4gICAgICAgIGd1aWxkOiB7XG4gICAgICAgICAgaWQ6IG1lbWJlci5ndWlsZC5pZCxcbiAgICAgICAgICBtZW1iZXJzOiB7XG4gICAgICAgICAgICBtZToge1xuICAgICAgICAgICAgICBpZDogbWU/LmlkLFxuICAgICAgICAgICAgICB2b2ljZToge1xuICAgICAgICAgICAgICAgIGFzeW5jIHNldFJlcXVlc3RUb1NwZWFrKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgICAgICAgICAgICB2b2lkIHZhbHVlO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lPy52b2ljZVN0YXRlO1xuICAgICAgICAgICAgICAgICAgLy8gaWYgKG1lKSB7XG4gICAgICAgICAgICAgICAgICAvLyAgIHJldHVybiBtZS52b2ljZS5zZXRSZXF1ZXN0VG9TcGVhayh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGFzIFZvaWNlU3RhdGU7XG5cbiAgICAgIHJldHVybiBoYW5kbGVyKHByb3hpZWROZXdTdGF0ZSwgcHJveGllZE9sZFN0YXRlKTtcbiAgICB9IGNhdGNoIHtcblxuICAgICAgLyogbm9vcCAqL31cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9jZWFuaWNWb2ljZUV2ZW50c0hhbmRsZXIoY2xpZW50OiBPY2VhbmljLkNsaWVudCkge1xuICBsZXQgYWRhcHRlcnMgPSBnZXRQcm9wZXJ0eTxNYXA8c3RyaW5nLCBhbnk+PihjbGllbnQsICdhZGFwdGVycycpO1xuXG4gIGlmICghYWRhcHRlcnMpIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICBhZGFwdGVycyA9IGNvbGxlY3Rpb247XG4gICAgZGVjbGFyZVByb3BlcnR5KGNsaWVudCwgJ2FkYXB0ZXJzJywgY29sbGVjdGlvbik7XG4gIH1cblxuICBjbGllbnQub24oJ3NoYXJkRGlzY29ubmVjdCcsIChfLCBzaGFyZElkKSA9PiB7XG4gICAgZm9yIChjb25zdCBbZ3VpbGRJZCwgYWRhcHRlcl0gb2YgYWRhcHRlcnMuZW50cmllcygpKSB7XG4gICAgICBpZiAoY2xpZW50Lmd1aWxkcy5nZXQoZ3VpbGRJZCk/LnNoYXJkLmlkID09PSBzaGFyZElkKSB7XG4gICAgICAgIGFkYXB0ZXIuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgY2xpZW50Lm9uKCdwYWNrZXQnLCAocGFja2V0KSA9PiB7XG4gICAgc3dpdGNoIChwYWNrZXQudCkge1xuICAgICAgY2FzZSBHYXRld2F5RGlzcGF0Y2hFdmVudHMuVm9pY2VTZXJ2ZXJVcGRhdGU6e1xuICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBwYWNrZXQuZCBhcyBHYXRld2F5Vm9pY2VTZXJ2ZXJVcGRhdGVEaXNwYXRjaERhdGE7XG4gICAgICAgICAgYWRhcHRlcnMuZ2V0KHBheWxvYWQuZ3VpbGRfaWQpPy5vblZvaWNlU2VydmVyVXBkYXRlKHBheWxvYWQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgY2FzZSBHYXRld2F5RGlzcGF0Y2hFdmVudHMuVm9pY2VTdGF0ZVVwZGF0ZTp7XG4gICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHBhY2tldC5kIGFzIEdhdGV3YXlWb2ljZVN0YXRlVXBkYXRlRGlzcGF0Y2hEYXRhO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgIHBheWxvYWQuZ3VpbGRfaWQgJiZcbiAgICAgICAgICBwYXlsb2FkLnNlc3Npb25faWQgJiZcbiAgICAgICAgICBwYXlsb2FkLnVzZXJfaWQgPT09IGNsaWVudC51c2VyLmlkKVxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkYXB0ZXJzLmdldChwYXlsb2FkLmd1aWxkX2lkKT8ub25Wb2ljZVN0YXRlVXBkYXRlKHBheWxvYWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gb2NlYW5pY0NoYW5uZWxzUHJveHkoXG5jbGllbnQ6IE9jZWFuaWMuQ2xpZW50LFxub2NlYW5pYzogdHlwZW9mIGltcG9ydCgnb2NlYW5pYy5qcycpKVxue1xuICBjb25zdCBoYW5kbGVyID0ge1xuICAgIGNsaWVudCxcbiAgICBnZXQgY2FjaGUoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBnZXQoaWQ6IHN0cmluZykge1xuICAgICAgICAgIHJldHVybiBjbGllbnQuZ2V0Q2hhbm5lbChpZCk7XG4gICAgICAgIH0sXG4gICAgICAgIGhhcyhpZDogc3RyaW5nKSB7XG4gICAgICAgICAgcmV0dXJuIGlkIGluIGNsaWVudC5jaGFubmVsR3VpbGRNYXA7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcbiAgICByZXNvbHZlKHJlc29sdmFibGU6IHN0cmluZyB8IE9jZWFuaWNDaGFubmVsUmVzb2x2YWJsZSkge1xuICAgICAgaWYgKHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gb2NlYW5pY1Jlc29sdmVkQ2hhbm5lbFByb3h5KFxuICAgICAgICAgIHRoaXMuY2xpZW50LmdldENoYW5uZWwocmVzb2x2YWJsZSkgYXMgT2NlYW5pYy5HdWlsZENoYW5uZWwsXG4gICAgICAgICAgY2xpZW50XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNvbHZhYmxlIGluc3RhbmNlb2Ygb2NlYW5pYy5HdWlsZENoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuIG9jZWFuaWNSZXNvbHZlZENoYW5uZWxQcm94eShyZXNvbHZhYmxlLCBjbGllbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcmVzb2x2ZUlkKHJlc29sdmFibGU6IE9jZWFuaWNDaGFubmVsUmVzb2x2YWJsZSkge1xuICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucmVzb2x2ZShyZXNvbHZhYmxlKTtcbiAgICAgIHJldHVybiBjaGFubmVsPy5pZDtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIGhhbmRsZXI7XG59XG5cbmZ1bmN0aW9uIG9jZWFuaWNSZXNvbHZlZENoYW5uZWxQcm94eShcbmNoYW5uZWw6IE9jZWFuaWMuR3VpbGRDaGFubmVsIHwgdW5kZWZpbmVkLFxuY2xpZW50OiBPY2VhbmljLkNsaWVudClcbjogT2NlYW5pYy5HdWlsZENoYW5uZWwgfCB1bmRlZmluZWQge1xuICBpZiAoIWNoYW5uZWwpIHJldHVybjtcblxuICByZXR1cm4gbmV3IFByb3h5KGNoYW5uZWwsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBzd2l0Y2ggKHApIHtcbiAgICAgICAgY2FzZSAnZ3VpbGQnOlxuICAgICAgICAgIHJldHVybiBvY2VhbmljVm9pY2VBZGFwdGVyUHJveHkodGFyZ2V0Lmd1aWxkLCBjbGllbnQpO1xuICAgICAgICBjYXNlICdtZW1iZXJzJzpcbiAgICAgICAgICByZXR1cm4gKHRhcmdldCBhcyBPY2VhbmljLlZvaWNlQ2hhbm5lbCkudm9pY2VNZW1iZXJzO1xuICAgICAgICBjYXNlICdpc1ZvaWNlQmFzZWQnOlxuICAgICAgICAgIHJldHVybiAoKSA9PlxuICAgICAgICAgIHRhcmdldC50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFZvaWNlIHx8XG4gICAgICAgICAgdGFyZ2V0LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZTtcbiAgICAgICAgY2FzZSAnaXNWb2ljZSc6XG4gICAgICAgICAgcmV0dXJuICgpID0+IHRhcmdldC50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFZvaWNlO1xuICAgICAgICBjYXNlICdpc1N0YWdlJzpcbiAgICAgICAgICByZXR1cm4gKCkgPT4gdGFyZ2V0LnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvY2VhbmljVm9pY2VBZGFwdGVyUHJveHkoXG5ndWlsZDogT2NlYW5pYy5HdWlsZCB8IHVuZGVmaW5lZCxcbmNsaWVudDogT2NlYW5pYy5DbGllbnQpXG46IE9jZWFuaWMuR3VpbGQgfCB1bmRlZmluZWQge1xuICBpZiAoIWd1aWxkKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm94eShndWlsZCwge1xuICAgIGdldCh0YXJnZXQsIHApIHtcbiAgICAgIGlmIChwID09PSAndm9pY2VBZGFwdGVyQ3JlYXRvcicpIHtcbiAgICAgICAgcmV0dXJuIG9jZWFuaWNWb2ljZUFkYXB0ZXJDcmVhdG9yKHRhcmdldCwgY2xpZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXRjaGluZ1xuICAgICAgcmV0dXJuIHRhcmdldFtwXTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvY2VhbmljVm9pY2VBZGFwdGVyQ3JlYXRvcihcbmd1aWxkOiBPY2VhbmljLkd1aWxkLFxuY2xpZW50OiBPY2VhbmljLkNsaWVudClcbjogRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvciB7XG4gIHJldHVybiAobWV0aG9kcykgPT4ge1xuICAgIGxldCBhZGFwdGVycyA9IGdldFByb3BlcnR5PE1hcDxzdHJpbmcsIHR5cGVvZiBtZXRob2RzPj4oY2xpZW50LCAnYWRhcHRlcnMnKTtcblxuICAgIGlmICghYWRhcHRlcnMpIHtcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBuZXcgTWFwPHN0cmluZywgdHlwZW9mIG1ldGhvZHM+KCk7XG4gICAgICBhZGFwdGVycyA9IGNvbGxlY3Rpb247XG4gICAgICBkZWNsYXJlUHJvcGVydHkoY2xpZW50LCAnYWRhcHRlcnMnLCBjb2xsZWN0aW9uKTtcbiAgICB9XG5cbiAgICBhZGFwdGVycy5zZXQoZ3VpbGQuaWQsIG1ldGhvZHMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbmRQYXlsb2FkKHBheWxvYWQpIHtcbiAgICAgICAgaWYgKGd1aWxkLnNoYXJkLnN0YXR1cyAhPT0gJ3JlYWR5JykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBndWlsZC5zaGFyZC5zZW5kKHBheWxvYWQub3AsIHBheWxvYWQuZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcbiAgICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGFkYXB0ZXJzLmRlbGV0ZShndWlsZC5pZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb2NlYW5pY0d1aWxkc1Byb3h5KFxuY2xpZW50OiBPY2VhbmljLkNsaWVudCxcbm9jZWFuaWM6IHR5cGVvZiBpbXBvcnQoJ29jZWFuaWMuanMnKSlcbntcbiAgcmV0dXJuIG5ldyBQcm94eShjbGllbnQuZ3VpbGRzLCB7XG4gICAgZ2V0KHRhcmdldCwgcCkge1xuICAgICAgaWYgKHAgPT09ICdjYWNoZScpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH1cblxuICAgICAgaWYgKHAgPT09ICdyZXNvbHZlJyB8fCBwID09PSAncmVzb2x2ZUlkJykge1xuICAgICAgICBjb25zdCByZXNvbHZlciA9IGZ1bmN0aW9uIChyZXNvbHZhYmxlOiBPY2VhbmljR3VpbGRSZXNvbHZhYmxlKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXNvbHZhYmxlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5nZXQocmVzb2x2YWJsZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlc29sdmFibGUgaW5zdGFuY2VvZiBvY2VhbmljLkd1aWxkKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2YWJsZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgcmVzb2x2YWJsZSBpbnN0YW5jZW9mIG9jZWFuaWMuTWVtYmVyIHx8XG4gICAgICAgICAgcmVzb2x2YWJsZSBpbnN0YW5jZW9mIG9jZWFuaWMuR3VpbGQgfHxcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2Ygb2NlYW5pYy5HdWlsZENoYW5uZWwgfHxcbiAgICAgICAgICByZXNvbHZhYmxlIGluc3RhbmNlb2Ygb2NlYW5pYy5Sb2xlKVxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZhYmxlLmd1aWxkO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAocCA9PT0gJ3Jlc29sdmUnKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChyZXNvbHZhYmxlOiBPY2VhbmljR3VpbGRSZXNvbHZhYmxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgZ3VpbGQgPSByZXNvbHZlcihyZXNvbHZhYmxlKTtcbiAgICAgICAgICByZXR1cm4gZ3VpbGQ/LmlkO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9jZWFuaWNVc2Vyc1Byb3h5KFxuY2xpZW50OiBPY2VhbmljLkNsaWVudCxcbm9jZWFuaWM6IHR5cGVvZiBpbXBvcnQoJ29jZWFuaWMuanMnKSlcbntcbiAgcmV0dXJuIG5ldyBQcm94eShjbGllbnQudXNlcnMsIHtcbiAgICBnZXQodGFyZ2V0LCBwKSB7XG4gICAgICBpZiAocCA9PT0gJ2NhY2hlJykge1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfVxuXG4gICAgICBpZiAocCA9PT0gJ3Jlc29sdmUnIHx8IHAgPT09ICdyZXNvbHZlSWQnKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVyID0gZnVuY3Rpb24gKHJlc29sdmFibGU6IE9jZWFuaWNVc2VyUmVzb2x2YWJsZSkge1xuICAgICAgICAgIGlmICh0eXBlb2YgcmVzb2x2YWJsZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQuZ2V0KHJlc29sdmFibGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZXNvbHZhYmxlIGluc3RhbmNlb2Ygb2NlYW5pYy5Vc2VyKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2YWJsZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzb2x2YWJsZSBpbnN0YW5jZW9mIG9jZWFuaWMuTWVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2YWJsZS51c2VyO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAocCA9PT0gJ3Jlc29sdmUnKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChyZXNvbHZhYmxlOiBPY2VhbmljVXNlclJlc29sdmFibGUpID0+IHtcbiAgICAgICAgICBjb25zdCB1c2VyID0gcmVzb2x2ZXIocmVzb2x2YWJsZSk7XG4gICAgICAgICAgcmV0dXJuIHVzZXI/LmlkO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHBhdGNoaW5nXG4gICAgICByZXR1cm4gdGFyZ2V0W3BdO1xuICAgIH1cbiAgfSk7XG59IiwgImltcG9ydCB7IERlZmF1bHRMaXN0ZW5lciB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBMaXN0ZW5lclNpZ25hdHVyZSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4vVXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBQbGF5ZXJFdmVudHNFbWl0dGVyPFxuICBMIGV4dGVuZHMgTGlzdGVuZXJTaWduYXR1cmU8TD4gPSBEZWZhdWx0TGlzdGVuZXI+IGV4dGVuZHNcbkV2ZW50RW1pdHRlcjxMPiB7XG4gICNoYXNEZWJ1Z2dlciA9IGZhbHNlO1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlcXVpcmVkRXZlbnRzOiBBcnJheTxrZXlvZiBMPiA9IFtdKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbjxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICBpZiAobmFtZSA9PT0gJ2RlYnVnJykge1xuICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5vbihuYW1lLCBsaXN0ZW5lcik7XG4gIH1cblxuICBwdWJsaWMgb25jZTxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICBpZiAobmFtZSA9PT0gJ2RlYnVnJykge1xuICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5vbmNlKG5hbWUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRMaXN0ZW5lcjxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgbGlzdGVuZXI6IExbS10pIHtcbiAgICBpZiAobmFtZSA9PT0gJ2RlYnVnJykge1xuICAgICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5hZGRMaXN0ZW5lcihuYW1lLCBsaXN0ZW5lcik7XG4gIH1cblxuICBwdWJsaWMgb2ZmPEsgZXh0ZW5kcyBrZXlvZiBMPihuYW1lOiBLLCBsaXN0ZW5lcjogTFtLXSkge1xuICAgIHRoaXMuI2hhc0RlYnVnZ2VyID0gdGhpcy5saXN0ZW5lckNvdW50KCdkZWJ1ZycgYXMgSykgPiAwO1xuXG4gICAgcmV0dXJuIHN1cGVyLm9mZihuYW1lLCBsaXN0ZW5lcik7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlTGlzdGVuZXI8SyBleHRlbmRzIGtleW9mIEw+KG5hbWU6IEssIGxpc3RlbmVyOiBMW0tdKSB7XG4gICAgdGhpcy4jaGFzRGVidWdnZXIgPSB0aGlzLmxpc3RlbmVyQ291bnQoJ2RlYnVnJyBhcyBLKSA+IDA7XG5cbiAgICByZXR1cm4gc3VwZXIucmVtb3ZlTGlzdGVuZXIobmFtZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUFsbExpc3RlbmVyczxLIGV4dGVuZHMga2V5b2YgTD4obmFtZT86IEspIHtcbiAgICB0aGlzLiNoYXNEZWJ1Z2dlciA9IHRoaXMubGlzdGVuZXJDb3VudCgnZGVidWcnIGFzIEspID4gMDtcblxuICAgIHJldHVybiBzdXBlci5yZW1vdmVBbGxMaXN0ZW5lcnMobmFtZSk7XG4gIH1cblxuICBwdWJsaWMgZW1pdDxLIGV4dGVuZHMga2V5b2YgTD4obmFtZTogSywgLi4uYXJnczogUGFyYW1ldGVyczxMW0tdPikge1xuICAgIGlmIChcbiAgICB0aGlzLnJlcXVpcmVkRXZlbnRzLmluY2x1ZGVzKG5hbWUpICYmXG4gICAgIXRoaXMuZXZlbnROYW1lcygpLmluY2x1ZGVzKG5hbWUpKVxuICAgIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmVycm9yKC4uLmFyZ3MpO1xuICAgICAgVXRpbC53YXJuKFxuICAgICAgICBgTm8gZXZlbnQgbGlzdGVuZXIgZm91bmQgZm9yIGV2ZW50IFwiJHtTdHJpbmcoXG4gICAgICAgICAgbmFtZVxuICAgICAgICApfVwiLiBFdmVudHMgJHt0aGlzLnJlcXVpcmVkRXZlbnRzLlxuICAgICAgICBtYXAoKG0pID0+IGBcIiR7U3RyaW5nKG0pfVwiYCkuXG4gICAgICAgIGpvaW4oJywgJyl9IG11c3QgaGF2ZSBldmVudCBsaXN0ZW5lcnMuYCxcbiAgICAgICAgJ1VuaGFuZGxlZEV2ZW50c1dhcm5pbmcnXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5lbWl0KG5hbWUsIC4uLmFyZ3MpO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNEZWJ1Z2dlcigpIHtcbiAgICByZXR1cm4gdGhpcy4jaGFzRGVidWdnZXI7XG4gIH1cbn0iLCAiaW1wb3J0IHsgVXNlciB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgUGxheWxpc3QgfSBmcm9tICcuLi9mYWJyaWMvUGxheWxpc3QnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gJy4vRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnaHR0cCc7XG5pbXBvcnQgeyBOb3RJbXBsZW1lbnRlZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgR3VpbGRRdWV1ZUhpc3RvcnkgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFBsYXllckV2ZW50cyB9IGZyb20gJy4uL1BsYXllcic7XG5cbmV4cG9ydCB0eXBlIEV4dHJhY3RvclN0cmVhbWFibGUgPVxuUmVhZGFibGUgfFxuc3RyaW5nIHxcbntcbiAgJGZtdDogc3RyaW5nO1xuICBzdHJlYW06IFJlYWRhYmxlO1xufTtcblxuZXhwb3J0IGNsYXNzIEJhc2VFeHRyYWN0b3I8VCBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ge1xuICAvKipcbiAgICogSWRlbnRpZmllciBmb3IgdGhpcyBleHRyYWN0b3JcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWRlbnRpZmllciA9ICdjb20uZGlzY29yZC1wbGF5ZXIuZXh0cmFjdG9yJztcblxuICAvKipcbiAgICogUHJpb3JpdHkgb2YgdGhpcyBleHRyYWN0b3IuIEhpZ2hlciB2YWx1ZSBtZWFucyBoaWdoZXIgcHJpb3JpdHkgKHdpbGwgYmUgZXhlY3V0ZWQgZmlyc3QpLlxuICAgKi9cbiAgcHVibGljIHByaW9yaXR5ID0gMTtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIHF1ZXJ5IHByb3RvY29scyB0aGF0IHRoaXMgZXh0cmFjdG9yIHN1cHBvcnRzLlxuICAgKi9cbiAgcHVibGljIHByb3RvY29sczogc3RyaW5nW10gPSBbXTtcblxuICAvKipcbiAgICogSGFuZGxlIGJyaWRnZSBxdWVyeSBjcmVhdGlvblxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGJ1aWxkIHF1ZXJ5IGZvclxuICAgKi9cbiAgcHVibGljIGNyZWF0ZUJyaWRnZVF1ZXJ5ID0gKHRyYWNrOiBUcmFjaykgPT5cbiAgYCR7dHJhY2sudGl0bGV9IGJ5ICR7dHJhY2suYXV0aG9yfSBvZmZpY2lhbCBhdWRpb2A7XG5cbiAgLyoqXG4gICAqIEV4dHJhY3RvciBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHRoYXQgaW5zdGFudGlhdGVkIHRoaXMgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSBvcHRpb25zIEluaXRpYWxpemF0aW9uIG9wdGlvbnMgZm9yIHRoaXMgZXh0cmFjdG9yXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gIHB1YmxpYyBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LFxuICBwdWJsaWMgb3B0aW9uczogVCA9IDxUPiB7fSlcbiAge31cblxuICAvKipcbiAgICogSWRlbnRpZmllciBvZiB0aGlzIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGdldCBpZGVudGlmaWVyKCkge1xuICAgIHJldHVybiAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgQmFzZUV4dHJhY3RvcikuaWRlbnRpZmllcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbmZpZ3VyZXMgdGhpcyBleHRyYWN0b3JcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG5ldyBvcHRpb25zIHRvIGFwcGx5XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVjb25maWd1cmUob3B0aW9uczogVCkge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgYXdhaXQgdGhpcy5kZWFjdGl2YXRlKCk7XG4gICAgYXdhaXQgdGhpcy5hY3RpdmF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGlzIGV4dHJhY3RvciBpcyBhY3RpdmF0ZWRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhY3RpdmF0ZSgpIHtcbiAgICAvLyBleGVjdXRlZCB3aGVuIHRoaXMgZXh0cmFjdG9yIGlzIGFjdGl2YXRlZFxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhpcyBleHRyYWN0b3IgaXMgZGVhY3RpdmF0ZWRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZWFjdGl2YXRlKCkge1xuICAgIC8vIGV4ZWN1dGVkIHdoZW4gdGhpcyBleHRyYWN0b3IgaXMgZGVhY3RpdmF0ZWRcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgaW5jb21pbmcgcXVlcnlcbiAgICogQHBhcmFtIHF1ZXJ5IFRoZSBxdWVyeSB0byB2YWxpZGF0ZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlKFxuICBxdWVyeTogc3RyaW5nLFxuICB0eXBlPzogU2VhcmNoUXVlcnlUeXBlIHwgbnVsbClcbiAgOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB2b2lkIHR5cGU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmVhbSB0aGUgZ2l2ZW4gdHJhY2tcbiAgICogQHBhcmFtIGluZm8gVGhlIHRyYWNrIHRvIHN0cmVhbVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN0cmVhbShpbmZvOiBUcmFjayk6IFByb21pc2U8RXh0cmFjdG9yU3RyZWFtYWJsZT4ge1xuICAgIHZvaWQgaW5mbztcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LnN0cmVhbSgpYCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHRoZSBnaXZlbiBxdWVyeVxuICAgKiBAcGFyYW0gcXVlcnkgVGhlIHF1ZXJ5IHRvIGhhbmRsZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGhhbmRsZShcbiAgcXVlcnk6IHN0cmluZyxcbiAgY29udGV4dDogRXh0cmFjdG9yU2VhcmNoQ29udGV4dClcbiAgOiBQcm9taXNlPEV4dHJhY3RvckluZm8+IHtcbiAgICB2b2lkIGNvbnRleHQ7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5oYW5kbGUoKWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZWxhdGVkIHRyYWNrcyBmb3IgdGhlIGdpdmVuIHRyYWNrXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgc291cmNlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVsYXRlZFRyYWNrcyhcbiAgdHJhY2s6IFRyYWNrLFxuICBoaXN0b3J5OiBHdWlsZFF1ZXVlSGlzdG9yeSlcbiAgOiBQcm9taXNlPEV4dHJhY3RvckluZm8+IHtcbiAgICB2b2lkIHRyYWNrO1xuICAgIHZvaWQgaGlzdG9yeTtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgIGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uZ2V0UmVsYXRlZFRyYWNrcygpYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQSBzdHJlYW0gbWlkZGxld2FyZSB0byBoYW5kbGUgc3RyZWFtcyBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGUgcGxheWVyXG4gICAqIEBwYXJhbSBzdHJlYW0gVGhlIGluY29taW5nIHN0cmVhbVxuICAgKiBAcGFyYW0gbmV4dCBUaGUgbmV4dCBmdW5jdGlvblxuICAgKi9cbiAgcHVibGljIGhhbmRsZVBvc3RTdHJlYW0oc3RyZWFtOiBSZWFkYWJsZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIG5leHQobnVsbCwgc3RyZWFtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBhbiBldmVudCB0byB0aGUgcGxheWVyXG4gICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gZGlzcGF0Y2hcbiAgICogQHBhcmFtIGFyZ3MgVGhlIGRhdGEgdG8gZGlzcGF0Y2hcbiAgICovXG4gIHB1YmxpYyBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBQbGF5ZXJFdmVudHM+KFxuICBldmVudDogSyxcbiAgLi4uYXJnczogUGFyYW1ldGVyczxQbGF5ZXJFdmVudHNbS10+KVxuICB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5wbGF5ZXIuZW1pdChldmVudCwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGV4dHJhY3RvciByZXNwb25zZVxuICAgKiBAcGFyYW0gcGxheWxpc3QgVGhlIHBsYXlsaXN0XG4gICAqIEBwYXJhbSB0cmFja3MgVGhlIHRyYWNrIGFycmF5XG4gICAqL1xuICBwdWJsaWMgY3JlYXRlUmVzcG9uc2UoXG4gIHBsYXlsaXN0PzogUGxheWxpc3QgfCBudWxsLFxuICB0cmFja3M6IFRyYWNrW10gPSBwbGF5bGlzdD8udHJhY2tzIHx8IFtdKVxuICA6IEV4dHJhY3RvckluZm8ge1xuICAgIHJldHVybiB7IHBsYXlsaXN0OiBwbGF5bGlzdCB8fCBudWxsLCB0cmFja3MgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZSBkZWJ1ZyBtZXNzYWdlXG4gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBkZWJ1ZyBtZXNzYWdlXG4gICAqL1xuICBwdWJsaWMgZGVidWcobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5wbGF5ZXIuZGVidWcobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQSBmbGFnIHRvIGluZGljYXRlIGBEZW11eGFibGVgIHN0cmVhbSBzdXBwb3J0IGZvciBgb3B1c2AvYG9nZy9vcHVzYC9gd2VibS9vcHVzYCBmb3JtYXRzLlxuICAgKi9cbiAgcHVibGljIGdldCBzdXBwb3J0c0RlbXV4KCkge1xuICAgIHJldHVybiAhIXRoaXMuY29udGV4dC5wbGF5ZXIub3B0aW9ucy5za2lwRkZtcGVnO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzdHJlYW0gZXh0cmFjdGlvbiBmb3IgYW5vdGhlciBleHRyYWN0b3JcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byBicmlkZ2VcbiAgICogQHBhcmFtIHNvdXJjZUV4dHJhY3RvciBUaGUgc291cmNlIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIGFzeW5jIGJyaWRnZShcbiAgdHJhY2s6IFRyYWNrLFxuICBzb3VyY2VFeHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IgfCBudWxsKVxuICA6IFByb21pc2U8RXh0cmFjdG9yU3RyZWFtYWJsZSB8IG51bGw+IHtcbiAgICB2b2lkIHNvdXJjZUV4dHJhY3RvcjtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBOZXh0RnVuY3Rpb24gPSAoZXJyb3I/OiBFcnJvciB8IG51bGwsIHN0cmVhbT86IFJlYWRhYmxlKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvckluZm8ge1xuICBwbGF5bGlzdDogUGxheWxpc3QgfCBudWxsO1xuICB0cmFja3M6IFRyYWNrW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yU2VhcmNoQ29udGV4dCB7XG4gIHR5cGU/OiBTZWFyY2hRdWVyeVR5cGUgfCBudWxsO1xuICByZXF1ZXN0ZWRCeT86IFVzZXIgfCBudWxsO1xuICByZXF1ZXN0T3B0aW9ucz86IFJlcXVlc3RPcHRpb25zO1xuICBwcm90b2NvbD86IHN0cmluZyB8IG51bGw7XG59IiwgImltcG9ydCB7IFBsYXllciB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEJhc2VFeHRyYWN0b3IsIEV4dHJhY3RvclN0cmVhbWFibGUgfSBmcm9tICcuL0Jhc2VFeHRyYWN0b3InO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgUGxheWVyRXZlbnRzRW1pdHRlciB9IGZyb20gJy4uL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXInO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAnLi4vaG9va3MnO1xuaW1wb3J0IHsgQnJpZGdlRmFpbGVkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RvclNlc3Npb24ge1xuICBpZDogc3RyaW5nO1xuICBhdHRlbXB0ZWRFeHRyYWN0b3JzOiBTZXQ8c3RyaW5nPjtcbiAgYnJpZGdlQXR0ZW1wdGVkRXh0cmFjdG9yczogU2V0PHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdG9yRXhlY3V0aW9uRXZlbnRzIHtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyByZWdpc3RlcmVkXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIGV4dHJhY3RvciB3YXMgcmVnaXN0ZXJlZFxuICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdGhhdCB3YXMgcmVnaXN0ZXJlZFxuICAgKi9cbiAgcmVnaXN0ZXJlZDogKFxuICBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LFxuICBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgdW5yZWdpc3RlcmVkXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIGV4dHJhY3RvciB3YXMgdW5yZWdpc3RlcmVkXG4gICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB0aGF0IHdhcyB1bnJlZ2lzdGVyZWRcbiAgICovXG4gIHVucmVnaXN0ZXJlZDogKFxuICBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LFxuICBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBleHRyYWN0b3IgaXMgYWN0aXZhdGVkXG4gICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIGV4dHJhY3RvciBUaGUgZXh0cmFjdG9yIHdoaWNoIHdhcyBhY3RpdmF0ZWRcbiAgICovXG4gIGFjdGl2YXRlOiAoXG4gIGNvbnRleHQ6IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQsXG4gIGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvcilcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGV4dHJhY3RvciBpcyBkZWFjdGl2YXRlZFxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBleHRyYWN0b3IgVGhlIGV4dHJhY3RvciB3aGljaCB3YXMgZGVhY3RpdmF0ZWRcbiAgICovXG4gIGRlYWN0aXZhdGU6IChcbiAgY29udGV4dDogRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCxcbiAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgZXh0cmFjdG9yIGZhaWxzIHRvIGFjdGl2YXRlL2RlYWN0aXZhdGVcbiAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBleHRyYWN0b3Igd2hpY2ggd2FzIGRlYWN0aXZhdGVkXG4gICAqL1xuICBlcnJvcjogKFxuICBjb250ZXh0OiBFeHRyYWN0b3JFeGVjdXRpb25Db250ZXh0LFxuICBleHRyYWN0b3I6IEJhc2VFeHRyYWN0b3IsXG4gIGVycm9yOiBFcnJvcilcbiAgPT4gdW5rbm93bjtcbn1cblxuZXhwb3J0IGNsYXNzIEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgZXh0ZW5kcyBQbGF5ZXJFdmVudHNFbWl0dGVyPEV4dHJhY3RvckV4ZWN1dGlvbkV2ZW50cz4ge1xuICAvKipcbiAgICogVGhlIGV4dHJhY3RvcnMgc3RvcmVcbiAgICovXG4gIHB1YmxpYyBzdG9yZSA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgQmFzZUV4dHJhY3Rvcj4oKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8RXh0cmFjdG9yU2Vzc2lvbj4oKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyKSB7XG4gICAgc3VwZXIoWydlcnJvciddKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGlkXG4gICAqL1xuICBwdWJsaWMgZ2V0RXhlY3V0aW9uSWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5jb25zdW1lKCk/LmlkID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0XG4gICAqL1xuICBwdWJsaWMgZ2V0Q29udGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0LmNvbnN1bWUoKSA/PyBudWxsO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvYWREZWZhdWx0KCkge1xuICAgIGNvbnN0IHNhbXBsZSA9IGBcXHRpbXBvcnQgeyBEZWZhdWx0RXh0cmFjdG9ycyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9leHRyYWN0b3InO1xcblxcdGF3YWl0IHBsYXllci5leHRyYWN0b3JzLmxvYWRNdWx0aShEZWZhdWx0RXh0cmFjdG9ycyk7YDtcblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBleHRyYWN0b3JzLmxvYWREZWZhdWx0KCkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gVXNlIGV4dHJhY3RvcnMubG9hZE11bHRpIGluc3RlYWQuIEV4YW1wbGU6XFxuJHtzYW1wbGV9XFxuYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIGJ1bmRsZSBvZiBleHRyYWN0b3JzLlxuICAgKiBAZXhhbXBsZSBpbXBvcnQgeyBEZWZhdWx0RXh0cmFjdG9ycyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9leHRyYWN0b3InO1xuICAgKlxuICAgKiBhd2FpdCBwbGF5ZXIuZXh0cmFjdG9ycy5sb2FkTXVsdGkoRGVmYXVsdEV4dHJhY3RvcnMpO1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWRNdWx0aTxcbiAgICBPIGV4dGVuZHMgb2JqZWN0LFxuICAgIFQgZXh0ZW5kcyAodHlwZW9mIEJhc2VFeHRyYWN0b3I8Tz4pW10sXG4gICAgUiBleHRlbmRzIFJlY29yZDxcbiAgICAgIFRbbnVtYmVyXVsnaWRlbnRpZmllciddLFxuICAgICAgQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFRbbnVtYmVyXT5bMV0+PihcblxuICBidW5kbGU6IFQsIG9wdGlvbnM6IFIgPSB7fSBhcyBSKSB7XG4gICAgYnVuZGxlLmZvckVhY2goKGV4dCkgPT4ge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5yZWdpc3RlcihleHQsIG9wdGlvbnM/LltleHQuaWRlbnRpZmllcl0gfHwge30pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZXJyb3I6IG51bGwgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBpZiB0aGUgZ2l2ZW4gZXh0cmFjdG9yIGlzIHJlZ2lzdGVyZWRcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGV4dHJhY3RvciBpZGVudGlmaWVyXG4gICAqL1xuICBwdWJsaWMgaXNSZWdpc3RlcmVkKGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmhhcyhpZGVudGlmaWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiByZWdpc3RlcmVkIGV4dHJhY3RvcnNcbiAgICovXG4gIHB1YmxpYyBnZXQgc2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzaW5nbGUgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBleHRyYWN0b3IgdG8gZ2V0XG4gICAqL1xuICBwdWJsaWMgZ2V0KGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldChpZGVudGlmaWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBzaW5nbGUgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSBfZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBzdXBwbGllZCB0byB0aGUgZXh0cmFjdG9yXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXI8TyBleHRlbmRzIG9iamVjdCwgVCBleHRlbmRzIHR5cGVvZiBCYXNlRXh0cmFjdG9yPE8+PihcbiAgX2V4dHJhY3RvcjogVCxcbiAgb3B0aW9uczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFQ+WycxJ10pXG4gIDogUHJvbWlzZTxJbnN0YW5jZVR5cGU8VD4gfCBudWxsPiB7XG4gICAgaWYgKFxuICAgIHR5cGVvZiBfZXh0cmFjdG9yLmlkZW50aWZpZXIgIT09ICdzdHJpbmcnIHx8XG4gICAgdGhpcy5zdG9yZS5oYXMoX2V4dHJhY3Rvci5pZGVudGlmaWVyKSlcblxuICAgIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGV4dHJhY3RvciA9IG5ldyBfZXh0cmFjdG9yKHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuc3RvcmUuc2V0KF9leHRyYWN0b3IuaWRlbnRpZmllciwgZXh0cmFjdG9yKTtcbiAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucGxheWVyLmRlYnVnKGAke19leHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGxvYWRlZCFgKTtcbiAgICAgIHRoaXMuZW1pdCgncmVnaXN0ZXJlZCcsIHRoaXMsIGV4dHJhY3Rvcik7XG4gICAgICBhd2FpdCBleHRyYWN0b3IuYWN0aXZhdGUoKTtcbiAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucGxheWVyLmRlYnVnKGAke19leHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGFjdGl2YXRlZCFgKTtcbiAgICAgIHRoaXMuZW1pdCgnYWN0aXZhdGUnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgcmV0dXJuIGV4dHJhY3RvciBhcyB1bmtub3duIGFzIEluc3RhbmNlVHlwZTxUPjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLnN0b3JlLmRlbGV0ZShfZXh0cmFjdG9yLmlkZW50aWZpZXIpO1xuICAgICAgaWYgKHRoaXMucGxheWVyLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoXG4gICAgICAgIGAke19leHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGZhaWxlZCB0byBhY3RpdmF0ZSEgRXJyb3I6ICR7ZX1gXG4gICAgICApO1xuICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIHRoaXMsIGV4dHJhY3RvciwgZSBhcyBFcnJvcik7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlciBzaW5nbGUgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSBfZXh0cmFjdG9yIFRoZSBleHRyYWN0b3IgdG8gdW5yZWdpc3RlclxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVucmVnaXN0ZXI8SyBleHRlbmRzIHN0cmluZyB8IEJhc2VFeHRyYWN0b3I+KF9leHRyYWN0b3I6IEspIHtcbiAgICBjb25zdCBleHRyYWN0b3IgPVxuICAgIHR5cGVvZiBfZXh0cmFjdG9yID09PSAnc3RyaW5nJyA/XG4gICAgdGhpcy5zdG9yZS5nZXQoX2V4dHJhY3RvcikgOlxuICAgIHRoaXMuc3RvcmUuZmluZCgocikgPT4gciA9PT0gX2V4dHJhY3Rvcik7XG4gICAgaWYgKCFleHRyYWN0b3IpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBrZXkgPVxuICAgICAgZXh0cmFjdG9yLmlkZW50aWZpZXIgfHwgdGhpcy5zdG9yZS5maW5kS2V5KChlKSA9PiBlID09PSBleHRyYWN0b3IpITtcbiAgICAgIHRoaXMuc3RvcmUuZGVsZXRlKGtleSk7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGRpc2FibGVkIWApO1xuICAgICAgdGhpcy5lbWl0KCd1bnJlZ2lzdGVyZWQnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgICAgYXdhaXQgZXh0cmFjdG9yLmRlYWN0aXZhdGUoKTtcbiAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucGxheWVyLmRlYnVnKGAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IgZGVhY3RpdmF0ZWQhYCk7XG4gICAgICB0aGlzLmVtaXQoJ2RlYWN0aXZhdGUnLCB0aGlzLCBleHRyYWN0b3IpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucGxheWVyLmRlYnVnKFxuICAgICAgICBgJHtleHRyYWN0b3IuaWRlbnRpZmllcn0gZXh0cmFjdG9yIGZhaWxlZCB0byBkZWFjdGl2YXRlIWBcbiAgICAgICk7XG4gICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgdGhpcywgZXh0cmFjdG9yLCBlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlciBhbGwgZXh0cmFjdG9yc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHVucmVnaXN0ZXJBbGwoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuc3RvcmUubWFwKChlKSA9PiB0aGlzLnVucmVnaXN0ZXIoZSkpKTtcbiAgICB9IGNhdGNoIHtcblxuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH19XG5cbiAgLyoqXG4gICAqIFJ1biBhbGwgdGhlIGV4dHJhY3RvcnNcbiAgICogQHBhcmFtIGZuIFRoZSBydW5uZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIGZpbHRlckJsb2NrZWQgRmlsdGVyIGJsb2NrZWQgZXh0cmFjdG9yc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJ1bjxUID0gdW5rbm93bj4oXG4gIGZuOiBFeHRyYWN0b3JFeGVjdXRpb25GTjxUPixcbiAgZmlsdGVyQmxvY2tlZCA9IHRydWUpXG4gIHtcbiAgICBjb25zdCBibG9ja2VkID0gdGhpcy5wbGF5ZXIub3B0aW9ucy5ibG9ja0V4dHJhY3RvcnMgPz8gW107XG5cbiAgICBpZiAoIXRoaXMuc3RvcmUuc2l6ZSkge1xuICAgICAgVXRpbC53YXJuKFxuICAgICAgICAnU2tpcHBpbmcgZXh0cmFjdG9ycyBleGVjdXRpb24gc2luY2UgemVybyBleHRyYWN0b3JzIHdlcmUgcmVnaXN0ZXJlZCcsXG4gICAgICAgICdOb0V4dHJhY3RvcnMnXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHNvcnQgYnkgcHJpb3JpdHkgc28gdGhhdCBleHRyYWN0b3JzIHdpdGggaGlnaGVyIHByaW9yaXR5IGFyZSBleGVjdXRlZCBmaXJzdFxuICAgIGNvbnN0IGV4dHJhY3RvcnMgPSB0aGlzLnN0b3JlLnNvcnQoKGEsIGIpID0+IGIucHJpb3JpdHkgLSBhLnByaW9yaXR5KTtcblxuICAgIGxldCBlcnI6IEVycm9yIHwgbnVsbCA9IG51bGwsXG4gICAgICBsYXN0RXh0OiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBleHRyYWN0b3JzLnZhbHVlcygpKSB7XG4gICAgICBpZiAoZmlsdGVyQmxvY2tlZCAmJiBibG9ja2VkLnNvbWUoKGUpID0+IGUgPT09IGV4dC5pZGVudGlmaWVyKSkgY29udGludWU7XG4gICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnBsYXllci5kZWJ1ZyhgRXhlY3V0aW5nIGV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfS4uLmApO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oZXh0KS50aGVuKFxuICAgICAgICAocmVzKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSxcbiAgICAgICAgKGUpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5wbGF5ZXIuaGFzRGVidWdnZXIpXG4gICAgICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoXG4gICAgICAgICAgICBgRXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9IGZhaWxlZCB3aXRoIGVycm9yOiAke2V9YFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4gVHlwZVV0aWwuaXNFcnJvcihlKSA/IGUgOiBuZXcgRXJyb3IoYCR7ZX1gKTtcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgbGFzdEV4dCA9IGV4dDtcblxuICAgICAgaWYgKHJlc3VsdCAmJiAhVHlwZVV0aWwuaXNFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgIGlmICh0aGlzLnBsYXllci5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoXG4gICAgICAgICAgYEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBleGVjdXRlZCBzdWNjZXNzZnVsbHkhYFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXh0cmFjdG9yOiBleHQsXG4gICAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgICAgcmVzdWx0XG4gICAgICAgIH0gYXMgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PFQ+O1xuICAgICAgfSBlbHNlIGlmIChUeXBlVXRpbC5pc0Vycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgZXJyID0gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlcnIpXG4gICAgcmV0dXJuIHtcbiAgICAgIGV4dHJhY3RvcjogbGFzdEV4dCEsXG4gICAgICBlcnJvcjogZXJyLFxuICAgICAgcmVzdWx0OiBmYWxzZVxuICAgIH0gYXMgRXh0cmFjdG9yRXhlY3V0aW9uUmVzdWx0PGZhbHNlPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IGJyaWRnZSBmb3IgYSB0cmFja1xuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIHJlcXVlc3QgYnJpZGdlIGZvclxuICAgKiBAcGFyYW0gc291cmNlRXh0cmFjdG9yIFRoZSBzb3VyY2UgZXh0cmFjdG9yIG9mIHRoZSB0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcXVlc3RCcmlkZ2UoXG4gIHRyYWNrOiBUcmFjayxcbiAgc291cmNlRXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCA9IHRyYWNrLmV4dHJhY3RvcilcbiAge1xuICAgIGNvbnN0IHByZXZpb3VzbHlBdHRlbXB0ZWQgPVxuICAgIHRoaXMuZ2V0Q29udGV4dCgpPy5icmlkZ2VBdHRlbXB0ZWRFeHRyYWN0b3JzID8/IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW48RXh0cmFjdG9yU3RyZWFtYWJsZT4oYXN5bmMgKGV4dCkgPT4ge1xuICAgICAgaWYgKHNvdXJjZUV4dHJhY3RvciAmJiBleHQuaWRlbnRpZmllciA9PT0gc291cmNlRXh0cmFjdG9yLmlkZW50aWZpZXIpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAocHJldmlvdXNseUF0dGVtcHRlZC5oYXMoZXh0LmlkZW50aWZpZXIpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHByZXZpb3VzbHlBdHRlbXB0ZWQuYWRkKGV4dC5pZGVudGlmaWVyKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXh0LmJyaWRnZSh0cmFjaywgc291cmNlRXh0cmFjdG9yKTtcblxuICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBmYWxzZTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIGlmICghcmVzdWx0Py5yZXN1bHQpXG4gICAgdGhyb3cgbmV3IEJyaWRnZUZhaWxlZEVycm9yKFxuICAgICAgdGhpcy5nZXRFeGVjdXRpb25JZCgpLFxuICAgICAgcmVzdWx0Py5lcnJvcj8uc3RhY2sgfHxcbiAgICAgIHJlc3VsdD8uZXJyb3I/Lm1lc3NhZ2UgfHxcbiAgICAgICdObyBleHRyYWN0b3JzIGF2YWlsYWJsZSB0byBicmlkZ2UnXG4gICAgKTtcblxuICAgIHRyYWNrLmJyaWRnZWRFeHRyYWN0b3IgPSByZXN1bHQuZXh0cmFjdG9yO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IGJyaWRnZSBmcm9tIHRoZSBzcGVjaWZpZWQgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gcmVxdWVzdCBicmlkZ2UgZm9yXG4gICAqIEBwYXJhbSBzb3VyY2VFeHRyYWN0b3IgVGhlIHNvdXJjZSBleHRyYWN0b3Igb2YgdGhlIHRyYWNrXG4gICAqIEBwYXJhbSB0YXJnZXRFeHRyYWN0b3IgVGhlIHRhcmdldCBleHRyYWN0b3IgdG8gYnJpZGdlIHRvXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVxdWVzdEJyaWRnZUZyb20oXG4gIHRyYWNrOiBUcmFjayxcbiAgc291cmNlRXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbCxcbiAgdGFyZ2V0RXh0cmFjdG9yOiBFeHRyYWN0b3JSZXNvbHZhYmxlKVxuICB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5yZXNvbHZlKHRhcmdldEV4dHJhY3Rvcik7XG4gICAgaWYgKCF0YXJnZXQpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0YXJnZXQuYnJpZGdlKHRyYWNrLCBzb3VyY2VFeHRyYWN0b3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGV4dHJhY3RvciBpcyBkaXNhYmxlZFxuICAgKi9cbiAgcHVibGljIGlzRGlzYWJsZWQoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyLm9wdGlvbnMuYmxvY2tFeHRyYWN0b3JzPy5pbmNsdWRlcyhpZGVudGlmaWVyKSA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBleHRyYWN0b3IgaXMgZW5hYmxlZFxuICAgKi9cbiAgcHVibGljIGlzRW5hYmxlZChpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gIXRoaXMuaXNEaXNhYmxlZChpZGVudGlmaWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGV4dHJhY3RvciBpZGVudGlmaWVyXG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZUlkKHJlc29sdmFibGU6IEV4dHJhY3RvclJlc29sdmFibGUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHJlc29sdmFibGUgPT09ICdzdHJpbmcnID8gcmVzb2x2YWJsZSA6IHJlc29sdmFibGUuaWRlbnRpZmllcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGV4dHJhY3RvclxuICAgKi9cbiAgcHVibGljIHJlc29sdmUocmVzb2x2YWJsZTogRXh0cmFjdG9yUmVzb2x2YWJsZSkge1xuICAgIHJldHVybiB0eXBlb2YgcmVzb2x2YWJsZSA9PT0gJ3N0cmluZycgPyB0aGlzLmdldChyZXNvbHZhYmxlKSA6IHJlc29sdmFibGU7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0b3JFeGVjdXRpb25SZXN1bHQ8VCA9IHVua25vd24+IHtcbiAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yO1xuICBlcnJvcjogRXJyb3IgfCBudWxsO1xuICByZXN1bHQ6IFQ7XG59XG5cbmV4cG9ydCB0eXBlIEV4dHJhY3RvckV4ZWN1dGlvbkZOPFQgPSB1bmtub3duPiA9IChcbmV4dHJhY3RvcjogQmFzZUV4dHJhY3Rvcilcbj0+IFByb21pc2U8VCB8IGJvb2xlYW4+O1xuXG5leHBvcnQgdHlwZSBFeHRyYWN0b3JSZXNvbHZhYmxlID0gc3RyaW5nIHwgQmFzZUV4dHJhY3RvcjsiLCAiaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tICdub2RlOmFzeW5jX2hvb2tzJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbnR5cGUgdW5zYWZlID0gYW55O1xuXG4vKipcbiAqIFRoZSByZWNlaXZlciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGNvbnRleHQgaXMgcHJvdmlkZWRcbiAqL1xuZXhwb3J0IHR5cGUgQ29udGV4dFJlY2VpdmVyPFI+ID0gKCkgPT4gUjtcblxuZXhwb3J0IGNsYXNzIENvbnRleHQ8VD4ge1xuICBwcml2YXRlIHN0b3JhZ2UgPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2U8VD4oKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBkZWZhdWx0VmFsdWU/OiBUKSB7fVxuXG4gIC8qKlxuICAgKiBFeGl0IG91dCBvZiB0aGlzIGNvbnRleHRcbiAgICovXG4gIHB1YmxpYyBleGl0KHNjb3BlOiBDb250ZXh0UmVjZWl2ZXI8dm9pZD4pIHtcbiAgICB0aGlzLnN0b3JhZ2UuZXhpdChzY29wZSk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY29udGV4dCBpcyBsb3N0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzTG9zdCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmdldFN0b3JlKCkgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGNvbnRleHQuIElmIHRoZSBjb250ZXh0IGlzIGxvc3QgYW5kIG5vIGRlZmF1bHQgdmFsdWUgaXMgcHJvdmlkZWQsIHVuZGVmaW5lZCB3aWxsIGJlIHJldHVybmVkLlxuICAgKi9cbiAgcHVibGljIGNvbnN1bWUoKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuc3RvcmFnZS5nZXRTdG9yZSgpO1xuXG4gICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCAmJiB0aGlzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBhIGZ1bmN0aW9uIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGlzIHByb3ZpZGVyXG4gICAqL1xuICBwdWJsaWMgcHJvdmlkZTxSID0gdW5zYWZlPih2YWx1ZTogVCwgcmVjZWl2ZXI6IENvbnRleHRSZWNlaXZlcjxSPik6IFIge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnRleHQgdmFsdWUgbWF5IG5vdCBiZSB1bmRlZmluZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJlY2VpdmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnRleHQgcmVjZWl2ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5ydW4odmFsdWUsIHJlY2VpdmVyKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBjb250ZXh0LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBvcHRpb25hbC5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGNvbnRleHRcbiAqIEBleGFtcGxlIGNvbnN0IHVzZXJDb250ZXh0ID0gY3JlYXRlQ29udGV4dCgpO1xuICpcbiAqICAvLyB0aGUgdmFsdWUgdG8gcHJvdmlkZVxuICogIGNvbnN0IHVzZXIgPSB7XG4gKiAgIGlkOiAxLFxuICogICBuYW1lOiAnSm9obiBEb2UnXG4gKiAgfTtcbiAqXG4gKiAgLy8gcHJvdmlkZSB0aGUgY29udGV4dCB2YWx1ZSB0byB0aGUgcmVjZWl2ZXJcbiAqICBjb250ZXh0LnByb3ZpZGUodXNlciwgaGFuZGxlcik7XG4gKlxuICogIGZ1bmN0aW9uIGhhbmRsZXIoKSB7XG4gKiAgICAvLyBnZXQgdGhlIGNvbnRleHQgdmFsdWVcbiAqICAgIGNvbnN0IHsgaWQsIG5hbWUgfSA9IHVzZUNvbnRleHQoY29udGV4dCk7XG4gKlxuICogICAgY29uc29sZS5sb2coaWQsIG5hbWUpOyAvLyAxLCBKb2huIERvZVxuICogIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQ8VCA9IHVuc2FmZT4oZGVmYXVsdFZhbHVlPzogVCk6IENvbnRleHQ8VD4ge1xuICByZXR1cm4gbmV3IENvbnRleHQoZGVmYXVsdFZhbHVlKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGNvbnRleHQuIElmIHRoZSBjb250ZXh0IGlzIGxvc3QgYW5kIG5vIGRlZmF1bHQgdmFsdWUgaXMgcHJvdmlkZWQsIHVuZGVmaW5lZCB3aWxsIGJlIHJldHVybmVkLlxuICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gZ2V0IHRoZSB2YWx1ZSBmcm9tXG4gKiBAZXhhbXBsZSBjb25zdCB2YWx1ZSA9IHVzZUNvbnRleHQoY29udGV4dCk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VDb250ZXh0PFQgPSB1bnNhZmU+KGNvbnRleHQ6IENvbnRleHQ8VD4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNvbnRleHQuY29uc3VtZSgpO1xufSIsICJpbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGdsb2JhbFJlZ2lzdHJ5ID0gbmV3IENvbGxlY3Rpb248c3RyaW5nLCB1bmtub3duPigpOyIsICJpbXBvcnQgeyBnbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4vX2NvbnRhaW5lcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxSZWdpc3RyeSgpIHtcbiAgcmV0dXJuIGdsb2JhbFJlZ2lzdHJ5O1xufSIsICJpbXBvcnQgeyBHdWlsZCB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7IElsbGVnYWxIb29rSW52b2NhdGlvbkVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQgfSBmcm9tICcuL2NvbnRleHQvYXN5bmMtY29udGV4dCc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG9va3NDdHgge1xuICBndWlsZDogR3VpbGQ7XG59XG5cbmV4cG9ydCBjb25zdCBTVVBFUl9DT05URVhUID0gY3JlYXRlQ29udGV4dDxQbGF5ZXI+KCk7XG5cbmNvbnN0IGdldEZhbGxiYWNrQ29udGV4dCA9ICgpID0+IHtcbiAgcmV0dXJuIGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KCdAW3BsYXllcl0nKSBhcyBQbGF5ZXIgfCB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VIb29rc0NvbnRleHQoaG9va05hbWU6IHN0cmluZywgbWFpbk9ubHkgPSBmYWxzZSkge1xuICBsZXQgaXNGYWxsYmFjayA9IGZhbHNlO1xuXG4gIGxldCBwbGF5ZXI6IFBsYXllciB8IHVuZGVmaW5lZDtcblxuICBpZiAoIShwbGF5ZXIgPSBTVVBFUl9DT05URVhULmNvbnN1bWUoKSkpIHtcbiAgICBwbGF5ZXIgPSBnZXRGYWxsYmFja0NvbnRleHQoKTtcbiAgICBpc0ZhbGxiYWNrID0gdHJ1ZTtcbiAgfVxuXG4gIGlmICghcGxheWVyKVxuICB0aHJvdyBuZXcgSWxsZWdhbEhvb2tJbnZvY2F0aW9uRXJyb3IoXG4gICAgJ2Rpc2NvcmQtcGxheWVyJyxcbiAgICBgUGxheWVyIGNvbnRleHQgaXMgbm90IGF2YWlsYWJsZSwgJHtcbiAgICBpc0ZhbGxiYWNrID9cbiAgICAnZGlkIHlvdSBmb3JnZXQgdG8gaW5pdGlhbGl6ZSB0aGUgcGxheWVyIHdpdGggYG5ldyBQbGF5ZXIoY2xpZW50KWA/JyA6XG4gICAgJ2lzIGl0IGJlaW5nIGNhbGxlZCBpbnNpZGUgPFBsYXllcj4uY29udGV4dC5wcm92aWRlKCk/J31gXG5cbiAgKTtcblxuICBpZiAobWFpbk9ubHkpIHJldHVybiB7IHBsYXllciwgY29udGV4dDoge30gYXMgSG9va3NDdHgsIGlzRmFsbGJhY2sgfTtcblxuICBsZXQgY29udGV4dDogSG9va3NDdHggfCB1bmRlZmluZWQ7XG5cbiAgaWYgKCFpc0ZhbGxiYWNrKSB7XG4gICAgY29udGV4dCA9IHVzZUNvbnRleHQocGxheWVyLmNvbnRleHQpO1xuICAgIGlmICghY29udGV4dClcbiAgICB0aHJvdyBuZXcgSWxsZWdhbEhvb2tJbnZvY2F0aW9uRXJyb3IoXG4gICAgICBob29rTmFtZSxcbiAgICAgIGAke2hvb2tOYW1lfSBtdXN0IGJlIGNhbGxlZCBpbnNpZGUgYSBwbGF5ZXIgY29udGV4dCBjcmVhdGVkIGJ5IDxQbGF5ZXI+LmNvbnRleHQucHJvdmlkZSgpYFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgY29udGV4dCA9IHtcbiAgICAgIGdldCBndWlsZCgpIHtcbiAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxIb29rSW52b2NhdGlvbkVycm9yKFxuICAgICAgICAgIGhvb2tOYW1lLFxuICAgICAgICAgIGAke2hvb2tOYW1lfSBtdXN0IGJlIGNhbGxlZCB3aXRoIGFuIGV4cGxpY2l0IGd1aWxkIGFyZ3VtZW50IHdoZW4gbm90IGluc2lkZSBhIHBsYXllciBjb250ZXh0YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gYXMgdW5rbm93biBhcyBIb29rc0N0eDtcbiAgfVxuXG4gIHJldHVybiB7IGNvbnRleHQsIHBsYXllciwgaXNGYWxsYmFjayB9O1xufSIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlSGlzdG9yeSwgTm9kZVJlc29sdmFibGUgfSBmcm9tICcuLi9xdWV1ZSc7XG5pbXBvcnQgeyB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggZ3VpbGQgcXVldWUgaGlzdG9yeVxuICogQHBhcmFtIG5vZGUgZ3VpbGQgcXVldWUgbm9kZSByZXNvbHZhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VIaXN0b3J5PE1ldGEgPSB1bmtub3duPigpOiBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhPiB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gdXNlSGlzdG9yeTxNZXRhID0gdW5rbm93bj4oXG5ub2RlOiBOb2RlUmVzb2x2YWJsZSlcbjogR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUhpc3Rvcnk8TWV0YSA9IHVua25vd24+KFxubm9kZT86IE5vZGVSZXNvbHZhYmxlKVxuOiBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhPiB8IG51bGwge1xuICBjb25zdCB7IGNvbnRleHQsIHBsYXllciB9ID0gdXNlSG9va3NDb250ZXh0KCd1c2VIaXN0b3J5Jyk7XG5cbiAgY29uc3QgcXVldWUgPSBwbGF5ZXIucXVldWVzLmdldDxNZXRhPihub2RlID8/IGNvbnRleHQuZ3VpbGQuaWQpO1xuICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICByZXR1cm4gcXVldWUuaGlzdG9yeTtcbn0iLCAiaW1wb3J0IHsgR3VpbGRRdWV1ZVBsYXllck5vZGUsIE5vZGVSZXNvbHZhYmxlIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG4vKipcbiAqIEZldGNoIGd1aWxkIHF1ZXVlIHBsYXllciBub2RlXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVBsYXllcjxNZXRhID0gdW5rbm93bj4oKTogR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVBsYXllcjxNZXRhID0gdW5rbm93bj4oXG5ub2RlOiBOb2RlUmVzb2x2YWJsZSlcbjogR3VpbGRRdWV1ZVBsYXllck5vZGU8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVBsYXllcjxNZXRhID0gdW5rbm93bj4oXG5ub2RlPzogTm9kZVJlc29sdmFibGUpXG46IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+IHwgbnVsbCB7XG4gIGNvbnN0IHsgY29udGV4dCwgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZVBsYXllcicpO1xuICBjb25zdCBxdWV1ZSA9IHBsYXllci5xdWV1ZXMuZ2V0PE1ldGE+KG5vZGUgPz8gY29udGV4dC5ndWlsZC5pZCk7XG4gIGlmICghcXVldWUpIHJldHVybiBudWxsO1xuXG4gIHJldHVybiBxdWV1ZS5ub2RlO1xufSIsICJpbXBvcnQgeyBHdWlsZFF1ZXVlLCBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IHVzZUhvb2tzQ29udGV4dCB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBGZXRjaCBndWlsZCBxdWV1ZS5cbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZS4gRGVmYXVsdHMgdG8gaW5mZXJyZWQgZ3VpbGQgZnJvbSBjb250ZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUXVldWU8TWV0YSA9IHVua25vd24+KCk6IEd1aWxkUXVldWU8TWV0YT4gfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVF1ZXVlPE1ldGEgPSB1bmtub3duPihcbm5vZGU6IE5vZGVSZXNvbHZhYmxlKVxuOiBHdWlsZFF1ZXVlPE1ldGE+IHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VRdWV1ZTxNZXRhID0gdW5rbm93bj4oXG5ub2RlPzogTm9kZVJlc29sdmFibGUpXG46IEd1aWxkUXVldWU8TWV0YT4gfCBudWxsIHtcbiAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlUXVldWUnKTtcbiAgY29uc3QgcXVldWUgPSBwbGF5ZXIucXVldWVzLnJlc29sdmU8TWV0YT4obm9kZSA/PyBjb250ZXh0Lmd1aWxkLmlkKTtcbiAgaWYgKCFxdWV1ZSkgcmV0dXJuIG51bGw7XG5cbiAgcmV0dXJuIHF1ZXVlO1xufSIsICJpbXBvcnQgeyB1c2VIb29rc0NvbnRleHQgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogRmV0Y2ggbWFpbiBwbGF5ZXIgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1haW5QbGF5ZXIoKSB7XG4gIGNvbnN0IHsgcGxheWVyIH0gPSB1c2VIb29rc0NvbnRleHQoJ3VzZU1haW5QbGF5ZXInLCB0cnVlKTtcblxuICByZXR1cm4gcGxheWVyO1xufSIsICJpbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG5leHBvcnQgdHlwZSBTZXR0ZXJGTjxULCBQPiA9IChwcmV2aW91czogUCkgPT4gVDtcbmV4cG9ydCB0eXBlIE1ldGFkYXRhRGlzcGF0Y2g8VD4gPSByZWFkb25seSBbXG4gICgpID0+IFQsXG4gIChtZXRhZGF0YTogVCB8IFNldHRlckZOPFQsIFQ+KSA9PiB2b2lkXTtcblxuXG4vKipcbiAqIEZldGNoIG9yIG1hbmlwdWxhdGUgZ3VpbGQgcXVldWUgbWV0YWRhdGFcbiAqIEBwYXJhbSBub2RlIEd1aWxkIHF1ZXVlIG5vZGUgcmVzb2x2YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTWV0YWRhdGE8VCA9IHVua25vd24+KCk6IE1ldGFkYXRhRGlzcGF0Y2g8VD47XG5leHBvcnQgZnVuY3Rpb24gdXNlTWV0YWRhdGE8VCA9IHVua25vd24+KFxubm9kZTogTm9kZVJlc29sdmFibGUpXG46IE1ldGFkYXRhRGlzcGF0Y2g8VD47XG5leHBvcnQgZnVuY3Rpb24gdXNlTWV0YWRhdGE8VCA9IHVua25vd24+KFxubm9kZT86IE5vZGVSZXNvbHZhYmxlKVxuOiBNZXRhZGF0YURpc3BhdGNoPFQ+IHtcbiAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlTWV0YWRhdGEnKTtcbiAgY29uc3QgcXVldWUgPSBwbGF5ZXIucXVldWVzLmdldDxUPihub2RlID8/IGNvbnRleHQuZ3VpbGQuaWQpO1xuICBjb25zdCBzZXR0ZXIgPSAobWV0YWRhdGE6IFQgfCBTZXR0ZXJGTjxULCBUPikgPT4ge1xuICAgIGlmIChxdWV1ZSkge1xuICAgICAgaWYgKFR5cGVVdGlsLmlzRnVuY3Rpb24obWV0YWRhdGEpKVxuICAgICAgcmV0dXJuIHF1ZXVlLnNldE1ldGFkYXRhKG1ldGFkYXRhKHF1ZXVlLm1ldGFkYXRhKSk7XG4gICAgICByZXR1cm4gcXVldWUuc2V0TWV0YWRhdGEobWV0YWRhdGEpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBnZXR0ZXIgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHF1ZXVlPy5tZXRhZGF0YSBhcyBUO1xuICB9O1xuXG4gIHJldHVybiBbZ2V0dGVyLCBzZXR0ZXJdIGFzIGNvbnN0O1xufSIsICJpbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYyc7XG5pbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSwgUGxheWVyVGltZXN0YW1wIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVsaW5lRGlzcGF0Y2hlck9wdGlvbnMge1xuICBpZ25vcmVGaWx0ZXJzOiBib29sZWFuO1xuICBub2RlOiBOb2RlUmVzb2x2YWJsZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlVGltZWxpbmUge1xuICByZWFkb25seSB0aW1lc3RhbXA6IFBsYXllclRpbWVzdGFtcDtcbiAgcmVhZG9ubHkgdm9sdW1lOiBudW1iZXI7XG4gIHJlYWRvbmx5IHBhdXNlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdHJhY2s6IFRyYWNrPHVua25vd24+IHwgbnVsbDtcbiAgcGF1c2UoKTogYm9vbGVhbjtcbiAgcmVzdW1lKCk6IGJvb2xlYW47XG4gIHNldFZvbHVtZSh2b2w6IG51bWJlcik6IGJvb2xlYW47XG4gIHNldFBvc2l0aW9uKHRpbWU6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj47XG59XG5cbi8qKlxuICogRmV0Y2ggb3IgbWFuaXB1bGF0ZSBjdXJyZW50IHRyYWNrXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aW1lbGluZSBkaXNwYXRjaGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VUaW1lbGluZSgpOiBHdWlsZFF1ZXVlVGltZWxpbmUgfCBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVRpbWVsaW5lKFxub3B0aW9uczogUGFydGlhbDxUaW1lbGluZURpc3BhdGNoZXJPcHRpb25zPilcbjogR3VpbGRRdWV1ZVRpbWVsaW5lIHwgbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VUaW1lbGluZShcbm9wdGlvbnM/OiBQYXJ0aWFsPFRpbWVsaW5lRGlzcGF0Y2hlck9wdGlvbnM+KVxuOiBHdWlsZFF1ZXVlVGltZWxpbmUgfCBudWxsIHtcbiAgY29uc3QgeyBjb250ZXh0LCBwbGF5ZXIgfSA9IHVzZUhvb2tzQ29udGV4dCgndXNlVGltZWxpbmUnKTtcbiAgY29uc3QgcXVldWUgPSBwbGF5ZXIucXVldWVzLmdldChvcHRpb25zPy5ub2RlID8/IGNvbnRleHQuZ3VpbGQuaWQpO1xuICBpZiAoIXF1ZXVlKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCB0aW1lbGluZSA9IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7XG4gICAgZ2V0IHRpbWVzdGFtcCgpIHtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLmdldFRpbWVzdGFtcChvcHRpb25zPy5pZ25vcmVGaWx0ZXJzKSE7XG4gICAgfSxcbiAgICBnZXQgdm9sdW1lKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUudm9sdW1lO1xuICAgIH0sXG4gICAgZ2V0IHBhdXNlZCgpIHtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLmlzUGF1c2VkKCk7XG4gICAgfSxcbiAgICBnZXQgdHJhY2soKSB7XG4gICAgICByZXR1cm4gcXVldWUuY3VycmVudFRyYWNrO1xuICAgIH0sXG4gICAgcGF1c2UoKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5wYXVzZSgpO1xuICAgIH0sXG4gICAgcmVzdW1lKCkge1xuICAgICAgcmV0dXJuIHF1ZXVlLm5vZGUucmVzdW1lKCk7XG4gICAgfSxcbiAgICBzZXRWb2x1bWUodm9sOiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2wpO1xuICAgIH0sXG4gICAgYXN5bmMgc2V0UG9zaXRpb24odGltZTogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gcXVldWUubm9kZS5zZWVrKHRpbWUpO1xuICAgIH1cbiAgfSBzYXRpc2ZpZXMgR3VpbGRRdWV1ZVRpbWVsaW5lKTtcblxuICByZXR1cm4gdGltZWxpbmU7XG59IiwgImltcG9ydCB7IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyIH0gZnJvbSAnLi4vLi4vcXVldWUnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi8uLi91dGlscy9fX2ludGVybmFsX18nO1xuXG4vKipcbiAqIEdsb2JhbCBvbkFmdGVyQ3JlYXRlU3RyZWFtIGhhbmRsZXJcbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkFmdGVyQ3JlYXRlU3RyZWFtKGhhbmRsZXI6IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyKSB7XG4gIGdldEdsb2JhbFJlZ2lzdHJ5KCkuc2V0KCdAW29uQWZ0ZXJDcmVhdGVTdHJlYW1dJywgaGFuZGxlcik7XG59IiwgImltcG9ydCB7IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciB9IGZyb20gJy4uLy4uL3F1ZXVlJztcbmltcG9ydCB7IGdldEdsb2JhbFJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vdXRpbHMvX19pbnRlcm5hbF9fJztcblxuLyoqXG4gKiBHbG9iYWwgb25CZWZvcmVDcmVhdGVTdHJlYW0gaGFuZGxlclxuICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXIgY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uQmVmb3JlQ3JlYXRlU3RyZWFtKGhhbmRsZXI6IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcikge1xuICBnZXRHbG9iYWxSZWdpc3RyeSgpLnNldCgnQFtvbkJlZm9yZUNyZWF0ZVN0cmVhbV0nLCBoYW5kbGVyKTtcbn0iLCAiaW1wb3J0IHsgT25TdHJlYW1FeHRyYWN0ZWRIYW5kbGVyIH0gZnJvbSAnLi4vLi4vcXVldWUnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsUmVnaXN0cnkgfSBmcm9tICcuLi8uLi91dGlscy9fX2ludGVybmFsX18nO1xuXG4vKipcbiAqIEdsb2JhbCBvblN0cmVhbUV4dHJhY3RlZCBoYW5kbGVyXG4gKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBjYWxsYmFja1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25TdHJlYW1FeHRyYWN0ZWQoaGFuZGxlcjogT25TdHJlYW1FeHRyYWN0ZWRIYW5kbGVyKSB7XG4gIGdldEdsb2JhbFJlZ2lzdHJ5KCkuc2V0KCdAW29uU3RyZWFtRXh0cmFjdGVkXScsIGhhbmRsZXIpO1xufSIsICJpbXBvcnQgeyBOb2RlUmVzb2x2YWJsZSB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IFR5cGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvVHlwZVV0aWwnO1xuaW1wb3J0IHsgdXNlSG9va3NDb250ZXh0IH0gZnJvbSAnLi9jb21tb24nO1xuXG50eXBlIFNldHRlckZOID0gKHByZXZpb3VzOiBudW1iZXIpID0+IG51bWJlcjtcbnR5cGUgVm9sdW1lRGlzcGF0Y2ggPSByZWFkb25seSBbXG4gICgpID0+IG51bWJlcixcbiAgKHZvbHVtZTogbnVtYmVyIHwgU2V0dGVyRk4pID0+IGJvb2xlYW4gfCB1bmRlZmluZWRdO1xuXG5cbi8qKlxuICogRmV0Y2ggb3IgbWFuaXB1bGF0ZSBwbGF5ZXIgdm9sdW1lXG4gKiBAcGFyYW0gbm9kZSBHdWlsZCBxdWV1ZSBub2RlIHJlc29sdmFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVZvbHVtZSgpOiBWb2x1bWVEaXNwYXRjaDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VWb2x1bWUobm9kZTogTm9kZVJlc29sdmFibGUpOiBWb2x1bWVEaXNwYXRjaDtcbmV4cG9ydCBmdW5jdGlvbiB1c2VWb2x1bWUobm9kZT86IE5vZGVSZXNvbHZhYmxlKTogVm9sdW1lRGlzcGF0Y2gge1xuICBjb25zdCB7IGNvbnRleHQsIHBsYXllciB9ID0gdXNlSG9va3NDb250ZXh0KCd1c2VWb2x1bWUnKTtcbiAgY29uc3QgcXVldWUgPSBwbGF5ZXIucXVldWVzLmdldChub2RlID8/IGNvbnRleHQuZ3VpbGQuaWQpO1xuICBjb25zdCBzZXR0ZXIgPSAodm9sdW1lOiBudW1iZXIgfCBTZXR0ZXJGTikgPT4ge1xuICAgIGlmIChxdWV1ZSkge1xuICAgICAgaWYgKFR5cGVVdGlsLmlzRnVuY3Rpb24odm9sdW1lKSlcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2x1bWUocXVldWUubm9kZS52b2x1bWUpKTtcbiAgICAgIHJldHVybiBxdWV1ZS5ub2RlLnNldFZvbHVtZSh2b2x1bWUpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBnZXR0ZXIgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHF1ZXVlPy5ub2RlLnZvbHVtZSBhcyBudW1iZXI7XG4gIH07XG5cbiAgcmV0dXJuIFtnZXR0ZXIsIHNldHRlcl0gYXMgY29uc3Q7XG59IiwgImltcG9ydCB7XG4gIEVxdWFsaXplckJhbmQsXG4gIFBDTUZpbHRlcnMsXG4gIEJpcXVhZEZpbHRlcnMgfSBmcm9tXG4nQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uLCBRdWV1ZVN0cmF0ZWd5IH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IEd1aWxkUmVzb2x2YWJsZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHsgUGxheWVyIH0gZnJvbSAnLi4vUGxheWVyJztcbmltcG9ydCB7XG4gIEd1aWxkUXVldWUsXG4gIE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyLFxuICBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIsXG4gIE9uU3RyZWFtRXh0cmFjdGVkSGFuZGxlcixcbiAgUXVldWVSZXBlYXRNb2RlIH0gZnJvbVxuJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4uL3V0aWxzL19faW50ZXJuYWxfXyc7XG5pbXBvcnQgeyBOb0d1aWxkRXJyb3IsIE5vR3VpbGRRdWV1ZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IEZpbHRlcnNOYW1lIH0gZnJvbSAnLi4vZmFicmljJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGROb2RlQ3JlYXRlT3B0aW9uczxUID0gYW55PiB7XG4gIHN0cmF0ZWd5PzogUXVldWVTdHJhdGVneTtcbiAgdm9sdW1lPzogbnVtYmVyO1xuICBlcXVhbGl6ZXI/OiBFcXVhbGl6ZXJCYW5kW107XG4gIGFfZmlsdGVyPzogUENNRmlsdGVyc1tdO1xuICBiaXF1YWQ/OiBCaXF1YWRGaWx0ZXJzO1xuICByZXNhbXBsZXI/OiBudW1iZXI7XG4gIGRpc2FibGVIaXN0b3J5PzogYm9vbGVhbjtcbiAgb25CZWZvcmVDcmVhdGVTdHJlYW0/OiBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXI7XG4gIG9uQWZ0ZXJDcmVhdGVTdHJlYW0/OiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgb25TdHJlYW1FeHRyYWN0ZWQ/OiBPblN0cmVhbUV4dHJhY3RlZEhhbmRsZXI7XG4gIHJlcGVhdE1vZGU/OiBRdWV1ZVJlcGVhdE1vZGU7XG4gIHBhdXNlT25FbXB0eT86IGJvb2xlYW47XG4gIGxlYXZlT25FbXB0eT86IGJvb2xlYW47XG4gIGxlYXZlT25FbXB0eUNvb2xkb3duPzogbnVtYmVyO1xuICBsZWF2ZU9uRW5kPzogYm9vbGVhbjtcbiAgbGVhdmVPbkVuZENvb2xkb3duPzogbnVtYmVyO1xuICBsZWF2ZU9uU3RvcD86IGJvb2xlYW47XG4gIGxlYXZlT25TdG9wQ29vbGRvd24/OiBudW1iZXI7XG4gIG1ldGFkYXRhPzogVCB8IG51bGw7XG4gIHNlbGZEZWFmPzogYm9vbGVhbjtcbiAgY29ubmVjdGlvblRpbWVvdXQ/OiBudW1iZXI7XG4gIGRlZmF1bHRGRm1wZWdGaWx0ZXJzPzogRmlsdGVyc05hbWVbXTtcbiAgYnVmZmVyaW5nVGltZW91dD86IG51bWJlcjtcbiAgbm9FbWl0SW5zZXJ0PzogYm9vbGVhbjtcbiAgbWF4U2l6ZT86IG51bWJlcjtcbiAgbWF4SGlzdG9yeVNpemU/OiBudW1iZXI7XG4gIHByZWZlckJyaWRnZWRNZXRhZGF0YT86IGJvb2xlYW47XG4gIGRpc2FibGVWb2x1bWU/OiBib29sZWFuO1xuICBkaXNhYmxlRXF1YWxpemVyPzogYm9vbGVhbjtcbiAgZGlzYWJsZUZpbHRlcmVyPzogYm9vbGVhbjtcbiAgZGlzYWJsZUJpcXVhZD86IGJvb2xlYW47XG4gIGRpc2FibGVSZXNhbXBsZXI/OiBib29sZWFuO1xuICBkaXNhYmxlQ29tcHJlc3Nvcj86IGJvb2xlYW47XG4gIGRpc2FibGVTZWVrZXI/OiBib29sZWFuO1xuICBkaXNhYmxlUmV2ZXJiPzogYm9vbGVhbjtcbiAgZGlzYWJsZUZhbGxiYWNrU3RyZWFtPzogYm9vbGVhbjtcbiAgZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3I/OiBib29sZWFuO1xuICB2ZXJpZnlGYWxsYmFja1N0cmVhbT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIE5vZGVSZXNvbHZhYmxlID0gR3VpbGRRdWV1ZSB8IEd1aWxkUmVzb2x2YWJsZTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjbGFzcyBHdWlsZE5vZGVNYW5hZ2VyPE1ldGEgPSBhbnk+IHtcbiAgcHVibGljIGNhY2hlID0gbmV3IENvbGxlY3Rpb248c3RyaW5nLCBHdWlsZFF1ZXVlPigpO1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyKSB7fVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgZ3VpbGQgcXVldWUgaWYgaXQgZG9lcyBub3QgZXhpc3RcbiAgICogQHBhcmFtIGd1aWxkIFRoZSBndWlsZCB3aGljaCB3aWxsIGJlIHRoZSBvd25lciBvZiB0aGUgcXVldWVcbiAgICogQHBhcmFtIG9wdGlvbnMgUXVldWUgaW5pdGlhbGl6ZXIgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGNyZWF0ZTxUID0gTWV0YT4oXG4gIGd1aWxkOiBHdWlsZFJlc29sdmFibGUsXG4gIG9wdGlvbnM6IEd1aWxkTm9kZUNyZWF0ZU9wdGlvbnM8VD4gPSB7fSlcbiAgOiBHdWlsZFF1ZXVlPFQ+IHtcbiAgICBjb25zdCBzZXJ2ZXIgPSB0aGlzLnBsYXllci5jbGllbnQuZ3VpbGRzLnJlc29sdmUoZ3VpbGQpO1xuICAgIGlmICghc2VydmVyKSB7XG4gICAgICB0aHJvdyBuZXcgTm9HdWlsZEVycm9yKCdJbnZhbGlkIG9yIHVua25vd24gZ3VpbGQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jYWNoZS5oYXMoc2VydmVyLmlkKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KHNlcnZlci5pZCkgYXMgR3VpbGRRdWV1ZTxUPjtcbiAgICB9XG5cbiAgICBvcHRpb25zLnN0cmF0ZWd5ID8/PSAnRklGTyc7XG4gICAgb3B0aW9ucy52b2x1bWUgPz89IDEwMDtcbiAgICBvcHRpb25zLmVxdWFsaXplciA/Pz0gW107XG4gICAgb3B0aW9ucy5hX2ZpbHRlciA/Pz0gW107XG4gICAgb3B0aW9ucy5kaXNhYmxlSGlzdG9yeSA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5sZWF2ZU9uRW1wdHkgPz89IHRydWU7XG4gICAgb3B0aW9ucy5sZWF2ZU9uRW1wdHlDb29sZG93biA/Pz0gMDtcbiAgICBvcHRpb25zLmxlYXZlT25FbmQgPz89IHRydWU7XG4gICAgb3B0aW9ucy5sZWF2ZU9uRW5kQ29vbGRvd24gPz89IDA7XG4gICAgb3B0aW9ucy5sZWF2ZU9uU3RvcCA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLmxlYXZlT25TdG9wQ29vbGRvd24gPz89IDA7XG4gICAgb3B0aW9ucy5yZXNhbXBsZXIgPz89IDQ4MDAwO1xuICAgIG9wdGlvbnMuc2VsZkRlYWYgPz89IHRydWU7XG4gICAgb3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCA/Pz0gdGhpcy5wbGF5ZXIub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dDtcbiAgICBvcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXQgPz89IDEwMDA7XG4gICAgb3B0aW9ucy5tYXhTaXplID8/PSBJbmZpbml0eTtcbiAgICBvcHRpb25zLm1heEhpc3RvcnlTaXplID8/PSBJbmZpbml0eTtcbiAgICBvcHRpb25zLnByZWZlckJyaWRnZWRNZXRhZGF0YSA/Pz0gdHJ1ZTtcbiAgICBvcHRpb25zLnBhdXNlT25FbXB0eSA/Pz0gdHJ1ZTtcblxuICAgIC8vIHRvZG8odHdsaXRlKTogbWF5YmUgZGlzYWJsZSB0aGVzZSBieSBkZWZhdWx0P1xuICAgIG9wdGlvbnMuZGlzYWJsZUJpcXVhZCA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5kaXNhYmxlRXF1YWxpemVyID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmRpc2FibGVGaWx0ZXJlciA/Pz0gZmFsc2U7XG4gICAgb3B0aW9ucy5kaXNhYmxlVm9sdW1lID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmRpc2FibGVSZXNhbXBsZXIgPz89IGZhbHNlO1xuICAgIG9wdGlvbnMuZGlzYWJsZUNvbXByZXNzb3IgPz89IHRydWU7XG4gICAgb3B0aW9ucy5kaXNhYmxlU2Vla2VyID8/PSB0cnVlO1xuICAgIG9wdGlvbnMuZGlzYWJsZVJldmVyYiA/Pz0gdHJ1ZTtcblxuICAgIG9wdGlvbnMuZGlzYWJsZUZhbGxiYWNrU3RyZWFtID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLmVuYWJsZVN0cmVhbUludGVyY2VwdG9yID8/PSBmYWxzZTtcbiAgICBvcHRpb25zLnZlcmlmeUZhbGxiYWNrU3RyZWFtID8/PSBmYWxzZTtcblxuICAgIGlmIChcbiAgICBnZXRHbG9iYWxSZWdpc3RyeSgpLmhhcygnQFtvblN0cmVhbUV4dHJhY3RlZF0nKSAmJlxuICAgICFvcHRpb25zLm9uU3RyZWFtRXh0cmFjdGVkKVxuICAgIHtcbiAgICAgIG9wdGlvbnMub25TdHJlYW1FeHRyYWN0ZWQgPSBnZXRHbG9iYWxSZWdpc3RyeSgpLmdldChcbiAgICAgICAgJ0Bbb25TdHJlYW1FeHRyYWN0ZWRdJ1xuICAgICAgKSBhcyBPblN0cmVhbUV4dHJhY3RlZEhhbmRsZXI7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgIGdldEdsb2JhbFJlZ2lzdHJ5KCkuaGFzKCdAW29uQmVmb3JlQ3JlYXRlU3RyZWFtXScpICYmXG4gICAgIW9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0pXG4gICAge1xuICAgICAgb3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSA9IGdldEdsb2JhbFJlZ2lzdHJ5KCkuZ2V0KFxuICAgICAgICAnQFtvbkJlZm9yZUNyZWF0ZVN0cmVhbV0nXG4gICAgICApIGFzIE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5oYXMoJ0Bbb25BZnRlckNyZWF0ZVN0cmVhbV0nKSAmJlxuICAgICFvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0pXG4gICAge1xuICAgICAgb3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtID0gZ2V0R2xvYmFsUmVnaXN0cnkoKS5nZXQoXG4gICAgICAgICdAW29uQWZ0ZXJDcmVhdGVTdHJlYW1dJ1xuICAgICAgKSBhcyBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgICB9XG5cbiAgICBjb25zdCBxdWV1ZSA9IG5ldyBHdWlsZFF1ZXVlPFQ+KHRoaXMucGxheWVyLCB7XG4gICAgICBndWlsZDogc2VydmVyLFxuICAgICAgcXVldWVTdHJhdGVneTogb3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIHZvbHVtZTogb3B0aW9ucy52b2x1bWUsXG4gICAgICBlcXVhbGl6ZXI6IG9wdGlvbnMuZXF1YWxpemVyLFxuICAgICAgZmlsdGVyZXI6IG9wdGlvbnMuYV9maWx0ZXIsXG4gICAgICBiaXF1YWQ6IG9wdGlvbnMuYmlxdWFkLFxuICAgICAgcmVzYW1wbGVyOiBvcHRpb25zLnJlc2FtcGxlcixcbiAgICAgIGRpc2FibGVIaXN0b3J5OiBvcHRpb25zLmRpc2FibGVIaXN0b3J5LFxuICAgICAgb25CZWZvcmVDcmVhdGVTdHJlYW06IG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW0sXG4gICAgICBvbkFmdGVyQ3JlYXRlU3RyZWFtOiBvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW0sXG4gICAgICBvblN0cmVhbUV4dHJhY3RlZDogb3B0aW9ucy5vblN0cmVhbUV4dHJhY3RlZCxcbiAgICAgIHJlcGVhdE1vZGU6IG9wdGlvbnMucmVwZWF0TW9kZSxcbiAgICAgIGxlYXZlT25FbXB0eTogb3B0aW9ucy5sZWF2ZU9uRW1wdHksXG4gICAgICBsZWF2ZU9uRW1wdHlDb29sZG93bjogb3B0aW9ucy5sZWF2ZU9uRW1wdHlDb29sZG93bixcbiAgICAgIGxlYXZlT25FbmQ6IG9wdGlvbnMubGVhdmVPbkVuZCxcbiAgICAgIGxlYXZlT25FbmRDb29sZG93bjogb3B0aW9ucy5sZWF2ZU9uRW5kQ29vbGRvd24sXG4gICAgICBsZWF2ZU9uU3RvcDogb3B0aW9ucy5sZWF2ZU9uU3RvcCxcbiAgICAgIGxlYXZlT25TdG9wQ29vbGRvd246IG9wdGlvbnMubGVhdmVPblN0b3BDb29sZG93bixcbiAgICAgIG1ldGFkYXRhOiBvcHRpb25zLm1ldGFkYXRhLFxuICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IG9wdGlvbnMuY29ubmVjdGlvblRpbWVvdXQgPz8gMTIwXzAwMCxcbiAgICAgIHNlbGZEZWFmOiBvcHRpb25zLnNlbGZEZWFmLFxuICAgICAgZmZtcGVnRmlsdGVyczogb3B0aW9ucy5kZWZhdWx0RkZtcGVnRmlsdGVycyA/PyBbXSxcbiAgICAgIGJ1ZmZlcmluZ1RpbWVvdXQ6IG9wdGlvbnMuYnVmZmVyaW5nVGltZW91dCxcbiAgICAgIG5vRW1pdEluc2VydDogb3B0aW9ucy5ub0VtaXRJbnNlcnQgPz8gZmFsc2UsXG4gICAgICBwcmVmZXJCcmlkZ2VkTWV0YWRhdGE6IG9wdGlvbnMucHJlZmVyQnJpZGdlZE1ldGFkYXRhLFxuICAgICAgbWF4SGlzdG9yeVNpemU6IG9wdGlvbnMubWF4SGlzdG9yeVNpemUsXG4gICAgICBtYXhTaXplOiBvcHRpb25zLm1heFNpemUsXG4gICAgICBwYXVzZU9uRW1wdHk6IG9wdGlvbnMucGF1c2VPbkVtcHR5LFxuICAgICAgZGlzYWJsZUJpcXVhZDogb3B0aW9ucy5kaXNhYmxlQmlxdWFkLFxuICAgICAgZGlzYWJsZUVxdWFsaXplcjogb3B0aW9ucy5kaXNhYmxlRXF1YWxpemVyLFxuICAgICAgZGlzYWJsZUZpbHRlcmVyOiBvcHRpb25zLmRpc2FibGVGaWx0ZXJlcixcbiAgICAgIGRpc2FibGVSZXNhbXBsZXI6IG9wdGlvbnMuZGlzYWJsZVJlc2FtcGxlcixcbiAgICAgIGRpc2FibGVWb2x1bWU6IG9wdGlvbnMuZGlzYWJsZVZvbHVtZSxcbiAgICAgIGRpc2FibGVGYWxsYmFja1N0cmVhbTogb3B0aW9ucy5kaXNhYmxlRmFsbGJhY2tTdHJlYW0sXG4gICAgICBlbmFibGVTdHJlYW1JbnRlcmNlcHRvcjogb3B0aW9ucy5lbmFibGVTdHJlYW1JbnRlcmNlcHRvcixcbiAgICAgIHZlcmlmeUZhbGxiYWNrU3RyZWFtOiBvcHRpb25zLnZlcmlmeUZhbGxiYWNrU3RyZWFtLFxuICAgICAgZGlzYWJsZUNvbXByZXNzb3I6IG9wdGlvbnMuZGlzYWJsZUNvbXByZXNzb3IsXG4gICAgICBkaXNhYmxlU2Vla2VyOiBvcHRpb25zLmRpc2FibGVTZWVrZXIsXG4gICAgICBkaXNhYmxlUmV2ZXJiOiBvcHRpb25zLmRpc2FibGVSZXZlcmJcbiAgICB9KTtcblxuICAgIHRoaXMuY2FjaGUuc2V0KHNlcnZlci5pZCwgcXVldWUpO1xuXG4gICAgcmV0dXJuIHF1ZXVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBleGlzdGluZyBxdWV1ZVxuICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAqL1xuICBwdWJsaWMgZ2V0PFQgPSBNZXRhPihub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5yZXNvbHZlKG5vZGUpO1xuICAgIGlmICghcXVldWUpIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0KHF1ZXVlLmlkKSBhcyBHdWlsZFF1ZXVlPFQ+IHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBxdWV1ZSBleGlzdHNcbiAgICogQHBhcmFtIG5vZGUgUXVldWUgcmVzb2x2YWJsZVxuICAgKi9cbiAgcHVibGljIGhhcyhub2RlOiBOb2RlUmVzb2x2YWJsZSkge1xuICAgIGNvbnN0IGlkID1cbiAgICBub2RlIGluc3RhbmNlb2YgR3VpbGRRdWV1ZSA/XG4gICAgbm9kZS5pZCA6XG4gICAgdGhpcy5wbGF5ZXIuY2xpZW50Lmd1aWxkcy5yZXNvbHZlSWQobm9kZSkhO1xuICAgIHJldHVybiB0aGlzLmNhY2hlLmhhcyhpZCk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIHF1ZXVlXG4gICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICovXG4gIHB1YmxpYyBkZWxldGUobm9kZTogTm9kZVJlc29sdmFibGUpIHtcbiAgICBjb25zdCBxdWV1ZSA9IHRoaXMucmVzb2x2ZShub2RlKTtcbiAgICBpZiAoIXF1ZXVlKSB7XG4gICAgICB0aHJvdyBuZXcgTm9HdWlsZFF1ZXVlRXJyb3IoJ0Nhbm5vdCBkZWxldGUgbm9uLWV4aXN0aW5nIHF1ZXVlJyk7XG4gICAgfVxuXG4gICAgcXVldWUuc2V0VHJhbnNpdGlvbmluZyh0cnVlKTtcbiAgICBxdWV1ZS5ub2RlLnN0b3AodHJ1ZSk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHF1ZXVlLmNvbm5lY3Rpb24/LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIHF1ZXVlLmRpc3BhdGNoZXI/LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIHF1ZXVlLmRpc3BhdGNoZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICBxdWV1ZS50aW1lb3V0cy5mb3JFYWNoKCh0bSkgPT4gY2xlYXJUaW1lb3V0KHRtKSk7XG4gICAgcXVldWUuaGlzdG9yeS5jbGVhcigpO1xuICAgIHF1ZXVlLnRyYWNrcy5jbGVhcigpO1xuXG4gICAgcmV0dXJuIHRoaXMuY2FjaGUuZGVsZXRlKHF1ZXVlLmlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIHF1ZXVlXG4gICAqIEBwYXJhbSBub2RlIFF1ZXVlIHJlc29sdmFibGVcbiAgICovXG4gIHB1YmxpYyByZXNvbHZlPFQgPSBNZXRhPihub2RlOiBOb2RlUmVzb2x2YWJsZSk6IEd1aWxkUXVldWU8VD4gfCB1bmRlZmluZWQge1xuICAgIGlmIChub2RlIGluc3RhbmNlb2YgR3VpbGRRdWV1ZSkge1xuICAgICAgcmV0dXJuIG5vZGUgYXMgR3VpbGRRdWV1ZTxUPjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoXG4gICAgICB0aGlzLnBsYXllci5jbGllbnQuZ3VpbGRzLnJlc29sdmVJZChub2RlKSFcbiAgICApIGFzIEd1aWxkUXVldWU8VD47XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBxdWV1ZSBpZFxuICAgKiBAcGFyYW0gbm9kZSBRdWV1ZSByZXNvbHZhYmxlXG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZUlkKG5vZGU6IE5vZGVSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgcSA9IHRoaXMucmVzb2x2ZShub2RlKTtcbiAgICByZXR1cm4gcT8uaWQgfHwgbnVsbDtcbiAgfVxufSIsICJpbXBvcnQgeyBQbGF5ZXIsIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnMsIFRyYWNrTGlrZSB9IGZyb20gJy4uL1BsYXllcic7XG5pbXBvcnQge1xuICBDaGFubmVsVHlwZSxcbiAgR3VpbGQsXG4gIEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSxcbiAgVm9pY2VCYXNlZENoYW5uZWwsXG4gIFZvaWNlU3RhdGUgfSBmcm9tXG4nZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uLCBRdWV1ZSwgUXVldWVTdHJhdGVneSB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQge1xuICBCaXF1YWRGaWx0ZXJzLFxuICBDb21tb25SZXNhbXBsZXJGaWx0ZXJQcmVzZXQsXG4gIENvbXByZXNzb3JQYXJhbWV0ZXJzLFxuICBFcXVhbGl6ZXJCYW5kLFxuICBQQ01GaWx0ZXJzLFxuICBSZXZlcmJQYXJhbWV0ZXJzLFxuICBTZWVrZXJQYXJhbWV0ZXJzIH0gZnJvbVxuJ0BkaXNjb3JkLXBsYXllci9lcXVhbGl6ZXInO1xuaW1wb3J0IHsgVHJhY2ssIFRyYWNrUmVzb2x2YWJsZSB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBTdHJlYW1EaXNwYXRjaGVyIH0gZnJvbSAnLi4vc3RyZWFtL1N0cmVhbURpc3BhdGNoZXInO1xuaW1wb3J0IHtcbiAgdHlwZSBBdWRpb1BsYXllcixcbiAgQXVkaW9SZXNvdXJjZSxcbiAgU3RyZWFtVHlwZSxcbiAgVm9pY2VDb25uZWN0aW9uLFxuICBWb2ljZUNvbm5lY3Rpb25TdGF0dXMgfSBmcm9tXG4nZGlzY29yZC12b2lwJztcbmltcG9ydCB7IFV0aWwsIFZBTElEQVRFX1FVRVVFX0NBUCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgUGxheWxpc3QgfSBmcm9tICcuLi9mYWJyaWMvUGxheWxpc3QnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZUhpc3RvcnkgfSBmcm9tICcuL0d1aWxkUXVldWVIaXN0b3J5JztcbmltcG9ydCB7IEd1aWxkUXVldWVQbGF5ZXJOb2RlLCBTdHJlYW1Db25maWcgfSBmcm9tICcuL0d1aWxkUXVldWVQbGF5ZXJOb2RlJztcbmltcG9ydCB7IEd1aWxkUXVldWVBdWRpb0ZpbHRlcnMgfSBmcm9tICcuL0d1aWxkUXVldWVBdWRpb0ZpbHRlcnMnO1xuaW1wb3J0IHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ3RpbWVycyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlU3RhdGlzdGljcyB9IGZyb20gJy4vR3VpbGRRdWV1ZVN0YXRpc3RpY3MnO1xuaW1wb3J0IHsgVHlwZVV0aWwgfSBmcm9tICcuLi91dGlscy9UeXBlVXRpbCc7XG5pbXBvcnQgeyBBc3luY1F1ZXVlIH0gZnJvbSAnLi4vdXRpbHMvQXN5bmNRdWV1ZSc7XG5pbXBvcnQge1xuICBJbnZhbGlkQXJnVHlwZUVycm9yLFxuICBOb1ZvaWNlQ2hhbm5lbEVycm9yLFxuICBOb1ZvaWNlQ29ubmVjdGlvbkVycm9yLFxuICBPdXRPZlJhbmdlRXJyb3IsXG4gIFZvaWNlQ29ubmVjdGlvbkRlc3Ryb3llZEVycm9yIH0gZnJvbVxuJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBTeW5jZWRMeXJpY3NQcm92aWRlciB9IGZyb20gJy4vU3luY2VkTHlyaWNzUHJvdmlkZXInO1xuaW1wb3J0IHsgTHJjR2V0UmVzdWx0LCBMcmNTZWFyY2hSZXN1bHQgfSBmcm9tICcuLi9scmNsaWIvTHJjTGliJztcbmltcG9ydCB7IEZpbHRlcnNOYW1lIH0gZnJvbSAnLi4vZmFicmljJztcbmltcG9ydCB7IFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb20gJy4uL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuaW1wb3J0IHR5cGUgeyBFeHRyYWN0b3JTdHJlYW1hYmxlIH0gZnJvbSAnLi4vZXh0cmFjdG9ycy9CYXNlRXh0cmFjdG9yJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGROb2RlSW5pdDxNZXRhID0gYW55PiB7XG4gIGd1aWxkOiBHdWlsZDtcbiAgcXVldWVTdHJhdGVneTogUXVldWVTdHJhdGVneTtcbiAgZXF1YWxpemVyOiBFcXVhbGl6ZXJCYW5kW10gfCBib29sZWFuO1xuICB2b2x1bWU6IG51bWJlciB8IGJvb2xlYW47XG4gIGJpcXVhZDogQmlxdWFkRmlsdGVycyB8IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHJlc2FtcGxlcjogbnVtYmVyIHwgYm9vbGVhbjtcbiAgZmlsdGVyZXI6IFBDTUZpbHRlcnNbXSB8IGJvb2xlYW47XG4gIGZmbXBlZ0ZpbHRlcnM6IEZpbHRlcnNOYW1lW107XG4gIGRpc2FibGVIaXN0b3J5OiBib29sZWFuO1xuICBvbkJlZm9yZUNyZWF0ZVN0cmVhbT86IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlcjtcbiAgb25BZnRlckNyZWF0ZVN0cmVhbT86IE9uQWZ0ZXJDcmVhdGVTdHJlYW1IYW5kbGVyO1xuICBvblN0cmVhbUV4dHJhY3RlZD86IE9uU3RyZWFtRXh0cmFjdGVkSGFuZGxlcjtcbiAgcmVwZWF0TW9kZT86IFF1ZXVlUmVwZWF0TW9kZTtcbiAgbGVhdmVPbkVtcHR5OiBib29sZWFuO1xuICBsZWF2ZU9uRW1wdHlDb29sZG93bjogbnVtYmVyO1xuICBsZWF2ZU9uRW5kOiBib29sZWFuO1xuICBsZWF2ZU9uRW5kQ29vbGRvd246IG51bWJlcjtcbiAgbGVhdmVPblN0b3A6IGJvb2xlYW47XG4gIGxlYXZlT25TdG9wQ29vbGRvd246IG51bWJlcjtcbiAgY29ubmVjdGlvblRpbWVvdXQ6IG51bWJlcjtcbiAgc2VsZkRlYWY/OiBib29sZWFuO1xuICBtZXRhZGF0YT86IE1ldGEgfCBudWxsO1xuICBidWZmZXJpbmdUaW1lb3V0OiBudW1iZXI7XG4gIG5vRW1pdEluc2VydDogYm9vbGVhbjtcbiAgbWF4U2l6ZT86IG51bWJlcjtcbiAgbWF4SGlzdG9yeVNpemU/OiBudW1iZXI7XG4gIHByZWZlckJyaWRnZWRNZXRhZGF0YTogYm9vbGVhbjtcbiAgcGF1c2VPbkVtcHR5PzogYm9vbGVhbjtcbiAgZGlzYWJsZVZvbHVtZTogYm9vbGVhbjtcbiAgZGlzYWJsZUVxdWFsaXplcjogYm9vbGVhbjtcbiAgZGlzYWJsZUZpbHRlcmVyOiBib29sZWFuO1xuICBkaXNhYmxlQmlxdWFkOiBib29sZWFuO1xuICBkaXNhYmxlUmVzYW1wbGVyOiBib29sZWFuO1xuICBkaXNhYmxlQ29tcHJlc3NvcjogYm9vbGVhbjtcbiAgZGlzYWJsZVJldmVyYjogYm9vbGVhbjtcbiAgZGlzYWJsZVNlZWtlcjogYm9vbGVhbjtcbiAgZGlzYWJsZUZhbGxiYWNrU3RyZWFtOiBib29sZWFuO1xuICBlbmFibGVTdHJlYW1JbnRlcmNlcHRvcjogYm9vbGVhbjtcbiAgdmVyaWZ5RmFsbGJhY2tTdHJlYW06IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9pY2VDb25uZWN0Q29uZmlnIHtcbiAgZGVhZj86IGJvb2xlYW47XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIGdyb3VwPzogc3RyaW5nO1xuICBhdWRpb1BsYXllcj86IEF1ZGlvUGxheWVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBvc3RQcm9jZXNzZWRSZXN1bHQge1xuICBzdHJlYW06IFJlYWRhYmxlO1xuICB0eXBlOiBTdHJlYW1UeXBlO1xufVxuXG5leHBvcnQgdHlwZSBPbkJlZm9yZUNyZWF0ZVN0cmVhbUhhbmRsZXIgPSAoXG50cmFjazogVHJhY2ssXG5xdWVyeVR5cGU6IFNlYXJjaFF1ZXJ5VHlwZSxcbnF1ZXVlOiBHdWlsZFF1ZXVlKVxuPT4gUHJvbWlzZTxSZWFkYWJsZSB8IG51bGw+O1xuXG5leHBvcnQgdHlwZSBPblN0cmVhbUV4dHJhY3RlZEhhbmRsZXIgPSAoXG5zdHJlYW06IFJlYWRhYmxlIHwgRXh0cmFjdG9yU3RyZWFtYWJsZSB8IHN0cmluZyxcbnRyYWNrOiBUcmFjayxcbnF1ZXVlOiBHdWlsZFF1ZXVlKVxuPT4gUHJvbWlzZTxSZWFkYWJsZSB8IEV4dHJhY3RvclN0cmVhbWFibGUgfCBzdHJpbmc+O1xuXG5leHBvcnQgdHlwZSBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlcjxUID0gdW5rbm93bj4gPSAoXG5zdHJlYW06IFJlYWRhYmxlLFxucXVldWU6IEd1aWxkUXVldWUsXG50cmFjazogVHJhY2s8VD4pXG49PiBQcm9taXNlPFBvc3RQcm9jZXNzZWRSZXN1bHQgfCBudWxsPjtcblxuZXhwb3J0IHR5cGUgUGxheWVyVHJpZ2dlcmVkUmVhc29uID0gJ2ZpbHRlcnMnIHwgJ25vcm1hbCc7XG5cbmV4cG9ydCBjb25zdCBHdWlsZFF1ZXVlRXZlbnQgPSB7XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2sgaXMgYWRkZWQgdG8gdGhlIHF1ZXVlXG4gICAqL1xuICBBdWRpb1RyYWNrQWRkOiAnYXVkaW9UcmFja0FkZCcsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2tzIHdlcmUgYWRkZWQgdG8gdGhlIHF1ZXVlXG4gICAqL1xuICBBdWRpb1RyYWNrc0FkZDogJ2F1ZGlvVHJhY2tzQWRkJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFjayBpcyByZW1vdmVkIGZyb20gdGhlIHF1ZXVlXG4gICAqL1xuICBBdWRpb1RyYWNrUmVtb3ZlOiAnYXVkaW9UcmFja1JlbW92ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gdHJhY2tzIGFyZSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlXG4gICAqL1xuICBBdWRpb1RyYWNrc1JlbW92ZTogJ2F1ZGlvVHJhY2tzUmVtb3ZlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgY3JlYXRlZFxuICAgKi9cbiAgQ29ubmVjdGlvbjogJ2Nvbm5lY3Rpb24nLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgdm9pY2UgY29ubmVjdGlvbiBpcyBkZXN0cm95ZWRcbiAgICovXG4gIENvbm5lY3Rpb25EZXN0cm95ZWQ6ICdjb25uZWN0aW9uRGVzdHJveWVkJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYm90IGlzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBjaGFubmVsXG4gICAqL1xuICBEaXNjb25uZWN0OiAnZGlzY29ubmVjdCcsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIHNlbmRzIGEgZGVidWcgaW5mb1xuICAgKi9cbiAgRGVidWc6ICdkZWJ1ZycsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGVuY291bnRlcnMgZXJyb3JcbiAgICovXG4gIEVycm9yOiAnZXJyb3InLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBjaGFubmVsIGlzIGVtcHR5XG4gICAqL1xuICBFbXB0eUNoYW5uZWw6ICdlbXB0eUNoYW5uZWwnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBpcyBlbXB0eVxuICAgKi9cbiAgRW1wdHlRdWV1ZTogJ2VtcHR5UXVldWUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc3RhcnRzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgKi9cbiAgUGxheWVyU3RhcnQ6ICdwbGF5ZXJTdGFydCcsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBlcnJvcnMgd2hpbGUgc3RyZWFtaW5nIGF1ZGlvIHRyYWNrXG4gICAqL1xuICBQbGF5ZXJFcnJvcjogJ3BsYXllckVycm9yJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGZpbmlzaGVzIHN0cmVhbWluZyBhdWRpbyB0cmFja1xuICAgKi9cbiAgUGxheWVyRmluaXNoOiAncGxheWVyRmluaXNoJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIHNraXBzIGN1cnJlbnQgdHJhY2tcbiAgICovXG4gIFBsYXllclNraXA6ICdwbGF5ZXJTa2lwJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGlzIHRyaWdnZXJlZFxuICAgKi9cbiAgUGxheWVyVHJpZ2dlcjogJ3BsYXllclRyaWdnZXInLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBzdGF0ZSBpcyB1cGRhdGVkLiBDb25zdW1pbmcgdGhpcyBldmVudCBtYXkgZGlzYWJsZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGBQbGF5ZXIuaXNWb2ljZVN0YXRlSGFuZGxlckxvY2tlZCgpYCByZXR1cm5zIGBmYWxzZWAuXG4gICAqL1xuICBWb2ljZVN0YXRlVXBkYXRlOiAndm9pY2VTdGF0ZVVwZGF0ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdm9sdW1lIGlzIHVwZGF0ZWRcbiAgICovXG4gIFZvbHVtZUNoYW5nZTogJ3ZvbHVtZUNoYW5nZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gcGxheWVyIGlzIHBhdXNlZFxuICAgKi9cbiAgUGxheWVyUGF1c2U6ICdwbGF5ZXJQYXVzZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gcGxheWVyIGlzIHJlc3VtZWRcbiAgICovXG4gIFBsYXllclJlc3VtZTogJ3BsYXllclJlc3VtZScsXG4gIC8qKlxuICAgKiBCaXF1YWQgRmlsdGVycyBVcGRhdGVcbiAgICovXG4gIEJpcXVhZEZpbHRlcnNVcGRhdGU6ICdiaXF1YWRGaWx0ZXJzVXBkYXRlJyxcbiAgLyoqXG4gICAqIEVxdWFsaXplciBVcGRhdGVcbiAgICovXG4gIEVxdWFsaXplclVwZGF0ZTogJ2VxdWFsaXplclVwZGF0ZScsXG4gIC8qKlxuICAgKiBEU1AgdXBkYXRlXG4gICAqL1xuICBEU1BVcGRhdGU6ICdkc3BVcGRhdGUnLFxuICAvKipcbiAgICogQXVkaW8gRmlsdGVycyBVcGRhdGVcbiAgICovXG4gIEF1ZGlvRmlsdGVyc1VwZGF0ZTogJ2F1ZGlvRmlsdGVyc1VwZGF0ZScsXG4gIC8qKlxuICAgKiBBdWRpbyBwbGF5ZXIgd2lsbCBwbGF5IG5leHQgdHJhY2tcbiAgICovXG4gIFdpbGxQbGF5VHJhY2s6ICd3aWxsUGxheVRyYWNrJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHZvaWNlIGNoYW5uZWwgaXMgcmVwb3B1bGF0ZWRcbiAgICovXG4gIENoYW5uZWxQb3B1bGF0ZTogJ2NoYW5uZWxQb3B1bGF0ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZFxuICAgKi9cbiAgUXVldWVDcmVhdGU6ICdxdWV1ZUNyZWF0ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSBxdWV1ZSBpcyBkZWxldGVkXG4gICAqL1xuICBRdWV1ZURlbGV0ZTogJ3F1ZXVlRGVsZXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIHF1ZXVlIGlzIHRyeWluZyB0byBhZGQgc2ltaWxhciB0cmFjayBmb3IgYXV0b3BsYXlcbiAgICovXG4gIFdpbGxBdXRvUGxheTogJ3dpbGxBdXRvUGxheScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gc2FtcGxlIHJhdGUgaXMgdXBkYXRlZFxuICAgKi9cbiAgU2FtcGxlUmF0ZVVwZGF0ZTogJ3NhbXBsZVJhdGVVcGRhdGUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgbmFtZWQgc2FtcGxlIHJhdGUgZmlsdGVyIGlzIHVwZGF0ZWRcbiAgICovXG4gIFNhbXBsZVJhdGVGaWx0ZXJVcGRhdGU6ICdzYW1wbGVSYXRlRmlsdGVyVXBkYXRlJyxcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiByZXZlcmIgZmlsdGVyIGlzIHVwZGF0ZWRcbiAgICovXG4gIFJldmVyYlVwZGF0ZTogJ3JldmVyYlVwZGF0ZScsXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gY29tcHJlc3NvciBmaWx0ZXIgaXMgdXBkYXRlZFxuICAgKi9cbiAgQ29tcHJlc3NvclVwZGF0ZTogJ2NvbXByZXNzb3JVcGRhdGUnLFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHNlZWsgaXMgcGVyZm9ybWVkXG4gICAqL1xuICBQbGF5ZXJTZWVrOiAncGxheWVyU2Vlaydcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEd1aWxkUXVldWVFdmVudCA9XG4odHlwZW9mIEd1aWxkUXVldWVFdmVudClba2V5b2YgdHlwZW9mIEd1aWxkUXVldWVFdmVudF07XG5cbmV4cG9ydCBlbnVtIFRyYWNrU2tpcFJlYXNvbiB7XG4gIE5vU3RyZWFtID0gJ0VSUl9OT19TVFJFQU0nLFxuICBNYW51YWwgPSAnTUFOVUFMJyxcbiAgU0VFS19PVkVSX1RIUkVTSE9MRCA9ICdTRUVLX09WRVJfVEhSRVNIT0xEJyxcbiAgSnVtcCA9ICdKVU1QRURfVE9fQU5PVEhFUl9UUkFDSycsXG4gIFNraXBUbyA9ICdTS0lQX1RPX0FOT1RIRVJfVFJBQ0snLFxuICBIaXN0b3J5TmV4dCA9ICdISVNUT1JZX05FWFRfVFJBQ0snLFxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGludGVyZmFjZSBHdWlsZFF1ZXVlRXZlbnRzPE1ldGEgPSBhbnk+IHtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFjayBpcyBhZGRlZCB0byB0aGUgcXVldWVcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja0FkZF06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFjaylcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3Mgd2VyZSBhZGRlZCB0byB0aGUgcXVldWVcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFja3MgVGhlIHRyYWNrcyBhcnJheVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrc0FkZF06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFja1tdKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHRyYWNrIGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja1JlbW92ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFjaylcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhdWRpbyB0cmFja3MgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcXVldWVcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja3NSZW1vdmVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICB0cmFjazogVHJhY2tbXSlcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgY3JlYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQ29ubmVjdGlvbl06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgZGVzdHJveWVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5Db25uZWN0aW9uRGVzdHJveWVkXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBib3QgaXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIGNoYW5uZWxcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LkRpc2Nvbm5lY3RdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIHNlbmRzIGEgZGVidWcgaW5mb1xuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGRlYnVnIG1lc3NhZ2VcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRGVidWddOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBtZXNzYWdlOiBzdHJpbmcpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHF1ZXVlIGVuY291bnRlcnMgZXJyb3JcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3JcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRXJyb3JdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4sIGVycm9yOiBFcnJvcikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgdm9pY2UgY2hhbm5lbCBpcyBlbXB0eVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRW1wdHlDaGFubmVsXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBxdWV1ZSBpcyBlbXB0eVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRW1wdHlRdWV1ZV06IChxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPikgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIHN0YXJ0cyBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCBpcyBiZWluZyBzdHJlYW1lZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJTdGFydF06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFjaylcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgYXVkaW8gcGxheWVyIGVycm9ycyB3aGlsZSBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3JcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IGlzIGJlaW5nIHN0cmVhbWVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllckVycm9yXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgZXJyb3I6IEVycm9yLFxuICB0cmFjazogVHJhY2spXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBmaW5pc2hlcyBzdHJlYW1pbmcgYXVkaW8gdHJhY2tcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdGhhdCB3YXMgYmVpbmcgc3RyZWFtZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyRmluaXNoXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2s6IFRyYWNrKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBhdWRpbyBwbGF5ZXIgc2tpcHMgY3VycmVudCB0cmFja1xuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdhcyBza2lwcGVkXG4gICAqIEBwYXJhbSByZWFzb24gVGhlIHJlYXNvbiBmb3Igc2tpcHBpbmdcbiAgICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbiBmb3Igc2tpcHBpbmdcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyU2tpcF06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFjayxcbiAgcmVhc29uOiBUcmFja1NraXBSZWFzb24sXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGF1ZGlvIHBsYXllciBpcyB0cmlnZ2VyZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgd2hpY2ggd2FzIHBsYXllZCBpbiB0aGlzIGV2ZW50XG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllclRyaWdnZXJdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICB0cmFjazogVHJhY2ssXG4gIHJlYXNvbjogUGxheWVyVHJpZ2dlcmVkUmVhc29uKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSB2b2ljZSBzdGF0ZSBpcyB1cGRhdGVkLiBDb25zdW1pbmcgdGhpcyBldmVudCBtYXkgZGlzYWJsZSBkZWZhdWx0IHZvaWNlIHN0YXRlIHVwZGF0ZSBoYW5kbGVyIGlmIGBQbGF5ZXIuaXNWb2ljZVN0YXRlSGFuZGxlckxvY2tlZCgpYCByZXR1cm5zIGBmYWxzZWAuXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkU3RhdGUgVGhlIG9sZCB2b2ljZSBzdGF0ZVxuICAgKiBAcGFyYW0gbmV3U3RhdGUgVGhlIG5ldyB2b2ljZSBzdGF0ZVxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5Wb2ljZVN0YXRlVXBkYXRlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgb2xkU3RhdGU6IFZvaWNlU3RhdGUsXG4gIG5ld1N0YXRlOiBWb2ljZVN0YXRlKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHBsYXllciBpcyBwYXVzZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlBsYXllclBhdXNlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGF1ZGlvIHBsYXllciBpcyByZXN1bWVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5QbGF5ZXJSZXN1bWVdOiAocXVldWU6IEd1aWxkUXVldWU8TWV0YT4pID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYXVkaW8gcGxheWVyJ3Mgdm9sdW1lIGlzIGNoYW5nZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRWb2x1bWUgVGhlIG9sZCB2b2x1bWVcbiAgICogQHBhcmFtIG5ld1ZvbHVtZSBUaGUgdXBkYXRlZCB2b2x1bWVcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuVm9sdW1lQ2hhbmdlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgb2xkVm9sdW1lOiBudW1iZXIsXG4gIG5ld1ZvbHVtZTogbnVtYmVyKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGVxdWFsaXplciBjb25maWcgaXMgdXBkYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZEZpbHRlcnMgT2xkIGZpbHRlcnNcbiAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuRXF1YWxpemVyVXBkYXRlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgb2xkRmlsdGVyczogRXF1YWxpemVyQmFuZFtdLFxuICBuZXdGaWx0ZXJzOiBFcXVhbGl6ZXJCYW5kW10pXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYmlxdWFkIGZpbHRlcnMgaXMgdXBkYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZEZpbHRlcnMgT2xkIGZpbHRlcnNcbiAgICogQHBhcmFtIG5ld0ZpbHRlcnMgTmV3IGZpbHRlcnNcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQmlxdWFkRmlsdGVyc1VwZGF0ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIG9sZEZpbHRlcnM6IEJpcXVhZEZpbHRlcnMgfCBudWxsLFxuICBuZXdGaWx0ZXJzOiBCaXF1YWRGaWx0ZXJzIHwgbnVsbClcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBkc3AgZmlsdGVycyBpcyB1cGRhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5EU1BVcGRhdGVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRGaWx0ZXJzOiBQQ01GaWx0ZXJzW10sXG4gIG5ld0ZpbHRlcnM6IFBDTUZpbHRlcnNbXSlcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBmZm1wZWcgYXVkaW8gZmlsdGVycyBpcyB1cGRhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkRmlsdGVycyBPbGQgZmlsdGVyc1xuICAgKiBAcGFyYW0gbmV3RmlsdGVycyBOZXcgZmlsdGVyc1xuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5BdWRpb0ZpbHRlcnNVcGRhdGVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRGaWx0ZXJzOiBGaWx0ZXJzTmFtZVtdLFxuICBuZXdGaWx0ZXJzOiBGaWx0ZXJzTmFtZVtdKVxuICA9PiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBFbWl0dGVkIGJlZm9yZSBzdHJlYW1pbmcgYW4gYXVkaW8gdHJhY2suIFRoaXMgZXZlbnQgY2FuIGJlIHVzZWQgdG8gbW9kaWZ5IHN0cmVhbSBjb25maWcgYmVmb3JlIHBsYXlpbmcgYSB0cmFjay5cbiAgICogTGlzdGVuaW5nIHRvIHRoaXMgZXZlbnQgd2lsbCBwYXVzZSB0aGUgZXhlY3V0aW9uIG9mIGF1ZGlvIHBsYXllciB1bnRpbCBgZG9uZSgpYCBpcyBpbnZva2VkLlxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0aGF0IHdpbGwgYmUgc3RyZWFtZWRcbiAgICogQHBhcmFtIGNvbmZpZyBDb25maWd1cmF0aW9ucyBmb3Igc3RyZWFtaW5nXG4gICAqIEBwYXJhbSBkb25lIERvbmUgY2FsbGJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuV2lsbFBsYXlUcmFja106IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHRyYWNrOiBUcmFjazx1bmtub3duPixcbiAgY29uZmlnOiBTdHJlYW1Db25maWcsXG4gIGRvbmU6ICgpID0+IHZvaWQpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYSB2b2ljZSBjaGFubmVsIGlzIHBvcHVsYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuQ2hhbm5lbFBvcHVsYXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlF1ZXVlQ3JlYXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlF1ZXVlRGVsZXRlXTogKHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+KSA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgcXVldWUgaXMgdHJ5aW5nIHRvIGFkZCBzaW1pbGFyIHRyYWNrIGZvciBhdXRvcGxheVxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIHRyYWNrcyBUaGUgc2ltaWxhciB0cmFja3MgdGhhdCB3ZXJlIGZvdW5kXG4gICAqIEBwYXJhbSBkb25lIERvbmUgY2FsbGJhY2tcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuV2lsbEF1dG9QbGF5XTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgdHJhY2tzOiBUcmFja1tdLFxuICBkb25lOiAodHJhY2s6IFRyYWNrIHwgbnVsbCkgPT4gdm9pZClcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiBzYW1wbGUgcmF0ZSBpcyB1cGRhdGVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gb2xkUmF0ZSBUaGUgb2xkIHNhbXBsZSByYXRlXG4gICAqIEBwYXJhbSBuZXdSYXRlIFRoZSBuZXcgc2FtcGxlIHJhdGVcbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuU2FtcGxlUmF0ZVVwZGF0ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIG9sZFJhdGU6IG51bWJlcixcbiAgbmV3UmF0ZTogbnVtYmVyKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGEgbmFtZWQgc2FtcGxlIHJhdGUgZmlsdGVyIGlzIHVwZGF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRSYXRlIFRoZSBvbGQgc2FtcGxlIHJhdGUgZmlsdGVyXG4gICAqIEBwYXJhbSBuZXdSYXRlIFRoZSBuZXcgc2FtcGxlIHJhdGUgZmlsdGVyXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlNhbXBsZVJhdGVGaWx0ZXJVcGRhdGVdOiAoXG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPE1ldGE+LFxuICBvbGRGaWx0ZXI6IENvbW1vblJlc2FtcGxlckZpbHRlclByZXNldCB8IG51bGwsXG4gIG5ld0ZpbHRlcjogQ29tbW9uUmVzYW1wbGVyRmlsdGVyUHJlc2V0IHwgbnVsbClcbiAgPT4gdW5rbm93bjtcbiAgLyoqXG4gICAqIEVtaXR0ZWQgd2hlbiByZXZlcmIgZmlsdGVyIGlzIHVwZGF0ZWRcbiAgICogQHBhcmFtIHF1ZXVlIFRoZSBxdWV1ZSB3aGVyZSB0aGlzIGV2ZW50IG9jY3VycmVkXG4gICAqIEBwYXJhbSBvbGRGaWx0ZXIgVGhlIG9sZCByZXZlcmIgZmlsdGVyXG4gICAqIEBwYXJhbSBuZXdGaWx0ZXIgVGhlIG5ldyByZXZlcmIgZmlsdGVyXG4gICAqL1xuICBbR3VpbGRRdWV1ZUV2ZW50LlJldmVyYlVwZGF0ZV06IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIG9sZEZpbHRlcjogUmV2ZXJiUGFyYW1ldGVycyB8IG51bGwsXG4gIG5ld0ZpbHRlcjogUmV2ZXJiUGFyYW1ldGVycyB8IG51bGwpXG4gID0+IHVua25vd247XG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gY29tcHJlc3NvciBmaWx0ZXIgaXMgdXBkYXRlZFxuICAgKiBAcGFyYW0gcXVldWUgVGhlIHF1ZXVlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWRcbiAgICogQHBhcmFtIG9sZEZpbHRlciBUaGUgb2xkIGNvbXByZXNzb3IgZmlsdGVyXG4gICAqIEBwYXJhbSBuZXdGaWx0ZXIgVGhlIG5ldyBjb21wcmVzc29yIGZpbHRlclxuICAgKi9cbiAgW0d1aWxkUXVldWVFdmVudC5Db21wcmVzc29yVXBkYXRlXTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxNZXRhPixcbiAgb2xkRmlsdGVyOiBDb21wcmVzc29yUGFyYW1ldGVycyB8IG51bGwsXG4gIG5ld0ZpbHRlcjogQ29tcHJlc3NvclBhcmFtZXRlcnMgfCBudWxsKVxuICA9PiB1bmtub3duO1xuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHNlZWsgaXMgcGVyZm9ybWVkXG4gICAqIEBwYXJhbSBxdWV1ZSBUaGUgcXVldWUgd2hlcmUgdGhpcyBldmVudCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHNlZWsgcG9zaXRpb25cbiAgICovXG4gIFtHdWlsZFF1ZXVlRXZlbnQuUGxheWVyU2Vla106IChcbiAgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4sXG4gIHBhcmFtZXRlcnM6IFNlZWtlclBhcmFtZXRlcnMpXG4gID0+IHVua25vd247XG59XG5cbi8qKlxuICogVGhlIHF1ZXVlIHJlcGVhdCBtb2RlLiBUaGlzIGNhbiBiZSBvbmUgb2Y6XG4gKiAtIE9GRlxuICogLSBUUkFDS1xuICogLSBRVUVVRVxuICogLSBBVVRPUExBWVxuICovXG5leHBvcnQgY29uc3QgUXVldWVSZXBlYXRNb2RlID0ge1xuICAvKipcbiAgICogRGlzYWJsZSByZXBlYXQgbW9kZS5cbiAgICovXG4gIE9GRjogMCxcbiAgLyoqXG4gICAqIFJlcGVhdCB0aGUgY3VycmVudCB0cmFjay5cbiAgICovXG4gIFRSQUNLOiAxLFxuICAvKipcbiAgICogUmVwZWF0IHRoZSBlbnRpcmUgcXVldWUuXG4gICAqL1xuICBRVUVVRTogMixcbiAgLyoqXG4gICAqIFdoZW4gbGFzdCB0cmFjayBlbmRzLCBwbGF5IHNpbWlsYXIgdHJhY2tzIGluIHRoZSBmdXR1cmUgaWYgcXVldWUgaXMgZW1wdHkuXG4gICAqL1xuICBBVVRPUExBWTogM1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgUXVldWVSZXBlYXRNb2RlID1cbih0eXBlb2YgUXVldWVSZXBlYXRNb2RlKVtrZXlvZiB0eXBlb2YgUXVldWVSZXBlYXRNb2RlXTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlPE1ldGEgPSBhbnk+IHtcbiAgI3RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgI2RlbGV0ZWQgPSBmYWxzZTtcbiAgI3NodWZmbGUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfX2N1cnJlbnQ6IFRyYWNrIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyB0cmFja3M6IFF1ZXVlPFRyYWNrPjtcbiAgcHVibGljIGhpc3RvcnkgPSBuZXcgR3VpbGRRdWV1ZUhpc3Rvcnk8TWV0YT4odGhpcyk7XG4gIHB1YmxpYyBkaXNwYXRjaGVyOiBTdHJlYW1EaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBub2RlID0gbmV3IEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGE+KHRoaXMpO1xuICBwdWJsaWMgZmlsdGVycyA9IG5ldyBHdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzPE1ldGE+KHRoaXMpO1xuICBwdWJsaWMgb25CZWZvcmVDcmVhdGVTdHJlYW06IE9uQmVmb3JlQ3JlYXRlU3RyZWFtSGFuZGxlciA9IGFzeW5jICgpID0+IG51bGw7XG4gIHB1YmxpYyBvbkFmdGVyQ3JlYXRlU3RyZWFtOiBPbkFmdGVyQ3JlYXRlU3RyZWFtSGFuZGxlciA9IGFzeW5jIChzdHJlYW0pID0+ICh7XG4gICAgc3RyZWFtLFxuICAgIHR5cGU6IFN0cmVhbVR5cGUuUmF3XG4gIH0pO1xuICBwdWJsaWMgb25TdHJlYW1FeHRyYWN0ZWQ6IE9uU3RyZWFtRXh0cmFjdGVkSGFuZGxlciA9IGFzeW5jIChzdHJlYW0pID0+IHN0cmVhbTtcbiAgcHVibGljIHJlcGVhdE1vZGU6IFF1ZXVlUmVwZWF0TW9kZSA9IFF1ZXVlUmVwZWF0TW9kZS5PRkY7XG4gIHB1YmxpYyB0aW1lb3V0cyA9IG5ldyBDb2xsZWN0aW9uPHN0cmluZywgTm9kZUpTLlRpbWVvdXQ+KCk7XG4gIHB1YmxpYyBzdGF0cyA9IG5ldyBHdWlsZFF1ZXVlU3RhdGlzdGljczxNZXRhPih0aGlzKTtcbiAgcHVibGljIHRhc2tzUXVldWUgPSBuZXcgQXN5bmNRdWV1ZSgpO1xuICBwdWJsaWMgc3luY2VkTHlyaWNzUHJvdmlkZXIgPSBuZXcgU3luY2VkTHlyaWNzUHJvdmlkZXIodGhpcyk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICBwdWJsaWMgcGxheWVyOiBQbGF5ZXIsXG4gIHB1YmxpYyBvcHRpb25zOiBHdWlsZE5vZGVJbml0PE1ldGE+KVxuICB7XG4gICAgdGhpcy50cmFja3MgPSBuZXcgUXVldWU8VHJhY2s+KG9wdGlvbnMucXVldWVTdHJhdGVneSk7XG4gICAgaWYgKFR5cGVVdGlsLmlzRnVuY3Rpb24ob3B0aW9ucy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSkpXG4gICAgdGhpcy5vbkJlZm9yZUNyZWF0ZVN0cmVhbSA9IG9wdGlvbnMub25CZWZvcmVDcmVhdGVTdHJlYW07XG4gICAgaWYgKFR5cGVVdGlsLmlzRnVuY3Rpb24ob3B0aW9ucy5vbkFmdGVyQ3JlYXRlU3RyZWFtKSlcbiAgICB0aGlzLm9uQWZ0ZXJDcmVhdGVTdHJlYW0gPSBvcHRpb25zLm9uQWZ0ZXJDcmVhdGVTdHJlYW07XG4gICAgaWYgKFR5cGVVdGlsLmlzRnVuY3Rpb24ob3B0aW9ucy5vblN0cmVhbUV4dHJhY3RlZCkpXG4gICAgdGhpcy5vblN0cmVhbUV4dHJhY3RlZCA9IG9wdGlvbnMub25TdHJlYW1FeHRyYWN0ZWQ7XG4gICAgaWYgKCFUeXBlVXRpbC5pc051bGxpc2gob3B0aW9ucy5yZXBlYXRNb2RlKSlcbiAgICB0aGlzLnJlcGVhdE1vZGUgPSBvcHRpb25zLnJlcGVhdE1vZGU7XG5cbiAgICBvcHRpb25zLnNlbGZEZWFmID8/PSB0cnVlO1xuICAgIG9wdGlvbnMubWF4U2l6ZSA/Pz0gSW5maW5pdHk7XG4gICAgb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA/Pz0gSW5maW5pdHk7XG4gICAgb3B0aW9ucy5wYXVzZU9uRW1wdHkgPz89IHRydWU7XG5cbiAgICBpZiAoXG4gICAgIVR5cGVVdGlsLmlzTnVsbGlzaCh0aGlzLm9wdGlvbnMuYmlxdWFkKSAmJlxuICAgICFUeXBlVXRpbC5pc0Jvb2xlYW4odGhpcy5vcHRpb25zLmJpcXVhZCkpXG4gICAge1xuICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCA9IHRoaXMub3B0aW9ucy5iaXF1YWQ7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zLmVxdWFsaXplcikpIHtcbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIgPSB0aGlzLm9wdGlvbnMuZXF1YWxpemVyO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5maWx0ZXJlcikpIHtcbiAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzID0gdGhpcy5vcHRpb25zLmZpbHRlcmVyO1xuICAgIH1cblxuICAgIGlmIChUeXBlVXRpbC5pc051bWJlcih0aGlzLm9wdGlvbnMucmVzYW1wbGVyKSkge1xuICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnNhbXBsZVJhdGUgPSB0aGlzLm9wdGlvbnMucmVzYW1wbGVyO1xuICAgIH1cblxuICAgIGlmIChUeXBlVXRpbC5pc0FycmF5KHRoaXMub3B0aW9ucy5mZm1wZWdGaWx0ZXJzKSkge1xuICAgICAgdGhpcy5maWx0ZXJzLmZmbXBlZy5zZXREZWZhdWx0cyh0aGlzLm9wdGlvbnMuZmZtcGVnRmlsdGVycyk7XG4gICAgfVxuXG4gICAgaWYgKCFUeXBlVXRpbC5pc051bWJlcihvcHRpb25zLm1heFNpemUpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcihcbiAgICAgICAgJ1tHdWlsZE5vZGVJbml0Lm1heFNpemVdJyxcbiAgICAgICAgJ251bWJlcicsXG4gICAgICAgIHR5cGVvZiBvcHRpb25zLm1heFNpemVcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFUeXBlVXRpbC5pc051bWJlcihvcHRpb25zLm1heEhpc3RvcnlTaXplKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoXG4gICAgICAgICdbR3VpbGROb2RlSW5pdC5tYXhIaXN0b3J5U2l6ZV0nLFxuICAgICAgICAnbnVtYmVyJyxcbiAgICAgICAgdHlwZW9mIG9wdGlvbnMubWF4SGlzdG9yeVNpemVcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMubWF4U2l6ZSA8IDEpIG9wdGlvbnMubWF4U2l6ZSA9IEluZmluaXR5O1xuICAgIGlmIChvcHRpb25zLm1heEhpc3RvcnlTaXplIDwgMSkgb3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA9IEluZmluaXR5O1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBHdWlsZFF1ZXVlIGluaXRpYWxpemVkIGZvciBndWlsZCAke3RoaXMub3B0aW9ucy5ndWlsZC5uYW1lfSAoSUQ6ICR7dGhpcy5vcHRpb25zLmd1aWxkLmlkfSlgXG4gICAgKTtcbiAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlF1ZXVlQ3JlYXRlLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgcXVldWUgY2FuIGludGVyY2VwdCBzdHJlYW1zXG4gICAqL1xuICBwdWJsaWMgY2FuSW50ZXJjZXB0KCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZW5hYmxlU3RyZWFtSW50ZXJjZXB0b3I7XG4gIH1cblxuICAvKipcbiAgICogRXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoaXMgcXVldWUgaW4gbXNcbiAgICovXG4gIHB1YmxpYyBnZXQgZXN0aW1hdGVkRHVyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnN0b3JlLnJlZHVjZSgoYSwgYykgPT4gYSArIGMuZHVyYXRpb25NUywgMCk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0dGVkIGR1cmF0aW9uIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgZHVyYXRpb25Gb3JtYXR0ZWQoKSB7XG4gICAgcmV0dXJuIFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVModGhpcy5lc3RpbWF0ZWREdXJhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzeW5jIGx5cmljcyBwcm92aWRlciBmb3IgdGhpcyBxdWV1ZS5cbiAgICogQGV4YW1wbGUgY29uc3QgbHlyaWNzID0gYXdhaXQgcGxheWVyLmx5cmljcy5zZWFyY2goeyBxOiAnQWxhbiBXYWxrZXIgRmFkZWQnIH0pO1xuICAgKiBjb25zdCBzeW5jZWRMeXJpY3MgPSBxdWV1ZS5zeW5jZWRMeXJpY3MobHlyaWNzWzBdKTtcbiAgICogY29uc29sZS5sb2coc3luY2VkTHlyaWNzLmF0KDEwXzAwMCkpO1xuICAgKiAvLyBzdWJzY3JpYmUgdG8gbHlyaWNzIGNoYW5nZVxuICAgKiBjb25zdCB1bnN1YnNjcmliZSA9IHN5bmNlZEx5cmljcy5vbkNoYW5nZSgobHlyaWNzLCB0aW1lc3RhbXApID0+IHtcbiAgICogICAgY29uc29sZS5sb2cobHlyaWNzLCB0aW1lc3RhbXApO1xuICAgKiB9KTtcbiAgICogLy8gdW5zdWJzY3JpYmUgZnJvbSBseXJpY3MgY2hhbmdlXG4gICAqIHVuc3Vic2NyaWJlKCk7IC8vIG9yXG4gICAqIHN5bmNlZEx5cmljcy51bnN1YnNjcmliZSgpO1xuICAgKi9cbiAgcHVibGljIHN5bmNlZEx5cmljcyhseXJpY3M6IExyY0dldFJlc3VsdCB8IExyY1NlYXJjaFJlc3VsdCkge1xuICAgIHRoaXMuc3luY2VkTHlyaWNzUHJvdmlkZXIubG9hZChseXJpY3M/LnN5bmNlZEx5cmljcyA/PyAnJyk7XG4gICAgcmV0dXJuIHRoaXMuc3luY2VkTHlyaWNzUHJvdmlkZXI7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgYSBkZWJ1ZyBtZXNzYWdlIHRvIHRoaXMgcXVldWVcbiAgICogQHBhcmFtIG0gVGhlIG1lc3NhZ2UgdG8gd3JpdGVcbiAgICovXG4gIHB1YmxpYyBkZWJ1ZyhtOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkRlYnVnLCB0aGlzLCBtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbWV0YWRhdGEgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBtZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1ldGFkYXRhITtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbWV0YWRhdGEobTogTWV0YSkge1xuICAgIHRoaXMub3B0aW9ucy5tZXRhZGF0YSA9IG07XG4gIH1cblxuICAvKipcbiAgICogU2V0IG1ldGFkYXRhIGZvciB0aGlzIHF1ZXVlXG4gICAqIEBwYXJhbSBtIE1ldGFkYXRhIHRvIHNldFxuICAgKi9cbiAgcHVibGljIHNldE1ldGFkYXRhKG06IE1ldGEpIHtcbiAgICB0aGlzLm9wdGlvbnMubWV0YWRhdGEgPSBtO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBjdXJyZW50IHRyYWNrIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudFRyYWNrKCkge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoZXI/LmF1ZGlvUmVzb3VyY2U/Lm1ldGFkYXRhIHx8IHRoaXMuX19jdXJyZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGlzIHF1ZXVlIHdhcyBkZWxldGVkIHByZXZpb3VzbHlcbiAgICovXG4gIHB1YmxpYyBnZXQgZGVsZXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jZGVsZXRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgY2hhbm5lbCBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNoYW5uZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hlcj8uY2hhbm5lbCB8fCBudWxsO1xuICB9XG5cbiAgcHVibGljIHNldCBjaGFubmVsKGM6IFZvaWNlQmFzZWRDaGFubmVsIHwgbnVsbCkge1xuICAgIGlmICh0aGlzLmRpc3BhdGNoZXIpIHtcbiAgICAgIGlmIChjKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5jaGFubmVsID0gYztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGVsZXRlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2b2ljZSBjb25uZWN0aW9uIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgY29ubmVjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaGVyPy52b2ljZUNvbm5lY3Rpb24gfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZ3VpbGQgdGhpcyBxdWV1ZSBiZWxvbmdzIHRvXG4gICAqL1xuICBwdWJsaWMgZ2V0IGd1aWxkKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZ3VpbGQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGlkIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3VpbGQuaWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRyYW5zaXRpb24gbW9kZSBmb3IgdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlIHRvIHNldFxuICAgKi9cbiAgcHVibGljIHNldFRyYW5zaXRpb25pbmcoc3RhdGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLiN0cmFuc2l0aW9uaW5nID0gc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogaWYgdGhpcyBxdWV1ZSBpcyBjdXJyZW50bHkgdW5kZXIgdHJhbnNpdGlvbiBtb2RlXG4gICAqL1xuICBwdWJsaWMgaXNUcmFuc2l0aW9uaW5nKCkge1xuICAgIHJldHVybiB0aGlzLiN0cmFuc2l0aW9uaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCByZXBlYXQgbW9kZSBmb3IgdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gbW9kZSBUaGUgcmVwZWF0IG1vZGUgdG8gYXBwbHlcbiAgICovXG4gIHB1YmxpYyBzZXRSZXBlYXRNb2RlKG1vZGU6IFF1ZXVlUmVwZWF0TW9kZSkge1xuICAgIHRoaXMucmVwZWF0TW9kZSA9IG1vZGU7XG4gIH1cblxuICAvKipcbiAgICogTWF4IHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBtYXhTaXplKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMubWF4U2l6ZSA/PyBJbmZpbml0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXggc2l6ZSBvZiB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0TWF4U2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5tYXhTaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpemUgb2YgdGhlIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldFNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXggaGlzdG9yeSBzaXplIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4SGlzdG9yeVNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5tYXhIaXN0b3J5U2l6ZSA/PyBJbmZpbml0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXggaGlzdG9yeSBzaXplIG9mIHRoaXMgcXVldWVcbiAgICovXG4gIHB1YmxpYyBnZXRNYXhIaXN0b3J5U2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5tYXhIaXN0b3J5U2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWF4IGhpc3Rvcnkgc2l6ZSBmb3IgdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gc2l6ZSBUaGUgc2l6ZSB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRNYXhIaXN0b3J5U2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICBpZiAoIVR5cGVVdGlsLmlzTnVtYmVyKHNpemUpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcignc2l6ZScsICdudW1iZXInLCB0eXBlb2Ygc2l6ZSk7XG4gICAgfVxuXG4gICAgaWYgKHNpemUgPCAxKSBzaXplID0gSW5maW5pdHk7XG5cbiAgICB0aGlzLm9wdGlvbnMubWF4SGlzdG9yeVNpemUgPSBzaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBtYXggc2l6ZSBmb3IgdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gc2l6ZSBUaGUgc2l6ZSB0byBzZXRcbiAgICovXG4gIHB1YmxpYyBzZXRNYXhTaXplKHNpemU6IG51bWJlcikge1xuICAgIGlmICghVHlwZVV0aWwuaXNOdW1iZXIoc2l6ZSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKCdzaXplJywgJ251bWJlcicsIHR5cGVvZiBzaXplKTtcbiAgICB9XG5cbiAgICBpZiAoc2l6ZSA8IDEpIHNpemUgPSBJbmZpbml0eTtcblxuICAgIHRoaXMub3B0aW9ucy5tYXhTaXplID0gc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy50cmFja3MuY2xlYXIoKTtcbiAgICB0aGlzLmhpc3RvcnkuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIHF1ZXVlIGhhcyBubyB0cmFja3MgbGVmdCBpbiBpdFxuICAgKi9cbiAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemUgPCAxO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoaXMgcXVldWUgaXMgZnVsbFxuICAgKi9cbiAgcHVibGljIGlzRnVsbCgpIHtcbiAgICByZXR1cm4gdGhpcy50cmFja3Muc2l6ZSA+PSB0aGlzLm1heFNpemU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHF1ZXVlIGNhcGFjaXR5XG4gICAqL1xuICBwdWJsaWMgZ2V0Q2FwYWNpdHkoKSB7XG4gICAgaWYgKHRoaXMuaXNGdWxsKCkpIHJldHVybiAwO1xuICAgIGNvbnN0IGNhcCA9IHRoaXMubWF4U2l6ZSAtIHRoaXMuc2l6ZTtcbiAgICByZXR1cm4gY2FwO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoaXMgcXVldWUgY3VycmVudGx5IGhvbGRzIGFjdGl2ZSBhdWRpbyByZXNvdXJjZVxuICAgKi9cbiAgcHVibGljIGlzUGxheWluZygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlICE9IG51bGwgJiZcbiAgICAgICF0aGlzLmRpc3BhdGNoZXIuYXVkaW9SZXNvdXJjZS5lbmRlZCk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdHJhY2sgdG8gdGhlIHF1ZXVlLiBUaGlzIHdpbGwgZW1pdCBgYXVkaW9UcmFja3NBZGRgIHdoZW4gbXVsdGlwbGUgdHJhY2tzIGFyZSBhZGRlZCwgb3RoZXJ3aXNlIGBhdWRpb1RyYWNrQWRkYC5cbiAgICogQHBhcmFtIHRyYWNrIFRyYWNrIG9yIHBsYXlsaXN0IG9yIGFycmF5IG9mIHRyYWNrcyB0byBhZGRcbiAgICovXG4gIHB1YmxpYyBhZGRUcmFjayh0cmFjazogVHJhY2sgfCBUcmFja1tdIHwgUGxheWxpc3QpIHtcbiAgICBjb25zdCB0b0FkZCA9IHRyYWNrIGluc3RhbmNlb2YgUGxheWxpc3QgPyB0cmFjay50cmFja3MgOiB0cmFjaztcbiAgICBjb25zdCBpc011bHRpID0gQXJyYXkuaXNBcnJheSh0b0FkZCk7XG5cbiAgICBWQUxJREFURV9RVUVVRV9DQVAodGhpcywgdG9BZGQpO1xuXG4gICAgdGhpcy50cmFja3MuYWRkKHRvQWRkKTtcblxuICAgIGlmIChpc011bHRpKSB7XG4gICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkF1ZGlvVHJhY2tzQWRkLCB0aGlzLCB0b0FkZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja0FkZCwgdGhpcywgdG9BZGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSB0cmFjayBmcm9tIHF1ZXVlXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gcmVtb3ZlXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlVHJhY2sodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSkge1xuICAgIHJldHVybiB0aGlzLm5vZGUucmVtb3ZlKHRyYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwZW5kcyBhIHRyYWNrIG9yIHRyYWNrIHJlc29sdmFibGUgdG8gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgcmVzb2x2YWJsZSB0byBpbnNlcnRcbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB0byBpbnNlcnQgdGhlIHRyYWNrIGF0IChkZWZhdWx0cyB0byAwKS4gSWYgPiAwLCB0aGUgaW5zZXJ0ZWQgdHJhY2sgd2lsbCBiZSBwbGFjZWQgYmVmb3JlIHRoZSB0cmFjayBhdCB0aGUgZ2l2ZW4gaW5kZXguXG4gICAqL1xuICBwdWJsaWMgcHJlcGVuZCh0cmFjazogVHJhY2sgfCBRdWV1ZTxUcmFjaz4gfCBBcnJheTxUcmFjaz4sIGluZGV4ID0gMCk6IHZvaWQge1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiB0aGlzLnRyYWNrcy5zaXplKSB7XG4gICAgICB0aHJvdyBuZXcgT3V0T2ZSYW5nZUVycm9yKFxuICAgICAgICAnaW5kZXgnLFxuICAgICAgICBgJHtpbmRleH1gLFxuICAgICAgICAnMCcsXG4gICAgICAgIGAke3RoaXMudHJhY2tzLnNpemV9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb3VudCA9IEFycmF5LmlzQXJyYXkodHJhY2spID9cbiAgICB0cmFjay5sZW5ndGggOlxuICAgIHRyYWNrIGluc3RhbmNlb2YgUXVldWUgP1xuICAgIHRyYWNrLnNpemUgOlxuICAgIDE7XG5cbiAgICBWQUxJREFURV9RVUVVRV9DQVAodGhpcywgY291bnQpO1xuXG4gICAgY29uc3QgaW5zZXJ0aW9uSW5kZXggPSBpbmRleCA9PT0gMCA/IDAgOiBpbmRleCAtIDE7XG5cbiAgICBpZiAodHJhY2sgaW5zdGFuY2VvZiBUcmFjaykge1xuICAgICAgdGhpcy5ub2RlLmluc2VydCh0cmFjaywgaW5zZXJ0aW9uSW5kZXgpO1xuICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrQWRkLCB0aGlzLCB0cmFjayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2tzID0gdHJhY2sgaW5zdGFuY2VvZiBRdWV1ZSA/IHRyYWNrLnN0b3JlIDogdHJhY2s7XG5cbiAgICB0aGlzLnRyYWNrcy5zdG9yZS5zcGxpY2UoaW5zZXJ0aW9uSW5kZXgsIDAsIC4uLnRyYWNrcyk7XG5cbiAgICBpZiAoIXRoaXMub3B0aW9ucy5ub0VtaXRJbnNlcnQpIHtcbiAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja3NBZGQsIHRoaXMsIHRyYWNrcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSB0cmFjayBvciB0cmFjayByZXNvbHZhYmxlIHRvIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHJlc29sdmFibGUgdG8gaW5zZXJ0XG4gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggdG8gaW5zZXJ0IHRoZSB0cmFjayBhdCAoZGVmYXVsdHMgdG8gMCkuIElmID4gMCwgdGhlIGluc2VydGVkIHRyYWNrIHdpbGwgYmUgcGxhY2VkIGFmdGVyIHRoZSB0cmFjayBhdCB0aGUgZ2l2ZW4gaW5kZXguXG4gICAqL1xuICBwdWJsaWMgYXBwZW5kKHRyYWNrOiBUcmFjayB8IFF1ZXVlPFRyYWNrPiB8IEFycmF5PFRyYWNrPiwgaW5kZXggPSAwKTogdm9pZCB7XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IHRoaXMudHJhY2tzLnNpemUpIHtcbiAgICAgIHRocm93IG5ldyBPdXRPZlJhbmdlRXJyb3IoXG4gICAgICAgICdpbmRleCcsXG4gICAgICAgIGAke2luZGV4fWAsXG4gICAgICAgICcwJyxcbiAgICAgICAgYCR7dGhpcy50cmFja3Muc2l6ZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvdW50ID0gQXJyYXkuaXNBcnJheSh0cmFjaykgP1xuICAgIHRyYWNrLmxlbmd0aCA6XG4gICAgdHJhY2sgaW5zdGFuY2VvZiBRdWV1ZSA/XG4gICAgdHJhY2suc2l6ZSA6XG4gICAgMTtcblxuICAgIFZBTElEQVRFX1FVRVVFX0NBUCh0aGlzLCBjb3VudCk7XG5cbiAgICBpZiAodHJhY2sgaW5zdGFuY2VvZiBUcmFjaykge1xuICAgICAgdGhpcy5ub2RlLmluc2VydCh0cmFjaywgaW5kZXgpO1xuICAgICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrQWRkLCB0aGlzLCB0cmFjayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2tzID0gdHJhY2sgaW5zdGFuY2VvZiBRdWV1ZSA/IHRyYWNrLnN0b3JlIDogdHJhY2s7XG5cbiAgICB0aGlzLnRyYWNrcy5zdG9yZS5zcGxpY2UoaW5kZXgsIDAsIC4uLnRyYWNrcyk7XG5cbiAgICBpZiAoIXRoaXMub3B0aW9ucy5ub0VtaXRJbnNlcnQpIHtcbiAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja3NBZGQsIHRoaXMsIHRyYWNrcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydHMgdGhlIHRyYWNrIHRvIHRoZSBnaXZlbiBpbmRleFxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGluc2VydFxuICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IHRvIGluc2VydCB0aGUgdHJhY2sgYXQgKGRlZmF1bHRzIHRvIDApXG4gICAqL1xuICBwdWJsaWMgaW5zZXJ0VHJhY2sodHJhY2s6IFRyYWNrLCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLmluc2VydCh0cmFjaywgaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBmcm9tIFRoZSB0cmFjayB0byBtb3ZlXG4gICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gbW92ZSB0b1xuICAgKi9cbiAgcHVibGljIG1vdmVUcmFjayh0cmFjazogVHJhY2tSZXNvbHZhYmxlLCBpbmRleCA9IDApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLm1vdmUodHJhY2ssIGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5IGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBmcm9tIFRoZSB0cmFjayB0byBjbG9uZVxuICAgKiBAcGFyYW0gdG8gVGhlIHBvc2l0aW9uIHRvIGNsb25lIGF0XG4gICAqL1xuICBwdWJsaWMgY29weVRyYWNrKHRyYWNrOiBUcmFja1Jlc29sdmFibGUsIGluZGV4ID0gMCk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLm5vZGUuY29weSh0cmFjaywgaW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN3YXAgdHdvIHRyYWNrcyBpbiB0aGUgcXVldWVcbiAgICogQHBhcmFtIHNyYyBUaGUgZmlyc3QgdHJhY2sgdG8gc3dhcFxuICAgKiBAcGFyYW0gZGVzdCBUaGUgc2Vjb25kIHRyYWNrIHRvIHN3YXBcbiAgICovXG4gIHB1YmxpYyBzd2FwVHJhY2tzKHNyYzogVHJhY2tSZXNvbHZhYmxlLCBkZXN0OiBUcmFja1Jlc29sdmFibGUpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlLnN3YXAoc3JjLCBkZXN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgc3RyZWFtIGRpc3BhdGNoZXIgZnJvbSB0aGUgZ2l2ZW4gY29ubmVjdGlvblxuICAgKiBAcGFyYW0gY29ubmVjdGlvbiBUaGUgY29ubmVjdGlvbiB0byB1c2VcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVEaXNwYXRjaGVyKFxuICBjb25uZWN0aW9uOiBWb2ljZUNvbm5lY3Rpb24sXG4gIG9wdGlvbnM6IFBpY2s8Vm9pY2VDb25uZWN0Q29uZmlnLCAnYXVkaW9QbGF5ZXInIHwgJ3RpbWVvdXQnPiA9IHt9KVxuICB7XG4gICAgaWYgKGNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKSB7XG4gICAgICB0aHJvdyBuZXcgVm9pY2VDb25uZWN0aW9uRGVzdHJveWVkRXJyb3IoKTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5wbGF5ZXIuY2xpZW50LmNoYW5uZWxzLmNhY2hlLmdldChcbiAgICAgIGNvbm5lY3Rpb24uam9pbkNvbmZpZy5jaGFubmVsSWQhXG4gICAgKTtcbiAgICBpZiAoIWNoYW5uZWwpIHRocm93IG5ldyBOb1ZvaWNlQ2hhbm5lbEVycm9yKCk7XG4gICAgaWYgKCFjaGFubmVsLmlzVm9pY2VCYXNlZCgpKVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgJ2NoYW5uZWwnLFxuICAgICAgYFZvaWNlQmFzZWRDaGFubmVsICh0eXBlICR7Q2hhbm5lbFR5cGUuR3VpbGRWb2ljZX0vJHtDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2V9KWAsXG4gICAgICBTdHJpbmcoY2hhbm5lbD8udHlwZSlcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuZGlzcGF0Y2hlcikge1xuICAgICAgdGhpcy4jcmVtb3ZlTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3BhdGNoZXIgPSBuZXcgU3RyZWFtRGlzcGF0Y2hlcihcbiAgICAgIGNvbm5lY3Rpb24sXG4gICAgICBjaGFubmVsLFxuICAgICAgdGhpcyxcbiAgICAgIG9wdGlvbnMudGltZW91dCA/PyB0aGlzLm9wdGlvbnMuY29ubmVjdGlvblRpbWVvdXQsXG4gICAgICBvcHRpb25zLmF1ZGlvUGxheWVyXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25uZWN0IHRvIGEgdm9pY2UgY2hhbm5lbFxuICAgKiBAcGFyYW0gY2hhbm5lbFJlc29sdmFibGUgVGhlIHZvaWNlIGNoYW5uZWwgdG8gY29ubmVjdCB0b1xuICAgKiBAcGFyYW0gb3B0aW9ucyBKb2luIGNvbmZpZ1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGNvbm5lY3QoXG4gIGNoYW5uZWxSZXNvbHZhYmxlOiBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gIG9wdGlvbnM6IFZvaWNlQ29ubmVjdENvbmZpZyA9IHt9KVxuICB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMucGxheWVyLmNsaWVudC5jaGFubmVscy5yZXNvbHZlKGNoYW5uZWxSZXNvbHZhYmxlKTtcbiAgICBpZiAoIWNoYW5uZWwgfHwgIWNoYW5uZWwuaXNWb2ljZUJhc2VkKCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgICAnY2hhbm5lbCcsXG4gICAgICAgIGBWb2ljZUJhc2VkQ2hhbm5lbCAodHlwZSAke0NoYW5uZWxUeXBlLkd1aWxkVm9pY2V9LyR7Q2hhbm5lbFR5cGUuR3VpbGRTdGFnZVZvaWNlfSlgLFxuICAgICAgICBTdHJpbmcoY2hhbm5lbD8udHlwZSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBDb25uZWN0aW5nIHRvICR7XG4gICAgICBjaGFubmVsLnR5cGUgPT09IENoYW5uZWxUeXBlLkd1aWxkU3RhZ2VWb2ljZSA/ICdzdGFnZScgOiAndm9pY2UnfSBjaGFubmVsICR7XG4gICAgICBjaGFubmVsLm5hbWV9IChJRDogJHtjaGFubmVsLmlkfSlgXG4gICAgKTtcblxuICAgIGlmICh0aGlzLmRpc3BhdGNoZXIgJiYgY2hhbm5lbC5pZCAhPT0gdGhpcy5kaXNwYXRjaGVyLmNoYW5uZWwuaWQpIHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdEZXN0cm95aW5nIG9sZCBjb25uZWN0aW9uJyk7XG4gICAgICB0aGlzLiNyZW1vdmVMaXN0ZW5lcnModGhpcy5kaXNwYXRjaGVyKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuZGlzcGF0Y2hlciA9IGF3YWl0IHRoaXMucGxheWVyLnZvaWNlVXRpbHMuY29ubmVjdChjaGFubmVsLCB7XG4gICAgICBkZWFmOiBvcHRpb25zLmRlYWYgPz8gdGhpcy5vcHRpb25zLnNlbGZEZWFmID8/IHRydWUsXG4gICAgICBtYXhUaW1lOiBvcHRpb25zPy50aW1lb3V0ID8/IHRoaXMub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCA/PyAxMjBfMDAwLFxuICAgICAgcXVldWU6IHRoaXMsXG4gICAgICBhdWRpb1BsYXllcjogb3B0aW9ucz8uYXVkaW9QbGF5ZXIsXG4gICAgICBncm91cDogb3B0aW9ucy5ncm91cCA/PyB0aGlzLnBsYXllci5jbGllbnQudXNlcj8uaWRcbiAgICB9KTtcblxuICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQ29ubmVjdGlvbiwgdGhpcyk7XG5cbiAgICBpZiAodGhpcy5jaGFubmVsIS50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuY2hhbm5lbCEuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0U3VwcHJlc3NlZChmYWxzZSkuY2F0Y2goXG4gICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jaGFubmVsIS5ndWlsZC5tZW1iZXJzLm1lIS52b2ljZS5zZXRSZXF1ZXN0VG9TcGVhayhcbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgICApLmNhdGNoKFV0aWwubm9vcCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy4jYXR0YWNoTGlzdGVuZXJzKHRoaXMuZGlzcGF0Y2hlcik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgc2h1ZmZsZSBtb2RlIGZvciB0aGlzIHF1ZXVlXG4gICAqIEBwYXJhbSBkeW5hbWljIFdoZXRoZXIgdG8gc2h1ZmZsZSB0aGUgcXVldWUgZHluYW1pY2FsbHkuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICogRHluYW1pYyBzaHVmZmxpbmcgd2lsbCBzaHVmZmxlIHRoZSBxdWV1ZSB3aGVuIHRoZSBjdXJyZW50IHRyYWNrIGVuZHMsIHdpdGhvdXQgbXV0YXRpbmcgdGhlIHF1ZXVlLlxuICAgKiBJZiBzZXQgdG8gYGZhbHNlYCwgdGhlIHF1ZXVlIHdpbGwgYmUgc2h1ZmZsZWQgaW1tZWRpYXRlbHkgaW4tcGxhY2UsIHdoaWNoIGNhbm5vdCBiZSB1bmRvbmUuXG4gICAqL1xuICBwdWJsaWMgZW5hYmxlU2h1ZmZsZShkeW5hbWljID0gdHJ1ZSkge1xuICAgIGlmICghZHluYW1pYykge1xuICAgICAgdGhpcy50cmFja3Muc2h1ZmZsZSgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy4jc2h1ZmZsZSA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZSBzaHVmZmxlIG1vZGUgZm9yIHRoaXMgcXVldWUuXG4gICAqL1xuICBwdWJsaWMgZGlzYWJsZVNodWZmbGUoKSB7XG4gICAgdGhpcy4jc2h1ZmZsZSA9IGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBzaHVmZmxlIG1vZGUgZm9yIHRoaXMgcXVldWUuXG4gICAqIEBwYXJhbSBkeW5hbWljIFdoZXRoZXIgdG8gc2h1ZmZsZSB0aGUgcXVldWUgZHluYW1pY2FsbHkuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICogQHJldHVybnMgV2hldGhlciBzaHVmZmxlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlU2h1ZmZsZShkeW5hbWljID0gdHJ1ZSkge1xuICAgIGlmIChkeW5hbWljKSB7XG4gICAgICB0aGlzLiNzaHVmZmxlID0gIXRoaXMuI3NodWZmbGU7XG4gICAgICByZXR1cm4gdGhpcy4jc2h1ZmZsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmFja3Muc2h1ZmZsZSgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgc2h1ZmZsZSBtb2RlIGlzIGVuYWJsZWQgZm9yIHRoaXMgcXVldWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzU2h1ZmZsaW5nKCkge1xuICAgIHJldHVybiB0aGlzLiNzaHVmZmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2b2ljZSBjb25uZWN0aW9uIGxhdGVuY3kgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBwaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24/LnBpbmcudWRwID8/IC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSB0aGlzIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlKCkge1xuICAgIGlmICh0aGlzLnBsYXllci5ub2Rlcy5kZWxldGUodGhpcy5pZCkpIHtcbiAgICAgIHRoaXMuI2RlbGV0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5wbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlF1ZXVlRGVsZXRlLCB0aGlzKTtcbiAgICAgIHRoaXMubm9kZS50YXNrc1F1ZXVlLmNhbmNlbEFsbCgpO1xuICAgICAgdGhpcy50YXNrc1F1ZXVlLmNhbmNlbEFsbCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZpdmVzIHRoaXMgcXVldWVcbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyByZXZpdmUoKSB7XG4gICAgaWYgKCF0aGlzLmRlbGV0ZWQgfHwgdGhpcy5wbGF5ZXIubm9kZXMuaGFzKHRoaXMuaWQpKSByZXR1cm47XG4gICAgdGhpcy4jZGVsZXRlZCA9IGZhbHNlO1xuICAgIHRoaXMuc2V0VHJhbnNpdGlvbmluZyhmYWxzZSk7XG4gICAgdGhpcy5wbGF5ZXIubm9kZXMuY2FjaGUuc2V0KHRoaXMuaWQsIHRoaXMpO1xuICAgIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KEd1aWxkUXVldWVFdmVudC5RdWV1ZUNyZWF0ZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHNlbGYgZGVhZlxuICAgKiBAcGFyYW0gbW9kZSBPbi9PZmYgc3RhdGVcbiAgICogQHBhcmFtIHJlYXNvbiBSZWFzb25cbiAgICovXG4gIHB1YmxpYyBzZXRTZWxmRGVhZihtb2RlPzogYm9vbGVhbiwgcmVhc29uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3VpbGQubWVtYmVycy5tZSEudm9pY2Uuc2V0RGVhZihtb2RlLCByZWFzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBzZWxmIG11dGVcbiAgICogQHBhcmFtIG1vZGUgT24vT2ZmIHN0YXRlXG4gICAqIEBwYXJhbSByZWFzb24gUmVhc29uXG4gICAqL1xuICBwdWJsaWMgc2V0U2VsZk11dGUobW9kZT86IGJvb2xlYW4sIHJlYXNvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmd1aWxkLm1lbWJlcnMubWUhLnZvaWNlLnNldE11dGUobW9kZSwgcmVhc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IGEgdHJhY2sgaW4gdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGJlIHBsYXllZFxuICAgKiBAcGFyYW0gb3B0aW9ucyBQbGF5ZXIgbm9kZSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcGxheShcbiAgdHJhY2s6IFRyYWNrTGlrZSxcbiAgb3B0aW9ucz86IFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8TWV0YT4pXG4gIHtcbiAgICBpZiAoIXRoaXMuY2hhbm5lbCkgdGhyb3cgbmV3IE5vVm9pY2VDb25uZWN0aW9uRXJyb3IoKTtcblxuICAgIHJldHVybiB0aGlzLnBsYXllci5wbGF5KHRoaXMuY2hhbm5lbCwgdHJhY2ssIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXQgYW4gZXZlbnQgb24gdGhpcyBxdWV1ZVxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIGVtaXRcbiAgICogQHBhcmFtIGFyZ3MgVGhlIGFyZ3MgZm9yIHRoZSBldmVudFxuICAgKi9cbiAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIEd1aWxkUXVldWVFdmVudHM8TWV0YT4+KFxuICBldmVudDogSyxcbiAgLi4uYXJnczogUGFyYW1ldGVyczxHdWlsZFF1ZXVlRXZlbnRzPE1ldGE+W0tdPilcbiAgOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5kZWxldGVkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyLmV2ZW50cy5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgfVxuXG4gICNhdHRhY2hMaXN0ZW5lcnMoZGlzcGF0Y2hlcjogU3RyZWFtRGlzcGF0Y2hlcikge1xuICAgIGRpc3BhdGNoZXIub24oJ2Vycm9yJywgKGUpID0+IHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRXJyb3IsIHRoaXMsIGUpKTtcbiAgICBkaXNwYXRjaGVyLm9uKFxuICAgICAgJ2RlYnVnJyxcbiAgICAgIChtKSA9PiB0aGlzLmhhc0RlYnVnZ2VyICYmIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRGVidWcsIHRoaXMsIG0pXG4gICAgKTtcbiAgICBkaXNwYXRjaGVyLm9uKCdmaW5pc2gnLCAocikgPT4gdGhpcy4jcGVyZm9ybUZpbmlzaChyKSk7XG4gICAgZGlzcGF0Y2hlci5vbignc3RhcnQnLCAocikgPT4gdGhpcy4jcGVyZm9ybVN0YXJ0KHIpKTtcbiAgICBkaXNwYXRjaGVyLm9uKCdkZXN0cm95ZWQnLCAoKSA9PiB7XG4gICAgICB0aGlzLiNyZW1vdmVMaXN0ZW5lcnMoZGlzcGF0Y2hlcik7XG4gICAgICB0aGlzLmRpc3BhdGNoZXIgPSBudWxsO1xuICAgIH0pO1xuICAgIGRpc3BhdGNoZXIub24oJ2RzcCcsIChmKSA9PiB7XG4gICAgICBpZiAoIU9iamVjdC5pcyh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycywgZikpIHtcbiAgICAgICAgdGhpcy5lbWl0KFxuICAgICAgICAgIEd1aWxkUXVldWVFdmVudC5EU1BVcGRhdGUsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyxcbiAgICAgICAgICBmXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZmlsdGVycyA9IGY7XG4gICAgfSk7XG4gICAgZGlzcGF0Y2hlci5vbignYmlxdWFkJywgKGYpID0+IHtcbiAgICAgIGlmICh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuYmlxdWFkICE9PSBmKSB7XG4gICAgICAgIHRoaXMuZW1pdChcbiAgICAgICAgICBHdWlsZFF1ZXVlRXZlbnQuQmlxdWFkRmlsdGVyc1VwZGF0ZSxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5iaXF1YWQsXG4gICAgICAgICAgZlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCA9IGY7XG4gICAgfSk7XG4gICAgZGlzcGF0Y2hlci5vbignZXFCYW5kcycsIChmKSA9PiB7XG4gICAgICBpZiAoIU9iamVjdC5pcyhmLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuZXF1YWxpemVyKSkge1xuICAgICAgICB0aGlzLmVtaXQoXG4gICAgICAgICAgR3VpbGRRdWV1ZUV2ZW50LkVxdWFsaXplclVwZGF0ZSxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIsXG4gICAgICAgICAgZlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmVxdWFsaXplciA9IGY7XG4gICAgfSk7XG4gICAgZGlzcGF0Y2hlci5vbigndm9sdW1lJywgKGYpID0+IHtcbiAgICAgIGlmICh0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lICE9PSBmKVxuICAgICAgdGhpcy5lbWl0KFxuICAgICAgICBHdWlsZFF1ZXVlRXZlbnQuVm9sdW1lQ2hhbmdlLFxuICAgICAgICB0aGlzLFxuICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUudm9sdW1lLFxuICAgICAgICBmXG4gICAgICApO1xuICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IGY7XG4gICAgfSk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IGFyZU9iamVjdHNEaWZmZXJlbnQgPSAoYTogYW55LCBiOiBhbnkpID0+IHtcbiAgICAgIGlmICghYSAmJiAhYikgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKCFhIHx8ICFiKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhhKS5sZW5ndGggIT09IE9iamVjdC5rZXlzKGIpLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXMoYSkuc29tZSgoaykgPT4gYVtrXSAhPT0gYltrXSk7XG4gICAgfTtcblxuICAgIGRpc3BhdGNoZXIub24oJ3NhbXBsZVJhdGUnLCAoZikgPT4ge1xuICAgICAgaWYgKHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5zYW1wbGVSYXRlICE9PSBmLnNhbXBsZVJhdGUpIHtcbiAgICAgICAgdGhpcy5lbWl0KFxuICAgICAgICAgIEd1aWxkUXVldWVFdmVudC5TYW1wbGVSYXRlVXBkYXRlLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnNhbXBsZVJhdGUsXG4gICAgICAgICAgZi5zYW1wbGVSYXRlXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnNhbXBsZVJhdGUgPSBmLnNhbXBsZVJhdGU7XG5cbiAgICAgICAgdGhpcy5maWx0ZXJzLnNlZWtlcj8uc2V0U2FtcGxlUmF0ZShmLnNhbXBsZVJhdGUpO1xuICAgICAgICB0aGlzLmZpbHRlcnMuc2Vla2VyPy5zZXRUb3RhbER1cmF0aW9uKHRoaXMubm9kZS5lc3RpbWF0ZWREdXJhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGlmIChmLmN1cnJlbnRGaWx0ZXIgIT09IHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5zYW1wbGVSYXRlRmlsdGVyKSB7XG4gICAgICAgIHRoaXMuZW1pdChcbiAgICAgICAgICBHdWlsZFF1ZXVlRXZlbnQuU2FtcGxlUmF0ZUZpbHRlclVwZGF0ZSxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5zYW1wbGVSYXRlRmlsdGVyID8/IG51bGwsXG4gICAgICAgICAgZi5jdXJyZW50RmlsdGVyXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5zYW1wbGVSYXRlRmlsdGVyID0gZi5jdXJyZW50RmlsdGVyO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGRpc3BhdGNoZXIub24oJ3JldmVyYicsIChmKSA9PiB7XG4gICAgICBpZiAoYXJlT2JqZWN0c0RpZmZlcmVudChmLCB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUucmV2ZXJiKSkge1xuICAgICAgICB0aGlzLmVtaXQoXG4gICAgICAgICAgR3VpbGRRdWV1ZUV2ZW50LlJldmVyYlVwZGF0ZSxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5yZXZlcmIgPz8gbnVsbCxcbiAgICAgICAgICBmXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5yZXZlcmIgPSBmO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGRpc3BhdGNoZXIub24oJ3NlZWtlcicsIChmKSA9PiB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikge1xuICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgIGBTZWVrZXIgPj4gU2Vla2VkIHRvICR7Zi5zZWVrVGFyZ2V0fW1zIGZvciBUcmFjayAke3RoaXMuY3VycmVudFRyYWNrPy50aXRsZX1gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChmLnNlZWtUYXJnZXQgIT0gbnVsbCkgdGhpcy5ub2RlLnNldFByb2dyZXNzKGYuc2Vla1RhcmdldCk7XG5cbiAgICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUGxheWVyU2VlaywgdGhpcywgZik7XG4gICAgfSk7XG5cbiAgICBkaXNwYXRjaGVyLm9uKCdjb21wcmVzc29yJywgKGYpID0+IHtcbiAgICAgIGlmIChhcmVPYmplY3RzRGlmZmVyZW50KGYsIHRoaXMuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5jb21wcmVzc29yKSkge1xuICAgICAgICB0aGlzLmVtaXQoXG4gICAgICAgICAgR3VpbGRRdWV1ZUV2ZW50LkNvbXByZXNzb3JVcGRhdGUsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICB0aGlzLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuY29tcHJlc3NvciA/PyBudWxsLFxuICAgICAgICAgIGZcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmNvbXByZXNzb3IgPSBmO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNEZWJ1Z2dlcigpIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5ZXIuZXZlbnRzLmhhc0RlYnVnZ2VyO1xuICB9XG5cbiAgI3JlbW92ZUxpc3RlbmVyczxUIGV4dGVuZHMge3JlbW92ZUFsbExpc3RlbmVyczogKCkgPT4gdW5rbm93bjt9Pih0YXJnZXQ6IFQpIHtcbiAgICB0YXJnZXQucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gIH1cblxuICAjcGVyZm9ybVN0YXJ0KHJlc291cmNlPzogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICBjb25zdCB0cmFjayA9IHJlc291cmNlPy5tZXRhZGF0YSB8fCB0aGlzLmN1cnJlbnRUcmFjaztcbiAgICBjb25zdCByZWFzb24gPSB0aGlzLmlzVHJhbnNpdGlvbmluZygpID8gJ2ZpbHRlcnMnIDogJ25vcm1hbCc7XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgYFBsYXllciB0cmlnZ2VyZWQgZm9yIFRyYWNrICR7SlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB0aXRsZTogdHJhY2s/LnRpdGxlLFxuICAgICAgICByZWFzb25cbiAgICAgIH0pfWBcbiAgICApO1xuXG4gICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJUcmlnZ2VyLCB0aGlzLCB0cmFjayEsIHJlYXNvbik7XG4gICAgaWYgKHRyYWNrICYmICF0aGlzLmlzVHJhbnNpdGlvbmluZygpKVxuICAgIHRoaXMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuUGxheWVyU3RhcnQsIHRoaXMsIHRyYWNrKTtcbiAgICB0aGlzLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuICB9XG5cbiAgI2dldE5leHRUcmFjaygpIHtcbiAgICBpZiAoIXRoaXMuaXNTaHVmZmxpbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYWNrcy5kaXNwYXRjaCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0b3JlID0gdGhpcy50cmFja3Muc3RvcmU7XG5cbiAgICBpZiAoIXN0b3JlLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgdHJhY2sgPSBVdGlsLnJhbmRvbUNob2ljZShzdG9yZSk7XG5cbiAgICB0aGlzLnRyYWNrcy5yZW1vdmVPbmUoKHQpID0+IHtcbiAgICAgIHJldHVybiB0LmlkID09PSB0cmFjay5pZDtcbiAgICB9KTtcblxuICAgIHJldHVybiB0cmFjaztcbiAgfVxuXG4gICNwZXJmb3JtRmluaXNoKHJlc291cmNlPzogQXVkaW9SZXNvdXJjZTxUcmFjaz4pIHtcbiAgICBjb25zdCB0cmFjayA9IHJlc291cmNlPy5tZXRhZGF0YSB8fCB0aGlzLmN1cnJlbnRUcmFjaztcblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgVHJhY2sgJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHRpdGxlOiB0cmFjaz8udGl0bGUsXG4gICAgICAgIGlzVHJhbnNpdGlvbk1vZGU6IHRoaXMuaXNUcmFuc2l0aW9uaW5nKClcbiAgICAgIH0pfSB3YXMgbWFya2VkIGFzIGZpbmlzaGVkYFxuICAgICk7XG5cbiAgICBpZiAoIXRoaXMuaXNUcmFuc2l0aW9uaW5nKCkpIHtcbiAgICAgIHRoaXMuc3luY2VkTHlyaWNzUHJvdmlkZXIudW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuc3luY2VkTHlyaWNzUHJvdmlkZXIubHlyaWNzLmNsZWFyKCk7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICdBZGRpbmcgdHJhY2sgdG8gaGlzdG9yeSBhbmQgZW1pdHRpbmcgZmluaXNoIGV2ZW50IHNpbmNlIHRyYW5zaXRpb24gbW9kZSBpcyBkaXNhYmxlZC4uLidcbiAgICAgICk7XG4gICAgICBpZiAodHJhY2spIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2godHJhY2spO1xuICAgICAgICB0aGlzLm5vZGUucmVzZXRQcm9ncmVzcygpO1xuICAgICAgICB0aGlzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllckZpbmlzaCwgdGhpcywgdHJhY2spO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuI2RlbGV0ZWQpIHJldHVybiB0aGlzLiNlbWl0RW5kKCk7XG4gICAgICBpZiAodGhpcy50cmFja3Muc2l6ZSA8IDEgJiYgdGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuT0ZGKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgICdObyBtb3JlIHRyYWNrcyBsZWZ0IGluIHRoZSBxdWV1ZSB0byBwbGF5IGFuZCByZXBlYXQgbW9kZSBpcyBvZmYsIGluaXRpYXRpbmcgI2VtaXRFbmQoKSdcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy4jZW1pdEVuZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMucmVwZWF0TW9kZSA9PT0gUXVldWVSZXBlYXRNb2RlLlRSQUNLKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgICdSZXBlYXQgbW9kZSBpcyBzZXQgdG8gdHJhY2ssIHJlcGVhdGluZyBsYXN0IHRyYWNrIGZyb20gdGhlIGhpc3RvcnkuLi4nXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLl9fY3VycmVudCA9IHRoaXMuaGlzdG9yeS50cmFja3MuZGlzcGF0Y2goKSB8fCB0cmFjaztcbiAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlLnBsYXkodGhpcy5fX2N1cnJlbnQhLCB7IHF1ZXVlOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yZXBlYXRNb2RlID09PSBRdWV1ZVJlcGVhdE1vZGUuUVVFVUUpIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgICAgJ1JlcGVhdCBtb2RlIGlzIHNldCB0byBxdWV1ZSwgbW92aW5nIGxhc3QgdHJhY2sgZnJvbSB0aGUgaGlzdG9yeSB0byBjdXJyZW50IHF1ZXVlLi4uJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMuaGlzdG9yeS50cmFja3MuZGlzcGF0Y2goKSB8fCB0cmFjaztcbiAgICAgICAgICBpZiAobmV4dCkgdGhpcy50cmFja3MuYWRkKG5leHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy50cmFja3Muc2l6ZSAmJiB0cmFjaykge1xuICAgICAgICAgIGlmICh0aGlzLnJlcGVhdE1vZGUgPT09IFF1ZXVlUmVwZWF0TW9kZS5BVVRPUExBWSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgICB0aGlzLmRlYnVnKFxuICAgICAgICAgICAgICAnUmVwZWF0IG1vZGUgaXMgc2V0IHRvIGF1dG9wbGF5LCBpbml0aWF0aW5nIGF1dG9wbGF5IGhhbmRsZXIuLi4nXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy4jaGFuZGxlQXV0b3BsYXkodHJhY2spO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICB0aGlzLmRlYnVnKCdJbml0aWFsaXppbmcgbmV4dCB0cmFjayBvZiB0aGUgcXVldWUuLi4nKTtcbiAgICAgICAgICB0aGlzLl9fY3VycmVudCA9IHRoaXMuI2dldE5leHRUcmFjaygpITtcbiAgICAgICAgICB0aGlzLm5vZGUucGxheSh0aGlzLl9fY3VycmVudCwge1xuICAgICAgICAgICAgcXVldWU6IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAjZW1pdEVuZCgpIHtcbiAgICB0aGlzLl9fY3VycmVudCA9IG51bGw7XG4gICAgdGhpcy5lbWl0KEd1aWxkUXVldWVFdmVudC5FbXB0eVF1ZXVlLCB0aGlzKTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmxlYXZlT25FbmQpIHtcbiAgICAgIGNvbnN0IHRtOiBOb2RlSlMuVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc1BsYXlpbmcoKSkgcmV0dXJuIGNsZWFyVGltZW91dCh0bSk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlcj8uZGlzY29ubmVjdCgpO1xuICAgICAgfSwgdGhpcy5vcHRpb25zLmxlYXZlT25FbmRDb29sZG93bikudW5yZWYoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyAjaGFuZGxlQXV0b3BsYXkodHJhY2s6IFRyYWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgYEF1dG9wbGF5ID4+IEZpbmRpbmcgcmVsYXRlZCB0cmFja3MgZm9yIFRyYWNrICR7dHJhY2sudGl0bGV9ICgke1xuICAgICAgICB0cmFjay51cmx9KSBbZXh0OiR7XG4gICAgICAgIHRyYWNrLmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCAnTi9BJ31dYFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHRyYWNrcyA9XG4gICAgICAoYXdhaXQgdHJhY2suZXh0cmFjdG9yPy5nZXRSZWxhdGVkVHJhY2tzKHRyYWNrLCB0aGlzLmhpc3RvcnkpKT8uXG4gICAgICB0cmFja3MgfHxcbiAgICAgIChcbiAgICAgIGF3YWl0IHRoaXMucGxheWVyLmV4dHJhY3RvcnMucnVuKGFzeW5jIChleHQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMuZGVidWcoYEF1dG9wbGF5ID4+IFF1ZXJ5aW5nIGV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfWApO1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBleHQuZ2V0UmVsYXRlZFRyYWNrcyh0cmFjaywgdGhpcy5oaXN0b3J5KTtcbiAgICAgICAgaWYgKCFyZXMudHJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgICBgQXV0b3BsYXkgPj4gRXh0cmFjdG9yICR7ZXh0LmlkZW50aWZpZXJ9IGZhaWxlZCB0byBwcm92aWRlIHJlc3VsdHMuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgYEF1dG9wbGF5ID4+IEV4dHJhY3RvciAke2V4dC5pZGVudGlmaWVyfSBzdWNjZXNzZnVsbHkgcmV0dXJuZWQgcmVzdWx0cy5gXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHJlcy50cmFja3M7XG4gICAgICB9KSk/LlxuICAgICAgcmVzdWx0IHx8XG4gICAgICBbXTtcblxuICAgICAgbGV0IHJlc29sdmVyOiAodHJhY2s6IFRyYWNrIHwgbnVsbCkgPT4gdm9pZCA9IFV0aWwubm9vcDtcbiAgICAgIGNvbnN0IGRvbmVQcm9taXNlID0gbmV3IFByb21pc2U8VHJhY2sgfCBudWxsPihcbiAgICAgICAgKHJlc29sdmUpID0+IHJlc29sdmVyID0gcmVzb2x2ZVxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc3VjY2VzcyA9IHRoaXMuZW1pdChcbiAgICAgICAgR3VpbGRRdWV1ZUV2ZW50LldpbGxBdXRvUGxheSxcbiAgICAgICAgdGhpcyxcbiAgICAgICAgdHJhY2tzLFxuICAgICAgICByZXNvbHZlciFcbiAgICAgICk7XG5cbiAgICAgIC8vIHByZXZlbnQgZGFuZ2xpbmcgcHJvbWlzZVxuICAgICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgIHJlc29sdmVyKFxuICAgICAgICAgIHRyYWNrcy5sZW5ndGggP1xuICAgICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1bmlxdWUgPSB0cmFja3MuZmlsdGVyKFxuICAgICAgICAgICAgICAodHIpID0+ICF0aGlzLmhpc3RvcnkudHJhY2tzLmZpbmQoKHQpID0+IHQudXJsID09PSB0ci51cmwpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIHVuaXF1ZT8uWzBdID8/IFV0aWwucmFuZG9tQ2hvaWNlKHRyYWNrcy5zbGljZSgwLCA1KSk7XG4gICAgICAgICAgfSkoKSA6XG4gICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXh0VHJhY2sgPSBhd2FpdCBkb25lUHJvbWlzZTtcblxuICAgICAgaWYgKCFuZXh0VHJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMuZGVidWcoJ0F1dG9wbGF5ID4+IE5vIHRyYWNrIHdhcyBmb3VuZCwgaW5pdGlhdGluZyAjZW1pdEVuZCgpJyk7XG4gICAgICAgIHRocm93ICdObyB0cmFjayB3YXMgZm91bmQnO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLm5vZGUucGxheShuZXh0VHJhY2ssIHtcbiAgICAgICAgcXVldWU6IGZhbHNlLFxuICAgICAgICBzZWVrOiAwLFxuICAgICAgICB0cmFuc2l0aW9uTW9kZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHRoaXMuI2VtaXRFbmQoKTtcbiAgICB9XG4gIH1cbn0iLCAiaW1wb3J0IHtcbiAgQXVkaW9QbGF5ZXIsXG4gIEF1ZGlvUGxheWVyRXJyb3IsXG4gIEF1ZGlvUGxheWVyU3RhdHVzLFxuICBBdWRpb1Jlc291cmNlLFxuICBjcmVhdGVBdWRpb1BsYXllcixcbiAgY3JlYXRlQXVkaW9SZXNvdXJjZSxcbiAgZW50ZXJzU3RhdGUsXG4gIFN0cmVhbVR5cGUsXG4gIFZvaWNlQ29ubmVjdGlvbixcbiAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLFxuICBWb2ljZUNvbm5lY3Rpb25EaXNjb25uZWN0UmVhc29uIH0gZnJvbVxuJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBTdGFnZUNoYW5uZWwsIFZvaWNlQ2hhbm5lbCB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvdXRpbHMnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHtcbiAgRXF1YWxpemVyQmFuZCxcbiAgQmlxdWFkRmlsdGVycyxcbiAgUENNRmlsdGVycyxcbiAgRmlsdGVyc0NoYWluLFxuICBDb21wcmVzc29yUGFyYW1ldGVycyxcbiAgUmV2ZXJiUGFyYW1ldGVycyxcbiAgU2Vla2VyUGFyYW1ldGVycyxcbiAgUmVzYW1wbGVQYXJhbWV0ZXJzLFxuICBDb21tb25SZXNhbXBsZXJGaWx0ZXJQcmVzZXQsXG4gIFNlZWtFdmVudCB9IGZyb21cbidAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IEd1aWxkUXVldWUsIEd1aWxkUXVldWVFdmVudCwgUG9zdFByb2Nlc3NlZFJlc3VsdCB9IGZyb20gJy4uL3F1ZXVlJztcbmltcG9ydCB7IE5vQXVkaW9SZXNvdXJjZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IEludGVyY2VwdGVkU3RyZWFtIH0gZnJvbSAnLi9JbnRlcmNlcHRlZFN0cmVhbSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlU3RyZWFtT3BzIHtcbiAgdHlwZT86IFN0cmVhbVR5cGU7XG4gIGRhdGE6IFRyYWNrO1xuICBkaXNhYmxlVm9sdW1lPzogYm9vbGVhbjtcbiAgZGlzYWJsZUVxdWFsaXplcj86IGJvb2xlYW47XG4gIGRpc2FibGVCaXF1YWQ/OiBib29sZWFuO1xuICBkaXNhYmxlQ29tcHJlc3Nvcj86IGJvb2xlYW47XG4gIGRpc2FibGVSZXNhbXBsZXI/OiBib29sZWFuO1xuICBkaXNhYmxlUmV2ZXJiPzogYm9vbGVhbjtcbiAgZGlzYWJsZVNlZWtlcj86IGJvb2xlYW47XG4gIGVxPzogRXF1YWxpemVyQmFuZFtdO1xuICBiaXF1YWRGaWx0ZXI/OiBCaXF1YWRGaWx0ZXJzO1xuICBkaXNhYmxlRmlsdGVycz86IGJvb2xlYW47XG4gIGRlZmF1bHRGaWx0ZXJzPzogUENNRmlsdGVyc1tdO1xuICB2b2x1bWU/OiBudW1iZXI7XG4gIHNhbXBsZVJhdGU/OiBudW1iZXI7XG4gIHNhbXBsZVJhdGVGaWx0ZXJzPzogQ29tbW9uUmVzYW1wbGVyRmlsdGVyUHJlc2V0O1xuICBza2lwRkZtcGVnPzogYm9vbGVhbjtcbiAgY29tcHJlc3Nvcj86IHtcbiAgICB0aHJlc2hvbGQ6IG51bWJlcjtcbiAgICByYXRpbzogbnVtYmVyO1xuICAgIGF0dGFjazogbnVtYmVyO1xuICAgIHJlbGVhc2U6IG51bWJlcjtcbiAgICBtYWtldXBHYWluOiBudW1iZXI7XG4gICAga25lZVdpZHRoOiBudW1iZXI7XG4gIH07XG4gIHJldmVyYj86IHtcbiAgICByb29tU2l6ZTogbnVtYmVyO1xuICAgIGRhbXBpbmc6IG51bWJlcjtcbiAgICB3ZXRMZXZlbDogbnVtYmVyO1xuICAgIGRyeUxldmVsOiBudW1iZXI7XG4gIH07XG4gIHNlZWtlcj86IHtcbiAgICBzZWVrVGFyZ2V0OiBudW1iZXIgfCBudWxsO1xuICAgIHRvdGFsRHVyYXRpb246IG51bWJlcjtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWb2ljZUV2ZW50cyB7XG4gIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbiAgZXJyb3I6IChlcnJvcjogQXVkaW9QbGF5ZXJFcnJvcikgPT4gYW55O1xuICBkZWJ1ZzogKG1lc3NhZ2U6IHN0cmluZykgPT4gYW55O1xuICBzdGFydDogKHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPikgPT4gYW55O1xuICBmaW5pc2g6IChyZXNvdXJjZTogQXVkaW9SZXNvdXJjZTxUcmFjaz4pID0+IGFueTtcbiAgZHNwOiAoZmlsdGVyczogUENNRmlsdGVyc1tdKSA9PiBhbnk7XG4gIGVxQmFuZHM6IChmaWx0ZXJzOiBFcXVhbGl6ZXJCYW5kW10pID0+IGFueTtcbiAgc2FtcGxlUmF0ZTogKGZpbHRlcnM6IFJlc2FtcGxlUGFyYW1ldGVycykgPT4gYW55O1xuICBiaXF1YWQ6IChmaWx0ZXJzOiBCaXF1YWRGaWx0ZXJzKSA9PiBhbnk7XG4gIGNvbXByZXNzb3I6IChmaWx0ZXJzOiBDb21wcmVzc29yUGFyYW1ldGVycykgPT4gYW55O1xuICByZXZlcmI6IChmaWx0ZXJzOiBSZXZlcmJQYXJhbWV0ZXJzKSA9PiBhbnk7XG4gIHNlZWtlcjogKGZpbHRlcnM6IFNlZWtlclBhcmFtZXRlcnMpID0+IGFueTtcbiAgdm9sdW1lOiAodm9sdW1lOiBudW1iZXIpID0+IGFueTtcbiAgZGVzdHJveWVkOiAoKSA9PiBhbnk7XG4gIC8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xufVxuXG5jbGFzcyBTdHJlYW1EaXNwYXRjaGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyPFZvaWNlRXZlbnRzPiB7XG4gIHB1YmxpYyB2b2ljZUNvbm5lY3Rpb246IFZvaWNlQ29ubmVjdGlvbjtcbiAgcHVibGljIGF1ZGlvUGxheWVyOiBBdWRpb1BsYXllcjtcbiAgcHVibGljIGNoYW5uZWw6IFZvaWNlQ2hhbm5lbCB8IFN0YWdlQ2hhbm5lbDtcbiAgcHVibGljIGF1ZGlvUmVzb3VyY2U/OiBBdWRpb1Jlc291cmNlPFRyYWNrPiB8IG51bGw7XG4gIHB1YmxpYyBkc3AgPSBuZXcgRmlsdGVyc0NoYWluKCk7XG5cbiAgI2ludGVyY2VwdG9yOiBJbnRlcmNlcHRlZFN0cmVhbSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIG5ldyBjb25uZWN0aW9uIG9iamVjdFxuICAgKiBAcGFyYW0ge1ZvaWNlQ29ubmVjdGlvbn0gY29ubmVjdGlvbiBUaGUgY29ubmVjdGlvblxuICAgKiBAcGFyYW0ge1ZvaWNlQ2hhbm5lbHxTdGFnZUNoYW5uZWx9IGNoYW5uZWwgVGhlIGNvbm5lY3RlZCBjaGFubmVsXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgY29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uLFxuICBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwsXG4gIHB1YmxpYyBxdWV1ZTogR3VpbGRRdWV1ZSxcbiAgcHVibGljIHJlYWRvbmx5IGNvbm5lY3Rpb25UaW1lb3V0OiBudW1iZXIgPSAyMDAwMCxcbiAgYXVkaW9QbGF5ZXI/OiBBdWRpb1BsYXllcilcbiAge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvblxuICAgICAqIEB0eXBlIHtWb2ljZUNvbm5lY3Rpb259XG4gICAgICovXG4gICAgdGhpcy52b2ljZUNvbm5lY3Rpb24gPSBjb25uZWN0aW9uO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGF1ZGlvIHBsYXllclxuICAgICAqIEB0eXBlIHtBdWRpb1BsYXllcn1cbiAgICAgKi9cbiAgICB0aGlzLmF1ZGlvUGxheWVyID1cbiAgICBhdWRpb1BsYXllciB8fFxuICAgIGNyZWF0ZUF1ZGlvUGxheWVyKHtcbiAgICAgIGRlYnVnOiB0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyXG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdm9pY2UgY2hhbm5lbFxuICAgICAqIEB0eXBlIHtWb2ljZUNoYW5uZWx8U3RhZ2VDaGFubmVsfVxuICAgICAqL1xuICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7XG5cbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5vbignZGVidWcnLCAobSkgPT4gdm9pZCB0aGlzLmVtaXQoJ2RlYnVnJywgbSkpO1xuICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLm9uKFxuICAgICAgJ2Vycm9yJyxcbiAgICAgIChlcnJvcikgPT4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IgYXMgQXVkaW9QbGF5ZXJFcnJvcilcbiAgICApO1xuICAgIHRoaXMuYXVkaW9QbGF5ZXIub24oJ2RlYnVnJywgKG0pID0+IHZvaWQgdGhpcy5lbWl0KCdkZWJ1ZycsIG0pKTtcbiAgICB0aGlzLmF1ZGlvUGxheWVyLm9uKCdlcnJvcicsIChlcnJvcikgPT4gdm9pZCB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpKTtcblxuICAgIHRoaXMuZHNwLm9uVXBkYXRlID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmRzcCkgcmV0dXJuO1xuXG4gICAgICBpZiAodGhpcy5kc3AuZmlsdGVycz8uZmlsdGVycykge1xuICAgICAgICB0aGlzLmVtaXQoJ2RzcCcsIHRoaXMuZHNwLmZpbHRlcnM/LmZpbHRlcnMpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5kc3AuYmlxdWFkPy5maWx0ZXJzKSB7XG4gICAgICAgIHRoaXMuZW1pdCgnYmlxdWFkJywgdGhpcy5kc3AuYmlxdWFkPy5maWx0ZXJzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZHNwLmVxdWFsaXplcikge1xuICAgICAgICB0aGlzLmVtaXQoJ2VxQmFuZHMnLCB0aGlzLmRzcC5lcXVhbGl6ZXIuZ2V0RVEoKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmRzcC52b2x1bWUpIHtcbiAgICAgICAgdGhpcy5lbWl0KCd2b2x1bWUnLCB0aGlzLmRzcC52b2x1bWUudm9sdW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZHNwLnJlc2FtcGxlcikge1xuICAgICAgICB0aGlzLmVtaXQoJ3NhbXBsZVJhdGUnLCB0aGlzLmRzcC5yZXNhbXBsZXIuZ2V0UGFyYW1ldGVycygpKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmRzcC5jb21wcmVzc29yKSB7XG4gICAgICAgIHRoaXMuZW1pdCgnY29tcHJlc3NvcicsIHRoaXMuZHNwLmNvbXByZXNzb3IuZ2V0UGFyYW1ldGVycygpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZHNwLnJldmVyYikge1xuICAgICAgICB0aGlzLmVtaXQoJ3JldmVyYicsIHRoaXMuZHNwLnJldmVyYi5nZXRQYXJhbWV0ZXJzKCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5kc3Auc2Vla2VyKSB7XG4gICAgICAgIHRoaXMuZW1pdCgnc2Vla2VyJywgdGhpcy5kc3Auc2Vla2VyLmdldFBhcmFtZXRlcnMoKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuZHNwLm9uRXJyb3IgPSAoZSkgPT4gdGhpcy5lbWl0KCdlcnJvcicsIGUgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG5cbiAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5cbiAgICBvbihWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGlzY29ubmVjdGVkLCBhc3luYyAob2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAgICBpZiAobmV3U3RhdGUucmVhc29uID09PSBWb2ljZUNvbm5lY3Rpb25EaXNjb25uZWN0UmVhc29uLk1hbnVhbCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICBuZXdTdGF0ZS5yZWFzb24gPT09IFZvaWNlQ29ubmVjdGlvbkRpc2Nvbm5lY3RSZWFzb24uV2ViU29ja2V0Q2xvc2UgJiZcbiAgICAgIG5ld1N0YXRlLmNsb3NlQ29kZSA9PT0gNDAxNClcbiAgICAgIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBlbnRlcnNTdGF0ZShcbiAgICAgICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLFxuICAgICAgICAgICAgVm9pY2VDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcsXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25UaW1lb3V0XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT1cbiAgICAgICAgICAgIFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EZXN0cm95ZWQpXG5cbiAgICAgICAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVyciBhcyBBdWRpb1BsYXllckVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24ucmVqb2luQXR0ZW1wdHMgPCA1KSB7XG4gICAgICAgIGF3YWl0IFV0aWwud2FpdCgodGhpcy52b2ljZUNvbm5lY3Rpb24ucmVqb2luQXR0ZW1wdHMgKyAxKSAqIDUwMDApO1xuICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5yZWpvaW4oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT1cbiAgICAgICAgICBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKVxuXG4gICAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KS5cbiAgICBvbihWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkLCAoKSA9PiB7XG4gICAgICB0aGlzLmVuZCgpO1xuICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5Db25uZWN0aW9uRGVzdHJveWVkLCB0aGlzLnF1ZXVlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuYXVkaW9QbGF5ZXIub24oJ3N0YXRlQ2hhbmdlJywgKG9sZFN0YXRlLCBuZXdTdGF0ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgb2xkU3RhdGUuc3RhdHVzICE9PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQgJiZcbiAgICAgIG5ld1N0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkKVxuICAgICAge1xuICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllclBhdXNlLCB0aGlzLnF1ZXVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgb2xkU3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5QYXVzZWQgJiZcbiAgICAgIG5ld1N0YXRlLnN0YXR1cyAhPT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGF1c2VkKVxuICAgICAge1xuICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllclJlc3VtZSwgdGhpcy5xdWV1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXdTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBsYXlpbmcpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICBvbGRTdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLklkbGUgfHxcbiAgICAgICAgb2xkU3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5CdWZmZXJpbmcpXG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdzdGFydCcsIHRoaXMuYXVkaW9SZXNvdXJjZSEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgbmV3U3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlICYmXG4gICAgICBvbGRTdGF0ZS5zdGF0dXMgIT09IEF1ZGlvUGxheWVyU3RhdHVzLklkbGUpXG4gICAgICB7XG4gICAgICAgIHRoaXMuZW1pdCgnZmluaXNoJywgdGhpcy5hdWRpb1Jlc291cmNlISk7XG4gICAgICAgIHRoaXMuZHNwLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5hdWRpb1Jlc291cmNlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN1YnNjcmliZSh0aGlzLmF1ZGlvUGxheWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgcGxheWVyIGhhcyBiZWVuIHBhdXNlZCBtYW51YWxseVxuICAgKi9cbiAgZ2V0IHBhdXNlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXMgPT09IEF1ZGlvUGxheWVyU3RhdHVzLlBhdXNlZDtcbiAgfVxuXG4gIHNldCBwYXVzZWQodmFsOiBib29sZWFuKSB7XG4gICAgdmFsID8gdGhpcy5wYXVzZSh0cnVlKSA6IHRoaXMucmVzdW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGF1c2VkIGF1dG9tYXRpY2FsbHkgb3IgbWFudWFsbHkuXG4gICAqL1xuICBpc1BhdXNlZCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5wYXVzZWQgfHxcbiAgICAgIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5BdXRvUGF1c2VkKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGJ1ZmZlcmluZ1xuICAgKi9cbiAgaXNCdWZmZXJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5CdWZmZXJpbmc7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGxheWluZ1xuICAgKi9cbiAgaXNQbGF5aW5nKCkge1xuICAgIHJldHVybiB0aGlzLmF1ZGlvUGxheWVyLnN0YXRlLnN0YXR1cyA9PT0gQXVkaW9QbGF5ZXJTdGF0dXMuUGxheWluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGN1cnJlbnRseSBpZGxlXG4gICAqL1xuICBpc0lkbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9QbGF5ZXIuc3RhdGUuc3RhdHVzID09PSBBdWRpb1BsYXllclN0YXR1cy5JZGxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGhhcyBiZWVuIGRlc3Ryb3llZFxuICAgKi9cbiAgaXNEZXN0cm95ZWQoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyA9PT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZCk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdm9pY2UgY29ubmVjdGlvbiBoYXMgYmVlbiBkZXN0cm95ZWRcbiAgICovXG4gIGlzRGlzY29ubmVjdGVkKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5EaXNjb25uZWN0ZWQpO1xuXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaXMgcmVhZHkgdG8gcGxheVxuICAgKi9cbiAgaXNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuUmVhZHk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHZvaWNlIGNvbm5lY3Rpb24gaXMgc2lnbmFsbGluZ1xuICAgKi9cbiAgaXNTaWduYWxsaW5nKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbi5zdGF0ZS5zdGF0dXMgPT09IFZvaWNlQ29ubmVjdGlvblN0YXR1cy5TaWduYWxsaW5nKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSB2b2ljZSBjb25uZWN0aW9uIGlzIGNvbm5lY3RpbmdcbiAgICovXG4gIGlzQ29ubmVjdGluZygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzID09PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZyk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHN0cmVhbVxuICAgKiBAcGFyYW0ge1JlYWRhYmxlfSBzcmMgVGhlIHN0cmVhbSBzb3VyY2VcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHNdIE9wdGlvbnNcbiAgICogQHJldHVybnMge0F1ZGlvUmVzb3VyY2V9XG4gICAqL1xuICBhc3luYyBjcmVhdGVTdHJlYW0oc3JjOiBSZWFkYWJsZSwgb3BzOiBDcmVhdGVTdHJlYW1PcHMpIHtcbiAgICBpZiAoIW9wcz8uZGlzYWJsZUZpbHRlcnMgJiYgdGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLnF1ZXVlLmRlYnVnKCdJbml0aWF0aW5nIERTUCBmaWx0ZXJzIHBpcGVsaW5lLi4uJyk7XG4gICAgY29uc3Qgc3RyZWFtID0gIW9wcz8uZGlzYWJsZUZpbHRlcnMgP1xuICAgIHRoaXMuZHNwLmNyZWF0ZShzcmMsIHtcbiAgICAgIGRzcDoge1xuICAgICAgICBmaWx0ZXJzOiBvcHM/LmRlZmF1bHRGaWx0ZXJzLFxuICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlRmlsdGVyc1xuICAgICAgfSxcbiAgICAgIGJpcXVhZDogb3BzPy5iaXF1YWRGaWx0ZXIgP1xuICAgICAge1xuICAgICAgICBmaWx0ZXI6IG9wcy5iaXF1YWRGaWx0ZXIsXG4gICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVCaXF1YWRcbiAgICAgIH0gOlxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgcmVzYW1wbGVyOiBvcHM/LnNhbXBsZVJhdGUgP1xuICAgICAge1xuICAgICAgICBpbnB1dFNhbXBsZVJhdGU6IDQ4MDAwLFxuICAgICAgICB0YXJnZXRTYW1wbGVSYXRlOiBvcHM/LnNhbXBsZVJhdGUsXG4gICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVSZXNhbXBsZXJcbiAgICAgIH0gOlxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZXF1YWxpemVyOiB7XG4gICAgICAgIGJhbmRNdWx0aXBsaWVyOiBvcHM/LmVxLFxuICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlRXF1YWxpemVyXG4gICAgICB9LFxuICAgICAgdm9sdW1lOiB7XG4gICAgICAgIHZvbHVtZTogb3BzPy52b2x1bWUsXG4gICAgICAgIGRpc2FibGVkOiBvcHM/LmRpc2FibGVWb2x1bWVcbiAgICAgIH0sXG4gICAgICBjb21wcmVzc29yOiBvcHM/LmNvbXByZXNzb3IgP1xuICAgICAge1xuICAgICAgICB0aHJlc2hvbGQ6IG9wcz8uY29tcHJlc3Nvci50aHJlc2hvbGQsXG4gICAgICAgIHJhdGlvOiBvcHM/LmNvbXByZXNzb3IucmF0aW8sXG4gICAgICAgIGF0dGFjazogb3BzPy5jb21wcmVzc29yLmF0dGFjayxcbiAgICAgICAgcmVsZWFzZTogb3BzPy5jb21wcmVzc29yLnJlbGVhc2UsXG4gICAgICAgIG1ha2V1cEdhaW46IG9wcz8uY29tcHJlc3Nvci5tYWtldXBHYWluLFxuICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlQ29tcHJlc3NvcixcbiAgICAgICAga25lZVdpZHRoOiBvcHM/LmNvbXByZXNzb3Iua25lZVdpZHRoXG4gICAgICB9IDpcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHJldmVyYjogb3BzPy5yZXZlcmIgP1xuICAgICAge1xuICAgICAgICByb29tU2l6ZTogb3BzPy5yZXZlcmIucm9vbVNpemUsXG4gICAgICAgIGRhbXBpbmc6IG9wcz8ucmV2ZXJiLmRhbXBpbmcsXG4gICAgICAgIHdldExldmVsOiBvcHM/LnJldmVyYi53ZXRMZXZlbCxcbiAgICAgICAgZHJ5TGV2ZWw6IG9wcz8ucmV2ZXJiLmRyeUxldmVsLFxuICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlUmV2ZXJiXG4gICAgICB9IDpcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHNlZWtlcjogb3BzPy5zZWVrZXIgP1xuICAgICAge1xuICAgICAgICBkaXNhYmxlZDogb3BzPy5kaXNhYmxlU2Vla2VyLFxuICAgICAgICBzZWVrVGFyZ2V0OiBvcHM/LnNlZWtlci5zZWVrVGFyZ2V0LFxuICAgICAgICBzYW1wbGVSYXRlOiA0ODAwMCxcbiAgICAgICAgY2hhbm5lbHM6IDIsXG4gICAgICAgIHRvdGFsRHVyYXRpb246IG9wcz8uc2Vla2VyLnRvdGFsRHVyYXRpb25cbiAgICAgIH0gOlxuICAgICAgdW5kZWZpbmVkXG4gICAgfSkgOlxuICAgIHNyYztcblxuICAgIGlmICh0aGlzLmRzcC5zZWVrZXIpIHtcbiAgICAgIC8vIHVzZWQgdG8gaGFuZGxlIGJhY2t3YXJkIHNlZWtpbmdcbiAgICAgIHRoaXMuZHNwLnNlZWtlci5vbignc2VlaycsIChkYXRhOiBTZWVrRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5xdWV1ZS5ub2RlLnJlcXVlc3RTZWVrKGRhdGEpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB7XG4gICAgICB0aGlzLnF1ZXVlLmRlYnVnKCdFeGVjdXRpbmcgb25BZnRlckNyZWF0ZVN0cmVhbSBob29rLi4uJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9zdFN0cmVhbSA9IGF3YWl0IHRoaXMucXVldWUuXG4gICAgb25BZnRlckNyZWF0ZVN0cmVhbT8uKHN0cmVhbSwgdGhpcy5xdWV1ZSwgb3BzPy5kYXRhKS5cbiAgICBjYXRjaChcbiAgICAgICgpID0+XG4gICAgICAoe1xuICAgICAgICBzdHJlYW06IHN0cmVhbSxcbiAgICAgICAgdHlwZTogb3BzPy50eXBlID8/IFN0cmVhbVR5cGUuQXJiaXRyYXJ5XG4gICAgICB9KSBhcyBQb3N0UHJvY2Vzc2VkUmVzdWx0XG4gICAgKTtcblxuICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB0aGlzLnF1ZXVlLmRlYnVnKCdQcmVwYXJpbmcgQXVkaW9SZXNvdXJjZS4uLicpO1xuXG4gICAgY29uc3QgZm9ybWF0ID0gcG9zdFN0cmVhbT8udHlwZSA/PyBvcHM/LnR5cGUgPz8gU3RyZWFtVHlwZS5BcmJpdHJhcnk7XG5cbiAgICBsZXQgX3N0cmVhbTogUmVhZGFibGU7XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5jYW5JbnRlcmNlcHQoKSkge1xuICAgICAgdGhpcy4jaW50ZXJjZXB0b3IgPSBuZXcgSW50ZXJjZXB0ZWRTdHJlYW0oKTtcblxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgKHBvc3RTdHJlYW0/LnN0cmVhbSA/PyBzdHJlYW0pLnBpcGUodGhpcy4jaW50ZXJjZXB0b3IpO1xuXG4gICAgICBfc3RyZWFtID0gdGhpcy4jaW50ZXJjZXB0b3I7XG5cbiAgICAgIGF3YWl0IHRoaXMucXVldWUucGxheWVyLmhhbmRsZUludGVyY2VwdGluZ1N0cmVhbShcbiAgICAgICAgdGhpcy5xdWV1ZSxcbiAgICAgICAgb3BzPy5kYXRhLFxuICAgICAgICBmb3JtYXQsXG4gICAgICAgIHRoaXMuI2ludGVyY2VwdG9yXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBfc3RyZWFtID0gcG9zdFN0cmVhbT8uc3RyZWFtID8/IHN0cmVhbTtcbiAgICB9XG5cbiAgICB0aGlzLmF1ZGlvUmVzb3VyY2UgPSBjcmVhdGVBdWRpb1Jlc291cmNlKF9zdHJlYW0sIHtcbiAgICAgIGlucHV0VHlwZTogZm9ybWF0LFxuICAgICAgbWV0YWRhdGE6IG9wcz8uZGF0YSBhcyBUcmFjayxcbiAgICAgIC8vIHZvbHVtZSBjb250cm9scyBoYXBwZW4gZnJvbSBBdWRpb0ZpbHRlciBEU1AgdXRpbGl0eVxuICAgICAgaW5saW5lVm9sdW1lOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYXVkaW9SZXNvdXJjZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmVzYW1wbGVyKCkge1xuICAgIHJldHVybiB0aGlzLmRzcD8ucmVzYW1wbGVyO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWx0ZXJzKCkge1xuICAgIHJldHVybiB0aGlzLmRzcD8uZmlsdGVycztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYmlxdWFkKCkge1xuICAgIHJldHVybiB0aGlzLmRzcD8uYmlxdWFkIHx8IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVxdWFsaXplcigpIHtcbiAgICByZXR1cm4gdGhpcy5kc3A/LmVxdWFsaXplciB8fCBudWxsO1xuICB9XG5cbiAgcHVibGljIGdldCBjb21wcmVzc29yKCkge1xuICAgIHJldHVybiB0aGlzLmRzcD8uY29tcHJlc3NvciB8fCBudWxsO1xuICB9XG5cbiAgcHVibGljIGdldCByZXZlcmIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZHNwPy5yZXZlcmIgfHwgbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2Vla2VyKCkge1xuICAgIHJldHVybiB0aGlzLmRzcD8uc2Vla2VyIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBsYXllciBzdGF0dXNcbiAgICogQHR5cGUge0F1ZGlvUGxheWVyU3RhdHVzfVxuICAgKi9cbiAgZ2V0IHN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy5hdWRpb1BsYXllci5zdGF0ZS5zdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogRGlzY29ubmVjdHMgZnJvbSB2b2ljZVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGRpc2Nvbm5lY3QoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmF1ZGlvUGxheWVyKSB0aGlzLmF1ZGlvUGxheWVyLnN0b3AodHJ1ZSk7XG4gICAgICBpZiAodGhpcy52b2ljZUNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKVxuICAgICAgdGhpcy52b2ljZUNvbm5lY3Rpb24uZGVzdHJveSgpO1xuICAgIH0gY2F0Y2gge30gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoaXMgZGlzcGF0Y2hlclxuICAgKi9cbiAgcHVibGljIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMuYXVkaW9QbGF5ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMudm9pY2VDb25uZWN0aW9uLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIHRoaXMuZHNwLmRlc3Ryb3koKTtcbiAgICB0aGlzLmF1ZGlvUmVzb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuZW1pdCgnZGVzdHJveWVkJyk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIHBsYXllclxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGVuZCgpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5hdWRpb1BsYXllci5zdG9wKCk7XG4gICAgICB0aGlzLmRzcC5kZXN0cm95KCk7XG4gICAgfSBjYXRjaCB7XG5cbiAgICAgIC8vXG4gICAgfX1cblxuICAvKipcbiAgICogUGF1c2VzIHRoZSBzdHJlYW0gcGxheWJhY2tcbiAgICogQHBhcmFtIHtib29sZWFufSBbaW50ZXJwb2xhdGVTaWxlbmNlPWZhbHNlXSBJZiB0cnVlLCB0aGUgcGxheWVyIHdpbGwgcGxheSA1IHBhY2tldHMgb2Ygc2lsZW5jZSBhZnRlciBwYXVzaW5nIHRvIHByZXZlbnQgYXVkaW8gZ2xpdGNoZXMuXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgcGF1c2UoaW50ZXJwb2xhdGVTaWxlbmNlPzogYm9vbGVhbikge1xuICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmF1ZGlvUGxheWVyLnBhdXNlKGludGVycG9sYXRlU2lsZW5jZSk7XG4gICAgcmV0dXJuIHN1Y2Nlc3M7XG4gIH1cblxuICAvKipcbiAgICogUmVzdW1lcyB0aGUgc3RyZWFtIHBsYXliYWNrXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgcmVzdW1lKCkge1xuICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLmF1ZGlvUGxheWVyLnVucGF1c2UoKTtcbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHN0cmVhbVxuICAgKiBAcGFyYW0ge0F1ZGlvUmVzb3VyY2U8VHJhY2s+fSBbcmVzb3VyY2U9dGhpcy5hdWRpb1Jlc291cmNlXSBUaGUgYXVkaW8gcmVzb3VyY2UgdG8gcGxheVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHVzPWZhbHNlXSBXaGV0aGVyIG9yIG5vdCB0byB1c2Ugb3B1c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTdHJlYW1EaXNwYXRjaGVyPn1cbiAgICovXG4gIGFzeW5jIHBsYXlTdHJlYW0ocmVzb3VyY2U6IEF1ZGlvUmVzb3VyY2U8VHJhY2s+ID0gdGhpcy5hdWRpb1Jlc291cmNlISkge1xuICAgIGlmICghcmVzb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBOb0F1ZGlvUmVzb3VyY2VFcnJvcigpO1xuICAgIH1cbiAgICBpZiAocmVzb3VyY2UuZW5kZWQpIHtcbiAgICAgIHJldHVybiB2b2lkIHRoaXMuZW1pdCgnZmluaXNoJywgcmVzb3VyY2UpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYXVkaW9SZXNvdXJjZSkgdGhpcy5hdWRpb1Jlc291cmNlID0gcmVzb3VyY2U7XG4gICAgaWYgKHRoaXMudm9pY2VDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLlJlYWR5KSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBlbnRlcnNTdGF0ZShcbiAgICAgICAgICB0aGlzLnZvaWNlQ29ubmVjdGlvbixcbiAgICAgICAgICBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuUmVhZHksXG4gICAgICAgICAgdGhpcy5jb25uZWN0aW9uVGltZW91dFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiB2b2lkIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuYXVkaW9QbGF5ZXIucGxheShyZXNvdXJjZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGUgYXMgQXVkaW9QbGF5ZXJFcnJvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBwbGF5YmFjayB2b2x1bWVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSB2b2x1bWUgYW1vdW50XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc2V0Vm9sdW1lKHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMuZHNwLnZvbHVtZSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmRzcC52b2x1bWUuc2V0Vm9sdW1lKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCB2b2x1bWVcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCB2b2x1bWUoKSB7XG4gICAgaWYgKCF0aGlzLmRzcC52b2x1bWUpIHJldHVybiAxMDA7XG4gICAgcmV0dXJuIHRoaXMuZHNwLnZvbHVtZS52b2x1bWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBsYXliYWNrIHRpbWVcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBzdHJlYW1UaW1lKCkge1xuICAgIGlmICghdGhpcy5hdWRpb1Jlc291cmNlKSByZXR1cm4gMDtcbiAgICByZXR1cm4gdGhpcy5hdWRpb1Jlc291cmNlLnBsYXliYWNrRHVyYXRpb247XG4gIH1cbn1cblxuZXhwb3J0IHsgU3RyZWFtRGlzcGF0Y2hlciB9OyIsICJpbXBvcnQgeyBUcmFuc2Zvcm0sIHR5cGUgVHJhbnNmb3JtQ2FsbGJhY2ssIHR5cGUgV3JpdGFibGUgfSBmcm9tICdub2RlOnN0cmVhbSc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHN0cmVhbSB0aGF0IGNhbiBiZSBpbnRlcmNlcHRlZCBhbmQgY29uc3VtZWQgd2l0aG91dCBhZmZlY3RpbmcgdGhlIG9yaWdpbmFsIGNvbnN1bWVyLlxuICogQGV4YW1wbGUgY29uc3Qgc3RyZWFtID0gbmV3IEludGVyY2VwdGVkU3RyZWFtKCk7XG4gKlxuICogLy8gcmVhbCBjb25zdW1lclxuICogc3RyZWFtLnBpcGUoZnMuY3JlYXRlV3JpdGVTdHJlYW0oJ2ZpbGUudHh0JykpO1xuICpcbiAqIC8vIG1hbiBpbiB0aGUgbWlkZGxlIGNvbnN1bWVyXG4gKiBjb25zdCBtYW5JblRoZU1pZGRsZSA9IG5ldyBXcml0YWJsZSh7XG4gKiAgd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICogICBjb25zb2xlLmxvZyhjaHVuay50b1N0cmluZygpKTtcbiAqICAgY2FsbGJhY2soKTtcbiAqICB9XG4gKiB9KTtcbiAqXG4gKiAvLyBzdHJlYW0uaW50ZXJjZXB0b3JzIGlzIGEgU2V0IG9mIFdyaXRhYmxlIHN0cmVhbXNcbiAqIHN0cmVhbS5pbnRlcmNlcHRvcnMuYWRkKG1hbkluVGhlTWlkZGxlKTtcbiAqL1xuZXhwb3J0IGNsYXNzIEludGVyY2VwdGVkU3RyZWFtIGV4dGVuZHMgVHJhbnNmb3JtIHtcbiAgcHVibGljIHJlYWRvbmx5IGludGVyY2VwdG9ycyA9IG5ldyBTZXQ8V3JpdGFibGU+KCk7XG4gICNpbnRlcmNlcHRpbmcgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBTdGFydCBpbnRlcmNlcHRpbmcgdGhlIHN0cmVhbS4gVGhpcyBpcyB0aGUgZGVmYXVsdCBzdGF0ZSBvZiBJbnRlcmNlcHRlZFN0cmVhbS5cbiAgICovXG4gIHB1YmxpYyBzdGFydEludGVyY2VwdGluZygpOiB2b2lkIHtcbiAgICB0aGlzLiNpbnRlcmNlcHRpbmcgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgaW50ZXJjZXB0aW5nIHRoZSBzdHJlYW0uIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSBzdHJlYW0gZnJvbSBiZWluZyBjb25zdW1lZCBieSB0aGUgaW50ZXJjZXB0b3JzLlxuICAgKiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byB0ZW1wb3JhcmlseSBzdG9wIHRoZSBpbnRlcmNlcHRpb24uIFRoZSBzdG9wcGVkIHN0YXRlIGNhbiBiZSByZXN1bWVkIGJ5IGNhbGxpbmcgc3RhcnRJbnRlcmNlcHRpbmcgYWdhaW4uXG4gICAqL1xuICBwdWJsaWMgc3RvcEludGVyY2VwdGluZygpOiB2b2lkIHtcbiAgICB0aGlzLiNpbnRlcmNlcHRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzdHJlYW0gaXMgYmVpbmcgaW50ZXJjZXB0ZWRcbiAgICovXG4gIHB1YmxpYyBpc0ludGVyY2VwdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jaW50ZXJjZXB0aW5nO1xuICB9XG5cbiAgcHVibGljIF90cmFuc2Zvcm0oXG4gIGNodW5rOiBCdWZmZXIsXG4gIGVuY29kaW5nOiBCdWZmZXJFbmNvZGluZyxcbiAgY2FsbGJhY2s6IFRyYW5zZm9ybUNhbGxiYWNrKVxuICA6IHZvaWQge1xuICAgIHRoaXMucHVzaChjaHVuaywgZW5jb2RpbmcpO1xuXG4gICAgaWYgKHRoaXMuI2ludGVyY2VwdGluZyAmJiB0aGlzLmludGVyY2VwdG9ycy5zaXplID4gMCkge1xuICAgICAgZm9yIChjb25zdCBjb25zdW1lciBvZiB0aGlzLmludGVyY2VwdG9ycykge1xuICAgICAgICBjb25zdW1lci53cml0ZShjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNhbGxiYWNrKCk7XG4gIH1cblxuICBfZmluYWwoY2FsbGJhY2s6IFRyYW5zZm9ybUNhbGxiYWNrKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjb25zdW1lciBvZiB0aGlzLmludGVyY2VwdG9ycykge1xuICAgICAgY29uc3VtZXIuZW5kKCk7XG4gICAgfVxuXG4gICAgY2FsbGJhY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBfZGVzdHJveShlcnJvcjogRXJyb3IsIGNhbGxiYWNrOiBUcmFuc2Zvcm1DYWxsYmFjayk6IHZvaWQge1xuICAgIGNvbnN0IGlnbm9yZUVycm9yID0gU3RyaW5nKGVycm9yKS5pbmNsdWRlcygnRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UnKTtcbiAgICBjb25zdCBlcnIgPSBpZ25vcmVFcnJvciA/IHVuZGVmaW5lZCA6IGVycm9yO1xuXG4gICAgZm9yIChjb25zdCBjb25zdW1lciBvZiB0aGlzLmludGVyY2VwdG9ycykge1xuICAgICAgY29uc3VtZXIuZGVzdHJveShlcnIpO1xuICAgIH1cblxuICAgIHRoaXMuaW50ZXJjZXB0b3JzLmNsZWFyKCk7XG5cbiAgICBjYWxsYmFjayhlcnIpO1xuICB9XG59IiwgImltcG9ydCB7IFF1ZXVlIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL3V0aWxzJztcbmltcG9ydCB7IE5vUmVzdWx0RXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgVHJhY2sgfSBmcm9tICcuLi9mYWJyaWMvVHJhY2snO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgVHJhY2tTa2lwUmVhc29uIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlSGlzdG9yeTxNZXRhID0gYW55PiB7XG4gIHB1YmxpYyB0cmFja3MgPSBuZXcgUXVldWU8VHJhY2s+KCdMSUZPJyk7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4pIHt9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRUcmFjaygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5tZXRhZGF0YSB8fFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICh0aGlzLnF1ZXVlIGFzIGFueSkuX19jdXJyZW50IGFzIFRyYWNrIHwgbnVsbCk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBOZXh0IHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdldCBuZXh0VHJhY2soKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUudHJhY2tzLmF0KDApIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUHJldmlvdXMgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHByZXZpb3VzVHJhY2soKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLmF0KDApIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogSWYgaGlzdG9yeSBpcyBkaXNhYmxlZFxuICAgKi9cbiAgcHVibGljIGdldCBkaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVIaXN0b3J5O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpemUgb2YgdGhlIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tzLnNpemU7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIGhpc3RvcnkgaXMgZW1wdHlcbiAgICovXG4gIHB1YmxpYyBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrcy5zaXplIDwgMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdHJhY2sgdG8gdHJhY2sgaGlzdG9yeVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGFkZFxuICAgKi9cbiAgcHVibGljIHB1c2godHJhY2s6IFRyYWNrIHwgVHJhY2tbXSkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy50cmFja3MuYWRkKHRyYWNrKTtcblxuICAgIHRoaXMucmVzaXplKCk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBoaXN0b3J5XG4gICAqL1xuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy50cmFja3MuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHRoZSBuZXh0IHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIG5leHQoKSB7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLm5leHRUcmFjaztcbiAgICBpZiAoIXRyYWNrKSB7XG4gICAgICB0aHJvdyBuZXcgTm9SZXN1bHRFcnJvcignTm8gbmV4dCB0cmFjayBpbiB0aGUgcXVldWUnKTtcbiAgICB9XG5cbiAgICB0aGlzLnF1ZXVlLm5vZGUuc2tpcCh7XG4gICAgICByZWFzb246IFRyYWNrU2tpcFJlYXNvbi5IaXN0b3J5TmV4dCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2tpcHBlZCBieSBHdWlsZFF1ZXVlSGlzdG9yeS5uZXh0KCknXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGxheSB0aGUgcHJldmlvdXMgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHJldmlvdXMocHJlc2VydmVDdXJyZW50ID0gdHJ1ZSkge1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy50cmFja3MuZGlzcGF0Y2goKTtcbiAgICBpZiAoIXRyYWNrKSB7XG4gICAgICB0aHJvdyBuZXcgTm9SZXN1bHRFcnJvcignTm8gcHJldmlvdXMgdHJhY2sgaW4gdGhlIHF1ZXVlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY3VycmVudFRyYWNrO1xuXG4gICAgYXdhaXQgdGhpcy5xdWV1ZS5ub2RlLnBsYXkodHJhY2ssIHsgcXVldWU6IGZhbHNlIH0pO1xuICAgIGlmIChjdXJyZW50ICYmIHByZXNlcnZlQ3VycmVudCkgdGhpcy5xdWV1ZS5ub2RlLmluc2VydChjdXJyZW50LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGlhcyB0byBbR3VpbGRRdWV1ZUhpc3RvcnldLnByZXZpb3VzKClcbiAgICovXG4gIHB1YmxpYyBiYWNrKHByZXNlcnZlQ3VycmVudCA9IHRydWUpIHtcbiAgICByZXR1cm4gdGhpcy5wcmV2aW91cyhwcmVzZXJ2ZUN1cnJlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2l6ZSBoaXN0b3J5IHN0b3JlXG4gICAqL1xuICBwdWJsaWMgcmVzaXplKCkge1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHRoaXMucXVldWUubWF4SGlzdG9yeVNpemUpKSByZXR1cm47XG4gICAgaWYgKHRoaXMudHJhY2tzLnN0b3JlLmxlbmd0aCA8IHRoaXMucXVldWUubWF4SGlzdG9yeVNpemUpIHJldHVybjtcbiAgICB0aGlzLnRyYWNrcy5zdG9yZS5zcGxpY2UodGhpcy5xdWV1ZS5tYXhIaXN0b3J5U2l6ZSk7XG4gIH1cbn0iLCAiaW1wb3J0IHsgQXVkaW9SZXNvdXJjZSwgU3RyZWFtVHlwZSB9IGZyb20gJ2Rpc2NvcmQtdm9pcCc7XG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBRdWVyeVJlc29sdmVyLCBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuLi91dGlscy9RdWVyeVJlc29sdmVyJztcbmltcG9ydCB7IFV0aWwsIFZBTElEQVRFX1FVRVVFX0NBUCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgVHJhY2ssIFRyYWNrUmVzb2x2YWJsZSB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQsIFRyYWNrU2tpcFJlYXNvbiB9IGZyb20gJy4vR3VpbGRRdWV1ZSc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IGFzIHdhaXRGb3IgfSBmcm9tICd0aW1lcnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgQXN5bmNRdWV1ZSB9IGZyb20gJy4uL3V0aWxzL0FzeW5jUXVldWUnO1xuaW1wb3J0IHtcbiAgSW52YWxpZEFyZ1R5cGVFcnJvcixcbiAgTm9SZXN1bHRFcnJvcixcbiAgTm9Wb2ljZUNvbm5lY3Rpb25FcnJvcixcbiAgT3V0T2ZSYW5nZUVycm9yIH0gZnJvbVxuJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBUeXBlVXRpbCB9IGZyb20gJy4uL3V0aWxzL1R5cGVVdGlsJztcbmltcG9ydCB7IENyZWF0ZVN0cmVhbU9wcyB9IGZyb20gJy4uL3N0cmVhbS9TdHJlYW1EaXNwYXRjaGVyJztcbmltcG9ydCB7IEV4dHJhY3RvclN0cmVhbWFibGUgfSBmcm9tICcuLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuaW1wb3J0IHsgT2dnRGVtdXhlciwgT3B1c0RlY29kZXIsIFdlYm1EZW11eGVyIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL29wdXMnO1xuaW1wb3J0IHsgU2Vla0V2ZW50IH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2VxdWFsaXplcic7XG5cbmV4cG9ydCBjb25zdCBGRk1QRUdfU1JBVEVfUkVHRVggPSAvYXNldHJhdGU9XFxkK1xcKihcXGQoXFwuXFxkKT8pLztcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJQcm9ncmVzc2Jhck9wdGlvbnMge1xuICAvKipcbiAgICogSWYgaXQgc2hvdWxkIHJlbmRlciB0aW1lIGNvZGVzXG4gICAqL1xuICB0aW1lY29kZXM/OiBib29sZWFuO1xuICAvKipcbiAgICogSWYgaXQgc2hvdWxkIGNyZWF0ZSBwcm9ncmVzcyBiYXIgZm9yIHRoZSB3aG9sZSBxdWV1ZVxuICAgKi9cbiAgbGVuZ3RoPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGJhciBsZW5ndGhcbiAgICovXG4gIGxlZnRDaGFyPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGVsYXBzZWQgdGltZSB0cmFja1xuICAgKi9cbiAgcmlnaHRDaGFyPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJlbWFpbmluZyB0aW1lIHRyYWNrXG4gICAqL1xuICBzZXBhcmF0b3I/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgc2VwYXJhdGlvbiBiZXR3ZWVuIHRpbWVzdGFtcCBhbmQgbGluZVxuICAgKi9cbiAgaW5kaWNhdG9yPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGluZGljYXRvclxuICAgKi9cbiAgcXVldWU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlUGxheU9wdGlvbnMge1xuICBxdWV1ZT86IGJvb2xlYW47XG4gIHNlZWs/OiBudW1iZXI7XG4gIHRyYW5zaXRpb25Nb2RlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTa2lwT3B0aW9ucyB7XG4gIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllclRpbWVzdGFtcCB7XG4gIGN1cnJlbnQ6IHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIHZhbHVlOiBudW1iZXI7XG4gIH07XG4gIHRvdGFsOiB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICB2YWx1ZTogbnVtYmVyO1xuICB9O1xuICBwcm9ncmVzczogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVhbUNvbmZpZyB7XG4gIGRpc3BhdGNoZXJDb25maWc6IENyZWF0ZVN0cmVhbU9wcztcbiAgcGxheWVyQ29uZmlnOiBSZXNvdXJjZVBsYXlPcHRpb25zO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIEd1aWxkUXVldWVQbGF5ZXJOb2RlPE1ldGEgPSBhbnk+IHtcbiAgI3Byb2dyZXNzID0gMDtcbiAgI2hhc0ZGbXBlZ09wdGltaXphdGlvbiA9IGZhbHNlO1xuICBwdWJsaWMgdGFza3NRdWV1ZSA9IG5ldyBBc3luY1F1ZXVlKCk7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4pIHtcbiAgICB0aGlzLiNoYXNGRm1wZWdPcHRpbWl6YXRpb24gPSAvbGlib3B1czogKHllc3x0cnVlKS8udGVzdChcbiAgICAgIHRoaXMucXVldWUucGxheWVyLnNjYW5EZXBzKClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGluIGlkbGUgbW9kZVxuICAgKi9cbiAgcHVibGljIGlzSWRsZSgpIHtcbiAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzSWRsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRoZSBwbGF5ZXIgaXMgY3VycmVudGx5IGJ1ZmZlcmluZyB0aGUgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBpc0J1ZmZlcmluZygpIHtcbiAgICByZXR1cm4gISF0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmlzQnVmZmVyaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGxheWluZyBhIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgaXNQbGF5aW5nKCkge1xuICAgIHJldHVybiAhIXRoaXMucXVldWUuZGlzcGF0Y2hlcj8uaXNQbGF5aW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIHBsYXllciBpcyBjdXJyZW50bHkgcGF1c2VkXG4gICAqL1xuICBwdWJsaWMgaXNQYXVzZWQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5pc1BhdXNlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHByb2dyZXNzIGhpc3RvcnlcbiAgICovXG4gIHB1YmxpYyByZXNldFByb2dyZXNzKCkge1xuICAgIHRoaXMuI3Byb2dyZXNzID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcGxheWVyIHByb2dyZXNzXG4gICAqL1xuICBwdWJsaWMgc2V0UHJvZ3Jlc3MocHJvZ3Jlc3M6IG51bWJlcikge1xuICAgIHRoaXMuI3Byb2dyZXNzID0gcHJvZ3Jlc3M7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHN0cmVhbSB0aW1lIGZvciBjdXJyZW50IHNlc3Npb25cbiAgICovXG4gIHB1YmxpYyBnZXQgc3RyZWFtVGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5zdHJlYW1UaW1lID8/IDA7XG4gIH1cblxuICAvKipcbiAgICogQ3VycmVudCBwbGF5YmFjayBkdXJhdGlvbiB3aXRoIGhpc3RvcnkgaW5jbHVkZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgcGxheWJhY2tUaW1lKCkge1xuICAgIGlmICh0aGlzLnF1ZXVlLmZpbHRlcnMuc2Vla2VyKSB7XG4gICAgICBjb25zdCBwb3MgPSB0aGlzLnF1ZXVlLmZpbHRlcnMuc2Vla2VyLmdldFBvc2l0aW9uKCk7XG4gICAgICBpZiAocG9zID4gMCkgcmV0dXJuIHBvcztcbiAgICB9XG5cbiAgICBjb25zdCBkdXIgPSB0aGlzLiNwcm9ncmVzcyArIHRoaXMuc3RyZWFtVGltZTtcblxuICAgIHJldHVybiBkdXI7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGR1cmF0aW9uIG11bHRpcGxpZXJcbiAgICovXG4gIHB1YmxpYyBnZXREdXJhdGlvbk11bHRpcGxpZXIoKSB7XG4gICAgY29uc3Qgc3JhdGVGaWx0ZXJzID0gdGhpcy5xdWV1ZS5maWx0ZXJzLmZmbXBlZy5cbiAgICB0b0FycmF5KCkuXG4gICAgZmlsdGVyKChmZikgPT4gRkZNUEVHX1NSQVRFX1JFR0VYLnRlc3QoZmYpKTtcbiAgICBjb25zdCBtdWx0aXBsaWVycyA9IHNyYXRlRmlsdGVycy5cbiAgICBtYXAoKG0pID0+IHtcbiAgICAgIHJldHVybiBwYXJzZUZsb2F0KEZGTVBFR19TUkFURV9SRUdFWC5leGVjKG0pPy5bMV0gYXMgc3RyaW5nKTtcbiAgICB9KS5cbiAgICBmaWx0ZXIoKGYpID0+ICFpc05hTihmKSk7XG5cbiAgICByZXR1cm4gIW11bHRpcGxpZXJzLmxlbmd0aCA/XG4gICAgMSA6XG4gICAgbXVsdGlwbGllcnMucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4gY3VycmVudCArIGFjY3VtdWxhdG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFc3RpbWF0ZWQgcHJvZ3Jlc3Mgb2YgdGhlIHBsYXllclxuICAgKi9cbiAgcHVibGljIGdldCBlc3RpbWF0ZWRQbGF5YmFja1RpbWUoKSB7XG4gICAgY29uc3QgZHVyID0gdGhpcy5wbGF5YmFja1RpbWU7XG4gICAgY29uc3QgdmFsID0gdGhpcy5nZXREdXJhdGlvbk11bHRpcGxpZXIoKSAqIGR1cjtcblxuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICAvKipcbiAgICogRXN0aW1hdGVkIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBwbGF5ZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgZXN0aW1hdGVkRHVyYXRpb24oKSB7XG4gICAgY29uc3QgZHVyID0gdGhpcy50b3RhbER1cmF0aW9uO1xuXG4gICAgLy8gZHVyYXRpb24gbXVsdGlwbGllciBjaGVja3MgZmZtcGVnIGZpbHRlcnMgdGhhdCBtYXkgYWZmZWN0IHRoZSBkdXJhdGlvblxuICAgIGNvbnN0IHZhbCA9IE1hdGgucm91bmQoZHVyIC8gdGhpcy5nZXREdXJhdGlvbk11bHRpcGxpZXIoKSk7XG5cbiAgICAvLyB3ZSBhbHNvIG5lZWQgdG8gY2hlY2sgaWYgd2UgaGF2ZSBhIG5hdGl2ZSByZXNhbXBsZXIgZmlsdGVyIGFzIGl0IG1heSBhbHNvIGFmZmVjdCB0aGUgZHVyYXRpb25cbiAgICBpZiAodGhpcy5xdWV1ZS5maWx0ZXJzLnJlc2FtcGxlcikge1xuICAgICAgLy8gZ2V0IHRoZSByZXNhbXBsZXIgcmF0aW8gaWYgd2UgaGF2ZSBvbmVcbiAgICAgIGNvbnN0IHJhdGlvID0gdGhpcy5xdWV1ZS5maWx0ZXJzLnJlc2FtcGxlci5nZXRSYXRpbygpO1xuICAgICAgaWYgKHJhdGlvIDw9IDApIHJldHVybiB2YWw7XG5cbiAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbCAvIHJhdGlvKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvdGFsIGR1cmF0aW9uIG9mIHRoZSBjdXJyZW50IGF1ZGlvIHRyYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRvdGFsRHVyYXRpb24oKSB7XG4gICAgY29uc3QgcHJlZmVyc0JyaWRnZWRNZXRhZGF0YSA9IHRoaXMucXVldWUub3B0aW9ucy5wcmVmZXJCcmlkZ2VkTWV0YWRhdGE7XG4gICAgY29uc3QgdHJhY2sgPSB0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaztcblxuICAgIGlmIChwcmVmZXJzQnJpZGdlZE1ldGFkYXRhKSB7XG4gICAgICBjb25zdCB0cmFja0hhc0xlZ2FjeU1ldGFkYXRhID1cbiAgICAgIHRyYWNrPy5tZXRhZGF0YSAhPSBudWxsICYmXG4gICAgICB0eXBlb2YgdHJhY2subWV0YWRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgICAnYnJpZGdlJyBpbiB0cmFjay5tZXRhZGF0YSAmJlxuICAgICAgdHJhY2subWV0YWRhdGEuYnJpZGdlICE9IG51bGw7XG4gICAgICBjb25zdCB0cmFja0hhc01ldGFkYXRhID0gdHJhY2s/LmJyaWRnZWRUcmFjayAhPSBudWxsO1xuXG4gICAgICBpZiAodHJhY2tIYXNMZWdhY3lNZXRhZGF0YSB8fCB0cmFja0hhc01ldGFkYXRhKSB7XG4gICAgICAgIGNvbnN0IGR1cmF0aW9uID1cbiAgICAgICAgdHJhY2suYnJpZGdlZFRyYWNrPy5kdXJhdGlvbk1TID8/XG4gICAgICAgIChcbiAgICAgICAgdHJhY2sgYXMgVHJhY2s8e1xuICAgICAgICAgIGJyaWRnZToge1xuICAgICAgICAgICAgZHVyYXRpb246IG51bWJlcjtcbiAgICAgICAgICB9O1xuICAgICAgICB9PikuXG4gICAgICAgIG1ldGFkYXRhPy5icmlkZ2UuZHVyYXRpb247XG5cbiAgICAgICAgaWYgKFR5cGVVdGlsLmlzTnVtYmVyKGR1cmF0aW9uKSkgcmV0dXJuIGR1cmF0aW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cmFjaz8uZHVyYXRpb25NUyA/PyAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzdHJlYW0gcHJvZ3Jlc3NcbiAgICogQHBhcmFtIGlnbm9yZUZpbHRlcnMgSWdub3JlIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBnZXRUaW1lc3RhbXAoaWdub3JlRmlsdGVycyA9IGZhbHNlKTogUGxheWVyVGltZXN0YW1wIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBjdXJyZW50ID0gaWdub3JlRmlsdGVycyA/XG4gICAgdGhpcy5wbGF5YmFja1RpbWUgOlxuICAgIHRoaXMuZXN0aW1hdGVkUGxheWJhY2tUaW1lO1xuICAgIGNvbnN0IHRvdGFsID0gaWdub3JlRmlsdGVycyA/IHRoaXMudG90YWxEdXJhdGlvbiA6IHRoaXMuZXN0aW1hdGVkRHVyYXRpb247XG5cbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudDoge1xuICAgICAgICBsYWJlbDogVXRpbC5idWlsZFRpbWVDb2RlKFV0aWwucGFyc2VNUyhjdXJyZW50KSksXG4gICAgICAgIHZhbHVlOiBjdXJyZW50XG4gICAgICB9LFxuICAgICAgdG90YWw6IHtcbiAgICAgICAgbGFiZWw6IFV0aWwuYnVpbGRUaW1lQ29kZShVdGlsLnBhcnNlTVModG90YWwpKSxcbiAgICAgICAgdmFsdWU6IHRvdGFsXG4gICAgICB9LFxuICAgICAgcHJvZ3Jlc3M6IE1hdGgucm91bmQoY3VycmVudCAvIHRvdGFsICogMTAwKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHByb2dyZXNzIGJhciBmb3IgY3VycmVudCBwcm9ncmVzc1xuICAgKiBAcGFyYW0gb3B0aW9ucyBQcm9ncmVzcyBiYXIgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGNyZWF0ZVByb2dyZXNzQmFyKG9wdGlvbnM/OiBQbGF5ZXJQcm9ncmVzc2Jhck9wdGlvbnMpIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSB0aGlzLmdldFRpbWVzdGFtcCgpO1xuICAgIGlmICghdGltZXN0YW1wKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB7XG4gICAgICBpbmRpY2F0b3IgPSAnXFx1ezFGNTE4fScsXG4gICAgICBsZWZ0Q2hhciA9ICdcXHUyNUFDJyxcbiAgICAgIHJpZ2h0Q2hhciA9ICdcXHUyNUFDJyxcbiAgICAgIGxlbmd0aCA9IDE1LFxuICAgICAgdGltZWNvZGVzID0gdHJ1ZSxcbiAgICAgIHNlcGFyYXRvciA9ICdcXHUyNTAzJ1xuICAgIH0gPSBvcHRpb25zIHx8IHt9O1xuICAgIGlmIChpc05hTihsZW5ndGgpIHx8IGxlbmd0aCA8IDAgfHwgIU51bWJlci5pc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICB0aHJvdyBuZXcgT3V0T2ZSYW5nZUVycm9yKFxuICAgICAgICAnW1BsYXllclByb2dyZXNzQmFyT3B0aW9ucy5sZW5ndGhdJyxcbiAgICAgICAgU3RyaW5nKGxlbmd0aCksXG4gICAgICAgICcwJyxcbiAgICAgICAgJ0Zpbml0ZSBOdW1iZXInXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IE1hdGgucm91bmQoXG4gICAgICB0aW1lc3RhbXAuY3VycmVudC52YWx1ZSAvIHRpbWVzdGFtcC50b3RhbC52YWx1ZSAqIGxlbmd0aFxuICAgICk7XG4gICAgaWYgKGluZGV4ID49IDEgJiYgaW5kZXggPD0gbGVuZ3RoKSB7XG4gICAgICBjb25zdCBiYXIgPSBsZWZ0Q2hhci5yZXBlYXQoaW5kZXggLSAxKS5zcGxpdCgnJyk7XG4gICAgICBiYXIucHVzaChpbmRpY2F0b3IpO1xuICAgICAgYmFyLnB1c2gocmlnaHRDaGFyLnJlcGVhdChsZW5ndGggLSBpbmRleCkpO1xuICAgICAgaWYgKHRpbWVjb2Rlcykge1xuICAgICAgICByZXR1cm4gYCR7dGltZXN0YW1wLmN1cnJlbnQubGFiZWx9ICR7c2VwYXJhdG9yfSAke2Jhci5qb2luKFxuICAgICAgICAgICcnXG4gICAgICAgICl9ICR7c2VwYXJhdG9yfSAke3RpbWVzdGFtcC50b3RhbC5sYWJlbH1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGAke2Jhci5qb2luKCcnKX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGltZWNvZGVzKSB7XG4gICAgICAgIHJldHVybiBgJHtcbiAgICAgICAgdGltZXN0YW1wLmN1cnJlbnQubGFiZWx9ICR7XG4gICAgICAgIHNlcGFyYXRvcn0gJHtpbmRpY2F0b3J9JHtyaWdodENoYXIucmVwZWF0KFxuICAgICAgICAgIGxlbmd0aCAtIDFcbiAgICAgICAgKX0gJHtzZXBhcmF0b3J9ICR7dGltZXN0YW1wLnRvdGFsLmxhYmVsfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYCR7aW5kaWNhdG9yfSR7cmlnaHRDaGFyLnJlcGVhdChsZW5ndGggLSAxKX1gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWVrIHRoZSBwbGF5ZXJcbiAgICogQHBhcmFtIGR1cmF0aW9uIFRoZSBkdXJhdGlvbiB0byBzZWVrIHRvXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VlayhkdXJhdGlvbjogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmN1cnJlbnRUcmFjaykgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChkdXJhdGlvbiA9PT0gdGhpcy5lc3RpbWF0ZWRQbGF5YmFja1RpbWUpIHJldHVybiB0cnVlO1xuICAgIGlmIChkdXJhdGlvbiA+IHRoaXMudG90YWxEdXJhdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuc2tpcCh7XG4gICAgICAgIHJlYXNvbjogVHJhY2tTa2lwUmVhc29uLlNFRUtfT1ZFUl9USFJFU0hPTEQsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBuZXcgT3V0T2ZSYW5nZUVycm9yKFxuICAgICAgICAgICdbZHVyYXRpb25dJyxcbiAgICAgICAgICBTdHJpbmcoZHVyYXRpb24pLFxuICAgICAgICAgICcwJyxcbiAgICAgICAgICBTdHJpbmcodGhpcy50b3RhbER1cmF0aW9uKVxuICAgICAgICApLm1lc3NhZ2VcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZHVyYXRpb24gPCAwKSBkdXJhdGlvbiA9IDA7XG5cbiAgICBjb25zdCBzZWVrZXIgPSB0aGlzLnF1ZXVlLmZpbHRlcnMuc2Vla2VyO1xuXG4gICAgaWYgKHNlZWtlcikge1xuICAgICAgc2Vla2VyLnNlZWsoZHVyYXRpb24pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucXVldWUuZmlsdGVycy50cmlnZ2VyUmVwbGF5KGR1cmF0aW9uKS50aGVuKCh2KSA9PiB7XG4gICAgICBpZiAodikge1xuICAgICAgICB0aGlzLnF1ZXVlLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LlBsYXllclNlZWssIHRoaXMucXVldWUsIHtcbiAgICAgICAgICBjdXJyZW50UG9zaXRpb246IHRoaXMuZXN0aW1hdGVkUGxheWJhY2tUaW1lLFxuICAgICAgICAgIHNlZWtUYXJnZXQ6IGR1cmF0aW9uLFxuICAgICAgICAgIHRvdGFsRHVyYXRpb246IHRoaXMuZXN0aW1hdGVkRHVyYXRpb25cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgdm9sdW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZvbHVtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy52b2x1bWUgPz8gMTAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB2b2x1bWVcbiAgICogQHBhcmFtIHZvbCBWb2x1bWUgYW1vdW50IHRvIHNldFxuICAgKi9cbiAgcHVibGljIHNldFZvbHVtZSh2b2w6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcmVzID0gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLnNldFZvbHVtZSh2b2wpO1xuICAgIGlmIChyZXMpIHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS52b2x1bWUgPSB2b2w7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYml0IHJhdGVcbiAgICogQHBhcmFtIHJhdGUgVGhlIGJpdCByYXRlIHRvIHNldFxuICAgKi9cbiAgcHVibGljIHNldEJpdHJhdGUocmF0ZTogbnVtYmVyIHwgJ2F1dG8nKSB7XG4gICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5hdWRpb1Jlc291cmNlPy5lbmNvZGVyPy5zZXRCaXRyYXRlKFxuICAgICAgcmF0ZSA9PT0gJ2F1dG8nID8gdGhpcy5xdWV1ZS5jaGFubmVsPy5iaXRyYXRlID8/IDY0MDAwIDogcmF0ZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHBhdXNlZCBzdGF0ZVxuICAgKiBAcGFyYW0gc3RhdGUgVGhlIHN0YXRlXG4gICAqL1xuICBwdWJsaWMgc2V0UGF1c2VkKHN0YXRlOiBib29sZWFuKSB7XG4gICAgaWYgKHN0YXRlKSByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5wYXVzZSh0cnVlKSB8fCBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5yZXN1bWUoKSB8fCBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZSB0aGUgcGxheWJhY2tcbiAgICovXG4gIHB1YmxpYyBwYXVzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRQYXVzZWQodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdW1lIHRoZSBwbGF5YmFja1xuICAgKi9cbiAgcHVibGljIHJlc3VtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRQYXVzZWQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNraXAgY3VycmVudCB0cmFja1xuICAgKi9cbiAgcHVibGljIHNraXAob3B0aW9ucz86IFNraXBPcHRpb25zKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmRpc3BhdGNoZXIpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB0cmFjayA9IHRoaXMucXVldWUuY3VycmVudFRyYWNrO1xuICAgIGlmICghdHJhY2spIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnF1ZXVlLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuICAgIHRoaXMucXVldWUuZGlzcGF0Y2hlci5lbmQoKTtcbiAgICBjb25zdCB7IHJlYXNvbiwgZGVzY3JpcHRpb24gfSA9IG9wdGlvbnMgfHwge1xuICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uTWFudWFsLFxuICAgICAgZGVzY3JpcHRpb246ICdUaGUgdHJhY2sgd2FzIHNraXBwZWQgbWFudWFsbHknXG4gICAgfTtcbiAgICB0aGlzLnF1ZXVlLmVtaXQoXG4gICAgICBHdWlsZFF1ZXVlRXZlbnQuUGxheWVyU2tpcCxcbiAgICAgIHRoaXMucXVldWUsXG4gICAgICB0cmFjayxcbiAgICAgIHJlYXNvbixcbiAgICAgIGRlc2NyaXB0aW9uXG4gICAgKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIGdpdmVuIHRyYWNrIGZyb20gcXVldWVcbiAgICogQHBhcmFtIHRyYWNrIFRoZSB0cmFjayB0byByZW1vdmVcbiAgICogQHBhcmFtIGVtaXRFdmVudCBXaGV0aGVyIG9yIG5vdCB0byBlbWl0IHRoZSBldmVudCBAZGVmYXVsdFZhbHVlIHRydWVcbiAgICovXG4gIHB1YmxpYyByZW1vdmUodHJhY2s6IFRyYWNrUmVzb2x2YWJsZSwgZW1pdEV2ZW50ID0gdHJ1ZSkge1xuICAgIGNvbnN0IGZvdW5kVHJhY2sgPSB0aGlzLnF1ZXVlLnRyYWNrcy5maW5kKCh0LCBpZHgpID0+IHtcbiAgICAgIGlmICh0cmFjayBpbnN0YW5jZW9mIFRyYWNrIHx8IHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnID8gdHJhY2sgOiB0cmFjay5pZCkgPT09IHQuaWQ7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykgcmV0dXJuIHRyYWNrID09PSB0LmlkO1xuICAgICAgcmV0dXJuIGlkeCA9PT0gdHJhY2s7XG4gICAgfSk7XG4gICAgaWYgKCFmb3VuZFRyYWNrKSByZXR1cm4gbnVsbDtcblxuICAgIHRoaXMucXVldWUudHJhY2tzLnJlbW92ZU9uZSgodCkgPT4gdC5pZCA9PT0gZm91bmRUcmFjay5pZCk7XG5cbiAgICBpZiAoZW1pdEV2ZW50KVxuICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuQXVkaW9UcmFja1JlbW92ZSwgdGhpcy5xdWV1ZSwgZm91bmRUcmFjayk7XG5cbiAgICByZXR1cm4gZm91bmRUcmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBKdW1wIHRvIHNwZWNpZmljIHRyYWNrIG9uIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gdHJhY2sgVGhlIHRyYWNrIHRvIGp1bXAgdG8gd2l0aG91dCByZW1vdmluZyBvdGhlciB0cmFja3NcbiAgICovXG4gIHB1YmxpYyBqdW1wKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICBjb25zdCByZW1vdmVkID0gdGhpcy5yZW1vdmUodHJhY2ssIGZhbHNlKTtcbiAgICBpZiAoIXJlbW92ZWQpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnF1ZXVlLnRyYWNrcy5zdG9yZS51bnNoaWZ0KHJlbW92ZWQpO1xuICAgIHJldHVybiB0aGlzLnNraXAoe1xuICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uSnVtcCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHRyYWNrIHdhcyBqdW1wZWQgdG8gbWFudWFsbHknXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRyYWNrIHBvc2l0aW9uXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICovXG4gIHB1YmxpYyBnZXRUcmFja1Bvc2l0aW9uKHRyYWNrOiBUcmFja1Jlc29sdmFibGUpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLnRyYWNrcy50b0FycmF5KCkuZmluZEluZGV4KCh0LCBpZHgpID0+IHtcbiAgICAgIGlmICh0cmFjayBpbnN0YW5jZW9mIFRyYWNrIHx8IHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuICh0eXBlb2YgdHJhY2sgPT09ICdzdHJpbmcnID8gdHJhY2sgOiB0cmFjay5pZCkgPT09IHQuaWQ7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHRyYWNrID09PSAnc3RyaW5nJykgcmV0dXJuIHRyYWNrID09PSB0LmlkO1xuICAgICAgcmV0dXJuIGlkeCA9PT0gdHJhY2s7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2tpcCB0byB0aGUgZ2l2ZW4gdHJhY2ssIHJlbW92aW5nIG90aGVycyBvbiB0aGUgd2F5XG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gc2tpcCB0b1xuICAgKi9cbiAgcHVibGljIHNraXBUbyh0cmFjazogVHJhY2tSZXNvbHZhYmxlKSB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5nZXRUcmFja1Bvc2l0aW9uKHRyYWNrKTtcbiAgICBpZiAoaWR4IDwgMCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnJlbW92ZShpZHgpO1xuICAgIGlmICghcmVtb3ZlZCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHRvUmVtb3ZlID0gdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUuZmlsdGVyKChfLCBpKSA9PiBpIDw9IGlkeCk7XG4gICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmUuc3BsaWNlKDAsIGlkeCwgcmVtb3ZlZCk7XG4gICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrc1JlbW92ZSwgdGhpcy5xdWV1ZSwgdG9SZW1vdmUpO1xuICAgIHJldHVybiB0aGlzLnNraXAoe1xuICAgICAgcmVhc29uOiBUcmFja1NraXBSZWFzb24uU2tpcFRvLFxuICAgICAgZGVzY3JpcHRpb246ICdUaGUgcGxheWVyIHdhcyBza2lwcGVkIHRvIGFub3RoZXIgdHJhY2sgbWFudWFsbHknXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5zZXJ0IGEgdHJhY2sgb24gdGhlIGdpdmVuIHBvc2l0aW9uIGluIHF1ZXVlXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2sgdG8gaW5zZXJ0XG4gICAqIEBwYXJhbSBpbmRleCBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRvLCBkZWZhdWx0cyB0byAwLlxuICAgKi9cbiAgcHVibGljIGluc2VydCh0cmFjazogVHJhY2ssIGluZGV4ID0gMCkge1xuICAgIGlmICghKHRyYWNrIGluc3RhbmNlb2YgVHJhY2spKVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgJ3RyYWNrIHZhbHVlJyxcbiAgICAgICdpbnN0YW5jZSBvZiBUcmFjaycsXG4gICAgICBTdHJpbmcodHJhY2spXG4gICAgKTtcbiAgICBWQUxJREFURV9RVUVVRV9DQVAodGhpcy5xdWV1ZSwgdHJhY2spO1xuICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlLnNwbGljZShpbmRleCwgMCwgdHJhY2spO1xuICAgIGlmICghdGhpcy5xdWV1ZS5vcHRpb25zLm5vRW1pdEluc2VydCkge1xuICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5BdWRpb1RyYWNrQWRkLCB0aGlzLnF1ZXVlLCB0cmFjayk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIGEgdHJhY2sgaW4gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBmcm9tIFRoZSB0cmFjayB0byBtb3ZlXG4gICAqIEBwYXJhbSB0byBUaGUgcG9zaXRpb24gdG8gbW92ZSB0b1xuICAgKi9cbiAgcHVibGljIG1vdmUoZnJvbTogVHJhY2tSZXNvbHZhYmxlLCB0bzogbnVtYmVyKSB7XG4gICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMucmVtb3ZlKGZyb20pO1xuICAgIGlmICghcmVtb3ZlZCkge1xuICAgICAgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoJ2ludmFsaWQgdHJhY2sgdG8gbW92ZScpO1xuICAgIH1cbiAgICB0aGlzLmluc2VydChyZW1vdmVkLCB0byk7XG4gIH1cblxuICAvKipcbiAgICogQ29weSBhIHRyYWNrIGluIHRoZSBxdWV1ZVxuICAgKiBAcGFyYW0gZnJvbSBUaGUgdHJhY2sgdG8gY2xvbmVcbiAgICogQHBhcmFtIHRvIFRoZSBwb3NpdGlvbiB0byBjbG9uZSBhdFxuICAgKi9cbiAgcHVibGljIGNvcHkoZnJvbTogVHJhY2tSZXNvbHZhYmxlLCB0bzogbnVtYmVyKSB7XG4gICAgY29uc3Qgc3JjID0gdGhpcy5xdWV1ZS50cmFja3MuYXQodGhpcy5nZXRUcmFja1Bvc2l0aW9uKGZyb20pKTtcbiAgICBpZiAoIXNyYykge1xuICAgICAgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoJ2ludmFsaWQgdHJhY2sgdG8gY29weScpO1xuICAgIH1cbiAgICB0aGlzLmluc2VydChzcmMsIHRvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2FwIHR3byB0cmFja3MgaW4gdGhlIHF1ZXVlXG4gICAqIEBwYXJhbSBmaXJzdCBUaGUgZmlyc3QgdHJhY2sgdG8gc3dhcFxuICAgKiBAcGFyYW0gc2Vjb25kIFRoZSBzZWNvbmQgdHJhY2sgdG8gc3dhcFxuICAgKi9cbiAgcHVibGljIHN3YXAoZmlyc3Q6IFRyYWNrUmVzb2x2YWJsZSwgc2Vjb25kOiBUcmFja1Jlc29sdmFibGUpIHtcbiAgICBjb25zdCBzcmMgPSB0aGlzLmdldFRyYWNrUG9zaXRpb24oZmlyc3QpO1xuICAgIGlmIChzcmMgPCAwKSB0aHJvdyBuZXcgTm9SZXN1bHRFcnJvcignaW52YWxpZCBzcmMgdHJhY2sgdG8gc3dhcCcpO1xuXG4gICAgY29uc3QgZGVzdCA9IHRoaXMuZ2V0VHJhY2tQb3NpdGlvbihzZWNvbmQpO1xuICAgIGlmIChkZXN0IDwgMCkgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoJ2ludmFsaWQgZGVzdCB0cmFjayB0byBzd2FwJyk7XG5cbiAgICBjb25zdCBzcmNUID0gdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbc3JjXTtcbiAgICBjb25zdCBkZXN0VCA9IHRoaXMucXVldWUudHJhY2tzLnN0b3JlW2Rlc3RdO1xuXG4gICAgdGhpcy5xdWV1ZS50cmFja3Muc3RvcmVbc3JjXSA9IGRlc3RUO1xuICAgIHRoaXMucXVldWUudHJhY2tzLnN0b3JlW2Rlc3RdID0gc3JjVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIHRoZSBwbGF5YmFja1xuICAgKiBAcGFyYW0gZm9yY2UgV2hldGhlciBvciBub3QgdG8gZm9yY2VmdWxseSBzdG9wIHRoZSBwbGF5YmFja1xuICAgKi9cbiAgcHVibGljIHN0b3AoZm9yY2UgPSBmYWxzZSkge1xuICAgIHRoaXMucXVldWUudHJhY2tzLmNsZWFyKCk7XG4gICAgdGhpcy5xdWV1ZS5oaXN0b3J5LmNsZWFyKCk7XG4gICAgaWYgKCF0aGlzLnF1ZXVlLmRpc3BhdGNoZXIpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuZW5kKCk7XG4gICAgaWYgKGZvcmNlKSB7XG4gICAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXIuZGVzdHJveSgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLnF1ZXVlLm9wdGlvbnMubGVhdmVPblN0b3ApIHtcbiAgICAgIGNvbnN0IHRtOiBOb2RlSlMuVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc1BsYXlpbmcoKSB8fCB0aGlzLnF1ZXVlLnRyYWNrcy5zaXplKSByZXR1cm4gY2xlYXJUaW1lb3V0KHRtKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5kZXN0cm95KCk7XG4gICAgICB9LCB0aGlzLnF1ZXVlLm9wdGlvbnMubGVhdmVPblN0b3BDb29sZG93bikudW5yZWYoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCB0aGUgc291cmNlIHRvIHNlZWtcbiAgICogQHBhcmFtIGRhdGEgVGhlIHNlZWsgcGFyYW1ldGVyc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcXVlc3RTZWVrKGRhdGE6IFNlZWtFdmVudCkge1xuICAgIGNvbnN0IHRyYWNrID0gdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2s7XG4gICAgaWYgKCF0cmFjaykgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHRyYWNrLnNlZWthYmxlKSB7XG4gICAgICByZXR1cm4gdHJhY2suc2VlayhkYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5maWx0ZXJzLnRyaWdnZXJSZXBsYXkoZGF0YS5wb3NpdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogUGxheSB0aGUgZ2l2ZW4gdHJhY2tcbiAgICogQHBhcmFtIHJlcyBUaGUgdHJhY2sgdG8gcGxheVxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciBwbGF5aW5nIHRoZSB0cmFja1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHBsYXkocmVzPzogVHJhY2sgfCBudWxsLCBvcHRpb25zPzogUmVzb3VyY2VQbGF5T3B0aW9ucykge1xuICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy52b2ljZUNvbm5lY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBOb1ZvaWNlQ29ubmVjdGlvbkVycm9yKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgIGBSZWNlaXZlZCBwbGF5IHJlcXVlc3QgZnJvbSBndWlsZCAke3RoaXMucXVldWUuZ3VpbGQubmFtZX0gKElEOiAke3RoaXMucXVldWUuZ3VpbGQuaWR9KWBcbiAgICApO1xuXG4gICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgcXVldWU6IHRoaXMucXVldWUuY3VycmVudFRyYWNrICE9IG51bGwsXG4gICAgICAgIHRyYW5zaXRpb25Nb2RlOiBmYWxzZSxcbiAgICAgICAgc2VlazogMFxuICAgICAgfSBhcyBSZXNvdXJjZVBsYXlPcHRpb25zLFxuICAgICAgb3B0aW9uc1xuICAgICkhO1xuXG4gICAgaWYgKHJlcyAmJiBvcHRpb25zLnF1ZXVlKSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICdSZXF1ZXN0ZWQgb3B0aW9uIHJlcXVpcmVzIHRvIHF1ZXVlIHRoZSB0cmFjaywgYWRkaW5nIHRoZSBnaXZlbiB0cmFjayB0byBxdWV1ZSBpbnN0ZWFkLi4uJ1xuICAgICAgKTtcbiAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmFkZFRyYWNrKHJlcyk7XG4gICAgfVxuXG4gICAgY29uc3QgdHJhY2sgPSByZXMgfHwgdGhpcy5xdWV1ZS50cmFja3MuZGlzcGF0Y2goKTtcbiAgICBpZiAoIXRyYWNrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBOb1Jlc3VsdEVycm9yKFxuICAgICAgICAnUGxheSByZXF1ZXN0IHJlY2VpdmVkIGJ1dCB0cmFjayB3YXMgbm90IHByb3ZpZGVkJ1xuICAgICAgKTtcbiAgICAgIHRoaXMucXVldWUuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRXJyb3IsIHRoaXMucXVldWUsIGVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgJ1JlcXVlc3RlZCBvcHRpb24gcmVxdWlyZXMgdG8gcGxheSB0aGUgdHJhY2ssIGluaXRpYWxpemluZy4uLidcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFzc2lnbmVkUmVzb3VyY2UgPSB0cmFjay5yZXNvdXJjZTtcblxuICAgICAgaWYgKGFzc2lnbmVkUmVzb3VyY2UpIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgJ1RyYWNrIGhhcyBhbiBhdWRpbyByZXNvdXJjZSBhc3NpZ25lZCwgcGxheWVyIHdpbGwgbm93IHBsYXkgdGhlIHJlc291cmNlIGRpcmVjdGx5Li4uJ1xuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMucXVldWUuc2V0VHJhbnNpdGlvbmluZyghIW9wdGlvbnMudHJhbnNpdGlvbk1vZGUpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLiNwZXJmb3JtUGxheShhc3NpZ25lZFJlc291cmNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBJbml0aWF0aW5nIHN0cmVhbSBleHRyYWN0aW9uIHByb2Nlc3MuLi5gKTtcbiAgICAgIGNvbnN0IHNyYyA9IHRyYWNrLnJhdz8uc291cmNlIHx8IHRyYWNrLnNvdXJjZTtcbiAgICAgIGNvbnN0IHF0OiBTZWFyY2hRdWVyeVR5cGUgPVxuICAgICAgdHJhY2sucXVlcnlUeXBlIHx8IChcbiAgICAgIHNyYyA9PT0gJ3Nwb3RpZnknID9cbiAgICAgICdzcG90aWZ5U29uZycgOlxuICAgICAgc3JjID09PSAnYXBwbGVfbXVzaWMnID9cbiAgICAgICdhcHBsZU11c2ljU29uZycgOlxuICAgICAgc3JjKTtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgYEV4ZWN1dGluZyBvbkJlZm9yZUNyZWF0ZVN0cmVhbSBob29rIChRdWVyeVR5cGU6ICR7cXR9KS4uLmBcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN0cmVhbVNyYyA9IHtcbiAgICAgICAgZXJyb3I6IG51bGwgYXMgRXJyb3IgfCBudWxsLFxuICAgICAgICBzdHJlYW06IG51bGwgYXMgRXh0cmFjdG9yU3RyZWFtYWJsZSB8IG51bGxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHRoaXMucXVldWUuXG4gICAgICBvbkJlZm9yZUNyZWF0ZVN0cmVhbT8uKHRyYWNrLCBxdCB8fCAnYXJiaXRyYXJ5JywgdGhpcy5xdWV1ZSkuXG4gICAgICB0aGVuKFxuICAgICAgICAocykgPT4ge1xuICAgICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID0gcztcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBFcnJvcikgPT4gc3RyZWFtU3JjLmVycm9yID0gZVxuICAgICAgKTtcblxuICAgICAgLy8gdGhyb3cgaWYgJ29uQmVmb3JlQ3JlYXRlU3RyZWFtJyBwYW5pY3NcbiAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSAmJiBzdHJlYW1TcmMuZXJyb3IpXG4gICAgICByZXR1cm4gdGhpcy4jdGhyb3codHJhY2ssIHN0cmVhbVNyYy5lcnJvcik7XG5cbiAgICAgIC8vIGRlZmF1bHQgYmVoYXZpb3Igd2hlbiAnb25CZWZvcmVDcmVhdGVTdHJlYW0nIGRpZCBub3QgcGFuaWNcbiAgICAgIGlmICghc3RyZWFtU3JjLnN0cmVhbSkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICAnRmFpbGVkIHRvIGdldCBzdHJlYW0gZnJvbSBvbkJlZm9yZUNyZWF0ZVN0cmVhbSwgYXR0ZW1wdGluZyB0byBleHRyYWN0IHN0cmVhbSB1c2luZyBleHRyYWN0b3JzLi4uJ1xuICAgICAgICApO1xuICAgICAgICBhd2FpdCB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLmNvbnRleHQucHJvdmlkZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogY3J5cHRvLnJhbmRvbVVVSUQoKSxcbiAgICAgICAgICAgIGF0dGVtcHRlZEV4dHJhY3RvcnM6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgICAgICAgICAgYnJpZGdlQXR0ZW1wdGVkRXh0cmFjdG9yczogbmV3IFNldDxzdHJpbmc+KClcbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+XG4gICAgICAgICAgdGhpcy4jY3JlYXRlR2VuZXJpY1N0cmVhbSh0cmFjaykuXG4gICAgICAgICAgdGhlbihhc3luYyAocikgPT4ge1xuICAgICAgICAgICAgaWYgKHI/LnJlc3VsdCkge1xuICAgICAgICAgICAgICBzdHJlYW1TcmMuc3RyZWFtID1cbiAgICAgICAgICAgICAgPFJlYWRhYmxlPiAoXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMucXVldWUub25TdHJlYW1FeHRyYWN0ZWQ/LihcbiAgICAgICAgICAgICAgICByLnJlc3VsdCxcbiAgICAgICAgICAgICAgICB0cmFjayxcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlXG4gICAgICAgICAgICAgICkpID8/XG4gICAgICAgICAgICAgIHIucmVzdWx0O1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyPy5lcnJvcikge1xuICAgICAgICAgICAgICBzdHJlYW1TcmMuZXJyb3IgPSByLmVycm9yO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gPSBzdHJlYW1TcmMuZXJyb3IgPSBudWxsO1xuICAgICAgICAgIH0pLlxuICAgICAgICAgIGNhdGNoKChlOiBFcnJvcikgPT4gc3RyZWFtU3JjLmVycm9yID0gZSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzdHJlYW1TcmMuc3RyZWFtKSByZXR1cm4gdGhpcy4jdGhyb3codHJhY2ssIHN0cmVhbVNyYy5lcnJvcik7XG5cbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zZWVrID09PSAnbnVtYmVyJyAmJiBvcHRpb25zLnNlZWsgPj0gMCkge1xuICAgICAgICB0aGlzLiNwcm9ncmVzcyA9IG9wdGlvbnMuc2VlaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuI3Byb2dyZXNzID0gMDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJhY2tTdHJlYW1Db25maWc6IFN0cmVhbUNvbmZpZyA9IHtcbiAgICAgICAgZGlzcGF0Y2hlckNvbmZpZzoge1xuICAgICAgICAgIGRpc2FibGVCaXF1YWQ6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlQmlxdWFkLFxuICAgICAgICAgIGRpc2FibGVFcXVhbGl6ZXI6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlRXF1YWxpemVyLFxuICAgICAgICAgIGRpc2FibGVWb2x1bWU6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlVm9sdW1lLFxuICAgICAgICAgIGRpc2FibGVGaWx0ZXJzOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUZpbHRlcmVyLFxuICAgICAgICAgIGRpc2FibGVSZXNhbXBsZXI6IHRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlUmVzYW1wbGVyLFxuICAgICAgICAgIGRpc2FibGVDb21wcmVzc29yOiB0aGlzLnF1ZXVlLm9wdGlvbnMuZGlzYWJsZUNvbXByZXNzb3IsXG4gICAgICAgICAgZGlzYWJsZVJldmVyYjogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVSZXZlcmIsXG4gICAgICAgICAgZGlzYWJsZVNlZWtlcjogdGhpcy5xdWV1ZS5vcHRpb25zLmRpc2FibGVTZWVrZXIsXG4gICAgICAgICAgY29tcHJlc3NvcjpcbiAgICAgICAgICB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUuY29tcHJlc3NvciA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgcmV2ZXJiOiB0aGlzLnF1ZXVlLmZpbHRlcnMuX2xhc3RGaWx0ZXJzQ2FjaGUucmV2ZXJiID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICBzZWVrZXI6IHtcbiAgICAgICAgICAgIHNlZWtUYXJnZXQ6XG4gICAgICAgICAgICBvcHRpb25zLnRyYW5zaXRpb25Nb2RlICYmIG9wdGlvbnMuc2VlayAhPSBudWxsID9cbiAgICAgICAgICAgIG9wdGlvbnMuc2VlayA6XG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgdG90YWxEdXJhdGlvbjogdHJhY2suZHVyYXRpb25NUyA/PyAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzYW1wbGVSYXRlOlxuICAgICAgICAgIHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5zYW1wbGVSYXRlID8/IChcbiAgICAgICAgICB0eXBlb2YgdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICB0aGlzLnF1ZXVlLm9wdGlvbnMucmVzYW1wbGVyID4gMCA/XG4gICAgICAgICAgdGhpcy5xdWV1ZS5vcHRpb25zLnJlc2FtcGxlciA6XG4gICAgICAgICAgdW5kZWZpbmVkKSxcbiAgICAgICAgICBiaXF1YWRGaWx0ZXI6XG4gICAgICAgICAgdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLmJpcXVhZCB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgZXE6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5lcXVhbGl6ZXIsXG4gICAgICAgICAgZGVmYXVsdEZpbHRlcnM6IHRoaXMucXVldWUuZmlsdGVycy5fbGFzdEZpbHRlcnNDYWNoZS5maWx0ZXJzLFxuICAgICAgICAgIHZvbHVtZTogdGhpcy5xdWV1ZS5maWx0ZXJzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSxcbiAgICAgICAgICBkYXRhOiB0cmFjayxcbiAgICAgICAgICB0eXBlOiBTdHJlYW1UeXBlLlJhdyxcbiAgICAgICAgICBza2lwRkZtcGVnOiB0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLnNraXBGRm1wZWdcbiAgICAgICAgfSxcbiAgICAgICAgcGxheWVyQ29uZmlnOiBvcHRpb25zXG4gICAgICB9O1xuXG4gICAgICBsZXQgcmVzb2x2ZXI6ICgpID0+IHZvaWQgPSBVdGlsLm5vb3A7XG4gICAgICBjb25zdCBkb25lUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiByZXNvbHZlciA9IHJlc29sdmUpO1xuXG4gICAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5xdWV1ZS5lbWl0KFxuICAgICAgICBHdWlsZFF1ZXVlRXZlbnQuV2lsbFBsYXlUcmFjayxcbiAgICAgICAgdGhpcy5xdWV1ZSxcbiAgICAgICAgdHJhY2ssXG4gICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLFxuICAgICAgICByZXNvbHZlciFcbiAgICAgICk7XG5cbiAgICAgIC8vIHByZXZlbnQgZGFuZ2xpbmcgcHJvbWlzZVxuICAgICAgaWYgKCFzdWNjZXNzKSByZXNvbHZlcigpO1xuXG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgIHRoaXMucXVldWUuZGVidWcoJ1dhaXRpbmcgZm9yIHdpbGxQbGF5VHJhY2sgZXZlbnQgdG8gcmVzb2x2ZS4uLicpO1xuXG4gICAgICBhd2FpdCBkb25lUHJvbWlzZTtcblxuICAgICAgY29uc3QgZGFzcERpc2FibGVkID0gW1xuICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5kaXNhYmxlQmlxdWFkLFxuICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5kaXNhYmxlRXF1YWxpemVyLFxuICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5kaXNhYmxlRmlsdGVycyxcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZVJlc2FtcGxlcixcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZVZvbHVtZSxcbiAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcuZGlzYWJsZUNvbXByZXNzb3IsXG4gICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVSZXZlcmIsXG4gICAgICB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLmRpc2FibGVTZWVrZXJdLlxuICAgICAgZXZlcnkoKGUpID0+ICEhZSA9PT0gdHJ1ZSk7XG5cbiAgICAgIGNvbnN0IG5lZWRzRmlsdGVycyA9XG4gICAgICAhIXRyYWNrU3RyZWFtQ29uZmlnLnBsYXllckNvbmZpZy5zZWVrIHx8XG4gICAgICAhIXRoaXMucXVldWUuZmlsdGVycy5mZm1wZWcuYXJncy5sZW5ndGg7XG4gICAgICBjb25zdCBzaG91bGRTa2lwRkZtcGVnID1cbiAgICAgICEhdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy5za2lwRkZtcGVnICYmICFuZWVkc0ZpbHRlcnM7XG5cbiAgICAgIGxldCBmaW5hbFN0cmVhbTogUmVhZGFibGU7XG5cbiAgICAgIGNvbnN0IGRlbXV4YWJsZSA9IChmbXQ6IHN0cmluZykgPT5cbiAgICAgIFtcbiAgICAgIFN0cmVhbVR5cGUuT3B1cyxcbiAgICAgIFN0cmVhbVR5cGUuV2VibU9wdXMsXG4gICAgICBTdHJlYW1UeXBlLk9nZ09wdXMsXG4gICAgICBTdHJlYW1UeXBlLlJhdyxcbiAgICAgICdwY20nXS5cbiAgICAgIGluY2x1ZGVzKGZtdCBhcyBTdHJlYW1UeXBlKTtcblxuICAgICAgLy8gc2tpcCBmZm1wZWcgd2hlbiBwb3NzaWJsZVxuICAgICAgaWYgKFxuICAgICAgc2hvdWxkU2tpcEZGbXBlZyAmJlxuICAgICAgIShzdHJlYW1TcmMuc3RyZWFtIGluc3RhbmNlb2YgUmVhZGFibGUpICYmXG4gICAgICB0eXBlb2Ygc3RyZWFtU3JjLnN0cmVhbSAhPT0gJ3N0cmluZycgJiZcbiAgICAgIGRlbXV4YWJsZShzdHJlYW1TcmMuc3RyZWFtLiRmbXQpKVxuICAgICAge1xuICAgICAgICBjb25zdCB7ICRmbXQsIHN0cmVhbSB9ID0gc3RyZWFtU3JjLnN0cmVhbTtcbiAgICAgICAgY29uc3Qgc2hvdWxkUENNID0gIWRhc3BEaXNhYmxlZDtcblxuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICBgc2tpcEZGbXBlZyBpcyBzZXQgdG8gdHJ1ZSBhbmQgc3RyZWFtIGlzIGRlbXV4YWJsZSwgY3JlYXRpbmcgc3RyZWFtIHdpdGggdHlwZSAke1xuICAgICAgICAgIHNob3VsZFBDTSA/ICdwY20nIDogJ29wdXMnfWBcblxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGlzUmF3ID0gJGZtdCA9PT0gJ3BjbScgfHwgJGZtdCA9PT0gU3RyZWFtVHlwZS5SYXc7XG5cbiAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgIGNvbnN0IG9wdXNTdHJlYW0gPVxuICAgICAgICBpc1JhdyB8fCAkZm10ID09PSBTdHJlYW1UeXBlLk9wdXMgP1xuICAgICAgICBzdHJlYW0gOlxuICAgICAgICAkZm10ID09PSBTdHJlYW1UeXBlLk9nZ09wdXMgP1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBzdHJlYW0ucGlwZShuZXcgT2dnRGVtdXhlcigpIGFzIGFueSkgOlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBzdHJlYW0ucGlwZShuZXcgV2VibURlbXV4ZXIoKSBhcyBhbnkpO1xuXG4gICAgICAgIGlmIChzaG91bGRQQ00pIHtcbiAgICAgICAgICBpZiAoaXNSYXcpIHtcbiAgICAgICAgICAgIGZpbmFsU3RyZWFtID0gb3B1c1N0cmVhbTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbnkgZmlsdGVycyBlbmFibGVkLCB3ZSBuZWVkIHRvIGRlY29kZSB0aGUgb3B1cyBzdHJlYW0gdG8gcGNtXG4gICAgICAgICAgICBmaW5hbFN0cmVhbSA9IG9wdXNTdHJlYW0ucGlwZShcbiAgICAgICAgICAgICAgbmV3IE9wdXNEZWNvZGVyKHtcbiAgICAgICAgICAgICAgICBjaGFubmVsczogMixcbiAgICAgICAgICAgICAgICBmcmFtZVNpemU6IDk2MCxcbiAgICAgICAgICAgICAgICByYXRlOiA0ODAwMFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcudHlwZSA9IFN0cmVhbVR5cGUuUmF3O1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5hbFN0cmVhbSA9IG9wdXNTdHJlYW07XG4gICAgICAgICAgdHJhY2tTdHJlYW1Db25maWcuZGlzcGF0Y2hlckNvbmZpZy50eXBlID0gU3RyZWFtVHlwZS5PcHVzO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjb25zdCBvcHVzID0gZGFzcERpc2FibGVkICYmIHRoaXMuI2hhc0ZGbXBlZ09wdGltaXphdGlvbjtcbiAgICAgICAgLy8gaWYgKG9wdXMgJiYgdGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikgdGhpcy5xdWV1ZS5kZWJ1ZygnRGlzYWJsaW5nIFBDTSBvdXRwdXQgc2luY2UgYWxsIGZpbHRlcnMgYXJlIGRpc2FibGVkIGFuZCBvcHVzIGVuY29kaW5nIGlzIHN1cHBvcnRlZC4uLicpO1xuXG4gICAgICAgIGZpbmFsU3RyZWFtID0gdGhpcy4jY3JlYXRlRkZtcGVnU3RyZWFtKFxuICAgICAgICAgIHN0cmVhbVNyYy5zdHJlYW0gaW5zdGFuY2VvZiBSZWFkYWJsZSB8fFxuICAgICAgICAgIHR5cGVvZiBzdHJlYW1TcmMuc3RyZWFtID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbSA6XG4gICAgICAgICAgc3RyZWFtU3JjLnN0cmVhbS5zdHJlYW0sXG4gICAgICAgICAgdHJhY2ssXG4gICAgICAgICAgb3B0aW9ucy5zZWVrID8/IDBcbiAgICAgICAgICAvLyBvcHVzXG4gICAgICAgICk7XG4gICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWcudHlwZSA9IFN0cmVhbVR5cGUuUmF3O1xuICAgICAgICAvLyBGSVhNRTogT2dnT3B1cyByZXN1bHRzIGluIHN0YXRpYyBub2lzZVxuICAgICAgICAvLyB0cmFja1N0cmVhbUNvbmZpZy5kaXNwYXRjaGVyQ29uZmlnLnR5cGUgPSBvcHVzID8gU3RyZWFtVHlwZS5PZ2dPcHVzIDogU3RyZWFtVHlwZS5SYXc7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnRyYW5zaXRpb25Nb2RlKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgIGBUcmFuc2l0aW9uIG1vZGUgZGV0ZWN0ZWQsIHBsYXllciB3aWxsIHdhaXQgZm9yIGJ1ZmZlcmluZyB0aW1lb3V0IHRvIGV4cGlyZSAoVGltZW91dDogJHt0aGlzLnF1ZXVlLm9wdGlvbnMuYnVmZmVyaW5nVGltZW91dH1tcylgXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHdhaXRGb3IodGhpcy5xdWV1ZS5vcHRpb25zLmJ1ZmZlcmluZ1RpbWVvdXQpO1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZygnQnVmZmVyaW5nIHRpbWVvdXQgaGFzIGV4cGlyZWQhJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgYFByZXBhcmluZyBmaW5hbCBzdHJlYW0gY29uZmlnOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgMlxuICAgICAgICApfWBcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI7XG5cbiAgICAgIGlmICghZGlzcGF0Y2hlcikge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgICAnRGlzcGF0Y2hlciBpcyBub3QgYXZhaWxhYmxlLCB0aGlzIGlzIG1vc3QgbGlrZWx5IGR1ZSB0byB0aGUgcXVldWUgYmVpbmcgZGVsZXRlZCBpbiB0aGUgbWlkZGxlIG9mIG9wZXJhdGlvbi4gQ2FuY2VsbGluZyB0aGUgc3RyZWFtLi4uJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBmaW5hbFN0cmVhbS5kZXN0cm95KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IGRpc3BhdGNoZXIuY3JlYXRlU3RyZWFtKFxuICAgICAgICAgIGZpbmFsU3RyZWFtLFxuICAgICAgICAgIHRyYWNrU3RyZWFtQ29uZmlnLmRpc3BhdGNoZXJDb25maWdcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnF1ZXVlLnNldFRyYW5zaXRpb25pbmcoISFvcHRpb25zLnRyYW5zaXRpb25Nb2RlKTtcblxuICAgICAgICBhd2FpdCB0aGlzLiNwZXJmb3JtUGxheShyZXNvdXJjZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnF1ZXVlLmRlYnVnKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBhdWRpbyBwbGF5ZXI6ICR7ZX1gKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgI3Rocm93KHRyYWNrOiBUcmFjaywgZXJyb3I/OiBFcnJvciB8IG51bGwpOiB2b2lkIHtcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICBjb25zdCBzdHJlYW1EZWZpbml0ZWx5RmFpbGVkTXlEZWFyVF9UUGxlYXNlVHJ1c3RNZUl0c05vdE15RmF1bHQgPVxuICAgIG5ldyBOb1Jlc3VsdEVycm9yKGBDb3VsZCBub3QgZXh0cmFjdCBzdHJlYW0gZm9yIHRoaXMgdHJhY2ske2Vycm9yID8gYFxcblxcbiR7ZXJyb3Iuc3RhY2sgfHwgZXJyb3J9YCA6ICcnfWApO1xuXG5cbiAgICB0aGlzLnF1ZXVlLmVtaXQoXG4gICAgICBHdWlsZFF1ZXVlRXZlbnQuUGxheWVyU2tpcCxcbiAgICAgIHRoaXMucXVldWUsXG4gICAgICB0cmFjayxcbiAgICAgIFRyYWNrU2tpcFJlYXNvbi5Ob1N0cmVhbSxcbiAgICAgIHN0cmVhbURlZmluaXRlbHlGYWlsZWRNeURlYXJUX1RQbGVhc2VUcnVzdE1lSXRzTm90TXlGYXVsdC5tZXNzYWdlXG4gICAgKTtcbiAgICB0aGlzLnF1ZXVlLmVtaXQoXG4gICAgICBHdWlsZFF1ZXVlRXZlbnQuUGxheWVyRXJyb3IsXG4gICAgICB0aGlzLnF1ZXVlLFxuICAgICAgc3RyZWFtRGVmaW5pdGVseUZhaWxlZE15RGVhclRfVFBsZWFzZVRydXN0TWVJdHNOb3RNeUZhdWx0LFxuICAgICAgdHJhY2tcbiAgICApO1xuICAgIGNvbnN0IG5leHRUcmFjayA9IHRoaXMucXVldWUudHJhY2tzLmRpc3BhdGNoKCk7XG4gICAgaWYgKG5leHRUcmFjaykgcmV0dXJuIHZvaWQgdGhpcy5wbGF5KG5leHRUcmFjaywgeyBxdWV1ZTogZmFsc2UgfSk7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBzaG91bGQgYmUgcmVzb2x2ZWRcbiAgICB0aGlzLnF1ZXVlLmRpc3BhdGNoZXI/LmVtaXQoJ2ZpbmlzaCcsIG51bGwpO1xuICB9XG5cbiAgYXN5bmMgI3BlcmZvcm1QbGF5KHJlc291cmNlOiBBdWRpb1Jlc291cmNlPFRyYWNrPikge1xuICAgIGlmICghdGhpcy5xdWV1ZS5kaXNwYXRjaGVyKSB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICdEaXNwYXRjaGVyIGlzIG5vdCBhdmFpbGFibGUsIHRoaXMgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIHRoZSBxdWV1ZSBiZWluZyBkZWxldGVkIGluIHRoZSBtaWRkbGUgb2Ygb3BlcmF0aW9uLiBDYW5jZWxsaW5nIHRoZSBzdHJlYW0uLi4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZygnSW5pdGlhbGl6aW5nIGF1ZGlvIHBsYXllci4uLicpO1xuICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5kaXNwYXRjaGVyLnBsYXlTdHJlYW0ocmVzb3VyY2UpO1xuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpIHRoaXMucXVldWUuZGVidWcoJ0Rpc3BhdGNoaW5nIGF1ZGlvLi4uJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgI2NyZWF0ZUdlbmVyaWNTdHJlYW0odHJhY2s6IFRyYWNrKSB7XG4gICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgIGBBdHRlbXB0aW5nIHRvIGV4dHJhY3Qgc3RyZWFtIGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyByZWdpc3RlcmVkIGV4dHJhY3RvcnNgXG4gICAgKTtcblxuICAgIGNvbnN0IGF0dGVtcHRlZEV4dHJhY3RvcnMgPVxuICAgIHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMuZ2V0Q29udGV4dCgpPy5hdHRlbXB0ZWRFeHRyYWN0b3JzIHx8XG4gICAgbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCBzdHJlYW1JbmZvID0gYXdhaXQgdGhpcy5xdWV1ZS5wbGF5ZXIuZXh0cmFjdG9ycy5ydW4oXG4gICAgICBhc3luYyAoZXh0cmFjdG9yKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgdGhpcy5xdWV1ZS5wbGF5ZXIub3B0aW9ucy5ibG9ja1N0cmVhbUZyb20/LnNvbWUoXG4gICAgICAgICAgKGV4dCkgPT4gZXh0ID09PSBleHRyYWN0b3IuaWRlbnRpZmllclxuICAgICAgICApKVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGF0dGVtcHRlZEV4dHJhY3RvcnMuaGFzKGV4dHJhY3Rvci5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBhdHRlbXB0ZWRFeHRyYWN0b3JzLmFkZChleHRyYWN0b3IuaWRlbnRpZmllcik7XG4gICAgICAgIGNvbnN0IGNhblN0cmVhbSA9IGF3YWl0IGV4dHJhY3Rvci52YWxpZGF0ZShcbiAgICAgICAgICB0cmFjay51cmwsXG4gICAgICAgICAgdHJhY2sucXVlcnlUeXBlIHx8IFF1ZXJ5UmVzb2x2ZXIucmVzb2x2ZSh0cmFjay51cmwpLnR5cGVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFjYW5TdHJlYW0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGV4dHJhY3Rvci5zdHJlYW0odHJhY2spO1xuICAgICAgfSxcbiAgICAgIGZhbHNlXG4gICAgKTtcblxuICAgIGlmICghc3RyZWFtSW5mbyB8fCAhc3RyZWFtSW5mby5yZXN1bHQpIHtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB7XG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgYEZhaWxlZCB0byBleHRyYWN0IHN0cmVhbSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgcmVnaXN0ZXJlZCBleHRyYWN0b3JzYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMucXVldWUub3B0aW9ucy5kaXNhYmxlRmFsbGJhY2tTdHJlYW0pIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgYEdlbmVyaWMgc3RyZWFtIGV4dHJhY3Rpb24gZmFpbGVkIGFuZCBmYWxsYmFjayBzdHJlYW0gZXh0cmFjdGlvbiBpcyBlbmFibGVkYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy4jY3JlYXRlRmFsbGJhY2tTdHJlYW0odHJhY2spO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3RyZWFtSW5mbyB8fCBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICBgU3RyZWFtIGV4dHJhY3Rpb24gd2FzIHN1Y2Nlc3NmdWwgZm9yIFRyYWNrIHsgdGl0bGU6ICR7XG4gICAgICB0cmFjay50aXRsZX0sIHVybDogJHtcbiAgICAgIHRyYWNrLnVybH0gfSAoRXh0cmFjdG9yOiAke1xuICAgICAgc3RyZWFtSW5mby5leHRyYWN0b3I/LmlkZW50aWZpZXIgfHwgJ04vQSd9KWBcblxuICAgICk7XG5cbiAgICByZXR1cm4gc3RyZWFtSW5mbztcbiAgfVxuXG4gIGFzeW5jICNjcmVhdGVGYWxsYmFja1N0cmVhbSh0cmFjazogVHJhY2spIHtcbiAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgYEF0dGVtcHRpbmcgdG8gZXh0cmFjdCBzdHJlYW0gZm9yIFRyYWNrIHsgdGl0bGU6ICR7dHJhY2sudGl0bGV9LCB1cmw6ICR7dHJhY2sudXJsfSB9IHVzaW5nIGZhbGxiYWNrIHN0cmVhbWluZyBtZXRob2QuLi5gXG4gICAgKTtcblxuICAgIGNvbnN0IHZlcmlmeUZhbGxiYWNrU3RyZWFtID0gdGhpcy5xdWV1ZS5vcHRpb25zLnZlcmlmeUZhbGxiYWNrU3RyZWFtO1xuXG4gICAgY29uc3QgZmFsbGJhY2tTdHJlYW0gPSBhd2FpdCB0aGlzLnF1ZXVlLnBsYXllci5leHRyYWN0b3JzLnJ1bihcbiAgICAgIGFzeW5jIChleHRyYWN0b3IpID0+IHtcbiAgICAgICAgaWYgKGV4dHJhY3Rvci5pZGVudGlmaWVyID09PSB0cmFjay5leHRyYWN0b3I/LmlkZW50aWZpZXIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKFxuICAgICAgICB0aGlzLnF1ZXVlLnBsYXllci5vcHRpb25zLmJsb2NrU3RyZWFtRnJvbT8uc29tZShcbiAgICAgICAgICAoZXh0KSA9PiBleHQgPT09IGV4dHJhY3Rvci5pZGVudGlmaWVyXG4gICAgICAgICkpXG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWVyeSA9IGAke3RyYWNrLnRpdGxlfSAke3RyYWNrLmF1dGhvcn1gO1xuXG4gICAgICAgIGlmICh2ZXJpZnlGYWxsYmFja1N0cmVhbSkge1xuICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICAgICAgICBgRmFsbGJhY2sgc3RyZWFtIHZlcmlmaWNhdGlvbiBpcyBlbmFibGVkLCB2YWxpZGF0aW5nIHF1ZXJ5IGZvciBUcmFjayB7IHRpdGxlOiAke3RyYWNrLnRpdGxlfSwgdXJsOiAke3RyYWNrLnVybH0gfSB1c2luZyAke2V4dHJhY3Rvci5pZGVudGlmaWVyfS4uLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgc2hvdWxkUHJvY2VlZCA9IGF3YWl0IGV4dHJhY3Rvci52YWxpZGF0ZShcbiAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgdHJhY2sucXVlcnlUeXBlIHx8IHRyYWNrLnNvdXJjZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoIXNob3VsZFByb2NlZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byB2YWxpZGF0ZSBxdWVyeSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgJHtleHRyYWN0b3IuaWRlbnRpZmllcn1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWV1ZS5oYXNEZWJ1Z2dlcilcbiAgICAgICAgICAgIHRoaXMucXVldWUuZGVidWcoXG4gICAgICAgICAgICAgIGBRdWVyeSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gd2FzIHZhbGlkYXRlZCB1c2luZyAke2V4dHJhY3Rvci5pZGVudGlmaWVyfS4gUHJvY2VlZGluZyB3aXRoIGV4dHJhY3Rpb24uLi5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZhbGxiYWNrVHJhY2tzID0gYXdhaXQgZXh0cmFjdG9yLmhhbmRsZShxdWVyeSwge1xuICAgICAgICAgIHJlcXVlc3RlZEJ5OiB0cmFjay5yZXF1ZXN0ZWRCeVxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBmYWxsYmFja1RyYWNrID0gZmFsbGJhY2tUcmFja3MudHJhY2tzWzBdO1xuXG4gICAgICAgIGlmICghZmFsbGJhY2tUcmFjaykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IGV4dHJhY3Rvci5zdHJlYW0oZmFsbGJhY2tUcmFjayk7XG5cbiAgICAgICAgaWYgKCFzdHJlYW0pIHJldHVybiBmYWxzZTtcblxuICAgICAgICB0cmFjay5icmlkZ2VkVHJhY2sgPSBmYWxsYmFja1RyYWNrO1xuXG4gICAgICAgIHJldHVybiBzdHJlYW07XG4gICAgICB9LFxuICAgICAgdHJ1ZVxuICAgICk7XG5cbiAgICBpZiAoIWZhbGxiYWNrU3RyZWFtIHx8ICFmYWxsYmFja1N0cmVhbS5yZXN1bHQpIHtcbiAgICAgIGlmICh0aGlzLnF1ZXVlLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5xdWV1ZS5kZWJ1ZyhcbiAgICAgICAgYEZhaWxlZCB0byBleHRyYWN0IHN0cmVhbSBmb3IgVHJhY2sgeyB0aXRsZTogJHt0cmFjay50aXRsZX0sIHVybDogJHt0cmFjay51cmx9IH0gdXNpbmcgZmFsbGJhY2sgc3RyZWFtaW5nIG1ldGhvZGBcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsbGJhY2tTdHJlYW0gfHwgbnVsbDtcbiAgICB9XG5cbiAgICB0cmFjay5icmlkZ2VkRXh0cmFjdG9yID0gZmFsbGJhY2tTdHJlYW0uZXh0cmFjdG9yO1xuXG4gICAgcmV0dXJuIGZhbGxiYWNrU3RyZWFtO1xuICB9XG5cbiAgI2NyZWF0ZUZGbXBlZ1N0cmVhbShcbiAgc3RyZWFtOiBSZWFkYWJsZSB8IHN0cmluZyxcbiAgdHJhY2s6IFRyYWNrLFxuICBzZWVrID0gMCxcbiAgb3B1cz86IGJvb2xlYW4pXG4gIHtcbiAgICBjb25zdCBmZm1wZWdTdHJlYW0gPSB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLlxuICAgIGNyZWF0ZVN0cmVhbShzdHJlYW0sIHtcbiAgICAgIGVuY29kZXJBcmdzOiB0aGlzLnF1ZXVlLmZpbHRlcnMuZmZtcGVnLmFyZ3MsXG4gICAgICBzZWVrOiBzZWVrIC8gMTAwMCxcbiAgICAgIGZtdDogb3B1cyA/ICdvcHVzJyA6ICdzMTZsZSdcbiAgICB9KS5cbiAgICBvbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICBjb25zdCBtID0gYCR7ZXJyfWAudG9Mb3dlckNhc2UoKTtcblxuICAgICAgaWYgKHRoaXMucXVldWUuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLnF1ZXVlLmRlYnVnKFxuICAgICAgICBgU3RyZWFtIGNsb3NlZCBkdWUgdG8gYW4gZXJyb3IgZnJvbSBGRm1wZWcgc3RyZWFtOiAke1xuICAgICAgICBlcnIuc3RhY2sgfHwgZXJyLm1lc3NhZ2UgfHwgZXJyfWBcblxuICAgICAgKTtcblxuICAgICAgaWYgKG0uaW5jbHVkZXMoJ3ByZW1hdHVyZSBjbG9zZScpIHx8IG0uaW5jbHVkZXMoJ2VwaXBlJykpIHJldHVybjtcblxuICAgICAgdGhpcy5xdWV1ZS5lbWl0KEd1aWxkUXVldWVFdmVudC5QbGF5ZXJFcnJvciwgdGhpcy5xdWV1ZSwgZXJyLCB0cmFjayk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmZtcGVnU3RyZWFtO1xuICB9XG59IiwgImltcG9ydCB7IFNub3dmbGFrZVV0aWwgfSBmcm9tICdkaXNjb3JkLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBBc3luY1F1ZXVlQWNxdWlzaXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIEFib3J0U2lnbmFsIHRvIGNhbmNlbCB0aGlzIGVudHJ5XG4gICAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuZXhwb3J0IHR5cGUgQXN5bmNRdWV1ZUV4Y2VwdGlvbkhhbmRsZXIgPSAoZXhjZXB0aW9uOiBFcnJvcikgPT4gdm9pZDtcblxuZXhwb3J0IGNsYXNzIEFzeW5jUXVldWUge1xuICAvKipcbiAgICogVGhlIHF1ZXVlZCBlbnRyaWVzXG4gICAqL1xuICBwdWJsaWMgZW50cmllczogQXJyYXk8QXN5bmNRdWV1ZUVudHJ5PiA9IFtdO1xuXG4gIHB1YmxpYyBleGNlcHRpb25IYW5kbGVyPzogQXN5bmNRdWV1ZUV4Y2VwdGlvbkhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIENsZWFyIGVudHJpZXMgcXVldWVcbiAgICogQHBhcmFtIGNvbnN1bWUgV2hldGhlciBvciBub3QgdG8gY29uc3VtZSBhbGwgZW50cmllcyBiZWZvcmUgY2xlYXJpbmdcbiAgICovXG4gIHB1YmxpYyBjbGVhcihjb25zdW1lID0gZmFsc2UpIHtcbiAgICBpZiAoY29uc3VtZSkge1xuICAgICAgdGhpcy5lbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiBlbnRyeS5jb25zdW1lKCkpO1xuICAgIH1cblxuICAgIHRoaXMuZW50cmllcyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIHF1ZXVlLiBSZXR1cm5zIGAwYCBpZiBubyBlbnRyaWVzIGFyZSBhdmFpbGFibGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcy5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogQWNxdWlyZSBhbiBlbnRyeS5cbiAgICpcbiAgICogQGV4YW1wbGUgLy8gbG9jayB0aGUgcXVldWVcbiAgICogY29uc3QgZW50cnkgPSBhc3luY1F1ZXVlLmFjcXVpcmUoKTtcbiAgICogLy8gd2FpdCB1bnRpbCBwcmV2aW91cyB0YXNrIGlzIGNvbXBsZXRlZFxuICAgKiBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAqIC8vIGRvIHNvbWV0aGluZyBleHBlbnNpdmVcbiAgICogYXdhaXQgcGVyZm9ybVNvbWV0aGluZ0V4cGVuc2l2ZSgpO1xuICAgKiAvLyBtYWtlIHN1cmUgdG8gcmVsZWFzZSB0aGUgbG9jayBvbmNlIGRvbmVcbiAgICogYXN5bmNRdWV1ZS5yZWxlYXNlKCk7XG4gICAqXG4gICAqL1xuICBwdWJsaWMgYWNxdWlyZShvcHRpb25zPzogQXN5bmNRdWV1ZUFjcXVpc2l0aW9uT3B0aW9ucykge1xuICAgIGNvbnN0IGVudHJ5ID0gbmV3IEFzeW5jUXVldWVFbnRyeSh0aGlzLCBvcHRpb25zKTtcblxuICAgIGlmICh0aGlzLmV4Y2VwdGlvbkhhbmRsZXIpIGVudHJ5LmdldFRhc2soKS5jYXRjaCh0aGlzLmV4Y2VwdGlvbkhhbmRsZXIpO1xuXG4gICAgaWYgKHRoaXMuZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgIGVudHJ5LmNvbnN1bWUoKTtcbiAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9XG5cbiAgICB0aGlzLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2UgdGhlIGN1cnJlbnQgYWNxdWlzaXRpb24gYW5kIG1vdmUgdG8gbmV4dCBlbnRyeS5cbiAgICovXG4gIHB1YmxpYyByZWxlYXNlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lbnRyaWVzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgdGhpcy5lbnRyaWVzLnNoaWZ0KCk7XG4gICAgdGhpcy5lbnRyaWVzWzBdPy5jb25zdW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIGFsbCBlbnRyaWVzXG4gICAqL1xuICBwdWJsaWMgY2FuY2VsQWxsKCkge1xuICAgIHRoaXMuZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4gZW50cnkuY2FuY2VsKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgZ2l2ZW4gZW50cnkgZnJvbSB0aGUgcXVldWVcbiAgICogQHBhcmFtIGVudHJ5IFRoZSBlbnRyeSB0byByZW1vdmVcbiAgICovXG4gIHB1YmxpYyByZW1vdmVFbnRyeShlbnRyeTogQXN5bmNRdWV1ZUVudHJ5KSB7XG4gICAgY29uc3QgZW50cnlJZHggPSB0aGlzLmVudHJpZXMuaW5kZXhPZihlbnRyeSk7XG5cbiAgICBpZiAoZW50cnlJZHggIT09IC0xKSB7XG4gICAgICB0aGlzLmVudHJpZXMuc3BsaWNlKGVudHJ5SWR4LCAxKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXN5bmNRdWV1ZUVudHJ5IHtcbiAgcHVibGljIHJlYWRvbmx5IGlkID0gU25vd2ZsYWtlVXRpbC5nZW5lcmF0ZSgpLnRvU3RyaW5nKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvbWlzZTogUHJvbWlzZTx2b2lkPjtcbiAgcHVibGljIHNpZ25hbDogQWJvcnRTaWduYWwgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIG9uQWJvcnQ6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlc29sdmUhOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHJlamVjdCE6IChlcnI6IEVycm9yKSA9PiB2b2lkO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgcHVibGljIHF1ZXVlOiBBc3luY1F1ZXVlLFxuICBwdWJsaWMgb3B0aW9ucz86IEFzeW5jUXVldWVBY3F1aXNpdGlvbk9wdGlvbnMpXG4gIHtcbiAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgdGhpcy5yZWplY3QgPSByZWplY3Q7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5zaWduYWwpIHtcbiAgICAgIHRoaXMuc2V0QWJvcnRTaWduYWwodGhpcy5vcHRpb25zLnNpZ25hbCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldEFib3J0U2lnbmFsKHNpZ25hbDogQWJvcnRTaWduYWwpIHtcbiAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgICB0aGlzLnNpZ25hbCA9IHNpZ25hbDtcbiAgICB0aGlzLm9uQWJvcnQgPSAoKSA9PiB7XG4gICAgICB0aGlzLnF1ZXVlLnJlbW92ZUVudHJ5KHRoaXMpO1xuICAgICAgdGhpcy5jYW5jZWwoKTtcbiAgICB9O1xuXG4gICAgdGhpcy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCB0aGlzLm9uQWJvcnQpO1xuICB9XG5cbiAgcHVibGljIGNvbnN1bWUoKSB7XG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgdGhpcy5yZXNvbHZlKCk7XG4gIH1cblxuICBwdWJsaWMgcmVsZWFzZSgpIHtcbiAgICB0aGlzLmNvbnN1bWUoKTtcbiAgICB0aGlzLnF1ZXVlLnJlbGVhc2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBjYW5jZWwoKSB7XG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgdGhpcy5yZWplY3QobmV3IEVycm9yKCdDYW5jZWxsZWQnKSk7XG4gIH1cblxuICBwdWJsaWMgY2xlYW51cCgpIHtcbiAgICBpZiAodGhpcy5vbkFib3J0KSB0aGlzLnNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCB0aGlzLm9uQWJvcnQpO1xuICAgIHRoaXMuc2lnbmFsID0gbnVsbDtcbiAgICB0aGlzLm9uQWJvcnQgPSBudWxsO1xuICB9XG5cbiAgcHVibGljIGdldFRhc2soKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvbWlzZTtcbiAgfVxufSIsICJpbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBBdWRpb0ZpbHRlcnMsIEZpbHRlcnNOYW1lLCBRdWV1ZUZpbHRlcnMgfSBmcm9tICcuLi91dGlscy9BdWRpb0ZpbHRlcnMnO1xuaW1wb3J0IHsgR3VpbGRRdWV1ZSwgR3VpbGRRdWV1ZUV2ZW50IH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcbmltcG9ydCB7XG4gIEJpcXVhZEZpbHRlcnMsXG4gIEVxdWFsaXplcixcbiAgRXF1YWxpemVyQmFuZCxcbiAgUENNRmlsdGVycyB9IGZyb21cbidAZGlzY29yZC1wbGF5ZXIvZXF1YWxpemVyJztcbmltcG9ydCB7IEZGbXBlZ1N0cmVhbU9wdGlvbnMsIGNyZWF0ZUZGbXBlZ1N0cmVhbSB9IGZyb20gJy4uL3V0aWxzL0ZGbXBlZ1N0cmVhbSc7XG5pbXBvcnQgeyBJbnZhbGlkQXJnVHlwZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFN0cmVhbUNvbmZpZyB9IGZyb20gJy4vR3VpbGRRdWV1ZVBsYXllck5vZGUnO1xuXG50eXBlIEZpbHRlcnMgPSBrZXlvZiB0eXBlb2YgQXVkaW9GaWx0ZXJzLmZpbHRlcnM7XG5cbmNvbnN0IG1ha2VCYW5kcyA9IChhcnI6IG51bWJlcltdKSA9PiB7XG4gIHJldHVybiBBcnJheS5mcm9tKFxuICAgIHtcbiAgICAgIGxlbmd0aDogRXF1YWxpemVyLkJBTkRfQ09VTlRcbiAgICB9LFxuICAgIChfLCBpKSA9PiAoe1xuICAgICAgYmFuZDogaSxcbiAgICAgIGdhaW46IGFycltpXSA/IGFycltpXSAvIDMwIDogMFxuICAgIH0pXG4gICkgYXMgRXF1YWxpemVyQmFuZFtdO1xufTtcblxudHlwZSBFUVByZXNldCA9IHtcbiAgRmxhdDogRXF1YWxpemVyQmFuZFtdO1xuICBDbGFzc2ljYWw6IEVxdWFsaXplckJhbmRbXTtcbiAgQ2x1YjogRXF1YWxpemVyQmFuZFtdO1xuICBEYW5jZTogRXF1YWxpemVyQmFuZFtdO1xuICBGdWxsQmFzczogRXF1YWxpemVyQmFuZFtdO1xuICBGdWxsQmFzc1RyZWJsZTogRXF1YWxpemVyQmFuZFtdO1xuICBGdWxsVHJlYmxlOiBFcXVhbGl6ZXJCYW5kW107XG4gIEhlYWRwaG9uZXM6IEVxdWFsaXplckJhbmRbXTtcbiAgTGFyZ2VIYWxsOiBFcXVhbGl6ZXJCYW5kW107XG4gIExpdmU6IEVxdWFsaXplckJhbmRbXTtcbiAgUGFydHk6IEVxdWFsaXplckJhbmRbXTtcbiAgUG9wOiBFcXVhbGl6ZXJCYW5kW107XG4gIFJlZ2dhZTogRXF1YWxpemVyQmFuZFtdO1xuICBSb2NrOiBFcXVhbGl6ZXJCYW5kW107XG4gIFNrYTogRXF1YWxpemVyQmFuZFtdO1xuICBTb2Z0OiBFcXVhbGl6ZXJCYW5kW107XG4gIFNvZnRSb2NrOiBFcXVhbGl6ZXJCYW5kW107XG4gIFRlY2hubzogRXF1YWxpemVyQmFuZFtdO1xufTtcblxuZXhwb3J0IGNvbnN0IEVxdWFsaXplckNvbmZpZ3VyYXRpb25QcmVzZXQ6IFJlYWRvbmx5PEVRUHJlc2V0PiA9IE9iamVjdC5mcmVlemUoe1xuICBGbGF0OiBtYWtlQmFuZHMoW10pLFxuICBDbGFzc2ljYWw6IG1ha2VCYW5kcyhbXG4gIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LFxuICAtMS4xMTAyMmUtMTUsIC03LjIsIC03LjIsIC03LjIsIC05LjZdXG4gICksXG4gIENsdWI6IG1ha2VCYW5kcyhbXG4gIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCA4LjAsIDUuNiwgNS42LCA1LjYsIDMuMiwgLTEuMTEwMjJlLTE1LFxuICAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNV1cbiAgKSxcbiAgRGFuY2U6IG1ha2VCYW5kcyhbXG4gIDkuNiwgNy4yLCAyLjQsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtNS42LCAtNy4yLCAtNy4yLCAtMS4xMTAyMmUtMTUsXG4gIC0xLjExMDIyZS0xNV1cbiAgKSxcbiAgRnVsbEJhc3M6IG1ha2VCYW5kcyhbXG4gIC04LjAsIDkuNiwgOS42LCA1LjYsIDEuNiwgLTQuMCwgLTguMCwgLTEwLjQsIC0xMS4yLCAtMTEuMl1cbiAgKSxcbiAgRnVsbEJhc3NUcmVibGU6IG1ha2VCYW5kcyhbXG4gIDcuMiwgNS42LCAtMS4xMTAyMmUtMTUsIC03LjIsIC00LjgsIDEuNiwgOC4wLCAxMS4yLCAxMi4wLCAxMi4wXVxuICApLFxuICBGdWxsVHJlYmxlOiBtYWtlQmFuZHMoW1xuICAtOS42LCAtOS42LCAtOS42LCAtNC4wLCAyLjQsIDExLjIsIDE2LjAsIDE2LjAsIDE2LjAsIDE2LjhdXG4gICksXG4gIEhlYWRwaG9uZXM6IG1ha2VCYW5kcyhbXG4gIDQuOCwgMTEuMiwgNS42LCAtMy4yLCAtMi40LCAxLjYsIDQuOCwgOS42LCAxMi44LCAxNC40XVxuICApLFxuICBMYXJnZUhhbGw6IG1ha2VCYW5kcyhbXG4gIDEwLjQsIDEwLjQsIDUuNiwgNS42LCAtMS4xMTAyMmUtMTUsIC00LjgsIC00LjgsIC00LjgsIC0xLjExMDIyZS0xNSxcbiAgLTEuMTEwMjJlLTE1XVxuICApLFxuICBMaXZlOiBtYWtlQmFuZHMoWy00LjgsIC0xLjExMDIyZS0xNSwgNC4wLCA1LjYsIDUuNiwgNS42LCA0LjAsIDIuNCwgMi40LCAyLjRdKSxcbiAgUGFydHk6IG1ha2VCYW5kcyhbXG4gIDcuMiwgNy4yLCAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtMS4xMTAyMmUtMTUsXG4gIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCA3LjIsIDcuMl1cbiAgKSxcbiAgUG9wOiBtYWtlQmFuZHMoW1xuICAtMS42LCA0LjgsIDcuMiwgOC4wLCA1LjYsIC0xLjExMDIyZS0xNSwgLTIuNCwgLTIuNCwgLTEuNiwgLTEuNl1cbiAgKSxcbiAgUmVnZ2FlOiBtYWtlQmFuZHMoW1xuICAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1LCAtNS42LCAtMS4xMTAyMmUtMTUsIDYuNCwgNi40LFxuICAtMS4xMTAyMmUtMTUsIC0xLjExMDIyZS0xNSwgLTEuMTEwMjJlLTE1XVxuICApLFxuICBSb2NrOiBtYWtlQmFuZHMoWzguMCwgNC44LCAtNS42LCAtOC4wLCAtMy4yLCA0LjAsIDguOCwgMTEuMiwgMTEuMiwgMTEuMl0pLFxuICBTa2E6IG1ha2VCYW5kcyhbXG4gIC0yLjQsIC00LjgsIC00LjAsIC0xLjExMDIyZS0xNSwgNC4wLCA1LjYsIDguOCwgOS42LCAxMS4yLCA5LjZdXG4gICksXG4gIFNvZnQ6IG1ha2VCYW5kcyhbXG4gIDQuOCwgMS42LCAtMS4xMTAyMmUtMTUsIC0yLjQsIC0xLjExMDIyZS0xNSwgNC4wLCA4LjAsIDkuNiwgMTEuMiwgMTIuMF1cbiAgKSxcbiAgU29mdFJvY2s6IG1ha2VCYW5kcyhbXG4gIDQuMCwgNC4wLCAyLjQsIC0xLjExMDIyZS0xNSwgLTQuMCwgLTUuNiwgLTMuMiwgLTEuMTEwMjJlLTE1LCAyLjQsIDguOF1cbiAgKSxcbiAgVGVjaG5vOiBtYWtlQmFuZHMoW1xuICA4LjAsIDUuNiwgLTEuMTEwMjJlLTE1LCAtNS42LCAtNC44LCAtMS4xMTAyMmUtMTUsIDguMCwgOS42LCA5LjYsIDguOF1cbiAgKVxufSk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY2xhc3MgRkZtcGVnRmlsdGVyZXI8TWV0YSA9IGFueT4ge1xuICAjZmZtcGVnRmlsdGVyczogRmlsdGVyc1tdID0gW107XG4gICNpbnB1dEFyZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBhZjogR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhPikge31cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgZmZtcGVnIG1heSBiZSBza2lwcGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNraXBwYWJsZSgpIHtcbiAgICByZXR1cm4gISF0aGlzLmFmLnF1ZXVlLnBsYXllci5vcHRpb25zLnNraXBGRm1wZWc7XG4gIH1cblxuICAjc2V0RmlsdGVycyhmaWx0ZXJzOiBGaWx0ZXJzW10pIHtcbiAgICBjb25zdCB7IHF1ZXVlIH0gPSB0aGlzLmFmO1xuICAgIC8vIHNraXAgaWYgZmlsdGVycyBhcmUgdGhlIHNhbWVcbiAgICBpZiAoXG4gICAgZmlsdGVycy5ldmVyeSgoZikgPT4gdGhpcy4jZmZtcGVnRmlsdGVycy5pbmNsdWRlcyhmKSkgJiZcbiAgICB0aGlzLiNmZm1wZWdGaWx0ZXJzLmV2ZXJ5KChmKSA9PiBmaWx0ZXJzLmluY2x1ZGVzKGYpKSlcblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgIGNvbnN0IGlnbm9yZUZpbHRlcnMgPVxuICAgIHRoaXMuZmlsdGVycy5zb21lKChmZikgPT4gZmYgPT09ICduaWdodGNvcmUnIHx8IGZmID09PSAndmFwb3J3YXZlJykgJiZcbiAgICAhZmlsdGVycy5zb21lKChmZikgPT4gZmYgPT09ICduaWdodGNvcmUnIHx8IGZmID09PSAndmFwb3J3YXZlJyk7XG4gICAgY29uc3Qgc2Vla1RpbWUgPSBxdWV1ZS5ub2RlLmdldFRpbWVzdGFtcChpZ25vcmVGaWx0ZXJzKT8uY3VycmVudC52YWx1ZSB8fCAwO1xuICAgIGNvbnN0IHByZXYgPSB0aGlzLiNmZm1wZWdGaWx0ZXJzLnNsaWNlKCk7XG4gICAgdGhpcy4jZmZtcGVnRmlsdGVycyA9IFsuLi5uZXcgU2V0KGZpbHRlcnMpXTtcblxuICAgIHJldHVybiB0aGlzLmFmLnRyaWdnZXJSZXBsYXkoc2Vla1RpbWUpLnRoZW4oKHQpID0+IHtcbiAgICAgIHF1ZXVlLmVtaXQoXG4gICAgICAgIEd1aWxkUXVldWVFdmVudC5BdWRpb0ZpbHRlcnNVcGRhdGUsXG4gICAgICAgIHF1ZXVlLFxuICAgICAgICBwcmV2LFxuICAgICAgICB0aGlzLiNmZm1wZWdGaWx0ZXJzLnNsaWNlKClcbiAgICAgICk7XG4gICAgICByZXR1cm4gdDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgaW5wdXQgYXJncyBmb3IgRkZtcGVnXG4gICAqL1xuICBwdWJsaWMgc2V0SW5wdXRBcmdzKGFyZ3M6IHN0cmluZ1tdKSB7XG4gICAgaWYgKCFhcmdzLmV2ZXJ5KChhcmcpID0+IHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSlcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ1R5cGVFcnJvcignYXJncycsICdBcnJheTxzdHJpbmc+JywgJ2ludmFsaWQgaXRlbShzKScpO1xuICAgIHRoaXMuI2lucHV0QXJncyA9IGFyZ3M7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGlucHV0IGFyZ3NcbiAgICovXG4gIHB1YmxpYyBnZXQgaW5wdXRBcmdzKCkge1xuICAgIHJldHVybiB0aGlzLiNpbnB1dEFyZ3M7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGVuY29kZXIgYXJnc1xuICAgKi9cbiAgcHVibGljIGdldCBlbmNvZGVyQXJncygpIHtcbiAgICBpZiAoIXRoaXMuZmlsdGVycy5sZW5ndGgpIHJldHVybiBbXTtcblxuICAgIHJldHVybiBbJy1hZicsIHRoaXMudG9TdHJpbmcoKV07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZpbmFsIGZmbXBlZyBhcmdzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFyZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXRBcmdzLmNvbmNhdCh0aGlzLmVuY29kZXJBcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgZmZtcGVnIHN0cmVhbVxuICAgKiBAcGFyYW0gc291cmNlIFRoZSBzdHJlYW0gc291cmNlXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBzdHJlYW0gb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGNyZWF0ZVN0cmVhbShzb3VyY2U6IHN0cmluZyB8IFJlYWRhYmxlLCBvcHRpb25zOiBGRm1wZWdTdHJlYW1PcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuI2lucHV0QXJncy5sZW5ndGgpXG4gICAgb3B0aW9ucy5lbmNvZGVyQXJncyA9IFtcbiAgICAuLi50aGlzLiNpbnB1dEFyZ3MsXG4gICAgLi4uKG9wdGlvbnMuZW5jb2RlckFyZ3MgfHwgW10pXTtcblxuXG4gICAgY29uc3Qgc3RyZWFtID0gY3JlYXRlRkZtcGVnU3RyZWFtKHNvdXJjZSwgb3B0aW9ucyk7XG5cbiAgICByZXR1cm4gc3RyZWFtO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBmZm1wZWcgZmlsdGVyc1xuICAgKiBAcGFyYW0gZmlsdGVycyBUaGUgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIHNldEZpbHRlcnMoXG4gIGZpbHRlcnM6IEZpbHRlcnNbXSB8IFJlY29yZDxGaWx0ZXJzLCBib29sZWFuPiB8IHN0cmluZ1tdIHwgYm9vbGVhbilcbiAge1xuICAgIGxldCBfZmlsdGVyczogRmlsdGVyc1tdID0gW107XG4gICAgaWYgKHR5cGVvZiBmaWx0ZXJzID09PSAnYm9vbGVhbicpIHtcbiAgICAgIF9maWx0ZXJzID0gIWZpbHRlcnMgP1xuICAgICAgW10gOlxuICAgICAgT2JqZWN0LmtleXMoQXVkaW9GaWx0ZXJzLmZpbHRlcnMpIGFzIEZpbHRlcnNbXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVycykpIHtcbiAgICAgIF9maWx0ZXJzID0gZmlsdGVycyBhcyBGaWx0ZXJzW107XG4gICAgfSBlbHNlIHtcbiAgICAgIF9maWx0ZXJzID0gT2JqZWN0LmVudHJpZXMoZmlsdGVycykuXG4gICAgICBmaWx0ZXIoKHJlcykgPT4gcmVzWzFdID09PSB0cnVlKS5cbiAgICAgIG1hcCgobSkgPT4gbVswXSkgYXMgRmlsdGVyc1tdO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLiNzZXRGaWx0ZXJzKF9maWx0ZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXJyZW50bHkgYWN0aXZlIGZmbXBlZyBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZpbHRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2ZmbXBlZ0ZpbHRlcnM7XG4gIH1cblxuICBwdWJsaWMgc2V0IGZpbHRlcnMoZmlsdGVyczogRmlsdGVyc1tdKSB7XG4gICAgdGhpcy5zZXRGaWx0ZXJzKGZpbHRlcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBnaXZlbiBmZm1wZWcgZmlsdGVyKHMpXG4gICAqIEBwYXJhbSBmaWx0ZXJzIFRoZSBmaWx0ZXIocylcbiAgICovXG4gIHB1YmxpYyB0b2dnbGUoZmlsdGVyczogRmlsdGVyc1tdIHwgRmlsdGVycykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXJzKSkgZmlsdGVycyA9IFtmaWx0ZXJzXTtcbiAgICBjb25zdCBmcmVzaDogRmlsdGVyc1tdID0gW107XG5cbiAgICBmaWx0ZXJzLmZvckVhY2goKGYpID0+IHtcbiAgICAgIGlmICh0aGlzLmZpbHRlcnMuaW5jbHVkZXMoZikpIHJldHVybjtcbiAgICAgIGZyZXNoLnB1c2goZik7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy4jc2V0RmlsdGVycyhcbiAgICAgIHRoaXMuI2ZmbXBlZ0ZpbHRlcnMuZmlsdGVyKChyKSA9PiAhZmlsdGVycy5pbmNsdWRlcyhyKSkuY29uY2F0KGZyZXNoKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGRlZmF1bHQgZmlsdGVyc1xuICAgKiBAcGFyYW0gZmYgRmlsdGVycyBsaXN0XG4gICAqL1xuICBwdWJsaWMgc2V0RGVmYXVsdHMoZmY6IEZpbHRlcnNbXSkge1xuICAgIHRoaXMuI2ZmbXBlZ0ZpbHRlcnMgPSBmZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbGlzdCBvZiBlbmFibGVkIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBnZXRGaWx0ZXJzRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jZmZtcGVnRmlsdGVycztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbGlzdCBvZiBkaXNhYmxlZCBmaWx0ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0RmlsdGVyc0Rpc2FibGVkKCkge1xuICAgIHJldHVybiBBdWRpb0ZpbHRlcnMubmFtZXMuZmlsdGVyKChmKSA9PiAhdGhpcy4jZmZtcGVnRmlsdGVycy5pbmNsdWRlcyhmKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGZpbHRlciBpcyBlbmFibGVkXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlclxuICAgKi9cbiAgcHVibGljIGlzRW5hYmxlZDxUIGV4dGVuZHMgRmlsdGVycz4oZmlsdGVyOiBUKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2ZmbXBlZ0ZpbHRlcnMuaW5jbHVkZXMoZmlsdGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gZmlsdGVyIGlzIGRpc2FibGVkXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlclxuICAgKi9cbiAgcHVibGljIGlzRGlzYWJsZWQ8VCBleHRlbmRzIEZpbHRlcnM+KGZpbHRlcjogVCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5pc0VuYWJsZWQoZmlsdGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gZmlsdGVyIGlzIGEgdmFsaWQgZmlsdGVyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciB0byB0ZXN0XG4gICAqL1xuICBwdWJsaWMgaXNWYWxpZEZpbHRlcihmaWx0ZXI6IHN0cmluZyk6IGZpbHRlciBpcyBGaWx0ZXJzTmFtZSB7XG4gICAgcmV0dXJuIEF1ZGlvRmlsdGVycy5oYXMoZmlsdGVyIGFzIEZpbHRlcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgY3VycmVudCBmaWx0ZXJzIHRvIGFycmF5XG4gICAqL1xuICBwdWJsaWMgdG9BcnJheSgpIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJzLm1hcCgoZmlsdGVyKSA9PiBBdWRpb0ZpbHRlcnMuZ2V0KGZpbHRlcikpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgY3VycmVudCBmaWx0ZXJzIHRvIEpTT04gb2JqZWN0XG4gICAqL1xuICBwdWJsaWMgdG9KU09OKCkge1xuICAgIGNvbnN0IG9iaiA9IHt9IGFzIFJlY29yZDxrZXlvZiBRdWV1ZUZpbHRlcnMsIHN0cmluZz47XG5cbiAgICB0aGlzLmZpbHRlcnMuZm9yRWFjaCgoZmlsdGVyKSA9PiBvYmpbZmlsdGVyXSA9IEF1ZGlvRmlsdGVycy5nZXQoZmlsdGVyKSk7XG5cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBjdXJyZW50IGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gQXVkaW9GaWx0ZXJzLmNyZWF0ZSh0aGlzLmZpbHRlcnMpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpbGRRdWV1ZUFGaWx0ZXJzQ2FjaGUge1xuICBlcXVhbGl6ZXI6IEVxdWFsaXplckJhbmRbXTtcbiAgYmlxdWFkOiBCaXF1YWRGaWx0ZXJzIHwgbnVsbDtcbiAgZmlsdGVyczogUENNRmlsdGVyc1tdO1xuICB2b2x1bWU6IG51bWJlcjtcbiAgc2FtcGxlUmF0ZTogbnVtYmVyO1xuICBzYW1wbGVSYXRlRmlsdGVyOlxuICBTdHJlYW1Db25maWdbJ2Rpc3BhdGNoZXJDb25maWcnXVsnc2FtcGxlUmF0ZUZpbHRlcnMnXSB8XG4gIG51bGw7XG4gIGNvbXByZXNzb3I6IFN0cmVhbUNvbmZpZ1snZGlzcGF0Y2hlckNvbmZpZyddWydjb21wcmVzc29yJ10gfCBudWxsO1xuICByZXZlcmI6IFN0cmVhbUNvbmZpZ1snZGlzcGF0Y2hlckNvbmZpZyddWydyZXZlcmInXSB8IG51bGw7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY2xhc3MgR3VpbGRRdWV1ZUF1ZGlvRmlsdGVyczxNZXRhID0gYW55PiB7XG4gIHB1YmxpYyBncmFwaCA9IG5ldyBBRmlsdGVyR3JhcGg8TWV0YT4odGhpcyk7XG4gIHB1YmxpYyBmZm1wZWcgPSBuZXcgRkZtcGVnRmlsdGVyZXI8TWV0YT4odGhpcyk7XG4gIHB1YmxpYyBlcXVhbGl6ZXJQcmVzZXRzID0gRXF1YWxpemVyQ29uZmlndXJhdGlvblByZXNldDtcbiAgcHVibGljIF9sYXN0RmlsdGVyc0NhY2hlOiBHdWlsZFF1ZXVlQUZpbHRlcnNDYWNoZSA9IHtcbiAgICBiaXF1YWQ6IG51bGwsXG4gICAgZXF1YWxpemVyOiBbXSxcbiAgICBmaWx0ZXJzOiBbXSxcbiAgICB2b2x1bWU6IDEwMCxcbiAgICBzYW1wbGVSYXRlOiAtMSxcbiAgICBjb21wcmVzc29yOiBudWxsLFxuICAgIHJldmVyYjogbnVsbCxcbiAgICBzYW1wbGVSYXRlRmlsdGVyOiBudWxsXG4gIH07XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4pIHtcbiAgICBpZiAodHlwZW9mIHRoaXMucXVldWUub3B0aW9ucy52b2x1bWUgPT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLl9sYXN0RmlsdGVyc0NhY2hlLnZvbHVtZSA9IHRoaXMucXVldWUub3B0aW9ucy52b2x1bWU7XG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETzogZW5hYmxlIHRoaXMgaW4gdGhlIGZ1dHVyZVxuICAvLyBwdWJsaWMgZ2V0IGZmbXBlZygpOiBGRm1wZWdGaWx0ZXJlcjxNZXRhPiB8IG51bGwge1xuICAvLyAgICAgaWYgKHRoaXMucXVldWUucGxheWVyLm9wdGlvbnMuc2tpcEZGbXBlZykge1xuICAvLyAgICAgICAgIGlmICh0aGlzLiNmZm1wZWcpIHRoaXMuI2ZmbXBlZyA9IG51bGw7XG4gIC8vICAgICAgICAgcmV0dXJuIG51bGw7XG4gIC8vICAgICB9XG5cbiAgLy8gICAgIGlmICghdGhpcy4jZmZtcGVnKSB7XG4gIC8vICAgICAgICAgdGhpcy4jZmZtcGVnID0gbmV3IEZGbXBlZ0ZpbHRlcmVyPE1ldGE+KHRoaXMpO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICByZXR1cm4gdGhpcy4jZmZtcGVnO1xuICAvLyB9XG5cbiAgLyoqXG4gICAqIFZvbHVtZSB0cmFuc2Zvcm1lclxuICAgKi9cbiAgcHVibGljIGdldCB2b2x1bWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZHNwPy52b2x1bWUgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiAxNSBCYW5kIEVxdWFsaXplclxuICAgKi9cbiAgcHVibGljIGdldCBlcXVhbGl6ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uZXF1YWxpemVyIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGlnaXRhbCBiaXF1YWQgZmlsdGVyc1xuICAgKi9cbiAgcHVibGljIGdldCBiaXF1YWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uYmlxdWFkIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRFNQIGZpbHRlcnNcbiAgICovXG4gIHB1YmxpYyBnZXQgZmlsdGVycygpIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5maWx0ZXJzIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQXVkaW8gcmVzYW1wbGVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlc2FtcGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5kaXNwYXRjaGVyPy5yZXNhbXBsZXIgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wcmVzc29yIHRyYW5zZm9ybWVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbXByZXNzb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uY29tcHJlc3NvciB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldmVyYiB0cmFuc2Zvcm1lclxuICAgKi9cbiAgcHVibGljIGdldCByZXZlcmIoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8ucmV2ZXJiIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUENNIFNlZWtlciB0cmFuc2Zvcm1lclxuICAgKi9cbiAgcHVibGljIGdldCBzZWVrZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZGlzcGF0Y2hlcj8uc2Vla2VyIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGF5IGN1cnJlbnQgdHJhY2sgaW4gdHJhbnNpdGlvbiBtb2RlXG4gICAqIEBwYXJhbSBzZWVrIFRoZSBkdXJhdGlvbiB0byBzZWVrIHRvXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdHJpZ2dlclJlcGxheShzZWVrID0gMCkge1xuICAgIGlmICghdGhpcy5xdWV1ZS5jdXJyZW50VHJhY2spIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLmFjcXVpcmUoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZW50cnkuZ2V0VGFzaygpO1xuICAgICAgYXdhaXQgdGhpcy5xdWV1ZS5ub2RlLnBsYXkodGhpcy5xdWV1ZS5jdXJyZW50VHJhY2ssIHtcbiAgICAgICAgcXVldWU6IGZhbHNlLFxuICAgICAgICBzZWVrLFxuICAgICAgICB0cmFuc2l0aW9uTW9kZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICB0aGlzLnF1ZXVlLm5vZGUudGFza3NRdWV1ZS5yZWxlYXNlKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMucXVldWUubm9kZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjbGFzcyBBRmlsdGVyR3JhcGg8TWV0YSA9IGFueT4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGFmOiBHdWlsZFF1ZXVlQXVkaW9GaWx0ZXJzPE1ldGE+KSB7fVxuXG4gIHB1YmxpYyBnZXQgZmZtcGVnKCkge1xuICAgIHJldHVybiB0aGlzLmFmLmZmbXBlZz8uZmlsdGVycyA/PyBbXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXF1YWxpemVyKCkge1xuICAgIHJldHVybiAodGhpcy5hZi5lcXVhbGl6ZXI/LmJhbmRNdWx0aXBsaWVycyB8fCBbXSkubWFwKChtLCBpKSA9PiAoe1xuICAgICAgYmFuZDogaSxcbiAgICAgIGdhaW46IG1cbiAgICB9KSkgYXMgRXF1YWxpemVyQmFuZFtdO1xuICB9XG5cbiAgcHVibGljIGdldCBiaXF1YWQoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYWYuYmlxdWFkPy5nZXRGaWx0ZXJOYW1lKCkgYXMgRXhjbHVkZTxcbiAgICAgICAgQmlxdWFkRmlsdGVycyxcbiAgICAgICAgbnVtYmVyPiB8XG4gICAgICBudWxsIHx8IG51bGwpO1xuXG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpbHRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWYuZmlsdGVycz8uZmlsdGVycyB8fCBbXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdm9sdW1lKCkge1xuICAgIHJldHVybiB0aGlzLmFmLnZvbHVtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmVzYW1wbGVyKCkge1xuICAgIHJldHVybiB0aGlzLmFmLnJlc2FtcGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBkdW1wKCk6IEZpbHRlckdyYXBoIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmZtcGVnOiB0aGlzLmZmbXBlZyxcbiAgICAgIGVxdWFsaXplcjogdGhpcy5lcXVhbGl6ZXIsXG4gICAgICBiaXF1YWQ6IHRoaXMuYmlxdWFkLFxuICAgICAgZmlsdGVyczogdGhpcy5maWx0ZXJzLFxuICAgICAgc2FtcGxlUmF0ZTogdGhpcy5yZXNhbXBsZXI/LnNhbXBsZVJhdGUgfHwgNDgwMDAsXG4gICAgICB2b2x1bWU6IHRoaXMudm9sdW1lPy52b2x1bWUgPz8gMTAwXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckdyYXBoIHtcbiAgZmZtcGVnOiBGaWx0ZXJzW107XG4gIGVxdWFsaXplcjogRXF1YWxpemVyQmFuZFtdO1xuICBiaXF1YWQ6IEV4Y2x1ZGU8QmlxdWFkRmlsdGVycywgbnVtYmVyPiB8IG51bGw7XG4gIGZpbHRlcnM6IFBDTUZpbHRlcnNbXTtcbiAgdm9sdW1lOiBudW1iZXI7XG4gIHNhbXBsZVJhdGU6IG51bWJlcjtcbn0iLCAiaW1wb3J0IHR5cGUgeyBEdXBsZXgsIFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IEZGbXBlZywgY3JlYXRlRkZtcGVnQXJncyB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci9mZm1wZWcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZGbXBlZ1N0cmVhbU9wdGlvbnMge1xuICBmbXQ/OiBzdHJpbmc7XG4gIGVuY29kZXJBcmdzPzogc3RyaW5nW107XG4gIHNlZWs/OiBudW1iZXI7XG4gIHNraXA/OiBib29sZWFuO1xuICBjb29raWVzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRkZNUEVHX0FSR1NfU1RSSU5HKFxuc3RyZWFtOiBzdHJpbmcsXG5mbXQ/OiBzdHJpbmcsXG5jb29raWVzPzogc3RyaW5nKVxue1xuICBjb25zdCBhcmdzID0gY3JlYXRlRkZtcGVnQXJncyh7XG4gICAgcmVjb25uZWN0OiAxLFxuICAgIHJlY29ubmVjdF9zdHJlYW1lZDogMSxcbiAgICByZWNvbm5lY3RfZGVsYXlfbWF4OiA1LFxuICAgIGk6IHN0cmVhbSxcbiAgICBhbmFseXplZHVyYXRpb246IDAsXG4gICAgbG9nbGV2ZWw6IDAsXG4gICAgYXI6IDQ4MDAwLFxuICAgIGFjOiAyLFxuICAgIGY6IGAke3R5cGVvZiBmbXQgPT09ICdzdHJpbmcnID8gZm10IDogJ3MxNmxlJ31gLFxuICAgIGFjb2RlYzogZm10ID09PSAnb3B1cycgPyAnbGlib3B1cycgOiBudWxsLFxuICAgIGNvb2tpZXM6XG4gICAgdHlwZW9mIGNvb2tpZXMgPT09ICdzdHJpbmcnID9cbiAgICAhY29va2llcy5pbmNsdWRlcygnICcpID9cbiAgICBjb29raWVzIDpcbiAgICBgXCIke2Nvb2tpZXN9XCJgIDpcbiAgICBudWxsXG4gIH0pO1xuXG4gIHJldHVybiBhcmdzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRkZNUEVHX0FSR1NfUElQRUQoZm10Pzogc3RyaW5nKSB7XG4gIGNvbnN0IGFyZ3MgPSBjcmVhdGVGRm1wZWdBcmdzKHtcbiAgICBhbmFseXplZHVyYXRpb246IDAsXG4gICAgbG9nbGV2ZWw6IDAsXG4gICAgYXI6IDQ4MDAwLFxuICAgIGFjOiAyLFxuICAgIGY6IGAke3R5cGVvZiBmbXQgPT09ICdzdHJpbmcnID8gZm10IDogJ3MxNmxlJ31gLFxuICAgIGFjb2RlYzogZm10ID09PSAnb3B1cycgPyAnbGlib3B1cycgOiBudWxsXG4gIH0pO1xuXG4gIHJldHVybiBhcmdzO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgRkZtcGVnIHN0cmVhbVxuICogQHBhcmFtIHN0cmVhbSBUaGUgc291cmNlIHN0cmVhbVxuICogQHBhcmFtIG9wdGlvbnMgRkZtcGVnIHN0cmVhbSBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGRm1wZWdTdHJlYW0oXG5zdHJlYW06IFJlYWRhYmxlIHwgRHVwbGV4IHwgc3RyaW5nLFxub3B0aW9ucz86IEZGbXBlZ1N0cmVhbU9wdGlvbnMpXG46IFJlYWRhYmxlIHtcbiAgaWYgKG9wdGlvbnM/LnNraXAgJiYgdHlwZW9mIHN0cmVhbSAhPT0gJ3N0cmluZycpIHJldHVybiBzdHJlYW07XG4gIG9wdGlvbnMgPz89IHt9O1xuICBjb25zdCBhcmdzID1cbiAgdHlwZW9mIHN0cmVhbSA9PT0gJ3N0cmluZycgP1xuICBGRk1QRUdfQVJHU19TVFJJTkcoc3RyZWFtLCBvcHRpb25zLmZtdCwgb3B0aW9ucy5jb29raWVzKSA6XG4gIEZGTVBFR19BUkdTX1BJUEVEKG9wdGlvbnMuZm10KTtcblxuICBpZiAoIU51bWJlci5pc05hTihvcHRpb25zLnNlZWspKSBhcmdzLnVuc2hpZnQoJy1zcycsIFN0cmluZyhvcHRpb25zLnNlZWspKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucy5lbmNvZGVyQXJncykpIGFyZ3MucHVzaCguLi5vcHRpb25zLmVuY29kZXJBcmdzKTtcblxuICBjb25zdCB0cmFuc2NvZGVyID0gbmV3IEZGbXBlZyh7IHNoZWxsOiBmYWxzZSwgYXJncyB9KTtcblxuICB0cmFuc2NvZGVyLm9uKCdjbG9zZScsICgpID0+IHRyYW5zY29kZXIuZGVzdHJveSgpKTtcblxuICBpZiAodHlwZW9mIHN0cmVhbSAhPT0gJ3N0cmluZycpIHtcbiAgICBzdHJlYW0ub24oJ2Vycm9yJywgKCkgPT4gdHJhbnNjb2Rlci5kZXN0cm95KCkpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgc3RyZWFtLnBpcGUodHJhbnNjb2RlciBhcyBhbnkpO1xuICB9XG5cbiAgcmV0dXJuIHRyYW5zY29kZXI7XG59IiwgImltcG9ydCB7IEd1aWxkUXVldWUgfSBmcm9tICcuL0d1aWxkUXVldWUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGEge1xuICBsYXRlbmN5OiB7XG4gICAgZXZlbnRMb29wOiBudW1iZXI7XG4gICAgdm9pY2VDb25uZWN0aW9uOiBudW1iZXI7XG4gIH07XG4gIHN0YXR1czoge1xuICAgIGJ1ZmZlcmluZzogYm9vbGVhbjtcbiAgICBwbGF5aW5nOiBib29sZWFuO1xuICAgIHBhdXNlZDogYm9vbGVhbjtcbiAgICBpZGxlOiBib29sZWFuO1xuICB9O1xuICB0cmFja3NDb3VudDogbnVtYmVyO1xuICBoaXN0b3J5U2l6ZTogbnVtYmVyO1xuICBleHRyYWN0b3JzOiBudW1iZXI7XG4gIGxpc3RlbmVyczogbnVtYmVyO1xuICBtZW1vcnlVc2FnZTogTm9kZUpTLk1lbW9yeVVzYWdlO1xuICB2ZXJzaW9uczoge1xuICAgIG5vZGU6IHN0cmluZztcbiAgICBwbGF5ZXI6IHN0cmluZztcbiAgfTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjbGFzcyBHdWlsZFF1ZXVlU3RhdGlzdGljczxNZXRhID0gYW55PiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcXVldWU6IEd1aWxkUXVldWU8TWV0YT4pIHt9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHN0YXRpc3RpY3Mgb2YgdGhpcyBxdWV1ZVxuICAgKi9cbiAgcHVibGljIGdlbmVyYXRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBsYXRlbmN5OiB7XG4gICAgICAgIGV2ZW50TG9vcDogdGhpcy5xdWV1ZS5wbGF5ZXIuZXZlbnRMb29wTGFnLFxuICAgICAgICB2b2ljZUNvbm5lY3Rpb246IHRoaXMucXVldWUucGluZ1xuICAgICAgfSxcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBidWZmZXJpbmc6IHRoaXMucXVldWUubm9kZS5pc0J1ZmZlcmluZygpLFxuICAgICAgICBwbGF5aW5nOiB0aGlzLnF1ZXVlLm5vZGUuaXNQbGF5aW5nKCksXG4gICAgICAgIHBhdXNlZDogdGhpcy5xdWV1ZS5ub2RlLmlzUGF1c2VkKCksXG4gICAgICAgIGlkbGU6IHRoaXMucXVldWUubm9kZS5pc0lkbGUoKVxuICAgICAgfSxcbiAgICAgIHRyYWNrc0NvdW50OiB0aGlzLnF1ZXVlLnRyYWNrcy5zaXplLFxuICAgICAgaGlzdG9yeVNpemU6IHRoaXMucXVldWUuaGlzdG9yeS50cmFja3Muc2l6ZSxcbiAgICAgIGV4dHJhY3RvcnM6IHRoaXMucXVldWUucGxheWVyLmV4dHJhY3RvcnMuc2l6ZSxcbiAgICAgIGxpc3RlbmVyczpcbiAgICAgIHRoaXMucXVldWUuZ3VpbGQubWVtYmVycy5tZT8udm9pY2UuY2hhbm5lbD8ubWVtYmVycy5maWx0ZXIoXG4gICAgICAgIChtKSA9PiAhbS51c2VyLmJvdFxuICAgICAgKS5zaXplIHx8IDAsXG4gICAgICBtZW1vcnlVc2FnZTogcHJvY2Vzcy5tZW1vcnlVc2FnZSgpLFxuICAgICAgdmVyc2lvbnM6IHtcbiAgICAgICAgbm9kZTogcHJvY2Vzcy52ZXJzaW9uLFxuICAgICAgICBwbGF5ZXI6IHRoaXMucXVldWUucGxheWVyLnZlcnNpb25cbiAgICAgIH1cbiAgICB9IGFzIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGE7XG4gIH1cbn0iLCAiaW1wb3J0IHsgTm90RXhpc3RpbmdFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBMcmNHZXRSZXN1bHQsIExyY1NlYXJjaFJlc3VsdCB9IGZyb20gJy4uL2xyY2xpYi9McmNMaWInO1xuaW1wb3J0IHR5cGUgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi9HdWlsZFF1ZXVlJztcblxuZXhwb3J0IHR5cGUgTHlyaWNzRGF0YSA9IE1hcDxudW1iZXIsIHN0cmluZz47XG5leHBvcnQgdHlwZSBVbnN1YnNjcmliZSA9ICgpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBMeXJpY3NDYWxsYmFjayA9IChseXJpY3M6IHN0cmluZywgdGltZXN0YW1wOiBudW1iZXIpID0+IHVua25vd247XG5leHBvcnQgdHlwZSBMeXJpY3NBdCA9IHt0aW1lc3RhbXA6IG51bWJlcjtsaW5lOiBzdHJpbmc7fTtcblxuY29uc3QgdGltZXN0YW1wUGF0dGVybiA9IC9cXFsoXFxkezJ9KTooXFxkezJ9KVxcLihcXGR7Mn0pXFxdLztcblxuZXhwb3J0IGNsYXNzIFN5bmNlZEx5cmljc1Byb3ZpZGVyIHtcbiAgI2xvb3A6IE5vZGVKUy5UaW1lb3V0IHwgbnVsbCA9IG51bGw7XG4gICNjYWxsYmFjazogTHlyaWNzQ2FsbGJhY2sgfCBudWxsID0gbnVsbDtcbiAgI29uVW5zdWJzY3JpYmU6IFVuc3Vic2NyaWJlIHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIGludGVydmFsID0gMTAwO1xuICBwdWJsaWMgcmVhZG9ubHkgbHlyaWNzOiBMeXJpY3NEYXRhID0gbmV3IE1hcCgpO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgcHVibGljIHJlYWRvbmx5IHF1ZXVlOiBHdWlsZFF1ZXVlLFxuICBwdWJsaWMgcmVhZG9ubHkgcmF3PzogTHJjR2V0UmVzdWx0IHwgTHJjU2VhcmNoUmVzdWx0KVxuICB7XG4gICAgaWYgKHJhdz8uc3luY2VkTHlyaWNzKSB0aGlzLmxvYWQocmF3Py5zeW5jZWRMeXJpY3MpO1xuICB9XG5cbiAgcHVibGljIGlzU3Vic2NyaWJlZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jY2FsbGJhY2sgIT09IG51bGw7XG4gIH1cblxuICBwdWJsaWMgbG9hZChseXJpY3M6IHN0cmluZykge1xuICAgIGlmICghbHlyaWNzKSB0aHJvdyBuZXcgTm90RXhpc3RpbmdFcnJvcignc3luY2VkTHlyaWNzJyk7XG5cbiAgICB0aGlzLmx5cmljcy5jbGVhcigpO1xuICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcblxuICAgIGNvbnN0IGxpbmVzID0gbHlyaWNzLnNwbGl0KCdcXG4nKTtcblxuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgY29uc3QgbWF0Y2ggPSBsaW5lLm1hdGNoKHRpbWVzdGFtcFBhdHRlcm4pO1xuXG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgY29uc3QgWywgbWludXRlcywgc2Vjb25kcywgbWlsbGlzZWNvbmRzXSA9IG1hdGNoO1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPVxuICAgICAgICBwYXJzZUludChtaW51dGVzKSAqIDYwICogMTAwMCArXG4gICAgICAgIHBhcnNlSW50KHNlY29uZHMpICogMTAwMCArXG4gICAgICAgIHBhcnNlSW50KG1pbGxpc2Vjb25kcyk7XG5cbiAgICAgICAgdGhpcy5seXJpY3Muc2V0KHRpbWVzdGFtcCwgbGluZS5yZXBsYWNlKHRpbWVzdGFtcFBhdHRlcm4sICcnKS50cmltKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBseXJpY3MgYXQgYSBzcGVjaWZpYyB0aW1lIG9yIGF0IHRoZSBjbG9zZXN0IHRpbWUgKFx1MDBCMTIgc2Vjb25kcylcbiAgICogQHBhcmFtIHRpbWUgVGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gICAqL1xuICBwdWJsaWMgYXQodGltZTogbnVtYmVyKTogTHlyaWNzQXQgfCBudWxsIHtcbiAgICBjb25zdCBsb3dlc3RUaW1lID0gdGhpcy5seXJpY3Mua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICBpZiAobG93ZXN0VGltZSA9PSBudWxsIHx8IHRpbWUgPCBsb3dlc3RUaW1lKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy5seXJpY3MuaGFzKHRpbWUpKVxuICAgIHJldHVybiB7IGxpbmU6IHRoaXMubHlyaWNzLmdldCh0aW1lKSBhcyBzdHJpbmcsIHRpbWVzdGFtcDogdGltZSB9O1xuXG4gICAgY29uc3Qga2V5cyA9IEFycmF5LmZyb20odGhpcy5seXJpY3Mua2V5cygpKTtcblxuICAgIGNvbnN0IGNsb3Nlc3QgPSBrZXlzLnJlZHVjZSgoYSwgYikgPT5cbiAgICBNYXRoLmFicyhiIC0gdGltZSkgPCBNYXRoLmFicyhhIC0gdGltZSkgPyBiIDogYVxuICAgICk7XG5cbiAgICBpZiAoY2xvc2VzdCA+IHRpbWUpIHJldHVybiBudWxsO1xuXG4gICAgaWYgKE1hdGguYWJzKGNsb3Nlc3QgLSB0aW1lKSA+IDIwMDApIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgbGluZSA9IHRoaXMubHlyaWNzLmdldChjbG9zZXN0KTtcblxuICAgIGlmICghbGluZSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4geyB0aW1lc3RhbXA6IGNsb3Nlc3QsIGxpbmUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmb3IgdGhlIGx5cmljcyBjaGFuZ2UuXG4gICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICovXG4gIHB1YmxpYyBvbkNoYW5nZShjYWxsYmFjazogTHlyaWNzQ2FsbGJhY2spIHtcbiAgICB0aGlzLiNjYWxsYmFjayA9IGNhbGxiYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHRvIGRldGVjdCB3aGVuIHRoZSBwcm92aWRlciBpcyB1bnN1YnNjcmliZWQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICovXG4gIHB1YmxpYyBvblVuc3Vic2NyaWJlKGNhbGxiYWNrOiBVbnN1YnNjcmliZSkge1xuICAgIHRoaXMuI29uVW5zdWJzY3JpYmUgPSBjYWxsYmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgZnJvbSB0aGUgcXVldWUuXG4gICAqL1xuICBwdWJsaWMgdW5zdWJzY3JpYmUoKSB7XG4gICAgaWYgKHRoaXMuI2xvb3ApIGNsZWFySW50ZXJ2YWwodGhpcy4jbG9vcCk7XG4gICAgaWYgKHRoaXMuI29uVW5zdWJzY3JpYmUpIHRoaXMuI29uVW5zdWJzY3JpYmUoKTtcblxuICAgIHRoaXMuI2NhbGxiYWNrID0gbnVsbDtcbiAgICB0aGlzLiNvblVuc3Vic2NyaWJlID0gbnVsbDtcbiAgICB0aGlzLiNsb29wID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIHRvIHRoZSBxdWV1ZSB0byBtb25pdG9yIHRoZSBjdXJyZW50IHRpbWUuXG4gICAqIEByZXR1cm5zIFRoZSB1bnN1YnNjcmliZSBmdW5jdGlvblxuICAgKi9cbiAgcHVibGljIHN1YnNjcmliZSgpOiBVbnN1YnNjcmliZSB7XG4gICAgaWYgKHRoaXMuI2xvb3ApIHJldHVybiAoKSA9PiB0aGlzLnVuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLiNjcmVhdGVMb29wKCk7XG5cbiAgICByZXR1cm4gKCkgPT4gdGhpcy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhdXNlcyB0aGUgbHlyaWNzIHByb3ZpZGVyLlxuICAgKi9cbiAgcHVibGljIHBhdXNlKCkge1xuICAgIGNvbnN0IGhhc0xvb3AgPSB0aGlzLiNsb29wICE9PSBudWxsO1xuXG4gICAgaWYgKGhhc0xvb3ApIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy4jbG9vcCEpO1xuICAgICAgdGhpcy4jbG9vcCA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhc0xvb3A7XG4gIH1cblxuICAvKipcbiAgICogUmVzdW1lcyB0aGUgbHlyaWNzIHByb3ZpZGVyLlxuICAgKi9cbiAgcHVibGljIHJlc3VtZSgpIHtcbiAgICBjb25zdCBoYXNMb29wID0gdGhpcy4jbG9vcCAhPT0gbnVsbDtcblxuICAgIGlmICghaGFzTG9vcCkgdGhpcy4jY3JlYXRlTG9vcCgpO1xuXG4gICAgcmV0dXJuICFoYXNMb29wO1xuICB9XG5cbiAgI2NyZWF0ZUxvb3AoKSB7XG4gICAgaWYgKCF0aGlzLiNjYWxsYmFjaykgcmV0dXJuO1xuICAgIGlmICh0aGlzLiNsb29wKSBjbGVhckludGVydmFsKHRoaXMuI2xvb3ApO1xuXG4gICAgbGV0IGxhc3RWYWx1ZTogTHlyaWNzQXQgfCBudWxsID0gbnVsbDtcblxuICAgIHRoaXMuI2xvb3AgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5kZWxldGVkKSByZXR1cm4gdGhpcy51bnN1YnNjcmliZSgpO1xuXG4gICAgICBpZiAoIXRoaXMuI2NhbGxiYWNrIHx8ICF0aGlzLnF1ZXVlLmlzUGxheWluZygpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRpbWUgPSB0aGlzLnF1ZXVlLm5vZGUuZ2V0VGltZXN0YW1wKCk7XG4gICAgICBpZiAoIXRpbWUpIHJldHVybjtcblxuICAgICAgY29uc3QgbHlyaWNzID0gdGhpcy5hdCh0aW1lLmN1cnJlbnQudmFsdWUpO1xuXG4gICAgICBpZiAoIWx5cmljcykgcmV0dXJuO1xuXG4gICAgICBpZiAoXG4gICAgICBsYXN0VmFsdWUgIT09IG51bGwgJiZcbiAgICAgIGx5cmljcy5saW5lID09PSBsYXN0VmFsdWUubGluZSAmJlxuICAgICAgbHlyaWNzLnRpbWVzdGFtcCA9PT0gbGFzdFZhbHVlLnRpbWVzdGFtcClcblxuICAgICAgcmV0dXJuO1xuXG4gICAgICBsYXN0VmFsdWUgPSBseXJpY3M7XG5cbiAgICAgIHRoaXMuI2NhbGxiYWNrKGx5cmljcy5saW5lLCBseXJpY3MudGltZXN0YW1wKTtcbiAgICB9LCB0aGlzLmludGVydmFsKS51bnJlZigpO1xuICB9XG59IiwgImltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICd0aW1lcnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgQXN5bmNRdWV1ZSB9IGZyb20gJy4vQXN5bmNRdWV1ZSc7XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RFbnRpdHkgPSAoKSA9PiBQcm9taXNlPFJlc3BvbnNlPjtcblxuZXhwb3J0IGNsYXNzIFNlcXVlbnRpYWxCdWNrZXQge1xuICBwdWJsaWMgbGltaXQgPSAxO1xuICBwdWJsaWMgcmVtYWluaW5nID0gMTtcbiAgcHVibGljIHJlc2V0QWZ0ZXIgPSAwO1xuICBwdWJsaWMgcXVldWUgPSBuZXcgQXN5bmNRdWV1ZSgpO1xuICBwdWJsaWMgTUFYX1JFVFJJRVMgPSA1O1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGJ1Y2tldCBpcyByYXRlIGxpbWl0ZWQuXG4gICAqL1xuICBwdWJsaWMgaXNSYXRlTGltaXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZW1haW5pbmcgPD0gMCAmJiBEYXRlLm5vdygpIDwgdGhpcy5yZXNldEFmdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEVucXVldWVzIGEgcmVxdWVzdC5cbiAgICogQHBhcmFtIHJlcSBUaGUgcmVxdWVzdCBmdW5jdGlvbiB0byBlbnF1ZXVlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW5xdWV1ZShyZXE6IFJlcXVlc3RFbnRpdHkpIHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMucXVldWUuYWNxdWlyZSgpO1xuICAgIGF3YWl0IGVudHJ5LmdldFRhc2soKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChyZXEpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBlbnRyeS5yZWxlYXNlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfcmVxdWVzdChyZXE6IFJlcXVlc3RFbnRpdHksIHJldHJpZXMgPSAwKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHdoaWxlICh0aGlzLmlzUmF0ZUxpbWl0ZWQoKSkge1xuICAgICAgY29uc3QgcmVzZXQgPSB0aGlzLnJlc2V0QWZ0ZXIgLSBEYXRlLm5vdygpO1xuICAgICAgYXdhaXQgc2V0VGltZW91dChyZXNldCk7XG4gICAgfVxuXG4gICAgbGV0IHBhc3MgPSBmYWxzZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCByZXEoKTtcblxuICAgICAgdGhpcy5fcGF0Y2hIZWFkZXJzKHJlcyk7XG5cbiAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MjkpIHtcbiAgICAgICAgY29uc3QgcmVzZXQgPSB0aGlzLnJlc2V0QWZ0ZXIgLSBEYXRlLm5vdygpO1xuICAgICAgICBhd2FpdCBzZXRUaW1lb3V0KHJlc2V0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QocmVxKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgbGV0IGVycjogRXJyb3I7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBib2R5OiB7XG4gICAgICAgICAgICBjb2RlOiBudW1iZXI7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgICAgICAgfSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihib2R5Lm1lc3NhZ2UpIGFzIEVycm9yICYge2NvZGU6IG51bWJlcjt9O1xuXG4gICAgICAgICAgZXJyb3IubmFtZSA9IGJvZHkubmFtZTtcbiAgICAgICAgICBlcnJvci5jb2RlID0gYm9keS5jb2RlO1xuXG4gICAgICAgICAgZXJyID0gZXJyb3I7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGVyciA9IG5ldyBFcnJvcihgSFRUUCBFcnJvcjogJHtyZXMuc3RhdHVzfSAke3Jlcy5zdGF0dXNUZXh0fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcGFzcyA9IHRydWU7XG5cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChwYXNzKSB0aHJvdyBlO1xuXG4gICAgICBjb25zdCBiYWRSZXEgPSBlIGluc3RhbmNlb2YgRXJyb3IgJiYgL0Vycm9yOiA0WzAtOV17Mn0vLnRlc3QoZS5tZXNzYWdlKTtcblxuICAgICAgaWYgKCFiYWRSZXEgJiYgcmV0cmllcyA8IHRoaXMuTUFYX1JFVFJJRVMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QocmVxLCArK3JldHJpZXMpO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3BhdGNoSGVhZGVycyhyZXM6IFJlc3BvbnNlKSB7XG4gICAgY29uc3QgbGltaXQgPSBOdW1iZXIocmVzLmhlYWRlcnMuZ2V0KCdYLVJhdGVMaW1pdC1MaW1pdCcpKTtcbiAgICBjb25zdCByZW1haW5pbmcgPSBOdW1iZXIocmVzLmhlYWRlcnMuZ2V0KCdYLVJhdGVMaW1pdC1SZW1haW5pbmcnKSk7XG4gICAgY29uc3QgcmVzZXRBZnRlciA9XG4gICAgTnVtYmVyKHJlcy5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtUmVzZXQnKSkgKiAxMDAwICsgRGF0ZS5ub3coKTtcblxuICAgIGlmICghTnVtYmVyLmlzTmFOKGxpbWl0KSkgdGhpcy5saW1pdCA9IGxpbWl0O1xuICAgIGlmICghTnVtYmVyLmlzTmFOKHJlbWFpbmluZykpIHRoaXMucmVtYWluaW5nID0gcmVtYWluaW5nO1xuICAgIGlmICghTnVtYmVyLmlzTmFOKHJlc2V0QWZ0ZXIpKSB0aGlzLnJlc2V0QWZ0ZXIgPSByZXNldEFmdGVyO1xuICB9XG59IiwgImltcG9ydCB7IEludmFsaWRBcmdUeXBlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHR5cGUgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uL3V0aWxzL1V0aWwnO1xuaW1wb3J0IHsgU2VxdWVudGlhbEJ1Y2tldCB9IGZyb20gJy4uL3V0aWxzL1NlcXVlbnRpYWxCdWNrZXQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIExyY1NlYXJjaFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcXVlcnkgdG8gc2VhcmNoIGZvci4gRWl0aGVyIHRoaXMgb3IgdHJhY2tOYW1lIGlzIHJlcXVpcmVkLlxuICAgKi9cbiAgcT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB0cmFjayBuYW1lIHRvIHNlYXJjaCBmb3IuIEVpdGhlciB0aGlzIG9yIHF1ZXJ5IGlzIHJlcXVpcmVkLlxuICAgKi9cbiAgdHJhY2tOYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGFydGlzdCBuYW1lXG4gICAqL1xuICBhcnRpc3ROYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGFsYnVtIG5hbWVcbiAgICovXG4gIGFsYnVtTmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMcmNHZXRQYXJhbXMgZXh0ZW5kcyBSZXF1aXJlZDxPbWl0PExyY1NlYXJjaFBhcmFtcywgJ3F1ZXJ5Jz4+IHtcbiAgLyoqXG4gICAqIFRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhY2tcbiAgICovXG4gIGR1cmF0aW9uOiBudW1iZXI7XG59XG5cbmNvbnN0IHRvU25ha2VDYXNlID0gKG9iajogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPT4ge1xuICBjb25zdCBzbmFrZU9iajogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgY29udGludWU7XG4gICAgY29uc3QgbmV3S2V5ID0ga2V5LnJlcGxhY2UoXG4gICAgICAvW0EtWl0vZyxcbiAgICAgIChsZXR0ZXIpID0+IGBfJHtsZXR0ZXIudG9Mb3dlckNhc2UoKX1gXG4gICAgKTtcbiAgICBzbmFrZU9ialtuZXdLZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gc25ha2VPYmo7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuY29uc3QgY3JlYXRlUXVlcnkgPSAocGFyYW1zOiBhbnkpID0+XG5uZXcgVVJMU2VhcmNoUGFyYW1zKHRvU25ha2VDYXNlKHBhcmFtcykpLnRvU3RyaW5nKCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTHJjU2VhcmNoUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSB0cmFjayBpZFxuICAgKi9cbiAgaWQ6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSB0cmFjayBuYW1lXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYXJ0aXN0IG5hbWVcbiAgICovXG4gIHRyYWNrTmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGFsYnVtIG5hbWVcbiAgICovXG4gIGFydGlzdE5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhbGJ1bSBuYW1lXG4gICAqL1xuICBhbGJ1bU5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhY2tcbiAgICovXG4gIGR1cmF0aW9uOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgcmVsZWFzZSBkYXRlIG9mIHRoZSB0cmFja1xuICAgKi9cbiAgaW5zdHJ1bWVudGFsOiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIHJlbGVhc2UgZGF0ZSBvZiB0aGUgdHJhY2tcbiAgICovXG4gIHBsYWluTHlyaWNzOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcmVsZWFzZSBkYXRlIG9mIHRoZSB0cmFja1xuICAgKi9cbiAgc3luY2VkTHlyaWNzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBMcmNHZXRSZXN1bHQgPSBPbWl0PExyY1NlYXJjaFJlc3VsdCwgJ25hbWUnPjtcblxuZXhwb3J0IGNsYXNzIExyY0xpYiB7XG4gIC8qKlxuICAgKiBUaGUgQVBJIFVSTFxuICAgKi9cbiAgcHVibGljIGFwaSA9ICdodHRwczovL2xyY2xpYi5uZXQvYXBpJztcbiAgLyoqXG4gICAqIFRoZSByZXF1ZXN0IHRpbWVvdXQuIERlZmF1bHQgaXMgMTUgc2Vjb25kcy5cbiAgICovXG4gIHB1YmxpYyB0aW1lb3V0ID0gMTVfMDAwO1xuICAvKipcbiAgICogVGhlIHJlcXVlc3QgYnVja2V0XG4gICAqL1xuICBwdWJsaWMgYnVja2V0ID0gbmV3IFNlcXVlbnRpYWxCdWNrZXQoKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBMcmNMaWIgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtQbGF5ZXJ9IHBsYXllciBUaGUgcGxheWVyIGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyKSB7fVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSByZXF1ZXN0IHRpbWVvdXRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWVvdXQgVGhlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzXG4gICAqL1xuICBwdWJsaWMgc2V0UmVxdWVzdFRpbWVvdXQodGltZW91dDogbnVtYmVyKSB7XG4gICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSByZXRyeSBsaW1pdC4gRGVmYXVsdCBpcyA1LlxuICAgKiBAcGFyYW0ge251bWJlcn0gbGltaXQgVGhlIHJldHJ5IGxpbWl0XG4gICAqL1xuICBwdWJsaWMgc2V0UmV0cnlMaW1pdChsaW1pdDogbnVtYmVyKSB7XG4gICAgdGhpcy5idWNrZXQuTUFYX1JFVFJJRVMgPSBsaW1pdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGx5cmljc1xuICAgKiBAcGFyYW0gcGFyYW1zIFRoZSBnZXQgcGFyYW1zXG4gICAqL1xuICBwdWJsaWMgZ2V0KHBhcmFtczogTHJjR2V0UGFyYW1zKSB7XG4gICAgY29uc3QgcGF0aCA9IGBnZXQ/JHtjcmVhdGVRdWVyeShwYXJhbXMpfWA7XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PExyY1NlYXJjaFJlc3VsdD4ocGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBseXJpY3MgYnkgSURcbiAgICogQHBhcmFtIGlkIFRoZSBseXJpY3MgSURcbiAgICovXG4gIHB1YmxpYyBnZXRCeUlkKGlkOiBgJHtudW1iZXJ9YCB8IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8THJjU2VhcmNoUmVzdWx0PihgZ2V0LyR7aWR9YCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBjYWNoZWQgbHlyaWNzXG4gICAqIEBwYXJhbSBwYXJhbXMgVGhlIGdldCBwYXJhbXNcbiAgICovXG4gIHB1YmxpYyBnZXRDYWNoZWQocGFyYW1zOiBMcmNHZXRQYXJhbXMpIHtcbiAgICBjb25zdCBwYXRoID0gYGdldC1jYWNoZWQ/JHtjcmVhdGVRdWVyeShwYXJhbXMpfWA7XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PExyY1NlYXJjaFJlc3VsdD4ocGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoZXMgZm9yIGx5cmljc1xuICAgKiBAcGFyYW0gcGFyYW1zIFRoZSBzZWFyY2ggcGFyYW1zXG4gICAqL1xuICBwdWJsaWMgc2VhcmNoKHBhcmFtczogTHJjU2VhcmNoUGFyYW1zKSB7XG4gICAgaWYgKCFwYXJhbXMucSAmJiAhcGFyYW1zLnRyYWNrTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmdUeXBlRXJyb3IoXG4gICAgICAgICdvbmUgb2YgcSBvciB0cmFja05hbWUnLFxuICAgICAgICAnc3RyaW5nJyxcbiAgICAgICAgW1N0cmluZyhwYXJhbXMucSksIFN0cmluZyhwYXJhbXMudHJhY2tOYW1lKV0uam9pbignLCAnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gYHNlYXJjaD8ke2NyZWF0ZVF1ZXJ5KHBhcmFtcyl9YDtcblxuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8THJjU2VhcmNoUmVzdWx0W10+KHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3RzIHRoZSBBUElcbiAgICogQHBhcmFtIHBhdGggVGhlIHBhdGhcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIHJlcXVlc3Qgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcXVlc3Q8VD4ocGF0aDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdEluaXQpOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBkaXNwYXRjaGVyID0gKCkgPT4ge1xuICAgICAgY29uc3QgeyBuYW1lLCB2ZXJzaW9uIH0gPSBVdGlsLmdldFJ1bnRpbWUoKTtcblxuICAgICAgY29uc3QgcnVudGltZVZlcnNpb24gPVxuICAgICAgbmFtZSA9PT0gJ3Vua25vd24nID8gdmVyc2lvbiA6IGAke25hbWV9LyR7dmVyc2lvbn1gO1xuXG4gICAgICBjb25zdCBpbml0OiBSZXF1ZXN0SW5pdCA9IHtcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgcmVkaXJlY3Q6ICdmb2xsb3cnLFxuICAgICAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQodGhpcy50aW1lb3V0KSxcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdVc2VyLUFnZW50JzogYERpc2NvcmQtUGxheWVyLyR7dGhpcy5wbGF5ZXIudmVyc2lvbn0gJHtcbiAgICAgICAgICBydW50aW1lVmVyc2lvbiA/PyAnJ31gLlxuICAgICAgICAgIHRyaW1FbmQoKSxcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgIC4uLm9wdGlvbnM/LmhlYWRlcnNcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdGhpcy5wbGF5ZXIuZGVidWcoYFtMcmNMaWJdIFJlcXVlc3RpbmcgJHtwYXRofWApO1xuXG4gICAgICByZXR1cm4gZmV0Y2goXG4gICAgICAgIGAke3RoaXMuYXBpfSR7cGF0aC5zdGFydHNXaXRoKCcvJykgPyBwYXRoIDogJy8nICsgcGF0aH1gLFxuICAgICAgICBpbml0XG4gICAgICApO1xuICAgIH07XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmJ1Y2tldC5lbnF1ZXVlKGRpc3BhdGNoZXIpO1xuXG4gICAgcmV0dXJuIHJlcy5qc29uKCk7XG4gIH1cbn0iLCAiaW1wb3J0IHsgVm9pY2VDaGFubmVsLCBTdGFnZUNoYW5uZWwsIFNub3dmbGFrZSB9IGZyb20gJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHtcbiAgRGlzY29yZEdhdGV3YXlBZGFwdGVyQ3JlYXRvcixcbiAgam9pblZvaWNlQ2hhbm5lbCxcbiAgVm9pY2VDb25uZWN0aW9uLFxuICBnZXRWb2ljZUNvbm5lY3Rpb24sXG4gIFZvaWNlQ29ubmVjdGlvblN0YXR1cyxcbiAgQXVkaW9QbGF5ZXIgfSBmcm9tXG4nZGlzY29yZC12b2lwJztcbmltcG9ydCB7IFN0cmVhbURpc3BhdGNoZXIgfSBmcm9tICcuL1N0cmVhbURpc3BhdGNoZXInO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJ0BkaXNjb3JkLXBsYXllci91dGlscyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi4vcXVldWUnO1xuaW1wb3J0IHR5cGUgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgTm9HdWlsZFF1ZXVlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5jbGFzcyBWb2ljZVV0aWxzIHtcbiAgLyoqXG4gICAqIFZvaWNlIGNvbm5lY3Rpb24gY2FjaGUgdG8gc3RvcmUgdm9pY2UgY29ubmVjdGlvbnMgb2YgdGhlIFBsYXllciBjb21wb25lbnRzLlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLlxuICAgKiBJdCBvbmx5IGV4aXN0cyBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgcHVibGljIGNhY2hlOiBDb2xsZWN0aW9uPFNub3dmbGFrZSwgU3RyZWFtRGlzcGF0Y2hlcj4gPSBuZXcgQ29sbGVjdGlvbjxcbiAgICBTbm93Zmxha2UsXG4gICAgU3RyZWFtRGlzcGF0Y2hlcj4oXG4gICk7XG5cbiAgLyoqXG4gICAqIFRoZSB2b2ljZSB1dGlscyBjb25zdHJ1Y3RvclxuICAgKi9cbiAgY29uc3RydWN0b3IocHVibGljIHBsYXllcjogUGxheWVyKSB7fVxuXG4gIC8qKlxuICAgKiBKb2lucyBhIHZvaWNlIGNoYW5uZWwsIGNyZWF0aW5nIGJhc2ljIHN0cmVhbSBkaXNwYXRjaCBtYW5hZ2VyXG4gICAqIEBwYXJhbSB7U3RhZ2VDaGFubmVsfFZvaWNlQ2hhbm5lbH0gY2hhbm5lbCBUaGUgdm9pY2UgY2hhbm5lbFxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIEpvaW4gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTdHJlYW1EaXNwYXRjaGVyPn1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjb25uZWN0KFxuICBjaGFubmVsOiBWb2ljZUNoYW5uZWwgfCBTdGFnZUNoYW5uZWwsXG4gIG9wdGlvbnM/OiB7XG4gICAgZGVhZj86IGJvb2xlYW47XG4gICAgbWF4VGltZT86IG51bWJlcjtcbiAgICBxdWV1ZTogR3VpbGRRdWV1ZTtcbiAgICBhdWRpb1BsYXllcj86IEF1ZGlvUGxheWVyO1xuICAgIGdyb3VwPzogc3RyaW5nO1xuICB9KVxuICA6IFByb21pc2U8U3RyZWFtRGlzcGF0Y2hlcj4ge1xuICAgIGlmICghb3B0aW9ucz8ucXVldWUpIHRocm93IG5ldyBOb0d1aWxkUXVldWVFcnJvcigpO1xuICAgIGNvbnN0IGNvbm4gPSBhd2FpdCB0aGlzLmpvaW4oY2hhbm5lbCwgb3B0aW9ucyk7XG4gICAgY29uc3Qgc3ViID0gbmV3IFN0cmVhbURpc3BhdGNoZXIoXG4gICAgICBjb25uLFxuICAgICAgY2hhbm5lbCxcbiAgICAgIG9wdGlvbnMucXVldWUsXG4gICAgICBvcHRpb25zLm1heFRpbWUsXG4gICAgICBvcHRpb25zLmF1ZGlvUGxheWVyXG4gICAgKTtcbiAgICByZXR1cm4gc3ViO1xuICB9XG5cbiAgLyoqXG4gICAqIEpvaW5zIGEgdm9pY2UgY2hhbm5lbFxuICAgKiBAcGFyYW0ge1N0YWdlQ2hhbm5lbHxWb2ljZUNoYW5uZWx9IFtjaGFubmVsXSBUaGUgdm9pY2Uvc3RhZ2UgY2hhbm5lbCB0byBqb2luXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gSm9pbiBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtWb2ljZUNvbm5lY3Rpb259XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgam9pbihcbiAgY2hhbm5lbDogVm9pY2VDaGFubmVsIHwgU3RhZ2VDaGFubmVsLFxuICBvcHRpb25zPzoge1xuICAgIGRlYWY/OiBib29sZWFuO1xuICAgIG1heFRpbWU/OiBudW1iZXI7XG4gICAgZ3JvdXA/OiBzdHJpbmc7XG4gIH0pXG4gIHtcbiAgICBjb25zdCBleGlzdGluZ0Nvbm5lY3Rpb24gPSB0aGlzLmdldENvbm5lY3Rpb24oXG4gICAgICBjaGFubmVsLmd1aWxkLmlkLFxuICAgICAgb3B0aW9ucz8uZ3JvdXBcbiAgICApO1xuXG4gICAgaWYgKFxuICAgIGV4aXN0aW5nQ29ubmVjdGlvbj8uam9pbkNvbmZpZy5jaGFubmVsSWQgPT09IGNoYW5uZWw/LmlkICYmXG4gICAgZXhpc3RpbmdDb25uZWN0aW9uLnN0YXRlLnN0YXR1cyAhPT0gVm9pY2VDb25uZWN0aW9uU3RhdHVzLkRlc3Ryb3llZClcbiAgICB7XG4gICAgICByZXR1cm4gZXhpc3RpbmdDb25uZWN0aW9uO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbm4gPSBqb2luVm9pY2VDaGFubmVsKHtcbiAgICAgIGd1aWxkSWQ6IGNoYW5uZWwuZ3VpbGQuaWQsXG4gICAgICBjaGFubmVsSWQ6IGNoYW5uZWwuaWQsXG4gICAgICBhZGFwdGVyQ3JlYXRvcjogY2hhbm5lbC5ndWlsZC5cbiAgICAgIHZvaWNlQWRhcHRlckNyZWF0b3IgYXMgdW5rbm93biBhcyBEaXNjb3JkR2F0ZXdheUFkYXB0ZXJDcmVhdG9yLFxuICAgICAgc2VsZkRlYWY6IEJvb2xlYW4ob3B0aW9ucz8uZGVhZiksXG4gICAgICBkZWJ1ZzogdGhpcy5wbGF5ZXIuZXZlbnRzLmxpc3RlbmVyQ291bnQoJ2RlYnVnJykgPiAwLFxuICAgICAgZ3JvdXA6IG9wdGlvbnM/Lmdyb3VwXG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29ubjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb25uZWN0cyB2b2ljZSBjb25uZWN0aW9uXG4gICAqIEBwYXJhbSB7Vm9pY2VDb25uZWN0aW9ufSBjb25uZWN0aW9uIFRoZSB2b2ljZSBjb25uZWN0aW9uXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcHVibGljIGRpc2Nvbm5lY3QoY29ubmVjdGlvbjogVm9pY2VDb25uZWN0aW9uIHwgU3RyZWFtRGlzcGF0Y2hlcikge1xuICAgIGlmIChjb25uZWN0aW9uIGluc3RhbmNlb2YgU3RyZWFtRGlzcGF0Y2hlcilcbiAgICBjb25uZWN0aW9uID0gY29ubmVjdGlvbi52b2ljZUNvbm5lY3Rpb247XG5cbiAgICB0cnkge1xuICAgICAgaWYgKGNvbm5lY3Rpb24uc3RhdGUuc3RhdHVzICE9PSBWb2ljZUNvbm5lY3Rpb25TdGF0dXMuRGVzdHJveWVkKVxuICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uZGVzdHJveSgpO1xuICAgIH0gY2F0Y2gge1xuXG4gICAgICAvL1xuICAgIH19XG5cbiAgLyoqXG4gICAqIFJldHVybnMgRGlzY29yZCBQbGF5ZXIgdm9pY2UgY29ubmVjdGlvblxuICAgKiBAcGFyYW0ge1Nub3dmbGFrZX0gZ3VpbGQgVGhlIGd1aWxkIGlkXG4gICAqIEByZXR1cm5zIHtTdHJlYW1EaXNwYXRjaGVyfVxuICAgKi9cbiAgcHVibGljIGdldENvbm5lY3Rpb24oZ3VpbGQ6IFNub3dmbGFrZSwgZ3JvdXA/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZ2V0Vm9pY2VDb25uZWN0aW9uKGd1aWxkLCBncm91cCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgVm9pY2VVdGlscyB9OyIsICJpbXBvcnQgeyBQbGF5ZXIgfSBmcm9tICcuLi9QbGF5ZXInO1xuaW1wb3J0IHsgU2VhcmNoUmVzdWx0IH0gZnJvbSAnLi4vZmFicmljL1NlYXJjaFJlc3VsdCc7XG5pbXBvcnQgeyBUcmFjayB9IGZyb20gJy4uL2ZhYnJpYy9UcmFjayc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBTZWFyY2hRdWVyeVR5cGUgfSBmcm9tICcuL1F1ZXJ5UmVzb2x2ZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2FjaGVPcHRpb25zIHtcbiAgY2hlY2tJbnRlcnZhbD86IG51bWJlcjtcbn1cblxuLy8gNWhcbmNvbnN0IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQgPSAxOF8wMDBfMDAwO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2FjaGVQcm92aWRlcjxUPiB7XG4gIGdldERhdGEoKTogUHJvbWlzZTxEaXNjb3JkUGxheWVyUXVlcnlSZXN1bHRDYWNoZTxUPltdPjtcbiAgYWRkRGF0YShkYXRhOiBTZWFyY2hSZXN1bHQpOiBQcm9taXNlPHZvaWQ+O1xuICByZXNvbHZlKGNvbnRleHQ6IFF1ZXJ5Q2FjaGVSZXNvbHZlckNvbnRleHQpOiBQcm9taXNlPFNlYXJjaFJlc3VsdD47XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVyeUNhY2hlIGltcGxlbWVudHMgUXVlcnlDYWNoZVByb3ZpZGVyPFRyYWNrPiB7XG4gICNkZWZhdWx0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgRGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGU8VHJhY2s+PigpO1xuICBwdWJsaWMgdGltZXI6IE5vZGVKUy5UaW1lcjtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICBwdWJsaWMgcGxheWVyOiBQbGF5ZXIsXG4gIHB1YmxpYyBvcHRpb25zOiBRdWVyeUNhY2hlT3B0aW9ucyA9IHtcbiAgICBjaGVja0ludGVydmFsOiBERUZBVUxUX0VYUElSWV9USU1FT1VUXG4gIH0pXG4gIHtcbiAgICB0aGlzLnRpbWVyID0gc2V0SW50ZXJ2YWwoXG4gICAgICB0aGlzLmNsZWFudXAuYmluZCh0aGlzKSxcbiAgICAgIHRoaXMuY2hlY2tJbnRlcnZhbFxuICAgICkudW5yZWYoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY2hlY2tJbnRlcnZhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNoZWNrSW50ZXJ2YWwgPz8gREVGQVVMVF9FWFBJUllfVElNRU9VVDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjbGVhbnVwKCkge1xuICAgIGZvciAoY29uc3QgW2lkLCB2YWx1ZV0gb2YgdGhpcy4jZGVmYXVsdENhY2hlKSB7XG4gICAgICBpZiAodmFsdWUuaGFzRXhwaXJlZCgpKSB7XG4gICAgICAgIHRoaXMuI2RlZmF1bHRDYWNoZS5kZWxldGUoaWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjbGVhcigpIHtcbiAgICB0aGlzLiNkZWZhdWx0Q2FjaGUuY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXREYXRhKCkge1xuICAgIHJldHVybiBbLi4udGhpcy4jZGVmYXVsdENhY2hlLnZhbHVlcygpXTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhZGREYXRhKGRhdGE6IFNlYXJjaFJlc3VsdCkge1xuICAgIGRhdGEudHJhY2tzLmZvckVhY2goKGQpID0+IHtcbiAgICAgIGlmICh0aGlzLiNkZWZhdWx0Q2FjaGUuaGFzKGQudXJsKSkgcmV0dXJuO1xuICAgICAgdGhpcy4jZGVmYXVsdENhY2hlLnNldChkLnVybCwgbmV3IERpc2NvcmRQbGF5ZXJRdWVyeVJlc3VsdENhY2hlKGQpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZXNvbHZlKGNvbnRleHQ6IFF1ZXJ5Q2FjaGVSZXNvbHZlckNvbnRleHQpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLiNkZWZhdWx0Q2FjaGUuZ2V0KGNvbnRleHQucXVlcnkpO1xuICAgIGlmICghcmVzdWx0KVxuICAgIHJldHVybiBuZXcgU2VhcmNoUmVzdWx0KHRoaXMucGxheWVyLCB7XG4gICAgICBxdWVyeTogY29udGV4dC5xdWVyeSxcbiAgICAgIHJlcXVlc3RlZEJ5OiBjb250ZXh0LnJlcXVlc3RlZEJ5LFxuICAgICAgcXVlcnlUeXBlOiBjb250ZXh0LnF1ZXJ5VHlwZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcy5wbGF5ZXIsIHtcbiAgICAgIHF1ZXJ5OiBjb250ZXh0LnF1ZXJ5LFxuICAgICAgdHJhY2tzOiBbcmVzdWx0LmRhdGFdLFxuICAgICAgcGxheWxpc3Q6IG51bGwsXG4gICAgICBxdWVyeVR5cGU6IGNvbnRleHQucXVlcnlUeXBlLFxuICAgICAgcmVxdWVzdGVkQnk6IGNvbnRleHQucmVxdWVzdGVkQnlcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGlzY29yZFBsYXllclF1ZXJ5UmVzdWx0Q2FjaGU8VCA9IHVua25vd24+IHtcbiAgcHVibGljIGV4cGlyZUFmdGVyID0gREVGQVVMVF9FWFBJUllfVElNRU9VVDtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICBwdWJsaWMgZGF0YTogVCxcbiAgZXhwaXJlQWZ0ZXI6IG51bWJlciA9IERFRkFVTFRfRVhQSVJZX1RJTUVPVVQpXG4gIHtcbiAgICBpZiAodHlwZW9mIGV4cGlyZUFmdGVyID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5leHBpcmVBZnRlciA9IERhdGUubm93KCkgKyBleHBpcmVBZnRlcjtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFzRXhwaXJlZCgpIHtcbiAgICBpZiAoXG4gICAgdHlwZW9mIHRoaXMuZXhwaXJlQWZ0ZXIgIT09ICdudW1iZXInIHx8XG4gICAgaXNOYU4odGhpcy5leHBpcmVBZnRlcikgfHxcbiAgICB0aGlzLmV4cGlyZUFmdGVyIDwgMSlcblxuICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gRGF0ZS5ub3coKSA8PSB0aGlzLmV4cGlyZUFmdGVyO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlDYWNoZVJlc29sdmVyQ29udGV4dCB7XG4gIHF1ZXJ5OiBzdHJpbmc7XG4gIHJlcXVlc3RlZEJ5PzogVXNlcjtcbiAgcXVlcnlUeXBlPzogU2VhcmNoUXVlcnlUeXBlIHwgYGV4dDoke3N0cmluZ31gO1xufSIsICJpbXBvcnQgeyBGRm1wZWcgfSBmcm9tICdAZGlzY29yZC1wbGF5ZXIvZmZtcGVnJztcbmltcG9ydCB7XG4gIENsaWVudCxcbiAgU25vd2ZsYWtlVXRpbCxcbiAgVm9pY2VTdGF0ZSxcbiAgSW50ZW50c0JpdEZpZWxkLFxuICBVc2VyLFxuICBHdWlsZFZvaWNlQ2hhbm5lbFJlc29sdmFibGUsXG4gIHZlcnNpb24gYXMgZGpzVmVyc2lvbixcbiAgRXZlbnRzIH0gZnJvbVxuJ2Rpc2NvcmQuanMnO1xuaW1wb3J0IHtcbiAgUGxheWxpc3QsXG4gIFRyYWNrLFxuICBTZWFyY2hSZXN1bHQsXG4gIFNlYXJjaE9wdGlvbnMsXG4gIFBsYXlsaXN0SW5pdERhdGEgfSBmcm9tXG4nLi9mYWJyaWMnO1xuaW1wb3J0IHtcbiAgR3VpbGRRdWV1ZUV2ZW50cyxcbiAgVm9pY2VDb25uZWN0Q29uZmlnLFxuICBHdWlsZE5vZGVDcmVhdGVPcHRpb25zLFxuICBHdWlsZE5vZGVNYW5hZ2VyLFxuICBHdWlsZFF1ZXVlLFxuICBSZXNvdXJjZVBsYXlPcHRpb25zLFxuICBHdWlsZFF1ZXVlRXZlbnQgfSBmcm9tXG4nLi9xdWV1ZSc7XG5pbXBvcnQgeyBWb2ljZVV0aWxzIH0gZnJvbSAnLi9zdHJlYW0vVm9pY2VVdGlscyc7XG5pbXBvcnQge1xuICBRdWVyeVJlc29sdmVyLFxuICBRdWVyeVR5cGUsXG4gIFJlc29sdmVkUXVlcnksXG4gIFNlYXJjaFF1ZXJ5VHlwZSB9IGZyb21cbicuL3V0aWxzL1F1ZXJ5UmVzb2x2ZXInO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4vdXRpbHMvVXRpbCc7XG5pbXBvcnQge1xuICBBdWRpb1Jlc291cmNlLFxuICB2ZXJzaW9uIGFzIGRWb2ljZVZlcnNpb24sXG4gIFN0cmVhbVR5cGUgfSBmcm9tXG4nZGlzY29yZC12b2lwJztcbmltcG9ydCB7IEV4dHJhY3RvckV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tICcuL2V4dHJhY3RvcnMvRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCc7XG5pbXBvcnQgeyBCYXNlRXh0cmFjdG9yIH0gZnJvbSAnLi9leHRyYWN0b3JzL0Jhc2VFeHRyYWN0b3InO1xuaW1wb3J0IHsgUXVlcnlDYWNoZSwgUXVlcnlDYWNoZVByb3ZpZGVyIH0gZnJvbSAnLi91dGlscy9RdWVyeUNhY2hlJztcbmltcG9ydCB7IFBsYXllckV2ZW50c0VtaXR0ZXIgfSBmcm9tICcuL3V0aWxzL1BsYXllckV2ZW50c0VtaXR0ZXInO1xuaW1wb3J0IHsgSW52YWxpZEFyZ1R5cGVFcnJvciwgTm9SZXN1bHRFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IGRlZmF1bHRWb2ljZVN0YXRlSGFuZGxlciB9IGZyb20gJy4vRGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyJztcbmltcG9ydCB7IENvbnRleHQsIGNyZWF0ZUNvbnRleHQgfSBmcm9tICcuL2hvb2tzJztcbmltcG9ydCB7IEhvb2tzQ3R4LCBTVVBFUl9DT05URVhUIH0gZnJvbSAnLi9ob29rcy9jb21tb24nO1xuaW1wb3J0IHsgTHJjTGliIH0gZnJvbSAnLi9scmNsaWIvTHJjTGliJztcbmltcG9ydCB7IGdldENvbXBhdE5hbWUsIGlzQ2xpZW50UHJveHkgfSBmcm9tICcuL2NvbXBhdC9jb21tb24nO1xuaW1wb3J0IHsgRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvciB9IGZyb20gJy4vdXRpbHMvRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvcic7XG5pbXBvcnQgeyBnZXRHbG9iYWxSZWdpc3RyeSB9IGZyb20gJy4vdXRpbHMvX19pbnRlcm5hbF9fJztcbmltcG9ydCB7IHZlcnNpb24gYXMgZHBWZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uJztcbmltcG9ydCB7XG4gIFBsYXllclN0cmVhbUludGVyY2VwdG9yLFxuICB0eXBlIFBsYXllclN0cmVhbUludGVyY2VwdG9yT3B0aW9ucyB9IGZyb21cbicuL1BsYXllclN0cmVhbUludGVyY2VwdG9yJztcbmltcG9ydCB0eXBlIHsgSW50ZXJjZXB0ZWRTdHJlYW0gfSBmcm9tICcuL3N0cmVhbS9JbnRlcmNlcHRlZFN0cmVhbSc7XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyRXZlbnRzIHtcbiAgZGVidWc6IChtZXNzYWdlOiBzdHJpbmcpID0+IGFueTtcbiAgZXJyb3I6IChlcnJvcjogRXJyb3IpID0+IGFueTtcbiAgdm9pY2VTdGF0ZVVwZGF0ZTogKFxuICBxdWV1ZTogR3VpbGRRdWV1ZSxcbiAgb2xkU3RhdGU6IFZvaWNlU3RhdGUsXG4gIG5ld1N0YXRlOiBWb2ljZVN0YXRlKVxuICA9PiBhbnk7XG59XG5cbmV4cG9ydCBjb25zdCBQbGF5ZXJFdmVudCA9IHtcbiAgZGVidWc6ICdkZWJ1ZycsXG4gIERlYnVnOiAnZGVidWcnLFxuICBlcnJvcjogJ2Vycm9yJyxcbiAgRXJyb3I6ICdlcnJvcicsXG4gIHZvaWNlU3RhdGVVcGRhdGU6ICd2b2ljZVN0YXRlVXBkYXRlJyxcbiAgVm9pY2VTdGF0ZVVwZGF0ZTogJ3ZvaWNlU3RhdGVVcGRhdGUnXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgUGxheWVyRXZlbnQgPSAodHlwZW9mIFBsYXllckV2ZW50KVtrZXlvZiB0eXBlb2YgUGxheWVyRXZlbnRdO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllck5vZGVJbml0aWFsaXphdGlvblJlc3VsdDxUID0gYW55PiB7XG4gIHRyYWNrOiBUcmFjaztcbiAgZXh0cmFjdG9yOiBCYXNlRXh0cmFjdG9yIHwgbnVsbDtcbiAgc2VhcmNoUmVzdWx0OiBTZWFyY2hSZXN1bHQ7XG4gIHF1ZXVlOiBHdWlsZFF1ZXVlPFQ+O1xufVxuXG4vKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cblxuZXhwb3J0IHR5cGUgVHJhY2tMaWtlID1cbnN0cmluZyB8XG5UcmFjayB8XG5TZWFyY2hSZXN1bHQgfFxuVHJhY2tbXSB8XG5QbGF5bGlzdCB8XG5BdWRpb1Jlc291cmNlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXllck5vZGVJbml0aWFsaXplck9wdGlvbnM8VD4gZXh0ZW5kcyBTZWFyY2hPcHRpb25zIHtcbiAgbm9kZU9wdGlvbnM/OiBHdWlsZE5vZGVDcmVhdGVPcHRpb25zPFQ+O1xuICBjb25uZWN0aW9uT3B0aW9ucz86IFZvaWNlQ29ubmVjdENvbmZpZztcbiAgYXVkaW9QbGF5ZXJPcHRpb25zPzogUmVzb3VyY2VQbGF5T3B0aW9ucztcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIGFmdGVyU2VhcmNoPzogKHJlc3VsdDogU2VhcmNoUmVzdWx0KSA9PiBQcm9taXNlPFNlYXJjaFJlc3VsdD47XG59XG5cbmV4cG9ydCB0eXBlIFZvaWNlU3RhdGVIYW5kbGVyID0gKFxucGxheWVyOiBQbGF5ZXIsXG5xdWV1ZTogR3VpbGRRdWV1ZSxcbm9sZFZvaWNlU3RhdGU6IFZvaWNlU3RhdGUsXG5uZXdWb2ljZVN0YXRlOiBWb2ljZVN0YXRlKVxuPT4gQXdhaXRlZDx2b2lkPjtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF5ZXJJbml0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgdm9pY2UgY29ubmVjdGlvbiB0aW1lb3V0XG4gICAqL1xuICBjb25uZWN0aW9uVGltZW91dD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRpbWUgaW4gbXMgdG8gcmUtbW9uaXRvciBldmVudCBsb29wIGxhZ1xuICAgKi9cbiAgbGFnTW9uaXRvcj86IG51bWJlcjtcbiAgLyoqXG4gICAqIFByZXZlbnQgdm9pY2Ugc3RhdGUgaGFuZGxlciBmcm9tIGJlaW5nIG92ZXJyaWRkZW5cbiAgICovXG4gIGxvY2tWb2ljZVN0YXRlSGFuZGxlcj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBMaXN0IG9mIGV4dHJhY3RvcnMgdG8gZGlzYWJsZSBxdWVyeWluZyBtZXRhZGF0YSBmcm9tXG4gICAqL1xuICBibG9ja0V4dHJhY3RvcnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIExpc3Qgb2YgZXh0cmFjdG9ycyB0byBkaXNhYmxlIHN0cmVhbWluZyBmcm9tXG4gICAqL1xuICBibG9ja1N0cmVhbUZyb20/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFF1ZXJ5IGNhY2hlIHByb3ZpZGVyXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBxdWVyeUNhY2hlPzogUXVlcnlDYWNoZVByb3ZpZGVyPGFueT4gfCBudWxsO1xuICAvKipcbiAgICogU2tpcCBmZm1wZWcgcHJvY2VzcyB3aGVuIHBvc3NpYmxlXG4gICAqL1xuICBza2lwRkZtcGVnPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBwcm9iZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgdG8gNTAwMC5cbiAgICovXG4gIHByb2JlVGltZW91dD86IG51bWJlcjtcbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBmZm1wZWcgcGF0aFxuICAgKi9cbiAgZmZtcGVnUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gb3ZlcnJpZGUgdGhlIGZhbGxiYWNrIGNvbnRleHQuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIG92ZXJyaWRlRmFsbGJhY2tDb250ZXh0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFBsYXllciBleHRlbmRzIFBsYXllckV2ZW50c0VtaXR0ZXI8UGxheWVyRXZlbnRzPiB7XG4gICNsYXN0TGF0ZW5jeSA9IC0xO1xuICAjdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyID0gdGhpcy5oYW5kbGVWb2ljZVN0YXRlLmJpbmQodGhpcyk7XG4gICNsYWdNb25pdG9yVGltZW91dDogTm9kZUpTLlRpbWVvdXQ7XG4gICNsYWdNb25pdG9ySW50ZXJ2YWw6IE5vZGVKUy5UaW1lb3V0O1xuICAjb25Wb2ljZVN0YXRlVXBkYXRlOiBWb2ljZVN0YXRlSGFuZGxlciA9IGRlZmF1bHRWb2ljZVN0YXRlSGFuZGxlcjtcbiAgI2hvb2tzQ3R4OiBDb250ZXh0PEhvb2tzQ3R4PiB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgZGlzY29yZC1wbGF5ZXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nID0gZHBWZXJzaW9uO1xuICAvKipcbiAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoaXMgcGxheWVyIGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWQgPSBTbm93Zmxha2VVdGlsLmdlbmVyYXRlKCkudG9TdHJpbmcoKTtcbiAgLyoqXG4gICAqIFRoZSBkaXNjb3JkLmpzIGNsaWVudFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudCE6IENsaWVudDtcbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnMhOiBQbGF5ZXJJbml0T3B0aW9ucztcbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgbm9kZXMgKHF1ZXVlKSBtYW5hZ2VyXG4gICAqL1xuICBwdWJsaWMgbm9kZXMgPSBuZXcgR3VpbGROb2RlTWFuYWdlcih0aGlzKTtcbiAgLyoqXG4gICAqIFRoZSB2b2ljZSBhcGkgdXRpbGl0aWVzXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdm9pY2VVdGlscyA9IG5ldyBWb2ljZVV0aWxzKHRoaXMpO1xuICAvKipcbiAgICogVGhlIGV4dHJhY3RvcnMgbWFuYWdlclxuICAgKi9cbiAgcHVibGljIGV4dHJhY3RvcnMgPSBuZXcgRXh0cmFjdG9yRXhlY3V0aW9uQ29udGV4dCh0aGlzKTtcbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIgZXZlbnRzIGNoYW5uZWxcbiAgICovXG4gIHB1YmxpYyBldmVudHMgPSBuZXcgUGxheWVyRXZlbnRzRW1pdHRlcjxHdWlsZFF1ZXVlRXZlbnRzPihbXG4gIEd1aWxkUXVldWVFdmVudC5FcnJvcixcbiAgR3VpbGRRdWV1ZUV2ZW50LlBsYXllckVycm9yXVxuICApO1xuICAvKipcbiAgICogVGhlIHBsYXllciB2ZXJzaW9uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbiA9IFBsYXllci52ZXJzaW9uO1xuICAvKipcbiAgICogVGhlIGx5cmljcyBhcGlcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBseXJpY3MgPSBuZXcgTHJjTGliKHRoaXMpO1xuXG4gICNzdHJlYW1JbnRlcmNlcHRvcjogUGxheWVyU3RyZWFtSW50ZXJjZXB0b3IgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBuZXcgRGlzY29yZCBQbGF5ZXJcbiAgICogQHBhcmFtIHtDbGllbnR9IGNsaWVudCBUaGUgRGlzY29yZCBDbGllbnRcbiAgICogQHBhcmFtIHtQbGF5ZXJJbml0T3B0aW9uc30gW29wdGlvbnNdIFRoZSBwbGF5ZXIgaW5pdCBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQsIG9wdGlvbnM6IFBsYXllckluaXRPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihbUGxheWVyRXZlbnQuRXJyb3JdKTtcblxuICAgIGlmIChvcHRpb25zLmZmbXBlZ1BhdGgpIHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5mZm1wZWdQYXRoICE9PSAnc3RyaW5nJylcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIGBFeHBlY3RlZCB0eXBlIFwic3RyaW5nXCIgZm9yIG9wdGlvbnMuZmZtcGVnUGF0aC4gR290ICR7dHlwZW9mIG9wdGlvbnMuZmZtcGVnUGF0aH0gaW5zdGVhZGBcbiAgICAgICk7XG5cbiAgICAgIHByb2Nlc3MuZW52LkZGTVBFR19QQVRIID0gb3B0aW9ucy5mZm1wZWdQYXRoO1xuICAgIH1cblxuICAgIGNvbnN0IGlzQ29tcGF0TW9kZSA9IGlzQ2xpZW50UHJveHkoY2xpZW50KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkaXNjb3JkIGNsaWVudFxuICAgICAqIEB0eXBlIHtDbGllbnR9XG4gICAgICovXG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG5cbiAgICBpZiAoIWlzQ29tcGF0TW9kZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCEoY2xpZW50IGluc3RhbmNlb2YgQ2xpZW50KSkge1xuICAgICAgICAgIFV0aWwud2FybihcbiAgICAgICAgICAgIGBDbGllbnQgaXMgbm90IGFuIGluc3RhbmNlIG9mIGRpc2NvcmQuanNAJHtkanNWZXJzaW9ufSBjbGllbnQsIHNvbWUgdGhpbmdzIG1heSBub3Qgd29yayBjb3JyZWN0bHkuIFRoaXMgY2FuIGhhcHBlbiBkdWUgdG8gY29ycnVwdCBkZXBlbmRlbmNpZXMgb3IgaGF2aW5nIG11bHRpcGxlIGluc3RhbGxhdGlvbnMgb2YgZGlzY29yZC5qcy5gLFxuICAgICAgICAgICAgJ0ludmFsaWRDbGllbnRJbnN0YW5jZSdcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWJmID1cbiAgICAgICAgdGhpcy5jbGllbnQub3B0aW9ucy5pbnRlbnRzIGluc3RhbmNlb2YgSW50ZW50c0JpdEZpZWxkID9cbiAgICAgICAgdGhpcy5jbGllbnQub3B0aW9ucy5pbnRlbnRzIDpcbiAgICAgICAgbmV3IEludGVudHNCaXRGaWVsZCh0aGlzLmNsaWVudC5vcHRpb25zLmludGVudHMpO1xuXG4gICAgICAgIGlmICghaWJmLmhhcyhJbnRlbnRzQml0RmllbGQuRmxhZ3MuR3VpbGRWb2ljZVN0YXRlcykpIHtcbiAgICAgICAgICBVdGlsLndhcm4oXG4gICAgICAgICAgICAnY2xpZW50IGlzIG1pc3NpbmcgXCJHdWlsZFZvaWNlU3RhdGVzXCIgaW50ZW50JyxcbiAgICAgICAgICAgICdJbnZhbGlkSW50ZW50c0JpdEZpZWxkJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuXG4gICAgICAgIC8vIG5vb3BcbiAgICAgIH19XG5cbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBsb2NrVm9pY2VTdGF0ZUhhbmRsZXI6IGZhbHNlLFxuICAgICAgYmxvY2tFeHRyYWN0b3JzOiBbXSxcbiAgICAgIGJsb2NrU3RyZWFtRnJvbTogW10sXG4gICAgICBjb25uZWN0aW9uVGltZW91dDogMjAwMDAsXG4gICAgICBsYWdNb25pdG9yOiAzMDAwMCxcbiAgICAgIHF1ZXJ5Q2FjaGU6XG4gICAgICBvcHRpb25zLnF1ZXJ5Q2FjaGUgPT09IG51bGwgP1xuICAgICAgbnVsbCA6XG4gICAgICBvcHRpb25zLnF1ZXJ5Q2FjaGUgfHwgbmV3IFF1ZXJ5Q2FjaGUodGhpcyksXG4gICAgICBza2lwRkZtcGVnOiB0cnVlLFxuICAgICAgcHJvYmVUaW1lb3V0OiA1MDAwLFxuICAgICAgb3ZlcnJpZGVGYWxsYmFja0NvbnRleHQ6IHRydWUsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfSBzYXRpc2ZpZXMgUGxheWVySW5pdE9wdGlvbnM7XG5cbiAgICBpZiAoIWlzQ29tcGF0TW9kZSkge1xuICAgICAgLy8gQHRzLWlnbm9yZSBwcml2YXRlIG1ldGhvZFxuICAgICAgdGhpcy5jbGllbnQuaW5jcmVtZW50TWF4TGlzdGVuZXJzKCk7XG4gICAgICB0aGlzLmNsaWVudC5vbihFdmVudHMuVm9pY2VTdGF0ZVVwZGF0ZSwgdGhpcy4jdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBwcml2YXRlIG1ldGhvZFxuICAgICAgICB0aGlzLmNsaWVudC5fX2RwX3ZvaWNlU3RhdGVVcGRhdGVfcHJveHkodGhpcy4jdm9pY2VTdGF0ZVVwZGF0ZUxpc3RlbmVyKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgVXRpbC53YXJuKFxuICAgICAgICAgICdGYWlsZWQgdG8gYXR0YWNoIHZvaWNlIHN0YXRlIHVwZGF0ZSBwcm94eSwgdm9pY2Ugc3RhdGUgaGFuZGxlciB3aWxsIG5vdCB3b3JrIHByb3Blcmx5JyxcbiAgICAgICAgICAnQ29tcGF0TW9kZUVycm9yJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICB0eXBlb2YgdGhpcy5vcHRpb25zLmxhZ01vbml0b3IgPT09ICdudW1iZXInICYmXG4gICAgdGhpcy5vcHRpb25zLmxhZ01vbml0b3IgPiAwKVxuICAgIHtcbiAgICAgIHRoaXMuI2xhZ01vbml0b3JJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgdGhpcy4jbGFnTW9uaXRvclRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLiNsYXN0TGF0ZW5jeSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQ7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgICAgIGBbTGFnIE1vbml0b3JdIEV2ZW50IGxvb3AgbGF0ZW5jeTogJHt0aGlzLiNsYXN0TGF0ZW5jeX1tc2BcbiAgICAgICAgICApO1xuICAgICAgICB9LCAwKS51bnJlZigpO1xuICAgICAgfSwgdGhpcy5vcHRpb25zLmxhZ01vbml0b3IpLnVucmVmKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5vdmVycmlkZUZhbGxiYWNrQ29udGV4dCkge1xuICAgICAgZ2V0R2xvYmFsUmVnaXN0cnkoKS5zZXQoJ0BbcGxheWVyXScsIHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaG9va3MgY29udGV4dCBmb3IgdGhpcyBwbGF5ZXIgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbnRleHQoKSB7XG4gICAgaWYgKCF0aGlzLiNob29rc0N0eCkge1xuICAgICAgdGhpcy4jaG9va3NDdHggPSBjcmVhdGVDb250ZXh0KCk7XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsUHJvdmlkZXIgPSB0aGlzLiNob29rc0N0eC5wcm92aWRlLmJpbmQodGhpcy4jaG9va3NDdHgpO1xuXG4gICAgICB0aGlzLiNob29rc0N0eC5wcm92aWRlID0gKHZhbHVlLCByZWNlaXZlcikgPT4ge1xuICAgICAgICByZXR1cm4gU1VQRVJfQ09OVEVYVC5wcm92aWRlKHRoaXMsICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gb3JpZ2luYWxQcm92aWRlcih2YWx1ZSwgKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJlY2VpdmVyKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jaG9va3NDdHg7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgZGVmYXVsdCB2b2ljZSBzdGF0ZSB1cGRhdGUgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciBjYWxsYmFja1xuICAgKi9cbiAgcHVibGljIG9uVm9pY2VTdGF0ZVVwZGF0ZShoYW5kbGVyOiBWb2ljZVN0YXRlSGFuZGxlcikge1xuICAgIHRoaXMuI29uVm9pY2VTdGF0ZVVwZGF0ZSA9IGhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgZGVidWcobTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZW1pdCgnZGVidWcnLCBtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIG5ldyBkaXNjb3JkLXBsYXllciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGNsaWVudCBUaGUgY2xpZW50IHRoYXQgaW5zdGFudGlhdGVkIHBsYXllclxuICAgKiBAcGFyYW0gb3B0aW9ucyBQbGF5ZXIgaW5pdGlhbGl6ZXIgb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGUoY2xpZW50OiBDbGllbnQsIG9wdGlvbnM6IFBsYXllckluaXRPcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IFBsYXllcihjbGllbnQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHF1ZXJ5IGNhY2hlIHByb3ZpZGVyIGluIHVzZVxuICAgKi9cbiAgcHVibGljIGdldCBxdWVyeUNhY2hlKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMucXVlcnlDYWNoZSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsaWFzIHRvIGBQbGF5ZXIubm9kZXNgLlxuICAgKi9cbiAgcHVibGljIGdldCBxdWV1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMubm9kZXM7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgbG9vcCBsYXRlbmN5IGluIG1zLiBJZiB5b3VyIGJvdCBpcyBsYWdneSBhbmQgdGhpcyByZXR1cm5zIGEgbnVtYmVyIGFib3ZlIDIwbXMgZm9yIGV4YW1wbGUsXG4gICAqIHNvbWUgZXhwZW5zaXZlIHRhc2sgaXMgYmVpbmcgZXhlY3V0ZWQgb24gdGhlIGN1cnJlbnQgdGhyZWFkIHdoaWNoIGlzIHNsb3dpbmcgZG93biB0aGUgZXZlbnQgbG9vcC5cbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIHB1YmxpYyBnZXQgZXZlbnRMb29wTGFnKCkge1xuICAgIHJldHVybiB0aGlzLiNsYXN0TGF0ZW5jeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgc3RhdGlzdGljcyB0aGF0IGNvdWxkIGJlIHVzZWZ1bC4gU3RhdGlzdGljcyBnZW5lcmF0b3IgaXMgc3RpbGwgZXhwZXJpbWVudGFsLlxuICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHN0YXRzID0gcGxheWVyLmdlbmVyYXRlU3RhdGlzdGljcygpO1xuICAgKlxuICAgKiBjb25zb2xlLmxvZyhzdGF0cyk7XG4gICAqXG4gICAqIC8vIG91dHB1dHMgc29tZXRoaW5nIGxpa2VcbiAgICogLy8ge1xuICAgKiAvLyAgIHF1ZXVlc0NvdW50OiBudW1iZXIsXG4gICAqIC8vICAgcXVlcnlDYWNoZUVuYWJsZWQ6IGJvb2xlYW4sXG4gICAqIC8vICAgcXVldWVzOiBbXG4gICAqIC8vICAgICAgR3VpbGRRdWV1ZVN0YXRpc3RpY3NNZXRhZGF0YSxcbiAgICogLy8gICAgICBHdWlsZFF1ZXVlU3RhdGlzdGljc01ldGFkYXRhLFxuICAgKiAvLyAgICAgIEd1aWxkUXVldWVTdGF0aXN0aWNzTWV0YWRhdGEsXG4gICAqIC8vICAgICAgLi4uXG4gICAqIC8vICAgXVxuICAgKiAvLyB9XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGdlbmVyYXRlU3RhdGlzdGljcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcXVldWVzQ291bnQ6IHRoaXMucXVldWVzLmNhY2hlLnNpemUsXG4gICAgICBxdWVyeUNhY2hlRW5hYmxlZDogdGhpcy5xdWVyeUNhY2hlICE9IG51bGwsXG4gICAgICBxdWV1ZXM6IHRoaXMucXVldWVzLmNhY2hlLm1hcCgobSkgPT4gbS5zdGF0cy5nZW5lcmF0ZSgpKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGxheWVyIGlzIGluIGNvbXBhdGliaWxpdHkgbW9kZS4gQ29tcGF0aWJpbGl0eSBtb2RlIGlzIGVuYWJsZWQgd2hlbiBub24tZGlzY29yZC5qcyBjbGllbnQgaXMgdXNlZC5cbiAgICovXG4gIHB1YmxpYyBpc0NvbXBhdE1vZGUoKSB7XG4gICAgcmV0dXJuIGlzQ2xpZW50UHJveHkodGhpcy5jbGllbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgZXZlcnkgc2luZ2xlIHF1ZXVlcyBtYW5hZ2VkIGJ5IHRoaXMgbWFzdGVyIHBsYXllciBpbnN0YW5jZVxuICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIHVzZSBtZSB3aGVuIHlvdSB3YW50IHRvIGltbWVkaWF0ZWx5IHRlcm1pbmF0ZSBldmVyeSBzaW5nbGUgcXVldWVzIGluIGV4aXN0ZW5jZSBcdUQ4M0RcdUREMkFcbiAgICogYXdhaXQgcGxheWVyLmRlc3Ryb3koKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVzdHJveSgpIHtcbiAgICB0aGlzLm5vZGVzLmNhY2hlLmZvckVhY2goKG5vZGUpID0+IG5vZGUuZGVsZXRlKCkpO1xuXG4gICAgaWYgKCF0aGlzLmlzQ29tcGF0TW9kZSgpKSB7XG4gICAgICB0aGlzLmNsaWVudC5vZmYoRXZlbnRzLlZvaWNlU3RhdGVVcGRhdGUsIHRoaXMuI3ZvaWNlU3RhdGVVcGRhdGVMaXN0ZW5lcik7XG4gICAgICAvLyBAdHMtaWdub3JlIHByaXZhdGUgbWV0aG9kXG4gICAgICB0aGlzLmNsaWVudC5kZWNyZW1lbnRNYXhMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIHRoaXMuZXZlbnRzLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgIGF3YWl0IHRoaXMuZXh0cmFjdG9ycy51bnJlZ2lzdGVyQWxsKCk7XG4gICAgaWYgKHRoaXMuI2xhZ01vbml0b3JJbnRlcnZhbCkgY2xlYXJJbnRlcnZhbCh0aGlzLiNsYWdNb25pdG9ySW50ZXJ2YWwpO1xuICAgIGlmICh0aGlzLiNsYWdNb25pdG9yVGltZW91dCkgY2xlYXJJbnRlcnZhbCh0aGlzLiNsYWdNb25pdG9yVGltZW91dCk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSkge1xuICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5ub2Rlcy5nZXQob2xkU3RhdGUuZ3VpbGQuaWQpO1xuICAgIGlmICghcXVldWUgfHwgIXF1ZXVlLmNvbm5lY3Rpb24gfHwgIXF1ZXVlLmNoYW5uZWwpIHJldHVybjtcblxuICAgIC8vIGRpc3BhdGNoIHZvaWNlIHN0YXRlIHVwZGF0ZVxuICAgIGNvbnN0IHdhc0hhbmRsZWQgPSB0aGlzLmV2ZW50cy5lbWl0KFxuICAgICAgR3VpbGRRdWV1ZUV2ZW50LlZvaWNlU3RhdGVVcGRhdGUsXG4gICAgICBxdWV1ZSxcbiAgICAgIG9sZFN0YXRlLFxuICAgICAgbmV3U3RhdGVcbiAgICApO1xuICAgIC8vIGlmIHRoZSBldmVudCB3YXMgaGFuZGxlZCwgcmV0dXJuIGFzc3VtaW5nIHRoZSBsaXN0ZW5lciBpbXBsZW1lbnRlZCBhbGwgb2YgdGhlIGxvZ2ljIGJlbG93XG4gICAgaWYgKHdhc0hhbmRsZWQgJiYgIXRoaXMub3B0aW9ucy5sb2NrVm9pY2VTdGF0ZUhhbmRsZXIpIHJldHVybjtcblxuICAgIHJldHVybiB0aGlzLiNvblZvaWNlU3RhdGVVcGRhdGUodGhpcywgcXVldWUsIG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB2b2ljZSBzdGF0ZSB1cGRhdGVcbiAgICogQHBhcmFtIHtWb2ljZVN0YXRlfSBvbGRTdGF0ZSBUaGUgb2xkIHZvaWNlIHN0YXRlXG4gICAqIEBwYXJhbSB7Vm9pY2VTdGF0ZX0gbmV3U3RhdGUgVGhlIG5ldyB2b2ljZSBzdGF0ZVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBwYXNzaW5nIHZvaWNlIHN0YXRlIHVwZGF0ZSBkYXRhIHRvIHRoaXMgbWV0aG9kIHdpbGwgdHJpZ2dlciB2b2ljZSBzdGF0ZSBoYW5kbGVyXG4gICAqXG4gICAqIGNsaWVudC5vbigndm9pY2VTdGF0ZVVwZGF0ZScsIChvbGRTdGF0ZSwgbmV3U3RhdGUpID0+IHtcbiAgICogICAvLyB0aGlzIGlzIGRlZmluaXRlbHkgYSByb2NrZXQgc2NpZW5jZSwgcmlnaHQgaGVyZVxuICAgKiAgIHBsYXllci5oYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBoYW5kbGVWb2ljZVN0YXRlKG9sZFN0YXRlOiBWb2ljZVN0YXRlLCBuZXdTdGF0ZTogVm9pY2VTdGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuX2hhbmRsZVZvaWNlU3RhdGUob2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2NrIHZvaWNlIHN0YXRlIGhhbmRsZXIuIFdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBkaXNjb3JkLXBsYXllciB3aWxsIGtlZXAgdXNpbmcgdGhlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIsIGV2ZW4gaWYgY3VzdG9tIGltcGxlbWVudGF0aW9uIGV4aXN0cy5cbiAgICovXG4gIHB1YmxpYyBsb2NrVm9pY2VTdGF0ZUhhbmRsZXIoKSB7XG4gICAgdGhpcy5vcHRpb25zLmxvY2tWb2ljZVN0YXRlSGFuZGxlciA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVW5sb2NrIHZvaWNlIHN0YXRlIGhhbmRsZXIuIFdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBkaXNjb3JkLXBsYXllciB3aWxsIHN0b3AgdXNpbmcgdGhlIGRlZmF1bHQgdm9pY2Ugc3RhdGUgdXBkYXRlIGhhbmRsZXIgaWYgY3VzdG9tIGltcGxlbWVudGF0aW9uIGV4aXN0cy5cbiAgICovXG4gIHB1YmxpYyB1bmxvY2tWb2ljZVN0YXRlSGFuZGxlcigpIHtcbiAgICB0aGlzLm9wdGlvbnMubG9ja1ZvaWNlU3RhdGVIYW5kbGVyID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHZvaWNlIHN0YXRlIGhhbmRsZXIgaXMgbG9ja2VkLlxuICAgKi9cbiAgcHVibGljIGlzVm9pY2VTdGF0ZUhhbmRsZXJMb2NrZWQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5vcHRpb25zLmxvY2tWb2ljZVN0YXRlSGFuZGxlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZSBhdWRpbyBwbGF5ZXJcbiAgICogQHBhcmFtIGNoYW5uZWwgVGhlIHZvaWNlIGNoYW5uZWwgb24gd2hpY2ggdGhlIG11c2ljIHNob3VsZCBiZSBwbGF5ZWRcbiAgICogQHBhcmFtIHF1ZXJ5IFRoZSB0cmFjayBvciBzb3VyY2UgdG8gcGxheVxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciBwbGF5ZXJcbiAgICogQGV4YW1wbGUgYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHF1ZXVlIG1hbmFnZW1lbnQsIGp1c3QgdXNlIHRoaXMgbWV0aG9kIFx1RDgzRFx1REUwNFxuICAgKiBjb25zdCBxdWVyeSA9ICd0aGlzIGlzIG15IHN1cGVyIGNvb2wgc2VhcmNoIHF1ZXJ5IHRoYXQgSSB3YW50IHRvIHBsYXknO1xuICAgKlxuICAgKiB0cnkge1xuICAgKiAgICBjb25zdCB7IHRyYWNrIH0gPSBhd2FpdCBwbGF5ZXIucGxheSh2b2ljZUNoYW5uZWwsIHF1ZXJ5KTtcbiAgICogICBjb25zb2xlLmxvZyhgXHVEODNDXHVERjg5IEkgYW0gcGxheWluZyAke3RyYWNrLnRpdGxlfSBcdUQ4M0NcdURGODlgKTtcbiAgICogfSBjYXRjaChlKSB7XG4gICAqICAgY29uc29sZS5sb2coYFx1RDgzRFx1REUyRCBGYWlsZWQgdG8gcGxheSBlcnJvciBvaCBubzpcXG5cXG4ke2V9YCk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcGxheTxUID0gdW5rbm93bj4oXG4gIGNoYW5uZWw6IEd1aWxkVm9pY2VDaGFubmVsUmVzb2x2YWJsZSxcbiAgcXVlcnk6IFRyYWNrTGlrZSxcbiAgb3B0aW9uczogUGxheWVyTm9kZUluaXRpYWxpemVyT3B0aW9uczxUPiA9IHt9KVxuICA6IFByb21pc2U8UGxheWVyTm9kZUluaXRpYWxpemF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgY29uc3QgdmMgPSB0aGlzLmNsaWVudC5jaGFubmVscy5yZXNvbHZlKGNoYW5uZWwpO1xuICAgIGlmICghdmM/LmlzVm9pY2VCYXNlZCgpKVxuICAgIHRocm93IG5ldyBJbnZhbGlkQXJnVHlwZUVycm9yKFxuICAgICAgJ2NoYW5uZWwnLFxuICAgICAgJ1ZvaWNlQmFzZWRDaGFubmVsJyxcbiAgICAgICF2YyA/ICd1bmRlZmluZWQnIDogYGNoYW5uZWwgdHlwZSAke3ZjLnR5cGV9YFxuICAgICk7XG5cbiAgICBjb25zdCBvcmlnaW5hbFJlc3VsdCA9XG4gICAgcXVlcnkgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHQgPyBxdWVyeSA6IGF3YWl0IHRoaXMuc2VhcmNoKHF1ZXJ5LCBvcHRpb25zKTtcbiAgICBjb25zdCByZXN1bHQgPVxuICAgIChhd2FpdCBvcHRpb25zLmFmdGVyU2VhcmNoPy4ob3JpZ2luYWxSZXN1bHQpKSB8fCBvcmlnaW5hbFJlc3VsdDtcbiAgICBpZiAocmVzdWx0LmlzRW1wdHkoKSkge1xuICAgICAgdGhyb3cgbmV3IE5vUmVzdWx0RXJyb3IoXG4gICAgICAgIGBObyByZXN1bHRzIGZvdW5kIGZvciBcIiR7cXVlcnl9XCIgKEV4dHJhY3RvcjogJHtcbiAgICAgICAgcmVzdWx0LmV4dHJhY3Rvcj8uaWRlbnRpZmllciB8fCAnTi9BJ30pYFxuXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5ub2Rlcy5jcmVhdGUodmMuZ3VpbGQsIG9wdGlvbnMubm9kZU9wdGlvbnMpO1xuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFtBc3luY1F1ZXVlXSBBY3F1aXJpbmcgYW4gZW50cnkuLi5gKTtcbiAgICBjb25zdCBlbnRyeSA9IHF1ZXVlLnRhc2tzUXVldWUuYWNxdWlyZSh7IHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSk7XG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIEVudHJ5ICR7ZW50cnkuaWR9IHdhcyBhY3F1aXJlZCBzdWNjZXNzZnVsbHkhYCk7XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gV2FpdGluZyBmb3IgdGhlIHF1ZXVlIHRvIHJlc29sdmUuLi5gKTtcbiAgICBhd2FpdCBlbnRyeS5nZXRUYXNrKCk7XG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhgW0FzeW5jUXVldWVdIEVudHJ5ICR7ZW50cnkuaWR9IHdhcyByZXNvbHZlZCFgKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoIXF1ZXVlLmNoYW5uZWwpIGF3YWl0IHF1ZXVlLmNvbm5lY3QodmMsIG9wdGlvbnMuY29ubmVjdGlvbk9wdGlvbnMpO1xuXG4gICAgICBpZiAoIXJlc3VsdC5wbGF5bGlzdCkge1xuICAgICAgICBxdWV1ZS5hZGRUcmFjayhyZXN1bHQudHJhY2tzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlLmFkZFRyYWNrKHJlc3VsdC5wbGF5bGlzdCk7XG4gICAgICB9XG4gICAgICBpZiAoIXF1ZXVlLmlzUGxheWluZygpKVxuICAgICAgYXdhaXQgcXVldWUubm9kZS5wbGF5KG51bGwsIG9wdGlvbnMuYXVkaW9QbGF5ZXJPcHRpb25zKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICB0aGlzLmRlYnVnKGBbQXN5bmNRdWV1ZV0gUmVsZWFzaW5nIGFuIGVudHJ5IGZyb20gdGhlIHF1ZXVlLi4uYCk7XG4gICAgICBxdWV1ZS50YXNrc1F1ZXVlLnJlbGVhc2UoKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHJhY2s6IHJlc3VsdC50cmFja3NbMF0sXG4gICAgICBleHRyYWN0b3I6IHJlc3VsdC5leHRyYWN0b3IsXG4gICAgICBzZWFyY2hSZXN1bHQ6IHJlc3VsdCxcbiAgICAgIHF1ZXVlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggdHJhY2tzXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVHJhY2sgfCBUcmFja1tdIHwgUGxheWxpc3QgfCBTZWFyY2hSZXN1bHR9IHF1ZXJ5IFRoZSBzZWFyY2ggcXVlcnlcbiAgICogQHBhcmFtIHtTZWFyY2hPcHRpb25zfSBvcHRpb25zIFRoZSBzZWFyY2ggb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZWFyY2hSZXN1bHQ+fVxuICAgKiBAZXhhbXBsZSBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHNlYXJjaFF1ZXJ5ID0gJ3Bhc3MgdXJsIG9yIHRleHQgb3IgZGlzY29yZC1wbGF5ZXIgdHJhY2sgY29uc3RydWN0YWJsZSBvYmplY3RzLCB3ZSBnb3QgeW91IGNvdmVyZWQgXHVEODNEXHVERTBFJztcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgcGxheWVyLnNlYXJjaChzZWFyY2hRdWVyeSk7XG4gICAqXG4gICAqIGNvbnNvbGUubG9nKHJlc3VsdCk7IC8vIExvZ3MgYFNlYXJjaFJlc3VsdGAgb2JqZWN0XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlYXJjaChcbiAgc2VhcmNoUXVlcnk6IFRyYWNrTGlrZSxcbiAgb3B0aW9uczogU2VhcmNoT3B0aW9ucyA9IHt9KVxuICA6IFByb21pc2U8U2VhcmNoUmVzdWx0PiB7XG4gICAgaWYgKHNlYXJjaFF1ZXJ5IGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0KSByZXR1cm4gc2VhcmNoUXVlcnk7XG5cbiAgICBpZiAoc2VhcmNoUXVlcnkgaW5zdGFuY2VvZiBBdWRpb1Jlc291cmNlKSB7XG4gICAgICBzZWFyY2hRdWVyeSA9IHRoaXMuY3JlYXRlVHJhY2tGcm9tQXVkaW9SZXNvdXJjZShzZWFyY2hRdWVyeSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucmVxdWVzdGVkQnkgIT0gbnVsbClcbiAgICBvcHRpb25zLnJlcXVlc3RlZEJ5ID0gdGhpcy5jbGllbnQudXNlcnMucmVzb2x2ZShvcHRpb25zLnJlcXVlc3RlZEJ5KSE7XG5cbiAgICBvcHRpb25zLmJsb2NrRXh0cmFjdG9ycyA/Pz0gdGhpcy5vcHRpb25zLmJsb2NrRXh0cmFjdG9ycztcbiAgICBvcHRpb25zLmZhbGxiYWNrU2VhcmNoRW5naW5lID8/PSBRdWVyeVR5cGUuQVVUT19TRUFSQ0g7XG5cbiAgICBpZiAoc2VhcmNoUXVlcnkgaW5zdGFuY2VvZiBUcmFjaykge1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBwbGF5bGlzdDogc2VhcmNoUXVlcnkucGxheWxpc3QgfHwgbnVsbCxcbiAgICAgICAgdHJhY2tzOiBbc2VhcmNoUXVlcnldLFxuICAgICAgICBxdWVyeTogc2VhcmNoUXVlcnkudGl0bGUsXG4gICAgICAgIGV4dHJhY3Rvcjogc2VhcmNoUXVlcnkuZXh0cmFjdG9yLFxuICAgICAgICBxdWVyeVR5cGU6IHNlYXJjaFF1ZXJ5LnF1ZXJ5VHlwZSxcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzZWFyY2hRdWVyeSBpbnN0YW5jZW9mIFBsYXlsaXN0KSB7XG4gICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgIHBsYXlsaXN0OiBzZWFyY2hRdWVyeSxcbiAgICAgICAgdHJhY2tzOiBzZWFyY2hRdWVyeS50cmFja3MsXG4gICAgICAgIHF1ZXJ5OiBzZWFyY2hRdWVyeS50aXRsZSxcbiAgICAgICAgZXh0cmFjdG9yOiBzZWFyY2hRdWVyeS50cmFja3NbMF0/LmV4dHJhY3RvcixcbiAgICAgICAgcXVlcnlUeXBlOiBRdWVyeVR5cGUuQVVUTyxcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHNlYXJjaFF1ZXJ5KSkge1xuICAgICAgY29uc3QgdHJhY2tzID0gc2VhcmNoUXVlcnkuZmlsdGVyKCh0KSA9PiB0IGluc3RhbmNlb2YgVHJhY2spO1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBwbGF5bGlzdDogbnVsbCxcbiAgICAgICAgdHJhY2tzLFxuICAgICAgICBxdWVyeTogJ0BAIyV7e1VzZXJMb2FkZWRDb250ZW50fX0lI0BAJyxcbiAgICAgICAgZXh0cmFjdG9yOiBudWxsLFxuICAgICAgICBxdWVyeVR5cGU6IFF1ZXJ5VHlwZS5BVVRPLFxuICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYFNlYXJjaGluZyAke3NlYXJjaFF1ZXJ5fWApO1xuXG4gICAgbGV0IGV4dHJhY3RvcjogQmFzZUV4dHJhY3RvciB8IG51bGwgPSBudWxsLFxuICAgICAgcHJvdG9jb2w6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgb3B0aW9ucy5zZWFyY2hFbmdpbmUgPz89IFF1ZXJ5VHlwZS5BVVRPO1xuICAgIG9wdGlvbnMuZmFsbGJhY2tTZWFyY2hFbmdpbmUgPz89IFF1ZXJ5VHlwZS5BVVRPX1NFQVJDSDtcblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICBgU2VhcmNoIGVuZ2luZSBzZXQgdG8gJHtvcHRpb25zLnNlYXJjaEVuZ2luZX0sIGZhbGxiYWNrIHNlYXJjaCBlbmdpbmUgc2V0IHRvICR7b3B0aW9ucy5mYWxsYmFja1NlYXJjaEVuZ2luZX1gXG4gICAgKTtcblxuICAgIGlmICgvXlxcdys6Ly50ZXN0KHNlYXJjaFF1ZXJ5KSkge1xuICAgICAgY29uc3QgW3Byb3RvY29sTmFtZSwgLi4ucXVlcnldID0gc2VhcmNoUXVlcnkuc3BsaXQoJzonKTtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5kZWJ1ZyhgUHJvdG9jb2wgJHtwcm90b2NvbE5hbWV9IGRldGVjdGVkIGluIHF1ZXJ5YCk7XG5cbiAgICAgIGNvbnN0IG1hdGNoaW5nRXh0cmFjdG9yID0gdGhpcy5leHRyYWN0b3JzLnN0b3JlLmZpbmQoXG4gICAgICAgIChlKSA9PlxuICAgICAgICAhdGhpcy5leHRyYWN0b3JzLmlzRGlzYWJsZWQoZS5pZGVudGlmaWVyKSAmJlxuICAgICAgICBlLnByb3RvY29scy5pbmNsdWRlcyhwcm90b2NvbE5hbWUpXG4gICAgICApO1xuXG4gICAgICBpZiAobWF0Y2hpbmdFeHRyYWN0b3IpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgYFByb3RvY29sICR7cHJvdG9jb2xOYW1lfSBpcyBzdXBwb3J0ZWQgYnkgJHttYXRjaGluZ0V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IhYFxuICAgICAgICApO1xuICAgICAgICBleHRyYWN0b3IgPSBtYXRjaGluZ0V4dHJhY3RvcjtcbiAgICAgICAgc2VhcmNoUXVlcnkgPSBxdWVyeS5qb2luKCc6Jyk7XG4gICAgICAgIHByb3RvY29sID0gcHJvdG9jb2xOYW1lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgICAgIHRoaXMuZGVidWcoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIGFuIGV4dHJhY3RvciB0aGF0IHN1cHBvcnRzICR7cHJvdG9jb2xOYW1lfSBwcm90b2NvbC4gRmFsbGluZyBiYWNrIHRvIGRlZmF1bHQgYmVoYXZpb3IuLi5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVkaXJlY3RlZCA9IGF3YWl0IFF1ZXJ5UmVzb2x2ZXIucHJlUmVzb2x2ZShzZWFyY2hRdWVyeSk7XG4gICAgY29uc3QgeyB0eXBlOiBxdWVyeVR5cGUsIHF1ZXJ5IH0gPVxuICAgIG9wdGlvbnMuc2VhcmNoRW5naW5lID09PSBRdWVyeVR5cGUuQVVUTyA/XG4gICAgUXVlcnlSZXNvbHZlci5yZXNvbHZlKHJlZGlyZWN0ZWQsIG9wdGlvbnMuZmFsbGJhY2tTZWFyY2hFbmdpbmUpIDpcbiAgICB7IHR5cGU6IG9wdGlvbnMuc2VhcmNoRW5naW5lLCBxdWVyeTogcmVkaXJlY3RlZCB9IGFzIFJlc29sdmVkUXVlcnk7XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgYFF1ZXJ5IHR5cGUgaWRlbnRpZmllZCBhcyAke3F1ZXJ5VHlwZX0ke1xuICAgICAgZXh0cmFjdG9yICYmIHByb3RvY29sID9cbiAgICAgICcgYnV0IG1pZ2h0IG5vdCBiZSB1c2VkIGR1ZSB0byB0aGUgcHJlc2VuY2Ugb2YgcHJvdG9jb2wnIDpcbiAgICAgICcnfWBcblxuICAgICk7XG5cbiAgICAvLyBmb3JjZSBwYXJ0aWN1bGFyIGV4dHJhY3RvclxuICAgIGlmIChvcHRpb25zLnNlYXJjaEVuZ2luZS5zdGFydHNXaXRoKCdleHQ6JykpIHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5kZWJ1ZyhgRm9yY2luZyAke29wdGlvbnMuc2VhcmNoRW5naW5lLnN1YnN0cmluZyg0KX0gZXh0cmFjdG9yLi4uYCk7XG4gICAgICBleHRyYWN0b3IgPSB0aGlzLmV4dHJhY3RvcnMuZ2V0KG9wdGlvbnMuc2VhcmNoRW5naW5lLnN1YnN0cmluZyg0KSkhO1xuICAgICAgaWYgKCFleHRyYWN0b3IpXG4gICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgIGV4dHJhY3RvcixcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHF1ZXJ5IGFsbCBleHRyYWN0b3JzXG4gICAgaWYgKCFleHRyYWN0b3IpIHtcbiAgICAgIC8vIGNhY2hlIHZhbGlkYXRpb25cbiAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVDYWNoZSkge1xuICAgICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgQ2hlY2tpbmcgY2FjaGUuLi5gKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5xdWVyeUNhY2hlPy5yZXNvbHZlKHtcbiAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGNhY2hlIGhpdFxuICAgICAgICBpZiAocmVzPy5oYXNUcmFja3MoKSkge1xuICAgICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBDYWNoZSBoaXQgZm9yIHF1ZXJ5ICR7cXVlcnl9YCk7XG4gICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBDYWNoZSBtaXNzIGZvciBxdWVyeSAke3F1ZXJ5fWApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZyhgRXhlY3V0aW5nIGV4dHJhY3RvcnMuLi5gKTtcblxuICAgICAgLy8gY2FjaGUgbWlzc1xuICAgICAgZXh0cmFjdG9yID1cbiAgICAgIChcbiAgICAgIGF3YWl0IHRoaXMuZXh0cmFjdG9ycy5ydW4oYXN5bmMgKGV4dCkgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucy5ibG9ja0V4dHJhY3RvcnM/LmluY2x1ZGVzKGV4dC5pZGVudGlmaWVyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gZXh0LnZhbGlkYXRlKHF1ZXJ5LCBxdWVyeVR5cGUgYXMgU2VhcmNoUXVlcnlUeXBlKTtcbiAgICAgIH0pKT8uXG4gICAgICBleHRyYWN0b3IgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvLyBubyBleHRyYWN0b3JzIGF2YWlsYWJsZVxuICAgIGlmICghZXh0cmFjdG9yKSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcikgdGhpcy5kZWJ1ZygnRmFpbGVkIHRvIGZpbmQgYXBwcm9wcmlhdGUgZXh0cmFjdG9yJyk7XG4gICAgICByZXR1cm4gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICBxdWVyeVR5cGUsXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNEZWJ1Z2dlcilcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgYEV4ZWN1dGluZyBtZXRhZGF0YSBxdWVyeSB1c2luZyAke2V4dHJhY3Rvci5pZGVudGlmaWVyfSBleHRyYWN0b3IuLi5gXG4gICAgKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBleHRyYWN0b3IuXG4gICAgaGFuZGxlKHF1ZXJ5LCB7XG4gICAgICB0eXBlOiBxdWVyeVR5cGUgYXMgU2VhcmNoUXVlcnlUeXBlLFxuICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnkgYXMgVXNlcixcbiAgICAgIHJlcXVlc3RPcHRpb25zOiBvcHRpb25zLnJlcXVlc3RPcHRpb25zLFxuICAgICAgcHJvdG9jb2xcbiAgICB9KS5cbiAgICBjYXRjaCgoKSA9PiBudWxsKTtcblxuICAgIGlmIChyZXMpIHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKCdNZXRhZGF0YSBxdWVyeSB3YXMgc3VjY2Vzc2Z1bCEnKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICBwbGF5bGlzdDogcmVzLnBsYXlsaXN0LFxuICAgICAgICB0cmFja3M6IHJlcy50cmFja3MsXG4gICAgICAgIGV4dHJhY3RvcixcbiAgICAgICAgcmVxdWVzdGVkQnk6IG9wdGlvbnMucmVxdWVzdGVkQnlcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIW9wdGlvbnMuaWdub3JlQ2FjaGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpIHRoaXMuZGVidWcoYEFkZGluZyBkYXRhIHRvIGNhY2hlLi4uYCk7XG4gICAgICAgIGF3YWl0IHRoaXMucXVlcnlDYWNoZT8uYWRkRGF0YShyZXN1bHQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgIHRoaXMuZGVidWcoXG4gICAgICAnRmFpbGVkIHRvIGZpbmQgcmVzdWx0IHVzaW5nIGFwcHJvcHJpYXRlIGV4dHJhY3Rvci4gUXVlcnlpbmcgYWxsIGV4dHJhY3RvcnMuLi4nXG4gICAgKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4dHJhY3RvcnMucnVuKFxuICAgICAgYXN5bmMgKGV4dCkgPT5cbiAgICAgICFvcHRpb25zLmJsb2NrRXh0cmFjdG9ycz8uaW5jbHVkZXMoZXh0LmlkZW50aWZpZXIpICYmIChcbiAgICAgIGF3YWl0IGV4dC52YWxpZGF0ZShxdWVyeSkpICYmXG4gICAgICBleHQuaGFuZGxlKHF1ZXJ5LCB7XG4gICAgICAgIHR5cGU6IHF1ZXJ5VHlwZSBhcyBTZWFyY2hRdWVyeVR5cGUsXG4gICAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5IGFzIFVzZXIsXG4gICAgICAgIHJlcXVlc3RPcHRpb25zOiBvcHRpb25zLnJlcXVlc3RPcHRpb25zLFxuICAgICAgICBwcm90b2NvbFxuICAgICAgfSlcbiAgICApO1xuICAgIGlmICghcmVzdWx0Py5yZXN1bHQpIHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKVxuICAgICAgdGhpcy5kZWJ1ZyhcbiAgICAgICAgYEZhaWxlZCB0byBxdWVyeSBtZXRhZGF0YSBxdWVyeSB1c2luZyAke1xuICAgICAgICByZXN1bHQ/LmV4dHJhY3Rvci5pZGVudGlmaWVyIHx8ICdOL0EnfSBleHRyYWN0b3IuYFxuXG4gICAgICApO1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2hSZXN1bHQodGhpcywge1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgcXVlcnlUeXBlLFxuICAgICAgICByZXF1ZXN0ZWRCeTogb3B0aW9ucy5yZXF1ZXN0ZWRCeSxcbiAgICAgICAgZXh0cmFjdG9yOiByZXN1bHQ/LmV4dHJhY3RvclxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzRGVidWdnZXIpXG4gICAgdGhpcy5kZWJ1ZyhcbiAgICAgIGBNZXRhZGF0YSBxdWVyeSB3YXMgc3VjY2Vzc2Z1bCB1c2luZyAke3Jlc3VsdC5leHRyYWN0b3IuaWRlbnRpZmllcn0hYFxuICAgICk7XG5cbiAgICBjb25zdCBkYXRhID0gbmV3IFNlYXJjaFJlc3VsdCh0aGlzLCB7XG4gICAgICBxdWVyeSxcbiAgICAgIHF1ZXJ5VHlwZSxcbiAgICAgIHBsYXlsaXN0OiByZXN1bHQucmVzdWx0LnBsYXlsaXN0LFxuICAgICAgdHJhY2tzOiByZXN1bHQucmVzdWx0LnRyYWNrcyxcbiAgICAgIGV4dHJhY3RvcjogcmVzdWx0LmV4dHJhY3RvcixcbiAgICAgIHJlcXVlc3RlZEJ5OiBvcHRpb25zLnJlcXVlc3RlZEJ5XG4gICAgfSk7XG5cbiAgICBpZiAoIW9wdGlvbnMuaWdub3JlQ2FjaGUpIHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYnVnZ2VyKSB0aGlzLmRlYnVnKGBBZGRpbmcgZGF0YSB0byBjYWNoZS4uLmApO1xuICAgICAgYXdhaXQgdGhpcy5xdWVyeUNhY2hlPy5hZGREYXRhKGRhdGEpO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHJlcG9ydCBvZiB0aGUgZGVwZW5kZW5jaWVzIHVzZWQgYnkgdGhlIGBkaXNjb3JkLXZvaXBgIG1vZHVsZS4gVXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAqIEBleGFtcGxlIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc29sZS5sb2cocGxheWVyLnNjYW5EZXBzKCkpO1xuICAgKiAvLyAtPiBsb2dzIGRlcGVuZGVuY2llcyByZXBvcnRcbiAgICogYGBgXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBwdWJsaWMgc2NhbkRlcHMoKSB7XG4gICAgY29uc3QgbGluZSA9ICctJy5yZXBlYXQoNTApO1xuICAgIGNvbnN0IHJ1bnRpbWUgPVxuICAgICdCdW4nIGluIGdsb2JhbFRoaXMgPyAnQnVuJyA6ICdEZW5vJyBpbiBnbG9iYWxUaGlzID8gJ0Rlbm8nIDogJ05vZGUnO1xuICAgIGNvbnN0IGRlcHNSZXBvcnQgPSBbXG4gICAgJ0Rpc2NvcmQgUGxheWVyJyxcbiAgICBsaW5lLFxuICAgIGAtIGRpc2NvcmQtcGxheWVyOiAke1BsYXllci52ZXJzaW9ufSR7XG4gICAgdGhpcy5pc0NvbXBhdE1vZGUoKSA/XG4gICAgYCAoJHtnZXRDb21wYXROYW1lKHRoaXMuY2xpZW50KX0gY29tcGF0aWJpbGl0eSBtb2RlKWAgOlxuICAgICcnfWAsXG5cbiAgICBgLSBkaXNjb3JkLXZvaXA6ICR7ZFZvaWNlVmVyc2lvbn1gLFxuICAgIGAtIGRpc2NvcmQuanM6ICR7ZGpzVmVyc2lvbn1gLFxuICAgIGAtIE5vZGUgdmVyc2lvbjogJHtwcm9jZXNzLnZlcnNpb259IChEZXRlY3RlZCBSdW50aW1lOiAke3J1bnRpbWV9LCBQbGF0Zm9ybTogJHtwcm9jZXNzLnBsYXRmb3JtfSBbJHtwcm9jZXNzLmFyY2h9XSlgLFxuICAgICgoKSA9PiB7XG4gICAgICBjb25zdCBpbmZvID0gRkZtcGVnLnJlc29sdmVTYWZlKCk7XG4gICAgICBpZiAoIWluZm8pIHJldHVybiAnRkZtcGVnL0F2Y29udiBub3QgZm91bmQnO1xuXG4gICAgICByZXR1cm4gW1xuICAgICAgYC0gZmZtcGVnOiAke2luZm8udmVyc2lvbn1gLFxuICAgICAgYC0gY29tbWFuZDogJHtpbmZvLmNvbW1hbmR9YCxcbiAgICAgIGAtIHN0YXRpYzogJHtpbmZvLm1vZHVsZX1gLFxuICAgICAgYC0gbGlib3B1czogJHtpbmZvLnJlc3VsdCEuaW5jbHVkZXMoJy0tZW5hYmxlLWxpYm9wdXMnKX1gXS5cbiAgICAgIGpvaW4oJ1xcbicpO1xuICAgIH0pKCksXG4gICAgJ1xcbicsXG4gICAgJ0xvYWRlZCBFeHRyYWN0b3JzOicsXG4gICAgbGluZSxcbiAgICB0aGlzLmV4dHJhY3RvcnMuc3RvcmUuXG4gICAgbWFwKChtKSA9PiB7XG4gICAgICByZXR1cm4gbS5pZGVudGlmaWVyO1xuICAgIH0pLlxuICAgIGpvaW4oJ1xcbicpIHx8ICdOL0EnLFxuICAgICdcXG5cXG5kaXNjb3JkLXZvaXAnLFxuICAgIERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IuZ2VuZXJhdGVTdHJpbmcoKV07XG5cblxuICAgIHJldHVybiBkZXBzUmVwb3J0LmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgcHVibGljICpbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICB5aWVsZCogdGhpcy5ub2Rlcy5jYWNoZS52YWx1ZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGBQbGF5bGlzdGAgaW5zdGFuY2VcbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gaW5pdGlhbGl6ZSBhIHBsYXlsaXN0XG4gICAqL1xuICBwdWJsaWMgY3JlYXRlUGxheWxpc3QoZGF0YTogUGxheWxpc3RJbml0RGF0YSkge1xuICAgIHJldHVybiBuZXcgUGxheWxpc3QodGhpcywgZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRyYWNrIGZyb20gYW4gYXVkaW8gcmVzb3VyY2UuXG4gICAqIEBwYXJhbSByZXNvdXJjZSBUaGUgYXVkaW8gcmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVUcmFja0Zyb21BdWRpb1Jlc291cmNlKHJlc291cmNlOiBBdWRpb1Jlc291cmNlKSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSAocmVzb3VyY2UubWV0YWRhdGEgfHwge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IHJlZiA9IFNub3dmbGFrZVV0aWwuZ2VuZXJhdGUoKS50b1N0cmluZygpO1xuICAgIGNvbnN0IG1heWJlVGl0bGUgPVxuICAgICd0aXRsZScgaW4gbWV0YWRhdGEgPyBgJHttZXRhZGF0YS50aXRsZX1gIDogYFRyYWNrICR7cmVmfWA7XG4gICAgY29uc3QgbWF5YmVBdXRob3IgPVxuICAgICdhdXRob3InIGluIG1ldGFkYXRhID8gYCR7bWV0YWRhdGEuYXV0aG9yfWAgOiAnVW5rbm93biBhdXRob3InO1xuICAgIGNvbnN0IG1heWJlRHVyYXRpb24gPVxuICAgICdkdXJhdGlvbicgaW4gbWV0YWRhdGEgPyBgJHttZXRhZGF0YS5kdXJhdGlvbn1gIDogJzAwOjAwJztcbiAgICBjb25zdCBtYXliZVRodW1ibmFpbCA9XG4gICAgJ3RodW1ibmFpbCcgaW4gbWV0YWRhdGEgPyBgJHttZXRhZGF0YS50aHVtYm5haWx9YCA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtYXliZVVSTCA9XG4gICAgJ3VybCcgaW4gbWV0YWRhdGEgPyBgJHttZXRhZGF0YS51cmx9YCA6IGBkaXNjb3JkLXBsYXllcjovL2Jsb2IvJHtyZWZ9YDtcbiAgICBjb25zdCBtYXliZURlc2NyaXB0aW9uID1cbiAgICAnZGVzY3JpcHRpb24nIGluIG1ldGFkYXRhID9cbiAgICBgJHttZXRhZGF0YS5kZXNjcmlwdGlvbn1gIDpcbiAgICAnTm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlLic7XG4gICAgY29uc3QgbWF5YmVWaWV3cyA9ICd2aWV3cycgaW4gbWV0YWRhdGEgPyBOdW1iZXIobWV0YWRhdGEudmlld3MpIHx8IDAgOiAwO1xuXG4gICAgY29uc3QgdHJhY2sgPSBuZXcgVHJhY2sodGhpcywge1xuICAgICAgdGl0bGU6IG1heWJlVGl0bGUsXG4gICAgICBhdXRob3I6IG1heWJlQXV0aG9yLFxuICAgICAgZHVyYXRpb246IG1heWJlRHVyYXRpb24sXG4gICAgICB0aHVtYm5haWw6IG1heWJlVGh1bWJuYWlsLFxuICAgICAgdXJsOiBtYXliZVVSTCxcbiAgICAgIGRlc2NyaXB0aW9uOiBtYXliZURlc2NyaXB0aW9uLFxuICAgICAgcXVlcnlUeXBlOiBRdWVyeVR5cGUuRElTQ09SRF9QTEFZRVJfQkxPQixcbiAgICAgIHNvdXJjZTogJ2FyYml0cmFyeScsXG4gICAgICBtZXRhZGF0YSxcbiAgICAgIGxpdmU6IGZhbHNlLFxuICAgICAgdmlld3M6IG1heWJlVmlld3NcbiAgICB9KTtcblxuICAgIHJlc291cmNlLm1ldGFkYXRhID0gdHJhY2s7XG5cbiAgICB0cmFjay5zZXRSZXNvdXJjZShyZXNvdXJjZSBhcyBBdWRpb1Jlc291cmNlPFRyYWNrPik7XG5cbiAgICByZXR1cm4gdHJhY2s7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBpbnRlcmNlcHRpbmcgc3RyZWFtc1xuICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBzdHJlYW0gdG8gaW50ZXJjZXB0XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaGFuZGxlSW50ZXJjZXB0aW5nU3RyZWFtKFxuICBxdWV1ZTogR3VpbGRRdWV1ZSxcbiAgdHJhY2s6IFRyYWNrLFxuICBmb3JtYXQ6IFN0cmVhbVR5cGUsXG4gIHN0cmVhbTogSW50ZXJjZXB0ZWRTdHJlYW0pXG4gIHtcbiAgICBpZiAoIXRoaXMuI3N0cmVhbUludGVyY2VwdG9yKSByZXR1cm47XG5cbiAgICByZXR1cm4gdGhpcy4jc3RyZWFtSW50ZXJjZXB0b3IuaGFuZGxlKHF1ZXVlLCB0cmFjaywgZm9ybWF0LCBzdHJlYW0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBnbG9iYWwgc3RyZWFtIGludGVyY2VwdG9yXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBzdHJlYW0gaW50ZXJjZXB0b3Igb3B0aW9uc1xuICAgKi9cbiAgcHVibGljIGNyZWF0ZVN0cmVhbUludGVyY2VwdG9yKG9wdGlvbnM6IFBsYXllclN0cmVhbUludGVyY2VwdG9yT3B0aW9ucykge1xuICAgIGlmICh0aGlzLiNzdHJlYW1JbnRlcmNlcHRvcikge1xuICAgICAgcmV0dXJuIHRoaXMuI3N0cmVhbUludGVyY2VwdG9yO1xuICAgIH1cblxuICAgIHRoaXMuI3N0cmVhbUludGVyY2VwdG9yID0gbmV3IFBsYXllclN0cmVhbUludGVyY2VwdG9yKHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHRoaXMuI3N0cmVhbUludGVyY2VwdG9yO1xuICB9XG59IiwgImltcG9ydCB7IENoYW5uZWxUeXBlLCBWb2ljZVN0YXRlIH0gZnJvbSAnZGlzY29yZC5qcyc7XG5pbXBvcnQgeyBHdWlsZFF1ZXVlLCBHdWlsZFF1ZXVlRXZlbnQgfSBmcm9tICcuL3F1ZXVlJztcbmltcG9ydCB7IFBsYXllciB9IGZyb20gJy4vUGxheWVyJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuL3V0aWxzL1V0aWwnO1xuXG5mdW5jdGlvbiBoYW5kbGVFbXB0eUNoYW5uZWwoXG5wbGF5ZXI6IFBsYXllcixcbnF1ZXVlOiBHdWlsZFF1ZXVlLFxuZ3VpbGRJZDogc3RyaW5nKVxue1xuICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgaWYgKCFVdGlsLmlzVm9pY2VFbXB0eShxdWV1ZS5jaGFubmVsISkgfHwgIXBsYXllci5ub2Rlcy5oYXMocXVldWUuZ3VpbGQuaWQpKVxuICAgIHJldHVybjtcbiAgICBpZiAocXVldWUub3B0aW9ucy5sZWF2ZU9uRW1wdHkpIHF1ZXVlLmRlbGV0ZSgpO1xuICAgIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRW1wdHlDaGFubmVsLCBxdWV1ZSk7XG4gIH0sIHF1ZXVlLm9wdGlvbnMubGVhdmVPbkVtcHR5Q29vbGRvd24gfHwgMCkudW5yZWYoKTtcbiAgcXVldWUudGltZW91dHMuc2V0KGBlbXB0eV8ke2d1aWxkSWR9YCwgdGltZW91dCk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUNoYW5uZWxQb3B1bGF0ZShcbnBsYXllcjogUGxheWVyLFxucXVldWU6IEd1aWxkUXVldWUsXG5ndWlsZElkOiBzdHJpbmcpXG57XG4gIGNvbnN0IGVtcHR5VGltZW91dCA9IHF1ZXVlLnRpbWVvdXRzLmdldChgZW1wdHlfJHtndWlsZElkfWApO1xuICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwhKSAmJiBlbXB0eVRpbWVvdXQpIHtcbiAgICBjbGVhclRpbWVvdXQoZW1wdHlUaW1lb3V0KTtcbiAgICBxdWV1ZS50aW1lb3V0cy5kZWxldGUoYGVtcHR5XyR7Z3VpbGRJZH1gKTtcbiAgICBwbGF5ZXIuZXZlbnRzLmVtaXQoR3VpbGRRdWV1ZUV2ZW50LkNoYW5uZWxQb3B1bGF0ZSwgcXVldWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVBhdXNlT25FbXB0eShxdWV1ZTogR3VpbGRRdWV1ZSkge1xuICBjb25zdCBpc0VtcHR5ID0gVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCEpO1xuICBjb25zdCB3YXNQYXVzZWRPbkVtcHR5ID0gUmVmbGVjdC5nZXQocXVldWUsICdfX3BhdXNlZE9uRW1wdHknKTtcblxuICBpZiAoaXNFbXB0eSAmJiAhd2FzUGF1c2VkT25FbXB0eSkge1xuICAgIHF1ZXVlLm5vZGUuc2V0UGF1c2VkKHRydWUpO1xuICAgIFJlZmxlY3Quc2V0KHF1ZXVlLCAnX19wYXVzZWRPbkVtcHR5JywgdHJ1ZSk7XG4gICAgaWYgKHF1ZXVlLmhhc0RlYnVnZ2VyKSB7XG4gICAgICBxdWV1ZS5kZWJ1ZyhcbiAgICAgICAgJ1ZvaWNlIGNoYW5uZWwgaXMgZW1wdHkgYW5kIG9wdGlvbnMjcGF1c2VPbkVtcHR5IGlzIHRydWUsIHBhdXNpbmcuLi4nXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIGlmICghaXNFbXB0eSAmJiB3YXNQYXVzZWRPbkVtcHR5KSB7XG4gICAgcXVldWUubm9kZS5zZXRQYXVzZWQoZmFsc2UpO1xuICAgIFJlZmxlY3Quc2V0KHF1ZXVlLCAnX19wYXVzZWRPbkVtcHR5JywgZmFsc2UpO1xuICAgIGlmIChxdWV1ZS5oYXNEZWJ1Z2dlcikge1xuICAgICAgcXVldWUuZGVidWcoXG4gICAgICAgICdWb2ljZSBjaGFubmVsIGlzIG5vdCBlbXB0eSBhbmQgb3B0aW9ucyNwYXVzZU9uRW1wdHkgaXMgdHJ1ZSwgcmVzdW1pbmcuLi4nXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVCb3RWb2ljZVN0YXRlVXBkYXRlKFxucXVldWU6IEd1aWxkUXVldWUsXG5vbGRTdGF0ZTogVm9pY2VTdGF0ZSxcbm5ld1N0YXRlOiBWb2ljZVN0YXRlKVxue1xuICBpZiAoXG4gIG5ld1N0YXRlLnNlcnZlck11dGUgIT0gbnVsbCAmJlxuICBvbGRTdGF0ZS5zZXJ2ZXJNdXRlICE9PSBuZXdTdGF0ZS5zZXJ2ZXJNdXRlKVxuICB7XG4gICAgcXVldWUubm9kZS5zZXRQYXVzZWQobmV3U3RhdGUuc2VydmVyTXV0ZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKFxuICBuZXdTdGF0ZS5jaGFubmVsPy50eXBlID09PSBDaGFubmVsVHlwZS5HdWlsZFN0YWdlVm9pY2UgJiZcbiAgbmV3U3RhdGUuc3VwcHJlc3MgIT0gbnVsbCAmJlxuICBvbGRTdGF0ZS5zdXBwcmVzcyAhPT0gbmV3U3RhdGUuc3VwcHJlc3MpXG4gIHtcbiAgICBxdWV1ZS5ub2RlLnNldFBhdXNlZChuZXdTdGF0ZS5zdXBwcmVzcyk7XG4gICAgaWYgKG5ld1N0YXRlLnN1cHByZXNzKSB7XG4gICAgICBuZXdTdGF0ZS5ndWlsZC5tZW1iZXJzLm1lPy52b2ljZS5zZXRSZXF1ZXN0VG9TcGVhayh0cnVlKS5jYXRjaChVdGlsLm5vb3ApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVmYXVsdFZvaWNlU3RhdGVIYW5kbGVyKFxucGxheWVyOiBQbGF5ZXIsXG5xdWV1ZTogR3VpbGRRdWV1ZSxcbm9sZFN0YXRlOiBWb2ljZVN0YXRlLFxubmV3U3RhdGU6IFZvaWNlU3RhdGUpXG57XG4gIGlmICghcXVldWU/LmNvbm5lY3Rpb24gfHwgIXF1ZXVlLmNoYW5uZWwpIHJldHVybjtcblxuICBjb25zdCBpc0JvdFN0YXRlID0gbmV3U3RhdGUubWVtYmVyPy5pZCA9PT0gbmV3U3RhdGUuZ3VpbGQubWVtYmVycy5tZT8uaWQ7XG4gIGNvbnN0IGd1aWxkSWQgPSBvbGRTdGF0ZS5ndWlsZC5pZDtcblxuICAvLyBCb3QgZGlzY29ubmVjdGVkXG4gIGlmIChpc0JvdFN0YXRlICYmIG9sZFN0YXRlLmNoYW5uZWxJZCAmJiAhbmV3U3RhdGUuY2hhbm5lbElkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHF1ZXVlLmRlbGV0ZSgpO1xuICAgIH0gY2F0Y2gge1xuXG4gICAgICAvKiBub29wICovfVxuICAgIHJldHVybiB2b2lkIHBsYXllci5ldmVudHMuZW1pdChHdWlsZFF1ZXVlRXZlbnQuRGlzY29ubmVjdCwgcXVldWUpO1xuICB9XG5cbiAgaWYgKHF1ZXVlLm9wdGlvbnMucGF1c2VPbkVtcHR5KSB7XG4gICAgaGFuZGxlUGF1c2VPbkVtcHR5KHF1ZXVlKTtcbiAgfVxuXG4gIC8vIEJvdCBqb2luZWQgY2hhbm5lbCBvciBjaGFuZ2VkIHN0YXRlXG4gIGlmIChcbiAgaXNCb3RTdGF0ZSAmJlxuICBuZXdTdGF0ZS5jaGFubmVsSWQgJiYgKFxuICAhb2xkU3RhdGUuY2hhbm5lbElkIHx8IG9sZFN0YXRlLmNoYW5uZWxJZCAhPT0gbmV3U3RhdGUuY2hhbm5lbElkKSlcbiAge1xuICAgIGlmIChxdWV1ZS5jb25uZWN0aW9uKSBxdWV1ZS5jaGFubmVsID0gbmV3U3RhdGUuY2hhbm5lbCE7XG4gICAgaGFuZGxlQm90Vm9pY2VTdGF0ZVVwZGF0ZShxdWV1ZSwgb2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBjaGFubmVsIGVtcHR5L3BvcHVsYXRlIGV2ZW50c1xuICBpZiAoIW5ld1N0YXRlLmNoYW5uZWxJZCAmJiBvbGRTdGF0ZS5jaGFubmVsSWQgPT09IHF1ZXVlLmNoYW5uZWwuaWQpIHtcbiAgICBpZiAoIVV0aWwuaXNWb2ljZUVtcHR5KHF1ZXVlLmNoYW5uZWwpKSByZXR1cm47XG4gICAgaGFuZGxlRW1wdHlDaGFubmVsKHBsYXllciwgcXVldWUsIGd1aWxkSWQpO1xuICB9IGVsc2UgaWYgKG5ld1N0YXRlLmNoYW5uZWxJZCA9PT0gcXVldWUuY2hhbm5lbC5pZCkge1xuICAgIGhhbmRsZUNoYW5uZWxQb3B1bGF0ZShwbGF5ZXIsIHF1ZXVlLCBndWlsZElkKTtcbiAgfSBlbHNlIGlmIChvbGRTdGF0ZS5jaGFubmVsSWQgIT09IG5ld1N0YXRlLmNoYW5uZWxJZCkge1xuICAgIGlmIChcbiAgICBuZXdTdGF0ZS5jaGFubmVsSWQgIT09IHF1ZXVlLmNoYW5uZWwuaWQgJiZcbiAgICAhVXRpbC5pc1ZvaWNlRW1wdHkocXVldWUuY2hhbm5lbCkpXG5cbiAgICByZXR1cm47XG4gICAgaWYgKCFxdWV1ZS50aW1lb3V0cy5oYXMoYGVtcHR5XyR7Z3VpbGRJZH1gKSkge1xuICAgICAgaGFuZGxlRW1wdHlDaGFubmVsKHBsYXllciwgcXVldWUsIGd1aWxkSWQpO1xuICAgIH1cbiAgfVxufSIsICJpbXBvcnQgeyByZXNvbHZlLCBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IEZGbXBlZywgRkZtcGVnTGliIH0gZnJvbSAnQGRpc2NvcmQtcGxheWVyL2ZmbXBlZyc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi4vdmVyc2lvbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZUpTT04ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgTWF5YmVOdWxsPFQ+ID0gVCB8IG51bGw7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVwZW5kZW5jaWVzUmVwb3J0IHtcbiAgY29yZToge1xuICAgICdkaXNjb3JkLXBsYXllcic6IHN0cmluZztcbiAgICAnZGlzY29yZC12b2lwJzogc3RyaW5nO1xuICB9O1xuICBsaWJvcHVzOiB7XG4gICAgbWVkaWFwbGV4OiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICAnQGRpc2NvcmRqcy9vcHVzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ0BldmFuL29wdXMnOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICBvcHVzc2NyaXB0OiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICAnbm9kZS1vcHVzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gIH07XG4gIGxpYnNvZGl1bToge1xuICAgICdzb2RpdW0tbmF0aXZlJzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgc29kaXVtOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICAnbGlic29kaXVtLXdyYXBwZXJzJzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ3NvZGl1bS1qYXZhc2NyaXB0JzogTWF5YmVOdWxsPHN0cmluZz47XG4gICAgJ0BzdGFibGVsaWIveGNoYWNoYTIwcG9seTEzMDUnOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgICAnQG5vYmVsL2NpcGhlcnMnOiBNYXliZU51bGw8c3RyaW5nPjtcbiAgfTtcbiAgZmZtcGVnOiBGRm1wZWdSZXBvcnQ7XG59XG5cbmV4cG9ydCB0eXBlIEZGbXBlZ1JlcG9ydCA9IFJlY29yZDxcbiAgRkZtcGVnTGliLFxuICBNYXliZU51bGw8e1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgICBoYXNMaWJvcHVzOiBib29sZWFuO1xuICB9Pj47XG5cblxuLyoqXG4gKiBBIHV0aWxpdHkgdG8gZ2VuZXJhdGUgYSByZXBvcnQgb2YgdGhlIGRlcGVuZGVuY2llcyB1c2VkIGJ5IHRoZSBkaXNjb3JkLXBsYXllciBtb2R1bGUuXG4gKi9cbmV4cG9ydCBjb25zdCBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yID0ge1xuICAvKipcbiAgICogRmluZHMgdGhlIHBhY2thZ2UuanNvbiBmaWxlIG9mIGEgcGFja2FnZS5cbiAgICogQHBhcmFtIGRpciAtIFRoZSBkaXJlY3RvcnkgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb21cbiAgICogQHBhcmFtIHBhY2thZ2VOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gZmluZFxuICAgKiBAcGFyYW0gZGVwdGggLSBUaGUgbWF4aW11bSBkZXB0aCB0byBzZWFyY2hcbiAgICogQHJldHVybnMgVGhlIHBhY2thZ2UuanNvbiBmaWxlLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgZmluZFBhY2thZ2VKU09OKFxuICBkaXI6IHN0cmluZyxcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgZGVwdGg6IG51bWJlcilcbiAgOiBQYWNrYWdlSlNPTiB8IG51bGwge1xuICAgIGlmIChkZXB0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCB0YXJnZXQgPSByZXNvbHZlKGRpciwgJ3BhY2thZ2UuanNvbicpO1xuXG4gICAgY29uc3QgbmV4dCA9ICgpID0+XG4gICAgRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci5maW5kUGFja2FnZUpTT04oXG4gICAgICByZXNvbHZlKGRpciwgJy4uJyksXG4gICAgICBwYWNrYWdlTmFtZSxcbiAgICAgIGRlcHRoIC0gMVxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcbiAgICAgIGNvbnN0IHBrZ0pTT046IFBhY2thZ2VKU09OID0gcmVxdWlyZSh0YXJnZXQpO1xuXG4gICAgICBpZiAocGtnSlNPTi5uYW1lICE9PSBwYWNrYWdlTmFtZSkge1xuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGtnSlNPTjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogVHJpZXMgdG8gZmluZCB0aGUgdmVyc2lvbiBvZiBhIGRlcGVuZGVuY3kuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIHBhY2thZ2UgdG8gZmluZCB0aGUgdmVyc2lvbiBvZlxuICAgKiBAcGFyYW0gbWF4TG9va3VwRGVwdGggLSBUaGUgbWF4aW11bSBkZXB0aCB0byBzZWFyY2ggZm9yIHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICAgKiBAcmV0dXJucyBUaGUgdmVyc2lvbiBvZiB0aGUgcGFja2FnZSwgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICovXG4gIHZlcnNpb24obmFtZTogc3RyaW5nLCBtYXhMb29rdXBEZXB0aCA9IDMpOiBzdHJpbmcgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgaWYgKG5hbWUgPT09ICdkaXNjb3JkLXBsYXllcicpIHtcbiAgICAgICAgcmV0dXJuIHZlcnNpb247XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBrZyA9IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IuZmluZFBhY2thZ2VKU09OKFxuICAgICAgICBkaXJuYW1lKHJlcXVpcmUucmVzb2x2ZShuYW1lKSksXG4gICAgICAgIG5hbWUsXG4gICAgICAgIG1heExvb2t1cERlcHRoXG4gICAgICApO1xuICAgICAgcmV0dXJuIHBrZz8udmVyc2lvbiA/PyBudWxsO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgcmVwb3J0IG9mIHRoZSBkZXBlbmRlbmNpZXMgdXNlZCBieSB0aGUgZGlzY29yZC1wbGF5ZXIgbW9kdWxlLlxuICAgKiBAcmV0dXJucyBUaGUgcmVwb3J0IG9iamVjdFxuICAgKi9cbiAgZ2VuZXJhdGUoKTogRGVwZW5kZW5jaWVzUmVwb3J0IHtcbiAgICBjb25zdCBmZm1wZWdSZXBvcnQgPSB7fSBhcyBGRm1wZWdSZXBvcnQ7XG5cbiAgICBmb3IgKGNvbnN0IGxpYiBvZiBGRm1wZWcuc291cmNlcykge1xuICAgICAgZmZtcGVnUmVwb3J0W2xpYi5uYW1lXSA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZmZtcGVnID0gRkZtcGVnLnJlc29sdmVTYWZlKCk7XG5cbiAgICBpZiAoZmZtcGVnKSB7XG4gICAgICBmZm1wZWdSZXBvcnRbZmZtcGVnLm5hbWVdID0ge1xuICAgICAgICBoYXNMaWJvcHVzOiBmZm1wZWcuY29tbWFuZC5pbmNsdWRlcygnLS1lbmFibGUtbGlib3B1cycpLFxuICAgICAgICB2ZXJzaW9uOiBmZm1wZWcudmVyc2lvblxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29yZToge1xuICAgICAgICAnZGlzY29yZC1wbGF5ZXInOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oXG4gICAgICAgICAgJ2Rpc2NvcmQtcGxheWVyJ1xuICAgICAgICApIGFzIHN0cmluZyxcbiAgICAgICAgJ2Rpc2NvcmQtdm9pcCc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbihcbiAgICAgICAgICAnZGlzY29yZC12b2lwJ1xuICAgICAgICApIGFzIHN0cmluZ1xuICAgICAgfSxcbiAgICAgIGxpYm9wdXM6IHtcbiAgICAgICAgbWVkaWFwbGV4OiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ21lZGlhcGxleCcpLFxuICAgICAgICAnQGRpc2NvcmRqcy9vcHVzJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdAZGlzY29yZGpzL29wdXMnKSxcbiAgICAgICAgJ0BldmFuL29wdXMnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ0BldmFuL29wdXMnKSxcbiAgICAgICAgb3B1c3NjcmlwdDogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdvcHVzc2NyaXB0JyksXG4gICAgICAgICdub2RlLW9wdXMnOiBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ25vZGUtb3B1cycpXG4gICAgICB9LFxuICAgICAgbGlic29kaXVtOiB7XG4gICAgICAgICdzb2RpdW0tbmF0aXZlJzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdzb2RpdW0tbmF0aXZlJyksXG4gICAgICAgIHNvZGl1bTogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKCdzb2RpdW0nKSxcbiAgICAgICAgJ2xpYnNvZGl1bS13cmFwcGVycyc6XG4gICAgICAgIERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignbGlic29kaXVtLXdyYXBwZXJzJyksXG4gICAgICAgICdAc3RhYmxlbGliL3hjaGFjaGEyMHBvbHkxMzA1JzogRGVwZW5kZW5jeVJlcG9ydEdlbmVyYXRvci52ZXJzaW9uKFxuICAgICAgICAgICdAc3RhYmxlbGliL3hjaGFjaGEyMHBvbHkxMzA1J1xuICAgICAgICApLFxuICAgICAgICAnc29kaXVtLWphdmFzY3JpcHQnOlxuICAgICAgICBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLnZlcnNpb24oJ3NvZGl1bS1qYXZhc2NyaXB0JyksXG4gICAgICAgICdAbm9iZWwvY2lwaGVycyc6IERlcGVuZGVuY3lSZXBvcnRHZW5lcmF0b3IudmVyc2lvbignQG5vYmVsL2NpcGhlcnMnKVxuICAgICAgfSxcbiAgICAgIGZmbXBlZzogZmZtcGVnUmVwb3J0XG4gICAgfTtcbiAgfSxcbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGVwZW5kZW5jaWVzIHJlcG9ydC5cbiAgICogQHJldHVybnMgVGhlIHN0cmluZyByZXByZXNlbnRhdGlvblxuICAgKi9cbiAgZ2VuZXJhdGVTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCByZXBvcnQgPSBEZXBlbmRlbmN5UmVwb3J0R2VuZXJhdG9yLmdlbmVyYXRlKCk7XG4gICAgY29uc3QgbGluZSA9ICctJy5yZXBlYXQoNTApO1xuXG4gICAgY29uc3Qgb3V0cHV0OiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgb3V0cHV0LnB1c2goJ0RlcGVuZGVuY2llcyBSZXBvcnQnKTtcbiAgICBvdXRwdXQucHVzaChsaW5lKTtcblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhyZXBvcnQpIGFzIChrZXlvZiBEZXBlbmRlbmNpZXNSZXBvcnQpW107XG5cbiAgICBmb3IgKGNvbnN0IF9rZXkgb2Yga2V5cykge1xuICAgICAgY29uc3Qga2V5ID0gX2tleSBhcyBrZXlvZiBEZXBlbmRlbmNpZXNSZXBvcnQ7XG5cbiAgICAgIG91dHB1dC5wdXNoKGtleSk7XG5cbiAgICAgIGNvbnN0IHN1YktleXMgPSBPYmplY3Qua2V5cyhyZXBvcnRba2V5XSk7XG5cbiAgICAgIGZvciAoY29uc3QgX3N1YktleSBvZiBzdWJLZXlzKSB7XG4gICAgICAgIGNvbnN0IHN1YktleSA9IF9zdWJLZXkgYXMga2V5b2YgRGVwZW5kZW5jaWVzUmVwb3J0W3R5cGVvZiBrZXldO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJlcG9ydFtrZXldW3N1YktleV0gPz8gJ04vQSc7XG5cbiAgICAgICAgb3V0cHV0LnB1c2goXG4gICAgICAgICAgYC0gJHtzdWJLZXl9OiAke1xuICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMikgOiB2YWx1ZX1gXG5cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cblxuICAgIG91dHB1dC5wdXNoKGxpbmUpO1xuXG4gICAgcmV0dXJuIG91dHB1dC5qb2luKCdcXG4nKTtcbiAgfVxufTsiLCAiXG5cblxuXG5cblxuZXhwb3J0IGNvbnN0IHZlcnNpb24gPSAvKiBAX19NQUNST19fIGdldFZlcnNpb24gKi9cIjcuMi4wLWRldi4yXCI7IiwgImltcG9ydCB7IFN0cmVhbVR5cGUgfSBmcm9tICdkaXNjb3JkLXZvaXAnO1xuaW1wb3J0IHR5cGUgeyBUcmFjayB9IGZyb20gJy4vZmFicmljJztcbmltcG9ydCB0eXBlIHsgUGxheWVyIH0gZnJvbSAnLi9QbGF5ZXInO1xuaW1wb3J0IHR5cGUgeyBHdWlsZFF1ZXVlIH0gZnJvbSAnLi9xdWV1ZSc7XG5pbXBvcnQgdHlwZSB7IEludGVyY2VwdGVkU3RyZWFtIH0gZnJvbSAnLi9zdHJlYW0vSW50ZXJjZXB0ZWRTdHJlYW0nO1xuXG50eXBlIEF3YWl0YWJsZTxUPiA9IFQgfCBQcm9taXNlTGlrZTxUPjtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCB0eXBlIFNob3VsZEludGVyY2VwdEZ1bmN0aW9uID0gPFQgPSBhbnk+KFxucXVldWU6IEd1aWxkUXVldWU8VD4sXG50cmFjazogVHJhY2ssXG5mb3JtYXQ6IFN0cmVhbVR5cGUsXG5zdHJlYW06IEludGVyY2VwdGVkU3RyZWFtKVxuPT4gQXdhaXRhYmxlPGJvb2xlYW4+O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IHR5cGUgT25JbnRlcmNlcHRlZFN0cmVhbUhhbmRsZXIgPSA8VCA9IGFueT4oXG5xdWV1ZTogR3VpbGRRdWV1ZTxUPixcbnRyYWNrOiBUcmFjayxcbmZvcm1hdDogU3RyZWFtVHlwZSxcbnN0cmVhbTogSW50ZXJjZXB0ZWRTdHJlYW0pXG49PiBBd2FpdGFibGU8dm9pZD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxheWVyU3RyZWFtSW50ZXJjZXB0b3JPcHRpb25zIHtcbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciB0aGUgc3RyZWFtIHNob3VsZCBiZSBpbnRlcmNlcHRlZC5cbiAgICovXG4gIHNob3VsZEludGVyY2VwdD86IFNob3VsZEludGVyY2VwdEZ1bmN0aW9uO1xufVxuXG5leHBvcnQgY2xhc3MgUGxheWVyU3RyZWFtSW50ZXJjZXB0b3Ige1xuICAjb25TdHJlYW0gPSBuZXcgU2V0PE9uSW50ZXJjZXB0ZWRTdHJlYW1IYW5kbGVyPigpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFBsYXllclN0cmVhbUludGVyY2VwdG9yIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGxheWVyIFRoZSBwbGF5ZXIgaW5zdGFuY2VcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIGludGVyY2VwdG9yIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgcHVibGljIHJlYWRvbmx5IHBsYXllcjogUGxheWVyLFxuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFBsYXllclN0cmVhbUludGVyY2VwdG9yT3B0aW9ucylcbiAge31cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgaW50ZXJjZXB0ZWQgc3RyZWFtLlxuICAgKiBAcGFyYW0gcXVldWUgVGhlIGd1aWxkIHF1ZXVlXG4gICAqIEBwYXJhbSB0cmFjayBUaGUgdHJhY2tcbiAgICogQHBhcmFtIHN0cmVhbSBUaGUgaW50ZXJjZXB0ZWQgc3RyZWFtXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHN0cmVhbSB3YXMgaW50ZXJjZXB0ZWRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBoYW5kbGU8VCA9IHVua25vd24+KFxuICBxdWV1ZTogR3VpbGRRdWV1ZTxUPixcbiAgdHJhY2s6IFRyYWNrLFxuICB0eXBlOiBTdHJlYW1UeXBlLFxuICBzdHJlYW06IEludGVyY2VwdGVkU3RyZWFtKVxuICA6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMub3B0aW9ucy5zaG91bGRJbnRlcmNlcHQ7XG5cbiAgICBpZiAoZmlsdGVyKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmaWx0ZXIocXVldWUsIHRyYWNrLCB0eXBlLCBzdHJlYW0pO1xuICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNMaXN0ZW5lcnMgPSB0aGlzLiNvblN0cmVhbS5zaXplO1xuXG4gICAgaWYgKCFoYXNMaXN0ZW5lcnMpIHJldHVybiBmYWxzZTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgWy4uLnRoaXMuI29uU3RyZWFtXS5tYXAoKGhhbmRsZXIpID0+IGhhbmRsZXIocXVldWUsIHRyYWNrLCB0eXBlLCBzdHJlYW0pKVxuICAgICk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IGludGVyY2VwdGVkIHN0cmVhbSBsaXN0ZW5lci5cbiAgICogQHBhcmFtIGhhbmRsZXIgVGhlIGhhbmRsZXJcbiAgICogQHJldHVybnMgQSBmdW5jdGlvbiB0byByZW1vdmUgdGhlIGxpc3RlbmVyXG4gICAqL1xuICBwdWJsaWMgb25TdHJlYW0oaGFuZGxlcjogT25JbnRlcmNlcHRlZFN0cmVhbUhhbmRsZXIpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLiNvblN0cmVhbS5hZGQoaGFuZGxlcik7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy4jb25TdHJlYW0uZGVsZXRlKGhhbmRsZXIpO1xuICAgIH07XG4gIH1cbn0iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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LE1BQU07QUFBQSxNQUFNO0FBQUEsTUFDdEQ7QUFBQSxJQUFZO0FBQUEsRUFDWjtBQUFBLEVBQ0EsTUFBTSxVQUFVLENBQUMsTUFBTSxhQUFjLEdBQUssS0FBSyxLQUFLLEtBQUssR0FBSyxLQUFLLEtBQUssR0FBRyxDQUFDO0FBQUEsRUFDNUUsT0FBTztBQUFBLElBQVU7QUFBQSxNQUNqQjtBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBYztBQUFBLE1BQWM7QUFBQSxNQUFjO0FBQUEsTUFDcEQ7QUFBQSxNQUFjO0FBQUEsTUFBYztBQUFBLE1BQUs7QUFBQSxJQUFHO0FBQUEsRUFDcEM7QUFBQSxFQUNBLEtBQUs7QUFBQSxJQUFVO0FBQUEsTUFDZjtBQUFBLE1BQU07QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBYztBQUFBLE1BQU07QUFBQSxNQUFNO0FBQUEsTUFBTTtBQUFBLElBQUk7QUFBQSxFQUM5RDtBQUFBLEVBQ0EsUUFBUTtBQUFBLElBQVU7QUFBQSxNQUNsQjtBQUFBLE1BQWM7QUFBQSxNQUFjO0FBQUEsTUFBYztBQUFBLE1BQU07QUFBQSxNQUFjO0FBQUEsTUFBSztBQUFBLE1BQ25FO0FBQUEsTUFBYztBQUFBLE1BQWM7QUFBQSxJQUFZO0FBQUEsRUFDeEM7QUFBQSxFQUNBLE1BQU0sVUFBVSxDQUFDLEdBQUssS0FBSyxNQUFNLElBQU0sTUFBTSxHQUFLLEtBQUssTUFBTSxNQUFNLElBQUksQ0FBQztBQUFBLEVBQ3hFLEtBQUs7QUFBQSxJQUFVO0FBQUEsTUFDZjtBQUFBLE1BQU07QUFBQSxNQUFNO0FBQUEsTUFBTTtBQUFBLE1BQWM7QUFBQSxNQUFLO0FBQUEsTUFBSztBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBTTtBQUFBLElBQUc7QUFBQSxFQUM3RDtBQUFBLEVBQ0EsTUFBTTtBQUFBLElBQVU7QUFBQSxNQUNoQjtBQUFBLE1BQUs7QUFBQSxNQUFLO0FBQUEsTUFBYztBQUFBLE1BQU07QUFBQSxNQUFjO0FBQUEsTUFBSztBQUFBLE1B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bElQLElBQUFLLG9CQVdBO0FBQ0EsSUFBQUMsdUJBV0E7IiwKICAibmFtZXMiOiBbIkd1aWxkUXVldWUiLCAiU2VyaWFsaXplZFR5cGUiLCAicXVlcnkiLCAidmVyc2lvbiIsICJEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sIiwgIm1vZHVsZSIsICJEaXNjb3JkUGxheWVyQ2xpZW50U3ltYm9sIiwgImltcG9ydF92MTAiLCAiRGlzY29yZFBsYXllckNsaWVudFN5bWJvbCIsICJkZWNsYXJlUHJvcGVydHkiLCAiZ2V0UHJvcGVydHkiLCAibW9kdWxlIiwgIkRpc2NvcmRQbGF5ZXJDbGllbnRTeW1ib2wiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF91dGlscyIsICJyZXN1bHQiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9kaXNjb3JkIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfcHJvbWlzZXMiLCAiaW1wb3J0X2Rpc2NvcmQiLCAicmVzb2x2ZSIsICJyZXNvbHZlIiwgIndhaXRGb3IiLCAiaW1wb3J0X2VxdWFsaXplciIsICJUcmFja1NraXBSZWFzb24iLCAicmVzb2x2ZSIsICJHdWlsZFF1ZXVlIiwgIkd1aWxkUXVldWUiLCAiaW1wb3J0X3Byb21pc2VzIiwgInZlcnNpb24iLCAiaW1wb3J0X2Rpc2NvcmRfdm9pcCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X2ZmbXBlZyIsICJpbXBvcnRfZGlzY29yZCIsICJpbXBvcnRfZGlzY29yZF92b2lwIiwgImltcG9ydF9kaXNjb3JkIiwgImltcG9ydF9mZm1wZWciLCAiZGpzVmVyc2lvbiIsICJxdWVyeSIsICJyZXMiLCAicmVzdWx0IiwgImRWb2ljZVZlcnNpb24iLCAiaW1wb3J0X2VxdWFsaXplciIsICJpbXBvcnRfZGlzY29yZF92b2lwIl0KfQo=