UNPKG

@taiga-ui/addon-doc

Version:

Taiga UI based library for developing documentation portals for Angular libraries.

134 lines 19.1 kB
import { Location } from '@angular/common'; import { Directive, EventEmitter, inject, Input, Output, signal, TemplateRef, } from '@angular/core'; import { ActivatedRoute, UrlSerializer } from '@angular/router'; import { TUI_DOC_URL_STATE_HANDLER } from '@taiga-ui/addon-doc/tokens'; import { tuiCleanObject, tuiCoerceValue, tuiInspectAny } from '@taiga-ui/addon-doc/utils'; import { tuiIsNumber } from '@taiga-ui/cdk/utils/miscellaneous'; import { TuiAlertService } from '@taiga-ui/core/components/alert'; import { Subject } from 'rxjs'; import * as i0 from "@angular/core"; const SERIALIZED_SUFFIX = '$'; // @bad TODO: refactor output and value sync class TuiDocDocumentationPropertyConnector { constructor() { this.locationRef = inject(Location); this.activatedRoute = inject(ActivatedRoute); this.urlSerializer = inject(UrlSerializer); this.urlStateHandler = inject(TUI_DOC_URL_STATE_HANDLER); this.alerts = inject(TuiAlertService); this.documentationPropertyName = ''; this.documentationPropertyMode = null; this.documentationPropertyType = ''; this.documentationPropertyDeprecated = false; this.documentationPropertyValues = null; this.documentationPropertyValueChange = new EventEmitter(); this.changed$ = new Subject(); this.emits = signal(1); this.template = inject(TemplateRef); } get attrName() { switch (this.documentationPropertyMode) { case 'input': return `[${this.documentationPropertyName}]`; case 'input-output': return `[(${this.documentationPropertyName})]`; case 'output': return `(${this.documentationPropertyName})`; default: return this.documentationPropertyName; } } get shouldShowValues() { return this.documentationPropertyMode !== 'output'; } get hasItems() { return !!this.documentationPropertyValues; } ngOnInit() { this.parseParams(this.activatedRoute.snapshot.queryParams); } ngOnChanges() { this.changed$.next(); } onValueChange(value) { this.documentationPropertyValue = value; this.documentationPropertyValueChange.emit(value); this.setQueryParam(value); } emitEvent(event) { // For more convenient debugging console.info(this.attrName, event); this.emits.update((x) => ++x); let content; if (event !== undefined) { content = tuiInspectAny(event, 2); } this.alerts.open(content, { label: this.attrName }).subscribe(); } parseParams(params) { const propertyValue = params[this.documentationPropertyName]; const propertyValueWithSuffix = params[`${this.documentationPropertyName}${SERIALIZED_SUFFIX}`]; if (!propertyValue && !propertyValueWithSuffix) { return; } let value = !!propertyValueWithSuffix && this.documentationPropertyValues ? this.documentationPropertyValues[propertyValueWithSuffix] : tuiCoerceValue(propertyValue); if (this.documentationPropertyType === 'string' && tuiIsNumber(value)) { value = value.toString(); } this.onValueChange(value); } setQueryParam(value) { const tree = this.urlSerializer.parse(this.locationRef.path()); const isValueAvailableByKey = value instanceof Object; const name = this.documentationPropertyName; const nameWithSuffix = `${name}${SERIALIZED_SUFFIX}`; const computedValue = isValueAvailableByKey && this.documentationPropertyValues ? this.documentationPropertyValues.indexOf(value) : value; tree.queryParams = tuiCleanObject({ ...tree.queryParams, /** * Caretaker note: reset previous conflicted param in route * issue: https://github.com/taiga-family/taiga-ui/issues/9764 */ ...(isValueAvailableByKey ? { [nameWithSuffix]: computedValue, [name]: undefined, } : { [nameWithSuffix]: undefined, [name]: computedValue, }), }); this.locationRef.go(this.urlStateHandler(tree)); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiDocDocumentationPropertyConnector, deps: [], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TuiDocDocumentationPropertyConnector, isStandalone: true, selector: "ng-template[documentationPropertyName]", inputs: { documentationPropertyName: "documentationPropertyName", documentationPropertyMode: "documentationPropertyMode", documentationPropertyType: "documentationPropertyType", documentationPropertyValue: "documentationPropertyValue", documentationPropertyDeprecated: "documentationPropertyDeprecated", documentationPropertyValues: "documentationPropertyValues" }, outputs: { documentationPropertyValueChange: "documentationPropertyValueChange" }, exportAs: ["documentationProperty"], usesOnChanges: true, ngImport: i0 }); } } export { TuiDocDocumentationPropertyConnector }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiDocDocumentationPropertyConnector, decorators: [{ type: Directive, args: [{ standalone: true, selector: 'ng-template[documentationPropertyName]', exportAs: 'documentationProperty', }] }], propDecorators: { documentationPropertyName: [{ type: Input }], documentationPropertyMode: [{ type: Input }], documentationPropertyType: [{ type: Input }], documentationPropertyValue: [{ type: Input }], documentationPropertyDeprecated: [{ type: Input }], documentationPropertyValues: [{ type: Input }], documentationPropertyValueChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnRhdGlvbi1wcm9wZXJ0eS1jb25uZWN0b3IuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWRkb24tZG9jL2NvbXBvbmVudHMvZG9jdW1lbnRhdGlvbi9kb2N1bWVudGF0aW9uLXByb3BlcnR5LWNvbm5lY3Rvci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXpDLE9BQU8sRUFDSCxTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixXQUFXLEdBQ2QsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFDLGNBQWMsRUFBRSxhQUFhLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM5RCxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRSxPQUFPLEVBQUMsY0FBYyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUN4RixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFDOUQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7O0FBRTdCLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUFDO0FBSTlCLDRDQUE0QztBQUM1QyxNQUthLG9DQUFvQztJQUxqRDtRQU1xQixnQkFBVyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQixtQkFBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN4QyxrQkFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN0QyxvQkFBZSxHQUFHLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3BELFdBQU0sR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFHM0MsOEJBQXlCLEdBQUcsRUFBRSxDQUFDO1FBRy9CLDhCQUF5QixHQUFpQyxJQUFJLENBQUM7UUFHL0QsOEJBQXlCLEdBQUcsRUFBRSxDQUFDO1FBTS9CLG9DQUErQixHQUFHLEtBQUssQ0FBQztRQUd4QyxnQ0FBMkIsR0FBd0IsSUFBSSxDQUFDO1FBRy9DLHFDQUFnQyxHQUFHLElBQUksWUFBWSxFQUFLLENBQUM7UUFFekQsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFL0IsVUFBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVsQixhQUFRLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0tBdUdsRDtJQXJHRyxJQUFXLFFBQVE7UUFDZixRQUFRLElBQUksQ0FBQyx5QkFBeUIsRUFBRTtZQUNwQyxLQUFLLE9BQU87Z0JBQ1IsT0FBTyxJQUFJLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxDQUFDO1lBQ2pELEtBQUssY0FBYztnQkFDZixPQUFPLEtBQUssSUFBSSxDQUFDLHlCQUF5QixJQUFJLENBQUM7WUFDbkQsS0FBSyxRQUFRO2dCQUNULE9BQU8sSUFBSSxJQUFJLENBQUMseUJBQXlCLEdBQUcsQ0FBQztZQUNqRDtnQkFDSSxPQUFPLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztTQUM3QztJQUNMLENBQUM7SUFFRCxJQUFXLGdCQUFnQjtRQUN2QixPQUFPLElBQUksQ0FBQyx5QkFBeUIsS0FBSyxRQUFRLENBQUM7SUFDdkQsQ0FBQztJQUVELElBQVcsUUFBUTtRQUNmLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQztJQUM5QyxDQUFDO0lBRU0sUUFBUTtRQUNYLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVNLFdBQVc7UUFDZCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTSxhQUFhLENBQUMsS0FBUTtRQUN6QixJQUFJLENBQUMsMEJBQTBCLEdBQUcsS0FBSyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRU0sU0FBUyxDQUFDLEtBQWM7UUFDM0IsZ0NBQWdDO1FBQ2hDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVuQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUU5QixJQUFJLE9BQTJCLENBQUM7UUFFaEMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3JCLE9BQU8sR0FBRyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3JDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2xFLENBQUM7SUFFTyxXQUFXLENBQUMsTUFBYztRQUM5QixNQUFNLGFBQWEsR0FBdUIsTUFBTSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ2pGLE1BQU0sdUJBQXVCLEdBQ3pCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFFcEUsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBQzVDLE9BQU87U0FDVjtRQUVELElBQUksS0FBSyxHQUNMLENBQUMsQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLENBQUMsMkJBQTJCO1lBQ3pELENBQUMsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsdUJBQWlDLENBQUM7WUFDckUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUV4QyxJQUFJLElBQUksQ0FBQyx5QkFBeUIsS0FBSyxRQUFRLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ25FLEtBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDNUI7UUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQVUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFTyxhQUFhLENBQUMsS0FBYztRQUNoQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDL0QsTUFBTSxxQkFBcUIsR0FBRyxLQUFLLFlBQVksTUFBTSxDQUFDO1FBQ3RELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztRQUM1QyxNQUFNLGNBQWMsR0FBRyxHQUFHLElBQUksR0FBRyxpQkFBaUIsRUFBRSxDQUFDO1FBRXJELE1BQU0sYUFBYSxHQUNmLHFCQUFxQixJQUFJLElBQUksQ0FBQywyQkFBMkI7WUFDckQsQ0FBQyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLENBQUMsS0FBVSxDQUFDO1lBQ3RELENBQUMsQ0FBQyxLQUFLLENBQUM7UUFFaEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUM7WUFDOUIsR0FBRyxJQUFJLENBQUMsV0FBVztZQUNuQjs7O2VBR0c7WUFDSCxHQUFHLENBQUMscUJBQXFCO2dCQUNyQixDQUFDLENBQUM7b0JBQ0ksQ0FBQyxjQUFjLENBQUMsRUFBRSxhQUFhO29CQUMvQixDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVM7aUJBQ3BCO2dCQUNILENBQUMsQ0FBQztvQkFDSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLFNBQVM7b0JBQzNCLENBQUMsSUFBSSxDQUFDLEVBQUUsYUFBYTtpQkFDeEIsQ0FBQztTQUNYLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDOytHQXRJUSxvQ0FBb0M7bUdBQXBDLG9DQUFvQzs7U0FBcEMsb0NBQW9DOzRGQUFwQyxvQ0FBb0M7a0JBTGhELFNBQVM7bUJBQUM7b0JBQ1AsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSx3Q0FBd0M7b0JBQ2xELFFBQVEsRUFBRSx1QkFBdUI7aUJBQ3BDOzhCQVNVLHlCQUF5QjtzQkFEL0IsS0FBSztnQkFJQyx5QkFBeUI7c0JBRC9CLEtBQUs7Z0JBSUMseUJBQXlCO3NCQUQvQixLQUFLO2dCQUlDLDBCQUEwQjtzQkFEaEMsS0FBSztnQkFJQywrQkFBK0I7c0JBRHJDLEtBQUs7Z0JBSUMsMkJBQTJCO3NCQURqQyxLQUFLO2dCQUlVLGdDQUFnQztzQkFEL0MsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TG9jYXRpb259IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgdHlwZSB7T25DaGFuZ2VzLCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBEaXJlY3RpdmUsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPdXRwdXQsXG4gICAgc2lnbmFsLFxuICAgIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHtQYXJhbXN9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlLCBVcmxTZXJpYWxpemVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtUVUlfRE9DX1VSTF9TVEFURV9IQU5ETEVSfSBmcm9tICdAdGFpZ2EtdWkvYWRkb24tZG9jL3Rva2Vucyc7XG5pbXBvcnQge3R1aUNsZWFuT2JqZWN0LCB0dWlDb2VyY2VWYWx1ZSwgdHVpSW5zcGVjdEFueX0gZnJvbSAnQHRhaWdhLXVpL2FkZG9uLWRvYy91dGlscyc7XG5pbXBvcnQge3R1aUlzTnVtYmVyfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzL21pc2NlbGxhbmVvdXMnO1xuaW1wb3J0IHtUdWlBbGVydFNlcnZpY2V9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvYWxlcnQnO1xuaW1wb3J0IHtTdWJqZWN0fSBmcm9tICdyeGpzJztcblxuY29uc3QgU0VSSUFMSVpFRF9TVUZGSVggPSAnJCc7XG5cbmV4cG9ydCB0eXBlIFR1aURvY3VtZW50YXRpb25Qcm9wZXJ0eVR5cGUgPSAnaW5wdXQtb3V0cHV0JyB8ICdpbnB1dCcgfCAnb3V0cHV0JyB8IG51bGw7XG5cbi8vIEBiYWQgVE9ETzogcmVmYWN0b3Igb3V0cHV0IGFuZCB2YWx1ZSBzeW5jXG5ARGlyZWN0aXZlKHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnbmctdGVtcGxhdGVbZG9jdW1lbnRhdGlvblByb3BlcnR5TmFtZV0nLFxuICAgIGV4cG9ydEFzOiAnZG9jdW1lbnRhdGlvblByb3BlcnR5Jyxcbn0pXG5leHBvcnQgY2xhc3MgVHVpRG9jRG9jdW1lbnRhdGlvblByb3BlcnR5Q29ubmVjdG9yPFQ+IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9jYXRpb25SZWYgPSBpbmplY3QoTG9jYXRpb24pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYWN0aXZhdGVkUm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdXJsU2VyaWFsaXplciA9IGluamVjdChVcmxTZXJpYWxpemVyKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHVybFN0YXRlSGFuZGxlciA9IGluamVjdChUVUlfRE9DX1VSTF9TVEFURV9IQU5ETEVSKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFsZXJ0cyA9IGluamVjdChUdWlBbGVydFNlcnZpY2UpO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZG9jdW1lbnRhdGlvblByb3BlcnR5TmFtZSA9ICcnO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZG9jdW1lbnRhdGlvblByb3BlcnR5TW9kZTogVHVpRG9jdW1lbnRhdGlvblByb3BlcnR5VHlwZSA9IG51bGw7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkb2N1bWVudGF0aW9uUHJvcGVydHlUeXBlID0gJyc7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkb2N1bWVudGF0aW9uUHJvcGVydHlWYWx1ZSE6IFQ7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkb2N1bWVudGF0aW9uUHJvcGVydHlEZXByZWNhdGVkID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkb2N1bWVudGF0aW9uUHJvcGVydHlWYWx1ZXM6IHJlYWRvbmx5IFRbXSB8IG51bGwgPSBudWxsO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJlYWRvbmx5IGRvY3VtZW50YXRpb25Qcm9wZXJ0eVZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IGNoYW5nZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIHB1YmxpYyByZWFkb25seSBlbWl0cyA9IHNpZ25hbCgxKTtcblxuICAgIHB1YmxpYyByZWFkb25seSB0ZW1wbGF0ZSA9IGluamVjdChUZW1wbGF0ZVJlZik7XG5cbiAgICBwdWJsaWMgZ2V0IGF0dHJOYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5kb2N1bWVudGF0aW9uUHJvcGVydHlNb2RlKSB7XG4gICAgICAgICAgICBjYXNlICdpbnB1dCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHt0aGlzLmRvY3VtZW50YXRpb25Qcm9wZXJ0eU5hbWV9XWA7XG4gICAgICAgICAgICBjYXNlICdpbnB1dC1vdXRwdXQnOlxuICAgICAgICAgICAgICAgIHJldHVybiBgWygke3RoaXMuZG9jdW1lbnRhdGlvblByb3BlcnR5TmFtZX0pXWA7XG4gICAgICAgICAgICBjYXNlICdvdXRwdXQnOlxuICAgICAgICAgICAgICAgIHJldHVybiBgKCR7dGhpcy5kb2N1bWVudGF0aW9uUHJvcGVydHlOYW1lfSlgO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudGF0aW9uUHJvcGVydHlOYW1lO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzaG91bGRTaG93VmFsdWVzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudGF0aW9uUHJvcGVydHlNb2RlICE9PSAnb3V0cHV0JztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGhhc0l0ZW1zKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLmRvY3VtZW50YXRpb25Qcm9wZXJ0eVZhbHVlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGFyc2VQYXJhbXModGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcyk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNoYW5nZWQkLm5leHQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25WYWx1ZUNoYW5nZSh2YWx1ZTogVCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRvY3VtZW50YXRpb25Qcm9wZXJ0eVZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRhdGlvblByb3BlcnR5VmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgICAgIHRoaXMuc2V0UXVlcnlQYXJhbSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGVtaXRFdmVudChldmVudDogdW5rbm93bik6IHZvaWQge1xuICAgICAgICAvLyBGb3IgbW9yZSBjb252ZW5pZW50IGRlYnVnZ2luZ1xuICAgICAgICBjb25zb2xlLmluZm8odGhpcy5hdHRyTmFtZSwgZXZlbnQpO1xuXG4gICAgICAgIHRoaXMuZW1pdHMudXBkYXRlKCh4KSA9PiArK3gpO1xuXG4gICAgICAgIGxldCBjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKGV2ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSB0dWlJbnNwZWN0QW55KGV2ZW50LCAyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYWxlcnRzLm9wZW4oY29udGVudCwge2xhYmVsOiB0aGlzLmF0dHJOYW1lfSkuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZVBhcmFtcyhwYXJhbXM6IFBhcmFtcyk6IHZvaWQge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eVZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBwYXJhbXNbdGhpcy5kb2N1bWVudGF0aW9uUHJvcGVydHlOYW1lXTtcbiAgICAgICAgY29uc3QgcHJvcGVydHlWYWx1ZVdpdGhTdWZmaXg6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCA9XG4gICAgICAgICAgICBwYXJhbXNbYCR7dGhpcy5kb2N1bWVudGF0aW9uUHJvcGVydHlOYW1lfSR7U0VSSUFMSVpFRF9TVUZGSVh9YF07XG5cbiAgICAgICAgaWYgKCFwcm9wZXJ0eVZhbHVlICYmICFwcm9wZXJ0eVZhbHVlV2l0aFN1ZmZpeCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHZhbHVlID1cbiAgICAgICAgICAgICEhcHJvcGVydHlWYWx1ZVdpdGhTdWZmaXggJiYgdGhpcy5kb2N1bWVudGF0aW9uUHJvcGVydHlWYWx1ZXNcbiAgICAgICAgICAgICAgICA/IHRoaXMuZG9jdW1lbnRhdGlvblByb3BlcnR5VmFsdWVzW3Byb3BlcnR5VmFsdWVXaXRoU3VmZml4IGFzIG51bWJlcl1cbiAgICAgICAgICAgICAgICA6IHR1aUNvZXJjZVZhbHVlKHByb3BlcnR5VmFsdWUpO1xuXG4gICAgICAgIGlmICh0aGlzLmRvY3VtZW50YXRpb25Qcm9wZXJ0eVR5cGUgPT09ICdzdHJpbmcnICYmIHR1aUlzTnVtYmVyKHZhbHVlKSkge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlKHZhbHVlIGFzIFQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0UXVlcnlQYXJhbSh2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgICAgICBjb25zdCB0cmVlID0gdGhpcy51cmxTZXJpYWxpemVyLnBhcnNlKHRoaXMubG9jYXRpb25SZWYucGF0aCgpKTtcbiAgICAgICAgY29uc3QgaXNWYWx1ZUF2YWlsYWJsZUJ5S2V5ID0gdmFsdWUgaW5zdGFuY2VvZiBPYmplY3Q7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmRvY3VtZW50YXRpb25Qcm9wZXJ0eU5hbWU7XG4gICAgICAgIGNvbnN0IG5hbWVXaXRoU3VmZml4ID0gYCR7bmFtZX0ke1NFUklBTElaRURfU1VGRklYfWA7XG5cbiAgICAgICAgY29uc3QgY29tcHV0ZWRWYWx1ZSA9XG4gICAgICAgICAgICBpc1ZhbHVlQXZhaWxhYmxlQnlLZXkgJiYgdGhpcy5kb2N1bWVudGF0aW9uUHJvcGVydHlWYWx1ZXNcbiAgICAgICAgICAgICAgICA/IHRoaXMuZG9jdW1lbnRhdGlvblByb3BlcnR5VmFsdWVzLmluZGV4T2YodmFsdWUgYXMgVClcbiAgICAgICAgICAgICAgICA6IHZhbHVlO1xuXG4gICAgICAgIHRyZWUucXVlcnlQYXJhbXMgPSB0dWlDbGVhbk9iamVjdCh7XG4gICAgICAgICAgICAuLi50cmVlLnF1ZXJ5UGFyYW1zLFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBDYXJldGFrZXIgbm90ZTogcmVzZXQgcHJldmlvdXMgY29uZmxpY3RlZCBwYXJhbSBpbiByb3V0ZVxuICAgICAgICAgICAgICogaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS90YWlnYS1mYW1pbHkvdGFpZ2EtdWkvaXNzdWVzLzk3NjRcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgLi4uKGlzVmFsdWVBdmFpbGFibGVCeUtleVxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgIFtuYW1lV2l0aFN1ZmZpeF06IGNvbXB1dGVkVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgW25hbWVdOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgW25hbWVXaXRoU3VmZml4XTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXTogY29tcHV0ZWRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmxvY2F0aW9uUmVmLmdvKHRoaXMudXJsU3RhdGVIYW5kbGVyKHRyZWUpKTtcbiAgICB9XG59XG4iXX0=