@yibozhang/pro-table 16.2.1 → 16.2.2

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.
@@ -78,6 +78,7 @@ export class ProTableComponent {
78
78
  this.onRowDbClick = new EventEmitter();
79
79
  this.onValuesChange = new EventEmitter();
80
80
  this.onResetFormBeforeReload = new EventEmitter();
81
+ this.onColumnsChange = new EventEmitter();
81
82
  this._savedSearchParams = {};
82
83
  // 存储所有自定义模板的引用
83
84
  this.customTemplates = new Map();
@@ -151,8 +152,11 @@ export class ProTableComponent {
151
152
  }
152
153
  if (this.tableName && this.columnRemote) {
153
154
  this._columnsReady = false;
155
+ this.queryDynamicColumns();
156
+ }
157
+ else {
158
+ this.emitColumnsChange();
154
159
  }
155
- this.queryDynamicColumns();
156
160
  }
157
161
  ngAfterContentInit() {
158
162
  // 自动注册所有自定义模板
@@ -175,13 +179,13 @@ export class ProTableComponent {
175
179
  hideInTable: !item.isShow,
176
180
  };
177
181
  });
178
- this._serverColumns = _tabColumn.filter((col) => this.columns.some((localCol) => localCol.prop === col.prop));
182
+ this._serverColumns = _tabColumn.filter((col) => this.columns.some((localCol) => localCol.prop === col.prop && this.isConfigurableColumn(localCol)));
179
183
  this.updateTableColumns(this._serverColumns);
180
184
  }
181
185
  else if (res.code === 10) {
182
186
  // 如果未设置接口返回,需要默认调用一次修改函数初始化数据
183
187
  const initColumns = this.columns
184
- .filter((col) => !col.auxiliaryColumn)
188
+ .filter((col) => this.isConfigurableColumn(col))
185
189
  .map((column) => ({
186
190
  field: column.prop,
187
191
  isShow: true,
@@ -196,8 +200,12 @@ export class ProTableComponent {
196
200
  }
197
201
  finally {
198
202
  this._columnsReady = true;
203
+ this.emitColumnsChange();
199
204
  }
200
205
  }
206
+ emitColumnsChange() {
207
+ this.onColumnsChange.emit(cloneDeep(this._columns));
208
+ }
201
209
  formateInnerColumns(columns) {
202
210
  this._columns = columns
203
211
  .filter((item) => !item.hideInTable)
@@ -417,10 +425,13 @@ export class ProTableComponent {
417
425
  // 并发加载所有需要异步获取的选项
418
426
  this.setSelectRequest(this._searchFiledColumns);
419
427
  }
428
+ isConfigurableColumn(col) {
429
+ return !col.auxiliaryColumn && !col.hideInTable;
430
+ }
420
431
  updateTableColumns(injectColumns) {
421
432
  // 远程列直接作为来源,过滤掉本地不存在的列,并从本地列补充渲染配置
422
433
  const remoteColumns = injectColumns
423
- .filter((injectCol) => this.columns.some((col) => col.prop === injectCol.prop))
434
+ .filter((injectCol) => this.columns.some((col) => col.prop === injectCol.prop && this.isConfigurableColumn(col)))
424
435
  .map((injectCol) => {
425
436
  const localCol = this.columns.find((col) => col.prop === injectCol.prop);
426
437
  return { ...localCol, ...injectCol };
@@ -620,6 +631,7 @@ export class ProTableComponent {
620
631
  if (options?.reload === true) {
621
632
  this.handleQuery();
622
633
  }
634
+ this.emitColumnsChange();
623
635
  }
624
636
  getSelectedRowData() {
625
637
  return this._selectedTableRow;
@@ -971,8 +983,14 @@ export class ProTableComponent {
971
983
  this._selectedTableRow = data;
972
984
  this.onRowDbClick.emit(this._selectedTableRow);
973
985
  }
974
- handleColumnsSettingConfirm() {
975
- this.queryDynamicColumns();
986
+ async handleColumnsSettingConfirm(selectedColumns) {
987
+ if (this.tableName && this.columnRemote) {
988
+ await this.queryDynamicColumns();
989
+ }
990
+ else if (selectedColumns?.length) {
991
+ this.updateTableColumns(selectedColumns);
992
+ this.emitColumnsChange();
993
+ }
976
994
  }
977
995
  // 处理 autoComplete 输入事件(带防抖)
978
996
  handleAutoCompleteInput(event, column) {
@@ -1014,11 +1032,11 @@ export class ProTableComponent {
1014
1032
  return `pro-table-${fieldName}-form-item`;
1015
1033
  }
1016
1034
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProTableComponent, deps: [{ token: PRO_TABLE_COLUMN_REMOTE, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
1017
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ProTableComponent, selector: "app-pro-table", inputs: { showSearchBtn: "showSearchBtn", showClearBtn: "showClearBtn", title: "title", bodyStyle: "bodyStyle", tableName: "tableName", multiRow: "multiRow", columns: "columns", showSearchBar: "showSearchBar", showActionBar: "showActionBar", confirmBtnText: "confirmBtnText", clearBtnText: "clearBtnText", labelWidth: "labelWidth", labelAlign: "labelAlign", searchColCount: "searchColCount", dataSource: "dataSource", bordered: "bordered", outerBordered: "outerBordered", showPagination: "showPagination", frontPagination: "frontPagination", scroll: "scroll", request: "request", summaryData: "summaryData", sortMode: "sortMode", showColumnSetting: "showColumnSetting", multipleSort: "multipleSort", showCheckbox: "showCheckbox", rowDisabled: "rowDisabled", autoTriggerRequest: "autoTriggerRequest", customTableRender: "customTableRender" }, outputs: { onRowClick: "onRowClick", onRowDbClick: "onRowDbClick", onValuesChange: "onValuesChange", onResetFormBeforeReload: "onResetFormBeforeReload" }, queries: [{ propertyName: "customContentTpl", first: true, predicate: ["customContent"], descendants: true }, { propertyName: "actionBarTpl", first: true, predicate: ["actionBar"], descendants: true }, { propertyName: "imgActionBarTpl", first: true, predicate: ["ImgActionBar"], descendants: true }, { propertyName: "allTemplates", predicate: TemplateRef }], ngImport: i0, template: "<app-page-container\r\n [title]=\"title\"\r\n [showHeader]=\"showSearchBar\"\r\n [bodyStyle]=\"bodyStyle\"\r\n ngClass=\"pro-table-container\"\r\n>\r\n <!-- \u589E\u52A0\u81EA\u5B9A\u4E49\u5185\u5BB9\u533A-->\r\n <ng-template #customContent>\r\n <ng-container\r\n *ngIf=\"customContentTpl\"\r\n [ngTemplateOutlet]=\"customContentTpl\"\r\n ></ng-container>\r\n </ng-template>\r\n\r\n <ng-template #header>\r\n <app-table-search-bar\r\n *ngIf=\"showSearchBar\"\r\n [labelWidth]=\"labelWidth\"\r\n [labelAlign]=\"labelAlign\"\r\n [searchColCount]=\"tableSearchColCount\"\r\n >\r\n <ng-template #leftContent>\r\n <nz-form-item\r\n *ngFor=\"let column of _searchFiledColumns\"\r\n [ngClass]=\"getFormItemClassName(column)\"\r\n >\r\n <nz-form-label *ngIf=\"!getFieldProps(column).hideLabel\" nzNoColon>\r\n <!-- \u68C0\u67E5\u662F\u5426\u6709\u81EA\u5B9A\u4E49label\u6A21\u677F -->\r\n <ng-container\r\n *ngIf=\"\r\n column.customLabelRender &&\r\n getLabelTemplate(column.customLabelRender);\r\n else defaultLabel\r\n \"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"getLabelTemplate(column.customLabelRender)\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: column,\r\n column: column,\r\n fieldProps: getFieldProps(column)\r\n }\"\r\n >\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #defaultLabel>\r\n {{ getFieldProps(column).label || column.title }}\r\n </ng-template>\r\n </nz-form-label>\r\n <nz-form-control *ngIf=\"column.valueType === 'input'\">\r\n <input\r\n nz-input\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [placeholder]=\"getFieldProps(column).placeHolder\"\r\n [disabled]=\"getFieldProps(column).disabled\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n />\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'inputPlate'\">\r\n <app-plate-input\r\n [usage]=\"'filter'\"\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n ></app-plate-input>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'select'\">\r\n <nz-select\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [nzShowSearch]=\"getFieldProps(column).showSearch\"\r\n >\r\n <nz-option\r\n *ngFor=\"let opt of getFieldProps(column).options\"\r\n [nzValue]=\"opt.value\"\r\n [nzLabel]=\"opt.label\"\r\n [nzDisabled]=\"opt.disabled\"\r\n [nzTitle]=\"opt.tooltip || opt.label\"\r\n ></nz-option>\r\n </nz-select>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'selectMultiple'\">\r\n <nz-select\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [nzShowSearch]=\"getFieldProps(column).showSearch\"\r\n nzMode=\"multiple\"\r\n [nzMaxTagCount]=\"2\"\r\n [nzMaxTagPlaceholder]=\"nzMaxTagPlaceholder\"\r\n [nzCustomTemplate]=\"defaultTemplate\"\r\n >\r\n <nz-option\r\n *ngFor=\"let opt of getFieldProps(column).options\"\r\n [nzValue]=\"opt.value\"\r\n [nzLabel]=\"opt.label\"\r\n [nzDisabled]=\"opt.disabled\"\r\n [nzTitle]=\"opt.tooltip || opt.label\"\r\n ></nz-option>\r\n <ng-template #nzMaxTagPlaceholder>\r\n +\r\n {{\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n ?.length\r\n }}\r\n </ng-template>\r\n <ng-template #defaultTemplate let-selected>\r\n {{\r\n selected.nzLabel.length > 4\r\n ? selected.nzLabel.substring(0, 4) + \"...\"\r\n : selected.nzLabel\r\n }}\r\n </ng-template>\r\n </nz-select>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'date'\">\r\n <nz-date-picker\r\n [nzShowTime]=\"getFieldProps(column).showTime\"\r\n [nzFormat]=\"getFieldProps(column).format\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzMode]=\"getFieldProps(column).mode\"\r\n ></nz-date-picker>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'checkbox'\">\r\n <nz-checkbox-group\r\n [class]=\"\r\n getFieldProps(column).noStyle\r\n ? 'pro-table-checkboxgroup-nostyle'\r\n : ''\r\n \"\r\n [(ngModel)]=\"getFieldProps(column).options\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n (ngModelChange)=\"\r\n handleFieldCheckBoxChange(\r\n $event,\r\n getFieldProps(column).name || column.prop\r\n )\r\n \"\r\n ></nz-checkbox-group>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'autoComplete'\">\r\n <input\r\n nz-input\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column)?.name || column.prop]\r\n \"\r\n (input)=\"handleAutoCompleteInput($event, column)\"\r\n [nzAutocomplete]=\"auto\"\r\n [disabled]=\"getFieldProps(column)?.disabled\"\r\n [placeholder]=\"getFieldProps(column)?.placeHolder\"\r\n />\r\n <nz-autocomplete\r\n [nzBackfill]=\"getFieldProps(column).backFill\"\r\n [nzDefaultActiveFirstOption]=\"\r\n getFieldProps(column).defaultActiveFirstOption\r\n \"\r\n [nzWidth]=\"getFieldProps(column).width\"\r\n #auto\r\n >\r\n <nz-auto-option\r\n *ngFor=\"let option of getAutoCompleteDataSource(column)\"\r\n [nzValue]=\"\r\n getFieldProps(column).returnFullData ? option : option.value\r\n \"\r\n [nzLabel]=\"option.label\"\r\n [nzDisabled]=\"option.disabled\"\r\n >\r\n {{ option.label }}\r\n </nz-auto-option>\r\n </nz-autocomplete>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'custom'\">\r\n <app-dynamic-search-field\r\n [component]=\"getFieldProps(column).component\"\r\n [value]=\"_searchParams[getFieldProps(column).name || column.prop]\"\r\n [props]=\"getFieldProps(column)\"\r\n (valueChange)=\"\r\n setFieldValue(getFieldProps(column).name || column.prop, $event)\r\n \"\r\n ></app-dynamic-search-field>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'inputNumber'\">\r\n <nz-input-number\r\n [style.width]=\"'100%'\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [nzFormatter]=\"getFieldProps(column).formatterPercent\"\r\n [nzParser]=\"getFieldProps(column).parserPercent\"\r\n ></nz-input-number>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </ng-template>\r\n <ng-template #actionTextBtn>\r\n <nz-space [nzSize]=\"4\">\r\n <ng-template nzSpaceItem *ngIf=\"showSearchBtn\">\r\n <button nz-button nzType=\"primary\" (click)=\"handleSearch()\">\r\n {{ confirmBtnText }}\r\n </button>\r\n </ng-template>\r\n <ng-template nzSpaceItem *ngIf=\"showClearBtn\">\r\n <button nz-button (click)=\"handleResetForm()\">\r\n {{ clearBtnText }}\r\n </button>\r\n </ng-template>\r\n </nz-space>\r\n </ng-template>\r\n <ng-container *ngIf=\"imgActionBarTpl || showColumnSetting\">\r\n <ng-template #actionImgBtn>\r\n <nz-space>\r\n <ng-container *ngTemplateOutlet=\"imgActionBarTpl\"></ng-container>\r\n <ng-template\r\n nzSpaceItem\r\n class=\"setting-space-item\"\r\n *ngIf=\"showColumnSetting\"\r\n >\r\n <span nz-tooltip nzTooltipTitle=\"\u8BBE\u7F6E\u5B57\u6BB5\">\r\n <app-colmuns-setting\r\n [columns]=\"columns\"\r\n [selectedColumns]=\"_serverColumns\"\r\n [tableName]=\"tableName\"\r\n (afterConfirm)=\"handleColumnsSettingConfirm()\"\r\n ></app-colmuns-setting>\r\n </span>\r\n </ng-template>\r\n </nz-space>\r\n </ng-template>\r\n </ng-container>\r\n </app-table-search-bar>\r\n </ng-template>\r\n\r\n <ng-template #body>\r\n <div class=\"mb-4\">\r\n <ng-container *ngIf=\"showActionBar\">\r\n <ng-container *ngTemplateOutlet=\"actionBarTpl\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngIf=\"customTableRender\">\r\n <ng-container *ngTemplateOutlet=\"customTableRender\"></ng-container>\r\n </ng-container>\r\n <div [class.pro-table-auto-scroll]=\"scroll?.x === 'auto'\">\r\n <nz-table\r\n *ngIf=\"!customTableRender && _columnsReady\"\r\n #dynamicTable\r\n nzSize=\"small\"\r\n nzShowSizeChanger\r\n [nzBordered]=\"bordered\"\r\n [nzOuterBordered]=\"outerBordered\"\r\n [nzData]=\"dataSource\"\r\n [nzPageIndex]=\"_pageInfo.pageIndex\"\r\n [nzPageSize]=\"_pageInfo.pageSize\"\r\n [nzTotal]=\"_pageInfo.total\"\r\n [nzPageSizeOptions]=\"_pageInfo.pageSizeOptions\"\r\n [nzShowPagination]=\"showPagination\"\r\n [nzShowTotal]=\"totalTemplate\"\r\n [nzLoading]=\"_loading\"\r\n [nzFrontPagination]=\"frontPagination\"\r\n [nzScroll]=\"_computedScroll\"\r\n (nzPageIndexChange)=\"handlePageIndexChange($event)\"\r\n (nzPageSizeChange)=\"handlePageSizeChange($event)\"\r\n >\r\n <thead>\r\n <tr>\r\n <!-- \u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF09 -->\r\n <th\r\n *ngIf=\"showCheckbox\"\r\n [nzWidth]=\"'50px'\"\r\n [nzAlign]=\"'center'\"\r\n style=\"text-align: center\"\r\n [(nzChecked)]=\"_checkedAll\"\r\n [nzIndeterminate]=\"_indeterminate\"\r\n (nzCheckedChange)=\"toggleCheckAll($event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n ></th>\r\n <th\r\n *ngFor=\"let column of _columns\"\r\n [nzWidth]=\"column.width\"\r\n [nzAlign]=\"column.align\"\r\n [nzLeft]=\"column._nzLeft\"\r\n [nzRight]=\"column._nzRight\"\r\n [nzShowSort]=\"!!column.sorter\"\r\n [nzSortOrder]=\"getSortOrder(column.prop)\"\r\n (nzSortOrderChange)=\"onSortChange(column.prop, $event)\"\r\n >\r\n {{ column.title }}\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <tr\r\n style=\"cursor: pointer\"\r\n *ngFor=\"let data; let i = index; of: dynamicTable.data\"\r\n [ngClass]=\"{\r\n 'ant-table-custom-row-selected': !!getTableRowChecked(data),\r\n 'ant-table-custom-row-even': i % 2 === 0,\r\n 'ant-table-custom-row-odd': i % 2 !== 0\r\n }\"\r\n (click)=\"handleTableRowClick(data)\"\r\n (dblclick)=\"handleTableRowDbClick(data)\"\r\n >\r\n <!-- \u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF09 -->\r\n <td\r\n *ngIf=\"showCheckbox\"\r\n [nzAlign]=\"'center'\"\r\n style=\"text-align: center; width: 50px\"\r\n [(nzChecked)]=\"data.checked\"\r\n [nzDisabled]=\"isRowDisabled(data)\"\r\n (nzCheckedChange)=\"handleRowCheckedChange(data, $event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n ></td>\r\n <td\r\n *ngFor=\"let column of _columns\"\r\n [nzLeft]=\"column._nzLeft\"\r\n [nzRight]=\"column._nzRight\"\r\n [nzAlign]=\"column.align\"\r\n [ngClass]=\"{\r\n 'pro-nowrap': true\r\n }\"\r\n >\r\n <!-- \u68C0\u67E5\u662F\u5426\u6709\u81EA\u5B9A\u4E49\u6A21\u677F -->\r\n <ng-container\r\n *ngIf=\"\r\n column.customRender && getTemplate(column.customRender);\r\n let template\r\n \"\r\n >\r\n <ng-template\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: data,\r\n data: data,\r\n column: column,\r\n index: i,\r\n pageInfo: _pageInfo\r\n }\"\r\n >\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- \u9ED8\u8BA4\u6E32\u67D3\u903B\u8F91 -->\r\n <ng-container\r\n *ngIf=\"\r\n !column.customRender || !getTemplate(column.customRender)\r\n \"\r\n >\r\n <ng-container *ngIf=\"column.ellipsis\">\r\n <div\r\n class=\"pro-ellipsis\"\r\n [title]=\"data[column.prop]\"\r\n [ngStyle]=\"{\r\n width: 'calc(' + column.width + ' - 25px)'\r\n }\"\r\n >\r\n {{ data[column.prop] }}\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!column.ellipsis\">\r\n {{ data[column.prop] }}\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"summaryData && _pageInfo.total > 0\">\r\n <!-- \u6C47\u603B\u884C\u7684\u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF0C\u4F46\u4E3A\u7A7A\uFF09 -->\r\n <td\r\n *ngIf=\"showCheckbox\"\r\n style=\"font-weight: bold; border-right: 1px solid #e8e8e8\"\r\n ></td>\r\n <td\r\n *ngFor=\"let column; let i = index; of: _columns\"\r\n [nzLeft]=\"column._nzLeft\"\r\n [nzRight]=\"column._nzRight\"\r\n style=\"font-weight: bold; border-right: 1px solid #e8e8e8\"\r\n [nzAlign]=\"column.align\"\r\n >\r\n <span *ngIf=\"i === 0\">\u603B\u8BA1</span>\r\n <ng-container *ngIf=\"i !== 0 && column.summary\">\r\n {{\r\n column.summary?.format\r\n ? column.summary?.format(\r\n summaryData[column.summary?.name || column.prop]\r\n )\r\n : summaryData[column.summary?.name || column.prop]\r\n }}\r\n </ng-container>\r\n </td>\r\n </tr>\r\n </tbody>\r\n <ng-template #totalTemplate let-total\r\n >\u5171 {{ _pageInfo.total }} \u6761\u8BB0\u5F55</ng-template\r\n >\r\n </nz-table>\r\n </div>\r\n </ng-template>\r\n</app-page-container>\r\n", styles: [".pro-ellipsis{overflow:hidden;text-overflow:ellipsis}.pro-nowrap{white-space:nowrap}::ng-deep .setting-space-item{margin-right:0!important}::ng-deep .pro-table-checkboxgroup-nostyle{white-space:nowrap}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body table{border-collapse:separate;border-spacing:0}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td{border-right:1px solid #e8e8e8!important}::ng-deep .ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>thead>tr>th{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important;white-space:nowrap}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-thead>tr>th:first-child,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td:first-child{border-left:none!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-cell-fix-left,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-cell-fix-right{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th.ant-table-cell-fix-left,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th.ant-table-cell-fix-right{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th{border-top:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-thead>tr>th:last-child,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td:last-child{border-right:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr:last-child>td{border-bottom:1px solid #e8e8e8!important}::ng-deep .table-search-bar-left .ant-form-item{margin-bottom:4px}::ng-deep .table-search-bar-left .ant-form-item .ant-form-item-label>label{color:#5a5a5a}::ng-deep .pro-table-container .page-container-body{padding:8px 0 0!important}::ng-deep .pro-table-auto-scroll .ant-table-content,::ng-deep .pro-table-auto-scroll .ant-table-body{overflow-x:auto!important}::ng-deep .pro-table-auto-scroll .ant-table-content table,::ng-deep .pro-table-auto-scroll .ant-table-body table{table-layout:auto!important}::ng-deep .pro-table-auto-scroll .ant-table-content table td,::ng-deep .pro-table-auto-scroll .ant-table-body table td{white-space:nowrap}::ng-deep .ant-table-cell-fix-left-last{box-shadow:6px 0 8px -4px #00000026;clip-path:inset(0px -8px 0px 0px)}::ng-deep .ant-table-cell-fix-right-first{box-shadow:-6px 0 8px -4px #00000026;clip-path:inset(0px 0px 0px -8px)}::ng-deep .ant-table-tbody>tr:hover>td.ant-table-cell-fix-left,::ng-deep .ant-table-tbody>tr:hover>td.ant-table-cell-fix-right,::ng-deep .ant-table-tbody>tr.ant-table-custom-row-selected>td.ant-table-cell-fix-left,::ng-deep .ant-table-tbody>tr.ant-table-custom-row-selected>td.ant-table-cell-fix-right{background:#e8f0fb}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i3.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "component", type: i4.NzFormItemComponent, selector: "nz-form-item", exportAs: ["nzFormItem"] }, { kind: "component", type: i4.NzFormLabelComponent, selector: "nz-form-label", inputs: ["nzFor", "nzRequired", "nzNoColon", "nzTooltipTitle", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzFormLabel"] }, { kind: "component", type: i4.NzFormControlComponent, selector: "nz-form-control", inputs: ["nzSuccessTip", "nzWarningTip", "nzErrorTip", "nzValidatingTip", "nzExtra", "nzAutoTips", "nzDisableAutoTips", "nzHasFeedback", "nzValidateStatus"], exportAs: ["nzFormControl"] }, { kind: "component", type: i5.NzOptionComponent, selector: "nz-option", inputs: ["nzTitle", "nzLabel", "nzValue", "nzKey", "nzDisabled", "nzHide", "nzCustomContent"], exportAs: ["nzOption"] }, { kind: "component", type: i5.NzSelectComponent, selector: "nz-select", inputs: ["nzId", "nzSize", "nzStatus", "nzOptionHeightPx", "nzOptionOverflowSize", "nzDropdownClassName", "nzDropdownMatchSelectWidth", "nzDropdownStyle", "nzNotFoundContent", "nzPlaceHolder", "nzPlacement", "nzMaxTagCount", "nzDropdownRender", "nzCustomTemplate", "nzSuffixIcon", "nzClearIcon", "nzRemoveIcon", "nzMenuItemSelectedIcon", "nzTokenSeparators", "nzMaxTagPlaceholder", "nzMaxMultipleCount", "nzMode", "nzFilterOption", "compareWith", "nzAllowClear", "nzBorderless", "nzShowSearch", "nzLoading", "nzAutoFocus", "nzAutoClearSearchValue", "nzServerSearch", "nzDisabled", "nzOpen", "nzSelectOnTab", "nzBackdrop", "nzOptions", "nzShowArrow"], outputs: ["nzOnSearch", "nzScrollToBottom", "nzOpenChange", "nzBlur", "nzFocus"], exportAs: ["nzSelect"] }, { kind: "component", type: i6.NzSpaceComponent, selector: "nz-space, [nz-space]", inputs: ["nzDirection", "nzAlign", "nzSplit", "nzWrap", "nzSize"], exportAs: ["NzSpace"] }, { kind: "directive", type: i6.NzSpaceItemDirective, selector: "[nzSpaceItem]" }, { kind: "directive", type: i7.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i8.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i9.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i10.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "component", type: i11.PageContainerComponent, selector: "app-page-container", inputs: ["title", "showHeader", "bodyStyle", "headerStyle"] }, { kind: "component", type: i12.TableSearchBarComponent, selector: "app-table-search-bar", inputs: ["labelWidth", "labelAlign", "searchColCount"] }, { kind: "component", type: i13.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "component", type: i13.NzThAddOnComponent, selector: "th[nzColumnKey], th[nzSortFn], th[nzSortOrder], th[nzFilters], th[nzShowSort], th[nzShowFilter], th[nzCustomFilter]", inputs: ["nzColumnKey", "nzFilterMultiple", "nzSortOrder", "nzSortPriority", "nzSortDirections", "nzFilters", "nzSortFn", "nzFilterFn", "nzShowSort", "nzShowFilter", "nzCustomFilter"], outputs: ["nzCheckedChange", "nzSortOrderChange", "nzFilterChange"] }, { kind: "directive", type: i13.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i13.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i13.NzTdAddOnComponent, selector: "td[nzChecked], td[nzDisabled], td[nzIndeterminate], td[nzIndentSize], td[nzExpand], td[nzShowExpand], td[nzShowCheckbox]", inputs: ["nzChecked", "nzDisabled", "nzIndeterminate", "nzIndentSize", "nzShowExpand", "nzShowCheckbox", "nzExpand"], outputs: ["nzCheckedChange", "nzExpandChange"] }, { kind: "component", type: i13.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i13.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i13.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "directive", type: i13.NzCellFixedDirective, selector: "td[nzRight],th[nzRight],td[nzLeft],th[nzLeft]", inputs: ["nzRight", "nzLeft", "colspan", "colSpan"] }, { kind: "directive", type: i13.NzCellAlignDirective, selector: "th[nzAlign],td[nzAlign]", inputs: ["nzAlign"] }, { kind: "component", type: i13.NzThSelectionComponent, selector: "th[nzSelections],th[nzChecked],th[nzShowCheckbox],th[nzShowRowSelection]", inputs: ["nzSelections", "nzChecked", "nzDisabled", "nzIndeterminate", "nzShowCheckbox", "nzShowRowSelection"], outputs: ["nzCheckedChange"] }, { kind: "component", type: i14.PlateInputComponent, selector: "app-plate-input", inputs: ["usage"] }, { kind: "component", type: i15.NzDatePickerComponent, selector: "nz-date-picker,nz-week-picker,nz-month-picker,nz-year-picker,nz-range-picker", inputs: ["nzAllowClear", "nzAutoFocus", "nzDisabled", "nzBorderless", "nzInputReadOnly", "nzInline", "nzOpen", "nzDisabledDate", "nzLocale", "nzPlaceHolder", "nzPopupStyle", "nzDropdownClassName", "nzSize", "nzStatus", "nzFormat", "nzDateRender", "nzDisabledTime", "nzRenderExtraFooter", "nzShowToday", "nzMode", "nzShowNow", "nzRanges", "nzDefaultPickerValue", "nzSeparator", "nzSuffixIcon", "nzBackdrop", "nzId", "nzPlacement", "nzShowWeekNumber", "nzShowTime"], outputs: ["nzOnPanelChange", "nzOnCalendarChange", "nzOnOk", "nzOnOpenChange"], exportAs: ["nzDatePicker"] }, { kind: "component", type: i16.NzCheckboxGroupComponent, selector: "nz-checkbox-group", inputs: ["nzDisabled"], exportAs: ["nzCheckboxGroup"] }, { kind: "component", type: i17.NzAutocompleteComponent, selector: "nz-autocomplete", inputs: ["nzWidth", "nzOverlayClassName", "nzOverlayStyle", "nzDefaultActiveFirstOption", "nzBackfill", "compareWith", "nzDataSource"], outputs: ["selectionChange"], exportAs: ["nzAutocomplete"] }, { kind: "component", type: i17.NzAutocompleteOptionComponent, selector: "nz-auto-option", inputs: ["nzValue", "nzLabel", "nzDisabled"], outputs: ["selectionChange", "mouseEntered"], exportAs: ["nzAutoOption"] }, { kind: "directive", type: i17.NzAutocompleteTriggerDirective, selector: "input[nzAutocomplete], textarea[nzAutocomplete]", inputs: ["nzAutocomplete"], exportAs: ["nzAutocompleteTrigger"] }, { kind: "component", type: i18.NzInputNumberComponent, selector: "nz-input-number", inputs: ["nzSize", "nzMin", "nzMax", "nzParser", "nzPrecision", "nzPrecisionMode", "nzPlaceHolder", "nzStatus", "nzStep", "nzInputMode", "nzId", "nzDisabled", "nzReadOnly", "nzAutoFocus", "nzBorderless", "nzFormatter"], outputs: ["nzBlur", "nzFocus"], exportAs: ["nzInputNumber"] }, { kind: "directive", type: i19.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { kind: "component", type: i20.ColmunsSettingComponent, selector: "app-colmuns-setting", inputs: ["columns", "selectedColumns", "tableName"], outputs: ["afterConfirm"] }, { kind: "component", type: i21.DynamicSearchFieldComponent, selector: "app-dynamic-search-field", inputs: ["component", "value", "props"], outputs: ["valueChange"] }] }); }
1035
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ProTableComponent, selector: "app-pro-table", inputs: { showSearchBtn: "showSearchBtn", showClearBtn: "showClearBtn", title: "title", bodyStyle: "bodyStyle", tableName: "tableName", multiRow: "multiRow", columns: "columns", showSearchBar: "showSearchBar", showActionBar: "showActionBar", confirmBtnText: "confirmBtnText", clearBtnText: "clearBtnText", labelWidth: "labelWidth", labelAlign: "labelAlign", searchColCount: "searchColCount", dataSource: "dataSource", bordered: "bordered", outerBordered: "outerBordered", showPagination: "showPagination", frontPagination: "frontPagination", scroll: "scroll", request: "request", summaryData: "summaryData", sortMode: "sortMode", showColumnSetting: "showColumnSetting", multipleSort: "multipleSort", showCheckbox: "showCheckbox", rowDisabled: "rowDisabled", autoTriggerRequest: "autoTriggerRequest", customTableRender: "customTableRender" }, outputs: { onRowClick: "onRowClick", onRowDbClick: "onRowDbClick", onValuesChange: "onValuesChange", onResetFormBeforeReload: "onResetFormBeforeReload", onColumnsChange: "onColumnsChange" }, queries: [{ propertyName: "customContentTpl", first: true, predicate: ["customContent"], descendants: true }, { propertyName: "actionBarTpl", first: true, predicate: ["actionBar"], descendants: true }, { propertyName: "imgActionBarTpl", first: true, predicate: ["ImgActionBar"], descendants: true }, { propertyName: "allTemplates", predicate: TemplateRef }], ngImport: i0, template: "<app-page-container\r\n [title]=\"title\"\r\n [showHeader]=\"showSearchBar\"\r\n [bodyStyle]=\"bodyStyle\"\r\n ngClass=\"pro-table-container\"\r\n>\r\n <!-- \u589E\u52A0\u81EA\u5B9A\u4E49\u5185\u5BB9\u533A-->\r\n <ng-template #customContent>\r\n <ng-container\r\n *ngIf=\"customContentTpl\"\r\n [ngTemplateOutlet]=\"customContentTpl\"\r\n ></ng-container>\r\n </ng-template>\r\n\r\n <ng-template #header>\r\n <app-table-search-bar\r\n *ngIf=\"showSearchBar\"\r\n [labelWidth]=\"labelWidth\"\r\n [labelAlign]=\"labelAlign\"\r\n [searchColCount]=\"tableSearchColCount\"\r\n >\r\n <ng-template #leftContent>\r\n <nz-form-item\r\n *ngFor=\"let column of _searchFiledColumns\"\r\n [ngClass]=\"getFormItemClassName(column)\"\r\n >\r\n <nz-form-label *ngIf=\"!getFieldProps(column).hideLabel\" nzNoColon>\r\n <!-- \u68C0\u67E5\u662F\u5426\u6709\u81EA\u5B9A\u4E49label\u6A21\u677F -->\r\n <ng-container\r\n *ngIf=\"\r\n column.customLabelRender &&\r\n getLabelTemplate(column.customLabelRender);\r\n else defaultLabel\r\n \"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"getLabelTemplate(column.customLabelRender)\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: column,\r\n column: column,\r\n fieldProps: getFieldProps(column)\r\n }\"\r\n >\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #defaultLabel>\r\n {{ getFieldProps(column).label || column.title }}\r\n </ng-template>\r\n </nz-form-label>\r\n <nz-form-control *ngIf=\"column.valueType === 'input'\">\r\n <input\r\n nz-input\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [placeholder]=\"getFieldProps(column).placeHolder\"\r\n [disabled]=\"getFieldProps(column).disabled\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n />\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'inputPlate'\">\r\n <app-plate-input\r\n [usage]=\"'filter'\"\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n ></app-plate-input>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'select'\">\r\n <nz-select\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [nzShowSearch]=\"getFieldProps(column).showSearch\"\r\n >\r\n <nz-option\r\n *ngFor=\"let opt of getFieldProps(column).options\"\r\n [nzValue]=\"opt.value\"\r\n [nzLabel]=\"opt.label\"\r\n [nzDisabled]=\"opt.disabled\"\r\n [nzTitle]=\"opt.tooltip || opt.label\"\r\n ></nz-option>\r\n </nz-select>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'selectMultiple'\">\r\n <nz-select\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [nzShowSearch]=\"getFieldProps(column).showSearch\"\r\n nzMode=\"multiple\"\r\n [nzMaxTagCount]=\"2\"\r\n [nzMaxTagPlaceholder]=\"nzMaxTagPlaceholder\"\r\n [nzCustomTemplate]=\"defaultTemplate\"\r\n >\r\n <nz-option\r\n *ngFor=\"let opt of getFieldProps(column).options\"\r\n [nzValue]=\"opt.value\"\r\n [nzLabel]=\"opt.label\"\r\n [nzDisabled]=\"opt.disabled\"\r\n [nzTitle]=\"opt.tooltip || opt.label\"\r\n ></nz-option>\r\n <ng-template #nzMaxTagPlaceholder>\r\n +\r\n {{\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n ?.length\r\n }}\r\n </ng-template>\r\n <ng-template #defaultTemplate let-selected>\r\n {{\r\n selected.nzLabel.length > 4\r\n ? selected.nzLabel.substring(0, 4) + \"...\"\r\n : selected.nzLabel\r\n }}\r\n </ng-template>\r\n </nz-select>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'date'\">\r\n <nz-date-picker\r\n [nzShowTime]=\"getFieldProps(column).showTime\"\r\n [nzFormat]=\"getFieldProps(column).format\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzMode]=\"getFieldProps(column).mode\"\r\n ></nz-date-picker>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'checkbox'\">\r\n <nz-checkbox-group\r\n [class]=\"\r\n getFieldProps(column).noStyle\r\n ? 'pro-table-checkboxgroup-nostyle'\r\n : ''\r\n \"\r\n [(ngModel)]=\"getFieldProps(column).options\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n (ngModelChange)=\"\r\n handleFieldCheckBoxChange(\r\n $event,\r\n getFieldProps(column).name || column.prop\r\n )\r\n \"\r\n ></nz-checkbox-group>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'autoComplete'\">\r\n <input\r\n nz-input\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column)?.name || column.prop]\r\n \"\r\n (input)=\"handleAutoCompleteInput($event, column)\"\r\n [nzAutocomplete]=\"auto\"\r\n [disabled]=\"getFieldProps(column)?.disabled\"\r\n [placeholder]=\"getFieldProps(column)?.placeHolder\"\r\n />\r\n <nz-autocomplete\r\n [nzBackfill]=\"getFieldProps(column).backFill\"\r\n [nzDefaultActiveFirstOption]=\"\r\n getFieldProps(column).defaultActiveFirstOption\r\n \"\r\n [nzWidth]=\"getFieldProps(column).width\"\r\n #auto\r\n >\r\n <nz-auto-option\r\n *ngFor=\"let option of getAutoCompleteDataSource(column)\"\r\n [nzValue]=\"\r\n getFieldProps(column).returnFullData ? option : option.value\r\n \"\r\n [nzLabel]=\"option.label\"\r\n [nzDisabled]=\"option.disabled\"\r\n >\r\n {{ option.label }}\r\n </nz-auto-option>\r\n </nz-autocomplete>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'custom'\">\r\n <app-dynamic-search-field\r\n [component]=\"getFieldProps(column).component\"\r\n [value]=\"_searchParams[getFieldProps(column).name || column.prop]\"\r\n [props]=\"getFieldProps(column)\"\r\n (valueChange)=\"\r\n setFieldValue(getFieldProps(column).name || column.prop, $event)\r\n \"\r\n ></app-dynamic-search-field>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'inputNumber'\">\r\n <nz-input-number\r\n [style.width]=\"'100%'\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [nzFormatter]=\"getFieldProps(column).formatterPercent\"\r\n [nzParser]=\"getFieldProps(column).parserPercent\"\r\n ></nz-input-number>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </ng-template>\r\n <ng-template #actionTextBtn>\r\n <nz-space [nzSize]=\"4\">\r\n <ng-template nzSpaceItem *ngIf=\"showSearchBtn\">\r\n <button nz-button nzType=\"primary\" (click)=\"handleSearch()\">\r\n {{ confirmBtnText }}\r\n </button>\r\n </ng-template>\r\n <ng-template nzSpaceItem *ngIf=\"showClearBtn\">\r\n <button nz-button (click)=\"handleResetForm()\">\r\n {{ clearBtnText }}\r\n </button>\r\n </ng-template>\r\n </nz-space>\r\n </ng-template>\r\n <ng-container *ngIf=\"imgActionBarTpl || showColumnSetting\">\r\n <ng-template #actionImgBtn>\r\n <nz-space>\r\n <ng-container *ngTemplateOutlet=\"imgActionBarTpl\"></ng-container>\r\n <ng-template\r\n nzSpaceItem\r\n class=\"setting-space-item\"\r\n *ngIf=\"showColumnSetting\"\r\n >\r\n <span nz-tooltip nzTooltipTitle=\"\u8BBE\u7F6E\u5B57\u6BB5\">\r\n <app-colmuns-setting\r\n [columns]=\"columns\"\r\n [selectedColumns]=\"_serverColumns\"\r\n [tableName]=\"tableName\"\r\n (afterConfirm)=\"handleColumnsSettingConfirm($event)\"\r\n ></app-colmuns-setting>\r\n </span>\r\n </ng-template>\r\n </nz-space>\r\n </ng-template>\r\n </ng-container>\r\n </app-table-search-bar>\r\n </ng-template>\r\n\r\n <ng-template #body>\r\n <div class=\"mb-4\">\r\n <ng-container *ngIf=\"showActionBar\">\r\n <ng-container *ngTemplateOutlet=\"actionBarTpl\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngIf=\"customTableRender\">\r\n <ng-container *ngTemplateOutlet=\"customTableRender\"></ng-container>\r\n </ng-container>\r\n <div [class.pro-table-auto-scroll]=\"scroll?.x === 'auto'\">\r\n <nz-table\r\n *ngIf=\"!customTableRender && _columnsReady\"\r\n #dynamicTable\r\n nzSize=\"small\"\r\n nzShowSizeChanger\r\n [nzBordered]=\"bordered\"\r\n [nzOuterBordered]=\"outerBordered\"\r\n [nzData]=\"dataSource\"\r\n [nzPageIndex]=\"_pageInfo.pageIndex\"\r\n [nzPageSize]=\"_pageInfo.pageSize\"\r\n [nzTotal]=\"_pageInfo.total\"\r\n [nzPageSizeOptions]=\"_pageInfo.pageSizeOptions\"\r\n [nzShowPagination]=\"showPagination\"\r\n [nzShowTotal]=\"totalTemplate\"\r\n [nzLoading]=\"_loading\"\r\n [nzFrontPagination]=\"frontPagination\"\r\n [nzScroll]=\"_computedScroll\"\r\n (nzPageIndexChange)=\"handlePageIndexChange($event)\"\r\n (nzPageSizeChange)=\"handlePageSizeChange($event)\"\r\n >\r\n <thead>\r\n <tr>\r\n <!-- \u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF09 -->\r\n <th\r\n *ngIf=\"showCheckbox\"\r\n [nzWidth]=\"'50px'\"\r\n [nzAlign]=\"'center'\"\r\n style=\"text-align: center\"\r\n [(nzChecked)]=\"_checkedAll\"\r\n [nzIndeterminate]=\"_indeterminate\"\r\n (nzCheckedChange)=\"toggleCheckAll($event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n ></th>\r\n <th\r\n *ngFor=\"let column of _columns\"\r\n [nzWidth]=\"column.width\"\r\n [nzAlign]=\"column.align\"\r\n [nzLeft]=\"column._nzLeft\"\r\n [nzRight]=\"column._nzRight\"\r\n [nzShowSort]=\"!!column.sorter\"\r\n [nzSortOrder]=\"getSortOrder(column.prop)\"\r\n (nzSortOrderChange)=\"onSortChange(column.prop, $event)\"\r\n >\r\n {{ column.title }}\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <tr\r\n style=\"cursor: pointer\"\r\n *ngFor=\"let data; let i = index; of: dynamicTable.data\"\r\n [ngClass]=\"{\r\n 'ant-table-custom-row-selected': !!getTableRowChecked(data),\r\n 'ant-table-custom-row-even': i % 2 === 0,\r\n 'ant-table-custom-row-odd': i % 2 !== 0\r\n }\"\r\n (click)=\"handleTableRowClick(data)\"\r\n (dblclick)=\"handleTableRowDbClick(data)\"\r\n >\r\n <!-- \u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF09 -->\r\n <td\r\n *ngIf=\"showCheckbox\"\r\n [nzAlign]=\"'center'\"\r\n style=\"text-align: center; width: 50px\"\r\n [(nzChecked)]=\"data.checked\"\r\n [nzDisabled]=\"isRowDisabled(data)\"\r\n (nzCheckedChange)=\"handleRowCheckedChange(data, $event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n ></td>\r\n <td\r\n *ngFor=\"let column of _columns\"\r\n [nzLeft]=\"column._nzLeft\"\r\n [nzRight]=\"column._nzRight\"\r\n [nzAlign]=\"column.align\"\r\n [ngClass]=\"{\r\n 'pro-nowrap': true\r\n }\"\r\n >\r\n <!-- \u68C0\u67E5\u662F\u5426\u6709\u81EA\u5B9A\u4E49\u6A21\u677F -->\r\n <ng-container\r\n *ngIf=\"\r\n column.customRender && getTemplate(column.customRender);\r\n let template\r\n \"\r\n >\r\n <ng-template\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: data,\r\n data: data,\r\n column: column,\r\n index: i,\r\n pageInfo: _pageInfo\r\n }\"\r\n >\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- \u9ED8\u8BA4\u6E32\u67D3\u903B\u8F91 -->\r\n <ng-container\r\n *ngIf=\"\r\n !column.customRender || !getTemplate(column.customRender)\r\n \"\r\n >\r\n <ng-container *ngIf=\"column.ellipsis\">\r\n <div\r\n class=\"pro-ellipsis\"\r\n [title]=\"data[column.prop]\"\r\n [ngStyle]=\"{\r\n width: 'calc(' + column.width + ' - 25px)'\r\n }\"\r\n >\r\n {{ data[column.prop] }}\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!column.ellipsis\">\r\n {{ data[column.prop] }}\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"summaryData && _pageInfo.total > 0\">\r\n <!-- \u6C47\u603B\u884C\u7684\u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF0C\u4F46\u4E3A\u7A7A\uFF09 -->\r\n <td\r\n *ngIf=\"showCheckbox\"\r\n style=\"font-weight: bold; border-right: 1px solid #e8e8e8\"\r\n ></td>\r\n <td\r\n *ngFor=\"let column; let i = index; of: _columns\"\r\n [nzLeft]=\"column._nzLeft\"\r\n [nzRight]=\"column._nzRight\"\r\n style=\"font-weight: bold; border-right: 1px solid #e8e8e8\"\r\n [nzAlign]=\"column.align\"\r\n >\r\n <span *ngIf=\"i === 0\">\u603B\u8BA1</span>\r\n <ng-container *ngIf=\"i !== 0 && column.summary\">\r\n {{\r\n column.summary?.format\r\n ? column.summary?.format(\r\n summaryData[column.summary?.name || column.prop]\r\n )\r\n : summaryData[column.summary?.name || column.prop]\r\n }}\r\n </ng-container>\r\n </td>\r\n </tr>\r\n </tbody>\r\n <ng-template #totalTemplate let-total\r\n >\u5171 {{ _pageInfo.total }} \u6761\u8BB0\u5F55</ng-template\r\n >\r\n </nz-table>\r\n </div>\r\n </ng-template>\r\n</app-page-container>\r\n", styles: [".pro-ellipsis{overflow:hidden;text-overflow:ellipsis}.pro-nowrap{white-space:nowrap}::ng-deep .setting-space-item{margin-right:0!important}::ng-deep .pro-table-checkboxgroup-nostyle{white-space:nowrap}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body table{border-collapse:separate;border-spacing:0}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td{border-right:1px solid #e8e8e8!important}::ng-deep .ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>thead>tr>th{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important;white-space:nowrap}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-thead>tr>th:first-child,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td:first-child{border-left:none!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-cell-fix-left,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-cell-fix-right{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th.ant-table-cell-fix-left,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th.ant-table-cell-fix-right{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th{border-top:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-thead>tr>th:last-child,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td:last-child{border-right:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr:last-child>td{border-bottom:1px solid #e8e8e8!important}::ng-deep .table-search-bar-left .ant-form-item{margin-bottom:4px}::ng-deep .table-search-bar-left .ant-form-item .ant-form-item-label>label{color:#5a5a5a}::ng-deep .pro-table-container .page-container-body{padding:8px 0 0!important}::ng-deep .pro-table-auto-scroll .ant-table-content,::ng-deep .pro-table-auto-scroll .ant-table-body{overflow-x:auto!important}::ng-deep .pro-table-auto-scroll .ant-table-content table,::ng-deep .pro-table-auto-scroll .ant-table-body table{table-layout:auto!important}::ng-deep .pro-table-auto-scroll .ant-table-content table td,::ng-deep .pro-table-auto-scroll .ant-table-body table td{white-space:nowrap}::ng-deep .ant-table-cell-fix-left-last{box-shadow:6px 0 8px -4px #00000026;clip-path:inset(0px -8px 0px 0px)}::ng-deep .ant-table-cell-fix-right-first{box-shadow:-6px 0 8px -4px #00000026;clip-path:inset(0px 0px 0px -8px)}::ng-deep .ant-table-tbody>tr:hover>td.ant-table-cell-fix-left,::ng-deep .ant-table-tbody>tr:hover>td.ant-table-cell-fix-right,::ng-deep .ant-table-tbody>tr.ant-table-custom-row-selected>td.ant-table-cell-fix-left,::ng-deep .ant-table-tbody>tr.ant-table-custom-row-selected>td.ant-table-cell-fix-right{background:#e8f0fb}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i3.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "component", type: i4.NzFormItemComponent, selector: "nz-form-item", exportAs: ["nzFormItem"] }, { kind: "component", type: i4.NzFormLabelComponent, selector: "nz-form-label", inputs: ["nzFor", "nzRequired", "nzNoColon", "nzTooltipTitle", "nzTooltipIcon", "nzLabelAlign", "nzLabelWrap"], exportAs: ["nzFormLabel"] }, { kind: "component", type: i4.NzFormControlComponent, selector: "nz-form-control", inputs: ["nzSuccessTip", "nzWarningTip", "nzErrorTip", "nzValidatingTip", "nzExtra", "nzAutoTips", "nzDisableAutoTips", "nzHasFeedback", "nzValidateStatus"], exportAs: ["nzFormControl"] }, { kind: "component", type: i5.NzOptionComponent, selector: "nz-option", inputs: ["nzTitle", "nzLabel", "nzValue", "nzKey", "nzDisabled", "nzHide", "nzCustomContent"], exportAs: ["nzOption"] }, { kind: "component", type: i5.NzSelectComponent, selector: "nz-select", inputs: ["nzId", "nzSize", "nzStatus", "nzOptionHeightPx", "nzOptionOverflowSize", "nzDropdownClassName", "nzDropdownMatchSelectWidth", "nzDropdownStyle", "nzNotFoundContent", "nzPlaceHolder", "nzPlacement", "nzMaxTagCount", "nzDropdownRender", "nzCustomTemplate", "nzSuffixIcon", "nzClearIcon", "nzRemoveIcon", "nzMenuItemSelectedIcon", "nzTokenSeparators", "nzMaxTagPlaceholder", "nzMaxMultipleCount", "nzMode", "nzFilterOption", "compareWith", "nzAllowClear", "nzBorderless", "nzShowSearch", "nzLoading", "nzAutoFocus", "nzAutoClearSearchValue", "nzServerSearch", "nzDisabled", "nzOpen", "nzSelectOnTab", "nzBackdrop", "nzOptions", "nzShowArrow"], outputs: ["nzOnSearch", "nzScrollToBottom", "nzOpenChange", "nzBlur", "nzFocus"], exportAs: ["nzSelect"] }, { kind: "component", type: i6.NzSpaceComponent, selector: "nz-space, [nz-space]", inputs: ["nzDirection", "nzAlign", "nzSplit", "nzWrap", "nzSize"], exportAs: ["NzSpace"] }, { kind: "directive", type: i6.NzSpaceItemDirective, selector: "[nzSpaceItem]" }, { kind: "directive", type: i7.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i8.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i9.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i10.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "component", type: i11.PageContainerComponent, selector: "app-page-container", inputs: ["title", "showHeader", "bodyStyle", "headerStyle"] }, { kind: "component", type: i12.TableSearchBarComponent, selector: "app-table-search-bar", inputs: ["labelWidth", "labelAlign", "searchColCount"] }, { kind: "component", type: i13.NzTableComponent, selector: "nz-table", inputs: ["nzTableLayout", "nzShowTotal", "nzItemRender", "nzTitle", "nzFooter", "nzNoResult", "nzPageSizeOptions", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualForTrackBy", "nzLoadingDelay", "nzPageIndex", "nzPageSize", "nzTotal", "nzWidthConfig", "nzData", "nzCustomColumn", "nzPaginationPosition", "nzScroll", "nzPaginationType", "nzFrontPagination", "nzTemplateMode", "nzShowPagination", "nzLoading", "nzOuterBordered", "nzLoadingIndicator", "nzBordered", "nzSize", "nzShowSizeChanger", "nzHideOnSinglePage", "nzShowQuickJumper", "nzSimple"], outputs: ["nzPageSizeChange", "nzPageIndexChange", "nzQueryParams", "nzCurrentPageDataChange", "nzCustomColumnChange"], exportAs: ["nzTable"] }, { kind: "component", type: i13.NzThAddOnComponent, selector: "th[nzColumnKey], th[nzSortFn], th[nzSortOrder], th[nzFilters], th[nzShowSort], th[nzShowFilter], th[nzCustomFilter]", inputs: ["nzColumnKey", "nzFilterMultiple", "nzSortOrder", "nzSortPriority", "nzSortDirections", "nzFilters", "nzSortFn", "nzFilterFn", "nzShowSort", "nzShowFilter", "nzCustomFilter"], outputs: ["nzCheckedChange", "nzSortOrderChange", "nzFilterChange"] }, { kind: "directive", type: i13.NzTableCellDirective, selector: "th:not(.nz-disable-th):not([mat-cell]), td:not(.nz-disable-td):not([mat-cell])" }, { kind: "directive", type: i13.NzThMeasureDirective, selector: "th", inputs: ["nzWidth", "colspan", "colSpan", "rowspan", "rowSpan"] }, { kind: "component", type: i13.NzTdAddOnComponent, selector: "td[nzChecked], td[nzDisabled], td[nzIndeterminate], td[nzIndentSize], td[nzExpand], td[nzShowExpand], td[nzShowCheckbox]", inputs: ["nzChecked", "nzDisabled", "nzIndeterminate", "nzIndentSize", "nzShowExpand", "nzShowCheckbox", "nzExpand"], outputs: ["nzCheckedChange", "nzExpandChange"] }, { kind: "component", type: i13.NzTheadComponent, selector: "thead:not(.ant-table-thead)", outputs: ["nzSortOrderChange"] }, { kind: "component", type: i13.NzTbodyComponent, selector: "tbody" }, { kind: "directive", type: i13.NzTrDirective, selector: "tr:not([mat-row]):not([mat-header-row]):not([nz-table-measure-row]):not([nzExpand]):not([nz-table-fixed-row])" }, { kind: "directive", type: i13.NzCellFixedDirective, selector: "td[nzRight],th[nzRight],td[nzLeft],th[nzLeft]", inputs: ["nzRight", "nzLeft", "colspan", "colSpan"] }, { kind: "directive", type: i13.NzCellAlignDirective, selector: "th[nzAlign],td[nzAlign]", inputs: ["nzAlign"] }, { kind: "component", type: i13.NzThSelectionComponent, selector: "th[nzSelections],th[nzChecked],th[nzShowCheckbox],th[nzShowRowSelection]", inputs: ["nzSelections", "nzChecked", "nzDisabled", "nzIndeterminate", "nzShowCheckbox", "nzShowRowSelection"], outputs: ["nzCheckedChange"] }, { kind: "component", type: i14.PlateInputComponent, selector: "app-plate-input", inputs: ["usage"] }, { kind: "component", type: i15.NzDatePickerComponent, selector: "nz-date-picker,nz-week-picker,nz-month-picker,nz-year-picker,nz-range-picker", inputs: ["nzAllowClear", "nzAutoFocus", "nzDisabled", "nzBorderless", "nzInputReadOnly", "nzInline", "nzOpen", "nzDisabledDate", "nzLocale", "nzPlaceHolder", "nzPopupStyle", "nzDropdownClassName", "nzSize", "nzStatus", "nzFormat", "nzDateRender", "nzDisabledTime", "nzRenderExtraFooter", "nzShowToday", "nzMode", "nzShowNow", "nzRanges", "nzDefaultPickerValue", "nzSeparator", "nzSuffixIcon", "nzBackdrop", "nzId", "nzPlacement", "nzShowWeekNumber", "nzShowTime"], outputs: ["nzOnPanelChange", "nzOnCalendarChange", "nzOnOk", "nzOnOpenChange"], exportAs: ["nzDatePicker"] }, { kind: "component", type: i16.NzCheckboxGroupComponent, selector: "nz-checkbox-group", inputs: ["nzDisabled"], exportAs: ["nzCheckboxGroup"] }, { kind: "component", type: i17.NzAutocompleteComponent, selector: "nz-autocomplete", inputs: ["nzWidth", "nzOverlayClassName", "nzOverlayStyle", "nzDefaultActiveFirstOption", "nzBackfill", "compareWith", "nzDataSource"], outputs: ["selectionChange"], exportAs: ["nzAutocomplete"] }, { kind: "component", type: i17.NzAutocompleteOptionComponent, selector: "nz-auto-option", inputs: ["nzValue", "nzLabel", "nzDisabled"], outputs: ["selectionChange", "mouseEntered"], exportAs: ["nzAutoOption"] }, { kind: "directive", type: i17.NzAutocompleteTriggerDirective, selector: "input[nzAutocomplete], textarea[nzAutocomplete]", inputs: ["nzAutocomplete"], exportAs: ["nzAutocompleteTrigger"] }, { kind: "component", type: i18.NzInputNumberComponent, selector: "nz-input-number", inputs: ["nzSize", "nzMin", "nzMax", "nzParser", "nzPrecision", "nzPrecisionMode", "nzPlaceHolder", "nzStatus", "nzStep", "nzInputMode", "nzId", "nzDisabled", "nzReadOnly", "nzAutoFocus", "nzBorderless", "nzFormatter"], outputs: ["nzBlur", "nzFocus"], exportAs: ["nzInputNumber"] }, { kind: "directive", type: i19.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { kind: "component", type: i20.ColmunsSettingComponent, selector: "app-colmuns-setting", inputs: ["columns", "selectedColumns", "tableName"], outputs: ["afterConfirm"] }, { kind: "component", type: i21.DynamicSearchFieldComponent, selector: "app-dynamic-search-field", inputs: ["component", "value", "props"], outputs: ["valueChange"] }] }); }
1018
1036
  }
1019
1037
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProTableComponent, decorators: [{
1020
1038
  type: Component,
1021
- args: [{ selector: "app-pro-table", template: "<app-page-container\r\n [title]=\"title\"\r\n [showHeader]=\"showSearchBar\"\r\n [bodyStyle]=\"bodyStyle\"\r\n ngClass=\"pro-table-container\"\r\n>\r\n <!-- \u589E\u52A0\u81EA\u5B9A\u4E49\u5185\u5BB9\u533A-->\r\n <ng-template #customContent>\r\n <ng-container\r\n *ngIf=\"customContentTpl\"\r\n [ngTemplateOutlet]=\"customContentTpl\"\r\n ></ng-container>\r\n </ng-template>\r\n\r\n <ng-template #header>\r\n <app-table-search-bar\r\n *ngIf=\"showSearchBar\"\r\n [labelWidth]=\"labelWidth\"\r\n [labelAlign]=\"labelAlign\"\r\n [searchColCount]=\"tableSearchColCount\"\r\n >\r\n <ng-template #leftContent>\r\n <nz-form-item\r\n *ngFor=\"let column of _searchFiledColumns\"\r\n [ngClass]=\"getFormItemClassName(column)\"\r\n >\r\n <nz-form-label *ngIf=\"!getFieldProps(column).hideLabel\" nzNoColon>\r\n <!-- \u68C0\u67E5\u662F\u5426\u6709\u81EA\u5B9A\u4E49label\u6A21\u677F -->\r\n <ng-container\r\n *ngIf=\"\r\n column.customLabelRender &&\r\n getLabelTemplate(column.customLabelRender);\r\n else defaultLabel\r\n \"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"getLabelTemplate(column.customLabelRender)\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: column,\r\n column: column,\r\n fieldProps: getFieldProps(column)\r\n }\"\r\n >\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #defaultLabel>\r\n {{ getFieldProps(column).label || column.title }}\r\n </ng-template>\r\n </nz-form-label>\r\n <nz-form-control *ngIf=\"column.valueType === 'input'\">\r\n <input\r\n nz-input\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [placeholder]=\"getFieldProps(column).placeHolder\"\r\n [disabled]=\"getFieldProps(column).disabled\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n />\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'inputPlate'\">\r\n <app-plate-input\r\n [usage]=\"'filter'\"\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n ></app-plate-input>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'select'\">\r\n <nz-select\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [nzShowSearch]=\"getFieldProps(column).showSearch\"\r\n >\r\n <nz-option\r\n *ngFor=\"let opt of getFieldProps(column).options\"\r\n [nzValue]=\"opt.value\"\r\n [nzLabel]=\"opt.label\"\r\n [nzDisabled]=\"opt.disabled\"\r\n [nzTitle]=\"opt.tooltip || opt.label\"\r\n ></nz-option>\r\n </nz-select>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'selectMultiple'\">\r\n <nz-select\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [nzShowSearch]=\"getFieldProps(column).showSearch\"\r\n nzMode=\"multiple\"\r\n [nzMaxTagCount]=\"2\"\r\n [nzMaxTagPlaceholder]=\"nzMaxTagPlaceholder\"\r\n [nzCustomTemplate]=\"defaultTemplate\"\r\n >\r\n <nz-option\r\n *ngFor=\"let opt of getFieldProps(column).options\"\r\n [nzValue]=\"opt.value\"\r\n [nzLabel]=\"opt.label\"\r\n [nzDisabled]=\"opt.disabled\"\r\n [nzTitle]=\"opt.tooltip || opt.label\"\r\n ></nz-option>\r\n <ng-template #nzMaxTagPlaceholder>\r\n +\r\n {{\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n ?.length\r\n }}\r\n </ng-template>\r\n <ng-template #defaultTemplate let-selected>\r\n {{\r\n selected.nzLabel.length > 4\r\n ? selected.nzLabel.substring(0, 4) + \"...\"\r\n : selected.nzLabel\r\n }}\r\n </ng-template>\r\n </nz-select>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'date'\">\r\n <nz-date-picker\r\n [nzShowTime]=\"getFieldProps(column).showTime\"\r\n [nzFormat]=\"getFieldProps(column).format\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzMode]=\"getFieldProps(column).mode\"\r\n ></nz-date-picker>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'checkbox'\">\r\n <nz-checkbox-group\r\n [class]=\"\r\n getFieldProps(column).noStyle\r\n ? 'pro-table-checkboxgroup-nostyle'\r\n : ''\r\n \"\r\n [(ngModel)]=\"getFieldProps(column).options\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n (ngModelChange)=\"\r\n handleFieldCheckBoxChange(\r\n $event,\r\n getFieldProps(column).name || column.prop\r\n )\r\n \"\r\n ></nz-checkbox-group>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'autoComplete'\">\r\n <input\r\n nz-input\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column)?.name || column.prop]\r\n \"\r\n (input)=\"handleAutoCompleteInput($event, column)\"\r\n [nzAutocomplete]=\"auto\"\r\n [disabled]=\"getFieldProps(column)?.disabled\"\r\n [placeholder]=\"getFieldProps(column)?.placeHolder\"\r\n />\r\n <nz-autocomplete\r\n [nzBackfill]=\"getFieldProps(column).backFill\"\r\n [nzDefaultActiveFirstOption]=\"\r\n getFieldProps(column).defaultActiveFirstOption\r\n \"\r\n [nzWidth]=\"getFieldProps(column).width\"\r\n #auto\r\n >\r\n <nz-auto-option\r\n *ngFor=\"let option of getAutoCompleteDataSource(column)\"\r\n [nzValue]=\"\r\n getFieldProps(column).returnFullData ? option : option.value\r\n \"\r\n [nzLabel]=\"option.label\"\r\n [nzDisabled]=\"option.disabled\"\r\n >\r\n {{ option.label }}\r\n </nz-auto-option>\r\n </nz-autocomplete>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'custom'\">\r\n <app-dynamic-search-field\r\n [component]=\"getFieldProps(column).component\"\r\n [value]=\"_searchParams[getFieldProps(column).name || column.prop]\"\r\n [props]=\"getFieldProps(column)\"\r\n (valueChange)=\"\r\n setFieldValue(getFieldProps(column).name || column.prop, $event)\r\n \"\r\n ></app-dynamic-search-field>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'inputNumber'\">\r\n <nz-input-number\r\n [style.width]=\"'100%'\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [nzFormatter]=\"getFieldProps(column).formatterPercent\"\r\n [nzParser]=\"getFieldProps(column).parserPercent\"\r\n ></nz-input-number>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </ng-template>\r\n <ng-template #actionTextBtn>\r\n <nz-space [nzSize]=\"4\">\r\n <ng-template nzSpaceItem *ngIf=\"showSearchBtn\">\r\n <button nz-button nzType=\"primary\" (click)=\"handleSearch()\">\r\n {{ confirmBtnText }}\r\n </button>\r\n </ng-template>\r\n <ng-template nzSpaceItem *ngIf=\"showClearBtn\">\r\n <button nz-button (click)=\"handleResetForm()\">\r\n {{ clearBtnText }}\r\n </button>\r\n </ng-template>\r\n </nz-space>\r\n </ng-template>\r\n <ng-container *ngIf=\"imgActionBarTpl || showColumnSetting\">\r\n <ng-template #actionImgBtn>\r\n <nz-space>\r\n <ng-container *ngTemplateOutlet=\"imgActionBarTpl\"></ng-container>\r\n <ng-template\r\n nzSpaceItem\r\n class=\"setting-space-item\"\r\n *ngIf=\"showColumnSetting\"\r\n >\r\n <span nz-tooltip nzTooltipTitle=\"\u8BBE\u7F6E\u5B57\u6BB5\">\r\n <app-colmuns-setting\r\n [columns]=\"columns\"\r\n [selectedColumns]=\"_serverColumns\"\r\n [tableName]=\"tableName\"\r\n (afterConfirm)=\"handleColumnsSettingConfirm()\"\r\n ></app-colmuns-setting>\r\n </span>\r\n </ng-template>\r\n </nz-space>\r\n </ng-template>\r\n </ng-container>\r\n </app-table-search-bar>\r\n </ng-template>\r\n\r\n <ng-template #body>\r\n <div class=\"mb-4\">\r\n <ng-container *ngIf=\"showActionBar\">\r\n <ng-container *ngTemplateOutlet=\"actionBarTpl\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngIf=\"customTableRender\">\r\n <ng-container *ngTemplateOutlet=\"customTableRender\"></ng-container>\r\n </ng-container>\r\n <div [class.pro-table-auto-scroll]=\"scroll?.x === 'auto'\">\r\n <nz-table\r\n *ngIf=\"!customTableRender && _columnsReady\"\r\n #dynamicTable\r\n nzSize=\"small\"\r\n nzShowSizeChanger\r\n [nzBordered]=\"bordered\"\r\n [nzOuterBordered]=\"outerBordered\"\r\n [nzData]=\"dataSource\"\r\n [nzPageIndex]=\"_pageInfo.pageIndex\"\r\n [nzPageSize]=\"_pageInfo.pageSize\"\r\n [nzTotal]=\"_pageInfo.total\"\r\n [nzPageSizeOptions]=\"_pageInfo.pageSizeOptions\"\r\n [nzShowPagination]=\"showPagination\"\r\n [nzShowTotal]=\"totalTemplate\"\r\n [nzLoading]=\"_loading\"\r\n [nzFrontPagination]=\"frontPagination\"\r\n [nzScroll]=\"_computedScroll\"\r\n (nzPageIndexChange)=\"handlePageIndexChange($event)\"\r\n (nzPageSizeChange)=\"handlePageSizeChange($event)\"\r\n >\r\n <thead>\r\n <tr>\r\n <!-- \u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF09 -->\r\n <th\r\n *ngIf=\"showCheckbox\"\r\n [nzWidth]=\"'50px'\"\r\n [nzAlign]=\"'center'\"\r\n style=\"text-align: center\"\r\n [(nzChecked)]=\"_checkedAll\"\r\n [nzIndeterminate]=\"_indeterminate\"\r\n (nzCheckedChange)=\"toggleCheckAll($event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n ></th>\r\n <th\r\n *ngFor=\"let column of _columns\"\r\n [nzWidth]=\"column.width\"\r\n [nzAlign]=\"column.align\"\r\n [nzLeft]=\"column._nzLeft\"\r\n [nzRight]=\"column._nzRight\"\r\n [nzShowSort]=\"!!column.sorter\"\r\n [nzSortOrder]=\"getSortOrder(column.prop)\"\r\n (nzSortOrderChange)=\"onSortChange(column.prop, $event)\"\r\n >\r\n {{ column.title }}\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <tr\r\n style=\"cursor: pointer\"\r\n *ngFor=\"let data; let i = index; of: dynamicTable.data\"\r\n [ngClass]=\"{\r\n 'ant-table-custom-row-selected': !!getTableRowChecked(data),\r\n 'ant-table-custom-row-even': i % 2 === 0,\r\n 'ant-table-custom-row-odd': i % 2 !== 0\r\n }\"\r\n (click)=\"handleTableRowClick(data)\"\r\n (dblclick)=\"handleTableRowDbClick(data)\"\r\n >\r\n <!-- \u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF09 -->\r\n <td\r\n *ngIf=\"showCheckbox\"\r\n [nzAlign]=\"'center'\"\r\n style=\"text-align: center; width: 50px\"\r\n [(nzChecked)]=\"data.checked\"\r\n [nzDisabled]=\"isRowDisabled(data)\"\r\n (nzCheckedChange)=\"handleRowCheckedChange(data, $event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n ></td>\r\n <td\r\n *ngFor=\"let column of _columns\"\r\n [nzLeft]=\"column._nzLeft\"\r\n [nzRight]=\"column._nzRight\"\r\n [nzAlign]=\"column.align\"\r\n [ngClass]=\"{\r\n 'pro-nowrap': true\r\n }\"\r\n >\r\n <!-- \u68C0\u67E5\u662F\u5426\u6709\u81EA\u5B9A\u4E49\u6A21\u677F -->\r\n <ng-container\r\n *ngIf=\"\r\n column.customRender && getTemplate(column.customRender);\r\n let template\r\n \"\r\n >\r\n <ng-template\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: data,\r\n data: data,\r\n column: column,\r\n index: i,\r\n pageInfo: _pageInfo\r\n }\"\r\n >\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- \u9ED8\u8BA4\u6E32\u67D3\u903B\u8F91 -->\r\n <ng-container\r\n *ngIf=\"\r\n !column.customRender || !getTemplate(column.customRender)\r\n \"\r\n >\r\n <ng-container *ngIf=\"column.ellipsis\">\r\n <div\r\n class=\"pro-ellipsis\"\r\n [title]=\"data[column.prop]\"\r\n [ngStyle]=\"{\r\n width: 'calc(' + column.width + ' - 25px)'\r\n }\"\r\n >\r\n {{ data[column.prop] }}\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!column.ellipsis\">\r\n {{ data[column.prop] }}\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"summaryData && _pageInfo.total > 0\">\r\n <!-- \u6C47\u603B\u884C\u7684\u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF0C\u4F46\u4E3A\u7A7A\uFF09 -->\r\n <td\r\n *ngIf=\"showCheckbox\"\r\n style=\"font-weight: bold; border-right: 1px solid #e8e8e8\"\r\n ></td>\r\n <td\r\n *ngFor=\"let column; let i = index; of: _columns\"\r\n [nzLeft]=\"column._nzLeft\"\r\n [nzRight]=\"column._nzRight\"\r\n style=\"font-weight: bold; border-right: 1px solid #e8e8e8\"\r\n [nzAlign]=\"column.align\"\r\n >\r\n <span *ngIf=\"i === 0\">\u603B\u8BA1</span>\r\n <ng-container *ngIf=\"i !== 0 && column.summary\">\r\n {{\r\n column.summary?.format\r\n ? column.summary?.format(\r\n summaryData[column.summary?.name || column.prop]\r\n )\r\n : summaryData[column.summary?.name || column.prop]\r\n }}\r\n </ng-container>\r\n </td>\r\n </tr>\r\n </tbody>\r\n <ng-template #totalTemplate let-total\r\n >\u5171 {{ _pageInfo.total }} \u6761\u8BB0\u5F55</ng-template\r\n >\r\n </nz-table>\r\n </div>\r\n </ng-template>\r\n</app-page-container>\r\n", styles: [".pro-ellipsis{overflow:hidden;text-overflow:ellipsis}.pro-nowrap{white-space:nowrap}::ng-deep .setting-space-item{margin-right:0!important}::ng-deep .pro-table-checkboxgroup-nostyle{white-space:nowrap}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body table{border-collapse:separate;border-spacing:0}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td{border-right:1px solid #e8e8e8!important}::ng-deep .ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>thead>tr>th{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important;white-space:nowrap}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-thead>tr>th:first-child,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td:first-child{border-left:none!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-cell-fix-left,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-cell-fix-right{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th.ant-table-cell-fix-left,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th.ant-table-cell-fix-right{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th{border-top:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-thead>tr>th:last-child,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td:last-child{border-right:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr:last-child>td{border-bottom:1px solid #e8e8e8!important}::ng-deep .table-search-bar-left .ant-form-item{margin-bottom:4px}::ng-deep .table-search-bar-left .ant-form-item .ant-form-item-label>label{color:#5a5a5a}::ng-deep .pro-table-container .page-container-body{padding:8px 0 0!important}::ng-deep .pro-table-auto-scroll .ant-table-content,::ng-deep .pro-table-auto-scroll .ant-table-body{overflow-x:auto!important}::ng-deep .pro-table-auto-scroll .ant-table-content table,::ng-deep .pro-table-auto-scroll .ant-table-body table{table-layout:auto!important}::ng-deep .pro-table-auto-scroll .ant-table-content table td,::ng-deep .pro-table-auto-scroll .ant-table-body table td{white-space:nowrap}::ng-deep .ant-table-cell-fix-left-last{box-shadow:6px 0 8px -4px #00000026;clip-path:inset(0px -8px 0px 0px)}::ng-deep .ant-table-cell-fix-right-first{box-shadow:-6px 0 8px -4px #00000026;clip-path:inset(0px 0px 0px -8px)}::ng-deep .ant-table-tbody>tr:hover>td.ant-table-cell-fix-left,::ng-deep .ant-table-tbody>tr:hover>td.ant-table-cell-fix-right,::ng-deep .ant-table-tbody>tr.ant-table-custom-row-selected>td.ant-table-cell-fix-left,::ng-deep .ant-table-tbody>tr.ant-table-custom-row-selected>td.ant-table-cell-fix-right{background:#e8f0fb}\n"] }]
1039
+ args: [{ selector: "app-pro-table", template: "<app-page-container\r\n [title]=\"title\"\r\n [showHeader]=\"showSearchBar\"\r\n [bodyStyle]=\"bodyStyle\"\r\n ngClass=\"pro-table-container\"\r\n>\r\n <!-- \u589E\u52A0\u81EA\u5B9A\u4E49\u5185\u5BB9\u533A-->\r\n <ng-template #customContent>\r\n <ng-container\r\n *ngIf=\"customContentTpl\"\r\n [ngTemplateOutlet]=\"customContentTpl\"\r\n ></ng-container>\r\n </ng-template>\r\n\r\n <ng-template #header>\r\n <app-table-search-bar\r\n *ngIf=\"showSearchBar\"\r\n [labelWidth]=\"labelWidth\"\r\n [labelAlign]=\"labelAlign\"\r\n [searchColCount]=\"tableSearchColCount\"\r\n >\r\n <ng-template #leftContent>\r\n <nz-form-item\r\n *ngFor=\"let column of _searchFiledColumns\"\r\n [ngClass]=\"getFormItemClassName(column)\"\r\n >\r\n <nz-form-label *ngIf=\"!getFieldProps(column).hideLabel\" nzNoColon>\r\n <!-- \u68C0\u67E5\u662F\u5426\u6709\u81EA\u5B9A\u4E49label\u6A21\u677F -->\r\n <ng-container\r\n *ngIf=\"\r\n column.customLabelRender &&\r\n getLabelTemplate(column.customLabelRender);\r\n else defaultLabel\r\n \"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"getLabelTemplate(column.customLabelRender)\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: column,\r\n column: column,\r\n fieldProps: getFieldProps(column)\r\n }\"\r\n >\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #defaultLabel>\r\n {{ getFieldProps(column).label || column.title }}\r\n </ng-template>\r\n </nz-form-label>\r\n <nz-form-control *ngIf=\"column.valueType === 'input'\">\r\n <input\r\n nz-input\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [placeholder]=\"getFieldProps(column).placeHolder\"\r\n [disabled]=\"getFieldProps(column).disabled\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n />\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'inputPlate'\">\r\n <app-plate-input\r\n [usage]=\"'filter'\"\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n ></app-plate-input>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'select'\">\r\n <nz-select\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [nzShowSearch]=\"getFieldProps(column).showSearch\"\r\n >\r\n <nz-option\r\n *ngFor=\"let opt of getFieldProps(column).options\"\r\n [nzValue]=\"opt.value\"\r\n [nzLabel]=\"opt.label\"\r\n [nzDisabled]=\"opt.disabled\"\r\n [nzTitle]=\"opt.tooltip || opt.label\"\r\n ></nz-option>\r\n </nz-select>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'selectMultiple'\">\r\n <nz-select\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [nzShowSearch]=\"getFieldProps(column).showSearch\"\r\n nzMode=\"multiple\"\r\n [nzMaxTagCount]=\"2\"\r\n [nzMaxTagPlaceholder]=\"nzMaxTagPlaceholder\"\r\n [nzCustomTemplate]=\"defaultTemplate\"\r\n >\r\n <nz-option\r\n *ngFor=\"let opt of getFieldProps(column).options\"\r\n [nzValue]=\"opt.value\"\r\n [nzLabel]=\"opt.label\"\r\n [nzDisabled]=\"opt.disabled\"\r\n [nzTitle]=\"opt.tooltip || opt.label\"\r\n ></nz-option>\r\n <ng-template #nzMaxTagPlaceholder>\r\n +\r\n {{\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n ?.length\r\n }}\r\n </ng-template>\r\n <ng-template #defaultTemplate let-selected>\r\n {{\r\n selected.nzLabel.length > 4\r\n ? selected.nzLabel.substring(0, 4) + \"...\"\r\n : selected.nzLabel\r\n }}\r\n </ng-template>\r\n </nz-select>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'date'\">\r\n <nz-date-picker\r\n [nzShowTime]=\"getFieldProps(column).showTime\"\r\n [nzFormat]=\"getFieldProps(column).format\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzMode]=\"getFieldProps(column).mode\"\r\n ></nz-date-picker>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'checkbox'\">\r\n <nz-checkbox-group\r\n [class]=\"\r\n getFieldProps(column).noStyle\r\n ? 'pro-table-checkboxgroup-nostyle'\r\n : ''\r\n \"\r\n [(ngModel)]=\"getFieldProps(column).options\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n (ngModelChange)=\"\r\n handleFieldCheckBoxChange(\r\n $event,\r\n getFieldProps(column).name || column.prop\r\n )\r\n \"\r\n ></nz-checkbox-group>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'autoComplete'\">\r\n <input\r\n nz-input\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column)?.name || column.prop]\r\n \"\r\n (input)=\"handleAutoCompleteInput($event, column)\"\r\n [nzAutocomplete]=\"auto\"\r\n [disabled]=\"getFieldProps(column)?.disabled\"\r\n [placeholder]=\"getFieldProps(column)?.placeHolder\"\r\n />\r\n <nz-autocomplete\r\n [nzBackfill]=\"getFieldProps(column).backFill\"\r\n [nzDefaultActiveFirstOption]=\"\r\n getFieldProps(column).defaultActiveFirstOption\r\n \"\r\n [nzWidth]=\"getFieldProps(column).width\"\r\n #auto\r\n >\r\n <nz-auto-option\r\n *ngFor=\"let option of getAutoCompleteDataSource(column)\"\r\n [nzValue]=\"\r\n getFieldProps(column).returnFullData ? option : option.value\r\n \"\r\n [nzLabel]=\"option.label\"\r\n [nzDisabled]=\"option.disabled\"\r\n >\r\n {{ option.label }}\r\n </nz-auto-option>\r\n </nz-autocomplete>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'custom'\">\r\n <app-dynamic-search-field\r\n [component]=\"getFieldProps(column).component\"\r\n [value]=\"_searchParams[getFieldProps(column).name || column.prop]\"\r\n [props]=\"getFieldProps(column)\"\r\n (valueChange)=\"\r\n setFieldValue(getFieldProps(column).name || column.prop, $event)\r\n \"\r\n ></app-dynamic-search-field>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'inputNumber'\">\r\n <nz-input-number\r\n [style.width]=\"'100%'\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [nzFormatter]=\"getFieldProps(column).formatterPercent\"\r\n [nzParser]=\"getFieldProps(column).parserPercent\"\r\n ></nz-input-number>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </ng-template>\r\n <ng-template #actionTextBtn>\r\n <nz-space [nzSize]=\"4\">\r\n <ng-template nzSpaceItem *ngIf=\"showSearchBtn\">\r\n <button nz-button nzType=\"primary\" (click)=\"handleSearch()\">\r\n {{ confirmBtnText }}\r\n </button>\r\n </ng-template>\r\n <ng-template nzSpaceItem *ngIf=\"showClearBtn\">\r\n <button nz-button (click)=\"handleResetForm()\">\r\n {{ clearBtnText }}\r\n </button>\r\n </ng-template>\r\n </nz-space>\r\n </ng-template>\r\n <ng-container *ngIf=\"imgActionBarTpl || showColumnSetting\">\r\n <ng-template #actionImgBtn>\r\n <nz-space>\r\n <ng-container *ngTemplateOutlet=\"imgActionBarTpl\"></ng-container>\r\n <ng-template\r\n nzSpaceItem\r\n class=\"setting-space-item\"\r\n *ngIf=\"showColumnSetting\"\r\n >\r\n <span nz-tooltip nzTooltipTitle=\"\u8BBE\u7F6E\u5B57\u6BB5\">\r\n <app-colmuns-setting\r\n [columns]=\"columns\"\r\n [selectedColumns]=\"_serverColumns\"\r\n [tableName]=\"tableName\"\r\n (afterConfirm)=\"handleColumnsSettingConfirm($event)\"\r\n ></app-colmuns-setting>\r\n </span>\r\n </ng-template>\r\n </nz-space>\r\n </ng-template>\r\n </ng-container>\r\n </app-table-search-bar>\r\n </ng-template>\r\n\r\n <ng-template #body>\r\n <div class=\"mb-4\">\r\n <ng-container *ngIf=\"showActionBar\">\r\n <ng-container *ngTemplateOutlet=\"actionBarTpl\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngIf=\"customTableRender\">\r\n <ng-container *ngTemplateOutlet=\"customTableRender\"></ng-container>\r\n </ng-container>\r\n <div [class.pro-table-auto-scroll]=\"scroll?.x === 'auto'\">\r\n <nz-table\r\n *ngIf=\"!customTableRender && _columnsReady\"\r\n #dynamicTable\r\n nzSize=\"small\"\r\n nzShowSizeChanger\r\n [nzBordered]=\"bordered\"\r\n [nzOuterBordered]=\"outerBordered\"\r\n [nzData]=\"dataSource\"\r\n [nzPageIndex]=\"_pageInfo.pageIndex\"\r\n [nzPageSize]=\"_pageInfo.pageSize\"\r\n [nzTotal]=\"_pageInfo.total\"\r\n [nzPageSizeOptions]=\"_pageInfo.pageSizeOptions\"\r\n [nzShowPagination]=\"showPagination\"\r\n [nzShowTotal]=\"totalTemplate\"\r\n [nzLoading]=\"_loading\"\r\n [nzFrontPagination]=\"frontPagination\"\r\n [nzScroll]=\"_computedScroll\"\r\n (nzPageIndexChange)=\"handlePageIndexChange($event)\"\r\n (nzPageSizeChange)=\"handlePageSizeChange($event)\"\r\n >\r\n <thead>\r\n <tr>\r\n <!-- \u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF09 -->\r\n <th\r\n *ngIf=\"showCheckbox\"\r\n [nzWidth]=\"'50px'\"\r\n [nzAlign]=\"'center'\"\r\n style=\"text-align: center\"\r\n [(nzChecked)]=\"_checkedAll\"\r\n [nzIndeterminate]=\"_indeterminate\"\r\n (nzCheckedChange)=\"toggleCheckAll($event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n ></th>\r\n <th\r\n *ngFor=\"let column of _columns\"\r\n [nzWidth]=\"column.width\"\r\n [nzAlign]=\"column.align\"\r\n [nzLeft]=\"column._nzLeft\"\r\n [nzRight]=\"column._nzRight\"\r\n [nzShowSort]=\"!!column.sorter\"\r\n [nzSortOrder]=\"getSortOrder(column.prop)\"\r\n (nzSortOrderChange)=\"onSortChange(column.prop, $event)\"\r\n >\r\n {{ column.title }}\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <tr\r\n style=\"cursor: pointer\"\r\n *ngFor=\"let data; let i = index; of: dynamicTable.data\"\r\n [ngClass]=\"{\r\n 'ant-table-custom-row-selected': !!getTableRowChecked(data),\r\n 'ant-table-custom-row-even': i % 2 === 0,\r\n 'ant-table-custom-row-odd': i % 2 !== 0\r\n }\"\r\n (click)=\"handleTableRowClick(data)\"\r\n (dblclick)=\"handleTableRowDbClick(data)\"\r\n >\r\n <!-- \u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF09 -->\r\n <td\r\n *ngIf=\"showCheckbox\"\r\n [nzAlign]=\"'center'\"\r\n style=\"text-align: center; width: 50px\"\r\n [(nzChecked)]=\"data.checked\"\r\n [nzDisabled]=\"isRowDisabled(data)\"\r\n (nzCheckedChange)=\"handleRowCheckedChange(data, $event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n ></td>\r\n <td\r\n *ngFor=\"let column of _columns\"\r\n [nzLeft]=\"column._nzLeft\"\r\n [nzRight]=\"column._nzRight\"\r\n [nzAlign]=\"column.align\"\r\n [ngClass]=\"{\r\n 'pro-nowrap': true\r\n }\"\r\n >\r\n <!-- \u68C0\u67E5\u662F\u5426\u6709\u81EA\u5B9A\u4E49\u6A21\u677F -->\r\n <ng-container\r\n *ngIf=\"\r\n column.customRender && getTemplate(column.customRender);\r\n let template\r\n \"\r\n >\r\n <ng-template\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: data,\r\n data: data,\r\n column: column,\r\n index: i,\r\n pageInfo: _pageInfo\r\n }\"\r\n >\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- \u9ED8\u8BA4\u6E32\u67D3\u903B\u8F91 -->\r\n <ng-container\r\n *ngIf=\"\r\n !column.customRender || !getTemplate(column.customRender)\r\n \"\r\n >\r\n <ng-container *ngIf=\"column.ellipsis\">\r\n <div\r\n class=\"pro-ellipsis\"\r\n [title]=\"data[column.prop]\"\r\n [ngStyle]=\"{\r\n width: 'calc(' + column.width + ' - 25px)'\r\n }\"\r\n >\r\n {{ data[column.prop] }}\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!column.ellipsis\">\r\n {{ data[column.prop] }}\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"summaryData && _pageInfo.total > 0\">\r\n <!-- \u6C47\u603B\u884C\u7684\u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF0C\u4F46\u4E3A\u7A7A\uFF09 -->\r\n <td\r\n *ngIf=\"showCheckbox\"\r\n style=\"font-weight: bold; border-right: 1px solid #e8e8e8\"\r\n ></td>\r\n <td\r\n *ngFor=\"let column; let i = index; of: _columns\"\r\n [nzLeft]=\"column._nzLeft\"\r\n [nzRight]=\"column._nzRight\"\r\n style=\"font-weight: bold; border-right: 1px solid #e8e8e8\"\r\n [nzAlign]=\"column.align\"\r\n >\r\n <span *ngIf=\"i === 0\">\u603B\u8BA1</span>\r\n <ng-container *ngIf=\"i !== 0 && column.summary\">\r\n {{\r\n column.summary?.format\r\n ? column.summary?.format(\r\n summaryData[column.summary?.name || column.prop]\r\n )\r\n : summaryData[column.summary?.name || column.prop]\r\n }}\r\n </ng-container>\r\n </td>\r\n </tr>\r\n </tbody>\r\n <ng-template #totalTemplate let-total\r\n >\u5171 {{ _pageInfo.total }} \u6761\u8BB0\u5F55</ng-template\r\n >\r\n </nz-table>\r\n </div>\r\n </ng-template>\r\n</app-page-container>\r\n", styles: [".pro-ellipsis{overflow:hidden;text-overflow:ellipsis}.pro-nowrap{white-space:nowrap}::ng-deep .setting-space-item{margin-right:0!important}::ng-deep .pro-table-checkboxgroup-nostyle{white-space:nowrap}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body table{border-collapse:separate;border-spacing:0}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td{border-right:1px solid #e8e8e8!important}::ng-deep .ant-table.ant-table-bordered>.ant-table-container>.ant-table-content>table>thead>tr>th{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important;white-space:nowrap}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-thead>tr>th:first-child,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td:first-child{border-left:none!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-cell-fix-left,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-cell-fix-right{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th.ant-table-cell-fix-left,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th.ant-table-cell-fix-right{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th{border-top:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-thead>tr>th:last-child,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td:last-child{border-right:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr:last-child>td{border-bottom:1px solid #e8e8e8!important}::ng-deep .table-search-bar-left .ant-form-item{margin-bottom:4px}::ng-deep .table-search-bar-left .ant-form-item .ant-form-item-label>label{color:#5a5a5a}::ng-deep .pro-table-container .page-container-body{padding:8px 0 0!important}::ng-deep .pro-table-auto-scroll .ant-table-content,::ng-deep .pro-table-auto-scroll .ant-table-body{overflow-x:auto!important}::ng-deep .pro-table-auto-scroll .ant-table-content table,::ng-deep .pro-table-auto-scroll .ant-table-body table{table-layout:auto!important}::ng-deep .pro-table-auto-scroll .ant-table-content table td,::ng-deep .pro-table-auto-scroll .ant-table-body table td{white-space:nowrap}::ng-deep .ant-table-cell-fix-left-last{box-shadow:6px 0 8px -4px #00000026;clip-path:inset(0px -8px 0px 0px)}::ng-deep .ant-table-cell-fix-right-first{box-shadow:-6px 0 8px -4px #00000026;clip-path:inset(0px 0px 0px -8px)}::ng-deep .ant-table-tbody>tr:hover>td.ant-table-cell-fix-left,::ng-deep .ant-table-tbody>tr:hover>td.ant-table-cell-fix-right,::ng-deep .ant-table-tbody>tr.ant-table-custom-row-selected>td.ant-table-cell-fix-left,::ng-deep .ant-table-tbody>tr.ant-table-custom-row-selected>td.ant-table-cell-fix-right{background:#e8f0fb}\n"] }]
1022
1040
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
1023
1041
  type: Optional
1024
1042
  }, {
@@ -1090,6 +1108,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1090
1108
  type: Output
1091
1109
  }], onResetFormBeforeReload: [{
1092
1110
  type: Output
1111
+ }], onColumnsChange: [{
1112
+ type: Output
1093
1113
  }], customContentTpl: [{
1094
1114
  type: ContentChild,
1095
1115
  args: ["customContent"]
@@ -1103,4 +1123,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1103
1123
  type: ContentChildren,
1104
1124
  args: [TemplateRef]
1105
1125
  }] } });
1106
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byby10YWJsZS9zcmMvbGliL3Byby10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm8tdGFibGUvc3JjL2xpYi9wcm8tdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLFFBQVEsRUFDUixNQUFNLEVBRU4sV0FBVyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQVcsTUFBTSxXQUFXLENBQUM7QUFDdkUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLHVCQUF1QixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBV2hGLE9BQU8sRUFBRSx1QkFBdUIsRUFBK0IsTUFBTSxVQUFVLENBQUM7QUFDaEYsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBT25ELE1BQU0sT0FBTyxpQkFBaUI7SUE2QjVCLElBQ0ksY0FBYyxDQUFDLEtBQWdDO1FBQ2pELElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQUksbUJBQW1CO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBdUVELElBQUksZUFBZTtRQUNqQixJQUFJLENBQUMsSUFB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Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFLRixjQUFjO3NCQURqQixLQUFLO2dCQWFHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsZUFBZTtzQkFBdkIsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBR0csWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLO2dCQUdHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUVHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFSSxVQUFVO3NCQUFuQixNQUFNO2dCQUVHLFlBQVk7c0JBQXJCLE1BQU07Z0JBRUcsY0FBYztzQkFBdkIsTUFBTTtnQkFFRyx1QkFBdUI7c0JBQWhDLE1BQU07Z0JBRXdCLGdCQUFnQjtzQkFBOUMsWUFBWTt1QkFBQyxlQUFlO2dCQUVGLFlBQVk7c0JBQXRDLFlBQVk7dUJBQUMsV0FBVztnQkFFSyxlQUFlO3NCQUE1QyxZQUFZO3VCQUFDLGNBQWM7Z0JBRUUsWUFBWTtzQkFBekMsZUFBZTt1QkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlckNvbnRlbnRJbml0LFxyXG4gIENvbXBvbmVudCxcclxuICBDb250ZW50Q2hpbGQsXHJcbiAgQ29udGVudENoaWxkcmVuLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIE9wdGlvbmFsLFxyXG4gIE91dHB1dCxcclxuICBRdWVyeUxpc3QsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgY2xvbmVEZWVwLCBoYXNJbiwgaXNOaWwsIGRlYm91bmNlLCBpc0VxdWFsIH0gZnJvbSBcImxvZGFzaC1lc1wiO1xyXG5pbXBvcnQgeyBQUk9fVEFCTEVfREVGQVVMVF9DT0xVTU4sIFBST19UQUJMRV9ERUZBVUxUX1BST1BTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB7XHJcbiAgQXV0b0NvbXBsZXRlRmllbGRQcm9wcyxcclxuICBDaGVja2JveEZpZWxkUHJvcHMsXHJcbiAgT3B0aW9uc1R5cGUsXHJcbiAgUHJvVGFibGVDb2x1bW4sXHJcbiAgUHJvVGFibGVQYWdlSW5mbyxcclxuICBQcm9UYWJsZVJlcXVlc3RSZXN1bHQsXHJcbiAgUHJvVGFibGVWYWx1ZXNDaGFuZ2UsXHJcbiAgU2VsZWN0RmllbGRQcm9wcyxcclxufSBmcm9tIFwiLi90eXBlXCI7XHJcbmltcG9ydCB7IFBST19UQUJMRV9DT0xVTU5fUkVNT1RFLCBQcm9UYWJsZVJlbW90ZUNvbHVtblNlcnZpY2UgfSBmcm9tIFwiLi90b2tlbnNcIjtcclxuaW1wb3J0IHsgaXNPYnNlcnZhYmxlLCBsYXN0VmFsdWVGcm9tIH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImFwcC1wcm8tdGFibGVcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL3Byby10YWJsZS5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi9wcm8tdGFibGUuY29tcG9uZW50Lmxlc3NcIl0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQcm9UYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCB7XHJcbiAgQElucHV0KCkgc2hvd1NlYXJjaEJ0bjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dDbGVhckJ0bjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgQElucHV0KCkgYm9keVN0eWxlOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB9ID0ge307XHJcblxyXG4gIEBJbnB1dCgpIHRhYmxlTmFtZTogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgQElucHV0KCkgbXVsdGlSb3c6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgY29sdW1uczogUHJvVGFibGVDb2x1bW5bXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKSBzaG93U2VhcmNoQmFyOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgc2hvd0FjdGlvbkJhcjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIGNvbmZpcm1CdG5UZXh0OiBzdHJpbmcgPSBcIuafpeivolwiO1xyXG5cclxuICBASW5wdXQoKSBjbGVhckJ0blRleHQ6IHN0cmluZyA9IFwi5riF56m6XCI7XHJcblxyXG4gIEBJbnB1dCgpIGxhYmVsV2lkdGg6IHN0cmluZyA9IFwiOTBweFwiO1xyXG5cclxuICBASW5wdXQoKSBsYWJlbEFsaWduOiBzdHJpbmcgPSBcInJpZ2h0XCI7XHJcblxyXG4gIHByaXZhdGUgX3NlYXJjaENvbENvdW50OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgc2VhcmNoQ29sQ291bnQodmFsdWU6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX3NlYXJjaENvbENvdW50ID0gaXNOaWwodmFsdWUpID8gbnVsbCA6IE51bWJlcih2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgc2VhcmNoQ29sQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9zZWFyY2hDb2xDb3VudCA/PyA0O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRhYmxlU2VhcmNoQ29sQ291bnQoKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoQ29sQ291bnQ7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBkYXRhU291cmNlOiBhbnlbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKSBib3JkZXJlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIG91dGVyQm9yZGVyZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBzaG93UGFnaW5hdGlvbjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIGZyb250UGFnaW5hdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBzY3JvbGw6IHsgeD86IHN0cmluZyB8IG51bWJlcjsgeT86IHN0cmluZyB8IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIEBJbnB1dCgpIHJlcXVlc3Q6IChwYXJhbXM6IGFueSkgPT4gUHJvbWlzZTxQcm9UYWJsZVJlcXVlc3RSZXN1bHQ+O1xyXG5cclxuICBASW5wdXQoKSBzdW1tYXJ5RGF0YTogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvLyDmjpLluo/mqKHlvI/vvJpsb2NhbCDmnKzlnLDmjpLluo/vvJtzZXJ2ZXIg5Zyo57q/5o6S5bqP77yI5o+Q5Lqk57uZ5o6l5Y+j77yJXHJcbiAgQElucHV0KCkgc29ydE1vZGU6IFwibG9jYWxcIiB8IFwic2VydmVyXCIgPSBcImxvY2FsXCI7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dDb2x1bW5TZXR0aW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIOaYr+WQpuW8gOWQr+WkmuWIl+aOkuW6j++8iOm7mOiupOWNleWIl++8iVxyXG4gIEBJbnB1dCgpIG11bHRpcGxlU29ydDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBzaG93Q2hlY2tib3g6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8g5Yik5pat6KGM5piv5ZCm56aB55So55qE5Ye95pWwXHJcbiAgQElucHV0KCkgcm93RGlzYWJsZWQ6IChkYXRhOiBhbnkpID0+IGJvb2xlYW4gPSAoKSA9PiBmYWxzZTtcclxuXHJcbiAgLy8g5piv5ZCm6Ieq5Yqo6Kem5Y+R6K+35rGCXHJcbiAgQElucHV0KCkgYXV0b1RyaWdnZXJSZXF1ZXN0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgY3VzdG9tVGFibGVSZW5kZXI/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBAT3V0cHV0KCkgb25Sb3dDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAT3V0cHV0KCkgb25Sb3dEYkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSBvblZhbHVlc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UHJvVGFibGVWYWx1ZXNDaGFuZ2U+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSBvblJlc2V0Rm9ybUJlZm9yZVJlbG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAQ29udGVudENoaWxkKFwiY3VzdG9tQ29udGVudFwiKSBjdXN0b21Db250ZW50VHBsITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZChcImFjdGlvbkJhclwiKSBhY3Rpb25CYXJUcGwhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBAQ29udGVudENoaWxkKFwiSW1nQWN0aW9uQmFyXCIpIGltZ0FjdGlvbkJhclRwbCE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIEBDb250ZW50Q2hpbGRyZW4oVGVtcGxhdGVSZWYpIGFsbFRlbXBsYXRlcyE6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxhbnk+PjtcclxuXHJcbiAgcHJpdmF0ZSBfc2F2ZWRTZWFyY2hQYXJhbXM6IGFueSA9IHt9O1xyXG5cclxuICAvLyDlrZjlgqjmiYDmnInoh6rlrprkuYnmqKHmnb/nmoTlvJXnlKhcclxuICBwcml2YXRlIGN1c3RvbVRlbXBsYXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBUZW1wbGF0ZVJlZjxhbnk+PigpO1xyXG5cclxuICAvLyDorrDlvZXlkITliJfmjpLluo/nirbmgIHvvJonYXNjZW5kJyB8ICdkZXNjZW5kJyB8IG51bGxcclxuXHJcbiAgcHJpdmF0ZSBfc29ydE1hcDogUmVjb3JkPHN0cmluZywgXCJhc2NlbmRcIiB8IFwiZGVzY2VuZFwiIHwgbnVsbD4gPSB7fTtcclxuXHJcbiAgLy8g6K6w5b2V5aSa5YiX5o6S5bqP55qE5LyY5YWI57qn77yI5ZCO6K6+572u55qE5LyY5YWI77yJXHJcbiAgcHJpdmF0ZSBfc29ydFByaW9yaXR5OiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAvLyDlrZjlgqjmr4/kuKogYXV0b0NvbXBsZXRlIOWtl+auteeahOmYsuaKluWHveaVsFxyXG4gIHByaXZhdGUgX2F1dG9Db21wbGV0ZURlYm91bmNlTWFwOiBNYXA8c3RyaW5nLCAoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkPiA9XHJcbiAgICBuZXcgTWFwKCk7XHJcblxyXG5cclxuICBfY29sdW1uczogUHJvVGFibGVDb2x1bW5bXSA9IFtdO1xyXG5cclxuICBnZXQgX2NvbXB1dGVkU2Nyb2xsKCk6IHsgeD86IHN0cmluZyB8IG51bWJlcjsgeT86IHN0cmluZyB8IG51bWJlciB9IHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMuc2Nyb2xsIHx8IHRoaXMuc2Nyb2xsLnggIT09ICdhdXRvJykgcmV0dXJuIHRoaXMuc2Nyb2xsO1xyXG4gICAgY29uc3QgeyB4LCAuLi5yZXN0IH0gPSB0aGlzLnNjcm9sbCBhcyBhbnk7XHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXMocmVzdCkubGVuZ3RoID4gMCA/IHJlc3QgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8g562b6YCJ6KGo5Y2V5pWw5o2u5a2Y5YKoXHJcbiAgX3NlYXJjaFBhcmFtczogYW55ID0ge307XHJcblxyXG4gIC8vIOetm+mAieihqOWNlWxpc3TmuLLmn5PmlbDmja5cclxuICBfc2VhcmNoRmlsZWRDb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdID0gW107XHJcblxyXG4gIF9wYWdlSW5mbzogUHJvVGFibGVQYWdlSW5mbyA9IHtcclxuICAgIHBhZ2VJbmRleDogMSxcclxuICAgIHBhZ2VTaXplOiAxNSxcclxuICAgIHRvdGFsOiAxMDAsXHJcbiAgICBwYWdlU2l6ZU9wdGlvbnM6IFsxMCwgMTUsIDIwLCA1MCwgMTAwLCA1MDAsIDEwMDBdLFxyXG4gIH07XHJcblxyXG4gIF9sb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIF9zZWxlY3RlZFRhYmxlUm93OiBhbnkgPSBudWxsO1xyXG5cclxuICAvLyDpgInkuK3nmoTooYzmlbDmja7vvIjnlKjkuo7lpI3pgInmoYbpgInmi6nvvIktIOS/neeVmeeUqOS6juWFvOWuueaAp1xyXG4gIF9zZWxlY3RlZFJvd3M6IGFueVtdID0gW107XHJcblxyXG4gIC8vIOWFqOmAieeKtuaAgVxyXG4gIF9jaGVja2VkQWxsOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIOWNiumAieeKtuaAge+8iOmDqOWIhumAieS4re+8iVxyXG4gIF9pbmRldGVybWluYXRlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIOi/nOeoi2NvbHVtbnNcclxuICBfc2VydmVyQ29sdW1uczogUHJvVGFibGVDb2x1bW5bXSA9IFtdO1xyXG5cclxuICAvLyDlrZjlgqggYXV0b0NvbXBsZXRlIOWtl+auteeahOaVsOaNrua6kFxyXG4gIF9hdXRvQ29tcGxldGVEYXRhU291cmNlczogUmVjb3JkPHN0cmluZywgYW55W10+ID0ge307XHJcblxyXG4gIC8vIOWKqOaAgeWIl+WKoOi9veWujOaIkOagh+W/l++8jOm7mOiupCB0cnVl77yI5peg5Yqo5oCB5YiX5pe255u05o6l5pi+56S677yJXHJcbiAgX2NvbHVtbnNSZWFkeTogYm9vbGVhbiA9IHRydWU7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBAT3B0aW9uYWwoKVxyXG4gICAgQEluamVjdChQUk9fVEFCTEVfQ09MVU1OX1JFTU9URSlcclxuICAgIHByaXZhdGUgY29sdW1uUmVtb3RlOiBQcm9UYWJsZVJlbW90ZUNvbHVtblNlcnZpY2UgfCBudWxsLFxyXG4gICkge31cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFJlbW90ZUNvbHVtbnMoKSB7XHJcbiAgICBpZiAoIXRoaXMuY29sdW1uUmVtb3RlPy5nZXRDb2wgfHwgIXRoaXMudGFibGVOYW1lKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jb2x1bW5SZW1vdGUuZ2V0Q29sKHRoaXMudGFibGVOYW1lLCB0aGlzLm11bHRpUm93KTtcclxuICAgICAgcmV0dXJuIHJlcztcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBwZXJzaXN0UmVtb3RlQ29sdW1ucyhjb2x1bW5zOiBhbnlbXSkge1xyXG4gICAgaWYgKCF0aGlzLmNvbHVtblJlbW90ZT8uc2V0Q29sIHx8ICF0aGlzLnRhYmxlTmFtZSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29sdW1uUmVtb3RlLnNldENvbChcclxuICAgICAgICB0aGlzLnRhYmxlTmFtZSxcclxuICAgICAgICBjb2x1bW5zLFxyXG4gICAgICAgIHRoaXMubXVsdGlSb3csXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChyZXN1bHQgJiYgaXNPYnNlcnZhYmxlKHJlc3VsdCkpIHtcclxuICAgICAgICByZXR1cm4gYXdhaXQgbGFzdFZhbHVlRnJvbShyZXN1bHQpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4geyAgIFxyXG4gICAgdGhpcy5fc2VhcmNoUGFyYW1zID0ge307XHJcbiAgICB0aGlzLmZvcm1hdGVJbm5lckNvbHVtbnModGhpcy5jb2x1bW5zKTtcclxuICAgIGF3YWl0IHRoaXMuc2V0U2VhcmNoUGFyYW1zKHRoaXMuY29sdW1ucyk7XHJcblxyXG4gICAgLy8g5L2/55SoIFByb3h5IOWMheijhSBfc2VhcmNoUGFyYW1z77yM5oum5oiq6KGo5Y2V6aG55YC85Y+Y5YyW5bm25ZCR5aSW5Y+R5Ye65LqL5Lu2XHJcbiAgICB0aGlzLl9zZWFyY2hQYXJhbXMgPSB0aGlzLmNyZWF0ZVNlYXJjaFBhcmFtc1Byb3h5KHRoaXMuX3NlYXJjaFBhcmFtcyk7XHJcbiAgICBpZiAodGhpcy5hdXRvVHJpZ2dlclJlcXVlc3QpIHtcclxuICAgICAgdGhpcy5oYW5kbGVRdWVyeSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMudGFibGVOYW1lICYmIHRoaXMuY29sdW1uUmVtb3RlKSB7XHJcbiAgICAgIHRoaXMuX2NvbHVtbnNSZWFkeSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5xdWVyeUR5bmFtaWNDb2x1bW5zKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XHJcbiAgICAvLyDoh6rliqjms6jlhozmiYDmnInoh6rlrprkuYnmqKHmnb9cclxuICAgIC8vIOazqOaEj++8muatpOaXtuaJgOaciSBDb250ZW50Q2hpbGQg5ZKMIENvbnRlbnRDaGlsZHJlbiDpg73lt7LliJ3lp4vljJblrozmiJBcclxuICAgIHRoaXMuYXV0b1JlZ2lzdGVyVGVtcGxhdGVzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHF1ZXJ5RHluYW1pY0NvbHVtbnMoKSB7XHJcbiAgICBpZiAoIXRoaXMudGFibGVOYW1lIHx8ICF0aGlzLmNvbHVtblJlbW90ZSkgcmV0dXJuO1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5mZXRjaFJlbW90ZUNvbHVtbnMoKTtcclxuICAgICAgaWYgKCFyZXMpIHJldHVybjtcclxuICAgICAgaWYgKHJlcy5jb2RlID09PSAwKSB7XHJcbiAgICAgICAgY29uc3QgX3RhYkNvbHVtbiA9IHJlcy5kYXRhLnRhYkNvbHVtbi5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLmhlYWRlcixcclxuICAgICAgICAgICAgcHJvcDogaXRlbS5maWVsZCxcclxuICAgICAgICAgICAgc29ydE5hbWU6IGl0ZW0uc29ydE5hbWUsXHJcbiAgICAgICAgICAgIGhpZGVJblRhYmxlOiAhaXRlbS5pc1Nob3csXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX3NlcnZlckNvbHVtbnMgPSBfdGFiQ29sdW1uLmZpbHRlcigoY29sKSA9PlxyXG4gICAgICAgICAgdGhpcy5jb2x1bW5zLnNvbWUoKGxvY2FsQ29sKSA9PiBsb2NhbENvbC5wcm9wID09PSBjb2wucHJvcCksXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVRhYmxlQ29sdW1ucyh0aGlzLl9zZXJ2ZXJDb2x1bW5zKTtcclxuICAgICAgfSBlbHNlIGlmIChyZXMuY29kZSA9PT0gMTApIHtcclxuICAgICAgICAvLyDlpoLmnpzmnKrorr7nva7mjqXlj6Pov5Tlm57vvIzpnIDopoHpu5jorqTosIPnlKjkuIDmrKHkv67mlLnlh73mlbDliJ3lp4vljJbmlbDmja5cclxuICAgICAgICBjb25zdCBpbml0Q29sdW1ucyA9IHRoaXMuY29sdW1uc1xyXG4gICAgICAgICAgLmZpbHRlcigoY29sKSA9PiAhY29sLmF1eGlsaWFyeUNvbHVtbilcclxuICAgICAgICAgIC5tYXAoKGNvbHVtbikgPT4gKHtcclxuICAgICAgICAgICAgZmllbGQ6IGNvbHVtbi5wcm9wLFxyXG4gICAgICAgICAgICBpc1Nob3c6IHRydWUsXHJcbiAgICAgICAgICAgIGhlYWRlcjogY29sdW1uLnRpdGxlLFxyXG4gICAgICAgICAgICBzb3J0TmFtZTogY29sdW1uLnNvcnROYW1lIHx8IG51bGwsXHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgY29uc3QgaW5pdFJlcyA9IGF3YWl0IHRoaXMucGVyc2lzdFJlbW90ZUNvbHVtbnMoaW5pdENvbHVtbnMpO1xyXG4gICAgICAgIGlmIChpbml0UmVzKSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5RHluYW1pY0NvbHVtbnMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuX2NvbHVtbnNSZWFkeSA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvcm1hdGVJbm5lckNvbHVtbnMoY29sdW1uczogUHJvVGFibGVDb2x1bW5bXSkge1xyXG4gICAgdGhpcy5fY29sdW1ucyA9IGNvbHVtbnNcclxuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uaGlkZUluVGFibGUpXHJcbiAgICAgIC5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgICByZXR1cm4geyAuLi5QUk9fVEFCTEVfREVGQVVMVF9DT0xVTU4sIC4uLml0ZW0gfSBhcyBQcm9UYWJsZUNvbHVtbjtcclxuICAgICAgfSk7XHJcblxyXG4gICAgbGV0IGxlZnRPZmZzZXQgPSAwO1xyXG4gICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5fY29sdW1ucykge1xyXG4gICAgICBpZiAoY29sLmZpeGVkTGVmdCkge1xyXG4gICAgICAgIGNvbC5fbnpMZWZ0ID0gYCR7bGVmdE9mZnNldH1weGA7XHJcbiAgICAgICAgbGVmdE9mZnNldCArPSB0aGlzLnBhcnNlQ29sdW1uV2lkdGgoY29sLndpZHRoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb2wuX256TGVmdCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJpZ2h0T2Zmc2V0ID0gMDtcclxuICAgIGZvciAobGV0IGkgPSB0aGlzLl9jb2x1bW5zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgIGNvbnN0IGNvbCA9IHRoaXMuX2NvbHVtbnNbaV07XHJcbiAgICAgIGlmIChjb2wuZml4ZWRSaWdodCkge1xyXG4gICAgICAgIGNvbC5fbnpSaWdodCA9IGAke3JpZ2h0T2Zmc2V0fXB4YDtcclxuICAgICAgICByaWdodE9mZnNldCArPSB0aGlzLnBhcnNlQ29sdW1uV2lkdGgoY29sLndpZHRoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb2wuX256UmlnaHQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYXJzZUNvbHVtbldpZHRoKHdpZHRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBudW1iZXIge1xyXG4gICAgaWYgKCF3aWR0aCkgcmV0dXJuIDA7XHJcbiAgICBjb25zdCBtYXRjaCA9IHdpZHRoLm1hdGNoKC9eKFxcZCsoPzpcXC5cXGQrKT8pcHgkLyk7XHJcbiAgICByZXR1cm4gbWF0Y2ggPyBwYXJzZUZsb2F0KG1hdGNoWzFdKSA6IDA7XHJcbiAgfVxyXG5cclxuICAvLyDoh6rliqjms6jlhozmqKHmnb/nmoTmlrnms5VcclxuICBwcml2YXRlIGF1dG9SZWdpc3RlclRlbXBsYXRlcygpIHtcclxuICAgIC8vIOiOt+WPluaJgOacieaooeadv1xyXG4gICAgY29uc3QgYWxsVGVtcGxhdGVzQXJyYXkgPSB0aGlzLmFsbFRlbXBsYXRlcy50b0FycmF5KCk7XHJcblxyXG4gICAgLy8g6I635Y+W5omA5pyJ6ZyA6KaB6Ieq5a6a5LmJ5qih5p2/55qE5YiXXHJcbiAgICBjb25zdCBjb2x1bW5zV2l0aEN1c3RvbVJlbmRlciA9IHRoaXMuX2NvbHVtbnMuZmlsdGVyKFxyXG4gICAgICAoY29sKSA9PiBjb2wuY3VzdG9tUmVuZGVyLFxyXG4gICAgKTtcclxuXHJcbiAgICAvLyDojrflj5bmiYDmnInpnIDopoHoh6rlrprkuYlsYWJlbOaooeadv+eahOWIl++8iOS9v+eUqOWOn+Wni2NvbHVtbnPvvIznoa7kv53pobrluo/mraPnoa7vvIlcclxuICAgIGNvbnN0IGNvbHVtbnNXaXRoQ3VzdG9tTGFiZWwgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKFxyXG4gICAgICAoY29sKSA9PiBjb2wuY3VzdG9tTGFiZWxSZW5kZXIsXHJcbiAgICApO1xyXG5cclxuICAgIC8vIOiuoeeul+mcgOimgeeahOaooeadv+aAu+aVsFxyXG4gICAgY29uc3QgY3VzdG9tUmVuZGVyQ291bnQgPSBjb2x1bW5zV2l0aEN1c3RvbVJlbmRlci5sZW5ndGg7XHJcbiAgICBjb25zdCB0b3RhbE5lZWRlZFRlbXBsYXRlcyA9XHJcbiAgICAgIGN1c3RvbVJlbmRlckNvdW50ICsgY29sdW1uc1dpdGhDdXN0b21MYWJlbC5sZW5ndGg7XHJcblxyXG4gICAgLy8g6K+G5Yir5bm25o6S6Zmk54m55q6K5qih5p2/77yIY3VzdG9tQ29udGVudOOAgWFjdGlvbkJhciDlkowgaW1nQWN0aW9uQmFy77yJXHJcbiAgICBjb25zdCBzcGVjaWFsVGVtcGxhdGVJbmRpY2VzID0gbmV3IFNldDxudW1iZXI+KCk7XHJcblxyXG4gICAgaWYgKHRoaXMuY3VzdG9tQ29udGVudFRwbCkge1xyXG4gICAgICBjb25zdCBjdXN0b21Db250ZW50SW5kZXggPSB0aGlzLmZpbmRUZW1wbGF0ZUluZGV4KFxyXG4gICAgICAgIGFsbFRlbXBsYXRlc0FycmF5LFxyXG4gICAgICAgIHRoaXMuY3VzdG9tQ29udGVudFRwbCxcclxuICAgICAgKTtcclxuICAgICAgaWYgKGN1c3RvbUNvbnRlbnRJbmRleCAhPT0gLTEpIHtcclxuICAgICAgICBzcGVjaWFsVGVtcGxhdGVJbmRpY2VzLmFkZChjdXN0b21Db250ZW50SW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5bCd6K+V5om+5YiwIGFjdGlvbkJhclRwbCDlnKggYWxsVGVtcGxhdGVzQXJyYXkg5Lit55qE5L2N572uXHJcbiAgICBpZiAodGhpcy5hY3Rpb25CYXJUcGwpIHtcclxuICAgICAgY29uc3QgYWN0aW9uQmFySW5kZXggPSB0aGlzLmZpbmRUZW1wbGF0ZUluZGV4KFxyXG4gICAgICAgIGFsbFRlbXBsYXRlc0FycmF5LFxyXG4gICAgICAgIHRoaXMuYWN0aW9uQmFyVHBsLFxyXG4gICAgICApO1xyXG4gICAgICBpZiAoYWN0aW9uQmFySW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgc3BlY2lhbFRlbXBsYXRlSW5kaWNlcy5hZGQoYWN0aW9uQmFySW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5bCd6K+V5om+5YiwIGltZ0FjdGlvbkJhclRwbCDlnKggYWxsVGVtcGxhdGVzQXJyYXkg5Lit55qE5L2N572uXHJcbiAgICBpZiAodGhpcy5pbWdBY3Rpb25CYXJUcGwpIHtcclxuICAgICAgY29uc3QgaW1nQWN0aW9uQmFySW5kZXggPSB0aGlzLmZpbmRUZW1wbGF0ZUluZGV4KFxyXG4gICAgICAgIGFsbFRlbXBsYXRlc0FycmF5LFxyXG4gICAgICAgIHRoaXMuaW1nQWN0aW9uQmFyVHBsLFxyXG4gICAgICApO1xyXG4gICAgICBpZiAoaW1nQWN0aW9uQmFySW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgc3BlY2lhbFRlbXBsYXRlSW5kaWNlcy5hZGQoaW1nQWN0aW9uQmFySW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5aaC5p6c5peg5rOV6YCa6L+H5byV55So5om+5Yiw54m55q6K5qih5p2/77yM5L2/55So5aSH55So562W55WlXHJcbiAgICAvLyDlpIfnlKjnrZbnlaXvvJrlgYforr7mnIDlkI7nmoTmqKHmnb/mmK/nibnmrormqKHmnb9cclxuICAgIGNvbnN0IHNwZWNpYWxUZW1wbGF0ZUNvdW50ID1cclxuICAgICAgKHRoaXMuY3VzdG9tQ29udGVudFRwbCA/IDEgOiAwKSArXHJcbiAgICAgICh0aGlzLmFjdGlvbkJhclRwbCA/IDEgOiAwKSArXHJcbiAgICAgICh0aGlzLmltZ0FjdGlvbkJhclRwbCA/IDEgOiAwKTtcclxuICAgIGlmIChzcGVjaWFsVGVtcGxhdGVJbmRpY2VzLnNpemUgPT09IDAgJiYgc3BlY2lhbFRlbXBsYXRlQ291bnQgPiAwKSB7XHJcbiAgICAgIGZvciAoXHJcbiAgICAgICAgbGV0IGkgPSBhbGxUZW1wbGF0ZXNBcnJheS5sZW5ndGggLSBzcGVjaWFsVGVtcGxhdGVDb3VudDtcclxuICAgICAgICBpIDwgYWxsVGVtcGxhdGVzQXJyYXkubGVuZ3RoO1xyXG4gICAgICAgIGkrK1xyXG4gICAgICApIHtcclxuICAgICAgICBzcGVjaWFsVGVtcGxhdGVJbmRpY2VzLmFkZChpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOaPkOWPluWIl+aooeadv++8iOaOkumZpOeJueauiuaooeadv++8iVxyXG4gICAgY29uc3QgY29sdW1uVGVtcGxhdGVzOiBUZW1wbGF0ZVJlZjxhbnk+W10gPSBbXTtcclxuICAgIGFsbFRlbXBsYXRlc0FycmF5LmZvckVhY2goKHRwbCwgaW5kZXgpID0+IHtcclxuICAgICAgaWYgKCFzcGVjaWFsVGVtcGxhdGVJbmRpY2VzLmhhcyhpbmRleCkpIHtcclxuICAgICAgICBjb2x1bW5UZW1wbGF0ZXMucHVzaCh0cGwpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyDpqozor4HmqKHmnb/mlbDph49cclxuICAgIGlmIChjb2x1bW5UZW1wbGF0ZXMubGVuZ3RoICE9PSB0b3RhbE5lZWRlZFRlbXBsYXRlcykge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgYFByb1RhYmxlOiDmqKHmnb/mlbDph4/kuI3ljLnphY3vvIHpnIDopoEgJHt0b3RhbE5lZWRlZFRlbXBsYXRlc30g5Liq5YiX5qih5p2/77yM5a6e6ZmF5pyJICR7Y29sdW1uVGVtcGxhdGVzLmxlbmd0aH0g5Liq44CC6K+35qOA5p+lIGN1c3RvbVJlbmRlciDlkowgY3VzdG9tTGFiZWxSZW5kZXIg6YWN572u44CCYCxcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDms6jlhozoh6rlrprkuYnmuLLmn5PmqKHmnb9cclxuICAgIGNvbHVtbnNXaXRoQ3VzdG9tUmVuZGVyLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcclxuICAgICAgY29uc3QgdGVtcGxhdGVOYW1lID0gY29sdW1uLmN1c3RvbVJlbmRlciE7XHJcbiAgICAgIGlmIChpbmRleCA8IGNvbHVtblRlbXBsYXRlcy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlcy5zZXQodGVtcGxhdGVOYW1lLCBjb2x1bW5UZW1wbGF0ZXNbaW5kZXhdKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFxyXG4gICAgICAgICAgYFByb1RhYmxlOiDmnKrmib7liLDmqKHmnb8gXCIke3RlbXBsYXRlTmFtZX1cIu+8jOe0ouW8lSAke2luZGV4fSDotoXlh7rojIPlm7RgLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIOazqOWGjOiHquWumuS5iWxhYmVs5qih5p2/77yI5LuOIGN1c3RvbVJlbmRlckNvdW50IOS5i+WQjuW8gOWni++8iVxyXG4gICAgY29sdW1uc1dpdGhDdXN0b21MYWJlbC5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XHJcbiAgICAgIGNvbnN0IHRlbXBsYXRlTmFtZSA9IGNvbHVtbi5jdXN0b21MYWJlbFJlbmRlciE7XHJcbiAgICAgIGNvbnN0IHRlbXBsYXRlSW5kZXggPSBjdXN0b21SZW5kZXJDb3VudCArIGluZGV4O1xyXG4gICAgICBpZiAodGVtcGxhdGVJbmRleCA8IGNvbHVtblRlbXBsYXRlcy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlcy5zZXQodGVtcGxhdGVOYW1lLCBjb2x1bW5UZW1wbGF0ZXNbdGVtcGxhdGVJbmRleF0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXHJcbiAgICAgICAgICBgUHJvVGFibGU6IOacquaJvuWIsGxhYmVs5qih5p2/IFwiJHt0ZW1wbGF0ZU5hbWV9XCLvvIzntKLlvJUgJHt0ZW1wbGF0ZUluZGV4fSDotoXlh7rojIPlm7RgLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8g5bCd6K+V5Zyo5pWw57uE5Lit5om+5Yiw5qih5p2/55qE57Si5byV77yI5L2/55So5aSa56eN5q+U6L6D5pa55byP77yJXHJcbiAgcHJpdmF0ZSBmaW5kVGVtcGxhdGVJbmRleChcclxuICAgIHRlbXBsYXRlczogVGVtcGxhdGVSZWY8YW55PltdLFxyXG4gICAgdGFyZ2V0OiBUZW1wbGF0ZVJlZjxhbnk+LFxyXG4gICk6IG51bWJlciB7XHJcbiAgICAvLyDmlrnms5Ux77ya5byV55So55u4562J5oCnXHJcbiAgICBsZXQgaW5kZXggPSB0ZW1wbGF0ZXMuaW5kZXhPZih0YXJnZXQpO1xyXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgcmV0dXJuIGluZGV4O1xyXG5cclxuICAgIC8vIOaWueazlTLvvJrpgJrov4cgZWxlbWVudFJlZiDmr5TovoNcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnRSZWYgPSAodGFyZ2V0IGFzIGFueSkuZWxlbWVudFJlZjtcclxuICAgICAgaWYgKHRhcmdldEVsZW1lbnRSZWYpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRlbXBsYXRlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgY29uc3QgdHBsRWxlbWVudFJlZiA9ICh0ZW1wbGF0ZXNbaV0gYXMgYW55KS5lbGVtZW50UmVmO1xyXG4gICAgICAgICAgaWYgKHRwbEVsZW1lbnRSZWYgPT09IHRhcmdldEVsZW1lbnRSZWYpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIC8vIOW/veeVpemUmeivr1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOaWueazlTPvvJrpgJrov4cgQW5ndWxhciDlhoXpg6jlsZ7mgKfmr5TovoNcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHRhcmdldENvbnRhaW5lciA9ICh0YXJnZXQgYXMgYW55KS5fZGVjbGFyYXRpb25UQ29udGFpbmVyO1xyXG4gICAgICBpZiAodGFyZ2V0Q29udGFpbmVyKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW1wbGF0ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGNvbnN0IHRwbENvbnRhaW5lciA9ICh0ZW1wbGF0ZXNbaV0gYXMgYW55KS5fZGVjbGFyYXRpb25UQ29udGFpbmVyO1xyXG4gICAgICAgICAgaWYgKHRwbENvbnRhaW5lciA9PT0gdGFyZ2V0Q29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyDlv73nlaXplJnor69cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gLTE7XHJcbiAgfVxyXG5cclxuICAvLyDorr7nva7nrZvpgInooajljZXpu5jorqTlsZ7mgKdcclxuICBwcml2YXRlIHNldFNlYXJjaEZvcm1EZWZhdWx0UHJvcChjb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdKSB7XHJcbiAgICBjb2x1bW5zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaWYgKGl0ZW0udmFsdWVUeXBlKSB7XHJcbiAgICAgICAgaWYgKGl0ZW0uZmllbGRQcm9wcykge1xyXG4gICAgICAgICAgaXRlbS5maWVsZFByb3BzID0ge1xyXG4gICAgICAgICAgICAuLi5QUk9fVEFCTEVfREVGQVVMVF9QUk9QU1tpdGVtLnZhbHVlVHlwZV0sXHJcbiAgICAgICAgICAgIC4uLml0ZW0uZmllbGRQcm9wcyxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGl0ZW0uZmllbGRQcm9wcyA9IHsgLi4uUFJPX1RBQkxFX0RFRkFVTFRfUFJPUFNbaXRlbS52YWx1ZVR5cGVdIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIOWKqOaAgeiuvue9rk9wdGlvbnNcclxuICBwcml2YXRlIHNldFNlbGVjdFJlcXVlc3QoY29sdW1uczogUHJvVGFibGVDb2x1bW5bXSkge1xyXG4gICAgY29sdW1ucy5tYXAoYXN5bmMgKGl0ZW0pID0+IHtcclxuICAgICAgaWYgKGl0ZW0uZmllbGRQcm9wcyAmJiBoYXNJbihpdGVtLmZpZWxkUHJvcHMsIFwicmVxdWVzdFwiKSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0gYXdhaXQgKFxyXG4gICAgICAgICAgICBpdGVtLmZpZWxkUHJvcHMgYXMgU2VsZWN0RmllbGRQcm9wc1xyXG4gICAgICAgICAgKS5yZXF1ZXN0Py4oKTtcclxuICAgICAgICAgIChpdGVtLmZpZWxkUHJvcHMgYXMgU2VsZWN0RmllbGRQcm9wcykub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgIChpdGVtLmZpZWxkUHJvcHMgYXMgU2VsZWN0RmllbGRQcm9wcykub3B0aW9ucyA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNldFNlYXJjaFBhcmFtcyhjb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdKSB7XHJcbiAgICB0aGlzLl9zZWFyY2hGaWxlZENvbHVtbnMgPSBbXTtcclxuICAgIGNvbHVtbnNcclxuICAgICAgLmZpbHRlcigoaXRlbSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZsYWcgPSAhaXRlbS5oaWRlSW5TZWFyY2ggJiYgaXRlbS52YWx1ZVR5cGU7XHJcbiAgICAgICAgaWYgKGZsYWcpIHtcclxuICAgICAgICAgIHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucy5wdXNoKGNsb25lRGVlcChpdGVtKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmbGFnO1xyXG4gICAgICB9KVxyXG4gICAgICAuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gY29sdW1uLmZpZWxkUHJvcHM/Lm5hbWUgfHwgY29sdW1uLnByb3A7XHJcbiAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZSA9IFBST19UQUJMRV9ERUZBVUxUX1BST1BTW2NvbHVtbi52YWx1ZVR5cGVdLnZhbHVlO1xyXG5cclxuICAgICAgICAvLyDlr7nkuo5jaGVja2JveOexu+Wei++8jOS7jm9wdGlvbnPkuK3mib7lh7pjaGVja2Vk5Li6dHJ1ZeeahOmhueS9nOS4uum7mOiupOWAvFxyXG4gICAgICAgIGlmIChjb2x1bW4udmFsdWVUeXBlID09PSBcImNoZWNrYm94XCIpIHtcclxuICAgICAgICAgIGNvbnN0IGNoZWNrZWRWYWx1ZXMgPSAoY29sdW1uLmZpZWxkUHJvcHM/Lm9wdGlvbnMgfHwgW10pXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKG9wdDogT3B0aW9uc1R5cGUpID0+IG9wdC5jaGVja2VkKVxyXG4gICAgICAgICAgICAubWFwKChvcHQ6IE9wdGlvbnNUeXBlKSA9PiBvcHQudmFsdWUpO1xyXG4gICAgICAgICAgdGhpcy5fc2VhcmNoUGFyYW1zW2tleV0gPVxyXG4gICAgICAgICAgICBjaGVja2VkVmFsdWVzLmxlbmd0aCA+IDAgPyBjaGVja2VkVmFsdWVzIDogZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9zZWFyY2hQYXJhbXNba2V5XSA9IGNvbHVtbi5maWVsZFByb3BzPy52YWx1ZSB8fCBkZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDliJ3lp4vljJYgYXV0b0NvbXBsZXRlIOaVsOaNrua6kFxyXG4gICAgICAgIGlmIChjb2x1bW4udmFsdWVUeXBlID09PSBcImF1dG9Db21wbGV0ZVwiKSB7XHJcbiAgICAgICAgICB0aGlzLl9hdXRvQ29tcGxldGVEYXRhU291cmNlc1trZXldID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAvLyDmoLnmja7liJfnmoQgb3JkZXIg5a2X5q616L+b6KGM5o6S5bqP77yM5pyq6K6+572uIG9yZGVyIOeahOaUvuWcqOacgOWQjlxyXG4gICAgdGhpcy5fc2VhcmNoRmlsZWRDb2x1bW5zLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGFPcmRlciA9IGlzTmlsKGE/Lm9yZGVyKSA/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIDogYS5vcmRlcjtcclxuICAgICAgY29uc3QgYk9yZGVyID0gaXNOaWwoYj8ub3JkZXIpID8gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgOiBiLm9yZGVyO1xyXG4gICAgICBpZiAoYU9yZGVyID09PSBiT3JkZXIpIHJldHVybiAwO1xyXG4gICAgICByZXR1cm4gYU9yZGVyIC0gYk9yZGVyO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZXRTZWFyY2hGb3JtRGVmYXVsdFByb3AodGhpcy5fc2VhcmNoRmlsZWRDb2x1bW5zKTtcclxuXHJcbiAgICAvLyDlubblj5HliqDovb3miYDmnInpnIDopoHlvILmraXojrflj5bnmoTpgInpoblcclxuICAgIHRoaXMuc2V0U2VsZWN0UmVxdWVzdCh0aGlzLl9zZWFyY2hGaWxlZENvbHVtbnMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVUYWJsZUNvbHVtbnMoaW5qZWN0Q29sdW1uczogUHJvVGFibGVDb2x1bW5bXSkge1xyXG4gICAgLy8g6L+c56iL5YiX55u05o6l5L2c5Li65p2l5rqQ77yM6L+H5ruk5o6J5pys5Zyw5LiN5a2Y5Zyo55qE5YiX77yM5bm25LuO5pys5Zyw5YiX6KGl5YWF5riy5p+T6YWN572uXHJcbiAgICBjb25zdCByZW1vdGVDb2x1bW5zID0gaW5qZWN0Q29sdW1uc1xyXG4gICAgICAuZmlsdGVyKChpbmplY3RDb2wpID0+XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLnByb3AgPT09IGluamVjdENvbC5wcm9wKSxcclxuICAgICAgKVxyXG4gICAgICAubWFwKChpbmplY3RDb2wpID0+IHtcclxuICAgICAgICBjb25zdCBsb2NhbENvbCA9IHRoaXMuY29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5wcm9wID09PSBpbmplY3RDb2wucHJvcCk7XHJcbiAgICAgICAgcmV0dXJuIHsgLi4ubG9jYWxDb2wsIC4uLmluamVjdENvbCB9O1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAvLyDovoXliqnliJflj5boh6rmnKzlnLDvvIzkv53mjIHlnKjljp/lp4vkvY3nva7vvIjpppbpg6ggLyDlsL7pg6jvvIlcclxuICAgIGNvbnN0IGZpcnN0Tm9uQXV4SW5kZXggPSB0aGlzLmNvbHVtbnMuZmluZEluZGV4KFxyXG4gICAgICAoYykgPT4gIWMuYXV4aWxpYXJ5Q29sdW1uLFxyXG4gICAgKTtcclxuICAgIGNvbnN0IGxhc3ROb25BdXhJbmRleCA9XHJcbiAgICAgIHRoaXMuY29sdW1ucy5sZW5ndGggLVxyXG4gICAgICAxIC1cclxuICAgICAgWy4uLnRoaXMuY29sdW1uc10ucmV2ZXJzZSgpLmZpbmRJbmRleCgoYykgPT4gIWMuYXV4aWxpYXJ5Q29sdW1uKTtcclxuICAgIGNvbnN0IGhlYWRBdXhpbGlhcnkgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKFxyXG4gICAgICAoY29sLCBpKSA9PiBjb2wuYXV4aWxpYXJ5Q29sdW1uICYmIGkgPCBmaXJzdE5vbkF1eEluZGV4LFxyXG4gICAgKTtcclxuICAgIGNvbnN0IHRhaWxBdXhpbGlhcnkgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKFxyXG4gICAgICAoY29sLCBpKSA9PiBjb2wuYXV4aWxpYXJ5Q29sdW1uICYmIGkgPiBsYXN0Tm9uQXV4SW5kZXgsXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuZm9ybWF0ZUlubmVyQ29sdW1ucyhbLi4uaGVhZEF1eGlsaWFyeSwgLi4ucmVtb3RlQ29sdW1ucywgLi4udGFpbEF1eGlsaWFyeV0pO1xyXG4gIH1cclxuXHJcbiAgLy8g6YCa6L+HIFByb3h5IOebkeWQrCBfc2VhcmNoUGFyYW1zIOeahOWxnuaAp+WPmOabtFxyXG4gIHByaXZhdGUgY3JlYXRlU2VhcmNoUGFyYW1zUHJveHkodGFyZ2V0OiBhbnkpIHtcclxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgY29uc3QgaGFuZGxlcjogUHJveHlIYW5kbGVyPGFueT4gPSB7XHJcbiAgICAgIHNldChvYmo6IGFueSwgcHJvcDogc3RyaW5nIHwgc3ltYm9sLCB2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHByb3ApO1xyXG4gICAgICAgIGNvbnN0IG9sZFZhbCA9IG9ialtrZXldO1xyXG4gICAgICAgIGlmIChvbGRWYWwgPT09IHZhbHVlKSB7XHJcbiAgICAgICAgICBvYmpba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9ialtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHNlbGYub25WYWx1ZXNDaGFuZ2UuZW1pdCh7XHJcbiAgICAgICAgICAgIGtleSxcclxuICAgICAgICAgICAgdmFsdWUsXHJcbiAgICAgICAgICAgIHBhcmFtczogc2VsZi5nZXRTZWFyY2hQYXJhbXMoKSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBQcm94eSh0YXJnZXQsIGhhbmRsZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhckVtcHR5U2VhcmNoUGFyYW1zKCkge1xyXG4gICAgY29uc3QgY2xvbmVTZWFyY2hQYXJhbXMgPSBjbG9uZURlZXAodGhpcy5fc2VhcmNoUGFyYW1zKTtcclxuICAgIHJldHVybiBjbG9uZVNlYXJjaFBhcmFtcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRTZXJ2ZXJTb3J0UGF5bG9hZCgpIHtcclxuICAgIC8vIOaehOW7uua/gOa0u+aOkuW6j+mbhuWQiO+8iOaMieS8mOWFiOe6p+S7juS9juWIsOmrmO+8jOacq+WwvuS8mOWFiO+8iVxyXG4gICAgY29uc3QgYWN0aXZlS2V5cyA9IHRoaXMuX3NvcnRQcmlvcml0eS5maWx0ZXIoKGspID0+ICEhdGhpcy5fc29ydE1hcFtrXSk7XHJcbiAgICBpZiAoYWN0aXZlS2V5cy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xyXG4gICAgY29uc3Qgc29ydHMgPSBhY3RpdmVLZXlzLm1hcCgoZmllbGQpID0+IHtcclxuICAgICAgLy8g5p+l5om+5a+55bqU55qE5YiX6YWN572u77yM5LyY5YWI5L2/55Soc29ydE5hbWXlrZfmrrVcclxuICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5fY29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5wcm9wID09PSBmaWVsZCk7XHJcbiAgICAgIGNvbnN0IHNvcnRGaWVsZCA9IGNvbHVtbj8uc29ydE5hbWUgfHwgZmllbGQ7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgZmllbGQ6IHNvcnRGaWVsZCxcclxuICAgICAgICBvcmRlcjogdGhpcy5fc29ydE1hcFtmaWVsZF0hLFxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgICBpZiAodGhpcy5tdWx0aXBsZVNvcnQpIHtcclxuICAgICAgcmV0dXJuIHNvcnRzOyAvLyDku6XmlbDnu4TlvaLlvI/mj5DkuqTlpJrliJfmjpLluo9cclxuICAgIH1cclxuICAgIGNvbnN0IFtmaXJzdF0gPSBzb3J0cztcclxuICAgIHJldHVybiBmaXJzdDsgLy8g5YW85a655Y2V5YiX57uT5p6EIHsgZmllbGQsIG9yZGVyIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc29ydERhdGFTb3VyY2VJblBsYWNlKCkge1xyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMuZGF0YVNvdXJjZSkgfHwgdGhpcy5kYXRhU291cmNlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgY29uc3QgYWN0aXZlS2V5cyA9IHRoaXMuX3NvcnRQcmlvcml0eS5maWx0ZXIoKGspID0+ICEhdGhpcy5fc29ydE1hcFtrXSk7XHJcbiAgICBpZiAoYWN0aXZlS2V5cy5sZW5ndGggPT09IDApIHJldHVybjtcclxuXHJcbiAgICAvLyDlpI3liLbkuIDku73kvJjlhYjnuqfvvIzku47liY3liLDlkI7kvJjlhYjnuqfku47kvY7liLDpq5jvvIjmnIDlkI7orr7nva7nmoTlrZfmrrXkvJjlhYjvvIlcclxuICAgIGNvbnN0IGtleXNJblByaW9yaXR5ID0gWy4uLmFjdGl2ZUtleXNdO1xyXG4gICAgdGhpcy5kYXRhU291cmNlLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiB7XHJcbiAgICAgIGZvciAobGV0IGkgPSBrZXlzSW5Qcmlvcml0eS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgIGNvbnN0IGZpZWxkID0ga2V5c0luUHJpb3JpdHlbaV07XHJcbiAgICAgICAgY29uc3Qgb3JkZXIgPSB0aGlzLl9zb3J0TWFwW2ZpZWxkXSE7XHJcbiAgICAgICAgY29uc3QgYXYgPSBhPy5bZmllbGRdO1xyXG4gICAgICAgIGNvbnN0IGJ2ID0gYj8uW2ZpZWxkXTtcclxuICAgICAgICBjb25zdCBjbXAgPSB0aGlzLmNvbXBhcmVWYWx1ZXMoYXYsIGJ2KTtcclxuICAgICAgICBpZiAoY21wICE9PSAwKSByZXR1cm4gb3JkZXIgPT09IFwiYXNjZW5kXCIgPyBjbXAgOiAtY21wO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbXBhcmVWYWx1ZXMoYVZhbDogYW55LCBiVmFsOiBhbnkpOiBudW1iZXIge1xyXG4gICAgaWYgKGFWYWwgPT0gbnVsbCAmJiBiVmFsID09IG51bGwpIHJldHVybiAwO1xyXG4gICAgaWYgKGFWYWwgPT0gbnVsbCkgcmV0dXJuIC0xO1xyXG4gICAgaWYgKGJWYWwgPT0gbnVsbCkgcmV0dXJuIDE7XHJcbiAgICBpZiAoYVZhbCBpbnN0YW5jZW9mIERhdGUgJiYgYlZhbCBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgcmV0dXJuIGFWYWwuZ2V0VGltZSgpIC0gYlZhbC5nZXRUaW1lKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIGFWYWwgPT09IFwiYm9vbGVhblwiICYmIHR5cGVvZiBiVmFsID09PSBcImJvb2xlYW5cIikge1xyXG4gICAgICByZXR1cm4gYVZhbCA9PT0gYlZhbCA/IDAgOiBhVmFsID8gMSA6IC0xO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBhVmFsID09PSBcIm51bWJlclwiICYmIHR5cGVvZiBiVmFsID09PSBcIm51bWJlclwiKSB7XHJcbiAgICAgIHJldHVybiBhVmFsIC0gYlZhbDtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgYVZhbCA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgYlZhbCA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICByZXR1cm4gYVZhbC5sb2NhbGVDb21wYXJlKGJWYWwpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgYU51bSA9IE51bWJlcihhVmFsKTtcclxuICAgIGNvbnN0IGJOdW0gPSBOdW1iZXIoYlZhbCk7XHJcbiAgICBpZiAoIWlzTmFOKGFOdW0pICYmICFpc05hTihiTnVtKSkgcmV0dXJuIGFOdW0gLSBiTnVtO1xyXG4gICAgcmV0dXJuIFN0cmluZyhhVmFsKS5sb2NhbGVDb21wYXJlKFN0cmluZyhiVmFsKSk7XHJcbiAgfVxyXG5cclxuICAvLyDmiafooYwgYXV0b0NvbXBsZXRlIOaVsOaNrua6kOafpeivou+8iOWunumZheaJp+ihjOmAu+i+ke+8iVxyXG4gIHByaXZhdGUgZXhlY3V0ZUF1dG9Db21wbGV0ZURhdGFTb3VyY2UoZXZlbnQ6IEV2ZW50LCBjb2x1bW46IFByb1RhYmxlQ29sdW1uKSB7XHJcbiAgICBjb25zdCBmaWVsZEtleSA9IGNvbHVtbi5maWVsZFByb3BzPy5uYW1lIHx8IGNvbHVtbi5wcm9wO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgKGNvbHVtbi5maWVsZFByb3BzIGFzIEF1dG9Db21wbGV0ZUZpZWxkUHJvcHMpLmRhdGFTb3VyY2UgJiZcclxuICAgICAgdHlwZW9mIChjb2x1bW4uZmllbGRQcm9wcyBhcyBBdXRvQ29tcGxldGVGaWVsZFByb3BzKS5kYXRhU291cmNlID09PVxyXG4gICAgICAgIFwiZnVuY3Rpb25cIlxyXG4gICAgKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gKGNvbHVtbi5maWVsZFByb3BzIGFzIEF1dG9Db21wbGV0ZUZpZWxkUHJvcHMpLmRhdGFTb3VyY2UoXHJcbiAgICAgICAgICBldmVudCxcclxuICAgICAgICApO1xyXG4gICAgICAgIC8vIOWmguaenOi/lOWbnueahOaYryBQcm9taXNl77yM5aSE55CG5byC5q2l57uT5p6cXHJcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgIHJlc3VsdFxyXG4gICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2F1dG9Db21wbGV0ZURhdGFTb3VyY2VzW2ZpZWxkS2V5XSA9IGRhdGEgfHwgW107XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQXV0b0NvbXBsZXRlIGRhdGFTb3VyY2UgZXJyb3I6XCIsIGVycm9yKTtcclxuICAgICAgICAgICAgICB0aGlzLl9hdXRvQ29tcGxldGVEYXRhU291cmNlc1tmaWVsZEtleV0gPSBbXTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIOWQjOatpei/lOWbnue7k+aenFxyXG4gICAgICAgICAgdGhpcy5fYXV0b0NvbXBsZXRlRGF0YVNvdXJjZXNbZmllbGRLZXldID0gcmVzdWx0IHx8IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiQXV0b0NvbXBsZXRlIGRhdGFTb3VyY2UgZXJyb3I6XCIsIGVycm9yKTtcclxuICAgICAgICB0aGlzLl9hdXRvQ29tcGxldGVEYXRhU291cmNlc1tmaWVsZEtleV0gPSBbXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFNlYXJjaFBhcmFtcyhvcHRpb25zPzoge1xyXG4gICAgdXNlU2F2ZWQ/OiBib29sZWFuOyAvLyDkvb/nlKjmnIDov5HkuIDmrKHmn6Xor6Lmj5DkuqTnmoTlj4LmlbDvvIzpu5jorqTkuLogZmFsc2XvvJtmYWxzZSDkuLrlvZPliY3ooajljZXlgLxcclxuICB9KTogYW55IHtcclxuICAgIGNvbnN0IHsgdXNlU2F2ZWQgPSBmYWxzZSB9ID0gb3B0aW9ucyB8fCB7fTtcclxuICAgIGNvbnN0IHJhd1BhcmFtcyA9IHVzZVNhdmVkID8gdGhpcy5fc2F2ZWRTZWFyY2hQYXJhbXMgOiB0aGlzLl9zZWFyY2hQYXJhbXM7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBjbG9uZURlZXAocmF3UGFyYW1zIHx8IHt9KTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBwYXJhbXMsXHJcbiAgICAgIHBhZ2VJbmZvOiB7XHJcbiAgICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXgsXHJcbiAgICAgICAgcGFnZVNpemU6IHRoaXMuX3BhZ2VJbmZvLnBhZ2VTaXplLFxyXG4gICAgICB9LFxyXG4gICAgICAvLyDlnKjnur/mjpLluo/mqKHlvI/vvJrmiormjpLluo/lr7nosaHmj5DkuqTnu5nmjqXlj6NcclxuICAgICAgLi4uKHRoaXMuc29ydE1vZGUgPT09IFwic2VydmVyXCJcclxuICAgICAgICA/IHsgc29ydDogdGhpcy5idWlsZFNlcnZlclNvcnRQYXlsb2FkKCkgfVxyXG4gICAgICAgIDoge30pLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWxvYWQoYWZ0ZXJEZWxldGU/OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmhhbmRsZVF1ZXJ5KGFmdGVyRGVsZXRlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRGaWVsZHNWYWx1ZShmaWVsZHM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcclxuICAgIE9iamVjdC5rZXlzKGZpZWxkcykuZm9yRWFjaCgoaykgPT4ge1xyXG4gICAgICB0aGlzLl9zZWFyY2hQYXJhbXNba10gPSBmaWVsZHNba107IC8vIOS/neeVmSBQcm94ee+8jOmAkOmhuei1i+WAvOinpuWPkeaLpuaIqlxyXG5cclxuICAgICAgLy8gY2hlY2tib3gg57G75Z6L6ZyA6KaB5ZCM5q2l5pu05pawIG9wdGlvbnMg55qEIGNoZWNrZWQg54q25oCB77yM5ZCm5YiZIFVJIOS4jeS8muWTjeW6lFxyXG4gICAgICBjb25zdCB0YXJnZXRDb2x1bW4gPSB0aGlzLl9zZWFyY2hGaWxlZENvbHVtbnMuZmluZChcclxuICAgICAgICAoaXRlbSkgPT4gKGl0ZW0uZmllbGRQcm9wcz8ubmFtZSB8fCBpdGVtLnByb3ApID09PSBrLFxyXG4gICAgICApO1xyXG4gICAgICBpZiAodGFyZ2V0Q29sdW1uPy52YWx1ZVR5cGUgPT09IFwiY2hlY2tib3hcIikge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlczogYW55W10gPSBBcnJheS5pc0FycmF5KGZpZWxkc1trXSkgPyBmaWVsZHNba10gOiBbXTtcclxuICAgICAgICBjb25zdCB0YXJnZXRGaWVsZFByb3BzID0gdGFyZ2V0Q29sdW1uLmZpZWxkUHJvcHMgYXMgQ2hlY2tib3hGaWVsZFByb3BzO1xyXG4gICAgICAgIGlmICh0YXJnZXRGaWVsZFByb3BzPy5vcHRpb25zKSB7XHJcbiAgICAgICAgICB0YXJnZXRGaWVsZFByb3BzLm9wdGlvbnMgPSB0YXJnZXRGaWVsZFByb3BzLm9wdGlvbnMubWFwKFxyXG4gICAgICAgICAgICAoaXRlbTogT3B0aW9uc1R5cGUpID0+ICh7XHJcbiAgICAgICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgICAgICBjaGVja2VkOiB2YWx1ZXMuaW5jbHVkZXMoaXRlbS52YWx1ZSksXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEZpZWxkVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMuX3NlYXJjaFBhcmFtc1trZXldID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xlYXJTZWxlY3RlZFJvdygpIHtcclxuICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHNldENvbHVtbnMoXHJcbiAgICBjb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdLFxyXG4gICAgb3B0aW9ucz86IHtcclxuICAgICAgcmVsb2FkPzogYm9vbGVhbjsgLy8g5piv5ZCm6YeN5paw5Yqg6L295pWw5o2u77yM6buY6K6k5Li6IGZhbHNlXHJcbiAgICB9LFxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8g5pu05pawIGNvbHVtbnMg6L6T5YWl5bGe5oCnXHJcbiAgICB0aGlzLmNvbHVtbnMgPSBjbG9uZURlZXAoY29sdW1ucyk7XHJcblxyXG4gICAgLy8g6YeN5paw5qC85byP5YyW5YaF6YOo5YiXXHJcbiAgICB0aGlzLmZvcm1hdGVJbm5lckNvbHVtbnModGhpcy5jb2x1bW5zKTtcclxuXHJcbiAgICAvLyDph43mlrDorr7nva7mkJzntKLlj4LmlbDvvIjlvILmraXmk43kvZzvvIlcclxuICAgIC8vIOWFiOa4heepuuaXp+eahOaQnOe0ouWPguaVsO+8jOmBv+WFjeaXp+aVsOaNruaui+eVmVxyXG4gICAgdGhpcy5fc2VhcmNoUGFyYW1zID0ge307XHJcbiAgICBhd2FpdCB0aGlzLnNldFNlYXJjaFBhcmFtcyh0aGlzLmNvbHVtbnMpO1xyXG5cclxuICAgIC8vIOmHjeaWsOWIm+W7uiBQcm94ee+8jOehruS/neihqOWNlemhueWAvOWPmOWMluiDveato+W4uOinpuWPkeS6i+S7tlxyXG4gICAgdGhpcy5fc2VhcmNoUGFyYW1zID0gdGhpcy5jcmVhdGVTZWFyY2hQYXJhbXNQcm94eSh0aGlzLl9zZWFyY2hQYXJhbXMpO1xyXG5cclxuICAgIC8vIOmHjeaWsOazqOWGjOaooeadv++8iOWmguaenOe7hOS7tuW3sue7j+WIneWni+WMluWujOaIkO+8iVxyXG4gICAgaWYgKHRoaXMuYWxsVGVtcGxhdGVzKSB7XHJcbiAgICAgIHRoaXMuYXV0b1JlZ2lzdGVyVGVtcGxhdGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5aaC5p6c6K6+572u5LqGIHJlbG9hZCDpgInpobnkuLogdHJ1Ze+8jOWImemHjeaWsOafpeivouaVsOaNrlxyXG4gICAgaWYgKG9wdGlvbnM/LnJlbG9hZCA9PT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLmhhbmRsZVF1ZXJ5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRSb3dEYXRhPFQgPSBhbnk+KCk6IFQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkVGFibGVSb3c7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q2hlY2tlZFJvd3M8VCA9IGFueT4oKTogVFtdIHtcclxuICAgIGlmICghdGhpcy5zaG93Q2hlY2tib3gpIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgLy8g6L+U5Zue5b2T5YmN5pWw5o2u5rqQ5Lit5omA5pyJIGNoZWNrZWQg5Li6IHRydWUg55qE6aG5XHJcbiAgICAvLyDms6jmhI/vvJrlpoLmnpzpnIDopoHojrflj5bmiYDmnInpobXnmoTpgInkuK3pobnvvIzpnIDopoHpgY3ljobmiYDmnInmlbDmja7mupDmiJbkvb/nlKggX3NlbGVjdGVkUm93SWRzXHJcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmZpbHRlcigocm93KSA9PiByb3cuY2hlY2tlZCA9PT0gdHJ1ZSkgYXMgVFtdO1xyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+W5oyH5a6a5ZCN56ew55qE5qih5p2/XHJcbiAgZ2V0VGVtcGxhdGUobmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwge1xyXG4gICAgaWYgKCFuYW1lKSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB0aGlzLmN1c3RvbVRlbXBsYXRlcy5nZXQobmFtZSkgfHwgbnVsbDtcclxuICB9XHJcblxyXG4gIGdldFRvb2xUaXBUZXh0VmFsdWUoY29sdW1uOiBQcm9UYWJsZUNvbHVtbiwgZGF0YTogYW55KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGtleSA9XHJcbiAgICAgIGNvbHVtbi5jdXN0b21SZW5kZXIgJiYgdGhpcy5nZXRUZW1wbGF0ZShjb2x1bW4uY3VzdG9tUmVuZGVyKVxyXG4gICAgICAgID8gXCJcIlxyXG4gICAgICAgIDogY29sdW1uLmVsbGlwc2lzXHJcbiAgICAgICAgICA/IGNvbHVtbi5wcm9wXHJcbiAgICAgICAgICA6IFwiXCI7XHJcbiAgICByZXR1cm4gIWtleSA/IFwiXCIgOiBkYXRhW2tleV07XHJcbiAgfVxyXG5cclxuICBnZXRUYWJsZVJvd0NoZWNrZWQoZGF0YTogYW55KSB7XHJcbiAgICAvLyDlkK/nlKjlpI3pgInmoYbml7bvvJrooYzpq5jkuq7lupTkuI7lpI3pgInmoYbpgInkuK3nirbmgIHkuIDoh7TvvIjmlK/mjIHlpJrpgInvvIlcclxuICAgIGlmICh0aGlzLnNob3dDaGVja2JveCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5pc1Jvd0NoZWNrZWQoZGF0YSk7XHJcbiAgICB9XHJcbiAgICAvLyDmnKrlkK/nlKjlpI3pgInmoYbml7bvvJrku43nhLbkvb/nlKjljZXpgInooYzpq5jkuq5cclxuICAgIGlmICghdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdykgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuX3NlbGVjdGVkVGFibGVSb3cpID09PSBKU09OLnN0cmluZ2lmeShkYXRhKTtcclxuICB9XHJcblxyXG4gIC8vIOajgOafpeihjOaYr+WQpuiiq+emgeeUqFxyXG4gIGlzUm93RGlzYWJsZWQoZGF0YTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuc2hvd0NoZWNrYm94KSByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gdGhpcy5yb3dEaXNhYmxlZCA/IHRoaXMucm93RGlzYWJsZWQoZGF0YSkgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIOajgOafpeihjOaYr+WQpuiiq+WkjemAieahhumAieS4re+8iOaVsOaNrumpseWKqOaooeW8j++8iVxyXG4gIGlzUm93Q2hlY2tlZChkYXRhOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5zaG93Q2hlY2tib3gpIHJldHVybiBmYWxzZTtcclxuICAgIC8vIOebtOaOpeivu+WPluaVsOaNruWvueixoeeahCBjaGVja2VkIOWxnuaAp1xyXG4gICAgcmV0dXJuIGRhdGEuY2hlY2tlZCA9PT0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vIOWIh+aNouihjOeahOmAieS4reeKtuaAge+8iOaVsOaNrumpseWKqOaooeW8j++8jOS/neeVmeeUqOS6juWFvOWuue+8iVxyXG4gIHRvZ2dsZVJvd0NoZWNrZWQoZGF0YTogYW55LCBjaGVja2VkOiBib29sZWFuLCBldmVudD86IEV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIOmYu+atouS6i+S7tuWGkuazoe+8jOmBv+WFjeinpuWPkeihjOeCueWHu1xyXG4gICAgfVxyXG4gICAgLy8g5aaC5p6c6KGM6KKr56aB55So77yM5LiN5YWB6K645YiH5o2i6YCJ5Lit54q25oCBXHJcbiAgICBpZiAodGhpcy5pc1Jvd0Rpc2FibGVkKGRhdGEpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyDnm7TmjqXorr7nva7mlbDmja7lr7nosaHnmoQgY2hlY2tlZCDlsZ7mgKdcclxuICAgIGRhdGEuY2hlY2tlZCA9IGNoZWNrZWQ7XHJcblxyXG4gICAgLy8g5ZCM5q2l5pu05pawIF9zZWxlY3RlZFJvd3PvvIjnlKjkuo7lhbzlrrnmgKfvvIlcclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fc2VsZWN0ZWRSb3dzLmZpbmRJbmRleCgocm93KSA9PlxyXG4gICAgICB0aGlzLmlzU2FtZVJvdyhyb3csIGRhdGEpLFxyXG4gICAgKTtcclxuICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd3MucHVzaChkYXRhKTtcclxuICAgICAgfVxyXG4gICAgICAvLyDli77pgInlpI3pgInmoYbml7blkIzmraXorr7nva7pq5jkuq7pgInkuK3ooYxcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IGRhdGE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUm93cy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIOiLpeW9k+WJjemrmOS6ruihjOS4uuivpeihjO+8jOWImeWPlua2iOmrmOS6rlxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyAmJlxyXG4gICAgICAgIHRoaXMuaXNTYW1lUm93KHRoaXMuX3NlbGVjdGVkVGFibGVSb3csIGRhdGEpXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVDaGVja0FsbFN0YXR1cygpO1xyXG4gIH1cclxuXHJcbiAgLy8g5pu05paw5YWo6YCJ54q25oCB77yI5pWw5o2u6amx5Yqo5qih5byP77yJXHJcbiAgdXBkYXRlQ2hlY2tBbGxTdGF0dXMoKSB7XHJcbiAgICBpZiAoIXRoaXMuc2hvd0NoZWNrYm94IHx8ICFBcnJheS5pc0FycmF5KHRoaXMuZGF0YVNvdXJjZSkpIHtcclxuICAgICAgdGhpcy5fY2hlY2tlZEFsbCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9pbmRldGVybWluYXRlID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIOWPquiuoeeul+WPr+eUqOeahOihjO+8iOacquemgeeUqOeahOihjO+8iVxyXG4gICAgY29uc3QgYXZhaWxhYmxlUm93cyA9IHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIoXHJcbiAgICAgIChyb3cpID0+ICF0aGlzLmlzUm93RGlzYWJsZWQocm93KSxcclxuICAgICk7XHJcbiAgICAvLyDln7rkuo7mlbDmja7lr7nosaHnmoQgY2hlY2tlZCDlsZ7mgKforqHnrpdcclxuICAgIGNvbnN0IGNoZWNrZWRDb3VudCA9IGF2YWlsYWJsZVJvd3MuZmlsdGVyKFxyXG4gICAgICAocm93KSA9PiByb3cuY2hlY2tlZCA9PT0gdHJ1ZSxcclxuICAgICkubGVuZ3RoO1xyXG4gICAgY29uc3QgdG90YWxDb3VudCA9IGF2YWlsYWJsZVJvd3MubGVuZ3RoO1xyXG4gICAgdGhpcy5fY2hlY2tlZEFsbCA9XHJcbiAgICAgIHRvdGFsQ291bnQgPiAwICYmIGNoZWNrZWRDb3VudCA+IDAgJiYgY2hlY2tlZENvdW50ID09PSB0b3RhbENvdW50O1xyXG4gICAgdGhpcy5faW5kZXRlcm1pbmF0ZSA9IGNoZWNrZWRDb3VudCA+IDAgJiYgY2hlY2tlZENvdW50IDwgdG90YWxDb3VudDtcclxuICB9XHJcblxyXG4gIC8vIOWFqOmAiS/lj5bmtojlhajpgInvvIjmlbDmja7pqbHliqjmqKHlvI/vvIlcclxuICB0b2dnbGVDaGVja0FsbChjaGVja2VkOiBib29sZWFuLCBldmVudD86IEV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5Y+q5aSE55CG5Y+v55So55qE6KGM77yI5pyq56aB55So55qE6KGM77yJXHJcbiAgICBjb25zdCBhdmFpbGFibGVSb3dzID0gdGhpcy5kYXRhU291cmNlLmZpbHRlcihcclxuICAgICAgKHJvdykgPT4gIXRoaXMuaXNSb3dEaXNhYmxlZChyb3cpLFxyXG4gICAgKTtcclxuXHJcbiAgICAvLyDmibnph4/orr7nva4gY2hlY2tlZCDlsZ7mgKdcclxuICAgIGF2YWlsYWJsZVJvd3MuZm9yRWFjaCgocm93KSA9PiB7XHJcbiAgICAgIHJvdy5jaGVja2VkID0gY2hlY2tlZDtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIOWQjOatpeabtOaWsCBfc2VsZWN0ZWRSb3dz77yI55So5LqO5YW85a655oCn77yJXHJcbiAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZFJvd3MgPSBbLi4uYXZhaWxhYmxlUm93c107XHJcbiAgICAgIC8vIOWQjOatpeiuvue9rumrmOS6rumAieS4reihjOS4uuesrOS4gOadoeWPr+mAieaVsOaNrlxyXG4gICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID1cclxuICAgICAgICBhdmFpbGFibGVSb3dzLmxlbmd0aCA+IDAgPyBhdmFpbGFibGVSb3dzWzBdIDogbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkUm93cyA9IFtdO1xyXG4gICAgICAvLyDlj5bmtojpq5jkuq5cclxuICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVDaGVja0FsbFN0YXR1cygpO1xyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+W6YCJ5Lit55qE6KGM5pWw5o2u77yI5L+d55WZ55So5LqO5YW85a655oCn77yJXHJcbiAgZ2V0U2VsZWN0ZWRSb3dzKCk6IGFueVtdIHtcclxuICAgIHJldHVybiB0aGlzLmdldENoZWNrZWRSb3dzKCk7XHJcbiAgfVxyXG5cclxuICAvLyDlpITnkIbooYwgY2hlY2tib3gg5Y+Y5YyW5LqL5Lu277yI5pWw5o2u6amx5Yqo5qih5byP77yJXHJcbiAgaGFuZGxlUm93Q2hlY2tlZENoYW5nZShkYXRhOiBhbnksIGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzUm93RGlzYWJsZWQoZGF0YSkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOaVsOaNruWvueixoeeahCBjaGVja2VkIOWxnuaAp+W3sue7j+mAmui/h+WPjOWQkee7keWumuiHquWKqOabtOaWsFxyXG4gICAgLy8g6L+Z6YeM5Y+q6ZyA6KaB5ZCM5q2l5pu05pawIF9zZWxlY3RlZFJvd3NcclxuXHJcbiAgICAvLyDlkIzmraXmm7TmlrAgX3NlbGVjdGVkUm93c++8iOeUqOS6juWFvOWuueaAp++8iVxyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9zZWxlY3RlZFJvd3MuZmluZEluZGV4KChyb3cpID0+XHJcbiAgICAgIHRoaXMuaXNTYW1lUm93KHJvdywgZGF0YSksXHJcbiAgICApO1xyXG4gICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUm93cy5wdXNoKGRhdGEpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIOWLvumAieWkjemAieahhuaXtuWQjOatpeiuvue9rumrmOS6rumAieS4reihjFxyXG4gICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gZGF0YTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8g6Iul5b2T5YmN6auY5Lqu6KGM5Li66K+l6KGM77yM5YiZ5Y+W5raI6auY5LquXHJcbiAgICAgIGlmIChcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ICYmXHJcbiAgICAgICAgdGhpcy5pc1NhbWVSb3codGhpcy5fc2VsZWN0ZWRUYWJsZVJvdywgZGF0YSlcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyDmm7TmlrDlhajpgInnirbmgIFcclxuICAgIHRoaXMudXBkYXRlQ2hlY2tBbGxTdGF0dXMoKTtcclxuICB9XHJcblxyXG4gIC8vIOWIt+aWsOWFqOmAieeKtuaAge+8iOeUqOS6juWFtuS7luWcuuaZr++8iVxyXG4gIHJlZnJlc2hDaGVja0FsbFN0YXR1cygpOiB2b2lkIHtcclxuICAgIHRoaXMudXBkYXRlQ2hlY2tBbGxTdGF0dXMoKTtcclxuICB9XHJcblxyXG4gIC8vIOiOt+WPluihjOeahOWUr+S4gOagh+ivhu+8iOeUqOS6jui3qOmhtemAieS4re+8iVxyXG4gIHByaXZhdGUgZ2V0Um93SWQoZGF0YTogYW55KTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiBkYXRhLmlkID8/IGRhdGEua2V5ID8/IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIC8vIOWIpOaWreS4pOihjOaYr+WQpuS4uuWQjOS4gOihjFxyXG4gIHByaXZhdGUgaXNTYW1lUm93KHJvdzE6IGFueSwgcm93MjogYW55KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBpZDEgPSB0aGlzLmdldFJvd0lkKHJvdzEpO1xyXG4gICAgY29uc3QgaWQyID0gdGhpcy5nZXRSb3dJZChyb3cyKTtcclxuXHJcbiAgICBpZiAoaWQxICE9PSB1bmRlZmluZWQgJiYgaWQyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIGlkMSA9PT0gaWQyO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGZhbGxiYWNrIOWIsCBKU09OIOavlOi+g1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJvdzEpID09PSBKU09OLnN0cmluZ2lmeShyb3cyKTtcclxuICB9XHJcblxyXG4gIC8vIOa4heepuumAieS4reeahOihjO+8iOaVsOaNrumpseWKqOaooeW8j++8iVxyXG4gIGNsZWFyU2VsZWN0ZWRSb3dzKCkge1xyXG4gICAgLy8g5riF56m65b2T5YmN5pWw5o2u5rqQ5Lit5omA5pyJ6aG555qEIGNoZWNrZWQg54q25oCBXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmRhdGFTb3VyY2UpKSB7XHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5mb3JFYWNoKChyb3cpID0+IHtcclxuICAgICAgICByb3cuY2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9zZWxlY3RlZFJvd3MgPSBbXTtcclxuICAgIHRoaXMuX2NoZWNrZWRBbGwgPSBmYWxzZTtcclxuICAgIHRoaXMuX2luZGV0ZXJtaW5hdGUgPSBmYWxzZTtcclxuICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlRmllbGRDaGVja0JveENoYW5nZShjaGVja0JveE9wdGlvbnM6IE9wdGlvbnNUeXBlW10sIGtleTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNldEZpZWxkc1ZhbHVlKHtcclxuICAgICAgW2tleV06IGNoZWNrQm94T3B0aW9uc1xyXG4gICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uY2hlY2tlZClcclxuICAgICAgICAubWFwKChpdGVtKSA9PiBpdGVtLnZhbHVlKSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlU2VhcmNoKCkge1xyXG4gICAgdGhpcy5fc2F2ZWRTZWFyY2hQYXJhbXMgPSB0aGlzLmNsZWFyRW1wdHlTZWFyY2hQYXJhbXMoKTtcclxuICAgIHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCA9IDE7XHJcbiAgICB0aGlzLmhhbmRsZVF1ZXJ5KCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVSZXNldEZvcm0oKSB7XHJcbiAgICBPYmplY3Qua2V5cyh0aGlzLl9zZWFyY2hQYXJhbXMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICBjb25zdCB0YXJnZXRDb2x1bW4gPSB0aGlzLl9zZWFyY2hGaWxlZENvbHVtbnMuZmluZCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoaXRlbS5maWVsZFByb3BzPy5uYW1lIHx8IGl0ZW0ucHJvcCkgPT09IGtleTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyDlr7nkuo5jaGVja2JveOexu+Wei++8jOmcgOimgeeJueauiuWkhOeQhum7mOiupOWAvFxyXG4gICAgICBpZiAodGFyZ2V0Q29sdW1uPy52YWx1ZVR5cGUgPT09IFwiY2hlY2tib3hcIikge1xyXG4gICAgICAgIC8vIOS7juWOn+Wni2NvbHVtbnPphY3nva7kuK3ojrflj5bliJ3lp4vphY3nva7vvIzku6Xnoa7kv53kvb/nlKjmraPnoa7nmoTpu5jorqTlgLxcclxuICAgICAgICBjb25zdCBvcmlnaW5hbENvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gKGl0ZW0uZmllbGRQcm9wcz8ubmFtZSB8fCBpdGVtLnByb3ApID09PSBrZXk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIOS7juWOn+Wni29wdGlvbnPkuK3mib7lh7pjaGVja2Vk5Li6dHJ1ZeeahOmhueS9nOS4uum7mOiupOWAvFxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsRmllbGRQcm9wcyA9IG9yaWdpbmFsQ29sdW1uPy5maWVsZFByb3BzIGFzXHJcbiAgICAgICAgICB8IENoZWNrYm94RmllbGRQcm9wc1xyXG4gICAgICAgICAgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgY29uc3QgY2hlY2tlZFZhbHVlcyA9IChvcmlnaW5hbEZpZWxkUHJvcHM/Lm9wdGlvbnMgfHwgW10pXHJcbiAgICAgICAgICAuZmlsdGVyKChvcHQ6IE9wdGlvbnNUeXBlKSA9PiBvcHQuY2hlY2tlZClcclxuICAgICAgICAgIC5tYXAoKG9wdDogT3B0aW9uc1R5cGUpID0+IG9wdC52YWx1ZSk7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID1cclxuICAgICAgICAgIGNoZWNrZWRWYWx1ZXMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICA/IGNoZWNrZWRWYWx1ZXNcclxuICAgICAgICAgICAgOiBQUk9fVEFCTEVfREVGQVVMVF9QUk9QU1t0YXJnZXRDb2x1bW4udmFsdWVUeXBlXS52YWx1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2VhcmNoUGFyYW1zW2tleV0gPSBkZWZhdWx0VmFsdWU7XHJcblxyXG4gICAgICAgIC8vIOagueaNrum7mOiupOWAvOaBouWkjW9wdGlvbnPnmoRjaGVja2Vk54q25oCB77yM5L2/55So5Y6f5aeLb3B0aW9uc+eahOe7k+aehFxyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZXMgPSBBcnJheS5pc0FycmF5KGRlZmF1bHRWYWx1ZSkgPyBkZWZhdWx0VmFsdWUgOiBbXTtcclxuICAgICAgICBjb25zdCBvcmlnaW5hbE9wdGlvbnMgPSBvcmlnaW5hbEZpZWxkUHJvcHM/Lm9wdGlvbnMgfHwgW107XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0RmllbGRQcm9wcyA9IHRhcmdldENvbHVtbi5maWVsZFByb3BzIGFzIENoZWNrYm94RmllbGRQcm9wcztcclxuICAgICAgICB0YXJnZXRGaWVsZFByb3BzLm9wdGlvbnMgPSBvcmlnaW5hbE9wdGlvbnMubWFwKChpdGVtOiBPcHRpb25zVHlwZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgICAgY2hlY2tlZDogZGVmYXVsdFZhbHVlcy5pbmNsdWRlcyhpdGVtLnZhbHVlKSxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fc2VhcmNoUGFyYW1zW2tleV0gPSB0YXJnZXRDb2x1bW4/LmZpZWxkUHJvcHNcclxuICAgICAgICAgID8gdGFyZ2V0Q29sdW1uPy5maWVsZFByb3BzLnZhbHVlIHx8XHJcbiAgICAgICAgICAgIFBST19UQUJMRV9ERUZBVUxUX1BST1BTW3RhcmdldENvbHVtbi52YWx1ZVR5cGVdLnZhbHVlXHJcbiAgICAgICAgICA6IFBST19UQUJMRV9ERUZBVUxUX1BST1BTW3RhcmdldENvbHVtbi52YWx1ZVR5cGVdLnZhbHVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLl9zYXZlZFNlYXJjaFBhcmFtcyA9IHt9O1xyXG4gICAgdGhpcy5fcGFnZUluZm8ucGFnZUluZGV4ID0gMTtcclxuICAgIHRoaXMub25SZXNldEZvcm1CZWZvcmVSZWxvYWQuZW1pdCgpO1xyXG4gICAgdGhpcy5oYW5kbGVRdWVyeSgpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlUGFnZUluZGV4Q2hhbmdlKHBhZ2VJbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXggPSBwYWdlSW5kZXg7XHJcbiAgICB0aGlzLmhhbmRsZVF1ZXJ5KCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVQYWdlU2l6ZUNoYW5nZShwYWdlU2l6ZTogYW55KSB7XHJcbiAgICB0aGlzLl9wYWdlSW5mby5wYWdlU2l6ZSA9IHBhZ2VTaXplO1xyXG4gICAgdGhpcy5fcGFnZUluZm8ucGFnZUluZGV4ID0gMTtcclxuICAgIHRoaXMuaGFuZGxlUXVlcnkoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGhhbmRsZVF1ZXJ5KGFmdGVyRGVsZXRlPzogYm9vbGVhbikge1xyXG4gICAgLy8g5Yig6Zmk5ZCO5Yi35paw5LiU5b2T5YmN6aG15LuF5Ymp5LiA5p2h6K6w5b2V5pe277yM6Iul5LiN5Zyo56ys5LiA6aG15YiZ5YWI5Zue6YCA5LiA6aG1XHJcbiAgICBpZiAoXHJcbiAgICAgIGFmdGVyRGVsZXRlICYmXHJcbiAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5kYXRhU291cmNlKSAmJlxyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UubGVuZ3RoID09PSAxICYmXHJcbiAgICAgIHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCA+IDFcclxuICAgICkge1xyXG4gICAgICB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXggPSB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXggLSAxO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2xvYWRpbmcgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMucmVxdWVzdCkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdCh7XHJcbiAgICAgICAgICBwYXJhbXM6IHRoaXMuY2xlYXJFbXB0eVNlYXJjaFBhcmFtcygpLFxyXG4gICAgICAgICAgcGFnZUluZm86IHtcclxuICAgICAgICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXgsXHJcbiAgICAgICAgICAgIHBhZ2VTaXplOiB0aGlzLl9wYWdlSW5mby5wYWdlU2l6ZSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAvLyDlnKjnur/mjpLluo/mqKHlvI/vvJrmiormjpLluo/lr7nosaHmj5DkuqTnu5nmjqXlj6NcclxuICAgICAgICAgIC4uLih0aGlzLnNvcnRNb2RlID09PSBcInNlcnZlclwiXHJcbiAgICAgICAgICAgID8geyBzb3J0OiB0aGlzLmJ1aWxkU2VydmVyU29ydFBheWxvYWQoKSB9XHJcbiAgICAgICAgICAgIDoge30pLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyDmn6Xor6LlkI7pu5jorqTkuI3kv53nlZnot6jpobXpgInkuK3nirbmgIHvvJrmr4/mrKHov5Tlm57nmoTmlbDmja7lnYfliJ3lp4vljJbkuLrmnKrpgInkuK1cclxuICAgICAgICBpZiAodGhpcy5zaG93Q2hlY2tib3gpIHtcclxuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IChyZXN1bHQuZGF0YSB8fCBbXSkubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgICAgICBjaGVja2VkOiBmYWxzZSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSByZXN1bHQuZGF0YSB8fCBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc3VtbWFyeURhdGEgPSByZXN1bHQuc3VtbWFyeURhdGEgfHwgbnVsbDtcclxuICAgICAgICAvLyDmnKzlnLDmjpLluo/mqKHlvI/vvJrmi7/liLDmlbDmja7lkI7lnKjliY3nq6/mjpLluo9cclxuICAgICAgICBpZiAodGhpcy5zb3J0TW9kZSA9PT0gXCJsb2NhbFwiKSB7XHJcbiAgICAgICAgICB0aGlzLnNvcnREYXRhU291cmNlSW5QbGFjZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9wYWdlSW5mby50b3RhbCA9IHJlc3VsdC50b3RhbCB8fCAwO1xyXG4gICAgICAgIC8vIOWPlua2iOi3qOmhteWkmumAie+8muafpeivouWQjua4heepuumAieS4reeKtuaAgVxyXG4gICAgICAgIGlmICh0aGlzLnNob3dDaGVja2JveCkge1xyXG4gICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGVkUm93cygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwi5p+l6K+i5aSx6LSlOlwiLCBlcnJvcik7XHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gW107XHJcbiAgICAgICAgdGhpcy5fcGFnZUluZm8udG90YWwgPSAwO1xyXG4gICAgICAgIHRoaXMuc3VtbWFyeURhdGEgPSBudWxsO1xyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIHRoaXMuX2xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKFwi5pyq5o+Q5L6bIF9yZXF1ZXN0IOWbnuiwg+WHveaVsFwiKTtcclxuICAgICAgdGhpcy5fbG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g6Kem5Y+R5YiX5o6S5bqP5Y+Y5pu0XHJcbiAgb25Tb3J0Q2hhbmdlKHNvcnRLZXk6IHN0cmluZywgc29ydE9yZGVyOiBcImFzY2VuZFwiIHwgXCJkZXNjZW5kXCIgfCBudWxsKSB7XHJcbiAgICAvLyDljZXliJfmjpLluo/vvJrph43nva7lhbblroPliJfvvJvlpJrliJfmjpLluo/vvJrkv53nlZnlhbblroPliJdcclxuICAgIGlmICghdGhpcy5tdWx0aXBsZVNvcnQpIHtcclxuICAgICAgT2JqZWN0LmtleXModGhpcy5fc29ydE1hcCkuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgaWYgKGtleSAhPT0gc29ydEtleSkgdGhpcy5fc29ydE1hcFtrZXldID0gbnVsbDtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9zb3J0TWFwW3NvcnRLZXldID0gc29ydE9yZGVyO1xyXG5cclxuICAgIC8vIOe7tOaKpOS8mOWFiOe6p+mYn+WIl++8muacieW6j+WIl+S4lOmdnuepuiAtPiDnva7kuo7mnKvlsL7vvJvkuLrnqbogLT4g56e76ZmkXHJcbiAgICB0aGlzLl9zb3J0UHJpb3JpdHkgPSB0aGlzLl9zb3J0UHJpb3JpdHkuZmlsdGVyKChrKSA9PiBrICE9PSBzb3J0S2V5KTtcclxuICAgIGlmIChzb3J0T3JkZXIpIHtcclxuICAgICAgdGhpcy5fc29ydFByaW9yaXR5LnB1c2goc29ydEtleSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc29ydE1vZGUgPT09IFwibG9jYWxcIikge1xyXG4gICAgICB0aGlzLnNvcnREYXRhU291cmNlSW5QbGFjZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g5Zyo57q/5o6S5bqP77ya6YeN5paw6K+35rGCXHJcbiAgICAgIHRoaXMuaGFuZGxlUXVlcnkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFNvcnRPcmRlcihzb3J0S2V5OiBzdHJpbmcpOiBcImFzY2VuZFwiIHwgXCJkZXNjZW5kXCIgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9zb3J0TWFwW3NvcnRLZXldIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVUYWJsZVJvd0NsaWNrKGRhdGE6IGFueSkge1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IGRhdGE7XHJcbiAgICBpZiAodGhpcy5zaG93Q2hlY2tib3ggJiYgIXRoaXMuaXNSb3dEaXNhYmxlZChkYXRhKSkge1xyXG4gICAgICAvLyDlhYjmuIXnqbrmiYDmnInpgInkuK3ooYxcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzID0gW107XHJcbiAgICAgIGNvbnN0IG5leHRDaGVja2VkID0gIXRoaXMuaXNSb3dDaGVja2VkKGRhdGEpO1xyXG4gICAgICB0aGlzLnRvZ2dsZVJvd0NoZWNrZWQoZGF0YSwgbmV4dENoZWNrZWQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vblJvd0NsaWNrLmVtaXQodGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVUYWJsZVJvd0RiQ2xpY2soZGF0YTogYW55KSB7XHJcbiAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gZGF0YTtcclxuICAgIHRoaXMub25Sb3dEYkNsaWNrLmVtaXQodGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVDb2x1bW5zU2V0dGluZ0NvbmZpcm0oKSB7XHJcbiAgICB0aGlzLnF1ZXJ5RHluYW1pY0NvbHVtbnMoKTtcclxuICB9XHJcblxyXG4gIC8vIOWkhOeQhiBhdXRvQ29tcGxldGUg6L6T5YWl5LqL5Lu277yI5bim6Ziy5oqW77yJXHJcbiAgaGFuZGxlQXV0b0NvbXBsZXRlSW5wdXQoZXZlbnQ6IEV2ZW50LCBjb2x1bW46IFByb1RhYmxlQ29sdW1uKSB7XHJcbiAgICBjb25zdCBmaWVsZEtleSA9IGNvbHVtbi5maWVsZFByb3BzPy5uYW1lIHx8IGNvbHVtbi5wcm9wO1xyXG5cclxuICAgIC8vIOWmguaenOivpeWtl+autei/mOayoeaciemYsuaKluWHveaVsO+8jOWIm+W7uuS4gOS4qlxyXG4gICAgaWYgKCF0aGlzLl9hdXRvQ29tcGxldGVEZWJvdW5jZU1hcC5oYXMoZmllbGRLZXkpKSB7XHJcbiAgICAgIGNvbnN0IGRlYm91bmNlZEZuID0gZGVib3VuY2UoKGV2dDogRXZlbnQpID0+IHtcclxuICAgICAgICAvLyDph43mlrDmn6Xmib7lr7nlupTnmoQgY29sdW1u77yM56Gu5L+d5L2/55So5pyA5paw55qE6YWN572uXHJcbiAgICAgICAgY29uc3QgY3VycmVudENvbHVtbiA9IHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucy5maW5kKFxyXG4gICAgICAgICAgKGNvbCkgPT4gKGNvbC5maWVsZFByb3BzPy5uYW1lIHx8IGNvbC5wcm9wKSA9PT0gZmllbGRLZXksXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoY3VycmVudENvbHVtbikge1xyXG4gICAgICAgICAgdGhpcy5leGVjdXRlQXV0b0NvbXBsZXRlRGF0YVNvdXJjZShldnQsIGN1cnJlbnRDb2x1bW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgMzAwKTsgLy8gMzAwbXMg6Ziy5oqW5bu26L+fXHJcbiAgICAgIHRoaXMuX2F1dG9Db21wbGV0ZURlYm91bmNlTWFwLnNldChmaWVsZEtleSwgZGVib3VuY2VkRm4pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOiwg+eUqOmYsuaKluWHveaVsFxyXG4gICAgY29uc3QgZGVib3VuY2VkRm4gPSB0aGlzLl9hdXRvQ29tcGxldGVEZWJvdW5jZU1hcC5nZXQoZmllbGRLZXkpO1xyXG4gICAgaWYgKGRlYm91bmNlZEZuKSB7XHJcbiAgICAgIGRlYm91bmNlZEZuKGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOiOt+WPliBhdXRvQ29tcGxldGUg55qE5pWw5o2u5rqQXHJcbiAgZ2V0QXV0b0NvbXBsZXRlRGF0YVNvdXJjZShjb2x1bW46IFByb1RhYmxlQ29sdW1uKTogYW55W10ge1xyXG4gICAgY29uc3QgZmllbGRLZXkgPSBjb2x1bW4uZmllbGRQcm9wcz8ubmFtZSB8fCBjb2x1bW4ucHJvcDtcclxuICAgIHJldHVybiB0aGlzLl9hdXRvQ29tcGxldGVEYXRhU291cmNlc1tmaWVsZEtleV0gfHwgW107XHJcbiAgfVxyXG5cclxuICBnZXRGaWVsZFByb3BzKGNvbHVtbjogUHJvVGFibGVDb2x1bW4pOiBhbnkge1xyXG4gICAgcmV0dXJuIGNvbHVtbi5maWVsZFByb3BzO1xyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+W5oyH5a6a5ZCN56ew55qEbGFiZWzmqKHmnb9cclxuICBnZXRMYWJlbFRlbXBsYXRlKG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsIHtcclxuICAgIGlmICghbmFtZSkgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4gdGhpcy5jdXN0b21UZW1wbGF0ZXMuZ2V0KG5hbWUpIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLyDojrflj5YgZm9ybS1pdGVtIOeahOWKqOaAgeexu+WQjVxyXG4gIGdldEZvcm1JdGVtQ2xhc3NOYW1lKGNvbHVtbjogUHJvVGFibGVDb2x1bW4pOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZmllbGROYW1lID0gdGhpcy5nZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcDtcclxuICAgIHJldHVybiBgcHJvLXRhYmxlLSR7ZmllbGROYW1lfS1mb3JtLWl0ZW1gO1xyXG4gIH1cclxufVxyXG4iLCI8YXBwLXBhZ2UtY29udGFpbmVyXHJcbiAgW3RpdGxlXT1cInRpdGxlXCJcclxuICBbc2hvd0hlYWRlcl09XCJzaG93U2VhcmNoQmFyXCJcclxuICBbYm9keVN0eWxlXT1cImJvZHlTdHlsZVwiXHJcbiAgbmdDbGFzcz1cInByby10YWJsZS1jb250YWluZXJcIlxyXG4+XHJcbiAgPCEtLSDlop7liqDoh6rlrprkuYnlhoXlrrnljLotLT5cclxuICA8bmctdGVtcGxhdGUgI2N1c3RvbUNvbnRlbnQ+XHJcbiAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICpuZ0lmPVwiY3VzdG9tQ29udGVudFRwbFwiXHJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImN1c3RvbUNvbnRlbnRUcGxcIlxyXG4gICAgPjwvbmctY29udGFpbmVyPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gIDxuZy10ZW1wbGF0ZSAjaGVhZGVyPlxyXG4gICAgPGFwcC10YWJsZS1zZWFyY2gtYmFyXHJcbiAgICAgICpuZ0lmPVwic2hvd1NlYXJjaEJhclwiXHJcbiAgICAgIFtsYWJlbFdpZHRoXT1cImxhYmVsV2lkdGhcIlxyXG4gICAgICBbbGFiZWxBbGlnbl09XCJsYWJlbEFsaWduXCJcclxuICAgICAgW3NlYXJjaENvbENvdW50XT1cInRhYmxlU2VhcmNoQ29sQ291bnRcIlxyXG4gICAgPlxyXG4gICAgICA8bmctdGVtcGxhdGUgI2xlZnRDb250ZW50PlxyXG4gICAgICAgIDxuei1mb3JtLWl0ZW1cclxuICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgX3NlYXJjaEZpbGVkQ29sdW1uc1wiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXRGb3JtSXRlbUNsYXNzTmFtZShjb2x1bW4pXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bnotZm9ybS1sYWJlbCAqbmdJZj1cIiFnZXRGaWVsZFByb3BzKGNvbHVtbikuaGlkZUxhYmVsXCIgbnpOb0NvbG9uPlxyXG4gICAgICAgICAgICA8IS0tIOajgOafpeaYr+WQpuacieiHquWumuS5iWxhYmVs5qih5p2/IC0tPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgIGNvbHVtbi5jdXN0b21MYWJlbFJlbmRlciAmJlxyXG4gICAgICAgICAgICAgICAgICBnZXRMYWJlbFRlbXBsYXRlKGNvbHVtbi5jdXN0b21MYWJlbFJlbmRlcik7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGRlZmF1bHRMYWJlbFxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRMYWJlbFRlbXBsYXRlKGNvbHVtbi5jdXN0b21MYWJlbFJlbmRlcilcIlxyXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcclxuICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBjb2x1bW4sXHJcbiAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLFxyXG4gICAgICAgICAgICAgICAgICBmaWVsZFByb3BzOiBnZXRGaWVsZFByb3BzKGNvbHVtbilcclxuICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdExhYmVsPlxyXG4gICAgICAgICAgICAgIHt7IGdldEZpZWxkUHJvcHMoY29sdW1uKS5sYWJlbCB8fCBjb2x1bW4udGl0bGUgfX1cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvbnotZm9ybS1sYWJlbD5cclxuICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgKm5nSWY9XCJjb2x1bW4udmFsdWVUeXBlID09PSAnaW5wdXQnXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIG56LWlucHV0XHJcbiAgICAgICAgICAgICAgW25hbWVdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BcIlxyXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikucGxhY2VIb2xkZXJcIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiXHJcbiAgICAgICAgICAgICAgICBfc2VhcmNoUGFyYW1zW2dldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wXVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgKm5nSWY9XCJjb2x1bW4udmFsdWVUeXBlID09PSAnaW5wdXRQbGF0ZSdcIj5cclxuICAgICAgICAgICAgPGFwcC1wbGF0ZS1pbnB1dFxyXG4gICAgICAgICAgICAgIFt1c2FnZV09XCInZmlsdGVyJ1wiXHJcbiAgICAgICAgICAgICAgW25hbWVdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiXHJcbiAgICAgICAgICAgICAgICBfc2VhcmNoUGFyYW1zW2dldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wXVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID48L2FwcC1wbGF0ZS1pbnB1dD5cclxuICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgICAgPG56LWZvcm0tY29udHJvbCAqbmdJZj1cImNvbHVtbi52YWx1ZVR5cGUgPT09ICdzZWxlY3QnXCI+XHJcbiAgICAgICAgICAgIDxuei1zZWxlY3RcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIlxyXG4gICAgICAgICAgICAgICAgX3NlYXJjaFBhcmFtc1tnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcF1cclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIFtuekFsbG93Q2xlYXJdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmFsbG93Q2xlYXJcIlxyXG4gICAgICAgICAgICAgIFtuelBsYWNlSG9sZGVyXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5wbGFjZUhvbGRlclwiXHJcbiAgICAgICAgICAgICAgW25hbWVdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BcIlxyXG4gICAgICAgICAgICAgIFtuekRpc2FibGVkXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgW256U2hvd1NlYXJjaF09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuc2hvd1NlYXJjaFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8bnotb3B0aW9uXHJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0IG9mIGdldEZpZWxkUHJvcHMoY29sdW1uKS5vcHRpb25zXCJcclxuICAgICAgICAgICAgICAgIFtuelZhbHVlXT1cIm9wdC52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICBbbnpMYWJlbF09XCJvcHQubGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgW256RGlzYWJsZWRdPVwib3B0LmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgIFtuelRpdGxlXT1cIm9wdC50b29sdGlwIHx8IG9wdC5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgPjwvbnotb3B0aW9uPlxyXG4gICAgICAgICAgICA8L256LXNlbGVjdD5cclxuICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgICAgPG56LWZvcm0tY29udHJvbCAqbmdJZj1cImNvbHVtbi52YWx1ZVR5cGUgPT09ICdzZWxlY3RNdWx0aXBsZSdcIj5cclxuICAgICAgICAgICAgPG56LXNlbGVjdFxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiXHJcbiAgICAgICAgICAgICAgICBfc2VhcmNoUGFyYW1zW2dldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wXVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgW256QWxsb3dDbGVhcl09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuYWxsb3dDbGVhclwiXHJcbiAgICAgICAgICAgICAgW256UGxhY2VIb2xkZXJdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLnBsYWNlSG9sZGVyXCJcclxuICAgICAgICAgICAgICBbbmFtZV09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcFwiXHJcbiAgICAgICAgICAgICAgW256RGlzYWJsZWRdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICBbbnpTaG93U2VhcmNoXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5zaG93U2VhcmNoXCJcclxuICAgICAgICAgICAgICBuek1vZGU9XCJtdWx0aXBsZVwiXHJcbiAgICAgICAgICAgICAgW256TWF4VGFnQ291bnRdPVwiMlwiXHJcbiAgICAgICAgICAgICAgW256TWF4VGFnUGxhY2Vob2xkZXJdPVwibnpNYXhUYWdQbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgW256Q3VzdG9tVGVtcGxhdGVdPVwiZGVmYXVsdFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxuei1vcHRpb25cclxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvcHQgb2YgZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgW256VmFsdWVdPVwib3B0LnZhbHVlXCJcclxuICAgICAgICAgICAgICAgIFtuekxhYmVsXT1cIm9wdC5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICBbbnpEaXNhYmxlZF09XCJvcHQuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgW256VGl0bGVdPVwib3B0LnRvb2x0aXAgfHwgb3B0LmxhYmVsXCJcclxuICAgICAgICAgICAgICA+PC9uei1vcHRpb24+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNuek1heFRhZ1BsYWNlaG9sZGVyPlxyXG4gICAgICAgICAgICAgICAgK1xyXG4gICAgICAgICAgICAgICAge3tcclxuICAgICAgICAgICAgICAgICAgX3NlYXJjaFBhcmFtc1tnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcF1cclxuICAgICAgICAgICAgICAgICAgICA/Lmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFRlbXBsYXRlIGxldC1zZWxlY3RlZD5cclxuICAgICAgICAgICAgICAgIHt7XHJcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLm56TGFiZWwubGVuZ3RoID4gNFxyXG4gICAgICAgICAgICAgICAgICAgID8gc2VsZWN0ZWQubnpMYWJlbC5zdWJzdHJpbmcoMCwgNCkgKyBcIi4uLlwiXHJcbiAgICAgICAgICAgICAgICAgICAgOiBzZWxlY3RlZC5uekxhYmVsXHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvbnotc2VsZWN0PlxyXG4gICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICA8bnotZm9ybS1jb250cm9sICpuZ0lmPVwiY29sdW1uLnZhbHVlVHlwZSA9PT0gJ2RhdGUnXCI+XHJcbiAgICAgICAgICAgIDxuei1kYXRlLXBpY2tlclxyXG4gICAgICAgICAgICAgIFtuelNob3dUaW1lXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5zaG93VGltZVwiXHJcbiAgICAgICAgICAgICAgW256Rm9ybWF0XT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5mb3JtYXRcIlxyXG4gICAgICAgICAgICAgIFtuelBsYWNlSG9sZGVyXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5wbGFjZUhvbGRlclwiXHJcbiAgICAgICAgICAgICAgW256QWxsb3dDbGVhcl09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuYWxsb3dDbGVhclwiXHJcbiAgICAgICAgICAgICAgW256RGlzYWJsZWRdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIlxyXG4gICAgICAgICAgICAgICAgX3NlYXJjaFBhcmFtc1tnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcF1cclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIFtuek1vZGVdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm1vZGVcIlxyXG4gICAgICAgICAgICA+PC9uei1kYXRlLXBpY2tlcj5cclxuICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgICAgPG56LWZvcm0tY29udHJvbCAqbmdJZj1cImNvbHVtbi52YWx1ZVR5cGUgPT09ICdjaGVja2JveCdcIj5cclxuICAgICAgICAgICAgPG56LWNoZWNrYm94LWdyb3VwXHJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cIlxyXG4gICAgICAgICAgICAgICAgZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5vU3R5bGVcclxuICAgICAgICAgICAgICAgICAgPyAncHJvLXRhYmxlLWNoZWNrYm94Z3JvdXAtbm9zdHlsZSdcclxuICAgICAgICAgICAgICAgICAgOiAnJ1xyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikub3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgW256RGlzYWJsZWRdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJcclxuICAgICAgICAgICAgICAgIGhhbmRsZUZpZWxkQ2hlY2tCb3hDaGFuZ2UoXHJcbiAgICAgICAgICAgICAgICAgICRldmVudCxcclxuICAgICAgICAgICAgICAgICAgZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+PC9uei1jaGVja2JveC1ncm91cD5cclxuICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgICAgPG56LWZvcm0tY29udHJvbCAqbmdJZj1cImNvbHVtbi52YWx1ZVR5cGUgPT09ICdhdXRvQ29tcGxldGUnXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIG56LWlucHV0XHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJcclxuICAgICAgICAgICAgICAgIF9zZWFyY2hQYXJhbXNbZ2V0RmllbGRQcm9wcyhjb2x1bW4pPy5uYW1lIHx8IGNvbHVtbi5wcm9wXVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgKGlucHV0KT1cImhhbmRsZUF1dG9Db21wbGV0ZUlucHV0KCRldmVudCwgY29sdW1uKVwiXHJcbiAgICAgICAgICAgICAgW256QXV0b2NvbXBsZXRlXT1cImF1dG9cIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnZXRGaWVsZFByb3BzKGNvbHVtbik/LmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pPy5wbGFjZUhvbGRlclwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxuei1hdXRvY29tcGxldGVcclxuICAgICAgICAgICAgICBbbnpCYWNrZmlsbF09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuYmFja0ZpbGxcIlxyXG4gICAgICAgICAgICAgIFtuekRlZmF1bHRBY3RpdmVGaXJzdE9wdGlvbl09XCJcclxuICAgICAgICAgICAgICAgIGdldEZpZWxkUHJvcHMoY29sdW1uKS5kZWZhdWx0QWN0aXZlRmlyc3RPcHRpb25cclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIFtueldpZHRoXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS53aWR0aFwiXHJcbiAgICAgICAgICAgICAgI2F1dG9cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxuei1hdXRvLW9wdGlvblxyXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBnZXRBdXRvQ29tcGxldGVEYXRhU291cmNlKGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgW256VmFsdWVdPVwiXHJcbiAgICAgICAgICAgICAgICAgIGdldEZpZWxkUHJvcHMoY29sdW1uKS5yZXR1cm5GdWxsRGF0YSA/IG9wdGlvbiA6IG9wdGlvbi52YWx1ZVxyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgIFtuekxhYmVsXT1cIm9wdGlvbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICBbbnpEaXNhYmxlZF09XCJvcHRpb24uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt7IG9wdGlvbi5sYWJlbCB9fVxyXG4gICAgICAgICAgICAgIDwvbnotYXV0by1vcHRpb24+XHJcbiAgICAgICAgICAgIDwvbnotYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICA8bnotZm9ybS1jb250cm9sICpuZ0lmPVwiY29sdW1uLnZhbHVlVHlwZSA9PT0gJ2N1c3RvbSdcIj5cclxuICAgICAgICAgICAgPGFwcC1keW5hbWljLXNlYXJjaC1maWVsZFxyXG4gICAgICAgICAgICAgIFtjb21wb25lbnRdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIl9zZWFyY2hQYXJhbXNbZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BdXCJcclxuICAgICAgICAgICAgICBbcHJvcHNdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiXHJcbiAgICAgICAgICAgICAgICBzZXRGaWVsZFZhbHVlKGdldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wLCAkZXZlbnQpXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPjwvYXBwLWR5bmFtaWMtc2VhcmNoLWZpZWxkPlxyXG4gICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICA8bnotZm9ybS1jb250cm9sICpuZ0lmPVwiY29sdW1uLnZhbHVlVHlwZSA9PT0gJ2lucHV0TnVtYmVyJ1wiPlxyXG4gICAgICAgICAgICA8bnotaW5wdXQtbnVtYmVyXHJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cIicxMDAlJ1wiXHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJcclxuICAgICAgICAgICAgICAgIF9zZWFyY2hQYXJhbXNbZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BdXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBbbnpQbGFjZUhvbGRlcl09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikucGxhY2VIb2xkZXJcIlxyXG4gICAgICAgICAgICAgIFtuekRpc2FibGVkXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgW256Rm9ybWF0dGVyXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5mb3JtYXR0ZXJQZXJjZW50XCJcclxuICAgICAgICAgICAgICBbbnpQYXJzZXJdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLnBhcnNlclBlcmNlbnRcIlxyXG4gICAgICAgICAgICA+PC9uei1pbnB1dC1udW1iZXI+XHJcbiAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICA8L256LWZvcm0taXRlbT5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPG5nLXRlbXBsYXRlICNhY3Rpb25UZXh0QnRuPlxyXG4gICAgICAgIDxuei1zcGFjZSBbbnpTaXplXT1cIjRcIj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuelNwYWNlSXRlbSAqbmdJZj1cInNob3dTZWFyY2hCdG5cIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBuei1idXR0b24gbnpUeXBlPVwicHJpbWFyeVwiIChjbGljayk9XCJoYW5kbGVTZWFyY2goKVwiPlxyXG4gICAgICAgICAgICAgIHt7IGNvbmZpcm1CdG5UZXh0IH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuelNwYWNlSXRlbSAqbmdJZj1cInNob3dDbGVhckJ0blwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG56LWJ1dHRvbiAoY2xpY2spPVwiaGFuZGxlUmVzZXRGb3JtKClcIj5cclxuICAgICAgICAgICAgICB7eyBjbGVhckJ0blRleHQgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvbnotc3BhY2U+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbWdBY3Rpb25CYXJUcGwgfHwgc2hvd0NvbHVtblNldHRpbmdcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2FjdGlvbkltZ0J0bj5cclxuICAgICAgICAgIDxuei1zcGFjZT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImltZ0FjdGlvbkJhclRwbFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgICBuelNwYWNlSXRlbVxyXG4gICAgICAgICAgICAgIGNsYXNzPVwic2V0dGluZy1zcGFjZS1pdGVtXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cInNob3dDb2x1bW5TZXR0aW5nXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxzcGFuIG56LXRvb2x0aXAgbnpUb29sdGlwVGl0bGU9XCLorr7nva7lrZfmrrVcIj5cclxuICAgICAgICAgICAgICAgIDxhcHAtY29sbXVucy1zZXR0aW5nXHJcbiAgICAgICAgICAgICAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxyXG4gICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRDb2x1bW5zXT1cIl9zZXJ2ZXJDb2x1bW5zXCJcclxuICAgICAgICAgICAgICAgICAgW3RhYmxlTmFtZV09XCJ0YWJsZU5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAoYWZ0ZXJDb25maXJtKT1cImhhbmRsZUNvbHVtbnNTZXR0aW5nQ29uZmlybSgpXCJcclxuICAgICAgICAgICAgICAgID48L2FwcC1jb2xtdW5zLXNldHRpbmc+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9uei1zcGFjZT5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvYXBwLXRhYmxlLXNlYXJjaC1iYXI+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgPG5nLXRlbXBsYXRlICNib2R5PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dBY3Rpb25CYXJcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWN0aW9uQmFyVHBsXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VzdG9tVGFibGVSZW5kZXJcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbVRhYmxlUmVuZGVyXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxkaXYgW2NsYXNzLnByby10YWJsZS1hdXRvLXNjcm9sbF09XCJzY3JvbGw/LnggPT09ICdhdXRvJ1wiPlxyXG4gICAgICA8bnotdGFibGVcclxuICAgICAgICAqbmdJZj1cIiFjdXN0b21UYWJsZVJlbmRlciAmJiBfY29sdW1uc1JlYWR5XCJcclxuICAgICAgICAjZHluYW1pY1RhYmxlXHJcbiAgICAgICAgbnpTaXplPVwic21hbGxcIlxyXG4gICAgICAgIG56U2hvd1NpemVDaGFuZ2VyXHJcbiAgICAgICAgW256Qm9yZGVyZWRdPVwiYm9yZGVyZWRcIlxyXG4gICAgICAgIFtuek91dGVyQm9yZGVyZWRdPVwib3V0ZXJCb3JkZXJlZFwiXHJcbiAgICAgICAgW256RGF0YV09XCJkYXRhU291cmNlXCJcclxuICAgICAgICBbbnpQYWdlSW5kZXhdPVwiX3BhZ2VJbmZvLnBhZ2VJbmRleFwiXHJcbiAgICAgICAgW256UGFnZVNpemVdPVwiX3BhZ2VJbmZvLnBhZ2VTaXplXCJcclxuICAgICAgICBbbnpUb3RhbF09XCJfcGFnZUluZm8udG90YWxcIlxyXG4gICAgICAgIFtuelBhZ2VTaXplT3B0aW9uc109XCJfcGFnZUluZm8ucGFnZVNpemVPcHRpb25zXCJcclxuICAgICAgICBbbnpTaG93UGFnaW5hdGlvbl09XCJzaG93UGFnaW5hdGlvblwiXHJcbiAgICAgICAgW256U2hvd1RvdGFsXT1cInRvdGFsVGVtcGxhdGVcIlxyXG4gICAgICAgIFtuekxvYWRpbmddPVwiX2xvYWRpbmdcIlxyXG4gICAgICAgIFtuekZyb250UGFnaW5hdGlvbl09XCJmcm9udFBhZ2luYXRpb25cIlxyXG4gICAgICAgIFtuelNjcm9sbF09XCJfY29tcHV0ZWRTY3JvbGxcIlxyXG4gICAgICAgIChuelBhZ2VJbmRleENoYW5nZSk9XCJoYW5kbGVQYWdlSW5kZXhDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgKG56UGFnZVNpemVDaGFuZ2UpPVwiaGFuZGxlUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgID5cclxuICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDwhLS0g5aSN6YCJ5qGG5YiX77yI5b2TIHNob3dDaGVja2JveD10cnVlIOaXtuaYvuekuu+8iSAtLT5cclxuICAgICAgICAgICAgPHRoXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJzaG93Q2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgIFtueldpZHRoXT1cIic1MHB4J1wiXHJcbiAgICAgICAgICAgICAgW256QWxpZ25dPVwiJ2NlbnRlcidcIlxyXG4gICAgICAgICAgICAgIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyXCJcclxuICAgICAgICAgICAgICBbKG56Q2hlY2tlZCldPVwiX2NoZWNrZWRBbGxcIlxyXG4gICAgICAgICAgICAgIFtuekluZGV0ZXJtaW5hdGVdPVwiX2luZGV0ZXJtaW5hdGVcIlxyXG4gICAgICAgICAgICAgIChuekNoZWNrZWRDaGFuZ2UpPVwidG9nZ2xlQ2hlY2tBbGwoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgID48L3RoPlxyXG4gICAgICAgICAgICA8dGhcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIF9jb2x1bW5zXCJcclxuICAgICAgICAgICAgICBbbnpXaWR0aF09XCJjb2x1bW4ud2lkdGhcIlxyXG4gICAgICAgICAgICAgIFtuekFsaWduXT1cImNvbHVtbi5hbGlnblwiXHJcbiAgICAgICAgICAgICAgW256TGVmdF09XCJjb2x1bW4uX256TGVmdFwiXHJcbiAgICAgICAgICAgICAgW256UmlnaHRdPVwiY29sdW1uLl9uelJpZ2h0XCJcclxuICAgICAgICAgICAgICBbbnpTaG93U29ydF09XCIhIWNvbHVtbi5zb3J0ZXJcIlxyXG4gICAgICAgICAgICAgIFtuelNvcnRPcmRlcl09XCJnZXRTb3J0T3JkZXIoY29sdW1uLnByb3ApXCJcclxuICAgICAgICAgICAgICAobnpTb3J0T3JkZXJDaGFuZ2UpPVwib25Tb3J0Q2hhbmdlKGNvbHVtbi5wcm9wLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt7IGNvbHVtbi50aXRsZSB9fVxyXG4gICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3RoZWFkPlxyXG5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICA8dHJcclxuICAgICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXJcIlxyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF0YTsgbGV0IGkgPSBpbmRleDsgb2Y6IGR5bmFtaWNUYWJsZS5kYXRhXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICdhbnQtdGFibGUtY3VzdG9tLXJvdy1zZWxlY3RlZCc6ICEhZ2V0VGFibGVSb3dDaGVja2VkKGRhdGEpLFxyXG4gICAgICAgICAgICAgICdhbnQtdGFibGUtY3VzdG9tLXJvdy1ldmVuJzogaSAlIDIgPT09IDAsXHJcbiAgICAgICAgICAgICAgJ2FudC10YWJsZS1jdXN0b20tcm93LW9kZCc6IGkgJSAyICE9PSAwXHJcbiAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlVGFibGVSb3dDbGljayhkYXRhKVwiXHJcbiAgICAgICAgICAgIChkYmxjbGljayk9XCJoYW5kbGVUYWJsZVJvd0RiQ2xpY2soZGF0YSlcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8IS0tIOWkjemAieahhuWIl++8iOW9kyBzaG93Q2hlY2tib3g9dHJ1ZSDml7bmmL7npLrvvIkgLS0+XHJcbiAgICAgICAgICAgIDx0ZFxyXG4gICAgICAgICAgICAgICpuZ0lmPVwic2hvd0NoZWNrYm94XCJcclxuICAgICAgICAgICAgICBbbnpBbGlnbl09XCInY2VudGVyJ1wiXHJcbiAgICAgICAgICAgICAgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7IHdpZHRoOiA1MHB4XCJcclxuICAgICAgICAgICAgICBbKG56Q2hlY2tlZCldPVwiZGF0YS5jaGVja2VkXCJcclxuICAgICAgICAgICAgICBbbnpEaXNhYmxlZF09XCJpc1Jvd0Rpc2FibGVkKGRhdGEpXCJcclxuICAgICAgICAgICAgICAobnpDaGVja2VkQ2hhbmdlKT1cImhhbmRsZVJvd0NoZWNrZWRDaGFuZ2UoZGF0YSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgID48L3RkPlxyXG4gICAgICAgICAgICA8dGRcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIF9jb2x1bW5zXCJcclxuICAgICAgICAgICAgICBbbnpMZWZ0XT1cImNvbHVtbi5fbnpMZWZ0XCJcclxuICAgICAgICAgICAgICBbbnpSaWdodF09XCJjb2x1bW4uX256UmlnaHRcIlxyXG4gICAgICAgICAgICAgIFtuekFsaWduXT1cImNvbHVtbi5hbGlnblwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgJ3Byby1ub3dyYXAnOiB0cnVlXHJcbiAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8IS0tIOajgOafpeaYr+WQpuacieiHquWumuS5ieaooeadvyAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICBjb2x1bW4uY3VzdG9tUmVuZGVyICYmIGdldFRlbXBsYXRlKGNvbHVtbi5jdXN0b21SZW5kZXIpO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgdGVtcGxhdGVcclxuICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcclxuICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGRhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbixcclxuICAgICAgICAgICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgICAgICAgICBwYWdlSW5mbzogX3BhZ2VJbmZvXHJcbiAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSDpu5jorqTmuLLmn5PpgLvovpEgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgIWNvbHVtbi5jdXN0b21SZW5kZXIgfHwgIWdldFRlbXBsYXRlKGNvbHVtbi5jdXN0b21SZW5kZXIpXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4uZWxsaXBzaXNcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHJvLWVsbGlwc2lzXCJcclxuICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZGF0YVtjb2x1bW4ucHJvcF1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnY2FsYygnICsgY29sdW1uLndpZHRoICsgJyAtIDI1cHgpJ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgZGF0YVtjb2x1bW4ucHJvcF0gfX1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29sdW1uLmVsbGlwc2lzXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGRhdGFbY29sdW1uLnByb3BdIH19XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICA8dHIgKm5nSWY9XCJzdW1tYXJ5RGF0YSAmJiBfcGFnZUluZm8udG90YWwgPiAwXCI+XHJcbiAgICAgICAgICAgIDwhLS0g5rGH5oC76KGM55qE5aSN6YCJ5qGG5YiX77yI5b2TIHNob3dDaGVja2JveD10cnVlIOaXtuaYvuekuu+8jOS9huS4uuepuu+8iSAtLT5cclxuICAgICAgICAgICAgPHRkXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJzaG93Q2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgIHN0eWxlPVwiZm9udC13ZWlnaHQ6IGJvbGQ7IGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNlOGU4ZThcIlxyXG4gICAgICAgICAgICA+PC90ZD5cclxuICAgICAgICAgICAgPHRkXHJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbjsgbGV0IGkgPSBpbmRleDsgb2Y6IF9jb2x1bW5zXCJcclxuICAgICAgICAgICAgICBbbnpMZWZ0XT1cImNvbHVtbi5fbnpMZWZ0XCJcclxuICAgICAgICAgICAgICBbbnpSaWdodF09XCJjb2x1bW4uX256UmlnaHRcIlxyXG4gICAgICAgICAgICAgIHN0eWxlPVwiZm9udC13ZWlnaHQ6IGJvbGQ7IGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNlOGU4ZThcIlxyXG4gICAgICAgICAgICAgIFtuekFsaWduXT1cImNvbHVtbi5hbGlnblwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImkgPT09IDBcIj7mgLvorqE8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImkgIT09IDAgJiYgY29sdW1uLnN1bW1hcnlcIj5cclxuICAgICAgICAgICAgICAgIHt7XHJcbiAgICAgICAgICAgICAgICAgIGNvbHVtbi5zdW1tYXJ5Py5mb3JtYXRcclxuICAgICAgICAgICAgICAgICAgICA/IGNvbHVtbi5zdW1tYXJ5Py5mb3JtYXQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlEYXRhW2NvbHVtbi5zdW1tYXJ5Py5uYW1lIHx8IGNvbHVtbi5wcm9wXVxyXG4gICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIDogc3VtbWFyeURhdGFbY29sdW1uLnN1bW1hcnk/Lm5hbWUgfHwgY29sdW1uLnByb3BdXHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjdG90YWxUZW1wbGF0ZSBsZXQtdG90YWxcclxuICAgICAgICAgID7lhbEge3sgX3BhZ2VJbmZvLnRvdGFsIH19IOadoeiusOW9lTwvbmctdGVtcGxhdGVcclxuICAgICAgICA+XHJcbiAgICAgIDwvbnotdGFibGU+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG48L2FwcC1wYWdlLWNvbnRhaW5lcj5cclxuIl19
1126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byby10YWJsZS9zcmMvbGliL3Byby10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm8tdGFibGUvc3JjL2xpYi9wcm8tdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLFFBQVEsRUFDUixNQUFNLEVBRU4sV0FBVyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQVcsTUFBTSxXQUFXLENBQUM7QUFDdkUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLHVCQUF1QixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBV2hGLE9BQU8sRUFBRSx1QkFBdUIsRUFBK0IsTUFBTSxVQUFVLENBQUM7QUFDaEYsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBT25ELE1BQU0sT0FBTyxpQkFBaUI7SUE2QjVCLElBQ0ksY0FBYyxDQUFDLEtBQWdDO1FBQ2pELElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQUksbUJBQW1CO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBeUVELElBQUksZUFBZTtRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ2pFLE1BQU0sRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBYSxDQUFDO1FBQzFDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNwRCxDQUFDO0lBb0NELFlBR1UsWUFBZ0Q7UUFBaEQsaUJBQVksR0FBWixZQUFZLENBQW9DO1FBM0pqRCxrQkFBYSxHQUFZLElBQUksQ0FBQztRQUU5QixpQkFBWSxHQUFZLElBQUksQ0FBQztRQUU3QixVQUFLLEdBQWtCLElBQUksQ0FBQztRQUU1QixjQUFTLEdBQXVDLEVBQUUsQ0FBQztRQUVuRCxjQUFTLEdBQVcsRUFBRSxDQUFDO1FBRXZCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFFMUIsWUFBTyxHQUFxQixFQUFFLENBQUM7UUFFL0Isa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFFOUIsa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFFOUIsbUJBQWMsR0FBVyxJQUFJLENBQUM7UUFFOUIsaUJBQVksR0FBVyxJQUFJLENBQUM7UUFFNUIsZUFBVSxHQUFXLE1BQU0sQ0FBQztRQUU1QixlQUFVLEdBQVcsT0FBTyxDQUFDO1FBRTlCLG9CQUFlLEdBQWtCLElBQUksQ0FBQztRQWVyQyxlQUFVLEdBQVUsRUFBRSxDQUFDO1FBRXZCLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFFekIsa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFFOUIsbUJBQWMsR0FBWSxJQUFJLENBQUM7UUFFL0Isb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFFakMsV0FBTSxHQUF3RCxJQUFJLENBQUM7UUFJbkUsZ0JBQVcsR0FBK0IsSUFBSSxDQUFDO1FBRXhELHFDQUFxQztRQUM1QixhQUFRLEdBQXVCLE9BQU8sQ0FBQztRQUV2QyxzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFFNUMsaUJBQWlCO1FBQ1IsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFFOUIsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFFdkMsYUFBYTtRQUNKLGdCQUFXLEdBQTJCLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQztRQUUzRCxXQUFXO1FBQ0YsdUJBQWtCLEdBQVksSUFBSSxDQUFDO1FBSWxDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRXJDLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUV2QyxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUF3QixDQUFDO1FBRTFELDRCQUF1QixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFbEQsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBb0IsQ0FBQztRQVV6RCx1QkFBa0IsR0FBUSxFQUFFLENBQUM7UUFFckMsZUFBZTtRQUNQLG9CQUFlLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7UUFFOUQsdUNBQXVDO1FBRS9CLGFBQVEsR0FBZ0QsRUFBRSxDQUFDO1FBRW5FLHFCQUFxQjtRQUNiLGtCQUFhLEdBQWEsRUFBRSxDQUFDO1FBRXJDLDRCQUE0QjtRQUNwQiw2QkFBd0IsR0FDOUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUdaLGFBQVEsR0FBcUIsRUFBRSxDQUFDO1FBUWhDLFdBQVc7UUFDWCxrQkFBYSxHQUFRLEVBQUUsQ0FBQztRQUV4QixlQUFlO1FBQ2Ysd0JBQW1CLEdBQXFCLEVBQUUsQ0FBQztRQUUzQyxjQUFTLEdBQXFCO1lBQzVCLFNBQVMsRUFBRSxDQUFDO1lBQ1osUUFBUSxFQUFFLEVBQUU7WUFDWixLQUFLLEVBQUUsR0FBRztZQUNWLGVBQWUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQztTQUNsRCxDQUFDO1FBRUYsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUUxQixzQkFBaUIsR0FBUSxJQUFJLENBQUM7UUFFOUIsMkJBQTJCO1FBQzNCLGtCQUFhLEdBQVUsRUFBRSxDQUFDO1FBRTFCLE9BQU87UUFDUCxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUU3QixhQUFhO1FBQ2IsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFFaEMsWUFBWTtRQUNaLG1CQUFjLEdBQXFCLEVBQUUsQ0FBQztRQUV0Qyx5QkFBeUI7UUFDekIsNkJBQXdCLEdBQTBCLEVBQUUsQ0FBQztRQUVyRCwrQkFBK0I7UUFDL0Isa0JBQWEsR0FBWSxJQUFJLENBQUM7SUFLM0IsQ0FBQztJQUVJLEtBQUssQ0FBQyxrQkFBa0I7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNqRCxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsSUFBSTtZQUNGLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUUsT0FBTyxHQUFHLENBQUM7U0FDWjtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsT0FBTyxJQUFJLENBQUM7U0FDYjtJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsb0JBQW9CLENBQUMsT0FBYztRQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2pELE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxJQUFJO1lBQ0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQ3JDLElBQUksQ0FBQyxTQUFTLEVBQ2QsT0FBTyxFQUNQLElBQUksQ0FBQyxRQUFRLENBQ2QsQ0FBQztZQUNGLElBQUksTUFBTSxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDbEMsT0FBTyxNQUFNLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNwQztZQUNELE9BQU8sTUFBTSxDQUFDO1NBQ2Y7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLE9BQU8sSUFBSSxDQUFDO1NBQ2I7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVE7UUFDWixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFekMsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN0RSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUMzQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDcEI7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN2QyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztZQUMzQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztTQUM1QjthQUFNO1lBQ0wsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7U0FDMUI7SUFDSCxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLGNBQWM7UUFDZCxpREFBaUQ7UUFDakQsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVPLEtBQUssQ0FBQyxtQkFBbUI7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU87UUFDbEQsSUFBSTtZQUNGLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLEdBQUc7Z0JBQUUsT0FBTztZQUNqQixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO2dCQUNsQixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDakQsT0FBTzt3QkFDTCxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU07d0JBQ2xCLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSzt3QkFDaEIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO3dCQUN2QixXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTTtxQkFDMUIsQ0FBQztnQkFDSixDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsY0FBYyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUM5QyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDZixDQUFDLFFBQVEsRUFBRSxFQUFFLENBQ1gsUUFBUSxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FDcEUsQ0FDRixDQUFDO2dCQUNGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7YUFDOUM7aUJBQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLEVBQUUsRUFBRTtnQkFDMUIsOEJBQThCO2dCQUM5QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTztxQkFDN0IsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUM7cUJBQy9DLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDaEIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJO29CQUNsQixNQUFNLEVBQUUsSUFBSTtvQkFDWixNQUFNLEVBQUUsTUFBTSxDQUFDLEtBQUs7b0JBQ3BCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxJQUFJLElBQUk7aUJBQ2xDLENBQUMsQ0FBQyxDQUFDO2dCQUNOLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLE9BQU8sRUFBRTtvQkFDWCxNQUFNLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2lCQUNsQzthQUNGO1NBQ0Y7Z0JBQVM7WUFDUixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztZQUMxQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztTQUMxQjtJQUNILENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxPQUF5QjtRQUNuRCxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU87YUFDcEIsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7YUFDbkMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDWixPQUFPLEVBQUUsR0FBRyx3QkFBd0IsRUFBRSxHQUFHLElBQUksRUFBb0IsQ0FBQztRQUNwRSxDQUFDLENBQUMsQ0FBQztRQUVMLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNuQixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDL0IsSUFBSSxHQUFHLENBQUMsU0FBUyxFQUFFO2dCQUNqQixHQUFHLENBQUMsT0FBTyxHQUFHLEdBQUcsVUFBVSxJQUFJLENBQUM7Z0JBQ2hDLFVBQVUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2hEO2lCQUFNO2dCQUNMLEdBQUcsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2FBQ3JCO1NBQ0Y7UUFFRCxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDcEIsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNsRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLElBQUksR0FBRyxDQUFDLFVBQVUsRUFBRTtnQkFDbEIsR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLFdBQVcsSUFBSSxDQUFDO2dCQUNsQyxXQUFXLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNqRDtpQkFBTTtnQkFDTCxHQUFHLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQzthQUN0QjtTQUNGO0lBQ0gsQ0FBQztJQUVPLGdCQUFnQixDQUFDLEtBQXlCO1FBQ2hELElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDckIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2pELE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsWUFBWTtJQUNKLHFCQUFxQjtRQUMzQixTQUFTO1FBQ1QsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRXRELGdCQUFnQjtRQUNoQixNQUFNLHVCQUF1QixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUNsRCxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FDMUIsQ0FBQztRQUVGLHlDQUF5QztRQUN6QyxNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUNoRCxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUMvQixDQUFDO1FBRUYsWUFBWTtRQUNaLE1BQU0saUJBQWlCLEdBQUcsdUJBQXVCLENBQUMsTUFBTSxDQUFDO1FBQ3pELE1BQU0sb0JBQW9CLEdBQ3hCLGlCQUFpQixHQUFHLHNCQUFzQixDQUFDLE1BQU0sQ0FBQztRQUVwRCxvREFBb0Q7UUFDcEQsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBRWpELElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3pCLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUMvQyxpQkFBaUIsRUFDakIsSUFBSSxDQUFDLGdCQUFnQixDQUN0QixDQUFDO1lBQ0YsSUFBSSxrQkFBa0IsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDN0Isc0JBQXNCLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDaEQ7U0FDRjtRQUVELDZDQUE2QztRQUM3QyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUMzQyxpQkFBaUIsRUFDakIsSUFBSSxDQUFDLFlBQVksQ0FDbEIsQ0FBQztZQUNGLElBQUksY0FBYyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUN6QixzQkFBc0IsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7YUFDNUM7U0FDRjtRQUVELGdEQUFnRDtRQUNoRCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDeEIsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQzlDLGlCQUFpQixFQUNqQixJQUFJLENBQUMsZUFBZSxDQUNyQixDQUFDO1lBQ0YsSUFBSSxpQkFBaUIsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDNUIsc0JBQXNCLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7YUFDL0M7U0FDRjtRQUVELHdCQUF3QjtRQUN4QixvQkFBb0I7UUFDcEIsTUFBTSxvQkFBb0IsR0FDeEIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLElBQUksc0JBQXNCLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxvQkFBb0IsR0FBRyxDQUFDLEVBQUU7WUFDakUsS0FDRSxJQUFJLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsb0JBQW9CLEVBQ3ZELENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLEVBQzVCLENBQUMsRUFBRSxFQUNIO2dCQUNBLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMvQjtTQUNGO1FBRUQsZ0JBQWdCO1FBQ2hCLE1BQU0sZUFBZSxHQUF1QixFQUFFLENBQUM7UUFDL0MsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3RDLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDM0I7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILFNBQVM7UUFDVCxJQUFJLGVBQWUsQ0FBQyxNQUFNLEtBQUssb0JBQW9CLEVBQUU7WUFDbkQsT0FBTyxDQUFDLElBQUksQ0FDVix3QkFBd0Isb0JBQW9CLGFBQWEsZUFBZSxDQUFDLE1BQU0sNkNBQTZDLENBQzdILENBQUM7U0FDSDtRQUVELFlBQVk7UUFDWix1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDaEQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQWEsQ0FBQztZQUMxQyxJQUFJLEtBQUssR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDaEU7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLEtBQUssQ0FDWCxvQkFBb0IsWUFBWSxRQUFRLEtBQUssT0FBTyxDQUNyRCxDQUFDO2FBQ0g7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILHlDQUF5QztRQUN6QyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDL0MsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLGlCQUFrQixDQUFDO1lBQy9DLE1BQU0sYUFBYSxHQUFHLGlCQUFpQixHQUFHLEtBQUssQ0FBQztZQUNoRCxJQUFJLGFBQWEsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFO2dCQUMxQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7YUFDeEU7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLEtBQUssQ0FDWCx5QkFBeUIsWUFBWSxRQUFRLGFBQWEsT0FBTyxDQUNsRSxDQUFDO2FBQ0g7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCwwQkFBMEI7SUFDbEIsaUJBQWlCLENBQ3ZCLFNBQTZCLEVBQzdCLE1BQXdCO1FBRXhCLFlBQVk7UUFDWixJQUFJLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRS9CLHVCQUF1QjtRQUN2QixJQUFJO1lBQ0YsTUFBTSxnQkFBZ0IsR0FBSSxNQUFjLENBQUMsVUFBVSxDQUFDO1lBQ3BELElBQUksZ0JBQWdCLEVBQUU7Z0JBQ3BCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUN6QyxNQUFNLGFBQWEsR0FBSSxTQUFTLENBQUMsQ0FBQyxDQUFTLENBQUMsVUFBVSxDQUFDO29CQUN2RCxJQUFJLGFBQWEsS0FBSyxnQkFBZ0IsRUFBRTt3QkFDdEMsT0FBTyxDQUFDLENBQUM7cUJBQ1Y7aUJBQ0Y7YUFDRjtTQUNGO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixPQUFPO1NBQ1I7UUFFRCx3QkFBd0I7UUFDeEIsSUFBSTtZQUNGLE1BQU0sZUFBZSxHQUFJLE1BQWMsQ0FBQyxzQkFBc0IsQ0FBQztZQUMvRCxJQUFJLGVBQWUsRUFBRTtnQkFDbkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ3pDLE1BQU0sWUFBWSxHQUFJLFNBQVMsQ0FBQyxDQUFDLENBQVMsQ0FBQyxzQkFBc0IsQ0FBQztvQkFDbEUsSUFBSSxZQUFZLEtBQUssZUFBZSxFQUFFO3dCQUNwQyxPQUFPLENBQUMsQ0FBQztxQkFDVjtpQkFDRjthQUNGO1NBQ0Y7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE9BQU87U0FDUjtRQUVELE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDO0lBRUQsYUFBYTtJQUNMLHdCQUF3QixDQUFDLE9BQXlCO1FBQ3hELE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN2QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ2xCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRzt3QkFDaEIsR0FBRyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO3dCQUMxQyxHQUFHLElBQUksQ0FBQyxVQUFVO3FCQUNuQixDQUFDO2lCQUNIO3FCQUFNO29CQUNMLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxHQUFHLHVCQUF1QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2lCQUNsRTthQUNGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsY0FBYztJQUNOLGdCQUFnQixDQUFDLE9BQXlCO1FBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ3pCLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsRUFBRTtnQkFDeEQsSUFBSTtvQkFDRixNQUFNLE9BQU8sR0FBRyxNQUNkLElBQUksQ0FBQyxVQUNOLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztvQkFDYixJQUFJLENBQUMsVUFBK0IsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO2lCQUN6RDtnQkFBQyxPQUFPLEtBQUssRUFBRTtvQkFDYixJQUFJLENBQUMsVUFBK0IsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2lCQUNwRDthQUNGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUF5QjtRQUNyRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBQzlCLE9BQU87YUFDSixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNmLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ2xELElBQUksSUFBSSxFQUFFO2dCQUNSLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDaEQ7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQzthQUNELE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2xCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDbkQsSUFBSSxZQUFZLEdBQUcsdUJBQXVCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUVuRSw4Q0FBOEM7WUFDOUMsSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLFVBQVUsRUFBRTtnQkFDbkMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7cUJBQ3JELE1BQU0sQ0FBQyxDQUFDLEdBQWdCLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7cUJBQ3pDLEdBQUcsQ0FBQyxDQUFDLEdBQWdCLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUM7b0JBQ3JCLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQzthQUMzRDtpQkFBTTtnQkFDTCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsS0FBSyxJQUFJLFlBQVksQ0FBQzthQUNwRTtZQUVELHVCQUF1QjtZQUN2QixJQUFJLE1BQU0sQ0FBQyxTQUFTLEtBQUssY0FBYyxFQUFFO2dCQUN2QyxJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQ3pDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFTCxvQ0FBb0M7UUFDcEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxDQUFNLEVBQUUsRUFBRTtZQUMvQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDbkUsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ25FLElBQUksTUFBTSxLQUFLLE1BQU07Z0JBQUUsT0FBTyxDQUFDLENBQUM7WUFDaEMsT0FBTyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRXhELGtCQUFrQjtRQUNsQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVPLG9CQUFvQixDQUFDLEdBQW1CO1FBQzlDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztJQUNsRCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsYUFBK0I7UUFDeEQsbUNBQW1DO1FBQ25DLE1BQU0sYUFBYSxHQUFHLGFBQWE7YUFDaEMsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2YsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQ3ZFLENBQ0Y7YUFDQSxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNqQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekUsT0FBTyxFQUFFLEdBQUcsUUFBUSxFQUFFLEdBQUcsU0FBUyxFQUFFLENBQUM7UUFDdkMsQ0FBQyxDQUFDLENBQUM7UUFFTCwyQkFBMkI7UUFDM0IsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FDN0MsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FDMUIsQ0FBQztRQUNGLE1BQU0sZUFBZSxHQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07WUFDbkIsQ0FBQztZQUNELENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNuRSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDdkMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsZUFBZSxJQUFJLENBQUMsR0FBRyxnQkFBZ0IsQ0FDeEQsQ0FBQztRQUNGLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUN2QyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxlQUFlLElBQUksQ0FBQyxHQUFHLGVBQWUsQ0FDdkQsQ0FBQztRQUVGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEdBQUcsYUFBYSxFQUFFLEdBQUcsYUFBYSxFQUFFLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBRUQsa0NBQWtDO0lBQzFCLHVCQUF1QixDQUFDLE1BQVc7UUFDekMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLE1BQU0sT0FBTyxHQUFzQjtZQUNqQyxHQUFHLENBQUMsR0FBUSxFQUFFLElBQXFCLEVBQUUsS0FBVTtnQkFDN0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN6QixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3hCLElBQUksTUFBTSxLQUFLLEtBQUssRUFBRTtvQkFDcEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztvQkFDakIsT0FBTyxJQUFJLENBQUM7aUJBQ2I7Z0JBQ0QsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDakIsSUFBSTtvQkFDRixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQzt3QkFDdkIsR0FBRzt3QkFDSCxLQUFLO3dCQUNMLE1BQU0sRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFO3FCQUMvQixDQUFDLENBQUM7aUJBQ0o7Z0JBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRTtnQkFDZCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7U0FDRixDQUFDO1FBQ0YsT0FBTyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVPLHNCQUFzQjtRQUM1QixNQUFNLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDeEQsT0FBTyxpQkFBaUIsQ0FBQztJQUMzQixDQUFDO0lBRU8sc0JBQXNCO1FBQzVCLDBCQUEwQjtRQUMxQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNyQywwQkFBMEI7WUFDMUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUM7WUFDL0QsTUFBTSxTQUFTLEdBQUcsTUFBTSxFQUFFLFFBQVEsSUFBSSxLQUFLLENBQUM7WUFDNUMsT0FBTztnQkFDTCxLQUFLLEVBQUUsU0FBUztnQkFDaEIsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFFO2FBQzdCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixPQUFPLEtBQUssQ0FBQyxDQUFDLGNBQWM7U0FDN0I7UUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLE9BQU8sS0FBSyxDQUFDLENBQUMsMEJBQTBCO0lBQzFDLENBQUM7SUFFTyxxQkFBcUI7UUFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPO1FBQzVFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTztRQUVwQyxpQ0FBaUM7UUFDakMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLENBQU0sRUFBRSxFQUFFO1lBQ3RDLEtBQUssSUFBSSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDbkQsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBRSxDQUFDO2dCQUNwQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3RCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLEdBQUcsS0FBSyxDQUFDO29CQUFFLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQzthQUN2RDtZQUNELE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sYUFBYSxDQUFDLElBQVMsRUFBRSxJQUFTO1FBQ3hDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSTtZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzNDLElBQUksSUFBSSxJQUFJLElBQUk7WUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzVCLElBQUksSUFBSSxJQUFJLElBQUk7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUMzQixJQUFJLElBQUksWUFBWSxJQUFJLElBQUksSUFBSSxZQUFZLElBQUksRUFBRTtZQUNoRCxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDeEM7UUFDRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFNBQVMsSUFBSSxPQUFPLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDMUQsT0FBTyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMxQztRQUNELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUN4RCxPQUFPLElBQUksR0FBRyxJQUFJLENBQUM7U0FDcEI7UUFDRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDeEQsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2pDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztZQUFFLE9BQU8sSUFBSSxHQUFHLElBQUksQ0FBQztRQUNyRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELGdDQUFnQztJQUN4Qiw2QkFBNkIsQ0FBQyxLQUFZLEVBQUUsTUFBc0I7UUFDeEUsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQztRQUV4RCxJQUNHLE1BQU0sQ0FBQyxVQUFxQyxDQUFDLFVBQVU7WUFDeEQsT0FBUSxNQUFNLENBQUMsVUFBcUMsQ0FBQyxVQUFVO2dCQUM3RCxVQUFVLEVBQ1o7WUFDQSxJQUFJO2dCQUNGLE1BQU0sTUFBTSxHQUFJLE1BQU0sQ0FBQyxVQUFxQyxDQUFDLFVBQVUsQ0FDckUsS0FBSyxDQUNOLENBQUM7Z0JBQ0Ysd0JBQXdCO2dCQUN4QixJQUFJLE1BQU0sWUFBWSxPQUFPLEVBQUU7b0JBQzdCLE1BQU07eUJBQ0gsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7d0JBQ2IsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ3ZELENBQUMsQ0FBQzt5QkFDRCxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTt3QkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUN2RCxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO29CQUMvQyxDQUFDLENBQUMsQ0FBQztpQkFDTjtxQkFBTTtvQkFDTCxTQUFTO29CQUNULElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO2lCQUN4RDthQUNGO1lBQUMsT0FBTyxLQUFLLEVBQUU7Z0JBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQzthQUM5QztTQUNGO0lBQ0gsQ0FBQztJQUVNLGVBQWUsQ0FBQyxPQUV0QjtRQUNDLE1BQU0sRUFBRSxRQUFRLEdBQUcsS0FBSyxFQUFFLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUMzQyxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUMxRSxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRTFDLE9BQU87WUFDTCxNQUFNO1lBQ04sUUFBUSxFQUFFO2dCQUNSLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVM7Z0JBQ25DLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVE7YUFDbEM7WUFDRCxvQkFBb0I7WUFDcEIsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssUUFBUTtnQkFDNUIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxFQUFFO2dCQUN6QyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ1IsQ0FBQztJQUNKLENBQUM7SUFFTSxNQUFNLENBQUMsV0FBcUI7UUFDakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRU0sY0FBYyxDQUFDLE1BQTJCO1FBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0I7WUFFdkQsb0RBQW9EO1lBQ3BELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQ2hELENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQ3JELENBQUM7WUFDRixJQUFJLFlBQVksRUFBRSxTQUFTLEtBQUssVUFBVSxFQUFFO2dCQUMxQyxNQUFNLE1BQU0sR0FBVSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDaEUsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsVUFBZ0MsQ0FBQztnQkFDdkUsSUFBSSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUU7b0JBQzdCLGdCQUFnQixDQUFDLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUNyRCxDQUFDLElBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUM7d0JBQ3RCLEdBQUcsSUFBSTt3QkFDUCxPQUFPLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO3FCQUNyQyxDQUFDLENBQ0gsQ0FBQztpQkFDSDthQUNGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sYUFBYSxDQUFDLEdBQVcsRUFBRSxLQUFVO1FBQzFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ2xDLENBQUM7SUFFTSxnQkFBZ0I7UUFDckIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBRU0sS0FBSyxDQUFDLFVBQVUsQ0FDckIsT0FBeUIsRUFDekIsT0FFQztRQUVELGtCQUFrQjtRQUNsQixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVsQyxXQUFXO1FBQ1gsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV2QyxpQkFBaUI7UUFDakIsb0JBQW9CO1FBQ3BCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFekMsNkJBQTZCO1FBQzdCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUV0RSxzQkFBc0I7UUFDdEIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1NBQzlCO1FBRUQsZ0NBQWdDO1FBQ2hDLElBQUksT0FBTyxFQUFFLE1BQU0sS0FBSyxJQUFJLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3BCO1FBRUQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVNLGtCQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0lBRU0sY0FBYztRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsK0JBQStCO1FBQy9CLGdEQUFnRDtRQUNoRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBUSxDQUFDO0lBQ3RFLENBQUM7SUFFRCxZQUFZO0lBQ1osV0FBVyxDQUFDLElBQXdCO1FBQ2xDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdkIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDaEQsQ0FBQztJQUVELG1CQUFtQixDQUFDLE1BQXNCLEVBQUUsSUFBUztRQUNuRCxNQUFNLEdBQUcsR0FDUCxNQUFNLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztZQUMxRCxDQUFDLENBQUMsRUFBRTtZQUNKLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUTtnQkFDZixDQUFDLENBQUMsTUFBTSxDQUFDLElBQUk7Z0JBQ2IsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxJQUFTO1FBQzFCLDhCQUE4QjtRQUM5QixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2hDO1FBQ0Qsb0JBQW9CO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDMUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELFdBQVc7SUFDWCxhQUFhLENBQUMsSUFBUztRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVk7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNyQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUMzRCxDQUFDO0lBRUQsc0JBQXNCO0lBQ3RCLFlBQVksQ0FBQyxJQUFTO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3JDLHVCQUF1QjtRQUN2QixPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFRCwwQkFBMEI7SUFDMUIsZ0JBQWdCLENBQUMsSUFBUyxFQUFFLE9BQWdCLEVBQUUsS0FBYTtRQUN6RCxJQUFJLEtBQUssRUFBRTtZQUNULEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQjtTQUMzQztRQUNELG1CQUFtQjtRQUNuQixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDNUIsT0FBTztTQUNSO1FBRUQsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBRXZCLDRCQUE0QjtRQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQ2pELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUMxQixDQUFDO1FBQ0YsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDaEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDL0I7WUFDRCxrQkFBa0I7WUFDbEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztTQUMvQjthQUFNO1lBQ0wsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ3JDO1lBQ0Qsa0JBQWtCO1lBQ2xCLElBQ0UsSUFBSSxDQUFDLGlCQUFpQjtnQkFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLEVBQzVDO2dCQUNBLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7YUFDL0I7U0FDRjtRQUVELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxpQkFBaUI7SUFDakIsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDekQsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDekIsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7WUFDNUIsT0FBTztTQUNSO1FBQ0QsaUJBQWlCO1FBQ2pCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUMxQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUNsQyxDQUFDO1FBQ0YsdUJBQXVCO1FBQ3ZCLE1BQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQ3ZDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxLQUFLLElBQUksQ0FDOUIsQ0FBQyxNQUFNLENBQUM7UUFDVCxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxXQUFXO1lBQ2QsVUFBVSxHQUFHLENBQUMsSUFBSSxZQUFZLEdBQUcsQ0FBQyxJQUFJLFlBQVksS0FBSyxVQUFVLENBQUM7UUFDcEUsSUFBSSxDQUFDLGNBQWMsR0FBRyxZQUFZLEdBQUcsQ0FBQyxJQUFJLFlBQVksR0FBRyxVQUFVLENBQUM7SUFDdEUsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixjQUFjLENBQUMsT0FBZ0IsRUFBRSxLQUFhO1FBQzVDLElBQUksS0FBSyxFQUFFO1lBQ1QsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3pCO1FBRUQsaUJBQWlCO1FBQ2pCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUMxQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUNsQyxDQUFDO1FBRUYsa0JBQWtCO1FBQ2xCLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUM1QixHQUFHLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FBQztRQUVILDRCQUE0QjtRQUM1QixJQUFJLE9BQU8sRUFBRTtZQUNYLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDO1lBQ3hDLG9CQUFvQjtZQUNwQixJQUFJLENBQUMsaUJBQWlCO2dCQUNwQixhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDdEQ7YUFBTTtZQUNMLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1lBQ3hCLE9BQU87WUFDUCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1NBQy9CO1FBRUQsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELG9CQUFvQjtJQUNwQixlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELDRCQUE0QjtJQUM1QixzQkFBc0IsQ0FBQyxJQUFTLEVBQUUsT0FBZ0I7UUFDaEQsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzVCLE9BQU87U0FDUjtRQUVELCtCQUErQjtRQUMvQiwwQkFBMEI7UUFFMUIsNEJBQTRCO1FBQzVCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDakQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQzFCLENBQUM7UUFDRixJQUFJLE9BQU8sRUFBRTtZQUNYLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUNoQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMvQjtZQUNELGtCQUFrQjtZQUNsQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1NBQy9CO2FBQU07WUFDTCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDZCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDckM7WUFDRCxrQkFBa0I7WUFDbEIsSUFDRSxJQUFJLENBQUMsaUJBQWlCO2dCQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsRUFDNUM7Z0JBQ0EsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQzthQUMvQjtTQUNGO1FBRUQsU0FBUztRQUNULElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxpQkFBaUI7SUFDakIscUJBQXFCO1FBQ25CLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxtQkFBbUI7SUFDWCxRQUFRLENBQUMsSUFBUztRQUN4QixPQUFPLElBQUksQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxTQUFTLENBQUM7SUFDMUMsQ0FBQztJQUVELGFBQWE7SUFDTCxTQUFTLENBQUMsSUFBUyxFQUFFLElBQVM7UUFDcEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhDLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFO1lBQzFDLE9BQU8sR0FBRyxLQUFLLEdBQUcsQ0FBQztTQUNwQjtRQUVELHFCQUFxQjtRQUNyQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsaUJBQWlCO0lBQ2pCLGlCQUFpQjtRQUNmLDBCQUEwQjtRQUMxQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQzlCLEdBQUcsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0lBQ2hDLENBQUM7SUFFRCx5QkFBeUIsQ0FBQyxlQUE4QixFQUFFLEdBQVc7UUFDbkUsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUNsQixDQUFDLEdBQUcsQ0FBQyxFQUFFLGVBQWU7aUJBQ25CLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztpQkFDOUIsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1NBQzdCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ3hELElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELGVBQWU7UUFDYixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUM5QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQzFELE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDO1lBQ3RELENBQUMsQ0FBQyxDQUFDO1lBRUgseUJBQXlCO1lBQ3pCLElBQUksWUFBWSxFQUFFLFNBQVMsS0FBSyxVQUFVLEVBQUU7Z0JBQzFDLGtDQUFrQztnQkFDbEMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDaEQsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUM7Z0JBQ3RELENBQUMsQ0FBQyxDQUFDO2dCQUVILG1DQUFtQztnQkFDbkMsTUFBTSxrQkFBa0IsR0FBRyxjQUFjLEVBQUUsVUFFOUIsQ0FBQztnQkFDZCxNQUFNLGFBQWEsR0FBRyxDQUFDLGtCQUFrQixFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7cUJBQ3RELE1BQU0sQ0FBQyxDQUFDLEdBQWdCLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7cUJBQ3pDLEdBQUcsQ0FBQyxDQUFDLEdBQWdCLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEMsTUFBTSxZQUFZLEdBQ2hCLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQztvQkFDdEIsQ0FBQyxDQUFDLGFBQWE7b0JBQ2YsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBRTVELElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsWUFBWSxDQUFDO2dCQUV2QywwQ0FBMEM7Z0JBQzFDLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN0RSxNQUFNLGVBQWUsR0FBRyxrQkFBa0IsRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO2dCQUMxRCxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxVQUFnQyxDQUFDO2dCQUN2RSxnQkFBZ0IsQ0FBQyxPQUFPLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQWlCLEVBQUUsRUFBRTtvQkFDbkUsT0FBTzt3QkFDTCxHQUFHLElBQUk7d0JBQ1AsT0FBTyxFQUFFLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztxQkFDNUMsQ0FBQztnQkFDSixDQUFDLENBQUMsQ0FBQzthQUNKO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsWUFBWSxFQUFFLFVBQVU7b0JBQ2hELENBQUMsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLEtBQUs7d0JBQzlCLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLO29CQUN2RCxDQUFDLENBQUMsdUJBQXVCLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQzthQUMzRDtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQscUJBQXFCLENBQUMsU0FBaUI7UUFDckMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsb0JBQW9CLENBQUMsUUFBYTtRQUNoQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxXQUFxQjtRQUNyQyxnQ0FBZ0M7UUFDaEMsSUFDRSxXQUFXO1lBQ1gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQzlCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUM1QjtZQUNBLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztTQUN6RDtRQUVELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixJQUFJO2dCQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQztvQkFDaEMsTUFBTSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtvQkFDckMsUUFBUSxFQUFFO3dCQUNSLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVM7d0JBQ25DLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVE7cUJBQ2xDO29CQUNELG9CQUFvQjtvQkFDcEIsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssUUFBUTt3QkFDNUIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxFQUFFO3dCQUN6QyxDQUFDLENBQUMsRUFBRSxDQUFDO2lCQUNSLENBQUMsQ0FBQztnQkFFSCxpQ0FBaUM7Z0JBQ2pDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtvQkFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7d0JBQ2pELE9BQU87NEJBQ0wsR0FBRyxJQUFJOzRCQUNQLE9BQU8sRUFBRSxLQUFLO3lCQUNmLENBQUM7b0JBQ0osQ0FBQyxDQUFDLENBQUM7aUJBQ0o7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztpQkFDckM7Z0JBRUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQztnQkFDOUMsb0JBQW9CO2dCQUNwQixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssT0FBTyxFQUFFO29CQUM3QixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztpQkFDOUI7Z0JBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUM7Z0JBQ3pDLG1CQUFtQjtnQkFDbkIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO29CQUNyQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztpQkFDMUI7YUFDRjtZQUFDLE9BQU8sS0FBSyxFQUFFO2dCQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUM5QixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUN6QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzthQUN6QjtvQkFBUztnQkFDUixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztnQkFDdEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQzthQUMvQjtTQUNGO2FBQU07WUFDTCxPQUFPLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7U0FDdkI7SUFDSCxDQUFDO0lBRUQsVUFBVTtJQUNWLFlBQVksQ0FBQyxPQUFlLEVBQUUsU0FBc0M7UUFDbEUsd0JBQXdCO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUN6QyxJQUFJLEdBQUcsS0FBSyxPQUFPO29CQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQ2pELENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUVuQyxrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxDQUFDO1FBQ3JFLElBQUksU0FBUyxFQUFFO1lBQ2IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbEM7UUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssT0FBTyxFQUFFO1lBQzdCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1NBQzlCO2FBQU07WUFDTCxZQUFZO1lBQ1osSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQztJQUVELFlBQVksQ0FBQyxPQUFlO1FBQzFCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDeEMsQ0FBQztJQUVELG1CQUFtQixDQUFDLElBQVM7UUFDM0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2xELFdBQVc7WUFDWCxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztZQUN4QixNQUFNLFdBQVcsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztTQUMxQztRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxJQUFTO1FBQzdCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELEtBQUssQ0FBQywyQkFBMkIsQ0FDL0IsZUFBaUM7UUFFakMsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdkMsTUFBTSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztTQUNsQzthQUFNLElBQUksZUFBZSxFQUFFLE1BQU0sRUFBRTtZQUNsQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7U0FDMUI7SUFDSCxDQUFDO0lBRUQsNEJBQTRCO0lBQzVCLHVCQUF1QixDQUFDLEtBQVksRUFBRSxNQUFzQjtRQUMxRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDO1FBRXhELG9CQUFvQjtRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNoRCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFVLEVBQUUsRUFBRTtnQkFDMUMsMkJBQTJCO2dCQUMzQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUNqRCxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssUUFBUSxDQUN6RCxDQUFDO2dCQUNGLElBQUksYUFBYSxFQUFFO29CQUNqQixJQUFJLENBQUMsNkJBQTZCLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFDO2lCQUN4RDtZQUNILENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWE7WUFDdEIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7U0FDMUQ7UUFFRCxTQUFTO1FBQ1QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRSxJQUFJLFdBQVcsRUFBRTtZQUNmLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNwQjtJQUNILENBQUM7SUFFRCx1QkFBdUI7SUFDdkIseUJBQXlCLENBQUMsTUFBc0I7UUFDOUMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQztRQUN4RCxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkQsQ0FBQztJQUVELGFBQWEsQ0FBQyxNQUFzQjtRQUNsQyxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUM7SUFDM0IsQ0FBQztJQUVELGlCQUFpQjtJQUNqQixnQkFBZ0IsQ0FBQyxJQUF3QjtRQUN2QyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ2hELENBQUM7SUFFRCxxQkFBcUI7SUFDckIsb0JBQW9CLENBQUMsTUFBc0I7UUFDekMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQztRQUNqRSxPQUFPLGFBQWEsU0FBUyxZQUFZLENBQUM7SUFDNUMsQ0FBQzsrR0FwdENVLGlCQUFpQixrQkEySmxCLHVCQUF1QjttR0EzSnRCLGlCQUFpQiw2M0NBNEZYLFdBQVcsNkJDOUg5Qiw4eGlCQStaQTs7NEZEN1hhLGlCQUFpQjtrQkFMN0IsU0FBUzsrQkFDRSxlQUFlOzswQkE4SnRCLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMsdUJBQXVCOzRDQTFKeEIsYUFBYTtzQkFBckIsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsYUFBYTtzQkFBckIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBS0YsY0FBYztzQkFEakIsS0FBSztnQkFhRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsYUFBYTtzQkFBckIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUdHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTTtnQkFFRyxZQUFZO3NCQUFyQixNQUFNO2dCQUVHLGNBQWM7c0JBQXZCLE1BQU07Z0JBRUcsdUJBQXVCO3NCQUFoQyxNQUFNO2dCQUVHLGVBQWU7c0JBQXhCLE1BQU07Z0JBRXdCLGdCQUFnQjtzQkFBOUMsWUFBWTt1QkFBQyxlQUFlO2dCQUVGLFlBQVk7c0JBQXRDLFlBQVk7dUJBQUMsV0FBVztnQkFFSyxlQUFlO3NCQUE1QyxZQUFZO3VCQUFDLGNBQWM7Z0JBRUUsWUFBWTtzQkFBekMsZUFBZTt1QkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlckNvbnRlbnRJbml0LFxyXG4gIENvbXBvbmVudCxcclxuICBDb250ZW50Q2hpbGQsXHJcbiAgQ29udGVudENoaWxkcmVuLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIE9wdGlvbmFsLFxyXG4gIE91dHB1dCxcclxuICBRdWVyeUxpc3QsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgY2xvbmVEZWVwLCBoYXNJbiwgaXNOaWwsIGRlYm91bmNlLCBpc0VxdWFsIH0gZnJvbSBcImxvZGFzaC1lc1wiO1xyXG5pbXBvcnQgeyBQUk9fVEFCTEVfREVGQVVMVF9DT0xVTU4sIFBST19UQUJMRV9ERUZBVUxUX1BST1BTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB7XHJcbiAgQXV0b0NvbXBsZXRlRmllbGRQcm9wcyxcclxuICBDaGVja2JveEZpZWxkUHJvcHMsXHJcbiAgT3B0aW9uc1R5cGUsXHJcbiAgUHJvVGFibGVDb2x1bW4sXHJcbiAgUHJvVGFibGVQYWdlSW5mbyxcclxuICBQcm9UYWJsZVJlcXVlc3RSZXN1bHQsXHJcbiAgUHJvVGFibGVWYWx1ZXNDaGFuZ2UsXHJcbiAgU2VsZWN0RmllbGRQcm9wcyxcclxufSBmcm9tIFwiLi90eXBlXCI7XHJcbmltcG9ydCB7IFBST19UQUJMRV9DT0xVTU5fUkVNT1RFLCBQcm9UYWJsZVJlbW90ZUNvbHVtblNlcnZpY2UgfSBmcm9tIFwiLi90b2tlbnNcIjtcclxuaW1wb3J0IHsgaXNPYnNlcnZhYmxlLCBsYXN0VmFsdWVGcm9tIH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImFwcC1wcm8tdGFibGVcIixcclxuICB0ZW1wbGF0ZVVybDogXCIuL3Byby10YWJsZS5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi9wcm8tdGFibGUuY29tcG9uZW50Lmxlc3NcIl0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQcm9UYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCB7XHJcbiAgQElucHV0KCkgc2hvd1NlYXJjaEJ0bjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dDbGVhckJ0bjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgQElucHV0KCkgYm9keVN0eWxlOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB9ID0ge307XHJcblxyXG4gIEBJbnB1dCgpIHRhYmxlTmFtZTogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgQElucHV0KCkgbXVsdGlSb3c6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgY29sdW1uczogUHJvVGFibGVDb2x1bW5bXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKSBzaG93U2VhcmNoQmFyOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgc2hvd0FjdGlvbkJhcjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIGNvbmZpcm1CdG5UZXh0OiBzdHJpbmcgPSBcIuafpeivolwiO1xyXG5cclxuICBASW5wdXQoKSBjbGVhckJ0blRleHQ6IHN0cmluZyA9IFwi5riF56m6XCI7XHJcblxyXG4gIEBJbnB1dCgpIGxhYmVsV2lkdGg6IHN0cmluZyA9IFwiOTBweFwiO1xyXG5cclxuICBASW5wdXQoKSBsYWJlbEFsaWduOiBzdHJpbmcgPSBcInJpZ2h0XCI7XHJcblxyXG4gIHByaXZhdGUgX3NlYXJjaENvbENvdW50OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgc2VhcmNoQ29sQ291bnQodmFsdWU6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX3NlYXJjaENvbENvdW50ID0gaXNOaWwodmFsdWUpID8gbnVsbCA6IE51bWJlcih2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgc2VhcmNoQ29sQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9zZWFyY2hDb2xDb3VudCA/PyA0O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRhYmxlU2VhcmNoQ29sQ291bnQoKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VhcmNoQ29sQ291bnQ7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBkYXRhU291cmNlOiBhbnlbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKSBib3JkZXJlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIG91dGVyQm9yZGVyZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBzaG93UGFnaW5hdGlvbjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIGZyb250UGFnaW5hdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBzY3JvbGw6IHsgeD86IHN0cmluZyB8IG51bWJlcjsgeT86IHN0cmluZyB8IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIEBJbnB1dCgpIHJlcXVlc3Q6IChwYXJhbXM6IGFueSkgPT4gUHJvbWlzZTxQcm9UYWJsZVJlcXVlc3RSZXN1bHQ+O1xyXG5cclxuICBASW5wdXQoKSBzdW1tYXJ5RGF0YTogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvLyDmjpLluo/mqKHlvI/vvJpsb2NhbCDmnKzlnLDmjpLluo/vvJtzZXJ2ZXIg5Zyo57q/5o6S5bqP77yI5o+Q5Lqk57uZ5o6l5Y+j77yJXHJcbiAgQElucHV0KCkgc29ydE1vZGU6IFwibG9jYWxcIiB8IFwic2VydmVyXCIgPSBcImxvY2FsXCI7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dDb2x1bW5TZXR0aW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIOaYr+WQpuW8gOWQr+WkmuWIl+aOkuW6j++8iOm7mOiupOWNleWIl++8iVxyXG4gIEBJbnB1dCgpIG11bHRpcGxlU29ydDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBzaG93Q2hlY2tib3g6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8g5Yik5pat6KGM5piv5ZCm56aB55So55qE5Ye95pWwXHJcbiAgQElucHV0KCkgcm93RGlzYWJsZWQ6IChkYXRhOiBhbnkpID0+IGJvb2xlYW4gPSAoKSA9PiBmYWxzZTtcclxuXHJcbiAgLy8g5piv5ZCm6Ieq5Yqo6Kem5Y+R6K+35rGCXHJcbiAgQElucHV0KCkgYXV0b1RyaWdnZXJSZXF1ZXN0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgY3VzdG9tVGFibGVSZW5kZXI/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBAT3V0cHV0KCkgb25Sb3dDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAT3V0cHV0KCkgb25Sb3dEYkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSBvblZhbHVlc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UHJvVGFibGVWYWx1ZXNDaGFuZ2U+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSBvblJlc2V0Rm9ybUJlZm9yZVJlbG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAT3V0cHV0KCkgb25Db2x1bW5zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxQcm9UYWJsZUNvbHVtbltdPigpO1xyXG5cclxuICBAQ29udGVudENoaWxkKFwiY3VzdG9tQ29udGVudFwiKSBjdXN0b21Db250ZW50VHBsITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZChcImFjdGlvbkJhclwiKSBhY3Rpb25CYXJUcGwhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBAQ29udGVudENoaWxkKFwiSW1nQWN0aW9uQmFyXCIpIGltZ0FjdGlvbkJhclRwbCE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIEBDb250ZW50Q2hpbGRyZW4oVGVtcGxhdGVSZWYpIGFsbFRlbXBsYXRlcyE6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxhbnk+PjtcclxuXHJcbiAgcHJpdmF0ZSBfc2F2ZWRTZWFyY2hQYXJhbXM6IGFueSA9IHt9O1xyXG5cclxuICAvLyDlrZjlgqjmiYDmnInoh6rlrprkuYnmqKHmnb/nmoTlvJXnlKhcclxuICBwcml2YXRlIGN1c3RvbVRlbXBsYXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBUZW1wbGF0ZVJlZjxhbnk+PigpO1xyXG5cclxuICAvLyDorrDlvZXlkITliJfmjpLluo/nirbmgIHvvJonYXNjZW5kJyB8ICdkZXNjZW5kJyB8IG51bGxcclxuXHJcbiAgcHJpdmF0ZSBfc29ydE1hcDogUmVjb3JkPHN0cmluZywgXCJhc2NlbmRcIiB8IFwiZGVzY2VuZFwiIHwgbnVsbD4gPSB7fTtcclxuXHJcbiAgLy8g6K6w5b2V5aSa5YiX5o6S5bqP55qE5LyY5YWI57qn77yI5ZCO6K6+572u55qE5LyY5YWI77yJXHJcbiAgcHJpdmF0ZSBfc29ydFByaW9yaXR5OiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAvLyDlrZjlgqjmr4/kuKogYXV0b0NvbXBsZXRlIOWtl+auteeahOmYsuaKluWHveaVsFxyXG4gIHByaXZhdGUgX2F1dG9Db21wbGV0ZURlYm91bmNlTWFwOiBNYXA8c3RyaW5nLCAoZXZlbnQ6IEV2ZW50KSA9PiB2b2lkPiA9XHJcbiAgICBuZXcgTWFwKCk7XHJcblxyXG5cclxuICBfY29sdW1uczogUHJvVGFibGVDb2x1bW5bXSA9IFtdO1xyXG5cclxuICBnZXQgX2NvbXB1dGVkU2Nyb2xsKCk6IHsgeD86IHN0cmluZyB8IG51bWJlcjsgeT86IHN0cmluZyB8IG51bWJlciB9IHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMuc2Nyb2xsIHx8IHRoaXMuc2Nyb2xsLnggIT09ICdhdXRvJykgcmV0dXJuIHRoaXMuc2Nyb2xsO1xyXG4gICAgY29uc3QgeyB4LCAuLi5yZXN0IH0gPSB0aGlzLnNjcm9sbCBhcyBhbnk7XHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXMocmVzdCkubGVuZ3RoID4gMCA/IHJlc3QgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8g562b6YCJ6KGo5Y2V5pWw5o2u5a2Y5YKoXHJcbiAgX3NlYXJjaFBhcmFtczogYW55ID0ge307XHJcblxyXG4gIC8vIOetm+mAieihqOWNlWxpc3TmuLLmn5PmlbDmja5cclxuICBfc2VhcmNoRmlsZWRDb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdID0gW107XHJcblxyXG4gIF9wYWdlSW5mbzogUHJvVGFibGVQYWdlSW5mbyA9IHtcclxuICAgIHBhZ2VJbmRleDogMSxcclxuICAgIHBhZ2VTaXplOiAxNSxcclxuICAgIHRvdGFsOiAxMDAsXHJcbiAgICBwYWdlU2l6ZU9wdGlvbnM6IFsxMCwgMTUsIDIwLCA1MCwgMTAwLCA1MDAsIDEwMDBdLFxyXG4gIH07XHJcblxyXG4gIF9sb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIF9zZWxlY3RlZFRhYmxlUm93OiBhbnkgPSBudWxsO1xyXG5cclxuICAvLyDpgInkuK3nmoTooYzmlbDmja7vvIjnlKjkuo7lpI3pgInmoYbpgInmi6nvvIktIOS/neeVmeeUqOS6juWFvOWuueaAp1xyXG4gIF9zZWxlY3RlZFJvd3M6IGFueVtdID0gW107XHJcblxyXG4gIC8vIOWFqOmAieeKtuaAgVxyXG4gIF9jaGVja2VkQWxsOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIOWNiumAieeKtuaAge+8iOmDqOWIhumAieS4re+8iVxyXG4gIF9pbmRldGVybWluYXRlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIOi/nOeoi2NvbHVtbnNcclxuICBfc2VydmVyQ29sdW1uczogUHJvVGFibGVDb2x1bW5bXSA9IFtdO1xyXG5cclxuICAvLyDlrZjlgqggYXV0b0NvbXBsZXRlIOWtl+auteeahOaVsOaNrua6kFxyXG4gIF9hdXRvQ29tcGxldGVEYXRhU291cmNlczogUmVjb3JkPHN0cmluZywgYW55W10+ID0ge307XHJcblxyXG4gIC8vIOWKqOaAgeWIl+WKoOi9veWujOaIkOagh+W/l++8jOm7mOiupCB0cnVl77yI5peg5Yqo5oCB5YiX5pe255u05o6l5pi+56S677yJXHJcbiAgX2NvbHVtbnNSZWFkeTogYm9vbGVhbiA9IHRydWU7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBAT3B0aW9uYWwoKVxyXG4gICAgQEluamVjdChQUk9fVEFCTEVfQ09MVU1OX1JFTU9URSlcclxuICAgIHByaXZhdGUgY29sdW1uUmVtb3RlOiBQcm9UYWJsZVJlbW90ZUNvbHVtblNlcnZpY2UgfCBudWxsLFxyXG4gICkge31cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFJlbW90ZUNvbHVtbnMoKSB7XHJcbiAgICBpZiAoIXRoaXMuY29sdW1uUmVtb3RlPy5nZXRDb2wgfHwgIXRoaXMudGFibGVOYW1lKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jb2x1bW5SZW1vdGUuZ2V0Q29sKHRoaXMudGFibGVOYW1lLCB0aGlzLm11bHRpUm93KTtcclxuICAgICAgcmV0dXJuIHJlcztcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBwZXJzaXN0UmVtb3RlQ29sdW1ucyhjb2x1bW5zOiBhbnlbXSkge1xyXG4gICAgaWYgKCF0aGlzLmNvbHVtblJlbW90ZT8uc2V0Q29sIHx8ICF0aGlzLnRhYmxlTmFtZSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29sdW1uUmVtb3RlLnNldENvbChcclxuICAgICAgICB0aGlzLnRhYmxlTmFtZSxcclxuICAgICAgICBjb2x1bW5zLFxyXG4gICAgICAgIHRoaXMubXVsdGlSb3csXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChyZXN1bHQgJiYgaXNPYnNlcnZhYmxlKHJlc3VsdCkpIHtcclxuICAgICAgICByZXR1cm4gYXdhaXQgbGFzdFZhbHVlRnJvbShyZXN1bHQpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4geyAgIFxyXG4gICAgdGhpcy5fc2VhcmNoUGFyYW1zID0ge307XHJcbiAgICB0aGlzLmZvcm1hdGVJbm5lckNvbHVtbnModGhpcy5jb2x1bW5zKTtcclxuICAgIGF3YWl0IHRoaXMuc2V0U2VhcmNoUGFyYW1zKHRoaXMuY29sdW1ucyk7XHJcblxyXG4gICAgLy8g5L2/55SoIFByb3h5IOWMheijhSBfc2VhcmNoUGFyYW1z77yM5oum5oiq6KGo5Y2V6aG55YC85Y+Y5YyW5bm25ZCR5aSW5Y+R5Ye65LqL5Lu2XHJcbiAgICB0aGlzLl9zZWFyY2hQYXJhbXMgPSB0aGlzLmNyZWF0ZVNlYXJjaFBhcmFtc1Byb3h5KHRoaXMuX3NlYXJjaFBhcmFtcyk7XHJcbiAgICBpZiAodGhpcy5hdXRvVHJpZ2dlclJlcXVlc3QpIHtcclxuICAgICAgdGhpcy5oYW5kbGVRdWVyeSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMudGFibGVOYW1lICYmIHRoaXMuY29sdW1uUmVtb3RlKSB7XHJcbiAgICAgIHRoaXMuX2NvbHVtbnNSZWFkeSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnF1ZXJ5RHluYW1pY0NvbHVtbnMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZW1pdENvbHVtbnNDaGFuZ2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcclxuICAgIC8vIOiHquWKqOazqOWGjOaJgOacieiHquWumuS5ieaooeadv1xyXG4gICAgLy8g5rOo5oSP77ya5q2k5pe25omA5pyJIENvbnRlbnRDaGlsZCDlkowgQ29udGVudENoaWxkcmVuIOmDveW3suWIneWni+WMluWujOaIkFxyXG4gICAgdGhpcy5hdXRvUmVnaXN0ZXJUZW1wbGF0ZXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgcXVlcnlEeW5hbWljQ29sdW1ucygpIHtcclxuICAgIGlmICghdGhpcy50YWJsZU5hbWUgfHwgIXRoaXMuY29sdW1uUmVtb3RlKSByZXR1cm47XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmZldGNoUmVtb3RlQ29sdW1ucygpO1xyXG4gICAgICBpZiAoIXJlcykgcmV0dXJuO1xyXG4gICAgICBpZiAocmVzLmNvZGUgPT09IDApIHtcclxuICAgICAgICBjb25zdCBfdGFiQ29sdW1uID0gcmVzLmRhdGEudGFiQ29sdW1uLm1hcCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0uaGVhZGVyLFxyXG4gICAgICAgICAgICBwcm9wOiBpdGVtLmZpZWxkLFxyXG4gICAgICAgICAgICBzb3J0TmFtZTogaXRlbS5zb3J0TmFtZSxcclxuICAgICAgICAgICAgaGlkZUluVGFibGU6ICFpdGVtLmlzU2hvdyxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fc2VydmVyQ29sdW1ucyA9IF90YWJDb2x1bW4uZmlsdGVyKChjb2wpID0+XHJcbiAgICAgICAgICB0aGlzLmNvbHVtbnMuc29tZShcclxuICAgICAgICAgICAgKGxvY2FsQ29sKSA9PlxyXG4gICAgICAgICAgICAgIGxvY2FsQ29sLnByb3AgPT09IGNvbC5wcm9wICYmIHRoaXMuaXNDb25maWd1cmFibGVDb2x1bW4obG9jYWxDb2wpLFxyXG4gICAgICAgICAgKSxcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMudXBkYXRlVGFibGVDb2x1bW5zKHRoaXMuX3NlcnZlckNvbHVtbnMpO1xyXG4gICAgICB9IGVsc2UgaWYgKHJlcy5jb2RlID09PSAxMCkge1xyXG4gICAgICAgIC8vIOWmguaenOacquiuvue9ruaOpeWPo+i/lOWbnu+8jOmcgOimgem7mOiupOiwg+eUqOS4gOasoeS/ruaUueWHveaVsOWIneWni+WMluaVsOaNrlxyXG4gICAgICAgIGNvbnN0IGluaXRDb2x1bW5zID0gdGhpcy5jb2x1bW5zXHJcbiAgICAgICAgICAuZmlsdGVyKChjb2wpID0+IHRoaXMuaXNDb25maWd1cmFibGVDb2x1bW4oY29sKSlcclxuICAgICAgICAgIC5tYXAoKGNvbHVtbikgPT4gKHtcclxuICAgICAgICAgICAgZmllbGQ6IGNvbHVtbi5wcm9wLFxyXG4gICAgICAgICAgICBpc1Nob3c6IHRydWUsXHJcbiAgICAgICAgICAgIGhlYWRlcjogY29sdW1uLnRpdGxlLFxyXG4gICAgICAgICAgICBzb3J0TmFtZTogY29sdW1uLnNvcnROYW1lIHx8IG51bGwsXHJcbiAgICAgICAgICB9KSk7XHJcbiAgICAgICAgY29uc3QgaW5pdFJlcyA9IGF3YWl0IHRoaXMucGVyc2lzdFJlbW90ZUNvbHVtbnMoaW5pdENvbHVtbnMpO1xyXG4gICAgICAgIGlmIChpbml0UmVzKSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5RHluYW1pY0NvbHVtbnMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuX2NvbHVtbnNSZWFkeSA9IHRydWU7XHJcbiAgICAgIHRoaXMuZW1pdENvbHVtbnNDaGFuZ2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW1pdENvbHVtbnNDaGFuZ2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ29sdW1uc0NoYW5nZS5lbWl0KGNsb25lRGVlcCh0aGlzLl9jb2x1bW5zKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvcm1hdGVJbm5lckNvbHVtbnMoY29sdW1uczogUHJvVGFibGVDb2x1bW5bXSkge1xyXG4gICAgdGhpcy5fY29sdW1ucyA9IGNvbHVtbnNcclxuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uaGlkZUluVGFibGUpXHJcbiAgICAgIC5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgICByZXR1cm4geyAuLi5QUk9fVEFCTEVfREVGQVVMVF9DT0xVTU4sIC4uLml0ZW0gfSBhcyBQcm9UYWJsZUNvbHVtbjtcclxuICAgICAgfSk7XHJcblxyXG4gICAgbGV0IGxlZnRPZmZzZXQgPSAwO1xyXG4gICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5fY29sdW1ucykge1xyXG4gICAgICBpZiAoY29sLmZpeGVkTGVmdCkge1xyXG4gICAgICAgIGNvbC5fbnpMZWZ0ID0gYCR7bGVmdE9mZnNldH1weGA7XHJcbiAgICAgICAgbGVmdE9mZnNldCArPSB0aGlzLnBhcnNlQ29sdW1uV2lkdGgoY29sLndpZHRoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb2wuX256TGVmdCA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJpZ2h0T2Zmc2V0ID0gMDtcclxuICAgIGZvciAobGV0IGkgPSB0aGlzLl9jb2x1bW5zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgIGNvbnN0IGNvbCA9IHRoaXMuX2NvbHVtbnNbaV07XHJcbiAgICAgIGlmIChjb2wuZml4ZWRSaWdodCkge1xyXG4gICAgICAgIGNvbC5fbnpSaWdodCA9IGAke3JpZ2h0T2Zmc2V0fXB4YDtcclxuICAgICAgICByaWdodE9mZnNldCArPSB0aGlzLnBhcnNlQ29sdW1uV2lkdGgoY29sLndpZHRoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb2wuX256UmlnaHQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYXJzZUNvbHVtbldpZHRoKHdpZHRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBudW1iZXIge1xyXG4gICAgaWYgKCF3aWR0aCkgcmV0dXJuIDA7XHJcbiAgICBjb25zdCBtYXRjaCA9IHdpZHRoLm1hdGNoKC9eKFxcZCsoPzpcXC5cXGQrKT8pcHgkLyk7XHJcbiAgICByZXR1cm4gbWF0Y2ggPyBwYXJzZUZsb2F0KG1hdGNoWzFdKSA6IDA7XHJcbiAgfVxyXG5cclxuICAvLyDoh6rliqjms6jlhozmqKHmnb/nmoTmlrnms5VcclxuICBwcml2YXRlIGF1dG9SZWdpc3RlclRlbXBsYXRlcygpIHtcclxuICAgIC8vIOiOt+WPluaJgOacieaooeadv1xyXG4gICAgY29uc3QgYWxsVGVtcGxhdGVzQXJyYXkgPSB0aGlzLmFsbFRlbXBsYXRlcy50b0FycmF5KCk7XHJcblxyXG4gICAgLy8g6I635Y+W5omA5pyJ6ZyA6KaB6Ieq5a6a5LmJ5qih5p2/55qE5YiXXHJcbiAgICBjb25zdCBjb2x1bW5zV2l0aEN1c3RvbVJlbmRlciA9IHRoaXMuX2NvbHVtbnMuZmlsdGVyKFxyXG4gICAgICAoY29sKSA9PiBjb2wuY3VzdG9tUmVuZGVyLFxyXG4gICAgKTtcclxuXHJcbiAgICAvLyDojrflj5bmiYDmnInpnIDopoHoh6rlrprkuYlsYWJlbOaooeadv+eahOWIl++8iOS9v+eUqOWOn+Wni2NvbHVtbnPvvIznoa7kv53pobrluo/mraPnoa7vvIlcclxuICAgIGNvbnN0IGNvbHVtbnNXaXRoQ3VzdG9tTGFiZWwgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKFxyXG4gICAgICAoY29sKSA9PiBjb2wuY3VzdG9tTGFiZWxSZW5kZXIsXHJcbiAgICApO1xyXG5cclxuICAgIC8vIOiuoeeul+mcgOimgeeahOaooeadv+aAu+aVsFxyXG4gICAgY29uc3QgY3VzdG9tUmVuZGVyQ291bnQgPSBjb2x1bW5zV2l0aEN1c3RvbVJlbmRlci5sZW5ndGg7XHJcbiAgICBjb25zdCB0b3RhbE5lZWRlZFRlbXBsYXRlcyA9XHJcbiAgICAgIGN1c3RvbVJlbmRlckNvdW50ICsgY29sdW1uc1dpdGhDdXN0b21MYWJlbC5sZW5ndGg7XHJcblxyXG4gICAgLy8g6K+G5Yir5bm25o6S6Zmk54m55q6K5qih5p2/77yIY3VzdG9tQ29udGVudOOAgWFjdGlvbkJhciDlkowgaW1nQWN0aW9uQmFy77yJXHJcbiAgICBjb25zdCBzcGVjaWFsVGVtcGxhdGVJbmRpY2VzID0gbmV3IFNldDxudW1iZXI+KCk7XHJcblxyXG4gICAgaWYgKHRoaXMuY3VzdG9tQ29udGVudFRwbCkge1xyXG4gICAgICBjb25zdCBjdXN0b21Db250ZW50SW5kZXggPSB0aGlzLmZpbmRUZW1wbGF0ZUluZGV4KFxyXG4gICAgICAgIGFsbFRlbXBsYXRlc0FycmF5LFxyXG4gICAgICAgIHRoaXMuY3VzdG9tQ29udGVudFRwbCxcclxuICAgICAgKTtcclxuICAgICAgaWYgKGN1c3RvbUNvbnRlbnRJbmRleCAhPT0gLTEpIHtcclxuICAgICAgICBzcGVjaWFsVGVtcGxhdGVJbmRpY2VzLmFkZChjdXN0b21Db250ZW50SW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5bCd6K+V5om+5YiwIGFjdGlvbkJhclRwbCDlnKggYWxsVGVtcGxhdGVzQXJyYXkg5Lit55qE5L2N572uXHJcbiAgICBpZiAodGhpcy5hY3Rpb25CYXJUcGwpIHtcclxuICAgICAgY29uc3QgYWN0aW9uQmFySW5kZXggPSB0aGlzLmZpbmRUZW1wbGF0ZUluZGV4KFxyXG4gICAgICAgIGFsbFRlbXBsYXRlc0FycmF5LFxyXG4gICAgICAgIHRoaXMuYWN0aW9uQmFyVHBsLFxyXG4gICAgICApO1xyXG4gICAgICBpZiAoYWN0aW9uQmFySW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgc3BlY2lhbFRlbXBsYXRlSW5kaWNlcy5hZGQoYWN0aW9uQmFySW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5bCd6K+V5om+5YiwIGltZ0FjdGlvbkJhclRwbCDlnKggYWxsVGVtcGxhdGVzQXJyYXkg5Lit55qE5L2N572uXHJcbiAgICBpZiAodGhpcy5pbWdBY3Rpb25CYXJUcGwpIHtcclxuICAgICAgY29uc3QgaW1nQWN0aW9uQmFySW5kZXggPSB0aGlzLmZpbmRUZW1wbGF0ZUluZGV4KFxyXG4gICAgICAgIGFsbFRlbXBsYXRlc0FycmF5LFxyXG4gICAgICAgIHRoaXMuaW1nQWN0aW9uQmFyVHBsLFxyXG4gICAgICApO1xyXG4gICAgICBpZiAoaW1nQWN0aW9uQmFySW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgc3BlY2lhbFRlbXBsYXRlSW5kaWNlcy5hZGQoaW1nQWN0aW9uQmFySW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5aaC5p6c5peg5rOV6YCa6L+H5byV55So5om+5Yiw54m55q6K5qih5p2/77yM5L2/55So5aSH55So562W55WlXHJcbiAgICAvLyDlpIfnlKjnrZbnlaXvvJrlgYforr7mnIDlkI7nmoTmqKHmnb/mmK/nibnmrormqKHmnb9cclxuICAgIGNvbnN0IHNwZWNpYWxUZW1wbGF0ZUNvdW50ID1cclxuICAgICAgKHRoaXMuY3VzdG9tQ29udGVudFRwbCA/IDEgOiAwKSArXHJcbiAgICAgICh0aGlzLmFjdGlvbkJhclRwbCA/IDEgOiAwKSArXHJcbiAgICAgICh0aGlzLmltZ0FjdGlvbkJhclRwbCA/IDEgOiAwKTtcclxuICAgIGlmIChzcGVjaWFsVGVtcGxhdGVJbmRpY2VzLnNpemUgPT09IDAgJiYgc3BlY2lhbFRlbXBsYXRlQ291bnQgPiAwKSB7XHJcbiAgICAgIGZvciAoXHJcbiAgICAgICAgbGV0IGkgPSBhbGxUZW1wbGF0ZXNBcnJheS5sZW5ndGggLSBzcGVjaWFsVGVtcGxhdGVDb3VudDtcclxuICAgICAgICBpIDwgYWxsVGVtcGxhdGVzQXJyYXkubGVuZ3RoO1xyXG4gICAgICAgIGkrK1xyXG4gICAgICApIHtcclxuICAgICAgICBzcGVjaWFsVGVtcGxhdGVJbmRpY2VzLmFkZChpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOaPkOWPluWIl+aooeadv++8iOaOkumZpOeJueauiuaooeadv++8iVxyXG4gICAgY29uc3QgY29sdW1uVGVtcGxhdGVzOiBUZW1wbGF0ZVJlZjxhbnk+W10gPSBbXTtcclxuICAgIGFsbFRlbXBsYXRlc0FycmF5LmZvckVhY2goKHRwbCwgaW5kZXgpID0+IHtcclxuICAgICAgaWYgKCFzcGVjaWFsVGVtcGxhdGVJbmRpY2VzLmhhcyhpbmRleCkpIHtcclxuICAgICAgICBjb2x1bW5UZW1wbGF0ZXMucHVzaCh0cGwpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyDpqozor4HmqKHmnb/mlbDph49cclxuICAgIGlmIChjb2x1bW5UZW1wbGF0ZXMubGVuZ3RoICE9PSB0b3RhbE5lZWRlZFRlbXBsYXRlcykge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgYFByb1RhYmxlOiDmqKHmnb/mlbDph4/kuI3ljLnphY3vvIHpnIDopoEgJHt0b3RhbE5lZWRlZFRlbXBsYXRlc30g5Liq5YiX5qih5p2/77yM5a6e6ZmF5pyJICR7Y29sdW1uVGVtcGxhdGVzLmxlbmd0aH0g5Liq44CC6K+35qOA5p+lIGN1c3RvbVJlbmRlciDlkowgY3VzdG9tTGFiZWxSZW5kZXIg6YWN572u44CCYCxcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDms6jlhozoh6rlrprkuYnmuLLmn5PmqKHmnb9cclxuICAgIGNvbHVtbnNXaXRoQ3VzdG9tUmVuZGVyLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcclxuICAgICAgY29uc3QgdGVtcGxhdGVOYW1lID0gY29sdW1uLmN1c3RvbVJlbmRlciE7XHJcbiAgICAgIGlmIChpbmRleCA8IGNvbHVtblRlbXBsYXRlcy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlcy5zZXQodGVtcGxhdGVOYW1lLCBjb2x1bW5UZW1wbGF0ZXNbaW5kZXhdKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFxyXG4gICAgICAgICAgYFByb1RhYmxlOiDmnKrmib7liLDmqKHmnb8gXCIke3RlbXBsYXRlTmFtZX1cIu+8jOe0ouW8lSAke2luZGV4fSDotoXlh7rojIPlm7RgLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIOazqOWGjOiHquWumuS5iWxhYmVs5qih5p2/77yI5LuOIGN1c3RvbVJlbmRlckNvdW50IOS5i+WQjuW8gOWni++8iVxyXG4gICAgY29sdW1uc1dpdGhDdXN0b21MYWJlbC5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XHJcbiAgICAgIGNvbnN0IHRlbXBsYXRlTmFtZSA9IGNvbHVtbi5jdXN0b21MYWJlbFJlbmRlciE7XHJcbiAgICAgIGNvbnN0IHRlbXBsYXRlSW5kZXggPSBjdXN0b21SZW5kZXJDb3VudCArIGluZGV4O1xyXG4gICAgICBpZiAodGVtcGxhdGVJbmRleCA8IGNvbHVtblRlbXBsYXRlcy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlcy5zZXQodGVtcGxhdGVOYW1lLCBjb2x1bW5UZW1wbGF0ZXNbdGVtcGxhdGVJbmRleF0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXHJcbiAgICAgICAgICBgUHJvVGFibGU6IOacquaJvuWIsGxhYmVs5qih5p2/IFwiJHt0ZW1wbGF0ZU5hbWV9XCLvvIzntKLlvJUgJHt0ZW1wbGF0ZUluZGV4fSDotoXlh7rojIPlm7RgLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8g5bCd6K+V5Zyo5pWw57uE5Lit5om+5Yiw5qih5p2/55qE57Si5byV77yI5L2/55So5aSa56eN5q+U6L6D5pa55byP77yJXHJcbiAgcHJpdmF0ZSBmaW5kVGVtcGxhdGVJbmRleChcclxuICAgIHRlbXBsYXRlczogVGVtcGxhdGVSZWY8YW55PltdLFxyXG4gICAgdGFyZ2V0OiBUZW1wbGF0ZVJlZjxhbnk+LFxyXG4gICk6IG51bWJlciB7XHJcbiAgICAvLyDmlrnms5Ux77ya5byV55So55u4562J5oCnXHJcbiAgICBsZXQgaW5kZXggPSB0ZW1wbGF0ZXMuaW5kZXhPZih0YXJnZXQpO1xyXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgcmV0dXJuIGluZGV4O1xyXG5cclxuICAgIC8vIOaWueazlTLvvJrpgJrov4cgZWxlbWVudFJlZiDmr5TovoNcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnRSZWYgPSAodGFyZ2V0IGFzIGFueSkuZWxlbWVudFJlZjtcclxuICAgICAgaWYgKHRhcmdldEVsZW1lbnRSZWYpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRlbXBsYXRlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgY29uc3QgdHBsRWxlbWVudFJlZiA9ICh0ZW1wbGF0ZXNbaV0gYXMgYW55KS5lbGVtZW50UmVmO1xyXG4gICAgICAgICAgaWYgKHRwbEVsZW1lbnRSZWYgPT09IHRhcmdldEVsZW1lbnRSZWYpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIC8vIOW/veeVpemUmeivr1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOaWueazlTPvvJrpgJrov4cgQW5ndWxhciDlhoXpg6jlsZ7mgKfmr5TovoNcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHRhcmdldENvbnRhaW5lciA9ICh0YXJnZXQgYXMgYW55KS5fZGVjbGFyYXRpb25UQ29udGFpbmVyO1xyXG4gICAgICBpZiAodGFyZ2V0Q29udGFpbmVyKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW1wbGF0ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGNvbnN0IHRwbENvbnRhaW5lciA9ICh0ZW1wbGF0ZXNbaV0gYXMgYW55KS5fZGVjbGFyYXRpb25UQ29udGFpbmVyO1xyXG4gICAgICAgICAgaWYgKHRwbENvbnRhaW5lciA9PT0gdGFyZ2V0Q29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyDlv73nlaXplJnor69cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gLTE7XHJcbiAgfVxyXG5cclxuICAvLyDorr7nva7nrZvpgInooajljZXpu5jorqTlsZ7mgKdcclxuICBwcml2YXRlIHNldFNlYXJjaEZvcm1EZWZhdWx0UHJvcChjb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdKSB7XHJcbiAgICBjb2x1bW5zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaWYgKGl0ZW0udmFsdWVUeXBlKSB7XHJcbiAgICAgICAgaWYgKGl0ZW0uZmllbGRQcm9wcykge1xyXG4gICAgICAgICAgaXRlbS5maWVsZFByb3BzID0ge1xyXG4gICAgICAgICAgICAuLi5QUk9fVEFCTEVfREVGQVVMVF9QUk9QU1tpdGVtLnZhbHVlVHlwZV0sXHJcbiAgICAgICAgICAgIC4uLml0ZW0uZmllbGRQcm9wcyxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGl0ZW0uZmllbGRQcm9wcyA9IHsgLi4uUFJPX1RBQkxFX0RFRkFVTFRfUFJPUFNbaXRlbS52YWx1ZVR5cGVdIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIOWKqOaAgeiuvue9rk9wdGlvbnNcclxuICBwcml2YXRlIHNldFNlbGVjdFJlcXVlc3QoY29sdW1uczogUHJvVGFibGVDb2x1bW5bXSkge1xyXG4gICAgY29sdW1ucy5tYXAoYXN5bmMgKGl0ZW0pID0+IHtcclxuICAgICAgaWYgKGl0ZW0uZmllbGRQcm9wcyAmJiBoYXNJbihpdGVtLmZpZWxkUHJvcHMsIFwicmVxdWVzdFwiKSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0gYXdhaXQgKFxyXG4gICAgICAgICAgICBpdGVtLmZpZWxkUHJvcHMgYXMgU2VsZWN0RmllbGRQcm9wc1xyXG4gICAgICAgICAgKS5yZXF1ZXN0Py4oKTtcclxuICAgICAgICAgIChpdGVtLmZpZWxkUHJvcHMgYXMgU2VsZWN0RmllbGRQcm9wcykub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgIChpdGVtLmZpZWxkUHJvcHMgYXMgU2VsZWN0RmllbGRQcm9wcykub3B0aW9ucyA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNldFNlYXJjaFBhcmFtcyhjb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdKSB7XHJcbiAgICB0aGlzLl9zZWFyY2hGaWxlZENvbHVtbnMgPSBbXTtcclxuICAgIGNvbHVtbnNcclxuICAgICAgLmZpbHRlcigoaXRlbSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZsYWcgPSAhaXRlbS5oaWRlSW5TZWFyY2ggJiYgaXRlbS52YWx1ZVR5cGU7XHJcbiAgICAgICAgaWYgKGZsYWcpIHtcclxuICAgICAgICAgIHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucy5wdXNoKGNsb25lRGVlcChpdGVtKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmbGFnO1xyXG4gICAgICB9KVxyXG4gICAgICAuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gY29sdW1uLmZpZWxkUHJvcHM/Lm5hbWUgfHwgY29sdW1uLnByb3A7XHJcbiAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZSA9IFBST19UQUJMRV9ERUZBVUxUX1BST1BTW2NvbHVtbi52YWx1ZVR5cGVdLnZhbHVlO1xyXG5cclxuICAgICAgICAvLyDlr7nkuo5jaGVja2JveOexu+Wei++8jOS7jm9wdGlvbnPkuK3mib7lh7pjaGVja2Vk5Li6dHJ1ZeeahOmhueS9nOS4uum7mOiupOWAvFxyXG4gICAgICAgIGlmIChjb2x1bW4udmFsdWVUeXBlID09PSBcImNoZWNrYm94XCIpIHtcclxuICAgICAgICAgIGNvbnN0IGNoZWNrZWRWYWx1ZXMgPSAoY29sdW1uLmZpZWxkUHJvcHM/Lm9wdGlvbnMgfHwgW10pXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKG9wdDogT3B0aW9uc1R5cGUpID0+IG9wdC5jaGVja2VkKVxyXG4gICAgICAgICAgICAubWFwKChvcHQ6IE9wdGlvbnNUeXBlKSA9PiBvcHQudmFsdWUpO1xyXG4gICAgICAgICAgdGhpcy5fc2VhcmNoUGFyYW1zW2tleV0gPVxyXG4gICAgICAgICAgICBjaGVja2VkVmFsdWVzLmxlbmd0aCA+IDAgPyBjaGVja2VkVmFsdWVzIDogZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9zZWFyY2hQYXJhbXNba2V5XSA9IGNvbHVtbi5maWVsZFByb3BzPy52YWx1ZSB8fCBkZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyDliJ3lp4vljJYgYXV0b0NvbXBsZXRlIOaVsOaNrua6kFxyXG4gICAgICAgIGlmIChjb2x1bW4udmFsdWVUeXBlID09PSBcImF1dG9Db21wbGV0ZVwiKSB7XHJcbiAgICAgICAgICB0aGlzLl9hdXRvQ29tcGxldGVEYXRhU291cmNlc1trZXldID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAvLyDmoLnmja7liJfnmoQgb3JkZXIg5a2X5q616L+b6KGM5o6S5bqP77yM5pyq6K6+572uIG9yZGVyIOeahOaUvuWcqOacgOWQjlxyXG4gICAgdGhpcy5fc2VhcmNoRmlsZWRDb2x1bW5zLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGFPcmRlciA9IGlzTmlsKGE/Lm9yZGVyKSA/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIDogYS5vcmRlcjtcclxuICAgICAgY29uc3QgYk9yZGVyID0gaXNOaWwoYj8ub3JkZXIpID8gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgOiBiLm9yZGVyO1xyXG4gICAgICBpZiAoYU9yZGVyID09PSBiT3JkZXIpIHJldHVybiAwO1xyXG4gICAgICByZXR1cm4gYU9yZGVyIC0gYk9yZGVyO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZXRTZWFyY2hGb3JtRGVmYXVsdFByb3AodGhpcy5fc2VhcmNoRmlsZWRDb2x1bW5zKTtcclxuXHJcbiAgICAvLyDlubblj5HliqDovb3miYDmnInpnIDopoHlvILmraXojrflj5bnmoTpgInpoblcclxuICAgIHRoaXMuc2V0U2VsZWN0UmVxdWVzdCh0aGlzLl9zZWFyY2hGaWxlZENvbHVtbnMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0NvbmZpZ3VyYWJsZUNvbHVtbihjb2w6IFByb1RhYmxlQ29sdW1uKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIWNvbC5hdXhpbGlhcnlDb2x1bW4gJiYgIWNvbC5oaWRlSW5UYWJsZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlVGFibGVDb2x1bW5zKGluamVjdENvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10pIHtcclxuICAgIC8vIOi/nOeoi+WIl+ebtOaOpeS9nOS4uuadpea6kO+8jOi/h+a7pOaOieacrOWcsOS4jeWtmOWcqOeahOWIl++8jOW5tuS7juacrOWcsOWIl+ihpeWFhea4suafk+mFjee9rlxyXG4gICAgY29uc3QgcmVtb3RlQ29sdW1ucyA9IGluamVjdENvbHVtbnNcclxuICAgICAgLmZpbHRlcigoaW5qZWN0Q29sKSA9PlxyXG4gICAgICAgIHRoaXMuY29sdW1ucy5zb21lKFxyXG4gICAgICAgICAgKGNvbCkgPT4gY29sLnByb3AgPT09IGluamVjdENvbC5wcm9wICYmIHRoaXMuaXNDb25maWd1cmFibGVDb2x1bW4oY29sKSxcclxuICAgICAgICApLFxyXG4gICAgICApXHJcbiAgICAgIC5tYXAoKGluamVjdENvbCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGxvY2FsQ29sID0gdGhpcy5jb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLnByb3AgPT09IGluamVjdENvbC5wcm9wKTtcclxuICAgICAgICByZXR1cm4geyAuLi5sb2NhbENvbCwgLi4uaW5qZWN0Q29sIH07XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIC8vIOi+heWKqeWIl+WPluiHquacrOWcsO+8jOS/neaMgeWcqOWOn+Wni+S9jee9ru+8iOmmlumDqCAvIOWwvumDqO+8iVxyXG4gICAgY29uc3QgZmlyc3ROb25BdXhJbmRleCA9IHRoaXMuY29sdW1ucy5maW5kSW5kZXgoXHJcbiAgICAgIChjKSA9PiAhYy5hdXhpbGlhcnlDb2x1bW4sXHJcbiAgICApO1xyXG4gICAgY29uc3QgbGFzdE5vbkF1eEluZGV4ID1cclxuICAgICAgdGhpcy5jb2x1bW5zLmxlbmd0aCAtXHJcbiAgICAgIDEgLVxyXG4gICAgICBbLi4udGhpcy5jb2x1bW5zXS5yZXZlcnNlKCkuZmluZEluZGV4KChjKSA9PiAhYy5hdXhpbGlhcnlDb2x1bW4pO1xyXG4gICAgY29uc3QgaGVhZEF1eGlsaWFyeSA9IHRoaXMuY29sdW1ucy5maWx0ZXIoXHJcbiAgICAgIChjb2wsIGkpID0+IGNvbC5hdXhpbGlhcnlDb2x1bW4gJiYgaSA8IGZpcnN0Tm9uQXV4SW5kZXgsXHJcbiAgICApO1xyXG4gICAgY29uc3QgdGFpbEF1eGlsaWFyeSA9IHRoaXMuY29sdW1ucy5maWx0ZXIoXHJcbiAgICAgIChjb2wsIGkpID0+IGNvbC5hdXhpbGlhcnlDb2x1bW4gJiYgaSA+IGxhc3ROb25BdXhJbmRleCxcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5mb3JtYXRlSW5uZXJDb2x1bW5zKFsuLi5oZWFkQXV4aWxpYXJ5LCAuLi5yZW1vdGVDb2x1bW5zLCAuLi50YWlsQXV4aWxpYXJ5XSk7XHJcbiAgfVxyXG5cclxuICAvLyDpgJrov4cgUHJveHkg55uR5ZCsIF9zZWFyY2hQYXJhbXMg55qE5bGe5oCn5Y+Y5pu0XHJcbiAgcHJpdmF0ZSBjcmVhdGVTZWFyY2hQYXJhbXNQcm94eSh0YXJnZXQ6IGFueSkge1xyXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICBjb25zdCBoYW5kbGVyOiBQcm94eUhhbmRsZXI8YW55PiA9IHtcclxuICAgICAgc2V0KG9iajogYW55LCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBTdHJpbmcocHJvcCk7XHJcbiAgICAgICAgY29uc3Qgb2xkVmFsID0gb2JqW2tleV07XHJcbiAgICAgICAgaWYgKG9sZFZhbCA9PT0gdmFsdWUpIHtcclxuICAgICAgICAgIG9ialtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgc2VsZi5vblZhbHVlc0NoYW5nZS5lbWl0KHtcclxuICAgICAgICAgICAga2V5LFxyXG4gICAgICAgICAgICB2YWx1ZSxcclxuICAgICAgICAgICAgcGFyYW1zOiBzZWxmLmdldFNlYXJjaFBhcmFtcygpLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge31cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgICByZXR1cm4gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyRW1wdHlTZWFyY2hQYXJhbXMoKSB7XHJcbiAgICBjb25zdCBjbG9uZVNlYXJjaFBhcmFtcyA9IGNsb25lRGVlcCh0aGlzLl9zZWFyY2hQYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNsb25lU2VhcmNoUGFyYW1zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZFNlcnZlclNvcnRQYXlsb2FkKCkge1xyXG4gICAgLy8g5p6E5bu65r+A5rS75o6S5bqP6ZuG5ZCI77yI5oyJ5LyY5YWI57qn5LuO5L2O5Yiw6auY77yM5pyr5bC+5LyY5YWI77yJXHJcbiAgICBjb25zdCBhY3RpdmVLZXlzID0gdGhpcy5fc29ydFByaW9yaXR5LmZpbHRlcigoaykgPT4gISF0aGlzLl9zb3J0TWFwW2tdKTtcclxuICAgIGlmIChhY3RpdmVLZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XHJcbiAgICBjb25zdCBzb3J0cyA9IGFjdGl2ZUtleXMubWFwKChmaWVsZCkgPT4ge1xyXG4gICAgICAvLyDmn6Xmib7lr7nlupTnmoTliJfphY3nva7vvIzkvJjlhYjkvb/nlKhzb3J0TmFtZeWtl+autVxyXG4gICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLl9jb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLnByb3AgPT09IGZpZWxkKTtcclxuICAgICAgY29uc3Qgc29ydEZpZWxkID0gY29sdW1uPy5zb3J0TmFtZSB8fCBmaWVsZDtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBmaWVsZDogc29ydEZpZWxkLFxyXG4gICAgICAgIG9yZGVyOiB0aGlzLl9zb3J0TWFwW2ZpZWxkXSEsXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICAgIGlmICh0aGlzLm11bHRpcGxlU29ydCkge1xyXG4gICAgICByZXR1cm4gc29ydHM7IC8vIOS7peaVsOe7hOW9ouW8j+aPkOS6pOWkmuWIl+aOkuW6j1xyXG4gICAgfVxyXG4gICAgY29uc3QgW2ZpcnN0XSA9IHNvcnRzO1xyXG4gICAgcmV0dXJuIGZpcnN0OyAvLyDlhbzlrrnljZXliJfnu5PmnoQgeyBmaWVsZCwgb3JkZXIgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzb3J0RGF0YVNvdXJjZUluUGxhY2UoKSB7XHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5kYXRhU291cmNlKSB8fCB0aGlzLmRhdGFTb3VyY2UubGVuZ3RoID09PSAwKSByZXR1cm47XHJcbiAgICBjb25zdCBhY3RpdmVLZXlzID0gdGhpcy5fc29ydFByaW9yaXR5LmZpbHRlcigoaykgPT4gISF0aGlzLl9zb3J0TWFwW2tdKTtcclxuICAgIGlmIChhY3RpdmVLZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgIC8vIOWkjeWItuS4gOS7veS8mOWFiOe6p++8jOS7juWJjeWIsOWQjuS8mOWFiOe6p+S7juS9juWIsOmrmO+8iOacgOWQjuiuvue9rueahOWtl+auteS8mOWFiO+8iVxyXG4gICAgY29uc3Qga2V5c0luUHJpb3JpdHkgPSBbLi4uYWN0aXZlS2V5c107XHJcbiAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcclxuICAgICAgZm9yIChsZXQgaSA9IGtleXNJblByaW9yaXR5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgY29uc3QgZmllbGQgPSBrZXlzSW5Qcmlvcml0eVtpXTtcclxuICAgICAgICBjb25zdCBvcmRlciA9IHRoaXMuX3NvcnRNYXBbZmllbGRdITtcclxuICAgICAgICBjb25zdCBhdiA9IGE/LltmaWVsZF07XHJcbiAgICAgICAgY29uc3QgYnYgPSBiPy5bZmllbGRdO1xyXG4gICAgICAgIGNvbnN0IGNtcCA9IHRoaXMuY29tcGFyZVZhbHVlcyhhdiwgYnYpO1xyXG4gICAgICAgIGlmIChjbXAgIT09IDApIHJldHVybiBvcmRlciA9PT0gXCJhc2NlbmRcIiA/IGNtcCA6IC1jbXA7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29tcGFyZVZhbHVlcyhhVmFsOiBhbnksIGJWYWw6IGFueSk6IG51bWJlciB7XHJcbiAgICBpZiAoYVZhbCA9PSBudWxsICYmIGJWYWwgPT0gbnVsbCkgcmV0dXJuIDA7XHJcbiAgICBpZiAoYVZhbCA9PSBudWxsKSByZXR1cm4gLTE7XHJcbiAgICBpZiAoYlZhbCA9PSBudWxsKSByZXR1cm4gMTtcclxuICAgIGlmIChhVmFsIGluc3RhbmNlb2YgRGF0ZSAmJiBiVmFsIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICByZXR1cm4gYVZhbC5nZXRUaW1lKCkgLSBiVmFsLmdldFRpbWUoKTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgYVZhbCA9PT0gXCJib29sZWFuXCIgJiYgdHlwZW9mIGJWYWwgPT09IFwiYm9vbGVhblwiKSB7XHJcbiAgICAgIHJldHVybiBhVmFsID09PSBiVmFsID8gMCA6IGFWYWwgPyAxIDogLTE7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIGFWYWwgPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIGJWYWwgPT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgcmV0dXJuIGFWYWwgLSBiVmFsO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBhVmFsID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiBiVmFsID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgIHJldHVybiBhVmFsLmxvY2FsZUNvbXBhcmUoYlZhbCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBhTnVtID0gTnVtYmVyKGFWYWwpO1xyXG4gICAgY29uc3QgYk51bSA9IE51bWJlcihiVmFsKTtcclxuICAgIGlmICghaXNOYU4oYU51bSkgJiYgIWlzTmFOKGJOdW0pKSByZXR1cm4gYU51bSAtIGJOdW07XHJcbiAgICByZXR1cm4gU3RyaW5nKGFWYWwpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKGJWYWwpKTtcclxuICB9XHJcblxyXG4gIC8vIOaJp+ihjCBhdXRvQ29tcGxldGUg5pWw5o2u5rqQ5p+l6K+i77yI5a6e6ZmF5omn6KGM6YC76L6R77yJXHJcbiAgcHJpdmF0ZSBleGVjdXRlQXV0b0NvbXBsZXRlRGF0YVNvdXJjZShldmVudDogRXZlbnQsIGNvbHVtbjogUHJvVGFibGVDb2x1bW4pIHtcclxuICAgIGNvbnN0IGZpZWxkS2V5ID0gY29sdW1uLmZpZWxkUHJvcHM/Lm5hbWUgfHwgY29sdW1uLnByb3A7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICAoY29sdW1uLmZpZWxkUHJvcHMgYXMgQXV0b0NvbXBsZXRlRmllbGRQcm9wcykuZGF0YVNvdXJjZSAmJlxyXG4gICAgICB0eXBlb2YgKGNvbHVtbi5maWVsZFByb3BzIGFzIEF1dG9Db21wbGV0ZUZpZWxkUHJvcHMpLmRhdGFTb3VyY2UgPT09XHJcbiAgICAgICAgXCJmdW5jdGlvblwiXHJcbiAgICApIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSAoY29sdW1uLmZpZWxkUHJvcHMgYXMgQXV0b0NvbXBsZXRlRmllbGRQcm9wcykuZGF0YVNvdXJjZShcclxuICAgICAgICAgIGV2ZW50LFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgLy8g5aaC5p6c6L+U5Zue55qE5pivIFByb21pc2XvvIzlpITnkIblvILmraXnu5PmnpxcclxuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xyXG4gICAgICAgICAgcmVzdWx0XHJcbiAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fYXV0b0NvbXBsZXRlRGF0YVNvdXJjZXNbZmllbGRLZXldID0gZGF0YSB8fCBbXTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJBdXRvQ29tcGxldGUgZGF0YVNvdXJjZSBlcnJvcjpcIiwgZXJyb3IpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX2F1dG9Db21wbGV0ZURhdGFTb3VyY2VzW2ZpZWxkS2V5XSA9IFtdO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8g5ZCM5q2l6L+U5Zue57uT5p6cXHJcbiAgICAgICAgICB0aGlzLl9hdXRvQ29tcGxldGVEYXRhU291cmNlc1tmaWVsZEtleV0gPSByZXN1bHQgfHwgW107XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJBdXRvQ29tcGxldGUgZGF0YVNvdXJjZSBlcnJvcjpcIiwgZXJyb3IpO1xyXG4gICAgICAgIHRoaXMuX2F1dG9Db21wbGV0ZURhdGFTb3VyY2VzW2ZpZWxkS2V5XSA9IFtdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0U2VhcmNoUGFyYW1zKG9wdGlvbnM/OiB7XHJcbiAgICB1c2VTYXZlZD86IGJvb2xlYW47IC8vIOS9v+eUqOacgOi/keS4gOasoeafpeivouaPkOS6pOeahOWPguaVsO+8jOm7mOiupOS4uiBmYWxzZe+8m2ZhbHNlIOS4uuW9k+WJjeihqOWNleWAvFxyXG4gIH0pOiBhbnkge1xyXG4gICAgY29uc3QgeyB1c2VTYXZlZCA9IGZhbHNlIH0gPSBvcHRpb25zIHx8IHt9O1xyXG4gICAgY29uc3QgcmF3UGFyYW1zID0gdXNlU2F2ZWQgPyB0aGlzLl9zYXZlZFNlYXJjaFBhcmFtcyA6IHRoaXMuX3NlYXJjaFBhcmFtcztcclxuICAgIGNvbnN0IHBhcmFtcyA9IGNsb25lRGVlcChyYXdQYXJhbXMgfHwge30pO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHBhcmFtcyxcclxuICAgICAgcGFnZUluZm86IHtcclxuICAgICAgICBwYWdlSW5kZXg6IHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCxcclxuICAgICAgICBwYWdlU2l6ZTogdGhpcy5fcGFnZUluZm8ucGFnZVNpemUsXHJcbiAgICAgIH0sXHJcbiAgICAgIC8vIOWcqOe6v+aOkuW6j+aooeW8j++8muaKiuaOkuW6j+WvueixoeaPkOS6pOe7meaOpeWPo1xyXG4gICAgICAuLi4odGhpcy5zb3J0TW9kZSA9PT0gXCJzZXJ2ZXJcIlxyXG4gICAgICAgID8geyBzb3J0OiB0aGlzLmJ1aWxkU2VydmVyU29ydFBheWxvYWQoKSB9XHJcbiAgICAgICAgOiB7fSksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbG9hZChhZnRlckRlbGV0ZT86IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuaGFuZGxlUXVlcnkoYWZ0ZXJEZWxldGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEZpZWxkc1ZhbHVlKGZpZWxkczogUmVjb3JkPHN0cmluZywgYW55Pikge1xyXG4gICAgT2JqZWN0LmtleXMoZmllbGRzKS5mb3JFYWNoKChrKSA9PiB7XHJcbiAgICAgIHRoaXMuX3NlYXJjaFBhcmFtc1trXSA9IGZpZWxkc1trXTsgLy8g5L+d55WZIFByb3h577yM6YCQ6aG56LWL5YC86Kem5Y+R5oum5oiqXHJcblxyXG4gICAgICAvLyBjaGVja2JveCDnsbvlnovpnIDopoHlkIzmraXmm7TmlrAgb3B0aW9ucyDnmoQgY2hlY2tlZCDnirbmgIHvvIzlkKbliJkgVUkg5LiN5Lya5ZON5bqUXHJcbiAgICAgIGNvbnN0IHRhcmdldENvbHVtbiA9IHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucy5maW5kKFxyXG4gICAgICAgIChpdGVtKSA9PiAoaXRlbS5maWVsZFByb3BzPy5uYW1lIHx8IGl0ZW0ucHJvcCkgPT09IGssXHJcbiAgICAgICk7XHJcbiAgICAgIGlmICh0YXJnZXRDb2x1bW4/LnZhbHVlVHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWVzOiBhbnlbXSA9IEFycmF5LmlzQXJyYXkoZmllbGRzW2tdKSA/IGZpZWxkc1trXSA6IFtdO1xyXG4gICAgICAgIGNvbnN0IHRhcmdldEZpZWxkUHJvcHMgPSB0YXJnZXRDb2x1bW4uZmllbGRQcm9wcyBhcyBDaGVja2JveEZpZWxkUHJvcHM7XHJcbiAgICAgICAgaWYgKHRhcmdldEZpZWxkUHJvcHM/Lm9wdGlvbnMpIHtcclxuICAgICAgICAgIHRhcmdldEZpZWxkUHJvcHMub3B0aW9ucyA9IHRhcmdldEZpZWxkUHJvcHMub3B0aW9ucy5tYXAoXHJcbiAgICAgICAgICAgIChpdGVtOiBPcHRpb25zVHlwZSkgPT4gKHtcclxuICAgICAgICAgICAgICAuLi5pdGVtLFxyXG4gICAgICAgICAgICAgIGNoZWNrZWQ6IHZhbHVlcy5pbmNsdWRlcyhpdGVtLnZhbHVlKSxcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RmllbGRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy5fc2VhcmNoUGFyYW1zW2tleV0gPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhclNlbGVjdGVkUm93KCkge1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2V0Q29sdW1ucyhcclxuICAgIGNvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10sXHJcbiAgICBvcHRpb25zPzoge1xyXG4gICAgICByZWxvYWQ/OiBib29sZWFuOyAvLyDmmK/lkKbph43mlrDliqDovb3mlbDmja7vvIzpu5jorqTkuLogZmFsc2VcclxuICAgIH0sXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyDmm7TmlrAgY29sdW1ucyDovpPlhaXlsZ7mgKdcclxuICAgIHRoaXMuY29sdW1ucyA9IGNsb25lRGVlcChjb2x1bW5zKTtcclxuXHJcbiAgICAvLyDph43mlrDmoLzlvI/ljJblhoXpg6jliJdcclxuICAgIHRoaXMuZm9ybWF0ZUlubmVyQ29sdW1ucyh0aGlzLmNvbHVtbnMpO1xyXG5cclxuICAgIC8vIOmHjeaWsOiuvue9ruaQnOe0ouWPguaVsO+8iOW8guatpeaTjeS9nO+8iVxyXG4gICAgLy8g5YWI5riF56m65pen55qE5pCc57Si5Y+C5pWw77yM6YG/5YWN5pen5pWw5o2u5q6L55WZXHJcbiAgICB0aGlzLl9zZWFyY2hQYXJhbXMgPSB7fTtcclxuICAgIGF3YWl0IHRoaXMuc2V0U2VhcmNoUGFyYW1zKHRoaXMuY29sdW1ucyk7XHJcblxyXG4gICAgLy8g6YeN5paw5Yib5bu6IFByb3h577yM56Gu5L+d6KGo5Y2V6aG55YC85Y+Y5YyW6IO95q2j5bi46Kem5Y+R5LqL5Lu2XHJcbiAgICB0aGlzLl9zZWFyY2hQYXJhbXMgPSB0aGlzLmNyZWF0ZVNlYXJjaFBhcmFtc1Byb3h5KHRoaXMuX3NlYXJjaFBhcmFtcyk7XHJcblxyXG4gICAgLy8g6YeN5paw5rOo5YaM5qih5p2/77yI5aaC5p6c57uE5Lu25bey57uP5Yid5aeL5YyW5a6M5oiQ77yJXHJcbiAgICBpZiAodGhpcy5hbGxUZW1wbGF0ZXMpIHtcclxuICAgICAgdGhpcy5hdXRvUmVnaXN0ZXJUZW1wbGF0ZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDlpoLmnpzorr7nva7kuoYgcmVsb2FkIOmAiemhueS4uiB0cnVl77yM5YiZ6YeN5paw5p+l6K+i5pWw5o2uXHJcbiAgICBpZiAob3B0aW9ucz8ucmVsb2FkID09PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlUXVlcnkoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVtaXRDb2x1bW5zQ2hhbmdlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRSb3dEYXRhPFQgPSBhbnk+KCk6IFQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkVGFibGVSb3c7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q2hlY2tlZFJvd3M8VCA9IGFueT4oKTogVFtdIHtcclxuICAgIGlmICghdGhpcy5zaG93Q2hlY2tib3gpIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgLy8g6L+U5Zue5b2T5YmN5pWw5o2u5rqQ5Lit5omA5pyJIGNoZWNrZWQg5Li6IHRydWUg55qE6aG5XHJcbiAgICAvLyDms6jmhI/vvJrlpoLmnpzpnIDopoHojrflj5bmiYDmnInpobXnmoTpgInkuK3pobnvvIzpnIDopoHpgY3ljobmiYDmnInmlbDmja7mupDmiJbkvb/nlKggX3NlbGVjdGVkUm93SWRzXHJcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmZpbHRlcigocm93KSA9PiByb3cuY2hlY2tlZCA9PT0gdHJ1ZSkgYXMgVFtdO1xyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+W5oyH5a6a5ZCN56ew55qE5qih5p2/XHJcbiAgZ2V0VGVtcGxhdGUobmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwge1xyXG4gICAgaWYgKCFuYW1lKSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB0aGlzLmN1c3RvbVRlbXBsYXRlcy5nZXQobmFtZSkgfHwgbnVsbDtcclxuICB9XHJcblxyXG4gIGdldFRvb2xUaXBUZXh0VmFsdWUoY29sdW1uOiBQcm9UYWJsZUNvbHVtbiwgZGF0YTogYW55KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGtleSA9XHJcbiAgICAgIGNvbHVtbi5jdXN0b21SZW5kZXIgJiYgdGhpcy5nZXRUZW1wbGF0ZShjb2x1bW4uY3VzdG9tUmVuZGVyKVxyXG4gICAgICAgID8gXCJcIlxyXG4gICAgICAgIDogY29sdW1uLmVsbGlwc2lzXHJcbiAgICAgICAgICA/IGNvbHVtbi5wcm9wXHJcbiAgICAgICAgICA6IFwiXCI7XHJcbiAgICByZXR1cm4gIWtleSA/IFwiXCIgOiBkYXRhW2tleV07XHJcbiAgfVxyXG5cclxuICBnZXRUYWJsZVJvd0NoZWNrZWQoZGF0YTogYW55KSB7XHJcbiAgICAvLyDlkK/nlKjlpI3pgInmoYbml7bvvJrooYzpq5jkuq7lupTkuI7lpI3pgInmoYbpgInkuK3nirbmgIHkuIDoh7TvvIjmlK/mjIHlpJrpgInvvIlcclxuICAgIGlmICh0aGlzLnNob3dDaGVja2JveCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5pc1Jvd0NoZWNrZWQoZGF0YSk7XHJcbiAgICB9XHJcbiAgICAvLyDmnKrlkK/nlKjlpI3pgInmoYbml7bvvJrku43nhLbkvb/nlKjljZXpgInooYzpq5jkuq5cclxuICAgIGlmICghdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdykgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuX3NlbGVjdGVkVGFibGVSb3cpID09PSBKU09OLnN0cmluZ2lmeShkYXRhKTtcclxuICB9XHJcblxyXG4gIC8vIOajgOafpeihjOaYr+WQpuiiq+emgeeUqFxyXG4gIGlzUm93RGlzYWJsZWQoZGF0YTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuc2hvd0NoZWNrYm94KSByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gdGhpcy5yb3dEaXNhYmxlZCA/IHRoaXMucm93RGlzYWJsZWQoZGF0YSkgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIOajgOafpeihjOaYr+WQpuiiq+WkjemAieahhumAieS4re+8iOaVsOaNrumpseWKqOaooeW8j++8iVxyXG4gIGlzUm93Q2hlY2tlZChkYXRhOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5zaG93Q2hlY2tib3gpIHJldHVybiBmYWxzZTtcclxuICAgIC8vIOebtOaOpeivu+WPluaVsOaNruWvueixoeeahCBjaGVja2VkIOWxnuaAp1xyXG4gICAgcmV0dXJuIGRhdGEuY2hlY2tlZCA9PT0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vIOWIh+aNouihjOeahOmAieS4reeKtuaAge+8iOaVsOaNrumpseWKqOaooeW8j++8jOS/neeVmeeUqOS6juWFvOWuue+8iVxyXG4gIHRvZ2dsZVJvd0NoZWNrZWQoZGF0YTogYW55LCBjaGVja2VkOiBib29sZWFuLCBldmVudD86IEV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIOmYu+atouS6i+S7tuWGkuazoe+8jOmBv+WFjeinpuWPkeihjOeCueWHu1xyXG4gICAgfVxyXG4gICAgLy8g5aaC5p6c6KGM6KKr56aB55So77yM5LiN5YWB6K645YiH5o2i6YCJ5Lit54q25oCBXHJcbiAgICBpZiAodGhpcy5pc1Jvd0Rpc2FibGVkKGRhdGEpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyDnm7TmjqXorr7nva7mlbDmja7lr7nosaHnmoQgY2hlY2tlZCDlsZ7mgKdcclxuICAgIGRhdGEuY2hlY2tlZCA9IGNoZWNrZWQ7XHJcblxyXG4gICAgLy8g5ZCM5q2l5pu05pawIF9zZWxlY3RlZFJvd3PvvIjnlKjkuo7lhbzlrrnmgKfvvIlcclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fc2VsZWN0ZWRSb3dzLmZpbmRJbmRleCgocm93KSA9PlxyXG4gICAgICB0aGlzLmlzU2FtZVJvdyhyb3csIGRhdGEpLFxyXG4gICAgKTtcclxuICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd3MucHVzaChkYXRhKTtcclxuICAgICAgfVxyXG4gICAgICAvLyDli77pgInlpI3pgInmoYbml7blkIzmraXorr7nva7pq5jkuq7pgInkuK3ooYxcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IGRhdGE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUm93cy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIOiLpeW9k+WJjemrmOS6ruihjOS4uuivpeihjO+8jOWImeWPlua2iOmrmOS6rlxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyAmJlxyXG4gICAgICAgIHRoaXMuaXNTYW1lUm93KHRoaXMuX3NlbGVjdGVkVGFibGVSb3csIGRhdGEpXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVDaGVja0FsbFN0YXR1cygpO1xyXG4gIH1cclxuXHJcbiAgLy8g5pu05paw5YWo6YCJ54q25oCB77yI5pWw5o2u6amx5Yqo5qih5byP77yJXHJcbiAgdXBkYXRlQ2hlY2tBbGxTdGF0dXMoKSB7XHJcbiAgICBpZiAoIXRoaXMuc2hvd0NoZWNrYm94IHx8ICFBcnJheS5pc0FycmF5KHRoaXMuZGF0YVNvdXJjZSkpIHtcclxuICAgICAgdGhpcy5fY2hlY2tlZEFsbCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9pbmRldGVybWluYXRlID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIOWPquiuoeeul+WPr+eUqOeahOihjO+8iOacquemgeeUqOeahOihjO+8iVxyXG4gICAgY29uc3QgYXZhaWxhYmxlUm93cyA9IHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIoXHJcbiAgICAgIChyb3cpID0+ICF0aGlzLmlzUm93RGlzYWJsZWQocm93KSxcclxuICAgICk7XHJcbiAgICAvLyDln7rkuo7mlbDmja7lr7nosaHnmoQgY2hlY2tlZCDlsZ7mgKforqHnrpdcclxuICAgIGNvbnN0IGNoZWNrZWRDb3VudCA9IGF2YWlsYWJsZVJvd3MuZmlsdGVyKFxyXG4gICAgICAocm93KSA9PiByb3cuY2hlY2tlZCA9PT0gdHJ1ZSxcclxuICAgICkubGVuZ3RoO1xyXG4gICAgY29uc3QgdG90YWxDb3VudCA9IGF2YWlsYWJsZVJvd3MubGVuZ3RoO1xyXG4gICAgdGhpcy5fY2hlY2tlZEFsbCA9XHJcbiAgICAgIHRvdGFsQ291bnQgPiAwICYmIGNoZWNrZWRDb3VudCA+IDAgJiYgY2hlY2tlZENvdW50ID09PSB0b3RhbENvdW50O1xyXG4gICAgdGhpcy5faW5kZXRlcm1pbmF0ZSA9IGNoZWNrZWRDb3VudCA+IDAgJiYgY2hlY2tlZENvdW50IDwgdG90YWxDb3VudDtcclxuICB9XHJcblxyXG4gIC8vIOWFqOmAiS/lj5bmtojlhajpgInvvIjmlbDmja7pqbHliqjmqKHlvI/vvIlcclxuICB0b2dnbGVDaGVja0FsbChjaGVja2VkOiBib29sZWFuLCBldmVudD86IEV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5Y+q5aSE55CG5Y+v55So55qE6KGM77yI5pyq56aB55So55qE6KGM77yJXHJcbiAgICBjb25zdCBhdmFpbGFibGVSb3dzID0gdGhpcy5kYXRhU291cmNlLmZpbHRlcihcclxuICAgICAgKHJvdykgPT4gIXRoaXMuaXNSb3dEaXNhYmxlZChyb3cpLFxyXG4gICAgKTtcclxuXHJcbiAgICAvLyDmibnph4/orr7nva4gY2hlY2tlZCDlsZ7mgKdcclxuICAgIGF2YWlsYWJsZVJvd3MuZm9yRWFjaCgocm93KSA9PiB7XHJcbiAgICAgIHJvdy5jaGVja2VkID0gY2hlY2tlZDtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIOWQjOatpeabtOaWsCBfc2VsZWN0ZWRSb3dz77yI55So5LqO5YW85a655oCn77yJXHJcbiAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZFJvd3MgPSBbLi4uYXZhaWxhYmxlUm93c107XHJcbiAgICAgIC8vIOWQjOatpeiuvue9rumrmOS6rumAieS4reihjOS4uuesrOS4gOadoeWPr+mAieaVsOaNrlxyXG4gICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID1cclxuICAgICAgICBhdmFpbGFibGVSb3dzLmxlbmd0aCA+IDAgPyBhdmFpbGFibGVSb3dzWzBdIDogbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkUm93cyA9IFtdO1xyXG4gICAgICAvLyDlj5bmtojpq5jkuq5cclxuICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVDaGVja0FsbFN0YXR1cygpO1xyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+W6YCJ5Lit55qE6KGM5pWw5o2u77yI5L+d55WZ55So5LqO5YW85a655oCn77yJXHJcbiAgZ2V0U2VsZWN0ZWRSb3dzKCk6IGFueVtdIHtcclxuICAgIHJldHVybiB0aGlzLmdldENoZWNrZWRSb3dzKCk7XHJcbiAgfVxyXG5cclxuICAvLyDlpITnkIbooYwgY2hlY2tib3gg5Y+Y5YyW5LqL5Lu277yI5pWw5o2u6amx5Yqo5qih5byP77yJXHJcbiAgaGFuZGxlUm93Q2hlY2tlZENoYW5nZShkYXRhOiBhbnksIGNoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzUm93RGlzYWJsZWQoZGF0YSkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOaVsOaNruWvueixoeeahCBjaGVja2VkIOWxnuaAp+W3sue7j+mAmui/h+WPjOWQkee7keWumuiHquWKqOabtOaWsFxyXG4gICAgLy8g6L+Z6YeM5Y+q6ZyA6KaB5ZCM5q2l5pu05pawIF9zZWxlY3RlZFJvd3NcclxuXHJcbiAgICAvLyDlkIzmraXmm7TmlrAgX3NlbGVjdGVkUm93c++8iOeUqOS6juWFvOWuueaAp++8iVxyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9zZWxlY3RlZFJvd3MuZmluZEluZGV4KChyb3cpID0+XHJcbiAgICAgIHRoaXMuaXNTYW1lUm93KHJvdywgZGF0YSksXHJcbiAgICApO1xyXG4gICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUm93cy5wdXNoKGRhdGEpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIOWLvumAieWkjemAieahhuaXtuWQjOatpeiuvue9rumrmOS6rumAieS4reihjFxyXG4gICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gZGF0YTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8g6Iul5b2T5YmN6auY5Lqu6KGM5Li66K+l6KGM77yM5YiZ5Y+W5raI6auY5LquXHJcbiAgICAgIGlmIChcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ICYmXHJcbiAgICAgICAgdGhpcy5pc1NhbWVSb3codGhpcy5fc2VsZWN0ZWRUYWJsZVJvdywgZGF0YSlcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyDmm7TmlrDlhajpgInnirbmgIFcclxuICAgIHRoaXMudXBkYXRlQ2hlY2tBbGxTdGF0dXMoKTtcclxuICB9XHJcblxyXG4gIC8vIOWIt+aWsOWFqOmAieeKtuaAge+8iOeUqOS6juWFtuS7luWcuuaZr++8iVxyXG4gIHJlZnJlc2hDaGVja0FsbFN0YXR1cygpOiB2b2lkIHtcclxuICAgIHRoaXMudXBkYXRlQ2hlY2tBbGxTdGF0dXMoKTtcclxuICB9XHJcblxyXG4gIC8vIOiOt+WPluihjOeahOWUr+S4gOagh+ivhu+8iOeUqOS6jui3qOmhtemAieS4re+8iVxyXG4gIHByaXZhdGUgZ2V0Um93SWQoZGF0YTogYW55KTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiBkYXRhLmlkID8/IGRhdGEua2V5ID8/IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIC8vIOWIpOaWreS4pOihjOaYr+WQpuS4uuWQjOS4gOihjFxyXG4gIHByaXZhdGUgaXNTYW1lUm93KHJvdzE6IGFueSwgcm93MjogYW55KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBpZDEgPSB0aGlzLmdldFJvd0lkKHJvdzEpO1xyXG4gICAgY29uc3QgaWQyID0gdGhpcy5nZXRSb3dJZChyb3cyKTtcclxuXHJcbiAgICBpZiAoaWQxICE9PSB1bmRlZmluZWQgJiYgaWQyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIGlkMSA9PT0gaWQyO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGZhbGxiYWNrIOWIsCBKU09OIOavlOi+g1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJvdzEpID09PSBKU09OLnN0cmluZ2lmeShyb3cyKTtcclxuICB9XHJcblxyXG4gIC8vIOa4heepuumAieS4reeahOihjO+8iOaVsOaNrumpseWKqOaooeW8j++8iVxyXG4gIGNsZWFyU2VsZWN0ZWRSb3dzKCkge1xyXG4gICAgLy8g5riF56m65b2T5YmN5pWw5o2u5rqQ5Lit5omA5pyJ6aG555qEIGNoZWNrZWQg54q25oCBXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmRhdGFTb3VyY2UpKSB7XHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5mb3JFYWNoKChyb3cpID0+IHtcclxuICAgICAgICByb3cuY2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9zZWxlY3RlZFJvd3MgPSBbXTtcclxuICAgIHRoaXMuX2NoZWNrZWRBbGwgPSBmYWxzZTtcclxuICAgIHRoaXMuX2luZGV0ZXJtaW5hdGUgPSBmYWxzZTtcclxuICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlRmllbGRDaGVja0JveENoYW5nZShjaGVja0JveE9wdGlvbnM6IE9wdGlvbnNUeXBlW10sIGtleTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNldEZpZWxkc1ZhbHVlKHtcclxuICAgICAgW2tleV06IGNoZWNrQm94T3B0aW9uc1xyXG4gICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uY2hlY2tlZClcclxuICAgICAgICAubWFwKChpdGVtKSA9PiBpdGVtLnZhbHVlKSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlU2VhcmNoKCkge1xyXG4gICAgdGhpcy5fc2F2ZWRTZWFyY2hQYXJhbXMgPSB0aGlzLmNsZWFyRW1wdHlTZWFyY2hQYXJhbXMoKTtcclxuICAgIHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCA9IDE7XHJcbiAgICB0aGlzLmhhbmRsZVF1ZXJ5KCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVSZXNldEZvcm0oKSB7XHJcbiAgICBPYmplY3Qua2V5cyh0aGlzLl9zZWFyY2hQYXJhbXMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICBjb25zdCB0YXJnZXRDb2x1bW4gPSB0aGlzLl9zZWFyY2hGaWxlZENvbHVtbnMuZmluZCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIHJldHVybiAoaXRlbS5maWVsZFByb3BzPy5uYW1lIHx8IGl0ZW0ucHJvcCkgPT09IGtleTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyDlr7nkuo5jaGVja2JveOexu+Wei++8jOmcgOimgeeJueauiuWkhOeQhum7mOiupOWAvFxyXG4gICAgICBpZiAodGFyZ2V0Q29sdW1uPy52YWx1ZVR5cGUgPT09IFwiY2hlY2tib3hcIikge1xyXG4gICAgICAgIC8vIOS7juWOn+Wni2NvbHVtbnPphY3nva7kuK3ojrflj5bliJ3lp4vphY3nva7vvIzku6Xnoa7kv53kvb/nlKjmraPnoa7nmoTpu5jorqTlgLxcclxuICAgICAgICBjb25zdCBvcmlnaW5hbENvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gKGl0ZW0uZmllbGRQcm9wcz8ubmFtZSB8fCBpdGVtLnByb3ApID09PSBrZXk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIOS7juWOn+Wni29wdGlvbnPkuK3mib7lh7pjaGVja2Vk5Li6dHJ1ZeeahOmhueS9nOS4uum7mOiupOWAvFxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsRmllbGRQcm9wcyA9IG9yaWdpbmFsQ29sdW1uPy5maWVsZFByb3BzIGFzXHJcbiAgICAgICAgICB8IENoZWNrYm94RmllbGRQcm9wc1xyXG4gICAgICAgICAgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgY29uc3QgY2hlY2tlZFZhbHVlcyA9IChvcmlnaW5hbEZpZWxkUHJvcHM/Lm9wdGlvbnMgfHwgW10pXHJcbiAgICAgICAgICAuZmlsdGVyKChvcHQ6IE9wdGlvbnNUeXBlKSA9PiBvcHQuY2hlY2tlZClcclxuICAgICAgICAgIC5tYXAoKG9wdDogT3B0aW9uc1R5cGUpID0+IG9wdC52YWx1ZSk7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID1cclxuICAgICAgICAgIGNoZWNrZWRWYWx1ZXMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICA/IGNoZWNrZWRWYWx1ZXNcclxuICAgICAgICAgICAgOiBQUk9fVEFCTEVfREVGQVVMVF9QUk9QU1t0YXJnZXRDb2x1bW4udmFsdWVUeXBlXS52YWx1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2VhcmNoUGFyYW1zW2tleV0gPSBkZWZhdWx0VmFsdWU7XHJcblxyXG4gICAgICAgIC8vIOagueaNrum7mOiupOWAvOaBouWkjW9wdGlvbnPnmoRjaGVja2Vk54q25oCB77yM5L2/55So5Y6f5aeLb3B0aW9uc+eahOe7k+aehFxyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZXMgPSBBcnJheS5pc0FycmF5KGRlZmF1bHRWYWx1ZSkgPyBkZWZhdWx0VmFsdWUgOiBbXTtcclxuICAgICAgICBjb25zdCBvcmlnaW5hbE9wdGlvbnMgPSBvcmlnaW5hbEZpZWxkUHJvcHM/Lm9wdGlvbnMgfHwgW107XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0RmllbGRQcm9wcyA9IHRhcmdldENvbHVtbi5maWVsZFByb3BzIGFzIENoZWNrYm94RmllbGRQcm9wcztcclxuICAgICAgICB0YXJnZXRGaWVsZFByb3BzLm9wdGlvbnMgPSBvcmlnaW5hbE9wdGlvbnMubWFwKChpdGVtOiBPcHRpb25zVHlwZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgICAgY2hlY2tlZDogZGVmYXVsdFZhbHVlcy5pbmNsdWRlcyhpdGVtLnZhbHVlKSxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fc2VhcmNoUGFyYW1zW2tleV0gPSB0YXJnZXRDb2x1bW4/LmZpZWxkUHJvcHNcclxuICAgICAgICAgID8gdGFyZ2V0Q29sdW1uPy5maWVsZFByb3BzLnZhbHVlIHx8XHJcbiAgICAgICAgICAgIFBST19UQUJMRV9ERUZBVUxUX1BST1BTW3RhcmdldENvbHVtbi52YWx1ZVR5cGVdLnZhbHVlXHJcbiAgICAgICAgICA6IFBST19UQUJMRV9ERUZBVUxUX1BST1BTW3RhcmdldENvbHVtbi52YWx1ZVR5cGVdLnZhbHVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLl9zYXZlZFNlYXJjaFBhcmFtcyA9IHt9O1xyXG4gICAgdGhpcy5fcGFnZUluZm8ucGFnZUluZGV4ID0gMTtcclxuICAgIHRoaXMub25SZXNldEZvcm1CZWZvcmVSZWxvYWQuZW1pdCgpO1xyXG4gICAgdGhpcy5oYW5kbGVRdWVyeSgpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlUGFnZUluZGV4Q2hhbmdlKHBhZ2VJbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXggPSBwYWdlSW5kZXg7XHJcbiAgICB0aGlzLmhhbmRsZVF1ZXJ5KCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVQYWdlU2l6ZUNoYW5nZShwYWdlU2l6ZTogYW55KSB7XHJcbiAgICB0aGlzLl9wYWdlSW5mby5wYWdlU2l6ZSA9IHBhZ2VTaXplO1xyXG4gICAgdGhpcy5fcGFnZUluZm8ucGFnZUluZGV4ID0gMTtcclxuICAgIHRoaXMuaGFuZGxlUXVlcnkoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGhhbmRsZVF1ZXJ5KGFmdGVyRGVsZXRlPzogYm9vbGVhbikge1xyXG4gICAgLy8g5Yig6Zmk5ZCO5Yi35paw5LiU5b2T5YmN6aG15LuF5Ymp5LiA5p2h6K6w5b2V5pe277yM6Iul5LiN5Zyo56ys5LiA6aG15YiZ5YWI5Zue6YCA5LiA6aG1XHJcbiAgICBpZiAoXHJcbiAgICAgIGFmdGVyRGVsZXRlICYmXHJcbiAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5kYXRhU291cmNlKSAmJlxyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UubGVuZ3RoID09PSAxICYmXHJcbiAgICAgIHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCA+IDFcclxuICAgICkge1xyXG4gICAgICB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXggPSB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXggLSAxO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2xvYWRpbmcgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMucmVxdWVzdCkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVxdWVzdCh7XHJcbiAgICAgICAgICBwYXJhbXM6IHRoaXMuY2xlYXJFbXB0eVNlYXJjaFBhcmFtcygpLFxyXG4gICAgICAgICAgcGFnZUluZm86IHtcclxuICAgICAgICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXgsXHJcbiAgICAgICAgICAgIHBhZ2VTaXplOiB0aGlzLl9wYWdlSW5mby5wYWdlU2l6ZSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAvLyDlnKjnur/mjpLluo/mqKHlvI/vvJrmiormjpLluo/lr7nosaHmj5DkuqTnu5nmjqXlj6NcclxuICAgICAgICAgIC4uLih0aGlzLnNvcnRNb2RlID09PSBcInNlcnZlclwiXHJcbiAgICAgICAgICAgID8geyBzb3J0OiB0aGlzLmJ1aWxkU2VydmVyU29ydFBheWxvYWQoKSB9XHJcbiAgICAgICAgICAgIDoge30pLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyDmn6Xor6LlkI7pu5jorqTkuI3kv53nlZnot6jpobXpgInkuK3nirbmgIHvvJrmr4/mrKHov5Tlm57nmoTmlbDmja7lnYfliJ3lp4vljJbkuLrmnKrpgInkuK1cclxuICAgICAgICBpZiAodGhpcy5zaG93Q2hlY2tib3gpIHtcclxuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IChyZXN1bHQuZGF0YSB8fCBbXSkubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgICAgICBjaGVja2VkOiBmYWxzZSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSByZXN1bHQuZGF0YSB8fCBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc3VtbWFyeURhdGEgPSByZXN1bHQuc3VtbWFyeURhdGEgfHwgbnVsbDtcclxuICAgICAgICAvLyDmnKzlnLDmjpLluo/mqKHlvI/vvJrmi7/liLDmlbDmja7lkI7lnKjliY3nq6/mjpLluo9cclxuICAgICAgICBpZiAodGhpcy5zb3J0TW9kZSA9PT0gXCJsb2NhbFwiKSB7XHJcbiAgICAgICAgICB0aGlzLnNvcnREYXRhU291cmNlSW5QbGFjZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9wYWdlSW5mby50b3RhbCA9IHJlc3VsdC50b3RhbCB8fCAwO1xyXG4gICAgICAgIC8vIOWPlua2iOi3qOmhteWkmumAie+8muafpeivouWQjua4heepuumAieS4reeKtuaAgVxyXG4gICAgICAgIGlmICh0aGlzLnNob3dDaGVja2JveCkge1xyXG4gICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGVkUm93cygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwi5p+l6K+i5aSx6LSlOlwiLCBlcnJvcik7XHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gW107XHJcbiAgICAgICAgdGhpcy5fcGFnZUluZm8udG90YWwgPSAwO1xyXG4gICAgICAgIHRoaXMuc3VtbWFyeURhdGEgPSBudWxsO1xyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIHRoaXMuX2xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKFwi5pyq5o+Q5L6bIF9yZXF1ZXN0IOWbnuiwg+WHveaVsFwiKTtcclxuICAgICAgdGhpcy5fbG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g6Kem5Y+R5YiX5o6S5bqP5Y+Y5pu0XHJcbiAgb25Tb3J0Q2hhbmdlKHNvcnRLZXk6IHN0cmluZywgc29ydE9yZGVyOiBcImFzY2VuZFwiIHwgXCJkZXNjZW5kXCIgfCBudWxsKSB7XHJcbiAgICAvLyDljZXliJfmjpLluo/vvJrph43nva7lhbblroPliJfvvJvlpJrliJfmjpLluo/vvJrkv53nlZnlhbblroPliJdcclxuICAgIGlmICghdGhpcy5tdWx0aXBsZVNvcnQpIHtcclxuICAgICAgT2JqZWN0LmtleXModGhpcy5fc29ydE1hcCkuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgaWYgKGtleSAhPT0gc29ydEtleSkgdGhpcy5fc29ydE1hcFtrZXldID0gbnVsbDtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9zb3J0TWFwW3NvcnRLZXldID0gc29ydE9yZGVyO1xyXG5cclxuICAgIC8vIOe7tOaKpOS8mOWFiOe6p+mYn+WIl++8muacieW6j+WIl+S4lOmdnuepuiAtPiDnva7kuo7mnKvlsL7vvJvkuLrnqbogLT4g56e76ZmkXHJcbiAgICB0aGlzLl9zb3J0UHJpb3JpdHkgPSB0aGlzLl9zb3J0UHJpb3JpdHkuZmlsdGVyKChrKSA9PiBrICE9PSBzb3J0S2V5KTtcclxuICAgIGlmIChzb3J0T3JkZXIpIHtcclxuICAgICAgdGhpcy5fc29ydFByaW9yaXR5LnB1c2goc29ydEtleSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc29ydE1vZGUgPT09IFwibG9jYWxcIikge1xyXG4gICAgICB0aGlzLnNvcnREYXRhU291cmNlSW5QbGFjZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8g5Zyo57q/5o6S5bqP77ya6YeN5paw6K+35rGCXHJcbiAgICAgIHRoaXMuaGFuZGxlUXVlcnkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFNvcnRPcmRlcihzb3J0S2V5OiBzdHJpbmcpOiBcImFzY2VuZFwiIHwgXCJkZXNjZW5kXCIgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9zb3J0TWFwW3NvcnRLZXldIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVUYWJsZVJvd0NsaWNrKGRhdGE6IGFueSkge1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IGRhdGE7XHJcbiAgICBpZiAodGhpcy5zaG93Q2hlY2tib3ggJiYgIXRoaXMuaXNSb3dEaXNhYmxlZChkYXRhKSkge1xyXG4gICAgICAvLyDlhYjmuIXnqbrmiYDmnInpgInkuK3ooYxcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzID0gW107XHJcbiAgICAgIGNvbnN0IG5leHRDaGVja2VkID0gIXRoaXMuaXNSb3dDaGVja2VkKGRhdGEpO1xyXG4gICAgICB0aGlzLnRvZ2dsZVJvd0NoZWNrZWQoZGF0YSwgbmV4dENoZWNrZWQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vblJvd0NsaWNrLmVtaXQodGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVUYWJsZVJvd0RiQ2xpY2soZGF0YTogYW55KSB7XHJcbiAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gZGF0YTtcclxuICAgIHRoaXMub25Sb3dEYkNsaWNrLmVtaXQodGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBoYW5kbGVDb2x1bW5zU2V0dGluZ0NvbmZpcm0oXHJcbiAgICBzZWxlY3RlZENvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10sXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy50YWJsZU5hbWUgJiYgdGhpcy5jb2x1bW5SZW1vdGUpIHtcclxuICAgICAgYXdhaXQgdGhpcy5xdWVyeUR5bmFtaWNDb2x1bW5zKCk7XHJcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkQ29sdW1ucz8ubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlVGFibGVDb2x1bW5zKHNlbGVjdGVkQ29sdW1ucyk7XHJcbiAgICAgIHRoaXMuZW1pdENvbHVtbnNDaGFuZ2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOWkhOeQhiBhdXRvQ29tcGxldGUg6L6T5YWl5LqL5Lu277yI5bim6Ziy5oqW77yJXHJcbiAgaGFuZGxlQXV0b0NvbXBsZXRlSW5wdXQoZXZlbnQ6IEV2ZW50LCBjb2x1bW46IFByb1RhYmxlQ29sdW1uKSB7XHJcbiAgICBjb25zdCBmaWVsZEtleSA9IGNvbHVtbi5maWVsZFByb3BzPy5uYW1lIHx8IGNvbHVtbi5wcm9wO1xyXG5cclxuICAgIC8vIOWmguaenOivpeWtl+autei/mOayoeaciemYsuaKluWHveaVsO+8jOWIm+W7uuS4gOS4qlxyXG4gICAgaWYgKCF0aGlzLl9hdXRvQ29tcGxldGVEZWJvdW5jZU1hcC5oYXMoZmllbGRLZXkpKSB7XHJcbiAgICAgIGNvbnN0IGRlYm91bmNlZEZuID0gZGVib3VuY2UoKGV2dDogRXZlbnQpID0+IHtcclxuICAgICAgICAvLyDph43mlrDmn6Xmib7lr7nlupTnmoQgY29sdW1u77yM56Gu5L+d5L2/55So5pyA5paw55qE6YWN572uXHJcbiAgICAgICAgY29uc3QgY3VycmVudENvbHVtbiA9IHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucy5maW5kKFxyXG4gICAgICAgICAgKGNvbCkgPT4gKGNvbC5maWVsZFByb3BzPy5uYW1lIHx8IGNvbC5wcm9wKSA9PT0gZmllbGRLZXksXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoY3VycmVudENvbHVtbikge1xyXG4gICAgICAgICAgdGhpcy5leGVjdXRlQXV0b0NvbXBsZXRlRGF0YVNvdXJjZShldnQsIGN1cnJlbnRDb2x1bW4pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgMzAwKTsgLy8gMzAwbXMg6Ziy5oqW5bu26L+fXHJcbiAgICAgIHRoaXMuX2F1dG9Db21wbGV0ZURlYm91bmNlTWFwLnNldChmaWVsZEtleSwgZGVib3VuY2VkRm4pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOiwg+eUqOmYsuaKluWHveaVsFxyXG4gICAgY29uc3QgZGVib3VuY2VkRm4gPSB0aGlzLl9hdXRvQ29tcGxldGVEZWJvdW5jZU1hcC5nZXQoZmllbGRLZXkpO1xyXG4gICAgaWYgKGRlYm91bmNlZEZuKSB7XHJcbiAgICAgIGRlYm91bmNlZEZuKGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOiOt+WPliBhdXRvQ29tcGxldGUg55qE5pWw5o2u5rqQXHJcbiAgZ2V0QXV0b0NvbXBsZXRlRGF0YVNvdXJjZShjb2x1bW46IFByb1RhYmxlQ29sdW1uKTogYW55W10ge1xyXG4gICAgY29uc3QgZmllbGRLZXkgPSBjb2x1bW4uZmllbGRQcm9wcz8ubmFtZSB8fCBjb2x1bW4ucHJvcDtcclxuICAgIHJldHVybiB0aGlzLl9hdXRvQ29tcGxldGVEYXRhU291cmNlc1tmaWVsZEtleV0gfHwgW107XHJcbiAgfVxyXG5cclxuICBnZXRGaWVsZFByb3BzKGNvbHVtbjogUHJvVGFibGVDb2x1bW4pOiBhbnkge1xyXG4gICAgcmV0dXJuIGNvbHVtbi5maWVsZFByb3BzO1xyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+W5oyH5a6a5ZCN56ew55qEbGFiZWzmqKHmnb9cclxuICBnZXRMYWJlbFRlbXBsYXRlKG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsIHtcclxuICAgIGlmICghbmFtZSkgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4gdGhpcy5jdXN0b21UZW1wbGF0ZXMuZ2V0KG5hbWUpIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLyDojrflj5YgZm9ybS1pdGVtIOeahOWKqOaAgeexu+WQjVxyXG4gIGdldEZvcm1JdGVtQ2xhc3NOYW1lKGNvbHVtbjogUHJvVGFibGVDb2x1bW4pOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZmllbGROYW1lID0gdGhpcy5nZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcDtcclxuICAgIHJldHVybiBgcHJvLXRhYmxlLSR7ZmllbGROYW1lfS1mb3JtLWl0ZW1gO1xyXG4gIH1cclxufVxyXG4iLCI8YXBwLXBhZ2UtY29udGFpbmVyXHJcbiAgW3RpdGxlXT1cInRpdGxlXCJcclxuICBbc2hvd0hlYWRlcl09XCJzaG93U2VhcmNoQmFyXCJcclxuICBbYm9keVN0eWxlXT1cImJvZHlTdHlsZVwiXHJcbiAgbmdDbGFzcz1cInByby10YWJsZS1jb250YWluZXJcIlxyXG4+XHJcbiAgPCEtLSDlop7liqDoh6rlrprkuYnlhoXlrrnljLotLT5cclxuICA8bmctdGVtcGxhdGUgI2N1c3RvbUNvbnRlbnQ+XHJcbiAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICpuZ0lmPVwiY3VzdG9tQ29udGVudFRwbFwiXHJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImN1c3RvbUNvbnRlbnRUcGxcIlxyXG4gICAgPjwvbmctY29udGFpbmVyPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gIDxuZy10ZW1wbGF0ZSAjaGVhZGVyPlxyXG4gICAgPGFwcC10YWJsZS1zZWFyY2gtYmFyXHJcbiAgICAgICpuZ0lmPVwic2hvd1NlYXJjaEJhclwiXHJcbiAgICAgIFtsYWJlbFdpZHRoXT1cImxhYmVsV2lkdGhcIlxyXG4gICAgICBbbGFiZWxBbGlnbl09XCJsYWJlbEFsaWduXCJcclxuICAgICAgW3NlYXJjaENvbENvdW50XT1cInRhYmxlU2VhcmNoQ29sQ291bnRcIlxyXG4gICAgPlxyXG4gICAgICA8bmctdGVtcGxhdGUgI2xlZnRDb250ZW50PlxyXG4gICAgICAgIDxuei1mb3JtLWl0ZW1cclxuICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgX3NlYXJjaEZpbGVkQ29sdW1uc1wiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXRGb3JtSXRlbUNsYXNzTmFtZShjb2x1bW4pXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bnotZm9ybS1sYWJlbCAqbmdJZj1cIiFnZXRGaWVsZFByb3BzKGNvbHVtbikuaGlkZUxhYmVsXCIgbnpOb0NvbG9uPlxyXG4gICAgICAgICAgICA8IS0tIOajgOafpeaYr+WQpuacieiHquWumuS5iWxhYmVs5qih5p2/IC0tPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgIGNvbHVtbi5jdXN0b21MYWJlbFJlbmRlciAmJlxyXG4gICAgICAgICAgICAgICAgICBnZXRMYWJlbFRlbXBsYXRlKGNvbHVtbi5jdXN0b21MYWJlbFJlbmRlcik7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGRlZmF1bHRMYWJlbFxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJnZXRMYWJlbFRlbXBsYXRlKGNvbHVtbi5jdXN0b21MYWJlbFJlbmRlcilcIlxyXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcclxuICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBjb2x1bW4sXHJcbiAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLFxyXG4gICAgICAgICAgICAgICAgICBmaWVsZFByb3BzOiBnZXRGaWVsZFByb3BzKGNvbHVtbilcclxuICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdExhYmVsPlxyXG4gICAgICAgICAgICAgIHt7IGdldEZpZWxkUHJvcHMoY29sdW1uKS5sYWJlbCB8fCBjb2x1bW4udGl0bGUgfX1cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvbnotZm9ybS1sYWJlbD5cclxuICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgKm5nSWY9XCJjb2x1bW4udmFsdWVUeXBlID09PSAnaW5wdXQnXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIG56LWlucHV0XHJcbiAgICAgICAgICAgICAgW25hbWVdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BcIlxyXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikucGxhY2VIb2xkZXJcIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiXHJcbiAgICAgICAgICAgICAgICBfc2VhcmNoUGFyYW1zW2dldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wXVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICAgIDxuei1mb3JtLWNvbnRyb2wgKm5nSWY9XCJjb2x1bW4udmFsdWVUeXBlID09PSAnaW5wdXRQbGF0ZSdcIj5cclxuICAgICAgICAgICAgPGFwcC1wbGF0ZS1pbnB1dFxyXG4gICAgICAgICAgICAgIFt1c2FnZV09XCInZmlsdGVyJ1wiXHJcbiAgICAgICAgICAgICAgW25hbWVdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiXHJcbiAgICAgICAgICAgICAgICBfc2VhcmNoUGFyYW1zW2dldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wXVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID48L2FwcC1wbGF0ZS1pbnB1dD5cclxuICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgICAgPG56LWZvcm0tY29udHJvbCAqbmdJZj1cImNvbHVtbi52YWx1ZVR5cGUgPT09ICdzZWxlY3QnXCI+XHJcbiAgICAgICAgICAgIDxuei1zZWxlY3RcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIlxyXG4gICAgICAgICAgICAgICAgX3NlYXJjaFBhcmFtc1tnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcF1cclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIFtuekFsbG93Q2xlYXJdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmFsbG93Q2xlYXJcIlxyXG4gICAgICAgICAgICAgIFtuelBsYWNlSG9sZGVyXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5wbGFjZUhvbGRlclwiXHJcbiAgICAgICAgICAgICAgW25hbWVdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BcIlxyXG4gICAgICAgICAgICAgIFtuekRpc2FibGVkXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgW256U2hvd1NlYXJjaF09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuc2hvd1NlYXJjaFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8bnotb3B0aW9uXHJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0IG9mIGdldEZpZWxkUHJvcHMoY29sdW1uKS5vcHRpb25zXCJcclxuICAgICAgICAgICAgICAgIFtuelZhbHVlXT1cIm9wdC52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICBbbnpMYWJlbF09XCJvcHQubGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgW256RGlzYWJsZWRdPVwib3B0LmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgIFtuelRpdGxlXT1cIm9wdC50b29sdGlwIHx8IG9wdC5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgPjwvbnotb3B0aW9uPlxyXG4gICAgICAgICAgICA8L256LXNlbGVjdD5cclxuICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgICAgPG56LWZvcm0tY29udHJvbCAqbmdJZj1cImNvbHVtbi52YWx1ZVR5cGUgPT09ICdzZWxlY3RNdWx0aXBsZSdcIj5cclxuICAgICAgICAgICAgPG56LXNlbGVjdFxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiXHJcbiAgICAgICAgICAgICAgICBfc2VhcmNoUGFyYW1zW2dldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wXVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgW256QWxsb3dDbGVhcl09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuYWxsb3dDbGVhclwiXHJcbiAgICAgICAgICAgICAgW256UGxhY2VIb2xkZXJdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLnBsYWNlSG9sZGVyXCJcclxuICAgICAgICAgICAgICBbbmFtZV09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcFwiXHJcbiAgICAgICAgICAgICAgW256RGlzYWJsZWRdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICBbbnpTaG93U2VhcmNoXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5zaG93U2VhcmNoXCJcclxuICAgICAgICAgICAgICBuek1vZGU9XCJtdWx0aXBsZVwiXHJcbiAgICAgICAgICAgICAgW256TWF4VGFnQ291bnRdPVwiMlwiXHJcbiAgICAgICAgICAgICAgW256TWF4VGFnUGxhY2Vob2xkZXJdPVwibnpNYXhUYWdQbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgW256Q3VzdG9tVGVtcGxhdGVdPVwiZGVmYXVsdFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxuei1vcHRpb25cclxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvcHQgb2YgZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgW256VmFsdWVdPVwib3B0LnZhbHVlXCJcclxuICAgICAgICAgICAgICAgIFtuekxhYmVsXT1cIm9wdC5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICBbbnpEaXNhYmxlZF09XCJvcHQuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgW256VGl0bGVdPVwib3B0LnRvb2x0aXAgfHwgb3B0LmxhYmVsXCJcclxuICAgICAgICAgICAgICA+PC9uei1vcHRpb24+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNuek1heFRhZ1BsYWNlaG9sZGVyPlxyXG4gICAgICAgICAgICAgICAgK1xyXG4gICAgICAgICAgICAgICAge3tcclxuICAgICAgICAgICAgICAgICAgX3NlYXJjaFBhcmFtc1tnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcF1cclxuICAgICAgICAgICAgICAgICAgICA/Lmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFRlbXBsYXRlIGxldC1zZWxlY3RlZD5cclxuICAgICAgICAgICAgICAgIHt7XHJcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLm56TGFiZWwubGVuZ3RoID4gNFxyXG4gICAgICAgICAgICAgICAgICAgID8gc2VsZWN0ZWQubnpMYWJlbC5zdWJzdHJpbmcoMCwgNCkgKyBcIi4uLlwiXHJcbiAgICAgICAgICAgICAgICAgICAgOiBzZWxlY3RlZC5uekxhYmVsXHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvbnotc2VsZWN0PlxyXG4gICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICA8bnotZm9ybS1jb250cm9sICpuZ0lmPVwiY29sdW1uLnZhbHVlVHlwZSA9PT0gJ2RhdGUnXCI+XHJcbiAgICAgICAgICAgIDxuei1kYXRlLXBpY2tlclxyXG4gICAgICAgICAgICAgIFtuelNob3dUaW1lXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5zaG93VGltZVwiXHJcbiAgICAgICAgICAgICAgW256Rm9ybWF0XT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5mb3JtYXRcIlxyXG4gICAgICAgICAgICAgIFtuelBsYWNlSG9sZGVyXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5wbGFjZUhvbGRlclwiXHJcbiAgICAgICAgICAgICAgW256QWxsb3dDbGVhcl09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuYWxsb3dDbGVhclwiXHJcbiAgICAgICAgICAgICAgW256RGlzYWJsZWRdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIlxyXG4gICAgICAgICAgICAgICAgX3NlYXJjaFBhcmFtc1tnZXRGaWVsZFByb3BzKGNvbHVtbikubmFtZSB8fCBjb2x1bW4ucHJvcF1cclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIFtuek1vZGVdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm1vZGVcIlxyXG4gICAgICAgICAgICA+PC9uei1kYXRlLXBpY2tlcj5cclxuICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgICAgPG56LWZvcm0tY29udHJvbCAqbmdJZj1cImNvbHVtbi52YWx1ZVR5cGUgPT09ICdjaGVja2JveCdcIj5cclxuICAgICAgICAgICAgPG56LWNoZWNrYm94LWdyb3VwXHJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cIlxyXG4gICAgICAgICAgICAgICAgZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5vU3R5bGVcclxuICAgICAgICAgICAgICAgICAgPyAncHJvLXRhYmxlLWNoZWNrYm94Z3JvdXAtbm9zdHlsZSdcclxuICAgICAgICAgICAgICAgICAgOiAnJ1xyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikub3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgW256RGlzYWJsZWRdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJcclxuICAgICAgICAgICAgICAgIGhhbmRsZUZpZWxkQ2hlY2tCb3hDaGFuZ2UoXHJcbiAgICAgICAgICAgICAgICAgICRldmVudCxcclxuICAgICAgICAgICAgICAgICAgZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+PC9uei1jaGVja2JveC1ncm91cD5cclxuICAgICAgICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgICAgICAgPG56LWZvcm0tY29udHJvbCAqbmdJZj1cImNvbHVtbi52YWx1ZVR5cGUgPT09ICdhdXRvQ29tcGxldGUnXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIG56LWlucHV0XHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJcclxuICAgICAgICAgICAgICAgIF9zZWFyY2hQYXJhbXNbZ2V0RmllbGRQcm9wcyhjb2x1bW4pPy5uYW1lIHx8IGNvbHVtbi5wcm9wXVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgKGlucHV0KT1cImhhbmRsZUF1dG9Db21wbGV0ZUlucHV0KCRldmVudCwgY29sdW1uKVwiXHJcbiAgICAgICAgICAgICAgW256QXV0b2NvbXBsZXRlXT1cImF1dG9cIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnZXRGaWVsZFByb3BzKGNvbHVtbik/LmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pPy5wbGFjZUhvbGRlclwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxuei1hdXRvY29tcGxldGVcclxuICAgICAgICAgICAgICBbbnpCYWNrZmlsbF09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikuYmFja0ZpbGxcIlxyXG4gICAgICAgICAgICAgIFtuekRlZmF1bHRBY3RpdmVGaXJzdE9wdGlvbl09XCJcclxuICAgICAgICAgICAgICAgIGdldEZpZWxkUHJvcHMoY29sdW1uKS5kZWZhdWx0QWN0aXZlRmlyc3RPcHRpb25cclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIFtueldpZHRoXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS53aWR0aFwiXHJcbiAgICAgICAgICAgICAgI2F1dG9cclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxuei1hdXRvLW9wdGlvblxyXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBnZXRBdXRvQ29tcGxldGVEYXRhU291cmNlKGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgW256VmFsdWVdPVwiXHJcbiAgICAgICAgICAgICAgICAgIGdldEZpZWxkUHJvcHMoY29sdW1uKS5yZXR1cm5GdWxsRGF0YSA/IG9wdGlvbiA6IG9wdGlvbi52YWx1ZVxyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgIFtuekxhYmVsXT1cIm9wdGlvbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICBbbnpEaXNhYmxlZF09XCJvcHRpb24uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt7IG9wdGlvbi5sYWJlbCB9fVxyXG4gICAgICAgICAgICAgIDwvbnotYXV0by1vcHRpb24+XHJcbiAgICAgICAgICAgIDwvbnotYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICA8bnotZm9ybS1jb250cm9sICpuZ0lmPVwiY29sdW1uLnZhbHVlVHlwZSA9PT0gJ2N1c3RvbSdcIj5cclxuICAgICAgICAgICAgPGFwcC1keW5hbWljLXNlYXJjaC1maWVsZFxyXG4gICAgICAgICAgICAgIFtjb21wb25lbnRdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLmNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIl9zZWFyY2hQYXJhbXNbZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BdXCJcclxuICAgICAgICAgICAgICBbcHJvcHNdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiXHJcbiAgICAgICAgICAgICAgICBzZXRGaWVsZFZhbHVlKGdldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wLCAkZXZlbnQpXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPjwvYXBwLWR5bmFtaWMtc2VhcmNoLWZpZWxkPlxyXG4gICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgICA8bnotZm9ybS1jb250cm9sICpuZ0lmPVwiY29sdW1uLnZhbHVlVHlwZSA9PT0gJ2lucHV0TnVtYmVyJ1wiPlxyXG4gICAgICAgICAgICA8bnotaW5wdXQtbnVtYmVyXHJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cIicxMDAlJ1wiXHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJcclxuICAgICAgICAgICAgICAgIF9zZWFyY2hQYXJhbXNbZ2V0RmllbGRQcm9wcyhjb2x1bW4pLm5hbWUgfHwgY29sdW1uLnByb3BdXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBbbnpQbGFjZUhvbGRlcl09XCJnZXRGaWVsZFByb3BzKGNvbHVtbikucGxhY2VIb2xkZXJcIlxyXG4gICAgICAgICAgICAgIFtuekRpc2FibGVkXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgW256Rm9ybWF0dGVyXT1cImdldEZpZWxkUHJvcHMoY29sdW1uKS5mb3JtYXR0ZXJQZXJjZW50XCJcclxuICAgICAgICAgICAgICBbbnpQYXJzZXJdPVwiZ2V0RmllbGRQcm9wcyhjb2x1bW4pLnBhcnNlclBlcmNlbnRcIlxyXG4gICAgICAgICAgICA+PC9uei1pbnB1dC1udW1iZXI+XHJcbiAgICAgICAgICA8L256LWZvcm0tY29udHJvbD5cclxuICAgICAgICA8L256LWZvcm0taXRlbT5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPG5nLXRlbXBsYXRlICNhY3Rpb25UZXh0QnRuPlxyXG4gICAgICAgIDxuei1zcGFjZSBbbnpTaXplXT1cIjRcIj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuelNwYWNlSXRlbSAqbmdJZj1cInNob3dTZWFyY2hCdG5cIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBuei1idXR0b24gbnpUeXBlPVwicHJpbWFyeVwiIChjbGljayk9XCJoYW5kbGVTZWFyY2goKVwiPlxyXG4gICAgICAgICAgICAgIHt7IGNvbmZpcm1CdG5UZXh0IH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuelNwYWNlSXRlbSAqbmdJZj1cInNob3dDbGVhckJ0blwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG56LWJ1dHRvbiAoY2xpY2spPVwiaGFuZGxlUmVzZXRGb3JtKClcIj5cclxuICAgICAgICAgICAgICB7eyBjbGVhckJ0blRleHQgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvbnotc3BhY2U+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbWdBY3Rpb25CYXJUcGwgfHwgc2hvd0NvbHVtblNldHRpbmdcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2FjdGlvbkltZ0J0bj5cclxuICAgICAgICAgIDxuei1zcGFjZT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImltZ0FjdGlvbkJhclRwbFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgICBuelNwYWNlSXRlbVxyXG4gICAgICAgICAgICAgIGNsYXNzPVwic2V0dGluZy1zcGFjZS1pdGVtXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cInNob3dDb2x1bW5TZXR0aW5nXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxzcGFuIG56LXRvb2x0aXAgbnpUb29sdGlwVGl0bGU9XCLorr7nva7lrZfmrrVcIj5cclxuICAgICAgICAgICAgICAgIDxhcHAtY29sbXVucy1zZXR0aW5nXHJcbiAgICAgICAgICAgICAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxyXG4gICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRDb2x1bW5zXT1cIl9zZXJ2ZXJDb2x1bW5zXCJcclxuICAgICAgICAgICAgICAgICAgW3RhYmxlTmFtZV09XCJ0YWJsZU5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAoYWZ0ZXJDb25maXJtKT1cImhhbmRsZUNvbHVtbnNTZXR0aW5nQ29uZmlybSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgID48L2FwcC1jb2xtdW5zLXNldHRpbmc+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9uei1zcGFjZT5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvYXBwLXRhYmxlLXNlYXJjaC1iYXI+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgPG5nLXRlbXBsYXRlICNib2R5PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dBY3Rpb25CYXJcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWN0aW9uQmFyVHBsXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VzdG9tVGFibGVSZW5kZXJcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbVRhYmxlUmVuZGVyXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxkaXYgW2NsYXNzLnByby10YWJsZS1hdXRvLXNjcm9sbF09XCJzY3JvbGw/LnggPT09ICdhdXRvJ1wiPlxyXG4gICAgICA8bnotdGFibGVcclxuICAgICAgICAqbmdJZj1cIiFjdXN0b21UYWJsZVJlbmRlciAmJiBfY29sdW1uc1JlYWR5XCJcclxuICAgICAgICAjZHluYW1pY1RhYmxlXHJcbiAgICAgICAgbnpTaXplPVwic21hbGxcIlxyXG4gICAgICAgIG56U2hvd1NpemVDaGFuZ2VyXHJcbiAgICAgICAgW256Qm9yZGVyZWRdPVwiYm9yZGVyZWRcIlxyXG4gICAgICAgIFtuek91dGVyQm9yZGVyZWRdPVwib3V0ZXJCb3JkZXJlZFwiXHJcbiAgICAgICAgW256RGF0YV09XCJkYXRhU291cmNlXCJcclxuICAgICAgICBbbnpQYWdlSW5kZXhdPVwiX3BhZ2VJbmZvLnBhZ2VJbmRleFwiXHJcbiAgICAgICAgW256UGFnZVNpemVdPVwiX3BhZ2VJbmZvLnBhZ2VTaXplXCJcclxuICAgICAgICBbbnpUb3RhbF09XCJfcGFnZUluZm8udG90YWxcIlxyXG4gICAgICAgIFtuelBhZ2VTaXplT3B0aW9uc109XCJfcGFnZUluZm8ucGFnZVNpemVPcHRpb25zXCJcclxuICAgICAgICBbbnpTaG93UGFnaW5hdGlvbl09XCJzaG93UGFnaW5hdGlvblwiXHJcbiAgICAgICAgW256U2hvd1RvdGFsXT1cInRvdGFsVGVtcGxhdGVcIlxyXG4gICAgICAgIFtuekxvYWRpbmddPVwiX2xvYWRpbmdcIlxyXG4gICAgICAgIFtuekZyb250UGFnaW5hdGlvbl09XCJmcm9udFBhZ2luYXRpb25cIlxyXG4gICAgICAgIFtuelNjcm9sbF09XCJfY29tcHV0ZWRTY3JvbGxcIlxyXG4gICAgICAgIChuelBhZ2VJbmRleENoYW5nZSk9XCJoYW5kbGVQYWdlSW5kZXhDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgKG56UGFnZVNpemVDaGFuZ2UpPVwiaGFuZGxlUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgID5cclxuICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDwhLS0g5aSN6YCJ5qGG5YiX77yI5b2TIHNob3dDaGVja2JveD10cnVlIOaXtuaYvuekuu+8iSAtLT5cclxuICAgICAgICAgICAgPHRoXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJzaG93Q2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgIFtueldpZHRoXT1cIic1MHB4J1wiXHJcbiAgICAgICAgICAgICAgW256QWxpZ25dPVwiJ2NlbnRlcidcIlxyXG4gICAgICAgICAgICAgIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyXCJcclxuICAgICAgICAgICAgICBbKG56Q2hlY2tlZCldPVwiX2NoZWNrZWRBbGxcIlxyXG4gICAgICAgICAgICAgIFtuekluZGV0ZXJtaW5hdGVdPVwiX2luZGV0ZXJtaW5hdGVcIlxyXG4gICAgICAgICAgICAgIChuekNoZWNrZWRDaGFuZ2UpPVwidG9nZ2xlQ2hlY2tBbGwoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgID48L3RoPlxyXG4gICAgICAgICAgICA8dGhcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIF9jb2x1bW5zXCJcclxuICAgICAgICAgICAgICBbbnpXaWR0aF09XCJjb2x1bW4ud2lkdGhcIlxyXG4gICAgICAgICAgICAgIFtuekFsaWduXT1cImNvbHVtbi5hbGlnblwiXHJcbiAgICAgICAgICAgICAgW256TGVmdF09XCJjb2x1bW4uX256TGVmdFwiXHJcbiAgICAgICAgICAgICAgW256UmlnaHRdPVwiY29sdW1uLl9uelJpZ2h0XCJcclxuICAgICAgICAgICAgICBbbnpTaG93U29ydF09XCIhIWNvbHVtbi5zb3J0ZXJcIlxyXG4gICAgICAgICAgICAgIFtuelNvcnRPcmRlcl09XCJnZXRTb3J0T3JkZXIoY29sdW1uLnByb3ApXCJcclxuICAgICAgICAgICAgICAobnpTb3J0T3JkZXJDaGFuZ2UpPVwib25Tb3J0Q2hhbmdlKGNvbHVtbi5wcm9wLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt7IGNvbHVtbi50aXRsZSB9fVxyXG4gICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3RoZWFkPlxyXG5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICA8dHJcclxuICAgICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXJcIlxyXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF0YTsgbGV0IGkgPSBpbmRleDsgb2Y6IGR5bmFtaWNUYWJsZS5kYXRhXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICdhbnQtdGFibGUtY3VzdG9tLXJvdy1zZWxlY3RlZCc6ICEhZ2V0VGFibGVSb3dDaGVja2VkKGRhdGEpLFxyXG4gICAgICAgICAgICAgICdhbnQtdGFibGUtY3VzdG9tLXJvdy1ldmVuJzogaSAlIDIgPT09IDAsXHJcbiAgICAgICAgICAgICAgJ2FudC10YWJsZS1jdXN0b20tcm93LW9kZCc6IGkgJSAyICE9PSAwXHJcbiAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlVGFibGVSb3dDbGljayhkYXRhKVwiXHJcbiAgICAgICAgICAgIChkYmxjbGljayk9XCJoYW5kbGVUYWJsZVJvd0RiQ2xpY2soZGF0YSlcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8IS0tIOWkjemAieahhuWIl++8iOW9kyBzaG93Q2hlY2tib3g9dHJ1ZSDml7bmmL7npLrvvIkgLS0+XHJcbiAgICAgICAgICAgIDx0ZFxyXG4gICAgICAgICAgICAgICpuZ0lmPVwic2hvd0NoZWNrYm94XCJcclxuICAgICAgICAgICAgICBbbnpBbGlnbl09XCInY2VudGVyJ1wiXHJcbiAgICAgICAgICAgICAgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7IHdpZHRoOiA1MHB4XCJcclxuICAgICAgICAgICAgICBbKG56Q2hlY2tlZCldPVwiZGF0YS5jaGVja2VkXCJcclxuICAgICAgICAgICAgICBbbnpEaXNhYmxlZF09XCJpc1Jvd0Rpc2FibGVkKGRhdGEpXCJcclxuICAgICAgICAgICAgICAobnpDaGVja2VkQ2hhbmdlKT1cImhhbmRsZVJvd0NoZWNrZWRDaGFuZ2UoZGF0YSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgID48L3RkPlxyXG4gICAgICAgICAgICA8dGRcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIF9jb2x1bW5zXCJcclxuICAgICAgICAgICAgICBbbnpMZWZ0XT1cImNvbHVtbi5fbnpMZWZ0XCJcclxuICAgICAgICAgICAgICBbbnpSaWdodF09XCJjb2x1bW4uX256UmlnaHRcIlxyXG4gICAgICAgICAgICAgIFtuekFsaWduXT1cImNvbHVtbi5hbGlnblwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgJ3Byby1ub3dyYXAnOiB0cnVlXHJcbiAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8IS0tIOajgOafpeaYr+WQpuacieiHquWumuS5ieaooeadvyAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICBjb2x1bW4uY3VzdG9tUmVuZGVyICYmIGdldFRlbXBsYXRlKGNvbHVtbi5jdXN0b21SZW5kZXIpO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgdGVtcGxhdGVcclxuICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcclxuICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGRhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbixcclxuICAgICAgICAgICAgICAgICAgICBpbmRleDogaSxcclxuICAgICAgICAgICAgICAgICAgICBwYWdlSW5mbzogX3BhZ2VJbmZvXHJcbiAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgPCEtLSDpu5jorqTmuLLmn5PpgLvovpEgLS0+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgIWNvbHVtbi5jdXN0b21SZW5kZXIgfHwgIWdldFRlbXBsYXRlKGNvbHVtbi5jdXN0b21SZW5kZXIpXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4uZWxsaXBzaXNcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHJvLWVsbGlwc2lzXCJcclxuICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZGF0YVtjb2x1bW4ucHJvcF1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnY2FsYygnICsgY29sdW1uLndpZHRoICsgJyAtIDI1cHgpJ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgZGF0YVtjb2x1bW4ucHJvcF0gfX1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29sdW1uLmVsbGlwc2lzXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGRhdGFbY29sdW1uLnByb3BdIH19XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICA8dHIgKm5nSWY9XCJzdW1tYXJ5RGF0YSAmJiBfcGFnZUluZm8udG90YWwgPiAwXCI+XHJcbiAgICAgICAgICAgIDwhLS0g5rGH5oC76KGM55qE5aSN6YCJ5qGG5YiX77yI5b2TIHNob3dDaGVja2JveD10cnVlIOaXtuaYvuekuu+8jOS9huS4uuepuu+8iSAtLT5cclxuICAgICAgICAgICAgPHRkXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJzaG93Q2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgIHN0eWxlPVwiZm9udC13ZWlnaHQ6IGJvbGQ7IGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNlOGU4ZThcIlxyXG4gICAgICAgICAgICA+PC90ZD5cclxuICAgICAgICAgICAgPHRkXHJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbjsgbGV0IGkgPSBpbmRleDsgb2Y6IF9jb2x1bW5zXCJcclxuICAgICAgICAgICAgICBbbnpMZWZ0XT1cImNvbHVtbi5fbnpMZWZ0XCJcclxuICAgICAgICAgICAgICBbbnpSaWdodF09XCJjb2x1bW4uX256UmlnaHRcIlxyXG4gICAgICAgICAgICAgIHN0eWxlPVwiZm9udC13ZWlnaHQ6IGJvbGQ7IGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNlOGU4ZThcIlxyXG4gICAgICAgICAgICAgIFtuekFsaWduXT1cImNvbHVtbi5hbGlnblwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImkgPT09IDBcIj7mgLvorqE8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImkgIT09IDAgJiYgY29sdW1uLnN1bW1hcnlcIj5cclxuICAgICAgICAgICAgICAgIHt7XHJcbiAgICAgICAgICAgICAgICAgIGNvbHVtbi5zdW1tYXJ5Py5mb3JtYXRcclxuICAgICAgICAgICAgICAgICAgICA/IGNvbHVtbi5zdW1tYXJ5Py5mb3JtYXQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlEYXRhW2NvbHVtbi5zdW1tYXJ5Py5uYW1lIHx8IGNvbHVtbi5wcm9wXVxyXG4gICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIDogc3VtbWFyeURhdGFbY29sdW1uLnN1bW1hcnk/Lm5hbWUgfHwgY29sdW1uLnByb3BdXHJcbiAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjdG90YWxUZW1wbGF0ZSBsZXQtdG90YWxcclxuICAgICAgICAgID7lhbEge3sgX3BhZ2VJbmZvLnRvdGFsIH19IOadoeiusOW9lTwvbmctdGVtcGxhdGVcclxuICAgICAgICA+XHJcbiAgICAgIDwvbnotdGFibGU+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG48L2FwcC1wYWdlLWNvbnRhaW5lcj5cclxuIl19