PageSourceSearch

https://app.datasert.com/assets/Run-CqA1UUCm.js

js datasert.com collected 2026-09-24 14:41:53 UTC 261,050 bytes, 2,788 lines download raw bytes

1import { Q as QBreadcrumbsEl } from "./QBreadcrumbsEl-DJmFSikN.js";
2import { a as QTabs, Q as QTab, c as QTabPanels, b as QTabPanel } from "./QTabPanels-BC9Oww_1.js";
3import { aj as openFile, bA as getRunFiles, R as RunFileType, bC as getTaskFiles, L as getFile, aA as getRun, au as valueLabels$1, W as executeJobs, aE as deleteRuns, M as populateRunName, a8 as getJob } from "./realsyncUtils-B_eb3OgH.js";
4import { v as valueLabels, e as copyToClipboard, aN as openUrl, av as createRunFile, aM as readCsv, aB as sortIc, bc as canViewFile, O as formatStorageSize, G as notifyInfo, j as jsUtilsExports, aA as generateId2, Q as getRunDuration, h as notifySuccess, n as naver, y as confirmDelete, b as notifyError, m as formatDateTimeForDisplay } from "./utils-Dl9t6EOZ.js";
5import { m as mixins } from "./mixins-BCMXzTHA.js";
6import { O as OutputField, I as IconCopy } from "./OutputField-DkpOfYYx.js";
7import { _ as _export_sfc, c as createBlock, o as openBlock, w as withCtx, a as createVNode, r as resolveComponent, f as createElementBlock, e as createCommentVNode, b as createBaseVNode, i as withModifiers, K as resolveDirective, j as createTextVNode, t as toDisplayString, E as withDirectives, q as defineComponent, s as ref, R as onBeforeMount, x as watch, F as Fragment } from "./index-l2g1tnsc.js";
8import { Q as QTd } from "./QTd-CqeugD16.js";
9import { Q as QTable } from "./QTable-DkGSl4XC.js";
10import { S as StatusFileViewer } from "./StatusFileViewer--1TQcuKo.js";
11import { F as FileViewerDialog2 } from "./FileViewerDialog2-dcy5GH6m.js";
12import { E as Empty } from "./Empty-xNUtCALd.js";
13import { T as TaskDialog, R as RunFilesDialog, a as JobRunConfirmationDialog } from "./JobRunConfirmationDialog-AI5_iEO3.js";
14import { D as Datagrid } from "./Datagrid-0ZPXgtsI.js";
15import { i as initAgLicense } from "./AgGrid-8YtAO-sI.js";
16import { A as AgGridVue } from "./AgGridVue-P7zRffUM.js";
17import "./modelsMs-40GeEMKf.js";
18import { S as SyncStatus } from "./SyncStatus-Ehz8Em6K.js";
19import { a as getObjectFiles } from "./gooddataUtils-BZlE7NLp.js";
20import { V as ViewErrorMessageDialog } from "./ViewErrorMessageDialog-OLDmWM6x.js";
21import "./QResizeObserver-C-xPzvmf.js";
22import "./rtl-DDpZOXNn.js";
23import "./touch-BscSWsHh.js";
24import "./selection-CtEbNG46.js";
25import "./use-render-cache-DRJWLz-b.js";
26import "./http-QV44vcaW.js";
27import "./api-CsX1TBBI.js";
28/* empty css                                                     */
29import "./QList-uCfqyM8w.js";
30import "./QSelect-a5Elgrcr.js";
31import "./QChip-o69cw4ec.js";
32import "./QItemSection-BtIVec04.js";
33import "./QItemLabel-Bl1X4QV1.js";
34import "./QMenu-CMxSVE7y.js";
35import "./position-engine-DlL3Wjag.js";
36import "./QSplitter-CB1BEeYW.js";
37import "./TouchPan-6jTMktT1.js";
38import "./styles-Ba8hxl-j.js";
39import "./TextViewerDialog-BPyN4E_q.js";
40import "./TextViewer-DMWZwv7n.js";
41import "./Toolbar-Cf2a7rhK.js";
42import "./QToolbarTitle-BeXkQQHt.js";
43import "./QToolbar-DonaEblG.js";
44import "./mixinsV3-DJOx874v.js";
45import "./lodash-D-1jTqv6.js";
46import "./Empty-DmGcIU4i.js";
47import "./light-ChFcYHVz.js";
48import "./Icon-XvtDqeG4.js";
49import "./use-locale-DQNGyfxu.js";
50import "./QForm-B7u6vHMU.js";
51import "./InputFilteringSelect-liwXtivm.js";
52import "./Tooltip-BL9mlxg7.js";
53import "./Popover-DdmYwYku.js";
54import "./Scrollbar-w6xdyLLY.js";
55import "./InputJsonDialog-CZBYKuBU.js";
56import "./CheckboxInline-OqdiZR8_.js";
57import "./QTooltip-CLIBmLrc.js";
58import "./IconMenu-DT6mxtJq.js";
59import "./Icon-PX2LcDsd.js";
60import "./MenuItem-DTtADa1D.js";
61import "./ClosePopup-BJ95hjD9.js";
62import "./Row-D4VaIJlq.js";
63import "./Column-CHEOSUiF.js";
64import "./InputTemplate-C6rgpBgP.js";
65import "./vue-draggable-next.esm-bundler-B9T8NuU2.js";
66import "./ComboBox2-BiTJohDd.js";
67import "./GridSelect-CjyiI6pi.js";
68import "./Avatar-DzN63Sfl.js";
69import "./is-browser-DvVMOi1n.js";
70import "./replaceable-D4umoBrm.js";
71import "./upperFirst-DygzsnnD.js";
72import "./EmailSkewProps-CwH3Sr0k.js";
73import "./ReplaceFirstProps-BZlkvvP2.js";
74import "./InputFormula-BBeIO9Bz.js";
75import "./InputText-UxyPUCv5.js";
76import "./ContentDialog-BqsEGoNh.js";
77import "./QSpace-6jc8zFYb.js";
78import "./Checkbox-CQ3iS9dA.js";
79import "./Tooltip-Bsgn4djW.js";
80import "./Button-BRwAsYpw.js";
81import "./Separator-O_wR5Lqj.js";
82import "./Table-Bjh46XsY.js";
83import "./RouteLink-CCU5m11L.js";
84import "./Tree3-B8c4x5ud.js";
85import "./Tree-CGsirgHk.js";
86import "./Loading-BV46Fun6.js";
87import "./FadeInExpandTransition-Ba2kds_4.js";
88import "./MaskOptions-GU6LYC7Y.js";
89import "./FileNameSkewProps-RsWsfndg.js";
90import "./InputSelect-BYAmTdat.js";
91import "./DataGridStatusRenderer-BEpV8SXs.js";
92import "./Close-CMLcMmhU.js";
93const _sfc_main$g = {
94  props: {
95    model: Object
96  },
97  components: { OutputField },
98  data() {
99    return {
100      message: ""
101    };
102  },
103  methods: {
104    valueLabels() {
105      return valueLabels;
106    }
107  }
108};
109function _sfc_render$g(_ctx, _cache, $props, $setup, $data, $options) {
110  const _component_OutputField = resolveComponent("OutputField");
111  const _component_Column = resolveComponent("Column");
112  const _component_Row = resolveComponent("Row");
113  const _component_Card = resolveComponent("Card");
114  return openBlock(), createBlock(_component_Card, { maxWidth: "800px" }, {
115    default: withCtx(() => [
116      createVNode(_component_Row, null, {
117        default: withCtx(() => [
118          createVNode(_component_Column, null, {
119            default: withCtx(() => [
120              createVNode(_component_OutputField, {
121                label: "Job",
122                value: $props.model.name || $props.model.jobId
123              }, null, 8, ["value"])
124            ]),
125            _: 1
126          }),
127          createVNode(_component_Column, null, {
128            default: withCtx(() => [
129              createVNode(_component_OutputField, {
130                label: "Status",
131                value: $props.model.status,
132                valueLabels: $options.valueLabels().status
133              }, null, 8, ["value", "valueLabels"])
134            ]),
135            _: 1
136          })
137        ]),
138        _: 1
139      }),
140      createVNode(_component_Row, null, {
141        default: withCtx(() => [
142          createVNode(_component_Column, null, {
143            default: withCtx(() => [
144              createVNode(_component_OutputField, {
145                label: "Start At",
146                value: $props.model.startAt,
147                type: "datetime"
148              }, null, 8, ["value"])
149            ]),
150            _: 1
151          }),
152          createVNode(_component_Column, null, {
153            default: withCtx(() => [
154              createVNode(_component_OutputField, {
155                label: "End At",
156                value: $props.model.endAt,
157                type: "datetime"
158              }, null, 8, ["value"])
159            ]),
160            _: 1
161          })
162        ]),
163        _: 1
164      }),
165      createVNode(_component_Row, null, {
166        default: withCtx(() => [
167          createVNode(_component_Column, null, {
168            default: withCtx(() => [
169              createVNode(_component_OutputField, {
170                label: "Completed Tasks",
171                value: ($props.model.tasks || []).filter((task) => task.status === "completed").length
172              }, null, 8, ["value"])
173            ]),
174            _: 1
175          }),
176          createVNode(_component_Column, null, {
177            default: withCtx(() => [
178              createVNode(_component_OutputField, {
179                label: "Errored Tasks",
180                value: ($props.model.tasks || []).filter((task) => task.status === "error" || task.status === "aborted").length
181              }, null, 8, ["value"])
182            ]),
183            _: 1
184          })
185        ]),
186        _: 1
187      }),
188      createVNode(_component_Row, null, {
189        default: withCtx(() => [
190          createVNode(_component_Column, null, {
191            default: withCtx(() => [
192              createVNode(_component_OutputField, {
193                label: "Message",
194                value: $props.model.message
195              }, null, 8, ["value"])
196            ]),
197            _: 1
198          })
199        ]),
200        _: 1
201      }),
202      createVNode(_component_Row, null, {
203        default: withCtx(() => [
204          createVNode(_component_Column, null, {
205            default: withCtx(() => [
206              createVNode(_component_OutputField, {
207                label: "Details",
208                value: $props.model.details
209              }, null, 8, ["value"])
210            ]),
211            _: 1
212          })
213        ]),
214        _: 1
215      })
216    ]),
217    _: 1
218  });
219}
220const RunDetails = /* @__PURE__ */ _export_sfc(_sfc_main$g, [["render", _sfc_render$g], ["__file", "RunDetails.vue"]]);
221const _sfc_main$f = {
222  mixins: [mixins],
223  components: { StatusFileViewer, FileViewerDialog2, Empty },
224  props: {
225    run: Object,
226    jobId: String
227  },
228  data() {
229    return {
230      outputFiles: [],
231      statusFiles: [],
232      logFiles: [],
233      columns: [
234        { name: "actions", align: "left" },
235        { name: "type", field: "type", label: "Type", sortable: true, align: "left" },
236        { name: "fileName", field: "fileName", label: "File Name", sortable: true, align: "left" },
237        { name: "fileDescription", field: "fileDescription", label: "File Desc", sortable: true, align: "left" },
238        { name: "fileSize", field: "fileSizeFormatted", label: "File Size", sortable: true, align: "left" }
239      ],
240      pagination: {
241        page: 1,
242        rowsPerPage: 0
243      },
244      viewerDialogTitle: "",
245      viewerDialogOpen: false,
246      viewerDialogModel: {},
247      statusFileViewerDialogOpen: false
248    };
249  },
250  watch: {
251    run: {
252      handler() {
253        this.loadFiles();
254      },
255      immediate: true
256    }
257  },
258  methods: {
259    loadFiles() {
260      const files = getRunFiles(this.run).filter((file) => !file.taskId);
261      this.outputFiles = files.filter((file) => file.runFileType === RunFileType.outputFile);
262      this.statusFiles = files.filter((file) => file.runFileType === RunFileType.statusFile);
263      this.logFiles = files.filter((file) => file.runFileType === RunFileType.logFile);
264    },
265    viewOutputFile(fileInfo) {
266      this.handleViewFile("Output File: " + fileInfo.fileName, fileInfo, "outputFile");
267    },
268    viewStatusFile(fileInfo) {
269      this.handleViewFile("Status File: " + fileInfo.fileName, fileInfo, "statusFile");
270    },
271    viewLogFile(fileInfo) {
272      this.handleViewFile("Log File: " + fileInfo.fileName, fileInfo, "logFile");
273    },
274    async getOpenableUrl(fileInfo) {
275      if (fileInfo.url.startsWith("http")) {
276        return fileInfo.url;
277      }
278      if (fileInfo.openableUrl) {
279        return fileInfo.openableUrl;
280      }
281      const resp = await this.processForm(
282        () => openFile({
283          runId: fileInfo.runId,
284          jobId: this.jobId,
285          url: fileInfo.url,
286          location: fileInfo.location
287        })
288      );
289      if (resp) {
290        fileInfo.openableUrl = resp.url;
291        return resp.url;
292      }
293    },
294    async handleViewFile(title, fileInfo, fileType) {
295      if (fileInfo.url.startsWith("http")) {
296        openUrl(fileInfo.url);
297        return;
298      }
299      const url = await this.getOpenableUrl(fileInfo);
300      if (!url) {
301        return;
302      }
303      this.viewerDialogTitle = title;
304      this.viewerDialogModel = { ...fileInfo, ...{ viewUrl: url } };
305      if (fileType === "statusFile") {
306        this.statusFileViewerDialogOpen = true;
307      } else {
308        this.viewerDialogOpen = true;
309      }
310    },
311    async downloadFile(fileInfo) {
312      const url = await this.getOpenableUrl(fileInfo);
313      if (url) {
314        if (url.startsWith("http")) {
315          openUrl(url);
316        } else {
317          window.location.href = url;
318        }
319      }
320    },
321    async copyFile(fileInfo) {
322      const url = await this.getOpenableUrl(fileInfo);
323      if (url) {
324        await copyToClipboard(url);
325      }
326    }
327  }
328};
329const _hoisted_1$7 = {
330  key: 0,
331  class: "q-mb-md"
332};
333const _hoisted_2$1 = {
334  key: 1,
335  class: "q-mb-md"
336};
337const _hoisted_3$1 = {
338  key: 2,
339  class: "q-mb-md"
340};
341function _sfc_render$f(_ctx, _cache) {
342  const _component_Icon = resolveComponent("Icon");
343  const _component_Empty = resolveComponent("Empty");
344  const _component_FileViewerDialog2 = resolveComponent("FileViewerDialog2");
345  const _component_StatusFileViewer = resolveComponent("StatusFileViewer");
346  return openBlock(), createElementBlock("div", null, [
347    _ctx.outputFiles.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_1$7, [
348      _cache[5] || (_cache[5] = createBaseVNode("span", null, "Output Files", -1)),
349      createVNode(QTable, {
350        rows: _ctx.outputFiles,
351        columns: _ctx.columns,
352        "row-key": "id",
353        "hide-pagination": true,
354        "rows-per-page-options": [0],
355        pagination: _ctx.pagination,
356        "onUpdate:pagination": _cache[0] || (_cache[0] = ($event) => _ctx.pagination = $event)
357      }, {
358        "body-cell-actions": withCtx((props) => [
359          createVNode(QTd, null, {
360            default: withCtx(() => [
361              createVNode(_component_Icon, {
362                name: "content_copy",
363                onClick: ($event) => _ctx.copyFile(props.row),
364                clickable: "",
365                tooltip: "Copy Url"
366              }, null, 8, ["onClick"]),
367              createVNode(_component_Icon, {
368                name: "cloud_download",
369                onClick: ($event) => _ctx.downloadFile(props.row),
370                clickable: "",
371                tooltip: "Download File"
372              }, null, 8, ["onClick"]),
373              props.row.canView ? (openBlock(), createBlock(_component_Icon, {
374                key: 0,
375                name: "visibility",
376                onClick: ($event) => _ctx.viewOutputFile(props.row),
377                clickable: "",
378                tooltip: "View File"
379              }, null, 8, ["onClick"])) : createCommentVNode("", true)
380            ]),
381            _: 2
382          }, 1024)
383        ]),
384        _: 1
385      }, 8, ["rows", "columns", "pagination"])
386    ])) : createCommentVNode("", true),
387    _ctx.statusFiles.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_2$1, [
388      _cache[6] || (_cache[6] = createBaseVNode("span", null, "Status Files", -1)),
389      createVNode(QTable, {
390        rows: _ctx.statusFiles,
391        columns: _ctx.columns,
392        "row-key": "id",
393        "hide-pagination": true,
394        "rows-per-page-options": [0],
395        pagination: _ctx.pagination,
396        "onUpdate:pagination": _cache[1] || (_cache[1] = ($event) => _ctx.pagination = $event)
397      }, {
398        "body-cell-actions": withCtx((props) => [
399          createVNode(QTd, null, {
400            default: withCtx(() => [
401              createVNode(_component_Icon, {
402                name: "content_copy",
403                onClick: ($event) => _ctx.copyFile(props.row),
404                clickable: "",
405                tooltip: "Copy Url"
406              }, null, 8, ["onClick"]),
407              createVNode(_component_Icon, {
408                name: "cloud_download",
409                onClick: ($event) => _ctx.downloadFile(props.row),
410                clickable: "",
411                tooltip: "Download File"
412              }, null, 8, ["onClick"]),
413              props.row.canView ? (openBlock(), createBlock(_component_Icon, {
414                key: 0,
415                name: "visibility",
416                onClick: ($event) => _ctx.viewStatusFile(props.row),
417                clickable: "",
418                tooltip: "View File"
419              }, null, 8, ["onClick"])) : createCommentVNode("", true)
420            ]),
421            _: 2
422          }, 1024)
423        ]),
424        _: 1
425      }, 8, ["rows", "columns", "pagination"])
426    ])) : createCommentVNode("", true),
427    _ctx.logFiles.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_3$1, [
428      createVNode(QTable, {
429        rows: _ctx.logFiles,
430        columns: _ctx.columns,
431        "row-key": "id",
432        "hide-pagination": true,
433        "rows-per-page-options": [0],
434        pagination: _ctx.pagination,
435        "onUpdate:pagination": _cache[2] || (_cache[2] = ($event) => _ctx.pagination = $event)
436      }, {
437        "body-cell-actions": withCtx((props) => [
438          createVNode(QTd, null, {
439            default: withCtx(() => [
440              createVNode(_component_Icon, {
441                name: "content_copy",
442                onClick: ($event) => _ctx.copyFile(props.row),
443                clickable: "",
444                tooltip: "Copy Url"
445              }, null, 8, ["onClick"]),
446              createVNode(_component_Icon, {
447                name: "cloud_download",
448                onClick: ($event) => _ctx.downloadFile(props.row),
449                clickable: "",
450                tooltip: "Download File"
451              }, null, 8, ["onClick"]),
452              props.row.canView ? (openBlock(), createBlock(_component_Icon, {
453                key: 0,
454                name: "visibility",
455                onClick: ($event) => _ctx.viewLogFile(props.row),
456                clickable: "",
457                tooltip: "View File"
458              }, null, 8, ["onClick"])) : createCommentVNode("", true)
459            ]),
460            _: 2
461          }, 1024)
462        ]),
463        _: 1
464      }, 8, ["rows", "columns", "pagination"])
465    ])) : createCommentVNode("", true),
466    !_ctx.outputFiles.length && !_ctx.statusFiles.length && !_ctx.logFiles.length ? (openBlock(), createBlock(_component_Empty, {
467      key: 3,
468      desc: "No run-level files found"
469    })) : createCommentVNode("", true),
470    createVNode(_component_FileViewerDialog2, {
471      modelValue: _ctx.viewerDialogOpen,
472      "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => _ctx.viewerDialogOpen = $event),
473      title: _ctx.viewerDialogTitle,
474      fileInfo: _ctx.viewerDialogModel
475    }, null, 8, ["modelValue", "title", "fileInfo"]),
476    createVNode(_component_StatusFileViewer, {
477      modelValue: _ctx.statusFileViewerDialogOpen,
478      "onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => _ctx.statusFileViewerDialogOpen = $event),
479      title: _ctx.viewerDialogTitle,
480      fileInfo: _ctx.viewerDialogModel
481    }, null, 8, ["modelValue", "title", "fileInfo"])
482  ]);
483}
484const RunFiles = /* @__PURE__ */ _export_sfc(_sfc_main$f, [["render", _sfc_render$f], ["__file", "RunFiles.vue"]]);
485const _sfc_main$e = {
486  mixins: [mixins],
487  components: { StatusFileViewer, FileViewerDialog2, IconCopy },
488  props: {
489    title: String,
490    jobId: String,
491    modelValue: Boolean,
492    task: Object,
493    run: Object,
494    errorFiles: Array
495  },
496  emits: ["cancel", "update:modelValue"],
497  data() {
498    return {
499      outputFiles: [],
500      statusFiles: [],
501      logFiles: [],
502      files: [],
503      columns: [
504        { name: "actions", align: "left" },
505        { name: "taskName", field: "taskName", label: "Task", sortable: true, align: "left" },
506        { name: "type", field: "type", label: "Type", sortable: true, align: "left" },
507        { name: "fileName", field: "fileName", label: "File Name", sortable: true, align: "left" },
508        { name: "fileDescription", field: "fileDescription", label: "File Desc", sortable: true, align: "left" },
509        { name: "fileSize", field: "fileSizeFormatted", label: "File Size", sortable: true, align: "left" }
510      ],
511      fileColumns: [
512        { name: "actions", align: "left" },
513        { name: "fileName", field: "fileName", label: "File Name", sortable: true, align: "left" },
514        { name: "fileDescription", field: "fileDescription", label: "File Desc", sortable: true, align: "left" },
515        { name: "fileSize", field: "fileSizeFormatted", label: "File Size", sortable: true, align: "left" }
516      ],
517      viewerDialogTitle: "",
518      viewerDialogOpen: false,
519      viewerDialogModel: {},
520      statusFileViewerDialogOpen: false
521    };
522  },
523  computed: {
524    errorFilesToShow() {
525      var _a;
526      const files = (this.errorFiles && this.errorFiles.length > 0 ? this.errorFiles : (_a = this.task) == null ? void 0 : _a.errorSummaryUrls) || [];
527      return files.map((fileInfo) =>
527 createRunFile(fileInfo));
528    }
529  },
530  created() {
531    this.initingSuccess = true;
532  },
533  watch: {
534    modelValue() {
535      if (!this.modelValue) {
536        return;
537      }
538      const files = getTaskFiles(this.run, this.task);
539      this.outputFiles = files.filter((file) => file.runFileType === RunFileType.outputFile);
540      this.statusFiles = files.filter((file) => file.runFileType === RunFileType.statusFile);
541      this.logFiles = files.filter((file) => file.runFileType === RunFileType.logFile);
542    }
543  },
544  methods: {
545    close() {
546      this.$emit("cancel");
547    },
548    viewOutputFile(fileInfo) {
549      this.handleViewFile("Output File: " + fileInfo.fileName, fileInfo, "outputFile");
550    },
551    viewStatusFile(fileInfo) {
552      this.handleViewFile("Status File: " + fileInfo.fileName, fileInfo, "statusFile");
553    },
554    viewLogFile(fileInfo) {
555      this.handleViewFile("Log File: " + fileInfo.fileName, fileInfo, "logFile");
556    },
557    viewErrorFile(fileInfo) {
558      this.handleViewFile("Errors File: " + fileInfo.fileName, fileInfo, "statusFile");
559    },
560    async getOpenableUrl(fileInfo) {
561      if (fileInfo.url.startsWith("http")) {
562        return fileInfo.url;
563      } else {
564        if (fileInfo.openableUrl) {
565          return fileInfo.openableUrl;
566        }
567        const resp = await this.processForm(
568          () => openFile({
569            runId: fileInfo.runId,
570            jobId: this.jobId,
571            url: fileInfo.url,
572            location: fileInfo.location
573          })
574        );
575        if (resp) {
576          fileInfo.openableUrl = resp.url;
577          return resp.url;
578        }
579      }
580    },
581    async handleViewFile(title, fileInfo, fileType) {
582      if (fileInfo.url.startsWith("http")) {
583        openUrl(fileInfo.url);
584        return;
585      }
586      const url = await this.getOpenableUrl(fileInfo);
587      if (!url) {
588        return;
589      }
590      this.viewerDialogTitle = title;
591      this.viewerDialogModel = {
592        ...fileInfo,
593        ...{ viewUrl: url }
594      };
595      if (fileType === "statusFile") {
596        this.statusFileViewerDialogOpen = true;
597      } else {
598        this.viewerDialogOpen = true;
599      }
600    },
601    async openInTab(fileInfo) {
602      const url = await this.getOpenableUrl(fileInfo);
603      if (url) {
604        openUrl(url);
605      }
606    },
607    async downloadFile(fileInfo) {
608      let url = await this.getOpenableUrl(fileInfo);
609      if (url) {
610        if (url.startsWith("http")) {
611          openUrl(url);
612        } else {
613          window.location.href = url;
614        }
615      }
616    },
617    async copyFile(fileInfo) {
618      let url = await this.getOpenableUrl(fileInfo);
619      if (url) {
620        await copyToClipboard(url);
621      }
622    }
623  }
624};
625const _hoisted_1$6 = {
626  key: 0,
627  class: "q-mb-md"
628};
629const _hoisted_2 = {
630  key: 1,
631  class: "q-mb-md"
632};
633const _hoisted_3 = {
634  key: 2,
635  class: "q-mb-md"
636};
637const _hoisted_4 = {
638  key: 3,
639  class: "q-mb-md"
640};
641function _sfc_render$e(_ctx, _cache) {
642  const _component_Icon = resolveComponent("Icon");
643  const _component_IconCopy = resolveComponent("IconCopy");
644  const _component_FileViewerDialog2 = resolveComponent("FileViewerDialog2");
645  const _component_StatusFileViewer = resolveComponent("StatusFileViewer");
646  const _component_ContentDialog = resolveComponent("ContentDialog");
647  return openBlock(), createBlock(_component_ContentDialog, {
648    title: _ctx.title || "Files",
649    modelValue: _ctx.modelValue,
650    "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => _ctx.$emit("update:modelValue")),
651    message: _ctx.message,
652    messageType: _ctx.messageType,
653    initing: _ctx.initing,
654    initingSuccess: _ctx.initingSuccess,
655    processing: _ctx.processing,
656    height: "auto",
657    width: "1200px",
658    closeMode: "",
659    persistent: false,
660    onCancel: _ctx.close
661  }, {
662    default: withCtx(() => [
663      _ctx.outputFiles && _ctx.outputFiles.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_1$6, [
664        _cache[3] || (_cache[3] = createBaseVNode("span", { class: "" }, "Output Files", -1)),
665        createVNode(QTable, {
666          rows: _ctx.outputFiles,
667          columns: _ctx.columns,
668          "row-key": "id",
669          "hide-pagination": true,
670          "rows-per-page-options": [0]
671        }, {
672          "body-cell-actions": withCtx((props) => [
673            createVNode(QTd, null, {
674              default: withCtx(() => [
675                createVNode(_component_Icon, {
676                  name: "content_copy",
677                  onClick: ($event) => _ctx.copyFile(props.row),
678                  clickable: "",
679                  tooltip: "Copy Url"
680                }, null, 8, ["onClick"]),
681                createVNode(_component_Icon, {
682                  name: "cloud_download",
683                  onClick: ($event) => _ctx.downloadFile(props.row),
684                  clickable: "",
685                  tooltip: "Download File"
686                }, null, 8, ["onClick"]),
687                props.row.canView ? (openBlock(), createBlock(_component_Icon, {
688                  key: 0,
689                  name: "visibility",
690                  onClick: ($event) => _ctx.viewOutputFile(props.row),
691                  clickable: "",
692                  tooltip: "View File"
693                }, null, 8, ["onClick"])) : createCommentVNode("", true)
694              ]),
695              _: 2
696            }, 1024)
697          ]),
698          _: 1
699        }, 8, ["rows", "columns"])
700      ])) : createCommentVNode("", true),
701      _ctx.statusFiles && _ctx.statusFiles.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_2, [
702        _cache[4] || (_cache[4] = createBaseVNode("span", { class: "" }, "Status Files", -1)),
703        createVNode(QTable, {
704          rows: _ctx.statusFiles,
705          columns: _ctx.columns,
706          "row-key": "id",
707          "hide-pagination": true,
708          "rows-per-page-options": [0]
709        }, {
710          "body-cell-actions": withCtx((props) => [
711            createVNode(QTd, null, {
712              default: withCtx(() => [
713                createVNode(_component_IconCopy, {
714                  content: props.row.url,
715                  tooltip: "Copy url to Clipboard"
716                }, null, 8, ["content"]),
717                createVNode(_component_Icon, {
718                  name: "cloud_download",
719                  onClick: ($event) => _ctx.downloadFile(props.row),
720                  clickable: "",
721                  tooltip: "Download File"
722                }, null, 8, ["onClick"]),
723                props.row.canView ? (openBlock(), createBlock(_component_Icon, {
724                  key: 0,
725                  name: "visibility",
726                  onClick: ($event) => _ctx.viewStatusFile(props.row),
727                  clickable: "",
728                  tooltip: "View File"
729                }, null, 8, ["onClick"])) : createCommentVNode("", true)
730              ]),
731              _: 2
732            }, 1024)
733          ]),
734          _: 1
735        }, 8, ["rows", "columns"])
736      ])) : createCommentVNode("", true),
737      _ctx.errorFilesToShow && _ctx.errorFilesToShow.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_3, [
738        _cache[5] || (_cache[5] = createBaseVNode("span", { class: "" }, "Errors", -1)),
739        createVNode(QTable, {
740          rows: _ctx.errorFilesToShow,
741          columns: _ctx.fileColumns,
742          "row-key": "id",
743          "hide-pagination": true,
744          "rows-per-page-options": [0]
745        }, {
746          "body-cell-actions": withCtx((props) => [
747            createVNode(QTd, null, {
748              default: withCtx(() => [
749                createVNode(_component_IconCopy, {
750                  content: props.row.url,
751                  tooltip: "Copy url to Clipboard"
752                }, null, 8, ["content"]),
753                createVNode(_component_Icon, {
754                  name: "cloud_download",
755                  onClick: ($event) => _ctx.downloadFile(props.row),
756                  clickable: "",
757                  tooltip: "Download File"
758                }, null, 8, ["onClick"]),
759                props.row.canView ? (openBlock(), createBlock(_component_Icon, {
760                  key: 0,
761                  name: "visibility",
762                  onClick: ($event) => _ctx.viewErrorFile(props.row),
763                  clickable: "",
764                  tooltip: "View File"
765                }, null, 8, ["onClick"])) : createCommentVNode("", true)
766              ]),
767              _: 2
768            }, 1024)
769          ]),
770          _: 1
771        }, 8, ["rows", "columns"])
772      ])) : createCommentVNode("", true),
773      _ctx.logFiles && _ctx.logFiles.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_4, [
774        _cache[6] || (_cache[6] = createBaseVNode("span", { class: "" }, "Log Files", -1)),
775        createVNode(QTable, {
776          rows: _ctx.logFiles,
777          columns: _ctx.columns,
778          "row-key": "id",
779          "hide-pagination": true,
780          "rows-per-page-options": [0]
781        }, {
782          "body-cell-actions": withCtx((props) => [
783            createVNode(QTd, null, {
784              default: withCtx(() => [
785                createVNode(_component_IconCopy, {
786                  content: props.row.url,
787                  tooltip: "Copy url to Clipboard"
788                }, null, 8, ["content"]),
789                createVNode(_component_Icon, {
790                  name: "cloud_download",
791                  onClick: ($event) => _ctx.downloadFile(props.row),
792                  clickable: "",
793                  tooltip: "Download File"
794                }, null, 8, ["onClick"]),
795                props.row.canView ? (openBlock(), createBlock(_component_Icon, {
796                  key: 0,
797                  name: "visibility",
798                  onClick: ($event) => _ctx.viewLogFile(props.row),
799                  clickable: "",
800                  tooltip: "View File"
801                }, null, 8, ["onClick"])) : createCommentVNode("", true)
802              ]),
803              _: 2
804            }, 1024)
805          ]),
806          _: 1
807        }, 8, ["rows", "columns"])
808      ])) : createCommentVNode("", true),
809      createVNode(_component_FileViewerDialog2, {
810        modelValue: _ctx.viewerDialogOpen,
811        "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.viewerDialogOpen = $event),
812        title: _ctx.viewerDialogTitle,
813        fileInfo: _ctx.viewerDialogModel
814      }, null, 8, ["modelValue", "title", "fileInfo"]),
815      createVNode(_component_StatusFileViewer, {
816        modelValue: _ctx.statusFileViewerDialogOpen,
817        "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => _ctx.statusFileViewerDialogOpen = $event),
818        title: _ctx.viewerDialogTitle,
819        fileInfo: _ctx.viewerDialogModel
820      }, null, 8, ["modelValue", "title", "fileInfo"])
821    ]),
822    _: 1
823  }, 8, ["title", "modelValue", "message", "messageType", "initing", "initingSuccess", "processing", "onCancel"]);
824}
825const TaskFilesDialog = /* @__PURE__ */ _export_sfc(_sfc_main$e, [["render", _sfc_render$e], ["__file", "TaskFilesDialog.vue"]]);
826const _sfc_main$d = {
827  props: {
828    params: Object
829  },
830  data() {
831    return {
832      row: {}
833    };
834  },
835  created() {
836    var _a;
837    this.row = ((_a = this.params) == null ? void 0 : _a.data) || {};
838  },
839  methods: {
840    show() {
841      var _a;
842      return !this.row.summaryTotal && (((_a = this.row.stats) == null ? void 0 : _a.errors) || 0) > 0;
843    },
844    viewErrors() {
845      var _a;
846      if ((_a = this.params) == null ? void 0 : _a.viewErrors) {
847        this.params.viewErrors(this.row);
848      }
849    }
850  }
851};
852const _hoisted_1$5 = {
853  key: 0,
854  style: { "margin-top": "2px" }
855};
856function _sfc_render$d(_ctx, _cache, $props, $setup, $data, $options) {
857  const _component_Icon = resolveComponent("Icon");
858  return $options.show() ? (openBlock(), createElementBlock("div", _hoisted_1$5, [
859    createVNode(_component_Icon, {
860      name: "visibility",
861      onMousedown: _cache[0] || (_cache[0] = withModifiers(() => {
862      }, ["stop"])),
863      onPointerdown: _cache[1] || (_cache[1] = withModifiers(() => {
864      }, ["stop"])),
865      onClick: withModifiers($options.viewErrors, ["stop"]),
866      clickable: "",
867      tooltip: "View Errors"
868    }, null, 8, ["onClick"])
869  ])) : createCommentVNode("", true);
870}
871const DataCopyObjectsSummaryAction = /* @__PURE__ */ _export_sfc(_sfc_main$d, [["render", _sfc_render$d], ["__file", "DataCopyObjectsSummaryAction.vue"]]);
872const _sfc_main$c = {
873  components: { DataCopyObjectsSummaryAction, Datagrid, StatusFileViewer },
874  props: {
875    model: Object,
876    jobId: String,
877    runId: String
878  },
879  data() {
880    return {
881      columns: [
882        {
883          headerName: "View",
884          width: 60,
885          sortable: false,
886          filter: false,
887          resizable: false,
888          cellRenderer: DataCopyObjectsSummaryAction,
889          cellRendererParams: (params) => {
890            return {
891              params,
892              viewErrors: (row) => this.viewErrors(row)
893            };
894          }
895        },
896        {
897          headerName: "Name",
898          field: "name",
899          width: 300
900        },
901        { field: "soqls", headerName: "SOQLs", width: 100, type: "int" },
902        {
903          headerName: "Total",
904          valueGetter: (row) => row.data.stats && row.data.stats.total,
905          width: 100,
906          type: "int"
907        },
908        {
909          headerName: "Errors",
910          valueGetter: (row) => row.data.stats && row.data.stats.errors,
911          width: 100,
912          type: "int"
913        },
914        {
915          headerName: "Success",
916          valueGetter: (row) => row.data.stats && row.data.stats.success,
917          width: 100,
918          type: "int"
919        },
920        {
921          headerName: "Skipped",
922          valueGetter: (row) => row.data.stats && row.data.stats.skipped,
923          width: 100,
924          type: "int"
925        },
926        {
927          headerName: "Inserts",
928          valueGetter: (row) => row.data.stats && row.data.stats.inserts,
929          width: 100,
930          type: "int"
931        },
932        {
933          headerName: "Updates",
934          valueGetter: (row) => row.data.stats && row.data.stats.updates,
935          width: 100,
936          type: "int"
937        }
938      ],
939      records: this.getObjects,
940      openableUrlCache: /* @__PURE__ */ new Map(),
941      viewErrorsDialogOpen: false,
942      viewErrorsDialogTitle: "",
943      viewErrorsRows: []
944    };
945  },
946  watch: {
947    model() {
948      this.refresh();
949    }
950  },
951  methods: {
952    async getObjects() {
953      const records = sortIc([...this.model.copyStats || []], "name");
954      if (records.length === 0) {
955        return records;
956      }
957      return [this.getTotalRow(records), ...records];
958    },
959    getTotalRow(records) {
960      var _a, _b, _c, _d, _e, _f;
961      const total = {
962        name: "<Total>",
963        soqls: 0,
964        stats: {
965          total: 0,
966          errors: 0,
967          success: 0,
968          skipped: 0,
969          inserts: 0,
970          updates: 0
971        },
972        summaryTotal: true
973      };
974      for (const record of records) {
975        total.soqls += record.soqls || 0;
976        total.stats.total += ((_a = record.stats) == null ? void 0 : _a.total) || 0;
977        total.stats.errors += ((_b = record.stats) == null ? void 0 : _b.errors) || 0;
978        total.stats.success += ((_c = record.stats) == null ? void 0 : _c.success) || 0;
979        total.stats.skipped += ((_d = record.stats) == null ? void 0 : _d.skipped) || 0;
980        total.stats.inserts += ((_e = record.stats) == null ? void 0 : _e.inserts) || 0;
981        total.stats.updates += ((_f = record.stats) == null ? void 0 : _f.updates) || 0;
982      }
983      return total;
984    },
985    isObjectMatch(item, objectName) {
986      if (!item || !item.name || !objectName) {
987        return false;
988      }
989      const itemName = item.name.toLowerCase();
990      const targetName = objectName.toLowerCase();
991      return itemName === targetName || itemName.endsWith(`(${targetName})`);
992    },
993    hasNonReferenceError(item) {
994      const errorTypes = ((item == null ? void 0 : item.errorTypes) || []).map((it) => (it || "").toLowerCase());
995      if (errorTypes.length === 0) {
996        return true;
997      }
998      return errorTypes.some((it) => it !== "reference");
999    },
1000    async getOpenableUrl(fileInfo) {
1001      if (!(fileInfo == null ? void 0 : fileInfo.url)) {
1002        return void 0;
1003      }
1004      if (fileInfo.url.startsWith("http")) {
1005        return fileInfo.url;
1006      }
1007      const cachedUrl = this.openableUrlCache.get(fileInfo.url);
1008      if (cachedUrl) {
1009        return cachedUrl;
1010      }
1011      const resp = await openFile({
1012        runId: this.runId,
1013        jobId: this.jobId,
1014        url: fileInfo.url
1015      });
1016      if (resp == null ? void 0 : resp.url) {
1017        this.openableUrlCache.set(fileInfo.url, resp.url);
1018        return resp.url;
1019      }
1020      return void 0;
1021    },
1022    async readStatusFile(fileInfo) {
1023      const url = await this.getOpenableUrl(fileInfo);
1024      if (!url) {
1025        return [];
1026      }
1027      const content = await getFile(url);
1028      const csv = readCsv(content);
1029      return (csv == null ? void 0 : csv.records) || [];
1030    },
1031    collectMatchingStatusFiles(objectName) {
1032      var _a;
1033      const files = [];
1034      const seenFiles = /* @__PURE__ */ new Set();
1035      const walk = (items) => {
1036        for (const item of items || []) {
1037          if (this.isObjectMatch(item, objectName) && this.hasNonReferenceError(item)) {
1038            for (const fileInfo of item.statusUrls || []) {
1039              if (!(fileInfo == null ? void 0 : fileInfo.url) || seenFiles.has(fileInfo.url)) {
1040                continue;
1041              }
1042              seenFiles.add(fileInfo.url);
1043              files.push(fileInfo);
1044            }
1045          }
1046          walk(item.parents);
1047          walk(item.children);
1048        }
1049      };
1050      walk(((_a = this.model) == null ? void 0 : _a.objectsTree) || []);
1051      return files;
1052    },
1053    isSaveErrorRecord(rec) {
1054      var _a, _b;
1055      const status = ((rec == null ? void 0 : rec.status) || "").toLowerCase();
1056      if (status !== "error" || !(rec == null ? void 0 : rec.record)) {
1057        return false;
1058      }
1059      try {
1060        const recObj = JSON.parse(rec.record);
1061        const errorType = (((_a = recObj == null ? void 0 : recObj.attributes) == null ? void 0 : _a.errorType) || ((_b = recObj == null ? void 0 : recObj.attributes) == null ? void 0 : _b.errortype) || (recObj == null ? void 0 : recObj.errorType) || "").toLowerCase();
1062        return errorType === "save";
1063      } catch (_e) {
1064        return false;
1065      }
1066    },
1067    getErrorDetailsFromRecord(rec) {
1068      var _a, _b;
1069      if (!(rec == null ? void 0 : rec.record)) {
1070        return "";
1071      }
1072      try {
1073        const record = JSON.parse(rec.record);
1074        const details = [];
1075        const addDetail = (value) => {
1076          if (Array.isArray(value)) {
1077            details.push(...value.filter((it) => it).map((it) => `${it}`));
1078          } else if (value) {
1079            details.push(`${value}`);
1080          }
1081        };
1082        addDetail(record == null ? void 0 : record.details);
1083        addDetail(record == null ? void 0 : record.message);
1084        addDetail((_a = record == null ? void 0 : record.attributes) == null ? void 0 : _a.details);
1085        addDetail((_b = record == null ? void 0 : record.attributes) == null ? void 0 : _b.message);
1086        addDetail(record == null ? void 0 : record.errors);
1087        return details.filter((it) => it).join(" | ");
1088      } catch (_e) {
1089        return "";
1090      }
1091    },
1092    combineErrorsWithDetails(rec) {
1093      const errors = [(rec == null ? void 0 : rec.errors) || "", this.getErrorDetailsFromRecord(rec)].filter((it) => it);
1094      return { ...rec, errors: errors.join(" | ") };
1095    },
1096    collectErrorRowsFromRecords(records) {
1097      const rows = [];
1098      for (const rec of records || []) {
1099        if (this.isSaveErrorRecord(rec)) {
1100          rows.push(this.combineErrorsWithDetails(rec));
1101        }
1102      }
1103      return rows;
1104    },
1105    async getObjectErrorRows(objectName) {
1106      const rows = [];
1107      const files = this.collectMatchingStatusFiles(objectName);
1108      const fileRecords = await Promise.all(files.map((fileInfo) => this.readStatusFile(fileInfo)));
1109      for (const records of fileRecords) {
1110        rows.push(...this.collectErrorRowsFromRecords(records));
1111      }
1112      return rows;
1113    },
1114    async viewErrors(row) {
1115      this.viewErrorsDialogTitle = `Errors for ${row.name}`;
1116      try {
1117        this.viewErrorsRows = await this.getObjectErrorRows(row.name);
1118      } catch (_e) {
1119        this.viewErrorsRows = [];
1120      }
1121      this.viewErrorsDialogOpen = true;
1122    },
1123    refresh() {
1124      this.$nextTick(() => {
1125        if (this.$refs.grid) {
1126          this.$refs.grid.refresh();
1127        }
1128      });
1129    }
1130  }
1131};
1132function _sfc_render$c(_ctx, _cache, $props, $setup, $data, $options) {
1133  const _component_Datagrid = resolveComponent("Datagrid");
1134  const _component_StatusFileViewer = resolveComponent("StatusFileViewer");
1135  return openBlock(), createElementBlock("div", null, [
1136    createVNode(_component_Datagrid, {
1137      ref: "grid",
1138      recordType: "Object",
1139      recordTypePlural: "Objects",
1140      columns: $data.columns,
1141      records: $data.records,
1142      creatable: false,
1143      updatable: false,
1144      deletable: false,
1145      actionsColumn: false,
1146      rowSelection: "none",
1147      refreshable: false,
1148      toolbar: false,
1149      height: "70vh"
1150    }, null, 8, ["columns", "records"]),
1151    createVNode(_component_StatusFileViewer, {
1152      modelValue: $data.viewErrorsDialogOpen,
1153      "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => $data.viewErrorsDialogOpen = $event),
1154      title: $data.viewErrorsDialogTitle,
1155      rows: $data.viewErrorsRows,
1156      persistent: true
1157    }, null, 8, ["modelValue", "title", "rows"])
1158  ]);
1159}
1160const DataCopyObjectsSummaryDialog = /* @__PURE__ */ _export_sfc(_sfc_main$c, [["render", _sfc_render$c], ["__file", "DataCopyObjectsSummaryDialog.vue"]]);
1161const _sfc_main$b = {
1162  mixins: [mixins],
1163  components: { StatusFileViewer, IconCopy },
1164  props: {
1165    title: String,
1166    jobId: String,
1167    modelValue: Boolean,
1168    task: Object,
1169    run: Object,
1170    statusFiles: Array
1171  },
1172  emits: ["cancel", "update:modelValue"],
1173  data() {
1174    return {
1175      columns: [
1176        { name: "actions", align: "left" },
1177        // {name: 'taskName', field: 'taskName', label: 'Task', sortable: true, align: 'left'},
1178        { name: "fileName", field: "fileName", label: "File Name", sortable: true, align: "left" },
1179        { name: "type", field: "contentType", label: "Type", sortable: true, align: "left" },
1180        { name: "fileDescription", field: "fileDescription", label: "File Desc", sortable: true, align: "left" },
1181        { headerName: "File Size", field: (row) => formatStorageSize(row.fileSize), label: "File Size", sortable: true, align: "left" }
1182      ],
1183      viewerDialogTitle: "",
1184      viewerDialogModel: {},
1185      statusFileViewerDialogOpen: false
1186    };
1187  },
1188  created() {
1189    this.initingSuccess = true;
1190  },
1191  watch: {
1192    modelValue() {
1193      if (!this.modelValue) {
1194        return;
1195      }
1196    }
1197  },
1198  methods: {
1199    close() {
1200      this.$emit("cancel");
1201    },
1202    viewStatusFile(fileInfo) {
1203      this.handleViewFile("Status File: " + fileInfo.fileName, fileInfo, "statusFile");
1204    },
1205    async getOpenableUrl(fileInfo) {
1206      if (fileInfo.url.startsWith("http")) {
1207        return fileInfo.url;
1208      } else {
1209        if (fileInfo.openableUrl) {
1210          return fileInfo.openableUrl;
1211        }
1212        const resp = await this.processForm(
1213          async () => await openFile({
1214            runId: fileInfo.runId,
1215            jobId: this.jobId,
1216            url: fileInfo.url,
1217            location: fileInfo.location
1218          })
1219        );
1220        if (resp) {
1221          return resp.url;
1222        }
1223      }
1224    },
1225    async handleViewFile(title, fileInfo, fileType) {
1226      if (fileInfo.url.startsWith("http")) {
1227        openUrl(fileInfo.url);
1228        return;
1229      }
1230      const url = await this.getOpenableUrl(fileInfo);
1231      if (!url) {
1232        return;
1233      }
1234      this.viewerDialogTitle = title;
1235      this.viewerDialogModel = {
1236        ...fileInfo,
1237        ...{ viewUrl: url }
1238      };
1239      this.statusFileViewerDialogOpen = true;
1240    },
1241    async downloadFile(fileInfo) {
1242      let url = await this.getOpenableUrl(fileInfo);
1243      if (url) {
1244        if (url.startsWith("http")) {
1245          openUrl(url);
1246        } else {
1247          window.location.href = url;
1248        }
1249      }
1250    },
1251    canViewFile(fileInfo) {
1252      return canViewFile(fileInfo);
1253    }
1254  }
1255};
1256const _hoisted_1$4 = {
1257  key: 0,
1258  class: "q-mb-md"
1259};
1260function _sfc_render$b(_ctx, _cache) {
1261  const _component_IconCopy = resolveComponent("IconCopy");
1262  const _component_Icon = resolveComponent("Icon");
1263  const _component_StatusFileViewer = resolveComponent("StatusFileViewer");
1264  const _component_ContentDialog = resolveComponent("ContentDialog");
1265  return openBlock(), createBlock(_component_ContentDialog, {
1266    title: _ctx.title || "Files",
1267    modelValue: _ctx.modelValue,
1268    "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => _ctx.$emit("update:modelValue")),
1269    message: _ctx.message,
1270    messageType: _ctx.messageType,
1271    initing: _ctx.initing,
1272    initingSuccess: _ctx.initingSuccess,
1273    processing: _ctx.processing,
1274    height: "auto",
1275    width: "1200px",
1276    closeMode: "",
1277    persistent: false,
1278    onCancel: _ctx.close
1279  }, {
1280    default: withCtx(() => [
1281      _ctx.statusFiles && _ctx.statusFiles.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_1$4, [
1282        createVNode(QTable, {
1283          rows: _ctx.statusFiles,
1284          columns: _ctx.columns,
1285          "row-key": "id",
1286          "hide-pagination": true,
1287          "rows-per-page-options": [0]
1288        }, {
1289          "body-cell-actions": withCtx((props) => [
1290            createVNode(QTd, null, {
1291              default: withCtx(() => [
1292                createVNode(_component_IconCopy, {
1293                  content: props.row.url,
1294                  tooltip: "Copy url to Clipboard"
1295                }, null, 8, ["content"]),
1296                createVNode(_component_Icon, {
1297                  name: "cloud_download",
1298                  onClick: ($event) => _ctx.downloadFile(props.row),
1299                  clickable: "",
1300                  tooltip: "Download File"
1301                }, null, 8, ["onClick"]),
1302                _ctx.canViewFile(props.row) ? (openBlock(), createBlock(_component_Icon, {
1303                  key: 0,
1304                  name: "visibility",
1305                  onClick: ($event) => _ctx.viewStatusFile(props.row),
1306                  clickable: "",
1307                  tooltip: "View File"
1308                }, null, 8, ["onClick"])) : createCommentVNode("", true)
1309              ]),
1310              _: 2
1311            }, 1024)
1312          ]),
1313          _: 1
1314        }, 8, ["rows", "columns"])
1315      ])) : createCommentVNode("", true),
1316      createVNode(_component_StatusFileViewer, {
1317        modelValue: _ctx.statusFileViewerDialogOpen,
1318        "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.statusFileViewerDialogOpen = $event),
1319        title: _ctx.viewerDialogTitle,
1320        fileInfo: _ctx.viewerDialogModel
1321      }, null, 8, ["modelValue", "title", "fileInfo"])
1322    ]),
1323    _: 1
1324  }, 8, ["title", "modelValue", "message", "messageType", "initing", "initingSuccess", "processing", "onCancel"]);
1325}
1326const ObjectFilesDialog = /* @__PURE__ */ _export_sfc(_sfc_main$b, [["render", _sfc_render$b], ["__file", "ObjectFilesDialog.vue"]]);
1327const _sfc_main$a = {
1328  mixins: [mixins],
1329  components: { ObjectFilesDialog },
1330  created() {
1331    this.row = this.params.data || {};
1332  },
1333  data() {
1334    return {
1335      row: {},
1336      filesDialogOpen: false
1337    };
1338  },
1339  methods: {
1340    viewFiles() {
1341      this.filesDialogOpen = true;
1342    }
1343  }
1344};
1345function _sfc_render$a(_ctx, _cache, $props, $setup, $data, $options) {
1346  const _component_Icon = resolveComponent("Icon");
1347  const _component_ObjectFilesDialog = resolveComponent("ObjectFilesDialog");
1348  return openBlock(), createElementBlock("div", null, [
1349    $data.row.statusUrls && $data.row.statusUrls.length > 0 || $data.row.errorSummaryUrls && $data.row.errorSummaryUrls.length > 0 ? (openBlock(), createBlock(_component_Icon, {
1350      key: 0,
1351      name: "library_books",
1352      onClick: $options.viewFiles,
1353      clickable: ""
1354    }, null, 8, ["onClick"])) : createCommentVNode("", true),
1355    createVNode(_component_ObjectFilesDialog, {
1356      title: "Status Files",
1357      modelValue: $data.filesDialogOpen,
1358      "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => $data.filesDialogOpen = $event),
1359      statusFiles: $data.row.statusUrls,
1360      errorFiles: $data.row.errorSummaryUrls,
1361      onCancel: _cache[1] || (_cache[1] = ($event) => $data.filesDialogOpen = false),
1362      onClose: _cache[2] || (_cache[2] = ($event) => $data.filesDialogOpen = false)
1363    }, null, 8, ["modelValue", "statusFiles", "errorFiles"])
1364  ]);
1365}
1366const TaskRunDetailAction = /* @__PURE__ */ _export_sfc(_sfc_main$a, [["render", _sfc_render$a], ["__file", "TaskRunDetailAction.vue"]]);
1367const _sfc_main$9 = {
1368  props: {
1369    params: Object
1370  },
1371  components: { SyncStatus },
1372  methods: {
1373    show(data) {
1374      if (data) return true;
1375      return false;
1376    }
1377  }
1378};
1379const _hoisted_1$3 = {
1380  key: 0,
1381  style: { "margin-top": "2px" }
1382};
1383function _sfc_render$9(_ctx, _cache, $props, $setup, $data, $options) {
1384  const _component_SyncStatus = resolveComponent("SyncStatus");
1385  return $options.show($props.params && $props.params.data && $props.params.data.status) ? (openBlock(), createElementBlock("div", _hoisted_1$3, [
1386    createVNode(_component_SyncStatus, {
1387      status: $props.params.data.status,
1388      runStatus: $props.params.data.runStatus,
1389      size: "xs",
1390      style: { "height": "22px !important" }
1391    }, null, 8, ["status", "runStatus"])
1392  ])) : createCommentVNode("", true);
1393}
1394const TreeGridStatusRenderer = /* @__PURE__ */ _export_sfc(_sfc_main$9, [["render", _sfc_render$9], ["__file", "TreeGridStatusRenderer.vue"]]);
1395const _sfc_main$8 = {
1396  mixins: [mixins],
1397  props: {
1398    title: String,
1399    errorMessage: String,
1400    modelValue: Boolean
1401  },
1402  emits: ["ok", "update:modelValue"],
1403  data() {
1404    return {};
1405  },
1406  watch: {
1407    modelValue() {
1408      if (!this.modelValue) {
1409        return;
1410      }
1411      this.initingSuccess = true;
1412    }
1413  },
1414  methods: {
1415    valueLabels() {
1416      return valueLabels;
1417    },
1418    copyMessage() {
1419      notifyInfo("Copied!");
1420    },
1421    close() {
1422      this.$emit("update:modelValue", false);
1423    }
1424  }
1425};
1426function _sfc_render$8(_ctx, _cache, $props, $setup, $data, $options) {
1427  const _component_Para = resolveComponent("Para");
1428  const _component_Button = resolveComponent("Button");
1429  const _component_ContentDialog = resolveComponent("ContentDialog");
1430  const _directive_clipboard = resolveDirective("clipboard");
1431  return openBlock(), createBlock(_component_ContentDialog, {
1432    title: `${$props.title || "Message"}`,
1433    modelValue: $props.modelValue,
1434    "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.$emit("update:modelValue")),
1435    message: _ctx.message,
1436    messageType: _ctx.messageType,
1437    initing: _ctx.initing,
1438    initingSuccess: _ctx.initingSuccess,
1439    processing: _ctx.processing,
1440    processingCancellable: _ctx.processingCancellable,
1441    height: "auto",
1442    width: "1200px",
1443    closeMode: "",
1444    persistent: false
1445  }, {
1446    "buttons-right": withCtx(() => [
1447      withDirectives((openBlock(), createBlock(_component_Button, {
1448        onClick: $options.copyMessage,
1449        outline: "",
1450        fullWidth: _ctx.$q.screen.xs
1451      }, {
1452        default: withCtx(() => [..._cache[1] || (_cache[1] = [
1453          createTextVNode("Copy", -1)
1454        ])]),
1455        _: 1
1456      }, 8, ["onClick", "fullWidth"])), [
1457        [_directive_clipboard, $props.errorMessage, "copy"]
1458      ]),
1459      createVNode(_component_Button, {
1460        onClick: $options.close,
1461        fullWidth: _ctx.$q.screen.xs
1462      }, {
1463        default: withCtx(() => [..._cache[2] || (_cache[2] = [
1464          createTextVNode("Close", -1)
1465        ])]),
1466        _: 1
1467      }, 8, ["onClick", "fullWidth"])
1468    ]),
1469    default: withCtx(() => [
1470      createVNode(_component_Para, { class: "message text-body1" }, {
1471        default: withCtx(() => [
1472          createTextVNode(toDisplayString($props.errorMessage), 1)
1473        ]),
1474        _: 1
1475      })
1476    ]),
1477    _: 1
1478  }, 8, ["title", "modelValue", "message", "messageType", "initing", "initingSuccess", "processing", "processingCancellable"]);
1479}
1480const ViewMessageDialog = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["render", _sfc_render$8], ["__file", "ViewMessageDialog.vue"]]);
1481const Message$1 = "Message";
1482const _sfc_main$7 = /* @__PURE__ */ defineComponent({
1483  __name: "AgGridTreeData",
1484  props: {
1485    data: {},
1486    rowHeight: { default: 35 }
1487  },
1488  setup(__props, { expose: __expose }) {
1489    initAgLicense();
1490    const props = __props;
1491    const columns = [
1492      { headerName: "#", field: "num", width: 50, align: "center", pinned: true, filter: false, floatingFilter: false },
1493      {
1494        headerName: "Actions",
1495        field: "actions",
1496        cellRenderer: TaskRunDetailAction,
1497        width: 50,
1498        pinned: "left",
1499        filter: false,
1500        floatingFilter: false
1501      },
1502      {
1503        headerName: "Status",
1504        field: "status",
1505        width: 150,
1506        cellRenderer: TreeGridStatusRenderer,
1507        cellRendererParams: (params) => {
1508          return { params: params.data };
1509        }
1510      },
1511      { headerName: "Type", field: "hierarchyType", width: 100 },
1512      { headerName: "Level", field: "recordLevel", width: 100, align: "center" },
1513      { headerName: "Copy Order", field: "order", width: 140, align: "center" },
1514      { headerName: "Error Type", field: "errorTypes", width: 140, align: "center" },
1515      { headerName: "Total", field: "total", width: 90, align: "center" },
1516      { headerName: "Errors", field: "errors", width: 90, align: "center" },
1517      { headerName: "Inserts", field: "inserts", width: 90, align: "center" },
1518      { headerName: "Updates", field: "updates", width: 90, align: "center" },
1519      { headerName: "Skipped", field: "skipped", width: 90, align: "center" },
1520      { headerName: "Cumulative Total", field: "totalRollup", width: 160 },
1521      { headerName: "Duration", field: "duration", width: 120, align: "center" },
1522      { headerName: "Duration Rollup", field: "durationRollup", width: 150 },
1523      { headerName: "Message", field: "message" }
1524      // {headerName: 'Details', field: 'details'},
1525    ];
1526    const gridApi = ref();
1527    const defaultColDef = ref({
1528      resizable: true,
1529      filter: true,
1530      floatingFilter: true
1531    });
1532    const autoGroupColumnDef = ref();
1533    const groupDefaultExpanded = ref();
1534    const getRowId = ref();
1535    const rowData = ref();
1536    const autoSizeStrategy = ref();
1537    const viewErrorMessageDialogOpen = ref(false);
1538    const viewErrorMessageDialogData = ref("");
1539    onBeforeMount(() => {
1540      autoGroupColumnDef.value = {
1541        headerName: "Object",
1542        width: 400,
1543        cellRendererParams: {
1544          suppressCount: true
1545        }
1546      };
1547      groupDefaultExpanded.value = -1;
1548      getRowId.value = (params) => params.data.id;
1549      rowData.value = processData(props.data);
1550      autoSizeStrategy.value = { type: "fitGridWidth" };
1551    });
1552    watch(
1553      () => props.data,
1554      (data) => refresh(data),
1555      { deep: true }
1556    );
1557    function getDataPath(data) {
1558      return data.dataPath;
1559    }
1560    function onGridReady(params) {
1561      gridApi.value = params.api;
1562    }
1563    function refresh(data = props.data) {
1564      rowData.value = processData(data);
1565      if (gridApi.value) {
1566        gridApi.value.setRowData(rowData.value);
1567      }
1568    }
1569    function processData(data) {
1570      const flattenedData = [];
1571      const flattenRowRecursive = (row, parentPath) => {
1572        const dataPath = [...parentPath, row.name];
1573        flattenedData.push({ ...row, dataPath });
1574        if (row.children) {
1575          row.children.forEach((child) => flattenRowRecursive(child, dataPath));
1576        }
1577      };
1578      data.forEach((row) => flattenRowRecursive(row, []));
1579      return flattenedData;
1580    }
1581    function cellClickHandle(event) {
1582      if (event.colDef.headerName === Message$1 && event.data.message) {
1583        viewErrorMessageDialogData.value = event.data.details;
1584        viewErrorMessageDialogOpen.value = true;
1585      }
1586    }
1587    __expose({ refresh });
1588    const __returned__ = { props, columns, gridApi, defaultColDef, autoGroupColumnDef, groupDefaultExpanded, getRowId, rowData, autoSizeStrategy, viewErrorMessageDialogOpen, viewErrorMessageDialogData, Message: Message$1, getDataPath, onGridReady, refresh, processData, cellClickHandle, get AgGridVue() {
1589      return AgGridVue;
1590    }, ViewMessageDialog };
1591    Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
1592    return __returned__;
1593  }
1594});
1595const _hoisted_1$2 = { style: { "height": "70vh" } };
1596function _sfc_render$7(_ctx, _cache, $props, $setup, $data, $options) {
1597  return openBlock(), createElementBlock("div", _hoisted_1$2, [
1598    createVNode($setup["AgGridVue"], {
1599      class: "ag-theme-balham",
1600      style: { "width": "100%", "height": "100%" },
1601      columnDefs: $setup.columns,
1602      onGridReady: $setup.onGridReady,
1603      defaultColDef: $setup.defaultColDef,
1604      treeData: true,
1605      groupDefaultExpanded: $setup.groupDefaultExpanded,
1606      getDataPath: $setup.getDataPath,
1607      getRowId: $setup.getRowId,
1608      rowData: $setup.rowData,
1609      rowHeight: $props.rowHeight,
1610      autoGroupColumnDef: $setup.autoGroupColumnDef,
1611      autoSizeStrategy: $setup.autoSizeStrategy,
1612      onCellClicked: $setup.cellClickHandle,
1613      suppressContextMenu: true
1614    }, null, 8, ["defaultColDef", "groupDefaultExpanded", "getRowId", "rowData", "rowHeight", "autoGroupColumnDef", "autoSizeStrategy"]),
1615    createVNode($setup["ViewMessageDialog"], {
1616      modelValue: $setup.viewErrorMessageDialogOpen,
1617      "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => $setup.viewErrorMessageDialogOpen = $event),
1618      errorMessage: $setup.viewErrorMessageDialogData,
1619      title: "Details"
1620    }, null, 8, ["modelValue", "errorMessage"])
1621  ]);
1622}
1623const AgGridTreeData = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["render", _sfc_render$7], ["__file", "AgGridTreeData.vue"]]);
1624const iconSuccess = '<i aria-hidden="true" role="presentation" class="q-pb-xs material-icons q-icon notranslate text-positive r-icon size-xs" style="font-size: 18px;">check_circle</i>';
1625const iconError = '<i aria-hidden="true" role="presentation" class="q-pb-xs material-icons q-icon notranslate text-negative r-icon size-xs" style="font-size: 18px;">error</i>';
1626const iconWarn = '<i aria-hidden="true" role="presentation" class="q-pb-xs material-icons q-icon notranslate text-warning r-icon size-xs" style="font-size: 18px;">warning</i>';
1627const iconProcessing = '<i aria-hidden="true" role="presentation" class="q-pb-xs material-icons q-icon notranslate text-blue-9 r-icon size-xs" style="font-size: 18px;">swap_vertical_circle</i>';
1628const icons = {
1629  completed: iconSuccess,
1630  error: iconError,
1631  completedWithErrors: iconWarn,
1632  processing: iconProcessing
1633};
1634function getTitle$1(task) {
1635  return `Data Copy Task Details - ${valueLabels.status[task.status]}`;
1636}
1637let rowNumCount = 0;
1638const _sfc_main$6 = {
1639  mixins: [mixins],
1640  components: {
1641    AgGridTreeData,
1642    DataCopyObjectsSummaryDialog
1643  },
1644  props: {
1645    modelValue: Boolean,
1646    jobId: String,
1647    task: Object,
1648    run: Object
1649  },
1650  emits: ["cancel", "update:modelValue"],
1651  data() {
1652    return {
1653      irun: this.run,
1654      itask: this.task,
1655      dataSource: [],
1656      title: getTitle$1(this.task),
1657      currentTab: "hierarchy",
1658      objectsSummaryDialogModel: {},
1659      columns: [
1660        { title: "Object", key: "name", width: 500 },
1661        { title: "Status", key: "status", width: 150 },
1662        { title: "Type", key: "hierarchyType", width: 100 },
1663        { title: "Level", key: "recordLevel", width: 80, align: "center" },
1664        { title: "Copy Order", key: "order", width: 120, align: "center" },
1665        { title: "Error Type", key: "errorTypes", width: 120, align: "center" },
1666        { title: "Total", key: "total", width: 80, align: "center" },
1667        { title: "Errors", key: "errors", width: 80, align: "center" },
1668        { title: "Inserts", key: "inserts", width: 80, align: "center" },
1669        { title: "Updates", key: "updates", width: 80, align: "center" },
1670        { title: "Skipped", key: "skipped", width: 80, align: "center" },
1671        { title: "Total Rollup", key: "totalRollup", width: 125 },
1672        { title: "Duration", key: "duration", width: 100, align: "center" },
1673        { title: "Duration Rollup", key: "durationRollup", width: 120 },
1674        { title: "Message", key: "message" }
1675      ]
1676    };
1677  },
1678  watch: {
1679    async modelValue() {
1680      if (!this.modelValue) {
1681        return;
1682      }
1683      this.objToBeExpanded = [];
1684      this.currentTab = "hierarchy";
1685      this.dataSource = this.getRows();
1686      this.initingSuccess = true;
1687    }
1688  },
1689  methods: {
1690    getRecords() {
1691      return [];
1692    },
1693    getRows() {
1694      var _a, _b, _c;
1695      this.objectsSummaryDialogModel = (_b = (_a = this.itask.target) == null ? void 0 : _a.runProps) == null ? void 0 : _b.sfdcDataCopy;
1696      const objTree = ((_c = this.objectsSummaryDialogModel) == null ? void 0 : _c.objectsTree) || [];
1697      rowNumCount = 0;
1698      return sortIc(objTree.map(this.processRow), "name");
1699    },
1700    rollUpStats(row) {
1701      let totalRollup = row.total || 0;
1702      if (row.children) {
1703        row.children.forEach((it) => {
1704          this.rollUpStats(it);
1705          totalRollup += it.totalRollup;
1706        });
1707      }
1708      row.totalRollup = totalRollup;
1709    },
1710    processRow(rec, level) {
1711      level = level || 0;
1712      const row = {
1713        num: rowNumCount++,
1714        recordLevel: level,
1715        action: "",
1716        // id: rec.id,
1717        id: generateId2("sobj"),
1718        name: rec.relationshipName ? `${rec.relationshipName} (${rec.name})` : rec.name,
1719        status: rec.runStatus,
1720        statusIcon: `${icons[rec.runStatus] || ""} ${valueLabels.status[rec.runStatus]}`,
1721        duration: jsUtilsExports.toHumanElapsedTime(rec.duration || 0),
1722        durationRollup: jsUtilsExports.toHumanElapsedTime(rec.durationRollup || 0),
1723        total: rec.stats && rec.stats.total,
1724        done: rec.stats && rec.stats.done,
1725        success: rec.stats && rec.stats.success,
1726        inserts: rec.stats && rec.stats.inserts,
1727        updates: rec.stats && rec.stats.updates,
1728        errors: rec.stats && rec.stats.errors,
1729        skipped: rec.stats && rec.stats.skipped,
1730        message: rec.message,
1731        details: rec.details,
1732        statusUrls: rec.statusUrls,
1733        errorSummaryUrls: rec.errorSummaryUrls,
1734        stats: rec.stats,
1735        order: rec.order,
1736        errorTypes: (rec.errorTypes || []).join(", "),
1737        hierarchyType: valueLabels.hierarchyTypes[rec.hierarchyType],
1738        run: this.irun,
1739        children: []
1740      };
1741      if (rec.parents && rec.parents.length > 0) {
1742        const children = {
1743          action: "",
1744          id: generateId2("sobj"),
1745          children: sortIc(
1746            rec.parents.filter((it) => {
1747              var _a;
1748              return ((_a = it.stats) == null ? void 0 : _a.total) > 0 || it.runStatus && it.runStatus !== "completed";
1749            }).map((it) => this.processRow(it, level + 1)),
1750            "name"
1751          )
1752        };
1753        children.name = `Parents (${children.children.length})`;
1754        if (children.children.length > 0) {
1755          row.children.push(children);
1756        }
1757      }
1758      if (rec.children && rec.children.length > 0) {
1759        const children = {
1760          action: "",
1761          id: generateId2("sobj"),
1762          children: sortIc(
1763            rec.children.filter((it) => {
1764              var _a;
1765              return ((_a = it.stats) == null ? void 0 : _a.total) > 0 || it.runStatus && it.runStatus !== "completed";
1766            }).map((it) => this.processRow(it, level + 1)),
1767            "name"
1768          )
1769        };
1770        children.name = `Children (${children.children.length})`;
1771        if (children.children.length > 0) {
1772          row.children.push(children);
1773        }
1774      }
1775      this.rollUpStats(row);
1776      return row;
1777    },
1778    close() {
1779      this.$emit("cancel");
1780    },
1781    refresh() {
1782      this.process(async () => {
1783        this.irun = await getRun(this.run.id);
1784        this.itask = this.irun.tasks.find((it) => it.id === this.task.id);
1785        this.dataSource = this.getRows();
1786        this.title = getTitle$1(this.itask);
1787        this.$nextTick(() => {
1788          var _a, _b;
1789          (_a = this.$refs.hierarchyGrid) == null ? void 0 : _a.refresh(this.dataSource);
1790          (_b = this.$refs.summaryGrid) == null ? void 0 : _b.refresh();
1791        });
1792      });
1793    }
1794  }
1795};
1796const _hoisted_1$1 = { class: "row items-center no-wrap q-pb-xs" };
1797function _sfc_render$6(_ctx, _cache, $props, $setup, $data, $options) {
1798  const _component_Icon = resolveComponent("Icon");
1799  const _component_AgGridTreeData = resolveComponent("AgGridTreeData");
1800  const _component_DataCopyObjectsSummaryDialog = resolveComponent("DataCopyObjectsSummaryDialog");
1801  const _component_ContentDialog = resolveComponent("ContentDialog");
1802  return openBlock(), createBlock(_component_ContentDialog, {
1803    title: $data.title,
1804    modelValue: $props.modelValue,
1805    "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => _ctx.$emit("update:modelValue", $event)),
1806    initing: _ctx.initing,
1807    initingSuccess: _ctx.initingSuccess,
1808    processing: _ctx.processing,
1809    height: "auto",
1810    width: "90vw",
1811    closeMode: "",
1812    persistent: false
1813  }, {
1814    default: withCtx(() => [
1815      _ctx.initingSuccess ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
1816        createBaseVNode("div", _hoisted_1$1, [
1817          createVNode(_component_Icon, {
1818            name: "refresh",
1819            onClick: _cache[0] || (_cache[0] = ($event) => $options.refresh()),
1820            clickable: ""
1821          }),
1822          createVNode(QTabs, {
1823            modelValue: $data.currentTab,
1824            "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => $data.currentTab = $event),
1825            align: "left",
1826            dense: "",
1827            "no-caps": "",
1828            "indicator-color": "primary",
1829            class: "col q-ml-sm"
1830          }, {
1831            default: withCtx(() => [
1832              createVNode(QTab, {
1833                name: "hierarchy",
1834                label: "Objects Hierarchy"
1835              }),
1836              createVNode(QTab, {
1837                name: "summary",
1838                label: "Objects Summary"
1839              })
1840            ]),
1841            _: 1
1842          }, 8, ["modelValue"])
1843        ]),
1844        createVNode(QTabPanels, {
1845          modelValue: $data.currentTab,
1846          "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => $data.currentTab = $event),
1847          "keep-alive": ""
1848        }, {
1849          default: withCtx(() => [
1850            createVNode(QTabPanel, { name: "hierarchy" }, {
1851              default: withCtx(() => [
1852                createVNode(_component_AgGridTreeData, {
1853                  ref: "hierarchyGrid",
1854                  data: $data.dataSource,
1855                  columns: $data.columns
1856                }, null, 8, ["data", "columns"])
1857              ]),
1858              _: 1
1859            }),
1860            createVNode(QTabPanel, { name: "summary" }, {
1861              default: withCtx(() => [
1862                createVNode(_component_DataCopyObjectsSummaryDialog, {
1863                  ref: "summaryGrid",
1864                  model: $data.objectsSummaryDialogModel,
1865                  jobId: $props.jobId,
1866                  runId: $props.run.id
1867                }, null, 8, ["model", "jobId", "runId"])
1868              ]),
1869              _: 1
1870            })
1871          ]),
1872          _: 1
1873        }, 8, ["modelValue"])
1874      ], 64)) : createCommentVNode("", true)
1875    ]),
1876    _: 1
1877  }, 8, ["title", "modelValue", "initing", "initingSuccess", "processing"]);
1878}
1879const SfdcDataCopyTaskRunDetailsDialog = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["render", _sfc_render$6], ["__file", "SfdcDataCopyTaskRunDetailsDialog.vue"]]);
1880const _sfc_main$5 = {
1881  mixins: [mixins],
1882  components: {
1883    StatusFileViewer,
1884    FileViewerDialog2
1885  },
1886  props: {
1887    title: String,
1888    modelValue: Boolean,
1889    statusFiles: Array
1890  },
1891  data() {
1892    return {
1893      columns: [
1894        {
1895          name: "actions",
1896          align: "left"
1897        },
1898        { name: "ObjectName", field: "objectName", label: "Task", sortable: true, align: "left" },
1899        { name: "fileName", field: "fileName", label: "File Name", sortable: true, align: "left" },
1900        { name: "fileSize", field: "fileSizeFormatted", label: "File Size", sortable: true, align: "left" }
1901      ],
1902      pagination: {
1903        page: 1,
1904        rowsPerPage: 0
1905      },
1906      viewerDialogTitle: "",
1907      viewerDialogOpen: false,
1908      statusFileViewerDialogOpen: false,
1909      viewerDialogModel: {}
1910    };
1911  },
1912  created() {
1913    this.initingSuccess = true;
1914  },
1915  emits: ["cancel", "update:modelValue"],
1916  watch: {
1917    modelValue() {
1918      if (!this.modelValue) {
1919        return;
1920      }
1921    }
1922  },
1923  methods: {
1924    close() {
1925      this.$emit("cancel");
1926    },
1927    viewStatusFile(fileInfo) {
1928      this.handleViewFile("Status File: " + fileInfo.fileName, fileInfo);
1929    },
1930    async getOpenableUrl(fileInfo) {
1931      if (fileInfo.openableUrl) {
1932        return fileInfo.openableUrl;
1933      }
1934      const resp = await this.processForm(
1935        () => openFile({
1936          runId: fileInfo.runId,
1937          jobId: this.jobId,
1938          url: fileInfo.url,
1939          location: fileInfo.location
1940        })
1941      );
1942      if (resp) {
1943        fileInfo.openableUrl = resp.url;
1944        return resp.url;
1945      }
1946    },
1947    async handleViewFile(title, fileInfo) {
1948      const url = await this.getOpenableUrl(fileInfo);
1949      if (!url) {
1950        return;
1951      }
1952      this.viewerDialogTitle = title, this.viewerDialogModel = {
1953        ...fileInfo,
1954        ...{ url }
1955      };
1956      this.statusFileViewerDialogOpen = true;
1957    },
1958    async downloadFile(fileInfo) {
1959      let url = await this.getOpenableUrl(fileInfo);
1960      if (url) {
1961        if (url.startsWith("http")) {
1962          openUrl(url);
1963        } else {
1964          window.location.href = url;
1965        }
1966      }
1967    },
1968    async copyFile(fileInfo) {
1969      let url = await this.getOpenableUrl(fileInfo);
1970      if (url) {
1971        await copyToClipboard(url);
1972      }
1973    }
1974  }
1975};
1976const _hoisted_1 = { key: 0 };
1977function _sfc_render$5(_ctx, _cache) {
1978  const _component_IconCopy = resolveComponent("IconCopy");
1979  const _component_Icon = resolveComponent("Icon");
1980  const _component_FileViewerDialog2 = resolveComponent("FileViewerDialog2");
1981  const _component_StatusFileViewer = resolveComponent("StatusFileViewer");
1982  const _component_ContentDialog = resolveComponent("ContentDialog");
1983  return openBlock(), createBlock(_component_ContentDialog, {
1984    title: _ctx.title || "Files",
1985    modelValue: _ctx.modelValue,
1986    "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => _ctx.$emit("update:modelValue")),
1987    message: _ctx.message,
1988    messageType: _ctx.messageType,
1989    initing: _ctx.initing,
1990    initingSuccess: _ctx.initingSuccess,
1991    processing: _ctx.processing,
1992    height: "auto",
1993    width: "900px",
1994    defaultButton: false,
1995    persistent: false
1996  }, {
1997    default: withCtx(() => [
1998      _ctx.statusFiles.length > 0 ? (openBlock(), createElementBlock("div", _hoisted_1, [
1999        _cache[4] || (_cache[4] = createBaseVNode("span", { class: "" }, "Status Files", -1)),
2000        createVNode(QTable, {
2001          data: _ctx.statusFiles,
2002          columns: _ctx.columns,
2003          "row-key": "id",
2004          "hide-pagination": true,
2005          "rows-per-page-options": [0],
2006          pagination: _ctx.pagination,
2007          "onUpdate:pagination": _cache[0] || (_cache[0] = ($event) => _ctx.pagination = $event)
2008        }, {
2009          "body-cell-actions": withCtx((props) => [
2010            createVNode(QTd, null, {
2011              default: withCtx(() => [
2012                createVNode(_component_IconCopy, {
2013                  content: props.row.url,
2014                  tooltip: "Copy url to Clipboard"
2015                }, null, 8, ["content"]),
2016                createVNode(_component_Icon, {
2017                  name: "cloud_download",
2018                  onClick: ($event) => _ctx.downloadFile(props.row),
2019                  clickable: "",
2020                  tooltip: "Download File"
2021                }, null, 8, ["onClick"]),
2022                props.row.canView ? (openBlock(), createBlock(_component_Icon, {
2023                  key: 0,
2024                  name: "visibility",
2025                  onClick: ($event) => _ctx.viewStatusFile(props.row),
2026                  clickable: "",
2027                  tooltip: "View File"
2028                }, null, 8, ["onClick"])) : createCommentVNode("", true)
2029              ]),
2030              _: 2
2031            }, 1024)
2032          ]),
2033          _: 1
2034        }, 8, ["data", "columns", "pagination"])
2035      ])) : createCommentVNode("", true),
2036      createVNode(_component_FileViewerDialog2, {
2037        modelValue: _ctx.viewerDialogOpen,
2038        "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => _ctx.viewerDialogOpen = $event),
2039        title: _ctx.viewerDialogTitle,
2040        fileInfo: _ctx.viewerDialogModel
2041      }, null, 8, ["modelValue", "title", "fileInfo"]),
2042      createVNode(_component_StatusFileViewer, {
2043        modelValue: _ctx.statusFileViewerDialogOpen,
2044        "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => _ctx.statusFileViewerDialogOpen = $event),
2045        title: _ctx.viewerDialogTitle,
2046        fileInfo: _ctx.viewerDialogModel
2047      }, null, 8, ["modelValue", "title", "fileInfo"])
2048    ]),
2049    _: 1
2050  }, 8, ["title", "modelValue", "message", "messageType", "initing", "initingSuccess", "processing"]);
2051}
2052const FilesDialog = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["render", _sfc_render$5], ["__file", "FilesDialog.vue"]]);
2053const _sfc_main$4 = {
2054  mixins: [mixins],
2055  props: {
2056    run: Object
2057  },
2058  data() {
2059    return {
2060      statusFiles: [],
2061      filesDialogOpen: false
2062    };
2063  },
2064  components: {
2065    FilesDialog
2066  },
2067  created() {
2068    this.object = this.params.data;
2069    this.statusFiles = getObjectFiles({ id: this.object.runId }, this.object);
2070  },
2071  methods: {
2072    viewFiles() {
2073      this.filesDialogOpen = true;
2074    }
2075  }
2076};
2077function _sfc_render$4(_ctx, _cache, $props, $setup, $data, $options) {
2078  const _component_Icon = resolveComponent("Icon");
2079  const _component_FilesDialog = resolveComponent("FilesDialog");
2080  return openBlock(), createElementBlock("div", null, [
2081    $data.statusFiles.length > 0 ? (openBlock(), createBlock(_component_Icon, {
2082      key: 0,
2083      name: "library_books",
2084      onClick: $options.viewFiles,
2085      clickable: "",
2086      tooltip: "View status File"
2087    }, null, 8, ["onClick"])) : createCommentVNode("", true),
2088    createVNode(_component_FilesDialog, {
2089      title: "Object Files",
2090      modelValue: $data.filesDialogOpen,
2091      "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => $data.filesDialogOpen = $event),
2092      statusFiles: $data.statusFiles
2093    }, null, 8, ["modelValue", "statusFiles"])
2094  ]);
2095}
2096const SfdcDataMaskRunActions = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["render", _sfc_render$4], ["__file", "SfdcDataMaskRunActions.vue"]]);
2097function getTitle(task) {
2098  return `Data Mask Run Details - ${valueLabels.status[task.status]}`;
2099}
2100const _sfc_main$3 = {
2101  mixins: [mixins],
2102  components: { Datagrid },
2103  props: {
2104    modelValue: Boolean,
2105    jobId: String,
2106    task: Object,
2107    run: Object
2108  },
2109  data() {
2110    return {
2111      irun: this.run,
2112      itask: this.task,
2113      title: getTitle(this.task),
2114      columns: [
2115        {
2116          headerName: "Actions",
2117          field: "actions",
2118          cellRendererFramework: SfdcDataMaskRunActions,
2119          width: 95,
2120          pinned: "left"
2121        },
2122        { field: "name" },
2123        { field: "status" },
2124        { field: "maskStartAt", headerName: "Masked Till", type: "datetime" },
2125        { field: "startAt", type: "datetime" },
2126        {
2127          headerName: "Duration",
2128          valueGetter: (row) => getRunDuration(row.data),
2129          width: 125
2130        },
2131        {
2132          headerName: "Total",
2133          valueGetter: (row) => row.data.stats && row.data.stats.total,
2134          width: 100,
2135          type: "int"
2136        },
2137        {
2138          headerName: "Success",
2139          valueGetter: (row) => row.data.stats && row.data.stats.success,
2140          width: 120,
2141          type: "int"
2142        },
2143        {
2144          headerName: "Skipped",
2145          valueGetter: (row) => row.data.stats && row.data.stats.skipped,
2146          width: 100,
2147          type: "int"
2148        },
2149        {
2150          headerName: "Errors",
2151          valueGetter: (row) => row.data.stats && row.data.stats.errors,
2152          width: 100,
2153          type: "int"
2154        },
2155        { field: "message" }
2156      ]
2157    };
2158  },
2159  emits: ["cancel", "update:modelValue"],
2160  watch: {
2161    async modelValue() {
2162      if (!this.modelValue) {
2163        return;
2164      }
2165      this.initingSuccess = true;
2166      this.initRecords();
2167    }
2168  },
2169  methods: {
2170    getRows() {
2171      return jsUtilsExports.deepClone(this.dataSource);
2172    },
2173    close() {
2174      this.$emit("cancel");
2175    },
2176    refresh() {
2177      this.process(async () => {
2178        this.irun = await getRun(this.run.id);
2179        this.itask = this.irun.tasks.find((it) => it.id === this.task.id);
2180        this.title = getTitle(this.itask);
2181        this.initRecords();
2182        this.$refs.grid.refresh();
2183      });
2184    },
2185    initRecords() {
2186      var _a, _b;
2187      const recs = ((_b = (_a = this.itask.target) == null ? void 0 : _a.runProps) == null ? void 0 : _b.sfdcDataMask.sobjects) || [];
2188      this.dataSource = sortIc(recs, "name");
2189    }
2190  }
2191};
2192function _sfc_render$3(_ctx, _cache, $props, $setup, $data, $options) {
2193  const _component_Datagrid = resolveComponent("Datagrid");
2194  const _component_ContentDialog = resolveComponent("ContentDialog");
2195  return openBlock(), createBlock(_component_ContentDialog, {
2196    title: $data.title,
2197    modelValue: $props.modelValue,
2198    "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.$emit("update:modelValue")),
2199    initing: _ctx.initing,
2200    initingSuccess: _ctx.initingSuccess,
2201    processing: _ctx.processing,
2202    height: "auto",
2203    width: "90vw",
2204    closeMode: "",
2205    persistent: false
2206  }, {
2207    default: withCtx(() => [
2208      _ctx.initingSuccess ? (openBlock(), createBlock(_component_Datagrid, {
2209        key: 0,
2210        ref: "grid",
2211        columns: $data.columns,
2212        records: $options.getRows,
2213        creatable: false,
2214        updatable: false,
2215        deletable: false,
2216        actionsColumn: false,
2217        selectionColumn: false,
2218        externalRefresh: true,
2219        onRefresh: $options.refresh
2220      }, null, 8, ["columns", "records", "onRefresh"])) : createCommentVNode("", true)
2221    ]),
2222    _: 1
2223  }, 8, ["title", "modelValue", "initing", "initingSuccess", "processing"]);
2224}
2225const SfdcDataMaskTaskRunDetailsDialog = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["render", _sfc_render$3], ["__file", "SfdcDataMaskTaskRunDetailsDialog.vue"]]);
2226const _sfc_main$2 = {
2227  mixins: [mixins],
2228  components: {
2229    TaskDialog,
2230    TaskFilesDialog,
2231    SfdcDataCopyTaskRunDetailsDialog,
2232    SfdcDataMaskTaskRunDetailsDialog
2233  },
2234  props: {
2235    run: Object
2236  },
2237  data() {
2238    return {
2239      filesDialogOpen: false,
2240      task: {},
2241      irun: {},
2242      taskFiles: [],
2243      errorFiles: [],
2244      taskDialogOpen: false,
2245      taskId: "",
2246      jobId: "",
2247      objectsTree: [],
2248      sfdcDataCopyDialogOpen: false,
2249      sfdcDataMaskDialogOpen: false
2250    };
2251  },
2252  created() {
2253    var _a;
2254    const row = this.params.data || {};
2255    this.task = (((_a = this.run) == null ? void 0 : _a.tasks) || []).find((it) => it.id === row.id || it.taskId === row.taskId) || row;
2256    this.taskId = this.task.id;
2257    this.jobId = this.task.jobId;
2258    this.irun = { id: this.task.runId };
2259    this.taskFiles = getTaskFiles(this.irun, this.task);
2260    this.errorFiles = this.task.errorSummaryUrls || [];
2261  },
2262  methods: {
2263    viewFiles() {
2264      this.filesDialogOpen = true;
2265    },
2266    // viewSfdcDataCopyDetails() {
2267    //   const objTree = this.task.target?.runProps?.sfdcDataCopy?.objectsTree;
2268    //   if (objTree) {
2269    //     this.objectsTree = objTree;
2270    //     this.taskRunInfoDailogOpen = true;
2271    //   }
2272    // },
2273    isShowSfdcDataCopy() {
2274      var _a, _b, _c, _d, _e;
2275      return ((_a = this.task) == null ? void 0 : _a.type) === "sfdcDataCopy" && ((_e = (_d = (_c = (_b = this.task) == null ? void 0 : _b.target) == null ? void 0 : _c.runProps) == null ? void 0 : _d.sfdcDataCopy) == null ? void 0 : _e.objectsTree);
2276    },
2277    isShowSfdcDataMask() {
2278      var _a, _b, _c, _d, _e;
2279      return ((_a = this.task) == null ? void 0 : _a.type) === "sfdcDataMask" && ((_e = (_d = (_c = (_b = this.task) == null ? void 0 : _b.target) == null ? void 0 : _c.runProps) == null ? void 0 : _d.sfdcDataMask) == null ? void 0 : _e.sobjects);
2280    }
2281  }
2282};
2283function _sfc_render$2(_ctx, _cache, $props, $setup, $data, $options) {
2284  const _component_Icon = resolveComponent("Icon");
2285  const _component_TaskFilesDialog = resolveComponent("TaskFilesDialog");
2286  const _component_TaskDialog = resolveComponent("TaskDialog");
2287  const _component_SfdcDataCopyTaskRunDetailsDialog = resolveComponent("SfdcDataCopyTaskRunDetailsDialog");
2288  const _component_SfdcDataMaskTaskRunDetailsDialog = resolveComponent("SfdcDataMaskTaskRunDetailsDialog");
2289  return openBlock(), createElementBlock("div", null, [
2290    $data.taskFiles.length > 0 || $data.errorFiles.length > 0 ? (openBlock(), createBlock(_component_Icon, {
2291      key: 0,
2292      name: "library_books",
2293      onClick: $options.viewFiles,
2294      clickable: "",
2295      tooltip: "View Files"
2296    }, null, 8, ["onClick"])) : createCommentVNode("", true),
2297    $options.isShowSfdcDataCopy() ? (openBlock(), createBlock(_component_Icon, {
2298      key: 1,
2299      name: "analytics",
2300      onClick: _cache[0] || (_cache[0] = ($event) => $data.sfdcDataCopyDialogOpen = true),
2301      clickable: "",
2302      tooltip: "View Additional Info"
2303    })) : createCommentVNode("", true),
2304    $options.isShowSfdcDataMask() ? (openBlock(), createBlock(_component_Icon, {
2305      key: 2,
2306      name: "analytics",
2307      onClick: _cache[1] || (_cache[1] = ($event) => $data.sfdcDataMaskDialogOpen = true),
2308      clickable: "",
2309      tooltip: "View Additional Info"
2310    })) : createCommentVNode("", true),
2311    createVNode(_component_Icon, {
2312      name: "edit",
2313      onClick: _cache[2] || (_cache[2] = ($event) => $data.taskDialogOpen = true),
2314      clickable: "",
2315      tooltip: "Edit Task"
2316    }),
2317    createVNode(_component_TaskFilesDialog, {
2318      title: "Task Files",
2319      modelValue: $data.filesDialogOpen,
2320      "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => $data.filesDialogOpen = $event),
2321      run: $data.irun,
2322      task: $data.task,
2323      errorFiles: $data.errorFiles,
2324      onCancel: _cache[4] || (_cache[4] = ($event) => $data.filesDialogOpen = false),
2325      onClose: _cache[5] || (_cache[5] = ($event) => $data.filesDialogOpen = false)
2326    }, null, 8, ["modelValue", "run", "task", "errorFiles"]),
2327    createVNode(_component_TaskDialog, {
2328      modelValue: $data.taskDialogOpen,
2329      "onUpdate:modelValue": _cache[6] || (_cache[6] = ($event) => $data.taskDialogOpen = $event),
2330      taskId: $data.taskId,
2331      jobId: $data.jobId,
2332      mode: "edit",
2333      onCancel: _cache[7] || (_cache[7] = ($event) => $data.taskDialogOpen = false),
2334      onOk: _cache[8] || (_cache[8] = ($event) => $data.taskDialogOpen = false)
2335    }, null, 8, ["modelValue", "taskId", "jobId"]),
2336    createVNode(_component_SfdcDataCopyTaskRunDetailsDialog, {
2337      modelValue: $data.sfdcDataCopyDialogOpen,
2338      "onUpdate:modelValue": _cache[9] || (_cache[9] = ($event) => $data.sfdcDataCopyDialogOpen = $event),
2339      jobId: $data.jobId,
2340      run: $data.irun,
2341      task: $data.task
2342    }, null, 8, ["modelValue", "jobId", "run", "task"]),
2343    createVNode(_component_SfdcDataMaskTaskRunDetailsDialog, {
2344      modelValue: $data.sfdcDataMaskDialogOpen,
2345      "onUpdate:modelValue": _cache[10] || (_cache[10] = ($event) => $data.sfdcDataMaskDialogOpen = $event),
2346      jobId: $data.jobId,
2347      run: $data.irun,
2348      task: $data.task
2349    }, null, 8, ["modelValue", "jobId", "run", "task"])
2350  ]);
2351}
2352const TaskRunActions = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["render", _sfc_render$2], ["__file", "TaskRunActions.vue"]]);
2353const Message = "Message";
2354const _sfc_main$1 = {
2355  mixins: [mixins],
2356  props: {
2357    runId: String,
2358    run: Object
2359  },
2360  components: {
2361    ViewErrorMessageDialog,
2362    Datagrid
2363  },
2364  emits: ["refresh"],
2365  data() {
2366    return {
2367      taskColumns: [
2368        {
2369          headerName: "Actions",
2370          field: "actions",
2371          cellRenderer: TaskRunActions,
2372          width: 115,
2373          pinned: "left"
2374        },
2375        { field: "order", headerName: "#", width: 50 },
2376        { field: "name", width: 350 },
2377        { field: "typeInfo", headerName: "Type", valueLabels: valueLabels$1.taskTypes, width: 250 },
2378        // {field: 'typeInfo', label: 'Type', valueLabels: rtUtils.valueLabels.taskTypes, width: 150},
2379        { field: "status", width: 220 },
2380        {
2381          headerName: "Duration",
2382          valueGetter: (row) => getRunDuration(row.data),
2383          width: 100
2384        },
2385        // {
2386        //   headerName: 'Read',
2387        //   valueGetter: (row) => row.data.stats && row.data.stats.read,
2388        //   width: 100,
2389        //   type: 'int',
2390        // },
2391        {
2392          headerName: "Total",
2393          valueGetter: (row) => row.data.stats && row.data.stats.total,
2394          width: 100,
2395          type: "int"
2396        },
2397        {
2398          headerName: "Inserts",
2399          valueGetter: (row) => row.data.stats && row.data.stats.inserts,
2400          width: 100,
2401          type: "int"
2402        },
2403        {
2404          headerName: "Updates",
2405          valueGetter: (row) => row.data.stats && row.data.stats.updates,
2406          width: 100,
2407          type: "int"
2408        },
2409        {
2410          headerName: "Deletes",
2411          valueGetter: (row) => row.data.stats && row.data.stats.deletes,
2412          width: 100,
2413          type: "int"
2414        },
2415        {
2416          headerName: "Skipped",
2417          valueGetter: (row) => row.data.stats && row.data.stats.skipped,
2418          width: 100,
2419          type: "int"
2420        },
2421        {
2422          headerName: "Errors",
2423          valueGetter: (row) => row.data.stats && row.data.stats.errors,
2424          width: 100,
2425          type: "int"
2426        },
2427        { headerName: Message, field: "message", width: 400 },
2428        { headerName: "Details", field: "details", width: 400 }
2429      ],
2430      taskRecords: this.getTasks,
2431      initingSuccess: true,
2432      viewErrorMessageDialogOpen: false,
2433      viewErrorMessageDialogData: "",
2434      init: false,
2435      tasks: [],
2436      loading: false
2437    };
2438  },
2439  created() {
2440    this.tasks = this.run.tasks;
2441  },
2442  watch: {
2443    run() {
2444      this.tasks = this.run.tasks;
2445      this.refresh();
2446    }
2447  },
2448  methods: {
2449    processTaskRuns(taskRuns) {
2450      let order = 1;
2451      return (taskRuns || []).map((task) => {
2452        task.order = order++;
2453        task.runId = this.runId;
2454        task.jobId = this.run.jobId;
2455        return task;
2456      });
2457    },
2458    async getTasks() {
2459      return this.processTaskRuns(this.tasks || []);
2460    },
2461    refresh() {
2462      this.$refs.grid.refresh();
2463    },
2464    async refreshTasks() {
2465      this.loading = true;
2466      const run = await getRun(this.runId);
2467      this.tasks = run.tasks;
2468      this.refresh();
2469      this.loading = false;
2470      this.$emit("refresh", run);
2471    },
2472    cellClickHandle(rec, fieldName) {
2473      if (fieldName === Message && rec.message) {
2474        this.viewErrorMessageDialogData = rec.message;
2475        this.viewErrorMessageDialogOpen = true;
2476      }
2477      if (fieldName === "Details" && rec.details) {
2478        this.viewErrorMessageDialogData = rec.details;
2479        this.viewErrorMessageDialogOpen = true;
2480      }
2481    }
2482  }
2483};
2484function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
2485  const _component_Datagrid = resolveComponent("Datagrid");
2486  const _component_ViewErrorMessageDialog = resolveComponent("ViewErrorMessageDialog");
2487  const _component_PagePart = resolveComponent("PagePart");
2488  return openBlock(), createBlock(_component_PagePart, {
2489    processing: _ctx.processing,
2490    message: _ctx.message,
2491    messageType: _ctx.messageType
2492  }, {
2493    default: withCtx(() => [
2494      createVNode(_component_Datagrid, {
2495        ref: "grid",
2496        columns: $data.taskColumns,
2497        records: $data.taskRecords,
2498        creatable: false,
2499        updatable: false,
2500        deletable: false,
2501        actionsColumn: false,
2502        selectionColumn: false,
2503        onCellClick: $options.cellClickHandle,
2504        refreshable: false,
2505        externalRefresh: "",
2506        onRefresh: _cache[0] || (_cache[0] = ($event) => $options.refreshTasks()),
2507        customLoading: $data.loading
2508      }, null, 8, ["columns", "records", "onCellClick", "customLoading"]),
2509      createVNode(_component_ViewErrorMessageDialog, {
2510        modelValue: $data.viewErrorMessageDialogOpen,
2511        "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => $data.viewErrorMessageDialogOpen = $event),
2512        errorMessage: $data.viewErrorMessageDialogData
2513      }, null, 8, ["modelValue", "errorMessage"])
2514    ]),
2515    _: 1
2516  }, 8, ["processing", "message", "messageType"]);
2517}
2518const TaskRuns = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["render", _sfc_render$1], ["__file", "TaskRuns.vue"]]);
2519const _sfc_main = {
2520  mixins: [mixins],
2521  components: {
2522    JobRunConfirmationDialog,
2523    RunDetails,
2524    RunFiles,
2525    RunFilesDialog,
2526    TaskRuns,
2527    SyncStatus
2528  },
2529  data: () => ({
2530    progressOpen: false,
2531    initingSuccess: false,
2532    model: {},
2533    details: {},
2534    jobId: "",
2535    runId: "",
2536    currentTab: "tasks",
2537    version: "",
2538    jobRunConfirmationDialogOpen: false,
2539    runLogDialogOpen: false
2540  }),
2541  created() {
2542    this.jobId = this.$route.params.jobId;
2543    this.runId = this.$route.params.runId;
2544    this.initForm(async () => {
2545      let run = await getRun(this.runId);
2546      populateRunName(run);
2547      this.model = run;
2548    });
2549  },
2550  watch: {
2551    "$route.params.runId"(newId) {
2552      this.runId = newId;
2553      this.refresh();
2554    }
2555  },
2556  methods: {
2557    getDisplayId() {
2558      return formatDateTimeForDisplay(this.model.name.split(" ")[1]);
2559    },
2560    refresh1() {
2561      this.processForm(async () => {
2562        this.job = await getJob(this.jobId);
2563        this.version = (/* @__PURE__ */ new Date()).toISOString();
2564      });
2565      this.currentTab === "tasks" ? this.$refs.tasks.refresh() : void 0;
2566    },
2567    async refresh() {
2568      await this.processForm(async () => {
2569        let run = await getRun(this.runId);
2570        populateRunName(run);
2571        this.model = run;
2572      });
2573      if (this.$refs.tasks) {
2574        await this.$refs.tasks.refreshTasks();
2575      }
2576    },
2577    handleTaskRunRefresh(run) {
2578      populateRunName(run);
2579      this.model = run;
2580    },
2581    handleViewLog() {
2582      this.runLogDialogOpen = true;
2583    },
2584    async handleViewSupportLog() {
2585      await this.processForm(async () => {
2586        var _a, _b, _c;
2587        let logUrl = (_b = (_a = this.model) == null ? void 0 : _a.runtimeInfo) == null ? void 0 : _b.logUrl;
2588        if (!logUrl) {
2589          const run = await getRun(this.runId);
2590          populateRunName(run);
2591          this.model = run;
2592          logUrl = (_c = run == null ? void 0 : run.runtimeInfo) == null ? void 0 : _c.logUrl;
2593        }
2594        if (!logUrl) {
2595          notifyError("Support log is not available for this run.");
2596          return;
2597        }
2598        window.open(logUrl, "_newtab");
2599      });
2600    },
2601    async handleDelete() {
2602      const msg = "Are you sure you want to delete the Run";
2603      const result = await confirmDelete("Delete Runs?", msg);
2604      if (result) {
2605        this.processForm(async () => {
2606          const resp = await deleteRuns(this.$route.params.jobId, { records: [{ id: this.model.id }] });
2607          naver.toRealtaskPage(`/jobs/${this.jobId}`);
2608          notifySuccess(resp.message);
2609        });
2610      }
2611    },
2612    async handleRunJob(taskIds) {
2613      await this.processForm(async () => {
2614        const resp = await executeJobs(this.getReqBody(taskIds));
2615        notifySuccess("Job has been submitted for execution");
2616        const runId = resp[0] && resp[0].runId;
2617        if (runId) {
2618          naver.toRealtaskPage(`/jobs/${this.jobId}/runs/${runId}`);
2619        }
2620      });
2621    },
2622    getReqBody(taskIds) {
2623      return { records: [{ id: this.jobId, taskIds }] };
2624    }
2625  }
2626};
2627function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
2628  const _component_Icon = resolveComponent("Icon");
2629  const _component_MenuItem = resolveComponent("MenuItem");
2630  const _component_IconMenu = resolveComponent("IconMenu");
2631  const _component_SyncStatus = resolveComponent("SyncStatus");
2632  const _component_RunDetails = resolveComponent("RunDetails");
2633  const _component_RunFiles = resolveComponent("RunFiles");
2634  const _component_TaskRuns = resolveComponent("TaskRuns");
2635  const _component_JobRunConfirmationDialog = resolveComponent("JobRunConfirmationDialog");
2636  const _component_RunFilesDialog = resolveComponent("RunFilesDialog");
2637  const _component_Page = resolveComponent("Page");
2638  return openBlock(), createBlock(_component_Page, {
2639    title: () => _ctx.model.runName,
2640    initing: _ctx.initing,
2641    initingSuccess: _ctx.initingSuccess,
2642    processing: _ctx.processing,
2643    message: _ctx.message,
2644    messageType: _ctx.messageType
2645  }, {
2646    breadcrumbs: withCtx(() => [
2647      createVNode(QBreadcrumbsEl, {
2648        label: "Home",
2649        to: "/realtask/home"
2650      }),
2651      createVNode(QBreadcrumbsEl, {
2652        label: "Jobs",
2653        to: "/realtask/jobs"
2654      }),
2655      createVNode(QBreadcrumbsEl, {
2656        label: `${(_ctx.model.jobId__r || {}).name || "Job"}`,
2657        to: `/realtask/jobs/${_ctx.model.jobId}`
2658      }, null, 8, ["label", "to"])
2659    ]),
2660    "title-suffix": withCtx(() => [
2661      createVNode(_component_Icon, {
2662        name: "refresh",
2663        onClick: $options.refresh,
2664        clickable: ""
2665      }, null, 8, ["onClick"]),
2666      createVNode(_component_Icon, {
2667        name: "play_arrow",
2668        onClick: _cache[0] || (_cache[0] = ($event) => _ctx.jobRunConfirmationDialogOpen = true),
2669        clickable: ""
2670      }),
2671      createVNode(_component_IconMenu, null, {
2672        default: withCtx(() => [
2673          createVNode(_component_MenuItem, { onClick: $options.handleViewLog }, {
2674            default: withCtx(() => [..._cache[6] || (_cache[6] = [
2675              createTextVNode("View Log", -1)
2676            ])]),
2677            _: 1
2678          }, 8, ["onClick"]),
2679          createVNode(_component_MenuItem, { onClick: $options.handleViewSupportLog }, {
2680            default: withCtx(() => [..._cache[7] || (_cache[7] = [
2681              createTextVNode("View Support Log", -1)
2682            ])]),
2683            _: 1
2684          }, 8, ["onClick"]),
2685          createVNode(_component_MenuItem, {
2686            onClick: $options.handleDelete,
2687            danger: ""
2688          }, {
2689            default: withCtx(() => [..._cache[8] || (_cache[8] = [
2690              createTextVNode("Delete", -1)
2691            ])]),
2692            _: 1
2693          }, 8, ["onClick"])
2694        ]),
2695        _: 1
2696      })
2697    ]),
2698    "title-desc": withCtx(() => [
2699      createVNode(_component_SyncStatus, {
2700        status: _ctx.model.status,
2701        size: "sm",
2702        tooltip: _ctx.model.message
2703      }, null, 8, ["status", "tooltip"])
2704    ]),
2705    default: withCtx(() => [
2706      createVNode(QTabs, {
2707        "indicator-color": "primary",
2708        align: "left",
2709        modelValue: _ctx.currentTab,
2710        "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => _ctx.currentTab = $event),
2711        dense: "",
2712        class: "",
2713        "no-caps": ""
2714      }, {
2715        default: withCtx(() => [
2716          createVNode(QTab, {
2717            name: "details",
2718            label: "Run Details"
2719          }),
2720          createVNode(QTab, {
2721            name: "files",
2722            label: "Run Files"
2723          }),
2724          createVNode(QTab, {
2725            name: "tasks",
2726            label: "Task Runs"
2727          })
2728        ]),
2729        _: 1
2730      }, 8, ["modelValue"]),
2731      createVNode(QTabPanels, {
2732        "keep-alive": "",
2733        modelValue: _ctx.currentTab,
2734        "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => _ctx.currentTab = $event)
2735      }, {
2736        default: withCtx(() => [
2737          createVNode(QTabPanel, { name: "details" }, {
2738            default: withCtx(() => [
2739              createVNode(_component_RunDetails, { model: _ctx.model }, null, 8, ["model"])
2740            ]),
2741            _: 1
2742          }),
2743          createVNode(QTabPanel, { name: "files" }, {
2744            default: withCtx(() => [
2745              createVNode(_component_RunFiles, {
2746                run: _ctx.model,
2747                jobId: _ctx.jobId
2748              }, null, 8, ["run", "jobId"])
2749            ]),
2750            _: 1
2751          }),
2752          createVNode(QTabPanel, { name: "tasks" }, {
2753            default: withCtx(() => [
2754              createVNode(_component_TaskRuns, {
2755                runId: _ctx.model.id,
2756                run: _ctx.model,
2757                ref: "tasks",
2758                onRefresh: $options.handleTaskRunRefresh
2759              }, null, 8, ["runId", "run", "onRefresh"])
2760            ]),
2761            _: 1
2762          })
2763        ]),
2764        _: 1
2765      }, 8, ["modelValue"]),
2766      createVNode(_component_JobRunConfirmationDialog, {
2767        modelValue: _ctx.jobRunConfirmationDialogOpen,
2768        "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => _ctx.jobRunConfirmationDialogOpen = $event),
2769        jobId: _ctx.jobId,
2770        onCancel: _cache[4] || (_cache[4] = ($event) => _ctx.jobRunConfirmationDialogOpen = false),
2771        onRun: $options.handleRunJob
2772      }, null, 8, ["modelValue", "jobId", "onRun"]),
2773      createVNode(_component_RunFilesDialog, {
2774        title: "Run Log",
2775        modelValue: _ctx.runLogDialogOpen,
2776        "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => _ctx.runLogDialogOpen = $event),
2777        run: _ctx.model,
2778        autoOpenFileType: "logFile"
2779      }, null, 8, ["modelValue", "run"])
2780    ]),
2781    _: 1
2782  }, 8, ["title", "initing", "initingSuccess", "processing", "message", "messageType"]);
2783}
2784const Run = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__file", "Run.vue"]]);
2785export {
2786  Run as default
2787};
2788//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUnVuLUNxQTFVVUNtLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHJvZHVjdHMvcmVhbHRhc2svcGFnZXMvcnVucy9SdW5EZXRhaWxzLnZ1ZSIsIi4uLy4uLy4uL3NyYy9wcm9kdWN0cy9yZWFsdGFzay9wYWdlcy9ydW5zL1J1bkZpbGVzLnZ1ZSIsIi4uLy4uLy4uL3NyYy9wcm9kdWN0cy9yZWFsdGFzay9wYWdlcy9ydW5zL1Rhc2tGaWxlc0RpYWxvZy52dWUiLCIuLi8uLi8uLi9zcmMvcHJvZHVjdHMvcmVhbHRhc2svcGFnZXMvcnVucy9EYXRhQ29weU9iamVjdHNTdW1tYXJ5QWN0aW9uLnZ1ZSIsIi4uLy4uLy4uL3NyYy9wcm9kdWN0cy9yZWFsdGFzay9wYWdlcy9ydW5zL0RhdGFDb3B5T2JqZWN0c1N1bW1hcnlEaWFsb2cudnVlIiwiLi4vLi4vLi4vc3JjL3Byb2R1Y3RzL3JlYWx0YXNrL3BhZ2VzL3J1bnMvT2JqZWN0RmlsZXNEaWFsb2cudnVlIiwiLi4vLi4vLi4vc3JjL3Byb2R1Y3RzL3JlYWx0YXNrL3BhZ2VzL3J1bnMvVGFza1J1bkRldGFpbEFjdGlvbi52dWUiLCIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9UcmVlR3JpZFN0YXR1c1JlbmRlcmVyLnZ1ZSIsIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL1ZpZXdNZXNzYWdlRGlhbG9nLnZ1ZSIsIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL0FnR3JpZFRyZWVEYXRhLnZ1ZSIsIi4uLy4uLy4uL3NyYy9wcm9kdWN0cy9yZWFsdGFzay9wYWdlcy9ydW5zL1NmZGNEYXRhQ29weVRhc2tSdW5EZXRhaWxzRGlhbG9nLnZ1ZSIsIi4uLy4uLy4uL3NyYy9wcm9kdWN0cy9yZWFsdGFzay9wYWdlcy9ydW5zL3NmZGNEYXRhTWFzay9GaWxlc0RpYWxvZy52dWUiLCIuLi8uLi8uLi9zcmMvcHJvZHVjdHMvcmVhbHRhc2svcGFnZXMvcnVucy9zZmRjRGF0YU1hc2svU2ZkY0RhdGFNYXNrUnVuQWN0aW9ucy52dWUiLCIuLi8uLi8uLi9zcmMvcHJvZHVjdHMvcmVhbHRhc2svcGFnZXMvcnVucy9zZmRjRGF0YU1hc2svU2ZkY0RhdGFNYXNrVGFza1J1bkRldGFpbHNEaWFsb2cudnVlIiwiLi4vLi4vLi4vc3JjL3Byb2R1Y3RzL3JlYWx0YXNrL3BhZ2VzL3J1bnMvVGFza1J1bkFjdGlvbnMudnVlIiwiLi4vLi4vLi4vc3JjL3Byb2R1Y3RzL3JlYWx0YXNrL3BhZ2VzL3J1bnMvVGFza1J1bnMudnVlIiwiLi4vLi4vLi4vc3JjL3Byb2R1Y3RzL3JlYWx0YXNrL3BhZ2VzL3J1bnMvUnVuLnZ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XG4gIDxDYXJkIG1heFdpZHRoPVwiODAwcHhcIj5cbiAgICA8Um93PlxuICAgICAgPENvbHVtbj5cbiAgICAgICAgPE91dHB1dEZpZWxkIGxhYmVsPVwiSm9iXCIgOnZhbHVlPVwibW9kZWwubmFtZSB8fCBtb2RlbC5qb2JJZFwiIC8+XG4gICAgICA8L0NvbHVtbj5cbiAgICAgIDxDb2x1bW4+XG4gICAgICAgIDxPdXRwdXRGaWVsZCBsYWJlbD1cIlN0YXR1c1wiIDp2YWx1ZT1cIm1vZGVsLnN0YXR1c1wiIDp2YWx1ZUxhYmVscz1cInZhbHVlTGFiZWxzKCkuc3RhdHVzXCIgLz5cbiAgICAgIDwvQ29sdW1uPlxuICAgIDwvUm93PlxuICAgIDxSb3c+XG4gICAgICA8Q29sdW1uPlxuICAgICAgICA8T3V0cHV0RmllbGQgbGFiZWw9XCJTdGFydCBBdFwiIDp2YWx1ZT1cIm1vZGVsLnN0YXJ0QXRcIiB0eXBlPVwiZGF0ZXRpbWVcIiAvPlxuICAgICAgPC9Db2x1bW4+XG4gICAgICA8Q29sdW1uPlxuICAgICAgICA8T3V0cHV0RmllbGQgbGFiZWw9XCJFbmQgQXRcIiA6dmFsdWU9XCJtb2RlbC5lbmRBdFwiIHR5cGU9XCJkYXRldGltZVwiIC8+XG4gICAgICA8L0NvbHVtbj5cbiAgICA8L1Jvdz5cbiAgICA8Um93PlxuICAgICAgPENvbHVtbj5cbiAgICAgICAgPE91dHB1dEZpZWxkIGxhYmVsPVwiQ29tcGxldGVkIFRhc2tzXCIgOnZhbHVlPVwiKG1vZGVsLnRhc2tzIHx8IFtdKS5maWx0ZXIoKHRhc2spID0+IHRhc2suc3RhdHVzID09PSAnY29tcGxldGVkJykubGVuZ3RoXCIgLz5cbiAgICAgIDwvQ29sdW1uPlxuICAgICAgPENvbHVtbj5cbiAgICAgICAgPE91dHB1dEZpZWxkXG4gICAgICAgICAgbGFiZWw9XCJFcnJvcmVkIFRhc2tzXCJcbiAgICAgICAgICA6dmFsdWU9XCIobW9kZWwudGFza3MgfHwgW10pLmZpbHRlcigodGFzaykgPT4gdGFzay5zdGF0dXMgPT09ICdlcnJvcicgfHwgdGFzay5zdGF0dXMgPT09ICdhYm9ydGVkJykubGVuZ3RoXCJcbiAgICAgICAgLz5cbiAgICAgIDwvQ29sdW1uPlxuICAgIDwvUm93PlxuICAgIDxSb3c+XG4gICAgICA8Q29sdW1uPlxuICAgICAgICA8T3V0cHV0RmllbGQgbGFiZWw9XCJNZXNzYWdlXCIgOnZhbHVlPVwibW9kZWwubWVzc2FnZVwiIC8+XG4gICAgICA8L0NvbHVtbj5cbiAgICA8L1Jvdz5cbiAgICA8Um93PlxuICAgICAgPENvbHVtbj5cbiAgICAgICAgPE91dHB1dEZpZWxkIGxhYmVsPVwiRG
2788V0YWlsc1wiIDp2YWx1ZT1cIm1vZGVsLmRldGFpbHNcIiAvPlxuICAgICAgPC9Db2x1bW4+XG4gICAgPC9Sb3c+XG4gIDwvQ2FyZD5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICdzcmMvc2VydmljZXMvdXRpbHMnO1xuaW1wb3J0IE91dHB1dEZpZWxkIGZyb20gJ3NyYy9jb21wb25lbnRzL091dHB1dEZpZWxkLnZ1ZSc7XG5leHBvcnQgZGVmYXVsdCB7XG4gIHByb3BzOiB7XG4gICAgbW9kZWw6IE9iamVjdCxcbiAgfSxcbiAgY29tcG9uZW50czoge091dHB1dEZpZWxkfSxcbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogJycsXG4gICAgfTtcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgdmFsdWVMYWJlbHMoKSB7XG4gICAgICByZXR1cm4gdXRpbHMudmFsdWVMYWJlbHM7XG4gICAgfSxcbiAgfSxcbn07XG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdj5cbiAgICA8ZGl2IHYtaWY9XCJvdXRwdXRGaWxlcy5sZW5ndGggPiAwXCIgY2xhc3M9XCJxLW1iLW1kXCI+XG4gICAgICA8c3Bhbj5PdXRwdXQgRmlsZXM8L3NwYW4+XG4gICAgICA8cS10YWJsZVxuICAgICAgICA6cm93cz1cIm91dHB1dEZpbGVzXCJcbiAgICAgICAgOmNvbHVtbnM9XCJjb2x1bW5zXCJcbiAgICAgICAgcm93LWtleT1cImlkXCJcbiAgICAgICAgOmhpZGUtcGFnaW5hdGlvbj1cInRydWVcIlxuICAgICAgICA6cm93cy1wZXItcGFnZS1vcHRpb25zPVwiWzBdXCJcbiAgICAgICAgdi1tb2RlbDpwYWdpbmF0aW9uPVwicGFnaW5hdGlvblwiXG4gICAgICA+XG4gICAgICAgIDx0ZW1wbGF0ZSB2LXNsb3Q6Ym9keS1jZWxsLWFjdGlvbnM9XCJwcm9wc1wiPlxuICAgICAgICAgIDxxLXRkPlxuICAgICAgICAgICAgPEljb24gbmFtZT1cImNvbnRlbnRfY29weVwiIEBjbGljaz1cImNvcHlGaWxlKHByb3BzLnJvdylcIiBjbGlja2FibGUgdG9vbHRpcD1cIkNvcHkgVXJsXCIgLz5cbiAgICAgICAgICAgIDxJY29uIG5hbWU9XCJjbG91ZF9kb3dubG9hZFwiIEBjbGljaz1cImRvd25sb2FkRmlsZShwcm9wcy5yb3cpXCIgY2xpY2thYmxlIHRvb2x0aXA9XCJEb3dubG9hZCBGaWxlXCIgLz5cbiAgICAgICAgICAgIDxJY29uIHYtaWY9XCJwcm9wcy5yb3cuY2FuVmlld1wiIG5hbWU9XCJ2aXNpYmlsaXR5XCIgQGNsaWNrPVwidmlld091dHB1dEZpbGUocHJvcHMucm93KVwiIGNsaWNrYWJsZSB0b29sdGlwPVwiVmlldyBGaWxlXCIgLz5cbiAgICAgICAgICA8L3EtdGQ+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICA8L3EtdGFibGU+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IHYtaWY9XCJzdGF0dXNGaWxlcy5sZW5ndGggPiAwXCIgY2xhc3M9XCJxLW1iLW1kXCI+XG4gICAgICA8c3Bhbj5TdGF0dXMgRmlsZXM8L3NwYW4+XG4gICAgICA8cS10YWJsZVxuICAgICAgICA6cm93cz1cInN0YXR1c0ZpbGVzXCJcbiAgICAgICAgOmNvbHVtbnM9XCJjb2x1bW5zXCJcbiAgICAgICAgcm93LWtleT1cImlkXCJcbiAgICAgICAgOmhpZGUtcGFnaW5hdGlvbj1cInRydWVcIlxuICAgICAgICA6cm93cy1wZXItcGFn
2788ZS1vcHRpb25zPVwiWzBdXCJcbiAgICAgICAgdi1tb2RlbDpwYWdpbmF0aW9uPVwicGFnaW5hdGlvblwiXG4gICAgICA+XG4gICAgICAgIDx0ZW1wbGF0ZSB2LXNsb3Q6Ym9keS1jZWxsLWFjdGlvbnM9XCJwcm9wc1wiPlxuICAgICAgICAgIDxxLXRkPlxuICAgICAgICAgICAgPEljb24gbmFtZT1cImNvbnRlbnRfY29weVwiIEBjbGljaz1cImNvcHlGaWxlKHByb3BzLnJvdylcIiBjbGlja2FibGUgdG9vbHRpcD1cIkNvcHkgVXJsXCIgLz5cbiAgICAgICAgICAgIDxJY29uIG5hbWU9XCJjbG91ZF9kb3dubG9hZFwiIEBjbGljaz1cImRvd25sb2FkRmlsZShwcm9wcy5yb3cpXCIgY2xpY2thYmxlIHRvb2x0aXA9XCJEb3dubG9hZCBGaWxlXCIgLz5cbiAgICAgICAgICAgIDxJY29uIHYtaWY9XCJwcm9wcy5yb3cuY2FuVmlld1wiIG5hbWU9XCJ2aXNpYmlsaXR5XCIgQGNsaWNrPVwidmlld1N0YXR1c0ZpbGUocHJvcHMucm93KVwiIGNsaWNrYWJsZSB0b29sdGlwPVwiVmlldyBGaWxlXCIgLz5cbiAgICAgICAgICA8L3EtdGQ+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICA8L3EtdGFibGU+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IHYtaWY9XCJsb2dGaWxlcy5sZW5ndGggPiAwXCIgY2xhc3M9XCJxLW1iLW1kXCI+XG4gICAgICA8cS10YWJsZSA6cm93cz1cImxvZ0ZpbGVzXCIgOmNvbHVtbnM9XCJjb2x1bW5zXCIgcm93LWtleT1cImlkXCIgOmhpZGUtcGFnaW5hdGlvbj1cInRydWVcIiA6cm93cy1wZXItcGFnZS1vcHRpb25zPVwiWzBdXCIgdi1tb2RlbDpwYWdpbmF0aW9uPVwicGFnaW5hdGlvblwiPlxuICAgICAgICA8dGVtcGxhdGUgdi1zbG90OmJvZHktY2VsbC1hY3Rpb25zPVwicHJvcHNcIj5cbiAgICAgICAgICA8cS10ZD5cbiAgICAgICAgICAgIDxJY29uIG5hbWU9XCJjb250ZW50X2NvcHlcIiBAY2xpY2s9XCJjb3B5RmlsZShwcm9wcy5yb3cpXCIgY2xpY2thYmxlIHRvb2x0aXA9XCJDb3B5IFVybFwiIC8+XG4gICAgICAgICAgICA8SWNvbiBuYW1lPVwiY2xvdWRfZG93bmxvYWRcIiBAY2xpY2s9XCJkb3dubG9hZEZpbGUocHJvcHMucm93KVwiIGNsaWNrYWJsZSB0b29sdGlwPVwiRG93bmxvYWQgRmlsZVwiIC8+XG4gICAgICAgICAgICA8SWNvbiB2LWlmPVwicHJvcHMucm93LmNhblZpZXdcIiBuYW1lPVwidmlzaWJpbGl0eVwiIEBjbGljaz1cInZpZXdMb2dGaWxlKHByb3BzLnJvdylcIiBjbGlja2FibGUgdG9vbHRpcD1cIlZpZXcgRmlsZVwiIC8+XG4gICAgICAgICAgPC9xLXRkPlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgPC9xLXRhYmxlPlxuICAgIDwvZGl2PlxuXG4gICAgPEVtcHR5IHYtaWY9XCIhb3V0cHV0RmlsZXMubGVuZ3RoICYmICFzdGF0dXNGaWxlcy5sZW5ndGggJiYgIWxvZ0ZpbGVzLmxlbmd0aFwiIGRlc2M9XCJObyBydW4tbGV2ZWwgZmlsZXMgZm91bmRcIiAvPlxuXG4gICAgPEZpbGVWaWV3ZXJEaWFsb2cyIHYtbW9kZWw9XCJ2aWV3ZXJEaWFsb2dPcGVuXCIgOnRpdGxlPVwidmlld2VyRGlhbG9nVGl0bGVcIiA6ZmlsZUluZm89XCJ2aWV3ZXJEaWFsb2dNb2RlbFwiIC8+XG4gICAgPFN0YXR1c0ZpbGVWaWV3ZXIgdi1tb2RlbD1cInN0YXR1c0ZpbGVWaWV3ZXJEaWFsb2dPcGVuXCIgOnRpdGxlPVwidmlld2VyRGlhbG9nVGl0bGVcIiA6ZmlsZUluZm89XCJ2aWV3ZXJEaWFsb2dNb2RlbFwiIC8+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHlwZXNjcmlwdFwiPlxuaW1wb3J0IG1peGlucyBmcm9tICdzcmMvbWl4aW5zL21peGlucyc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICdzcmMvc2VydmljZXMvdXRpbHMnO1xuaW1wb3J0ICogYXMgYXBpIGZyb20gJy4uLy4uL3NlcnZpY2VzL2FwaSc7XG5pbXBvcnQgKiBhcyBydFV0aWxzIGZyb20gJy4uLy4uL3NlcnZpY2VzL3J0VXRpbHMnO1xuaW1wb3J0IHtSdW5GaWxlVHlwZX0gZnJvbSAnc3JjL3NlcnZpY2VzL21vZGVscyc7XG5pbXBvcnQgU3RhdHVzRmlsZVZpZXdlciBmcm9tICdzcmMvY29tcG9uZW50cy9TdGF0dXNGaWxlVmlld2VyLnZ1ZSc7XG5pbXBvcnQge2NvcHlUb0NsaXBib2FyZH0gZnJvbSAnc3JjL3NlcnZpY2VzL3V0aWxzJztcbmltcG9ydCBGaWxlVmlld2VyRGlhbG9nMiBmcm9tICdzcmMvY29tcG9uZW50cy9GaWxlVmlld2VyRGlhbG9nMi52dWUnO1xuaW1wb3J0IEVtcHR5IGZyb20gJ3NyYy9jb21wb25lbnRzL0VtcHR5LnZ1ZSc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbbWl4aW5zXSxcbiAgY29tcG9uZW50czoge1N0YXR1c0ZpbGVWaWV3ZXIsIEZpbGVWaWV3ZXJEaWFsb2cyLCBFbXB0eX0sXG4gIHByb3BzOiB7XG4gICAgcnVuOiBPYmplY3QsXG4gICAgam9iSWQ6IFN0cmluZyxcbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBvdXRwdXRGaWxlczogW10sXG4gICAgICBzdGF0dXNGaWxlczogW10sXG4gICAgICBsb2dGaWxlczogW10sXG4gICAgICBjb2x1bW5zOiBbXG4gICAgICAgIHtuYW1lOiAnYWN0aW9ucycsIGFsaWduOiAnbGVmdCd9LFxuICAgICAgICB7bmFtZTogJ3R5cGUnLCBmaWVsZDogJ3R5cGUnLCBsYWJlbDogJ1R5cGUnLCBzb3J0YWJsZTogdHJ1ZSwgYWxpZ246ICdsZWZ0J30sXG4gICAgICAgIHtuYW1lOiAnZmlsZU5hbWUnLCBmaWVsZDogJ2ZpbGVOYW1lJywgbGFiZWw6ICdGaWxlIE5hbWUnLCBzb3J0YWJsZTogdHJ1ZSwgYWxpZ246ICdsZWZ0J30sXG4gICAgICAgIHtuYW1lOiAnZmlsZURlc2NyaXB0aW9uJywgZmllbGQ6ICdmaWxlRGVzY3JpcHRpb24nLCBsYWJlbDogJ0ZpbGUgRGVzYycsIHNvcnRhYmxlOiB0cnVlLCBhbGlnbjogJ2xlZnQnfSxcbiAgICAgICAge25hbWU6ICdmaWxlU2l6ZScsIGZpZWxkOiAnZmlsZVNpemVGb3JtYXR0ZWQnLCBsYWJlbDogJ0ZpbGUgU2l6ZScsIHNvcnRhYmxlOiB0cnVlLCBhbGlnbjogJ2xlZnQnfSxcbiAgICAgIF0sXG4gICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgIHBhZ2U6IDEsXG4gICAgICAgIHJvd3NQZXJQYWdlOiAwLFxuICAgICAgfSxcbiAgICAgIHZpZXdlckRpYWxvZ1RpdGxlOiAnJyxcbiAgICAgIHZpZXdlckRpYWxvZ09wZW46IGZhbHNlLFxuICAgICAgdmlld2VyRGlhbG9nTW9kZWw6IHt9LFxuICAgICAgc3RhdHVzRmlsZVZpZXdlckRpYWxvZ09wZW46IGZhbHNlLFxuICAgIH07XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBydW46IHtcbiAgICAgIGhhbmRsZXIoKSB7XG4gICAgICAgI
2788HRoaXMubG9hZEZpbGVzKCk7XG4gICAgICB9LFxuICAgICAgaW1tZWRpYXRlOiB0cnVlLFxuICAgIH0sXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGxvYWRGaWxlcygpIHtcbiAgICAgIGNvbnN0IGZpbGVzID0gcnRVdGlscy5nZXRSdW5GaWxlcyh0aGlzLnJ1bikuZmlsdGVyKChmaWxlKSA9PiAhZmlsZS50YXNrSWQpO1xuICAgICAgdGhpcy5vdXRwdXRGaWxlcyA9IGZpbGVzLmZpbHRlcigoZmlsZSkgPT4gZmlsZS5ydW5GaWxlVHlwZSA9PT0gUnVuRmlsZVR5cGUub3V0cHV0RmlsZSk7XG4gICAgICB0aGlzLnN0YXR1c0ZpbGVzID0gZmlsZXMuZmlsdGVyKChmaWxlKSA9PiBmaWxlLnJ1bkZpbGVUeXBlID09PSBSdW5GaWxlVHlwZS5zdGF0dXNGaWxlKTtcbiAgICAgIHRoaXMubG9nRmlsZXMgPSBmaWxlcy5maWx0ZXIoKGZpbGUpID0+IGZpbGUucnVuRmlsZVR5cGUgPT09IFJ1bkZpbGVUeXBlLmxvZ0ZpbGUpO1xuICAgIH0sXG5cbiAgICB2aWV3T3V0cHV0RmlsZShmaWxlSW5mbykge1xuICAgICAgdGhpcy5oYW5kbGVWaWV3RmlsZSgnT3V0cHV0IEZpbGU6ICcgKyBmaWxlSW5mby5maWxlTmFtZSwgZmlsZUluZm8sICdvdXRwdXRGaWxlJyk7XG4gICAgfSxcblxuICAgIHZpZXdTdGF0dXNGaWxlKGZpbGVJbmZvKSB7XG4gICAgICB0aGlzLmhhbmRsZVZpZXdGaWxlKCdTdGF0dXMgRmlsZTogJyArIGZpbGVJbmZvLmZpbGVOYW1lLCBmaWxlSW5mbywgJ3N0YXR1c0ZpbGUnKTtcbiAgICB9LFxuXG4gICAgdmlld0xvZ0ZpbGUoZmlsZUluZm8pIHtcbiAgICAgIHRoaXMuaGFuZGxlVmlld0ZpbGUoJ0xvZyBGaWxlOiAnICsgZmlsZUluZm8uZmlsZU5hbWUsIGZpbGVJbmZvLCAnbG9nRmlsZScpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRPcGVuYWJsZVVybChmaWxlSW5mbykge1xuICAgICAgaWYgKGZpbGVJbmZvLnVybC5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgICAgcmV0dXJuIGZpbGVJbmZvLnVybDtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbGVJbmZvLm9wZW5hYmxlVXJsKSB7XG4gICAgICAgIHJldHVybiBmaWxlSW5mby5vcGVuYWJsZVVybDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMucHJvY2Vzc0Zvcm0oKCkgPT5cbiAgICAgICAgYXBpLm9wZW5GaWxlKHtcbiAgICAgICAgICBydW5JZDogZmlsZUluZm8ucnVuSWQsXG4gICAgICAgICAgam9iSWQ6IHRoaXMuam9iSWQsXG4gICAgICAgICAgdXJsOiBmaWxlSW5mby51cmwsXG4gICAgICAgICAgbG9jYXRpb246IGZpbGVJbmZvLmxvY2F0aW9uLFxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgaWYgKHJlc3ApIHtcbiAgICAgICAgZmlsZUluZm8ub3BlbmFibGVVcmwgPSByZXNwLnVybDtcbiAgICAgICAgcmV0dXJuIHJlc3AudXJsO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBoYW5kbGVWaWV3RmlsZSh0aXRsZSwgZmlsZUluZm8sIGZpbGVUeXBlKSB7XG4gICAgICBpZiAoZmlsZUluZm8udXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgICAgICB1dGlscy5vcGVuVXJsKGZpbGVJbmZvLnVybCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5nZXRPcGVuYWJsZVVybChmaWxlSW5mbyk7XG4gICAgICBpZiAoIXVybCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMudmlld2VyRGlhbG9nVGl0bGUgPSB0aXRsZTtcbiAgICAgIHRoaXMudmlld2VyRGlhbG9nTW9kZWwgPSB7Li4uZmlsZUluZm8sIC4uLnt2aWV3VXJsOiB1cmx9fTtcblxuICAgICAgaWYgKGZpbGVUeXBlID09PSAnc3RhdHVzRmlsZScpIHtcbiAgICAgICAgdGhpcy5zdGF0dXNGaWxlVmlld2VyRGlhbG9nT3BlbiA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZpZXdlckRpYWxvZ09wZW4gPSB0cnVlO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBkb3dubG9hZEZpbGUoZmlsZUluZm8pIHtcbiAgICAgIGNvbnN0IHVybCA9IGF3YWl0IHRoaXMuZ2V0T3BlbmFibGVVcmwoZmlsZUluZm8pO1xuICAgICAgaWYgKHVybCkge1xuICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgICAgICAgIHV0aWxzLm9wZW5VcmwodXJsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBjb3B5RmlsZShmaWxlSW5mbykge1xuICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5nZXRPcGVuYWJsZVVybChmaWxlSW5mbyk7XG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIGF3YWl0IGNvcHlUb0NsaXBib2FyZCh1cmwpO1xuICAgICAgfVxuICAgIH0sXG4gIH0sXG59O1xuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGU+XG4gIDxDb250ZW50RGlhbG9nXG4gICAgOnRpdGxlPVwidGl0bGUgfHwgJ0ZpbGVzJ1wiXG4gICAgOm1vZGVsVmFsdWU9XCJtb2RlbFZhbHVlXCJcbiAgICBAdXBkYXRlOm1vZGVsVmFsdWU9XCIkZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnKVwiXG4gICAgOm1lc3NhZ2U9XCJtZXNzYWdlXCJcbiAgICA6bWVz
2788c2FnZVR5cGU9XCJtZXNzYWdlVHlwZVwiXG4gICAgOmluaXRpbmc9XCJpbml0aW5nXCJcbiAgICA6aW5pdGluZ1N1Y2Nlc3M9XCJpbml0aW5nU3VjY2Vzc1wiXG4gICAgOnByb2Nlc3Npbmc9XCJwcm9jZXNzaW5nXCJcbiAgICBoZWlnaHQ9XCJhdXRvXCJcbiAgICB3aWR0aD1cIjEyMDBweFwiXG4gICAgY2xvc2VNb2RlXG4gICAgOnBlcnNpc3RlbnQ9XCJmYWxzZVwiXG4gICAgQGNhbmNlbD1cImNsb3NlXCJcbiAgPlxuICAgIDxkaXYgdi1pZj1cIm91dHB1dEZpbGVzICYmIG91dHB1dEZpbGVzLmxlbmd0aCA+IDBcIiBjbGFzcz1cInEtbWItbWRcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiXCI+T3V0cHV0IEZpbGVzPC9zcGFuPlxuICAgICAgPHEtdGFibGUgOnJvd3M9XCJvdXRwdXRGaWxlc1wiIDpjb2x1bW5zPVwiY29sdW1uc1wiIHJvdy1rZXk9XCJpZFwiIDpoaWRlLXBhZ2luYXRpb249XCJ0cnVlXCIgOnJvd3MtcGVyLXBhZ2Utb3B0aW9ucz1cIlswXVwiPlxuICAgICAgICA8dGVtcGxhdGUgdi1zbG90OmJvZHktY2VsbC1hY3Rpb25zPVwicHJvcHNcIj5cbiAgICAgICAgICA8cS10ZD5cbiAgICAgICAgICAgIDxJY29uIG5hbWU9XCJjb250ZW50X2NvcHlcIiBAY2xpY2s9XCJjb3B5RmlsZShwcm9wcy5yb3cpXCIgY2xpY2thYmxlIHRvb2x0aXA9XCJDb3B5IFVybFwiIC8+XG4gICAgICAgICAgICA8SWNvbiBuYW1lPVwiY2xvdWRfZG93bmxvYWRcIiBAY2xpY2s9XCJkb3dubG9hZEZpbGUocHJvcHMucm93KVwiIGNsaWNrYWJsZSB0b29sdGlwPVwiRG93bmxvYWQgRmlsZVwiIC8+XG4gICAgICAgICAgICA8IS0tICAgICAgICAgICAgPEljb24gbmFtZT1cIm9wZW5faW5fbmV3XCIgQGNsaWNrPVwib3BlbkluVGFiKHByb3BzLnJvdylcIiBjbGlja2FibGUgdG9vbHRpcD1cIk9wZW4gaW4gVGFiXCIgLz4tLT5cbiAgICAgICAgICAgIDxJY29uIHYtaWY9XCJwcm9wcy5yb3cuY2FuVmlld1wiIG5hbWU9XCJ2aXNpYmlsaXR5XCIgQGNsaWNrPVwidmlld091dHB1dEZpbGUocHJvcHMucm93KVwiIGNsaWNrYWJsZSB0b29sdGlwPVwiVmlldyBGaWxlXCIgLz5cbiAgICAgICAgICA8L3EtdGQ+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICA8L3EtdGFibGU+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IHYtaWY9XCJzdGF0dXNGaWxlcyAmJiBzdGF0dXNGaWxlcy5sZW5ndGggPiAwXCIgY2xhc3M9XCJxLW1iLW1kXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cIlwiPlN0YXR1cyBGaWxlczwvc3Bhbj5cbiAgICAgIDxxLXRhYmxlIDpyb3dzPVwic3RhdHVzRmlsZXNcIiA6Y29sdW1ucz1cImNvbHVtbnNcIiByb3cta2V5PVwiaWRcIiA6aGlkZS1wYWdpbmF0aW9uPVwidHJ1ZVwiIDpyb3dzLXBlci1wYWdl
2788LW9wdGlvbnM9XCJbMF1cIj5cbiAgICAgICAgPHRlbXBsYXRlIHYtc2xvdDpib2R5LWNlbGwtYWN0aW9ucz1cInByb3BzXCI+XG4gICAgICAgICAgPHEtdGQ+XG4gICAgICAgICAgICA8SWNvbkNvcHkgOmNvbnRlbnQ9XCJwcm9wcy5yb3cudXJsXCIgdG9vbHRpcD1cIkNvcHkgdXJsIHRvIENsaXBib2FyZFwiIC8+XG4gICAgICAgICAgICA8SWNvbiBuYW1lPVwiY2xvdWRfZG93bmxvYWRcIiBAY2xpY2s9XCJkb3dubG9hZEZpbGUocHJvcHMucm93KVwiIGNsaWNrYWJsZSB0b29sdGlwPVwiRG93bmxvYWQgRmlsZVwiIC8+XG4gICAgICAgICAgICA8SWNvbiB2LWlmPVwicHJvcHMucm93LmNhblZpZXdcIiBuYW1lPVwidmlzaWJpbGl0eVwiIEBjbGljaz1cInZpZXdTdGF0dXNGaWxlKHByb3BzLnJvdylcIiBjbGlja2FibGUgdG9vbHRpcD1cIlZpZXcgRmlsZVwiIC8+XG4gICAgICAgICAgPC9xLXRkPlxuICAgICAgICA8L3RlbXBsYXRlPlxuICAgICAgPC9xLXRhYmxlPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiB2LWlmPVwiZXJyb3JGaWxlc1RvU2hvdyAmJiBlcnJvckZpbGVzVG9TaG93Lmxlbmd0aCA+IDBcIiBjbGFzcz1cInEtbWItbWRcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiXCI+RXJyb3JzPC9zcGFuPlxuICAgICAgPHEtdGFibGUgOnJvd3M9XCJlcnJvckZpbGVzVG9TaG93XCIgOmNvbHVtbnM9XCJmaWxlQ29sdW1uc1wiIHJvdy1rZXk9XCJpZFwiIDpoaWRlLXBhZ2luYXRpb249XCJ0cnVlXCIgOnJvd3MtcGVyLXBhZ2Utb3B0aW9ucz1cIlswXVwiPlxuICAgICAgICA8dGVtcGxhdGUgdi1zbG90OmJvZHktY2VsbC1hY3Rpb25zPVwicHJvcHNcIj5cbiAgICAgICAgICA8cS10ZD5cbiAgICAgICAgICAgIDxJY29uQ29weSA6Y29udGVudD1cInByb3BzLnJvdy51cmxcIiB0b29sdGlwPVwiQ29weSB1cmwgdG8gQ2xpcGJvYXJkXCIgLz5cbiAgICAgICAgICAgIDxJY29uIG5hbWU9XCJjbG91ZF9kb3dubG9hZFwiIEBjbGljaz1cImRvd25sb2FkRmlsZShwcm9wcy5yb3cpXCIgY2xpY2thYmxlIHRvb2x0aXA9XCJEb3dubG9hZCBGaWxlXCIgLz5cbiAgICAgICAgICAgIDxJY29uIHYtaWY9XCJwcm9wcy5yb3cuY2FuVmlld1wiIG5hbWU9XCJ2aXNpYmlsaXR5XCIgQGNsaWNrPVwidmlld0Vycm9yRmlsZShwcm9wcy5yb3cpXCIgY2xpY2thYmxlIHRvb2x0aXA9XCJWaWV3IEZpbGVcIiAvPlxuICAgICAgICAgIDwvcS10ZD5cbiAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgIDwvcS10YWJsZT5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgdi1pZj1cImxvZ0ZpbGVzICYmIGxvZ0ZpbGVzLmxlbmd0aCA+IDBcIiBjbGFzcz1cInEtbWItbWRcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiXCI+TG9nIEZpbGVzPC9zcGFuPlxuICAgICAgPHEtdGFibGUgOnJvd3M9XCJsb2dGaWxlc1wiIDpjb2x1bW5zPVwiY29sdW1uc1wiIHJvdy1rZXk9XCJpZFwiIDpoaWRlLXBhZ2luYXRpb249XCJ0cnVlXCIgOnJvd3MtcGVyLXBhZ2Utb3B0aW9ucz1cIlswXVwiPlxuICAgICAgICA8dGVtcGxhdGUgdi1zbG90OmJvZHktY2VsbC1hY3Rpb25zPVwicHJvcHNcIj5cbiAgICAgICAgICA8cS10ZD5cbiAgICAgICAgICAgIDxJY29uQ29weSA6Y29udGVudD1cInByb3BzLnJvdy51cmxcIiB0b29sdGlwPVwiQ29weSB1cmwgdG8gQ2xpcGJvYXJkXCIgLz5cbiAgICAgICAgICAgIDxJY29uIG5hbWU9XCJjbG91ZF9kb3dubG9hZFwiIEBjbGljaz1cImRvd25sb2FkRmlsZShwcm9wcy5yb3cpXCIgY2xpY2thYmxlIHRvb2x0aXA9XCJEb3dubG9hZCBGaWxlXCIgLz5cbiAgICAgICAgICAgIDxJY29uIHYtaWY9XCJwcm9wcy5yb3cuY2FuVmlld1wiIG5hbWU9XCJ2aXNpYmlsaXR5XCIgQGNsaWNrPVwidmlld0xvZ0ZpbGUocHJvcHMucm93KVwiIGNsaWNrYWJsZSB0b29sdGlwPVwiVmlldyBGaWxlXCIgLz5cbiAgICAgICAgICA8L3EtdGQ+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICA8L3EtdGFibGU+XG4gICAgPC9kaXY+XG5cbiAgICA8RmlsZVZpZXdlckRpYWxvZzIgdi1tb2RlbD1cInZpZXdlckRpYWxvZ09wZW5cIiA6dGl0bGU9XCJ2aWV3ZXJEaWFsb2dUaXRsZVwiIDpmaWxlSW5mbz1cInZpZXdlckRpYWxvZ01vZGVsXCIgLz5cbiAgICA8U3RhdHVzRmlsZVZpZXdlciB2LW1vZGVsPVwic3RhdHVzRmlsZVZpZXdlckRpYWxvZ09wZW5cIiA6dGl0bGU9XCJ2aWV3ZXJEaWFsb2dUaXRsZVwiIDpmaWxlSW5mbz1cInZpZXdlckRpYWxvZ01vZGVsXCIgLz5cbiAgPC9Db250ZW50RGlhbG9nPlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdCBsYW5nPVwidHlwZXNjcmlwdFwiPlxuaW1wb3J0IG1peGlucyBmcm9tICdzcmMvbWl4aW5zL21peGlucyc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy91dGlscyc7XG5pbXBvcnQgKiBhcyBhcGkgZnJvbSAnLi4vLi4vc2VydmljZXMvYXBpJztcbmltcG9ydCAqIGFzIHJ0VXRpbHMgZnJvbSAnLi4vLi4vc2VydmljZXMvcnRVdGlscyc7XG5pbXBvcnQge1J1bkZpbGVUeXBlfSBmcm9tICdzcmMvc2VydmljZXMvbW9kZWxzJztcbmltcG9ydCBTdGF0dXNGaWxlVmlld2VyIGZyb20gJ3NyYy9jb21wb25lbnRzL1N0YXR1c0ZpbGVWaWV3ZXIudnVlJztcbmltcG9ydCBGaWxlVmlld2VyRGlhbG9nMiBmcm9tICdzcmMvY29tcG9uZW50cy9GaWxlVmlld2VyRGlhbG9nMi52dWUnO1xuaW1wb3J0IEljb25Db3B5IGZyb20gJ3NyYy9jb21wb25lbnRzL0ljb25Db3B5LnZ1ZSc7XG5pbXBvcnQge2NvcHlUb0NsaXBib2FyZH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvdXRpbHMnO1xuXG5jb25zdCBNZXNzYWdlID0gJ01lc3NhZ2UnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW21peGluc10sXG4gIGNvbXBvbmVudHM6IHtTdGF0dXNGaWxlVmlld2VyLCBGaWxlVmlld2VyRGlhbG9nMiwgSWNvbkNvcHl9LFxuXG4gIHByb3BzOiB7XG4gICAgdGl0bGU6IFN0cmluZyxcbiAgICBqb2JJZDogU3RyaW5nLFxuICAgIG1vZGVsVmFsdWU6IEJvb2xlYW4sXG4gICAgdGFzazogT2JqZWN0LFxuICAgIHJ1bjogT2JqZWN0LFxuICAgIGVycm9yRmlsZXM6IEFycmF
27885LFxuICB9LFxuICBlbWl0czogWydjYW5jZWwnLCAndXBkYXRlOm1vZGVsVmFsdWUnXSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBvdXRwdXRGaWxlczogW10sXG4gICAgICBzdGF0dXNGaWxlczogW10sXG4gICAgICBsb2dGaWxlczogW10sXG4gICAgICBmaWxlczogW10sXG5cbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAge25hbWU6ICdhY3Rpb25zJywgYWxpZ246ICdsZWZ0J30sXG4gICAgICAgIHtuYW1lOiAndGFza05hbWUnLCBmaWVsZDogJ3Rhc2tOYW1lJywgbGFiZWw6ICdUYXNrJywgc29ydGFibGU6IHRydWUsIGFsaWduOiAnbGVmdCd9LFxuICAgICAgICB7bmFtZTogJ3R5cGUnLCBmaWVsZDogJ3R5cGUnLCBsYWJlbDogJ1R5cGUnLCBzb3J0YWJsZTogdHJ1ZSwgYWxpZ246ICdsZWZ0J30sXG4gICAgICAgIHtuYW1lOiAnZmlsZU5hbWUnLCBmaWVsZDogJ2ZpbGVOYW1lJywgbGFiZWw6ICdGaWxlIE5hbWUnLCBzb3J0YWJsZTogdHJ1ZSwgYWxpZ246ICdsZWZ0J30sXG4gICAgICAgIHtuYW1lOiAnZmlsZURlc2NyaXB0aW9uJywgZmllbGQ6ICdmaWxlRGVzY3JpcHRpb24nLCBsYWJlbDogJ0ZpbGUgRGVzYycsIHNvcnRhYmxlOiB0cnVlLCBhbGlnbjogJ2xlZnQnfSxcbiAgICAgICAge25hbWU6ICdmaWxlU2l6ZScsIGZpZWxkOiAnZmlsZVNpemVGb3JtYXR0ZWQnLCBsYWJlbDogJ0ZpbGUgU2l6ZScsIHNvcnRhYmxlOiB0cnVlLCBhbGlnbjogJ2xlZnQnfSxcbiAgICAgIF0sXG4gICAgICBmaWxlQ29sdW1uczogW1xuICAgICAgICB7bmFtZTogJ2FjdGlvbnMnLCBhbGlnbjogJ2xlZnQnfSxcbiAgICAgICAge25hbWU6ICdmaWxlTmFtZScsIGZpZWxkOiAnZmlsZU5hbWUnLCBsYWJlbDogJ0ZpbGUgTmFtZScsIHNvcnRhYmxlOiB0cnVlLCBhbGlnbjogJ2xlZnQnfSxcbiAgICAgICAge25hbWU6ICdmaWxlRGVzY3JpcHRpb24nLCBmaWVsZDogJ2ZpbGVEZXNjcmlwdGlvbicsIGxhYmVsOiAnRmlsZSBEZXNjJywgc29ydGFibGU6IHRydWUsIGFsaWduOiAnbGVmdCd9LFxuICAgICAgICB7bmFtZTogJ2ZpbGVTaXplJywgZmllbGQ6ICdmaWxlU2l6ZUZvcm1hdHRlZCcsIGxhYmVsOiAnRmlsZSBTaXplJywgc29ydGFibGU6IHRydWUsIGFsaWduOiAnbGVmdCd9LFxuICAgICAgXSxcbiAgICAgIHZpZXdlckRpYWxvZ1RpdGxlOiAnJyxcbiAgICAgIHZpZXdlckRpYWxvZ09wZW46IGZhbHNlLFxuICAgICAgdmlld2VyRGlhbG9nTW9kZWw6IHt9LFxuICAgICAgc3RhdHVzRmlsZVZpZXdlckRpYWxvZ09wZW46IGZhbHNlLFxuICAgIH07XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBlcnJvckZpbGVzVG9TaG93KCkge1xuICAgICAgY29uc3QgZmlsZXMgPSAodGhpcy5lcnJvckZpbGVzICYmIHRoaXMuZXJyb3JGaWxlcy5sZW5ndGggPiAwID8gdGhpcy5lcnJvckZpbGVzIDogdGhpcy50YXNrPy5lcnJvclN1bW1hcnlVcmxzKSB8fCBbXTtcbiAgICAgIHJldHVybiBmaWxlcy5tYXAoKGZpbGVJbmZvKSA9PiB1dGlscy5jcmVhdGVSdW5GaWxlKGZpbGVJbmZvKSk7XG4gICAgfSxcbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuaW5pdGluZ1N1Y2Nlc3MgPSB0cnVlO1xuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSgpIHtcbiAgICAgIGlmICghdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsZXMgPSBydFV0aWxzLmdldFRhc2tGaWxlcyh0aGlzLnJ1biwgdGhpcy50YXNrKTtcblxuICAgICAgdGhpcy5vdXRwdXRGaWxlcyA9IGZpbGVzLmZpbHRlcigoZmlsZSkgPT4gZmlsZS5ydW5GaWxlVHlwZSA9PT0gUnVuRmlsZVR5cGUub3V0cHV0RmlsZSk7XG4gICAgICB0aGlzLnN0YXR1c0ZpbGVzID0gZmlsZXMuZmlsdGVyKChmaWxlKSA9PiBmaWxlLnJ1bkZpbGVUeXBlID09PSBSdW5GaWxlVHlwZS5zdGF0dXNGaWxlKTtcbiAgICAgIHRoaXMubG9nRmlsZXMgPSBmaWxlcy5maWx0ZXIoKGZpbGUpID0+IGZpbGUucnVuRmlsZVR5cGUgPT09IFJ1bkZpbGVUeXBlLmxvZ0ZpbGUpO1xuICAgIH0sXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGNsb3NlKCkge1xuICAgICAgdGhpcy4kZW1pdCgnY2FuY2VsJyk7XG4gICAgfSxcblxuICAgIHZpZXdPdXRwdXRGaWxlKGZpbGVJbmZvKSB7XG4gICAgICB0aGlzLmhhbmRsZVZpZXdGaWxlKCdPdXRwdXQgRmlsZTogJyArIGZpbGVJbmZvLmZpbGVOYW1lLCBmaWxlSW5mbywgJ291dHB1dEZpbGUnKTtcbiAgICB9LFxuXG4gICAgdmlld1N0YXR1c0ZpbGUoZmlsZUluZm8pIHtcbiAgICAgIHRoaXMuaGFuZGxlVmlld0ZpbGUoJ1N0YXR1cyBGaWxlOiAnICsgZmlsZUluZm8uZmlsZU5hbWUsIGZpbGVJbmZvLCAnc3RhdHVzRmlsZScpO1xuICAgIH0sXG5cbiAgICB2aWV3TG9nRmlsZShmaWxlSW5mbykge1xuICAgICAgdGhpcy5oYW5kbGVWaWV3RmlsZSgnTG9nIEZpbGU6ICcgKyBmaWxlSW5mby5maWxlTmFtZSwgZmlsZUluZm8sICdsb2dGaWxlJyk7XG4gICAgfSxcblxuICAgIHZpZXdFcnJvckZpbGUoZmlsZUluZm8pIHtcbiAgICAgIHRoaXMuaGFuZGxlVmlld0ZpbGUoJ0Vycm9ycyBGaWxlOiAnICsgZmlsZUluZm8uZmlsZU5hbWUsIGZpbGVJbmZvLCAnc3RhdHVzRmlsZScpO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRPcGVuYWJsZVVybChmaWxlSW5mbykge1xuICAgICAgaWYgKGZpbGVJbmZvLnVybC5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgICAgcmV0dXJuIGZpbGVJbmZvLnVybDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmaWxlSW5mby5vcGVuYWJsZVVybCkge1xuICAgICAgICAgIHJldHVybiBmaWxlSW5mby5vcGVuYWJsZVVybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLnByb2Nlc3NGb3JtKCgpID0+XG4gICAgICAgICAgYXBpLm9wZW5GaWxlKHtcbiAgICAgICAgICAgIHJ1bklkOiBmaWxlSW5mby5ydW5JZCxcbiAgICAgICAgICAgIGpvYklkOiB0aGlzLmpvYklkLFxuICAgICAgICAgICAgdXJsOiBmaWxlSW5mby51cmwsXG4gICAgICAgICAgICBsb2NhdGlvbjogZmlsZUluZm8ubG9jYXRpb24sXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmVzcCkge1xuICAgICAgICAgIGZpbGVJbmZvLm9wZW5hYmxlVXJsID0gcmVzcC51cmw7XG4gICAgICAgICAgcmV0dXJuIHJlc3AudXJsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGhhbmRsZVZpZXdGaWxlKHRpdGxlLCBmaWxlSW5mbywgZmlsZVR5cGUpIHtcbiAgICAgIGlmIChmaWxlSW5mby51cmwuc3RhcnRzV2l0aCgnaHR0cCcpKSB7XG4gICAgICAgI
2788HV0aWxzLm9wZW5VcmwoZmlsZUluZm8udXJsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB1cmwgPSBhd2FpdCB0aGlzLmdldE9wZW5hYmxlVXJsKGZpbGVJbmZvKTtcbiAgICAgIGlmICghdXJsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy52aWV3ZXJEaWFsb2dUaXRsZSA9IHRpdGxlO1xuICAgICAgdGhpcy52aWV3ZXJEaWFsb2dNb2RlbCA9IHtcbiAgICAgICAgLi4uZmlsZUluZm8sXG4gICAgICAgIC4uLnt2aWV3VXJsOiB1cmx9LFxuICAgICAgfTtcbiAgICAgIGlmIChmaWxlVHlwZSA9PT0gJ3N0YXR1c0ZpbGUnKSB7XG4gICAgICAgIHRoaXMuc3RhdHVzRmlsZVZpZXdlckRpYWxvZ09wZW4gPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52aWV3ZXJEaWFsb2dPcGVuID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgb3BlbkluVGFiKGZpbGVJbmZvKSB7XG4gICAgICBjb25zdCB1cmwgPSBhd2FpdCB0aGlzLmdldE9wZW5hYmxlVXJsKGZpbGVJbmZvKTtcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgdXRpbHMub3BlblVybCh1cmwpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBkb3dubG9hZEZpbGUoZmlsZUluZm8pIHtcbiAgICAgIGxldCB1cmwgPSBhd2FpdCB0aGlzLmdldE9wZW5hYmxlVXJsKGZpbGVJbmZvKTtcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgaWYgKHVybC5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgICAgICB1dGlscy5vcGVuVXJsKHVybCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgY29weUZpbGUoZmlsZUluZm8pIHtcbiAgICAgIGxldCB1cmwgPSBhd2FpdCB0aGlzLmdldE9wZW5hYmxlVXJsKGZpbGVJbmZvKTtcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgLy8gdGhpcy4kY2xpcGJvYXJkKHVybCk7XG4gICAgICAgIC8vIHV0aWxzLm5vdGlmeUluZm8oJ1VybCBjb3BpZWQhJyk7XG4gICAgICAgIGF3YWl0IGNvcHlUb0NsaXBib2FyZCh1cmwpO1xuICAgICAgfVxuICAgIH0sXG4gIH0sXG59O1xuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGU+XG4gIDxkaXYgdi1pZj1cInNob3coKVwiIHN0eWxlPVwibWFyZ2luLXRvcDogMnB4XCI+XG4gICAgPEljb24gbmFtZT1cInZpc2liaWxpdHlcIiBAbW91c2Vkb3duLnN0b3AgQHBvaW50ZXJkb3duLnN0b3AgQGNsaWNrLnN0b3A9XCJ2aWV3RXJyb3JzXCIgY2xpY2thYmxlIHRvb2x0aXA9XCJWaWV3IEVycm9yc1wiIC8+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgcHJvcHM6IHtcbiAgICBwYXJhbXM6IE9iamVjdCxcbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICByb3c6IHt9LFxuICAgIH07XG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICB0aGlzLnJvdyA9IHRoaXMucGFyYW1zPy5kYXRhIHx8IHt9O1xuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBzaG93KCkge1xuICAgICAgcmV0dXJuICF0aGlzLnJvdy5zdW1tYXJ5VG90YWwgJiYgKHRoaXMucm93LnN0YXRzPy5lcnJvcnMgfHwgMCkgPiAwO1xuICAgIH0sXG5cbiAgICB2aWV3RXJyb3JzKCkge1xuICAgICAgaWYgKHRoaXMucGFyYW1zPy52aWV3RXJyb3JzKSB7XG4gICAgICAgIHRoaXMucGFyYW1zLnZpZXdFcnJvcnModGhpcy5yb3cpO1xuICAgICAgfVxuICAgIH0sXG4gIH0sXG59O1xuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGU+XG4gIDxkaXY+XG4gICAgPERhdGFncmlkXG4gICAgICByZWY9XCJncmlkXCJcbiAgICAgIHJlY29yZFR5cGU9XCJPYmplY3RcIlxuICAgICAgcmVjb3JkVHlwZVBsdXJhbD1cIk9iamVjdHNcIlxuICAgICAgOmNvbHVtbnM9XCJjb2x1bW5zXCJcbiAgICAgIDpyZWNvcmRzPVwicmVjb3Jkc1wiXG4gICAgICA6Y3JlYXRhYmxlPVwiZmFsc2VcIlxuICAgICAgOnVwZGF0YWJsZT1cImZhbHNlXCJcbiAgICAgIDpkZWxldGFibGU9XCJmYWxzZVwiXG4gICAgICA6YWN0aW9uc0NvbHVtbj1cImZhbHNlXCJcbiAgICAgIHJvd1NlbGVjdGlvbj1cIm5vbmVcIlxuICAgICAgOnJlZnJlc2hhYmxlPVwiZmFsc2VcIlxuICAgICAgOnRvb2xiYXI9XCJmYWxzZVwiXG4gICAgICBoZWlnaHQ9XCI3MHZoXCJcbiAgICAvPlxuICAgIDxTdGF0dXNGaWxlVmlld2VyIHYtbW9kZWw9XCJ2aWV3RXJyb3JzRGlhbG9nT3BlblwiIDp0aXRsZT1cInZpZXdFcnJvcnNEaWFsb2dUaXRsZVwiIDpyb3dzPVwidmlld0Vycm9yc1Jvd3NcIiA6cGVyc2lzdGVudD1cInRydWVcIiAvPlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGF0YWdyaWQgZnJvbSAnc3JjL2NvbXBvbmVudHMvRGF0YWdyaWQudnVlJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJ3NyYy9zZXJ2aWNlcy91dGlscyc7XG5pbXBvcnQge3NvcnRJY30gZnJvbSAnc3JjL3NlcnZpY2VzL3V0aWxzJztcbmltcG9ydCAqIGFzIGNvbW1vbkFwaSBmcm9tICdzcmMvc2VydmljZXMvY29tbW9uQXBpJztcbmltcG9ydCAqIGFzIGFwaSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hcGknO1xuaW1wb3J0IERhdGFDb3B5T2JqZWN0c1N1bW1hcnlBY3Rpb24gZnJvbSAnLi9EYXRhQ29weU9iamVjdHNTdW1tYXJ5QWN0aW9uLnZ1ZSc7XG5pbXBvcnQgU3RhdHVzRmlsZVZpZXdlciBmcm9tICdzcmMvY29tcG9uZW50cy9TdGF0dXNGaWxlVmlld2VyLnZ1ZSc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgY29tcG9uZW50czoge0RhdGFDb3B5T2JqZWN0c1N1bW1hcnlBY3Rpb24sIERhdGFncmlkLCBTdGF0dXNGaWxlVmlld2VyfSxcbiAgcHJvcHM6IHtcbiAgICBtb2RlbDogT2JqZWN0LFxuICAgIGpvYklkOiBTdHJpbmcsXG4gICAgcnVuSWQ6IFN0cmluZyxcbiAgfSxcbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sdW1uczogW1xuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyTmFtZTogJ1ZpZXcnLFxuICAgICAgICAgIHdpZHRoOiA2MCxcbiAgICAgICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICAgICAgZmlsdGVyOiBmYWxzZSxcbiAgICAgICAgICByZXNpemFibGU6IGZhbHNlLFxuICAgICAgICAgIGNlbGxSZW5kZXJlcjogRGF0YUNvcHlPYmplY3RzU3VtbWFyeUFjdGlvbixcbiAgICAgICAgICBjZWxsUmVuZGVyZXJQYXJhbXM6IChwYXJhbXMpID0+IHtcbiAgICAgICAgICAgI
2788HJldHVybiB7XG4gICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgICAgdmlld0Vycm9yczogKHJvdykgPT4gdGhpcy52aWV3RXJyb3JzKHJvdyksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJOYW1lOiAnTmFtZScsXG4gICAgICAgICAgZmllbGQ6ICduYW1lJyxcbiAgICAgICAgICB3aWR0aDogMzAwLFxuICAgICAgICB9LFxuICAgICAgICB7ZmllbGQ6ICdzb3FscycsIGhlYWRlck5hbWU6ICdTT1FMcycsIHdpZHRoOiAxMDAsIHR5cGU6ICdpbnQnfSxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlck5hbWU6ICdUb3RhbCcsXG4gICAgICAgICAgdmFsdWVHZXR0ZXI6IChyb3cpID0+IHJvdy5kYXRhLnN0YXRzICYmIHJvdy5kYXRhLnN0YXRzLnRvdGFsLFxuICAgICAgICAgIHdpZHRoOiAxMDAsXG4gICAgICAgICAgdHlwZTogJ2ludCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJOYW1lOiAnRXJyb3JzJyxcbiAgICAgICAgICB2YWx1ZUdldHRlcjogKHJvdykgPT4gcm93LmRhdGEuc3RhdHMgJiYgcm93LmRhdGEuc3RhdHMuZXJyb3JzLFxuICAgICAgICAgIHdpZHRoOiAxMDAsXG4gICAgICAgICAgdHlwZTogJ2ludCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJOYW1lOiAnU3VjY2VzcycsXG4gICAgICAgICAgdmFsdWVHZXR0ZXI6IChyb3cpID0+IHJvdy5kYXRhLnN0YXRzICYmIHJvdy5kYXRhLnN0YXRzLnN1Y2Nlc3MsXG4gICAgICAgICAgd2lkdGg6IDEwMCxcbiAgICAgICAgICB0eXBlOiAnaW50JyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlck5hbWU6ICdTa2lwcGVkJyxcbiAgICAgICAgICB2YWx1ZUdldHRlcjogKHJvdykgPT4gcm93LmRhdGEuc3RhdHMgJiYgcm93LmRhdGEuc3RhdHMuc2tpcHBlZCxcbiAgICAgICAgICB3aWR0aDogMTAwLFxuICAgICAgICAgIHR5cGU6ICdpbnQnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyTmFtZTogJ0luc2VydHMnLFxuICAgICAgICAgIHZhbHVlR2V0dGVyOiAocm93KSA9PiByb3cuZGF0YS5zdGF0cyAmJiByb3cuZGF0YS5zdGF0cy5pbnNlcnRzLFxuICAgICAgICAgIHdpZHRoOiAxMDAsXG4gICAgICAgICAgdHlwZTogJ2ludCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJOYW1lOiAnVXBkYXRlcycsXG4gICAgICAgICAgdmFsdWVHZXR0ZXI6IChyb3cpID0+IHJvdy5kYXRhLnN0YXRzICYmIHJvdy5kYXRhLnN0YXRzLnVwZGF0ZXMsXG4gICAgICAgICAgd2lkdGg6IDEwMCxcbiAgICAgICAgICB0eXBlOiAnaW50JyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICByZWNvcmRzOiB0aGlzLmdldE9iamVjdHMsXG4gICAgICBvcGVuYWJsZVVybENhY2hlOiBuZXcgTWFwKCksXG4gICAgICB2aWV3RXJyb3JzRGlhbG9nT3BlbjogZmFsc2UsXG4gICAgICB2aWV3RXJyb3JzRGlhbG9nVGl0bGU6ICcnLFxuICAgICAgdmlld0Vycm9yc1Jvd3M6IFtdLFxuICAgIH07XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbCgpIHtcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIH0sXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGFzeW5jIGdldE9iamVjdHMoKSB7XG4gICAgICBjb25zdCByZWNvcmRzID0gc29ydEljKFsuLi4odGhpcy5tb2RlbC5jb3B5U3RhdHMgfHwgW10pXSwgJ25hbWUnKTtcbiAgICAgIGlmIChyZWNvcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gcmVjb3JkcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFt0aGlzLmdldFRvdGFsUm93KHJlY29yZHMpLCAuLi5yZWNvcmRzXTtcbiAgICB9LFxuXG4gICAgZ2V0VG90YWxSb3cocmVjb3Jkcykge1xuICAgICAgY29uc3QgdG90YWwgPSB7XG4gICAgICAgIG5hbWU6ICc8VG90YWw+JyxcbiAgICAgICAgc29xbHM6IDAsXG4gICAgICAgIHN0YXRzOiB7XG4gICAgICAgICAgdG90YWw6IDAsXG4gICAgICAgICAgZXJyb3JzOiAwLFxuICAgICAgICAgIHN1Y2Nlc3M6IDAsXG4gICAgICAgICAgc2tpcHBlZDogMCxcbiAgICAgICAgICBpbnNlcnRzOiAwLFxuICAgICAgICAgIHVwZGF0ZXM6IDAsXG4gICAgICAgIH0sXG4gICAgICAgIHN1bW1hcnlUb3RhbDogdHJ1ZSxcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHMpIHtcbiAgICAgICAgdG90YWwuc29xbHMgKz0gcmVjb3JkLnNvcWxzIHx8IDA7XG4gICAgICAgIHRvdGFsLnN0YXRzLnRvdGFsICs9IHJlY29yZC5zdGF0cz8udG90YWwgfHwgMDtcbiAgICAgICAgdG90YWwuc3RhdHMuZXJyb3JzICs9IHJlY29yZC5zdGF0cz8uZXJyb3JzIHx8IDA7XG4gICAgICAgIHRvdGFsLnN0YXRzLnN1Y2Nlc3MgKz0gcmVjb3JkLnN0YXRzPy5zdWNjZXNzIHx8IDA7XG4gICAgICAgIHRvdGFsLnN0YXRzLnNraXBwZWQgKz0gcmVjb3JkLnN0YXRzPy5za2lwcGVkIHx8IDA7XG4gICAgICAgIHRvdGFsLnN0YXRzLmluc2VydHMgKz0gcmVjb3JkLnN0YXRzPy5pbnNlcnRzIHx8IDA7XG4gICAgICAgIHRvdGFsLnN0YXRzLnVwZGF0ZXMgKz0gcmVjb3JkLnN0YXRzPy51cGRhdGVzIHx8IDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0b3RhbDtcbiAgICB9LFxuXG4gICAgaXNPYmplY3RNYXRjaChpdGVtLCBvYmplY3ROYW1lKSB7XG4gICAgICBpZiAoIWl0ZW0gfHwgIWl0ZW0ubmFtZSB8fCAhb2JqZWN0TmFtZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGl0ZW1OYW1lID0gaXRlbS5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCB0YXJnZXROYW1lID0gb2JqZWN0TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIGl0ZW1OYW1lID09PSB0YXJnZXROYW1lIHx8IGl0ZW1OYW1lLmVuZHNXaXRoKGAoJHt0YXJnZXROYW1lfSlgKTtcbiAgICB9LFxuXG4gICAgaGFzTm9uUmVmZXJlbmNlRXJyb3IoaXRlbSkge1xuICAgICAgY29uc3QgZXJyb3JUeXBlcyA9IChpdGVtPy5lcnJvclR5cGVzIHx8IFtdKS5tYXAoKGl0KSA9PiAoaXQgfHwgJycpLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgaWYgKGVycm9yVHlwZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgI
2788HJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXJyb3JUeXBlcy5zb21lKChpdCkgPT4gaXQgIT09ICdyZWZlcmVuY2UnKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0T3BlbmFibGVVcmwoZmlsZUluZm8pIHtcbiAgICAgIGlmICghZmlsZUluZm8/LnVybCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlsZUluZm8udXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgICAgICByZXR1cm4gZmlsZUluZm8udXJsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjYWNoZWRVcmwgPSB0aGlzLm9wZW5hYmxlVXJsQ2FjaGUuZ2V0KGZpbGVJbmZvLnVybCk7XG4gICAgICBpZiAoY2FjaGVkVXJsKSB7XG4gICAgICAgIHJldHVybiBjYWNoZWRVcmw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBhcGkub3BlbkZpbGUoe1xuICAgICAgICBydW5JZDogdGhpcy5ydW5JZCxcbiAgICAgICAgam9iSWQ6IHRoaXMuam9iSWQsXG4gICAgICAgIHVybDogZmlsZUluZm8udXJsLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXNwPy51cmwpIHtcbiAgICAgICAgdGhpcy5vcGVuYWJsZVVybENhY2hlLnNldChmaWxlSW5mby51cmwsIHJlc3AudXJsKTtcbiAgICAgICAgcmV0dXJuIHJlc3AudXJsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sXG5cbiAgICBhc3luYyByZWFkU3RhdHVzRmlsZShmaWxlSW5mbykge1xuICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5nZXRPcGVuYWJsZVVybChmaWxlSW5mbyk7XG4gICAgICBpZiAoIXVybCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBjb21tb25BcGkuZ2V0RmlsZSh1cmwpO1xuICAgICAgY29uc3QgY3N2ID0gdXRpbHMucmVhZENzdihjb250ZW50KTtcbiAgICAgIHJldHVybiBjc3Y/LnJlY29yZHMgfHwgW107XG4gICAgfSxcblxuICAgIGNvbGxlY3RNYXRjaGluZ1N0YXR1c0ZpbGVzKG9iamVjdE5hbWUpIHtcbiAgICAgIGNvbnN0IGZpbGVzID0gW107XG4gICAgICBjb25zdCBzZWVuRmlsZXMgPSBuZXcgU2V0KCk7XG5cbiAgICAgIGNvbnN0IHdhbGsgPSAoaXRlbXMpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zIHx8IFtdKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNPYmplY3RNYXRjaChpdGVtLCBvYmplY3ROYW1lKSAmJiB0aGlzLmhhc05vblJlZmVyZW5jZUVycm9yKGl0ZW0pKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpbGVJbmZvIG9mIGl0ZW0uc3RhdHVzVXJscyB8fCBbXSkge1xuICAgICAgICAgICAgICBpZiAoIWZpbGVJbmZvPy51cmwgfHwgc2VlbkZpbGVzLmhhcyhmaWxlSW5mby51cmwpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzZWVuRmlsZXMuYWRkKGZpbGVJbmZvLnVybCk7XG4gICAgICAgICAgICAgIGZpbGVzLnB1c2goZmlsZUluZm8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHdhbGsoaXRlbS5wYXJlbnRzKTtcbiAgICAgICAgICB3YWxrKGl0ZW0uY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB3YWxrKHRoaXMubW9kZWw/Lm9iamVjdHNUcmVlIHx8IFtdKTtcbiAgICAgIHJldHVybiBmaWxlcztcbiAgICB9LFxuXG4gICAgaXNTYXZlRXJyb3JSZWNvcmQocmVjKSB7XG4gICAgICBjb25zdCBzdGF0dXMgPSAocmVjPy5zdGF0dXMgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoc3RhdHVzICE9PSAnZXJyb3InIHx8ICFyZWM/LnJlY29yZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlY09iaiA9IEpTT04ucGFyc2UocmVjLnJlY29yZCk7XG4gICAgICAgIGNvbnN0IGVycm9yVHlwZSA9IChyZWNPYmo/LmF0dHJpYnV0ZXM/LmVycm9yVHlwZSB8fCByZWNPYmo/LmF0dHJpYnV0ZXM/LmVycm9ydHlwZSB8fCByZWNPYmo/LmVycm9yVHlwZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIGVycm9yVHlwZSA9PT0gJ3NhdmUnO1xuICAgICAgfSBjYXRjaCAoX2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRFcnJvckRldGFpbHNGcm9tUmVjb3JkKHJlYykge1xuICAgICAgaWYgKCFyZWM/LnJlY29yZCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IEpTT04ucGFyc2UocmVjLnJlY29yZCk7XG4gICAgICAgIGNvbnN0IGRldGFpbHMgPSBbXTtcbiAgICAgICAgY29uc3QgYWRkRGV0YWlsID0gKHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBkZXRhaWxzLnB1c2goLi4udmFsdWUuZmlsdGVyKChpdCkgPT4gaXQpLm1hcCgoaXQpID0+IGAke2l0fWApKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBkZXRhaWxzLnB1c2goYCR7dmFsdWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGFkZERldGFpbChyZWNvcmQ/LmRldGFpbHMpO1xuICAgICAgICBhZGREZXRhaWwocmVjb3JkPy5tZXNzYWdlKTtcbiAgICAgICAgYWRkRGV0YWlsKHJlY29yZD8uYXR0cmlidXRlcz8uZGV0YWlscyk7XG4gICAgICAgIGFkZERldGFpbChyZWNvcmQ/LmF0dHJpYnV0ZXM/Lm1lc3NhZ2UpO1xuICAgICAgICBhZGREZXRhaWwocmVjb3JkPy5lcnJvcnMpO1xuICAgICAgICByZXR1cm4gZGV0YWlscy5maWx0ZXIoKGl0KSA9PiBpdCkuam9pbignIHwgJyk7XG4gICAgICB9IGNhdGNoIChfZSkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGNvbWJpbmVFcnJvcnNXaXRoRGV0YWlscyhyZWMpIHtcbiAgICAgIGNvbnN0IGVycm9ycyA9IFtyZWM/LmVycm9ycyB8fCAnJywgdGhpcy5nZXRFcnJvckRldGFpbHNGcm9tUmVjb3JkKHJlYyldLmZpbHRlcigoaXQpID0+IGl0KTtcbiAgICAgIHJldHVybi
2788B7Li4ucmVjLCBlcnJvcnM6IGVycm9ycy5qb2luKCcgfCAnKX07XG4gICAgfSxcblxuICAgIGNvbGxlY3RFcnJvclJvd3NGcm9tUmVjb3JkcyhyZWNvcmRzKSB7XG4gICAgICBjb25zdCByb3dzID0gW107XG4gICAgICBmb3IgKGNvbnN0IHJlYyBvZiByZWNvcmRzIHx8IFtdKSB7XG4gICAgICAgIGlmICh0aGlzLmlzU2F2ZUVycm9yUmVjb3JkKHJlYykpIHtcbiAgICAgICAgICByb3dzLnB1c2godGhpcy5jb21iaW5lRXJyb3JzV2l0aERldGFpbHMocmVjKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByb3dzO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRPYmplY3RFcnJvclJvd3Mob2JqZWN0TmFtZSkge1xuICAgICAgY29uc3Qgcm93cyA9IFtdO1xuICAgICAgY29uc3QgZmlsZXMgPSB0aGlzLmNvbGxlY3RNYXRjaGluZ1N0YXR1c0ZpbGVzKG9iamVjdE5hbWUpO1xuICAgICAgY29uc3QgZmlsZVJlY29yZHMgPSBhd2FpdCBQcm9taXNlLmFsbChmaWxlcy5tYXAoKGZpbGVJbmZvKSA9PiB0aGlzLnJlYWRTdGF0dXNGaWxlKGZpbGVJbmZvKSkpO1xuICAgICAgZm9yIChjb25zdCByZWNvcmRzIG9mIGZpbGVSZWNvcmRzKSB7XG4gICAgICAgIHJvd3MucHVzaCguLi50aGlzLmNvbGxlY3RFcnJvclJvd3NGcm9tUmVjb3JkcyhyZWNvcmRzKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcm93cztcbiAgICB9LFxuXG4gICAgYXN5bmMgdmlld0Vycm9ycyhyb3cpIHtcbiAgICAgIHRoaXMudmlld0Vycm9yc0RpYWxvZ1RpdGxlID0gYEVycm9ycyBmb3IgJHtyb3cubmFtZX1gO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy52aWV3RXJyb3JzUm93cyA9IGF3YWl0IHRoaXMuZ2V0T2JqZWN0RXJyb3JSb3dzKHJvdy5uYW1lKTtcbiAgICAgIH0gY2F0Y2ggKF9lKSB7XG4gICAgICAgIHRoaXMudmlld0Vycm9yc1Jvd3MgPSBbXTtcbiAgICAgIH1cbiAgICAgIHRoaXMudmlld0Vycm9yc0RpYWxvZ09wZW4gPSB0cnVlO1xuICAgIH0sXG5cbiAgICByZWZyZXNoKCkge1xuICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy4kcmVmcy5ncmlkKSB7XG4gICAgICAgICAgdGhpcy4kcmVmcy5ncmlkLnJlZnJlc2goKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgfSxcbn07XG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZT5cbiAgPENvbnRlbnREaWFsb2dcbiAgICA6dGl0bGU9XCJ0aXRsZSB8fCAnRmlsZXMnXCJcbiAgICA6bW9kZWxWYWx1ZT1cIm1vZGVsVmFsdWVcIlxuICAgIEB1cGRhdGU6bW9kZWxWYWx1ZT1cIiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScpXCJcbiAgICA6bWVz
2788c2FnZT1cIm1lc3NhZ2VcIlxuICAgIDptZXNzYWdlVHlwZT1cIm1lc3NhZ2VUeXBlXCJcbiAgICA6aW5pdGluZz1cImluaXRpbmdcIlxuICAgIDppbml0aW5nU3VjY2Vzcz1cImluaXRpbmdTdWNjZXNzXCJcbiAgICA6cHJvY2Vzc2luZz1cInByb2Nlc3NpbmdcIlxuICAgIGhlaWdodD1cImF1dG9cIlxuICAgIHdpZHRoPVwiMTIwMHB4XCJcbiAgICBjbG9zZU1vZGVcbiAgICA6cGVyc2lzdGVudD1cImZhbHNlXCJcbiAgICBAY2FuY2VsPVwiY2xvc2VcIlxuICA+XG4gICAgPGRpdiB2LWlmPVwic3RhdHVzRmlsZXMgJiYgc3RhdHVzRmlsZXMubGVuZ3RoID4gMFwiIGNsYXNzPVwicS1tYi1tZFwiPlxuICAgICAgPHEtdGFibGUgOnJvd3M9XCJzdGF0dXNGaWxlc1wiIDpjb2x1bW5zPVwiY29sdW1uc1wiIHJvdy1rZXk9XCJpZFwiIDpoaWRlLXBhZ2luYXRpb249XCJ0cnVlXCIgOnJvd3MtcGVyLXBhZ2Utb3B0aW9ucz1cIlswXVwiPlxuICAgICAgICA8dGVtcGxhdGUgdi1zbG90OmJvZHktY2VsbC1hY3Rpb25zPVwicHJvcHNcIj5cbiAgICAgICAgICA8cS10ZD5cbiAgICAgICAgICAgIDxJY29uQ29weSA6Y29udGVudD1cInByb3BzLnJvdy51cmxcIiB0b29sdGlwPVwiQ29weSB1cmwgdG8gQ2xpcGJvYXJkXCIgLz5cbiAgICAgICAgICAgIDxJY29uIG5hbWU9XCJjbG91ZF9kb3dubG9hZFwiIEBjbGljaz1cImRvd25sb2FkRmlsZShwcm9wcy5yb3cpXCIgY2xpY2thYmxlIHRvb2x0aXA9XCJEb3dubG9hZCBGaWxlXCIgLz5cbiAgICAgICAgICAgIDxJY29uIHYtaWY9XCJjYW5WaWV3RmlsZShwcm9wcy5yb3cpXCIgbmFtZT1cInZpc2liaWxpdHlcIiBAY2xpY2s9XCJ2aWV3U3RhdHVzRmlsZShwcm9wcy5yb3cpXCIgY2xpY2thYmxlIHRvb2x0aXA9XCJWaWV3IEZpbGVcIiAvPlxuICAgICAgICAgIDwvcS10ZD5cbiAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgIDwvcS10YWJsZT5cbiAgICA8L2Rpdj5cblxuICAgIDxTdGF0dXNGaWxlVmlld2VyIHYtbW9kZWw9XCJzdGF0dXNGaWxlVmlld2VyRGlhbG9nT3BlblwiIDp0aXRsZT1cInZpZXdlckRpYWxvZ1RpdGxlXCIgOmZpbGVJbmZvPVwidmlld2VyRGlhbG9nTW9kZWxcIiAvPlxuICA8L0NvbnRlbnREaWFsb2c+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0IGxhbmc9XCJ0eXBlc2NyaXB0XCI+XG5pbXBvcnQgbWl4aW5zIGZyb20gJ3NyYy9taXhpbnMvbWl4aW5zJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3V0aWxzJztcbmltcG9ydCAqIGFzIGFwaSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hcGknO1xuaW1wb3J0ICogYXMgcnRVdGlscyBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ydFV0aWxzJztcbmltcG9ydCB7UnVuRmlsZVR5cGV9IGZyb20gJ3NyYy9zZXJ2aWNlcy9tb2RlbHMnO1xuaW1wb3J0IFN0YXR1c0ZpbGVWaWV3ZXIgZnJvbSAnc3JjL2NvbXBvbmVudHMvU3RhdHVzRmlsZVZpZXdlci52dWUnO1xuaW1wb3J0IEljb25Db3B5IGZyb20gJ3NyYy9jb21wb25lbnRzL0ljb25Db3B5LnZ1ZSc7XG5pbXBvcnQge0RlcGxveW1lbnR9IGZyb20gJ0BkYXRhc2VydC9qcy11dGlscy9kaXN0L21vZGVsc01zJztcbmltcG9ydCB7Y2FuVmlld0ZpbGV9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3V0aWxzJztcbmNvbnN0IE1lc3NhZ2UgPSAnTWVzc2FnZSc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbbWl4aW5zXSxcbiAgY29tcG9uZW50czoge1N0YXR1c0ZpbGVWaWV3ZXIsIEljb25Db3B5fSxcblxuICBwcm9wczoge1xuICAgIHRpdGxlOiBTdHJpbmcsXG4gICAgam9iSWQ6IFN0cmluZyxcbiAgICBtb2RlbFZhbHVlOiBCb29sZWFuLFxuICAgIHRhc2s6IE9iamVjdCxcbiAgICBydW46IE9iamVjdCxcbiAgICBzdGF0dXNGaWxlczogQXJyYXksXG4gIH0sXG4gIGVtaXRzOiBbJ2NhbmNlbCcsICd1cGRhdGU6bW9kZWxWYWx1ZSddLFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAge25hbWU6ICdhY3Rpb25zJywgYWxpZ246ICdsZWZ0J30sXG4gICAgICAgIC8vIHtuYW1lOiAndGFza05hbWUnLCBmaWVsZDogJ3Rhc2tOYW1lJywgbGFiZWw6ICdUYXNrJywgc29ydGFibGU6IHRydWUsIGFsaWduOiAnbGVmdCd9LFxuICAgICAgICB7bmFtZTogJ2ZpbGVOYW1lJywgZmllbGQ6ICdmaWxlTmFtZScsIGxhYmVsOiAnRmlsZSBOYW1lJywgc29ydGFibGU6IHRydWUsIGFsaWduOiAnbGVmdCd9LFxuICAgICAgICB7bmFtZTogJ3R5cGUnLCBmaWVsZDogJ2NvbnRlbnRUeXBlJywgbGFiZWw6ICdUeXBlJywgc29ydGFibGU6IHRydWUsIGFsaWduOiAnbGVmdCd9LFxuICAgICAgICB7bmFtZTogJ2ZpbGVEZXNjcmlwdGlvbicsIGZpZWxkOiAnZmlsZURlc2NyaXB0aW9uJywgbGFiZWw6ICdGaWxlIERlc2MnLCBzb3J0YWJsZTogdHJ1ZSwgYWxpZ246ICdsZWZ0J30sXG4gICAgICAgIHtoZWFkZXJOYW1lOiAnRmlsZSBTaXplJywgZmllbGQ6IChyb3cpID0+IHV0aWxzLmZvcm1hdFN0b3JhZ2VTaXplKHJvdy5maWxlU2l6ZSksIGxhYmVsOiAnRmlsZSBTaXplJywgc29ydGFibGU6IHRydWUsIGFsaWduOiAnbGVmdCd9LFxuICAgICAgXSxcbiAgICAgIHZpZXdlckRpYWxvZ1RpdGxlOiAnJyxcbiAgICAgIHZpZXdlckRpYWxvZ01vZGVsOiB7fSxcbiAgICAgIHN0YXR1c0ZpbGVWaWV3ZXJEaWFsb2dPcGVuOiBmYWxzZSxcbiAgICB9O1xuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5pbml0aW5nU3VjY2VzcyA9IHRydWU7XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKCkge1xuICAgICAgaWYgKCF0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0sXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGNsb3NlKCkge1xuICAgICAgdGhpcy4kZW1pdCgnY2FuY2VsJyk7XG4gICAgfSxcblxuICAgIHZpZXdTdGF0dXNGaWxlKGZpbGVJbmZvKSB7XG4gICAgICB0aGlzLmhhbmRsZVZpZXdGaWxlKCdTdGF0dXMgRmlsZTogJyArIGZpbGVJbmZvLmZpbGVOYW1lLCBmaWxlSW5mbywgJ3N0YXR1c0ZpbGUnKTtcbiAgICB9LFxuICAgIGFzeW5jIGdldE9wZW5hYmxlVXJsKGZpbGVJbmZvKSB7XG4gICAgICBpZiAoZmlsZUluZm8udXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgICAgICByZXR1cm4gZmlsZUluZm8udXJsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZpbGVJbmZvLm9wZW5hYmxlVXJsKSB7XG4gICAgICAgICAgcmV0dXJuIGZ
2788pbGVJbmZvLm9wZW5hYmxlVXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMucHJvY2Vzc0Zvcm0oXG4gICAgICAgICAgYXN5bmMgKCkgPT5cbiAgICAgICAgICAgIGF3YWl0IGFwaS5vcGVuRmlsZSh7XG4gICAgICAgICAgICAgIHJ1bklkOiBmaWxlSW5mby5ydW5JZCxcbiAgICAgICAgICAgICAgam9iSWQ6IHRoaXMuam9iSWQsXG4gICAgICAgICAgICAgIHVybDogZmlsZUluZm8udXJsLFxuICAgICAgICAgICAgICBsb2NhdGlvbjogZmlsZUluZm8ubG9jYXRpb24sXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXNwKSB7XG4gICAgICAgICAgLy8gZmlsZUluZm8ub3BlbmFibGVVcmwgPSByZXNwLnVybDtcbiAgICAgICAgICByZXR1cm4gcmVzcC51cmw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgaGFuZGxlVmlld0ZpbGUodGl0bGUsIGZpbGVJbmZvLCBmaWxlVHlwZSkge1xuICAgICAgaWYgKGZpbGVJbmZvLnVybC5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgICAgdXRpbHMub3BlblVybChmaWxlSW5mby51cmwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVybCA9IGF3YWl0IHRoaXMuZ2V0T3BlbmFibGVVcmwoZmlsZUluZm8pO1xuICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnZpZXdlckRpYWxvZ1RpdGxlID0gdGl0bGU7XG4gICAgICB0aGlzLnZpZXdlckRpYWxvZ01vZGVsID0ge1xuICAgICAgICAuLi5maWxlSW5mbyxcbiAgICAgICAgLi4ue3ZpZXdVcmw6IHVybH0sXG4gICAgICB9O1xuICAgICAgdGhpcy5zdGF0dXNGaWxlVmlld2VyRGlhbG9nT3BlbiA9IHRydWU7XG4gICAgfSxcbiAgICBhc3luYyBkb3dubG9hZEZpbGUoZmlsZUluZm8pIHtcbiAgICAgIGxldCB1cmwgPSBhd2FpdCB0aGlzLmdldE9wZW5hYmxlVXJsKGZpbGVJbmZvKTtcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgaWYgKHVybC5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgICAgICB1dGlscy5vcGVuVXJsKHVybCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGNhblZpZXdGaWxlKGZpbGVJbmZvKSB7XG4gICAgICByZXR1cm4gdXRpbHMuY2FuVmlld0ZpbGUoZmlsZUluZm8pO1xuICAgIH0sXG4gIH0sXG59O1xuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGU+XG4gIDxkaXY+XG4gICAgPEljb25cbiAgICAgIHYtaWY9XCIocm93LnN0YXR1c1VybHMgJiYgcm93LnN0YXR1c1VybHMubGVuZ3RoID4gMCkgfHwgKHJvdy5lcnJvclN1bW1hcnlVcmxzICYmIHJvdy5lcnJvclN1bW1hcnlVcmxzLmxlbmd0aCA+IDApXCJcbiAgICAgIG5hbWU9XCJsaWJyYXJ5X2Jvb2tzXCJcbiAgICAgIEBjbGljaz1cInZpZXdGaWxlc1wiXG4gICAgICBjbGlja2FibGVcbiAgICAvPlxuXG4gICAgPE9iamVjdEZpbGVzRGlhbG9nXG4gICAgICB0aXRsZT1cIlN0YXR1cyBGaWxlc1wiXG4gICAgICB2LW1vZGVsPVwiZmlsZXNEaWFsb2dPcGVuXCJcbiAgICAgIDpzdGF0dXNGaWxlcz1cInJvdy5zdGF0dXNVcmxzXCJcbiAgICAgIDplcnJvckZpbGVzPVwicm93LmVycm9yU3VtbWFyeVVybHNcIlxuICAgICAgQGNhbmNlbD1cImZpbGVzRGlhbG9nT3BlbiA9IGZhbHNlXCJcbiAgICAgIEBjbG9zZT1cImZpbGVzRGlhbG9nT3BlbiA9IGZhbHNlXCJcbiAgICAvPlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG4vLyBpbXBvcnQgVnVlIGZyb20gJ3Z1ZSc7XG5pbXBvcnQgT2JqZWN0RmlsZXNEaWFsb2cgZnJvbSAnLi9PYmplY3RGaWxlc0RpYWxvZy52dWUnO1xuaW1wb3J0IG1peGlucyBmcm9tICdzcmMvbWl4aW5zL21peGlucyc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbbWl4aW5zXSxcblxuICBjb21wb25lbnRzOiB7T2JqZWN0RmlsZXNEaWFsb2d9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5yb3cgPSB0aGlzLnBhcmFtcy5kYXRhIHx8IHt9O1xuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJvdzoge30sXG4gICAgICBmaWxlc0RpYWxvZ09wZW46IGZhbHNlLFxuICAgIH07XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHZpZXdGaWxlcygpIHtcbiAgICAgIHRoaXMuZmlsZXNEaWFsb2dPcGVuID0gdHJ1ZTtcbiAgICB9LFxuICB9LFxufTtcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2IHYtaWY9XCJzaG93KHBhcmFtcyAmJiBwYXJhbXMuZGF0YSAmJiBwYXJhbXMuZGF0YS5zdGF0dXMpXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAycHhcIj5cbiAgICA8U3luY1N0YXR1cyA6c3RhdHVzPVwicGFyYW1zLmRhdGEuc3RhdHVzXCIgOnJ1blN0YXR1cz1cInBhcmFtcy5kYXRhLnJ1blN0YXR1c1wiIHNpemU9XCJ4c1wiIHN0eWxlPVwiaGVpZ2h0OiAyMnB4ICFpbXBvcnRhbnRcIiAvPlxuICA8L2Rpdj5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgU3luY1N0YXR1cyBmcm9tICdzcmMvY29tcG9uZW50cy9TeW5jU3RhdHVzLnZ1ZSc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgcHJvcHM6IHtcbiAgICBwYXJhbXM6IE9iamVjdCxcbiAgfSxcbiAgY29tcG9uZW50czoge1N5bmNTdGF0dXN9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBzaG93KGRhdGEpIHtcbiAgICAgIGlmIChkYXRhKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICB9LFxufTtcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlPlxuICA8Q29udGVudERpYWxvZ1xuICAgIDp0aXRsZT1cImAke3RpdGxlIHx8ICdNZXNzYWdlJ31gXCJcbiAgICA6bW9kZWxWYWx1ZT1cIm1vZGVsVmFsdWVcIlxuICAgIEB1cGRhdGU6bW9kZWxWYWx1ZT1cIiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScpXCJcbiAgICA6bWVz
2788c2FnZT1cIm1lc3NhZ2VcIlxuICAgIDptZXNzYWdlVHlwZT1cIm1lc3NhZ2VUeXBlXCJcbiAgICA6aW5pdGluZz1cImluaXRpbmdcIlxuICAgIDppbml0aW5nU3VjY2Vzcz1cImluaXRpbmdTdWNjZXNzXCJcbiAgICA6cHJvY2Vzc2luZz1cInByb2Nlc3NpbmdcIlxuICAgIDpwcm9jZXNzaW5nQ2FuY2VsbGFibGU9XCJwcm9jZXNzaW5nQ2FuY2VsbGFibGVcIlxuICAgIGhlaWdodD1cImF1dG9cIlxuICAgIHdpZHRoPVwiMTIwMHB4XCJcbiAgICBjbG9zZU1vZGVcbiAgICA6cGVyc2lzdGVudD1cImZhbHNlXCJcbiAgPlxuICAgIDxQYXJhIGNsYXNzPVwibWVzc2FnZSB0ZXh0LWJvZHkxXCI+e3sgZXJyb3JNZXNzYWdlIH19PC9QYXJhPlxuICAgIDx0ZW1wbGF0ZSB2LXNsb3Q6YnV0dG9ucy1yaWdodD5cbiAgICAgIDxCdXR0b24gdi1jbGlwYm9hcmQ6Y29weT1cImVycm9yTWVzc2FnZVwiIEBjbGljaz1cImNvcHlNZXNzYWdlXCIgb3V0bGluZSA6ZnVsbFdpZHRoPVwiJHEuc2NyZWVuLnhzXCI+Q29weTwvQnV0dG9uPlxuICAgICAgPEJ1dHRvbiBAY2xpY2s9XCJjbG9zZVwiIDpmdWxsV2lkdGg9XCIkcS5zY3JlZW4ueHNcIj5DbG9zZTwvQnV0dG9uPlxuICAgIDwvdGVtcGxhdGU+XG4gIDwvQ29udGVudERpYWxvZz5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICdzcmMvc2VydmljZXMvdXRpbHMnO1xuaW1wb3J0IG1peGlucyBmcm9tICdzcmMvbWl4aW5zL21peGlucyc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbbWl4aW5zXSxcblxuICBwcm9wczoge1xuICAgIHRpdGxlOiBTdHJpbmcsXG4gICAgZXJyb3JNZXNzYWdlOiBTdHJpbmcsXG4gICAgbW9kZWxWYWx1ZTogQm9vbGVhbixcbiAgfSxcbiAgZW1pdHM6IFsnb2snLCAndXBkYXRlOm1vZGVsVmFsdWUnXSxcbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge307XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKCkge1xuICAgICAgaWYgKCF0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmluaXRpbmdTdWNjZXNzID0gdHJ1ZTtcbiAgICB9LFxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICB2YWx1ZUxhYmVscygpIHtcbiAgICAgIHJldHVybiB1dGlscy52YWx1ZUxhYmVscztcbiAgICB9LFxuICAgIGNvcHlNZXNzYWdlKCkge1xuICAgICAgdXRpbHMubm90aWZ5SW5mbygnQ29waWVkIScpO1xuICAgIH0sXG4gICAgY2xvc2UoKSB7XG4gICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIGZhbHNlKTtcbiAgICB9LFxuICB9LFxufTtcbjwvc2NyaXB0PlxuPHN0eWxlPlxu
2788Lm1lc3NhZ2Uge1xuICBmb250LWZhbWlseTogJ01vbmFjbycsICdDb25zb2xhcycsICdDb3VyaWVyIE5ldycsICcuU0YgTlMgTW9ubycsICdBbmRhbGUgTW9ubycsICdEcm9pZCBTYW5zIE1vbm8nLCAnSmV0QnJhaW5zIE1vbm8nLCAnbW9ub3NwYWNlJywgJ01vbm9zcGFjZWQnO1xufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdiBzdHlsZT1cImhlaWdodDogNzB2aFwiPlxuICAgIDxhZy1ncmlkLXZ1ZVxuICAgICAgY2xhc3M9XCJhZy10aGVtZS1iYWxoYW1cIlxuICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlXCJcbiAgICAgIDpjb2x1bW5EZWZzPVwiY29sdW1uc1wiXG4gICAgICBAZ3JpZC1yZWFkeT1cIm9uR3JpZFJlYWR5XCJcbiAgICAgIDpkZWZhdWx0Q29sRGVmPVwiZGVmYXVsdENvbERlZlwiXG4gICAgICA6dHJlZURhdGE9XCJ0cnVlXCJcbiAgICAgIDpncm91cERlZmF1bHRFeHBhbmRlZD1cImdyb3VwRGVmYXVsdEV4cGFuZGVkXCJcbiAgICAgIDpnZXREYXRhUGF0aD1cImdldERhdGFQYXRoXCJcbiAgICAgIDpnZXRSb3dJZD1cImdldFJvd0lkXCJcbiAgICAgIDpyb3dEYXRhPVwicm93RGF0YVwiXG4gICAgICA6cm93SGVpZ2h0PVwicm93SGVpZ2h0XCJcbiAgICAgIDphdXRvR3JvdXBDb2x1bW5EZWY9XCJhdXRvR3JvdXBDb2x1bW5EZWZcIlxuICAgICAgOmF1dG9TaXplU3RyYXRlZ3k9XCJhdXRvU2l6ZVN0cmF0ZWd5XCJcbiAgICAgIEBjZWxsLWNsaWNrZWQ9XCJjZWxsQ2xpY2tIYW5kbGVcIlxuICAgICAgOnN1cHByZXNzQ29udGV4dE1lbnU9XCJ0cnVlXCJcbiAgICA+PC9hZy1ncmlkLXZ1ZT5cbiAgICA8Vmlld01lc3NhZ2VEaWFsb2cgdi1tb2RlbD1cInZpZXdFcnJvck1lc3NhZ2VEaWFsb2dPcGVuXCIgOmVycm9yTWVzc2FnZT1cInZpZXdFcnJvck1lc3NhZ2VEaWFsb2dEYXRhXCIgdGl0bGU9XCJEZXRhaWxzXCIgLz5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cbmltcG9ydCAnYWctZ3JpZC1jb21tdW5pdHkvc3R5bGVzL2FnLWdyaWQuY3NzJztcbmltcG9ydCAnYWctZ3JpZC1lbnRlcnByaXNlJztcbmltcG9ydCB7QWdHcmlkVnVlfSBmcm9tICdhZy1ncmlkLXZ1ZTMnO1xuaW1wb3J0IHtvbkJlZm9yZU1vdW50LCByZWYsIHdhdGNofSBmcm9tICd2dWUnO1xuaW1wb3J0IHtKc09iakFueSwgUmVhbEFueX0gZnJvbSAnQGRhdGFzZXJ0L2pzLXV0aWxzL2Rpc3QvbW9kZWxzJztcbmltcG9ydCB7UGxhaW5PYmplY3R9IGZyb20gJ3NyYy9zZXJ2aWNlcy91dGlscyc7XG5pbXBvcnQgVGFza1J1bkRldGFpbEFjdGlvbiBmcm9tICdzcmMvcHJvZHVjdHMvcmVhbHRhc2svcGFnZXMvcnVucy9UYXNrUnVuRGV0YWlsQWN0aW9uLnZ1ZSc7XG5pbXBvcnQgVHJlZUdyaWRTdGF0dXNSZW5kZXJlciBmcm9tICdzcmMvY29tcG9uZW50cy9UcmVlR3JpZFN0YXR1c1JlbmRlcmVyLnZ1ZSc7XG5pbXBvcnQge2luaXRBZ0xpY2Vuc2V9IGZyb20gJ3NyYy9zZXJ2aWNlcy9saWNlbnNlJztcbmltcG9ydCB7U2ZkY09yZ0RlcGxveX0gZnJvbSAnQGRhdGFzZXJ0L2pzLXV0aWxzL2Rpc3QvbW9kZWxzTXMnO1xuaW1wb3J0IFZpZXdNZXNzYWdlRGlhbG9nIGZyb20gJy4vVmlld01lc3NhZ2VEaWFsb2cudnVlJztcbmluaXRBZ0xpY2Vuc2UoKTtcblxuaW50ZXJmYWNlIFByb3BzIHtcbiAgZGF0YTogUGxhaW5PYmplY3Q8YW55PltdO1xuICByb3dIZWlnaHQ/OiBudW1iZXI7XG59XG5cbmNvbnN0IHByb3BzID0gd2l0aERlZmF1bHRzKGRlZmluZVByb3BzPFByb3BzPigpLCB7cm93SGVpZ2h0OiAzNX0pO1xuXG5jb25zdCBjb2x1bW5zID0gW1xuICB7aGVhZGVyTmFtZTogJyMnLCBmaWVsZDogJ251bScsIHdpZHRoOiA1MCwgYWxpZ246ICdjZW50ZXInLCBwaW5uZWQ6IHRydWUsIGZpbHRlcjogZmFsc2UsIGZsb2F0aW5nRmlsdGVyOiBmYWxzZX0sXG4gIHtcbiAgICBoZWFkZXJOYW1lOiAnQWN0aW9ucycsXG4gICAgZmllbGQ6ICdhY3Rpb25zJyxcbiAgICBjZWxsUmVuZGVyZXI6IFRhc2tSdW5EZXRhaWxBY3Rpb24sXG4gICAgd2lkdGg6IDUwLFxuICAgIHBpbm5lZDogJ2xlZnQnLFxuICAgIGZpbHRlcjogZmFsc2UsXG4gICAgZmxvYXRpbmdGaWx0ZXI6IGZhbHNlLFxuICB9LFxuICB7XG4gICAgaGVhZGVyTmFtZTogJ1N0YXR1cycsXG4gICAgZmllbGQ6ICdzdGF0dXMnLFxuICAgIHdpZHRoOiAxNTAsXG4gICAgY2VsbFJlbmRlcmVyOiBUcmVlR3JpZFN0YXR1c1JlbmRlcmVyLFxuICAgIGNlbGxSZW5kZXJlclBhcmFtczogKHBhcmFtczoge2RhdGE6IGFueX0pID0+IHtcbiAgICAgIHJldHVybiB7cGFyYW1zOiBwYXJhbXMuZGF0YX07XG4gICAgfSxcbiAgfSxcblxuICB7aGVhZGVyTmFtZTogJ1R5cGUnLCBmaWVsZDogJ2hpZXJhcmNoeVR5cGUnLCB3aWR0aDogMTAwfSxcbiAge2hlYWRlck5hbWU6ICdMZXZlbCcsIGZpZWxkOiAncmVjb3JkTGV2ZWwnLCB3aWR0aDogMTAwLCBhbGlnbjogJ2NlbnRlcid9LFxuICB7aGVhZGVyTmFtZTogJ0NvcHkgT3JkZXInLCBmaWVsZDogJ29yZGVyJywgd2lkdGg6IDE0MCwgYWxpZ246ICdjZW50ZXInfSxcbiAge2hlYWRlck5hbWU6ICdFcnJvciBUeXBlJywgZmllbGQ6ICdlcnJvclR5cGVzJywgd2lkdGg6IDE0MCwgYWxpZ246ICdjZW50ZXInfSxcbiAge2hlYWRlck5hbWU6ICdUb3RhbCcsIGZpZWxkOiAndG90YWwnLCB3aWR0aDogOTAsIGFsaWduOiAnY2VudGVyJ30sXG4gIHtoZWFkZXJOYW1lOiAnRXJyb3JzJywgZmllbGQ6ICdlcnJvcnMnLCB3aWR0aDogOTAsIGFsaWduOiAnY2VudGVyJ30sXG4gIHtoZWFkZXJOYW1lOiAnSW5zZXJ0cycsIGZpZWxkOiAnaW5zZXJ0cycsIHdpZHRoOiA5MCwgYWxpZ246ICdjZW50ZXInfSxcbiAge2hlYWRlck5hbWU6ICdVcGRhdGVzJywgZmllbGQ6ICd1cGRhdGVzJywgd2lkdGg6IDkwLCBhbGlnbjogJ2NlbnRlcid9LFxuICB7aGVhZGVyTmFtZTogJ1NraXBwZWQnLCBmaWVsZDogJ3NraXBwZWQnLCB3aWR0aDogOTAsIGFsaWduOiAnY2VudGVyJ30sXG4gIHtoZWFkZXJOYW1lOiAnQ3VtdWxhdGl2ZSBUb3RhbCcsIGZpZWxkOiAndG90YWxSb2xsdXAnLCB3aWR0aDogMTYwfSxcbiAge2hlYWRlck5hbWU6ICdEdXJhdGlvbicsIGZpZWxkOiAnZHVyYXRpb24nLCB3aWR0aDogMTIwLCBhbGlnbjogJ2Nlbn
2788Rlcid9LFxuICB7aGVhZGVyTmFtZTogJ0R1cmF0aW9uIFJvbGx1cCcsIGZpZWxkOiAnZHVyYXRpb25Sb2xsdXAnLCB3aWR0aDogMTUwfSxcbiAge2hlYWRlck5hbWU6ICdNZXNzYWdlJywgZmllbGQ6ICdtZXNzYWdlJ30sXG4gIC8vIHtoZWFkZXJOYW1lOiAnRGV0YWlscycsIGZpZWxkOiAnZGV0YWlscyd9LFxuXTtcblxuY29uc3QgZ3JpZEFwaSA9IHJlZigpO1xuY29uc3QgZGVmYXVsdENvbERlZiA9IHJlZih7XG4gIHJlc2l6YWJsZTogdHJ1ZSxcbiAgZmlsdGVyOiB0cnVlLFxuICBmbG9hdGluZ0ZpbHRlcjogdHJ1ZSxcbn0pO1xuY29uc3QgYXV0b0dyb3VwQ29sdW1uRGVmID0gcmVmKCk7XG5jb25zdCBncm91cERlZmF1bHRFeHBhbmRlZCA9IHJlZigpO1xuY29uc3QgZ2V0Um93SWQgPSByZWYoKTtcbmNvbnN0IHJvd0RhdGEgPSByZWYoKTtcbmNvbnN0IGF1dG9TaXplU3RyYXRlZ3kgPSByZWYoKTtcbmNvbnN0IHZpZXdFcnJvck1lc3NhZ2VEaWFsb2dPcGVuID0gcmVmKGZhbHNlKTtcbmNvbnN0IHZpZXdFcnJvck1lc3NhZ2VEaWFsb2dEYXRhID0gcmVmKCcnKTtcbmNvbnN0IE1lc3NhZ2UgPSAnTWVzc2FnZSc7XG5cbm9uQmVmb3JlTW91bnQoKCkgPT4ge1xuICBhdXRvR3JvdXBDb2x1bW5EZWYudmFsdWUgPSB7XG4gICAgaGVhZGVyTmFtZTogJ09iamVjdCcsXG4gICAgd2lkdGg6IDQwMCxcbiAgICBjZWxsUmVuZGVyZXJQYXJhbXM6IHtcbiAgICAgIHN1cHByZXNzQ291bnQ6IHRydWUsXG4gICAgfSxcbiAgfTtcblxuICBncm91cERlZmF1bHRFeHBhbmRlZC52YWx1ZSA9IC0xO1xuICBnZXRSb3dJZC52YWx1ZSA9IChwYXJhbXM6IHtkYXRhOiB7aWQ6IGFueX19KSA9PiBwYXJhbXMuZGF0YS5pZDtcbiAgcm93RGF0YS52YWx1ZSA9IHByb2Nlc3NEYXRhKHByb3BzLmRh
2788dGEpO1xuICBhdXRvU2l6ZVN0cmF0ZWd5LnZhbHVlID0ge3R5cGU6ICdmaXRHcmlkV2lkdGgnfTtcbn0pO1xuXG53YXRjaChcbiAgKCkgPT4gcHJvcHMuZGF0YSxcbiAgKGRhdGEpID0+IHJlZnJlc2goZGF0YSksXG4gIHtkZWVwOiB0cnVlfVxuKTtcblxuZnVuY3Rpb24gZ2V0RGF0YVBhdGgoZGF0YTogYW55KSB7XG4gIHJldHVybiBkYXRhLmRhdGFQYXRoO1xufVxuXG5mdW5jdGlvbiBvbkdyaWRSZWFkeShwYXJhbXM6IFJlYWxBbnkpIHtcbiAgZ3JpZEFwaS52YWx1ZSA9IHBhcmFtcy5hcGk7XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2goZGF0YTogUGxhaW5PYmplY3Q8UmVhbEFueT5bXSA9IHByb3BzLmRhdGEpIHtcbiAgcm93RGF0YS52YWx1ZSA9IHByb2Nlc3NEYXRhKGRhdGEpO1xuICBpZiAoZ3JpZEFwaS52YWx1ZSkge1xuICAgIGdyaWRBcGkudmFsdWUuc2V0Um93RGF0YShyb3dEYXRhLnZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzRGF0YShkYXRhOiBhbnkpIHtcbiAgY29uc3QgZmxhdHRlbmVkRGF0YTogYW55W10gPSBbXTtcbiAgY29uc3QgZmxhdHRlblJvd1JlY3Vyc2l2ZSA9IChyb3c6IEpzT2JqQW55LCBwYXJlbnRQYXRoOiBKc09iakFueVtdKSA9PiB7XG4gICAgY29uc3QgZGF0YVBhdGggPSBbLi4ucGFyZW50UGF0aCwgcm93Lm5hbWVdO1xuICAgIGZsYXR0ZW5lZERhdGEucHVzaCh7Li4ucm93LCBkYXRhUGF0aH0pO1xuICAgIGlmIChyb3cuY2hpbGRyZW4pIHtcbiAgICAgIHJvdy5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogSnNPYmpBbnkpID0+IGZsYXR0ZW5Sb3dSZWN1cnNpdmUoY2hpbGQsIGRhdGFQYXRoKSk7XG4gICAgfVxuICB9O1xuICBkYXRhLmZvckVhY2goKHJvdzogSnNPYmpBbnkpID0+IGZsYXR0ZW5Sb3dSZWN1cnNpdmUocm93LCBbXSkpO1xuICByZXR1cm4gZmxhdHRlbmVkRGF0YTtcbn1cblxuZnVuY3Rpb24gY2VsbENsaWNrSGFuZGxlKGV2ZW50OiBKc09iakFueSkge1xuICBpZiAoZXZlbnQuY29sRGVmLmhlYWRlck5hbWUgPT09IE1lc3NhZ2UgJiYgZXZlbnQuZGF0YS5tZXNzYWdlKSB7XG4gICAgdmlld0Vycm9yTWVzc2FnZURpYWxvZ0RhdGEudmFsdWUgPSBldmVudC5kYXRhLmRldGFpbHM7XG4gICAgdmlld0Vycm9yTWVzc2FnZURpYWxvZ09wZW4udmFsdWUgPSB0cnVlO1xuICB9XG59XG5cbmRlZmluZUV4cG9zZSh7cmVmcmVzaH0pO1xuPC9zY3JpcHQ+XG48c3R5bGU+XG5AaW1wb3J0ICcuLi8uLi9ub2RlX21vZHVsZXMvYWctZ3JpZC1jb21tdW5pdHkvc3R5bGVzL2FnLWdyaWQuY3NzJztcbkBpbXBvcnQgJy4uLy4uL25vZGVfbW9kdWxlcy9hZy1ncmlkLWNvbW11bml0eS9zdHlsZXMvYWctdGhlbWUtYmFsaGFtLmNzcyc7XG5cbiNhZy1HcmlkLUF1dG9Db2x1bW4ge1xuICBwYWRkaW5nOiAwcHggIWltcG9ydGFudDtcbn1cblxuLmFnLXRoZW1lLWJhbGhhbS1kYXJrIHtcbiAgLS1hZy1yb3ctZ3JvdXAtaW5kZW50LXNpemU6IDEwcHggIWltcG9ydGFudDtcbn1cblxuLmFnLWx0ciAuYWctZ3JvdXAtY29udHJhY3RlZCxcbi5hZy1sdHIgLmFnLWdyb3VwLWV4cGFuZGVkIHtcbiAgbWFyZ2luLXJpZ2h0OiAzcHggIWltcG9ydGFudDtcbn1cblxuLmFnLXRoZW1lLWJhbGhhbSB7XG4gIC0tYWctcm93LWdyb3VwLWluZGVudC1zaXplOiAxMHB4ICFpbXBvcnRhbnQ7XG4gIGZvbnQtc2l6ZTogMTdweDtcbiAgZm9udC1mYW1pbHk6XG4gICAgJ1NvdXJjZSBTYW5zIFBybycsICdNb25hY28nLCAnQ29uc29sYXMnLCAnQ291cmllciBOZXcnLCAnLlNGIE5TIE1vbm8nLCAnQW5kYWxlIE1vbm8nLCAnRHJvaWQgU2FucyBNb25vJywgJ0pldEJyYWlucyBNb25vJywgJ21vbm9zcGFjZScsXG4gICAgJ01vbm9zcGFjZWQnO1xufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPENvbnRlbnREaWFsb2dcbiAgICA6dGl0bGU9XCJ0aXRsZVwiXG4gICAgOm1vZGVsVmFsdWU9XCJtb2RlbFZhbHVlXCJcbiAgICBAdXBkYXRlOm1vZGVsVmFsdWU9XCIkZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCAkZXZlbnQpXCJcbiAgICA6aW5pdGluZz1cImluaXRpbmdcIlxuICAgIDppbml0aW5nU3VjY2Vzcz1cImluaXRpbmdTdWNjZXNzXCJcbiAgICA6cHJvY2Vzc2luZz1cInByb2Nlc3NpbmdcIlxuICAgIGhlaWdodD1cImF1dG9cIlxuICAgIHdpZHRoPVwiOTB2d1wiXG4gICAgY2xvc2VNb2RlXG4gICAgOnBlcnNpc3RlbnQ9XCJmYWxzZVwiXG4gID5cbiAgICA8dGVtcGxhdGUgdi1pZj1cImluaXRpbmdTdWNjZXNzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93IGl0ZW1zLWNlbnRlciBuby13cmFwIHEtcGIteHNcIj5cbiAgICAgICAgPEljb24gbmFtZT1cInJlZnJlc2hcIiBAY2xpY2s9XCJyZWZyZXNoKClcIiBjbGlja2FibGUgLz5cbiAgICAgICAgPHEtdGFicyB2LW1vZGVsPVwiY3VycmVudFRhYlwiIGFsaWduPVwibGVmdFwiIGRlbnNlIG5vLWNhcHMgaW5kaWNhdG9yLWNvbG9yPVwicHJpbWFyeVwiIGNsYXNzPVwiY29sIHEtbWwtc21cIj5cbiAgICAgICAgICA8cS10YWIgbmFtZT1cImhpZXJhcmNoeVwiIGxhYmVsPVwiT2JqZWN0cyBIaWVyYXJjaHlcIiAvPlxuICAgICAgICAgIDxxLXRhYiBuYW1lPVwic3VtbWFyeVwiIGxhYmVsPVwiT2JqZWN0cyBTdW1tYXJ5XCIgLz5cbiAgICAgICAgPC9xLXRhYnM+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxxLXRhYi1wYW5lbHMgdi1tb2RlbD1cImN1cnJlbnRUYWJcIiBrZWVwLWFsaXZlPlxuICAgICAgICA8cS10YWItcGFuZWwgbmFtZT1cImhpZXJhcmNoeVwiPlxuICAgICAgICAgIDxBZ0dyaWRUcmVlRGF0YSByZWY9XCJoaWVyYXJjaHlHcmlkXCIgOmRhdGE9XCJkYXRhU291cmNlXCIgOmNvbHVtbnM9XCJjb2x1bW5zXCIgLz5cbiAgICAgICAgPC9xLXRhYi1wYW5lbD5cbiAgICAgICAgPHEtdGFiLXBhbmVsIG5hbWU9XCJzdW1tYXJ5XCI+XG4gICAgICAgICAgPERhdGFDb3B5T2JqZWN0c1N1bW1hcnlEaWFsb2cgcmVmPVwic3VtbWFyeUdyaWRcIiA6bW9kZWw9XCJvYmplY3RzU3VtbWFyeURpYWxvZ01vZGVsXCIgOmpvYklkPVwiam9iSWRcIiA6cnVuSWQ9XCJydW4uaWRcIiAvPlxuICAgICAgICA8L3EtdGFiLXBhbmVsPlxuICAgICAgPC9xLXRhYi1wYW5lbHM+XG4gICAgPC90ZW1wbGF0ZT5cbiAgPC9Db250ZW50RGlhbG9nPlxuPC90ZW1wbGF0ZT5cbjxzY3JpcHQ+XG5pbXBvcnQgbWl4aW5zIGZyb20gJ3NyYy9taXhpbnMvbWl4aW5zJztcbmltcG9ydCB7Z2VuZXJhdGVJZDIsIHNvcnRJY30gZnJvbSAnc3JjL3NlcnZpY2VzL3V0aWxzJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJ3NyYy9zZXJ2aWNlcy91dGlscyc7XG5pbXBvcnQge3RvSHVtYW5FbGFwc2VkVGltZX0gZnJvbSAnQGRhdGFzZXJ0L2pzLXV0aWxzL2Rpc3QvanNVdGlscyc7XG5pbXBvcnQgKiBhcyBydEFwaSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hcGknO1xuaW1wb3J0IERhdGFDb3B5T2JqZWN0c1N1bW1hcnlEaWFsb2cgZnJvbSAncmVhbHRhc2svcGFnZXMvcnVucy9EYXRhQ29weU9iamVjdHNTdW1tYXJ5RGlhbG9nLnZ1ZSc7XG5pbXBvcnQgQWdHcmlkVHJlZURhdGEgZnJvbSAnc3JjL2NvbXBvbmVudHMvQWdHcmlkVHJlZURhdGEudnVlJztcblxuY29uc3QgaWNvblN1Y2Nlc3MgPVxuICAnPGkgYXJpYS1oaWRkZW49XCJ0cnVlXCIgcm9sZT1cInByZXNlbnRhdGlvblwiIGNsYXNzPVwicS1wYi14cyBtYXRlcmlhbC1pY29ucyBxLWljb24gbm90cmFuc2xhdGUgdGV4dC1wb3NpdGl2ZSByLWljb24gc2l6ZS14c1wiIHN0eWxlPVwiZm9udC1zaXplOiAxOHB4O1wiPmNoZWNrX2NpcmNsZTwvaT4nO1xuY29uc3QgaWNvbkVycm9yID1cbiAgJzxpIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHJvbGU9XCJwcmVzZW50YXRpb25cIiBjbGFzcz1cInEtcGIteHMgbWF0ZXJpYWwtaWNvbnMgcS1pY29uIG5vdHJhbnNsYXRlIHRleHQtbmVnYXRpdmUgci1pY29uIHNpemUteHNcIiBzdHlsZT1cImZvbnQtc2l6ZTogMThweDtcIj5lcnJvcjwvaT4nO1xuY29uc3QgaWNvbldhcm4gPVxuICAnPGkgYXJpYS1oaWRkZW49XCJ0cnVlXCIgcm9sZT1cInByZXNlbnRhdGlvblwiIGNsYXNzPVwicS1wYi14cyBtYXRlcmlhbC1pY29ucyBxLWljb24gbm90cmFuc2xhdGUgdGV4dC13YXJuaW5nIHItaWNvbiBzaXplLXhzXCIgc3R5bGU9XCJmb250LXNpemU6IDE4cHg7XCI+d2FybmluZzwvaT4nO1xuY29uc3QgaWNvblByb2Nlc3NpbmcgPVxuICAnPGkgYXJpYS1oaWRkZW49XCJ0cnVlXCIgcm9sZT1cInByZXNlbnRhdGlvblwiIGNsYXNzPVwicS1wYi14cyBtYXRlcmlhbC1pY29ucyBxLWljb24gbm90cmFuc2xhdGUgdGV4dC1ibHVlLTkgci1pY29uIHNpemUteHNcIiBzdHlsZT1cImZvbnQtc2l6ZTogMThweDtcIj5zd2FwX3ZlcnRpY2FsX2NpcmNsZTwvaT4nO1xuXG5jb25zdCBpY29ucyA9IHtcbiAgY29tcGxldGVkOiBpY29uU3VjY2VzcyxcbiAgZXJyb3I6IGljb25FcnJvcixcbiAgY29tcGxldGVkV2l0aEVycm9yczogaWNvbldhcm4sXG4gIHByb2Nlc3Npbmc6IGljb25Qcm9jZXNzaW5nLFxufTtcblxuZnVuY3Rpb24gZ2V0VGl0bGUodGFzaykge1xuICByZXR1cm4gYERhdGEgQ29weSBUYXNrIERldGFpbHMgLSAke3V0aWxzLnZhbHVlTGFiZWxzLnN0YXR1c1t0YXNrLnN0YXR1c119YDtcbn1cblxubGV0IHJvd051bUNvdW50ID0gMDtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFttaXhpbnNdLFxuICBjb21wb25lbnRzOiB7XG4gICAgQWdHcmlkVHJlZURhdGEsXG4gICAgRGF0YUNvcHlPYmplY3RzU3VtbWFyeURpYWxvZyxcbiAgfSxcbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiBCb29sZWFuLFxuICAgIGpvYklkOiBTdHJpbmcsXG4gICAgdGFzazogT2JqZWN0LFxuICAgIHJ1bjogT2JqZWN0LFxuICB9LFxuICBlbWl0czogWydjYW5jZWwnLCAndXBkYXRlOm1vZGVsVmFsdWUnXSxcbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXJ1bjogdGhpcy5ydW4sXG4gICAgICBpdGFzazogdGhpcy50YXNrLFxuICAgICAgZGF0YVNvdXJjZTogW10sXG4gICAgICB0aXRsZTogZ2V0VGl0bGUodGhpcy50YXNrKSxcbiAgICAgIGN1cnJlbnRUYWI6ICdoaWVyYXJjaHknLFxuICAgICAgb2JqZWN0c1N1bW1hcnlEaWFsb2dNb2RlbDoge30sXG4gICAgICBjb2x1bW5zOiBbXG4gICAgICAgI
2788Ht0aXRsZTogJ09iamVjdCcsIGtleTogJ25hbWUnLCB3aWR0aDogNTAwfSxcbiAgICAgICAge3RpdGxlOiAnU3RhdHVzJywga2V5OiAnc3RhdHVzJywgd2lkdGg6IDE1MH0sXG4gICAgICAgIHt0aXRsZTogJ1R5cGUnLCBrZXk6ICdoaWVyYXJjaHlUeXBlJywgd2lkdGg6IDEwMH0sXG4gICAgICAgIHt0aXRsZTogJ0xldmVsJywga2V5OiAncmVjb3JkTGV2ZWwnLCB3aWR0aDogODAsIGFsaWduOiAnY2VudGVyJ30sXG4gICAgICAgIHt0aXRsZTogJ0NvcHkgT3JkZXInLCBrZXk6ICdvcmRlcicsIHdpZHRoOiAxMjAsIGFsaWduOiAnY2VudGVyJ30sXG4gICAgICAgIHt0aXRsZTogJ0Vycm9yIFR5cGUnLCBrZXk6ICdlcnJvclR5cGVzJywgd2lkdGg6IDEyMCwgYWxpZ246ICdjZW50ZXInfSxcbiAgICAgICAge3RpdGxlOiAnVG90YWwnLCBrZXk6ICd0b3RhbCcsIHdpZHRoOiA4MCwgYWxpZ246ICdjZW50ZXInfSxcbiAgICAgICAge3RpdGxlOiAnRXJyb3JzJywga2V5OiAnZXJyb3JzJywgd2lkdGg6IDgwLCBhbGlnbjogJ2NlbnRlcid9LFxuICAgICAgICB7dGl0bGU6ICdJbnNlcnRzJywga2V5OiAnaW5zZXJ0cycsIHdpZHRoOiA4MCwgYWxpZ246ICdjZW50ZXInfSxcbiAgICAgICAge3RpdGxlOiAnVXBkYXRlcycsIGtleTogJ3VwZGF0ZXMnLCB3aWR0aDogODAsIGFsaWduOiAnY2VudGVyJ30sXG4gICAgICAgIHt0aXRsZTogJ1NraXBwZWQnLCBrZXk6ICdza2lwcGVkJywgd2lkdGg6IDgwLCBhbGlnbjogJ2NlbnRlcid9LFxuICAgICAgICB7dGl0bGU6ICdUb3RhbCBSb2xsdXAnLCBrZXk6ICd0b3RhbFJvbGx1cCcsIHdpZHRoOiAxMjV9LFxuICAgICAgICB7dGl0bGU6ICdEdXJhdGlvbicsIGtleTogJ2R1cmF0aW9uJywgd2lkdGg6IDEwMCwgYWxpZ246ICdjZW50ZXInfSxcbiAgICAgICAge3RpdGxlOiAnRHVyYXRpb24gUm9sbHVwJywga2V5OiAnZHVyYXRpb25Sb2xsdXAnLCB3aWR0aDogMTIwfSxcbiAgICAgICAge3RpdGxlOiAnTWVzc2FnZScsIGtleTogJ21lc3NhZ2UnfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfSxcblxuICB3YXRjaDoge1xuICAgIGFzeW5jIG1vZGVsVmFsdWUoKSB7XG4gICAgICBpZiAoIXRoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLm9ialRvQmVFeHBhbmRlZCA9IFtdO1xuICAgICAgdGhpcy5jdXJyZW50VGFiID0gJ2hpZXJhcmNoeSc7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UgPSB0aGlzLmdldFJvd3MoKTtcblxuICAgICAgdGhpcy5pbml0aW5nU3VjY2VzcyA9IHRydWU7XG4gICAgfSxcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0UmVjb3JkcygpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9LFxuXG4gICAgZ2V0Um93cygpIHtcbiAgICAgIHRoaXMub2JqZWN0c1N1bW1hcnlEaWFsb2dNb2RlbCA9IHRoaXMuaXRhc2sudGFyZ2V0Py5ydW5Qcm9wcz8uc2ZkY0RhdGFDb3B5O1xuICAgICAgY29uc3Qgb2JqVHJlZSA9IHRoaXMub2JqZWN0c1N1bW1hcnlEaWFsb2dNb2RlbD8ub2JqZWN0c1RyZWUgfHwgW107XG4gICAgICByb3dOdW1Db3VudCA9IDA7XG4gICAgICByZXR1cm4gc29ydEljKG9ialRyZWUubWFwKHRoaXMucHJvY2Vzc1JvdyksICduYW1lJyk7XG4gICAgfSxcblxuICAgIHJvbGxVcFN0YXRzKHJvdykge1xuICAgICAgbGV0IHRvdGFsUm9sbHVwID0gcm93LnRvdGFsIHx8IDA7XG5cbiAgICAgIGlmIChyb3cuY2hpbGRyZW4pIHtcbiAgICAgICAgcm93LmNoaWxkcmVuLmZvckVhY2goKGl0KSA9PiB7XG4gICAgICAgICAgdGhpcy5yb2xsVXBTdGF0cyhpdCk7XG4gICAgICAgICAgdG90YWxSb2xsdXAgKz0gaXQudG90YWxSb2xsdXA7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByb3cudG90YWxSb2xsdXAgPSB0b3RhbFJvbGx1cDtcbiAgICB9LFxuXG4gICAgcHJvY2Vzc1JvdyhyZWMsIGxldmVsKSB7XG4gICAgICBsZXZlbCA9IGxldmVsIHx8IDA7XG5cbiAgICAgIGNvbnN0IHJvdyA9IHtcbiAgICAgICAgbnVtOiByb3dOdW1Db3VudCsrLFxuICAgICAgICByZWNvcmRMZXZlbDogbGV2ZWwsXG4gICAgICAgIGFjdGlvbjogJycsXG4gICAgICAgIC8vIGlkOiByZWMuaWQsXG4gICAgICAgIGlkOiBnZW5lcmF0ZUlkMignc29iaicpLFxuICAgICAgICBuYW1lOiByZWMucmVsYXRpb25zaGlwTmFtZSA/IGAke3JlYy5yZWxhdGlvbnNoaXBOYW1lfSAoJHtyZWMubmFtZX0pYCA6IHJlYy5uYW1lLFxuICAgICAgICBzdGF0dXM6IHJlYy5ydW5TdGF0dXMsXG4gICAgICAgIHN0YXR1c0ljb246IGAke2ljb25zW3JlYy5ydW5TdGF0dXNdIHx8ICcnfSAke3V0aWxzLnZhbHVlTGFiZWxzLnN0YXR1c1tyZWMucnVuU3RhdHVzXX1gLFxuICAgICAgICBkdXJhdGlvbjogdG9IdW1hbkVsYXBzZWRUaW1lKHJlYy5kdXJhdGlvbiB8fCAwKSxcbiAgICAgICAgZHVyYXRpb25Sb2xsdXA6IHRvSHVtYW5FbGFwc2VkVGltZShyZWMuZHVyYXRpb25Sb2xsdXAgfHwgMCksXG4gICAgICAgIHRvdGFsOiByZWMuc3RhdHMgJiYgcmVjLnN0YXRzLnRvdGFsLFxuICAgICAgICBkb25lOiByZWMuc3RhdHMgJiYgcmVjLnN0YXRzLmRvbmUsXG4gICAgICAgIHN1Y2Nlc3M6IHJlYy5zdGF0cyAmJiByZWMuc3RhdHMuc3VjY2VzcyxcbiAgICAgICAgaW5zZXJ0czogcmVjLnN0YXRzICYmIHJlYy5zdGF0cy5pbnNlcnRzLFxuICAgICAgICB1cGRhdGVzOiByZWMuc3RhdHMgJiYgcmVjLnN0YXRzLnVwZGF0ZXMsXG4gICAgICAgIGVycm9yczogcmVjLnN0YXRzICYmIHJlYy5zdGF0cy5lcnJvcnMsXG4gICAgICAgIHNraXBwZWQ6IHJlYy5zdGF0cyAmJiByZWMuc3RhdHMuc2tpcHBlZCxcbiAgICAgICAgbWVzc2FnZTogcmVjLm1lc3NhZ2UsXG4gICAgICAgIGRldGFpbHM6IHJlYy5kZXRhaWxzLFxuICAgICAgICBzdGF0dXNVcmxzOiByZWMuc3RhdHVzVXJscyxcbiAgICAgICAgZXJyb3JTdW1tYXJ5VXJsczogcmVjLmVycm9yU3VtbWFyeVVybHMsXG4gICAgICAgIHN0YXRzOiByZWMuc3RhdHMsXG4gICAgICAgIG9yZGVyOiByZWMub3JkZXIsXG4gICAgICAgIGVycm9yVHlwZXM6IChyZWMuZXJyb3JUeXBlcyB8fCBbXSkuam9pbignLCAnKSxcbiAgICAgICAgaGllcmFyY2h5VHlwZTogdXRpbHMudmFsdWVMYWJlbHMuaGllcmFyY2h5VHlwZXNbcmVjLmhpZXJhcmNoeVR5cGVdLFxuICAgICAgICBydW46IHRoaXMuaXJ1bixcbiAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgfTtcbiAgICAgIGlmIChyZWMucGFyZW50cyAmJiByZWMucGFyZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0ge1xuICAgICAgICAgIGFjdGlvbjogJycsXG4gICAgICAgICAgaWQ6IGdlbmVyYXRlSWQyKCdzb2JqJyksXG4gICAgICAgICAgY2hpbGRyZW46IHNvcnRJYyhcbiAgICAgICAgICAgI
2788HJlYy5wYXJlbnRzXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGl0KSA9PiBpdC5zdGF0cz8udG90YWwgPiAwIHx8IChpdC5ydW5TdGF0dXMgJiYgaXQucnVuU3RhdHVzICE9PSAnY29tcGxldGVkJykpXG4gICAgICAgICAgICAgIC5tYXAoKGl0KSA9PiB0aGlzLnByb2Nlc3NSb3coaXQsIGxldmVsICsgMSkpLFxuICAgICAgICAgICAgJ25hbWUnXG4gICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICAgICAgY2hpbGRyZW4ubmFtZSA9IGBQYXJlbnRzICgke2NoaWxkcmVuLmNoaWxkcmVuLmxlbmd0aH0pYDtcbiAgICAgICAgaWYgKGNoaWxkcmVuLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByb3cuY2hpbGRyZW4ucHVzaChjaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChyZWMuY2hpbGRyZW4gJiYgcmVjLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB7XG4gICAgICAgICAgYWN0aW9uOiAnJyxcbiAgICAgICAgICBpZDogZ2VuZXJhdGVJZDIoJ3NvYmonKSxcbiAgICAgICAgICBjaGlsZHJlbjogc29ydEljKFxuICAgICAgICAgICAgcmVjLmNoaWxkcmVuXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGl0KSA9PiBpdC5zdGF0cz8udG90YWwgPiAwIHx8IChpdC5ydW5TdGF0dXMgJiYgaXQucnVuU3RhdHVzICE9PSAnY29tcGxldGVkJykpXG4gICAgICAgICAgICAgIC5tYXAoKGl0KSA9PiB0aGlzLnByb2Nlc3NSb3coaXQsIGxldmVsICsgMSkpLFxuICAgICAgICAgICAgJ25hbWUnXG4gICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICAgICAgY2hpbGRyZW4ubmFtZSA9IGBDaGlsZHJlbiAoJHtjaGlsZHJlbi5jaGlsZHJlbi5sZW5ndGh9KWA7XG4gICAgICAgIGlmIChjaGlsZHJlbi5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcm93LmNoaWxkcmVuLnB1c2goY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMucm9sbFVwU3RhdHMocm93KTtcblxuICAgICAgcmV0dXJuIHJvdztcbiAgICB9LFxuXG4gICAgY2xvc2UoKSB7XG4gICAgICB0aGlzLiRlbWl0KCdjYW5jZWwnKTtcbiAgICB9LFxuXG4gICAgcmVmcmVzaCgpIHtcbiAgICAgIHRoaXMucHJvY2Vzcyhhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMuaXJ1biA9IGF3YWl0IHJ0QXBpLmdldFJ1bih0aGlzLnJ1bi5pZCk7XG4gICAgICAgIHRoaXMuaXRhc2sgPSB0aGlzLmlydW4udGFza3MuZmluZCgoaXQpID0+IGl0LmlkID09PSB0aGlzLnRhc2suaWQpO1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSB0aGlzLmdldFJvd3MoKTtcbiAgICAgICAgdGhpcy50aXRsZSA9IGdldFRpdGxlKHRoaXMuaXRhc2spO1xuICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgdGhpcy4kcmVmcy5oaWVyYXJjaHlHcmlkPy5yZWZyZXNoKHRoaXMuZGF0YVNvdXJjZSk7XG4gICAgICAgICAgdGhpcy4kcmVmcy5zdW1tYXJ5R3JpZD8ucmVmcmVzaCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0sXG59O1xuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGU+XG4gIDxDb250ZW50RGlhbG9nXG4gICAgOnRpdGxlPVwidGl0bGUgfHwgJ0ZpbGVzJ1wiXG4gICAgOm1vZGVsVmFsdWU9XCJtb2RlbFZhbHVlXCJcbiAgICBAdXBkYXRlOm1vZGVsVmFsdWU9XCIkZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnKVwiXG4gICAgOm1lc3NhZ2U9XCJtZXNzYWdlXCJcbiAgICA6bWVz
2788c2FnZVR5cGU9XCJtZXNzYWdlVHlwZVwiXG4gICAgOmluaXRpbmc9XCJpbml0aW5nXCJcbiAgICA6aW5pdGluZ1N1Y2Nlc3M9XCJpbml0aW5nU3VjY2Vzc1wiXG4gICAgOnByb2Nlc3Npbmc9XCJwcm9jZXNzaW5nXCJcbiAgICBoZWlnaHQ9XCJhdXRvXCJcbiAgICB3aWR0aD1cIjkwMHB4XCJcbiAgICA6ZGVmYXVsdEJ1dHRvbj1cImZhbHNlXCJcbiAgICA6cGVyc2lzdGVudD1cImZhbHNlXCJcbiAgPlxuICAgIDxkaXYgdi1pZj1cInN0YXR1c0ZpbGVzLmxlbmd0aCA+IDBcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiXCI+U3RhdHVzIEZpbGVzPC9zcGFuPlxuICAgICAgPHEtdGFibGVcbiAgICAgICAgOmRhdGE9XCJzdGF0dXNGaWxlc1wiXG4gICAgICAgIDpjb2x1bW5zPVwiY29sdW1uc1wiXG4gICAgICAgIHJvdy1rZXk9XCJpZFwiXG4gICAgICAgIDpoaWRlLXBhZ2luYXRpb249XCJ0cnVlXCJcbiAgICAgICAgOnJvd3MtcGVyLXBhZ2Utb3B0aW9ucz1cIlswXVwiXG4gICAgICAgIHYtbW9kZWw6cGFnaW5hdGlvbj1cInBhZ2luYXRpb25cIlxuICAgICAgPlxuICAgICAgICA8dGVtcGxhdGUgdi1zbG90OmJvZHktY2VsbC1hY3Rpb25zPVwicHJvcHNcIj5cbiAgICAgICAgICA8cS10ZD5cbiAgICAgICAgICAgIDxJY29uQ29weSA6Y29udGVudD1cInByb3BzLnJvdy51cmxcIiB0b29sdGlwPVwiQ29weSB1cmwgdG8gQ2xpcGJvYXJkXCIgLz5cbiAgICAgICAgICAgIDxJY29uIG5hbWU9XCJjbG91ZF9kb3dubG9hZFwiIEBjbGljaz1cImRvd25sb2FkRmlsZShwcm9wcy5yb3cpXCIgY2xpY2thYmxlIHRvb2x0aXA9XCJEb3dubG9hZCBGaWxlXCIgLz5cbiAgICAgICAgICAgIDxJY29uIHYtaWY9XCJwcm9wcy5yb3cuY2FuVmlld1wiIG5hbWU9XCJ2aXNpYmlsaXR5XCIgQGNsaWNrPVwidmlld1N0YXR1c0ZpbGUocHJvcHMucm93KVwiIGNsaWNrYWJsZSB0b29sdGlwPVwiVmlldyBGaWxlXCIgLz5cbiAgICAgICAgICA8L3EtdGQ+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICA8L3EtdGFibGU+XG4gICAgPC9kaXY+XG4gICAgPEZpbGVWaWV3ZXJEaWFsb2cyIHYtbW9kZWw9XCJ2aWV3ZXJEaWFsb2dPcGVuXCIgOnRpdGxlPVwidmlld2VyRGlhbG9nVGl0bGVcIiA6ZmlsZUluZm89XCJ2aWV3ZXJEaWFsb2dNb2RlbFwiIC8+XG4gICAgPFN0YXR1c0ZpbGVWaWV3ZXIgdi1tb2RlbD1cInN0YXR1c0ZpbGVWaWV3ZXJEaWFsb2dPcGVuXCIgOnRpdGxlPVwidmlld2VyRGlhbG9nVGl0bGVcIiA6ZmlsZUluZm89XCJ2aWV3ZXJEaWFsb2dNb2RlbFwiIC8+XG4gIDwvQ29udGVudERpYWxvZz5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQgbGFuZz1cInR5cGVzY3JpcHRcIj5cbmltcG9ydCBtaXhpbnMgZnJvbSAnc3JjL21peGlucy9taXhpbnMnO1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnc3JjL3NlcnZpY2VzL3V0aWxzJztcbmltcG9ydCAqIGFzIGFwaSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hcGknO1xuaW1wb3J0IFN0YXR1c0ZpbGVWaWV3ZXIgZnJvbSAnc3JjL2NvbXBvbmVudHMvU3RhdHVzRmlsZVZpZXdlci52dWUnO1xuaW1wb3J0IEZpbGVWaWV3ZXJEaWFsb2cyIGZyb20gJ3NyYy9jb21wb25lbnRzL0ZpbGVWaWV3ZXJEaWFsb2cyLnZ1ZSc7XG5pbXBvcnQge2NvcHlUb0NsaXBib2FyZH0gZnJvbSAnc3JjL3NlcnZpY2VzL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFttaXhpbnNdLFxuICBjb21wb25lbnRzOiB7XG4gICAgU3RhdHVzRmlsZVZpZXdlcixcbiAgICBGaWxlVmlld2VyRGlhbG9nMixcbiAgfSxcblxuICBwcm9wczoge1xuICAgIHRpdGxlOiBTdHJpbmcsXG4gICAgbW9kZWxWYWx1ZTogQm9vbGVhbixcbiAgICBzdGF0dXNGaWxlczogQXJyYXksXG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sdW1uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ2FjdGlvbnMnLFxuICAgICAgICAgIGFsaWduOiAnbGVmdCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtuYW1lOiAnT2JqZWN0TmFtZScsIGZpZWxkOiAnb2JqZWN0TmFtZScsIGxhYmVsOiAnVGFzaycsIHNvcnRhYmxlOiB0cnVlLCBhbGlnbjogJ2xlZnQnfSxcbiAgICAgICAge25hbWU6ICdmaWxlTmFtZScsIGZpZWxkOiAnZmlsZU5hbWUnLCBsYWJlbDogJ0ZpbGUgTmFtZScsIHNvcnRhYmxlOiB0cnVlLCBhbGlnbjogJ2xlZnQnfSxcbiAgICAgICAge25hbWU6ICdmaWxlU2l6ZScsIGZpZWxkOiAnZmlsZVNpemVGb3JtYXR0ZWQnLCBsYWJlbDogJ0ZpbGUgU2l6ZScsIHNvcnRhYmxlOiB0cnVlLCBhbGlnbjogJ2xlZnQnfSxcbiAgICAgIF0sXG4gICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgIHBhZ2U6IDEsXG4gICAgICAgIHJvd3NQZXJQYWdlOiAwLFxuICAgICAgfSxcbiAgICAgIHZpZXdlckRpYWxvZ1RpdGxlOiAnJyxcbiAgICAgIHZpZXdlckRpYWxvZ09wZW46IGZhbHNlLFxuICAgICAgc3RhdHVzRmlsZVZpZXdlckRpYWxvZ09wZW46IGZhbHNlLFxuICAgICAgdmlld2VyRGlhbG9nTW9kZWw6IHt9LFxuICAgIH07XG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICB0aGlzLmluaXRpbmdTdWNjZXNzID0gdHJ1ZTtcbiAgfSxcbiAgZW1pdHM6IFsnY2FuY2VsJywgJ3VwZGF0ZTptb2RlbFZhbHVlJ10sXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSgpIHtcbiAgICAgIGlmICghdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9LFxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBjbG9zZSgpIHtcbiAgICAgIHRoaXMuJGVtaXQoJ2NhbmNlbCcpO1xuICAgIH0sXG5cbiAgICB2aWV3U3RhdHVzRmlsZShmaWxlSW5mbykge1xuICAgICAgdGhpcy5oYW5kbGVWaWV3RmlsZSgnU3RhdHVzIEZpbGU6ICcgKyBmaWxlSW5mby5maWxlTmFtZSwgZmlsZUluZm8pO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRPcGVuYWJsZVVybChmaWxlSW5mbykge1xuICAgICAgaWYgKGZpbGVJbmZvLm9wZW5hYmxlVXJsKSB7XG4gICAgICAgIHJldHVybiBmaWxlSW5mby5vcGVuYWJsZVVybDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMucHJvY2Vzc0Zvcm0oKCkgPT5cbiAgICAgICAgYXBpLm9wZW5GaWxlKHtcbiAgICAgICAgICBydW5JZDogZmlsZUluZm8ucnVuSWQsXG4gICAgICAgICAgam9iSWQ6IHRoaXMuam9iSWQsXG4gICAgICAgICAgdXJsOiBmaWxlSW5mby51cmwsXG4gICAgICAgICAgbG9jYXRpb246IGZpbGVJbmZvLmxvY2F0aW9uLFxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgaWYgKHJlc3ApIHtcbiAgICAgICAgZmlsZUluZm8ub3BlbmFibGVVcmwgPSByZXNwLnVybDtcbiAgICAgICAgcmV0dXJuIHJlc3AudXJsO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBoYW5kbGVWaWV3RmlsZSh0aXRsZSwgZmlsZUluZm8pIHtcbiAgICAgIGNvbnN0IHVybCA9IGF3YWl0IHRoaXMuZ2V0T3BlbmFibGVVcmwoZmlsZUluZm8pO1xuICAgICAgaWYgKCF1cmwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAoKHRoaXMudmlld2VyRGlhbG9nVGl0bGUgPSB0aXRsZSksXG4gICAgICAgICh0aGlzLnZpZXdlckRpYWxvZ01vZGVsID0ge1xuICAgICAgICAgIC4uLmZpbGVJbmZvLFxuICAgICAgICAgIC4uLnt1cmx9LFxuICAgICAgICB9KSk7XG4gICAgICB0aGlzLnN0YXR1c0ZpbGVWaWV3ZXJEaWFsb2dPcGVuID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZG93bmxvYWRGaWxlKGZpbGVJbmZvKSB7XG4gICAgICBsZXQgdXJsID0gYXdhaXQgdGhpcy5nZXRPcGVuYWJsZVVybChmaWxlSW5mbyk7XG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIGlmICh1cmwuc3RhcnRzV2l0aCgnaHR0cCcpKSB7XG4gICAgICAgICAgdXRpbHMub3BlblVybCh1cmwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgI
2788HdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGNvcHlGaWxlKGZpbGVJbmZvKSB7XG4gICAgICBsZXQgdXJsID0gYXdhaXQgdGhpcy5nZXRPcGVuYWJsZVVybChmaWxlSW5mbyk7XG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIC8vIHRoaXMuJGNsaXBib2FyZCh1cmwpO1xuICAgICAgICAvLyB1dGlscy5ub3RpZnlJbmZvKCdVcmwgY29waWVkIScpO1xuICAgICAgICBhd2FpdCBjb3B5VG9DbGlwYm9hcmQodXJsKTtcbiAgICAgIH1cbiAgICB9LFxuICB9LFxufTtcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlPlxuICA8ZGl2PlxuICAgIDxJY29uIHYtaWY9XCJzdGF0dXNGaWxlcy5sZW5ndGggPiAwXCIgbmFtZT1cImxpYnJhcnlfYm9va3NcIiBAY2xpY2s9XCJ2aWV3RmlsZXNcIiBjbGlja2FibGUgdG9vbHRpcD1cIlZpZXcgc3RhdHVzIEZpbGVcIiAvPlxuICAgIDxGaWxlc0RpYWxvZyB0aXRsZT1cIk9iamVjdCBGaWxlc1wiIHYtbW9kZWw9XCJmaWxlc0RpYWxvZ09wZW5cIiA6c3RhdHVzRmlsZXM9XCJzdGF0dXNGaWxlc1wiIC8+XG4gIDwvZGl2PlxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBGaWxlc0RpYWxvZyBmcm9tICcuL0ZpbGVzRGlhbG9nLnZ1ZSc7XG5pbXBvcnQgKiBhcyByZFV0aWxzIGZyb20gJ2dvb2RkYXRhL3NlcnZpY2VzL2dvb2RkYXRhVXRpbHMnO1xuaW1wb3J0IG1peGlucyBmcm9tICdzcmMvbWl4aW5zL21peGlucyc7XG5cbmNvbnN0IFNUQVRVU19GSUxFID0gJ3N0YXR1c1VybHMnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW21peGluc10sXG5cbiAgcHJvcHM6IHtcbiAgICBydW46IE9iamVjdCxcbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXNGaWxlczogW10sXG4gICAgICBmaWxlc0RpYWxvZ09wZW46IGZhbHNlLFxuICAgIH07XG4gIH0sXG5cbiAgY29tcG9uZW50czoge1xuICAgIEZpbGVzRGlhbG9nLFxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5vYmplY3QgPSB0aGlzLnBhcmFtcy5kYXRhO1xuICAgIHRoaXMuc3RhdHVzRmlsZXMgPSByZFV0aWxzLmdldE9iamVjdEZpbGVzKHtpZDogdGhpcy5vYmplY3QucnVuSWR9LCB0aGlzLm9iamVjdCwgU1RBVFVTX0ZJTEUpO1xuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICB2aWV3RmlsZXMoKSB7XG4gICAgICB0aGlzLmZpbGVzRGlhbG9nT3BlbiA9IHRydWU7XG4gICAgfSxcbiAgfSxcbn07XG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZT5cbiAgPENvbnRlbnREaWFsb2dcbiAgICA6dGl0bGU9XCJ0aXRsZVwiXG4gICAgOm1vZGVsVmFsdWU9XCJtb2RlbFZhbHVlXCJcbiAgICBAdXBkYXRlOm1vZGVsVmFsdWU9XCIkZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnKVwiXG4gICAgOmluaXRpbmc9XCJpbml0aW5nXCJcbiAgICA6aW5pdGluZ1N1Y2Nlc3M9XCJpbml0aW5nU3VjY2Vzc1wiXG4gICAgOnByb2Nlc3Npbmc9XCJwcm9jZXNzaW5nXCJcbiAgICBoZWlnaHQ9XCJhdXRvXCJcbiAgICB3aWR0aD1cIjkwdndcIlxuICAgIGNsb3NlTW9kZVxuICAgIDpwZXJzaXN0ZW50PVwiZmFsc2VcIlxuICA+XG4gICAgPHRlbXBsYXRlIHYtaWY9XCJpbml0aW5nU3VjY2Vzc1wiPlxuICAgICAgPERhdGFncmlkXG4gICAgICAgIHJlZj1cImdyaWRcIlxuICAgICAgICA6Y29sdW1ucz1cImNvbHVtbnNcIlxuICAgICAgICA6cmVjb3Jkcz1cImdldFJvd3NcIlxuICAgICAgICA6Y3JlYXRhYmxlPVwiZmFsc2VcIlxuICAgICAgICA6dXBkYXRhYmxlPVwiZmFsc2VcIlxuICAgICAgICA6ZGVsZXRhYmxlPVwiZmFsc2VcIlxuICAgICAgICA6YWN0aW9uc0NvbHVtbj1cImZhbHNlXCJcbiAgICAgICAgOnNlbGVjdGlvbkNvbHVtbj1cImZhbHNlXCJcbiAgICAgICAgOmV4dGVybmFsUmVmcmVzaD1cInRydWVcIlxuICAgICAgICBAcmVmcmVzaD1cInJlZnJlc2hcIlxuICAgICAgPlxuICAgICAgPC9EYXRhZ3JpZD5cbiAgICA8L3RlbXBsYXRlPlxuICA8L0NvbnRlbnREaWFsb2c+XG48L3RlbXBsYXRlPlxuPHNjcmlwdD5cbmltcG9ydCBtaXhpbnMgZnJvbSAnc3JjL21peGlucy9taXhpbnMnO1xuaW1wb3J0IHtzb3J0SWN9IGZyb20gJ3NyYy9zZXJ2aWNlcy91dGlscyc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICdzcmMvc2VydmljZXMvdXRpbHMnO1xuaW1wb3J0ICogYXMgcnRBcGkgZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXBpJztcbmltcG9ydCB7ZGVlcENsb25lfSBmcm9tICdAZGF0YXNlcnQvanMtdXRpbHMvZGlzdC9qc1V0aWxzJztcbmltcG9ydCBEYXRhZ3JpZCBmcm9tICdzcmMvY29tcG9uZW50cy9EYXRhZ3JpZC52dWUnO1xuaW1wb3J0IFNmZGNEYXRhTWFza1J1bkFjdGlvbnMgZnJvbSAnLi9TZmRjRGF0YU1hc2tSdW5BY3Rpb25zLnZ1ZSc7XG5cbmZ1bmN0aW9uIGdldFRpdGxlKHRhc2spIHtcbiAgcmV0dXJuIGBEYXRhIE1hc2sgUnVuIERldGFpbHMgLSAke3V0aWxzLnZhbHVlTGFiZWxzLnN0YXR1c1t0YXNrLnN0YXR1c119YDtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFttaXhpbnNdLFxuICBjb21wb25lbnRzOiB7RGF0YWdyaWR9LFxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IEJvb2xlYW4sXG4gICAgam9iSWQ6IFN0cmluZyxcbiAgICB0YXNrOiBPYmplY3QsXG4gICAgcnVuOiBPYmplY3QsXG4gIH0sXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlydW46IHRoaXMucnVuLFxuICAgICAgaXRhc2s6IHRoaXMudGFzayxcbiAgICAgIHRpdGxlOiBnZXRUaXRsZSh0aGlzLnRhc2spLFxuICAgICAgY29sdW1uczogW1xuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyTmFtZTogJ0FjdGlvbnMnLFxuICAgICAgICAgIGZpZWxkOiAnYWN0aW9ucycsXG4gICAgICAgICAgY2VsbFJlbmRlcmVyRnJhbWV3b3JrOiBTZmRjRGF0YU1hc2tSdW5BY3Rpb25zLFxuICAgICAgICAgIHdpZHRoOiA5NSxcbiAgICAgICAgICBwaW5uZWQ6ICdsZWZ0JyxcbiAgICAgICAgfSxcbiAgICAgICAge2ZpZWxkOiAnbmFtZSd9LFxuICAgICAgICB7ZmllbGQ6ICdzdGF0dXMnfSxcbiAgICAgICAge2ZpZWxkOiAnbWFza1N0YXJ0QXQnLCBoZWFkZXJOYW1lOiAnTWFza2VkIFRpbGwnLCB0eX
2788BlOiAnZGF0ZXRpbWUnfSxcbiAgICAgICAge2ZpZWxkOiAnc3RhcnRBdCcsIHR5cGU6ICdkYXRldGltZSd9LFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyTmFtZTogJ0R1cmF0aW9uJyxcbiAgICAgICAgICB2YWx1ZUdldHRlcjogKHJvdykgPT4gdXRpbHMuZ2V0UnVuRHVyYXRpb24ocm93LmRhdGEpLFxuICAgICAgICAgIHdpZHRoOiAxMjUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJOYW1lOiAnVG90YWwnLFxuICAgICAgICAgIHZhbHVlR2V0dGVyOiAocm93KSA9PiByb3cuZGF0YS5zdGF0cyAmJiByb3cuZGF0YS5zdGF0cy50b3RhbCxcbiAgICAgICAgICB3aWR0aDogMTAwLFxuICAgICAgICAgIHR5cGU6ICdpbnQnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyTmFtZTogJ1N1Y2Nlc3MnLFxuICAgICAgICAgIHZhbHVlR2V0dGVyOiAocm93KSA9PiByb3cuZGF0YS5zdGF0cyAmJiByb3cuZGF0YS5zdGF0cy5zdWNjZXNzLFxuICAgICAgICAgIHdpZHRoOiAxMjAsXG4gICAgICAgICAgdHlwZTogJ2ludCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJOYW1lOiAnU2tpcHBlZCcsXG4gICAgICAgICAgdmFsdWVHZXR0ZXI6IChyb3cpID0+IHJvdy5kYXRhLnN0YXRzICYmIHJvdy5kYXRhLnN0YXRzLnNraXBwZWQsXG4gICAgICAgICAgd2lkdGg6IDEwMCxcbiAgICAgICAgICB0eXBlOiAnaW50JyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlck5hbWU6ICdFcnJvcnMnLFxuICAgICAgICAgIHZhbHVlR2V0dGVyOiAocm93KSA9PiByb3cuZGF0YS5zdGF0cyAmJiByb3cuZGF0YS5zdGF0cy5lcnJvcnMsXG4gICAgICAgICAgd2lkdGg6IDEwMCxcbiAgICAgICAgICB0eXBlOiAnaW50JyxcbiAgICAgICAgfSxcbiAgICAgICAge2ZpZWxkOiAnbWVzc2FnZSd9LFxuICAgICAgXSxcbiAgICB9O1xuICB9LFxuICBlbWl0czogWydjYW5jZWwnLCAndXBkYXRlOm1vZGVsVmFsdWUnXSxcblxuICB3YXRjaDoge1xuICAgIGFzeW5jIG1vZGVsVmFsdWUoKSB7XG4gICAgICBpZiAoIXRoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmluaXRpbmdTdWNjZXNzID0gdHJ1ZTtcbiAgICAgIHRoaXMuaW5pdFJlY29yZHMoKTtcbiAgICB9LFxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRSb3dzKCkge1xuICAgICAgcmV0dXJuIGRlZXBDbG9uZSh0aGlzLmRhdGFTb3VyY2UpO1xuICAgIH0sXG5cbiAgICBjbG9zZSgpIHtcbiAgICAgIHRoaXMuJGVtaXQoJ2NhbmNlbCcpO1xuICAgIH0sXG5cbiAgICByZWZyZXNoKCkge1xuICAgICAgdGhpcy5wcm9jZXNzKGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy5pcnVuID0gYXdhaXQgcnRBcGkuZ2V0UnVuKHRoaXMucnVuLmlkKTtcbiAgICAgICAgdGhpcy5pdGFzayA9IHRoaXMuaXJ1bi50YXNrcy5maW5kKChpdCkgPT4gaXQuaWQgPT09IHRoaXMudGFzay5pZCk7XG4gICAgICAgIHRoaXMudGl0bGUgPSBnZXRUaXRsZSh0aGlzLml0YXNrKTtcbiAgICAgICAgdGhpcy5pbml0UmVjb3JkcygpO1xuICAgICAgICB0aGlzLiRyZWZzLmdyaWQucmVmcmVzaCgpO1xuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGluaXRSZWNvcmRzKCkge1xuICAgICAgY29uc3QgcmVjcyA9IHRoaXMuaXRhc2sudGFyZ2V0Py5ydW5Qcm9wcz8uc2ZkY0RhdGFNYXNrLnNvYmplY3RzIHx8IFtdO1xuICAgICAgdGhpcy5kYXRhU291cmNlID0gc29ydEljKHJlY3MsICduYW1lJyk7XG4gICAgfSxcbiAgfSxcbn07XG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZT5cbiAgPGRpdj5cbiAgICA8SWNvbiB2LWlmPVwidGFza0ZpbGVzLmxlbmd0aCA+IDAgfHwgZXJyb3JGaWxlcy5sZW5ndGggPiAwXCIgbmFtZT1cImxpYnJhcnlfYm9va3NcIiBAY2xpY2s9XCJ2aWV3RmlsZXNcIiBjbGlja2FibGUgdG9vbHRpcD1cIlZpZXcgRmlsZXNcIiAvPlxuICAgIDxJY29uIHYtaWY9XCJpc1Nob3dTZmRjRGF0YUNvcHkoKVwiIG5hbWU9XCJhbmFseXRpY3NcIiBAY2xpY2s9XCJzZmRjRGF0YUNvcHlEaWFsb2dPcGVuID0gdHJ1ZVwiIGNsaWNrYWJsZSB0b29sdGlwPVwiVmlldyBBZGRpdGlvbmFsIEluZm9cIiAvPlxuICAgIDxJY29uIHYtaWY9XCJpc1Nob3dTZmRjRGF0YU1hc2soKVwiIG5hbWU9XCJhbmFseXRpY3NcIiBAY2xpY2s9XCJzZmRjRGF0YU1hc2tEaWFsb2dPcGVuID0gdHJ1ZVwiIGNsaWNrYWJsZSB0b29sdGlwPVwiVmlldyBBZGRpdGlvbmFsIEluZm9cIiAvPlxuICAgIDxJY29uIG5hbWU9XCJlZGl0XCIgQGNsaWNrPVwidGFza0RpYWxvZ09wZW4gPSB0cnVlXCIgY2xpY2thYmxlIHRvb2x0aXA9XCJFZGl0IFRhc2tcIiAvPlxuICAgIDxUYXNrRmlsZXNEaWFsb2dcbiAgICAgIHRpdGxlPVwiVGFzayBGaWxlc1wiXG4gICAgICB2LW1vZGVsPVwiZmlsZXNEaWFsb2dPcGVuXCJcbiAgICAgIDpydW49XCJpcnVuXCJcbiAgICAgIDp0YXNrPVwidGFza1wiXG4gICAgICA6ZXJyb3JGaWxlcz1cImVycm9yRmlsZXNcIlxuICAgICAgQGNhbmNlbD1cImZpbGVzRGlhbG9nT3BlbiA9IGZhbHNlXCJcbiAgICAgIEBjbG9zZT1cImZpbGVzRGlhbG9nT3BlbiA9IGZhbHNlXCJcbiAgICAvPlxuICAgIDxUYXNrRGlhbG9nIHYtbW9kZWw9XCJ0YXNrRGlhbG9nT3BlblwiIDp0YXNrSWQ9XCJ0YXNrSWRcIiA6am9iSWQ9XCJqb2JJZFwiIG1vZGU9XCJlZGl0XCIgQGNhbmNlbD1cInRhc2tEaWFsb2dPcGVuID0gZmFsc2VcIiBAb2s9XCJ0YXNrRGlhbG9nT3BlbiA9IGZhbHNlXCIgLz5cbiAgICA8U2ZkY0RhdGFDb3B5VGFza1J1bkRldGFpbHNEaWFsb2cgdi1tb2RlbD1cInNmZGNEYXRhQ29weURpYWxvZ09wZW5cIiA6am9iSWQ9XCJqb2JJZFwiIDpydW49XCJpcnVuXCIgOnRhc2s9XCJ0YXNrXCIgLz5cbiAgICA8U2ZkY0RhdGFNYXNrVGFza1J1bkRldGFpbHNEaWFsb2cgdi1tb2RlbD1cInNmZGNEYXRhTWFza0RpYWxvZ09wZW5cIiA6am9iSWQ9XCJqb2JJZFwiIDpydW49XCJpcnVuXCIgOnRhc2s9XCJ0YXNrXCIgLz5cbiAgPC9kaXY+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuLy8gaW1wb3J0IFZ1ZSBmcm9tICd2dWUnO1xuaW1wb3J0IFRhc2tGaWxlc0RpYWxvZyBmcm9tICcuL1Rhc2tGaWxlc0RpYWxvZy52dWUnO1xuaW1wb3J0IG1peGlucyBmcm9tICdzcmMvbWl4aW5zL21peGlucyc7XG5pbXBvcnQge2dldFRhc2tGaWxlc30gZnJvbSAnLi4vLi4vc2VydmljZXMvcnRVdGlscyc7XG5pbXBvcnQgVGFza0RpYWxvZyBmcm9tICcuLi90YXNrcy9UYXNrRGlhbG9nLnZ1ZSc7XG5pbXBvcnQgU2ZkY0RhdGFDb3B5VGFza1J1bkRldGFpbHNEaWFsb2cgZnJvbSAnLi9TZmRjRGF0YUNvcHlUYXNrUnVuRGV0YWlsc0RpYWxvZy52dWUnO1xuaW1wb3J0IFNmZGNEYXRhTWFza1Rhc2tSdW5EZXRhaWxzRGlhbG9nIGZyb20gJy4vc2ZkY0RhdGFNYXNrL1NmZGNEYXRhTWFza1Rhc2tSdW5EZXRhaWxzRGlhbG9nLnZ1ZSc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbbWl4aW5zXSxcblxuICBjb21wb25lbnRzOiB7XG4gICAgVGFza0RpYWxvZyxcbiAgICBUYXNrRmlsZXNEaWFsb2csXG4gICAgU2ZkY0RhdGFDb3B5VGFza1J1bkRldGFpbHNEaWFsb2csXG4gICAgU2ZkY0RhdGFNYXNrVGFza1J1bkRldGFpbHNEaWFsb2csXG4gIH0sXG5cbiAgcHJvcHM6IHtcbiAgICBydW46IE9iamVjdCxcbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybi
2788B7XG4gICAgICBmaWxlc0RpYWxvZ09wZW46IGZhbHNlLFxuICAgICAgdGFzazoge30sXG4gICAgICBpcnVuOiB7fSxcbiAgICAgIHRhc2tGaWxlczogW10sXG4gICAgICBlcnJvckZpbGVzOiBbXSxcbiAgICAgIHRhc2tEaWFsb2dPcGVuOiBmYWxzZSxcbiAgICAgIHRhc2tJZDogJycsXG4gICAgICBqb2JJZDogJycsXG4gICAgICBvYmplY3RzVHJlZTogW10sXG4gICAgICBzZmRjRGF0YUNvcHlEaWFsb2dPcGVuOiBmYWxzZSxcbiAgICAgIHNmZGNEYXRhTWFza0RpYWxvZ09wZW46IGZhbHNlLFxuICAgIH07XG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICBjb25zdCByb3cgPSB0aGlzLnBhcmFtcy5kYXRhIHx8IHt9O1xuICAgIHRoaXMudGFzayA9ICh0aGlzLnJ1bj8udGFza3MgfHwgW10pLmZpbmQoKGl0KSA9PiBpdC5pZCA9PT0gcm93LmlkIHx8IGl0LnRhc2tJZCA9PT0gcm93LnRhc2tJZCkgfHwgcm93O1xuICAgIHRoaXMudGFza0lkID0gdGhpcy50YXNrLmlkO1xuICAgIHRoaXMuam9iSWQgPSB0aGlzLnRhc2suam9iSWQ7XG4gICAgdGhpcy5pcnVuID0ge2lkOiB0aGlzLnRhc2sucnVuSWR9O1xuICAgIHRoaXMudGFza0ZpbGVzID0gZ2V0VGFza0ZpbGVzKHRoaXMuaXJ1biwgdGhpcy50YXNrKTtcbiAgICB0aGlzLmVycm9yRmlsZXMgPSB0aGlzLnRhc2suZXJyb3JTdW1tYXJ5VXJscyB8fCBbXTtcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgdmlld0ZpbGVzKCkge1xuICAgICAgdGhpcy5maWxlc0RpYWxvZ09wZW4gPSB0cnVlO1xuICAgIH0sXG4gICAgLy8gdmlld1NmZGNEYXRhQ29weURldGFpbHMoKSB7XG4gICAgLy8gICBjb25zdCBvYmpUcmVlID0gdGhpcy50YXNrLnRhcmdldD8ucnVuUHJvcHM/LnNmZGNEYXRhQ29weT8ub2JqZWN0c1RyZWU7XG4gICAgLy8gICBpZiAob2JqVHJlZSkge1xuICAgIC8vICAgICB0aGlzLm9iamVjdHNUcmVlID0gb2JqVHJlZTtcbiAgICAvLyAgICAgdGhpcy50YXNrUnVuSW5mb0RhaWxvZ09wZW4gPSB0cnVlO1xuICAgIC8vICAgfVxuICAgIC8vIH0sXG5cbiAgICBpc1Nob3dTZmRjRGF0YUNvcHkoKSB7XG4gICAgICByZXR1cm4gdGhpcy50YXNrPy50eXBlID09PSAnc2ZkY0RhdGFDb3B5JyAmJiB0aGlzLnRhc2s/LnRhcmdldD8ucnVuUHJvcHM/LnNmZGNEYXRhQ29weT8ub2JqZWN0c1RyZWU7XG4gICAgfSxcbiAgICBpc1Nob3dTZmRjRGF0YU1hc2soKSB7XG4gICAgICByZXR1cm4gdGhpcy50YXNrPy50eXBlID09PSAnc2ZkY0RhdGFNYXNrJyAmJiB0aGlzLnRhc2s/LnRhcmdldD8ucnVuUHJvcHM/LnNmZGNEYXRhTWFzaz8uc29iamVjdHM7XG4gICAgfSxcbiAgfSxcbn07XG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZT5cbiAgPFBhZ2VQYXJ0IDpwcm9jZXNzaW5nPVwicHJvY2Vzc2luZ1wiIDptZXNzYWdlPVwibWVzc2FnZVwiIDptZXNzYWdlVHlwZT1cIm1lc3NhZ2VUeXBlXCI+XG4gICAgPERhdGFncmlkXG4gICAgICByZWY9XCJncmlkXCJcbiAgICAgIDpjb2x1bW5zPVwidGFza0NvbHVtbnNcIlxuICAgICAgOnJlY29yZHM9XCJ0YXNrUmVjb3Jkc1wiXG4gICAgICA6Y3JlYXRhYmxlPVwiZmFsc2VcIlxuICAgICAgOnVwZGF0YWJsZT1cImZhbHNlXCJcbiAgICAgIDpkZWxldGFibGU9XCJmYWxzZVwiXG4gICAgICA6YWN0aW9uc0NvbHVtbj1cImZhbHNlXCJcbiAgICAgIDpzZWxlY3Rpb25Db2x1bW49XCJmYWxzZVwiXG4gICAgICBAY2VsbENsaWNrPVwiY2VsbENsaWNrSGFuZGxlXCJcbiAgICAgIDpyZWZyZXNoYWJsZT1cImZhbHNlXCJcbiAgICAgIGV4dGVybmFsUmVmcmVzaFxuICAgICAgQHJlZnJlc2g9XCJyZWZyZXNoVGFza3MoKVwiXG4gICAgICA6Y3VzdG9tTG9hZGluZz1cImxvYWRpbmdcIlxuICAgID48L0RhdGFncmlkPlxuICAgIDxWaWV3RXJyb3JNZXNzYWdlRGlhbG9nIHYtbW9kZWw9XCJ2aWV3RXJyb3JNZXNzYWdlRGlhbG9nT3BlblwiIDplcnJvck1lc3NhZ2U9XCJ2aWV3RXJyb3JNZXNzYWdlRGlhbG9nRGF0YVwiIC8+XG4gIDwvUGFnZVBhcnQ+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IG1peGlucyBmcm9tICdzcmMvbWl4aW5zL21peGlucyc7XG5pbXBvcnQgVGFza1J1bkFjdGlvbnMgZnJvbSAnLi9UYXNrUnVuQWN0aW9ucy52dWUnO1xuaW1wb3J0ICogYXMgcnRVdGlscyBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ydFV0aWxzJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJ3NyYy9zZXJ2aWNlcy91dGlscyc7XG5pbXBvcnQgVmlld0Vycm9yTWVzc2FnZURpYWxvZyBmcm9tICcuL1ZpZXdFcnJvck1lc3NhZ2VEaWFsb2cudnVlJztcbmltcG9ydCBEYXRhZ3JpZCBmcm9tICdzcmMvY29tcG9uZW50cy9EYXRhZ3JpZC52dWUnO1xuaW1wb3J0ICogYXMgYXBpIGZyb20gJ3NyYy9wcm9kdWN0cy9yZWFsdGFzay9zZXJ2aWNlcy9hcGknO1xuXG5jb25zdCBNZXNzYWdlID0gJ01lc3NhZ2UnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW21peGluc10sXG5cbiAgcHJvcHM6IHtcbiAgICBydW5JZDogU3RyaW5nLFxuICAgIHJ1bjogT2JqZWN0LFxuICB9LFxuXG4gIGNvbXBvbmVudHM6IHtcbiAgICBWaWV3RXJyb3JNZXNzYWdlRGlhbG9nLFxuICAgIERhdGFncmlkLFxuICB9LFxuICBlbWl0czogWydyZWZyZXNoJ10sXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhc2tDb2x1bW5zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJOYW1lOiAnQWN0aW9ucycsXG4gICAgICAgICAgZmllbGQ6ICdhY3Rpb25zJyxcbiAgICAgICAgICBjZWxsUmVuZGVyZXI6IFRhc2tSdW5BY3Rpb25zLFxuICAgICAgICAgIHdpZHRoOiAxMTUsXG4gICAgICAgICAgcGlubmVkOiAnbGVmdCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtmaWVsZDogJ29yZGVyJywgaGVhZGVyTmFtZTogJyMnLCB3aWR0aDogNTB9LFxuICAgICAgICB7ZmllbGQ6ICduYW1lJywgd2lkdGg6IDM1MH0sXG4gICAgICAgIHtmaWVsZDogJ3R5cGVJbmZvJywgaGVhZGVyTmFtZTogJ1R5cGUnLCB2YWx1ZUxhYmVsczogcnRVdGlscy52YWx1ZUxhYmVscy50YXNrVHlwZXMsIHdpZHRoOiAyNTB9LFxuICAgICAgICAvLyB7ZmllbGQ6ICd0eXBlSW5mbycsIGxhYmVsOiAnVHlwZScsIHZhbHVlTGFiZWxzOiBydFV0aWxzLnZhbHVlTGFiZWxzLnRhc2tUeXBlcywgd2lkdGg6IDE1MH0sXG4gICAgICAgI
2788HtmaWVsZDogJ3N0YXR1cycsIHdpZHRoOiAyMjB9LFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyTmFtZTogJ0R1cmF0aW9uJyxcbiAgICAgICAgICB2YWx1ZUdldHRlcjogKHJvdykgPT4gdXRpbHMuZ2V0UnVuRHVyYXRpb24ocm93LmRhdGEpLFxuICAgICAgICAgIHdpZHRoOiAxMDAsXG4gICAgICAgIH0sXG4gICAgICAgIC8vIHtcbiAgICAgICAgLy8gICBoZWFkZXJOYW1lOiAnUmVhZCcsXG4gICAgICAgIC8vICAgdmFsdWVHZXR0ZXI6IChyb3cpID0+IHJvdy5kYXRhLnN0YXRzICYmIHJvdy5kYXRhLnN0YXRzLnJlYWQsXG4gICAgICAgIC8vICAgd2lkdGg6IDEwMCxcbiAgICAgICAgLy8gICB0eXBlOiAnaW50JyxcbiAgICAgICAgLy8gfSxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlck5hbWU6ICdUb3RhbCcsXG4gICAgICAgICAgdmFsdWVHZXR0ZXI6IChyb3cpID0+IHJvdy5kYXRhLnN0YXRzICYmIHJvdy5kYXRhLnN0YXRzLnRvdGFsLFxuICAgICAgICAgIHdpZHRoOiAxMDAsXG4gICAgICAgICAgdHlwZTogJ2ludCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJOYW1lOiAnSW5zZXJ0cycsXG4gICAgICAgICAgdmFsdWVHZXR0ZXI6IChyb3cpID0+IHJvdy5kYXRhLnN0YXRzICYmIHJvdy5kYXRhLnN0YXRzLmluc2VydHMsXG4gICAgICAgICAgd2lkdGg6IDEwMCxcbiAgICAgICAgICB0eXBlOiAnaW50JyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlck5hbWU6ICdVcGRhdGVzJyxcbiAgICAgICAgICB2YWx1ZUdldHRlcjogKHJvdykgPT4gcm93LmRhdGEuc3RhdHMgJiYgcm93LmRhdGEuc3RhdHMudXBkYXRlcyxcbiAgICAgICAgICB3aWR0aDogMTAwLFxuICAgICAgICAgIHR5cGU6ICdpbnQnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyTmFtZTogJ0RlbGV0ZXMnLFxuICAgICAgICAgIHZhbHVlR2V0dGVyOiAocm93KSA9PiByb3cuZGF0YS5zdGF0cyAmJiByb3cuZGF0YS5zdGF0cy5kZWxldGVzLFxuICAgICAgICAgIHdpZHRoOiAxMDAsXG4gICAgICAgICAgdHlwZTogJ2ludCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJOYW1lOiAnU2tpcHBlZCcsXG4gICAgICAgICAgdmFsdWVHZXR0ZXI6IChyb3cpID0+IHJvdy5kYXRhLnN0YXRzICYmIHJvdy5kYXRhLnN0YXRzLnNraXBwZWQsXG4gICAgICAgICAgd2lkdGg6IDEwMCxcbiAgICAgICAgICB0eXBlOiAnaW50JyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlck5hbWU6ICdFcnJvcnMnLFxuICAgICAgICAgIHZhbHVlR2V0dGVyOiAocm93KSA9PiByb3cuZGF0YS5zdGF0cyAmJiByb3cuZGF0YS5zdGF0cy5lcnJvcnMsXG4gICAgICAgICAgd2lkdGg6IDEwMCxcbiAgICAgICAgICB0eXBlOiAnaW50JyxcbiAgICAgICAgfSxcbiAgICAgICAge2hlYWRlck5hbWU6IE1lc3NhZ2UsIGZpZWxkOiAnbWVzc2FnZScsIHdpZHRoOiA0MDB9LFxuICAgICAgICB7aGVhZGVyTmFtZTogJ0RldGFpbHMnLCBmaWVsZDogJ2RldGFpbHMnLCB3aWR0aDogNDAwfSxcbiAgICAgIF0sXG4gICAgICB0YXNrUmVjb3JkczogdGhpcy5nZXRUYXNrcyxcbiAgICAgIGluaXRpbmdTdWNjZXNzOiB0cnVlLFxuICAgICAgdmlld0Vycm9yTWVzc2FnZURpYWxvZ09wZW46IGZhbHNlLFxuICAgICAgdmlld0Vycm9yTWVzc2FnZURpYWxvZ0RhdGE6ICcnLFxuICAgICAgaW5pdDogZmFsc2UsXG4gICAgICB0YXNrczogW10sXG4gICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICB9O1xuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy50YXNrcyA9IHRoaXMucnVuLnRhc2tzO1xuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgcnVuKCkge1xuICAgICAgdGhpcy50YXNrcyA9IHRoaXMucnVuLnRhc2tzO1xuICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfSxcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgcHJvY2Vzc1Rhc2tSdW5zKHRhc2tSdW5zKSB7XG4gICAgICBsZXQgb3JkZXIgPSAxO1xuICAgICAgcmV0dXJuICh0YXNrUnVucyB8fCBbXSkubWFwKCh0YXNrKSA9PiB7XG4gICAgICAgIHRhc2sub3JkZXIgPSBvcmRlcisrO1xuICAgICAgICB0YXNrLnJ1bklkID0gdGhpcy5ydW5JZDtcbiAgICAgICAgdGFzay5qb2JJZCA9IHRoaXMucnVuLmpvYklkO1xuICAgICAgICByZXR1cm4gdGFzaztcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRUYXNrcygpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NUYXNrUnVucyh0aGlzLnRhc2tzIHx8IFtdKTtcbiAgICB9LFxuXG4gICAgcmVmcmVzaCgpIHtcbiAgICAgIHRoaXMuJHJlZnMuZ3JpZC5yZWZyZXNoKCk7XG4gICAgfSxcblxuICAgIGFzeW5jIHJlZnJlc2hUYXNrcygpIHtcbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICBjb25zdCBydW4gPSBhd2FpdCBhcGkuZ2V0UnVuKHRoaXMucnVuSWQpO1xuICAgICAgdGhpcy50YXNrcyA9IHJ1bi50YXNrcztcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLiRlbWl0KCdyZWZyZXNoJywgcnVuKTtcbiAgICB9LFxuXG4gICAgY2VsbENsaWNrSGFuZGxlKHJlYywgZmllbGROYW1lKSB7XG4gICAgICBpZiAoZmllbGROYW1lID09PSBNZXNzYWdlICYmIHJlYy5tZXNzYWdlKSB7XG4gICAgICAgIHRoaXMudmlld0Vycm9yTWVzc2FnZURpYWxvZ0RhdGEgPSByZWMubWVzc2FnZTtcbiAgICAgICAgdGhpcy52aWV3RXJyb3JNZXNzYWdlRGlhbG9nT3BlbiA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWVsZE5hbWUgPT09ICdEZXRhaWxzJyAmJiByZWMuZGV0YWlscykge1xuICAgICAgICB0aGlzLnZpZXdFcnJvck1lc3NhZ2VEaWFsb2dEYXRhID0gcmVjLmRldGFpbHM7XG4gICAgICAgIHRoaXMudmlld0Vycm9yTWVzc2FnZURpYWxvZ09wZW4gPSB0cnVlO1xuICAgICAgfVxuICAgIH0sXG4gIH0sXG59O1xuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGU+XG4gIDxQYWdlXG4gICAgOnRpdGxlPVwiKCkgPT4gbW9kZWwucnVuTmFtZVwiXG4gICAgOmluaXRpbmc9XCJpbml0aW5nXCJcbiAgICA6aW5pdGluZ1N1Y2Nlc3M9XCJpbml0aW5nU3VjY2Vzc1wiXG4gICAgOnByb2Nlc3Npbmc9XCJwcm9jZXNzaW5nXCJcbiAgICA6bWVz
2788c2FnZT1cIm1lc3NhZ2VcIlxuICAgIDptZXNzYWdlVHlwZT1cIm1lc3NhZ2VUeXBlXCJcbiAgPlxuICAgIDx0ZW1wbGF0ZSB2LXNsb3Q6YnJlYWRjcnVtYnM+XG4gICAgICA8cS1icmVhZGNydW1icy1lbCBsYWJlbD1cIkhvbWVcIiB0bz1cIi9yZWFsdGFzay9ob21lXCIgLz5cbiAgICAgIDxxLWJyZWFkY3J1bWJzLWVsIGxhYmVsPVwiSm9ic1wiIHRvPVwiL3JlYWx0YXNrL2pvYnNcIiAvPlxuICAgICAgPHEtYnJlYWRjcnVtYnMtZWwgOmxhYmVsPVwiYCR7KG1vZGVsLmpvYklkX19yIHx8IHt9KS5uYW1lIHx8ICdKb2InfWBcIiA6dG89XCJgL3JlYWx0YXNrL2pvYnMvJHttb2RlbC5qb2JJZH1gXCIgLz5cbiAgICA8L3RlbXBsYXRlPlxuXG4gICAgPHRlbXBsYXRlIHYtc2xvdDp0aXRsZS1zdWZmaXg+XG4gICAgICA8SWNvbiBuYW1lPVwicmVmcmVzaFwiIEBjbGljaz1cInJlZnJlc2hcIiBjbGlja2FibGUgLz5cbiAgICAgIDxJY29uIG5hbWU9XCJwbGF5X2Fycm93XCIgQGNsaWNrPVwiam9iUnVuQ29uZmlybWF0aW9uRGlhbG9nT3BlbiA9IHRydWVcIiBjbGlja2FibGUgLz5cbiAgICAgIDxJY29uTWVudT5cbiAgICAgICAgPE1lbnVJdGVtIEBjbGljaz1cImhhbmRsZVZpZXdMb2dcIj5WaWV3IExvZzwvTWVudUl0ZW0+XG4gICAgICAgIDxNZW51SXRlbSBAY2xpY2s9XCJoYW5kbGVWaWV3U3VwcG9ydExvZ1wiPlZpZXcgU3VwcG9ydCBMb2c8L01lbnVJdGVtPlxuICAgICAgICA8TWVudUl0ZW0gQGNsaWNrPVwiaGFuZGxlRGVsZXRlXCIgZGFuZ2VyPkRlbGV0ZTwvTWVudUl0ZW0+XG4gICAgICA8L0ljb25NZW51PlxuICAgIDwvdGVtcGxhdGU+XG5cbiAgICA8dGVtcGxhdGUgdi1zbG90OnRpdGxlLWRlc2M+XG4gICAgICA8U3luY1N0YXR1cyA6c3RhdHVzPVwibW9kZWwuc3RhdHVzXCIgc2l6ZT1cInNtXCIgOnRvb2x0aXA9XCJtb2RlbC5tZXNzYWdlXCIgLz5cbiAgICA8L3RlbXBsYXRlPlxuXG4gICAgPHEtdGFicyBpbmRpY2F0b3ItY29sb3I9XCJwcmltYXJ5XCIgYWxpZ249XCJsZWZ0XCIgdi1tb2RlbD1cImN1cnJlbnRUYWJcIiBkZW5zZSBjbGFzcyBuby1jYXBzPlxuICAgICAgPHEtdGFiIG5hbWU9XCJkZXRhaWxzXCIgbGFiZWw9XCJSdW4gRGV0YWlsc1wiIC8+XG4gICAgICA8cS10YWIgbmFtZT1cImZpbGVzXCIgbGFiZWw9XCJSdW4gRmlsZXNcIiAvPlxuICAgICAgPHEtdGFiIG5hbWU9XCJ0YXNrc1wiIGxhYmVsPVwiVGFzayBSdW5zXCIgLz5cbiAgICA8L3EtdGFicz5cblxuICAgIDxxLXRhYi1wYW5lbHMga2VlcC1hbGl2ZSB2LW1vZGVsPVwiY3VycmVudFRhYlwiPlxuICAgICAgPHEtdGFiLXBhbmVsIG5hbWU9XCJkZXRhaWxzXCI+XG4gICAgICAgIDxSdW5EZXRhaWxzIDptb2RlbD1cIm1vZGVsXCIgLz5cbiAgICAgIDwvcS10YWItcGFuZWw+XG5cbiAgICAgIDxxLXRhYi1wYW5lbCBuYW1lPVwiZmlsZXNcIj5cbiAgICAgICAgPFJ1bkZpbGVzIDpydW49XCJtb2RlbFwiIDpqb2JJZD1cImpvYklkXCIgLz5cbiAgICAgIDwvcS10YWItcGFuZWw+XG5cbiAgICAgIDxxLXRhYi1wYW5lbCBuYW1lPVwidGFza3NcIj5cbiAgICAgICAgPFRhc2tSdW5zIDpydW5JZD1cIm1vZGVsLmlkXCIgOnJ1bj1cIm1vZGVsXCIgcmVmPVwidGFza3NcIiBAcmVmcmVzaD1cImhhbmRsZVRhc2tSdW5SZWZyZXNoXCIgLz5cbiAgICAgIDwvcS10YWItcGFuZWw+XG4gICAgPC9xLXRhYi1wYW5lbHM+XG5cbiAgICA8Sm9iUnVuQ29uZmlybWF0aW9uRGlhbG9nIHYtbW9kZWw9XCJqb2JSdW5Db25maXJtYXRpb25EaWFsb2dPcGVuXCIgOmpvYklkIEBjYW5jZWw9XCJqb2JSdW5Db25maXJtYXRpb25EaWFsb2dPcGVuID0gZmFsc2VcIiBAcnVuPVwiaGFuZGxlUnVuSm9iXCIgLz5cbiAgICA8UnVuRmlsZXNEaWFsb2cgdGl0bGU9XCJSdW4gTG9nXCIgdi1tb2RlbD1cInJ1bkxvZ0RpYWxvZ09wZW5cIiA6cnVuPVwibW9kZWxcIiBhdXRvT3BlbkZpbGVUeXBlPVwibG9nRmlsZVwiIC8+XG4gIDwvUGFnZT5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgKiBhcyBhcGkgZnJvbSAnLi4vLi4vc2VydmljZXMvYXBpJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJ3NyYy9zZXJ2aWNlcy91dGlscyc7XG5pbXBvcnQgbWl4aW5zIGZyb20gJ3NyYy9taXhpbnMvbWl4aW5zJztcbmltcG9ydCBSdW5EZXRhaWxzIGZyb20gJy4vUnVuRGV0YWlscy52dWUnO1xuaW1wb3J0IFJ1bkZpbGVzIGZyb20gJy4vUnVuRmlsZXMudnVlJztcbmltcG9ydCBUYXNrUnVucyBmcm9tICcuL1Rhc2tSdW5zLnZ1ZSc7XG5pbXBvcnQgbmF2ZXIgZnJvbSAnc3JjL3NlcnZpY2VzL25hdmVyJztcbmltcG9ydCB7cG9wdWxhdGVSdW5OYW1lfSBmcm9tICdyZWFsdGFzay9zZXJ2aWNlcy9ydFV0aWxzJztcbmltcG9ydCBTeW5jU3RhdHVzIGZyb20gJ3NyYy9jb21wb25lbnRzL1N5bmNTdGF0dXMudnVlJztcbmltcG9ydCBKb2JSdW5Db25maXJtYXRpb25EaWFsb2cgZnJvbSAnc3JjL3Byb2R1Y3RzL3JlYWx0YXNrL3BhZ2VzL2pvYnMvSm9iUnVuQ29uZmlybWF0aW9uRGlhbG9nLnZ1ZSc7XG5pbXBvcnQgUnVuRmlsZXNEaWFsb2cgZnJvbSAnLi9SdW5GaWxlc0RpYWxvZy52dWUnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW21peGluc10sXG5cbiAgY29tcG9uZW50czoge1xuICAgIEpvYlJ1bkNvbmZpcm1hdGlvbkRpYWxvZyxcbiAgICBSdW5EZXRhaWxzLFxuICAgIFJ1bkZpbGVzLFxuICAgIFJ1bkZpbGVzRGlhbG9nLFxuICAgIFRhc2tSdW5zLFxuICAgIFN5bmNTdGF0dXMsXG4gIH0sXG5cbiAgZGF0YTogKCkgPT4gKHtcbiAgICBwcm9ncmVzc09wZW46IGZhbHNlLFxuICAgIGluaXRpbmdTdWNjZXNzOiBmYWxzZSxcbiAgICBtb2RlbDoge30sXG4gICAgZGV0YWlsczoge30sXG4gICAgam9iSWQ6ICcnLFxuICAgIHJ1bklkOiAnJyxcbiAgICBjdXJyZW50VGFiOiAndGFza3MnLFxuICAgIHZlcnNpb246ICcnLFxuICAgIGpvYlJ1bkNvbmZpcm1hdGlvbkRpYWxvZ09wZW46IGZhbHNlLFxuICAgIHJ1bkxvZ0RpYWxvZ09wZW46IGZhbHNlLFxuICB9KSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuam9iSWQgPSB0aGlzLiRyb3V0ZS5wYXJhbXMuam9iSWQ7XG4gICAgdGhpcy5ydW5JZCA9IHRoaXMuJHJvdXRlLnBhcmFtcy5ydW5JZDtcblxuICAgI
2788HRoaXMuaW5pdEZvcm0oYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IHJ1biA9IGF3YWl0IGFwaS5nZXRSdW4odGhpcy5ydW5JZCk7XG5cbiAgICAgIHBvcHVsYXRlUnVuTmFtZShydW4pO1xuICAgICAgdGhpcy5tb2RlbCA9IHJ1bjtcbiAgICB9KTtcbiAgfSxcblxuICB3YXRjaDoge1xuICAgICckcm91dGUucGFyYW1zLnJ1bklkJyhuZXdJZCkge1xuICAgICAgdGhpcy5ydW5JZCA9IG5ld0lkO1xuICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfSxcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0RGlzcGxheUlkKCkge1xuICAgICAgcmV0dXJuIHV0aWxzLmZvcm1hdERhdGVUaW1lRm9yRGlzcGxheSh0aGlzLm1vZGVsLm5hbWUuc3BsaXQoJyAnKVsxXSk7XG4gICAgfSxcblxuICAgIHJlZnJlc2gxKCkge1xuICAgICAgdGhpcy5wcm9jZXNzRm9ybShhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMuam9iID0gYXdhaXQgYXBpLmdldEpvYih0aGlzLmpvYklkKTtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmN1cnJlbnRUYWIgPT09ICd0YXNrcycgPyB0aGlzLiRyZWZzLnRhc2tzLnJlZnJlc2goKSA6IHVuZGVmaW5lZDtcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVmcmVzaCgpIHtcbiAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0Zvcm0oYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgcnVuID0gYXdhaXQgYXBpLmdldFJ1bih0aGlzLnJ1bklkKTtcbiAgICAgICAgcG9wdWxhdGVSdW5OYW1lKHJ1bik7XG4gICAgICAgIHRoaXMubW9kZWwgPSBydW47XG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLiRyZWZzLnRhc2tzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuJHJlZnMudGFza3MucmVmcmVzaFRhc2tzKCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGhhbmRsZVRhc2tSdW5SZWZyZXNoKHJ1bikge1xuICAgICAgcG9wdWxhdGVSdW5OYW1lKHJ1bik7XG4gICAgICB0aGlzLm1vZGVsID0gcnVuO1xuICAgIH0sXG5cbiAgICBoYW5kbGVWaWV3TG9nKCkge1xuICAgICAgdGhpcy5ydW5Mb2dEaWFsb2dPcGVuID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgYXN5bmMgaGFuZGxlVmlld1N1cHBvcnRMb2coKSB7XG4gICAgICBhd2FpdCB0aGlzLnByb2Nlc3NGb3JtKGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IGxvZ1VybCA9IHRoaXMubW9kZWw/LnJ1bnRpbWVJbmZvPy5sb2dVcmw7XG4gICAgICAgIGlmICghbG9nVXJsKSB7XG4gICAgICAgICAgY29uc3QgcnVuID0gYXdhaXQgYXBpLmdldFJ1bih0aGlzLnJ1bklkKTtcbiAgICAgICAgICBwb3B1bGF0ZVJ1bk5hbWUocnVuKTtcbiAgICAgICAgICB0aGlzLm1vZGVsID0gcnVuO1xuICAgICAgICAgIGxvZ1VybCA9IHJ1bj8ucnVudGltZUluZm8/LmxvZ1VybDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbG9nVXJsKSB7XG4gICAgICAgICAgdXRpbHMubm90aWZ5RXJyb3IoJ1N1cHBvcnQgbG9nIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoaXMgcnVuLicpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHdpbmRvdy5vcGVuKGxvZ1VybCwgJ19uZXd0YWInKTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBoYW5kbGVEZWxldGUoKSB7XG4gICAgICBjb25zdCBtc2cgPSAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgUnVuJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHV0aWxzLmNvbmZpcm1EZWxldGUoJ0RlbGV0ZSBSdW5zPycsIG1zZyk7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0Zvcm0oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBhcGkuZGVsZXRlUnVucyh0aGlzLiRyb3V0ZS5wYXJhbXMuam9iSWQsIHtyZWNvcmRzOiBbe2lkOiB0aGlzLm1vZGVsLmlkfV19KTtcbiAgICAgICAgICBuYXZlci50b1JlYWx0YXNrUGFnZShgL2pvYnMvJHt0aGlzLmpvYklkfWApO1xuICAgICAgICAgIHV0aWxzLm5vdGlmeVN1Y2Nlc3MocmVzcC5tZXNzYWdlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGhhbmRsZVJ1bkpvYih0YXNrSWRzKSB7XG4gICAgICBhd2FpdCB0aGlzLnByb2Nlc3NGb3JtKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGFwaS5leGVjdXRlSm9icyh0aGlzLmdldFJlcUJvZHkodGFza0lkcykpO1xuICAgICAgICB1dGlscy5ub3RpZnlTdWNjZXNzKCdKb2IgaGFzIGJlZW4gc3VibWl0dGVkIGZvciBleGVjdXRpb24nKTtcbiAgICAgICAgY29uc3QgcnVuSWQgPSByZXNwWzBdICYmIHJlc3BbMF0ucnVuSWQ7XG5cbiAgICAgICAgaWYgKHJ1bklkKSB7XG4gICAgICAgICAgbmF2ZXIudG9SZWFsdGFza1BhZ2UoYC9qb2JzLyR7dGhpcy5qb2JJZH0vcnVucy8ke3J1bklkfWApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgZ2V0UmVxQm9keSh0YXNrSWRzKSB7XG4gICAgICByZXR1cm4ge3JlY29yZHM6IFt7aWQ6IHRoaXMuam9iSWQsIHRhc2tJZHN9XX07XG4gICAgfSxcbiAgfSxcbn07XG48L3NjcmlwdD5cbiJdLCJuYW1lcyI6WyJfc2ZjX21haW4iLCJ1dGlscy52YWx1ZUxhYmVscyIsIl9jcmVhdGVCbG9jayIsIl9jcmVhdGVWTm9kZSIsInJ0VXRpbHMuZ2V0UnVuRmlsZXMiLCJhcGkub3BlbkZpbGUiLCJ1dGlscy5vcGVuVXJsIiwiX2NyZWF0ZUVsZW1lbnRCbG9jayIsIl9vcGVuQmxvY2siLCJfaG9pc3RlZF8xIiwiX2NyZWF0ZUVsZW1lbnRWTm9kZSIsIl93aXRoQ3R4IiwiX2hvaXN0ZWRfMiIsIl9ob2lzdGVkXzMiLCJ1dGlscy5jcmVhdGVSdW5GaWxlIiwicnRVdGlscy5nZXRUYXNrRmlsZXMiLCJjb21tb25BcGkuZ2V0RmlsZSIsInV0aWxzLnJlYWRDc3YiLCJ1dGlscy5mb3JtYXRTdG9yYWdlU2l6ZSIsInV0aWxzLmNhblZpZXdGaWxlIiwidXRpbHMubm90aWZ5SW5mbyIsIk1lc3NhZ2UiLCJnZXRUaXRsZSIsInRvSHVtYW5FbGFwc2VkVGltZSIsInJ0QXBpLmdldFJ1biIsIl9GcmFnbWVudCIsInJkVXRpbHMuZ2V0T2JqZWN0RmlsZXMiLCJ1dGlscy5nZXRSdW5EdXJhdGlvbiIsImRlZXBDbG9uZSIsInJ0VXRpbHMudmFsdWVMYWJlbHMiLCJhcGkuZ2V0UnVuIiwidXRpbHMuZm9ybWF0RGF0ZVRpbWVGb3JEaXNwbGF5IiwiYXBpLmdldEpvYiIsInV0aWxzLm5vdGlmeUVycm9yIiwidXRpbHMuY29uZmlybURlbGV0ZSIsImFwaS5kZWxldGVSdW5zIiwidXRpbHMubm90aWZ5U3VjY2VzcyIsImFwaS5leGVjdXRlSm9icyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE2Q0EsTUFBS0EsY0FBVTtBQUFBLEVBQ2IsT0FBTztBQUFBLElBQ0wsT0FBTztBQUFBO0VBRVQsWUFBWSxFQUFDLFlBQVc7QUFBQSxFQUN4QixPQUFPO0FBQ0wsV0FBTztBQUFBLE1BQ0wsU0FBUztBQUFBO0VBRWI7QUFBQSxFQUVBLFNBQVM7QU
2788FBQSxJQUNQLGNBQWM7QUFDWixhQUFPQztBQUFBQSxJQUNUO0FBQUE7QUFFSjs7Ozs7O3NCQTVERUMsWUFzQ08saUJBQUEsRUF0Q0QsVUFBUyxXQUFPO0FBQUEscUJBQ3BCLE1BT007QUFBQSxNQVBOQyxZQU9NLGdCQUFBLE1BQUE7QUFBQSx5QkFOSixNQUVTO0FBQUEsVUFGVEEsWUFFUyxtQkFBQSxNQUFBO0FBQUEsNkJBRFAsTUFBOEQ7QUFBQSxjQUE5REEsWUFBOEQsd0JBQUE7QUFBQSxnQkFBakQsT0FBTTtBQUFBLGdCQUFPLE9BQU8sT0FBQSxNQUFNLFFBQVEsT0FBQSxNQUFNO0FBQUE7Ozs7VUFFdkRBLFlBRVMsbUJBQUEsTUFBQTtBQUFBLDZCQURQLE1BQXdGO0FBQUEsY0FBeEZBLFlBQXdGLHdCQUFBO0FBQUEsZ0JBQTNFLE9BQU07QUFBQSxnQkFBVSxPQUFPLE9BQUEsTUFBTTtBQUFBLGdCQUFTLGFBQWEsU0FBQSxjQUFjO0FBQUE7Ozs7Ozs7TUFHbEZBLFlBT00sZ0JBQUEsTUFBQTtBQUFBLHlCQU5KLE1BRVM7QUFBQSxVQUZUQSxZQUVTLG1CQUFBLE1BQUE7QUFBQSw2QkFEUCxNQUF1RTtBQUFBLGNBQXZFQSxZQUF1RSx3QkFBQTtBQUFBLGdCQUExRCxPQUFNO0FBQUEsZ0JBQVksT0FBTyxPQUFBLE1BQU07QUFBQSxnQkFBUyxNQUFLO0FBQUE7Ozs7VUFFNURBLFlBRVMsbUJBQUEsTUFBQTtBQUFBLDZCQURQLE1BQW1FO0FBQUEsY0FBbkVBLFlBQW1FLHdCQUFBO0FBQUEsZ0JBQXRELE9BQU07QUFBQSxnQkFBVSxPQUFPLE9BQUEsTUFBTTtBQUFBLGdCQUFPLE1BQUs7QUFBQTs7Ozs7OztNQUcxREEsWUFVTSxnQkFBQSxNQUFBO0FBQUEseUJBVEosTUFFUztBQUFBLFVBRlRBLFlBRVMsbUJBQUEsTUFBQTtBQUFBLDZCQURQLE1BQXlIO0FBQUEsY0FBekhBLFlBQXlILH
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

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.