com.phloxui
Version:
PhloxUI Ng2+ Framework
485 lines (484 loc) • 40.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { EventEmitter } from '@angular/core';
import { LoaderStatus } from './LoaderStatus';
import { EventUtils } from '../share/utils/EventUtils';
import { PAUSE_EVENT, RESUME_EVENT, STOP_EVENT } from '../share/CustomEventType';
export class LoadProcessor {
/**
* @param {?=} continueOnReject
*/
constructor(continueOnReject) {
this.status = LoaderStatus.STOPPED;
this.processes = [];
this.processed = [];
this.disabled = false;
this.isFirstStarted = false;
this.successResult = {};
this.rejectResult = {};
this.processCompleteEvent = new EventEmitter();
this.processResolveEvent = new EventEmitter();
this.processRejectEvent = new EventEmitter();
this.taskStartEvent = new EventEmitter();
this.taskCompleteEvent = new EventEmitter();
this.taskResolveEvent = new EventEmitter();
this.taskRejectEvent = new EventEmitter();
this.pauseEvent = new EventEmitter();
this.resumeEvent = new EventEmitter();
this.startEvent = new EventEmitter();
this.stopEvent = new EventEmitter();
if (continueOnReject === null || typeof continueOnReject !== 'boolean') {
this.continueOnReject = true;
}
else {
this.continueOnReject = continueOnReject;
}
}
/**
* @param {?} type
* @param {?} success
* @param {?} error
* @return {?}
*/
getCustomEventObject(type, success, error) {
let /** @type {?} */ successCount = Object.keys(this.successResult).length;
let /** @type {?} */ errorCount = Object.keys(this.rejectResult).length;
let /** @type {?} */ totalCount = this.processes.length + this.processed.length;
let /** @type {?} */ percent = 0;
if (totalCount > 0) {
percent = this.processes.length * (100 / totalCount);
}
let /** @type {?} */ wrapData = {
success: success,
error: error,
percent: percent,
totalCount: totalCount,
processed: successCount + errorCount,
successCount: successCount,
errorCount: errorCount
};
let /** @type {?} */ ev = EventUtils.newCustomEvent(type, null, wrapData, null);
return ev;
}
/**
* @return {?}
*/
startNextProcess() {
if (this.processes.length > 0) {
let /** @type {?} */ firstProccess = this.processes[0];
let /** @type {?} */ processName = firstProccess.getName();
return firstProccess.start().then((result) => {
this.successResult[processName] = result;
// remove first & insert processed
this.remove(0);
this.processed.push(firstProccess);
return this.startNextProcess();
}, (rejResult) => {
this.rejectResult[processName] = rejResult;
// remove first & insert processed
this.remove(0);
this.processed.push(firstProccess);
if (this.continueOnReject) {
return this.startNextProcess();
}
return Promise.reject(rejResult);
});
}
return Promise.resolve();
}
/**
* @param {?} disabled
* @return {?}
*/
setDisabled(disabled) {
this.disabled = disabled;
if (this.processes !== null) {
for (let /** @type {?} */ process of this.processes) {
process.setDisabled(this.disabled);
}
}
}
/**
* @return {?}
*/
isDisabled() {
return this.disabled;
}
/**
* @return {?}
*/
getRunningProcess() {
for (let /** @type {?} */ loadProcess of this.processes) {
if (loadProcess.isRunning() || loadProcess.isPaused()) {
return loadProcess;
}
}
return null;
}
/**
* @return {?}
*/
getRunningPercent() {
let /** @type {?} */ runningProcess = this.getRunningProcess();
if (runningProcess !== null && runningProcess !== undefined) {
return runningProcess.getPercent();
}
return 0;
}
/**
* @return {?}
*/
getRunningTaskCount() {
let /** @type {?} */ runningProcess = this.getRunningProcess();
if (runningProcess !== null && runningProcess !== undefined) {
return runningProcess.getTaskCount();
}
return 0;
}
/**
* @param {?} process
* @return {?}
*/
addProcess(process) {
if (process !== null && process !== undefined) {
process.setContinueOnReject(this.continueOnReject);
process.getTaskRejectEvent().subscribe((event) => {
this.taskRejectEvent.emit(event);
});
process.getTaskResolveEvent().subscribe((event) => {
this.taskResolveEvent.emit(event);
});
process.getTaskCompleteEvent().subscribe((event) => {
this.taskCompleteEvent.emit(event);
});
process.getTaskStartEvent().subscribe((event) => {
this.taskStartEvent.emit(event);
});
this.processes.push(process);
}
return this;
}
/**
* @param {?} process
* @return {?}
*/
removeProcess(process) {
let /** @type {?} */ index = this.processes.indexOf(process);
return this.remove(index);
}
/**
* @param {?} index
* @return {?}
*/
remove(index) {
if (index < this.processes.length) {
this.processes.splice(index, 1);
}
return this;
}
/**
* @return {?}
*/
start() {
if (this.disabled) {
throw new Error('Process is disabled');
}
if (this.isFirstStarted) {
throw new Error('Process was started or has been process');
}
if (this.isStopped()) {
this.status = LoaderStatus.RUNNING;
this.isFirstStarted = true;
}
// promise start
return new Promise((resolve, reject) => {
this.startNextProcess().then((result) => {
resolve(this.successResult);
}, (rejectResult) => {
reject(this.rejectResult);
});
});
}
/**
* @return {?}
*/
pause() {
if (this.disabled) {
throw new Error('Process is disabled');
}
if (this.isRunning()) {
this.status = LoaderStatus.PAUSED;
}
let /** @type {?} */ ev = this.getCustomEventObject(PAUSE_EVENT, null, null);
this.pauseEvent.emit(ev);
let /** @type {?} */ runningProcess = this.getRunningProcess();
if (runningProcess !== null && runningProcess !== undefined) {
runningProcess.pause();
}
}
/**
* @return {?}
*/
resume() {
if (this.disabled) {
throw new Error('Process is disabled');
}
if (this.isPaused()) {
this.status = LoaderStatus.RUNNING;
}
let /** @type {?} */ ev = this.getCustomEventObject(RESUME_EVENT, null, null);
this.resumeEvent.emit(ev);
let /** @type {?} */ runningProcess = this.getRunningProcess();
if (runningProcess !== null && runningProcess !== undefined) {
runningProcess.resume();
}
}
/**
* @return {?}
*/
stop() {
if (this.disabled) {
throw new Error('Process is disabled');
}
if (this.isRunning() || this.isPaused()) {
this.status = LoaderStatus.STOPPED;
}
let /** @type {?} */ ev = this.getCustomEventObject(STOP_EVENT, null, null);
this.stopEvent.emit(ev);
let /** @type {?} */ runningProcess = this.getRunningProcess();
if (runningProcess !== null && runningProcess !== undefined) {
runningProcess.stop();
}
}
/**
* @return {?}
*/
getState() {
return this.status;
}
/**
* @return {?}
*/
isRunning() {
return this.status === LoaderStatus.RUNNING;
}
/**
* @return {?}
*/
isPaused() {
return this.status === LoaderStatus.PAUSED;
}
/**
* @return {?}
*/
isStopped() {
return this.status === LoaderStatus.STOPPED;
}
/**
* @return {?}
*/
getContinueOnReject() {
return this.continueOnReject;
}
/**
* @param {?} continueOnReject
* @return {?}
*/
setContinueOnReject(continueOnReject) {
if (this.isFirstStarted) {
throw new Error('Process was started or has been process');
}
this.continueOnReject = continueOnReject;
if (this.processes !== null && this.processes !== undefined) {
for (let /** @type {?} */ process of this.processes) {
process.setContinueOnReject(this.continueOnReject);
}
}
}
/**
* @return {?}
*/
getPauseEvent() {
return this.pauseEvent;
}
/**
* @param {?} pauseEvent
* @return {?}
*/
setPauseEvent(pauseEvent) {
this.pauseEvent = pauseEvent;
}
/**
* @return {?}
*/
getResumeEvent() {
return this.resumeEvent;
}
/**
* @param {?} resumeEvent
* @return {?}
*/
setResumeEvent(resumeEvent) {
this.resumeEvent = resumeEvent;
}
/**
* @return {?}
*/
getStartEvent() {
return this.startEvent;
}
/**
* @param {?} startEvent
* @return {?}
*/
setStartEvent(startEvent) {
this.startEvent = startEvent;
}
/**
* @return {?}
*/
getStopEvent() {
return this.stopEvent;
}
/**
* @param {?} stopEvent
* @return {?}
*/
setStopEvent(stopEvent) {
this.stopEvent = stopEvent;
}
/**
* @return {?}
*/
getProcessCompleteEvent() {
return this.processCompleteEvent;
}
/**
* @param {?} processCompleteEvent
* @return {?}
*/
setProcessCompleteEvent(processCompleteEvent) {
this.processCompleteEvent = processCompleteEvent;
}
/**
* @return {?}
*/
getProcessResolveEvent() {
return this.processResolveEvent;
}
/**
* @param {?} processResolveEvent
* @return {?}
*/
setProcessResolveEvent(processResolveEvent) {
this.processResolveEvent = processResolveEvent;
}
/**
* @return {?}
*/
getProcessRejectEvent() {
return this.processRejectEvent;
}
/**
* @param {?} processRejectEvent
* @return {?}
*/
setProcessRejectEvent(processRejectEvent) {
this.processRejectEvent = processRejectEvent;
}
/**
* @return {?}
*/
getTaskStartEvent() {
return this.taskStartEvent;
}
/**
* @param {?} taskStartEvent
* @return {?}
*/
setTaskStartEvent(taskStartEvent) {
this.taskStartEvent = taskStartEvent;
}
/**
* @return {?}
*/
getTaskCompleteEvent() {
return this.taskCompleteEvent;
}
/**
* @param {?} taskCompleteEvent
* @return {?}
*/
setTaskCompleteEvent(taskCompleteEvent) {
this.taskCompleteEvent = taskCompleteEvent;
}
/**
* @return {?}
*/
getTaskResolveEvent() {
return this.taskResolveEvent;
}
/**
* @param {?} taskResolveEvent
* @return {?}
*/
setTaskResolveEvent(taskResolveEvent) {
this.taskResolveEvent = taskResolveEvent;
}
/**
* @return {?}
*/
getTaskRejectEvent() {
return this.taskRejectEvent;
}
/**
* @param {?} taskRejectEvent
* @return {?}
*/
setTaskRejectEvent(taskRejectEvent) {
this.taskRejectEvent = taskRejectEvent;
}
}
function LoadProcessor_tsickle_Closure_declarations() {
/** @type {?} */
LoadProcessor.prototype.processes;
/** @type {?} */
LoadProcessor.prototype.processed;
/** @type {?} */
LoadProcessor.prototype.disabled;
/** @type {?} */
LoadProcessor.prototype.status;
/** @type {?} */
LoadProcessor.prototype.isFirstStarted;
/** @type {?} */
LoadProcessor.prototype.continueOnReject;
/** @type {?} */
LoadProcessor.prototype.successResult;
/** @type {?} */
LoadProcessor.prototype.rejectResult;
/** @type {?} */
LoadProcessor.prototype.processCompleteEvent;
/** @type {?} */
LoadProcessor.prototype.processResolveEvent;
/** @type {?} */
LoadProcessor.prototype.processRejectEvent;
/** @type {?} */
LoadProcessor.prototype.taskStartEvent;
/** @type {?} */
LoadProcessor.prototype.taskCompleteEvent;
/** @type {?} */
LoadProcessor.prototype.taskResolveEvent;
/** @type {?} */
LoadProcessor.prototype.taskRejectEvent;
/** @type {?} */
LoadProcessor.prototype.pauseEvent;
/** @type {?} */
LoadProcessor.prototype.resumeEvent;
/** @type {?} */
LoadProcessor.prototype.startEvent;
/** @type {?} */
LoadProcessor.prototype.stopEvent;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9hZFByb2Nlc3Nvci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9Mb2FkUHJvY2Vzc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUNMLFdBQVcsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUN0QyxNQUFNLDBCQUEwQixDQUFDO0FBRWxDLE1BQU07Ozs7SUF1QkosWUFBWSxnQkFBMEI7UUFDcEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDO1FBQ25DLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzVCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBRXZCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQy9DLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzdDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxZ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QW1DO1FBQzVELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQzs7Ozs7SUFHcEMsa0JBQWtCO1FBQ3ZCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDOzs7Ozs7SUFHdkIsa0JBQWtCLENBQUMsZUFBa0M7UUFDMUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7O0NBRTFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJTG9hZGVyIH0gZnJvbSAnLi9JTG9hZGVyJztcbmltcG9ydCB7IExvYWRlclN0YXR1cyB9IGZyb20gJy4vTG9hZGVyU3RhdHVzJztcbmltcG9ydCB7IExvYWRQcm9jZXNzIH0gZnJvbSAnLi9Mb2FkUHJvY2Vzcyc7XG5pbXBvcnQgeyBFdmVudFV0aWxzIH0gZnJvbSAnLi4vc2hhcmUvdXRpbHMvRXZlbnRVdGlscyc7XG5pbXBvcnQge1xuICBQQVVTRV9FVkVOVCwgUkVTVU1FX0VWRU5ULCBTVE9QX0VWRU5UXG59IGZyb20gJy4uL3NoYXJlL0N1c3RvbUV2ZW50VHlwZSc7XG5cbmV4cG9ydCBjbGFzcyBMb2FkUHJvY2Vzc29yIGltcGxlbWVudHMgSUxvYWRlciB7XG5cbiAgcHJpdmF0ZSBwcm9jZXNzZXM6IExvYWRQcm9jZXNzW107XG4gIHByaXZhdGUgcHJvY2Vzc2VkOiBMb2FkUHJvY2Vzc1tdO1xuICBwcml2YXRlIGRpc2FibGVkOiBib29sZWFuO1xuICBwcml2YXRlIHN0YXR1czogTG9hZGVyU3RhdHVzO1xuICBwcml2YXRlIGlzRmlyc3RTdGFydGVkOiBib29sZWFuO1xuICBwcml2YXRlIGNvbnRpbnVlT25SZWplY3Q6IGJvb2xlYW47XG4gIHByaXZhdGUgc3VjY2Vzc1Jlc3VsdDogYW55O1xuICBwcml2YXRlIHJlamVjdFJlc3VsdDogYW55O1xuICBwcml2YXRlIHByb2Nlc3NDb21wbGV0ZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgcHJpdmF0ZSBwcm9jZXNzUmVzb2x2ZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgcHJpdmF0ZSBwcm9jZXNzUmVqZWN0RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBwcml2YXRlIHRhc2tTdGFydEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgcHJpdmF0ZSB0YXNrQ29tcGxldGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIHByaXZhdGUgdGFza1Jlc29sdmVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIHByaXZhdGUgdGFza1JlamVjdEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgcHJpdmF0ZSBwYXVzZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgcHJpdmF0ZSByZXN1bWVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIHByaXZhdGUgc3RhcnRFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIHByaXZhdGUgc3RvcEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcblxuXG4gIGNvbnN0cnVjdG9yKGNvbnRpbnVlT25SZWplY3Q/OiBib29sZWFuKSB7XG4gICAgdGhpcy5zdGF0dXMgPSBMb2FkZXJTdGF0dXMuU1RPUFBFRDtcbiAgICB0aGlzLnByb2Nlc3NlcyA9IFtdO1xuICAgIHRoaXMucHJvY2Vzc2VkID0gW107XG4gICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMuaXNGaXJzdFN0YXJ0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnN1Y2Nlc3NSZXN1bHQgPSB7fTtcbiAgICB0aGlzLnJlamVjdFJlc3VsdCA9IHt9O1xuXG4gICAgdGhpcy5wcm9jZXNzQ29tcGxldGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLnByb2Nlc3NSZXNvbHZlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5wcm9jZXNzUmVqZWN0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy50YXNrU3RhcnRFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLnRhc2tDb21wbGV0ZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMudGFza1Jlc29sdmVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLnRhc2tSZWplY3RFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLnBhdXNlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5yZXN1bWVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLnN0YXJ0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5zdG9wRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBpZiAoY29udGludWVPblJlamVjdCA9PT0gbnVsbCB8fCB0eXBlb2YgY29udGludWVPblJlamVjdCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aGlzLmNvbnRpbnVlT25SZWplY3QgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRpbnVlT25SZWplY3QgPSBjb250aW51ZU9uUmVqZWN0O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3VzdG9tRXZlbnRPYmplY3QodHlwZTogYW55LCBzdWNjZXNzOiBhbnksIGVycm9yOiBhbnkpOiBhbnkge1xuICAgIGxldCBzdWNjZXNzQ291bnQgPSBPYmplY3Qua2V5cyh0aGlzLnN1Y2Nlc3NSZXN1bHQpLmxlbmd0aDtcbiAgICBsZXQgZXJyb3JDb3VudCA9IE9iamVjdC5rZXlzKHRoaXMucmVqZWN0UmVzdWx0KS5sZW5ndGg7XG4gICAgbGV0IHRvdGFsQ291bnQgPSB0aGlzLnByb2Nlc3Nlcy5sZW5ndGggKyB0aGlzLnByb2Nlc3NlZC5sZW5ndGg7XG4gICAgbGV0IHBlcmNlbnQgPSAwO1xuICAgIGlmICh0b3RhbENvdW50ID4gMCkge1xuICAgICAgcGVyY2VudCA9IHRoaXMucHJvY2Vzc2VzLmxlbmd0aCAqICgxMDAgLyB0b3RhbENvdW50KTtcbiAgICB9XG5cbiAgICBsZXQgd3JhcERhdGEgPSB7XG4gICAgICBzdWNjZXNzOiBzdWNjZXNzLFxuICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgcGVyY2VudDogcGVyY2VudCxcbiAgICAgIHRvdGFsQ291bnQ6IHRvdGFsQ291bnQsXG4gICAgICBwcm9jZXNzZWQ6IHN1Y2Nlc3NDb3VudCArIGVycm9yQ291bnQsXG4gICAgICBzdWNjZXNzQ291bnQ6IHN1Y2Nlc3NDb3VudCxcbiAgICAgIGVycm9yQ291bnQ6IGVycm9yQ291bnRcbiAgICB9O1xuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQodHlwZSwgbnVsbCwgd3JhcERhdGEsIG51bGwpO1xuXG4gICAgcmV0dXJuIGV2O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydE5leHRQcm9jZXNzKCk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMucHJvY2Vzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBmaXJzdFByb2NjZXNzID0gdGhpcy5wcm9jZXNzZXNbMF07XG4gICAgICBsZXQgcHJvY2Vzc05hbWUgPSBmaXJzdFByb2NjZXNzLmdldE5hbWUoKTtcblxuICAgICAgcmV0dXJuIGZpcnN0UHJvY2Nlc3Muc3RhcnQoKS50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnN1Y2Nlc3NSZXN1bHRbcHJvY2Vzc05hbWVdID0gcmVzdWx0O1xuXG4gICAgICAgIC8vIHJlbW92ZSBmaXJzdCAmIGluc2VydCBwcm9jZXNzZWRcbiAgICAgICAgdGhpcy5yZW1vdmUoMCk7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkLnB1c2goZmlyc3RQcm9jY2Vzcyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnROZXh0UHJvY2VzcygpO1xuICAgICAgfSwgKHJlalJlc3VsdDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMucmVqZWN0UmVzdWx0W3Byb2Nlc3NOYW1lXSA9IHJlalJlc3VsdDtcblxuICAgICAgICAvLyByZW1vdmUgZmlyc3QgJiBpbnNlcnQgcHJvY2Vzc2VkXG4gICAgICAgIHRoaXMucmVtb3ZlKDApO1xuICAgICAgICB0aGlzLnByb2Nlc3NlZC5wdXNoKGZpcnN0UHJvY2Nlc3MpO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbnRpbnVlT25SZWplY3QpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydE5leHRQcm9jZXNzKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVqUmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIC8vIGlmIGlzRGlzYWJsZSBhbGwgYWN0aW9uXG4gIHB1YmxpYyBzZXREaXNhYmxlZChkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcblxuICAgIGlmICh0aGlzLnByb2Nlc3NlcyAhPT0gbnVsbCkge1xuICAgICAgZm9yIChsZXQgcHJvY2VzcyBvZiB0aGlzLnByb2Nlc3Nlcykge1xuICAgICAgICBwcm9jZXNzLnNldERpc2FibGVkKHRoaXMuZGlzYWJsZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc0Rpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpc2FibGVkO1xuICB9XG5cbiAgcHVibGljIGdldFJ1bm5pbmdQcm9jZXNzKCk6IExvYWRQcm9jZXNzIHtcbiAgICBmb3IgKGxldCBsb2FkUHJvY2VzcyBvZiB0aGlzLnByb2Nlc3Nlcykge1xuICAgICAgaWYgKGxvYWRQcm9jZXNzLmlzUnVubmluZygpIHx8IGxvYWRQcm9jZXNzLmlzUGF1c2VkKCkpIHtcbiAgICAgICAgcmV0dXJuIGxvYWRQcm9jZXNzO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSdW5uaW5nUGVyY2VudCgpOiBudW1iZXIge1xuICAgIGxldCBydW5uaW5nUHJvY2VzcyA9IHRoaXMuZ2V0UnVubmluZ1Byb2Nlc3MoKTtcbiAgICBpZiAocnVubmluZ1Byb2Nlc3MgIT09IG51bGwgJiYgcnVubmluZ1Byb2Nlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHJ1bm5pbmdQcm9jZXNzLmdldFBlcmNlbnQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSdW5uaW5nVGFza0NvdW50KCk6IG51bWJlciB7XG4gICAgbGV0IHJ1bm5pbmdQcm9jZXNzID0gdGhpcy5nZXRSdW5uaW5nUHJvY2VzcygpO1xuICAgIGlmIChydW5uaW5nUHJvY2VzcyAhPT0gbnVsbCAmJiBydW5uaW5nUHJvY2VzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcnVubmluZ1Byb2Nlc3MuZ2V0VGFza0NvdW50KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBwdWJsaWMgYWRkUHJvY2Vzcyhwcm9jZXNzOiBMb2FkUHJvY2Vzcyk6IExvYWRQcm9jZXNzb3Ige1xuICAgIGlmIChwcm9jZXNzICE9PSBudWxsICYmIHByb2Nlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJvY2Vzcy5zZXRDb250aW51ZU9uUmVqZWN0KHRoaXMuY29udGludWVPblJlamVjdCk7XG4gICAgICBwcm9jZXNzLmdldFRhc2tSZWplY3RFdmVudCgpLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRhc2tSZWplY3RFdmVudC5lbWl0KGV2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgcHJvY2Vzcy5nZXRUYXNrUmVzb2x2ZUV2ZW50KCkuc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudGFza1Jlc29sdmVFdmVudC5lbWl0KGV2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgcHJvY2Vzcy5nZXRUYXNrQ29tcGxldGVFdmVudCgpLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRhc2tDb21wbGV0ZUV2ZW50LmVtaXQoZXZlbnQpO1xuICAgICAgfSk7XG4gICAgICBwcm9jZXNzLmdldFRhc2tTdGFydEV2ZW50KCkuc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudGFza1N0YXJ0RXZlbnQuZW1pdChldmVudCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5wcm9jZXNzZXMucHVzaChwcm9jZXNzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVQcm9jZXNzKHByb2Nlc3M6IExvYWRQcm9jZXNzKTogTG9hZFByb2Nlc3NvciB7XG4gICAgbGV0IGluZGV4ID0gdGhpcy5wcm9jZXNzZXMuaW5kZXhPZihwcm9jZXNzKTtcbiAgICByZXR1cm4gdGhpcy5yZW1vdmUoaW5kZXgpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZShpbmRleDogbnVtYmVyKTogTG9hZFByb2Nlc3NvciB7XG4gICAgaWYgKGluZGV4IDwgdGhpcy5wcm9jZXNzZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnByb2Nlc3Nlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIHN0YXJ0KCk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUHJvY2VzcyBpcyBkaXNhYmxlZCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzRmlyc3RTdGFydGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2Nlc3Mgd2FzIHN0YXJ0ZWQgb3IgaGFzIGJlZW4gcHJvY2VzcycpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzU3RvcHBlZCgpKSB7XG4gICAgICB0aGlzLnN0YXR1cyA9IExvYWRlclN0YXR1cy5SVU5OSU5HO1xuICAgICAgdGhpcy5pc0ZpcnN0U3RhcnRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gcHJvbWlzZSBzdGFydFxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnN0YXJ0TmV4dFByb2Nlc3MoKS50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICByZXNvbHZlKHRoaXMuc3VjY2Vzc1Jlc3VsdCk7XG4gICAgICB9LCAocmVqZWN0UmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgcmVqZWN0KHRoaXMucmVqZWN0UmVzdWx0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHBhdXNlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2Nlc3MgaXMgZGlzYWJsZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1J1bm5pbmcoKSkge1xuICAgICAgdGhpcy5zdGF0dXMgPSBMb2FkZXJTdGF0dXMuUEFVU0VEO1xuICAgIH1cblxuICAgIGxldCBldiA9IHRoaXMuZ2V0Q3VzdG9tRXZlbnRPYmplY3QoUEFVU0VfRVZFTlQsIG51bGwsIG51bGwpO1xuICAgIHRoaXMucGF1c2VFdmVudC5lbWl0KGV2KTtcblxuICAgIGxldCBydW5uaW5nUHJvY2VzcyA9IHRoaXMuZ2V0UnVubmluZ1Byb2Nlc3MoKTtcbiAgICBpZiAocnVubmluZ1Byb2Nlc3MgIT09IG51bGwgJiYgcnVubmluZ1Byb2Nlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcnVubmluZ1Byb2Nlc3MucGF1c2UoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVzdW1lKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2Nlc3MgaXMgZGlzYWJsZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1BhdXNlZCgpKSB7XG4gICAgICB0aGlzLnN0YXR1cyA9IExvYWRlclN0YXR1cy5SVU5OSU5HO1xuICAgIH1cblxuICAgIGxldCBldiA9IHRoaXMuZ2V0Q3VzdG9tRXZlbnRPYmplY3QoUkVTVU1FX0VWRU5ULCBudWxsLCBudWxsKTtcbiAgICB0aGlzLnJlc3VtZUV2ZW50LmVtaXQoZXYpO1xuXG4gICAgbGV0IHJ1bm5pbmdQcm9jZXNzID0gdGhpcy5nZXRSdW5uaW5nUHJvY2VzcygpO1xuICAgIGlmIChydW5uaW5nUHJvY2VzcyAhPT0gbnVsbCAmJiBydW5uaW5nUHJvY2VzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBydW5uaW5nUHJvY2Vzcy5yZXN1bWUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RvcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9jZXNzIGlzIGRpc2FibGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNSdW5uaW5nKCkgfHwgdGhpcy5pc1BhdXNlZCgpKSB7XG4gICAgICB0aGlzLnN0YXR1cyA9IExvYWRlclN0YXR1cy5TVE9QUEVEO1xuICAgIH1cblxuICAgIGxldCBldiA9IHRoaXMuZ2V0Q3VzdG9tRXZlbnRPYmplY3QoU1RPUF9FVkVOVCwgbnVsbCwgbnVsbCk7XG4gICAgdGhpcy5zdG9wRXZlbnQuZW1pdChldik7XG5cbiAgICBsZXQgcnVubmluZ1Byb2Nlc3MgPSB0aGlzLmdldFJ1bm5pbmdQcm9jZXNzKCk7XG4gICAgaWYgKHJ1bm5pbmdQcm9jZXNzICE9PSBudWxsICYmIHJ1bm5pbmdQcm9jZXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJ1bm5pbmdQcm9jZXNzLnN0b3AoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0U3RhdGUoKTogTG9hZGVyU3RhdHVzIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0dXM7XG4gIH1cblxuICBwdWJsaWMgaXNSdW5uaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gTG9hZGVyU3RhdHVzLlJVTk5JTkc7XG4gIH1cblxuICBwdWJsaWMgaXNQYXVzZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBMb2FkZXJTdGF0dXMuUEFVU0VEO1xuICB9XG5cbiAgcHVibGljIGlzU3RvcHBlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0dXMgPT09IExvYWRlclN0YXR1cy5TVE9QUEVEO1xuICB9XG5cbiAgcHVibGljIGdldENvbnRpbnVlT25SZWplY3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29udGludWVPblJlamVjdDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb250aW51ZU9uUmVqZWN0KGNvbnRpbnVlT25SZWplY3Q6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0ZpcnN0U3RhcnRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9jZXNzIHdhcyBzdGFydGVkIG9yIGhhcyBiZWVuIHByb2Nlc3MnKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRpbnVlT25SZWplY3QgPSBjb250aW51ZU9uUmVqZWN0O1xuXG4gICAgaWYgKHRoaXMucHJvY2Vzc2VzICE9PSBudWxsICYmIHRoaXMucHJvY2Vzc2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAobGV0IHByb2Nlc3Mgb2YgdGhpcy5wcm9jZXNzZXMpIHtcbiAgICAgICAgcHJvY2Vzcy5zZXRDb250aW51ZU9uUmVqZWN0KHRoaXMuY29udGludWVPblJlamVjdCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldFBhdXNlRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnBhdXNlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0UGF1c2VFdmVudChwYXVzZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMucGF1c2VFdmVudCA9IHBhdXNlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmVzdW1lRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnJlc3VtZUV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldFJlc3VtZUV2ZW50KHJlc3VtZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMucmVzdW1lRXZlbnQgPSByZXN1bWVFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdGFydEV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5zdGFydEV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldFN0YXJ0RXZlbnQoc3RhcnRFdmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLnN0YXJ0RXZlbnQgPSBzdGFydEV2ZW50O1xuICB9XG5cbiAgcHVibGljIGdldFN0b3BFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcEV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldFN0b3BFdmVudChzdG9wRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5zdG9wRXZlbnQgPSBzdG9wRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0UHJvY2Vzc0NvbXBsZXRlRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3NDb21wbGV0ZUV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldFByb2Nlc3NDb21wbGV0ZUV2ZW50KHByb2Nlc3NDb21wbGV0ZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMucHJvY2Vzc0NvbXBsZXRlRXZlbnQgPSBwcm9jZXNzQ29tcGxldGVFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQcm9jZXNzUmVzb2x2ZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVzb2x2ZUV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldFByb2Nlc3NSZXNvbHZlRXZlbnQocHJvY2Vzc1Jlc29sdmVFdmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLnByb2Nlc3NSZXNvbHZlRXZlbnQgPSBwcm9jZXNzUmVzb2x2ZUV2ZW50O1xuICB9XG5cbiAgcHVibGljIGdldFByb2Nlc3NSZWplY3RFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMucHJvY2Vzc1JlamVjdEV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldFByb2Nlc3NSZWplY3RFdmVudChwcm9jZXNzUmVqZWN0RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5wcm9jZXNzUmVqZWN0RXZlbnQgPSBwcm9jZXNzUmVqZWN0RXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0VGFza1N0YXJ0RXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnRhc2tTdGFydEV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldFRhc2tTdGFydEV2ZW50KHRhc2tTdGFydEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMudGFza1N0YXJ0RXZlbnQgPSB0YXNrU3RhcnRFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUYXNrQ29tcGxldGVFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMudGFza0NvbXBsZXRlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0VGFza0NvbXBsZXRlRXZlbnQodGFza0NvbXBsZXRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy50YXNrQ29tcGxldGVFdmVudCA9IHRhc2tDb21wbGV0ZUV2ZW50O1xuICB9XG5cbiAgcHVibGljIGdldFRhc2tSZXNvbHZlRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnRhc2tSZXNvbHZlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0VGFza1Jlc29sdmVFdmVudCh0YXNrUmVzb2x2ZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMudGFza1Jlc29sdmVFdmVudCA9IHRhc2tSZXNvbHZlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0VGFza1JlamVjdEV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy50YXNrUmVqZWN0RXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0VGFza1JlamVjdEV2ZW50KHRhc2tSZWplY3RFdmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLnRhc2tSZWplY3RFdmVudCA9IHRhc2tSZWplY3RFdmVudDtcbiAgfVxufVxuIl19