UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

596 lines (595 loc) 41.2 kB
/** * @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 */ var AbstractDataEditorView = /** @class */ (function (_super) { tslib_1.__extends(AbstractDataEditorView, _super); function AbstractDataEditorView(settingServiceFactory, elementRef, kbShortcutService) { var _this = _super.call(this, elementRef, kbShortcutService) || this; _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 _this; } /** * @return {?} */ AbstractDataEditorView.prototype.ngOnInit = /** * @return {?} */ function () { _super.prototype.ngOnInit.call(this); // create service this.initViewSettingService(); }; /** * @return {?} */ AbstractDataEditorView.prototype.getObjectIdField = /** * @return {?} */ function () { if (this.editor !== null && typeof this.editor !== 'undefined') { return this.editor.getObjectIdField(); } return PhloxAppInfo.DEFAULT_OBJECT_ID_FIELD_NAME; }; /** * @return {?} */ AbstractDataEditorView.prototype.initViewSettingService = /** * @return {?} */ function () { var _this = this; if (this.editorSettingServiceFactory !== null && typeof this.editorSettingServiceFactory !== 'undefined') { var /** @type {?} */ viewType = null; if (this.model !== null && typeof this.model !== 'undefined') { viewType = this.model.type; } var /** @type {?} */ settingProm = this.editorSettingServiceFactory.createViewSettingService(this.editor, viewType); if (settingProm != null) { settingProm.then(function (result) { _this.viewSettingService = result; _this.reloadViewSetting(); }); } } }; /** * @param {?=} $event * @return {?} */ AbstractDataEditorView.prototype.emitBeforeHideEvent = /** * @param {?=} $event * @return {?} */ function ($event) { if (this.beforeHideEvent !== null) { var /** @type {?} */ data = {}; var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_VIEW_HIDE_EVENT, this, data, $event); this.beforeHideEvent.emit(ev); } }; /** * @param {?=} $event * @return {?} */ AbstractDataEditorView.prototype.emitHideEvent = /** * @param {?=} $event * @return {?} */ function ($event) { // emit event if (this.hideEvent !== null) { var /** @type {?} */ data = {}; var /** @type {?} */ ev = EventUtils.newCustomEvent(VIEW_HIDE_EVENT, this, data, $event); this.hideEvent.emit(ev); } }; /** * @param {?=} $event * @return {?} */ AbstractDataEditorView.prototype.emitBeforeShowEvent = /** * @param {?=} $event * @return {?} */ function ($event) { if (this.beforeShowEvent !== null) { var /** @type {?} */ data = {}; var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_VIEW_SHOW_EVENT, this, data, $event); this.beforeShowEvent.emit(ev); } }; /** * @param {?=} $event * @return {?} */ AbstractDataEditorView.prototype.emitShowEvent = /** * @param {?=} $event * @return {?} */ function ($event) { // emit event if (this.showEvent !== null) { var /** @type {?} */ data = {}; var /** @type {?} */ ev = EventUtils.newCustomEvent(VIEW_SHOW_EVENT, this, data, $event); this.showEvent.emit(ev); } }; /** * @param {?} action * @param {?} data * @param {?=} $event * @return {?} */ AbstractDataEditorView.prototype.emitBeforeViewChangeEvent = /** * @param {?} action * @param {?} data * @param {?=} $event * @return {?} */ function (action, data, $event) { if (this.beforeViewChangeEvent !== null) { var /** @type {?} */ passingData = { action: action, data: data }; var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_VIEW_CHANGE_EVENT, this, passingData, $event); this.beforeViewChangeEvent.emit(ev); } }; /** * @param {?} action * @param {?} data * @param {?=} $event * @return {?} */ AbstractDataEditorView.prototype.emitViewChangeEvent = /** * @param {?} action * @param {?} data * @param {?=} $event * @return {?} */ function (action, data, $event) { // emit event if (this.viewChangeEvent !== null) { var /** @type {?} */ passingData = { action: action, data: data }; var /** @type {?} */ ev = EventUtils.newCustomEvent(VIEW_CHANGE_EVENT, this, passingData, $event); this.viewChangeEvent.emit(ev); } }; /** * @return {?} */ AbstractDataEditorView.prototype.reloadViewSetting = /** * @return {?} */ function () { var _this = this; if (this.viewSettingService !== null && typeof this.viewSettingService !== 'undefined') { return new Promise(function (resolve, reject) { _this.viewSettingService.loadSettings().then(function (result) { _this.viewSetting = result; _this.onViewSettingLoaded(result); resolve(result); }, function (err) { reject(err); }).catch(function (error) { return Promise.reject(error); }); }); } return Promise.resolve(null); }; /** * @return {?} */ AbstractDataEditorView.prototype.getViewSetting = /** * @return {?} */ function () { return this.viewSetting; }; /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ AbstractDataEditorView.prototype._doHide = /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ function ($event, fireEvent) { var _this = this; if (!this.active) { return false; } if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeHideEvent', $event, fireEvent, function ($event) { // doEvent // doEvent _this.active = false; }, function ($event) { // emitBeforeEvent // emitBeforeEvent _this.emitBeforeHideEvent($event); }, function ($event, result) { // emitAfterEvent // emitAfterEvent _this.emitHideEvent($event); }, function ($event) { // doPrevented }); return true; }; /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ AbstractDataEditorView.prototype._doShow = /** * @param {?=} $event * @param {?=} fireEvent * @return {?} */ function ($event, fireEvent) { var _this = this; if (this.active) { return false; } if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeShowEvent', $event, fireEvent, function ($event) { // doEvent // doEvent _this.active = true; }, function ($event) { // emitBeforeEvent // emitBeforeEvent _this.emitBeforeShowEvent($event); }, function ($event, result) { // emitAfterEvent // emitAfterEvent _this.emitShowEvent($event); }, function ($event) { // doPrevented }); return true; }; /** * @return {?} */ AbstractDataEditorView.prototype.show = /** * @return {?} */ function () { return this.editor.showView(this.model); }; /** * @param {?} editor * @return {?} */ AbstractDataEditorView.prototype.setEditor = /** * @param {?} editor * @return {?} */ function (editor) { this.editor = editor; }; /** * @return {?} */ AbstractDataEditorView.prototype.getEditor = /** * @return {?} */ function () { return this.editor; }; /** * @param {?} model * @return {?} */ AbstractDataEditorView.prototype.setModel = /** * @param {?} model * @return {?} */ function (model) { this.model = model; }; /** * @return {?} */ AbstractDataEditorView.prototype.getModel = /** * @return {?} */ function () { return this.model; }; /** * @return {?} */ AbstractDataEditorView.prototype.isActive = /** * @return {?} */ function () { return this.active; }; /** * @return {?} */ AbstractDataEditorView.prototype.getBeforeShowEvent = /** * @return {?} */ function () { return this.beforeShowEvent; }; /** * @return {?} */ AbstractDataEditorView.prototype.getShowEvent = /** * @return {?} */ function () { return this.showEvent; }; /** * @return {?} */ AbstractDataEditorView.prototype.getBeforeHideEvent = /** * @return {?} */ function () { return this.beforeHideEvent; }; /** * @return {?} */ AbstractDataEditorView.prototype.getHideEvent = /** * @return {?} */ function () { return this.hideEvent; }; /** * @param {?} event * @return {?} */ AbstractDataEditorView.prototype.setBeforeShowEvent = /** * @param {?} event * @return {?} */ function (event) { this.beforeShowEvent = event; }; /** * @param {?} event * @return {?} */ AbstractDataEditorView.prototype.setShowEvent = /** * @param {?} event * @return {?} */ function (event) { this.showEvent = event; }; /** * @param {?} event * @return {?} */ AbstractDataEditorView.prototype.setBeforeHideEvent = /** * @param {?} event * @return {?} */ function (event) { this.beforeHideEvent = event; }; /** * @param {?} event * @return {?} */ AbstractDataEditorView.prototype.setHideEvent = /** * @param {?} event * @return {?} */ function (event) { this.hideEvent = event; }; /** * @return {?} */ AbstractDataEditorView.prototype.getBeforeViewChangeEvent = /** * @return {?} */ function () { return this.beforeViewChangeEvent; }; /** * @return {?} */ AbstractDataEditorView.prototype.getViewChangeEvent = /** * @return {?} */ function () { return this.viewChangeEvent; }; /** * @param {?} event * @return {?} */ AbstractDataEditorView.prototype.setBeforeViewChangeEvent = /** * @param {?} event * @return {?} */ function (event) { this.beforeViewChangeEvent = event; }; /** * @param {?} event * @return {?} */ AbstractDataEditorView.prototype.setViewChangeEvent = /** * @param {?} event * @return {?} */ function (event) { this.viewChangeEvent = event; }; /** * @return {?} */ AbstractDataEditorView.prototype.isEditorDataDirty = /** * @return {?} */ function () { var _this = this; return new Promise(function (resolve, reject) { var /** @type {?} */ dirtyDataProm = _this.getEditorDirtyData(); if (dirtyDataProm !== null && typeof dirtyDataProm !== 'undefined') { dirtyDataProm.then(function (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); return AbstractDataEditorView; }(AbstractHasDataHelp)); export { AbstractDataEditorView }; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3REYXRhRWRpdG9yVmlldy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9lZGl0b3IvQWJzdHJhY3REYXRhRWRpdG9yVmlldy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBaUIsWUFBWSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBRXhFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzFELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFJbEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRTFELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUkxRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsZUFBZSxFQUFFLHNCQUFzQixFQUN0RSxlQUFlLEVBQUUsd0JBQXdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7Ozs7SUFFL0Msa0RBQW1CO0lBd0J0RSxnQ0FBWSxxQkFBbUQsRUFBRSxVQUFzQixFQUFFLGlCQUEyQztRQUFwSSxZQUNFLGtCQUFNLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxTQVVyQztRQVRDLEtBQUksQ0FBQywyQkFBMkIsR0FBRyxxQkFBcUIsQ0FBQztRQUN6RCxLQUFJLENBQUMsU0FBUyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDcEMsS0FBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3BDLEtBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMxQyxLQUFJLENBQUMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDMUMsS0FBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzFDLEtBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2hELEtBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLEtBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDOztLQUN6Qjs7OztJQUVNLHlDQUFROzs7O1FBQ2IsaUJBQU0sUUFBUSxXQUFFLENBQUM7O1FBRWpCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDOzs7OztJQUd0QixpREFBZ0I7OztJQUExQjtRQUNFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDdkM7UUFDRCxNQUFNLENBQUMsWUFBWSxDQUFDLDRCQUE0QixDQUFDO0tBQ2xEOzs7O0lBRVMsdURBQXNCOzs7SUFBaEM7UUFBQSxpQkFlQztRQWRDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQywyQkFBMkIsS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLENBQUMsMkJBQTJCLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztZQUN6RyxxQkFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUM3RCxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7YUFDNUI7WUFFRCxxQkFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDbkcsRUFBRSxDQUFDLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3hCLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBQyxNQUFNO29CQUN0QixLQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDO29CQUNqQyxLQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztpQkFDMUIsQ0FBQyxDQUFDO2FBQ0o7U0FDRjtLQUNGOzs7OztJQUVTLG9EQUFtQjs7OztJQUE3QixVQUE4QixNQUFZO1FBQ3hDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNsQyxxQkFBSSxJQUFJLEdBQVEsRUFBRSxDQUFDO1lBQ25CLHFCQUFJLEVBQUUsR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLHNCQUFzQixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFL0UsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDL0I7S0FDRjs7Ozs7SUFFUyw4Q0FBYTs7OztJQUF2QixVQUF3QixNQUFZOztRQUVsQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDNUIscUJBQUksSUFBSSxHQUFRLEVBQUUsQ0FBQztZQUNuQixxQkFBSSxFQUFFLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV4RSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN6QjtLQUNGOzs7OztJQUVTLG9EQUFtQjs7OztJQUE3QixVQUE4QixNQUFZO1FBQ3hDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNsQyxxQkFBSSxJQUFJLEdBQVEsRUFBRSxDQUFDO1lBQ25CLHFCQUFJLEVBQUUsR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLHNCQUFzQixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFL0UsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDL0I7S0FDRjs7Ozs7SUFFUyw4Q0FBYTs7OztJQUF2QixVQUF3QixNQUFZOztRQUVsQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDNUIscUJBQUksSUFBSSxHQUFRLEVBQUUsQ0FBQztZQUNuQixxQkFBSSxFQUFFLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV4RSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN6QjtLQUNGOzs7Ozs7O0lBRVMsMERBQXlCOzs7Ozs7SUFBbkMsVUFBb0MsTUFBYyxFQUFFLElBQVMsRUFBRSxNQUFZO1FBQ3pFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLHFCQUFJLFdBQVcsR0FBUTtnQkFDckIsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsSUFBSSxFQUFFLElBQUk7YUFDWCxDQUFDO1lBQ0YscUJBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQyxjQUFjLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV4RixJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3JDO0tBQ0Y7Ozs7Ozs7SUFFUyxvREFBbUI7Ozs7OztJQUE3QixVQUE4QixNQUFjLEVBQUUsSUFBUyxFQUFFLE1BQVk7O1FBRW5FLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNsQyxxQkFBSSxXQUFXLEdBQVE7Z0JBQ3JCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLElBQUksRUFBRSxJQUFJO2FBQ1gsQ0FBQztZQUNGLHFCQUFJLEVBQUUsR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLGlCQUFpQixFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFakYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDL0I7S0FDRjs7OztJQUVNLGtEQUFpQjs7Ozs7UUFDdEIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixLQUFLLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ3ZGLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxNQUFNO2dCQUNqQyxLQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQUMsTUFBVztvQkFDdEQsS0FBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7b0JBRTFCLEtBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDakMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUNqQixFQUFFLFVBQUMsR0FBRztvQkFDTCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ2IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFDLEtBQUs7b0JBQ2IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzlCLENBQUMsQ0FBQzthQUNKLENBQUMsQ0FBQztTQUNKO1FBRUQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Ozs7O0lBR3hCLCtDQUFjOzs7O1FBQ25CLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDOzs7Ozs7O0lBSW5CLHdDQUFPOzs7OztjQUFDLE1BQWMsRUFBRSxTQUFtQjs7UUFDaEQsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNqQixNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ2Q7UUFFRCxFQUFFLENBQUMsQ0FBQyxTQUFTLEtBQUssSUFBSSxJQUFJLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2xELFNBQVMsR0FBRyxJQUFJLENBQUM7U0FDbEI7UUFFRCxVQUFVLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBQyxNQUFhOztZQUV0RixBQURBLFVBQVU7WUFDVixLQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztTQUNyQixFQUFFLFVBQUMsTUFBYTs7WUFFZixBQURBLGtCQUFrQjtZQUNsQixLQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDbEMsRUFBRSxVQUFDLE1BQWEsRUFBRSxNQUFXOztZQUU1QixBQURBLGlCQUFpQjtZQUNqQixLQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzVCLEVBQUUsVUFBQyxNQUFhOztTQUVoQixDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsSUFBSSxDQUFDOzs7Ozs7O0lBSVAsd0NBQU87Ozs7O2NBQUMsTUFBYyxFQUFFLFNBQW1COztRQUNoRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNoQixNQUFNLENBQUMsS0FBSyxDQUFDO1NBQ2Q7UUFFRCxFQUFFLENBQUMsQ0FBQyxTQUFTLEtBQUssSUFBSSxJQUFJLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2xELFNBQVMsR0FBRyxJQUFJLENBQUM7U0FDbEI7UUFFRCxVQUFVLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBQyxNQUFhOztZQUV0RixBQURBLFVBQVU7WUFDVixLQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztTQUNwQixFQUFFLFVBQUMsTUFBYTs7WUFFZixBQURBLGtCQUFrQjtZQUNsQixLQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDbEMsRUFBRSxVQUFDLE1BQWEsRUFBRSxNQUFXOztZQUU1QixBQURBLGlCQUFpQjtZQUNqQixLQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzVCLEVBQUUsVUFBQyxNQUFhOztTQUVoQixDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsSUFBSSxDQUFDOzs7OztJQUdQLHFDQUFJOzs7O1FBQ1QsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Ozs7O0lBR25DLDBDQUFTOzs7O2NBQUMsTUFBMEI7UUFDekMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7Ozs7O0lBR2hCLDBDQUFTOzs7O1FBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7Ozs7OztJQUdkLHlDQUFROzs7O2NBQUMsS0FBZ0I7UUFDOUIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Ozs7O0lBR2QseUNBQVE7Ozs7UUFDYixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQzs7Ozs7SUFHYix5Q0FBUTs7OztRQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDOzs7OztJQUdkLG1EQUFrQjs7OztRQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQzs7Ozs7SUFHdkIsNkNBQVk7Ozs7UUFDakIsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7Ozs7O0lBR2pCLG1EQUFrQjs7OztRQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQzs7Ozs7SUFHdkIsNkNBQVk7Ozs7UUFDakIsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7Ozs7OztJQUdqQixtREFBa0I7Ozs7Y0FBQyxLQUF3QjtRQUNoRCxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQzs7Ozs7O0lBR3hCLDZDQUFZOzs7O2NBQUMsS0FBd0I7UUFDMUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7Ozs7OztJQUdsQixtREFBa0I7Ozs7Y0FBQyxLQUF3QjtRQUNoRCxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQzs7Ozs7O0lBR3hCLDZDQUFZOzs7O2NBQUMsS0FBd0I7UUFDMUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7Ozs7O0lBR2xCLHlEQUF3Qjs7OztRQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDOzs7OztJQUc3QixtREFBa0I7Ozs7UUFDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7Ozs7OztJQUd2Qix5REFBd0I7Ozs7Y0FBQyxLQUF3QjtRQUN0RCxJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDOzs7Ozs7SUFHOUIsbURBQWtCOzs7O2NBQUMsS0FBd0I7UUFDaEQsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7Ozs7O0lBR3hCLGtEQUFpQjs7Ozs7UUFDdEIsTUFBTSxDQUFDLElBQUksT0FBTyxDQUFDLFVBQUMsT0FBTyxFQUFFLE1BQU07WUFDakMscUJBQUksYUFBYSxHQUFHLEtBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzlDLEVBQUUsQ0FBQyxDQUFDLGFBQWEsS0FBSyxJQUFJLElBQUksT0FBTyxhQUFhLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDbkUsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFDLE1BQU07b0JBQ3hCLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQzt3QkFDckQsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQzFCLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FDdEIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDOzZCQUNmOzRCQUFDLElBQUksQ0FBQyxDQUFDO2dDQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQzs2QkFDaEI7eUJBQ0Y7d0JBQUMsSUFBSSxDQUFDLENBQUM7NEJBQ04sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO3lCQUNmO3FCQUNGO29CQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDaEI7aUJBQ0YsQ0FBQyxDQUFDO2FBQ0o7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDTixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDaEI7U0FDRixDQUFDLENBQUM7OztRQXpTSixNQUFNLEVBQUU7MENBQ1Msa0JBQWtCOzs7UUFDbkMsTUFBTSxFQUFFOzBDQUNRLFNBQVM7OztRQUN6QixNQUFNLENBQUMsTUFBTSxDQUFDOzBDQUNNLFlBQVk7OztRQUNoQyxNQUFNLENBQUMsTUFBTSxDQUFDOzBDQUNNLFlBQVk7OztRQUNoQyxNQUFNLENBQUMsUUFBUSxDQUFDOzBDQUNVLFlBQVk7OztRQUN0QyxNQUFNLENBQUMsWUFBWSxDQUFDOzBDQUNNLFlBQVk7OztRQUN0QyxNQUFNLENBQUMsWUFBWSxDQUFDOzBDQUNNLFlBQVk7OztRQUN0QyxNQUFNLENBQUMsa0JBQWtCLENBQUM7MENBQ00sWUFBWTs7aUNBbkMvQztFQWtCcUQsbUJBQW1CO1NBQWxELHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9uSW5pdCwgSW5wdXQsIEV2ZW50RW1pdHRlciwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBBYnN0cmFjdERhdGFFZGl0b3IgfSBmcm9tICcuL0Fic3RyYWN0RGF0YUVkaXRvcic7XG5pbXBvcnQgeyBWaWV3TW9kZWwgfSBmcm9tICcuLi9tb2RlbC9WaWV3TW9kZWwnO1xuaW1wb3J0IHsgUGhsb3hBcHBJbmZvIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50L21vZGVsL1BobG94QXBwSW5mbyc7XG5pbXBvcnQgeyBJSGFzTW9kZWwgfSBmcm9tICcuLi8uLi9jb21wb25lbnQvSUhhc01vZGVsJztcbmltcG9ydCB7IElFZGl0b3JTZXR0aW5nU2VydmljZUZhY3RvcnkgfSBmcm9tICcuL0lFZGl0b3JTZXR0aW5nU2VydmljZUZhY3RvcnknO1xuaW1wb3J0IHsgSUVkaXRvclNldHRpbmdTZXJ2aWNlIH0gZnJvbSAnLi9JRWRpdG9yU2V0dGluZ1NlcnZpY2UnO1xuaW1wb3J0IHsgT3B0aW9uIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9yL09wdGlvbi5kZWNvcmF0b3InO1xuaW1wb3J0IHsgSTE4TiB9IGZyb20gJy4uLy4uL2RlY29yYXRvci9JMThOLmRlY29yYXRvcic7XG5pbXBvcnQgeyBBYnN0cmFjdEhhc0RhdGFIZWxwIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50L0Fic3RyYWN0SGFzRGF0YUhlbHAnO1xuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gJy4uLy4uL3NoYXJlL3V0aWxzL0V2ZW50VXRpbHMnO1xuaW1wb3J0IHsgSUhpc3RvcnlNYW5hZ2VkIH0gZnJvbSBcIi4uL0lIaXN0b3J5TWFuYWdlZFwiO1xuaW1wb3J0IHsgVUlIaXN0b3J5IH0gZnJvbSBcIi4uL21vZGVsL1VJSGlzdG9yeVwiO1xuaW1wb3J0IHsgS2V5Ym9hcmRTaG9ydGN1dFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZS9LZXlib2FyZFNob3J0Y3V0U2VydmljZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBCRUZPUkVfVklFV19TSE9XX0VWRU5ULCBWSUVXX1NIT1dfRVZFTlQsIEJFRk9SRV9WSUVXX0hJREVfRVZFTlQsXG4gIFZJRVdfSElERV9FVkVOVCwgQkVGT1JFX1ZJRVdfQ0hBTkdFX0VWRU5ULCBWSUVXX0NIQU5HRV9FVkVOVCB9IGZyb20gJy4uLy4uL3NoYXJlL0N1c3RvbUV2ZW50VHlwZSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERhdGFFZGl0b3JWaWV3IGV4dGVuZHMgQWJzdHJhY3RIYXNEYXRhSGVscCBpbXBsZW1lbnRzIE9uSW5pdCwgSUhhc01vZGVsLCBJSGlzdG9yeU1hbmFnZWQge1xuXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZWRpdG9yOiBBYnN0cmFjdERhdGFFZGl0b3I7XG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgbW9kZWw6IFZpZXdNb2RlbDtcbiAgQE9wdGlvbignc2hvdycpXG4gIHByb3RlY3RlZCBzaG93RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdoaWRlJylcbiAgcHJvdGVjdGVkIGhpZGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2NoYW5nZScpXG4gIHByb3RlY3RlZCB2aWV3Q2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdiZWZvcmVTaG93JylcbiAgcHJvdGVjdGVkIGJlZm9yZVNob3dFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2JlZm9yZUhpZGUnKVxuICBwcm90ZWN0ZWQgYmVmb3JlSGlkZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE9wdGlvbignYmVmb3JlVmlld0NoYW5nZScpXG4gIHByb3RlY3RlZCBiZWZvcmVWaWV3Q2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBwcm90ZWN0ZWQgZWRpdG9yU2V0dGluZ1NlcnZpY2VGYWN0b3J5OiBJRWRpdG9yU2V0dGluZ1NlcnZpY2VGYWN0b3J5O1xuICBwcm90ZWN0ZWQgdmlld1NldHRpbmdTZXJ2aWNlOiBJRWRpdG9yU2V0dGluZ1NlcnZpY2U7XG4gIHByb3RlY3RlZCB2aWV3U2V0dGluZzogYW55O1xuICBwcm90ZWN0ZWQgZGF0YTogYW55W107XG4gIHByb3RlY3RlZCBhY3RpdmU6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3Ioc2V0dGluZ1NlcnZpY2VGYWN0b3J5OiBJRWRpdG9yU2V0dGluZ1NlcnZpY2VGYWN0b3J5LCBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBrYlNob3J0Y3V0U2VydmljZT86IEtleWJvYXJkU2hvcnRjdXRTZXJ2aWNlKSB7XG4gICAgc3VwZXIoZWxlbWVudFJlZiwga2JTaG9ydGN1dFNlcnZpY2UpO1xuICAgIHRoaXMuZWRpdG9yU2V0dGluZ1NlcnZpY2VGYWN0b3J5ID0gc2V0dGluZ1NlcnZpY2VGYWN0b3J5O1xuICAgIHRoaXMuc2hvd0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuaGlkZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMudmlld0NoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuYmVmb3JlU2hvd0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuYmVmb3JlSGlkZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuYmVmb3JlVmlld0NoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy52aWV3U2V0dGluZyA9IG51bGw7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAvLyBjcmVhdGUgc2VydmljZVxuICAgIHRoaXMuaW5pdFZpZXdTZXR0aW5nU2VydmljZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldE9iamVjdElkRmllbGQoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5lZGl0b3IgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuZWRpdG9yICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yLmdldE9iamVjdElkRmllbGQoKTtcbiAgICB9XG4gICAgcmV0dXJuIFBobG94QXBwSW5mby5ERUZBVUxUX09CSkVDVF9JRF9GSUVMRF9OQU1FO1xuICB9XG5cbiAgcHJvdGVjdGVkIGluaXRWaWV3U2V0dGluZ1NlcnZpY2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWRpdG9yU2V0dGluZ1NlcnZpY2VGYWN0b3J5ICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmVkaXRvclNldHRpbmdTZXJ2aWNlRmFjdG9yeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxldCB2aWV3VHlwZSA9IG51bGw7XG4gICAgICBpZiAodGhpcy5tb2RlbCAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5tb2RlbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdmlld1R5cGUgPSB0aGlzLm1vZGVsLnR5cGU7XG4gICAgICB9XG5cbiAgICAgIGxldCBzZXR0aW5nUHJvbSA9IHRoaXMuZWRpdG9yU2V0dGluZ1NlcnZpY2VGYWN0b3J5LmNyZWF0ZVZpZXdTZXR0aW5nU2VydmljZSh0aGlzLmVkaXRvciwgdmlld1R5cGUpO1xuICAgICAgaWYgKHNldHRpbmdQcm9tICE9IG51bGwpIHtcbiAgICAgICAgc2V0dGluZ1Byb20udGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgdGhpcy52aWV3U2V0dGluZ1NlcnZpY2UgPSByZXN1bHQ7XG4gICAgICAgICAgdGhpcy5yZWxvYWRWaWV3U2V0dGluZygpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEJlZm9yZUhpZGVFdmVudCgkZXZlbnQ/OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5iZWZvcmVIaWRlRXZlbnQgIT09IG51bGwpIHtcbiAgICAgIGxldCBkYXRhOiBhbnkgPSB7fTtcbiAgICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX1ZJRVdfSElERV9FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcblxuICAgICAgdGhpcy5iZWZvcmVIaWRlRXZlbnQuZW1pdChldik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRIaWRlRXZlbnQoJGV2ZW50PzogYW55KTogdm9pZCB7XG4gICAgLy8gZW1pdCBldmVudFxuICAgIGlmICh0aGlzLmhpZGVFdmVudCAhPT0gbnVsbCkge1xuICAgICAgbGV0IGRhdGE6IGFueSA9IHt9O1xuICAgICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChWSUVXX0hJREVfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XG5cbiAgICAgIHRoaXMuaGlkZUV2ZW50LmVtaXQoZXYpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0QmVmb3JlU2hvd0V2ZW50KCRldmVudD86IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJlZm9yZVNob3dFdmVudCAhPT0gbnVsbCkge1xuICAgICAgbGV0IGRhdGE6IGFueSA9IHt9O1xuICAgICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChCRUZPUkVfVklFV19TSE9XX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xuXG4gICAgICB0aGlzLmJlZm9yZVNob3dFdmVudC5lbWl0KGV2KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdFNob3dFdmVudCgkZXZlbnQ/OiBhbnkpOiB2b2lkIHtcbiAgICAvLyBlbWl0IGV2ZW50XG4gICAgaWYgKHRoaXMuc2hvd0V2ZW50ICE9PSBudWxsKSB7XG4gICAgICBsZXQgZGF0YTogYW55ID0ge307XG4gICAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KFZJRVdfU0hPV19FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcblxuICAgICAgdGhpcy5zaG93RXZlbnQuZW1pdChldik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRCZWZvcmVWaWV3Q2hhbmdlRXZlbnQoYWN0aW9uOiBzdHJpbmcsIGRhdGE6IGFueSwgJGV2ZW50PzogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYmVmb3JlVmlld0NoYW5nZUV2ZW50ICE9PSBudWxsKSB7XG4gICAgICBsZXQgcGFzc2luZ0RhdGE6IGFueSA9IHtcbiAgICAgICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgICAgIGRhdGE6IGRhdGFcbiAgICAgIH07XG4gICAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KEJFRk9SRV9WSUVXX0NIQU5HRV9FVkVOVCwgdGhpcywgcGFzc2luZ0RhdGEsICRldmVudCk7XG5cbiAgICAgIHRoaXMuYmVmb3JlVmlld0NoYW5nZUV2ZW50LmVtaXQoZXYpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0Vmlld0NoYW5nZUV2ZW50KGFjdGlvbjogc3RyaW5nLCBkYXRhOiBhbnksICRldmVudD86IGFueSk6IHZvaWQge1xuICAgIC8vIGVtaXQgZXZlbnRcbiAgICBpZiAodGhpcy52aWV3Q2hhbmdlRXZlbnQgIT09IG51bGwpIHtcbiAgICAgIGxldCBwYXNzaW5nRGF0YTogYW55ID0ge1xuICAgICAgICBhY3Rpb246IGFjdGlvbixcbiAgICAgICAgZGF0YTogZGF0YVxuICAgICAgfTtcbiAgICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoVklFV19DSEFOR0VfRVZFTlQsIHRoaXMsIHBhc3NpbmdEYXRhLCAkZXZlbnQpO1xuXG4gICAgICB0aGlzLnZpZXdDaGFuZ2VFdmVudC5lbWl0KGV2KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVsb2FkVmlld1NldHRpbmcoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAodGhpcy52aWV3U2V0dGluZ1NlcnZpY2UgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMudmlld1NldHRpbmdTZXJ2aWNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy52aWV3U2V0dGluZ1NlcnZpY2UubG9hZFNldHRpbmdzKCkudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnZpZXdTZXR0aW5nID0gcmVzdWx0O1xuXG4gICAgICAgICAgdGhpcy5vblZpZXdTZXR0aW5nTG9hZGVkKHJlc3VsdCk7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWaWV3U2V0dGluZygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnZpZXdTZXR0aW5nO1xuICB9XG5cbiAgLy8gcmV0dXJuIHRydWUgaWYgZG9IaWRlIHRyaWdnZXJcbiAgcHVibGljIF9kb0hpZGUoJGV2ZW50PzogRXZlbnQsIGZpcmVFdmVudD86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuYWN0aXZlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGZpcmVFdmVudCA9PT0gbnVsbCB8fCBmaXJlRXZlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZmlyZUV2ZW50ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBFdmVudFV0aWxzLmhhbmRsZUJyb3dzZXJFdmVudCh0aGlzLCAnYmVmb3JlSGlkZUV2ZW50JywgJGV2ZW50LCBmaXJlRXZlbnQsICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBkb0V2ZW50XG4gICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBlbWl0QmVmb3JlRXZlbnRcbiAgICAgIHRoaXMuZW1pdEJlZm9yZUhpZGVFdmVudCgkZXZlbnQpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50LCByZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgLy8gZW1pdEFmdGVyRXZlbnRcbiAgICAgIHRoaXMuZW1pdEhpZGVFdmVudCgkZXZlbnQpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBkb1ByZXZlbnRlZFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyByZXR1cm4gdHJ1ZSBpZiBkb1Nob3cgdHJpZ2dlclxuICBwdWJsaWMgX2RvU2hvdygkZXZlbnQ/OiBFdmVudCwgZmlyZUV2ZW50PzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmFjdGl2ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChmaXJlRXZlbnQgPT09IG51bGwgfHwgZmlyZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZpcmVFdmVudCA9IHRydWU7XG4gICAgfVxuXG4gICAgRXZlbnRVdGlscy5oYW5kbGVCcm93c2VyRXZlbnQodGhpcywgJ2JlZm9yZVNob3dFdmVudCcsICRldmVudCwgZmlyZUV2ZW50LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZG9FdmVudFxuICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBlbWl0QmVmb3JlRXZlbnRcbiAgICAgIHRoaXMuZW1pdEJlZm9yZVNob3dFdmVudCgkZXZlbnQpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50LCByZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgLy8gZW1pdEFmdGVyRXZlbnRcbiAgICAgIHRoaXMuZW1pdFNob3dFdmVudCgkZXZlbnQpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBkb1ByZXZlbnRlZFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgc2hvdygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3Iuc2hvd1ZpZXcodGhpcy5tb2RlbCk7XG4gIH1cblxuICBwdWJsaWMgc2V0RWRpdG9yKGVkaXRvcjogQWJzdHJhY3REYXRhRWRpdG9yKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7XG4gIH1cblxuICBwdWJsaWMgZ2V0RWRpdG9yKCk6IEFic3RyYWN0RGF0YUVkaXRvciB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yO1xuICB9XG5cbiAgcHVibGljIHNldE1vZGVsKG1vZGVsOiBWaWV3TW9kZWwpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGVsID0gbW9kZWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0TW9kZWwoKTogVmlld01vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbDtcbiAgfVxuXG4gIHB1YmxpYyBpc0FjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmU7XG4gIH1cblxuICBwdWJsaWMgZ2V0QmVmb3JlU2hvd0V2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5iZWZvcmVTaG93RXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2hvd0V2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5zaG93RXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0QmVmb3JlSGlkZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5iZWZvcmVIaWRlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0SGlkZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5oaWRlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0QmVmb3JlU2hvd0V2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuYmVmb3JlU2hvd0V2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0U2hvd0V2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuc2hvd0V2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0QmVmb3JlSGlkZUV2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuYmVmb3JlSGlkZUV2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0SGlkZUV2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuaGlkZUV2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0QmVmb3JlVmlld0NoYW5nZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5iZWZvcmVWaWV3Q2hhbmdlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0Vmlld0NoYW5nZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy52aWV3Q2hhbmdlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0QmVmb3JlVmlld0NoYW5nZUV2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuYmVmb3JlVmlld0NoYW5nZUV2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0Vmlld0NoYW5nZUV2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMudmlld0NoYW5nZUV2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgaXNFZGl0b3JEYXRhRGlydHkoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBkaXJ0eURhdGFQcm9tID0gdGhpcy5nZXRFZGl0b3JEaXJ0eURhdGEoKTtcbiAgICAgIGlmIChkaXJ0eURhdGFQcm9tICE9PSBudWxsICYmIHR5cGVvZiBkaXJ0eURhdGFQcm9tICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBkaXJ0eURhdGFQcm9tLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQgIT09IG51bGwgJiYgdHlwZW9mIHJlc3VsdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IG9uVmlld1NldHRpbmdMb2FkZWQoc2V0dGluZ3M6IGFueSk6IHZvaWQ7XG5cbiAgcHVibGljIGFic3RyYWN0IGdldEVkaXRvckRpcnR5RGF0YSgpOiBQcm9taXNlPGFueVtdPjsgLy8gdXNlIGZvciBzYXZpbmcvdXBkYXRpbmdcblxuICBwdWJsaWMgYWJzdHJhY3QgZ2V0U2VsZWN0ZWREYXRhKCk6IFByb21pc2U8YW55W10+OyAvLyB1c2UgZm9yIGRlbGV0aW5nXG5cbiAgcHVibGljIGFic3RyYWN0IGdldEN1cnJlbnRIaXN0b3J5U3RhdGUoKTogYW55O1xuXG4gIHB1YmxpYyBhYnN0cmFjdCBsb2FkSGlzdG9yeVN0YXRlKGhpc3Rvcnk6IFVJSGlzdG9yeSwgc3RhdGU6IGFueSk6IFByb21pc2U8dm9pZD47XG5cbiAgcHVibGljIGFic3RyYWN0IHJlbG9hZFZpZXcoKTogdm9pZDtcbn1cbiJdfQ==