ngx-amap
Version:
[][npm-badge-url] [][npm-badge-url] [][ci-url]
526 lines • 39.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: directives/amap-marker/amap-marker.directive.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Directive, Input, Output, EventEmitter, ContentChildren, QueryList, NgZone, } from '@angular/core';
import { zip } from 'rxjs';
import { AmapMarkerService } from './amap-marker.service';
import { LoggerService } from '../../shared/logger/logger.service';
import { AMapOverlay, OverlayOptions } from '../../base/amap-overlay';
import { EventBinderService } from '../../shared/event-binder.service';
import { getOptions, ChangeFilter } from '../../utils';
import { PixelService } from '../../shared/pixel.service';
import { IconService } from '../../shared/icon.service';
import { MarkerLabelService } from '../../shared/marker-label.service';
import { AmapInfoWindowComponent } from '../../components/amap-info-window/amap-info-window.component';
import { AMapService } from '../../shared/amap.service';
/** @type {?} */
const TAG = 'amap-marker';
/** @type {?} */
const ALL_OPTIONS = [
...OverlayOptions,
'position',
'anchor',
'offset',
'icon',
'content',
'topWhenClick',
'raiseOnDrag',
'visible',
'zIndex',
'angle',
'autoRotation',
'animation',
'shadow',
'title',
'shape',
'label',
];
export class AmapMarkerDirective extends AMapOverlay {
/**
* @param {?} os
* @param {?} binder
* @param {?} amaps
* @param {?} pixels
* @param {?} icons
* @param {?} mlabels
* @param {?} logger
* @param {?} ngZone
*/
constructor(os, binder, amaps, pixels, icons, mlabels, logger, ngZone) {
super(os, binder);
this.os = os;
this.binder = binder;
this.amaps = amaps;
this.pixels = pixels;
this.icons = icons;
this.mlabels = mlabels;
this.logger = logger;
this.ngZone = ngZone;
/**
* 额外: 是否隐藏
*/
this.hidden = false;
/**
* 额外: 是否包含在点聚合中
*/
this.inCluster = false;
/**
* 额外: 点击时是否显示信息窗体
*/
this.openInfoWindow = true;
// amap-marker events:
this.naReady = new EventEmitter();
// amap info window:
this.infoWindowComponent = new QueryList();
this.inited = false;
/** @type {?} */
const target = this.os.get();
this.naMouseOut = this.binder.bindEvent(target, 'mouseout');
this.naDragStart = this.binder.bindEvent(target, 'dragstart');
this.naDragging = this.binder.bindEvent(target, 'dragging');
this.naDragEnd = this.binder.bindEvent(target, 'dragend');
this.naMoving = this.binder.bindEvent(target, 'moving');
this.naMoveEnd = this.binder.bindEvent(target, 'moveend');
this.naMoveAlong = this.binder.bindEvent(target, 'movealong');
}
/**
* @return {?}
*/
ngOnDestroy() {
if (this.subscription) {
this.subscription.unsubscribe();
}
this.os.destroy();
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
/** @type {?} */
const filter = ChangeFilter.of(changes);
/** @type {?} */
const marker = this.get();
if (!this.inited) {
// do not draw marker when no poistion defined.
if (!this.position) {
return;
}
this.amaps.get().subscribe((/**
* @return {?}
*/
() => {
this.logger.d(TAG, 'initializing ...');
// bind info window events:
this.subscription = this.binder.bindEvent(marker, 'click').subscribe((/**
* @return {?}
*/
() => {
if (this.openInfoWindow) {
this.infoWindowComponent.forEach((/**
* @param {?} w
* @return {?}
*/
w => w.open()));
}
}));
/** @type {?} */
const options = getOptions(this, ALL_OPTIONS);
if (this.icon) {
options.icon = this.icons.create(this.icon);
}
if (this.shadow) {
options.shadow = this.icons.create(this.shadow);
}
if (this.label) {
options.label = this.mlabels.create(this.label);
}
if (this.offset) {
options.offset = this.pixels.create(this.offset);
}
this.logger.d(TAG, 'options:', options);
this.os.create(options, !this.inCluster).subscribe((/**
* @param {?} m
* @return {?}
*/
m => {
this.ngZone.run((/**
* @return {?}
*/
() => this.naReady.emit(m)));
this.logger.d(TAG, 'marker is ready.');
}));
this.inited = true;
this.updateInfoWindow();
this.updateInfoWindowPosition();
}));
}
else {
zip(filter.has('icon'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setIcon(this.icons.create(v))));
zip(filter.has('shadow'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setShadow(this.icons.create(v))));
zip(filter.has('label'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setLabel(this.mlabels.create(v))));
zip(filter.has('title'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setTitle(v)));
zip(filter.has('content'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setContent(v)));
zip(filter.has('extData'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setExtData(v)));
zip(filter.has('clickable'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setClickable(!!v)));
zip(filter.has('draggable'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setDraggable(!!v)));
zip(filter.has('visible'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => (v ? m.show() : m.hide())));
zip(filter.has('cursor'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setCursor(v)));
zip(filter.has('animation'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setAnimation(v)));
zip(filter.has('angle'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setAngle(v)));
zip(filter.has('zIndex'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setzIndex(v)));
zip(filter.has('shape'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setShape(v)));
zip(filter.notEmpty('offset'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setOffset(this.pixels.create(v))));
zip(filter.notEmpty('position'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setPosition(v)));
}
zip(filter.has('isTop'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => m.setTop(!!v)));
zip(filter.has('hidden'), marker).subscribe((/**
* @param {?} __0
* @return {?}
*/
([v, m]) => (v ? m.hide() : m.show())));
}
/**
* @return {?}
*/
ngAfterContentInit() {
this.updateInfoWindow();
this.infoWindowComponent.changes.subscribe((/**
* @return {?}
*/
() => this.updateInfoWindow()));
}
/**
* @private
* @return {?}
*/
updateInfoWindow() {
if (this.infoWindowComponent && this.inited) {
if (this.infoWindowComponent.length > 1) {
this.logger.e(TAG, 'Expected no more than 1 info window.');
return;
}
/** @type {?} */
const marker = this.os.get();
this.infoWindowComponent.forEach((/**
* @param {?} component
* @return {?}
*/
component => {
component.hostMarker = marker;
}));
}
}
/**
* @private
* @return {?}
*/
updateInfoWindowPosition() {
if (this.infoWindowComponent && this.inited) {
this.infoWindowComponent.forEach((/**
* @param {?} component
* @return {?}
*/
component => {
component.toggleOpen();
}));
}
}
/**
* 获取已创建的 AMap.Marker 对象
* @return {?}
*/
get() {
return this.os.get();
}
}
AmapMarkerDirective.decorators = [
{ type: Directive, args: [{
selector: 'amap-marker',
exportAs: 'marker',
providers: [AmapMarkerService],
},] }
];
/** @nocollapse */
AmapMarkerDirective.ctorParameters = () => [
{ type: AmapMarkerService },
{ type: EventBinderService },
{ type: AMapService },
{ type: PixelService },
{ type: IconService },
{ type: MarkerLabelService },
{ type: LoggerService },
{ type: NgZone }
];
AmapMarkerDirective.propDecorators = {
position: [{ type: Input }],
anchor: [{ type: Input }],
offset: [{ type: Input }],
icon: [{ type: Input }],
content: [{ type: Input }],
topWhenClick: [{ type: Input }],
raiseOnDrag: [{ type: Input }],
visible: [{ type: Input }],
zIndex: [{ type: Input }],
angle: [{ type: Input }],
autoRotation: [{ type: Input }],
animation: [{ type: Input }],
shadow: [{ type: Input }],
title: [{ type: Input }],
shape: [{ type: Input }],
label: [{ type: Input }],
isTop: [{ type: Input }],
hidden: [{ type: Input }],
inCluster: [{ type: Input }],
openInfoWindow: [{ type: Input }],
naReady: [{ type: Output }],
naMouseOut: [{ type: Output }],
naDragStart: [{ type: Output }],
naDragging: [{ type: Output }],
naDragEnd: [{ type: Output }],
naMoving: [{ type: Output }],
naMoveEnd: [{ type: Output }],
naMoveAlong: [{ type: Output }],
infoWindowComponent: [{ type: ContentChildren, args: [AmapInfoWindowComponent,] }]
};
if (false) {
/**
* 点标记在地图上显示的位置
* @type {?}
*/
AmapMarkerDirective.prototype.position;
/**
* 标记锚点
* @type {?}
*/
AmapMarkerDirective.prototype.anchor;
/**
* 点标记显示位置偏移量
* @type {?}
*/
AmapMarkerDirective.prototype.offset;
/**
* 需在点标记中显示的图标
* @type {?}
*/
AmapMarkerDirective.prototype.icon;
/**
* 点标记显示内容
* @type {?}
*/
AmapMarkerDirective.prototype.content;
/**
* 鼠标点击时marker是否置顶
* @type {?}
*/
AmapMarkerDirective.prototype.topWhenClick;
/**
* 拖拽点标记时是否开启点标记离开地图的效果
* @type {?}
*/
AmapMarkerDirective.prototype.raiseOnDrag;
/**
* 点标记是否可见
* @type {?}
*/
AmapMarkerDirective.prototype.visible;
/**
* 点标记的叠加顺序
* @type {?}
*/
AmapMarkerDirective.prototype.zIndex;
/**
* 点标记的旋转角度
* @type {?}
*/
AmapMarkerDirective.prototype.angle;
/**
* 是否自动旋转
* @type {?}
*/
AmapMarkerDirective.prototype.autoRotation;
/**
* 点标记的动画效果
* @type {?}
*/
AmapMarkerDirective.prototype.animation;
/**
* 点标记阴影
* @type {?}
*/
AmapMarkerDirective.prototype.shadow;
/**
* 鼠标滑过点标记时的文字提示
* @type {?}
*/
AmapMarkerDirective.prototype.title;
/**
* 可点击区域
* @type {?}
*/
AmapMarkerDirective.prototype.shape;
/**
* 文本标注
* @type {?}
*/
AmapMarkerDirective.prototype.label;
/**
* 额外: 是否置顶
* @type {?}
*/
AmapMarkerDirective.prototype.isTop;
/**
* 额外: 是否隐藏
* @type {?}
*/
AmapMarkerDirective.prototype.hidden;
/**
* 额外: 是否包含在点聚合中
* @type {?}
*/
AmapMarkerDirective.prototype.inCluster;
/**
* 额外: 点击时是否显示信息窗体
* @type {?}
*/
AmapMarkerDirective.prototype.openInfoWindow;
/** @type {?} */
AmapMarkerDirective.prototype.naReady;
/** @type {?} */
AmapMarkerDirective.prototype.naMouseOut;
/** @type {?} */
AmapMarkerDirective.prototype.naDragStart;
/** @type {?} */
AmapMarkerDirective.prototype.naDragging;
/** @type {?} */
AmapMarkerDirective.prototype.naDragEnd;
/** @type {?} */
AmapMarkerDirective.prototype.naMoving;
/** @type {?} */
AmapMarkerDirective.prototype.naMoveEnd;
/** @type {?} */
AmapMarkerDirective.prototype.naMoveAlong;
/** @type {?} */
AmapMarkerDirective.prototype.infoWindowComponent;
/**
* @type {?}
* @private
*/
AmapMarkerDirective.prototype.inited;
/**
* @type {?}
* @private
*/
AmapMarkerDirective.prototype.subscription;
/**
* @type {?}
* @protected
*/
AmapMarkerDirective.prototype.os;
/**
* @type {?}
* @protected
*/
AmapMarkerDirective.prototype.binder;
/**
* @type {?}
* @private
*/
AmapMarkerDirective.prototype.amaps;
/**
* @type {?}
* @private
*/
AmapMarkerDirective.prototype.pixels;
/**
* @type {?}
* @private
*/
AmapMarkerDirective.prototype.icons;
/**
* @type {?}
* @private
*/
AmapMarkerDirective.prototype.mlabels;
/**
* @type {?}
* @private
*/
AmapMarkerDirective.prototype.logger;
/**
* @type {?}
* @private
*/
AmapMarkerDirective.prototype.ngZone;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1hcC1tYXJrZXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWFtYXAvIiwic291cmNlcyI6WyJkaXJlY3RpdmVzL2FtYXAtbWFya2VyL2FtYXAtbWFya2VyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUVMLE1BQU0sRUFDTixZQUFZLEVBR1osZUFBZSxFQUNmLFNBQVMsRUFFVCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLEdBQUcsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDekMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUN2RyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7O01BRWxELEdBQUcsR0FBRyxhQUFhOztNQUNuQixXQUFXLEdBQUc7SUFDbEIsR0FBRyxjQUFjO0lBQ2pCLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLE1BQU07SUFDTixTQUFTO0lBQ1QsY0FBYztJQUNkLGFBQWE7SUFDYixTQUFT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Q0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNuQyxDQUFDO1lBQ0YsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQVMsT0FBTyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsU0FBUzs7OztZQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztZQUM5RSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBTSxTQUFTLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxTQUFTOzs7O1lBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO1lBQy9FLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFNLFNBQVMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFNBQVM7Ozs7WUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7WUFDL0UsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQVUsV0FBVyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsU0FBUzs7OztZQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7WUFDekYsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQVUsV0FBVyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsU0FBUzs7OztZQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7WUFDekYsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQVUsU0FBUyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsU0FBUzs7OztZQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFDLENBQUM7WUFDN0YsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQVMsUUFBUSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsU0FBUzs7OztZQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztZQUNoRixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBcUIsV0FBVyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsU0FBUzs7OztZQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUM1RSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUNsQixDQUFDO1lBQ0YsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQVMsT0FBTyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsU0FBUzs7OztZQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztZQUM5RSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBUyxRQUFRLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxTQUFTOzs7O1lBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO1lBQ2hGLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFtQixPQUFPLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxTQUFTOzs7O1lBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO1lBQ3hGLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFzQixRQUFRLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxTQUFTOzs7O1lBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQy9FLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDbkMsQ0FBQztZQUNGLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFxQixVQUFVLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxTQUFTOzs7O1lBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ2hGLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQ2pCLENBQUM7U0FDSDtRQUNELEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFVLE9BQU8sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFNBQVM7Ozs7UUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO1FBQy9FLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFVLFFBQVEsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFNBQVM7Ozs7UUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBQyxDQUFDO0lBQzlGLENBQUM7Ozs7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxTQUFTOzs7UUFBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBQyxDQUFDO0lBQzVFLENBQUM7Ozs7O0lBRU8sZ0JBQWdCO1FBQ3RCLElBQUksSUFBSSxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDM0MsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLHNDQUFzQyxDQUFDLENBQUM7Z0JBQzNELE9BQU87YUFDUjs7a0JBRUssTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFO1lBQzVCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPOzs7O1lBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQzNDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO1lBQ2hDLENBQUMsRUFBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDOzs7OztJQUVPLHdCQUF3QjtRQUM5QixJQUFJLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQzNDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPOzs7O1lBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQzNDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN6QixDQUFDLEVBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQzs7Ozs7SUFLRCxHQUFHO1FBQ0QsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7OztZQTlPRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGFBQWE7Z0JBQ3ZCLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixTQUFTLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQzthQUMvQjs7OztZQXJDUSxpQkFBaUI7WUFHakIsa0JBQWtCO1lBT2xCLFdBQVc7WUFKWCxZQUFZO1lBQ1osV0FBVztZQUNYLGtCQUFrQjtZQVBsQixhQUFhO1lBSnBCLE1BQU07Ozt1QkErQ0wsS0FBSztxQkFJTCxLQUFLO3FCQUlMLEtBQUs7bUJBSUwsS0FBSztzQkFJTCxLQUFLOzJCQUlMLEtBQUs7MEJBSUwsS0FBSztzQkFJTCxLQUFLO3FCQUlMLEtBQUs7b0JBSUwsS0FBSzsyQkFJTCxLQUFLO3dCQUlMLEtBQUs7cUJBSUwsS0FBSztvQkFJTCxLQUFLO29CQUlMLEtBQUs7b0JBSUwsS0FBSztvQkFJTCxLQUFLO3FCQUlMLEtBQUs7d0JBSUwsS0FBSzs2QkFJTCxLQUFLO3NCQUdMLE1BQU07eUJBQ04sTUFBTTswQkFDTixNQUFNO3lCQUNOLE1BQU07d0JBQ04sTUFBTTt1QkFDTixNQUFNO3dCQUNOLE1BQU07MEJBQ04sTUFBTTtrQ0FHTixlQUFlLFNBQUMsdUJBQXVCOzs7Ozs7O0lBekZ4Qyx1Q0FBc0M7Ozs7O0lBSXRDLHFDQUFvQzs7Ozs7SUFJcEMscUNBQXFDOzs7OztJQUlyQyxtQ0FBMEM7Ozs7O0lBSTFDLHNDQUF1Qzs7Ozs7SUFJdkMsMkNBQStCOzs7OztJQUkvQiwwQ0FBOEI7Ozs7O0lBSTlCLHNDQUEwQjs7Ozs7SUFJMUIscUNBQXdCOzs7OztJQUl4QixvQ0FBdUI7Ozs7O0lBSXZCLDJDQUErQjs7Ozs7SUFJL0Isd0NBQXVDOzs7OztJQUl2QyxxQ0FBNEM7Ozs7O0lBSTVDLG9DQUF1Qjs7Ozs7SUFJdkIsb0NBQWlDOzs7OztJQUlqQyxvQ0FBaUQ7Ozs7O0lBSWpELG9DQUF3Qjs7Ozs7SUFJeEIscUNBQXdCOzs7OztJQUl4Qix3Q0FBMkI7Ozs7O0lBSTNCLDZDQUErQjs7SUFHL0Isc0NBQXVDOztJQUN2Qyx5Q0FBd0M7O0lBQ3hDLDBDQUF5Qzs7SUFDekMseUNBQXdDOztJQUN4Qyx3Q0FBdUM7O0lBQ3ZDLHVDQUFzQzs7SUFDdEMsd0NBQXVDOztJQUN2QywwQ0FBeUM7O0lBR3pDLGtEQUMrRDs7Ozs7SUFFL0QscUNBQXVCOzs7OztJQUN2QiwyQ0FBbUM7Ozs7O0lBR2pDLGlDQUErQjs7Ozs7SUFDL0IscUNBQW9DOzs7OztJQUNwQyxvQ0FBMEI7Ozs7O0lBQzFCLHFDQUE0Qjs7Ozs7SUFDNUIsb0NBQTBCOzs7OztJQUMxQixzQ0FBbUM7Ozs7O0lBQ25DLHFDQUE2Qjs7Ozs7SUFDN0IscUNBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgT25DaGFuZ2VzLFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIFF1ZXJ5TGlzdCxcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgTmdab25lLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHppcCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBbWFwTWFya2VyU2VydmljZSB9IGZyb20gJy4vYW1hcC1tYXJrZXIuc2VydmljZSc7XG5pbXBvcnQgeyBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2xvZ2dlci9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBBTWFwT3ZlcmxheSwgT3ZlcmxheU9wdGlvbnMgfSBmcm9tICcuLi8uLi9iYXNlL2FtYXAtb3ZlcmxheSc7XG5pbXBvcnQgeyBFdmVudEJpbmRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvZXZlbnQtYmluZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0T3B0aW9ucywgQ2hhbmdlRmlsdGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgSVBpeGVsLCBJSWNvbiwgSU1hcmtlckxhYmVsIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBQaXhlbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvcGl4ZWwuc2VydmljZSc7XG5pbXBvcnQgeyBJY29uU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9pY29uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWFya2VyTGFiZWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21hcmtlci1sYWJlbC5zZXJ2aWNlJztcbmltcG9ydCB7IEFtYXBJbmZvV2luZG93Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9hbWFwLWluZm8td2luZG93L2FtYXAtaW5mby13aW5kb3cuY29tcG9uZW50JztcbmltcG9ydCB7IEFNYXBTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FtYXAuc2VydmljZSc7XG5cbmNvbnN0IFRBRyA9ICdhbWFwLW1hcmtlcic7XG5jb25zdCBBTExfT1BUSU9OUyA9IFtcbiAgLi4uT3ZlcmxheU9wdGlvbnMsXG4gICdwb3NpdGlvbicsXG4gICdhbmNob3InLFxuICAnb2Zmc2V0JyxcbiAgJ2ljb24nLFxuICAnY29udGVudCcsXG4gICd0b3BXaGVuQ2xpY2snLFxuICAncmFpc2VPbkRyYWcnLFxuICAndmlzaWJsZScsXG4gICd6SW5kZXgnLFxuICAnYW5nbGUnLFxuICAnYXV0b1JvdGF0aW9uJyxcbiAgJ2FuaW1hdGlvbicsXG4gICdzaGFkb3cnLFxuICAndGl0bGUnLFxuICAnc2hhcGUnLFxuICAnbGFiZWwnLFxuXTtcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnYW1hcC1tYXJrZXInLFxuICBleHBvcnRBczogJ21hcmtlcicsXG4gIHByb3ZpZGVyczogW0FtYXBNYXJrZXJTZXJ2aWNlXSxcbn0pXG5leHBvcnQgY2xhc3MgQW1hcE1hcmtlckRpcmVjdGl2ZSBleHRlbmRzIEFNYXBPdmVybGF5PEFNYXAuTWFya2VyPlxuICBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlckNvbnRlbnRJbml0IHtcbiAgLy8gLS0tLSBNYXJrZXIgT3B0aW9ucyAtLS0tXG4gIC8qKlxuICAgKiDngrnmoIforrDlnKjlnLDlm77kuIrmmL7npLrnmoTkvY3nva5cbiAgICovXG4gIEBJbnB1dCgpIHBvc2l0aW9uOiBBTWFwLkxvY2F0aW9uVmFsdWU7XG4gIC8qKlxuICAgKiDmoIforrDplJrngrlcbiAgICovXG4gIEBJbnB1dCgpIGFuY2hvcjogQU1hcC5NYXJrZXIuQW5jaG9yO1xuICAvKipcbiAgICog54K55qCH6K6w5pi+56S65L2N572u5YGP56e76YePXG4gICAqL1xuICBASW5wdXQoKSBvZmZzZXQ6IEFNYXAuUGl4ZWwgfCBJUGl4ZWw7XG4gIC8qKlxuICAgKiDpnIDlnKjngrnmoIforrDkuK3mmL7npLrnmoTlm77moIdcbiAgICovXG4gIEBJbnB1dCgpIGljb246IHN0cmluZyB8IEFNYXAuSWNvbiB8IElJY29uO1xuICAvKipcbiAgICog54K55qCH6K6w5pi+56S65YaF5a65XG4gICAqL1xuICBASW5wdXQoKSBjb250ZW50OiBzdHJpbmcgfCBIVE1MRWxlbWVudDtcbiAgLyoqXG4gICAqIOm8oOagh+eCueWHu+aXtm1hcmtlcuaYr+WQpue9rumhtlxuICAgKi9cbiAgQElucHV0KCkgdG9wV2hlbkNsaWNrOiBib29sZWFuO1xuICAvKipcbiAgICog5ouW5ou954K55qCH6K6w5pe25piv5ZCm5byA5ZCv54K55qCH6K6w56a75byA5Zyw5Zu+55qE5pWI5p6cXG4gICAqL1xuICBASW5wdXQoKSByYWlzZU9uRHJhZzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIOeCueagh+iusOaYr+WQpuWPr+ingVxuICAgKi9cbiAgQElucHV0KCkgdmlzaWJsZTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIOeCueagh+iusOeahOWPoOWKoOmhuuW6j1xuICAgKi9cbiAgQElucHV0KCkgekluZGV4OiBudW1iZXI7XG4gIC8qKlxuICAgKiDngrnmoIforrDnmoTml4vovazop5LluqZcbiAgICovXG4gIEBJbnB1dCgpIGFuZ2xlOiBudW1iZXI7XG4gIC8qKlxuICAgKiDmmK/lkKboh6rliqjml4vovaxcbiAgICovXG4gIEBJbnB1dCgpIGF1dG9Sb3RhdGlvbjogYm9vbGVhbjtcbiAgLyoqXG4gICAqIOeCueagh+iusOeahOWKqOeUu+aViOaenFxuICAgKi9cbiAgQElucHV0KCkgYW5pbWF0aW9uOiBBTWFwLkFuaW1hdGlvbk5hbWU7XG4gIC8qKlxuICAgKiDngrnmoIforrDpmLTlvbFcbiAgICovXG4gIEBJbnB1dCgpIHNoYWRvdzogQU1hcC5JY29uIHwgc3RyaW5nIHwgSUljb247XG4gIC8qKlxuICAgKiDpvKDmoIfmu5Hov4fngrnmoIforrDml7bnmoTmloflrZfmj5DnpLpcbiAgICovXG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiDlj6/ngrnlh7vljLrln59cbiAgICovXG4gIEBJbnB1dCgpIHNoYXBlOiBBTWFwLk1hcmtlclNoYXBlO1xuICAvKipcbiAgICog5paH5pys5qCH5rOoXG4gICAqL1xuICBASW5wdXQoKSBsYWJlbDogQU1hcC5NYXJrZXIuTGFiZWwgfCBJTWFya2VyTGFiZWw7XG4gIC8qKlxuICAgKiDpop3lpJY6IOaYr+WQpue9rumhtlxuICAgKi9cbiAgQElucHV0KCkgaXNUb3A6IGJvb2xlYW47XG4gIC8qKlxuICAgKiDpop3lpJY6IOaYr+WQpumakOiXj1xuICAgKi9cbiAgQElucHV0KCkgaGlkZGVuID0gZmFsc2U7XG4gIC8qKlxuICAgKiDpop3lpJY6IOaYr+WQpuWMheWQq+WcqOeCueiBmuWQiOS4rVxuICAgKi9cbiAgQElucHV0KCkgaW5DbHVzdGVyID0gZmFsc2U7XG4gIC8qKlxuICAgKiDpop3lpJY6IOeCueWHu+aXtuaYr+WQpuaYvuekuuS/oeaBr+eql+S9k1xuICAgKi9cbiAgQElucHV0KCkgb3BlbkluZm9XaW5kb3cgPSB0cnVlO1xuXG4gIC8vIGFtYXAtbWFya2VyIGV2ZW50czpcbiAgQE91dHB1dCgpIG5hUmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBuYU1vdXNlT3V0OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgpIG5hRHJhZ1N0YXJ0OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgpIG5hRHJhZ2dpbmc6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCkgbmFEcmFnRW5kOiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgpIG5hTW92aW5nOiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgpIG5hTW92ZUVuZDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoKSBuYU1vdmVBbG9uZzogRXZlbnRFbWl0dGVyPGFueT47XG5cbiAgLy8gYW1hcCBpbmZvIHdpbmRvdzpcbiAgQENvbnRlbnRDaGlsZHJlbihBbWFwSW5mb1dpbmRvd0NvbXBvbmVudClcbiAgaW5mb1dpbmRvd0NvbXBvbmVudCA9IG5ldyBRdWVyeUxpc3Q8QW1hcEluZm9XaW5kb3dDb21wb25lbnQ+KCk7XG5cbiAgcHJpdmF0ZSBpbml0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgb3M6IEFtYXBNYXJrZXJTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBiaW5kZXI6IEV2ZW50QmluZGVyU2VydmljZSxcbiAgICBwcml2YXRlIGFtYXBzOiBBTWFwU2VydmljZSxcbiAgICBwcml2YXRlIHBpeGVsczogUGl4ZWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgaWNvbnM6IEljb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgbWxhYmVsczogTWFya2VyTGFiZWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICkge1xuICAgIHN1cGVyKG9zLCBiaW5kZXIpO1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMub3MuZ2V0KCk7XG4gICAgdGhpcy5uYU1vdXNlT3V0ID0gdGhpcy5iaW5kZXIuYmluZEV2ZW50KHRhcmdldCwgJ21vdXNlb3V0Jyk7XG4gICAgdGhpcy5uYURyYWdTdGFydCA9IHRoaXMuYmluZGVyLmJpbmRFdmVudCh0YXJnZXQsICdkcmFnc3RhcnQnKTtcbiAgICB0aGlzLm5hRHJhZ2dpbmcgPSB0aGlzLmJpbmRlci5iaW5kRXZlbnQodGFyZ2V0LCAnZHJhZ2dpbmcnKTtcbiAgICB0aGlzLm5hRHJhZ0VuZCA9IHRoaXMuYmluZGVyLmJpbmRFdmVudCh0YXJnZXQsICdkcmFnZW5kJyk7XG4gICAgdGhpcy5uYU1vdmluZyA9IHRoaXMuYmluZGVyLmJpbmRFdmVudCh0YXJnZXQsICdtb3ZpbmcnKTtcbiAgICB0aGlzLm5hTW92ZUVuZCA9IHRoaXMuYmluZGVyLmJpbmRFdmVudCh0YXJnZXQsICdtb3ZlZW5kJyk7XG4gICAgdGhpcy5uYU1vdmVBbG9uZyA9IHRoaXMuYmluZGVyLmJpbmRFdmVudCh0YXJnZXQsICdtb3ZlYWxvbmcnKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5vcy5kZXN0cm95KCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgY29uc3QgZmlsdGVyID0gQ2hhbmdlRmlsdGVyLm9mKGNoYW5nZXMpO1xuICAgIGNvbnN0IG1hcmtlciA9IHRoaXMuZ2V0KCk7XG4gICAgaWYgKCF0aGlzLmluaXRlZCkge1xuICAgICAgLy8gZG8gbm90IGRyYXcgbWFya2VyIHdoZW4gbm8gcG9pc3Rpb24gZGVmaW5lZC5cbiAgICAgIGlmICghdGhpcy5wb3NpdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmFtYXBzLmdldCgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmQoVEFHLCAnaW5pdGlhbGl6aW5nIC4uLicpO1xuICAgICAgICAvLyBiaW5kIGluZm8gd2luZG93IGV2ZW50czpcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLmJpbmRlci5iaW5kRXZlbnQobWFya2VyLCAnY2xpY2snKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLm9wZW5JbmZvV2luZG93KSB7XG4gICAgICAgICAgICB0aGlzLmluZm9XaW5kb3dDb21wb25lbnQuZm9yRWFjaCh3ID0+IHcub3BlbigpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9uczxBTWFwLk1hcmtlci5PcHRpb25zPih0aGlzLCBBTExfT1BUSU9OUyk7XG4gICAgICAgIGlmICh0aGlzLmljb24pIHtcbiAgICAgICAgICBvcHRpb25zLmljb24gPSB0aGlzLmljb25zLmNyZWF0ZSh0aGlzLmljb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNoYWRvdykge1xuICAgICAgICAgIG9wdGlvbnMuc2hhZG93ID0gdGhpcy5pY29ucy5jcmVhdGUodGhpcy5zaGFkb3cpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxhYmVsKSB7XG4gICAgICAgICAgb3B0aW9ucy5sYWJlbCA9IHRoaXMubWxhYmVscy5jcmVhdGUodGhpcy5sYWJlbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub2Zmc2V0KSB7XG4gICAgICAgICAgb3B0aW9ucy5vZmZzZXQgPSB0aGlzLnBpeGVscy5jcmVhdGUodGhpcy5vZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nZ2VyLmQoVEFHLCAnb3B0aW9uczonLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5vcy5jcmVhdGUob3B0aW9ucywgIXRoaXMuaW5DbHVzdGVyKS5zdWJzY3JpYmUobSA9PiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMubmFSZWFkeS5lbWl0KG0pKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kKFRBRywgJ21hcmtlciBpcyByZWFkeS4nKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5pdGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy51cGRhdGVJbmZvV2luZG93KCk7XG4gICAgICAgIHRoaXMudXBkYXRlSW5mb1dpbmRvd1Bvc2l0aW9uKCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgemlwKGZpbHRlci5oYXM8c3RyaW5nIHwgQU1hcC5JY29uIHwgSUljb24+KCdpY29uJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+XG4gICAgICAgIG0uc2V0SWNvbih0aGlzLmljb25zLmNyZWF0ZSh2KSksXG4gICAgICApO1xuICAgICAgemlwKGZpbHRlci5oYXM8c3RyaW5nIHwgQU1hcC5JY29uPignc2hhZG93JyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+XG4gICAgICAgIG0uc2V0U2hhZG93KHRoaXMuaWNvbnMuY3JlYXRlKHYpKSxcbiAgICAgICk7XG4gICAgICB6aXAoZmlsdGVyLmhhczxBTWFwLk1hcmtlci5MYWJlbCB8IElNYXJrZXJMYWJlbD4oJ2xhYmVsJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+XG4gICAgICAgIG0uc2V0TGFiZWwodGhpcy5tbGFiZWxzLmNyZWF0ZSh2KSksXG4gICAgICApO1xuICAgICAgemlwKGZpbHRlci5oYXM8c3RyaW5nPigndGl0bGUnKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT4gbS5zZXRUaXRsZSh2KSk7XG4gICAgICB6aXAoZmlsdGVyLmhhczxhbnk+KCdjb250ZW50JyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+IG0uc2V0Q29udGVudCh2KSk7XG4gICAgICB6aXAoZmlsdGVyLmhhczxhbnk+KCdleHREYXRhJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+IG0uc2V0RXh0RGF0YSh2KSk7XG4gICAgICB6aXAoZmlsdGVyLmhhczxib29sZWFuPignY2xpY2thYmxlJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+IG0uc2V0Q2xpY2thYmxlKCEhdikpO1xuICAgICAgemlwKGZpbHRlci5oYXM8Ym9vbGVhbj4oJ2RyYWdnYWJsZScpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PiBtLnNldERyYWdnYWJsZSghIXYpKTtcbiAgICAgIHppcChmaWx0ZXIuaGFzPGJvb2xlYW4+KCd2aXNpYmxlJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+ICh2ID8gbS5zaG93KCkgOiBtLmhpZGUoKSkpO1xuICAgICAgemlwKGZpbHRlci5oYXM8c3RyaW5nPignY3Vyc29yJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+IG0uc2V0Q3Vyc29yKHYpKTtcbiAgICAgIHppcChmaWx0ZXIuaGFzPEFNYXAuQW5pbWF0aW9uTmFtZT4oJ2FuaW1hdGlvbicpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PlxuICAgICAgICBtLnNldEFuaW1hdGlvbih2KSxcbiAgICAgICk7XG4gICAgICB6aXAoZmlsdGVyLmhhczxudW1iZXI+KCdhbmdsZScpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PiBtLnNldEFuZ2xlKHYpKTtcbiAgICAgIHppcChmaWx0ZXIuaGFzPG51bWJlcj4oJ3pJbmRleCcpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PiBtLnNldHpJbmRleCh2KSk7XG4gICAgICB6aXAoZmlsdGVyLmhhczxBTWFwLk1hcmtlclNoYXBlPignc2hhcGUnKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT4gbS5zZXRTaGFwZSh2KSk7XG4gICAgICB6aXAoZmlsdGVyLm5vdEVtcHR5PEFNYXAuUGl4ZWwgfCBJUGl4ZWw+KCdvZmZzZXQnKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT5cbiAgICAgICAgbS5zZXRPZmZzZXQodGhpcy5waXhlbHMuY3JlYXRlKHYpKSxcbiAgICAgICk7XG4gICAgICB6aXAoZmlsdGVyLm5vdEVtcHR5PEFNYXAuTG9jYXRpb25WYWx1ZT4oJ3Bvc2l0aW9uJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+XG4gICAgICAgIG0uc2V0UG9zaXRpb24odiksXG4gICAgICApO1xuICAgIH1cbiAgICB6aXAoZmlsdGVyLmhhczxib29sZWFuPignaXNUb3AnKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT4gbS5zZXRUb3AoISF2KSk7XG4gICAgemlwKGZpbHRlci5oYXM8Ym9vbGVhbj4oJ2hpZGRlbicpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PiAodiA/IG0uaGlkZSgpIDogbS5zaG93KCkpKTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLnVwZGF0ZUluZm9XaW5kb3coKTtcbiAgICB0aGlzLmluZm9XaW5kb3dDb21wb25lbnQuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVJbmZvV2luZG93KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVJbmZvV2luZG93KCkge1xuICAgIGlmICh0aGlzLmluZm9XaW5kb3dDb21wb25lbnQgJiYgdGhpcy5pbml0ZWQpIHtcbiAgICAgIGlmICh0aGlzLmluZm9XaW5kb3dDb21wb25lbnQubGVuZ3RoID4gMSkge1xuICAgICAgICB0aGlzLmxvZ2dlci5lKFRBRywgJ0V4cGVjdGVkIG5vIG1vcmUgdGhhbiAxIGluZm8gd2luZG93LicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hcmtlciA9IHRoaXMub3MuZ2V0KCk7XG4gICAgICB0aGlzLmluZm9XaW5kb3dDb21wb25lbnQuZm9yRWFjaChjb21wb25lbnQgPT4ge1xuICAgICAgICBjb21wb25lbnQuaG9zdE1hcmtlciA9IG1hcmtlcjtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSW5mb1dpbmRvd1Bvc2l0aW9uKCkge1xuICAgIGlmICh0aGlzLmluZm9XaW5kb3dDb21wb25lbnQgJiYgdGhpcy5pbml0ZWQpIHtcbiAgICAgIHRoaXMuaW5mb1dpbmRvd0NvbXBvbmVudC5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XG4gICAgICAgIGNvbXBvbmVudC50b2dnbGVPcGVuKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5bey5Yib5bu655qEIEFNYXAuTWFya2VyIOWvueixoVxuICAgKi9cbiAgZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLm9zLmdldCgpO1xuICB9XG59XG4iXX0=