UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

497 lines (496 loc) 34.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, ElementRef, EventEmitter, Output, Input } from '@angular/core'; import { AbstractDataView } from './AbstractDataView'; import { PhloxDataChartModel } from '.././model/models'; import { Option } from '../../decorator/decorators'; import { BEFORE_CHART_SELECT_EVENT, CHART_SELECT_EVENT, CHART_ERROR, CHART_READY } from '../../share/CustomEventType'; import { EventUtils } from '../../share/shares'; var /** @type {?} */ TYPE_NAME = "phxChart"; var PhloxChart = /** @class */ (function (_super) { tslib_1.__extends(PhloxChart, _super); function PhloxChart(elementRef) { var _this = _super.call(this, elementRef) || this; _this.chartReadyEvent = new EventEmitter(); // before event is not require _this.chartErrorEvent = new EventEmitter(); // before event is not require _this.beforeChartSelectEvent = new EventEmitter(); _this.chartSelectEvent = new EventEmitter(); _this.beforeChartMouseOverEvent = new EventEmitter(); _this.chartMouseOverEvent = new EventEmitter(); _this.beforeChartMouseOutEvent = new EventEmitter(); _this.chartMouseOutEvent = new EventEmitter(); return _this; } /** * @return {?} */ PhloxChart.prototype.ngOnInit = /** * @return {?} */ function () { _super.prototype.ngOnInit.call(this); if (this.chartType !== undefined && this.chartType !== null && this.dataTable !== undefined && this.dataTable !== null && this.cols !== undefined && this.cols !== null && this.rows !== undefined && this.rows !== null) { this.model = new PhloxDataChartModel(this.chartType, this.dataTable, this.formatters, this.options, this.title, this.subtitle, this.width, this.height, this.cols, this.rows); } }; /** * @return {?} */ PhloxChart.prototype.isSelfDataDirty = /** * @return {?} */ function () { return false; }; /** * @param {?} data * @return {?} */ PhloxChart.prototype.selfSaveData = /** * @param {?} data * @return {?} */ function (data) { }; /** * @return {?} */ PhloxChart.prototype.selfResetData = /** * @return {?} */ function () { }; /** * @return {?} */ PhloxChart.prototype.doPreload = /** * @return {?} */ function () { return new Promise(function (resolve, reject) { resolve(null); }); }; /** * @return {?} */ PhloxChart.prototype.doLoaded = /** * @return {?} */ function () { }; /** * @param {?} dataTable * @return {?} */ PhloxChart.prototype.reloadData = /** * @param {?} dataTable * @return {?} */ function (dataTable) { this.model.dataTable = dataTable; this.model = JSON.parse(JSON.stringify(this.model)); }; /** * @param {?} event * @param {?=} fireEvent * @return {?} */ PhloxChart.prototype.onChartSelectEvent = /** * @param {?} event * @param {?=} fireEvent * @return {?} */ function (event, fireEvent) { var _this = this; if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeChartSelectEvent', event, fireEvent, function ($event) { // doEvent }, function ($event) { // emitBeforeEvent // emitBeforeEvent _this.emitBeforeChartSelectEvent($event); }, function ($event, result) { // emitAfterEvent // emitAfterEvent _this.emitChartSelectEvent($event); }, function ($event) { // doPrevented }); }; /** * @param {?} $event * @return {?} */ PhloxChart.prototype.emitBeforeChartSelectEvent = /** * @param {?} $event * @return {?} */ function ($event) { var /** @type {?} */ eventData = null; // emit event var /** @type {?} */ data = eventData; var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_CHART_SELECT_EVENT, this, data, $event); if (this.beforeChartSelectEvent !== null && this.beforeChartSelectEvent !== undefined) { this.beforeChartSelectEvent.emit(ev); } }; /** * @param {?} $event * @return {?} */ PhloxChart.prototype.emitChartSelectEvent = /** * @param {?} $event * @return {?} */ function ($event) { var /** @type {?} */ eventData = $event; // emit event var /** @type {?} */ data = eventData; var /** @type {?} */ ev = EventUtils.newCustomEvent(CHART_SELECT_EVENT, this, data, $event); if (this.chartSelectEvent !== null && this.chartSelectEvent !== undefined) { this.chartSelectEvent.emit(ev); } }; /** * @param {?} $event * @return {?} */ PhloxChart.prototype.emitChartReadyEvent = /** * @param {?} $event * @return {?} */ function ($event) { var /** @type {?} */ eventData = null; // emit event var /** @type {?} */ data = eventData; var /** @type {?} */ ev = EventUtils.newCustomEvent(CHART_READY, this, data, event); if (this.chartReadyEvent !== null && this.chartReadyEvent !== undefined) { this.chartReadyEvent.emit(ev); } }; /** * @param {?} $event * @return {?} */ PhloxChart.prototype.emitChartErrorEvent = /** * @param {?} $event * @return {?} */ function ($event) { var /** @type {?} */ eventData = null; // emit event var /** @type {?} */ data = eventData; var /** @type {?} */ ev = EventUtils.newCustomEvent(CHART_ERROR, this, data, event); if (this.chartErrorEvent !== null && this.chartErrorEvent !== undefined) { this.chartErrorEvent.emit(ev); } }; /** * @param {?} event * @param {?=} fireEvent * @return {?} */ PhloxChart.prototype.onChartReadyEvent = /** * @param {?} event * @param {?=} fireEvent * @return {?} */ function (event, fireEvent) { if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } this.emitChartReadyEvent(event); }; /** * @param {?} event * @param {?=} fireEvent * @return {?} */ PhloxChart.prototype.onChartErrorEvent = /** * @param {?} event * @param {?=} fireEvent * @return {?} */ function (event, fireEvent) { if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } this.emitChartErrorEvent(event); }; /** * @return {?} */ PhloxChart.prototype.getchartReadyEvent = /** * @return {?} */ function () { return this.chartReadyEvent; }; /** * @return {?} */ PhloxChart.prototype.getchartErrorEvent = /** * @return {?} */ function () { return this.chartErrorEvent; }; /** * @return {?} */ PhloxChart.prototype.getchartSelectEvent = /** * @return {?} */ function () { return this.chartSelectEvent; }; /** * @return {?} */ PhloxChart.prototype.getchartMouseOverEvent = /** * @return {?} */ function () { return this.chartMouseOverEvent; }; /** * @return {?} */ PhloxChart.prototype.getchartMouseOutEvent = /** * @return {?} */ function () { return this.chartMouseOutEvent; }; /** * @param {?} options * @return {?} */ PhloxChart.prototype.setOptions = /** * @param {?} options * @return {?} */ function (options) { this.model.options = options; this.reloadData(this.model.dataTable); }; /** * @param {?} chartType * @return {?} */ PhloxChart.prototype.setChartType = /** * @param {?} chartType * @return {?} */ function (chartType) { this.model.chartType = chartType; this.reloadData(this.model.dataTable); }; /** * @param {?} title * @return {?} */ PhloxChart.prototype.setTitle = /** * @param {?} title * @return {?} */ function (title) { this.model.title = title; this.reloadData(this.model.dataTable); }; /** * @param {?} subtitle * @return {?} */ PhloxChart.prototype.setSubtitle = /** * @param {?} subtitle * @return {?} */ function (subtitle) { this.model.subtitle = subtitle; this.reloadData(this.model.dataTable); }; /** * @return {?} */ PhloxChart.prototype.getModel = /** * @return {?} */ function () { return this.model; }; /** * @param {?} model * @return {?} */ PhloxChart.prototype.setModel = /** * @param {?} model * @return {?} */ function (model) { this.model = model; }; PhloxChart.TYPE_NAME = TYPE_NAME; PhloxChart.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: "<div class=\"phxChart\">\n <google-chart [data]=\"getModel()\" (chartReady)=\"onChartReadyEvent($event)\" (chartError)=\"onChartErrorEvent($event)\" (chartSelect)=\"onChartSelectEvent($event)\"></google-chart>\n</div> " },] }, ]; /** @nocollapse */ PhloxChart.ctorParameters = function () { return [ { type: ElementRef, }, ]; }; PhloxChart.propDecorators = { "chartReadyEvent": [{ type: Output, args: ['phxChartReady',] },], "chartErrorEvent": [{ type: Output, args: ['phxChartError',] },], "beforeChartSelectEvent": [{ type: Output, args: ['phxBeforeChartSelect',] },], "chartSelectEvent": [{ type: Output, args: ['phxChartSelect',] },], "beforeChartMouseOverEvent": [{ type: Output, args: ['phxBeforeChartMouseOver',] },], "chartMouseOverEvent": [{ type: Output, args: ['phxChartMouseOver',] },], "beforeChartMouseOutEvent": [{ type: Output, args: ['phxBeforeChartMouseOut',] },], "chartMouseOutEvent": [{ type: Output, args: ['phxChartMouseOut',] },], "dataTable": [{ type: Input },], "chartType": [{ type: Input },], "formatters": [{ type: Input },], "title": [{ type: Input },], "subtitle": [{ type: Input },], "options": [{ type: Input },], "width": [{ type: Input },], "height": [{ type: Input },], "cols": [{ type: Input },], "rows": [{ type: Input },], }; tslib_1.__decorate([ Option('chartReady'), tslib_1.__metadata("design:type", EventEmitter) ], PhloxChart.prototype, "chartReadyEvent", void 0); tslib_1.__decorate([ Option('chartError'), tslib_1.__metadata("design:type", EventEmitter) ], PhloxChart.prototype, "chartErrorEvent", void 0); tslib_1.__decorate([ Option('beforeChartSelect'), tslib_1.__metadata("design:type", EventEmitter) ], PhloxChart.prototype, "beforeChartSelectEvent", void 0); tslib_1.__decorate([ Option('chartSelect'), tslib_1.__metadata("design:type", EventEmitter) ], PhloxChart.prototype, "chartSelectEvent", void 0); tslib_1.__decorate([ Option('beforeChartMouseOver'), tslib_1.__metadata("design:type", EventEmitter) ], PhloxChart.prototype, "beforeChartMouseOverEvent", void 0); tslib_1.__decorate([ Option('chartMouseOver'), tslib_1.__metadata("design:type", EventEmitter) ], PhloxChart.prototype, "chartMouseOverEvent", void 0); tslib_1.__decorate([ Option('beforeChartMouseOut'), tslib_1.__metadata("design:type", EventEmitter) ], PhloxChart.prototype, "beforeChartMouseOutEvent", void 0); tslib_1.__decorate([ Option('chartMouseOut'), tslib_1.__metadata("design:type", EventEmitter) ], PhloxChart.prototype, "chartMouseOutEvent", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Array) ], PhloxChart.prototype, "dataTable", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], PhloxChart.prototype, "chartType", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Array) ], PhloxChart.prototype, "formatters", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], PhloxChart.prototype, "title", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], PhloxChart.prototype, "subtitle", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], PhloxChart.prototype, "options", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], PhloxChart.prototype, "width", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], PhloxChart.prototype, "height", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Array) ], PhloxChart.prototype, "cols", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Array) ], PhloxChart.prototype, "rows", void 0); return PhloxChart; }(AbstractDataView)); export { PhloxChart }; function PhloxChart_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ PhloxChart.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ PhloxChart.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ PhloxChart.propDecorators; /** @type {?} */ PhloxChart.TYPE_NAME; /** @type {?} */ PhloxChart.prototype.chartReadyEvent; /** @type {?} */ PhloxChart.prototype.chartErrorEvent; /** @type {?} */ PhloxChart.prototype.beforeChartSelectEvent; /** @type {?} */ PhloxChart.prototype.chartSelectEvent; /** @type {?} */ PhloxChart.prototype.beforeChartMouseOverEvent; /** @type {?} */ PhloxChart.prototype.chartMouseOverEvent; /** @type {?} */ PhloxChart.prototype.beforeChartMouseOutEvent; /** @type {?} */ PhloxChart.prototype.chartMouseOutEvent; /** @type {?} */ PhloxChart.prototype.dataTable; /** @type {?} */ PhloxChart.prototype.chartType; /** @type {?} */ PhloxChart.prototype.formatters; /** @type {?} */ PhloxChart.prototype.title; /** @type {?} */ PhloxChart.prototype.subtitle; /** @type {?} */ PhloxChart.prototype.options; /** @type {?} */ PhloxChart.prototype.width; /** @type {?} */ PhloxChart.prototype.height; /** @type {?} */ PhloxChart.prototype.cols; /** @type {?} */ PhloxChart.prototype.rows; /** @type {?} */ PhloxChart.prototype.model; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGhsb3hDaGFydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvZGF0YXZpZXcvUGhsb3hDaGFydC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFhLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFcEQsT0FBTyxFQUE4Ryx5QkFBeUIsRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbE8sT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWhELHFCQUFNLFNBQVMsR0FBVyxVQUFVLENBQUM7O0lBVUwsc0NBQWdCO0lBZ0U5QyxvQkFBWSxVQUFzQjtRQUFsQyxZQUNFLGtCQUFNLFVBQVUsQ0FBQyxTQVdsQjtRQVRDLEtBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMxQyxLQUFJLENBQUMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDMUMsS0FBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDakQsS0FBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDM0MsS0FBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDcEQsS0FBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDOUMsS0FBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbkQsS0FBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7O0tBRTlDOzs7O0lBRU0sNkJBQVE7Ozs7UUFDYixpQkFBTSxRQUFRLFdBQUUsQ0FBQztRQUVqQixFQUFFLENBQUEsQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUk7WUFDeEQsSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJO1lBQ3ZELElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSTtZQUM3QyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQU0sQ0FBQyxDQUFDLENBQUM7WUFDaEQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLG1CQUFtQixDQUNsQyxJQUFJLENBQUMsU0FBUyxFQUNkLElBQUksQ0FBQyxTQUFTLEVBQ2QsSUFBSSxDQUFDLFVBQVUsRUFDZixJQUFJLENBQUMsT0FBTyxFQUNaLElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxDQUFDLFFBQVEsRUFDYixJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksQ0FBQyxNQUFNLEVBQ1gsSUFBSSxDQUFDLElBQUksRUFDVCxJQUFJLENBQUMsSUFBSSxDQUNWLENBQUM7U0FDSDs7Ozs7SUFHRSxvQ0FBZTs7OztRQUNwQixNQUFNLENBQUMsS0FBSyxDQUFDOzs7Ozs7SUFHUixpQ0FBWTs7OztjQUFDLElBQVM7Ozs7O0lBSXRCLGtDQUFhOzs7Ozs7OztJQUliLDhCQUFTOzs7a0JBQXVCLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxNQUFNLElBQWEsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQU0sQ0FBQyxDQUFDOzs7O0lBQWEsNkJBQVE7Ozs7Ozs7OztJQUkzSCwrQkFBVTs7OztjQUFDLFNBQWdCO1FBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUNqQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzs7Ozs7OztJQUcvQyx1Q0FBa0I7Ozs7O2NBQUMsS0FBVSxFQUFFLFNBQW1COztRQUN2RCxFQUFFLENBQUMsQ0FBQyxTQUFTLEtBQUssSUFBSSxJQUFJLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2xELFNBQVMsR0FBRyxJQUFJLENBQUM7U0FDbEI7UUFFRCxVQUFVLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLHdCQUF3QixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBQyxNQUFhOztTQUU3RixFQUFFLFVBQUMsTUFBYTs7WUFFZixBQURBLGtCQUFrQjtZQUNsQixLQUFJLENBQUMsMEJBQTBCLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDekMsRUFBRSxVQUFDLE1BQWEsRUFBRSxNQUFXOztZQUU1QixBQURBLGlCQUFpQjtZQUNqQixLQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDbkMsRUFBRSxVQUFDLE1BQWE7O1NBRWhCLENBQUMsQ0FBQzs7Ozs7O0lBR0ssK0NBQTBCOzs7O0lBQXBDLFVBQXFDLE1BQWE7UUFDaEQscUJBQUksU0FBUyxHQUFRLElBQUksQ0FBQTs7UUFHekIscUJBQUksSUFBSSxHQUFRLFNBQVMsQ0FBQztRQUMxQixxQkFBSSxFQUFFLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRWxGLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLHNCQUFzQixLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDdEYsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN0QztLQUNGOzs7OztJQUVTLHlDQUFvQjs7OztJQUE5QixVQUErQixNQUFhO1FBQzFDLHFCQUFJLFNBQVMsR0FBUSxNQUFNLENBQUE7O1FBRzNCLHFCQUFJLElBQUksR0FBUSxTQUFTLENBQUM7UUFDMUIscUJBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQyxjQUFjLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUzRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDaEM7S0FDRjs7Ozs7SUFFUyx3Q0FBbUI7Ozs7SUFBN0IsVUFBOEIsTUFBYTtRQUN6QyxxQkFBSSxTQUFTLEdBQVEsSUFBSSxDQUFBOztRQUd6QixxQkFBSSxJQUFJLEdBQVEsU0FBUyxDQUFDO1FBQzFCLHFCQUFJLEVBQUUsR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRW5FLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMvQjtLQUNGOzs7OztJQUVTLHdDQUFtQjs7OztJQUE3QixVQUE4QixNQUFhO1FBQ3pDLHFCQUFJLFNBQVMsR0FBUSxJQUFJLENBQUE7O1FBR3pCLHFCQUFJLElBQUksR0FBUSxTQUFTLENBQUM7UUFDMUIscUJBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFbkUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQy9CO0tBQ0Y7Ozs7OztJQUVNLHNDQUFpQjs7Ozs7Y0FBQyxLQUFVLEVBQUUsU0FBbUI7UUFDdEQsRUFBRSxDQUFDLENBQUMsU0FBUyxLQUFLLElBQUksSUFBSSxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNsRCxTQUFTLEdBQUcsSUFBSSxDQUFDO1NBQ2xCO1FBRUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDOzs7Ozs7O0lBRzNCLHNDQUFpQjs7Ozs7Y0FBQyxLQUFVLEVBQUUsU0FBbUI7UUFDdEQsRUFBRSxDQUFDLENBQUMsU0FBUyxLQUFLLElBQUksSUFBSSxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNsRCxTQUFTLEdBQUcsSUFBSSxDQUFDO1NBQ2xCO1FBRUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDOzs7OztJQUczQix1Q0FBa0I7Ozs7UUFDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7Ozs7O0lBR3ZCLHVDQUFrQjs7OztRQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQzs7Ozs7SUFHdkIsd0NBQW1COzs7O1FBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7Ozs7O0lBR3hCLDJDQUFzQjs7OztRQUMzQixNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDOzs7OztJQUczQiwwQ0FBcUI7Ozs7UUFDMUIsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQzs7Ozs7O0lBRzFCLCtCQUFVOzs7O2NBQUMsT0FBWTtRQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDN0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDOzs7Ozs7SUFHakMsaUNBQVk7Ozs7Y0FBQyxTQUFpQjtRQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDakMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDOzs7Ozs7SUFHakMsNkJBQVE7Ozs7Y0FBQyxLQUFhO1FBQzNCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7Ozs7OztJQUdqQyxnQ0FBVzs7OztjQUFDLFFBQWdCO1FBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7Ozs7O0lBR2pDLDZCQUFROzs7O1FBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7Ozs7OztJQUdiLDZCQUFROzs7O2NBQUMsS0FBMEI7UUFDeEMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7OzJCQXRQc0IsU0FBUzs7Z0JBVnJELFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsTUFBTSxDQUFDLEVBQUU7b0JBQ25CLFFBQVEsRUFBRSxTQUFTO29CQUNuQixRQUFRLEVBQUUsK05BRUo7aUJBQ1A7Ozs7Z0JBakIyQixVQUFVOzs7b0NBd0JuQyxNQUFNLFNBQUMsZUFBZTtvQ0FHdEIsTUFBTSxTQUFDLGVBQWU7MkNBR3RCLE1BQU0sU0FBQyxzQkFBc0I7cUNBRzdCLE1BQU0sU0FBQyxnQkFBZ0I7OENBR3ZCLE1BQU0sU0FBQyx5QkFBeUI7d0NBR2hDLE1BQU0sU0FBQyxtQkFBbUI7NkNBRzFCLE1BQU0sU0FBQyx3QkFBd0I7dUNBRy9CLE1BQU0sU0FBQyxrQkFBa0I7OEJBR3pCLEtBQUs7OEJBR0wsS0FBSzsrQkFHTCxLQUFLOzBCQUdMLEtBQUs7NkJBR0wsS0FBSzs0QkFHTCxLQUFLOzBCQUdMLEtBQUs7MkJBR0wsS0FBSzt5QkFHTCxLQUFLO3lCQUdMLEtBQUs7OztRQXBETCxNQUFNLENBQUMsWUFBWSxDQUFDOzBDQUVNLFlBQVk7OztRQUN0QyxNQUFNLENBQUMsWUFBWSxDQUFDOzBDQUVNLFlBQVk7OztRQUN0QyxNQUFNLENBQUMsbUJBQW1CLENBQUM7MENBRU0sWUFBWTs7O1FBQzdDLE1BQU0sQ0FBQyxhQUFhLENBQUM7MENBRU0sWUFBWTs7O1FBQ3ZDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQzswQ0FFTSxZQUFZOzs7UUFDaEQsTUFBTSxDQUFDLGdCQUFnQixDQUFDOzBDQUVNLFlBQVk7OztRQUMxQyxNQUFNLENBQUMscUJBQXFCLENBQUM7MENBRU0sWUFBWTs7O1FBQy9DLE1BQU0sQ0FBQyxlQUFlLENBQUM7MENBRU0sWUFBWTs7O1FBR3pDLE1BQU0sRUFBRTs7OztRQUdSLE1BQU0sRUFBRTs7OztRQUdSLE1BQU0sRUFBRTs7OztRQUdSLE1BQU0sRUFBRTs7OztRQUdSLE1BQU0sRUFBRTs7OztRQUdSLE1BQU0sRUFBRTs7OztRQUdSLE1BQU0sRUFBRTs7OztRQUdSLE1BQU0sRUFBRTs7OztRQUdSLE1BQU0sRUFBRTs7OztRQUdSLE1BQU0sRUFBRTs7O3FCQTVFWDtFQW1CZ0MsZ0JBQWdCO1NBQW5DLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIFZpZXdDaGlsZCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWJzdHJhY3REYXRhVmlldyB9IGZyb20gJy4vQWJzdHJhY3REYXRhVmlldyc7XHJcbmltcG9ydCB7IElIYXNNb2RlbCB9IGZyb20gJy4uL0lIYXNNb2RlbCc7XHJcbmltcG9ydCB7IFBobG94RGF0YUNoYXJ0TW9kZWwgfSBmcm9tICcuLi8uL21vZGVsL21vZGVscyc7XHJcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uLy4uL2RlY29yYXRvci9kZWNvcmF0b3JzJztcclxuaW1wb3J0IHsgR29vZ2xlQ2hhcnRDb21wb25lbnQgfSBmcm9tICduZzItZ29vZ2xlLWNoYXJ0cyc7XHJcbmltcG9ydCB7IEJFRk9SRV9DSEFSVF9NT1VTRV9PVkVSX0VWRU5ULCBDSEFSVF9NT1VTRV9PVkVSX0VWRU5ULCBCRUZPUkVfQ0hBUlRfTU9VU0VfT1VUX0VWRU5ULCBDSEFSVF9NT1VTRV9PVVRfRVZFTlQsIEJFRk9SRV9DSEFSVF9TRUxFQ1RfRVZFTlQsIENIQVJUX1NFTEVDVF9FVkVOVCwgQ0hBUlRfRVJST1IsIENIQVJUX1JFQURZIH0gZnJvbSAnLi4vLi4vc2hhcmUvQ3VzdG9tRXZlbnRUeXBlJztcclxuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gJy4uLy4uL3NoYXJlL3NoYXJlcyc7XHJcblxyXG5jb25zdCBUWVBFX05BTUU6IHN0cmluZyA9IFwicGh4Q2hhcnRcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIG1vZHVsZUlkOiBtb2R1bGUuaWQsXHJcbiAgc2VsZWN0b3I6IFRZUEVfTkFNRSxcclxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJwaHhDaGFydFwiPlxyXG4gICAgPGdvb2dsZS1jaGFydCBbZGF0YV09XCJnZXRNb2RlbCgpXCIgKGNoYXJ0UmVhZHkpPVwib25DaGFydFJlYWR5RXZlbnQoJGV2ZW50KVwiIChjaGFydEVycm9yKT1cIm9uQ2hhcnRFcnJvckV2ZW50KCRldmVudClcIiAoY2hhcnRTZWxlY3QpPVwib25DaGFydFNlbGVjdEV2ZW50KCRldmVudClcIj48L2dvb2dsZS1jaGFydD5cclxuPC9kaXY+IGBcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBQaGxveENoYXJ0IGV4dGVuZHMgQWJzdHJhY3REYXRhVmlldyBpbXBsZW1lbnRzIElIYXNNb2RlbCwgT25Jbml0IHtcclxuXHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUWVBFX05BTUU6IHN0cmluZyA9IFRZUEVfTkFNRTtcclxuXHJcbiAgQE9wdGlvbignY2hhcnRSZWFkeScpXHJcbiAgQE91dHB1dCgncGh4Q2hhcnRSZWFkeScpXHJcbiAgcHJvdGVjdGVkIGNoYXJ0UmVhZHlFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignY2hhcnRFcnJvcicpXHJcbiAgQE91dHB1dCgncGh4Q2hhcnRFcnJvcicpXHJcbiAgcHJvdGVjdGVkIGNoYXJ0RXJyb3JFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignYmVmb3JlQ2hhcnRTZWxlY3QnKVxyXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUNoYXJ0U2VsZWN0JylcclxuICBwcm90ZWN0ZWQgYmVmb3JlQ2hhcnRTZWxlY3RFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignY2hhcnRTZWxlY3QnKVxyXG4gIEBPdXRwdXQoJ3BoeENoYXJ0U2VsZWN0JylcclxuICBwcm90ZWN0ZWQgY2hhcnRTZWxlY3RFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignYmVmb3JlQ2hhcnRNb3VzZU92ZXInKVxyXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUNoYXJ0TW91c2VPdmVyJylcclxuICBwcm90ZWN0ZWQgYmVmb3JlQ2hhcnRNb3VzZU92ZXJFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignY2hhcnRNb3VzZU92ZXInKVxyXG4gIEBPdXRwdXQoJ3BoeENoYXJ0TW91c2VPdmVyJylcclxuICBwcm90ZWN0ZWQgY2hhcnRNb3VzZU92ZXJFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignYmVmb3JlQ2hhcnRNb3VzZU91dCcpXHJcbiAgQE91dHB1dCgncGh4QmVmb3JlQ2hhcnRNb3VzZU91dCcpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZUNoYXJ0TW91c2VPdXRFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignY2hhcnRNb3VzZU91dCcpXHJcbiAgQE91dHB1dCgncGh4Q2hhcnRNb3VzZU91dCcpXHJcbiAgcHJvdGVjdGVkIGNoYXJ0TW91c2VPdXRFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRhdGFUYWJsZTogYW55W107XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgY2hhcnRUeXBlOiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZm9ybWF0dGVyczogYW55W107XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgdGl0bGUgOiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgc3VidGl0bGU6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBvcHRpb25zOiBhbnk7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgd2lkdGg6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBoZWlnaHQ6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBjb2xzOiBhbnlbXTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCByb3dzOiBhbnlbXTtcclxuXHJcbiAgLy8gICBwcm90ZWN0ZWQgY2hhcnRXcmFwcGVyOiBDaGFydFdyYXBwZXI7XHJcbiAgcHJvdGVjdGVkIG1vZGVsOiBQaGxveERhdGFDaGFydE1vZGVsO1xyXG5cclxuXHJcbiAgY29uc3RydWN0b3IoZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xyXG4gICAgc3VwZXIoZWxlbWVudFJlZik7XHJcblxyXG4gICAgdGhpcy5jaGFydFJlYWR5RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7IC8vIGJlZm9yZSBldmVudCBpcyBub3QgcmVxdWlyZVxyXG4gICAgdGhpcy5jaGFydEVycm9yRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7IC8vIGJlZm9yZSBldmVudCBpcyBub3QgcmVxdWlyZVxyXG4gICAgdGhpcy5iZWZvcmVDaGFydFNlbGVjdEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5jaGFydFNlbGVjdEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5iZWZvcmVDaGFydE1vdXNlT3ZlckV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5jaGFydE1vdXNlT3ZlckV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5iZWZvcmVDaGFydE1vdXNlT3V0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICB0aGlzLmNoYXJ0TW91c2VPdXRFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG5cclxuICAgIGlmKHRoaXMuY2hhcnRUeXBlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5jaGFydFR5cGUgIT09IG51bGwgJiZcclxuICAgICAgdGhpcy5kYXRhVGFibGUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmRhdGFUYWJsZSAhPT0gbnVsbCAmJlxyXG4gICAgICB0aGlzLmNvbHMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmNvbHMgIT09IG51bGwgJiZcclxuICAgICAgdGhpcy5yb3dzICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yb3dzICE9PSBudWxsICApIHtcclxuICAgICAgICB0aGlzLm1vZGVsID0gbmV3IFBobG94RGF0YUNoYXJ0TW9kZWwoXHJcbiAgICAgICAgICB0aGlzLmNoYXJ0VHlwZSxcclxuICAgICAgICAgIHRoaXMuZGF0YVRhYmxlLFxyXG4gICAgICAgICAgdGhpcy5mb3JtYXR0ZXJzLFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLFxyXG4gICAgICAgICAgdGhpcy50aXRsZSxcclxuICAgICAgICAgIHRoaXMuc3VidGl0bGUsXHJcbiAgICAgICAgICB0aGlzLndpZHRoLFxyXG4gICAgICAgICAgdGhpcy5oZWlnaHQsXHJcbiAgICAgICAgICB0aGlzLmNvbHMsXHJcbiAgICAgICAgICB0aGlzLnJvd3NcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNTZWxmRGF0YURpcnR5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbGZTYXZlRGF0YShkYXRhOiBhbnkpOiB2b2lkIHtcclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VsZlJlc2V0RGF0YSgpOiB2b2lkIHtcclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZG9QcmVsb2FkKCk6IFByb21pc2U8YW55PiB7ICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAgICAgICByZXNvbHZlKG51bGwpOyAgICAgfSk7ICAgfSAgcHVibGljIGRvTG9hZGVkKCk6IHZvaWQge1xyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWxvYWREYXRhKGRhdGFUYWJsZTogYW55W10pOiB2b2lkIHtcclxuICAgIHRoaXMubW9kZWwuZGF0YVRhYmxlID0gZGF0YVRhYmxlO1xyXG4gICAgdGhpcy5tb2RlbCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5tb2RlbCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2hhcnRTZWxlY3RFdmVudChldmVudDogYW55LCBmaXJlRXZlbnQ/OiBib29sZWFuKSB7XHJcbiAgICBpZiAoZmlyZUV2ZW50ID09PSBudWxsIHx8IGZpcmVFdmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGZpcmVFdmVudCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgRXZlbnRVdGlscy5oYW5kbGVCcm93c2VyRXZlbnQodGhpcywgJ2JlZm9yZUNoYXJ0U2VsZWN0RXZlbnQnLCBldmVudCwgZmlyZUV2ZW50LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBkb0V2ZW50XHJcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBlbWl0QmVmb3JlRXZlbnRcclxuICAgICAgdGhpcy5lbWl0QmVmb3JlQ2hhcnRTZWxlY3RFdmVudCgkZXZlbnQpO1xyXG4gICAgfSwgKCRldmVudDogRXZlbnQsIHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgIC8vIGVtaXRBZnRlckV2ZW50XHJcbiAgICAgIHRoaXMuZW1pdENoYXJ0U2VsZWN0RXZlbnQoJGV2ZW50KTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIGRvUHJldmVudGVkXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBlbWl0QmVmb3JlQ2hhcnRTZWxlY3RFdmVudCgkZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBsZXQgZXZlbnREYXRhOiBhbnkgPSBudWxsXHJcblxyXG4gICAgLy8gZW1pdCBldmVudFxyXG4gICAgbGV0IGRhdGE6IGFueSA9IGV2ZW50RGF0YTtcclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX0NIQVJUX1NFTEVDVF9FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcclxuXHJcbiAgICBpZiAodGhpcy5iZWZvcmVDaGFydFNlbGVjdEV2ZW50ICE9PSBudWxsICYmIHRoaXMuYmVmb3JlQ2hhcnRTZWxlY3RFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuYmVmb3JlQ2hhcnRTZWxlY3RFdmVudC5lbWl0KGV2KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBlbWl0Q2hhcnRTZWxlY3RFdmVudCgkZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBsZXQgZXZlbnREYXRhOiBhbnkgPSAkZXZlbnRcclxuXHJcbiAgICAvLyBlbWl0IGV2ZW50XHJcbiAgICBsZXQgZGF0YTogYW55ID0gZXZlbnREYXRhO1xyXG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChDSEFSVF9TRUxFQ1RfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnRTZWxlY3RFdmVudCAhPT0gbnVsbCAmJiB0aGlzLmNoYXJ0U2VsZWN0RXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmNoYXJ0U2VsZWN0RXZlbnQuZW1pdChldik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdENoYXJ0UmVhZHlFdmVudCgkZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBsZXQgZXZlbnREYXRhOiBhbnkgPSBudWxsXHJcblxyXG4gICAgLy8gZW1pdCBldmVudFxyXG4gICAgbGV0IGRhdGE6IGFueSA9IGV2ZW50RGF0YTtcclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQ0hBUlRfUkVBRFksIHRoaXMsIGRhdGEsIGV2ZW50KTtcclxuXHJcbiAgICBpZiAodGhpcy5jaGFydFJlYWR5RXZlbnQgIT09IG51bGwgJiYgdGhpcy5jaGFydFJlYWR5RXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmNoYXJ0UmVhZHlFdmVudC5lbWl0KGV2KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBlbWl0Q2hhcnRFcnJvckV2ZW50KCRldmVudDogRXZlbnQpIHtcclxuICAgIGxldCBldmVudERhdGE6IGFueSA9IG51bGxcclxuXHJcbiAgICAvLyBlbWl0IGV2ZW50XHJcbiAgICBsZXQgZGF0YTogYW55ID0gZXZlbnREYXRhO1xyXG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChDSEFSVF9FUlJPUiwgdGhpcywgZGF0YSwgZXZlbnQpO1xyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0RXJyb3JFdmVudCAhPT0gbnVsbCAmJiB0aGlzLmNoYXJ0RXJyb3JFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuY2hhcnRFcnJvckV2ZW50LmVtaXQoZXYpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2hhcnRSZWFkeUV2ZW50KGV2ZW50OiBhbnksIGZpcmVFdmVudD86IGJvb2xlYW4pIHtcclxuICAgIGlmIChmaXJlRXZlbnQgPT09IG51bGwgfHwgZmlyZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgZmlyZUV2ZW50ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVtaXRDaGFydFJlYWR5RXZlbnQoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2hhcnRFcnJvckV2ZW50KGV2ZW50OiBhbnksIGZpcmVFdmVudD86IGJvb2xlYW4pIHtcclxuICAgIGlmIChmaXJlRXZlbnQgPT09IG51bGwgfHwgZmlyZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgZmlyZUV2ZW50ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVtaXRDaGFydEVycm9yRXZlbnQoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldGNoYXJ0UmVhZHlFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGFydFJlYWR5RXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Y2hhcnRFcnJvckV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmNoYXJ0RXJyb3JFdmVudDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRjaGFydFNlbGVjdEV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmNoYXJ0U2VsZWN0RXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Y2hhcnRNb3VzZU92ZXJFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGFydE1vdXNlT3ZlckV2ZW50O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldGNoYXJ0TW91c2VPdXRFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGFydE1vdXNlT3V0RXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0T3B0aW9ucyhvcHRpb25zOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMubW9kZWwub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICB0aGlzLnJlbG9hZERhdGEodGhpcy5tb2RlbC5kYXRhVGFibGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldENoYXJ0VHlwZShjaGFydFR5cGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5tb2RlbC5jaGFydFR5cGUgPSBjaGFydFR5cGU7XHJcbiAgICB0aGlzLnJlbG9hZERhdGEodGhpcy5tb2RlbC5kYXRhVGFibGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFRpdGxlKHRpdGxlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMubW9kZWwudGl0bGUgPSB0aXRsZTtcclxuICAgIHRoaXMucmVsb2FkRGF0YSh0aGlzLm1vZGVsLmRhdGFUYWJsZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0U3VidGl0bGUoc3VidGl0bGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5tb2RlbC5zdWJ0aXRsZSA9IHN1YnRpdGxlO1xyXG4gICAgdGhpcy5yZWxvYWREYXRhKHRoaXMubW9kZWwuZGF0YVRhYmxlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRNb2RlbCgpOiBQaGxveERhdGFDaGFydE1vZGVsIHtcclxuICAgIHJldHVybiB0aGlzLm1vZGVsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldE1vZGVsKG1vZGVsOiBQaGxveERhdGFDaGFydE1vZGVsKTogdm9pZCB7XHJcbiAgICB0aGlzLm1vZGVsID0gbW9kZWw7XHJcbiAgfVxyXG59XHJcbiJdfQ==