UNPKG

@alfresco/adf-content-services

Version:
115 lines 24.3 kB
/*! * @license * Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { TranslationService } from '@alfresco/adf-core'; import { Component, DestroyRef, EventEmitter, inject, Input, Output, ViewEncapsulation } from '@angular/core'; import { TagService } from '../services/tag.service'; import { CommonModule } from '@angular/common'; import { MatListModule } from '@angular/material/list'; import { MatIconModule } from '@angular/material/icon'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; import { TranslateModule } from '@ngx-translate/core'; import { FormsModule } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import * as i0 from "@angular/core"; import * as i1 from "../services/tag.service"; import * as i2 from "@alfresco/adf-core"; import * as i3 from "@angular/common"; import * as i4 from "@angular/material/list"; import * as i5 from "@angular/material/icon"; import * as i6 from "@angular/material/form-field"; import * as i7 from "@angular/material/input"; import * as i8 from "@ngx-translate/core"; import * as i9 from "@angular/forms"; import * as i10 from "@angular/material/button"; /** * * This component, provide a list of the tags relative a node with actions button to add or remove new tag */ export class TagActionsComponent { constructor(tagService, translateService) { this.tagService = tagService; this.translateService = translateService; /** Emitted when a tag is added successfully. */ this.successAdd = new EventEmitter(); /** Emitted when an error occurs. */ this.error = new EventEmitter(); /** Emitted when an action is chosen. */ this.result = new EventEmitter(); this.disableAddTag = true; this.destroyRef = inject(DestroyRef); } ngOnInit() { this.tagService.refresh.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => this.refreshTag()); } ngOnChanges() { return this.refreshTag(); } refreshTag() { if (this.nodeId) { this.tagService.getTagsByNodeId(this.nodeId).subscribe((tagPaging) => { this.tagsEntries = tagPaging.list.entries; this.disableAddTag = false; this.result.emit(this.tagsEntries); }, () => { this.tagsEntries = null; this.disableAddTag = true; this.result.emit(this.tagsEntries); }); } } addTag() { if (this.searchTag(this.newTagName)) { this.errorMsg = this.translateService.instant('TAG.MESSAGES.EXIST'); this.error.emit(this.errorMsg); } else { this.tagService.addTag(this.nodeId, this.newTagName).subscribe(() => { this.newTagName = ''; this.successAdd.emit(this.nodeId); }); } } searchTag(searchTagName) { if (this.tagsEntries) { return this.tagsEntries.find((currentTag) => searchTagName === currentTag.entry.tag); } } cleanErrorMsg() { this.errorMsg = ''; } removeTag(tag) { this.tagService.removeTag(this.nodeId, tag); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: TagActionsComponent, deps: [{ token: i1.TagService }, { token: i2.TranslationService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: TagActionsComponent, isStandalone: true, selector: "adf-tag-node-actions-list", inputs: { nodeId: "nodeId" }, outputs: { successAdd: "successAdd", error: "error", result: "result" }, host: { classAttribute: "adf-tag-node-actions-list" }, usesOnChanges: true, ngImport: i0, template: "<mat-list>\n <mat-list-item *ngFor=\"let currentEntry of tagsEntries; let idx = index\">\n <div\n class=\"adf-tag-actions-container\"\n id=\"tag_delete_{{ currentEntry.entry.tag }}\"\n tabindex=\"0\"\n role=\"button\"\n (keyup.enter)=\"removeTag(currentEntry.entry.id)\"\n (click)=\"removeTag(currentEntry.entry.id)\"\n >\n <div class=\"adf-tag-actions-delete-text\" id=\"tag_name_{{ currentEntry.entry.tag }}\">{{ currentEntry.entry.tag }}</div>\n <mat-icon class=\"adf-tag-actions-delete-icon\">delete</mat-icon>\n </div>\n </mat-list-item>\n</mat-list>\n<table class=\"adf-full-width\" cellspacing=\"0\">\n <tr>\n <td>\n <mat-form-field class=\"adf-full-width\">\n <input\n id=\"new-tag-text\"\n matInput\n placeholder=\"{{ 'TAG.LABEL.NEWTAG' | translate }}\"\n type=\"text\"\n (keypress)=\"cleanErrorMsg()\"\n [(ngModel)]=\"newTagName\"\n />\n <mat-hint data-automation-id=\"errorMessage\" *ngIf=\"error\" [ngStyle]=\"{ color: 'red' }\" align=\"start\">{{ errorMsg }} </mat-hint>\n </mat-form-field>\n </td>\n <td>\n <button id=\"add-tag\" class=\"adf-full-width\" color=\"primary\" (click)=\"addTag()\" [disabled]=\"disableAddTag\" mat-raised-button>\n {{ 'TAG.BUTTON.ADD' | translate }}\n </button>\n </td>\n </tr>\n</table>\n", styles: [".adf-tag-node-actions-list .adf-full-width{width:100%}.adf-tag-node-actions-list .adf-tag-actions-delete-icon{float:right;cursor:pointer}.adf-tag-node-actions-list .adf-tag-actions-delete-text{font-size:var(--theme-subheading-2-font-size);float:left}.adf-tag-node-actions-list .adf-tag-actions-container{padding:8px 0;height:20px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatListModule }, { kind: "component", type: i4.MatList, selector: "mat-list", exportAs: ["matList"] }, { kind: "component", type: i4.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i9.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: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i10.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: TagActionsComponent, decorators: [{ type: Component, args: [{ selector: 'adf-tag-node-actions-list', standalone: true, imports: [CommonModule, MatListModule, MatIconModule, MatFormFieldModule, MatInputModule, TranslateModule, FormsModule, MatButtonModule], encapsulation: ViewEncapsulation.None, host: { class: 'adf-tag-node-actions-list' }, template: "<mat-list>\n <mat-list-item *ngFor=\"let currentEntry of tagsEntries; let idx = index\">\n <div\n class=\"adf-tag-actions-container\"\n id=\"tag_delete_{{ currentEntry.entry.tag }}\"\n tabindex=\"0\"\n role=\"button\"\n (keyup.enter)=\"removeTag(currentEntry.entry.id)\"\n (click)=\"removeTag(currentEntry.entry.id)\"\n >\n <div class=\"adf-tag-actions-delete-text\" id=\"tag_name_{{ currentEntry.entry.tag }}\">{{ currentEntry.entry.tag }}</div>\n <mat-icon class=\"adf-tag-actions-delete-icon\">delete</mat-icon>\n </div>\n </mat-list-item>\n</mat-list>\n<table class=\"adf-full-width\" cellspacing=\"0\">\n <tr>\n <td>\n <mat-form-field class=\"adf-full-width\">\n <input\n id=\"new-tag-text\"\n matInput\n placeholder=\"{{ 'TAG.LABEL.NEWTAG' | translate }}\"\n type=\"text\"\n (keypress)=\"cleanErrorMsg()\"\n [(ngModel)]=\"newTagName\"\n />\n <mat-hint data-automation-id=\"errorMessage\" *ngIf=\"error\" [ngStyle]=\"{ color: 'red' }\" align=\"start\">{{ errorMsg }} </mat-hint>\n </mat-form-field>\n </td>\n <td>\n <button id=\"add-tag\" class=\"adf-full-width\" color=\"primary\" (click)=\"addTag()\" [disabled]=\"disableAddTag\" mat-raised-button>\n {{ 'TAG.BUTTON.ADD' | translate }}\n </button>\n </td>\n </tr>\n</table>\n", styles: [".adf-tag-node-actions-list .adf-full-width{width:100%}.adf-tag-node-actions-list .adf-tag-actions-delete-icon{float:right;cursor:pointer}.adf-tag-node-actions-list .adf-tag-actions-delete-text{font-size:var(--theme-subheading-2-font-size);float:left}.adf-tag-node-actions-list .adf-tag-actions-container{padding:8px 0;height:20px}\n"] }] }], ctorParameters: () => [{ type: i1.TagService }, { type: i2.TranslationService }], propDecorators: { nodeId: [{ type: Input, args: [{ required: true }] }], successAdd: [{ type: Output }], error: [{ type: Output }], result: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnLWFjdGlvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL2NvbnRlbnQtc2VydmljZXMvc3JjL2xpYi90YWcvdGFnLWFjdGlvbnMvdGFnLWFjdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL2NvbnRlbnQtc2VydmljZXMvc3JjL2xpYi90YWcvdGFnLWFjdGlvbnMvdGFnLWFjdGlvbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqSSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7Ozs7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O1FBQ2pCLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDaEQsQ0FBQzs4R0EzRVEsbUJBQW1CO2tHQUFuQixtQkFBbUIsd1FDN0NoQyxpa0RBcUNBLHFZREVjLFlBQVksb1ZBQUUsYUFBYSx1UkFBRSxhQUFhLG1MQUFFLGtCQUFrQixpVUFBRSxjQUFjLDBXQUFFLGVBQWUsMkZBQUUsV0FBVyw4bUJBQUUsZUFBZTs7MkZBTTlILG1CQUFtQjtrQkFUL0IsU0FBUzsrQkFDSSwyQkFBMkIsY0FDekIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsZUFBZSxDQUFDLGlCQUd6SCxpQkFBaUIsQ0FBQyxJQUFJLFFBQy9CLEVBQUUsS0FBSyxFQUFFLDJCQUEyQixFQUFFO2dIQUs1QyxNQUFNO3NCQURMLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUt6QixVQUFVO3NCQURULE1BQU07Z0JBS1AsS0FBSztzQkFESixNQUFNO2dCQUtQLE1BQU07c0JBREwsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCDCqSAyMDA1LTIwMjUgSHlsYW5kIFNvZnR3YXJlLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnQGFsZnJlc2NvL2FkZi1jb3JlJztcbmltcG9ydCB7IENvbXBvbmVudCwgRGVzdHJveVJlZiwgRXZlbnRFbWl0dGVyLCBpbmplY3QsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGFnU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3RhZy5zZXJ2aWNlJztcbmltcG9ydCB7IFRhZ1BhZ2luZyB9IGZyb20gJ0BhbGZyZXNjby9qcy1hcGknO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdExpc3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9saXN0JztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcblxuLyoqXG4gKlxuICogVGhpcyBjb21wb25lbnQsIHByb3ZpZGUgYSBsaXN0IG9mIHRoZSB0YWdzIHJlbGF0aXZlIGEgbm9kZSB3aXRoIGFjdGlvbnMgYnV0dG9uIHRvIGFkZCBvciByZW1vdmUgbmV3IHRhZ1xuICovXG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYWRmLXRhZy1ub2RlLWFjdGlvbnMtbGlzdCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRMaXN0TW9kdWxlLCBNYXRJY29uTW9kdWxlLCBNYXRGb3JtRmllbGRNb2R1bGUsIE1hdElucHV0TW9kdWxlLCBUcmFuc2xhdGVNb2R1bGUsIEZvcm1zTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGVdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90YWctYWN0aW9ucy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vdGFnLWFjdGlvbnMuY29tcG9uZW50LnNjc3MnXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGhvc3Q6IHsgY2xhc3M6ICdhZGYtdGFnLW5vZGUtYWN0aW9ucy1saXN0JyB9XG59KVxuZXhwb3J0IGNsYXNzIFRhZ0FjdGlvbnNDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCB7XG4gICAgLyoqIFRoZSBpZGVudGlmaWVyIG9mIGEgbm9kZS4gKi9cbiAgICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICAgIG5vZGVJZDogc3RyaW5nO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiBhIHRhZyBpcyBhZGRlZCBzdWNjZXNzZnVsbHkuICovXG4gICAgQE91dHB1dCgpXG4gICAgc3VjY2Vzc0FkZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIGFuIGVycm9yIG9jY3Vycy4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBlcnJvcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIGFuIGFjdGlvbiBpcyBjaG9zZW4uICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVzdWx0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgbmV3VGFnTmFtZTogc3RyaW5nO1xuICAgIHRhZ3NFbnRyaWVzOiBhbnk7XG4gICAgZXJyb3JNc2c6IHN0cmluZztcbiAgICBkaXNhYmxlQWRkVGFnOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdGFnU2VydmljZTogVGFnU2VydmljZSwgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGlvblNlcnZpY2UpIHt9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy50YWdTZXJ2aWNlLnJlZnJlc2gucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMucmVmcmVzaFRhZygpKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaFRhZygpO1xuICAgIH1cblxuICAgIHJlZnJlc2hUYWcoKSB7XG4gICAgICAgIGlmICh0aGlzLm5vZGVJZCkge1xuICAgICAgICAgICAgdGhpcy50YWdTZXJ2aWNlLmdldFRhZ3NCeU5vZGVJZCh0aGlzLm5vZGVJZCkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICh0YWdQYWdpbmc6IFRhZ1BhZ2luZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhZ3NFbnRyaWVzID0gdGFnUGFnaW5nLmxpc3QuZW50cmllcztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlQWRkVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0LmVtaXQodGhpcy50YWdzRW50cmllcyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFnc0VudHJpZXMgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVBZGRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3VsdC5lbWl0KHRoaXMudGFnc0VudHJpZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRUYWcoKSB7XG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFRhZyh0aGlzLm5ld1RhZ05hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yTXNnID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ1RBRy5NRVNTQUdFUy5FWElTVCcpO1xuICAgICAgICAgICAgdGhpcy5lcnJvci5lbWl0KHRoaXMuZXJyb3JNc2cpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50YWdTZXJ2aWNlLmFkZFRhZyh0aGlzLm5vZGVJZCwgdGhpcy5uZXdUYWdOYW1lKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmV3VGFnTmFtZSA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuc3VjY2Vzc0FkZC5lbWl0KHRoaXMubm9kZUlkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VhcmNoVGFnKHNlYXJjaFRhZ05hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy50YWdzRW50cmllcykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGFnc0VudHJpZXMuZmluZCgoY3VycmVudFRhZykgPT4gc2VhcmNoVGFnTmFtZSA9PT0gY3VycmVudFRhZy5lbnRyeS50YWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2xlYW5FcnJvck1zZygpIHtcbiAgICAgICAgdGhpcy5lcnJvck1zZyA9ICcnO1xuICAgIH1cblxuICAgIHJlbW92ZVRhZyh0YWc6IHN0cmluZykge1xuICAgICAgICB0aGlzLnRhZ1NlcnZpY2UucmVtb3ZlVGFnKHRoaXMubm9kZUlkLCB0YWcpO1xuICAgIH1cbn1cbiIsIjxtYXQtbGlzdD5cbiAgICA8bWF0LWxpc3QtaXRlbSAqbmdGb3I9XCJsZXQgY3VycmVudEVudHJ5IG9mIHRhZ3NFbnRyaWVzOyBsZXQgaWR4ID0gaW5kZXhcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJhZGYtdGFnLWFjdGlvbnMtY29udGFpbmVyXCJcbiAgICAgICAgICAgIGlkPVwidGFnX2RlbGV0ZV97eyBjdXJyZW50RW50cnkuZW50cnkudGFnIH19XCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJyZW1vdmVUYWcoY3VycmVudEVudHJ5LmVudHJ5LmlkKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlVGFnKGN1cnJlbnRFbnRyeS5lbnRyeS5pZClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRmLXRhZy1hY3Rpb25zLWRlbGV0ZS10ZXh0XCIgaWQ9XCJ0YWdfbmFtZV97eyBjdXJyZW50RW50cnkuZW50cnkudGFnIH19XCI+e3sgY3VycmVudEVudHJ5LmVudHJ5LnRhZyB9fTwvZGl2PlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiYWRmLXRhZy1hY3Rpb25zLWRlbGV0ZS1pY29uXCI+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9tYXQtbGlzdC1pdGVtPlxuPC9tYXQtbGlzdD5cbjx0YWJsZSBjbGFzcz1cImFkZi1mdWxsLXdpZHRoXCIgY2VsbHNwYWNpbmc9XCIwXCI+XG4gICAgPHRyPlxuICAgICAgICA8dGQ+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJhZGYtZnVsbC13aWR0aFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICBpZD1cIm5ldy10YWctdGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ1RBRy5MQUJFTC5ORVdUQUcnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5cHJlc3MpPVwiY2xlYW5FcnJvck1zZygpXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJuZXdUYWdOYW1lXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxtYXQtaGludCBkYXRhLWF1dG9tYXRpb24taWQ9XCJlcnJvck1lc3NhZ2VcIiAqbmdJZj1cImVycm9yXCIgW25nU3R5bGVdPVwieyBjb2xvcjogJ3JlZCcgfVwiIGFsaWduPVwic3RhcnRcIj57eyBlcnJvck1zZyB9fSA8L21hdC1oaW50PlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPHRkPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImFkZC10YWdcIiBjbGFzcz1cImFkZi1mdWxsLXdpZHRoXCIgY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImFkZFRhZygpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVBZGRUYWdcIiBtYXQtcmFpc2VkLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICB7eyAnVEFHLkJVVFRPTi5BREQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC90ZD5cbiAgICA8L3RyPlxuPC90YWJsZT5cbiJdfQ==