@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
422 lines • 38.3 kB
JavaScript
import { __decorate, __metadata, __param, __values } from "tslib";
import { AfterViewInit, ChangeDetectorRef, Directive, ElementRef, HostBinding, HostListener, Inject, Input, OnDestroy, Optional, Self } from '@angular/core';
import { AbstractControl, FormControlName, NgControl, NgModel } from '@angular/forms';
import { IgxInputGroupBase } from '../../input-group/input-group.common';
var nativeValidationAttributes = ['required', 'pattern', 'minlength', 'maxlength', 'min', 'max', 'step'];
export var IgxInputState;
(function (IgxInputState) {
IgxInputState[IgxInputState["INITIAL"] = 0] = "INITIAL";
IgxInputState[IgxInputState["VALID"] = 1] = "VALID";
IgxInputState[IgxInputState["INVALID"] = 2] = "INVALID";
})(IgxInputState || (IgxInputState = {}));
var IgxInputDirective = /** @class */ (function () {
function IgxInputDirective(inputGroup, ngModel, formControl, element, cdr) {
this.inputGroup = inputGroup;
this.ngModel = ngModel;
this.formControl = formControl;
this.element = element;
this.cdr = cdr;
this._valid = IgxInputState.INITIAL;
/**
* Sets/gets whether the `"igx-input-group__input"` class is added to the host element.
* Default value is `false`.
* ```typescript
* this.igxInput.isInput = true;
* ```
* ```typescript
* let isCLassAdded = this.igxInput.isInput;
* ```
* @memberof IgxInputDirective
*/
this.isInput = false;
/**
* Sets/gets whether the `"class.igx-input-group__textarea"` class is added to the host element.
* Default value is `false`.
* ```typescript
* this.igxInput.isTextArea = true;
* ```
* ```typescript
* let isCLassAdded = this.igxInput.isTextArea;
* ```
* @memberof IgxInputDirective
*/
this.isTextArea = false;
}
Object.defineProperty(IgxInputDirective.prototype, "ngControl", {
get: function () {
return this.ngModel ? this.ngModel : this.formControl;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxInputDirective.prototype, "value", {
/**
* Gets the `value` propery.
* ```typescript
* @ViewChild('igxInput', {read: IgxInputDirective})
* public igxInput: IgxInputDirective;
* let inputValue = this.igxInput.value;
* ```
* @memberof IgxInputDirective
*/
get: function () {
return this.nativeElement.value;
},
/**
* Sets the `value` property.
* ```html
* <input-group>
* <input igxInput #igxInput [value]="'IgxInput Value'">
* </input-group>
* ```
* @memberof IgxInputDirective
*/
set: function (value) {
this.nativeElement.value = value;
this.checkValidity();
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxInputDirective.prototype, "disabled", {
/**
* Gets the `disabled` property
* ```typescript
* @ViewChild('igxInput', {read: IgxInputDirective})
* public igxInput: IgxInputDirective;
* let isDisabled = this.igxInput.disabled;
* ```
* @memberof IgxInputDirective
*/
get: function () {
return this.nativeElement.hasAttribute('disabled');
},
/**
* Sets the `disabled` property.
* ```html
* <input-group>
* <input igxInput #igxInput [disabled]="true">
* </input-group>
* ```
* @memberof IgxInputDirective
*/
set: function (value) {
this.nativeElement.disabled = value;
this.inputGroup.disabled = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxInputDirective.prototype, "required", {
/**
* Gets whether the igxInput is required.
* ```typescript
* let isRequired = this.igxInput.required;
* ```
* @memberof IgxInputDirective
*/
get: function () {
return this.nativeElement.hasAttribute('required');
},
/**
* Sets the `required` property.
* ```html
* <input-group>
* <input igxInput #igxInput [required]="true">
* </input-group>
* ```
* @memberof IgxInputDirective
*/
set: function (value) {
if (typeof value === 'boolean') {
this.nativeElement.required = this.inputGroup.isRequired = value;
if (value && !this.nativeElement.checkValidity()) {
this._valid = IgxInputState.INVALID;
}
else {
this._valid = IgxInputState.INITIAL;
}
}
},
enumerable: true,
configurable: true
});
/**
*@hidden
*/
IgxInputDirective.prototype.onFocus = function (event) {
this.inputGroup.isFocused = true;
};
/**
*@hidden
*/
IgxInputDirective.prototype.onBlur = function (event) {
this.inputGroup.isFocused = false;
this._valid = IgxInputState.INITIAL;
if (this.ngControl) {
if (!this.ngControl.valid) {
this._valid = IgxInputState.INVALID;
}
}
else if (this._hasValidators() && !this.nativeElement.checkValidity()) {
this._valid = IgxInputState.INVALID;
}
};
/**
*@hidden
*/
IgxInputDirective.prototype.onInput = function () {
this.checkValidity();
};
/**
*@hidden
*/
IgxInputDirective.prototype.ngAfterViewInit = function () {
this.inputGroup.hasPlaceholder = this.nativeElement.hasAttribute('placeholder');
this.inputGroup.disabled = this.inputGroup.disabled || this.nativeElement.hasAttribute('disabled');
this.inputGroup.isRequired = this.nativeElement.hasAttribute('required');
// Make sure we do not invalidate the input on init
if (!this.ngControl) {
this._valid = IgxInputState.INITIAL;
}
// Also check the control's validators for required
if (!this.inputGroup.isRequired && this.ngControl && this.ngControl.control.validator) {
var validation = this.ngControl.control.validator({});
this.inputGroup.isRequired = validation && validation.required;
}
var elTag = this.nativeElement.tagName.toLowerCase();
if (elTag === 'textarea') {
this.isTextArea = true;
}
else {
this.isInput = true;
}
if (this.ngControl) {
this._statusChanges$ = this.ngControl.statusChanges.subscribe(this.onStatusChanged.bind(this));
}
this.cdr.detectChanges();
};
/**
*@hidden
*/
IgxInputDirective.prototype.ngOnDestroy = function () {
if (this._statusChanges$) {
this._statusChanges$.unsubscribe();
}
};
/**
* Sets a focus on the igxInput.
* ```typescript
* this.igxInput.focus();
* ```
* @memberof IgxInputDirective
*/
IgxInputDirective.prototype.focus = function () {
this.nativeElement.focus();
};
Object.defineProperty(IgxInputDirective.prototype, "nativeElement", {
/**
* Gets the `nativeElement` of the igxInput.
* ```typescript
* let igxInputNativeElement = this.igxInput.nativeElement;
* ```
* @memberof IgxInputDirective
*/
get: function () {
return this.element.nativeElement;
},
enumerable: true,
configurable: true
});
/**
*@hidden
*/
IgxInputDirective.prototype.onStatusChanged = function () {
if (this.ngControl.control.validator || this.ngControl.control.asyncValidator) {
if (this.ngControl.control.touched || this.ngControl.control.dirty) {
// TODO: check the logic when control is touched or dirty
if (this.inputGroup.isFocused) {
// the user is still typing in the control
this._valid = this.ngControl.valid ? IgxInputState.VALID : IgxInputState.INVALID;
}
else {
// the user had touched the control previously but now the value is changing due to changes in the form
this._valid = this.ngControl.valid ? IgxInputState.INITIAL : IgxInputState.INVALID;
}
}
else {
// if control is untouched and pristine its state is initial. This is when user did not interact
// with the input or when form/control is reset
this._valid = IgxInputState.INITIAL;
}
}
};
Object.defineProperty(IgxInputDirective.prototype, "hasPlaceholder", {
/**
* Gets whether the igxInput has a placeholder.
* ```typescript
* let hasPlaceholder = this.igxInput.hasPlaceholder;
* ```
* @memberof IgxInputDirective
*/
get: function () {
return this.nativeElement.hasAttribute('placeholder');
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxInputDirective.prototype, "placeholder", {
/**
* Gets the placeholder element of the igxInput.
* ```typescript
* let igxInputPlaceholder = this.igxInput.placeholder;
* ```
* @memberof IgxInputDirective
*/
get: function () {
return this.nativeElement.placeholder;
},
enumerable: true,
configurable: true
});
IgxInputDirective.prototype._hasValidators = function () {
var e_1, _a;
try {
for (var nativeValidationAttributes_1 = __values(nativeValidationAttributes), nativeValidationAttributes_1_1 = nativeValidationAttributes_1.next(); !nativeValidationAttributes_1_1.done; nativeValidationAttributes_1_1 = nativeValidationAttributes_1.next()) {
var nativeValidationAttribute = nativeValidationAttributes_1_1.value;
if (this.nativeElement.hasAttribute(nativeValidationAttribute)) {
return true;
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (nativeValidationAttributes_1_1 && !nativeValidationAttributes_1_1.done && (_a = nativeValidationAttributes_1.return)) _a.call(nativeValidationAttributes_1);
}
finally { if (e_1) throw e_1.error; }
}
return !!this.ngControl && (!!this.ngControl.control.validator || !!this.ngControl.control.asyncValidator);
};
Object.defineProperty(IgxInputDirective.prototype, "focused", {
/**
* Gets whether the igxInput is focused.
* ```typescript
* let isFocused = this.igxInput.focused;
* ```
* @memberof IgxInputDirective
*/
get: function () {
return this.inputGroup.isFocused;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxInputDirective.prototype, "valid", {
/**
* Gets the state of the igxInput.
* ```typescript
* let igxInputState = this.igxInput.valid;
* ```
* @memberof IgxInputDirective
*/
get: function () {
return this._valid;
},
/**
* Sets the state of the igxInput.
* ```typescript
* this.igxInput.valid = IgxInputState.INVALID;
* ```
* @memberof IgxInputDirective
*/
set: function (value) {
this._valid = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxInputDirective.prototype, "isValid", {
/**
* Gets whether the igxInput is valid.
* ```typescript
* let valid = this.igxInput.isValid;
* ```
* @memberof IgxInputDirective
*/
get: function () {
return this.valid !== IgxInputState.INVALID;
},
enumerable: true,
configurable: true
});
IgxInputDirective.prototype.checkValidity = function () {
if (!this.ngControl && this._hasValidators()) {
this._valid = this.nativeElement.checkValidity() ? IgxInputState.VALID : IgxInputState.INVALID;
}
};
IgxInputDirective.ctorParameters = function () { return [
{ type: IgxInputGroupBase },
{ type: NgModel, decorators: [{ type: Optional }, { type: Self }, { type: Inject, args: [NgModel,] }] },
{ type: FormControlName, decorators: [{ type: Optional }, { type: Self }, { type: Inject, args: [FormControlName,] }] },
{ type: ElementRef },
{ type: ChangeDetectorRef }
]; };
__decorate([
Input('value'),
__metadata("design:type", Object),
__metadata("design:paramtypes", [Object])
], IgxInputDirective.prototype, "value", null);
__decorate([
Input(),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [Boolean])
], IgxInputDirective.prototype, "disabled", null);
__decorate([
Input(),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [Boolean])
], IgxInputDirective.prototype, "required", null);
__decorate([
HostBinding('class.igx-input-group__input'),
__metadata("design:type", Object)
], IgxInputDirective.prototype, "isInput", void 0);
__decorate([
HostBinding('class.igx-input-group__textarea'),
__metadata("design:type", Object)
], IgxInputDirective.prototype, "isTextArea", void 0);
__decorate([
HostListener('focus', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], IgxInputDirective.prototype, "onFocus", null);
__decorate([
HostListener('blur', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], IgxInputDirective.prototype, "onBlur", null);
__decorate([
HostListener('input'),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], IgxInputDirective.prototype, "onInput", null);
IgxInputDirective = __decorate([
Directive({
selector: '[igxInput]',
exportAs: 'igxInput'
}),
__param(1, Optional()), __param(1, Self()), __param(1, Inject(NgModel)),
__param(2, Optional()), __param(2, Self()), __param(2, Inject(FormControlName)),
__metadata("design:paramtypes", [IgxInputGroupBase,
NgModel,
FormControlName,
ElementRef,
ChangeDetectorRef])
], IgxInputDirective);
return IgxInputDirective;
}());
export { IgxInputDirective };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9kaXJlY3RpdmVzL2lucHV0L2lucHV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILGFBQWEsRUFDYixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsU0FBUyxFQUNULFFBQVEsRUFDUixJQUFJLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRXpFLElBQU0sMEJBQTBCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUUzRyxNQUFNLENBQU4sSUFBWSxhQUlYO0FBSkQsV0FBWSxhQUFhO0lBQ3JCLHVEQUFPLENBQUE7SUFDUCxtREFBSyxDQUFBO0lBQ0wsdURBQU8sQ0FBQTtBQUNYLENBQUMsRUFKVyxhQUFhLEtBQWIsYUFBYSxRQUl4QjtBQU1EO0lBSUksMkJBQ1csVUFBNkIsRUFDVyxPQUFnQixFQUNSLFdBQTRCLEVBQ3pFLE9BQW1CLEVBQ25CLEdBQXNCO1FBSnpCLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBQ1csWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNSLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUN6RSxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBUjVCLFdBQU0sR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDO1FBbUd2Qzs7Ozs7Ozs7OztX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O1NBQ3ZCLENBQUM7UUFPTyxXQUFBLFFBQVEsRUFBRSxDQUFBLEVBQUUsV0FBQSxJQUFJLEVBQUUsQ0FBQSxFQUFFLFdBQUEsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ25DLFdBQUEsUUFBUSxFQUFFLENBQUEsRUFBRSxXQUFBLElBQUksRUFBRSxDQUFBLEVBQUUsV0FBQSxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUE7eUNBRnpCLGlCQUFpQjtZQUNvQixPQUFPO1lBQ0ssZUFBZTtZQUNoRSxVQUFVO1lBQ2QsaUJBQWlCO09BVDNCLGlCQUFpQixDQTBUN0I7SUFBRCx3QkFBQztDQUFBLEFBMVRELElBMFRDO1NBMVRZLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBEaXJlY3RpdmUsXG4gICAgRWxlbWVudFJlZixcbiAgICBIb3N0QmluZGluZyxcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPcHRpb25hbCxcbiAgICBTZWxmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQ29udHJvbE5hbWUsIE5nQ29udHJvbCwgTmdNb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSWd4SW5wdXRHcm91cEJhc2UgfSBmcm9tICcuLi8uLi9pbnB1dC1ncm91cC9pbnB1dC1ncm91cC5jb21tb24nO1xuXG5jb25zdCBuYXRpdmVWYWxpZGF0aW9uQXR0cmlidXRlcyA9IFsncmVxdWlyZWQnLCAncGF0dGVybicsICdtaW5sZW5ndGgnLCAnbWF4bGVuZ3RoJywgJ21pbicsICdtYXgnLCAnc3RlcCddO1xuXG5leHBvcnQgZW51bSBJZ3hJbnB1dFN0YXRlIHtcbiAgICBJTklUSUFMLFxuICAgIFZBTElELFxuICAgIElOVkFMSURcbn1cblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaWd4SW5wdXRdJyxcbiAgICBleHBvcnRBczogJ2lneElucHV0J1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hJbnB1dERpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSBfdmFsaWQgPSBJZ3hJbnB1dFN0YXRlLklOSVRJQUw7XG4gICAgcHJpdmF0ZSBfc3RhdHVzQ2hhbmdlcyQ6IFN1YnNjcmlwdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgaW5wdXRHcm91cDogSWd4SW5wdXRHcm91cEJhc2UsXG4gICAgICAgIEBPcHRpb25hbCgpIEBTZWxmKCkgQEluamVjdChOZ01vZGVsKSBwcm90ZWN0ZWQgbmdNb2RlbDogTmdNb2RlbCxcbiAgICAgICAgQE9wdGlvbmFsKCkgQFNlbGYoKSBASW5qZWN0KEZvcm1Db250cm9sTmFtZSkgcHJvdGVjdGVkIGZvcm1Db250cm9sOiBGb3JtQ29udHJvbE5hbWUsXG4gICAgICAgIHByb3RlY3RlZCBlbGVtZW50OiBFbGVtZW50UmVmLFxuICAgICAgICBwcm90ZWN0ZWQgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikgeyB9XG5cbiAgICBwcml2YXRlIGdldCBuZ0NvbnRyb2woKTogTmdDb250cm9sIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmdNb2RlbCA/IHRoaXMubmdNb2RlbCA6IHRoaXMuZm9ybUNvbnRyb2w7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGB2YWx1ZWAgcHJvcGVydHkuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpbnB1dC1ncm91cD5cbiAgICAgKiAgPGlucHV0IGlneElucHV0ICNpZ3hJbnB1dCBbdmFsdWVdPVwiJ0lneElucHV0IFZhbHVlJ1wiPlxuICAgICAqIDwvaW5wdXQtZ3JvdXA+XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneElucHV0RGlyZWN0aXZlXG4gICAgICovXG4gICAgQElucHV0KCd2YWx1ZScpXG4gICAgc2V0IHZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZGl0eSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBgdmFsdWVgIHByb3BlcnkuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoJ2lneElucHV0Jywge3JlYWQ6IElneElucHV0RGlyZWN0aXZlfSlcbiAgICAgKiAgcHVibGljIGlneElucHV0OiBJZ3hJbnB1dERpcmVjdGl2ZTtcbiAgICAgKiBsZXQgaW5wdXRWYWx1ZSA9IHRoaXMuaWd4SW5wdXQudmFsdWU7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneElucHV0RGlyZWN0aXZlXG4gICAgICovXG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50LnZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgZGlzYWJsZWRgIHByb3BlcnR5LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aW5wdXQtZ3JvdXA+XG4gICAgICogIDxpbnB1dCBpZ3hJbnB1dCAjaWd4SW5wdXQgW2Rpc2FibGVkXT1cInRydWVcIj5cbiAgICAgKiA8L2lucHV0LWdyb3VwPlxuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hJbnB1dERpcmVjdGl2ZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuZGlzYWJsZWQgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5pbnB1dEdyb3VwLmRpc2FibGVkID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGBkaXNhYmxlZGAgcHJvcGVydHlcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZCgnaWd4SW5wdXQnLCB7cmVhZDogSWd4SW5wdXREaXJlY3RpdmV9KVxuICAgICAqICBwdWJsaWMgaWd4SW5wdXQ6IElneElucHV0RGlyZWN0aXZlO1xuICAgICAqIGxldCBpc0Rpc2FibGVkID0gdGhpcy5pZ3hJbnB1dC5kaXNhYmxlZDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4SW5wdXREaXJlY3RpdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgcmVxdWlyZWRgIHByb3BlcnR5LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aW5wdXQtZ3JvdXA+XG4gICAgICogIDxpbnB1dCBpZ3hJbnB1dCAjaWd4SW5wdXQgW3JlcXVpcmVkXT1cInRydWVcIj5cbiAgICAgKiA8L2lucHV0LWdyb3VwPlxuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hJbnB1dERpcmVjdGl2ZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCByZXF1aXJlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5yZXF1aXJlZCA9IHRoaXMuaW5wdXRHcm91cC5pc1JlcXVpcmVkID0gdmFsdWU7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiAhdGhpcy5uYXRpdmVFbGVtZW50LmNoZWNrVmFsaWRpdHkoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbGlkID0gSWd4SW5wdXRTdGF0ZS5JTlZBTElEO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl92YWxpZCA9IElneElucHV0U3RhdGUuSU5JVElBTDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgd2hldGhlciB0aGUgaWd4SW5wdXQgaXMgcmVxdWlyZWQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc1JlcXVpcmVkID0gdGhpcy5pZ3hJbnB1dC5yZXF1aXJlZDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4SW5wdXREaXJlY3RpdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJlcXVpcmVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgncmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciB0aGUgYFwiaWd4LWlucHV0LWdyb3VwX19pbnB1dFwiYCBjbGFzcyBpcyBhZGRlZCB0byB0aGUgaG9zdCBlbGVtZW50LlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5pZ3hJbnB1dC5pc0lucHV0ID0gdHJ1ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzQ0xhc3NBZGRlZCA9IHRoaXMuaWd4SW5wdXQuaXNJbnB1dDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4SW5wdXREaXJlY3RpdmVcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1pbnB1dC1ncm91cF9faW5wdXQnKVxuICAgIHB1YmxpYyBpc0lucHV0ID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHdoZXRoZXIgdGhlIGBcImNsYXNzLmlneC1pbnB1dC1ncm91cF9fdGV4dGFyZWFcImAgY2xhc3MgaXMgYWRkZWQgdG8gdGhlIGhvc3QgZWxlbWVudC5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuaWd4SW5wdXQuaXNUZXh0QXJlYSA9IHRydWU7XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc0NMYXNzQWRkZWQgPSB0aGlzLmlneElucHV0LmlzVGV4dEFyZWE7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneElucHV0RGlyZWN0aXZlXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtaW5wdXQtZ3JvdXBfX3RleHRhcmVhJylcbiAgICBwdWJsaWMgaXNUZXh0QXJlYSA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2ZvY3VzJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25Gb2N1cyhldmVudCkge1xuICAgICAgICB0aGlzLmlucHV0R3JvdXAuaXNGb2N1c2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcignYmx1cicsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uQmx1cihldmVudCkge1xuICAgICAgICB0aGlzLmlucHV0R3JvdXAuaXNGb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3ZhbGlkID0gSWd4SW5wdXRTdGF0ZS5JTklUSUFMO1xuICAgICAgICBpZiAodGhpcy5uZ0NvbnRyb2wpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5uZ0NvbnRyb2wudmFsaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl92YWxpZCA9IElneElucHV0U3RhdGUuSU5WQUxJRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9oYXNWYWxpZGF0b3JzKCkgJiYgIXRoaXMubmF0aXZlRWxlbWVudC5jaGVja1ZhbGlkaXR5KCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbGlkID0gSWd4SW5wdXRTdGF0ZS5JTlZBTElEO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2lucHV0JylcbiAgICBwdWJsaWMgb25JbnB1dCgpIHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkaXR5KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5pbnB1dEdyb3VwLmhhc1BsYWNlaG9sZGVyID0gdGhpcy5uYXRpdmVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgncGxhY2Vob2xkZXInKTtcbiAgICAgICAgdGhpcy5pbnB1dEdyb3VwLmRpc2FibGVkID0gdGhpcy5pbnB1dEdyb3VwLmRpc2FibGVkIHx8IHRoaXMubmF0aXZlRWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICAgIHRoaXMuaW5wdXRHcm91cC5pc1JlcXVpcmVkID0gdGhpcy5uYXRpdmVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgncmVxdWlyZWQnKTtcblxuICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG8gbm90IGludmFsaWRhdGUgdGhlIGlucHV0IG9uIGluaXRcbiAgICAgICAgaWYgKCF0aGlzLm5nQ29udHJvbCkge1xuICAgICAgICAgICAgdGhpcy5fdmFsaWQgPSBJZ3hJbnB1dFN0YXRlLklOSVRJQUw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWxzbyBjaGVjayB0aGUgY29udHJvbCdzIHZhbGlkYXRvcnMgZm9yIHJlcXVpcmVkXG4gICAgICAgIGlmICghdGhpcy5pbnB1dEdyb3VwLmlzUmVxdWlyZWQgJiYgdGhpcy5uZ0NvbnRyb2wgJiYgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC52YWxpZGF0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzLm5nQ29udHJvbC5jb250cm9sLnZhbGlkYXRvcih7fSBhcyBBYnN0cmFjdENvbnRyb2wpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dEdyb3VwLmlzUmVxdWlyZWQgPSB2YWxpZGF0aW9uICYmIHZhbGlkYXRpb24ucmVxdWlyZWQ7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGNvbnN0IGVsVGFnID0gdGhpcy5uYXRpdmVFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGVsVGFnID09PSAndGV4dGFyZWEnKSB7XG4gICAgICAgICAgICB0aGlzLmlzVGV4dEFyZWEgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pc0lucHV0ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuICAgICAgICAgICAgdGhpcy5fc3RhdHVzQ2hhbmdlcyQgPSB0aGlzLm5nQ29udHJvbC5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSh0aGlzLm9uU3RhdHVzQ2hhbmdlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLl9zdGF0dXNDaGFuZ2VzJCkge1xuICAgICAgICAgICAgdGhpcy5fc3RhdHVzQ2hhbmdlcyQudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgZm9jdXMgb24gdGhlIGlneElucHV0LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmlneElucHV0LmZvY3VzKCk7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneElucHV0RGlyZWN0aXZlXG4gICAgICovXG4gICAgcHVibGljIGZvY3VzKCkge1xuICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYG5hdGl2ZUVsZW1lbnRgIG9mIHRoZSBpZ3hJbnB1dC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlneElucHV0TmF0aXZlRWxlbWVudCA9IHRoaXMuaWd4SW5wdXQubmF0aXZlRWxlbWVudDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4SW5wdXREaXJlY3RpdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG5hdGl2ZUVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9uU3RhdHVzQ2hhbmdlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sLmNvbnRyb2wudmFsaWRhdG9yIHx8IHRoaXMubmdDb250cm9sLmNvbnRyb2wuYXN5bmNWYWxpZGF0b3IpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5nQ29udHJvbC5jb250cm9sLnRvdWNoZWQgfHwgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5kaXJ0eSkge1xuICAgICAgICAgICAgICAgIC8vICBUT0RPOiBjaGVjayB0aGUgbG9naWMgd2hlbiBjb250cm9sIGlzIHRvdWNoZWQgb3IgZGlydHlcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnB1dEdyb3VwLmlzRm9jdXNlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdXNlciBpcyBzdGlsbCB0eXBpbmcgaW4gdGhlIGNvbnRyb2xcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsaWQgPSB0aGlzLm5nQ29udHJvbC52YWxpZCA/IElneElucHV0U3RhdGUuVkFMSUQgOiBJZ3hJbnB1dFN0YXRlLklOVkFMSUQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHVzZXIgaGFkIHRvdWNoZWQgdGhlIGNvbnRyb2wgcHJldmlvdXNseSBidXQgbm93IHRoZSB2YWx1ZSBpcyBjaGFuZ2luZyBkdWUgdG8gY2hhbmdlcyBpbiB0aGUgZm9ybVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWxpZCA9IHRoaXMubmdDb250cm9sLnZhbGlkID8gSWd4SW5wdXRTdGF0ZS5JTklUSUFMIDogSWd4SW5wdXRTdGF0ZS5JTlZBTElEO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gIGlmIGNvbnRyb2wgaXMgdW50b3VjaGVkIGFuZCBwcmlzdGluZSBpdHMgc3RhdGUgaXMgaW5pdGlhbC4gVGhpcyBpcyB3aGVuIHVzZXIgZGlkIG5vdCBpbnRlcmFjdFxuICAgICAgICAgICAgICAgIC8vICB3aXRoIHRoZSBpbnB1dCBvciB3aGVuIGZvcm0vY29udHJvbCBpcyByZXNldFxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbGlkID0gSWd4SW5wdXRTdGF0ZS5JTklUSUFMO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgd2hldGhlciB0aGUgaWd4SW5wdXQgaGFzIGEgcGxhY2Vob2xkZXIuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBoYXNQbGFjZWhvbGRlciA9IHRoaXMuaWd4SW5wdXQuaGFzUGxhY2Vob2xkZXI7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneElucHV0RGlyZWN0aXZlXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNQbGFjZWhvbGRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudC5oYXNBdHRyaWJ1dGUoJ3BsYWNlaG9sZGVyJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHBsYWNlaG9sZGVyIGVsZW1lbnQgb2YgdGhlIGlneElucHV0LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaWd4SW5wdXRQbGFjZWhvbGRlciA9IHRoaXMuaWd4SW5wdXQucGxhY2Vob2xkZXI7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneElucHV0RGlyZWN0aXZlXG4gICAgICovXG4gICAgcHVibGljIGdldCBwbGFjZWhvbGRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudC5wbGFjZWhvbGRlcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYXNWYWxpZGF0b3JzKCk6IGJvb2xlYW4ge1xuICAgICAgICBmb3IgKGNvbnN0IG5hdGl2ZVZhbGlkYXRpb25BdHRyaWJ1dGUgb2YgbmF0aXZlVmFsaWRhdGlvbkF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKG5hdGl2ZVZhbGlkYXRpb25BdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gISF0aGlzLm5nQ29udHJvbCAmJiAoISF0aGlzLm5nQ29udHJvbC5jb250cm9sLnZhbGlkYXRvciB8fCAhIXRoaXMubmdDb250cm9sLmNvbnRyb2wuYXN5bmNWYWxpZGF0b3IpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHdoZXRoZXIgdGhlIGlneElucHV0IGlzIGZvY3VzZWQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc0ZvY3VzZWQgPSB0aGlzLmlneElucHV0LmZvY3VzZWQ7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneElucHV0RGlyZWN0aXZlXG4gICAgICovXG4gICAgcHVibGljIGdldCBmb2N1c2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnB1dEdyb3VwLmlzRm9jdXNlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3RhdGUgb2YgdGhlIGlneElucHV0LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaWd4SW5wdXRTdGF0ZSA9IHRoaXMuaWd4SW5wdXQudmFsaWQ7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneElucHV0RGlyZWN0aXZlXG4gICAgICovXG4gICAgcHVibGljIGdldCB2YWxpZCgpOiBJZ3hJbnB1dFN0YXRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgd2hldGhlciB0aGUgaWd4SW5wdXQgaXMgdmFsaWQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCB2YWxpZCA9IHRoaXMuaWd4SW5wdXQuaXNWYWxpZDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4SW5wdXREaXJlY3RpdmVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkICE9PSBJZ3hJbnB1dFN0YXRlLklOVkFMSUQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlIGlneElucHV0LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmlneElucHV0LnZhbGlkID0gSWd4SW5wdXRTdGF0ZS5JTlZBTElEO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hJbnB1dERpcmVjdGl2ZVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgdmFsaWQodmFsdWU6IElneElucHV0U3RhdGUpIHtcbiAgICAgICAgdGhpcy5fdmFsaWQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrVmFsaWRpdHkoKSB7XG4gICAgICAgIGlmICghdGhpcy5uZ0NvbnRyb2wgJiYgdGhpcy5faGFzVmFsaWRhdG9ycygpKSB7XG4gICAgICAgICAgICB0aGlzLl92YWxpZCA9IHRoaXMubmF0aXZlRWxlbWVudC5jaGVja1ZhbGlkaXR5KCkgPyBJZ3hJbnB1dFN0YXRlLlZBTElEIDogSWd4SW5wdXRTdGF0ZS5JTlZBTElEO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19