com.phloxui
Version:
PhloxUI Ng2+ Framework
468 lines (467 loc) • 37.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { EventEmitter } from '@angular/core';
import { AbstractDataEditor } from './AbstractDataEditor';
import { ViewModel } from '../model/ViewModel';
import { PhloxAppInfo } from '../../component/model/PhloxAppInfo';
import { Option } from '../../decorator/Option.decorator';
import { AbstractHasDataHelp } from '../../component/AbstractHasDataHelp';
import { EventUtils } from '../../share/utils/EventUtils';
import { BEFORE_VIEW_SHOW_EVENT, VIEW_SHOW_EVENT, BEFORE_VIEW_HIDE_EVENT, VIEW_HIDE_EVENT, BEFORE_VIEW_CHANGE_EVENT, VIEW_CHANGE_EVENT } from '../../share/CustomEventType';
/**
* @abstract
*/
export class AbstractDataEditorView extends AbstractHasDataHelp {
/**
* @param {?} settingServiceFactory
* @param {?} elementRef
* @param {?=} kbShortcutService
*/
constructor(settingServiceFactory, elementRef, kbShortcutService) {
super(elementRef, kbShortcutService);
this.editorSettingServiceFactory = settingServiceFactory;
this.showEvent = new EventEmitter();
this.hideEvent = new EventEmitter();
this.viewChangeEvent = new EventEmitter();
this.beforeShowEvent = new EventEmitter();
this.beforeHideEvent = new EventEmitter();
this.beforeViewChangeEvent = new EventEmitter();
this.active = false;
this.viewSetting = null;
}
/**
* @return {?}
*/
ngOnInit() {
super.ngOnInit();
// create service
this.initViewSettingService();
}
/**
* @return {?}
*/
getObjectIdField() {
if (this.editor !== null && typeof this.editor !== 'undefined') {
return this.editor.getObjectIdField();
}
return PhloxAppInfo.DEFAULT_OBJECT_ID_FIELD_NAME;
}
/**
* @return {?}
*/
initViewSettingService() {
if (this.editorSettingServiceFactory !== null && typeof this.editorSettingServiceFactory !== 'undefined') {
let /** @type {?} */ viewType = null;
if (this.model !== null && typeof this.model !== 'undefined') {
viewType = this.model.type;
}
let /** @type {?} */ settingProm = this.editorSettingServiceFactory.createViewSettingService(this.editor, viewType);
if (settingProm != null) {
settingProm.then((result) => {
this.viewSettingService = result;
this.reloadViewSetting();
});
}
}
}
/**
* @param {?=} $event
* @return {?}
*/
emitBeforeHideEvent($event) {
if (this.beforeHideEvent !== null) {
let /** @type {?} */ data = {};
let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_VIEW_HIDE_EVENT, this, data, $event);
this.beforeHideEvent.emit(ev);
}
}
/**
* @param {?=} $event
* @return {?}
*/
emitHideEvent($event) {
// emit event
if (this.hideEvent !== null) {
let /** @type {?} */ data = {};
let /** @type {?} */ ev = EventUtils.newCustomEvent(VIEW_HIDE_EVENT, this, data, $event);
this.hideEvent.emit(ev);
}
}
/**
* @param {?=} $event
* @return {?}
*/
emitBeforeShowEvent($event) {
if (this.beforeShowEvent !== null) {
let /** @type {?} */ data = {};
let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_VIEW_SHOW_EVENT, this, data, $event);
this.beforeShowEvent.emit(ev);
}
}
/**
* @param {?=} $event
* @return {?}
*/
emitShowEvent($event) {
// emit event
if (this.showEvent !== null) {
let /** @type {?} */ data = {};
let /** @type {?} */ ev = EventUtils.newCustomEvent(VIEW_SHOW_EVENT, this, data, $event);
this.showEvent.emit(ev);
}
}
/**
* @param {?} action
* @param {?} data
* @param {?=} $event
* @return {?}
*/
emitBeforeViewChangeEvent(action, data, $event) {
if (this.beforeViewChangeEvent !== null) {
let /** @type {?} */ passingData = {
action: action,
data: data
};
let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_VIEW_CHANGE_EVENT, this, passingData, $event);
this.beforeViewChangeEvent.emit(ev);
}
}
/**
* @param {?} action
* @param {?} data
* @param {?=} $event
* @return {?}
*/
emitViewChangeEvent(action, data, $event) {
// emit event
if (this.viewChangeEvent !== null) {
let /** @type {?} */ passingData = {
action: action,
data: data
};
let /** @type {?} */ ev = EventUtils.newCustomEvent(VIEW_CHANGE_EVENT, this, passingData, $event);
this.viewChangeEvent.emit(ev);
}
}
/**
* @return {?}
*/
reloadViewSetting() {
if (this.viewSettingService !== null && typeof this.viewSettingService !== 'undefined') {
return new Promise((resolve, reject) => {
this.viewSettingService.loadSettings().then((result) => {
this.viewSetting = result;
this.onViewSettingLoaded(result);
resolve(result);
}, (err) => {
reject(err);
}).catch((error) => {
return Promise.reject(error);
});
});
}
return Promise.resolve(null);
}
/**
* @return {?}
*/
getViewSetting() {
return this.viewSetting;
}
/**
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
_doHide($event, fireEvent) {
if (!this.active) {
return false;
}
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
EventUtils.handleBrowserEvent(this, 'beforeHideEvent', $event, fireEvent, ($event) => {
// doEvent
this.active = false;
}, ($event) => {
// emitBeforeEvent
this.emitBeforeHideEvent($event);
}, ($event, result) => {
// emitAfterEvent
this.emitHideEvent($event);
}, ($event) => {
// doPrevented
});
return true;
}
/**
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
_doShow($event, fireEvent) {
if (this.active) {
return false;
}
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
EventUtils.handleBrowserEvent(this, 'beforeShowEvent', $event, fireEvent, ($event) => {
// doEvent
this.active = true;
}, ($event) => {
// emitBeforeEvent
this.emitBeforeShowEvent($event);
}, ($event, result) => {
// emitAfterEvent
this.emitShowEvent($event);
}, ($event) => {
// doPrevented
});
return true;
}
/**
* @return {?}
*/
show() {
return this.editor.showView(this.model);
}
/**
* @param {?} editor
* @return {?}
*/
setEditor(editor) {
this.editor = editor;
}
/**
* @return {?}
*/
getEditor() {
return this.editor;
}
/**
* @param {?} model
* @return {?}
*/
setModel(model) {
this.model = model;
}
/**
* @return {?}
*/
getModel() {
return this.model;
}
/**
* @return {?}
*/
isActive() {
return this.active;
}
/**
* @return {?}
*/
getBeforeShowEvent() {
return this.beforeShowEvent;
}
/**
* @return {?}
*/
getShowEvent() {
return this.showEvent;
}
/**
* @return {?}
*/
getBeforeHideEvent() {
return this.beforeHideEvent;
}
/**
* @return {?}
*/
getHideEvent() {
return this.hideEvent;
}
/**
* @param {?} event
* @return {?}
*/
setBeforeShowEvent(event) {
this.beforeShowEvent = event;
}
/**
* @param {?} event
* @return {?}
*/
setShowEvent(event) {
this.showEvent = event;
}
/**
* @param {?} event
* @return {?}
*/
setBeforeHideEvent(event) {
this.beforeHideEvent = event;
}
/**
* @param {?} event
* @return {?}
*/
setHideEvent(event) {
this.hideEvent = event;
}
/**
* @return {?}
*/
getBeforeViewChangeEvent() {
return this.beforeViewChangeEvent;
}
/**
* @return {?}
*/
getViewChangeEvent() {
return this.viewChangeEvent;
}
/**
* @param {?} event
* @return {?}
*/
setBeforeViewChangeEvent(event) {
this.beforeViewChangeEvent = event;
}
/**
* @param {?} event
* @return {?}
*/
setViewChangeEvent(event) {
this.viewChangeEvent = event;
}
/**
* @return {?}
*/
isEditorDataDirty() {
return new Promise((resolve, reject) => {
let /** @type {?} */ dirtyDataProm = this.getEditorDirtyData();
if (dirtyDataProm !== null && typeof dirtyDataProm !== 'undefined') {
dirtyDataProm.then((result) => {
if (result !== null && typeof result !== 'undefined') {
if (Array.isArray(result)) {
if (result.length > 0) {
resolve(true);
}
else {
resolve(false);
}
}
else {
resolve(true);
}
}
else {
resolve(false);
}
});
}
else {
resolve(false);
}
});
}
}
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", AbstractDataEditor)
], AbstractDataEditorView.prototype, "editor", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", ViewModel)
], AbstractDataEditorView.prototype, "model", void 0);
tslib_1.__decorate([
Option('show'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractDataEditorView.prototype, "showEvent", void 0);
tslib_1.__decorate([
Option('hide'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractDataEditorView.prototype, "hideEvent", void 0);
tslib_1.__decorate([
Option('change'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractDataEditorView.prototype, "viewChangeEvent", void 0);
tslib_1.__decorate([
Option('beforeShow'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractDataEditorView.prototype, "beforeShowEvent", void 0);
tslib_1.__decorate([
Option('beforeHide'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractDataEditorView.prototype, "beforeHideEvent", void 0);
tslib_1.__decorate([
Option('beforeViewChange'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractDataEditorView.prototype, "beforeViewChangeEvent", void 0);
function AbstractDataEditorView_tsickle_Closure_declarations() {
/** @type {?} */
AbstractDataEditorView.prototype.editor;
/** @type {?} */
AbstractDataEditorView.prototype.model;
/** @type {?} */
AbstractDataEditorView.prototype.showEvent;
/** @type {?} */
AbstractDataEditorView.prototype.hideEvent;
/** @type {?} */
AbstractDataEditorView.prototype.viewChangeEvent;
/** @type {?} */
AbstractDataEditorView.prototype.beforeShowEvent;
/** @type {?} */
AbstractDataEditorView.prototype.beforeHideEvent;
/** @type {?} */
AbstractDataEditorView.prototype.beforeViewChangeEvent;
/** @type {?} */
AbstractDataEditorView.prototype.editorSettingServiceFactory;
/** @type {?} */
AbstractDataEditorView.prototype.viewSettingService;
/** @type {?} */
AbstractDataEditorView.prototype.viewSetting;
/** @type {?} */
AbstractDataEditorView.prototype.data;
/** @type {?} */
AbstractDataEditorView.prototype.active;
/**
* @abstract
* @param {?} settings
* @return {?}
*/
AbstractDataEditorView.prototype.onViewSettingLoaded = function (settings) { };
/**
* @abstract
* @return {?}
*/
AbstractDataEditorView.prototype.getEditorDirtyData = function () { };
/**
* @abstract
* @return {?}
*/
AbstractDataEditorView.prototype.getSelectedData = function () { };
/**
* @abstract
* @return {?}
*/
AbstractDataEditorView.prototype.getCurrentHistoryState = function () { };
/**
* @abstract
* @param {?} history
* @param {?} state
* @return {?}
*/
AbstractDataEditorView.prototype.loadHistoryState = function (history, state) { };
/**
* @abstract
* @return {?}
*/
AbstractDataEditorView.prototype.reloadView = function () { };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3REYXRhRWRpdG9yVmlldy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9lZGl0b3IvQWJzdHJhY3REYXRhRWRpdG9yVmlldy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBaUIsWUFBWSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBRXhFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzFELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFJbEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRTFELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUkxRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsZUFBZSxFQUFFLHNCQUFzQixFQUN0RSxlQUFlLEVBQUUsd0JBQXdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7OztBQUVwRyxNQUFNLDZCQUF1QyxTQUFRLG1CQUFtQjs7Ozs7O0lBd0J0RSxZQUFZLHFCQUFtRCxFQUFFLFVBQXNCLEVBQUUsaUJBQTJDO1FBQ2xJLEtBQUssQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsMkJBQTJCLEdBQUcscUJBQXFCLENBQUM7UUFDekQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNoRCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztLQUN6Qjs7OztJQUVNLFFBQVE7UUFDYixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7O1FBRWpCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDOzs7OztJQUd0QixnQkFBZ0I7UUFDeEIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLENBQUMsTUFBTSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDL0QsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUN2QztRQUNELE1BQU0sQ0FBQyxZQUFZLENBQUMsNEJBQTRCLENBQUM7S0FDbEQ7Ozs7SUFFUyxzQkFBc0I7UUFDOUIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLDJCQUEyQixLQUFLLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQywyQkFBMkIsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ3pHLHFCQUFJLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDcEIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQzdELFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQzthQUM1QjtZQUVELHFCQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNuRyxFQUFFLENBQUMsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDeEIsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO29CQUMxQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDO29CQUNqQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztpQkFDMUIsQ0FBQyxDQUFDO2FBQ0o7U0FDRjtLQUNGOzs7OztJQUVTLG1CQUFtQixDQUFDLE1BQVk7UUFDeEMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLHFCQUFJLElBQUksR0FBUSxFQUFFLENBQUM7WUFDbkIscUJBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQyxjQUFjLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUUvRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMvQjtLQUNGOzs7OztJQUVTLGFBQWEsQ0FBQyxNQUFZOztRQUVsQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDNUIscUJBQUksSUFBSSxHQUFRLEVBQUUsQ0FBQztZQUNuQixxQkFBSSxFQUFFLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV4RSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN6QjtLQUNGOzs7OztJQUVTLG1CQUFtQixDQUFDLE1BQVk7UUFDeEMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLHFCQUFJLElBQUksR0FBUSxFQUFFLENBQUM7WUFDbkIscUJBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQyxjQUFjLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUUvRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMvQjtLQUNGOzs7OztJQUVTLGFBQWEsQ0FBQyxNQUFZOztRQUVsQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDNUIscUJBQUksSUFBSSxHQUFRLEVBQUUsQ0FBQztZQUNuQixxQkFBSSxFQUFFLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV4RSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN6QjtLQUNGOzs7Ozs7O0lBRVMseUJBQXlCLENBQUMsTUFBYyxFQUFFLElBQVMsRUFBRSxNQUFZO1FBQ3pFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLHFCQUFJLFdBQVcsR0FBUTtnQkFDckIsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsSUFBSSxFQUFFLElBQUk7YUFDWCxDQUFDO1lBQ0YscUJBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQyxjQUFjLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV4RixJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3JDO0tBQ0Y7Ozs7Ozs7SUFFUyxtQkFBbUIsQ0FBQyxNQUFjLEVBQUUsSUFBUyxFQUFFLE1BQVk7O1FBRW5FLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNsQyxxQkFBSSxXQUFXLEdBQVE7Z0JBQ3JCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLElBQUksRUFBRSxJQUFJO2FBQ1gsQ0FBQztZQUNGLHFCQUFJLEVBQUUsR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLGlCQUFpQixFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFakYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDL0I7S0FDRjs7OztJQUVNLGlCQUFpQjtRQUN0QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDdkYsTUFBTSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUNyQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUU7b0JBQzFELElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO29CQUUxQixJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ2pDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDakIsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUNULE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDYixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ2pCLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUM5QixDQUFDLENBQUM7YUFDSixDQUFDLENBQUM7U0FDSjtRQUVELE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDOzs7OztJQUd4QixjQUFjO1FBQ25CLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDOzs7Ozs7O0lBSW5CLE9BQU8sQ0FBQyxNQUFjLEVBQUUsU0FBbUI7UUFDaEQsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNqQixNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ2Q7UUFFRCxFQUFFLENBQUMsQ0FBQyxTQUFTLEtBQUssSUFBSSxJQUFJLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2xELFNBQVMsR0FBRyxJQUFJLENBQUM7U0FDbEI7UUFFRCxVQUFVLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxNQUFhLEVBQUUsRUFBRTs7WUFFMUYsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7U0FDckIsRUFBRSxDQUFDLE1BQWEsRUFBRSxFQUFFOztZQUVuQixJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDbEMsRUFBRSxDQUFDLE1BQWEsRUFBRSxNQUFXLEVBQUUsRUFBRTs7WUFFaEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM1QixFQUFFLENBQUMsTUFBYSxFQUFFLEVBQUU7O1NBRXBCLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxJQUFJLENBQUM7Ozs7Ozs7SUFJUCxPQUFPLENBQUMsTUFBYyxFQUFFLFNBQW1CO1FBQ2hELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLE1BQU0sQ0FBQyxLQUFLLENBQUM7U0FDZDtRQUVELEVBQUUsQ0FBQyxDQUFDLFNBQVMsS0FBSyxJQUFJLElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDbEQsU0FBUyxHQUFHLElBQUksQ0FBQztTQUNsQjtRQUVELFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLE1BQWEsRUFBRSxFQUFFOztZQUUxRixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztTQUNwQixFQUFFLENBQUMsTUFBYSxFQUFFLEVBQUU7O1lBRW5CLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNsQyxFQUFFLENBQUMsTUFBYSxFQUFFLE1BQVcsRUFBRSxFQUFFOztZQUVoQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzVCLEVBQUUsQ0FBQyxNQUFhLEVBQUUsRUFBRTs7U0FFcEIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLElBQUksQ0FBQzs7Ozs7SUFHUCxJQUFJO1FBQ1QsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Ozs7O0lBR25DLFNBQVMsQ0FBQyxNQUEwQjtRQUN6QyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQzs7Ozs7SUFHaEIsU0FBUztRQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDOzs7Ozs7SUFHZCxRQUFRLENBQUMsS0FBZ0I7UUFDOUIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Ozs7O0lBR2QsUUFBUTtRQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDOzs7OztJQUdiLFFBQVE7UUFDYixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7Ozs7SUFHZCxrQkFBa0I7UUFDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7Ozs7O0lBR3ZCLFlBQVk7UUFDakIsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7Ozs7O0lBR2pCLGtCQUFrQjtRQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQzs7Ozs7SUFHdkIsWUFBWTtRQUNqQixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQzs7Ozs7O0lBR2pCLGtCQUFrQixDQUFDLEtBQXdCO1FBQ2hELElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDOzs7Ozs7SUFHeEIsWUFBWSxDQUFDLEtBQXdCO1FBQzFDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDOzs7Ozs7SUFHbEIsa0JBQWtCLENBQUMsS0FBd0I7UUFDaEQsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7Ozs7OztJQUd4QixZQUFZLENBQUMsS0FBd0I7UUFDMUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7Ozs7O0lBR2xCLHdCQUF3QjtRQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDOzs7OztJQUc3QixrQkFBa0I7UUFDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7Ozs7OztJQUd2Qix3QkFBd0IsQ0FBQyxLQUF3QjtRQUN0RCxJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDOzs7Ozs7SUFHOUIsa0JBQWtCLENBQUMsS0FBd0I7UUFDaEQsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7Ozs7O0lBR3hCLGlCQUFpQjtRQUN0QixNQUFNLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMscUJBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzlDLEVBQUUsQ0FBQyxDQUFDLGFBQWEsS0FBSyxJQUFJLElBQUksT0FBTyxhQUFhLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDbkUsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO29CQUM1QixFQUFFLENBQUMsQ0FBQyxNQUFNLEtBQUssSUFBSSxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7d0JBQ3JELEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUMxQixFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQzs2QkFDZjs0QkFBQyxJQUFJLENBQUMsQ0FBQztnQ0FDTixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7NkJBQ2hCO3lCQUNGO3dCQUFDLElBQUksQ0FBQyxDQUFDOzRCQUNOLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQzt5QkFDZjtxQkFDRjtvQkFBQyxJQUFJLENBQUMsQ0FBQzt3QkFDTixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQ2hCO2lCQUNGLENBQUMsQ0FBQzthQUNKO1lBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ04sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2hCO1NBQ0YsQ0FBQyxDQUFDOztDQWNOOztJQXZURSxNQUFNLEVBQUU7c0NBQ1Msa0JBQWtCOzs7SUFDbkMsTUFBTSxFQUFFO3NDQUNRLFNBQVM7OztJQUN6QixNQUFNLENBQUMsTUFBTSxDQUFDO3NDQUNNLFlBQVk7OztJQUNoQyxNQUFNLENBQUMsTUFBTSxDQUFDO3NDQUNNLFlBQVk7OztJQUNoQyxNQUFNLENBQUMsUUFBUSxDQUFDO3NDQUNVLFlBQVk7OztJQUN0QyxNQUFNLENBQUMsWUFBWSxDQUFDO3NDQUNNLFlBQVk7OztJQUN0QyxNQUFNLENBQUMsWUFBWSxDQUFDO3NDQUNNLFlBQVk7OztJQUN0QyxNQUFNLENBQUMsa0JBQWtCLENBQUM7c0NBQ00sWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9uSW5pdCwgSW5wdXQsIEV2ZW50RW1pdHRlciwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBBYnN0cmFjdERhdGFFZGl0b3IgfSBmcm9tICcuL0Fic3RyYWN0RGF0YUVkaXRvcic7XG5pbXBvcnQgeyBWaWV3TW9kZWwgfSBmcm9tICcuLi9tb2RlbC9WaWV3TW9kZWwnO1xuaW1wb3J0IHsgUGhsb3hBcHBJbmZvIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50L21vZGVsL1BobG94QXBwSW5mbyc7XG5pbXBvcnQgeyBJSGFzTW9kZWwgfSBmcm9tICcuLi8uLi9jb21wb25lbnQvSUhhc01vZGVsJztcbmltcG9ydCB7IElFZGl0b3JTZXR0aW5nU2VydmljZUZhY3RvcnkgfSBmcm9tICcuL0lFZGl0b3JTZXR0aW5nU2VydmljZUZhY3RvcnknO1xuaW1wb3J0IHsgSUVkaXRvclNldHRpbmdTZXJ2aWNlIH0gZnJvbSAnLi9JRWRpdG9yU2V0dGluZ1NlcnZpY2UnO1xuaW1wb3J0IHsgT3B0aW9uIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9yL09wdGlvbi5kZWNvcmF0b3InO1xuaW1wb3J0IHsgSTE4TiB9IGZyb20gJy4uLy4uL2RlY29yYXRvci9JMThOLmRlY29yYXRvcic7XG5pbXBvcnQgeyBBYnN0cmFjdEhhc0RhdGFIZWxwIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50L0Fic3RyYWN0SGFzRGF0YUhlbHAnO1xuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gJy4uLy4uL3NoYXJlL3V0aWxzL0V2ZW50VXRpbHMnO1xuaW1wb3J0IHsgSUhpc3RvcnlNYW5hZ2VkIH0gZnJvbSBcIi4uL0lIaXN0b3J5TWFuYWdlZFwiO1xuaW1wb3J0IHsgVUlIaXN0b3J5IH0gZnJvbSBcIi4uL21vZGVsL1VJSGlzdG9yeVwiO1xuaW1wb3J0IHsgS2V5Ym9hcmRTaG9ydGN1dFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZS9LZXlib2FyZFNob3J0Y3V0U2VydmljZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBCRUZPUkVfVklFV19TSE9XX0VWRU5ULCBWSUVXX1NIT1dfRVZFTlQsIEJFRk9SRV9WSUVXX0hJREVfRVZFTlQsXG4gIFZJRVdfSElERV9FVkVOVCwgQkVGT1JFX1ZJRVdfQ0hBTkdFX0VWRU5ULCBWSUVXX0NIQU5HRV9FVkVOVCB9IGZyb20gJy4uLy4uL3NoYXJlL0N1c3RvbUV2ZW50VHlwZSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERhdGFFZGl0b3JWaWV3IGV4dGVuZHMgQWJzdHJhY3RIYXNEYXRhSGVscCBpbXBsZW1lbnRzIE9uSW5pdCwgSUhhc01vZGVsLCBJSGlzdG9yeU1hbmFnZWQge1xuXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZWRpdG9yOiBBYnN0cmFjdERhdGFFZGl0b3I7XG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgbW9kZWw6IFZpZXdNb2RlbDtcbiAgQE9wdGlvbignc2hvdycpXG4gIHByb3RlY3RlZCBzaG93RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdoaWRlJylcbiAgcHJvdGVjdGVkIGhpZGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2NoYW5nZScpXG4gIHByb3RlY3RlZCB2aWV3Q2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdiZWZvcmVTaG93JylcbiAgcHJvdGVjdGVkIGJlZm9yZVNob3dFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2JlZm9yZUhpZGUnKVxuICBwcm90ZWN0ZWQgYmVmb3JlSGlkZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE9wdGlvbignYmVmb3JlVmlld0NoYW5nZScpXG4gIHByb3RlY3RlZCBiZWZvcmVWaWV3Q2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBwcm90ZWN0ZWQgZWRpdG9yU2V0dGluZ1NlcnZpY2VGYWN0b3J5OiBJRWRpdG9yU2V0dGluZ1NlcnZpY2VGYWN0b3J5O1xuICBwcm90ZWN0ZWQgdmlld1NldHRpbmdTZXJ2aWNlOiBJRWRpdG9yU2V0dGluZ1NlcnZpY2U7XG4gIHByb3RlY3RlZCB2aWV3U2V0dGluZzogYW55O1xuICBwcm90ZWN0ZWQgZGF0YTogYW55W107XG4gIHByb3RlY3RlZCBhY3RpdmU6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3Ioc2V0dGluZ1NlcnZpY2VGYWN0b3J5OiBJRWRpdG9yU2V0dGluZ1NlcnZpY2VGYWN0b3J5LCBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBrYlNob3J0Y3V0U2VydmljZT86IEtleWJvYXJkU2hvcnRjdXRTZXJ2aWNlKSB7XG4gICAgc3VwZXIoZWxlbWVudFJlZiwga2JTaG9ydGN1dFNlcnZpY2UpO1xuICAgIHRoaXMuZWRpdG9yU2V0dGluZ1NlcnZpY2VGYWN0b3J5ID0gc2V0dGluZ1NlcnZpY2VGYWN0b3J5O1xuICAgIHRoaXMuc2hvd0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuaGlkZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMudmlld0NoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuYmVmb3JlU2hvd0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuYmVmb3JlSGlkZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuYmVmb3JlVmlld0NoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy52aWV3U2V0dGluZyA9IG51bGw7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAvLyBjcmVhdGUgc2VydmljZVxuICAgIHRoaXMuaW5pdFZpZXdTZXR0aW5nU2VydmljZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldE9iamVjdElkRmllbGQoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5lZGl0b3IgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuZWRpdG9yICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yLmdldE9iamVjdElkRmllbGQoKTtcbiAgICB9XG4gICAgcmV0dXJuIFBobG94QXBwSW5mby5ERUZBVUxUX09CSkVDVF9JRF9GSUVMRF9OQU1FO1xuICB9XG5cbiAgcHJvdGVjdGVkIGluaXRWaWV3U2V0dGluZ1NlcnZpY2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWRpdG9yU2V0dGluZ1NlcnZpY2VGYWN0b3J5ICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmVkaXRvclNldHRpbmdTZXJ2aWNlRmFjdG9yeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxldCB2aWV3VHlwZSA9IG51bGw7XG4gICAgICBpZiAodGhpcy5tb2RlbCAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5tb2RlbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdmlld1R5cGUgPSB0aGlzLm1vZGVsLnR5cGU7XG4gICAgICB9XG5cbiAgICAgIGxldCBzZXR0aW5nUHJvbSA9IHRoaXMuZWRpdG9yU2V0dGluZ1NlcnZpY2VGYWN0b3J5LmNyZWF0ZVZpZXdTZXR0aW5nU2VydmljZSh0aGlzLmVkaXRvciwgdmlld1R5cGUpO1xuICAgICAgaWYgKHNldHRpbmdQcm9tICE9IG51bGwpIHtcbiAgICAgICAgc2V0dGluZ1Byb20udGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgdGhpcy52aWV3U2V0dGluZ1NlcnZpY2UgPSByZXN1bHQ7XG4gICAgICAgICAgdGhpcy5yZWxvYWRWaWV3U2V0dGluZygpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEJlZm9yZUhpZGVFdmVudCgkZXZlbnQ/OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5iZWZvcmVIaWRlRXZlbnQgIT09IG51bGwpIHtcbiAgICAgIGxldCBkYXRhOiBhbnkgPSB7fTtcbiAgICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX1ZJRVdfSElERV9FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcblxuICAgICAgdGhpcy5iZWZvcmVIaWRlRXZlbnQuZW1pdChldik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRIaWRlRXZlbnQoJGV2ZW50PzogYW55KTogdm9pZCB7XG4gICAgLy8gZW1pdCBldmVudFxuICAgIGlmICh0aGlzLmhpZGVFdmVudCAhPT0gbnVsbCkge1xuICAgICAgbGV0IGRhdGE6IGFueSA9IHt9O1xuICAgICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChWSUVXX0hJREVfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XG5cbiAgICAgIHRoaXMuaGlkZUV2ZW50LmVtaXQoZXYpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0QmVmb3JlU2hvd0V2ZW50KCRldmVudD86IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJlZm9yZVNob3dFdmVudCAhPT0gbnVsbCkge1xuICAgICAgbGV0IGRhdGE6IGFueSA9IHt9O1xuICAgICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChCRUZPUkVfVklFV19TSE9XX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xuXG4gICAgICB0aGlzLmJlZm9yZVNob3dFdmVudC5lbWl0KGV2KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdFNob3dFdmVudCgkZXZlbnQ/OiBhbnkpOiB2b2lkIHtcbiAgICAvLyBlbWl0IGV2ZW50XG4gICAgaWYgKHRoaXMuc2hvd0V2ZW50ICE9PSBudWxsKSB7XG4gICAgICBsZXQgZGF0YTogYW55ID0ge307XG4gICAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KFZJRVdfU0hPV19FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcblxuICAgICAgdGhpcy5zaG93RXZlbnQuZW1pdChldik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRCZWZvcmVWaWV3Q2hhbmdlRXZlbnQoYWN0aW9uOiBzdHJpbmcsIGRhdGE6IGFueSwgJGV2ZW50PzogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYmVmb3JlVmlld0NoYW5nZUV2ZW50ICE9PSBudWxsKSB7XG4gICAgICBsZXQgcGFzc2luZ0RhdGE6IGFueSA9IHtcbiAgICAgICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgICAgIGRhdGE6IGRhdGFcbiAgICAgIH07XG4gICAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KEJFRk9SRV9WSUVXX0NIQU5HRV9FVkVOVCwgdGhpcywgcGFzc2luZ0RhdGEsICRldmVudCk7XG5cbiAgICAgIHRoaXMuYmVmb3JlVmlld0NoYW5nZUV2ZW50LmVtaXQoZXYpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0Vmlld0NoYW5nZUV2ZW50KGFjdGlvbjogc3RyaW5nLCBkYXRhOiBhbnksICRldmVudD86IGFueSk6IHZvaWQge1xuICAgIC8vIGVtaXQgZXZlbnRcbiAgICBpZiAodGhpcy52aWV3Q2hhbmdlRXZlbnQgIT09IG51bGwpIHtcbiAgICAgIGxldCBwYXNzaW5nRGF0YTogYW55ID0ge1xuICAgICAgICBhY3Rpb246IGFjdGlvbixcbiAgICAgICAgZGF0YTogZGF0YVxuICAgICAgfTtcbiAgICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoVklFV19DSEFOR0VfRVZFTlQsIHRoaXMsIHBhc3NpbmdEYXRhLCAkZXZlbnQpO1xuXG4gICAgICB0aGlzLnZpZXdDaGFuZ2VFdmVudC5lbWl0KGV2KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVsb2FkVmlld1NldHRpbmcoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAodGhpcy52aWV3U2V0dGluZ1NlcnZpY2UgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMudmlld1NldHRpbmdTZXJ2aWNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy52aWV3U2V0dGluZ1NlcnZpY2UubG9hZFNldHRpbmdzKCkudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnZpZXdTZXR0aW5nID0gcmVzdWx0O1xuXG4gICAgICAgICAgdGhpcy5vblZpZXdTZXR0aW5nTG9hZGVkKHJlc3VsdCk7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWaWV3U2V0dGluZygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnZpZXdTZXR0aW5nO1xuICB9XG5cbiAgLy8gcmV0dXJuIHRydWUgaWYgZG9IaWRlIHRyaWdnZXJcbiAgcHVibGljIF9kb0hpZGUoJGV2ZW50PzogRXZlbnQsIGZpcmVFdmVudD86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuYWN0aXZlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGZpcmVFdmVudCA9PT0gbnVsbCB8fCBmaXJlRXZlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZmlyZUV2ZW50ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBFdmVudFV0aWxzLmhhbmRsZUJyb3dzZXJFdmVudCh0aGlzLCAnYmVmb3JlSGlkZUV2ZW50JywgJGV2ZW50LCBmaXJlRXZlbnQsICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBkb0V2ZW50XG4gICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBlbWl0QmVmb3JlRXZlbnRcbiAgICAgIHRoaXMuZW1pdEJlZm9yZUhpZGVFdmVudCgkZXZlbnQpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50LCByZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgLy8gZW1pdEFmdGVyRXZlbnRcbiAgICAgIHRoaXMuZW1pdEhpZGVFdmVudCgkZXZlbnQpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBkb1ByZXZlbnRlZFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyByZXR1cm4gdHJ1ZSBpZiBkb1Nob3cgdHJpZ2dlclxuICBwdWJsaWMgX2RvU2hvdygkZXZlbnQ/OiBFdmVudCwgZmlyZUV2ZW50PzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmFjdGl2ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChmaXJlRXZlbnQgPT09IG51bGwgfHwgZmlyZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZpcmVFdmVudCA9IHRydWU7XG4gICAgfVxuXG4gICAgRXZlbnRVdGlscy5oYW5kbGVCcm93c2VyRXZlbnQodGhpcywgJ2JlZm9yZVNob3dFdmVudCcsICRldmVudCwgZmlyZUV2ZW50LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZG9FdmVudFxuICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBlbWl0QmVmb3JlRXZlbnRcbiAgICAgIHRoaXMuZW1pdEJlZm9yZVNob3dFdmVudCgkZXZlbnQpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50LCByZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgLy8gZW1pdEFmdGVyRXZlbnRcbiAgICAgIHRoaXMuZW1pdFNob3dFdmVudCgkZXZlbnQpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBkb1ByZXZlbnRlZFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgc2hvdygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3Iuc2hvd1ZpZXcodGhpcy5tb2RlbCk7XG4gIH1cblxuICBwdWJsaWMgc2V0RWRpdG9yKGVkaXRvcjogQWJzdHJhY3REYXRhRWRpdG9yKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7XG4gIH1cblxuICBwdWJsaWMgZ2V0RWRpdG9yKCk6IEFic3RyYWN0RGF0YUVkaXRvciB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yO1xuICB9XG5cbiAgcHVibGljIHNldE1vZGVsKG1vZGVsOiBWaWV3TW9kZWwpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGVsID0gbW9kZWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0TW9kZWwoKTogVmlld01vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbDtcbiAgfVxuXG4gIHB1YmxpYyBpc0FjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmU7XG4gIH1cblxuICBwdWJsaWMgZ2V0QmVmb3JlU2hvd0V2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5iZWZvcmVTaG93RXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2hvd0V2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5zaG93RXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0QmVmb3JlSGlkZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5iZWZvcmVIaWRlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0SGlkZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5oaWRlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0QmVmb3JlU2hvd0V2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuYmVmb3JlU2hvd0V2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0U2hvd0V2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuc2hvd0V2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0QmVmb3JlSGlkZUV2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuYmVmb3JlSGlkZUV2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0SGlkZUV2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuaGlkZUV2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0QmVmb3JlVmlld0NoYW5nZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5iZWZvcmVWaWV3Q2hhbmdlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0Vmlld0NoYW5nZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy52aWV3Q2hhbmdlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0QmVmb3JlVmlld0NoYW5nZUV2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuYmVmb3JlVmlld0NoYW5nZUV2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0Vmlld0NoYW5nZUV2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMudmlld0NoYW5nZUV2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgaXNFZGl0b3JEYXRhRGlydHkoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBkaXJ0eURhdGFQcm9tID0gdGhpcy5nZXRFZGl0b3JEaXJ0eURhdGEoKTtcbiAgICAgIGlmIChkaXJ0eURhdGFQcm9tICE9PSBudWxsICYmIHR5cGVvZiBkaXJ0eURhdGFQcm9tICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBkaXJ0eURhdGFQcm9tLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQgIT09IG51bGwgJiYgdHlwZW9mIHJlc3VsdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IG9uVmlld1NldHRpbmdMb2FkZWQoc2V0dGluZ3M6IGFueSk6IHZvaWQ7XG5cbiAgcHVibGljIGFic3RyYWN0IGdldEVkaXRvckRpcnR5RGF0YSgpOiBQcm9taXNlPGFueVtdPjsgLy8gdXNlIGZvciBzYXZpbmcvdXBkYXRpbmdcblxuICBwdWJsaWMgYWJzdHJhY3QgZ2V0U2VsZWN0ZWREYXRhKCk6IFByb21pc2U8YW55W10+OyAvLyB1c2UgZm9yIGRlbGV0aW5nXG5cbiAgcHVibGljIGFic3RyYWN0IGdldEN1cnJlbnRIaXN0b3J5U3RhdGUoKTogYW55O1xuXG4gIHB1YmxpYyBhYnN0cmFjdCBsb2FkSGlzdG9yeVN0YXRlKGhpc3Rvcnk6IFVJSGlzdG9yeSwgc3RhdGU6IGFueSk6IFByb21pc2U8dm9pZD47XG5cbiAgcHVibGljIGFic3RyYWN0IHJlbG9hZFZpZXcoKTogdm9pZDtcbn1cbiJdfQ==