UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

192 lines (191 loc) 17.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { EventEmitter } from '@angular/core'; import { AbstractI18NApplicable } from '../share/AbstractI18NApplicable'; import { EventUtils } from '../share/utils/EventUtils'; import { Option } from '../decorator/Option.decorator'; import { CLICK_EVENT, BEFORE_CLICK_EVENT } from '../share/CustomEventType'; export const /** @type {?} */ ACTION_PERFORM = 'actionPerform'; /** * <p style="text-indent: 2em;"> * An abstract base class for <code>menu item</code> component. This class provides you a default [[onClick]] event handler which * automatically call the [[MenuItemModel.actionPerformedHandler]] if specified. It also resets the current focusing component if * [[MenuItemModel.autoResetFocus]] is set to <code>true</code>. A <code>menu item</code> can be, but not necessary, in a parent * <code>menu</code>. It is up to each component implementation which is a sub class of this class to decide that it is required * to allow a <code>menu item</code> can be displayed standalone outside the parent <code>menu</code> or not. * </p> * * @author shiorin, tee4cute * @see [[MenuItemModel]] * @see [[AbstractMenu]] * @abstract */ export class AbstractMenuItem extends AbstractI18NApplicable { /** * @param {?} needFocusService */ constructor(needFocusService) { super(); this.needFocusService = needFocusService; this.clickEvent = new EventEmitter(); this.beforeClickEvent = new EventEmitter(); } /** * @param {?} $event * @param {?=} fireEvent * @return {?} */ onClick($event, fireEvent) { if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeClickEvent', $event, fireEvent, ($event) => { // doEvent this.emitActionPerform($event); }, ($event) => { // emitBeforeEvent this.emitBeforeClickEvent($event); }, ($event) => { // emitAfterEvent this.emitClickEvent($event); }, ($event) => { // doPrevented }); } /** * @param {?=} $event * @return {?} */ emitActionPerform($event) { if (this.model !== null && typeof this.model !== 'undefined') { if (this.model.actionPerformedHandler !== null && typeof this.model.actionPerformedHandler === 'function') { let /** @type {?} */ data = null; let /** @type {?} */ ev = EventUtils.newCustomEvent(ACTION_PERFORM, this, data, $event); this.model.actionPerformedHandler.call(null, ev); let /** @type {?} */ autoFocus = true; if (this.model.autoResetFocus !== null && typeof this.model.autoResetFocus !== 'undefined') { autoFocus = this.model.autoResetFocus; } if (autoFocus) { if (this.needFocusService !== null && typeof this.needFocusService !== 'undefined') { this.needFocusService.resetFocusingComponent(ev); } } } } } /** * @param {?=} $event * @return {?} */ emitBeforeClickEvent($event) { let /** @type {?} */ eventData = null; // emit event let /** @type {?} */ data = eventData; let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_CLICK_EVENT, this, data, $event); if (this.beforeClickEvent !== null && this.beforeClickEvent !== undefined) { this.beforeClickEvent.emit(ev); } } /** * @param {?=} $event * @return {?} */ emitClickEvent($event) { let /** @type {?} */ eventData = null; // emit event let /** @type {?} */ data = eventData; let /** @type {?} */ ev = EventUtils.newCustomEvent(CLICK_EVENT, this, data, $event); if (this.clickEvent !== null && this.clickEvent !== undefined) { this.clickEvent.emit(ev); } } /** * <p style="text-indent: 1em;"> * Get the parent <code>memu</code> associated with <code>this</code> <code>menu item</code>. * </p> * @return {?} */ getMenu() { return this.menu; } /** * <p style="text-indent: 1em;"> * Set a parent <code>menu</code> associated with <code>this</code> <code>menu item</code>. * </p> * @param {?} menu * @return {?} */ setMenu(menu) { this.menu = menu; } /** * <p style="text-indent: 1em;"> * Get the <code>model</code> of <code>this</code> <code>menu item</code>. * </p> * @return {?} */ getModel() { return this.model; } /** * <p style="text-indent: 1em;"> * Set a <code>model</code> of <code>this</code> <code>menu item</code>. * </p> * @param {?} model * @return {?} */ setModel(model) { this.model = model; } /** * @return {?} */ getClickEvent() { return this.clickEvent; } /** * @param {?} event * @return {?} */ setClickEvent(event) { this.clickEvent = event; } /** * @return {?} */ getBeforeClickEvent() { return this.beforeClickEvent; } /** * @param {?} event * @return {?} */ setBeforeClickEvent(event) { this.beforeClickEvent = event; } } tslib_1.__decorate([ Option('click'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractMenuItem.prototype, "clickEvent", void 0); tslib_1.__decorate([ Option('beforeClick'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractMenuItem.prototype, "beforeClickEvent", void 0); function AbstractMenuItem_tsickle_Closure_declarations() { /** @type {?} */ AbstractMenuItem.prototype.model; /** @type {?} */ AbstractMenuItem.prototype.menu; /** @type {?} */ AbstractMenuItem.prototype.needFocusService; /** @type {?} */ AbstractMenuItem.prototype.clickEvent; /** @type {?} */ AbstractMenuItem.prototype.beforeClickEvent; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RNZW51SXRlbS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9BYnN0cmFjdE1lbnVJdGVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUF3QyxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFNbkYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFHekUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFM0UsTUFBTSxDQUFDLHVCQUFNLGNBQWMsR0FBVyxlQUFlLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQWV0RCxNQUFNLHVCQUFpQyxTQUFRLHNCQUFzQjs7OztJQWFuRSxZQUFZLGdCQUFrQztRQUM1QyxLQUFLLEVBQUUsQ0FBQztRQUVSLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUN6QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7S0FDNUM7Ozs7OztJQUVNLE9BQU8sQ0FBQyxNQUFrQixFQUFFLFNBQW1CO1FBRXBELEVBQUUsQ0FBQyxDQUFDLFNBQVMsS0FBSyxJQUFJLElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDbEQsU0FBUyxHQUFHLElBQUksQ0FBQztTQUNsQjtRQUVELFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLE1BQWEsRUFBRSxFQUFFOztZQUUzRixJQUFJLENBQUMsaUJBQWlCLENB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Ozs7O0lBUVosT0FBTyxDQUFDLElBQWtCO1FBQy9CLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDOzs7Ozs7OztJQVFaLFFBQVE7UUFDYixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQzs7Ozs7Ozs7O0lBUWIsUUFBUSxDQUFDLEtBQW9CO1FBQ2xDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDOzs7OztJQUdkLGFBQWE7UUFDbEIsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7Ozs7OztJQUdsQixhQUFhLENBQUMsS0FBd0I7UUFDM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7Ozs7O0lBR25CLG1CQUFtQjtRQUN4QixNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDOzs7Ozs7SUFHeEIsbUJBQW1CLENBQUMsS0FBd0I7UUFDakQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQzs7Q0FFakM7O0lBbElFLE1BQU0sQ0FBQyxPQUFPLENBQUM7c0NBQ00sWUFBWTs7O0lBQ2pDLE1BQU0sQ0FBQyxhQUFhLENBQUM7c0NBQ00sWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBFbGVtZW50UmVmLCBJbnB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFic3RyYWN0TWVudSB9IGZyb20gJy4vQWJzdHJhY3RNZW51JztcblxuaW1wb3J0IHsgTmVlZEZvY3VzU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2UvTmVlZEZvY3VzU2VydmljZS5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQWJzdHJhY3RJMThOQXBwbGljYWJsZSB9IGZyb20gJy4uL3NoYXJlL0Fic3RyYWN0STE4TkFwcGxpY2FibGUnO1xuXG5pbXBvcnQgeyBNZW51SXRlbU1vZGVsIH0gZnJvbSAnLi9tb2RlbC9NZW51SXRlbU1vZGVsJztcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tICcuLi9zaGFyZS91dGlscy9FdmVudFV0aWxzJztcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcbmltcG9ydCB7IENMSUNLX0VWRU5ULCBCRUZPUkVfQ0xJQ0tfRVZFTlQgfSBmcm9tICcuLi9zaGFyZS9DdXN0b21FdmVudFR5cGUnO1xuXG5leHBvcnQgY29uc3QgQUNUSU9OX1BFUkZPUk06IHN0cmluZyA9ICdhY3Rpb25QZXJmb3JtJztcblxuLyoqXG4gKiA8cCBzdHlsZT1cInRleHQtaW5kZW50OiAyZW07XCI+XG4gKiBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciA8Y29kZT5tZW51IGl0ZW08L2NvZGU+IGNvbXBvbmVudC4gVGhpcyBjbGFzcyBwcm92aWRlcyB5b3UgYSBkZWZhdWx0IFtbb25DbGlja11dIGV2ZW50IGhhbmRsZXIgd2hpY2hcbiAqIGF1dG9tYXRpY2FsbHkgY2FsbCB0aGUgW1tNZW51SXRlbU1vZGVsLmFjdGlvblBlcmZvcm1lZEhhbmRsZXJdXSBpZiBzcGVjaWZpZWQuIEl0IGFsc28gcmVzZXRzIHRoZSBjdXJyZW50IGZvY3VzaW5nIGNvbXBvbmVudCBpZlxuICogW1tNZW51SXRlbU1vZGVsLmF1dG9SZXNldEZvY3VzXV0gaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LiBBIDxjb2RlPm1lbnUgaXRlbTwvY29kZT4gY2FuIGJlLCBidXQgbm90IG5lY2Vzc2FyeSwgaW4gYSBwYXJlbnRcbiAqIDxjb2RlPm1lbnU8L2NvZGU+LiBJdCBpcyB1cCB0byBlYWNoIGNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbiB3aGljaCBpcyBhIHN1YiBjbGFzcyBvZiB0aGlzIGNsYXNzIHRvIGRlY2lkZSB0aGF0IGl0IGlzIHJlcXVpcmVkXG4gKiB0byBhbGxvdyBhIDxjb2RlPm1lbnUgaXRlbTwvY29kZT4gY2FuIGJlIGRpc3BsYXllZCBzdGFuZGFsb25lIG91dHNpZGUgdGhlIHBhcmVudCA8Y29kZT5tZW51PC9jb2RlPiBvciBub3QuXG4gKiA8L3A+XG4gKlxuICogQGF1dGhvciBzaGlvcmluLCB0ZWU0Y3V0ZVxuICogQHNlZSBbW01lbnVJdGVtTW9kZWxdXVxuICogQHNlZSBbW0Fic3RyYWN0TWVudV1dXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1lbnVJdGVtIGV4dGVuZHMgQWJzdHJhY3RJMThOQXBwbGljYWJsZSB7XG5cbiAgLy8gQE9wdGlvbigpXG4gIC8vIEBJMThOKClcbiAgcHJvdGVjdGVkIG1vZGVsOiBNZW51SXRlbU1vZGVsO1xuICBwcm90ZWN0ZWQgbWVudTogQWJzdHJhY3RNZW51O1xuICBwcm90ZWN0ZWQgbmVlZEZvY3VzU2VydmljZTogTmVlZEZvY3VzU2VydmljZTtcblxuICBAT3B0aW9uKCdjbGljaycpXG4gIHByb3RlY3RlZCBjbGlja0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE9wdGlvbignYmVmb3JlQ2xpY2snKVxuICBwcm90ZWN0ZWQgYmVmb3JlQ2xpY2tFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG5cbiAgY29uc3RydWN0b3IobmVlZEZvY3VzU2VydmljZTogTmVlZEZvY3VzU2VydmljZSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLm5lZWRGb2N1c1NlcnZpY2UgPSBuZWVkRm9jdXNTZXJ2aWNlO1xuICAgIHRoaXMuY2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmJlZm9yZUNsaWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIH1cblxuICBwdWJsaWMgb25DbGljaygkZXZlbnQ6IE1vdXNlRXZlbnQsIGZpcmVFdmVudD86IGJvb2xlYW4pOiB2b2lkIHtcblxuICAgIGlmIChmaXJlRXZlbnQgPT09IG51bGwgfHwgZmlyZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZpcmVFdmVudCA9IHRydWU7XG4gICAgfVxuXG4gICAgRXZlbnRVdGlscy5oYW5kbGVCcm93c2VyRXZlbnQodGhpcywgJ2JlZm9yZUNsaWNrRXZlbnQnLCAkZXZlbnQsIGZpcmVFdmVudCwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGRvRXZlbnRcbiAgICAgIHRoaXMuZW1pdEFjdGlvblBlcmZvcm0oJGV2ZW50KTtcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZW1pdEJlZm9yZUV2ZW50XG4gICAgICB0aGlzLmVtaXRCZWZvcmVDbGlja0V2ZW50KCRldmVudCk7XG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGVtaXRBZnRlckV2ZW50XG4gICAgICB0aGlzLmVtaXRDbGlja0V2ZW50KCRldmVudCk7XG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGRvUHJldmVudGVkXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZW1pdEFjdGlvblBlcmZvcm0oJGV2ZW50PzogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZWwgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMubW9kZWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodGhpcy5tb2RlbC5hY3Rpb25QZXJmb3JtZWRIYW5kbGVyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm1vZGVsLmFjdGlvblBlcmZvcm1lZEhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcblxuICAgICAgICBsZXQgZGF0YTogYW55ID0gbnVsbDtcbiAgICAgICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChBQ1RJT05fUEVSRk9STSwgdGhpcywgZGF0YSwgJGV2ZW50KTtcblxuICAgICAgICB0aGlzLm1vZGVsLmFjdGlvblBlcmZvcm1lZEhhbmRsZXIuY2FsbChudWxsLCBldik7XG5cbiAgICAgICAgbGV0IGF1dG9Gb2N1cyA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmF1dG9SZXNldEZvY3VzICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm1vZGVsLmF1dG9SZXNldEZvY3VzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGF1dG9Gb2N1cyA9IHRoaXMubW9kZWwuYXV0b1Jlc2V0Rm9jdXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF1dG9Gb2N1cykge1xuICAgICAgICAgIGlmICh0aGlzLm5lZWRGb2N1c1NlcnZpY2UgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMubmVlZEZvY3VzU2VydmljZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMubmVlZEZvY3VzU2VydmljZS5yZXNldEZvY3VzaW5nQ29tcG9uZW50KGV2KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEJlZm9yZUNsaWNrRXZlbnQoJGV2ZW50PzogYW55KTogdm9pZCB7XG4gICAgbGV0IGV2ZW50RGF0YTogYW55ID0gbnVsbDtcblxuICAgIC8vIGVtaXQgZXZlbnRcbiAgICBsZXQgZGF0YTogYW55ID0gZXZlbnREYXRhO1xuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX0NMSUNLX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMuYmVmb3JlQ2xpY2tFdmVudCAhPT0gbnVsbCAmJiB0aGlzLmJlZm9yZUNsaWNrRXZlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5iZWZvcmVDbGlja0V2ZW50LmVtaXQoZXYpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0Q2xpY2tFdmVudCgkZXZlbnQ/OiBhbnkpOiB2b2lkIHtcbiAgICBsZXQgZXZlbnREYXRhOiBhbnkgPSBudWxsO1xuXG4gICAgLy8gZW1pdCBldmVudFxuICAgIGxldCBkYXRhOiBhbnkgPSBldmVudERhdGE7XG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChDTElDS19FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcblxuICAgIGlmICh0aGlzLmNsaWNrRXZlbnQgIT09IG51bGwgJiYgdGhpcy5jbGlja0V2ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2xpY2tFdmVudC5lbWl0KGV2KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogPHAgc3R5bGU9XCJ0ZXh0LWluZGVudDogMWVtO1wiPlxuICAgKiBHZXQgdGhlIHBhcmVudCA8Y29kZT5tZW11PC9jb2RlPiBhc3NvY2lhdGVkIHdpdGggPGNvZGU+dGhpczwvY29kZT4gPGNvZGU+bWVudSBpdGVtPC9jb2RlPi5cbiAgICogPC9wPlxuICAgKi9cbiAgcHVibGljIGdldE1lbnUoKTogQWJzdHJhY3RNZW51IHtcbiAgICByZXR1cm4gdGhpcy5tZW51O1xuICB9XG5cbiAgLyoqXG4gICAqIDxwIHN0eWxlPVwidGV4dC1pbmRlbnQ6IDFlbTtcIj5cbiAgICogU2V0IGEgcGFyZW50IDxjb2RlPm1lbnU8L2NvZGU+IGFzc29jaWF0ZWQgd2l0aCA8Y29kZT50aGlzPC9jb2RlPiA8Y29kZT5tZW51IGl0ZW08L2NvZGU+LlxuICAgKiA8L3A+XG4gICAqL1xuICBwdWJsaWMgc2V0TWVudShtZW51OiBBYnN0cmFjdE1lbnUpOiB2b2lkIHtcbiAgICB0aGlzLm1lbnUgPSBtZW51O1xuICB9XG5cbiAgLyoqXG4gICAqIDxwIHN0eWxlPVwidGV4dC1pbmRlbnQ6IDFlbTtcIj5cbiAgICogR2V0IHRoZSA8Y29kZT5tb2RlbDwvY29kZT4gb2YgPGNvZGU+dGhpczwvY29kZT4gPGNvZGU+bWVudSBpdGVtPC9jb2RlPi5cbiAgICogPC9wPlxuICAgKi9cbiAgcHVibGljIGdldE1vZGVsKCk6IE1lbnVJdGVtTW9kZWwge1xuICAgIHJldHVybiB0aGlzLm1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIDxwIHN0eWxlPVwidGV4dC1pbmRlbnQ6IDFlbTtcIj5cbiAgICogU2V0IGEgPGNvZGU+bW9kZWw8L2NvZGU+IG9mIDxjb2RlPnRoaXM8L2NvZGU+IDxjb2RlPm1lbnUgaXRlbTwvY29kZT4uXG4gICAqIDwvcD5cbiAgICovXG4gIHB1YmxpYyBzZXRNb2RlbChtb2RlbDogTWVudUl0ZW1Nb2RlbCk6IHZvaWQge1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDbGlja0V2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5jbGlja0V2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldENsaWNrRXZlbnQoZXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5jbGlja0V2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0QmVmb3JlQ2xpY2tFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYmVmb3JlQ2xpY2tFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRCZWZvcmVDbGlja0V2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuYmVmb3JlQ2xpY2tFdmVudCA9IGV2ZW50O1xuICB9XG59XG4iXX0=