ngx-tiptap-editor
Version:
[](https://github.com/HuiiBuh/ngx-tiptap-editor/actions/workflows/publish.yml) [ {
this.ngZone = ngZone;
this.injector = injector;
this.cd = cd;
this.tiptapExtensionService = tiptapExtensionService;
this.platformId = platformId;
this.globalExtensions = globalExtensions;
this.globalAngularExtensions = globalAngularExtensions;
// Content change
this.jsonChange = new EventEmitter();
this.htmlChange = new EventEmitter();
// Editor set
this.created = new EventEmitter();
// Editor events
this.beforeCreate = new EventEmitter();
this.create = new EventEmitter();
this.update = new EventEmitter();
this.selectionUpdate = new EventEmitter();
this.transaction = new EventEmitter();
this.focus = new EventEmitter();
this.blur = new EventEmitter();
this.destroy = new EventEmitter();
// Editor input params
this.content = null;
this.injectCSS = true;
this.autofocus = true;
this.editable = true;
this.editorProps = {};
this.parseOptions = {};
this.enableInputRules = true;
this.enablePasteRules = true;
this.extensions = [];
this.angularExtensions = [];
this.runEventsOutsideAngular = true;
this.destroy$ = new Subject();
this.builtExtensions = [];
eventService.setElement(element.nativeElement);
}
get editor() {
return this.tiptap ? this.tiptap : null;
}
async ngAfterViewInit() {
// On the serve you don't need an editor
if (!isPlatformBrowser(this.platformId))
return;
if (!this.editorComponent) {
throw new Error('You have to pass the tip-editor-body as a child of the tip-editor. Otherwise you cannot see anything');
}
// Attach the editor to the editor element
this.tiptap = this.ngZone.runOutsideAngular(() => new Editor({
...this.buildEditorOptions(),
element: this.editorComponent.editorElement,
}));
this.setEditorInAngularExtension();
// Emit the event which indicates that the tiptap editor was created
this.created.emit(this.tiptap);
// Pass the editor the the editorBody component
this.editorComponent.setEditor(this.tiptap);
// Check if the header component was passed and if not disable it
if (this.headerComponent) {
this.headerComponent.setEditor(this.tiptap);
this.editorComponent.displayTopCurves = false;
}
else {
this.editorComponent.displayTopCurves = true;
}
if (this.footerComponent) {
this.footerComponent.setEditor(this.tiptap);
this.editorComponent.displayBottomCurves = false;
}
else {
this.editorComponent.displayBottomCurves = true;
}
this.registerEvents();
}
ngOnDestroy() {
this.tiptap && this.tiptap.destroy();
this.destroy$.next(true);
this.destroy.complete();
}
registerEvents() {
if (!this.tiptap)
return;
this.pipeTo(fromEditorEvent(this.tiptap, 'update').pipe(map(({ editor }) => editor.getJSON())), this.jsonChange);
this.pipeTo(fromEditorEvent(this.tiptap, 'update').pipe(map(({ editor }) => editor.getHTML())), this.htmlChange);
this.pipeTo(fromEditorEvent(this.tiptap, 'beforeCreate'), this.beforeCreate);
this.pipeTo(fromEditorEvent(this.tiptap, 'create'), this.create);
this.pipeTo(fromEditorEvent(this.tiptap, 'update'), this.update);
this.pipeTo(fromEditorEvent(this.tiptap, 'selectionUpdate'), this.selectionUpdate);
this.pipeTo(fromEditorEvent(this.tiptap, 'transaction'), this.transaction);
this.pipeTo(fromEditorEvent(this.tiptap, 'focus'), this.focus);
this.pipeTo(fromEditorEvent(this.tiptap, 'blur'), this.blur);
this.pipeTo(fromEditorEvent(this.tiptap, 'destroy'), this.destroy);
}
buildEditorOptions() {
return {
content: this.content,
autofocus: this.autofocus,
injectCSS: this.injectCSS,
editable: this.editable,
editorProps: this.editorProps,
parseOptions: this.parseOptions,
enableInputRules: this.enableInputRules,
enablePasteRules: this.enablePasteRules,
extensions: this.mergeNativeAndAngularExtensions()
};
}
mergeNativeAndAngularExtensions() {
// Set collection of native extensions in the extension service
const nativeExtensions = [...this.extensions];
if (this.globalExtensions)
nativeExtensions.push(...this.globalExtensions);
const nativeDuplicates = getDuplicates(nativeExtensions, item => item.name);
if (nativeDuplicates && isDevMode()) {
throw new Error(`Duplicate tiptap extensions found ${JSON.stringify(Object.keys(nativeDuplicates))}`);
}
this.tiptapExtensionService.setNativeExtensions(nativeExtensions);
// Build the angular extensions and set them in the extension service
const angularExtensions = [...this.angularExtensions];
if (this.globalAngularExtensions)
angularExtensions.push(...this.globalAngularExtensions);
this.builtExtensions = angularExtensions.map(extension => this.ngZone.run(() => extension.build(this.injector)));
const ngDuplicates = getDuplicates(this.builtExtensions, item => item.constructor.name);
if (ngDuplicates && isDevMode()) {
throw new Error(`Duplicate angular-tiptap extensions found (Key is class name): ${JSON.stringify(Object.keys(ngDuplicates))}`);
}
this.tiptapExtensionService.setAngularExtensions(this.builtExtensions);
return [
...this.extensions,
...this.builtExtensions.map(e => e.nativeExtension)
];
}
pipeTo(observable, eventEmitter) {
observable
.pipe(takeUntil(this.destroy$))
.subscribe(e => {
if (this.runEventsOutsideAngular) {
this.ngZone.runOutsideAngular(() => eventEmitter.next(e));
}
else {
this.ngZone.run(() => eventEmitter.next(e));
}
});
}
setEditorInAngularExtension() {
for (const angularExtension of this.builtExtensions) {
angularExtension.editor = this.tiptap;
}
}
}
EditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EditorComponent, deps: [{ token: i0.NgZone }, { token: i0.Injector }, { token: i0.ChangeDetectorRef }, { token: i1.TiptapExtensionService }, { token: PLATFORM_ID }, { token: GLOBAL_EXTENSIONS, optional: true }, { token: GLOBAL_ANGULAR_EXTENSIONS, optional: true }, { token: i2.TiptapEventService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
EditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: EditorComponent, selector: "tip-editor", inputs: { content: "content", injectCSS: "injectCSS", autofocus: "autofocus", editable: "editable", editorProps: "editorProps", parseOptions: "parseOptions", enableInputRules: "enableInputRules", enablePasteRules: "enablePasteRules", extensions: "extensions", angularExtensions: "angularExtensions", runEventsOutsideAngular: "runEventsOutsideAngular" }, outputs: { jsonChange: "jsonChange", htmlChange: "htmlChange", created: "created", beforeCreate: "beforeCreate", create: "create", update: "update", selectionUpdate: "selectionUpdate", transaction: "transaction", focus: "focus", blur: "blur", destroy: "destroy" }, providers: [TiptapEventService, TiptapExtensionService], queries: [{ propertyName: "editorComponent", first: true, predicate: EditorBodyComponent, descendants: true }, { propertyName: "headerComponent", first: true, predicate: EditorHeaderComponent, descendants: true }, { propertyName: "footerComponent", first: true, predicate: EditorFooterComponent, descendants: true }], ngImport: i0, template: `
<ng-content select="tip-editor-header"></ng-content>
<ng-content select="tip-editor-body"></ng-content>
<ng-content select="tip-editor-footer"></ng-content>
`, isInline: true, styles: [""], changeDetection: i0.ChangeDetectionStrategy.OnPush });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: EditorComponent, decorators: [{
type: Component,
args: [{ selector: 'tip-editor', template: `
<ng-content select="tip-editor-header"></ng-content>
<ng-content select="tip-editor-body"></ng-content>
<ng-content select="tip-editor-footer"></ng-content>
`, changeDetection: ChangeDetectionStrategy.OnPush, providers: [TiptapEventService, TiptapExtensionService], styles: [""] }]
}], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i0.Injector }, { type: i0.ChangeDetectorRef }, { type: i1.TiptapExtensionService }, { type: undefined, decorators: [{
type: Inject,
args: [PLATFORM_ID]
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [GLOBAL_EXTENSIONS]
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [GLOBAL_ANGULAR_EXTENSIONS]
}] }, { type: i2.TiptapEventService }, { type: i0.ElementRef }]; }, propDecorators: { jsonChange: [{
type: Output
}], htmlChange: [{
type: Output
}], created: [{
type: Output
}], beforeCreate: [{
type: Output
}], create: [{
type: Output
}], update: [{
type: Output
}], selectionUpdate: [{
type: Output
}], transaction: [{
type: Output
}], focus: [{
type: Output
}], blur: [{
type: Output
}], destroy: [{
type: Output
}], content: [{
type: Input
}], injectCSS: [{
type: Input
}], autofocus: [{
type: Input
}], editable: [{
type: Input
}], editorProps: [{
type: Input
}], parseOptions: [{
type: Input
}], enableInputRules: [{
type: Input
}], enablePasteRules: [{
type: Input
}], extensions: [{
type: Input
}], angularExtensions: [{
type: Input
}], runEventsOutsideAngular: [{
type: Input
}], editorComponent: [{
type: ContentChild,
args: [EditorBodyComponent]
}], headerComponent: [{
type: ContentChild,
args: [EditorHeaderComponent]
}], footerComponent: [{
type: ContentChild,
args: [EditorFooterComponent]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10aXB0YXAtZWRpdG9yL3NyYy9saWIvY29tcG9uZW50cy9lZGl0b3IvZWRpdG9yLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBRVosWUFBWSxFQUNaLE1BQU0sRUFFTixLQUFLLEVBQ0wsU0FBUyxFQUdULFFBQVEsRUFDUixNQUFNLEVBQ04sV0FBVyxFQUVaLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFdEMsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR2hELE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9ELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7O0FBRWpGLGtDQUFrQztBQVlsQyxNQUFNLE9BQU8sZUFBZTtJQXdDMUIsWUFDVSxNQUFjLEVBQ2QsUUFBa0IsRUFD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QUksQ0FBQyxNQUFNLENBQ1QsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFPLEVBQUUsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUMsTUFBTSxFQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQ2pGLElBQUksQ0FBQyxVQUFVLENBQ2hCLENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTyxFQUFFLGNBQWMsQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM5RSxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTyxFQUFFLFFBQVEsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTyxFQUFFLFFBQVEsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTyxFQUFFLGlCQUFpQixDQUFDLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3BGLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFPLEVBQUUsYUFBYSxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFPLEVBQUUsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxN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QkFBM0IsTUFBTTtnQkFDVSxLQUFLO3NCQUFyQixNQUFNO2dCQUNVLElBQUk7c0JBQXBCLE1BQU07Z0JBQ1UsT0FBTztzQkFBdkIsTUFBTTtnQkFHUyxPQUFPO3NCQUF0QixLQUFLO2dCQUNVLFNBQVM7c0JBQXhCLEtBQUs7Z0JBQ1UsU0FBUztzQkFBeEIsS0FBSztnQkFDVSxRQUFRO3NCQUF2QixLQUFLO2dCQUNVLFdBQVc7c0JBQTFCLEtBQUs7Z0JBQ1UsWUFBWTtzQkFBM0IsS0FBSztnQkFDVSxnQkFBZ0I7c0JBQS9CLEtBQUs7Z0JBQ1UsZ0JBQWdCO3NCQUEvQixLQUFLO2dCQUNVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBQ1UsaUJBQWlCO3NCQUFoQyxLQUFLO2dCQUNVLHVCQUF1QjtzQkFBdEMsS0FBSztnQkFHcUMsZUFBZTtzQkFBekQsWUFBWTt1QkFBQyxtQkFBbUI7Z0JBQ1ksZUFBZTtzQkFBM0QsWUFBWTt1QkFBQyxxQkFBcUI7Z0JBQ1UsZUFBZTtzQkFBM0QsWUFBWTt1QkFBQyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBpc0Rldk1vZGUsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBQTEFURk9STV9JRCxcbiAgVHlwZVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHsgQ29udGVudCwgRWRpdG9yT3B0aW9ucywgRXh0ZW5zaW9ucyB9IGZyb20gJ0B0aXB0YXAvY29yZSc7XG5pbXBvcnQgeyBFZGl0b3IgfSBmcm9tICdAdGlwdGFwL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBQYXJzZU9wdGlvbnMgfSBmcm9tICdwcm9zZW1pcnJvci1tb2RlbCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEV4dGVuc2lvbkJ1aWxkZXIgfSBmcm9tICcuLi8uLi9leHRlbnNpb25zL2Jhc2UtZXh0ZW5zaW9uLm1vZGVsJztcbmltcG9ydCB7IFRpcEJhc2VFeHRlbnNpb24gfSBmcm9tICcuLi8uLi9leHRlbnNpb25zL3RpcC1iYXNlLWV4dGVuc2lvbic7XG5pbXBvcnQgeyBmcm9tRWRpdG9yRXZlbnQsIGdldER1cGxpY2F0ZXMgfSBmcm9tICcuLi8uLi9oZWxwZXJzJztcbmltcG9ydCB7IEVkaXRvckV2ZW50UmV0dXJuIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3R5cGVzJztcbmltcG9ydCB7IEdMT0JBTF9BTkdVTEFSX0VYVEVOU0lPTlMsIEdMT0JBTF9FWFRFTlNJT05TIH0gZnJvbSAnLi4vLi4vcHJvdmlkZXJzJztcbmltcG9ydCB7IFRpcHRhcEV2ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RpcHRhcC1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFRpcHRhcEV4dGVuc2lvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90aXB0YXAtZXh0ZW5zaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgRWRpdG9yQm9keUNvbXBvbmVudCB9IGZyb20gJy4uL2VkaXRvci1ib2R5L2VkaXRvci1ib2R5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFZGl0b3JGb290ZXJDb21wb25lbnQgfSBmcm9tICcuLi9lZGl0b3ItZm9vdGVyL2VkaXRvci1mb290ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IEVkaXRvckhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4uL2VkaXRvci1oZWFkZXIvZWRpdG9yLWhlYWRlci5jb21wb25lbnQnO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1vdXRwdXQtbmF0aXZlXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0aXAtZWRpdG9yJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJ0aXAtZWRpdG9yLWhlYWRlclwiPjwvbmctY29udGVudD5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJ0aXAtZWRpdG9yLWJvZHlcIj48L25nLWNvbnRlbnQ+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwidGlwLWVkaXRvci1mb290ZXJcIj48L25nLWNvbnRlbnQ+XG4gIGAsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdHlsZVVybHM6IFsnLi9lZGl0b3IuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbVGlwdGFwRXZlbnRTZXJ2aWNlLCBUaXB0YXBFeHRlbnNpb25TZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gIC8vIENvbnRlbnQgY2hhbmdlXG4gIEBPdXRwdXQoKSBwdWJsaWMganNvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjb3JkPHN0cmluZywgYW55Pj4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBodG1sQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLy8gRWRpdG9yIHNldFxuICBAT3V0cHV0KCkgcHVibGljIGNyZWF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEVkaXRvcj4oKTtcblxuICAvLyBFZGl0b3IgZXZlbnRzXG4gIEBPdXRwdXQoKSBwdWJsaWMgYmVmb3JlQ3JlYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxFZGl0b3JFdmVudFJldHVyblsnYmVmb3JlQ3JlYXRlJ10+KCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgY3JlYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxFZGl0b3JFdmVudFJldHVyblsnY3JlYXRlJ10+KCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgdXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxFZGl0b3JFdmVudFJldHVyblsndXBkYXRlJ10+KCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgc2VsZWN0aW9uVXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxFZGl0b3JFdmVudFJldHVyblsnc2VsZWN0aW9uVXBkYXRlJ10+KCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgdHJhbnNhY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPEVkaXRvckV2ZW50UmV0dXJuWyd0cmFuc2FjdGlvbiddPigpO1xuICBAT3V0cHV0KCkgcHVibGljIGZvY3VzID0gbmV3IEV2ZW50RW1pdHRlcjxFZGl0b3JFdmVudFJldHVyblsnZm9jdXMnXT4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBibHVyID0gbmV3IEV2ZW50RW1pdHRlcjxFZGl0b3JFdmVudFJldHVyblsnYmx1ciddPigpO1xuICBAT3V0cHV0KCkgcHVibGljIGRlc3Ryb3kgPSBuZXcgRXZlbnRFbWl0dGVyPEVkaXRvckV2ZW50UmV0dXJuWydkZXN0cm95J10+KCk7XG5cbiAgLy8gRWRpdG9yIGlucHV0IHBhcmFtc1xuICBASW5wdXQoKSBwdWJsaWMgY29udGVudDogb2JqZWN0IHwgc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIHB1YmxpYyBpbmplY3RDU1MgPSB0cnVlO1xuICBASW5wdXQoKSBwdWJsaWMgYXV0b2ZvY3VzID0gdHJ1ZTtcbiAgQElucHV0KCkgcHVibGljIGVkaXRhYmxlID0gdHJ1ZTtcbiAgQElucHV0KCkgcHVibGljIGVkaXRvclByb3BzOiBFZGl0b3JPcHRpb25zWydlZGl0b3JQcm9wcyddID0ge307XG4gIEBJbnB1dCgpIHB1YmxpYyBwYXJzZU9wdGlvbnM6IFBhcnNlT3B0aW9ucyA9IHt9O1xuICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlSW5wdXRSdWxlcyA9IHRydWU7XG4gIEBJbnB1dCgpIHB1YmxpYyBlbmFibGVQYXN0ZVJ1bGVzID0gdHJ1ZTtcbiAgQElucHV0KCkgcHVibGljIGV4dGVuc2lvbnM6IEV4dGVuc2lvbnMgPSBbXTtcbiAgQElucHV0KCkgcHVibGljIGFuZ3VsYXJFeHRlbnNpb25zOiBFeHRlbnNpb25CdWlsZGVyPGFueSwgVHlwZTxUaXBCYXNlRXh0ZW5zaW9uPGFueT4+PltdID0gW107XG4gIEBJbnB1dCgpIHB1YmxpYyBydW5FdmVudHNPdXRzaWRlQW5ndWxhciA9IHRydWU7XG5cbiAgLy8gTG9hZCBjaGlsZHJlblxuICBAQ29udGVudENoaWxkKEVkaXRvckJvZHlDb21wb25lbnQpIHByaXZhdGUgZWRpdG9yQ29tcG9uZW50OiBFZGl0b3JCb2R5Q29tcG9uZW50IHwgdW5kZWZpbmVkO1xuICBAQ29udGVudENoaWxkKEVkaXRvckhlYWRlckNvbXBvbmVudCkgcHJpdmF0ZSBoZWFkZXJDb21wb25lbnQ6IEVkaXRvckhlYWRlckNvbXBvbmVudCB8IHVuZGVmaW5lZDtcbiAgQENvbnRlbnRDaGlsZChFZGl0b3JGb290ZXJDb21wb25lbnQpIHByaXZhdGUgZm9vdGVyQ29tcG9uZW50OiBFZGl0b3JGb290ZXJDb21wb25lbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgdGlwdGFwOiBFZGl0b3IgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICBwcml2YXRlIGJ1aWx0RXh0ZW5zaW9uczogVGlwQmFzZUV4dGVuc2lvbjxhbnk+W10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgdGlwdGFwRXh0ZW5zaW9uU2VydmljZTogVGlwdGFwRXh0ZW5zaW9uU2VydmljZSxcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IGFueSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEdMT0JBTF9FWFRFTlNJT05TKSBwcml2YXRlIGdsb2JhbEV4dGVuc2lvbnM6IEV4dGVuc2lvbnMgfCBudWxsLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoR0xPQkFMX0FOR1VMQVJfRVhURU5TSU9OUykgcHJpdmF0ZSBnbG9iYWxBbmd1bGFyRXh0ZW5zaW9uczogRXh0ZW5zaW9uQnVpbGRlcjxhbnksIGFueT5bXSB8IG51bGwsXG4gICAgZXZlbnRTZXJ2aWNlOiBUaXB0YXBFdmVudFNlcnZpY2UsXG4gICAgZWxlbWVudDogRWxlbWVudFJlZixcbiAgKSB7XG4gICAgZXZlbnRTZXJ2aWNlLnNldEVsZW1lbnQoZWxlbWVudC5uYXRpdmVFbGVtZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZWRpdG9yKCk6IEVkaXRvciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnRpcHRhcCA/IHRoaXMudGlwdGFwIDogbnVsbDtcbiAgfVxuXG5cbiAgcHVibGljIGFzeW5jIG5nQWZ0ZXJWaWV3SW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBPbiB0aGUgc2VydmUgeW91IGRvbid0IG5lZWQgYW4gZWRpdG9yXG4gICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICBpZiAoIXRoaXMuZWRpdG9yQ29tcG9uZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBoYXZlIHRvIHBhc3MgdGhlIHRpcC1lZGl0b3ItYm9keSBhcyBhIGNoaWxkIG9mIHRoZSB0aXAtZWRpdG9yLiBPdGhlcndpc2UgeW91IGNhbm5vdCBzZWUgYW55dGhpbmcnKTtcbiAgICB9XG5cbiAgICAvLyBBdHRhY2ggdGhlIGVkaXRvciB0byB0aGUgZWRpdG9yIGVsZW1lbnRcbiAgICB0aGlzLnRpcHRhcCA9IHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IG5ldyBFZGl0b3Ioe1xuICAgICAgLi4udGhpcy5idWlsZEVkaXRvck9wdGlvbnMoKSxcbiAgICAgIGVsZW1lbnQ6IHRoaXMuZWRpdG9yQ29tcG9uZW50IS5lZGl0b3JFbGVtZW50ISxcbiAgICB9KSk7XG5cbiAgICB0aGlzLnNldEVkaXRvckluQW5ndWxhckV4dGVuc2lvbigpO1xuXG4gICAgLy8gRW1pdCB0aGUgZXZlbnQgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIHRpcHRhcCBlZGl0b3Igd2FzIGNyZWF0ZWRcbiAgICB0aGlzLmNyZWF0ZWQuZW1pdCh0aGlzLnRpcHRhcCk7XG5cbiAgICAvLyBQYXNzIHRoZSBlZGl0b3IgdGhlIHRoZSBlZGl0b3JCb2R5IGNvbXBvbmVudFxuICAgIHRoaXMuZWRpdG9yQ29tcG9uZW50LnNldEVkaXRvcih0aGlzLnRpcHRhcCk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgaGVhZGVyIGNvbXBvbmVudCB3YXMgcGFzc2VkIGFuZCBpZiBub3QgZGlzYWJsZSBpdFxuICAgIGlmICh0aGlzLmhlYWRlckNvbXBvbmVudCkge1xuICAgICAgdGhpcy5oZWFkZXJDb21wb25lbnQuc2V0RWRpdG9yKHRoaXMudGlwdGFwKTtcbiAgICAgIHRoaXMuZWRpdG9yQ29tcG9uZW50LmRpc3BsYXlUb3BDdXJ2ZXMgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lZGl0b3JDb21wb25lbnQuZGlzcGxheVRvcEN1cnZlcyA9IHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLmZvb3RlckNvbXBvbmVudCkge1xuICAgICAgdGhpcy5mb290ZXJDb21wb25lbnQuc2V0RWRpdG9yKHRoaXMudGlwdGFwKTtcbiAgICAgIHRoaXMuZWRpdG9yQ29tcG9uZW50LmRpc3BsYXlCb3R0b21DdXJ2ZXMgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lZGl0b3JDb21wb25lbnQuZGlzcGxheUJvdHRvbUN1cnZlcyA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMucmVnaXN0ZXJFdmVudHMoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnRpcHRhcCAmJiB0aGlzLnRpcHRhcC5kZXN0cm95KCk7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xuICAgIHRoaXMuZGVzdHJveS5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlckV2ZW50cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGlwdGFwKSByZXR1cm47XG5cbiAgICB0aGlzLnBpcGVUbyhcbiAgICAgIGZyb21FZGl0b3JFdmVudCh0aGlzLnRpcHRhcCEsICd1cGRhdGUnKS5waXBlKG1hcCgoe2VkaXRvcn0pID0+IGVkaXRvci5nZXRKU09OKCkpKSxcbiAgICAgIHRoaXMuanNvbkNoYW5nZVxuICAgICk7XG4gICAgdGhpcy5waXBlVG8oXG4gICAgICBmcm9tRWRpdG9yRXZlbnQodGhpcy50aXB0YXAhLCAndXBkYXRlJykucGlwZShtYXAoKHtlZGl0b3J9KSA9PiBlZGl0b3IuZ2V0SFRNTCgpKSksXG4gICAgICB0aGlzLmh0bWxDaGFuZ2VcbiAgICApO1xuICAgIHRoaXMucGlwZVRvKGZyb21FZGl0b3JFdmVudCh0aGlzLnRpcHRhcCEsICdiZWZvcmVDcmVhdGUnKSwgdGhpcy5iZWZvcmVDcmVhdGUpO1xuICAgIHRoaXMucGlwZVRvKGZyb21FZGl0b3JFdmVudCh0aGlzLnRpcHRhcCEsICdjcmVhdGUnKSwgdGhpcy5jcmVhdGUpO1xuICAgIHRoaXMucGlwZVRvKGZyb21FZGl0b3JFdmVudCh0aGlzLnRpcHRhcCEsICd1cGRhdGUnKSwgdGhpcy51cGRhdGUpO1xuICAgIHRoaXMucGlwZVRvKGZyb21FZGl0b3JFdmVudCh0aGlzLnRpcHRhcCEsICdzZWxlY3Rpb25VcGRhdGUnKSwgdGhpcy5zZWxlY3Rpb25VcGRhdGUpO1xuICAgIHRoaXMucGlwZVRvKGZyb21FZGl0b3JFdmVudCh0aGlzLnRpcHRhcCEsICd0cmFuc2FjdGlvbicpLCB0aGlzLnRyYW5zYWN0aW9uKTtcbiAgICB0aGlzLnBpcGVUbyhmcm9tRWRpdG9yRXZlbnQodGhpcy50aXB0YXAhLCAnZm9jdXMnKSwgdGhpcy5mb2N1cyk7XG4gICAgdGhpcy5waXBlVG8oZnJvbUVkaXRvckV2ZW50KHRoaXMudGlwdGFwISwgJ2JsdXInKSwgdGhpcy5ibHVyKTtcbiAgICB0aGlzLnBpcGVUbyhmcm9tRWRpdG9yRXZlbnQodGhpcy50aXB0YXAhLCAnZGVzdHJveScpLCB0aGlzLmRlc3Ryb3kpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEVkaXRvck9wdGlvbnMoKTogUGFydGlhbDxFZGl0b3JPcHRpb25zPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IHRoaXMuY29udGVudCBhcyB1bmtub3duIGFzIENvbnRlbnQsXG4gICAgICBhdXRvZm9jdXM6IHRoaXMuYXV0b2ZvY3VzLFxuICAgICAgaW5qZWN0Q1NTOiB0aGlzLmluamVjdENTUyxcbiAgICAgIGVkaXRhYmxlOiB0aGlzLmVkaXRhYmxlLFxuICAgICAgZWRpdG9yUHJvcHM6IHRoaXMuZWRpdG9yUHJvcHMsXG4gICAgICBwYXJzZU9wdGlvbnM6IHRoaXMucGFyc2VPcHRpb25zLFxuICAgICAgZW5hYmxlSW5wdXRSdWxlczogdGhpcy5lbmFibGVJbnB1dFJ1bGVzLFxuICAgICAgZW5hYmxlUGFzdGVSdWxlczogdGhpcy5lbmFibGVQYXN0ZVJ1bGVzLFxuICAgICAgZXh0ZW5zaW9uczogdGhpcy5tZXJnZU5hdGl2ZUFuZEFuZ3VsYXJFeHRlbnNpb25zKClcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZU5hdGl2ZUFuZEFuZ3VsYXJFeHRlbnNpb25zKCk6IEV4dGVuc2lvbnMge1xuICAgIC8vIFNldCBjb2xsZWN0aW9uIG9mIG5hdGl2ZSBleHRlbnNpb25zIGluIHRoZSBleHRlbnNpb24gc2VydmljZVxuICAgIGNvbnN0IG5hdGl2ZUV4dGVuc2lvbnM6IEV4dGVuc2lvbnMgPSBbLi4udGhpcy5leHRlbnNpb25zXTtcbiAgICBpZiAodGhpcy5nbG9iYWxFeHRlbnNpb25zKSBuYXRpdmVFeHRlbnNpb25zLnB1c2goLi4udGhpcy5nbG9iYWxFeHRlbnNpb25zKTtcbiAgICBjb25zdCBuYXRpdmVEdXBsaWNhdGVzID0gZ2V0RHVwbGljYXRlcyhuYXRpdmVFeHRlbnNpb25zLCBpdGVtID0+IGl0ZW0ubmFtZSk7XG4gICAgaWYgKG5hdGl2ZUR1cGxpY2F0ZXMgJiYgaXNEZXZNb2RlKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIHRpcHRhcCBleHRlbnNpb25zIGZvdW5kICR7SlNPTi5zdHJpbmdpZnkoT2JqZWN0LmtleXMobmF0aXZlRHVwbGljYXRlcykpfWApO1xuICAgIH1cbiAgICB0aGlzLnRpcHRhcEV4dGVuc2lvblNlcnZpY2Uuc2V0TmF0aXZlRXh0ZW5zaW9ucyhuYXRpdmVFeHRlbnNpb25zKTtcblxuICAgIC8vIEJ1aWxkIHRoZSBhbmd1bGFyIGV4dGVuc2lvbnMgYW5kIHNldCB0aGVtIGluIHRoZSBleHRlbnNpb24gc2VydmljZVxuICAgIGNvbnN0IGFuZ3VsYXJFeHRlbnNpb25zOiBFeHRlbnNpb25CdWlsZGVyPGFueSwgYW55PltdID0gWy4uLnRoaXMuYW5ndWxhckV4dGVuc2lvbnNdO1xuICAgIGlmICh0aGlzLmdsb2JhbEFuZ3VsYXJFeHRlbnNpb25zKSBhbmd1bGFyRXh0ZW5zaW9ucy5wdXNoKC4uLnRoaXMuZ2xvYmFsQW5ndWxhckV4dGVuc2lvbnMpO1xuICAgIHRoaXMuYnVpbHRFeHRlbnNpb25zID0gYW5ndWxhckV4dGVuc2lvbnMubWFwKGV4dGVuc2lvbiA9PiB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gZXh0ZW5zaW9uLmJ1aWxkKHRoaXMuaW5qZWN0b3IpKSk7XG4gICAgY29uc3QgbmdEdXBsaWNhdGVzID0gZ2V0RHVwbGljYXRlcyh0aGlzLmJ1aWx0RXh0ZW5zaW9ucywgaXRlbSA9PiBpdGVtLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGlmIChuZ0R1cGxpY2F0ZXMgJiYgaXNEZXZNb2RlKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIGFuZ3VsYXItdGlwdGFwIGV4dGVuc2lvbnMgZm91bmQgKEtleSBpcyBjbGFzcyBuYW1lKTogJHtKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyhuZ0R1cGxpY2F0ZXMpKX1gKTtcbiAgICB9XG4gICAgdGhpcy50aXB0YXBFeHRlbnNpb25TZXJ2aWNlLnNldEFuZ3VsYXJFeHRlbnNpb25zKHRoaXMuYnVpbHRFeHRlbnNpb25zKTtcbiAgICByZXR1cm4gW1xuICAgICAgLi4udGhpcy5leHRlbnNpb25zLFxuICAgICAgLi4udGhpcy5idWlsdEV4dGVuc2lvbnMubWFwKGUgPT4gZS5uYXRpdmVFeHRlbnNpb24pXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgcGlwZVRvPFQ+KG9ic2VydmFibGU6IE9ic2VydmFibGU8VD4sIGV2ZW50RW1pdHRlcjogRXZlbnRFbWl0dGVyPFQ+KTogdm9pZCB7XG4gICAgb2JzZXJ2YWJsZVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZShlID0+IHtcbiAgICAgICAgaWYgKHRoaXMucnVuRXZlbnRzT3V0c2lkZUFuZ3VsYXIpIHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiBldmVudEVtaXR0ZXIubmV4dChlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IGV2ZW50RW1pdHRlci5uZXh0KGUpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldEVkaXRvckluQW5ndWxhckV4dGVuc2lvbigpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGFuZ3VsYXJFeHRlbnNpb24gb2YgdGhpcy5idWlsdEV4dGVuc2lvbnMpIHtcbiAgICAgIGFuZ3VsYXJFeHRlbnNpb24uZWRpdG9yID0gdGhpcy50aXB0YXAhO1xuICAgIH1cbiAgfVxufVxuIl19