angular-material-datatransfer-lib
Version:
A HTML5 datatransfer UI for handling upload and download of multiple simultaneous files.
818 lines • 61.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/facades/datatransfer.facade.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ConfigService } from '../services/config.service';
import { TransferStatus } from '../enums/transfer-status.enum';
import { TransferType } from '../enums/transfer-type.enum';
import { BrowseDialogComponent } from '../components/browse-dialog.component';
import { EditDialogComponent } from '../components/edit-dialog.component';
import { CustomEventType, CustomEventTypeExtensions } from '../enums/custom-event-type.enum';
var DatatransferFacade = /** @class */ (function () {
function DatatransferFacade(logger, zone, store, dateUtil, paginationService, exportService, uploader, downloader, dialog) {
this.logger = logger;
this.zone = zone;
this.store = store;
this.dateUtil = dateUtil;
this.paginationService = paginationService;
this.exportService = exportService;
this.uploader = uploader;
this.downloader = downloader;
this.dialog = dialog;
// Interval in milliseconds to calculate progress:
this.progressInterval = 200;
// Interval in milliseconds to calculate bitrate:
this.bitrateInterval = 1000;
this.uploadProgress = this.store.uploadProgress;
this.downloadProgress = this.store.downloadProgress;
this.init(this.uploader, this.uploadProgress);
this.init(this.downloader, this.downloadProgress);
}
/**
* @private
* @param {?} datatransfer
* @param {?} progressContainer
* @return {?}
*/
DatatransferFacade.prototype.init = /**
* @private
* @param {?} datatransfer
* @param {?} progressContainer
* @return {?}
*/
function (datatransfer, progressContainer) {
datatransfer.on('itemAdded', (/**
* @param {?} item
* @return {?}
*/
function (item) {
/** @type {?} */
var that = (/** @type {?} */ (this));
that.zone.run((/**
* @return {?}
*/
function () {
that.addItem(item);
}));
}).bind(this));
datatransfer.on('zoneUpdated', (/**
* @param {?} item
* @param {?} status
* @param {?=} message
* @return {?}
*/
function (item, status, message) {
/** @type {?} */
var that = (/** @type {?} */ (this));
that.zone.run((/**
* @return {?}
*/
function () {
// console.log(that.uploader.isWorking());
}));
}).bind(this));
datatransfer.on('itemStatusChanged', (/**
* @param {?} item
* @param {?} status
* @param {?=} message
* @return {?}
*/
function (item, status, message) {
/** @type {?} */
var that = (/** @type {?} */ (this));
that.zone.run((/**
* @return {?}
*/
function () {
that.changeItemStatus(item, status, message);
}));
}).bind(this));
datatransfer.on('itemProgressUpdated', (/**
* @param {?} item
* @param {?} progress
* @return {?}
*/
function (item, progress) {
/** @type {?} */
var that = (/** @type {?} */ (this));
that.zone.run((/**
* @return {?}
*/
function () {
that.updateItemProgress(item, progress);
}));
}).bind(this));
datatransfer.on('overallProgressUpdated', (/**
* @param {?} transferType
* @param {?} progress
* @return {?}
*/
function (transferType, progress) {
/** @type {?} */
var that = (/** @type {?} */ (this));
that.zone.run((/**
* @return {?}
*/
function () {
that.updateOverallProgress(progressContainer, transferType, progress);
}));
}).bind(this));
datatransfer.on('overallSizeUpdated', (/**
* @param {?} size
* @return {?}
*/
function (size) {
/** @type {?} */
var that = (/** @type {?} */ (this));
that.zone.run((/**
* @return {?}
*/
function () {
that.updateOverallSize(progressContainer, size);
}));
}).bind(this));
};
/**
* @param {?} element
* @param {?=} isDirectory
* @return {?}
*/
DatatransferFacade.prototype.assignUploadBrowse = /**
* @param {?} element
* @param {?=} isDirectory
* @return {?}
*/
function (element, isDirectory) {
if (isDirectory === void 0) { isDirectory = false; }
this.uploader.assignBrowse(element, isDirectory);
};
/**
* @param {?} element
* @return {?}
*/
DatatransferFacade.prototype.assignUploadDrop = /**
* @param {?} element
* @return {?}
*/
function (element) {
this.uploader.assignDrop(element);
};
/**
* @return {?}
*/
DatatransferFacade.prototype.openBrowseDialog = /**
* @return {?}
*/
function () {
/** @type {?} */
var dialogRef = this.dialog.open(BrowseDialogComponent, {
data: {
datatransferFacade: this
}
});
};
/**
* @param {?} item
* @return {?}
*/
DatatransferFacade.prototype.openEditPathDialog = /**
* @param {?} item
* @return {?}
*/
function (item) {
/** @type {?} */
var dialogRef = this.dialog.open(EditDialogComponent, {
data: {
datatransferFacade: this,
mode: 'edit-path',
item: item
}
});
};
/**
* @param {?} item
* @return {?}
*/
DatatransferFacade.prototype.openEditFilenameDialog = /**
* @param {?} item
* @return {?}
*/
function (item) {
/** @type {?} */
var dialogRef = this.dialog.open(EditDialogComponent, {
data: {
datatransferFacade: this,
mode: 'edit-filename',
item: item
}
});
};
/**
* @param {?} checked
* @return {?}
*/
DatatransferFacade.prototype.toggleVisible = /**
* @param {?} checked
* @return {?}
*/
function (checked) {
this.paginationService.paginatedItems.forEach((/**
* @param {?} item
* @param {?} index
* @return {?}
*/
function (item, index) {
item.isSelected = checked;
}));
};
/**
* @return {?}
*/
DatatransferFacade.prototype.startAll = /**
* @return {?}
*/
function () {
var _this = this;
this.store.getItems().forEach((/**
* @param {?} item
* @param {?} index
* @return {?}
*/
function (item, index) {
/** @type {?} */
var that = (/** @type {?} */ (_this));
if (item.transferType === TransferType.Upload && item.status === TransferStatus.Ready) {
that.changeItemStatus(item, TransferStatus.Queued);
}
}));
this.uploader.startAll();
};
/**
* @return {?}
*/
DatatransferFacade.prototype.pauseAll = /**
* @return {?}
*/
function () {
this.store.getItems().forEach((/**
* @param {?} item
* @param {?} index
* @return {?}
*/
function (item, index) {
item.preprocessContainer.pause(true);
}));
this.uploader.pauseAll();
this.downloader.pauseAll();
};
/**
* @return {?}
*/
DatatransferFacade.prototype.removeAll = /**
* @return {?}
*/
function () {
this.store.getItems().forEach((/**
* @param {?} item
* @param {?} index
* @return {?}
*/
function (item, index) {
item.preprocessContainer.cancel(true);
}));
this.uploader.removeAll();
this.downloader.removeAll();
this.store.clear();
this.uploadProgress.reset(0);
this.paginationService.update(0);
document.dispatchEvent(new CustomEvent(CustomEventTypeExtensions.toString(CustomEventType.ITEMS_CLEARED)));
};
/**
* @return {?}
*/
DatatransferFacade.prototype.retryAll = /**
* @return {?}
*/
function () {
var _this = this;
this.store.getByStatus(TransferStatus.Failed).forEach((/**
* @param {?} item
* @param {?} index
* @return {?}
*/
function (item, index) {
/** @type {?} */
var that = (/** @type {?} */ (_this));
that.retryItem(item);
}));
};
/**
* @return {?}
*/
DatatransferFacade.prototype.removeSelected = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var temp = this.store.getSelected().slice();
temp.forEach((/**
* @param {?} item
* @param {?} index
* @return {?}
*/
function (item, index) {
/** @type {?} */
var that = (/** @type {?} */ (_this));
that.removeItem(item);
}));
};
/**
* @param {?} item
* @return {?}
*/
DatatransferFacade.prototype.addItem = /**
* @param {?} item
* @return {?}
*/
function (item) {
if (!!item) {
this.store.addItem(item);
this.paginationService.update(this.store.count);
document.dispatchEvent(new CustomEvent(CustomEventTypeExtensions.toString(CustomEventType.ITEM_ADDED), { detail: item }));
}
};
/**
* @param {?} item
* @return {?}
*/
DatatransferFacade.prototype.removeItem = /**
* @param {?} item
* @return {?}
*/
function (item) {
if (!!item) {
item.preprocessContainer.cancel(true);
switch (item.transferType) {
case TransferType.Upload:
this.uploader.removeItem(item);
break;
case TransferType.Download:
this.downloader.removeItem(item);
break;
default:
break;
}
this.store.removeById(item.id);
this.paginationService.update(this.store.count);
document.dispatchEvent(new CustomEvent(CustomEventTypeExtensions.toString(CustomEventType.ITEM_REMOVED), { detail: item }));
}
};
/**
* @param {?} item
* @return {?}
*/
DatatransferFacade.prototype.retryItem = /**
* @param {?} item
* @return {?}
*/
function (item) {
if (!!item) {
item.preprocessContainer.cancel(true);
switch (item.transferType) {
case TransferType.Upload:
this.uploader.retryItem(item);
break;
case TransferType.Download:
this.downloader.retryItem(item);
break;
default:
break;
}
}
};
/**
* @param {?} item
* @param {?} status
* @param {?=} message
* @return {?}
*/
DatatransferFacade.prototype.changeItemStatus = /**
* @param {?} item
* @param {?} status
* @param {?=} message
* @return {?}
*/
function (item, status, message) {
if (!!item && !!status) {
if (item.status !== status) {
this.paginationService.setPageByItemId(item.id);
item.status = status;
if (!!message) {
item.message = message;
}
this.store.updateFailedCount();
if (status === TransferStatus.Finished) {
document.dispatchEvent(new CustomEvent(CustomEventTypeExtensions.toString(CustomEventType.ITEM_COMPLETED), { detail: item }));
}
}
}
};
/**
* @param {?} item
* @param {?} progress
* @return {?}
*/
DatatransferFacade.prototype.updateItemProgress = /**
* @param {?} item
* @param {?} progress
* @return {?}
*/
function (item, progress) {
if (!!item) {
/** @type {?} */
var now = this.dateUtil.now();
/** @type {?} */
var loaded = item.progressContainer.total * progress;
item.progressContainer.updateBitrate(now, loaded, this.bitrateInterval);
item.progressContainer.updateProgress(now, loaded, this.progressInterval);
}
};
/**
* @param {?} progressContainer
* @param {?} transferType
* @param {?} progress
* @return {?}
*/
DatatransferFacade.prototype.updateOverallProgress = /**
* @param {?} progressContainer
* @param {?} transferType
* @param {?} progress
* @return {?}
*/
function (progressContainer, transferType, progress) {
/** @type {?} */
var now = this.dateUtil.now();
/** @type {?} */
var loaded = progressContainer.total * progress;
// this.logger.log('total: ' + progressContainer.total + ' progress: ' + progress + ' loaded: ' + loaded);
progressContainer.updateBitrate(now, loaded, this.bitrateInterval);
progressContainer.updateProgress(now, loaded, this.progressInterval);
if (progressContainer.total > 0 && loaded >= progressContainer.total) {
switch (transferType) {
case TransferType.Upload:
document.dispatchEvent(new CustomEvent(CustomEventTypeExtensions.toString(CustomEventType.UPLOAD_COMPLETED)));
break;
case TransferType.Download:
document.dispatchEvent(new CustomEvent(CustomEventTypeExtensions.toString(CustomEventType.DOWNLOAD_COMPLETED)));
break;
default:
break;
}
}
};
/**
* @param {?} progressContainer
* @param {?} size
* @return {?}
*/
DatatransferFacade.prototype.updateOverallSize = /**
* @param {?} progressContainer
* @param {?} size
* @return {?}
*/
function (progressContainer, size) {
progressContainer.reset(size);
};
/**
* @param {?} filename
* @param {?} url
* @param {?} sizeInBytes
* @return {?}
*/
DatatransferFacade.prototype.download = /**
* @param {?} filename
* @param {?} url
* @param {?} sizeInBytes
* @return {?}
*/
function (filename, url, sizeInBytes) {
this.downloader.download(filename, url, sizeInBytes);
};
/**
* @param {?} exportType
* @return {?}
*/
DatatransferFacade.prototype.export = /**
* @param {?} exportType
* @return {?}
*/
function (exportType) {
this.exportService.export(exportType);
};
/**
* @param {?} status
* @return {?}
*/
DatatransferFacade.prototype.getStatusClass = /**
* @param {?} status
* @return {?}
*/
function (status) {
switch (status) {
case TransferStatus.Ready:
return 'add_circle_outline';
case TransferStatus.Uploading:
return 'arrow_upward';
case TransferStatus.Downloading:
return 'arrow_downward';
case TransferStatus.Failed:
return 'error_outline';
case TransferStatus.Queued:
case TransferStatus.Preprocessing:
return 'schedule';
case TransferStatus.Finished:
return 'done_all';
default:
return '';
}
};
/**
* @return {?}
*/
DatatransferFacade.prototype.showStartButton = /**
* @return {?}
*/
function () {
return this.store.count > 0 && !this.uploader.isWorking() && !this.downloader.isWorking();
};
/**
* @return {?}
*/
DatatransferFacade.prototype.showPauseButton = /**
* @return {?}
*/
function () {
return this.uploader.isWorking();
};
/**
* @return {?}
*/
DatatransferFacade.prototype.showRemoveButton = /**
* @return {?}
*/
function () {
return this.store.count > 0;
};
/**
* @return {?}
*/
DatatransferFacade.prototype.showRetryButton = /**
* @return {?}
*/
function () {
return this.store.failedCount > 0 && !this.uploader.isWorking() && !this.downloader.isWorking();
};
/**
* @param {?} item
* @return {?}
*/
DatatransferFacade.prototype.showRetryButtonByItem = /**
* @param {?} item
* @return {?}
*/
function (item) {
return item.status === TransferStatus.Failed;
};
/**
* @return {?}
*/
DatatransferFacade.prototype.showExportButton = /**
* @return {?}
*/
function () {
return this.store.count > 0;
};
/**
* @return {?}
*/
DatatransferFacade.prototype.showPreprocessingCheckbox = /**
* @return {?}
*/
function () {
return this.store.count > 0 && ConfigService.settings.core.preprocessHashEnabled;
};
/**
* @return {?}
*/
DatatransferFacade.prototype.showPreprocessingTooltip = /**
* @return {?}
*/
function () {
return this.showPreprocessingCheckbox() && !!ConfigService.settings.core.preprocessHashTooltipContent;
};
/**
* @param {?} item
* @return {?}
*/
DatatransferFacade.prototype.showSpinner = /**
* @param {?} item
* @return {?}
*/
function (item) {
return item.preprocessContainer.percent > 0 && item.status === TransferStatus.Preprocessing;
};
/**
* @param {?} item
* @return {?}
*/
DatatransferFacade.prototype.showProgressbar = /**
* @param {?} item
* @return {?}
*/
function (item) {
return item.progressContainer.percent > 0 &&
(item.status === TransferStatus.Uploading || item.status === TransferStatus.Downloading);
};
/**
* @param {?} items
* @param {?} index
* @return {?}
*/
DatatransferFacade.prototype.showPath = /**
* @param {?} items
* @param {?} index
* @return {?}
*/
function (items, index) {
if (index > 0 && items.length > index) {
/** @type {?} */
var currentPath = items[index].path;
// don't show if previous path is same as current
return items[index - 1].path !== currentPath;
}
return true;
};
/**
* @param {?} item
* @return {?}
*/
DatatransferFacade.prototype.showEditDialog = /**
* @param {?} item
* @return {?}
*/
function (item) {
/** @type {?} */
var result = false;
if (item) {
switch (item.transferType) {
case TransferType.Upload:
if (item.status === TransferStatus.Ready) {
result = true;
}
break;
default:
break;
}
}
return result;
};
/**
* @param {?} item
* @param {?} oldPath
* @param {?} newPath
* @return {?}
*/
DatatransferFacade.prototype.editPath = /**
* @param {?} item
* @param {?} oldPath
* @param {?} newPath
* @return {?}
*/
function (item, oldPath, newPath) {
switch (item.transferType) {
case TransferType.Upload:
// replace all \ with /
/** @type {?} */
var cleanedPath = newPath.replace(/\\/g, '/');
// replace repeated / with one
cleanedPath = cleanedPath.replace(/\/+/g, '/');
if (cleanedPath.startsWith('/')) {
cleanedPath = cleanedPath.slice(1);
}
if (cleanedPath && !cleanedPath.endsWith('/')) {
cleanedPath += '/';
}
this.uploader.editPath(oldPath, cleanedPath);
break;
default:
break;
}
};
/**
* @param {?} item
* @param {?} name
* @return {?}
*/
DatatransferFacade.prototype.editFilename = /**
* @param {?} item
* @param {?} name
* @return {?}
*/
function (item, name) {
switch (item.transferType) {
case TransferType.Upload:
this.uploader.editFilename(item, name);
break;
default:
break;
}
};
/**
* @param {?} item
* @return {?}
*/
DatatransferFacade.prototype.parseMessage = /**
* @param {?} item
* @return {?}
*/
function (item) {
if (ConfigService.settings.core.parseMessageCallback instanceof Function) {
return ConfigService.settings.core.parseMessageCallback(item.message);
}
else {
return undefined;
}
};
return DatatransferFacade;
}());
export { DatatransferFacade };
if (false) {
/**
* @type {?}
* @private
*/
DatatransferFacade.prototype.uploadProgress;
/**
* @type {?}
* @private
*/
DatatransferFacade.prototype.downloadProgress;
/**
* @type {?}
* @private
*/
DatatransferFacade.prototype.progressInterval;
/**
* @type {?}
* @private
*/
DatatransferFacade.prototype.bitrateInterval;
/**
* @type {?}
* @private
*/
DatatransferFacade.prototype.logger;
/**
* @type {?}
* @private
*/
DatatransferFacade.prototype.zone;
/**
* @type {?}
* @private
*/
DatatransferFacade.prototype.store;
/**
* @type {?}
* @private
*/
DatatransferFacade.prototype.dateUtil;
/**
* @type {?}
* @private
*/
DatatransferFacade.prototype.paginationService;
/**
* @type {?}
* @private
*/
DatatransferFacade.prototype.exportService;
/**
* @type {?}
* @private
*/
DatatransferFacade.prototype.uploader;
/**
* @type {?}
* @private
*/
DatatransferFacade.prototype.downloader;
/**
* @type {?}
* @private
*/
DatatransferFacade.prototype.dialog;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXRyYW5zZmVyLmZhY2FkZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXItbWF0ZXJpYWwtZGF0YXRyYW5zZmVyLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9mYWNhZGVzL2RhdGF0cmFuc2Zlci5mYWNhZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFHQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFVM0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZUFBZSxFQUFFLHlCQUF5QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFN0Y7SUFVSSw0QkFBb0IsTUFBcUIsRUFBVSxJQUFZLEVBQVUsS0FBd0IsRUFDN0UsUUFBa0IsRUFBVSxpQkFBb0MsRUFBVSxhQUE0QixFQUN0RyxRQUFtQixFQUFVLFVBQXVCLEVBQVUsTUFBaUI7UUFGL0UsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUFVLFNBQUksR0FBSixJQUFJLENBQVE7UUFBVSxVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUM3RSxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQVUsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUFVLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQ3RHLGFBQVEsR0FBUixRQUFRLENBQVc7UUFBVSxlQUFVLEdBQVYsVUFBVSxDQUFhO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBVzs7UUFOM0YscUJBQWdCLEdBQUcsR0FBRyxDQUFDOztRQUV2QixvQkFBZSxHQUFHLElBQUksQ0FBQztRQUszQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDO1FBQ2hELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDO1FBQ3BELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3RELENBQUM7Ozs7Ozs7SUFFTyxpQ0FBSTs7Ozs7O0lBQVosVUFBYSxZQUEyQixFQUFFLGlCQUFxQztRQUMzRSxZQUFZLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRTs7OztRQUFBLFVBQVMsSUFBdUI7O2dCQUNuRCxJQUFJLEdBQUcsbUJBQUEsSUFBSSxFQUFzQjtZQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7OztZQUFDO2dCQUNWLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkIsQ0FBQyxFQUFDLENBQUM7UUFDUCxDQUFDLEVBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDZCxZQUFZLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRTs7Ozs7O1FBQUEsVUFBUyxJQUF1QixFQUFFLE1BQXNCLEVBQUUsT0FBZ0I7O2dCQUMvRixJQUFJLEdBQUcsbUJBQUEsSUFBSSxFQUFzQjtZQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7OztZQUFDO2dCQUNWLDBDQUEwQztZQUM5QyxDQUFDLEVBQUMsQ0FBQztRQUNQLENBQUMsRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNkLFlBQVksQ0FBQyxFQUFFLENBQUMsbUJBQW1CLEVBQUU7Ozs7OztRQUFBLFVBQVMsSUFBdUIsRUFBRSxNQUFzQixFQUFFLE9BQWdCOztnQkFDckcsSUFBSSxHQUFHLG1CQUFBLElBQUksRUFBc0I7WUFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHOzs7WUFBQztnQkFDVixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNqRCxDQUFDLEVBQUMsQ0FBQztRQUNQLENBQUMsRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNkLFlBQVksQ0FBQyxFQUFFLENBQUMscUJBQXFCLEVBQUU7Ozs7O1FBQUEsVUFBUyxJQUF1QixFQUFFLFFBQWdCOztnQkFDL0UsSUFBSSxHQUFHLG1CQUFBLElBQUksRUFBc0I7WUFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHOzs7WUFBQztnQkFDVixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzVDLENBQUMsRUFBQyxDQUFDO1FBQ1AsQ0FBQyxFQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2QsWUFBWSxDQUFDLEVBQUUsQ0FBQyx3QkFBd0IsRUFBRTs7Ozs7UUFBQSxVQUFTLFlBQTBCLEVBQUUsUUFBZ0I7O2dCQUNyRixJQUFJLEdBQUcsbUJBQUEsSUFBSSxFQUFzQjtZQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7OztZQUFDO2dCQUNWLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDMUUsQ0FBQyxFQUFDLENBQUM7UUFDUCxDQUFDLEVBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDZCxZQUFZLENBQUMsRUFBRSxDQUFDLG9CQUFvQixFQUFFOzs7O1FBQUEsVUFBUyxJQUFZOztnQkFDakQsSUFBSSxHQUFHLG1CQUFBLElBQUksRUFBc0I7WUFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHOzs7WUFBQztnQkFDVixJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDcEQsQ0FBQyxFQUFDLENBQUM7UUFDUCxDQUFDLEVBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQzs7Ozs7O0lBRU0sK0NBQWtCOzs7OztJQUF6QixVQUEwQixPQUFPLEVBQUUsV0FBbUI7UUFBbkIsNEJBQUEsRUFBQSxtQkFBbUI7UUFDbEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3JELENBQUM7Ozs7O0lBRU0sNkNBQWdCOzs7O0lBQXZCLFVBQXdCLE9BQU87UUFDM0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsQ0FBQzs7OztJQUVNLDZDQUFnQjs7O0lBQXZCOztZQUNVLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUN0RCxJQUFJLEVBQUU7Z0JBQ0Ysa0JBQWtCLEVBQUUsSUFBSTthQUMzQjtTQUNKLENBQUM7SUFDTixDQUFDOzs7OztJQUVNLCtDQUFrQjs7OztJQUF6QixVQUEwQixJQUF1Qjs7WUFDdkMsU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQ3BELElBQUksRUFBRTtnQkFDRixrQkFBa0IsRUFBRSxJQUFJO2dCQUN4QixJQUFJLEVBQUUsV0FBVztnQkFDakIsSUFBSSxNQUFBO2FBQ1A7U0FDSixDQUFDO0lBQ04sQ0FBQzs7Ozs7SUFFTSxtREFBc0I7Ozs7SUFBN0IsVUFBOEIsSUFBdUI7O1lBQzNDLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUNwRCxJQUFJLEVBQUU7Z0JBQ0Ysa0JBQWtCLEVBQUUsSUFBSTtnQkFDeEIsSUFBSSxFQUFFLGVBQWU7Z0JBQ3JCLElBQUksTUFBQTthQUNQO1NBQ0osQ0FBQztJQUNOLENBQUM7Ozs7O0lBRU0sMENBQWE7Ozs7SUFBcEIsVUFBcUIsT0FBZ0I7UUFDakMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxPQUFPOzs7OztRQUFDLFVBQUMsSUFBSSxFQUFFLEtBQUs7WUFDdEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUM7UUFDOUIsQ0FBQyxFQUFDLENBQUM7SUFDUCxDQUFDOzs7O0lBRU0scUNBQVE7OztJQUFmO1FBQUEsaUJBUUM7UUFQRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU87Ozs7O1FBQUMsVUFBQyxJQUFJLEVBQUUsS0FBSzs7Z0JBQ2hDLElBQUksR0FBRyxtQkFBQSxLQUFJLEVBQXNCO1lBQ3ZDLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxZQUFZLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssY0FBYyxDQUFDLEtBQUssRUFBRTtnQkFDbkYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDdEQ7UUFDTCxDQUFDLEVBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDN0IsQ0FBQzs7OztJQUVNLHFDQUFROzs7SUFBZjtRQUNJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTzs7Ozs7UUFBQyxVQUFDLElBQUksRUFBRSxLQUFLO1lBQ3RDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsQ0FBQyxFQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDL0IsQ0FBQzs7OztJQUVNLHNDQUFTOzs7SUFBaEI7UUFDSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU87Ozs7O1FBQUMsVUFBQyxJQUFJLEVBQUUsS0FBSztZQUN0QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLENBQUMsRUFBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksV0FBVyxDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9HLENBQUM7Ozs7SUFFTSxxQ0FBUTs7O0lBQWY7UUFBQSxpQkFLQztRQUpHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPOzs7OztRQUFDLFVBQUMsSUFBSSxFQUFFLEtBQUs7O2dCQUN4RCxJQUFJLEdBQUcsbUJBQUEsS0FBSSxFQUFzQjtZQUN2QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLENBQUMsRUFBQyxDQUFDO0lBQ1AsQ0FBQzs7OztJQUVNLDJDQUFjOzs7SUFBckI7UUFBQSxpQkFNQzs7WUFMUyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUU7UUFDN0MsSUFBSSxDQUFDLE9BQU87Ozs7O1FBQUMsVUFBQyxJQUFJLEVBQUUsS0FBSzs7Z0JBQ2YsSUFBSSxHQUFHLG1CQUFBLEtBQUksRUFBc0I7WUFDdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixDQUFDLEVBQUMsQ0FBQztJQUNQLENBQUM7Ozs7O0lBRU0sb0NBQU87Ozs7SUFBZCxVQUFlLElBQXVCO1FBQ2xDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRTtZQUNSLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoRCxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksV0FBVyxDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzdIO0lBQ0wsQ0FBQzs7Ozs7SUFFTSx1Q0FBVTs7OztJQUFqQixVQUFrQixJQUF1QjtRQUNyQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUU7WUFDUixJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RDLFFBQVEsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDdkIsS0FBSyxZQUFZLENBQUMsTUFBTTtvQkFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQy9CLE1BQU07Z0JBQ1YsS0FBSyxZQUFZLENBQUMsUUFBUTtvQkFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ2pDLE1BQU07Z0JBQ1Y7b0JBQ0ksTUFBTTthQUNiO1lBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoRCxRQUFRLENBQUMsYUFBYSxDQUNsQixJQUFJLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztTQUM1RztJQUNMLENBQUM7Ozs7O0lBRU0sc0NBQVM7Ozs7SUFBaEIsVUFBaUIsSUFBdUI7UUFDcEMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFO1lBQ1IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0QyxRQUFRLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ3ZCLEtBQUssWUFBWSxDQUFDLE1BQU07b0JBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM5QixNQUFNO2dCQUNWLEtBQUssWUFBWSxDQUFDLFFBQVE7b0JBQ3RCLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNoQyxNQUFNO2dCQUNWO29CQUNJLE1BQU07YUFDYjtTQUNKO0lBQ0wsQ0FBQzs7Ozs7OztJQUVNLDZDQUFnQjs7Ozs7O0lBQXZCLFVBQXdCLElBQXVCLEVBQUUsTUFBc0IsRUFBRSxPQUFnQjtRQUNyRixJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRTtZQUNwQixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssTUFBTSxFQUFFO2dCQUN4QixJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRTtvQkFDWCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztpQkFDMUI7Z0JBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUMvQixJQUFJLE1BQU0sS0FBSyxjQUFjLENBQUMsUUFBUSxFQUFFO29CQUNwQyxRQUFRLENBQUMsYUFBYSxDQUNsQixJQUFJLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDOUc7YUFDSjtTQUNKO0lBQ0wsQ0FBQzs7Ozs7O0lBRU0sK0NBQWtCOzs7OztJQUF6QixVQUEwQixJQUF1QixFQUFFLFFBQWdCO1FBQy9ELElBQUksQ0FBQyxDQUFDLElBQUksRUFBRTs7Z0JBQ0YsR0FBRyxHQUFXLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFOztnQkFDakMsTUFBTSxHQUFXLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsUUFBUTtZQUM5RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3hFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUM3RTtJQUNMLENBQUM7Ozs7Ozs7SUFFTSxrREFBcUI7Ozs7OztJQUE1QixVQUE2QixpQkFBcUMsRUFBRSxZQUEwQixFQUFFLFFBQWdCOztZQUN0RyxHQUFHLEdBQVcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUU7O1lBQ2pDLE1BQU0sR0FBVyxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsUUFBUTtRQUN6RCwwR0FBMEc7UUFDMUcsaUJBQWlCLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ25FLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3JFLElBQUksaUJBQWlCLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxNQUFNLElBQUksaUJBQWlCLENBQUMsS0FBSyxFQUFFO1lBQ2xFLFFBQVEsWUFBWSxFQUFFO2dCQUNsQixLQUFLLFlBQVksQ0FBQyxNQUFNO29CQUNwQixRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksV0FBVyxDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzlHLE1BQU07Z0JBQ1YsS0FBSyxZQUFZLENBQUMsUUFBUTtvQkFDdEIsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNoSCxNQUFNO2dCQUNWO29CQUNJLE1BQU07YUFDYjtTQUNKO0lBQ0wsQ0FBQzs7Ozs7O0lBRU0sOENBQWlCOzs7OztJQUF4QixVQUF5QixpQkFBcUMsRUFBRSxJQUFZO1FBQ3hFLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDOzs7Ozs7O0lBRU0scUNBQVE7Ozs7OztJQUFmLFVBQWdCLFFBQWdCLEVBQUUsR0FBVyxFQUFFLFdBQW1CO1FBQzlELElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDekQsQ0FBQzs7Ozs7SUFFTSxtQ0FBTTs7OztJQUFiLFVBQWMsVUFBa0I7UUFDNUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDMUMsQ0FBQzs7Ozs7SUFFTSwyQ0FBYzs7OztJQUFyQixVQUFzQixNQUFzQjtRQUN4QyxRQUFRLE1BQU0sRUFBRTtZQUNaLEtBQUssY0FBYyxDQUFDLEtBQUs7Z0JBQ3JCLE9BQU8sb0JBQW9CLENBQUM7WUFDaEMsS0FBSyxjQUFjLENBQUMsU0FBUztnQkFDekIsT0FBTyxjQUFjLENBQUM7WUFDMUIsS0FBSyxjQUFjLENBQUMsV0FBVztnQkFDM0IsT0FBTyxnQkFBZ0IsQ0FBQztZQUM1QixLQUFLLGNBQWMsQ0FBQyxNQUFNO2dCQUN0QixPQUFPLGVBQWUsQ0FBQztZQUMzQixLQUFLLGNBQWMsQ0FBQyxNQUFNLENBQUM7WUFDM0IsS0FBSyxjQUFjLENBQUMsYUFBYTtnQkFDN0IsT0FBTyxVQUFVLENBQUM7WUFDdEIsS0FBSyxjQUFjLENBQUMsUUFBUTtnQkFDeEIsT0FBTyxVQUFVLENBQUM7WUFDdEI7Z0JBQ0ksT0FBTyxFQUFFLENBQUM7U0FDakI7SUFDTCxDQUFDOzs7O0lBRU0sNENBQWU7OztJQUF0QjtRQUNJLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDOUYsQ0FBQzs7OztJQUVNLDRDQUFlOzs7SUFBdEI7UUFDSSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDckMsQ0FBQzs7OztJQUVNLDZDQUFnQjs7O0lBQXZCO1FBQ0ksT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDaEMsQ0FBQzs7OztJQUVNLDRDQUFlOzs7SUFBdEI7UUFDSSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3BHLENBQUM7Ozs7O0lBRU0sa0RBQXFCOzs7O0lBQTVCLFVBQTZCLElBQXVCO1FBQ2hELE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxjQUFjLENBQUMsTUFBTSxDQUFDO0lBQ2pELENBQUM7Ozs7SUFFTSw2Q0FBZ0I7OztJQUF2QjtRQUNJLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7Ozs7SUFFTSxzREFBeUI7OztJQUFoQztRQUNJLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDO0lBQ3JGLENBQUM7Ozs7SUFFTSxxREFBd0I7OztJQUEvQjtRQUNJLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixFQUFFLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDO0lBQzFHLENBQUM7Ozs7O0lBRU0sd0NBQVc7Ozs7SUFBbEIsVUFBbUIsSUFBdUI7UUFDdEMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLGNBQWMsQ0FBQyxhQUFhLENBQUM7SUFDaEcsQ0FBQzs7Ozs7SUFFTSw0Q0FBZTs7OztJQUF0QixVQUF1QixJQUF1QjtRQUMxQyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEdBQUcsQ0FBQztZQUNyQyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssY0FBYyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNqRyxDQUFDOzs7Ozs7SUFFTSxxQ0FBUTs7Ozs7SUFBZixVQUFnQixLQUEwQixFQUFFLEtBQWE7UUFDckQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxFQUFFOztnQkFDN0IsV0FBVyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJO1lBQ3JDLGlEQUFpRDtZQUNqRCxPQUFPLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQztTQUNoRDtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Ozs7O0lBRU0sMkNBQWM7Ozs7SUFBckIsVUFBc0IsSUFBdUI7O1lBQ3JDLE1BQU0sR0FBRyxLQUFLO1FBQ2xCLElBQUksSUFBSSxFQUFFO1lBQ04sUUFBUSxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUN2QixLQUFLLFlBQVksQ0FBQyxNQUFNO29CQUNwQixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssY0FBYyxDQUFDLEtBQUssRUFBRTt3QkFDdEMsTUFBTSxHQUFHLElBQUksQ0FBQztxQkFDakI7b0JBQ0QsTUFBTTtnQkFDVjtvQkFDSSxNQUFNO2FBQ2I7U0FDSjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7Ozs7Ozs7SUFFTSxxQ0FBUTs7Ozs7O0lBQWYsVUFBZ0IsSUFBdUIsRUFBRSxPQUFlLEVBQUUsT0FBZTtRQUNyRSxRQUFRLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdkIsS0FBSyxZQUFZLENBQUMsTUFBTTs7O29CQUVoQixXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO2dCQUM3Qyw4QkFBOEI7Z0JBQzlCLFdBQVcsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDL0MsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUM3QixXQUFXLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDdEM7Z0JBQ0QsSUFBSSxXQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUMzQyxXQUFXLElBQUksR0FBRyxDQUFDO2lCQUN0QjtnQkFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQzdDLE1BQU07WUFDVjtnQkFDSSxNQUFNO1NBQ2I7SUFDTCxDQUFDOzs7Ozs7SUFFTSx5Q0FBWTs7Ozs7SUFBbkIsVUFBb0IsSUFBdUIsRUFBRSxJQUFZO1FBQ3JELFFBQVEsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN2QixLQUFLLFlBQVksQ0FBQyxNQUFNO2dCQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3ZDLE1BQU07WUFDVjtnQkFDSSxNQUFNO1NBQ2I7SUFDTCxDQUFDOzs7OztJQUVNLHlDQUFZOzs7O0lBQW5CLFVBQW9CLElBQXVCO1FBQ3ZDLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLFlBQVksUUFBUSxFQUFFO1lBQ3RFLE9BQU8sYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3pFO2FBQU07WUFDSCxPQUFPLFNBQVMsQ0FBQztTQUNwQjtJQUNMLENBQUM7SUFDTCx5QkFBQztBQUFELENBQUMsQUFsWEQsSUFrWEM7Ozs7Ozs7SUFoWEcsNENBQTJDOzs7OztJQUMzQyw4Q0FBNkM7Ozs7O0lBRzdDLDhDQUErQjs7Ozs7SUFFL0IsNkNBQStCOzs7OztJQUVuQixvQ0FBNkI7Ozs7O0lBQUUsa0NBQW9COzs7OztJQUFFLG1DQUFnQzs7Ozs7SUFDckYsc0NBQTBCOzs7OztJQUFFLCtDQUE0Qzs7Ozs7SUFBRSwyQ0FBb0M7Ozs7O0lBQzlHLHNDQUEyQjs7Ozs7SUFBRSx3Q0FBK0I7Ozs7O0lBQUUsb0NBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsJztcclxuaW1wb3J0IHsgSVByb2dyZXNzQ29udGFpbmVyIH0gZnJvbSAnLi4vbW9kZWxzL3Byb2dyZXNzLWNvbnRhaW5lci5tb2RlbCc7XHJcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb25maWcuc2VydmljZSc7XHJcbmltcG9ydCB7IExvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IERhdGF0cmFuc2ZlclN0b3JlIH0gZnJvbSAnLi4vc3RvcmVzL2RhdGF0cmFuc2Zlci5zdG9yZSc7XHJcbmltcG9ydCB7IERhdGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZGF0ZS51dGlsJztcclxuaW1wb3J0IHsgUGFnaW5hdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wYWdpbmF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvZXhwb3J0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJVXBsb2FkZXIgfSBmcm9tICcuLi9pby91cGxvYWRlcnMvYmFzZS51cGxvYWRlcic7XHJcbmltcG9ydCB7IElEb3dubG9hZGVyIH0gZnJvbSAnLi4vaW8vZG93bmxvYWRlcnMvYmFzZS5kb3dubG9hZGVyJztcclxuaW1wb3J0IHsgSURhdGF0cmFuc2ZlciB9IGZyb20gJy4uL2lvL2RhdGF0cmFuc2Zlci5pbyc7XHJcbmltcG9ydCB7IElEYXRhdHJhbnNmZXJJdGVtIH0gZnJvbSAnLi4vbW9kZWxzL2RhdGF0cmFuc2Zlci1pdGVtLm1vZGVsJztcclxuaW1wb3J0IHsgVHJhbnNmZXJTdGF0dXMgfSBmcm9tICcuLi9lbnVtcy90cmFuc2Zlci1zdGF0dXMuZW51bSc7XHJcbmltcG9ydCB7IFRyYW5zZmVyVHlwZSB9IGZyb20gJy4uL2VudW1zL3RyYW5zZmVyLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7IEJyb3dzZURpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvYnJvd3NlLWRpYWxvZy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBFZGl0RGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9lZGl0LWRpYWxvZy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDdXN0b21FdmVudFR5cGUsIEN1c3RvbUV2ZW50VHlwZUV4dGVuc2lvbnMgfSBmcm9tICcuLi9lbnVtcy9jdXN0b20tZXZlbnQtdHlwZS5lbnVtJztcclxuXHJcbmV4cG9ydCBjbGFzcyBEYXRhdHJhbnNmZXJGYWNhZGUge1xyXG5cclxuICAgIHByaXZhdGUgdXBsb2FkUHJvZ3Jlc3M6IElQcm9ncmVzc0NvbnRhaW5lcjtcclxuICAgIHByaXZhdGUgZG93bmxvYWRQcm9ncmVzczogSVByb2dyZXNzQ29udGFpbmVyO1xyXG5cclxuICAgIC8vIEludGVydmFsIGluIG1pbGxpc2Vjb25kcyB0byBjYWxjdWxhdGUgcHJvZ3Jlc3M6XHJcbiAgICBwcml2YXRlIHByb2dyZXNzSW50ZXJ2YWwgPSAyMDA7XHJcbiAgICAvLyBJbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgdG8gY2FsY3VsYXRlIGJpdHJhdGU6XHJcbiAgICBwcml2YXRlIGJpdHJhdGVJbnRlcnZhbCA9IDEwMDA7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBsb2dnZXI6IExvZ2dlclNlcnZpY2UsIHByaXZhdGUgem9uZTogTmdab25lLCBwcml2YXRlIHN0b3JlOiBEYXRhdHJhbnNmZXJTdG9yZSxcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgZGF0ZVV0aWw6IERhdGVVdGlsLCBwcml2YXRlIHBhZ2luYXRpb25TZXJ2aWNlOiBQYWdpbmF0aW9uU2VydmljZSwgcHJpdmF0ZSBleHBvcnRTZXJ2aWNlOiBFeHBvcnRTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSB1cGxvYWRlcjogSVVwbG9hZGVyLCBwcml2YXRlIGRvd25sb2FkZXI6IElEb3dubG9hZGVyLCBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nKSB7XHJcbiAgICAgICAgdGhpcy51cGxvYWRQcm9ncmVzcyA9IHRoaXMuc3RvcmUudXBsb2FkUHJvZ3Jlc3M7XHJcbiAgICAgICAgdGhpcy5kb3dubG9hZFByb2dyZXNzID0gdGhpcy5zdG9yZS5kb3dubG9hZFByb2dyZXNzO1xyXG4gICAgICAgIHRoaXMuaW5pdCh0aGlzLnVwbG9hZGVyLCB0aGlzLnVwbG9hZFByb2dyZXNzKTtcclxuICAgICAgICB0aGlzLmluaXQodGhpcy5kb3dubG9hZGVyLCB0aGlzLmRvd25sb2FkUHJvZ3Jlc3MpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdChkYXRhdHJhbnNmZXI6IElEYXRhdHJhbnNmZXIsIHByb2dyZXNzQ29udGFpbmVyOiBJUHJvZ3Jlc3NDb250YWluZXIpOiB2b2lkIHtcclxuICAgICAgICBkYXRhdHJhbnNmZXIub24oJ2l0ZW1BZGRlZCcsIGZ1bmN0aW9uKGl0ZW06IElEYXRhdHJhbnNmZXJJdGVtKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzIGFzIERhdGF0cmFuc2ZlckZhY2FkZTtcclxuICAgICAgICAgICAgdGhhdC56b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGF0LmFkZEl0ZW0oaXRlbSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgZGF0YXRyYW5zZmVyLm9uKCd6b25lVXBkYXRlZCcsIGZ1bmN0aW9uKGl0ZW06IElEYXRhdHJhbnNmZXJJdGVtLCBzdGF0dXM6IFRyYW5zZmVyU3RhdHVzLCBtZXNzYWdlPzogc3RyaW5nKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzIGFzIERhdGF0cmFuc2ZlckZhY2FkZTtcclxuICAgICAgICAgICAgdGhhdC56b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGF0LnVwbG9hZGVyLmlzV29ya2luZygpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcclxuICAgICAgICBkYXRhdHJhbnNmZXIub24oJ2l0ZW1TdGF0dXNDaGFuZ2VkJywgZnVuY3Rpb24oaXRlbTogSURhdGF0cmFuc2Zlckl0ZW0sIHN0YXR1czogVHJhbnNmZXJTdGF0dXMsIG1lc3NhZ2U/OiBzdHJpbmcpIHtcclxuICAgICAgICAgICAgY29uc3QgdGhhdCA9IHRoaXMgYXMgRGF0YXRyYW5zZmVyRmFjYWRlO1xyXG4gICAgICAgICAgICB0aGF0LnpvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoYXQuY2hhbmdlSXRlbVN0YXR1cyhpdGVtLCBzdGF0dXMsIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LmJpbmQodGhpcykpO1xyXG4gICAgICAgIGRhdGF0cmFuc2Zlci5vbignaXRlbVByb2dyZXNzVXBkYXRlZCcsIGZ1bmN0aW9uKGl0ZW06IElEYXRhdHJhbnNmZXJJdGVtLCBwcm9ncmVzczogbnVtYmVyKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzIGFzIERhdGF0cmFuc2ZlckZhY2FkZTtcclxuICAgICAgICAgICAgdGhhdC56b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGF0LnVwZGF0ZUl0ZW1Qcm9ncmVzcyhpdGVtLCBwcm9ncmVzcyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgZGF0YXRyYW5zZmVyLm9uKCdvdmVyYWxsUHJvZ3Jlc3NVcGRhdGVkJywgZnVuY3Rpb24odHJhbnNmZXJUeXBlOiBUcmFuc2ZlclR5cGUsIHByb2dyZXNzOiBudW1iZXIpIHtcclxuICAgICAgICAgICAgY29uc3QgdGhhdCA9IHRoaXMgYXMgRGF0YXRyYW5zZmVyRmFjYWRlO1xyXG4gICAgICAgICAgICB0aGF0LnpvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoYXQudXBkYXRlT3ZlcmFsbFByb2dyZXNzKHByb2dyZXNzQ29udGFpbmVyLCB0cmFuc2ZlclR5cGUsIHByb2dyZXNzKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcclxuICAgICAgICBkYXRhdHJhbnNmZXIub24oJ292ZXJhbGxTaXplVXBkYXRlZCcsIGZ1bmN0aW9uKHNpemU6IG51bWJlcikge1xyXG4gICAgICAgICAgICBjb25zdCB0aGF0ID0gdGhpcyBhcyBEYXRhdHJhbnNmZXJGYWNhZGU7XHJcbiAgICAgICAgICAgIHRoYXQuem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhhdC51cGRhdGVPdmVyYWxsU2l6ZShwcm9ncmVzc0NvbnRhaW5lciwgc2l6ZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0uYmluZCh0aGlzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzc2lnblVwbG9hZEJyb3dzZShlbGVtZW50LCBpc0RpcmVjdG9yeSA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy51cGxvYWRlci5hc3NpZ25Ccm93c2UoZWxlbWVudCwgaXNEaXJlY3RvcnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhc3NpZ25VcGxvYWREcm9wKGVsZW1lbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVwbG9hZGVyLmFzc2lnbkRyb3AoZWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9wZW5Ccm93c2VEaWFsb2coKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihCcm93c2VEaWFsb2dDb21wb25lbnQsIHtcclxuICAgICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICAgICAgZGF0YXRyYW5zZmVyRmFjYWRlOiB0aGlzXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3BlbkVkaXRQYXRoRGlhbG9nKGl0ZW06IElEYXRhdHJhbnNmZXJJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihFZGl0RGlhbG9nQ29tcG9uZW50LCB7XHJcbiAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgIGRhdGF0cmFuc2ZlckZhY2FkZTogdGhpcyxcclxuICAgICAgICAgICAgICAgIG1vZGU6ICdlZGl0LXBhdGgnLFxyXG4gICAgICAgICAgICAgICAgaXRlbVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9wZW5FZGl0RmlsZW5hbWVEaWFsb2coaXRlbTogSURhdGF0cmFuc2Zlckl0ZW0pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEVkaXREaWFsb2dDb21wb25lbnQsIHtcclxuICAgICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICAgICAgZGF0YXRyYW5zZmVyRmFjYWRlOiB0aGlzLFxyXG4gICAgICAgICAgICAgICAgbW9kZTogJ2VkaXQtZmlsZW5hbWUnLFxyXG4gICAgICAgICAgICAgICAgaXRlbVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHRvZ2dsZVZpc2libGUoY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UucGFnaW5hdGVkSXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgaXRlbS5pc1NlbGVjdGVkID0gY2hlY2tlZDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhcnRBbGwoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zdG9yZS5nZXRJdGVtcygpLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzIGFzIERhdGF0cmFuc2ZlckZhY2FkZTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0udHJhbnNmZXJUeXBlID09PSBUcmFuc2ZlclR5cGUuVXBsb2FkICYmIGl0ZW0uc3RhdHVzID09PSBUcmFuc2ZlclN0YXR1cy5SZWFkeSkge1xyXG4gICAgICAgICAgICAgICAgdGhhdC5jaGFuZ2VJdGVtU3RhdHVzKGl0ZW0sIFRyYW5zZmVyU3RhdHVzLlF1ZXVlZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnVwbG9hZGVyLnN0YXJ0QWxsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHBhdXNlQWxsKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc3RvcmUuZ2V0SXRlbXMoKS5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBpdGVtLnByZXByb2Nlc3NDb250YWluZXIucGF1c2UodHJ1ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy51cGxvYWRlci5wYXVzZUFsbCgpO1xyXG4gICAgICAgIHRoaXMuZG93bmxvYWRlci5wYXVzZUFsbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZW1vdmVBbGwoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zdG9yZS5nZXRJdGVtcygpLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGl0ZW0ucHJlcHJvY2Vzc0NvbnRhaW5lci5jYW5jZWwodHJ1ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy51cGxvYWRlci5yZW1vdmVBbGwoKTtcclxuICAgICAgICB0aGlzLmRvd25sb2FkZXIucmVtb3ZlQWxsKCk7XHJcbiAgICAgICAgdGhpcy5zdG9yZS5jbGVhcigpO1xyXG4gICAgICAgIHRoaXMudXBsb2FkUHJvZ3Jlc3MucmVzZXQoMCk7XHJcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS51cGRhdGUoMCk7XHJcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoQ3VzdG9tRXZlbnRUeXBlRXh0ZW5zaW9ucy50b1N0cmluZyhDdXN0b21FdmVudFR5cGUuSVRFTVNfQ0xFQVJFRCkpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmV0cnlBbGwoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zdG9yZS5nZXRCeVN0YXR1cyhUcmFuc2ZlclN0YXR1cy5GYWlsZWQpLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzIGFzIERhdGF0cmFuc2ZlckZhY2FkZTtcclxuICAgICAgICAgICAgdGhhdC5yZXRyeUl0ZW0oaXRlbSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlbW92ZVNlbGVjdGVkKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHRlbXAgPSB0aGlzLnN0b3JlLmdldFNlbGVjdGVkKCkuc2xpY2UoKTtcclxuICAgICAgICB0ZW1wLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzIGFzIERhdGF0cmFuc2ZlckZhY2FkZTtcclxuICAgICAgICAgICAgdGhhdC5yZW1vdmVJdGVtKGl0ZW0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRJdGVtKGl0ZW06IElEYXRhdHJhbnNmZXJJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCEhaXRlbSkge1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JlLmFkZEl0ZW0oaXRlbSk7XHJcbiAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UudXBkYXRlKHRoaXMuc3RvcmUuY291bnQpO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChDdXN0b21FdmVudFR5cGVFeHRlbnNpb25zLnRvU3RyaW5nKEN1c3RvbUV2ZW50VHlwZS5JVEVNX0FEREVEKSwgeyBkZXRhaWw6IGl0ZW0gfSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVtb3ZlSXRlbShpdGVtOiBJRGF0YXRyYW5zZmVySXRlbSk6IHZvaWQge1xyXG4gIC