ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
328 lines • 51.1 kB
JavaScript
import { Component, ViewChild, ElementRef, HostListener, ViewContainerRef, ViewEncapsulation } from '@angular/core';
import { PickerOptions } from './picker-options.provider';
import { getEventTarget, getVelocity } from 'ng-zorro-antd-mobile/core';
import { LocaleProviderService } from 'ng-zorro-antd-mobile/locale-provider';
import { takeUntil } from 'rxjs/operators';
import { Subject } from 'rxjs';
import { PickerRef } from './picker-ref.class';
import * as i0 from "@angular/core";
import * as i1 from "./picker-options.provider";
import * as i2 from "ng-zorro-antd-mobile/locale-provider";
import * as i3 from "@angular/common";
export class PickerComponent extends PickerRef {
panstart(event) {
if (!event.target.classList.contains('am-picker-col-mask') || this.options.disabled) {
return;
}
this.isMouseDown = true;
event.preventDefault();
this.dom = getEventTarget(event).target.parentElement.children[2];
this.len = this.dom.children.length;
this.maxY = -(this.len - 1);
if (this.dom.style.transform === 'translateY(0px)') {
this.currentY = 0;
this.maxY = -(this.len - 1);
}
else if (this.selectedTarget.length > 0) {
this.selectedTarget.forEach(item => {
if (item.targetId === event.target.id) {
this.currentY = item.currentY;
}
});
}
this.startY = getEventTarget(event).clientY;
}
panmove(event) {
if (!event.target.classList.contains('am-picker-col-mask') || !this.isMouseDown || this.options.disabled) {
return;
}
event.preventDefault();
const ev = getEventTarget(event);
this.differY = ev.clientY - this.startY;
this.Velocity.record(this.differY);
this.dom.style.transition = 'transform 0s';
this.dom.style.transform = `translateY(${this.currentY * this.lineHeight + this.differY}px)`;
}
panend(event) {
if (!event.target.classList.contains('am-picker-col-mask') || !this.isMouseDown || this.options.disabled) {
return;
}
this.isMouseDown = false;
event.preventDefault();
const ev = getEventTarget(event);
this.differY = ev.clientY - this.startY;
let time = 0.3;
const velocityTemp = this.Velocity.getVelocity(this.differY) * 4;
if (getVelocity) {
this.differY = velocityTemp * 40 + this.differY;
time = Math.abs(velocityTemp) * 0.1;
}
this.dom.style.transition = 'transform ' + (time < 0.3 ? 0.3 : time) + 's';
if (this.differY <= -this.lineHeight / 2) {
this.currentY += Math.floor(this.differY / this.lineHeight + 0.5);
if (this.currentY <= this.maxY) {
this.currentY = this.maxY;
}
}
else if (this.differY >= this.lineHeight / 2) {
this.currentY += Math.floor(this.differY / this.lineHeight + 0.5);
if (this.currentY >= 0) {
this.currentY = 0;
}
}
if (this.selectedTarget.length > 0) {
let hasKey = false;
this.selectedTarget.forEach(item => {
if (item.targetId === event.target.id) {
hasKey = true;
item.targetId = event.target.id;
item.currentY = this.currentY;
}
else if (parseInt(item.targetId, 0) > parseInt(event.target.id, 0) && this.options.cascade) {
item.currentY = 0;
}
});
if (!hasKey) {
this.selectedTarget.push({ targetId: event.target.id, currentY: this.currentY });
}
}
else {
this.selectedTarget.push({ targetId: event.target.id, currentY: this.currentY });
}
this.dom.style.transform = `translateY(${this.currentY * this.lineHeight}px)`;
this.index = Math.floor(Math.abs(this.currentY / 1));
this.setCurrentSelected(parseInt(event.target.id, 0), this.index);
if (this.options.value !== this.combineReslut()) {
this.options.onPickerChange.emit(this.combineReslut());
this.onChange(this.combineReslut());
}
}
constructor(elementRef, options, _localeProviderService) {
super();
this.elementRef = elementRef;
this.options = options;
this._localeProviderService = _localeProviderService;
this.transitionName = 'am-slide-up-enter am-slide-up-enter-active';
this.maskTransitionName = 'am-fade-enter am-fade-enter-active';
this.startY = 0;
this.differY = 0;
this.currentY = 0;
this.len = 0;
this.dom = null;
this.index = 0;
this.maxY = 0;
this.lineHeight = 34;
this.dataForRender = [];
this.selectedTarget = [];
this.isMouseDown = false;
this.Velocity = getVelocity();
this._unsubscribe$ = new Subject();
this.onChange = (_) => { };
}
init() {
if (this.dataForRender.length === 0 && this.generateArrayData(this.options.data).length > 0) {
this.dataForRender.push(this.generateArrayData(this.options.data));
}
if (this.options.value.length > 0) {
this.getInitValueIndex(this.dataForRender);
}
else {
this.checkArrayDeep(this.options.data[0]);
for (let index = 0; index < this.dataForRender.length; index++) {
this.selectedTarget.push({ targetId: `${index}`, currentY: 0 });
}
}
}
getInitValueIndex(dataTemp) {
const self = this;
self.selectedTarget = [];
self.options.value.forEach((element, i) => {
dataTemp.forEach((item, j) => {
item.forEach((item1, k) => {
if ((element === item1.label || element === item1.value || element === item1) && i === j) {
self.checkArrayDeep(self.dataForRender[i][k], false);
self.selectedTarget.push({ targetId: `${i}`, currentY: -k });
}
});
});
});
}
reloadPicker() {
if (!this._picker || this._picker === undefined) {
return;
}
this.currentPicker = this._picker.element.nativeElement;
if (this.currentPicker && this.currentPicker.children.length > 0) {
const self = this;
setTimeout(() => {
self.selectedTarget.forEach((item, i) => {
self.currentPicker.children[i].children[2].style.transition = 'transform .3s';
const index = parseInt(item.currentY, 0);
self.currentPicker.children[i].children[2].style.transform = `translateY(${index * self.lineHeight}px)`;
});
}, 0);
}
}
generateArrayData(targetArr) {
const tempArr = [];
if (targetArr instanceof Array) {
targetArr.forEach((item, i) => {
if (item instanceof Array) {
const keys = Object.keys(item);
const element = {};
keys.forEach(key => {
element[key] = targetArr[i][key] || targetArr[i];
});
tempArr.push(element);
}
else {
tempArr.push(item);
}
});
return tempArr;
}
return [];
}
checkArrayDeep(parent, init = true) {
if (parent instanceof Object && parent.children && parent.children.length > 0) {
if (this.generateArrayData(parent.children).length > 0 && this.dataForRender.length < this.options.cols) {
let hasValue = false;
this.dataForRender.filter((item, index) => {
if (JSON.stringify(item) === JSON.stringify(parent.children)) {
hasValue = true;
}
});
if (!hasValue) {
this.dataForRender.push(this.generateArrayData(parent.children));
}
if (init) {
this.checkArrayDeep(parent.children[0]);
}
}
}
}
ok() {
if (this.options.updateNgModel) {
this.options.updateNgModel(this.combineReslut());
}
if (this.options.confirm) {
this.options.confirm(this.combineReslut());
}
this.setTransitionName();
}
combineReslut() {
const result = [];
const self = this;
self.selectedTarget.forEach(item => {
if (self.dataForRender.length > 0 && self.dataForRender.length >= parseInt(item.targetId, 0) + 1) {
const curItem = self.dataForRender[parseInt(item.targetId, 0)][-item.currentY];
if (curItem !== undefined) {
result.push(curItem);
}
}
});
return result;
}
cancel() {
this.setTransitionName();
this.options.onDismiss.emit();
if (this.options.cancel) {
this.options.cancel();
}
}
setTransitionName() {
this.transitionName = 'am-slide-up-leave am-slide-up-leave-active';
this.maskTransitionName = 'am-fade-leave am-fade-leave-active';
setTimeout(() => {
this.options.hidePicker();
}, 200);
}
setCurrentSelected(target, index) {
if (!this.options.cascade) {
return;
}
const a = this.dataForRender.slice(0, target + 1);
this.dataForRender = a;
this.checkArrayDeep(this.dataForRender[target][index]);
if (this.selectedTarget.length > 0 && this.selectedTarget.length < this.dataForRender.length) {
for (let i = 0; i < this.dataForRender.length; i++) {
if (i > target) {
if (i < this.selectedTarget.length) {
this.selectedTarget[i] = { targetId: `${i}`, currentY: 0 };
}
else {
this.selectedTarget.push({ targetId: `${i}`, currentY: 0 });
}
}
}
}
setTimeout(() => {
this.dataForRender.forEach((item, i) => {
if (target !== `${i}` && i > target) {
this._picker.element.nativeElement.children[i].children[2].style.transition = 'transform .3s';
this._picker.element.nativeElement.children[i].children[2].style.transform = 'translateY(0px)';
}
});
}, 0);
}
getInstance() {
return this;
}
getElement() {
return this.elementRef && this.elementRef.nativeElement;
}
close() {
if (this.options.hidePicker) {
this.options.hidePicker();
}
}
destroy() {
this.close();
}
ngOnInit() {
this.init();
this._localeProviderService.localeChange.pipe(takeUntil(this._unsubscribe$)).subscribe(_ => {
const locale = this._localeProviderService.getLocaleSubObj('Picker');
this.options.okText = this.options.okText === '确定' ? locale.okText : this.options.okText;
this.options.dismissText = this.options.dismissText === '取消' ? locale.dismissText : this.options.dismissText;
});
}
ngAfterViewInit() {
this.reloadPicker();
}
ngOnDestroy() {
this._unsubscribe$.next();
this._unsubscribe$.complete();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: PickerComponent, deps: [{ token: i0.ElementRef }, { token: i1.PickerOptions }, { token: i2.LocaleProviderService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.8", type: PickerComponent, selector: "Picker", host: { listeners: { "mousedown": "panstart($event)", "touchstart": "panstart($event)", "mousemove": "panmove($event)", "touchmove": "panmove($event)", "mouseup": "panend($event)", "mouseleave": "panend($event)", "touchend": "panend($event)" } }, viewQueries: [{ propertyName: "_picker", first: true, predicate: ["picker"], descendants: true, read: ViewContainerRef, static: true }], usesInheritance: true, ngImport: i0, template: "<div *ngIf=\"options.mask\" class=\"am-picker-popup-mask {{ maskTransitionName }}\" (click)=\"cancel()\"></div>\n<div class=\"am-picker-popup am-picker-popup-wrap {{ transitionName }}\" style=\" min-height: 280px\">\n <div class=\"am-picker-popup-content\">\n <div class=\"am-picker-popup-body\">\n <div>\n <div class=\"am-picker-popup-header\">\n <div class=\"am-picker-popup-item am-picker-popup-header-left\" (click)=\"cancel()\">\n {{ options.dismissText }}\n </div>\n <div class=\"am-picker-popup-item am-picker-popup-title\">{{ options.title }}</div>\n <div class=\"am-picker-popup-item am-picker-popup-header-right\" (click)=\"ok()\">{{ options.okText }}</div>\n </div>\n <div class=\"am-picker\" style=\"flex-direction: row; align-items: center;\" #picker>\n <div *ngFor=\"let item of dataForRender; let i = index\" class=\"am-picker-col\">\n <div class=\"am-picker-col-indicator \" style=\"top: 102px;\" [ngStyle]=\"options.indicatorStyle\"></div>\n <div class=\"am-picker-col-mask\" style=\"background-size: 100% 102px;\" id=\"{{ i }}\"></div>\n <div class=\"am-picker-col-content\">\n <div *ngFor=\"let val of item; let i = index\" class=\"am-picker-col-item\" id=\"{{ i }}\">\n {{ val.label ? val.label : val }}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: PickerComponent, decorators: [{
type: Component,
args: [{ selector: 'Picker', encapsulation: ViewEncapsulation.None, template: "<div *ngIf=\"options.mask\" class=\"am-picker-popup-mask {{ maskTransitionName }}\" (click)=\"cancel()\"></div>\n<div class=\"am-picker-popup am-picker-popup-wrap {{ transitionName }}\" style=\" min-height: 280px\">\n <div class=\"am-picker-popup-content\">\n <div class=\"am-picker-popup-body\">\n <div>\n <div class=\"am-picker-popup-header\">\n <div class=\"am-picker-popup-item am-picker-popup-header-left\" (click)=\"cancel()\">\n {{ options.dismissText }}\n </div>\n <div class=\"am-picker-popup-item am-picker-popup-title\">{{ options.title }}</div>\n <div class=\"am-picker-popup-item am-picker-popup-header-right\" (click)=\"ok()\">{{ options.okText }}</div>\n </div>\n <div class=\"am-picker\" style=\"flex-direction: row; align-items: center;\" #picker>\n <div *ngFor=\"let item of dataForRender; let i = index\" class=\"am-picker-col\">\n <div class=\"am-picker-col-indicator \" style=\"top: 102px;\" [ngStyle]=\"options.indicatorStyle\"></div>\n <div class=\"am-picker-col-mask\" style=\"background-size: 100% 102px;\" id=\"{{ i }}\"></div>\n <div class=\"am-picker-col-content\">\n <div *ngFor=\"let val of item; let i = index\" class=\"am-picker-col-item\" id=\"{{ i }}\">\n {{ val.label ? val.label : val }}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.PickerOptions }, { type: i2.LocaleProviderService }], propDecorators: { _picker: [{
type: ViewChild,
args: ['picker', { read: ViewContainerRef, static: true }]
}], panstart: [{
type: HostListener,
args: ['mousedown', ['$event']]
}, {
type: HostListener,
args: ['touchstart', ['$event']]
}], panmove: [{
type: HostListener,
args: ['mousemove', ['$event']]
}, {
type: HostListener,
args: ['touchmove', ['$event']]
}], panend: [{
type: HostListener,
args: ['mouseup', ['$event']]
}, {
type: HostListener,
args: ['mouseleave', ['$event']]
}, {
type: HostListener,
args: ['touchend', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvcGlja2VyL3BpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi9jb21wb25lbnRzL3BpY2tlci9waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLFNBQVMsRUFDVCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFFWixnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7QUFPL0MsTUFBTSxPQUFPLGVBQWtDLFNBQVEsU0FBZTtJQXdCcEUsUUFBUSxDQUFDLEtBQUs7UUFDWixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUU7WUFDbkYsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxHQUFHLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xF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QUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7c0JBQ2xDLFlBQVk7dUJBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDOztzQkFDckMsWUFBWTt1QkFBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgQ29tcG9uZW50LFxuICBWaWV3Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQaWNrZXJPcHRpb25zIH0gZnJvbSAnLi9waWNrZXItb3B0aW9ucy5wcm92aWRlcic7XG5pbXBvcnQgeyBnZXRFdmVudFRhcmdldCwgZ2V0VmVsb2NpdHkgfSBmcm9tICduZy16b3Jyby1hbnRkLW1vYmlsZS9jb3JlJztcbmltcG9ydCB7IExvY2FsZVByb3ZpZGVyU2VydmljZSB9IGZyb20gJ25nLXpvcnJvLWFudGQtbW9iaWxlL2xvY2FsZS1wcm92aWRlcic7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQaWNrZXJSZWYgfSBmcm9tICcuL3BpY2tlci1yZWYuY2xhc3MnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdQaWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBQaWNrZXJDb21wb25lbnQ8VCA9IGFueSwgUiA9IGFueT4gZXh0ZW5kcyBQaWNrZXJSZWY8VCwgUj4gaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHRyYW5zaXRpb25OYW1lOiBzdHJpbmcgPSAnYW0tc2xpZGUtdXAtZW50ZXIgYW0tc2xpZGUtdXAtZW50ZXItYWN0aXZlJztcbiAgbWFza1RyYW5zaXRpb25OYW1lOiBzdHJpbmcgPSAnYW0tZmFkZS1lbnRlciBhbS1mYWRlLWVudGVyLWFjdGl2ZSc7XG4gIHN0YXJ0WTogbnVtYmVyID0gMDtcbiAgZGlmZmVyWTogbnVtYmVyID0gMDtcbiAgY3VycmVudFk6IG51bWJlciA9IDA7XG4gIGxlbjogbnVtYmVyID0gMDtcbiAgZG9tOiBhbnkgPSBudWxsO1xuICBpbmRleDogbnVtYmVyID0gMDtcbiAgbWF4WTogbnVtYmVyID0gMDtcbiAgbGluZUhlaWdodDogbnVtYmVyID0gMzQ7XG4gIGRhdGFGb3JSZW5kZXI6IGFueVtdID0gW107XG4gIHNlbGVjdGVkVGFyZ2V0OiBhbnlbXSA9IFtdO1xuICBpc01vdXNlRG93bjogYm9vbGVhbiA9IGZhbHNlO1xuICBWZWxvY2l0eSA9IGdldFZlbG9jaXR5KCk7XG4gIGN1cnJlbnRQaWNrZXI6IGFueTtcblxuICBwcml2YXRlIF91bnN1YnNjcmliZSQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3BpY2tlcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlIH0pXG4gIHByaXZhdGUgX3BpY2tlcjogVmlld0NvbnRhaW5lclJlZjtcblxuICBASG9zdExpc3RlbmVyKCdtb3VzZWRvd24nLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgWyckZXZlbnQnXSlcbiAgcGFuc3RhcnQoZXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2FtLXBpY2tlci1jb2wtbWFzaycpIHx8IHRoaXMub3B0aW9ucy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzTW91c2VEb3duID0gdHJ1ZTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuZG9tID0gZ2V0RXZlbnRUYXJnZXQoZXZlbnQpLnRhcmdldC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuWzJdO1xuICAgIHRoaXMubGVuID0gdGhpcy5kb20uY2hpbGRyZW4ubGVuZ3RoO1xuICAgIHRoaXMubWF4WSA9IC0odGhpcy5sZW4gLSAxKTtcblxuICAgIGlmICh0aGlzLmRvbS5zdHlsZS50cmFuc2Zvcm0gPT09ICd0cmFuc2xhdGVZKDBweCknKSB7XG4gICAgICB0aGlzLmN1cnJlbnRZID0gMDtcbiAgICAgIHRoaXMubWF4WSA9IC0odGhpcy5sZW4gLSAxKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRUYXJnZXQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZWxlY3RlZFRhcmdldC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpZiAoaXRlbS50YXJnZXRJZCA9PT0gZXZlbnQudGFyZ2V0LmlkKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50WSA9IGl0ZW0uY3VycmVudFk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnN0YXJ0WSA9IGdldEV2ZW50VGFyZ2V0KGV2ZW50KS5jbGllbnRZO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignbW91c2Vtb3ZlJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcigndG91Y2htb3ZlJywgWyckZXZlbnQnXSlcbiAgcGFubW92ZShldmVudCkge1xuICAgIGlmICghZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnYW0tcGlja2VyLWNvbC1tYXNrJykgfHwgIXRoaXMuaXNNb3VzZURvd24gfHwgdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgZXYgPSBnZXRFdmVudFRhcmdldChldmVudCk7XG4gICAgdGhpcy5kaWZmZXJZID0gZXYuY2xpZW50WSAtIHRoaXMuc3RhcnRZO1xuICAgIHRoaXMuVmVsb2NpdHkucmVjb3JkKHRoaXMuZGlmZmVyWSk7XG4gICAgdGhpcy5kb20uc3R5bGUudHJhbnNpdGlvbiA9ICd0cmFuc2Zvcm0gMHMnO1xuICAgIHRoaXMuZG9tLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7dGhpcy5jdXJyZW50WSAqIHRoaXMubGluZUhlaWdodCArIHRoaXMuZGlmZmVyWX1weClgO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignbW91c2V1cCcsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCd0b3VjaGVuZCcsIFsnJGV2ZW50J10pXG4gIHBhbmVuZChldmVudCkge1xuICAgIGlmICghZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnYW0tcGlja2VyLWNvbC1tYXNrJykgfHwgIXRoaXMuaXNNb3VzZURvd24gfHwgdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXNNb3VzZURvd24gPSBmYWxzZTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGV2ID0gZ2V0RXZlbnRUYXJnZXQoZXZlbnQpO1xuICAgIHRoaXMuZGlmZmVyWSA9IGV2LmNsaWVudFkgLSB0aGlzLnN0YXJ0WTtcbiAgICBsZXQgdGltZSA9IDAuMztcbiAgICBjb25zdCB2ZWxvY2l0eVRlbXAgPSB0aGlzLlZlbG9jaXR5LmdldFZlbG9jaXR5KHRoaXMuZGlmZmVyWSkgKiA0O1xuICAgIGlmIChnZXRWZWxvY2l0eSkge1xuICAgICAgdGhpcy5kaWZmZXJZID0gdmVsb2NpdHlUZW1wICogNDAgKyB0aGlzLmRpZmZlclk7XG4gICAgICB0aW1lID0gTWF0aC5hYnModmVsb2NpdHlUZW1wKSAqIDAuMTtcbiAgICB9XG4gICAgdGhpcy5kb20uc3R5bGUudHJhbnNpdGlvbiA9ICd0cmFuc2Zvcm0gJyArICh0aW1lIDwgMC4zID8gMC4zIDogdGltZSkgKyAncyc7XG4gICAgaWYgKHRoaXMuZGlmZmVyWSA8PSAtdGhpcy5saW5lSGVpZ2h0IC8gMikge1xuICAgICAgdGhpcy5jdXJyZW50WSArPSBNYXRoLmZsb29yKHRoaXMuZGlmZmVyWSAvIHRoaXMubGluZUhlaWdodCArIDAuNSk7XG4gICAgICBpZiAodGhpcy5jdXJyZW50WSA8PSB0aGlzLm1heFkpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50WSA9IHRoaXMubWF4WTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuZGlmZmVyWSA+PSB0aGlzLmxpbmVIZWlnaHQgLyAyKSB7XG4gICAgICB0aGlzLmN1cnJlbnRZICs9IE1hdGguZmxvb3IodGhpcy5kaWZmZXJZIC8gdGhpcy5saW5lSGVpZ2h0ICsgMC41KTtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRZID49IDApIHtcbiAgICAgICAgdGhpcy5jdXJyZW50WSA9IDA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdGVkVGFyZ2V0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBoYXNLZXkgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYXJnZXQuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaWYgKGl0ZW0udGFyZ2V0SWQgPT09IGV2ZW50LnRhcmdldC5pZCkge1xuICAgICAgICAgIGhhc0tleSA9IHRydWU7XG4gICAgICAgICAgaXRlbS50YXJnZXRJZCA9IGV2ZW50LnRhcmdldC5pZDtcbiAgICAgICAgICBpdGVtLmN1cnJlbnRZID0gdGhpcy5jdXJyZW50WTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXJzZUludChpdGVtLnRhcmdldElkLCAwKSA+IHBhcnNlSW50KGV2ZW50LnRhcmdldC5pZCwgMCkgJiYgdGhpcy5vcHRpb25zLmNhc2NhZGUpIHtcbiAgICAgICAgICBpdGVtLmN1cnJlbnRZID0gMDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoIWhhc0tleSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGFyZ2V0LnB1c2goeyB0YXJnZXRJZDogZXZlbnQudGFyZ2V0LmlkLCBjdXJyZW50WTogdGhpcy5jdXJyZW50WSB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZFRhcmdldC5wdXNoKHsgdGFyZ2V0SWQ6IGV2ZW50LnRhcmdldC5pZCwgY3VycmVudFk6IHRoaXMuY3VycmVudFkgfSk7XG4gICAgfVxuICAgIHRoaXMuZG9tLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7dGhpcy5jdXJyZW50WSAqIHRoaXMubGluZUhlaWdodH1weClgO1xuICAgIHRoaXMuaW5kZXggPSBNYXRoLmZsb29yKE1hdGguYWJzKHRoaXMuY3VycmVudFkgLyAxKSk7XG4gICAgdGhpcy5zZXRDdXJyZW50U2VsZWN0ZWQocGFyc2VJbnQoZXZlbnQudGFyZ2V0LmlkLCAwKSwgdGhpcy5pbmRleCk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy52YWx1ZSAhPT0gdGhpcy5jb21iaW5lUmVzbHV0KCkpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5vblBpY2tlckNoYW5nZS5lbWl0KHRoaXMuY29tYmluZVJlc2x1dCgpKTtcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5jb21iaW5lUmVzbHV0KCkpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHB1YmxpYyBvcHRpb25zOiBQaWNrZXJPcHRpb25zLFxuICAgIHByaXZhdGUgX2xvY2FsZVByb3ZpZGVyU2VydmljZTogTG9jYWxlUHJvdmlkZXJTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvbkNoYW5nZSA9IChfOiBhbnlbXSkgPT4ge307XG5cbiAgaW5pdCgpIHtcbiAgICBpZiAodGhpcy5kYXRhRm9yUmVuZGVyLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmdlbmVyYXRlQXJyYXlEYXRhKHRoaXMub3B0aW9ucy5kYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmRhdGFGb3JSZW5kZXIucHVzaCh0aGlzLmdlbmVyYXRlQXJyYXlEYXRhKHRoaXMub3B0aW9ucy5kYXRhKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMudmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5nZXRJbml0VmFsdWVJbmRleCh0aGlzLmRhdGFGb3JSZW5kZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNoZWNrQXJyYXlEZWVwKHRoaXMub3B0aW9ucy5kYXRhWzBdKTtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmRhdGFGb3JSZW5kZXIubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYXJnZXQucHVzaCh7IHRhcmdldElkOiBgJHtpbmRleH1gLCBjdXJyZW50WTogMCB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRJbml0VmFsdWVJbmRleChkYXRhVGVtcCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHNlbGYuc2VsZWN0ZWRUYXJnZXQgPSBbXTtcbiAgICBzZWxmLm9wdGlvbnMudmFsdWUuZm9yRWFjaCgoZWxlbWVudCwgaSkgPT4ge1xuICAgICAgZGF0YVRlbXAuZm9yRWFjaCgoaXRlbSwgaikgPT4ge1xuICAgICAgICBpdGVtLmZvckVhY2goKGl0ZW0xLCBrKSA9PiB7XG4gICAgICAgICAgaWYgKChlbGVtZW50ID09PSBpdGVtMS5sYWJlbCB8fCBlbGVtZW50ID09PSBpdGVtMS52YWx1ZSB8fCBlbGVtZW50ID09PSBpdGVtMSkgJiYgaSA9PT0gaikge1xuICAgICAgICAgICAgc2VsZi5jaGVja0FycmF5RGVlcChzZWxmLmRhdGFGb3JSZW5kZXJbaV1ba10sIGZhbHNlKTtcbiAgICAgICAgICAgIHNlbGYuc2VsZWN0ZWRUYXJnZXQucHVzaCh7IHRhcmdldElkOiBgJHtpfWAsIGN1cnJlbnRZOiAtayB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICByZWxvYWRQaWNrZXIoKSB7XG4gICAgaWYgKCF0aGlzLl9waWNrZXIgfHwgdGhpcy5fcGlja2VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50UGlja2VyID0gdGhpcy5fcGlja2VyLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICBpZiAodGhpcy5jdXJyZW50UGlja2VyICYmIHRoaXMuY3VycmVudFBpY2tlci5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBzZWxmLnNlbGVjdGVkVGFyZ2V0LmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICBzZWxmLmN1cnJlbnRQaWNrZXIuY2hpbGRyZW5baV0uY2hpbGRyZW5bMl0uc3R5bGUudHJhbnNpdGlvbiA9ICd0cmFuc2Zvcm0gLjNzJztcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KGl0ZW0uY3VycmVudFksIDApO1xuICAgICAgICAgIHNlbGYuY3VycmVudFBpY2tlci5jaGlsZHJlbltpXS5jaGlsZHJlblsyXS5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke2luZGV4ICogc2VsZi5saW5lSGVpZ2h0fXB4KWA7XG4gICAgICAgIH0pO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgZ2VuZXJhdGVBcnJheURhdGEodGFyZ2V0QXJyKSB7XG4gICAgY29uc3QgdGVtcEFyciA9IFtdO1xuICAgIGlmICh0YXJnZXRBcnIgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgdGFyZ2V0QXJyLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpdGVtKTtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0ge307XG4gICAgICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBlbGVtZW50W2tleV0gPSB0YXJnZXRBcnJbaV1ba2V5XSB8fCB0YXJnZXRBcnJbaV07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGVtcEFyci5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRlbXBBcnIucHVzaChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGVtcEFycjtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY2hlY2tBcnJheURlZXAocGFyZW50LCBpbml0OiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBPYmplY3QgJiYgcGFyZW50LmNoaWxkcmVuICYmIHBhcmVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodGhpcy5nZW5lcmF0ZUFycmF5RGF0YShwYXJlbnQuY2hpbGRyZW4pLmxlbmd0aCA+IDAgJiYgdGhpcy5kYXRhRm9yUmVuZGVyLmxlbmd0aCA8IHRoaXMub3B0aW9ucy5jb2xzKSB7XG4gICAgICAgIGxldCBoYXNWYWx1ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRhdGFGb3JSZW5kZXIuZmlsdGVyKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShpdGVtKSA9PT0gSlNPTi5zdHJpbmdpZnkocGFyZW50LmNoaWxkcmVuKSkge1xuICAgICAgICAgICAgaGFzVmFsdWUgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghaGFzVmFsdWUpIHtcbiAgICAgICAgICB0aGlzLmRhdGFGb3JSZW5kZXIucHVzaCh0aGlzLmdlbmVyYXRlQXJyYXlEYXRhKHBhcmVudC5jaGlsZHJlbikpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbml0KSB7XG4gICAgICAgICAgdGhpcy5jaGVja0FycmF5RGVlcChwYXJlbnQuY2hpbGRyZW5bMF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb2soKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy51cGRhdGVOZ01vZGVsKSB7XG4gICAgICB0aGlzLm9wdGlvbnMudXBkYXRlTmdNb2RlbCh0aGlzLmNvbWJpbmVSZXNsdXQoKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuY29uZmlybSkge1xuICAgICAgdGhpcy5vcHRpb25zLmNvbmZpcm0odGhpcy5jb21iaW5lUmVzbHV0KCkpO1xuICAgIH1cbiAgICB0aGlzLnNldFRyYW5zaXRpb25OYW1lKCk7XG4gIH1cblxuICBjb21iaW5lUmVzbHV0KCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHNlbGYuc2VsZWN0ZWRUYXJnZXQuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGlmIChzZWxmLmRhdGFGb3JSZW5kZXIubGVuZ3RoID4gMCAmJiBzZWxmLmRhdGFGb3JSZW5kZXIubGVuZ3RoID49IHBhcnNlSW50KGl0ZW0udGFyZ2V0SWQsIDApICsgMSkge1xuICAgICAgICBjb25zdCBjdXJJdGVtID0gc2VsZi5kYXRhRm9yUmVuZGVyW3BhcnNlSW50KGl0ZW0udGFyZ2V0SWQsIDApXVstaXRlbS5jdXJyZW50WV07XG4gICAgICAgIGlmIChjdXJJdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChjdXJJdGVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5zZXRUcmFuc2l0aW9uTmFtZSgpO1xuICAgIHRoaXMub3B0aW9ucy5vbkRpc21pc3MuZW1pdCgpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuY2FuY2VsKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuY2FuY2VsKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0VHJhbnNpdGlvbk5hbWUoKSB7XG4gICAgdGhpcy50cmFuc2l0aW9uTmFtZSA9ICdhbS1zbGlkZS11cC1sZWF2ZSBhbS1zbGlkZS11cC1sZWF2ZS1hY3RpdmUnO1xuICAgIHRoaXMubWFza1RyYW5zaXRpb25OYW1lID0gJ2FtLWZhZGUtbGVhdmUgYW0tZmFkZS1sZWF2ZS1hY3RpdmUnO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5vcHRpb25zLmhpZGVQaWNrZXIoKTtcbiAgICB9LCAyMDApO1xuICB9XG5cbiAgc2V0Q3VycmVudFNlbGVjdGVkKHRhcmdldCwgaW5kZXgpIHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5jYXNjYWRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGEgPSB0aGlzLmRhdGFGb3JSZW5kZXIuc2xpY2UoMCwgdGFyZ2V0ICsgMSk7XG4gICAgdGhpcy5kYXRhRm9yUmVuZGVyID0gYTtcbiAgICB0aGlzLmNoZWNrQXJyYXlEZWVwKHRoaXMuZGF0YUZvclJlbmRlclt0YXJnZXRdW2luZGV4XSk7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRUYXJnZXQubGVuZ3RoID4gMCAmJiB0aGlzLnNlbGVjdGVkVGFyZ2V0Lmxlbmd0aCA8IHRoaXMuZGF0YUZvclJlbmRlci5sZW5ndGgpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kYXRhRm9yUmVuZGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpID4gdGFyZ2V0KSB7XG4gICAgICAgICAgaWYgKGkgPCB0aGlzLnNlbGVjdGVkVGFyZ2V0Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRhcmdldFtpXSA9IHsgdGFyZ2V0SWQ6IGAke2l9YCwgY3VycmVudFk6IDAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRhcmdldC5wdXNoKHsgdGFyZ2V0SWQ6IGAke2l9YCwgY3VycmVudFk6IDAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhRm9yUmVuZGVyLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gYCR7aX1gICYmIGkgPiB0YXJnZXQpIHtcbiAgICAgICAgICB0aGlzLl9waWNrZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50LmNoaWxkcmVuW2ldLmNoaWxkcmVuWzJdLnN0eWxlLnRyYW5zaXRpb24gPSAndHJhbnNmb3JtIC4zcyc7XG4gICAgICAgICAgdGhpcy5fcGlja2VyLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jaGlsZHJlbltpXS5jaGlsZHJlblsyXS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWSgwcHgpJztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBnZXRJbnN0YW5jZSgpOiBQaWNrZXJDb21wb25lbnQge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZ2V0RWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZiAmJiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuaGlkZVBpY2tlcikge1xuICAgICAgdGhpcy5vcHRpb25zLmhpZGVQaWNrZXIoKTtcbiAgICB9XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2UoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW5pdCgpO1xuICAgIHRoaXMuX2xvY2FsZVByb3ZpZGVyU2VydmljZS5sb2NhbGVDaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy5fdW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKF8gPT4ge1xuICAgICAgY29uc3QgbG9jYWxlOiBhbnkgPSB0aGlzLl9sb2NhbGVQcm92aWRlclNlcnZpY2UuZ2V0TG9jYWxlU3ViT2JqKCdQaWNrZXInKTtcbiAgICAgIHRoaXMub3B0aW9ucy5va1RleHQgPSB0aGlzLm9wdGlvbnMub2tUZXh0ID09PSAn56Gu5a6aJyA/IGxvY2FsZS5va1RleHQgOiB0aGlzLm9wdGlvbnMub2tUZXh0O1xuICAgICAgdGhpcy5vcHRpb25zLmRpc21pc3NUZXh0ID0gdGhpcy5vcHRpb25zLmRpc21pc3NUZXh0ID09PSAn5Y+W5raIJyA/IGxvY2FsZS5kaXNtaXNzVGV4dCA6IHRoaXMub3B0aW9ucy5kaXNtaXNzVGV4dDtcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnJlbG9hZFBpY2tlcigpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fdW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICB0aGlzLl91bnN1YnNjcmliZSQuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiPGRpdiAqbmdJZj1cIm9wdGlvbnMubWFza1wiIGNsYXNzPVwiYW0tcGlja2VyLXBvcHVwLW1hc2sge3sgbWFza1RyYW5zaXRpb25OYW1lIH19XCIgKGNsaWNrKT1cImNhbmNlbCgpXCI+PC9kaXY+XG48ZGl2IGNsYXNzPVwiYW0tcGlja2VyLXBvcHVwIGFtLXBpY2tlci1wb3B1cC13cmFwIHt7IHRyYW5zaXRpb25OYW1lIH19XCIgc3R5bGU9XCIgbWluLWhlaWdodDogMjgwcHhcIj5cbiAgPGRpdiBjbGFzcz1cImFtLXBpY2tlci1wb3B1cC1jb250ZW50XCI+XG4gICAgPGRpdiBjbGFzcz1cImFtLXBpY2tlci1wb3B1cC1ib2R5XCI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYW0tcGlja2VyLXBvcHVwLWhlYWRlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbS1waWNrZXItcG9wdXAtaXRlbSBhbS1waWNrZXItcG9wdXAtaGVhZGVyLWxlZnRcIiAoY2xpY2spPVwiY2FuY2VsKClcIj5cbiAgICAgICAgICAgIHt7IG9wdGlvbnMuZGlzbWlzc1RleHQgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW0tcGlja2VyLXBvcHVwLWl0ZW0gYW0tcGlja2VyLXBvcHVwLXRpdGxlXCI+e3sgb3B0aW9ucy50aXRsZSB9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbS1waWNrZXItcG9wdXAtaXRlb