UNPKG

mat-contenteditable

Version:

Angular contenteditable directive for Angular forms and Material Design

426 lines (425 loc) 30.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Directive, ElementRef, Renderer2, HostListener, Input, HostBinding, Optional, Self, } from '@angular/core'; import { MatFormFieldControl } from '@angular/material/form-field'; import { FormGroupDirective, NgControl, NgForm } from '@angular/forms'; import { ErrorStateMatcher, mixinErrorState } from '@angular/material/core'; import { coerceBooleanProperty } from '@angular/cdk/coercion'; import { Subject } from 'rxjs'; /** * \@docs-private */ var /** * \@docs-private */ MatInputBase = /** @class */ (function () { function MatInputBase(_defaultErrorStateMatcher, _parentForm, _parentFormGroup, ngControl) { this._defaultErrorStateMatcher = _defaultErrorStateMatcher; this._parentForm = _parentForm; this._parentFormGroup = _parentFormGroup; this.ngControl = ngControl; } return MatInputBase; }()); if (false) { /** @type {?} */ MatInputBase.prototype._defaultErrorStateMatcher; /** @type {?} */ MatInputBase.prototype._parentForm; /** @type {?} */ MatInputBase.prototype._parentFormGroup; /** * \@docs-private * @type {?} */ MatInputBase.prototype.ngControl; } /** @type {?} */ export var _MatInputMixinBase = mixinErrorState(MatInputBase); var MatContenteditableDirective = /** @class */ (function (_super) { tslib_1.__extends(MatContenteditableDirective, _super); function MatContenteditableDirective(elementRef, renderer, ngControl, _parentForm, _parentFormGroup, _defaultErrorStateMatcher) { var _this = _super.call(this, _defaultErrorStateMatcher, _parentForm, _parentFormGroup, ngControl) || this; _this.elementRef = elementRef; _this.renderer = renderer; _this.ngControl = ngControl; _this.stateChanges = new Subject(); _this.id = "mat-input-" + MatContenteditableDirective.nextId++; _this.focused = false; _this.contentEmpty = ['<br>', '<div><br></div>']; _this._required = false; _this._disabled = false; _this.controlType = 'mat-input'; _this.describedBy = ''; _this.propValueAccessor = 'innerHTML'; // Setting the value accessor directly (instead of using // the providers) to avoid running into a circular import. if (_this.ngControl != null) { _this.ngControl.valueAccessor = _this; } return _this; } Object.defineProperty(MatContenteditableDirective.prototype, "value", { get: /** * @return {?} */ function () { return this.elementRef.nativeElement[this.propValueAccessor]; }, set: /** * @param {?} value * @return {?} */ function (value) { if (value !== this.value) { this.elementRef.nativeElement[this.propValueAccessor] = value; this.stateChanges.next(); } }, enumerable: true, configurable: true }); Object.defineProperty(MatContenteditableDirective.prototype, "placeholder", { get: /** * @return {?} */ function () { return this._placeholder; }, set: /** * @param {?} plh * @return {?} */ function (plh) { this._placeholder = plh; this.stateChanges.next(); }, enumerable: true, configurable: true }); Object.defineProperty(MatContenteditableDirective.prototype, "empty", { get: /** * @return {?} */ function () { return !this.value || this.contentEmpty.includes(this.value); }, enumerable: true, configurable: true }); Object.defineProperty(MatContenteditableDirective.prototype, "shouldLabelFloat", { get: /** * @return {?} */ function () { return this.focused || !this.empty; }, enumerable: true, configurable: true }); Object.defineProperty(MatContenteditableDirective.prototype, "required", { get: /** * @return {?} */ function () { return this._required; }, set: /** * @param {?} req * @return {?} */ function (req) { this._required = coerceBooleanProperty(req); this.stateChanges.next(); }, enumerable: true, configurable: true }); Object.defineProperty(MatContenteditableDirective.prototype, "disabled", { get: /** * @return {?} */ function () { return this._disabled; }, set: /** * @param {?} dis * @return {?} */ function (dis) { this._disabled = coerceBooleanProperty(dis); this.stateChanges.next(); }, enumerable: true, configurable: true }); /** * @return {?} */ MatContenteditableDirective.prototype.ngDoCheck = /** * @return {?} */ function () { if (this.ngControl) { // We need to re-evaluate this on every change detection cycle, because there are some // error triggers that we can't subscribe to (e.g. parent form submissions). This means // that whatever logic is in here has to be super lean or we risk destroying the performance. this.updateErrorState(); } }; /** * @return {?} */ MatContenteditableDirective.prototype.callOnChange = /** * @return {?} */ function () { if (typeof this.onChange === 'function') { this.onChange(this.elementRef.nativeElement[this.propValueAccessor]); } }; /** * @return {?} */ MatContenteditableDirective.prototype.callOnFocused = /** * @return {?} */ function () { if (this.focused !== true) { this.focused = true; this.stateChanges.next(); } }; /** * @return {?} */ MatContenteditableDirective.prototype.callOnTouched = /** * @return {?} */ function () { if (typeof this.onTouched === 'function') { this.onTouched(); } if (this.focused !== false) { this.focused = false; this.stateChanges.next(); } }; /** * @param {?} ids * @return {?} */ MatContenteditableDirective.prototype.setDescribedByIds = /** * @param {?} ids * @return {?} */ function (ids) { this.describedBy = ids.join(' '); }; /** * @return {?} */ MatContenteditableDirective.prototype.onContainerClick = /** * @return {?} */ function () { this.elementRef.nativeElement.focus(); }; /** * Writes a new value to the element. * This method will be called by the forms API to write * to the view when programmatic (model -> view) changes are requested. * * See: [ControlValueAccessor](https://angular.io/api/forms/ControlValueAccessor#members) */ /** * Writes a new value to the element. * This method will be called by the forms API to write * to the view when programmatic (model -> view) changes are requested. * * See: [ControlValueAccessor](https://angular.io/api/forms/ControlValueAccessor#members) * @param {?} value * @return {?} */ MatContenteditableDirective.prototype.writeValue = /** * Writes a new value to the element. * This method will be called by the forms API to write * to the view when programmatic (model -> view) changes are requested. * * See: [ControlValueAccessor](https://angular.io/api/forms/ControlValueAccessor#members) * @param {?} value * @return {?} */ function (value) { /** @type {?} */ var normalizedValue = value == null ? '' : value; this.renderer.setProperty(this.elementRef.nativeElement, this.propValueAccessor, normalizedValue); }; /** * Registers a callback function that should be called when * the control's value changes in the UI. * * This is called by the forms API on initialization so it can update * the form model when values propagate from the view (view -> model). */ /** * Registers a callback function that should be called when * the control's value changes in the UI. * * This is called by the forms API on initialization so it can update * the form model when values propagate from the view (view -> model). * @param {?} fn * @return {?} */ MatContenteditableDirective.prototype.registerOnChange = /** * Registers a callback function that should be called when * the control's value changes in the UI. * * This is called by the forms API on initialization so it can update * the form model when values propagate from the view (view -> model). * @param {?} fn * @return {?} */ function (fn) { this.onChange = fn; }; /** * Registers a callback function that should be called when the control receives a blur event. * This is called by the forms API on initialization so it can update the form model on blur. */ /** * Registers a callback function that should be called when the control receives a blur event. * This is called by the forms API on initialization so it can update the form model on blur. * @param {?} fn * @return {?} */ MatContenteditableDirective.prototype.registerOnTouched = /** * Registers a callback function that should be called when the control receives a blur event. * This is called by the forms API on initialization so it can update the form model on blur. * @param {?} fn * @return {?} */ function (fn) { this.onTouched = fn; }; /** * This function is called by the forms API when the control status changes to or from "DISABLED". * Depending on the value, it should enable or disable the appropriate DOM element. */ /** * This function is called by the forms API when the control status changes to or from "DISABLED". * Depending on the value, it should enable or disable the appropriate DOM element. * @param {?} isDisabled * @return {?} */ MatContenteditableDirective.prototype.setDisabledState = /** * This function is called by the forms API when the control status changes to or from "DISABLED". * Depending on the value, it should enable or disable the appropriate DOM element. * @param {?} isDisabled * @return {?} */ function (isDisabled) { if (isDisabled) { this.renderer.setAttribute(this.elementRef.nativeElement, 'disabled', 'true'); this.removeDisabledState = this.renderer.listen(this.elementRef.nativeElement, 'keydown', this.listenerDisabledState); } else { if (this.removeDisabledState) { this.renderer.removeAttribute(this.elementRef.nativeElement, 'disabled'); this.removeDisabledState(); } } }; /** * @param {?} e * @return {?} */ MatContenteditableDirective.prototype.listenerDisabledState = /** * @param {?} e * @return {?} */ function (e) { e.preventDefault(); }; /** * Implemented as part of MatFormFieldControl. * See https://material.angular.io/guide/creating-a-custom-form-field-control */ MatContenteditableDirective.nextId = 0; MatContenteditableDirective.decorators = [ { type: Directive, args: [{ selector: '[contenteditable]', providers: [ { provide: MatFormFieldControl, useExisting: MatContenteditableDirective }, ] },] } ]; /** @nocollapse */ MatContenteditableDirective.ctorParameters = function () { return [ { type: ElementRef }, { type: Renderer2 }, { type: NgControl, decorators: [{ type: Optional }, { type: Self }] }, { type: NgForm, decorators: [{ type: Optional }] }, { type: FormGroupDirective, decorators: [{ type: Optional }] }, { type: ErrorStateMatcher } ]; }; MatContenteditableDirective.propDecorators = { value: [{ type: Input }], id: [{ type: HostBinding }], placeholder: [{ type: Input }], contentEmpty: [{ type: Input }], required: [{ type: Input }], disabled: [{ type: Input }], errorState: [{ type: HostBinding, args: ['attr.aria-invalid',] }], errorStateMatcher: [{ type: Input }], describedBy: [{ type: HostBinding, args: ['attr.aria-describedby',] }], propValueAccessor: [{ type: Input }], callOnChange: [{ type: HostListener, args: ['input',] }], callOnFocused: [{ type: HostListener, args: ['focus',] }], callOnTouched: [{ type: HostListener, args: ['blur',] }] }; return MatContenteditableDirective; }(_MatInputMixinBase)); export { MatContenteditableDirective }; if (false) { /** * Implemented as part of MatFormFieldControl. * See https://material.angular.io/guide/creating-a-custom-form-field-control * @type {?} */ MatContenteditableDirective.nextId; /** @type {?} */ MatContenteditableDirective.prototype.stateChanges; /** @type {?} */ MatContenteditableDirective.prototype.id; /** @type {?} */ MatContenteditableDirective.prototype._placeholder; /** @type {?} */ MatContenteditableDirective.prototype.focused; /** @type {?} */ MatContenteditableDirective.prototype.contentEmpty; /** @type {?} */ MatContenteditableDirective.prototype._required; /** @type {?} */ MatContenteditableDirective.prototype._disabled; /** @type {?} */ MatContenteditableDirective.prototype.errorState; /** @type {?} */ MatContenteditableDirective.prototype.errorStateMatcher; /** @type {?} */ MatContenteditableDirective.prototype.controlType; /** @type {?} */ MatContenteditableDirective.prototype.describedBy; /** @type {?} */ MatContenteditableDirective.prototype.onChange; /** @type {?} */ MatContenteditableDirective.prototype.onTouched; /** @type {?} */ MatContenteditableDirective.prototype.removeDisabledState; /** @type {?} */ MatContenteditableDirective.prototype.propValueAccessor; /** @type {?} */ MatContenteditableDirective.prototype.elementRef; /** @type {?} */ MatContenteditableDirective.prototype.renderer; /** @type {?} */ MatContenteditableDirective.prototype.ngControl; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LWNvbnRlbnRlZGl0YWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9tYXQtY29udGVudGVkaXRhYmxlLyIsInNvdXJjZXMiOlsibGliL21hdC1jb250ZW50ZWRpdGFibGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsV0FBVyxFQUNYLFFBQVEsRUFDUixJQUFJLEdBRUwsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUF3QixrQkFBa0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0YsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGVBQWUsRUFBZ0QsTUFBTSx3QkFBd0IsQ0FBQztBQUMxSCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7O0FBSS9COzs7QUFBQTtJQUNFLHNCQUFtQix5QkFBNEMsRUFDNUMsYUFDQSxrQkFFQTtRQUpBLDhCQUF5QixHQUF6Qix5QkFBeUIsQ0FBbUI7UUFDNUMsZ0JBQVcsR0FBWCxXQUFXO1FBQ1gscUJBQWdCLEdBQWhCLGdCQUFnQjtRQUVoQixjQUFTLEdBQVQsU0FBUztLQUFlO3VCQXhCN0M7SUF5QkMsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7O0FBQ0QsV0FBYSxrQkFBa0IsR0FDN0IsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDOztJQVNpQix1REFBa0I7SUE0RWpFLHFDQUNVLFlBQ0EsVUFDbUIsU0FBb0IsRUFDbkMsV0FBbUIsRUFDbkIsZ0JBQW9DLEVBQ2hELHlCQUE0QztRQU45QyxZQVFFLGtCQUFNLHlCQUF5QixFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsU0FJM0U7UUFYUyxnQkFBVSxHQUFWLFVBQVU7UUFDVixjQUFRLEdBQVIsUUFBUTtRQUNXLGVBQVMsR0FBVCxTQUFTLENBQVc7UUE3RGpELHFCQUF1QyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRTNELFdBQW9CLGVBQWEsMkJBQTJCLENBQUMsTUFBTSxFQUFJLENBQUM7UUFZeEUsZ0JBQVUsS0FBSyxDQUFDO1FBRWhCLHFCQUF1QyxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDOzBCQWUvQyxLQUFLOzBCQVVMLEtBQUs7UUFLekIsb0JBQWMsV0FBVyxDQUFDO1FBRTFCLG9CQUFvRCxFQUFFLENBQUM7UUFRdkQsMEJBQTZCLFdBQVcsQ0FBQzs7O1FBYXZDLElBQUksS0FBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLEVBQUU7WUFBRSxLQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsR0FBRyxLQUFJLENBQUM7U0FBRTs7S0FDckU7SUEvRUQsc0JBQ0ksOENBQUs7Ozs7UUFEVCxjQUNzQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUU7Ozs7O1FBQ3JGLFVBQVUsS0FBYTtZQUNyQixJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQzlELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDMUI7U0FDRjs7O09BTm9GO0lBWXJGLHNCQUNJLG9EQUFXOzs7O1FBRGY7WUFFRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7U0FDMUI7Ozs7O1FBQ0QsVUFBZ0IsR0FBRztZQUNqQixJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQztZQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQzFCOzs7T0FKQTtJQVVELHNCQUFJLDhDQUFLOzs7O1FBQVQ7WUFDRSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDOUQ7OztPQUFBO0lBRUQsc0JBQUkseURBQWdCOzs7O1FBQXBCLGNBQWtDLE9BQU8sSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTs7O09BQUE7SUFFdkUsc0JBQ0ksaURBQVE7Ozs7UUFEWjtZQUVFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztTQUN2Qjs7Ozs7UUFDRCxVQUFhLEdBQUc7WUFDZCxJQUFJLENBQUMsU0FBUyxHQUFHLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDMUI7OztPQUpBO0lBT0Qsc0JBQ0ksaURBQVE7Ozs7UUFEWjtZQUVFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztTQUN2Qjs7Ozs7UUFDRCxVQUFhLEdBQUc7WUFDZCxJQUFJLENBQUMsU0FBUyxHQUFHLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDMUI7OztPQUpBOzs7O0lBb0NELCtDQUFTOzs7SUFBVDtRQUNFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTs7OztZQUlsQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUN6QjtLQUNGOzs7O0lBR0Qsa0RBQVk7OztJQURaO1FBRUUsSUFBSSxPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssVUFBVSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztTQUN0RTtLQUNGOzs7O0lBR0QsbURBQWE7OztJQURiO1FBRUUsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksRUFBRTtZQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNwQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQzFCO0tBQ0Y7Ozs7SUFHRCxtREFBYTs7O0lBRGI7UUFFRSxJQUFJLE9BQU8sSUFBSSxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQUU7WUFDeEMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ2xCO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLEtBQUssRUFBRTtZQUMxQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQzFCO0tBQ0Y7Ozs7O0lBRUQsdURBQWlCOzs7O0lBQWpCLFVBQWtCLEdBQWE7UUFDN0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ2xDOzs7O0lBRUQsc0RBQWdCOzs7SUFBaEIsY0FBcUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRTtJQUU3RDs7Ozs7O09BTUc7Ozs7Ozs7Ozs7SUFDSCxnREFBVTs7Ozs7Ozs7O0lBQVYsVUFBVyxLQUFVOztRQUNuQixJQUFNLGVBQWUsR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNuRCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLENBQUM7S0FDbkc7SUFFRDs7Ozs7O09BTUc7Ozs7Ozs7Ozs7SUFDSCxzREFBZ0I7Ozs7Ozs7OztJQUFoQixVQUFpQixFQUFjO1FBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0tBQ3BCO0lBRUQ7OztPQUdHOzs7Ozs7O0lBQ0gsdURBQWlCOzs7Ozs7SUFBakIsVUFBa0IsRUFBYztRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztLQUNyQjtJQUVEOzs7T0FHRzs7Ozs7OztJQUNILHNEQUFnQjs7Ozs7O0lBQWhCLFVBQWlCLFVBQW1CO1FBQ2xDLElBQUksVUFBVSxFQUFFO1lBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzlFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7U0FDdkg7YUFBTTtZQUNMLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO2dCQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDekUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7YUFDNUI7U0FDRjtLQUNGOzs7OztJQUVPLDJEQUFxQjs7OztjQUFDLENBQWdCO1FBQzVDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQzs7Ozs7O0lBNUtyQixxQ0FBZ0IsQ0FBQyxDQUFDOztnQkFibkIsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxtQkFBbUI7b0JBQzdCLFNBQVMsRUFBRTt3QkFDVCxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsMkJBQTJCLEVBQUU7cUJBQzNFO2lCQUNGOzs7O2dCQWpDQyxVQUFVO2dCQUNWLFNBQVM7Z0JBU3dDLFNBQVMsdUJBdUd2RCxRQUFRLFlBQUksSUFBSTtnQkF2R3lDLE1BQU0sdUJBd0cvRCxRQUFRO2dCQXhHa0Isa0JBQWtCLHVCQXlHNUMsUUFBUTtnQkF4R0osaUJBQWlCOzs7d0JBZ0N2QixLQUFLO3FCQVdMLFdBQVc7OEJBRVgsS0FBSzsrQkFZTCxLQUFLOzJCQU9MLEtBQUs7MkJBVUwsS0FBSzs2QkFVTCxXQUFXLFNBQUMsbUJBQW1CO29DQUMvQixLQUFLOzhCQUlMLFdBQVcsU0FBQyx1QkFBdUI7b0NBUW5DLEtBQUs7K0JBeUJMLFlBQVksU0FBQyxPQUFPO2dDQU9wQixZQUFZLFNBQUMsT0FBTztnQ0FRcEIsWUFBWSxTQUFDLE1BQU07O3NDQXRKdEI7RUFvQ2lELGtCQUFrQjtTQUF0RCwyQkFBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIFJlbmRlcmVyMixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgSG9zdEJpbmRpbmcsXG4gIE9wdGlvbmFsLFxuICBTZWxmLFxuICBEb0NoZWNrLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtR3JvdXBEaXJlY3RpdmUsIE5nQ29udHJvbCwgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRXJyb3JTdGF0ZU1hdGNoZXIsIG1peGluRXJyb3JTdGF0ZSwgQ2FuVXBkYXRlRXJyb3JTdGF0ZUN0b3IsIENhblVwZGF0ZUVycm9yU3RhdGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbi8vIEJvaWxlcnBsYXRlIGZvciBhcHBseWluZyBtaXhpbnMgdG8gTWF0SW5wdXQuXG4vKiogQGRvY3MtcHJpdmF0ZSAqL1xuY2xhc3MgTWF0SW5wdXRCYXNlIHtcbiAgY29uc3RydWN0b3IocHVibGljIF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXI6IEVycm9yU3RhdGVNYXRjaGVyLFxuICAgICAgICAgICAgICBwdWJsaWMgX3BhcmVudEZvcm06IE5nRm9ybSxcbiAgICAgICAgICAgICAgcHVibGljIF9wYXJlbnRGb3JtR3JvdXA6IEZvcm1Hcm91cERpcmVjdGl2ZSxcbiAgICAgICAgICAgICAgLyoqIEBkb2NzLXByaXZhdGUgKi9cbiAgICAgICAgICAgICAgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sKSB7fVxufVxuZXhwb3J0IGNvbnN0IF9NYXRJbnB1dE1peGluQmFzZTogQ2FuVXBkYXRlRXJyb3JTdGF0ZUN0b3IgJiB0eXBlb2YgTWF0SW5wdXRCYXNlID1cbiAgbWl4aW5FcnJvclN0YXRlKE1hdElucHV0QmFzZSk7XG5cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2NvbnRlbnRlZGl0YWJsZV0nLFxuICBwcm92aWRlcnM6IFtcbiAgICB7IHByb3ZpZGU6IE1hdEZvcm1GaWVsZENvbnRyb2wsIHVzZUV4aXN0aW5nOiBNYXRDb250ZW50ZWRpdGFibGVEaXJlY3RpdmUgfSxcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBNYXRDb250ZW50ZWRpdGFibGVEaXJlY3RpdmUgZXh0ZW5kcyBfTWF0SW5wdXRNaXhpbkJhc2VcbiAgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTWF0Rm9ybUZpZWxkQ29udHJvbDxzdHJpbmc+LCBEb0NoZWNrLCBDYW5VcGRhdGVFcnJvclN0YXRlIHtcblxuICAvKipcbiAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBNYXRGb3JtRmllbGRDb250cm9sLlxuICAgKiBTZWUgaHR0cHM6Ly9tYXRlcmlhbC5hbmd1bGFyLmlvL2d1aWRlL2NyZWF0aW5nLWEtY3VzdG9tLWZvcm0tZmllbGQtY29udHJvbFxuICAgKi9cbiAgc3RhdGljIG5leHRJZCA9IDA7XG5cbiAgQElucHV0KClcbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudFt0aGlzLnByb3BWYWx1ZUFjY2Vzc29yXTsgfVxuICBzZXQgdmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy52YWx1ZSkge1xuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnRbdGhpcy5wcm9wVmFsdWVBY2Nlc3Nvcl0gPSB2YWx1ZTtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICByZWFkb25seSBzdGF0ZUNoYW5nZXM6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIEBIb3N0QmluZGluZygpIGlkID0gYG1hdC1pbnB1dC0ke01hdENvbnRlbnRlZGl0YWJsZURpcmVjdGl2ZS5uZXh0SWQrK31gO1xuXG4gIEBJbnB1dCgpXG4gIGdldCBwbGFjZWhvbGRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXI7XG4gIH1cbiAgc2V0IHBsYWNlaG9sZGVyKHBsaCkge1xuICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gcGxoO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuICBwcml2YXRlIF9wbGFjZWhvbGRlcjogc3RyaW5nO1xuXG4gIGZvY3VzZWQgPSBmYWxzZTtcblxuICBASW5wdXQoKSBjb250ZW50RW1wdHk6IEFycmF5PHN0cmluZz4gPSBbJzxicj4nLCAnPGRpdj48YnI+PC9kaXY+J107XG4gIGdldCBlbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMudmFsdWUgfHwgdGhpcy5jb250ZW50RW1wdHkuaW5jbHVkZXModGhpcy52YWx1ZSk7XG4gIH1cblxuICBnZXQgc2hvdWxkTGFiZWxGbG9hdCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZm9jdXNlZCB8fCAhdGhpcy5lbXB0eTsgfVxuXG4gIEBJbnB1dCgpXG4gIGdldCByZXF1aXJlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XG4gIH1cbiAgc2V0IHJlcXVpcmVkKHJlcSkge1xuICAgIHRoaXMuX3JlcXVpcmVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHJlcSk7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG4gIHByaXZhdGUgX3JlcXVpcmVkID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgZ2V0IGRpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuICBzZXQgZGlzYWJsZWQoZGlzKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkoZGlzKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gIH1cbiAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBmYWxzZTtcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1pbnZhbGlkJykgZXJyb3JTdGF0ZTogYm9vbGVhbjtcbiAgQElucHV0KCkgZXJyb3JTdGF0ZU1hdGNoZXI6IEVycm9yU3RhdGVNYXRjaGVyO1xuXG4gIGNvbnRyb2xUeXBlID0gJ21hdC1pbnB1dCc7XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtZGVzY3JpYmVkYnknKSBkZXNjcmliZWRCeSA9ICcnO1xuXG5cbiAgLy8gUGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3NvclxuICBwcml2YXRlIG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZDtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVtb3ZlRGlzYWJsZWRTdGF0ZTogKCkgPT4gdm9pZDtcblxuICBASW5wdXQoKSBwcm9wVmFsdWVBY2Nlc3NvciA9ICdpbm5lckhUTUwnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgQE9wdGlvbmFsKCkgQFNlbGYoKSBwdWJsaWMgbmdDb250cm9sOiBOZ0NvbnRyb2wsXG4gICAgQE9wdGlvbmFsKCkgX3BhcmVudEZvcm06IE5nRm9ybSxcbiAgICBAT3B0aW9uYWwoKSBfcGFyZW50Rm9ybUdyb3VwOiBGb3JtR3JvdXBEaXJlY3RpdmUsXG4gICAgX2RlZmF1bHRFcnJvclN0YXRlTWF0Y2hlcjogRXJyb3JTdGF0ZU1hdGNoZXIsXG4gICkge1xuICAgIHN1cGVyKF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXIsIF9wYXJlbnRGb3JtLCBfcGFyZW50Rm9ybUdyb3VwLCBuZ0NvbnRyb2wpO1xuICAgIC8vIFNldHRpbmcgdGhlIHZhbHVlIGFjY2Vzc29yIGRpcmVjdGx5IChpbnN0ZWFkIG9mIHVzaW5nXG4gICAgLy8gdGhlIHByb3ZpZGVycykgdG8gYXZvaWQgcnVubmluZyBpbnRvIGEgY2lyY3VsYXIgaW1wb3J0LlxuICAgIGlmICh0aGlzLm5nQ29udHJvbCAhPSBudWxsKSB7IHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzOyB9XG4gIH1cblxuICBuZ0RvQ2hlY2soKSB7XG4gICAgaWYgKHRoaXMubmdDb250cm9sKSB7XG4gICAgICAvLyBXZSBuZWVkIHRvIHJlLWV2YWx1YXRlIHRoaXMgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvbiBjeWNsZSwgYmVjYXVzZSB0aGVyZSBhcmUgc29tZVxuICAgICAgLy8gZXJyb3IgdHJpZ2dlcnMgdGhhdCB3ZSBjYW4ndCBzdWJzY3JpYmUgdG8gKGUuZy4gcGFyZW50IGZvcm0gc3VibWlzc2lvbnMpLiBUaGlzIG1lYW5zXG4gICAgICAvLyB0aGF0IHdoYXRldmVyIGxvZ2ljIGlzIGluIGhlcmUgaGFzIHRvIGJlIHN1cGVyIGxlYW4gb3Igd2UgcmlzayBkZXN0cm95aW5nIHRoZSBwZXJmb3JtYW5jZS5cbiAgICAgIHRoaXMudXBkYXRlRXJyb3JTdGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2lucHV0JylcbiAgY2FsbE9uQ2hhbmdlKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5vbkNoYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudFt0aGlzLnByb3BWYWx1ZUFjY2Vzc29yXSk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZm9jdXMnKVxuICBjYWxsT25Gb2N1c2VkKCkge1xuICAgIGlmICh0aGlzLmZvY3VzZWQgIT09IHRydWUpIHtcbiAgICAgIHRoaXMuZm9jdXNlZCA9IHRydWU7XG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignYmx1cicpXG4gIGNhbGxPblRvdWNoZWQoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLm9uVG91Y2hlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZm9jdXNlZCAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIHNldERlc2NyaWJlZEJ5SWRzKGlkczogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlc2NyaWJlZEJ5ID0gaWRzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIG9uQ29udGFpbmVyQ2xpY2soKSB7IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7IH1cblxuICAvKipcbiAgICogV3JpdGVzIGEgbmV3IHZhbHVlIHRvIHRoZSBlbGVtZW50LlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBieSB0aGUgZm9ybXMgQVBJIHRvIHdyaXRlXG4gICAqIHRvIHRoZSB2aWV3IHdoZW4gcHJvZ3JhbW1hdGljIChtb2RlbCAtPiB2aWV3KSBjaGFuZ2VzIGFyZSByZXF1ZXN0ZWQuXG4gICAqXG4gICAqIFNlZTogW0NvbnRyb2xWYWx1ZUFjY2Vzc29yXShodHRwczovL2FuZ3VsYXIuaW8vYXBpL2Zvcm1zL0NvbnRyb2xWYWx1ZUFjY2Vzc29yI21lbWJlcnMpXG4gICAqL1xuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBub3JtYWxpemVkVmFsdWUgPSB2YWx1ZSA9PSBudWxsID8gJycgOiB2YWx1ZTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLnByb3BWYWx1ZUFjY2Vzc29yLCBub3JtYWxpemVkVmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuXG4gICAqIHRoZSBjb250cm9sJ3MgdmFsdWUgY2hhbmdlcyBpbiB0aGUgVUkuXG4gICAqXG4gICAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBmb3JtcyBBUEkgb24gaW5pdGlhbGl6YXRpb24gc28gaXQgY2FuIHVwZGF0ZVxuICAgKiB0aGUgZm9ybSBtb2RlbCB3aGVuIHZhbHVlcyBwcm9wYWdhdGUgZnJvbSB0aGUgdmlldyAodmlldyAtPiBtb2RlbCkuXG4gICAqL1xuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBjb250cm9sIHJlY2VpdmVzIGEgYmx1ciBldmVudC5cbiAgICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGZvcm1zIEFQSSBvbiBpbml0aWFsaXphdGlvbiBzbyBpdCBjYW4gdXBkYXRlIHRoZSBmb3JtIG1vZGVsIG9uIGJsdXIuXG4gICAqL1xuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGZvcm1zIEFQSSB3aGVuIHRoZSBjb250cm9sIHN0YXR1cyBjaGFuZ2VzIHRvIG9yIGZyb20gXCJESVNBQkxFRFwiLlxuICAgKiBEZXBlbmRpbmcgb24gdGhlIHZhbHVlLCBpdCBzaG91bGQgZW5hYmxlIG9yIGRpc2FibGUgdGhlIGFwcHJvcHJpYXRlIERPTSBlbGVtZW50LlxuICAgKi9cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGlzRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnLCAndHJ1ZScpO1xuICAgICAgdGhpcy5yZW1vdmVEaXNhYmxlZFN0YXRlID0gdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdrZXlkb3duJywgdGhpcy5saXN0ZW5lckRpc2FibGVkU3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5yZW1vdmVEaXNhYmxlZFN0YXRlKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnKTtcbiAgICAgICAgdGhpcy5yZW1vdmVEaXNhYmxlZFN0YXRlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsaXN0ZW5lckRpc2FibGVkU3RhdGUoZTogS2V5Ym9hcmRFdmVudCkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfVxufVxuIl19