kwikid-forms 0.6.50 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/bundles/kwikid-forms.umd.js +480 -136
  2. package/bundles/kwikid-forms.umd.js.map +1 -1
  3. package/esm2015/lib/builder/builder.component.js +19 -9
  4. package/esm2015/lib/renderer/config-converter/config-converter.constants.js +13 -3
  5. package/esm2015/lib/renderer/config-converter/config-converter.helper.js +6 -4
  6. package/esm2015/lib/renderer/config-converter/config-converter.js +14 -3
  7. package/esm2015/lib/renderer/form-view/definitions/form-view.fields.definition.js +1 -1
  8. package/esm2015/lib/renderer/form-view/form-view.api.service.js +13 -3
  9. package/esm2015/lib/renderer/form-view/form-view.component.js +76 -18
  10. package/esm2015/lib/renderer/forms-list/forms-list.component.js +25 -9
  11. package/esm2015/lib/renderer/helpers/forms-storage.helper.js +194 -0
  12. package/esm2015/lib/renderer/renderer.component.js +23 -12
  13. package/fesm2015/kwikid-forms.js +370 -52
  14. package/fesm2015/kwikid-forms.js.map +1 -1
  15. package/lib/builder/builder.component.d.ts +2 -1
  16. package/lib/renderer/config-converter/config-converter.constants.d.ts +10 -0
  17. package/lib/renderer/config-converter/config-converter.d.ts +7 -0
  18. package/lib/renderer/config-converter/config-converter.helper.d.ts +1 -1
  19. package/lib/renderer/form-view/definitions/form-view.fields.definition.d.ts +7 -0
  20. package/lib/renderer/form-view/form-view.api.service.d.ts +5 -0
  21. package/lib/renderer/form-view/form-view.component.d.ts +4 -1
  22. package/lib/renderer/forms-list/forms-list.component.d.ts +2 -1
  23. package/lib/renderer/helpers/forms-storage.helper.d.ts +46 -0
  24. package/lib/renderer/renderer.component.d.ts +2 -1
  25. package/package.json +9 -5
@@ -31,6 +31,7 @@ export class KwikIDFormsRendererComponent {
31
31
  this.formsData = {};
32
32
  this.extraData = {};
33
33
  this.activeFormData = {};
34
+ this.reduxData = {};
34
35
  this.apiCallResponse = {};
35
36
  this.buttonClickResponse = {};
36
37
  this.onClickSubmit = new EventEmitter();
@@ -96,16 +97,17 @@ export class KwikIDFormsRendererComponent {
96
97
  this.showErrorNotification = show;
97
98
  }
98
99
  ngOnInit() {
99
- var _a, _b, _c;
100
+ var _a, _b, _c, _d, _e, _f;
101
+ this.reduxData = (_a = this.reduxData) !== null && _a !== void 0 ? _a : {};
100
102
  this.toggleLoader(true);
101
103
  this.loading = true;
102
- const formStepKey = (_c = (_b = (_a = this.stepConfig) === null || _a === void 0 ? void 0 : _a.form) === null || _b === void 0 ? void 0 : _b.key) !== null && _c !== void 0 ? _c : undefined;
104
+ const formStepKey = (_f = (_d = (_c = (_b = this.stepConfig) === null || _b === void 0 ? void 0 : _b.form) === null || _c === void 0 ? void 0 : _c.key) !== null && _d !== void 0 ? _d : (_e = this.stepConfig) === null || _e === void 0 ? void 0 : _e.stepKey) !== null && _f !== void 0 ? _f : undefined;
103
105
  if (formStepKey !== undefined &&
104
106
  checkObjectKeyExists(this.userConfig.userFormFields, formStepKey)) {
105
- this.formsList = this.userConfig.userFormFields[formStepKey];
107
+ this.formsList = getObjectDeepCopy(this.userConfig.userFormFields[formStepKey]);
106
108
  }
107
109
  else if (Array.isArray(this.userConfig.userFormFields)) {
108
- this.formsList = this.userConfig.userFormFields;
110
+ this.formsList = getObjectDeepCopy(this.userConfig.userFormFields);
109
111
  }
110
112
  else {
111
113
  throw new Error(`userFormFields doesn't have a form defined with key: ${formStepKey}`);
@@ -114,6 +116,7 @@ export class KwikIDFormsRendererComponent {
114
116
  this.toggleLoader(false);
115
117
  }
116
118
  ngOnChanges(changes) {
119
+ var _a;
117
120
  const verifyChange = (prop) => {
118
121
  return checkObjectKeyExists(changes, prop) && !changes[prop].firstChange;
119
122
  };
@@ -140,6 +143,9 @@ export class KwikIDFormsRendererComponent {
140
143
  this.buttonClickResponse = changes.buttonClickResponse.currentValue;
141
144
  this.toggleLoader(false);
142
145
  }
146
+ if (checkObjectKeyExists(changes, "reduxData")) {
147
+ this.reduxData = (_a = changes.reduxData.currentValue) !== null && _a !== void 0 ? _a : {};
148
+ }
143
149
  }
144
150
  triggerLogs(eventType, logs) {
145
151
  this.getLogs.emit(formatEventLogs(eventType, this.stepConfig, logs));
@@ -529,7 +535,7 @@ export class KwikIDFormsRendererComponent {
529
535
  * @param selectedForm string
530
536
  */
531
537
  handleOnClickSetActiveForm(selectedForm, triggerType) {
532
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
538
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
533
539
  return __awaiter(this, void 0, void 0, function* () {
534
540
  this.showForm = false;
535
541
  this.toggleLoader(true);
@@ -537,7 +543,10 @@ export class KwikIDFormsRendererComponent {
537
543
  let activeFormConfig = this.formsList.find((form) => {
538
544
  return form.key === selectedForm;
539
545
  });
540
- activeFormConfig = new Converter().updateFormConfigProperties(activeFormConfig);
546
+ activeFormConfig = new Converter({
547
+ reduxData: (_a = this.reduxData) !== null && _a !== void 0 ? _a : {},
548
+ userConfig: this.userConfig
549
+ }).updateFormConfigProperties(activeFormConfig);
541
550
  let formConfig;
542
551
  if (checkObjectKeyExists(activeFormConfig, "props")) {
543
552
  if (checkObjectKeyExists(activeFormConfig.props, "url")) {
@@ -547,7 +556,7 @@ export class KwikIDFormsRendererComponent {
547
556
  else if (checkObjectKeyExists(activeFormConfig.props, "path") &&
548
557
  checkObjectKeyExists(this.userConfig, "backend") &&
549
558
  checkObjectKeyExists(this.userConfig.backend, "CONFIG_BASE_URL")) {
550
- const url = `${(_b = (_a = this.userConfig) === null || _a === void 0 ? void 0 : _a.backend) === null || _b === void 0 ? void 0 : _b.CONFIG_BASE_URL}${activeFormConfig.props.path}`;
559
+ const url = `${(_c = (_b = this.userConfig) === null || _b === void 0 ? void 0 : _b.backend) === null || _c === void 0 ? void 0 : _c.CONFIG_BASE_URL}${activeFormConfig.props.path}`;
551
560
  const formConfigFromPath = yield this.fetchFormConfig(url);
552
561
  formConfig = Object.assign(Object.assign({}, activeFormConfig), formConfigFromPath);
553
562
  }
@@ -571,7 +580,7 @@ export class KwikIDFormsRendererComponent {
571
580
  else if (checkObjectKeyExists(activeFormConfig.formContent, "path") &&
572
581
  checkObjectKeyExists(this.userConfig, "backend") &&
573
582
  checkObjectKeyExists(this.userConfig.backend, "CONFIG_BASE_URL")) {
574
- const url = `${(_d = (_c = this.userConfig) === null || _c === void 0 ? void 0 : _c.backend) === null || _d === void 0 ? void 0 : _d.CONFIG_BASE_URL}${activeFormConfig.props.path}`;
583
+ const url = `${(_e = (_d = this.userConfig) === null || _d === void 0 ? void 0 : _d.backend) === null || _e === void 0 ? void 0 : _e.CONFIG_BASE_URL}${activeFormConfig.props.path}`;
575
584
  const formConfigFromPath = yield this.fetchFormConfig(url);
576
585
  formConfig = Object.assign(Object.assign({}, activeFormConfig), formConfigFromPath);
577
586
  }
@@ -590,13 +599,13 @@ export class KwikIDFormsRendererComponent {
590
599
  case "BUTTON_CLICK":
591
600
  this.triggerLogs(ELogEventType.FORM__FORM_OPEN_BUTTON_CLICK, {
592
601
  form_key: this.activeFormConfig.key,
593
- form_title: (_f = (_e = this.activeFormConfig) === null || _e === void 0 ? void 0 : _e.title) !== null && _f !== void 0 ? _f : (_h = (_g = this.activeFormConfig) === null || _g === void 0 ? void 0 : _g.props) === null || _h === void 0 ? void 0 : _h.title
602
+ form_title: (_g = (_f = this.activeFormConfig) === null || _f === void 0 ? void 0 : _f.title) !== null && _g !== void 0 ? _g : (_j = (_h = this.activeFormConfig) === null || _h === void 0 ? void 0 : _h.props) === null || _j === void 0 ? void 0 : _j.title
594
603
  });
595
604
  break;
596
605
  default:
597
606
  this.triggerLogs(ELogEventType.FORM__FORM_OPEN_AUTO, {
598
607
  form_key: this.activeFormConfig.key,
599
- form_title: (_k = (_j = this.activeFormConfig) === null || _j === void 0 ? void 0 : _j.title) !== null && _k !== void 0 ? _k : (_m = (_l = this.activeFormConfig) === null || _l === void 0 ? void 0 : _l.props) === null || _m === void 0 ? void 0 : _m.title
608
+ form_title: (_l = (_k = this.activeFormConfig) === null || _k === void 0 ? void 0 : _k.title) !== null && _l !== void 0 ? _l : (_o = (_m = this.activeFormConfig) === null || _m === void 0 ? void 0 : _m.props) === null || _o === void 0 ? void 0 : _o.title
600
609
  });
601
610
  break;
602
611
  }
@@ -860,7 +869,7 @@ export class KwikIDFormsRendererComponent {
860
869
  }
861
870
  }
862
871
  /** @nocollapse */ KwikIDFormsRendererComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDFormsRendererComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: TuiPreviewDialogService }, { token: i1.KwikUILoaderService }, { token: TuiDialogService }], target: i0.ɵɵFactoryTarget.Component });
863
- /** @nocollapse */ KwikIDFormsRendererComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: KwikIDFormsRendererComponent, selector: "kwikid-forms-renderer", inputs: { stepConfig: "stepConfig", userConfig: "userConfig", formsData: "formsData", extraData: "extraData", activeFormData: "activeFormData", apiCallResponse: "apiCallResponse", buttonClickResponse: "buttonClickResponse" }, outputs: { onClickSubmit: "onClickSubmit", getFormData: "getFormData", onClickApiCall: "onClickApiCall", onClickViewFile: "onClickViewFile", getLogs: "getLogs", onClickFormFieldButton: "onClickFormFieldButton" }, host: { listeners: { "window:resize": "windowResizeWatcher($event)" } }, viewQueries: [{ propertyName: "preview", first: true, predicate: ["preview"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div ngClass=\"kwikid-renderer\">\n <div\n ngClass=\"kwikid-layout-container\"\n *ngIf=\"!loading\"\n >\n <div\n ngClass=\"kwikid-sections-container\"\n *ngIf=\"showFormSections\"\n class=\"active\"\n [class.active]=\"showFormSections\"\n [class.mobile]=\"isMobileView\"\n >\n <kwikid-forms-list\n [showFormFields]=\"this.showFormFields\"\n [activeFormConfig]=\"this.activeFormConfig\"\n [userConfig]=\"this.userConfig\"\n [formsList]=\"this.formsList\"\n [stepConfig]=\"this.stepConfig\"\n [isUnsavedData]=\"this.isUnsavedData\"\n [formsListCompleted]=\"this.formsListCompleted\"\n [isMobileView]=\"this.isMobileView\"\n (getLogs)=\"handleGetLogs($event)\"\n (onClickSetActiveForm)=\"\n this.handleOnClickSetActiveForm($event, 'BUTTON_CLICK')\n \"\n (onClickSubmitForms)=\"this.handleOnClickSubmitForms($event)\"\n ></kwikid-forms-list>\n </div>\n <div\n ngClass=\"kwikid-forms-container\"\n *ngIf=\"\n this.showForm &&\n this.showFormFields &&\n this.activeFormConfig !== undefined\n \"\n [class.active]=\"showFormFields\"\n [class.mobile]=\"isMobileView\"\n [@panelInOut]\n >\n <kwikid-form-view\n *ngIf=\"this.activeFormConfig.type === 'FORM'\"\n [formConfig]=\"this.activeFormConfig\"\n [allFormsData]=\"this.allFormsData\"\n [extraData]=\"extraData\"\n [isMobileView]=\"this.isMobileView\"\n [userConfig]=\"this.userConfig\"\n [stepConfig]=\"this.stepConfig\"\n [popupFormCallback]=\"this.popupFormCallback\"\n [apiCallResponse]=\"this.apiCallResponse\"\n [buttonClickResponse]=\"this.buttonClickResponse\"\n (onClickFormFieldButton)=\"handleOnClickFormFieldButton($event)\"\n (getUnsavedDataState)=\"handleGetUnsavedState($event)\"\n (onClickApiCall)=\"handleOnClickApiCall($event)\"\n (onClickViewFile)=\"handleOnClickViewFile($event)\"\n (onActionShowPopupForm)=\"\n this.handleOnActionShowPopupForm($event, content)\n \"\n (onClickGoBack)=\"this.handleOnClickGoBack($event)\"\n (onClickViewForms)=\"this.handleOnClickViewForms($event)\"\n (getLogs)=\"handleGetLogs($event)\"\n (onClickSaveForm)=\"\n this.handleOnClickSaveForm($event, 'FORM', undefined)\n \"\n ></kwikid-form-view>\n </div>\n </div>\n</div>\n\n<kwikui-loader></kwikui-loader>\n\n<tui-push\n id=\"error-notification\"\n *tuiPush=\"showErrorNotification\"\n heading=\"Please complete the required Forms!\"\n type=\"Error\"\n (close)=\"toggleErrorNotification(false)\"\n>\n <tui-svg\n src=\"tuiIconXCircle\"\n style=\"color: #fff !important\"\n >\n </tui-svg>\n</tui-push>\n<ng-template\n #preview\n let-preview\n>\n <tui-preview\n [rotatable]=\"false\"\n [zoomable]=\"false\"\n class=\"preview-container\"\n *ngIf=\"popupFormConfig\"\n >\n <tui-preview-title *ngIf=\"previewProperties.title !== ''\">{{\n previewProperties.title\n }}</tui-preview-title>\n\n <div class=\"kwikid-form-view-popup-container\">\n <kwikid-form-view\n [formData]=\"activePopupFormData\"\n [formConfig]=\"popupFormConfig\"\n [allFormsData]=\"allFormsData\"\n [extraData]=\"extraData\"\n [userConfig]=\"this.userConfig\"\n [stepConfig]=\"this.stepConfig\"\n [isMobileView]=\"this.isMobileView\"\n [apiCallResponse]=\"this.apiCallResponse\"\n [buttonClickResponse]=\"this.buttonClickResponse\"\n (onClickFormFieldButton)=\"handleOnClickFormFieldButton($event)\"\n (getSavedState)=\"handleGetUnsavedState($event)\"\n (onClickApiCall)=\"handleOnClickApiCall($event)\"\n (getLogs)=\"handleGetLogs($event)\"\n (onClickSaveForm)=\"\n this.handleOnClickSaveForm($event, 'POPUP_FORM', undefined)\n \"\n ></kwikid-form-view>\n </div>\n\n <button\n tuiIconButton\n tuiPreviewAction\n icon=\"tuiIconCloseLarge\"\n title=\"Close\"\n type=\"button\"\n (click)=\"preview.complete()\"\n ></button>\n </tui-preview>\n</ng-template>\n<ng-template\n #content\n let-context\n>\n <div class=\"kwikid-form-view-popup-container\">\n <kwikid-form-view\n [formData]=\"activePopupFormData\"\n [formConfig]=\"popupFormConfig\"\n [extraData]=\"extraData\"\n [allFormsData]=\"allFormsData\"\n [userConfig]=\"this.userConfig\"\n [stepConfig]=\"this.stepConfig\"\n [isMobileView]=\"this.isMobileView\"\n [apiCallResponse]=\"this.apiCallResponse\"\n [buttonClickResponse]=\"this.buttonClickResponse\"\n (onClickFormFieldButton)=\"handleOnClickFormFieldButton($event)\"\n (getSavedState)=\"handleGetUnsavedState($event)\"\n (onClickApiCall)=\"handleOnClickApiCall($event)\"\n (getLogs)=\"handleGetLogs($event)\"\n (onClickSaveForm)=\"\n this.handleOnClickSaveForm($event, 'POPUP_FORM', context)\n \"\n ></kwikid-form-view>\n </div>\n</ng-template>\n", styles: [":host{position:relative;height:100%}.kwikid-root{width:100%;height:100%}.kwikid-renderer{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;align-content:center;width:100%;height:100%}.kwikid-layout-container{display:flex;flex-direction:row;padding:0 1rem;height:100%;justify-content:center;align-items:stretch;background:var(--tui-secondary-active);position:relative}.kwikid-sections-container{display:block;width:100%;max-width:400px;height:calc(100% - 2rem);padding:.25rem .5rem 0;border-radius:1rem;background-color:var(--tui-base-01);margin:auto 1rem auto 0;box-shadow:0 0 12px -8px var(--tui-secondary)}.kwikid-sections-container.mobile{position:absolute;top:0;left:0;z-index:5;opacity:1;visibility:visible;transition:all 1s;height:100%;border-radius:0;max-width:unset}.kwikid-forms-container{display:block;width:100%;max-width:min(50%,600px);margin:auto 0;height:calc(100% - 2rem);padding:.25rem .5rem 0;border-radius:1rem;background-color:var(--tui-base-01);box-shadow:0 0 12px -8px var(--tui-primary)}.kwikid-forms-container.mobile{position:absolute;top:0;left:0;z-index:5;opacity:1;visibility:visible;transition:all 1s;height:100%;border-radius:0;max-width:unset}@media screen and (max-width: 600px){.kwikid-layout-container{padding:0;background:transparent}.kwikid-sections-container{position:absolute;max-width:100%;bottom:-10000px;left:-10000px;opacity:0;padding:0;visibility:hidden}.kwikid-sections-container.active{visibility:visible}.kwikid-sections-container.mobile{height:100%;opacity:1;visibility:visible;transition:all 2s;border-radius:0;box-shadow:none;top:0px;margin:0;position:absolute}.kwikid-forms-container{display:none;max-width:100%;height:100%;padding:0;border-radius:0;box-shadow:none}.kwikid-forms-container.mobile{height:100%;opacity:1;visibility:visible;transition:all 2s;border-radius:0;box-shadow:none;top:0px;margin:0;position:absolute}.kwikid-forms-container.active{display:block}}#error-notification{background-color:var(--tui-error-fill);color:#fff!important}#error-notification .t-top{color:#fff!important}#error-notification .t-close{color:#fff!important}.preview-container{display:flex!important;flex-grow:1!important;flex-direction:column!important;align-content:center!important;justify-content:space-between!important;align-items:stretch!important}.preview-container .preview-iframe{width:100vw;height:100vh}.preview-container .preview-unavailable{display:flex;flex-direction:column;align-content:center;justify-content:center;align-items:center;color:#fff;font-size:1.2rem;top:50%;left:50%;width:100%;height:100vh}.preview-container .preview-unavailable>*:not(:last-child){margin-bottom:1rem}.kwikid-form-view-popup-container{border-radius:1rem;background:var(--tui-base-01)}\n", "::-webkit-scrollbar{width:8px}::-webkit-scrollbar-track{border-radius:10px}::-webkit-scrollbar-thumb{background:lightgray;border-radius:10px}::-webkit-scrollbar-thumb:hover{background:gray}\n"], components: [{ type: i2.KwikIDFormsListComponent, selector: "kwikid-forms-list", inputs: ["showFormFields", "userConfig", "stepConfig", "activeFormConfig", "formsList", "formsListCompleted", "isMobileView", "isUnsavedData"], outputs: ["getLogs", "onClickSetActiveForm", "onClickHideFormsList", "onClickSubmitForms"] }, { type: i3.KwikIDFormViewComponent, selector: "kwikid-form-view", inputs: ["allFormsData", "extraData", "apiCallResponse", "buttonClickResponse", "formConfig", "formData", "isMobileView", "popupFormCallback", "userConfig", "stepConfig"], outputs: ["getLogs", "getUnsavedDataState", "onActionShowPopupForm", "onClickApiCall", "onClickViewFile", "onClickFormFieldButton", "onClickGoBack", "onClickSaveForm", "onClickViewForms"] }, { type: i1.KwikUILoaderComponent, selector: "kwikui-loader" }, { type: i4.TuiPushComponent, selector: "tui-push", inputs: ["heading", "type", "lines", "timestamp"], outputs: ["close"] }, { type: i5.TuiSvgComponent, selector: "tui-svg", inputs: ["src"] }, { type: i6.TuiPreviewComponent, selector: "tui-preview", inputs: ["zoomable", "rotatable"] }, { type: i6.TuiPreviewTitleComponent, selector: "tui-preview-title" }, { type: i5.TuiButtonComponent, selector: "button[tuiButton], button[tuiIconButton], a[tuiButton], a[tuiIconButton]", inputs: ["appearance", "disabled", "icon", "iconRight", "shape", "showLoader", "size"] }], directives: [{ type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.TuiPushAlertDirective, selector: "[tuiPush]", inputs: ["tuiPush"] }, { type: i4.TuiPushDirective, selector: "tui-push" }, { type: i6.TuiPreviewActionDirective, selector: "[tuiPreviewAction]" }], animations: [
872
+ /** @nocollapse */ KwikIDFormsRendererComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: KwikIDFormsRendererComponent, selector: "kwikid-forms-renderer", inputs: { stepConfig: "stepConfig", userConfig: "userConfig", formsData: "formsData", extraData: "extraData", activeFormData: "activeFormData", reduxData: "reduxData", apiCallResponse: "apiCallResponse", buttonClickResponse: "buttonClickResponse" }, outputs: { onClickSubmit: "onClickSubmit", getFormData: "getFormData", onClickApiCall: "onClickApiCall", onClickViewFile: "onClickViewFile", getLogs: "getLogs", onClickFormFieldButton: "onClickFormFieldButton" }, host: { listeners: { "window:resize": "windowResizeWatcher($event)" } }, viewQueries: [{ propertyName: "preview", first: true, predicate: ["preview"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div ngClass=\"kwikid-renderer\">\n <div\n ngClass=\"kwikid-layout-container\"\n *ngIf=\"!loading\"\n >\n <div\n ngClass=\"kwikid-sections-container\"\n *ngIf=\"showFormSections\"\n class=\"active\"\n [class.active]=\"showFormSections\"\n [class.mobile]=\"isMobileView\"\n >\n <kwikid-forms-list\n [showFormFields]=\"this.showFormFields\"\n [activeFormConfig]=\"this.activeFormConfig\"\n [userConfig]=\"this.userConfig\"\n [reduxData]=\"this.reduxData\"\n [formsList]=\"this.formsList\"\n [stepConfig]=\"this.stepConfig\"\n [isUnsavedData]=\"this.isUnsavedData\"\n [formsListCompleted]=\"this.formsListCompleted\"\n [isMobileView]=\"this.isMobileView\"\n (getLogs)=\"handleGetLogs($event)\"\n (onClickSetActiveForm)=\"\n this.handleOnClickSetActiveForm($event, 'BUTTON_CLICK')\n \"\n (onClickSubmitForms)=\"this.handleOnClickSubmitForms($event)\"\n ></kwikid-forms-list>\n </div>\n <div\n ngClass=\"kwikid-forms-container\"\n *ngIf=\"\n this.showForm &&\n this.showFormFields &&\n this.activeFormConfig !== undefined\n \"\n [class.active]=\"showFormFields\"\n [class.mobile]=\"isMobileView\"\n [@panelInOut]\n >\n <kwikid-form-view\n *ngIf=\"this.activeFormConfig.type === 'FORM'\"\n [formConfig]=\"this.activeFormConfig\"\n [allFormsData]=\"this.allFormsData\"\n [extraData]=\"extraData\"\n [reduxData]=\"this.reduxData\"\n [isMobileView]=\"this.isMobileView\"\n [userConfig]=\"this.userConfig\"\n [stepConfig]=\"this.stepConfig\"\n [popupFormCallback]=\"this.popupFormCallback\"\n [apiCallResponse]=\"this.apiCallResponse\"\n [buttonClickResponse]=\"this.buttonClickResponse\"\n (onClickFormFieldButton)=\"handleOnClickFormFieldButton($event)\"\n (getUnsavedDataState)=\"handleGetUnsavedState($event)\"\n (onClickApiCall)=\"handleOnClickApiCall($event)\"\n (onClickViewFile)=\"handleOnClickViewFile($event)\"\n (onActionShowPopupForm)=\"\n this.handleOnActionShowPopupForm($event, content)\n \"\n (onClickGoBack)=\"this.handleOnClickGoBack($event)\"\n (onClickViewForms)=\"this.handleOnClickViewForms($event)\"\n (getLogs)=\"handleGetLogs($event)\"\n (onClickSaveForm)=\"\n this.handleOnClickSaveForm($event, 'FORM', undefined)\n \"\n ></kwikid-form-view>\n </div>\n </div>\n</div>\n\n<kwikui-loader></kwikui-loader>\n\n<tui-push\n id=\"error-notification\"\n *tuiPush=\"showErrorNotification\"\n heading=\"Please complete the required Forms!\"\n type=\"Error\"\n (close)=\"toggleErrorNotification(false)\"\n>\n <tui-svg\n src=\"tuiIconXCircle\"\n style=\"color: #fff !important\"\n >\n </tui-svg>\n</tui-push>\n<ng-template\n #preview\n let-preview\n>\n <tui-preview\n [rotatable]=\"false\"\n [zoomable]=\"false\"\n class=\"preview-container\"\n *ngIf=\"popupFormConfig\"\n >\n <tui-preview-title *ngIf=\"previewProperties.title !== ''\">{{\n previewProperties.title\n }}</tui-preview-title>\n\n <div class=\"kwikid-form-view-popup-container\">\n <kwikid-form-view\n [formData]=\"activePopupFormData\"\n [formConfig]=\"popupFormConfig\"\n [allFormsData]=\"allFormsData\"\n [extraData]=\"extraData\"\n [reduxData]=\"this.reduxData\"\n [userConfig]=\"this.userConfig\"\n [stepConfig]=\"this.stepConfig\"\n [isMobileView]=\"this.isMobileView\"\n [apiCallResponse]=\"this.apiCallResponse\"\n [buttonClickResponse]=\"this.buttonClickResponse\"\n (onClickFormFieldButton)=\"handleOnClickFormFieldButton($event)\"\n (getSavedState)=\"handleGetUnsavedState($event)\"\n (onClickApiCall)=\"handleOnClickApiCall($event)\"\n (getLogs)=\"handleGetLogs($event)\"\n (onClickSaveForm)=\"\n this.handleOnClickSaveForm($event, 'POPUP_FORM', undefined)\n \"\n ></kwikid-form-view>\n </div>\n\n <button\n tuiIconButton\n tuiPreviewAction\n icon=\"tuiIconCloseLarge\"\n title=\"Close\"\n type=\"button\"\n (click)=\"preview.complete()\"\n ></button>\n </tui-preview>\n</ng-template>\n<ng-template\n #content\n let-context\n>\n <div class=\"kwikid-form-view-popup-container\">\n <kwikid-form-view\n [formData]=\"activePopupFormData\"\n [formConfig]=\"popupFormConfig\"\n [extraData]=\"extraData\"\n [allFormsData]=\"allFormsData\"\n [reduxData]=\"this.reduxData\"\n [userConfig]=\"this.userConfig\"\n [stepConfig]=\"this.stepConfig\"\n [isMobileView]=\"this.isMobileView\"\n [apiCallResponse]=\"this.apiCallResponse\"\n [buttonClickResponse]=\"this.buttonClickResponse\"\n (onClickFormFieldButton)=\"handleOnClickFormFieldButton($event)\"\n (getSavedState)=\"handleGetUnsavedState($event)\"\n (onClickApiCall)=\"handleOnClickApiCall($event)\"\n (getLogs)=\"handleGetLogs($event)\"\n (onClickSaveForm)=\"\n this.handleOnClickSaveForm($event, 'POPUP_FORM', context)\n \"\n ></kwikid-form-view>\n </div>\n</ng-template>\n", styles: [":host{position:relative;height:100%}.kwikid-root{width:100%;height:100%}.kwikid-renderer{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;align-content:center;width:100%;height:100%}.kwikid-layout-container{display:flex;flex-direction:row;padding:0 1rem;height:100%;justify-content:center;align-items:stretch;background:var(--tui-secondary-active);position:relative}.kwikid-sections-container{display:block;width:100%;max-width:400px;height:calc(100% - 2rem);padding:.25rem .5rem 0;border-radius:1rem;background-color:var(--tui-base-01);margin:auto 1rem auto 0;box-shadow:0 0 12px -8px var(--tui-secondary)}.kwikid-sections-container.mobile{position:absolute;top:0;left:0;z-index:5;opacity:1;visibility:visible;transition:all 1s;height:100%;border-radius:0;max-width:unset}.kwikid-forms-container{display:block;width:100%;max-width:min(50%,600px);margin:auto 0;height:calc(100% - 2rem);padding:.25rem .5rem 0;border-radius:1rem;background-color:var(--tui-base-01);box-shadow:0 0 12px -8px var(--tui-primary)}.kwikid-forms-container.mobile{position:absolute;top:0;left:0;z-index:5;opacity:1;visibility:visible;transition:all 1s;height:100%;border-radius:0;max-width:unset}@media screen and (max-width: 600px){.kwikid-layout-container{padding:0;background:transparent}.kwikid-sections-container{position:absolute;max-width:100%;bottom:-10000px;left:-10000px;opacity:0;padding:0;visibility:hidden}.kwikid-sections-container.active{visibility:visible}.kwikid-sections-container.mobile{height:100%;opacity:1;visibility:visible;transition:all 2s;border-radius:0;box-shadow:none;top:0px;margin:0;position:absolute}.kwikid-forms-container{display:none;max-width:100%;height:100%;padding:0;border-radius:0;box-shadow:none}.kwikid-forms-container.mobile{height:100%;opacity:1;visibility:visible;transition:all 2s;border-radius:0;box-shadow:none;top:0px;margin:0;position:absolute}.kwikid-forms-container.active{display:block}}#error-notification{background-color:var(--tui-error-fill);color:#fff!important}#error-notification .t-top{color:#fff!important}#error-notification .t-close{color:#fff!important}.preview-container{display:flex!important;flex-grow:1!important;flex-direction:column!important;align-content:center!important;justify-content:space-between!important;align-items:stretch!important}.preview-container .preview-iframe{width:100vw;height:100vh}.preview-container .preview-unavailable{display:flex;flex-direction:column;align-content:center;justify-content:center;align-items:center;color:#fff;font-size:1.2rem;top:50%;left:50%;width:100%;height:100vh}.preview-container .preview-unavailable>*:not(:last-child){margin-bottom:1rem}.kwikid-form-view-popup-container{border-radius:1rem;background:var(--tui-base-01)}\n", "::-webkit-scrollbar{width:8px}::-webkit-scrollbar-track{border-radius:10px}::-webkit-scrollbar-thumb{background:lightgray;border-radius:10px}::-webkit-scrollbar-thumb:hover{background:gray}\n"], components: [{ type: i2.KwikIDFormsListComponent, selector: "kwikid-forms-list", inputs: ["showFormFields", "userConfig", "stepConfig", "activeFormConfig", "formsList", "reduxData", "formsListCompleted", "isMobileView", "isUnsavedData"], outputs: ["getLogs", "onClickSetActiveForm", "onClickHideFormsList", "onClickSubmitForms"] }, { type: i3.KwikIDFormViewComponent, selector: "kwikid-form-view", inputs: ["allFormsData", "extraData", "apiCallResponse", "buttonClickResponse", "formConfig", "formData", "isMobileView", "popupFormCallback", "userConfig", "stepConfig", "reduxData"], outputs: ["getLogs", "getUnsavedDataState", "onActionShowPopupForm", "onClickApiCall", "onClickViewFile", "onClickFormFieldButton", "onClickGoBack", "onClickSaveForm", "onClickViewForms"] }, { type: i1.KwikUILoaderComponent, selector: "kwikui-loader" }, { type: i4.TuiPushComponent, selector: "tui-push", inputs: ["heading", "type", "lines", "timestamp"], outputs: ["close"] }, { type: i5.TuiSvgComponent, selector: "tui-svg", inputs: ["src"] }, { type: i6.TuiPreviewComponent, selector: "tui-preview", inputs: ["zoomable", "rotatable"] }, { type: i6.TuiPreviewTitleComponent, selector: "tui-preview-title" }, { type: i5.TuiButtonComponent, selector: "button[tuiButton], button[tuiIconButton], a[tuiButton], a[tuiIconButton]", inputs: ["appearance", "disabled", "icon", "iconRight", "shape", "showLoader", "size"] }], directives: [{ type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.TuiPushAlertDirective, selector: "[tuiPush]", inputs: ["tuiPush"] }, { type: i4.TuiPushDirective, selector: "tui-push" }, { type: i6.TuiPreviewActionDirective, selector: "[tuiPreviewAction]" }], animations: [
864
873
  trigger("panelInOut", [
865
874
  transition(":enter", [
866
875
  style({ transform: "translateY(100%)" }),
@@ -983,6 +992,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
983
992
  type: Input
984
993
  }], activeFormData: [{
985
994
  type: Input
995
+ }], reduxData: [{
996
+ type: Input
986
997
  }], apiCallResponse: [{
987
998
  type: Input
988
999
  }], buttonClickResponse: [{
@@ -1000,4 +1011,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
1000
1011
  }], onClickFormFieldButton: [{
1001
1012
  type: Output
1002
1013
  }], triggerLogs: [], toggleLoader: [], fetchFormConfig: [], convertFormListConfig: [], assignSequenceNoToForm: [], findCompletedFormsList: [], markFormInFormsListAsCompleted: [], markFormInFormsListAsDisabled: [], filterAllFormsData: [], checkIfFormsStatusCompleted: [], findActiveFormConfig: [], updateFormsList: [], showPreview: [], formHide: [], formShow: [], findFormsListLength: [], handleOnClickSetActiveForm: [], handleGetUnsavedState: [], handleOnClickFormFieldButton: [], handleOnActionShowPopupForm: [], handleOnClickSaveForm: [], handleOnClickGoBack: [], handleOnClickSubmitForms: [], handleGetLogs: [] } });
1003
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWZvcm1zL3NyYy9saWIvcmVuZGVyZXIvcmVuZGVyZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWZvcm1zL3NyYy9saWIvcmVuZGVyZXIvcmVuZGVyZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG1DQUFtQztBQUNuQyxzREFBc0Q7QUFDdEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFFLE9BQU8sRUFFTCxTQUFTLEVBRVQsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFHTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbEUsT0FBTyxFQUFvQixnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULElBQUksRUFDSixNQUFNLEVBQ04sb0JBQW9CLEVBQ3BCLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osZUFBZSxFQUNmLFNBQVMsRUFDVCxZQUFZLEVBQ1osb0JBQW9CLEVBQ3JCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUNsRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUMzRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUs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QUFVO3NCQURULEtBQUs7Z0JBSU4sVUFBVTtzQkFEVCxLQUFLO2dCQUlOLFNBQVM7c0JBRFIsS0FBSztnQkFJTixTQUFTO3NCQURSLEtBQUs7Z0JBSU4sY0FBYztzQkFEYixLQUFLO2dCQUlOLGVBQWU7c0JBRGQsS0FBSztnQkFJTixtQkFBbUI7c0JBRGxCLEtBQUs7Z0JBSU4sYUFBYTtzQkFEWixNQUFNO2dCQUlQLFdBQVc7c0JBRFYsTUFBTTtnQkFJUCxjQUFjO3NCQURiLE1BQU07Z0JBSVAsZUFBZTtzQkFEZCxNQUFNO2dCQUlQLE9BQU87c0JBRE4sTUFBTTtnQkFJUCxzQkFBc0I7c0JBRHJCLE1BQU07Z0JBcUhQLFdBQVcsTUFLWCxZQUFZLE1BWU4sZUFBZSxNQThDckIscUJBQXFCLE1BNEZyQixzQkFBc0IsTUFpQnRCLHNCQUFzQixNQWlCdEIsOEJBQThCLE1Bd0M5Qiw2QkFBNkIsTUFpQzdCLGtCQUFrQixNQXNCbEIsMkJBQTJCLE1BcUIzQixvQkFBb0IsTUFhZCxlQUFlLE1BNEVyQixXQUFXLE1BZ0NYLFFBQVEsTUFPUixRQUFRLE1BZ0RSLG1CQUFtQixNQXdCYiwwQkFBMEIsTUEySGhDLHFCQUFxQixNQWFyQiw0QkFBNEIsTUFLNUIsMkJBQTJCLE1BMEYzQixxQkFBcUIsTUFvRHJCLG1CQUFtQixNQTREYix3QkFBd0IsTUFtQzlCLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG5pbXBvcnQgeyBhbmltYXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gXCJAYW5ndWxhci9hbmltYXRpb25zXCI7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgVHVpUHJldmlld0RpYWxvZ1NlcnZpY2UgfSBmcm9tIFwiQHRhaWdhLXVpL2FkZG9uLXByZXZpZXdcIjtcbmltcG9ydCB7IFR1aURpYWxvZ0NvbnRleHQsIFR1aURpYWxvZ1NlcnZpY2UgfSBmcm9tIFwiQHRhaWdhLXVpL2NvcmVcIjtcbmltcG9ydCB7XG4gIEFjdGlvbixcbiAgQ29uZGl0aW9uLFxuICBSdWxlLFxuICBTb3VyY2UsXG4gIGNoZWNrT2JqZWN0S2V5RXhpc3RzLFxuICBnZXRPYmplY3REZWVwQ29weSxcbiAgaXNFbXB0eVZhbHVlLFxuICBpc05vdEVtcHR5VmFsdWUsXG4gIGxvZ01ldGhvZCxcbiAgbWVyZ2VPYmplY3RzLFxuICBzZXRWYWx1ZVRvT2JqZWN0UGF0aFxufSBmcm9tIFwia3dpa2lkLXRvb2xraXRcIjtcbmltcG9ydCB7IEt3aWtVSUxvYWRlclNlcnZpY2UgfSBmcm9tIFwia3dpa3VpXCI7XG5pbXBvcnQgeyBDb252ZXJ0ZXIgfSBmcm9tIFwiLi9jb25maWctY29udmVydGVyL2NvbmZpZy1jb252ZXJ0ZXJcIjtcbmltcG9ydCB7IEVBY3Rpb25LZXkgfSBmcm9tIFwiLi9mb3JtLXZpZXcvZGVmaW5pdGlvbnMvZm9ybS12aWV3LmFjdGlvbnMuZGVmaW5pdGlvblwiO1xuaW1wb3J0IHsgRUZvcm1WaWV3R29CYWNrTW9kZSB9IGZyb20gXCIuL2Zvcm0tdmlldy9kZWZpbml0aW9ucy9mb3JtLXZpZXcuY29tbW9ucy5kZWZpbml0aW9uXCI7XG5pbXBvcnQgeyBFRm9ybXNMaXN0U3RhdHVzIH0gZnJvbSBcIi4vZm9ybXMtbGlzdC9mb3Jtcy1saXN0LmRlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBFUmVuZGVyZXJBY3Rpb25LZXkgfSBmcm9tIFwiLi9yZW5kZXJlci5hY3Rpb25zLmRlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBFRm9ybVR5cGUsIEVMb2dFdmVudFR5cGUgfSBmcm9tIFwiLi9yZW5kZXJlci5kZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgZm9ybWF0RXZlbnRMb2dzLCBnZXRGb3JtQ29uZmlnQnlLZXkgfSBmcm9tIFwiLi9yZW5kZXJlci5oZWxwZXJcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImt3aWtpZC1mb3Jtcy1yZW5kZXJlclwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL3JlbmRlcmVyLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9yZW5kZXJlci5jb21wb25lbnQuc2Nzc1wiLCBcIi4vc2hhcmVkLnNjc3NcIl0sXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKFwicGFuZWxJbk91dFwiLCBbXG4gICAgICB0cmFuc2l0aW9uKFwiOmVudGVyXCIsIFtcbiAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06IFwidHJhbnNsYXRlWSgxMDAlKVwiIH0pLFxuICAgICAgICBhbmltYXRlKDE1MClcbiAgICAgIF0pLFxuICAgICAgdHJhbnNpdGlvbihcIjpsZWF2ZVwiLCBbXG4gICAgICAgIGFuaW1hdGUoMTAwLCBzdHlsZSh7IHRyYW5zZm9ybTogXCJ0cmFuc2xhdGVZKDEwMCUpXCIgfSkpXG4gICAgICBdKVxuICAgIF0pXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgS3dpa0lERm9ybXNSZW5kZXJlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgLy8gVGhlIGZpbmFsIHZhbHVlIHNob3VsZCBiZSBwcm92aWRlZCB0byBzZXJ2aWNlLCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGluIGFsbCBjb21wb25lbnRzXG4gIEBIb3N0TGlzdGVuZXIoXCJ3aW5kb3c6cmVzaXplXCIsIFtcIiRldmVudFwiXSlcbiAgd2luZG93UmVzaXplV2F0Y2hlcigpIHtcbiAgICBpZiAodGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIDwgNjAwKSB7XG4gICAgICBpZiAodGhpcy5zaG93Rm9ybSkge1xuICAgICAgICB0aGlzLnNob3dGb3JtU2VjdGlvbnMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaG93Rm9ybUZpZWxkcyA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNob3dGb3JtU2VjdGlvbnMgPSB0cnVlO1xuICAgICAgICB0aGlzLnNob3dGb3JtRmllbGRzID0gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLmlzTW9iaWxlVmlldyA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnNob3dGb3JtKSB7XG4gICAgICAgIHRoaXMuc2hvd0Zvcm1TZWN0aW9ucyA9IHRydWU7XG4gICAgICAgIHRoaXMuc2hvd0Zvcm1GaWVsZHMgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93Rm9ybVNlY3Rpb25zID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zaG93Rm9ybUZpZWxkcyA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhpcy5pc01vYmlsZVZpZXcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAVmlld0NoaWxkKFwicHJldmlld1wiKVxuICByZWFkb25seSBwcmV2aWV3OiBUZW1wbGF0ZVJlZjxUdWlEaWFsb2dDb250ZXh0PHZvaWQ+PjtcblxuICBwcml2YXRlIHByZXZpZXdEaWFsb2dSZWY6IGFueTtcblxuICBASW5wdXQoKVxuICBzdGVwQ29uZmlnOiBhbnk7XG5cbiAgQElucHV0KClcbiAgdXNlckNvbmZpZzogYW55O1xuXG4gIEBJbnB1dCgpXG4gIGZvcm1zRGF0YTogYW55ID0ge307XG5cbiAgQElucHV0KClcbiAgZXh0cmFEYXRhOiBhbnkgPSB7fTtcblxuICBASW5wdXQoKVxuICBhY3RpdmVGb3JtRGF0YTogYW55ID0ge307XG5cbiAgQElucHV0KClcbiAgYXBpQ2FsbFJlc3BvbnNlOiBhbnkgPSB7fTtcblxuICBASW5wdXQoKVxuICBidXR0b25DbGlja1Jlc3BvbnNlOiBhbnkgPSB7fTtcblxuICBAT3V0cHV0KClcbiAgb25DbGlja1N1Ym1pdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAT3V0cHV0KClcbiAgZ2V0Rm9ybURhdGE6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQE91dHB1dCgpXG4gIG9uQ2xpY2tBcGlDYWxsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBPdXRwdXQoKVxuICBvbkNsaWNrVmlld0ZpbGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGdldExvZ3M6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQE91dHB1dCgpXG4gIG9uQ2xpY2tGb3JtRmllbGRCdXR0b246IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgbG9hZGluZyA9IGZhbHNlO1xuXG4gIHNob3dFcnJvck5vdGlmaWNhdGlvbiA9IGZhbHNlO1xuXG4gIHRvZ2dsZUVycm9yTm90aWZpY2F0aW9uKHNob3cpIHtcbiAgICB0aGlzLnNob3dFcnJvck5vdGlmaWNhdGlvbiA9IHNob3c7XG4gIH1cblxuICBhY3RpdmVQb3B1cEZvcm1EYXRhOiBhbnkgPSB7fTtcblxuICBwb3B1cEZvcm1DYWxsYmFjazogYW55ID0ge307XG5cbiAgYWN0aXZlRm9ybUNvbmZpZzogYW55O1xuXG4gIGFjdGl2ZUZvcm1GaWVsZHM6IGFueVtdO1xuXG4gIGFsbEZvcm1zRGF0YTogYW55ID0ge307XG5cbiAgYWxsRm9ybXNTdWJtaXR0ZWQgPSBmYWxzZTtcblxuICBmb3Jtc0xpc3Q6IGFueVtdID0gW107XG5cbiAgZm9ybXNMaXN0Q29tcGxldGVkOiBzdHJpbmdbXTtcblxuICBpc01vYmlsZVZpZXcgPSBmYWxzZTtcblxuICBwcmV2aWV3UHJvcGVydGllczogYW55ID0ge1xuICAgIGh0bWw6IHtcbiAgICAgIGJlZm9yZTogXCJcIixcbiAgICAgIGFmdGVyOiBcIlwiXG4gICAgfSxcbiAgICBpZnJhbWU6IHtcbiAgICAgIHNyYzogXCJcIixcbiAgICAgIHRpdGxlOiBcIlwiXG4gICAgfSxcbiAgICBwb3B1cEZvcm1LZXk6IFwiXCIsXG4gICAgdGl0bGU6IFwiXCIsXG4gICAgdW5hdmFpbGFibGU6IGZhbHNlXG4gIH07XG5cbiAgcG9wdXBGb3JtQ29uZmlnOiBhbnkgPSB7fTtcblxuICAvLyBkaXNwbGF5IGZvcm1zIGFuZCBsaXN0IGNvbmRpdGlvbmFsbHlcbiAgc2hvd0Zvcm0gPSBmYWxzZTtcblxuICBzaG93Rm9ybUZpZWxkcyA9IHRydWU7XG5cbiAgc2hvd0Zvcm1TZWN0aW9ucyA9IHRydWU7XG5cbiAgaXNVbnNhdmVkRGF0YSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaG9zdEVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBJbmplY3QoVHVpUHJldmlld0RpYWxvZ1NlcnZpY2UpXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcmV2aWV3RGlhbG9nU2VydmljZTogVHVpUHJldmlld0RpYWxvZ1NlcnZpY2UsXG4gICAgcHVibGljIGxvYWRlclNlcnZpY2U6IEt3aWtVSUxvYWRlclNlcnZpY2UsXG4gICAgQEluamVjdChUdWlEaWFsb2dTZXJ2aWNlKSBwcml2YXRlIHJlYWRvbmx5IGRpYWxvZ3M6IFR1aURpYWxvZ1NlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMudG9nZ2xlTG9hZGVyKHRydWUpO1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICBjb25zdCBmb3JtU3RlcEtleSA9IHRoaXMuc3RlcENvbmZpZz8uZm9ybT8ua2V5ID8/IHVuZGVmaW5lZDtcblxuICAgIGlmIChcbiAgICAgIGZvcm1TdGVwS2V5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKHRoaXMudXNlckNvbmZpZy51c2VyRm9ybUZpZWxkcywgZm9ybVN0ZXBLZXkpXG4gICAgKSB7XG4gICAgICB0aGlzLmZvcm1zTGlzdCA9IHRoaXMudXNlckNvbmZpZy51c2VyRm9ybUZpZWxkc1tmb3JtU3RlcEtleV07XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRoaXMudXNlckNvbmZpZy51c2VyRm9ybUZpZWxkcykpIHtcbiAgICAgIHRoaXMuZm9ybXNMaXN0ID0gdGhpcy51c2VyQ29uZmlnLnVzZXJGb3JtRmllbGRzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB1c2VyRm9ybUZpZWxkcyBkb2Vzbid0IGhhdmUgYSBmb3JtIGRlZmluZWQgd2l0aCBrZXk6ICR7Zm9ybVN0ZXBLZXl9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmluaXRpYWxpemVGb3JtcyhcIk9OX0lOSVRcIik7XG4gICAgdGhpcy50b2dnbGVMb2FkZXIoZmFsc2UpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGNvbnN0IHZlcmlmeUNoYW5nZSA9IChwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgIHJldHVybiBjaGVja09iamVjdEtleUV4aXN0cyhjaGFuZ2VzLCBwcm9wKSAmJiAhY2hhbmdlc1twcm9wXS5maXJzdENoYW5nZTtcbiAgICB9O1xuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJ1c2VyQ29uZmlnXCIpKSB7XG4gICAgICB0aGlzLnVzZXJDb25maWcgPSBjaGFuZ2VzLnVzZXJDb25maWcuY3VycmVudFZhbHVlO1xuICAgICAgdGhpcy50b2dnbGVMb2FkZXIoZmFsc2UpO1xuICAgIH1cbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwic3RlcENvbmZpZ1wiKSkge1xuICAgICAgdGhpcy5zdGVwQ29uZmlnID0gY2hhbmdlcy5zdGVwQ29uZmlnLmN1cnJlbnRWYWx1ZTtcbiAgICAgIHRoaXMudG9nZ2xlTG9hZGVyKGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImZvcm1zRGF0YVwiKSkge1xuICAgICAgdGhpcy5mb3Jtc0RhdGEgPSBjaGFuZ2VzLmZvcm1zRGF0YS5jdXJyZW50VmFsdWU7XG5cbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUZvcm1zKFwiT05fQ0hBTkdFXCIpO1xuICAgIH1cbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwiZXh0cmFEYXRhXCIpKSB7XG4gICAgICB0aGlzLmV4dHJhRGF0YSA9IGNoYW5nZXMuZXh0cmFEYXRhLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImFwaUNhbGxSZXNwb25zZVwiKSkge1xuICAgICAgdGhpcy5hcGlDYWxsUmVzcG9uc2UgPSBjaGFuZ2VzLmFwaUNhbGxSZXNwb25zZS5jdXJyZW50VmFsdWU7XG4gICAgICB0aGlzLnRvZ2dsZUxvYWRlcihmYWxzZSk7XG4gICAgfVxuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJidXR0b25DbGlja1Jlc3BvbnNlXCIpKSB7XG4gICAgICB0aGlzLmJ1dHRvbkNsaWNrUmVzcG9uc2UgPSBjaGFuZ2VzLmJ1dHRvbkNsaWNrUmVzcG9uc2UuY3VycmVudFZhbHVlO1xuICAgICAgdGhpcy50b2dnbGVMb2FkZXIoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgdHJpZ2dlckxvZ3MoZXZlbnRUeXBlOiBFTG9nRXZlbnRUeXBlLCBsb2dzOiBhbnkpIHtcbiAgICB0aGlzLmdldExvZ3MuZW1pdChmb3JtYXRFdmVudExvZ3MoZXZlbnRUeXBlLCB0aGlzLnN0ZXBDb25maWcsIGxvZ3MpKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgdG9nZ2xlTG9hZGVyKGxvYWRlcikge1xuICAgIGlmIChsb2FkZXIpIHtcbiAgICAgIHRoaXMubG9hZGVyU2VydmljZS5zaG93KHtcbiAgICAgICAgZnVsbHNjcmVlbjogdHJ1ZSxcbiAgICAgICAgbG9hZGVyVGV4dDogXCJQbGVhc2Ugd2FpdFwiXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2FkZXJTZXJ2aWNlLmhpZGUoKTtcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIGZldGNoRm9ybUNvbmZpZyh1cmw6IHN0cmluZykge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7IG1ldGhvZDogXCJHRVRcIiB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgYXN5bmMgaW5pdGlhbGl6ZUZvcm1zKGV2ZW50VHlwZTogc3RyaW5nKSB7XG4gICAgdGhpcy50b2dnbGVMb2FkZXIodHJ1ZSk7XG5cbiAgICB0aGlzLmFsbEZvcm1zRGF0YSA9IHRoaXMuZm9ybXNEYXRhO1xuXG4gICAgYXdhaXQgdGhpcy51cGRhdGVGb3Jtc0xpc3QoKTtcblxuICAgIGlmIChcbiAgICAgIGV2ZW50VHlwZSA9PT0gXCJPTl9DSEFOR0VcIiAmJlxuICAgICAgdGhpcy5maW5kRm9ybXNMaXN0TGVuZ3RoKHRoaXMuZm9ybXNMaXN0KSA9PT0gMVxuICAgICkge1xuICAgICAgdGhpcy5oYW5kbGVPbkNsaWNrU3VibWl0Rm9ybXMobnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGFuZGxlUmVzaXplKHRoaXMuZm9ybXNMaXN0KTtcblxuICAgICAgaWYgKGlzTm90RW1wdHlWYWx1ZSh0aGlzLmFjdGl2ZUZvcm1Db25maWcpKSB7XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyh0aGlzLmFjdGl2ZUZvcm1Db25maWcsIFwidHlwZVwiKSkge1xuICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZUZvcm1Db25maWcudHlwZSAhPT0gRUZvcm1UeXBlLkhUTUwpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlT25DbGlja1NldEFjdGl2ZUZvcm0oXG4gICAgICAgICAgICAgIHRoaXMuYWN0aXZlRm9ybUNvbmZpZy5rZXksXG4gICAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVPbkNsaWNrU2V0QWN0aXZlRm9ybShcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRm9ybUNvbmZpZy5rZXksXG4gICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNob3dGb3JtID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2hvd0Zvcm1GaWVsZHMgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnRvZ2dsZUxvYWRlcihmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBjb252ZXJ0Rm9ybUxpc3RDb25maWcoZm9ybXNMaXN0OiBhbnlbXSk6IGFueVtdIHtcbiAgICBjb25zdCBjb252ZXJ0Rm9ybUxpc3RDb25maWdUeXBlRm9ybSA9IChmb3JtOiBhbnkpID0+IHtcbiAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmb3JtLCBcImZvcm1Db250ZW50XCIpKSB7XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmb3JtLmZvcm1Db250ZW50LCBcInVybFwiKSkge1xuICAgICAgICAgIGZvcm0gPSBzZXRWYWx1ZVRvT2JqZWN0UGF0aChmb3JtLCBcInByb3BzLnVybFwiLCBmb3JtLmZvcm1Db250ZW50LnVybCk7XG4gICAgICAgICAgZGVsZXRlIGZvcm0uZm9ybUNvbnRlbnQudXJsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmb3JtLmZvcm1Db250ZW50LCBcInBhdGhcIikpIHtcbiAgICAgICAgICBmb3JtID0gc2V0VmFsdWVUb09iamVjdFBhdGgoXG4gICAgICAgICAgICBmb3JtLFxuICAgICAgICAgICAgXCJwcm9wcy5wYXRoXCIsXG4gICAgICAgICAgICBmb3JtLmZvcm1Db250ZW50LnBhdGhcbiAgICAgICAgICApO1xuICAgICAgICAgIGRlbGV0ZSBmb3JtLmZvcm1Db250ZW50LnBhdGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc0VtcHR5VmFsdWUoZm9ybS5mb3JtQ29udGVudCkpIHtcbiAgICAgICAgZGVsZXRlIGZvcm0uZm9ybUNvbnRlbnQ7XG4gICAgICB9XG4gICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZm9ybSwgXCJ0aXRsZVwiKSkge1xuICAgICAgICBmb3JtID0gc2V0VmFsdWVUb09iamVjdFBhdGgoZm9ybSwgXCJwcm9wcy50aXRsZVwiLCBmb3JtLnRpdGxlKTtcbiAgICAgICAgZGVsZXRlIGZvcm0udGl0bGU7XG4gICAgICB9XG4gICAgICBpZiAoIWNoZWNrT2JqZWN0S2V5RXhpc3RzKGZvcm0sIFwiaGlkZGVuXCIpKSB7XG4gICAgICAgIGZvcm0uaGlkZGVuID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIWNoZWNrT2JqZWN0S2V5RXhpc3RzKGZvcm0sIFwiZGlzYWJsZWRcIikpIHtcbiAgICAgICAgZm9ybS5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCFjaGVja09iamVjdEtleUV4aXN0cyhmb3JtLCBcInJlcXVpcmVkXCIpKSB7XG4gICAgICAgIGZvcm0ucmVxdWlyZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFjaGVja09iamVjdEtleUV4aXN0cyhmb3JtLCBcImRlcGVuZGVudE9uXCIpKSB7XG4gICAgICAgIGZvcm0uZGVwZW5kZW50T24gPSBbXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZvcm07XG4gICAgfTtcblxuICAgIGNvbnN0IGNvbnZlcnRGb3JtTGlzdENvbmZpZ1R5cGVIdG1sID0gKGZvcm06IGFueSkgPT4ge1xuICAgICAgaWYgKGZvcm0udHlwZSA9PT0gXCJodG1sXCIpIHtcbiAgICAgICAgZm9ybS50eXBlID0gRUZvcm1UeXBlLkhUTUw7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmb3JtLCBcImh0bWxDb250ZW50XCIpKSB7XG4gICAgICAgIGlmICghY2hlY2tPYmplY3RLZXlFeGlzdHMoZm9ybSwgXCJwcm9wc1wiKSkge1xuICAgICAgICAgIGZvcm0ucHJvcHMgPSB7XG4gICAgICAgICAgICBodG1sQ29udGVudDogZm9ybS5odG1sQ29udGVudFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIGZvcm0uaHRtbENvbnRlbnQ7XG4gICAgICB9IGVsc2UgaWYgKCFjaGVja09iamVjdEtleUV4aXN0cyhmb3JtLCBcInByb3BzXCIpKSB7XG4gICAgICAgIGZvcm0ucHJvcHMgPSB7XG4gICAgICAgICAgaHRtbENvbnRlbnQ6IFwiXCJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmb3JtLCBcInRpdGxlXCIpKSB7XG4gICAgICAgIGZvcm0gPSBzZXRWYWx1ZVRvT2JqZWN0UGF0aChmb3JtLCBcInByb3BzLnRpdGxlXCIsIGZvcm0udGl0bGUpO1xuICAgICAgICBkZWxldGUgZm9ybS50aXRsZTtcbiAgICAgIH1cbiAgICAgIGlmICghY2hlY2tPYmplY3RLZXlFeGlzdHMoZm9ybSwgXCJoaWRkZW5cIikpIHtcbiAgICAgICAgZm9ybS5oaWRkZW4gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmb3JtO1xuICAgIH07XG5cbiAgICByZXR1cm4gZm9ybXNMaXN0Lm1hcCgoZm9ybSkgPT4ge1xuICAgICAgaWYgKCFjaGVja09iamVjdEtleUV4aXN0cyhmb3JtLCBcInR5cGVcIikpIHtcbiAgICAgICAgZm9ybS50eXBlID0gXCJGT1JNXCI7XG4gICAgICB9XG4gICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZm9ybSwgXCJ0eXBlXCIpKSB7XG4gICAgICAgIGlmIChmb3JtLnR5cGUgPT09IEVGb3JtVHlwZS5GT1JNKSB7XG4gICAgICAgICAgZm9ybSA9IGNvbnZlcnRGb3JtTGlzdENvbmZpZ1R5cGVGb3JtKGZvcm0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZvcm0udHlwZSA9PT0gRUZvcm1UeXBlLkhUTUwgfHwgZm9ybS50eXBlID09PSBcImh0bWxcIikge1xuICAgICAgICAgIGZvcm0gPSBjb252ZXJ0Rm9ybUxpc3RDb25maWdUeXBlSHRtbChmb3JtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm9ybTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOT1RFOiBUbyBiZSBkZXByZWNhdGVkLlxuICAgKiBXaHkgPyBXaWxsIGJlIGRpcmVjdGx5IGFzc2lnbmVkIHdoaWxlIGV4ZWN1dGluZyAnY2hha3JhJyBmb3IgZGVmYXVsdCBmb3JtIGNvbmZpZy5cbiAgICogQHBhcmFtIGZvcm1zTGlzdCBhbnlbXVxuICAgKiBAcGFyYW0gZm9ybXNMaXN0Q29tcGxldGVkIHN0cmluZ1tdXG4gICAqIEByZXR1cm5zIGFueVtdXG4gICAqL1xuICBAbG9nTWV0aG9kXG4gIGFzc2lnblNlcXVlbmNlTm9Ub0Zvcm0oZm9ybXNMaXN0OiBhbnlbXSk6IGFueVtdIHtcbiAgICBsZXQgc2VxdWVuY2VObyA9IDE7XG4gICAgZm9yIChjb25zdCBmb3JtIG9mIGZvcm1zTGlzdCkge1xuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZvcm0sIFwiaGlkZGVuXCIpKSB7XG4gICAgICAgIGlmICghZm9ybS5oaWRkZW4gJiYgZm9ybS50eXBlICE9PSBFRm9ybVR5cGUuSFRNTCkge1xuICAgICAgICAgIGZvcm0uc2VxdWVuY2VObyA9IHNlcXVlbmNlTm87XG4gICAgICAgICAgc2VxdWVuY2VObyArPSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBmb3JtLnNlcXVlbmNlTm87XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybXNMaXN0O1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBmaW5kQ29tcGxldGVkRm9ybXNMaXN0KGFsbEZvcm1zRGF0YTogYW55KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGZvcm1zTGlzdENvbXBsZXRlZDogc3RyaW5nW10gPSBbXTtcblxuICAgIE9iamVjdC5rZXlzKGFsbEZvcm1zRGF0YSkuZm9yRWFjaCgoZm9ybUtleSkgPT4ge1xuICAgICAgZm9ybXNMaXN0Q29tcGxldGVkLnB1c2goZm9ybUtleSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZm9ybXNMaXN0Q29tcGxldGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIE5PVEU6IFRvIGJlIGRlcHJlY2F0ZWQuIFdoeSA/IFdpbGwgYmUgcmVwbGFjZWQgYnkgJ2NoYWtyYScuXG4gICAqIEBwYXJhbSBmb3Jtc0xpc3QgYW55W11cbiAgICogQHBhcmFtIGZvcm1zTGlzdENvbXBsZXRlZCBzdHJpbmdbXVxuICAgKiBAcmV0dXJucyBhbnlbXVxuICAgKi9cbiAgQGxvZ01ldGhvZFxuICBtYXJrRm9ybUluRm9ybXNMaXN0QXNDb21wbGV0ZWQoXG4gICAgZm9ybXNMaXN0OiBhbnlbXSxcbiAgICBmb3Jtc0xpc3RDb21wbGV0ZWQ6IHN0cmluZ1tdXG4gICk6IGFueVtdIHtcbiAgICBmb3IgKGxldCBmb3JtIG9mIGZvcm1zTGlzdCkge1xuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZvcm0sIFwiaGlkZGVuXCIpKSB7XG4gICAgICAgIGlmICghZm9ybS5oaWRkZW4gJiYgZm9ybS50eXBlICE9PSBFRm9ybVR5cGUuSFRNTCkge1xuICAgICAgICAgIGlmIChmb3Jtc0xpc3RDb21wbGV0ZWQuaW5jbHVkZXMoZm9ybS5rZXkpKSB7XG4gICAgICAgICAgICBmb3JtID0gc2V0VmFsdWVUb09iamVjdFBhdGgoZm9ybSwgXCJzdGF0dXNcIiwgXCJjb21wbGV0ZWRcIik7XG4gICAgICAgICAgICBmb3JtID0gc2V0VmFsdWVUb09iamVjdFBhdGgoZm9ybSwgXCJkaXNhYmxlZFwiLCBmYWxzZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmb3JtLCBcImRlcGVuZGVudE9uXCIpKSB7XG4gICAgICAgICAgICBjb25zdCBpc0RlcGVuZGVudCA9IGZvcm0uZGVwZW5kZW50T24uZXZlcnkoKHI6IHN0cmluZykgPT5cbiAgICAgICAgICAgICAgZm9ybXNMaXN0Q29tcGxldGVkLmluY2x1ZGVzKHIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGlzRGVwZW5kZW50KSB7XG4gICAgICAgICAgICAgIGZvcm0gPSBzZXRWYWx1ZVRvT2JqZWN0UGF0aChmb3JtLCBcInN0YXR1c1wiLCBcImVkaXRhYmxlXCIpO1xuICAgICAgICAgICAgICBmb3JtID0gc2V0VmFsdWVUb09iamVjdFBhdGgoZm9ybSwgXCJkaXNhYmxlZFwiLCBmYWxzZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmb3JtID0gc2V0VmFsdWVUb09iamVjdFBhdGgoZm9ybSwgXCJzdGF0dXNcIiwgXCJsb2NrZWRcIik7XG4gICAgICAgICAgICAgIGZvcm0gPSBzZXRWYWx1ZVRvT2JqZWN0UGF0aChmb3JtLCBcImRpc2FibGVkXCIsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3JtID0gc2V0VmFsdWVUb09iamVjdFBhdGgoZm9ybSwgXCJkZXBlbmRlbnRPblwiLCBbXSk7XG4gICAgICAgICAgICBmb3JtID0gc2V0VmFsdWVUb09iamVjdFBhdGgoZm9ybSwgXCJzdGF0dXNcIiwgXCJlZGl0YWJsZVwiKTtcbiAgICAgICAgICAgIGZvcm0gPSBzZXRWYWx1ZVRvT2JqZWN0UGF0aChmb3JtLCBcImRpc2FibGVkXCIsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybXNMaXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIE5PVEU6IFRvIGJlIGRlcHJlY2F0ZWQuIFdoeSA/IFdpbGwgYmUgcmVwbGFjZWQgYnkgJ2NoYWtyYScuXG4gICAqIEBwYXJhbSBmb3Jtc0xpc3QgYW55W11cbiAgICogQHBhcmFtIGZvcm1zTGlzdENvbXBsZXRlZCBzdHJpbmdbXVxuICAgKiBAcmV0dXJucyBhbnlbXVxuICAgKi9cbiAgQGxvZ01ldGhvZFxuICBtYXJrRm9ybUluRm9ybXNMaXN0QXNEaXNhYmxlZChcbiAgICBmb3Jtc0xpc3Q6IGFueVtdLFxuICAgIGZvcm1zTGlzdENvbXBsZXRlZDogc3RyaW5nW11cbiAgKTogYW55W10ge1xuICAgIGZvciAobGV0IGZvcm0gb2YgZm9ybXNMaXN0KSB7XG4gICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZm9ybSwgXCJoaWRkZW5cIikpIHtcbiAgICAgICAgaWYgKCFmb3JtLmhpZGRlbiAmJiBmb3JtLnR5cGUgIT09IEVGb3JtVHlwZS5IVE1MKSB7XG4gICAgICAgICAgaWYgKGZvcm0uc3RhdHVzICE9PSBcImNvbXBsZXRlZFwiKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZm9ybSwgXCJkZXBlbmRlbnRPblwiKSkge1xuICAgICAgICAgICAgICBjb25zdCBpc0RlcGVuZGVudCA9IGZvcm0uZGVwZW5kZW50T24uZXZlcnkoKHI6IHN0cmluZykgPT5cbiAgICAgICAgICAgICAgICBmb3Jtc0xpc3RDb21wbGV0ZWQuaW5jbHVkZXMocilcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKGlzRGVwZW5kZW50KSB7XG4gICAgICAgICAgICAgICAgZm9ybSA9IHNldFZhbHVlVG9PYmplY3RQYXRoKGZvcm0sIFwic3RhdHVzXCIsIFwiZWRpdGFibGVcIik7XG4gICAgICAgICAgICAgICAgZm9ybSA9IHNldFZhbHVlVG9PYmplY3RQYXRoKGZvcm0sIFwiZGlzYWJsZWRcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvcm0gPSBzZXRWYWx1ZVRvT2JqZWN0UGF0aChmb3JtLCBcInN0YXR1c1wiLCBcImxvY2tlZFwiKTtcbiAgICAgICAgICAgICAgICBmb3JtID0gc2V0VmFsdWVUb09iamVjdFBhdGgoZm9ybSwgXCJkaXNhYmxlZFwiLCB0cnVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZm9ybSA9IHNldFZhbHVlVG9PYmplY3RQYXRoKGZvcm0sIFwiZGVwZW5kZW50T25cIiwgW10pO1xuICAgICAgICAgICAgICBmb3JtID0gc2V0VmFsdWVUb09iamVjdFBhdGgoZm9ybSwgXCJzdGF0dXNcIiwgXCJlZGl0YWJsZVwiKTtcbiAgICAgICAgICAgICAgZm9ybSA9IHNldFZhbHVlVG9PYmplY3RQYXRoKGZvcm0sIFwiZGlzYWJsZWRcIiwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmb3Jtc0xpc3Q7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGZpbHRlckFsbEZvcm1zRGF0YShhbGxGb3Jtc0RhdGE6IGFueSwgZm9ybXNMaXN0OiBhbnlbXSk6IGFueSB7XG4gICAgbGV0IGN1cnJlbnRVc2VyRm9ybUFsbEZvcm1zRGF0YTogYW55ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGZvcm0gb2YgZm9ybXNMaXN0KSB7XG4gICAgICBpZiAoXG4gICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZvcm0sIFwiaGlkZGVuXCIpICYmXG4gICAgICAgICFmb3JtLmhpZGRlbiAmJlxuICAgICAgICBmb3JtLnR5cGUgIT09IEVGb3JtVHlwZS5IVE1MXG4gICAgICApIHtcbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGFsbEZvcm1zRGF0YSwgZm9ybS5rZXkpKSB7XG4gICAgICAgICAgY3VycmVudFVzZXJGb3JtQWxsRm9ybXNEYXRhID0ge1xuICAgICAgICAgICAgLi4uY3VycmVudFVzZXJGb3JtQWxsRm9ybXNEYXRhLFxuICAgICAgICAgICAgW2Zvcm0ua2V5XTogYWxsRm9ybXNEYXRhW2Zvcm0ua2V5XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudFVzZXJGb3JtQWxsRm9ybXNEYXRhO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBjaGVja0lmRm9ybXNTdGF0dXNDb21wbGV0ZWQoXG4gICAgZm9ybXNMaXN0OiBhbnksXG4gICAgZm9ybXNMaXN0Q29tcGxldGVkOiBzdHJpbmdbXVxuICApOiBhbnkge1xuICAgIGxldCBhbGxGb3Jtc0NvbXBsZXRlZCA9IHRydWU7XG5cbiAgICBmb3IgKGNvbnN0IGZvcm0gb2YgZm9ybXNMaXN0KSB7XG4gICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZm9ybSwgXCJoaWRkZW5cIikpIHtcbiAgICAgICAgaWYgKCFmb3JtLmhpZGRlbiAmJiBmb3JtLnR5cGUgIT09IEVGb3JtVHlwZS5IVE1MKSB7XG4gICAgICAgICAgaWYgKGZvcm0uc3RhdHVzICE9PSBcImNvbXBsZXRlZFwiKSB7XG4gICAgICAgICAgICBhbGxGb3Jtc0NvbXBsZXRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbEZvcm1zQ29tcGxldGVkO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBmaW5kQWN0aXZlRm9ybUNvbmZpZyhmb3Jtc0xpc3Q6IGFueVtdKTogYW55IHtcbiAgICByZXR1cm4gZm9ybXNMaXN0LmZpbmQoKGZvcm0pID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZvcm0sIFwiaGlkZGVuXCIpICYmXG4gICAgICAgICFmb3JtLmhpZGRlbiAmJlxuICAgICAgICBmb3JtLnR5cGUgIT09IEVGb3JtVHlwZS5IVE1MICYmXG4gICAgICAgIGZvcm0uc3RhdHVzID09PSBcImVkaXRhYmxlXCIgJiZcbiAgICAgICAgIWZvcm0uZGlzYWJsZWRcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIHVwZGF0ZUZvcm1zTGlzdCgpIHtcbiAgICB0aGlzLmZvcm1zTGlzdCA9IHRoaXMuY29udmVydEZvcm1MaXN0Q29uZmlnKHRoaXMuZm9ybXNMaXN0KTtcblxuICAgIGZvciAoY29uc3QgZm9ybSBvZiB0aGlzLmZvcm1zTGlzdCkge1xuICAgICAgaWYgKFxuICAgICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmb3JtLCBcImRlZmF1bHRcIikgJiZcbiAgICAgICAgaXNOb3RFbXB0eVZhbHVlKGZvcm0uZGVmYXVsdClcbiAgICAgICkge1xuICAgICAgICBjb25zdCB7IHRyaWdnZXJzLCBydWxlcywgYWN0aW9ucyB9ID0gZm9ybS5kZWZhdWx0O1xuXG4gICAgICAgIGNvbnN0IHJ1bGVzTWFwcGluZyA9IG5ldyBSdWxlKHJ1bGVzLCB7XG4gICAgICAgICAgVVNFUl9DT05GSUc6IHRoaXMudXNlckNvbmZpZyxcbiAgICAgICAgICBGT1JNU19MSVNUOiB0aGlzLmZvcm1zTGlzdCxcbiAgICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICAgICAgRVhUUkFfREFUQTogdGhpcy5leHRyYURhdGFcbiAgICAgICAgfSkubWFwcGluZygpO1xuXG4gICAgICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGFjdGlvbnMpIHtcbiAgICAgICAgICBjb25zdCBjb25kaXRpb25FdmFsdWF0aW9uID0gbmV3IENvbmRpdGlvbihcbiAgICAgICAgICAgIGFjdGlvbi5jb25kaXRpb24sXG4gICAgICAgICAgICBydWxlc01hcHBpbmdcbiAgICAgICAgICApLmV2YWx1YXRlKCk7XG5cbiAgICAgICAgICBpZiAoY29uZGl0aW9uRXZhbHVhdGlvbikge1xuICAgICAgICAgICAgY29uc3QgYWN0aW9ucyA9IG5ldyBBY3Rpb24oXG4gICAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgICAgcnVsZXNNYXBwaW5nLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgRk9STVNfTElTVDogdGhpcy5mb3Jtc0xpc3QsXG4gICAgICAgICAgICAgICAgQUxMX0ZPUk1TX0RBVEE6IHRoaXMuYWxsRm9ybXNEYXRhLFxuICAgICAgICAgICAgICAgIEVYVFJBX0RBVEE6IHRoaXMuZXh0cmFEYXRhXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBhd2FpdCBhY3Rpb25zLmV4ZWN1dGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWNoZWNrT2JqZWN0S2V5RXhpc3RzKGZvcm0sIFwiaGlkZGVuXCIpKSB7XG4gICAgICAgIGZvcm0uaGlkZGVuID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5mb3Jtc0xpc3QgPSB0aGlzLmFzc2lnblNlcXVlbmNlTm9Ub0Zvcm0odGhpcy5mb3Jtc0xpc3QpO1xuXG4gICAgLyoqXG4gICAgICogQmVsb3cgY29kZSBpZGVudGlmaWVzIHRoZSBhbGxGb3Jtc0RhdGEgcmVxdWlyZWQgZm9yIHRoZSBjdXJyZW50IFVzZXIgRm9ybS5cbiAgICAgKiBXaHk/IEJlY2F1c2UgYWxsRm9ybXNEYXRhIHdpbGwgYWN0dWFsbHkgY29udGFpbiB0aGUgd2hvbGUgam91cm5leSdzIGFsbFxuICAgICAqIHBvc3NpYmxlIFVzZXIgRm9ybSBzdGVwcy4gU28sIGl0IGlzIGltcG9ydGFudCB0byBzZXQgdGhlIGZvcm0gZGF0YSB3aGljaFxuICAgICAqIHRoaXMgcGFydGljdWxhciBVc2VyIEZvcm0gb25seSBoYXMgdG8gTE9DQUwgTUVUSE9EIFZhcmlhYmxlLlxuICAgICAqL1xuICAgIGNvbnN0IGN1cnJlbnRVc2VyRm9ybUFsbEZvcm1zRGF0YSA9IHRoaXMuZmlsdGVyQWxsRm9ybXNEYXRhKFxuICAgICAgdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICB0aGlzLmZvcm1zTGlzdFxuICAgICk7XG5cbiAgICB0aGlzLmZvcm1zTGlzdENvbXBsZXRlZCA9IHRoaXMuZmluZENvbXBsZXRlZEZvcm1zTGlzdChcbiAgICAgIGN1cnJlbnRVc2VyRm9ybUFsbEZvcm1zRGF0YVxuICAgICk7XG5cbiAgICB0aGlzLmZvcm1zTGlzdCA9IHRoaXMubWFya0Zvcm1JbkZvcm1zTGlzdEFzQ29tcGxldGVkKFxuICAgICAgdGhpcy5mb3Jtc0xpc3QsXG4gICAgICB0aGlzLmZvcm1zTGlzdENvbXBsZXRlZFxuICAgICk7XG5cbiAgICB0aGlzLmZvcm1zTGlzdCA9IHRoaXMubWFya0Zvcm1JbkZvcm1zTGlzdEFzRGlzYWJsZWQoXG4gICAgICB0aGlzLmZvcm1zTGlzdCxcbiAgICAgIHRoaXMuZm9ybXNMaXN0Q29tcGxldGVkXG4gICAgKTtcblxuICAgIHRoaXMuZm9ybXNMaXN0ID0gZ2V0T2JqZWN0RGVlcENvcHkodGhpcy5mb3Jtc0xpc3QpO1xuXG4gICAgdGhpcy5hY3RpdmVGb3JtQ29uZmlnID0gdGhpcy5maW5kQWN0aXZlRm9ybUNvbmZpZyh0aGlzLmZvcm1zTGlzdCk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIHNob3dQcmV2aWV3KHByZXZpZXdQcm9wZXJ0aWVzOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnByZXZpZXdQcm9wZXJ0aWVzID0gbWVyZ2VPYmplY3RzKFxuICAgICAgdGhpcy5wcmV2aWV3UHJvcGVydGllcyxcbiAgICAgIHByZXZpZXdQcm9wZXJ0aWVzXG4gICAgKTtcblxuICAgIGlmIChcbiAgICAgIGlzRW1wdHlWYWx1ZSh0aGlzLnByZXZpZXdQcm9wZXJ0aWVzLmlmcmFtZS5zcmMpICYmXG4gICAgICBpc0VtcHR5VmFsdWUodGhpcy5wcmV2aWV3UHJvcGVydGllcy5odG1sLmJlZm9yZSkgJiZcbiAgICAgIGlzRW1wdHlWYWx1ZSh0aGlzLnByZXZpZXdQcm9wZXJ0aWVzLmh0bWwuYWZ0ZXIpICYmXG4gICAgICBpc0VtcHR5VmFsdWUodGhpcy5wcmV2aWV3UHJvcGVydGllcy5wb3B1cEZvcm1LZXkpXG4gICAgKSB7XG4gICAgICB0aGlzLnByZXZpZXdQcm9wZXJ0aWVzLnVuYXZhaWxhYmxlID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzTm90RW1wdHlWYWx1ZSh0aGlzLnByZXZpZXdQcm9wZXJ0aWVzLnBvcHVwRm9ybUtleSkpIHtcbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKHRoaXMuYWN0aXZlRm9ybUNvbmZpZywgXCJwb3B1cEZvcm1zXCIpKSB7XG4gICAgICAgICAgdGhpcy5wb3B1cEZvcm1Db25maWcgPVxuICAgICAgICAgICAgdGhpcy5hY3RpdmVGb3JtQ29uZmlnLnBvcHVwRm9ybXNbXG4gICAgICAgICAgICAgIHRoaXMucHJldmlld1Byb3BlcnRpZXMucG9wdXBGb3JtS2V5XG4gICAgICAgICAgICBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucG9wdXBGb3JtQ29uZmlnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHJldmlld1Byb3BlcnRpZXMudW5hdmFpbGFibGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnByZXZpZXdEaWFsb2dTZXJ2aWNlLm9wZW4odGhpcy5wcmV2aWV3IHx8IFwiXCIpLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBmb3JtSGlkZShmb3JtS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBsZXQgZm9ybSA9IGdldEZvcm1Db25maWdCeUtleSh0aGlzLmZvcm1zTGlzdCwgZm9ybUtleSk7XG5cbiAgICBmb3JtID0gc2V0VmFsdWVUb09iamVjdFBhdGgoZm9ybSwgXCJoaWRkZW5cIiwgdHJ1ZSk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGZvcm1TaG93KGZvcm1LZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGxldCBmb3JtID0gZ2V0Rm9ybUNvbmZpZ0J5S2V5KHRoaXMuZm9ybXNMaXN0LCBmb3JtS2V5KTtcblxuICAgIGZvcm0gPSBzZXRWYWx1ZVRvT2JqZWN0UGF0aChmb3JtLCBcImhpZGRlblwiLCBmYWxzZSk7XG4gIH1cblxuICBhc3luYyB0YWtlQWN0aW9uKGFjdGlvbjogYW55LCBvYmplY3Q6IGFueSkge1xuICAgIC8qKlxuICAgICAqIFRoaXMgYmVsb3cgY29kZSBpcyBjdXJyZW50bHkgY29tbWVudGVkIGJlY2F1c2Ugbm90IGFsbCBhY3Rpb25zIG5lZWQgdG8gYmUgbG9nZ2VkIGF0IGJhY2tlbmQuXG4gICAgICogV2lsbCBsb29rIGxhdGVyIGludG8gd2hlcmUgb25seSBzcGVjaWZpYyBhY3Rpb25zIG5lZWRzIHRvIGJlIGxvZ2dlZCBvciBhbGwuXG4gICAgICogQ3VycmVudGx5IGxvZ3MgYXJlIHNlbnQgZnJvbSB3aXRoaW5nIHRoZSBhY3Rpb24ncyBzcGVjaWZpYyBtZXRob2RzLlxuICAgICAqIENvZGUgLVxuICAgICAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fQUNUSU9OX0VYRUNVVEUsIHtcbiAgICAgICAgICBhY3Rpb25fa2V5OiBhY3Rpb24ua2V5LFxuICAgICAgICAgIC4uLihhY3Rpb24uaWQgJiYgeyBhY3Rpb25faWQ6IGFjdGlvbi5pZCB9KVxuICAgICAgICB9KTtcbiAgICAqL1xuXG4gICAgc3dpdGNoIChhY3Rpb24ua2V5KSB7XG4gICAgICBjYXNlIEVSZW5kZXJlckFjdGlvbktleS5GT1JNX0hJREU6XG4gICAgICAgIHRoaXMuZm9ybUhpZGUoYWN0aW9uLnByb3BzLmZvcm1LZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRVJlbmRlcmVyQWN0aW9uS2V5LkZPUk1fU0hPVzpcbiAgICAgICAgdGhpcy5mb3JtU2hvdyhhY3Rpb24ucHJvcHMuZm9ybUtleSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LlNFVF9WQUxVRToge1xuICAgICAgICBjb25zdCBzb3VyY2VzID0gbmV3IFNvdXJjZSh7XG4gICAgICAgICAgVVNFUl9DT05GSUc6IHRoaXMudXNlckNvbmZpZyxcbiAgICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5mb3Jtc0RhdGEsXG4gICAgICAgICAgRVhUUkFfREFUQTogdGhpcy5leHRyYURhdGFcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc291cmNlVmFsdWUgPSBhd2FpdCBzb3VyY2VzLmdldFZhbHVlRnJvbVNvdXJjZShcbiAgICAgICAgICBhY3Rpb24ucHJvcHMudmFsdWUuc291cmNlXG4gICAgICAgICk7XG4gICAgICAgIHNvdXJjZXMuc2V0VmFsdWVUb1NvdXJjZShhY3Rpb24ucHJvcHMudmFsdWUuZGVzdGluYXRpb24sIHNvdXJjZVZhbHVlKTtcblxuICAgICAgICB0aGlzLnVzZXJDb25maWcgPSBzb3VyY2VzLm9iamVjdC5VU0VSX0NPTkZJRztcbiAgICAgICAgdGhpcy5mb3Jtc0RhdGEgPSBzb3VyY2VzLm9iamVjdC5BTExfRk9STVNfREFUQTtcbiAgICAgICAgdGhpcy5leHRyYURhdGEgPSBzb3VyY2VzLm9iamVjdC5FWFRSQV9EQVRBO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZmluZEZvcm1zTGlzdExlbmd0aChmb3Jtc0xpc3Q6IGFueVtdKTogbnVtYmVyIHtcbiAgICBjb25zdCB1cGRhdGVkRm9ybXNMaXN0ID0gZm9ybXNMaXN0LmZpbHRlcigoZm9ybSkgPT4ge1xuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZvcm0sIFwidHlwZVwiKSkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGZvcm0udHlwZSAhPT0gRUZvcm1UeXBlLkhUTUwgJiZcbiAgICAgICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmb3JtLCBcImhpZGRlblwiKSAmJlxuICAgICAgICAgICFmb3JtLmhpZGRlblxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZvcm0sIFwiaGlkZGVuXCIpICYmICFmb3JtLmhpZGRlbjtcbiAgICB9KTtcblxuICAgIHJldHVybiB1cGRhdGVkRm9ybXNMaXN0Lmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaWJyYXJ5IEV2ZW50IExpc3RlbmVyc1xuICAgKi9cblxuICAvKipcbiAgICogRm9ybUxpc3QgLSBMaXN0ZW5zIHRvIGV2ZW50IG9mIG9wZW5pbmcgdGhlIEZvcm1WaWV3IG9mIHdoZW4gYW55IGZvcm0gaXMgY2xpY2tlZCBpbiBGb3JtTGlzdFxuICAgKiBAcGFyYW0gc2VsZWN0ZWRGb3JtIHN0cmluZ1xuICAgKi9cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBoYW5kbGVPbkNsaWNrU2V0QWN0aXZlRm9ybShzZWxlY3RlZEZvcm06IHN0cmluZywgdHJpZ2dlclR5cGU6IGFueSkge1xuICAgIHRoaXMuc2hvd0Zvcm0gPSBmYWxzZTtcbiAgICB0aGlzLnRvZ2dsZUxvYWRlcih0cnVlKTtcbiAgICB0aGlzLmlzVW5zYXZlZERhdGEgPSBmYWxzZTtcblxuICAgIGxldCBhY3RpdmVGb3JtQ29uZmlnID0gdGhpcy5mb3Jtc0xpc3QuZmluZCgoZm9ybSkgPT4ge1xuICAgICAgcmV0dXJuIGZvcm0ua2V5ID09PSBzZWxlY3RlZEZvcm07XG4gICAgfSk7XG5cbiAgICBhY3RpdmVGb3JtQ29uZmlnID0gbmV3IENvbnZlcnRlcigpLnVwZGF0ZUZvcm1Db25maWdQcm9wZXJ0aWVzKFxuICAgICAgYWN0aXZlRm9ybUNvbmZpZ1xuICAgICk7XG5cbiAgICBsZXQgZm9ybUNvbmZpZzogYW55O1xuXG4gICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGFjdGl2ZUZvcm1Db25maWcsIFwicHJvcHNcIikpIHtcbiAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhhY3RpdmVGb3JtQ29uZmlnLnByb3BzLCBcInVybFwiKSkge1xuICAgICAgICBjb25zdCBmb3JtQ29uZmlnRnJvbVVybCA9IGF3YWl0IHRoaXMuZmV0Y2hGb3JtQ29uZmlnKFxuICAgICAgICAgIGFjdGl2ZUZvcm1Db25maWcucHJvcHMudXJsXG4gICAgICAgICk7XG4gICAgICAgIGZvcm1Db25maWcgPSB7XG4gICAgICAgICAgLi4uYWN0aXZlRm9ybUNvbmZpZyxcbiAgICAgICAgICAuLi5mb3JtQ29uZmlnRnJvbVVybFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoYWN0aXZlRm9ybUNvbmZpZy5wcm9wcywgXCJwYXRoXCIpICYmXG4gICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKHRoaXMudXNlckNvbmZpZywgXCJiYWNrZW5kXCIpICYmXG4gICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKHRoaXMudXNlckNvbmZpZy5iYWNrZW5kLCBcIkNPTkZJR19CQVNFX1VSTFwiKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMudXNlckNvbmZpZz8uYmFja2VuZD8uQ09ORklHX0JBU0VfVVJMfSR7YWN0aXZlRm9ybUNvbmZpZy5wcm9wcy5wYXRofWA7XG4gICAgICAgIGNvbnN0IGZvcm1Db25maWdGcm9tUGF0aCA9IGF3YWl0IHRoaXMuZmV0Y2hGb3JtQ29uZmlnKHVybCk7XG4gICAgICAgIGZvcm1Db25maWcgPSB7XG4gICAgICAgICAgLi4uYWN0aXZlRm9ybUNvbmZpZyxcbiAgICAgICAgICAuLi5mb3JtQ29uZmlnRnJvbVBhdGhcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGFjdGl2ZUZvcm1Db25maWcsIFwidHlwZVwiKSAmJlxuICAgICAgICBhY3RpdmVGb3JtQ29uZmlnLnR5cGUgPT09IEVGb3JtVHlwZS5GT1JNXG4gICAgICApIHtcbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGFjdGl2ZUZvcm1Db25maWcsIFwiZmllbGRzXCIpKSB7XG4gICAgICAgICAgZm9ybUNvbmZpZyA9IGFjdGl2ZUZvcm1Db25maWc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiTm8gRGlyZWN0IFVSTCwgTm8gUGF0aCB3aXRoIEJhc2UgVVJMLCBObyBmaWVsZHMga2V5IGZvdW5kIGluIEFjdGl2ZSBGb3JtJ3MgQ29uZmlnIVwiXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgTm8gRGlyZWN0IFVSTCwgTm8gUGF0aCB3aXRoIEJhc2UgVVJMLCBObyBmaWVsZHMga2V5IGZvdW5kIGluIEFjdGl2ZSBGb3JtJ3MgQ29uZmlnIWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGFjdGl2ZUZvcm1Db25maWcuZm9ybUNvbnRlbnQsIFwidXJsXCIpKSB7XG4gICAgICBjb25zdCBmb3JtQ29uZmlnRnJvbVVybCA9IGF3YWl0IHRoaXMuZmV0Y2hGb3JtQ29uZmlnKFxuICAgICAgICBhY3RpdmVGb3JtQ29uZmlnLmZvcm1Db250ZW50LnVybFxuICAgICAgKTtcbiAgICAgIGZvcm1Db25maWcgPSB7XG4gICAgICAgIC4uLmFjdGl2ZUZvcm1Db25maWcsXG4gICAgICAgIC4uLmZvcm1Db25maWdGcm9tVXJsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBjaGVja09iamVjdEtleUV4aXN0cyhhY3RpdmVGb3JtQ29uZmlnLmZvcm1Db250ZW50LCBcInBhdGhcIikgJiZcbiAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKHRoaXMudXNlckNvbmZpZywgXCJiYWNrZW5kXCIpICYmXG4gICAgICBjaGVja09iamVjdEtleUV4aXN0cyh0aGlzLnVzZXJDb25maWcuYmFja2VuZCwgXCJDT05GSUdfQkFTRV9VUkxcIilcbiAgICApIHtcbiAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMudXNlckNvbmZpZz8uYmFja2VuZD8uQ09ORklHX0JBU0VfVVJMfSR7YWN0aXZlRm9ybUNvbmZpZy5wcm9wcy5wYXRofWA7XG4gICAgICBjb25zdCBmb3JtQ29uZmlnRnJvbVBhdGggPSBhd2FpdCB0aGlzLmZldGNoRm9ybUNvbmZpZyh1cmwpO1xuICAgICAgZm9ybUNvbmZpZyA9IHtcbiAgICAgICAgLi4uYWN0aXZlRm9ybUNvbmZpZyxcbiAgICAgICAgLi4uZm9ybUNvbmZpZ0Zyb21QYXRoXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoYWN0aXZlRm9ybUNvbmZpZywgXCJmaWVsZHNcIikpIHtcbiAgICAgIGZvcm1Db25maWcgPSBhY3RpdmVGb3JtQ29uZmlnO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBcIk5vIERpcmVjdCBVUkwsIE5vIFBhdGggd2l0aCBCYXNlIFVSTCwgTm8gZmllbGRzIGtleSBmb3VuZCBpbiBBY3RpdmUgRm9ybSdzIENvbmZpZyFcIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3JtQ29uZmlnID0gbmV3IENvbnZlcnRlcigpLnVwZGF0ZUZvcm1Db25maWdGcm9tVXNlckNvbmZpZyhcbiAgICAgIGZvcm1Db25maWcsXG4gICAgICB0aGlzLnVzZXJDb25maWdcbiAgICApO1xuXG4gICAgZm9ybUNvbmZpZyA9IG5ldyBDb252ZXJ0ZXIoKS51cGRhdGVGb3JtQ29uZmlnTWlzY2VsbGFuZW91cyhmb3JtQ29uZmlnLCB7XG4gICAgICBmb3Jtc0xpc3RMZW5ndGg6IHRoaXMuZmluZEZvcm1zTGlzdExlbmd0aCh0aGlzLmZvcm1zTGlzdClcbiAgICB9KTtcblxuICAgIHRoaXMuYWN0aXZlRm9ybUNvbmZpZyA9IG1lcmdlT2JqZWN0cyh7fSwgYWN0aXZlRm9ybUNvbmZpZywgZm9ybUNvbmZpZyk7XG5cbiAgICBzd2l0Y2ggKHRyaWdnZXJUeXBlKSB7XG4gICAgICBjYXNlIFwiQlVUVE9OX0NMSUNLXCI6XG4gICAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19GT1JNX09QRU5fQlVUVE9OX0NMSUNLLCB7XG4gICAgICAgICAgZm9ybV9rZXk6IHRoaXMuYWN0aXZlRm9ybUNvbmZpZy5rZXksXG4gICAgICAgICAgZm9ybV90aXRsZTpcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRm9ybUNvbmZpZz8udGl0bGUgPz8gdGhpcy5hY3RpdmVGb3JtQ29uZmlnPy5wcm9wcz8udGl0bGVcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0ZPUk1fT1BFTl9BVVRPLCB7XG4gICAgICAgICAgZm9ybV9rZXk6IHRoaXMuYWN0aXZlRm9ybUNvbmZpZy5rZXksXG4gICAgICAgICAgZm9ybV90aXRsZTpcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRm9ybUNvbmZpZz8udGl0bGUgPz8gdGhpcy5hY3RpdmVGb3JtQ29uZmlnPy5wcm9wcz8udGl0bGVcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggPCA2MDApIHtcbiAgICAgIHRoaXMuc2hvd0Zvcm1TZWN0aW9ucyA9IGZhbHNlO1xuICAgICAgdGhpcy5zaG93Rm9ybUZpZWxkcyA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggPj0gNjAwKSB7XG4gICAgICB0aGlzLnNob3dGb3JtU2VjdGlvbnMgPSB0cnVlO1xuICAgICAgdGhpcy5zaG93Rm9ybUZpZWxkcyA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5zaG93Rm9ybSA9IHRydWU7XG4gICAgdGhpcy50b2dnbGVMb2FkZXIoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1WaWV3IC0gTGlzdGVucyB0byBldmVudCBvZiBleGVjdXRpbmcgYW4gQVBJIGNhbGwgZnJvbSB3aXRoaW4gdGhlIEZvcm1WaWV3IGFuZCBlbWl0cyAocmVhZCBhcyBwYXNzZXMpIHRoZSBzYW1lIGV2ZW50IHRvIHRoZSBsaWJyYXJ5IGNvbnN1bWVyLlxuICAgKiBAcGFyYW0gZSBhbnlcbiAgICovXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlR2V0VW5zYXZlZFN0YXRlKGU6IGFueSkge1xuICAgIHRoaXMuaXNVbnNhdmVkRGF0YSA9IGU7XG4gIH1cblxuICBoYW5kbGVPbkNsaWNrQXBpQ2FsbChlOiBhbnkpIHtcbiAgICB0aGlzLm9uQ2xpY2tBcGlDYWxsLmVtaXQoZSk7XG4gIH1cblxuICBoYW5kbGVPbkNsaWNrVmlld0ZpbGUoZTogYW55KSB7XG4gICAgdGhpcy5vbkNsaWNrVmlld0ZpbGUuZW1pdChlKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlT25DbGlja0Zvcm1GaWVsZEJ1dHRvbihlOiBhbnkpIHtcbiAgICB0aGlzLm9uQ2xpY2tGb3JtRmllbGRCdXR0b24uZW1pdChlKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlT25BY3Rpb25TaG93UG9wdXBGb3JtKGU6IGFueSwgY29udGVudDogYW55KSB7XG4gICAgaWYgKFxuICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZSwgXCJhY3RpdmVGb3JtRGF0YVwiKSAmJlxuICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZSwgXCJwb3B1cEZvcm1Db25maWdcIilcbiAgICApIHtcbiAgICAgIGNvbnN0IHBvcHVwRm9ybURhdGEgPSB7IFt0aGlzLmFjdGl2ZUZvcm1Db25maWcua2V5XTogZS5hY3RpdmVGb3JtRGF0YSB9O1xuICAgICAgdGhpcy5hY3RpdmVQb3B1cEZvcm1EYXRhID0gbWVyZ2VPYmplY3RzKHRoaXMuYWxsRm9ybXNEYXRhLCBwb3B1cEZvcm1EYXRhKTtcblxuICAgICAgdGhpcy5wb3B1cEZvcm1Db25maWcgPSBlLnBvcHVwRm9ybUNvbmZpZztcbiAgICAgIGNvbnN0IHBvcHVwVHlwZSA9IGU/LnBvcHVwVHlwZSA/PyBcIkRJQUxPR1wiO1xuXG4gICAgICBzd2l0Y2ggKHBvcHVwVHlwZSkge1xuICAgICAgICBjYXNlIFwiRElBTE9HXCI6XG4gICAgICAgICAgdGhpcy5wcmV2aWV3RGlhbG9nUmVmID0gdGhpcy5kaWFsb2dzXG4gICAgICAgICAgICAub3Blbihjb250ZW50LCB7XG4gICAgICAgICAgICAgIGNsb3NlYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgZGlzbWlzc2libGU6IGZhbHNlLFxuICAgICAgICAgICAgICBzaXplOiBcInNcIixcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucG9wdXBGb3JtQ2FsbGJhY2sgPSB7XG4gICAgICAgICAgICAgICAgICBwb3B1cEZvcm1EYXRhOiBkYXRhLmRhdGEsXG4gICAgICAgICAgICAgICAgICBwb3B1cEZvcm1Db25maWc6IGRhdGEuZm9ybUNvbmZpZyxcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZUZvcm1Db25maWc6IHRoaXMuYWN0aXZlRm9ybUNvbmZpZ1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVQb3B1cEZvcm1EYXRhID0ge307XG4gICAgICAgICAgICAgICAgdGhpcy5wb3B1cEZvcm1Db25maWcgPSB7fTtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpZXdEaWFsb2dSZWYuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvcHVwRm9ybUNhbGxiYWNrID0ge1xuICAgICAgICAgICAgICAgICAgcG9wdXBGb3JtRGF0YToge30sXG4gICAgICAgICAgICAgICAgICBwb3B1cEZvcm1Db25maWc6IHRoaXMucG9wdXBGb3JtQ29uZmlnLFxuICAgICAgICAgICAgICAgICAgYWN0aXZlRm9ybUNvbmZpZzogdGhpcy5hY3RpdmVGb3JtQ29uZmlnLFxuICAgICAgICAgICAgICAgICAgc3RvcFRhc2tFeGVjdXRpb246IHRydWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlUG9wdXBGb3JtRGF0YSA9IHt9O1xuICAgICAgICAgICAgICAgIHRoaXMucG9wdXBGb3JtQ29uZmlnID0ge307XG5cbiAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oXCJEaWFsb2cgZXJyb3JcIik7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKFwiRGlhbG9nIGNsb3NlZFwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJQT1BVUFwiOlxuICAgICAgICAgIHRoaXMucHJldmlld0RpYWxvZ1JlZiA9IHRoaXMucHJldmlld0RpYWxvZ1NlcnZpY2VcbiAgICAgICAgICAgIC5vcGVuKHRoaXMucHJldmlldyB8fCBcIlwiKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvcHVwRm9ybUNhbGxiYWNrID0ge1xuICAgICAgICAgICAgICAgICAgcG9wdXBGb3JtRGF0YTogZGF0YS5kYXRhLFxuICAgICAgICAgICAgICAgICAgcG9wdXBGb3JtQ29uZmlnOiBkYXRhLmZvcm1Db25maWcsXG4gICAgICAgICAgICAgICAgICBhY3RpdmVGb3JtQ29uZmlnOiB0aGlzLmFjdGl2ZUZvcm1Db25maWdcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlUG9wdXBGb3JtRGF0YSA9IHt9O1xuICAgICAgICAgICAgICAgIHRoaXMucG9wdXBGb3JtQ29uZmlnID0ge307XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2aWV3RGlhbG9nUmVmLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3B1cEZvcm1DYWxsYmFjayA9IHtcbiAgICAgICAgICAgICAgICAgIHBvcHVwRm9ybURhdGE6IHt9LFxuICAgICAgICAgICAgICAgICAgcG9wdXBGb3JtQ29uZmlnOiB0aGlzLnBvcHVwRm9ybUNvbmZpZyxcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZUZvcm1Db25maWc6IHRoaXMuYWN0aXZlRm9ybUNvbmZpZyxcbiAgICAgICAgICAgICAgICAgIHN0b3BUYXNrRXhlY3V0aW9uOiB0cnVlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVBvcHVwRm9ybURhdGEgPSB7fTtcbiAgICAgICAgICAgICAgICB0aGlzLnBvcHVwRm9ybUNvbmZpZyA9IHt9O1xuXG4gICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKFwiUHJldmlldyBlcnJvclwiKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgY29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oXCJQcmV2aWV3IGNsb3NlZFwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1WaWV3IC0gTGlzdGVucyB0byBldmVudCBvZiBnZXR0aW5nIHRoZSBBY3RpdmUgRm9ybSdzIERhdGEgd2hlbiB0aGUgRm9ybSBpcyBTYXZlZCBhbmQgZW1pdHMgKHJlYWQgYXMgcGFzc2VzKSB0aGUgc2FtZSBldmVudCB0byB0aGUgbGlicmFyeSBjb25zdW1lci5cbiAgICogQHBhcmFtIGUgYW55XG4gICAqL1xuICBAbG9nTWV0aG9kXG4gIGhhbmRsZU9uQ2xpY2tTYXZlRm9ybShcbiAgICBlOiBhbnksXG4gICAgZXZlbnRUeXBlOiBcIkZPUk1cIiB8IFwiUE9QVVBfRk9STVwiLFxuICAgIGNvbnRleHQ6IHVuZGVmaW5lZFxuICApIHtcbiAgICBzd2l0Y2ggKGV2ZW50VHlwZSkge1xuICAgICAgY2FzZSBcIkZPUk1cIjpcbiAgICAgICAgdGhpcy5pc1Vuc2F2ZWREYXRhID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9nZ2xlTG9hZGVyKHRydWUpO1xuXG4gICAgICAgIHRoaXMuZ2V0Rm9ybURhdGEuZW1pdCh7XG4gICAgICAgICAgW3RoaXMuYWN0aXZlRm9ybUNvbmZpZy5rZXldOiB7XG4gICAgICAgICAgICBmb3JtQ29uZmlnOiBlLmZvcm1Db25maWcsXG4gICAgICAgICAgICBkYXRhOiBlLmRhdGEsXG4gICAgICAgICAgICBleHRlbmRlZERhdGE6IGUuZXh0ZW5kZWREYXRhXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiUE9QVVBfRk9STVwiOlxuICAgICAgICB0aGlzLnByZXZpZXdEaWFsb2dSZWYubmV4dChlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9ybVZpZXcgLSBMaXN0ZW5zIHRvIGV2ZW50IG9mIHNob3dpbmcgdGhlIEZvcm1zIExpc3QgaW4gTW9iaWxlIFZpZXcuXG4gICAqIEBwYXJhbSBlIGFueVxuICAgKi9cbiAgaGFuZGxlT25DbGlja1ZpZXdGb3JtcyhlOiBhbnkpIHtcbiAgICB0aGlzLnNob3dGb3JtU2VjdGlvbnMgPSB0cnVlO1xuICAgIHRoaXMuc2hvd0Zvcm0gPSBmYWxzZTtcbiAgICB0aGlzLnNob3dGb3JtRmllbGRzID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgZXZlbnQgb2YgZ29pbmcgYmFjayB0byB0aGUgcHJldmlvdXMgZm9ybSBkaXJlY3RseSBvciBieSB0YWJiaW5nLCB3aXRob3V0IHNob3dpbmcgdGhlIGZvcm0gbGlzdCBpbiBtb2JpbGUgdmlldy5cbiAgICpcbiAgICogUHJlcmVxdWlzaXRlOiBUaGUgY3VycmVudCBmb3JtIGNhbiBuZXZlciBiZSBsb2NrZWQ7IGl0IHNob3VsZCBlaXRoZXIgYmUgaW4gYW4gZWRpdGFibGUgb3IgY29tcGxldGVkIHN0YXRlLlxuICAgKlxuICAgKiBMb2dpYzpcbiAgICogMS4gRm9yIERJUkVDVCBtb2RlLCBmaW5kIHRoZSBjb25maWcgb2YgdGhlIHByZXZpb3VzIGZvcm0gc3RhcnRpbmcgZnJvbSB0aGUgZmlyc3QgZm9ybSwgc3VjaCB0aGF0IHRoZSBwcmV2aW91cyBmb3JtIGlzIGVkaXRhYmxlIGFuZCBpdHMgc2VxdWVuY2UgbnVtYmVyIGlzIG9uZSBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgYWN0aXZlIGZvcm0ncyBzZXF1ZW5jZSBudW1iZXIuXG4gICAqICAgIElmIG5vIHByZXZpb3VzIGZvcm0gaXMgZm91bmQgb3IgYWxsIGZvcm1zIGhhdmUgYmVlbiBjb21wbGV0ZWQsIHNob3cgdGhlIGZvcm0gbGlzdC5cbiAgICogMi4gRm9yIFRBQkJFRCBtb2RlLCBmaW5kIHRoZSBjb25maWcgb2YgdGhlIHByZXZpb3VzIGZvcm0gaW4gdGhlIGxpc3QsIHN1Y2ggdGhhdCB0aGUgcHJldmlvdXMgZm9ybSdzIHNlcXVlbmNlIG51bWJlciBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgYWN0aXZlIGZvcm0ncyBzZXF1ZW5jZSBudW1iZXIgYW5kIHRoZSBmb3JtIGlzIGVkaXRhYmxlLlxuICAgKiAgICBJZiBubyBwcmV2aW91cyBmb3JtIGlzIGZvdW5kLCBzaG93IHRoZSBmb3JtIGxpc3QuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBlIC0gVGhlIGV2ZW50IG9iamVjdCBjb250YWluaW5nIHRoZSBtb2RlIHRvIGdvIGJhY2sgaW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlLm1vZGUgLSBUaGUgbW9kZSBvZiBnb2luZyBiYWNrOiBESVJFQ1Qgb3IgVEFCQkVELlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlT25DbGlja0dvQmFjayhlOiBhbnkpIHtcbiAgICBzd2l0Y2ggKGUubW9kZSkge1xuICAgICAgY2FzZSBFRm9ybVZpZXdHb0JhY2tNb2RlLkRJUkVDVDpcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRm9ybUNvbmZpZy5zZXF1ZW5jZU5vID09PSAxKSB7XG4gICAgICAgICAgdGhpcy5zaG93Rm9ybVNlY3Rpb25zID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnNob3dGb3JtID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5zaG93Rm9ybUZpZWxkcyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHRoaXMuY2hlY2tJZkZvcm1zU3RhdHVzQ29tcGxldGVkKFxuICAgICAgICAgICAgdGhpcy5mb3Jtc0xpc3QsXG4gICAgICAgICAgICB0aGlzLmZvcm1zTGlzdENvbXBsZXRlZFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5zaG93Rm9ybVNlY3Rpb25zID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnNob3dGb3JtID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5zaG93Rm9ybUZpZWxkcyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHByZXZpb3VzRm9ybUNvbmZpZ0RpcmVjdCA9IHRoaXMuZm9ybXNMaXN0LmZpbmQoKGZvcm0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIGZvcm0uc2VxdWVuY2VObyA9PT0gdGhpcy5hY3RpdmVGb3JtQ29uZmlnLnNlcXVlbmNlTm8gLSAxICYmXG4gICAgICAgICAgICAgIGZvcm0uc3RhdHVzICE9PSBFRm9ybXNMaXN0U3RhdHVzLkxPQ0tFRFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChwcmV2aW91c0Zvcm1Db25maWdEaXJlY3QpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlT25DbGlja1NldEFjdGl2ZUZvcm0oXG4gICAgICAgICAgICAgIHByZXZpb3VzRm9ybUNvbmZpZ0RpcmVjdC5rZXksXG4gICAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUZvcm1WaWV3R29CYWNrTW9kZS5UQUJCRUQ6IHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNGb3JtQ29uZmlnID0gdGhpcy5mb3Jtc0xpc3QuZmluZCgoZm9ybSkgPT4ge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBmb3JtLnNlcXVlbmNlTm8gPCB0aGlzLmFjdGl2ZUZvcm1Db25maWcuc2VxdWVuY2VObyAmJlxuICAgICAgICAgICAgZm9ybS5zdGF0dXMgPT09IEVGb3Jtc0xpc3RTdGF0dXMuRURJVEFCTEVcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocHJldmlvdXNGb3JtQ29uZmlnKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVPbkNsaWNrU2V0QWN0aXZlRm9ybShwcmV2aW91c0Zvcm1Db25maWcua2V5LCB1bmRlZmluZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2hvd0Zvcm1TZWN0aW9ucyA9IHRydWU7XG4gICAgICAgICAgdGhpcy5zaG93Rm9ybSA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuc2hvd0Zvcm1GaWVsZHMgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtTGlzdCAtIExpc3RlbnMgdG8gZXZlbnQgb2Ygc3VibWl0dGluZyBhbGwgdGhlIGZvcm1zIGFuZCBtb3Zpbmcgb3V0IG9mIHRoZSBsaWJyYXJ5IGFuZCBhbHNvIGhhbmRsZXMgdGhlIHZhbGlkYXRpb24gb2YgYWxsIHRoZSBmb3Jtcy5cbiAgICogQHBhcmFtIGUgYW55XG4gICAqL1xuICBAbG9nTWV0aG9kXG4gIGFzeW5jIGhhbmRsZU9uQ2xpY2tTdWJtaXRGb3JtcyhlOiBhbnkpIHtcbiAgICBjb25zdCBmb3Jtc0xpc3Q6IGFueVtdID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmZvcm1zTGlzdCkpO1xuXG4gICAgbGV0IGZpcnN0Rm9ybVdpdGhFcnJvciA9IFwiXCI7XG4gICAgZm9yIChjb25zdCBmb3JtIG9mIGZvcm1zTGlzdCkge1xuICAgICAgaWYgKFxuICAgICAgICAhZm9ybS5oaWRkZW4gJiZcbiAgICAgICAgZm9ybS50eXBlICE9PSBFRm9ybVR5cGUuSFRNTCAmJlxuICAgICAgICBmb3JtLnJlcXVpcmVkICYmXG4gICAgICAgIGZvcm0uc3RhdHVzICE9PSBFRm9ybXNMaXN0U3RhdHVzLkNPTVBMRVRFRFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19TVUJNSVRfRk9STV9CVVRUT05fQ0xJQ0tfSU5WQUxJRCwge1xuICAgICAgICAgIGZvcm1fa2V5OiBmb3JtLmtleSxcbiAgICAgICAgICBmb3JtX3RpdGxlOiBmb3JtPy50aXRsZSA/PyBmb3JtPy5wcm9wcz8udGl0bGUsXG4gICAgICAgICAgZm9ybV9zdGF0dXM6IGZvcm0uc3RhdHVzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChpc0VtcHR5VmFsdWUoZmlyc3RGb3JtV2l0aEVycm9yKSkge1xuICAgICAgICAgIGZpcnN0Rm9ybVdpdGhFcnJvciA9IGZvcm0ua2V5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzTm90RW1wdHlWYWx1ZShmaXJzdEZvcm1XaXRoRXJyb3IpKSB7XG4gICAgICB0aGlzLnRvZ2dsZUVycm9yTm90aWZpY2F0aW9uKHRydWUpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMudG9nZ2xlRXJyb3JOb3RpZmljYXRpb24oZmFsc2UpO1xuICAgICAgfSwgMzAwMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vbkNsaWNrU3VibWl0LmVtaXQoZSk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGhhbmRsZUdldExvZ3MoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuZ2V0TG9ncy5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNaXNjZWxsYW5lb3VzIE1ldGhvZHNcbiAgICovXG4gIGhhbmRsZVJlc2l6ZShmb3Jtc0xpc3Q6IGFueVtdKSB7XG4gICAgaWYgKHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCA8IDYwMCkge1xuICAgICAgY29uc3QgaXNTaW5nbGVGb3JtID0gKGZvcm1zTGlzdDogYW55W10pOiBib29sZWFuID0+IHtcbiAgICAgICAgcmV0dXJuIGZvcm1zTGlzdC5sZW5ndGggPT09IDE7XG4gICAgICB9O1xuICAgICAgaWYgKCFpc1NpbmdsZUZvcm0oZm9ybXNMaXN0KSkge1xuICAgICAgICB0aGlzLnNob3dGb3JtU2VjdGlvbnMgPSB0cnVlO1xuICAgICAgICB0aGlzLnNob3dGb3JtRmllbGRzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2hvd0Zvcm0gPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hvd0Zvcm1TZWN0aW9ucyA9IHRydWU7XG4gICAgICAgIHRoaXMuc2hvd0Zvcm1GaWVsZHMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaG93Rm9ybSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhpcy5pc01vYmlsZVZpZXcgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzTW9iaWxlVmlldyA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBuZ0NsYXNzPVwia3dpa2lkLXJlbmRlcmVyXCI+XG4gIDxkaXZcbiAgICBuZ0NsYXNzPVwia3dpa2lkLWxheW91dC1jb250YWluZXJcIlxuICAgICpuZ0lmPVwiIWxvYWRpbmdcIlxuICA+XG4gICAgPGRpdlxuICAgICAgbmdDbGFzcz1cImt3aWtpZC1zZWN0aW9ucy1jb250YWluZXJcIlxuICAgICAgKm5nSWY9XCJzaG93Rm9ybVNlY3Rpb25zXCJcbiAgICAgIGNsYXNzPVwiYWN0aXZlXCJcbiAgICAgIFtjbGFzcy5hY3RpdmVdPVwic2hvd0Zvcm1TZWN0aW9uc1wiXG4gICAgICBbY2xhc3MubW9iaWxlXT1cImlzTW9iaWxlVmlld1wiXG4gICAgPlxuICAgICAgPGt3aWtpZC1mb3Jtcy1saXN0XG4gICAgICAgIFtzaG93Rm9ybUZpZWxkc109XCJ0aGlzLnNob3dGb3JtRmllbGRzXCJcbiAgICAgICAgW2FjdGl2ZUZvcm1Db25maWddPVwidGhpcy5hY3RpdmVGb3JtQ29uZmlnXCJcbiAgICAgICAgW3VzZXJDb25maWddPVwidGhpcy51c2VyQ29uZmlnXCJcbiAgICAgICAgW2Zvcm1zTGlzdF09XCJ0aGlzLmZvcm1zTGlzdFwiXG4gICAgICAgIFtzdGVwQ29uZmlnXT1cInRoaXMuc3RlcENvbmZpZ1wiXG4gICAgICAgIFtpc1Vuc2F2ZWREYXRhXT1cInRoaXMuaXNVbnNhdmVkRGF0YVwiXG4gICAgICAgIFtmb3Jtc0xpc3RDb21wbGV0ZWRdPVwidGhpcy5mb3Jtc0xpc3RDb21wbGV0ZWRcIlxuICAgICAgICBbaXNNb2JpbGVWaWV3XT1cInRoaXMuaXNNb2JpbGVWaWV3XCJcbiAgICAgICAgKGdldExvZ3MpPVwiaGFuZGxlR2V0TG9ncygkZXZlbnQpXCJcbiAgICAgICAgKG9uQ2xpY2tTZXRBY3RpdmVGb3JtKT1cIlxuICAgICAgICAgIHRoaXMuaGFuZGxlT25DbGlja1NldEFjdGl2ZUZvcm0oJGV2ZW50LCAnQlVUVE9OX0NMSUNLJylcbiAgICAgICAgXCJcbiAgICAgICAgKG9uQ2xpY2tTdWJtaXRGb3Jtcyk9XCJ0aGlzLmhhbmRsZU9uQ2xpY2tTdWJtaXRGb3JtcygkZXZlbnQpXCJcbiAgICAgID48L2t3aWtpZC1mb3Jtcy1saXN0PlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIG5nQ2xhc3M9XCJrd2lraWQtZm9ybXMtY29udGFpbmVyXCJcbiAgICAgICpuZ0lmPVwiXG4gICAgICAgIHRoaXMuc2hvd0Zvcm0gJiZcbiAgICAgICAgdGhpcy5zaG93Rm9ybUZpZWxkcyAmJlxuICAgICAgICB0aGlzLmFjdGl2ZUZvcm1Db25maWcgIT09IHVuZGVmaW5lZFxuICAgICAgXCJcbiAgICAgIFtjbGFzcy5hY3RpdmVdPVwic2hvd0Zvcm1GaWVsZHNcIlxuICAgICAgW2NsYXNzLm1vYmlsZV09XCJpc01vYmlsZVZpZXdcIlxuICAgICAgW0BwYW5lbEluT3V0XVxuICAgID5cbiAgICAgIDxrd2lraWQtZm9ybS12aWV3XG4gICAgICAgICpuZ0lmPVwidGhpcy5hY3RpdmVGb3JtQ29uZmlnLnR5cGUgPT09ICdGT1JNJ1wiXG4gICAgICAgIFtmb3JtQ29uZmlnXT1cInRoaXMuYWN0aXZlRm9ybUNvbmZpZ1wiXG4gICAgICAgIFthbGxGb3Jtc0RhdGFdPVwidGhpcy5hbGxGb3Jtc0RhdGFcIlxuICAgICAgICBbZXh0cmFEYXRhXT1cImV4dHJhRGF0YVwiXG4gICAgICAgIFtpc01vYmlsZVZpZXddPVwidGhpcy5pc01vYmlsZVZpZXdcIlxuICAgICAgICBbdXNlckNvbmZpZ109XCJ0aGlzLnVzZXJDb25maWdcIlxuICAgICAgICBbc3RlcENvbmZpZ109XCJ0aGlzLnN0ZXBDb25maWdcIlxuICAgICAgICBbcG9wdXBGb3JtQ2FsbGJhY2tdPVwidGhpcy5wb3B1cEZvcm1DYWxsYmFja1wiXG4gICAgICAgIFthcGlDYWxsUmVzcG9uc2VdPVwidGhpcy5hcGlDYWxsUmVzcG9uc2VcIlxuICAgICAgICBbYnV0dG9uQ2xpY2tSZXNwb25zZV09XCJ0aGlzLmJ1dHRvbkNsaWNrUmVzcG9uc2VcIlxuICAgICAgICAob25DbGlja0Zvcm1GaWVsZEJ1dHRvbik9XCJoYW5kbGVPbkNsaWNrRm9ybUZpZWxkQnV0dG9uKCRldmVudClcIlxuICAgICAgICAoZ2V0VW5zYXZlZERhdGFTdGF0ZSk9XCJoYW5kbGVHZXRVbnNhdmVkU3RhdGUoJGV2ZW50KVwiXG4gICAgICAgIChvbkNsaWNrQXBpQ2FsbCk9XCJoYW5kbGVPbkNsaWNrQXBpQ2FsbCgkZXZlbnQpXCJcbiAgICAgICAgKG9uQ2xpY2tWaWV3RmlsZSk9XCJoYW5kbGVPbkNsaWNrVmlld0ZpbGUoJGV2ZW50KVwiXG4gICAgICAgIChvbkFjdGlvblNob3dQb3B1cEZvcm0pPVwiXG4gICAgICAgICAgdGhpcy5oYW5kbGVPbkFjdGlvblNob3dQb3B1cEZvcm0oJGV2ZW50LCBjb250ZW50KVxuICAgICAgICBcIlxuICAgICAgICAob25DbGlja0dvQmFjayk9XCJ0aGlzLmhhbmRsZU9uQ2xpY2tHb0JhY2soJGV2ZW50KVwiXG4gICAgICAgIChvbkNsaWNrVmlld0Zvcm1zKT1cInRoaXMuaGFuZGxlT25DbGlja1ZpZXdGb3JtcygkZXZlbnQpXCJcbiAgICAgICAgKGdldExvZ3MpPVwiaGFuZGxlR2V0TG9ncygkZXZlbnQpXCJcbiAgICAgICAgKG9uQ2xpY2tTYXZlRm9ybSk9XCJcbiAgICAgICAgICB0aGlzLmhhbmRsZU9uQ2xpY2tTYXZlRm9ybSgkZXZlbnQsICdGT1JNJywgdW5kZWZpbmVkKVxuICAgICAgICBcIlxuICAgICAgPjwva3dpa2lkLWZvcm0tdmlldz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGt3aWt1aS1sb2FkZXI+PC9rd2lrdWktbG9hZGVyPlxuXG48dHVpLXB1c2hcbiAgaWQ9XCJlcnJvci1ub3RpZmljYXRpb25cIlxuICAqdHVpUHVzaD1cInNob3dFcnJvck5vdGlmaWNhdGlvblwiXG4gIGhlYWRpbmc9XCJQbGVhc2UgY29tcGxldGUgdGhlIHJlcXVpcmVkIEZvcm1zIVwiXG4gIHR5cGU9XCJFcnJvclwiXG4gIChjbG9zZSk9XCJ0b2dnbGVFcnJvck5vdGlmaWNhdGlvbihmYWxzZSlcIlxuPlxuICA8dHVpLXN2Z1xuICAgIHNyYz1cInR1aUljb25YQ2lyY2xlXCJcbiAgICBzdHlsZT1cImNvbG9yOiAjZmZmICFpbXBvcnRhbnRcIlxuICA+XG4gIDwvdHVpLXN2Zz5cbjwvdHVpLXB1c2g+XG48bmctdGVtcGxhdGVcbiAgI3ByZXZpZXdcbiAgbGV0LXByZXZpZXdcbj5cbiAgPHR1aS1wcmV2aWV3XG4gICAgW3JvdGF0YWJsZV09XCJmYWxzZVwiXG4gICAgW3pvb21hYmxlXT1cImZhbHNlXCJcbiAgICBjbGFzcz1cInByZXZpZXctY29udGFpbmVyXCJcbiAgICAqbmdJZj1cInBvcHVwRm9ybUNvbmZpZ1wiXG4gID5cbiAgICA8dHVpLXByZXZpZXctdGl0bGUgKm5nSWY9XCJwcmV2aWV3UHJvcGVydGllcy50aXRsZSAhPT0gJydcIj57e1xuICAgICAgcHJldmlld1Byb3BlcnRpZXMudGl0bGVcbiAgICB9fTwvdHVpLXByZXZpZXctdGl0bGU+XG5cbiAgICA8ZGl2IGNsYXNzPVwia3dpa2lkLWZvcm0tdmlldy1wb3B1cC1jb250YWluZXJcIj5cbiAgICAgIDxrd2lraWQtZm9ybS12aWV3XG4gICAgICAgIFtmb3JtRGF0YV09XCJhY3RpdmVQb3B1cEZvcm1EYXRhXCJcbiAgICAgICAgW2Zvcm1Db25maWddPVwicG9wdXBGb3JtQ29uZmlnXCJcbiAgICAgICAgW2FsbEZvcm1zRGF0YV09XCJhbGxGb3Jtc0RhdGFcIlxuICAgICAgICBbZXh0cmFEYXRhXT1cImV4dHJhRGF0YVwiXG4gICAgICAgIFt1c2VyQ29uZmlnXT1cInRoaXMudXNlckNvbmZpZ1wiXG4gICAgICAgIFtzdGVwQ29uZmlnXT1cInRoaXMuc3RlcENvbmZpZ1wiXG4gICAgICAgIFtpc01vYmlsZVZpZXddPVwidGhpcy5pc01vYmlsZVZpZXdcIlxuICAgICAgICBbYXBpQ2FsbFJlc3BvbnNlXT1cInRoaXMuYXBpQ2FsbFJlc3BvbnNlXCJcbiAgICAgICAgW2J1dHRvbkNsaWNrUmVzcG9uc2VdPVwidGhpcy5idXR0b25DbGlja1Jlc3BvbnNlXCJcbiAgICAgICAgKG9uQ2xpY2tGb3JtRmllbGRCdXR0b24pPVwiaGFuZGxlT25DbGlja0Zvcm1GaWVsZEJ1dHRvbigkZXZlbnQpXCJcbiAgICAgICAgKGdldFNhdmVkU3RhdGUpPVwiaGFuZGxlR2V0VW5zYXZlZFN0YXRlKCRldmVudClcIlxuICAgICAgICAob25DbGlja0FwaUNhbGwpPVwiaGFuZGxlT25DbGlja0FwaUNhbGwoJGV2ZW50KVwiXG4gICAgICAgIChnZXRMb2dzKT1cImhhbmRsZUdldExvZ3MoJGV2ZW50KVwiXG4gICAgICAgIChvbkNsaWNrU2F2ZUZvcm0pPVwiXG4gICAgICAgICAgdGhpcy5oYW5kbGVPbkNsaWNrU2F2ZUZvcm0oJGV2ZW50LCAnUE9QVVBfRk9STScsIHVuZGVmaW5lZClcbiAgICAgICAgXCJcbiAgICAgID48L2t3aWtpZC1mb3JtLXZpZXc+XG4gICAgPC9kaXY+XG5cbiAgICA8YnV0dG9uXG4gICAgICB0dWlJY29uQnV0dG9uXG4gICAgICB0dWlQcmV2aWV3QWN0aW9uXG4gICAgICBpY29uPVwidHVpSWNvbkNsb3NlTGFyZ2VcIlxuICAgICAgdGl0bGU9XCJDbG9zZVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJwcmV2aWV3LmNvbXBsZXRlKClcIlxuICAgID48L2J1dHRvbj5cbiAgPC90dWktcHJldmlldz5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGVcbiAgI2NvbnRlbnRcbiAgbGV0LWNvbnRleHRcbj5cbiAgPGRpdiBjbGFzcz1cImt3aWtpZC1mb3JtLXZpZXctcG9wdXAtY29udGFpbmVyXCI+XG4gICAgPGt3aWtpZC1mb3JtLXZpZXdcbiAgICAgIFtmb3JtRGF0YV09XCJhY3RpdmVQb3B1cEZvcm1EYXRhXCJcbiAgICAgIFtmb3JtQ29uZmlnXT1cInBvcHVwRm9ybUNvbmZpZ1wiXG4gICAgICBbZXh0cmFEYXRhXT1cImV4dHJhRGF0YVwiXG4gICAgICBbYWxsRm9ybXNEYXRhXT1cImFsbEZvcm1zRGF0YVwiXG4gICAgICBbdXNlckNvbmZpZ109XCJ0aGlzLnVzZXJDb25maWdcIlxuICAgICAgW3N0ZXBDb25maWddPVwidGhpcy5zdGVwQ29uZmlnXCJcbiAgICAgIFtpc01vYmlsZVZpZXddPVwidGhpcy5pc01vYmlsZVZpZXdcIlxuICAgICAgW2FwaUNhbGxSZXNwb25zZV09XCJ0aGlzLmFwaUNhbGxSZXNwb25zZVwiXG4gICAgICBbYnV0dG9uQ2xpY2tSZXNwb25zZV09XCJ0aGlzLmJ1dHRvbkNsaWNrUmVzcG9uc2VcIlxuICAgICAgKG9uQ2xpY2tGb3JtRmllbGRCdXR0b24pPVwiaGFuZGxlT25DbGlja0Zvcm1GaWVsZEJ1dHRvbigkZXZlbnQpXCJcbiAgICAgIChnZXRTYXZlZFN0YXRlKT1cImhhbmRsZUdldFVuc2F2ZWRTdGF0ZSgkZXZlbnQpXCJcbiAgICAgIChvbkNsaWNrQXBpQ2FsbCk9XCJoYW5kbGVPbkNsaWNrQXBpQ2FsbCgkZXZlbnQpXCJcbiAgICAgIChnZXRMb2dzKT1cImhhbmRsZUdldExvZ3MoJGV2ZW50KVwiXG4gICAgICAob25DbGlja1NhdmVGb3JtKT1cIlxuICAgICAgICB0aGlzLmhhbmRsZU9uQ2xpY2tTYXZlRm9ybSgkZXZlbnQsICdQT1BVUF9GT1JNJywgY29udGV4dClcbiAgICAgIFwiXG4gICAgPjwva3dpa2lkLWZvcm0tdmlldz5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
1014
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWZvcm1zL3NyYy9saWIvcmVuZGVyZXIvcmVuZGVyZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWZvcm1zL3NyYy9saWIvcmVuZGVyZXIvcmVuZGVyZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG1DQUFtQztBQUNuQyxzREFBc0Q7QUFDdEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFFLE9BQU8sRUFFTCxTQUFTLEVBRVQsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFHTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbEUsT0FBTyxFQUFvQixnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULElBQUksRUFDSixNQUFNLEVBQ04sb0JBQW9CLEVBQ3BCLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osZUFBZSxFQUNmLFNBQVMsRUFDVCxZQUFZLEVBQ1osb0JBQW9CLEVBQ3JCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUNsRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUMzRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUs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LE1BNEhoQyxxQkFBcUIsTUFhckIsNEJBQTRCLE1BSzVCLDJCQUEyQixNQTBGM0IscUJBQXFCLE1Bb0RyQixtQkFBbUIsTUE0RGIsd0JBQXdCLE1BbUM5QixhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuaW1wb3J0IHsgYW5pbWF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tIFwiQGFuZ3VsYXIvYW5pbWF0aW9uc1wiO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFR1aVByZXZpZXdEaWFsb2dTZXJ2aWNlIH0gZnJvbSBcIkB0YWlnYS11aS9hZGRvbi1wcmV2aWV3XCI7XG5pbXBvcnQgeyBUdWlEaWFsb2dDb250ZXh0LCBUdWlEaWFsb2dTZXJ2aWNlIH0gZnJvbSBcIkB0YWlnYS11aS9jb3JlXCI7XG5pbXBvcnQge1xuICBBY3Rpb24sXG4gIENvbmRpdGlvbixcbiAgUnVsZSxcbiAgU291cmNlLFxuICBjaGVja09iamVjdEtleUV4aXN0cyxcbiAgZ2V0T2JqZWN0RGVlcENvcHksXG4gIGlzRW1wdHlWYWx1ZSxcbiAgaXNOb3RFbXB0eVZhbHVlLFxuICBsb2dNZXRob2QsXG4gIG1lcmdlT2JqZWN0cyxcbiAgc2V0VmFsdWVUb09iamVjdFBhdGhcbn0gZnJvbSBcImt3aWtpZC10b29sa2l0XCI7XG5pbXBvcnQgeyBLd2lrVUlMb2FkZXJTZXJ2aWNlIH0gZnJvbSBcImt3aWt1aVwiO1xuaW1wb3J0IHsgQ29udmVydGVyIH0gZnJvbSBcIi4vY29uZmlnLWNvbnZlcnRlci9jb25maWctY29udmVydGVyXCI7XG5pbXBvcnQgeyBFQWN0aW9uS2V5IH0gZnJvbSBcIi4vZm9ybS12aWV3L2RlZmluaXRpb25zL2Zvcm0tdmlldy5hY3Rpb25zLmRlZmluaXRpb25cIjtcbmltcG9ydCB7IEVGb3JtVmlld0dvQmFja01vZGUgfSBmcm9tIFwiLi9mb3JtLXZpZXcvZGVmaW5pdGlvbnMvZm9ybS12aWV3LmNvbW1vbnMuZGVmaW5pdGlvblwiO1xuaW1wb3J0IHsgRUZvcm1zTGlzdFN0YXR1cyB9IGZyb20gXCIuL2Zvcm1zLWxpc3QvZm9ybXMtbGlzdC5kZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgRVJlbmRlcmVyQWN0aW9uS2V5IH0gZnJvbSBcIi4vcmVuZGVyZXIuYWN0aW9ucy5kZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgRUZvcm1UeXBlLCBFTG9nRXZlbnRUeXBlIH0gZnJvbSBcIi4vcmVuZGVyZXIuZGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IGZvcm1hdEV2ZW50TG9ncywgZ2V0Rm9ybUNvbmZpZ0J5S2V5IH0gZnJvbSBcIi4vcmVuZGVyZXIuaGVscGVyXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJrd2lraWQtZm9ybXMtcmVuZGVyZXJcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9yZW5kZXJlci5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vcmVuZGVyZXIuY29tcG9uZW50LnNjc3NcIiwgXCIuL3NoYXJlZC5zY3NzXCJdLFxuICBhbmltYXRpb25zOiBbXG4gICAgdHJpZ2dlcihcInBhbmVsSW5PdXRcIiwgW1xuICAgICAgdHJhbnNpdGlvbihcIjplbnRlclwiLCBbXG4gICAgICAgIHN0eWxlKHsgdHJhbnNmb3JtOiBcInRyYW5zbGF0ZVkoMTAwJSlcIiB9KSxcbiAgICAgICAgYW5pbWF0ZSgxNTApXG4gICAgICBdKSxcbiAgICAgIHRyYW5zaXRpb24oXCI6bGVhdmVcIiwgW1xuICAgICAgICBhbmltYXRlKDEwMCwgc3R5bGUoeyB0cmFuc2Zvcm06IFwidHJhbnNsYXRlWSgxMDAlKVwiIH0pKVxuICAgICAgXSlcbiAgICBdKVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEt3aWtJREZvcm1zUmVuZGVyZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIC8vIFRoZSBmaW5hbCB2YWx1ZSBzaG91bGQgYmUgcHJvdmlkZWQgdG8gc2VydmljZSwgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBpbiBhbGwgY29tcG9uZW50c1xuICBASG9zdExpc3RlbmVyKFwid2luZG93OnJlc2l6ZVwiLCBbXCIkZXZlbnRcIl0pXG4gIHdpbmRvd1Jlc2l6ZVdhdGNoZXIoKSB7XG4gICAgaWYgKHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCA8IDYwMCkge1xuICAgICAgaWYgKHRoaXMuc2hvd0Zvcm0pIHtcbiAgICAgICAgdGhpcy5zaG93Rm9ybVNlY3Rpb25zID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2hvd0Zvcm1GaWVsZHMgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93Rm9ybVNlY3Rpb25zID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zaG93Rm9ybUZpZWxkcyA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhpcy5pc01vYmlsZVZpZXcgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5zaG93Rm9ybSkge1xuICAgICAgICB0aGlzLnNob3dGb3JtU2VjdGlvbnMgPSB0cnVlO1xuICAgICAgICB0aGlzLnNob3dGb3JtRmllbGRzID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hvd0Zvcm1TZWN0aW9ucyA9IHRydWU7XG4gICAgICAgIHRoaXMuc2hvd0Zvcm1GaWVsZHMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaXNNb2JpbGVWaWV3ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQFZpZXdDaGlsZChcInByZXZpZXdcIilcbiAgcmVhZG9ubHkgcHJldmlldzogVGVtcGxhdGVSZWY8VHVpRGlhbG9nQ29udGV4dDx2b2lkPj47XG5cbiAgcHJpdmF0ZSBwcmV2aWV3RGlhbG9nUmVmOiBhbnk7XG5cbiAgQElucHV0KClcbiAgc3RlcENvbmZpZzogYW55O1xuXG4gIEBJbnB1dCgpXG4gIHVzZXJDb25maWc6IGFueTtcblxuICBASW5wdXQoKVxuICBmb3Jtc0RhdGE6IGFueSA9IHt9O1xuXG4gIEBJbnB1dCgpXG4gIGV4dHJhRGF0YTogYW55ID0ge307XG5cbiAgQElucHV0KClcbiAgYWN0aXZlRm9ybURhdGE6IGFueSA9IHt9O1xuXG4gIEBJbnB1dCgpXG4gIHJlZHV4RGF0YTogYW55ID0ge307XG5cbiAgQElucHV0KClcbiAgYXBpQ2FsbFJlc3BvbnNlOiBhbnkgPSB7fTtcblxuICBASW5wdXQoKVxuICBidXR0b25DbGlja1Jlc3BvbnNlOiBhbnkgPSB7fTtcblxuICBAT3V0cHV0KClcbiAgb25DbGlja1N1Ym1pdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAT3V0cHV0KClcbiAgZ2V0Rm9ybURhdGE6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQE91dHB1dCgpXG4gIG9uQ2xpY2tBcGlDYWxsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBPdXRwdXQoKVxuICBvbkNsaWNrVmlld0ZpbGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGdldExvZ3M6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQE91dHB1dCgpXG4gIG9uQ2xpY2tGb3JtRmllbGRCdXR0b246IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgbG9hZGluZyA9IGZhbHNlO1xuXG4gIHNob3dFcnJvck5vdGlmaWNhdGlvbiA9IGZhbHNlO1xuXG4gIHRvZ2dsZUVycm9yTm90aWZpY2F0aW9uKHNob3cpIHtcbiAgICB0aGlzLnNob3dFcnJvck5vdGlmaWNhdGlvbiA9IHNob3c7XG4gIH1cblxuICBhY3RpdmVQb3B1cEZvcm1EYXRhOiBhbnkgPSB7fTtcblxuICBwb3B1cEZvcm1DYWxsYmFjazogYW55ID0ge307XG5cbiAgYWN0aXZlRm9ybUNvbmZpZzogYW55O1xuXG4gIGFjdGl2ZUZvcm1GaWVsZHM6IGFueVtdO1xuXG4gIGFsbEZvcm1zRGF0YTogYW55ID0ge307XG5cbiAgYWxsRm9ybXNTdWJtaXR0ZWQgPSBmYWxzZTtcblxuICBmb3Jtc0xpc3Q6IGFueVtdID0gW107XG5cbiAgZm9ybXNMaXN0Q29tcGxldGVkOiBzdHJpbmdbXTtcblxuICBpc01vYmlsZVZpZXcgPSBmYWxzZTtcblxuICBwcmV2aWV3UHJvcGVydGllczogYW55ID0ge1xuICAgIGh0bWw6IHtcbiAgICAgIGJlZm9yZTogXCJcIixcbiAgICAgIGFmdGVyOiBcIlwiXG4gICAgfSxcbiAgICBpZnJhbWU6IHtcbiAgICAgIHNyYzogXCJcIixcbiAgICAgIHRpdGxlOiBcIlwiXG4gICAgfSxcbiAgICBwb3B1cEZvcm1LZXk6IFwiXCIsXG4gICAgdGl0bGU6IFwiXCIsXG4gICAgdW5hdmFpbGFibGU6IGZhbHNlXG4gIH07XG5cbiAgcG9wdXBGb3JtQ29uZmlnOiBhbnkgPSB7fTtcblxuICAvLyBkaXNwbGF5IGZvcm1zIGFuZCBsaXN0IGNvbmRpdGlvbmFsbHlcbiAgc2hvd0Zvcm0gPSBmYWxzZTtcblxuICBzaG93Rm9ybUZpZWxkcyA9IHRydWU7XG5cbiAgc2hvd0Zvcm1TZWN0aW9ucyA9IHRydWU7XG5cbiAgaXNVbnNhdmVkRGF0YSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaG9zdEVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBJbmplY3QoVHVpUHJldmlld0RpYWxvZ1NlcnZpY2UpXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcmV2aWV3RGlhbG9nU2VydmljZTogVHVpUHJldmlld0RpYWxvZ1NlcnZpY2UsXG4gICAgcHVibGljIGxvYWRlclNlcnZpY2U6IEt3aWtVSUxvYWRlclNlcnZpY2UsXG4gICAgQEluamVjdChUdWlEaWFsb2dTZXJ2aWNlKSBwcml2YXRlIHJlYWRvbmx5IGRpYWxvZ3M6IFR1aURpYWxvZ1NlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMucmVkdXhEYXRhID0gdGhpcy5yZWR1eERhdGEgPz8ge307XG4gICAgdGhpcy50b2dnbGVMb2FkZXIodHJ1ZSk7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAgIGNvbnN0IGZvcm1TdGVwS2V5ID1cbiAgICAgIHRoaXMuc3RlcENvbmZpZz8uZm9ybT8ua2V5ID8/IHRoaXMuc3RlcENvbmZpZz8uc3RlcEtleSA/PyB1bmRlZmluZWQ7XG5cbiAgICBpZiAoXG4gICAgICBmb3JtU3RlcEtleSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBjaGVja09iamVjdEtleUV4aXN0cyh0aGlzLnVzZXJDb25maWcudXNlckZvcm1GaWVsZHMsIGZvcm1TdGVwS2V5KVxuICAgICkge1xuICAgICAgdGhpcy5mb3Jtc0xpc3QgPSBnZXRPYmplY3REZWVwQ29weShcbiAgICAgICAgdGhpcy51c2VyQ29uZmlnLnVzZXJGb3JtRmllbGRzW2Zvcm1TdGVwS2V5XVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodGhpcy51c2VyQ29uZmlnLnVzZXJGb3JtRmllbGRzKSkge1xuICAgICAgdGhpcy5mb3Jtc0xpc3QgPSBnZXRPYmplY3REZWVwQ29weSh0aGlzLnVzZXJDb25maWcudXNlckZvcm1GaWVsZHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB1c2VyRm9ybUZpZWxkcyBkb2Vzbid0IGhhdmUgYSBmb3JtIGRlZmluZWQgd2l0aCBrZXk6ICR7Zm9ybVN0ZXBLZXl9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmluaXRpYWxpemVGb3JtcyhcIk9OX0lOSVRcIik7XG4gICAgdGhpcy50b2dnbGVMb2FkZXIoZmFsc2UpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGNvbnN0IHZlcmlmeUNoYW5nZSA9IChwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgIHJldHVybiBjaGVja09iamVjdEtleUV4aXN0cyhjaGFuZ2VzLCBwcm9wKSAmJiAhY2hhbmdlc1twcm9wXS5maXJzdENoYW5nZTtcbiAgICB9O1xuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJ1c2VyQ29uZmlnXCIpKSB7XG4gICAgICB0aGlzLnVzZXJDb25maWcgPSBjaGFuZ2VzLnVzZXJDb25maWcuY3VycmVudFZhbHVlO1xuICAgICAgdGhpcy50b2dnbGVMb2FkZXIoZmFsc2UpO1xuICAgIH1cbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwic3RlcENvbmZpZ1wiKSkge1xuICAgICAgdGhpcy5zdGVwQ29uZmlnID0gY2hhbmdlcy5zdGVwQ29uZmlnLmN1cnJlbnRWYWx1ZTtcbiAgICAgIHRoaXMudG9nZ2xlTG9hZGVyKGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImZvcm1zRGF0YVwiKSkge1xuICAgICAgdGhpcy5mb3Jtc0RhdGEgPSBjaGFuZ2VzLmZvcm1zRGF0YS5jdXJyZW50VmFsdWU7XG5cbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUZvcm1zKFwiT05fQ0hBTkdFXCIpO1xuICAgIH1cbiAgICBpZiAodmVyaWZ5Q2hhbmdlKFwiZXh0cmFEYXRhXCIpKSB7XG4gICAgICB0aGlzLmV4dHJhRGF0YSA9IGNoYW5nZXMuZXh0cmFEYXRhLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImFwaUNhbGxSZXNwb25zZVwiKSkge1xuICAgICAgdGhpcy5hcGlDYWxsUmVzcG9uc2UgPSBjaGFuZ2VzLmFwaUNhbGxSZXNwb25zZS5jdXJyZW50VmFsdWU7XG4gICAgICB0aGlzLnRvZ2dsZUxvYWRlcihmYWxzZSk7XG4gICAgfVxuICAgIGlmICh2ZXJpZnlDaGFuZ2UoXCJidXR0b25DbGlja1Jlc3BvbnNlXCIpKSB7XG4gICAgICB0aGlzLmJ1dHRvbkNsaWNrUmVzcG9uc2UgPSBjaGFuZ2VzLmJ1dHRvbkNsaWNrUmVzcG9uc2UuY3VycmVudFZhbHVlO1xuICAgICAgdGhpcy50b2dnbGVMb2FkZXIoZmFsc2UpO1xuICAgIH1cbiAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoY2hhbmdlcywgXCJyZWR1eERhdGFcIikpIHtcbiAgICAgIHRoaXMucmVkdXhEYXRhID0gY2hhbmdlcy5yZWR1eERhdGEuY3VycmVudFZhbHVlID8/IHt9O1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgdHJpZ2dlckxvZ3MoZXZlbnRUeXBlOiBFTG9nRXZlbnRUeXBlLCBsb2dzOiBhbnkpIHtcbiAgICB0aGlzLmdldExvZ3MuZW1pdChmb3JtYXRFdmVudExvZ3MoZXZlbnRUeXBlLCB0aGlzLnN0ZXBDb25maWcsIGxvZ3MpKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgdG9nZ2xlTG9hZGVyKGxvYWRlcikge1xuICAgIGlmIChsb2FkZXIpIHtcbiAgICAgIHRoaXMubG9hZGVyU2VydmljZS5zaG93KHtcbiAgICAgICAgZnVsbHNjcmVlbjogdHJ1ZSxcbiAgICAgICAgbG9hZGVyVGV4dDogXCJQbGVhc2Ugd2FpdFwiXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2FkZXJTZXJ2aWNlLmhpZGUoKTtcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIGZldGNoRm9ybUNvbmZpZyh1cmw6IHN0cmluZykge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7IG1ldGhvZDogXCJHRVRcIiB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgYXN5bmMgaW5pdGlhbGl6ZUZvcm1zKGV2ZW50VHlwZTogc3RyaW5nKSB7XG4gICAgdGhpcy50b2dnbGVMb2FkZXIodHJ1ZSk7XG5cbiAgICB0aGlzLmFsbEZvcm1zRGF0YSA9IHRoaXMuZm9ybXNEYXRhO1xuXG4gICAgYXdhaXQgdGhpcy51cGRhdGVGb3Jtc0xpc3QoKTtcblxuICAgIGlmIChcbiAgICAgIGV2ZW50VHlwZSA9PT0gXCJPTl9DSEFOR0VcIiAmJlxuICAgICAgdGhpcy5maW5kRm9ybXNMaXN0TGVuZ3RoKHRoaXMuZm9ybXNMaXN0KSA9PT0gMVxuICAgICkge1xuICAgICAgdGhpcy5oYW5kbGVPbkNsaWNrU3VibWl0Rm9ybXMobnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGFuZGxlUmVzaXplKHRoaXMuZm9ybXNMaXN0KTtcblxuICAgICAgaWYgKGlzTm90RW1wdHlWYWx1ZSh0aGlzLmFjdGl2ZUZvcm1Db25maWcpKSB7XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyh0aGlzLmFjdGl2ZUZvcm1Db25maWcsIFwidHlwZVwiKSkge1xuICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZUZvcm1Db25maWcudHlwZSAhPT0gRUZvcm1UeXBlLkhUTUwpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlT25DbGlja1NldEFjdGl2ZUZvcm0oXG4gICAgICAgICAgICAgIHRoaXMuYWN0aXZlRm9ybUNvbmZpZy5rZXksXG4gICAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVPbkNsaWNrU2V0QWN0aXZlRm9ybShcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRm9ybUNvbmZpZy5rZXksXG4gICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNob3dGb3JtID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2hvd0Zvcm1GaWVsZHMgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnRvZ2dsZUxvYWRlcihmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBjb252ZXJ0Rm9ybUxpc3RDb25maWcoZm9ybXNMaXN0OiBhbnlbXSk6IGFueVtdIHtcbiAgICBjb25zdCBjb252ZXJ0Rm9ybUxpc3RDb25maWdUeXBlRm9ybSA9IChmb3JtOiBhbnkpID0+IHtcbiAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmb3JtLCBcImZvcm1Db250ZW50XCIpKSB7XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmb3JtLmZvcm1Db250ZW50LCBcInVybFwiKSkge1xuICAgICAgICAgIGZvcm0gPSBzZXRWYWx1ZVRvT2JqZWN0UGF0aChmb3JtLCBcInByb3BzLnVybFwiLCBmb3JtLmZvcm1Db250ZW50LnVybCk7XG4gICAgICAgICAgZGVsZXRlIGZvcm0uZm9ybUNvbnRlbnQudXJsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmb3JtLmZvcm1Db250ZW50LCBcInBhdGhcIikpIHtcbiAgICAgICAgICBmb3JtID0gc2V0VmFsdWVUb09iamVjdFBhdGgoXG4gICAgICAgICAgICBmb3JtLFxuICAgICAgICAgICAgXCJwcm9wcy5wYXRoXCIsXG4gICAgICAgICAgICBmb3JtLmZvcm1Db250ZW50LnBhdGhcbiAgICAgICAgICApO1xuICAgICAgICAgIGRlbGV0ZSBmb3JtLmZvcm1Db250ZW50LnBhdGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc0VtcHR5VmFsdWUoZm9ybS5mb3JtQ29udGVudCkpIHtcbiAgICAgICAgZGVsZXRlIGZvcm0uZm9ybUNvbnRlbnQ7XG4gICAgICB9XG4gICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZm9ybSwgXCJ0aXRsZVwiKSkge1xuICAgICAgICBmb3JtID0gc2V0VmFsdWVUb09iamVjdFBhdGgoZm9ybSwgXCJwcm9wcy50aXRsZVwiLCBmb3JtLnRpdGxlKTtcbiAgICAgICAgZGVsZXRlIGZvcm0udGl0bGU7XG4gICAgICB9XG4gICAgICBpZiAoIWNoZWNrT2JqZWN0S2V5RXhpc3RzKGZvcm0sIFwiaGlkZGVuXCIpKSB7XG4gICAgICAgIGZvcm0uaGlkZGVuID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIWNoZWNrT2JqZWN0S2V5RXhpc3RzKGZvcm0sIFwiZGlzYWJsZWRcIikpIHtcbiAgICAgICAgZm9ybS5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCFjaGVja09iamVjdEtleUV4aXN0cyhmb3JtLCBcInJlcXVpcmVkXCIpKSB7XG4gICAgICAgIGZvcm0ucmVxdWlyZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFjaGVja09iamVjdEtleUV4aXN0cyhmb3JtLCBcImRlcGVuZGVudE9uXCIpKSB7XG4gICAgICAgIGZvcm0uZGVwZW5kZW50T24gPSBbXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZvcm07XG4gICAgfTtcblxuICAgIGNvbnN0IGNvbnZlcnRGb3JtTGlzdENvbmZpZ1R5cGVIdG1sID0gKGZvcm06IGFueSkgPT4ge1xuICAgICAgaWYgKGZvcm0udHlwZSA9PT0gXCJodG1sXCIpIHtcbiAgICAgICAgZm9ybS50eXBlID0gRUZvcm1UeXBlLkhUTUw7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmb3JtLCBcImh0bWxDb250ZW50XCIpKSB7XG4gICAgICAgIGlmICghY2hlY2tPYmplY3RLZXlFeGlzdHMoZm9ybSwgXCJwcm9wc1wiKSkge1xuICAgICAgICAgIGZvcm0ucHJvcHMgPSB7XG4gICAgICAgICAgICBodG1sQ29udGVudDogZm9ybS5odG1sQ29udGVudFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIGZvcm0uaHRtbENvbnRlbnQ7XG4gICAgICB9IGVsc2UgaWYgKCFjaGVja09iamVjdEtleUV4aXN0cyhmb3JtLCBcInByb3BzXCIpKSB7XG4gICAgICAgIGZvcm0ucHJvcHMgPSB7XG4gICAgICAgICAgaHRtbENvbnRlbnQ6IFwiXCJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmb3JtLCBcInRpdGxlXCIpKSB7XG4gICAgICAgIGZvcm0gPSBzZXRWYWx1ZVRvT2JqZWN0UGF0aChmb3JtLCBcInByb3BzLnRpdGxlXCIsIGZvcm0udGl0bGUpO1xuICAgICAgICBkZWxldGUgZm9ybS50aXRsZTtcbiAgICAgIH1cbiAgICAgIGlmICghY2hlY2tPYmplY3RLZXlFeGlzdHMoZm9ybSwgXCJoaWRkZW5cIikpIHtcbiAgICAgICAgZm9ybS5oaWRkZW4gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmb3JtO1xuICAgIH07XG5cbiAgICByZXR1cm4gZm9ybXNMaXN0Lm1hcCgoZm9ybSkgPT4ge1xuICAgICAgaWYgKCFjaGVja09iamVjdEtleUV4aXN0cyhmb3JtLCBcInR5cGVcIikpIHtcbiAgICAgICAgZm9ybS50eXBlID0gXCJGT1JNXCI7XG4gICAgICB9XG4gICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZm9ybSwgXCJ0eXBlXCIpKSB7XG4gICAgICAgIGlmIChmb3JtLnR5cGUgPT09IEVGb3JtVHlwZS5GT1JNKSB7XG4gICAgICAgICAgZm9ybSA9IGNvbnZlcnRGb3JtTGlzdENvbmZpZ1R5cGVGb3JtKGZvcm0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZvcm0udHlwZSA9PT0gRUZvcm1UeXBlLkhUTUwgfHwgZm9ybS50eXBlID09PSBcImh0bWxcIikge1xuICAgICAgICAgIGZvcm0gPSBjb252ZXJ0Rm9ybUxpc3RDb25maWdUeXBlSHRtbChmb3JtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm9ybTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOT1RFOiBUbyBiZSBkZXByZWNhdGVkLlxuICAgKiBXaHkgPyBXaWxsIGJlIGRpcmVjdGx5IGFzc2lnbmVkIHdoaWxlIGV4ZWN1dGluZyAnY2hha3JhJyBmb3IgZGVmYXVsdCBmb3JtIGNvbmZpZy5cbiAgICogQHBhcmFtIGZvcm1zTGlzdCBhbnlbXVxuICAgKiBAcGFyYW0gZm9ybXNMaXN0Q29tcGxldGVkIHN0cmluZ1tdXG4gICAqIEByZXR1cm5zIGFueVtdXG4gICAqL1xuICBAbG9nTWV0aG9kXG4gIGFzc2lnblNlcXVlbmNlTm9Ub0Zvcm0oZm9ybXNMaXN0OiBhbnlbXSk6IGFueVtdIHtcbiAgICBsZXQgc2VxdWVuY2VObyA9IDE7XG4gICAgZm9yIChjb25zdCBmb3JtIG9mIGZvcm1zTGlzdCkge1xuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZvcm0sIFwiaGlkZGVuXCIpKSB7XG4gICAgICAgIGlmICghZm9ybS5oaWRkZW4gJiYgZm9ybS50eXBlICE9PSBFRm9ybVR5cGUuSFRNTCkge1xuICAgICAgICAgIGZvcm0uc2VxdWVuY2VObyA9IHNlcXVlbmNlTm87XG4gICAgICAgICAgc2VxdWVuY2VObyArPSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBmb3JtLnNlcXVlbmNlTm87XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybXNMaXN0O1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBmaW5kQ29tcGxldGVkRm9ybXNMaXN0KGFsbEZvcm1zRGF0YTogYW55KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGZvcm1zTGlzdENvbXBsZXRlZDogc3RyaW5nW10gPSBbXTtcblxuICAgIE9iamVjdC5rZXlzKGFsbEZvcm1zRGF0YSkuZm9yRWFjaCgoZm9ybUtleSkgPT4ge1xuICAgICAgZm9ybXNMaXN0Q29tcGxldGVkLnB1c2goZm9ybUtleSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZm9ybXNMaXN0Q29tcGxldGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIE5PVEU6IFRvIGJlIGRlcHJlY2F0ZWQuIFdoeSA/IFdpbGwgYmUgcmVwbGFjZWQgYnkgJ2NoYWtyYScuXG4gICAqIEBwYXJhbSBmb3Jtc0xpc3QgYW55W11cbiAgICogQHBhcmFtIGZvcm1zTGlzdENvbXBsZXRlZCBzdHJpbmdbXVxuICAgKiBAcmV0dXJucyBhbnlbXVxuICAgKi9cbiAgQGxvZ01ldGhvZFxuICBtYXJrRm9ybUluRm9ybXNMaXN0QXNDb21wbGV0ZWQoXG4gICAgZm9ybXNMaXN0OiBhbnlbXSxcbiAgICBmb3Jtc0xpc3RDb21wbGV0ZWQ6IHN0cmluZ1tdXG4gICk6IGFueVtdIHtcbiAgICBmb3IgKGxldCBmb3JtIG9mIGZvcm1zTGlzdCkge1xuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZvcm0sIFwiaGlkZGVuXCIpKSB7XG4gICAgICAgIGlmICghZm9ybS5oaWRkZW4gJiYgZm9ybS50eXBlICE9PSBFRm9ybVR5cGUuSFRNTCkge1xuICAgICAgICAgIGlmIChmb3Jtc0xpc3RDb21wbGV0ZWQuaW5jbHVkZXMoZm9ybS5rZXkpKSB7XG4gICAgICAgICAgICBmb3JtID0gc2V0VmFsdWVUb09iamVjdFBhdGgoZm9ybSwgXCJzdGF0dXNcIiwgXCJjb21wbGV0ZWRcIik7XG4gICAgICAgICAgICBmb3JtID0gc2V0VmFsdWVUb09iamVjdFBhdGgoZm9ybSwgXCJkaXNhYmxlZFwiLCBmYWxzZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhmb3JtLCBcImRlcGVuZGVudE9uXCIpKSB7XG4gICAgICAgICAgICBjb25zdCBpc0RlcGVuZGVudCA9IGZvcm0uZGVwZW5kZW50T24uZXZlcnkoKHI6IHN0cmluZykgPT5cbiAgICAgICAgICAgICAgZm9ybXNMaXN0Q29tcGxldGVkLmluY2x1ZGVzKHIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGlzRGVwZW5kZW50KSB7XG4gICAgICAgICAgICAgIGZvcm0gPSBzZXRWYWx1ZVRvT2JqZWN0UGF0aChmb3JtLCBcInN0YXR1c1wiLCBcImVkaXRhYmxlXCIpO1xuICAgICAgICAgICAgICBmb3JtID0gc2V0VmFsdWVUb09iamVjdFBhdGgoZm9ybSwgXCJkaXNhYmxlZFwiLCBmYWxzZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmb3JtID0gc2V0VmFsdWVUb09iamVjdFBhdGgoZm9ybSwgXCJzdGF0dXNcIiwgXCJsb2NrZWRcIik7XG4gICAgICAgICAgICAgIGZvcm0gPSBzZXRWYWx1ZVRvT2JqZWN0UGF0aChmb3JtLCBcImRpc2FibGVkXCIsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3JtID0gc2V0VmFsdWVUb09iamVjdFBhdGgoZm9ybSwgXCJkZXBlbmRlbnRPblwiLCBbXSk7XG4gICAgICAgICAgICBmb3JtID0gc2V0VmFsdWVUb09iamVjdFBhdGgoZm9ybSwgXCJzdGF0dXNcIiwgXCJlZGl0YWJsZVwiKTtcbiAgICAgICAgICAgIGZvcm0gPSBzZXRWYWx1ZVRvT2JqZWN0UGF0aChmb3JtLCBcImRpc2FibGVkXCIsIGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybXNMaXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIE5PVEU6IFRvIGJlIGRlcHJlY2F0ZWQuIFdoeSA/IFdpbGwgYmUgcmVwbGFjZWQgYnkgJ2NoYWtyYScuXG4gICAqIEBwYXJhbSBmb3Jtc0xpc3QgYW55W11cbiAgICogQHBhcmFtIGZvcm1zTGlzdENvbXBsZXRlZCBzdHJpbmdbXVxuICAgKiBAcmV0dXJucyBhbnlbXVxuICAgKi9cbiAgQGxvZ01ldGhvZFxuICBtYXJrRm9ybUluRm9ybXNMaXN0QXNEaXNhYmxlZChcbiAgICBmb3Jtc0xpc3Q6IGFueVtdLFxuICAgIGZvcm1zTGlzdENvbXBsZXRlZDogc3RyaW5nW11cbiAgKTogYW55W10ge1xuICAgIGZvciAobGV0IGZvcm0gb2YgZm9ybXNMaXN0KSB7XG4gICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZm9ybSwgXCJoaWRkZW5cIikpIHtcbiAgICAgICAgaWYgKCFmb3JtLmhpZGRlbiAmJiBmb3JtLnR5cGUgIT09IEVGb3JtVHlwZS5IVE1MKSB7XG4gICAgICAgICAgaWYgKGZvcm0uc3RhdHVzICE9PSBcImNvbXBsZXRlZFwiKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZm9ybSwgXCJkZXBlbmRlbnRPblwiKSkge1xuICAgICAgICAgICAgICBjb25zdCBpc0RlcGVuZGVudCA9IGZvcm0uZGVwZW5kZW50T24uZXZlcnkoKHI6IHN0cmluZykgPT5cbiAgICAgICAgICAgICAgICBmb3Jtc0xpc3RDb21wbGV0ZWQuaW5jbHVkZXMocilcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKGlzRGVwZW5kZW50KSB7XG4gICAgICAgICAgICAgICAgZm9ybSA9IHNldFZhbHVlVG9PYmplY3RQYXRoKGZvcm0sIFwic3RhdHVzXCIsIFwiZWRpdGFibGVcIik7XG4gICAgICAgICAgICAgICAgZm9ybSA9IHNldFZhbHVlVG9PYmplY3RQYXRoKGZvcm0sIFwiZGlzYWJsZWRcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvcm0gPSBzZXRWYWx1ZVRvT2JqZWN0UGF0aChmb3JtLCBcInN0YXR1c1wiLCBcImxvY2tlZFwiKTtcbiAgICAgICAgICAgICAgICBmb3JtID0gc2V0VmFsdWVUb09iamVjdFBhdGgoZm9ybSwgXCJkaXNhYmxlZFwiLCB0cnVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZm9ybSA9IHNldFZhbHVlVG9PYmplY3RQYXRoKGZvcm0sIFwiZGVwZW5kZW50T25cIiwgW10pO1xuICAgICAgICAgICAgICBmb3JtID0gc2V0VmFsdWVUb09iamVjdFBhdGgoZm9ybSwgXCJzdGF0dXNcIiwgXCJlZGl0YWJsZVwiKTtcbiAgICAgICAgICAgICAgZm9ybSA9IHNldFZhbHVlVG9PYmplY3RQYXRoKGZvcm0sIFwiZGlzYWJsZWRcIiwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmb3Jtc0xpc3Q7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGZpbHRlckFsbEZvcm1zRGF0YShhbGxGb3Jtc0RhdGE6IGFueSwgZm9ybXNMaXN0OiBhbnlbXSk6IGFueSB7XG4gICAgbGV0IGN1cnJlbnRVc2VyRm9ybUFsbEZvcm1zRGF0YTogYW55ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGZvcm0gb2YgZm9ybXNMaXN0KSB7XG4gICAgICBpZiAoXG4gICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZvcm0sIFwiaGlkZGVuXCIpICYmXG4gICAgICAgICFmb3JtLmhpZGRlbiAmJlxuICAgICAgICBmb3JtLnR5cGUgIT09IEVGb3JtVHlwZS5IVE1MXG4gICAgICApIHtcbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGFsbEZvcm1zRGF0YSwgZm9ybS5rZXkpKSB7XG4gICAgICAgICAgY3VycmVudFVzZXJGb3JtQWxsRm9ybXNEYXRhID0ge1xuICAgICAgICAgICAgLi4uY3VycmVudFVzZXJGb3JtQWxsRm9ybXNEYXRhLFxuICAgICAgICAgICAgW2Zvcm0ua2V5XTogYWxsRm9ybXNEYXRhW2Zvcm0ua2V5XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudFVzZXJGb3JtQWxsRm9ybXNEYXRhO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBjaGVja0lmRm9ybXNTdGF0dXNDb21wbGV0ZWQoXG4gICAgZm9ybXNMaXN0OiBhbnksXG4gICAgZm9ybXNMaXN0Q29tcGxldGVkOiBzdHJpbmdbXVxuICApOiBhbnkge1xuICAgIGxldCBhbGxGb3Jtc0NvbXBsZXRlZCA9IHRydWU7XG5cbiAgICBmb3IgKGNvbnN0IGZvcm0gb2YgZm9ybXNMaXN0KSB7XG4gICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoZm9ybSwgXCJoaWRkZW5cIikpIHtcbiAgICAgICAgaWYgKCFmb3JtLmhpZGRlbiAmJiBmb3JtLnR5cGUgIT09IEVGb3JtVHlwZS5IVE1MKSB7XG4gICAgICAgICAgaWYgKGZvcm0uc3RhdHVzICE9PSBcImNvbXBsZXRlZFwiKSB7XG4gICAgICAgICAgICBhbGxGb3Jtc0NvbXBsZXRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsbEZvcm1zQ29tcGxldGVkO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBmaW5kQWN0aXZlRm9ybUNvbmZpZyhmb3Jtc0xpc3Q6IGFueVtdKTogYW55IHtcbiAgICByZXR1cm4gZm9ybXNMaXN0LmZpbmQoKGZvcm0pID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZvcm0sIFwiaGlkZGVuXCIpICYmXG4gICAgICAgICFmb3JtLmhpZGRlbiAmJlxuICAgICAgICBmb3JtLnR5cGUgIT09IEVGb3JtVHlwZS5IVE1MICYmXG4gICAgICAgIGZvcm0uc3RhdHVzID09PSBcImVkaXRhYmxlXCIgJiZcbiAgICAgICAgIWZvcm0uZGlzYWJsZWRcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIHVwZGF0ZUZvcm1zTGlzdCgpIHtcbiAgICB0aGlzLmZvcm1zTGlzdCA9IHRoaXMuY29udmVydEZvcm1MaXN0Q29uZmlnKHRoaXMuZm9ybXNMaXN0KTtcblxuICAgIGZvciAoY29uc3QgZm9ybSBvZiB0aGlzLmZvcm1zTGlzdCkge1xuICAgICAgaWYgKFxuICAgICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmb3JtLCBcImRlZmF1bHRcIikgJiZcbiAgICAgICAgaXNOb3RFbXB0eVZhbHVlKGZvcm0uZGVmYXVsdClcbiAgICAgICkge1xuICAgICAgICBjb25zdCB7IHRyaWdnZXJzLCBydWxlcywgYWN0aW9ucyB9ID0gZm9ybS5kZWZhdWx0O1xuXG4gICAgICAgIGNvbnN0IHJ1bGVzTWFwcGluZyA9IG5ldyBSdWxlKHJ1bGVzLCB7XG4gICAgICAgICAgVVNFUl9DT05GSUc6IHRoaXMudXNlckNvbmZpZyxcbiAgICAgICAgICBGT1JNU19MSVNUOiB0aGlzLmZvcm1zTGlzdCxcbiAgICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICAgICAgRVhUUkFfREFUQTogdGhpcy5leHRyYURhdGFcbiAgICAgICAgfSkubWFwcGluZygpO1xuXG4gICAgICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGFjdGlvbnMpIHtcbiAgICAgICAgICBjb25zdCBjb25kaXRpb25FdmFsdWF0aW9uID0gbmV3IENvbmRpdGlvbihcbiAgICAgICAgICAgIGFjdGlvbi5jb25kaXRpb24sXG4gICAgICAgICAgICBydWxlc01hcHBpbmdcbiAgICAgICAgICApLmV2YWx1YXRlKCk7XG5cbiAgICAgICAgICBpZiAoY29uZGl0aW9uRXZhbHVhdGlvbikge1xuICAgICAgICAgICAgY29uc3QgYWN0aW9ucyA9IG5ldyBBY3Rpb24oXG4gICAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgICAgcnVsZXNNYXBwaW5nLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgRk9STVNfTElTVDogdGhpcy5mb3Jtc0xpc3QsXG4gICAgICAgICAgICAgICAgQUxMX0ZPUk1TX0RBVEE6IHRoaXMuYWxsRm9ybXNEYXRhLFxuICAgICAgICAgICAgICAgIEVYVFJBX0RBVEE6IHRoaXMuZXh0cmFEYXRhXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRoaXMudGFrZUFjdGlvbi5iaW5kKHRoaXMpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBhd2FpdCBhY3Rpb25zLmV4ZWN1dGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWNoZWNrT2JqZWN0S2V5RXhpc3RzKGZvcm0sIFwiaGlkZGVuXCIpKSB7XG4gICAgICAgIGZvcm0uaGlkZGVuID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5mb3Jtc0xpc3QgPSB0aGlzLmFzc2lnblNlcXVlbmNlTm9Ub0Zvcm0odGhpcy5mb3Jtc0xpc3QpO1xuXG4gICAgLyoqXG4gICAgICogQmVsb3cgY29kZSBpZGVudGlmaWVzIHRoZSBhbGxGb3Jtc0RhdGEgcmVxdWlyZWQgZm9yIHRoZSBjdXJyZW50IFVzZXIgRm9ybS5cbiAgICAgKiBXaHk/IEJlY2F1c2UgYWxsRm9ybXNEYXRhIHdpbGwgYWN0dWFsbHkgY29udGFpbiB0aGUgd2hvbGUgam91cm5leSdzIGFsbFxuICAgICAqIHBvc3NpYmxlIFVzZXIgRm9ybSBzdGVwcy4gU28sIGl0IGlzIGltcG9ydGFudCB0byBzZXQgdGhlIGZvcm0gZGF0YSB3aGljaFxuICAgICAqIHRoaXMgcGFydGljdWxhciBVc2VyIEZvcm0gb25seSBoYXMgdG8gTE9DQUwgTUVUSE9EIFZhcmlhYmxlLlxuICAgICAqL1xuICAgIGNvbnN0IGN1cnJlbnRVc2VyRm9ybUFsbEZvcm1zRGF0YSA9IHRoaXMuZmlsdGVyQWxsRm9ybXNEYXRhKFxuICAgICAgdGhpcy5hbGxGb3Jtc0RhdGEsXG4gICAgICB0aGlzLmZvcm1zTGlzdFxuICAgICk7XG5cbiAgICB0aGlzLmZvcm1zTGlzdENvbXBsZXRlZCA9IHRoaXMuZmluZENvbXBsZXRlZEZvcm1zTGlzdChcbiAgICAgIGN1cnJlbnRVc2VyRm9ybUFsbEZvcm1zRGF0YVxuICAgICk7XG5cbiAgICB0aGlzLmZvcm1zTGlzdCA9IHRoaXMubWFya0Zvcm1JbkZvcm1zTGlzdEFzQ29tcGxldGVkKFxuICAgICAgdGhpcy5mb3Jtc0xpc3QsXG4gICAgICB0aGlzLmZvcm1zTGlzdENvbXBsZXRlZFxuICAgICk7XG5cbiAgICB0aGlzLmZvcm1zTGlzdCA9IHRoaXMubWFya0Zvcm1JbkZvcm1zTGlzdEFzRGlzYWJsZWQoXG4gICAgICB0aGlzLmZvcm1zTGlzdCxcbiAgICAgIHRoaXMuZm9ybXNMaXN0Q29tcGxldGVkXG4gICAgKTtcblxuICAgIHRoaXMuZm9ybXNMaXN0ID0gZ2V0T2JqZWN0RGVlcENvcHkodGhpcy5mb3Jtc0xpc3QpO1xuXG4gICAgdGhpcy5hY3RpdmVGb3JtQ29uZmlnID0gdGhpcy5maW5kQWN0aXZlRm9ybUNvbmZpZyh0aGlzLmZvcm1zTGlzdCk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIHNob3dQcmV2aWV3KHByZXZpZXdQcm9wZXJ0aWVzOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnByZXZpZXdQcm9wZXJ0aWVzID0gbWVyZ2VPYmplY3RzKFxuICAgICAgdGhpcy5wcmV2aWV3UHJvcGVydGllcyxcbiAgICAgIHByZXZpZXdQcm9wZXJ0aWVzXG4gICAgKTtcblxuICAgIGlmIChcbiAgICAgIGlzRW1wdHlWYWx1ZSh0aGlzLnByZXZpZXdQcm9wZXJ0aWVzLmlmcmFtZS5zcmMpICYmXG4gICAgICBpc0VtcHR5VmFsdWUodGhpcy5wcmV2aWV3UHJvcGVydGllcy5odG1sLmJlZm9yZSkgJiZcbiAgICAgIGlzRW1wdHlWYWx1ZSh0aGlzLnByZXZpZXdQcm9wZXJ0aWVzLmh0bWwuYWZ0ZXIpICYmXG4gICAgICBpc0VtcHR5VmFsdWUodGhpcy5wcmV2aWV3UHJvcGVydGllcy5wb3B1cEZvcm1LZXkpXG4gICAgKSB7XG4gICAgICB0aGlzLnByZXZpZXdQcm9wZXJ0aWVzLnVuYXZhaWxhYmxlID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzTm90RW1wdHlWYWx1ZSh0aGlzLnByZXZpZXdQcm9wZXJ0aWVzLnBvcHVwRm9ybUtleSkpIHtcbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKHRoaXMuYWN0aXZlRm9ybUNvbmZpZywgXCJwb3B1cEZvcm1zXCIpKSB7XG4gICAgICAgICAgdGhpcy5wb3B1cEZvcm1Db25maWcgPVxuICAgICAgICAgICAgdGhpcy5hY3RpdmVGb3JtQ29uZmlnLnBvcHVwRm9ybXNbXG4gICAgICAgICAgICAgIHRoaXMucHJldmlld1Byb3BlcnRpZXMucG9wdXBGb3JtS2V5XG4gICAgICAgICAgICBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucG9wdXBGb3JtQ29uZmlnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHJldmlld1Byb3BlcnRpZXMudW5hdmFpbGFibGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnByZXZpZXdEaWFsb2dTZXJ2aWNlLm9wZW4odGhpcy5wcmV2aWV3IHx8IFwiXCIpLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBmb3JtSGlkZShmb3JtS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBsZXQgZm9ybSA9IGdldEZvcm1Db25maWdCeUtleSh0aGlzLmZvcm1zTGlzdCwgZm9ybUtleSk7XG5cbiAgICBmb3JtID0gc2V0VmFsdWVUb09iamVjdFBhdGgoZm9ybSwgXCJoaWRkZW5cIiwgdHJ1ZSk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGZvcm1TaG93KGZvcm1LZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGxldCBmb3JtID0gZ2V0Rm9ybUNvbmZpZ0J5S2V5KHRoaXMuZm9ybXNMaXN0LCBmb3JtS2V5KTtcblxuICAgIGZvcm0gPSBzZXRWYWx1ZVRvT2JqZWN0UGF0aChmb3JtLCBcImhpZGRlblwiLCBmYWxzZSk7XG4gIH1cblxuICBhc3luYyB0YWtlQWN0aW9uKGFjdGlvbjogYW55LCBvYmplY3Q6IGFueSkge1xuICAgIC8qKlxuICAgICAqIFRoaXMgYmVsb3cgY29kZSBpcyBjdXJyZW50bHkgY29tbWVudGVkIGJlY2F1c2Ugbm90IGFsbCBhY3Rpb25zIG5lZWQgdG8gYmUgbG9nZ2VkIGF0IGJhY2tlbmQuXG4gICAgICogV2lsbCBsb29rIGxhdGVyIGludG8gd2hlcmUgb25seSBzcGVjaWZpYyBhY3Rpb25zIG5lZWRzIHRvIGJlIGxvZ2dlZCBvciBhbGwuXG4gICAgICogQ3VycmVudGx5IGxvZ3MgYXJlIHNlbnQgZnJvbSB3aXRoaW5nIHRoZSBhY3Rpb24ncyBzcGVjaWZpYyBtZXRob2RzLlxuICAgICAqIENvZGUgLVxuICAgICAgICB0aGlzLnRyaWdnZXJMb2dzKEVMb2dFdmVudFR5cGUuRk9STV9fQUNUSU9OX0VYRUNVVEUsIHtcbiAgICAgICAgICBhY3Rpb25fa2V5OiBhY3Rpb24ua2V5LFxuICAgICAgICAgIC4uLihhY3Rpb24uaWQgJiYgeyBhY3Rpb25faWQ6IGFjdGlvbi5pZCB9KVxuICAgICAgICB9KTtcbiAgICAqL1xuXG4gICAgc3dpdGNoIChhY3Rpb24ua2V5KSB7XG4gICAgICBjYXNlIEVSZW5kZXJlckFjdGlvbktleS5GT1JNX0hJREU6XG4gICAgICAgIHRoaXMuZm9ybUhpZGUoYWN0aW9uLnByb3BzLmZvcm1LZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRVJlbmRlcmVyQWN0aW9uS2V5LkZPUk1fU0hPVzpcbiAgICAgICAgdGhpcy5mb3JtU2hvdyhhY3Rpb24ucHJvcHMuZm9ybUtleSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFQWN0aW9uS2V5LlNFVF9WQUxVRToge1xuICAgICAgICBjb25zdCBzb3VyY2VzID0gbmV3IFNvdXJjZSh7XG4gICAgICAgICAgVVNFUl9DT05GSUc6IHRoaXMudXNlckNvbmZpZyxcbiAgICAgICAgICBBTExfRk9STVNfREFUQTogdGhpcy5mb3Jtc0RhdGEsXG4gICAgICAgICAgRVhUUkFfREFUQTogdGhpcy5leHRyYURhdGFcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc291cmNlVmFsdWUgPSBhd2FpdCBzb3VyY2VzLmdldFZhbHVlRnJvbVNvdXJjZShcbiAgICAgICAgICBhY3Rpb24ucHJvcHMudmFsdWUuc291cmNlXG4gICAgICAgICk7XG4gICAgICAgIHNvdXJjZXMuc2V0VmFsdWVUb1NvdXJjZShhY3Rpb24ucHJvcHMudmFsdWUuZGVzdGluYXRpb24sIHNvdXJjZVZhbHVlKTtcblxuICAgICAgICB0aGlzLnVzZXJDb25maWcgPSBzb3VyY2VzLm9iamVjdC5VU0VSX0NPTkZJRztcbiAgICAgICAgdGhpcy5mb3Jtc0RhdGEgPSBzb3VyY2VzLm9iamVjdC5BTExfRk9STVNfREFUQTtcbiAgICAgICAgdGhpcy5leHRyYURhdGEgPSBzb3VyY2VzLm9iamVjdC5FWFRSQV9EQVRBO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZmluZEZvcm1zTGlzdExlbmd0aChmb3Jtc0xpc3Q6IGFueVtdKTogbnVtYmVyIHtcbiAgICBjb25zdCB1cGRhdGVkRm9ybXNMaXN0ID0gZm9ybXNMaXN0LmZpbHRlcigoZm9ybSkgPT4ge1xuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZvcm0sIFwidHlwZVwiKSkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGZvcm0udHlwZSAhPT0gRUZvcm1UeXBlLkhUTUwgJiZcbiAgICAgICAgICBjaGVja09iamVjdEtleUV4aXN0cyhmb3JtLCBcImhpZGRlblwiKSAmJlxuICAgICAgICAgICFmb3JtLmhpZGRlblxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGZvcm0sIFwiaGlkZGVuXCIpICYmICFmb3JtLmhpZGRlbjtcbiAgICB9KTtcblxuICAgIHJldHVybiB1cGRhdGVkRm9ybXNMaXN0Lmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaWJyYXJ5IEV2ZW50IExpc3RlbmVyc1xuICAgKi9cblxuICAvKipcbiAgICogRm9ybUxpc3QgLSBMaXN0ZW5zIHRvIGV2ZW50IG9mIG9wZW5pbmcgdGhlIEZvcm1WaWV3IG9mIHdoZW4gYW55IGZvcm0gaXMgY2xpY2tlZCBpbiBGb3JtTGlzdFxuICAgKiBAcGFyYW0gc2VsZWN0ZWRGb3JtIHN0cmluZ1xuICAgKi9cbiAgQGxvZ01ldGhvZFxuICBhc3luYyBoYW5kbGVPbkNsaWNrU2V0QWN0aXZlRm9ybShzZWxlY3RlZEZvcm06IHN0cmluZywgdHJpZ2dlclR5cGU6IGFueSkge1xuICAgIHRoaXMuc2hvd0Zvcm0gPSBmYWxzZTtcbiAgICB0aGlzLnRvZ2dsZUxvYWRlcih0cnVlKTtcbiAgICB0aGlzLmlzVW5zYXZlZERhdGEgPSBmYWxzZTtcblxuICAgIGxldCBhY3RpdmVGb3JtQ29uZmlnID0gdGhpcy5mb3Jtc0xpc3QuZmluZCgoZm9ybSkgPT4ge1xuICAgICAgcmV0dXJuIGZvcm0ua2V5ID09PSBzZWxlY3RlZEZvcm07XG4gICAgfSk7XG5cbiAgICBhY3RpdmVGb3JtQ29uZmlnID0gbmV3IENvbnZlcnRlcih7XG4gICAgICByZWR1eERhdGE6IHRoaXMucmVkdXhEYXRhID8/IHt9LFxuICAgICAgdXNlckNvbmZpZzogdGhpcy51c2VyQ29uZmlnXG4gICAgfSkudXBkYXRlRm9ybUNvbmZpZ1Byb3BlcnRpZXMoYWN0aXZlRm9ybUNvbmZpZyk7XG5cbiAgICBsZXQgZm9ybUNvbmZpZzogYW55O1xuXG4gICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGFjdGl2ZUZvcm1Db25maWcsIFwicHJvcHNcIikpIHtcbiAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhhY3RpdmVGb3JtQ29uZmlnLnByb3BzLCBcInVybFwiKSkge1xuICAgICAgICBjb25zdCBmb3JtQ29uZmlnRnJvbVVybCA9IGF3YWl0IHRoaXMuZmV0Y2hGb3JtQ29uZmlnKFxuICAgICAgICAgIGFjdGl2ZUZvcm1Db25maWcucHJvcHMudXJsXG4gICAgICAgICk7XG4gICAgICAgIGZvcm1Db25maWcgPSB7XG4gICAgICAgICAgLi4uYWN0aXZlRm9ybUNvbmZpZyxcbiAgICAgICAgICAuLi5mb3JtQ29uZmlnRnJvbVVybFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoYWN0aXZlRm9ybUNvbmZpZy5wcm9wcywgXCJwYXRoXCIpICYmXG4gICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKHRoaXMudXNlckNvbmZpZywgXCJiYWNrZW5kXCIpICYmXG4gICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKHRoaXMudXNlckNvbmZpZy5iYWNrZW5kLCBcIkNPTkZJR19CQVNFX1VSTFwiKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMudXNlckNvbmZpZz8uYmFja2VuZD8uQ09ORklHX0JBU0VfVVJMfSR7YWN0aXZlRm9ybUNvbmZpZy5wcm9wcy5wYXRofWA7XG4gICAgICAgIGNvbnN0IGZvcm1Db25maWdGcm9tUGF0aCA9IGF3YWl0IHRoaXMuZmV0Y2hGb3JtQ29uZmlnKHVybCk7XG4gICAgICAgIGZvcm1Db25maWcgPSB7XG4gICAgICAgICAgLi4uYWN0aXZlRm9ybUNvbmZpZyxcbiAgICAgICAgICAuLi5mb3JtQ29uZmlnRnJvbVBhdGhcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKGFjdGl2ZUZvcm1Db25maWcsIFwidHlwZVwiKSAmJlxuICAgICAgICBhY3RpdmVGb3JtQ29uZmlnLnR5cGUgPT09IEVGb3JtVHlwZS5GT1JNXG4gICAgICApIHtcbiAgICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGFjdGl2ZUZvcm1Db25maWcsIFwiZmllbGRzXCIpKSB7XG4gICAgICAgICAgZm9ybUNvbmZpZyA9IGFjdGl2ZUZvcm1Db25maWc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiTm8gRGlyZWN0IFVSTCwgTm8gUGF0aCB3aXRoIEJhc2UgVVJMLCBObyBmaWVsZHMga2V5IGZvdW5kIGluIEFjdGl2ZSBGb3JtJ3MgQ29uZmlnIVwiXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgTm8gRGlyZWN0IFVSTCwgTm8gUGF0aCB3aXRoIEJhc2UgVVJMLCBObyBmaWVsZHMga2V5IGZvdW5kIGluIEFjdGl2ZSBGb3JtJ3MgQ29uZmlnIWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGFjdGl2ZUZvcm1Db25maWcuZm9ybUNvbnRlbnQsIFwidXJsXCIpKSB7XG4gICAgICBjb25zdCBmb3JtQ29uZmlnRnJvbVVybCA9IGF3YWl0IHRoaXMuZmV0Y2hGb3JtQ29uZmlnKFxuICAgICAgICBhY3RpdmVGb3JtQ29uZmlnLmZvcm1Db250ZW50LnVybFxuICAgICAgKTtcbiAgICAgIGZvcm1Db25maWcgPSB7XG4gICAgICAgIC4uLmFjdGl2ZUZvcm1Db25maWcsXG4gICAgICAgIC4uLmZvcm1Db25maWdGcm9tVXJsXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBjaGVja09iamVjdEtleUV4aXN0cyhhY3RpdmVGb3JtQ29uZmlnLmZvcm1Db250ZW50LCBcInBhdGhcIikgJiZcbiAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKHRoaXMudXNlckNvbmZpZywgXCJiYWNrZW5kXCIpICYmXG4gICAgICBjaGVja09iamVjdEtleUV4aXN0cyh0aGlzLnVzZXJDb25maWcuYmFja2VuZCwgXCJDT05GSUdfQkFTRV9VUkxcIilcbiAgICApIHtcbiAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMudXNlckNvbmZpZz8uYmFja2VuZD8uQ09ORklHX0JBU0VfVVJMfSR7YWN0aXZlRm9ybUNvbmZpZy5wcm9wcy5wYXRofWA7XG4gICAgICBjb25zdCBmb3JtQ29uZmlnRnJvbVBhdGggPSBhd2FpdCB0aGlzLmZldGNoRm9ybUNvbmZpZyh1cmwpO1xuICAgICAgZm9ybUNvbmZpZyA9IHtcbiAgICAgICAgLi4uYWN0aXZlRm9ybUNvbmZpZyxcbiAgICAgICAgLi4uZm9ybUNvbmZpZ0Zyb21QYXRoXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoYWN0aXZlRm9ybUNvbmZpZywgXCJmaWVsZHNcIikpIHtcbiAgICAgIGZvcm1Db25maWcgPSBhY3RpdmVGb3JtQ29uZmlnO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBcIk5vIERpcmVjdCBVUkwsIE5vIFBhdGggd2l0aCBCYXNlIFVSTCwgTm8gZmllbGRzIGtleSBmb3VuZCBpbiBBY3RpdmUgRm9ybSdzIENvbmZpZyFcIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3JtQ29uZmlnID0gbmV3IENvbnZlcnRlcigpLnVwZGF0ZUZvcm1Db25maWdGcm9tVXNlckNvbmZpZyhcbiAgICAgIGZvcm1Db25maWcsXG4gICAgICB0aGlzLnVzZXJDb25maWdcbiAgICApO1xuXG4gICAgZm9ybUNvbmZpZyA9IG5ldyBDb252ZXJ0ZXIoKS51cGRhdGVGb3JtQ29uZmlnTWlzY2VsbGFuZW91cyhmb3JtQ29uZmlnLCB7XG4gICAgICBmb3Jtc0xpc3RMZW5ndGg6IHRoaXMuZmluZEZvcm1zTGlzdExlbmd0aCh0aGlzLmZvcm1zTGlzdClcbiAgICB9KTtcblxuICAgIHRoaXMuYWN0aXZlRm9ybUNvbmZpZyA9IG1lcmdlT2JqZWN0cyh7fSwgYWN0aXZlRm9ybUNvbmZpZywgZm9ybUNvbmZpZyk7XG5cbiAgICBzd2l0Y2ggKHRyaWdnZXJUeXBlKSB7XG4gICAgICBjYXNlIFwiQlVUVE9OX0NMSUNLXCI6XG4gICAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19GT1JNX09QRU5fQlVUVE9OX0NMSUNLLCB7XG4gICAgICAgICAgZm9ybV9rZXk6IHRoaXMuYWN0aXZlRm9ybUNvbmZpZy5rZXksXG4gICAgICAgICAgZm9ybV90aXRsZTpcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRm9ybUNvbmZpZz8udGl0bGUgPz8gdGhpcy5hY3RpdmVGb3JtQ29uZmlnPy5wcm9wcz8udGl0bGVcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy50cmlnZ2VyTG9ncyhFTG9nRXZlbnRUeXBlLkZPUk1fX0ZPUk1fT1BFTl9BVVRPLCB7XG4gICAgICAgICAgZm9ybV9rZXk6IHRoaXMuYWN0aXZlRm9ybUNvbmZpZy5rZXksXG4gICAgICAgICAgZm9ybV90aXRsZTpcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRm9ybUNvbmZpZz8udGl0bGUgPz8gdGhpcy5hY3RpdmVGb3JtQ29uZmlnPy5wcm9wcz8udGl0bGVcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggPCA2MDApIHtcbiAgICAgIHRoaXMuc2hvd0Zvcm1TZWN0aW9ucyA9IGZhbHNlO1xuICAgICAgdGhpcy5zaG93Rm9ybUZpZWxkcyA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggPj0gNjAwKSB7XG4gICAgICB0aGlzLnNob3dGb3JtU2VjdGlvbnMgPSB0cnVlO1xuICAgICAgdGhpcy5zaG93Rm9ybUZpZWxkcyA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5zaG93Rm9ybSA9IHRydWU7XG4gICAgdGhpcy50b2dnbGVMb2FkZXIoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1WaWV3IC0gTGlzdGVucyB0byBldmVudCBvZiBleGVjdXRpbmcgYW4gQVBJIGNhbGwgZnJvbSB3aXRoaW4gdGhlIEZvcm1WaWV3IGFuZCBlbWl0cyAocmVhZCBhcyBwYXNzZXMpIHRoZSBzYW1lIGV2ZW50IHRvIHRoZSBsaWJyYXJ5IGNvbnN1bWVyLlxuICAgKiBAcGFyYW0gZSBhbnlcbiAgICovXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlR2V0VW5zYXZlZFN0YXRlKGU6IGFueSkge1xuICAgIHRoaXMuaXNVbnNhdmVkRGF0YSA9IGU7XG4gIH1cblxuICBoYW5kbGVPbkNsaWNrQXBpQ2FsbChlOiBhbnkpIHtcbiAgICB0aGlzLm9uQ2xpY2tBcGlDYWxsLmVtaXQoZSk7XG4gIH1cblxuICBoYW5kbGVPbkNsaWNrVmlld0ZpbGUoZTogYW55KSB7XG4gICAgdGhpcy5vbkNsaWNrVmlld0ZpbGUuZW1pdChlKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlT25DbGlja0Zvcm1GaWVsZEJ1dHRvbihlOiBhbnkpIHtcbiAgICB0aGlzLm9uQ2xpY2tGb3JtRmllbGRCdXR0b24uZW1pdChlKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlT25BY3Rpb25TaG93UG9wdXBGb3JtKGU6IGFueSwgY29udGVudDogYW55KSB7XG4gICAgaWYgKFxuICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZSwgXCJhY3RpdmVGb3JtRGF0YVwiKSAmJlxuICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoZSwgXCJwb3B1cEZvcm1Db25maWdcIilcbiAgICApIHtcbiAgICAgIGNvbnN0IHBvcHVwRm9ybURhdGEgPSB7IFt0aGlzLmFjdGl2ZUZvcm1Db25maWcua2V5XTogZS5hY3RpdmVGb3JtRGF0YSB9O1xuICAgICAgdGhpcy5hY3RpdmVQb3B1cEZvcm1EYXRhID0gbWVyZ2VPYmplY3RzKHRoaXMuYWxsRm9ybXNEYXRhLCBwb3B1cEZvcm1EYXRhKTtcblxuICAgICAgdGhpcy5wb3B1cEZvcm1Db25maWcgPSBlLnBvcHVwRm9ybUNvbmZpZztcbiAgICAgIGNvbnN0IHBvcHVwVHlwZSA9IGU/LnBvcHVwVHlwZSA/PyBcIkRJQUxPR1wiO1xuXG4gICAgICBzd2l0Y2ggKHBvcHVwVHlwZSkge1xuICAgICAgICBjYXNlIFwiRElBTE9HXCI6XG4gICAgICAgICAgdGhpcy5wcmV2aWV3RGlhbG9nUmVmID0gdGhpcy5kaWFsb2dzXG4gICAgICAgICAgICAub3Blbihjb250ZW50LCB7XG4gICAgICAgICAgICAgIGNsb3NlYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgZGlzbWlzc2libGU6IGZhbHNlLFxuICAgICAgICAgICAgICBzaXplOiBcInNcIixcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucG9wdXBGb3JtQ2FsbGJhY2sgPSB7XG4gICAgICAgICAgICAgICAgICBwb3B1cEZvcm1EYXRhOiBkYXRhLmRhdGEsXG4gICAgICAgICAgICAgICAgICBwb3B1cEZvcm1Db25maWc6IGRhdGEuZm9ybUNvbmZpZyxcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZUZvcm1Db25maWc6IHRoaXMuYWN0aXZlRm9ybUNvbmZpZ1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVQb3B1cEZvcm1EYXRhID0ge307XG4gICAgICAgICAgICAgICAgdGhpcy5wb3B1cEZvcm1Db25maWcgPSB7fTtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpZXdEaWFsb2dSZWYuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvcHVwRm9ybUNhbGxiYWNrID0ge1xuICAgICAgICAgICAgICAgICAgcG9wdXBGb3JtRGF0YToge30sXG4gICAgICAgICAgICAgICAgICBwb3B1cEZvcm1Db25maWc6IHRoaXMucG9wdXBGb3JtQ29uZmlnLFxuICAgICAgICAgICAgICAgICAgYWN0aXZlRm9ybUNvbmZpZzogdGhpcy5hY3RpdmVGb3JtQ29uZmlnLFxuICAgICAgICAgICAgICAgICAgc3RvcFRhc2tFeGVjdXRpb246IHRydWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlUG9wdXBGb3JtRGF0YSA9IHt9O1xuICAgICAgICAgICAgICAgIHRoaXMucG9wdXBGb3JtQ29uZmlnID0ge307XG5cbiAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oXCJEaWFsb2cgZXJyb3JcIik7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKFwiRGlhbG9nIGNsb3NlZFwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJQT1BVUFwiOlxuICAgICAgICAgIHRoaXMucHJldmlld0RpYWxvZ1JlZiA9IHRoaXMucHJldmlld0RpYWxvZ1NlcnZpY2VcbiAgICAgICAgICAgIC5vcGVuKHRoaXMucHJldmlldyB8fCBcIlwiKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvcHVwRm9ybUNhbGxiYWNrID0ge1xuICAgICAgICAgICAgICAgICAgcG9wdXBGb3JtRGF0YTogZGF0YS5kYXRhLFxuICAgICAgICAgICAgICAgICAgcG9wdXBGb3JtQ29uZmlnOiBkYXRhLmZvcm1Db25maWcsXG4gICAgICAgICAgICAgICAgICBhY3RpdmVGb3JtQ29uZmlnOiB0aGlzLmFjdGl2ZUZvcm1Db25maWdcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlUG9wdXBGb3JtRGF0YSA9IHt9O1xuICAgICAgICAgICAgICAgIHRoaXMucG9wdXBGb3JtQ29uZmlnID0ge307XG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2aWV3RGlhbG9nUmVmLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3B1cEZvcm1DYWxsYmFjayA9IHtcbiAgICAgICAgICAgICAgICAgIHBvcHVwRm9ybURhdGE6IHt9LFxuICAgICAgICAgICAgICAgICAgcG9wdXBGb3JtQ29uZmlnOiB0aGlzLnBvcHVwRm9ybUNvbmZpZyxcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZUZvcm1Db25maWc6IHRoaXMuYWN0aXZlRm9ybUNvbmZpZyxcbiAgICAgICAgICAgICAgICAgIHN0b3BUYXNrRXhlY3V0aW9uOiB0cnVlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVBvcHVwRm9ybURhdGEgPSB7fTtcbiAgICAgICAgICAgICAgICB0aGlzLnBvcHVwRm9ybUNvbmZpZyA9IHt9O1xuXG4gICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKFwiUHJldmlldyBlcnJvclwiKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgY29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oXCJQcmV2aWV3IGNsb3NlZFwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1WaWV3IC0gTGlzdGVucyB0byBldmVudCBvZiBnZXR0aW5nIHRoZSBBY3RpdmUgRm9ybSdzIERhdGEgd2hlbiB0aGUgRm9ybSBpcyBTYXZlZCBhbmQgZW1pdHMgKHJlYWQgYXMgcGFzc2VzKSB0aGUgc2FtZSBldmVudCB0byB0aGUgbGlicmFyeSBjb25zdW1lci5cbiAgICogQHBhcmFtIGUgYW55XG4gICAqL1xuICBAbG9nTWV0aG9kXG4gIGhhbmRsZU9uQ2xpY2tTYXZlRm9ybShcbiAgICBlOiBhbnksXG4gICAgZXZlbnRUeXBlOiBcIkZPUk1cIiB8IFwiUE9QVVBfRk9STVwiLFxuICAgIGNvbnRleHQ6IHVuZGVmaW5lZFxuICApIHtcbiAgICBzd2l0Y2ggKGV2ZW50VHlwZSkge1xuICAgICAgY2FzZSBcIkZPUk1cIjpcbiAgICAgICAgdGhpcy5pc1Vuc2F2ZWREYXRhID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9nZ2xlTG9hZGVyKHRydWUpO1xuXG4gICAgICAgIHRoaXMuZ2V0Rm9ybURhdGEuZW1pdCh7XG4gICAgICAgICAgW3RoaXMuYWN0aXZlRm9ybUNvbmZpZy5rZXldOiB7XG4gICAgICAgICAgICBmb3JtQ29uZmlnOiBlLmZvcm1Db25maWcsXG4gICAgICAgICAgICBkYXRhOiBlLmRhdGEsXG4gICAgICAgICAgICBleHRlbmRlZERhdGE6IGUuZXh0ZW5kZWREYXRhXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiUE9QVVBfRk9STVwiOlxuICAgICAgICB0aGlzLnByZXZpZXdEaWFsb2dSZWYubmV4dChlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9ybVZpZXcgLSBMaXN0ZW5zIHRvIGV2ZW50IG9mIHNob3dpbmcgdGhlIEZvcm1zIExpc3QgaW4gTW9iaWxlIFZpZXcuXG4gICAqIEBwYXJhbSBlIGFueVxuICAgKi9cbiAgaGFuZGxlT25DbGlja1ZpZXdGb3JtcyhlOiBhbnkpIHtcbiAgICB0aGlzLnNob3dGb3JtU2VjdGlvbnMgPSB0cnVlO1xuICAgIHRoaXMuc2hvd0Zvcm0gPSBmYWxzZTtcbiAgICB0aGlzLnNob3dGb3JtRmllbGRzID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgZXZlbnQgb2YgZ29pbmcgYmFjayB0byB0aGUgcHJldmlvdXMgZm9ybSBkaXJlY3RseSBvciBieSB0YWJiaW5nLCB3aXRob3V0IHNob3dpbmcgdGhlIGZvcm0gbGlzdCBpbiBtb2JpbGUgdmlldy5cbiAgICpcbiAgICogUHJlcmVxdWlzaXRlOiBUaGUgY3VycmVudCBmb3JtIGNhbiBuZXZlciBiZSBsb2NrZWQ7IGl0IHNob3VsZCBlaXRoZXIgYmUgaW4gYW4gZWRpdGFibGUgb3IgY29tcGxldGVkIHN0YXRlLlxuICAgKlxuICAgKiBMb2dpYzpcbiAgICogMS4gRm9yIERJUkVDVCBtb2RlLCBmaW5kIHRoZSBjb25maWcgb2YgdGhlIHByZXZpb3VzIGZvcm0gc3RhcnRpbmcgZnJvbSB0aGUgZmlyc3QgZm9ybSwgc3VjaCB0aGF0IHRoZSBwcmV2aW91cyBmb3JtIGlzIGVkaXRhYmxlIGFuZCBpdHMgc2VxdWVuY2UgbnVtYmVyIGlzIG9uZSBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgYWN0aXZlIGZvcm0ncyBzZXF1ZW5jZSBudW1iZXIuXG4gICAqICAgIElmIG5vIHByZXZpb3VzIGZvcm0gaXMgZm91bmQgb3IgYWxsIGZvcm1zIGhhdmUgYmVlbiBjb21wbGV0ZWQsIHNob3cgdGhlIGZvcm0gbGlzdC5cbiAgICogMi4gRm9yIFRBQkJFRCBtb2RlLCBmaW5kIHRoZSBjb25maWcgb2YgdGhlIHByZXZpb3VzIGZvcm0gaW4gdGhlIGxpc3QsIHN1Y2ggdGhhdCB0aGUgcHJldmlvdXMgZm9ybSdzIHNlcXVlbmNlIG51bWJlciBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgYWN0aXZlIGZvcm0ncyBzZXF1ZW5jZSBudW1iZXIgYW5kIHRoZSBmb3JtIGlzIGVkaXRhYmxlLlxuICAgKiAgICBJZiBubyBwcmV2aW91cyBmb3JtIGlzIGZvdW5kLCBzaG93IHRoZSBmb3JtIGxpc3QuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBlIC0gVGhlIGV2ZW50IG9iamVjdCBjb250YWluaW5nIHRoZSBtb2RlIHRvIGdvIGJhY2sgaW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlLm1vZGUgLSBUaGUgbW9kZSBvZiBnb2luZyBiYWNrOiBESVJFQ1Qgb3IgVEFCQkVELlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlT25DbGlja0dvQmFjayhlOiBhbnkpIHtcbiAgICBzd2l0Y2ggKGUubW9kZSkge1xuICAgICAgY2FzZSBFRm9ybVZpZXdHb0JhY2tNb2RlLkRJUkVDVDpcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRm9ybUNvbmZpZy5zZXF1ZW5jZU5vID09PSAxKSB7XG4gICAgICAgICAgdGhpcy5zaG93Rm9ybVNlY3Rpb25zID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnNob3dGb3JtID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5zaG93Rm9ybUZpZWxkcyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHRoaXMuY2hlY2tJZkZvcm1zU3RhdHVzQ29tcGxldGVkKFxuICAgICAgICAgICAgdGhpcy5mb3Jtc0xpc3QsXG4gICAgICAgICAgICB0aGlzLmZvcm1zTGlzdENvbXBsZXRlZFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5zaG93Rm9ybVNlY3Rpb25zID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnNob3dGb3JtID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5zaG93Rm9ybUZpZWxkcyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHByZXZpb3VzRm9ybUNvbmZpZ0RpcmVjdCA9IHRoaXMuZm9ybXNMaXN0LmZpbmQoKGZvcm0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIGZvcm0uc2VxdWVuY2VObyA9PT0gdGhpcy5hY3RpdmVGb3JtQ29uZmlnLnNlcXVlbmNlTm8gLSAxICYmXG4gICAgICAgICAgICAgIGZvcm0uc3RhdHVzICE9PSBFRm9ybXNMaXN0U3RhdHVzLkxPQ0tFRFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChwcmV2aW91c0Zvcm1Db25maWdEaXJlY3QpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlT25DbGlja1NldEFjdGl2ZUZvcm0oXG4gICAgICAgICAgICAgIHByZXZpb3VzRm9ybUNvbmZpZ0RpcmVjdC5rZXksXG4gICAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRUZvcm1WaWV3R29CYWNrTW9kZS5UQUJCRUQ6IHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNGb3JtQ29uZmlnID0gdGhpcy5mb3Jtc0xpc3QuZmluZCgoZm9ybSkgPT4ge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBmb3JtLnNlcXVlbmNlTm8gPCB0aGlzLmFjdGl2ZUZvcm1Db25maWcuc2VxdWVuY2VObyAmJlxuICAgICAgICAgICAgZm9ybS5zdGF0dXMgPT09IEVGb3Jtc0xpc3RTdGF0dXMuRURJVEFCTEVcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocHJldmlvdXNGb3JtQ29uZmlnKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVPbkNsaWNrU2V0QWN0aXZlRm9ybShwcmV2aW91c0Zvcm1Db25maWcua2V5LCB1bmRlZmluZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2hvd0Zvcm1TZWN0aW9ucyA9IHRydWU7XG4gICAgICAgICAgdGhpcy5zaG93Rm9ybSA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuc2hvd0Zvcm1GaWVsZHMgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtTGlzdCAtIExpc3RlbnMgdG8gZXZlbnQgb2Ygc3VibWl0dGluZyBhbGwgdGhlIGZvcm1zIGFuZCBtb3Zpbmcgb3V0IG9mIHRoZSBsaWJyYXJ5IGFuZCBhbHNvIGhhbmRsZXMgdGhlIHZhbGlkYXRpb24gb2YgYWxsIHRoZSBmb3Jtcy5cbiAgICogQHBhcmFtIGUgYW55XG4gICAqL1xuICBAbG9nTWV0aG9kXG4gIGFzeW5jIGhhbmRsZU9uQ2xpY2tTdWJtaXRGb3JtcyhlOiBhbnkpIHtcbiAgICBjb25zdCBmb3Jtc0xpc3Q6IGFueVtdID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmZvcm1zTGlzdCkpO1xuXG4gICAgbGV0IGZpcnN0Rm9ybVdpdGhFcnJvciA9IFwiXCI7XG4gICAgZm9yIChjb25zdCBmb3JtIG9mIGZvcm1zTGlzdCkge1xuICAgICAgaWYgKFxuICAgICAgICAhZm9ybS5oaWRkZW4gJiZcbiAgICAgICAgZm9ybS50eXBlICE9PSBFRm9ybVR5cGUuSFRNTCAmJlxuICAgICAgICBmb3JtLnJlcXVpcmVkICYmXG4gICAgICAgIGZvcm0uc3RhdHVzICE9PSBFRm9ybXNMaXN0U3RhdHVzLkNPTVBMRVRFRFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMudHJpZ2dlckxvZ3MoRUxvZ0V2ZW50VHlwZS5GT1JNX19TVUJNSVRfRk9STV9CVVRUT05fQ0xJQ0tfSU5WQUxJRCwge1xuICAgICAgICAgIGZvcm1fa2V5OiBmb3JtLmtleSxcbiAgICAgICAgICBmb3JtX3RpdGxlOiBmb3JtPy50aXRsZSA/PyBmb3JtPy5wcm9wcz8udGl0bGUsXG4gICAgICAgICAgZm9ybV9zdGF0dXM6IGZvcm0uc3RhdHVzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChpc0VtcHR5VmFsdWUoZmlyc3RGb3JtV2l0aEVycm9yKSkge1xuICAgICAgICAgIGZpcnN0Rm9ybVdpdGhFcnJvciA9IGZvcm0ua2V5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzTm90RW1wdHlWYWx1ZShmaXJzdEZvcm1XaXRoRXJyb3IpKSB7XG4gICAgICB0aGlzLnRvZ2dsZUVycm9yTm90aWZpY2F0aW9uKHRydWUpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMudG9nZ2xlRXJyb3JOb3RpZmljYXRpb24oZmFsc2UpO1xuICAgICAgfSwgMzAwMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vbkNsaWNrU3VibWl0LmVtaXQoZSk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGhhbmRsZUdldExvZ3MoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuZ2V0TG9ncy5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNaXNjZWxsYW5lb3VzIE1ldGhvZHNcbiAgICovXG4gIGhhbmRsZVJlc2l6ZShmb3Jtc0xpc3Q6IGFueVtdKSB7XG4gICAgaWYgKHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCA8IDYwMCkge1xuICAgICAgY29uc3QgaXNTaW5nbGVGb3JtID0gKGZvcm1zTGlzdDogYW55W10pOiBib29sZWFuID0+IHtcbiAgICAgICAgcmV0dXJuIGZvcm1zTGlzdC5sZW5ndGggPT09IDE7XG4gICAgICB9O1xuICAgICAgaWYgKCFpc1NpbmdsZUZvcm0oZm9ybXNMaXN0KSkge1xuICAgICAgICB0aGlzLnNob3dGb3JtU2VjdGlvbnMgPSB0cnVlO1xuICAgICAgICB0aGlzLnNob3dGb3JtRmllbGRzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2hvd0Zvcm0gPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hvd0Zvcm1TZWN0aW9ucyA9IHRydWU7XG4gICAgICAgIHRoaXMuc2hvd0Zvcm1GaWVsZHMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaG93Rm9ybSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhpcy5pc01vYmlsZVZpZXcgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzTW9iaWxlVmlldyA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBuZ0NsYXNzPVwia3dpa2lkLXJlbmRlcmVyXCI+XG4gIDxkaXZcbiAgICBuZ0NsYXNzPVwia3dpa2lkLWxheW91dC1jb250YWluZXJcIlxuICAgICpuZ0lmPVwiIWxvYWRpbmdcIlxuICA+XG4gICAgPGRpdlxuICAgICAgbmdDbGFzcz1cImt3aWtpZC1zZWN0aW9ucy1jb250YWluZXJcIlxuICAgICAgKm5nSWY9XCJzaG93Rm9ybVNlY3Rpb25zXCJcbiAgICAgIGNsYXNzPVwiYWN0aXZlXCJcbiAgICAgIFtjbGFzcy5hY3RpdmVdPVwic2hvd0Zvcm1TZWN0aW9uc1wiXG4gICAgICBbY2xhc3MubW9iaWxlXT1cImlzTW9iaWxlVmlld1wiXG4gICAgPlxuICAgICAgPGt3aWtpZC1mb3Jtcy1saXN0XG4gICAgICAgIFtzaG93Rm9ybUZpZWxkc109XCJ0aGlzLnNob3dGb3JtRmllbGRzXCJcbiAgICAgICAgW2FjdGl2ZUZvcm1Db25maWddPVwidGhpcy5hY3RpdmVGb3JtQ29uZmlnXCJcbiAgICAgICAgW3VzZXJDb25maWddPVwidGhpcy51c2VyQ29uZmlnXCJcbiAgICAgICAgW3JlZHV4RGF0YV09XCJ0aGlzLnJlZHV4RGF0YVwiXG4gICAgICAgIFtmb3Jtc0xpc3RdPVwidGhpcy5mb3Jtc0xpc3RcIlxuICAgICAgICBbc3RlcENvbmZpZ109XCJ0aGlzLnN0ZXBDb25maWdcIlxuICAgICAgICBbaXNVbnNhdmVkRGF0YV09XCJ0aGlzLmlzVW5zYXZlZERhdGFcIlxuICAgICAgICBbZm9ybXNMaXN0Q29tcGxldGVkXT1cInRoaXMuZm9ybXNMaXN0Q29tcGxldGVkXCJcbiAgICAgICAgW2lzTW9iaWxlVmlld109XCJ0aGlzLmlzTW9iaWxlVmlld1wiXG4gICAgICAgIChnZXRMb2dzKT1cImhhbmRsZUdldExvZ3MoJGV2ZW50KVwiXG4gICAgICAgIChvbkNsaWNrU2V0QWN0aXZlRm9ybSk9XCJcbiAgICAgICAgICB0aGlzLmhhbmRsZU9uQ2xpY2tTZXRBY3RpdmVGb3JtKCRldmVudCwgJ0JVVFRPTl9DTElDSycpXG4gICAgICAgIFwiXG4gICAgICAgIChvbkNsaWNrU3VibWl0Rm9ybXMpPVwidGhpcy5oYW5kbGVPbkNsaWNrU3VibWl0Rm9ybXMoJGV2ZW50KVwiXG4gICAgICA+PC9rd2lraWQtZm9ybXMtbGlzdD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICBuZ0NsYXNzPVwia3dpa2lkLWZvcm1zLWNvbnRhaW5lclwiXG4gICAgICAqbmdJZj1cIlxuICAgICAgICB0aGlzLnNob3dGb3JtICYmXG4gICAgICAgIHRoaXMuc2hvd0Zvcm1GaWVsZHMgJiZcbiAgICAgICAgdGhpcy5hY3RpdmVGb3JtQ29uZmlnICE9PSB1bmRlZmluZWRcbiAgICAgIFwiXG4gICAgICBbY2xhc3MuYWN0aXZlXT1cInNob3dGb3JtRmllbGRzXCJcbiAgICAgIFtjbGFzcy5tb2JpbGVdPVwiaXNNb2JpbGVWaWV3XCJcbiAgICAgIFtAcGFuZWxJbk91dF1cbiAgICA+XG4gICAgICA8a3dpa2lkLWZvcm0tdmlld1xuICAgICAgICAqbmdJZj1cInRoaXMuYWN0aXZlRm9ybUNvbmZpZy50eXBlID09PSAnRk9STSdcIlxuICAgICAgICBbZm9ybUNvbmZpZ109XCJ0aGlzLmFjdGl2ZUZvcm1Db25maWdcIlxuICAgICAgICBbYWxsRm9ybXNEYXRhXT1cInRoaXMuYWxsRm9ybXNEYXRhXCJcbiAgICAgICAgW2V4dHJhRGF0YV09XCJleHRyYURhdGFcIlxuICAgICAgICBbcmVkdXhEYXRhXT1cInRoaXMucmVkdXhEYXRhXCJcbiAgICAgICAgW2lzTW9iaWxlVmlld109XCJ0aGlzLmlzTW9iaWxlVmlld1wiXG4gICAgICAgIFt1c2VyQ29uZmlnXT1cInRoaXMudXNlckNvbmZpZ1wiXG4gICAgICAgIFtzdGVwQ29uZmlnXT1cInRoaXMuc3RlcENvbmZpZ1wiXG4gICAgICAgIFtwb3B1cEZvcm1DYWxsYmFja109XCJ0aGlzLnBvcHVwRm9ybUNhbGxiYWNrXCJcbiAgICAgICAgW2FwaUNhbGxSZXNwb25zZV09XCJ0aGlzLmFwaUNhbGxSZXNwb25zZVwiXG4gICAgICAgIFtidXR0b25DbGlja1Jlc3BvbnNlXT1cInRoaXMuYnV0dG9uQ2xpY2tSZXNwb25zZVwiXG4gICAgICAgIChvbkNsaWNrRm9ybUZpZWxkQnV0dG9uKT1cImhhbmRsZU9uQ2xpY2tGb3JtRmllbGRCdXR0b24oJGV2ZW50KVwiXG4gICAgICAgIChnZXRVbnNhdmVkRGF0YVN0YXRlKT1cImhhbmRsZUdldFVuc2F2ZWRTdGF0ZSgkZXZlbnQpXCJcbiAgICAgICAgKG9uQ2xpY2tBcGlDYWxsKT1cImhhbmRsZU9uQ2xpY2tBcGlDYWxsKCRldmVudClcIlxuICAgICAgICAob25DbGlja1ZpZXdGaWxlKT1cImhhbmRsZU9uQ2xpY2tWaWV3RmlsZSgkZXZlbnQpXCJcbiAgICAgICAgKG9uQWN0aW9uU2hvd1BvcHVwRm9ybSk9XCJcbiAgICAgICAgICB0aGlzLmhhbmRsZU9uQWN0aW9uU2hvd1BvcHVwRm9ybSgkZXZlbnQsIGNvbnRlbnQpXG4gICAgICAgIFwiXG4gICAgICAgIChvbkNsaWNrR29CYWNrKT1cInRoaXMuaGFuZGxlT25DbGlja0dvQmFjaygkZXZlbnQpXCJcbiAgICAgICAgKG9uQ2xpY2tWaWV3Rm9ybXMpPVwidGhpcy5oYW5kbGVPbkNsaWNrVmlld0Zvcm1zKCRldmVudClcIlxuICAgICAgICAoZ2V0TG9ncyk9XCJoYW5kbGVHZXRMb2dzKCRldmVudClcIlxuICAgICAgICAob25DbGlja1NhdmVGb3JtKT1cIlxuICAgICAgICAgIHRoaXMuaGFuZGxlT25DbGlja1NhdmVGb3JtKCRldmVudCwgJ0ZPUk0nLCB1bmRlZmluZWQpXG4gICAgICAgIFwiXG4gICAgICA+PC9rd2lraWQtZm9ybS12aWV3PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48a3dpa3VpLWxvYWRlcj48L2t3aWt1aS1sb2FkZXI+XG5cbjx0dWktcHVzaFxuICBpZD1cImVycm9yLW5vdGlmaWNhdGlvblwiXG4gICp0dWlQdXNoPVwic2hvd0Vycm9yTm90aWZpY2F0aW9uXCJcbiAgaGVhZGluZz1cIlBsZWFzZSBjb21wbGV0ZSB0aGUgcmVxdWlyZWQgRm9ybXMhXCJcbiAgdHlwZT1cIkVycm9yXCJcbiAgKGNsb3NlKT1cInRvZ2dsZUVycm9yTm90aWZpY2F0aW9uKGZhbHNlKVwiXG4+XG4gIDx0dWktc3ZnXG4gICAgc3JjPVwidHVpSWNvblhDaXJjbGVcIlxuICAgIHN0eWxlPVwiY29sb3I6ICNmZmYgIWltcG9ydGFudFwiXG4gID5cbiAgPC90dWktc3ZnPlxuPC90dWktcHVzaD5cbjxuZy10ZW1wbGF0ZVxuICAjcHJldmlld1xuICBsZXQtcHJldmlld1xuPlxuICA8dHVpLXByZXZpZXdcbiAgICBbcm90YXRhYmxlXT1cImZhbHNlXCJcbiAgICBbem9vbWFibGVdPVwiZmFsc2VcIlxuICAgIGNsYXNzPVwicHJldmlldy1jb250YWluZXJcIlxuICAgICpuZ0lmPVwicG9wdXBGb3JtQ29uZmlnXCJcbiAgPlxuICAgIDx0dWktcHJldmlldy10aXRsZSAqbmdJZj1cInByZXZpZXdQcm9wZXJ0aWVzLnRpdGxlICE9PSAnJ1wiPnt7XG4gICAgICBwcmV2aWV3UHJvcGVydGllcy50aXRsZVxuICAgIH19PC90dWktcHJldmlldy10aXRsZT5cblxuICAgIDxkaXYgY2xhc3M9XCJrd2lraWQtZm9ybS12aWV3LXBvcHVwLWNvbnRhaW5lclwiPlxuICAgICAgPGt3aWtpZC1mb3JtLXZpZXdcbiAgICAgICAgW2Zvcm1EYXRhXT1cImFjdGl2ZVBvcHVwRm9ybURhdGFcIlxuICAgICAgICBbZm9ybUNvbmZpZ109XCJwb3B1cEZvcm1Db25maWdcIlxuICAgICAgICBbYWxsRm9ybXNEYXRhXT1cImFsbEZvcm1zRGF0YVwiXG4gICAgICAgIFtleHRyYURhdGFdPVwiZXh0cmFEYXRhXCJcbiAgICAgICAgW3JlZHV4RGF0YV09XCJ0aGlzLnJlZHV4RGF0YVwiXG4gICAgICAgIFt1c2VyQ29uZmlnXT1cInRoaXMudXNlckNvbmZpZ1wiXG4gICAgICAgIFtzdGVwQ29uZmlnXT1cInRoaXMuc3RlcENvbmZpZ1wiXG4gICAgICAgIFtpc01vYmlsZVZpZXddPVwidGhpcy5pc01vYmlsZVZpZXdcIlxuICAgICAgICBbYXBpQ2FsbFJlc3BvbnNlXT1cInRoaXMuYXBpQ2FsbFJlc3BvbnNlXCJcbiAgICAgICAgW2J1dHRvbkNsaWNrUmVzcG9uc2VdPVwidGhpcy5idXR0b25DbGlja1Jlc3BvbnNlXCJcbiAgICAgICAgKG9uQ2xpY2tGb3JtRmllbGRCdXR0b24pPVwiaGFuZGxlT25DbGlja0Zvcm1GaWVsZEJ1dHRvbigkZXZlbnQpXCJcbiAgICAgICAgKGdldFNhdmVkU3RhdGUpPVwiaGFuZGxlR2V0VW5zYXZlZFN0YXRlKCRldmVudClcIlxuICAgICAgICAob25DbGlja0FwaUNhbGwpPVwiaGFuZGxlT25DbGlja0FwaUNhbGwoJGV2ZW50KVwiXG4gICAgICAgIChnZXRMb2dzKT1cImhhbmRsZUdldExvZ3MoJGV2ZW50KVwiXG4gICAgICAgIChvbkNsaWNrU2F2ZUZvcm0pPVwiXG4gICAgICAgICAgdGhpcy5oYW5kbGVPbkNsaWNrU2F2ZUZvcm0oJGV2ZW50LCAnUE9QVVBfRk9STScsIHVuZGVmaW5lZClcbiAgICAgICAgXCJcbiAgICAgID48L2t3aWtpZC1mb3JtLXZpZXc+XG4gICAgPC9kaXY+XG5cbiAgICA8YnV0dG9uXG4gICAgICB0dWlJY29uQnV0dG9uXG4gICAgICB0dWlQcmV2aWV3QWN0aW9uXG4gICAgICBpY29uPVwidHVpSWNvbkNsb3NlTGFyZ2VcIlxuICAgICAgdGl0bGU9XCJDbG9zZVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJwcmV2aWV3LmNvbXBsZXRlKClcIlxuICAgID48L2J1dHRvbj5cbiAgPC90dWktcHJldmlldz5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGVcbiAgI2NvbnRlbnRcbiAgbGV0LWNvbnRleHRcbj5cbiAgPGRpdiBjbGFzcz1cImt3aWtpZC1mb3JtLXZpZXctcG9wdXAtY29udGFpbmVyXCI+XG4gICAgPGt3aWtpZC1mb3JtLXZpZXdcbiAgICAgIFtmb3JtRGF0YV09XCJhY3RpdmVQb3B1cEZvcm1EYXRhXCJcbiAgICAgIFtmb3JtQ29uZmlnXT1cInBvcHVwRm9ybUNvbmZpZ1wiXG4gICAgICBbZXh0cmFEYXRhXT1cImV4dHJhRGF0YVwiXG4gICAgICBbYWxsRm9ybXNEYXRhXT1cImFsbEZvcm1zRGF0YVwiXG4gICAgICBbcmVkdXhEYXRhXT1cInRoaXMucmVkdXhEYXRhXCJcbiAgICAgIFt1c2VyQ29uZmlnXT1cInRoaXMudXNlckNvbmZpZ1wiXG4gICAgICBbc3RlcENvbmZpZ109XCJ0aGlzLnN0ZXBDb25maWdcIlxuICAgICAgW2lzTW9iaWxlVmlld109XCJ0aGlzLmlzTW9iaWxlVmlld1wiXG4gICAgICBbYXBpQ2FsbFJlc3BvbnNlXT1cInRoaXMuYXBpQ2FsbFJlc3BvbnNlXCJcbiAgICAgIFtidXR0b25DbGlja1Jlc3BvbnNlXT1cInRoaXMuYnV0dG9uQ2xpY2tSZXNwb25zZVwiXG4gICAgICAob25DbGlja0Zvcm1GaWVsZEJ1dHRvbik9XCJoYW5kbGVPbkNsaWNrRm9ybUZpZWxkQnV0dG9uKCRldmVudClcIlxuICAgICAgKGdldFNhdmVkU3RhdGUpPVwiaGFuZGxlR2V0VW5zYXZlZFN0YXRlKCRldmVudClcIlxuICAgICAgKG9uQ2xpY2tBcGlDYWxsKT1cImhhbmRsZU9uQ2xpY2tBcGlDYWxsKCRldmVudClcIlxuICAgICAgKGdldExvZ3MpPVwiaGFuZGxlR2V0TG9ncygkZXZlbnQpXCJcbiAgICAgIChvbkNsaWNrU2F2ZUZvcm0pPVwiXG4gICAgICAgIHRoaXMuaGFuZGxlT25DbGlja1NhdmVGb3JtKCRldmVudCwgJ1BPUFVQX0ZPUk0nLCBjb250ZXh0KVxuICAgICAgXCJcbiAgICA+PC9rd2lraWQtZm9ybS12aWV3PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=