@kephas/angular
Version:
Provides integration capabilities with Angular.
203 lines • 19.6 kB
JavaScript
import { Input, ElementRef, ViewContainerRef, Component } from '@angular/core';
import { WidgetBase } from '../../public-api';
/**
* 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.decorators = [
{ type: Component, args: [{
template: ''
},] }
];
ValueEditorBase.ctorParameters = () => [
{ type: ElementRef },
{ type: ViewContainerRef }
];
ValueEditorBase.propDecorators = {
value: [{ type: Input }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsdWVFZGl0b3JCYXNlLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXIvc3JjLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvdmFsdWVFZGl0b3JCYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxLQUFLLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFDakQsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTlDOzs7Ozs7Ozs7O0dBVUc7QUFJSCxNQUFNLE9BQWdCLGVBQ2xCLFNBQVEsVUFBVTtJQXFDbEI7Ozs7OztPQU1HO0lBQ0gsWUFDSSxVQUFzQixFQUN0QixnQkFBa0M7UUFFbEMsS0FBSyxDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBN0J4Qzs7Ozs7V0FLRztRQUNPLHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQUV2Qzs7Ozs7V0FLRztRQUNPLHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQW9NL0IsY0FBUyxHQUFHLENBQUMsQ0FBTSxFQUFFLEVBQUU7WUFDM0IsMEVBQTBFO1FBQzlFLENBQUMsQ0FBQztRQUVNLGVBQVUsR0FBRyxHQUFHLEVBQUU7WUFDdEIsMkVBQTJFO1FBQy9FLENBQUMsQ0FBQztJQTFMRixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUNJLEtBQUs7UUFDTCxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsS0FBYTtRQUNuQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxLQUFLLEVBQUU7WUFDbkMsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNPLFlBQVksQ0FBQyxLQUFhO1FBQ2hDLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzNCLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBRUQsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDM0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUVqQyxJQUFJO1lBQ0EsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1lBQ3pDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7WUFFaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtnQkFDNUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0IsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUNqQztZQUVELElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3hDO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDWixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsa0NBQWtDLENBQUMsQ0FBQztZQUM3RCxNQUFNLEtBQUssQ0FBQztTQUNmO2dCQUFTO1lBQ04sSUFBSSxDQUFDLG9CQUFvQixHQUFHLHdCQUF3QixDQUFDO1NBQ3hEO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDTyxlQUFlLENBQUMsUUFBNEIsRUFBRSxRQUE0QjtJQUNwRixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNPLGNBQWMsQ0FBQyxRQUE0QixFQUFFLFFBQTRCO1FBQy9FLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDTyxjQUFjLENBQUMsQ0FBTTtRQUMzQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUMzQixPQUFPO1NBQ1Y7UUFFRCxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztRQUMzRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1FBQ2pDLElBQUk7WUFDQSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUM7U0FDekI7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNaLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3hDO2dCQUFTO1lBQ04sSUFBSSxDQUFDLG9CQUFvQixHQUFHLHdCQUF3QixDQUFDO1NBQ3hEO0lBQ0wsQ0FBQztJQW9CRDs7Ozs7OztPQU9HO0lBQ08sc0JBQXNCLENBQUMsQ0FBTTtRQUNuQyxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBR0Q7Ozs7OztPQU1HO0lBQ0gsVUFBVSxDQUFDLEdBQVE7UUFDZixJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsZ0JBQWdCLENBQUMsRUFBTztRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsaUJBQWlCLENBQUMsRUFBTztRQUNyQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILGdCQUFnQixDQUFDLFVBQW1CO0lBQ3BDLENBQUM7OztZQXZPSixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLEVBQUU7YUFDYjs7O1lBbEJVLFVBQVU7WUFBRSxnQkFBZ0I7OztvQkE2RWxDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgSW5wdXQsIEVsZW1lbnRSZWYsIFZpZXdDb250YWluZXJSZWYsIENvbXBvbmVudFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgV2lkZ2V0QmFzZSB9IGZyb20gJy4uLy4uL3B1YmxpYy1hcGknO1xyXG5cclxuLyoqXHJcbiAqIFByb3ZpZGVzIGEgYmFzZSBpbXBsZW1lbnRhdGlvbiBmb3IgdmFsdWUgZWRpdG9ycy5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAYWJzdHJhY3RcclxuICogQGNsYXNzIFZhbHVlRWRpdG9yQmFzZVxyXG4gKiBAaW1wbGVtZW50cyB7T25Jbml0fVxyXG4gKiBAaW1wbGVtZW50cyB7QWZ0ZXJWaWV3SW5pdH1cclxuICogQGltcGxlbWVudHMge0NvbnRyb2xWYWx1ZUFjY2Vzc29yfVxyXG4gKiBAdGVtcGxhdGUgVFZhbHVlIFRoZSB2YWx1ZSB0eXBlLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgdGVtcGxhdGU6ICcnXHJcbn0pXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBWYWx1ZUVkaXRvckJhc2U8VFZhbHVlPlxyXG4gICAgZXh0ZW5kcyBXaWRnZXRCYXNlXHJcbiAgICBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyB0aGUgdmFsdWUgZGVzY3JpcHRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqIEBtZW1iZXJvZiBWYWx1ZUVkaXRvckJhc2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSB2YWx1ZSBwcm9tcHQuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqIEBtZW1iZXJvZiBWYWx1ZUVkaXRvckJhc2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHByb21wdD86IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgdmFsdWUgaXMgY2hhbmdlZCBmcm9tIHRoZSBjaGFuZ2UgZXZlbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQG1lbWJlcm9mIFZhbHVlRWRpdG9yQmFzZVxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgdmFsdWVDaGFuZ2VGcm9tRXZlbnQgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgdmFsdWUgaXMgY2hhbmdlZCBmcm9tIHRoZSB2YWx1ZSBwcm9wZXJ0eS5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAbWVtYmVyb2YgVmFsdWVFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCB2YWx1ZUNoYW5nZUZyb21WYWx1ZSA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgX3ZhbHVlQmVmb3JlQ2hhbmdlPzogVFZhbHVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBWYWx1ZUVkaXRvckJhc2UuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50UmVmfSBlbGVtZW50UmVmIFRoZSBlbGVtZW50IHJlZmVyZW5jZS5cclxuICAgICAqIEBwYXJhbSB7Vmlld0NvbnRhaW5lclJlZn0gdmlld0NvbnRhaW5lclJlZiBUaGUgdmlldyBjb250YWluZXIgcmVmZXJlbmNlLlxyXG4gICAgICogQG1lbWJlcm9mIFZhbHVlRWRpdG9yQmFzZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgICAgIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihlbGVtZW50UmVmLCB2aWV3Q29udGFpbmVyUmVmKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyB0aGUgdmFsdWUgdG8gZWRpdC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7VFZhbHVlfVxyXG4gICAgICogQG1lbWJlck9mIFZhbHVlRWRpdG9yQmFzZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IHZhbHVlKCk6IFRWYWx1ZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RWRpdG9yVmFsdWUoKTtcclxuICAgIH1cclxuICAgIHNldCB2YWx1ZSh2YWx1ZTogVFZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3ZhbHVlQmVmb3JlQ2hhbmdlID09PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZUVkaXRvcih2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSB1bmRlcmx5aW5nIGVkaXRvciB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAcGFyYW0ge1RWYWx1ZX0gdmFsdWVcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICogQG1lbWJlcm9mIFZhbHVlRWRpdG9yQmFzZVxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgdXBkYXRlRWRpdG9yKHZhbHVlOiBUVmFsdWUpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodGhpcy52YWx1ZUNoYW5nZUZyb21WYWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwcmV2VmFsdWVDaGFuZ2VGcm9tVmFsdWUgPSB0aGlzLnZhbHVlQ2hhbmdlRnJvbVZhbHVlO1xyXG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2VGcm9tVmFsdWUgPSB0cnVlO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX3ZhbHVlQmVmb3JlQ2hhbmdlO1xyXG4gICAgICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2luZyhvbGRWYWx1ZSwgdmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLl92YWx1ZUJlZm9yZUNoYW5nZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLnZhbHVlQ2hhbmdlRnJvbUV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEVkaXRvclZhbHVlKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5nZXRFZGl0b3JWYWx1ZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkKG9sZFZhbHVlLCB2YWx1ZSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3IsICdFcnJvciB3aGlsZSB1cGRhdGluZyB0aGUgZWRpdG9yLicpO1xyXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlRnJvbVZhbHVlID0gcHJldlZhbHVlQ2hhbmdlRnJvbVZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdmVycmlkYWJsZSBtZXRob2QgaW52b2tlZCB3aGVuIHRoZSB2YWx1ZSBpcyBhYm91dCB0byBiZSBjaGFuZ2VkLlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBwYXJhbSB7KFRWYWx1ZSB8IHVuZGVmaW5lZCl9IG9sZFZhbHVlIFRoZSBvbGQgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0geyhUVmFsdWUgfCB1bmRlZmluZWQpfSBuZXdWYWx1ZSBUaGUgbmV3IHZhbHVlLlxyXG4gICAgICogQG1lbWJlcm9mIFZhbHVlRWRpdG9yQmFzZVxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgb25WYWx1ZUNoYW5naW5nKG9sZFZhbHVlOiBUVmFsdWUgfCB1bmRlZmluZWQsIG5ld1ZhbHVlOiBUVmFsdWUgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE92ZXJyaWRhYmxlIG1ldGhvZCBpbnZva2VkIGFmdGVyIHRoZSB2YWx1ZSB3YXMgY2hhbmdlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAcGFyYW0geyhUVmFsdWUgfCB1bmRlZmluZWQpfSBvbGRWYWx1ZSBUaGUgb2xkIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHsoVFZhbHVlIHwgdW5kZWZpbmVkKX0gbmV3VmFsdWUgVGhlIG5ldyB2YWx1ZS5cclxuICAgICAqIEBtZW1iZXJvZiBWYWx1ZUVkaXRvckJhc2VcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIG9uVmFsdWVDaGFuZ2VkKG9sZFZhbHVlOiBUVmFsdWUgfCB1bmRlZmluZWQsIG5ld1ZhbHVlOiBUVmFsdWUgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdWYWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayBpbnZva2VkIGZyb20gdGhlIGNoYW5nZSBldmVudCBvZiB0aGUgdW5kZXJseWluZyBlZGl0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHBhcmFtIHsqfSBlXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICogQG1lbWJlcm9mIFByb3BlcnR5RWRpdG9yQ29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBvbkVkaXRvckNoYW5nZShlOiBhbnkpIHtcclxuICAgICAgICBpZiAodGhpcy52YWx1ZUNoYW5nZUZyb21WYWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwcmV2VmFsdWVDaGFuZ2VGcm9tRXZlbnQgPSB0aGlzLnZhbHVlQ2hhbmdlRnJvbUV2ZW50O1xyXG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2VGcm9tRXZlbnQgPSB0cnVlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5nZXRFZGl0b3JWYWx1ZU9uQ2hhbmdlKGUpO1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb24ubm90aWZ5RXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2VGcm9tRXZlbnQgPSBwcmV2VmFsdWVDaGFuZ2VGcm9tRXZlbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHVuZGVybHlpbmcgZWRpdG9yLlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBwYXJhbSB7VFZhbHVlfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgc2V0LlxyXG4gICAgICogQG1lbWJlcm9mIFZhbHVlRWRpdG9yQmFzZVxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc2V0RWRpdG9yVmFsdWUodmFsdWU6IFRWYWx1ZSk6IHZvaWQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSB1bmRlcmx5aW5nIGVkaXRvcidzIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEByZXR1cm5zIHtUVmFsdWV9IFRoZSB3aWRnZXQgdmFsdWUuXHJcbiAgICAgKiBAbWVtYmVyb2YgVmFsdWVFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRFZGl0b3JWYWx1ZSgpOiBUVmFsdWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSB1bmRlcmx5aW5nIGVkaXRvcidzIHZhbHVlIHVwb24gY2hhbmdlLlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBwYXJhbSB7Kn0gZSBUaGUgY2hhbmdlIGV2ZW50IGFyZ3VtZW50cy5cclxuICAgICAqIEByZXR1cm5zIHtUVmFsdWV9IFRoZSB3aWRnZXQgdmFsdWUuXHJcbiAgICAgKiBAbWVtYmVyb2YgVmFsdWVFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXRFZGl0b3JWYWx1ZU9uQ2hhbmdlKGU6IGFueSk6IFRWYWx1ZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RWRpdG9yVmFsdWUoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXcml0ZSBhIG5ldyB2YWx1ZSB0byB0aGUgZWxlbWVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyp9IG9iaiBUaGUgbmV3IHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJPZiBQcm9wZXJ0eUVkaXRvckNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IG9iajtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGNvbnRyb2wgcmVjZWl2ZXMgYSBjaGFuZ2UgZXZlbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsqfSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlck9mIFByb3BlcnR5RWRpdG9yQ29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX29uQ2hhbmdlID0gZm47XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBjb250cm9sIHJlY2VpdmVzIGEgdG91Y2ggZXZlbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsqfSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlck9mIFByb3BlcnR5RWRpdG9yQ29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9vblRvdWNoZWQgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGNvbnRyb2wgc3RhdHVzIGNoYW5nZXMgdG8gb3IgZnJvbSBcIkRJU0FCTEVEXCIuXHJcbiAgICAgKiBEZXBlbmRpbmcgb24gdGhlIHZhbHVlLCBpdCB3aWxsIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBhcHByb3ByaWF0ZSBET00gZWxlbWVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzRGlzYWJsZWQgVHJ1ZSBpZiB0aGUgc3RhdGUgaXMgZGlzYWJsZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlck9mIFByb3BlcnR5RWRpdG9yQ29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX29uQ2hhbmdlID0gKF86IGFueSkgPT4ge1xyXG4gICAgICAgIC8vIFRoZSBpbXBsZW1lbnRhdGlvbiB3aWxsIGdldCBvdmVyd3JpdHRlbiBieSBBbmd1bGFyIGluIFJlZ2lzdGVyT25DaGFuZ2UuXHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgX29uVG91Y2hlZCA9ICgpID0+IHtcclxuICAgICAgICAvLyBUaGUgaW1wbGVtZW50YXRpb24gd2lsbCBnZXQgb3ZlcndyaXR0ZW4gYnkgQW5ndWxhciBpbiBSZWdpc3Rlck9uVG91Y2hlZC5cclxuICAgIH07XHJcbn1cclxuIl19