atr-components 2.0.192 → 2.0.193

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.
@@ -567,11 +567,11 @@ export class AtrFormComponent {
567
567
  return false;
568
568
  }
569
569
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: AtrFormComponent, deps: [{ token: i1.ShareService }, { token: i2.HttpService }, { token: i3.UntypedFormBuilder }, { token: i4.DictService }, { token: i0.Injector }, { token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Component }); }
570
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.9", type: AtrFormComponent, selector: "atr-form", inputs: { formOpts: "formOpts" }, outputs: { formAction: "formAction", uploadAction: "uploadAction", quillChange: "quillChange" }, ngImport: i0, template: "<atr-view-form *ngIf=\"formOpts.type == 'view'\" [dicts]=\"dicts\" [atrForm]=\"atrForm\"\r\n [formOpts]=\"formOpts\"></atr-view-form>\r\n\r\n<form nz-form [formGroup]=\"atrForm\" *ngIf=\"formOpts.type != 'view'\">\r\n <div nz-row nzGutter=\"8\" nzType=\"flex\" nzAlign=\"top\">\r\n <ng-container *ngFor=\"let item of formOpts.items\">\r\n <div nz-col nzSpan=\"24\" class=\"form-title\" *ngIf=\"item.type == 'title'\">\r\n {{item.label}}\r\n </div>\r\n <div nz-col [nzSpan]=\"item.span\" *ngIf=\"isShow(item.isHidden,item.operator)\">\r\n <ng-content *ngTemplateOutlet=\"item.firstTemp\"></ng-content>\r\n <nz-form-item *ngIf=\"item.type != 'title'\">\r\n <nz-form-label [nzSm]=\"item.lspan\" [nzXs]=\"24\" [nzRequired]=\"isRequired(item)\">{{item.label}}</nz-form-label>\r\n <nz-form-control [nzSm]=\"item.cspan\" [nzXs]=\"24\">\r\n <div style=\"display: flex;width: 100%\">\r\n <nz-tree-select *ngIf=\"item.type == 'treeSelect'\"\r\n [nzNodes]=\"item.treeList\"\r\n nzShowSearch=\"true\"\r\n nzHideUnMatched=\"true\"\r\n nzPlaceHolder=\"{{item.placeholder}}\"\r\n [nzShowSearch]=\"true\"\r\n [formControlName]=\"item.key\"\r\n [nzAllowClear]=\"!item.notNull\"\r\n [nzMultiple]=\"item.selectUrl.isMultiple\"\r\n [nzDisabled]=\"item.readonly\"\r\n nzVirtualHeight=\"330px\"\r\n style=\"flex: 1\"\r\n >\r\n </nz-tree-select>\r\n <!-- <nz-tree-select *ngIf=\"item.type == 'treeSelect'\"\r\n [nzAllowClear]=\"!item.notNull\"\r\n [nzNodes]=\"item.treeList\"\r\n nzShowSearch=\"true\"\r\n nzHideUnMatched=\"true\"\r\n nzPlaceHolder=\"{{item.placeholder}}\"\r\n [nzShowSearch]=\"true\"\r\n [formControlName]=\"item.key\"\r\n [nzMultiple]=\"item.selectUrl.isMultiple\"\r\n [nzDisabled]=\"item.readonly\" style=\"flex: 1\"\r\n >\r\n </nz-tree-select> -->\r\n <app-select-icons *ngIf=\"item.type == 'selectIcon'\" nz-input placeholder=\"{{item.placeholder}}\"\r\n [readonly]=\"item.readonly \"\r\n style=\"flex: 1\"\r\n [formControlName]=\"item.key\">\r\n </app-select-icons>\r\n <input *ngIf=\"item.type == 'text'\" nz-input placeholder=\"{{item.placeholder}}\"\r\n (ngModelChange)=\"formChange($event,item)\"\r\n [readonly]=\"item.readonly || formOpts.type == 'view'\"\r\n [formControlName]=\"item.key\"/>\r\n <textarea *ngIf=\"item.type == 'textarea'\" nz-input [rows]=\"item.rows\" placeholder=\"{{item.placeholder}}\"\r\n [formControlName]=\"item.key\" [readonly]=\"item.readonly|| formOpts.type == 'view'\"></textarea>\r\n <nz-input-number *ngIf=\"item.type == 'number'\" nzPlaceHolder=\"{{item.placeholder}}\"\r\n [nzMin]=\"item.minNumber\" [nzMax]=\"item.maxNumber\"\r\n [formControlName]=\"item.key\"></nz-input-number>\r\n <nz-radio-group *ngIf=\"item.type == 'radio'\" [formControlName]=\"item.key\">\r\n <label nz-radio *ngFor=\"let o of item.dictList\" [nzValue]=\"o.value\">{{o.label}}</label>\r\n </nz-radio-group>\r\n <nz-checkbox-wrapper *ngIf=\"item.type == 'checkbox'\" [formControlName]=\"item.key\">\r\n <div nz-row>\r\n <div *ngFor=\"let o of item.dictList\" nz-col>\r\n <label nz-checkbox [nzValue]=\"o.value\">{{o.label}}</label></div>\r\n </div>\r\n </nz-checkbox-wrapper>\r\n <nz-select\r\n [nzShowSearch]=\"true\"\r\n *ngIf=\"item.type == 'select'\"\r\n nzPlaceHolder=\"{{item.placeholder}}\"\r\n nzAllowClear=\"true\"\r\n [formControlName]=\"item.key\"\r\n nzServerSearch\r\n [nzMode]=\"item.nzMode || 'default'\"\r\n nzDisabled=\"{{item.readonly|| formOpts.type == 'view'}}\"\r\n >\r\n <nz-option *ngFor=\"let o of dicts[item.dictCode]\" [nzLabel]=\"o.typeName\" [nzValue]=\"o.id\"></nz-option>\r\n </nz-select>\r\n <nz-select\r\n [nzShowSearch]=\"true\"\r\n *ngIf=\"item.type == 'selectc'\"\r\n nzPlaceHolder=\"{{item.placeholder}}\"\r\n nzAllowClear=\"true\"\r\n [formControlName]=\"item.key\"\r\n nzServerSearch\r\n [nzMode]=\"item.nzMode || 'default'\"\r\n nzDisabled=\"{{item.readonly|| formOpts.type == 'view'}}\"\r\n (ngModelChange)=\"selectChange($event,item)\"\r\n >\r\n <nz-option *ngFor=\"let o of item.dictList\" [nzLabel]=\"o.label\" [nzValue]=\"o.value\"></nz-option>\r\n </nz-select>\r\n <nz-cascader [nzDisabled]=\"item.readonly\" style=\"flex: 1\" [nzAllowClear]=\"!item.notNull\"\r\n [nzValueProperty]=\"'nzValueProperty'\"\r\n [nzShowSearch]=\"true\" *ngIf=\"item.type == 'cascader'\"\r\n [nzChangeOnSelect] = \"item.allowSelectNode\"\r\n [nzOptions]=\"item.dictList\" [formControlName]=\"item.key\"></nz-cascader>\r\n <nz-date-picker *ngIf=\"item.type == 'date'\" [nzFormat]=\"item.dateFormat ? item.dateFormat : 'yyyy-MM-dd'\"\r\n [nzShowTime]=\"showTime(item)\" style=\"flex: 1\"\r\n [nzDisabled]=\"formOpts.type == 'view' || item.readonly \"\r\n [formControlName]=\"item.key\"></nz-date-picker>\r\n <nz-range-picker *ngIf=\"item.type == 'dateRange'\" style=\"flex: 1\"\r\n [nzShowTime]=\"item.nzShowTime? item.nzShowTime : false\"\r\n [formControlName]=\"item.key\"\r\n [nzFormat]=\"item.nzShowTime && item.nzShowTime.nzFormat ? ('yyyy-MM-dd '+ item.nzShowTime.nzFormat) : 'yyyy-MM-dd'\"\r\n [nzPlaceHolder]=\"['\u5F00\u59CB\u65F6\u95F4', '\u7ED3\u675F\u65F6\u95F4']\"></nz-range-picker>\r\n\r\n <input *ngIf=\"item.type == 'image'\" nz-input [formControlName]=\"item.key\" [hidden]=\"true\"/>\r\n <atr-img-upload *ngIf=\"item.type == 'image'\" [(opts)]=\"item.imageOpts\"\r\n (onBeforeUpload)=\"onBeforeUpload($event,item)\"\r\n (afterChange)=\"imageUploadChange($event)\"></atr-img-upload>\r\n\r\n <!-- <editor *ngIf=\"item.type == 'editor'\" [formControlName]=\"item.key\" [config]=\"{initialFrameHeight:item.height}\" ></editor>-->\r\n <app-quill-editor *ngIf=\"item.type == 'editor'\" [formControlName]=\"item.key\" (ngModelChange)=\"editChange($event,item)\"\r\n [styles]=\"{height:item.height > 0 ? item.height + 'px' : '250px'}\"></app-quill-editor>\r\n <div *ngIf=\"item.type == 'word'\" [innerHTML]=\"item.value |defVal:item.defaultValue |safeHtml\">\r\n </div>\r\n <div *ngIf=\"item.type == 'buttons'\">\r\n <ng-container *ngFor=\"let btn of item.buttons\">\r\n <button nz-button type=\"button\" [nzType]=\"btn.btnType |defVal: 'default'\"\r\n class=\"ant-btn ant-btn-primary\"\r\n style=\"margin-right: 5px\" *ngIf=\"btn.isShow || isShow(false,btn.operator)\"\r\n (click)=\"doAction(btn,$event)\">\r\n <span>{{btn.name}}</span></button>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngFor=\"let valid of item.validators\">\r\n <ng-container *ngIf=\"atrForm.get(item.key).hasError(valid.type) && (atrForm.get(item.key).dirty )\">\r\n <div style=\"color:red; height: 15px;margin: 0;line-height: 15px;\">{{valid.errorLabel}}</div>\r\n </ng-container>\r\n </ng-container>\r\n <button nz-button nzType=\"default\" style=\"cursor: default;background-color: #fafafa;color: black\"\r\n *ngIf=\"item.ends\" disabled>\r\n {{item.ends}}\r\n </button>\r\n <button *ngIf=\"item.button?.isShow\" type=\"button\" class=\"ant-btn ant-btn-primary\"\r\n (click)=\"doAction(item.button,$event)\">\r\n <span>{{item.button.name}}</span></button>\r\n </div>\r\n <div *ngIf=\"item.proposal\" style=\"color: red;width: 100%\">{{item.proposal}}</div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <ng-content *ngTemplateOutlet=\"item.temp\"></ng-content>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n</form>\r\n", styles: [":host ::ng-deep .ant-form-item{margin:0 0 10px}:host ::ng-deep .ant-form-item-label{text-align:left}:host ::ng-deep nz-input-number{width:100%}:host .form-title{height:50px;line-height:50px;font-weight:500;font-size:20px;border-bottom:1px solid #e8e8e8;border-radius:4px 4px 0 0;margin-bottom:14px;margin-top:11px}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i6.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i7.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i8.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "component", type: i9.NzCascaderComponent, selector: "nz-cascader, [nz-cascader]", inputs: ["nzOptionRender", "nzShowInput", "nzShowArrow", "nzAllowClear", "nzAutoFocus", "nzChangeOnSelect", "nzDisabled", "nzColumnClassName", "nzExpandTrigger", "nzValueProperty", "nzLabelRender", "nzLabelProperty", "nzNotFoundContent", "nzSize", "nzBackdrop", "nzShowSearch", "nzPlaceHolder", "nzMenuClassName", "nzMenuStyle", "nzMouseEnterDelay", "nzMouseLeaveDelay", "nzStatus", "nzTriggerAction", "nzChangeOn", "nzLoadData", "nzSuffixIcon", "nzExpandIcon", "nzOptions"], outputs: ["nzVisibleChange", "nzSelectionChange", "nzSelect", "nzClear"], exportAs: ["nzCascader"] }, { kind: "component", type: i10.NzCheckboxComponent, selector: "[nz-checkbox]", inputs: ["nzValue", "nzAutoFocus", "nzDisabled", "nzIndeterminate", "nzChecked", "nzId"], outputs: ["nzCheckedChange"], exportAs: ["nzCheckbox"] }, { kind: "component", type: i10.NzCheckboxWrapperComponent, selector: "nz-checkbox-wrapper", outputs: ["nzOnChange"], exportAs: ["nzCheckboxWrapper"] }, { kind: "component", type: i11.NzDatePickerComponent, selector: "nz-date-picker,nz-week-picker,nz-month-picker,nz-year-picker,nz-range-picker", inputs: ["nzAllowClear", "nzAutoFocus", "nzDisabled", "nzBorderless", "nzInputReadOnly", "nzInline", "nzOpen", "nzDisabledDate", "nzLocale", "nzPlaceHolder", "nzPopupStyle", "nzDropdownClassName", "nzSize", "nzStatus", "nzFormat", "nzDateRender", "nzDisabledTime", "nzRenderExtraFooter", "nzShowToday", "nzMode", "nzShowNow", "nzRanges", "nzDefaultPickerValue", "nzSeparator", "nzSuffixIcon", "nzBackdrop", "nzId", "nzPlacement", "nzShowWeekNumber", "nzShowTime"], outputs: ["nzOnPanelChange", "nzOnCalendarChange", "nzOnOk", "nzOnOpenChange"], exportAs: ["nzDatePicker"] }, { kind: "directive", type: i11.NzRangePickerComponent, selector: "nz-range-picker", exportAs: ["nzRangePicker"] }, { kind: "directive", type: i12.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i12.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "directive", type: i13.NzFormDirective, selector: "[nz-form]", inputs: ["nzLayout", "nzNoColon", "nzAutoTips", "nzDisableAutoTips", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzForm"] }, { kind: "component", type: i13.NzFormItemComponent, selector: "nz-form-item", exportAs: ["nzFormItem"] }, { kind: "component", type: i13.NzFormLabelComponent, selector: "nz-form-label", inputs: ["nzFor", "nzRequired", "nzNoColon", "nzTooltipTitle", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzFormLabel"] }, { kind: "component", type: i13.NzFormControlComponent, selector: "nz-form-control", inputs: ["nzSuccessTip", "nzWarningTip", "nzErrorTip", "nzValidatingTip", "nzExtra", "nzAutoTips", "nzDisableAutoTips", "nzHasFeedback", "nzValidateStatus"], exportAs: ["nzFormControl"] }, { kind: "directive", type: i14.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i15.NzInputNumberComponent, selector: "nz-input-number", inputs: ["nzSize", "nzMin", "nzMax", "nzParser", "nzPrecision", "nzPrecisionMode", "nzPlaceHolder", "nzStatus", "nzStep", "nzInputMode", "nzId", "nzDisabled", "nzReadOnly", "nzAutoFocus", "nzBorderless", "nzFormatter"], outputs: ["nzBlur", "nzFocus"], exportAs: ["nzInputNumber"] }, { kind: "component", type: i16.NzRadioComponent, selector: "[nz-radio],[nz-radio-button]", inputs: ["nzValue", "nzDisabled", "nzAutoFocus"], exportAs: ["nzRadio"] }, { kind: "component", type: i16.NzRadioGroupComponent, selector: "nz-radio-group", inputs: ["nzDisabled", "nzButtonStyle", "nzSize", "nzName"], exportAs: ["nzRadioGroup"] }, { kind: "component", type: i17.NzOptionComponent, selector: "nz-option", inputs: ["nzTitle", "nzLabel", "nzValue", "nzKey", "nzDisabled", "nzHide", "nzCustomContent"], exportAs: ["nzOption"] }, { kind: "component", type: i17.NzSelectComponent, selector: "nz-select", inputs: ["nzId", "nzSize", "nzStatus", "nzOptionHeightPx", "nzOptionOverflowSize", "nzDropdownClassName", "nzDropdownMatchSelectWidth", "nzDropdownStyle", "nzNotFoundContent", "nzPlaceHolder", "nzPlacement", "nzMaxTagCount", "nzDropdownRender", "nzCustomTemplate", "nzSuffixIcon", "nzClearIcon", "nzRemoveIcon", "nzMenuItemSelectedIcon", "nzTokenSeparators", "nzMaxTagPlaceholder", "nzMaxMultipleCount", "nzMode", "nzFilterOption", "compareWith", "nzAllowClear", "nzBorderless", "nzShowSearch", "nzLoading", "nzAutoFocus", "nzAutoClearSearchValue", "nzServerSearch", "nzDisabled", "nzOpen", "nzSelectOnTab", "nzBackdrop", "nzOptions", "nzShowArrow"], outputs: ["nzOnSearch", "nzScrollToBottom", "nzOpenChange", "nzBlur", "nzFocus"], exportAs: ["nzSelect"] }, { kind: "component", type: i18.NzTreeSelectComponent, selector: "nz-tree-select", inputs: ["nzId", "nzAllowClear", "nzShowExpand", "nzShowLine", "nzDropdownMatchSelectWidth", "nzCheckable", "nzHideUnMatched", "nzShowIcon", "nzShowSearch", "nzDisabled", "nzAsyncData", "nzMultiple", "nzDefaultExpandAll", "nzCheckStrictly", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualHeight", "nzExpandedIcon", "nzNotFoundContent", "nzNodes", "nzOpen", "nzSize", "nzPlaceHolder", "nzDropdownStyle", "nzDropdownClassName", "nzBackdrop", "nzStatus", "nzPlacement", "nzExpandedKeys", "nzDisplayWith", "nzMaxTagCount", "nzMaxTagPlaceholder", "nzTreeTemplate"], outputs: ["nzOpenChange", "nzCleared", "nzRemoved", "nzExpandChange", "nzTreeClick", "nzTreeCheckBoxChange"], exportAs: ["nzTreeSelect"] }, { kind: "component", type: i19.QuillEditorComponent, selector: "app-quill-editor", inputs: ["placeholder", "styles", "value", "readOnly", "needImgSeq"] }, { kind: "component", type: i20.UploadComponent, selector: "atr-img-upload", inputs: ["opts", "isEdit", "allowChangSeq", "showUploadList"], outputs: ["afterChange", "optsChange", "onBeforeUpload"] }, { kind: "component", type: i21.SelectIconsComponent, selector: "app-select-icons", inputs: ["readonly", "placeholder"] }, { kind: "component", type: i22.ViewFormComponent, selector: "atr-view-form", inputs: ["formOpts", "atrForm", "dicts", "items"] }, { kind: "pipe", type: i23.DefaultValPipe, name: "defVal" }, { kind: "pipe", type: i24.SafeHtmlPipe, name: "safeHtml" }] }); }
570
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.9", type: AtrFormComponent, selector: "atr-form", inputs: { formOpts: "formOpts" }, outputs: { formAction: "formAction", uploadAction: "uploadAction", quillChange: "quillChange" }, ngImport: i0, template: "<atr-view-form *ngIf=\"formOpts.type == 'view'\" [dicts]=\"dicts\" [atrForm]=\"atrForm\"\r\n [formOpts]=\"formOpts\"></atr-view-form>\r\n\r\n<form nz-form [formGroup]=\"atrForm\" *ngIf=\"formOpts.type != 'view'\">\r\n <div nz-row nzGutter=\"8\" nzType=\"flex\" nzAlign=\"top\">\r\n <ng-container *ngFor=\"let item of formOpts.items\">\r\n <div nz-col nzSpan=\"24\" class=\"form-title\" *ngIf=\"item.type == 'title'\">\r\n {{item.label}}\r\n </div>\r\n <div nz-col [nzSpan]=\"item.span\" *ngIf=\"isShow(item.isHidden,item.operator)\">\r\n <ng-content *ngTemplateOutlet=\"item.firstTemp\"></ng-content>\r\n <nz-form-item *ngIf=\"item.type != 'title'\">\r\n <nz-form-label [nzSm]=\"item.lspan\" [nzXs]=\"24\" [nzRequired]=\"isRequired(item)\">{{item.label}}</nz-form-label>\r\n <nz-form-control [nzSm]=\"item.cspan\" [nzXs]=\"24\">\r\n <div style=\"display: flex;width: 100%\">\r\n <nz-tree-select *ngIf=\"item.type == 'treeSelect'\"\r\n [nzNodes]=\"item.treeList\"\r\n nzShowSearch=\"true\"\r\n nzHideUnMatched=\"true\"\r\n nzPlaceHolder=\"{{item.placeholder}}\"\r\n [nzShowSearch]=\"true\"\r\n [formControlName]=\"item.key\"\r\n [nzAllowClear]=\"!item.notNull\"\r\n [nzMultiple]=\"item.selectUrl.isMultiple\"\r\n [nzDisabled]=\"item.readonly\"\r\n nzVirtualHeight=\"330px\"\r\n style=\"flex: 1\"\r\n >\r\n </nz-tree-select>\r\n <!-- <nz-tree-select *ngIf=\"item.type == 'treeSelect'\"\r\n [nzAllowClear]=\"!item.notNull\"\r\n [nzNodes]=\"item.treeList\"\r\n nzShowSearch=\"true\"\r\n nzHideUnMatched=\"true\"\r\n nzPlaceHolder=\"{{item.placeholder}}\"\r\n [nzShowSearch]=\"true\"\r\n [formControlName]=\"item.key\"\r\n [nzMultiple]=\"item.selectUrl.isMultiple\"\r\n [nzDisabled]=\"item.readonly\" style=\"flex: 1\"\r\n >\r\n </nz-tree-select> -->\r\n <app-select-icons *ngIf=\"item.type == 'selectIcon'\" nz-input placeholder=\"{{item.placeholder}}\"\r\n [readonly]=\"item.readonly \"\r\n style=\"flex: 1\"\r\n [formControlName]=\"item.key\">\r\n </app-select-icons>\r\n <input *ngIf=\"item.type == 'text'\" nz-input placeholder=\"{{item.placeholder}}\"\r\n (ngModelChange)=\"formChange($event,item)\"\r\n [readonly]=\"item.readonly || formOpts.type == 'view'\"\r\n [formControlName]=\"item.key\"/>\r\n <textarea *ngIf=\"item.type == 'textarea'\" nz-input [rows]=\"item.rows\" placeholder=\"{{item.placeholder}}\"\r\n [formControlName]=\"item.key\" [readonly]=\"item.readonly|| formOpts.type == 'view'\"></textarea>\r\n <nz-input-number *ngIf=\"item.type == 'number'\" nzPlaceHolder=\"{{item.placeholder}}\"\r\n [nzMin]=\"item.minNumber\" [nzMax]=\"item.maxNumber\"\r\n [formControlName]=\"item.key\"></nz-input-number>\r\n <nz-radio-group *ngIf=\"item.type == 'radio'\" [formControlName]=\"item.key\">\r\n <label nz-radio *ngFor=\"let o of item.dictList\" [nzValue]=\"o.value\">{{o.label}}</label>\r\n </nz-radio-group>\r\n <nz-checkbox-wrapper *ngIf=\"item.type == 'checkbox'\" [formControlName]=\"item.key\">\r\n <div nz-row>\r\n <div *ngFor=\"let o of item.dictList\" nz-col>\r\n <label nz-checkbox [nzValue]=\"o.value\">{{o.label}}</label></div>\r\n </div>\r\n </nz-checkbox-wrapper>\r\n <nz-select\r\n [nzShowSearch]=\"true\"\r\n *ngIf=\"item.type == 'select'\"\r\n nzPlaceHolder=\"{{item.placeholder}}\"\r\n nzAllowClear=\"true\"\r\n [formControlName]=\"item.key\"\r\n nzServerSearch\r\n [nzMode]=\"item.nzMode || 'default'\"\r\n nzDisabled=\"{{item.readonly|| formOpts.type == 'view'}}\"\r\n >\r\n <nz-option *ngFor=\"let o of dicts[item.dictCode]\" [nzLabel]=\"o.typeName\" [nzValue]=\"o.id\"></nz-option>\r\n </nz-select>\r\n <nz-select\r\n [nzShowSearch]=\"true\"\r\n *ngIf=\"item.type == 'selectc'\"\r\n nzPlaceHolder=\"{{item.placeholder}}\"\r\n nzAllowClear=\"true\"\r\n [formControlName]=\"item.key\"\r\n nzServerSearch\r\n [nzMode]=\"item.nzMode || 'default'\"\r\n nzDisabled=\"{{item.readonly|| formOpts.type == 'view'}}\"\r\n (ngModelChange)=\"selectChange($event,item)\"\r\n >\r\n <nz-option *ngFor=\"let o of item.dictList\" [nzLabel]=\"o.label\" [nzValue]=\"o.value\"></nz-option>\r\n </nz-select>\r\n <nz-cascader [nzDisabled]=\"item.readonly\" style=\"flex: 1\" [nzAllowClear]=\"!item.notNull\"\r\n [nzShowSearch]=\"true\" *ngIf=\"item.type == 'cascader'\"\r\n [nzChangeOnSelect] = \"item.allowSelectNode\"\r\n [nzOptions]=\"item.dictList\" [formControlName]=\"item.key\"></nz-cascader>\r\n <nz-date-picker *ngIf=\"item.type == 'date'\" [nzFormat]=\"item.dateFormat ? item.dateFormat : 'yyyy-MM-dd'\"\r\n [nzShowTime]=\"showTime(item)\" style=\"flex: 1\"\r\n [nzDisabled]=\"formOpts.type == 'view' || item.readonly \"\r\n [formControlName]=\"item.key\"></nz-date-picker>\r\n <nz-range-picker *ngIf=\"item.type == 'dateRange'\" style=\"flex: 1\"\r\n [nzShowTime]=\"item.nzShowTime? item.nzShowTime : false\"\r\n [formControlName]=\"item.key\"\r\n [nzFormat]=\"item.nzShowTime && item.nzShowTime.nzFormat ? ('yyyy-MM-dd '+ item.nzShowTime.nzFormat) : 'yyyy-MM-dd'\"\r\n [nzPlaceHolder]=\"['\u5F00\u59CB\u65F6\u95F4', '\u7ED3\u675F\u65F6\u95F4']\"></nz-range-picker>\r\n\r\n <input *ngIf=\"item.type == 'image'\" nz-input [formControlName]=\"item.key\" [hidden]=\"true\"/>\r\n <atr-img-upload *ngIf=\"item.type == 'image'\" [(opts)]=\"item.imageOpts\"\r\n (onBeforeUpload)=\"onBeforeUpload($event,item)\"\r\n (afterChange)=\"imageUploadChange($event)\"></atr-img-upload>\r\n\r\n <!-- <editor *ngIf=\"item.type == 'editor'\" [formControlName]=\"item.key\" [config]=\"{initialFrameHeight:item.height}\" ></editor>-->\r\n <app-quill-editor *ngIf=\"item.type == 'editor'\" [formControlName]=\"item.key\" (ngModelChange)=\"editChange($event,item)\"\r\n [styles]=\"{height:item.height > 0 ? item.height + 'px' : '250px'}\"></app-quill-editor>\r\n <div *ngIf=\"item.type == 'word'\" [innerHTML]=\"item.value |defVal:item.defaultValue |safeHtml\">\r\n </div>\r\n <div *ngIf=\"item.type == 'buttons'\">\r\n <ng-container *ngFor=\"let btn of item.buttons\">\r\n <button nz-button type=\"button\" [nzType]=\"btn.btnType |defVal: 'default'\"\r\n class=\"ant-btn ant-btn-primary\"\r\n style=\"margin-right: 5px\" *ngIf=\"btn.isShow || isShow(false,btn.operator)\"\r\n (click)=\"doAction(btn,$event)\">\r\n <span>{{btn.name}}</span></button>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngFor=\"let valid of item.validators\">\r\n <ng-container *ngIf=\"atrForm.get(item.key).hasError(valid.type) && (atrForm.get(item.key).dirty )\">\r\n <div style=\"color:red; height: 15px;margin: 0;line-height: 15px;\">{{valid.errorLabel}}</div>\r\n </ng-container>\r\n </ng-container>\r\n <button nz-button nzType=\"default\" style=\"cursor: default;background-color: #fafafa;color: black\"\r\n *ngIf=\"item.ends\" disabled>\r\n {{item.ends}}\r\n </button>\r\n <button *ngIf=\"item.button?.isShow\" type=\"button\" class=\"ant-btn ant-btn-primary\"\r\n (click)=\"doAction(item.button,$event)\">\r\n <span>{{item.button.name}}</span></button>\r\n </div>\r\n <div *ngIf=\"item.proposal\" style=\"color: red;width: 100%\">{{item.proposal}}</div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <ng-content *ngTemplateOutlet=\"item.temp\"></ng-content>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n</form>\r\n", styles: [":host ::ng-deep .ant-form-item{margin:0 0 10px}:host ::ng-deep .ant-form-item-label{text-align:left}:host ::ng-deep nz-input-number{width:100%}:host .form-title{height:50px;line-height:50px;font-weight:500;font-size:20px;border-bottom:1px solid #e8e8e8;border-radius:4px 4px 0 0;margin-bottom:14px;margin-top:11px}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i6.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i7.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i8.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "component", type: i9.NzCascaderComponent, selector: "nz-cascader, [nz-cascader]", inputs: ["nzOptionRender", "nzShowInput", "nzShowArrow", "nzAllowClear", "nzAutoFocus", "nzChangeOnSelect", "nzDisabled", "nzColumnClassName", "nzExpandTrigger", "nzValueProperty", "nzLabelRender", "nzLabelProperty", "nzNotFoundContent", "nzSize", "nzBackdrop", "nzShowSearch", "nzPlaceHolder", "nzMenuClassName", "nzMenuStyle", "nzMouseEnterDelay", "nzMouseLeaveDelay", "nzStatus", "nzTriggerAction", "nzChangeOn", "nzLoadData", "nzSuffixIcon", "nzExpandIcon", "nzOptions"], outputs: ["nzVisibleChange", "nzSelectionChange", "nzSelect", "nzClear"], exportAs: ["nzCascader"] }, { kind: "component", type: i10.NzCheckboxComponent, selector: "[nz-checkbox]", inputs: ["nzValue", "nzAutoFocus", "nzDisabled", "nzIndeterminate", "nzChecked", "nzId"], outputs: ["nzCheckedChange"], exportAs: ["nzCheckbox"] }, { kind: "component", type: i10.NzCheckboxWrapperComponent, selector: "nz-checkbox-wrapper", outputs: ["nzOnChange"], exportAs: ["nzCheckboxWrapper"] }, { kind: "component", type: i11.NzDatePickerComponent, selector: "nz-date-picker,nz-week-picker,nz-month-picker,nz-year-picker,nz-range-picker", inputs: ["nzAllowClear", "nzAutoFocus", "nzDisabled", "nzBorderless", "nzInputReadOnly", "nzInline", "nzOpen", "nzDisabledDate", "nzLocale", "nzPlaceHolder", "nzPopupStyle", "nzDropdownClassName", "nzSize", "nzStatus", "nzFormat", "nzDateRender", "nzDisabledTime", "nzRenderExtraFooter", "nzShowToday", "nzMode", "nzShowNow", "nzRanges", "nzDefaultPickerValue", "nzSeparator", "nzSuffixIcon", "nzBackdrop", "nzId", "nzPlacement", "nzShowWeekNumber", "nzShowTime"], outputs: ["nzOnPanelChange", "nzOnCalendarChange", "nzOnOk", "nzOnOpenChange"], exportAs: ["nzDatePicker"] }, { kind: "directive", type: i11.NzRangePickerComponent, selector: "nz-range-picker", exportAs: ["nzRangePicker"] }, { kind: "directive", type: i12.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i12.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "directive", type: i13.NzFormDirective, selector: "[nz-form]", inputs: ["nzLayout", "nzNoColon", "nzAutoTips", "nzDisableAutoTips", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzForm"] }, { kind: "component", type: i13.NzFormItemComponent, selector: "nz-form-item", exportAs: ["nzFormItem"] }, { kind: "component", type: i13.NzFormLabelComponent, selector: "nz-form-label", inputs: ["nzFor", "nzRequired", "nzNoColon", "nzTooltipTitle", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzFormLabel"] }, { kind: "component", type: i13.NzFormControlComponent, selector: "nz-form-control", inputs: ["nzSuccessTip", "nzWarningTip", "nzErrorTip", "nzValidatingTip", "nzExtra", "nzAutoTips", "nzDisableAutoTips", "nzHasFeedback", "nzValidateStatus"], exportAs: ["nzFormControl"] }, { kind: "directive", type: i14.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i15.NzInputNumberComponent, selector: "nz-input-number", inputs: ["nzSize", "nzMin", "nzMax", "nzParser", "nzPrecision", "nzPrecisionMode", "nzPlaceHolder", "nzStatus", "nzStep", "nzInputMode", "nzId", "nzDisabled", "nzReadOnly", "nzAutoFocus", "nzBorderless", "nzFormatter"], outputs: ["nzBlur", "nzFocus"], exportAs: ["nzInputNumber"] }, { kind: "component", type: i16.NzRadioComponent, selector: "[nz-radio],[nz-radio-button]", inputs: ["nzValue", "nzDisabled", "nzAutoFocus"], exportAs: ["nzRadio"] }, { kind: "component", type: i16.NzRadioGroupComponent, selector: "nz-radio-group", inputs: ["nzDisabled", "nzButtonStyle", "nzSize", "nzName"], exportAs: ["nzRadioGroup"] }, { kind: "component", type: i17.NzOptionComponent, selector: "nz-option", inputs: ["nzTitle", "nzLabel", "nzValue", "nzKey", "nzDisabled", "nzHide", "nzCustomContent"], exportAs: ["nzOption"] }, { kind: "component", type: i17.NzSelectComponent, selector: "nz-select", inputs: ["nzId", "nzSize", "nzStatus", "nzOptionHeightPx", "nzOptionOverflowSize", "nzDropdownClassName", "nzDropdownMatchSelectWidth", "nzDropdownStyle", "nzNotFoundContent", "nzPlaceHolder", "nzPlacement", "nzMaxTagCount", "nzDropdownRender", "nzCustomTemplate", "nzSuffixIcon", "nzClearIcon", "nzRemoveIcon", "nzMenuItemSelectedIcon", "nzTokenSeparators", "nzMaxTagPlaceholder", "nzMaxMultipleCount", "nzMode", "nzFilterOption", "compareWith", "nzAllowClear", "nzBorderless", "nzShowSearch", "nzLoading", "nzAutoFocus", "nzAutoClearSearchValue", "nzServerSearch", "nzDisabled", "nzOpen", "nzSelectOnTab", "nzBackdrop", "nzOptions", "nzShowArrow"], outputs: ["nzOnSearch", "nzScrollToBottom", "nzOpenChange", "nzBlur", "nzFocus"], exportAs: ["nzSelect"] }, { kind: "component", type: i18.NzTreeSelectComponent, selector: "nz-tree-select", inputs: ["nzId", "nzAllowClear", "nzShowExpand", "nzShowLine", "nzDropdownMatchSelectWidth", "nzCheckable", "nzHideUnMatched", "nzShowIcon", "nzShowSearch", "nzDisabled", "nzAsyncData", "nzMultiple", "nzDefaultExpandAll", "nzCheckStrictly", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualHeight", "nzExpandedIcon", "nzNotFoundContent", "nzNodes", "nzOpen", "nzSize", "nzPlaceHolder", "nzDropdownStyle", "nzDropdownClassName", "nzBackdrop", "nzStatus", "nzPlacement", "nzExpandedKeys", "nzDisplayWith", "nzMaxTagCount", "nzMaxTagPlaceholder", "nzTreeTemplate"], outputs: ["nzOpenChange", "nzCleared", "nzRemoved", "nzExpandChange", "nzTreeClick", "nzTreeCheckBoxChange"], exportAs: ["nzTreeSelect"] }, { kind: "component", type: i19.QuillEditorComponent, selector: "app-quill-editor", inputs: ["placeholder", "styles", "value", "readOnly", "needImgSeq"] }, { kind: "component", type: i20.UploadComponent, selector: "atr-img-upload", inputs: ["opts", "isEdit", "allowChangSeq", "showUploadList"], outputs: ["afterChange", "optsChange", "onBeforeUpload"] }, { kind: "component", type: i21.SelectIconsComponent, selector: "app-select-icons", inputs: ["readonly", "placeholder"] }, { kind: "component", type: i22.ViewFormComponent, selector: "atr-view-form", inputs: ["formOpts", "atrForm", "dicts", "items"] }, { kind: "pipe", type: i23.DefaultValPipe, name: "defVal" }, { kind: "pipe", type: i24.SafeHtmlPipe, name: "safeHtml" }] }); }
571
571
  }
572
572
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: AtrFormComponent, decorators: [{
573
573
  type: Component,
574
- args: [{ selector: 'atr-form', template: "<atr-view-form *ngIf=\"formOpts.type == 'view'\" [dicts]=\"dicts\" [atrForm]=\"atrForm\"\r\n [formOpts]=\"formOpts\"></atr-view-form>\r\n\r\n<form nz-form [formGroup]=\"atrForm\" *ngIf=\"formOpts.type != 'view'\">\r\n <div nz-row nzGutter=\"8\" nzType=\"flex\" nzAlign=\"top\">\r\n <ng-container *ngFor=\"let item of formOpts.items\">\r\n <div nz-col nzSpan=\"24\" class=\"form-title\" *ngIf=\"item.type == 'title'\">\r\n {{item.label}}\r\n </div>\r\n <div nz-col [nzSpan]=\"item.span\" *ngIf=\"isShow(item.isHidden,item.operator)\">\r\n <ng-content *ngTemplateOutlet=\"item.firstTemp\"></ng-content>\r\n <nz-form-item *ngIf=\"item.type != 'title'\">\r\n <nz-form-label [nzSm]=\"item.lspan\" [nzXs]=\"24\" [nzRequired]=\"isRequired(item)\">{{item.label}}</nz-form-label>\r\n <nz-form-control [nzSm]=\"item.cspan\" [nzXs]=\"24\">\r\n <div style=\"display: flex;width: 100%\">\r\n <nz-tree-select *ngIf=\"item.type == 'treeSelect'\"\r\n [nzNodes]=\"item.treeList\"\r\n nzShowSearch=\"true\"\r\n nzHideUnMatched=\"true\"\r\n nzPlaceHolder=\"{{item.placeholder}}\"\r\n [nzShowSearch]=\"true\"\r\n [formControlName]=\"item.key\"\r\n [nzAllowClear]=\"!item.notNull\"\r\n [nzMultiple]=\"item.selectUrl.isMultiple\"\r\n [nzDisabled]=\"item.readonly\"\r\n nzVirtualHeight=\"330px\"\r\n style=\"flex: 1\"\r\n >\r\n </nz-tree-select>\r\n <!-- <nz-tree-select *ngIf=\"item.type == 'treeSelect'\"\r\n [nzAllowClear]=\"!item.notNull\"\r\n [nzNodes]=\"item.treeList\"\r\n nzShowSearch=\"true\"\r\n nzHideUnMatched=\"true\"\r\n nzPlaceHolder=\"{{item.placeholder}}\"\r\n [nzShowSearch]=\"true\"\r\n [formControlName]=\"item.key\"\r\n [nzMultiple]=\"item.selectUrl.isMultiple\"\r\n [nzDisabled]=\"item.readonly\" style=\"flex: 1\"\r\n >\r\n </nz-tree-select> -->\r\n <app-select-icons *ngIf=\"item.type == 'selectIcon'\" nz-input placeholder=\"{{item.placeholder}}\"\r\n [readonly]=\"item.readonly \"\r\n style=\"flex: 1\"\r\n [formControlName]=\"item.key\">\r\n </app-select-icons>\r\n <input *ngIf=\"item.type == 'text'\" nz-input placeholder=\"{{item.placeholder}}\"\r\n (ngModelChange)=\"formChange($event,item)\"\r\n [readonly]=\"item.readonly || formOpts.type == 'view'\"\r\n [formControlName]=\"item.key\"/>\r\n <textarea *ngIf=\"item.type == 'textarea'\" nz-input [rows]=\"item.rows\" placeholder=\"{{item.placeholder}}\"\r\n [formControlName]=\"item.key\" [readonly]=\"item.readonly|| formOpts.type == 'view'\"></textarea>\r\n <nz-input-number *ngIf=\"item.type == 'number'\" nzPlaceHolder=\"{{item.placeholder}}\"\r\n [nzMin]=\"item.minNumber\" [nzMax]=\"item.maxNumber\"\r\n [formControlName]=\"item.key\"></nz-input-number>\r\n <nz-radio-group *ngIf=\"item.type == 'radio'\" [formControlName]=\"item.key\">\r\n <label nz-radio *ngFor=\"let o of item.dictList\" [nzValue]=\"o.value\">{{o.label}}</label>\r\n </nz-radio-group>\r\n <nz-checkbox-wrapper *ngIf=\"item.type == 'checkbox'\" [formControlName]=\"item.key\">\r\n <div nz-row>\r\n <div *ngFor=\"let o of item.dictList\" nz-col>\r\n <label nz-checkbox [nzValue]=\"o.value\">{{o.label}}</label></div>\r\n </div>\r\n </nz-checkbox-wrapper>\r\n <nz-select\r\n [nzShowSearch]=\"true\"\r\n *ngIf=\"item.type == 'select'\"\r\n nzPlaceHolder=\"{{item.placeholder}}\"\r\n nzAllowClear=\"true\"\r\n [formControlName]=\"item.key\"\r\n nzServerSearch\r\n [nzMode]=\"item.nzMode || 'default'\"\r\n nzDisabled=\"{{item.readonly|| formOpts.type == 'view'}}\"\r\n >\r\n <nz-option *ngFor=\"let o of dicts[item.dictCode]\" [nzLabel]=\"o.typeName\" [nzValue]=\"o.id\"></nz-option>\r\n </nz-select>\r\n <nz-select\r\n [nzShowSearch]=\"true\"\r\n *ngIf=\"item.type == 'selectc'\"\r\n nzPlaceHolder=\"{{item.placeholder}}\"\r\n nzAllowClear=\"true\"\r\n [formControlName]=\"item.key\"\r\n nzServerSearch\r\n [nzMode]=\"item.nzMode || 'default'\"\r\n nzDisabled=\"{{item.readonly|| formOpts.type == 'view'}}\"\r\n (ngModelChange)=\"selectChange($event,item)\"\r\n >\r\n <nz-option *ngFor=\"let o of item.dictList\" [nzLabel]=\"o.label\" [nzValue]=\"o.value\"></nz-option>\r\n </nz-select>\r\n <nz-cascader [nzDisabled]=\"item.readonly\" style=\"flex: 1\" [nzAllowClear]=\"!item.notNull\"\r\n [nzValueProperty]=\"'nzValueProperty'\"\r\n [nzShowSearch]=\"true\" *ngIf=\"item.type == 'cascader'\"\r\n [nzChangeOnSelect] = \"item.allowSelectNode\"\r\n [nzOptions]=\"item.dictList\" [formControlName]=\"item.key\"></nz-cascader>\r\n <nz-date-picker *ngIf=\"item.type == 'date'\" [nzFormat]=\"item.dateFormat ? item.dateFormat : 'yyyy-MM-dd'\"\r\n [nzShowTime]=\"showTime(item)\" style=\"flex: 1\"\r\n [nzDisabled]=\"formOpts.type == 'view' || item.readonly \"\r\n [formControlName]=\"item.key\"></nz-date-picker>\r\n <nz-range-picker *ngIf=\"item.type == 'dateRange'\" style=\"flex: 1\"\r\n [nzShowTime]=\"item.nzShowTime? item.nzShowTime : false\"\r\n [formControlName]=\"item.key\"\r\n [nzFormat]=\"item.nzShowTime && item.nzShowTime.nzFormat ? ('yyyy-MM-dd '+ item.nzShowTime.nzFormat) : 'yyyy-MM-dd'\"\r\n [nzPlaceHolder]=\"['\u5F00\u59CB\u65F6\u95F4', '\u7ED3\u675F\u65F6\u95F4']\"></nz-range-picker>\r\n\r\n <input *ngIf=\"item.type == 'image'\" nz-input [formControlName]=\"item.key\" [hidden]=\"true\"/>\r\n <atr-img-upload *ngIf=\"item.type == 'image'\" [(opts)]=\"item.imageOpts\"\r\n (onBeforeUpload)=\"onBeforeUpload($event,item)\"\r\n (afterChange)=\"imageUploadChange($event)\"></atr-img-upload>\r\n\r\n <!-- <editor *ngIf=\"item.type == 'editor'\" [formControlName]=\"item.key\" [config]=\"{initialFrameHeight:item.height}\" ></editor>-->\r\n <app-quill-editor *ngIf=\"item.type == 'editor'\" [formControlName]=\"item.key\" (ngModelChange)=\"editChange($event,item)\"\r\n [styles]=\"{height:item.height > 0 ? item.height + 'px' : '250px'}\"></app-quill-editor>\r\n <div *ngIf=\"item.type == 'word'\" [innerHTML]=\"item.value |defVal:item.defaultValue |safeHtml\">\r\n </div>\r\n <div *ngIf=\"item.type == 'buttons'\">\r\n <ng-container *ngFor=\"let btn of item.buttons\">\r\n <button nz-button type=\"button\" [nzType]=\"btn.btnType |defVal: 'default'\"\r\n class=\"ant-btn ant-btn-primary\"\r\n style=\"margin-right: 5px\" *ngIf=\"btn.isShow || isShow(false,btn.operator)\"\r\n (click)=\"doAction(btn,$event)\">\r\n <span>{{btn.name}}</span></button>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngFor=\"let valid of item.validators\">\r\n <ng-container *ngIf=\"atrForm.get(item.key).hasError(valid.type) && (atrForm.get(item.key).dirty )\">\r\n <div style=\"color:red; height: 15px;margin: 0;line-height: 15px;\">{{valid.errorLabel}}</div>\r\n </ng-container>\r\n </ng-container>\r\n <button nz-button nzType=\"default\" style=\"cursor: default;background-color: #fafafa;color: black\"\r\n *ngIf=\"item.ends\" disabled>\r\n {{item.ends}}\r\n </button>\r\n <button *ngIf=\"item.button?.isShow\" type=\"button\" class=\"ant-btn ant-btn-primary\"\r\n (click)=\"doAction(item.button,$event)\">\r\n <span>{{item.button.name}}</span></button>\r\n </div>\r\n <div *ngIf=\"item.proposal\" style=\"color: red;width: 100%\">{{item.proposal}}</div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <ng-content *ngTemplateOutlet=\"item.temp\"></ng-content>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n</form>\r\n", styles: [":host ::ng-deep .ant-form-item{margin:0 0 10px}:host ::ng-deep .ant-form-item-label{text-align:left}:host ::ng-deep nz-input-number{width:100%}:host .form-title{height:50px;line-height:50px;font-weight:500;font-size:20px;border-bottom:1px solid #e8e8e8;border-radius:4px 4px 0 0;margin-bottom:14px;margin-top:11px}\n"] }]
574
+ args: [{ selector: 'atr-form', template: "<atr-view-form *ngIf=\"formOpts.type == 'view'\" [dicts]=\"dicts\" [atrForm]=\"atrForm\"\r\n [formOpts]=\"formOpts\"></atr-view-form>\r\n\r\n<form nz-form [formGroup]=\"atrForm\" *ngIf=\"formOpts.type != 'view'\">\r\n <div nz-row nzGutter=\"8\" nzType=\"flex\" nzAlign=\"top\">\r\n <ng-container *ngFor=\"let item of formOpts.items\">\r\n <div nz-col nzSpan=\"24\" class=\"form-title\" *ngIf=\"item.type == 'title'\">\r\n {{item.label}}\r\n </div>\r\n <div nz-col [nzSpan]=\"item.span\" *ngIf=\"isShow(item.isHidden,item.operator)\">\r\n <ng-content *ngTemplateOutlet=\"item.firstTemp\"></ng-content>\r\n <nz-form-item *ngIf=\"item.type != 'title'\">\r\n <nz-form-label [nzSm]=\"item.lspan\" [nzXs]=\"24\" [nzRequired]=\"isRequired(item)\">{{item.label}}</nz-form-label>\r\n <nz-form-control [nzSm]=\"item.cspan\" [nzXs]=\"24\">\r\n <div style=\"display: flex;width: 100%\">\r\n <nz-tree-select *ngIf=\"item.type == 'treeSelect'\"\r\n [nzNodes]=\"item.treeList\"\r\n nzShowSearch=\"true\"\r\n nzHideUnMatched=\"true\"\r\n nzPlaceHolder=\"{{item.placeholder}}\"\r\n [nzShowSearch]=\"true\"\r\n [formControlName]=\"item.key\"\r\n [nzAllowClear]=\"!item.notNull\"\r\n [nzMultiple]=\"item.selectUrl.isMultiple\"\r\n [nzDisabled]=\"item.readonly\"\r\n nzVirtualHeight=\"330px\"\r\n style=\"flex: 1\"\r\n >\r\n </nz-tree-select>\r\n <!-- <nz-tree-select *ngIf=\"item.type == 'treeSelect'\"\r\n [nzAllowClear]=\"!item.notNull\"\r\n [nzNodes]=\"item.treeList\"\r\n nzShowSearch=\"true\"\r\n nzHideUnMatched=\"true\"\r\n nzPlaceHolder=\"{{item.placeholder}}\"\r\n [nzShowSearch]=\"true\"\r\n [formControlName]=\"item.key\"\r\n [nzMultiple]=\"item.selectUrl.isMultiple\"\r\n [nzDisabled]=\"item.readonly\" style=\"flex: 1\"\r\n >\r\n </nz-tree-select> -->\r\n <app-select-icons *ngIf=\"item.type == 'selectIcon'\" nz-input placeholder=\"{{item.placeholder}}\"\r\n [readonly]=\"item.readonly \"\r\n style=\"flex: 1\"\r\n [formControlName]=\"item.key\">\r\n </app-select-icons>\r\n <input *ngIf=\"item.type == 'text'\" nz-input placeholder=\"{{item.placeholder}}\"\r\n (ngModelChange)=\"formChange($event,item)\"\r\n [readonly]=\"item.readonly || formOpts.type == 'view'\"\r\n [formControlName]=\"item.key\"/>\r\n <textarea *ngIf=\"item.type == 'textarea'\" nz-input [rows]=\"item.rows\" placeholder=\"{{item.placeholder}}\"\r\n [formControlName]=\"item.key\" [readonly]=\"item.readonly|| formOpts.type == 'view'\"></textarea>\r\n <nz-input-number *ngIf=\"item.type == 'number'\" nzPlaceHolder=\"{{item.placeholder}}\"\r\n [nzMin]=\"item.minNumber\" [nzMax]=\"item.maxNumber\"\r\n [formControlName]=\"item.key\"></nz-input-number>\r\n <nz-radio-group *ngIf=\"item.type == 'radio'\" [formControlName]=\"item.key\">\r\n <label nz-radio *ngFor=\"let o of item.dictList\" [nzValue]=\"o.value\">{{o.label}}</label>\r\n </nz-radio-group>\r\n <nz-checkbox-wrapper *ngIf=\"item.type == 'checkbox'\" [formControlName]=\"item.key\">\r\n <div nz-row>\r\n <div *ngFor=\"let o of item.dictList\" nz-col>\r\n <label nz-checkbox [nzValue]=\"o.value\">{{o.label}}</label></div>\r\n </div>\r\n </nz-checkbox-wrapper>\r\n <nz-select\r\n [nzShowSearch]=\"true\"\r\n *ngIf=\"item.type == 'select'\"\r\n nzPlaceHolder=\"{{item.placeholder}}\"\r\n nzAllowClear=\"true\"\r\n [formControlName]=\"item.key\"\r\n nzServerSearch\r\n [nzMode]=\"item.nzMode || 'default'\"\r\n nzDisabled=\"{{item.readonly|| formOpts.type == 'view'}}\"\r\n >\r\n <nz-option *ngFor=\"let o of dicts[item.dictCode]\" [nzLabel]=\"o.typeName\" [nzValue]=\"o.id\"></nz-option>\r\n </nz-select>\r\n <nz-select\r\n [nzShowSearch]=\"true\"\r\n *ngIf=\"item.type == 'selectc'\"\r\n nzPlaceHolder=\"{{item.placeholder}}\"\r\n nzAllowClear=\"true\"\r\n [formControlName]=\"item.key\"\r\n nzServerSearch\r\n [nzMode]=\"item.nzMode || 'default'\"\r\n nzDisabled=\"{{item.readonly|| formOpts.type == 'view'}}\"\r\n (ngModelChange)=\"selectChange($event,item)\"\r\n >\r\n <nz-option *ngFor=\"let o of item.dictList\" [nzLabel]=\"o.label\" [nzValue]=\"o.value\"></nz-option>\r\n </nz-select>\r\n <nz-cascader [nzDisabled]=\"item.readonly\" style=\"flex: 1\" [nzAllowClear]=\"!item.notNull\"\r\n [nzShowSearch]=\"true\" *ngIf=\"item.type == 'cascader'\"\r\n [nzChangeOnSelect] = \"item.allowSelectNode\"\r\n [nzOptions]=\"item.dictList\" [formControlName]=\"item.key\"></nz-cascader>\r\n <nz-date-picker *ngIf=\"item.type == 'date'\" [nzFormat]=\"item.dateFormat ? item.dateFormat : 'yyyy-MM-dd'\"\r\n [nzShowTime]=\"showTime(item)\" style=\"flex: 1\"\r\n [nzDisabled]=\"formOpts.type == 'view' || item.readonly \"\r\n [formControlName]=\"item.key\"></nz-date-picker>\r\n <nz-range-picker *ngIf=\"item.type == 'dateRange'\" style=\"flex: 1\"\r\n [nzShowTime]=\"item.nzShowTime? item.nzShowTime : false\"\r\n [formControlName]=\"item.key\"\r\n [nzFormat]=\"item.nzShowTime && item.nzShowTime.nzFormat ? ('yyyy-MM-dd '+ item.nzShowTime.nzFormat) : 'yyyy-MM-dd'\"\r\n [nzPlaceHolder]=\"['\u5F00\u59CB\u65F6\u95F4', '\u7ED3\u675F\u65F6\u95F4']\"></nz-range-picker>\r\n\r\n <input *ngIf=\"item.type == 'image'\" nz-input [formControlName]=\"item.key\" [hidden]=\"true\"/>\r\n <atr-img-upload *ngIf=\"item.type == 'image'\" [(opts)]=\"item.imageOpts\"\r\n (onBeforeUpload)=\"onBeforeUpload($event,item)\"\r\n (afterChange)=\"imageUploadChange($event)\"></atr-img-upload>\r\n\r\n <!-- <editor *ngIf=\"item.type == 'editor'\" [formControlName]=\"item.key\" [config]=\"{initialFrameHeight:item.height}\" ></editor>-->\r\n <app-quill-editor *ngIf=\"item.type == 'editor'\" [formControlName]=\"item.key\" (ngModelChange)=\"editChange($event,item)\"\r\n [styles]=\"{height:item.height > 0 ? item.height + 'px' : '250px'}\"></app-quill-editor>\r\n <div *ngIf=\"item.type == 'word'\" [innerHTML]=\"item.value |defVal:item.defaultValue |safeHtml\">\r\n </div>\r\n <div *ngIf=\"item.type == 'buttons'\">\r\n <ng-container *ngFor=\"let btn of item.buttons\">\r\n <button nz-button type=\"button\" [nzType]=\"btn.btnType |defVal: 'default'\"\r\n class=\"ant-btn ant-btn-primary\"\r\n style=\"margin-right: 5px\" *ngIf=\"btn.isShow || isShow(false,btn.operator)\"\r\n (click)=\"doAction(btn,$event)\">\r\n <span>{{btn.name}}</span></button>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngFor=\"let valid of item.validators\">\r\n <ng-container *ngIf=\"atrForm.get(item.key).hasError(valid.type) && (atrForm.get(item.key).dirty )\">\r\n <div style=\"color:red; height: 15px;margin: 0;line-height: 15px;\">{{valid.errorLabel}}</div>\r\n </ng-container>\r\n </ng-container>\r\n <button nz-button nzType=\"default\" style=\"cursor: default;background-color: #fafafa;color: black\"\r\n *ngIf=\"item.ends\" disabled>\r\n {{item.ends}}\r\n </button>\r\n <button *ngIf=\"item.button?.isShow\" type=\"button\" class=\"ant-btn ant-btn-primary\"\r\n (click)=\"doAction(item.button,$event)\">\r\n <span>{{item.button.name}}</span></button>\r\n </div>\r\n <div *ngIf=\"item.proposal\" style=\"color: red;width: 100%\">{{item.proposal}}</div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <ng-content *ngTemplateOutlet=\"item.temp\"></ng-content>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n</form>\r\n", styles: [":host ::ng-deep .ant-form-item{margin:0 0 10px}:host ::ng-deep .ant-form-item-label{text-align:left}:host ::ng-deep nz-input-number{width:100%}:host .form-title{height:50px;line-height:50px;font-weight:500;font-size:20px;border-bottom:1px solid #e8e8e8;border-radius:4px 4px 0 0;margin-bottom:14px;margin-top:11px}\n"] }]
575
575
  }], ctorParameters: () => [{ type: i1.ShareService }, { type: i2.HttpService }, { type: i3.UntypedFormBuilder }, { type: i4.DictService }, { type: i0.Injector }, { type: undefined, decorators: [{
576
576
  type: Inject,
577
577
  args: [LOCALE_ID]
@@ -584,4 +584,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImpor
584
584
  }], quillChange: [{
585
585
  type: Output
586
586
  }] } });
587
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvc2hhcmVkL2Zvcm0vZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvc2hhcmVkL2Zvcm0vZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFVLEtBQUssRUFBWSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDMUcsT0FBTyxFQUF1QyxrQkFBa0IsRUFBRSxVQUFVLEVBQWMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqSCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFHM0MsT0FBTyxFQUFDLGdCQUFnQixFQUFvRCxNQUFNLCtCQUErQixDQUFDO0FBRWxILE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFReEQsTUFBTSxPQUFPLGdCQUFnQjtJQVMzQiwyQ0FBMkM7SUFDM0MsWUFBb0IsWUFBMEIsRUFBVSxXQUF3QixFQUM1RCxFQUFzQixFQUFVLFdBQXdCLEVBQVUsUUFBa0IsRUFBNkIsTUFBYztRQUQvSCxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQzVELE9BQUUsR0FBRixFQUFFLENBQW9CO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQTZCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFUbkosVUFBSyxHQUFRLEVBQUUsQ0FBQztRQUdOLGVBQVUs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LElBQUksQ0FBQztTQUNiO1FBQ0QsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3hCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDeEIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzs4R0F2aEJVLGdCQUFnQiw4SkFXdUYsU0FBUztrR0FYaEgsZ0JBQWdCLG1MQ2hCN0IsczZTQWlKQTs7MkZEaklhLGdCQUFnQjtrQkFMNUIsU0FBUzsrQkFDRSxVQUFVOzswQkFldUYsTUFBTTsyQkFBQyxTQUFTO3lDQVBsSCxRQUFRO3NCQUFoQixLQUFLO2dCQUNJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIEluamVjdG9yLCBJbmplY3QsIExPQ0FMRV9JRCwgT3V0cHV0LCBFdmVudEVtaXR0ZXJ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1VudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Hcm91cCwgVW50eXBlZEZvcm1Db250cm9sLCBWYWxpZGF0b3JzLCBWYWxpZGF0b3JGbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge3RlbHBob25lVmFsaWRhdG9yfSBmcm9tICcuLi92YWxpZGF0b3JzL2F0ci12YWxpZHRvcnMnO1xyXG5pbXBvcnQge2Zvcm1hdERhdGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7U2hhcmVTZXJ2aWNlfSBmcm9tICcuLi9zaGFyZS5zZXJ2aWNlJztcclxuaW1wb3J0IHtlbnZpcm9ubWVudH0gZnJvbSBcIm5nLXpvcnJvLWFudGQvY29yZS9lbnZpcm9ubWVudHNcIjtcclxuaW1wb3J0IHthdHJfc3RhdGljX2RhdGFzLCBBdHJGb3JtRGV0YWlsLCBBdHJGb3JtT3B0LCBGb3JtQWN0aW9uLCBmb3JtQnV0dG9ufSBmcm9tIFwiLi4vLi4vLi4vY29yZS9iYXNlL2F0ci1jb21tb25cIjtcclxuaW1wb3J0IHtEaWN0U2VydmljZX0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvc2VydmljZXMvZGljdC9kaWN0LnNlcnZpY2VcIjtcclxuaW1wb3J0IHtUb29sc1V0aWx9IGZyb20gXCIuLi8uLi8uLi9jb3JlL3V0aWxzL1Rvb2xzVXRpbFwiO1xyXG5pbXBvcnQge0h0dHBTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9odHRwLnNlcnZpY2VcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXRyLWZvcm0nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9mb3JtLmNvbXBvbmVudC5sZXNzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEF0ckZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBkaWN0czogYW55ID0ge307XHJcbiAgYXRyRm9ybTogVW50eXBlZEZvcm1Hcm91cCB8IGFueTtcclxuICBASW5wdXQoKSBmb3JtT3B0czogQXRyRm9ybU9wdCB8IGFueTtcclxuICBAT3V0cHV0KCkgZm9ybUFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9ybUFjdGlvbj4oKTtcclxuICBAT3V0cHV0KCkgdXBsb2FkQWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIHF1aWxsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNoYXJlU2VydmljZTogU2hhcmVTZXJ2aWNlLCBwcml2YXRlIGh0dHBTZXJ2aWNlOiBIdHRwU2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIGZiOiBVbnR5cGVkRm9ybUJ1aWxkZXIsIHByaXZhdGUgZGljdFNlcnZpY2U6IERpY3RTZXJ2aWNlLCBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvciwgQEluamVjdChMT0NBTEVfSUQpIHByaXZhdGUgbG9jYWxlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuYXRyRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRMYXlvdXQoaXRlbTogYW55KSB7XHJcbiAgICBpZiAoIWl0ZW0ubHNwYW4pIHtcclxuICAgICAgaXRlbS5sc3BhbiA9IDI0O1xyXG4gICAgfVxyXG4gICAgaWYgKCFpdGVtLmNzcGFuKSB7XHJcbiAgICAgIGl0ZW0uY3NwYW4gPSAyNDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNlbGVjdENoYW5nZShldmVudDogTW91c2VFdmVudCwgaXRlbTogYW55KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikge1xyXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxyXG4gICAgfVxyXG4gICAgbGV0IGFjdGlvbjogRm9ybUFjdGlvbiA9IHtcclxuICAgICAgbmFtZTogaXRlbS5rZXksXHJcbiAgICAgIGNvZGU6ICdzZWxlY3RDaGFnbmUnLFxyXG4gICAgfTtcclxuICAgIHRoaXMuZm9ybUFjdGlvbi5lbWl0KGFjdGlvbik7XHJcbiAgfVxyXG4gIGZvcm1DaGFuZ2UoZXZlbnQ6IGFueSwgaXRlbTogYW55KXtcclxuICAgIHRoaXMuZm9ybUFjdGlvbi5lbWl0KCB7XHJcbiAgICAgIG5hbWU6ICdmb3JtQ2hhbmdlJyxcclxuICAgICAgY29kZTogaXRlbS5rZXksXHJcbiAgICB9KTtcclxuICB9XHJcbiAgZG9BY3Rpb24oaXRlbTogZm9ybUJ1dHRvbiwgZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSB7XHJcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXHJcbiAgICB9XHJcbiAgICBsZXQgYWN0aW9uOiBGb3JtQWN0aW9uID0ge1xyXG4gICAgICBuYW1lOiBpdGVtLm5hbWUsXHJcbiAgICAgIGNvZGU6IGl0ZW0uY29kZSxcclxuICAgIH07XHJcbiAgICB0aGlzLmZvcm1BY3Rpb24uZW1pdChhY3Rpb24pO1xyXG4gIH1cclxuXHJcbiAgc2V0VmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMuYXRyRm9ybS5nZXQoa2V5KT8uc2V0VmFsdWUodmFsdWUpO1xyXG4gIH1cclxuXHJcblxyXG4gIGdldERpY0xpc3QoaXRlbTogYW55KSB7XHJcbiAgICB0aGlzLnNoYXJlU2VydmljZS5nZXREaWNMaXN0KGl0ZW0pLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PSAyMDAgJiYgcmVzLml0ZW0pIHtcclxuICAgICAgICBpdGVtID0gcmVzLml0ZW1cclxuICAgICAgICB0aGlzLnJlc2V0Rm9ybSgpO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG5cclxuICB9XHJcblxyXG4gIGNvbnYoZGF0YXM6IGFueSwga2V5czogYW55KTogYW55IHtcclxuICAgIHJldHVybiBkYXRhcy5tYXAoKGNoaWxkOiBhbnkpID0+IHtcclxuICAgICAgbGV0IGl0ZW06IGFueSA9IHt9O1xyXG4gICAgICBpZiAoa2V5cykge1xyXG4gICAgICAgIGtleXMuZm9yRWFjaCgodjogYW55KSA9PiB7XHJcbiAgICAgICAgICBsZXQgdnMgPSB2LnNwbGl0KFwifFwiKTtcclxuICAgICAgICAgIGNoaWxkW3ZzWzBdXSA9IGNoaWxkW3ZzWzFdXTtcclxuICAgICAgICAgIGl0ZW1bdnNbMF1dID0gY2hpbGRbdnNbMV1dO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGl0ZW0gPSBjaGlsZDtcclxuICAgICAgfVxyXG4gICAgICBjaGlsZC5uelZhbHVlUHJvcGVydHkgPSBpdGVtO1xyXG4gICAgICBpZiAoY2hpbGQuY2hpbGRyZW4pIHtcclxuICAgICAgICBjaGlsZC5jaGlsZHJlbiA9IHRoaXMuY29udihjaGlsZC5jaGlsZHJlbiwga2V5cylcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjaGlsZC5pc0xlYWYgPSB0cnVlXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGNoaWxkO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldENhc2NhZGVyRGVmYXVsdFZhbHVlKGxpc3Q6IGFueSwgaW5kZXg6IGFueSwgdmFsdWU6IGFueSxrZXlOYW1lOmFueSkge1xyXG4gICAgbGlzdC5mb3JFYWNoKChkaWM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoZGljW2tleU5hbWVdID09IHZhbHVlW2luZGV4XVtrZXlOYW1lXSApe1xyXG4gICAgICAgIHZhbHVlW2luZGV4XSA9IHtsYWJlbDpkaWMubGFiZWwsdmFsdWU6ZGljLnZhbHVlfTtcclxuICAgICAgICBpZiAoZGljLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMuZ2V0Q2FzY2FkZXJEZWZhdWx0VmFsdWUoZGljLmNoaWxkcmVuLCBpbmRleCArIDEsIHZhbHVlLGtleU5hbWUpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIHZhbHVlXHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmICh0aGlzLmZvcm1PcHRzICYmIHRoaXMuZm9ybU9wdHMuaXRlbXMpIHtcclxuICAgICAgZm9yIChsZXQgaXRlbSBvZiB0aGlzLmZvcm1PcHRzLml0ZW1zKSB7XHJcbiAgICAgICAgLy8gdGhpcy5hdHJGb3JtLmFkZENvbnRyb2woaXRlbS5rZXksIG5ldyBGb3JtQ29udHJvbCgpKTtcclxuICAgICAgICB0aGlzLnJlc2V0TGF5b3V0KGl0ZW0pXHJcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5mb3JtT3B0cy50eXBlID09ICdhZGQnID8gaXRlbS5kZWZhdWx0VmFsdWUgOiBpdGVtLnZhbHVlO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHZhbHVlKTtcclxuICAgICAgICBpZiAoaXRlbS50eXBlID09ICdjaGVja2JveCcpIHtcclxuICAgICAgICAgIGlmICh0aGlzLmZvcm1PcHRzLnR5cGUgPT0gJ2FkZCcpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBpdGVtLmRpY3RMaXN0LmZpbHRlcigodjogYW55KSA9PiB2LmlzU2VsZWN0KS5tYXAoKGRpYzogYW55KSA9PiBkaWMudmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXRlbS50eXBlID09ICd0cmVlU2VsZWN0JyAmJiBpdGVtLnNlbGVjdFVybC51cmwpIHtcclxuICAgICAgICAgIGxldCBrZXlzID0gaXRlbS5zZWxlY3RVcmwuY29udmVydC5zcGxpdCgnLCcpO1xyXG4gICAgICAgICAgdGhpcy5odHRwU2VydmljZS5wb3N0KGl0ZW0uc2VsZWN0VXJsLnVybCwge30sIFRvb2xzVXRpbC5nZXRIdHRwT3B0aW9ucygpKS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgICAgaXRlbS50cmVlTGlzdCA9IHJlcy5kYXRhLmZpbHRlcigoY2hpbGQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGtleXMuZm9yRWFjaCgodjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdnMgPSB2LnNwbGl0KFwifFwiKTtcclxuICAgICAgICAgICAgICAgIGNoaWxkW3ZzWzBdXSA9IGNoaWxkW3ZzWzFdXTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpdGVtLnR5cGUgPT0gJ2Nhc2NhZGVyJyAmJiBpdGVtLnNlbGVjdFVybC51cmwpIHtcclxuICAgICAgICAgIGxldCBrZXlzOiBhbnkgPSBudWxsXHJcbiAgICAgICAgICBpZiAoaXRlbS5zZWxlY3RVcmwuY29udmVydCkge1xyXG4gICAgICAgICAgICBrZXlzID0gaXRlbS5zZWxlY3RVcmwuY29udmVydC5zcGxpdCgnLCcpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGV0IHZhbHVlU3RyTGlzdDphbnkgPSBbXVxyXG4gICAgICAgICAgaWYgKGl0ZW0uc2VsZWN0VXJsLnVybCkge1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0VXJsID0gaXRlbS5zZWxlY3RVcmw7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RVcmwuaG9zdCA9PSAnb3NzJykge1xyXG4gICAgICAgICAgICAgIHRoaXMuaHR0cFNlcnZpY2UuZ2V0T3NzKHNlbGVjdFVybC51cmwpLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5kaWN0TGlzdCA9IHRoaXMuY29udihKU09OLnBhcnNlKHJlcyksIGtleXMpXHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAvLyB2YWx1ZSA9IHRoaXMuZ2V0Q2FzY2FkZXJEZWZhdWx0VmFsdWUoaXRlbS5kaWN0TGlzdCwgMCwgdmFsdWUpXHJcbiAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uc2hvd0tleSl7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmdldENhc2NhZGVyRGVmYXVsdFZhbHVlKGl0ZW0uZGljdExpc3QsIDAsIHZhbHVlLGl0ZW0ua2V5TmFtZSlcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBmb3IobGV0IGl0ZW0gb2YgdmFsdWUpe1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyTGlzdC5wdXNoKGl0ZW0udmFsdWUpXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShpdGVtLmtleSx2YWx1ZVN0ckxpc3QpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLmh0dHBTZXJ2aWNlLnBvc3Qoc2VsZWN0VXJsLnVybCwge30sIFRvb2xzVXRpbC5nZXRIdHRwT3B0aW9ucygpKS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uZGljdExpc3QgPSB0aGlzLmNvbnYocmVzLmRhdGEsIGtleXMpXHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAvLyB2YWx1ZSA9IHRoaXMuZ2V0Q2FzY2FkZXJEZWZhdWx0VmFsdWUoaXRlbS5kaWN0TGlzdCwgMCwgdmFsdWUpXHJcbiAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uc2hvd0tleSl7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmdldENhc2NhZGVyRGVmYXVsdFZhbHVlKGl0ZW0uZGljdExpc3QsIDAsIHZhbHVlLGl0ZW0ua2V5TmFtZSlcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBmb3IobGV0IGl0ZW0gb2YgdmFsdWUpe1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyTGlzdC5wdXNoKGl0ZW0udmFsdWUpXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShpdGVtLmtleSx2YWx1ZVN0ckxpc3QpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpdGVtLnR5cGUgPT0gXCJzZWxlY3RcIikge1xyXG4gICAgICAgICAgdGhpcy5nZXREaWN0VmFsdWUoaXRlbS5kaWN0Q29kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpdGVtLnR5cGUgPT0gJ3NlbGVjdGMnKSB7XHJcbiAgICAgICAgICBpZiAoIWl0ZW0uZGljdExpc3QgfHwgKGl0ZW0uc2VsZWN0VXJsICYmIGl0ZW0uc2VsZWN0VXJsLmlnbm9yZURpY3RMaXN0KSkge1xyXG4gICAgICAgICAgICB0aGlzLmdldERpY0xpc3QoaXRlbSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpdGVtLnR5cGUgPT0gXCJ0ZXh0YXJlYVwiICYmICFpdGVtLnJvd3MpXHJcbiAgICAgICAgICBpdGVtLnJvd3MgPSA1O1xyXG4gICAgICAgIGlmIChpdGVtLnR5cGUgPT0gXCJpbWFnZVwiKSB7XHJcbiAgICAgICAgICBpdGVtLmltYWdlT3B0cy5rZXkgPSBpdGVtLmtleVxyXG4gICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGxldCBpbWFnZXM6IGFueSA9IFtdO1xyXG4gICAgICAgICAgICBsZXQgbGlzdCA9IHZhbHVlLnNwbGl0KFwiLFwiKTtcclxuICAgICAgICAgICAgZm9yIChsZXQga2V5IG9mIGxpc3QpIHtcclxuICAgICAgICAgICAgICBpbWFnZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBrZXk6IGtleSxcclxuICAgICAgICAgICAgICAgIHVpZDogXCItMVwiLFxyXG4gICAgICAgICAgICAgICAgdXJsOiBhdHJfc3RhdGljX2RhdGFzLk9TU19VUkwgKyBrZXlcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGl0ZW0uaW1hZ2VPcHRzLmltYWdlTGlzdCA9IGltYWdlcztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGl0ZW0udHlwZSA9PSAnZWRpdG9yJykge1xyXG4gICAgICAgICAgaWYgKCF2YWx1ZSkgdmFsdWUgPSBcIlwiXHJcbiAgICAgICAgICBpZiAoIWl0ZW0uaGVpZ2h0KVxyXG4gICAgICAgICAgICBpdGVtLmhlaWdodCA9IDMwMFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFpdGVtLnNwYW4pXHJcbiAgICAgICAgICBpdGVtLnNwYW4gPSA4XHJcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtLmlzUmVxdWlyZWQgIT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGl0ZW0uaXNSZXF1aXJlZCA9IGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB0ZW1wVmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IFtdO1xyXG4gICAgICAgIGlmIChpdGVtLnZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgIGZvciAobGV0IHZhbGlkYXRvciBvZiBpdGVtLnZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgaWYgKHZhbGlkYXRvci50eXBlID09IFwicmVxdWlyZWRcIikge1xyXG4gICAgICAgICAgICAgIGl0ZW0uaXNSZXF1aXJlZCA9IHRydWVcclxuICAgICAgICAgICAgICB0ZW1wVmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdG9yLnR5cGUgPT0gXCJlbWFpbFwiKSB7XHJcbiAgICAgICAgICAgICAgdGVtcFZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLmVtYWlsKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbGlkYXRvci50eXBlID09IFwibWF4bGVuZ3RoXCIpIHtcclxuICAgICAgICAgICAgICB0ZW1wVmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4TGVuZ3RoKHZhbGlkYXRvci5tYXhsZW5ndGggPyB2YWxpZGF0b3IubWF4bGVuZ3RoIDogMSkpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdG9yLnR5cGUgPT0gXCJtaW5sZW5ndGhcIikge1xyXG4gICAgICAgICAgICAgIHRlbXBWYWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgodmFsaWRhdG9yLm1pbmxlbmd0aCA/IHZhbGlkYXRvci5taW5sZW5ndGggOiAxKSlcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWxpZGF0b3IudHlwZSA9PSBcInRlbHBob25lXCIpIHtcclxuICAgICAgICAgICAgICB0ZW1wVmFsaWRhdG9ycy5wdXNoKHRlbHBob25lVmFsaWRhdG9yKCkpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdG9yLnR5cGUgPT0gXCJwYXR0ZXJuXCIpIHtcclxuICAgICAgICAgICAgICB0ZW1wVmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucGF0dGVybih2YWxpZGF0b3IucGF0dGVyblZhbHVlKSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZSA9IHt2YWx1ZTogdmFsdWUgIT0gdW5kZWZpbmVkID8gdmFsdWUgOiBudWxsLCBkaXNhYmxlZDogaXRlbS5kaXNhYmxlID8gaXRlbS5kaXNhYmxlIDogZmFsc2V9XHJcbiAgICAgICAgaWYgKHRlbXBWYWxpZGF0b3JzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRoaXMuYXRyRm9ybS5hZGRDb250cm9sKGl0ZW0ua2V5LCBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRlZmF1bHRWYWx1ZSwgdGVtcFZhbGlkYXRvcnMpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5hdHJGb3JtLmFkZENvbnRyb2woaXRlbS5rZXksIG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGVmYXVsdFZhbHVlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiIHRoaXMuYXRyRm9ybVwiLCB0aGlzLmF0ckZvcm0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb21wYXJlKHZhbHVlOiBhbnksIG9wZXJhdG9yOiBhbnksIHRhcmdldDogYW55KTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNSaWdodCA9IGZhbHNlO1xyXG4gICAgc3dpdGNoIChvcGVyYXRvcikge1xyXG4gICAgICBjYXNlICdlcScgOlxyXG4gICAgICAgIGlmICh2YWx1ZSA9PSB0YXJnZXQpIHtcclxuICAgICAgICAgIGlzUmlnaHQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnZ2gnIDpcclxuICAgICAgICBpZiAodmFsdWUgPj0gdGFyZ2V0KSB7XHJcbiAgICAgICAgICBpc1JpZ2h0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ25vdEVtcHR5JzpcclxuICAgICAgICBpc1JpZ2h0ID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICBpc1JpZ2h0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2VtcHR5JzpcclxuICAgICAgICBpc1JpZ2h0ID0gdHJ1ZTtcclxuICAgICAgICBjb25zb2xlLmxvZygnZW1wdHknLCAhIXZhbHVlKVxyXG4gICAgICAgIGlmICghIXZhbHVlKSB7XHJcblxyXG4gICAgICAgICAgaXNSaWdodCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdCA6XHJcbiAgICAgICAgaXNSaWdodCA9IGZhbHNlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlzUmlnaHQ7XHJcbiAgfVxyXG5cclxuICBjaGVja0lzU2hvd0Jhc2Uob3A6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzU2hvdyA9IGZhbHNlO1xyXG4gICAgaWYgKG9wLmxlbmd0aCA+IDEpIHtcclxuICAgICAgbGV0IHZhbHVlID0gdGhpcy5hdHJGb3JtLmdldChvcFswXSkudmFsdWU7XHJcbiAgICAgIGlzU2hvdyA9IHRoaXMuY29tcGFyZSh2YWx1ZSwgb3BbMV0sIG9wWzJdKVxyXG4gICAgfSBlbHNlXHJcbiAgICAgIGlzU2hvdyA9IGZhbHNlO1xyXG5cclxuICAgIHJldHVybiBpc1Nob3c7XHJcbiAgfVxyXG5cclxuICBpc1JlcXVpcmVkKGl0ZW06IEF0ckZvcm1EZXRhaWwpIHtcclxuICAgIGxldCByZXN1bHQgPSBmYWxzZTtcclxuICAgIGxldCBpc1JlcXVpcmVkID0gaXRlbS5pc1JlcXVpcmVkO1xyXG4gICAgbGV0IHR5cGUgPSB0eXBlb2YgaXNSZXF1aXJlZDtcclxuICAgIGlmICh0eXBlID09IFwiYm9vbGVhblwiKSB7XHJcbiAgICAgIHJldHVybiBpc1JlcXVpcmVkXHJcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJzdHJpbmdcIikge1xyXG5cclxuICAgICAgcmVzdWx0ID0gdGhpcy5pc1Nob3coZmFsc2UsIGlzUmVxdWlyZWQpO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coXCJpc1JlcXVpcmVkXCIsIHJlc3VsdCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgaXNTaG93KGlzSGlkZGVuOiBhbnksIG9wZXJhdG9yOiBhbnkpIHtcclxuICAgIGlmIChpc0hpZGRlbikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBsZXQgaXNTaG93ID0gZmFsc2U7XHJcbiAgICBpZiAoIW9wZXJhdG9yIHx8IG9wZXJhdG9yID09IG51bGwgfHwgb3BlcmF0b3IgPT0gXCJcIikge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gZWxzZSBpZiAob3BlcmF0b3IuaW5kZXhPZignJiYnKSA+IDApIHtcclxuICAgICAgLy8gYXxlcXxiICYmY3xlcXxkXHJcbiAgICAgIGNvbnN0IG9wcyA9IG9wZXJhdG9yLnNwbGl0KCcmJicpO1xyXG4gICAgICBpZiAob3BzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6cHJlZmVyLWZvci1vZlxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBpc1Nob3cgPSB0cnVlXHJcbiAgICAgICAgICBpZiAoIXRoaXMuY2hlY2tJc1Nob3dCYXNlKG9wc1tpXS5zcGxpdCgnfCcpKSkge1xyXG4gICAgICAgICAgICBpc1Nob3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKG9wZXJhdG9yLmluZGV4T2YoJ3x8JykgPiAwKSB7XHJcbiAgICAgIC8vIGF8ZXF8Ynx8Y3xlcXxkXHJcbiAgICAgIGNvbnN0IG9wcyA9IG9wZXJhdG9yLnNwbGl0KCcmJicpO1xyXG4gICAgICBpZiAob3BzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaXNTaG93ID0gZmFsc2U7XHJcbiAgICAgICAgICBpZiAodGhpcy5jaGVja0lzU2hvd0Jhc2Uob3BzW2ldLnNwbGl0KCd8JykpKSB7XHJcbiAgICAgICAgICAgIGlzU2hvdyA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IG9wID0gb3BlcmF0b3Iuc3BsaXQoXCJ8XCIpO1xyXG4gICAgICBpc1Nob3cgPSB0aGlzLmNoZWNrSXNTaG93QmFzZShvcCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXNTaG93O1xyXG4gIH1cclxuXHJcbiAgZ2V0RGljdFZhbHVlKGNvZGU6IHN0cmluZykge1xyXG4gICAgLy8gY29uc29sZS5sb2coXCI5OTk5XCIpO1xyXG4gICAgdGhpcy5kaWN0U2VydmljZS5nZXREaWN0Qnljb2RlKGNvZGUpLnN1YnNjcmliZShcclxuICAgICAgcmVzdWx0ID0+IHtcclxuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdCAhPSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5kaWN0c1tjb2RlXSA9IHJlc3VsdC5kaWN0cztcclxuICAgICAgfSxcclxuICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgIHRoaXMuZGljdHNbY29kZV0gPSBbXTtcclxuICAgICAgfVxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgaW1hZ2VVcGxvYWRDaGFuZ2UoZTogYW55KSB7XHJcbiAgICBpZiAoZS5rZXkpIHtcclxuICAgICAgdGhpcy5hdHJGb3JtLmdldChlLmtleSkuc2V0VmFsdWUoZS52YWx1ZXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25CZWZvcmVVcGxvYWQoZTogYW55LCBpdGVtOiBhbnkpIHtcclxuICAgIHRoaXMudXBsb2FkQWN0aW9uLmVtaXQoe2NvZGU6ICdvbkJlZm9yZVVwbG9hZCcsIGRhdGE6IHsuLi5lLmRhdGEsIGtleTogaXRlbS5rZXl9fSlcclxuICB9XHJcblxyXG4gIHJlc2V0Rm9ybSgpIHtcclxuICAgIC8vIHRoaXMuYXRyRm9ybS5yZXNldCgpO1xyXG4gICAgLy8gY29uc29sZS5sb2coXCJlZGl0b3IgcmVzZXRcIilcclxuICAgIGlmICh0aGlzLmZvcm1PcHRzICYmIHRoaXMuZm9ybU9wdHMuaXRlbXMpIHtcclxuICAgICAgZm9yIChsZXQgaXRlbSBvZiB0aGlzLmZvcm1PcHRzLml0ZW1zKSB7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5mb3JtT3B0cy50eXBlID09ICdhZGQnID8gaXRlbS5kZWZhdWx0VmFsdWUgOiBpdGVtLnZhbHVlO1xyXG4gICAgICAgIGlmIChpdGVtLnR5cGUgPT0gXCJpbWFnZVwiKSB7XHJcbiAgICAgICAgICBpdGVtLmltYWdlT3B0cy5rZXkgPSBpdGVtLmtleVxyXG4gICAgICAgICAgbGV0IGltYWdlczogYW55ID0gW107XHJcbiAgICAgICAgICBpZiAoIXZhbHVlKSB2YWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgICBsZXQgbGlzdCA9IHZhbHVlLnNwbGl0KFwiLFwiKTtcclxuICAgICAgICAgIGZvciAobGV0IGtleSBvZiBsaXN0KSB7XHJcbiAgICAgICAgICAgIGlmIChrZXkgIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgIGltYWdlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGtleToga2V5LFxyXG4gICAgICAgICAgICAgICAgdWlkOiBcIi0xXCIsXHJcbiAgICAgICAgICAgICAgICB1cmw6IGF0cl9zdGF0aWNfZGF0YXMuT1NTX1VSTCArIGtleVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGl0ZW0uaW1hZ2VPcHRzLmltYWdlTGlzdCA9IGltYWdlcztcclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGltYWdlcylcclxuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PSBcImVkaXRvclwiKSB7XHJcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImVkaXRvclwiKVxyXG4gICAgICAgICAgaWYgKCF2YWx1ZSkgdmFsdWUgPSBcIlwiXHJcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT0gXCJzZWxlY3RcIiAmJiB2YWx1ZSA9PSBcIlwiKSB7XHJcbiAgICAgICAgICB2YWx1ZSA9IG51bGw7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT0gXCJjaGVja2JveFwiICYmICF2YWx1ZSkge1xyXG4gICAgICAgICAgdmFsdWUgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmF0ckZvcm0uZ2V0KGl0ZW0ua2V5KS5zZXRWYWx1ZSh2YWx1ZSAhPSB1bmRlZmluZWQgPyB2YWx1ZSA6IG51bGwpXHJcbiAgICAgIH1cclxuICAgICAgZm9yIChjb25zdCBpIGluIHRoaXMuYXRyRm9ybS5jb250cm9scykge1xyXG4gICAgICAgIHRoaXMuYXRyRm9ybS5jb250cm9sc1tpXS5tYXJrQXNVbnRvdWNoZWQoKTtcclxuICAgICAgICB0aGlzLmF0ckZvcm0uY29udHJvbHNbaV0ubWFya0FzUHJpc3RpbmUoKTtcclxuICAgICAgICB0aGlzLmF0ckZvcm0uY29udHJvbHNbaV0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgZWRpdENoYW5nZShkYXRhOiBhbnksIGl0ZW06IGFueSkge1xyXG4gICAgdGhpcy5xdWlsbENoYW5nZS5lbWl0KHtjb2RlOiAncXVpbGxDaGFuZ2UnLCBlOiBkYXRhLCBmb3JtSXRlbTogaXRlbX0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Rm9ybVZhbHVlKCkge1xyXG4gICAgbGV0IG9iajogYW55ID0ge1xyXG4gICAgICBpc1ZhbGlkOiBmYWxzZSxcclxuICAgICAgbW9kZTogdGhpcy5mb3JtT3B0cy50eXBlLFxyXG4gICAgICB2YWx1ZToge31cclxuICAgIH07XHJcbiAgICBsZXQgdmFsdWUgPSB0aGlzLmF0ckZvcm0udmFsdWU7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZSkpIHtcclxuICAgICAgLy8gLy9jb25zb2xlLmxvZyhrZXkpO1xyXG4gICAgICBpZiAodmFsdWUuaGFzT3duUHJvcGVydHkoa2V5KSAmJiB2YWx1ZVtrZXldICE9IG51bGwgJiYgdmFsdWVba2V5XSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBpZiAodmFsdWVba2V5XSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgdGhpcy5mb3JtT3B0cy5pdGVtcykge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS5rZXkgIT0ga2V5KSB7XHJcbiAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGl0ZW0uZGF0ZUZvcm1hdCkge1xyXG4gICAgICAgICAgICAgIG9iai52YWx1ZVtrZXldID0gZm9ybWF0RGF0ZShuZXcgRGF0ZShOdW1iZXIodmFsdWVba2V5XSkpLCBpdGVtLmRhdGVGb3JtYXQsIHRoaXMubG9jYWxlKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT0gJ2RhdGUnKSB7XHJcbiAgICAgICAgICAgICAgb2JqLnZhbHVlW2tleV0gPSBmb3JtYXREYXRlKG5ldyBEYXRlKE51bWJlcih2YWx1ZVtrZXldKSksICd5eXl5LU1NLWRkIDAwOjAwOjAwJywgdGhpcy5sb2NhbGUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PSAnZGF0ZVRpbWUnKSB7XHJcbiAgICAgICAgICAgICAgb2JqLnZhbHVlW2tleV0gPSBmb3JtYXREYXRlKG5ldyBEYXRlKE51bWJlcih2YWx1ZVtrZXldKSksICd5eXl5LU1NLWRkIEhIOm1tOnNzJywgdGhpcy5sb2NhbGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWVba2V5XSBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIHRoaXMuZm9ybU9wdHMuaXRlbXMpIHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0ua2V5ICE9IGtleSkge1xyXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBkYXRlRm9ybWF0ID0gaXRlbS5kYXRlRm9ybWF0ID8gaXRlbS5kYXRlRm9ybWF0IDogJ3l5eXktTU0tZGQgMDA6MDA6MDAnO1xyXG4gICAgICAgICAgICBpZiAoaXRlbS50eXBlID09ICdkYXRlUmFuZ2UnKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGRhdGVBcnI6IGFueSA9IFtdO1xyXG4gICAgICAgICAgICAgIGxldCBuelNob3dUaW1lID0gaXRlbS5uelNob3dUaW1lXHJcbiAgICAgICAgICAgICAgaWYgKG56U2hvd1RpbWUpIHtcclxuICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQgPSAneXl5eS1NTS1kZCBISDptbTpzcydcclxuICAgICAgICAgICAgICAgIGlmIChuelNob3dUaW1lLm56Rm9ybWF0KSB7XHJcbiAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQgPSAneXl5eS1NTS1kZCAnICsgbnpTaG93VGltZS5uekZvcm1hdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgZCBvZiB2YWx1ZVtrZXldKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRlQXJyLnB1c2goZm9ybWF0RGF0ZSgoZCBhcyBEYXRlKSwgZGF0ZUZvcm1hdCwgdGhpcy5sb2NhbGUpKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgb2JqLnZhbHVlW2tleV0gPSBkYXRlQXJyO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PSAnY2FzY2FkZXInKSB7XHJcbiAgICAgICAgICAgICAgb2JqLnZhbHVlW2tleV0gPSB2YWx1ZVtrZXldXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09ICdzZWxlY3QnICYmIGl0ZW0ubnpNb2RlID09ICdtdWx0aXBsZScpIHtcclxuICAgICAgICAgICAgICBvYmoudmFsdWVba2V5XSA9IHZhbHVlW2tleV0udG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBvYmoudmFsdWVba2V5XSA9IHZhbHVlW2tleV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgb2JqLnZhbHVlW2tleV0gPSB2YWx1ZVtrZXldXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JqO1xyXG4gIH1cclxuXHJcbiAgZ2V0Rm9ybVZhaWxkKCk6IGFueSB7XHJcbiAgICBsZXQgb2JqOiBhbnkgPSB7XHJcbiAgICAgIGlzVmFsaWQ6IGZhbHNlLFxyXG4gICAgICBtb2RlOiB0aGlzLmZvcm1PcHRzLnR5cGUsXHJcbiAgICAgIHZhbHVlOiB7fVxyXG4gICAgfTtcclxuICAgIGZvciAoY29uc3QgaSBpbiB0aGlzLmF0ckZvcm0uY29udHJvbHMpIHtcclxuICAgICAgdGhpcy5hdHJGb3JtLmNvbnRyb2xzW2ldLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgIHRoaXMuYXRyRm9ybS5jb250cm9sc1tpXS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB9XHJcbiAgICBvYmouaXNWYWxpZCA9IHRoaXMuYXRyRm9ybS52YWxpZFxyXG4gICAgbGV0IHZhbHVlID0gdGhpcy5hdHJGb3JtLnZhbHVlO1xyXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGtleSk7XHJcbiAgICAgIGlmICh2YWx1ZS5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIHZhbHVlW2tleV0gIT0gbnVsbCAmJiB2YWx1ZVtrZXldICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGlmICh2YWx1ZVtrZXldIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiB0aGlzLmZvcm1PcHRzLml0ZW1zKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLmtleSAhPSBrZXkpIHtcclxuICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaXRlbS5kYXRlRm9ybWF0KSB7XHJcbiAgICAgICAgICAgICAgb2JqLnZhbHVlW2tleV0gPSBmb3JtYXREYXRlKG5ldyBEYXRlKE51bWJlcih2YWx1ZVtrZXldKSksIGl0ZW0uZGF0ZUZvcm1hdCwgdGhpcy5sb2NhbGUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PSAnZGF0ZScpIHtcclxuICAgICAgICAgICAgICBvYmoudmFsdWVba2V5XSA9IGZvcm1hdERhdGUobmV3IERhdGUoTnVtYmVyKHZhbHVlW2tleV0pKSwgJ3l5eXktTU0tZGQgMDA6MDA6MDAnLCB0aGlzLmxvY2FsZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09ICdkYXRlVGltZScpIHtcclxuICAgICAgICAgICAgICBvYmoudmFsdWVba2V5XSA9IGZvcm1hdERhdGUobmV3IERhdGUoTnVtYmVyKHZhbHVlW2tleV0pKSwgJ3l5eXktTU0tZGQgSEg6bW06c3MnLCB0aGlzLmxvY2FsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVtrZXldIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgdGhpcy5mb3JtT3B0cy5pdGVtcykge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS5rZXkgIT0ga2V5KSB7XHJcbiAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGRhdGVGb3JtYXQgPSBpdGVtLmRhdGVGb3JtYXQgPyBpdGVtLmRhdGVGb3JtYXQgOiAneXl5eS1NTS1kZCAwMDowMDowMCc7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLnR5cGUgPT0gJ2RhdGVSYW5nZScpIHtcclxuICAgICAgICAgICAgICBsZXQgZGF0ZUFycjogYW55ID0gW107XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgZCBvZiB2YWx1ZVtrZXldKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRlQXJyLnB1c2goZm9ybWF0RGF0ZSgoZCBhcyBEYXRlKSwgZGF0ZUZvcm1hdCwgdGhpcy5sb2NhbGUpKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgb2JqLnZhbHVlW2tleV0gPSBkYXRlQXJyO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PSAnY2FzY2FkZXInKSB7XHJcbiAgICAgICAgICAgICAgb2JqLnZhbHVlW2tleV0gPSB2YWx1ZVtrZXldXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09ICdzZWxlY3QnICYmIGl0ZW0ubnpNb2RlID09ICdtdWx0aXBsZScpIHtcclxuICAgICAgICAgICAgICBvYmoudmFsdWVba2V5XSA9IHZhbHVlW2tleV0udG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBvYmoudmFsdWVba2V5XSA9IHZhbHVlW2tleV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgb2JqLnZhbHVlW2tleV0gPSB2YWx1ZVtrZXldXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JqO1xyXG4gIH1cclxuXHJcbiAgc2hvd1RpbWUoaXRlbTogYW55KSB7XHJcbiAgICBpZiAoaXRlbS5uelNob3dUaW1lKSB7XHJcbiAgICAgIHJldHVybiBpdGVtLm56U2hvd1RpbWU7XHJcbiAgICB9XHJcbiAgICBpZiAoIWl0ZW0uZGF0ZUZvcm1hdCB8fCBpdGVtLmRhdGVGb3JtYXQgPT0gXCJ5eXl5LU1NLWRkXCIpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbiAgICBsZXQgZm9ybWF0ID0gaXRlbS5kYXRlRm9ybWF0O1xyXG4gICAgaWYgKGZvcm1hdC5pbmRleE9mKFwiSEhcIikpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoZm9ybWF0LmluZGV4T2YoXCJtbVwiKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmIChmb3JtYXQuaW5kZXhPZihcInNzXCIpKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxufVxyXG4iLCI8YXRyLXZpZXctZm9ybSAqbmdJZj1cImZvcm1PcHRzLnR5cGUgPT0gJ3ZpZXcnXCIgW2RpY3RzXT1cImRpY3RzXCIgW2F0ckZvcm1dPVwiYXRyRm9ybVwiXHJcbiAgICAgICAgICAgICAgIFtmb3JtT3B0c109XCJmb3JtT3B0c1wiPjwvYXRyLXZpZXctZm9ybT5cclxuXHJcbjxmb3JtIG56LWZvcm0gW2Zvcm1Hcm91cF09XCJhdHJGb3JtXCIgKm5nSWY9XCJmb3JtT3B0cy50eXBlICE9ICd2aWV3J1wiPlxyXG4gIDxkaXYgbnotcm93IG56R3V0dGVyPVwiOFwiIG56VHlwZT1cImZsZXhcIiBuekFsaWduPVwidG9wXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZvcm1PcHRzLml0ZW1zXCI+XHJcbiAgICAgIDxkaXYgbnotY29sIG56U3Bhbj1cIjI0XCIgY2xhc3M9XCJmb3JtLXRpdGxlXCIgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ3RpdGxlJ1wiPlxyXG4gICAgICAgIHt7aXRlbS5sYWJlbH19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IG56LWNvbCBbbnpTcGFuXT1cIml0ZW0uc3BhblwiICpuZ0lmPVwiaXNTaG93KGl0ZW0uaXNIaWRkZW4saXRlbS5vcGVyYXRvcilcIj5cclxuICAgICAgICA8bmctY29udGVudCAqbmdUZW1wbGF0ZU91dGxldD1cIml0ZW0uZmlyc3RUZW1wXCI+PC9uZy1jb250ZW50PlxyXG4gICAgICAgIDxuei1mb3JtLWl0ZW0gKm5nSWY9XCJpdGVtLnR5cGUgIT0gJ3RpdGxlJ1wiPlxyXG4gICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U21dPVwiaXRlbS5sc3BhblwiIFtuelhzXT1cIjI0XCIgW256UmVxdWlyZWRdPVwiaXNSZXF1aXJlZChpdGVtKVwiPnt7aXRlbS5sYWJlbH19PC9uei1mb3JtLWxhYmVsPlxyXG4gICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTbV09XCJpdGVtLmNzcGFuXCIgW256WHNdPVwiMjRcIj5cclxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7d2lkdGg6IDEwMCVcIj5cclxuICAgICAgICAgICAgICA8bnotdHJlZS1zZWxlY3QgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ3RyZWVTZWxlY3QnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW256Tm9kZXNdPVwiaXRlbS50cmVlTGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG56U2hvd1NlYXJjaD1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuekhpZGVVbk1hdGNoZWQ9XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnpQbGFjZUhvbGRlcj1cInt7aXRlbS5wbGFjZWhvbGRlcn19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW256U2hvd1NlYXJjaF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuekFsbG93Q2xlYXJdPVwiIWl0ZW0ubm90TnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuek11bHRpcGxlXT1cIml0ZW0uc2VsZWN0VXJsLmlzTXVsdGlwbGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbnpEaXNhYmxlZF09XCJpdGVtLnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnpWaXJ0dWFsSGVpZ2h0PVwiMzMwcHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZsZXg6IDFcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8L256LXRyZWUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgIDwhLS0gPG56LXRyZWUtc2VsZWN0ICpuZ0lmPVwiaXRlbS50eXBlID09ICd0cmVlU2VsZWN0J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuekFsbG93Q2xlYXJdPVwiIWl0ZW0ubm90TnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuek5vZGVzXT1cIml0ZW0udHJlZUxpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuelNob3dTZWFyY2g9XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnpIaWRlVW5NYXRjaGVkPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG56UGxhY2VIb2xkZXI9XCJ7e2l0ZW0ucGxhY2Vob2xkZXJ9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuelNob3dTZWFyY2hdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbnpNdWx0aXBsZV09XCJpdGVtLnNlbGVjdFVybC5pc011bHRpcGxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW256RGlzYWJsZWRdPVwiaXRlbS5yZWFkb25seVwiIHN0eWxlPVwiZmxleDogMVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDwvbnotdHJlZS1zZWxlY3Q+IC0tPlxyXG4gICAgICAgICAgICAgIDxhcHAtc2VsZWN0LWljb25zICpuZ0lmPVwiaXRlbS50eXBlID09ICdzZWxlY3RJY29uJ1wiIG56LWlucHV0IHBsYWNlaG9sZGVyPVwie3tpdGVtLnBsYWNlaG9sZGVyfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJpdGVtLnJlYWRvbmx5IFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OiAxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCI+XHJcbiAgICAgICAgICAgICAgPC9hcHAtc2VsZWN0LWljb25zPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cIml0ZW0udHlwZSA9PSAndGV4dCdcIiBuei1pbnB1dCBwbGFjZWhvbGRlcj1cInt7aXRlbS5wbGFjZWhvbGRlcn19XCJcclxuICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZm9ybUNoYW5nZSgkZXZlbnQsaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiaXRlbS5yZWFkb25seSB8fCBmb3JtT3B0cy50eXBlID09ICd2aWV3J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIi8+XHJcbiAgICAgICAgICAgICAgPHRleHRhcmVhICpuZ0lmPVwiaXRlbS50eXBlID09ICd0ZXh0YXJlYSdcIiBuei1pbnB1dCBbcm93c109XCJpdGVtLnJvd3NcIiBwbGFjZWhvbGRlcj1cInt7aXRlbS5wbGFjZWhvbGRlcn19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtyZWFkb25seV09XCJpdGVtLnJlYWRvbmx5fHwgZm9ybU9wdHMudHlwZSA9PSAndmlldydcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgIDxuei1pbnB1dC1udW1iZXIgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ251bWJlcidcIiBuelBsYWNlSG9sZGVyPVwie3tpdGVtLnBsYWNlaG9sZGVyfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW256TWluXT1cIml0ZW0ubWluTnVtYmVyXCIgW256TWF4XT1cIml0ZW0ubWF4TnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIj48L256LWlucHV0LW51bWJlcj5cclxuICAgICAgICAgICAgICA8bnotcmFkaW8tZ3JvdXAgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ3JhZGlvJ1wiIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBuei1yYWRpbyAqbmdGb3I9XCJsZXQgbyBvZiBpdGVtLmRpY3RMaXN0XCIgW256VmFsdWVdPVwiby52YWx1ZVwiPnt7by5sYWJlbH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICA8L256LXJhZGlvLWdyb3VwPlxyXG4gICAgICAgICAgICAgIDxuei1jaGVja2JveC13cmFwcGVyICpuZ0lmPVwiaXRlbS50eXBlID09ICdjaGVja2JveCdcIiBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG56LXJvdz5cclxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgbyBvZiBpdGVtLmRpY3RMaXN0XCIgbnotY29sPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBuei1jaGVja2JveCBbbnpWYWx1ZV09XCJvLnZhbHVlXCI+e3tvLmxhYmVsfX08L2xhYmVsPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uei1jaGVja2JveC13cmFwcGVyPlxyXG4gICAgICAgICAgICAgIDxuei1zZWxlY3RcclxuICAgICAgICAgICAgICAgIFtuelNob3dTZWFyY2hdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0udHlwZSA9PSAnc2VsZWN0J1wiXHJcbiAgICAgICAgICAgICAgICBuelBsYWNlSG9sZGVyPVwie3tpdGVtLnBsYWNlaG9sZGVyfX1cIlxyXG4gICAgICAgICAgICAgICAgbnpBbGxvd0NsZWFyPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCJcclxuICAgICAgICAgICAgICAgIG56U2VydmVyU2VhcmNoXHJcbiAgICAgICAgICAgICAgICBbbnpNb2RlXT1cIml0ZW0ubnpNb2RlIHx8ICdkZWZhdWx0J1wiXHJcbiAgICAgICAgICAgICAgICBuekRpc2FibGVkPVwie3tpdGVtLnJlYWRvbmx5fHwgZm9ybU9wdHMudHlwZSA9PSAndmlldyd9fVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPG56LW9wdGlvbiAqbmdGb3I9XCJsZXQgbyBvZiBkaWN0c1tpdGVtLmRpY3RDb2RlXVwiIFtuekxhYmVsXT1cIm8udHlwZU5hbWVcIiBbbnpWYWx1ZV09XCJvLmlkXCI+PC9uei1vcHRpb24+XHJcbiAgICAgICAgICAgICAgPC9uei1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgPG56LXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgW256U2hvd1NlYXJjaF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50eXBlID09ICdzZWxlY3RjJ1wiXHJcbiAgICAgICAgICAgICAgICBuelBsYWNlSG9sZGVyPVwie3tpdGVtLnBsYWNlaG9sZGVyfX1cIlxyXG4gICAgICAgICAgICAgICAgbnpBbGxvd0NsZWFyPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCJcclxuICAgICAgICAgICAgICAgIG56U2VydmVyU2VhcmNoXHJcbiAgICAgICAgICAgICAgICBbbnpNb2RlXT1cIml0ZW0ubnpNb2RlIHx8ICdkZWZhdWx0J1wiXHJcbiAgICAgICAgICAgICAgICBuekRpc2FibGVkPVwie3tpdGVtLnJlYWRvbmx5fHwgZm9ybU9wdHMudHlwZSA9PSAndmlldyd9fVwiXHJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZWxlY3RDaGFuZ2UoJGV2ZW50LGl0ZW0pXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bnotb3B0aW9uICpuZ0Zvcj1cImxldCBvIG9mIGl0ZW0uZGljdExpc3RcIiBbbnpMYWJlbF09XCJvLmxhYmVsXCIgW256VmFsdWVdPVwiby52YWx1ZVwiPjwvbnotb3B0aW9uPlxyXG4gICAgICAgICAgICAgIDwvbnotc2VsZWN0PlxyXG4gICAgICAgICAgICAgIDxuei1jYXNjYWRlciBbbnpEaXNhYmxlZF09XCJpdGVtLnJlYWRvbmx5XCIgc3R5bGU9XCJmbGV4OiAxXCIgW256QWxsb3dDbGVhcl09XCIhaXRlbS5ub3ROdWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW256VmFsdWVQcm9wZXJ0eV09XCInbnpWYWx1ZVByb3BlcnR5J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuelNob3dTZWFyY2hdPVwidHJ1ZVwiICpuZ0lmPVwiaXRlbS50eXBlID09ICdjYXNjYWRlcidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbbnpDaGFuZ2VPblNlbGVjdF0gPSBcIml0ZW0uYWxsb3dTZWxlY3ROb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW256T3B0aW9uc109XCJpdGVtLmRpY3RMaXN0XCIgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiPjwvbnotY2FzY2FkZXI+XHJcbiAgICAgICAgICAgICAgPG56LWRhdGUtcGlja2VyICpuZ0lmPVwiaXRlbS50eXBlID09ICdkYXRlJ1wiIFtuekZvcm1hdF09XCJpdGVtLmRhdGVGb3JtYXQgPyBpdGVtLmRhdGVGb3JtYXQgOiAneXl5eS1NTS1kZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbnpTaG93VGltZV09XCJzaG93VGltZShpdGVtKVwiIHN0eWxlPVwiZmxleDogMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuekRpc2FibGVkXT1cImZvcm1PcHRzLnR5cGUgPT0gJ3ZpZXcnIHx8IGl0ZW0ucmVhZG9ubHkgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiPjwvbnotZGF0ZS1waWNrZXI+XHJcbiAgICAgICAgICAgICAgPG56LXJhbmdlLXBpY2tlciAqbmdJZj1cIml0ZW0udHlwZSA9PSAnZGF0ZVJhbmdlJ1wiIHN0eWxlPVwiZmxleDogMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbnpTaG93VGltZV09XCJpdGVtLm56U2hvd1RpbWU/IGl0ZW0ubnpTaG93VGltZSA6IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW256Rm9ybWF0XT1cIml0ZW0ubnpTaG93VGltZSAmJiBpdGVtLm56U2hvd1RpbWUubnpGb3JtYXQgPyAoJ3l5eXktTU0tZGQgJysgaXRlbS5uelNob3dUaW1lLm56Rm9ybWF0KSA6ICd5eXl5LU1NLWRkJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbnpQbGFjZUhvbGRlcl09XCJbJ+W8gOWni+aXtumXtCcsICfnu5PmnZ/ml7bpl7QnXVwiPjwvbnotcmFuZ2UtcGlja2VyPlxyXG5cclxuICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ2ltYWdlJ1wiIG56LWlucHV0IFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiBbaGlkZGVuXT1cInRydWVcIi8+XHJcbiAgICAgICAgICAgICAgPGF0ci1pbWctdXBsb2FkICpuZ0lmPVwiaXRlbS50eXBlID09ICdpbWFnZSdcIiBbKG9wdHMpXT1cIml0ZW0uaW1hZ2VPcHRzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQmVmb3JlVXBsb2FkKT1cIm9uQmVmb3JlVXBsb2FkKCRldmVudCxpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZnRlckNoYW5nZSk9XCJpbWFnZVVwbG9hZENoYW5nZSgkZXZlbnQpXCI+PC9hdHItaW1nLXVwbG9hZD5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICA8ZWRpdG9yICpuZ0lmPVwiaXRlbS50eXBlID09ICdlZGl0b3InXCIgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtjb25maWddPVwie2luaXRpYWxGcmFtZUhlaWdodDppdGVtLmhlaWdodH1cIiA+PC9lZGl0b3I+LS0+XHJcbiAgICAgICAgICAgICAgPGFwcC1xdWlsbC1lZGl0b3IgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ2VkaXRvcidcIiBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgKG5nTW9kZWxDaGFuZ2UpPVwiZWRpdENoYW5nZSgkZXZlbnQsaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZXNdPVwie2hlaWdodDppdGVtLmhlaWdodCA+IDAgPyBpdGVtLmhlaWdodCArICdweCcgOiAnMjUwcHgnfVwiPjwvYXBwLXF1aWxsLWVkaXRvcj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbS50eXBlID09ICd3b3JkJ1wiIFtpbm5lckhUTUxdPVwiaXRlbS52YWx1ZSB8ZGVmVmFsOml0ZW0uZGVmYXVsdFZhbHVlIHxzYWZlSHRtbFwiPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ2J1dHRvbnMnXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBidG4gb2YgaXRlbS5idXR0b25zXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbnotYnV0dG9uIHR5cGU9XCJidXR0b25cIiBbbnpUeXBlXT1cImJ0bi5idG5UeXBlIHxkZWZWYWw6ICdkZWZhdWx0J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhbnQtYnRuIGFudC1idG4tcHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDVweFwiICpuZ0lmPVwiYnRuLmlzU2hvdyB8fCBpc1Nob3coZmFsc2UsYnRuLm9wZXJhdG9yKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRvQWN0aW9uKGJ0biwkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tidG4ubmFtZX19PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmFsaWQgb2YgaXRlbS52YWxpZGF0b3JzXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXRyRm9ybS5nZXQoaXRlbS5rZXkpLmhhc0Vycm9yKHZhbGlkLnR5cGUpICYmIChhdHJGb3JtLmdldChpdGVtLmtleSkuZGlydHkgKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6cmVkOyAgICBoZWlnaHQ6IDE1cHg7bWFyZ2luOiAwO2xpbmUtaGVpZ2h0OiAxNXB4O1wiPnt7dmFsaWQuZXJyb3JMYWJlbH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIG56LWJ1dHRvbiBuelR5cGU9XCJkZWZhdWx0XCIgc3R5bGU9XCJjdXJzb3I6IGRlZmF1bHQ7YmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtjb2xvcjogYmxhY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLmVuZHNcIiBkaXNhYmxlZD5cclxuICAgICAgICAgICAgICAgIHt7aXRlbS5lbmRzfX1cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXRlbS5idXR0b24/LmlzU2hvd1wiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImFudC1idG4gYW50LWJ0bi1wcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkb0FjdGlvbihpdGVtLmJ1dHRvbiwkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj57e2l0ZW0uYnV0dG9uLm5hbWV9fTwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLnByb3Bvc2FsXCIgc3R5bGU9XCJjb2xvcjogcmVkO3dpZHRoOiAxMDAlXCI+e3tpdGVtLnByb3Bvc2FsfX08L2Rpdj5cclxuICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgIDwvbnotZm9ybS1pdGVtPlxyXG4gICAgICAgIDxuZy1jb250ZW50ICpuZ1RlbXBsYXRlT3V0bGV0PVwiaXRlbS50ZW1wXCI+PC9uZy1jb250ZW50PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvZGl2PlxyXG5cclxuPC9mb3JtPlxyXG4iXX0=
587
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvc2hhcmVkL2Zvcm0vZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvc2hhcmVkL2Zvcm0vZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFVLEtBQUssRUFBWSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDMUcsT0FBTyxFQUF1QyxrQkFBa0IsRUFBRSxVQUFVLEVBQWMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqSCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFHM0MsT0FBTyxFQUFDLGdCQUFnQixFQUFvRCxNQUFNLCtCQUErQixDQUFDO0FBRWxILE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFReEQsTUFBTSxPQUFPLGdCQUFnQjtJQVMzQiwyQ0FBMkM7SUFDM0MsWUFBb0IsWUFBMEIsRUFBVSxXQUF3QixFQUM1RCxFQUFzQixFQUFVLFdBQXdCLEVBQVUsUUFBa0IsRUFBNkIsTUFBYztRQUQvSCxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQzVELE9BQUUsR0FBRixFQUFFLENBQW9CO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQTZCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFUbkosVUFBSyxHQUFRLEVBQUUsQ0FBQztRQUdOLGVBQVUs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LElBQUksQ0FBQztTQUNiO1FBQ0QsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3hCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDeEIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzs4R0F2aEJVLGdCQUFnQiw4SkFXdUYsU0FBUztrR0FYaEgsZ0JBQWdCLG1MQ2hCN0IsZzJTQWdKQTs7MkZEaElhLGdCQUFnQjtrQkFMNUIsU0FBUzsrQkFDRSxVQUFVOzswQkFldUYsTUFBTTsyQkFBQyxTQUFTO3lDQVBsSCxRQUFRO3NCQUFoQixLQUFLO2dCQUNJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIEluamVjdG9yLCBJbmplY3QsIExPQ0FMRV9JRCwgT3V0cHV0LCBFdmVudEVtaXR0ZXJ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1VudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Hcm91cCwgVW50eXBlZEZvcm1Db250cm9sLCBWYWxpZGF0b3JzLCBWYWxpZGF0b3JGbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge3RlbHBob25lVmFsaWRhdG9yfSBmcm9tICcuLi92YWxpZGF0b3JzL2F0ci12YWxpZHRvcnMnO1xyXG5pbXBvcnQge2Zvcm1hdERhdGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7U2hhcmVTZXJ2aWNlfSBmcm9tICcuLi9zaGFyZS5zZXJ2aWNlJztcclxuaW1wb3J0IHtlbnZpcm9ubWVudH0gZnJvbSBcIm5nLXpvcnJvLWFudGQvY29yZS9lbnZpcm9ubWVudHNcIjtcclxuaW1wb3J0IHthdHJfc3RhdGljX2RhdGFzLCBBdHJGb3JtRGV0YWlsLCBBdHJGb3JtT3B0LCBGb3JtQWN0aW9uLCBmb3JtQnV0dG9ufSBmcm9tIFwiLi4vLi4vLi4vY29yZS9iYXNlL2F0ci1jb21tb25cIjtcclxuaW1wb3J0IHtEaWN0U2VydmljZX0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvc2VydmljZXMvZGljdC9kaWN0LnNlcnZpY2VcIjtcclxuaW1wb3J0IHtUb29sc1V0aWx9IGZyb20gXCIuLi8uLi8uLi9jb3JlL3V0aWxzL1Rvb2xzVXRpbFwiO1xyXG5pbXBvcnQge0h0dHBTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9odHRwLnNlcnZpY2VcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXRyLWZvcm0nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9mb3JtLmNvbXBvbmVudC5sZXNzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEF0ckZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBkaWN0czogYW55ID0ge307XHJcbiAgYXRyRm9ybTogVW50eXBlZEZvcm1Hcm91cCB8IGFueTtcclxuICBASW5wdXQoKSBmb3JtT3B0czogQXRyRm9ybU9wdCB8IGFueTtcclxuICBAT3V0cHV0KCkgZm9ybUFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9ybUFjdGlvbj4oKTtcclxuICBAT3V0cHV0KCkgdXBsb2FkQWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIHF1aWxsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNoYXJlU2VydmljZTogU2hhcmVTZXJ2aWNlLCBwcml2YXRlIGh0dHBTZXJ2aWNlOiBIdHRwU2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIGZiOiBVbnR5cGVkRm9ybUJ1aWxkZXIsIHByaXZhdGUgZGljdFNlcnZpY2U6IERpY3RTZXJ2aWNlLCBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvciwgQEluamVjdChMT0NBTEVfSUQpIHByaXZhdGUgbG9jYWxlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuYXRyRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRMYXlvdXQoaXRlbTogYW55KSB7XHJcbiAgICBpZiAoIWl0ZW0ubHNwYW4pIHtcclxuICAgICAgaXRlbS5sc3BhbiA9IDI0O1xyXG4gICAgfVxyXG4gICAgaWYgKCFpdGVtLmNzcGFuKSB7XHJcbiAgICAgIGl0ZW0uY3NwYW4gPSAyNDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNlbGVjdENoYW5nZShldmVudDogTW91c2VFdmVudCwgaXRlbTogYW55KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikge1xyXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxyXG4gICAgfVxyXG4gICAgbGV0IGFjdGlvbjogRm9ybUFjdGlvbiA9IHtcclxuICAgICAgbmFtZTogaXRlbS5rZXksXHJcbiAgICAgIGNvZGU6ICdzZWxlY3RDaGFnbmUnLFxyXG4gICAgfTtcclxuICAgIHRoaXMuZm9ybUFjdGlvbi5lbWl0KGFjdGlvbik7XHJcbiAgfVxyXG4gIGZvcm1DaGFuZ2UoZXZlbnQ6IGFueSwgaXRlbTogYW55KXtcclxuICAgIHRoaXMuZm9ybUFjdGlvbi5lbWl0KCB7XHJcbiAgICAgIG5hbWU6ICdmb3JtQ2hhbmdlJyxcclxuICAgICAgY29kZTogaXRlbS5rZXksXHJcbiAgICB9KTtcclxuICB9XHJcbiAgZG9BY3Rpb24oaXRlbTogZm9ybUJ1dHRvbiwgZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSB7XHJcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXHJcbiAgICB9XHJcbiAgICBsZXQgYWN0aW9uOiBGb3JtQWN0aW9uID0ge1xyXG4gICAgICBuYW1lOiBpdGVtLm5hbWUsXHJcbiAgICAgIGNvZGU6IGl0ZW0uY29kZSxcclxuICAgIH07XHJcbiAgICB0aGlzLmZvcm1BY3Rpb24uZW1pdChhY3Rpb24pO1xyXG4gIH1cclxuXHJcbiAgc2V0VmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMuYXRyRm9ybS5nZXQoa2V5KT8uc2V0VmFsdWUodmFsdWUpO1xyXG4gIH1cclxuXHJcblxyXG4gIGdldERpY0xpc3QoaXRlbTogYW55KSB7XHJcbiAgICB0aGlzLnNoYXJlU2VydmljZS5nZXREaWNMaXN0KGl0ZW0pLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PSAyMDAgJiYgcmVzLml0ZW0pIHtcclxuICAgICAgICBpdGVtID0gcmVzLml0ZW1cclxuICAgICAgICB0aGlzLnJlc2V0Rm9ybSgpO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG5cclxuICB9XHJcblxyXG4gIGNvbnYoZGF0YXM6IGFueSwga2V5czogYW55KTogYW55IHtcclxuICAgIHJldHVybiBkYXRhcy5tYXAoKGNoaWxkOiBhbnkpID0+IHtcclxuICAgICAgbGV0IGl0ZW06IGFueSA9IHt9O1xyXG4gICAgICBpZiAoa2V5cykge1xyXG4gICAgICAgIGtleXMuZm9yRWFjaCgodjogYW55KSA9PiB7XHJcbiAgICAgICAgICBsZXQgdnMgPSB2LnNwbGl0KFwifFwiKTtcclxuICAgICAgICAgIGNoaWxkW3ZzWzBdXSA9IGNoaWxkW3ZzWzFdXTtcclxuICAgICAgICAgIGl0ZW1bdnNbMF1dID0gY2hpbGRbdnNbMV1dO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGl0ZW0gPSBjaGlsZDtcclxuICAgICAgfVxyXG4gICAgICBjaGlsZC5uelZhbHVlUHJvcGVydHkgPSBpdGVtO1xyXG4gICAgICBpZiAoY2hpbGQuY2hpbGRyZW4pIHtcclxuICAgICAgICBjaGlsZC5jaGlsZHJlbiA9IHRoaXMuY29udihjaGlsZC5jaGlsZHJlbiwga2V5cylcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjaGlsZC5pc0xlYWYgPSB0cnVlXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGNoaWxkO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGdldENhc2NhZGVyRGVmYXVsdFZhbHVlKGxpc3Q6IGFueSwgaW5kZXg6IGFueSwgdmFsdWU6IGFueSxrZXlOYW1lOmFueSkge1xyXG4gICAgbGlzdC5mb3JFYWNoKChkaWM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoZGljW2tleU5hbWVdID09IHZhbHVlW2luZGV4XVtrZXlOYW1lXSApe1xyXG4gICAgICAgIHZhbHVlW2luZGV4XSA9IHtsYWJlbDpkaWMubGFiZWwsdmFsdWU6ZGljLnZhbHVlfTtcclxuICAgICAgICBpZiAoZGljLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMuZ2V0Q2FzY2FkZXJEZWZhdWx0VmFsdWUoZGljLmNoaWxkcmVuLCBpbmRleCArIDEsIHZhbHVlLGtleU5hbWUpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIHZhbHVlXHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmICh0aGlzLmZvcm1PcHRzICYmIHRoaXMuZm9ybU9wdHMuaXRlbXMpIHtcclxuICAgICAgZm9yIChsZXQgaXRlbSBvZiB0aGlzLmZvcm1PcHRzLml0ZW1zKSB7XHJcbiAgICAgICAgLy8gdGhpcy5hdHJGb3JtLmFkZENvbnRyb2woaXRlbS5rZXksIG5ldyBGb3JtQ29udHJvbCgpKTtcclxuICAgICAgICB0aGlzLnJlc2V0TGF5b3V0KGl0ZW0pXHJcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5mb3JtT3B0cy50eXBlID09ICdhZGQnID8gaXRlbS5kZWZhdWx0VmFsdWUgOiBpdGVtLnZhbHVlO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHZhbHVlKTtcclxuICAgICAgICBpZiAoaXRlbS50eXBlID09ICdjaGVja2JveCcpIHtcclxuICAgICAgICAgIGlmICh0aGlzLmZvcm1PcHRzLnR5cGUgPT0gJ2FkZCcpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBpdGVtLmRpY3RMaXN0LmZpbHRlcigodjogYW55KSA9PiB2LmlzU2VsZWN0KS5tYXAoKGRpYzogYW55KSA9PiBkaWMudmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXRlbS50eXBlID09ICd0cmVlU2VsZWN0JyAmJiBpdGVtLnNlbGVjdFVybC51cmwpIHtcclxuICAgICAgICAgIGxldCBrZXlzID0gaXRlbS5zZWxlY3RVcmwuY29udmVydC5zcGxpdCgnLCcpO1xyXG4gICAgICAgICAgdGhpcy5odHRwU2VydmljZS5wb3N0KGl0ZW0uc2VsZWN0VXJsLnVybCwge30sIFRvb2xzVXRpbC5nZXRIdHRwT3B0aW9ucygpKS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgICAgaXRlbS50cmVlTGlzdCA9IHJlcy5kYXRhLmZpbHRlcigoY2hpbGQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGtleXMuZm9yRWFjaCgodjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdnMgPSB2LnNwbGl0KFwifFwiKTtcclxuICAgICAgICAgICAgICAgIGNoaWxkW3ZzWzBdXSA9IGNoaWxkW3ZzWzFdXTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpdGVtLnR5cGUgPT0gJ2Nhc2NhZGVyJyAmJiBpdGVtLnNlbGVjdFVybC51cmwpIHtcclxuICAgICAgICAgIGxldCBrZXlzOiBhbnkgPSBudWxsXHJcbiAgICAgICAgICBpZiAoaXRlbS5zZWxlY3RVcmwuY29udmVydCkge1xyXG4gICAgICAgICAgICBrZXlzID0gaXRlbS5zZWxlY3RVcmwuY29udmVydC5zcGxpdCgnLCcpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGV0IHZhbHVlU3RyTGlzdDphbnkgPSBbXVxyXG4gICAgICAgICAgaWYgKGl0ZW0uc2VsZWN0VXJsLnVybCkge1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0VXJsID0gaXRlbS5zZWxlY3RVcmw7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RVcmwuaG9zdCA9PSAnb3NzJykge1xyXG4gICAgICAgICAgICAgIHRoaXMuaHR0cFNlcnZpY2UuZ2V0T3NzKHNlbGVjdFVybC51cmwpLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5kaWN0TGlzdCA9IHRoaXMuY29udihKU09OLnBhcnNlKHJlcyksIGtleXMpXHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAvLyB2YWx1ZSA9IHRoaXMuZ2V0Q2FzY2FkZXJEZWZhdWx0VmFsdWUoaXRlbS5kaWN0TGlzdCwgMCwgdmFsdWUpXHJcbiAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uc2hvd0tleSl7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmdldENhc2NhZGVyRGVmYXVsdFZhbHVlKGl0ZW0uZGljdExpc3QsIDAsIHZhbHVlLGl0ZW0ua2V5TmFtZSlcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBmb3IobGV0IGl0ZW0gb2YgdmFsdWUpe1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyTGlzdC5wdXNoKGl0ZW0udmFsdWUpXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShpdGVtLmtleSx2YWx1ZVN0ckxpc3QpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLmh0dHBTZXJ2aWNlLnBvc3Qoc2VsZWN0VXJsLnVybCwge30sIFRvb2xzVXRpbC5nZXRIdHRwT3B0aW9ucygpKS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uZGljdExpc3QgPSB0aGlzLmNvbnYocmVzLmRhdGEsIGtleXMpXHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAvLyB2YWx1ZSA9IHRoaXMuZ2V0Q2FzY2FkZXJEZWZhdWx0VmFsdWUoaXRlbS5kaWN0TGlzdCwgMCwgdmFsdWUpXHJcbiAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uc2hvd0tleSl7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmdldENhc2NhZGVyRGVmYXVsdFZhbHVlKGl0ZW0uZGljdExpc3QsIDAsIHZhbHVlLGl0ZW0ua2V5TmFtZSlcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBmb3IobGV0IGl0ZW0gb2YgdmFsdWUpe1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyTGlzdC5wdXNoKGl0ZW0udmFsdWUpXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShpdGVtLmtleSx2YWx1ZVN0ckxpc3QpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpdGVtLnR5cGUgPT0gXCJzZWxlY3RcIikge1xyXG4gICAgICAgICAgdGhpcy5nZXREaWN0VmFsdWUoaXRlbS5kaWN0Q29kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpdGVtLnR5cGUgPT0gJ3NlbGVjdGMnKSB7XHJcbiAgICAgICAgICBpZiAoIWl0ZW0uZGljdExpc3QgfHwgKGl0ZW0uc2VsZWN0VXJsICYmIGl0ZW0uc2VsZWN0VXJsLmlnbm9yZURpY3RMaXN0KSkge1xyXG4gICAgICAgICAgICB0aGlzLmdldERpY0xpc3QoaXRlbSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpdGVtLnR5cGUgPT0gXCJ0ZXh0YXJlYVwiICYmICFpdGVtLnJvd3MpXHJcbiAgICAgICAgICBpdGVtLnJvd3MgPSA1O1xyXG4gICAgICAgIGlmIChpdGVtLnR5cGUgPT0gXCJpbWFnZVwiKSB7XHJcbiAgICAgICAgICBpdGVtLmltYWdlT3B0cy5rZXkgPSBpdGVtLmtleVxyXG4gICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGxldCBpbWFnZXM6IGFueSA9IFtdO1xyXG4gICAgICAgICAgICBsZXQgbGlzdCA9IHZhbHVlLnNwbGl0KFwiLFwiKTtcclxuICAgICAgICAgICAgZm9yIChsZXQga2V5IG9mIGxpc3QpIHtcclxuICAgICAgICAgICAgICBpbWFnZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBrZXk6IGtleSxcclxuICAgICAgICAgICAgICAgIHVpZDogXCItMVwiLFxyXG4gICAgICAgICAgICAgICAgdXJsOiBhdHJfc3RhdGljX2RhdGFzLk9TU19VUkwgKyBrZXlcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGl0ZW0uaW1hZ2VPcHRzLmltYWdlTGlzdCA9IGltYWdlcztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGl0ZW0udHlwZSA9PSAnZWRpdG9yJykge1xyXG4gICAgICAgICAgaWYgKCF2YWx1ZSkgdmFsdWUgPSBcIlwiXHJcbiAgICAgICAgICBpZiAoIWl0ZW0uaGVpZ2h0KVxyXG4gICAgICAgICAgICBpdGVtLmhlaWdodCA9IDMwMFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFpdGVtLnNwYW4pXHJcbiAgICAgICAgICBpdGVtLnNwYW4gPSA4XHJcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtLmlzUmVxdWlyZWQgIT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGl0ZW0uaXNSZXF1aXJlZCA9IGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCB0ZW1wVmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IFtdO1xyXG4gICAgICAgIGlmIChpdGVtLnZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgIGZvciAobGV0IHZhbGlkYXRvciBvZiBpdGVtLnZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgaWYgKHZhbGlkYXRvci50eXBlID09IFwicmVxdWlyZWRcIikge1xyXG4gICAgICAgICAgICAgIGl0ZW0uaXNSZXF1aXJlZCA9IHRydWVcclxuICAgICAgICAgICAgICB0ZW1wVmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdG9yLnR5cGUgPT0gXCJlbWFpbFwiKSB7XHJcbiAgICAgICAgICAgICAgdGVtcFZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLmVtYWlsKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbGlkYXRvci50eXBlID09IFwibWF4bGVuZ3RoXCIpIHtcclxuICAgICAgICAgICAgICB0ZW1wVmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4TGVuZ3RoKHZhbGlkYXRvci5tYXhsZW5ndGggPyB2YWxpZGF0b3IubWF4bGVuZ3RoIDogMSkpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdG9yLnR5cGUgPT0gXCJtaW5sZW5ndGhcIikge1xyXG4gICAgICAgICAgICAgIHRlbXBWYWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgodmFsaWRhdG9yLm1pbmxlbmd0aCA/IHZhbGlkYXRvci5taW5sZW5ndGggOiAxKSlcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWxpZGF0b3IudHlwZSA9PSBcInRlbHBob25lXCIpIHtcclxuICAgICAgICAgICAgICB0ZW1wVmFsaWRhdG9ycy5wdXNoKHRlbHBob25lVmFsaWRhdG9yKCkpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdG9yLnR5cGUgPT0gXCJwYXR0ZXJuXCIpIHtcclxuICAgICAgICAgICAgICB0ZW1wVmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucGF0dGVybih2YWxpZGF0b3IucGF0dGVyblZhbHVlKSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZSA9IHt2YWx1ZTogdmFsdWUgIT0gdW5kZWZpbmVkID8gdmFsdWUgOiBudWxsLCBkaXNhYmxlZDogaXRlbS5kaXNhYmxlID8gaXRlbS5kaXNhYmxlIDogZmFsc2V9XHJcbiAgICAgICAgaWYgKHRlbXBWYWxpZGF0b3JzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRoaXMuYXRyRm9ybS5hZGRDb250cm9sKGl0ZW0ua2V5LCBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRlZmF1bHRWYWx1ZSwgdGVtcFZhbGlkYXRvcnMpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5hdHJGb3JtLmFkZENvbnRyb2woaXRlbS5rZXksIG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGVmYXVsdFZhbHVlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiIHRoaXMuYXRyRm9ybVwiLCB0aGlzLmF0ckZvcm0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb21wYXJlKHZhbHVlOiBhbnksIG9wZXJhdG9yOiBhbnksIHRhcmdldDogYW55KTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNSaWdodCA9IGZhbHNlO1xyXG4gICAgc3dpdGNoIChvcGVyYXRvcikge1xyXG4gICAgICBjYXNlICdlcScgOlxyXG4gICAgICAgIGlmICh2YWx1ZSA9PSB0YXJnZXQpIHtcclxuICAgICAgICAgIGlzUmlnaHQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnZ2gnIDpcclxuICAgICAgICBpZiAodmFsdWUgPj0gdGFyZ2V0KSB7XHJcbiAgICAgICAgICBpc1JpZ2h0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ25vdEVtcHR5JzpcclxuICAgICAgICBpc1JpZ2h0ID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICBpc1JpZ2h0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2VtcHR5JzpcclxuICAgICAgICBpc1JpZ2h0ID0gdHJ1ZTtcclxuICAgICAgICBjb25zb2xlLmxvZygnZW1wdHknLCAhIXZhbHVlKVxyXG4gICAgICAgIGlmICghIXZhbHVlKSB7XHJcblxyXG4gICAgICAgICAgaXNSaWdodCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdCA6XHJcbiAgICAgICAgaXNSaWdodCA9IGZhbHNlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlzUmlnaHQ7XHJcbiAgfVxyXG5cclxuICBjaGVja0lzU2hvd0Jhc2Uob3A6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGlzU2hvdyA9IGZhbHNlO1xyXG4gICAgaWYgKG9wLmxlbmd0aCA+IDEpIHtcclxuICAgICAgbGV0IHZhbHVlID0gdGhpcy5hdHJGb3JtLmdldChvcFswXSkudmFsdWU7XHJcbiAgICAgIGlzU2hvdyA9IHRoaXMuY29tcGFyZSh2YWx1ZSwgb3BbMV0sIG9wWzJdKVxyXG4gICAgfSBlbHNlXHJcbiAgICAgIGlzU2hvdyA9IGZhbHNlO1xyXG5cclxuICAgIHJldHVybiBpc1Nob3c7XHJcbiAgfVxyXG5cclxuICBpc1JlcXVpcmVkKGl0ZW06IEF0ckZvcm1EZXRhaWwpIHtcclxuICAgIGxldCByZXN1bHQgPSBmYWxzZTtcclxuICAgIGxldCBpc1JlcXVpcmVkID0gaXRlbS5pc1JlcXVpcmVkO1xyXG4gICAgbGV0IHR5cGUgPSB0eXBlb2YgaXNSZXF1aXJlZDtcclxuICAgIGlmICh0eXBlID09IFwiYm9vbGVhblwiKSB7XHJcbiAgICAgIHJldHVybiBpc1JlcXVpcmVkXHJcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJzdHJpbmdcIikge1xyXG5cclxuICAgICAgcmVzdWx0ID0gdGhpcy5pc1Nob3coZmFsc2UsIGlzUmVxdWlyZWQpO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coXCJpc1JlcXVpcmVkXCIsIHJlc3VsdCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgaXNTaG93KGlzSGlkZGVuOiBhbnksIG9wZXJhdG9yOiBhbnkpIHtcclxuICAgIGlmIChpc0hpZGRlbikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBsZXQgaXNTaG93ID0gZmFsc2U7XHJcbiAgICBpZiAoIW9wZXJhdG9yIHx8IG9wZXJhdG9yID09IG51bGwgfHwgb3BlcmF0b3IgPT0gXCJcIikge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gZWxzZSBpZiAob3BlcmF0b3IuaW5kZXhPZignJiYnKSA+IDApIHtcclxuICAgICAgLy8gYXxlcXxiICYmY3xlcXxkXHJcbiAgICAgIGNvbnN0IG9wcyA9IG9wZXJhdG9yLnNwbGl0KCcmJicpO1xyXG4gICAgICBpZiAob3BzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6cHJlZmVyLWZvci1vZlxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBpc1Nob3cgPSB0cnVlXHJcbiAgICAgICAgICBpZiAoIXRoaXMuY2hlY2tJc1Nob3dCYXNlKG9wc1tpXS5zcGxpdCgnfCcpKSkge1xyXG4gICAgICAgICAgICBpc1Nob3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKG9wZXJhdG9yLmluZGV4T2YoJ3x8JykgPiAwKSB7XHJcbiAgICAgIC8vIGF8ZXF8Ynx8Y3xlcXxkXHJcbiAgICAgIGNvbnN0IG9wcyA9IG9wZXJhdG9yLnNwbGl0KCcmJicpO1xyXG4gICAgICBpZiAob3BzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaXNTaG93ID0gZmFsc2U7XHJcbiAgICAgICAgICBpZiAodGhpcy5jaGVja0lzU2hvd0Jhc2Uob3BzW2ldLnNwbGl0KCd8JykpKSB7XHJcbiAgICAgICAgICAgIGlzU2hvdyA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IG9wID0gb3BlcmF0b3Iuc3BsaXQoXCJ8XCIpO1xyXG4gICAgICBpc1Nob3cgPSB0aGlzLmNoZWNrSXNTaG93QmFzZShvcCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXNTaG93O1xyXG4gIH1cclxuXHJcbiAgZ2V0RGljdFZhbHVlKGNvZGU6IHN0cmluZykge1xyXG4gICAgLy8gY29uc29sZS5sb2coXCI5OTk5XCIpO1xyXG4gICAgdGhpcy5kaWN0U2VydmljZS5nZXREaWN0Qnljb2RlKGNvZGUpLnN1YnNjcmliZShcclxuICAgICAgcmVzdWx0ID0+IHtcclxuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdCAhPSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5kaWN0c1tjb2RlXSA9IHJlc3VsdC5kaWN0cztcclxuICAgICAgfSxcclxuICAgICAgZXJyb3IgPT4ge1xyXG4gICAgICAgIHRoaXMuZGljdHNbY29kZV0gPSBbXTtcclxuICAgICAgfVxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgaW1hZ2VVcGxvYWRDaGFuZ2UoZTogYW55KSB7XHJcbiAgICBpZiAoZS5rZXkpIHtcclxuICAgICAgdGhpcy5hdHJGb3JtLmdldChlLmtleSkuc2V0VmFsdWUoZS52YWx1ZXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25CZWZvcmVVcGxvYWQoZTogYW55LCBpdGVtOiBhbnkpIHtcclxuICAgIHRoaXMudXBsb2FkQWN0aW9uLmVtaXQoe2NvZGU6ICdvbkJlZm9yZVVwbG9hZCcsIGRhdGE6IHsuLi5lLmRhdGEsIGtleTogaXRlbS5rZXl9fSlcclxuICB9XHJcblxyXG4gIHJlc2V0Rm9ybSgpIHtcclxuICAgIC8vIHRoaXMuYXRyRm9ybS5yZXNldCgpO1xyXG4gICAgLy8gY29uc29sZS5sb2coXCJlZGl0b3IgcmVzZXRcIilcclxuICAgIGlmICh0aGlzLmZvcm1PcHRzICYmIHRoaXMuZm9ybU9wdHMuaXRlbXMpIHtcclxuICAgICAgZm9yIChsZXQgaXRlbSBvZiB0aGlzLmZvcm1PcHRzLml0ZW1zKSB7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5mb3JtT3B0cy50eXBlID09ICdhZGQnID8gaXRlbS5kZWZhdWx0VmFsdWUgOiBpdGVtLnZhbHVlO1xyXG4gICAgICAgIGlmIChpdGVtLnR5cGUgPT0gXCJpbWFnZVwiKSB7XHJcbiAgICAgICAgICBpdGVtLmltYWdlT3B0cy5rZXkgPSBpdGVtLmtleVxyXG4gICAgICAgICAgbGV0IGltYWdlczogYW55ID0gW107XHJcbiAgICAgICAgICBpZiAoIXZhbHVlKSB2YWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgICBsZXQgbGlzdCA9IHZhbHVlLnNwbGl0KFwiLFwiKTtcclxuICAgICAgICAgIGZvciAobGV0IGtleSBvZiBsaXN0KSB7XHJcbiAgICAgICAgICAgIGlmIChrZXkgIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgIGltYWdlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGtleToga2V5LFxyXG4gICAgICAgICAgICAgICAgdWlkOiBcIi0xXCIsXHJcbiAgICAgICAgICAgICAgICB1cmw6IGF0cl9zdGF0aWNfZGF0YXMuT1NTX1VSTCArIGtleVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGl0ZW0uaW1hZ2VPcHRzLmltYWdlTGlzdCA9IGltYWdlcztcclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGltYWdlcylcclxuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PSBcImVkaXRvclwiKSB7XHJcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImVkaXRvclwiKVxyXG4gICAgICAgICAgaWYgKCF2YWx1ZSkgdmFsdWUgPSBcIlwiXHJcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT0gXCJzZWxlY3RcIiAmJiB2YWx1ZSA9PSBcIlwiKSB7XHJcbiAgICAgICAgICB2YWx1ZSA9IG51bGw7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT0gXCJjaGVja2JveFwiICYmICF2YWx1ZSkge1xyXG4gICAgICAgICAgdmFsdWUgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmF0ckZvcm0uZ2V0KGl0ZW0ua2V5KS5zZXRWYWx1ZSh2YWx1ZSAhPSB1bmRlZmluZWQgPyB2YWx1ZSA6IG51bGwpXHJcbiAgICAgIH1cclxuICAgICAgZm9yIChjb25zdCBpIGluIHRoaXMuYXRyRm9ybS5jb250cm9scykge1xyXG4gICAgICAgIHRoaXMuYXRyRm9ybS5jb250cm9sc1tpXS5tYXJrQXNVbnRvdWNoZWQoKTtcclxuICAgICAgICB0aGlzLmF0ckZvcm0uY29udHJvbHNbaV0ubWFya0FzUHJpc3RpbmUoKTtcclxuICAgICAgICB0aGlzLmF0ckZvcm0uY29udHJvbHNbaV0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgZWRpdENoYW5nZShkYXRhOiBhbnksIGl0ZW06IGFueSkge1xyXG4gICAgdGhpcy5xdWlsbENoYW5nZS5lbWl0KHtjb2RlOiAncXVpbGxDaGFuZ2UnLCBlOiBkYXRhLCBmb3JtSXRlbTogaXRlbX0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Rm9ybVZhbHVlKCkge1xyXG4gICAgbGV0IG9iajogYW55ID0ge1xyXG4gICAgICBpc1ZhbGlkOiBmYWxzZSxcclxuICAgICAgbW9kZTogdGhpcy5mb3JtT3B0cy50eXBlLFxyXG4gICAgICB2YWx1ZToge31cclxuICAgIH07XHJcbiAgICBsZXQgdmFsdWUgPSB0aGlzLmF0ckZvcm0udmFsdWU7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZSkpIHtcclxuICAgICAgLy8gLy9jb25zb2xlLmxvZyhrZXkpO1xyXG4gICAgICBpZiAodmFsdWUuaGFzT3duUHJvcGVydHkoa2V5KSAmJiB2YWx1ZVtrZXldICE9IG51bGwgJiYgdmFsdWVba2V5XSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBpZiAodmFsdWVba2V5XSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgdGhpcy5mb3JtT3B0cy5pdGVtcykge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS5rZXkgIT0ga2V5KSB7XHJcbiAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGl0ZW0uZGF0ZUZvcm1hdCkge1xyXG4gICAgICAgICAgICAgIG9iai52YWx1ZVtrZXldID0gZm9ybWF0RGF0ZShuZXcgRGF0ZShOdW1iZXIodmFsdWVba2V5XSkpLCBpdGVtLmRhdGVGb3JtYXQsIHRoaXMubG9jYWxlKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT0gJ2RhdGUnKSB7XHJcbiAgICAgICAgICAgICAgb2JqLnZhbHVlW2tleV0gPSBmb3JtYXREYXRlKG5ldyBEYXRlKE51bWJlcih2YWx1ZVtrZXldKSksICd5eXl5LU1NLWRkIDAwOjAwOjAwJywgdGhpcy5sb2NhbGUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PSAnZGF0ZVRpbWUnKSB7XHJcbiAgICAgICAgICAgICAgb2JqLnZhbHVlW2tleV0gPSBmb3JtYXREYXRlKG5ldyBEYXRlKE51bWJlcih2YWx1ZVtrZXldKSksICd5eXl5LU1NLWRkIEhIOm1tOnNzJywgdGhpcy5sb2NhbGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWVba2V5XSBpbnN0YW5jZW9mIEFycmF5KSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIHRoaXMuZm9ybU9wdHMuaXRlbXMpIHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0ua2V5ICE9IGtleSkge1xyXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBkYXRlRm9ybWF0ID0gaXRlbS5kYXRlRm9ybWF0ID8gaXRlbS5kYXRlRm9ybWF0IDogJ3l5eXktTU0tZGQgMDA6MDA6MDAnO1xyXG4gICAgICAgICAgICBpZiAoaXRlbS50eXBlID09ICdkYXRlUmFuZ2UnKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGRhdGVBcnI6IGFueSA9IFtdO1xyXG4gICAgICAgICAgICAgIGxldCBuelNob3dUaW1lID0gaXRlbS5uelNob3dUaW1lXHJcbiAgICAgICAgICAgICAgaWYgKG56U2hvd1RpbWUpIHtcclxuICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQgPSAneXl5eS1NTS1kZCBISDptbTpzcydcclxuICAgICAgICAgICAgICAgIGlmIChuelNob3dUaW1lLm56Rm9ybWF0KSB7XHJcbiAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQgPSAneXl5eS1NTS1kZCAnICsgbnpTaG93VGltZS5uekZvcm1hdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgZCBvZiB2YWx1ZVtrZXldKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRlQXJyLnB1c2goZm9ybWF0RGF0ZSgoZCBhcyBEYXRlKSwgZGF0ZUZvcm1hdCwgdGhpcy5sb2NhbGUpKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgb2JqLnZhbHVlW2tleV0gPSBkYXRlQXJyO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PSAnY2FzY2FkZXInKSB7XHJcbiAgICAgICAgICAgICAgb2JqLnZhbHVlW2tleV0gPSB2YWx1ZVtrZXldXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09ICdzZWxlY3QnICYmIGl0ZW0ubnpNb2RlID09ICdtdWx0aXBsZScpIHtcclxuICAgICAgICAgICAgICBvYmoudmFsdWVba2V5XSA9IHZhbHVlW2tleV0udG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBvYmoudmFsdWVba2V5XSA9IHZhbHVlW2tleV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgb2JqLnZhbHVlW2tleV0gPSB2YWx1ZVtrZXldXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JqO1xyXG4gIH1cclxuXHJcbiAgZ2V0Rm9ybVZhaWxkKCk6IGFueSB7XHJcbiAgICBsZXQgb2JqOiBhbnkgPSB7XHJcbiAgICAgIGlzVmFsaWQ6IGZhbHNlLFxyXG4gICAgICBtb2RlOiB0aGlzLmZvcm1PcHRzLnR5cGUsXHJcbiAgICAgIHZhbHVlOiB7fVxyXG4gICAgfTtcclxuICAgIGZvciAoY29uc3QgaSBpbiB0aGlzLmF0ckZvcm0uY29udHJvbHMpIHtcclxuICAgICAgdGhpcy5hdHJGb3JtLmNvbnRyb2xzW2ldLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgIHRoaXMuYXRyRm9ybS5jb250cm9sc1tpXS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB9XHJcbiAgICBvYmouaXNWYWxpZCA9IHRoaXMuYXRyRm9ybS52YWxpZFxyXG4gICAgbGV0IHZhbHVlID0gdGhpcy5hdHJGb3JtLnZhbHVlO1xyXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGtleSk7XHJcbiAgICAgIGlmICh2YWx1ZS5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIHZhbHVlW2tleV0gIT0gbnVsbCAmJiB2YWx1ZVtrZXldICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGlmICh2YWx1ZVtrZXldIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiB0aGlzLmZvcm1PcHRzLml0ZW1zKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLmtleSAhPSBrZXkpIHtcclxuICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaXRlbS5kYXRlRm9ybWF0KSB7XHJcbiAgICAgICAgICAgICAgb2JqLnZhbHVlW2tleV0gPSBmb3JtYXREYXRlKG5ldyBEYXRlKE51bWJlcih2YWx1ZVtrZXldKSksIGl0ZW0uZGF0ZUZvcm1hdCwgdGhpcy5sb2NhbGUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PSAnZGF0ZScpIHtcclxuICAgICAgICAgICAgICBvYmoudmFsdWVba2V5XSA9IGZvcm1hdERhdGUobmV3IERhdGUoTnVtYmVyKHZhbHVlW2tleV0pKSwgJ3l5eXktTU0tZGQgMDA6MDA6MDAnLCB0aGlzLmxvY2FsZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09ICdkYXRlVGltZScpIHtcclxuICAgICAgICAgICAgICBvYmoudmFsdWVba2V5XSA9IGZvcm1hdERhdGUobmV3IERhdGUoTnVtYmVyKHZhbHVlW2tleV0pKSwgJ3l5eXktTU0tZGQgSEg6bW06c3MnLCB0aGlzLmxvY2FsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVtrZXldIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgdGhpcy5mb3JtT3B0cy5pdGVtcykge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS5rZXkgIT0ga2V5KSB7XHJcbiAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGRhdGVGb3JtYXQgPSBpdGVtLmRhdGVGb3JtYXQgPyBpdGVtLmRhdGVGb3JtYXQgOiAneXl5eS1NTS1kZCAwMDowMDowMCc7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLnR5cGUgPT0gJ2RhdGVSYW5nZScpIHtcclxuICAgICAgICAgICAgICBsZXQgZGF0ZUFycjogYW55ID0gW107XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgZCBvZiB2YWx1ZVtrZXldKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRlQXJyLnB1c2goZm9ybWF0RGF0ZSgoZCBhcyBEYXRlKSwgZGF0ZUZvcm1hdCwgdGhpcy5sb2NhbGUpKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgb2JqLnZhbHVlW2tleV0gPSBkYXRlQXJyO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PSAnY2FzY2FkZXInKSB7XHJcbiAgICAgICAgICAgICAgb2JqLnZhbHVlW2tleV0gPSB2YWx1ZVtrZXldXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09ICdzZWxlY3QnICYmIGl0ZW0ubnpNb2RlID09ICdtdWx0aXBsZScpIHtcclxuICAgICAgICAgICAgICBvYmoudmFsdWVba2V5XSA9IHZhbHVlW2tleV0udG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBvYmoudmFsdWVba2V5XSA9IHZhbHVlW2tleV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgb2JqLnZhbHVlW2tleV0gPSB2YWx1ZVtrZXldXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JqO1xyXG4gIH1cclxuXHJcbiAgc2hvd1RpbWUoaXRlbTogYW55KSB7XHJcbiAgICBpZiAoaXRlbS5uelNob3dUaW1lKSB7XHJcbiAgICAgIHJldHVybiBpdGVtLm56U2hvd1RpbWU7XHJcbiAgICB9XHJcbiAgICBpZiAoIWl0ZW0uZGF0ZUZvcm1hdCB8fCBpdGVtLmRhdGVGb3JtYXQgPT0gXCJ5eXl5LU1NLWRkXCIpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbiAgICBsZXQgZm9ybWF0ID0gaXRlbS5kYXRlRm9ybWF0O1xyXG4gICAgaWYgKGZvcm1hdC5pbmRleE9mKFwiSEhcIikpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoZm9ybWF0LmluZGV4T2YoXCJtbVwiKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmIChmb3JtYXQuaW5kZXhPZihcInNzXCIpKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxufVxyXG4iLCI8YXRyLXZpZXctZm9ybSAqbmdJZj1cImZvcm1PcHRzLnR5cGUgPT0gJ3ZpZXcnXCIgW2RpY3RzXT1cImRpY3RzXCIgW2F0ckZvcm1dPVwiYXRyRm9ybVwiXHJcbiAgICAgICAgICAgICAgIFtmb3JtT3B0c109XCJmb3JtT3B0c1wiPjwvYXRyLXZpZXctZm9ybT5cclxuXHJcbjxmb3JtIG56LWZvcm0gW2Zvcm1Hcm91cF09XCJhdHJGb3JtXCIgKm5nSWY9XCJmb3JtT3B0cy50eXBlICE9ICd2aWV3J1wiPlxyXG4gIDxkaXYgbnotcm93IG56R3V0dGVyPVwiOFwiIG56VHlwZT1cImZsZXhcIiBuekFsaWduPVwidG9wXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZvcm1PcHRzLml0ZW1zXCI+XHJcbiAgICAgIDxkaXYgbnotY29sIG56U3Bhbj1cIjI0XCIgY2xhc3M9XCJmb3JtLXRpdGxlXCIgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ3RpdGxlJ1wiPlxyXG4gICAgICAgIHt7aXRlbS5sYWJlbH19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IG56LWNvbCBbbnpTcGFuXT1cIml0ZW0uc3BhblwiICpuZ0lmPVwiaXNTaG93KGl0ZW0uaXNIaWRkZW4saXRlbS5vcGVyYXRvcilcIj5cclxuICAgICAgICA8bmctY29udGVudCAqbmdUZW1wbGF0ZU91dGxldD1cIml0ZW0uZmlyc3RUZW1wXCI+PC9uZy1jb250ZW50PlxyXG4gICAgICAgIDxuei1mb3JtLWl0ZW0gKm5nSWY9XCJpdGVtLnR5cGUgIT0gJ3RpdGxlJ1wiPlxyXG4gICAgICAgICAgPG56LWZvcm0tbGFiZWwgW256U21dPVwiaXRlbS5sc3BhblwiIFtuelhzXT1cIjI0XCIgW256UmVxdWlyZWRdPVwiaXNSZXF1aXJlZChpdGVtKVwiPnt7aXRlbS5sYWJlbH19PC9uei1mb3JtLWxhYmVsPlxyXG4gICAgICAgICAgPG56LWZvcm0tY29udHJvbCBbbnpTbV09XCJpdGVtLmNzcGFuXCIgW256WHNdPVwiMjRcIj5cclxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7d2lkdGg6IDEwMCVcIj5cclxuICAgICAgICAgICAgICA8bnotdHJlZS1zZWxlY3QgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ3RyZWVTZWxlY3QnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW256Tm9kZXNdPVwiaXRlbS50cmVlTGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG56U2hvd1NlYXJjaD1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuekhpZGVVbk1hdGNoZWQ9XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnpQbGFjZUhvbGRlcj1cInt7aXRlbS5wbGFjZWhvbGRlcn19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW256U2hvd1NlYXJjaF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuekFsbG93Q2xlYXJdPVwiIWl0ZW0ubm90TnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuek11bHRpcGxlXT1cIml0ZW0uc2VsZWN0VXJsLmlzTXVsdGlwbGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbnpEaXNhYmxlZF09XCJpdGVtLnJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnpWaXJ0dWFsSGVpZ2h0PVwiMzMwcHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZsZXg6IDFcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8L256LXRyZWUtc2VsZWN0PlxyXG4gICAgICAgICAgICAgIDwhLS0gPG56LXRyZWUtc2VsZWN0ICpuZ0lmPVwiaXRlbS50eXBlID09ICd0cmVlU2VsZWN0J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuekFsbG93Q2xlYXJdPVwiIWl0ZW0ubm90TnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuek5vZGVzXT1cIml0ZW0udHJlZUxpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuelNob3dTZWFyY2g9XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnpIaWRlVW5NYXRjaGVkPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG56UGxhY2VIb2xkZXI9XCJ7e2l0ZW0ucGxhY2Vob2xkZXJ9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuelNob3dTZWFyY2hdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbnpNdWx0aXBsZV09XCJpdGVtLnNlbGVjdFVybC5pc011bHRpcGxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW256RGlzYWJsZWRdPVwiaXRlbS5yZWFkb25seVwiIHN0eWxlPVwiZmxleDogMVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDwvbnotdHJlZS1zZWxlY3Q+IC0tPlxyXG4gICAgICAgICAgICAgIDxhcHAtc2VsZWN0LWljb25zICpuZ0lmPVwiaXRlbS50eXBlID09ICdzZWxlY3RJY29uJ1wiIG56LWlucHV0IHBsYWNlaG9sZGVyPVwie3tpdGVtLnBsYWNlaG9sZGVyfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJpdGVtLnJlYWRvbmx5IFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OiAxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCI+XHJcbiAgICAgICAgICAgICAgPC9hcHAtc2VsZWN0LWljb25zPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cIml0ZW0udHlwZSA9PSAndGV4dCdcIiBuei1pbnB1dCBwbGFjZWhvbGRlcj1cInt7aXRlbS5wbGFjZWhvbGRlcn19XCJcclxuICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZm9ybUNoYW5nZSgkZXZlbnQsaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiaXRlbS5yZWFkb25seSB8fCBmb3JtT3B0cy50eXBlID09ICd2aWV3J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIi8+XHJcbiAgICAgICAgICAgICAgPHRleHRhcmVhICpuZ0lmPVwiaXRlbS50eXBlID09ICd0ZXh0YXJlYSdcIiBuei1pbnB1dCBbcm93c109XCJpdGVtLnJvd3NcIiBwbGFjZWhvbGRlcj1cInt7aXRlbS5wbGFjZWhvbGRlcn19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtyZWFkb25seV09XCJpdGVtLnJlYWRvbmx5fHwgZm9ybU9wdHMudHlwZSA9PSAndmlldydcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgIDxuei1pbnB1dC1udW1iZXIgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ251bWJlcidcIiBuelBsYWNlSG9sZGVyPVwie3tpdGVtLnBsYWNlaG9sZGVyfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW256TWluXT1cIml0ZW0ubWluTnVtYmVyXCIgW256TWF4XT1cIml0ZW0ubWF4TnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIj48L256LWlucHV0LW51bWJlcj5cclxuICAgICAgICAgICAgICA8bnotcmFkaW8tZ3JvdXAgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ3JhZGlvJ1wiIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBuei1yYWRpbyAqbmdGb3I9XCJsZXQgbyBvZiBpdGVtLmRpY3RMaXN0XCIgW256VmFsdWVdPVwiby52YWx1ZVwiPnt7by5sYWJlbH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICA8L256LXJhZGlvLWdyb3VwPlxyXG4gICAgICAgICAgICAgIDxuei1jaGVja2JveC13cmFwcGVyICpuZ0lmPVwiaXRlbS50eXBlID09ICdjaGVja2JveCdcIiBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG56LXJvdz5cclxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgbyBvZiBpdGVtLmRpY3RMaXN0XCIgbnotY29sPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBuei1jaGVja2JveCBbbnpWYWx1ZV09XCJvLnZhbHVlXCI+e3tvLmxhYmVsfX08L2xhYmVsPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uei1jaGVja2JveC13cmFwcGVyPlxyXG4gICAgICAgICAgICAgIDxuei1zZWxlY3RcclxuICAgICAgICAgICAgICAgIFtuelNob3dTZWFyY2hdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0udHlwZSA9PSAnc2VsZWN0J1wiXHJcbiAgICAgICAgICAgICAgICBuelBsYWNlSG9sZGVyPVwie3tpdGVtLnBsYWNlaG9sZGVyfX1cIlxyXG4gICAgICAgICAgICAgICAgbnpBbGxvd0NsZWFyPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCJcclxuICAgICAgICAgICAgICAgIG56U2VydmVyU2VhcmNoXHJcbiAgICAgICAgICAgICAgICBbbnpNb2RlXT1cIml0ZW0ubnpNb2RlIHx8ICdkZWZhdWx0J1wiXHJcbiAgICAgICAgICAgICAgICBuekRpc2FibGVkPVwie3tpdGVtLnJlYWRvbmx5fHwgZm9ybU9wdHMudHlwZSA9PSAndmlldyd9fVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPG56LW9wdGlvbiAqbmdGb3I9XCJsZXQgbyBvZiBkaWN0c1tpdGVtLmRpY3RDb2RlXVwiIFtuekxhYmVsXT1cIm8udHlwZU5hbWVcIiBbbnpWYWx1ZV09XCJvLmlkXCI+PC9uei1vcHRpb24+XHJcbiAgICAgICAgICAgICAgPC9uei1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgPG56LXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgW256U2hvd1NlYXJjaF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50eXBlID09ICdzZWxlY3RjJ1wiXHJcbiAgICAgICAgICAgICAgICBuelBsYWNlSG9sZGVyPVwie3tpdGVtLnBsYWNlaG9sZGVyfX1cIlxyXG4gICAgICAgICAgICAgICAgbnpBbGxvd0NsZWFyPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCJcclxuICAgICAgICAgICAgICAgIG56U2VydmVyU2VhcmNoXHJcbiAgICAgICAgICAgICAgICBbbnpNb2RlXT1cIml0ZW0ubnpNb2RlIHx8ICdkZWZhdWx0J1wiXHJcbiAgICAgICAgICAgICAgICBuekRpc2FibGVkPVwie3tpdGVtLnJlYWRvbmx5fHwgZm9ybU9wdHMudHlwZSA9PSAndmlldyd9fVwiXHJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZWxlY3RDaGFuZ2UoJGV2ZW50LGl0ZW0pXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bnotb3B0aW9uICpuZ0Zvcj1cImxldCBvIG9mIGl0ZW0uZGljdExpc3RcIiBbbnpMYWJlbF09XCJvLmxhYmVsXCIgW256VmFsdWVdPVwiby52YWx1ZVwiPjwvbnotb3B0aW9uPlxyXG4gICAgICAgICAgICAgIDwvbnotc2VsZWN0PlxyXG4gICAgICAgICAgICAgIDxuei1jYXNjYWRlciBbbnpEaXNhYmxlZF09XCJpdGVtLnJlYWRvbmx5XCIgc3R5bGU9XCJmbGV4OiAxXCIgW256QWxsb3dDbGVhcl09XCIhaXRlbS5ub3ROdWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW256U2hvd1NlYXJjaF09XCJ0cnVlXCIgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ2Nhc2NhZGVyJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuekNoYW5nZU9uU2VsZWN0XSA9IFwiaXRlbS5hbGxvd1NlbGVjdE5vZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbbnpPcHRpb25zXT1cIml0ZW0uZGljdExpc3RcIiBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCI+PC9uei1jYXNjYWRlcj5cclxuICAgICAgICAgICAgICA8bnotZGF0ZS1waWNrZXIgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ2RhdGUnXCIgW256Rm9ybWF0XT1cIml0ZW0uZGF0ZUZvcm1hdCA/IGl0ZW0uZGF0ZUZvcm1hdCA6ICd5eXl5LU1NLWRkJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuelNob3dUaW1lXT1cInNob3dUaW1lKGl0ZW0pXCIgc3R5bGU9XCJmbGV4OiAxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW256RGlzYWJsZWRdPVwiZm9ybU9wdHMudHlwZSA9PSAndmlldycgfHwgaXRlbS5yZWFkb25seSBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCI+PC9uei1kYXRlLXBpY2tlcj5cclxuICAgICAgICAgICAgICA8bnotcmFuZ2UtcGlja2VyICpuZ0lmPVwiaXRlbS50eXBlID09ICdkYXRlUmFuZ2UnXCIgc3R5bGU9XCJmbGV4OiAxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuelNob3dUaW1lXT1cIml0ZW0ubnpTaG93VGltZT8gaXRlbS5uelNob3dUaW1lIDogZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbnpGb3JtYXRdPVwiaXRlbS5uelNob3dUaW1lICYmIGl0ZW0ubnpTaG93VGltZS5uekZvcm1hdCA/ICgneXl5eS1NTS1kZCAnKyBpdGVtLm56U2hvd1RpbWUubnpGb3JtYXQpIDogJ3l5eXktTU0tZGQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuelBsYWNlSG9sZGVyXT1cIlsn5byA5aeL5pe26Ze0JywgJ+e7k+adn+aXtumXtCddXCI+PC9uei1yYW5nZS1waWNrZXI+XHJcblxyXG4gICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cIml0ZW0udHlwZSA9PSAnaW1hZ2UnXCIgbnotaW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtoaWRkZW5dPVwidHJ1ZVwiLz5cclxuICAgICAgICAgICAgICA8YXRyLWltZy11cGxvYWQgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ2ltYWdlJ1wiIFsob3B0cyldPVwiaXRlbS5pbWFnZU9wdHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25CZWZvcmVVcGxvYWQpPVwib25CZWZvcmVVcGxvYWQoJGV2ZW50LGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFmdGVyQ2hhbmdlKT1cImltYWdlVXBsb2FkQ2hhbmdlKCRldmVudClcIj48L2F0ci1pbWctdXBsb2FkPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgIDxlZGl0b3IgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ2VkaXRvcidcIiBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJ7aW5pdGlhbEZyYW1lSGVpZ2h0Oml0ZW0uaGVpZ2h0fVwiID48L2VkaXRvcj4tLT5cclxuICAgICAgICAgICAgICA8YXBwLXF1aWxsLWVkaXRvciAqbmdJZj1cIml0ZW0udHlwZSA9PSAnZWRpdG9yJ1wiIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiAobmdNb2RlbENoYW5nZSk9XCJlZGl0Q2hhbmdlKCRldmVudCxpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlc109XCJ7aGVpZ2h0Oml0ZW0uaGVpZ2h0ID4gMCA/IGl0ZW0uaGVpZ2h0ICsgJ3B4JyA6ICcyNTBweCd9XCI+PC9hcHAtcXVpbGwtZWRpdG9yPlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ3dvcmQnXCIgW2lubmVySFRNTF09XCJpdGVtLnZhbHVlIHxkZWZWYWw6aXRlbS5kZWZhdWx0VmFsdWUgfHNhZmVIdG1sXCI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0udHlwZSA9PSAnYnV0dG9ucydcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJ0biBvZiBpdGVtLmJ1dHRvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuei1idXR0b24gdHlwZT1cImJ1dHRvblwiIFtuelR5cGVdPVwiYnRuLmJ0blR5cGUgfGRlZlZhbDogJ2RlZmF1bHQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFudC1idG4gYW50LWJ0bi1wcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi1yaWdodDogNXB4XCIgKm5nSWY9XCJidG4uaXNTaG93IHx8IGlzU2hvdyhmYWxzZSxidG4ub3BlcmF0b3IpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZG9BY3Rpb24oYnRuLCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e2J0bi5uYW1lfX08L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2YWxpZCBvZiBpdGVtLnZhbGlkYXRvcnNcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhdHJGb3JtLmdldChpdGVtLmtleSkuaGFzRXJyb3IodmFsaWQudHlwZSkgJiYgKGF0ckZvcm0uZ2V0KGl0ZW0ua2V5KS5kaXJ0eSApXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJjb2xvcjpyZWQ7ICAgIGhlaWdodDogMTVweDttYXJnaW46IDA7bGluZS1oZWlnaHQ6IDE1cHg7XCI+e3t2YWxpZC5lcnJvckxhYmVsfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gbnotYnV0dG9uIG56VHlwZT1cImRlZmF1bHRcIiBzdHlsZT1cImN1cnNvcjogZGVmYXVsdDtiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO2NvbG9yOiBibGFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0uZW5kc1wiIGRpc2FibGVkPlxyXG4gICAgICAgICAgICAgICAge3tpdGVtLmVuZHN9fVxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpdGVtLmJ1dHRvbj8uaXNTaG93XCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYW50LWJ0biBhbnQtYnRuLXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRvQWN0aW9uKGl0ZW0uYnV0dG9uLCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPnt7aXRlbS5idXR0b24ubmFtZX19PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0ucHJvcG9zYWxcIiBzdHlsZT1cImNvbG9yOiByZWQ7d2lkdGg6IDEwMCVcIj57e2l0ZW0ucHJvcG9zYWx9fTwvZGl2PlxyXG4gICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgPC9uei1mb3JtLWl0ZW0+XHJcbiAgICAgICAgPG5nLWNvbnRlbnQgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtLnRlbXBcIj48L25nLWNvbnRlbnQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9kaXY+XHJcblxyXG48L2Zvcm0+XHJcbiJdfQ==