theme-lib
Version:
This is a simple example Angular Library published to npm.
441 lines • 34 kB
JavaScript
/**
* @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=