@adins/ucsearch 2.9.16 → 2.9.18

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.
@@ -79,6 +79,7 @@ export class UCSearchComponent {
79
79
  this.BusinessDt = new Date();
80
80
  this.dateWrong = false;
81
81
  this.readonly = false;
82
+ this.isSearch = false;
82
83
  this.currentState = 'initial';
83
84
  this.countForm = 0;
84
85
  this.formattedAmount = '';
@@ -403,11 +404,15 @@ export class UCSearchComponent {
403
404
  });
404
405
  await this.initiateForm();
405
406
  }
406
- search(apiUrl, pageNo, rowPerPage, orderBy, addCrit = new Array(), IsExportExcel = false) {
407
+ async search(apiUrl, pageNo, rowPerPage, orderBy, addCrit = new Array(), IsExportExcel = false) {
407
408
  let request = new RequestCriteriaObj();
408
409
  let arrCrit = new Array();
409
410
  let IsQueryIn = false;
410
411
  let IsBreak = false;
412
+ let bodyList = new Array();
413
+ let fileName;
414
+ let bodyData = new Array();
415
+ let dataFile = new Array();
411
416
  // Inject whereQuery for where criteria
412
417
  if (this.searchInput.whereValue != undefined && this.searchInput.whereValue.length != 0) {
413
418
  this.configuration.querystring.whereQuery = new Array();
@@ -569,10 +574,16 @@ export class UCSearchComponent {
569
574
  if (this.searchInput.isJoinExAPI) {
570
575
  request.integrationObj = this.searchInput.integrationObj;
571
576
  }
577
+ this.isSearch = true;
578
+ await this.getJSON(this.searchInput._url).subscribe(data => {
579
+ bodyList = data.bodyList;
580
+ fileName = data.title;
581
+ });
572
582
  this.http.post(apiUrl, request).subscribe((response) => {
573
583
  if (IsExportExcel) {
574
- this.ExcelData = response["Data"];
575
- this.excelService.exportAsExcelFile(this.ExcelData, 'sample');
584
+ bodyData = response["Data"];
585
+ dataFile = this.mapDataFile(bodyList, bodyData);
586
+ this.excelService.exportAsExcelFile(dataFile, fileName);
576
587
  return;
577
588
  }
578
589
  let qryPaging = {
@@ -605,6 +616,25 @@ export class UCSearchComponent {
605
616
  }
606
617
  return true;
607
618
  }
619
+ mapDataFile(bodyListData, bodyDataArr) {
620
+ let dataExcel = new Array();
621
+ let bodyDataTemp = new Array();
622
+ for (let i = 0; i < bodyListData.length; i++) {
623
+ if (bodyListData[i]['type'] != 'action') {
624
+ bodyDataTemp.push(bodyListData[i]['property']);
625
+ }
626
+ }
627
+ for (let i = 0; i < bodyDataArr.length; i++) {
628
+ let finalData = {};
629
+ for (const [key, value] of Object.entries(bodyDataArr[i])) {
630
+ if (bodyDataTemp.indexOf(key) != -1) {
631
+ finalData[key] = value;
632
+ }
633
+ }
634
+ dataExcel.push(finalData);
635
+ }
636
+ return dataExcel;
637
+ }
608
638
  GenerateReport(enjiForm) {
609
639
  enjiForm.form.markAllAsTouched();
610
640
  if (!enjiForm.form.valid)
@@ -918,7 +948,7 @@ export class UCSearchComponent {
918
948
  }
919
949
  }
920
950
  /** @nocollapse */ /** @nocollapse */ UCSearchComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.2", ngImport: i0, type: UCSearchComponent, deps: [{ token: i1.HttpClient }, { token: i2.ExcelService }, { token: i0.Renderer2 }, { token: DOCUMENT }, { token: i3.ToastrService }, { token: i4.CookieService }, { token: i5.DatePipe }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
921
- /** @nocollapse */ /** @nocollapse */ UCSearchComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.2", type: UCSearchComponent, selector: "lib-UCSearch", inputs: { searchInput: "searchInput", pageSize: "pageSize", isReport: "isReport" }, outputs: { result: "result", genRpt: "genRpt", reqGetAllData: "reqGetAllData" }, providers: [ExcelService, DatePipe], viewQueries: [{ propertyName: "content", first: true, predicate: ["enjiForm"], descendants: true }, { propertyName: "myForm", first: true, predicate: ["formIdSearch"], descendants: true }], ngImport: i0, template: "<!-- Basic form layout section start -->\r\n<section id=\"horizontal-form-layouts\">\r\n <div class=\"row text-left\">\r\n <div class=\"col-md-12\">\r\n <div class=\"card\">\r\n <div class=\"pl-3 mb-2 mt-2\" *ngIf=\"configuration?.title != undefined && configuration?.title != ''\">\r\n <h4 class=\"card-title ucSearch-title\" translate>{{configuration.title}}</h4>\r\n </div>\r\n <div class=\"card-body\">\r\n <div class=\"px-3\">\r\n <form class=\"form form-horizontal\" id=\"formSearch\" #formIdSearch #enjiForm=\"ngForm\"\r\n (ngSubmit)=\"enjiForm.valid && searchClick()\">\r\n <div class=\"form-body\">\r\n <h4 class=\"form-section font-weight-bold\">\r\n <div (click)=\"changeState()\" class=\"btn no-padding cursor-pointer flip\">\r\n <i class=\"fa\" style=\"font-size: 15px; margin: 0px 0px 5px -15px;\"\r\n [ngClass]=\"isHidden ? 'fa-chevron-right' : 'fa-chevron-down'\"></i>\r\n </div>\r\n <span\r\n *ngIf=\"configuration?.sectionTitle != undefined && configuration?.sectionTitle != ''; then inputSectionTitle else defaultSectionTitle\"></span>\r\n <ng-template #inputSectionTitle>\r\n {{configuration?.sectionTitle}}\r\n </ng-template>\r\n <ng-template #defaultSectionTitle>\r\n Paging\r\n </ng-template>\r\n </h4>\r\n <!-- Ini Digunakan untuk Generate Dynamic Component -->\r\n <!-- [hidden]=\"isHidden\" -->\r\n <div class=\"panel-active\" [@changeDivSize]=currentState>\r\n <div class=\"row\">\r\n <div class=\"col-md-6 form-group\" *ngFor=\"let question of configuration?.component; let i = index\">\r\n <div class=\"col-md-12\">\r\n <div class=\"row\">\r\n <label class=\"col-md-5 no-padding\" for=\"{{question.id}}\"\r\n [ngClass]=\"{'adins-required-label': (question.isRequired || (question?.ddlType != undefined && question.ddlType == 'one'))}\"\r\n translate>{{question.label}}</label>\r\n <div class=\"col-md-7 no-padding\">\r\n <div *ngIf=\"question.type=='textbox'\">\r\n <input type=\"text\" id=\"{{question.id}}\" class=\"form-control search-form-control\"\r\n [ngModel]=\"question.value\" [required]=\"question.isRequired\" name=\"{{question.name}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-type=\"{{question.datatype}}\"\r\n attr.data-name=\"{{question.name}}\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.label=\"{{question.label}}\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question.type=='textarea'\">\r\n <textarea type=\"text\" id=\"{{question.id}}\" class=\"form-control search-form-control\"\r\n [ngModel]=\"question.value\" [required]=\"question.isRequired\" name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" attr.data-type=\"{{question.datatype}}\"\r\n attr.data-name=\"{{question.name}}\" value=\"{{question.value}}\"\r\n attr.label=\"{{question.label}}\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\"></textarea>\r\n </div>\r\n <div *ngIf=\"question.type=='numeric'\">\r\n <input type=\"number\" id=\"{{question.id}}\" (focus)=\"transformToDecimal($event)\"\r\n (blur)=\"transformToDecimal($event)\" class=\"form-control search-form-control\"\r\n [ngModel]=\"question.value\" [required]=\"question.isRequired\" name=\"{{question.name+[i]}}\"\r\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-numericpair=\"{{question.numericPair}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n attr.label=\"{{question.label}}\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name+[i]]?.dirty) && enjiForm.form.controls[question.name+[i]]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question.type=='currency'\">\r\n <div *ngIf=\"question?.isCustom != undefined && question?.isCustom\">\r\n <input type=\"\" id=\"{{question.id}}\" class=\"form-control search-form-control\"\r\n [required]=\"question.isRequired\" name=\"{{question.name}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" currencyMask [ngModel]=\"question.value\"\r\n [(ngModel)]=\"question.value\" [ngModelOptions]=\"{standalone: true}\"\r\n attr.label=\"{{question.label}}\"\r\n [options]=\"{ thousands: question.thousands, decimal: question.decimal, align: question.align, allowNegative: question.allowNegative, allowZero: question.allowZero, precision: question.precision, nullable: question.nullable }\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question?.isCustom == undefined || !question?.isCustom\">\r\n <input type=\"text\" id=\"{{question.id}}\" class=\"form-control search-form-control\"\r\n [required]=\"question.isRequired\" name=\"{{question.name}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" currencyMask [ngModel]=\"question.value\"\r\n [(ngModel)]=\"question.value\" [ngModelOptions]=\"{standalone: true}\"\r\n attr.label=\"{{question.label}}\"\r\n [options]=\"{ thousands: ',', decimal: '.', align: 'right', allowNegative: false, allowZero:true, precision: 2, nullable: false }\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n </div>\r\n\r\n <!-- End Hardcode Lookup didalem-->\r\n <div *ngIf=\"question.type=='datepicker'\">\r\n <input type=\"{{question.isTime ? 'datetime-local' : 'date'}}\" id=\"{{question.id}}\"\r\n class=\"form-control search-form-control btn-lookup\" name=\"{{question.name+[i]}}\"\r\n [ngModel]=\"question.value\" [required]=\"question.isRequired\"\r\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\r\n [readonly]=\"question.readonly\" attr.data-type=\"{{question.datatype}}\"\r\n attr.data-name=\"{{question.name}}\"\r\n attr.data-datepickerpair=\"{{question.datepickerPair}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.label=\"{{question.label}}\" min=\"{{question.minDate | date:'yyyy-MM-dd'}}\"\r\n max=\"{{question.maxDate | date:'yyyy-MM-dd'}}\"\r\n (focusout)=\"question.restriction != undefined && checkInputDate(question)\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name+[i]]?.dirty) && enjiForm.form.controls[question.name+[i]]?.invalid }\">\r\n </div>\r\n <div\r\n *ngIf=\"question.type == 'taskDefinitionKey' || question.type == 'processKey' || question.type == 'officeRoleCodes'\">\r\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\r\n [required]=\"question.isRequired\" class=\"form-control search-form-control\"\r\n attr.query-in=\"{{question.isQueryIn}}\" attr.data-type=\"{{question.datatype}}\"\r\n attr.label=\"{{question.label}}\" [hidden]=\"question?.itemsUrl?.length == 1\"\r\n (change)=\"(question.type == 'taskDefinitionKey' || question.type == 'processKey') ? SetProcessKey(i,question.wfKeyFilter) : SetRoleOfficeCodes(i)\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n <option *ngIf=\"question.ddlType == 'one' && question?.itemsUrl?.length != 1\"\r\n value=\"one\">Select One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && question?.itemsUrl?.length != 1\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of question?.itemsUrl\" value=\"{{item.Key}}\">\r\n {{item.Value}}\r\n </option>\r\n </select>\r\n <label *ngIf=\"question?.itemsUrl?.length == 1\">{{question.itemsUrl[0].Value}}</label>\r\n </div>\r\n <div *ngIf=\"question.type=='dropdown'\">\r\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\r\n [(ngModel)]=\"question.value\" [required]=\"question.isRequired\"\r\n class=\"form-control search-form-control\" attr.query-in=\"{{question.isQueryIn}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.label=\"{{question.label}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n [hidden]=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\"\r\n (change)=\"question.isEvent ? onChangeEvent($event.target.value, question) : ''\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n <option\r\n *ngIf=\"question.ddlType == 'one' && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\r\n value=\"one\">\r\n Select One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of !question.isFromURL ? question?.items : question?.itemsUrl\"\r\n value=\"{{!question.isFromURL ? item.key : item.Key}}\">\r\n {{!question.isFromURL ? item.value : item.Value}}\r\n </option>\r\n </select>\r\n <label\r\n *ngIf=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\">{{!question.isFromURL\r\n ? question.items[0].value :\r\n question.itemsUrl[0].Value}}</label>\r\n </div>\r\n <div *ngIf=\"question.type=='dropdownSearch'\">\r\n <div class=\"dds-display-item\"\r\n [hidden]=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\">\r\n <input type=\"text\" class=\"form-control search-form-control dds-input\"\r\n name=\"{{'ddsValue'+question.name}}\" [(ngModel)]=\"question.descr\" readonly\r\n (click)=\"question.isListHide = !question.isListHide; question.searchText=''\">\r\n </div>\r\n <label\r\n *ngIf=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\">{{question.descr}}</label>\r\n <div class=\"dds-list-container\" [hidden]=\"question.isListHide\">\r\n <input type=\"text\" class=\"form-control search-form-control\"\r\n name=\"{{'searchText'+question.name}}\" [(ngModel)]=\"question.searchText\"\r\n [placeholder]=\"question.placeholder\">\r\n <div class=\"dds-items-container\">\r\n <select class=\"full-width\" name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" [(ngModel)]=\"question.value\"\r\n [required]=\"question.isRequired\" attr.query-in=\"{{question.isQueryIn}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.label=\"{{question.label}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n (change)=\"question.isEvent ? onChangeEvent($event.target.value, question) : ''\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\"\r\n size=\"{{question?.size == undefined ? question?.size : 10}}\">\r\n <option (click)=\"selectedOption({Key:'one',Value:'Select One'},question)\"\r\n *ngIf=\"question.ddsType == 'one' && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\r\n value=\"one\">\r\n Select One</option>\r\n <option (click)=\"selectedOption({Key:'all',Value:'All'},question)\"\r\n *ngIf=\"(question?.ddsType == undefined || question.ddsType == 'all') && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\r\n value=\"all\">All</option>\r\n <!-- <option *ngFor=\"let item of question?.items | textSearch : question.searchText; let i=index\" [value]=\"item?.key\" (click)=\"selectedOption(item,question)\">\r\n {{item?.value}}\r\n </option> -->\r\n <option\r\n *ngFor=\"let item of !question.isFromURL ? (question?.items | textSearch : question.searchText) : question?.itemsUrl | textSearch : question.searchText\"\r\n (click)=\"selectedOption(item,question)\" value=\"{{item.Key}}\">\r\n {{item.Value}}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"question.type=='claim'\">\r\n <select name=\"{{'claim'+[i]}}\" class=\"form-control search-form-control\"\r\n attr.data-type=\"{{'text'}}\" attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n attr.data-name=\"{{'Assignee'}}\" [hidden]=\"ClaimList?.length == 1\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls['claim'+[i]]?.touched || enjiForm.form.controls['claim'+[i]]?.dirty) && enjiForm.form.controls['claim'+[i]]?.invalid }\">\r\n <option *ngIf=\"question.ddlType == 'one' && ClaimList?.length != 1\" value=\"one\">Select\r\n One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && ClaimList?.length != 1\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of ClaimList\" value=\"{{item.Key}}\">\r\n {{item.Value}}\r\n </option>\r\n </select>\r\n </div>\r\n <lib-uc-show-errors *ngIf=\"question.type!='datepicker'\"\r\n [control]=\"enjiForm.form.controls[question.name]\" [submit]=\"enjiForm.submitted\">\r\n </lib-uc-show-errors>\r\n <lib-uc-show-errors *ngIf=\"question.type=='datepicker'\"\r\n [control]=\"enjiForm.form.controls[question.name+[i]]\" [submit]=\"enjiForm.submitted\">\r\n </lib-uc-show-errors>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6 form-group\" *ngIf=\"(isReport != undefined && isReport)\">\r\n <div class=\"col-md-12\">\r\n <div class=\"row\">\r\n <label class=\"col-md-5 no-padding\" translate>Report Type</label>\r\n <div class=\"col-md-7 no-padding\">\r\n <select name=\"ExportType\" [(ngModel)]=\"ExportType\" class=\"form-control search-form-control\"\r\n attr.data-type=\"text\">\r\n <option *ngFor=\"let item of ExportTypeList\" [value]=\"item.key\">{{item.value}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 no-padding\">\r\n <div class=\"form-actions right\">\r\n <button *ngIf=\"exportData == true\" type=\"button\" (click)=\"exportAsXLSX()\"\r\n class=\"btn btn-raised btn-success mr-1\" translate>\r\n <i class=\"fa ft-download\"></i>&nbsp;<span translate>Export Excel</span>\r\n </button>\r\n <button type=\"button\" (click)=\"reset()\" class=\"btn btn-raised btn-warning mr-1\" translate>\r\n <i class=\"fa fa-times\"></i>&nbsp;<span translate>Reset</span>\r\n </button>\r\n <button *ngIf=\"(isReport == undefined || !isReport)\" type=\"submit\"\r\n class=\"btn btn-raised btn-primary\" #UCSearchClick>\r\n <i class=\"fa fa-search\"></i>&nbsp;<span translate>Search</span>\r\n </button>\r\n <button *ngIf=\"(isReport != undefined && isReport)\" type=\"button\" (click)=\"GenerateReport(enjiForm)\"\r\n class=\"btn btn-raised btn-primary\">\r\n <i class=\"fa ft-download\"></i>&nbsp;<span translate>Generate\r\n Report</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n<br>\r\n<!-- // Basic form layout section end -->", styles: [".ucSearch-title{margin:3px}.dds-input{background-color:#fff;text-transform:uppercase}.dds-display-item:after{content:\"\\e929\";font-family:feather;font-size:1rem;display:inline-block;position:absolute;right:5px;top:5px;transform:rotate(90deg)}.dds-list-container{position:absolute;width:100%;z-index:9}\n"], components: [{ type: i6.UcShowErrorsComponent, selector: "lib-uc-show-errors", inputs: ["customPattern", "control", "submit", "fieldName"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { type: i8.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i8.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i8.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i9.UpperCaseDirective, selector: "input[type=text], input", inputs: ["IsUpperCase"] }, { type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i8.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i8.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i10.CurrencyMaskDirective, selector: "[currencyMask]", inputs: ["options"] }, { type: i8.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i8.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i8.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }], pipes: { "date": i5.DatePipe, "textSearch": i11.TextSearchPipe }, animations: [
951
+ /** @nocollapse */ /** @nocollapse */ UCSearchComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.2", type: UCSearchComponent, selector: "lib-UCSearch", inputs: { searchInput: "searchInput", pageSize: "pageSize", isReport: "isReport" }, outputs: { result: "result", genRpt: "genRpt", reqGetAllData: "reqGetAllData" }, providers: [ExcelService, DatePipe], viewQueries: [{ propertyName: "content", first: true, predicate: ["enjiForm"], descendants: true }, { propertyName: "myForm", first: true, predicate: ["formIdSearch"], descendants: true }], ngImport: i0, template: "<!-- Basic form layout section start -->\r\n<section id=\"horizontal-form-layouts\">\r\n <div class=\"row text-left\">\r\n <div class=\"col-md-12\">\r\n <div class=\"card\">\r\n <div class=\"pl-3 mb-2 mt-2\" *ngIf=\"configuration?.title != undefined && configuration?.title != ''\">\r\n <h4 class=\"card-title ucSearch-title\" translate>{{configuration.title}}</h4>\r\n </div>\r\n <div class=\"card-body\">\r\n <div class=\"px-3\">\r\n <form class=\"form form-horizontal\" id=\"formSearch\" #formIdSearch #enjiForm=\"ngForm\"\r\n (ngSubmit)=\"enjiForm.valid && searchClick()\">\r\n <div class=\"form-body\">\r\n <h4 class=\"form-section font-weight-bold\">\r\n <div (click)=\"changeState()\" class=\"btn no-padding cursor-pointer flip\">\r\n <i class=\"fa\" style=\"font-size: 15px; margin: 0px 0px 5px -15px;\"\r\n [ngClass]=\"isHidden ? 'fa-chevron-right' : 'fa-chevron-down'\"></i>\r\n </div>\r\n <span\r\n *ngIf=\"configuration?.sectionTitle != undefined && configuration?.sectionTitle != ''; then inputSectionTitle else defaultSectionTitle\"></span>\r\n <ng-template #inputSectionTitle>\r\n {{configuration?.sectionTitle}}\r\n </ng-template>\r\n <ng-template #defaultSectionTitle>\r\n Paging\r\n </ng-template>\r\n </h4>\r\n <!-- Ini Digunakan untuk Generate Dynamic Component -->\r\n <!-- [hidden]=\"isHidden\" -->\r\n <div class=\"panel-active\" [@changeDivSize]=currentState>\r\n <div class=\"row\">\r\n <div class=\"col-md-6 form-group\" *ngFor=\"let question of configuration?.component; let i = index\">\r\n <div class=\"col-md-12\">\r\n <div class=\"row\">\r\n <label class=\"col-md-5 no-padding\" for=\"{{question.id}}\"\r\n [ngClass]=\"{'adins-required-label': (question.isRequired || (question?.ddlType != undefined && question.ddlType == 'one'))}\"\r\n translate>{{question.label}}</label>\r\n <div class=\"col-md-7 no-padding\">\r\n <div *ngIf=\"question.type=='textbox'\">\r\n <input type=\"text\" id=\"{{question.id}}\" class=\"form-control search-form-control\"\r\n [ngModel]=\"question.value\" [required]=\"question.isRequired\" name=\"{{question.name}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-type=\"{{question.datatype}}\"\r\n attr.data-name=\"{{question.name}}\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.label=\"{{question.label}}\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question.type=='textarea'\">\r\n <textarea type=\"text\" id=\"{{question.id}}\" class=\"form-control search-form-control\"\r\n [ngModel]=\"question.value\" [required]=\"question.isRequired\" name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" attr.data-type=\"{{question.datatype}}\"\r\n attr.data-name=\"{{question.name}}\" value=\"{{question.value}}\"\r\n attr.label=\"{{question.label}}\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\"></textarea>\r\n </div>\r\n <div *ngIf=\"question.type=='numeric'\">\r\n <input type=\"number\" id=\"{{question.id}}\" (focus)=\"transformToDecimal($event)\"\r\n (blur)=\"transformToDecimal($event)\" class=\"form-control search-form-control\"\r\n [ngModel]=\"question.value\" [required]=\"question.isRequired\" name=\"{{question.name+[i]}}\"\r\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-numericpair=\"{{question.numericPair}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n attr.label=\"{{question.label}}\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name+[i]]?.dirty) && enjiForm.form.controls[question.name+[i]]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question.type=='currency'\">\r\n <div *ngIf=\"question?.isCustom != undefined && question?.isCustom\">\r\n <input type=\"\" id=\"{{question.id}}\" class=\"form-control search-form-control\"\r\n [required]=\"question.isRequired\" name=\"{{question.name}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" currencyMask [ngModel]=\"question.value\"\r\n [(ngModel)]=\"question.value\" [ngModelOptions]=\"{standalone: true}\"\r\n attr.label=\"{{question.label}}\"\r\n [options]=\"{ thousands: question.thousands, decimal: question.decimal, align: question.align, allowNegative: question.allowNegative, allowZero: question.allowZero, precision: question.precision, nullable: question.nullable }\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question?.isCustom == undefined || !question?.isCustom\">\r\n <input type=\"text\" id=\"{{question.id}}\" class=\"form-control search-form-control\"\r\n [required]=\"question.isRequired\" name=\"{{question.name}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" currencyMask [ngModel]=\"question.value\"\r\n [(ngModel)]=\"question.value\" [ngModelOptions]=\"{standalone: true}\"\r\n attr.label=\"{{question.label}}\"\r\n [options]=\"{ thousands: ',', decimal: '.', align: 'right', allowNegative: false, allowZero:true, precision: 2, nullable: false }\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n </div>\r\n\r\n <!-- End Hardcode Lookup didalem-->\r\n <div *ngIf=\"question.type=='datepicker'\">\r\n <input type=\"{{question.isTime ? 'datetime-local' : 'date'}}\" id=\"{{question.id}}\"\r\n class=\"form-control search-form-control btn-lookup\" name=\"{{question.name+[i]}}\"\r\n [ngModel]=\"question.value\" [required]=\"question.isRequired\"\r\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\r\n [readonly]=\"question.readonly\" attr.data-type=\"{{question.datatype}}\"\r\n attr.data-name=\"{{question.name}}\"\r\n attr.data-datepickerpair=\"{{question.datepickerPair}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.label=\"{{question.label}}\" min=\"{{question.minDate | date:'yyyy-MM-dd'}}\"\r\n max=\"{{question.maxDate | date:'yyyy-MM-dd'}}\"\r\n (focusout)=\"question.restriction != undefined && checkInputDate(question)\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name+[i]]?.dirty) && enjiForm.form.controls[question.name+[i]]?.invalid }\">\r\n </div>\r\n <div\r\n *ngIf=\"question.type == 'taskDefinitionKey' || question.type == 'processKey' || question.type == 'officeRoleCodes'\">\r\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\r\n [required]=\"question.isRequired\" class=\"form-control search-form-control\"\r\n attr.query-in=\"{{question.isQueryIn}}\" attr.data-type=\"{{question.datatype}}\"\r\n attr.label=\"{{question.label}}\" [hidden]=\"question?.itemsUrl?.length == 1\"\r\n (change)=\"(question.type == 'taskDefinitionKey' || question.type == 'processKey') ? SetProcessKey(i,question.wfKeyFilter) : SetRoleOfficeCodes(i)\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n <option *ngIf=\"question.ddlType == 'one' && question?.itemsUrl?.length != 1\"\r\n value=\"one\">Select One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && question?.itemsUrl?.length != 1\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of question?.itemsUrl\" value=\"{{item.Key}}\">\r\n {{item.Value}}\r\n </option>\r\n </select>\r\n <label *ngIf=\"question?.itemsUrl?.length == 1\">{{question.itemsUrl[0].Value}}</label>\r\n </div>\r\n <div *ngIf=\"question.type=='dropdown'\">\r\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\r\n [(ngModel)]=\"question.value\" [required]=\"question.isRequired\"\r\n class=\"form-control search-form-control\" attr.query-in=\"{{question.isQueryIn}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.label=\"{{question.label}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n [hidden]=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\"\r\n (change)=\"question.isEvent ? onChangeEvent($event.target.value, question) : ''\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n <option\r\n *ngIf=\"question.ddlType == 'one' && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\r\n value=\"one\">\r\n Select One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of !question.isFromURL ? question?.items : question?.itemsUrl\"\r\n value=\"{{!question.isFromURL ? item.key : item.Key}}\">\r\n {{!question.isFromURL ? item.value : item.Value}}\r\n </option>\r\n </select>\r\n <label\r\n *ngIf=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\">{{!question.isFromURL\r\n ? question.items[0].value :\r\n question.itemsUrl[0].Value}}</label>\r\n </div>\r\n <div *ngIf=\"question.type=='dropdownSearch'\">\r\n <div class=\"dds-display-item\"\r\n [hidden]=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\">\r\n <input type=\"text\" class=\"form-control search-form-control dds-input\"\r\n name=\"{{'ddsValue'+question.name}}\" [(ngModel)]=\"question.descr\" readonly\r\n (click)=\"question.isListHide = !question.isListHide; question.searchText=''\">\r\n </div>\r\n <label\r\n *ngIf=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\">{{question.descr}}</label>\r\n <div class=\"dds-list-container\" [hidden]=\"question.isListHide\">\r\n <input type=\"text\" class=\"form-control search-form-control\"\r\n name=\"{{'searchText'+question.name}}\" [(ngModel)]=\"question.searchText\"\r\n [placeholder]=\"question.placeholder\">\r\n <div class=\"dds-items-container\">\r\n <select class=\"full-width\" name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" [(ngModel)]=\"question.value\"\r\n [required]=\"question.isRequired\" attr.query-in=\"{{question.isQueryIn}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.label=\"{{question.label}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n (change)=\"question.isEvent ? onChangeEvent($event.target.value, question) : ''\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\"\r\n size=\"{{question?.size == undefined ? question?.size : 10}}\">\r\n <option (click)=\"selectedOption({Key:'one',Value:'Select One'},question)\"\r\n *ngIf=\"question.ddsType == 'one' && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\r\n value=\"one\">\r\n Select One</option>\r\n <option (click)=\"selectedOption({Key:'all',Value:'All'},question)\"\r\n *ngIf=\"(question?.ddsType == undefined || question.ddsType == 'all') && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\r\n value=\"all\">All</option>\r\n <!-- <option *ngFor=\"let item of question?.items | textSearch : question.searchText; let i=index\" [value]=\"item?.key\" (click)=\"selectedOption(item,question)\">\r\n {{item?.value}}\r\n </option> -->\r\n <option\r\n *ngFor=\"let item of !question.isFromURL ? (question?.items | textSearch : question.searchText) : question?.itemsUrl | textSearch : question.searchText\"\r\n (click)=\"selectedOption(item,question)\" value=\"{{item.Key}}\">\r\n {{item.Value}}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"question.type=='claim'\">\r\n <select name=\"{{'claim'+[i]}}\" class=\"form-control search-form-control\"\r\n attr.data-type=\"{{'text'}}\" attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n attr.data-name=\"{{'Assignee'}}\" [hidden]=\"ClaimList?.length == 1\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls['claim'+[i]]?.touched || enjiForm.form.controls['claim'+[i]]?.dirty) && enjiForm.form.controls['claim'+[i]]?.invalid }\">\r\n <option *ngIf=\"question.ddlType == 'one' && ClaimList?.length != 1\" value=\"one\">Select\r\n One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && ClaimList?.length != 1\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of ClaimList\" value=\"{{item.Key}}\">\r\n {{item.Value}}\r\n </option>\r\n </select>\r\n </div>\r\n <lib-uc-show-errors *ngIf=\"question.type!='datepicker'\"\r\n [control]=\"enjiForm.form.controls[question.name]\" [submit]=\"enjiForm.submitted\">\r\n </lib-uc-show-errors>\r\n <lib-uc-show-errors *ngIf=\"question.type=='datepicker'\"\r\n [control]=\"enjiForm.form.controls[question.name+[i]]\" [submit]=\"enjiForm.submitted\">\r\n </lib-uc-show-errors>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6 form-group\" *ngIf=\"(isReport != undefined && isReport)\">\r\n <div class=\"col-md-12\">\r\n <div class=\"row\">\r\n <label class=\"col-md-5 no-padding\" translate>Report Type</label>\r\n <div class=\"col-md-7 no-padding\">\r\n <select name=\"ExportType\" [(ngModel)]=\"ExportType\" class=\"form-control search-form-control\"\r\n attr.data-type=\"text\">\r\n <option *ngFor=\"let item of ExportTypeList\" [value]=\"item.key\">{{item.value}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 no-padding\">\r\n <div class=\"form-actions right\">\r\n <button *ngIf=\"exportData == true && isSearch\" type=\"button\" (click)=\"exportAsXLSX()\"\r\n class=\"btn btn-raised btn-success mr-1\" translate>\r\n <i class=\"fa ft-download\"></i>&nbsp;<span translate>Export Excel</span>\r\n </button>\r\n <button type=\"button\" (click)=\"reset()\" class=\"btn btn-raised btn-warning mr-1\" translate>\r\n <i class=\"fa fa-times\"></i>&nbsp;<span translate>Reset</span>\r\n </button>\r\n <button *ngIf=\"(isReport == undefined || !isReport)\" type=\"submit\"\r\n class=\"btn btn-raised btn-primary\" #UCSearchClick>\r\n <i class=\"fa fa-search\"></i>&nbsp;<span translate>Search</span>\r\n </button>\r\n <button *ngIf=\"(isReport != undefined && isReport)\" type=\"button\" (click)=\"GenerateReport(enjiForm)\"\r\n class=\"btn btn-raised btn-primary\">\r\n <i class=\"fa ft-download\"></i>&nbsp;<span translate>Generate\r\n Report</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n<br>\r\n<!-- // Basic form layout section end -->", styles: [".ucSearch-title{margin:3px}.dds-input{background-color:#fff;text-transform:uppercase}.dds-display-item:after{content:\"\\e929\";font-family:feather;font-size:1rem;display:inline-block;position:absolute;right:5px;top:5px;transform:rotate(90deg)}.dds-list-container{position:absolute;width:100%;z-index:9}\n"], components: [{ type: i6.UcShowErrorsComponent, selector: "lib-uc-show-errors", inputs: ["customPattern", "control", "submit", "fieldName"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { type: i8.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i8.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i8.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i9.UpperCaseDirective, selector: "input[type=text], input", inputs: ["IsUpperCase"] }, { type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i8.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i8.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i10.CurrencyMaskDirective, selector: "[currencyMask]", inputs: ["options"] }, { type: i8.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i8.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i8.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }], pipes: { "date": i5.DatePipe, "textSearch": i11.TextSearchPipe }, animations: [
922
952
  trigger('changeDivSize', [
923
953
  state('initial', style({
924
954
  height: '*',
@@ -949,7 +979,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.2", ngImpor
949
979
  transition('initial=>final', animate('300ms')),
950
980
  transition('final=>initial', animate('300ms'))
951
981
  ]),
952
- ], template: "<!-- Basic form layout section start -->\r\n<section id=\"horizontal-form-layouts\">\r\n <div class=\"row text-left\">\r\n <div class=\"col-md-12\">\r\n <div class=\"card\">\r\n <div class=\"pl-3 mb-2 mt-2\" *ngIf=\"configuration?.title != undefined && configuration?.title != ''\">\r\n <h4 class=\"card-title ucSearch-title\" translate>{{configuration.title}}</h4>\r\n </div>\r\n <div class=\"card-body\">\r\n <div class=\"px-3\">\r\n <form class=\"form form-horizontal\" id=\"formSearch\" #formIdSearch #enjiForm=\"ngForm\"\r\n (ngSubmit)=\"enjiForm.valid && searchClick()\">\r\n <div class=\"form-body\">\r\n <h4 class=\"form-section font-weight-bold\">\r\n <div (click)=\"changeState()\" class=\"btn no-padding cursor-pointer flip\">\r\n <i class=\"fa\" style=\"font-size: 15px; margin: 0px 0px 5px -15px;\"\r\n [ngClass]=\"isHidden ? 'fa-chevron-right' : 'fa-chevron-down'\"></i>\r\n </div>\r\n <span\r\n *ngIf=\"configuration?.sectionTitle != undefined && configuration?.sectionTitle != ''; then inputSectionTitle else defaultSectionTitle\"></span>\r\n <ng-template #inputSectionTitle>\r\n {{configuration?.sectionTitle}}\r\n </ng-template>\r\n <ng-template #defaultSectionTitle>\r\n Paging\r\n </ng-template>\r\n </h4>\r\n <!-- Ini Digunakan untuk Generate Dynamic Component -->\r\n <!-- [hidden]=\"isHidden\" -->\r\n <div class=\"panel-active\" [@changeDivSize]=currentState>\r\n <div class=\"row\">\r\n <div class=\"col-md-6 form-group\" *ngFor=\"let question of configuration?.component; let i = index\">\r\n <div class=\"col-md-12\">\r\n <div class=\"row\">\r\n <label class=\"col-md-5 no-padding\" for=\"{{question.id}}\"\r\n [ngClass]=\"{'adins-required-label': (question.isRequired || (question?.ddlType != undefined && question.ddlType == 'one'))}\"\r\n translate>{{question.label}}</label>\r\n <div class=\"col-md-7 no-padding\">\r\n <div *ngIf=\"question.type=='textbox'\">\r\n <input type=\"text\" id=\"{{question.id}}\" class=\"form-control search-form-control\"\r\n [ngModel]=\"question.value\" [required]=\"question.isRequired\" name=\"{{question.name}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-type=\"{{question.datatype}}\"\r\n attr.data-name=\"{{question.name}}\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.label=\"{{question.label}}\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question.type=='textarea'\">\r\n <textarea type=\"text\" id=\"{{question.id}}\" class=\"form-control search-form-control\"\r\n [ngModel]=\"question.value\" [required]=\"question.isRequired\" name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" attr.data-type=\"{{question.datatype}}\"\r\n attr.data-name=\"{{question.name}}\" value=\"{{question.value}}\"\r\n attr.label=\"{{question.label}}\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\"></textarea>\r\n </div>\r\n <div *ngIf=\"question.type=='numeric'\">\r\n <input type=\"number\" id=\"{{question.id}}\" (focus)=\"transformToDecimal($event)\"\r\n (blur)=\"transformToDecimal($event)\" class=\"form-control search-form-control\"\r\n [ngModel]=\"question.value\" [required]=\"question.isRequired\" name=\"{{question.name+[i]}}\"\r\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-numericpair=\"{{question.numericPair}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n attr.label=\"{{question.label}}\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name+[i]]?.dirty) && enjiForm.form.controls[question.name+[i]]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question.type=='currency'\">\r\n <div *ngIf=\"question?.isCustom != undefined && question?.isCustom\">\r\n <input type=\"\" id=\"{{question.id}}\" class=\"form-control search-form-control\"\r\n [required]=\"question.isRequired\" name=\"{{question.name}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" currencyMask [ngModel]=\"question.value\"\r\n [(ngModel)]=\"question.value\" [ngModelOptions]=\"{standalone: true}\"\r\n attr.label=\"{{question.label}}\"\r\n [options]=\"{ thousands: question.thousands, decimal: question.decimal, align: question.align, allowNegative: question.allowNegative, allowZero: question.allowZero, precision: question.precision, nullable: question.nullable }\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question?.isCustom == undefined || !question?.isCustom\">\r\n <input type=\"text\" id=\"{{question.id}}\" class=\"form-control search-form-control\"\r\n [required]=\"question.isRequired\" name=\"{{question.name}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" currencyMask [ngModel]=\"question.value\"\r\n [(ngModel)]=\"question.value\" [ngModelOptions]=\"{standalone: true}\"\r\n attr.label=\"{{question.label}}\"\r\n [options]=\"{ thousands: ',', decimal: '.', align: 'right', allowNegative: false, allowZero:true, precision: 2, nullable: false }\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n </div>\r\n\r\n <!-- End Hardcode Lookup didalem-->\r\n <div *ngIf=\"question.type=='datepicker'\">\r\n <input type=\"{{question.isTime ? 'datetime-local' : 'date'}}\" id=\"{{question.id}}\"\r\n class=\"form-control search-form-control btn-lookup\" name=\"{{question.name+[i]}}\"\r\n [ngModel]=\"question.value\" [required]=\"question.isRequired\"\r\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\r\n [readonly]=\"question.readonly\" attr.data-type=\"{{question.datatype}}\"\r\n attr.data-name=\"{{question.name}}\"\r\n attr.data-datepickerpair=\"{{question.datepickerPair}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.label=\"{{question.label}}\" min=\"{{question.minDate | date:'yyyy-MM-dd'}}\"\r\n max=\"{{question.maxDate | date:'yyyy-MM-dd'}}\"\r\n (focusout)=\"question.restriction != undefined && checkInputDate(question)\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name+[i]]?.dirty) && enjiForm.form.controls[question.name+[i]]?.invalid }\">\r\n </div>\r\n <div\r\n *ngIf=\"question.type == 'taskDefinitionKey' || question.type == 'processKey' || question.type == 'officeRoleCodes'\">\r\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\r\n [required]=\"question.isRequired\" class=\"form-control search-form-control\"\r\n attr.query-in=\"{{question.isQueryIn}}\" attr.data-type=\"{{question.datatype}}\"\r\n attr.label=\"{{question.label}}\" [hidden]=\"question?.itemsUrl?.length == 1\"\r\n (change)=\"(question.type == 'taskDefinitionKey' || question.type == 'processKey') ? SetProcessKey(i,question.wfKeyFilter) : SetRoleOfficeCodes(i)\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n <option *ngIf=\"question.ddlType == 'one' && question?.itemsUrl?.length != 1\"\r\n value=\"one\">Select One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && question?.itemsUrl?.length != 1\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of question?.itemsUrl\" value=\"{{item.Key}}\">\r\n {{item.Value}}\r\n </option>\r\n </select>\r\n <label *ngIf=\"question?.itemsUrl?.length == 1\">{{question.itemsUrl[0].Value}}</label>\r\n </div>\r\n <div *ngIf=\"question.type=='dropdown'\">\r\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\r\n [(ngModel)]=\"question.value\" [required]=\"question.isRequired\"\r\n class=\"form-control search-form-control\" attr.query-in=\"{{question.isQueryIn}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.label=\"{{question.label}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n [hidden]=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\"\r\n (change)=\"question.isEvent ? onChangeEvent($event.target.value, question) : ''\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n <option\r\n *ngIf=\"question.ddlType == 'one' && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\r\n value=\"one\">\r\n Select One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of !question.isFromURL ? question?.items : question?.itemsUrl\"\r\n value=\"{{!question.isFromURL ? item.key : item.Key}}\">\r\n {{!question.isFromURL ? item.value : item.Value}}\r\n </option>\r\n </select>\r\n <label\r\n *ngIf=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\">{{!question.isFromURL\r\n ? question.items[0].value :\r\n question.itemsUrl[0].Value}}</label>\r\n </div>\r\n <div *ngIf=\"question.type=='dropdownSearch'\">\r\n <div class=\"dds-display-item\"\r\n [hidden]=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\">\r\n <input type=\"text\" class=\"form-control search-form-control dds-input\"\r\n name=\"{{'ddsValue'+question.name}}\" [(ngModel)]=\"question.descr\" readonly\r\n (click)=\"question.isListHide = !question.isListHide; question.searchText=''\">\r\n </div>\r\n <label\r\n *ngIf=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\">{{question.descr}}</label>\r\n <div class=\"dds-list-container\" [hidden]=\"question.isListHide\">\r\n <input type=\"text\" class=\"form-control search-form-control\"\r\n name=\"{{'searchText'+question.name}}\" [(ngModel)]=\"question.searchText\"\r\n [placeholder]=\"question.placeholder\">\r\n <div class=\"dds-items-container\">\r\n <select class=\"full-width\" name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" [(ngModel)]=\"question.value\"\r\n [required]=\"question.isRequired\" attr.query-in=\"{{question.isQueryIn}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.label=\"{{question.label}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n (change)=\"question.isEvent ? onChangeEvent($event.target.value, question) : ''\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\"\r\n size=\"{{question?.size == undefined ? question?.size : 10}}\">\r\n <option (click)=\"selectedOption({Key:'one',Value:'Select One'},question)\"\r\n *ngIf=\"question.ddsType == 'one' && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\r\n value=\"one\">\r\n Select One</option>\r\n <option (click)=\"selectedOption({Key:'all',Value:'All'},question)\"\r\n *ngIf=\"(question?.ddsType == undefined || question.ddsType == 'all') && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\r\n value=\"all\">All</option>\r\n <!-- <option *ngFor=\"let item of question?.items | textSearch : question.searchText; let i=index\" [value]=\"item?.key\" (click)=\"selectedOption(item,question)\">\r\n {{item?.value}}\r\n </option> -->\r\n <option\r\n *ngFor=\"let item of !question.isFromURL ? (question?.items | textSearch : question.searchText) : question?.itemsUrl | textSearch : question.searchText\"\r\n (click)=\"selectedOption(item,question)\" value=\"{{item.Key}}\">\r\n {{item.Value}}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"question.type=='claim'\">\r\n <select name=\"{{'claim'+[i]}}\" class=\"form-control search-form-control\"\r\n attr.data-type=\"{{'text'}}\" attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n attr.data-name=\"{{'Assignee'}}\" [hidden]=\"ClaimList?.length == 1\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls['claim'+[i]]?.touched || enjiForm.form.controls['claim'+[i]]?.dirty) && enjiForm.form.controls['claim'+[i]]?.invalid }\">\r\n <option *ngIf=\"question.ddlType == 'one' && ClaimList?.length != 1\" value=\"one\">Select\r\n One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && ClaimList?.length != 1\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of ClaimList\" value=\"{{item.Key}}\">\r\n {{item.Value}}\r\n </option>\r\n </select>\r\n </div>\r\n <lib-uc-show-errors *ngIf=\"question.type!='datepicker'\"\r\n [control]=\"enjiForm.form.controls[question.name]\" [submit]=\"enjiForm.submitted\">\r\n </lib-uc-show-errors>\r\n <lib-uc-show-errors *ngIf=\"question.type=='datepicker'\"\r\n [control]=\"enjiForm.form.controls[question.name+[i]]\" [submit]=\"enjiForm.submitted\">\r\n </lib-uc-show-errors>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6 form-group\" *ngIf=\"(isReport != undefined && isReport)\">\r\n <div class=\"col-md-12\">\r\n <div class=\"row\">\r\n <label class=\"col-md-5 no-padding\" translate>Report Type</label>\r\n <div class=\"col-md-7 no-padding\">\r\n <select name=\"ExportType\" [(ngModel)]=\"ExportType\" class=\"form-control search-form-control\"\r\n attr.data-type=\"text\">\r\n <option *ngFor=\"let item of ExportTypeList\" [value]=\"item.key\">{{item.value}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 no-padding\">\r\n <div class=\"form-actions right\">\r\n <button *ngIf=\"exportData == true\" type=\"button\" (click)=\"exportAsXLSX()\"\r\n class=\"btn btn-raised btn-success mr-1\" translate>\r\n <i class=\"fa ft-download\"></i>&nbsp;<span translate>Export Excel</span>\r\n </button>\r\n <button type=\"button\" (click)=\"reset()\" class=\"btn btn-raised btn-warning mr-1\" translate>\r\n <i class=\"fa fa-times\"></i>&nbsp;<span translate>Reset</span>\r\n </button>\r\n <button *ngIf=\"(isReport == undefined || !isReport)\" type=\"submit\"\r\n class=\"btn btn-raised btn-primary\" #UCSearchClick>\r\n <i class=\"fa fa-search\"></i>&nbsp;<span translate>Search</span>\r\n </button>\r\n <button *ngIf=\"(isReport != undefined && isReport)\" type=\"button\" (click)=\"GenerateReport(enjiForm)\"\r\n class=\"btn btn-raised btn-primary\">\r\n <i class=\"fa ft-download\"></i>&nbsp;<span translate>Generate\r\n Report</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n<br>\r\n<!-- // Basic form layout section end -->", styles: [".ucSearch-title{margin:3px}.dds-input{background-color:#fff;text-transform:uppercase}.dds-display-item:after{content:\"\\e929\";font-family:feather;font-size:1rem;display:inline-block;position:absolute;right:5px;top:5px;transform:rotate(90deg)}.dds-list-container{position:absolute;width:100%;z-index:9}\n"] }]
982
+ ], template: "<!-- Basic form layout section start -->\r\n<section id=\"horizontal-form-layouts\">\r\n <div class=\"row text-left\">\r\n <div class=\"col-md-12\">\r\n <div class=\"card\">\r\n <div class=\"pl-3 mb-2 mt-2\" *ngIf=\"configuration?.title != undefined && configuration?.title != ''\">\r\n <h4 class=\"card-title ucSearch-title\" translate>{{configuration.title}}</h4>\r\n </div>\r\n <div class=\"card-body\">\r\n <div class=\"px-3\">\r\n <form class=\"form form-horizontal\" id=\"formSearch\" #formIdSearch #enjiForm=\"ngForm\"\r\n (ngSubmit)=\"enjiForm.valid && searchClick()\">\r\n <div class=\"form-body\">\r\n <h4 class=\"form-section font-weight-bold\">\r\n <div (click)=\"changeState()\" class=\"btn no-padding cursor-pointer flip\">\r\n <i class=\"fa\" style=\"font-size: 15px; margin: 0px 0px 5px -15px;\"\r\n [ngClass]=\"isHidden ? 'fa-chevron-right' : 'fa-chevron-down'\"></i>\r\n </div>\r\n <span\r\n *ngIf=\"configuration?.sectionTitle != undefined && configuration?.sectionTitle != ''; then inputSectionTitle else defaultSectionTitle\"></span>\r\n <ng-template #inputSectionTitle>\r\n {{configuration?.sectionTitle}}\r\n </ng-template>\r\n <ng-template #defaultSectionTitle>\r\n Paging\r\n </ng-template>\r\n </h4>\r\n <!-- Ini Digunakan untuk Generate Dynamic Component -->\r\n <!-- [hidden]=\"isHidden\" -->\r\n <div class=\"panel-active\" [@changeDivSize]=currentState>\r\n <div class=\"row\">\r\n <div class=\"col-md-6 form-group\" *ngFor=\"let question of configuration?.component; let i = index\">\r\n <div class=\"col-md-12\">\r\n <div class=\"row\">\r\n <label class=\"col-md-5 no-padding\" for=\"{{question.id}}\"\r\n [ngClass]=\"{'adins-required-label': (question.isRequired || (question?.ddlType != undefined && question.ddlType == 'one'))}\"\r\n translate>{{question.label}}</label>\r\n <div class=\"col-md-7 no-padding\">\r\n <div *ngIf=\"question.type=='textbox'\">\r\n <input type=\"text\" id=\"{{question.id}}\" class=\"form-control search-form-control\"\r\n [ngModel]=\"question.value\" [required]=\"question.isRequired\" name=\"{{question.name}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-type=\"{{question.datatype}}\"\r\n attr.data-name=\"{{question.name}}\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.label=\"{{question.label}}\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question.type=='textarea'\">\r\n <textarea type=\"text\" id=\"{{question.id}}\" class=\"form-control search-form-control\"\r\n [ngModel]=\"question.value\" [required]=\"question.isRequired\" name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" attr.data-type=\"{{question.datatype}}\"\r\n attr.data-name=\"{{question.name}}\" value=\"{{question.value}}\"\r\n attr.label=\"{{question.label}}\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\"></textarea>\r\n </div>\r\n <div *ngIf=\"question.type=='numeric'\">\r\n <input type=\"number\" id=\"{{question.id}}\" (focus)=\"transformToDecimal($event)\"\r\n (blur)=\"transformToDecimal($event)\" class=\"form-control search-form-control\"\r\n [ngModel]=\"question.value\" [required]=\"question.isRequired\" name=\"{{question.name+[i]}}\"\r\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-numericpair=\"{{question.numericPair}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n attr.label=\"{{question.label}}\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name+[i]]?.dirty) && enjiForm.form.controls[question.name+[i]]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question.type=='currency'\">\r\n <div *ngIf=\"question?.isCustom != undefined && question?.isCustom\">\r\n <input type=\"\" id=\"{{question.id}}\" class=\"form-control search-form-control\"\r\n [required]=\"question.isRequired\" name=\"{{question.name}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" currencyMask [ngModel]=\"question.value\"\r\n [(ngModel)]=\"question.value\" [ngModelOptions]=\"{standalone: true}\"\r\n attr.label=\"{{question.label}}\"\r\n [options]=\"{ thousands: question.thousands, decimal: question.decimal, align: question.align, allowNegative: question.allowNegative, allowZero: question.allowZero, precision: question.precision, nullable: question.nullable }\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n <div *ngIf=\"question?.isCustom == undefined || !question?.isCustom\">\r\n <input type=\"text\" id=\"{{question.id}}\" class=\"form-control search-form-control\"\r\n [required]=\"question.isRequired\" name=\"{{question.name}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" currencyMask [ngModel]=\"question.value\"\r\n [(ngModel)]=\"question.value\" [ngModelOptions]=\"{standalone: true}\"\r\n attr.label=\"{{question.label}}\"\r\n [options]=\"{ thousands: ',', decimal: '.', align: 'right', allowNegative: false, allowZero:true, precision: 2, nullable: false }\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n </div>\r\n </div>\r\n\r\n <!-- End Hardcode Lookup didalem-->\r\n <div *ngIf=\"question.type=='datepicker'\">\r\n <input type=\"{{question.isTime ? 'datetime-local' : 'date'}}\" id=\"{{question.id}}\"\r\n class=\"form-control search-form-control btn-lookup\" name=\"{{question.name+[i]}}\"\r\n [ngModel]=\"question.value\" [required]=\"question.isRequired\"\r\n attr.data-required=\"{{question.isRequired}}\" value=\"{{question.value}}\"\r\n [readonly]=\"question.readonly\" attr.data-type=\"{{question.datatype}}\"\r\n attr.data-name=\"{{question.name}}\"\r\n attr.data-datepickerpair=\"{{question.datepickerPair}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n (keyup.enter)=\"searchClick()\" attr.data-restriction=\"{{question.restriction}}\"\r\n attr.label=\"{{question.label}}\" min=\"{{question.minDate | date:'yyyy-MM-dd'}}\"\r\n max=\"{{question.maxDate | date:'yyyy-MM-dd'}}\"\r\n (focusout)=\"question.restriction != undefined && checkInputDate(question)\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name+[i]]?.touched || enjiForm.form.controls[question.name+[i]]?.dirty) && enjiForm.form.controls[question.name+[i]]?.invalid }\">\r\n </div>\r\n <div\r\n *ngIf=\"question.type == 'taskDefinitionKey' || question.type == 'processKey' || question.type == 'officeRoleCodes'\">\r\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\r\n [required]=\"question.isRequired\" class=\"form-control search-form-control\"\r\n attr.query-in=\"{{question.isQueryIn}}\" attr.data-type=\"{{question.datatype}}\"\r\n attr.label=\"{{question.label}}\" [hidden]=\"question?.itemsUrl?.length == 1\"\r\n (change)=\"(question.type == 'taskDefinitionKey' || question.type == 'processKey') ? SetProcessKey(i,question.wfKeyFilter) : SetRoleOfficeCodes(i)\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n <option *ngIf=\"question.ddlType == 'one' && question?.itemsUrl?.length != 1\"\r\n value=\"one\">Select One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && question?.itemsUrl?.length != 1\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of question?.itemsUrl\" value=\"{{item.Key}}\">\r\n {{item.Value}}\r\n </option>\r\n </select>\r\n <label *ngIf=\"question?.itemsUrl?.length == 1\">{{question.itemsUrl[0].Value}}</label>\r\n </div>\r\n <div *ngIf=\"question.type=='dropdown'\">\r\n <select name=\"{{question.name}}\" attr.data-required=\"{{question.isRequired}}\"\r\n [(ngModel)]=\"question.value\" [required]=\"question.isRequired\"\r\n class=\"form-control search-form-control\" attr.query-in=\"{{question.isQueryIn}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.label=\"{{question.label}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n [hidden]=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\"\r\n (change)=\"question.isEvent ? onChangeEvent($event.target.value, question) : ''\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\">\r\n <option\r\n *ngIf=\"question.ddlType == 'one' && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\r\n value=\"one\">\r\n Select One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of !question.isFromURL ? question?.items : question?.itemsUrl\"\r\n value=\"{{!question.isFromURL ? item.key : item.Key}}\">\r\n {{!question.isFromURL ? item.value : item.Value}}\r\n </option>\r\n </select>\r\n <label\r\n *ngIf=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\">{{!question.isFromURL\r\n ? question.items[0].value :\r\n question.itemsUrl[0].Value}}</label>\r\n </div>\r\n <div *ngIf=\"question.type=='dropdownSearch'\">\r\n <div class=\"dds-display-item\"\r\n [hidden]=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\">\r\n <input type=\"text\" class=\"form-control search-form-control dds-input\"\r\n name=\"{{'ddsValue'+question.name}}\" [(ngModel)]=\"question.descr\" readonly\r\n (click)=\"question.isListHide = !question.isListHide; question.searchText=''\">\r\n </div>\r\n <label\r\n *ngIf=\"!question.isFromURL ? question?.items?.length == 1 : question?.itemsUrl?.length == 1\">{{question.descr}}</label>\r\n <div class=\"dds-list-container\" [hidden]=\"question.isListHide\">\r\n <input type=\"text\" class=\"form-control search-form-control\"\r\n name=\"{{'searchText'+question.name}}\" [(ngModel)]=\"question.searchText\"\r\n [placeholder]=\"question.placeholder\">\r\n <div class=\"dds-items-container\">\r\n <select class=\"full-width\" name=\"{{question.name}}\"\r\n attr.data-required=\"{{question.isRequired}}\" [(ngModel)]=\"question.value\"\r\n [required]=\"question.isRequired\" attr.query-in=\"{{question.isQueryIn}}\"\r\n attr.data-type=\"{{question.datatype}}\" attr.data-name=\"{{question.name}}\"\r\n attr.label=\"{{question.label}}\"\r\n attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n (change)=\"question.isEvent ? onChangeEvent($event.target.value, question) : ''\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls[question.name]?.touched || enjiForm.form.controls[question.name]?.dirty) && enjiForm.form.controls[question.name]?.invalid }\"\r\n size=\"{{question?.size == undefined ? question?.size : 10}}\">\r\n <option (click)=\"selectedOption({Key:'one',Value:'Select One'},question)\"\r\n *ngIf=\"question.ddsType == 'one' && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\r\n value=\"one\">\r\n Select One</option>\r\n <option (click)=\"selectedOption({Key:'all',Value:'All'},question)\"\r\n *ngIf=\"(question?.ddsType == undefined || question.ddsType == 'all') && (!question.isFromURL ? question?.items?.length != 1 : question?.itemsUrl?.length != 1)\"\r\n value=\"all\">All</option>\r\n <!-- <option *ngFor=\"let item of question?.items | textSearch : question.searchText; let i=index\" [value]=\"item?.key\" (click)=\"selectedOption(item,question)\">\r\n {{item?.value}}\r\n </option> -->\r\n <option\r\n *ngFor=\"let item of !question.isFromURL ? (question?.items | textSearch : question.searchText) : question?.itemsUrl | textSearch : question.searchText\"\r\n (click)=\"selectedOption(item,question)\" value=\"{{item.Key}}\">\r\n {{item.Value}}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"question.type=='claim'\">\r\n <select name=\"{{'claim'+[i]}}\" class=\"form-control search-form-control\"\r\n attr.data-type=\"{{'text'}}\" attr.data-crit-datatable=\"{{question.isCriteriaDataTable}}\"\r\n attr.data-name=\"{{'Assignee'}}\" [hidden]=\"ClaimList?.length == 1\"\r\n [ngClass]=\"{ 'is-invalid':(enjiForm.submitted || enjiForm.form.controls['claim'+[i]]?.touched || enjiForm.form.controls['claim'+[i]]?.dirty) && enjiForm.form.controls['claim'+[i]]?.invalid }\">\r\n <option *ngIf=\"question.ddlType == 'one' && ClaimList?.length != 1\" value=\"one\">Select\r\n One</option>\r\n <option\r\n *ngIf=\"(question?.ddlType == undefined || question.ddlType == 'all') && ClaimList?.length != 1\"\r\n value=\"all\">All</option>\r\n <option *ngFor=\"let item of ClaimList\" value=\"{{item.Key}}\">\r\n {{item.Value}}\r\n </option>\r\n </select>\r\n </div>\r\n <lib-uc-show-errors *ngIf=\"question.type!='datepicker'\"\r\n [control]=\"enjiForm.form.controls[question.name]\" [submit]=\"enjiForm.submitted\">\r\n </lib-uc-show-errors>\r\n <lib-uc-show-errors *ngIf=\"question.type=='datepicker'\"\r\n [control]=\"enjiForm.form.controls[question.name+[i]]\" [submit]=\"enjiForm.submitted\">\r\n </lib-uc-show-errors>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6 form-group\" *ngIf=\"(isReport != undefined && isReport)\">\r\n <div class=\"col-md-12\">\r\n <div class=\"row\">\r\n <label class=\"col-md-5 no-padding\" translate>Report Type</label>\r\n <div class=\"col-md-7 no-padding\">\r\n <select name=\"ExportType\" [(ngModel)]=\"ExportType\" class=\"form-control search-form-control\"\r\n attr.data-type=\"text\">\r\n <option *ngFor=\"let item of ExportTypeList\" [value]=\"item.key\">{{item.value}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-12 no-padding\">\r\n <div class=\"form-actions right\">\r\n <button *ngIf=\"exportData == true && isSearch\" type=\"button\" (click)=\"exportAsXLSX()\"\r\n class=\"btn btn-raised btn-success mr-1\" translate>\r\n <i class=\"fa ft-download\"></i>&nbsp;<span translate>Export Excel</span>\r\n </button>\r\n <button type=\"button\" (click)=\"reset()\" class=\"btn btn-raised btn-warning mr-1\" translate>\r\n <i class=\"fa fa-times\"></i>&nbsp;<span translate>Reset</span>\r\n </button>\r\n <button *ngIf=\"(isReport == undefined || !isReport)\" type=\"submit\"\r\n class=\"btn btn-raised btn-primary\" #UCSearchClick>\r\n <i class=\"fa fa-search\"></i>&nbsp;<span translate>Search</span>\r\n </button>\r\n <button *ngIf=\"(isReport != undefined && isReport)\" type=\"button\" (click)=\"GenerateReport(enjiForm)\"\r\n class=\"btn btn-raised btn-primary\">\r\n <i class=\"fa ft-download\"></i>&nbsp;<span translate>Generate\r\n Report</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</section>\r\n<br>\r\n<!-- // Basic form layout section end -->", styles: [".ucSearch-title{margin:3px}.dds-input{background-color:#fff;text-transform:uppercase}.dds-display-item:after{content:\"\\e929\";font-family:feather;font-size:1rem;display:inline-block;position:absolute;right:5px;top:5px;transform:rotate(90deg)}.dds-list-container{position:absolute;width:100%;z-index:9}\n"] }]
953
983
  }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.ExcelService }, { type: i0.Renderer2 }, { type: undefined, decorators: [{
954
984
  type: Inject,
955
985
  args: [DOCUMENT]
@@ -972,4 +1002,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.2", ngImpor
972
1002
  }], reqGetAllData: [{
973
1003
  type: Output
974
1004
  }] } });
975
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWNzZWFyY2guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdWNzZWFyY2gvc3JjL2xpYi91Y3NlYXJjaC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy91Y3NlYXJjaC9zcmMvbGliL3Vjc2VhcmNoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFnQixNQUFNLGVBQWUsQ0FBQztBQUV2SSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFhLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0MsT0FBTyxFQUFFLGtCQUFrQixFQUFxQixNQUFNLGdDQUFnQyxDQUFD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QkFBZ0IsQ0FBQyxTQUFTO1FBQ3hCLHdDQUF3QztRQUN4QyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDOUgsSUFBRyxDQUFDLFlBQVksRUFBQztZQUNmLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUE7U0FDekg7UUFFRCxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDOUgsSUFBRyxDQUFDLFlBQVksRUFBQztZQUNmLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUE7U0FDekg7UUFFRCxJQUFHLFlBQVksSUFBSSxZQUFZLEVBQUM7WUFDOUIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEVBQUUs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cUJBQU0sSUFBSSxZQUFZLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLEtBQUssRUFBRTtvQkFDMUQsWUFBWSxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO2lCQUMxRDthQUNGO1NBQ0Y7UUFFRCxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwVyxJQUFJLFlBQVksSUFBSSxTQUFTLEVBQUU7WUFDN0IsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwSSxLQUFLLEdBQUcs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LE1BQU07MkJBQUMsUUFBUTtvSkFwRVMsT0FBTztzQkFBakMsU0FBUzt1QkFBQyxVQUFVO2dCQU1NLE1BQU07c0JBQWhDLFNBQVM7dUJBQUMsY0FBYztnQkFDaEIsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0ksTUFBTTtzQkFBZixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEluamVjdCwgUmVuZGVyZXIyLCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwLCBOZ0Zvcm0gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IERhdGVQaXBlLCBmb3JtYXREYXRlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSW5wdXRTZWFyY2hPYmogfSBmcm9tICcuL21vZGVsL2lucHV0LXNlYXJjaC1vYmoubW9kZWwnO1xyXG5pbXBvcnQgeyBDcml0ZXJpYU9iaiB9IGZyb20gJy4vbW9kZWwvY3JpdGVyaWEtb2JqLm1vZGVsJztcclxuaW1wb3J0IHsgUmVxdWVzdENyaXRlcmlhT2JqIH0gZnJvbSAnLi9tb2RlbC9yZXF1ZXN0LWNyaXRlcmlhLW9iai5tb2RlbCc7XHJcbmltcG9ydCB7IEFkSW5zQ29uc3RhbnQgfSBmcm9tICcuL21vZGVsL2FkaW5zLWNvbnN0YW50JztcclxuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBFeGNlbFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2V4Y2VsLXNlcnZpY2UvZXhjZWwtc2VydmljZSc7XHJcbmltcG9ydCB7IHRyaWdnZXIsIHRyYW5zaXRpb24sIHN0eWxlLCBhbmltYXRlLCBzdGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5pbXBvcnQgeyBUb2FzdHJTZXJ2aWNlIH0gZnJvbSAnbmd4LXRvYXN0cic7XHJcbmltcG9ydCB7IEV4cG9ydFR5cGVDb25zdGFudCwgS2V5VmFsdWVSZXBvcnRPYmogfSBmcm9tICcuL21vZGVsL2tleS12YWx1ZS1yZXBvcnQubW9kZWwnO1xyXG5pbXBvcnQgeyBDb29raWVTZXJ2aWNlIH0gZnJvbSAnbmd4LWNvb2tpZSc7XHJcbmltcG9ydCAqIGFzIENyeXB0b0pTIGZyb20gJ2NyeXB0by1qcyc7XHJcbmltcG9ydCB7IEtleVZhbHVlVUNTZWFyY2hPYmosIExpc3RLZXlWYWx1ZU1vbnRoIH0gZnJvbSAnLi9tb2RlbC9rZXktdmFsdWUtdWMtc2VhcmNoLm1vZGVsJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLVVDU2VhcmNoJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdWNzZWFyY2guY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3Vjc2VhcmNoLmNvbXBvbmVudC5jc3MnXSxcclxuICBwcm92aWRlcnM6IFtFeGNlbFNlcnZpY2UsIERhdGVQaXBlXSxcclxuICBhbmltYXRpb25zOiBbXHJcbiAgICB0cmlnZ2VyKCdjaGFuZ2VEaXZTaXplJywgW1xyXG4gICAgICBzdGF0ZSgnaW5pdGlhbCcsIHN0eWxlKHtcclxuICAgICAgICBoZWlnaHQ6ICcqJyxcclxuICAgICAgICBvcGFjaXR5OiAnMScsXHJcbiAgICAgIH0pKSxcclxuICAgICAgc3RhdGUoJ2ZpbmFsJywgc3R5bGUoe1xyXG4gICAgICAgIGhlaWdodDogJzBweCcsXHJcbiAgICAgICAgb3BhY2l0eTogJzAnLFxyXG4gICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcclxuICAgICAgfSkpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdpbml0aWFsPT5maW5hbCcsIGFuaW1hdGUoJzMwMG1zJykpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdmaW5hbD0+aW5pdGlhbCcsIGFuaW1hdGUoJzMwMG1zJykpXHJcbiAgICBdKSxcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVQ1NlYXJjaENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIC8vIGlzTGlzdEhpZGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIC8vIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICAvLyBvbkNsaWNrKGV2OiBNb3VzZUV2ZW50KSB7XHJcbiAgLy8gICBjb25zdCBjbGlja0luc2lkZSA9IHRoaXMuZWxlbVJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2LnRhcmdldCk7XHJcbiAgLy8gICBpZiAoIWNsaWNrSW5zaWRlKSB7XHJcbiAgLy8gICAgIHRoaXMuaXNMaXN0SGlkZSA9IHRydWU7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBAVmlld0NoaWxkKCdlbmppRm9ybScpIHNldCBjb250ZW50KGNvbnRlbnQ6IE5nRm9ybSkge1xyXG4gICAgaWYgKGNvbnRlbnQpIHsgLy8gaW5pdGlhbGx5IHNldHRlciBnZXRzIGNhbGxlZCB3aXRoIHVuZGVmaW5lZFxyXG4gICAgICB0aGlzLnNlYXJjaEZvcm0gPSBjb250ZW50O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQFZpZXdDaGlsZCgnZm9ybUlkU2VhcmNoJykgbXlGb3JtOiBFbGVtZW50UmVmO1xyXG4gIEBJbnB1dCgpIHNlYXJjaElucHV0OiBJbnB1dFNlYXJjaE9iaiA9IG5ldyBJbnB1dFNlYXJjaE9iaigpO1xyXG4gIEBJbnB1dCgpIHBhZ2VTaXplOiBudW1iZXIgPSAxMDtcclxuICBASW5wdXQoKSBpc1JlcG9ydDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBPdXRwdXQoKSByZXN1bHQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBnZW5ScHQ6IEV2ZW50RW1pdHRlcjx7IEV4cG9ydFR5cGU6IG51bWJlciwgRWxSZWY6IEVsZW1lbnRSZWYgfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHsgRXhwb3J0VHlwZTogbnVtYmVyLCBFbFJlZjogRWxlbWVudFJlZiB9PigpO1xyXG4gIEBPdXRwdXQoKSByZXFHZXRBbGxEYXRhOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBFeHBvcnRUeXBlTGlzdDogQXJyYXk8S2V5VmFsdWVSZXBvcnRPYmo+ID0gW1xyXG4gICAge1xyXG4gICAgICBrZXk6IEV4cG9ydFR5cGVDb25zdGFudC5FWFBfVFlQRV9QREYsXHJcbiAgICAgIHZhbHVlOiBcIlBERlwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBrZXk6IEV4cG9ydFR5cGVDb25zdGFudC5FWFBfVFlQRV9YTFNYLFxyXG4gICAgICB2YWx1ZTogXCJFeGNlbCAyMDA3XCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGtleTogRXhwb3J0VHlwZUNvbnN0YW50LkVYUF9UWVBFX0RPQ1gsXHJcbiAgICAgIHZhbHVlOiBcIkRvY3VtZW50IFhNTFwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBrZXk6IEV4cG9ydFR5cGVDb25zdGFudC5FWFBfVFlQRV9KUERGLFxyXG4gICAgICB2YWx1ZTogXCJKdXN0aWZ5IFBERlwiXHJcbiAgICB9XHJcbiAgXTtcclxuICBMaXN0T2ZNb250aDogTGlzdEtleVZhbHVlTW9udGggPSBuZXcgTGlzdEtleVZhbHVlTW9udGgoKTtcclxuICBMaXN0T2ZZZWFyOiBBcnJheTxLZXlWYWx1ZVVDU2VhcmNoT2JqPiA9IG5ldyBBcnJheTxLZXlWYWx1ZVVDU2VhcmNoT2JqPigpO1xyXG4gIENsYWltTGlzdDogQXJyYXk8YW55PiA9IFtcclxuICAgIHtcclxuICAgICAgS2V5OiBBZEluc0NvbnN0YW50LlJlc3RyaWN0aW9uSXNOb3ROdWxsLFxyXG4gICAgICBWYWx1ZTogXCJDTEFJTUVEXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIEtleTogQWRJbnNDb25zdGFudC5SZXN0cmljdGlvbklzTnVsbCxcclxuICAgICAgVmFsdWU6IFwiVU5DTEFJTUVEXCJcclxuICAgIH0sXHJcbiAgXTtcclxuXHJcbiAgRXhwb3J0VHlwZTogbnVtYmVyID0gMDtcclxuXHJcbiAgcGFnZU5vdzogYW55ID0gMTtcclxuICBjb25maWd1cmF0aW9uOiBhbnk7XHJcbiAgZXhwb3J0RGF0YTogYW55O1xyXG4gIEV4Y2VsRGF0YTogYW55O1xyXG4gIGlzRGF0YUxvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzSGlkZGVuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQmlzRHQ6IHN0cmluZztcclxuICBCdXNpbmVzc0R0OiBEYXRlID0gbmV3IERhdGUoKTtcclxuICBkYXRlV3Jvbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICByZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjdXJyZW50U3RhdGUgPSAnaW5pdGlhbCc7XHJcblxyXG4gIGZvcm06IEZvcm1Hcm91cDtcclxuICBjb3VudEZvcm0gPSAwO1xyXG4gIGZvcm1hdHRlZEFtb3VudCA9ICcnO1xyXG4gIGFtb3VudCA9IDA7XHJcbiAgYXBpVXJsOiBzdHJpbmc7XHJcbiAgYXJyQ3JpdDogYW55O1xyXG4gIHNlYXJjaEZvcm06IE5nRm9ybTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBwcml2YXRlIGV4Y2VsU2VydmljZTogRXhjZWxTZXJ2aWNlLCBwcml2YXRlIF9yZW5kZXJlcjI6IFJlbmRlcmVyMixcclxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgX2RvY3VtZW50LCBwdWJsaWMgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLCBwcml2YXRlIGNvb2tpZVNlcnZpY2U6IENvb2tpZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRhdGVQaXBlOiBEYXRlUGlwZSwgcHJpdmF0ZSBlbGVtUmVmOiBFbGVtZW50UmVmKSB7XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VTdGF0ZSgpIHtcclxuICAgIHRoaXMuY3VycmVudFN0YXRlID0gdGhpcy5jdXJyZW50U3RhdGUgPT0gJ2luaXRpYWwnID8gJ2ZpbmFsJyA6ICdpbml0aWFsJztcclxuICAgIHRoaXMuaXNIaWRkZW4gPSAhdGhpcy5pc0hpZGRlbiA/IHRydWUgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG5nT25Jbml0KCkge1xyXG4gICAgY29uc29sZS5sb2coXCJ1Y3NlYXJjaFwiKTtcclxuICAgIHRoaXMuYXBpVXJsID0gdGhpcy5zZWFyY2hJbnB1dC5lbnZpcm9tZW50VXJsICsgdGhpcy5zZWFyY2hJbnB1dC5hcGlRcnlQYWdpbmc7XHJcbiAgICB0aGlzLmFyckNyaXQgPSB0aGlzLnNlYXJjaElucHV0LmFyckNyaXRPYmo7XHJcbiAgICBsZXQganMgPSB0aGlzLl9yZW5kZXJlcjIuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XHJcbiAgICBqcy50ZXh0ID0gYFxyXG4gICAgICAgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgJChcIiNmbGlwXCIpLmNsaWNrKGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgJChcIiNwYW5lbFwiKS5zbGlkZVRvZ2dsZShcInNsb3dcIik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgYDtcclxuICAgIHRoaXMuX3JlbmRlcmVyMi5hcHBlbmRDaGlsZCh0aGlzLl9kb2N1bWVudC5ib2R5LCBqcyk7XHJcblxyXG4gICAgbGV0IHZhbHVlID0gdGhpcy5jb29raWVTZXJ2aWNlLmdldCgnQnVzaW5lc3NEYXRlUmF3Jyk7XHJcbiAgICB0aGlzLkJpc0R0ID0gdGhpcy5EZWNyeXB0U3RyaW5nKHZhbHVlLCBcIkFkSW5zRk9VMTIzNDU2NzhcIik7XHJcbiAgICB0aGlzLkJ1c2luZXNzRHQgPSBuZXcgRGF0ZSh0aGlzLkJpc0R0KTtcclxuICAgIGF3YWl0IHRoaXMuaW5pdGlhdGVGb3JtKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBpbml0aWF0ZUZvcm0oKSB7XHJcbiAgICBhd2FpdCB0aGlzLmdldEpTT04odGhpcy5zZWFyY2hJbnB1dC5fdXJsKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGRhdGE7XHJcbiAgICAgIHRoaXMuZXhwb3J0RGF0YSA9IGRhdGEuZXhwb3J0RXhjZWw7XHJcbiAgICAgIGlmIChkYXRhLmV4cG9ydFR5cGVMaXN0ICE9IHVuZGVmaW5lZCAmJiBkYXRhLmV4cG9ydFR5cGVMaXN0Lmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgICAgdGhpcy5FeHBvcnRUeXBlTGlzdCA9IGRhdGEuZXhwb3J0VHlwZUxpc3Q7XHJcbiAgICAgICAgdGhpcy5FeHBvcnRUeXBlID0gdGhpcy5FeHBvcnRUeXBlTGlzdFswXS5rZXk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY291bnRGb3JtID0gZGF0YS5jb21wb25lbnQubGVuZ3RoO1xyXG4gICAgICB0aGlzLmlzRGF0YUxvYWRlZCA9IHRydWU7XHJcblxyXG4gICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC50aXRsZSAhPSB1bmRlZmluZWQgJiYgdGhpcy5zZWFyY2hJbnB1dC50aXRsZSAhPSBcIlwiKSB7XHJcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLnRpdGxlID0gdGhpcy5zZWFyY2hJbnB1dC50aXRsZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvdW50Rm9ybTsgaSsrKSB7XHJcbiAgICAgICAgLy9pbmkga2FsYXUgZGF0YW55YSBkaSBsb2FkIGRhcmkgVVJMXHJcbiAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLmlzRnJvbVVSTCkge1xyXG4gICAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdENyaXRlcmlhT2JqKCk7XHJcbiAgICAgICAgICBsZXQgYXJyYXlDcml0ID0gbmV3IEFycmF5KCk7XHJcbiAgICAgICAgICBsZXQgY3JpdGVyaWFPYmplY3QgPSBuZXcgQ3JpdGVyaWFPYmooKTtcclxuICAgICAgICAgIGNyaXRlcmlhT2JqZWN0LkRhdGFUeXBlID0gXCJ0ZXh0XCI7XHJcbiAgICAgICAgICBjcml0ZXJpYU9iamVjdC5wcm9wTmFtZSA9IGRhdGEuY29tcG9uZW50W2ldLmNyaXRlcmlhUHJvcE5hbWU7XHJcbiAgICAgICAgICBjcml0ZXJpYU9iamVjdC52YWx1ZSA9IGRhdGEuY29tcG9uZW50W2ldLmNyaXRlcmlhUHJvcFZhbHVlO1xyXG4gICAgICAgICAgY3JpdGVyaWFPYmplY3QucmVzdHJpY3Rpb24gPSBcImVxXCI7XHJcbiAgICAgICAgICBhcnJheUNyaXQucHVzaChjcml0ZXJpYU9iamVjdCk7XHJcbiAgICAgICAgICByZXF1ZXN0LmNyaXRlcmlhID0gYXJyYXlDcml0O1xyXG4gICAgICAgICAgcmVxdWVzdFtkYXRhLmNvbXBvbmVudFtpXS5jcml0ZXJpYVByb3BOYW1lXSA9IGRhdGEuY29tcG9uZW50W2ldLmNyaXRlcmlhUHJvcFZhbHVlO1xyXG5cclxuICAgICAgICAgIC8vIFBlbmdlY2VrYW4gcGVuZ2d1bmFhbiB1cmwgYXRhdSBwYXRoXHJcbiAgICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0ucGF0aCAhPSB1bmRlZmluZWQgJiYgZGF0YS5jb21wb25lbnRbaV0ucGF0aCAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHMgIT0gdW5kZWZpbmVkICYmIHRoaXMuc2VhcmNoSW5wdXQubGlzdEVudmlyb25tZW50cy5sZW5ndGggIT0gMCkge1xyXG4gICAgICAgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5zZWFyY2hJbnB1dC5saXN0RW52aXJvbm1lbnRzLmxlbmd0aDsgeSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0uZW52aXJvbm1lbnQgPT0gdGhpcy5zZWFyY2hJbnB1dC5saXN0RW52aXJvbm1lbnRzW3ldLmVudmlyb25tZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLmZ1bGxwYXRoID0gdGhpcy5zZWFyY2hJbnB1dC5saXN0RW52aXJvbm1lbnRzW3ldLnVybCArIGRhdGEuY29tcG9uZW50W2ldLnBhdGg7XHJcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS5mdWxscGF0aCA9IGRhdGEuY29tcG9uZW50W2ldLnVybDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLmZ1bGxwYXRoID0gZGF0YS5jb21wb25lbnRbaV0udXJsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy9sZW1wYXIgb2JqZWN0bnlhIHNla2FsaWFuIHNhbWEgdXJsbnlhLCBubnRpIGRpIGJpbmQgZGkgZGFsZW0ga2FyZW5hIG1hc2FsYWggZGkgYXN5bmNueWFcclxuICAgICAgICAgIC8vYmlhciB0aWFwIGZ1bmN0aW9uIGFkYSBzdGF0ZTJueWEgc2VuZGlyaVxyXG4gICAgICAgICAgdGhpcy5yZXNvbHZlT2JqZWN0KGRhdGEuY29tcG9uZW50W2ldLCBkYXRhLmNvbXBvbmVudFtpXS5mdWxscGF0aCwgcmVxdWVzdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0udHlwZSA9PSBcIm51bWVyaWNcIikge1xyXG4gICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0udmFsdWUgPSBwYXJzZUZsb2F0KGRhdGEuY29tcG9uZW50W2ldLnZhbHVlKS50b0xvY2FsZVN0cmluZygnZW4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vcGVuZ2VjZWthbiBkZGxcclxuICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0udHlwZSA9PSBcImRyb3Bkb3duXCIpIHtcclxuICAgICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS5kdG1UeXBlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0uZHRtVHlwZS5pbmNsdWRlcyhcIm1vbnRoXCIpKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLnZhbHVlICE9IHVuZGVmaW5lZCAmJiBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZS5pbmNsdWRlcyhcIkJEXCIpKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSA9IHRoaXMuc2V0RGVmYXVsdFZhbHVlTW9udGgoZGF0YS5jb21wb25lbnRbaV0udmFsdWUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS5pdGVtcyA9IHRoaXMuc2V0TW9udGhEREwoZGF0YS5jb21wb25lbnRbaV0uZHRtVHlwZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLmR0bVR5cGUuaW5jbHVkZXMoXCJ5ZWFyXCIpKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLnZhbHVlICE9IHVuZGVmaW5lZCAmJiBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZS5pbmNsdWRlcyhcIkJEXCIpKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSA9IHRoaXMuc2V0RGVmYXVsdFZhbHVlWWVhcihkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLml0ZW1zID0gdGhpcy5zZXRZZWFyRERMKGRhdGEuY29tcG9uZW50W2ldLmR0bVR5cGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmIChkYXRhLmNvbXBvbmVudFtpXS50eXBlID09IFwiZHJvcGRvd25TZWFyY2hcIiAmJiAhZGF0YS5jb21wb25lbnRbaV0uaXNGcm9tVVJMICYmIGRhdGEuY29tcG9uZW50W2ldLml0ZW1zPy5sZW5ndGggIT0gMSkge1xyXG4gICAgICAgIC8vICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLmRkc1R5cGUgPT0gdW5kZWZpbmVkIHx8IGRhdGEuY29tcG9uZW50W2ldLmRkc1R5cGUgPT0gXCJhbGxcIikge1xyXG4gICAgICAgIC8vICAgICBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSA9IFwiYWxsXCI7XHJcbiAgICAgICAgLy8gICAgIGRhdGEuY29tcG9uZW50W2ldLmRlc2NyID0gXCJBbGxcIjtcclxuICAgICAgICAvLyAgIH0gZWxzZSBpZiAoZGF0YS5jb21wb25lbnRbaV0uZGRzVHlwZSA9PSBcIm9uZVwiKSB7XHJcbiAgICAgICAgLy8gICAgIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlID0gXCJvbmVcIjtcclxuICAgICAgICAvLyAgICAgZGF0YS5jb21wb25lbnRbaV0uZGVzY3IgPSBcIlNlbGVjdCBPbmVcIjtcclxuICAgICAgICAvLyAgIH1cclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLnR5cGUgPT0gXCJkcm9wZG93blNlYXJjaFwiICYmICFkYXRhLmNvbXBvbmVudFtpXS5pc0Zyb21VUkwgJiYgZGF0YS5jb21wb25lbnRbaV0uaXRlbXMubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlID0gZGF0YS5jb21wb25lbnRbaV0uaXRlbXNbMF0uS2V5O1xyXG4gICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0uZGVzY3IgPSBkYXRhLmNvbXBvbmVudFtpXS5pdGVtc1swXS5WYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLnR5cGUgIT0gXCJkcm9wZG93blNlYXJjaFwiICYmICFkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSkge1xyXG4gICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0udmFsdWUgPSBcIlwiO1xyXG4gICAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLmRkbFR5cGUgPT0gJ2FsbCcpIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlID0gXCJhbGxcIjtcclxuICAgICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS5kZGxUeXBlID09ICdvbmUnKSBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSA9IFwib25lXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vcGVuZ2VjZWthbiB0YW5nZ2FsXHJcbiAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLnR5cGUgPT0gXCJkYXRlcGlja2VyXCIpIHtcclxuICAgICAgICAgIHRoaXMucmVhZG9ubHkgPSBkYXRhLmNvbXBvbmVudFtpXS5yZWFkb25seVxyXG5cclxuICAgICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS52YWx1ZS5pbmNsdWRlcyhcIkJEXCIpKSB7XHJcbiAgICAgICAgICAgIGxldCBidXNpbmVzc0RhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5CaXNEdCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgYnVzaW5lc3NEYXRlID0gbmV3IERhdGUodGhpcy5CaXNEdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IG9wZXJhdG9yID0gZGF0YS5jb21wb25lbnRbaV0udmFsdWUuY2hhckF0KDIpO1xyXG4gICAgICAgICAgICBsZXQgZGF0ZVNob3cgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICAgICBpZiAob3BlcmF0b3IgPT0gXCItXCIpIHtcclxuICAgICAgICAgICAgICBsZXQgdGVtcE1pbnVzID0gZGF0YS5jb21wb25lbnRbaV0udmFsdWUuc3BsaXQoXCItXCIsIDIpO1xyXG4gICAgICAgICAgICAgIGxldCBudW1EYXkgPSBwYXJzZUludCh0ZW1wTWludXNbMV0pO1xyXG4gICAgICAgICAgICAgIGJ1c2luZXNzRGF0ZS5zZXREYXRlKGJ1c2luZXNzRGF0ZS5nZXREYXRlKCkgLSBudW1EYXkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG9wZXJhdG9yID09IFwiK1wiKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHRlbXBNaW51cyA9IGRhdGEuY29tcG9uZW50W2ldLnZhbHVlLnNwbGl0KFwiK1wiLCAyKTtcclxuICAgICAgICAgICAgICBsZXQgbnVtRGF5ID0gcGFyc2VJbnQodGVtcE1pbnVzWzFdKTtcclxuICAgICAgICAgICAgICBidXNpbmVzc0RhdGUuc2V0RGF0ZShidXNpbmVzc0RhdGUuZ2V0RGF0ZSgpICsgbnVtRGF5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkYXRlU2hvdyA9IGJ1c2luZXNzRGF0ZTtcclxuICAgICAgICAgICAgbGV0IGRhdGVUZXh0ID0gZm9ybWF0RGF0ZShkYXRlU2hvdywgJ3l5eXktTU0tZGQnLCAnZW4tVVMnKVxyXG4gICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSA9IGRhdGVUZXh0O1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh0aGlzLnJlYWRvbmx5ID0gZmFsc2UpIHtcclxuICAgICAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLnJlc3RyaWN0aW9uICE9IHVuZGVmaW5lZCAmJiBkYXRhLmNvbXBvbmVudFtpXS5yZXN0cmljdGlvbiAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJHVFwiKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbWluRGF0ZSA9IG5ldyBEYXRlKHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGRhdGEuY29tcG9uZW50W2ldLm1pbkRhdGUsICd5eXl5LU1NLWRkJykpO1xyXG4gICAgICAgICAgICAgICAgbWluRGF0ZS5zZXREYXRlKG1pbkRhdGUuZ2V0RGF0ZSgpICsgMSk7XHJcbiAgICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS5taW5EYXRlID0gbWluRGF0ZTtcclxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEuY29tcG9uZW50W2ldLnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJMVFwiKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbWF4RGF0ZSA9IG5ldyBEYXRlKHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGRhdGEuY29tcG9uZW50W2ldLm1heERhdGUsICd5eXl5LU1NLWRkJykpO1xyXG4gICAgICAgICAgICAgICAgbWF4RGF0ZS5zZXREYXRlKG1heERhdGUuZ2V0RGF0ZSgpIC0gMSk7XHJcbiAgICAgICAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS5tYXhEYXRlID0gbWF4RGF0ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5jb3VudEZvcm07IGorKykge1xyXG4gICAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2pdLmlzRXZlbnQgJiYgdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtqXS5pdGVtc1VybC5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlRXZlbnQoZGF0YS5jb21wb25lbnRbal0uaXRlbXNVcmxbMF0uS2V5LCBkYXRhLmNvbXBvbmVudFtqXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbal0udHlwZSA9PSBcIm9mZmljZVJvbGVDb2Rlc1wiICYmIHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbal0uaXRlbXNVcmwubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLlNldFJvbGVPZmZpY2VDb2RlcyhqKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sIDEwMDApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBTZXRSb2xlT2ZmaWNlQ29kZXMoaTogbnVtYmVyKSB7XHJcbiAgICBsZXQgdmFsdWU6IHN0cmluZyA9IHRoaXMuY29va2llU2VydmljZS5nZXQoXCJVc2VyQWNjZXNzXCIpO1xyXG4gICAgbGV0IHVzZXJBY2Nlc3M6IHN0cmluZyA9IEpTT04ucGFyc2UodGhpcy5EZWNyeXB0U3RyaW5nKHZhbHVlLCBcIkFkSW5zRk9VMTIzNDU2NzhcIikpO1xyXG4gICAgbGV0IHJvbGVDb2RlOiBzdHJpbmcgPSB1c2VyQWNjZXNzW1wiUm9sZUNvZGVcIl07XHJcbiAgICBsZXQgbGlzdE9mZmljZVJvbGVDb2RlczogQXJyYXk8c3RyaW5nPiA9IG5ldyBBcnJheSgpO1xyXG4gICAgbGlzdE9mZmljZVJvbGVDb2Rlcy5wdXNoKHJvbGVDb2RlKTtcclxuICAgIGxldCBjb21wb25lbnQgPSB0aGlzLm15Rm9ybS5uYXRpdmVFbGVtZW50W2ldO1xyXG4gICAgbGV0IGRkbCA9IGNvbXBvbmVudC5vcHRpb25zO1xyXG4gICAgbGV0IHRleHQgPSBkZGxbZGRsLnNlbGVjdGVkSW5kZXhdLnZhbHVlLnRyaW0oKTtcclxuICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2ldLml0ZW1zVXJsLmxlbmd0aCA9PSAxIHx8ICh0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2ldLmRkbFR5cGUgPT0gJ2FsbCcgJiYgdGV4dCA9PSAnYWxsJykpIHtcclxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0uaXRlbXNVcmwubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0uaXRlbXNVcmxbaW5kZXhdO1xyXG4gICAgICAgIGxpc3RPZmZpY2VSb2xlQ29kZXMucHVzaChlbGVtZW50LktleSk7XHJcbiAgICAgICAgbGlzdE9mZmljZVJvbGVDb2Rlcy5wdXNoKHJvbGVDb2RlICsgXCItXCIgKyBlbGVtZW50LktleSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxpc3RPZmZpY2VSb2xlQ29kZXMucHVzaCh0ZXh0KTtcclxuICAgICAgbGlzdE9mZmljZVJvbGVDb2Rlcy5wdXNoKHJvbGVDb2RlICsgXCItXCIgKyB0ZXh0KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlYXJjaElucHV0LmludGVncmF0aW9uT2JqLnJlcXVlc3RPYmpbXCJPZmZpY2VSb2xlQ29kZXNcIl0gPSBsaXN0T2ZmaWNlUm9sZUNvZGVzO1xyXG4gIH1cclxuXHJcbiAgc2V0RGVmYXVsdFZhbHVlTW9udGgodmFsdWUpIHtcclxuICAgIGxldCBidXNpbmVzc0RhdGUgPSBuZXcgRGF0ZSh0aGlzLkJ1c2luZXNzRHQpO1xyXG4gICAgbGV0IG9wZXJhdG9yID0gdmFsdWUuY2hhckF0KDIpO1xyXG4gICAgbGV0IHRlbXBWYWx1ZSA9IHZhbHVlLnNwbGl0KG9wZXJhdG9yLCAyKTtcclxuICAgIGxldCBudW1Nb250aCA9IHBhcnNlSW50KHRlbXBWYWx1ZVsxXSk7XHJcbiAgICBpZiAoIW51bU1vbnRoKSBudW1Nb250aCA9IDE7XHJcbiAgICBpZiAob3BlcmF0b3IgPT0gXCItXCIpIHtcclxuICAgICAgYnVzaW5lc3NEYXRlLnNldE1vbnRoKGJ1c2luZXNzRGF0ZS5nZXRNb250aCgpIC0gbnVtTW9udGgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAob3BlcmF0b3IgPT0gXCIrXCIpIHtcclxuICAgICAgYnVzaW5lc3NEYXRlLnNldE1vbnRoKGJ1c2luZXNzRGF0ZS5nZXRNb250aCgpICsgbnVtTW9udGgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJ1c2luZXNzRGF0ZS5nZXRNb250aCgpO1xyXG4gIH1cclxuICBzZXRNb250aERETChtb250aCkge1xyXG4gICAgaWYgKG1vbnRoID09IFwibW9udGhcIikgcmV0dXJuIHRoaXMuTGlzdE9mTW9udGguTGlzdE9mTW9udGg7XHJcbiAgICBsZXQgTGlzdE9mTW9udGg6IEFycmF5PEtleVZhbHVlVUNTZWFyY2hPYmo+ID0gbmV3IEFycmF5KCk7XHJcbiAgICBsZXQgZXF1YXRpb24gPSBtb250aC5tYXRjaChcIltcXFxcK11bLV18Wy1dW1xcXFwrXXxcXFxcK3wtXCIpO1xyXG4gICAgbGV0IHRvTWluOiBudW1iZXIgPSB0aGlzLkJ1c2luZXNzRHQuZ2V0TW9udGgoKTtcclxuICAgIGxldCB0b01heDogbnVtYmVyID0gdGhpcy5CdXNpbmVzc0R0LmdldE1vbnRoKCk7XHJcbiAgICBsZXQgbWluTWF4OiBudW1iZXIgPSBwYXJzZUludChtb250aC5zdWJzdHJpbmcoZXF1YXRpb24uaW5kZXggKyBlcXVhdGlvblswXS5sZW5ndGgpKTtcclxuICAgIGlmIChtaW5NYXggPj0gMTIpIHJldHVybiB0aGlzLkxpc3RPZk1vbnRoLkxpc3RPZk1vbnRoO1xyXG4gICAgaWYgKChlcXVhdGlvblswXSA9PSBcIistXCIgfHwgZXF1YXRpb25bMF0gPT0gXCItK1wiKSAmJiBtaW5NYXggPj0gNikgcmV0dXJuIHRoaXMuTGlzdE9mTW9udGguTGlzdE9mTW9udGg7XHJcbiAgICBsZXQgZGljdE9mTW9udGg6IHsgW21vbnRoOiBudW1iZXJdOiBzdHJpbmcgfSA9IHRoaXMuTGlzdE9mTW9udGguRGljdE9mTW9udGg7XHJcbiAgICBMaXN0T2ZNb250aC5wdXNoKHsga2V5OiB0b01pbiwgdmFsdWU6IGRpY3RPZk1vbnRoW3RvTWluXSB9KTtcclxuXHJcbiAgICBmb3IgKGxldCBxID0gMDsgcSA8IG1pbk1heDsgcSsrKSB7XHJcbiAgICAgIGlmIChlcXVhdGlvblswXS5pbmNsdWRlcyhcIi1cIikpIHtcclxuICAgICAgICB0b01pbi0tO1xyXG4gICAgICAgIGlmICh0b01pbiA9PSAwKSB0b01pbiA9IDEyO1xyXG4gICAgICAgIExpc3RPZk1vbnRoLnB1c2goeyBrZXk6IHRvTWluLCB2YWx1ZTogZGljdE9mTW9udGhbdG9NaW5dIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChlcXVhdGlvblswXS5pbmNsdWRlcyhcIitcIikpIHtcclxuICAgICAgICB0b01heCsrO1xyXG4gICAgICAgIGlmICh0b01heCA9PSAxMykgdG9NYXggPSAxO1xyXG4gICAgICAgIExpc3RPZk1vbnRoLnB1c2goeyBrZXk6IHRvTWF4LCB2YWx1ZTogZGljdE9mTW9udGhbdG9NYXhdIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBMaXN0T2ZNb250aC5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgIHJldHVybiBhLmtleSAtIGIua2V5O1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gTGlzdE9mTW9udGg7XHJcbiAgfVxyXG5cclxuICBzZXREZWZhdWx0VmFsdWVZZWFyKHZhbHVlKSB7XHJcbiAgICBsZXQgYnVzaW5lc3NEYXRlID0gbmV3IERhdGUodGhpcy5CdXNpbmVzc0R0KTtcclxuICAgIGxldCBvcGVyYXRvciA9IHZhbHVlLmNoYXJBdCgyKTtcclxuICAgIGxldCB0ZW1wVmFsdWUgPSB2YWx1ZS5zcGxpdChvcGVyYXRvciwgMik7XHJcbiAgICBsZXQgbnVtWWVhciA9IHBhcnNlSW50KHRlbXBWYWx1ZVsxXSk7XHJcbiAgICBpZiAoIW51bVllYXIpIG51bVllYXIgPSAxO1xyXG4gICAgaWYgKG9wZXJhdG9yID09IFwiLVwiKSB7XHJcbiAgICAgIGJ1c2luZXNzRGF0ZS5zZXRGdWxsWWVhcihidXNpbmVzc0RhdGUuZ2V0RnVsbFllYXIoKSAtIG51bVllYXIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAob3BlcmF0b3IgPT0gXCIrXCIpIHtcclxuICAgICAgYnVzaW5lc3NEYXRlLnNldEZ1bGxZZWFyKGJ1c2luZXNzRGF0ZS5nZXRGdWxsWWVhcigpICsgbnVtWWVhcik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnVzaW5lc3NEYXRlLmdldEZ1bGxZZWFyKCk7XHJcbiAgfVxyXG4gIHNldFllYXJEREwoeWVhcikge1xyXG4gICAgdGhpcy5MaXN0T2ZZZWFyID0gbmV3IEFycmF5PEtleVZhbHVlVUNTZWFyY2hPYmo+KCk7XHJcbiAgICBsZXQgZXF1YXRpb24gPSB5ZWFyLm1hdGNoKFwiW1xcXFwrXVstXXxbLV1bXFxcXCtdfFxcXFwrfC1cIik7XHJcbiAgICBsZXQgdG9NaW46IG51bWJlciA9IHRoaXMuQnVzaW5lc3NEdC5nZXRGdWxsWWVhcigpO1xyXG4gICAgbGV0IHRvTWF4OiBudW1iZXIgPSB0aGlzLkJ1c2luZXNzRHQuZ2V0RnVsbFllYXIoKTtcclxuICAgIGxldCBtaW5NYXg6IG51bWJlciA9IHBhcnNlSW50KHllYXIuc3Vic3RyaW5nKGVxdWF0aW9uLmluZGV4ICsgZXF1YXRpb25bMF0ubGVuZ3RoKSk7XHJcbiAgICB0aGlzLkxpc3RPZlllYXIucHVzaCh7IGtleTogdGhpcy5CdXNpbmVzc0R0LmdldEZ1bGxZZWFyKCksIHZhbHVlOiB0aGlzLkJ1c2luZXNzRHQuZ2V0RnVsbFllYXIoKS50b1N0cmluZygpIH0pO1xyXG5cclxuICAgIGZvciAobGV0IHEgPSAwOyBxIDwgbWluTWF4OyBxKyspIHtcclxuICAgICAgaWYgKGVxdWF0aW9uWzBdID09IFwiLStcIiB8fCBlcXVhdGlvblswXSA9PSBcIistXCIpIHtcclxuICAgICAgICB0b01pbi0tO1xyXG4gICAgICAgIHRvTWF4Kys7XHJcbiAgICAgICAgdGhpcy5MaXN0T2ZZZWFyLnB1c2goeyBrZXk6IHRvTWluLCB2YWx1ZTogdG9NaW4udG9TdHJpbmcoKSB9LCB7IGtleTogdG9NYXgsIHZhbHVlOiB0b01heC50b1N0cmluZygpIH0pO1xyXG4gICAgICB9IGVsc2UgaWYgKGVxdWF0aW9uWzBdID09IFwiLVwiKSB7XHJcbiAgICAgICAgdG9NaW4tLTtcclxuICAgICAgICB0aGlzLkxpc3RPZlllYXIucHVzaCh7IGtleTogdG9NaW4sIHZhbHVlOiB0b01pbi50b1N0cmluZygpIH0pO1xyXG4gICAgICB9IGVsc2UgaWYgKGVxdWF0aW9uWzBdID09IFwiK1wiKSB7XHJcbiAgICAgICAgdG9NYXgrKztcclxuICAgICAgICB0aGlzLkxpc3RPZlllYXIucHVzaCh7IGtleTogdG9NYXgsIHZhbHVlOiB0b01heC50b1N0cmluZygpIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLkxpc3RPZlllYXIuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICByZXR1cm4gYS5rZXkgLSBiLmtleTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRoaXMuTGlzdE9mWWVhcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRKU09OKHVybDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHVybCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcG9zdEpTT04odXJsOiBzdHJpbmcsIGNyaXRlcmlhOiBhbnkgPSBudWxsKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh1cmwsIGNyaXRlcmlhKTtcclxuICB9XHJcblxyXG4gIHNlYXJjaENsaWNrKElzRXhwb3J0RXhjZWw6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgbGV0IGZpbHRlcmVkID0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maWx0ZXIoKGl0ZW0sIGksIGFycikgPT5cclxuICAgICAgYXJyLmZpbmRJbmRleCgoeCkgPT4gKHgubmFtZSA9PT0gaXRlbS5uYW1lKSkgPT09IGkpO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsdGVyZWQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKGZpbHRlcmVkW2ldLnR5cGUgPT0gXCJudW1lcmljXCIpIHtcclxuICAgICAgICBpZighdGhpcy5jaGVja1ZhbHVlR3RlTHRlKGZpbHRlcmVkW2ldKSkgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG9yZGVyID0gbnVsbDtcclxuICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24ub3JkZXJieSAhPSBudWxsKSB7XHJcbiAgICAgIG9yZGVyID0ge1xyXG4gICAgICAgIGtleTogdGhpcy5jb25maWd1cmF0aW9uLm9yZGVyYnkua2V5LFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLmNvbmZpZ3VyYXRpb24ub3JkZXJieS52YWx1ZVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnBhZ2VOb3cgPSAxO1xyXG4gICAgbGV0IHJvd1BlclBhZ2UgPSB0aGlzLnBhZ2VTaXplO1xyXG4gICAgaWYgKElzRXhwb3J0RXhjZWwpIHJvd1BlclBhZ2UgPSA5OTk5O1xyXG4gICAgdGhpcy5zZWFyY2godGhpcy5hcGlVcmwsIHRoaXMucGFnZU5vdywgcm93UGVyUGFnZSwgb3JkZXIsIHRoaXMuYXJyQ3JpdCwgSXNFeHBvcnRFeGNlbCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyByZXNldCgpIHtcclxuICAgIHRoaXMuc2VhcmNoRm9ybS5yZXNldEZvcm0oe1xyXG4gICAgICBFeHBvcnRUeXBlOiB0aGlzLkV4cG9ydFR5cGVMaXN0WzBdLmtleVxyXG4gICAgfSk7XHJcbiAgICBhd2FpdCB0aGlzLmluaXRpYXRlRm9ybSgpO1xyXG4gIH1cclxuXHJcbiAgc2VhcmNoKGFwaVVybDogc3RyaW5nLCBwYWdlTm86IG51bWJlciwgcm93UGVyUGFnZTogbnVtYmVyLCBvcmRlckJ5OiBhbnksIGFkZENyaXQ6IENyaXRlcmlhT2JqW10gPSBuZXcgQXJyYXkoKSwgSXNFeHBvcnRFeGNlbDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICBsZXQgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0Q3JpdGVyaWFPYmooKTtcclxuICAgIGxldCBhcnJDcml0ID0gbmV3IEFycmF5KCk7XHJcbiAgICBsZXQgSXNRdWVyeUluID0gZmFsc2U7XHJcbiAgICBsZXQgSXNCcmVhayA9IGZhbHNlO1xyXG5cclxuICAgIC8vIEluamVjdCB3aGVyZVF1ZXJ5IGZvciB3aGVyZSBjcml0ZXJpYVxyXG4gICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQud2hlcmVWYWx1ZSAhPSB1bmRlZmluZWQgJiYgdGhpcy5zZWFyY2hJbnB1dC53aGVyZVZhbHVlLmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5xdWVyeXN0cmluZy53aGVyZVF1ZXJ5ID0gbmV3IEFycmF5PGFueT4oKTtcclxuICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLnNlYXJjaElucHV0LndoZXJlVmFsdWUubGVuZ3RoOyB4KyspIHtcclxuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ucXVlcnlzdHJpbmcud2hlcmVRdWVyeS5wdXNoKHRoaXMuc2VhcmNoSW5wdXQud2hlcmVWYWx1ZVt4XS52YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNlYXJjaElucHV0LmZyb21WYWx1ZSAhPSB1bmRlZmluZWQgJiYgdGhpcy5zZWFyY2hJbnB1dC5mcm9tVmFsdWUubGVuZ3RoICE9IDApIHtcclxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLnF1ZXJ5c3RyaW5nLmZyb21RdWVyeSA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy5zZWFyY2hJbnB1dC5mcm9tVmFsdWUubGVuZ3RoOyB4KyspIHtcclxuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ucXVlcnlzdHJpbmcuZnJvbVF1ZXJ5LnB1c2godGhpcy5zZWFyY2hJbnB1dC5mcm9tVmFsdWVbeF0udmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXF1ZXN0LnBhZ2VObyA9IHBhZ2VObztcclxuICAgIHJlcXVlc3Qucm93UGVyUGFnZSA9IHJvd1BlclBhZ2U7XHJcbiAgICByZXF1ZXN0Lm9yZGVyQnkgPSBvcmRlckJ5O1xyXG4gICAgcmVxdWVzdC5xdWVyeVN0cmluZyA9IHRoaXMuY29uZmlndXJhdGlvbi5xdWVyeXN0cmluZztcclxuXHJcbiAgICBsZXQgZm9ybVNlcTogbnVtYmVyID0gLTE7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY291bnRGb3JtOyBpKyspIHtcclxuICAgICAgbGV0IGNyaXRPYmogPSBuZXcgQ3JpdGVyaWFPYmooKTtcclxuICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0udHlwZSA9PSBcImRyb3Bkb3duU2VhcmNoXCIpIHtcclxuICAgICAgICBmb3JtU2VxICs9IDM7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZm9ybVNlcSsrO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBjb21wb25lbnQgPSB0aGlzLm15Rm9ybS5uYXRpdmVFbGVtZW50W2Zvcm1TZXFdO1xyXG5cclxuICAgICAgLy8gLy8gcG9wdXAgbWVzc2FnZSBpZiByZXF1aXJlZFxyXG4gICAgICAvLyBpZiAoY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlZCcpICE9IG51bGwgJiYgY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlZCcpID09IFwidHJ1ZVwiKSB7XHJcbiAgICAgIC8vICAgbGV0IHZhbCA9IGNvbXBvbmVudC52YWx1ZS50cmltKCk7XHJcbiAgICAgIC8vICAgaWYgKHZhbCA9PSBcIlwiKSB7XHJcbiAgICAgIC8vICAgICBJc0JyZWFrID0gdHJ1ZTtcclxuICAgICAgLy8gICAgIGxldCBsYWJlbCA9IGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2xhYmVsJyk7XHJcbiAgICAgIC8vICAgICB0aGlzLnRvYXN0ci53YXJuaW5nKFwiUGxlYXNlIGlucHV0IFwiICsgbGFiZWwpO1xyXG4gICAgICAvLyAgICAgYnJlYWs7XHJcbiAgICAgIC8vICAgfVxyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICBjcml0T2JqLkRhdGFUeXBlID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnZGF0YS10eXBlJyk7XHJcbiAgICAgIGlmICghY3JpdE9iai5EYXRhVHlwZSkgY3JpdE9iai5EYXRhVHlwZSA9IFwiXCI7XHJcbiAgICAgIC8vSW5pIGtodXN1cyBrYWxhdSBkYXJpIERyb3AgRG93blxyXG4gICAgICBpZiAoY29tcG9uZW50LmdldEF0dHJpYnV0ZSgncXVlcnktaW4nKSAhPSBudWxsICYmIGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ3F1ZXJ5LWluJykgPT0gXCJ0cnVlXCIpIHtcclxuICAgICAgICBJc1F1ZXJ5SW4gPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIElzUXVlcnlJbiA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb21wb25lbnQudmFsdWUgIT0gXCJcIikge1xyXG4gICAgICAgIGlmIChjb21wb25lbnQubm9kZU5hbWUgPT0gJ1NFTEVDVCcpIHtcclxuICAgICAgICAgIGxldCBkZGwgPSBjb21wb25lbnQub3B0aW9ucztcclxuICAgICAgICAgIGxldCB0ZXh0ID0gZGRsW2RkbC5zZWxlY3RlZEluZGV4XS52YWx1ZS50cmltKCk7XHJcbiAgICAgICAgICBpZiAodGV4dCA9PSBcIm9uZVwiKSB7XHJcbiAgICAgICAgICAgIElzQnJlYWsgPSB0cnVlO1xyXG4gICAgICAgICAgICBsZXQgbGFiZWwgPSBjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdsYWJlbCcpO1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0ci53YXJuaW5nKFwiUGxlYXNlIHNlbGVjdCBcIiArIGxhYmVsKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY3JpdC1kYXRhdGFibGUnKSAhPSBcIlwiICYmIGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY3JpdC1kYXRhdGFibGUnKSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNyaXRPYmouaXNDcml0ZXJpYURhdGFUYWJsZSA9IGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY3JpdC1kYXRhdGFibGUnKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS50eXBlID09IFwidGFza0RlZmluaXRpb25LZXlcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2ldLnR5cGUgPT0gXCJwcm9jZXNzS2V5XCIpXHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2ldLnR5cGUgPT0gXCJjbGFpbVwiKSB7XHJcbiAgICAgICAgICAgIGNyaXRPYmoucHJvcE5hbWUgPSBjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLW5hbWUnKTtcclxuICAgICAgICAgICAgY3JpdE9iai5yZXN0cmljdGlvbiA9IHRleHQ7XHJcbiAgICAgICAgICAgIGNyaXRPYmoudmFsdWUgPSBudWxsO1xyXG4gICAgICAgICAgICBhcnJDcml0LnB1c2goY3JpdE9iaik7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGV4dCAhPSBcImFsbFwiICYmIHRleHQgIT0gXCJvbmVcIikge1xyXG4gICAgICAgICAgICAgIC8vS2FsYXUgRGFyaSBEcm9wZG93biB1ZGFoIHBhc3RpIHBha2UgRXFcclxuICAgICAgICAgICAgICBjcml0T2JqLnJlc3RyaWN0aW9uID0gQWRJbnNDb25zdGFudC5SZXN0cmljdGlvbkVxO1xyXG4gICAgICAgICAgICAgIGlmIChjb21wb25lbnQubmFtZSAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICBjcml0T2JqLnByb3BOYW1lID0gY29tcG9uZW50Lm5hbWU7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNyaXRPYmoucHJvcE5hbWUgPSBjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLW5hbWUnKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgY3JpdE9iai52YWx1ZSA9IHRleHQ7XHJcbiAgICAgICAgICAgICAgYXJyQ3JpdC5wdXNoKGNyaXRPYmopO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRleHQgPT0gXCJhbGxcIiAmJiBJc1F1ZXJ5SW4gJiYgY29tcG9uZW50Lm9wdGlvbnMubGVuZ3RoICE9IDApIHtcclxuICAgICAgICAgICAgICBsZXQgZGRsTGlzdCA9IG5ldyBBcnJheSgpO1xyXG4gICAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgY29tcG9uZW50Lm9wdGlvbnMubGVuZ3RoOyB4KyspIHtcclxuICAgICAgICAgICAgICAgIGlmICh4ICE9IDApIHtcclxuICAgICAgICAgICAgICAgICAgZGRsTGlzdC5wdXNoKGNvbXBvbmVudC5vcHRpb25zW3hdLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKGRkbExpc3QubGVuZ3RoICE9IDApIHtcclxuICAgICAgICAgICAgICAgIGNyaXRPYmoucmVzdHJpY3Rpb24gPSBBZEluc0NvbnN0YW50LlJlc3RyaWN0aW9uSW47XHJcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm5hbWUgIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgICBjcml0T2JqLnByb3BOYW1lID0gY29tcG9uZW50Lm5hbWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBjcml0T2JqLnByb3BOYW1lID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1uYW1lJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjcml0T2JqLmxpc3RWYWx1ZSA9IGRkbExpc3Q7XHJcbiAgICAgICAgICAgICAgICBhcnJDcml0LnB1c2goY3JpdE9iaik7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgLy9LYWxhdSBhZGEgUGVyY2VudCBtYWthIHlhbmcgZGlwYWtlIG5udGkgYWRhbGFoIFJlc3RyaWN0aW9ucyBMaWtlXHJcbiAgICAgICAgICBpZiAoY29tcG9uZW50Lm5hbWUgIT0gXCJcIikge1xyXG4gICAgICAgICAgICBjcml0T2JqLnByb3BOYW1lID0gY29tcG9uZW50Lm5hbWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjcml0T2JqLnByb3BOYW1lID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1uYW1lJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjcml0T2JqLnZhbHVlID0gY29tcG9uZW50LnZhbHVlLnRyaW0oKTtcclxuICAgICAgICAgIGlmIChjb21wb25lbnQudmFsdWUuaW5jbHVkZXMoXCIlXCIpKSB7XHJcbiAgICAgICAgICAgIGNyaXRPYmoucmVzdHJpY3Rpb24gPSBBZEluc0NvbnN0YW50LlJlc3RyaWN0aW9uTGlrZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8va2FsYXUgY29tcG9uZW50bnlhIERhdGUsIHJlc3RyaWN0aW9uc255YSBsZ3NnIGFtYmlsIGRhcmkgcHJvcGVydHkgSlNPTm55YVxyXG4gICAgICAgICAgZWxzZSBpZiAoY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1yZXN0cmljdGlvbicpICE9IFwiXCIgJiYgY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1yZXN0cmljdGlvbicpICE9IG51bGwpIHtcclxuICAgICAgICAgICAgY3JpdE9iai5yZXN0cmljdGlvbiA9IGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVzdHJpY3Rpb24nKTtcclxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdHlwZScpID09ICdudW1lcmljJykge1xyXG4gICAgICAgICAgICAgIGNyaXRPYmoudmFsdWUgPSBwYXJzZUZsb2F0KGNvbXBvbmVudC52YWx1ZS5yZXBsYWNlKC8sL2csICcnKSkudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY3JpdE9iai5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiTElLRVwiKSB7XHJcbiAgICAgICAgICAgICAgY3JpdE9iai52YWx1ZSA9IFwiJVwiICsgY29tcG9uZW50LnZhbHVlLnRyaW0oKSArIFwiJVwiO1xyXG4gICAgICAgICAgICAgIGNyaXRPYmoucmVzdHJpY3Rpb24gPSBBZEluc0NvbnN0YW50LlJlc3RyaWN0aW9uTGlrZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY3JpdE9iai5yZXN0cmljdGlvbiA9IEFkSW5zQ29uc3RhbnQuUmVzdHJpY3Rpb25FcVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY3JpdC1kYXRhdGFibGUnKSAhPSBcIlwiICYmIGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY3JpdC1kYXRhdGFibGUnKSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNyaXRPYmouaXNDcml0ZXJpYURhdGFUYWJsZSA9IGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY3JpdC1kYXRhdGFibGUnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGFyckNyaXQucHVzaChjcml0T2JqKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoSXNCcmVhaykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGFkZENyaXQgIT0gbnVsbCAmJiBhZGRDcml0ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAoYWRkQ3JpdC5sZW5ndGggIT0gMCkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWRkQ3JpdC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgYXJyQ3JpdC5wdXNoKGFkZENyaXRbaV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnNlYXJjaElucHV0LmFkZENyaXRJbnB1dCAhPSBudWxsIHx8IHRoaXMuc2VhcmNoSW5wdXQuYWRkQ3JpdElucHV0ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWFyY2hJbnB1dC5hZGRDcml0SW5wdXQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGFyckNyaXQucHVzaCh0aGlzLnNlYXJjaElucHV0LmFkZENyaXRJbnB1dFtpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnNlYXJjaElucHV0LmFkZENyaXRJbnB1dCAhPSBudWxsIHx8IHRoaXMuc2VhcmNoSW5wdXQuYWRkQ3JpdElucHV0ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VhcmNoSW5wdXQuYWRkQ3JpdElucHV0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgYXJyQ3JpdC5wdXNoKHRoaXMuc2VhcmNoSW5wdXQuYWRkQ3JpdElucHV0W2ldKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlcXVlc3QuY3JpdGVyaWEgPSBhcnJDcml0O1xyXG5cclxuICAgIHJlcXVlc3QuaW50ZWdyYXRpb25PYmogPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuaXNKb2luRXhBUEkpIHtcclxuICAgICAgcmVxdWVzdC5pbnRlZ3JhdGlvbk9iaiA9IHRoaXMuc2VhcmNoSW5wdXQuaW50ZWdyYXRpb25PYmo7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5odHRwLnBvc3QoYXBpVXJsLCByZXF1ZXN0KS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIGlmIChJc0V4cG9ydEV4Y2VsKSB7XHJcbiAgICAgICAgdGhpcy5FeGNlbERhdGEgPSByZXNwb25zZVtcIkRhdGFcIl07XHJcbiAgICAgICAgdGhpcy5leGNlbFNlcnZpY2UuZXhwb3J0QXNFeGNlbEZpbGUodGhpcy5FeGNlbERhdGEsICdzYW1wbGUnKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgbGV0IHFyeVBhZ2luZyA9IHtcclxuICAgICAgICByZXNwb25zZTogcmVzcG9uc2UsXHJcbiAgICAgICAgcGFnZU5vdzogcGFnZU5vXHJcbiAgICAgIH1cclxuICAgICAgY29uc29sZS5sb2cocXJ5UGFnaW5nKTtcclxuICAgICAgdGhpcy5yZXN1bHQuZW1pdChxcnlQYWdpbmcpO1xyXG4gICAgICB0aGlzLnJlcUdldEFsbERhdGEuZW1pdChyZXF1ZXN0KTtcclxuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjaGVja1ZhbHVlR3RlTHRlKGNvbXBvbmVudCl7XHJcbiAgICAvL2NlayB5ZyBwYWthaSByZXN0cmljdGlvbiBndGUvbHRlL2d0L2x0XHJcbiAgICBsZXQgTWluQ29tcG9uZW50ID0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maW5kKHggPT4geC5uYW1lID09IGNvbXBvbmVudC5uYW1lICYmICh4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJHVEVcIikpO1xyXG4gICAgaWYoIU1pbkNvbXBvbmVudCl7XHJcbiAgICAgIE1pbkNvbXBvbmVudCA9IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmluZCh4ID0+IHgubmFtZSA9PSBjb21wb25lbnQubmFtZSAmJiAoeC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiR1RcIikpXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IE1heENvbXBvbmVudCA9IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmluZCh4ID0+IHgubmFtZSA9PSBjb21wb25lbnQubmFtZSAmJiAoeC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiTFRFXCIpKTtcclxuICAgIGlmKCFNYXhDb21wb25lbnQpe1xyXG4gICAgICBNYXhDb21wb25lbnQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbmQoeCA9PiB4Lm5hbWUgPT0gY29tcG9uZW50Lm5hbWUgJiYgKHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxUXCIpKVxyXG4gICAgfVxyXG5cclxuICAgIGlmKE1pbkNvbXBvbmVudCAmJiBNYXhDb21wb25lbnQpe1xyXG4gICAgICBsZXQgbWluVmFsdWUgPSB0aGlzLm15Rm9ybS5uYXRpdmVFbGVtZW50W01pbkNvbXBvbmVudC5pZF0udmFsdWVBc051bWJlcjtcclxuICAgICAgbGV0IG1heFZhbHVlID0gdGhpcy5teUZvcm0ubmF0aXZlRWxlbWVudFtNYXhDb21wb25lbnQuaWRdLnZhbHVlQXNOdW1iZXI7XHJcbiAgICAgIGlmKG1pblZhbHVlID4gbWF4VmFsdWUpe1xyXG4gICAgICAgIHRoaXMudG9hc3RyLndhcm5pbmcoTWluQ29tcG9uZW50LmxhYmVsICsgXCIgbXVzdCBiZSBsZXNzIHRoYW4gXCIgKyBNYXhDb21wb25lbnQubGFiZWwpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgR2VuZXJhdGVSZXBvcnQoZW5qaUZvcm06IE5nRm9ybSkge1xyXG4gICAgZW5qaUZvcm0uZm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICBpZighZW5qaUZvcm0uZm9ybS52YWxpZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5nZW5ScHQuZW1pdCh7IEV4cG9ydFR5cGU6IHRoaXMuRXhwb3J0VHlwZSwgRWxSZWY6IHRoaXMubXlGb3JtIH0pO1xyXG4gIH1cclxuXHJcbiAgbGVzc1RoYW5Gb3VyKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuY291bnRGb3JtID4gMykge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXNvbHZlT2JqZWN0KG9iajogYW55LCB1cmw6IHN0cmluZywgY3JpdDogUmVxdWVzdENyaXRlcmlhT2JqID0gbnVsbCkge1xyXG4gICAgY29uc3QgdmFsID0gdGhpcy5wb3N0SlNPTih1cmwsIGNyaXQpO1xyXG4gICAgdmFsLnN1YnNjcmliZSh0ZW1wRGF0YSA9PiB7XHJcbiAgICAgIG9iai5pdGVtc1VybCA9IG5ldyBBcnJheSgpO1xyXG4gICAgICBvYmouaXRlbXNVcmwgPSB0ZW1wRGF0YS5SZXR1cm5PYmplY3Q7XHJcblxyXG4gICAgICBpZiAob2JqLmV4Y2x1ZGUgIT0gdW5kZWZpbmVkICYmIG9iai5leGNsdWRlICE9IFwiXCIpIHtcclxuICAgICAgICBvYmouaXRlbXNVcmwgPSBvYmouaXRlbXNVcmwuZmlsdGVyKCh2YWx1ZSkgPT4gIW9iai5leGNsdWRlLmluY2x1ZGVzKHZhbHVlLktleSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAob2JqLnR5cGUgPT0gXCJkcm9wZG93blNlYXJjaFwiICYmIG9iai5pdGVtc1VybC5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgIG9iai52YWx1ZSA9IG9iai5pdGVtc1VybFswXS5LZXk7XHJcbiAgICAgICAgb2JqLmRlc2NyID0gb2JqLml0ZW1zVXJsWzBdLlZhbHVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChvYmouYWZmZWN0ZWRGaWx0ZXIgJiYgb2JqLml0ZW1zVXJsLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZUV2ZW50KG9iai5pdGVtc1VybFswXS5LZXksIG9iaik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdHJhbnNmb3JtVG9EZWNpbWFsKGVsZW1lbnQ6IGFueSkge1xyXG4gICAgZWxlbWVudC50YXJnZXQudmFsdWUgPSBwYXJzZUZsb2F0KGVsZW1lbnQudGFyZ2V0LnZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvLC9nLCAnJykpO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0QXNYTFNYKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWFyY2hDbGljayh0cnVlKTtcclxuICAgIC8vIGxldCByZXF1ZXN0ID0gbmV3IFJlcXVlc3RDcml0ZXJpYU9iaigpO1xyXG4gICAgLy8gcmVxdWVzdC5wYWdlTm8gPSAxO1xyXG4gICAgLy8gcmVxdWVzdC5yb3dQZXJQYWdlID0gOTk5OTtcclxuICAgIC8vIHJlcXVlc3Qub3JkZXJCeSA9IG51bGw7XHJcbiAgICAvLyByZXF1ZXN0LmNyaXRlcmlhID0gW107XHJcbiAgICAvLyByZXF1ZXN0LnF1ZXJ5U3RyaW5nID0gdGhpcy5jb25maWd1cmF0aW9uLnF1ZXJ5c3RyaW5nO1xyXG4gICAgLy8gaWYgKCF0aGlzLnNlYXJjaElucHV0LmlzSm9pbkV4QVBJKSB7XHJcbiAgICAvLyAgIHJlcXVlc3QuaW50ZWdyYXRpb25PYmogPSBudWxsO1xyXG4gICAgLy8gfSBlbHNlIHtcclxuICAgIC8vICAgcmVxdWVzdC5pbnRlZ3JhdGlvbk9iaiA9IHRoaXMuc2VhcmNoSW5wdXQuaW50ZWdyYXRpb25PYmo7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gdGhpcy5odHRwLnBvc3QodGhpcy5hcGlVcmwsIHJlcXVlc3QpLnN1YnNjcmliZShcclxuICAgIC8vICAgcmVzcG9uc2UgPT4ge1xyXG4gICAgLy8gICAgIHRoaXMuRXhjZWxEYXRhID0gcmVzcG9uc2VbXCJEYXRhXCJdO1xyXG4gICAgLy8gICAgIHRoaXMuZXhjZWxTZXJ2aWNlLmV4cG9ydEFzRXhjZWxGaWxlKHRoaXMuRXhjZWxEYXRhLCAnc2FtcGxlJyk7XHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIChlcnJvcikgPT4ge1xyXG4gICAgLy8gICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgIC8vICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZUV2ZW50KG9wdFZhbHVlLCBhZkZpbHRlcikge1xyXG4gICAgbGV0IGpzb25Db21wID0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudDtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFmRmlsdGVyLmFmZmVjdGVkRmlsdGVyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwganNvbkNvbXAubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBpZiAoanNvbkNvbXBbal0ubmFtZSA9PSBhZkZpbHRlci5hZmZlY3RlZEZpbHRlcltpXSkge1xyXG4gICAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdENyaXRlcmlhT2JqKCk7XHJcbiAgICAgICAgICBsZXQgYXJyYXlDcml0ID0gbmV3IEFycmF5KCk7XHJcblxyXG4gICAgICAgICAgaWYgKG9wdFZhbHVlICE9IFwiYWxsXCIgJiYgb3B0VmFsdWUgIT0gXCJvbmVcIikge1xyXG4gICAgICAgICAgICBsZXQgY3JpdE9iaiA9IG5ldyBDcml0ZXJpYU9iaigpO1xyXG4gICAgICAgICAgICBjcml0T2JqLkRhdGFUeXBlID0gYWZGaWx0ZXIuZGF0YXR5cGU7XHJcbiAgICAgICAgICAgIGlmIChhZkZpbHRlci5maWx0ZXJQcm9wTmFtZSAhPSB1bmRlZmluZWQgfHwgYWZGaWx0ZXIuZmlsdGVyUHJvcE5hbWUgIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgIHJlcXVlc3RbYWZGaWx0ZXIuZmlsdGVyUHJvcE5hbWVdID0gb3B0VmFsdWU7XHJcbiAgICAgICAgICAgICAgY3JpdE9iai5wcm9wTmFtZSA9IGFmRmlsdGVyLmZpbHRlclByb3BOYW1lO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNyaXRPYmoucHJvcE5hbWUgPSBhZkZpbHRlci5uYW1lO1xyXG4gICAgICAgICAgICAgIHJlcXVlc3RbYWZGaWx0ZXIubmFtZV0gPSBvcHRWYWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjcml0T2JqLnZhbHVlID0gb3B0VmFsdWU7XHJcbiAgICAgICAgICAgIGNyaXRPYmoucmVzdHJpY3Rpb24gPSBBZEluc0NvbnN0YW50LlJlc3RyaWN0aW9uRXE7XHJcbiAgICAgICAgICAgIGFycmF5Q3JpdC5wdXNoKGNyaXRPYmopO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmVxdWVzdC5jcml0ZXJpYSA9IGFycmF5Q3JpdDtcclxuICAgICAgICAgIGlmIChqc29uQ29tcFtqXS5wYXRoICE9IHVuZGVmaW5lZCAmJiBqc29uQ29tcFtqXS5wYXRoICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQubGlzdEVudmlyb25tZW50cyAhPSB1bmRlZmluZWQgJiYgdGhpcy5zZWFyY2hJbnB1dC5saXN0RW52aXJvbm1lbnRzLmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCB0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHMubGVuZ3RoOyB5KyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChqc29uQ29tcFtqXS5lbnZpcm9ubWVudCA9PSB0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHNbeV0uZW52aXJvbm1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAganNvbkNvbXBbal0uZnVsbHBhdGggPSB0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHNbeV0udXJsICsganNvbkNvbXBbal0ucGF0aDtcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGpzb25Db21wW2pdLmZ1bGxwYXRoID0ganNvbkNvbXBbal0udXJsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAganNvbkNvbXBbal0uZnVsbHBhdGggPSBqc29uQ29tcFtqXS51cmw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnJlc29sdmVPYmplY3QoanNvbkNvbXBbal0sIGpzb25Db21wW2pdLmZ1bGxwYXRoLCByZXF1ZXN0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIFNldFByb2Nlc3NLZXkoaWR4OiBudW1iZXIsIHdmS2V5RmlsdGVyOiBzdHJpbmcpIHtcclxuICAgIGxldCBjb21wb25lbnQgPSB0aGlzLm15Rm9ybS5uYXRpdmVFbGVtZW50W2lkeF07XHJcbiAgICBsZXQgZGRsID0gY29tcG9uZW50Lm9wdGlvbnM7XHJcbiAgICBsZXQgdGV4dDogc3RyaW5nID0gZGRsW2RkbC5zZWxlY3RlZEluZGV4XS52YWx1ZS50cmltKCk7XHJcbiAgICBsZXQgbGlzdFZhbHVlID0gdGV4dC5zcGxpdCgnOycpO1xyXG4gICAgbGV0IGxpc3RXZktleSA9IHdmS2V5RmlsdGVyLnNwbGl0KCc7Jyk7XHJcbiAgICBcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdFZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoSW5wdXQuaW50ZWdyYXRpb25PYmoucmVxdWVzdE9ialtsaXN0V2ZLZXlbaV1dID0gbGlzdFZhbHVlW2ldO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgfVxyXG5cclxuICBzd2l0Y2hDYXNlKGNvbmRMaXN0KSB7XHJcbiAgICBsZXQgY29uZGl0aW9uID0gZmFsc2U7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25kTGlzdC5jb25kaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBpZHggPSB0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlLmZpbmRJbmRleCh4ID0+IHgucHJvcGVydHkgPT0gY29uZExpc3QuY29uZGl0aW9uc1tpXS5wcm9wZXJ0eSk7XHJcbiAgICAgIGlmIChjb25kTGlzdC5jb25kaXRpb25zW2ldLnJlc3RyaWN0aW9uID09IFwiRVFcIikge1xyXG4gICAgICAgIGlmICghY29uZExpc3QuY29uZGl0aW9uc1tpXS5pc1VzZXIpIHtcclxuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgPT0gY29uZExpc3QuY29uZGl0aW9uc1tpXS52YWx1ZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgdXNlcm5hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlVzZXJuYW1lXCIpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSA9PSB1c2VybmFtZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChjb25kTGlzdC5jb25kaXRpb25zW2ldLnJlc3RyaWN0aW9uID09IFwiTkVRXCIpIHtcclxuICAgICAgICBpZiAoY29uZExpc3QuY29uZGl0aW9uc1tpXS5pc1VzZXIgIT0gdHJ1ZSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSAhPSBjb25kTGlzdC5jb25kaXRpb25zW2ldLnZhbHVlKSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCB1c2VybmFtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiVXNlcm5hbWVcIik7XHJcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZVtpZHhdLnZhbHVlICE9IHVzZXJuYW1lKSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0ucmVzdHJpY3Rpb24gPT0gXCJHVFwiKSB7XHJcbiAgICAgICAgaWYgKCFjb25kTGlzdC5jb25kaXRpb25zW2ldLmlzVXNlcikge1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSA+IGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0udmFsdWUpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHVzZXJuYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJVc2VybmFtZVwiKTtcclxuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgPiB1c2VybmFtZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChjb25kTGlzdC5jb25kaXRpb25zW2ldLnJlc3RyaWN0aW9uID09IFwiR1RFXCIpIHtcclxuICAgICAgICBpZiAoIWNvbmRMaXN0LmNvbmRpdGlvbnNbaV0uaXNVc2VyKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZVtpZHhdLnZhbHVlID49IGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0udmFsdWUpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHVzZXJuYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJVc2VybmFtZVwiKTtcclxuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgPj0gdXNlcm5hbWUpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoY29uZExpc3QuY29uZGl0aW9uc1tpXS5yZXN0cmljdGlvbiA9PSBcIkxUXCIpIHtcclxuICAgICAgICBpZiAoIWNvbmRMaXN0LmNvbmRpdGlvbnNbaV0uaXNVc2VyKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZVtpZHhdLnZhbHVlIDwgY29uZExpc3QuY29uZGl0aW9uc1tpXS52YWx1ZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgdXNlcm5hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlVzZXJuYW1lXCIpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSA8IHVzZXJuYW1lKSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0ucmVzdHJpY3Rpb24gPT0gXCJMVEVcIikge1xyXG4gICAgICAgIGlmICghY29uZExpc3QuY29uZGl0aW9uc1tpXS5pc1VzZXIpIHtcclxuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgPD0gY29uZExpc3QuY29uZGl0aW9uc1tpXS52YWx1ZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgdXNlcm5hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlVzZXJuYW1lXCIpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSA8PSB1c2VybmFtZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvbmRpdGlvbjtcclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIERlY3J5cHRTdHJpbmcoY2hpcHBlclRleHQ6IHN0cmluZywgY2hpcHBlcktleTogc3RyaW5nKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIGNoaXBwZXJLZXkgPT0gdW5kZWZpbmVkIHx8IGNoaXBwZXJLZXkudHJpbSgpID09ICcnIHx8XHJcbiAgICAgIGNoaXBwZXJUZXh0ID09IHVuZGVmaW5lZCB8fCBjaGlwcGVyVGV4dC50cmltKCkgPT0gJydcclxuICAgICkgcmV0dXJuIGNoaXBwZXJUZXh0O1xyXG4gICAgbGV0IGNoaXBwZXJLZXlBcnIgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZShjaGlwcGVyS2V5KTtcclxuICAgIGxldCBpdiA9IENyeXB0b0pTLmxpYi5Xb3JkQXJyYXkuY3JlYXRlKFsweDAwLCAweDAwLCAweDAwLCAweDAwXSk7XHJcbiAgICBsZXQgZGVjcnlwdGVkID0gQ3J5cHRvSlMuQUVTLmRlY3J5cHQoY2hpcHBlclRleHQsIGNoaXBwZXJLZXlBcnIsIHsgaXY6IGl2IH0pO1xyXG4gICAgbGV0IHBsYWluVGV4dCA9IGRlY3J5cHRlZC50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7XHJcbiAgICByZXR1cm4gcGxhaW5UZXh0O1xyXG4gIH1cclxuXHJcbiAgY2hlY2tJbnB1dERhdGUoY29tcG9uZW50OiBhbnkpIHtcclxuICAgIGxldCBtaW5EYXRlVmFsO1xyXG4gICAgbGV0IG1heERhdGVWYWw7XHJcbiAgICBsZXQgbGFiZWw7XHJcbiAgICBsZXQgZXJyb3JNZXNzYWdlID0gbmV3IEFycmF5PHN0cmluZz4oKTtcclxuXHJcbiAgICBsZXQgTWluQ29tcG9uZW50ID0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maW5kKHggPT4geC5uYW1lID09IGNvbXBvbmVudC5uYW1lICYmICh4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJHVEVcIikpID09IHVuZGVmaW5lZCA/IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmluZCh4ID0+IHgubmFtZSA9PSBjb21wb25lbnQubmFtZSAmJiAoeC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiR1RcIikpIDogdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maW5kKHggPT4geC5uYW1lID09IGNvbXBvbmVudC5uYW1lICYmICh4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJHVEVcIikpO1xyXG4gICAgaWYgKE1pbkNvbXBvbmVudCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgbWluRGF0ZVZhbCA9IHRoaXMubXlGb3JtLm5hdGl2ZUVsZW1lbnRbTWluQ29tcG9uZW50LmlkXS5taW4gPT0gXCJcIiA/IG51bGwgOiBuZXcgRGF0ZSh0aGlzLm15Rm9ybS5uYXRpdmVFbGVtZW50W01pbkNvbXBvbmVudC5pZF0ubWluKTtcclxuICAgICAgbGFiZWwgPSBNaW5Db21wb25lbnQubGFiZWwuc3BsaXQoXCI+XCIsIDIpO1xyXG4gICAgICBpZiAobWluRGF0ZVZhbCAhPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKE1pbkNvbXBvbmVudC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiR1RcIikge1xyXG4gICAgICAgICAgbWluRGF0ZVZhbC5zZXREYXRlKG1pbkRhdGVWYWwuZ2V0RGF0ZSgpIC0gMSk7XHJcbiAgICAgICAgICBlcnJvck1lc3NhZ2UucHVzaChcIiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBcIik7XHJcbiAgICAgICAgfSBlbHNlIGlmIChNaW5Db21wb25lbnQucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkdURVwiKSB7XHJcbiAgICAgICAgICBlcnJvck1lc3NhZ2UucHVzaChcIiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbHMgdG8gXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBNYXhDb21wb25lbnQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbmQoeCA9PiB4Lm5hbWUgPT0gY29tcG9uZW50Lm5hbWUgJiYgKHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxURVwiKSkgPT0gdW5kZWZpbmVkID8gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maW5kKHggPT4geC5uYW1lID09IGNvbXBvbmVudC5uYW1lICYmICh4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJMVFwiKSkgOiB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbmQoeCA9PiB4Lm5hbWUgPT0gY29tcG9uZW50Lm5hbWUgJiYgKHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxURVwiKSk7XHJcbiAgICBpZiAoTWF4Q29tcG9uZW50ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICBtYXhEYXRlVmFsID0gdGhpcy5teUZvcm0ubmF0aXZlRWxlbWVudFtNYXhDb21wb25lbnQuaWRdLm1heCA9PSBcIlwiID8gbnVsbCA6IG5ldyBEYXRlKHRoaXMubXlGb3JtLm5hdGl2ZUVsZW1lbnRbTWF4Q29tcG9uZW50LmlkXS5tYXgpO1xyXG4gICAgICBsYWJlbCA9IE1heENvbXBvbmVudC5sYWJlbC5zcGxpdChcIjxcIiwgMik7XHJcbiAgICAgIGlmIChtYXhEYXRlVmFsICE9IG51bGwpIHtcclxuICAgICAgICBpZiAoTWF4Q29tcG9uZW50LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJMVFwiKSB7XHJcbiAgICAgICAgICBtYXhEYXRlVmFsLnNldERhdGUobWF4RGF0ZVZhbC5nZXREYXRlKCkgKyAxKTtcclxuICAgICAgICAgIGVycm9yTWVzc2FnZS5wdXNoKFwiIG11c3QgYmUgbGVzcyB0aGFuIFwiKTtcclxuICAgICAgICB9IGVsc2UgaWYgKE1heENvbXBvbmVudC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiTFRFXCIpIHtcclxuICAgICAgICAgIGVycm9yTWVzc2FnZS5wdXNoKFwiIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFscyB0byBcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1pbkRhdGVWYWwgIT0gbnVsbCAmJiBtYXhEYXRlVmFsID09IG51bGwgJiYgbmV3IERhdGUodGhpcy5teUZvcm0ubmF0aXZlRWxlbWVudFtNaW5Db21wb25lbnQuaWRdLnZhbHVlKSA8IG1pbkRhdGVWYWwpIHtcclxuICAgICAgdGhpcy50b2FzdHIud2FybmluZyhsYWJlbFswXSArIGVycm9yTWVzc2FnZVswXSArIGZvcm1hdERhdGUobWluRGF0ZVZhbCwgJ2RkIE1NTU0geXl5eScsICdlbi1VUycpICsgXCIuXCIpXHJcbiAgICAgIHRoaXMuZGF0ZVdyb25nID0gdHJ1ZTtcclxuICAgIH0gZWxzZSBpZiAobWF4RGF0ZVZhbCAhPSBudWxsICYmIG1pbkRhdGVWYWwgPT0gbnVsbCAmJiBuZXcgRGF0ZSh0aGlzLm15Rm9ybS5uYXRpdmVFbGVtZW50W01heENvbXBvbmVudC5pZF0udmFsdWUpID4gbWF4RGF0ZVZhbCkge1xyXG4gICAgICB0aGlzLnRvYXN0ci53YXJuaW5nKGxhYmVsWzBdICsgZXJyb3JNZXNzYWdlWzBdICsgZm9ybWF0RGF0ZShtYXhEYXRlVmFsLCAnZGQgTU1NTSB5eXl5JywgJ2VuLVVTJykgKyBcIi5cIilcclxuICAgICAgdGhpcy5kYXRlV3JvbmcgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmIChtaW5EYXRlVmFsICE9IG51bGwgJiYgbWF4RGF0ZVZhbCAhPSBudWxsKSB7XHJcbiAgICAgIGlmIChuZXcgRGF0ZSh0aGlzLm15Rm9ybS5uYXRpdmVFbGVtZW50W01heENvbXBvbmVudC5pZF0udmFsdWUpID4gbWF4RGF0ZVZhbCB8fCBuZXcgRGF0ZSh0aGlzLm15Rm9ybS5uYXRpdmVFbGVtZW50W01pbkNvbXBvbmVudC5pZF0udmFsdWUpIDwgbWluRGF0ZVZhbCkge1xyXG4gICAgICAgIHRoaXMudG9hc3RyLndhcm5pbmcobGFiZWxbMF0gKyBlcnJvck1lc3NhZ2VbMF0gKyBmb3JtYXREYXRlKG1pbkRhdGVWYWwsICdkZCBNTU1NIHl5eXknLCAnZW4tVVMnKSArIFwiIGFuZFwiICsgZXJyb3JNZXNzYWdlWzFdICsgZm9ybWF0RGF0ZShtYXhEYXRlVmFsLCAnZGQgTU1NTSB5eXl5JywgJ2VuLVVTJykgKyBcIi5cIilcclxuICAgICAgICB0aGlzLmRhdGVXcm9uZyA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5kYXRlV3JvbmcgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kYXRlV3JvbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNlbGVjdGVkT3B0aW9uKGl0ZW06IHsgS2V5OiBzdHJpbmcsIFZhbHVlOiBzdHJpbmcgfSwgY3JpdDogYW55KSB7XHJcbiAgICBjcml0LmRlc2NyID0gaXRlbS5WYWx1ZTtcclxuICAgIGNyaXQuaXNMaXN0SGlkZSA9IHRydWU7XHJcbiAgfVxyXG59XHJcbiIsIjwhLS0gQmFzaWMgZm9ybSBsYXlvdXQgc2VjdGlvbiBzdGFydCAtLT5cclxuPHNlY3Rpb24gaWQ9XCJob3Jpem9udGFsLWZvcm0tbGF5b3V0c1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgdGV4dC1sZWZ0XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBsLTMgbWItMiBtdC0yXCIgKm5nSWY9XCJjb25maWd1cmF0aW9uPy50aXRsZSAhPSB1bmRlZmluZWQgJiYgY29uZmlndXJhdGlvbj8udGl0bGUgIT0gJydcIj5cclxuICAgICAgICAgIDxoNCBjbGFzcz1cImNhcmQtdGl0bGUgdWNTZWFyY2gtdGl0bGVcIiB0cmFuc2xhdGU+e3tjb25maWd1cmF0aW9uLnRpdGxlfX08L2g0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0zXCI+XHJcbiAgICAgICAgICAgIDxmb3JtIGNsYXNzPVwiZm9ybSBmb3JtLWhvcml6b250YWxcIiBpZD1cImZvcm1TZWFyY2hcIiAjZm9ybUlkU2VhcmNoICNlbmppRm9ybT1cIm5nRm9ybVwiXHJcbiAgICAgICAgICAgICAgKG5nU3VibWl0KT1cImVuamlGb3JtLnZhbGlkICYmIHNlYXJjaENsaWNrKClcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJmb3JtLXNlY3Rpb24gZm9udC13ZWlnaHQtYm9sZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJjaGFuZ2VTdGF0ZSgpXCIgY2xhc3M9XCJidG4gbm8tcGFkZGluZyBjdXJzb3ItcG9pbnRlciBmbGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYVwiIHN0eWxlPVwiZm9udC1zaXplOiAxNXB4OyBtYXJnaW46IDBweCAwcHggNXB4IC0xNXB4O1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJpc0hpZGRlbiA/ICdmYS1jaGV2cm9uLXJpZ2h0JyA6ICdmYS1jaGV2cm9uLWRvd24nXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbmZpZ3VyYXRpb24/LnNlY3Rpb25UaXRsZSAhPSB1bmRlZmluZWQgJiYgY29uZmlndXJhdGlvbj8uc2VjdGlvblRpdGxlICE9ICcnOyB0aGVuIGlucHV0U2VjdGlvblRpdGxlIGVsc2UgZGVmYXVsdFNlY3Rpb25UaXRsZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNpbnB1dFNlY3Rpb25UaXRsZT5cclxuICAgICAgICAgICAgICAgICAgICB7e2NvbmZpZ3VyYXRpb24/LnNlY3Rpb25UaXRsZX19XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFNlY3Rpb25UaXRsZT5cclxuICAgICAgICAgICAgICAgICAgICBQYWdpbmdcclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICAgICAgICA8IS0tIEluaSBEaWd1bmFrYW4gdW50dWsgR2VuZXJhdGUgRHluYW1pYyBDb21wb25lbnQgLS0+XHJcbiAgICAgICAgICAgICAgICA8IS0tIFtoaWRkZW5dPVwiaXNIaWRkZW5cIiAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1hY3RpdmVcIiBbQGNoYW5nZURpdlNpemVdPWN1cnJlbnRTdGF0ZT5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiBmb3JtLWdyb3VwXCIgKm5nRm9yPVwibGV0IHF1ZXN0aW9uIG9mIGNvbmZpZ3VyYXRpb24/LmNvbXBvbmVudDsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTUgbm8tcGFkZGluZ1wiIGZvcj1cInt7cXVlc3Rpb24uaWR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2FkaW5zLXJlcXVpcmVkLWxhYmVsJzogKHF1ZXN0aW9uLmlzUmVxdWlyZWQgfHwgKHF1ZXN0aW9uPy5kZGxUeXBlICE9IHVuZGVmaW5lZCAmJiBxdWVzdGlvbi5kZGxUeXBlID09ICdvbmUnKSl9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZT57e3F1ZXN0aW9uLmxhYmVsfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNyBuby1wYWRkaW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlc3Rpb24udHlwZT09J3RleHRib3gnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwie3txdWVzdGlvbi5pZH19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicXVlc3Rpb24udmFsdWVcIiBbcmVxdWlyZWRdPVwicXVlc3Rpb24uaXNSZXF1aXJlZFwiIG5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLWNyaXQtZGF0YXRhYmxlPVwie3txdWVzdGlvbi5pc0NyaXRlcmlhRGF0YVRhYmxlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS1yZXF1aXJlZD1cInt7cXVlc3Rpb24uaXNSZXF1aXJlZH19XCIgdmFsdWU9XCJ7e3F1ZXN0aW9uLnZhbHVlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZWFyY2hDbGljaygpXCIgYXR0ci5kYXRhLXR5cGU9XCJ7e3F1ZXN0aW9uLmRhdGF0eXBlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS1uYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIiBhdHRyLmRhdGEtcmVzdHJpY3Rpb249XCJ7e3F1ZXN0aW9uLnJlc3RyaWN0aW9ufX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIubGFiZWw9XCJ7e3F1ZXN0aW9uLmxhYmVsfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihlbmppRm9ybS5zdWJtaXR0ZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8udG91Y2hlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy5kaXJ0eSkgJiYgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8uaW52YWxpZCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzdGlvbi50eXBlPT0ndGV4dGFyZWEnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSB0eXBlPVwidGV4dFwiIGlkPVwie3txdWVzdGlvbi5pZH19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicXVlc3Rpb24udmFsdWVcIiBbcmVxdWlyZWRdPVwicXVlc3Rpb24uaXNSZXF1aXJlZFwiIG5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLXJlcXVpcmVkPVwie3txdWVzdGlvbi5pc1JlcXVpcmVkfX1cIiBhdHRyLmRhdGEtdHlwZT1cInt7cXVlc3Rpb24uZGF0YXR5cGV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLW5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWV9fVwiIHZhbHVlPVwie3txdWVzdGlvbi52YWx1ZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmxhYmVsPVwie3txdWVzdGlvbi5sYWJlbH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZW5qaUZvcm0uc3VibWl0dGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LnRvdWNoZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8uZGlydHkpICYmIGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LmludmFsaWQgfVwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzdGlvbi50eXBlPT0nbnVtZXJpYydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cInt7cXVlc3Rpb24uaWR9fVwiIChmb2N1cyk9XCJ0cmFuc2Zvcm1Ub0RlY2ltYWwoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwidHJhbnNmb3JtVG9EZWNpbWFsKCRldmVudClcIiBjbGFzcz1cImZvcm0tY29udHJvbCBzZWFyY2gtZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJxdWVzdGlvbi52YWx1ZVwiIFtyZXF1aXJlZF09XCJxdWVzdGlvbi5pc1JlcXVpcmVkXCIgbmFtZT1cInt7cXVlc3Rpb24ubmFtZStbaV19fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLXJlcXVpcmVkPVwie3txdWVzdGlvbi5pc1JlcXVpcmVkfX1cIiB2YWx1ZT1cInt7cXVlc3Rpb24udmFsdWV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cInNlYXJjaENsaWNrKClcIiBhdHRyLmRhdGEtcmVzdHJpY3Rpb249XCJ7e3F1ZXN0aW9uLnJlc3RyaWN0aW9ufX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS10eXBlPVwie3txdWVzdGlvbi5kYXRhdHlwZX19XCIgYXR0ci5kYXRhLW5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLW51bWVyaWNwYWlyPVwie3txdWVzdGlvbi5udW1lcmljUGFpcn19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtY3JpdC1kYXRhdGFibGU9XCJ7e3F1ZXN0aW9uLmlzQ3JpdGVyaWFEYXRhVGFibGV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5sYWJlbD1cInt7cXVlc3Rpb24ubGFiZWx9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGVuamlGb3JtLnN1Ym1pdHRlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWUrW2ldXT8udG91Y2hlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWUrW2ldXT8uZGlydHkpICYmIGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZStbaV1dPy5pbnZhbGlkIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXN0aW9uLnR5cGU9PSdjdXJyZW5jeSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXN0aW9uPy5pc0N1c3RvbSAhPSB1bmRlZmluZWQgJiYgcXVlc3Rpb24/LmlzQ3VzdG9tXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJcIiBpZD1cInt7cXVlc3Rpb24uaWR9fVwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHNlYXJjaC1mb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInF1ZXN0aW9uLmlzUmVxdWlyZWRcIiBuYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cInNlYXJjaENsaWNrKClcIiBhdHRyLmRhdGEtcmVzdHJpY3Rpb249XCJ7e3F1ZXN0aW9uLnJlc3RyaWN0aW9ufX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLXR5cGU9XCJ7e3F1ZXN0aW9uLmRhdGF0eXBlfX1cIiBhdHRyLmRhdGEtbmFtZT1cInt7cXVlc3Rpb24ubmFtZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS1yZXF1aXJlZD1cInt7cXVlc3Rpb24uaXNSZXF1aXJlZH19XCIgY3VycmVuY3lNYXNrIFtuZ01vZGVsXT1cInF1ZXN0aW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicXVlc3Rpb24udmFsdWVcIiBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIubGFiZWw9XCJ7e3F1ZXN0aW9uLmxhYmVsfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwieyB0aG91c2FuZHM6IHF1ZXN0aW9uLnRob3VzYW5kcywgZGVjaW1hbDogcXVlc3Rpb24uZGVjaW1hbCwgYWxpZ246IHF1ZXN0aW9uLmFsaWduLCBhbGxvd05lZ2F0aXZlOiBxdWVzdGlvbi5hbGxvd05lZ2F0aXZlLCBhbGxvd1plcm86IHF1ZXN0aW9uLmFsbG93WmVybywgcHJlY2lzaW9uOiBxdWVzdGlvbi5wcmVjaXNpb24sIG51bGxhYmxlOiBxdWVzdGlvbi5udWxsYWJsZSB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihlbmppRm9ybS5zdWJtaXR0ZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8udG91Y2hlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy5kaXJ0eSkgJiYgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8uaW52YWxpZCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlc3Rpb24/LmlzQ3VzdG9tID09IHVuZGVmaW5lZCB8fCAhcXVlc3Rpb24/LmlzQ3VzdG9tXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJ7e3F1ZXN0aW9uLmlkfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbCBzZWFyY2gtZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJxdWVzdGlvbi5pc1JlcXVpcmVkXCIgbmFtZT1cInt7cXVlc3Rpb24ubmFtZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZWFyY2hDbGljaygpXCIgYXR0ci5kYXRhLXJlc3RyaWN0aW9uPVwie3txdWVzdGlvbi5yZXN0cmljdGlvbn19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS10eXBlPVwie3txdWVzdGlvbi5kYXRhdHlwZX19XCIgYXR0ci5kYXRhLW5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtcmVxdWlyZWQ9XCJ7e3F1ZXN0aW9uLmlzUmVxdWlyZWR9fVwiIGN1cnJlbmN5TWFzayBbbmdNb2RlbF09XCJxdWVzdGlvbi52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInF1ZXN0aW9uLnZhbHVlXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmxhYmVsPVwie3txdWVzdGlvbi5sYWJlbH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInsgdGhvdXNhbmRzOiAnLCcsIGRlY2ltYWw6ICcuJywgYWxpZ246ICdyaWdodCcsIGFsbG93TmVnYXRpdmU6IGZhbHNlLCBhbGxvd1plcm86dHJ1ZSwgcHJlY2lzaW9uOiAyLCBudWxsYWJsZTogZmFsc2UgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZW5qaUZvcm0uc3VibWl0dGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LnRvdWNoZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8uZGlydHkpICYmIGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LmludmFsaWQgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRW5kIEhhcmRjb2RlIExvb2t1cCBkaWRhbGVtLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlc3Rpb24udHlwZT09J2RhdGVwaWNrZXInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwie3txdWVzdGlvbi5pc1RpbWUgPyAnZGF0ZXRpbWUtbG9jYWwnIDogJ2RhdGUnfX1cIiBpZD1cInt7cXVlc3Rpb24uaWR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWZvcm0tY29udHJvbCBidG4tbG9va3VwXCIgbmFtZT1cInt7cXVlc3Rpb24ubmFtZStbaV19fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicXVlc3Rpb24udmFsdWVcIiBbcmVxdWlyZWRdPVwicXVlc3Rpb24uaXNSZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLXJlcXVpcmVkPVwie3txdWVzdGlvbi5pc1JlcXVpcmVkfX1cIiB2YWx1ZT1cInt7cXVlc3Rpb24udmFsdWV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInF1ZXN0aW9uLnJlYWRvbmx5XCIgYXR0ci5kYXRhLXR5cGU9XCJ7e3F1ZXN0aW9uLmRhdGF0eXBlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS1uYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS1kYXRlcGlja2VycGFpcj1cInt7cXVlc3Rpb24uZGF0ZXBpY2tlclBhaXJ9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLWNyaXQtZGF0YXRhYmxlPVwie3txdWVzdGlvbi5pc0NyaXRlcmlhRGF0YVRhYmxlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZWFyY2hDbGljaygpXCIgYXR0ci5kYXRhLXJlc3RyaWN0aW9uPVwie3txdWVzdGlvbi5yZXN0cmljdGlvbn19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmxhYmVsPVwie3txdWVzdGlvbi5sYWJlbH19XCIgbWluPVwie3txdWVzdGlvbi5taW5EYXRlIHwgZGF0ZToneXl5eS1NTS1kZCd9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4PVwie3txdWVzdGlvbi5tYXhEYXRlIHwgZGF0ZToneXl5eS1NTS1kZCd9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3Vzb3V0KT1cInF1ZXN0aW9uLnJlc3RyaWN0aW9uICE9IHVuZGVmaW5lZCAmJiBjaGVja0lucHV0RGF0ZShxdWVzdGlvbilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihlbmppRm9ybS5zdWJtaXR0ZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lK1tpXV0/LnRvdWNoZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lK1tpXV0/LmRpcnR5KSAmJiBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWUrW2ldXT8uaW52YWxpZCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJxdWVzdGlvbi50eXBlID09ICd0YXNrRGVmaW5pdGlvbktleScgfHwgcXVlc3Rpb24udHlwZSA9PSAncHJvY2Vzc0tleScgfHwgcXVlc3Rpb24udHlwZSA9PSAnb2ZmaWNlUm9sZUNvZGVzJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWV9fVwiIGF0dHIuZGF0YS1yZXF1aXJlZD1cInt7cXVlc3Rpb24uaXNSZXF1aXJlZH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicXVlc3Rpb24uaXNSZXF1aXJlZFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHNlYXJjaC1mb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIucXVlcnktaW49XCJ7e3F1ZXN0aW9uLmlzUXVlcnlJbn19XCIgYXR0ci5kYXRhLXR5cGU9XCJ7e3F1ZXN0aW9uLmRhdGF0eXBlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIubGFiZWw9XCJ7e3F1ZXN0aW9uLmxhYmVsfX1cIiBbaGlkZGVuXT1cInF1ZXN0aW9uPy5pdGVtc1VybD8ubGVuZ3RoID09IDFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiKHF1ZXN0aW9uLnR5cGUgPT0gJ3Rhc2tEZWZpbml0aW9uS2V5JyB8fCBxdWVzdGlvbi50eXBlID09ICdwcm9jZXNzS2V5JykgPyBTZXRQcm9jZXNzS2V5KGkscXVlc3Rpb24ud2ZLZXlGaWx0ZXIpIDogU2V0Um9sZU9mZmljZUNvZGVzKGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZW5qaUZvcm0uc3VibWl0dGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LnRvdWNoZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8uZGlydHkpICYmIGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LmludmFsaWQgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nSWY9XCJxdWVzdGlvbi5kZGxUeXBlID09ICdvbmUnICYmIHF1ZXN0aW9uPy5pdGVtc1VybD8ubGVuZ3RoICE9IDFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJvbmVcIj5TZWxlY3QgT25lPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIocXVlc3Rpb24/LmRkbFR5cGUgPT0gdW5kZWZpbmVkIHx8IHF1ZXN0aW9uLmRkbFR5cGUgPT0gJ2FsbCcpICYmIHF1ZXN0aW9uPy5pdGVtc1VybD8ubGVuZ3RoICE9IDFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJhbGxcIj5BbGw8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIHF1ZXN0aW9uPy5pdGVtc1VybFwiIHZhbHVlPVwie3tpdGVtLktleX19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0uVmFsdWV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsICpuZ0lmPVwicXVlc3Rpb24/Lml0ZW1zVXJsPy5sZW5ndGggPT0gMVwiPnt7cXVlc3Rpb24uaXRlbXNVcmxbMF0uVmFsdWV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzdGlvbi50eXBlPT0nZHJvcGRvd24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgbmFtZT1cInt7cXVlc3Rpb24ubmFtZX19XCIgYXR0ci5kYXRhLXJlcXVpcmVkPVwie3txdWVzdGlvbi5pc1JlcXVpcmVkfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicXVlc3Rpb24udmFsdWVcIiBbcmVxdWlyZWRdPVwicXVlc3Rpb24uaXNSZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWZvcm0tY29udHJvbFwiIGF0dHIucXVlcnktaW49XCJ7e3F1ZXN0aW9uLmlzUXVlcnlJbn19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtdHlwZT1cInt7cXVlc3Rpb24uZGF0YXR5cGV9fVwiIGF0dHIuZGF0YS1uYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIubGFiZWw9XCJ7e3F1ZXN0aW9uLmxhYmVsfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS1jcml0LWRhdGF0YWJsZT1cInt7cXVlc3Rpb24uaXNDcml0ZXJpYURhdGFUYWJsZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiFxdWVzdGlvbi5pc0Zyb21VUkwgPyBxdWVzdGlvbj8uaXRlbXM/Lmxlbmd0aCA9PSAxIDogcXVlc3Rpb24/Lml0ZW1zVXJsPy5sZW5ndGggPT0gMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJxdWVzdGlvbi5pc0V2ZW50ID8gb25DaGFuZ2VFdmVudCgkZXZlbnQudGFyZ2V0LnZhbHVlLCBxdWVzdGlvbikgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGVuamlGb3JtLnN1Ym1pdHRlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy50b3VjaGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LmRpcnR5KSAmJiBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy5pbnZhbGlkIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInF1ZXN0aW9uLmRkbFR5cGUgPT0gJ29uZScgJiYgKCFxdWVzdGlvbi5pc0Zyb21VUkwgPyBxdWVzdGlvbj8uaXRlbXM/Lmxlbmd0aCAhPSAxIDogcXVlc3Rpb24/Lml0ZW1zVXJsPy5sZW5ndGggIT0gMSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJvbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdCBPbmU8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihxdWVzdGlvbj8uZGRsVHlwZSA9PSB1bmRlZmluZWQgfHwgcXVlc3Rpb24uZGRsVHlwZSA9PSAnYWxsJykgJiYgKCFxdWVzdGlvbi5pc0Zyb21VUkwgPyBxdWVzdGlvbj8uaXRlbXM/Lmxlbmd0aCAhPSAxIDogcXVlc3Rpb24/Lml0ZW1zVXJsPy5sZW5ndGggIT0gMSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJhbGxcIj5BbGw8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mICFxdWVzdGlvbi5pc0Zyb21VUkwgPyBxdWVzdGlvbj8uaXRlbXMgOiBxdWVzdGlvbj8uaXRlbXNVcmxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJ7eyFxdWVzdGlvbi5pc0Zyb21VUkwgPyBpdGVtLmtleSA6IGl0ZW0uS2V5fX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IXF1ZXN0aW9uLmlzRnJvbVVSTCA/IGl0ZW0udmFsdWUgOiBpdGVtLlZhbHVlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXF1ZXN0aW9uLmlzRnJvbVVSTCA/IHF1ZXN0aW9uPy5pdGVtcz8ubGVuZ3RoID09IDEgOiBxdWVzdGlvbj8uaXRlbXNVcmw/Lmxlbmd0aCA9PSAxXCI+e3shcXVlc3Rpb24uaXNGcm9tVVJMXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBxdWVzdGlvbi5pdGVtc1swXS52YWx1ZSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb24uaXRlbXNVcmxbMF0uVmFsdWV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzdGlvbi50eXBlPT0nZHJvcGRvd25TZWFyY2gnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZHMtZGlzcGxheS1pdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiFxdWVzdGlvbi5pc0Zyb21VUkwgPyBxdWVzdGlvbj8uaXRlbXM/Lmxlbmd0aCA9PSAxIDogcXVlc3Rpb24/Lml0ZW1zVXJsPy5sZW5ndGggPT0gMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHNlYXJjaC1mb3JtLWNvbnRyb2wgZGRzLWlucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ7eydkZHNWYWx1ZScrcXVlc3Rpb24ubmFtZX19XCIgWyhuZ01vZGVsKV09XCJxdWVzdGlvbi5kZXNjclwiIHJlYWRvbmx5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicXVlc3Rpb24uaXNMaXN0SGlkZSA9ICFxdWVzdGlvbi5pc0xpc3RIaWRlOyBxdWVzdGlvbi5zZWFyY2hUZXh0PScnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFxdWVzdGlvbi5pc0Zyb21VUkwgPyBxdWVzdGlvbj8uaXRlbXM/Lmxlbmd0aCA9PSAxIDogcXVlc3Rpb24/Lml0ZW1zVXJsPy5sZW5ndGggPT0gMVwiPnt7cXVlc3Rpb24uZGVzY3J9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZHMtbGlzdC1jb250YWluZXJcIiBbaGlkZGVuXT1cInF1ZXN0aW9uLmlzTGlzdEhpZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBzZWFyY2gtZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ7eydzZWFyY2hUZXh0JytxdWVzdGlvbi5uYW1lfX1cIiBbKG5nTW9kZWwpXT1cInF1ZXN0aW9uLnNlYXJjaFRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInF1ZXN0aW9uLnBsYWNlaG9sZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRkcy1pdGVtcy1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmdWxsLXdpZHRoXCIgbmFtZT1cInt7cXVlc3Rpb24ubmFtZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLXJlcXVpcmVkPVwie3txdWVzdGlvbi5pc1JlcXVpcmVkfX1cIiBbKG5nTW9kZWwpXT1cInF1ZXN0aW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInF1ZXN0aW9uLmlzUmVxdWlyZWRcIiBhdHRyLnF1ZXJ5LWluPVwie3txdWVzdGlvbi5pc1F1ZXJ5SW59fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS10eXBlPVwie3txdWVzdGlvbi5kYXRhdHlwZX19XCIgYXR0ci5kYXRhLW5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIubGFiZWw9XCJ7e3F1ZXN0aW9uLmxhYmVsfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtY3JpdC1kYXRhdGFibGU9XCJ7e3F1ZXN0aW9uLmlzQ3JpdGVyaWFEYXRhVGFibGV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwicXVlc3Rpb24uaXNFdmVudCA/IG9uQ2hhbmdlRXZlbnQoJGV2ZW50LnRhcmdldC52YWx1ZSwgcXVlc3Rpb24pIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZW5qaUZvcm0uc3VibWl0dGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LnRvdWNoZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8uZGlydHkpICYmIGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LmludmFsaWQgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJ7e3F1ZXN0aW9uPy5zaXplID09IHVuZGVmaW5lZCA/IHF1ZXN0aW9uPy5zaXplIDogMTB9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIChjbGljayk9XCJzZWxlY3RlZE9wdGlvbih7S2V5OidvbmUnLFZhbHVlOidTZWxlY3QgT25lJ30scXVlc3Rpb24pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInF1ZXN0aW9uLmRkc1R5cGUgPT0gJ29uZScgJiYgKCFxdWVzdGlvbi5pc0Zyb21VUkwgPyBxdWVzdGlvbj8uaXRlbXM/Lmxlbmd0aCAhPSAxIDogcXVlc3Rpb24/Lml0ZW1zVXJsPy5sZW5ndGggIT0gMSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwib25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0IE9uZTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIChjbGljayk9XCJzZWxlY3RlZE9wdGlvbih7S2V5OidhbGwnLFZhbHVlOidBbGwnfSxxdWVzdGlvbilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKHF1ZXN0aW9uPy5kZHNUeXBlID09IHVuZGVmaW5lZCB8fCBxdWVzdGlvbi5kZHNUeXBlID09ICdhbGwnKSAmJiAoIXF1ZXN0aW9uLmlzRnJvbVVSTCA/IHF1ZXN0aW9uPy5pdGVtcz8ubGVuZ3RoICE9IDEgOiBxdWVzdGlvbj8uaXRlbXNVcmw/Lmxlbmd0aCAhPSAxKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJhbGxcIj5BbGw8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8b3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIHF1ZXN0aW9uPy5pdGVtcyB8IHRleHRTZWFyY2ggOiBxdWVzdGlvbi5zZWFyY2hUZXh0OyBsZXQgaT1pbmRleFwiIFt2YWx1ZV09XCJpdGVtPy5rZXlcIiAoY2xpY2spPVwic2VsZWN0ZWRPcHRpb24oaXRlbSxxdWVzdGlvbilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbT8udmFsdWV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mICFxdWVzdGlvbi5pc0Zyb21VUkwgPyAocXVlc3Rpb24/Lml0ZW1zIHwgdGV4dFNlYXJjaCA6IHF1ZXN0aW9uLnNlYXJjaFRleHQpIDogcXVlc3Rpb24/Lml0ZW1zVXJsIHwgdGV4dFNlYXJjaCA6IHF1ZXN0aW9uLnNlYXJjaFRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RlZE9wdGlvbihpdGVtLHF1ZXN0aW9uKVwiIHZhbHVlPVwie3tpdGVtLktleX19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLlZhbHVlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzdGlvbi50eXBlPT0nY2xhaW0nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgbmFtZT1cInt7J2NsYWltJytbaV19fVwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHNlYXJjaC1mb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS10eXBlPVwie3sndGV4dCd9fVwiIGF0dHIuZGF0YS1jcml0LWRhdGF0YWJsZT1cInt7cXVlc3Rpb24uaXNDcml0ZXJpYURhdGFUYWJsZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtbmFtZT1cInt7J0Fzc2lnbmVlJ319XCIgW2hpZGRlbl09XCJDbGFpbUxpc3Q/Lmxlbmd0aCA9PSAxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZW5qaUZvcm0uc3VibWl0dGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbJ2NsYWltJytbaV1dPy50b3VjaGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbJ2NsYWltJytbaV1dPy5kaXJ0eSkgJiYgZW5qaUZvcm0uZm9ybS5jb250cm9sc1snY2xhaW0nK1tpXV0/LmludmFsaWQgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nSWY9XCJxdWVzdGlvbi5kZGxUeXBlID09ICdvbmUnICYmIENsYWltTGlzdD8ubGVuZ3RoICE9IDFcIiB2YWx1ZT1cIm9uZVwiPlNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25lPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIocXVlc3Rpb24/LmRkbFR5cGUgPT0gdW5kZWZpbmVkIHx8IHF1ZXN0aW9uLmRkbFR5cGUgPT0gJ2FsbCcpICYmIENsYWltTGlzdD8ubGVuZ3RoICE9IDFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJhbGxcIj5BbGw8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIENsYWltTGlzdFwiIHZhbHVlPVwie3tpdGVtLktleX19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0uVmFsdWV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi11Yy1zaG93LWVycm9ycyAqbmdJZj1cInF1ZXN0aW9uLnR5cGUhPSdkYXRlcGlja2VyJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb250cm9sXT1cImVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV1cIiBbc3VibWl0XT1cImVuamlGb3JtLnN1Ym1pdHRlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWItdWMtc2hvdy1lcnJvcnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXVjLXNob3ctZXJyb3JzICpuZ0lmPVwicXVlc3Rpb24udHlwZT09J2RhdGVwaWNrZXInXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lK1tpXV1cIiBbc3VibWl0XT1cImVuamlGb3JtLnN1Ym1pdHRlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWItdWMtc2hvdy1lcnJvcnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02IGZvcm0tZ3JvdXBcIiAqbmdJZj1cIihpc1JlcG9ydCAhPSB1bmRlZmluZWQgJiYgaXNSZXBvcnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtNSBuby1wYWRkaW5nXCIgdHJhbnNsYXRlPlJlcG9ydCBUeXBlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTcgbm8tcGFkZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPVwiRXhwb3J0VHlwZVwiIFsobmdNb2RlbCldPVwiRXhwb3J0VHlwZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHNlYXJjaC1mb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtdHlwZT1cInRleHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBFeHBvcnRUeXBlTGlzdFwiIFt2YWx1ZV09XCJpdGVtLmtleVwiPnt7aXRlbS52YWx1ZX19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgbm8tcGFkZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWFjdGlvbnMgcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJleHBvcnREYXRhID09IHRydWVcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImV4cG9ydEFzWExTWCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXJhaXNlZCBidG4tc3VjY2VzcyBtci0xXCIgdHJhbnNsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZ0LWRvd25sb2FkXCI+PC9pPiZuYnNwOzxzcGFuIHRyYW5zbGF0ZT5FeHBvcnQgRXhjZWw8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJyZXNldCgpXCIgY2xhc3M9XCJidG4gYnRuLXJhaXNlZCBidG4td2FybmluZyBtci0xXCIgdHJhbnNsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRpbWVzXCI+PC9pPiZuYnNwOzxzcGFuIHRyYW5zbGF0ZT5SZXNldDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIihpc1JlcG9ydCA9PSB1bmRlZmluZWQgfHwgIWlzUmVwb3J0KVwiIHR5cGU9XCJzdWJtaXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcmFpc2VkIGJ0bi1wcmltYXJ5XCIgI1VDU2VhcmNoQ2xpY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc2VhcmNoXCI+PC9pPiZuYnNwOzxzcGFuIHRyYW5zbGF0ZT5TZWFyY2g8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIoaXNSZXBvcnQgIT0gdW5kZWZpbmVkICYmIGlzUmVwb3J0KVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiR2VuZXJhdGVSZXBvcnQoZW5qaUZvcm0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXJhaXNlZCBidG4tcHJpbWFyeVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZ0LWRvd25sb2FkXCI+PC9pPiZuYnNwOzxzcGFuIHRyYW5zbGF0ZT5HZW5lcmF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJlcG9ydDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG48YnI+XHJcbjwhLS0gLy8gQmFzaWMgZm9ybSBsYXlvdXQgc2VjdGlvbiBlbmQgLS0+Il19
1005
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWNzZWFyY2guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdWNzZWFyY2gvc3JjL2xpYi91Y3NlYXJjaC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy91Y3NlYXJjaC9zcmMvbGliL3Vjc2VhcmNoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFnQixNQUFNLGVBQWUsQ0FBQztBQUV2SSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFhLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0MsT0FBTyxFQUFFLGtCQUFrQixFQUFxQixNQUFNLGdDQUFnQyxDQUFD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OzRCQUMvQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0NBQ2xGLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDOzZCQUM5RTs0QkFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7eUJBQ3ZFO3dCQUNELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFOzRCQUM5QyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0NBQ2xGLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDOzZCQUM3RTs0QkFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7eUJBQ3RFO3FCQUNGO2lCQUNGO2dCQUNELDRIQUE0SDtn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QztJQUNuQixDQUFDO0lBRUQsY0FBYyxDQUFDLFNBQWM7UUFDM0IsSUFBSSxVQUFVLENBQUM7UUFDZixJQUFJLFVBQVUsQ0FBQztRQUNmLElBQUksS0FBSyxDQUFDO1FBQ1YsSUFBSSxZQUFZLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUV2QyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwVyxJQUFJLFlBQVksSUFBSSxTQUFTLEVBQUU7WUFDN0IsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FB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QUFPLEVBQUUsR0FBRzs2QkFDYixDQUFDLENBQUM7NEJBQ0gsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUM7Z0NBQ25CLE1BQU0sRUFBRSxLQUFLO2dDQUNiLE9BQU8sRUFBRSxHQUFHO2dDQUNaLFFBQVEsRUFBRSxRQUFROzZCQUNuQixDQUFDLENBQUM7NEJBQ0gsVUFBVSxDQUFDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQzs0QkFDOUMsVUFBVSxDQUFDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQzt5QkFDL0MsQ0FBQztxQkFDSDs7MEJBa0ZFLE1BQU07MkJBQUMsUUFBUTtvSkFyRVMsT0FBTztzQkFBakMsU0FBUzt1QkFBQyxVQUFVO2dCQU1NLE1BQU07c0JBQWhDLFNBQVM7dUJBQUMsY0FBYztnQkFDaEIsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0ksTUFBTTtzQkFBZixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEluamVjdCwgUmVuZGVyZXIyLCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwLCBOZ0Zvcm0gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IERhdGVQaXBlLCBmb3JtYXREYXRlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSW5wdXRTZWFyY2hPYmogfSBmcm9tICcuL21vZGVsL2lucHV0LXNlYXJjaC1vYmoubW9kZWwnO1xyXG5pbXBvcnQgeyBDcml0ZXJpYU9iaiB9IGZyb20gJy4vbW9kZWwvY3JpdGVyaWEtb2JqLm1vZGVsJztcclxuaW1wb3J0IHsgUmVxdWVzdENyaXRlcmlhT2JqIH0gZnJvbSAnLi9tb2RlbC9yZXF1ZXN0LWNyaXRlcmlhLW9iai5tb2RlbCc7XHJcbmltcG9ydCB7IEFkSW5zQ29uc3RhbnQgfSBmcm9tICcuL21vZGVsL2FkaW5zLWNvbnN0YW50JztcclxuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBFeGNlbFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2V4Y2VsLXNlcnZpY2UvZXhjZWwtc2VydmljZSc7XHJcbmltcG9ydCB7IHRyaWdnZXIsIHRyYW5zaXRpb24sIHN0eWxlLCBhbmltYXRlLCBzdGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5pbXBvcnQgeyBUb2FzdHJTZXJ2aWNlIH0gZnJvbSAnbmd4LXRvYXN0cic7XHJcbmltcG9ydCB7IEV4cG9ydFR5cGVDb25zdGFudCwgS2V5VmFsdWVSZXBvcnRPYmogfSBmcm9tICcuL21vZGVsL2tleS12YWx1ZS1yZXBvcnQubW9kZWwnO1xyXG5pbXBvcnQgeyBDb29raWVTZXJ2aWNlIH0gZnJvbSAnbmd4LWNvb2tpZSc7XHJcbmltcG9ydCAqIGFzIENyeXB0b0pTIGZyb20gJ2NyeXB0by1qcyc7XHJcbmltcG9ydCB7IEtleVZhbHVlVUNTZWFyY2hPYmosIExpc3RLZXlWYWx1ZU1vbnRoIH0gZnJvbSAnLi9tb2RlbC9rZXktdmFsdWUtdWMtc2VhcmNoLm1vZGVsJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLVVDU2VhcmNoJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdWNzZWFyY2guY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3Vjc2VhcmNoLmNvbXBvbmVudC5jc3MnXSxcclxuICBwcm92aWRlcnM6IFtFeGNlbFNlcnZpY2UsIERhdGVQaXBlXSxcclxuICBhbmltYXRpb25zOiBbXHJcbiAgICB0cmlnZ2VyKCdjaGFuZ2VEaXZTaXplJywgW1xyXG4gICAgICBzdGF0ZSgnaW5pdGlhbCcsIHN0eWxlKHtcclxuICAgICAgICBoZWlnaHQ6ICcqJyxcclxuICAgICAgICBvcGFjaXR5OiAnMScsXHJcbiAgICAgIH0pKSxcclxuICAgICAgc3RhdGUoJ2ZpbmFsJywgc3R5bGUoe1xyXG4gICAgICAgIGhlaWdodDogJzBweCcsXHJcbiAgICAgICAgb3BhY2l0eTogJzAnLFxyXG4gICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcclxuICAgICAgfSkpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdpbml0aWFsPT5maW5hbCcsIGFuaW1hdGUoJzMwMG1zJykpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdmaW5hbD0+aW5pdGlhbCcsIGFuaW1hdGUoJzMwMG1zJykpXHJcbiAgICBdKSxcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVQ1NlYXJjaENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIC8vIGlzTGlzdEhpZGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIC8vIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICAvLyBvbkNsaWNrKGV2OiBNb3VzZUV2ZW50KSB7XHJcbiAgLy8gICBjb25zdCBjbGlja0luc2lkZSA9IHRoaXMuZWxlbVJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2LnRhcmdldCk7XHJcbiAgLy8gICBpZiAoIWNsaWNrSW5zaWRlKSB7XHJcbiAgLy8gICAgIHRoaXMuaXNMaXN0SGlkZSA9IHRydWU7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBAVmlld0NoaWxkKCdlbmppRm9ybScpIHNldCBjb250ZW50KGNvbnRlbnQ6IE5nRm9ybSkge1xyXG4gICAgaWYgKGNvbnRlbnQpIHsgLy8gaW5pdGlhbGx5IHNldHRlciBnZXRzIGNhbGxlZCB3aXRoIHVuZGVmaW5lZFxyXG4gICAgICB0aGlzLnNlYXJjaEZvcm0gPSBjb250ZW50O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQFZpZXdDaGlsZCgnZm9ybUlkU2VhcmNoJykgbXlGb3JtOiBFbGVtZW50UmVmO1xyXG4gIEBJbnB1dCgpIHNlYXJjaElucHV0OiBJbnB1dFNlYXJjaE9iaiA9IG5ldyBJbnB1dFNlYXJjaE9iaigpO1xyXG4gIEBJbnB1dCgpIHBhZ2VTaXplOiBudW1iZXIgPSAxMDtcclxuICBASW5wdXQoKSBpc1JlcG9ydDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBPdXRwdXQoKSByZXN1bHQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBnZW5ScHQ6IEV2ZW50RW1pdHRlcjx7IEV4cG9ydFR5cGU6IG51bWJlciwgRWxSZWY6IEVsZW1lbnRSZWYgfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHsgRXhwb3J0VHlwZTogbnVtYmVyLCBFbFJlZjogRWxlbWVudFJlZiB9PigpO1xyXG4gIEBPdXRwdXQoKSByZXFHZXRBbGxEYXRhOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBFeHBvcnRUeXBlTGlzdDogQXJyYXk8S2V5VmFsdWVSZXBvcnRPYmo+ID0gW1xyXG4gICAge1xyXG4gICAgICBrZXk6IEV4cG9ydFR5cGVDb25zdGFudC5FWFBfVFlQRV9QREYsXHJcbiAgICAgIHZhbHVlOiBcIlBERlwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBrZXk6IEV4cG9ydFR5cGVDb25zdGFudC5FWFBfVFlQRV9YTFNYLFxyXG4gICAgICB2YWx1ZTogXCJFeGNlbCAyMDA3XCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGtleTogRXhwb3J0VHlwZUNvbnN0YW50LkVYUF9UWVBFX0RPQ1gsXHJcbiAgICAgIHZhbHVlOiBcIkRvY3VtZW50IFhNTFwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBrZXk6IEV4cG9ydFR5cGVDb25zdGFudC5FWFBfVFlQRV9KUERGLFxyXG4gICAgICB2YWx1ZTogXCJKdXN0aWZ5IFBERlwiXHJcbiAgICB9XHJcbiAgXTtcclxuICBMaXN0T2ZNb250aDogTGlzdEtleVZhbHVlTW9udGggPSBuZXcgTGlzdEtleVZhbHVlTW9udGgoKTtcclxuICBMaXN0T2ZZZWFyOiBBcnJheTxLZXlWYWx1ZVVDU2VhcmNoT2JqPiA9IG5ldyBBcnJheTxLZXlWYWx1ZVVDU2VhcmNoT2JqPigpO1xyXG4gIENsYWltTGlzdDogQXJyYXk8YW55PiA9IFtcclxuICAgIHtcclxuICAgICAgS2V5OiBBZEluc0NvbnN0YW50LlJlc3RyaWN0aW9uSXNOb3ROdWxsLFxyXG4gICAgICBWYWx1ZTogXCJDTEFJTUVEXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIEtleTogQWRJbnNDb25zdGFudC5SZXN0cmljdGlvbklzTnVsbCxcclxuICAgICAgVmFsdWU6IFwiVU5DTEFJTUVEXCJcclxuICAgIH0sXHJcbiAgXTtcclxuXHJcbiAgRXhwb3J0VHlwZTogbnVtYmVyID0gMDtcclxuXHJcbiAgcGFnZU5vdzogYW55ID0gMTtcclxuICBjb25maWd1cmF0aW9uOiBhbnk7XHJcbiAgZXhwb3J0RGF0YTogYW55O1xyXG4gIEV4Y2VsRGF0YTogYW55O1xyXG4gIGlzRGF0YUxvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzSGlkZGVuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQmlzRHQ6IHN0cmluZztcclxuICBCdXNpbmVzc0R0OiBEYXRlID0gbmV3IERhdGUoKTtcclxuICBkYXRlV3Jvbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICByZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzU2VhcmNoOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGN1cnJlbnRTdGF0ZSA9ICdpbml0aWFsJztcclxuXHJcbiAgZm9ybTogRm9ybUdyb3VwO1xyXG4gIGNvdW50Rm9ybSA9IDA7XHJcbiAgZm9ybWF0dGVkQW1vdW50ID0gJyc7XHJcbiAgYW1vdW50ID0gMDtcclxuICBhcGlVcmw6IHN0cmluZztcclxuICBhcnJDcml0OiBhbnk7XHJcbiAgc2VhcmNoRm9ybTogTmdGb3JtO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIHByaXZhdGUgZXhjZWxTZXJ2aWNlOiBFeGNlbFNlcnZpY2UsIHByaXZhdGUgX3JlbmRlcmVyMjogUmVuZGVyZXIyLFxyXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBfZG9jdW1lbnQsIHB1YmxpYyB0b2FzdHI6IFRvYXN0clNlcnZpY2UsIHByaXZhdGUgY29va2llU2VydmljZTogQ29va2llU2VydmljZSxcclxuICAgIHByaXZhdGUgZGF0ZVBpcGU6IERhdGVQaXBlLCBwcml2YXRlIGVsZW1SZWY6IEVsZW1lbnRSZWYpIHtcclxuICB9XHJcblxyXG4gIGNoYW5nZVN0YXRlKCkge1xyXG4gICAgdGhpcy5jdXJyZW50U3RhdGUgPSB0aGlzLmN1cnJlbnRTdGF0ZSA9PSAnaW5pdGlhbCcgPyAnZmluYWwnIDogJ2luaXRpYWwnO1xyXG4gICAgdGhpcy5pc0hpZGRlbiA9ICF0aGlzLmlzSGlkZGVuID8gdHJ1ZSA6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgbmdPbkluaXQoKSB7XHJcbiAgICBjb25zb2xlLmxvZyhcInVjc2VhcmNoXCIpO1xyXG4gICAgdGhpcy5hcGlVcmwgPSB0aGlzLnNlYXJjaElucHV0LmVudmlyb21lbnRVcmwgKyB0aGlzLnNlYXJjaElucHV0LmFwaVFyeVBhZ2luZztcclxuICAgIHRoaXMuYXJyQ3JpdCA9IHRoaXMuc2VhcmNoSW5wdXQuYXJyQ3JpdE9iajtcclxuICAgIGxldCBqcyA9IHRoaXMuX3JlbmRlcmVyMi5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcclxuICAgIGpzLnRleHQgPSBgXHJcbiAgICAgICAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAkKFwiI2ZsaXBcIikuY2xpY2soZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAkKFwiI3BhbmVsXCIpLnNsaWRlVG9nZ2xlKFwic2xvd1wiKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICBgO1xyXG4gICAgdGhpcy5fcmVuZGVyZXIyLmFwcGVuZENoaWxkKHRoaXMuX2RvY3VtZW50LmJvZHksIGpzKTtcclxuXHJcbiAgICBsZXQgdmFsdWUgPSB0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KCdCdXNpbmVzc0RhdGVSYXcnKTtcclxuICAgIHRoaXMuQmlzRHQgPSB0aGlzLkRlY3J5cHRTdHJpbmcodmFsdWUsIFwiQWRJbnNGT1UxMjM0NTY3OFwiKTtcclxuICAgIHRoaXMuQnVzaW5lc3NEdCA9IG5ldyBEYXRlKHRoaXMuQmlzRHQpO1xyXG4gICAgYXdhaXQgdGhpcy5pbml0aWF0ZUZvcm0oKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGluaXRpYXRlRm9ybSgpIHtcclxuICAgIGF3YWl0IHRoaXMuZ2V0SlNPTih0aGlzLnNlYXJjaElucHV0Ll91cmwpLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gZGF0YTtcclxuICAgICAgdGhpcy5leHBvcnREYXRhID0gZGF0YS5leHBvcnRFeGNlbDtcclxuICAgICAgaWYgKGRhdGEuZXhwb3J0VHlwZUxpc3QgIT0gdW5kZWZpbmVkICYmIGRhdGEuZXhwb3J0VHlwZUxpc3QubGVuZ3RoICE9IDApIHtcclxuICAgICAgICB0aGlzLkV4cG9ydFR5cGVMaXN0ID0gZGF0YS5leHBvcnRUeXBlTGlzdDtcclxuICAgICAgICB0aGlzLkV4cG9ydFR5cGUgPSB0aGlzLkV4cG9ydFR5cGVMaXN0WzBdLmtleTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jb3VudEZvcm0gPSBkYXRhLmNvbXBvbmVudC5sZW5ndGg7XHJcbiAgICAgIHRoaXMuaXNEYXRhTG9hZGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnRpdGxlICE9IHVuZGVmaW5lZCAmJiB0aGlzLnNlYXJjaElucHV0LnRpdGxlICE9IFwiXCIpIHtcclxuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24udGl0bGUgPSB0aGlzLnNlYXJjaElucHV0LnRpdGxlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY291bnRGb3JtOyBpKyspIHtcclxuICAgICAgICAvL2luaSBrYWxhdSBkYXRhbnlhIGRpIGxvYWQgZGFyaSBVUkxcclxuICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0uaXNGcm9tVVJMKSB7XHJcbiAgICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0Q3JpdGVyaWFPYmooKTtcclxuICAgICAgICAgIGxldCBhcnJheUNyaXQgPSBuZXcgQXJyYXkoKTtcclxuICAgICAgICAgIGxldCBjcml0ZXJpYU9iamVjdCA9IG5ldyBDcml0ZXJpYU9iaigpO1xyXG4gICAgICAgICAgY3JpdGVyaWFPYmplY3QuRGF0YVR5cGUgPSBcInRleHRcIjtcclxuICAgICAgICAgIGNyaXRlcmlhT2JqZWN0LnByb3BOYW1lID0gZGF0YS5jb21wb25lbnRbaV0uY3JpdGVyaWFQcm9wTmFtZTtcclxuICAgICAgICAgIGNyaXRlcmlhT2JqZWN0LnZhbHVlID0gZGF0YS5jb21wb25lbnRbaV0uY3JpdGVyaWFQcm9wVmFsdWU7XHJcbiAgICAgICAgICBjcml0ZXJpYU9iamVjdC5yZXN0cmljdGlvbiA9IFwiZXFcIjtcclxuICAgICAgICAgIGFycmF5Q3JpdC5wdXNoKGNyaXRlcmlhT2JqZWN0KTtcclxuICAgICAgICAgIHJlcXVlc3QuY3JpdGVyaWEgPSBhcnJheUNyaXQ7XHJcbiAgICAgICAgICByZXF1ZXN0W2RhdGEuY29tcG9uZW50W2ldLmNyaXRlcmlhUHJvcE5hbWVdID0gZGF0YS5jb21wb25lbnRbaV0uY3JpdGVyaWFQcm9wVmFsdWU7XHJcblxyXG4gICAgICAgICAgLy8gUGVuZ2VjZWthbiBwZW5nZ3VuYWFuIHVybCBhdGF1IHBhdGhcclxuICAgICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS5wYXRoICE9IHVuZGVmaW5lZCAmJiBkYXRhLmNvbXBvbmVudFtpXS5wYXRoICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQubGlzdEVudmlyb25tZW50cyAhPSB1bmRlZmluZWQgJiYgdGhpcy5zZWFyY2hJbnB1dC5saXN0RW52aXJvbm1lbnRzLmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCB0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHMubGVuZ3RoOyB5KyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS5lbnZpcm9ubWVudCA9PSB0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHNbeV0uZW52aXJvbm1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0uZnVsbHBhdGggPSB0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHNbeV0udXJsICsgZGF0YS5jb21wb25lbnRbaV0ucGF0aDtcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLmZ1bGxwYXRoID0gZGF0YS5jb21wb25lbnRbaV0udXJsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0uZnVsbHBhdGggPSBkYXRhLmNvbXBvbmVudFtpXS51cmw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvL2xlbXBhciBvYmplY3RueWEgc2VrYWxpYW4gc2FtYSB1cmxueWEsIG5udGkgZGkgYmluZCBkaSBkYWxlbSBrYXJlbmEgbWFzYWxhaCBkaSBhc3luY255YVxyXG4gICAgICAgICAgLy9iaWFyIHRpYXAgZnVuY3Rpb24gYWRhIHN0YXRlMm55YSBzZW5kaXJpXHJcbiAgICAgICAgICB0aGlzLnJlc29sdmVPYmplY3QoZGF0YS5jb21wb25lbnRbaV0sIGRhdGEuY29tcG9uZW50W2ldLmZ1bGxwYXRoLCByZXF1ZXN0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS50eXBlID09IFwibnVtZXJpY1wiKSB7XHJcbiAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSA9IHBhcnNlRmxvYXQoZGF0YS5jb21wb25lbnRbaV0udmFsdWUpLnRvTG9jYWxlU3RyaW5nKCdlbicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9wZW5nZWNla2FuIGRkbFxyXG4gICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS50eXBlID09IFwiZHJvcGRvd25cIikge1xyXG4gICAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLmR0bVR5cGUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtpXS5kdG1UeXBlLmluY2x1ZGVzKFwibW9udGhcIikpIHtcclxuICAgICAgICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0udmFsdWUgIT0gdW5kZWZpbmVkICYmIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlLmluY2x1ZGVzKFwiQkRcIikpIHtcclxuICAgICAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlID0gdGhpcy5zZXREZWZhdWx0VmFsdWVNb250aChkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLml0ZW1zID0gdGhpcy5zZXRNb250aERETChkYXRhLmNvbXBvbmVudFtpXS5kdG1UeXBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0uZHRtVHlwZS5pbmNsdWRlcyhcInllYXJcIikpIHtcclxuICAgICAgICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0udmFsdWUgIT0gdW5kZWZpbmVkICYmIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlLmluY2x1ZGVzKFwiQkRcIikpIHtcclxuICAgICAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlID0gdGhpcy5zZXREZWZhdWx0VmFsdWVZZWFyKGRhdGEuY29tcG9uZW50W2ldLnZhbHVlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0uaXRlbXMgPSB0aGlzLnNldFllYXJEREwoZGF0YS5jb21wb25lbnRbaV0uZHRtVHlwZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgKGRhdGEuY29tcG9uZW50W2ldLnR5cGUgPT0gXCJkcm9wZG93blNlYXJjaFwiICYmICFkYXRhLmNvbXBvbmVudFtpXS5pc0Zyb21VUkwgJiYgZGF0YS5jb21wb25lbnRbaV0uaXRlbXM/Lmxlbmd0aCAhPSAxKSB7XHJcbiAgICAgICAgLy8gICBpZiAoZGF0YS5jb21wb25lbnRbaV0uZGRzVHlwZSA9PSB1bmRlZmluZWQgfHwgZGF0YS5jb21wb25lbnRbaV0uZGRzVHlwZSA9PSBcImFsbFwiKSB7XHJcbiAgICAgICAgLy8gICAgIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlID0gXCJhbGxcIjtcclxuICAgICAgICAvLyAgICAgZGF0YS5jb21wb25lbnRbaV0uZGVzY3IgPSBcIkFsbFwiO1xyXG4gICAgICAgIC8vICAgfSBlbHNlIGlmIChkYXRhLmNvbXBvbmVudFtpXS5kZHNUeXBlID09IFwib25lXCIpIHtcclxuICAgICAgICAvLyAgICAgZGF0YS5jb21wb25lbnRbaV0udmFsdWUgPSBcIm9uZVwiO1xyXG4gICAgICAgIC8vICAgICBkYXRhLmNvbXBvbmVudFtpXS5kZXNjciA9IFwiU2VsZWN0IE9uZVwiO1xyXG4gICAgICAgIC8vICAgfVxyXG4gICAgICAgIC8vIH1cclxuICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0udHlwZSA9PSBcImRyb3Bkb3duU2VhcmNoXCIgJiYgIWRhdGEuY29tcG9uZW50W2ldLmlzRnJvbVVSTCAmJiBkYXRhLmNvbXBvbmVudFtpXS5pdGVtcy5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgICAgZGF0YS5jb21wb25lbnRbaV0udmFsdWUgPSBkYXRhLmNvbXBvbmVudFtpXS5pdGVtc1swXS5LZXk7XHJcbiAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS5kZXNjciA9IGRhdGEuY29tcG9uZW50W2ldLml0ZW1zWzBdLlZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0udHlwZSAhPSBcImRyb3Bkb3duU2VhcmNoXCIgJiYgIWRhdGEuY29tcG9uZW50W2ldLnZhbHVlKSB7XHJcbiAgICAgICAgICBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0uZGRsVHlwZSA9PSAnYWxsJykgZGF0YS5jb21wb25lbnRbaV0udmFsdWUgPSBcImFsbFwiO1xyXG4gICAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLmRkbFR5cGUgPT0gJ29uZScpIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlID0gXCJvbmVcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy9wZW5nZWNla2FuIHRhbmdnYWxcclxuICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0udHlwZSA9PSBcImRhdGVwaWNrZXJcIikge1xyXG4gICAgICAgICAgdGhpcy5yZWFkb25seSA9IGRhdGEuY29tcG9uZW50W2ldLnJlYWRvbmx5XHJcblxyXG4gICAgICAgICAgaWYgKGRhdGEuY29tcG9uZW50W2ldLnZhbHVlLmluY2x1ZGVzKFwiQkRcIikpIHtcclxuICAgICAgICAgICAgbGV0IGJ1c2luZXNzRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLkJpc0R0ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICBidXNpbmVzc0RhdGUgPSBuZXcgRGF0ZSh0aGlzLkJpc0R0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgb3BlcmF0b3IgPSBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZS5jaGFyQXQoMik7XHJcbiAgICAgICAgICAgIGxldCBkYXRlU2hvdyA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICAgIGlmIChvcGVyYXRvciA9PSBcIi1cIikge1xyXG4gICAgICAgICAgICAgIGxldCB0ZW1wTWludXMgPSBkYXRhLmNvbXBvbmVudFtpXS52YWx1ZS5zcGxpdChcIi1cIiwgMik7XHJcbiAgICAgICAgICAgICAgbGV0IG51bURheSA9IHBhcnNlSW50KHRlbXBNaW51c1sxXSk7XHJcbiAgICAgICAgICAgICAgYnVzaW5lc3NEYXRlLnNldERhdGUoYnVzaW5lc3NEYXRlLmdldERhdGUoKSAtIG51bURheSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAob3BlcmF0b3IgPT0gXCIrXCIpIHtcclxuICAgICAgICAgICAgICBsZXQgdGVtcE1pbnVzID0gZGF0YS5jb21wb25lbnRbaV0udmFsdWUuc3BsaXQoXCIrXCIsIDIpO1xyXG4gICAgICAgICAgICAgIGxldCBudW1EYXkgPSBwYXJzZUludCh0ZW1wTWludXNbMV0pO1xyXG4gICAgICAgICAgICAgIGJ1c2luZXNzRGF0ZS5zZXREYXRlKGJ1c2luZXNzRGF0ZS5nZXREYXRlKCkgKyBudW1EYXkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRhdGVTaG93ID0gYnVzaW5lc3NEYXRlO1xyXG4gICAgICAgICAgICBsZXQgZGF0ZVRleHQgPSBmb3JtYXREYXRlKGRhdGVTaG93LCAneXl5eS1NTS1kZCcsICdlbi1VUycpXHJcbiAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLnZhbHVlID0gZGF0ZVRleHQ7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMucmVhZG9ubHkgPSBmYWxzZSkge1xyXG4gICAgICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0ucmVzdHJpY3Rpb24gIT0gdW5kZWZpbmVkICYmIGRhdGEuY29tcG9uZW50W2ldLnJlc3RyaWN0aW9uICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbaV0ucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkdUXCIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBtaW5EYXRlID0gbmV3IERhdGUodGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZGF0YS5jb21wb25lbnRbaV0ubWluRGF0ZSwgJ3l5eXktTU0tZGQnKSk7XHJcbiAgICAgICAgICAgICAgICBtaW5EYXRlLnNldERhdGUobWluRGF0ZS5nZXREYXRlKCkgKyAxKTtcclxuICAgICAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLm1pbkRhdGUgPSBtaW5EYXRlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5jb21wb25lbnRbaV0ucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxUXCIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBtYXhEYXRlID0gbmV3IERhdGUodGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZGF0YS5jb21wb25lbnRbaV0ubWF4RGF0ZSwgJ3l5eXktTU0tZGQnKSk7XHJcbiAgICAgICAgICAgICAgICBtYXhEYXRlLnNldERhdGUobWF4RGF0ZS5nZXREYXRlKCkgLSAxKTtcclxuICAgICAgICAgICAgICAgIGRhdGEuY29tcG9uZW50W2ldLm1heERhdGUgPSBtYXhEYXRlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNvdW50Rm9ybTsgaisrKSB7XHJcbiAgICAgICAgICBpZiAoZGF0YS5jb21wb25lbnRbal0uaXNFdmVudCAmJiB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2pdLml0ZW1zVXJsLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2VFdmVudChkYXRhLmNvbXBvbmVudFtqXS5pdGVtc1VybFswXS5LZXksIGRhdGEuY29tcG9uZW50W2pdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChkYXRhLmNvbXBvbmVudFtqXS50eXBlID09IFwib2ZmaWNlUm9sZUNvZGVzXCIgJiYgdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtqXS5pdGVtc1VybC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuU2V0Um9sZU9mZmljZUNvZGVzKGopO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSwgMTAwMCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIFNldFJvbGVPZmZpY2VDb2RlcyhpOiBudW1iZXIpIHtcclxuICAgIGxldCB2YWx1ZTogc3RyaW5nID0gdGhpcy5jb29raWVTZXJ2aWNlLmdldChcIlVzZXJBY2Nlc3NcIik7XHJcbiAgICBsZXQgdXNlckFjY2Vzczogc3RyaW5nID0gSlNPTi5wYXJzZSh0aGlzLkRlY3J5cHRTdHJpbmcodmFsdWUsIFwiQWRJbnNGT1UxMjM0NTY3OFwiKSk7XHJcbiAgICBsZXQgcm9sZUNvZGU6IHN0cmluZyA9IHVzZXJBY2Nlc3NbXCJSb2xlQ29kZVwiXTtcclxuICAgIGxldCBsaXN0T2ZmaWNlUm9sZUNvZGVzOiBBcnJheTxzdHJpbmc+ID0gbmV3IEFycmF5KCk7XHJcbiAgICBsaXN0T2ZmaWNlUm9sZUNvZGVzLnB1c2gocm9sZUNvZGUpO1xyXG4gICAgbGV0IGNvbXBvbmVudCA9IHRoaXMubXlGb3JtLm5hdGl2ZUVsZW1lbnRbaV07XHJcbiAgICBsZXQgZGRsID0gY29tcG9uZW50Lm9wdGlvbnM7XHJcbiAgICBsZXQgdGV4dCA9IGRkbFtkZGwuc2VsZWN0ZWRJbmRleF0udmFsdWUudHJpbSgpO1xyXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0uaXRlbXNVcmwubGVuZ3RoID09IDEgfHwgKHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0uZGRsVHlwZSA9PSAnYWxsJyAmJiB0ZXh0ID09ICdhbGwnKSkge1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS5pdGVtc1VybC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS5pdGVtc1VybFtpbmRleF07XHJcbiAgICAgICAgbGlzdE9mZmljZVJvbGVDb2Rlcy5wdXNoKGVsZW1lbnQuS2V5KTtcclxuICAgICAgICBsaXN0T2ZmaWNlUm9sZUNvZGVzLnB1c2gocm9sZUNvZGUgKyBcIi1cIiArIGVsZW1lbnQuS2V5KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGlzdE9mZmljZVJvbGVDb2Rlcy5wdXNoKHRleHQpO1xyXG4gICAgICBsaXN0T2ZmaWNlUm9sZUNvZGVzLnB1c2gocm9sZUNvZGUgKyBcIi1cIiArIHRleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VhcmNoSW5wdXQuaW50ZWdyYXRpb25PYmoucmVxdWVzdE9ialtcIk9mZmljZVJvbGVDb2Rlc1wiXSA9IGxpc3RPZmZpY2VSb2xlQ29kZXM7XHJcbiAgfVxyXG5cclxuICBzZXREZWZhdWx0VmFsdWVNb250aCh2YWx1ZSkge1xyXG4gICAgbGV0IGJ1c2luZXNzRGF0ZSA9IG5ldyBEYXRlKHRoaXMuQnVzaW5lc3NEdCk7XHJcbiAgICBsZXQgb3BlcmF0b3IgPSB2YWx1ZS5jaGFyQXQoMik7XHJcbiAgICBsZXQgdGVtcFZhbHVlID0gdmFsdWUuc3BsaXQob3BlcmF0b3IsIDIpO1xyXG4gICAgbGV0IG51bU1vbnRoID0gcGFyc2VJbnQodGVtcFZhbHVlWzFdKTtcclxuICAgIGlmICghbnVtTW9udGgpIG51bU1vbnRoID0gMTtcclxuICAgIGlmIChvcGVyYXRvciA9PSBcIi1cIikge1xyXG4gICAgICBidXNpbmVzc0RhdGUuc2V0TW9udGgoYnVzaW5lc3NEYXRlLmdldE1vbnRoKCkgLSBudW1Nb250aCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChvcGVyYXRvciA9PSBcIitcIikge1xyXG4gICAgICBidXNpbmVzc0RhdGUuc2V0TW9udGgoYnVzaW5lc3NEYXRlLmdldE1vbnRoKCkgKyBudW1Nb250aCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnVzaW5lc3NEYXRlLmdldE1vbnRoKCk7XHJcbiAgfVxyXG4gIHNldE1vbnRoRERMKG1vbnRoKSB7XHJcbiAgICBpZiAobW9udGggPT0gXCJtb250aFwiKSByZXR1cm4gdGhpcy5MaXN0T2ZNb250aC5MaXN0T2ZNb250aDtcclxuICAgIGxldCBMaXN0T2ZNb250aDogQXJyYXk8S2V5VmFsdWVVQ1NlYXJjaE9iaj4gPSBuZXcgQXJyYXkoKTtcclxuICAgIGxldCBlcXVhdGlvbiA9IG1vbnRoLm1hdGNoKFwiW1xcXFwrXVstXXxbLV1bXFxcXCtdfFxcXFwrfC1cIik7XHJcbiAgICBsZXQgdG9NaW46IG51bWJlciA9IHRoaXMuQnVzaW5lc3NEdC5nZXRNb250aCgpO1xyXG4gICAgbGV0IHRvTWF4OiBudW1iZXIgPSB0aGlzLkJ1c2luZXNzRHQuZ2V0TW9udGgoKTtcclxuICAgIGxldCBtaW5NYXg6IG51bWJlciA9IHBhcnNlSW50KG1vbnRoLnN1YnN0cmluZyhlcXVhdGlvbi5pbmRleCArIGVxdWF0aW9uWzBdLmxlbmd0aCkpO1xyXG4gICAgaWYgKG1pbk1heCA+PSAxMikgcmV0dXJuIHRoaXMuTGlzdE9mTW9udGguTGlzdE9mTW9udGg7XHJcbiAgICBpZiAoKGVxdWF0aW9uWzBdID09IFwiKy1cIiB8fCBlcXVhdGlvblswXSA9PSBcIi0rXCIpICYmIG1pbk1heCA+PSA2KSByZXR1cm4gdGhpcy5MaXN0T2ZNb250aC5MaXN0T2ZNb250aDtcclxuICAgIGxldCBkaWN0T2ZNb250aDogeyBbbW9udGg6IG51bWJlcl06IHN0cmluZyB9ID0gdGhpcy5MaXN0T2ZNb250aC5EaWN0T2ZNb250aDtcclxuICAgIExpc3RPZk1vbnRoLnB1c2goeyBrZXk6IHRvTWluLCB2YWx1ZTogZGljdE9mTW9udGhbdG9NaW5dIH0pO1xyXG5cclxuICAgIGZvciAobGV0IHEgPSAwOyBxIDwgbWluTWF4OyBxKyspIHtcclxuICAgICAgaWYgKGVxdWF0aW9uWzBdLmluY2x1ZGVzKFwiLVwiKSkge1xyXG4gICAgICAgIHRvTWluLS07XHJcbiAgICAgICAgaWYgKHRvTWluID09IDApIHRvTWluID0gMTI7XHJcbiAgICAgICAgTGlzdE9mTW9udGgucHVzaCh7IGtleTogdG9NaW4sIHZhbHVlOiBkaWN0T2ZNb250aFt0b01pbl0gfSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGVxdWF0aW9uWzBdLmluY2x1ZGVzKFwiK1wiKSkge1xyXG4gICAgICAgIHRvTWF4Kys7XHJcbiAgICAgICAgaWYgKHRvTWF4ID09IDEzKSB0b01heCA9IDE7XHJcbiAgICAgICAgTGlzdE9mTW9udGgucHVzaCh7IGtleTogdG9NYXgsIHZhbHVlOiBkaWN0T2ZNb250aFt0b01heF0gfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIExpc3RPZk1vbnRoLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgcmV0dXJuIGEua2V5IC0gYi5rZXk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBMaXN0T2ZNb250aDtcclxuICB9XHJcblxyXG4gIHNldERlZmF1bHRWYWx1ZVllYXIodmFsdWUpIHtcclxuICAgIGxldCBidXNpbmVzc0RhdGUgPSBuZXcgRGF0ZSh0aGlzLkJ1c2luZXNzRHQpO1xyXG4gICAgbGV0IG9wZXJhdG9yID0gdmFsdWUuY2hhckF0KDIpO1xyXG4gICAgbGV0IHRlbXBWYWx1ZSA9IHZhbHVlLnNwbGl0KG9wZXJhdG9yLCAyKTtcclxuICAgIGxldCBudW1ZZWFyID0gcGFyc2VJbnQodGVtcFZhbHVlWzFdKTtcclxuICAgIGlmICghbnVtWWVhcikgbnVtWWVhciA9IDE7XHJcbiAgICBpZiAob3BlcmF0b3IgPT0gXCItXCIpIHtcclxuICAgICAgYnVzaW5lc3NEYXRlLnNldEZ1bGxZZWFyKGJ1c2luZXNzRGF0ZS5nZXRGdWxsWWVhcigpIC0gbnVtWWVhcik7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChvcGVyYXRvciA9PSBcIitcIikge1xyXG4gICAgICBidXNpbmVzc0RhdGUuc2V0RnVsbFllYXIoYnVzaW5lc3NEYXRlLmdldEZ1bGxZZWFyKCkgKyBudW1ZZWFyKTtcclxuICAgIH1cclxuICAgIHJldHVybiBidXNpbmVzc0RhdGUuZ2V0RnVsbFllYXIoKTtcclxuICB9XHJcbiAgc2V0WWVhckRETCh5ZWFyKSB7XHJcbiAgICB0aGlzLkxpc3RPZlllYXIgPSBuZXcgQXJyYXk8S2V5VmFsdWVVQ1NlYXJjaE9iaj4oKTtcclxuICAgIGxldCBlcXVhdGlvbiA9IHllYXIubWF0Y2goXCJbXFxcXCtdWy1dfFstXVtcXFxcK118XFxcXCt8LVwiKTtcclxuICAgIGxldCB0b01pbjogbnVtYmVyID0gdGhpcy5CdXNpbmVzc0R0LmdldEZ1bGxZZWFyKCk7XHJcbiAgICBsZXQgdG9NYXg6IG51bWJlciA9IHRoaXMuQnVzaW5lc3NEdC5nZXRGdWxsWWVhcigpO1xyXG4gICAgbGV0IG1pbk1heDogbnVtYmVyID0gcGFyc2VJbnQoeWVhci5zdWJzdHJpbmcoZXF1YXRpb24uaW5kZXggKyBlcXVhdGlvblswXS5sZW5ndGgpKTtcclxuICAgIHRoaXMuTGlzdE9mWWVhci5wdXNoKHsga2V5OiB0aGlzLkJ1c2luZXNzRHQuZ2V0RnVsbFllYXIoKSwgdmFsdWU6IHRoaXMuQnVzaW5lc3NEdC5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCkgfSk7XHJcblxyXG4gICAgZm9yIChsZXQgcSA9IDA7IHEgPCBtaW5NYXg7IHErKykge1xyXG4gICAgICBpZiAoZXF1YXRpb25bMF0gPT0gXCItK1wiIHx8IGVxdWF0aW9uWzBdID09IFwiKy1cIikge1xyXG4gICAgICAgIHRvTWluLS07XHJcbiAgICAgICAgdG9NYXgrKztcclxuICAgICAgICB0aGlzLkxpc3RPZlllYXIucHVzaCh7IGtleTogdG9NaW4sIHZhbHVlOiB0b01pbi50b1N0cmluZygpIH0sIHsga2V5OiB0b01heCwgdmFsdWU6IHRvTWF4LnRvU3RyaW5nKCkgfSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZXF1YXRpb25bMF0gPT0gXCItXCIpIHtcclxuICAgICAgICB0b01pbi0tO1xyXG4gICAgICAgIHRoaXMuTGlzdE9mWWVhci5wdXNoKHsga2V5OiB0b01pbiwgdmFsdWU6IHRvTWluLnRvU3RyaW5nKCkgfSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZXF1YXRpb25bMF0gPT0gXCIrXCIpIHtcclxuICAgICAgICB0b01heCsrO1xyXG4gICAgICAgIHRoaXMuTGlzdE9mWWVhci5wdXNoKHsga2V5OiB0b01heCwgdmFsdWU6IHRvTWF4LnRvU3RyaW5nKCkgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuTGlzdE9mWWVhci5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgIHJldHVybiBhLmtleSAtIGIua2V5O1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGhpcy5MaXN0T2ZZZWFyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEpTT04odXJsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBwb3N0SlNPTih1cmw6IHN0cmluZywgY3JpdGVyaWE6IGFueSA9IG51bGwpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KHVybCwgY3JpdGVyaWEpO1xyXG4gIH1cclxuXHJcbiAgc2VhcmNoQ2xpY2soSXNFeHBvcnRFeGNlbDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICBsZXQgZmlsdGVyZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbHRlcigoaXRlbSwgaSwgYXJyKSA9PlxyXG4gICAgICBhcnIuZmluZEluZGV4KCh4KSA9PiAoeC5uYW1lID09PSBpdGVtLm5hbWUpKSA9PT0gaSk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWx0ZXJlZC5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoZmlsdGVyZWRbaV0udHlwZSA9PSBcIm51bWVyaWNcIikge1xyXG4gICAgICAgIGlmKCF0aGlzLmNoZWNrVmFsdWVHdGVMdGUoZmlsdGVyZWRbaV0pKSByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgb3JkZXIgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5vcmRlcmJ5ICE9IG51bGwpIHtcclxuICAgICAgb3JkZXIgPSB7XHJcbiAgICAgICAga2V5OiB0aGlzLmNvbmZpZ3VyYXRpb24ub3JkZXJieS5rZXksXHJcbiAgICAgICAgdmFsdWU6IHRoaXMuY29uZmlndXJhdGlvbi5vcmRlcmJ5LnZhbHVlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMucGFnZU5vdyA9IDE7XHJcbiAgICBsZXQgcm93UGVyUGFnZSA9IHRoaXMucGFnZVNpemU7XHJcbiAgICBpZiAoSXNFeHBvcnRFeGNlbCkgcm93UGVyUGFnZSA9IDk5OTk7XHJcbiAgICB0aGlzLnNlYXJjaCh0aGlzLmFwaVVybCwgdGhpcy5wYWdlTm93LCByb3dQZXJQYWdlLCBvcmRlciwgdGhpcy5hcnJDcml0LCBJc0V4cG9ydEV4Y2VsKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHJlc2V0KCkge1xyXG4gICAgdGhpcy5zZWFyY2hGb3JtLnJlc2V0Rm9ybSh7XHJcbiAgICAgIEV4cG9ydFR5cGU6IHRoaXMuRXhwb3J0VHlwZUxpc3RbMF0ua2V5XHJcbiAgICB9KTtcclxuICAgIGF3YWl0IHRoaXMuaW5pdGlhdGVGb3JtKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBzZWFyY2goYXBpVXJsOiBzdHJpbmcsIHBhZ2VObzogbnVtYmVyLCByb3dQZXJQYWdlOiBudW1iZXIsIG9yZGVyQnk6IGFueSwgYWRkQ3JpdDogQ3JpdGVyaWFPYmpbXSA9IG5ldyBBcnJheSgpLCBJc0V4cG9ydEV4Y2VsOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIGxldCByZXF1ZXN0ID0gbmV3IFJlcXVlc3RDcml0ZXJpYU9iaigpO1xyXG4gICAgbGV0IGFyckNyaXQgPSBuZXcgQXJyYXkoKTtcclxuICAgIGxldCBJc1F1ZXJ5SW4gPSBmYWxzZTtcclxuICAgIGxldCBJc0JyZWFrID0gZmFsc2U7XHJcbiAgICBsZXQgYm9keUxpc3QgPSBuZXcgQXJyYXkoKTtcclxuICAgIGxldCBmaWxlTmFtZTogc3RyaW5nO1xyXG4gICAgbGV0IGJvZHlEYXRhID0gbmV3IEFycmF5KCk7XHJcbiAgICBsZXQgZGF0YUZpbGUgPSBuZXcgQXJyYXkoKTtcclxuXHJcbiAgICAvLyBJbmplY3Qgd2hlcmVRdWVyeSBmb3Igd2hlcmUgY3JpdGVyaWFcclxuICAgIGlmICh0aGlzLnNlYXJjaElucHV0LndoZXJlVmFsdWUgIT0gdW5kZWZpbmVkICYmIHRoaXMuc2VhcmNoSW5wdXQud2hlcmVWYWx1ZS5sZW5ndGggIT0gMCkge1xyXG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ucXVlcnlzdHJpbmcud2hlcmVRdWVyeSA9IG5ldyBBcnJheTxhbnk+KCk7XHJcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy5zZWFyY2hJbnB1dC53aGVyZVZhbHVlLmxlbmd0aDsgeCsrKSB7XHJcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLnF1ZXJ5c3RyaW5nLndoZXJlUXVlcnkucHVzaCh0aGlzLnNlYXJjaElucHV0LndoZXJlVmFsdWVbeF0udmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5mcm9tVmFsdWUgIT0gdW5kZWZpbmVkICYmIHRoaXMuc2VhcmNoSW5wdXQuZnJvbVZhbHVlLmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5xdWVyeXN0cmluZy5mcm9tUXVlcnkgPSBuZXcgQXJyYXk8YW55PigpO1xyXG4gICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHRoaXMuc2VhcmNoSW5wdXQuZnJvbVZhbHVlLmxlbmd0aDsgeCsrKSB7XHJcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLnF1ZXJ5c3RyaW5nLmZyb21RdWVyeS5wdXNoKHRoaXMuc2VhcmNoSW5wdXQuZnJvbVZhbHVlW3hdLnZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmVxdWVzdC5wYWdlTm8gPSBwYWdlTm87XHJcbiAgICByZXF1ZXN0LnJvd1BlclBhZ2UgPSByb3dQZXJQYWdlO1xyXG4gICAgcmVxdWVzdC5vcmRlckJ5ID0gb3JkZXJCeTtcclxuICAgIHJlcXVlc3QucXVlcnlTdHJpbmcgPSB0aGlzLmNvbmZpZ3VyYXRpb24ucXVlcnlzdHJpbmc7XHJcblxyXG4gICAgbGV0IGZvcm1TZXE6IG51bWJlciA9IC0xO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvdW50Rm9ybTsgaSsrKSB7XHJcbiAgICAgIGxldCBjcml0T2JqID0gbmV3IENyaXRlcmlhT2JqKCk7XHJcbiAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50W2ldLnR5cGUgPT0gXCJkcm9wZG93blNlYXJjaFwiKSB7XHJcbiAgICAgICAgZm9ybVNlcSArPSAzO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZvcm1TZXErKztcclxuICAgICAgfVxyXG4gICAgICBsZXQgY29tcG9uZW50ID0gdGhpcy5teUZvcm0ubmF0aXZlRWxlbWVudFtmb3JtU2VxXTtcclxuXHJcbiAgICAgIC8vIC8vIHBvcHVwIG1lc3NhZ2UgaWYgcmVxdWlyZWRcclxuICAgICAgLy8gaWYgKGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVxdWlyZWQnKSAhPSBudWxsICYmIGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVxdWlyZWQnKSA9PSBcInRydWVcIikge1xyXG4gICAgICAvLyAgIGxldCB2YWwgPSBjb21wb25lbnQudmFsdWUudHJpbSgpO1xyXG4gICAgICAvLyAgIGlmICh2YWwgPT0gXCJcIikge1xyXG4gICAgICAvLyAgICAgSXNCcmVhayA9IHRydWU7XHJcbiAgICAgIC8vICAgICBsZXQgbGFiZWwgPSBjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdsYWJlbCcpO1xyXG4gICAgICAvLyAgICAgdGhpcy50b2FzdHIud2FybmluZyhcIlBsZWFzZSBpbnB1dCBcIiArIGxhYmVsKTtcclxuICAgICAgLy8gICAgIGJyZWFrO1xyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gfVxyXG5cclxuICAgICAgY3JpdE9iai5EYXRhVHlwZSA9IGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdHlwZScpO1xyXG4gICAgICBpZiAoIWNyaXRPYmouRGF0YVR5cGUpIGNyaXRPYmouRGF0YVR5cGUgPSBcIlwiO1xyXG4gICAgICAvL0luaSBraHVzdXMga2FsYXUgZGFyaSBEcm9wIERvd25cclxuICAgICAgaWYgKGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ3F1ZXJ5LWluJykgIT0gbnVsbCAmJiBjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdxdWVyeS1pbicpID09IFwidHJ1ZVwiKSB7XHJcbiAgICAgICAgSXNRdWVyeUluID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBJc1F1ZXJ5SW4gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY29tcG9uZW50LnZhbHVlICE9IFwiXCIpIHtcclxuICAgICAgICBpZiAoY29tcG9uZW50Lm5vZGVOYW1lID09ICdTRUxFQ1QnKSB7XHJcbiAgICAgICAgICBsZXQgZGRsID0gY29tcG9uZW50Lm9wdGlvbnM7XHJcbiAgICAgICAgICBsZXQgdGV4dCA9IGRkbFtkZGwuc2VsZWN0ZWRJbmRleF0udmFsdWUudHJpbSgpO1xyXG4gICAgICAgICAgaWYgKHRleHQgPT0gXCJvbmVcIikge1xyXG4gICAgICAgICAgICBJc0JyZWFrID0gdHJ1ZTtcclxuICAgICAgICAgICAgbGV0IGxhYmVsID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnbGFiZWwnKTtcclxuICAgICAgICAgICAgdGhpcy50b2FzdHIud2FybmluZyhcIlBsZWFzZSBzZWxlY3QgXCIgKyBsYWJlbCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWNyaXQtZGF0YXRhYmxlJykgIT0gXCJcIiAmJiBjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWNyaXQtZGF0YXRhYmxlJykgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjcml0T2JqLmlzQ3JpdGVyaWFEYXRhVGFibGUgPSBjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWNyaXQtZGF0YXRhYmxlJyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnRbaV0udHlwZSA9PSBcInRhc2tEZWZpbml0aW9uS2V5XCIgfHxcclxuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS50eXBlID09IFwicHJvY2Vzc0tleVwiKVxyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudFtpXS50eXBlID09IFwiY2xhaW1cIikge1xyXG4gICAgICAgICAgICBjcml0T2JqLnByb3BOYW1lID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1uYW1lJyk7XHJcbiAgICAgICAgICAgIGNyaXRPYmoucmVzdHJpY3Rpb24gPSB0ZXh0O1xyXG4gICAgICAgICAgICBjcml0T2JqLnZhbHVlID0gbnVsbDtcclxuICAgICAgICAgICAgYXJyQ3JpdC5wdXNoKGNyaXRPYmopO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRleHQgIT0gXCJhbGxcIiAmJiB0ZXh0ICE9IFwib25lXCIpIHtcclxuICAgICAgICAgICAgICAvL0thbGF1IERhcmkgRHJvcGRvd24gdWRhaCBwYXN0aSBwYWtlIEVxXHJcbiAgICAgICAgICAgICAgY3JpdE9iai5yZXN0cmljdGlvbiA9IEFkSW5zQ29uc3RhbnQuUmVzdHJpY3Rpb25FcTtcclxuICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm5hbWUgIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgY3JpdE9iai5wcm9wTmFtZSA9IGNvbXBvbmVudC5uYW1lO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjcml0T2JqLnByb3BOYW1lID0gY29tcG9uZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1uYW1lJyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGNyaXRPYmoudmFsdWUgPSB0ZXh0O1xyXG4gICAgICAgICAgICAgIGFyckNyaXQucHVzaChjcml0T2JqKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXh0ID09IFwiYWxsXCIgJiYgSXNRdWVyeUluICYmIGNvbXBvbmVudC5vcHRpb25zLmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGRkbExpc3QgPSBuZXcgQXJyYXkoKTtcclxuICAgICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGNvbXBvbmVudC5vcHRpb25zLmxlbmd0aDsgeCsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoeCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIGRkbExpc3QucHVzaChjb21wb25lbnQub3B0aW9uc1t4XS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChkZGxMaXN0Lmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgICBjcml0T2JqLnJlc3RyaWN0aW9uID0gQWRJbnNDb25zdGFudC5SZXN0cmljdGlvbkluO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5uYW1lICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgICAgY3JpdE9iai5wcm9wTmFtZSA9IGNvbXBvbmVudC5uYW1lO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgY3JpdE9iai5wcm9wTmFtZSA9IGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbmFtZScpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY3JpdE9iai5saXN0VmFsdWUgPSBkZGxMaXN0O1xyXG4gICAgICAgICAgICAgICAgYXJyQ3JpdC5wdXNoKGNyaXRPYmopO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIC8vS2FsYXUgYWRhIFBlcmNlbnQgbWFrYSB5YW5nIGRpcGFrZSBubnRpIGFkYWxhaCBSZXN0cmljdGlvbnMgTGlrZVxyXG4gICAgICAgICAgaWYgKGNvbXBvbmVudC5uYW1lICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgY3JpdE9iai5wcm9wTmFtZSA9IGNvbXBvbmVudC5uYW1lO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY3JpdE9iai5wcm9wTmFtZSA9IGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbmFtZScpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY3JpdE9iai52YWx1ZSA9IGNvbXBvbmVudC52YWx1ZS50cmltKCk7XHJcbiAgICAgICAgICBpZiAoY29tcG9uZW50LnZhbHVlLmluY2x1ZGVzKFwiJVwiKSkge1xyXG4gICAgICAgICAgICBjcml0T2JqLnJlc3RyaWN0aW9uID0gQWRJbnNDb25zdGFudC5SZXN0cmljdGlvbkxpa2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvL2thbGF1IGNvbXBvbmVudG55YSBEYXRlLCByZXN0cmljdGlvbnNueWEgbGdzZyBhbWJpbCBkYXJpIHByb3BlcnR5IEpTT05ueWFcclxuICAgICAgICAgIGVsc2UgaWYgKGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVzdHJpY3Rpb24nKSAhPSBcIlwiICYmIGNvbXBvbmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVzdHJpY3Rpb24nKSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNyaXRPYmoucmVzdHJpY3Rpb24gPSBjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXJlc3RyaWN0aW9uJyk7XHJcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXR5cGUnKSA9PSAnbnVtZXJpYycpIHtcclxuICAgICAgICAgICAgICBjcml0T2JqLnZhbHVlID0gcGFyc2VGbG9hdChjb21wb25lbnQudmFsdWUucmVwbGFjZSgvLC9nLCAnJykpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGNyaXRPYmoucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxJS0VcIikge1xyXG4gICAgICAgICAgICAgIGNyaXRPYmoudmFsdWUgPSBcIiVcIiArIGNvbXBvbmVudC52YWx1ZS50cmltKCkgKyBcIiVcIjtcclxuICAgICAgICAgICAgICBjcml0T2JqLnJlc3RyaWN0aW9uID0gQWRJbnNDb25zdGFudC5SZXN0cmljdGlvbkxpa2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNyaXRPYmoucmVzdHJpY3Rpb24gPSBBZEluc0NvbnN0YW50LlJlc3RyaWN0aW9uRXFcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWNyaXQtZGF0YXRhYmxlJykgIT0gXCJcIiAmJiBjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWNyaXQtZGF0YXRhYmxlJykgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjcml0T2JqLmlzQ3JpdGVyaWFEYXRhVGFibGUgPSBjb21wb25lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWNyaXQtZGF0YXRhYmxlJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhcnJDcml0LnB1c2goY3JpdE9iaik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKElzQnJlYWspIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChhZGRDcml0ICE9IG51bGwgJiYgYWRkQ3JpdCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKGFkZENyaXQubGVuZ3RoICE9IDApIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZENyaXQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGFyckNyaXQucHVzaChhZGRDcml0W2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWFyY2hJbnB1dC5hZGRDcml0SW5wdXQgIT0gbnVsbCB8fCB0aGlzLnNlYXJjaElucHV0LmFkZENyaXRJbnB1dCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VhcmNoSW5wdXQuYWRkQ3JpdElucHV0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBhcnJDcml0LnB1c2godGhpcy5zZWFyY2hJbnB1dC5hZGRDcml0SW5wdXRbaV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5zZWFyY2hJbnB1dC5hZGRDcml0SW5wdXQgIT0gbnVsbCB8fCB0aGlzLnNlYXJjaElucHV0LmFkZENyaXRJbnB1dCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlYXJjaElucHV0LmFkZENyaXRJbnB1dC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGFyckNyaXQucHVzaCh0aGlzLnNlYXJjaElucHV0LmFkZENyaXRJbnB1dFtpXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXF1ZXN0LmNyaXRlcmlhID0gYXJyQ3JpdDtcclxuXHJcbiAgICByZXF1ZXN0LmludGVncmF0aW9uT2JqID0gbnVsbDtcclxuICAgIGlmICh0aGlzLnNlYXJjaElucHV0LmlzSm9pbkV4QVBJKSB7XHJcbiAgICAgIHJlcXVlc3QuaW50ZWdyYXRpb25PYmogPSB0aGlzLnNlYXJjaElucHV0LmludGVncmF0aW9uT2JqO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNTZWFyY2ggPSB0cnVlOyBcclxuXHJcbiAgICBhd2FpdCB0aGlzLmdldEpTT04odGhpcy5zZWFyY2hJbnB1dC5fdXJsKS5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIGJvZHlMaXN0ID0gZGF0YS5ib2R5TGlzdDtcclxuICAgICAgZmlsZU5hbWUgPSBkYXRhLnRpdGxlO1xyXG4gICAgfSlcclxuXHJcbiAgICB0aGlzLmh0dHAucG9zdChhcGlVcmwsIHJlcXVlc3QpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcclxuICAgICAgaWYgKElzRXhwb3J0RXhjZWwpIHtcclxuICAgICAgICBib2R5RGF0YSA9IHJlc3BvbnNlW1wiRGF0YVwiXTsgICBcclxuICAgICAgICBkYXRhRmlsZSA9IHRoaXMubWFwRGF0YUZpbGUoYm9keUxpc3QsIGJvZHlEYXRhKTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmV4Y2VsU2VydmljZS5leHBvcnRBc0V4Y2VsRmlsZShkYXRhRmlsZSwgZmlsZU5hbWUpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBsZXQgcXJ5UGFnaW5nID0ge1xyXG4gICAgICAgIHJlc3BvbnNlOiByZXNwb25zZSxcclxuICAgICAgICBwYWdlTm93OiBwYWdlTm9cclxuICAgICAgfVxyXG4gICAgICBjb25zb2xlLmxvZyhxcnlQYWdpbmcpO1xyXG4gICAgICB0aGlzLnJlc3VsdC5lbWl0KHFyeVBhZ2luZyk7XHJcbiAgICAgIHRoaXMucmVxR2V0QWxsRGF0YS5lbWl0KHJlcXVlc3QpO1xyXG4gICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNoZWNrVmFsdWVHdGVMdGUoY29tcG9uZW50KXtcclxuICAgIC8vY2VrIHlnIHBha2FpIHJlc3RyaWN0aW9uIGd0ZS9sdGUvZ3QvbHRcclxuICAgIGxldCBNaW5Db21wb25lbnQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbmQoeCA9PiB4Lm5hbWUgPT0gY29tcG9uZW50Lm5hbWUgJiYgKHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkdURVwiKSk7XHJcbiAgICBpZighTWluQ29tcG9uZW50KXtcclxuICAgICAgTWluQ29tcG9uZW50ID0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maW5kKHggPT4geC5uYW1lID09IGNvbXBvbmVudC5uYW1lICYmICh4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJHVFwiKSlcclxuICAgIH1cclxuXHJcbiAgICBsZXQgTWF4Q29tcG9uZW50ID0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maW5kKHggPT4geC5uYW1lID09IGNvbXBvbmVudC5uYW1lICYmICh4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJMVEVcIikpO1xyXG4gICAgaWYoIU1heENvbXBvbmVudCl7XHJcbiAgICAgIE1heENvbXBvbmVudCA9IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmluZCh4ID0+IHgubmFtZSA9PSBjb21wb25lbnQubmFtZSAmJiAoeC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiTFRcIikpXHJcbiAgICB9XHJcblxyXG4gICAgaWYoTWluQ29tcG9uZW50ICYmIE1heENvbXBvbmVudCl7XHJcbiAgICAgIGxldCBtaW5WYWx1ZSA9IHRoaXMubXlGb3JtLm5hdGl2ZUVsZW1lbnRbTWluQ29tcG9uZW50LmlkXS52YWx1ZUFzTnVtYmVyO1xyXG4gICAgICBsZXQgbWF4VmFsdWUgPSB0aGlzLm15Rm9ybS5uYXRpdmVFbGVtZW50W01heENvbXBvbmVudC5pZF0udmFsdWVBc051bWJlcjtcclxuICAgICAgaWYobWluVmFsdWUgPiBtYXhWYWx1ZSl7XHJcbiAgICAgICAgdGhpcy50b2FzdHIud2FybmluZyhNaW5Db21wb25lbnQubGFiZWwgKyBcIiBtdXN0IGJlIGxlc3MgdGhhbiBcIiArIE1heENvbXBvbmVudC5sYWJlbCk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBtYXBEYXRhRmlsZShib2R5TGlzdERhdGEsIGJvZHlEYXRhQXJyKVxyXG4gIHtcclxuICAgIGxldCBkYXRhRXhjZWwgPSBuZXcgQXJyYXkoKTtcclxuICAgIGxldCBib2R5RGF0YVRlbXAgPSBuZXcgQXJyYXkoKTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJvZHlMaXN0RGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZihib2R5TGlzdERhdGFbaV1bJ3R5cGUnXSAhPSAnYWN0aW9uJyl7XHJcbiAgICAgICAgYm9keURhdGFUZW1wLnB1c2goYm9keUxpc3REYXRhW2ldWydwcm9wZXJ0eSddKTtcclxuICAgICAgfSAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm9keURhdGFBcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGZpbmFsRGF0YSA9IHt9O1xyXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhib2R5RGF0YUFycltpXSkpIHtcclxuICAgICAgICAgIGlmIChib2R5RGF0YVRlbXAuaW5kZXhPZihrZXkpICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgZmluYWxEYXRhW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBkYXRhRXhjZWwucHVzaChmaW5hbERhdGEpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0YUV4Y2VsO1xyXG4gIH1cclxuXHJcbiAgR2VuZXJhdGVSZXBvcnQoZW5qaUZvcm06IE5nRm9ybSkge1xyXG4gICAgZW5qaUZvcm0uZm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICBpZighZW5qaUZvcm0uZm9ybS52YWxpZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5nZW5ScHQuZW1pdCh7IEV4cG9ydFR5cGU6IHRoaXMuRXhwb3J0VHlwZSwgRWxSZWY6IHRoaXMubXlGb3JtIH0pO1xyXG4gIH1cclxuXHJcbiAgbGVzc1RoYW5Gb3VyKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuY291bnRGb3JtID4gMykge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXNvbHZlT2JqZWN0KG9iajogYW55LCB1cmw6IHN0cmluZywgY3JpdDogUmVxdWVzdENyaXRlcmlhT2JqID0gbnVsbCkge1xyXG4gICAgY29uc3QgdmFsID0gdGhpcy5wb3N0SlNPTih1cmwsIGNyaXQpO1xyXG4gICAgdmFsLnN1YnNjcmliZSh0ZW1wRGF0YSA9PiB7XHJcbiAgICAgIG9iai5pdGVtc1VybCA9IG5ldyBBcnJheSgpO1xyXG4gICAgICBvYmouaXRlbXNVcmwgPSB0ZW1wRGF0YS5SZXR1cm5PYmplY3Q7XHJcblxyXG4gICAgICBpZiAob2JqLmV4Y2x1ZGUgIT0gdW5kZWZpbmVkICYmIG9iai5leGNsdWRlICE9IFwiXCIpIHtcclxuICAgICAgICBvYmouaXRlbXNVcmwgPSBvYmouaXRlbXNVcmwuZmlsdGVyKCh2YWx1ZSkgPT4gIW9iai5leGNsdWRlLmluY2x1ZGVzKHZhbHVlLktleSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAob2JqLnR5cGUgPT0gXCJkcm9wZG93blNlYXJjaFwiICYmIG9iai5pdGVtc1VybC5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgIG9iai52YWx1ZSA9IG9iai5pdGVtc1VybFswXS5LZXk7XHJcbiAgICAgICAgb2JqLmRlc2NyID0gb2JqLml0ZW1zVXJsWzBdLlZhbHVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChvYmouYWZmZWN0ZWRGaWx0ZXIgJiYgb2JqLml0ZW1zVXJsLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZUV2ZW50KG9iai5pdGVtc1VybFswXS5LZXksIG9iaik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdHJhbnNmb3JtVG9EZWNpbWFsKGVsZW1lbnQ6IGFueSkge1xyXG4gICAgZWxlbWVudC50YXJnZXQudmFsdWUgPSBwYXJzZUZsb2F0KGVsZW1lbnQudGFyZ2V0LnZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvLC9nLCAnJykpO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0QXNYTFNYKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWFyY2hDbGljayh0cnVlKTtcclxuICAgIC8vIGxldCByZXF1ZXN0ID0gbmV3IFJlcXVlc3RDcml0ZXJpYU9iaigpO1xyXG4gICAgLy8gcmVxdWVzdC5wYWdlTm8gPSAxO1xyXG4gICAgLy8gcmVxdWVzdC5yb3dQZXJQYWdlID0gOTk5OTtcclxuICAgIC8vIHJlcXVlc3Qub3JkZXJCeSA9IG51bGw7XHJcbiAgICAvLyByZXF1ZXN0LmNyaXRlcmlhID0gW107XHJcbiAgICAvLyByZXF1ZXN0LnF1ZXJ5U3RyaW5nID0gdGhpcy5jb25maWd1cmF0aW9uLnF1ZXJ5c3RyaW5nO1xyXG4gICAgLy8gaWYgKCF0aGlzLnNlYXJjaElucHV0LmlzSm9pbkV4QVBJKSB7XHJcbiAgICAvLyAgIHJlcXVlc3QuaW50ZWdyYXRpb25PYmogPSBudWxsO1xyXG4gICAgLy8gfSBlbHNlIHtcclxuICAgIC8vICAgcmVxdWVzdC5pbnRlZ3JhdGlvbk9iaiA9IHRoaXMuc2VhcmNoSW5wdXQuaW50ZWdyYXRpb25PYmo7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gdGhpcy5odHRwLnBvc3QodGhpcy5hcGlVcmwsIHJlcXVlc3QpLnN1YnNjcmliZShcclxuICAgIC8vICAgcmVzcG9uc2UgPT4ge1xyXG4gICAgLy8gICAgIHRoaXMuRXhjZWxEYXRhID0gcmVzcG9uc2VbXCJEYXRhXCJdO1xyXG4gICAgLy8gICAgIHRoaXMuZXhjZWxTZXJ2aWNlLmV4cG9ydEFzRXhjZWxGaWxlKHRoaXMuRXhjZWxEYXRhLCAnc2FtcGxlJyk7XHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIChlcnJvcikgPT4ge1xyXG4gICAgLy8gICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgIC8vICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZUV2ZW50KG9wdFZhbHVlLCBhZkZpbHRlcikge1xyXG4gICAgbGV0IGpzb25Db21wID0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudDtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFmRmlsdGVyLmFmZmVjdGVkRmlsdGVyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwganNvbkNvbXAubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICBpZiAoanNvbkNvbXBbal0ubmFtZSA9PSBhZkZpbHRlci5hZmZlY3RlZEZpbHRlcltpXSkge1xyXG4gICAgICAgICAgbGV0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdENyaXRlcmlhT2JqKCk7XHJcbiAgICAgICAgICBsZXQgYXJyYXlDcml0ID0gbmV3IEFycmF5KCk7XHJcblxyXG4gICAgICAgICAgaWYgKG9wdFZhbHVlICE9IFwiYWxsXCIgJiYgb3B0VmFsdWUgIT0gXCJvbmVcIikge1xyXG4gICAgICAgICAgICBsZXQgY3JpdE9iaiA9IG5ldyBDcml0ZXJpYU9iaigpO1xyXG4gICAgICAgICAgICBjcml0T2JqLkRhdGFUeXBlID0gYWZGaWx0ZXIuZGF0YXR5cGU7XHJcbiAgICAgICAgICAgIGlmIChhZkZpbHRlci5maWx0ZXJQcm9wTmFtZSAhPSB1bmRlZmluZWQgfHwgYWZGaWx0ZXIuZmlsdGVyUHJvcE5hbWUgIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgIHJlcXVlc3RbYWZGaWx0ZXIuZmlsdGVyUHJvcE5hbWVdID0gb3B0VmFsdWU7XHJcbiAgICAgICAgICAgICAgY3JpdE9iai5wcm9wTmFtZSA9IGFmRmlsdGVyLmZpbHRlclByb3BOYW1lO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNyaXRPYmoucHJvcE5hbWUgPSBhZkZpbHRlci5uYW1lO1xyXG4gICAgICAgICAgICAgIHJlcXVlc3RbYWZGaWx0ZXIubmFtZV0gPSBvcHRWYWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjcml0T2JqLnZhbHVlID0gb3B0VmFsdWU7XHJcbiAgICAgICAgICAgIGNyaXRPYmoucmVzdHJpY3Rpb24gPSBBZEluc0NvbnN0YW50LlJlc3RyaWN0aW9uRXE7XHJcbiAgICAgICAgICAgIGFycmF5Q3JpdC5wdXNoKGNyaXRPYmopO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmVxdWVzdC5jcml0ZXJpYSA9IGFycmF5Q3JpdDtcclxuICAgICAgICAgIGlmIChqc29uQ29tcFtqXS5wYXRoICE9IHVuZGVmaW5lZCAmJiBqc29uQ29tcFtqXS5wYXRoICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQubGlzdEVudmlyb25tZW50cyAhPSB1bmRlZmluZWQgJiYgdGhpcy5zZWFyY2hJbnB1dC5saXN0RW52aXJvbm1lbnRzLmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCB0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHMubGVuZ3RoOyB5KyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChqc29uQ29tcFtqXS5lbnZpcm9ubWVudCA9PSB0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHNbeV0uZW52aXJvbm1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAganNvbkNvbXBbal0uZnVsbHBhdGggPSB0aGlzLnNlYXJjaElucHV0Lmxpc3RFbnZpcm9ubWVudHNbeV0udXJsICsganNvbkNvbXBbal0ucGF0aDtcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGpzb25Db21wW2pdLmZ1bGxwYXRoID0ganNvbkNvbXBbal0udXJsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAganNvbkNvbXBbal0uZnVsbHBhdGggPSBqc29uQ29tcFtqXS51cmw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnJlc29sdmVPYmplY3QoanNvbkNvbXBbal0sIGpzb25Db21wW2pdLmZ1bGxwYXRoLCByZXF1ZXN0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIFNldFByb2Nlc3NLZXkoaWR4OiBudW1iZXIsIHdmS2V5RmlsdGVyOiBzdHJpbmcpIHtcclxuICAgIGxldCBjb21wb25lbnQgPSB0aGlzLm15Rm9ybS5uYXRpdmVFbGVtZW50W2lkeF07XHJcbiAgICBsZXQgZGRsID0gY29tcG9uZW50Lm9wdGlvbnM7XHJcbiAgICBsZXQgdGV4dDogc3RyaW5nID0gZGRsW2RkbC5zZWxlY3RlZEluZGV4XS52YWx1ZS50cmltKCk7XHJcbiAgICBsZXQgbGlzdFZhbHVlID0gdGV4dC5zcGxpdCgnOycpO1xyXG4gICAgbGV0IGxpc3RXZktleSA9IHdmS2V5RmlsdGVyLnNwbGl0KCc7Jyk7XHJcbiAgICBcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdFZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoSW5wdXQuaW50ZWdyYXRpb25PYmoucmVxdWVzdE9ialtsaXN0V2ZLZXlbaV1dID0gbGlzdFZhbHVlW2ldO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgfVxyXG5cclxuICBzd2l0Y2hDYXNlKGNvbmRMaXN0KSB7XHJcbiAgICBsZXQgY29uZGl0aW9uID0gZmFsc2U7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25kTGlzdC5jb25kaXRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBpZHggPSB0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlLmZpbmRJbmRleCh4ID0+IHgucHJvcGVydHkgPT0gY29uZExpc3QuY29uZGl0aW9uc1tpXS5wcm9wZXJ0eSk7XHJcbiAgICAgIGlmIChjb25kTGlzdC5jb25kaXRpb25zW2ldLnJlc3RyaWN0aW9uID09IFwiRVFcIikge1xyXG4gICAgICAgIGlmICghY29uZExpc3QuY29uZGl0aW9uc1tpXS5pc1VzZXIpIHtcclxuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgPT0gY29uZExpc3QuY29uZGl0aW9uc1tpXS52YWx1ZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgdXNlcm5hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlVzZXJuYW1lXCIpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSA9PSB1c2VybmFtZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChjb25kTGlzdC5jb25kaXRpb25zW2ldLnJlc3RyaWN0aW9uID09IFwiTkVRXCIpIHtcclxuICAgICAgICBpZiAoY29uZExpc3QuY29uZGl0aW9uc1tpXS5pc1VzZXIgIT0gdHJ1ZSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSAhPSBjb25kTGlzdC5jb25kaXRpb25zW2ldLnZhbHVlKSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxldCB1c2VybmFtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiVXNlcm5hbWVcIik7XHJcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZVtpZHhdLnZhbHVlICE9IHVzZXJuYW1lKSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0ucmVzdHJpY3Rpb24gPT0gXCJHVFwiKSB7XHJcbiAgICAgICAgaWYgKCFjb25kTGlzdC5jb25kaXRpb25zW2ldLmlzVXNlcikge1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSA+IGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0udmFsdWUpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHVzZXJuYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJVc2VybmFtZVwiKTtcclxuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgPiB1c2VybmFtZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChjb25kTGlzdC5jb25kaXRpb25zW2ldLnJlc3RyaWN0aW9uID09IFwiR1RFXCIpIHtcclxuICAgICAgICBpZiAoIWNvbmRMaXN0LmNvbmRpdGlvbnNbaV0uaXNVc2VyKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZVtpZHhdLnZhbHVlID49IGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0udmFsdWUpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbGV0IHVzZXJuYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJVc2VybmFtZVwiKTtcclxuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgPj0gdXNlcm5hbWUpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoY29uZExpc3QuY29uZGl0aW9uc1tpXS5yZXN0cmljdGlvbiA9PSBcIkxUXCIpIHtcclxuICAgICAgICBpZiAoIWNvbmRMaXN0LmNvbmRpdGlvbnNbaV0uaXNVc2VyKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5zZWFyY2hJbnB1dC5zd2l0Y2hWYWx1ZVtpZHhdLnZhbHVlIDwgY29uZExpc3QuY29uZGl0aW9uc1tpXS52YWx1ZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgdXNlcm5hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlVzZXJuYW1lXCIpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSA8IHVzZXJuYW1lKSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGNvbmRMaXN0LmNvbmRpdGlvbnNbaV0ucmVzdHJpY3Rpb24gPT0gXCJMVEVcIikge1xyXG4gICAgICAgIGlmICghY29uZExpc3QuY29uZGl0aW9uc1tpXS5pc1VzZXIpIHtcclxuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaElucHV0LnN3aXRjaFZhbHVlW2lkeF0udmFsdWUgPD0gY29uZExpc3QuY29uZGl0aW9uc1tpXS52YWx1ZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgdXNlcm5hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlVzZXJuYW1lXCIpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQuc3dpdGNoVmFsdWVbaWR4XS52YWx1ZSA8PSB1c2VybmFtZSkge1xyXG4gICAgICAgICAgICBjb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvbmRpdGlvbjtcclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIERlY3J5cHRTdHJpbmcoY2hpcHBlclRleHQ6IHN0cmluZywgY2hpcHBlcktleTogc3RyaW5nKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIGNoaXBwZXJLZXkgPT0gdW5kZWZpbmVkIHx8IGNoaXBwZXJLZXkudHJpbSgpID09ICcnIHx8XHJcbiAgICAgIGNoaXBwZXJUZXh0ID09IHVuZGVmaW5lZCB8fCBjaGlwcGVyVGV4dC50cmltKCkgPT0gJydcclxuICAgICkgcmV0dXJuIGNoaXBwZXJUZXh0O1xyXG4gICAgbGV0IGNoaXBwZXJLZXlBcnIgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZShjaGlwcGVyS2V5KTtcclxuICAgIGxldCBpdiA9IENyeXB0b0pTLmxpYi5Xb3JkQXJyYXkuY3JlYXRlKFsweDAwLCAweDAwLCAweDAwLCAweDAwXSk7XHJcbiAgICBsZXQgZGVjcnlwdGVkID0gQ3J5cHRvSlMuQUVTLmRlY3J5cHQoY2hpcHBlclRleHQsIGNoaXBwZXJLZXlBcnIsIHsgaXY6IGl2IH0pO1xyXG4gICAgbGV0IHBsYWluVGV4dCA9IGRlY3J5cHRlZC50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7XHJcbiAgICByZXR1cm4gcGxhaW5UZXh0O1xyXG4gIH1cclxuXHJcbiAgY2hlY2tJbnB1dERhdGUoY29tcG9uZW50OiBhbnkpIHtcclxuICAgIGxldCBtaW5EYXRlVmFsO1xyXG4gICAgbGV0IG1heERhdGVWYWw7XHJcbiAgICBsZXQgbGFiZWw7XHJcbiAgICBsZXQgZXJyb3JNZXNzYWdlID0gbmV3IEFycmF5PHN0cmluZz4oKTtcclxuXHJcbiAgICBsZXQgTWluQ29tcG9uZW50ID0gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maW5kKHggPT4geC5uYW1lID09IGNvbXBvbmVudC5uYW1lICYmICh4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJHVEVcIikpID09IHVuZGVmaW5lZCA/IHRoaXMuY29uZmlndXJhdGlvbi5jb21wb25lbnQuZmluZCh4ID0+IHgubmFtZSA9PSBjb21wb25lbnQubmFtZSAmJiAoeC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiR1RcIikpIDogdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maW5kKHggPT4geC5uYW1lID09IGNvbXBvbmVudC5uYW1lICYmICh4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJHVEVcIikpO1xyXG4gICAgaWYgKE1pbkNvbXBvbmVudCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgbWluRGF0ZVZhbCA9IHRoaXMubXlGb3JtLm5hdGl2ZUVsZW1lbnRbTWluQ29tcG9uZW50LmlkXS5taW4gPT0gXCJcIiA/IG51bGwgOiBuZXcgRGF0ZSh0aGlzLm15Rm9ybS5uYXRpdmVFbGVtZW50W01pbkNvbXBvbmVudC5pZF0ubWluKTtcclxuICAgICAgbGFiZWwgPSBNaW5Db21wb25lbnQubGFiZWwuc3BsaXQoXCI+XCIsIDIpO1xyXG4gICAgICBpZiAobWluRGF0ZVZhbCAhPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKE1pbkNvbXBvbmVudC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiR1RcIikge1xyXG4gICAgICAgICAgbWluRGF0ZVZhbC5zZXREYXRlKG1pbkRhdGVWYWwuZ2V0RGF0ZSgpIC0gMSk7XHJcbiAgICAgICAgICBlcnJvck1lc3NhZ2UucHVzaChcIiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBcIik7XHJcbiAgICAgICAgfSBlbHNlIGlmIChNaW5Db21wb25lbnQucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkdURVwiKSB7XHJcbiAgICAgICAgICBlcnJvck1lc3NhZ2UucHVzaChcIiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbHMgdG8gXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBNYXhDb21wb25lbnQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbmQoeCA9PiB4Lm5hbWUgPT0gY29tcG9uZW50Lm5hbWUgJiYgKHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxURVwiKSkgPT0gdW5kZWZpbmVkID8gdGhpcy5jb25maWd1cmF0aW9uLmNvbXBvbmVudC5maW5kKHggPT4geC5uYW1lID09IGNvbXBvbmVudC5uYW1lICYmICh4LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJMVFwiKSkgOiB0aGlzLmNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmZpbmQoeCA9PiB4Lm5hbWUgPT0gY29tcG9uZW50Lm5hbWUgJiYgKHgucmVzdHJpY3Rpb24udG9VcHBlckNhc2UoKSA9PSBcIkxURVwiKSk7XHJcbiAgICBpZiAoTWF4Q29tcG9uZW50ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICBtYXhEYXRlVmFsID0gdGhpcy5teUZvcm0ubmF0aXZlRWxlbWVudFtNYXhDb21wb25lbnQuaWRdLm1heCA9PSBcIlwiID8gbnVsbCA6IG5ldyBEYXRlKHRoaXMubXlGb3JtLm5hdGl2ZUVsZW1lbnRbTWF4Q29tcG9uZW50LmlkXS5tYXgpO1xyXG4gICAgICBsYWJlbCA9IE1heENvbXBvbmVudC5sYWJlbC5zcGxpdChcIjxcIiwgMik7XHJcbiAgICAgIGlmIChtYXhEYXRlVmFsICE9IG51bGwpIHtcclxuICAgICAgICBpZiAoTWF4Q29tcG9uZW50LnJlc3RyaWN0aW9uLnRvVXBwZXJDYXNlKCkgPT0gXCJMVFwiKSB7XHJcbiAgICAgICAgICBtYXhEYXRlVmFsLnNldERhdGUobWF4RGF0ZVZhbC5nZXREYXRlKCkgKyAxKTtcclxuICAgICAgICAgIGVycm9yTWVzc2FnZS5wdXNoKFwiIG11c3QgYmUgbGVzcyB0aGFuIFwiKTtcclxuICAgICAgICB9IGVsc2UgaWYgKE1heENvbXBvbmVudC5yZXN0cmljdGlvbi50b1VwcGVyQ2FzZSgpID09IFwiTFRFXCIpIHtcclxuICAgICAgICAgIGVycm9yTWVzc2FnZS5wdXNoKFwiIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFscyB0byBcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1pbkRhdGVWYWwgIT0gbnVsbCAmJiBtYXhEYXRlVmFsID09IG51bGwgJiYgbmV3IERhdGUodGhpcy5teUZvcm0ubmF0aXZlRWxlbWVudFtNaW5Db21wb25lbnQuaWRdLnZhbHVlKSA8IG1pbkRhdGVWYWwpIHtcclxuICAgICAgdGhpcy50b2FzdHIud2FybmluZyhsYWJlbFswXSArIGVycm9yTWVzc2FnZVswXSArIGZvcm1hdERhdGUobWluRGF0ZVZhbCwgJ2RkIE1NTU0geXl5eScsICdlbi1VUycpICsgXCIuXCIpXHJcbiAgICAgIHRoaXMuZGF0ZVdyb25nID0gdHJ1ZTtcclxuICAgIH0gZWxzZSBpZiAobWF4RGF0ZVZhbCAhPSBudWxsICYmIG1pbkRhdGVWYWwgPT0gbnVsbCAmJiBuZXcgRGF0ZSh0aGlzLm15Rm9ybS5uYXRpdmVFbGVtZW50W01heENvbXBvbmVudC5pZF0udmFsdWUpID4gbWF4RGF0ZVZhbCkge1xyXG4gICAgICB0aGlzLnRvYXN0ci53YXJuaW5nKGxhYmVsWzBdICsgZXJyb3JNZXNzYWdlWzBdICsgZm9ybWF0RGF0ZShtYXhEYXRlVmFsLCAnZGQgTU1NTSB5eXl5JywgJ2VuLVVTJykgKyBcIi5cIilcclxuICAgICAgdGhpcy5kYXRlV3JvbmcgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmIChtaW5EYXRlVmFsICE9IG51bGwgJiYgbWF4RGF0ZVZhbCAhPSBudWxsKSB7XHJcbiAgICAgIGlmIChuZXcgRGF0ZSh0aGlzLm15Rm9ybS5uYXRpdmVFbGVtZW50W01heENvbXBvbmVudC5pZF0udmFsdWUpID4gbWF4RGF0ZVZhbCB8fCBuZXcgRGF0ZSh0aGlzLm15Rm9ybS5uYXRpdmVFbGVtZW50W01pbkNvbXBvbmVudC5pZF0udmFsdWUpIDwgbWluRGF0ZVZhbCkge1xyXG4gICAgICAgIHRoaXMudG9hc3RyLndhcm5pbmcobGFiZWxbMF0gKyBlcnJvck1lc3NhZ2VbMF0gKyBmb3JtYXREYXRlKG1pbkRhdGVWYWwsICdkZCBNTU1NIHl5eXknLCAnZW4tVVMnKSArIFwiIGFuZFwiICsgZXJyb3JNZXNzYWdlWzFdICsgZm9ybWF0RGF0ZShtYXhEYXRlVmFsLCAnZGQgTU1NTSB5eXl5JywgJ2VuLVVTJykgKyBcIi5cIilcclxuICAgICAgICB0aGlzLmRhdGVXcm9uZyA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5kYXRlV3JvbmcgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kYXRlV3JvbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNlbGVjdGVkT3B0aW9uKGl0ZW06IHsgS2V5OiBzdHJpbmcsIFZhbHVlOiBzdHJpbmcgfSwgY3JpdDogYW55KSB7XHJcbiAgICBjcml0LmRlc2NyID0gaXRlbS5WYWx1ZTtcclxuICAgIGNyaXQuaXNMaXN0SGlkZSA9IHRydWU7XHJcbiAgfVxyXG59XHJcbiIsIjwhLS0gQmFzaWMgZm9ybSBsYXlvdXQgc2VjdGlvbiBzdGFydCAtLT5cclxuPHNlY3Rpb24gaWQ9XCJob3Jpem9udGFsLWZvcm0tbGF5b3V0c1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgdGV4dC1sZWZ0XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBsLTMgbWItMiBtdC0yXCIgKm5nSWY9XCJjb25maWd1cmF0aW9uPy50aXRsZSAhPSB1bmRlZmluZWQgJiYgY29uZmlndXJhdGlvbj8udGl0bGUgIT0gJydcIj5cclxuICAgICAgICAgIDxoNCBjbGFzcz1cImNhcmQtdGl0bGUgdWNTZWFyY2gtdGl0bGVcIiB0cmFuc2xhdGU+e3tjb25maWd1cmF0aW9uLnRpdGxlfX08L2g0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0zXCI+XHJcbiAgICAgICAgICAgIDxmb3JtIGNsYXNzPVwiZm9ybSBmb3JtLWhvcml6b250YWxcIiBpZD1cImZvcm1TZWFyY2hcIiAjZm9ybUlkU2VhcmNoICNlbmppRm9ybT1cIm5nRm9ybVwiXHJcbiAgICAgICAgICAgICAgKG5nU3VibWl0KT1cImVuamlGb3JtLnZhbGlkICYmIHNlYXJjaENsaWNrKClcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJmb3JtLXNlY3Rpb24gZm9udC13ZWlnaHQtYm9sZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJjaGFuZ2VTdGF0ZSgpXCIgY2xhc3M9XCJidG4gbm8tcGFkZGluZyBjdXJzb3ItcG9pbnRlciBmbGlwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYVwiIHN0eWxlPVwiZm9udC1zaXplOiAxNXB4OyBtYXJnaW46IDBweCAwcHggNXB4IC0xNXB4O1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJpc0hpZGRlbiA/ICdmYS1jaGV2cm9uLXJpZ2h0JyA6ICdmYS1jaGV2cm9uLWRvd24nXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbmZpZ3VyYXRpb24/LnNlY3Rpb25UaXRsZSAhPSB1bmRlZmluZWQgJiYgY29uZmlndXJhdGlvbj8uc2VjdGlvblRpdGxlICE9ICcnOyB0aGVuIGlucHV0U2VjdGlvblRpdGxlIGVsc2UgZGVmYXVsdFNlY3Rpb25UaXRsZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNpbnB1dFNlY3Rpb25UaXRsZT5cclxuICAgICAgICAgICAgICAgICAgICB7e2NvbmZpZ3VyYXRpb24/LnNlY3Rpb25UaXRsZX19XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFNlY3Rpb25UaXRsZT5cclxuICAgICAgICAgICAgICAgICAgICBQYWdpbmdcclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICAgICAgICA8IS0tIEluaSBEaWd1bmFrYW4gdW50dWsgR2VuZXJhdGUgRHluYW1pYyBDb21wb25lbnQgLS0+XHJcbiAgICAgICAgICAgICAgICA8IS0tIFtoaWRkZW5dPVwiaXNIaWRkZW5cIiAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1hY3RpdmVcIiBbQGNoYW5nZURpdlNpemVdPWN1cnJlbnRTdGF0ZT5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiBmb3JtLWdyb3VwXCIgKm5nRm9yPVwibGV0IHF1ZXN0aW9uIG9mIGNvbmZpZ3VyYXRpb24/LmNvbXBvbmVudDsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTUgbm8tcGFkZGluZ1wiIGZvcj1cInt7cXVlc3Rpb24uaWR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2FkaW5zLXJlcXVpcmVkLWxhYmVsJzogKHF1ZXN0aW9uLmlzUmVxdWlyZWQgfHwgKHF1ZXN0aW9uPy5kZGxUeXBlICE9IHVuZGVmaW5lZCAmJiBxdWVzdGlvbi5kZGxUeXBlID09ICdvbmUnKSl9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZT57e3F1ZXN0aW9uLmxhYmVsfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNyBuby1wYWRkaW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlc3Rpb24udHlwZT09J3RleHRib3gnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwie3txdWVzdGlvbi5pZH19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicXVlc3Rpb24udmFsdWVcIiBbcmVxdWlyZWRdPVwicXVlc3Rpb24uaXNSZXF1aXJlZFwiIG5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLWNyaXQtZGF0YXRhYmxlPVwie3txdWVzdGlvbi5pc0NyaXRlcmlhRGF0YVRhYmxlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS1yZXF1aXJlZD1cInt7cXVlc3Rpb24uaXNSZXF1aXJlZH19XCIgdmFsdWU9XCJ7e3F1ZXN0aW9uLnZhbHVlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZWFyY2hDbGljaygpXCIgYXR0ci5kYXRhLXR5cGU9XCJ7e3F1ZXN0aW9uLmRhdGF0eXBlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS1uYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIiBhdHRyLmRhdGEtcmVzdHJpY3Rpb249XCJ7e3F1ZXN0aW9uLnJlc3RyaWN0aW9ufX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIubGFiZWw9XCJ7e3F1ZXN0aW9uLmxhYmVsfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihlbmppRm9ybS5zdWJtaXR0ZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8udG91Y2hlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy5kaXJ0eSkgJiYgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8uaW52YWxpZCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzdGlvbi50eXBlPT0ndGV4dGFyZWEnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSB0eXBlPVwidGV4dFwiIGlkPVwie3txdWVzdGlvbi5pZH19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicXVlc3Rpb24udmFsdWVcIiBbcmVxdWlyZWRdPVwicXVlc3Rpb24uaXNSZXF1aXJlZFwiIG5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLXJlcXVpcmVkPVwie3txdWVzdGlvbi5pc1JlcXVpcmVkfX1cIiBhdHRyLmRhdGEtdHlwZT1cInt7cXVlc3Rpb24uZGF0YXR5cGV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLW5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWV9fVwiIHZhbHVlPVwie3txdWVzdGlvbi52YWx1ZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmxhYmVsPVwie3txdWVzdGlvbi5sYWJlbH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZW5qaUZvcm0uc3VibWl0dGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LnRvdWNoZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8uZGlydHkpICYmIGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LmludmFsaWQgfVwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzdGlvbi50eXBlPT0nbnVtZXJpYydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cInt7cXVlc3Rpb24uaWR9fVwiIChmb2N1cyk9XCJ0cmFuc2Zvcm1Ub0RlY2ltYWwoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwidHJhbnNmb3JtVG9EZWNpbWFsKCRldmVudClcIiBjbGFzcz1cImZvcm0tY29udHJvbCBzZWFyY2gtZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJxdWVzdGlvbi52YWx1ZVwiIFtyZXF1aXJlZF09XCJxdWVzdGlvbi5pc1JlcXVpcmVkXCIgbmFtZT1cInt7cXVlc3Rpb24ubmFtZStbaV19fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLXJlcXVpcmVkPVwie3txdWVzdGlvbi5pc1JlcXVpcmVkfX1cIiB2YWx1ZT1cInt7cXVlc3Rpb24udmFsdWV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cInNlYXJjaENsaWNrKClcIiBhdHRyLmRhdGEtcmVzdHJpY3Rpb249XCJ7e3F1ZXN0aW9uLnJlc3RyaWN0aW9ufX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS10eXBlPVwie3txdWVzdGlvbi5kYXRhdHlwZX19XCIgYXR0ci5kYXRhLW5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLW51bWVyaWNwYWlyPVwie3txdWVzdGlvbi5udW1lcmljUGFpcn19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtY3JpdC1kYXRhdGFibGU9XCJ7e3F1ZXN0aW9uLmlzQ3JpdGVyaWFEYXRhVGFibGV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5sYWJlbD1cInt7cXVlc3Rpb24ubGFiZWx9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGVuamlGb3JtLnN1Ym1pdHRlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWUrW2ldXT8udG91Y2hlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWUrW2ldXT8uZGlydHkpICYmIGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZStbaV1dPy5pbnZhbGlkIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXN0aW9uLnR5cGU9PSdjdXJyZW5jeSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXN0aW9uPy5pc0N1c3RvbSAhPSB1bmRlZmluZWQgJiYgcXVlc3Rpb24/LmlzQ3VzdG9tXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJcIiBpZD1cInt7cXVlc3Rpb24uaWR9fVwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHNlYXJjaC1mb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInF1ZXN0aW9uLmlzUmVxdWlyZWRcIiBuYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cInNlYXJjaENsaWNrKClcIiBhdHRyLmRhdGEtcmVzdHJpY3Rpb249XCJ7e3F1ZXN0aW9uLnJlc3RyaWN0aW9ufX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLXR5cGU9XCJ7e3F1ZXN0aW9uLmRhdGF0eXBlfX1cIiBhdHRyLmRhdGEtbmFtZT1cInt7cXVlc3Rpb24ubmFtZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS1yZXF1aXJlZD1cInt7cXVlc3Rpb24uaXNSZXF1aXJlZH19XCIgY3VycmVuY3lNYXNrIFtuZ01vZGVsXT1cInF1ZXN0aW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicXVlc3Rpb24udmFsdWVcIiBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIubGFiZWw9XCJ7e3F1ZXN0aW9uLmxhYmVsfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwieyB0aG91c2FuZHM6IHF1ZXN0aW9uLnRob3VzYW5kcywgZGVjaW1hbDogcXVlc3Rpb24uZGVjaW1hbCwgYWxpZ246IHF1ZXN0aW9uLmFsaWduLCBhbGxvd05lZ2F0aXZlOiBxdWVzdGlvbi5hbGxvd05lZ2F0aXZlLCBhbGxvd1plcm86IHF1ZXN0aW9uLmFsbG93WmVybywgcHJlY2lzaW9uOiBxdWVzdGlvbi5wcmVjaXNpb24sIG51bGxhYmxlOiBxdWVzdGlvbi5udWxsYWJsZSB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihlbmppRm9ybS5zdWJtaXR0ZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8udG91Y2hlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy5kaXJ0eSkgJiYgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8uaW52YWxpZCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlc3Rpb24/LmlzQ3VzdG9tID09IHVuZGVmaW5lZCB8fCAhcXVlc3Rpb24/LmlzQ3VzdG9tXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJ7e3F1ZXN0aW9uLmlkfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbCBzZWFyY2gtZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJxdWVzdGlvbi5pc1JlcXVpcmVkXCIgbmFtZT1cInt7cXVlc3Rpb24ubmFtZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZWFyY2hDbGljaygpXCIgYXR0ci5kYXRhLXJlc3RyaWN0aW9uPVwie3txdWVzdGlvbi5yZXN0cmljdGlvbn19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS10eXBlPVwie3txdWVzdGlvbi5kYXRhdHlwZX19XCIgYXR0ci5kYXRhLW5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtcmVxdWlyZWQ9XCJ7e3F1ZXN0aW9uLmlzUmVxdWlyZWR9fVwiIGN1cnJlbmN5TWFzayBbbmdNb2RlbF09XCJxdWVzdGlvbi52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInF1ZXN0aW9uLnZhbHVlXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmxhYmVsPVwie3txdWVzdGlvbi5sYWJlbH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInsgdGhvdXNhbmRzOiAnLCcsIGRlY2ltYWw6ICcuJywgYWxpZ246ICdyaWdodCcsIGFsbG93TmVnYXRpdmU6IGZhbHNlLCBhbGxvd1plcm86dHJ1ZSwgcHJlY2lzaW9uOiAyLCBudWxsYWJsZTogZmFsc2UgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZW5qaUZvcm0uc3VibWl0dGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LnRvdWNoZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8uZGlydHkpICYmIGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LmludmFsaWQgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRW5kIEhhcmRjb2RlIExvb2t1cCBkaWRhbGVtLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicXVlc3Rpb24udHlwZT09J2RhdGVwaWNrZXInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwie3txdWVzdGlvbi5pc1RpbWUgPyAnZGF0ZXRpbWUtbG9jYWwnIDogJ2RhdGUnfX1cIiBpZD1cInt7cXVlc3Rpb24uaWR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWZvcm0tY29udHJvbCBidG4tbG9va3VwXCIgbmFtZT1cInt7cXVlc3Rpb24ubmFtZStbaV19fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwicXVlc3Rpb24udmFsdWVcIiBbcmVxdWlyZWRdPVwicXVlc3Rpb24uaXNSZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLXJlcXVpcmVkPVwie3txdWVzdGlvbi5pc1JlcXVpcmVkfX1cIiB2YWx1ZT1cInt7cXVlc3Rpb24udmFsdWV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInF1ZXN0aW9uLnJlYWRvbmx5XCIgYXR0ci5kYXRhLXR5cGU9XCJ7e3F1ZXN0aW9uLmRhdGF0eXBlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS1uYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS1kYXRlcGlja2VycGFpcj1cInt7cXVlc3Rpb24uZGF0ZXBpY2tlclBhaXJ9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLWNyaXQtZGF0YXRhYmxlPVwie3txdWVzdGlvbi5pc0NyaXRlcmlhRGF0YVRhYmxlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZWFyY2hDbGljaygpXCIgYXR0ci5kYXRhLXJlc3RyaWN0aW9uPVwie3txdWVzdGlvbi5yZXN0cmljdGlvbn19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmxhYmVsPVwie3txdWVzdGlvbi5sYWJlbH19XCIgbWluPVwie3txdWVzdGlvbi5taW5EYXRlIHwgZGF0ZToneXl5eS1NTS1kZCd9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4PVwie3txdWVzdGlvbi5tYXhEYXRlIHwgZGF0ZToneXl5eS1NTS1kZCd9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3Vzb3V0KT1cInF1ZXN0aW9uLnJlc3RyaWN0aW9uICE9IHVuZGVmaW5lZCAmJiBjaGVja0lucHV0RGF0ZShxdWVzdGlvbilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2lzLWludmFsaWQnOihlbmppRm9ybS5zdWJtaXR0ZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lK1tpXV0/LnRvdWNoZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lK1tpXV0/LmRpcnR5KSAmJiBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWUrW2ldXT8uaW52YWxpZCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJxdWVzdGlvbi50eXBlID09ICd0YXNrRGVmaW5pdGlvbktleScgfHwgcXVlc3Rpb24udHlwZSA9PSAncHJvY2Vzc0tleScgfHwgcXVlc3Rpb24udHlwZSA9PSAnb2ZmaWNlUm9sZUNvZGVzJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWV9fVwiIGF0dHIuZGF0YS1yZXF1aXJlZD1cInt7cXVlc3Rpb24uaXNSZXF1aXJlZH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicXVlc3Rpb24uaXNSZXF1aXJlZFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHNlYXJjaC1mb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIucXVlcnktaW49XCJ7e3F1ZXN0aW9uLmlzUXVlcnlJbn19XCIgYXR0ci5kYXRhLXR5cGU9XCJ7e3F1ZXN0aW9uLmRhdGF0eXBlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIubGFiZWw9XCJ7e3F1ZXN0aW9uLmxhYmVsfX1cIiBbaGlkZGVuXT1cInF1ZXN0aW9uPy5pdGVtc1VybD8ubGVuZ3RoID09IDFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiKHF1ZXN0aW9uLnR5cGUgPT0gJ3Rhc2tEZWZpbml0aW9uS2V5JyB8fCBxdWVzdGlvbi50eXBlID09ICdwcm9jZXNzS2V5JykgPyBTZXRQcm9jZXNzS2V5KGkscXVlc3Rpb24ud2ZLZXlGaWx0ZXIpIDogU2V0Um9sZU9mZmljZUNvZGVzKGkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZW5qaUZvcm0uc3VibWl0dGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LnRvdWNoZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8uZGlydHkpICYmIGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LmludmFsaWQgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nSWY9XCJxdWVzdGlvbi5kZGxUeXBlID09ICdvbmUnICYmIHF1ZXN0aW9uPy5pdGVtc1VybD8ubGVuZ3RoICE9IDFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJvbmVcIj5TZWxlY3QgT25lPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIocXVlc3Rpb24/LmRkbFR5cGUgPT0gdW5kZWZpbmVkIHx8IHF1ZXN0aW9uLmRkbFR5cGUgPT0gJ2FsbCcpICYmIHF1ZXN0aW9uPy5pdGVtc1VybD8ubGVuZ3RoICE9IDFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJhbGxcIj5BbGw8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIHF1ZXN0aW9uPy5pdGVtc1VybFwiIHZhbHVlPVwie3tpdGVtLktleX19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0uVmFsdWV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsICpuZ0lmPVwicXVlc3Rpb24/Lml0ZW1zVXJsPy5sZW5ndGggPT0gMVwiPnt7cXVlc3Rpb24uaXRlbXNVcmxbMF0uVmFsdWV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzdGlvbi50eXBlPT0nZHJvcGRvd24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgbmFtZT1cInt7cXVlc3Rpb24ubmFtZX19XCIgYXR0ci5kYXRhLXJlcXVpcmVkPVwie3txdWVzdGlvbi5pc1JlcXVpcmVkfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicXVlc3Rpb24udmFsdWVcIiBbcmVxdWlyZWRdPVwicXVlc3Rpb24uaXNSZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgc2VhcmNoLWZvcm0tY29udHJvbFwiIGF0dHIucXVlcnktaW49XCJ7e3F1ZXN0aW9uLmlzUXVlcnlJbn19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtdHlwZT1cInt7cXVlc3Rpb24uZGF0YXR5cGV9fVwiIGF0dHIuZGF0YS1uYW1lPVwie3txdWVzdGlvbi5uYW1lfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIubGFiZWw9XCJ7e3F1ZXN0aW9uLmxhYmVsfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS1jcml0LWRhdGF0YWJsZT1cInt7cXVlc3Rpb24uaXNDcml0ZXJpYURhdGFUYWJsZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiFxdWVzdGlvbi5pc0Zyb21VUkwgPyBxdWVzdGlvbj8uaXRlbXM/Lmxlbmd0aCA9PSAxIDogcXVlc3Rpb24/Lml0ZW1zVXJsPy5sZW5ndGggPT0gMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJxdWVzdGlvbi5pc0V2ZW50ID8gb25DaGFuZ2VFdmVudCgkZXZlbnQudGFyZ2V0LnZhbHVlLCBxdWVzdGlvbikgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaXMtaW52YWxpZCc6KGVuamlGb3JtLnN1Ym1pdHRlZCB8fCBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy50b3VjaGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LmRpcnR5KSAmJiBlbmppRm9ybS5mb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLm5hbWVdPy5pbnZhbGlkIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInF1ZXN0aW9uLmRkbFR5cGUgPT0gJ29uZScgJiYgKCFxdWVzdGlvbi5pc0Zyb21VUkwgPyBxdWVzdGlvbj8uaXRlbXM/Lmxlbmd0aCAhPSAxIDogcXVlc3Rpb24/Lml0ZW1zVXJsPy5sZW5ndGggIT0gMSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJvbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdCBPbmU8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIihxdWVzdGlvbj8uZGRsVHlwZSA9PSB1bmRlZmluZWQgfHwgcXVlc3Rpb24uZGRsVHlwZSA9PSAnYWxsJykgJiYgKCFxdWVzdGlvbi5pc0Zyb21VUkwgPyBxdWVzdGlvbj8uaXRlbXM/Lmxlbmd0aCAhPSAxIDogcXVlc3Rpb24/Lml0ZW1zVXJsPy5sZW5ndGggIT0gMSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJhbGxcIj5BbGw8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mICFxdWVzdGlvbi5pc0Zyb21VUkwgPyBxdWVzdGlvbj8uaXRlbXMgOiBxdWVzdGlvbj8uaXRlbXNVcmxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJ7eyFxdWVzdGlvbi5pc0Zyb21VUkwgPyBpdGVtLmtleSA6IGl0ZW0uS2V5fX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IXF1ZXN0aW9uLmlzRnJvbVVSTCA/IGl0ZW0udmFsdWUgOiBpdGVtLlZhbHVlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXF1ZXN0aW9uLmlzRnJvbVVSTCA/IHF1ZXN0aW9uPy5pdGVtcz8ubGVuZ3RoID09IDEgOiBxdWVzdGlvbj8uaXRlbXNVcmw/Lmxlbmd0aCA9PSAxXCI+e3shcXVlc3Rpb24uaXNGcm9tVVJMXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBxdWVzdGlvbi5pdGVtc1swXS52YWx1ZSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb24uaXRlbXNVcmxbMF0uVmFsdWV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzdGlvbi50eXBlPT0nZHJvcGRvd25TZWFyY2gnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZHMtZGlzcGxheS1pdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cIiFxdWVzdGlvbi5pc0Zyb21VUkwgPyBxdWVzdGlvbj8uaXRlbXM/Lmxlbmd0aCA9PSAxIDogcXVlc3Rpb24/Lml0ZW1zVXJsPy5sZW5ndGggPT0gMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHNlYXJjaC1mb3JtLWNvbnRyb2wgZGRzLWlucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ7eydkZHNWYWx1ZScrcXVlc3Rpb24ubmFtZX19XCIgWyhuZ01vZGVsKV09XCJxdWVzdGlvbi5kZXNjclwiIHJlYWRvbmx5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicXVlc3Rpb24uaXNMaXN0SGlkZSA9ICFxdWVzdGlvbi5pc0xpc3RIaWRlOyBxdWVzdGlvbi5zZWFyY2hUZXh0PScnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFxdWVzdGlvbi5pc0Zyb21VUkwgPyBxdWVzdGlvbj8uaXRlbXM/Lmxlbmd0aCA9PSAxIDogcXVlc3Rpb24/Lml0ZW1zVXJsPy5sZW5ndGggPT0gMVwiPnt7cXVlc3Rpb24uZGVzY3J9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZHMtbGlzdC1jb250YWluZXJcIiBbaGlkZGVuXT1cInF1ZXN0aW9uLmlzTGlzdEhpZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBzZWFyY2gtZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ7eydzZWFyY2hUZXh0JytxdWVzdGlvbi5uYW1lfX1cIiBbKG5nTW9kZWwpXT1cInF1ZXN0aW9uLnNlYXJjaFRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInF1ZXN0aW9uLnBsYWNlaG9sZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRkcy1pdGVtcy1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmdWxsLXdpZHRoXCIgbmFtZT1cInt7cXVlc3Rpb24ubmFtZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5kYXRhLXJlcXVpcmVkPVwie3txdWVzdGlvbi5pc1JlcXVpcmVkfX1cIiBbKG5nTW9kZWwpXT1cInF1ZXN0aW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInF1ZXN0aW9uLmlzUmVxdWlyZWRcIiBhdHRyLnF1ZXJ5LWluPVwie3txdWVzdGlvbi5pc1F1ZXJ5SW59fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS10eXBlPVwie3txdWVzdGlvbi5kYXRhdHlwZX19XCIgYXR0ci5kYXRhLW5hbWU9XCJ7e3F1ZXN0aW9uLm5hbWV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIubGFiZWw9XCJ7e3F1ZXN0aW9uLmxhYmVsfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtY3JpdC1kYXRhdGFibGU9XCJ7e3F1ZXN0aW9uLmlzQ3JpdGVyaWFEYXRhVGFibGV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwicXVlc3Rpb24uaXNFdmVudCA/IG9uQ2hhbmdlRXZlbnQoJGV2ZW50LnRhcmdldC52YWx1ZSwgcXVlc3Rpb24pIDogJydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZW5qaUZvcm0uc3VibWl0dGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LnRvdWNoZWQgfHwgZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lXT8uZGlydHkpICYmIGVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV0/LmludmFsaWQgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJ7e3F1ZXN0aW9uPy5zaXplID09IHVuZGVmaW5lZCA/IHF1ZXN0aW9uPy5zaXplIDogMTB9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIChjbGljayk9XCJzZWxlY3RlZE9wdGlvbih7S2V5OidvbmUnLFZhbHVlOidTZWxlY3QgT25lJ30scXVlc3Rpb24pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInF1ZXN0aW9uLmRkc1R5cGUgPT0gJ29uZScgJiYgKCFxdWVzdGlvbi5pc0Zyb21VUkwgPyBxdWVzdGlvbj8uaXRlbXM/Lmxlbmd0aCAhPSAxIDogcXVlc3Rpb24/Lml0ZW1zVXJsPy5sZW5ndGggIT0gMSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwib25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0IE9uZTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIChjbGljayk9XCJzZWxlY3RlZE9wdGlvbih7S2V5OidhbGwnLFZhbHVlOidBbGwnfSxxdWVzdGlvbilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKHF1ZXN0aW9uPy5kZHNUeXBlID09IHVuZGVmaW5lZCB8fCBxdWVzdGlvbi5kZHNUeXBlID09ICdhbGwnKSAmJiAoIXF1ZXN0aW9uLmlzRnJvbVVSTCA/IHF1ZXN0aW9uPy5pdGVtcz8ubGVuZ3RoICE9IDEgOiBxdWVzdGlvbj8uaXRlbXNVcmw/Lmxlbmd0aCAhPSAxKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJhbGxcIj5BbGw8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8b3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIHF1ZXN0aW9uPy5pdGVtcyB8IHRleHRTZWFyY2ggOiBxdWVzdGlvbi5zZWFyY2hUZXh0OyBsZXQgaT1pbmRleFwiIFt2YWx1ZV09XCJpdGVtPy5rZXlcIiAoY2xpY2spPVwic2VsZWN0ZWRPcHRpb24oaXRlbSxxdWVzdGlvbilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbT8udmFsdWV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mICFxdWVzdGlvbi5pc0Zyb21VUkwgPyAocXVlc3Rpb24/Lml0ZW1zIHwgdGV4dFNlYXJjaCA6IHF1ZXN0aW9uLnNlYXJjaFRleHQpIDogcXVlc3Rpb24/Lml0ZW1zVXJsIHwgdGV4dFNlYXJjaCA6IHF1ZXN0aW9uLnNlYXJjaFRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RlZE9wdGlvbihpdGVtLHF1ZXN0aW9uKVwiIHZhbHVlPVwie3tpdGVtLktleX19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLlZhbHVlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJxdWVzdGlvbi50eXBlPT0nY2xhaW0nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgbmFtZT1cInt7J2NsYWltJytbaV19fVwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHNlYXJjaC1mb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZGF0YS10eXBlPVwie3sndGV4dCd9fVwiIGF0dHIuZGF0YS1jcml0LWRhdGF0YWJsZT1cInt7cXVlc3Rpb24uaXNDcml0ZXJpYURhdGFUYWJsZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtbmFtZT1cInt7J0Fzc2lnbmVlJ319XCIgW2hpZGRlbl09XCJDbGFpbUxpc3Q/Lmxlbmd0aCA9PSAxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdpcy1pbnZhbGlkJzooZW5qaUZvcm0uc3VibWl0dGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbJ2NsYWltJytbaV1dPy50b3VjaGVkIHx8IGVuamlGb3JtLmZvcm0uY29udHJvbHNbJ2NsYWltJytbaV1dPy5kaXJ0eSkgJiYgZW5qaUZvcm0uZm9ybS5jb250cm9sc1snY2xhaW0nK1tpXV0/LmludmFsaWQgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nSWY9XCJxdWVzdGlvbi5kZGxUeXBlID09ICdvbmUnICYmIENsYWltTGlzdD8ubGVuZ3RoICE9IDFcIiB2YWx1ZT1cIm9uZVwiPlNlbGVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25lPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIocXVlc3Rpb24/LmRkbFR5cGUgPT0gdW5kZWZpbmVkIHx8IHF1ZXN0aW9uLmRkbFR5cGUgPT0gJ2FsbCcpICYmIENsYWltTGlzdD8ubGVuZ3RoICE9IDFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJhbGxcIj5BbGw8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIENsYWltTGlzdFwiIHZhbHVlPVwie3tpdGVtLktleX19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0uVmFsdWV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi11Yy1zaG93LWVycm9ycyAqbmdJZj1cInF1ZXN0aW9uLnR5cGUhPSdkYXRlcGlja2VyJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb250cm9sXT1cImVuamlGb3JtLmZvcm0uY29udHJvbHNbcXVlc3Rpb24ubmFtZV1cIiBbc3VibWl0XT1cImVuamlGb3JtLnN1Ym1pdHRlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWItdWMtc2hvdy1lcnJvcnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXVjLXNob3ctZXJyb3JzICpuZ0lmPVwicXVlc3Rpb24udHlwZT09J2RhdGVwaWNrZXInXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZW5qaUZvcm0uZm9ybS5jb250cm9sc1txdWVzdGlvbi5uYW1lK1tpXV1cIiBbc3VibWl0XT1cImVuamlGb3JtLnN1Ym1pdHRlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saWItdWMtc2hvdy1lcnJvcnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02IGZvcm0tZ3JvdXBcIiAqbmdJZj1cIihpc1JlcG9ydCAhPSB1bmRlZmluZWQgJiYgaXNSZXBvcnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtNSBuby1wYWRkaW5nXCIgdHJhbnNsYXRlPlJlcG9ydCBUeXBlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTcgbm8tcGFkZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPVwiRXhwb3J0VHlwZVwiIFsobmdNb2RlbCldPVwiRXhwb3J0VHlwZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHNlYXJjaC1mb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmRhdGEtdHlwZT1cInRleHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBFeHBvcnRUeXBlTGlzdFwiIFt2YWx1ZV09XCJpdGVtLmtleVwiPnt7aXRlbS52YWx1ZX19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgbm8tcGFkZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWFjdGlvbnMgcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJleHBvcnREYXRhID09IHRydWUgJiYgaXNTZWFyY2hcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImV4cG9ydEFzWExTWCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXJhaXNlZCBidG4tc3VjY2VzcyBtci0xXCIgdHJhbnNsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZ0LWRvd25sb2FkXCI+PC9pPiZuYnNwOzxzcGFuIHRyYW5zbGF0ZT5FeHBvcnQgRXhjZWw8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJyZXNldCgpXCIgY2xhc3M9XCJidG4gYnRuLXJhaXNlZCBidG4td2FybmluZyBtci0xXCIgdHJhbnNsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRpbWVzXCI+PC9pPiZuYnNwOzxzcGFuIHRyYW5zbGF0ZT5SZXNldDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIihpc1JlcG9ydCA9PSB1bmRlZmluZWQgfHwgIWlzUmVwb3J0KVwiIHR5cGU9XCJzdWJtaXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcmFpc2VkIGJ0bi1wcmltYXJ5XCIgI1VDU2VhcmNoQ2xpY2s+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc2VhcmNoXCI+PC9pPiZuYnNwOzxzcGFuIHRyYW5zbGF0ZT5TZWFyY2g8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIoaXNSZXBvcnQgIT0gdW5kZWZpbmVkICYmIGlzUmVwb3J0KVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiR2VuZXJhdGVSZXBvcnQoZW5qaUZvcm0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXJhaXNlZCBidG4tcHJpbWFyeVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZ0LWRvd25sb2FkXCI+PC9pPiZuYnNwOzxzcGFuIHRyYW5zbGF0ZT5HZW5lcmF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJlcG9ydDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG48YnI+XHJcbjwhLS0gLy8gQmFzaWMgZm9ybSBsYXlvdXQgc2VjdGlvbiBlbmQgLS0+Il19