ngx-bit
Version:
A flexible NG-ZORRO helper library
235 lines • 26.8 kB
JavaScript
import { Injectable, Optional } from '@angular/core';
import { PRIMARY_OUTLET, Router } from '@angular/router';
import { NzI18nService } from 'ng-zorro-antd/i18n';
import { Location } from '@angular/common';
import { Subject } from 'rxjs';
import { BitConfig } from './bit-config';
import { ListByPage } from './utils/list-by-page';
import { BitCurdService } from './bit-curd.service';
import { StorageMap } from '@ngx-pwa/local-storage';
import { filter, switchMap } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "./bit-config";
import * as i2 from "./bit-curd.service";
import * as i3 from "@ngx-pwa/local-storage/public-api";
import * as i4 from "@angular/router";
import * as i5 from "@angular/common";
import * as i6 from "ng-zorro-antd/i18n";
export class BitService {
constructor(bitConfig, curd, storage, router, location, nzI18nService) {
this.curd = curd;
this.storage = storage;
this.router = router;
this.location = location;
this.nzI18nService = nzI18nService;
/**
* 公共语言包
* Common language pack
*/
this.language = new Map();
/**
* 语言包 ID 状态
* Language ID changed
*/
this.localeChanged = new Subject();
/**
* 语言包引用
* Language pack reference
*/
this.l = {};
/**
* 国际化 ID 状态
* I18n ID changed
*/
this.i18nChanged = new Subject();
/**
* 国际化包含语言 ID
* I18n includes languages ID
*/
this.i18nContain = [];
/**
* 国际化输入提示状态
* I18n tooltip status
*/
this.i18nTooltip = {};
this.static = bitConfig.url.static;
this.uploads = bitConfig.url.api + bitConfig.api.upload;
this.localeDefault = bitConfig.locale.default;
this.localeMapping = bitConfig.locale.mapping;
this.localeBind = bitConfig.locale.bind;
this.i18nDefault = bitConfig.i18n.default;
this.i18n = bitConfig.i18n.default;
this.i18nContain = bitConfig.i18n.contain;
this.i18nSwitch = bitConfig.i18n.switch;
this.pageDefault = bitConfig.page;
}
/**
* 路由导航
* Route navigation
*/
open(path, extras) {
if (path.length === 0) {
return;
}
const url = this.router.url;
if (url !== '/') {
const primary = this.router.parseUrl(url).root.children[PRIMARY_OUTLET];
const segments = primary.segments;
if (segments.length > 1) {
const key = segments[0].path;
this.storage.set('history:' + key, segments.splice(1)).subscribe(_ => _);
}
}
const commands = [];
path.forEach(value => {
if (typeof value === 'string') {
commands.push(...value.split('/'));
}
else {
commands.push(value);
}
});
this.router.navigate(commands, extras);
}
/**
* 导航历史
* Navigation history
*/
history(key) {
this.storage.get('history:' + key).subscribe((segments) => {
const commands = [key];
if (segments && segments.length !== 0) {
commands.push(...segments.map(v => v.path));
this.storage.delete('history:' + key).subscribe(_ => _);
}
this.router.navigate(commands);
});
}
/**
* 导航返回
* Navigate back
*/
back() {
this.location.back();
this.resetI18n();
}
/**
* 初始化语言包
* Setup language pack
*/
setupLocale() {
this.l = {};
this.setLocale(localStorage.getItem('locale') || this.localeDefault);
}
/**
* 载入语言包
* Registered language pack
*/
registerLocales(packer) {
Promise.resolve(packer).then(result => {
if (!result.default) {
return;
}
this.language = new Map([...this.language, ...Object.entries(result.default)]);
const index = this.localeDefault.indexOf(this.locale);
for (const [key, data] of this.language.entries()) {
this.l[key] = data[index];
}
});
}
/**
* 设置语言包 ID
* Set language ID
*/
setLocale(locale) {
this.locale = locale;
localStorage.setItem('locale', locale);
const index = this.localeMapping.indexOf(this.locale);
for (const [key, data] of this.language.entries()) {
this.l[key] = data[index];
}
this.nzI18nService.setLocale(this.localeBind[index]);
this.localeChanged.next(locale);
}
/**
* 国际化 ID 是否相等
* Are the I18n IDs equal
*/
equalI18n(i18n) {
return this.i18n === i18n;
}
/**
* 重置国际化 ID
* Reset I18n ID
*/
resetI18n() {
this.i18n = this.i18nDefault;
}
/**
* 生成 I18n FormGroup
* Generate I18n FormGroup
*/
i18nGroup(options) {
const controls = {};
if (options) {
for (const ID of this.i18nContain) {
controls[ID] = [null, [], []];
if (options.value !== undefined && options.value.hasOwnProperty(ID)) {
controls[ID][0] = options.value[ID];
}
if (options.validate !== undefined && options.validate.hasOwnProperty(ID)) {
controls[ID][1] = options.validate[ID];
}
if (options.asyncValidate !== undefined && options.asyncValidate.hasOwnProperty(ID)) {
controls[ID][2] = options.asyncValidate[ID];
}
}
}
return controls;
}
/**
* 解析国际化数据
* Parse i18n string json
*/
i18nParse(text) {
const json = JSON.parse(text);
const data = {};
for (const ID of this.i18nContain) {
if (json.hasOwnProperty(ID)) {
data[ID] = json[ID];
}
}
return data;
}
/**
* 生产分页数据对象
* Factory list by page
*/
listByPage(option) {
option.limit = option.limit || this.pageDefault;
return new ListByPage(this.curd, this.storage, option);
}
/**
* 清除应用本地存储
* Clear app local storage
*/
clear() {
this.storage.keys().pipe(filter(v => ['resource', 'router'].includes(v) ||
v.search(/^search:\S+$/) !== -1 ||
v.search(/^page:\S+$/) !== -1 ||
v.search(/^cross:\S+$/) !== -1), switchMap(key => this.storage.delete(key))).subscribe(_ => _);
}
}
BitService.ɵprov = i0.ɵɵdefineInjectable({ factory: function BitService_Factory() { return new BitService(i0.ɵɵinject(i1.BitConfig), i0.ɵɵinject(i2.BitCurdService, 8), i0.ɵɵinject(i3.StorageMap, 8), i0.ɵɵinject(i4.Router, 8), i0.ɵɵinject(i5.Location, 8), i0.ɵɵinject(i6.NzI18nService, 8)); }, token: BitService, providedIn: "root" });
BitService.decorators = [
{ type: Injectable, args: [{ providedIn: 'root' },] }
];
BitService.ctorParameters = () => [
{ type: BitConfig },
{ type: BitCurdService, decorators: [{ type: Optional }] },
{ type: StorageMap, decorators: [{ type: Optional }] },
{ type: Router, decorators: [{ type: Optional }] },
{ type: Location, decorators: [{ type: Optional }] },
{ type: NzI18nService, decorators: [{ type: Optional }] }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtYml0L2NvbW1vbi9iaXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQW9CLGNBQWMsRUFBRSxNQUFNLEVBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUV6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7OztBQUduRCxNQUFNLE9BQU8sVUFBVTtJQWtGckIsWUFDRSxTQUFvQixFQUNBLElBQW9CLEVBQ3BCLE9BQW1CLEVBQ25CLE1BQWMsRUFDZCxRQUFrQixFQUNsQixhQUE0QjtRQUo1QixTQUFJLEdBQUosSUFBSSxDQUFnQjtRQUNwQixZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBN0VsRDs7O1dBR0c7UUFDSyxhQUFRLEdBQXFCLElBQUksR0FBRyxFQUFFLENBQUM7UUFxQi9DOzs7V0FHRztRQUNNLGtC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QUFVLEVBQUUsTUFBTSxFQUFFOzs7WUFQekIsU0FBUztZQUdULGNBQWMsdUJBeUZsQixRQUFRO1lBeEZKLFVBQVUsdUJBeUZkLFFBQVE7WUFqRzhCLE1BQU0sdUJBa0c1QyxRQUFRO1lBaEdKLFFBQVEsdUJBaUdaLFFBQVE7WUFsR0osYUFBYSx1QkFtR2pCLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkV4dHJhcywgUFJJTUFSWV9PVVRMRVQsIFJvdXRlciwgVXJsU2VnbWVudCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBOekkxOG5TZXJ2aWNlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9pMThuJztcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEJpdENvbmZpZyB9IGZyb20gJy4vYml0LWNvbmZpZyc7XG5pbXBvcnQgeyBMaXN0QnlQYWdlT3B0aW9uLCBJMThuR3JvdXBPcHRpb24sIEkxOG5Ub29sdGlwT3B0aW9uLCBJMThuT3B0aW9uIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBMaXN0QnlQYWdlIH0gZnJvbSAnLi91dGlscy9saXN0LWJ5LXBhZ2UnO1xuaW1wb3J0IHsgQml0Q3VyZFNlcnZpY2UgfSBmcm9tICcuL2JpdC1jdXJkLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RvcmFnZU1hcCB9IGZyb20gJ0BuZ3gtcHdhL2xvY2FsLXN0b3JhZ2UnO1xuaW1wb3J0IHsgZmlsdGVyLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQml0U2VydmljZSB7XG4gIC8qKlxuICAgKiDpnZnmgIHotYTmupDlnLDlnYBcbiAgICogU3RhdGljIHJlc291cmNlIGFkZHJlc3NcbiAgICovXG4gIHJlYWRvbmx5IHN0YXRpYzogc3RyaW5nO1xuICAvKipcbiAgICog5LiK5Lyg5Zyw5Z2AXG4gICAqIFVwbG9hZCBhZGRyZXNzXG4gICAqL1xuICByZWFkb25seSB1cGxvYWRzOiBzdHJpbmc7XG4gIC8qKlxuICAgKiDlhazlhbHor63oqIDljIVcbiAgICogQ29tbW9uIGxhbmd1YWdlIHBhY2tcbiAgICovXG4gIHByaXZhdGUgbGFuZ3VhZ2U6IE1hcDxzdHJpbmcsIGFueT4gPSBuZXcgTWFwKCk7XG4gIC8qKlxuICAgKiDpu5jorqTor63oqIDljIUgSURcbiAgICogRGVmYXVsdCBsYW5ndWFnZSBJRFxuICAgKi9cbiAgcmVhZG9ubHkgbG9jYWxlRGVmYXVsdDogc3RyaW5nO1xuICAvKipcbiAgICog6K+t6KiA5YyFIElEIOe0ouW8lVxuICAgKiBMYW5ndWFnZSBJRCBpbmRleFxuICAgKi9cbiAgcmVhZG9ubHkgbG9jYWxlTWFwcGluZzogc3RyaW5nW107XG4gIC8qKlxuICAgKiDor63oqIDljIUgSUQg5LiOIE5HLVpPUlJPIOivreiogOWMheWFs+iBlFxuICAgKiBMYW5ndWFnZSBJRCBhc3NvY2lhdGVkIHdpdGggTkctWk9SUk8gbGFuZ3VhZ2VcbiAgICovXG4gIHJlYWRvbmx5IGxvY2FsZUJpbmQ6IGFueVtdO1xuICAvKipcbiAgICog6K+t6KiA5YyFIElEXG4gICAqIExhbmd1YWdlIElEXG4gICAqL1xuICBsb2NhbGU6IHN0cmluZztcbiAgLyoqXG4gICAqIOivreiogOWMhSBJRCDnirbmgIFcbiAgICogTGFuZ3VhZ2UgSUQgY2hhbmdlZFxuICAgKi9cbiAgcmVhZG9ubHkgbG9jYWxlQ2hhbmdlZDogU3ViamVjdDxzdHJpbmc+ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICAvKipcbiAgICog6K+t6KiA5YyF5byV55SoXG4gICAqIExhbmd1YWdlIHBhY2sgcmVmZXJlbmNlXG4gICAqL1xuICBsOiBhbnkgPSB7fTtcbiAgLyoqXG4gICAqIOm7mOiupOWbvemZheWMliBJRO+8jF4g5Zu96ZmF5YyW5piv6Z2i5ZCR6KGo5Y2V6L6T5YWl55qEXG4gICAqIERlZmF1bHQgSTE4biBJRCwgXiBJMThuIGlzIGZvciBmb3JtIGlucHV0XG4gICAqL1xuICByZWFkb25seSBpMThuRGVmYXVsdDogc3RyaW5nO1xuICAvKipcbiAgICog5Zu96ZmF5YyWIElEXG4gICAqIEkxOG4gSURcbiAgICovXG4gIGkxOG46IHN0cmluZztcbiAgLyoqXG4gICAqIOWbvemZheWMliBJRCDnirbmgIFcbiAgICogSTE4biBJRCBjaGFuZ2VkXG4gICAqL1xuICByZWFkb25seSBpMThuQ2hhbmdlZDogU3ViamVjdDxzdHJpbmc+ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICAvKipcbiAgICog5Zu96ZmF5YyW5YyF5ZCr6K+t6KiAIElEXG4gICAqIEkxOG4gaW5jbHVkZXMgbGFuZ3VhZ2VzIElEXG4gICAqL1xuICBpMThuQ29udGFpbjogYW55W10gPSBbXTtcbiAgLyoqXG4gICAqIOWbvemZheWMluivpuaDhVxuICAgKiBJMThuIERldGFpbFxuICAgKi9cbiAgaTE4blN3aXRjaDogSTE4bk9wdGlvbltdO1xuICAvKipcbiAgICog5Zu96ZmF5YyW6L6T5YWl5o+Q56S654q25oCBXG4gICAqIEkxOG4gdG9vbHRpcCBzdGF0dXNcbiAgICovXG4gIGkxOG5Ub29sdGlwOiBJMThuVG9vbHRpcE9wdGlvbiA9IHt9O1xuICAvKipcbiAgICog6buY6K6k5YiG6aG16ZmQ5Yi2XG4gICAqIERlZmF1bHQgUGFnZSBMaW1pdFxuICAgKi9cbiAgcmVhZG9ubHkgcGFnZURlZmF1bHQ6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBiaXRDb25maWc6IEJpdENvbmZpZyxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGN1cmQ6IEJpdEN1cmRTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgc3RvcmFnZTogU3RvcmFnZU1hcCxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgbnpJMThuU2VydmljZTogTnpJMThuU2VydmljZVxuICApIHtcbiAgICB0aGlzLnN0YXRpYyA9IGJpdENvbmZpZy51cmwuc3RhdGljO1xuICAgIHRoaXMudXBsb2FkcyA9IGJpdENvbmZpZy51cmwuYXBpICsgYml0Q29uZmlnLmFwaS51cGxvYWQ7XG4gICAgdGhpcy5sb2NhbGVEZWZhdWx0ID0gYml0Q29uZmlnLmxvY2FsZS5kZWZhdWx0O1xuICAgIHRoaXMubG9jYWxlTWFwcGluZyA9IGJpdENvbmZpZy5sb2NhbGUubWFwcGluZztcbiAgICB0aGlzLmxvY2FsZUJpbmQgPSBiaXRDb25maWcubG9jYWxlLmJpbmQ7XG4gICAgdGhpcy5pMThuRGVmYXVsdCA9IGJpdENvbmZpZy5pMThuLmRlZmF1bHQ7XG4gICAgdGhpcy5pMThuID0gYml0Q29uZmlnLmkxOG4uZGVmYXVsdDtcbiAgICB0aGlzLmkxOG5Db250YWluID0gYml0Q29uZmlnLmkxOG4uY29udGFpbjtcbiAgICB0aGlzLmkxOG5Td2l0Y2ggPSBiaXRDb25maWcuaTE4bi5zd2l0Y2g7XG4gICAgdGhpcy5wYWdlRGVmYXVsdCA9IGJpdENvbmZpZy5wYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIOi3r+eUseWvvOiIqlxuICAgKiBSb3V0ZSBuYXZpZ2F0aW9uXG4gICAqL1xuICBvcGVuKHBhdGg6IGFueVtdLCBleHRyYXM/OiBOYXZpZ2F0aW9uRXh0cmFzKTogdm9pZCB7XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHRoaXMucm91dGVyLnVybDtcbiAgICBpZiAodXJsICE9PSAnLycpIHtcbiAgICAgIGNvbnN0IHByaW1hcnkgPSB0aGlzLnJvdXRlci5wYXJzZVVybCh1cmwpLnJvb3QuY2hpbGRyZW5bUFJJTUFSWV9PVVRMRVRdO1xuICAgICAgY29uc3Qgc2VnbWVudHMgPSBwcmltYXJ5LnNlZ21lbnRzO1xuICAgICAgaWYgKHNlZ21lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gc2VnbWVudHNbMF0ucGF0aDtcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldCgnaGlzdG9yeTonICsga2V5LCBzZWdtZW50cy5zcGxpY2UoMSkpLnN1YnNjcmliZShfID0+IF8pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjb21tYW5kcyA9IFtdO1xuICAgIHBhdGguZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb21tYW5kcy5wdXNoKC4uLnZhbHVlLnNwbGl0KCcvJykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tbWFuZHMucHVzaCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoY29tbWFuZHMsIGV4dHJhcyk7XG4gIH1cblxuICAvKipcbiAgICog5a+86Iiq5Y6G5Y+yXG4gICAqIE5hdmlnYXRpb24gaGlzdG9yeVxuICAgKi9cbiAgaGlzdG9yeShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmFnZS5nZXQoJ2hpc3Rvcnk6JyArIGtleSkuc3Vic2NyaWJlKChzZWdtZW50czogVXJsU2VnbWVudFtdKSA9PiB7XG4gICAgICBjb25zdCBjb21tYW5kcyA9IFtrZXldO1xuICAgICAgaWYgKHNlZ21lbnRzICYmIHNlZ21lbnRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICBjb21tYW5kcy5wdXNoKC4uLnNlZ21lbnRzLm1hcCh2ID0+IHYucGF0aCkpO1xuICAgICAgICB0aGlzLnN0b3JhZ2UuZGVsZXRlKCdoaXN0b3J5OicgKyBrZXkpLnN1YnNjcmliZShfID0+IF8pO1xuICAgICAgfVxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoY29tbWFuZHMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWvvOiIqui/lOWbnlxuICAgKiBOYXZpZ2F0ZSBiYWNrXG4gICAqL1xuICBiYWNrKCk6IHZvaWQge1xuICAgIHRoaXMubG9jYXRpb24uYmFjaygpO1xuICAgIHRoaXMucmVzZXRJMThuKCk7XG4gIH1cblxuICAvKipcbiAgICog5Yid5aeL5YyW6K+t6KiA5YyFXG4gICAqIFNldHVwIGxhbmd1YWdlIHBhY2tcbiAgICovXG4gIHNldHVwTG9jYWxlKCk6IHZvaWQge1xuICAgIHRoaXMubCA9IHt9O1xuICAgIHRoaXMuc2V0TG9jYWxlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdsb2NhbGUnKSB8fCB0aGlzLmxvY2FsZURlZmF1bHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOi9veWFpeivreiogOWMhVxuICAgKiBSZWdpc3RlcmVkIGxhbmd1YWdlIHBhY2tcbiAgICovXG4gIHJlZ2lzdGVyTG9jYWxlcyhwYWNrZXI6IG9iamVjdCB8IFByb21pc2U8YW55Pik6IHZvaWQge1xuICAgIFByb21pc2UucmVzb2x2ZShwYWNrZXIpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgIGlmICghcmVzdWx0LmRlZmF1bHQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5sYW5ndWFnZSA9IG5ldyBNYXAoWy4uLnRoaXMubGFuZ3VhZ2UsIC4uLk9iamVjdC5lbnRyaWVzKHJlc3VsdC5kZWZhdWx0KV0pO1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxvY2FsZURlZmF1bHQuaW5kZXhPZih0aGlzLmxvY2FsZSk7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGRhdGFdIG9mIHRoaXMubGFuZ3VhZ2UuZW50cmllcygpKSB7XG4gICAgICAgIHRoaXMubFtrZXldID0gZGF0YVtpbmRleF07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog6K6+572u6K+t6KiA5YyFIElEXG4gICAqIFNldCBsYW5ndWFnZSBJRFxuICAgKi9cbiAgc2V0TG9jYWxlKGxvY2FsZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2xvY2FsZScsIGxvY2FsZSk7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmxvY2FsZU1hcHBpbmcuaW5kZXhPZih0aGlzLmxvY2FsZSk7XG4gICAgZm9yIChjb25zdCBba2V5LCBkYXRhXSBvZiB0aGlzLmxhbmd1YWdlLmVudHJpZXMoKSkge1xuICAgICAgdGhpcy5sW2tleV0gPSBkYXRhW2luZGV4XTtcbiAgICB9XG4gICAgdGhpcy5uekkxOG5TZXJ2aWNlLnNldExvY2FsZSh0aGlzLmxvY2FsZUJpbmRbaW5kZXhdKTtcbiAgICB0aGlzLmxvY2FsZUNoYW5nZWQubmV4dChsb2NhbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWbvemZheWMliBJRCDmmK/lkKbnm7jnrYlcbiAgICogQXJlIHRoZSBJMThuIElEcyBlcXVhbFxuICAgKi9cbiAgZXF1YWxJMThuKGkxOG46IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmkxOG4gPT09IGkxOG47XG4gIH1cblxuICAvKipcbiAgICog6YeN572u5Zu96ZmF5YyWIElEXG4gICAqIFJlc2V0IEkxOG4gSURcbiAgICovXG4gIHJlc2V0STE4bigpOiB2b2lkIHtcbiAgICB0aGlzLmkxOG4gPSB0aGlzLmkxOG5EZWZhdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIOeUn+aIkCBJMThuIEZvcm1Hcm91cFxuICAgKiBHZW5lcmF0ZSBJMThuIEZvcm1Hcm91cFxuICAgKi9cbiAgaTE4bkdyb3VwKG9wdGlvbnM6IEkxOG5Hcm91cE9wdGlvbik6IGFueSB7XG4gICAgY29uc3QgY29udHJvbHMgPSB7fTtcbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBJRCBvZiB0aGlzLmkxOG5Db250YWluKSB7XG4gICAgICAgIGNvbnRyb2xzW0lEXSA9IFtudWxsLCBbXSwgW11dO1xuICAgICAgICBpZiAob3B0aW9ucy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMudmFsdWUuaGFzT3duUHJvcGVydHkoSUQpKSB7XG4gICAgICAgICAgY29udHJvbHNbSURdWzBdID0gb3B0aW9ucy52YWx1ZVtJRF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMudmFsaWRhdGUgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnZhbGlkYXRlLmhhc093blByb3BlcnR5KElEKSkge1xuICAgICAgICAgIGNvbnRyb2xzW0lEXVsxXSA9IG9wdGlvbnMudmFsaWRhdGVbSURdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmFzeW5jVmFsaWRhdGUgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmFzeW5jVmFsaWRhdGUuaGFzT3duUHJvcGVydHkoSUQpKSB7XG4gICAgICAgICAgY29udHJvbHNbSURdWzJdID0gb3B0aW9ucy5hc3luY1ZhbGlkYXRlW0lEXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29udHJvbHM7XG4gIH1cblxuICAvKipcbiAgICog6Kej5p6Q5Zu96ZmF5YyW5pWw5o2uXG4gICAqIFBhcnNlIGkxOG4gc3RyaW5nIGpzb25cbiAgICovXG4gIGkxOG5QYXJzZSh0ZXh0OiBzdHJpbmcpOiBhbnkge1xuICAgIGNvbnN0IGpzb246IGFueSA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgY29uc3QgZGF0YTogYW55ID0ge307XG4gICAgZm9yIChjb25zdCBJRCBvZiB0aGlzLmkxOG5Db250YWluKSB7XG4gICAgICBpZiAoanNvbi5oYXNPd25Qcm9wZXJ0eShJRCkpIHtcbiAgICAgICAgZGF0YVtJRF0gPSBqc29uW0lEXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvKipcbiAgICog55Sf5Lqn5YiG6aG15pWw5o2u5a+56LGhXG4gICAqIEZhY3RvcnkgbGlzdCBieSBwYWdlXG4gICAqL1xuICBsaXN0QnlQYWdlKG9wdGlvbjogTGlzdEJ5UGFnZU9wdGlvbik6IExpc3RCeVBhZ2Uge1xuICAgIG9wdGlvbi5saW1pdCA9IG9wdGlvbi5saW1pdCB8fCB0aGlzLnBhZ2VEZWZhdWx0O1xuICAgIHJldHVybiBuZXcgTGlzdEJ5UGFnZSh0aGlzLmN1cmQsIHRoaXMuc3RvcmFnZSwgb3B0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmuIXpmaTlupTnlKjmnKzlnLDlrZjlgqhcbiAgICogQ2xlYXIgYXBwIGxvY2FsIHN0b3JhZ2VcbiAgICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmFnZS5rZXlzKCkucGlwZShcbiAgICAgIGZpbHRlcih2ID0+XG4gICAgICAgIFsncmVzb3VyY2UnLCAncm91dGVyJ10uaW5jbHVkZXModikgfHxcbiAgICAgICAgdi5zZWFyY2goL15zZWFyY2g6XFxTKyQvKSAhPT0gLTEgfHxcbiAgICAgICAgdi5zZWFyY2goL15wYWdlOlxcUyskLykgIT09IC0xIHx8XG4gICAgICAgIHYuc2VhcmNoKC9eY3Jvc3M6XFxTKyQvKSAhPT0gLTFcbiAgICAgICksXG4gICAgICBzd2l0Y2hNYXAoa2V5ID0+IHRoaXMuc3RvcmFnZS5kZWxldGUoa2V5KSlcbiAgICApLnN1YnNjcmliZShfID0+IF8pO1xuICB9XG59XG4iXX0=