com.phloxui
Version:
PhloxUI Ng2+ Framework
403 lines (402 loc) • 31.9 kB
JavaScript
/**
* @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';
const /** @type {?} */ TYPE_NAME = "phxChart";
export class PhloxChart extends AbstractDataView {
/**
* @param {?} elementRef
*/
constructor(elementRef) {
super(elementRef);
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 {?}
*/
ngOnInit() {
super.ngOnInit();
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 {?}
*/
isSelfDataDirty() {
return false;
}
/**
* @param {?} data
* @return {?}
*/
selfSaveData(data) {
}
/**
* @return {?}
*/
selfResetData() {
}
/**
* @return {?}
*/
doPreload() { return new Promise((resolve, reject) => { resolve(null); }); }
/**
* @return {?}
*/
doLoaded() {
}
/**
* @param {?} dataTable
* @return {?}
*/
reloadData(dataTable) {
this.model.dataTable = dataTable;
this.model = JSON.parse(JSON.stringify(this.model));
}
/**
* @param {?} event
* @param {?=} fireEvent
* @return {?}
*/
onChartSelectEvent(event, fireEvent) {
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
EventUtils.handleBrowserEvent(this, 'beforeChartSelectEvent', event, fireEvent, ($event) => {
// doEvent
}, ($event) => {
// emitBeforeEvent
this.emitBeforeChartSelectEvent($event);
}, ($event, result) => {
// emitAfterEvent
this.emitChartSelectEvent($event);
}, ($event) => {
// doPrevented
});
}
/**
* @param {?} $event
* @return {?}
*/
emitBeforeChartSelectEvent($event) {
let /** @type {?} */ eventData = null;
// emit event
let /** @type {?} */ data = eventData;
let /** @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 {?}
*/
emitChartSelectEvent($event) {
let /** @type {?} */ eventData = $event;
// emit event
let /** @type {?} */ data = eventData;
let /** @type {?} */ ev = EventUtils.newCustomEvent(CHART_SELECT_EVENT, this, data, $event);
if (this.chartSelectEvent !== null && this.chartSelectEvent !== undefined) {
this.chartSelectEvent.emit(ev);
}
}
/**
* @param {?} $event
* @return {?}
*/
emitChartReadyEvent($event) {
let /** @type {?} */ eventData = null;
// emit event
let /** @type {?} */ data = eventData;
let /** @type {?} */ ev = EventUtils.newCustomEvent(CHART_READY, this, data, event);
if (this.chartReadyEvent !== null && this.chartReadyEvent !== undefined) {
this.chartReadyEvent.emit(ev);
}
}
/**
* @param {?} $event
* @return {?}
*/
emitChartErrorEvent($event) {
let /** @type {?} */ eventData = null;
// emit event
let /** @type {?} */ data = eventData;
let /** @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 {?}
*/
onChartReadyEvent(event, fireEvent) {
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
this.emitChartReadyEvent(event);
}
/**
* @param {?} event
* @param {?=} fireEvent
* @return {?}
*/
onChartErrorEvent(event, fireEvent) {
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
this.emitChartErrorEvent(event);
}
/**
* @return {?}
*/
getchartReadyEvent() {
return this.chartReadyEvent;
}
/**
* @return {?}
*/
getchartErrorEvent() {
return this.chartErrorEvent;
}
/**
* @return {?}
*/
getchartSelectEvent() {
return this.chartSelectEvent;
}
/**
* @return {?}
*/
getchartMouseOverEvent() {
return this.chartMouseOverEvent;
}
/**
* @return {?}
*/
getchartMouseOutEvent() {
return this.chartMouseOutEvent;
}
/**
* @param {?} options
* @return {?}
*/
setOptions(options) {
this.model.options = options;
this.reloadData(this.model.dataTable);
}
/**
* @param {?} chartType
* @return {?}
*/
setChartType(chartType) {
this.model.chartType = chartType;
this.reloadData(this.model.dataTable);
}
/**
* @param {?} title
* @return {?}
*/
setTitle(title) {
this.model.title = title;
this.reloadData(this.model.dataTable);
}
/**
* @param {?} subtitle
* @return {?}
*/
setSubtitle(subtitle) {
this.model.subtitle = subtitle;
this.reloadData(this.model.dataTable);
}
/**
* @return {?}
*/
getModel() {
return this.model;
}
/**
* @param {?} model
* @return {?}
*/
setModel(model) {
this.model = model;
}
}
PhloxChart.TYPE_NAME = TYPE_NAME;
PhloxChart.decorators = [
{ type: Component, args: [{
moduleId: module.id,
selector: TYPE_NAME,
template: `<div class="phxChart">
<google-chart [data]="getModel()" (chartReady)="onChartReadyEvent($event)" (chartError)="onChartErrorEvent($event)" (chartSelect)="onChartSelectEvent($event)"></google-chart>
</div> `
},] },
];
/** @nocollapse */
PhloxChart.ctorParameters = () => [
{ 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);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGhsb3hDaGFydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvZGF0YXZpZXcvUGhsb3hDaGFydC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFhLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFcEQsT0FBTyxFQUE4Ryx5QkFBeUIsRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbE8sT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWhELHVCQUFNLFNBQVMsR0FBVyxVQUFVLENBQUM7QUFVckMsTUFBTSxpQkFBa0IsU0FBUSxnQkFBZ0I7Ozs7SUFnRTlDLFlBQVksVUFBc0I7UUFDaEMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRWxCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDOUMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbkQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7S0FFOUM7Ozs7SUFFTSxRQUFRO1FBQ2IsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRWpCLEVBQUUsQ0FBQSxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSTtZQUN4RCxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUk7WUFDdkQsSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJO1lBQzdDLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBTSxDQUFDLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksbUJBQW1CLENBQ2xDLElBQUksQ0FBQyxTQUFTLEVBQ2QsSUFBSSxDQUFDLFNBQVMsRUFDZCxJQUFJLENBQUMsVUFBVSxFQUNmLElBQUksQ0FBQyxPQUFPLEVBQ1osSUFBSSxDQUFDLEtBQUssRUFDVixJQUFJLENBQUMsUUFBUSxFQUNiLElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLENBQUMsSUFBSSxFQUNULElBQUksQ0FBQyxJQUFJLENBQ1YsQ0FBQztTQUNIOzs7OztJQUdFLGVBQWU7UUFDcEIsTUFBTSxDQUFDLEtBQUssQ0FBQzs7Ozs7O0lBR1IsWUFBWSxDQUFDLElBQVM7Ozs7O0lBSXRCLGFBQWE7Ozs7O0lBSWIsU0FBUyxLQUF1QixNQUFNLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsR0FBUyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBTSxDQUFDLENBQUM7Ozs7SUFBYSxRQUFROzs7Ozs7SUFJM0gsVUFBVSxDQUFDLFNBQWdCO1FBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUNqQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzs7Ozs7OztJQUcvQyxrQkFBa0IsQ0FBQyxLQUFVLEVBQUUsU0FBbUI7UUFDdkQsRUFBRSxDQUFDLENBQUMsU0FBUyxLQUFLLElBQUksSUFBSSxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNsRCxTQUFTLEdBQUcsSUFBSSxDQUFDO1NBQ2xCO1FBRUQsVUFBVSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSx3QkFBd0IsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUMsTUFBYSxFQUFFLEVBQUU7O1NBRWpHLEVBQUUsQ0FBQyxNQUFhLEVBQUUsRUFBRTs7WUFFbkIsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3pDLEVBQUUsQ0FBQyxNQUFhLEVBQUUsTUFBVyxFQUFFLEVBQUU7O1lBRWhDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNuQyxFQUFFLENBQUMsTUFBYSxFQUFFLEVBQUU7O1NBRXBCLENBQUMsQ0FBQzs7Ozs7O0lBR0ssMEJBQTBCLENBQUMsTUFBYTtRQUNoRCxxQkFBSSxTQUFTLEdBQVEsSUFBSSxDQUFBOztRQUd6QixxQkFBSSxJQUFJLEdBQVEsU0FBUyxDQUFDO1FBQzFCLHFCQUFJLEVBQUUsR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLHlCQUF5QixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFbEYsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsc0JBQXNCLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN0RixJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3RDO0tBQ0Y7Ozs7O0lBRVMsb0JBQW9CLENBQUMsTUFBYTtRQUMxQyxxQkFBSSxTQUFTLEdBQVEsTUFBTSxDQUFBOztRQUczQixxQkFBSSxJQUFJLEdBQVEsU0FBUyxDQUFDO1FBQzFCLHFCQUFJLEVBQUUsR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLGtCQUFrQixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFM0UsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMxRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2hDO0tBQ0Y7Ozs7O0lBRVMsbUJBQW1CLENBQUMsTUFBYTtRQUN6QyxxQkFBSSxTQUFTLEdBQVEsSUFBSSxDQUFBOztRQUd6QixxQkFBSSxJQUFJLEdBQVEsU0FBUyxDQUFDO1FBQzFCLHFCQUFJLEVBQUUsR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRW5FLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMvQjtLQUNGOzs7OztJQUVTLG1CQUFtQixDQUFDLE1BQWE7UUFDekMscUJBQUksU0FBUyxHQUFRLElBQUksQ0FBQTs7UUFHekIscUJBQUksSUFBSSxHQUFRLFNBQVMsQ0FBQztRQUMxQixxQkFBSSxFQUFFLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVuRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDeEUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDL0I7S0FDRjs7Ozs7O0lBRU0saUJBQWlCLENBQUMsS0FBVSxFQUFFLFNBQW1CO1FBQ3RELEVBQUUsQ0FBQyxDQUFDLFNBQVMsS0FBSyxJQUFJLElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDbEQsU0FBUyxHQUFHLElBQUksQ0FBQztTQUNsQjtRQUVELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQzs7Ozs7OztJQUczQixpQkFBaUIsQ0FBQyxLQUFVLEVBQUUsU0FBbUI7UUFDdEQsRUFBRSxDQUFDLENBQUMsU0FBUyxLQUFLLElBQUksSUFBSSxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNsRCxTQUFTLEdBQUcsSUFBSSxDQUFDO1NBQ2xCO1FBRUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDOzs7OztJQUczQixrQkFBa0I7UUFDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7Ozs7O0lBR3ZCLGtCQUFrQjtRQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQzs7Ozs7SUFHdkIsbUJBQW1CO1FBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7Ozs7O0lBR3hCLHNCQUFzQjtRQUMzQixNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDOzs7OztJQUczQixxQkFBcUI7UUFDMUIsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQzs7Ozs7O0lBRzFCLFVBQVUsQ0FBQyxPQUFZO1FBQzVCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUM3QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7Ozs7OztJQUdqQyxZQUFZLENBQUMsU0FBaUI7UUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQzs7Ozs7O0lBR2pDLFFBQVEsQ0FBQyxLQUFhO1FBQzNCLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7Ozs7OztJQUdqQyxXQUFXLENBQUMsUUFBZ0I7UUFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQzs7Ozs7SUFHakMsUUFBUTtRQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDOzs7Ozs7SUFHYixRQUFRLENBQUMsS0FBMEI7UUFDeEMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Ozt1QkF0UHNCLFNBQVM7O1lBVnJELFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsTUFBTSxDQUFDLEVBQUU7Z0JBQ25CLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixRQUFRLEVBQUU7O1FBRUo7YUFDUDs7OztZQWpCMkIsVUFBVTs7O2dDQXdCbkMsTUFBTSxTQUFDLGVBQWU7Z0NBR3RCLE1BQU0sU0FBQyxlQUFlO3VDQUd0QixNQUFNLFNBQUMsc0JBQXNCO2lDQUc3QixNQUFNLFNBQUMsZ0JBQWdCOzBDQUd2QixNQUFNLFNBQUMseUJBQXlCO29DQUdoQyxNQUFNLFNBQUMsbUJBQW1CO3lDQUcxQixNQUFNLFNBQUMsd0JBQXdCO21DQUcvQixNQUFNLFNBQUMsa0JBQWtCOzBCQUd6QixLQUFLOzBCQUdMLEtBQUs7MkJBR0wsS0FBSztzQkFHTCxLQUFLO3lCQUdMLEtBQUs7d0JBR0wsS0FBSztzQkFHTCxLQUFLO3VCQUdMLEtBQUs7cUJBR0wsS0FBSztxQkFHTCxLQUFLOzs7SUFwREwsTUFBTSxDQUFDLFlBQVksQ0FBQztzQ0FFTSxZQUFZOzs7SUFDdEMsTUFBTSxDQUFDLFlBQVksQ0FBQztzQ0FFTSxZQUFZOzs7SUFDdEMsTUFBTSxDQUFDLG1CQUFtQixDQUFDO3NDQUVNLFlBQVk7OztJQUM3QyxNQUFNLENBQUMsYUFBYSxDQUFDO3NDQUVNLFlBQVk7OztJQUN2QyxNQUFNLENBQUMsc0JBQXNCLENBQUM7c0NBRU0sWUFBWTs7O0lBQ2hELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztzQ0FFTSxZQUFZOzs7SUFDMUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDO3NDQUVNLFlBQVk7OztJQUMvQyxNQUFNLENBQUMsZUFBZSxDQUFDO3NDQUVNLFlBQVk7OztJQUd6QyxNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIFZpZXdDaGlsZCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWJzdHJhY3REYXRhVmlldyB9IGZyb20gJy4vQWJzdHJhY3REYXRhVmlldyc7XHJcbmltcG9ydCB7IElIYXNNb2RlbCB9IGZyb20gJy4uL0lIYXNNb2RlbCc7XHJcbmltcG9ydCB7IFBobG94RGF0YUNoYXJ0TW9kZWwgfSBmcm9tICcuLi8uL21vZGVsL21vZGVscyc7XHJcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uLy4uL2RlY29yYXRvci9kZWNvcmF0b3JzJztcclxuaW1wb3J0IHsgR29vZ2xlQ2hhcnRDb21wb25lbnQgfSBmcm9tICduZzItZ29vZ2xlLWNoYXJ0cyc7XHJcbmltcG9ydCB7IEJFRk9SRV9DSEFSVF9NT1VTRV9PVkVSX0VWRU5ULCBDSEFSVF9NT1VTRV9PVkVSX0VWRU5ULCBCRUZPUkVfQ0hBUlRfTU9VU0VfT1VUX0VWRU5ULCBDSEFSVF9NT1VTRV9PVVRfRVZFTlQsIEJFRk9SRV9DSEFSVF9TRUxFQ1RfRVZFTlQsIENIQVJUX1NFTEVDVF9FVkVOVCwgQ0hBUlRfRVJST1IsIENIQVJUX1JFQURZIH0gZnJvbSAnLi4vLi4vc2hhcmUvQ3VzdG9tRXZlbnRUeXBlJztcclxuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gJy4uLy4uL3NoYXJlL3NoYXJlcyc7XHJcblxyXG5jb25zdCBUWVBFX05BTUU6IHN0cmluZyA9IFwicGh4Q2hhcnRcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIG1vZHVsZUlkOiBtb2R1bGUuaWQsXHJcbiAgc2VsZWN0b3I6IFRZUEVfTkFNRSxcclxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJwaHhDaGFydFwiPlxyXG4gICAgPGdvb2dsZS1jaGFydCBbZGF0YV09XCJnZXRNb2RlbCgpXCIgKGNoYXJ0UmVhZHkpPVwib25DaGFydFJlYWR5RXZlbnQoJGV2ZW50KVwiIChjaGFydEVycm9yKT1cIm9uQ2hhcnRFcnJvckV2ZW50KCRldmVudClcIiAoY2hhcnRTZWxlY3QpPVwib25DaGFydFNlbGVjdEV2ZW50KCRldmVudClcIj48L2dvb2dsZS1jaGFydD5cclxuPC9kaXY+IGBcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBQaGxveENoYXJ0IGV4dGVuZHMgQWJzdHJhY3REYXRhVmlldyBpbXBsZW1lbnRzIElIYXNNb2RlbCwgT25Jbml0IHtcclxuXHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUWVBFX05BTUU6IHN0cmluZyA9IFRZUEVfTkFNRTtcclxuXHJcbiAgQE9wdGlvbignY2hhcnRSZWFkeScpXHJcbiAgQE91dHB1dCgncGh4Q2hhcnRSZWFkeScpXHJcbiAgcHJvdGVjdGVkIGNoYXJ0UmVhZHlFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignY2hhcnRFcnJvcicpXHJcbiAgQE91dHB1dCgncGh4Q2hhcnRFcnJvcicpXHJcbiAgcHJvdGVjdGVkIGNoYXJ0RXJyb3JFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignYmVmb3JlQ2hhcnRTZWxlY3QnKVxyXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUNoYXJ0U2VsZWN0JylcclxuICBwcm90ZWN0ZWQgYmVmb3JlQ2hhcnRTZWxlY3RFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignY2hhcnRTZWxlY3QnKVxyXG4gIEBPdXRwdXQoJ3BoeENoYXJ0U2VsZWN0JylcclxuICBwcm90ZWN0ZWQgY2hhcnRTZWxlY3RFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignYmVmb3JlQ2hhcnRNb3VzZU92ZXInKVxyXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUNoYXJ0TW91c2VPdmVyJylcclxuICBwcm90ZWN0ZWQgYmVmb3JlQ2hhcnRNb3VzZU92ZXJFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignY2hhcnRNb3VzZU92ZXInKVxyXG4gIEBPdXRwdXQoJ3BoeENoYXJ0TW91c2VPdmVyJylcclxuICBwcm90ZWN0ZWQgY2hhcnRNb3VzZU92ZXJFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignYmVmb3JlQ2hhcnRNb3VzZU91dCcpXHJcbiAgQE91dHB1dCgncGh4QmVmb3JlQ2hhcnRNb3VzZU91dCcpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZUNoYXJ0TW91c2VPdXRFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignY2hhcnRNb3VzZU91dCcpXHJcbiAgQE91dHB1dCgncGh4Q2hhcnRNb3VzZU91dCcpXHJcbiAgcHJvdGVjdGVkIGNoYXJ0TW91c2VPdXRFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRhdGFUYWJsZTogYW55W107XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgY2hhcnRUeXBlOiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZm9ybWF0dGVyczogYW55W107XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgdGl0bGUgOiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgc3VidGl0bGU6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBvcHRpb25zOiBhbnk7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgd2lkdGg6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBoZWlnaHQ6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBjb2xzOiBhbnlbXTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCByb3dzOiBhbnlbXTtcclxuXHJcbiAgLy8gICBwcm90ZWN0ZWQgY2hhcnRXcmFwcGVyOiBDaGFydFdyYXBwZXI7XHJcbiAgcHJvdGVjdGVkIG1vZGVsOiBQaGxveERhdGFDaGFydE1vZGVsO1xyXG5cclxuXHJcbiAgY29uc3RydWN0b3IoZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xyXG4gICAgc3VwZXIoZWxlbWVudFJlZik7XHJcblxyXG4gICAgdGhpcy5jaGFydFJlYWR5RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7IC8vIGJlZm9yZSBldmVudCBpcyBub3QgcmVxdWlyZVxyXG4gICAgdGhpcy5jaGFydEVycm9yRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7IC8vIGJlZm9yZSBldmVudCBpcyBub3QgcmVxdWlyZVxyXG4gICAgdGhpcy5iZWZvcmVDaGFydFNlbGVjdEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5jaGFydFNlbGVjdEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5iZWZvcmVDaGFydE1vdXNlT3ZlckV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5jaGFydE1vdXNlT3ZlckV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5iZWZvcmVDaGFydE1vdXNlT3V0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICB0aGlzLmNoYXJ0TW91c2VPdXRFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG5cclxuICAgIGlmKHRoaXMuY2hhcnRUeXBlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5jaGFydFR5cGUgIT09IG51bGwgJiZcclxuICAgICAgdGhpcy5kYXRhVGFibGUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmRhdGFUYWJsZSAhPT0gbnVsbCAmJlxyXG4gICAgICB0aGlzLmNvbHMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmNvbHMgIT09IG51bGwgJiZcclxuICAgICAgdGhpcy5yb3dzICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yb3dzICE9PSBudWxsICApIHtcclxuICAgICAgICB0aGlzLm1vZGVsID0gbmV3IFBobG94RGF0YUNoYXJ0TW9kZWwoXHJcbiAgICAgICAgICB0aGlzLmNoYXJ0VHlwZSxcclxuICAgICAgICAgIHRoaXMuZGF0YVRhYmxlLFxyXG4gICAgICAgICAgdGhpcy5mb3JtYXR0ZXJzLFxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLFxyXG4gICAgICAgICAgdGhpcy50aXRsZSxcclxuICAgICAgICAgIHRoaXMuc3VidGl0bGUsXHJcbiAgICAgICAgICB0aGlzLndpZHRoLFxyXG4gICAgICAgICAgdGhpcy5oZWlnaHQsXHJcbiAgICAgICAgICB0aGlzLmNvbHMsXHJcbiAgICAgICAgICB0aGlzLnJvd3NcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNTZWxmRGF0YURpcnR5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbGZTYXZlRGF0YShkYXRhOiBhbnkpOiB2b2lkIHtcclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VsZlJlc2V0RGF0YSgpOiB2b2lkIHtcclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZG9QcmVsb2FkKCk6IFByb21pc2U8YW55PiB7ICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAgICAgICByZXNvbHZlKG51bGwpOyAgICAgfSk7ICAgfSAgcHVibGljIGRvTG9hZGVkKCk6IHZvaWQge1xyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWxvYWREYXRhKGRhdGFUYWJsZTogYW55W10pOiB2b2lkIHtcclxuICAgIHRoaXMubW9kZWwuZGF0YVRhYmxlID0gZGF0YVRhYmxlO1xyXG4gICAgdGhpcy5tb2RlbCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5tb2RlbCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2hhcnRTZWxlY3RFdmVudChldmVudDogYW55LCBmaXJlRXZlbnQ/OiBib29sZWFuKSB7XHJcbiAgICBpZiAoZmlyZUV2ZW50ID09PSBudWxsIHx8IGZpcmVFdmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGZpcmVFdmVudCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgRXZlbnRVdGlscy5oYW5kbGVCcm93c2VyRXZlbnQodGhpcywgJ2JlZm9yZUNoYXJ0U2VsZWN0RXZlbnQnLCBldmVudCwgZmlyZUV2ZW50LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBkb0V2ZW50XHJcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBlbWl0QmVmb3JlRXZlbnRcclxuICAgICAgdGhpcy5lbWl0QmVmb3JlQ2hhcnRTZWxlY3RFdmVudCgkZXZlbnQpO1xyXG4gICAgfSwgKCRldmVudDogRXZlbnQsIHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgIC8vIGVtaXRBZnRlckV2ZW50XHJcbiAgICAgIHRoaXMuZW1pdENoYXJ0U2VsZWN0RXZlbnQoJGV2ZW50KTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIGRvUHJldmVudGVkXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBlbWl0QmVmb3JlQ2hhcnRTZWxlY3RFdmVudCgkZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBsZXQgZXZlbnREYXRhOiBhbnkgPSBudWxsXHJcblxyXG4gICAgLy8gZW1pdCBldmVudFxyXG4gICAgbGV0IGRhdGE6IGFueSA9IGV2ZW50RGF0YTtcclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX0NIQVJUX1NFTEVDVF9FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcclxuXHJcbiAgICBpZiAodGhpcy5iZWZvcmVDaGFydFNlbGVjdEV2ZW50ICE9PSBudWxsICYmIHRoaXMuYmVmb3JlQ2hhcnRTZWxlY3RFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuYmVmb3JlQ2hhcnRTZWxlY3RFdmVudC5lbWl0KGV2KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBlbWl0Q2hhcnRTZWxlY3RFdmVudCgkZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBsZXQgZXZlbnREYXRhOiBhbnkgPSAkZXZlbnRcclxuXHJcbiAgICAvLyBlbWl0IGV2ZW50XHJcbiAgICBsZXQgZGF0YTogYW55ID0gZXZlbnREYXRhO1xyXG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChDSEFSVF9TRUxFQ1RfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnRTZWxlY3RFdmVudCAhPT0gbnVsbCAmJiB0aGlzLmNoYXJ0U2VsZWN0RXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmNoYXJ0U2VsZWN0RXZlbnQuZW1pdChldik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdENoYXJ0UmVhZHlFdmVudCgkZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBsZXQgZXZlbnREYXRhOiBhbnkgPSBudWxsXHJcblxyXG4gICAgLy8gZW1pdCBldmVudFxyXG4gICAgbGV0IGRhdGE6IGFueSA9IGV2ZW50RGF0YTtcclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQ0hBUlRfUkVBRFksIHRoaXMsIGRhdGEsIGV2ZW50KTtcclxuXHJcbiAgICBpZiAodGhpcy5jaGFydFJlYWR5RXZlbnQgIT09IG51bGwgJiYgdGhpcy5jaGFydFJlYWR5RXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmNoYXJ0UmVhZHlFdmVudC5lbWl0KGV2KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBlbWl0Q2hhcnRFcnJvckV2ZW50KCRldmVudDogRXZlbnQpIHtcclxuICAgIGxldCBldmVudERhdGE6IGFueSA9IG51bGxcclxuXHJcbiAgICAvLyBlbWl0IGV2ZW50XHJcbiAgICBsZXQgZGF0YTogYW55ID0gZXZlbnREYXRhO1xyXG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChDSEFSVF9FUlJPUiwgdGhpcywgZGF0YSwgZXZlbnQpO1xyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0RXJyb3JFdmVudCAhPT0gbnVsbCAmJiB0aGlzLmNoYXJ0RXJyb3JFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuY2hhcnRFcnJvckV2ZW50LmVtaXQoZXYpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2hhcnRSZWFkeUV2ZW50KGV2ZW50OiBhbnksIGZpcmVFdmVudD86IGJvb2xlYW4pIHtcclxuICAgIGlmIChmaXJlRXZlbnQgPT09IG51bGwgfHwgZmlyZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgZmlyZUV2ZW50ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVtaXRDaGFydFJlYWR5RXZlbnQoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2hhcnRFcnJvckV2ZW50KGV2ZW50OiBhbnksIGZpcmVFdmVudD86IGJvb2xlYW4pIHtcclxuICAgIGlmIChmaXJlRXZlbnQgPT09IG51bGwgfHwgZmlyZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgZmlyZUV2ZW50ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVtaXRDaGFydEVycm9yRXZlbnQoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldGNoYXJ0UmVhZHlFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGFydFJlYWR5RXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Y2hhcnRFcnJvckV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmNoYXJ0RXJyb3JFdmVudDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRjaGFydFNlbGVjdEV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmNoYXJ0U2VsZWN0RXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Y2hhcnRNb3VzZU92ZXJFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGFydE1vdXNlT3ZlckV2ZW50O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldGNoYXJ0TW91c2VPdXRFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGFydE1vdXNlT3V0RXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0T3B0aW9ucyhvcHRpb25zOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMubW9kZWwub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICB0aGlzLnJlbG9hZERhdGEodGhpcy5tb2RlbC5kYXRhVGFibGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldENoYXJ0VHlwZShjaGFydFR5cGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5tb2RlbC5jaGFydFR5cGUgPSBjaGFydFR5cGU7XHJcbiAgICB0aGlzLnJlbG9hZERhdGEodGhpcy5tb2RlbC5kYXRhVGFibGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFRpdGxlKHRpdGxlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMubW9kZWwudGl0bGUgPSB0aXRsZTtcclxuICAgIHRoaXMucmVsb2FkRGF0YSh0aGlzLm1vZGVsLmRhdGFUYWJsZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0U3VidGl0bGUoc3VidGl0bGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5tb2RlbC5zdWJ0aXRsZSA9IHN1YnRpdGxlO1xyXG4gICAgdGhpcy5yZWxvYWREYXRhKHRoaXMubW9kZWwuZGF0YVRhYmxlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRNb2RlbCgpOiBQaGxveERhdGFDaGFydE1vZGVsIHtcclxuICAgIHJldHVybiB0aGlzLm1vZGVsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldE1vZGVsKG1vZGVsOiBQaGxveERhdGFDaGFydE1vZGVsKTogdm9pZCB7XHJcbiAgICB0aGlzLm1vZGVsID0gbW9kZWw7XHJcbiAgfVxyXG59XHJcbiJdfQ==