com.phloxui
Version:
PhloxUI Ng2+ Framework
416 lines (415 loc) • 34.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { EventEmitter } from '@angular/core';
import { ACTIVATE_EVENT, DEACTIVATE_EVENT, ENABLE_EVENT, DISABLE_EVENT } from '../share/CustomEventType';
import { AbstractHasOptions } from '../share/AbstractHasOptions';
import { Option } from '../decorator/Option.decorator';
import { EventUtils } from '../share/utils/EventUtils';
// unsupported: template constraints.
/**
* @abstract
* @template T
*/
export class AbstractAccordion extends AbstractHasOptions {
/**
* @param {?} elementRef
*/
constructor(elementRef) {
super();
this.elementRef = elementRef;
this.itemStatus = [];
this.fixedHeight = true;
this.autoInit = false;
this.multipleExpand = true;
this.activateEvent = new EventEmitter();
this.deactivateEvent = new EventEmitter();
this.enableEvent = new EventEmitter();
this.disableEvent = new EventEmitter();
}
/**
* @return {?}
*/
ngOnInit() {
this.setAccordionItems(this.items);
if (this.autoInit !== null && typeof this.autoInit !== 'undefined') {
if (this.autoInit) {
this.init();
}
}
}
/**
* @param {?} item
* @return {?}
*/
generateItemStatus(item) {
let /** @type {?} */ result = {
active: false,
enable: false
};
if (item !== null && typeof item !== 'undefined') {
result.active = item.active;
result.enable = item.enable;
}
return result;
}
/**
* @param {?} index
* @param {?=} exceptIndex
* @return {?}
*/
collapseItem(index, exceptIndex) {
if (index !== null && typeof index !== 'undefined') {
if (exceptIndex !== null && exceptIndex !== undefined) {
if (index === exceptIndex) {
return;
}
}
let /** @type {?} */ item = this.getAccordionItem(index);
if (item !== null) {
if (item.active) {
item.active = false;
// update status
let /** @type {?} */ status = this.itemStatus[index];
status.active = false;
}
this.onAccordionDeactived(index, item);
}
}
}
/**
* @param {?} index
* @return {?}
*/
activate(index) {
if (this.items !== null && typeof this.items !== 'undefined') {
let /** @type {?} */ item = this.getAccordionItem(index);
if (item !== null) {
if (!item.active) {
item.active = true;
// update status
let /** @type {?} */ status = this.itemStatus[index];
status.active = true;
if (!this.multipleExpand) {
this.collapseItemAllExceptIndex(index);
}
// emit event
let /** @type {?} */ data = {
item: item,
index: index
};
let /** @type {?} */ ev = EventUtils.newCustomEvent(ACTIVATE_EVENT, this, data, null);
this.activateEvent.emit(ev);
this.onAccordionActived(index, item);
return true;
}
}
}
return false;
}
/**
* @param {?} index
* @return {?}
*/
deactivate(index) {
if (this.items !== null && typeof this.items !== 'undefined') {
let /** @type {?} */ item = this.getAccordionItem(index);
if (item !== null) {
if (item.active) {
item.active = false;
// update status
let /** @type {?} */ status = this.itemStatus[index];
status.active = false;
// emit event
let /** @type {?} */ data = {
item: item,
index: index
};
let /** @type {?} */ ev = EventUtils.newCustomEvent(DEACTIVATE_EVENT, this, data, null);
this.deactivateEvent.emit(ev);
this.onAccordionDeactived(index, item);
return true;
}
}
}
return false;
}
/**
* @param {?} index
* @return {?}
*/
enable(index) {
if (this.items !== null && typeof this.items !== 'undefined') {
let /** @type {?} */ item = this.getAccordionItem(index);
if (item !== null) {
if (!item.enable) {
item.enable = true;
// update status
let /** @type {?} */ status = this.itemStatus[index];
status.enable = true;
// emit event
let /** @type {?} */ data = {
item: item,
index: index
};
let /** @type {?} */ ev = EventUtils.newCustomEvent(ENABLE_EVENT, this, data, null);
this.enableEvent.emit(ev);
this.onAccordionEnabled(index, item);
return true;
}
}
}
return false;
}
/**
* @param {?} index
* @return {?}
*/
disable(index) {
if (this.items !== null && typeof this.items !== 'undefined') {
let /** @type {?} */ item = this.getAccordionItem(index);
if (item !== null) {
if (item.enable) {
// auto call deactivate
this.deactivate(index);
item.enable = false;
// update status
let /** @type {?} */ status = this.itemStatus[index];
status.enable = false;
// emit event
let /** @type {?} */ data = {
item: item,
index: index
};
let /** @type {?} */ ev = EventUtils.newCustomEvent(DISABLE_EVENT, this, data, null);
this.disableEvent.emit(ev);
this.onAccordionDisabled(index, item);
return true;
}
}
}
return false;
}
/**
* @param {?} items
* @return {?}
*/
setAccordionItems(items) {
this.items = items;
this.itemStatus = [];
if (this.items !== null && typeof this.items !== 'undefined') {
for (let /** @type {?} */ item of this.items) {
// change status
if (!item.enable) {
item.active = false;
}
let /** @type {?} */ wrapItem = this.generateItemStatus(item);
this.itemStatus.push(wrapItem);
}
}
}
/**
* @return {?}
*/
getAccordionItems() {
return this.items;
}
/**
* @param {?} index
* @return {?}
*/
getAccordionItem(index) {
if (this.items !== null && typeof this.items !== 'undefined') {
if (index < this.items.length) {
let /** @type {?} */ item = this.items[index];
return item;
}
}
return null;
}
/**
* @param {?} index
* @return {?}
*/
isActive(index) {
if (index !== null && typeof index !== 'undefined') {
if (index < this.items.length) {
return this.items[index].active;
}
}
return false;
}
/**
* @param {?} index
* @return {?}
*/
isEnable(index) {
if (index !== null && typeof index !== 'undefined') {
if (index < this.items.length) {
return this.items[index].enable;
}
}
return false;
}
/**
* @param {?} item
* @return {?}
*/
getAccordionIndex(item) {
if (item !== null && item !== undefined) {
let /** @type {?} */ items = this.getAccordionItems();
return items.indexOf(item);
}
return -1;
}
/**
* @param {?=} exceptIndex
* @return {?}
*/
collapseItemAllExceptIndex(exceptIndex) {
let /** @type {?} */ items = this.getAccordionItems();
if (items !== null && items !== undefined) {
for (let /** @type {?} */ item of this.items) {
let /** @type {?} */ index = this.getAccordionIndex(item);
this.collapseItem(index, exceptIndex);
}
}
}
/**
* @return {?}
*/
isFixedHeight() {
if (this.fixedHeight === null || typeof this.fixedHeight === 'undefined') {
return false;
}
return this.fixedHeight;
}
/**
* @param {?} isFixed
* @return {?}
*/
setFixedHeight(isFixed) {
this.fixedHeight = isFixed;
}
/**
* @return {?}
*/
getActivateEvent() {
return this.activateEvent;
}
/**
* @return {?}
*/
getDeactivateEvent() {
return this.deactivateEvent;
}
/**
* @return {?}
*/
getEnableEvent() {
return this.enableEvent;
}
/**
* @return {?}
*/
getDisableEvent() {
return this.disableEvent;
}
/**
* @param {?} isAutoInit
* @return {?}
*/
setAutoInit(isAutoInit) {
this.autoInit = isAutoInit;
}
/**
* @return {?}
*/
isAutoInit() {
return this.autoInit;
}
}
tslib_1.__decorate([
Option('activate'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractAccordion.prototype, "activateEvent", void 0);
tslib_1.__decorate([
Option('deactivate'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractAccordion.prototype, "deactivateEvent", void 0);
tslib_1.__decorate([
Option('enable'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractAccordion.prototype, "enableEvent", void 0);
tslib_1.__decorate([
Option('disable'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractAccordion.prototype, "disableEvent", void 0);
function AbstractAccordion_tsickle_Closure_declarations() {
/** @type {?} */
AbstractAccordion.prototype.itemStatus;
/** @type {?} */
AbstractAccordion.prototype.items;
/** @type {?} */
AbstractAccordion.prototype.fixedHeight;
/** @type {?} */
AbstractAccordion.prototype.activateEvent;
/** @type {?} */
AbstractAccordion.prototype.deactivateEvent;
/** @type {?} */
AbstractAccordion.prototype.enableEvent;
/** @type {?} */
AbstractAccordion.prototype.disableEvent;
/** @type {?} */
AbstractAccordion.prototype.elementRef;
/** @type {?} */
AbstractAccordion.prototype.autoInit;
/** @type {?} */
AbstractAccordion.prototype.multipleExpand;
/**
* @abstract
* @return {?}
*/
AbstractAccordion.prototype.init = function () { };
/**
* @abstract
* @param {?} index
* @param {?} item
* @return {?}
*/
AbstractAccordion.prototype.onAccordionActived = function (index, item) { };
/**
* @abstract
* @param {?} index
* @param {?} item
* @return {?}
*/
AbstractAccordion.prototype.onAccordionDeactived = function (index, item) { };
/**
* @abstract
* @param {?} index
* @param {?} item
* @return {?}
*/
AbstractAccordion.prototype.onAccordionEnabled = function (index, item) { };
/**
* @abstract
* @param {?} index
* @param {?} item
* @return {?}
*/
AbstractAccordion.prototype.onAccordionDisabled = function (index, item) { };
/**
* @abstract
* @return {?}
*/
AbstractAccordion.prototype.reload = function () { };
/**
* @abstract
* @return {?}
*/
AbstractAccordion.prototype.reRender = function () { };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RBY2NvcmRpb24uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvQWJzdHJhY3RBY2NvcmRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQVUsWUFBWSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBRWpFLE9BQU8sRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7OztBQUV2RCxNQUFNLHdCQUFnRSxTQUFRLGtCQUFrQjs7OztJQWlCOUYsWUFBWSxVQUFzQjtRQUNoQyxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztLQUN4Qzs7OztJQUVNLFFBQVE7UUFDYixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUss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QyxJQUFJLENBQUMsV0FBVyxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxXQUFXLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztZQUN6RSxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ2Q7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQzs7Ozs7O0lBR25CLGNBQWMsQ0FBQyxPQUFnQjtRQUNwQyxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQzs7Ozs7SUFHdEIsZ0JBQWdCO1FBQ3JCLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDOzs7OztJQUdyQixrQkFBa0I7UUFDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7Ozs7O0lBR3ZCLGNBQWM7UUFDbkIsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7Ozs7O0lBR25CLGVBQWU7UUFDcEIsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7Ozs7OztJQUdwQixXQUFXLENBQUMsVUFBZTtRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQzs7Ozs7SUFHdEIsVUFBVTtRQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDOztDQWdCeEI7O0lBaFRFLE1BQU0sQ0FBQyxVQUFVLENBQUM7c0NBQ00sWUFBWTs7O0lBQ3BDLE1BQU0sQ0FBQyxZQUFZLENBQUM7c0NBQ00sWUFBWTs7O0lBQ3RDLE1BQU0sQ0FBQyxRQUFRLENBQUM7c0NBQ00sWUFBWTs7O0lBQ2xDLE1BQU0sQ0FBQyxTQUFTLENBQUM7c0NBQ00sWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9uSW5pdCwgRXZlbnRFbWl0dGVyLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY2NvcmRpb25JdGVtTW9kZWwgfSBmcm9tICcuL21vZGVsL0FjY29yZGlvbkl0ZW1Nb2RlbCc7XG5pbXBvcnQgeyBBQ1RJVkFURV9FVkVOVCwgREVBQ1RJVkFURV9FVkVOVCwgRU5BQkxFX0VWRU5ULCBESVNBQkxFX0VWRU5UIH0gZnJvbSAnLi4vc2hhcmUvQ3VzdG9tRXZlbnRUeXBlJztcbmltcG9ydCB7IEFic3RyYWN0SGFzT3B0aW9ucyB9IGZyb20gJy4uL3NoYXJlL0Fic3RyYWN0SGFzT3B0aW9ucyc7XG5pbXBvcnQgeyBPcHRpb24gfSBmcm9tICcuLi9kZWNvcmF0b3IvT3B0aW9uLmRlY29yYXRvcic7XG5pbXBvcnQgeyBFdmVudFV0aWxzIH0gZnJvbSAnLi4vc2hhcmUvdXRpbHMvRXZlbnRVdGlscyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFjY29yZGlvbjxUIGV4dGVuZHMgQWNjb3JkaW9uSXRlbU1vZGVsPiBleHRlbmRzIEFic3RyYWN0SGFzT3B0aW9ucyBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgcHJpdmF0ZSBpdGVtU3RhdHVzOiBhbnlbXTtcbiAgcHJvdGVjdGVkIGl0ZW1zOiBUW107XG4gIHByb3RlY3RlZCBmaXhlZEhlaWdodDogYm9vbGVhbjsgLy8gbW9kZSB0byBmaXhIZWlnaHQgb3Igbm90XG4gIEBPcHRpb24oJ2FjdGl2YXRlJylcbiAgcHJvdGVjdGVkIGFjdGl2YXRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdkZWFjdGl2YXRlJylcbiAgcHJvdGVjdGVkIGRlYWN0aXZhdGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2VuYWJsZScpXG4gIHByb3RlY3RlZCBlbmFibGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2Rpc2FibGUnKVxuICBwcm90ZWN0ZWQgZGlzYWJsZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgcHJvdGVjdGVkIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XG4gIHByb3RlY3RlZCBhdXRvSW5pdDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIG11bHRpcGxlRXhwYW5kOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZWxlbWVudFJlZiA9IGVsZW1lbnRSZWY7XG4gICAgdGhpcy5pdGVtU3RhdHVzID0gW107XG4gICAgdGhpcy5maXhlZEhlaWdodCA9IHRydWU7XG4gICAgdGhpcy5hdXRvSW5pdCA9IGZhbHNlO1xuICAgIHRoaXMubXVsdGlwbGVFeHBhbmQgPSB0cnVlO1xuICAgIHRoaXMuYWN0aXZhdGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmRlYWN0aXZhdGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmVuYWJsZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuZGlzYWJsZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0QWNjb3JkaW9uSXRlbXModGhpcy5pdGVtcyk7XG4gICAgaWYgKHRoaXMuYXV0b0luaXQgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuYXV0b0luaXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodGhpcy5hdXRvSW5pdCkge1xuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlSXRlbVN0YXR1cyhpdGVtOiBUKTogYW55IHtcbiAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgIGVuYWJsZTogZmFsc2VcbiAgICB9O1xuXG4gICAgaWYgKGl0ZW0gIT09IG51bGwgJiYgdHlwZW9mIGl0ZW0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXN1bHQuYWN0aXZlID0gaXRlbS5hY3RpdmU7XG4gICAgICByZXN1bHQuZW5hYmxlID0gaXRlbS5lbmFibGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgY29sbGFwc2VJdGVtKGluZGV4OiBudW1iZXIsIGV4Y2VwdEluZGV4PzogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGluZGV4ICE9PSBudWxsICYmIHR5cGVvZiBpbmRleCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChleGNlcHRJbmRleCAhPT0gbnVsbCAmJiBleGNlcHRJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gZXhjZXB0SW5kZXgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IGl0ZW0gPSB0aGlzLmdldEFjY29yZGlvbkl0ZW0oaW5kZXgpO1xuXG4gICAgICBpZiAoaXRlbSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoaXRlbS5hY3RpdmUpIHtcbiAgICAgICAgICBpdGVtLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgIC8vIHVwZGF0ZSBzdGF0dXNcbiAgICAgICAgICBsZXQgc3RhdHVzID0gdGhpcy5pdGVtU3RhdHVzW2luZGV4XTtcbiAgICAgICAgICBzdGF0dXMuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9uQWNjb3JkaW9uRGVhY3RpdmVkKGluZGV4LCBpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYWN0aXZhdGUoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLml0ZW1zICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLml0ZW1zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgbGV0IGl0ZW0gPSB0aGlzLmdldEFjY29yZGlvbkl0ZW0oaW5kZXgpO1xuICAgICAgaWYgKGl0ZW0gIT09IG51bGwpIHtcbiAgICAgICAgaWYgKCFpdGVtLmFjdGl2ZSkge1xuICAgICAgICAgIGl0ZW0uYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAvLyB1cGRhdGUgc3RhdHVzXG4gICAgICAgICAgbGV0IHN0YXR1cyA9IHRoaXMuaXRlbVN0YXR1c1tpbmRleF07XG4gICAgICAgICAgc3RhdHVzLmFjdGl2ZSA9IHRydWU7XG5cbiAgICAgICAgICBpZighdGhpcy5tdWx0aXBsZUV4cGFuZCl7XG4gICAgICAgICAgICB0aGlzLmNvbGxhcHNlSXRlbUFsbEV4Y2VwdEluZGV4KGluZGV4KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBlbWl0IGV2ZW50XG4gICAgICAgICAgbGV0IGRhdGE6IGFueSA9IHtcbiAgICAgICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgICAgICBpbmRleDogaW5kZXhcbiAgICAgICAgICB9O1xuICAgICAgICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQUNUSVZBVEVfRVZFTlQsIHRoaXMsIGRhdGEsIG51bGwpO1xuXG4gICAgICAgICAgdGhpcy5hY3RpdmF0ZUV2ZW50LmVtaXQoZXYpO1xuICAgICAgICAgIHRoaXMub25BY2NvcmRpb25BY3RpdmVkKGluZGV4LCBpdGVtKTtcblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBkZWFjdGl2YXRlKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pdGVtcyAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5pdGVtcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxldCBpdGVtID0gdGhpcy5nZXRBY2NvcmRpb25JdGVtKGluZGV4KTtcbiAgICAgIGlmIChpdGVtICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChpdGVtLmFjdGl2ZSkge1xuICAgICAgICAgIGl0ZW0uYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgLy8gdXBkYXRlIHN0YXR1c1xuICAgICAgICAgIGxldCBzdGF0dXMgPSB0aGlzLml0ZW1TdGF0dXNbaW5kZXhdO1xuICAgICAgICAgIHN0YXR1cy5hY3RpdmUgPSBmYWxzZTtcblxuICAgICAgICAgIC8vIGVtaXQgZXZlbnRcbiAgICAgICAgICBsZXQgZGF0YTogYW55ID0ge1xuICAgICAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgICAgIGluZGV4OiBpbmRleFxuICAgICAgICAgIH07XG4gICAgICAgICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChERUFDVElWQVRFX0VWRU5ULCB0aGlzLCBkYXRhLCBudWxsKTtcblxuICAgICAgICAgIHRoaXMuZGVhY3RpdmF0ZUV2ZW50LmVtaXQoZXYpO1xuICAgICAgICAgIHRoaXMub25BY2NvcmRpb25EZWFjdGl2ZWQoaW5kZXgsIGl0ZW0pO1xuXG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGVuYWJsZShpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXRlbXMgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuaXRlbXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsZXQgaXRlbSA9IHRoaXMuZ2V0QWNjb3JkaW9uSXRlbShpbmRleCk7XG4gICAgICBpZiAoaXRlbSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoIWl0ZW0uZW5hYmxlKSB7XG4gICAgICAgICAgaXRlbS5lbmFibGUgPSB0cnVlO1xuICAgICAgICAgIC8vIHVwZGF0ZSBzdGF0dXNcbiAgICAgICAgICBsZXQgc3RhdHVzID0gdGhpcy5pdGVtU3RhdHVzW2luZGV4XTtcbiAgICAgICAgICBzdGF0dXMuZW5hYmxlID0gdHJ1ZTtcblxuICAgICAgICAgIC8vIGVtaXQgZXZlbnRcbiAgICAgICAgICBsZXQgZGF0YTogYW55ID0ge1xuICAgICAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgICAgIGluZGV4OiBpbmRleFxuICAgICAgICAgIH07XG4gICAgICAgICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChFTkFCTEVfRVZFTlQsIHRoaXMsIGRhdGEsIG51bGwpO1xuXG4gICAgICAgICAgdGhpcy5lbmFibGVFdmVudC5lbWl0KGV2KTtcbiAgICAgICAgICB0aGlzLm9uQWNjb3JkaW9uRW5hYmxlZChpbmRleCwgaXRlbSk7XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgZGlzYWJsZShpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXRlbXMgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuaXRlbXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsZXQgaXRlbSA9IHRoaXMuZ2V0QWNjb3JkaW9uSXRlbShpbmRleCk7XG4gICAgICBpZiAoaXRlbSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoaXRlbS5lbmFibGUpIHtcbiAgICAgICAgICAvLyBhdXRvIGNhbGwgZGVhY3RpdmF0ZVxuICAgICAgICAgIHRoaXMuZGVhY3RpdmF0ZShpbmRleCk7XG5cbiAgICAgICAgICBpdGVtLmVuYWJsZSA9IGZhbHNlO1xuICAgICAgICAgIC8vIHVwZGF0ZSBzdGF0dXNcbiAgICAgICAgICBsZXQgc3RhdHVzID0gdGhpcy5pdGVtU3RhdHVzW2luZGV4XTtcbiAgICAgICAgICBzdGF0dXMuZW5hYmxlID0gZmFsc2U7XG5cbiAgICAgICAgICAvLyBlbWl0IGV2ZW50XG4gICAgICAgICAgbGV0IGRhdGE6IGFueSA9IHtcbiAgICAgICAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICAgICAgICBpbmRleDogaW5kZXhcbiAgICAgICAgICB9O1xuICAgICAgICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoRElTQUJMRV9FVkVOVCwgdGhpcywgZGF0YSwgbnVsbCk7XG5cbiAgICAgICAgICB0aGlzLmRpc2FibGVFdmVudC5lbWl0KGV2KTtcbiAgICAgICAgICB0aGlzLm9uQWNjb3JkaW9uRGlzYWJsZWQoaW5kZXgsIGl0ZW0pO1xuXG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHNldEFjY29yZGlvbkl0ZW1zKGl0ZW1zOiBUW10pOiB2b2lkIHtcbiAgICB0aGlzLml0ZW1zID0gaXRlbXM7XG4gICAgdGhpcy5pdGVtU3RhdHVzID0gW107XG5cbiAgICBpZiAodGhpcy5pdGVtcyAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5pdGVtcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGZvciAobGV0IGl0ZW0gb2YgdGhpcy5pdGVtcykge1xuICAgICAgICAvLyBjaGFuZ2Ugc3RhdHVzXG4gICAgICAgIGlmICghaXRlbS5lbmFibGUpIHtcbiAgICAgICAgICBpdGVtLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCB3cmFwSXRlbSA9IHRoaXMuZ2VuZXJhdGVJdGVtU3RhdHVzKGl0ZW0pO1xuICAgICAgICB0aGlzLml0ZW1TdGF0dXMucHVzaCh3cmFwSXRlbSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldEFjY29yZGlvbkl0ZW1zKCk6IFRbXSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWNjb3JkaW9uSXRlbShpbmRleDogbnVtYmVyKTogVCB7XG4gICAgaWYgKHRoaXMuaXRlbXMgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuaXRlbXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAoaW5kZXggPCB0aGlzLml0ZW1zLmxlbmd0aCkge1xuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuaXRlbXNbaW5kZXhdO1xuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgaXNBY3RpdmUoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmIChpbmRleCAhPT0gbnVsbCAmJiB0eXBlb2YgaW5kZXggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAoaW5kZXggPCB0aGlzLml0ZW1zLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtc1tpbmRleF0uYWN0aXZlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgaXNFbmFibGUoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmIChpbmRleCAhPT0gbnVsbCAmJiB0eXBlb2YgaW5kZXggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAoaW5kZXggPCB0aGlzLml0ZW1zLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtc1tpbmRleF0uZW5hYmxlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWNjb3JkaW9uSW5kZXgoaXRlbTogYW55KTogbnVtYmVyIHtcbiAgICBpZiAoaXRlbSAhPT0gbnVsbCAmJiBpdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGxldCBpdGVtczogYW55W10gPSB0aGlzLmdldEFjY29yZGlvbkl0ZW1zKCk7XG5cbiAgICAgIHJldHVybiBpdGVtcy5pbmRleE9mKGl0ZW0pO1xuICAgIH1cblxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIHB1YmxpYyBjb2xsYXBzZUl0ZW1BbGxFeGNlcHRJbmRleChleGNlcHRJbmRleD86IG51bWJlcik6IHZvaWQge1xuICAgIGxldCBpdGVtczogYW55W10gPSB0aGlzLmdldEFjY29yZGlvbkl0ZW1zKCk7XG5cbiAgICBpZiAoaXRlbXMgIT09IG51bGwgJiYgaXRlbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChsZXQgaXRlbSBvZiB0aGlzLml0ZW1zKSB7XG4gICAgICAgIGxldCBpbmRleDogbnVtYmVyID0gdGhpcy5nZXRBY2NvcmRpb25JbmRleChpdGVtKTtcblxuICAgICAgICB0aGlzLmNvbGxhcHNlSXRlbShpbmRleCwgZXhjZXB0SW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc0ZpeGVkSGVpZ2h0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmZpeGVkSGVpZ2h0ID09PSBudWxsIHx8IHR5cGVvZiB0aGlzLmZpeGVkSGVpZ2h0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maXhlZEhlaWdodDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRGaXhlZEhlaWdodChpc0ZpeGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5maXhlZEhlaWdodCA9IGlzRml4ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWN0aXZhdGVFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZhdGVFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXREZWFjdGl2YXRlRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmRlYWN0aXZhdGVFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRFbmFibGVFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZW5hYmxlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGlzYWJsZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0QXV0b0luaXQoaXNBdXRvSW5pdDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5hdXRvSW5pdCA9IGlzQXV0b0luaXQ7XG4gIH1cblxuICBwdWJsaWMgaXNBdXRvSW5pdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hdXRvSW5pdDtcbiAgfVxuXG4gIHB1YmxpYyBhYnN0cmFjdCBpbml0KCk6IHZvaWQ7XG5cbiAgcHVibGljIGFic3RyYWN0IG9uQWNjb3JkaW9uQWN0aXZlZChpbmRleDogbnVtYmVyLCBpdGVtOiBUKTogdm9pZDtcblxuICBwdWJsaWMgYWJzdHJhY3Qgb25BY2NvcmRpb25EZWFjdGl2ZWQoaW5kZXg6IG51bWJlciwgaXRlbTogVCk6IHZvaWQ7XG5cbiAgcHVibGljIGFic3RyYWN0IG9uQWNjb3JkaW9uRW5hYmxlZChpbmRleDogbnVtYmVyLCBpdGVtOiBUKTogdm9pZDtcblxuICBwdWJsaWMgYWJzdHJhY3Qgb25BY2NvcmRpb25EaXNhYmxlZChpbmRleDogbnVtYmVyLCBpdGVtOiBUKTogdm9pZDtcblxuICBwdWJsaWMgYWJzdHJhY3QgcmVsb2FkKCk6IHZvaWQ7XG5cbiAgcHVibGljIGFic3RyYWN0IHJlUmVuZGVyKCk6IHZvaWQ7XG59XG4iXX0=