sakuga 0.0.2 → 0.0.3

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.
Files changed (3) hide show
  1. package/README.md +13 -6
  2. package/dist/index.js +91 -46
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -2,17 +2,20 @@
2
2
  <h1 align="center">🍂 sakuga</h1>
3
3
 
4
4
  <p align="center">
5
- <strong>Create code animations</strong>
5
+ <strong>Create code animations from Markdown files</strong>
6
6
  </p>
7
7
  </div>
8
8
 
9
- ## Demo
9
+ ![Sakuga demo](examples/demo.gif)
10
10
 
11
- <video src="examples/demo.mp4" controls></video>
11
+ ## Requirements
12
+
13
+ - [Node.js](https://nodejs.org/) (v18 or higher)
14
+ - [ffmpeg](https://ffmpeg.org/) installed and available in your PATH
12
15
 
13
16
  ## How To Use
14
17
 
15
- Install `ffmpeg`, then create a Markdown file with fenced code blocks:
18
+ Create a Markdown file with fenced code blocks:
16
19
 
17
20
  ```bash
18
21
  bunx sakuga render examples/demo.md
@@ -35,8 +38,8 @@ bunx sakuga render examples/demo.md --output examples/demo.mp4
35
38
  - `--font-size`: Font size in pixels (default: `24`).
36
39
  - `--line-height`: Line height in pixels (default: `34`).
37
40
  - `--padding`: Padding around the code block in pixels (default: `64`).
38
- - `--width`: Minimum width of the rendered video in pixels (default: `1280`).
39
- - `--height`: Minimum height of the rendered video in pixels (default: `720`).
41
+ - `--width`: Minimum width of the rendered video in pixels (default: `0` for auto).
42
+ - `--height`: Minimum height of the rendered video in pixels (default: `0` for auto).
40
43
  - `--fps`: Frames per second (default: `60`).
41
44
  - `--block-duration`: Duration of each code block in seconds (default: `2`).
42
45
  - `--transition`, `-tr`: Transition duration between slides in milliseconds (default: `800`).
@@ -48,3 +51,7 @@ bunx sakuga render examples/demo.md --output examples/demo.mp4
48
51
  Sakuga builds scenes concurrently when possible to maximize performance.
49
52
 
50
53
  Made with [🥐 `pastry`](https://github.com/adelrodriguez/pastry)
54
+
55
+ ## License
56
+
57
+ [MIT](LICENSE)
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  // src/index.ts
2
2
  import { Command as Command2 } from "@effect/cli";
3
3
  import { NodeContext, NodeRuntime } from "@effect/platform-node";
4
- import { Cause, Effect as Effect7, Option as Option2 } from "effect";
4
+ import { Console as Console2, Effect as Effect7 } from "effect";
5
5
 
6
6
  // src/commands/render.ts
7
7
  import { Args, Command } from "@effect/cli";
8
- import * as FileSystem from "@effect/platform/FileSystem";
8
+ import * as FileSystem3 from "@effect/platform/FileSystem";
9
9
  import * as Path from "@effect/platform/Path";
10
10
  import { Console, Effect as Effect6, Option } from "effect";
11
11
 
@@ -94,6 +94,7 @@ var resolveTheme = Effect2.fn(function* resolveTheme2(theme) {
94
94
 
95
95
  // src/lib/video.ts
96
96
  import { availableParallelism } from "node:os";
97
+ import * as FileSystem from "@effect/platform/FileSystem";
97
98
  import { createCanvas } from "@napi-rs/canvas";
98
99
  import { Effect as Effect5, Stream as Stream2 } from "effect";
99
100
 
@@ -106,9 +107,13 @@ var CODEC_BY_FORMAT = {
106
107
  webm: "libvpx-vp9"
107
108
  };
108
109
  var PIX_FMT_BY_FORMAT = {
109
- mp4: "yuv420p",
110
+ mp4: "yuv444p",
110
111
  webm: "yuv420p"
111
112
  };
113
+ var QUALITY_ARGS_BY_FORMAT = {
114
+ mp4: ["-crf", "14", "-preset", "slow"],
115
+ webm: ["-crf", "18", "-b:v", "0"]
116
+ };
112
117
  var ensureEven = (value) => value % 2 === 0 ? value : value + 1;
113
118
  var ensureEvenDimensions = (format, width, height) => {
114
119
  if (PIX_FMT_BY_FORMAT[format] !== "yuv420p") {
@@ -119,7 +124,7 @@ var ensureEvenDimensions = (format, width, height) => {
119
124
  width: ensureEven(width)
120
125
  };
121
126
  };
122
- var buildArgs = (format, width, height, fps, outputPath) => [
127
+ var buildArgs = (format, width, height, fps, inputPath, outputPath) => [
123
128
  "-f",
124
129
  "rawvideo",
125
130
  "-pix_fmt",
@@ -129,9 +134,12 @@ var buildArgs = (format, width, height, fps, outputPath) => [
129
134
  "-r",
130
135
  `${fps}`,
131
136
  "-i",
132
- "-",
137
+ inputPath,
138
+ "-vf",
139
+ "unsharp=5:5:0.5:5:5:0.5",
133
140
  "-c:v",
134
141
  CODEC_BY_FORMAT[format],
142
+ ...QUALITY_ARGS_BY_FORMAT[format],
135
143
  "-pix_fmt",
136
144
  PIX_FMT_BY_FORMAT[format],
137
145
  "-y",
@@ -144,7 +152,7 @@ var ensureFfmpegAvailable = Effect3.fn("ensureFfmpegAvailable")(function* () {
144
152
  return yield* new MissingFfmpeg({ command: FFMPEG_BINARY });
145
153
  }
146
154
  });
147
- var startFfmpegProcess = (format, width, height, fps, outputPath) => ShellCommand.make(FFMPEG_BINARY, ...buildArgs(format, width, height, fps, outputPath)).pipe(ShellCommand.stdin("pipe"), ShellCommand.stdout("inherit"), ShellCommand.stderr("inherit"), ShellCommand.start);
155
+ var startFfmpegProcess = (format, width, height, fps, inputPath, outputPath) => ShellCommand.make(FFMPEG_BINARY, ...buildArgs(format, width, height, fps, inputPath, outputPath)).pipe(ShellCommand.stdin("inherit"), ShellCommand.stdout("inherit"), ShellCommand.stderr("inherit"), ShellCommand.start);
148
156
 
149
157
  // src/lib/render.ts
150
158
  import { Stream } from "effect";
@@ -365,8 +373,8 @@ var layoutScene = (config, measured, frameWidth, frameHeight) => {
365
373
  const layoutTokens = line.tokens.map((token) => {
366
374
  const layoutToken = {
367
375
  ...token,
368
- x: cursorX,
369
- y: cursorY
376
+ x: Math.round(cursorX),
377
+ y: Math.round(cursorY)
370
378
  };
371
379
  cursorX += token.width;
372
380
  return layoutToken;
@@ -417,10 +425,10 @@ var renderSceneText = (config, context, scene, opacity, blockX, blockY) => {
417
425
  const isUnderline = (fontStyle & FONT_STYLE_UNDERLINE) === FONT_STYLE_UNDERLINE;
418
426
  textContext.font = buildFont(config, isItalic, isBold);
419
427
  textContext.fillStyle = token.color ?? scene.foreground;
420
- textContext.fillText(content, cursorX, cursorY);
428
+ textContext.fillText(content, Math.round(cursorX), Math.round(cursorY));
421
429
  const tokenWidth = textContext.measureText(content).width;
422
430
  if (isUnderline) {
423
- drawUnderline(config, textContext, cursorX, cursorY, tokenWidth);
431
+ drawUnderline(config, textContext, Math.round(cursorX), Math.round(cursorY), tokenWidth);
424
432
  }
425
433
  cursorX += tokenWidth;
426
434
  }
@@ -695,9 +703,9 @@ var renderTransitionTokens = (config, context, tokens) => {
695
703
  textContext.globalAlpha = token.opacity;
696
704
  textContext.font = buildFont(config, isItalic, isBold);
697
705
  textContext.fillStyle = token.color;
698
- textContext.fillText(token.content, token.x, token.y);
706
+ textContext.fillText(token.content, Math.round(token.x), Math.round(token.y));
699
707
  if (isUnderline && token.width > 0) {
700
- drawUnderline(config, textContext, token.x, token.y, token.width);
708
+ drawUnderline(config, textContext, Math.round(token.x), Math.round(token.y), token.width);
701
709
  }
702
710
  }
703
711
  textContext.globalAlpha = previousAlpha;
@@ -788,29 +796,33 @@ var renderVideo = Effect5.fn(function* renderVideo2(outputPath, theme, codeBlock
788
796
  const format = options.format ?? "mp4";
789
797
  const measuredScenes = yield* Effect5.forEach(codeBlocks, (codeBlock) => Effect5.gen(function* () {
790
798
  const measurementContext = createCanvas(1, 1).getContext("2d");
799
+ measurementContext.textRendering = "optimizeLegibility";
791
800
  return yield* measureScene(config, measurementContext, codeBlock, theme);
792
801
  }), { concurrency });
793
802
  const { width, height } = resolveFrameSize(config, measuredScenes);
794
803
  const { height: evenHeight, width: evenWidth } = ensureEvenDimensions(format, width, height);
795
804
  const canvas = createCanvas(evenWidth, evenHeight);
796
805
  const context = canvas.getContext("2d");
806
+ context.textRendering = "optimizeLegibility";
797
807
  const scenes = measuredScenes.map((measured) => layoutScene(config, measured, evenWidth, evenHeight));
798
808
  const frameCounts = computeFrameCounts(config.transitionDurationMs, config.fps, config.blockDuration);
799
809
  const frameStream = buildFramesStream(config, scenes, frameCounts.blockFrames, frameCounts.transitionFrames);
800
810
  const frameBytesStream = frameStream.pipe(Stream2.mapEffect(frameToBytes(config, context, evenWidth, evenHeight)));
801
811
  return yield* Effect5.scoped(Effect5.gen(function* () {
802
- const process2 = yield* Effect5.acquireRelease(startFfmpegProcess(format, evenWidth, evenHeight, config.fps, outputPath).pipe(Effect5.mapError((cause) => new FfmpegRenderFailed({
812
+ const fileSystem = yield* FileSystem.FileSystem;
813
+ const rawPath = yield* fileSystem.makeTempFileScoped({ suffix: ".raw" });
814
+ yield* Stream2.run(frameBytesStream, fileSystem.sink(rawPath)).pipe(Effect5.mapError((cause) => new FfmpegRenderFailed({
803
815
  cause,
804
816
  format,
805
817
  outputPath,
806
- stage: "init"
807
- }))), (process3) => process3.kill("SIGTERM").pipe(Effect5.orDie));
808
- yield* Stream2.run(frameBytesStream, process2.stdin).pipe(Effect5.mapError((cause) => new FfmpegRenderFailed({
818
+ stage: "stream"
819
+ })));
820
+ const process2 = yield* Effect5.acquireRelease(startFfmpegProcess(format, evenWidth, evenHeight, config.fps, rawPath, outputPath).pipe(Effect5.mapError((cause) => new FfmpegRenderFailed({
809
821
  cause,
810
822
  format,
811
823
  outputPath,
812
- stage: "stream"
813
- })));
824
+ stage: "init"
825
+ }))), (process3) => process3.kill("SIGTERM").pipe(Effect5.orDie));
814
826
  const exitCode = yield* process2.exitCode;
815
827
  if (exitCode === null || Number(exitCode) !== 0) {
816
828
  return yield* new FfmpegRenderFailed({
@@ -827,8 +839,8 @@ var renderVideo = Effect5.fn(function* renderVideo2(outputPath, theme, codeBlock
827
839
  // src/commands/options.ts
828
840
  import { Options } from "@effect/cli";
829
841
  var DEFAULT_THEME = "github-dark";
830
- var DEFAULT_WIDTH = 1280;
831
- var DEFAULT_HEIGHT = 720;
842
+ var DEFAULT_WIDTH = 0;
843
+ var DEFAULT_HEIGHT = 0;
832
844
  var DEFAULT_FPS = 60;
833
845
  var DEFAULT_BLOCK_DURATION = 2;
834
846
  var DEFAULT_TRANSITION_DURATION_MS = 800;
@@ -847,7 +859,7 @@ var fontSize = Options.integer("font-size").pipe(Options.withAlias("fs"), Option
847
859
  var foreground = Options.text("foreground").pipe(Options.withAlias("fg"), Options.withDefault(DEFAULT_FOREGROUND), Options.withDescription("Default text color"));
848
860
  var format = Options.choice("format", ["mp4", "webm"]).pipe(Options.withAlias("f"), Options.withDefault("mp4"), Options.withDescription("Output container format."));
849
861
  var fps = Options.integer("fps").pipe(Options.withAlias("r"), Options.withDefault(DEFAULT_FPS), Options.withDescription("Frames per second for the video"));
850
- var height = Options.integer("height").pipe(Options.withAlias("h"), Options.withDefault(DEFAULT_HEIGHT), Options.withDescription("Minimum output height in pixels"));
862
+ var height = Options.integer("height").pipe(Options.withAlias("h"), Options.withDefault(DEFAULT_HEIGHT), Options.withDescription("Minimum output height in pixels (0 = auto)"));
851
863
  var lineHeight = Options.integer("line-height").pipe(Options.withAlias("lh"), Options.withDefault(DEFAULT_LINE_HEIGHT), Options.withDescription("Line height in pixels"));
852
864
  var output = Options.file("output").pipe(Options.withAlias("o"), Options.withDescription("Destination video path"), Options.optional);
853
865
  var padding = Options.integer("padding").pipe(Options.withAlias("p"), Options.withDefault(DEFAULT_PADDING), Options.withDescription("Padding around the code block in pixels"));
@@ -855,11 +867,11 @@ var tabReplacement = Options.text("tab-replacement").pipe(Options.withAlias("tb"
855
867
  var theme = Options.text("theme").pipe(Options.withAlias("t"), Options.withDefault(DEFAULT_THEME), Options.withDescription("Shiki theme for syntax highlighting"));
856
868
  var transitionDrift = Options.float("transition-drift").pipe(Options.withAlias("td"), Options.withDefault(DEFAULT_TRANSITION_DRIFT), Options.withDescription("Pixel drift during transitions"));
857
869
  var transitionDurationMs = Options.integer("transition").pipe(Options.withAlias("tr"), Options.withDefault(DEFAULT_TRANSITION_DURATION_MS), Options.withDescription("Transition time between slides in ms"));
858
- var width = Options.integer("width").pipe(Options.withAlias("w"), Options.withDefault(DEFAULT_WIDTH), Options.withDescription("Minimum output width in pixels"));
870
+ var width = Options.integer("width").pipe(Options.withAlias("w"), Options.withDefault(DEFAULT_WIDTH), Options.withDescription("Minimum output width in pixels (0 = auto)"));
859
871
 
860
872
  // src/commands/render.ts
861
873
  var file = Args.file({ exists: "yes", name: "input" }).pipe(Args.withDescription("Markdown file to render"));
862
- var renderCommand = Command.make("render", {
874
+ var render_default = Command.make("render", {
863
875
  background,
864
876
  blockDuration,
865
877
  file,
@@ -877,7 +889,7 @@ var renderCommand = Command.make("render", {
877
889
  transitionDrift,
878
890
  transitionDurationMs,
879
891
  width
880
- }, ({
892
+ }).pipe(Command.withDescription("Render a video from code blocks in a Markdown file"), Command.withHandler(({
881
893
  background: background2,
882
894
  blockDuration: blockDuration2,
883
895
  file: file2,
@@ -896,7 +908,7 @@ var renderCommand = Command.make("render", {
896
908
  width: width2,
897
909
  format: format2
898
910
  }) => Effect6.gen(function* () {
899
- const fileSystem = yield* FileSystem.FileSystem;
911
+ const fileSystem = yield* FileSystem3.FileSystem;
900
912
  const path = yield* Path.Path;
901
913
  const markdown = yield* fileSystem.readFileString(file2);
902
914
  const blocks = yield* parseMarkdownCodeBlocks(markdown);
@@ -935,29 +947,62 @@ var renderCommand = Command.make("render", {
935
947
  yield* Console.log(`Rendering ${blocks.length} code blocks to ${outputPath}...`);
936
948
  yield* renderVideo(outputPath, resolvedTheme, blocks, renderConfig, { format: format2 });
937
949
  yield* Console.log(`Video created at ${outputPath}`);
938
- }));
939
- var render_default = renderCommand;
950
+ }).pipe(Effect6.catchTags({
951
+ BadArgument: (error) => Console.error(`Invalid file argument: ${error.message}`),
952
+ FfmpegRenderFailed: (error) => {
953
+ const stageMessage = {
954
+ finish: "finalizing the video file",
955
+ init: "starting the FFmpeg process",
956
+ stream: "writing video frames"
957
+ }[error.stage];
958
+ let message = `FFmpeg failed while ${stageMessage}.
959
+ `;
960
+ message += ` Output: ${error.outputPath}
961
+ `;
962
+ message += ` Format: ${error.format}`;
963
+ if (error.exitCode !== undefined) {
964
+ message += `
965
+ Exit code: ${error.exitCode}`;
966
+ }
967
+ if (error.signal) {
968
+ message += `
969
+ Signal: ${error.signal}`;
970
+ }
971
+ return Console.error(message);
972
+ },
973
+ InvalidTransitionDuration: (error) => Console.error(`Invalid transition duration: ${error.duration}ms.
974
+ ` + ` Minimum allowed: ${error.minimum}ms`),
975
+ MissingCodeBlockLanguage: (error) => Console.error(`Missing language in code block.
976
+ ` + ` ${error.detail ?? "Every fenced code block needs a language (e.g., ```typescript)."}
977
+ ` + ` See supported languages: https://shiki.style/languages`),
978
+ MissingFfmpeg: () => Console.error(`FFmpeg is not installed or not in PATH.
979
+ ` + ` Install FFmpeg to render videos: https://ffmpeg.org/download.html`),
980
+ NoCodeBlocksFound: (error) => Console.error(`No code blocks found${error.path ? ` in ${error.path}` : ""}.
981
+ ` + ` Add fenced code blocks with a language to your markdown file.`),
982
+ SceneMeasureFailed: (error) => {
983
+ const details = error.cause instanceof Error ? `
984
+ Details: ${error.cause.message}` : "";
985
+ return Console.error(`Failed to process code block.
986
+ The syntax highlighter could not tokenize the code.${details}`);
987
+ },
988
+ SystemError: (error) => Console.error(`Failed to read input file.
989
+ ` + ` Path: ${error.pathOrDescriptor}
990
+ ` + ` Reason: ${error.reason}`),
991
+ UnknownTheme: (error) => Console.error(`Unknown theme: "${error.theme}".
992
+ ` + ` See available themes: https://shiki.style/themes`),
993
+ UnsupportedLanguage: (error) => Console.error(`Unsupported language: "${error.language}".
994
+ ` + ` See supported languages: https://shiki.style/languages`)
995
+ }))));
940
996
 
941
997
  // src/index.ts
942
- var version = await "0.0.2";
998
+ var version = await "0.0.3";
943
999
  var main = Command2.make("sakuga").pipe(Command2.withDescription("Create code animation videos from Markdown."), Command2.withSubcommands([render_default]));
944
1000
  var program = Command2.run(main, { name: "sakuga", version });
945
- var reportFailureOnSome = Effect7.fn("reportFailure.onSome")(function* (error) {
946
- if (error instanceof MissingFfmpeg) {
947
- yield* Effect7.logError("Missing ffmpeg. Install it and retry.");
948
- return;
949
- }
950
- if (error instanceof FfmpegRenderFailed) {
951
- yield* Effect7.logError(`FFmpeg failed during ${error.stage} for ${error.outputPath} (format ${error.format}).`);
952
- return;
953
- }
954
- yield* Effect7.logError(error);
955
- });
956
- var reportFailure = Effect7.fn("reportFailure")((cause) => Option2.match(Cause.failureOption(cause), {
957
- onNone: () => Effect7.logError(cause),
958
- onSome: reportFailureOnSome
959
- }));
960
- program(process.argv).pipe(Effect7.tapErrorCause(reportFailure), Effect7.provide(NodeContext.layer), NodeRuntime.runMain);
1001
+ program(process.argv).pipe(Effect7.catchTags({
1002
+ MultipleValuesDetected: (error) => Console2.error(`Multiple values detected: ${error.values.join(", ")}`),
1003
+ UnclusteredFlag: (error) => Console2.error(`Invalid flag format: "${error.unclustered.join("")}".
1004
+ ` + ` Flags cannot be clustered. Use separate flags instead.`)
1005
+ }), Effect7.provide(NodeContext.layer), NodeRuntime.runMain);
961
1006
 
962
- //# debugId=B09179C5E08B5D2164756E2164756E21
963
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIiwgInNyYy9jb21tYW5kcy9yZW5kZXIudHMiLCAic3JjL2xpYi9lcnJvcnMudHMiLCAic3JjL2xpYi9tYXJrZG93bi50cyIsICJzcmMvbGliL3RoZW1lLnRzIiwgInNyYy9saWIvdmlkZW8udHMiLCAic3JjL2xpYi9mZm1wZWcudHMiLCAic3JjL2xpYi9yZW5kZXIudHMiLCAic3JjL2xpYi9jb2xvci50cyIsICJzcmMvbGliL3NjZW5lLnRzIiwgInNyYy9saWIvY29uc3RhbnRzLnRzIiwgInNyYy9saWIvdGV4dC50cyIsICJzcmMvbGliL3Rva2VuLnRzIiwgInNyYy9saWIvdHJhbnNpdGlvbi50cyIsICJzcmMvY29tbWFuZHMvb3B0aW9ucy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcIkBlZmZlY3QvY2xpXCJcbmltcG9ydCB7IE5vZGVDb250ZXh0LCBOb2RlUnVudGltZSB9IGZyb20gXCJAZWZmZWN0L3BsYXRmb3JtLW5vZGVcIlxuaW1wb3J0IHsgQ2F1c2UsIEVmZmVjdCwgT3B0aW9uIH0gZnJvbSBcImVmZmVjdFwiXG5pbXBvcnQgcmVuZGVyIGZyb20gXCIuL2NvbW1hbmRzL3JlbmRlclwiXG5pbXBvcnQgeyByZWFkVmVyc2lvbiB9IGZyb20gXCIuL2NvbW1hbmRzL3ZlcnNpb25cIiB3aXRoIHsgdHlwZTogXCJtYWNyb1wiIH1cbmltcG9ydCB7IEZmbXBlZ1JlbmRlckZhaWxlZCwgTWlzc2luZ0ZmbXBlZyB9IGZyb20gXCIuL2xpYi9lcnJvcnNcIlxuXG5jb25zdCB2ZXJzaW9uID0gYXdhaXQgcmVhZFZlcnNpb24oKVxuXG5jb25zdCBtYWluID0gQ29tbWFuZC5tYWtlKFwic2FrdWdhXCIpLnBpcGUoXG4gIENvbW1hbmQud2l0aERlc2NyaXB0aW9uKFwiQ3JlYXRlIGNvZGUgYW5pbWF0aW9uIHZpZGVvcyBmcm9tIE1hcmtkb3duLlwiKSxcbiAgQ29tbWFuZC53aXRoU3ViY29tbWFuZHMoW3JlbmRlcl0pXG4pXG5cbmNvbnN0IHByb2dyYW0gPSBDb21tYW5kLnJ1bihtYWluLCB7IG5hbWU6IFwic2FrdWdhXCIsIHZlcnNpb24gfSlcblxuY29uc3QgcmVwb3J0RmFpbHVyZU9uU29tZSA9IEVmZmVjdC5mbihcInJlcG9ydEZhaWx1cmUub25Tb21lXCIpKGZ1bmN0aW9uKiAoZXJyb3I6IHVua25vd24pIHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgTWlzc2luZ0ZmbXBlZykge1xuICAgIHlpZWxkKiBFZmZlY3QubG9nRXJyb3IoXCJNaXNzaW5nIGZmbXBlZy4gSW5zdGFsbCBpdCBhbmQgcmV0cnkuXCIpXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRmZtcGVnUmVuZGVyRmFpbGVkKSB7XG4gICAgeWllbGQqIEVmZmVjdC5sb2dFcnJvcihcbiAgICAgIGBGRm1wZWcgZmFpbGVkIGR1cmluZyAke2Vycm9yLnN0YWdlfSBmb3IgJHtlcnJvci5vdXRwdXRQYXRofSAoZm9ybWF0ICR7ZXJyb3IuZm9ybWF0fSkuYFxuICAgIClcbiAgICByZXR1cm5cbiAgfVxuICB5aWVsZCogRWZmZWN0LmxvZ0Vycm9yKGVycm9yKVxufSlcblxuY29uc3QgcmVwb3J0RmFpbHVyZSA9IEVmZmVjdC5mbihcInJlcG9ydEZhaWx1cmVcIikoKGNhdXNlOiBDYXVzZS5DYXVzZTx1bmtub3duPikgPT5cbiAgT3B0aW9uLm1hdGNoKENhdXNlLmZhaWx1cmVPcHRpb24oY2F1c2UpLCB7XG4gICAgb25Ob25lOiAoKSA9PiBFZmZlY3QubG9nRXJyb3IoY2F1c2UpLFxuICAgIG9uU29tZTogcmVwb3J0RmFpbHVyZU9uU29tZSxcbiAgfSlcbilcblxucHJvZ3JhbShwcm9jZXNzLmFyZ3YpLnBpcGUoXG4gIEVmZmVjdC50YXBFcnJvckNhdXNlKHJlcG9ydEZhaWx1cmUpLFxuICBFZmZlY3QucHJvdmlkZShOb2RlQ29udGV4dC5sYXllciksXG4gIE5vZGVSdW50aW1lLnJ1bk1haW5cbilcbiIsCiAgICAiaW1wb3J0IHsgQXJncywgQ29tbWFuZCB9IGZyb20gXCJAZWZmZWN0L2NsaVwiXG5pbXBvcnQgKiBhcyBGaWxlU3lzdGVtIGZyb20gXCJAZWZmZWN0L3BsYXRmb3JtL0ZpbGVTeXN0ZW1cIlxuaW1wb3J0ICogYXMgUGF0aCBmcm9tIFwiQGVmZmVjdC9wbGF0Zm9ybS9QYXRoXCJcbmltcG9ydCB7IENvbnNvbGUsIEVmZmVjdCwgT3B0aW9uIH0gZnJvbSBcImVmZmVjdFwiXG5pbXBvcnQgdHlwZSB7IFJlbmRlckNvbmZpZyB9IGZyb20gXCIuLi9saWIvdHlwZXNcIlxuaW1wb3J0IHsgSW52YWxpZFRyYW5zaXRpb25EdXJhdGlvbiwgTm9Db2RlQmxvY2tzRm91bmQgfSBmcm9tIFwiLi4vbGliL2Vycm9yc1wiXG5pbXBvcnQgeyBwYXJzZU1hcmtkb3duQ29kZUJsb2NrcyB9IGZyb20gXCIuLi9saWIvbWFya2Rvd25cIlxuaW1wb3J0IHsgcmVzb2x2ZVRoZW1lIH0gZnJvbSBcIi4uL2xpYi90aGVtZVwiXG5pbXBvcnQgeyByZW5kZXJWaWRlbyB9IGZyb20gXCIuLi9saWIvdmlkZW9cIlxuaW1wb3J0IHtcbiAgYmFja2dyb3VuZCxcbiAgYmxvY2tEdXJhdGlvbixcbiAgZm9udEZhbWlseSxcbiAgZm9udFNpemUsXG4gIGZvcmVncm91bmQsXG4gIGZvcm1hdCxcbiAgZnBzLFxuICBoZWlnaHQsXG4gIGxpbmVIZWlnaHQsXG4gIG91dHB1dCxcbiAgcGFkZGluZyxcbiAgdGFiUmVwbGFjZW1lbnQsXG4gIHRoZW1lLFxuICB0cmFuc2l0aW9uRHJpZnQsXG4gIHRyYW5zaXRpb25EdXJhdGlvbk1zLFxuICB3aWR0aCxcbn0gZnJvbSBcIi4vb3B0aW9uc1wiXG5cbmNvbnN0IGZpbGUgPSBBcmdzLmZpbGUoeyBleGlzdHM6IFwieWVzXCIsIG5hbWU6IFwiaW5wdXRcIiB9KS5waXBlKFxuICBBcmdzLndpdGhEZXNjcmlwdGlvbihcIk1hcmtkb3duIGZpbGUgdG8gcmVuZGVyXCIpXG4pXG5cbmNvbnN0IHJlbmRlckNvbW1hbmQgPSBDb21tYW5kLm1ha2UoXG4gIFwicmVuZGVyXCIsXG4gIHtcbiAgICBiYWNrZ3JvdW5kLFxuICAgIGJsb2NrRHVyYXRpb24sXG4gICAgZmlsZSxcbiAgICBmb250RmFtaWx5LFxuICAgIGZvbnRTaXplLFxuICAgIGZvcmVncm91bmQsXG4gICAgZm9ybWF0LFxuICAgIGZwcyxcbiAgICBoZWlnaHQsXG4gICAgbGluZUhlaWdodCxcbiAgICBvdXRwdXQsXG4gICAgcGFkZGluZyxcbiAgICB0YWJSZXBsYWNlbWVudCxcbiAgICB0aGVtZSxcbiAgICB0cmFuc2l0aW9uRHJpZnQsXG4gICAgdHJhbnNpdGlvbkR1cmF0aW9uTXMsXG4gICAgd2lkdGgsXG4gIH0sXG4gICh7XG4gICAgYmFja2dyb3VuZCxcbiAgICBibG9ja0R1cmF0aW9uLFxuICAgIGZpbGUsXG4gICAgZm9udEZhbWlseSxcbiAgICBmb250U2l6ZSxcbiAgICBmb3JlZ3JvdW5kLFxuICAgIGZwcyxcbiAgICBoZWlnaHQsXG4gICAgbGluZUhlaWdodCxcbiAgICBvdXRwdXQsXG4gICAgcGFkZGluZyxcbiAgICB0YWJSZXBsYWNlbWVudCxcbiAgICB0aGVtZSxcbiAgICB0cmFuc2l0aW9uRHJpZnQsXG4gICAgdHJhbnNpdGlvbkR1cmF0aW9uTXMsXG4gICAgd2lkdGgsXG4gICAgZm9ybWF0LFxuICB9KSA9PlxuICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIGNvbnN0IGZpbGVTeXN0ZW0gPSB5aWVsZCogRmlsZVN5c3RlbS5GaWxlU3lzdGVtXG4gICAgICBjb25zdCBwYXRoID0geWllbGQqIFBhdGguUGF0aFxuXG4gICAgICBjb25zdCBtYXJrZG93biA9IHlpZWxkKiBmaWxlU3lzdGVtLnJlYWRGaWxlU3RyaW5nKGZpbGUpXG4gICAgICBjb25zdCBibG9ja3MgPSB5aWVsZCogcGFyc2VNYXJrZG93bkNvZGVCbG9ja3MobWFya2Rvd24pXG5cbiAgICAgIGlmIChibG9ja3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB5aWVsZCogbmV3IE5vQ29kZUJsb2Nrc0ZvdW5kKHsgcGF0aDogZmlsZSB9KVxuICAgICAgfVxuXG4gICAgICBpZiAodHJhbnNpdGlvbkR1cmF0aW9uTXMgPD0gMCkge1xuICAgICAgICByZXR1cm4geWllbGQqIG5ldyBJbnZhbGlkVHJhbnNpdGlvbkR1cmF0aW9uKHtcbiAgICAgICAgICBkdXJhdGlvbjogdHJhbnNpdGlvbkR1cmF0aW9uTXMsXG4gICAgICAgICAgbWluaW11bTogMSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzb2x2ZWRUaGVtZSA9IHlpZWxkKiByZXNvbHZlVGhlbWUodGhlbWUpXG4gICAgICBjb25zdCBvdXRwdXRQYXRoID0gT3B0aW9uLm1hdGNoKG91dHB1dCwge1xuICAgICAgICBvbk5vbmU6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXRoLnBhcnNlKGZpbGUpXG4gICAgICAgICAgcmV0dXJuIHBhdGguam9pbihwYXJzZWQuZGlyLCBgJHtwYXJzZWQubmFtZX0uJHtmb3JtYXR9YClcbiAgICAgICAgfSxcbiAgICAgICAgb25Tb21lOiAodmFsdWUpID0+IHZhbHVlLFxuICAgICAgfSlcblxuICAgICAgY29uc3QgcmVuZGVyQ29uZmlnOiBSZW5kZXJDb25maWcgPSB7XG4gICAgICAgIGJhY2tncm91bmQsXG4gICAgICAgIGJsb2NrRHVyYXRpb24sXG4gICAgICAgIGZvbnRGYW1pbHksXG4gICAgICAgIGZvbnRTaXplLFxuICAgICAgICBmb3JlZ3JvdW5kLFxuICAgICAgICBmcHMsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgbGluZUhlaWdodCxcbiAgICAgICAgcGFkZGluZyxcbiAgICAgICAgdGFiUmVwbGFjZW1lbnQsXG4gICAgICAgIHRyYW5zaXRpb25EcmlmdCxcbiAgICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uTXMsXG4gICAgICAgIHdpZHRoLFxuICAgICAgfVxuXG4gICAgICB5aWVsZCogQ29uc29sZS5sb2coYFJlbmRlcmluZyAke2Jsb2Nrcy5sZW5ndGh9IGNvZGUgYmxvY2tzIHRvICR7b3V0cHV0UGF0aH0uLi5gKVxuICAgICAgeWllbGQqIHJlbmRlclZpZGVvKG91dHB1dFBhdGgsIHJlc29sdmVkVGhlbWUsIGJsb2NrcywgcmVuZGVyQ29uZmlnLCB7IGZvcm1hdCB9KVxuICAgICAgeWllbGQqIENvbnNvbGUubG9nKGBWaWRlbyBjcmVhdGVkIGF0ICR7b3V0cHV0UGF0aH1gKVxuICAgIH0pXG4pXG5cbmV4cG9ydCBkZWZhdWx0IHJlbmRlckNvbW1hbmRcbiIsCiAgICAiaW1wb3J0IHsgRGF0YSB9IGZyb20gXCJlZmZlY3RcIlxuXG5leHBvcnQgdHlwZSBGZm1wZWdGb3JtYXQgPSBcIm1wNFwiIHwgXCJ3ZWJtXCJcblxuZXhwb3J0IGNsYXNzIFNjZW5lTWVhc3VyZUZhaWxlZCBleHRlbmRzIERhdGEuVGFnZ2VkRXJyb3IoXCJTY2VuZU1lYXN1cmVGYWlsZWRcIik8e1xuICBjYXVzZTogdW5rbm93blxufT4ge31cblxuZXhwb3J0IGNsYXNzIFVua25vd25UaGVtZSBleHRlbmRzIERhdGEuVGFnZ2VkRXJyb3IoXCJVbmtub3duVGhlbWVcIik8eyB0aGVtZTogc3RyaW5nIH0+IHt9XG5cbmV4cG9ydCBjbGFzcyBNaXNzaW5nQ29kZUJsb2NrTGFuZ3VhZ2UgZXh0ZW5kcyBEYXRhLlRhZ2dlZEVycm9yKFwiTWlzc2luZ0NvZGVCbG9ja0xhbmd1YWdlXCIpPHtcbiAgY29udGV4dDogXCJwYXJzZVwiIHwgXCJjb2RlQmxvY2tcIlxuICBkZXRhaWw/OiBzdHJpbmdcbn0+IHt9XG5cbmV4cG9ydCBjbGFzcyBVbnN1cHBvcnRlZExhbmd1YWdlIGV4dGVuZHMgRGF0YS5UYWdnZWRFcnJvcihcIlVuc3VwcG9ydGVkTGFuZ3VhZ2VcIik8e1xuICBsYW5ndWFnZTogc3RyaW5nXG59PiB7fVxuXG5leHBvcnQgY2xhc3MgTm9Db2RlQmxvY2tzRm91bmQgZXh0ZW5kcyBEYXRhLlRhZ2dlZEVycm9yKFwiTm9Db2RlQmxvY2tzRm91bmRcIik8eyBwYXRoPzogc3RyaW5nIH0+IHt9XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkVHJhbnNpdGlvbkR1cmF0aW9uIGV4dGVuZHMgRGF0YS5UYWdnZWRFcnJvcihcIkludmFsaWRUcmFuc2l0aW9uRHVyYXRpb25cIik8e1xuICBkdXJhdGlvbjogbnVtYmVyXG4gIG1pbmltdW06IG51bWJlclxufT4ge31cblxuZXhwb3J0IGNsYXNzIE1pc3NpbmdGZm1wZWcgZXh0ZW5kcyBEYXRhLlRhZ2dlZEVycm9yKFwiTWlzc2luZ0ZmbXBlZ1wiKTx7XG4gIGNvbW1hbmQ6IHN0cmluZ1xuICBjYXVzZT86IHVua25vd25cbn0+IHt9XG5cbmV4cG9ydCBjbGFzcyBGZm1wZWdSZW5kZXJGYWlsZWQgZXh0ZW5kcyBEYXRhLlRhZ2dlZEVycm9yKFwiRmZtcGVnUmVuZGVyRmFpbGVkXCIpPHtcbiAgZm9ybWF0OiBGZm1wZWdGb3JtYXRcbiAgb3V0cHV0UGF0aDogc3RyaW5nXG4gIHN0YWdlOiBcImluaXRcIiB8IFwic3RyZWFtXCIgfCBcImZpbmlzaFwiXG4gIGNhdXNlPzogdW5rbm93blxuICBleGl0Q29kZT86IG51bWJlclxuICBzaWduYWw/OiBzdHJpbmdcbn0+IHt9XG4iLAogICAgImltcG9ydCB7IEVmZmVjdCB9IGZyb20gXCJlZmZlY3RcIlxuaW1wb3J0IHsgbWFya2VkIH0gZnJvbSBcIm1hcmtlZFwiXG5pbXBvcnQgeyBidW5kbGVkTGFuZ3VhZ2VzLCB0eXBlIEJ1bmRsZWRMYW5ndWFnZSB9IGZyb20gXCJzaGlraVwiXG5pbXBvcnQgdHlwZSB7IENvZGVCbG9jayB9IGZyb20gXCIuL3R5cGVzXCJcbmltcG9ydCB7IE1pc3NpbmdDb2RlQmxvY2tMYW5ndWFnZSwgVW5zdXBwb3J0ZWRMYW5ndWFnZSB9IGZyb20gXCIuL2Vycm9ycy5qc1wiXG5cbmV4cG9ydCBjb25zdCBub3JtYWxpemVMYW5ndWFnZSA9IChyYXdMYW5ndWFnZTogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHRyaW1tZWQgPSByYXdMYW5ndWFnZS50cmltKClcbiAgaWYgKCF0cmltbWVkKSB7XG4gICAgcmV0dXJuIFwiXCJcbiAgfVxuXG4gIGNvbnN0IHByaW1hcnkgPSB0cmltbWVkLnNwbGl0KC9cXHMrLylbMF0gPz8gXCJcIlxuICByZXR1cm4gcHJpbWFyeS50b0xvd2VyQ2FzZSgpXG59XG5cbmNvbnN0IGNoZWNrSXNTdXBwb3J0ZWRMYW5ndWFnZSA9IChsYW5ndWFnZTogc3RyaW5nKTogbGFuZ3VhZ2UgaXMgQnVuZGxlZExhbmd1YWdlID0+XG4gIE9iamVjdC5oYXNPd24oYnVuZGxlZExhbmd1YWdlcywgbGFuZ3VhZ2UpXG5cbmV4cG9ydCBjb25zdCBwYXJzZU1hcmtkb3duQ29kZUJsb2NrcyA9IEVmZmVjdC5mbihmdW5jdGlvbiogcGFyc2VNYXJrZG93bkNvZGVCbG9ja3MoXG4gIG1hcmtkb3duOiBzdHJpbmdcbikge1xuICBjb25zdCB0b2tlbnMgPSB5aWVsZCogRWZmZWN0LnRyeSh7XG4gICAgY2F0Y2g6ICgpID0+XG4gICAgICBuZXcgTWlzc2luZ0NvZGVCbG9ja0xhbmd1YWdlKHsgY29udGV4dDogXCJwYXJzZVwiLCBkZXRhaWw6IFwiVW5hYmxlIHRvIHBhcnNlIG1hcmtkb3duLlwiIH0pLFxuICAgIHRyeTogKCkgPT4gbWFya2VkLmxleGVyKG1hcmtkb3duKSxcbiAgfSlcbiAgY29uc3QgYmxvY2tzOiBDb2RlQmxvY2tbXSA9IFtdXG5cbiAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICBpZiAodG9rZW4udHlwZSAhPT0gXCJjb2RlXCIpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgcmF3TGFuZ3VhZ2UgPSB0eXBlb2YgdG9rZW4ubGFuZyA9PT0gXCJzdHJpbmdcIiA/IHRva2VuLmxhbmcudHJpbSgpIDogXCJcIlxuICAgIGNvbnN0IGxhbmd1YWdlID0gbm9ybWFsaXplTGFuZ3VhZ2UocmF3TGFuZ3VhZ2UpXG5cbiAgICBpZiAoIWxhbmd1YWdlKSB7XG4gICAgICByZXR1cm4geWllbGQqIG5ldyBNaXNzaW5nQ29kZUJsb2NrTGFuZ3VhZ2Uoe1xuICAgICAgICBjb250ZXh0OiBcImNvZGVCbG9ja1wiLFxuICAgICAgICBkZXRhaWw6IFwiRXZlcnkgZmVuY2VkIGNvZGUgYmxvY2sgbmVlZHMgYSBsYW5ndWFnZSAoZm9yIGV4YW1wbGU6IGBgYHRzKS5cIixcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKCFjaGVja0lzU3VwcG9ydGVkTGFuZ3VhZ2UobGFuZ3VhZ2UpKSB7XG4gICAgICByZXR1cm4geWllbGQqIG5ldyBVbnN1cHBvcnRlZExhbmd1YWdlKHtcbiAgICAgICAgbGFuZ3VhZ2U6IHJhd0xhbmd1YWdlLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBibG9ja3MucHVzaCh7XG4gICAgICBjb2RlOiB0b2tlbi50ZXh0LFxuICAgICAgbGFuZ3VhZ2UsXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBibG9ja3Ncbn0pXG4iLAogICAgImltcG9ydCB7IEVmZmVjdCB9IGZyb20gXCJlZmZlY3RcIlxuaW1wb3J0IHsgYnVuZGxlZFRoZW1lcywgdHlwZSBCdW5kbGVkVGhlbWUgfSBmcm9tIFwic2hpa2lcIlxuaW1wb3J0IHsgVW5rbm93blRoZW1lIH0gZnJvbSBcIi4vZXJyb3JzXCJcblxuY29uc3QgY2hlY2tJc1N1cHBvcnRlZFRoZW1lID0gKHRoZW1lOiBzdHJpbmcpOiB0aGVtZSBpcyBCdW5kbGVkVGhlbWUgPT5cbiAgT2JqZWN0Lmhhc093bihidW5kbGVkVGhlbWVzLCB0aGVtZSlcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVUaGVtZSA9IEVmZmVjdC5mbihmdW5jdGlvbiogcmVzb2x2ZVRoZW1lKHRoZW1lOiBzdHJpbmcpIHtcbiAgY29uc3QgdHJpbW1lZCA9IHRoZW1lLnRyaW0oKVxuICBpZiAoIWNoZWNrSXNTdXBwb3J0ZWRUaGVtZSh0cmltbWVkKSkge1xuICAgIHJldHVybiB5aWVsZCogbmV3IFVua25vd25UaGVtZSh7IHRoZW1lIH0pXG4gIH1cblxuICByZXR1cm4gdHJpbW1lZFxufSlcbiIsCiAgICAiaW1wb3J0IHsgYXZhaWxhYmxlUGFyYWxsZWxpc20gfSBmcm9tIFwibm9kZTpvc1wiXG5pbXBvcnQgdHlwZSB7IEJ1bmRsZWRUaGVtZSB9IGZyb20gXCJzaGlraVwiXG5pbXBvcnQgeyBjcmVhdGVDYW52YXMsIHR5cGUgU0tSU0NvbnRleHQyRCB9IGZyb20gXCJAbmFwaS1ycy9jYW52YXNcIlxuaW1wb3J0IHsgRWZmZWN0LCBTdHJlYW0gfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCB0eXBlIHsgQ2FudmFzQ29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRcIlxuaW1wb3J0IHR5cGUgeyBDb2RlQmxvY2ssIFJlbmRlckNvbmZpZywgUmVuZGVyRnJhbWUgfSBmcm9tIFwiLi90eXBlc1wiXG5pbXBvcnQgeyBGZm1wZWdSZW5kZXJGYWlsZWQsIHR5cGUgRmZtcGVnRm9ybWF0IH0gZnJvbSBcIi4vZXJyb3JzXCJcbmltcG9ydCB7IGVuc3VyZUV2ZW5EaW1lbnNpb25zLCBlbnN1cmVGZm1wZWdBdmFpbGFibGUsIHN0YXJ0RmZtcGVnUHJvY2VzcyB9IGZyb20gXCIuL2ZmbXBlZ1wiXG5pbXBvcnQgeyBidWlsZEZyYW1lc1N0cmVhbSwgY29tcHV0ZUZyYW1lQ291bnRzLCByZW5kZXJGcmFtZSB9IGZyb20gXCIuL3JlbmRlclwiXG5pbXBvcnQgeyBsYXlvdXRTY2VuZSwgbWVhc3VyZVNjZW5lLCByZXNvbHZlRnJhbWVTaXplIH0gZnJvbSBcIi4vc2NlbmVcIlxuXG5leHBvcnQgdHlwZSBSZW5kZXJWaWRlb09wdGlvbnMgPSB7XG4gIGNvbmN1cnJlbmN5PzogbnVtYmVyXG4gIGZvcm1hdD86IEZmbXBlZ0Zvcm1hdFxufVxuXG5jb25zdCBmcmFtZVRvQnl0ZXMgPSAoXG4gIGNvbmZpZzogUmVuZGVyQ29uZmlnLFxuICBjb250ZXh0OiBDYW52YXNDb250ZXh0LFxuICB3aWR0aDogbnVtYmVyLFxuICBoZWlnaHQ6IG51bWJlclxuKSA9PlxuICBFZmZlY3QuZm4oXCJyZW5kZXJWaWRlby5mcmFtZVRvQnl0ZXNcIikoKGZyYW1lOiBSZW5kZXJGcmFtZSkgPT5cbiAgICBFZmZlY3Quc3luYygoKSA9PiB7XG4gICAgICByZW5kZXJGcmFtZShjb25maWcsIGNvbnRleHQsIHdpZHRoLCBoZWlnaHQsIGZyYW1lKVxuICAgICAgY29uc3QgYnl0ZXMgPSAoY29udGV4dCBhcyBTS1JTQ29udGV4dDJEKS5jYW52YXMuZGF0YSgpXG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20oYnl0ZXMpXG4gICAgfSlcbiAgKVxuXG5leHBvcnQgY29uc3QgcmVuZGVyVmlkZW8gPSBFZmZlY3QuZm4oZnVuY3Rpb24qIHJlbmRlclZpZGVvKFxuICBvdXRwdXRQYXRoOiBzdHJpbmcsXG4gIHRoZW1lOiBCdW5kbGVkVGhlbWUsXG4gIGNvZGVCbG9ja3M6IENvZGVCbG9ja1tdLFxuICBjb25maWc6IFJlbmRlckNvbmZpZyxcbiAgb3B0aW9uczogUmVuZGVyVmlkZW9PcHRpb25zID0ge31cbikge1xuICB5aWVsZCogZW5zdXJlRmZtcGVnQXZhaWxhYmxlKClcblxuICBjb25zdCBjb25jdXJyZW5jeSA9IG9wdGlvbnMuY29uY3VycmVuY3kgPz8gTWF0aC5taW4oNCwgYXZhaWxhYmxlUGFyYWxsZWxpc20oKSlcbiAgY29uc3QgZm9ybWF0ID0gb3B0aW9ucy5mb3JtYXQgPz8gXCJtcDRcIlxuXG4gIGNvbnN0IG1lYXN1cmVkU2NlbmVzID0geWllbGQqIEVmZmVjdC5mb3JFYWNoKFxuICAgIGNvZGVCbG9ja3MsXG4gICAgKGNvZGVCbG9jaykgPT5cbiAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgbWVhc3VyZW1lbnRDb250ZXh0ID0gY3JlYXRlQ2FudmFzKDEsIDEpLmdldENvbnRleHQoXCIyZFwiKVxuICAgICAgICByZXR1cm4geWllbGQqIG1lYXN1cmVTY2VuZShjb25maWcsIG1lYXN1cmVtZW50Q29udGV4dCwgY29kZUJsb2NrLCB0aGVtZSBhcyBuZXZlcilcbiAgICAgIH0pLFxuICAgIHsgY29uY3VycmVuY3kgfVxuICApXG5cbiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSByZXNvbHZlRnJhbWVTaXplKGNvbmZpZywgbWVhc3VyZWRTY2VuZXMpXG4gIGNvbnN0IHsgaGVpZ2h0OiBldmVuSGVpZ2h0LCB3aWR0aDogZXZlbldpZHRoIH0gPSBlbnN1cmVFdmVuRGltZW5zaW9ucyhmb3JtYXQsIHdpZHRoLCBoZWlnaHQpXG5cbiAgY29uc3QgY2FudmFzID0gY3JlYXRlQ2FudmFzKGV2ZW5XaWR0aCwgZXZlbkhlaWdodClcbiAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIilcblxuICBjb25zdCBzY2VuZXMgPSBtZWFzdXJlZFNjZW5lcy5tYXAoKG1lYXN1cmVkKSA9PlxuICAgIGxheW91dFNjZW5lKGNvbmZpZywgbWVhc3VyZWQsIGV2ZW5XaWR0aCwgZXZlbkhlaWdodClcbiAgKVxuXG4gIGNvbnN0IGZyYW1lQ291bnRzID0gY29tcHV0ZUZyYW1lQ291bnRzKFxuICAgIGNvbmZpZy50cmFuc2l0aW9uRHVyYXRpb25NcyxcbiAgICBjb25maWcuZnBzLFxuICAgIGNvbmZpZy5ibG9ja0R1cmF0aW9uXG4gIClcbiAgY29uc3QgZnJhbWVTdHJlYW0gPSBidWlsZEZyYW1lc1N0cmVhbShcbiAgICBjb25maWcsXG4gICAgc2NlbmVzLFxuICAgIGZyYW1lQ291bnRzLmJsb2NrRnJhbWVzLFxuICAgIGZyYW1lQ291bnRzLnRyYW5zaXRpb25GcmFtZXNcbiAgKVxuICBjb25zdCBmcmFtZUJ5dGVzU3RyZWFtID0gZnJhbWVTdHJlYW0ucGlwZShcbiAgICBTdHJlYW0ubWFwRWZmZWN0KGZyYW1lVG9CeXRlcyhjb25maWcsIGNvbnRleHQsIGV2ZW5XaWR0aCwgZXZlbkhlaWdodCkpXG4gIClcblxuICByZXR1cm4geWllbGQqIEVmZmVjdC5zY29wZWQoXG4gICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgY29uc3QgcHJvY2VzcyA9IHlpZWxkKiBFZmZlY3QuYWNxdWlyZVJlbGVhc2UoXG4gICAgICAgIHN0YXJ0RmZtcGVnUHJvY2Vzcyhmb3JtYXQsIGV2ZW5XaWR0aCwgZXZlbkhlaWdodCwgY29uZmlnLmZwcywgb3V0cHV0UGF0aCkucGlwZShcbiAgICAgICAgICBFZmZlY3QubWFwRXJyb3IoXG4gICAgICAgICAgICAoY2F1c2UpID0+XG4gICAgICAgICAgICAgIG5ldyBGZm1wZWdSZW5kZXJGYWlsZWQoe1xuICAgICAgICAgICAgICAgIGNhdXNlLFxuICAgICAgICAgICAgICAgIGZvcm1hdCxcbiAgICAgICAgICAgICAgICBvdXRwdXRQYXRoLFxuICAgICAgICAgICAgICAgIHN0YWdlOiBcImluaXRcIixcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIChwcm9jZXNzKSA9PiBwcm9jZXNzLmtpbGwoXCJTSUdURVJNXCIpLnBpcGUoRWZmZWN0Lm9yRGllKVxuICAgICAgKVxuXG4gICAgICB5aWVsZCogU3RyZWFtLnJ1bihmcmFtZUJ5dGVzU3RyZWFtLCBwcm9jZXNzLnN0ZGluKS5waXBlKFxuICAgICAgICBFZmZlY3QubWFwRXJyb3IoXG4gICAgICAgICAgKGNhdXNlKSA9PlxuICAgICAgICAgICAgbmV3IEZmbXBlZ1JlbmRlckZhaWxlZCh7XG4gICAgICAgICAgICAgIGNhdXNlLFxuICAgICAgICAgICAgICBmb3JtYXQsXG4gICAgICAgICAgICAgIG91dHB1dFBhdGgsXG4gICAgICAgICAgICAgIHN0YWdlOiBcInN0cmVhbVwiLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKVxuXG4gICAgICBjb25zdCBleGl0Q29kZSA9IHlpZWxkKiBwcm9jZXNzLmV4aXRDb2RlXG4gICAgICBpZiAoZXhpdENvZGUgPT09IG51bGwgfHwgTnVtYmVyKGV4aXRDb2RlKSAhPT0gMCkge1xuICAgICAgICByZXR1cm4geWllbGQqIG5ldyBGZm1wZWdSZW5kZXJGYWlsZWQoe1xuICAgICAgICAgIC4uLihleGl0Q29kZSAhPT0gbnVsbCAmJiB7IGV4aXRDb2RlOiBOdW1iZXIoZXhpdENvZGUpIH0pLFxuICAgICAgICAgIGZvcm1hdCxcbiAgICAgICAgICBvdXRwdXRQYXRoLFxuICAgICAgICAgIHN0YWdlOiBcImZpbmlzaFwiLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3V0cHV0UGF0aFxuICAgIH0pXG4gIClcbn0pXG4iLAogICAgImltcG9ydCB7IENvbW1hbmQgYXMgU2hlbGxDb21tYW5kIH0gZnJvbSBcIkBlZmZlY3QvcGxhdGZvcm1cIlxuaW1wb3J0IHsgRWZmZWN0IH0gZnJvbSBcImVmZmVjdFwiXG5pbXBvcnQgeyBNaXNzaW5nRmZtcGVnLCB0eXBlIEZmbXBlZ0Zvcm1hdCB9IGZyb20gXCIuL2Vycm9yc1wiXG5cbmNvbnN0IEZGTVBFR19CSU5BUlkgPSBcImZmbXBlZ1wiXG5cbmNvbnN0IENPREVDX0JZX0ZPUk1BVDogUmVjb3JkPEZmbXBlZ0Zvcm1hdCwgc3RyaW5nPiA9IHtcbiAgbXA0OiBcImxpYngyNjRcIixcbiAgd2VibTogXCJsaWJ2cHgtdnA5XCIsXG59XG5cbmNvbnN0IFBJWF9GTVRfQllfRk9STUFUOiBSZWNvcmQ8RmZtcGVnRm9ybWF0LCBzdHJpbmc+ID0ge1xuICBtcDQ6IFwieXV2NDIwcFwiLFxuICB3ZWJtOiBcInl1djQyMHBcIixcbn1cblxuY29uc3QgZW5zdXJlRXZlbiA9ICh2YWx1ZTogbnVtYmVyKSA9PiAodmFsdWUgJSAyID09PSAwID8gdmFsdWUgOiB2YWx1ZSArIDEpXG5cbmV4cG9ydCBjb25zdCBlbnN1cmVFdmVuRGltZW5zaW9ucyA9IChmb3JtYXQ6IEZmbXBlZ0Zvcm1hdCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpID0+IHtcbiAgaWYgKFBJWF9GTVRfQllfRk9STUFUW2Zvcm1hdF0gIT09IFwieXV2NDIwcFwiKSB7XG4gICAgcmV0dXJuIHsgaGVpZ2h0LCB3aWR0aCB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGhlaWdodDogZW5zdXJlRXZlbihoZWlnaHQpLFxuICAgIHdpZHRoOiBlbnN1cmVFdmVuKHdpZHRoKSxcbiAgfVxufVxuXG5jb25zdCBidWlsZEFyZ3MgPSAoXG4gIGZvcm1hdDogRmZtcGVnRm9ybWF0LFxuICB3aWR0aDogbnVtYmVyLFxuICBoZWlnaHQ6IG51bWJlcixcbiAgZnBzOiBudW1iZXIsXG4gIG91dHB1dFBhdGg6IHN0cmluZ1xuKSA9PiBbXG4gIFwiLWZcIixcbiAgXCJyYXd2aWRlb1wiLFxuICBcIi1waXhfZm10XCIsXG4gIFwicmdiYVwiLFxuICBcIi1zXCIsXG4gIGAke3dpZHRofXgke2hlaWdodH1gLFxuICBcIi1yXCIsXG4gIGAke2Zwc31gLFxuICBcIi1pXCIsXG4gIFwiLVwiLFxuICBcIi1jOnZcIixcbiAgQ09ERUNfQllfRk9STUFUW2Zvcm1hdF0sXG4gIFwiLXBpeF9mbXRcIixcbiAgUElYX0ZNVF9CWV9GT1JNQVRbZm9ybWF0XSxcbiAgXCIteVwiLFxuICBvdXRwdXRQYXRoLFxuXVxuXG5jb25zdCBmZm1wZWdDaGVja0NvbW1hbmQgPSBwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCIgPyBcIndoZXJlXCIgOiBcIndoaWNoXCJcblxuZXhwb3J0IGNvbnN0IGVuc3VyZUZmbXBlZ0F2YWlsYWJsZSA9IEVmZmVjdC5mbihcImVuc3VyZUZmbXBlZ0F2YWlsYWJsZVwiKShmdW5jdGlvbiogKCkge1xuICBjb25zdCBleGl0Q29kZSA9IHlpZWxkKiBTaGVsbENvbW1hbmQubWFrZShmZm1wZWdDaGVja0NvbW1hbmQsIEZGTVBFR19CSU5BUlkpLnBpcGUoXG4gICAgU2hlbGxDb21tYW5kLnN0ZGVycihcInBpcGVcIiksXG4gICAgU2hlbGxDb21tYW5kLnN0ZG91dChcInBpcGVcIiksXG4gICAgU2hlbGxDb21tYW5kLmV4aXRDb2RlLFxuICAgIEVmZmVjdC5tYXBFcnJvcigoY2F1c2UpID0+IG5ldyBNaXNzaW5nRmZtcGVnKHsgY2F1c2UsIGNvbW1hbmQ6IEZGTVBFR19CSU5BUlkgfSkpXG4gIClcblxuICBpZiAoTnVtYmVyKGV4aXRDb2RlKSAhPT0gMCkge1xuICAgIHJldHVybiB5aWVsZCogbmV3IE1pc3NpbmdGZm1wZWcoeyBjb21tYW5kOiBGRk1QRUdfQklOQVJZIH0pXG4gIH1cbn0pXG5cbmV4cG9ydCBjb25zdCBzdGFydEZmbXBlZ1Byb2Nlc3MgPSAoXG4gIGZvcm1hdDogRmZtcGVnRm9ybWF0LFxuICB3aWR0aDogbnVtYmVyLFxuICBoZWlnaHQ6IG51bWJlcixcbiAgZnBzOiBudW1iZXIsXG4gIG91dHB1dFBhdGg6IHN0cmluZ1xuKSA9PlxuICBTaGVsbENvbW1hbmQubWFrZShGRk1QRUdfQklOQVJZLCAuLi5idWlsZEFyZ3MoZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBmcHMsIG91dHB1dFBhdGgpKS5waXBlKFxuICAgIFNoZWxsQ29tbWFuZC5zdGRpbihcInBpcGVcIiksXG4gICAgU2hlbGxDb21tYW5kLnN0ZG91dChcImluaGVyaXRcIiksXG4gICAgU2hlbGxDb21tYW5kLnN0ZGVycihcImluaGVyaXRcIiksXG4gICAgU2hlbGxDb21tYW5kLnN0YXJ0XG4gIClcbiIsCiAgICAiaW1wb3J0IHsgU3RyZWFtIH0gZnJvbSBcImVmZmVjdFwiXG5pbXBvcnQgdHlwZSB7IENhbnZhc0NvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCJcbmltcG9ydCB0eXBlIHsgUmVuZGVyQ29uZmlnLCBSZW5kZXJGcmFtZSwgU2NlbmUgfSBmcm9tIFwiLi90eXBlc1wiXG5pbXBvcnQgeyBibGVuZENvbG9ycyB9IGZyb20gXCIuL2NvbG9yXCJcbmltcG9ydCB7IHJlbmRlclNjZW5lVGV4dCB9IGZyb20gXCIuL3NjZW5lXCJcbmltcG9ydCB7XG4gIGJ1aWxkVHJhbnNpdGlvbkRpZmYsXG4gIGJ1aWxkVHJhbnNpdGlvblRva2VucyxcbiAgZWFzZUluT3V0Q3ViaWMsXG4gIHJlbmRlclRyYW5zaXRpb25Ub2tlbnMsXG59IGZyb20gXCIuL3RyYW5zaXRpb25cIlxuXG5leHBvcnQgY29uc3QgcmVuZGVyRnJhbWUgPSAoXG4gIGNvbmZpZzogUmVuZGVyQ29uZmlnLFxuICBjb250ZXh0OiBDYW52YXNDb250ZXh0LFxuICBmcmFtZVdpZHRoOiBudW1iZXIsXG4gIGZyYW1lSGVpZ2h0OiBudW1iZXIsXG4gIGZyYW1lOiBSZW5kZXJGcmFtZVxuKSA9PiB7XG4gIGNvbnN0IGZyYW1lQ29udGV4dCA9IGNvbnRleHRcbiAgY29uc3Qgc3RhcnRUcmFuc2Zvcm0gPSBmcmFtZUNvbnRleHQuZ2V0VHJhbnNmb3JtKClcbiAgaWYgKHR5cGVvZiBmcmFtZUNvbnRleHQuc2V0VHJhbnNmb3JtTWF0cml4ICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBmcmFtZUNvbnRleHQuc2V0VHJhbnNmb3JtTWF0cml4ID0gKHRyYW5zZm9ybSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIHRyYW5zZm9ybSAhPT0gbnVsbCAmJlxuICAgICAgICBcImFcIiBpbiB0cmFuc2Zvcm0gJiZcbiAgICAgICAgXCJiXCIgaW4gdHJhbnNmb3JtICYmXG4gICAgICAgIFwiY1wiIGluIHRyYW5zZm9ybSAmJlxuICAgICAgICBcImRcIiBpbiB0cmFuc2Zvcm0gJiZcbiAgICAgICAgXCJlXCIgaW4gdHJhbnNmb3JtICYmXG4gICAgICAgIFwiZlwiIGluIHRyYW5zZm9ybVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IG1hdHJpeCA9IHRyYW5zZm9ybSBhcyB7XG4gICAgICAgICAgYTogbnVtYmVyXG4gICAgICAgICAgYjogbnVtYmVyXG4gICAgICAgICAgYzogbnVtYmVyXG4gICAgICAgICAgZDogbnVtYmVyXG4gICAgICAgICAgZTogbnVtYmVyXG4gICAgICAgICAgZjogbnVtYmVyXG4gICAgICAgIH1cbiAgICAgICAgZnJhbWVDb250ZXh0LnNldFRyYW5zZm9ybShtYXRyaXguYSwgbWF0cml4LmIsIG1hdHJpeC5jLCBtYXRyaXguZCwgbWF0cml4LmUsIG1hdHJpeC5mKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZnJhbWVDb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBzdGFydEFscGhhID0gZnJhbWVDb250ZXh0Lmdsb2JhbEFscGhhXG4gIGNvbnN0IHN0YXJ0RmlsbFN0eWxlID0gZnJhbWVDb250ZXh0LmZpbGxTdHlsZVxuXG4gIGZyYW1lQ29udGV4dC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMClcbiAgZnJhbWVDb250ZXh0Lmdsb2JhbEFscGhhID0gMVxuICBmcmFtZUNvbnRleHQuZmlsbFN0eWxlID0gZnJhbWUuYmFja2dyb3VuZFxuICBmcmFtZUNvbnRleHQuZmlsbFJlY3QoMCwgMCwgZnJhbWVXaWR0aCwgZnJhbWVIZWlnaHQpXG5cbiAgaWYgKGZyYW1lLmtpbmQgPT09IFwic2NlbmVcIikge1xuICAgIHJlbmRlclNjZW5lVGV4dChcbiAgICAgIGNvbmZpZyxcbiAgICAgIGZyYW1lQ29udGV4dCxcbiAgICAgIGZyYW1lLnNjZW5lLFxuICAgICAgZnJhbWUub3BhY2l0eSxcbiAgICAgIGZyYW1lLnBvc2l0aW9uWCxcbiAgICAgIGZyYW1lLnBvc2l0aW9uWVxuICAgIClcbiAgfSBlbHNlIHtcbiAgICByZW5kZXJUcmFuc2l0aW9uVG9rZW5zKGNvbmZpZywgZnJhbWVDb250ZXh0LCBmcmFtZS50b2tlbnMpXG4gIH1cblxuICBpZiAodHlwZW9mIGZyYW1lQ29udGV4dC5zZXRUcmFuc2Zvcm1NYXRyaXggPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGZyYW1lQ29udGV4dC5zZXRUcmFuc2Zvcm1NYXRyaXgoc3RhcnRUcmFuc2Zvcm0pXG4gIH1cbiAgZnJhbWVDb250ZXh0Lmdsb2JhbEFscGhhID0gc3RhcnRBbHBoYVxuICBmcmFtZUNvbnRleHQuZmlsbFN0eWxlID0gc3RhcnRGaWxsU3R5bGVcbn1cblxuZXhwb3J0IGNvbnN0IGNvbXB1dGVGcmFtZUNvdW50cyA9IChcbiAgdHJhbnNpdGlvbkR1cmF0aW9uTXM6IG51bWJlcixcbiAgZnBzOiBudW1iZXIsXG4gIGJsb2NrRHVyYXRpb246IG51bWJlclxuKSA9PiB7XG4gIGNvbnN0IGZyYW1lRHVyYXRpb24gPSAxIC8gZnBzXG4gIGNvbnN0IGJsb2NrRnJhbWVzID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChibG9ja0R1cmF0aW9uICogZnBzKSlcbiAgY29uc3QgdHJhbnNpdGlvbkZyYW1lcyA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoKHRyYW5zaXRpb25EdXJhdGlvbk1zIC8gMTAwMCkgKiBmcHMpKVxuXG4gIHJldHVybiB7XG4gICAgYmxvY2tGcmFtZXMsXG4gICAgZnJhbWVEdXJhdGlvbixcbiAgICB0cmFuc2l0aW9uRnJhbWVzLFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBidWlsZFNjZW5lRnJhbWVzID0gKHNjZW5lOiBTY2VuZSwgYmxvY2tGcmFtZXM6IG51bWJlcikgPT5cbiAgU3RyZWFtLnJhbmdlKDEsIGJsb2NrRnJhbWVzKS5waXBlKFxuICAgIFN0cmVhbS5tYXAoXG4gICAgICAoKSA9PlxuICAgICAgICAoe1xuICAgICAgICAgIGJhY2tncm91bmQ6IHNjZW5lLmJhY2tncm91bmQsXG4gICAgICAgICAga2luZDogXCJzY2VuZVwiLFxuICAgICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgICAgcG9zaXRpb25YOiBzY2VuZS5ibG9ja1gsXG4gICAgICAgICAgcG9zaXRpb25ZOiBzY2VuZS5ibG9ja1ksXG4gICAgICAgICAgc2NlbmUsXG4gICAgICAgIH0pIHNhdGlzZmllcyBSZW5kZXJGcmFtZVxuICAgIClcbiAgKVxuXG5leHBvcnQgY29uc3QgYnVpbGRUcmFuc2l0aW9uRnJhbWVzID0gKFxuICBjb25maWc6IFJlbmRlckNvbmZpZyxcbiAgc2NlbmU6IFNjZW5lLFxuICBuZXh0U2NlbmU6IFNjZW5lLFxuICB0cmFuc2l0aW9uRnJhbWVzOiBudW1iZXJcbikgPT4ge1xuICBjb25zdCBkaWZmID0gYnVpbGRUcmFuc2l0aW9uRGlmZihzY2VuZSwgbmV4dFNjZW5lKVxuXG4gIHJldHVybiBTdHJlYW0ucmFuZ2UoMSwgdHJhbnNpdGlvbkZyYW1lcykucGlwZShcbiAgICBTdHJlYW0ubWFwKChpbmRleCkgPT4ge1xuICAgICAgY29uc3QgcmF3UHJvZ3Jlc3MgPSBpbmRleCAvIHRyYW5zaXRpb25GcmFtZXNcbiAgICAgIGNvbnN0IHByb2dyZXNzID0gZWFzZUluT3V0Q3ViaWMocmF3UHJvZ3Jlc3MpXG4gICAgICBjb25zdCBibGVuZGVkQmFja2dyb3VuZCA9IGJsZW5kQ29sb3JzKHNjZW5lLmJhY2tncm91bmQsIG5leHRTY2VuZS5iYWNrZ3JvdW5kLCBwcm9ncmVzcylcbiAgICAgIGNvbnN0IHRva2VucyA9IGJ1aWxkVHJhbnNpdGlvblRva2Vucyhjb25maWcsIGRpZmYsIHByb2dyZXNzKVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBiYWNrZ3JvdW5kOiBibGVuZGVkQmFja2dyb3VuZCxcbiAgICAgICAga2luZDogXCJ0cmFuc2l0aW9uXCIsXG4gICAgICAgIHRva2VucyxcbiAgICAgIH0gc2F0aXNmaWVzIFJlbmRlckZyYW1lXG4gICAgfSlcbiAgKVxufVxuXG5leHBvcnQgY29uc3QgYnVpbGRGcmFtZXNTdHJlYW0gPSAoXG4gIGNvbmZpZzogUmVuZGVyQ29uZmlnLFxuICBzY2VuZXM6IFNjZW5lW10sXG4gIGJsb2NrRnJhbWVzOiBudW1iZXIsXG4gIHRyYW5zaXRpb25GcmFtZXM6IG51bWJlclxuKSA9PlxuICBTdHJlYW0uZnJvbUl0ZXJhYmxlKHNjZW5lcykucGlwZShcbiAgICBTdHJlYW0uemlwV2l0aEluZGV4LFxuICAgIFN0cmVhbS5mbGF0TWFwKChbc2NlbmUsIGluZGV4XSkgPT4ge1xuICAgICAgY29uc3QgbmV4dFNjZW5lID0gc2NlbmVzW2luZGV4ICsgMV1cbiAgICAgIGNvbnN0IGJhc2UgPSBidWlsZFNjZW5lRnJhbWVzKHNjZW5lLCBibG9ja0ZyYW1lcylcbiAgICAgIHJldHVybiBuZXh0U2NlbmVcbiAgICAgICAgPyBTdHJlYW0uY29uY2F0KGJhc2UsIGJ1aWxkVHJhbnNpdGlvbkZyYW1lcyhjb25maWcsIHNjZW5lLCBuZXh0U2NlbmUsIHRyYW5zaXRpb25GcmFtZXMpKVxuICAgICAgICA6IGJhc2VcbiAgICB9KVxuICApXG4iLAogICAgImV4cG9ydCBjb25zdCBleHBhbmRTaG9ydEhleCA9IChoZXg6IHN0cmluZykgPT4ge1xuICBpZiAoaGV4Lmxlbmd0aCA9PT0gMykge1xuICAgIGNvbnN0IHIgPSBoZXguY2hhckF0KDApXG4gICAgY29uc3QgZyA9IGhleC5jaGFyQXQoMSlcbiAgICBjb25zdCBiID0gaGV4LmNoYXJBdCgyKVxuICAgIHJldHVybiByICsgciArIGcgKyBnICsgYiArIGJcbiAgfVxuICBpZiAoaGV4Lmxlbmd0aCA9PT0gNCkge1xuICAgIGNvbnN0IHIgPSBoZXguY2hhckF0KDApXG4gICAgY29uc3QgZyA9IGhleC5jaGFyQXQoMSlcbiAgICBjb25zdCBiID0gaGV4LmNoYXJBdCgyKVxuICAgIGNvbnN0IGEgPSBoZXguY2hhckF0KDMpXG4gICAgcmV0dXJuIHIgKyByICsgZyArIGcgKyBiICsgYiArIGEgKyBhXG4gIH1cbiAgcmV0dXJuIGhleFxufVxuXG5leHBvcnQgY29uc3QgcGFyc2VIZXhDb2xvciA9IChjb2xvcjogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBleHBhbmRTaG9ydEhleChjb2xvci5yZXBsYWNlKFwiI1wiLCBcIlwiKS50cmltKCkpXG4gIGlmIChub3JtYWxpemVkLmxlbmd0aCAhPT0gNiAmJiBub3JtYWxpemVkLmxlbmd0aCAhPT0gOCkge1xuICAgIHJldHVybiB7XG4gICAgICBhbHBoYTogMSxcbiAgICAgIGJsdWU6IDExLFxuICAgICAgZ3JlZW46IDExLFxuICAgICAgcmVkOiAxMSxcbiAgICB9XG4gIH1cblxuICBjb25zdCByZWQgPSBOdW1iZXIucGFyc2VJbnQobm9ybWFsaXplZC5zbGljZSgwLCAyKSwgMTYpXG4gIGNvbnN0IGdyZWVuID0gTnVtYmVyLnBhcnNlSW50KG5vcm1hbGl6ZWQuc2xpY2UoMiwgNCksIDE2KVxuICBjb25zdCBibHVlID0gTnVtYmVyLnBhcnNlSW50KG5vcm1hbGl6ZWQuc2xpY2UoNCwgNiksIDE2KVxuICBjb25zdCBhbHBoYSA9IG5vcm1hbGl6ZWQubGVuZ3RoID09PSA4ID8gTnVtYmVyLnBhcnNlSW50KG5vcm1hbGl6ZWQuc2xpY2UoNiwgOCksIDE2KSAvIDI1NSA6IDFcblxuICBpZiAoTnVtYmVyLmlzTmFOKHJlZCkgfHwgTnVtYmVyLmlzTmFOKGdyZWVuKSB8fCBOdW1iZXIuaXNOYU4oYmx1ZSkgfHwgTnVtYmVyLmlzTmFOKGFscGhhKSkge1xuICAgIHJldHVybiB7IGFscGhhOiAxLCBibHVlOiAxMSwgZ3JlZW46IDExLCByZWQ6IDExIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYWxwaGEsXG4gICAgYmx1ZSxcbiAgICBncmVlbixcbiAgICByZWQsXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGxlcnAgPSAoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHByb2dyZXNzOiBudW1iZXIpID0+XG4gIHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KSAqIHByb2dyZXNzXG5cbmV4cG9ydCBjb25zdCBibGVuZENvbG9ycyA9IChmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIHByb2dyZXNzOiBudW1iZXIpID0+IHtcbiAgY29uc3QgZnJvbUNvbG9yID0gcGFyc2VIZXhDb2xvcihmcm9tKVxuICBjb25zdCB0b0NvbG9yID0gcGFyc2VIZXhDb2xvcih0bylcblxuICBjb25zdCBibGVuZGVkID0ge1xuICAgIGFscGhhOiBsZXJwKGZyb21Db2xvci5hbHBoYSwgdG9Db2xvci5hbHBoYSwgcHJvZ3Jlc3MpLFxuICAgIGJsdWU6IGxlcnAoZnJvbUNvbG9yLmJsdWUsIHRvQ29sb3IuYmx1ZSwgcHJvZ3Jlc3MpLFxuICAgIGdyZWVuOiBsZXJwKGZyb21Db2xvci5ncmVlbiwgdG9Db2xvci5ncmVlbiwgcHJvZ3Jlc3MpLFxuICAgIHJlZDogbGVycChmcm9tQ29sb3IucmVkLCB0b0NvbG9yLnJlZCwgcHJvZ3Jlc3MpLFxuICB9XG5cbiAgcmV0dXJuIGByZ2JhKCR7TWF0aC5yb3VuZChibGVuZGVkLnJlZCl9LCAke01hdGgucm91bmQoYmxlbmRlZC5ncmVlbil9LCAke01hdGgucm91bmQoXG4gICAgYmxlbmRlZC5ibHVlXG4gICl9LCAke2JsZW5kZWQuYWxwaGEudG9GaXhlZCgzKX0pYFxufVxuIiwKICAgICJpbXBvcnQgeyBFZmZlY3QgfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCB7IGNvZGVUb1Rva2VucywgdHlwZSBCdW5kbGVkVGhlbWUsIHR5cGUgVGhlbWVkVG9rZW4gfSBmcm9tIFwic2hpa2lcIlxuaW1wb3J0IHR5cGUgeyBDYW52YXNDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiXG5pbXBvcnQgdHlwZSB7XG4gIENvZGVCbG9jayxcbiAgTGF5b3V0VG9rZW4sXG4gIFJlbmRlckNvbmZpZyxcbiAgU2NlbmUsXG4gIFNjZW5lTGF5b3V0LFxuICBUb2tlbkNhdGVnb3J5LFxufSBmcm9tIFwiLi90eXBlc1wiXG5pbXBvcnQge1xuICBGT05UX1NUWUxFX0JPTEQsXG4gIEZPTlRfU1RZTEVfSVRBTElDLFxuICBGT05UX1NUWUxFX05PTkUsXG4gIEZPTlRfU1RZTEVfVU5ERVJMSU5FLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuaW1wb3J0IHsgU2NlbmVNZWFzdXJlRmFpbGVkIH0gZnJvbSBcIi4vZXJyb3JzXCJcbmltcG9ydCB7IGJ1aWxkRm9udCwgZHJhd1VuZGVybGluZSB9IGZyb20gXCIuL3RleHRcIlxuaW1wb3J0IHsgY2F0ZWdvcml6ZVRva2VuIH0gZnJvbSBcIi4vdG9rZW5cIlxuXG5jb25zdCBub3JtYWxpemVUb2tlbkNvbnRlbnQgPSAoY29uZmlnOiBSZW5kZXJDb25maWcsIGNvbnRlbnQ6IHN0cmluZykgPT5cbiAgY29udGVudC5zcGxpdChcIlxcdFwiKS5qb2luKGNvbmZpZy50YWJSZXBsYWNlbWVudClcblxuY29uc3QgbWVhc3VyZVRva2VuV2lkdGggPSAoXG4gIGNvbmZpZzogUmVuZGVyQ29uZmlnLFxuICBjb250ZXh0OiBDYW52YXNDb250ZXh0LFxuICBjb250ZW50OiBzdHJpbmcsXG4gIGlzSXRhbGljOiBib29sZWFuLFxuICBpc0JvbGQ6IGJvb2xlYW5cbikgPT4ge1xuICBjb25zdCBtZWFzdXJlQ29udGV4dCA9IGNvbnRleHRcbiAgY29uc3QgcHJldmlvdXNGb250ID0gbWVhc3VyZUNvbnRleHQuZm9udFxuICBtZWFzdXJlQ29udGV4dC5mb250ID0gYnVpbGRGb250KGNvbmZpZywgaXNJdGFsaWMsIGlzQm9sZClcbiAgY29uc3Qgd2lkdGggPSBtZWFzdXJlQ29udGV4dC5tZWFzdXJlVGV4dChjb250ZW50KS53aWR0aFxuICBtZWFzdXJlQ29udGV4dC5mb250ID0gcHJldmlvdXNGb250XG4gIHJldHVybiB3aWR0aFxufVxuXG5jb25zdCByZXNvbHZlVG9rZW5DYXRlZ29yeSA9ICh0b2tlbjogVGhlbWVkVG9rZW4pID0+IHtcbiAgY29uc3Qgc2NvcGVzID1cbiAgICB0b2tlbi5leHBsYW5hdGlvbj8uZmxhdE1hcCgoZXhwbGFuYXRpb24pID0+XG4gICAgICBleHBsYW5hdGlvbi5zY29wZXMubWFwKChzY29wZSkgPT4gc2NvcGUuc2NvcGVOYW1lKVxuICAgICkgPz8gW11cbiAgcmV0dXJuIGNhdGVnb3JpemVUb2tlbihzY29wZXMpXG59XG5cbnR5cGUgTWVhc3VyZWRUb2tlbiA9IHtcbiAgY2F0ZWdvcnk6IFRva2VuQ2F0ZWdvcnlcbiAgY29sb3I6IHN0cmluZ1xuICBjb250ZW50OiBzdHJpbmdcbiAgZm9udFN0eWxlOiBudW1iZXJcbiAgd2lkdGg6IG51bWJlclxufVxuXG50eXBlIE1lYXN1cmVkTGluZSA9IHtcbiAgdG9rZW5zOiBNZWFzdXJlZFRva2VuW11cbiAgd2lkdGg6IG51bWJlclxufVxuXG5leHBvcnQgdHlwZSBNZWFzdXJlZFNjZW5lID0ge1xuICBiYWNrZ3JvdW5kOiBzdHJpbmdcbiAgYmxvY2tIZWlnaHQ6IG51bWJlclxuICBibG9ja1dpZHRoOiBudW1iZXJcbiAgY29udGVudEhlaWdodDogbnVtYmVyXG4gIGNvbnRlbnRXaWR0aDogbnVtYmVyXG4gIGZvcmVncm91bmQ6IHN0cmluZ1xuICBsaW5lczogTWVhc3VyZWRMaW5lW11cbiAgdG9rZW5zOiBUaGVtZWRUb2tlbltdW11cbn1cblxuZXhwb3J0IGNvbnN0IG1lYXN1cmVTY2VuZSA9IEVmZmVjdC5mbihmdW5jdGlvbiogbWVhc3VyZVNjZW5lKFxuICBjb25maWc6IFJlbmRlckNvbmZpZyxcbiAgY29udGV4dDogQ2FudmFzQ29udGV4dCxcbiAgY29kZUJsb2NrOiBDb2RlQmxvY2ssXG4gIHRoZW1lOiBCdW5kbGVkVGhlbWVcbikge1xuICByZXR1cm4geWllbGQqIEVmZmVjdC50cnlQcm9taXNlKHtcbiAgICBjYXRjaDogKGNhdXNlOiB1bmtub3duKSA9PiBuZXcgU2NlbmVNZWFzdXJlRmFpbGVkKHsgY2F1c2UgfSksXG4gICAgdHJ5OiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0b2tlblJlc3VsdCA9IGF3YWl0IGNvZGVUb1Rva2Vucyhjb2RlQmxvY2suY29kZSwge1xuICAgICAgICBpbmNsdWRlRXhwbGFuYXRpb246IFwic2NvcGVOYW1lXCIsXG4gICAgICAgIGxhbmc6IGNvZGVCbG9jay5sYW5ndWFnZSxcbiAgICAgICAgdGhlbWUsXG4gICAgICB9KVxuXG4gICAgICBjb25zdCB0b2tlbnMgPSB0b2tlblJlc3VsdC50b2tlbnNcbiAgICAgIGNvbnN0IGZvcmVncm91bmQgPSB0b2tlblJlc3VsdC5mZyA/PyBjb25maWcuZm9yZWdyb3VuZFxuICAgICAgY29uc3QgYmFja2dyb3VuZCA9IHRva2VuUmVzdWx0LmJnID8/IGNvbmZpZy5iYWNrZ3JvdW5kXG5cbiAgICAgIGNvbnN0IGxpbmVNZXRyaWNzID0gdG9rZW5zLm1hcCgobGluZVRva2VucykgPT4ge1xuICAgICAgICBjb25zdCBtZXRyaWNzOiBNZWFzdXJlZFRva2VuW10gPSBbXVxuICAgICAgICBsZXQgbGluZVdpZHRoID0gMFxuXG4gICAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgbGluZVRva2Vucykge1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBub3JtYWxpemVUb2tlbkNvbnRlbnQoY29uZmlnLCB0b2tlbi5jb250ZW50KVxuICAgICAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBzdHlsZUZsYWdzID0gdG9rZW4uZm9udFN0eWxlID8/IEZPTlRfU1RZTEVfTk9ORVxuICAgICAgICAgIGNvbnN0IGlzSXRhbGljID0gKHN0eWxlRmxhZ3MgJiBGT05UX1NUWUxFX0lUQUxJQykgPT09IEZPTlRfU1RZTEVfSVRBTElDXG4gICAgICAgICAgY29uc3QgaXNCb2xkID0gKHN0eWxlRmxhZ3MgJiBGT05UX1NUWUxFX0JPTEQpID09PSBGT05UX1NUWUxFX0JPTERcbiAgICAgICAgICBjb25zdCB3aWR0aCA9IG1lYXN1cmVUb2tlbldpZHRoKGNvbmZpZywgY29udGV4dCwgY29udGVudCwgaXNJdGFsaWMsIGlzQm9sZClcbiAgICAgICAgICBjb25zdCBjb2xvciA9IHRva2VuLmNvbG9yID8/IGZvcmVncm91bmRcblxuICAgICAgICAgIG1ldHJpY3MucHVzaCh7XG4gICAgICAgICAgICBjYXRlZ29yeTogcmVzb2x2ZVRva2VuQ2F0ZWdvcnkodG9rZW4pLFxuICAgICAgICAgICAgY29sb3IsXG4gICAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgICAgZm9udFN0eWxlOiBzdHlsZUZsYWdzLFxuICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBsaW5lV2lkdGggKz0gd2lkdGhcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9rZW5zOiBtZXRyaWNzLFxuICAgICAgICAgIHdpZHRoOiBsaW5lV2lkdGgsXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IG1heExpbmVXaWR0aCA9XG4gICAgICAgIGxpbmVNZXRyaWNzLmxlbmd0aCA+IDAgPyBNYXRoLm1heCguLi5saW5lTWV0cmljcy5tYXAoKGxpbmUpID0+IGxpbmUud2lkdGgpKSA6IDBcbiAgICAgIGNvbnN0IGNvbnRlbnRXaWR0aCA9IE1hdGgubWF4KDAsIG1heExpbmVXaWR0aClcbiAgICAgIGNvbnN0IGNvbnRlbnRIZWlnaHQgPSB0b2tlbnMubGVuZ3RoICogY29uZmlnLmxpbmVIZWlnaHRcbiAgICAgIGNvbnN0IGJsb2NrV2lkdGggPSBjb250ZW50V2lkdGggKyBjb25maWcucGFkZGluZyAqIDJcbiAgICAgIGNvbnN0IGJsb2NrSGVpZ2h0ID0gY29udGVudEhlaWdodCArIGNvbmZpZy5wYWRkaW5nICogMlxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBiYWNrZ3JvdW5kLFxuICAgICAgICBibG9ja0hlaWdodCxcbiAgICAgICAgYmxvY2tXaWR0aCxcbiAgICAgICAgY29udGVudEhlaWdodCxcbiAgICAgICAgY29udGVudFdpZHRoLFxuICAgICAgICBmb3JlZ3JvdW5kLFxuICAgICAgICBsaW5lczogbGluZU1ldHJpY3MsXG4gICAgICAgIHRva2VucyxcbiAgICAgIH0gc2F0aXNmaWVzIE1lYXN1cmVkU2NlbmVcbiAgICB9LFxuICB9KVxufSlcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVGcmFtZVNpemUgPSAoY29uZmlnOiBSZW5kZXJDb25maWcsIG1lYXN1cmVkU2NlbmVzOiBNZWFzdXJlZFNjZW5lW10pID0+IHtcbiAgY29uc3QgbWF4QmxvY2tXaWR0aCA9XG4gICAgbWVhc3VyZWRTY2VuZXMubGVuZ3RoID4gMCA/IE1hdGgubWF4KC4uLm1lYXN1cmVkU2NlbmVzLm1hcCgoc2NlbmUpID0+IHNjZW5lLmJsb2NrV2lkdGgpKSA6IDBcbiAgY29uc3QgbWF4QmxvY2tIZWlnaHQgPVxuICAgIG1lYXN1cmVkU2NlbmVzLmxlbmd0aCA+IDAgPyBNYXRoLm1heCguLi5tZWFzdXJlZFNjZW5lcy5tYXAoKHNjZW5lKSA9PiBzY2VuZS5ibG9ja0hlaWdodCkpIDogMFxuXG4gIHJldHVybiB7XG4gICAgaGVpZ2h0OiBNYXRoLm1heChjb25maWcuaGVpZ2h0LCBNYXRoLmNlaWwobWF4QmxvY2tIZWlnaHQpKSxcbiAgICB3aWR0aDogTWF0aC5tYXgoY29uZmlnLndpZHRoLCBNYXRoLmNlaWwobWF4QmxvY2tXaWR0aCkpLFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsYXlvdXRTY2VuZSA9IChcbiAgY29uZmlnOiBSZW5kZXJDb25maWcsXG4gIG1lYXN1cmVkOiBNZWFzdXJlZFNjZW5lLFxuICBmcmFtZVdpZHRoOiBudW1iZXIsXG4gIGZyYW1lSGVpZ2h0OiBudW1iZXJcbik6IFNjZW5lID0+IHtcbiAgY29uc3QgYmxvY2tYID0gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZCgoZnJhbWVXaWR0aCAtIG1lYXN1cmVkLmJsb2NrV2lkdGgpIC8gMikpXG4gIGNvbnN0IGJsb2NrWSA9IE1hdGgubWF4KDAsIE1hdGgucm91bmQoKGZyYW1lSGVpZ2h0IC0gbWVhc3VyZWQuYmxvY2tIZWlnaHQpIC8gMikpXG5cbiAgY29uc3QgbGF5b3V0OiBTY2VuZUxheW91dCA9IHtcbiAgICBsaW5lczogbWVhc3VyZWQubGluZXMubWFwKChsaW5lLCBsaW5lSW5kZXgpID0+IHtcbiAgICAgIGxldCBjdXJzb3JYID0gYmxvY2tYICsgY29uZmlnLnBhZGRpbmdcbiAgICAgIGNvbnN0IGN1cnNvclkgPSBibG9ja1kgKyBjb25maWcucGFkZGluZyArIGxpbmVJbmRleCAqIGNvbmZpZy5saW5lSGVpZ2h0XG4gICAgICBjb25zdCBsYXlvdXRUb2tlbnM6IExheW91dFRva2VuW10gPSBsaW5lLnRva2Vucy5tYXAoKHRva2VuKSA9PiB7XG4gICAgICAgIGNvbnN0IGxheW91dFRva2VuID0ge1xuICAgICAgICAgIC4uLnRva2VuLFxuICAgICAgICAgIHg6IGN1cnNvclgsXG4gICAgICAgICAgeTogY3Vyc29yWSxcbiAgICAgICAgfVxuICAgICAgICBjdXJzb3JYICs9IHRva2VuLndpZHRoXG4gICAgICAgIHJldHVybiBsYXlvdXRUb2tlblxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9rZW5zOiBsYXlvdXRUb2tlbnMsXG4gICAgICB9XG4gICAgfSksXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJhY2tncm91bmQ6IG1lYXN1cmVkLmJhY2tncm91bmQsXG4gICAgYmxvY2tYLFxuICAgIGJsb2NrWSxcbiAgICBjb250ZW50SGVpZ2h0OiBtZWFzdXJlZC5jb250ZW50SGVpZ2h0LFxuICAgIGNvbnRlbnRXaWR0aDogbWVhc3VyZWQuY29udGVudFdpZHRoLFxuICAgIGZvcmVncm91bmQ6IG1lYXN1cmVkLmZvcmVncm91bmQsXG4gICAgbGF5b3V0LFxuICAgIHRva2VuczogbWVhc3VyZWQudG9rZW5zLFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZW5kZXJTY2VuZVRleHQgPSAoXG4gIGNvbmZpZzogUmVuZGVyQ29uZmlnLFxuICBjb250ZXh0OiBDYW52YXNDb250ZXh0LFxuICBzY2VuZTogU2NlbmUsXG4gIG9wYWNpdHk6IG51bWJlcixcbiAgYmxvY2tYOiBudW1iZXIsXG4gIGJsb2NrWTogbnVtYmVyXG4pID0+IHtcbiAgaWYgKG9wYWNpdHkgPD0gMCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgdGV4dENvbnRleHQgPSBjb250ZXh0XG4gIGNvbnN0IHN0YXJ0WCA9IGJsb2NrWCArIGNvbmZpZy5wYWRkaW5nXG4gIGNvbnN0IHN0YXJ0WSA9IGJsb2NrWSArIGNvbmZpZy5wYWRkaW5nXG4gIGNvbnN0IHByZXZpb3VzQWxwaGEgPSB0ZXh0Q29udGV4dC5nbG9iYWxBbHBoYVxuICBjb25zdCBwcmV2aW91c0Jhc2VsaW5lID0gdGV4dENvbnRleHQudGV4dEJhc2VsaW5lXG4gIGNvbnN0IHByZXZpb3VzQWxpZ24gPSB0ZXh0Q29udGV4dC50ZXh0QWxpZ25cbiAgY29uc3QgcHJldmlvdXNGb250ID0gdGV4dENvbnRleHQuZm9udFxuICBjb25zdCBwcmV2aW91c0ZpbGxTdHlsZSA9IHRleHRDb250ZXh0LmZpbGxTdHlsZVxuXG4gIHRleHRDb250ZXh0Lmdsb2JhbEFscGhhID0gb3BhY2l0eVxuICB0ZXh0Q29udGV4dC50ZXh0QmFzZWxpbmUgPSBcInRvcFwiXG4gIHRleHRDb250ZXh0LnRleHRBbGlnbiA9IFwibGVmdFwiXG5cbiAgZm9yIChsZXQgbGluZUluZGV4ID0gMDsgbGluZUluZGV4IDwgc2NlbmUudG9rZW5zLmxlbmd0aDsgbGluZUluZGV4ICs9IDEpIHtcbiAgICBjb25zdCBsaW5lVG9rZW5zID0gc2NlbmUudG9rZW5zW2xpbmVJbmRleF0gPz8gW11cbiAgICBsZXQgY3Vyc29yWCA9IHN0YXJ0WFxuICAgIGNvbnN0IGN1cnNvclkgPSBzdGFydFkgKyBsaW5lSW5kZXggKiBjb25maWcubGluZUhlaWdodFxuXG4gICAgZm9yIChjb25zdCB0b2tlbiBvZiBsaW5lVG9rZW5zKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gbm9ybWFsaXplVG9rZW5Db250ZW50KGNvbmZpZywgdG9rZW4uY29udGVudClcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBmb250U3R5bGUgPSB0b2tlbi5mb250U3R5bGUgPz8gRk9OVF9TVFlMRV9OT05FXG4gICAgICBjb25zdCBpc0l0YWxpYyA9IChmb250U3R5bGUgJiBGT05UX1NUWUxFX0lUQUxJQykgPT09IEZPTlRfU1RZTEVfSVRBTElDXG4gICAgICBjb25zdCBpc0JvbGQgPSAoZm9udFN0eWxlICYgRk9OVF9TVFlMRV9CT0xEKSA9PT0gRk9OVF9TVFlMRV9CT0xEXG4gICAgICBjb25zdCBpc1VuZGVybGluZSA9IChmb250U3R5bGUgJiBGT05UX1NUWUxFX1VOREVSTElORSkgPT09IEZPTlRfU1RZTEVfVU5ERVJMSU5FXG5cbiAgICAgIHRleHRDb250ZXh0LmZvbnQgPSBidWlsZEZvbnQoY29uZmlnLCBpc0l0YWxpYywgaXNCb2xkKVxuICAgICAgdGV4dENvbnRleHQuZmlsbFN0eWxlID0gdG9rZW4uY29sb3IgPz8gc2NlbmUuZm9yZWdyb3VuZFxuICAgICAgdGV4dENvbnRleHQuZmlsbFRleHQoY29udGVudCwgY3Vyc29yWCwgY3Vyc29yWSlcblxuICAgICAgY29uc3QgdG9rZW5XaWR0aCA9IHRleHRDb250ZXh0Lm1lYXN1cmVUZXh0KGNvbnRlbnQpLndpZHRoXG5cbiAgICAgIGlmIChpc1VuZGVybGluZSkge1xuICAgICAgICBkcmF3VW5kZXJsaW5lKGNvbmZpZywgdGV4dENvbnRleHQsIGN1cnNvclgsIGN1cnNvclksIHRva2VuV2lkdGgpXG4gICAgICB9XG5cbiAgICAgIGN1cnNvclggKz0gdG9rZW5XaWR0aFxuICAgIH1cbiAgfVxuXG4gIHRleHRDb250ZXh0Lmdsb2JhbEFscGhhID0gcHJldmlvdXNBbHBoYVxuICB0ZXh0Q29udGV4dC50ZXh0QmFzZWxpbmUgPSBwcmV2aW91c0Jhc2VsaW5lXG4gIHRleHRDb250ZXh0LnRleHRBbGlnbiA9IHByZXZpb3VzQWxpZ25cbiAgdGV4dENvbnRleHQuZm9udCA9IHByZXZpb3VzRm9udFxuICB0ZXh0Q29udGV4dC5maWxsU3R5bGUgPSBwcmV2aW91c0ZpbGxTdHlsZVxufVxuIiwKICAgICJleHBvcnQgY29uc3QgRk9OVF9TVFlMRV9OT05FID0gMFxuZXhwb3J0IGNvbnN0IEZPTlRfU1RZTEVfSVRBTElDID0gMVxuZXhwb3J0IGNvbnN0IEZPTlRfU1RZTEVfQk9MRCA9IDJcbmV4cG9ydCBjb25zdCBGT05UX1NUWUxFX1VOREVSTElORSA9IDRcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDYW52YXNDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiXG5pbXBvcnQgdHlwZSB7IFJlbmRlckNvbmZpZyB9IGZyb20gXCIuL3R5cGVzXCJcblxuZXhwb3J0IGNvbnN0IGJ1aWxkRm9udCA9IChjb25maWc6IFJlbmRlckNvbmZpZywgaXNJdGFsaWM6IGJvb2xlYW4sIGlzQm9sZDogYm9vbGVhbikgPT4ge1xuICBjb25zdCBzdHlsZSA9IGAke2lzSXRhbGljID8gXCJpdGFsaWMgXCIgOiBcIlwifSR7aXNCb2xkID8gXCJib2xkIFwiIDogXCJcIn1gXG4gIHJldHVybiBgJHtzdHlsZX0ke2NvbmZpZy5mb250U2l6ZX1weCAke2NvbmZpZy5mb250RmFtaWx5fWBcbn1cblxuZXhwb3J0IGNvbnN0IGRyYXdVbmRlcmxpbmUgPSAoXG4gIGNvbmZpZzogUmVuZGVyQ29uZmlnLFxuICBjb250ZXh0OiBDYW52YXNDb250ZXh0LFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgd2lkdGg6IG51bWJlclxuKSA9PiB7XG4gIGNvbnN0IGRyYXdDb250ZXh0ID0gY29udGV4dFxuICBjb25zdCBwcmV2aW91c1N0cm9rZVN0eWxlID0gZHJhd0NvbnRleHQuc3Ryb2tlU3R5bGVcbiAgY29uc3QgcHJldmlvdXNMaW5lV2lkdGggPSBkcmF3Q29udGV4dC5saW5lV2lkdGhcbiAgY29uc3QgdW5kZXJsaW5lWSA9IHkgKyBjb25maWcuZm9udFNpemUgKyAyXG5cbiAgZHJhd0NvbnRleHQuc3Ryb2tlU3R5bGUgPSBkcmF3Q29udGV4dC5maWxsU3R5bGVcbiAgZHJhd0NvbnRleHQubGluZVdpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihjb25maWcuZm9udFNpemUgLyAxMikpXG4gIGRyYXdDb250ZXh0LmJlZ2luUGF0aCgpXG4gIGRyYXdDb250ZXh0Lm1vdmVUbyh4LCB1bmRlcmxpbmVZKVxuICBkcmF3Q29udGV4dC5saW5lVG8oeCArIHdpZHRoLCB1bmRlcmxpbmVZKVxuICBkcmF3Q29udGV4dC5zdHJva2UoKVxuXG4gIGRyYXdDb250ZXh0LnN0cm9rZVN0eWxlID0gcHJldmlvdXNTdHJva2VTdHlsZVxuICBkcmF3Q29udGV4dC5saW5lV2lkdGggPSBwcmV2aW91c0xpbmVXaWR0aFxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFRva2VuQ2F0ZWdvcnkgfSBmcm9tIFwiLi90eXBlc1wiXG5cbmNvbnN0IFNDT1BFX1RPX0NBVEVHT1JZOiBBcnJheTxbUmVnRXhwLCBUb2tlbkNhdGVnb3J5XT4gPSBbXG4gIFsvXmtleXdvcmRcXC5vcGVyYXRvci8sIFwib3BlcmF0b3JcIl0sXG4gIFsvXmtleXdvcmRcXC4vLCBcImtleXdvcmRcIl0sXG4gIFsvXnN0b3JhZ2VcXC50eXBlLywgXCJrZXl3b3JkXCJdLFxuICBbL15zdG9yYWdlXFwubW9kaWZpZXIvLCBcImtleXdvcmRcIl0sXG4gIFsvXmVudGl0eVxcLm5hbWVcXC5mdW5jdGlvbi8sIFwiZnVuY3Rpb25cIl0sXG4gIFsvXmVudGl0eVxcLm5hbWVcXC50eXBlLywgXCJ0eXBlXCJdLFxuICBbL15lbnRpdHlcXC5uYW1lXFwuY2xhc3MvLCBcInR5cGVcIl0sXG4gIFsvXnN0cmluZ1xcLi8sIFwic3RyaW5nXCJdLFxuICBbL15jb25zdGFudFxcLm51bWVyaWMvLCBcIm51bWJlclwiXSxcbiAgWy9eY29tbWVudFxcLi8sIFwiY29tbWVudFwiXSxcbiAgWy9ecHVuY3R1YXRpb25cXC4vLCBcInB1bmN0dWF0aW9uXCJdLFxuICBbL15tZXRhXFwuYnJhY2UvLCBcInB1bmN0dWF0aW9uXCJdLFxuICBbL152YXJpYWJsZVxcLi8sIFwiaWRlbnRpZmllclwiXSxcbiAgWy9eZW50aXR5XFwubmFtZVxcLi8sIFwiaWRlbnRpZmllclwiXSxcbl1cblxuZXhwb3J0IGNvbnN0IGNhdGVnb3JpemVUb2tlbiA9IChzY29wZXM6IHN0cmluZ1tdKTogVG9rZW5DYXRlZ29yeSA9PiB7XG4gIGZvciAoY29uc3Qgc2NvcGUgb2Ygc2NvcGVzKSB7XG4gICAgaWYgKCFzY29wZSkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHNjb3BlLnN0YXJ0c1dpdGgoXCJzdHJpbmcuXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIlxuICAgIH1cbiAgICBpZiAoc2NvcGUuc3RhcnRzV2l0aChcInB1bmN0dWF0aW9uLmRlZmluaXRpb24uc3RyaW5nXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIlxuICAgIH1cbiAgfVxuXG4gIGZvciAobGV0IGluZGV4ID0gc2NvcGVzLmxlbmd0aCAtIDE7IGluZGV4ID49IDA7IGluZGV4IC09IDEpIHtcbiAgICBjb25zdCBzY29wZSA9IHNjb3Blc1tpbmRleF1cbiAgICBpZiAoIXNjb3BlKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtwYXR0ZXJuLCBjYXRlZ29yeV0gb2YgU0NPUEVfVE9fQ0FURUdPUlkpIHtcbiAgICAgIGlmIChwYXR0ZXJuLnRlc3Qoc2NvcGUpKSB7XG4gICAgICAgIHJldHVybiBjYXRlZ29yeVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gXCJvdGhlclwiXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2FudmFzQ29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRcIlxuaW1wb3J0IHR5cGUgeyBEcmF3VG9rZW4sIExheW91dFRva2VuLCBSZW5kZXJDb25maWcsIFNjZW5lLCBUcmFuc2l0aW9uRGlmZiB9IGZyb20gXCIuL3R5cGVzXCJcbmltcG9ydCB7IGJsZW5kQ29sb3JzLCBsZXJwIH0gZnJvbSBcIi4vY29sb3JcIlxuaW1wb3J0IHsgRk9OVF9TVFlMRV9CT0xELCBGT05UX1NUWUxFX0lUQUxJQywgRk9OVF9TVFlMRV9VTkRFUkxJTkUgfSBmcm9tIFwiLi9jb25zdGFudHNcIlxuaW1wb3J0IHsgYnVpbGRGb250LCBkcmF3VW5kZXJsaW5lIH0gZnJvbSBcIi4vdGV4dFwiXG5cbmNvbnN0IGJ1aWxkRXhhY3RLZXkgPSAodG9rZW46IExheW91dFRva2VuKSA9PiBgZXhhY3Q6OiR7dG9rZW4uY29udGVudH06OiR7dG9rZW4uZm9udFN0eWxlfWBcbmNvbnN0IGJ1aWxkQ2F0ZWdvcnlLZXkgPSAodG9rZW46IExheW91dFRva2VuKSA9PiBgY2F0ZWdvcnk6OiR7dG9rZW4uY2F0ZWdvcnl9YFxuXG5jb25zdCBidWlsZFRva2VuU2VxdWVuY2UgPSAodG9rZW5zOiBMYXlvdXRUb2tlbltdLCBidWlsZEtleTogKHRva2VuOiBMYXlvdXRUb2tlbikgPT4gc3RyaW5nKSA9PlxuICB0b2tlbnMubWFwKCh0b2tlbikgPT4gKHtcbiAgICBrZXk6IGJ1aWxkS2V5KHRva2VuKSxcbiAgICB0b2tlbixcbiAgfSkpXG5cbnR5cGUgVG9rZW5XaXRoSW5kZXggPSB7XG4gIGluZGV4OiBudW1iZXJcbiAgdG9rZW46IExheW91dFRva2VuXG59XG5cbmNvbnN0IGdyb3VwQnlLZXkgPSAodG9rZW5zOiBMYXlvdXRUb2tlbltdLCBidWlsZEtleTogKHRva2VuOiBMYXlvdXRUb2tlbikgPT4gc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGdyb3VwZWQgPSBuZXcgTWFwPHN0cmluZywgVG9rZW5XaXRoSW5kZXhbXT4oKVxuICB0b2tlbnMuZm9yRWFjaCgodG9rZW4sIGluZGV4KSA9PiB7XG4gICAgY29uc3Qga2V5ID0gYnVpbGRLZXkodG9rZW4pXG4gICAgY29uc3QgZ3JvdXAgPSBncm91cGVkLmdldChrZXkpID8/IFtdXG4gICAgZ3JvdXAucHVzaCh7IGluZGV4LCB0b2tlbiB9KVxuICAgIGdyb3VwZWQuc2V0KGtleSwgZ3JvdXApXG4gIH0pXG4gIHJldHVybiBncm91cGVkXG59XG5cbmNvbnN0IGRpZmZCeUtleSA9IChcbiAgZnJvbVRva2VuczogTGF5b3V0VG9rZW5bXSxcbiAgdG9Ub2tlbnM6IExheW91dFRva2VuW10sXG4gIGJ1aWxkS2V5OiAodG9rZW46IExheW91dFRva2VuKSA9PiBzdHJpbmdcbikgPT4ge1xuICBjb25zdCBmcm9tSXRlbXMgPSBidWlsZFRva2VuU2VxdWVuY2UoZnJvbVRva2VucywgYnVpbGRLZXkpXG4gIGNvbnN0IHRvSXRlbXMgPSBidWlsZFRva2VuU2VxdWVuY2UodG9Ub2tlbnMsIGJ1aWxkS2V5KVxuICBjb25zdCBmcm9tS2V5cyA9IGZyb21JdGVtcy5tYXAoKGl0ZW0pID0+IGl0ZW0ua2V5KVxuICBjb25zdCB0b0tleXMgPSB0b0l0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5rZXkpXG4gIGNvbnN0IG1hdHJpeCA9IEFycmF5LmZyb20oeyBsZW5ndGg6IGZyb21LZXlzLmxlbmd0aCArIDEgfSwgKCkgPT5cbiAgICBBcnJheS5mcm9tKHsgbGVuZ3RoOiB0b0tleXMubGVuZ3RoICsgMSB9LCAoKSA9PiAwKVxuICApXG5cbiAgZm9yIChsZXQgaSA9IGZyb21LZXlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgY29uc3Qgcm93ID0gbWF0cml4W2ldXG4gICAgaWYgKCFyb3cpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgZm9yIChsZXQgaiA9IHRvS2V5cy5sZW5ndGggLSAxOyBqID49IDA7IGogLT0gMSkge1xuICAgICAgY29uc3QgZnJvbUtleSA9IGZyb21LZXlzW2ldID8/IFwiXCJcbiAgICAgIGNvbnN0IHRvS2V5ID0gdG9LZXlzW2pdID8/IFwiXCJcblxuICAgICAgaWYgKGZyb21LZXkgPT09IHRvS2V5KSB7XG4gICAgICAgIHJvd1tqXSA9IChtYXRyaXhbaSArIDFdPy5baiArIDFdID8/IDApICsgMVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV4dFJvdyA9IG1hdHJpeFtpICsgMV1cbiAgICAgICAgY29uc3QgY3VycmVudFJvdyA9IG1hdHJpeFtpXVxuICAgICAgICByb3dbal0gPSBNYXRoLm1heChuZXh0Um93Py5bal0gPz8gMCwgY3VycmVudFJvdz8uW2ogKyAxXSA/PyAwKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1hdGNoZXM6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+ID0gW11cbiAgbGV0IGkgPSAwXG4gIGxldCBqID0gMFxuXG4gIHdoaWxlIChpIDwgZnJvbUtleXMubGVuZ3RoICYmIGogPCB0b0tleXMubGVuZ3RoKSB7XG4gICAgY29uc3QgZnJvbUtleSA9IGZyb21LZXlzW2ldID8/IFwiXCJcbiAgICBjb25zdCB0b0tleSA9IHRvS2V5c1tqXSA/PyBcIlwiXG5cbiAgICBpZiAoZnJvbUtleSA9PT0gdG9LZXkpIHtcbiAgICAgIG1hdGNoZXMucHVzaChbaSwgal0pXG4gICAgICBpICs9IDFcbiAgICAgIGogKz0gMVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCBza2lwRnJvbSA9IG1hdHJpeFtpICsgMV0/LltqXSA/PyAwXG4gICAgY29uc3Qgc2tpcFRvID0gbWF0cml4W2ldPy5baiArIDFdID8/IDBcblxuICAgIGlmIChza2lwRnJvbSA+PSBza2lwVG8pIHtcbiAgICAgIGkgKz0gMVxuICAgIH0gZWxzZSB7XG4gICAgICBqICs9IDFcbiAgICB9XG4gIH1cblxuICBjb25zdCBtYXRjaGVkRnJvbSA9IG5ldyBTZXQobWF0Y2hlcy5tYXAoKFtpbmRleF0pID0+IGluZGV4KSlcbiAgY29uc3QgbWF0Y2hlZFRvID0gbmV3IFNldChtYXRjaGVzLm1hcCgoWywgaW5kZXhdKSA9PiBpbmRleCkpXG5cbiAgY29uc3QgbWF0Y2hlZCA9IG1hdGNoZXMuZmxhdE1hcCgoW2Zyb21JbmRleCwgdG9JbmRleF0pID0+IHtcbiAgICBjb25zdCBmcm9tSXRlbSA9IGZyb21JdGVtc1tmcm9tSW5kZXhdXG4gICAgY29uc3QgdG9JdGVtID0gdG9JdGVtc1t0b0luZGV4XVxuXG4gICAgaWYgKCFmcm9tSXRlbSB8fCAhdG9JdGVtKSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG5cbiAgICByZXR1cm4gW3sgZnJvbTogZnJvbUl0ZW0udG9rZW4sIHRvOiB0b0l0ZW0udG9rZW4gfV1cbiAgfSlcblxuICByZXR1cm4ge1xuICAgIGFkZGVkOiB0b0l0ZW1zLmZpbHRlcigoXywgaW5kZXgpID0+ICFtYXRjaGVkVG8uaGFzKGluZGV4KSkubWFwKChpdGVtKSA9PiBpdGVtLnRva2VuKSxcbiAgICBtYXRjaGVkLFxuICAgIHJlbW92ZWQ6IGZyb21JdGVtcy5maWx0ZXIoKF8sIGluZGV4KSA9PiAhbWF0Y2hlZEZyb20uaGFzKGluZGV4KSkubWFwKChpdGVtKSA9PiBpdGVtLnRva2VuKSxcbiAgfVxufVxuXG5jb25zdCBtYXRjaEJ5Q2F0ZWdvcnkgPSAocmVtb3ZlZDogTGF5b3V0VG9rZW5bXSwgYWRkZWQ6IExheW91dFRva2VuW10pID0+IHtcbiAgY29uc3QgbWF0Y2hlZDogQXJyYXk8eyBmcm9tOiBMYXlvdXRUb2tlbjsgdG86IExheW91dFRva2VuIH0+ID0gW11cbiAgY29uc3QgdXNlZEZyb20gPSBuZXcgU2V0PG51bWJlcj4oKVxuICBjb25zdCB1c2VkVG8gPSBuZXcgU2V0PG51bWJlcj4oKVxuICBjb25zdCByZW1vdmVkQnlDYXRlZ29yeSA9IGdyb3VwQnlLZXkocmVtb3ZlZCwgYnVpbGRDYXRlZ29yeUtleSlcbiAgY29uc3QgYWRkZWRCeUNhdGVnb3J5ID0gZ3JvdXBCeUtleShhZGRlZCwgYnVpbGRDYXRlZ29yeUtleSlcblxuICBmb3IgKGNvbnN0IFtjYXRlZ29yeUtleSwgZnJvbUdyb3VwXSBvZiByZW1vdmVkQnlDYXRlZ29yeSkge1xuICAgIGNvbnN0IHRvR3JvdXAgPSBhZGRlZEJ5Q2F0ZWdvcnkuZ2V0KGNhdGVnb3J5S2V5KSA/PyBbXVxuXG4gICAgZm9yIChjb25zdCBmcm9tRW50cnkgb2YgZnJvbUdyb3VwKSB7XG4gICAgICBpZiAodXNlZEZyb20uaGFzKGZyb21FbnRyeS5pbmRleCkpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbGV0IGJlc3RNYXRjaDogVG9rZW5XaXRoSW5kZXggfCBudWxsID0gbnVsbFxuICAgICAgbGV0IGJlc3REaXN0YW5jZSA9IEluZmluaXR5XG5cbiAgICAgIGZvciAoY29uc3QgdG9FbnRyeSBvZiB0b0dyb3VwKSB7XG4gICAgICAgIGlmICh1c2VkVG8uaGFzKHRvRW50cnkuaW5kZXgpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID1cbiAgICAgICAgICBNYXRoLmFicyhmcm9tRW50cnkudG9rZW4ueSAtIHRvRW50cnkudG9rZW4ueSkgKiAxMDAwICtcbiAgICAgICAgICBNYXRoLmFicyhmcm9tRW50cnkudG9rZW4ueCAtIHRvRW50cnkudG9rZW4ueClcblxuICAgICAgICBpZiAoZGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBkaXN0YW5jZVxuICAgICAgICAgIGJlc3RNYXRjaCA9IHRvRW50cnlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYmVzdE1hdGNoKSB7XG4gICAgICAgIG1hdGNoZWQucHVzaCh7IGZyb206IGZyb21FbnRyeS50b2tlbiwgdG86IGJlc3RNYXRjaC50b2tlbiB9KVxuICAgICAgICB1c2VkRnJvbS5hZGQoZnJvbUVudHJ5LmluZGV4KVxuICAgICAgICB1c2VkVG8uYWRkKGJlc3RNYXRjaC5pbmRleClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1hdGNoZWQsXG4gICAgc3RpbGxBZGRlZDogYWRkZWQuZmlsdGVyKChfLCBpbmRleCkgPT4gIXVzZWRUby5oYXMoaW5kZXgpKSxcbiAgICBzdGlsbFJlbW92ZWQ6IHJlbW92ZWQuZmlsdGVyKChfLCBpbmRleCkgPT4gIXVzZWRGcm9tLmhhcyhpbmRleCkpLFxuICB9XG59XG5cbmNvbnN0IG1hdGNoQnlFeGFjdENvbnRlbnQgPSAocmVtb3ZlZDogTGF5b3V0VG9rZW5bXSwgYWRkZWQ6IExheW91dFRva2VuW10pID0+IHtcbiAgY29uc3QgbWF0Y2hlZDogQXJyYXk8eyBmcm9tOiBMYXlvdXRUb2tlbjsgdG86IExheW91dFRva2VuIH0+ID0gW11cbiAgY29uc3QgdXNlZEZyb20gPSBuZXcgU2V0PG51bWJlcj4oKVxuICBjb25zdCB1c2VkVG8gPSBuZXcgU2V0PG51bWJlcj4oKVxuICBjb25zdCByZW1vdmVkQnlDb250ZW50ID0gZ3JvdXBCeUtleShyZW1vdmVkLCBidWlsZEV4YWN0S2V5KVxuICBjb25zdCBhZGRlZEJ5Q29udGVudCA9IGdyb3VwQnlLZXkoYWRkZWQsIGJ1aWxkRXhhY3RLZXkpXG5cbiAgZm9yIChjb25zdCBbY29udGVudEtleSwgZnJvbUdyb3VwXSBvZiByZW1vdmVkQnlDb250ZW50KSB7XG4gICAgY29uc3QgdG9Hcm91cCA9IGFkZGVkQnlDb250ZW50LmdldChjb250ZW50S2V5KSA/PyBbXVxuXG4gICAgZm9yIChjb25zdCBmcm9tRW50cnkgb2YgZnJvbUdyb3VwKSB7XG4gICAgICBpZiAodXNlZEZyb20uaGFzKGZyb21FbnRyeS5pbmRleCkpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbGV0IGJlc3RNYXRjaDogVG9rZW5XaXRoSW5kZXggfCBudWxsID0gbnVsbFxuICAgICAgbGV0IGJlc3REaXN0YW5jZSA9IEluZmluaXR5XG5cbiAgICAgIGZvciAoY29uc3QgdG9FbnRyeSBvZiB0b0dyb3VwKSB7XG4gICAgICAgIGlmICh1c2VkVG8uaGFzKHRvRW50cnkuaW5kZXgpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID1cbiAgICAgICAgICBNYXRoLmFicyhmcm9tRW50cnkudG9rZW4ueSAtIHRvRW50cnkudG9rZW4ueSkgKiAxMDAwICtcbiAgICAgICAgICBNYXRoLmFicyhmcm9tRW50cnkudG9rZW4ueCAtIHRvRW50cnkudG9rZW4ueClcblxuICAgICAgICBpZiAoZGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBkaXN0YW5jZVxuICAgICAgICAgIGJlc3RNYXRjaCA9IHRvRW50cnlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYmVzdE1hdGNoKSB7XG4gICAgICAgIG1hdGNoZWQucHVzaCh7IGZyb206IGZyb21FbnRyeS50b2tlbiwgdG86IGJlc3RNYXRjaC50b2tlbiB9KVxuICAgICAgICB1c2VkRnJvbS5hZGQoZnJvbUVudHJ5LmluZGV4KVxuICAgICAgICB1c2VkVG8uYWRkKGJlc3RNYXRjaC5pbmRleClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1hdGNoZWQsXG4gICAgc3RpbGxBZGRlZDogYWRkZWQuZmlsdGVyKChfLCBpbmRleCkgPT4gIXVzZWRUby5oYXMoaW5kZXgpKSxcbiAgICBzdGlsbFJlbW92ZWQ6IHJlbW92ZWQuZmlsdGVyKChfLCBpbmRleCkgPT4gIXVzZWRGcm9tLmhhcyhpbmRleCkpLFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBmbGF0dGVuU2NlbmVUb2tlbnMgPSAoc2NlbmU6IFNjZW5lKSA9PlxuICBzY2VuZS5sYXlvdXQubGluZXMuZmxhdE1hcCgobGluZSkgPT4gbGluZS50b2tlbnMpXG5cbmV4cG9ydCBjb25zdCBkaWZmTGF5b3V0VG9rZW5zID0gKGZyb21Ub2tlbnM6IExheW91dFRva2VuW10sIHRvVG9rZW5zOiBMYXlvdXRUb2tlbltdKSA9PiB7XG4gIGNvbnN0IGV4YWN0RGlmZiA9IGRpZmZCeUtleShmcm9tVG9rZW5zLCB0b1Rva2VucywgYnVpbGRFeGFjdEtleSlcbiAgY29uc3QgY29udGVudE1hdGNoZXMgPSBtYXRjaEJ5RXhhY3RDb250ZW50KGV4YWN0RGlmZi5yZW1vdmVkLCBleGFjdERpZmYuYWRkZWQpXG4gIGNvbnN0IGNhdGVnb3J5TWF0Y2hlcyA9IG1hdGNoQnlDYXRlZ29yeShjb250ZW50TWF0Y2hlcy5zdGlsbFJlbW92ZWQsIGNvbnRlbnRNYXRjaGVzLnN0aWxsQWRkZWQpXG5cbiAgcmV0dXJuIHtcbiAgICBhZGRlZDogY2F0ZWdvcnlNYXRjaGVzLnN0aWxsQWRkZWQsXG4gICAgbWF0Y2hlZDogWy4uLmV4YWN0RGlmZi5tYXRjaGVkLCAuLi5jb250ZW50TWF0Y2hlcy5tYXRjaGVkLCAuLi5jYXRlZ29yeU1hdGNoZXMubWF0Y2hlZF0sXG4gICAgcmVtb3ZlZDogY2F0ZWdvcnlNYXRjaGVzLnN0aWxsUmVtb3ZlZCxcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgYnVpbGRUcmFuc2l0aW9uRGlmZiA9IChmcm9tU2NlbmU6IFNjZW5lLCB0b1NjZW5lOiBTY2VuZSkgPT5cbiAgZGlmZkxheW91dFRva2VucyhmbGF0dGVuU2NlbmVUb2tlbnMoZnJvbVNjZW5lKSwgZmxhdHRlblNjZW5lVG9rZW5zKHRvU2NlbmUpKVxuXG5leHBvcnQgY29uc3QgZWFzZUluT3V0Q3ViaWMgPSAocHJvZ3Jlc3M6IG51bWJlcikgPT4ge1xuICBjb25zdCBjbGFtcGVkID0gTWF0aC5taW4oMSwgTWF0aC5tYXgoMCwgcHJvZ3Jlc3MpKVxuICByZXR1cm4gY2xhbXBlZCA8IDAuNSA/IDQgKiBjbGFtcGVkICogY2xhbXBlZCAqIGNsYW1wZWQgOiAxIC0gKC0yICogY2xhbXBlZCArIDIpICoqIDMgLyAyXG59XG5cbmV4cG9ydCBjb25zdCBidWlsZFRyYW5zaXRpb25Ub2tlbnMgPSAoXG4gIGNvbmZpZzogUmVuZGVyQ29uZmlnLFxuICBkaWZmOiBUcmFuc2l0aW9uRGlmZixcbiAgcHJvZ3Jlc3M6IG51bWJlclxuKSA9PiB7XG4gIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1pbigxLCBNYXRoLm1heCgwLCBwcm9ncmVzcykpXG4gIGNvbnN0IHRva2VuczogRHJhd1Rva2VuW10gPSBbXVxuXG4gIGZvciAoY29uc3QgdG9rZW4gb2YgZGlmZi5yZW1vdmVkKSB7XG4gICAgY29uc3Qgb3BhY2l0eSA9IDEgLSBjbGFtcGVkXG4gICAgaWYgKG9wYWNpdHkgPD0gMCkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICB0b2tlbnMucHVzaCh7XG4gICAgICBjb2xvcjogdG9rZW4uY29sb3IsXG4gICAgICBjb250ZW50OiB0b2tlbi5jb250ZW50LFxuICAgICAgZm9udFN0eWxlOiB0b2tlbi5mb250U3R5bGUsXG4gICAgICBvcGFjaXR5LFxuICAgICAgd2lkdGg6IHRva2VuLndpZHRoLFxuICAgICAgeDogdG9rZW4ueCxcbiAgICAgIHk6IHRva2VuLnkgLSBjb25maWcudHJhbnNpdGlvbkRyaWZ0ICogY2xhbXBlZCxcbiAgICB9KVxuICB9XG5cbiAgZm9yIChjb25zdCBtYXRjaCBvZiBkaWZmLm1hdGNoZWQpIHtcbiAgICBjb25zdCB3aWR0aCA9IGxlcnAobWF0Y2guZnJvbS53aWR0aCwgbWF0Y2gudG8ud2lkdGgsIGNsYW1wZWQpXG4gICAgY29uc3QgeCA9IGxlcnAobWF0Y2guZnJvbS54LCBtYXRjaC50by54LCBjbGFtcGVkKVxuICAgIGNvbnN0IHkgPSBsZXJwKG1hdGNoLmZyb20ueSwgbWF0Y2gudG8ueSwgY2xhbXBlZClcbiAgICBjb25zdCBoYXNNaXNtYXRjaCA9XG4gICAgICBtYXRjaC5mcm9tLmNvbnRlbnQgIT09IG1hdGNoLnRvLmNvbnRlbnQgfHwgbWF0Y2guZnJvbS5mb250U3R5bGUgIT09IG1hdGNoLnRvLmZvbnRTdHlsZVxuXG4gICAgaWYgKGhhc01pc21hdGNoKSB7XG4gICAgICBjb25zdCBmcm9tT3BhY2l0eSA9IDEgLSBjbGFtcGVkXG4gICAgICBpZiAoZnJvbU9wYWNpdHkgPiAwKSB7XG4gICAgICAgIHRva2Vucy5wdXNoKHtcbiAgICAgICAgICBjb2xvcjogbWF0Y2guZnJvbS5jb2xvcixcbiAgICAgICAgICBjb250ZW50OiBtYXRjaC5mcm9tLmNvbnRlbnQsXG4gICAgICAgICAgZm9udFN0eWxlOiBtYXRjaC5mcm9tLmZvbnRTdHlsZSxcbiAgICAgICAgICBvcGFjaXR5OiBmcm9tT3BhY2l0eSxcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICB4LFxuICAgICAgICAgIHksXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRvT3BhY2l0eSA9IGNsYW1wZWRcbiAgICAgIGlmICh0b09wYWNpdHkgPiAwKSB7XG4gICAgICAgIHRva2Vucy5wdXNoKHtcbiAgICAgICAgICBjb2xvcjogbWF0Y2gudG8uY29sb3IsXG4gICAgICAgICAgY29udGVudDogbWF0Y2gudG8uY29udGVudCxcbiAgICAgICAgICBmb250U3R5bGU6IG1hdGNoLnRvLmZvbnRTdHlsZSxcbiAgICAgICAgICBvcGFjaXR5OiB0b09wYWNpdHksXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgeCxcbiAgICAgICAgICB5LFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICB0b2tlbnMucHVzaCh7XG4gICAgICBjb2xvcjogYmxlbmRDb2xvcnMobWF0Y2guZnJvbS5jb2xvciwgbWF0Y2gudG8uY29sb3IsIGNsYW1wZWQpLFxuICAgICAgY29udGVudDogbWF0Y2gudG8uY29udGVudCxcbiAgICAgIGZvbnRTdHlsZTogbWF0Y2gudG8uZm9udFN0eWxlLFxuICAgICAgb3BhY2l0eTogMSxcbiAgICAgIHdpZHRoLFxuICAgICAgeCxcbiAgICAgIHksXG4gICAgfSlcbiAgfVxuXG4gIGZvciAoY29uc3QgdG9rZW4gb2YgZGlmZi5hZGRlZCkge1xuICAgIGNvbnN0IG9wYWNpdHkgPSBjbGFtcGVkXG4gICAgaWYgKG9wYWNpdHkgPD0gMCkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICB0b2tlbnMucHVzaCh7XG4gICAgICBjb2xvcjogdG9rZW4uY29sb3IsXG4gICAgICBjb250ZW50OiB0b2tlbi5jb250ZW50LFxuICAgICAgZm9udFN0eWxlOiB0b2tlbi5mb250U3R5bGUsXG4gICAgICBvcGFjaXR5LFxuICAgICAgd2lkdGg6IHRva2VuLndpZHRoLFxuICAgICAgeDogdG9rZW4ueCxcbiAgICAgIHk6IHRva2VuLnkgKyBjb25maWcudHJhbnNpdGlvbkRyaWZ0ICogKDEgLSBjbGFtcGVkKSxcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHRva2Vuc1xufVxuXG5leHBvcnQgY29uc3QgcmVuZGVyVHJhbnNpdGlvblRva2VucyA9IChcbiAgY29uZmlnOiBSZW5kZXJDb25maWcsXG4gIGNvbnRleHQ6IENhbnZhc0NvbnRleHQsXG4gIHRva2VuczogRHJhd1Rva2VuW11cbikgPT4ge1xuICBjb25zdCB0ZXh0Q29udGV4dCA9IGNvbnRleHRcbiAgY29uc3QgcHJldmlvdXNBbHBoYSA9IHRleHRDb250ZXh0Lmdsb2JhbEFscGhhXG4gIGNvbnN0IHByZXZpb3VzQmFzZWxpbmUgPSB0ZXh0Q29udGV4dC50ZXh0QmFzZWxpbmVcbiAgY29uc3QgcHJldmlvdXNBbGlnbiA9IHRleHRDb250ZXh0LnRleHRBbGlnblxuICBjb25zdCBwcmV2aW91c0ZvbnQgPSB0ZXh0Q29udGV4dC5mb250XG4gIGNvbnN0IHByZXZpb3VzRmlsbFN0eWxlID0gdGV4dENvbnRleHQuZmlsbFN0eWxlXG5cbiAgdGV4dENvbnRleHQudGV4dEJhc2VsaW5lID0gXCJ0b3BcIlxuICB0ZXh0Q29udGV4dC50ZXh0QWxpZ24gPSBcImxlZnRcIlxuXG4gIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgaWYgKHRva2VuLm9wYWNpdHkgPD0gMCkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCBmb250U3R5bGUgPSB0b2tlbi5mb250U3R5bGVcbiAgICBjb25zdCBpc0l0YWxpYyA9IChmb250U3R5bGUgJiBGT05UX1NUWUxFX0lUQUxJQykgPT09IEZPTlRfU1RZTEVfSVRBTElDXG4gICAgY29uc3QgaXNCb2xkID0gKGZvbnRTdHlsZSAmIEZPTlRfU1RZTEVfQk9MRCkgPT09IEZPTlRfU1RZTEVfQk9MRFxuICAgIGNvbnN0IGlzVW5kZXJsaW5lID0gKGZvbnRTdHlsZSAmIEZPTlRfU1RZTEVfVU5ERVJMSU5FKSA9PT0gRk9OVF9TVFlMRV9VTkRFUkxJTkVcblxuICAgIHRleHRDb250ZXh0Lmdsb2JhbEFscGhhID0gdG9rZW4ub3BhY2l0eVxuICAgIHRleHRDb250ZXh0LmZvbnQgPSBidWlsZEZvbnQoY29uZmlnLCBpc0l0YWxpYywgaXNCb2xkKVxuICAgIHRleHRDb250ZXh0LmZpbGxTdHlsZSA9IHRva2VuLmNvbG9yXG4gICAgdGV4dENvbnRleHQuZmlsbFRleHQodG9rZW4uY29udGVudCwgdG9rZW4ueCwgdG9rZW4ueSlcblxuICAgIGlmIChpc1VuZGVybGluZSAmJiB0b2tlbi53aWR0aCA+IDApIHtcbiAgICAgIGRyYXdVbmRlcmxpbmUoY29uZmlnLCB0ZXh0Q29udGV4dCwgdG9rZW4ueCwgdG9rZW4ueSwgdG9rZW4ud2lkdGgpXG4gICAgfVxuICB9XG5cbiAgdGV4dENvbnRleHQuZ2xvYmFsQWxwaGEgPSBwcmV2aW91c0FscGhhXG4gIHRleHRDb250ZXh0LnRleHRCYXNlbGluZSA9IHByZXZpb3VzQmFzZWxpbmVcbiAgdGV4dENvbnRleHQudGV4dEFsaWduID0gcHJldmlvdXNBbGlnblxuICB0ZXh0Q29udGV4dC5mb250ID0gcHJldmlvdXNGb250XG4gIHRleHRDb250ZXh0LmZpbGxTdHlsZSA9IHByZXZpb3VzRmlsbFN0eWxlXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQnVuZGxlZFRoZW1lIH0gZnJvbSBcInNoaWtpXCJcbmltcG9ydCB7IE9wdGlvbnMgfSBmcm9tIFwiQGVmZmVjdC9jbGlcIlxuXG5jb25zdCBERUZBVUxUX1RIRU1FOiBCdW5kbGVkVGhlbWUgPSBcImdpdGh1Yi1kYXJrXCJcbmNvbnN0IERFRkFVTFRfV0lEVEggPSAxMjgwXG5jb25zdCBERUZBVUxUX0hFSUdIVCA9IDcyMFxuY29uc3QgREVGQVVMVF9GUFMgPSA2MFxuY29uc3QgREVGQVVMVF9CTE9DS19EVVJBVElPTiA9IDJcbmNvbnN0IERFRkFVTFRfVFJBTlNJVElPTl9EVVJBVElPTl9NUyA9IDgwMFxuY29uc3QgREVGQVVMVF9UUkFOU0lUSU9OX0RSSUZUID0gOFxuY29uc3QgREVGQVVMVF9CQUNLR1JPVU5EID0gXCIjMGIwYjBiXCJcbmNvbnN0IERFRkFVTFRfRk9OVF9GQU1JTFkgPVxuICBcIlNGTW9uby1SZWd1bGFyLCBNZW5sbywgTW9uYWNvLCBDb25zb2xhcywgJ0xpYmVyYXRpb24gTW9ubycsICdDb3VyaWVyIE5ldycsIG1vbm9zcGFjZVwiXG5jb25zdCBERUZBVUxUX0ZPTlRfU0laRSA9IDI0XG5jb25zdCBERUZBVUxUX0ZPUkVHUk9VTkQgPSBcIiNlNmU2ZTZcIlxuY29uc3QgREVGQVVMVF9MSU5FX0hFSUdIVCA9IDM0XG5jb25zdCBERUZBVUxUX1BBRERJTkcgPSA2NFxuY29uc3QgVEFCX1JFUExBQ0VNRU5UID0gXCIgIFwiXG5cbmV4cG9ydCBjb25zdCBiYWNrZ3JvdW5kID0gT3B0aW9ucy50ZXh0KFwiYmFja2dyb3VuZFwiKS5waXBlKFxuICBPcHRpb25zLndpdGhBbGlhcyhcImJnXCIpLFxuICBPcHRpb25zLndpdGhEZWZhdWx0KERFRkFVTFRfQkFDS0dST1VORCksXG4gIE9wdGlvbnMud2l0aERlc2NyaXB0aW9uKFwiQmFja2dyb3VuZCBjb2xvciBiZWhpbmQgdGhlIGNvZGVcIilcbilcblxuZXhwb3J0IGNvbnN0IGJsb2NrRHVyYXRpb24gPSBPcHRpb25zLmZsb2F0KFwiYmxvY2stZHVyYXRpb25cIikucGlwZShcbiAgT3B0aW9ucy53aXRoQWxpYXMoXCJiZFwiKSxcbiAgT3B0aW9ucy53aXRoRGVmYXVsdChERUZBVUxUX0JMT0NLX0RVUkFUSU9OKSxcbiAgT3B0aW9ucy53aXRoRGVzY3JpcHRpb24oXCJTZWNvbmRzIGVhY2ggY29kZSBibG9jayBzdGF5cyBvbiBzY3JlZW5cIilcbilcblxuZXhwb3J0IGNvbnN0IGZvbnRGYW1pbHkgPSBPcHRpb25zLnRleHQoXCJmb250LWZhbWlseVwiKS5waXBlKFxuICBPcHRpb25zLndpdGhBbGlhcyhcImZmXCIpLFxuICBPcHRpb25zLndpdGhEZWZhdWx0KERFRkFVTFRfRk9OVF9GQU1JTFkpLFxuICBPcHRpb25zLndpdGhEZXNjcmlwdGlvbihcIkZvbnQgZmFtaWx5IGZvciB0aGUgdGV4dFwiKVxuKVxuXG5leHBvcnQgY29uc3QgZm9udFNpemUgPSBPcHRpb25zLmludGVnZXIoXCJmb250LXNpemVcIikucGlwZShcbiAgT3B0aW9ucy53aXRoQWxpYXMoXCJmc1wiKSxcbiAgT3B0aW9ucy53aXRoRGVmYXVsdChERUZBVUxUX0ZPTlRfU0laRSksXG4gIE9wdGlvbnMud2l0aERlc2NyaXB0aW9uKFwiRm9udCBzaXplIGluIHBpeGVsc1wiKVxuKVxuXG5leHBvcnQgY29uc3QgZm9yZWdyb3VuZCA9IE9wdGlvbnMudGV4dChcImZvcmVncm91bmRcIikucGlwZShcbiAgT3B0aW9ucy53aXRoQWxpYXMoXCJmZ1wiKSxcbiAgT3B0aW9ucy53aXRoRGVmYXVsdChERUZBVUxUX0ZPUkVHUk9VTkQpLFxuICBPcHRpb25zLndpdGhEZXNjcmlwdGlvbihcIkRlZmF1bHQgdGV4dCBjb2xvclwiKVxuKVxuXG5leHBvcnQgY29uc3QgZm9ybWF0ID0gT3B0aW9ucy5jaG9pY2UoXCJmb3JtYXRcIiwgW1wibXA0XCIsIFwid2VibVwiXSBhcyBjb25zdCkucGlwZShcbiAgT3B0aW9ucy53aXRoQWxpYXMoXCJmXCIpLFxuICBPcHRpb25zLndpdGhEZWZhdWx0KFwibXA0XCIpLFxuICBPcHRpb25zLndpdGhEZXNjcmlwdGlvbihcIk91dHB1dCBjb250YWluZXIgZm9ybWF0LlwiKVxuKVxuXG5leHBvcnQgY29uc3QgZnBzID0gT3B0aW9ucy5pbnRlZ2VyKFwiZnBzXCIpLnBpcGUoXG4gIE9wdGlvbnMud2l0aEFsaWFzKFwiclwiKSxcbiAgT3B0aW9ucy53aXRoRGVmYXVsdChERUZBVUxUX0ZQUyksXG4gIE9wdGlvbnMud2l0aERlc2NyaXB0aW9uKFwiRnJhbWVzIHBlciBzZWNvbmQgZm9yIHRoZSB2aWRlb1wiKVxuKVxuXG5leHBvcnQgY29uc3QgaGVpZ2h0ID0gT3B0aW9ucy5pbnRlZ2VyKFwiaGVpZ2h0XCIpLnBpcGUoXG4gIE9wdGlvbnMud2l0aEFsaWFzKFwiaFwiKSxcbiAgT3B0aW9ucy53aXRoRGVmYXVsdChERUZBVUxUX0hFSUdIVCksXG4gIE9wdGlvbnMud2l0aERlc2NyaXB0aW9uKFwiTWluaW11bSBvdXRwdXQgaGVpZ2h0IGluIHBpeGVsc1wiKVxuKVxuXG5leHBvcnQgY29uc3QgbGluZUhlaWdodCA9IE9wdGlvbnMuaW50ZWdlcihcImxpbmUtaGVpZ2h0XCIpLnBpcGUoXG4gIE9wdGlvbnMud2l0aEFsaWFzKFwibGhcIiksXG4gIE9wdGlvbnMud2l0aERlZmF1bHQoREVGQVVMVF9MSU5FX0hFSUdIVCksXG4gIE9wdGlvbnMud2l0aERlc2NyaXB0aW9uKFwiTGluZSBoZWlnaHQgaW4gcGl4ZWxzXCIpXG4pXG5cbmV4cG9ydCBjb25zdCBvdXRwdXQgPSBPcHRpb25zLmZpbGUoXCJvdXRwdXRcIikucGlwZShcbiAgT3B0aW9ucy53aXRoQWxpYXMoXCJvXCIpLFxuICBPcHRpb25zLndpdGhEZXNjcmlwdGlvbihcIkRlc3RpbmF0aW9uIHZpZGVvIHBhdGhcIiksXG4gIE9wdGlvbnMub3B0aW9uYWxcbilcblxuZXhwb3J0IGNvbnN0IHBhZGRpbmcgPSBPcHRpb25zLmludGVnZXIoXCJwYWRkaW5nXCIpLnBpcGUoXG4gIE9wdGlvbnMud2l0aEFsaWFzKFwicFwiKSxcbiAgT3B0aW9ucy53aXRoRGVmYXVsdChERUZBVUxUX1BBRERJTkcpLFxuICBPcHRpb25zLndpdGhEZXNjcmlwdGlvbihcIlBhZGRpbmcgYXJvdW5kIHRoZSBjb2RlIGJsb2NrIGluIHBpeGVsc1wiKVxuKVxuXG5leHBvcnQgY29uc3QgdGFiUmVwbGFjZW1lbnQgPSBPcHRpb25zLnRleHQoXCJ0YWItcmVwbGFjZW1lbnRcIikucGlwZShcbiAgT3B0aW9ucy53aXRoQWxpYXMoXCJ0YlwiKSxcbiAgT3B0aW9ucy53aXRoRGVmYXVsdChUQUJfUkVQTEFDRU1FTlQpLFxuICBPcHRpb25zLndpdGhEZXNjcmlwdGlvbihcIlRleHQgdXNlZCBpbnN0ZWFkIG9mIHRhYnNcIilcbilcblxuZXhwb3J0IGNvbnN0IHRoZW1lID0gT3B0aW9ucy50ZXh0KFwidGhlbWVcIikucGlwZShcbiAgT3B0aW9ucy53aXRoQWxpYXMoXCJ0XCIpLFxuICBPcHRpb25zLndpdGhEZWZhdWx0KERFRkFVTFRfVEhFTUUpLFxuICBPcHRpb25zLndpdGhEZXNjcmlwdGlvbihcIlNoaWtpIHRoZW1lIGZvciBzeW50YXggaGlnaGxpZ2h0aW5nXCIpXG4pXG5cbmV4cG9ydCBjb25zdCB0cmFuc2l0aW9uRHJpZnQgPSBPcHRpb25zLmZsb2F0KFwidHJhbnNpdGlvbi1kcmlmdFwiKS5waXBlKFxuICBPcHRpb25zLndpdGhBbGlhcyhcInRkXCIpLFxuICBPcHRpb25zLndpdGhEZWZhdWx0KERFRkFVTFRfVFJBTlNJVElPTl9EUklGVCksXG4gIE9wdGlvbnMud2l0aERlc2NyaXB0aW9uKFwiUGl4ZWwgZHJpZnQgZHVyaW5nIHRyYW5zaXRpb25zXCIpXG4pXG5cbmV4cG9ydCBjb25zdCB0cmFuc2l0aW9uRHVyYXRpb25NcyA9IE9wdGlvbnMuaW50ZWdlcihcInRyYW5zaXRpb25cIikucGlwZShcbiAgT3B0aW9ucy53aXRoQWxpYXMoXCJ0clwiKSxcbiAgT3B0aW9ucy53aXRoRGVmYXVsdChERUZBVUxUX1RSQU5TSVRJT05fRFVSQVRJT05fTVMpLFxuICBPcHRpb25zLndpdGhEZXNjcmlwdGlvbihcIlRyYW5zaXRpb24gdGltZSBiZXR3ZWVuIHNsaWRlcyBpbiBtc1wiKVxuKVxuXG5leHBvcnQgY29uc3Qgd2lkdGggPSBPcHRpb25zLmludGVnZXIoXCJ3aWR0aFwiKS5waXBlKFxuICBPcHRpb25zLndpdGhBbGlhcyhcIndcIiksXG4gIE9wdGlvbnMud2l0aERlZmF1bHQoREVGQVVMVF9XSURUSCksXG4gIE9wdGlvbnMud2l0aERlc2NyaXB0aW9uKFwiTWluaW11bSBvdXRwdXQgd2lkdGggaW4gcGl4ZWxzXCIpXG4pXG4iCiAgXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsb0JBQVM7QUFDVDtBQUNBLDBCQUFnQixtQkFBUTs7O0FDRnhCO0FBQ0E7QUFDQTtBQUNBLDRCQUFrQjs7O0FDSGxCO0FBQUE7QUFJTyxNQUFNLDJCQUEyQixLQUFLLFlBQVksb0JBQW9CLEVBRTFFO0FBQUM7QUFBQTtBQUVHLE1BQU0scUJBQXFCLEtBQUssWUFBWSxjQUFjLEVBQXFCO0FBQUM7QUFBQTtBQUVoRixNQUFNLGlDQUFpQyxLQUFLLFlBQVksMEJBQTBCLEVBR3RGO0FBQUM7QUFBQTtBQUVHLE1BQU0sNEJBQTRCLEtBQUssWUFBWSxxQkFBcUIsRUFFNUU7QUFBQztBQUFBO0FBRUcsTUFBTSwwQkFBMEIsS0FBSyxZQUFZLG1CQUFtQixFQUFxQjtBQUFDO0FBQUE7QUFFMUYsTUFBTSxrQ0FBa0MsS0FBSyxZ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RUFFRCxNQUFNLGVBQTZCO0FBQUEsSUFDakM7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQUEsRUFFQSxPQUFPLFFBQVEsSUFBSSxhQUFhLE9BQU8seUJBQXlCLGVBQWU7QUFBQSxFQUMvRSxPQUFPLFlBQVksWUFBWSxlQUFlLFFBQVEsY0FBYyxFQUFFLGdCQUFPLENBQUM7QUFBQSxFQUM5RSxPQUFPLFFBQVEsSUFBSSxvQkFBb0IsWUFBWTtBQUFBLENBQ3BELENBQ0w7QUFFQSxJQUFlOzs7QURsSGYsSUFBTSxVQUFVLE1BQU07QUFFdEIsSUFBTSxPQUFPLFNBQVEsS0FBSyxRQUFRLEVBQUUsS0FDbEMsU0FBUSxnQkFBZ0IsNkNBQTZDLEdBQ3JFLFNBQVEsZ0JBQWdCLENBQUMsY0FBTSxDQUFDLENBQ2xDO0FBRUEsSUFBTSxVQUFVLFNBQVEsSUFBSSxNQUFNLEVBQUUsTUFBTSxVQUFVLFFBQVEsQ0FBQztBQUU3RCxJQUFNLHNCQUFzQixRQUFPLEdBQUcsc0JBQXNCLEVBQUUsVUFBVSxDQUFDLE9BQWdCO0FBQUEsRUFDdkYsSUFBSSxpQkFBaUIsZUFBZTtBQUFBLElBQ2xDLE9BQU8sUUFBTyxTQUFTLHVDQUF1QztBQUFBLElBQzlEO0FBQUEsRUFDRjtBQUFBLEVBQ0EsSUFBSSxpQkFBaUIsb0JBQW9CO0FBQUEsSUFDdkMsT0FBTyxRQUFPLFNBQ1osd0JBQXdCLE1BQU0sYUFBYSxNQUFNLHNCQUFzQixNQUFNLFVBQy9FO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFBQSxFQUNBLE9BQU8sUUFBTyxTQUFTLEtBQUs7QUFBQSxDQUM3QjtBQUVELElBQU0sZ0JBQWdCLFFBQU8sR0FBRyxlQUFlLEVBQUUsQ0FBQyxVQUNoRCxRQUFPLE1BQU0sTUFBTSxjQUFjLEtBQUssR0FBRztBQUFBLEVBQ3ZDLFFBQVEsTUFBTSxRQUFPLFNBQVMsS0FBSztBQUFBLEVBQ25DLFFBQVE7QUFDVixDQUFDLENBQ0g7QUFFQSxRQUFRLFFBQVEsSUFBSSxFQUFFLEtBQ3BCLFFBQU8sY0FBYyxhQUFhLEdBQ2xDLFFBQU8sUUFBUSxZQUFZLEtBQUssR0FDaEMsWUFBWSxPQUNkOyIsCiAgImRlYnVnSWQiOiAiQjA5MTc5QzVFMDhCNUQyMTY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
1007
+ //# debugId=1C1251AD4044B63664756E2164756E21
1008
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIiwgInNyYy9jb21tYW5kcy9yZW5kZXIudHMiLCAic3JjL2xpYi9lcnJvcnMudHMiLCAic3JjL2xpYi9tYXJrZG93bi50cyIsICJzcmMvbGliL3RoZW1lLnRzIiwgInNyYy9saWIvdmlkZW8udHMiLCAic3JjL2xpYi9mZm1wZWcudHMiLCAic3JjL2xpYi9yZW5kZXIudHMiLCAic3JjL2xpYi9jb2xvci50cyIsICJzcmMvbGliL3NjZW5lLnRzIiwgInNyYy9saWIvY29uc3RhbnRzLnRzIiwgInNyYy9saWIvdGV4dC50cyIsICJzcmMvbGliL3Rva2VuLnRzIiwgInNyYy9saWIvdHJhbnNpdGlvbi50cyIsICJzcmMvY29tbWFuZHMvb3B0aW9ucy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcIkBlZmZlY3QvY2xpXCJcbmltcG9ydCB7IE5vZGVDb250ZXh0LCBOb2RlUnVudGltZSB9IGZyb20gXCJAZWZmZWN0L3BsYXRmb3JtLW5vZGVcIlxuaW1wb3J0IHsgQ29uc29sZSwgRWZmZWN0IH0gZnJvbSBcImVmZmVjdFwiXG5pbXBvcnQgcmVuZGVyIGZyb20gXCIuL2NvbW1hbmRzL3JlbmRlclwiXG5pbXBvcnQgeyByZWFkVmVyc2lvbiB9IGZyb20gXCIuL2NvbW1hbmRzL3ZlcnNpb25cIiB3aXRoIHsgdHlwZTogXCJtYWNyb1wiIH1cblxuY29uc3QgdmVyc2lvbiA9IGF3YWl0IHJlYWRWZXJzaW9uKClcblxuY29uc3QgbWFpbiA9IENvbW1hbmQubWFrZShcInNha3VnYVwiKS5waXBlKFxuICBDb21tYW5kLndpdGhEZXNjcmlwdGlvbihcIkNyZWF0ZSBjb2RlIGFuaW1hdGlvbiB2aWRlb3MgZnJvbSBNYXJrZG93bi5cIiksXG4gIENvbW1hbmQud2l0aFN1YmNvbW1hbmRzKFtyZW5kZXJdKVxuKVxuXG5jb25zdCBwcm9ncmFtID0gQ29tbWFuZC5ydW4obWFpbiwgeyBuYW1lOiBcInNha3VnYVwiLCB2ZXJzaW9uIH0pXG5cbnByb2dyYW0ocHJvY2Vzcy5hcmd2KS5waXBlKFxuICBFZmZlY3QuY2F0Y2hUYWdzKHtcbiAgICBNdWx0aXBsZVZhbHVlc0RldGVjdGVkOiAoZXJyb3IpID0+XG4gICAgICBDb25zb2xlLmVycm9yKGBNdWx0aXBsZSB2YWx1ZXMgZGV0ZWN0ZWQ6ICR7ZXJyb3IudmFsdWVzLmpvaW4oXCIsIFwiKX1gKSxcbiAgICBVbmNsdXN0ZXJlZEZsYWc6IChlcnJvcikgPT5cbiAgICAgIENvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGZsYWcgZm9ybWF0OiBcIiR7ZXJyb3IudW5jbHVzdGVyZWQuam9pbihcIlwiKX1cIi5cXG5gICtcbiAgICAgICAgICBgICBGbGFncyBjYW5ub3QgYmUgY2x1c3RlcmVkLiBVc2Ugc2VwYXJhdGUgZmxhZ3MgaW5zdGVhZC5gXG4gICAgICApLFxuICB9KSxcbiAgRWZmZWN0LnByb3ZpZGUoTm9kZUNvbnRleHQubGF5ZXIpLFxuICBOb2RlUnVudGltZS5ydW5NYWluXG4pXG4iLAogICAgImltcG9ydCB7IEFyZ3MsIENvbW1hbmQgfSBmcm9tIFwiQGVmZmVjdC9jbGlcIlxuaW1wb3J0ICogYXMgRmlsZVN5c3RlbSBmcm9tIFwiQGVmZmVjdC9wbGF0Zm9ybS9GaWxlU3lzdGVtXCJcbmltcG9ydCAqIGFzIFBhdGggZnJvbSBcIkBlZmZlY3QvcGxhdGZvcm0vUGF0aFwiXG5pbXBvcnQgeyBDb25zb2xlLCBFZmZlY3QsIE9wdGlvbiB9IGZyb20gXCJlZmZlY3RcIlxuaW1wb3J0IHR5cGUgeyBSZW5kZXJDb25maWcgfSBmcm9tIFwiLi4vbGliL3R5cGVzXCJcbmltcG9ydCB7IEludmFsaWRUcmFuc2l0aW9uRHVyYXRpb24sIE5vQ29kZUJsb2Nrc0ZvdW5kIH0gZnJvbSBcIi4uL2xpYi9lcnJvcnNcIlxuaW1wb3J0IHsgcGFyc2VNYXJrZG93bkNvZGVCbG9ja3MgfSBmcm9tIFwiLi4vbGliL21hcmtkb3duXCJcbmltcG9ydCB7IHJlc29sdmVUaGVtZSB9IGZyb20gXCIuLi9saWIvdGhlbWVcIlxuaW1wb3J0IHsgcmVuZGVyVmlkZW8gfSBmcm9tIFwiLi4vbGliL3ZpZGVvXCJcbmltcG9ydCB7XG4gIGJhY2tncm91bmQsXG4gIGJsb2NrRHVyYXRpb24sXG4gIGZvbnRGYW1pbHksXG4gIGZvbnRTaXplLFxuICBmb3JlZ3JvdW5kLFxuICBmb3JtYXQsXG4gIGZwcyxcbiAgaGVpZ2h0LFxuICBsaW5lSGVpZ2h0LFxuICBvdXRwdXQsXG4gIHBhZGRpbmcsXG4gIHRhYlJlcGxhY2VtZW50LFxuICB0aGVtZSxcbiAgdHJhbnNpdGlvbkRyaWZ0LFxuICB0cmFuc2l0aW9uRHVyYXRpb25NcyxcbiAgd2lkdGgsXG59IGZyb20gXCIuL29wdGlvbnNcIlxuXG5jb25zdCBmaWxlID0gQXJncy5maWxlKHsgZXhpc3RzOiBcInllc1wiLCBuYW1lOiBcImlucHV0XCIgfSkucGlwZShcbiAgQXJncy53aXRoRGVzY3JpcHRpb24oXCJNYXJrZG93biBmaWxlIHRvIHJlbmRlclwiKVxuKVxuXG5leHBvcnQgZGVmYXVsdCBDb21tYW5kLm1ha2UoXCJyZW5kZXJcIiwge1xuICBiYWNrZ3JvdW5kLFxuICBibG9ja0R1cmF0aW9uLFxuICBmaWxlLFxuICBmb250RmFtaWx5LFxuICBmb250U2l6ZSxcbiAgZm9yZWdyb3VuZCxcbiAgZm9ybWF0LFxuICBmcHMsXG4gIGhlaWdodCxcbiAgbGluZUhlaWdodCxcbiAgb3V0cHV0LFxuICBwYWRkaW5nLFxuICB0YWJSZXBsYWNlbWVudCxcbiAgdGhlbWUsXG4gIHRyYW5zaXRpb25EcmlmdCxcbiAgdHJhbnNpdGlvbkR1cmF0aW9uTXMsXG4gIHdpZHRoLFxufSkucGlwZShcbiAgQ29tbWFuZC53aXRoRGVzY3JpcHRpb24oXCJSZW5kZXIgYSB2aWRlbyBmcm9tIGNvZGUgYmxvY2tzIGluIGEgTWFya2Rvd24gZmlsZVwiKSxcbiAgQ29tbWFuZC53aXRoSGFuZGxlcihcbiAgICAoe1xuICAgICAgYmFja2dyb3VuZCxcbiAgICAgIGJsb2NrRHVyYXRpb24sXG4gICAgICBmaWxlLFxuICAgICAgZm9udEZhbWlseSxcbiAgICAgIGZvbnRTaXplLFxuICAgICAgZm9yZWdyb3VuZCxcbiAgICAgIGZwcyxcbiAgICAgIGhlaWdodCxcbiAgICAgIGxpbmVIZWlnaHQsXG4gICAgICBvdXRwdXQsXG4gICAgICBwYWRkaW5nLFxuICAgICAgdGFiUmVwbGFjZW1lbnQsXG4gICAgICB0aGVtZSxcbiAgICAgIHRyYW5zaXRpb25EcmlmdCxcbiAgICAgIHRyYW5zaXRpb25EdXJhdGlvbk1zLFxuICAgICAgd2lkdGgsXG4gICAgICBmb3JtYXQsXG4gICAgfSkgPT5cbiAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZmlsZVN5c3RlbSA9IHlpZWxkKiBGaWxlU3lzdGVtLkZpbGVTeXN0ZW1cbiAgICAgICAgY29uc3QgcGF0aCA9IHlpZWxkKiBQYXRoLlBhdGhcblxuICAgICAgICBjb25zdCBtYXJrZG93biA9IHlpZWxkKiBmaWxlU3lzdGVtLnJlYWRGaWxlU3RyaW5nKGZpbGUpXG4gICAgICAgIGNvbnN0IGJsb2NrcyA9IHlpZWxkKiBwYXJzZU1hcmtkb3duQ29kZUJsb2NrcyhtYXJrZG93bilcblxuICAgICAgICBpZiAoYmxvY2tzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiB5aWVsZCogbmV3IE5vQ29kZUJsb2Nrc0ZvdW5kKHsgcGF0aDogZmlsZSB9KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRyYW5zaXRpb25EdXJhdGlvbk1zIDw9IDApIHtcbiAgICAgICAgICByZXR1cm4geWllbGQqIG5ldyBJbnZhbGlkVHJhbnNpdGlvbkR1cmF0aW9uKHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0cmFuc2l0aW9uRHVyYXRpb25NcyxcbiAgICAgICAgICAgIG1pbmltdW06IDEsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc29sdmVkVGhlbWUgPSB5aWVsZCogcmVzb2x2ZVRoZW1lKHRoZW1lKVxuICAgICAgICBjb25zdCBvdXRwdXRQYXRoID0gT3B0aW9uLm1hdGNoKG91dHB1dCwge1xuICAgICAgICAgIG9uTm9uZTogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcGF0aC5wYXJzZShmaWxlKVxuICAgICAgICAgICAgcmV0dXJuIHBhdGguam9pbihwYXJzZWQuZGlyLCBgJHtwYXJzZWQubmFtZX0uJHtmb3JtYXR9YClcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uU29tZTogKHZhbHVlKSA9PiB2YWx1ZSxcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCByZW5kZXJDb25maWc6IFJlbmRlckNvbmZpZyA9IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kLFxuICAgICAgICAgIGJsb2NrRHVyYXRpb24sXG4gICAgICAgICAgZm9udEZhbWlseSxcbiAgICAgICAgICBmb250U2l6ZSxcbiAgICAgICAgICBmb3JlZ3JvdW5kLFxuICAgICAgICAgIGZwcyxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgbGluZUhlaWdodCxcbiAgICAgICAgICBwYWRkaW5nLFxuICAgICAgICAgIHRhYlJlcGxhY2VtZW50LFxuICAgICAgICAgIHRyYW5zaXRpb25EcmlmdCxcbiAgICAgICAgICB0cmFuc2l0aW9uRHVyYXRpb25NcyxcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgfVxuXG4gICAgICAgIHlpZWxkKiBDb25zb2xlLmxvZyhgUmVuZGVyaW5nICR7YmxvY2tzLmxlbmd0aH0gY29kZSBibG9ja3MgdG8gJHtvdXRwdXRQYXRofS4uLmApXG4gICAgICAgIHlpZWxkKiByZW5kZXJWaWRlbyhvdXRwdXRQYXRoLCByZXNvbHZlZFRoZW1lLCBibG9ja3MsIHJlbmRlckNvbmZpZywgeyBmb3JtYXQgfSlcbiAgICAgICAgeWllbGQqIENvbnNvbGUubG9nKGBWaWRlbyBjcmVhdGVkIGF0ICR7b3V0cHV0UGF0aH1gKVxuICAgICAgfSkucGlwZShcbiAgICAgICAgRWZmZWN0LmNhdGNoVGFncyh7XG4gICAgICAgICAgQmFkQXJndW1lbnQ6IChlcnJvcikgPT4gQ29uc29sZS5lcnJvcihgSW52YWxpZCBmaWxlIGFyZ3VtZW50OiAke2Vycm9yLm1lc3NhZ2V9YCksXG4gICAgICAgICAgRmZtcGVnUmVuZGVyRmFpbGVkOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YWdlTWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgZmluaXNoOiBcImZpbmFsaXppbmcgdGhlIHZpZGVvIGZpbGVcIixcbiAgICAgICAgICAgICAgaW5pdDogXCJzdGFydGluZyB0aGUgRkZtcGVnIHByb2Nlc3NcIixcbiAgICAgICAgICAgICAgc3RyZWFtOiBcIndyaXRpbmcgdmlkZW8gZnJhbWVzXCIsXG4gICAgICAgICAgICB9W2Vycm9yLnN0YWdlXVxuXG4gICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBGRm1wZWcgZmFpbGVkIHdoaWxlICR7c3RhZ2VNZXNzYWdlfS5cXG5gXG4gICAgICAgICAgICBtZXNzYWdlICs9IGAgIE91dHB1dDogJHtlcnJvci5vdXRwdXRQYXRofVxcbmBcbiAgICAgICAgICAgIG1lc3NhZ2UgKz0gYCAgRm9ybWF0OiAke2Vycm9yLmZvcm1hdH1gXG5cbiAgICAgICAgICAgIGlmIChlcnJvci5leGl0Q29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIG1lc3NhZ2UgKz0gYFxcbiAgRXhpdCBjb2RlOiAke2Vycm9yLmV4aXRDb2RlfWBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcnJvci5zaWduYWwpIHtcbiAgICAgICAgICAgICAgbWVzc2FnZSArPSBgXFxuICBTaWduYWw6ICR7ZXJyb3Iuc2lnbmFsfWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIENvbnNvbGUuZXJyb3IobWVzc2FnZSlcbiAgICAgICAgICB9LFxuICAgICAgICAgIEludmFsaWRUcmFuc2l0aW9uRHVyYXRpb246IChlcnJvcikgPT5cbiAgICAgICAgICAgIENvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIGBJbnZhbGlkIHRyYW5zaXRpb24gZHVyYXRpb246ICR7ZXJyb3IuZHVyYXRpb259bXMuXFxuYCArXG4gICAgICAgICAgICAgICAgYCAgTWluaW11bSBhbGxvd2VkOiAke2Vycm9yLm1pbmltdW19bXNgXG4gICAgICAgICAgICApLFxuICAgICAgICAgIE1pc3NpbmdDb2RlQmxvY2tMYW5ndWFnZTogKGVycm9yKSA9PlxuICAgICAgICAgICAgQ29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgYE1pc3NpbmcgbGFuZ3VhZ2UgaW4gY29kZSBibG9jay5cXG5gICtcbiAgICAgICAgICAgICAgICBgICAke2Vycm9yLmRldGFpbCA/PyBcIkV2ZXJ5IGZlbmNlZCBjb2RlIGJsb2NrIG5lZWRzIGEgbGFuZ3VhZ2UgKGUuZy4sIGBgYHR5cGVzY3JpcHQpLlwifVxcbmAgK1xuICAgICAgICAgICAgICAgIGAgIFNlZSBzdXBwb3J0ZWQgbGFuZ3VhZ2VzOiBodHRwczovL3NoaWtpLnN0eWxlL2xhbmd1YWdlc2BcbiAgICAgICAgICAgICksXG4gICAgICAgICAgTWlzc2luZ0ZmbXBlZzogKCkgPT5cbiAgICAgICAgICAgIENvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIGBGRm1wZWcgaXMgbm90IGluc3RhbGxlZCBvciBub3QgaW4gUEFUSC5cXG5gICtcbiAgICAgICAgICAgICAgICBgICBJbnN0YWxsIEZGbXBlZyB0byByZW5kZXIgdmlkZW9zOiBodHRwczovL2ZmbXBlZy5vcmcvZG93bmxvYWQuaHRtbGBcbiAgICAgICAgICAgICksXG4gICAgICAgICAgTm9Db2RlQmxvY2tzRm91bmQ6IChlcnJvcikgPT5cbiAgICAgICAgICAgIENvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIGBObyBjb2RlIGJsb2NrcyBmb3VuZCR7ZXJyb3IucGF0aCA/IGAgaW4gJHtlcnJvci5wYXRofWAgOiBcIlwifS5cXG5gICtcbiAgICAgICAgICAgICAgICBgICBBZGQgZmVuY2VkIGNvZGUgYmxvY2tzIHdpdGggYSBsYW5ndWFnZSB0byB5b3VyIG1hcmtkb3duIGZpbGUuYFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICBTY2VuZU1lYXN1cmVGYWlsZWQ6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGV0YWlscyA9XG4gICAgICAgICAgICAgIGVycm9yLmNhdXNlIGluc3RhbmNlb2YgRXJyb3IgPyBgXFxuICBEZXRhaWxzOiAke2Vycm9yLmNhdXNlLm1lc3NhZ2V9YCA6IFwiXCJcbiAgICAgICAgICAgIHJldHVybiBDb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIHByb2Nlc3MgY29kZSBibG9jay5cXG4gIFRoZSBzeW50YXggaGlnaGxpZ2h0ZXIgY291bGQgbm90IHRva2VuaXplIHRoZSBjb2RlLiR7ZGV0YWlsc31gXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSxcbiAgICAgICAgICBTeXN0ZW1FcnJvcjogKGVycm9yKSA9PlxuICAgICAgICAgICAgQ29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byByZWFkIGlucHV0IGZpbGUuXFxuYCArXG4gICAgICAgICAgICAgICAgYCAgUGF0aDogJHtlcnJvci5wYXRoT3JEZXNjcmlwdG9yfVxcbmAgK1xuICAgICAgICAgICAgICAgIGAgIFJlYXNvbjogJHtlcnJvci5yZWFzb259YFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICBVbmtub3duVGhlbWU6IChlcnJvcikgPT5cbiAgICAgICAgICAgIENvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIGBVbmtub3duIHRoZW1lOiBcIiR7ZXJyb3IudGhlbWV9XCIuXFxuYCArXG4gICAgICAgICAgICAgICAgYCAgU2VlIGF2YWlsYWJsZSB0aGVtZXM6IGh0dHBzOi8vc2hpa2kuc3R5bGUvdGhlbWVzYFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICBVbnN1cHBvcnRlZExhbmd1YWdlOiAoZXJyb3IpID0+XG4gICAgICAgICAgICBDb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBgVW5zdXBwb3J0ZWQgbGFuZ3VhZ2U6IFwiJHtlcnJvci5sYW5ndWFnZX1cIi5cXG5gICtcbiAgICAgICAgICAgICAgICBgICBTZWUgc3VwcG9ydGVkIGxhbmd1YWdlczogaHR0cHM6Ly9zaGlraS5zdHlsZS9sYW5ndWFnZXNgXG4gICAgICAgICAgICApLFxuICAgICAgICB9KVxuICAgICAgKVxuICApXG4pXG4iLAogICAgImltcG9ydCB7IERhdGEgfSBmcm9tIFwiZWZmZWN0XCJcblxuZXhwb3J0IHR5cGUgRmZtcGVnRm9ybWF0ID0gXCJtcDRcIiB8IFwid2VibVwiXG5cbmV4cG9ydCBjbGFzcyBTY2VuZU1lYXN1cmVGYWlsZWQgZXh0ZW5kcyBEYXRhLlRhZ2dlZEVycm9yKFwiU2NlbmVNZWFzdXJlRmFpbGVkXCIpPHtcbiAgY2F1c2U6IHVua25vd25cbn0+IHt9XG5cbmV4cG9ydCBjbGFzcyBVbmtub3duVGhlbWUgZXh0ZW5kcyBEYXRhLlRhZ2dlZEVycm9yKFwiVW5rbm93blRoZW1lXCIpPHsgdGhlbWU6IHN0cmluZyB9PiB7fVxuXG5leHBvcnQgY2xhc3MgTWlzc2luZ0NvZGVCbG9ja0xhbmd1YWdlIGV4dGVuZHMgRGF0YS5UYWdnZWRFcnJvcihcIk1pc3NpbmdDb2RlQmxvY2tMYW5ndWFnZVwiKTx7XG4gIGNvbnRleHQ6IFwicGFyc2VcIiB8IFwiY29kZUJsb2NrXCJcbiAgZGV0YWlsPzogc3RyaW5nXG59PiB7fVxuXG5leHBvcnQgY2xhc3MgVW5zdXBwb3J0ZWRMYW5ndWFnZSBleHRlbmRzIERhdGEuVGFnZ2VkRXJyb3IoXCJVbnN1cHBvcnRlZExhbmd1YWdlXCIpPHtcbiAgbGFuZ3VhZ2U6IHN0cmluZ1xufT4ge31cblxuZXhwb3J0IGNsYXNzIE5vQ29kZUJsb2Nrc0ZvdW5kIGV4dGVuZHMgRGF0YS5UYWdnZWRFcnJvcihcIk5vQ29kZUJsb2Nrc0ZvdW5kXCIpPHsgcGF0aD86IHN0cmluZyB9PiB7fVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZFRyYW5zaXRpb25EdXJhdGlvbiBleHRlbmRzIERhdGEuVGFnZ2VkRXJyb3IoXCJJbnZhbGlkVHJhbnNpdGlvbkR1cmF0aW9uXCIpPHtcbiAgZHVyYXRpb246IG51bWJlclxuICBtaW5pbXVtOiBudW1iZXJcbn0+IHt9XG5cbmV4cG9ydCBjbGFzcyBNaXNzaW5nRmZtcGVnIGV4dGVuZHMgRGF0YS5UYWdnZWRFcnJvcihcIk1pc3NpbmdGZm1wZWdcIik8e1xuICBjb21tYW5kOiBzdHJpbmdcbiAgY2F1c2U/OiB1bmtub3duXG59PiB7fVxuXG5leHBvcnQgY2xhc3MgRmZtcGVnUmVuZGVyRmFpbGVkIGV4dGVuZHMgRGF0YS5UYWdnZWRFcnJvcihcIkZmbXBlZ1JlbmRlckZhaWxlZFwiKTx7XG4gIGZvcm1hdDogRmZtcGVnRm9ybWF0XG4gIG91dHB1dFBhdGg6IHN0cmluZ1xuICBzdGFnZTogXCJpbml0XCIgfCBcInN0cmVhbVwiIHwgXCJmaW5pc2hcIlxuICBjYXVzZT86IHVua25vd25cbiAgZXhpdENvZGU/OiBudW1iZXJcbiAgc2lnbmFsPzogc3RyaW5nXG59PiB7fVxuIiwKICAgICJpbXBvcnQgeyBFZmZlY3QgfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCB7IG1hcmtlZCB9IGZyb20gXCJtYXJrZWRcIlxuaW1wb3J0IHsgYnVuZGxlZExhbmd1YWdlcywgdHlwZSBCdW5kbGVkTGFuZ3VhZ2UgfSBmcm9tIFwic2hpa2lcIlxuaW1wb3J0IHR5cGUgeyBDb2RlQmxvY2sgfSBmcm9tIFwiLi90eXBlc1wiXG5pbXBvcnQgeyBNaXNzaW5nQ29kZUJsb2NrTGFuZ3VhZ2UsIFVuc3VwcG9ydGVkTGFuZ3VhZ2UgfSBmcm9tIFwiLi9lcnJvcnMuanNcIlxuXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplTGFuZ3VhZ2UgPSAocmF3TGFuZ3VhZ2U6IHN0cmluZykgPT4ge1xuICBjb25zdCB0cmltbWVkID0gcmF3TGFuZ3VhZ2UudHJpbSgpXG4gIGlmICghdHJpbW1lZCkge1xuICAgIHJldHVybiBcIlwiXG4gIH1cblxuICBjb25zdCBwcmltYXJ5ID0gdHJpbW1lZC5zcGxpdCgvXFxzKy8pWzBdID8/IFwiXCJcbiAgcmV0dXJuIHByaW1hcnkudG9Mb3dlckNhc2UoKVxufVxuXG5jb25zdCBjaGVja0lzU3VwcG9ydGVkTGFuZ3VhZ2UgPSAobGFuZ3VhZ2U6IHN0cmluZyk6IGxhbmd1YWdlIGlzIEJ1bmRsZWRMYW5ndWFnZSA9PlxuICBPYmplY3QuaGFzT3duKGJ1bmRsZWRMYW5ndWFnZXMsIGxhbmd1YWdlKVxuXG5leHBvcnQgY29uc3QgcGFyc2VNYXJrZG93bkNvZGVCbG9ja3MgPSBFZmZlY3QuZm4oZnVuY3Rpb24qIHBhcnNlTWFya2Rvd25Db2RlQmxvY2tzKFxuICBtYXJrZG93bjogc3RyaW5nXG4pIHtcbiAgY29uc3QgdG9rZW5zID0geWllbGQqIEVmZmVjdC50cnkoe1xuICAgIGNhdGNoOiAoKSA9PlxuICAgICAgbmV3IE1pc3NpbmdDb2RlQmxvY2tMYW5ndWFnZSh7IGNvbnRleHQ6IFwicGFyc2VcIiwgZGV0YWlsOiBcIlVuYWJsZSB0byBwYXJzZSBtYXJrZG93bi5cIiB9KSxcbiAgICB0cnk6ICgpID0+IG1hcmtlZC5sZXhlcihtYXJrZG93biksXG4gIH0pXG4gIGNvbnN0IGJsb2NrczogQ29kZUJsb2NrW10gPSBbXVxuXG4gIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgaWYgKHRva2VuLnR5cGUgIT09IFwiY29kZVwiKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IHJhd0xhbmd1YWdlID0gdHlwZW9mIHRva2VuLmxhbmcgPT09IFwic3RyaW5nXCIgPyB0b2tlbi5sYW5nLnRyaW0oKSA6IFwiXCJcbiAgICBjb25zdCBsYW5ndWFnZSA9IG5vcm1hbGl6ZUxhbmd1YWdlKHJhd0xhbmd1YWdlKVxuXG4gICAgaWYgKCFsYW5ndWFnZSkge1xuICAgICAgcmV0dXJuIHlpZWxkKiBuZXcgTWlzc2luZ0NvZGVCbG9ja0xhbmd1YWdlKHtcbiAgICAgICAgY29udGV4dDogXCJjb2RlQmxvY2tcIixcbiAgICAgICAgZGV0YWlsOiBcIkV2ZXJ5IGZlbmNlZCBjb2RlIGJsb2NrIG5lZWRzIGEgbGFuZ3VhZ2UgKGZvciBleGFtcGxlOiBgYGB0cykuXCIsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmICghY2hlY2tJc1N1cHBvcnRlZExhbmd1YWdlKGxhbmd1YWdlKSkge1xuICAgICAgcmV0dXJuIHlpZWxkKiBuZXcgVW5zdXBwb3J0ZWRMYW5ndWFnZSh7XG4gICAgICAgIGxhbmd1YWdlOiByYXdMYW5ndWFnZSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgYmxvY2tzLnB1c2goe1xuICAgICAgY29kZTogdG9rZW4udGV4dCxcbiAgICAgIGxhbmd1YWdlLFxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gYmxvY2tzXG59KVxuIiwKICAgICJpbXBvcnQgeyBFZmZlY3QgfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCB7IGJ1bmRsZWRUaGVtZXMsIHR5cGUgQnVuZGxlZFRoZW1lIH0gZnJvbSBcInNoaWtpXCJcbmltcG9ydCB7IFVua25vd25UaGVtZSB9IGZyb20gXCIuL2Vycm9yc1wiXG5cbmNvbnN0IGNoZWNrSXNTdXBwb3J0ZWRUaGVtZSA9ICh0aGVtZTogc3RyaW5nKTogdGhlbWUgaXMgQnVuZGxlZFRoZW1lID0+XG4gIE9iamVjdC5oYXNPd24oYnVuZGxlZFRoZW1lcywgdGhlbWUpXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlVGhlbWUgPSBFZmZlY3QuZm4oZnVuY3Rpb24qIHJlc29sdmVUaGVtZSh0aGVtZTogc3RyaW5nKSB7XG4gIGNvbnN0IHRyaW1tZWQgPSB0aGVtZS50cmltKClcbiAgaWYgKCFjaGVja0lzU3VwcG9ydGVkVGhlbWUodHJpbW1lZCkpIHtcbiAgICByZXR1cm4geWllbGQqIG5ldyBVbmtub3duVGhlbWUoeyB0aGVtZSB9KVxuICB9XG5cbiAgcmV0dXJuIHRyaW1tZWRcbn0pXG4iLAogICAgImltcG9ydCB7IGF2YWlsYWJsZVBhcmFsbGVsaXNtIH0gZnJvbSBcIm5vZGU6b3NcIlxuaW1wb3J0IHR5cGUgeyBCdW5kbGVkVGhlbWUgfSBmcm9tIFwic2hpa2lcIlxuaW1wb3J0ICogYXMgRmlsZVN5c3RlbSBmcm9tIFwiQGVmZmVjdC9wbGF0Zm9ybS9GaWxlU3lzdGVtXCJcbmltcG9ydCB7IGNyZWF0ZUNhbnZhcywgdHlwZSBTS1JTQ29udGV4dDJEIH0gZnJvbSBcIkBuYXBpLXJzL2NhbnZhc1wiXG5pbXBvcnQgeyBFZmZlY3QsIFN0cmVhbSB9IGZyb20gXCJlZmZlY3RcIlxuaW1wb3J0IHR5cGUgeyBDYW52YXNDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiXG5pbXBvcnQgdHlwZSB7IENvZGVCbG9jaywgUmVuZGVyQ29uZmlnLCBSZW5kZXJGcmFtZSB9IGZyb20gXCIuL3R5cGVzXCJcbmltcG9ydCB7IEZmbXBlZ1JlbmRlckZhaWxlZCwgdHlwZSBGZm1wZWdGb3JtYXQgfSBmcm9tIFwiLi9lcnJvcnNcIlxuaW1wb3J0IHsgZW5zdXJlRXZlbkRpbWVuc2lvbnMsIGVuc3VyZUZmbXBlZ0F2YWlsYWJsZSwgc3RhcnRGZm1wZWdQcm9jZXNzIH0gZnJvbSBcIi4vZmZtcGVnXCJcbmltcG9ydCB7IGJ1aWxkRnJhbWVzU3RyZWFtLCBjb21wdXRlRnJhbWVDb3VudHMsIHJlbmRlckZyYW1lIH0gZnJvbSBcIi4vcmVuZGVyXCJcbmltcG9ydCB7IGxheW91dFNjZW5lLCBtZWFzdXJlU2NlbmUsIHJlc29sdmVGcmFtZVNpemUgfSBmcm9tIFwiLi9zY2VuZVwiXG5cbmV4cG9ydCB0eXBlIFJlbmRlclZpZGVvT3B0aW9ucyA9IHtcbiAgY29uY3VycmVuY3k/OiBudW1iZXJcbiAgZm9ybWF0PzogRmZtcGVnRm9ybWF0XG59XG5cbmNvbnN0IGZyYW1lVG9CeXRlcyA9IChcbiAgY29uZmlnOiBSZW5kZXJDb25maWcsXG4gIGNvbnRleHQ6IENhbnZhc0NvbnRleHQsXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyXG4pID0+XG4gIEVmZmVjdC5mbihcInJlbmRlclZpZGVvLmZyYW1lVG9CeXRlc1wiKSgoZnJhbWU6IFJlbmRlckZyYW1lKSA9PlxuICAgIEVmZmVjdC5zeW5jKCgpID0+IHtcbiAgICAgIHJlbmRlckZyYW1lKGNvbmZpZywgY29udGV4dCwgd2lkdGgsIGhlaWdodCwgZnJhbWUpXG4gICAgICBjb25zdCBieXRlcyA9IChjb250ZXh0IGFzIFNLUlNDb250ZXh0MkQpLmNhbnZhcy5kYXRhKClcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbShieXRlcylcbiAgICB9KVxuICApXG5cbmV4cG9ydCBjb25zdCByZW5kZXJWaWRlbyA9IEVmZmVjdC5mbihmdW5jdGlvbiogcmVuZGVyVmlkZW8oXG4gIG91dHB1dFBhdGg6IHN0cmluZyxcbiAgdGhlbWU6IEJ1bmRsZWRUaGVtZSxcbiAgY29kZUJsb2NrczogQ29kZUJsb2NrW10sXG4gIGNvbmZpZzogUmVuZGVyQ29uZmlnLFxuICBvcHRpb25zOiBSZW5kZXJWaWRlb09wdGlvbnMgPSB7fVxuKSB7XG4gIHlpZWxkKiBlbnN1cmVGZm1wZWdBdmFpbGFibGUoKVxuXG4gIGNvbnN0IGNvbmN1cnJlbmN5ID0gb3B0aW9ucy5jb25jdXJyZW5jeSA/PyBNYXRoLm1pbig0LCBhdmFpbGFibGVQYXJhbGxlbGlzbSgpKVxuICBjb25zdCBmb3JtYXQgPSBvcHRpb25zLmZvcm1hdCA/PyBcIm1wNFwiXG5cbiAgY29uc3QgbWVhc3VyZWRTY2VuZXMgPSB5aWVsZCogRWZmZWN0LmZvckVhY2goXG4gICAgY29kZUJsb2NrcyxcbiAgICAoY29kZUJsb2NrKSA9PlxuICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBtZWFzdXJlbWVudENvbnRleHQgPSBjcmVhdGVDYW52YXMoMSwgMSkuZ2V0Q29udGV4dChcIjJkXCIpXG4gICAgICAgIG1lYXN1cmVtZW50Q29udGV4dC50ZXh0UmVuZGVyaW5nID0gXCJvcHRpbWl6ZUxlZ2liaWxpdHlcIlxuICAgICAgICByZXR1cm4geWllbGQqIG1lYXN1cmVTY2VuZShjb25maWcsIG1lYXN1cmVtZW50Q29udGV4dCwgY29kZUJsb2NrLCB0aGVtZSBhcyBuZXZlcilcbiAgICAgIH0pLFxuICAgIHsgY29uY3VycmVuY3kgfVxuICApXG5cbiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSByZXNvbHZlRnJhbWVTaXplKGNvbmZpZywgbWVhc3VyZWRTY2VuZXMpXG4gIGNvbnN0IHsgaGVpZ2h0OiBldmVuSGVpZ2h0LCB3aWR0aDogZXZlbldpZHRoIH0gPSBlbnN1cmVFdmVuRGltZW5zaW9ucyhmb3JtYXQsIHdpZHRoLCBoZWlnaHQpXG5cbiAgY29uc3QgY2FudmFzID0gY3JlYXRlQ2FudmFzKGV2ZW5XaWR0aCwgZXZlbkhlaWdodClcbiAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIilcbiAgY29udGV4dC50ZXh0UmVuZGVyaW5nID0gXCJvcHRpbWl6ZUxlZ2liaWxpdHlcIlxuXG4gIGNvbnN0IHNjZW5lcyA9IG1lYXN1cmVkU2NlbmVzLm1hcCgobWVhc3VyZWQpID0+XG4gICAgbGF5b3V0U2NlbmUoY29uZmlnLCBtZWFzdXJlZCwgZXZlbldpZHRoLCBldmVuSGVpZ2h0KVxuICApXG5cbiAgY29uc3QgZnJhbWVDb3VudHMgPSBjb21wdXRlRnJhbWVDb3VudHMoXG4gICAgY29uZmlnLnRyYW5zaXRpb25EdXJhdGlvbk1zLFxuICAgIGNvbmZpZy5mcHMsXG4gICAgY29uZmlnLmJsb2NrRHVyYXRpb25cbiAgKVxuICBjb25zdCBmcmFtZVN0cmVhbSA9IGJ1aWxkRnJhbWVzU3RyZWFtKFxuICAgIGNvbmZpZyxcbiAgICBzY2VuZXMsXG4gICAgZnJhbWVDb3VudHMuYmxvY2tGcmFtZXMsXG4gICAgZnJhbWVDb3VudHMudHJhbnNpdGlvbkZyYW1lc1xuICApXG4gIGNvbnN0IGZyYW1lQnl0ZXNTdHJlYW0gPSBmcmFtZVN0cmVhbS5waXBlKFxuICAgIFN0cmVhbS5tYXBFZmZlY3QoZnJhbWVUb0J5dGVzKGNvbmZpZywgY29udGV4dCwgZXZlbldpZHRoLCBldmVuSGVpZ2h0KSlcbiAgKVxuXG4gIHJldHVybiB5aWVsZCogRWZmZWN0LnNjb3BlZChcbiAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBjb25zdCBmaWxlU3lzdGVtID0geWllbGQqIEZpbGVTeXN0ZW0uRmlsZVN5c3RlbVxuICAgICAgY29uc3QgcmF3UGF0aCA9IHlpZWxkKiBmaWxlU3lzdGVtLm1ha2VUZW1wRmlsZVNjb3BlZCh7IHN1ZmZpeDogXCIucmF3XCIgfSlcblxuICAgICAgeWllbGQqIFN0cmVhbS5ydW4oZnJhbWVCeXRlc1N0cmVhbSwgZmlsZVN5c3RlbS5zaW5rKHJhd1BhdGgpKS5waXBlKFxuICAgICAgICBFZmZlY3QubWFwRXJyb3IoXG4gICAgICAgICAgKGNhdXNlKSA9PlxuICAgICAgICAgICAgbmV3IEZmbXBlZ1JlbmRlckZhaWxlZCh7XG4gICAgICAgICAgICAgIGNhdXNlLFxuICAgICAgICAgICAgICBmb3JtYXQsXG4gICAgICAgICAgICAgIG91dHB1dFBhdGgsXG4gICAgICAgICAgICAgIHN0YWdlOiBcInN0cmVhbVwiLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKVxuXG4gICAgICBjb25zdCBwcm9jZXNzID0geWllbGQqIEVmZmVjdC5hY3F1aXJlUmVsZWFzZShcbiAgICAgICAgc3RhcnRGZm1wZWdQcm9jZXNzKGZvcm1hdCwgZXZlbldpZHRoLCBldmVuSGVpZ2h0LCBjb25maWcuZnBzLCByYXdQYXRoLCBvdXRwdXRQYXRoKS5waXBlKFxuICAgICAgICAgIEVmZmVjdC5tYXBFcnJvcihcbiAgICAgICAgICAgIChjYXVzZSkgPT5cbiAgICAgICAgICAgICAgbmV3IEZmbXBlZ1JlbmRlckZhaWxlZCh7XG4gICAgICAgICAgICAgICAgY2F1c2UsXG4gICAgICAgICAgICAgICAgZm9ybWF0LFxuICAgICAgICAgICAgICAgIG91dHB1dFBhdGgsXG4gICAgICAgICAgICAgICAgc3RhZ2U6IFwiaW5pdFwiLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAgKHByb2Nlc3MpID0+IHByb2Nlc3Mua2lsbChcIlNJR1RFUk1cIikucGlwZShFZmZlY3Qub3JEaWUpXG4gICAgICApXG5cbiAgICAgIGNvbnN0IGV4aXRDb2RlID0geWllbGQqIHByb2Nlc3MuZXhpdENvZGVcbiAgICAgIGlmIChleGl0Q29kZSA9PT0gbnVsbCB8fCBOdW1iZXIoZXhpdENvZGUpICE9PSAwKSB7XG4gICAgICAgIHJldHVybiB5aWVsZCogbmV3IEZmbXBlZ1JlbmRlckZhaWxlZCh7XG4gICAgICAgICAgLi4uKGV4aXRDb2RlICE9PSBudWxsICYmIHsgZXhpdENvZGU6IE51bWJlcihleGl0Q29kZSkgfSksXG4gICAgICAgICAgZm9ybWF0LFxuICAgICAgICAgIG91dHB1dFBhdGgsXG4gICAgICAgICAgc3RhZ2U6IFwiZmluaXNoXCIsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvdXRwdXRQYXRoXG4gICAgfSlcbiAgKVxufSlcbiIsCiAgICAiaW1wb3J0IHsgQ29tbWFuZCBhcyBTaGVsbENvbW1hbmQgfSBmcm9tIFwiQGVmZmVjdC9wbGF0Zm9ybVwiXG5pbXBvcnQgeyBFZmZlY3QgfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCB7IE1pc3NpbmdGZm1wZWcsIHR5cGUgRmZtcGVnRm9ybWF0IH0gZnJvbSBcIi4vZXJyb3JzXCJcblxuY29uc3QgRkZNUEVHX0JJTkFSWSA9IFwiZmZtcGVnXCJcblxuY29uc3QgQ09ERUNfQllfRk9STUFUOiBSZWNvcmQ8RmZtcGVnRm9ybWF0LCBzdHJpbmc+ID0ge1xuICBtcDQ6IFwibGlieDI2NFwiLFxuICB3ZWJtOiBcImxpYnZweC12cDlcIixcbn1cblxuY29uc3QgUElYX0ZNVF9CWV9GT1JNQVQ6IFJlY29yZDxGZm1wZWdGb3JtYXQsIHN0cmluZz4gPSB7XG4gIG1wNDogXCJ5dXY0NDRwXCIsXG4gIHdlYm06IFwieXV2NDIwcFwiLFxufVxuXG5jb25zdCBRVUFMSVRZX0FSR1NfQllfRk9STUFUOiBSZWNvcmQ8RmZtcGVnRm9ybWF0LCByZWFkb25seSBzdHJpbmdbXT4gPSB7XG4gIG1wNDogW1wiLWNyZlwiLCBcIjE0XCIsIFwiLXByZXNldFwiLCBcInNsb3dcIl0sXG4gIHdlYm06IFtcIi1jcmZcIiwgXCIxOFwiLCBcIi1iOnZcIiwgXCIwXCJdLFxufVxuXG5jb25zdCBlbnN1cmVFdmVuID0gKHZhbHVlOiBudW1iZXIpID0+ICh2YWx1ZSAlIDIgPT09IDAgPyB2YWx1ZSA6IHZhbHVlICsgMSlcblxuZXhwb3J0IGNvbnN0IGVuc3VyZUV2ZW5EaW1lbnNpb25zID0gKGZvcm1hdDogRmZtcGVnRm9ybWF0LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikgPT4ge1xuICBpZiAoUElYX0ZNVF9CWV9GT1JNQVRbZm9ybWF0XSAhPT0gXCJ5dXY0MjBwXCIpIHtcbiAgICByZXR1cm4geyBoZWlnaHQsIHdpZHRoIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaGVpZ2h0OiBlbnN1cmVFdmVuKGhlaWdodCksXG4gICAgd2lkdGg6IGVuc3VyZUV2ZW4od2lkdGgpLFxuICB9XG59XG5cbmNvbnN0IGJ1aWxkQXJncyA9IChcbiAgZm9ybWF0OiBGZm1wZWdGb3JtYXQsXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyLFxuICBmcHM6IG51bWJlcixcbiAgaW5wdXRQYXRoOiBzdHJpbmcsXG4gIG91dHB1dFBhdGg6IHN0cmluZ1xuKSA9PiBbXG4gIFwiLWZcIixcbiAgXCJyYXd2aWRlb1wiLFxuICBcIi1waXhfZm10XCIsXG4gIFwicmdiYVwiLFxuICBcIi1zXCIsXG4gIGAke3dpZHRofXgke2hlaWdodH1gLFxuICBcIi1yXCIsXG4gIGAke2Zwc31gLFxuICBcIi1pXCIsXG4gIGlucHV0UGF0aCxcbiAgXCItdmZcIixcbiAgXCJ1bnNoYXJwPTU6NTowLjU6NTo1OjAuNVwiLFxuICBcIi1jOnZcIixcbiAgQ09ERUNfQllfRk9STUFUW2Zvcm1hdF0sXG4gIC4uLlFVQUxJVFlfQVJHU19CWV9GT1JNQVRbZm9ybWF0XSxcbiAgXCItcGl4X2ZtdFwiLFxuICBQSVhfRk1UX0JZX0ZPUk1BVFtmb3JtYXRdLFxuICBcIi15XCIsXG4gIG91dHB1dFBhdGgsXG5dXG5cbmNvbnN0IGZmbXBlZ0NoZWNrQ29tbWFuZCA9IHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIiA/IFwid2hlcmVcIiA6IFwid2hpY2hcIlxuXG5leHBvcnQgY29uc3QgZW5zdXJlRmZtcGVnQXZhaWxhYmxlID0gRWZmZWN0LmZuKFwiZW5zdXJlRmZtcGVnQXZhaWxhYmxlXCIpKGZ1bmN0aW9uKiAoKSB7XG4gIGNvbnN0IGV4aXRDb2RlID0geWllbGQqIFNoZWxsQ29tbWFuZC5tYWtlKGZmbXBlZ0NoZWNrQ29tbWFuZCwgRkZNUEVHX0JJTkFSWSkucGlwZShcbiAgICBTaGVsbENvbW1hbmQuc3RkZXJyKFwicGlwZVwiKSxcbiAgICBTaGVsbENvbW1hbmQuc3Rkb3V0KFwicGlwZVwiKSxcbiAgICBTaGVsbENvbW1hbmQuZXhpdENvZGUsXG4gICAgRWZmZWN0Lm1hcEVycm9yKChjYXVzZSkgPT4gbmV3IE1pc3NpbmdGZm1wZWcoeyBjYXVzZSwgY29tbWFuZDogRkZNUEVHX0JJTkFSWSB9KSlcbiAgKVxuXG4gIGlmIChOdW1iZXIoZXhpdENvZGUpICE9PSAwKSB7XG4gICAgcmV0dXJuIHlpZWxkKiBuZXcgTWlzc2luZ0ZmbXBlZyh7IGNvbW1hbmQ6IEZGTVBFR19CSU5BUlkgfSlcbiAgfVxufSlcblxuZXhwb3J0IGNvbnN0IHN0YXJ0RmZtcGVnUHJvY2VzcyA9IChcbiAgZm9ybWF0OiBGZm1wZWdGb3JtYXQsXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyLFxuICBmcHM6IG51bWJlcixcbiAgaW5wdXRQYXRoOiBzdHJpbmcsXG4gIG91dHB1dFBhdGg6IHN0cmluZ1xuKSA9PlxuICBTaGVsbENvbW1hbmQubWFrZShcbiAgICBGRk1QRUdfQklOQVJZLFxuICAgIC4uLmJ1aWxkQXJncyhmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGZwcywgaW5wdXRQYXRoLCBvdXRwdXRQYXRoKVxuICApLnBpcGUoXG4gICAgU2hlbGxDb21tYW5kLnN0ZGluKFwiaW5oZXJpdFwiKSxcbiAgICBTaGVsbENvbW1hbmQuc3Rkb3V0KFwiaW5oZXJpdFwiKSxcbiAgICBTaGVsbENvbW1hbmQuc3RkZXJyKFwiaW5oZXJpdFwiKSxcbiAgICBTaGVsbENvbW1hbmQuc3RhcnRcbiAgKVxuIiwKICAgICJpbXBvcnQgeyBTdHJlYW0gfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCB0eXBlIHsgQ2FudmFzQ29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRcIlxuaW1wb3J0IHR5cGUgeyBSZW5kZXJDb25maWcsIFJlbmRlckZyYW1lLCBTY2VuZSB9IGZyb20gXCIuL3R5cGVzXCJcbmltcG9ydCB7IGJsZW5kQ29sb3JzIH0gZnJvbSBcIi4vY29sb3JcIlxuaW1wb3J0IHsgcmVuZGVyU2NlbmVUZXh0IH0gZnJvbSBcIi4vc2NlbmVcIlxuaW1wb3J0IHtcbiAgYnVpbGRUcmFuc2l0aW9uRGlmZixcbiAgYnVpbGRUcmFuc2l0aW9uVG9rZW5zLFxuICBlYXNlSW5PdXRDdWJpYyxcbiAgcmVuZGVyVHJhbnNpdGlvblRva2Vucyxcbn0gZnJvbSBcIi4vdHJhbnNpdGlvblwiXG5cbmV4cG9ydCBjb25zdCByZW5kZXJGcmFtZSA9IChcbiAgY29uZmlnOiBSZW5kZXJDb25maWcsXG4gIGNvbnRleHQ6IENhbnZhc0NvbnRleHQsXG4gIGZyYW1lV2lkdGg6IG51bWJlcixcbiAgZnJhbWVIZWlnaHQ6IG51bWJlcixcbiAgZnJhbWU6IFJlbmRlckZyYW1lXG4pID0+IHtcbiAgY29uc3QgZnJhbWVDb250ZXh0ID0gY29udGV4dFxuICBjb25zdCBzdGFydFRyYW5zZm9ybSA9IGZyYW1lQ29udGV4dC5nZXRUcmFuc2Zvcm0oKVxuICBpZiAodHlwZW9mIGZyYW1lQ29udGV4dC5zZXRUcmFuc2Zvcm1NYXRyaXggIT09IFwiZnVuY3Rpb25cIikge1xuICAgIGZyYW1lQ29udGV4dC5zZXRUcmFuc2Zvcm1NYXRyaXggPSAodHJhbnNmb3JtKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiB0cmFuc2Zvcm0gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgdHJhbnNmb3JtICE9PSBudWxsICYmXG4gICAgICAgIFwiYVwiIGluIHRyYW5zZm9ybSAmJlxuICAgICAgICBcImJcIiBpbiB0cmFuc2Zvcm0gJiZcbiAgICAgICAgXCJjXCIgaW4gdHJhbnNmb3JtICYmXG4gICAgICAgIFwiZFwiIGluIHRyYW5zZm9ybSAmJlxuICAgICAgICBcImVcIiBpbiB0cmFuc2Zvcm0gJiZcbiAgICAgICAgXCJmXCIgaW4gdHJhbnNmb3JtXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgbWF0cml4ID0gdHJhbnNmb3JtIGFzIHtcbiAgICAgICAgICBhOiBudW1iZXJcbiAgICAgICAgICBiOiBudW1iZXJcbiAgICAgICAgICBjOiBudW1iZXJcbiAgICAgICAgICBkOiBudW1iZXJcbiAgICAgICAgICBlOiBudW1iZXJcbiAgICAgICAgICBmOiBudW1iZXJcbiAgICAgICAgfVxuICAgICAgICBmcmFtZUNvbnRleHQuc2V0VHJhbnNmb3JtKG1hdHJpeC5hLCBtYXRyaXguYiwgbWF0cml4LmMsIG1hdHJpeC5kLCBtYXRyaXguZSwgbWF0cml4LmYpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcmFtZUNvbnRleHQuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApXG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IHN0YXJ0QWxwaGEgPSBmcmFtZUNvbnRleHQuZ2xvYmFsQWxwaGFcbiAgY29uc3Qgc3RhcnRGaWxsU3R5bGUgPSBmcmFtZUNvbnRleHQuZmlsbFN0eWxlXG5cbiAgZnJhbWVDb250ZXh0LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKVxuICBmcmFtZUNvbnRleHQuZ2xvYmFsQWxwaGEgPSAxXG4gIGZyYW1lQ29udGV4dC5maWxsU3R5bGUgPSBmcmFtZS5iYWNrZ3JvdW5kXG4gIGZyYW1lQ29udGV4dC5maWxsUmVjdCgwLCAwLCBmcmFtZVdpZHRoLCBmcmFtZUhlaWdodClcblxuICBpZiAoZnJhbWUua2luZCA9PT0gXCJzY2VuZVwiKSB7XG4gICAgcmVuZGVyU2NlbmVUZXh0KFxuICAgICAgY29uZmlnLFxuICAgICAgZnJhbWVDb250ZXh0LFxuICAgICAgZnJhbWUuc2NlbmUsXG4gICAgICBmcmFtZS5vcGFjaXR5LFxuICAgICAgZnJhbWUucG9zaXRpb25YLFxuICAgICAgZnJhbWUucG9zaXRpb25ZXG4gICAgKVxuICB9IGVsc2Uge1xuICAgIHJlbmRlclRyYW5zaXRpb25Ub2tlbnMoY29uZmlnLCBmcmFtZUNvbnRleHQsIGZyYW1lLnRva2VucylcbiAgfVxuXG4gIGlmICh0eXBlb2YgZnJhbWVDb250ZXh0LnNldFRyYW5zZm9ybU1hdHJpeCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZnJhbWVDb250ZXh0LnNldFRyYW5zZm9ybU1hdHJpeChzdGFydFRyYW5zZm9ybSlcbiAgfVxuICBmcmFtZUNvbnRleHQuZ2xvYmFsQWxwaGEgPSBzdGFydEFscGhhXG4gIGZyYW1lQ29udGV4dC5maWxsU3R5bGUgPSBzdGFydEZpbGxTdHlsZVxufVxuXG5leHBvcnQgY29uc3QgY29tcHV0ZUZyYW1lQ291bnRzID0gKFxuICB0cmFuc2l0aW9uRHVyYXRpb25NczogbnVtYmVyLFxuICBmcHM6IG51bWJlcixcbiAgYmxvY2tEdXJhdGlvbjogbnVtYmVyXG4pID0+IHtcbiAgY29uc3QgZnJhbWVEdXJhdGlvbiA9IDEgLyBmcHNcbiAgY29uc3QgYmxvY2tGcmFtZXMgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGJsb2NrRHVyYXRpb24gKiBmcHMpKVxuICBjb25zdCB0cmFuc2l0aW9uRnJhbWVzID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZCgodHJhbnNpdGlvbkR1cmF0aW9uTXMgLyAxMDAwKSAqIGZwcykpXG5cbiAgcmV0dXJuIHtcbiAgICBibG9ja0ZyYW1lcyxcbiAgICBmcmFtZUR1cmF0aW9uLFxuICAgIHRyYW5zaXRpb25GcmFtZXMsXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGJ1aWxkU2NlbmVGcmFtZXMgPSAoc2NlbmU6IFNjZW5lLCBibG9ja0ZyYW1lczogbnVtYmVyKSA9PlxuICBTdHJlYW0ucmFuZ2UoMSwgYmxvY2tGcmFtZXMpLnBpcGUoXG4gICAgU3RyZWFtLm1hcChcbiAgICAgICgpID0+XG4gICAgICAgICh7XG4gICAgICAgICAgYmFja2dyb3VuZDogc2NlbmUuYmFja2dyb3VuZCxcbiAgICAgICAgICBraW5kOiBcInNjZW5lXCIsXG4gICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICBwb3NpdGlvblg6IHNjZW5lLmJsb2NrWCxcbiAgICAgICAgICBwb3NpdGlvblk6IHNjZW5lLmJsb2NrWSxcbiAgICAgICAgICBzY2VuZSxcbiAgICAgICAgfSkgc2F0aXNmaWVzIFJlbmRlckZyYW1lXG4gICAgKVxuICApXG5cbmV4cG9ydCBjb25zdCBidWlsZFRyYW5zaXRpb25GcmFtZXMgPSAoXG4gIGNvbmZpZzogUmVuZGVyQ29uZmlnLFxuICBzY2VuZTogU2NlbmUsXG4gIG5leHRTY2VuZTogU2NlbmUsXG4gIHRyYW5zaXRpb25GcmFtZXM6IG51bWJlclxuKSA9PiB7XG4gIGNvbnN0IGRpZmYgPSBidWlsZFRyYW5zaXRpb25EaWZmKHNjZW5lLCBuZXh0U2NlbmUpXG5cbiAgcmV0dXJuIFN0cmVhbS5yYW5nZSgxLCB0cmFuc2l0aW9uRnJhbWVzKS5waXBlKFxuICAgIFN0cmVhbS5tYXAoKGluZGV4KSA9PiB7XG4gICAgICBjb25zdCByYXdQcm9ncmVzcyA9IGluZGV4IC8gdHJhbnNpdGlvbkZyYW1lc1xuICAgICAgY29uc3QgcHJvZ3Jlc3MgPSBlYXNlSW5PdXRDdWJpYyhyYXdQcm9ncmVzcylcbiAgICAgIGNvbnN0IGJsZW5kZWRCYWNrZ3JvdW5kID0gYmxlbmRDb2xvcnMoc2NlbmUuYmFja2dyb3VuZCwgbmV4dFNjZW5lLmJhY2tncm91bmQsIHByb2dyZXNzKVxuICAgICAgY29uc3QgdG9rZW5zID0gYnVpbGRUcmFuc2l0aW9uVG9rZW5zKGNvbmZpZywgZGlmZiwgcHJvZ3Jlc3MpXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJhY2tncm91bmQ6IGJsZW5kZWRCYWNrZ3JvdW5kLFxuICAgICAgICBraW5kOiBcInRyYW5zaXRpb25cIixcbiAgICAgICAgdG9rZW5zLFxuICAgICAgfSBzYXRpc2ZpZXMgUmVuZGVyRnJhbWVcbiAgICB9KVxuICApXG59XG5cbmV4cG9ydCBjb25zdCBidWlsZEZyYW1lc1N0cmVhbSA9IChcbiAgY29uZmlnOiBSZW5kZXJDb25maWcsXG4gIHNjZW5lczogU2NlbmVbXSxcbiAgYmxvY2tGcmFtZXM6IG51bWJlcixcbiAgdHJhbnNpdGlvbkZyYW1lczogbnVtYmVyXG4pID0+XG4gIFN0cmVhbS5mcm9tSXRlcmFibGUoc2NlbmVzKS5waXBlKFxuICAgIFN0cmVhbS56aXBXaXRoSW5kZXgsXG4gICAgU3RyZWFtLmZsYXRNYXAoKFtzY2VuZSwgaW5kZXhdKSA9PiB7XG4gICAgICBjb25zdCBuZXh0U2NlbmUgPSBzY2VuZXNbaW5kZXggKyAxXVxuICAgICAgY29uc3QgYmFzZSA9IGJ1aWxkU2NlbmVGcmFtZXMoc2NlbmUsIGJsb2NrRnJhbWVzKVxuICAgICAgcmV0dXJuIG5leHRTY2VuZVxuICAgICAgICA/IFN0cmVhbS5jb25jYXQoYmFzZSwgYnVpbGRUcmFuc2l0aW9uRnJhbWVzKGNvbmZpZywgc2NlbmUsIG5leHRTY2VuZSwgdHJhbnNpdGlvbkZyYW1lcykpXG4gICAgICAgIDogYmFzZVxuICAgIH0pXG4gIClcbiIsCiAgICAiZXhwb3J0IGNvbnN0IGV4cGFuZFNob3J0SGV4ID0gKGhleDogc3RyaW5nKSA9PiB7XG4gIGlmIChoZXgubGVuZ3RoID09PSAzKSB7XG4gICAgY29uc3QgciA9IGhleC5jaGFyQXQoMClcbiAgICBjb25zdCBnID0gaGV4LmNoYXJBdCgxKVxuICAgIGNvbnN0IGIgPSBoZXguY2hhckF0KDIpXG4gICAgcmV0dXJuIHIgKyByICsgZyArIGcgKyBiICsgYlxuICB9XG4gIGlmIChoZXgubGVuZ3RoID09PSA0KSB7XG4gICAgY29uc3QgciA9IGhleC5jaGFyQXQoMClcbiAgICBjb25zdCBnID0gaGV4LmNoYXJBdCgxKVxuICAgIGNvbnN0IGIgPSBoZXguY2hhckF0KDIpXG4gICAgY29uc3QgYSA9IGhleC5jaGFyQXQoMylcbiAgICByZXR1cm4gciArIHIgKyBnICsgZyArIGIgKyBiICsgYSArIGFcbiAgfVxuICByZXR1cm4gaGV4XG59XG5cbmV4cG9ydCBjb25zdCBwYXJzZUhleENvbG9yID0gKGNvbG9yOiBzdHJpbmcpID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IGV4cGFuZFNob3J0SGV4KGNvbG9yLnJlcGxhY2UoXCIjXCIsIFwiXCIpLnRyaW0oKSlcbiAgaWYgKG5vcm1hbGl6ZWQubGVuZ3RoICE9PSA2ICYmIG5vcm1hbGl6ZWQubGVuZ3RoICE9PSA4KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFscGhhOiAxLFxuICAgICAgYmx1ZTogMTEsXG4gICAgICBncmVlbjogMTEsXG4gICAgICByZWQ6IDExLFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlZCA9IE51bWJlci5wYXJzZUludChub3JtYWxpemVkLnNsaWNlKDAsIDIpLCAxNilcbiAgY29uc3QgZ3JlZW4gPSBOdW1iZXIucGFyc2VJbnQobm9ybWFsaXplZC5zbGljZSgyLCA0KSwgMTYpXG4gIGNvbnN0IGJsdWUgPSBOdW1iZXIucGFyc2VJbnQobm9ybWFsaXplZC5zbGljZSg0LCA2KSwgMTYpXG4gIGNvbnN0IGFscGhhID0gbm9ybWFsaXplZC5sZW5ndGggPT09IDggPyBOdW1iZXIucGFyc2VJbnQobm9ybWFsaXplZC5zbGljZSg2LCA4KSwgMTYpIC8gMjU1IDogMVxuXG4gIGlmIChOdW1iZXIuaXNOYU4ocmVkKSB8fCBOdW1iZXIuaXNOYU4oZ3JlZW4pIHx8IE51bWJlci5pc05hTihibHVlKSB8fCBOdW1iZXIuaXNOYU4oYWxwaGEpKSB7XG4gICAgcmV0dXJuIHsgYWxwaGE6IDEsIGJsdWU6IDExLCBncmVlbjogMTEsIHJlZDogMTEgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhbHBoYSxcbiAgICBibHVlLFxuICAgIGdyZWVuLFxuICAgIHJlZCxcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbGVycCA9IChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgcHJvZ3Jlc3M6IG51bWJlcikgPT5cbiAgc3RhcnQgKyAoZW5kIC0gc3RhcnQpICogcHJvZ3Jlc3NcblxuZXhwb3J0IGNvbnN0IGJsZW5kQ29sb3JzID0gKGZyb206IHN0cmluZywgdG86IHN0cmluZywgcHJvZ3Jlc3M6IG51bWJlcikgPT4ge1xuICBjb25zdCBmcm9tQ29sb3IgPSBwYXJzZUhleENvbG9yKGZyb20pXG4gIGNvbnN0IHRvQ29sb3IgPSBwYXJzZUhleENvbG9yKHRvKVxuXG4gIGNvbnN0IGJsZW5kZWQgPSB7XG4gICAgYWxwaGE6IGxlcnAoZnJvbUNvbG9yLmFscGhhLCB0b0NvbG9yLmFscGhhLCBwcm9ncmVzcyksXG4gICAgYmx1ZTogbGVycChmcm9tQ29sb3IuYmx1ZSwgdG9Db2xvci5ibHVlLCBwcm9ncmVzcyksXG4gICAgZ3JlZW46IGxlcnAoZnJvbUNvbG9yLmdyZWVuLCB0b0NvbG9yLmdyZWVuLCBwcm9ncmVzcyksXG4gICAgcmVkOiBsZXJwKGZyb21Db2xvci5yZWQsIHRvQ29sb3IucmVkLCBwcm9ncmVzcyksXG4gIH1cblxuICByZXR1cm4gYHJnYmEoJHtNYXRoLnJvdW5kKGJsZW5kZWQucmVkKX0sICR7TWF0aC5yb3VuZChibGVuZGVkLmdyZWVuKX0sICR7TWF0aC5yb3VuZChcbiAgICBibGVuZGVkLmJsdWVcbiAgKX0sICR7YmxlbmRlZC5hbHBoYS50b0ZpeGVkKDMpfSlgXG59XG4iLAogICAgImltcG9ydCB7IEVmZmVjdCB9IGZyb20gXCJlZmZlY3RcIlxuaW1wb3J0IHsgY29kZVRvVG9rZW5zLCB0eXBlIEJ1bmRsZWRUaGVtZSwgdHlwZSBUaGVtZWRUb2tlbiB9IGZyb20gXCJzaGlraVwiXG5pbXBvcnQgdHlwZSB7IENhbnZhc0NvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCJcbmltcG9ydCB0eXBlIHtcbiAgQ29kZUJsb2NrLFxuICBMYXlvdXRUb2tlbixcbiAgUmVuZGVyQ29uZmlnLFxuICBTY2VuZSxcbiAgU2NlbmVMYXlvdXQsXG4gIFRva2VuQ2F0ZWdvcnksXG59IGZyb20gXCIuL3R5cGVzXCJcbmltcG9ydCB7XG4gIEZPTlRfU1RZTEVfQk9MRCxcbiAgRk9OVF9TVFlMRV9JVEFMSUMsXG4gIEZPTlRfU1RZTEVfTk9ORSxcbiAgRk9OVF9TVFlMRV9VTkRFUkxJTkUsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5pbXBvcnQgeyBTY2VuZU1lYXN1cmVGYWlsZWQgfSBmcm9tIFwiLi9lcnJvcnNcIlxuaW1wb3J0IHsgYnVpbGRGb250LCBkcmF3VW5kZXJsaW5lIH0gZnJvbSBcIi4vdGV4dFwiXG5pbXBvcnQgeyBjYXRlZ29yaXplVG9rZW4gfSBmcm9tIFwiLi90b2tlblwiXG5cbmNvbnN0IG5vcm1hbGl6ZVRva2VuQ29udGVudCA9IChjb25maWc6IFJlbmRlckNvbmZpZywgY29udGVudDogc3RyaW5nKSA9PlxuICBjb250ZW50LnNwbGl0KFwiXFx0XCIpLmpvaW4oY29uZmlnLnRhYlJlcGxhY2VtZW50KVxuXG5jb25zdCBtZWFzdXJlVG9rZW5XaWR0aCA9IChcbiAgY29uZmlnOiBSZW5kZXJDb25maWcsXG4gIGNvbnRleHQ6IENhbnZhc0NvbnRleHQsXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgaXNJdGFsaWM6IGJvb2xlYW4sXG4gIGlzQm9sZDogYm9vbGVhblxuKSA9PiB7XG4gIGNvbnN0IG1lYXN1cmVDb250ZXh0ID0gY29udGV4dFxuICBjb25zdCBwcmV2aW91c0ZvbnQgPSBtZWFzdXJlQ29udGV4dC5mb250XG4gIG1lYXN1cmVDb250ZXh0LmZvbnQgPSBidWlsZEZvbnQoY29uZmlnLCBpc0l0YWxpYywgaXNCb2xkKVxuICBjb25zdCB3aWR0aCA9IG1lYXN1cmVDb250ZXh0Lm1lYXN1cmVUZXh0KGNvbnRlbnQpLndpZHRoXG4gIG1lYXN1cmVDb250ZXh0LmZvbnQgPSBwcmV2aW91c0ZvbnRcbiAgcmV0dXJuIHdpZHRoXG59XG5cbmNvbnN0IHJlc29sdmVUb2tlbkNhdGVnb3J5ID0gKHRva2VuOiBUaGVtZWRUb2tlbikgPT4ge1xuICBjb25zdCBzY29wZXMgPVxuICAgIHRva2VuLmV4cGxhbmF0aW9uPy5mbGF0TWFwKChleHBsYW5hdGlvbikgPT5cbiAgICAgIGV4cGxhbmF0aW9uLnNjb3Blcy5tYXAoKHNjb3BlKSA9PiBzY29wZS5zY29wZU5hbWUpXG4gICAgKSA/PyBbXVxuICByZXR1cm4gY2F0ZWdvcml6ZVRva2VuKHNjb3Blcylcbn1cblxudHlwZSBNZWFzdXJlZFRva2VuID0ge1xuICBjYXRlZ29yeTogVG9rZW5DYXRlZ29yeVxuICBjb2xvcjogc3RyaW5nXG4gIGNvbnRlbnQ6IHN0cmluZ1xuICBmb250U3R5bGU6IG51bWJlclxuICB3aWR0aDogbnVtYmVyXG59XG5cbnR5cGUgTWVhc3VyZWRMaW5lID0ge1xuICB0b2tlbnM6IE1lYXN1cmVkVG9rZW5bXVxuICB3aWR0aDogbnVtYmVyXG59XG5cbmV4cG9ydCB0eXBlIE1lYXN1cmVkU2NlbmUgPSB7XG4gIGJhY2tncm91bmQ6IHN0cmluZ1xuICBibG9ja0hlaWdodDogbnVtYmVyXG4gIGJsb2NrV2lkdGg6IG51bWJlclxuICBjb250ZW50SGVpZ2h0OiBudW1iZXJcbiAgY29udGVudFdpZHRoOiBudW1iZXJcbiAgZm9yZWdyb3VuZDogc3RyaW5nXG4gIGxpbmVzOiBNZWFzdXJlZExpbmVbXVxuICB0b2tlbnM6IFRoZW1lZFRva2VuW11bXVxufVxuXG5leHBvcnQgY29uc3QgbWVhc3VyZVNjZW5lID0gRWZmZWN0LmZuKGZ1bmN0aW9uKiBtZWFzdXJlU2NlbmUoXG4gIGNvbmZpZzogUmVuZGVyQ29uZmlnLFxuICBjb250ZXh0OiBDYW52YXNDb250ZXh0LFxuICBjb2RlQmxvY2s6IENvZGVCbG9jayxcbiAgdGhlbWU6IEJ1bmRsZWRUaGVtZVxuKSB7XG4gIHJldHVybiB5aWVsZCogRWZmZWN0LnRyeVByb21pc2Uoe1xuICAgIGNhdGNoOiAoY2F1c2U6IHVua25vd24pID0+IG5ldyBTY2VuZU1lYXN1cmVGYWlsZWQoeyBjYXVzZSB9KSxcbiAgICB0cnk6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRva2VuUmVzdWx0ID0gYXdhaXQgY29kZVRvVG9rZW5zKGNvZGVCbG9jay5jb2RlLCB7XG4gICAgICAgIGluY2x1ZGVFeHBsYW5hdGlvbjogXCJzY29wZU5hbWVcIixcbiAgICAgICAgbGFuZzogY29kZUJsb2NrLmxhbmd1YWdlLFxuICAgICAgICB0aGVtZSxcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IHRva2VucyA9IHRva2VuUmVzdWx0LnRva2Vuc1xuICAgICAgY29uc3QgZm9yZWdyb3VuZCA9IHRva2VuUmVzdWx0LmZnID8/IGNvbmZpZy5mb3JlZ3JvdW5kXG4gICAgICBjb25zdCBiYWNrZ3JvdW5kID0gdG9rZW5SZXN1bHQuYmcgPz8gY29uZmlnLmJhY2tncm91bmRcblxuICAgICAgY29uc3QgbGluZU1ldHJpY3MgPSB0b2tlbnMubWFwKChsaW5lVG9rZW5zKSA9PiB7XG4gICAgICAgIGNvbnN0IG1ldHJpY3M6IE1lYXN1cmVkVG9rZW5bXSA9IFtdXG4gICAgICAgIGxldCBsaW5lV2lkdGggPSAwXG5cbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiBsaW5lVG9rZW5zKSB7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IG5vcm1hbGl6ZVRva2VuQ29udGVudChjb25maWcsIHRva2VuLmNvbnRlbnQpXG4gICAgICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHN0eWxlRmxhZ3MgPSB0b2tlbi5mb250U3R5bGUgPz8gRk9OVF9TVFlMRV9OT05FXG4gICAgICAgICAgY29uc3QgaXNJdGFsaWMgPSAoc3R5bGVGbGFncyAmIEZPTlRfU1RZTEVfSVRBTElDKSA9PT0gRk9OVF9TVFlMRV9JVEFMSUNcbiAgICAgICAgICBjb25zdCBpc0JvbGQgPSAoc3R5bGVGbGFncyAmIEZPTlRfU1RZTEVfQk9MRCkgPT09IEZPTlRfU1RZTEVfQk9MRFxuICAgICAgICAgIGNvbnN0IHdpZHRoID0gbWVhc3VyZVRva2VuV2lkdGgoY29uZmlnLCBjb250ZXh0LCBjb250ZW50LCBpc0l0YWxpYywgaXNCb2xkKVxuICAgICAgICAgIGNvbnN0IGNvbG9yID0gdG9rZW4uY29sb3IgPz8gZm9yZWdyb3VuZFxuXG4gICAgICAgICAgbWV0cmljcy5wdXNoKHtcbiAgICAgICAgICAgIGNhdGVnb3J5OiByZXNvbHZlVG9rZW5DYXRlZ29yeSh0b2tlbiksXG4gICAgICAgICAgICBjb2xvcixcbiAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgICBmb250U3R5bGU6IHN0eWxlRmxhZ3MsXG4gICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGxpbmVXaWR0aCArPSB3aWR0aFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0b2tlbnM6IG1ldHJpY3MsXG4gICAgICAgICAgd2lkdGg6IGxpbmVXaWR0aCxcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgY29uc3QgbWF4TGluZVdpZHRoID1cbiAgICAgICAgbGluZU1ldHJpY3MubGVuZ3RoID4gMCA/IE1hdGgubWF4KC4uLmxpbmVNZXRyaWNzLm1hcCgobGluZSkgPT4gbGluZS53aWR0aCkpIDogMFxuICAgICAgY29uc3QgY29udGVudFdpZHRoID0gTWF0aC5tYXgoMCwgbWF4TGluZVdpZHRoKVxuICAgICAgY29uc3QgY29udGVudEhlaWdodCA9IHRva2Vucy5sZW5ndGggKiBjb25maWcubGluZUhlaWdodFxuICAgICAgY29uc3QgYmxvY2tXaWR0aCA9IGNvbnRlbnRXaWR0aCArIGNvbmZpZy5wYWRkaW5nICogMlxuICAgICAgY29uc3QgYmxvY2tIZWlnaHQgPSBjb250ZW50SGVpZ2h0ICsgY29uZmlnLnBhZGRpbmcgKiAyXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJhY2tncm91bmQsXG4gICAgICAgIGJsb2NrSGVpZ2h0LFxuICAgICAgICBibG9ja1dpZHRoLFxuICAgICAgICBjb250ZW50SGVpZ2h0LFxuICAgICAgICBjb250ZW50V2lkdGgsXG4gICAgICAgIGZvcmVncm91bmQsXG4gICAgICAgIGxpbmVzOiBsaW5lTWV0cmljcyxcbiAgICAgICAgdG9rZW5zLFxuICAgICAgfSBzYXRpc2ZpZXMgTWVhc3VyZWRTY2VuZVxuICAgIH0sXG4gIH0pXG59KVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUZyYW1lU2l6ZSA9IChjb25maWc6IFJlbmRlckNvbmZpZywgbWVhc3VyZWRTY2VuZXM6IE1lYXN1cmVkU2NlbmVbXSkgPT4ge1xuICBjb25zdCBtYXhCbG9ja1dpZHRoID1cbiAgICBtZWFzdXJlZFNjZW5lcy5sZW5ndGggPiAwID8gTWF0aC5tYXgoLi4ubWVhc3VyZWRTY2VuZXMubWFwKChzY2VuZSkgPT4gc2NlbmUuYmxvY2tXaWR0aCkpIDogMFxuICBjb25zdCBtYXhCbG9ja0hlaWdodCA9XG4gICAgbWVhc3VyZWRTY2VuZXMubGVuZ3RoID4gMCA/IE1hdGgubWF4KC4uLm1lYXN1cmVkU2NlbmVzLm1hcCgoc2NlbmUpID0+IHNjZW5lLmJsb2NrSGVpZ2h0KSkgOiAwXG5cbiAgcmV0dXJuIHtcbiAgICBoZWlnaHQ6IE1hdGgubWF4KGNvbmZpZy5oZWlnaHQsIE1hdGguY2VpbChtYXhCbG9ja0hlaWdodCkpLFxuICAgIHdpZHRoOiBNYXRoLm1heChjb25maWcud2lkdGgsIE1hdGguY2VpbChtYXhCbG9ja1dpZHRoKSksXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGxheW91dFNjZW5lID0gKFxuICBjb25maWc6IFJlbmRlckNvbmZpZyxcbiAgbWVhc3VyZWQ6IE1lYXN1cmVkU2NlbmUsXG4gIGZyYW1lV2lkdGg6IG51bWJlcixcbiAgZnJhbWVIZWlnaHQ6IG51bWJlclxuKTogU2NlbmUgPT4ge1xuICBjb25zdCBibG9ja1ggPSBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKChmcmFtZVdpZHRoIC0gbWVhc3VyZWQuYmxvY2tXaWR0aCkgLyAyKSlcbiAgY29uc3QgYmxvY2tZID0gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZCgoZnJhbWVIZWlnaHQgLSBtZWFzdXJlZC5ibG9ja0hlaWdodCkgLyAyKSlcblxuICBjb25zdCBsYXlvdXQ6IFNjZW5lTGF5b3V0ID0ge1xuICAgIGxpbmVzOiBtZWFzdXJlZC5saW5lcy5tYXAoKGxpbmUsIGxpbmVJbmRleCkgPT4ge1xuICAgICAgbGV0IGN1cnNvclggPSBibG9ja1ggKyBjb25maWcucGFkZGluZ1xuICAgICAgY29uc3QgY3Vyc29yWSA9IGJsb2NrWSArIGNvbmZpZy5wYWRkaW5nICsgbGluZUluZGV4ICogY29uZmlnLmxpbmVIZWlnaHRcbiAgICAgIGNvbnN0IGxheW91dFRva2VuczogTGF5b3V0VG9rZW5bXSA9IGxpbmUudG9rZW5zLm1hcCgodG9rZW4pID0+IHtcbiAgICAgICAgY29uc3QgbGF5b3V0VG9rZW4gPSB7XG4gICAgICAgICAgLi4udG9rZW4sXG4gICAgICAgICAgeDogTWF0aC5yb3VuZChjdXJzb3JYKSxcbiAgICAgICAgICB5OiBNYXRoLnJvdW5kKGN1cnNvclkpLFxuICAgICAgICB9XG4gICAgICAgIGN1cnNvclggKz0gdG9rZW4ud2lkdGhcbiAgICAgICAgcmV0dXJuIGxheW91dFRva2VuXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b2tlbnM6IGxheW91dFRva2VucyxcbiAgICAgIH1cbiAgICB9KSxcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYmFja2dyb3VuZDogbWVhc3VyZWQuYmFja2dyb3VuZCxcbiAgICBibG9ja1gsXG4gICAgYmxvY2tZLFxuICAgIGNvbnRlbnRIZWlnaHQ6IG1lYXN1cmVkLmNvbnRlbnRIZWlnaHQsXG4gICAgY29udGVudFdpZHRoOiBtZWFzdXJlZC5jb250ZW50V2lkdGgsXG4gICAgZm9yZWdyb3VuZDogbWVhc3VyZWQuZm9yZWdyb3VuZCxcbiAgICBsYXlvdXQsXG4gICAgdG9rZW5zOiBtZWFzdXJlZC50b2tlbnMsXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlbmRlclNjZW5lVGV4dCA9IChcbiAgY29uZmlnOiBSZW5kZXJDb25maWcsXG4gIGNvbnRleHQ6IENhbnZhc0NvbnRleHQsXG4gIHNjZW5lOiBTY2VuZSxcbiAgb3BhY2l0eTogbnVtYmVyLFxuICBibG9ja1g6IG51bWJlcixcbiAgYmxvY2tZOiBudW1iZXJcbikgPT4ge1xuICBpZiAob3BhY2l0eSA8PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB0ZXh0Q29udGV4dCA9IGNvbnRleHRcbiAgY29uc3Qgc3RhcnRYID0gYmxvY2tYICsgY29uZmlnLnBhZGRpbmdcbiAgY29uc3Qgc3RhcnRZID0gYmxvY2tZICsgY29uZmlnLnBhZGRpbmdcbiAgY29uc3QgcHJldmlvdXNBbHBoYSA9IHRleHRDb250ZXh0Lmdsb2JhbEFscGhhXG4gIGNvbnN0IHByZXZpb3VzQmFzZWxpbmUgPSB0ZXh0Q29udGV4dC50ZXh0QmFzZWxpbmVcbiAgY29uc3QgcHJldmlvdXNBbGlnbiA9IHRleHRDb250ZXh0LnRleHRBbGlnblxuICBjb25zdCBwcmV2aW91c0ZvbnQgPSB0ZXh0Q29udGV4dC5mb250XG4gIGNvbnN0IHByZXZpb3VzRmlsbFN0eWxlID0gdGV4dENvbnRleHQuZmlsbFN0eWxlXG5cbiAgdGV4dENvbnRleHQuZ2xvYmFsQWxwaGEgPSBvcGFjaXR5XG4gIHRleHRDb250ZXh0LnRleHRCYXNlbGluZSA9IFwidG9wXCJcbiAgdGV4dENvbnRleHQudGV4dEFsaWduID0gXCJsZWZ0XCJcblxuICBmb3IgKGxldCBsaW5lSW5kZXggPSAwOyBsaW5lSW5kZXggPCBzY2VuZS50b2tlbnMubGVuZ3RoOyBsaW5lSW5kZXggKz0gMSkge1xuICAgIGNvbnN0IGxpbmVUb2tlbnMgPSBzY2VuZS50b2tlbnNbbGluZUluZGV4XSA/PyBbXVxuICAgIGxldCBjdXJzb3JYID0gc3RhcnRYXG4gICAgY29uc3QgY3Vyc29yWSA9IHN0YXJ0WSArIGxpbmVJbmRleCAqIGNvbmZpZy5saW5lSGVpZ2h0XG5cbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIGxpbmVUb2tlbnMpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBub3JtYWxpemVUb2tlbkNvbnRlbnQoY29uZmlnLCB0b2tlbi5jb250ZW50KVxuICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvbnRTdHlsZSA9IHRva2VuLmZvbnRTdHlsZSA/PyBGT05UX1NUWUxFX05PTkVcbiAgICAgIGNvbnN0IGlzSXRhbGljID0gKGZvbnRTdHlsZSAmIEZPTlRfU1RZTEVfSVRBTElDKSA9PT0gRk9OVF9TVFlMRV9JVEFMSUNcbiAgICAgIGNvbnN0IGlzQm9sZCA9IChmb250U3R5bGUgJiBGT05UX1NUWUxFX0JPTEQpID09PSBGT05UX1NUWUxFX0JPTERcbiAgICAgIGNvbnN0IGlzVW5kZXJsaW5lID0gKGZvbnRTdHlsZSAmIEZPTlRfU1RZTEVfVU5ERVJMSU5FKSA9PT0gRk9OVF9TVFlMRV9VTkRFUkxJTkVcblxuICAgICAgdGV4dENvbnRleHQuZm9udCA9IGJ1aWxkRm9udChjb25maWcsIGlzSXRhbGljLCBpc0JvbGQpXG4gICAgICB0ZXh0Q29udGV4dC5maWxsU3R5bGUgPSB0b2tlbi5jb2xvciA/PyBzY2VuZS5mb3JlZ3JvdW5kXG4gICAgICB0ZXh0Q29udGV4dC5maWxsVGV4dChjb250ZW50LCBNYXRoLnJvdW5kKGN1cnNvclgpLCBNYXRoLnJvdW5kKGN1cnNvclkpKVxuXG4gICAgICBjb25zdCB0b2tlbldpZHRoID0gdGV4dENvbnRleHQubWVhc3VyZVRleHQoY29udGVudCkud2lkdGhcblxuICAgICAgaWYgKGlzVW5kZXJsaW5lKSB7XG4gICAgICAgIGRyYXdVbmRlcmxpbmUoY29uZmlnLCB0ZXh0Q29udGV4dCwgTWF0aC5yb3VuZChjdXJzb3JYKSwgTWF0aC5yb3VuZChjdXJzb3JZKSwgdG9rZW5XaWR0aClcbiAgICAgIH1cblxuICAgICAgY3Vyc29yWCArPSB0b2tlbldpZHRoXG4gICAgfVxuICB9XG5cbiAgdGV4dENvbnRleHQuZ2xvYmFsQWxwaGEgPSBwcmV2aW91c0FscGhhXG4gIHRleHRDb250ZXh0LnRleHRCYXNlbGluZSA9IHByZXZpb3VzQmFzZWxpbmVcbiAgdGV4dENvbnRleHQudGV4dEFsaWduID0gcHJldmlvdXNBbGlnblxuICB0ZXh0Q29udGV4dC5mb250ID0gcHJldmlvdXNGb250XG4gIHRleHRDb250ZXh0LmZpbGxTdHlsZSA9IHByZXZpb3VzRmlsbFN0eWxlXG59XG4iLAogICAgImV4cG9ydCBjb25zdCBGT05UX1NUWUxFX05PTkUgPSAwXG5leHBvcnQgY29uc3QgRk9OVF9TVFlMRV9JVEFMSUMgPSAxXG5leHBvcnQgY29uc3QgRk9OVF9TVFlMRV9CT0xEID0gMlxuZXhwb3J0IGNvbnN0IEZPTlRfU1RZTEVfVU5ERVJMSU5FID0gNFxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENhbnZhc0NvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCJcbmltcG9ydCB0eXBlIHsgUmVuZGVyQ29uZmlnIH0gZnJvbSBcIi4vdHlwZXNcIlxuXG5leHBvcnQgY29uc3QgYnVpbGRGb250ID0gKGNvbmZpZzogUmVuZGVyQ29uZmlnLCBpc0l0YWxpYzogYm9vbGVhbiwgaXNCb2xkOiBib29sZWFuKSA9PiB7XG4gIGNvbnN0IHN0eWxlID0gYCR7aXNJdGFsaWMgPyBcIml0YWxpYyBcIiA6IFwiXCJ9JHtpc0JvbGQgPyBcImJvbGQgXCIgOiBcIlwifWBcbiAgcmV0dXJuIGAke3N0eWxlfSR7Y29uZmlnLmZvbnRTaXplfXB4ICR7Y29uZmlnLmZvbnRGYW1pbHl9YFxufVxuXG5leHBvcnQgY29uc3QgZHJhd1VuZGVybGluZSA9IChcbiAgY29uZmlnOiBSZW5kZXJDb25maWcsXG4gIGNvbnRleHQ6IENhbnZhc0NvbnRleHQsXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICB3aWR0aDogbnVtYmVyXG4pID0+IHtcbiAgY29uc3QgZHJhd0NvbnRleHQgPSBjb250ZXh0XG4gIGNvbnN0IHByZXZpb3VzU3Ryb2tlU3R5bGUgPSBkcmF3Q29udGV4dC5zdHJva2VTdHlsZVxuICBjb25zdCBwcmV2aW91c0xpbmVXaWR0aCA9IGRyYXdDb250ZXh0LmxpbmVXaWR0aFxuICBjb25zdCB1bmRlcmxpbmVZID0geSArIGNvbmZpZy5mb250U2l6ZSArIDJcblxuICBkcmF3Q29udGV4dC5zdHJva2VTdHlsZSA9IGRyYXdDb250ZXh0LmZpbGxTdHlsZVxuICBkcmF3Q29udGV4dC5saW5lV2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKGNvbmZpZy5mb250U2l6ZSAvIDEyKSlcbiAgZHJhd0NvbnRleHQuYmVnaW5QYXRoKClcbiAgZHJhd0NvbnRleHQubW92ZVRvKHgsIHVuZGVybGluZVkpXG4gIGRyYXdDb250ZXh0LmxpbmVUbyh4ICsgd2lkdGgsIHVuZGVybGluZVkpXG4gIGRyYXdDb250ZXh0LnN0cm9rZSgpXG5cbiAgZHJhd0NvbnRleHQuc3Ryb2tlU3R5bGUgPSBwcmV2aW91c1N0cm9rZVN0eWxlXG4gIGRyYXdDb250ZXh0LmxpbmVXaWR0aCA9IHByZXZpb3VzTGluZVdpZHRoXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgVG9rZW5DYXRlZ29yeSB9IGZyb20gXCIuL3R5cGVzXCJcblxuY29uc3QgU0NPUEVfVE9fQ0FURUdPUlk6IEFycmF5PFtSZWdFeHAsIFRva2VuQ2F0ZWdvcnldPiA9IFtcbiAgWy9ea2V5d29yZFxcLm9wZXJhdG9yLywgXCJvcGVyYXRvclwiXSxcbiAgWy9ea2V5d29yZFxcLi8sIFwia2V5d29yZFwiXSxcbiAgWy9ec3RvcmFnZVxcLnR5cGUvLCBcImtleXdvcmRcIl0sXG4gIFsvXnN0b3JhZ2VcXC5tb2RpZmllci8sIFwia2V5d29yZFwiXSxcbiAgWy9eZW50aXR5XFwubmFtZVxcLmZ1bmN0aW9uLywgXCJmdW5jdGlvblwiXSxcbiAgWy9eZW50aXR5XFwubmFtZVxcLnR5cGUvLCBcInR5cGVcIl0sXG4gIFsvXmVudGl0eVxcLm5hbWVcXC5jbGFzcy8sIFwidHlwZVwiXSxcbiAgWy9ec3RyaW5nXFwuLywgXCJzdHJpbmdcIl0sXG4gIFsvXmNvbnN0YW50XFwubnVtZXJpYy8sIFwibnVtYmVyXCJdLFxuICBbL15jb21tZW50XFwuLywgXCJjb21tZW50XCJdLFxuICBbL15wdW5jdHVhdGlvblxcLi8sIFwicHVuY3R1YXRpb25cIl0sXG4gIFsvXm1ldGFcXC5icmFjZS8sIFwicHVuY3R1YXRpb25cIl0sXG4gIFsvXnZhcmlhYmxlXFwuLywgXCJpZGVudGlmaWVyXCJdLFxuICBbL15lbnRpdHlcXC5uYW1lXFwuLywgXCJpZGVudGlmaWVyXCJdLFxuXVxuXG5leHBvcnQgY29uc3QgY2F0ZWdvcml6ZVRva2VuID0gKHNjb3Blczogc3RyaW5nW10pOiBUb2tlbkNhdGVnb3J5ID0+IHtcbiAgZm9yIChjb25zdCBzY29wZSBvZiBzY29wZXMpIHtcbiAgICBpZiAoIXNjb3BlKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoc2NvcGUuc3RhcnRzV2l0aChcInN0cmluZy5cIikpIHtcbiAgICAgIHJldHVybiBcInN0cmluZ1wiXG4gICAgfVxuICAgIGlmIChzY29wZS5zdGFydHNXaXRoKFwicHVuY3R1YXRpb24uZGVmaW5pdGlvbi5zdHJpbmdcIikpIHtcbiAgICAgIHJldHVybiBcInN0cmluZ1wiXG4gICAgfVxuICB9XG5cbiAgZm9yIChsZXQgaW5kZXggPSBzY29wZXMubGVuZ3RoIC0gMTsgaW5kZXggPj0gMDsgaW5kZXggLT0gMSkge1xuICAgIGNvbnN0IHNjb3BlID0gc2NvcGVzW2luZGV4XVxuICAgIGlmICghc2NvcGUpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGZvciAoY29uc3QgW3BhdHRlcm4sIGNhdGVnb3J5XSBvZiBTQ09QRV9UT19DQVRFR09SWSkge1xuICAgICAgaWYgKHBhdHRlcm4udGVzdChzY29wZSkpIHtcbiAgICAgICAgcmV0dXJuIGNhdGVnb3J5XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBcIm90aGVyXCJcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDYW52YXNDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiXG5pbXBvcnQgdHlwZSB7IERyYXdUb2tlbiwgTGF5b3V0VG9rZW4sIFJlbmRlckNvbmZpZywgU2NlbmUsIFRyYW5zaXRpb25EaWZmIH0gZnJvbSBcIi4vdHlwZXNcIlxuaW1wb3J0IHsgYmxlbmRDb2xvcnMsIGxlcnAgfSBmcm9tIFwiLi9jb2xvclwiXG5pbXBvcnQgeyBGT05UX1NUWUxFX0JPTEQsIEZPTlRfU1RZTEVfSVRBTElDLCBGT05UX1NUWUxFX1VOREVSTElORSB9IGZyb20gXCIuL2NvbnN0YW50c1wiXG5pbXBvcnQgeyBidWlsZEZvbnQsIGRyYXdVbmRlcmxpbmUgfSBmcm9tIFwiLi90ZXh0XCJcblxuY29uc3QgYnVpbGRFeGFjdEtleSA9ICh0b2tlbjogTGF5b3V0VG9rZW4pID0+IGBleGFjdDo6JHt0b2tlbi5jb250ZW50fTo6JHt0b2tlbi5mb250U3R5bGV9YFxuY29uc3QgYnVpbGRDYXRlZ29yeUtleSA9ICh0b2tlbjogTGF5b3V0VG9rZW4pID0+IGBjYXRlZ29yeTo6JHt0b2tlbi5jYXRlZ29yeX1gXG5cbmNvbnN0IGJ1aWxkVG9rZW5TZXF1ZW5jZSA9ICh0b2tlbnM6IExheW91dFRva2VuW10sIGJ1aWxkS2V5OiAodG9rZW46IExheW91dFRva2VuKSA9PiBzdHJpbmcpID0+XG4gIHRva2Vucy5tYXAoKHRva2VuKSA9PiAoe1xuICAgIGtleTogYnVpbGRLZXkodG9rZW4pLFxuICAgIHRva2VuLFxuICB9KSlcblxudHlwZSBUb2tlbldpdGhJbmRleCA9IHtcbiAgaW5kZXg6IG51bWJlclxuICB0b2tlbjogTGF5b3V0VG9rZW5cbn1cblxuY29uc3QgZ3JvdXBCeUtleSA9ICh0b2tlbnM6IExheW91dFRva2VuW10sIGJ1aWxkS2V5OiAodG9rZW46IExheW91dFRva2VuKSA9PiBzdHJpbmcpID0+IHtcbiAgY29uc3QgZ3JvdXBlZCA9IG5ldyBNYXA8c3RyaW5nLCBUb2tlbldpdGhJbmRleFtdPigpXG4gIHRva2Vucy5mb3JFYWNoKCh0b2tlbiwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBrZXkgPSBidWlsZEtleSh0b2tlbilcbiAgICBjb25zdCBncm91cCA9IGdyb3VwZWQuZ2V0KGtleSkgPz8gW11cbiAgICBncm91cC5wdXNoKHsgaW5kZXgsIHRva2VuIH0pXG4gICAgZ3JvdXBlZC5zZXQoa2V5LCBncm91cClcbiAgfSlcbiAgcmV0dXJuIGdyb3VwZWRcbn1cblxuY29uc3QgZGlmZkJ5S2V5ID0gKFxuICBmcm9tVG9rZW5zOiBMYXlvdXRUb2tlbltdLFxuICB0b1Rva2VuczogTGF5b3V0VG9rZW5bXSxcbiAgYnVpbGRLZXk6ICh0b2tlbjogTGF5b3V0VG9rZW4pID0+IHN0cmluZ1xuKSA9PiB7XG4gIGNvbnN0IGZyb21JdGVtcyA9IGJ1aWxkVG9rZW5TZXF1ZW5jZShmcm9tVG9rZW5zLCBidWlsZEtleSlcbiAgY29uc3QgdG9JdGVtcyA9IGJ1aWxkVG9rZW5TZXF1ZW5jZSh0b1Rva2VucywgYnVpbGRLZXkpXG4gIGNvbnN0IGZyb21LZXlzID0gZnJvbUl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5rZXkpXG4gIGNvbnN0IHRvS2V5cyA9IHRvSXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLmtleSlcbiAgY29uc3QgbWF0cml4ID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogZnJvbUtleXMubGVuZ3RoICsgMSB9LCAoKSA9PlxuICAgIEFycmF5LmZyb20oeyBsZW5ndGg6IHRvS2V5cy5sZW5ndGggKyAxIH0sICgpID0+IDApXG4gIClcblxuICBmb3IgKGxldCBpID0gZnJvbUtleXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICBjb25zdCByb3cgPSBtYXRyaXhbaV1cbiAgICBpZiAoIXJvdykge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBmb3IgKGxldCBqID0gdG9LZXlzLmxlbmd0aCAtIDE7IGogPj0gMDsgaiAtPSAxKSB7XG4gICAgICBjb25zdCBmcm9tS2V5ID0gZnJvbUtleXNbaV0gPz8gXCJcIlxuICAgICAgY29uc3QgdG9LZXkgPSB0b0tleXNbal0gPz8gXCJcIlxuXG4gICAgICBpZiAoZnJvbUtleSA9PT0gdG9LZXkpIHtcbiAgICAgICAgcm93W2pdID0gKG1hdHJpeFtpICsgMV0/LltqICsgMV0gPz8gMCkgKyAxXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuZXh0Um93ID0gbWF0cml4W2kgKyAxXVxuICAgICAgICBjb25zdCBjdXJyZW50Um93ID0gbWF0cml4W2ldXG4gICAgICAgIHJvd1tqXSA9IE1hdGgubWF4KG5leHRSb3c/LltqXSA/PyAwLCBjdXJyZW50Um93Py5baiArIDFdID8/IDApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWF0Y2hlczogQXJyYXk8W251bWJlciwgbnVtYmVyXT4gPSBbXVxuICBsZXQgaSA9IDBcbiAgbGV0IGogPSAwXG5cbiAgd2hpbGUgKGkgPCBmcm9tS2V5cy5sZW5ndGggJiYgaiA8IHRvS2V5cy5sZW5ndGgpIHtcbiAgICBjb25zdCBmcm9tS2V5ID0gZnJvbUtleXNbaV0gPz8gXCJcIlxuICAgIGNvbnN0IHRvS2V5ID0gdG9LZXlzW2pdID8/IFwiXCJcblxuICAgIGlmIChmcm9tS2V5ID09PSB0b0tleSkge1xuICAgICAgbWF0Y2hlcy5wdXNoKFtpLCBqXSlcbiAgICAgIGkgKz0gMVxuICAgICAgaiArPSAxXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IHNraXBGcm9tID0gbWF0cml4W2kgKyAxXT8uW2pdID8/IDBcbiAgICBjb25zdCBza2lwVG8gPSBtYXRyaXhbaV0/LltqICsgMV0gPz8gMFxuXG4gICAgaWYgKHNraXBGcm9tID49IHNraXBUbykge1xuICAgICAgaSArPSAxXG4gICAgfSBlbHNlIHtcbiAgICAgIGogKz0gMVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1hdGNoZWRGcm9tID0gbmV3IFNldChtYXRjaGVzLm1hcCgoW2luZGV4XSkgPT4gaW5kZXgpKVxuICBjb25zdCBtYXRjaGVkVG8gPSBuZXcgU2V0KG1hdGNoZXMubWFwKChbLCBpbmRleF0pID0+IGluZGV4KSlcblxuICBjb25zdCBtYXRjaGVkID0gbWF0Y2hlcy5mbGF0TWFwKChbZnJvbUluZGV4LCB0b0luZGV4XSkgPT4ge1xuICAgIGNvbnN0IGZyb21JdGVtID0gZnJvbUl0ZW1zW2Zyb21JbmRleF1cbiAgICBjb25zdCB0b0l0ZW0gPSB0b0l0ZW1zW3RvSW5kZXhdXG5cbiAgICBpZiAoIWZyb21JdGVtIHx8ICF0b0l0ZW0pIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cblxuICAgIHJldHVybiBbeyBmcm9tOiBmcm9tSXRlbS50b2tlbiwgdG86IHRvSXRlbS50b2tlbiB9XVxuICB9KVxuXG4gIHJldHVybiB7XG4gICAgYWRkZWQ6IHRvSXRlbXMuZmlsdGVyKChfLCBpbmRleCkgPT4gIW1hdGNoZWRUby5oYXMoaW5kZXgpKS5tYXAoKGl0ZW0pID0+IGl0ZW0udG9rZW4pLFxuICAgIG1hdGNoZWQsXG4gICAgcmVtb3ZlZDogZnJvbUl0ZW1zLmZpbHRlcigoXywgaW5kZXgpID0+ICFtYXRjaGVkRnJvbS5oYXMoaW5kZXgpKS5tYXAoKGl0ZW0pID0+IGl0ZW0udG9rZW4pLFxuICB9XG59XG5cbmNvbnN0IG1hdGNoQnlDYXRlZ29yeSA9IChyZW1vdmVkOiBMYXlvdXRUb2tlbltdLCBhZGRlZDogTGF5b3V0VG9rZW5bXSkgPT4ge1xuICBjb25zdCBtYXRjaGVkOiBBcnJheTx7IGZyb206IExheW91dFRva2VuOyB0bzogTGF5b3V0VG9rZW4gfT4gPSBbXVxuICBjb25zdCB1c2VkRnJvbSA9IG5ldyBTZXQ8bnVtYmVyPigpXG4gIGNvbnN0IHVzZWRUbyA9IG5ldyBTZXQ8bnVtYmVyPigpXG4gIGNvbnN0IHJlbW92ZWRCeUNhdGVnb3J5ID0gZ3JvdXBCeUtleShyZW1vdmVkLCBidWlsZENhdGVnb3J5S2V5KVxuICBjb25zdCBhZGRlZEJ5Q2F0ZWdvcnkgPSBncm91cEJ5S2V5KGFkZGVkLCBidWlsZENhdGVnb3J5S2V5KVxuXG4gIGZvciAoY29uc3QgW2NhdGVnb3J5S2V5LCBmcm9tR3JvdXBdIG9mIHJlbW92ZWRCeUNhdGVnb3J5KSB7XG4gICAgY29uc3QgdG9Hcm91cCA9IGFkZGVkQnlDYXRlZ29yeS5nZXQoY2F0ZWdvcnlLZXkpID8/IFtdXG5cbiAgICBmb3IgKGNvbnN0IGZyb21FbnRyeSBvZiBmcm9tR3JvdXApIHtcbiAgICAgIGlmICh1c2VkRnJvbS5oYXMoZnJvbUVudHJ5LmluZGV4KSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBsZXQgYmVzdE1hdGNoOiBUb2tlbldpdGhJbmRleCB8IG51bGwgPSBudWxsXG4gICAgICBsZXQgYmVzdERpc3RhbmNlID0gSW5maW5pdHlcblxuICAgICAgZm9yIChjb25zdCB0b0VudHJ5IG9mIHRvR3JvdXApIHtcbiAgICAgICAgaWYgKHVzZWRUby5oYXModG9FbnRyeS5pbmRleCkpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPVxuICAgICAgICAgIE1hdGguYWJzKGZyb21FbnRyeS50b2tlbi55IC0gdG9FbnRyeS50b2tlbi55KSAqIDEwMDAgK1xuICAgICAgICAgIE1hdGguYWJzKGZyb21FbnRyeS50b2tlbi54IC0gdG9FbnRyeS50b2tlbi54KVxuXG4gICAgICAgIGlmIChkaXN0YW5jZSA8IGJlc3REaXN0YW5jZSkge1xuICAgICAgICAgIGJlc3REaXN0YW5jZSA9IGRpc3RhbmNlXG4gICAgICAgICAgYmVzdE1hdGNoID0gdG9FbnRyeVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChiZXN0TWF0Y2gpIHtcbiAgICAgICAgbWF0Y2hlZC5wdXNoKHsgZnJvbTogZnJvbUVudHJ5LnRva2VuLCB0bzogYmVzdE1hdGNoLnRva2VuIH0pXG4gICAgICAgIHVzZWRGcm9tLmFkZChmcm9tRW50cnkuaW5kZXgpXG4gICAgICAgIHVzZWRUby5hZGQoYmVzdE1hdGNoLmluZGV4KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWF0Y2hlZCxcbiAgICBzdGlsbEFkZGVkOiBhZGRlZC5maWx0ZXIoKF8sIGluZGV4KSA9PiAhdXNlZFRvLmhhcyhpbmRleCkpLFxuICAgIHN0aWxsUmVtb3ZlZDogcmVtb3ZlZC5maWx0ZXIoKF8sIGluZGV4KSA9PiAhdXNlZEZyb20uaGFzKGluZGV4KSksXG4gIH1cbn1cblxuY29uc3QgbWF0Y2hCeUV4YWN0Q29udGVudCA9IChyZW1vdmVkOiBMYXlvdXRUb2tlbltdLCBhZGRlZDogTGF5b3V0VG9rZW5bXSkgPT4ge1xuICBjb25zdCBtYXRjaGVkOiBBcnJheTx7IGZyb206IExheW91dFRva2VuOyB0bzogTGF5b3V0VG9rZW4gfT4gPSBbXVxuICBjb25zdCB1c2VkRnJvbSA9IG5ldyBTZXQ8bnVtYmVyPigpXG4gIGNvbnN0IHVzZWRUbyA9IG5ldyBTZXQ8bnVtYmVyPigpXG4gIGNvbnN0IHJlbW92ZWRCeUNvbnRlbnQgPSBncm91cEJ5S2V5KHJlbW92ZWQsIGJ1aWxkRXhhY3RLZXkpXG4gIGNvbnN0IGFkZGVkQnlDb250ZW50ID0gZ3JvdXBCeUtleShhZGRlZCwgYnVpbGRFeGFjdEtleSlcblxuICBmb3IgKGNvbnN0IFtjb250ZW50S2V5LCBmcm9tR3JvdXBdIG9mIHJlbW92ZWRCeUNvbnRlbnQpIHtcbiAgICBjb25zdCB0b0dyb3VwID0gYWRkZWRCeUNvbnRlbnQuZ2V0KGNvbnRlbnRLZXkpID8/IFtdXG5cbiAgICBmb3IgKGNvbnN0IGZyb21FbnRyeSBvZiBmcm9tR3JvdXApIHtcbiAgICAgIGlmICh1c2VkRnJvbS5oYXMoZnJvbUVudHJ5LmluZGV4KSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBsZXQgYmVzdE1hdGNoOiBUb2tlbldpdGhJbmRleCB8IG51bGwgPSBudWxsXG4gICAgICBsZXQgYmVzdERpc3RhbmNlID0gSW5maW5pdHlcblxuICAgICAgZm9yIChjb25zdCB0b0VudHJ5IG9mIHRvR3JvdXApIHtcbiAgICAgICAgaWYgKHVzZWRUby5oYXModG9FbnRyeS5pbmRleCkpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPVxuICAgICAgICAgIE1hdGguYWJzKGZyb21FbnRyeS50b2tlbi55IC0gdG9FbnRyeS50b2tlbi55KSAqIDEwMDAgK1xuICAgICAgICAgIE1hdGguYWJzKGZyb21FbnRyeS50b2tlbi54IC0gdG9FbnRyeS50b2tlbi54KVxuXG4gICAgICAgIGlmIChkaXN0YW5jZSA8IGJlc3REaXN0YW5jZSkge1xuICAgICAgICAgIGJlc3REaXN0YW5jZSA9IGRpc3RhbmNlXG4gICAgICAgICAgYmVzdE1hdGNoID0gdG9FbnRyeVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChiZXN0TWF0Y2gpIHtcbiAgICAgICAgbWF0Y2hlZC5wdXNoKHsgZnJvbTogZnJvbUVudHJ5LnRva2VuLCB0bzogYmVzdE1hdGNoLnRva2VuIH0pXG4gICAgICAgIHVzZWRGcm9tLmFkZChmcm9tRW50cnkuaW5kZXgpXG4gICAgICAgIHVzZWRUby5hZGQoYmVzdE1hdGNoLmluZGV4KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWF0Y2hlZCxcbiAgICBzdGlsbEFkZGVkOiBhZGRlZC5maWx0ZXIoKF8sIGluZGV4KSA9PiAhdXNlZFRvLmhhcyhpbmRleCkpLFxuICAgIHN0aWxsUmVtb3ZlZDogcmVtb3ZlZC5maWx0ZXIoKF8sIGluZGV4KSA9PiAhdXNlZEZyb20uaGFzKGluZGV4KSksXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGZsYXR0ZW5TY2VuZVRva2VucyA9IChzY2VuZTogU2NlbmUpID0+XG4gIHNjZW5lLmxheW91dC5saW5lcy5mbGF0TWFwKChsaW5lKSA9PiBsaW5lLnRva2VucylcblxuZXhwb3J0IGNvbnN0IGRpZmZMYXlvdXRUb2tlbnMgPSAoZnJvbVRva2VuczogTGF5b3V0VG9rZW5bXSwgdG9Ub2tlbnM6IExheW91dFRva2VuW10pID0+IHtcbiAgY29uc3QgZXhhY3REaWZmID0gZGlmZkJ5S2V5KGZyb21Ub2tlbnMsIHRvVG9rZW5zLCBidWlsZEV4YWN0S2V5KVxuICBjb25zdCBjb250ZW50TWF0Y2hlcyA9IG1hdGNoQnlFeGFjdENvbnRlbnQoZXhhY3REaWZmLnJlbW92ZWQsIGV4YWN0RGlmZi5hZGRlZClcbiAgY29uc3QgY2F0ZWdvcnlNYXRjaGVzID0gbWF0Y2hCeUNhdGVnb3J5KGNvbnRlbnRNYXRjaGVzLnN0aWxsUmVtb3ZlZCwgY29udGVudE1hdGNoZXMuc3RpbGxBZGRlZClcblxuICByZXR1cm4ge1xuICAgIGFkZGVkOiBjYXRlZ29yeU1hdGNoZXMuc3RpbGxBZGRlZCxcbiAgICBtYXRjaGVkOiBbLi4uZXhhY3REaWZmLm1hdGNoZWQsIC4uLmNvbnRlbnRNYXRjaGVzLm1hdGNoZWQsIC4uLmNhdGVnb3J5TWF0Y2hlcy5tYXRjaGVkXSxcbiAgICByZW1vdmVkOiBjYXRlZ29yeU1hdGNoZXMuc3RpbGxSZW1vdmVkLFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBidWlsZFRyYW5zaXRpb25EaWZmID0gKGZyb21TY2VuZTogU2NlbmUsIHRvU2NlbmU6IFNjZW5lKSA9PlxuICBkaWZmTGF5b3V0VG9rZW5zKGZsYXR0ZW5TY2VuZVRva2Vucyhmcm9tU2NlbmUpLCBmbGF0dGVuU2NlbmVUb2tlbnModG9TY2VuZSkpXG5cbmV4cG9ydCBjb25zdCBlYXNlSW5PdXRDdWJpYyA9IChwcm9ncmVzczogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1pbigxLCBNYXRoLm1heCgwLCBwcm9ncmVzcykpXG4gIHJldHVybiBjbGFtcGVkIDwgMC41ID8gNCAqIGNsYW1wZWQgKiBjbGFtcGVkICogY2xhbXBlZCA6IDEgLSAoLTIgKiBjbGFtcGVkICsgMikgKiogMyAvIDJcbn1cblxuZXhwb3J0IGNvbnN0IGJ1aWxkVHJhbnNpdGlvblRva2VucyA9IChcbiAgY29uZmlnOiBSZW5kZXJDb25maWcsXG4gIGRpZmY6IFRyYW5zaXRpb25EaWZmLFxuICBwcm9ncmVzczogbnVtYmVyXG4pID0+IHtcbiAgY29uc3QgY2xhbXBlZCA9IE1hdGgubWluKDEsIE1hdGgubWF4KDAsIHByb2dyZXNzKSlcbiAgY29uc3QgdG9rZW5zOiBEcmF3VG9rZW5bXSA9IFtdXG5cbiAgZm9yIChjb25zdCB0b2tlbiBvZiBkaWZmLnJlbW92ZWQpIHtcbiAgICBjb25zdCBvcGFjaXR5ID0gMSAtIGNsYW1wZWRcbiAgICBpZiAob3BhY2l0eSA8PSAwKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHRva2Vucy5wdXNoKHtcbiAgICAgIGNvbG9yOiB0b2tlbi5jb2xvcixcbiAgICAgIGNvbnRlbnQ6IHRva2VuLmNvbnRlbnQsXG4gICAgICBmb250U3R5bGU6IHRva2VuLmZvbnRTdHlsZSxcbiAgICAgIG9wYWNpdHksXG4gICAgICB3aWR0aDogdG9rZW4ud2lkdGgsXG4gICAgICB4OiB0b2tlbi54LFxuICAgICAgeTogdG9rZW4ueSAtIGNvbmZpZy50cmFuc2l0aW9uRHJpZnQgKiBjbGFtcGVkLFxuICAgIH0pXG4gIH1cblxuICBmb3IgKGNvbnN0IG1hdGNoIG9mIGRpZmYubWF0Y2hlZCkge1xuICAgIGNvbnN0IHdpZHRoID0gbGVycChtYXRjaC5mcm9tLndpZHRoLCBtYXRjaC50by53aWR0aCwgY2xhbXBlZClcbiAgICBjb25zdCB4ID0gbGVycChtYXRjaC5mcm9tLngsIG1hdGNoLnRvLngsIGNsYW1wZWQpXG4gICAgY29uc3QgeSA9IGxlcnAobWF0Y2guZnJvbS55LCBtYXRjaC50by55LCBjbGFtcGVkKVxuICAgIGNvbnN0IGhhc01pc21hdGNoID1cbiAgICAgIG1hdGNoLmZyb20uY29udGVudCAhPT0gbWF0Y2gudG8uY29udGVudCB8fCBtYXRjaC5mcm9tLmZvbnRTdHlsZSAhPT0gbWF0Y2gudG8uZm9udFN0eWxlXG5cbiAgICBpZiAoaGFzTWlzbWF0Y2gpIHtcbiAgICAgIGNvbnN0IGZyb21PcGFjaXR5ID0gMSAtIGNsYW1wZWRcbiAgICAgIGlmIChmcm9tT3BhY2l0eSA+IDApIHtcbiAgICAgICAgdG9rZW5zLnB1c2goe1xuICAgICAgICAgIGNvbG9yOiBtYXRjaC5mcm9tLmNvbG9yLFxuICAgICAgICAgIGNvbnRlbnQ6IG1hdGNoLmZyb20uY29udGVudCxcbiAgICAgICAgICBmb250U3R5bGU6IG1hdGNoLmZyb20uZm9udFN0eWxlLFxuICAgICAgICAgIG9wYWNpdHk6IGZyb21PcGFjaXR5LFxuICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgIHgsXG4gICAgICAgICAgeSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgdG9PcGFjaXR5ID0gY2xhbXBlZFxuICAgICAgaWYgKHRvT3BhY2l0eSA+IDApIHtcbiAgICAgICAgdG9rZW5zLnB1c2goe1xuICAgICAgICAgIGNvbG9yOiBtYXRjaC50by5jb2xvcixcbiAgICAgICAgICBjb250ZW50OiBtYXRjaC50by5jb250ZW50LFxuICAgICAgICAgIGZvbnRTdHlsZTogbWF0Y2gudG8uZm9udFN0eWxlLFxuICAgICAgICAgIG9wYWNpdHk6IHRvT3BhY2l0eSxcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICB4LFxuICAgICAgICAgIHksXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHRva2Vucy5wdXNoKHtcbiAgICAgIGNvbG9yOiBibGVuZENvbG9ycyhtYXRjaC5mcm9tLmNvbG9yLCBtYXRjaC50by5jb2xvciwgY2xhbXBlZCksXG4gICAgICBjb250ZW50OiBtYXRjaC50by5jb250ZW50LFxuICAgICAgZm9udFN0eWxlOiBtYXRjaC50by5mb250U3R5bGUsXG4gICAgICBvcGFjaXR5OiAxLFxuICAgICAgd2lkdGgsXG4gICAgICB4LFxuICAgICAgeSxcbiAgICB9KVxuICB9XG5cbiAgZm9yIChjb25zdCB0b2tlbiBvZiBkaWZmLmFkZGVkKSB7XG4gICAgY29uc3Qgb3BhY2l0eSA9IGNsYW1wZWRcbiAgICBpZiAob3BhY2l0eSA8PSAwKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHRva2Vucy5wdXNoKHtcbiAgICAgIGNvbG9yOiB0b2tlbi5jb2xvcixcbiAgICAgIGNvbnRlbnQ6IHRva2VuLmNvbnRlbnQsXG4gICAgICBmb250U3R5bGU6IHRva2VuLmZvbnRTdHlsZSxcbiAgICAgIG9wYWNpdHksXG4gICAgICB3aWR0aDogdG9rZW4ud2lkdGgsXG4gICAgICB4OiB0b2tlbi54LFxuICAgICAgeTogdG9rZW4ueSArIGNvbmZpZy50cmFuc2l0aW9uRHJpZnQgKiAoMSAtIGNsYW1wZWQpLFxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gdG9rZW5zXG59XG5cbmV4cG9ydCBjb25zdCByZW5kZXJUcmFuc2l0aW9uVG9rZW5zID0gKFxuICBjb25maWc6IFJlbmRlckNvbmZpZyxcbiAgY29udGV4dDogQ2FudmFzQ29udGV4dCxcbiAgdG9rZW5zOiBEcmF3VG9rZW5bXVxuKSA9PiB7XG4gIGNvbnN0IHRleHRDb250ZXh0ID0gY29udGV4dFxuICBjb25zdCBwcmV2aW91c0FscGhhID0gdGV4dENvbnRleHQuZ2xvYmFsQWxwaGFcbiAgY29uc3QgcHJldmlvdXNCYXNlbGluZSA9IHRleHRDb250ZXh0LnRleHRCYXNlbGluZVxuICBjb25zdCBwcmV2aW91c0FsaWduID0gdGV4dENvbnRleHQudGV4dEFsaWduXG4gIGNvbnN0IHByZXZpb3VzRm9udCA9IHRleHRDb250ZXh0LmZvbnRcbiAgY29uc3QgcHJldmlvdXNGaWxsU3R5bGUgPSB0ZXh0Q29udGV4dC5maWxsU3R5bGVcblxuICB0ZXh0Q29udGV4dC50ZXh0QmFzZWxpbmUgPSBcInRvcFwiXG4gIHRleHRDb250ZXh0LnRleHRBbGlnbiA9IFwibGVmdFwiXG5cbiAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICBpZiAodG9rZW4ub3BhY2l0eSA8PSAwKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IGZvbnRTdHlsZSA9IHRva2VuLmZvbnRTdHlsZVxuICAgIGNvbnN0IGlzSXRhbGljID0gKGZvbnRTdHlsZSAmIEZPTlRfU1RZTEVfSVRBTElDKSA9PT0gRk9OVF9TVFlMRV9JVEFMSUNcbiAgICBjb25zdCBpc0JvbGQgPSAoZm9udFN0eWxlICYgRk9OVF9TVFlMRV9CT0xEKSA9PT0gRk9OVF9TVFlMRV9CT0xEXG4gICAgY29uc3QgaXNVbmRlcmxpbmUgPSAoZm9udFN0eWxlICYgRk9OVF9TVFlMRV9VTkRFUkxJTkUpID09PSBGT05UX1NUWUxFX1VOREVSTElORVxuXG4gICAgdGV4dENvbnRleHQuZ2xvYmFsQWxwaGEgPSB0b2tlbi5vcGFjaXR5XG4gICAgdGV4dENvbnRleHQuZm9udCA9IGJ1aWxkRm9udChjb25maWcsIGlzSXRhbGljLCBpc0JvbGQpXG4gICAgdGV4dENvbnRleHQuZmlsbFN0eWxlID0gdG9rZW4uY29sb3JcbiAgICB0ZXh0Q29udGV4dC5maWxsVGV4dCh0b2tlbi5jb250ZW50LCBNYXRoLnJvdW5kKHRva2VuLngpLCBNYXRoLnJvdW5kKHRva2VuLnkpKVxuXG4gICAgaWYgKGlzVW5kZXJsaW5lICYmIHRva2VuLndpZHRoID4gMCkge1xuICAgICAgZHJhd1VuZGVybGluZShjb25maWcsIHRleHRDb250ZXh0LCBNYXRoLnJvdW5kKHRva2VuLngpLCBNYXRoLnJvdW5kKHRva2VuLnkpLCB0b2tlbi53aWR0aClcbiAgICB9XG4gIH1cblxuICB0ZXh0Q29udGV4dC5nbG9iYWxBbHBoYSA9IHByZXZpb3VzQWxwaGFcbiAgdGV4dENvbnRleHQudGV4dEJhc2VsaW5lID0gcHJldmlvdXNCYXNlbGluZVxuICB0ZXh0Q29udGV4dC50ZXh0QWxpZ24gPSBwcmV2aW91c0FsaWduXG4gIHRleHRDb250ZXh0LmZvbnQgPSBwcmV2aW91c0ZvbnRcbiAgdGV4dENvbnRleHQuZmlsbFN0eWxlID0gcHJldmlvdXNGaWxsU3R5bGVcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBCdW5kbGVkVGhlbWUgfSBmcm9tIFwic2hpa2lcIlxuaW1wb3J0IHsgT3B0aW9ucyB9IGZyb20gXCJAZWZmZWN0L2NsaVwiXG5cbmNvbnN0IERFRkFVTFRfVEhFTUU6IEJ1bmRsZWRUaGVtZSA9IFwiZ2l0aHViLWRhcmtcIlxuY29uc3QgREVGQVVMVF9XSURUSCA9IDBcbmNvbnN0IERFRkFVTFRfSEVJR0hUID0gMFxuY29uc3QgREVGQVVMVF9GUFMgPSA2MFxuY29uc3QgREVGQVVMVF9CTE9DS19EVVJBVElPTiA9IDJcbmNvbnN0IERFRkFVTFRfVFJBTlNJVElPTl9EVVJBVElPTl9NUyA9IDgwMFxuY29uc3QgREVGQVVMVF9UUkFOU0lUSU9OX0RSSUZUID0gOFxuY29uc3QgREVGQVVMVF9CQUNLR1JPVU5EID0gXCIjMGIwYjBiXCJcbmNvbnN0IERFRkFVTFRfRk9OVF9GQU1JTFkgPVxuICBcIlNGTW9uby1SZWd1bGFyLCBNZW5sbywgTW9uYWNvLCBDb25zb2xhcywgJ0xpYmVyYXRpb24gTW9ubycsICdDb3VyaWVyIE5ldycsIG1vbm9zcGFjZVwiXG5jb25zdCBERUZBVUxUX0ZPTlRfU0laRSA9IDI0XG5jb25zdCBERUZBVUxUX0ZPUkVHUk9VTkQgPSBcIiNlNmU2ZTZcIlxuY29uc3QgREVGQVVMVF9MSU5FX0hFSUdIVCA9IDM0XG5jb25zdCBERUZBVUxUX1BBRERJTkcgPSA2NFxuY29uc3QgVEFCX1JFUExBQ0VNRU5UID0gXCIgIFwiXG5cbmV4cG9ydCBjb25zdCBiYWNrZ3JvdW5kID0gT3B0aW9ucy50ZXh0KFwiYmFja2dyb3VuZFwiKS5waXBlKFxuICBPcHRpb25zLndpdGhBbGlhcyhcImJnXCIpLFxuICBPcHRpb25zLndpdGhEZWZhdWx0KERFRkFVTFRfQkFDS0dST1VORCksXG4gIE9wdGlvbnMud2l0aERlc2NyaXB0aW9uKFwiQmFja2dyb3VuZCBjb2xvciBiZWhpbmQgdGhlIGNvZGVcIilcbilcblxuZXhwb3J0IGNvbnN0IGJsb2NrRHVyYXRpb24gPSBPcHRpb25zLmZsb2F0KFwiYmxvY2stZHVyYXRpb25cIikucGlwZShcbiAgT3B0aW9ucy53aXRoQWxpYXMoXCJiZFwiKSxcbiAgT3B0aW9ucy53aXRoRGVmYXVsdChERUZBVUxUX0JMT0NLX0RVUkFUSU9OKSxcbiAgT3B0aW9ucy53aXRoRGVzY3JpcHRpb24oXCJTZWNvbmRzIGVhY2ggY29kZSBibG9jayBzdGF5cyBvbiBzY3JlZW5cIilcbilcblxuZXhwb3J0IGNvbnN0IGZvbnRGYW1pbHkgPSBPcHRpb25zLnRleHQoXCJmb250LWZhbWlseVwiKS5waXBlKFxuICBPcHRpb25zLndpdGhBbGlhcyhcImZmXCIpLFxuICBPcHRpb25zLndpdGhEZWZhdWx0KERFRkFVTFRfRk9OVF9GQU1JTFkpLFxuICBPcHRpb25zLndpdGhEZXNjcmlwdGlvbihcIkZvbnQgZmFtaWx5IGZvciB0aGUgdGV4dFwiKVxuKVxuXG5leHBvcnQgY29uc3QgZm9udFNpemUgPSBPcHRpb25zLmludGVnZXIoXCJmb250LXNpemVcIikucGlwZShcbiAgT3B0aW9ucy53aXRoQWxpYXMoXCJmc1wiKSxcbiAgT3B0aW9ucy53aXRoRGVmYXVsdChERUZBVUxUX0ZPTlRfU0laRSksXG4gIE9wdGlvbnMud2l0aERlc2NyaXB0aW9uKFwiRm9udCBzaXplIGluIHBpeGVsc1wiKVxuKVxuXG5leHBvcnQgY29uc3QgZm9yZWdyb3VuZCA9IE9wdGlvbnMudGV4dChcImZvcmVncm91bmRcIikucGlwZShcbiAgT3B0aW9ucy53aXRoQWxpYXMoXCJmZ1wiKSxcbiAgT3B0aW9ucy53aXRoRGVmYXVsdChERUZBVUxUX0ZPUkVHUk9VTkQpLFxuICBPcHRpb25zLndpdGhEZXNjcmlwdGlvbihcIkRlZmF1bHQgdGV4dCBjb2xvclwiKVxuKVxuXG5leHBvcnQgY29uc3QgZm9ybWF0ID0gT3B0aW9ucy5jaG9pY2UoXCJmb3JtYXRcIiwgW1wibXA0XCIsIFwid2VibVwiXSBhcyBjb25zdCkucGlwZShcbiAgT3B0aW9ucy53aXRoQWxpYXMoXCJmXCIpLFxuICBPcHRpb25zLndpdGhEZWZhdWx0KFwibXA0XCIpLFxuICBPcHRpb25zLndpdGhEZXNjcmlwdGlvbihcIk91dHB1dCBjb250YWluZXIgZm9ybWF0LlwiKVxuKVxuXG5leHBvcnQgY29uc3QgZnBzID0gT3B0aW9ucy5pbnRlZ2VyKFwiZnBzXCIpLnBpcGUoXG4gIE9wdGlvbnMud2l0aEFsaWFzKFwiclwiKSxcbiAgT3B0aW9ucy53aXRoRGVmYXVsdChERUZBVUxUX0ZQUyksXG4gIE9wdGlvbnMud2l0aERlc2NyaXB0aW9uKFwiRnJhbWVzIHBlciBzZWNvbmQgZm9yIHRoZSB2aWRlb1wiKVxuKVxuXG5leHBvcnQgY29uc3QgaGVpZ2h0ID0gT3B0aW9ucy5pbnRlZ2VyKFwiaGVpZ2h0XCIpLnBpcGUoXG4gIE9wdGlvbnMud2l0aEFsaWFzKFwiaFwiKSxcbiAgT3B0aW9ucy53aXRoRGVmYXVsdChERUZBVUxUX0hFSUdIVCksXG4gIE9wdGlvbnMud2l0aERlc2NyaXB0aW9uKFwiTWluaW11bSBvdXRwdXQgaGVpZ2h0IGluIHBpeGVscyAoMCA9IGF1dG8pXCIpXG4pXG5cbmV4cG9ydCBjb25zdCBsaW5lSGVpZ2h0ID0gT3B0aW9ucy5pbnRlZ2VyKFwibGluZS1oZWlnaHRcIikucGlwZShcbiAgT3B0aW9ucy53aXRoQWxpYXMoXCJsaFwiKSxcbiAgT3B0aW9ucy53aXRoRGVmYXVsdChERUZBVUxUX0xJTkVfSEVJR0hUKSxcbiAgT3B0aW9ucy53aXRoRGVzY3JpcHRpb24oXCJMaW5lIGhlaWdodCBpbiBwaXhlbHNcIilcbilcblxuZXhwb3J0IGNvbnN0IG91dHB1dCA9IE9wdGlvbnMuZmlsZShcIm91dHB1dFwiKS5waXBlKFxuICBPcHRpb25zLndpdGhBbGlhcyhcIm9cIiksXG4gIE9wdGlvbnMud2l0aERlc2NyaXB0aW9uKFwiRGVzdGluYXRpb24gdmlkZW8gcGF0aFwiKSxcbiAgT3B0aW9ucy5vcHRpb25hbFxuKVxuXG5leHBvcnQgY29uc3QgcGFkZGluZyA9IE9wdGlvbnMuaW50ZWdlcihcInBhZGRpbmdcIikucGlwZShcbiAgT3B0aW9ucy53aXRoQWxpYXMoXCJwXCIpLFxuICBPcHRpb25zLndpdGhEZWZhdWx0KERFRkFVTFRfUEFERElORyksXG4gIE9wdGlvbnMud2l0aERlc2NyaXB0aW9uKFwiUGFkZGluZyBhcm91bmQgdGhlIGNvZGUgYmxvY2sgaW4gcGl4ZWxzXCIpXG4pXG5cbmV4cG9ydCBjb25zdCB0YWJSZXBsYWNlbWVudCA9IE9wdGlvbnMudGV4dChcInRhYi1yZXBsYWNlbWVudFwiKS5waXBlKFxuICBPcHRpb25zLndpdGhBbGlhcyhcInRiXCIpLFxuICBPcHRpb25zLndpdGhEZWZhdWx0KFRBQl9SRVBMQUNFTUVOVCksXG4gIE9wdGlvbnMud2l0aERlc2NyaXB0aW9uKFwiVGV4dCB1c2VkIGluc3RlYWQgb2YgdGFic1wiKVxuKVxuXG5leHBvcnQgY29uc3QgdGhlbWUgPSBPcHRpb25zLnRleHQoXCJ0aGVtZVwiKS5waXBlKFxuICBPcHRpb25zLndpdGhBbGlhcyhcInRcIiksXG4gIE9wdGlvbnMud2l0aERlZmF1bHQoREVGQVVMVF9USEVNRSksXG4gIE9wdGlvbnMud2l0aERlc2NyaXB0aW9uKFwiU2hpa2kgdGhlbWUgZm9yIHN5bnRheCBoaWdobGlnaHRpbmdcIilcbilcblxuZXhwb3J0IGNvbnN0IHRyYW5zaXRpb25EcmlmdCA9IE9wdGlvbnMuZmxvYXQoXCJ0cmFuc2l0aW9uLWRyaWZ0XCIpLnBpcGUoXG4gIE9wdGlvbnMud2l0aEFsaWFzKFwidGRcIiksXG4gIE9wdGlvbnMud2l0aERlZmF1bHQoREVGQVVMVF9UUkFOU0lUSU9OX0RSSUZUKSxcbiAgT3B0aW9ucy53aXRoRGVzY3JpcHRpb24oXCJQaXhlbCBkcmlmdCBkdXJpbmcgdHJhbnNpdGlvbnNcIilcbilcblxuZXhwb3J0IGNvbnN0IHRyYW5zaXRpb25EdXJhdGlvbk1zID0gT3B0aW9ucy5pbnRlZ2VyKFwidHJhbnNpdGlvblwiKS5waXBlKFxuICBPcHRpb25zLndpdGhBbGlhcyhcInRyXCIpLFxuICBPcHRpb25zLndpdGhEZWZhdWx0KERFRkFVTFRfVFJBTlNJVElPTl9EVVJBVElPTl9NUyksXG4gIE9wdGlvbnMud2l0aERlc2NyaXB0aW9uKFwiVHJhbnNpdGlvbiB0aW1lIGJldHdlZW4gc2xpZGVzIGluIG1zXCIpXG4pXG5cbmV4cG9ydCBjb25zdCB3aWR0aCA9IE9wdGlvbnMuaW50ZWdlcihcIndpZHRoXCIpLnBpcGUoXG4gIE9wdGlvbnMud2l0aEFsaWFzKFwid1wiKSxcbiAgT3B0aW9ucy53aXRoRGVmYXVsdChERUZBVUxUX1dJRFRIKSxcbiAgT3B0aW9ucy53aXRoRGVzY3JpcHRpb24oXCJNaW5pbXVtIG91dHB1dCB3aWR0aCBpbiBwaXhlbHMgKDAgPSBhdXRvKVwiKVxuKVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLG9CQUFTO0FBQ1Q7QUFDQSxvQkFBUyxvQkFBUzs7O0FDRmxCO0FBQ0E7QUFDQTtBQUNBLDRCQUFrQjs7O0FDSGxCO0FBQUE7QUFJTyxNQUFNLDJCQUEyQixLQUFLLFlBQVksb0JBQW9CLEVBRTFFO0FBQUM7QUFBQTtBQUVHLE1BQU0scUJBQXFCLEtBQUssWUFBWSxjQUFjLEVBQXFCO0FBQUM7QUFBQTtBQUVoRixNQUFNLGlDQUFpQyxLQUFLLFlBQVksMEJBQTBCLEVBR3RGO0FBQUM7QUFBQTtBQUVHLE1BQU0sNEJBQTRCLEtBQUssWUFBWSxxQkFBcUIsRUFFNUU7QUFBQztBQUFBO0FBRUcsTUFBTSwwQkFBMEIsS0FBSyxZQUFZLG1CQUFtQixFQUFxQjtBQUFDO0FBQUE7QUFFMUYsTUFBTSxrQ0FBa0MsS0FBSyxZQUFZLDJCQUEyQixFQUd4RjtBQUFDO0FBQUE7QUFFRyxNQUFNLHNCQUFzQixLQUFLLFlBQVksZUFBZSxFQUdoRTtBQUFDO0FBQUE7QUFFRyxNQUFNLDJCQUEyQixLQUFLLFlBQVksb0JBQW9CLEVBTzFFO0FBQUM7OztBQ3RDSjtBQUNB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Q0osQ0FDRjs7O0FEdExBLElBQU0sVUFBVSxNQUFNO0FBRXRCLElBQU0sT0FBTyxTQUFRLEtBQUssUUFBUSxFQUFFLEtBQ2xDLFNBQVEsZ0JBQWdCLDZDQUE2QyxHQUNyRSxTQUFRLGdCQUFnQixDQUFDLGNBQU0sQ0FBQyxDQUNsQztBQUVBLElBQU0sVUFBVSxTQUFRLElBQUksTUFBTSxFQUFFLE1BQU0sVUFBVSxRQUFRLENBQUM7QUFFN0QsUUFBUSxRQUFRLElBQUksRUFBRSxLQUNwQixRQUFPLFVBQVU7QUFBQSxFQUNmLHdCQUF3QixDQUFDLFVBQ3ZCLFNBQVEsTUFBTSw2QkFBNkIsTUFBTSxPQUFPLEtBQUssSUFBSSxHQUFHO0FBQUEsRUFDdEUsaUJBQWlCLENBQUMsVUFDaEIsU0FBUSxNQUNOLHlCQUF5QixNQUFNLFlBQVksS0FBSyxFQUFFO0FBQUEsSUFDaEQsMERBQ0o7QUFDSixDQUFDLEdBQ0QsUUFBTyxRQUFRLFlBQVksS0FBSyxHQUNoQyxZQUFZLE9BQ2Q7IiwKICAiZGVidWdJZCI6ICIxQzEyNTFBRDQwNDRCNjM2NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sakuga",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "Create code animations",
5
5
  "keywords": [
6
6
  "bun",