@hestia-earth/ui-components 0.0.21 → 0.0.22

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.
@@ -26,26 +26,30 @@ export class NodeCsvSelectHeadersComponent {
26
26
  this.csv = '';
27
27
  this.includeDefaultCSV = false;
28
28
  this.headersChanged = new EventEmitter();
29
+ this.loading = true;
29
30
  this.headers = {};
30
31
  this.allSelected = false;
31
32
  this.showSelectTermFields = false;
32
33
  this.termFields = termFields;
33
34
  this.termFieldSelected = {};
35
+ this.showNonIncluded = false;
34
36
  }
35
37
  ngOnInit() {
36
38
  return __awaiter(this, void 0, void 0, function* () {
37
39
  const schemas = yield this.schemaService.schemas();
38
40
  const isSelected = yield this.isSelected(schemas);
41
+ const isIncluded = isCSVIncluded(schemas);
39
42
  const headers = yield this.schemaService.parseHeaders(this.csv);
40
- this.headers = headers.filter(isCSVIncluded(schemas)).reduce((prev, header) => {
43
+ this.headers = headers.reduce((prev, header) => {
41
44
  const group = headerGroup(header);
42
45
  prev[group] = prev[group] || { headers: [], selected: false, partialSelected: false, open: true };
43
- prev[group].headers.push({ header, selected: isSelected(header) });
46
+ prev[group].headers.push({ header, selected: isSelected(header), included: isIncluded(header) });
44
47
  return prev;
45
48
  }, {});
46
49
  Object.keys(this.headers).map(groupKey => this.updateGroupHeader(groupKey));
47
50
  this.termFieldSelected = termFields.reduce((prev, curr) => (Object.assign(Object.assign({}, prev), { [curr]: curr === '@id' })), {});
48
- this.reresh();
51
+ this.refresh();
52
+ this.loading = false;
49
53
  });
50
54
  }
51
55
  isSelected(schemas) {
@@ -83,10 +87,10 @@ export class NodeCsvSelectHeadersComponent {
83
87
  get selectedHeaders() {
84
88
  return Object.values(this.headers)
85
89
  .flatMap(({ headers }) => headers)
86
- .filter(({ selected }) => selected)
90
+ .filter(({ selected, included }) => selected && (included || this.showNonIncluded))
87
91
  .map(({ header }) => header);
88
92
  }
89
- reresh() {
93
+ refresh() {
90
94
  this.updateAllSelected();
91
95
  this.headersChanged.emit(this.selectedHeaders);
92
96
  }
@@ -100,7 +104,7 @@ export class NodeCsvSelectHeadersComponent {
100
104
  }
101
105
  }
102
106
  NodeCsvSelectHeadersComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: NodeCsvSelectHeadersComponent, deps: [{ token: i1.HeSchemaService }], target: i0.ɵɵFactoryTarget.Component });
103
- NodeCsvSelectHeadersComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: NodeCsvSelectHeadersComponent, selector: "he-node-csv-select-headers", inputs: { csv: "csv", keys: "keys", includeDefaultCSV: "includeDefaultCSV" }, outputs: { headersChanged: "headersChanged" }, ngImport: i0, template: "<p class=\"mb-2\">Please select which columns you would like to include:</p>\n\n<p class=\"my-2 is-size-7\"><i>You can drag and drop the headers to sort them as they would appear in the CSV file.</i></p>\n\n<div class=\"columns toggle-all mx-4 pb-1 mb-0\">\n <div class=\"column\">\n <label class=\"checkbox ml-1\">\n <input type=\"checkbox\" class=\"selector\"\n [(ngModel)]=\"allSelected\"\n (change)=\"toggleAll(); reresh()\"\n >\n <span class=\"ml-2\">Toggle All</span>\n </label>\n </div>\n\n <div class=\"column is-narrow has-text-right\">\n <div class=\"dropdown is-right has-text-left\"\n [class.is-active]=\"showSelectTermFields\"\n (clickOutside)=\"showSelectTermFields = false\"\n >\n <div class=\"dropdown-trigger\" (click)=\"showSelectTermFields = !showSelectTermFields\">\n <button class=\"button is-small\"\n aria-haspopup=\"true\" aria-controls=\"select-menu\"\n >\n <span>Toggle Term Fields</span>\n <span class=\"icon is-small\">\n <fa-icon icon=\"filter\" aria-hidden=\"true\"></fa-icon>\n </span>\n </button>\n </div>\n <div class=\"dropdown-menu\" id=\"select-menu\" role=\"menu\">\n <div class=\"dropdown-content\">\n <a class=\"dropdown-item\"\n *ngFor=\"let field of termFields\"\n >\n <label class=\"checkbox ml-1\">\n <input type=\"checkbox\" class=\"selector\"\n [(ngModel)]=\"termFieldSelected[field]\"\n (change)=\"toggleTermField(field)\"\n >\n <span class=\"ml-2\">{{field}}</span>\n </label>\n </a>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"drag-container\">\n <div class=\"card\" *ngFor=\"let group of headers | keys\">\n <header class=\"card-header\" *ngIf=\"group.key\">\n <div class=\"card-header-title\">\n <label class=\"checkbox ml-1\">\n <input type=\"checkbox\" class=\"selector\"\n [indeterminate]=\"group.value.partialSelected\"\n [(ngModel)]=\"group.value.selected\"\n (change)=\"updateGroup(group.key); reresh()\"\n >\n <span class=\"ml-2\">{{group.key}}</span>\n </label>\n </div>\n <span class=\"card-header-icon has-text-link\" aria-label=\"open / close\"\n (click)=\"group.value.open = !group.value.open\" pointer\n >\n <span class=\"icon\">\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!group.value.open\"></fa-icon>\n <fa-icon icon=\"angle-left\" [class.is-hidden]=\"group.value.open\"></fa-icon>\n </span>\n </span>\n </header>\n\n <div class=\"card-content p-3\" [class.is-hidden]=\"!group.value.open\">\n <ul cdkDropList (cdkDropListDropped)=\"dropHeader($event, group.key)\">\n <li *ngFor=\"let header of group.value.headers\" cdkDrag>\n <label class=\"checkbox ml-2\">\n <input type=\"checkbox\" class=\"selector\"\n [(ngModel)]=\"header.selected\"\n (change)=\"updateGroupHeader(group.key); reresh()\"\n >\n <span class=\"ml-2\">{{header.header}}</span>\n </label>\n </li>\n </ul>\n </div>\n </div>\n</div>\n", styles: [".toggle-all{border-bottom:1px solid #7a7a7a}.drag-container,.table-container{max-height:45vh;overflow-y:auto}.cdk-drag-preview{border-radius:2px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;list-style:none}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}\n"], components: [{ type: i2.FaIconComponent, selector: "fa-icon", inputs: ["classes", "icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }], directives: [{ type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i4.ClickOutsideDirective, selector: "[clickOutside]", outputs: ["clickOutside"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "id", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListAutoScrollDisabled", "cdkDropListOrientation", "cdkDropListLockAxis", "cdkDropListData", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { type: i6.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragDisabled", "cdkDragStartDelay", "cdkDragLockAxis", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragBoundary", "cdkDragRootElement", "cdkDragPreviewContainer", "cdkDragData", "cdkDragFreeDragPosition"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }], pipes: { "keys": i7.KeysPipe } });
107
+ NodeCsvSelectHeadersComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: NodeCsvSelectHeadersComponent, selector: "he-node-csv-select-headers", inputs: { csv: "csv", keys: "keys", includeDefaultCSV: "includeDefaultCSV" }, outputs: { headersChanged: "headersChanged" }, ngImport: i0, template: "<p class=\"mb-2\">Please select which columns you would like to include:</p>\n\n<p class=\"my-2 is-size-7\"><i>You can drag and drop the headers to sort them as they would appear in the CSV file.</i></p>\n\n<div class=\"columns toggle-all mx-4 pb-1 mb-0\">\n <div class=\"column\">\n <label class=\"checkbox ml-1\">\n <input type=\"checkbox\" class=\"selector\"\n [(ngModel)]=\"allSelected\"\n (change)=\"toggleAll(); refresh()\"\n >\n <span class=\"ml-2\">Toggle All</span>\n </label>\n </div>\n\n <div class=\"column is-narrow has-text-right\">\n <div class=\"dropdown is-right has-text-left\"\n [class.is-active]=\"showSelectTermFields\"\n (clickOutside)=\"showSelectTermFields = false\"\n >\n <div class=\"dropdown-trigger\" (click)=\"showSelectTermFields = !showSelectTermFields\">\n <button class=\"button is-small\"\n aria-haspopup=\"true\" aria-controls=\"select-menu\"\n >\n <span>Advanced Filters</span>\n <span class=\"icon is-small\">\n <fa-icon icon=\"filter\" aria-hidden=\"true\"></fa-icon>\n </span>\n </button>\n </div>\n <div class=\"dropdown-menu\" id=\"select-menu\" role=\"menu\">\n <div class=\"dropdown-content\">\n <a class=\"dropdown-item\">\n <label class=\"checkbox ml-1\">\n <input type=\"checkbox\" class=\"selector\"\n [(ngModel)]=\"showNonIncluded\"\n (change)=\"refresh()\"\n >\n <span class=\"ml-2\">Include <code>internal</code> fields</span>\n </label>\n </a>\n <div class=\"dropdown-item\">\n <p>Toggle Term Fields</p>\n </div>\n <a class=\"dropdown-item\"\n *ngFor=\"let field of termFields\"\n >\n <label class=\"checkbox ml-1\">\n <input type=\"checkbox\" class=\"selector\"\n [(ngModel)]=\"termFieldSelected[field]\"\n (change)=\"toggleTermField(field)\"\n >\n <span class=\"ml-2\">{{field}}</span>\n </label>\n </a>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"drag-container\" *ngIf=\"!loading; else loader\">\n <div class=\"card\" *ngFor=\"let group of headers | keys\">\n <header class=\"card-header\" *ngIf=\"group.key\">\n <div class=\"card-header-title\">\n <label class=\"checkbox ml-1\">\n <input type=\"checkbox\" class=\"selector\"\n [indeterminate]=\"group.value.partialSelected\"\n [(ngModel)]=\"group.value.selected\"\n (change)=\"updateGroup(group.key); refresh()\"\n >\n <span class=\"ml-2\">{{group.key}}</span>\n </label>\n </div>\n <span class=\"card-header-icon has-text-link\" aria-label=\"open / close\"\n (click)=\"group.value.open = !group.value.open\" pointer\n >\n <span class=\"icon\">\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!group.value.open\"></fa-icon>\n <fa-icon icon=\"angle-left\" [class.is-hidden]=\"group.value.open\"></fa-icon>\n </span>\n </span>\n </header>\n\n <div class=\"card-content p-3\" [class.is-hidden]=\"!group.value.open\">\n <ul cdkDropList (cdkDropListDropped)=\"dropHeader($event, group.key)\">\n <ng-container *ngFor=\"let header of group.value.headers\">\n <ng-container *ngIf=\"header.included || showNonIncluded\">\n <li cdkDrag>\n <label class=\"checkbox ml-2\">\n <input type=\"checkbox\" class=\"selector\"\n [(ngModel)]=\"header.selected\"\n (change)=\"updateGroupHeader(group.key); refresh()\"\n >\n <span class=\"ml-2\">{{header.header}}</span>\n </label>\n </li>\n </ng-container>\n </ng-container>\n </ul>\n </div>\n </div>\n</div>\n\n<ng-template #loader>\n <div class=\"has-text-center py-3\">\n <fa-icon icon=\"spinner\" [pulse]=\"true\" size=\"lg\"></fa-icon>\n </div>\n</ng-template>\n", styles: [".toggle-all{border-bottom:1px solid #7a7a7a}.drag-container,.table-container{max-height:45vh;overflow-y:auto}.cdk-drag-preview{border-radius:2px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;list-style:none}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}\n"], components: [{ type: i2.FaIconComponent, selector: "fa-icon", inputs: ["classes", "icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }], directives: [{ type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i4.ClickOutsideDirective, selector: "[clickOutside]", outputs: ["clickOutside"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "id", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListAutoScrollDisabled", "cdkDropListOrientation", "cdkDropListLockAxis", "cdkDropListData", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { type: i6.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragDisabled", "cdkDragStartDelay", "cdkDragLockAxis", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragBoundary", "cdkDragRootElement", "cdkDragPreviewContainer", "cdkDragData", "cdkDragFreeDragPosition"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }], pipes: { "keys": i7.KeysPipe } });
104
108
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: NodeCsvSelectHeadersComponent, decorators: [{
105
109
  type: Component,
106
110
  args: [{
@@ -117,4 +121,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImpo
117
121
  }], headersChanged: [{
118
122
  type: Output
119
123
  }] } });
120
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1jc3Ytc2VsZWN0LWhlYWRlcnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL25vZGUvbm9kZS1jc3Ytc2VsZWN0LWhlYWRlcnMvbm9kZS1jc3Ytc2VsZWN0LWhlYWRlcnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc3JjL25vZGUvbm9kZS1jc3Ytc2VsZWN0LWhlYWRlcnMvbm9kZS1jc3Ytc2VsZWN0LWhlYWRlcnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUFlLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXRFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxhQUFhLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQzs7Ozs7Ozs7O0FBa0I3RixNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQWMsRUFBRSxFQUFFO0lBQ3JDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEMsT0FBTyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbEUsQ0FBQyxDQUFDO0FBRUYsTUFBTSxVQUFVLEdBQUc7SUFDakIsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVTtDQUNuQyxDQUFDO0FBRUYsTUFBTSxXQUFXLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQVcsRUFBRSxFQUFFLENBQUM7SUFDOUQsTUFBTSxFQUFFLGFBQWEs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QUFDLEtBQWE7UUFDbEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9DLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUN2RCxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxDQUFDO1lBQ25GLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7MkhBN0ZVLDZCQUE2QjsrR0FBN0IsNkJBQTZCLCtMQ3ZDMUMscXdHQXVGQTs0RkRoRGEsNkJBQTZCO2tCQUx6QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSw0QkFBNEI7b0JBQ3RDLFdBQVcsRUFBRSwwQ0FBMEM7b0JBQ3ZELFNBQVMsRUFBRSxDQUFDLDBDQUEwQyxDQUFDO2lCQUN4RDtzR0FHUyxHQUFHO3NCQURWLEtBQUs7Z0JBR0UsSUFBSTtzQkFEWCxLQUFLO2dCQUdFLGlCQUFpQjtzQkFEeEIsS0FBSztnQkFJQyxjQUFjO3NCQURwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2RrRHJhZ0Ryb3AsIG1vdmVJdGVtSW5BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgZGVmaW5pdGlvbnMgfSBmcm9tICdAaGVzdGlhLWVhcnRoL2pzb24tc2NoZW1hJztcbmltcG9ydCB7IGlzRGVmYXVsdENTVlNlbGVjdGVkLCBpc0NTVkluY2x1ZGVkIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9qc29uLXNjaGVtYS9zY2hlbWEtdXRpbHMnO1xuXG5pbXBvcnQgeyBIZVNjaGVtYVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zY2hlbWEvc2NoZW1hLnNlcnZpY2UnO1xuXG5pbnRlcmZhY2UgSUhlYWRlciB7XG4gIGhlYWRlcjogc3RyaW5nO1xuICBzZWxlY3RlZDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIElHcm91cGVkSGVhZGVycyB7XG4gIFtncm91cDogc3RyaW5nXToge1xuICAgIHNlbGVjdGVkOiBib29sZWFuO1xuICAgIHBhcnRpYWxTZWxlY3RlZDogYm9vbGVhbjtcbiAgICBvcGVuOiBib29sZWFuO1xuICAgIGhlYWRlcnM6IElIZWFkZXJbXTtcbiAgfTtcbn1cblxuY29uc3QgaGVhZGVyR3JvdXAgPSAoaGVhZGVyOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgcGFydHMgPSBoZWFkZXIuc3BsaXQoJy4nKTtcbiAgcmV0dXJuIHBhcnRzLmxlbmd0aCA9PT0gMiA/ICcnIDogW3BhcnRzWzBdLCBwYXJ0c1sxXV0uam9pbignLicpO1xufTtcblxuY29uc3QgdGVybUZpZWxkcyA9IFtcbiAgJ0BpZCcsICduYW1lJywgJ3VuaXRzJywgJ3Rlcm1UeXBlJ1xuXTtcblxuY29uc3QgaXNUZXJtRmllbGQgPSAoZmllbGQ6IHN0cmluZykgPT4gKHsgaGVhZGVyIH06IElIZWFkZXIpID0+IFtcbiAgJ3Rlcm0nLCAnbWV0aG9kTW9kZWwnLCAnY291bnRyeScsICdwcm9kdWN0JywgJ29wZXJhdGlvbicsICdrZXknXG5dLnNvbWUocGFyZW50ID0+IGhlYWRlci5lbmRzV2l0aChbcGFyZW50LCBmaWVsZF0uam9pbignLicpKSk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2hlLW5vZGUtY3N2LXNlbGVjdC1oZWFkZXJzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL25vZGUtY3N2LXNlbGVjdC1oZWFkZXJzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbm9kZS1jc3Ytc2VsZWN0LWhlYWRlcnMuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBOb2RlQ3N2U2VsZWN0SGVhZGVyc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpXG4gIHByaXZhdGUgY3N2ID0gJyc7XG4gIEBJbnB1dCgpXG4gIHByaXZhdGUga2V5cz86IHN0cmluZ1tdO1xuICBASW5wdXQoKVxuICBwcml2YXRlIGluY2x1ZGVEZWZhdWx0Q1NWID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBoZWFkZXJzQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nW10+KCk7XG5cbiAgcHVibGljIGhlYWRlcnM6IElHcm91cGVkSGVhZGVycyA9IHt9O1xuICBwdWJsaWMgYWxsU2VsZWN0ZWQgPSBmYWxzZTtcblxuICBwdWJsaWMgc2hvd1NlbGVjdFRlcm1GaWVsZHMgPSBmYWxzZTtcbiAgcHVibGljIHRlcm1GaWVsZHMgPSB0ZXJtRmllbGRzO1xuICBwdWJsaWMgdGVybUZpZWxkU2VsZWN0ZWQ6IGFueSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2NoZW1hU2VydmljZTogSGVTY2hlbWFTZXJ2aWNlXG4gICkge31cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCBzY2hlbWFzID0gYXdhaXQgdGhpcy5zY2hlbWFTZXJ2aWNlLnNjaGVtYXMoKTtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gYXdhaXQgdGhpcy5pc1NlbGVjdGVkKHNjaGVtYXMpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCB0aGlzLnNjaGVtYVNlcnZpY2UucGFyc2VIZWFkZXJzKHRoaXMuY3N2KTtcbiAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzLmZpbHRlcihpc0NTVkluY2x1ZGVkKHNjaGVtYXMpKS5yZWR1Y2UoKHByZXYsIGhlYWRlcikgPT4ge1xuICAgICAgY29uc3QgZ3JvdXAgPSBoZWFkZXJHcm91cChoZWFkZXIpO1xuICAgICAgcHJldltncm91cF0gPSBwcmV2W2dyb3VwXSB8fCB7IGhlYWRlcnM6IFtdLCBzZWxlY3RlZDogZmFsc2UsIHBhcnRpYWxTZWxlY3RlZDogZmFsc2UsIG9wZW46IHRydWUgfTtcbiAgICAgIHByZXZbZ3JvdXBdLmhlYWRlcnMucHVzaCh7IGhlYWRlciwgc2VsZWN0ZWQ6IGlzU2VsZWN0ZWQoaGVhZGVyKSB9KTtcbiAgICAgIHJldHVybiBwcmV2O1xuICAgIH0sIHt9IGFzIElHcm91cGVkSGVhZGVycyk7XG4gICAgT2JqZWN0LmtleXModGhpcy5oZWFkZXJzKS5tYXAoZ3JvdXBLZXkgPT4gdGhpcy51cGRhdGVHcm91cEhlYWRlcihncm91cEtleSkpO1xuICAgIHRoaXMudGVybUZpZWxkU2VsZWN0ZWQgPSB0ZXJtRmllbGRzLnJlZHVjZSgocHJldiwgY3VycikgPT4gKHsgLi4ucHJldiwgW2N1cnJdOiBjdXJyID09PSAnQGlkJyB9KSwge30pO1xuICAgIHRoaXMucmVyZXNoKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGlzU2VsZWN0ZWQoc2NoZW1hczogZGVmaW5pdGlvbnMpIHtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gdGhpcy5pbmNsdWRlRGVmYXVsdENTViA/ICgpID0+IHRydWUgOiBpc0RlZmF1bHRDU1ZTZWxlY3RlZChzY2hlbWFzKTtcbiAgICByZXR1cm4gKGtleTogc3RyaW5nKSA9PiAoIXRoaXMua2V5cz8ubGVuZ3RoIHx8IHRoaXMua2V5cy5zb21lKHYgPT4ga2V5LnN0YXJ0c1dpdGgodikpKSAmJiBpc1NlbGVjdGVkKGtleSk7XG4gIH1cblxuICBwdWJsaWMgZHJvcEhlYWRlcihldmVudDogQ2RrRHJhZ0Ryb3A8SUhlYWRlcltdPiwgZ3JvdXBLZXk6IHN0cmluZykge1xuICAgIG1vdmVJdGVtSW5BcnJheSh0aGlzLmhlYWRlcnNbZ3JvdXBLZXldLmhlYWRlcnMsIGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XG4gICAgdGhpcy5oZWFkZXJzQ2hhbmdlZC5lbWl0KHRoaXMuc2VsZWN0ZWRIZWFkZXJzKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQWxsU2VsZWN0ZWQoKSB7XG4gICAgdGhpcy5hbGxTZWxlY3RlZCA9IE9iamVjdC5rZXlzKHRoaXMuaGVhZGVycykuZXZlcnkoa2V5ID0+IHRoaXMuaGVhZGVyc1trZXldLnNlbGVjdGVkKTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVBbGwoKSB7XG4gICAgLy8gc2VsZWN0IGFsbCB0ZXJtIGZpZWxkc1xuICAgIE9iamVjdC5rZXlzKHRoaXMudGVybUZpZWxkU2VsZWN0ZWQpLm1hcChrZXkgPT4gKHRoaXMudGVybUZpZWxkU2VsZWN0ZWRba2V5XSA9IHRydWUpKTtcbiAgICAvLyBzZWxlY3QgYWxsIGtleXNcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5oZWFkZXJzKS5tYXAoKFtrZXksIGdyb3VwXSkgPT4ge1xuICAgICAgZ3JvdXAuc2VsZWN0ZWQgPSB0aGlzLmFsbFNlbGVjdGVkO1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlR3JvdXAoa2V5KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVHcm91cChncm91cEtleTogc3RyaW5nKSB7XG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLmhlYWRlcnNbZ3JvdXBLZXldO1xuICAgIGdyb3VwLmhlYWRlcnMubWFwKGhlYWRlciA9PiBoZWFkZXIuc2VsZWN0ZWQgPSBncm91cC5zZWxlY3RlZCk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlR3JvdXBIZWFkZXIoZ3JvdXBLZXk6IHN0cmluZykge1xuICAgIGNvbnN0IGdyb3VwID0gdGhpcy5oZWFkZXJzW2dyb3VwS2V5XTtcbiAgICBjb25zdCBhbGxTZWxlY3RlZCA9IGdyb3VwLmhlYWRlcnMuZXZlcnkoKHsgc2VsZWN0ZWQgfSkgPT4gc2VsZWN0ZWQpO1xuICAgIGdyb3VwLnNlbGVjdGVkID0gYWxsU2VsZWN0ZWQ7XG4gICAgZ3JvdXAucGFydGlhbFNlbGVjdGVkID0gIWFsbFNlbGVjdGVkICYmIGdyb3VwLmhlYWRlcnMuc29tZSgoeyBzZWxlY3RlZCB9KSA9PiBzZWxlY3RlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkSGVhZGVycygpIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmhlYWRlcnMpXG4gICAgICAuZmxhdE1hcCgoeyBoZWFkZXJzIH0pID0+IGhlYWRlcnMpXG4gICAgICAuZmlsdGVyKCh7IHNlbGVjdGVkIH0pID0+IHNlbGVjdGVkKVxuICAgICAgLm1hcCgoeyBoZWFkZXIgfSkgPT4gaGVhZGVyKTtcbiAgfVxuXG4gIHB1YmxpYyByZXJlc2goKSB7XG4gICAgdGhpcy51cGRhdGVBbGxTZWxlY3RlZCgpO1xuICAgIHRoaXMuaGVhZGVyc0NoYW5nZWQuZW1pdCh0aGlzLnNlbGVjdGVkSGVhZGVycyk7XG4gIH1cblxuICAvLyBUZXJtIGZpZWxkc1xuXG4gIHB1YmxpYyB0b2dnbGVUZXJtRmllbGQoZmllbGQ6IHN0cmluZykge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy50ZXJtRmllbGRTZWxlY3RlZFtmaWVsZF07XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMuaGVhZGVycykubWFwKChba2V5LCBncm91cF0pID0+IHtcbiAgICAgIGdyb3VwLmhlYWRlcnMuZmlsdGVyKGlzVGVybUZpZWxkKGZpZWxkKSkubWFwKGhlYWRlciA9PiBoZWFkZXIuc2VsZWN0ZWQgPSBzZWxlY3RlZCk7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVHcm91cEhlYWRlcihrZXkpO1xuICAgIH0pO1xuICB9XG59XG4iLCI8cCBjbGFzcz1cIm1iLTJcIj5QbGVhc2Ugc2VsZWN0IHdoaWNoIGNvbHVtbnMgeW91IHdvdWxkIGxpa2UgdG8gaW5jbHVkZTo8L3A+XG5cbjxwIGNsYXNzPVwibXktMiBpcy1zaXplLTdcIj48aT5Zb3UgY2FuIGRyYWcgYW5kIGRyb3AgdGhlIGhlYWRlcnMgdG8gc29ydCB0aGVtIGFzIHRoZXkgd291bGQgYXBwZWFyIGluIHRoZSBDU1YgZmlsZS48L2k+PC9wPlxuXG48ZGl2IGNsYXNzPVwiY29sdW1ucyB0b2dnbGUtYWxsIG14LTQgcGItMSBtYi0wXCI+XG4gIDxkaXYgY2xhc3M9XCJjb2x1bW5cIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveCBtbC0xXCI+XG4gICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJzZWxlY3RvclwiXG4gICAgICAgIFsobmdNb2RlbCldPVwiYWxsU2VsZWN0ZWRcIlxuICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZUFsbCgpOyByZXJlc2goKVwiXG4gICAgICA+XG4gICAgICA8c3BhbiBjbGFzcz1cIm1sLTJcIj5Ub2dnbGUgQWxsPC9zcGFuPlxuICAgIDwvbGFiZWw+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJjb2x1bW4gaXMtbmFycm93IGhhcy10ZXh0LXJpZ2h0XCI+XG4gICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duIGlzLXJpZ2h0IGhhcy10ZXh0LWxlZnRcIlxuICAgICAgW2NsYXNzLmlzLWFjdGl2ZV09XCJzaG93U2VsZWN0VGVybUZpZWxkc1wiXG4gICAgICAoY2xpY2tPdXRzaWRlKT1cInNob3dTZWxlY3RUZXJtRmllbGRzID0gZmFsc2VcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi10cmlnZ2VyXCIgKGNsaWNrKT1cInNob3dTZWxlY3RUZXJtRmllbGRzID0gIXNob3dTZWxlY3RUZXJtRmllbGRzXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIlxuICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCIgYXJpYS1jb250cm9scz1cInNlbGVjdC1tZW51XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuPlRvZ2dsZSBUZXJtIEZpZWxkczwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24gaXMtc21hbGxcIj5cbiAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJmaWx0ZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2ZhLWljb24+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiBpZD1cInNlbGVjdC1tZW51XCIgcm9sZT1cIm1lbnVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWNvbnRlbnRcIj5cbiAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGZpZWxkIG9mIHRlcm1GaWVsZHNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94IG1sLTFcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwic2VsZWN0b3JcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidGVybUZpZWxkU2VsZWN0ZWRbZmllbGRdXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVRlcm1GaWVsZChmaWVsZClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWwtMlwiPnt7ZmllbGR9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiZHJhZy1jb250YWluZXJcIj5cbiAgPGRpdiBjbGFzcz1cImNhcmRcIiAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgaGVhZGVycyB8IGtleXNcIj5cbiAgICA8aGVhZGVyIGNsYXNzPVwiY2FyZC1oZWFkZXJcIiAqbmdJZj1cImdyb3VwLmtleVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyLXRpdGxlXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94IG1sLTFcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJzZWxlY3RvclwiXG4gICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJncm91cC52YWx1ZS5wYXJ0aWFsU2VsZWN0ZWRcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJncm91cC52YWx1ZS5zZWxlY3RlZFwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cInVwZGF0ZUdyb3VwKGdyb3VwLmtleSk7IHJlcmVzaCgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtbC0yXCI+e3tncm91cC5rZXl9fTwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuICAgICAgPHNwYW4gY2xhc3M9XCJjYXJkLWhlYWRlci1pY29uIGhhcy10ZXh0LWxpbmtcIiBhcmlhLWxhYmVsPVwib3BlbiAvIGNsb3NlXCJcbiAgICAgICAgKGNsaWNrKT1cImdyb3VwLnZhbHVlLm9wZW4gPSAhZ3JvdXAudmFsdWUub3BlblwiIHBvaW50ZXJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+XG4gICAgICAgICAgPGZhLWljb24gaWNvbj1cImFuZ2xlLWRvd25cIiBbY2xhc3MuaXMtaGlkZGVuXT1cIiFncm91cC52YWx1ZS5vcGVuXCI+PC9mYS1pY29uPlxuICAgICAgICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1sZWZ0XCIgW2NsYXNzLmlzLWhpZGRlbl09XCJncm91cC52YWx1ZS5vcGVuXCI+PC9mYS1pY29uPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L3NwYW4+XG4gICAgPC9oZWFkZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50IHAtM1wiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIWdyb3VwLnZhbHVlLm9wZW5cIj5cbiAgICAgIDx1bCBjZGtEcm9wTGlzdCAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3BIZWFkZXIoJGV2ZW50LCBncm91cC5rZXkpXCI+XG4gICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgaGVhZGVyIG9mIGdyb3VwLnZhbHVlLmhlYWRlcnNcIiBjZGtEcmFnPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94IG1sLTJcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cInNlbGVjdG9yXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJoZWFkZXIuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cInVwZGF0ZUdyb3VwSGVhZGVyKGdyb3VwLmtleSk7IHJlcmVzaCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWwtMlwiPnt7aGVhZGVyLmhlYWRlcn19PC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvbGk+XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1jc3Ytc2VsZWN0LWhlYWRlcnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL25vZGUvbm9kZS1jc3Ytc2VsZWN0LWhlYWRlcnMvbm9kZS1jc3Ytc2VsZWN0LWhlYWRlcnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc3JjL25vZGUvbm9kZS1jc3Ytc2VsZWN0LWhlYWRlcnMvbm9kZS1jc3Ytc2VsZWN0LWhlYWRlcnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUFlLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXRFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxhQUFhLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQzs7Ozs7Ozs7O0FBc0I3RixNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQWMsRUFBRSxFQUFFO0lBQ3JDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEMsT0FBTyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbEUsQ0FBQyxDQUFDO0FBRUYsTUFBTSxVQUFVLEdBQUc7SUFDakIsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVTtDQUNuQyxDQUFDO0FBRUYsTUFBTSxXQUFXLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQVcsRUFBRSxFQUFFLENBQUM7SUFDOUQsTUFBTSxFQUFFLGFBQWEs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RSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRU0sT0FBTztRQUNaLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsY0FBYztJQUVQLGVBQWUsQ0FBQyxLQUFhO1FBQ2xDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDdkQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsQ0FBQztZQUNuRixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OzJIQWpHVSw2QkFBNkI7K0dBQTdCLDZCQUE2QiwrTEMzQzFDLGdsSUE2R0E7NEZEbEVhLDZCQUE2QjtrQkFMekMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsNEJBQTRCO29CQUN0QyxXQUFXLEVBQUUsMENBQTBDO29CQUN2RCxTQUFTLEVBQUUsQ0FBQywwQ0FBMEMsQ0FBQztpQkFDeEQ7c0dBR1MsR0FBRztzQkFEVixLQUFLO2dCQUdFLElBQUk7c0JBRFgsS0FBSztnQkFHRSxpQkFBaUI7c0JBRHhCLEtBQUs7Z0JBSUUsY0FBYztzQkFEckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENka0RyYWdEcm9wLCBtb3ZlSXRlbUluQXJyYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IGRlZmluaXRpb25zIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9qc29uLXNjaGVtYSc7XG5pbXBvcnQgeyBpc0RlZmF1bHRDU1ZTZWxlY3RlZCwgaXNDU1ZJbmNsdWRlZCB9IGZyb20gJ0BoZXN0aWEtZWFydGgvanNvbi1zY2hlbWEvc2NoZW1hLXV0aWxzJztcblxuaW1wb3J0IHsgSGVTY2hlbWFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2NoZW1hL3NjaGVtYS5zZXJ2aWNlJztcblxuaW50ZXJmYWNlIElIZWFkZXIge1xuICBoZWFkZXI6IHN0cmluZztcbiAgc2VsZWN0ZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBgZmFsc2VgIGlmIGl0IGlzIGFuIGBpbnRlcm5hbGAgZmllbGQuXG4gICAqL1xuICBpbmNsdWRlZDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIElHcm91cGVkSGVhZGVycyB7XG4gIFtncm91cDogc3RyaW5nXToge1xuICAgIHNlbGVjdGVkOiBib29sZWFuO1xuICAgIHBhcnRpYWxTZWxlY3RlZDogYm9vbGVhbjtcbiAgICBvcGVuOiBib29sZWFuO1xuICAgIGhlYWRlcnM6IElIZWFkZXJbXTtcbiAgfTtcbn1cblxuY29uc3QgaGVhZGVyR3JvdXAgPSAoaGVhZGVyOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgcGFydHMgPSBoZWFkZXIuc3BsaXQoJy4nKTtcbiAgcmV0dXJuIHBhcnRzLmxlbmd0aCA9PT0gMiA/ICcnIDogW3BhcnRzWzBdLCBwYXJ0c1sxXV0uam9pbignLicpO1xufTtcblxuY29uc3QgdGVybUZpZWxkcyA9IFtcbiAgJ0BpZCcsICduYW1lJywgJ3VuaXRzJywgJ3Rlcm1UeXBlJ1xuXTtcblxuY29uc3QgaXNUZXJtRmllbGQgPSAoZmllbGQ6IHN0cmluZykgPT4gKHsgaGVhZGVyIH06IElIZWFkZXIpID0+IFtcbiAgJ3Rlcm0nLCAnbWV0aG9kTW9kZWwnLCAnY291bnRyeScsICdwcm9kdWN0JywgJ29wZXJhdGlvbicsICdrZXknXG5dLnNvbWUocGFyZW50ID0+IGhlYWRlci5lbmRzV2l0aChbcGFyZW50LCBmaWVsZF0uam9pbignLicpKSk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2hlLW5vZGUtY3N2LXNlbGVjdC1oZWFkZXJzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL25vZGUtY3N2LXNlbGVjdC1oZWFkZXJzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbm9kZS1jc3Ytc2VsZWN0LWhlYWRlcnMuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBOb2RlQ3N2U2VsZWN0SGVhZGVyc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpXG4gIHByaXZhdGUgY3N2ID0gJyc7XG4gIEBJbnB1dCgpXG4gIHByaXZhdGUga2V5cz86IHN0cmluZ1tdO1xuICBASW5wdXQoKVxuICBwcml2YXRlIGluY2x1ZGVEZWZhdWx0Q1NWID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpXG4gIHByaXZhdGUgaGVhZGVyc0NoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xuXG4gIHB1YmxpYyBsb2FkaW5nID0gdHJ1ZTtcbiAgcHVibGljIGhlYWRlcnM6IElHcm91cGVkSGVhZGVycyA9IHt9O1xuICBwdWJsaWMgYWxsU2VsZWN0ZWQgPSBmYWxzZTtcblxuICBwdWJsaWMgc2hvd1NlbGVjdFRlcm1GaWVsZHMgPSBmYWxzZTtcbiAgcHVibGljIHRlcm1GaWVsZHMgPSB0ZXJtRmllbGRzO1xuICBwdWJsaWMgdGVybUZpZWxkU2VsZWN0ZWQ6IGFueSA9IHt9O1xuICBwdWJsaWMgc2hvd05vbkluY2x1ZGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzY2hlbWFTZXJ2aWNlOiBIZVNjaGVtYVNlcnZpY2VcbiAgKSB7fVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IHNjaGVtYXMgPSBhd2FpdCB0aGlzLnNjaGVtYVNlcnZpY2Uuc2NoZW1hcygpO1xuICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBhd2FpdCB0aGlzLmlzU2VsZWN0ZWQoc2NoZW1hcyk7XG4gICAgY29uc3QgaXNJbmNsdWRlZCA9IGlzQ1NWSW5jbHVkZWQoc2NoZW1hcyk7XG4gICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IHRoaXMuc2NoZW1hU2VydmljZS5wYXJzZUhlYWRlcnModGhpcy5jc3YpO1xuICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnMucmVkdWNlKChwcmV2LCBoZWFkZXIpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwID0gaGVhZGVyR3JvdXAoaGVhZGVyKTtcbiAgICAgIHByZXZbZ3JvdXBdID0gcHJldltncm91cF0gfHwgeyBoZWFkZXJzOiBbXSwgc2VsZWN0ZWQ6IGZhbHNlLCBwYXJ0aWFsU2VsZWN0ZWQ6IGZhbHNlLCBvcGVuOiB0cnVlIH07XG4gICAgICBwcmV2W2dyb3VwXS5oZWFkZXJzLnB1c2goeyBoZWFkZXIsIHNlbGVjdGVkOiBpc1NlbGVjdGVkKGhlYWRlciksIGluY2x1ZGVkOiBpc0luY2x1ZGVkKGhlYWRlcikgfSk7XG4gICAgICByZXR1cm4gcHJldjtcbiAgICB9LCB7fSBhcyBJR3JvdXBlZEhlYWRlcnMpO1xuICAgIE9iamVjdC5rZXlzKHRoaXMuaGVhZGVycykubWFwKGdyb3VwS2V5ID0+IHRoaXMudXBkYXRlR3JvdXBIZWFkZXIoZ3JvdXBLZXkpKTtcbiAgICB0aGlzLnRlcm1GaWVsZFNlbGVjdGVkID0gdGVybUZpZWxkcy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+ICh7IC4uLnByZXYsIFtjdXJyXTogY3VyciA9PT0gJ0BpZCcgfSksIHt9KTtcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaXNTZWxlY3RlZChzY2hlbWFzOiBkZWZpbml0aW9ucykge1xuICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSB0aGlzLmluY2x1ZGVEZWZhdWx0Q1NWID8gKCkgPT4gdHJ1ZSA6IGlzRGVmYXVsdENTVlNlbGVjdGVkKHNjaGVtYXMpO1xuICAgIHJldHVybiAoa2V5OiBzdHJpbmcpID0+ICghdGhpcy5rZXlzPy5sZW5ndGggfHwgdGhpcy5rZXlzLnNvbWUodiA9PiBrZXkuc3RhcnRzV2l0aCh2KSkpICYmIGlzU2VsZWN0ZWQoa2V5KTtcbiAgfVxuXG4gIHB1YmxpYyBkcm9wSGVhZGVyKGV2ZW50OiBDZGtEcmFnRHJvcDxJSGVhZGVyW10+LCBncm91cEtleTogc3RyaW5nKSB7XG4gICAgbW92ZUl0ZW1JbkFycmF5KHRoaXMuaGVhZGVyc1tncm91cEtleV0uaGVhZGVycywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcbiAgICB0aGlzLmhlYWRlcnNDaGFuZ2VkLmVtaXQodGhpcy5zZWxlY3RlZEhlYWRlcnMpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVBbGxTZWxlY3RlZCgpIHtcbiAgICB0aGlzLmFsbFNlbGVjdGVkID0gT2JqZWN0LmtleXModGhpcy5oZWFkZXJzKS5ldmVyeShrZXkgPT4gdGhpcy5oZWFkZXJzW2tleV0uc2VsZWN0ZWQpO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZUFsbCgpIHtcbiAgICAvLyBzZWxlY3QgYWxsIHRlcm0gZmllbGRzXG4gICAgT2JqZWN0LmtleXModGhpcy50ZXJtRmllbGRTZWxlY3RlZCkubWFwKGtleSA9PiAodGhpcy50ZXJtRmllbGRTZWxlY3RlZFtrZXldID0gdHJ1ZSkpO1xuICAgIC8vIHNlbGVjdCBhbGwga2V5c1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLmhlYWRlcnMpLm1hcCgoW2tleSwgZ3JvdXBdKSA9PiB7XG4gICAgICBncm91cC5zZWxlY3RlZCA9IHRoaXMuYWxsU2VsZWN0ZWQ7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVHcm91cChrZXkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZUdyb3VwKGdyb3VwS2V5OiBzdHJpbmcpIHtcbiAgICBjb25zdCBncm91cCA9IHRoaXMuaGVhZGVyc1tncm91cEtleV07XG4gICAgZ3JvdXAuaGVhZGVycy5tYXAoaGVhZGVyID0+IGhlYWRlci5zZWxlY3RlZCA9IGdyb3VwLnNlbGVjdGVkKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVHcm91cEhlYWRlcihncm91cEtleTogc3RyaW5nKSB7XG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLmhlYWRlcnNbZ3JvdXBLZXldO1xuICAgIGNvbnN0IGFsbFNlbGVjdGVkID0gZ3JvdXAuaGVhZGVycy5ldmVyeSgoeyBzZWxlY3RlZCB9KSA9PiBzZWxlY3RlZCk7XG4gICAgZ3JvdXAuc2VsZWN0ZWQgPSBhbGxTZWxlY3RlZDtcbiAgICBncm91cC5wYXJ0aWFsU2VsZWN0ZWQgPSAhYWxsU2VsZWN0ZWQgJiYgZ3JvdXAuaGVhZGVycy5zb21lKCh7IHNlbGVjdGVkIH0pID0+IHNlbGVjdGVkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2VsZWN0ZWRIZWFkZXJzKCkge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuaGVhZGVycylcbiAgICAgIC5mbGF0TWFwKCh7IGhlYWRlcnMgfSkgPT4gaGVhZGVycylcbiAgICAgIC5maWx0ZXIoKHsgc2VsZWN0ZWQsIGluY2x1ZGVkIH0pID0+IHNlbGVjdGVkICYmIChpbmNsdWRlZCB8fCB0aGlzLnNob3dOb25JbmNsdWRlZCkpXG4gICAgICAubWFwKCh7IGhlYWRlciB9KSA9PiBoZWFkZXIpO1xuICB9XG5cbiAgcHVibGljIHJlZnJlc2goKSB7XG4gICAgdGhpcy51cGRhdGVBbGxTZWxlY3RlZCgpO1xuICAgIHRoaXMuaGVhZGVyc0NoYW5nZWQuZW1pdCh0aGlzLnNlbGVjdGVkSGVhZGVycyk7XG4gIH1cblxuICAvLyBUZXJtIGZpZWxkc1xuXG4gIHB1YmxpYyB0b2dnbGVUZXJtRmllbGQoZmllbGQ6IHN0cmluZykge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy50ZXJtRmllbGRTZWxlY3RlZFtmaWVsZF07XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMuaGVhZGVycykubWFwKChba2V5LCBncm91cF0pID0+IHtcbiAgICAgIGdyb3VwLmhlYWRlcnMuZmlsdGVyKGlzVGVybUZpZWxkKGZpZWxkKSkubWFwKGhlYWRlciA9PiBoZWFkZXIuc2VsZWN0ZWQgPSBzZWxlY3RlZCk7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVHcm91cEhlYWRlcihrZXkpO1xuICAgIH0pO1xuICB9XG59XG4iLCI8cCBjbGFzcz1cIm1iLTJcIj5QbGVhc2Ugc2VsZWN0IHdoaWNoIGNvbHVtbnMgeW91IHdvdWxkIGxpa2UgdG8gaW5jbHVkZTo8L3A+XG5cbjxwIGNsYXNzPVwibXktMiBpcy1zaXplLTdcIj48aT5Zb3UgY2FuIGRyYWcgYW5kIGRyb3AgdGhlIGhlYWRlcnMgdG8gc29ydCB0aGVtIGFzIHRoZXkgd291bGQgYXBwZWFyIGluIHRoZSBDU1YgZmlsZS48L2k+PC9wPlxuXG48ZGl2IGNsYXNzPVwiY29sdW1ucyB0b2dnbGUtYWxsIG14LTQgcGItMSBtYi0wXCI+XG4gIDxkaXYgY2xhc3M9XCJjb2x1bW5cIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveCBtbC0xXCI+XG4gICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJzZWxlY3RvclwiXG4gICAgICAgIFsobmdNb2RlbCldPVwiYWxsU2VsZWN0ZWRcIlxuICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZUFsbCgpOyByZWZyZXNoKClcIlxuICAgICAgPlxuICAgICAgPHNwYW4gY2xhc3M9XCJtbC0yXCI+VG9nZ2xlIEFsbDwvc3Bhbj5cbiAgICA8L2xhYmVsPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiY29sdW1uIGlzLW5hcnJvdyBoYXMtdGV4dC1yaWdodFwiPlxuICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93biBpcy1yaWdodCBoYXMtdGV4dC1sZWZ0XCJcbiAgICAgIFtjbGFzcy5pcy1hY3RpdmVdPVwic2hvd1NlbGVjdFRlcm1GaWVsZHNcIlxuICAgICAgKGNsaWNrT3V0c2lkZSk9XCJzaG93U2VsZWN0VGVybUZpZWxkcyA9IGZhbHNlXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tdHJpZ2dlclwiIChjbGljayk9XCJzaG93U2VsZWN0VGVybUZpZWxkcyA9ICFzaG93U2VsZWN0VGVybUZpZWxkc1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsXCJcbiAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiIGFyaWEtY29udHJvbHM9XCJzZWxlY3QtbWVudVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3Bhbj5BZHZhbmNlZCBGaWx0ZXJzPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbiBpcy1zbWFsbFwiPlxuICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImZpbHRlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvZmEtaWNvbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiIGlkPVwic2VsZWN0LW1lbnVcIiByb2xlPVwibWVudVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tY29udGVudFwiPlxuICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3ggbWwtMVwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJzZWxlY3RvclwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzaG93Tm9uSW5jbHVkZWRcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwicmVmcmVzaCgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1sLTJcIj5JbmNsdWRlIDxjb2RlPmludGVybmFsPC9jb2RlPiBmaWVsZHM8L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24taXRlbVwiPlxuICAgICAgICAgICAgPHA+VG9nZ2xlIFRlcm0gRmllbGRzPC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgZmllbGQgb2YgdGVybUZpZWxkc1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3ggbWwtMVwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJzZWxlY3RvclwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ0ZXJtRmllbGRTZWxlY3RlZFtmaWVsZF1cIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlVGVybUZpZWxkKGZpZWxkKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtbC0yXCI+e3tmaWVsZH19PC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJkcmFnLWNvbnRhaW5lclwiICpuZ0lmPVwiIWxvYWRpbmc7IGVsc2UgbG9hZGVyXCI+XG4gIDxkaXYgY2xhc3M9XCJjYXJkXCIgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGhlYWRlcnMgfCBrZXlzXCI+XG4gICAgPGhlYWRlciBjbGFzcz1cImNhcmQtaGVhZGVyXCIgKm5nSWY9XCJncm91cC5rZXlcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlci10aXRsZVwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveCBtbC0xXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwic2VsZWN0b3JcIlxuICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiZ3JvdXAudmFsdWUucGFydGlhbFNlbGVjdGVkXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZ3JvdXAudmFsdWUuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJ1cGRhdGVHcm91cChncm91cC5rZXkpOyByZWZyZXNoKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1sLTJcIj57e2dyb3VwLmtleX19PC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgICA8c3BhbiBjbGFzcz1cImNhcmQtaGVhZGVyLWljb24gaGFzLXRleHQtbGlua1wiIGFyaWEtbGFiZWw9XCJvcGVuIC8gY2xvc2VcIlxuICAgICAgICAoY2xpY2spPVwiZ3JvdXAudmFsdWUub3BlbiA9ICFncm91cC52YWx1ZS5vcGVuXCIgcG9pbnRlclxuICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj5cbiAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwiYW5nbGUtZG93blwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIWdyb3VwLnZhbHVlLm9wZW5cIj48L2ZhLWljb24+XG4gICAgICAgICAgPGZhLWljb24gaWNvbj1cImFuZ2xlLWxlZnRcIiBbY2xhc3MuaXMtaGlkZGVuXT1cImdyb3VwLnZhbHVlLm9wZW5cIj48L2ZhLWljb24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2hlYWRlcj5cblxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnQgcC0zXCIgW2NsYXNzLmlzLWhpZGRlbl09XCIhZ3JvdXAudmFsdWUub3BlblwiPlxuICAgICAgPHVsIGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcEhlYWRlcigkZXZlbnQsIGdyb3VwLmtleSlcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaGVhZGVyIG9mIGdyb3VwLnZhbHVlLmhlYWRlcnNcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGVhZGVyLmluY2x1ZGVkIHx8IHNob3dOb25JbmNsdWRlZFwiPlxuICAgICAgICAgICAgPGxpIGNka0RyYWc+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94IG1sLTJcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJzZWxlY3RvclwiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImhlYWRlci5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInVwZGF0ZUdyb3VwSGVhZGVyKGdyb3VwLmtleSk7IHJlZnJlc2goKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWwtMlwiPnt7aGVhZGVyLmhlYWRlcn19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3VsPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2xvYWRlcj5cbiAgPGRpdiBjbGFzcz1cImhhcy10ZXh0LWNlbnRlciBweS0zXCI+XG4gICAgPGZhLWljb24gaWNvbj1cInNwaW5uZXJcIiBbcHVsc2VdPVwidHJ1ZVwiIHNpemU9XCJsZ1wiPjwvZmEtaWNvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -3997,26 +3997,30 @@ class NodeCsvSelectHeadersComponent {
3997
3997
  this.csv = '';
3998
3998
  this.includeDefaultCSV = false;
3999
3999
  this.headersChanged = new EventEmitter$1();
4000
+ this.loading = true;
4000
4001
  this.headers = {};
4001
4002
  this.allSelected = false;
4002
4003
  this.showSelectTermFields = false;
4003
4004
  this.termFields = termFields;
4004
4005
  this.termFieldSelected = {};
4006
+ this.showNonIncluded = false;
4005
4007
  }
4006
4008
  ngOnInit() {
4007
4009
  return __awaiter(this, void 0, void 0, function* () {
4008
4010
  const schemas = yield this.schemaService.schemas();
4009
4011
  const isSelected = yield this.isSelected(schemas);
4012
+ const isIncluded = isCSVIncluded(schemas);
4010
4013
  const headers = yield this.schemaService.parseHeaders(this.csv);
4011
- this.headers = headers.filter(isCSVIncluded(schemas)).reduce((prev, header) => {
4014
+ this.headers = headers.reduce((prev, header) => {
4012
4015
  const group = headerGroup(header);
4013
4016
  prev[group] = prev[group] || { headers: [], selected: false, partialSelected: false, open: true };
4014
- prev[group].headers.push({ header, selected: isSelected(header) });
4017
+ prev[group].headers.push({ header, selected: isSelected(header), included: isIncluded(header) });
4015
4018
  return prev;
4016
4019
  }, {});
4017
4020
  Object.keys(this.headers).map(groupKey => this.updateGroupHeader(groupKey));
4018
4021
  this.termFieldSelected = termFields.reduce((prev, curr) => (Object.assign(Object.assign({}, prev), { [curr]: curr === '@id' })), {});
4019
- this.reresh();
4022
+ this.refresh();
4023
+ this.loading = false;
4020
4024
  });
4021
4025
  }
4022
4026
  isSelected(schemas) {
@@ -4054,10 +4058,10 @@ class NodeCsvSelectHeadersComponent {
4054
4058
  get selectedHeaders() {
4055
4059
  return Object.values(this.headers)
4056
4060
  .flatMap(({ headers }) => headers)
4057
- .filter(({ selected }) => selected)
4061
+ .filter(({ selected, included }) => selected && (included || this.showNonIncluded))
4058
4062
  .map(({ header }) => header);
4059
4063
  }
4060
- reresh() {
4064
+ refresh() {
4061
4065
  this.updateAllSelected();
4062
4066
  this.headersChanged.emit(this.selectedHeaders);
4063
4067
  }
@@ -4071,7 +4075,7 @@ class NodeCsvSelectHeadersComponent {
4071
4075
  }
4072
4076
  }
4073
4077
  NodeCsvSelectHeadersComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: NodeCsvSelectHeadersComponent, deps: [{ token: HeSchemaService }], target: i0.ɵɵFactoryTarget.Component });
4074
- NodeCsvSelectHeadersComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: NodeCsvSelectHeadersComponent, selector: "he-node-csv-select-headers", inputs: { csv: "csv", keys: "keys", includeDefaultCSV: "includeDefaultCSV" }, outputs: { headersChanged: "headersChanged" }, ngImport: i0, template: "<p class=\"mb-2\">Please select which columns you would like to include:</p>\n\n<p class=\"my-2 is-size-7\"><i>You can drag and drop the headers to sort them as they would appear in the CSV file.</i></p>\n\n<div class=\"columns toggle-all mx-4 pb-1 mb-0\">\n <div class=\"column\">\n <label class=\"checkbox ml-1\">\n <input type=\"checkbox\" class=\"selector\"\n [(ngModel)]=\"allSelected\"\n (change)=\"toggleAll(); reresh()\"\n >\n <span class=\"ml-2\">Toggle All</span>\n </label>\n </div>\n\n <div class=\"column is-narrow has-text-right\">\n <div class=\"dropdown is-right has-text-left\"\n [class.is-active]=\"showSelectTermFields\"\n (clickOutside)=\"showSelectTermFields = false\"\n >\n <div class=\"dropdown-trigger\" (click)=\"showSelectTermFields = !showSelectTermFields\">\n <button class=\"button is-small\"\n aria-haspopup=\"true\" aria-controls=\"select-menu\"\n >\n <span>Toggle Term Fields</span>\n <span class=\"icon is-small\">\n <fa-icon icon=\"filter\" aria-hidden=\"true\"></fa-icon>\n </span>\n </button>\n </div>\n <div class=\"dropdown-menu\" id=\"select-menu\" role=\"menu\">\n <div class=\"dropdown-content\">\n <a class=\"dropdown-item\"\n *ngFor=\"let field of termFields\"\n >\n <label class=\"checkbox ml-1\">\n <input type=\"checkbox\" class=\"selector\"\n [(ngModel)]=\"termFieldSelected[field]\"\n (change)=\"toggleTermField(field)\"\n >\n <span class=\"ml-2\">{{field}}</span>\n </label>\n </a>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"drag-container\">\n <div class=\"card\" *ngFor=\"let group of headers | keys\">\n <header class=\"card-header\" *ngIf=\"group.key\">\n <div class=\"card-header-title\">\n <label class=\"checkbox ml-1\">\n <input type=\"checkbox\" class=\"selector\"\n [indeterminate]=\"group.value.partialSelected\"\n [(ngModel)]=\"group.value.selected\"\n (change)=\"updateGroup(group.key); reresh()\"\n >\n <span class=\"ml-2\">{{group.key}}</span>\n </label>\n </div>\n <span class=\"card-header-icon has-text-link\" aria-label=\"open / close\"\n (click)=\"group.value.open = !group.value.open\" pointer\n >\n <span class=\"icon\">\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!group.value.open\"></fa-icon>\n <fa-icon icon=\"angle-left\" [class.is-hidden]=\"group.value.open\"></fa-icon>\n </span>\n </span>\n </header>\n\n <div class=\"card-content p-3\" [class.is-hidden]=\"!group.value.open\">\n <ul cdkDropList (cdkDropListDropped)=\"dropHeader($event, group.key)\">\n <li *ngFor=\"let header of group.value.headers\" cdkDrag>\n <label class=\"checkbox ml-2\">\n <input type=\"checkbox\" class=\"selector\"\n [(ngModel)]=\"header.selected\"\n (change)=\"updateGroupHeader(group.key); reresh()\"\n >\n <span class=\"ml-2\">{{header.header}}</span>\n </label>\n </li>\n </ul>\n </div>\n </div>\n</div>\n", styles: [".toggle-all{border-bottom:1px solid #7a7a7a}.drag-container,.table-container{max-height:45vh;overflow-y:auto}.cdk-drag-preview{border-radius:2px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;list-style:none}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}\n"], components: [{ type: i1.FaIconComponent, selector: "fa-icon", inputs: ["classes", "icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }], directives: [{ type: i1$4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i1$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: ClickOutsideDirective, selector: "[clickOutside]", outputs: ["clickOutside"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6$1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "id", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListAutoScrollDisabled", "cdkDropListOrientation", "cdkDropListLockAxis", "cdkDropListData", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { type: i6$1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragDisabled", "cdkDragStartDelay", "cdkDragLockAxis", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragBoundary", "cdkDragRootElement", "cdkDragPreviewContainer", "cdkDragData", "cdkDragFreeDragPosition"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }], pipes: { "keys": KeysPipe } });
4078
+ NodeCsvSelectHeadersComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: NodeCsvSelectHeadersComponent, selector: "he-node-csv-select-headers", inputs: { csv: "csv", keys: "keys", includeDefaultCSV: "includeDefaultCSV" }, outputs: { headersChanged: "headersChanged" }, ngImport: i0, template: "<p class=\"mb-2\">Please select which columns you would like to include:</p>\n\n<p class=\"my-2 is-size-7\"><i>You can drag and drop the headers to sort them as they would appear in the CSV file.</i></p>\n\n<div class=\"columns toggle-all mx-4 pb-1 mb-0\">\n <div class=\"column\">\n <label class=\"checkbox ml-1\">\n <input type=\"checkbox\" class=\"selector\"\n [(ngModel)]=\"allSelected\"\n (change)=\"toggleAll(); refresh()\"\n >\n <span class=\"ml-2\">Toggle All</span>\n </label>\n </div>\n\n <div class=\"column is-narrow has-text-right\">\n <div class=\"dropdown is-right has-text-left\"\n [class.is-active]=\"showSelectTermFields\"\n (clickOutside)=\"showSelectTermFields = false\"\n >\n <div class=\"dropdown-trigger\" (click)=\"showSelectTermFields = !showSelectTermFields\">\n <button class=\"button is-small\"\n aria-haspopup=\"true\" aria-controls=\"select-menu\"\n >\n <span>Advanced Filters</span>\n <span class=\"icon is-small\">\n <fa-icon icon=\"filter\" aria-hidden=\"true\"></fa-icon>\n </span>\n </button>\n </div>\n <div class=\"dropdown-menu\" id=\"select-menu\" role=\"menu\">\n <div class=\"dropdown-content\">\n <a class=\"dropdown-item\">\n <label class=\"checkbox ml-1\">\n <input type=\"checkbox\" class=\"selector\"\n [(ngModel)]=\"showNonIncluded\"\n (change)=\"refresh()\"\n >\n <span class=\"ml-2\">Include <code>internal</code> fields</span>\n </label>\n </a>\n <div class=\"dropdown-item\">\n <p>Toggle Term Fields</p>\n </div>\n <a class=\"dropdown-item\"\n *ngFor=\"let field of termFields\"\n >\n <label class=\"checkbox ml-1\">\n <input type=\"checkbox\" class=\"selector\"\n [(ngModel)]=\"termFieldSelected[field]\"\n (change)=\"toggleTermField(field)\"\n >\n <span class=\"ml-2\">{{field}}</span>\n </label>\n </a>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"drag-container\" *ngIf=\"!loading; else loader\">\n <div class=\"card\" *ngFor=\"let group of headers | keys\">\n <header class=\"card-header\" *ngIf=\"group.key\">\n <div class=\"card-header-title\">\n <label class=\"checkbox ml-1\">\n <input type=\"checkbox\" class=\"selector\"\n [indeterminate]=\"group.value.partialSelected\"\n [(ngModel)]=\"group.value.selected\"\n (change)=\"updateGroup(group.key); refresh()\"\n >\n <span class=\"ml-2\">{{group.key}}</span>\n </label>\n </div>\n <span class=\"card-header-icon has-text-link\" aria-label=\"open / close\"\n (click)=\"group.value.open = !group.value.open\" pointer\n >\n <span class=\"icon\">\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!group.value.open\"></fa-icon>\n <fa-icon icon=\"angle-left\" [class.is-hidden]=\"group.value.open\"></fa-icon>\n </span>\n </span>\n </header>\n\n <div class=\"card-content p-3\" [class.is-hidden]=\"!group.value.open\">\n <ul cdkDropList (cdkDropListDropped)=\"dropHeader($event, group.key)\">\n <ng-container *ngFor=\"let header of group.value.headers\">\n <ng-container *ngIf=\"header.included || showNonIncluded\">\n <li cdkDrag>\n <label class=\"checkbox ml-2\">\n <input type=\"checkbox\" class=\"selector\"\n [(ngModel)]=\"header.selected\"\n (change)=\"updateGroupHeader(group.key); refresh()\"\n >\n <span class=\"ml-2\">{{header.header}}</span>\n </label>\n </li>\n </ng-container>\n </ng-container>\n </ul>\n </div>\n </div>\n</div>\n\n<ng-template #loader>\n <div class=\"has-text-center py-3\">\n <fa-icon icon=\"spinner\" [pulse]=\"true\" size=\"lg\"></fa-icon>\n </div>\n</ng-template>\n", styles: [".toggle-all{border-bottom:1px solid #7a7a7a}.drag-container,.table-container{max-height:45vh;overflow-y:auto}.cdk-drag-preview{border-radius:2px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;list-style:none}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}\n"], components: [{ type: i1.FaIconComponent, selector: "fa-icon", inputs: ["classes", "icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }], directives: [{ type: i1$4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i1$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: ClickOutsideDirective, selector: "[clickOutside]", outputs: ["clickOutside"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6$1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "id", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListAutoScrollDisabled", "cdkDropListOrientation", "cdkDropListLockAxis", "cdkDropListData", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { type: i6$1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragDisabled", "cdkDragStartDelay", "cdkDragLockAxis", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragBoundary", "cdkDragRootElement", "cdkDragPreviewContainer", "cdkDragData", "cdkDragFreeDragPosition"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }], pipes: { "keys": KeysPipe } });
4075
4079
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: NodeCsvSelectHeadersComponent, decorators: [{
4076
4080
  type: Component$1,
4077
4081
  args: [{