@adobe/cq-angular-editable-components
Version:
* [API](#api) * [Documentation](#documentation) * [Changelog](#changelog)
194 lines • 21.4 kB
JavaScript
/*
* ADOBE CONFIDENTIAL
*
* Copyright 2018 Adobe Systems Incorporated
* All Rights Reserved.
*
* NOTICE: All information contained herein is, and remains
* the property of Adobe Systems Incorporated and its suppliers,
* if any. The intellectual and technical concepts contained
* herein are proprietary to Adobe Systems Incorporated and its
* suppliers and may be covered by U.S. and Foreign Patents,
* patents in process, and are protected by trade secret or copyright law.
* Dissemination of this information or reproduction of this material
* is strictly forbidden unless prior written permission is obtained
* from Adobe Systems Incorporated.
*/
import { __decorate, __metadata } from "tslib";
import { Directive, Input, Renderer2, ViewContainerRef, ComponentFactoryResolver, ComponentRef, AfterViewInit, OnInit, OnDestroy, ChangeDetectorRef, OnChanges } from '@angular/core';
import { ComponentMapping } from './component-mapping';
import { Constants } from './constants';
import { Utils } from './utils';
const PLACEHOLDER_CLASS_NAME = 'cq-placeholder';
let AEMComponentDirective =
/**
* The current directive provides advanced capabilities among which are
*
* - The management of the component placeholder in the Page Editor
* - The dynamic instantiation of components based on a component definition
* - The conversion from model fields to properties and injection in the component instance
* - The management of HTMLElement attributes and class names on the native element
*/
class AEMComponentDirective {
constructor(renderer, viewContainer, factoryResolver, _changeDetectorRef) {
this.renderer = renderer;
this.viewContainer = viewContainer;
this.factoryResolver = factoryResolver;
this._changeDetectorRef = _changeDetectorRef;
}
get cqItem() {
return this._cqItem;
}
set cqItem(value) {
this._cqItem = value;
}
get changeDetectorRef() {
return this._changeDetectorRef;
}
ngOnInit() {
this.renderComponent(ComponentMapping.get(this.type));
}
ngOnChanges(changes) {
this.updateComponentData();
}
/**
* Returns the type of the cqItem if exists.
*/
get type() {
return this.cqItem && this.cqItem[Constants.TYPE_PROP];
}
/**
* Renders a component dynamically based on the component definition
*
* @param componentDefinition The component definition to render
*/
renderComponent(componentDefinition) {
if (componentDefinition) {
const factory = this.factoryResolver.resolveComponentFactory(componentDefinition);
this.viewContainer.clear();
this._component = this.viewContainer.createComponent(factory);
this.updateComponentData();
}
}
/**
* Updates the data of the component based the data of the directive
*/
updateComponentData() {
if (!this._component || !this._component.instance) {
return;
}
const keys = Object.getOwnPropertyNames(this.cqItem);
keys.forEach((key) => {
let propKey = key;
if (propKey.startsWith(':')) {
// Transformation of internal properties namespaced with [:] to [cq]
// :myProperty => cqMyProperty
const tempKey = propKey.substr(1);
propKey = 'cq' + tempKey.substr(0, 1).toUpperCase() + tempKey.substr(1);
}
this._component.instance[propKey] = this.cqItem[key];
});
this._component.instance.cqPath = this.cqPath;
this._component.instance.itemName = this.itemName;
const editConfig = ComponentMapping.getEditConfig(this.type);
if (editConfig && Utils.isInEditor) {
this.setupPlaceholder(editConfig);
}
this._changeDetectorRef.detectChanges();
}
/**
* Adds the specified item attributes to the element
*/
setupItemAttrs() {
if (this.itemAttrs) {
const keys = Object.getOwnPropertyNames(this.itemAttrs);
keys.forEach((key) => {
if (key === 'class') {
const classes = this.itemAttrs[key].split(' ');
classes.forEach((itemClass) => {
this.renderer.addClass(this._component.location.nativeElement, itemClass);
});
}
else {
this.renderer.setAttribute(this._component.location.nativeElement, key, this.itemAttrs[key]);
}
});
}
}
/**
* Determines if the placeholder should e displayed.
*
* @param editConfig - the edit config of the directive
*/
usePlaceholder(editConfig) {
return editConfig.isEmpty && typeof editConfig.isEmpty === 'function' && editConfig.isEmpty(this.cqItem);
}
/**
* Setups the placeholder of needed for the AEM editor
*
* @param editConfig - the editConfig, which will dictate the classes to be added on.
*/
setupPlaceholder(editConfig) {
if (this.usePlaceholder(editConfig)) {
this.renderer.addClass(this._component.location.nativeElement, PLACEHOLDER_CLASS_NAME);
this.renderer.setAttribute(this._component.location.nativeElement, 'data-emptytext', editConfig.emptyLabel);
}
else {
this.renderer.removeClass(this._component.location.nativeElement, PLACEHOLDER_CLASS_NAME);
this.renderer.removeAttribute(this._component.location.nativeElement, 'data-emptytext');
}
}
ngAfterViewInit() {
this.setupItemAttrs();
}
ngOnDestroy() {
this._component && this._component.destroy();
}
};
AEMComponentDirective.ctorParameters = () => [
{ type: Renderer2 },
{ type: ViewContainerRef },
{ type: ComponentFactoryResolver },
{ type: ChangeDetectorRef }
];
__decorate([
Input(),
__metadata("design:type", Object),
__metadata("design:paramtypes", [Object])
], AEMComponentDirective.prototype, "cqItem", null);
__decorate([
Input(),
__metadata("design:type", String)
], AEMComponentDirective.prototype, "cqPath", void 0);
__decorate([
Input(),
__metadata("design:type", String)
], AEMComponentDirective.prototype, "itemName", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], AEMComponentDirective.prototype, "itemAttrs", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], AEMComponentDirective.prototype, "aemComponent", void 0);
AEMComponentDirective = __decorate([
Directive({
selector: '[aemComponent]'
})
/**
* The current directive provides advanced capabilities among which are
*
* - The management of the component placeholder in the Page Editor
* - The dynamic instantiation of components based on a component definition
* - The conversion from model fields to properties and injection in the component instance
* - The management of HTMLElement attributes and class names on the native element
*/
,
__metadata("design:paramtypes", [Renderer2,
ViewContainerRef,
ComponentFactoryResolver,
ChangeDetectorRef])
], AEMComponentDirective);
export { AEMComponentDirective };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWVtLWNvbXBvbmVudC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYWRvYmUvY3EtYW5ndWxhci1lZGl0YWJsZS1jb21wb25lbnRzLyIsInNvdXJjZXMiOlsibGliL2xheW91dC9hZW0tY29tcG9uZW50LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7O0FBRUgsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsU0FBUyxFQUNULGdCQUFnQixFQUNoQix3QkFBd0IsRUFDeEIsWUFBWSxFQUNaLGFBQWEsRUFDYixNQUFNLEVBQ04sU0FBUyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFDeEMsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBR2hDLE1BQU0sc0JBQXNCLEdBQUcsZ0JBQWdCLENBQUM7QUFjaEQsSUFBYSxxQkFBcUI7QUFSbEM7Ozs7Ozs7R0FPRztBQUNILE1BQWEscUJBQXFCO0lBdUNoQyxZQUNVLFFBQW1CLEVBQ25CLGFBQStCLEVBQy9CLGVBQXlDLEVBQ3pDLGtCQUFxQztRQUhyQyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUMvQixvQkFBZSxHQUFmLGVBQWUsQ0FBMEI7UUFDekMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFtQjtJQUMvQyxDQUFDO0lBakNELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBR0QsSUFBSSxNQUFNLENBQUMsS0FBYTtRQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFD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LENBQUMsYUFBYSxFQUFFLHNCQUFzQixDQUFDLENBQUM7WUFDMUYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLGdCQUFnQixDQUFDLENBQUM7U0FDekY7SUFDSCxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0NBRUYsQ0FBQTs7WUF4SHFCLFNBQVM7WUFDSixnQkFBZ0I7WUFDZCx3QkFBd0I7WUFDckIsaUJBQWlCOztBQTNCL0M7SUFEQyxLQUFLLEVBQUU7OzttREFHUDtBQVNRO0lBQVIsS0FBSyxFQUFFOztxREFBZ0I7QUFJZjtJQUFSLEtBQUssRUFBRTs7dURBQWtCO0FBSWpCO0lBQVIsS0FBSyxFQUFFOzt3REFBbUI7QUFFbEI7SUFBUixLQUFLLEVBQUU7OzJEQUFjO0FBckNYLHFCQUFxQjtJQVpqQyxTQUFTLENBQUM7UUFDVCxRQUFRLEVBQUUsZ0JBQWdCO0tBQzNCLENBQUM7SUFFRjs7Ozs7OztPQU9HOztxQ0F5Q21CLFNBQVM7UUFDSixnQkFBZ0I7UUFDZCx3QkFBd0I7UUFDckIsaUJBQWlCO0dBM0NwQyxxQkFBcUIsQ0FnS2pDO1NBaEtZLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBBRE9CRSBDT05GSURFTlRJQUxcbiAqXG4gKiBDb3B5cmlnaHQgMjAxOCBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFxuICogQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBOT1RJQ0U6ICBBbGwgaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiBpcywgYW5kIHJlbWFpbnNcbiAqIHRoZSBwcm9wZXJ0eSBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBhbmQgaXRzIHN1cHBsaWVycyxcbiAqIGlmIGFueS4gIFRoZSBpbnRlbGxlY3R1YWwgYW5kIHRlY2huaWNhbCBjb25jZXB0cyBjb250YWluZWRcbiAqIGhlcmVpbiBhcmUgcHJvcHJpZXRhcnkgdG8gQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgYW5kIGl0c1xuICogc3VwcGxpZXJzIGFuZCBtYXkgYmUgY292ZXJlZCBieSBVLlMuIGFuZCBGb3JlaWduIFBhdGVudHMsXG4gKiBwYXRlbnRzIGluIHByb2Nlc3MsIGFuZCBhcmUgcHJvdGVjdGVkIGJ5IHRyYWRlIHNlY3JldCBvciBjb3B5cmlnaHQgbGF3LlxuICogRGlzc2VtaW5hdGlvbiBvZiB0aGlzIGluZm9ybWF0aW9uIG9yIHJlcHJvZHVjdGlvbiBvZiB0aGlzIG1hdGVyaWFsXG4gKiBpcyBzdHJpY3RseSBmb3JiaWRkZW4gdW5sZXNzIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBvYnRhaW5lZFxuICogZnJvbSBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC5cbiAqL1xuXG5pbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIElucHV0LFxuICBSZW5kZXJlcjIsXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgQ29tcG9uZW50UmVmLFxuICBBZnRlclZpZXdJbml0LFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIE9uQ2hhbmdlc1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ29tcG9uZW50TWFwcGluZyB9IGZyb20gJy4vY29tcG9uZW50LW1hcHBpbmcnO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuL3V0aWxzJztcblxuXG5jb25zdCBQTEFDRUhPTERFUl9DTEFTU19OQU1FID0gJ2NxLXBsYWNlaG9sZGVyJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2FlbUNvbXBvbmVudF0nXG59KVxuXG4vKipcbiAqIFRoZSBjdXJyZW50IGRpcmVjdGl2ZSBwcm92aWRlcyBhZHZhbmNlZCBjYXBhYmlsaXRpZXMgYW1vbmcgd2hpY2ggYXJlXG4gKlxuICogLSBUaGUgbWFuYWdlbWVudCBvZiB0aGUgY29tcG9uZW50IHBsYWNlaG9sZGVyIGluIHRoZSBQYWdlIEVkaXRvclxuICogLSBUaGUgZHluYW1pYyBpbnN0YW50aWF0aW9uIG9mIGNvbXBvbmVudHMgYmFzZWQgb24gYSBjb21wb25lbnQgZGVmaW5pdGlvblxuICogLSBUaGUgY29udmVyc2lvbiBmcm9tIG1vZGVsIGZpZWxkcyB0byBwcm9wZXJ0aWVzIGFuZCBpbmplY3Rpb24gaW4gdGhlIGNvbXBvbmVudCBpbnN0YW5jZVxuICogLSBUaGUgbWFuYWdlbWVudCBvZiBIVE1MRWxlbWVudCBhdHRyaWJ1dGVzIGFuZCBjbGFzcyBuYW1lcyBvbiB0aGUgbmF0aXZlIGVsZW1lbnRcbiAqL1xuZXhwb3J0IGNsYXNzIEFFTUNvbXBvbmVudERpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuXG4gIC8qKlxuICAgKiBEeW5hbWljYWxseSBjcmVhdGVkIGNvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBfY29tcG9uZW50OiBDb21wb25lbnRSZWY8YW55PjtcbiAgLyoqXG4gICAqIE1vZGVsIGl0ZW0gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCBjb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgX2NxSXRlbTogb2JqZWN0O1xuXG4gIGdldCBjcUl0ZW0oKTogb2JqZWN0IHtcbiAgICByZXR1cm4gdGhpcy5fY3FJdGVtO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGNxSXRlbSh2YWx1ZTogb2JqZWN0KSB7XG4gICAgdGhpcy5fY3FJdGVtID0gdmFsdWU7XG4gIH1cblxuICBnZXQgY2hhbmdlRGV0ZWN0b3JSZWYoKTogQ2hhbmdlRGV0ZWN0b3JSZWYge1xuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRoIHRvIHRoZSBtb2RlbCBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KCkgY3FQYXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlIG9mIHRoZSBjb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGl0ZW1OYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBIdG1sRWxlbWVudCBhdHRyaWJ1dGVzIGZvciB0aGUgY3VycmVudCBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBpdGVtQXR0cnM6IG9iamVjdDtcblxuICBASW5wdXQoKSBhZW1Db21wb25lbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcml2YXRlIGZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgX2NoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5yZW5kZXJDb21wb25lbnQoQ29tcG9uZW50TWFwcGluZy5nZXQodGhpcy50eXBlKSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBpbXBvcnQoXCJAYW5ndWxhci9jb3JlXCIpLlNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudERhdGEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBjcUl0ZW0gaWYgZXhpc3RzLlxuICAgKi9cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3FJdGVtICYmIHRoaXMuY3FJdGVtW0NvbnN0YW50cy5UWVBFX1BST1BdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgYSBjb21wb25lbnQgZHluYW1pY2FsbHkgYmFzZWQgb24gdGhlIGNvbXBvbmVudCBkZWZpbml0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBjb21wb25lbnREZWZpbml0aW9uIFRoZSBjb21wb25lbnQgZGVmaW5pdGlvbiB0byByZW5kZXJcbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb246IGFueSkge1xuICAgIGlmIChjb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5mYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICB0aGlzLnZpZXdDb250YWluZXIuY2xlYXIoKTtcbiAgICAgIHRoaXMuX2NvbXBvbmVudCA9IHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoZmFjdG9yeSk7XG4gICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudERhdGEoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgZGF0YSBvZiB0aGUgY29tcG9uZW50IGJhc2VkIHRoZSBkYXRhIG9mIHRoZSBkaXJlY3RpdmVcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQ29tcG9uZW50RGF0YSgpIHtcbiAgICBpZiAoIXRoaXMuX2NvbXBvbmVudCB8fCAhdGhpcy5fY29tcG9uZW50Lmluc3RhbmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMuY3FJdGVtKTtcblxuICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBsZXQgcHJvcEtleSA9IGtleTtcblxuICAgICAgaWYgKHByb3BLZXkuc3RhcnRzV2l0aCgnOicpKSB7XG4gICAgICAgIC8vIFRyYW5zZm9ybWF0aW9uIG9mIGludGVybmFsIHByb3BlcnRpZXMgbmFtZXNwYWNlZCB3aXRoIFs6XSB0byBbY3FdXG4gICAgICAgIC8vIDpteVByb3BlcnR5ID0+IGNxTXlQcm9wZXJ0eVxuICAgICAgICBjb25zdCB0ZW1wS2V5ID0gcHJvcEtleS5zdWJzdHIoMSk7XG4gICAgICAgIHByb3BLZXkgPSAnY3EnICsgdGVtcEtleS5zdWJzdHIoMCwgMSkudG9VcHBlckNhc2UoKSArIHRlbXBLZXkuc3Vic3RyKDEpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jb21wb25lbnQuaW5zdGFuY2VbcHJvcEtleV0gPSB0aGlzLmNxSXRlbVtrZXldO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fY29tcG9uZW50Lmluc3RhbmNlLmNxUGF0aCA9IHRoaXMuY3FQYXRoO1xuICAgIHRoaXMuX2NvbXBvbmVudC5pbnN0YW5jZS5pdGVtTmFtZSA9IHRoaXMuaXRlbU5hbWU7XG4gICAgY29uc3QgZWRpdENvbmZpZyA9IENvbXBvbmVudE1hcHBpbmcuZ2V0RWRpdENvbmZpZyh0aGlzLnR5cGUpO1xuICAgIGlmIChlZGl0Q29uZmlnICYmIFV0aWxzLmlzSW5FZGl0b3IpIHtcbiAgICAgIHRoaXMuc2V0dXBQbGFjZWhvbGRlcihlZGl0Q29uZmlnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyB0aGUgc3BlY2lmaWVkIGl0ZW0gYXR0cmlidXRlcyB0byB0aGUgZWxlbWVudFxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cEl0ZW1BdHRycygpIHtcbiAgICBpZiAodGhpcy5pdGVtQXR0cnMpIHtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzLml0ZW1BdHRycyk7XG5cbiAgICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGlmIChrZXkgPT09ICdjbGFzcycpIHtcbiAgICAgICAgICBjb25zdCBjbGFzc2VzID0gdGhpcy5pdGVtQXR0cnNba2V5XS5zcGxpdCgnICcpO1xuICAgICAgICAgIGNsYXNzZXMuZm9yRWFjaCgoaXRlbUNsYXNzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuX2NvbXBvbmVudC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LCBpdGVtQ2xhc3MpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuX2NvbXBvbmVudC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LCBrZXksIHRoaXMuaXRlbUF0dHJzW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiB0aGUgcGxhY2Vob2xkZXIgc2hvdWxkIGUgZGlzcGxheWVkLlxuICAgKlxuICAgKiBAcGFyYW0gZWRpdENvbmZpZyAtIHRoZSBlZGl0IGNvbmZpZyBvZiB0aGUgZGlyZWN0aXZlXG4gICAqL1xuICBwcml2YXRlIHVzZVBsYWNlaG9sZGVyKGVkaXRDb25maWcpIHtcbiAgICByZXR1cm4gZWRpdENvbmZpZy5pc0VtcHR5ICYmIHR5cGVvZiBlZGl0Q29uZmlnLmlzRW1wdHkgPT09ICdmdW5jdGlvbicgJiYgZWRpdENvbmZpZy5pc0VtcHR5KHRoaXMuY3FJdGVtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR1cHMgdGhlIHBsYWNlaG9sZGVyIG9mIG5lZWRlZCBmb3IgdGhlIEFFTSBlZGl0b3JcbiAgICpcbiAgICogQHBhcmFtIGVkaXRDb25maWcgLSB0aGUgZWRpdENvbmZpZywgd2hpY2ggd2lsbCBkaWN0YXRlIHRoZSBjbGFzc2VzIHRvIGJlIGFkZGVkIG9uLlxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cFBsYWNlaG9sZGVyKGVkaXRDb25maWcpIHtcbiAgICBpZiAodGhpcy51c2VQbGFjZWhvbGRlcihlZGl0Q29uZmlnKSkge1xuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLl9jb21wb25lbnQubG9jYXRpb24ubmF0aXZlRWxlbWVudCwgUExBQ0VIT0xERVJfQ0xBU1NfTkFNRSk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLl9jb21wb25lbnQubG9jYXRpb24ubmF0aXZlRWxlbWVudCwgJ2RhdGEtZW1wdHl0ZXh0JywgZWRpdENvbmZpZy5lbXB0eUxhYmVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLl9jb21wb25lbnQubG9jYXRpb24ubmF0aXZlRWxlbWVudCwgUExBQ0VIT0xERVJfQ0xBU1NfTkFNRSk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUF0dHJpYnV0ZSh0aGlzLl9jb21wb25lbnQubG9jYXRpb24ubmF0aXZlRWxlbWVudCwgJ2RhdGEtZW1wdHl0ZXh0Jyk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuc2V0dXBJdGVtQXR0cnMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX2NvbXBvbmVudCAmJiB0aGlzLl9jb21wb25lbnQuZGVzdHJveSgpO1xuICB9XG5cbn1cbiJdfQ==