@kephas/ngx-core
Version:
Provides integration capabilities with Angular 13+.
202 lines • 20.3 kB
JavaScript
import { Input, ElementRef, ViewContainerRef, Component } from '@angular/core';
import { WidgetBase } from './widgetBase';
import * as i0 from "@angular/core";
/**
* Provides a base implementation for value editors.
*
* @export
* @abstract
* @class ValueEditorBase
* @implements {OnInit}
* @implements {AfterViewInit}
* @implements {ControlValueAccessor}
* @template TValue The value type.
*/
export class ValueEditorBase extends WidgetBase {
/**
* Creates an instance of ValueEditorBase.
*
* @param {ElementRef} elementRef The element reference.
* @param {ViewContainerRef} viewContainerRef The view container reference.
* @memberof ValueEditorBase
*/
constructor(elementRef, viewContainerRef) {
super(elementRef, viewContainerRef);
/**
* Gets or sets a value indicating whether the value is changed from the change event.
*
* @protected
* @memberof ValueEditorBase
*/
this.valueChangeFromEvent = false;
/**
* Gets or sets a value indicating whether the value is changed from the value property.
*
* @protected
* @memberof ValueEditorBase
*/
this.valueChangeFromValue = false;
this._onChange = (_) => {
// The implementation will get overwritten by Angular in RegisterOnChange.
};
this._onTouched = () => {
// The implementation will get overwritten by Angular in RegisterOnTouched.
};
}
/**
* Gets or sets the value to edit.
*
* @type {TValue}
* @memberOf ValueEditorBase
*/
get value() {
return this.getEditorValue();
}
set value(value) {
if (this._valueBeforeChange === value) {
return;
}
this.updateEditor(value);
}
/**
* Updates the underlying editor with the provided value.
*
* @protected
* @param {TValue} value
* @returns {boolean}
* @memberof ValueEditorBase
*/
updateEditor(value) {
if (this.valueChangeFromValue) {
return false;
}
const prevValueChangeFromValue = this.valueChangeFromValue;
this.valueChangeFromValue = true;
try {
const oldValue = this._valueBeforeChange;
this.onValueChanging(oldValue, value);
this._valueBeforeChange = value;
if (!this.valueChangeFromEvent) {
this.setEditorValue(value);
value = this.getEditorValue();
}
this.onValueChanged(oldValue, value);
}
catch (error) {
this.logger.error(error, 'Error while updating the editor.');
throw error;
}
finally {
this.valueChangeFromValue = prevValueChangeFromValue;
}
return true;
}
/**
* Overridable method invoked when the value is about to be changed.
*
* @protected
* @param {(TValue | undefined)} oldValue The old value.
* @param {(TValue | undefined)} newValue The new value.
* @memberof ValueEditorBase
*/
onValueChanging(oldValue, newValue) {
}
/**
* Overridable method invoked after the value was changed.
*
* @protected
* @param {(TValue | undefined)} oldValue The old value.
* @param {(TValue | undefined)} newValue The new value.
* @memberof ValueEditorBase
*/
onValueChanged(oldValue, newValue) {
this._onChange(newValue);
}
/**
* Callback invoked from the change event of the underlying editor.
*
* @protected
* @param {*} e
* @returns
* @memberof PropertyEditorComponent
*/
onEditorChange(e) {
if (this.valueChangeFromValue) {
return;
}
const prevValueChangeFromEvent = this.valueChangeFromEvent;
this.valueChangeFromEvent = true;
try {
const newValue = this.getEditorValueOnChange(e);
this.value = newValue;
}
catch (error) {
this.notification.notifyError(error);
}
finally {
this.valueChangeFromEvent = prevValueChangeFromEvent;
}
}
/**
* Gets the underlying editor's value upon change.
*
* @protected
* @param {*} e The change event arguments.
* @returns {TValue} The widget value.
* @memberof ValueEditorBase
*/
getEditorValueOnChange(e) {
return this.getEditorValue();
}
/**
* Write a new value to the element.
*
* @param {*} obj The new value.
*
* @memberOf PropertyEditorComponent
*/
writeValue(obj) {
this.value = obj;
}
/**
* Set the function to be called when the control receives a change event.
*
* @param {*} fn The callback function.
*
* @memberOf PropertyEditorComponent
*/
registerOnChange(fn) {
this._onChange = fn;
}
/**
* Set the function to be called when the control receives a touch event.
*
* @param {*} fn The callback function.
*
* @memberOf PropertyEditorComponent
*/
registerOnTouched(fn) {
this._onTouched = fn;
}
/**
* This function is called when the control status changes to or from "DISABLED".
* Depending on the value, it will enable or disable the appropriate DOM element.
*
* @param {boolean} isDisabled True if the state is disabled.
*
* @memberOf PropertyEditorComponent
*/
setDisabledState(isDisabled) {
}
}
ValueEditorBase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: ValueEditorBase, deps: [{ token: i0.ElementRef }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component });
ValueEditorBase.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: ValueEditorBase, selector: "ng-component", inputs: { value: "value" }, usesInheritance: true, ngImport: i0, template: '', isInline: true });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: ValueEditorBase, decorators: [{
type: Component,
args: [{
template: ''
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ViewContainerRef }]; }, propDecorators: { value: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsdWVFZGl0b3JCYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2VwaGFzL25neC1jb3JlL3NyYy9saWIvY29tcG9uZW50cy92YWx1ZUVkaXRvckJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILEtBQUssRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxFQUNqRCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDOztBQUUxQzs7Ozs7Ozs7OztHQVVHO0FBSUgsTUFBTSxPQUFnQixlQUNsQixTQUFRLFVBQVU7SUFxQ2xCOzs7Ozs7T0FNRztJQUNILFlBQ0ksVUFBc0IsRUFDdEIsZ0JBQWtDO1FBRWxDLEtBQUssQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQTdCeEM7Ozs7O1dBS0c7UUFDTyx5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFFdkM7Ozs7O1dBS0c7UUFDTyx5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFvTS9CLGNBQVMsR0FBRyxDQUFDLENBQU0sRUFBRSxFQUFFO1lBQzNCLDBFQUEwRTtRQUM5RSxDQUFDLENBQUM7UUFFTSxlQUFVLEdBQUcsR0FBRyxFQUFFO1lBQ3RCLDJFQUEyRTtRQUMvRSxDQUFDLENBQUM7SUExTEYsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFDSSxLQUFLO1FBQ0wsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLEtBQWE7UUFDbkIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEtBQUssS0FBSyxFQUFFO1lBQ25DLE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDTyxZQUFZLENBQUMsS0FBYTtRQUNoQyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUMzQixPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1FBQzNELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFFakMsSUFBSTtZQUNBLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztZQUN6QyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN0QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1lBRWhDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzNCLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDakM7WUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUN4QztRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBYyxFQUFFLGtDQUFrQyxDQUFDLENBQUM7WUFDdEUsTUFBTSxLQUFLLENBQUM7U0FDZjtnQkFBUztZQUNOLElBQUksQ0FBQyxvQkFBb0IsR0FBRyx3QkFBd0IsQ0FBQztTQUN4RDtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ08sZUFBZSxDQUFDLFFBQTRCLEVBQUUsUUFBNEI7SUFDcEYsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDTyxjQUFjLENBQUMsUUFBNEIsRUFBRSxRQUE0QjtRQUMvRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ08sY0FBYyxDQUFDLENBQU07UUFDM0IsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDM0IsT0FBTztTQUNWO1FBRUQsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDM0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUNqQyxJQUFJO1lBQ0EsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDO1NBQ3pCO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDWixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN4QztnQkFBUztZQUNOLElBQUksQ0FBQyxvQkFBb0IsR0FBRyx3QkFBd0IsQ0FBQztTQUN4RDtJQUNMLENBQUM7SUFvQkQ7Ozs7Ozs7T0FPRztJQUNPLHNCQUFzQixDQUFDLENBQU07UUFDbkMsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUdEOzs7Ozs7T0FNRztJQUNILFVBQVUsQ0FBQyxHQUFRO1FBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGdCQUFnQixDQUFDLEVBQU87UUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGlCQUFpQixDQUFDLEVBQU87UUFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxnQkFBZ0IsQ0FBQyxVQUFtQjtJQUNwQyxDQUFDOzs0R0FwT2lCLGVBQWU7Z0dBQWYsZUFBZSx1R0FGekIsRUFBRTsyRkFFUSxlQUFlO2tCQUhwQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxFQUFFO2lCQUNiO2dJQTRETyxLQUFLO3NCQURSLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgSW5wdXQsIEVsZW1lbnRSZWYsIFZpZXdDb250YWluZXJSZWYsIENvbXBvbmVudFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgV2lkZ2V0QmFzZSB9IGZyb20gJy4vd2lkZ2V0QmFzZSc7XHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgYSBiYXNlIGltcGxlbWVudGF0aW9uIGZvciB2YWx1ZSBlZGl0b3JzLlxyXG4gKlxyXG4gKiBAZXhwb3J0XHJcbiAqIEBhYnN0cmFjdFxyXG4gKiBAY2xhc3MgVmFsdWVFZGl0b3JCYXNlXHJcbiAqIEBpbXBsZW1lbnRzIHtPbkluaXR9XHJcbiAqIEBpbXBsZW1lbnRzIHtBZnRlclZpZXdJbml0fVxyXG4gKiBAaW1wbGVtZW50cyB7Q29udHJvbFZhbHVlQWNjZXNzb3J9XHJcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgVGhlIHZhbHVlIHR5cGUuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICB0ZW1wbGF0ZTogJydcclxufSlcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFZhbHVlRWRpdG9yQmFzZTxUVmFsdWU+XHJcbiAgICBleHRlbmRzIFdpZGdldEJhc2VcclxuICAgIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSB2YWx1ZSBkZXNjcmlwdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICogQG1lbWJlcm9mIFZhbHVlRWRpdG9yQmFzZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIG9yIHNldHMgdGhlIHZhbHVlIHByb21wdC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICogQG1lbWJlcm9mIFZhbHVlRWRpdG9yQmFzZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcHJvbXB0Pzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB2YWx1ZSBpcyBjaGFuZ2VkIGZyb20gdGhlIGNoYW5nZSBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAbWVtYmVyb2YgVmFsdWVFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCB2YWx1ZUNoYW5nZUZyb21FdmVudCA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB2YWx1ZSBpcyBjaGFuZ2VkIGZyb20gdGhlIHZhbHVlIHByb3BlcnR5LlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBtZW1iZXJvZiBWYWx1ZUVkaXRvckJhc2VcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHZhbHVlQ2hhbmdlRnJvbVZhbHVlID0gZmFsc2U7XHJcblxyXG4gICAgcHJpdmF0ZSBfdmFsdWVCZWZvcmVDaGFuZ2U/OiBUVmFsdWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFZhbHVlRWRpdG9yQmFzZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnRSZWZ9IGVsZW1lbnRSZWYgVGhlIGVsZW1lbnQgcmVmZXJlbmNlLlxyXG4gICAgICogQHBhcmFtIHtWaWV3Q29udGFpbmVyUmVmfSB2aWV3Q29udGFpbmVyUmVmIFRoZSB2aWV3IGNvbnRhaW5lciByZWZlcmVuY2UuXHJcbiAgICAgKiBAbWVtYmVyb2YgVmFsdWVFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICAgICAgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKGVsZW1lbnRSZWYsIHZpZXdDb250YWluZXJSZWYpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSB2YWx1ZSB0byBlZGl0LlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtUVmFsdWV9XHJcbiAgICAgKiBAbWVtYmVyT2YgVmFsdWVFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgdmFsdWUoKTogVFZhbHVlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRFZGl0b3JWYWx1ZSgpO1xyXG4gICAgfVxyXG4gICAgc2V0IHZhbHVlKHZhbHVlOiBUVmFsdWUpIHtcclxuICAgICAgICBpZiAodGhpcy5fdmFsdWVCZWZvcmVDaGFuZ2UgPT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlRWRpdG9yKHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIHVuZGVybHlpbmcgZWRpdG9yIHdpdGggdGhlIHByb3ZpZGVkIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBwYXJhbSB7VFZhbHVlfSB2YWx1ZVxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKiBAbWVtYmVyb2YgVmFsdWVFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCB1cGRhdGVFZGl0b3IodmFsdWU6IFRWYWx1ZSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0aGlzLnZhbHVlQ2hhbmdlRnJvbVZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHByZXZWYWx1ZUNoYW5nZUZyb21WYWx1ZSA9IHRoaXMudmFsdWVDaGFuZ2VGcm9tVmFsdWU7XHJcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZUZyb21WYWx1ZSA9IHRydWU7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fdmFsdWVCZWZvcmVDaGFuZ2U7XHJcbiAgICAgICAgICAgIHRoaXMub25WYWx1ZUNoYW5naW5nKG9sZFZhbHVlLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlQmVmb3JlQ2hhbmdlID0gdmFsdWU7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMudmFsdWVDaGFuZ2VGcm9tRXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0RWRpdG9yVmFsdWUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmdldEVkaXRvclZhbHVlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMub25WYWx1ZUNoYW5nZWQob2xkVmFsdWUsIHZhbHVlKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvciBhcyBFcnJvciwgJ0Vycm9yIHdoaWxlIHVwZGF0aW5nIHRoZSBlZGl0b3IuJyk7XHJcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2VGcm9tVmFsdWUgPSBwcmV2VmFsdWVDaGFuZ2VGcm9tVmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE92ZXJyaWRhYmxlIG1ldGhvZCBpbnZva2VkIHdoZW4gdGhlIHZhbHVlIGlzIGFib3V0IHRvIGJlIGNoYW5nZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHBhcmFtIHsoVFZhbHVlIHwgdW5kZWZpbmVkKX0gb2xkVmFsdWUgVGhlIG9sZCB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7KFRWYWx1ZSB8IHVuZGVmaW5lZCl9IG5ld1ZhbHVlIFRoZSBuZXcgdmFsdWUuXHJcbiAgICAgKiBAbWVtYmVyb2YgVmFsdWVFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBvblZhbHVlQ2hhbmdpbmcob2xkVmFsdWU6IFRWYWx1ZSB8IHVuZGVmaW5lZCwgbmV3VmFsdWU6IFRWYWx1ZSB8IHVuZGVmaW5lZCk6IHZvaWQge1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3ZlcnJpZGFibGUgbWV0aG9kIGludm9rZWQgYWZ0ZXIgdGhlIHZhbHVlIHdhcyBjaGFuZ2VkLlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBwYXJhbSB7KFRWYWx1ZSB8IHVuZGVmaW5lZCl9IG9sZFZhbHVlIFRoZSBvbGQgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0geyhUVmFsdWUgfCB1bmRlZmluZWQpfSBuZXdWYWx1ZSBUaGUgbmV3IHZhbHVlLlxyXG4gICAgICogQG1lbWJlcm9mIFZhbHVlRWRpdG9yQmFzZVxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgb25WYWx1ZUNoYW5nZWQob2xkVmFsdWU6IFRWYWx1ZSB8IHVuZGVmaW5lZCwgbmV3VmFsdWU6IFRWYWx1ZSB8IHVuZGVmaW5lZCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKG5ld1ZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxiYWNrIGludm9rZWQgZnJvbSB0aGUgY2hhbmdlIGV2ZW50IG9mIHRoZSB1bmRlcmx5aW5nIGVkaXRvci5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAcGFyYW0geyp9IGVcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKiBAbWVtYmVyb2YgUHJvcGVydHlFZGl0b3JDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIG9uRWRpdG9yQ2hhbmdlKGU6IGFueSkge1xyXG4gICAgICAgIGlmICh0aGlzLnZhbHVlQ2hhbmdlRnJvbVZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHByZXZWYWx1ZUNoYW5nZUZyb21FdmVudCA9IHRoaXMudmFsdWVDaGFuZ2VGcm9tRXZlbnQ7XHJcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZUZyb21FdmVudCA9IHRydWU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLmdldEVkaXRvclZhbHVlT25DaGFuZ2UoZSk7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbi5ub3RpZnlFcnJvcihlcnJvcik7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZUNoYW5nZUZyb21FdmVudCA9IHByZXZWYWx1ZUNoYW5nZUZyb21FdmVudDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdW5kZXJseWluZyBlZGl0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHBhcmFtIHtUVmFsdWV9IHZhbHVlIFRoZSB2YWx1ZSB0byBiZSBzZXQuXHJcbiAgICAgKiBAbWVtYmVyb2YgVmFsdWVFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBzZXRFZGl0b3JWYWx1ZSh2YWx1ZTogVFZhbHVlKTogdm9pZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHVuZGVybHlpbmcgZWRpdG9yJ3MgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHJldHVybnMge1RWYWx1ZX0gVGhlIHdpZGdldCB2YWx1ZS5cclxuICAgICAqIEBtZW1iZXJvZiBWYWx1ZUVkaXRvckJhc2VcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IGdldEVkaXRvclZhbHVlKCk6IFRWYWx1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHVuZGVybHlpbmcgZWRpdG9yJ3MgdmFsdWUgdXBvbiBjaGFuZ2UuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHBhcmFtIHsqfSBlIFRoZSBjaGFuZ2UgZXZlbnQgYXJndW1lbnRzLlxyXG4gICAgICogQHJldHVybnMge1RWYWx1ZX0gVGhlIHdpZGdldCB2YWx1ZS5cclxuICAgICAqIEBtZW1iZXJvZiBWYWx1ZUVkaXRvckJhc2VcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldEVkaXRvclZhbHVlT25DaGFuZ2UoZTogYW55KTogVFZhbHVlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRFZGl0b3JWYWx1ZSgpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFdyaXRlIGEgbmV3IHZhbHVlIHRvIHRoZSBlbGVtZW50LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Kn0gb2JqIFRoZSBuZXcgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlck9mIFByb3BlcnR5RWRpdG9yQ29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnZhbHVlID0gb2JqO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgY29udHJvbCByZWNlaXZlcyBhIGNoYW5nZSBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyp9IGZuIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyT2YgUHJvcGVydHlFZGl0b3JDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGNvbnRyb2wgcmVjZWl2ZXMgYSB0b3VjaCBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyp9IGZuIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyT2YgUHJvcGVydHlFZGl0b3JDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCA9IGZuO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgY29udHJvbCBzdGF0dXMgY2hhbmdlcyB0byBvciBmcm9tIFwiRElTQUJMRURcIi5cclxuICAgICAqIERlcGVuZGluZyBvbiB0aGUgdmFsdWUsIGl0IHdpbGwgZW5hYmxlIG9yIGRpc2FibGUgdGhlIGFwcHJvcHJpYXRlIERPTSBlbGVtZW50LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNEaXNhYmxlZCBUcnVlIGlmIHRoZSBzdGF0ZSBpcyBkaXNhYmxlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyT2YgUHJvcGVydHlFZGl0b3JDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfb25DaGFuZ2UgPSAoXzogYW55KSA9PiB7XHJcbiAgICAgICAgLy8gVGhlIGltcGxlbWVudGF0aW9uIHdpbGwgZ2V0IG92ZXJ3cml0dGVuIGJ5IEFuZ3VsYXIgaW4gUmVnaXN0ZXJPbkNoYW5nZS5cclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkID0gKCkgPT4ge1xyXG4gICAgICAgIC8vIFRoZSBpbXBsZW1lbnRhdGlvbiB3aWxsIGdldCBvdmVyd3JpdHRlbiBieSBBbmd1bGFyIGluIFJlZ2lzdGVyT25Ub3VjaGVkLlxyXG4gICAgfTtcclxufVxyXG4iXX0=