ngx-materialize
Version:
An Angular wrap around Materialize library
276 lines (275 loc) • 24.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Component, ComponentFactoryResolver, ElementRef, HostBinding, HostListener, Input, Renderer, ViewContainerRef, ViewEncapsulation, } from '@angular/core';
import { NgControl } from '@angular/forms';
import { ErrorMessageResource, MzErrorMessageComponent } from './error-message/index';
var MzValidationComponent = /** @class */ (function () {
function MzValidationComponent(elementRef, resolver, viewContainerRef, ngControl, renderer) {
this.elementRef = elementRef;
this.resolver = resolver;
this.viewContainerRef = viewContainerRef;
this.ngControl = ngControl;
this.renderer = renderer;
this.errorMessageComponent = null;
this._formControlDisabled = false;
this._required = false;
}
Object.defineProperty(MzValidationComponent.prototype, "required", {
get: /**
* @return {?}
*/
function () { return this._required; },
set: /**
* @param {?} value
* @return {?}
*/
function (value) { this._required = (value != null && "" + value !== 'false'); },
enumerable: true,
configurable: true
});
Object.defineProperty(MzValidationComponent.prototype, "formControlDisabled", {
get: /**
* @return {?}
*/
function () { return this._formControlDisabled; },
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._formControlDisabled = value;
if (this._formControlDisabled) {
this.ngControl.control.disable();
}
else {
this.ngControl.control.enable();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(MzValidationComponent.prototype, "elementToAddValidation", {
get: /**
* @return {?}
*/
function () {
return this.isNativeSelectElement
? this.inputSelectDropdown
: this.nativeElement;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MzValidationComponent.prototype, "inputSelectDropdown", {
get: /**
* @return {?}
*/
function () {
return this.nativeElement.siblings('input.select-dropdown');
},
enumerable: true,
configurable: true
});
Object.defineProperty(MzValidationComponent.prototype, "isNativeSelectElement", {
get: /**
* @return {?}
*/
function () {
return this.nativeElement[0].nodeName === 'SELECT';
},
enumerable: true,
configurable: true
});
/**
* @param {?} target
* @return {?}
*/
MzValidationComponent.prototype.onFocusOut = /**
* @param {?} target
* @return {?}
*/
function (target) {
this.ngControl.control.markAsTouched();
this.setValidationState();
};
/**
* @return {?}
*/
MzValidationComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
this.initElements();
this.initErrorMessageComponent();
this.subscribeStatusChanges();
};
/**
* @return {?}
*/
MzValidationComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.statusChangesSubscription.unsubscribe();
this.errorMessageComponent.destroy();
};
/**
* @param {?} element
* @return {?}
*/
MzValidationComponent.prototype.clearValidationState = /**
* @param {?} element
* @return {?}
*/
function (element) {
this.renderer.setElementClass(element[0], 'valid', false);
this.renderer.setElementClass(element[0], 'invalid', false);
};
/**
* @return {?}
*/
MzValidationComponent.prototype.createRequiredSpanElement = /**
* @return {?}
*/
function () {
if (this.required && this.labelElement) {
var /** @type {?} */ spanElement = document.createElement('span');
spanElement.setAttribute('class', 'placeholder-required');
spanElement.textContent = ' *';
this.renderer.invokeElementMethod(this.labelElement, 'appendChild', [spanElement]);
}
};
/**
* @return {?}
*/
MzValidationComponent.prototype.initElements = /**
* @return {?}
*/
function () {
this.labelElement = $('label[for="' + this.id + '"]')[0];
this.nativeElement = $(this.elementRef.nativeElement);
this.createRequiredSpanElement();
};
/**
* @return {?}
*/
MzValidationComponent.prototype.initErrorMessageComponent = /**
* @return {?}
*/
function () {
var /** @type {?} */ errorMessageFactory = this.resolver.resolveComponentFactory(MzErrorMessageComponent);
this.errorMessageComponent = this.viewContainerRef.createComponent(errorMessageFactory);
this.errorMessageComponent.instance.errorMessageResource = this.errorMessageResource;
this.errorMessageComponent.instance.control = this.ngControl.control;
this.errorMessageComponent.changeDetectorRef.detectChanges();
var /** @type {?} */ errorMessage = this.nativeElement.parent().children('mz-error-message');
this.renderer.invokeElementMethod(errorMessage, 'insertAfter', [this.labelElement]);
};
/**
* @return {?}
*/
MzValidationComponent.prototype.setValidationState = /**
* @return {?}
*/
function () {
// to handle reset form
if (this.ngControl.control.untouched && this.ngControl.control.pristine) {
this.clearValidationState(this.elementToAddValidation);
return;
}
// to handle field validity
if (this.ngControl.control.enabled) {
if (this.ngControl.control.valid) {
this.renderer.setElementClass(this.elementToAddValidation[0], 'valid', true);
this.renderer.setElementClass(this.elementToAddValidation[0], 'invalid', false);
}
else {
this.renderer.setElementClass(this.elementToAddValidation[0], 'valid', false);
this.renderer.setElementClass(this.elementToAddValidation[0], 'invalid', true);
}
}
else {
this.clearValidationState(this.elementToAddValidation);
}
};
/**
* @return {?}
*/
MzValidationComponent.prototype.subscribeStatusChanges = /**
* @return {?}
*/
function () {
var _this = this;
this.statusChangesSubscription = this.ngControl.control.statusChanges.subscribe(function (status) {
// TODO Find a better way to handle validation after the form subscription. (see demo form-validation)
// wait for the valueChanges method from FormGroup to have been triggered before handling the validation state
// /!\ race condition warning /!\
setTimeout(function () { return _this.setValidationState(); });
});
};
MzValidationComponent.decorators = [
{ type: Component, args: [{
encapsulation: ViewEncapsulation.None,
selector: 'mz-validation, [mz-validation], [mzValidation]',
template: "<ng-content></ng-content>",
styles: [".select-wrapper input.select-dropdown.invalid,textarea.ng-invalid.ng-touched:focus{border-bottom:1px solid #f44336;box-shadow:0 1px 0 0 #f44336}.select-wrapper input.select-dropdown.valid{border-bottom:1px solid #4caf50;box-shadow:0 1px 0 0 #4caf50}input:not([type=checkbox]):focus+label.active span.placeholder-required,textarea:focus+label.active span.placeholder-required{color:#f44336}"],
},] },
];
/** @nocollapse */
MzValidationComponent.ctorParameters = function () { return [
{ type: ElementRef, },
{ type: ComponentFactoryResolver, },
{ type: ViewContainerRef, },
{ type: NgControl, },
{ type: Renderer, },
]; };
MzValidationComponent.propDecorators = {
"id": [{ type: Input },],
"errorMessageResource": [{ type: Input },],
"required": [{ type: HostBinding, args: ['attr.required',] }, { type: Input },],
"formControlDisabled": [{ type: Input },],
"onFocusOut": [{ type: HostListener, args: ['focusout', ['$event.target'],] },],
};
return MzValidationComponent;
}());
export { MzValidationComponent };
function MzValidationComponent_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
MzValidationComponent.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
MzValidationComponent.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
MzValidationComponent.propDecorators;
/** @type {?} */
MzValidationComponent.prototype.errorMessageComponent;
/** @type {?} */
MzValidationComponent.prototype.labelElement;
/** @type {?} */
MzValidationComponent.prototype.nativeElement;
/** @type {?} */
MzValidationComponent.prototype.statusChangesSubscription;
/** @type {?} */
MzValidationComponent.prototype.id;
/** @type {?} */
MzValidationComponent.prototype.errorMessageResource;
/** @type {?} */
MzValidationComponent.prototype._formControlDisabled;
/** @type {?} */
MzValidationComponent.prototype._required;
/** @type {?} */
MzValidationComponent.prototype.elementRef;
/** @type {?} */
MzValidationComponent.prototype.resolver;
/** @type {?} */
MzValidationComponent.prototype.viewContainerRef;
/** @type {?} */
MzValidationComponent.prototype.ngControl;
/** @type {?} */
MzValidationComponent.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtbWF0ZXJpYWxpemUvIiwic291cmNlcyI6WyJzcmMvdmFsaWRhdGlvbi92YWxpZGF0aW9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCx3QkFBd0IsRUFFeEIsVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUVMLFFBQVEsRUFDUixnQkFBZ0IsRUFDaEIsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUczQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7SUEyRHBGLCtCQUNVLFlBQ0EsVUFDQSxrQkFDRCxXQUNBO1FBSkMsZUFBVSxHQUFWLFVBQVU7UUFDVixhQUFRLEdBQVIsUUFBUTtRQUNSLHFCQUFnQixHQUFoQixnQkFBZ0I7UUFDakIsY0FBUyxHQUFULFNBQVM7UUFDVCxhQUFRLEdBQVIsUUFBUTtxQ0F2RCtDLElBQUk7b0NBV3JDLEtBQUs7eUJBQ2hCLEtBQUs7S0E0Q3BCOzBCQXhDRCwyQ0FBUTs7OztzQkFBSyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQzs7Ozs7UUFDdkMsVUFBYSxLQUFVLElBQUksSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQUssSUFBSSxJQUFJLElBQUksS0FBRyxLQUFPLEtBQUssT0FBTyxDQUFDLENBQUMsRUFBRTs7OzswQkFHcEYsc0RBQW1COzs7O3NCQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUM7Ozs7O1FBQzdELFVBQXdCLEtBQWM7WUFDcEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztZQUNsQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO2dCQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUNsQztZQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNOLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQ2pDO1NBQ0Y7Ozs7SUFFRCxzQkFBSSx5REFBc0I7Ozs7UUFBMUI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQjtnQkFDL0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUI7Z0JBQzFCLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1NBQ3hCOzs7T0FBQTtJQUVELHNCQUFJLHNEQUFtQjs7OztRQUF2QjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1NBQzdEOzs7T0FBQTtJQUVELHNCQUFJLHdEQUFxQjs7OztRQUF6QjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUM7U0FDcEQ7OztPQUFBOzs7OztJQUdELDBDQUFVOzs7O2NBQUMsTUFBYTtRQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzs7Ozs7SUFXNUIsK0NBQWU7OztJQUFmO1FBQ0UsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0tBQy9COzs7O0lBRUQsMkNBQVc7OztJQUFYO1FBQ0UsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztLQUN0Qzs7Ozs7SUFFRCxvREFBb0I7Ozs7SUFBcEIsVUFBcUIsT0FBZTtRQUNsQyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDN0Q7Ozs7SUFFRCx5REFBeUI7OztJQUF6QjtRQUNFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDdkMscUJBQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkQsV0FBVyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztZQUMxRCxXQUFXLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUMvQixJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztTQUNwRjtLQUNGOzs7O0lBRUQsNENBQVk7OztJQUFaO1FBQ0UsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztLQUNsQzs7OztJQUVELHlEQUF5Qjs7O0lBQXpCO1FBQ0UscUJBQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzNGLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDeEYsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDckYsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7UUFDckUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRTdELHFCQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzlFLElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0tBQ3JGOzs7O0lBRUQsa0RBQWtCOzs7SUFBbEI7O1FBRUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDeEUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sQ0FBQztTQUNSOztRQUVELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDbkMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDakMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDN0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUNqRjtZQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNOLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzlFLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDaEY7U0FDRjtRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1NBQ3hEO0tBQ0Y7Ozs7SUFFRCxzREFBc0I7OztJQUF0QjtRQUFBLGlCQU9DO1FBTkMsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsVUFBQyxNQUFjOzs7O1lBSTdGLFVBQVUsQ0FBQyxjQUFNLE9BQUEsS0FBSSxDQUFDLGtCQUFrQixFQUFFLEVBQXpCLENBQXlCLENBQUMsQ0FBQztTQUM3QyxDQUFDLENBQUM7S0FDSjs7Z0JBdElGLFNBQVMsU0FBQztvQkFDVCxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtvQkFDckMsUUFBUSxFQUFFLGdEQUFnRDtvQkFDMUQsUUFBUSxFQUFFLDJCQUEyQjtvQkFDckMsTUFBTSxFQUFFLENBQUMsdVlBQXVZLENBQUM7aUJBQ2xaOzs7O2dCQW5CQyxVQUFVO2dCQUZWLHdCQUF3QjtnQkFReEIsZ0JBQWdCO2dCQUdULFNBQVM7Z0JBSmhCLFFBQVE7Ozt1QkFzQlAsS0FBSzt5Q0FHTCxLQUFLOzZCQUtMLFdBQVcsU0FBQyxlQUFlLGNBQzNCLEtBQUs7d0NBSUwsS0FBSzsrQkF5QkwsWUFBWSxTQUFDLFVBQVUsRUFBRSxDQUFDLGVBQWUsQ0FBQzs7Z0NBdEU3Qzs7U0F5QmEscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENvbXBvbmVudCxcclxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgQ29tcG9uZW50UmVmLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSG9zdEJpbmRpbmcsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBSZW5kZXJlcixcclxuICBWaWV3Q29udGFpbmVyUmVmLFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgRXJyb3JNZXNzYWdlUmVzb3VyY2UsIE16RXJyb3JNZXNzYWdlQ29tcG9uZW50IH0gZnJvbSAnLi9lcnJvci1tZXNzYWdlL2luZGV4JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgc2VsZWN0b3I6ICdtei12YWxpZGF0aW9uLCBbbXotdmFsaWRhdGlvbl0sIFttelZhbGlkYXRpb25dJyxcclxuICB0ZW1wbGF0ZTogYDxuZy1jb250ZW50PjwvbmctY29udGVudD5gLFxyXG4gIHN0eWxlczogW2Auc2VsZWN0LXdyYXBwZXIgaW5wdXQuc2VsZWN0LWRyb3Bkb3duLmludmFsaWQsdGV4dGFyZWEubmctaW52YWxpZC5uZy10b3VjaGVkOmZvY3Vze2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNmNDQzMzY7Ym94LXNoYWRvdzowIDFweCAwIDAgI2Y0NDMzNn0uc2VsZWN0LXdyYXBwZXIgaW5wdXQuc2VsZWN0LWRyb3Bkb3duLnZhbGlke2JvcmRlci1ib3R0b206MXB4IHNvbGlkICM0Y2FmNTA7Ym94LXNoYWRvdzowIDFweCAwIDAgIzRjYWY1MH1pbnB1dDpub3QoW3R5cGU9Y2hlY2tib3hdKTpmb2N1cytsYWJlbC5hY3RpdmUgc3Bhbi5wbGFjZWhvbGRlci1yZXF1aXJlZCx0ZXh0YXJlYTpmb2N1cytsYWJlbC5hY3RpdmUgc3Bhbi5wbGFjZWhvbGRlci1yZXF1aXJlZHtjb2xvcjojZjQ0MzM2fWBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTXpWYWxpZGF0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICBlcnJvck1lc3NhZ2VDb21wb25lbnQ/OiBDb21wb25lbnRSZWY8TXpFcnJvck1lc3NhZ2VDb21wb25lbnQ+ID0gbnVsbDtcclxuICBsYWJlbEVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gIG5hdGl2ZUVsZW1lbnQ6IEpRdWVyeTtcclxuICBzdGF0dXNDaGFuZ2VzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIC8vIG5hdGl2ZSBwcm9wZXJ0aWVzXHJcbiAgQElucHV0KCkgaWQ6IHN0cmluZztcclxuXHJcbiAgLy8gY29tcG9uZW50IHByb3BlcnRpZXNcclxuICBASW5wdXQoKSBlcnJvck1lc3NhZ2VSZXNvdXJjZTogRXJyb3JNZXNzYWdlUmVzb3VyY2U7XHJcblxyXG4gIHByaXZhdGUgX2Zvcm1Db250cm9sRGlzYWJsZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIF9yZXF1aXJlZCA9IGZhbHNlO1xyXG5cclxuICBASG9zdEJpbmRpbmcoJ2F0dHIucmVxdWlyZWQnKVxyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IHJlcXVpcmVkKCkgeyByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7IH1cclxuICBzZXQgcmVxdWlyZWQodmFsdWU6IGFueSkgeyB0aGlzLl9yZXF1aXJlZCA9ICh2YWx1ZSAhPSBudWxsICYmIGAke3ZhbHVlfWAgIT09ICdmYWxzZScpOyB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IGZvcm1Db250cm9sRGlzYWJsZWQoKSB7IHJldHVybiB0aGlzLl9mb3JtQ29udHJvbERpc2FibGVkOyB9XHJcbiAgc2V0IGZvcm1Db250cm9sRGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2Zvcm1Db250cm9sRGlzYWJsZWQgPSB2YWx1ZTtcclxuICAgIGlmICh0aGlzLl9mb3JtQ29udHJvbERpc2FibGVkKSB7XHJcbiAgICAgIHRoaXMubmdDb250cm9sLmNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5lbmFibGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBlbGVtZW50VG9BZGRWYWxpZGF0aW9uKCk6IEpRdWVyeSB7XHJcbiAgICByZXR1cm4gdGhpcy5pc05hdGl2ZVNlbGVjdEVsZW1lbnRcclxuICAgICAgPyB0aGlzLmlucHV0U2VsZWN0RHJvcGRvd25cclxuICAgICAgOiB0aGlzLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBnZXQgaW5wdXRTZWxlY3REcm9wZG93bigpOiBKUXVlcnkge1xyXG4gICAgcmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudC5zaWJsaW5ncygnaW5wdXQuc2VsZWN0LWRyb3Bkb3duJyk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNOYXRpdmVTZWxlY3RFbGVtZW50KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudFswXS5ub2RlTmFtZSA9PT0gJ1NFTEVDVCc7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdmb2N1c291dCcsIFsnJGV2ZW50LnRhcmdldCddKVxyXG4gIG9uRm9jdXNPdXQodGFyZ2V0OiBFdmVudCkge1xyXG4gICAgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICB0aGlzLnNldFZhbGlkYXRpb25TdGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIHJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICBwdWJsaWMgbmdDb250cm9sOiBOZ0NvbnRyb2wsXHJcbiAgICBwdWJsaWMgcmVuZGVyZXI6IFJlbmRlcmVyLFxyXG4gICkgeyB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMuaW5pdEVsZW1lbnRzKCk7XHJcbiAgICB0aGlzLmluaXRFcnJvck1lc3NhZ2VDb21wb25lbnQoKTtcclxuICAgIHRoaXMuc3Vic2NyaWJlU3RhdHVzQ2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLnN0YXR1c0NoYW5nZXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuZXJyb3JNZXNzYWdlQ29tcG9uZW50LmRlc3Ryb3koKTtcclxuICB9XHJcblxyXG4gIGNsZWFyVmFsaWRhdGlvblN0YXRlKGVsZW1lbnQ6IEpRdWVyeSkge1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50Q2xhc3MoZWxlbWVudFswXSwgJ3ZhbGlkJywgZmFsc2UpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50Q2xhc3MoZWxlbWVudFswXSwgJ2ludmFsaWQnLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVSZXF1aXJlZFNwYW5FbGVtZW50KCkge1xyXG4gICAgaWYgKHRoaXMucmVxdWlyZWQgJiYgdGhpcy5sYWJlbEVsZW1lbnQpIHtcclxuICAgICAgY29uc3Qgc3BhbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgIHNwYW5FbGVtZW50LnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAncGxhY2Vob2xkZXItcmVxdWlyZWQnKTtcclxuICAgICAgc3BhbkVsZW1lbnQudGV4dENvbnRlbnQgPSAnIConO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmludm9rZUVsZW1lbnRNZXRob2QodGhpcy5sYWJlbEVsZW1lbnQsICdhcHBlbmRDaGlsZCcsIFtzcGFuRWxlbWVudF0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdEVsZW1lbnRzKCkge1xyXG4gICAgdGhpcy5sYWJlbEVsZW1lbnQgPSAkKCdsYWJlbFtmb3I9XCInICsgdGhpcy5pZCArICdcIl0nKVswXTtcclxuICAgIHRoaXMubmF0aXZlRWxlbWVudCA9ICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgdGhpcy5jcmVhdGVSZXF1aXJlZFNwYW5FbGVtZW50KCk7XHJcbiAgfVxyXG5cclxuICBpbml0RXJyb3JNZXNzYWdlQ29tcG9uZW50KCkge1xyXG4gICAgY29uc3QgZXJyb3JNZXNzYWdlRmFjdG9yeSA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoTXpFcnJvck1lc3NhZ2VDb21wb25lbnQpO1xyXG4gICAgdGhpcy5lcnJvck1lc3NhZ2VDb21wb25lbnQgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGVycm9yTWVzc2FnZUZhY3RvcnkpO1xyXG4gICAgdGhpcy5lcnJvck1lc3NhZ2VDb21wb25lbnQuaW5zdGFuY2UuZXJyb3JNZXNzYWdlUmVzb3VyY2UgPSB0aGlzLmVycm9yTWVzc2FnZVJlc291cmNlO1xyXG4gICAgdGhpcy5lcnJvck1lc3NhZ2VDb21wb25lbnQuaW5zdGFuY2UuY29udHJvbCA9IHRoaXMubmdDb250cm9sLmNvbnRyb2w7XHJcbiAgICB0aGlzLmVycm9yTWVzc2FnZUNvbXBvbmVudC5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gdGhpcy5uYXRpdmVFbGVtZW50LnBhcmVudCgpLmNoaWxkcmVuKCdtei1lcnJvci1tZXNzYWdlJyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmludm9rZUVsZW1lbnRNZXRob2QoZXJyb3JNZXNzYWdlLCAnaW5zZXJ0QWZ0ZXInLCBbdGhpcy5sYWJlbEVsZW1lbnRdKTtcclxuICB9XHJcblxyXG4gIHNldFZhbGlkYXRpb25TdGF0ZSgpIHtcclxuICAgIC8vIHRvIGhhbmRsZSByZXNldCBmb3JtXHJcbiAgICBpZiAodGhpcy5uZ0NvbnRyb2wuY29udHJvbC51bnRvdWNoZWQgJiYgdGhpcy5uZ0NvbnRyb2wuY29udHJvbC5wcmlzdGluZSkge1xyXG4gICAgICB0aGlzLmNsZWFyVmFsaWRhdGlvblN0YXRlKHRoaXMuZWxlbWVudFRvQWRkVmFsaWRhdGlvbik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIHRvIGhhbmRsZSBmaWVsZCB2YWxpZGl0eVxyXG4gICAgaWYgKHRoaXMubmdDb250cm9sLmNvbnRyb2wuZW5hYmxlZCkge1xyXG4gICAgICBpZiAodGhpcy5uZ0NvbnRyb2wuY29udHJvbC52YWxpZCkge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0RWxlbWVudENsYXNzKHRoaXMuZWxlbWVudFRvQWRkVmFsaWRhdGlvblswXSwgJ3ZhbGlkJywgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50Q2xhc3ModGhpcy5lbGVtZW50VG9BZGRWYWxpZGF0aW9uWzBdLCAnaW52YWxpZCcsIGZhbHNlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRDbGFzcyh0aGlzLmVsZW1lbnRUb0FkZFZhbGlkYXRpb25bMF0sICd2YWxpZCcsIGZhbHNlKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRDbGFzcyh0aGlzLmVsZW1lbnRUb0FkZFZhbGlkYXRpb25bMF0sICdpbnZhbGlkJywgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2xlYXJWYWxpZGF0aW9uU3RhdGUodGhpcy5lbGVtZW50VG9BZGRWYWxpZGF0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN1YnNjcmliZVN0YXR1c0NoYW5nZXMoKSB7XHJcbiAgICB0aGlzLnN0YXR1c0NoYW5nZXNTdWJzY3JpcHRpb24gPSB0aGlzLm5nQ29udHJvbC5jb250cm9sLnN0YXR1c0NoYW5nZXMuc3Vic2NyaWJlKChzdGF0dXM6IHN0cmluZykgPT4ge1xyXG4gICAgICAvLyBUT0RPIEZpbmQgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB2YWxpZGF0aW9uIGFmdGVyIHRoZSBmb3JtIHN1YnNjcmlwdGlvbi4gKHNlZSBkZW1vIGZvcm0tdmFsaWRhdGlvbilcclxuICAgICAgLy8gd2FpdCBmb3IgdGhlIHZhbHVlQ2hhbmdlcyBtZXRob2QgZnJvbSBGb3JtR3JvdXAgdG8gaGF2ZSBiZWVuIHRyaWdnZXJlZCBiZWZvcmUgaGFuZGxpbmcgdGhlIHZhbGlkYXRpb24gc3RhdGVcclxuICAgICAgLy8gLyFcXCByYWNlIGNvbmRpdGlvbiB3YXJuaW5nIC8hXFxcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNldFZhbGlkYXRpb25TdGF0ZSgpKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=