@eliorar/angular-cesium
Version:
Angular library for working with Cesium.
173 lines • 22.2 kB
JavaScript
import { ChangeDetectionStrategy, Component, ContentChildren, Input, ViewChild } from '@angular/core';
import { Subject } from 'rxjs';
import { get } from 'lodash';
import { BasicDesc } from '../../services/basic-desc/basic-desc.service';
import * as i0 from "@angular/core";
import * as i1 from "../../services/layer-service/layer-service.service";
import * as i2 from "../ac-layer/ac-layer.component";
/**
* This is component represents an array under `ac-layer`.
* The element must be a child of ac-layer element.
* + acFor `{string}` - get the tracked array and entityName (see the example).
* + idGetter `{Function}` - a function that gets the id for a given element in the array -should be defined for maximum performance.
* + show `{boolean}` - show/hide array's entities.
*
* __Usage :__
* ```
*<ac-layer acFor="let track of tracks$" [show]="show" [context]="this" [store]="true">
* <ac-array-desc acFor="let arrayItem of track.array" [idGetter]="trackArrayIdGetter">
* <ac-array-desc acFor="let innerArrayItem of arrayItem.innerArray" [idGetter]="trackArrayIdGetter">
* <ac-point-desc props="{
* position: innerArrayItem.pos,
* pixelSize: 10,
* color: getTrackColor(track),
* outlineColor: Color.BLUE,
* outlineWidth: 1
* }">
* </ac-point-desc>
* </ac-array-desc>
* </ac-array-desc>
*</ac-layer>
* ```
*/
export class AcArrayDescComponent {
constructor(layerService, cd) {
this.layerService = layerService;
this.cd = cd;
this.show = true;
this.entitiesMap = new Map();
this.id = 0;
this.acForRgx = /^let\s+.+\s+of\s+.+$/;
this.arrayObservable$ = new Subject();
}
ngOnChanges(changes) {
if (changes['acFor'].firstChange) {
const acForString = changes['acFor'].currentValue;
if (!this.acForRgx.test(acForString)) {
throw new Error(`ac-layer: Invalid [acFor] syntax. Expected: [acFor]="let item of observable" .Instead received: ${acForString}`);
}
const acForArr = changes['acFor'].currentValue.split(' ');
this.arrayPath = acForArr[3];
this.entityName = acForArr[1];
}
}
ngOnInit() {
if (this.layer) {
this.layer.getLayerService().cache = false;
}
this.layerServiceSubscription = this.layerService.layerUpdates().subscribe(() => {
this.cd.detectChanges();
});
}
ngAfterContentInit() {
this.layerService.context['arrayObservable$'] = this.arrayObservable$;
this.layerService.registerDescription(this);
this.basicDescs._results.forEach((component) => {
component.setLayerService(this.layer.getLayerService());
});
this.arrayDescs._results.splice(0, 1);
this.arrayDescs._results.forEach((component) => {
this.layerService.unregisterDescription(component);
this.layer.getLayerService().registerDescription(component);
component.layerService = this.layer.getLayerService();
component.setLayerService(this.layer.getLayerService());
});
}
ngOnDestroy() {
if (this.layerServiceSubscription) {
this.layerServiceSubscription.unsubscribe();
}
}
setLayerService(layerService) {
this.layerService = layerService;
}
draw(context, id, contextEntity) {
const entitiesArray = get(context, this.arrayPath);
if (!entitiesArray) {
return;
}
const previousEntitiesIdArray = this.entitiesMap.get(id);
const entitiesIdArray = [];
this.entitiesMap.set(id, entitiesIdArray);
entitiesArray.forEach((item, index) => {
this.layerService.context[this.entityName] = item;
const arrayItemId = this.generateCombinedId(id, item, index);
entitiesIdArray.push(arrayItemId);
this.layer.update(contextEntity, arrayItemId);
});
if (previousEntitiesIdArray) {
const entitiesToRemove = this.idGetter ?
previousEntitiesIdArray.filter((entityId) => entitiesIdArray.indexOf(entityId) < 0) :
previousEntitiesIdArray;
if (entitiesToRemove) {
entitiesToRemove.forEach((entityId) => this.layer.remove(entityId));
}
}
}
remove(id) {
const entitiesIdArray = this.entitiesMap.get(id);
if (entitiesIdArray) {
entitiesIdArray.forEach((entityId) => this.layer.remove(entityId));
}
this.entitiesMap.delete(id);
}
removeAll() {
this.layer.removeAll();
this.entitiesMap.clear();
}
getAcForString() {
return `let ${this.entityName + '___temp'} of arrayObservable$`;
}
generateCombinedId(entityId, arrayItem, index) {
let arrayItemId;
if (this.idGetter) {
arrayItemId = this.idGetter(arrayItem, index);
}
else {
arrayItemId = (this.id++) % Number.MAX_SAFE_INTEGER;
}
return entityId + arrayItemId;
}
}
AcArrayDescComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: AcArrayDescComponent, deps: [{ token: i1.LayerService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
AcArrayDescComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: AcArrayDescComponent, selector: "ac-array-desc", inputs: { acFor: "acFor", idGetter: "idGetter", show: "show" }, queries: [{ propertyName: "basicDescs", predicate: BasicDesc }, { propertyName: "arrayDescs", predicate: AcArrayDescComponent }], viewQueries: [{ propertyName: "layer", first: true, predicate: ["layer"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: `
<ac-layer #layer [acFor]="getAcForString()"
[context]="layerService.context"
[options]="layerService.options"
[show]="layerService.show && show"
[zIndex]="layerService.zIndex">
<ng-content #content></ng-content>
</ac-layer>
`, isInline: true, components: [{ type: i2.AcLayerComponent, selector: "ac-layer", inputs: ["show", "acFor", "context", "store", "options", "zIndex", "debug"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: AcArrayDescComponent, decorators: [{
type: Component,
args: [{
selector: 'ac-array-desc',
template: `
<ac-layer #layer [acFor]="getAcForString()"
[context]="layerService.context"
[options]="layerService.options"
[show]="layerService.show && show"
[zIndex]="layerService.zIndex">
<ng-content #content></ng-content>
</ac-layer>
`,
changeDetection: ChangeDetectionStrategy.OnPush,
}]
}], ctorParameters: function () { return [{ type: i1.LayerService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { acFor: [{
type: Input
}], idGetter: [{
type: Input
}], show: [{
type: Input
}], layer: [{
type: ViewChild,
args: ['layer', { static: true }]
}], basicDescs: [{
type: ContentChildren,
args: [BasicDesc, { descendants: false }]
}], arrayDescs: [{
type: ContentChildren,
args: [AcArrayDescComponent, { descendants: false }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWMtYXJyYXktZGVzYy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNlc2l1bS9zcmMvbGliL2FuZ3VsYXItY2VzaXVtL2NvbXBvbmVudHMvYWMtYXJyYXktZGVzYy9hYy1hcnJheS1kZXNjLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsS0FBSyxFQUtMLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUMsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFHM0IsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLDhDQUE4QyxDQUFDOzs7O0FBRXZFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFlSCxNQUFNLE9BQU8sb0JBQW9CO0lBa0IvQixZQUFtQixZQUEwQixFQUFVLEVBQXFCO1FBQXpELGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQVUsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFabkUsU0FBSSxHQUFHLElBQUksQ0FBQztRQUliLGdCQUFXLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7UUFFMUMsT0FBRSxHQUFHLENBQUMsQ0FBQztRQUNFLGFBQVEsR0FBRyxzQkFBc0IsQ0FBQztRQUduRCxxQkFBZ0IsR0FBRyxJQUFJLE9BQU8sRUFBa0IsQ0FBQztJQUdqRCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRTtZQUNoQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDO1lBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElB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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWNOb3RpZmljYXRpb259IGZyb20gJy4uLy4uL21vZGVscy9hYy1ub3RpZmljYXRpb24nO1xuaW1wb3J0IHtTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtJRGVzY3JpcHRpb259IGZyb20gJy4uLy4uL21vZGVscy9kZXNjcmlwdGlvbic7XG5pbXBvcnQge2dldH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7QWNMYXllckNvbXBvbmVudH0gZnJvbSAnLi4vYWMtbGF5ZXIvYWMtbGF5ZXIuY29tcG9uZW50JztcbmltcG9ydCB7TGF5ZXJTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sYXllci1zZXJ2aWNlL2xheWVyLXNlcnZpY2Uuc2VydmljZSc7XG5pbXBvcnQge0Jhc2ljRGVzY30gZnJvbSAnLi4vLi4vc2VydmljZXMvYmFzaWMtZGVzYy9iYXNpYy1kZXNjLnNlcnZpY2UnO1xuXG4vKipcbiAqICBUaGlzIGlzIGNvbXBvbmVudCByZXByZXNlbnRzIGFuIGFycmF5IHVuZGVyIGBhYy1sYXllcmAuXG4gKiAgVGhlIGVsZW1lbnQgbXVzdCBiZSBhIGNoaWxkIG9mIGFjLWxheWVyIGVsZW1lbnQuXG4gKiAgKyBhY0ZvciBge3N0cmluZ31gIC0gZ2V0IHRoZSB0cmFja2VkIGFycmF5IGFuZCBlbnRpdHlOYW1lIChzZWUgdGhlIGV4YW1wbGUpLlxuICogICsgaWRHZXR0ZXIgYHtGdW5jdGlvbn1gIC0gYSBmdW5jdGlvbiB0aGF0IGdldHMgdGhlIGlkIGZvciBhIGdpdmVuIGVsZW1lbnQgaW4gdGhlIGFycmF5IC1zaG91bGQgYmUgZGVmaW5lZCBmb3IgbWF4aW11bSBwZXJmb3JtYW5jZS5cbiAqICArIHNob3cgYHtib29sZWFufWAgLSBzaG93L2hpZGUgYXJyYXkncyBlbnRpdGllcy5cbiAqXG4gKiAgX19Vc2FnZSA6X19cbiAqICBgYGBcbiAqPGFjLWxheWVyIGFjRm9yPVwibGV0IHRyYWNrIG9mIHRyYWNrcyRcIiBbc2hvd109XCJzaG93XCIgW2NvbnRleHRdPVwidGhpc1wiIFtzdG9yZV09XCJ0cnVlXCI+XG4gKiAgPGFjLWFycmF5LWRlc2MgYWNGb3I9XCJsZXQgYXJyYXlJdGVtIG9mIHRyYWNrLmFycmF5XCIgW2lkR2V0dGVyXT1cInRyYWNrQXJyYXlJZEdldHRlclwiPlxuICogICAgPGFjLWFycmF5LWRlc2MgYWNGb3I9XCJsZXQgaW5uZXJBcnJheUl0ZW0gb2YgYXJyYXlJdGVtLmlubmVyQXJyYXlcIiBbaWRHZXR0ZXJdPVwidHJhY2tBcnJheUlkR2V0dGVyXCI+XG4gKiAgICAgIDxhYy1wb2ludC1kZXNjIHByb3BzPVwie1xuICogICAgICAgIHBvc2l0aW9uOiBpbm5lckFycmF5SXRlbS5wb3MsXG4gKiAgICAgICAgcGl4ZWxTaXplOiAxMCxcbiAqICAgICAgICBjb2xvcjogZ2V0VHJhY2tDb2xvcih0cmFjayksXG4gKiAgICAgICAgb3V0bGluZUNvbG9yOiBDb2xvci5CTFVFLFxuICogICAgICAgIG91dGxpbmVXaWR0aDogMVxuICogICAgICB9XCI+XG4gKiAgICAgIDwvYWMtcG9pbnQtZGVzYz5cbiAqICAgIDwvYWMtYXJyYXktZGVzYz5cbiAqICA8L2FjLWFycmF5LWRlc2M+XG4gKjwvYWMtbGF5ZXI+XG4gKiAgYGBgXG4gKi9cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWMtYXJyYXktZGVzYycsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGFjLWxheWVyICNsYXllciBbYWNGb3JdPVwiZ2V0QWNGb3JTdHJpbmcoKVwiXG4gICAgICAgICAgICAgIFtjb250ZXh0XT1cImxheWVyU2VydmljZS5jb250ZXh0XCJcbiAgICAgICAgICAgICAgW29wdGlvbnNdPVwibGF5ZXJTZXJ2aWNlLm9wdGlvbnNcIlxuICAgICAgICAgICAgICBbc2hvd109XCJsYXllclNlcnZpY2Uuc2hvdyAmJiBzaG93XCJcbiAgICAgICAgICAgICAgW3pJbmRleF09XCJsYXllclNlcnZpY2UuekluZGV4XCI+XG4gICAgICA8bmctY29udGVudCAjY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPC9hYy1sYXllcj5cbiAgYCxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFjQXJyYXlEZXNjQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSwgSURlc2NyaXB0aW9uIHtcblxuICBASW5wdXQoKSBhY0Zvcjogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIGlkR2V0dGVyOiAoaXRlbTogYW55LCBpbmRleDogbnVtYmVyKSA9PiBzdHJpbmc7XG5cbiAgQElucHV0KCkgc2hvdyA9IHRydWU7XG4gIEBWaWV3Q2hpbGQoJ2xheWVyJywge3N0YXRpYzogdHJ1ZX0pIHByaXZhdGUgbGF5ZXI6IEFjTGF5ZXJDb21wb25lbnQ7XG4gIEBDb250ZW50Q2hpbGRyZW4oQmFzaWNEZXNjLCB7ZGVzY2VuZGFudHM6IGZhbHNlfSkgcHJpdmF0ZSBiYXNpY0Rlc2NzOiBhbnk7XG4gIEBDb250ZW50Q2hpbGRyZW4oQWNBcnJheURlc2NDb21wb25lbnQsIHtkZXNjZW5kYW50czogZmFsc2V9KSBwcml2YXRlIGFycmF5RGVzY3M6IGFueTtcbiAgcHJpdmF0ZSBlbnRpdGllc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgcHJpdmF0ZSBsYXllclNlcnZpY2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBpZCA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWNGb3JSZ3ggPSAvXmxldFxccysuK1xccytvZlxccysuKyQvO1xuICBlbnRpdHlOYW1lOiBzdHJpbmc7XG4gIGFycmF5UGF0aDogc3RyaW5nO1xuICBhcnJheU9ic2VydmFibGUkID0gbmV3IFN1YmplY3Q8QWNOb3RpZmljYXRpb24+KCk7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGxheWVyU2VydmljZTogTGF5ZXJTZXJ2aWNlLCBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydhY0ZvciddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICBjb25zdCBhY0ZvclN0cmluZyA9IGNoYW5nZXNbJ2FjRm9yJ10uY3VycmVudFZhbHVlO1xuICAgICAgaWYgKCF0aGlzLmFjRm9yUmd4LnRlc3QoYWNGb3JTdHJpbmcpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgYWMtbGF5ZXI6IEludmFsaWQgW2FjRm9yXSBzeW50YXguIEV4cGVjdGVkOiBbYWNGb3JdPVwibGV0IGl0ZW0gb2Ygb2JzZXJ2YWJsZVwiIC5JbnN0ZWFkIHJlY2VpdmVkOiAke2FjRm9yU3RyaW5nfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgYWNGb3JBcnIgPSBjaGFuZ2VzWydhY0ZvciddLmN1cnJlbnRWYWx1ZS5zcGxpdCgnICcpO1xuICAgICAgdGhpcy5hcnJheVBhdGggPSBhY0ZvckFyclszXTtcbiAgICAgIHRoaXMuZW50aXR5TmFtZSA9IGFjRm9yQXJyWzFdO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxheWVyKSB7XG4gICAgICB0aGlzLmxheWVyLmdldExheWVyU2VydmljZSgpLmNhY2hlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5sYXllclNlcnZpY2VTdWJzY3JpcHRpb24gPSB0aGlzLmxheWVyU2VydmljZS5sYXllclVwZGF0ZXMoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5sYXllclNlcnZpY2UuY29udGV4dFsnYXJyYXlPYnNlcnZhYmxlJCddID0gdGhpcy5hcnJheU9ic2VydmFibGUkO1xuICAgIHRoaXMubGF5ZXJTZXJ2aWNlLnJlZ2lzdGVyRGVzY3JpcHRpb24odGhpcyk7XG4gICAgdGhpcy5iYXNpY0Rlc2NzLl9yZXN1bHRzLmZvckVhY2goKGNvbXBvbmVudDogQmFzaWNEZXNjKSA9PiB7XG4gICAgICBjb21wb25lbnQuc2V0TGF5ZXJTZXJ2aWNlKHRoaXMubGF5ZXIuZ2V0TGF5ZXJTZXJ2aWNlKCkpO1xuICAgIH0pO1xuICAgIHRoaXMuYXJyYXlEZXNjcy5fcmVzdWx0cy5zcGxpY2UoMCwgMSk7XG4gICAgdGhpcy5hcnJheURlc2NzLl9yZXN1bHRzLmZvckVhY2goKGNvbXBvbmVudDogQWNBcnJheURlc2NDb21wb25lbnQpID0+IHtcbiAgICAgIHRoaXMubGF5ZXJTZXJ2aWNlLnVucmVnaXN0ZXJEZXNjcmlwdGlvbihjb21wb25lbnQpO1xuICAgICAgdGhpcy5sYXllci5nZXRMYXllclNlcnZpY2UoKS5yZWdpc3RlckRlc2NyaXB0aW9uKGNvbXBvbmVudCk7XG4gICAgICBjb21wb25lbnQubGF5ZXJTZXJ2aWNlID0gdGhpcy5sYXllci5nZXRMYXllclNlcnZpY2UoKTtcbiAgICAgIGNvbXBvbmVudC5zZXRMYXllclNlcnZpY2UodGhpcy5sYXllci5nZXRMYXllclNlcnZpY2UoKSk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sYXllclNlcnZpY2VTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMubGF5ZXJTZXJ2aWNlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0TGF5ZXJTZXJ2aWNlKGxheWVyU2VydmljZTogTGF5ZXJTZXJ2aWNlKSB7XG4gICAgdGhpcy5sYXllclNlcnZpY2UgPSBsYXllclNlcnZpY2U7XG4gIH1cblxuICBkcmF3KGNvbnRleHQ6IGFueSwgaWQ6IHN0cmluZywgY29udGV4dEVudGl0eTogYW55KSB7XG4gICAgY29uc3QgZW50aXRpZXNBcnJheTogYW55W10gPSBnZXQoY29udGV4dCwgdGhpcy5hcnJheVBhdGgpO1xuICAgIGlmICghZW50aXRpZXNBcnJheSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwcmV2aW91c0VudGl0aWVzSWRBcnJheSA9IHRoaXMuZW50aXRpZXNNYXAuZ2V0KGlkKTtcbiAgICBjb25zdCBlbnRpdGllc0lkQXJyYXk6IGFueVtdID0gW107XG4gICAgdGhpcy5lbnRpdGllc01hcC5zZXQoaWQsIGVudGl0aWVzSWRBcnJheSk7XG5cbiAgICBlbnRpdGllc0FycmF5LmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICB0aGlzLmxheWVyU2VydmljZS5jb250ZXh0W3RoaXMuZW50aXR5TmFtZV0gPSBpdGVtO1xuICAgICAgY29uc3QgYXJyYXlJdGVtSWQgPSB0aGlzLmdlbmVyYXRlQ29tYmluZWRJZChpZCwgaXRlbSwgaW5kZXgpO1xuICAgICAgZW50aXRpZXNJZEFycmF5LnB1c2goYXJyYXlJdGVtSWQpO1xuICAgICAgdGhpcy5sYXllci51cGRhdGUoY29udGV4dEVudGl0eSwgYXJyYXlJdGVtSWQpO1xuICAgIH0pO1xuXG4gICAgaWYgKHByZXZpb3VzRW50aXRpZXNJZEFycmF5KSB7XG4gICAgICBjb25zdCBlbnRpdGllc1RvUmVtb3ZlID0gdGhpcy5pZEdldHRlciA/XG4gICAgICAgIHByZXZpb3VzRW50aXRpZXNJZEFycmF5LmZpbHRlcigoZW50aXR5SWQpID0+IGVudGl0aWVzSWRBcnJheS5pbmRleE9mKGVudGl0eUlkKSA8IDApIDpcbiAgICAgICAgcHJldmlvdXNFbnRpdGllc0lkQXJyYXk7XG4gICAgICBpZiAoZW50aXRpZXNUb1JlbW92ZSkge1xuICAgICAgICBlbnRpdGllc1RvUmVtb3ZlLmZvckVhY2goKGVudGl0eUlkKSA9PiB0aGlzLmxheWVyLnJlbW92ZShlbnRpdHlJZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlbW92ZShpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgZW50aXRpZXNJZEFycmF5ID0gdGhpcy5lbnRpdGllc01hcC5nZXQoaWQpO1xuICAgIGlmIChlbnRpdGllc0lkQXJyYXkpIHtcbiAgICAgIGVudGl0aWVzSWRBcnJheS5mb3JFYWNoKChlbnRpdHlJZCkgPT4gdGhpcy5sYXllci5yZW1vdmUoZW50aXR5SWQpKTtcbiAgICB9XG4gICAgdGhpcy5lbnRpdGllc01hcC5kZWxldGUoaWQpO1xuICB9XG5cbiAgcmVtb3ZlQWxsKCkge1xuICAgIHRoaXMubGF5ZXIucmVtb3ZlQWxsKCk7XG4gICAgdGhpcy5lbnRpdGllc01hcC5jbGVhcigpO1xuICB9XG5cbiAgZ2V0QWNGb3JTdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBsZXQgJHt0aGlzLmVudGl0eU5hbWUgKyAnX19fdGVtcCd9IG9mIGFycmF5T2JzZXJ2YWJsZSRgO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZUNvbWJpbmVkSWQoZW50aXR5SWQ6IHN0cmluZywgYXJyYXlJdGVtOiBhbnksIGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGxldCBhcnJheUl0ZW1JZDtcbiAgICBpZiAodGhpcy5pZEdldHRlcikge1xuICAgICAgYXJyYXlJdGVtSWQgPSB0aGlzLmlkR2V0dGVyKGFycmF5SXRlbSwgaW5kZXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcnJheUl0ZW1JZCA9ICh0aGlzLmlkKyspICUgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG4gICAgfVxuICAgIHJldHVybiBlbnRpdHlJZCArIGFycmF5SXRlbUlkO1xuICB9XG59XG4iXX0=