@ohayojp/chart
Version:
Cache the dictionary, city data etc.
348 lines • 25.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: tag-cloud.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { __decorate, __metadata } from "tslib";
import { Platform } from '@angular/cdk/platform';
import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Input, NgZone, Output, ViewEncapsulation, } from '@angular/core';
import DataSet from '@antv/data-set';
import { Chart, registerShape, Util } from '@antv/g2';
import { OhayoConfigService, InputNumber } from '@ohayojp/util';
import { fromEvent } from 'rxjs';
import { debounceTime, filter } from 'rxjs/operators';
/**
* @record
*/
export function G2TagCloudData() { }
if (false) {
/** @type {?|undefined} */
G2TagCloudData.prototype.value;
/** @type {?|undefined} */
G2TagCloudData.prototype.name;
/* Skipping unhandled member: [key: string]: any;*/
}
/**
* @record
*/
export function G2TagCloudClickItem() { }
if (false) {
/** @type {?} */
G2TagCloudClickItem.prototype.item;
/** @type {?} */
G2TagCloudClickItem.prototype.ev;
}
export class G2TagCloudComponent {
// #endregion
/**
* @param {?} el
* @param {?} ngZone
* @param {?} configSrv
* @param {?} platform
*/
constructor(el, ngZone, configSrv, platform) {
this.el = el;
this.ngZone = ngZone;
this.platform = platform;
// #region fields
this.delay = 100;
this.width = 0;
this.height = 200;
this.padding = 0;
this.data = [];
this.clickItem = new EventEmitter();
configSrv.attachKey(this, 'chart', 'theme');
}
/**
* @return {?}
*/
get chart() {
return this._chart;
}
/**
* @private
* @return {?}
*/
initTagCloud() {
registerShape('point', 'cloud', {
// tslint:disable-next-line: typedef
/**
* @param {?} cfg
* @param {?} container
* @return {?}
*/
draw(cfg, container) {
/** @type {?} */
const data = (/** @type {?} */ (cfg.data));
/** @type {?} */
const textShape = container.addShape({
type: 'text',
name: 'tag-cloud-text',
attrs: (/** @type {?} */ (Object.assign(Object.assign({}, cfg.style), { fontSize: data.size, text: data.text, textAlign: 'center', fontFamily: data.font, fill: cfg.color, textBaseline: 'Alphabetic', x: cfg.x, y: cfg.y }))),
});
if (data.rotate) {
Util.rotate(textShape, (data.rotate * Math.PI) / 180);
}
return textShape;
},
});
}
/**
* @private
* @return {?}
*/
install() {
const { el, padding, theme } = this;
if (this.height === 0) {
this.height = this.el.nativeElement.clientHeight;
}
if (this.width === 0) {
this.width = this.el.nativeElement.clientWidth;
}
/** @type {?} */
const chart = (this._chart = new Chart({
container: el.nativeElement,
autoFit: false,
padding,
height: this.height,
width: this.width,
theme,
}));
chart.scale({
x: { nice: false },
y: { nice: false },
});
chart.legend(false);
chart.axis(false);
chart.tooltip({
showTitle: false,
showMarkers: false,
});
((/** @type {?} */ (chart.coordinate()))).reflect();
chart
.point()
.position('x*y')
.color('text')
.shape('cloud')
.state({
active: {
style: {
fillOpacity: 0.4,
},
},
});
chart.interaction('element-active');
chart.on('tag-cloud-text:click', (/**
* @param {?} ev
* @return {?}
*/
(ev) => {
this.ngZone.run((/**
* @return {?}
*/
() => { var _a; return this.clickItem.emit({ item: (_a = ev.data) === null || _a === void 0 ? void 0 : _a.data, ev }); }));
}));
this.attachChart();
}
/**
* @private
* @return {?}
*/
attachChart() {
const { _chart, padding, data } = this;
if (!_chart || !data || data.length <= 0)
return;
_chart.height = this.height;
_chart.width = this.width;
_chart.padding = padding;
/** @type {?} */
const dv = new DataSet.View().source(data);
/** @type {?} */
const range = dv.range('value');
/** @type {?} */
const min = range[0];
/** @type {?} */
const max = range[1];
dv.transform((/** @type {?} */ ({
type: 'tag-cloud',
fields: ['name', 'value'],
// imageMask,
font: 'Verdana',
size: [this.width, this.height],
// 宽高设置最好根据 imageMask 做调整
padding: 0,
timeInterval: 5000,
// max execute time
// tslint:disable-next-line: typedef
/**
* @return {?}
*/
rotate() {
/** @type {?} */
let random = ~~(Math.random() * 4) % 4;
if (random === 2) {
random = 0;
}
return random * 90; // 0, 90, 270
},
// tslint:disable-next-line: typedef
/**
* @param {?} d
* @return {?}
*/
fontSize(d) {
return ((d.value - min) / (max - min)) * (32 - 8) + 8;
},
})));
_chart.data(dv.rows);
_chart.render();
}
/**
* @private
* @return {?}
*/
_attachChart() {
this.ngZone.runOutsideAngular((/**
* @return {?}
*/
() => this.attachChart()));
}
/**
* @private
* @return {?}
*/
installResizeEvent() {
this.resize$ = fromEvent(window, 'resize')
.pipe(filter((/**
* @return {?}
*/
() => !!this._chart)), debounceTime(200))
.subscribe((/**
* @return {?}
*/
() => this._attachChart()));
}
/**
* @return {?}
*/
ngOnInit() {
if (!this.platform.isBrowser) {
return;
}
this.initTagCloud();
this.installResizeEvent();
this.ngZone.runOutsideAngular((/**
* @return {?}
*/
() => setTimeout((/**
* @return {?}
*/
() => this.install()), this.delay)));
}
/**
* @return {?}
*/
ngOnChanges() {
this._attachChart();
}
/**
* @return {?}
*/
ngOnDestroy() {
if (this.resize$) {
this.resize$.unsubscribe();
}
if (this._chart) {
this.ngZone.runOutsideAngular((/**
* @return {?}
*/
() => this._chart.destroy()));
}
}
}
G2TagCloudComponent.decorators = [
{ type: Component, args: [{
selector: 'g2-tag-cloud',
exportAs: 'g2TagCloud',
template: ``,
preserveWhitespaces: false,
changeDetection: ChangeDetectionStrategy.OnPush,
encapsulation: ViewEncapsulation.None
}] }
];
/** @nocollapse */
G2TagCloudComponent.ctorParameters = () => [
{ type: ElementRef },
{ type: NgZone },
{ type: OhayoConfigService },
{ type: Platform }
];
G2TagCloudComponent.propDecorators = {
delay: [{ type: Input }],
width: [{ type: Input }],
height: [{ type: Input }],
padding: [{ type: Input }],
data: [{ type: Input }],
theme: [{ type: Input }],
clickItem: [{ type: Output }]
};
__decorate([
InputNumber(),
__metadata("design:type", Object)
], G2TagCloudComponent.prototype, "delay", void 0);
__decorate([
InputNumber(),
__metadata("design:type", Object)
], G2TagCloudComponent.prototype, "width", void 0);
__decorate([
InputNumber(),
__metadata("design:type", Object)
], G2TagCloudComponent.prototype, "height", void 0);
if (false) {
/** @type {?} */
G2TagCloudComponent.ngAcceptInputType_delay;
/** @type {?} */
G2TagCloudComponent.ngAcceptInputType_height;
/** @type {?} */
G2TagCloudComponent.ngAcceptInputType_width;
/**
* @type {?}
* @private
*/
G2TagCloudComponent.prototype.resize$;
/**
* @type {?}
* @private
*/
G2TagCloudComponent.prototype._chart;
/** @type {?} */
G2TagCloudComponent.prototype.delay;
/** @type {?} */
G2TagCloudComponent.prototype.width;
/** @type {?} */
G2TagCloudComponent.prototype.height;
/** @type {?} */
G2TagCloudComponent.prototype.padding;
/** @type {?} */
G2TagCloudComponent.prototype.data;
/** @type {?} */
G2TagCloudComponent.prototype.theme;
/** @type {?} */
G2TagCloudComponent.prototype.clickItem;
/**
* @type {?}
* @private
*/
G2TagCloudComponent.prototype.el;
/**
* @type {?}
* @private
*/
G2TagCloudComponent.prototype.ngZone;
/**
* @type {?}
* @private
*/
G2TagCloudComponent.prototype.platform;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnLWNsb3VkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jaGFydC90YWctY2xvdWQvIiwic291cmNlcyI6WyJ0YWctY2xvdWQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBSU4sTUFBTSxFQUNOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLE9BQU8sTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsS0FBSyxFQUFTLGFBQWEsRUFBUyxJQUFJLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDcEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBZSxNQUFNLGVBQWUsQ0FBQztBQUU3RSxPQUFPLEVBQUUsU0FBUyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBRXRELG9DQUlDOzs7SUFIQywrQkFBZTs7SUFDZiw4QkFBYzs7Ozs7O0FBSWhCLHlDQUdDOzs7SUFGQyxtQ0FBcUI7O0lBQ3JCLGlDQUFVOztBQVdaLE1BQU0sT0FBTyxtQkFBbUI7Ozs7Ozs7O0lBd0I5QixZQUFvQixFQUE4QixFQUFVLE1BQWMsRUFBRSxTQUE2QixFQUFVLFFBQWtCO1FBQWpILE9BQUUsR0FBRixFQUFFLENBQTRCO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUF5QyxhQUFRLEdBQVIsUUFBUSxDQUFVOztRQVY3RyxVQUFLLEdBQUcsR0FBRyxDQUFDO1FBQ1osVUFBSyxHQUFHLENBQUMsQ0FBQztRQUNWLFdBQU0sR0FBRyxHQUFHLENBQUM7UUFDNUIsWUFBTyxH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LE1BQU07Z0JBQy9DLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO2FBQ3RDOzs7O1lBbkNDLFVBQVU7WUFHVixNQUFNO1lBU0Msa0JBQWtCO1lBaEJsQixRQUFROzs7b0JBc0RkLEtBQUs7b0JBQ0wsS0FBSztxQkFDTCxLQUFLO3NCQUNMLEtBQUs7bUJBQ0wsS0FBSztvQkFDTCxLQUFLO3dCQUNMLE1BQU07O0FBTmlCO0lBQWQsV0FBVyxFQUFFOztrREFBYTtBQUNaO0lBQWQsV0FBVyxFQUFFOztrREFBVztBQUNWO0lBQWQsV0FBVyxFQUFFOzttREFBYzs7O0lBZnJDLDRDQUE0Qzs7SUFDNUMsNkNBQTZDOztJQUM3Qyw0Q0FBNEM7Ozs7O0lBRTVDLHNDQUE4Qjs7Ozs7SUFDOUIscUNBQXNCOztJQVF0QixvQ0FBb0M7O0lBQ3BDLG9DQUFrQzs7SUFDbEMscUNBQXFDOztJQUNyQyxzQ0FBaUQ7O0lBQ2pELG1DQUFxQzs7SUFDckMsb0NBQTJDOztJQUMzQyx3Q0FBOEQ7Ozs7O0lBSWxELGlDQUFzQzs7Ozs7SUFBRSxxQ0FBc0I7Ozs7O0lBQWlDLHVDQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BsYXRmb3JtJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgRGF0YVNldCBmcm9tICdAYW50di9kYXRhLXNldCc7XG5pbXBvcnQgeyBDaGFydCwgRXZlbnQsIHJlZ2lzdGVyU2hhcGUsIFR5cGVzLCBVdGlsIH0gZnJvbSAnQGFudHYvZzInO1xuaW1wb3J0IHsgT2hheW9Db25maWdTZXJ2aWNlLCBJbnB1dE51bWJlciwgTnVtYmVySW5wdXQgfSBmcm9tICdAb2hheW9qcC91dGlsJztcbmltcG9ydCB7IE56U2FmZUFueSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90eXBlcyc7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRzJUYWdDbG91ZERhdGEge1xuICB2YWx1ZT86IG51bWJlcjtcbiAgbmFtZT86IHN0cmluZztcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEcyVGFnQ2xvdWRDbGlja0l0ZW0ge1xuICBpdGVtOiBHMlRhZ0Nsb3VkRGF0YTtcbiAgZXY6IEV2ZW50O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdnMi10YWctY2xvdWQnLFxuICBleHBvcnRBczogJ2cyVGFnQ2xvdWQnLFxuICB0ZW1wbGF0ZTogYGAsXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgRzJUYWdDbG91ZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBPbkluaXQge1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfZGVsYXk6IE51bWJlcklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfaGVpZ2h0OiBOdW1iZXJJbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX3dpZHRoOiBOdW1iZXJJbnB1dDtcblxuICBwcml2YXRlIHJlc2l6ZSQ6IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBfY2hhcnQ6IENoYXJ0O1xuXG4gIGdldCBjaGFydCgpOiBDaGFydCB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYXJ0O1xuICB9XG5cbiAgLy8gI3JlZ2lvbiBmaWVsZHNcblxuICBASW5wdXQoKSBASW5wdXROdW1iZXIoKSBkZWxheSA9IDEwMDtcbiAgQElucHV0KCkgQElucHV0TnVtYmVyKCkgd2lkdGggPSAwO1xuICBASW5wdXQoKSBASW5wdXROdW1iZXIoKSBoZWlnaHQgPSAyMDA7XG4gIEBJbnB1dCgpIHBhZGRpbmc6IG51bWJlciB8IG51bWJlcltdIHwgJ2F1dG8nID0gMDtcbiAgQElucHV0KCkgZGF0YTogRzJUYWdDbG91ZERhdGFbXSA9IFtdO1xuICBASW5wdXQoKSB0aGVtZTogc3RyaW5nIHwgVHlwZXMuTG9vc2VPYmplY3Q7XG4gIEBPdXRwdXQoKSBjbGlja0l0ZW0gPSBuZXcgRXZlbnRFbWl0dGVyPEcyVGFnQ2xvdWRDbGlja0l0ZW0+KCk7XG5cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+LCBwcml2YXRlIG5nWm9uZTogTmdab25lLCBjb25maWdTcnY6IE9oYXlvQ29uZmlnU2VydmljZSwgcHJpdmF0ZSBwbGF0Zm9ybTogUGxhdGZvcm0pIHtcbiAgICBjb25maWdTcnYuYXR0YWNoS2V5KHRoaXMsICdjaGFydCcsICd0aGVtZScpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0VGFnQ2xvdWQoKTogdm9pZCB7XG4gICAgcmVnaXN0ZXJTaGFwZSgncG9pbnQnLCAnY2xvdWQnLCB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHR5cGVkZWZcbiAgICAgIGRyYXcoY2ZnLCBjb250YWluZXIpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGNmZy5kYXRhIGFzIE56U2FmZUFueTtcbiAgICAgICAgY29uc3QgdGV4dFNoYXBlID0gY29udGFpbmVyLmFkZFNoYXBlKHtcbiAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgbmFtZTogJ3RhZy1jbG91ZC10ZXh0JyxcbiAgICAgICAgICBhdHRyczoge1xuICAgICAgICAgICAgLi4uY2ZnLnN0eWxlLFxuICAgICAgICAgICAgZm9udFNpemU6IGRhdGEuc2l6ZSxcbiAgICAgICAgICAgIHRleHQ6IGRhdGEudGV4dCxcbiAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgICBmb250RmFtaWx5OiBkYXRhLmZvbnQsXG4gICAgICAgICAgICBmaWxsOiBjZmcuY29sb3IsXG4gICAgICAgICAgICB0ZXh0QmFzZWxpbmU6ICdBbHBoYWJldGljJyxcbiAgICAgICAgICAgIHg6IGNmZy54LFxuICAgICAgICAgICAgeTogY2ZnLnksXG4gICAgICAgICAgfSBhcyBOelNhZmVBbnksXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZGF0YS5yb3RhdGUpIHtcbiAgICAgICAgICBVdGlsLnJvdGF0ZSh0ZXh0U2hhcGUsIChkYXRhLnJvdGF0ZSAqIE1hdGguUEkpIC8gMTgwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dFNoYXBlO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5zdGFsbCgpOiB2b2lkIHtcbiAgICBjb25zdCB7IGVsLCBwYWRkaW5nLCB0aGVtZSB9ID0gdGhpcztcbiAgICBpZiAodGhpcy5oZWlnaHQgPT09IDApIHtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICB9XG4gICAgaWYgKHRoaXMud2lkdGggPT09IDApIHtcbiAgICAgIHRoaXMud2lkdGggPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgfVxuXG4gICAgY29uc3QgY2hhcnQgPSAodGhpcy5fY2hhcnQgPSBuZXcgQ2hhcnQoe1xuICAgICAgY29udGFpbmVyOiBlbC5uYXRpdmVFbGVtZW50LFxuICAgICAgYXV0b0ZpdDogZmFsc2UsXG4gICAgICBwYWRkaW5nLFxuICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodCxcbiAgICAgIHdpZHRoOiB0aGlzLndpZHRoLFxuICAgICAgdGhlbWUsXG4gICAgfSkpO1xuICAgIGNoYXJ0LnNjYWxlKHtcbiAgICAgIHg6IHsgbmljZTogZmFsc2UgfSxcbiAgICAgIHk6IHsgbmljZTogZmFsc2UgfSxcbiAgICB9KTtcbiAgICBjaGFydC5sZWdlbmQoZmFsc2UpO1xuICAgIGNoYXJ0LmF4aXMoZmFsc2UpO1xuICAgIGNoYXJ0LnRvb2x0aXAoe1xuICAgICAgc2hvd1RpdGxlOiBmYWxzZSxcbiAgICAgIHNob3dNYXJrZXJzOiBmYWxzZSxcbiAgICB9KTtcbiAgICAoY2hhcnQuY29vcmRpbmF0ZSgpIGFzIE56U2FmZUFueSkucmVmbGVjdCgpO1xuICAgIGNoYXJ0XG4gICAgICAucG9pbnQoKVxuICAgICAgLnBvc2l0aW9uKCd4KnknKVxuICAgICAgLmNvbG9yKCd0ZXh0JylcbiAgICAgIC5zaGFwZSgnY2xvdWQnKVxuICAgICAgLnN0YXRlKHtcbiAgICAgICAgYWN0aXZlOiB7XG4gICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGZpbGxPcGFjaXR5OiAwLjQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIGNoYXJ0LmludGVyYWN0aW9uKCdlbGVtZW50LWFjdGl2ZScpO1xuXG4gICAgY2hhcnQub24oJ3RhZy1jbG91ZC10ZXh0OmNsaWNrJywgKGV2OiBFdmVudCkgPT4ge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuY2xpY2tJdGVtLmVtaXQoeyBpdGVtOiBldi5kYXRhPy5kYXRhLCBldiB9KSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmF0dGFjaENoYXJ0KCk7XG4gIH1cblxuICBwcml2YXRlIGF0dGFjaENoYXJ0KCk6IHZvaWQge1xuICAgIGNvbnN0IHsgX2NoYXJ0LCBwYWRkaW5nLCBkYXRhIH0gPSB0aGlzO1xuICAgIGlmICghX2NoYXJ0IHx8ICFkYXRhIHx8IGRhdGEubGVuZ3RoIDw9IDApIHJldHVybjtcblxuICAgIF9jaGFydC5oZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICBfY2hhcnQud2lkdGggPSB0aGlzLndpZHRoO1xuICAgIF9jaGFydC5wYWRkaW5nID0gcGFkZGluZztcblxuICAgIGNvbnN0IGR2ID0gbmV3IERhdGFTZXQuVmlldygpLnNvdXJjZShkYXRhKTtcbiAgICBjb25zdCByYW5nZSA9IGR2LnJhbmdlKCd2YWx1ZScpO1xuICAgIGNvbnN0IG1pbiA9IHJhbmdlWzBdO1xuICAgIGNvbnN0IG1heCA9IHJhbmdlWzFdO1xuXG4gICAgZHYudHJhbnNmb3JtKHtcbiAgICAgIHR5cGU6ICd0YWctY2xvdWQnLFxuICAgICAgZmllbGRzOiBbJ25hbWUnLCAndmFsdWUnXSxcbiAgICAgIC8vIGltYWdlTWFzayxcbiAgICAgIGZvbnQ6ICdWZXJkYW5hJyxcbiAgICAgIHNpemU6IFt0aGlzLndpZHRoLCB0aGlzLmhlaWdodF0sIC8vIOWuvemrmOiuvue9ruacgOWlveagueaNriBpbWFnZU1hc2sg5YGa6LCD5pW0XG4gICAgICBwYWRkaW5nOiAwLFxuICAgICAgdGltZUludGVydmFsOiA1MDAwLCAvLyBtYXggZXhlY3V0ZSB0aW1lXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHR5cGVkZWZcbiAgICAgIHJvdGF0ZSgpIHtcbiAgICAgICAgbGV0IHJhbmRvbSA9IH5+KE1hdGgucmFuZG9tKCkgKiA0KSAlIDQ7XG4gICAgICAgIGlmIChyYW5kb20gPT09IDIpIHtcbiAgICAgICAgICByYW5kb20gPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByYW5kb20gKiA5MDsgLy8gMCwgOTAsIDI3MFxuICAgICAgfSxcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdHlwZWRlZlxuICAgICAgZm9udFNpemUoZDogTnpTYWZlQW55KSB7XG4gICAgICAgIHJldHVybiAoKGQudmFsdWUgLSBtaW4pIC8gKG1heCAtIG1pbikpICogKDMyIC0gOCkgKyA4O1xuICAgICAgfSxcbiAgICB9IGFzIE56U2FmZUFueSk7XG4gICAgX2NoYXJ0LmRhdGEoZHYucm93cyk7XG4gICAgX2NoYXJ0LnJlbmRlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXR0YWNoQ2hhcnQoKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdGhpcy5hdHRhY2hDaGFydCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5zdGFsbFJlc2l6ZUV2ZW50KCk6IHZvaWQge1xuICAgIHRoaXMucmVzaXplJCA9IGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigoKSA9PiAhIXRoaXMuX2NoYXJ0KSxcbiAgICAgICAgZGVib3VuY2VUaW1lKDIwMCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2F0dGFjaENoYXJ0KCkpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBsYXRmb3JtLmlzQnJvd3Nlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmluaXRUYWdDbG91ZCgpO1xuICAgIHRoaXMuaW5zdGFsbFJlc2l6ZUV2ZW50KCk7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gc2V0VGltZW91dCgoKSA9PiB0aGlzLmluc3RhbGwoKSwgdGhpcy5kZWxheSkpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5fYXR0YWNoQ2hhcnQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc2l6ZSQpIHtcbiAgICAgIHRoaXMucmVzaXplJC51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY2hhcnQpIHtcbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHRoaXMuX2NoYXJ0LmRlc3Ryb3koKSk7XG4gICAgfVxuICB9XG59XG4iXX0=