UNPKG

theme-lib

Version:

This is a simple example Angular Library published to npm.

441 lines 34 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { fromEvent as observableFromEvent, merge as observableMerge } from 'rxjs'; import { debounceTime, delay, filter, repeat, share, switchMap, takeUntil, takeWhile, map } from 'rxjs/operators'; /** @enum {string} */ var NbTrigger = { CLICK: 'click', HOVER: 'hover', HINT: 'hint', FOCUS: 'focus', }; export { NbTrigger }; /* * Provides entity with two event stream: show and hide. * Each stream provides different events depends on implementation. * We have three main trigger strategies: click, hint and hover. * */ /* * TODO maybe we have to use renderer.listen instead of observableFromEvent? * Renderer provides capability use it in service worker, ssr and so on. * */ /** * @abstract */ var /* * Provides entity with two event stream: show and hide. * Each stream provides different events depends on implementation. * We have three main trigger strategies: click, hint and hover. * */ /* * TODO maybe we have to use renderer.listen instead of observableFromEvent? * Renderer provides capability use it in service worker, ssr and so on. * */ /** * @abstract */ NbTriggerStrategy = /** @class */ (function () { function NbTriggerStrategy(document, host, container) { this.document = document; this.host = host; this.container = container; } /** * @protected * @param {?} event * @return {?} */ NbTriggerStrategy.prototype.isNotOnHostOrContainer = /** * @protected * @param {?} event * @return {?} */ function (event) { return !this.isOnHost(event) && !this.isOnContainer(event); }; /** * @protected * @param {?} event * @return {?} */ NbTriggerStrategy.prototype.isOnHostOrContainer = /** * @protected * @param {?} event * @return {?} */ function (event) { return this.isOnHost(event) || this.isOnContainer(event); }; /** * @protected * @param {?} __0 * @return {?} */ NbTriggerStrategy.prototype.isOnHost = /** * @protected * @param {?} __0 * @return {?} */ function (_a) { var target = _a.target; return this.host.contains((/** @type {?} */ (target))); }; /** * @protected * @param {?} __0 * @return {?} */ NbTriggerStrategy.prototype.isOnContainer = /** * @protected * @param {?} __0 * @return {?} */ function (_a) { var target = _a.target; return this.container() && this.container().location.nativeElement.contains(target); }; return NbTriggerStrategy; }()); /* * Provides entity with two event stream: show and hide. * Each stream provides different events depends on implementation. * We have three main trigger strategies: click, hint and hover. * */ /* * TODO maybe we have to use renderer.listen instead of observableFromEvent? * Renderer provides capability use it in service worker, ssr and so on. * */ /** * @abstract */ export { NbTriggerStrategy }; if (false) { /** @type {?} */ NbTriggerStrategy.prototype.show$; /** @type {?} */ NbTriggerStrategy.prototype.hide$; /** * @type {?} * @protected */ NbTriggerStrategy.prototype.document; /** * @type {?} * @protected */ NbTriggerStrategy.prototype.host; /** * @type {?} * @protected */ NbTriggerStrategy.prototype.container; } /* * Creates show and hide event streams. * Fires toggle event when the click was performed on the host element. * Fires close event when the click was performed on the document but * not on the host or container. * */ var /* * Creates show and hide event streams. * Fires toggle event when the click was performed on the host element. * Fires close event when the click was performed on the document but * not on the host or container. * */ NbClickTriggerStrategy = /** @class */ (function (_super) { tslib_1.__extends(NbClickTriggerStrategy, _super); function NbClickTriggerStrategy() { var _this = _super !== null && _super.apply(this, arguments) || this; // since we should track click for both SHOW and HIDE event we firstly need to track the click and the state // of the container and then later on decide should we hide it or show // if we track the click & state separately this will case a behavior when the container is getting shown // and then hidden right away _this.click$ = observableFromEvent(_this.document, 'click') .pipe(map(function (event) { return (/** @type {?} */ ([!_this.container() && _this.isOnHost(event), event])); }), share()); _this.show$ = _this.click$ .pipe(filter(function (_a) { var _b = tslib_1.__read(_a, 1), shouldShow = _b[0]; return shouldShow; }), map(function (_a) { var _b = tslib_1.__read(_a, 2), event = _b[1]; return event; })); _this.hide$ = _this.click$ .pipe(filter(function (_a) { var _b = tslib_1.__read(_a, 2), shouldShow = _b[0], event = _b[1]; return !shouldShow && !_this.isOnContainer(event); }), map(function (_a) { var _b = tslib_1.__read(_a, 2), event = _b[1]; return event; })); return _this; } return NbClickTriggerStrategy; }(NbTriggerStrategy)); /* * Creates show and hide event streams. * Fires toggle event when the click was performed on the host element. * Fires close event when the click was performed on the document but * not on the host or container. * */ export { NbClickTriggerStrategy }; if (false) { /** * @type {?} * @protected */ NbClickTriggerStrategy.prototype.click$; /** @type {?} */ NbClickTriggerStrategy.prototype.show$; /** @type {?} */ NbClickTriggerStrategy.prototype.hide$; } /* * Creates show and hide event streams. * Fires open event when a mouse hovers over the host element and stay over at least 100 milliseconds. * Fires close event when the mouse leaves the host element and stops out of the host and popover container. * */ var /* * Creates show and hide event streams. * Fires open event when a mouse hovers over the host element and stay over at least 100 milliseconds. * Fires close event when the mouse leaves the host element and stops out of the host and popover container. * */ NbHoverTriggerStrategy = /** @class */ (function (_super) { tslib_1.__extends(NbHoverTriggerStrategy, _super); function NbHoverTriggerStrategy() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.show$ = observableFromEvent(_this.host, 'mouseenter') .pipe(filter(function () { return !_this.container(); }), delay(100), takeUntil(observableFromEvent(_this.host, 'mouseleave')), repeat()); _this.hide$ = observableFromEvent(_this.host, 'mouseleave') .pipe(switchMap(function () { return observableFromEvent(_this.document, 'mousemove') .pipe(debounceTime(100), takeWhile(function () { return !!_this.container(); }), filter(function (event) { return _this.isNotOnHostOrContainer(event); })); })); return _this; } return NbHoverTriggerStrategy; }(NbTriggerStrategy)); /* * Creates show and hide event streams. * Fires open event when a mouse hovers over the host element and stay over at least 100 milliseconds. * Fires close event when the mouse leaves the host element and stops out of the host and popover container. * */ export { NbHoverTriggerStrategy }; if (false) { /** @type {?} */ NbHoverTriggerStrategy.prototype.show$; /** @type {?} */ NbHoverTriggerStrategy.prototype.hide$; } /* * Creates show and hide event streams. * Fires open event when a mouse hovers over the host element and stay over at least 100 milliseconds. * Fires close event when the mouse leaves the host element. * */ var /* * Creates show and hide event streams. * Fires open event when a mouse hovers over the host element and stay over at least 100 milliseconds. * Fires close event when the mouse leaves the host element. * */ NbHintTriggerStrategy = /** @class */ (function (_super) { tslib_1.__extends(NbHintTriggerStrategy, _super); function NbHintTriggerStrategy() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.show$ = observableFromEvent(_this.host, 'mouseenter') .pipe(delay(100), takeUntil(observableFromEvent(_this.host, 'mouseleave')), // this `delay & takeUntil & repeat` operators combination is a synonym for `conditional debounce` // meaning that if one event occurs in some time after the initial one we won't react to it repeat()); _this.hide$ = observableFromEvent(_this.host, 'mouseleave'); return _this; } return NbHintTriggerStrategy; }(NbTriggerStrategy)); /* * Creates show and hide event streams. * Fires open event when a mouse hovers over the host element and stay over at least 100 milliseconds. * Fires close event when the mouse leaves the host element. * */ export { NbHintTriggerStrategy }; if (false) { /** @type {?} */ NbHintTriggerStrategy.prototype.show$; /** @type {?} */ NbHintTriggerStrategy.prototype.hide$; } /* * Creates show and hide event streams. * Fires open event when a focus is on the host element and stay over at least 100 milliseconds. * Fires close event when the focus leaves the host element. * */ var /* * Creates show and hide event streams. * Fires open event when a focus is on the host element and stay over at least 100 milliseconds. * Fires close event when the focus leaves the host element. * */ NbFocusTriggerStrategy = /** @class */ (function (_super) { tslib_1.__extends(NbFocusTriggerStrategy, _super); function NbFocusTriggerStrategy() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.focusOut$ = observableFromEvent(_this.host, 'focusout') .pipe(switchMap(function () { return observableFromEvent(_this.document, 'focusin') .pipe(takeWhile(function () { return !!_this.container(); }), filter(function (event) { return _this.isNotOnHostOrContainer(event); })); })); _this.clickIn$ = observableFromEvent(_this.host, 'click') .pipe(filter(function () { return !_this.container(); })); _this.clickOut$ = observableFromEvent(_this.document, 'click') .pipe(filter(function () { return !!_this.container(); }), filter(function (event) { return _this.isNotOnHostOrContainer(event); })); _this.tabKeyPress$ = observableFromEvent(_this.document, 'keydown') .pipe(filter(function (event) { return event.keyCode === 9; }), filter(function () { return !!_this.container(); })); _this.show$ = observableMerge(observableFromEvent(_this.host, 'focusin'), _this.clickIn$) .pipe(filter(function () { return !_this.container(); }), debounceTime(100), takeUntil(observableFromEvent(_this.host, 'focusout')), repeat()); _this.hide$ = observableMerge(_this.focusOut$, _this.tabKeyPress$, _this.clickOut$); return _this; } return NbFocusTriggerStrategy; }(NbTriggerStrategy)); /* * Creates show and hide event streams. * Fires open event when a focus is on the host element and stay over at least 100 milliseconds. * Fires close event when the focus leaves the host element. * */ export { NbFocusTriggerStrategy }; if (false) { /** * @type {?} * @protected */ NbFocusTriggerStrategy.prototype.focusOut$; /** * @type {?} * @protected */ NbFocusTriggerStrategy.prototype.clickIn$; /** * @type {?} * @protected */ NbFocusTriggerStrategy.prototype.clickOut$; /** * @type {?} * @protected */ NbFocusTriggerStrategy.prototype.tabKeyPress$; /** @type {?} */ NbFocusTriggerStrategy.prototype.show$; /** @type {?} */ NbFocusTriggerStrategy.prototype.hide$; } var NbTriggerStrategyBuilder = /** @class */ (function () { function NbTriggerStrategyBuilder() { } /** * @template THIS * @this {THIS} * @param {?} document * @return {THIS} */ NbTriggerStrategyBuilder.prototype.document = /** * @template THIS * @this {THIS} * @param {?} document * @return {THIS} */ function (document) { (/** @type {?} */ (this))._document = document; return (/** @type {?} */ (this)); }; /** * @template THIS * @this {THIS} * @param {?} trigger * @return {THIS} */ NbTriggerStrategyBuilder.prototype.trigger = /** * @template THIS * @this {THIS} * @param {?} trigger * @return {THIS} */ function (trigger) { (/** @type {?} */ (this))._trigger = trigger; return (/** @type {?} */ (this)); }; /** * @template THIS * @this {THIS} * @param {?} host * @return {THIS} */ NbTriggerStrategyBuilder.prototype.host = /** * @template THIS * @this {THIS} * @param {?} host * @return {THIS} */ function (host) { (/** @type {?} */ (this))._host = host; return (/** @type {?} */ (this)); }; /** * @template THIS * @this {THIS} * @param {?} container * @return {THIS} */ NbTriggerStrategyBuilder.prototype.container = /** * @template THIS * @this {THIS} * @param {?} container * @return {THIS} */ function (container) { (/** @type {?} */ (this))._container = container; return (/** @type {?} */ (this)); }; /** * @return {?} */ NbTriggerStrategyBuilder.prototype.build = /** * @return {?} */ function () { switch (this._trigger) { case NbTrigger.CLICK: return new NbClickTriggerStrategy(this._document, this._host, this._container); case NbTrigger.HINT: return new NbHintTriggerStrategy(this._document, this._host, this._container); case NbTrigger.HOVER: return new NbHoverTriggerStrategy(this._document, this._host, this._container); case NbTrigger.FOCUS: return new NbFocusTriggerStrategy(this._document, this._host, this._container); default: throw new Error('Trigger have to be provided'); } }; return NbTriggerStrategyBuilder; }()); export { NbTriggerStrategyBuilder }; if (false) { /** * @type {?} * @protected */ NbTriggerStrategyBuilder.prototype._host; /** * @type {?} * @protected */ NbTriggerStrategyBuilder.prototype._container; /** * @type {?} * @protected */ NbTriggerStrategyBuilder.prototype._trigger; /** * @type {?} * @protected */ NbTriggerStrategyBuilder.prototype._document; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmxheS10cmlnZ2VyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vdGhlbWUtbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvY2RrL292ZXJsYXkvb3ZlcmxheS10cmlnZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0EsT0FBTyxFQUFFLFNBQVMsSUFBSSxtQkFBbUIsRUFBRSxLQUFLLElBQUksZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQzlGLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7SUFJaEgsT0FBUSxPQUFPO0lBQ2YsT0FBUSxPQUFPO0lBQ2YsTUFBTyxNQUFNO0lBQ2IsT0FBUSxPQUFPOzs7Ozs7Ozs7Ozs7Ozs7QUFZakI7Ozs7Ozs7Ozs7Ozs7SUFxQkUsMkJBQXNCLFFBQWtCLEVBQVksSUFBaUIsRUFBWSxTQUFrQztRQUE3RixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQVksU0FBSSxHQUFKLElBQUksQ0FBYTtRQUFZLGNBQVMsR0FBVCxTQUFTLENBQXlCO0lBQ25ILENBQUM7Ozs7OztJQXBCUyxrREFBc0I7Ozs7O0lBQWhDLFVBQWlDLEtBQVk7UUFDM0MsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdELENBQUM7Ozs7OztJQUVTLCtDQUFtQjs7Ozs7SUFBN0IsVUFBOEIsS0FBWTtRQUN4QyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzRCxDQUFDOzs7Ozs7SUFFUyxvQ0FBUTs7Ozs7SUFBbEIsVUFBbUIsRUFBaUI7WUFBZixrQkFBTTtR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QUNyQixLQUFLLFNBQVMsQ0FBQyxLQUFLO2dCQUNsQixPQUFPLElBQUksc0JBQXNCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNqRixLQUFLLFNBQVMsQ0FBQyxJQUFJO2dCQUNqQixPQUFPLElBQUkscUJBQXFCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNoRixLQUFLLFNBQVMsQ0FBQyxLQUFLO2dCQUNsQixPQUFPLElBQUksc0JBQXNCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNqRixLQUFLLFNBQVMsQ0FBQyxLQUFLO2dCQUNsQixPQUFPLElBQUksc0JBQXNCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNqRjtnQkFDRSxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7U0FDbEQ7SUFDSCxDQUFDO0lBQ0gsK0JBQUM7QUFBRCxDQUFDLEFBeENELElBd0NDOzs7Ozs7O0lBdkNDLHlDQUE2Qjs7Ozs7SUFDN0IsOENBQThDOzs7OztJQUM5Qyw0Q0FBOEI7Ozs7O0lBQzlCLDZDQUE4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBmcm9tRXZlbnQgYXMgb2JzZXJ2YWJsZUZyb21FdmVudCwgbWVyZ2UgYXMgb2JzZXJ2YWJsZU1lcmdlLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGVsYXksIGZpbHRlciwgcmVwZWF0LCBzaGFyZSwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRha2VXaGlsZSwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuXHJcbmV4cG9ydCBlbnVtIE5iVHJpZ2dlciB7XHJcbiAgQ0xJQ0sgPSAnY2xpY2snLFxyXG4gIEhPVkVSID0gJ2hvdmVyJyxcclxuICBISU5UID0gJ2hpbnQnLFxyXG4gIEZPQ1VTID0gJ2ZvY3VzJyxcclxufVxyXG5cclxuLypcclxuICogUHJvdmlkZXMgZW50aXR5IHdpdGggdHdvIGV2ZW50IHN0cmVhbTogc2hvdyBhbmQgaGlkZS5cclxuICogRWFjaCBzdHJlYW0gcHJvdmlkZXMgZGlmZmVyZW50IGV2ZW50cyBkZXBlbmRzIG9uIGltcGxlbWVudGF0aW9uLlxyXG4gKiBXZSBoYXZlIHRocmVlIG1haW4gdHJpZ2dlciBzdHJhdGVnaWVzOiBjbGljaywgaGludCBhbmQgaG92ZXIuXHJcbiAqICovXHJcbi8qXHJcbiAqIFRPRE8gbWF5YmUgd2UgaGF2ZSB0byB1c2UgcmVuZGVyZXIubGlzdGVuIGluc3RlYWQgb2Ygb2JzZXJ2YWJsZUZyb21FdmVudD9cclxuICogUmVuZGVyZXIgcHJvdmlkZXMgY2FwYWJpbGl0eSB1c2UgaXQgaW4gc2VydmljZSB3b3JrZXIsIHNzciBhbmQgc28gb24uXHJcbiAqICovXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOYlRyaWdnZXJTdHJhdGVneSB7XHJcblxyXG4gIHByb3RlY3RlZCBpc05vdE9uSG9zdE9yQ29udGFpbmVyKGV2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICF0aGlzLmlzT25Ib3N0KGV2ZW50KSAmJiAhdGhpcy5pc09uQ29udGFpbmVyKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBpc09uSG9zdE9yQ29udGFpbmVyKGV2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNPbkhvc3QoZXZlbnQpIHx8IHRoaXMuaXNPbkNvbnRhaW5lcihldmVudCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaXNPbkhvc3QoeyB0YXJnZXQgfTogRXZlbnQpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmhvc3QuY29udGFpbnModGFyZ2V0IGFzIE5vZGUpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGlzT25Db250YWluZXIoeyB0YXJnZXQgfTogRXZlbnQpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcigpICYmIHRoaXMuY29udGFpbmVyKCkubG9jYXRpb24ubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXQpO1xyXG4gIH1cclxuXHJcbiAgYWJzdHJhY3Qgc2hvdyQ6IE9ic2VydmFibGU8RXZlbnQ+O1xyXG4gIGFic3RyYWN0IGhpZGUkOiBPYnNlcnZhYmxlPEV2ZW50PjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGRvY3VtZW50OiBEb2N1bWVudCwgcHJvdGVjdGVkIGhvc3Q6IEhUTUxFbGVtZW50LCBwcm90ZWN0ZWQgY29udGFpbmVyOiAoKSA9PiBDb21wb25lbnRSZWY8YW55Pikge1xyXG4gIH1cclxufVxyXG5cclxuLypcclxuICogQ3JlYXRlcyBzaG93IGFuZCBoaWRlIGV2ZW50IHN0cmVhbXMuXHJcbiAqIEZpcmVzIHRvZ2dsZSBldmVudCB3aGVuIHRoZSBjbGljayB3YXMgcGVyZm9ybWVkIG9uIHRoZSBob3N0IGVsZW1lbnQuXHJcbiAqIEZpcmVzIGNsb3NlIGV2ZW50IHdoZW4gdGhlIGNsaWNrIHdhcyBwZXJmb3JtZWQgb24gdGhlIGRvY3VtZW50IGJ1dFxyXG4gKiBub3Qgb24gdGhlIGhvc3Qgb3IgY29udGFpbmVyLlxyXG4gKiAqL1xyXG5leHBvcnQgY2xhc3MgTmJDbGlja1RyaWdnZXJTdHJhdGVneSBleHRlbmRzIE5iVHJpZ2dlclN0cmF0ZWd5IHtcclxuXHJcbiAgLy8gc2luY2Ugd2Ugc2hvdWxkIHRyYWNrIGNsaWNrIGZvciBib3RoIFNIT1cgYW5kIEhJREUgZXZlbnQgd2UgZmlyc3RseSBuZWVkIHRvIHRyYWNrIHRoZSBjbGljayBhbmQgdGhlIHN0YXRlXHJcbiAgLy8gb2YgdGhlIGNvbnRhaW5lciBhbmQgdGhlbiBsYXRlciBvbiBkZWNpZGUgc2hvdWxkIHdlIGhpZGUgaXQgb3Igc2hvd1xyXG4gIC8vIGlmIHdlIHRyYWNrIHRoZSBjbGljayAmIHN0YXRlIHNlcGFyYXRlbHkgdGhpcyB3aWxsIGNhc2UgYSBiZWhhdmlvciB3aGVuIHRoZSBjb250YWluZXIgaXMgZ2V0dGluZyBzaG93blxyXG4gIC8vIGFuZCB0aGVuIGhpZGRlbiByaWdodCBhd2F5XHJcbiAgcHJvdGVjdGVkIGNsaWNrJDogT2JzZXJ2YWJsZTxbYm9vbGVhbiwgRXZlbnRdPiA9IG9ic2VydmFibGVGcm9tRXZlbnQ8RXZlbnQ+KHRoaXMuZG9jdW1lbnQsICdjbGljaycpXHJcbiAgICAucGlwZShcclxuICAgICAgbWFwKChldmVudDogRXZlbnQpID0+IFshdGhpcy5jb250YWluZXIoKSAmJiB0aGlzLmlzT25Ib3N0KGV2ZW50KSwgZXZlbnRdIGFzIFtib29sZWFuLCBFdmVudF0pLFxyXG4gICAgICBzaGFyZSgpLFxyXG4gICAgKTtcclxuXHJcbiAgcmVhZG9ubHkgc2hvdyQ6IE9ic2VydmFibGU8RXZlbnQ+ID0gdGhpcy5jbGljayRcclxuICAgIC5waXBlKFxyXG4gICAgICBmaWx0ZXIoKFtzaG91bGRTaG93XSkgPT4gc2hvdWxkU2hvdyksXHJcbiAgICAgIG1hcCgoWywgZXZlbnRdKSA9PiBldmVudCksXHJcbiAgICApO1xyXG5cclxuICByZWFkb25seSBoaWRlJDogT2JzZXJ2YWJsZTxFdmVudD4gPSB0aGlzLmNsaWNrJFxyXG4gICAgLnBpcGUoXHJcbiAgICAgIGZpbHRlcigoW3Nob3VsZFNob3csIGV2ZW50XSkgPT4gIXNob3VsZFNob3cgJiYgIXRoaXMuaXNPbkNvbnRhaW5lcihldmVudCkpLFxyXG4gICAgICBtYXAoKFssIGV2ZW50XSkgPT4gZXZlbnQpLFxyXG4gICAgKTtcclxufVxyXG5cclxuLypcclxuICogQ3JlYXRlcyBzaG93IGFuZCBoaWRlIGV2ZW50IHN0cmVhbXMuXHJcbiAqIEZpcmVzIG9wZW4gZXZlbnQgd2hlbiBhIG1vdXNlIGhvdmVycyBvdmVyIHRoZSBob3N0IGVsZW1lbnQgYW5kIHN0YXkgb3ZlciBhdCBsZWFzdCAxMDAgbWlsbGlzZWNvbmRzLlxyXG4gKiBGaXJlcyBjbG9zZSBldmVudCB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgdGhlIGhvc3QgZWxlbWVudCBhbmQgc3RvcHMgb3V0IG9mIHRoZSBob3N0IGFuZCBwb3BvdmVyIGNvbnRhaW5lci5cclxuICogKi9cclxuZXhwb3J0IGNsYXNzIE5iSG92ZXJUcmlnZ2VyU3RyYXRlZ3kgZXh0ZW5kcyBOYlRyaWdnZXJTdHJhdGVneSB7XHJcblxyXG4gIHNob3ckOiBPYnNlcnZhYmxlPEV2ZW50PiA9IG9ic2VydmFibGVGcm9tRXZlbnQ8RXZlbnQ+KHRoaXMuaG9zdCwgJ21vdXNlZW50ZXInKVxyXG4gICAgLnBpcGUoXHJcbiAgICAgIGZpbHRlcigoKSA9PiAhdGhpcy5jb250YWluZXIoKSksXHJcbiAgICAgIGRlbGF5KDEwMCksXHJcbiAgICAgIHRha2VVbnRpbChvYnNlcnZhYmxlRnJvbUV2ZW50KHRoaXMuaG9zdCwgJ21vdXNlbGVhdmUnKSksXHJcbiAgICAgIHJlcGVhdCgpLFxyXG4gICAgKTtcclxuXHJcbiAgaGlkZSQ6IE9ic2VydmFibGU8RXZlbnQ+ID0gb2JzZXJ2YWJsZUZyb21FdmVudDxFdmVudD4odGhpcy5ob3N0LCAnbW91c2VsZWF2ZScpXHJcbiAgICAucGlwZShcclxuICAgICAgc3dpdGNoTWFwKCgpID0+IG9ic2VydmFibGVGcm9tRXZlbnQ8RXZlbnQ+KHRoaXMuZG9jdW1lbnQsICdtb3VzZW1vdmUnKVxyXG4gICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDEwMCksXHJcbiAgICAgICAgICB0YWtlV2hpbGUoKCkgPT4gISF0aGlzLmNvbnRhaW5lcigpKSxcclxuICAgICAgICAgIGZpbHRlcihldmVudCA9PiB0aGlzLmlzTm90T25Ib3N0T3JDb250YWluZXIoZXZlbnQpLFxyXG4gICAgICAgICAgKSxcclxuICAgICAgICApLFxyXG4gICAgICApLFxyXG4gICAgKTtcclxufVxyXG5cclxuLypcclxuICogQ3JlYXRlcyBzaG93IGFuZCBoaWRlIGV2ZW50IHN0cmVhbXMuXHJcbiAqIEZpcmVzIG9wZW4gZXZlbnQgd2hlbiBhIG1vdXNlIGhvdmVycyBvdmVyIHRoZSBob3N0IGVsZW1lbnQgYW5kIHN0YXkgb3ZlciBhdCBsZWFzdCAxMDAgbWlsbGlzZWNvbmRzLlxyXG4gKiBGaXJlcyBjbG9zZSBldmVudCB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgdGhlIGhvc3QgZWxlbWVudC5cclxuICogKi9cclxuZXhwb3J0IGNsYXNzIE5iSGludFRyaWdnZXJTdHJhdGVneSBleHRlbmRzIE5iVHJpZ2dlclN0cmF0ZWd5IHtcclxuICBzaG93JDogT2JzZXJ2YWJsZTxFdmVudD4gPSBvYnNlcnZhYmxlRnJvbUV2ZW50PEV2ZW50Pih0aGlzLmhvc3QsICdtb3VzZWVudGVyJylcclxuICAgIC5waXBlKFxyXG4gICAgICBkZWxheSgxMDApLFxyXG4gICAgICB0YWtlVW50aWwob2JzZXJ2YWJsZUZyb21FdmVudCh0aGlzLmhvc3QsICdtb3VzZWxlYXZlJykpLFxyXG4gICAgICAvLyB0aGlzIGBkZWxheSAmIHRha2VVbnRpbCAmIHJlcGVhdGAgb3BlcmF0b3JzIGNvbWJpbmF0aW9uIGlzIGEgc3lub255bSBmb3IgYGNvbmRpdGlvbmFsIGRlYm91bmNlYFxyXG4gICAgICAvLyBtZWFuaW5nIHRoYXQgaWYgb25lIGV2ZW50IG9jY3VycyBpbiBzb21lIHRpbWUgYWZ0ZXIgdGhlIGluaXRpYWwgb25lIHdlIHdvbid0IHJlYWN0IHRvIGl0XHJcbiAgICAgIHJlcGVhdCgpLFxyXG4gICAgKTtcclxuXHJcbiAgaGlkZSQ6IE9ic2VydmFibGU8RXZlbnQ+ID0gb2JzZXJ2YWJsZUZyb21FdmVudCh0aGlzLmhvc3QsICdtb3VzZWxlYXZlJyk7XHJcbn1cclxuXHJcblxyXG4vKlxyXG4gKiBDcmVhdGVzIHNob3cgYW5kIGhpZGUgZXZlbnQgc3RyZWFtcy5cclxuICogRmlyZXMgb3BlbiBldmVudCB3aGVuIGEgZm9jdXMgaXMgb24gdGhlIGhvc3QgZWxlbWVudCBhbmQgc3RheSBvdmVyIGF0IGxlYXN0IDEwMCBtaWxsaXNlY29uZHMuXHJcbiAqIEZpcmVzIGNsb3NlIGV2ZW50IHdoZW4gdGhlIGZvY3VzIGxlYXZlcyB0aGUgaG9zdCBlbGVtZW50LlxyXG4gKiAqL1xyXG5leHBvcnQgY2xhc3MgTmJGb2N1c1RyaWdnZXJTdHJhdGVneSBleHRlbmRzIE5iVHJpZ2dlclN0cmF0ZWd5IHtcclxuXHJcbiAgcHJvdGVjdGVkIGZvY3VzT3V0JDogT2JzZXJ2YWJsZTxFdmVudD4gPSBvYnNlcnZhYmxlRnJvbUV2ZW50PEV2ZW50Pih0aGlzLmhvc3QsICdmb2N1c291dCcpXHJcbiAgICAucGlwZShcclxuICAgICAgc3dpdGNoTWFwKCgpID0+IG9ic2VydmFibGVGcm9tRXZlbnQ8RXZlbnQ+KHRoaXMuZG9jdW1lbnQsICdmb2N1c2luJylcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIHRha2VXaGlsZSgoKSA9PiAhIXRoaXMuY29udGFpbmVyKCkpLFxyXG4gICAgICAgICAgZmlsdGVyKGV2ZW50ID0+IHRoaXMuaXNOb3RPbkhvc3RPckNvbnRhaW5lcihldmVudCkpLFxyXG4gICAgICAgICksXHJcbiAgICAgICksXHJcbiAgICApO1xyXG5cclxuICBwcm90ZWN0ZWQgY2xpY2tJbiQ6IE9ic2VydmFibGU8RXZlbnQ+ID0gb2JzZXJ2YWJsZUZyb21FdmVudDxFdmVudD4odGhpcy5ob3N0LCAnY2xpY2snKVxyXG4gICAgLnBpcGUoXHJcbiAgICAgIGZpbHRlcigoKSA9PiAhdGhpcy5jb250YWluZXIoKSksXHJcbiAgICApO1xyXG5cclxuICBwcm90ZWN0ZWQgY2xpY2tPdXQkOiBPYnNlcnZhYmxlPEV2ZW50PiA9IG9ic2VydmFibGVGcm9tRXZlbnQ8RXZlbnQ+KHRoaXMuZG9jdW1lbnQsICdjbGljaycpXHJcbiAgICAucGlwZShcclxuICAgICAgZmlsdGVyKCgpID0+ICEhdGhpcy5jb250YWluZXIoKSksXHJcbiAgICAgIGZpbHRlcihldmVudCA9PiB0aGlzLmlzTm90T25Ib3N0T3JDb250YWluZXIoZXZlbnQpKSxcclxuICAgICk7XHJcblxyXG4gIHByb3RlY3RlZCB0YWJLZXlQcmVzcyQ6IE9ic2VydmFibGU8RXZlbnQ+ID0gb2JzZXJ2YWJsZUZyb21FdmVudDxFdmVudD4odGhpcy5kb2N1bWVudCwgJ2tleWRvd24nKVxyXG4gICAgLnBpcGUoXHJcbiAgICAgIGZpbHRlcigoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IGV2ZW50LmtleUNvZGUgPT09IDkpLFxyXG4gICAgICBmaWx0ZXIoKCkgPT4gISF0aGlzLmNvbnRhaW5lcigpKSxcclxuICAgICk7XHJcblxyXG4gIHNob3ckOiBPYnNlcnZhYmxlPEV2ZW50PiA9IG9ic2VydmFibGVNZXJnZShvYnNlcnZhYmxlRnJvbUV2ZW50PEV2ZW50Pih0aGlzLmhvc3QsICdmb2N1c2luJyksIHRoaXMuY2xpY2tJbiQpXHJcbiAgICAucGlwZShcclxuICAgICAgZmlsdGVyKCgpID0+ICF0aGlzLmNvbnRhaW5lcigpKSxcclxuICAgICAgZGVib3VuY2VUaW1lKDEwMCksXHJcbiAgICAgIHRha2VVbnRpbChvYnNlcnZhYmxlRnJvbUV2ZW50KHRoaXMuaG9zdCwgJ2ZvY3Vzb3V0JykpLFxyXG4gICAgICByZXBlYXQoKSxcclxuICAgICk7XHJcblxyXG4gIGhpZGUkID0gb2JzZXJ2YWJsZU1lcmdlKHRoaXMuZm9jdXNPdXQkLCB0aGlzLnRhYktleVByZXNzJCwgdGhpcy5jbGlja091dCQpO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTmJUcmlnZ2VyU3RyYXRlZ3lCdWlsZGVyIHtcclxuICBwcm90ZWN0ZWQgX2hvc3Q6IEhUTUxFbGVtZW50O1xyXG4gIHByb3RlY3RlZCBfY29udGFpbmVyOiAoKSA9PiBDb21wb25lbnRSZWY8YW55PjtcclxuICBwcm90ZWN0ZWQgX3RyaWdnZXI6IE5iVHJpZ2dlcjtcclxuICBwcm90ZWN0ZWQgX2RvY3VtZW50OiBEb2N1bWVudDtcclxuXHJcbiAgZG9jdW1lbnQoZG9jdW1lbnQ6IERvY3VtZW50KTogdGhpcyB7XHJcbiAgICB0aGlzLl9kb2N1bWVudCA9IGRvY3VtZW50O1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICB0cmlnZ2VyKHRyaWdnZXI6IE5iVHJpZ2dlcik6IHRoaXMge1xyXG4gICAgdGhpcy5fdHJpZ2dlciA9IHRyaWdnZXI7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIGhvc3QoaG9zdDogSFRNTEVsZW1lbnQpOiB0aGlzIHtcclxuICAgIHRoaXMuX2hvc3QgPSBob3N0O1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBjb250YWluZXIoY29udGFpbmVyOiAoKSA9PiBDb21wb25lbnRSZWY8YW55Pik6IHRoaXMge1xyXG4gICAgdGhpcy5fY29udGFpbmVyID0gY29udGFpbmVyO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBidWlsZCgpOiBOYlRyaWdnZXJTdHJhdGVneSB7XHJcbiAgICBzd2l0Y2ggKHRoaXMuX3RyaWdnZXIpIHtcclxuICAgICAgY2FzZSBOYlRyaWdnZXIuQ0xJQ0s6XHJcbiAgICAgICAgcmV0dXJuIG5ldyBOYkNsaWNrVHJpZ2dlclN0cmF0ZWd5KHRoaXMuX2RvY3VtZW50LCB0aGlzLl9ob3N0LCB0aGlzLl9jb250YWluZXIpO1xyXG4gICAgICBjYXNlIE5iVHJpZ2dlci5ISU5UOlxyXG4gICAgICAgIHJldHVybiBuZXcgTmJIaW50VHJpZ2dlclN0cmF0ZWd5KHRoaXMuX2RvY3VtZW50LCB0aGlzLl9ob3N0LCB0aGlzLl9jb250YWluZXIpO1xyXG4gICAgICBjYXNlIE5iVHJpZ2dlci5IT1ZFUjpcclxuICAgICAgICByZXR1cm4gbmV3IE5iSG92ZXJUcmlnZ2VyU3RyYXRlZ3kodGhpcy5fZG9jdW1lbnQsIHRoaXMuX2hvc3QsIHRoaXMuX2NvbnRhaW5lcik7XHJcbiAgICAgIGNhc2UgTmJUcmlnZ2VyLkZPQ1VTOlxyXG4gICAgICAgIHJldHVybiBuZXcgTmJGb2N1c1RyaWdnZXJTdHJhdGVneSh0aGlzLl9kb2N1bWVudCwgdGhpcy5faG9zdCwgdGhpcy5fY29udGFpbmVyKTtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyaWdnZXIgaGF2ZSB0byBiZSBwcm92aWRlZCcpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=