ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
533 lines • 51.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ViewChild, ElementRef, HostListener, ViewContainerRef, ViewEncapsulation } from '@angular/core';
import { PickerOptions } from './picker-options.provider';
import * as velocity from '../core/util/velocity';
import * as touchEvent from '../core/util/touch-event';
import { LocaleProviderService } from '../locale-provider/locale-provider.service';
import { takeUntil } from 'rxjs/operators';
import { Subject } from 'rxjs';
import { PickerRef } from './picker-ref.class';
/**
* @template T, R
*/
export class PickerComponent extends PickerRef {
/**
* @param {?} elementRef
* @param {?} options
* @param {?} _localeProviderService
*/
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 = velocity.getVelocity();
this._unsubscribe$ = new Subject();
this.onChange = (/**
* @param {?} _
* @return {?}
*/
(_) => { });
}
/**
* @param {?} event
* @return {?}
*/
panstart(event) {
if (!event.target.classList.contains('am-picker-col-mask') || this.options.disabled) {
return;
}
this.isMouseDown = true;
event.preventDefault();
this.dom = touchEvent.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((/**
* @param {?} item
* @return {?}
*/
item => {
if (item.targetId === event.target.id) {
this.currentY = item.currentY;
}
}));
}
this.startY = touchEvent.getEventTarget(event).clientY;
}
/**
* @param {?} event
* @return {?}
*/
panmove(event) {
if (!event.target.classList.contains('am-picker-col-mask') || !this.isMouseDown || this.options.disabled) {
return;
}
event.preventDefault();
/** @type {?} */
const ev = touchEvent.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)`;
}
/**
* @param {?} event
* @return {?}
*/
panend(event) {
if (!event.target.classList.contains('am-picker-col-mask') || !this.isMouseDown || this.options.disabled) {
return;
}
this.isMouseDown = false;
event.preventDefault();
/** @type {?} */
const ev = touchEvent.getEventTarget(event);
this.differY = ev.clientY - this.startY;
/** @type {?} */
let time = 0.3;
/** @type {?} */
const velocityTemp = this.Velocity.getVelocity(this.differY) * 4;
if (velocity) {
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);
if (this.currentY <= this.maxY) {
this.currentY = this.maxY;
}
}
else if (this.differY >= this.lineHeight / 2) {
this.currentY += Math.floor(this.differY / this.lineHeight);
if (this.currentY >= 0) {
this.currentY = 0;
}
}
if (this.selectedTarget.length > 0) {
/** @type {?} */
let hasKey = false;
this.selectedTarget.forEach((/**
* @param {?} item
* @return {?}
*/
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());
}
}
/**
* @return {?}
*/
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 });
}
}
}
/**
* @param {?} dataTemp
* @return {?}
*/
getInitValueIndex(dataTemp) {
/** @type {?} */
const self = this;
self.selectedTarget = [];
self.options.value.forEach((/**
* @param {?} element
* @param {?} i
* @return {?}
*/
(element, i) => {
dataTemp.forEach((/**
* @param {?} item
* @param {?} j
* @return {?}
*/
(item, j) => {
item.forEach((/**
* @param {?} item1
* @param {?} k
* @return {?}
*/
(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 });
}
}));
}));
}));
}
/**
* @return {?}
*/
reloadPicker() {
if (!this._picker || this._picker === undefined) {
return;
}
this.currentPicker = this._picker.element.nativeElement;
if (this.currentPicker && this.currentPicker.children.length > 0) {
/** @type {?} */
const self = this;
setTimeout((/**
* @return {?}
*/
() => {
self.selectedTarget.forEach((/**
* @param {?} item
* @param {?} i
* @return {?}
*/
(item, i) => {
self.currentPicker.children[i].children[2].style.transition = 'transform .3s';
/** @type {?} */
const index = parseInt(item.currentY, 0);
self.currentPicker.children[i].children[2].style.transform = `translateY(${index * self.lineHeight}px)`;
}));
}), 0);
}
}
/**
* @param {?} targetArr
* @return {?}
*/
generateArrayData(targetArr) {
/** @type {?} */
const tempArr = [];
if (targetArr instanceof Array) {
targetArr.forEach((/**
* @param {?} item
* @param {?} i
* @return {?}
*/
(item, i) => {
if (item instanceof Array) {
/** @type {?} */
const keys = Object.keys(item);
/** @type {?} */
const element = {};
keys.forEach((/**
* @param {?} key
* @return {?}
*/
key => {
element[key] = targetArr[i][key] || targetArr[i];
}));
tempArr.push(element);
}
else {
tempArr.push(item);
}
}));
return tempArr;
}
return [];
}
/**
* @param {?} parent
* @param {?=} init
* @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) {
/** @type {?} */
let hasValue = false;
this.dataForRender.filter((/**
* @param {?} item
* @param {?} index
* @return {?}
*/
(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]);
}
}
}
}
/**
* @return {?}
*/
ok() {
if (this.options.updateNgModel) {
this.options.updateNgModel(this.combineReslut());
}
if (this.options.confirm) {
this.options.confirm(this.combineReslut());
}
this.setTransitionName();
}
/**
* @return {?}
*/
combineReslut() {
/** @type {?} */
const result = [];
/** @type {?} */
const self = this;
self.selectedTarget.forEach((/**
* @param {?} item
* @return {?}
*/
item => {
if (self.dataForRender.length > 0 && self.dataForRender.length >= parseInt(item.targetId, 0) + 1) {
/** @type {?} */
const curItem = self.dataForRender[parseInt(item.targetId, 0)][-item.currentY];
if (curItem !== undefined) {
result.push(curItem);
}
}
}));
return result;
}
/**
* @return {?}
*/
cancel() {
this.setTransitionName();
this.options.onDismiss.emit();
if (this.options.cancel) {
this.options.cancel();
}
}
/**
* @return {?}
*/
setTransitionName() {
this.transitionName = 'am-slide-up-leave am-slide-up-leave-active';
this.maskTransitionName = 'am-fade-leave am-fade-leave-active';
setTimeout((/**
* @return {?}
*/
() => {
this.options.hidePicker();
}), 200);
}
/**
* @param {?} target
* @param {?} index
* @return {?}
*/
setCurrentSelected(target, index) {
if (!this.options.cascade) {
return;
}
/** @type {?} */
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((/**
* @return {?}
*/
() => {
this.dataForRender.forEach((/**
* @param {?} item
* @param {?} i
* @return {?}
*/
(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);
}
/**
* @return {?}
*/
getInstance() {
return this;
}
/**
* @return {?}
*/
getElement() {
return this.elementRef && this.elementRef.nativeElement;
}
/**
* @return {?}
*/
close() {
if (this.options.hidePicker) {
this.options.hidePicker();
}
}
/**
* @return {?}
*/
destroy() {
this.close();
}
/**
* @return {?}
*/
ngOnInit() {
this.init();
this._localeProviderService.localeChange.pipe(takeUntil(this._unsubscribe$)).subscribe((/**
* @param {?} _
* @return {?}
*/
_ => {
/** @type {?} */
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;
}));
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.reloadPicker();
}
/**
* @return {?}
*/
ngOnDestroy() {
this._unsubscribe$.next();
this._unsubscribe$.complete();
}
}
PickerComponent.decorators = [
{ type: Component, args: [{
selector: 'Picker',
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",
encapsulation: ViewEncapsulation.None
}] }
];
/** @nocollapse */
PickerComponent.ctorParameters = () => [
{ type: ElementRef },
{ type: PickerOptions },
{ type: LocaleProviderService }
];
PickerComponent.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'],] }]
};
if (false) {
/** @type {?} */
PickerComponent.prototype.transitionName;
/** @type {?} */
PickerComponent.prototype.maskTransitionName;
/** @type {?} */
PickerComponent.prototype.startY;
/** @type {?} */
PickerComponent.prototype.differY;
/** @type {?} */
PickerComponent.prototype.currentY;
/** @type {?} */
PickerComponent.prototype.len;
/** @type {?} */
PickerComponent.prototype.dom;
/** @type {?} */
PickerComponent.prototype.index;
/** @type {?} */
PickerComponent.prototype.maxY;
/** @type {?} */
PickerComponent.prototype.lineHeight;
/** @type {?} */
PickerComponent.prototype.dataForRender;
/** @type {?} */
PickerComponent.prototype.selectedTarget;
/** @type {?} */
PickerComponent.prototype.isMouseDown;
/** @type {?} */
PickerComponent.prototype.Velocity;
/** @type {?} */
PickerComponent.prototype.currentPicker;
/**
* @type {?}
* @private
*/
PickerComponent.prototype._unsubscribe$;
/**
* @type {?}
* @private
*/
PickerComponent.prototype._picker;
/** @type {?} */
PickerComponent.prototype.onChange;
/** @type {?} */
PickerComponent.prototype.elementRef;
/** @type {?} */
PickerComponent.prototype.options;
/**
* @type {?}
* @private
*/
PickerComponent.prototype._localeProviderService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlLyIsInNvdXJjZXMiOlsicGlja2VyL3BpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFHTCxTQUFTLEVBQ1QsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBRVosZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxLQUFLLFFBQVEsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssVUFBVSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7OztBQU8vQyxNQUFNLE9BQU8sZUFBa0MsU0FBUSxTQUFlOzs7Ozs7SUFvSHBFLFlBQ1MsVUFBc0IsRUFDdEIsT0FBc0IsRUFDckIsc0JBQTZDO1FBRXJELEtBQUssRUFBRSxDQUFDO1FBSkQsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixZQUFPLEdBQVAsT0FBTyxDQUFlO1FBQ3JCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBdUI7UUF0SHZELG1CQUFjLEdBQVcsNENBQTRDLENBQUM7UUFDdEUsdUJBQWtCLEdBQVcsb0NBQW9DLENBQUM7UUFDbEUsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUNuQixZQUFPLEdBQVcsQ0FBQyxDQUFDO1FBQ3BCLGFBQVEsR0FBVyxDQUFDLENBQUM7UUFDckIsUUFBRyxHQUFXLENBQUMsQ0FBQztRQUNoQixRQUFH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QyxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUMsY0FDckMsWUFBWSxTQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7OztJQTlEcEMseUNBQXNFOztJQUN0RSw2Q0FBa0U7O0lBQ2xFLGlDQUFtQjs7SUFDbkIsa0NBQW9COztJQUNwQixtQ0FBcUI7O0lBQ3JCLDhCQUFnQjs7SUFDaEIsOEJBQWdCOztJQUNoQixnQ0FBa0I7O0lBQ2xCLCtCQUFpQjs7SUFDakIscUNBQXdCOztJQUN4Qix3Q0FBMEI7O0lBQzFCLHlDQUEyQjs7SUFDM0Isc0NBQTZCOztJQUM3QixtQ0FBa0M7O0lBQ2xDLHdDQUFtQjs7Ozs7SUFFbkIsd0NBQTJEOzs7OztJQUUzRCxrQ0FDa0M7O0lBd0dsQyxtQ0FBNEI7O0lBUDFCLHFDQUE2Qjs7SUFDN0Isa0NBQTZCOzs7OztJQUM3QixpREFBcUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgQ29tcG9uZW50LFxuICBWaWV3Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQaWNrZXJPcHRpb25zIH0gZnJvbSAnLi9waWNrZXItb3B0aW9ucy5wcm92aWRlcic7XG5pbXBvcnQgKiBhcyB2ZWxvY2l0eSBmcm9tICcuLi9jb3JlL3V0aWwvdmVsb2NpdHknO1xuaW1wb3J0ICogYXMgdG91Y2hFdmVudCBmcm9tICcuLi9jb3JlL3V0aWwvdG91Y2gtZXZlbnQnO1xuaW1wb3J0IHsgTG9jYWxlUHJvdmlkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vbG9jYWxlLXByb3ZpZGVyL2xvY2FsZS1wcm92aWRlci5zZXJ2aWNlJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFBpY2tlclJlZiB9IGZyb20gJy4vcGlja2VyLXJlZi5jbGFzcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1BpY2tlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIFBpY2tlckNvbXBvbmVudDxUID0gYW55LCBSID0gYW55PiBleHRlbmRzIFBpY2tlclJlZjxULCBSPiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgdHJhbnNpdGlvbk5hbWU6IHN0cmluZyA9ICdhbS1zbGlkZS11cC1lbnRlciBhbS1zbGlkZS11cC1lbnRlci1hY3RpdmUnO1xuICBtYXNrVHJhbnNpdGlvbk5hbWU6IHN0cmluZyA9ICdhbS1mYWRlLWVudGVyIGFtLWZhZGUtZW50ZXItYWN0aXZlJztcbiAgc3RhcnRZOiBudW1iZXIgPSAwO1xuICBkaWZmZXJZOiBudW1iZXIgPSAwO1xuICBjdXJyZW50WTogbnVtYmVyID0gMDtcbiAgbGVuOiBudW1iZXIgPSAwO1xuICBkb206IGFueSA9IG51bGw7XG4gIGluZGV4OiBudW1iZXIgPSAwO1xuICBtYXhZOiBudW1iZXIgPSAwO1xuICBsaW5lSGVpZ2h0OiBudW1iZXIgPSAzNDtcbiAgZGF0YUZvclJlbmRlcjogYW55W10gPSBbXTtcbiAgc2VsZWN0ZWRUYXJnZXQ6IGFueVtdID0gW107XG4gIGlzTW91c2VEb3duOiBib29sZWFuID0gZmFsc2U7XG4gIFZlbG9jaXR5ID0gdmVsb2NpdHkuZ2V0VmVsb2NpdHkoKTtcbiAgY3VycmVudFBpY2tlcjogYW55O1xuXG4gIHByaXZhdGUgX3Vuc3Vic2NyaWJlJDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgQFZpZXdDaGlsZCgncGlja2VyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgcHJpdmF0ZSBfcGlja2VyOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBbJyRldmVudCddKVxuICBwYW5zdGFydChldmVudCkge1xuICAgIGlmICghZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnYW0tcGlja2VyLWNvbC1tYXNrJykgfHwgdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXNNb3VzZURvd24gPSB0cnVlO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5kb20gPSB0b3VjaEV2ZW50LmdldEV2ZW50VGFyZ2V0KGV2ZW50KS50YXJnZXQucGFyZW50RWxlbWVudC5jaGlsZHJlblsyXTtcbiAgICB0aGlzLmxlbiA9IHRoaXMuZG9tLmNoaWxkcmVuLmxlbmd0aDtcbiAgICB0aGlzLm1heFkgPSAtKHRoaXMubGVuIC0gMSk7XG5cbiAgICBpZiAodGhpcy5kb20uc3R5bGUudHJhbnNmb3JtID09PSAndHJhbnNsYXRlWSgwcHgpJykge1xuICAgICAgdGhpcy5jdXJyZW50WSA9IDA7XG4gICAgICB0aGlzLm1heFkgPSAtKHRoaXMubGVuIC0gMSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkVGFyZ2V0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYXJnZXQuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaWYgKGl0ZW0udGFyZ2V0SWQgPT09IGV2ZW50LnRhcmdldC5pZCkge1xuICAgICAgICAgIHRoaXMuY3VycmVudFkgPSBpdGVtLmN1cnJlbnRZO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zdGFydFkgPSB0b3VjaEV2ZW50LmdldEV2ZW50VGFyZ2V0KGV2ZW50KS5jbGllbnRZO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignbW91c2Vtb3ZlJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcigndG91Y2htb3ZlJywgWyckZXZlbnQnXSlcbiAgcGFubW92ZShldmVudCkge1xuICAgIGlmICghZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnYW0tcGlja2VyLWNvbC1tYXNrJykgfHwgIXRoaXMuaXNNb3VzZURvd24gfHwgdGhpcy5vcHRpb25zLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgZXYgPSB0b3VjaEV2ZW50LmdldEV2ZW50VGFyZ2V0KGV2ZW50KTtcbiAgICB0aGlzLmRpZmZlclkgPSBldi5jbGllbnRZIC0gdGhpcy5zdGFydFk7XG4gICAgdGhpcy5WZWxvY2l0eS5yZWNvcmQodGhpcy5kaWZmZXJZKTtcbiAgICB0aGlzLmRvbS5zdHlsZS50cmFuc2l0aW9uID0gJ3RyYW5zZm9ybSAwcyc7XG4gICAgdGhpcy5kb20uc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoJHt0aGlzLmN1cnJlbnRZICogdGhpcy5saW5lSGVpZ2h0ICsgdGhpcy5kaWZmZXJZfXB4KWA7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdtb3VzZXVwJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignbW91c2VsZWF2ZScsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ3RvdWNoZW5kJywgWyckZXZlbnQnXSlcbiAgcGFuZW5kKGV2ZW50KSB7XG4gICAgaWYgKCFldmVudC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdhbS1waWNrZXItY29sLW1hc2snKSB8fCAhdGhpcy5pc01vdXNlRG93biB8fCB0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc01vdXNlRG93biA9IGZhbHNlO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgZXYgPSB0b3VjaEV2ZW50LmdldEV2ZW50VGFyZ2V0KGV2ZW50KTtcbiAgICB0aGlzLmRpZmZlclkgPSBldi5jbGllbnRZIC0gdGhpcy5zdGFydFk7XG4gICAgbGV0IHRpbWUgPSAwLjM7XG4gICAgY29uc3QgdmVsb2NpdHlUZW1wID0gdGhpcy5WZWxvY2l0eS5nZXRWZWxvY2l0eSh0aGlzLmRpZmZlclkpICogNDtcbiAgICBpZiAodmVsb2NpdHkpIHtcbiAgICAgIHRoaXMuZGlmZmVyWSA9IHZlbG9jaXR5VGVtcCAqIDQwICsgdGhpcy5kaWZmZXJZO1xuICAgICAgdGltZSA9IE1hdGguYWJzKHZlbG9jaXR5VGVtcCkgKiAwLjE7XG4gICAgfVxuICAgIHRoaXMuZG9tLnN0eWxlLnRyYW5zaXRpb24gPSAndHJhbnNmb3JtICcgKyAodGltZSA8IDAuMyA/IDAuMyA6IHRpbWUpICsgJ3MnO1xuICAgIGlmICh0aGlzLmRpZmZlclkgPD0gLXRoaXMubGluZUhlaWdodCAvIDIpIHtcbiAgICAgIHRoaXMuY3VycmVudFkgKz0gTWF0aC5mbG9vcih0aGlzLmRpZmZlclkgLyB0aGlzLmxpbmVIZWlnaHQpO1xuICAgICAgaWYgKHRoaXMuY3VycmVudFkgPD0gdGhpcy5tYXhZKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFkgPSB0aGlzLm1heFk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmRpZmZlclkgPj0gdGhpcy5saW5lSGVpZ2h0IC8gMikge1xuICAgICAgdGhpcy5jdXJyZW50WSArPSBNYXRoLmZsb29yKHRoaXMuZGlmZmVyWSAvIHRoaXMubGluZUhlaWdodCk7XG4gICAgICBpZiAodGhpcy5jdXJyZW50WSA+PSAwKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFkgPSAwO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3RlZFRhcmdldC5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgaGFzS2V5ID0gZmFsc2U7XG4gICAgICB0aGlzLnNlbGVjdGVkVGFyZ2V0LmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGlmIChpdGVtLnRhcmdldElkID09PSBldmVudC50YXJnZXQuaWQpIHtcbiAgICAgICAgICBoYXNLZXkgPSB0cnVlO1xuICAgICAgICAgIGl0ZW0udGFyZ2V0SWQgPSBldmVudC50YXJnZXQuaWQ7XG4gICAgICAgICAgaXRlbS5jdXJyZW50WSA9IHRoaXMuY3VycmVudFk7XG4gICAgICAgIH0gZWxzZSBpZiAocGFyc2VJbnQoaXRlbS50YXJnZXRJZCwgMCkgPiBwYXJzZUludChldmVudC50YXJnZXQuaWQsIDApICYmIHRoaXMub3B0aW9ucy5jYXNjYWRlKSB7XG4gICAgICAgICAgaXRlbS5jdXJyZW50WSA9IDA7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKCFoYXNLZXkpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhcmdldC5wdXNoKHsgdGFyZ2V0SWQ6IGV2ZW50LnRhcmdldC5pZCwgY3VycmVudFk6IHRoaXMuY3VycmVudFkgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYXJnZXQucHVzaCh7IHRhcmdldElkOiBldmVudC50YXJnZXQuaWQsIGN1cnJlbnRZOiB0aGlzLmN1cnJlbnRZIH0pO1xuICAgIH1cbiAgICB0aGlzLmRvbS5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke3RoaXMuY3VycmVudFkgKiB0aGlzLmxpbmVIZWlnaHR9cHgpYDtcbiAgICB0aGlzLmluZGV4ID0gTWF0aC5mbG9vcihNYXRoLmFicyh0aGlzLmN1cnJlbnRZIC8gMSkpO1xuICAgIHRoaXMuc2V0Q3VycmVudFNlbGVjdGVkKHBhcnNlSW50KGV2ZW50LnRhcmdldC5pZCwgMCksIHRoaXMuaW5kZXgpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMudmFsdWUgIT09IHRoaXMuY29tYmluZVJlc2x1dCgpKSB7XG4gICAgICB0aGlzLm9wdGlvbnMub25QaWNrZXJDaGFuZ2UuZW1pdCh0aGlzLmNvbWJpbmVSZXNsdXQoKSk7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuY29tYmluZVJlc2x1dCgpKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwdWJsaWMgb3B0aW9uczogUGlja2VyT3B0aW9ucyxcbiAgICBwcml2YXRlIF9sb2NhbGVQcm92aWRlclNlcnZpY2U6IExvY2FsZVByb3ZpZGVyU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb25DaGFuZ2UgPSAoXzogYW55W10pID0+IHt9O1xuXG4gIGluaXQoKSB7XG4gICAgaWYgKHRoaXMuZGF0YUZvclJlbmRlci5sZW5ndGggPT09IDAgJiYgdGhpcy5nZW5lcmF0ZUFycmF5RGF0YSh0aGlzLm9wdGlvbnMuZGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5kYXRhRm9yUmVuZGVyLnB1c2godGhpcy5nZW5lcmF0ZUFycmF5RGF0YSh0aGlzLm9wdGlvbnMuZGF0YSkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLnZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZ2V0SW5pdFZhbHVlSW5kZXgodGhpcy5kYXRhRm9yUmVuZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jaGVja0FycmF5RGVlcCh0aGlzLm9wdGlvbnMuZGF0YVswXSk7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5kYXRhRm9yUmVuZGVyLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGFyZ2V0LnB1c2goeyB0YXJnZXRJZDogYCR7aW5kZXh9YCwgY3VycmVudFk6IDAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0SW5pdFZhbHVlSW5kZXgoZGF0YVRlbXApIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBzZWxmLnNlbGVjdGVkVGFyZ2V0ID0gW107XG4gICAgc2VsZi5vcHRpb25zLnZhbHVlLmZvckVhY2goKGVsZW1lbnQsIGkpID0+IHtcbiAgICAgIGRhdGFUZW1wLmZvckVhY2goKGl0ZW0sIGopID0+IHtcbiAgICAgICAgaXRlbS5mb3JFYWNoKChpdGVtMSwgaykgPT4ge1xuICAgICAgICAgIGlmICgoZWxlbWVudCA9PT0gaXRlbTEubGFiZWwgfHwgZWxlbWVudCA9PT0gaXRlbTEudmFsdWUgfHwgZWxlbWVudCA9PT0gaXRlbTEpICYmIGkgPT09IGopIHtcbiAgICAgICAgICAgIHNlbGYuY2hlY2tBcnJheURlZXAoc2VsZi5kYXRhRm9yUmVuZGVyW2ldW2tdLCBmYWxzZSk7XG4gICAgICAgICAgICBzZWxmLnNlbGVjdGVkVGFyZ2V0LnB1c2goeyB0YXJnZXRJZDogYCR7aX1gLCBjdXJyZW50WTogLWsgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmVsb2FkUGlja2VyKCkge1xuICAgIGlmICghdGhpcy5fcGlja2VyIHx8IHRoaXMuX3BpY2tlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY3VycmVudFBpY2tlciA9IHRoaXMuX3BpY2tlci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHRoaXMuY3VycmVudFBpY2tlciAmJiB0aGlzLmN1cnJlbnRQaWNrZXIuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgc2VsZi5zZWxlY3RlZFRhcmdldC5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgc2VsZi5jdXJyZW50UGlja2VyLmNoaWxkcmVuW2ldLmNoaWxkcmVuWzJdLnN0eWxlLnRyYW5zaXRpb24gPSAndHJhbnNmb3JtIC4zcyc7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJzZUludChpdGVtLmN1cnJlbnRZLCAwKTtcbiAgICAgICAgICBzZWxmLmN1cnJlbnRQaWNrZXIuY2hpbGRyZW5baV0uY2hpbGRyZW5bMl0uc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoJHtpbmRleCAqIHNlbGYubGluZUhlaWdodH1weClgO1xuICAgICAgICB9KTtcbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuXG4gIGdlbmVyYXRlQXJyYXlEYXRhKHRhcmdldEFycikge1xuICAgIGNvbnN0IHRlbXBBcnIgPSBbXTtcbiAgICBpZiAodGFyZ2V0QXJyIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHRhcmdldEFyci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaXRlbSk7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IHt9O1xuICAgICAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudFtrZXldID0gdGFyZ2V0QXJyW2ldW2tleV0gfHwgdGFyZ2V0QXJyW2ldO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRlbXBBcnIucHVzaChlbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZW1wQXJyLnB1c2goaXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRlbXBBcnI7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNoZWNrQXJyYXlEZWVwKHBhcmVudCwgaW5pdDogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgT2JqZWN0ICYmIHBhcmVudC5jaGlsZHJlbiAmJiBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHRoaXMuZ2VuZXJhdGVBcnJheURhdGEocGFyZW50LmNoaWxkcmVuKS5sZW5ndGggPiAwICYmIHRoaXMuZGF0YUZvclJlbmRlci5sZW5ndGggPCB0aGlzLm9wdGlvbnMuY29scykge1xuICAgICAgICBsZXQgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kYXRhRm9yUmVuZGVyLmZpbHRlcigoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoaXRlbSkgPT09IEpTT04uc3RyaW5naWZ5KHBhcmVudC5jaGlsZHJlbikpIHtcbiAgICAgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWhhc1ZhbHVlKSB7XG4gICAgICAgICAgdGhpcy5kYXRhRm9yUmVuZGVyLnB1c2godGhpcy5nZW5lcmF0ZUFycmF5RGF0YShwYXJlbnQuY2hpbGRyZW4pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5pdCkge1xuICAgICAgICAgIHRoaXMuY2hlY2tBcnJheURlZXAocGFyZW50LmNoaWxkcmVuWzBdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9rKCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMudXBkYXRlTmdNb2RlbCkge1xuICAgICAgdGhpcy5vcHRpb25zLnVwZGF0ZU5nTW9kZWwodGhpcy5jb21iaW5lUmVzbHV0KCkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLmNvbmZpcm0pIHtcbiAgICAgIHRoaXMub3B0aW9ucy5jb25maXJtKHRoaXMuY29tYmluZVJlc2x1dCgpKTtcbiAgICB9XG4gICAgdGhpcy5zZXRUcmFuc2l0aW9uTmFtZSgpO1xuICB9XG5cbiAgY29tYmluZVJlc2x1dCgpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBzZWxmLnNlbGVjdGVkVGFyZ2V0LmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBpZiAoc2VsZi5kYXRhRm9yUmVuZGVyLmxlbmd0aCA+IDAgJiYgc2VsZi5kYXRhRm9yUmVuZGVyLmxlbmd0aCA+PSBwYXJzZUludChpdGVtLnRhcmdldElkLCAwKSArIDEpIHtcbiAgICAgICAgY29uc3QgY3VySXRlbSA9IHNlbGYuZGF0YUZvclJlbmRlcltwYXJzZUludChpdGVtLnRhcmdldElkLCAwKV1bLWl0ZW0uY3VycmVudFldO1xuICAgICAgICBpZiAoY3VySXRlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goY3VySXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMuc2V0VHJhbnNpdGlvbk5hbWUoKTtcbiAgICB0aGlzLm9wdGlvbnMub25EaXNtaXNzLmVtaXQoKTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmNhbmNlbCkge1xuICAgICAgdGhpcy5vcHRpb25zLmNhbmNlbCgpO1xuICAgIH1cbiAgfVxuXG4gIHNldFRyYW5zaXRpb25OYW1lKCkge1xuICAgIHRoaXMudHJhbnNpdGlvbk5hbWUgPSAnYW0tc2xpZGUtdXAtbGVhdmUgYW0tc2xpZGUtdXAtbGVhdmUtYWN0aXZlJztcbiAgICB0aGlzLm1hc2tUcmFuc2l0aW9uTmFtZSA9ICdhbS1mYWRlLWxlYXZlIGFtLWZhZGUtbGVhdmUtYWN0aXZlJztcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMub3B0aW9ucy5oaWRlUGlja2VyKCk7XG4gICAgfSwgMjAwKTtcbiAgfVxuXG4gIHNldEN1cnJlbnRTZWxlY3RlZCh0YXJnZXQsIGluZGV4KSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuY2FzY2FkZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhID0gdGhpcy5kYXRhRm9yUmVuZGVyLnNsaWNlKDAsIHRhcmdldCArIDEpO1xuICAgIHRoaXMuZGF0YUZvclJlbmRlciA9IGE7XG4gICAgdGhpcy5jaGVja0FycmF5RGVlcCh0aGlzLmRhdGFGb3JSZW5kZXJbdGFyZ2V0XVtpbmRleF0pO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkVGFyZ2V0Lmxlbmd0aCA+IDAgJiYgdGhpcy5zZWxlY3RlZFRhcmdldC5sZW5ndGggPCB0aGlzLmRhdGFGb3JSZW5kZXIubGVuZ3RoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGF0YUZvclJlbmRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaSA+IHRhcmdldCkge1xuICAgICAgICAgIGlmIChpIDwgdGhpcy5zZWxlY3RlZFRhcmdldC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYXJnZXRbaV0gPSB7IHRhcmdldElkOiBgJHtpfWAsIGN1cnJlbnRZOiAwIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYXJnZXQucHVzaCh7IHRhcmdldElkOiBgJHtpfWAsIGN1cnJlbnRZOiAwIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YUZvclJlbmRlci5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICAgIGlmICh0YXJnZXQgIT09IGAke2l9YCAmJiBpID4gdGFyZ2V0KSB7XG4gICAgICAgICAgdGhpcy5fcGlja2VyLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jaGlsZHJlbltpXS5jaGlsZHJlblsyXS5zdHlsZS50cmFuc2l0aW9uID0gJ3RyYW5zZm9ybSAuM3MnO1xuICAgICAgICAgIHRoaXMuX3BpY2tlci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW5baV0uY2hpbGRyZW5bMl0uc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVkoMHB4KSc7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sIDApO1xuICB9XG5cbiAgZ2V0SW5zdGFuY2UoKTogUGlja2VyQ29tcG9uZW50IHtcbiAgICByZXR1cm4