UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

307 lines (306 loc) 33.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import { AbstractNavMenu } from './AbstractNavMenu'; const /** @type {?} */ SUB_TOPIC_NAME = 'nav-left-layout'; const /** @type {?} */ TOPIC_NAME_PREFIX = 'nav-left-layout.'; const /** @type {?} */ FIXED_CHANGE_SUFFIX = 'fixed'; const /** @type {?} */ TOGGLED_CHANGE_SUFFIX = 'toggled'; const /** @type {?} */ FIXED_CMD_SUFFIX = 'cmd.fixed'; const /** @type {?} */ TOGGLED_CMD_SUFFIX = 'cmd.toggled'; const /** @type {?} */ FIXED_CHANGE_TOPIC_NAME = TOPIC_NAME_PREFIX + FIXED_CHANGE_SUFFIX; const /** @type {?} */ TOGGLED_CHANGE_TOPIC_NAME = TOPIC_NAME_PREFIX + TOGGLED_CHANGE_SUFFIX; const /** @type {?} */ FIXED_CMD_TOPIC_NAME = TOPIC_NAME_PREFIX + FIXED_CMD_SUFFIX; const /** @type {?} */ TOGGLED_CMD_TOPIC_NAME = TOPIC_NAME_PREFIX + TOGGLED_CMD_SUFFIX; // unsupported: template constraints. /** * <p style="text-indent: 2em;"> * An abstract base class for left side bar <code>nav menu</code>. This class provides more capabilities than [[AbstractNavMenu]] in case of that it can be * showed/hidden by sliding the panel in/out from the left side of the screen. You can subscribe to the [[ObservableManager]]'s topic name * <code>nav-left-layout.[sub-topic-name].toggled</code> to listen on the event emitted from this component when the left panel is <code>toggled</code> * (showed/hidden). Futhermore, instead of sliding the panel in/out from the left side of the screen, it can be fixed by setting a flag [[fixed]] to <code>true</code>. * By setting a flag [[fixed]] to <code>true</code>, the left panel will be always shown on the screen. This component will automatically publish an event to * topic name <code>nav-left-layout.[sub-topic-name].fixed</code> when the flag [[fixed]] is changed. You can also control the <code>toggled</code> and <code>fixed</code> * flag sending an event into <code>command</code> topic name <code>nav-left-layout.[sub-topic-name].cmd.toggled</code> and <code>nav-left-layout.[sub-topic-name].cmd.fixed</code> * respectively. * </p> * * @author shiorin, tee4cute * @see [[ObservableManager]] * @abstract * @template T */ export class AbstractNavLeftLayout extends AbstractNavMenu { /** * @param {?} phloxAppService * @param {?} observableMgr * @param {?} subTopicName */ constructor(phloxAppService, observableMgr, subTopicName) { super(AbstractNavLeftLayout.SUB_TOPIC_NAME, observableMgr); if (phloxAppService !== null && typeof phloxAppService !== 'undefined') { this.phloxAppService = phloxAppService; } this.observableMgr = observableMgr; this.subTopicName = subTopicName; this.fixed = false; this.toggled = false; this.fixedSubjects = []; this.toggledSubjects = []; } /** * @param {?} subTopicName * @return {?} */ static getFixedChangeTopicName(subTopicName) { if (subTopicName === null || typeof subTopicName === 'undefined' || subTopicName === '') { return AbstractNavLeftLayout.FIXED_CHANGE_TOPIC_NAME; } if (subTopicName.charAt(0) === '.') { subTopicName = subTopicName.substring(1); } if (subTopicName === '') { return AbstractNavLeftLayout.FIXED_CHANGE_TOPIC_NAME; } if (subTopicName.charAt(subTopicName.length - 1) !== '.') { subTopicName += '.'; } return TOPIC_NAME_PREFIX + subTopicName + FIXED_CHANGE_SUFFIX; } /** * @param {?} subTopicName * @return {?} */ static getToggledChangeTopicName(subTopicName) { if (subTopicName === null || typeof subTopicName === 'undefined' || subTopicName === '') { return AbstractNavLeftLayout.TOGGLED_CHANGE_TOPIC_NAME; } if (subTopicName.charAt(0) === '.') { subTopicName = subTopicName.substring(1); } if (subTopicName === '') { return AbstractNavLeftLayout.TOGGLED_CHANGE_TOPIC_NAME; } if (subTopicName.charAt(subTopicName.length - 1) !== '.') { subTopicName += '.'; } return TOPIC_NAME_PREFIX + subTopicName + TOGGLED_CHANGE_SUFFIX; } /** * @param {?} subTopicName * @return {?} */ static getFixedCmdTopicName(subTopicName) { if (subTopicName === null || typeof subTopicName === 'undefined' || subTopicName === '') { return AbstractNavLeftLayout.FIXED_CMD_TOPIC_NAME; } if (subTopicName.charAt(0) === '.') { subTopicName = subTopicName.substring(1); } if (subTopicName === '') { return AbstractNavLeftLayout.FIXED_CMD_TOPIC_NAME; } if (subTopicName.charAt(subTopicName.length - 1) !== '.') { subTopicName += '.'; } return TOPIC_NAME_PREFIX + subTopicName + FIXED_CMD_SUFFIX; } /** * @param {?} subTopicName * @return {?} */ static getToggledCmdTopicName(subTopicName) { if (subTopicName === null || typeof subTopicName === 'undefined' || subTopicName === '') { return AbstractNavLeftLayout.TOGGLED_CMD_TOPIC_NAME; } if (subTopicName.charAt(0) === '.') { subTopicName = subTopicName.substring(1); } if (subTopicName === '') { return AbstractNavLeftLayout.TOGGLED_CMD_TOPIC_NAME; } if (subTopicName.charAt(subTopicName.length - 1) !== '.') { subTopicName += '.'; } return TOPIC_NAME_PREFIX + subTopicName + TOGGLED_CMD_SUFFIX; } /** * @return {?} */ get app() { if (this.phloxAppService === null || typeof this.phloxAppService === 'undefined') { return null; } return this.phloxAppService.getInstance(); } /** * @return {?} */ get fixed() { return this._fixed; } /** * @param {?} newFixed * @return {?} */ set fixed(newFixed) { let /** @type {?} */ change = this._fixed !== newFixed; this._fixed = newFixed; if (change) { this.onFixedChange(this._fixed); // Emit change event if (Array.isArray(this.fixedSubjects)) { this.fixedSubjects.forEach((obsv, idx) => { obsv.next(this); }); } } } /** * @return {?} */ get toggled() { return this._toggled; } /** * @param {?} newToggled * @return {?} */ set toggled(newToggled) { let /** @type {?} */ change = this._toggled !== newToggled; this._toggled = newToggled; if (change) { this.onToggledChange(this._toggled); if (Array.isArray(this.toggledSubjects)) { // Emit change event this.toggledSubjects.forEach((obsv, idx) => { obsv.next(this); }); } } } /** * @param {?} fixedChange * @param {?} toggledChanged * @param {?} fixedCmd * @param {?} toggledCmd * @return {?} */ initNavLeftEventTopics(fixedChange, toggledChanged, fixedCmd, toggledCmd) { // Create change event observable topics if (fixedChange !== null && typeof fixedChange === 'string') { this.fixedSubjects.push(this.observableMgr.createSubject(fixedChange)); } if (toggledChanged !== null && typeof toggledChanged === 'string') { this.toggledSubjects.push(this.observableMgr.createSubject(toggledChanged)); } // Subscribe on CMD topics if (fixedCmd !== null && typeof fixedCmd === 'string') { this.observableMgr.subscribe(fixedCmd, (fixed) => { if (typeof fixed === 'boolean') { this.fixed = fixed; } }); } if (toggledCmd !== null && typeof toggledCmd === 'string') { this.observableMgr.subscribe(toggledCmd, (toggled) => { if (typeof toggled === 'boolean') { this.toggled = toggled; } }); } } /** * @return {?} */ ngOnInit() { super.ngOnInit(); // Init super class event topics this.initNavLeftEventTopics(AbstractNavLeftLayout.FIXED_CHANGE_TOPIC_NAME, AbstractNavLeftLayout.TOGGLED_CHANGE_TOPIC_NAME, AbstractNavLeftLayout.FIXED_CMD_TOPIC_NAME, AbstractNavLeftLayout.TOGGLED_CMD_TOPIC_NAME); if (this.subTopicName !== null && this.subTopicName !== '' || typeof this.subTopicName !== 'undefined') { // Init sub topic event topics this.initNavLeftEventTopics(AbstractNavLeftLayout.getFixedChangeTopicName(this.subTopicName), AbstractNavLeftLayout.getToggledChangeTopicName(this.subTopicName), AbstractNavLeftLayout.getFixedCmdTopicName(this.subTopicName), AbstractNavLeftLayout.getToggledCmdTopicName(this.subTopicName)); } } /** * @return {?} */ getApplication() { return this.app; } /** * @return {?} */ getSubTopicName() { return this.subTopicName; } /** * @return {?} */ isFixed() { return this.fixed; } /** * @param {?} fixed * @return {?} */ setFixed(fixed) { this.fixed = fixed; } /** * @return {?} */ isToggled() { return this.toggled; } /** * @param {?} toggled * @return {?} */ setToggled(toggled) { this.toggled = toggled; } } AbstractNavLeftLayout.FIXED_CHANGE_TOPIC_NAME = FIXED_CHANGE_TOPIC_NAME; AbstractNavLeftLayout.TOGGLED_CHANGE_TOPIC_NAME = TOGGLED_CHANGE_TOPIC_NAME; AbstractNavLeftLayout.FIXED_CMD_TOPIC_NAME = FIXED_CMD_TOPIC_NAME; AbstractNavLeftLayout.TOGGLED_CMD_TOPIC_NAME = TOGGLED_CMD_TOPIC_NAME; AbstractNavLeftLayout.SUB_TOPIC_NAME = SUB_TOPIC_NAME; function AbstractNavLeftLayout_tsickle_Closure_declarations() { /** @type {?} */ AbstractNavLeftLayout.FIXED_CHANGE_TOPIC_NAME; /** @type {?} */ AbstractNavLeftLayout.TOGGLED_CHANGE_TOPIC_NAME; /** @type {?} */ AbstractNavLeftLayout.FIXED_CMD_TOPIC_NAME; /** @type {?} */ AbstractNavLeftLayout.TOGGLED_CMD_TOPIC_NAME; /** @type {?} */ AbstractNavLeftLayout.SUB_TOPIC_NAME; /** @type {?} */ AbstractNavLeftLayout.prototype._fixed; /** @type {?} */ AbstractNavLeftLayout.prototype._toggled; /** @type {?} */ AbstractNavLeftLayout.prototype.phloxAppService; /** @type {?} */ AbstractNavLeftLayout.prototype.fixedSubjects; /** @type {?} */ AbstractNavLeftLayout.prototype.toggledSubjects; /** @type {?} */ AbstractNavLeftLayout.prototype.subTopicName; /** * @abstract * @param {?} fixed * @return {?} */ AbstractNavLeftLayout.prototype.onFixedChange = function (fixed) { }; /** * @abstract * @param {?} toggled * @return {?} */ AbstractNavLeftLayout.prototype.onToggledChange = function (toggled) { }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3ROYXZMZWZ0TGF5b3V0LmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L0Fic3RyYWN0TmF2TGVmdExheW91dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBUUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXBELHVCQUFNLGNBQWMsR0FBVyxpQkFBaUIsQ0FBQztBQUNqRCx1QkFBTSxpQkFBaUIsR0FBVyxrQkFBa0IsQ0FBQztBQUVyRCx1QkFBTSxtQkFBbUIsR0FBVyxPQUFPLENBQUM7QUFDNUMsdUJBQU0scUJBQXFCLEdBQVcsU0FBUyxDQUFDO0FBQ2hELHVCQUFNLGdCQUFnQixHQUFXLFdBQVcsQ0FBQztBQUM3Qyx1QkFBTSxrQkFBa0IsR0FBVyxhQUFhLENBQUM7QUFFakQsdUJBQU0sdUJBQXVCLEdBQVcsaUJBQWlCLEdBQUcsbUJBQW1CLENBQUM7QUFDaEYsdUJBQU0seUJBQXlCLEdBQVcsaUJBQWlCLEdBQUcscUJBQXFCLENBQUM7QUFFcEYsdUJBQU0sb0JBQW9CLEdBQVcsaUJBQWlCLEdBQUcsZ0JBQWdCLENBQUM7QUFDMUUsdUJBQU0sc0JBQXNCLEdBQVcsaUJBQWlCLEdBQUcsa0JBQWtCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQjlFLE1BQU0sNEJBQWlFLFNBQVEsZUFBa0I7Ozs7OztJQXVHN0YsWUFBWSxlQUFnQyxFQUFFLGFBQWdDLEVBQUUsWUFBb0I7UUFDaEcsS0FBSyxDQUFDLHFCQUFxQixDQUFDLGNBQWMsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUUzRCxFQUFFLENBQUMsQ0FBQyxlQUFlLEtBQUssSUFBSSxJQUFJLE9BQU8sZUFBZSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7U0FDMUM7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztR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QyxPQUFnQjtRQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQzs7O2dEQW5POEIsdUJBQXVCO2tEQUNyQix5QkFBeUI7NkNBQzlCLG9CQUFvQjsrQ0FDbEIsc0JBQXNCO3VDQUM5QixjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcy9TdWJqZWN0JztcblxuaW1wb3J0IHsgUGhsb3hBcHAgfSBmcm9tICcuL1BobG94QXBwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJQXBwbGljYXRpb25Bd2FyZSB9IGZyb20gJy4vSUFwcGxpY2F0aW9uQXdhcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZU1hbmFnZXIgfSBmcm9tICcuLi9zZXJ2aWNlL09ic2VydmFibGVNYW5hZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGhsb3hBcHBTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9QaGxveEFwcFNlcnZpY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBBYnN0cmFjdE5hdkl0ZW0gfSBmcm9tICcuL0Fic3RyYWN0TmF2SXRlbSc7XG5pbXBvcnQgeyBBYnN0cmFjdE5hdk1lbnUgfSBmcm9tICcuL0Fic3RyYWN0TmF2TWVudSc7XG5cbmNvbnN0IFNVQl9UT1BJQ19OQU1FOiBzdHJpbmcgPSAnbmF2LWxlZnQtbGF5b3V0JztcbmNvbnN0IFRPUElDX05BTUVfUFJFRklYOiBzdHJpbmcgPSAnbmF2LWxlZnQtbGF5b3V0Lic7XG5cbmNvbnN0IEZJWEVEX0NIQU5HRV9TVUZGSVg6IHN0cmluZyA9ICdmaXhlZCc7XG5jb25zdCBUT0dHTEVEX0NIQU5HRV9TVUZGSVg6IHN0cmluZyA9ICd0b2dnbGVkJztcbmNvbnN0IEZJWEVEX0NNRF9TVUZGSVg6IHN0cmluZyA9ICdjbWQuZml4ZWQnO1xuY29uc3QgVE9HR0xFRF9DTURfU1VGRklYOiBzdHJpbmcgPSAnY21kLnRvZ2dsZWQnO1xuXG5jb25zdCBGSVhFRF9DSEFOR0VfVE9QSUNfTkFNRTogc3RyaW5nID0gVE9QSUNfTkFNRV9QUkVGSVggKyBGSVhFRF9DSEFOR0VfU1VGRklYO1xuY29uc3QgVE9HR0xFRF9DSEFOR0VfVE9QSUNfTkFNRTogc3RyaW5nID0gVE9QSUNfTkFNRV9QUkVGSVggKyBUT0dHTEVEX0NIQU5HRV9TVUZGSVg7XG5cbmNvbnN0IEZJWEVEX0NNRF9UT1BJQ19OQU1FOiBzdHJpbmcgPSBUT1BJQ19OQU1FX1BSRUZJWCArIEZJWEVEX0NNRF9TVUZGSVg7XG5jb25zdCBUT0dHTEVEX0NNRF9UT1BJQ19OQU1FOiBzdHJpbmcgPSBUT1BJQ19OQU1FX1BSRUZJWCArIFRPR0dMRURfQ01EX1NVRkZJWDtcblxuLyoqXG4gKiA8cCBzdHlsZT1cInRleHQtaW5kZW50OiAyZW07XCI+XG4gKiBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBsZWZ0IHNpZGUgYmFyIDxjb2RlPm5hdiBtZW51PC9jb2RlPi4gVGhpcyBjbGFzcyBwcm92aWRlcyBtb3JlIGNhcGFiaWxpdGllcyB0aGFuIFtbQWJzdHJhY3ROYXZNZW51XV0gaW4gY2FzZSBvZiB0aGF0IGl0IGNhbiBiZVxuICogc2hvd2VkL2hpZGRlbiBieSBzbGlkaW5nIHRoZSBwYW5lbCBpbi9vdXQgZnJvbSB0aGUgbGVmdCBzaWRlIG9mIHRoZSBzY3JlZW4uIFlvdSBjYW4gc3Vic2NyaWJlIHRvIHRoZSBbW09ic2VydmFibGVNYW5hZ2VyXV0ncyB0b3BpYyBuYW1lXG4gKiA8Y29kZT5uYXYtbGVmdC1sYXlvdXQuW3N1Yi10b3BpYy1uYW1lXS50b2dnbGVkPC9jb2RlPiB0byBsaXN0ZW4gb24gdGhlIGV2ZW50IGVtaXR0ZWQgZnJvbSB0aGlzIGNvbXBvbmVudCB3aGVuIHRoZSBsZWZ0IHBhbmVsIGlzIDxjb2RlPnRvZ2dsZWQ8L2NvZGU+XG4gKiAoc2hvd2VkL2hpZGRlbikuIEZ1dGhlcm1vcmUsIGluc3RlYWQgb2Ygc2xpZGluZyB0aGUgcGFuZWwgaW4vb3V0IGZyb20gdGhlIGxlZnQgc2lkZSBvZiB0aGUgc2NyZWVuLCBpdCBjYW4gYmUgZml4ZWQgYnkgc2V0dGluZyBhIGZsYWcgW1tmaXhlZF1dIHRvIDxjb2RlPnRydWU8L2NvZGU+LlxuICogQnkgc2V0dGluZyBhIGZsYWcgW1tmaXhlZF1dIHRvIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgbGVmdCBwYW5lbCB3aWxsIGJlIGFsd2F5cyBzaG93biBvbiB0aGUgc2NyZWVuLiBUaGlzIGNvbXBvbmVudCB3aWxsIGF1dG9tYXRpY2FsbHkgcHVibGlzaCBhbiBldmVudCB0b1xuICogdG9waWMgbmFtZSA8Y29kZT5uYXYtbGVmdC1sYXlvdXQuW3N1Yi10b3BpYy1uYW1lXS5maXhlZDwvY29kZT4gd2hlbiB0aGUgZmxhZyBbW2ZpeGVkXV0gaXMgY2hhbmdlZC4gWW91IGNhbiBhbHNvIGNvbnRyb2wgdGhlIDxjb2RlPnRvZ2dsZWQ8L2NvZGU+IGFuZCA8Y29kZT5maXhlZDwvY29kZT5cbiAqIGZsYWcgc2VuZGluZyBhbiBldmVudCBpbnRvIDxjb2RlPmNvbW1hbmQ8L2NvZGU+IHRvcGljIG5hbWUgPGNvZGU+bmF2LWxlZnQtbGF5b3V0LltzdWItdG9waWMtbmFtZV0uY21kLnRvZ2dsZWQ8L2NvZGU+IGFuZCA8Y29kZT5uYXYtbGVmdC1sYXlvdXQuW3N1Yi10b3BpYy1uYW1lXS5jbWQuZml4ZWQ8L2NvZGU+XG4gKiByZXNwZWN0aXZlbHkuXG4gKiA8L3A+XG4gKlxuICogQGF1dGhvciBzaGlvcmluLCB0ZWU0Y3V0ZVxuICogQHNlZSBbW09ic2VydmFibGVNYW5hZ2VyXV1cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TmF2TGVmdExheW91dDxUIGV4dGVuZHMgQWJzdHJhY3ROYXZJdGVtPiBleHRlbmRzIEFic3RyYWN0TmF2TWVudTxUPiBpbXBsZW1lbnRzIElBcHBsaWNhdGlvbkF3YXJlLCBPbkluaXQge1xuXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBGSVhFRF9DSEFOR0VfVE9QSUNfTkFNRTogc3RyaW5nID0gRklYRURfQ0hBTkdFX1RPUElDX05BTUU7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBUT0dHTEVEX0NIQU5HRV9UT1BJQ19OQU1FOiBzdHJpbmcgPSBUT0dHTEVEX0NIQU5HRV9UT1BJQ19OQU1FO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRklYRURfQ01EX1RPUElDX05BTUU6IHN0cmluZyA9IEZJWEVEX0NNRF9UT1BJQ19OQU1FO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVE9HR0xFRF9DTURfVE9QSUNfTkFNRTogc3RyaW5nID0gVE9HR0xFRF9DTURfVE9QSUNfTkFNRTtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNVQl9UT1BJQ19OQU1FOiBzdHJpbmcgPSBTVUJfVE9QSUNfTkFNRTtcblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Rml4ZWRDaGFuZ2VUb3BpY05hbWUoc3ViVG9waWNOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoc3ViVG9waWNOYW1lID09PSBudWxsIHx8IHR5cGVvZiBzdWJUb3BpY05hbWUgPT09ICd1bmRlZmluZWQnIHx8IHN1YlRvcGljTmFtZSA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBBYnN0cmFjdE5hdkxlZnRMYXlvdXQuRklYRURfQ0hBTkdFX1RPUElDX05BTUU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3ViVG9waWNOYW1lLmNoYXJBdCgwKSA9PT0gJy4nKSB7XG4gICAgICAgICAgICBzdWJUb3BpY05hbWUgPSBzdWJUb3BpY05hbWUuc3Vic3RyaW5nKDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN1YlRvcGljTmFtZSA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBBYnN0cmFjdE5hdkxlZnRMYXlvdXQuRklYRURfQ0hBTkdFX1RPUElDX05BTUU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3ViVG9waWNOYW1lLmNoYXJBdChzdWJUb3BpY05hbWUubGVuZ3RoIC0gMSkgIT09ICcuJykge1xuICAgICAgICAgICAgc3ViVG9waWNOYW1lICs9ICcuJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBUT1BJQ19OQU1FX1BSRUZJWCArIHN1YlRvcGljTmFtZSArIEZJWEVEX0NIQU5HRV9TVUZGSVg7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRUb2dnbGVkQ2hhbmdlVG9waWNOYW1lKHN1YlRvcGljTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHN1YlRvcGljTmFtZSA9PT0gbnVsbCB8fCB0eXBlb2Ygc3ViVG9waWNOYW1lID09PSAndW5kZWZpbmVkJyB8fCBzdWJUb3BpY05hbWUgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gQWJzdHJhY3ROYXZMZWZ0TGF5b3V0LlRPR0dMRURfQ0hBTkdFX1RPUElDX05BTUU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3ViVG9waWNOYW1lLmNoYXJBdCgwKSA9PT0gJy4nKSB7XG4gICAgICAgICAgICBzdWJUb3BpY05hbWUgPSBzdWJUb3BpY05hbWUuc3Vic3RyaW5nKDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN1YlRvcGljTmFtZSA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBBYnN0cmFjdE5hdkxlZnRMYXlvdXQuVE9HR0xFRF9DSEFOR0VfVE9QSUNfTkFNRTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdWJUb3BpY05hbWUuY2hhckF0KHN1YlRvcGljTmFtZS5sZW5ndGggLSAxKSAhPT0gJy4nKSB7XG4gICAgICAgICAgICBzdWJUb3BpY05hbWUgKz0gJy4nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFRPUElDX05BTUVfUFJFRklYICsgc3ViVG9waWNOYW1lICsgVE9HR0xFRF9DSEFOR0VfU1VGRklYO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Rml4ZWRDbWRUb3BpY05hbWUoc3ViVG9waWNOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoc3ViVG9waWNOYW1lID09PSBudWxsIHx8IHR5cGVvZiBzdWJUb3BpY05hbWUgPT09ICd1bmRlZmluZWQnIHx8IHN1YlRvcGljTmFtZSA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBBYnN0cmFjdE5hdkxlZnRMYXlvdXQuRklYRURfQ01EX1RPUElDX05BTUU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3ViVG9waWNOYW1lLmNoYXJBdCgwKSA9PT0gJy4nKSB7XG4gICAgICAgICAgICBzdWJUb3BpY05hbWUgPSBzdWJUb3BpY05hbWUuc3Vic3RyaW5nKDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN1YlRvcGljTmFtZSA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBBYnN0cmFjdE5hdkxlZnRMYXlvdXQuRklYRURfQ01EX1RPUElDX05BTUU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3ViVG9waWNOYW1lLmNoYXJBdChzdWJUb3BpY05hbWUubGVuZ3RoIC0gMSkgIT09ICcuJykge1xuICAgICAgICAgICAgc3ViVG9waWNOYW1lICs9ICcuJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBUT1BJQ19OQU1FX1BSRUZJWCArIHN1YlRvcGljTmFtZSArIEZJWEVEX0NNRF9TVUZGSVg7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRUb2dnbGVkQ21kVG9waWNOYW1lKHN1YlRvcGljTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHN1YlRvcGljTmFtZSA9PT0gbnVsbCB8fCB0eXBlb2Ygc3ViVG9waWNOYW1lID09PSAndW5kZWZpbmVkJyB8fCBzdWJUb3BpY05hbWUgPT09ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gQWJzdHJhY3ROYXZMZWZ0TGF5b3V0LlRPR0dMRURfQ01EX1RPUElDX05BTUU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3ViVG9waWNOYW1lLmNoYXJBdCgwKSA9PT0gJy4nKSB7XG4gICAgICAgICAgICBzdWJUb3BpY05hbWUgPSBzdWJUb3BpY05hbWUuc3Vic3RyaW5nKDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN1YlRvcGljTmFtZSA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBBYnN0cmFjdE5hdkxlZnRMYXlvdXQuVE9HR0xFRF9DTURfVE9QSUNfTkFNRTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdWJUb3BpY05hbWUuY2hhckF0KHN1YlRvcGljTmFtZS5sZW5ndGggLSAxKSAhPT0gJy4nKSB7XG4gICAgICAgICAgICBzdWJUb3BpY05hbWUgKz0gJy4nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFRPUElDX05BTUVfUFJFRklYICsgc3ViVG9waWNOYW1lICsgVE9HR0xFRF9DTURfU1VGRklYO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2ZpeGVkOiBib29sZWFuO1xuICAgIHByaXZhdGUgX3RvZ2dsZWQ6IGJvb2xlYW47XG5cbiAgICBwcm90ZWN0ZWQgcGhsb3hBcHBTZXJ2aWNlOiBQaGxveEFwcFNlcnZpY2U7XG4gICAgcHJvdGVjdGVkIGZpeGVkU3ViamVjdHM6IFN1YmplY3Q8YW55PltdO1xuICAgIHByb3RlY3RlZCB0b2dnbGVkU3ViamVjdHM6IFN1YmplY3Q8YW55PltdO1xuICAgIHByb3RlY3RlZCBzdWJUb3BpY05hbWU6IHN0cmluZztcblxuICAgIHByaXZhdGUgZ2V0IGFwcCgpOiBQaGxveEFwcCB7XG4gICAgICAgIGlmICh0aGlzLnBobG94QXBwU2VydmljZSA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5waGxveEFwcFNlcnZpY2UgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5waGxveEFwcFNlcnZpY2UuZ2V0SW5zdGFuY2UoKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihwaGxveEFwcFNlcnZpY2U6IFBobG94QXBwU2VydmljZSwgb2JzZXJ2YWJsZU1ncjogT2JzZXJ2YWJsZU1hbmFnZXIsIHN1YlRvcGljTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKEFic3RyYWN0TmF2TGVmdExheW91dC5TVUJfVE9QSUNfTkFNRSwgb2JzZXJ2YWJsZU1ncik7XG5cbiAgICAgICAgaWYgKHBobG94QXBwU2VydmljZSAhPT0gbnVsbCAmJiB0eXBlb2YgcGhsb3hBcHBTZXJ2aWNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5waGxveEFwcFNlcnZpY2UgPSBwaGxveEFwcFNlcnZpY2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vYnNlcnZhYmxlTWdyID0gb2JzZXJ2YWJsZU1ncjtcbiAgICAgICAgdGhpcy5zdWJUb3BpY05hbWUgPSBzdWJUb3BpY05hbWU7XG4gICAgICAgIHRoaXMuZml4ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2dnbGVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5maXhlZFN1YmplY3RzID0gW107XG4gICAgICAgIHRoaXMudG9nZ2xlZFN1YmplY3RzID0gW107XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaXhlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpeGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZml4ZWQobmV3Rml4ZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgbGV0IGNoYW5nZTogYm9vbGVhbiA9IHRoaXMuX2ZpeGVkICE9PSBuZXdGaXhlZDtcblxuICAgICAgICB0aGlzLl9maXhlZCA9IG5ld0ZpeGVkO1xuXG4gICAgICAgIGlmIChjaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMub25GaXhlZENoYW5nZSh0aGlzLl9maXhlZCk7XG5cbiAgICAgICAgICAgIC8vIEVtaXQgY2hhbmdlIGV2ZW50XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmZpeGVkU3ViamVjdHMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXhlZFN1YmplY3RzLmZvckVhY2goKG9ic3YsIGlkeCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBvYnN2Lm5leHQodGhpcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRvZ2dsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl90b2dnbGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgdG9nZ2xlZChuZXdUb2dnbGVkOiBib29sZWFuKSB7XG4gICAgICAgIGxldCBjaGFuZ2U6IGJvb2xlYW4gPSB0aGlzLl90b2dnbGVkICE9PSBuZXdUb2dnbGVkO1xuXG4gICAgICAgIHRoaXMuX3RvZ2dsZWQgPSBuZXdUb2dnbGVkO1xuXG4gICAgICAgIGlmIChjaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMub25Ub2dnbGVkQ2hhbmdlKHRoaXMuX3RvZ2dsZWQpO1xuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnRvZ2dsZWRTdWJqZWN0cykpIHtcbiAgICAgICAgICAgICAgICAvLyBFbWl0IGNoYW5nZSBldmVudFxuICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlZFN1YmplY3RzLmZvckVhY2goKG9ic3YsIGlkeCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBvYnN2Lm5leHQodGhpcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXROYXZMZWZ0RXZlbnRUb3BpY3MoZml4ZWRDaGFuZ2U6IHN0cmluZywgdG9nZ2xlZENoYW5nZWQ6IHN0cmluZywgZml4ZWRDbWQ6IHN0cmluZywgdG9nZ2xlZENtZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIC8vIENyZWF0ZSBjaGFuZ2UgZXZlbnQgb2JzZXJ2YWJsZSB0b3BpY3NcbiAgICAgICAgaWYgKGZpeGVkQ2hhbmdlICE9PSBudWxsICYmIHR5cGVvZiBmaXhlZENoYW5nZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aGlzLmZpeGVkU3ViamVjdHMucHVzaCh0aGlzLm9ic2VydmFibGVNZ3IuY3JlYXRlU3ViamVjdChmaXhlZENoYW5nZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2dnbGVkQ2hhbmdlZCAhPT0gbnVsbCAmJiB0eXBlb2YgdG9nZ2xlZENoYW5nZWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhpcy50b2dnbGVkU3ViamVjdHMucHVzaCh0aGlzLm9ic2VydmFibGVNZ3IuY3JlYXRlU3ViamVjdCh0b2dnbGVkQ2hhbmdlZCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3Vic2NyaWJlIG9uIENNRCB0b3BpY3NcbiAgICAgICAgaWYgKGZpeGVkQ21kICE9PSBudWxsICYmIHR5cGVvZiBmaXhlZENtZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aGlzLm9ic2VydmFibGVNZ3Iuc3Vic2NyaWJlKGZpeGVkQ21kLCAoZml4ZWQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpeGVkID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZml4ZWQgPSBmaXhlZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2dnbGVkQ21kICE9PSBudWxsICYmIHR5cGVvZiB0b2dnbGVkQ21kID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRoaXMub2JzZXJ2YWJsZU1nci5zdWJzY3JpYmUodG9nZ2xlZENtZCwgKHRvZ2dsZWQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIHRvZ2dsZWQgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVkID0gdG9nZ2xlZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgICAgIC8vIEluaXQgc3VwZXIgY2xhc3MgZXZlbnQgdG9waWNzXG4gICAgICAgIHRoaXMuaW5pdE5hdkxlZnRFdmVudFRvcGljcyhcbiAgICAgICAgICAgIEFic3RyYWN0TmF2TGVmdExheW91dC5GSVhFRF9DSEFOR0VfVE9QSUNfTkFNRSxcbiAgICAgICAgICAgIEFic3RyYWN0TmF2TGVmdExheW91dC5UT0dHTEVEX0NIQU5HRV9UT1BJQ19OQU1FLFxuICAgICAgICAgICAgQWJzdHJhY3ROYXZMZWZ0TGF5b3V0LkZJWEVEX0NNRF9UT1BJQ19OQU1FLFxuICAgICAgICAgICAgQWJzdHJhY3ROYXZMZWZ0TGF5b3V0LlRPR0dMRURfQ01EX1RPUElDX05BTUVcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGhpcy5zdWJUb3BpY05hbWUgIT09IG51bGwgJiYgdGhpcy5zdWJUb3BpY05hbWUgIT09ICcnIHx8IHR5cGVvZiB0aGlzLnN1YlRvcGljTmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIEluaXQgc3ViIHRvcGljIGV2ZW50IHRvcGljc1xuICAgICAgICAgICAgdGhpcy5pbml0TmF2TGVmdEV2ZW50VG9waWNzKFxuICAgICAgICAgICAgICAgIEFic3RyYWN0TmF2TGVmdExheW91dC5nZXRGaXhlZENoYW5nZVRvcGljTmFtZSh0aGlzLnN1YlRvcGljTmFtZSksXG4gICAgICAgICAgICAgICAgQWJzdHJhY3ROYXZMZWZ0TGF5b3V0LmdldFRvZ2dsZWRDaGFuZ2VUb3BpY05hbWUodGhpcy5zdWJUb3BpY05hbWUpLFxuICAgICAgICAgICAgICAgIEFic3RyYWN0TmF2TGVmdExheW91dC5nZXRGaXhlZENtZFRvcGljTmFtZSh0aGlzLnN1YlRvcGljTmFtZSksXG4gICAgICAgICAgICAgICAgQWJzdHJhY3ROYXZMZWZ0TGF5b3V0LmdldFRvZ2dsZWRDbWRUb3BpY05hbWUodGhpcy5zdWJUb3BpY05hbWUpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFwcGxpY2F0aW9uKCk6IFBobG94QXBwIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTdWJUb3BpY05hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ViVG9waWNOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0ZpeGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5maXhlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Rml4ZWQoZml4ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5maXhlZCA9IGZpeGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1RvZ2dsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvZ2dsZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFRvZ2dsZWQodG9nZ2xlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLnRvZ2dsZWQgPSB0b2dnbGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhYnN0cmFjdCBvbkZpeGVkQ2hhbmdlKGZpeGVkOiBib29sZWFuKTogdm9pZDtcblxuICAgIHB1YmxpYyBhYnN0cmFjdCBvblRvZ2dsZWRDaGFuZ2UodG9nZ2xlZDogYm9vbGVhbik6IHZvaWQ7XG5cbn1cbiJdfQ==