PageSourceSearch

https://app.datasert.com/assets/Jobs-CgikPvva.js

js datasert.com collected 2026-09-24 14:41:51 UTC 100,861 bytes, 1,017 lines download raw bytes

1import { Q as QBreadcrumbsEl } from "./QBreadcrumbsEl-DJmFSikN.js";
2import { O as getDeletedJobBackup, P as getDeletedJobsBackups, Q as deleteAndPurgeJobs, S as createJobBackup, T as getJobsJsonSummaryUrl, U as getSummaryJson, V as updateJobsBulk, W as executeJobs, X as importJob, Y as purgeJobs, Z as unlockJobs, _ as lockJobs, $ as deleteJobs, a0 as cloneJob, a1 as getJobFolders, a2 as getRecentJobIds, a3 as getJobs } from "./realsyncUtils-B_eb3OgH.js";
3import { aY as Folder_Recent, aB as sortIc, B as getEntityNamesListForDialog, y as confirmDelete, j as jsUtilsExports, h as notifySuccess, aP as showInput, R as showConfirm, aZ as Folder_Blank, aC as getEnvNamefromEnv, P as confirmExecute, K as STATUS_INACTIVE, S as STATUS_ACTIVE, H as isFilterStatusMatch, t as getCachedProfileOrNil, ag as getCacheOrCompute, z as deepClone, s as setLocalStore, _ as filterOwnerOptions, a_ as filterFrequencyOptions, aO as filterStatusesOptions, a6 as getLocalStore, aF as getFrequencyForList, v as valueLabels } from "./utils-Dl9t6EOZ.js";
4import { B as BackupsDialog, J as JobDialog } from "./BackupsDialog-CyfOwrVw.js";
5import { m as mixins } from "./mixins-BCMXzTHA.js";
6import { C as ChangeOwnerDialog } from "./ChangeOwnerDialog-BQ1BAtot.js";
7import { Q as QForm } from "./QForm-B7u6vHMU.js";
8import { _ as _export_sfc, c as createBlock, o as openBlock, w as withCtx, a as createVNode, r as resolveComponent, e as createCommentVNode, j as createTextVNode } from "./index-l2g1tnsc.js";
9import { T as TextViewerDialog } from "./TextViewerDialog-BPyN4E_q.js";
10import { I as InputJsonDialog } from "./InputJsonDialog-CZBYKuBU.js";
11import { E as EnvRef } from "./EnvRef-DLnnFTas.js";
12import { G as GridSelect } from "./GridSelect-CjyiI6pi.js";
13import "./http-QV44vcaW.js";
14import "./NotificationProps-CMkALiQg.js";
15import "./DialogSection-D-hqVt65.js";
16import "./Tooltip-BL9mlxg7.js";
17import "./Popover-DdmYwYku.js";
18import "./light-ChFcYHVz.js";
19import "./Scrollbar-w6xdyLLY.js";
20import "./SharingDialog-8nsVnUso.js";
21import "./api-CsX1TBBI.js";
22import "./mixinsV3-DJOx874v.js";
23import "./lodash-D-1jTqv6.js";
24/* empty css                                                     */
25import "./InputDateTime-Bg3tHE_T.js";
26import "./use-render-cache-DRJWLz-b.js";
27import "./QMenu-CMxSVE7y.js";
28import "./position-engine-DlL3Wjag.js";
29import "./selection-CtEbNG46.js";
30import "./ClosePopup-BJ95hjD9.js";
31import "./Column-CHEOSUiF.js";
32import "./InputSelect-BYAmTdat.js";
33import "./QItemSection-BtIVec04.js";
34import "./QSelect-a5Elgrcr.js";
35import "./QChip-o69cw4ec.js";
36import "./QItemLabel-Bl1X4QV1.js";
37import "./rtl-DDpZOXNn.js";
38import "./api-Dz7DFSvS.js";
39import "./api-5Qbpc5nF.js";
40import "./api-EaByEhnn.js";
41import "./TextViewer-DMWZwv7n.js";
42import "./styles-Ba8hxl-j.js";
43import "./CheckboxInline-OqdiZR8_.js";
44import "./QTooltip-CLIBmLrc.js";
45import "./IconMenu-DT6mxtJq.js";
46import "./QList-uCfqyM8w.js";
47import "./Icon-PX2LcDsd.js";
48import "./MenuItem-DTtADa1D.js";
49import "./Row-D4VaIJlq.js";
50import "./InputTemplate-C6rgpBgP.js";
51import "./FileViewerDialog2-dcy5GH6m.js";
52import "./Datagrid-0ZPXgtsI.js";
53import "./AgGridVue-P7zRffUM.js";
54import "./DataGridStatusRenderer-BEpV8SXs.js";
55import "./SyncStatus-Ehz8Em6K.js";
56import "./Close-CMLcMmhU.js";
57import "./Icon-XvtDqeG4.js";
58import "./replaceable-D4umoBrm.js";
59import "./upperFirst-DygzsnnD.js";
60import "./Toolbar-Cf2a7rhK.js";
61import "./QToolbarTitle-BeXkQQHt.js";
62import "./QToolbar-DonaEblG.js";
63import "./Avatar-DzN63Sfl.js";
64import "./is-browser-DvVMOi1n.js";
65import "./RecordRef-71_FjUo4.js";
66import "./RecordLink-BhuEBSlE.js";
67import "./RouteLink-CCU5m11L.js";
68const _sfc_main$2 = {
69  mixins: [mixins],
70  props: {
71    modelValue: Boolean,
72    model: Object,
73    envs: Array
74  },
75  emits: ["ok", "cancel", "update:modelValue"],
76  data() {
77    return {
78      modelInternal: Object.assign({}, this.model)
79    };
80  },
81  watch: {
82    modelValue() {
83      if (!this.modelValue) {
84        return;
85      }
86      this.message = null;
87      this.initingSuccess = true;
88    }
89  },
90  methods: {
91    close() {
92      this.$emit("cancel");
93    },
94    save() {
95      this.processForm(async () => {
96        this.$emit("ok", this.modelInternal);
97        this.close();
98      });
99    },
100    getStatusOptions() {
101      return [
102        { id: "", name: "All" },
103        { id: "active", name: "Active" },
104        { id: "inactive", name: "Inactive" },
105        { id: "error", name: "Error" }
106      ];
107    }
108  }
109};
110function _sfc_render$2(_ctx, _cache, $props, $setup, $data, $options) {
111  const _component_InputSelect = resolveComponent("InputSelect");
112  const _component_Column = resolveComponent("Column");
113  const _component_Row = resolveComponent("Row");
114  const _component_ContentDialog = resolveComponent("ContentDialog");
115  return openBlock(), createBlock(_component_ContentDialog, {
116    title: "Jobs Filter",
117    modelValue: $props.modelValue,
118    "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => _ctx.$emit("update:modelValue")),
119    message: _ctx.message,
120    messageType: _ctx.messageType,
121    initing: _ctx.initing,
122    initingSuccess: _ctx.initingSuccess,
123    processing: _ctx.processing,
124    processingCancellable: _ctx.processingCancellable,
125    height: "auto",
126    width: "600px",
127    onProcessingCancelled: _cache[3] || (_cache[3] = ($event) => _ctx.processingCancelled = true),
128    onDOk: $options.save
129  }, {
130    default: withCtx(() => [
131      createVNode(QForm, {
132        autofocus: "",
133        ref: "form"
134      }, {
135        default: withCtx(() => [
136          createVNode(_component_Row, null, {
137            default: withCtx(() => [
138              createVNode(_component_Column, null, {
139                default: withCtx(() => [
140                  createVNode(_component_InputSelect, {
141                    options: $options.getStatusOptions(),
142                    modelValue: $data.modelInternal.status,
143                    "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => $data.modelInternal.status = $event),
144                    label: "Status"
145                  }, null, 8, ["options", "modelValue"])
146                ]),
147                _: 1
148              }),
149              createVNode(_component_Column, null, {
150                default: withCtx(() => [
151                  createVNode(_component_InputSelect, {
152                    modelValue: $data.modelInternal.envId,
153                    "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => $data.modelInternal.envId = $event),
154                    label: "Env",
155                    options: $props.envs,
156                    showDefault: "",
157                    defaultLabel: "All",
158                    defaultValue: ""
159                  }, null, 8, ["modelValue", "options"])
160                ]),
161                _: 1
162              })
163            ]),
164            _: 1
165          })
166        ]),
167        _: 1
168      }, 512)
169    ]),
170    _: 1
171  }, 8, ["modelValue", "message", "messageType", "initing", "initingSuccess", "processing", "processingCancellable", "onDOk"]);
172}
173const JobsFilterDialog = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["render", _sfc_render$2], ["__scopeId", "data-v-d17e2ede"], ["__file", "JobsFilterDialog.vue"]]);
174const _sfc_main$1 = {
175  mixins: [mixins],
176  components: { TextViewerDialog },
177  props: {
178    modelValue: Boolean
179  },
180  emits: ["update:modelValue"],
181  data() {
182    return {
183      columns: [{ value: "name" }],
184      records: this.getBackups,
185      progressOpen: false,
186      loading: false,
187      init: false,
188      initingSuccess: true,
189      backups: [],
190      textViewerOpen: false,
191      textViewerContent: "",
192      textViewerTitle: "Job Backup"
193    };
194  },
195  methods: {
196    async getBackups() {
197      this.backups = await getDeletedJobsBackups() || [];
198      return this.backups;
199    },
200    refresh() {
201      this.refreshGrid();
202    },
203    refreshGrid() {
204      if (this.$refs.grid) {
205        this.$refs.grid.refresh();
206      }
207    },
208    getSelection() {
209      return this.$refs.grid.getConfirmedSelection();
210    },
211    async handleView(rec) {
212      if (!rec) {
213        return;
214      }
215      this.processForm(async () => {
216        const resp = await getDeletedJobBackup(rec.id);
217        this.textViewerContent = JSON.stringify(resp.content, void 0, "  ");
218        this.textViewerOpen = true;
219      });
220    }
221  }
222};
223function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
224  const _component_Table = resolveComponent("Table");
225  const _component_TextViewerDialog = resolveComponent("TextViewerDialog");
226  const _component_ContentDialog = resolveComponent("ContentDialog");
227  return openBlock(), createBlock(_component_ContentDialog, {
228    title: "Deleted Jobs",
229    modelValue: $props.modelValue,
230    "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => _ctx.$emit("update:modelValue")),
231    height: "auto",
232    width: "1000px",
233    closeMode: "",
234    initing: _ctx.initing,
235    initingSuccess: $data.initingSuccess,
236    processing: _ctx.processing,
237    message: _ctx.message,
238    messageType: _ctx.messageType
239  }, {
240    default: withCtx(() => [
241      createVNode(_component_Table, {
242        ref: "grid",
243        auditCreated: "",
244        updatable: false,
245        creatable: false,
246        deletable: false,
247        hideSelection: true,
248        viewable: "",
249        columns: $data.columns,
250        records: $data.records,
251        onView: $options.handleView,
252        recordType: "Backup",
253        recordTypePlural: "Backups",
254        refreshable: true
255      }, null, 8, ["columns", "records", "onView"]),
256      createVNode(_component_TextViewerDialog, {
257        modelValue: $data.textViewerOpen,
258        "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => $data.textViewerOpen = $event),
259        content: $data.textViewerContent,
260        title: $data.textViewerTitle,
261        code: ""
262      }, null, 8, ["modelValue", "content", "title"])
263    ]),
264    _: 1
265  }, 8, ["modelValue", "initing", "initingSuccess", "processing", "message", "messageType"]);
266}
267const DeletedJobsBackupsDialog = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["render", _sfc_render$1], ["__file", "DeletedJobsBackupsDialog.vue"]]);
268const cacheKeyFilterFolder = "rt.jobs.filter.folder";
269const cacheKeyFilterEnvId = "rt.jobs.filter.env";
270const _sfc_main = {
271  mixins: [mixins],
272  components: {
273    JobDialog,
274    ChangeOwnerDialog,
275    JobsFilterDialog,
276    BackupsDialog,
277    DeletedJobsBackupsDialog,
278    InputJsonDialog,
279    EnvRef,
280    TextViewerDialog,
281    GridSelect
282  },
283  data() {
284    return {
285      columns: [
286        {
287          value: "name"
288        },
289        { value: "status" },
290        { value: (row) => getFrequencyForList(row.options.scheduling), label: "Frequency" },
291        {
292          value: "envField",
293          label: "Env"
294        },
295        { value: "folder" },
296        {
297          value: (row) => {
298            var _a, _b;
299            return ((_b = (_a = row.settings) == null ? void 0 : _a.scheduling) == null ? void 0 : _b.lastRunAt) || "";
300          },
301          type: "datetime",
302          label: "Last Run At"
303        },
304        { value: "nextRunAt", type: "datetime" },
305        {
306          value: (row) => row.run_updated_at || "",
307          type: "datetime",
308          label: "Run Updated At"
309        },
310        { value: (row) => row.options.resourceLevel, label: "Resource Level" },
311        {
312          value: (row) => row.options.executionMethod,
313          label: "Job Duration",
314          valueLabels: valueLabels.executionMethod
315        },
316        { value: (row) => row.options.logLevel, label: "Log Level" }
317      ],
318      records: this.getRecords,
319      progressOpen: false,
320      loading: false,
321      init: false,
322      initingSuccess: true,
323      dialogOpen: false,
324      dialogFolder: "",
325      dialogMode: "add",
326      dialogJobId: null,
327      dialogData: [],
328      model: {},
329      changeOwnerDialogOpen: false,
330      changeOwnerDialogData: [],
331      filterReq: {
332        envId: getLocalStore(cacheKeyFilterEnvId) || "",
333        folder: getLocalStore(cacheKeyFilterFolder) || "",
334        status: "",
335        frequency: ""
336      },
337      jobsFilterDialogOpen: false,
338      envs: [],
339      folders: [],
340      status: "",
341      jobs: [],
342      filteredJobs: [],
343      recentJobIds: [],
344      filterStatuses: filterStatusesOptions,
345      filterFrequencyOptions,
346      filterOwnerOptions,
347      textViewerOpen: false,
348      textViewerContent: "",
349      textViewerTitle: "Job Export (Json)",
350      backupsDialogOpen: false,
351      backupsDialogEntityId: "",
352      backupsDialogTitle: "Job Backups",
353      deletedJobsBackupsDialogOpen: false,
354      importJobsDialogOpen: false,
355      importJobsDialogError: "",
356      importJobsDialogContent: ""
357    };
358  },
359  async created() {
360    this.envs = await this.getEnvRefs();
361  },
362  watch: {
363    "filterReq.envId"() {
364      setLocalStore(cacheKeyFilterEnvId, this.filterReq.envId);
365      this.filter();
366    },
367    "filterReq.folder"() {
368      setLocalStore(cacheKeyFilterFolder, this.filterReq.folder);
369      this.filter();
370      this.sortJobs();
371    },
372    "filterReq.status"() {
373      this.filter();
374    },
375    "filterReq.frequency"() {
376      this.filter();
377    },
378    "filterReq.owner"() {
379      this.filter();
380    }
381  },
382  methods: {
383    async getRecords() {
384      if (!this.init) {
385        this.init = true;
386        await this.getJobs();
387      }
388      this.updateStatus();
389      return deepClone(this.filteredJobs);
390    },
391    async getJobs(force = false) {
392      this.loading = true;
393      const filterParams = {
394        envId: this.filterReq.envId || void 0,
395        folder: this.filterReq.folder || void 0
396      };
397      const cacheKey = `rtJobs_${JSON.stringify(filterParams)}`;
398      const [jobs, foldersResp, recentJobsResp] = await Promise.all([
399        getCacheOrCompute("jobs", cacheKey, 30, force, () => getJobs(filterParams)),
400        getJobFolders(),
401        getRecentJobIds()
402      ]);
403      this.recentJobIds = (recentJobsResp.ids || []).slice(0, 10);
404      this.filteredJobs = this.jobs = jobs || [];
405      this.updateFolders(foldersResp);
406      this.filter();
407      this.sortJobs();
408      this.updateStatus();
409      this.loading = false;
410      force ? this.refresh() : void 0;
411    },
412    setFilteredJobs(jobs = []) {
413      this.filteredJobs = jobs;
414    },
415    refresh() {
416      this.refreshGrid();
417    },
418    refreshGrid() {
419      if (this.$refs.grid) {
420        this.$refs.grid.refresh();
421      }
422    },
423    async refreshJobs() {
424      await this.getJobs(true);
425    },
426    handleAdd() {
427      this.message = null;
428      this.dialogJobId = void 0;
429      this.dialogMode = "add";
430      this.dialogOpen = true;
431      this.dialogFolder = this.filterReq.folder;
432    },
433    filter() {
434      if (this.filterReq.folder !== Folder_Recent && this.filterReq.folder !== Folder_Blank && !this.folders.map((folder) => folder.id).includes(this.filterReq.folder)) {
435        this.filterReq.folder = "";
436      }
437      if (!this.filterReq.folder && !this.filterReq.envId && !this.filterReq.status && !this.filterReq.frequency && !this.filterReq.owner) {
438        const jobs = [...this.jobs].filter((it) => it.status !== "deleted");
439        this.setFilteredJobs(jobs);
440      } else {
441        let jobs = [...this.jobs];
442        if (this.filterReq.folder) {
443          if (this.filterReq.folder === Folder_Recent) {
444            jobs = jobs.filter((job) => this.recentJobIds.includes(job.id));
445          } else if (this.filterReq.folder === Folder_Blank) {
446            jobs = jobs.filter((job) => !job.folder || jsUtilsExports.equalsIc(job.folder, Folder_Blank));
447          } else {
448            jobs = jobs.filter((job) => jsUtilsExports.equalsIc(job.folder, this.filterReq.folder));
449          }
450        }
451        if (this.filterReq.envId) {
452          jobs = jobs.filter((job) => job.envId === this.filterReq.envId);
453        }
454        if (this.filterReq.status) {
455          jobs = jobs.filter((job) => isFilterStatusMatch(job.status, job.runStatus, this.filterReq.status));
456        } else {
457          jobs = jobs.filter((job) => job.status !== "deleted");
458        }
459        if (this.filterReq.frequency) {
460          jobs = jobs.filter(
461            (job) => {
462              var _a, _b, _c, _d;
463              return this.filterReq.frequency === "manual" ? ((_b = (_a = job.options) == null ? void 0 : _a.scheduling) == null ? void 0 : _b.frequency) === "manual" : ((_d = (_c = job.options) == null ? void 0 : _c.scheduling) == null ? void 0 : _d.frequency) !== "manual";
464            }
465          );
466        }
467        if (this.filterReq.owner) {
468          const profile = getCachedProfileOrNil();
469          if (profile) {
470            jobs = jobs.filter((job) => this.filterReq.owner === "me" ? job.ownerId === profile.userId : job.ownerId !== profile.userId);
471          }
472        }
473        this.setFilteredJobs(jobs);
474      }
475      this.refresh();
476    },
477    async handleClone(rec) {
478      return this.processForm(async () => {
479        try {
480          await cloneJob(rec.id);
481          this.processing = false;
482          await this.getJobs(true);
483        } finally {
484          this.progressOpen = false;
485        }
486      });
487    },
488    async handleDelete(recs) {
489      this.message = null;
490      const msg = `Are you sure you want to delete following Jobs? </br> ${getEntityNamesListForDialog(recs)}`;
491      const confirmed = await confirmDelete("Delete Jobs?", msg);
492      if (confirmed) {
493        this.handleDeleteAfterConfirm(recs);
494      }
495    },
496    handleDeleteAfterConfirm(recs) {
497      this.progressOpen = true;
498      this.processForm(async () => {
499        try {
500          const resp = await deleteJobs({ records: recs.map((rec) => ({ id: rec.id })) });
501          notifySuccess(resp.message);
502          this.processing = false;
503          await this.getJobs(true);
504        } finally {
505          this.progressOpen = false;
506        }
507      });
508    },
509    handleEdit(rec) {
510      this.message = null;
511      this.dialogJobId = rec.id;
512      this.dialogMode = "edit";
513      this.dialogOpen = true;
514      this.dialogData = rec;
515    },
516    async handleSave(conn) {
517      await this.getJobs(true);
518    },
519    handleActivate() {
520      this.updateJobsBulk(this.getSelection(), { status: STATUS_ACTIVE });
521    },
522    handleInactivate() {
523      this.updateJobsBulk(this.getSelection(), { status: STATUS_INACTIVE });
524    },
525    handleLockJobs() {
526      const sels = this.getSelection();
527      this.processForm(async () => {
528        await lockJobs({ ids: jsUtilsExports.mapToIds(sels) });
529        notifySuccess("Jobs have been locked");
530        await this.getJobs(true);
531      });
532    },
533    handleUnlockJobs() {
534      const sels = this.getSelection();
535      this.processForm(async () => {
536        await unlockJobs({ ids: jsUtilsExports.mapToIds(sels) });
537        notifySuccess("Jobs have been unlocked");
538        await this.getJobs(true);
539      });
540    },
541    async handlePurgeJobs() {
542      const sels = this.getSelection();
543      const nonDeletedSels = sels.filter((it) => !jsUtilsExports.isDeleted(it));
544      if (nonDeletedSels.length > 0) {
545        this.message = "Only deleted Jobs can be purged";
546        return;
547      }
548      this.message = null;
549      const msg = `Are you sure you want to purge following Jobs? <ul> ${getEntityNamesListForDialog(sels)} </ul>If confirmed, selected Jobs, its Tasks and Runs will be PERMANENTLY DELETED.`;
550      const confirmed = await confirmDelete("Purge Jobs?", msg);
551      if (confirmed) {
552        return this.processForm(async () => {
553          const resp = await purgeJobs({ ids: jsUtilsExports.mapToIds(sels) });
554          notifySuccess(resp.message || "Selected Jobs have been purged");
555          await this.getJobs(true);
556        });
557      }
558    },
559    validateImportJobJson(content) {
560      if (!content.name) {
561        throw new Error("Field name is required");
562      }
563    },
564    handleImportJob() {
565      this.importJobsDialogContent = "";
566      this.importJobsDialogError = "";
567      this.importJobsDialogOpen = true;
568    },
569    handleImportJobOk(content) {
570      this.importJobsDialogOpen = false;
571      this.process(async () => {
572        try {
573          const resp = await importJob(JSON.parse(content));
574          this.refreshJobs();
575          notifySuccess(resp.message || "Job has been imported");
576        } catch (e) {
577          this.importJobsDialogContent = content;
578          this.importJobsDialogOpen = true;
579          this.importJobsDialogError = e.message;
580        }
581      });
582    },
583    async handleRunJobs() {
584      const sels = this.getSelection();
585      if (sels) {
586        const confirmed = await confirmExecute("Run Jobs?", `Are you sure you want to run selected ${sels.length} Jobs?`);
587        if (confirmed) {
588          this.executeJobs(sels);
589        }
590      }
591    },
592    executeJobs(sels) {
593      this.processForm(async () => {
594        await executeJobs({ records: sels.map((dl) => ({ id: dl.id })) });
595        this.processing = false;
596        notifySuccess("Jobs have been submitted for execution");
597        await this.getJobs(true);
598      });
599    },
600    updateJobsBulk(sels, fieldsToUpdate) {
601      if (!sels || sels.length === 0) {
602        return;
603      }
604      const payload = sels.map((sel) => Object.assign({ id: sel.id }, fieldsToUpdate));
605      this.processForm(async () => {
606        await updateJobsBulk({ records: payload });
607        notifySuccess("Jobs have been updated");
608        await this.getJobs(true);
609      });
610    },
611    getSelection() {
612      return this.$refs.grid.getConfirmedSelection();
613    },
614    // async runClickHandle(sel) {
615    //   if (sel) {
616    //     const confirmed = await utils.confirmExecute('Run Job?', 'Are you sure you want to run selected Job?');
617    //
618    //     if (confirmed) {
619    //       this.executeJobs([sel]);
620    //     }
621    //   }
622    // },
623    handleChangeOwner() {
624      this.changeOwnerDialogData = this.getSelection();
625      if (this.changeOwnerDialogData) {
626        this.changeOwnerDialogOpen = true;
627      }
628    },
629    async handleChangeFolder() {
630      const input = await showInput("New Folder Name", "Enter new folder name. Leave it blank and click Ok to remove folder from selected jobs.");
631      if (input === void 0) {
632        return;
633      }
634      await this.updateJobsBulk(this.getSelection(), { folder: input });
635    },
636    openJobsFilterDialog() {
637      this.jobsFilterDialogOpen = true;
638    },
639    handleJobFilter(range) {
640      this.filterReq = this.filterReq || {};
641      this.filterReq.status = range.status;
642      this.filterReq.envId = range.envId || "";
643      this.filterReq.folder = range.folder || "";
644      this.$refs.grid.refresh();
645    },
646    updateStatus() {
647      const filters = [
648        `Env: ${this.filterReq.envId ? getEnvNamefromEnv(this.envs, this.filterReq.envId) : "All"}`,
649        `Folder: ${this.filterReq.folder ? this.filterReq.folder : "All"}`,
650        `Status: ${this.filterReq.status ? this.filterReq.status : "All"}`
651      ];
652      this.status = `Filter [${filters.join(", ")}]`;
653    },
654    updateFolders(foldersResp) {
655      const folders = sortIc(foldersResp.folders.map((it) => it));
656      this.folders = [
657        { id: Folder_Recent, name: Folder_Recent },
658        { id: Folder_Blank, name: Folder_Blank },
659        ...folders.map((folder) => ({ id: folder, name: folder }))
660      ];
661    },
662    async viewSummaryJson() {
663      const rec = this.$refs.grid.getConfirmedSelectionOne();
664      if (!rec) {
665        return;
666      }
667      return this.processForm(async () => {
668        this.textViewerContent = await getSummaryJson(rec.id);
669        this.textViewerOpen = true;
670      });
671    },
672    async exportAllJobs() {
673      const recs = this.$refs.grid.getConfirmedSelection();
674      if (!recs) {
675        return;
676      }
677      const msg = `You are exporting details of ${recs.length} Jobs. </br></br> Are you sure you want to continue?`;
678      const confirmed = await showConfirm("Export Jobs", msg);
679      if (!confirmed) {
680        return;
681      } else {
682        return this.processForm(async () => {
683          const res = await getJobsJsonSummaryUrl({ ids: recs.map((it) => it.id) });
684          window.open(res.downloadUrl, "_self");
685        });
686      }
687    },
688    async createBackup() {
689      const rec = this.$refs.grid.getConfirmedSelectionOne();
690      if (!rec) {
691        return;
692      }
693      const name = await showInput("Backup Name", "Please enter backup name", { required: true });
694      if (!name) {
695        return;
696      }
697      return this.processForm(async () => {
698        const resp = await createJobBackup(rec.id, { name });
699        notifySuccess(resp.message || "Backup has been created");
700      });
701    },
702    async viewBackups() {
703      const rec = this.$refs.grid.getConfirmedSelectionOne();
704      if (!rec) {
705        return;
706      }
707      this.backupsDialogEntityId = rec.id;
708      this.backupsDialogTitle = `Job Backups - ${rec.name}`;
709      this.backupsDialogOpen = true;
710    },
711    viewDeletedJobs() {
712      this.deletedJobsBackupsDialogOpen = true;
713    },
714    async handleDeletePurgeJobs() {
715      const sels = this.getSelection();
716      if (!sels || sels.length === 0) {
717        return;
718      }
719      const msg = `Are you sure you want to delete and purge following Jobs? <ul> ${getEntityNamesListForDialog(sels)} </ul>If confirmed, selected Jobs, its Tasks and Runs will be PERMANENTLY DELETED.`;
720      const result = await confirmDelete("Delete and Purge Jobs?", msg);
721      if (result) {
722        return this.processForm(async () => {
723          const resp = await deleteAndPurgeJobs({ ids: jsUtilsExports.mapToIds(sels) });
724          notifySuccess(resp.message || "Jobs have been purged");
725          await this.getJobs(true);
726        });
727      }
728    },
729    sortJobs() {
730      if (this.filterReq.folder === Folder_Recent) {
731        const recentIdsSet = new Set(this.recentJobIds);
732        this.filteredJobs = [
733          ...this.filteredJobs.sort((a, b) => {
734            const aInRecent = recentIdsSet.has(a.id);
735            const bInRecent = recentIdsSet.has(b.id);
736            if (aInRecent && !bInRecent) return -1;
737            if (!aInRecent && bInRecent) return 1;
738            if (aInRecent && bInRecent) {
739              return this.recentJobIds.indexOf(a.id) - this.recentJobIds.indexOf(b.id);
740            }
741            return sortIc(a.name, b.name);
742          })
743        ];
744      }
745    }
746  }
747};
748function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
749  const _component_GridSelect = resolveComponent("GridSelect");
750  const _component_MenuItem = resolveComponent("MenuItem");
751  const _component_Separator = resolveComponent("Separator");
752  const _component_IconMenu = resolveComponent("IconMenu");
753  const _component_Icon = resolveComponent("Icon");
754  const _component_EnvRef = resolveComponent("EnvRef");
755  const _component_Table = resolveComponent("Table");
756  const _component_JobDialog = resolveComponent("JobDialog");
757  const _component_ChangeOwnerDialog = resolveComponent("ChangeOwnerDialog");
758  const _component_JobsFilterDialog = resolveComponent("JobsFilterDialog");
759  const _component_TextViewerDialog = resolveComponent("TextViewerDialog");
760  const _component_BackupsDialog = resolveComponent("BackupsDialog");
761  const _component_DeletedJobsBackupsDialog = resolveComponent("DeletedJobsBackupsDialog");
762  const _component_InputJsonDialog = resolveComponent("InputJsonDialog");
763  const _component_Page = resolveComponent("Page");
764  return openBlock(), createBlock(_component_Page, {
765    title: "Jobs",
766    initing: _ctx.initing,
767    initingSuccess: $data.initingSuccess,
768    processing: _ctx.processing,
769    message: _ctx.message,
770    messageType: _ctx.messageType
771  }, {
772    breadcrumbs: withCtx(() => [
773      createVNode(QBreadcrumbsEl, {
774        label: "Home",
775        to: "/realtask/home"
776      })
777    ]),
778    default: withCtx(() => [
779      createVNode(_component_Table, {
780        ref: "grid",
781        recordType: "Job",
782        recordTypePlural: "Jobs",
783        nameLinkPrefix: "/realtask/jobs",
784        onAdd: $options.handleAdd,
785        onEdit: $options.handleEdit,
786        onDelete: $options.handleDelete,
787        clone: "",
788        onCloneClick: $options.handleClone,
789        audit: "",
790        owner: "",
791        sharing: "",
792        status: $data.status,
793        refreshable: false,
794        columns: $data.columns,
795        records: $data.records,
796        customRefresh: "",
797        onCustomRefresh: _cache[5] || (_cache[5] = ($event) => $options.getJobs(true)),
798        customLoading: $data.loading
799      }, {
800        "toolbar-actions": withCtx(() => [
801          createVNode(_component_GridSelect, {
802            modelValue: $data.filterReq.envId,
803            "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => $data.filterReq.envId = $event),
804            options: $data.envs,
805            showDefault: "",
806            defaultLabel: "-Env-",
807            defaultValue: ""
808          }, null, 8, ["modelValue", "options"]),
809          createVNode(_component_GridSelect, {
810            modelValue: $data.filterReq.folder,
811            "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => $data.filterReq.folder = $event),
812            options: $data.folders,
813            showDefault: "",
814            defaultLabel: "-Folder-",
815            defaultValue: ""
816          }, null, 8, ["modelValue", "options"]),
817          createVNode(_component_GridSelect, {
818            modelValue: $data.filterReq.status,
819            "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => $data.filterReq.status = $event),
820            options: $data.filterStatuses,
821            showDefault: "",
822            defaultLabel: "-Status-",
823            defaultValue: ""
824          }, null, 8, ["modelValue", "options"]),
825          createVNode(_component_GridSelect, {
826            modelValue: $data.filterReq.frequency,
827            "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => $data.filterReq.frequency = $event),
828            options: $data.filterFrequencyOptions,
829            showDefault: "",
830            defaultLabel: "-Frequency-",
831            defaultValue: ""
832          }, null, 8, ["modelValue", "options"]),
833          createVNode(_component_GridSelect, {
834            modelValue: $data.filterReq.owner,
835            "onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => $data.filterReq.owner = $event),
836            options: $data.filterOwnerOptions,
837            showDefault: "",
838            defaultLabel: "-Owner-",
839            defaultValue: ""
840          }, null, 8, ["modelValue", "options"]),
841          createVNode(_component_IconMenu, null, {
842            default: withCtx(() => [
843              createVNode(_component_MenuItem, { onClick: $options.handleActivate }, {
844                default: withCtx(() => [..._cache[16] || (_cache[16] = [
845                  createTextVNode("Activate", -1)
846                ])]),
847                _: 1
848              }, 8, ["onClick"]),
849              createVNode(_component_MenuItem, { onClick: $options.handleInactivate }, {
850                default: withCtx(() => [..._cache[17] || (_cache[17] = [
851                  createTextVNode("Inactivate", -1)
852                ])]),
853                _: 1
854              }, 8, ["onClick"]),
855              createVNode(_component_MenuItem, { onClick: $options.handleChangeFolder }, {
856                default: withCtx(() => [..._cache[18] || (_cache[18] = [
857                  createTextVNode("Change Folder", -1)
858                ])]),
859                _: 1
860              }, 8, ["onClick"]),
861              createVNode(_component_MenuItem, { onClick: $options.handleChangeOwner }, {
862                default: withCtx(() => [..._cache[19] || (_cache[19] = [
863                  createTextVNode("Change Owner", -1)
864                ])]),
865                _: 1
866              }, 8, ["onClick"]),
867              createVNode(_component_Separator),
868              createVNode(_component_MenuItem, { onClick: $options.handleLockJobs }, {
869                default: withCtx(() => [..._cache[20] || (_cache[20] = [
870                  createTextVNode("Lock", -1)
871                ])]),
872                _: 1
873              }, 8, ["onClick"]),
874              createVNode(_component_MenuItem, { onClick: $options.handleUnlockJobs }, {
875                default: withCtx(() => [..._cache[21] || (_cache[21] = [
876                  createTextVNode("Unlock", -1)
877                ])]),
878                _: 1
879              }, 8, ["onClick"]),
880              createVNode(_component_Separator),
881              createVNode(_component_MenuItem, { onClick: $options.handlePurgeJobs }, {
882                default: withCtx(() => [..._cache[22] || (_cache[22] = [
883                  createTextVNode("Purge", -1)
884                ])]),
885                _: 1
886              }, 8, ["onClick"]),
887              createVNode(_component_MenuItem, { onClick: $options.handleDeletePurgeJobs }, {
888                default: withCtx(() => [..._cache[23] || (_cache[23] = [
889                  createTextVNode("Delete and Purge", -1)
890                ])]),
891                _: 1
892              }, 8, ["onClick"]),
893              createVNode(_component_Separator),
894              createVNode(_component_MenuItem, { onClick: $options.createBackup }, {
895                default: withCtx(() => [..._cache[24] || (_cache[24] = [
896                  createTextVNode("Create Backup", -1)
897                ])]),
898                _: 1
899              }, 8, ["onClick"]),
900              createVNode(_component_MenuItem, { onClick: $options.viewBackups }, {
901                default: withCtx(() => [..._cache[25] || (_cache[25] = [
902                  createTextVNode("View Backups", -1)
903                ])]),
904                _: 1
905              }, 8, ["onClick"]),
906              createVNode(_component_Separator),
907              createVNode(_component_MenuItem, { onClick: $options.exportAllJobs }, {
908                default: withCtx(() => [..._cache[26] || (_cache[26] = [
909                  createTextVNode("Export Jobs (Zip file)", -1)
910                ])]),
911                _: 1
912              }, 8, ["onClick"]),
913              createVNode(_component_MenuItem, { onClick: $options.viewSummaryJson }, {
914                default: withCtx(() => [..._cache[27] || (_cache[27] = [
915                  createTextVNode("Export Job (Json)", -1)
916                ])]),
917                _: 1
918              }, 8, ["onClick"]),
919              createVNode(_component_MenuItem, { onClick: $options.handleImportJob }, {
920                default: withCtx(() => [..._cache[28] || (_cache[28] = [
921                  createTextVNode("Import Job (Json)", -1)
922                ])]),
923                _: 1
924              }, 8, ["onClick"]),
925              createVNode(_component_Separator),
926              createVNode(_component_MenuItem, { onClick: $options.handleRunJobs }, {
927                default: withCtx(() => [..._cache[29] || (_cache[29] = [
928                  createTextVNode("Run Jobs", -1)
929                ])]),
930                _: 1
931              }, 8, ["onClick"])
932            ]),
933            _: 1
934          })
935        ]),
936        "additional-actions": withCtx((row) => [
937          row.options.multiRuns && row.options.multiRuns.location ? (openBlock(), createBlock(_component_Icon, {
938            key: 0,
939            name: "mediation",
940            size: "xs",
941            tooltip: "Multi Runs enabled with " + (row.options.multiRuns.instances || "unknown") + " instances"
942          }, null, 8, ["tooltip"])) : createCommentVNode("", true),
943          row.options.runLooping && row.options.runLooping.location ? (openBlock(), createBlock(_component_Icon, {
944            key: 1,
945            name: "repeat_one",
946            size: "xs",
947            tooltip: "Run Looping enabled"
948          })) : createCommentVNode("", true)
949        ]),
950        envField: withCtx((row) => [
951          createVNode(_component_EnvRef, {
952            model: row,
953            field: "envId"
954          }, null, 8, ["model"])
955        ]),
956        _: 1
957      }, 8, ["onAdd", "onEdit", "onDelete", "onCloneClick", "status", "columns", "records", "customLoading"]),
958      createVNode(_component_JobDialog, {
959        modelValue: $data.dialogOpen,
960        "onUpdate:modelValue": _cache[6] || (_cache[6] = ($event) => $data.dialogOpen = $event),
961        jobId: $data.dialogJobId,
962        mode: $data.dialogMode,
963        folder: this.dialogFolder,
964        data: $data.dialogData,
965        onCancel: _cache[7] || (_cache[7] = ($event) => $data.dialogOpen = false),
966        onOk: $options.handleSave
967      }, null, 8, ["modelValue", "jobId", "mode", "folder", "data", "onOk"]),
968      createVNode(_component_ChangeOwnerDialog, {
969        modelValue: $data.changeOwnerDialogOpen,
970        "onUpdate:modelValue": _cache[8] || (_cache[8] = ($event) => $data.changeOwnerDialogOpen = $event),
971        resources: $data.changeOwnerDialogData,
972        onCancel: _cache[9] || (_cache[9] = ($event) => $data.changeOwnerDialogOpen = false),
973        onOk: $options.handleSave,
974        type: "rtjob"
975      }, null, 8, ["modelValue", "resources", "onOk"]),
976      createVNode(_component_JobsFilterDialog, {
977        modelValue: $data.jobsFilterDialogOpen,
978        "onUpdate:modelValue": _cache[10] || (_cache[10] = ($event) => $data.jobsFilterDialogOpen = $event),
979        model: $data.filterReq,
980        onCancel: _cache[11] || (_cache[11] = ($event) => $data.jobsFilterDialogOpen = false),
981        onOk: $options.handleJobFilter,
982        envs: $data.envs
983      }, null, 8, ["modelValue", "model", "onOk", "envs"]),
984      createVNode(_component_TextViewerDialog, {
985        modelValue: $data.textViewerOpen,
986        "onUpdate:modelValue": _cache[12] || (_cache[12] = ($event) => $data.textViewerOpen = $event),
987        content: $data.textViewerContent,
988        title: $data.textViewerTitle,
989        code: ""
990      }, null, 8, ["modelValue", "content", "title"]),
991      createVNode(_component_BackupsDialog, {
992        modelValue: $data.backupsDialogOpen,
993        "onUpdate:modelValue": _cache[13] || (_cache[13] = ($event) => $data.backupsDialogOpen = $event),
994        title: $data.backupsDialogTitle,
995        entityId: $data.backupsDialogEntityId
996      }, null, 8, ["modelValue", "title", "entityId"]),
997      createVNode(_component_DeletedJobsBackupsDialog, {
998        modelValue: $data.deletedJobsBackupsDialogOpen,
999        "onUpdate:modelValue": _cache[14] || (_cache[14] = ($event) => $data.deletedJobsBackupsDialogOpen = $event)
1000      }, null, 8, ["modelValue"]),
1001      createVNode(_component_InputJsonDialog, {
1002        title: "Enter Job Json to import",
1003        modelValue: $data.importJobsDialogOpen,
1004        "onUpdate:modelValue": _cache[15] || (_cache[15] = ($event) => $data.importJobsDialogOpen = $event),
1005        json: $data.importJobsDialogContent,
1006        error: $data.importJobsDialogError,
1007        onOk: $options.handleImportJobOk
1008      }, null, 8, ["modelValue", "json", "error", "onOk"])
1009    ]),
1010    _: 1
1011  }, 8, ["initing", "initingSuccess", "processing", "message", "messageType"]);
1012}
1013const Jobs = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__file", "Jobs.vue"]]);
1014export {
1015  Jobs as default
1016};
1017//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSm9icy1DZ2lrUHZ2YS5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Byb2R1Y3RzL3JlYWx0YXNrL3BhZ2VzL2pvYnMvSm9ic0ZpbHRlckRpYWxvZy52dWUiLCIuLi8uLi8uLi9zcmMvcHJvZHVjdHMvcmVhbHRhc2svcGFnZXMvam9icy9EZWxldGVkSm9ic0JhY2t1cHNEaWFsb2cudnVlIiwiLi4vLi4vLi4vc3JjL3Byb2R1Y3RzL3JlYWx0YXNrL3BhZ2VzL2pvYnMvSm9icy52dWUiXSwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPlxuICA8Q29udGVudERpYWxvZ1xuICAgIHRpdGxlPVwiSm9icyBGaWx0ZXJcIlxuICAgIDptb2RlbFZhbHVlPVwibW9kZWxWYWx1ZVwiXG4gICAgQHVwZGF0ZTptb2RlbFZhbHVlPVwiJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJylcIlxuICAgIDptZXNzYWdlPVwibWVzc2FnZVwiXG4gICAgOm1lc3NhZ2VUeXBlPVwibWVzc2FnZVR5cGVcIlxuICAgIDppbml0aW5nPVwiaW5
1017pdGluZ1wiXG4gICAgOmluaXRpbmdTdWNjZXNzPVwiaW5pdGluZ1N1Y2Nlc3NcIlxuICAgIDpwcm9jZXNzaW5nPVwicHJvY2Vzc2luZ1wiXG4gICAgOnByb2Nlc3NpbmdDYW5jZWxsYWJsZT1cInByb2Nlc3NpbmdDYW5jZWxsYWJsZVwiXG4gICAgaGVpZ2h0PVwiYXV0b1wiXG4gICAgd2lkdGg9XCI2MDBweFwiXG4gICAgQHByb2Nlc3NpbmdDYW5jZWxsZWQ9XCJwcm9jZXNzaW5nQ2FuY2VsbGVkID0gdHJ1ZVwiXG4gICAgQGQtb2s9XCJzYXZlXCJcbiAgPlxuICAgIDxxLWZvcm0gYXV0b2ZvY3VzIHJlZj1cImZvcm1cIj5cbiAgICAgIDxSb3c+XG4gICAgICAgIDxDb2x1bW4+XG4gICAgICAgICAgPElucHV0U2VsZWN0IDpvcHRpb25zPVwiZ2V0U3RhdHVzT3B0aW9ucygpXCIgdi1tb2RlbD1cIm1vZGVsSW50ZXJuYWwuc3RhdHVzXCIgbGFiZWw9XCJTdGF0dXNcIiAvPlxuICAgICAgICA8L0NvbHVtbj5cbiAgICAgICAgPENvbHVtbj5cbiAgICAgICAgICA8SW5wdXRTZWxlY3Qgdi1tb2RlbD1cIm1vZGVsSW50ZXJuYWwuZW52SWRcIiBsYWJlbD1cIkVudlwiIDpvcHRpb25zPVwiZW52c1wiIHNob3dEZWZhdWx0IGRlZmF1bHRMYWJlbD1cIkFsbFwiIGRlZmF1bHRWYWx1ZT1cIlwiIC8+XG4gICAgICAgIDwvQ29sdW1uPlxuICAgICAgPC9Sb3c+XG4gICAgPC9xLWZvcm0+XG4gIDwvQ29udGVudERpYWxvZz5cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgKiBhcyBhcGkgZnJvbSAnLi4vLi4vc2VydmljZXMvYXBpJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJ3NyYy9zZXJ2aWNlcy91dGlscyc7XG5pbXBvcnQgbWl4aW5zIGZyb20gJ3NyYy9taXhpbnMvbWl4aW5zJztcbmltcG9ydCB7ZGF0ZX0gZnJvbSAncXVhc2FyJztcbmltcG9ydCB7aW5pdFJ0Sm9ifSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ydFV0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFttaXhpbnNdLFxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IEJvb2xlYW4sXG4gICAgbW9kZWw6IE9iamVjdCxcbiAgICBlbnZzOiBBcnJheSxcbiAgfSxcbiAgZW1pdHM6IFsnb2snLCAnY2FuY2VsJywgJ3VwZGF0ZTptb2RlbFZhbHVlJ10sXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZGVsSW50ZXJuYWw6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMubW9kZWwpLFxuICAgIH07XG4gIH0sXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSgpIHtcbiAgICAgIGlmICghdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubWVzc2FnZSA9IG51bGw7XG4gICAgICB0aGlzLmluaXRpbmdTdWNjZXNzID0gdHJ1ZTtcbiAgICB9LFxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBjbG9zZSgpIHtcbiAgICAgIHRoaXMuJGVtaXQoJ2NhbmNlbCcpO1xuICAgIH0sXG4gICAgc2F2ZSgpIHtcbiAgICAgIHRoaXMucHJvY2Vzc0Zvcm0oYXN5bmMgKCkgPT4ge1xuICAgICAgICB0aGlzLiRlbWl0KCdvaycsIHRoaXMubW9kZWxJbnRlcm5hbCk7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBnZXRTdGF0dXNPcHRpb25zKCkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAge2lkOiAnJywgbmFtZTogJ0FsbCd9LFxuICAgICAgICB7aWQ6ICdhY3RpdmUnLCBuYW1lOiAnQWN0aXZlJ30sXG4gICAgICAgIHtpZDogJ2luYWN0aXZlJywgbmFtZTogJ0luYWN0aXZlJ30sXG4gICAgICAgIHtpZDogJ2Vycm9yJywgbmFtZTogJ0Vycm9yJ30sXG4gICAgICBdO1xuICAgIH0sXG4gIH0sXG59O1xuPC9zY3JpcHQ+XG48c3R5bGUgc2NvcGVkPlxuLmxpc3QtZ3JvdXAtaXRlbSAubGlzdC1pdGVtIHtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y2ZjZmNjtcbiAgcGFkZGluZzogMTJweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBtaW4td2lkdGg6IDEwMHB4O1xufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZT5cbiAgPENvbnRlbnREaWFsb2dcbiAgICB0aXRsZT1cIkRlbGV0ZWQgSm9ic1wiXG4gICAgOm1vZGVsVmFsdWU9XCJtb2RlbFZhbHVlXCJcbiAgICBAdXBkYXRlOm1vZGVsVmFsdWU9XCIkZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnKVwiXG4gICAgaGVpZ2h0PVwiYXV0b1wiXG4gICAgd2lkdGg9XCIxMDAwcHhcIlxuICAgIGNsb3NlTW9kZVxuICAgIDppbml0aW5nPVwiaW5pdGluZ1wiXG4gICAgOmluaXRpbmdTdWNjZXNzPVwiaW5pdGluZ1N1Y2Nlc3NcIlxuICAgIDpwcm9jZXNzaW5nPVwicHJvY2Vzc2luZ1wiXG4gICAgOm1lc3NhZ2U9XCJtZXNzYWdlXCJcbiAgICA6bWVz
1017c2FnZVR5cGU9XCJtZXNzYWdlVHlwZVwiXG4gID5cbiAgICA8VGFibGVcbiAgICAgIHJlZj1cImdyaWRcIlxuICAgICAgYXVkaXRDcmVhdGVkXG4gICAgICA6dXBkYXRhYmxlPVwiZmFsc2VcIlxuICAgICAgOmNyZWF0YWJsZT1cImZhbHNlXCJcbiAgICAgIDpkZWxldGFibGU9XCJmYWxzZVwiXG4gICAgICA6aGlkZVNlbGVjdGlvbj1cInRydWVcIlxuICAgICAgdmlld2FibGVcbiAgICAgIDpjb2x1bW5zPVwiY29sdW1uc1wiXG4gICAgICA6cmVjb3Jkcz1cInJlY29yZHNcIlxuICAgICAgQHZpZXc9XCJoYW5kbGVWaWV3XCJcbiAgICAgIHJlY29yZFR5cGU9XCJCYWNrdXBcIlxuICAgICAgcmVjb3JkVHlwZVBsdXJhbD1cIkJhY2t1cHNcIlxuICAgICAgOnJlZnJlc2hhYmxlPVwidHJ1ZVwiXG4gICAgPlxuICAgIDwvVGFibGU+XG5cbiAgICA8VGV4dFZpZXdlckRpYWxvZyB2LW1vZGVsPVwidGV4dFZpZXdlck9wZW5cIiA6Y29udGVudD1cInRleHRWaWV3ZXJDb250ZW50XCIgOnRpdGxlPVwidGV4dFZpZXdlclRpdGxlXCIgY29kZSAvPlxuICA8L0NvbnRlbnREaWFsb2c+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0ICogYXMgYXBpIGZyb20gJy4uLy4uL3NlcnZpY2VzL2FwaSc7XG5pbXBvcnQgbWl4aW5zIGZyb20gJ3NyYy9taXhpbnMvbWl4aW5zJztcbmltcG9ydCBUZXh0Vmlld2VyRGlhbG9nIGZyb20gJ3NyYy9jb21wb25lbnRzL1RleHRWaWV3ZXJEaWFsb2cudnVlJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFttaXhpbnNdLFxuICBjb21wb25lbnRzOiB7VGV4dFZpZXdlckRpYWxvZ30sXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogQm9vbGVhbixcbiAgfSxcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnXSxcbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sdW1uczogW3t2YWx1ZTogJ25hbWUnfV0sXG4gICAgICByZWNvcmRzOiB0aGlzLmdldEJhY2t1cHMsXG4gICAgICBwcm9ncmVzc09wZW46IGZhbHNlLFxuICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICBpbml0OiBmYWxzZSxcbiAgICAgIGluaXRpbmdTdWNjZXNzOiB0cnVlLFxuICAgICAgYmFja3VwczogW10sXG4gICAgICB0ZXh0Vmlld2VyT3BlbjogZmFsc2UsXG4gICAgICB0ZXh0Vmlld2VyQ29udGVudDogJycsXG4gICAgICB0ZXh0Vmlld2VyVGl0bGU6ICdKb2IgQmFja3VwJyxcbiAgICB9O1xuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBhc3luYyBnZXRCYWNrdXBzKCkge1xuICAgICAgdGhpcy5iYWNrdXBzID0gKGF3YWl0IGFwaS5nZXREZWxldGVkSm9ic0JhY2t1cHMoKSkgfHwgW107XG4gICAgICByZXR1cm4gdGhpcy5iYWNrdXBzO1xuICAgIH0sXG5cbiAgICByZWZyZXNoKCkge1xuICAgICAgdGhpcy5yZWZyZXNoR3JpZCgpO1xuICAgIH0sXG5cbiAgICByZWZyZXNoR3JpZCgpIHtcbiAgICAgIGlmICh0aGlzLiRyZWZzLmdyaWQpIHtcbiAgICAgICAgdGhpcy4kcmVmcy5ncmlkLnJlZnJlc2goKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0U2VsZWN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHJlZnMuZ3JpZC5nZXRDb25maXJtZWRTZWxlY3Rpb24oKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgaGFuZGxlVmlldyhyZWMpIHtcbiAgICAgIGlmICghcmVjKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wcm9jZXNzRm9ybShhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBhcGkuZ2V0RGVsZXRlZEpvYkJhY2t1cChyZWMuaWQpO1xuICAgICAgICB0aGlzLnRleHRWaWV3ZXJDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkocmVzcC5jb250ZW50LCB1bmRlZmluZWQsICcgICcpO1xuICAgICAgICB0aGlzLnRleHRWaWV3ZXJPcGVuID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0sXG59O1xuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGU+XG4gIDxQYWdlIHRpdGxlPVwiSm9ic1wiIDppbml0aW5nPVwiaW5pdGluZ1wiIDppbml0aW5nU3VjY2Vzcz1cImluaXRpbmdTdWNjZXNzXCIgOnByb2Nlc3Npbmc9XCJwcm9jZXNzaW5nXCIgOm1lc3NhZ2U9XCJtZXNzYWdlXCIgOm1lc3NhZ2VUeXBlPVwibWVzc2FnZVR5cGVcIj5cbiAgICA8dGVtcGxhdGUgdi1zbG90OmJyZWFkY3J1bWJzPlxuICAgICAgPHEtYnJlYWRjcnVtYnMtZWwgbGFiZWw9XCJIb21lXCIgdG89XCIvcmVhbHRhc2svaG9tZVwiIC8+XG4gICAgPC90ZW1wbGF0ZT5cblxuICAgIDxUYWJsZVxuICAgICAgcmVmPVwiZ3JpZFwiXG4gICAgICByZWNvcmRUeXBlPVwiSm9iXCJcbiAgICAgIHJlY29yZFR5cGVQbHVyYWw9XCJKb2JzXCJcbiAgICAgIG5hbWVMaW5rUHJlZml4PVwiL3JlYWx0YXNrL2pvYnNcIlxuICAgICAgQGFkZD1cImhhbmRsZUFkZFwiXG4gICAgICBAZWRpdD1cImhhbmRsZUVkaXRcIlxuICAgICAgQGRlbGV0ZT1cImhhbmRsZURlbGV0ZVwiXG4gICAgICBjbG9uZVxuICAgICAgQGNsb25lQ2xpY2s9XCJoYW5kbGVDbG9uZVwiXG4gICAgICBhdWRpdFxuICAgICAgb3duZXJcbiAgICAgIHNoYXJpbmdcbiAgICAgIDpzdGF0dXM9XCJzdGF0dXNcIlxuICAgICAgOnJlZnJlc2hhYmxlPVwiZmFsc2VcIlxuICAgICAgOmNvbHVtbnM9XCJjb2x1bW5zXCJcbiAgICAgIDpyZWNvcmRzPVwicmVjb3Jkc1wiXG4gICAgICBjdXN0b21SZWZyZXNoXG4gICAgICBAY3VzdG9tUmVmcmVzaD1cImdldEpvYnModHJ1ZSlcIlxuICAgICAgOmN1c3RvbUxvYWRpbmc9XCJsb2FkaW5nXCJcbiAgICA+XG4gICAgICA8dGVtcGxhdGUgdi1zbG90OnRvb2xiYXItYWN0aW9ucz5cbiAgICAgICAgPEdyaWRTZWxlY3Qgdi1tb2RlbD1cImZpbHRlclJlcS5lbnZJZFwiIDpvcHRpb25zPVwiZW52c1wiIHNob3dEZWZhdWx0IGRlZmF1bHRMYWJlbD1cIi1FbnYtXCIgZGVmYXVsdFZhbHVlPVwiXCIgLz5cbiAgICAgICAgPEdyaWRTZWxlY3Qgdi1tb2RlbD1cImZpbHRlclJlcS5mb2xkZXJcIiA6b3B0aW9ucz1cImZvbGRlcnNcIiBzaG93RGVmYXVsdCBkZWZhdWx0TGFiZWw9XCItRm9sZGVyLVwiIGRlZmF1bHRWYWx1ZT1cIlwiIC8+XG4gICAgICAgIDxHcmlkU2VsZWN0IHYtbW9kZWw9XCJmaWx0ZXJSZXEuc3RhdHVzXCIgOm9wdGlvbnM9XCJmaWx0ZXJTdGF0dXNlc1wiIHNob3dEZWZhdWx0IGRlZmF1bHRMYWJlbD1cIi1TdGF0dXMtXCIgZGVmYXVsdFZhbHVlPVwiXCIgLz5cbiAgICAgICAgPEdyaWRTZWxlY3Qgdi1tb2RlbD1cImZpbHRlclJlcS5mcmVxdWVuY3lcIiA6b3B0aW9ucz1cImZpbHRlckZyZXF1
1017ZW5jeU9wdGlvbnNcIiBzaG93RGVmYXVsdCBkZWZhdWx0TGFiZWw9XCItRnJlcXVlbmN5LVwiIGRlZmF1bHRWYWx1ZT1cIlwiIC8+XG4gICAgICAgIDxHcmlkU2VsZWN0IHYtbW9kZWw9XCJmaWx0ZXJSZXEub3duZXJcIiA6b3B0aW9ucz1cImZpbHRlck93bmVyT3B0aW9uc1wiIHNob3dEZWZhdWx0IGRlZmF1bHRMYWJlbD1cIi1Pd25lci1cIiBkZWZhdWx0VmFsdWU9XCJcIiAvPlxuICAgICAgICA8SWNvbk1lbnU+XG4gICAgICAgICAgPE1lbnVJdGVtIEBjbGljaz1cImhhbmRsZUFjdGl2YXRlXCI+QWN0aXZhdGU8L01lbnVJdGVtPlxuICAgICAgICAgIDxNZW51SXRlbSBAY2xpY2s9XCJoYW5kbGVJbmFjdGl2YXRlXCI+SW5hY3RpdmF0ZTwvTWVudUl0ZW0+XG4gICAgICAgICAgPE1lbnVJdGVtIEBjbGljaz1cImhhbmRsZUNoYW5nZUZvbGRlclwiPkNoYW5nZSBGb2xkZXI8L01lbnVJdGVtPlxuICAgICAgICAgIDxNZW51SXRlbSBAY2xpY2s9XCJoYW5kbGVDaGFuZ2VPd25lclwiPkNoYW5nZSBPd25lcjwvTWVudUl0ZW0+XG4gICAgICAgICAgPFNlcGFyYXRvciAvPlxuICAgICAgICAgIDxNZW51SXRlbSBAY2xpY2s9XCJoYW5kbGVMb2NrSm9ic1wiPkxvY2s8L01lbnVJdGVtPlxuICAgICAgICAgIDxNZW51SXRlbSBAY2xpY2s9XCJoYW5kbGVVbmxvY2tKb2JzXCI+VW5sb2NrPC9NZW51SXRlbT5cbiAgICAgICAgICA8U2VwYXJhdG9yIC8+XG4gICAgICAgICAgPE1lbnVJdGVtIEBjbGljaz1cImhhbmRsZVB1cmdlSm9ic1wiPlB1cmdlPC9NZW51SXRlbT5cbiAgICAgICAgICA8TWVudUl0ZW0gQGNsaWNrPVwiaGFuZGxlRGVsZXRlUHVyZ2VKb2JzXCI+RGVsZXRlIGFuZCBQdXJnZTwvTWVudUl0ZW0+XG4gICAgICAgICAgPFNlcGFyYXRvciAvPlxuICAgICAgICAgIDxNZW51SXRlbSBAY2xpY2s9XCJjcmVhdGVCYWNrdXBcIj5DcmVhdGUgQmFja3VwPC9NZW51SXRlbT5cbiAgICAgICAgICA8TWVudUl0ZW0gQGNsaWNrPVwidmlld0JhY2t1cHNcIj5WaWV3IEJhY2t1cHM8L01lbnVJdGVtPlxuICAgICAgICAgIDxTZXBhcmF0b3IgLz5cbiAgICAgICAgICA8TWVudUl0ZW0gQGNsaWNrPVwiZXhwb3J0QWxsSm9ic1wiPkV4cG9ydCBKb2JzIChaaXAgZmlsZSk8L01lbnVJdGVtPlxuICAgICAgICAgIDxNZW51SXRlbSBAY2xpY2s9XCJ2aWV3U3VtbWFyeUpzb25cIj5FeHBvcnQgSm9iIChKc29uKTwvTWVudUl0ZW0+XG4gICAgICAgICAgPE1lbnVJdGVtIEBjbGljaz1cImhhbmRsZUltcG9ydEpvYlwiPkltcG9ydCBKb2IgKEpzb24pPC9NZW51SXRlbT5cbiAgICAgICAgICA8U2VwYXJhdG9yIC8+XG4gICAgICAgICAgPE1lbnVJdGVtIEBjbGljaz1cImhhbmRsZVJ1bkpvYnNcIj5SdW4gSm9iczwvTWVudUl0ZW0+XG4gICAgICAgIDwvSWNvbk1lbnU+XG4gICAgICA8L3RlbXBsYXRlPlxuXG4gICAgICA8dGVtcGxhdGUgdi1zbG90OmFkZGl0aW9uYWwtYWN0aW9ucz1cInJvd1wiPlxuICAgICAgICA8SWNvblxuICAgICAgICAgIHYtaWY9XCJyb3cub3B0aW9ucy5tdWx0aVJ1bnMgJiYgcm93Lm9wdGlvbnMubXVsdGlSdW5zLmxvY2F0aW9uXCJcbiAgICAgICAgICBuYW1lPVwibWVkaWF0aW9uXCJcbiAgICAgICAgICBzaXplPVwieHNcIlxuICAgICAgICAgIDp0b29sdGlwPVwiJ011bHRpIFJ1bnMgZW5hYmxlZCB3aXRoICcgKyAocm93Lm9wdGlvbnMubXVsdGlSdW5zLmluc3RhbmNlcyB8fCAndW5rbm93bicpICsgJyBpbnN0YW5jZXMnXCJcbiAgICAgICAgLz5cbiAgICAgICAgPEljb24gdi1pZj1cInJvdy5vcHRpb25zLnJ1bkxvb3BpbmcgJiYgcm93Lm9wdGlvbnMucnVuTG9vcGluZy5sb2NhdGlvblwiIG5hbWU9XCJyZXBlYXRfb25lXCIgc2l6ZT1cInhzXCIgOnRvb2x0aXA9XCInUnVuIExvb3BpbmcgZW5hYmxlZCdcIiAvPlxuICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgIDx0ZW1wbGF0ZSB2LXNsb3Q6ZW52RmllbGQ9XCJyb3dcIj5cbiAgICAgICAgPEVudlJlZiA6bW9kZWw9XCJyb3dcIiBmaWVsZD1cImVudklkXCIgLz5cbiAgICAgIDwvdGVtcGxhdGU+XG4gICAgPC9UYWJsZT5cbiAgICA8Sm9iRGlhbG9nXG4gICAgICB2LW1vZGVsPVwiZGlhbG9nT3BlblwiXG4gICAgICA6am9iSWQ9XCJkaWFsb2dKb2JJZFwiXG4gICAgICA6bW9kZT1cImRpYWxvZ01vZGVcIlxuICAgICAgOmZvbGRlcj1cInRoaXMuZGlhbG9nRm9sZGVyXCJcbiAgICAgIDpkYXRhPVwiZGlhbG9nRGF0YVwiXG4gICAgICBAY2FuY2VsPVwiZGlhbG9nT3BlbiA9IGZhbHNlXCJcbiAgICAgIEBvaz1cImhhbmRsZVNhdmVcIlxuICAgIC8+XG4gICAgPENoYW5nZU93bmVyRGlhbG9nXG4gICAgICB2LW1vZGVsPVwiY2hhbmdlT3duZXJEaWFsb2dPcGVuXCJcbiAgICAgIDpyZXNvdXJjZXM9XCJjaGFuZ2VPd25lckRpYWxvZ0RhdGFcIlxuICAgICAgQGNhbmNlbD1cImNoYW5nZU93bmVyRGlhbG9nT3BlbiA9IGZhbHNlXCJcbiAgICAgIEBvaz1cImhhbmRsZVNhdmVcIlxuICAgICAgdHlwZT1cInJ0am9iXCJcbiAgICAvPlxuICAgIDxKb2JzRmlsdGVyRGlhbG9nIHYtbW9kZWw9XCJqb2JzRmlsdGVyRGlhbG9nT3BlblwiIDptb2RlbD1cImZpbHRlclJlcVwiIEBjYW5jZWw9XCJqb2JzRmlsdGVyRGlhbG9nT3BlbiA9IGZhbHNlXCIgQG9rPVwiaGFuZGxlSm9iRmlsdGVyXCIgOmVudnM9XCJlbnZzXCIgLz5cbiAgICA8VGV4dFZpZXdlckRpYWxvZyB2LW1vZGVsPVwidGV4dFZpZXdlck9wZW5cIiA6Y29udGVudD1cInRleHRWaWV3ZXJDb250ZW50XCIgOnRpdGxlPVwidGV4dFZpZXdlclRpdGxlXCIgY29kZSAvPlxuICAgIDxCYWNrdXBzRGlhbG9nIHYtbW9kZWw9XCJiYWNrdXBzRGlhbG9nT3BlblwiIDp0aXRsZT1cImJhY2t1cHNEaWFsb2dUaXRsZVwiIDplbnRpdHlJZD1cImJhY2t1cHNEaWFsb2dFbnRpdHlJZFwiIC8+XG4gICAgPERlbGV0ZWRKb2JzQmFja3Vwc0RpYWxvZyB2LW1vZGVsPVwiZGVsZXRlZEpvYnNCYWNrdXBzRGlhbG9nT3BlblwiIC8+XG4gICAgPElucHV0SnNvbkRpYWxvZ1xuICAgICAgdGl0bGU9XCJFbnRlciBKb2IgSnNvbiB0byBpbXBvcnRcIlxuICAgICAgdi1tb2RlbD1cImltcG9ydEpvYnNEaWFsb2dPcGVuXCJcbiAgICAgIDpqc29uPVwiaW1wb3J0Sm9ic0RpYWxvZ0NvbnRlbnRcIlxuICAgICAgOm
1017Vycm9yPVwiaW1wb3J0Sm9ic0RpYWxvZ0Vycm9yXCJcbiAgICAgIEBvaz1cImhhbmRsZUltcG9ydEpvYk9rXCJcbiAgICAvPlxuICA8L1BhZ2U+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0ICogYXMgYXBpIGZyb20gJy4uLy4uL3NlcnZpY2VzL2FwaSc7XG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICdzcmMvc2VydmljZXMvdXRpbHMnO1xuaW1wb3J0IEpvYkRpYWxvZyBmcm9tICcuL0pvYkRpYWxvZy52dWUnO1xuaW1wb3J0IG1peGlucyBmcm9tICdzcmMvbWl4aW5zL21peGlucyc7XG5pbXBvcnQgQ2hhbmdlT3duZXJEaWFsb2cgZnJvbSAnc3JjL3BhZ2VzL2NvbW1vbi9DaGFuZ2VPd25lckRpYWxvZy52dWUnO1xuaW1wb3J0IEpvYnNGaWx0ZXJEaWFsb2cgZnJvbSAnLi9Kb2JzRmlsdGVyRGlhbG9nLnZ1ZSc7XG5pbXBvcnQgQmFja3Vwc0RpYWxvZyBmcm9tICcuL0JhY2t1cHNEaWFsb2cudnVlJztcbmltcG9ydCBEZWxldGVkSm9ic0JhY2t1cHNEaWFsb2cgZnJvbSAnLi9EZWxldGVkSm9ic0JhY2t1cHNEaWFsb2cudnVlJztcbmltcG9ydCBJbnB1dEpzb25EaWFsb2cgZnJvbSAnc3JjL2NvbXBvbmVudHMvSW5wdXRKc29uRGlhbG9nLnZ1ZSc7XG5pbXBvcnQgRW52UmVmIGZyb20gJ3NyYy9jb21wb25lbnRzL0VudlJlZi52dWUnO1xuaW1wb3J0IFRleHRWaWV3ZXJEaWFsb2cgZnJvbSAnc3JjL2NvbXBvbmVudHMvVGV4dFZpZXdlckRpYWxvZy52dWUnO1xuaW1wb3J0IEdyaWRTZWxlY3QgZnJvbSAnc3JjL2NvbXBvbmVudHMvR3JpZFNlbGVjdC52dWUnO1xuaW1wb3J0IHtcbiAgRm9sZGVyX1JlY2VudCxcbiAgRm9sZGVyX0JsYW5rLFxuICBkZWVwQ2xvbmUsXG4gIGZpbHRlckZyZXF1ZW5jeU9wdGlvbnMsXG4gIGZpbHRlck93bmVyT3B0aW9ucyxcbiAgZmlsdGVyU3RhdHVzZXNPcHRpb25zLFxuICBnZXRDYWNoZWRQcm9maWxlT3JOaWwsXG4gIGdldENhY2hlT3JDb21wdXRlLFxuICBnZXRFbnRpdHlOYW1lc0xpc3RGb3JEaWFsb2csXG4gIGdldExvY2FsU3RvcmUsXG4gIGlzRmlsdGVyU3RhdHVzTWF0Y2gsXG4gIG5vdGlmeVN1Y2Nlc3MsXG4gIHNldExvY2FsU3RvcmUsXG4gIHNob3dJbnB1dCxcbiAgc29ydEljLFxufSBmcm9tICdzcmMvc2VydmljZXMvdXRpbHMnO1xuaW1wb3J0IHttYXBUb0lkcywgaXNEZWxldGVkLCBlcXVhbHNJY30gZnJvbSAnQGRhdGFzZXJ0L2pzLXV0aWxzL2Rpc3QvanNVdGlscyc7XG5cbmNvbnN0IGNhY2hlS2V5RmlsdGVyRm9sZGVyID0gJ3J0LmpvYnMuZmlsdGVyLmZvbGRlcic7XG5jb25zdCBjYWNoZUtleUZpbHRlckVudklkID0gJ3J0LmpvYnMuZmlsdGVyLmVudic7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbbWl4aW5zXSxcblxuICBjb21wb25lbnRzOiB7XG4gICAgSm9iRGlhbG9nLFxuICAgIENoYW5nZU93bmVyRGlhbG9nLFxuICAgIEpvYnNGaWx0ZXJEaWFsb2csXG4gICAgQmFja3Vwc0RpYWxvZyxcbiAgICBEZWxldGVkSm9ic0JhY2t1cHNEaWFsb2csXG4gICAgSW5wdXRKc29uRGlhbG9nLFxuICAgIEVudlJlZixcbiAgICBUZXh0Vmlld2VyRGlhbG9nLFxuICAgIEdyaWRTZWxlY3QsXG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sdW1uczogW1xuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6ICduYW1lJyxcbiAgICAgICAgfSxcbiAgICAgICAge3ZhbHVlOiAnc3RhdHVzJ30sXG4gICAgICAgIHt2YWx1ZTogKHJvdykgPT4gdXRpbHMuZ2V0RnJlcXVlbmN5Rm9yTGlzdChyb3cub3B0aW9ucy5zY2hlZHVsaW5nKSwgbGFiZWw6ICdGcmVxdWVuY3knfSxcbiAgICAgICAge1xuICAgICAgICAgIHZhbHVlOiAnZW52RmllbGQnLFxuICAgICAgICAgIGxhYmVsOiAnRW52JyxcbiAgICAgICAgfSxcbiAgICAgICAge3ZhbHVlOiAnZm9sZGVyJ30sXG4gICAgICAgIHtcbiAgICAgICAgICB2YWx1ZTogKHJvdykgPT4gcm93LnNldHRpbmdzPy5zY2hlZHVsaW5nPy5sYXN0UnVuQXQgfHwgJycsXG4gICAgICAgICAgdHlwZTogJ2RhdGV0aW1lJyxcbiAgICAgICAgICBsYWJlbDogJ0xhc3QgUnVuIEF0JyxcbiAgICAgICAgfSxcbiAgICAgICAge3ZhbHVlOiAnbmV4dFJ1bkF0JywgdHlwZTogJ2RhdGV0aW1lJ30sXG4gICAgICAgIHtcbiAgICAgICAgICB2YWx1ZTogKHJvdykgPT4gcm93LnJ1bl91cGRhdGVkX2F0IHx8ICcnLFxuICAgICAgICAgIHR5cGU6ICdkYXRldGltZScsXG4gICAgICAgICAgbGFiZWw6ICdSdW4gVXBkYXRlZCBBdCcsXG4gICAgICAgIH0sXG4gICAgICAgIHt2YWx1ZTogKHJvdykgPT4gcm93Lm9wdGlvbnMucmVzb3VyY2VMZXZlbCwgbGFiZWw6ICdSZXNvdXJjZSBMZXZlbCd9LFxuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IChyb3cpID0+IHJvdy5vcHRpb25zLmV4ZWN1dGlvbk1ldGhvZCxcbiAgICAgICAgICBsYWJlbDogJ0pvYiBEdXJhdGlvbicsXG4gICAgICAgICAgdmFsdWVMYWJlbHM6IHV0aWxzLnZhbHVlTGFiZWxzLmV4ZWN1dGlvbk1ldGhvZCxcbiAgICAgICAgfSxcbiAgICAgICAge3ZhbHVlOiAocm93KSA9PiByb3cub3B0aW9ucy5sb2dMZXZlbCwgbGFiZWw6ICdMb2cgTGV2ZWwnfSxcbiAgICAgIF0sXG4gICAgICByZWNvcmRzOiB0aGlzLmdldFJlY29yZHMsXG4gICAgICBwcm9ncmVzc09wZW46IGZhbHNlLFxuICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICBpbml0OiBmYWxzZSxcbiAgICAgIGluaXRpbmdTdWNjZXNzOiB0cnVlLFxuICAgICAgZGlhbG9nT3BlbjogZmFsc2UsXG4gICAgICBkaWFsb2dGb2xkZXI6ICcnLFxuICAgICAgZGlhbG9nTW9kZTogJ2FkZCcsXG4gICAgICBkaWFsb2dKb2JJZDogbnVsbCxcbiAgICAgIGRpYWxvZ0RhdGE6IFtdLFxuICAgICAgbW9kZWw6IHt9LFxuICAgICAgY2hhbmdlT3duZXJEaWFsb2dPcGVuOiBmYWxzZSxcbiAgICAgIGNoYW5nZU93bmVyRGlhbG9nRGF0YTogW10sXG4gICAgICBmaWx0ZXJSZXE6IHtcbiAgICAgICAgZW52SWQ6IGdldExvY2FsU3RvcmUoY2FjaGVLZXlGaWx0ZXJFbnZJZCkgfHwgJycsXG4gICAgICAgIGZvbGRlcjogZ2V0TG9jYWxTdG9yZShjYWNoZUtleUZpbHRlckZvbGRlcikgfHwgJycsXG4gICAgICAgIHN0YXR1czogJycsXG4gICAgICAgIGZyZXF1ZW5jeTogJycsXG4gICAgICB9LFxuICAgICAgam9ic0ZpbHRlckRpYWxvZ09wZW46IGZhbHNlLFxuICAgICAgZW52czogW10sXG4gICAgICBmb2xkZXJzOiBbXSxcbiAgICAgIHN0YXR1czogJycsXG4gICAgICBqb2JzOiBbXSxcbiAgICAgIGZpbHRlcmVkSm9iczogW10sXG4gICAgICByZWNlbnRKb2JJZHM6IFtdLFxuICAgICAgZmlsdGVyU3RhdHVzZXM6IGZpbHRlclN0YXR1c2VzT3B0aW9ucyxcbiAgICAgIGZpbHRlckZyZXF1
1017ZW5jeU9wdGlvbnM6IGZpbHRlckZyZXF1ZW5jeU9wdGlvbnMsXG4gICAgICBmaWx0ZXJPd25lck9wdGlvbnM6IGZpbHRlck93bmVyT3B0aW9ucyxcbiAgICAgIHRleHRWaWV3ZXJPcGVuOiBmYWxzZSxcbiAgICAgIHRleHRWaWV3ZXJDb250ZW50OiAnJyxcbiAgICAgIHRleHRWaWV3ZXJUaXRsZTogJ0pvYiBFeHBvcnQgKEpzb24pJyxcbiAgICAgIGJhY2t1cHNEaWFsb2dPcGVuOiBmYWxzZSxcbiAgICAgIGJhY2t1cHNEaWFsb2dFbnRpdHlJZDogJycsXG4gICAgICBiYWNrdXBzRGlhbG9nVGl0bGU6ICdKb2IgQmFja3VwcycsXG4gICAgICBkZWxldGVkSm9ic0JhY2t1cHNEaWFsb2dPcGVuOiBmYWxzZSxcbiAgICAgIGltcG9ydEpvYnNEaWFsb2dPcGVuOiBmYWxzZSxcbiAgICAgIGltcG9ydEpvYnNEaWFsb2dFcnJvcjogJycsXG4gICAgICBpbXBvcnRKb2JzRGlhbG9nQ29udGVudDogJycsXG4gICAgfTtcbiAgfSxcbiAgYXN5bmMgY3JlYXRlZCgpIHtcbiAgICB0aGlzLmVudnMgPSBhd2FpdCB0aGlzLmdldEVudlJlZnMoKTtcbiAgfSxcbiAgd2F0Y2g6IHtcbiAgICAnZmlsdGVyUmVxLmVudklkJygpIHtcbiAgICAgIHNldExvY2FsU3RvcmUoY2FjaGVLZXlGaWx0ZXJFbnZJZCwgdGhpcy5maWx0ZXJSZXEuZW52SWQpO1xuICAgICAgdGhpcy5maWx0ZXIoKTtcbiAgICB9LFxuICAgICdmaWx0ZXJSZXEuZm9sZGVyJygpIHtcbiAgICAgIHNldExvY2FsU3RvcmUoY2FjaGVLZXlGaWx0ZXJGb2xkZXIsIHRoaXMuZmlsdGVyUmVxLmZvbGRlcik7XG4gICAgICB0aGlzLmZpbHRlcigpO1xuICAgICAgdGhpcy5zb3J0Sm9icygpO1xuICAgIH0sXG4gICAgJ2ZpbHRlclJlcS5zdGF0dXMnKCkge1xuICAgICAgdGhpcy5maWx0ZXIoKTtcbiAgICB9LFxuICAgICdmaWx0ZXJSZXEuZnJlcXVlbmN5JygpIHtcbiAgICAgIHRoaXMuZmlsdGVyKCk7XG4gICAgfSxcbiAgICAnZmlsdGVyUmVxLm93bmVyJygpIHtcbiAgICAgIHRoaXMuZmlsdGVyKCk7XG4gICAgfSxcbiAgfSxcbiAgbWV0aG9kczoge1xuICAgIGFzeW5jIGdldFJlY29yZHMoKSB7XG4gICAgICBpZiAoIXRoaXMuaW5pdCkge1xuICAgICAgICB0aGlzLmluaXQgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLmdldEpvYnMoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlU3RhdHVzKCk7XG4gICAgICByZXR1cm4gZGVlcENsb25lKHRoaXMuZmlsdGVyZWRKb2JzKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0Sm9icyhmb3JjZSA9IGZhbHNlKSB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuXG4gICAgICBjb25zdCBmaWx0ZXJQYXJhbXMgPSB7XG4gICAgICAgIGVudklkOiB0aGlzLmZpbHRlclJlcS5lbnZJZCB8fCB1bmRlZmluZWQsXG4gICAgICAgIGZvbGRlcjogdGhpcy5maWx0ZXJSZXEuZm9sZGVyIHx8IHVuZGVmaW5lZCxcbiAgICAgIH07XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgY2FjaGUga2V5IGJhc2VkIG9uIGZpbHRlciBwYXJhbWV0ZXJzIHRvIGVuc3VyZSBwcm9wZXIgY2FjaGluZyBwZXIgZmlsdGVyIGNvbWJpbmF0aW9uXG4gICAgICBjb25zdCBjYWNoZUtleSA9IGBydEpvYnNfJHtKU09OLnN0cmluZ2lmeShmaWx0ZXJQYXJhbXMpfWA7XG5cbiAgICAgIGNvbnN0IFtqb2JzLCBmb2xkZXJzUmVzcCwgcmVjZW50Sm9ic1Jlc3BdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBnZXRDYWNoZU9yQ29tcHV0ZSgnam9icycsIGNhY2hlS2V5LCAzMCwgZm9yY2UsICgpID0+IGFwaS5nZXRKb2JzKGZpbHRlclBhcmFtcykpLFxuICAgICAgICBhcGkuZ2V0Sm9iRm9sZGVycygpLFxuICAgICAgICBhcGkuZ2V0UmVjZW50Sm9iSWRzKCksXG4gICAgICBdKTtcblxuICAgICAgLy8gS2VlcCByZWNlbnQgMTAgam9ic1xuICAgICAgdGhpcy5yZWNlbnRKb2JJZHMgPSAocmVjZW50Sm9ic1Jlc3AuaWRzIHx8IFtdKS5zbGljZSgwLCAxMCk7XG4gICAgICB0aGlzLmZpbHRlcmVkSm9icyA9IHRoaXMuam9icyA9IGpvYnMgfHwgW107XG4gICAgICB0aGlzLnVwZGF0ZUZvbGRlcnMoZm9sZGVyc1Jlc3ApO1xuXG4gICAgICB0aGlzLmZpbHRlcigpO1xuICAgICAgdGhpcy5zb3J0Sm9icygpO1xuXG4gICAgICB0aGlzLnVwZGF0ZVN0YXR1cygpO1xuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICBmb3JjZSA/IHRoaXMucmVmcmVzaCgpIDogdW5kZWZpbmVkO1xuICAgIH0sXG5cbiAgICBzZXRGaWx0ZXJlZEpvYnMoam9icyA9IFtdKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkSm9icyA9IGpvYnM7XG4gICAgfSxcblxuICAgIHJlZnJlc2goKSB7XG4gICAgICB0aGlzLnJlZnJlc2hHcmlkKCk7XG4gICAgfSxcblxuICAgIHJlZnJlc2hHcmlkKCkge1xuICAgICAgaWYgKHRoaXMuJHJlZnMuZ3JpZCkge1xuICAgICAgICB0aGlzLiRyZWZzLmdyaWQucmVmcmVzaCgpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyByZWZyZXNoSm9icygpIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0Sm9icyh0cnVlKTtcbiAgICB9LFxuXG4gICAgaGFuZGxlQWRkKCkge1xuICAgICAgdGhpcy5tZXNzYWdlID0gbnVsbDtcbiAgICAgIHRoaXMuZGlhbG9nSm9iSWQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRpYWxvZ01vZGUgPSAnYWRkJztcbiAgICAgIHRoaXMuZGlhbG9nT3BlbiA9IHRydWU7XG4gICAgICB0aGlzLmRpYWxvZ0ZvbGRlciA9IHRoaXMuZmlsdGVyUmVxLmZvbGRlcjtcbiAgICB9LFxuXG4gICAgZmlsdGVyKCkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmZpbHRlclJlcS5mb2xkZXIgIT09IEZvbGRlcl9SZWNlbnQgJiZcbiAgICAgICAgdGhpcy5maWx0ZXJSZXEuZm9sZGVyICE9PSBGb2xkZXJfQmxhbmsgJiZcbiAgICAgICAgIXRoaXMuZm9sZGVycy5tYXAoKGZvbGRlcikgPT4gZm9sZGVyLmlkKS5pbmNsdWRlcyh0aGlzLmZpbHRlclJlcS5mb2xkZXIpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5maWx0ZXJSZXEuZm9sZGVyID0gJyc7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5maWx0ZXJSZXEuZm9sZGVyICYmICF0aGlzLmZpbHRlclJlcS5lbnZJZCAmJiAhdGhpcy5maWx0ZXJSZXEuc3RhdHVzICYmICF0aGlzLmZpbHRlclJlcS5mcmVxdWVuY3kgJiYgIXRoaXMuZmlsdGVyUmVxLm93bmVyKSB7XG4gICAgICAgIGNvbnN0IGpvYnMgPSBbLi4udGhpcy5qb2JzXS5maWx0ZXIoKGl0KSA9PiBpdC5zdGF0dXMgIT09ICdkZWxldGVkJyk7XG4gICAgICAgI
1017HRoaXMuc2V0RmlsdGVyZWRKb2JzKGpvYnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGpvYnMgPSBbLi4udGhpcy5qb2JzXTtcblxuICAgICAgICBpZiAodGhpcy5maWx0ZXJSZXEuZm9sZGVyKSB7XG4gICAgICAgICAgaWYgKHRoaXMuZmlsdGVyUmVxLmZvbGRlciA9PT0gRm9sZGVyX1JlY2VudCkge1xuICAgICAgICAgICAgam9icyA9IGpvYnMuZmlsdGVyKChqb2IpID0+IHRoaXMucmVjZW50Sm9iSWRzLmluY2x1ZGVzKGpvYi5pZCkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5maWx0ZXJSZXEuZm9sZGVyID09PSBGb2xkZXJfQmxhbmspIHtcbiAgICAgICAgICAgIGpvYnMgPSBqb2JzLmZpbHRlcigoam9iKSA9PiAham9iLmZvbGRlciB8fCBlcXVhbHNJYyhqb2IuZm9sZGVyLCBGb2xkZXJfQmxhbmspKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgam9icyA9IGpvYnMuZmlsdGVyKChqb2IpID0+IGVxdWFsc0ljKGpvYi5mb2xkZXIsIHRoaXMuZmlsdGVyUmVxLmZvbGRlcikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZpbHRlclJlcS5lbnZJZCkge1xuICAgICAgICAgIGpvYnMgPSBqb2JzLmZpbHRlcigoam9iKSA9PiBqb2IuZW52SWQgPT09IHRoaXMuZmlsdGVyUmVxLmVudklkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZpbHRlclJlcS5zdGF0dXMpIHtcbiAgICAgICAgICBqb2JzID0gam9icy5maWx0ZXIoKGpvYikgPT4gaXNGaWx0ZXJTdGF0dXNNYXRjaChqb2Iuc3RhdHVzLCBqb2IucnVuU3Rh
1017dHVzLCB0aGlzLmZpbHRlclJlcS5zdGF0dXMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqb2JzID0gam9icy5maWx0ZXIoKGpvYikgPT4gam9iLnN0YXR1cyAhPT0gJ2RlbGV0ZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZpbHRlclJlcS5mcmVxdWVuY3kpIHtcbiAgICAgICAgICBqb2JzID0gam9icy5maWx0ZXIoKGpvYikgPT5cbiAgICAgICAgICAgIHRoaXMuZmlsdGVyUmVxLmZyZXF1ZW5jeSA9PT0gJ21hbnVhbCcgPyBqb2Iub3B0aW9ucz8uc2NoZWR1bGluZz8uZnJlcXVlbmN5ID09PSAnbWFudWFsJyA6IGpvYi5vcHRpb25zPy5zY2hlZHVsaW5nPy5mcmVxdWVuY3kgIT09ICdtYW51YWwnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZpbHRlclJlcS5vd25lcikge1xuICAgICAgICAgIGNvbnN0IHByb2ZpbGUgPSBnZXRDYWNoZWRQcm9maWxlT3JOaWwoKTtcbiAgICAgICAgICBpZiAocHJvZmlsZSkge1xuICAgICAgICAgICAgam9icyA9IGpvYnMuZmlsdGVyKChqb2IpID0+ICh0aGlzLmZpbHRlclJlcS5vd25lciA9PT0gJ21lJyA/IGpvYi5vd25lcklkID09PSBwcm9maWxlLnVzZXJJZCA6IGpvYi5vd25lcklkICE9PSBwcm9maWxlLnVzZXJJZCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0RmlsdGVyZWRKb2JzKGpvYnMpO1xuICAgICAgfVxuXG4gICAgICAvL3RoaXMuJHJvdXRlci5yZXBsYWNlKHtxdWVyeToge2ZvbGRlcjogdGhpcy5maWx0ZXJSZXEuZm9sZGVyfX0pO1xuICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfSxcblxuICAgIGFzeW5jIGhhbmRsZUNsb25lKHJlYykge1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0Zvcm0oYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGFwaS5jbG9uZUpvYihyZWMuaWQpO1xuICAgICAgICAgIHRoaXMucHJvY2Vzc2luZyA9IGZhbHNlO1xuICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0Sm9icyh0cnVlKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0aGlzLnByb2dyZXNzT3BlbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgYXN5bmMgaGFuZGxlRGVsZXRlKHJlY3MpIHtcbiAgICAgIHRoaXMubWVzc2FnZSA9IG51bGw7XG4gICAgICBjb25zdCBtc2cgPSBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSBmb2xsb3dpbmcgSm9icz8gPC9icj4gJHt1dGlscy5nZXRFbnRpdHlOYW1lc0xpc3RGb3JEaWFsb2cocmVjcyl9YDtcblxuICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgdXRpbHMuY29uZmlybURlbGV0ZSgnRGVsZXRlIEpvYnM/JywgbXNnKTtcbiAgICAgIGlmIChjb25maXJtZWQpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVEZWxldGVBZnRlckNvbmZpcm0ocmVjcyk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGhhbmRsZURlbGV0ZUFmdGVyQ29uZmlybShyZWNzKSB7XG4gICAgICB0aGlzLnByb2dyZXNzT3BlbiA9IHRydWU7XG4gICAgICB0aGlzLnByb2Nlc3NGb3JtKGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgYXBpLmRlbGV0ZUpvYnMoe3JlY29yZHM6IHJlY3MubWFwKChyZWMpID0+ICh7aWQ6IHJlYy5pZH0pKX0pO1xuICAgICAgICAgIHV0aWxzLm5vdGlmeVN1Y2Nlc3MocmVzcC5tZXNzYWdlKTtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NpbmcgPSBmYWxzZTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmdldEpvYnModHJ1ZSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdGhpcy5wcm9ncmVzc09wZW4gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGhhbmRsZUVkaXQocmVjKSB7XG4gICAgICB0aGlzLm1lc3NhZ2UgPSBudWxsO1xuICAgICAgdGhpcy5kaWFsb2dKb2JJZCA9IHJlYy5pZDtcbiAgICAgIHRoaXMuZGlhbG9nTW9kZSA9ICdlZGl0JztcbiAgICAgIHRoaXMuZGlhbG9nT3BlbiA9IHRydWU7XG4gICAgICB0aGlzLmRpYWxvZ0RhdGEgPSByZWM7XG4gICAgfSxcblxuICAgIGFzeW5jIGhhbmRsZVNhdmUoY29ubikge1xuICAgICAgYXdhaXQgdGhpcy5nZXRKb2JzKHRydWUpO1xuICAgIH0sXG5cbiAgICBoYW5kbGVBY3RpdmF0ZSgpIHtcbiAgICAgIHRoaXMudXBkYXRlSm9ic0J1bGsodGhpcy5nZXRTZWxlY3Rpb24oKSwge3N0YXR1czogdXRpbHMuU1RBVFVTX0FDVElWRX0pO1xuICAgIH0sXG5cbiAgICBoYW5kbGVJbmFjdGl2YXRlKCkge1xuICAgICAgdGhpcy51cGRhdGVKb2JzQnVsayh0aGlzLmdldFNlbGVjdGlvbigpLCB7c3RhdHVzOiB1dGlscy5TVEFUVVNfSU5BQ1RJVkV9KTtcbiAgICB9LFxuXG4gICAgaGFuZGxlTG9ja0pvYnMoKSB7XG4gICAgICBjb25zdCBzZWxzID0gdGhpcy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgIHRoaXMucHJvY2Vzc0Zvcm0oYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBhcGkubG9ja0pvYnMoe2lkczogbWFwVG9JZHMoc2Vscyl9KTtcbiAgICAgICAgdXRpbHMubm90aWZ5U3VjY2VzcygnSm9icyBoYXZlIGJlZW4gbG9ja2VkJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuZ2V0Sm9icyh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBoYW5kbGVVbmxvY2tKb2JzKCkge1xuICAgICAgY29uc3Qgc2VscyA9IHRoaXMuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICB0aGlzLnByb2Nlc3NGb3JtKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgYXBpLnVubG9ja0pvYnMoe2lkczogbWFwVG9JZHMoc2Vscyl9KTtcbiAgICAgICAgdXRpbHMubm90aWZ5U3VjY2VzcygnSm9icyBoYXZlIGJlZW4gdW5sb2NrZWQnKTtcbiAgICAgICAgYXdhaXQgdGhpcy5nZXRKb2JzKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGhhbmRsZVB1cmdlSm9icygpIHtcbiAgICAgIGNvbnN0IHNlbHMgPSB0aGlzLmdldFNlbGVjdGlvbigpO1xuICAgICAgY29uc3Qgbm9uRGVsZXRlZFNlbHMgPSBzZWxzLmZpbHRlcigoaXQpID0+ICFpc0RlbGV0ZWQoaXQpKTtcbiAgICAgIGlmIChub25EZWxldGVkU2Vscy5sZW5ndGggPiAwKSB7XG4gICAgICAgI
1017HRoaXMubWVzc2FnZSA9ICdPbmx5IGRlbGV0ZWQgSm9icyBjYW4gYmUgcHVyZ2VkJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm1lc3NhZ2UgPSBudWxsO1xuICAgICAgY29uc3QgbXNnID1cbiAgICAgICAgJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBwdXJnZSBmb2xsb3dpbmcgSm9icz8gJyArXG4gICAgICAgIGA8dWw+ICR7Z2V0RW50aXR5TmFtZXNMaXN0Rm9yRGlhbG9nKHNlbHMpfSA8L3VsPklmIGNvbmZpcm1lZCwgc2VsZWN0ZWQgSm9icywgaXRzIFRhc2tzIGFuZCBSdW5zIHdpbGwgYmUgUEVSTUFORU5UTFkgREVMRVRFRC5gO1xuXG4gICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCB1dGlscy5jb25maXJtRGVsZXRlKCdQdXJnZSBKb2JzPycsIG1zZyk7XG4gICAgICBpZiAoY29uZmlybWVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NGb3JtKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgYXBpLnB1cmdlSm9icyh7aWRzOiBtYXBUb0lkcyhzZWxzKX0pO1xuICAgICAgICAgIHV0aWxzLm5vdGlmeVN1Y2Nlc3MocmVzcC5tZXNzYWdlIHx8ICdTZWxlY3RlZCBKb2JzIGhhdmUgYmVlbiBwdXJnZWQnKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmdldEpvYnModHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICB2YWxpZGF0ZUltcG9ydEpvYkpzb24oY29udGVudCkge1xuICAgICAgaWYgKCFjb250ZW50Lm5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaWVsZCBuYW1lIGlzIHJlcXVpcmVkJyk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGhhbmRsZUltcG9ydEpvYigpIHtcbiAgICAgIHRoaXMuaW1wb3J0Sm9ic0RpYWxvZ0NvbnRlbnQgPSAnJztcbiAgICAgIHRoaXMuaW1wb3J0Sm9ic0RpYWxvZ0Vycm9yID0gJyc7XG4gICAgICB0aGlzLmltcG9ydEpvYnNEaWFsb2dPcGVuID0gdHJ1ZTtcbiAgICB9LFxuXG4gICAgaGFuZGxlSW1wb3J0Sm9iT2soY29udGVudCkge1xuICAgICAgdGhpcy5pbXBvcnRKb2JzRGlhbG9nT3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5wcm9jZXNzKGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgYXBpLmltcG9ydEpvYihKU09OLnBhcnNlKGNvbnRlbnQpKTtcbiAgICAgICAgICB0aGlzLnJlZnJlc2hKb2JzKCk7XG4gICAgICAgICAgbm90aWZ5U3VjY2VzcyhyZXNwLm1lc3NhZ2UgfHwgJ0pvYiBoYXMgYmVlbiBpbXBvcnRlZCcpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhpcy5pbXBvcnRKb2JzRGlhbG9nQ29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgICAgdGhpcy5pbXBvcnRKb2JzRGlhbG9nT3BlbiA9IHRydWU7XG4gICAgICAgICAgdGhpcy5pbXBvcnRKb2JzRGlhbG9nRXJyb3IgPSBlLm1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBoYW5kbGVSdW5Kb2JzKCkge1xuICAgICAgY29uc3Qgc2VscyA9IHRoaXMuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICBpZiAoc2Vscykge1xuICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCB1dGlscy5jb25maXJtRXhlY3V0ZSgnUnVuIEpvYnM/JywgYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBydW4gc2VsZWN0ZWQgJHtzZWxzLmxlbmd0aH0gSm9icz9gKTtcblxuICAgICAgICBpZiAoY29uZmlybWVkKSB7XG4gICAgICAgICAgdGhpcy5leGVjdXRlSm9icyhzZWxzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBleGVjdXRlSm9icyhzZWxzKSB7XG4gICAgICB0aGlzLnByb2Nlc3NGb3JtKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgYXBpLmV4ZWN1dGVKb2JzKHtyZWNvcmRzOiBzZWxzLm1hcCgoZGwpID0+ICh7aWQ6IGRsLmlkfSkpfSk7XG4gICAgICAgIHRoaXMucHJvY2Vzc2luZyA9IGZhbHNlO1xuICAgICAgICB1dGlscy5ub3RpZnlTdWNjZXNzKCdKb2JzIGhhdmUgYmVlbiBzdWJtaXR0ZWQgZm9yIGV4ZWN1dGlvbicpO1xuICAgICAgICBhd2FpdCB0aGlzLmdldEpvYnModHJ1ZSk7XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgdXBkYXRlSm9ic0J1bGsoc2VscywgZmllbGRzVG9VcGRhdGUpIHtcbiAgICAgIGlmICghc2VscyB8fCBzZWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBheWxvYWQgPSBzZWxzLm1hcCgoc2VsKSA9PiBPYmplY3QuYXNzaWduKHtpZDogc2VsLmlkfSwgZmllbGRzVG9VcGRhdGUpKTtcblxuICAgICAgdGhpcy5wcm9jZXNzRm9ybShhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGFwaS51cGRhdGVKb2JzQnVsayh7cmVjb3JkczogcGF5bG9hZH0pO1xuICAgICAgICB1dGlscy5ub3RpZnlTdWNjZXNzKCdKb2JzIGhhdmUgYmVlbiB1cGRhdGVkJyk7XG4gICAgICAgIGF3YWl0IHRoaXMuZ2V0Sm9icyh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBnZXRTZWxlY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcmVmcy5ncmlkLmdldENvbmZpcm1lZFNlbGVjdGlvbigpO1xuICAgIH0sXG5cbiAgICAvLyBhc3luYyBydW5DbGlja0hhbmRsZShzZWwpIHtcbiAgICAvLyAgIGlmIChzZWwpIHtcbiAgICAvLyAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgdXRpbHMuY29uZmlybUV4ZWN1dGUoJ1J1biBKb2I/JywgJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBydW4gc2VsZWN0ZWQgSm9iPycpO1xuICAgIC8vXG4gICAgLy8gICAgIGlmIChjb25maXJtZWQpIHtcbiAgICAvLyAgICAgICB0aGlzLmV4ZWN1dGVKb2JzKFtzZWxdKTtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgfVxuICAgIC8vIH0sXG5cbiAgICBoYW5kbGVDaGFuZ2VPd25lcigpIHtcbiAgICAgIHRoaXMuY2hhbmdlT3duZXJEaWFsb2dEYXRhID0gdGhpcy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgIGlmICh0aGlzLmNoYW5nZU93bmVyRGlhbG9nRGF0YSkge1xuICAgICAgICB0aGlzLmNoYW5nZU93bmVyRGlhbG9nT3BlbiA9IHRydWU7XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBoYW5kbGVDaGFuZ2VGb2xkZXIoKSB7XG4gICAgICBjb25zdCBpbnB1dCA9IGF3YWl0IHNob3dJbnB1dCgnTmV3IEZvbGRlciBOYW1lJywgJ0VudGVyIG5ldyBmb2xkZXIgbmFtZS4gTGVhdmUgaXQgYmxhbmsgYW5kIGNsaWNrIE9rIHRvIHJlbW92ZSBmb2xkZXIgZnJvbSBzZWxlY3RlZCBqb2JzLicpO1xuICAgICAgaWYgKGlucHV0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZUpvYnNCdWxrKHRoaXMuZ2V0U2VsZWN0aW9uKCksIHtmb2xkZXI6IGlucHV0fSk7XG4gICAgfSxcblxuICAgIG9wZW5Kb2JzRmlsdGVyRGlhbG9nKCkge1xuICAgICAgdGhpcy5qb2JzRmlsdGVyRGlhbG9nT3BlbiA9IHRydWU7XG4gICAgfSxcblxuICAgIGhhbmRsZUpvYkZpbHRlcihyYW5nZSkge1xuICAgICAgdGhpcy5maWx0ZXJSZXEgPSB0aGlzLmZpbHRlclJlcSB8fCB7fTtcbiAgICAgIHRoaXMuZmlsdGVyUmVxLnN0YXR1cyA9IHJhbmdlLnN0YXR1cztcbiAgICAgIHRoaXMuZmlsdGVyUmVxLmVudklkID0gcmFuZ2UuZW52SWQgfHwgJyc7XG4gICAgICB0aGlzLmZpbHRlclJlcS5mb2xkZXIgPSByYW5nZS5mb2xkZXIgfHwgJyc7XG4gICAgICB0aGlzLiRyZWZzLmdyaWQucmVmcmVzaCgpO1xuICAgIH0sXG5cbiAgICB1cGRhdGVTdGF0dXMoKSB7XG4gICAgICBjb25zdCBmaWx0ZXJzID0gW1xuICAgICAgICBgRW52OiAke3RoaXMuZmlsdGVyUmVxLmVudklkID8gdXRpbHMuZ2V0RW52TmFtZWZyb21FbnYodGhpcy5lbnZzLCB0aGlzLmZpbHRlclJlcS5lbnZJZCkgOiAnQWxsJ31gLFxuICAgICAgICBgRm9sZGVyOiAke3RoaXMuZmlsdGVyUmVxLmZvbGRlciA/IHRoaXMuZmlsdGVyUmVxLmZvbGRlciA6ICdBbGwnfWAsXG4gICAgICAgIGBTdGF0dXM6ICR7dGhpcy5maWx0ZXJSZXEuc3RhdHVzID8gdGhpcy5maWx0ZXJSZXEuc3RhdHVzIDogJ0FsbCd9YCxcbiAgICAgIF07XG5cbiAgICAgIHRoaXMuc3RhdHVzID0gYEZpbHRlciBbJHtmaWx0ZXJzLmpvaW4oJywgJyl9XWA7XG4gICAgfSxcblxuICAgI
1017HVwZGF0ZUZvbGRlcnMoZm9sZGVyc1Jlc3ApIHtcbiAgICAgIGNvbnN0IGZvbGRlcnMgPSBzb3J0SWMoZm9sZGVyc1Jlc3AuZm9sZGVycy5tYXAoKGl0KSA9PiBpdCkpO1xuICAgICAgdGhpcy5mb2xkZXJzID0gW1xuICAgICAgICB7aWQ6IEZvbGRlcl9SZWNlbnQsIG5hbWU6IEZvbGRlcl9SZWNlbnR9LFxuICAgICAgICB7aWQ6IEZvbGRlcl9CbGFuaywgbmFtZTogRm9sZGVyX0JsYW5rfSxcbiAgICAgICAgLi4uZm9sZGVycy5tYXAoKGZvbGRlcikgPT4gKHtpZDogZm9sZGVyLCBuYW1lOiBmb2xkZXJ9KSksXG4gICAgICBdO1xuICAgIH0sXG5cbiAgICBhc3luYyB2aWV3U3VtbWFyeUpzb24oKSB7XG4gICAgICBjb25zdCByZWMgPSB0aGlzLiRyZWZzLmdyaWQuZ2V0Q29uZmlybWVkU2VsZWN0aW9uT25lKCk7XG4gICAgICBpZiAoIXJlYykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NGb3JtKGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy50ZXh0Vmlld2VyQ29udGVudCA9IGF3YWl0IGFwaS5nZXRTdW1tYXJ5SnNvbihyZWMuaWQpO1xuICAgICAgICB0aGlzLnRleHRWaWV3ZXJPcGVuID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYyBleHBvcnRBbGxKb2JzKCkge1xuICAgICAgY29uc3QgcmVjcyA9IHRoaXMuJHJlZnMuZ3JpZC5nZXRDb25maXJtZWRTZWxlY3Rpb24oKTtcblxuICAgICAgaWYgKCFyZWNzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbXNnID0gYFlvdSBhcmUgZXhwb3J0aW5nIGRldGFpbHMgb2YgJHtyZWNzLmxlbmd0aH0gSm9icy4gPC9icj48L2JyPiBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWU/YDtcbiAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IHV0aWxzLnNob3dDb25maXJtKCdFeHBvcnQgSm9icycsIG1zZyk7XG4gICAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzRm9ybShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpLmdldEpvYnNKc29uU3VtbWFyeVVybCh7aWRzOiByZWNzLm1hcCgoaXQpID0+IGl0LmlkKX0pO1xuICAgICAgICAgIHdpbmRvdy5vcGVuKHJlcy5kb3dubG9hZFVybCwgJ19zZWxmJyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVCYWNrdXAoKSB7XG4gICAgICBjb25zdCByZWMgPSB0aGlzLiRyZWZzLmdyaWQuZ2V0Q29uZmlybWVkU2VsZWN0aW9uT25lKCk7XG4gICAgICBpZiAoIXJlYykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5hbWUgPSBhd2FpdCB1dGlscy5zaG93SW5wdXQoJ0JhY2t1cCBOYW1lJywgJ1BsZWFzZSBlbnRlciBiYWNrdXAgbmFtZScsIHtyZXF1aXJlZDogdHJ1ZX0pO1xuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0Zvcm0oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgYXBpLmNyZWF0ZUpvYkJhY2t1cChyZWMuaWQsIHtuYW1lfSk7XG4gICAgICAgIHV0aWxzLm5vdGlmeVN1Y2Nlc3MocmVzcC5tZXNzYWdlIHx8ICdCYWNrdXAgaGFzIGJlZW4gY3JlYXRlZCcpO1xuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIHZpZXdCYWNrdXBzKCkge1xuICAgICAgY29uc3QgcmVjID0gdGhpcy4kcmVmcy5ncmlkLmdldENvbmZpcm1lZFNlbGVjdGlvbk9uZSgpO1xuICAgICAgaWYgKCFyZWMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmJhY2t1cHNEaWFsb2dFbnRpdHlJZCA9IHJlYy5pZDtcbiAgICAgIHRoaXMuYmFja3Vwc0RpYWxvZ1RpdGxlID0gYEpvYiBCYWNrdXBzIC0gJHtyZWMubmFtZX1gO1xuICAgICAgdGhpcy5iYWNrdXBzRGlhbG9nT3BlbiA9IHRydWU7XG4gICAgfSxcbiAgICB2aWV3RGVsZXRlZEpvYnMoKSB7XG4gICAgICB0aGlzLmRlbGV0ZWRKb2JzQmFja3Vwc0RpYWxvZ09wZW4gPSB0cnVlO1xuICAgIH0sXG5cbiAgICBhc3luYyBoYW5kbGVEZWxldGVQdXJnZUpvYnMoKSB7XG4gICAgICBjb25zdCBzZWxzID0gdGhpcy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgIGlmICghc2VscyB8fCBzZWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1zZyA9XG4gICAgICAgICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIGFuZCBwdXJnZSBmb2xsb3dpbmcgSm9icz8gJyArXG4gICAgICAgIGA8dWw+ICR7Z2V0RW50aXR5TmFtZXNMaXN0Rm9yRGlhbG9nKHNlbHMpfSA8L3VsPklmIGNvbmZpcm1lZCwgc2VsZWN0ZWQgSm9icywgaXRzIFRhc2tzIGFuZCBSdW5zIHdpbGwgYmUgUEVSTUFORU5UTFkgREVMRVRFRC5gO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdXRpbHMuY29uZmlybURlbGV0ZSgnRGVsZXRlIGFuZCBQdXJnZSBKb2JzPycsIG1zZyk7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NGb3JtKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgYXBpLmRlbGV0ZUFuZFB1cmdlSm9icyh7aWRzOiBtYXBUb0lkcyhzZWxzKX0pO1xuICAgICAgICAgIG5vdGlmeVN1Y2Nlc3MocmVzcC5tZXNzYWdlIHx8ICdKb2JzIGhhdmUgYmVlbiBwdXJnZWQnKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmdldEpvYnModHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBzb3J0Sm9icygpIHtcbiAgICAgIGlmICh0aGlzLmZpbHRlclJlcS5mb2xkZXIgPT09IEZvbGRlcl9SZWNlbnQpIHtcbiAgICAgICAgY29uc3QgcmVjZW50SWRzU2V0ID0gbmV3IFNldCh0aGlzLnJlY2VudEpvYklkcyk7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRKb2JzID0gW1xuICAgICAgICAgIC4uLnRoaXMuZmlsdGVyZWRKb2JzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFJblJlY2VudCA9IHJlY2VudElkc1NldC5oYXMoYS5pZCk7XG4gICAgICAgICAgICBjb25zdCBiSW5SZWNlbnQgPSByZWNlbnRJZHNTZXQuaGFzKGIuaWQpO1xuICAgICAgICAgICAgaWYgKGFJblJlY2VudCAmJiAhYkluUmVjZW50KSByZXR1cm4gLTE7XG4gICAgICAgICAgICBpZiAoIWFJblJlY2VudCAmJiBiSW5SZWNlbnQpIHJldHVybiAxO1xuICAgICAgICAgICAgaWYgKGFJblJlY2VudCAmJiBiSW5SZWNlbnQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVjZW50Sm9iSWRzLmluZGV4T2YoYS5pZCkgLSB0aGlzLnJlY2VudEpvYklkcy5pbmRleE9mKGIuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNvcnRJYyhhLm5hbWUsIGIubmFtZSk7XG4gICAgICAgICAgfSksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfSxcbiAgfSxcbn07XG48L3NjcmlwdD5cbiJdLCJuYW1lcyI6WyJfc2ZjX21haW4iLCJfY3JlYXRlQmxvY2siLCJfY3JlYXRlVk5vZGUiLCJhcGkuZ2V0RGVsZXRlZEpvYnNCYWNrdXBzIiwiYXBpLmdldERlbGV0ZWRKb2JCYWNrdXAiLCJ1dGlscy5nZXRGcmVxdWVuY3lGb3JMaXN0IiwidXRpbHMudmFsdWVMYWJlbHMiLCJhcGkuZ2V0Sm9icyIsImFwaS5nZXRKb2JGb2xkZXJzIiwiYXBpLmdldFJlY2VudEpvYklkcyIsImVx
1017dWFsc0ljIiwiYXBpLmNsb25lSm9iIiwidXRpbHMuZ2V0RW50aXR5TmFtZXNMaXN0Rm9yRGlhbG9nIiwidXRpbHMuY29uZmlybURlbGV0ZSIsImFwaS5kZWxldGVKb2JzIiwidXRpbHMubm90aWZ5U3VjY2VzcyIsInV0aWxzLlNUQVRVU19BQ1RJVkUiLCJ1dGlscy5TVEFUVVNfSU5BQ1RJVkUiLCJhcGkubG9ja0pvYnMiLCJtYXBUb0lkcyIsImFwaS51bmxvY2tKb2JzIiwiaXNEZWxldGVkIiwiYXBpLnB1cmdlSm9icyIsImFwaS5pbXBvcnRKb2IiLCJ1dGlscy5jb25maXJtRXhlY3V0ZSIsImFwaS5leGVjdXRlSm9icyIsImFwaS51cGRhdGVKb2JzQnVsayIsInV0aWxzLmdldEVudk5hbWVmcm9tRW52IiwiYXBpLmdldFN1bW1hcnlKc29uIiwidXRpbHMuc2hvd0NvbmZpcm0iLCJhcGkuZ2V0Sm9ic0pzb25TdW1tYXJ5VXJsIiwidXRpbHMuc2hvd0lucHV0IiwiYXBpLmNyZWF0ZUpvYkJhY2t1cCIsImFwaS5kZWxldGVBbmRQdXJnZUpvYnMiLCJfd2l0aEN0eCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9DQSxNQUFLQSxjQUFVO0FBQUEsRUFDYixRQUFRLENBQUMsTUFBTTtBQUFBLEVBQ2YsT0FBTztBQUFBLElBQ0wsWUFBWTtBQUFBLElBQ1osT0FBTztBQUFBLElBQ1AsTUFBTTtBQUFBO0VBRVIsT0FBTyxDQUFDLE1BQU0sVUFBVSxtQkFBbUI7QUFBQSxFQUMzQyxPQUFPO0FBQ0wsV0FBTztBQUFBLE1BQ0wsZUFBZSxPQUFPLE9BQU8sQ0FBQSxHQUFJLEtBQUssS0FBSztBQUFBO0VBRS9DO0FBQUEsRUFDQSxPQUFPO0FBQUEsSUFDTCxhQUFhO0FBQ1gsVUFBSSxDQUFDLEtBQUssWUFBWTtBQUNwQjtBQUFBLE1BQ0Y7QUFDQSxXQUFLLFVBQVU7QUFDZixXQUFLLGlCQUFpQjtBQUFBLElB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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.