dbweb-common
Version:
用`yarn add dbweb-common`安装,不要忘记修改`angular.json`里的 `architect\build\options\assets`,加上
164 lines • 24.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, HostBinding } from '@angular/core';
import { CurrentService, ElementsService, ProjectService, fullApiPath } from 'dbweb-core';
import { exportAnimation } from './animal';
import { ExportService } from './export.service';
export class ExportComponent {
/**
* @param {?} svr
* @param {?} prj
* @param {?} eles
* @param {?} cur
*/
constructor(svr, prj, eles, cur) {
this.svr = svr;
this.prj = prj;
this.eles = eles;
this.cur = cur;
this.hostClass = true;
this.subs = [];
}
/**
* @return {?}
*/
ngOnInit() {
this.svr.init();
}
/**
* @return {?}
*/
ngOnDestroy() {
this.subs.forEach((/**
* @param {?} v
* @return {?}
*/
v => v.unsubscribe()));
}
/**
* @param {?} event
* @return {?}
*/
selectChecked(event) {
this.svr.columns.forEach((/**
* @param {?} v
* @return {?}
*/
v => (v.selected = event.checked)));
}
/**
* @return {?}
*/
doExport() {
this.svr
.doExport({
Format: this.svr.format,
DB: this.svr.dbName,
TableName: this.svr.tableName,
Encoding: this.svr.encoding,
Columns: this.svr.columns.filter((/**
* @param {?} v
* @return {?}
*/
v => v.selected)).map((/**
* @param {?} v
* @return {?}
*/
v => v.Name))
})
.subscribe((/**
* @param {?} v
* @return {?}
*/
v => {
this.svr.step = 'inTheExpord';
/** @type {?} */
const startTime = new Date();
this.svr.taskInfoURL = this.prj.frontURL('task', v.TaskInfoURL);
this.svr.zipFileURL = fullApiPath(v.ZipFileSignURL);
this.subs.push(this.cur.wsCtrl.observable.subscribe((/**
* @param {?} mes
* @return {?}
*/
(mes) => {
if (mes.Data.TaskID === v.TaskID) {
if (!mes.Data.Completed) {
/** @type {?} */
const g = mes.Data.Data / this.svr.rowCount;
this.svr.exportProgress = g * 100;
/** @type {?} */
const d = new Date().getTime() - startTime.getTime();
this.svr.timeRemaining = (d / g) * (1 - g);
}
else {
this.svr.exportProgress = 100;
this.svr.step = 'complete';
}
}
})));
}));
}
/**
* @param {?} type
* @return {?}
*/
chineseString(type) {
if (type === 'STR') {
return '字符串';
}
else if (type === 'INT') {
return '整型';
}
else if (type === 'DATE') {
return '日期';
}
else if (type === 'FLOAT') {
return '浮点';
}
else if (type === 'BYTEA') {
return '二进制';
}
}
}
ExportComponent.decorators = [
{ type: Component, args: [{
selector: 'common-export',
template: "<ng-container [ngSwitch]=\"svr.step\">\r\n\t\t<!-- **** \u6570\u636E\u5BFC\u51FA\u8868\u603B **** -->\r\n\t\t<div class=\"export-data\" *ngSwitchCase=\"'toPrepare'\">\r\n\t\t\t\t<!-- **** \u6570\u636E\u5BFC\u51FA\u8868\uFF08\u4E0A\uFF09 **** -->\r\n\t\t\t\t<div class=\"data-wrapper\">\r\n\t\t\t\t\t<!-- ** \u6570\u636E\u5BFC\u51FA\u5927\u6807\u9898 ** -->\r\n\t\t\t\t\t<header class=\"data-title\">\u6570\u636E\u5BFC\u51FA</header>\r\n\t\t\t\t\t<!-- ** \u6570\u636E\u5BFC\u51FA\u6B63\u8868 ** -->\r\n\t\t\t\t\t<section class=\"export-table\">\r\n\t\t\t\t\t\t<table>\r\n\t\t\t\t\t\t\t<!-- * \u8868\u5934 * -->\r\n\t\t\t\t\t\t\t<thead>\r\n\t\t\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t\t\t<th>\u6765\u6E90</th>\r\n\t\t\t\t\t\t\t\t\t<th>\u8BB0\u5F55\u6570</th>\r\n\t\t\t\t\t\t\t\t\t<th>\u683C\u5F0F</th>\r\n\t\t\t\t\t\t\t\t\t<th>\u7F16\u7801</th>\r\n\t\t\t\t\t\t\t\t\t<th>\u76EE\u6807\u6570\u636E\u5E93</th>\r\n\t\t\t\t\t\t\t\t\t<th>\u76EE\u6807\u8868</th>\r\n\t\t\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t\t\t</thead>\r\n\t\t\t\t\t\t\t<!-- * \u8868\u5355\u6B63\u4F53 * -->\r\n\t\t\t\t\t\t\t<tbody>\r\n\t\t\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t\t\t<!-- \u6765\u6E90 -->\r\n\t\t\t\t\t\t\t\t\t<td>{{svr.srcElementTitle}}</td>\r\n\t\t\t\t\t\t\t\t\t<!-- \u8BB0\u5F55\u6570 -->\r\n\t\t\t\t\t\t\t\t\t<td>{{svr.rowCount}}</td>\r\n\t\t\t\t\t\t\t\t\t<!-- \u683C\u5F0F -->\r\n\t\t\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t\t\t<mat-form-field>\r\n\t\t\t\t\t\t\t\t\t\t\t<mat-select class=\"export-slt\" [(ngModel)]=\"svr.format\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-option value=\"csv\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tCSV(\u9017\u53F7\u5206\u9694\u6587\u672C)\r\n\t\t\t\t\t\t\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-option value=\"txt\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tTXT(TAB\u5206\u9694\u6587\u672C)\r\n\t\t\t\t\t\t\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-option value=\"json\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tJSON\r\n\t\t\t\t\t\t\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-option value=\"excel\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tXLS(Excel\u683C\u5F0F\u6587\u4EF6)\r\n\t\t\t\t\t\t\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-option value=\"sqlite3\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tSQLITE3\r\n\t\t\t\t\t\t\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-option value=\"mytable\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\u6570\u636E\u5E93\u8868\r\n\t\t\t\t\t\t\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t\t\t\t\t\t\t</mat-select>\r\n\t\t\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t\t\t<!-- \u7F16\u7801 -->\r\n\t\t\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t\t\t<mat-form-field>\r\n\t\t\t\t\t\t\t\t\t\t\t<mat-select [(ngModel)]=\"svr.encoding\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-option value=\"utf8\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tUTF-8\r\n\t\t\t\t\t\t\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-option value=\"gbk\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tGBK\r\n\t\t\t\t\t\t\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t\t\t\t\t\t\t</mat-select>\r\n\t\t\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t\t\t<!-- \u76EE\u6807\u6570\u636E\u5E93 -->\r\n\t\t\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t\t\t<mat-form-field>\r\n\t\t\t\t\t\t\t\t\t\t\t<mat-select [(ngModel)]=\"svr.dbName\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t[disabled]=\"svr.format!=='mytable'\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-option value=\"\">(\u7A7A)</mat-option>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<mat-option *ngFor=\"let item of svr.dbNames\" [value]=\"item\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{{item}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t\t\t\t\t\t\t</mat-select>\r\n\t\t\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t\t\t<!-- \u76EE\u6807\u8868 -->\r\n\t\t\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t\t\t<mat-form-field>\r\n\t\t\t\t\t\t\t\t\t\t\t<input matInput [(ngModel)]=\"svr.tableName\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t[disabled]=\"svr.format!=='mytable'\">\r\n\t\t\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t\t\t</tbody>\r\n\t\t\t\t\t\t</table>\r\n\t\t\t\t\t</section>\r\n\t\t\t\t</div>\r\n\t\t\r\n\t\t\t\t<!-- *** \u6307\u6807\u9009\u62E9\u8868\u5355\uFF08\u4E0B\uFF09 *** -->\r\n\t\t\t\t<div class=\"select-wrapper\">\r\n\t\t\t\t\t<!-- ** \u9009\u62E9\u8868\u5927\u6807\u9898 ** -->\r\n\t\t\t\t\t<header class=\"select-title\">\u6307\u6807\u9009\u62E9</header>\r\n\t\t\t\t\t<!-- ** \u9009\u62E9\u8868\u6B63\u8868 ** -->\r\n\t\t\t\t\t<section class=\"select-table\">\r\n\t\t\t\t\t\t<!-- * \u9009\u62E9\u8868 * -->\r\n\t\t\t\t\t\t<table mat-table [dataSource]=\"svr.columns\">\r\n\t\t\t\t\t\t\t<!-- \u9009\u62E9\u6846 -->\r\n\t\t\t\t\t\t\t<ng-container class=\"slt-checkbox\" matColumnDef=\"select\">\r\n\t\t\t\t\t\t\t\t<th mat-header-cell *matHeaderCellDef>\r\n\t\t\t\t\t\t\t\t\t<mat-checkbox (change)=\"selectChecked($event)\"\r\n\t\t\t\t\t\t\t\t\t\t[checked]=\"svr.isAllSelected()\"\r\n\t\t\t\t\t\t\t\t\t\t[indeterminate]=\"svr.hasSelected() && !svr.isAllSelected()\">\r\n\t\t\t\t\t\t\t\t\t</mat-checkbox>\r\n\t\t\t\t\t\t\t\t</th>\r\n\t\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let row\">\r\n\t\t\t\t\t\t\t\t\t<mat-checkbox [(ngModel)]=\"row.selected\">\r\n\t\t\t\t\t\t\t\t\t</mat-checkbox>\r\n\t\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- \u5E8F\u53F7 -->\r\n\t\t\t\t\t\t\t<ng-container matColumnDef=\"position\">\r\n\t\t\t\t\t\t\t\t<th mat-header-cell *matHeaderCellDef>\r\n\t\t\t\t\t\t\t\t\t\u5E8F\u53F7</th>\r\n\t\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let element,index as i\">\r\n\t\t\t\t\t\t\t\t\t{{ i+1 }}\r\n\t\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- \u540D\u79F0 -->\r\n\t\t\t\t\t\t\t<ng-container matColumnDef=\"name\">\r\n\t\t\t\t\t\t\t\t<th mat-header-cell *matHeaderCellDef>\r\n\t\t\t\t\t\t\t\t\t\u540D\u79F0</th>\r\n\t\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let element\">\r\n\t\t\t\t\t\t\t\t\t{{ element.Name }}\r\n\t\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- \u5B57\u6BB5\u7C7B\u578B -->\r\n\t\t\t\t\t\t\t<ng-container matColumnDef=\"type\">\r\n\t\t\t\t\t\t\t\t<th mat-header-cell *matHeaderCellDef>\r\n\t\t\t\t\t\t\t\t\t\u5B57\u6BB5\u7C7B\u578B\r\n\t\t\t\t\t\t\t\t</th>\r\n\t\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let element\">\r\n\t\t\t\t\t\t\t\t\t{{ chineseString(element.Type) }}\r\n\t\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- \u957F\u5EA6 -->\r\n\t\t\t\t\t\t\t<ng-container matColumnDef=\"maxlength\">\r\n\t\t\t\t\t\t\t\t<th mat-header-cell *matHeaderCellDef>\r\n\t\t\t\t\t\t\t\t\t\u957F\u5EA6\r\n\t\t\t\t\t\t\t\t</th>\r\n\t\t\t\t\t\t\t\t<td mat-cell *matCellDef=\"let element\">\r\n\t\t\t\t\t\t\t\t\t{{ element.MaxLength }}\r\n\t\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- \u8868\u5934\u8BBE\u7F6E -->\r\n\t\t\t\t\t\t\t<tr mat-header-row\r\n\t\t\t\t\t\t\t\t*matHeaderRowDef=\"['select','position','name','type','maxlength']; sticky: true\">\r\n\t\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t\t\t<tr mat-row\r\n\t\t\t\t\t\t\t\t*matRowDef=\"let row; columns: ['select','name','position','type','maxlength']\">\r\n\t\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t\t</table>\r\n\t\t\t\t\t</section>\r\n\t\t\t\t\t<footer class=\"btn\">\r\n\t\t\t\t\t\t\t<button class=\"export-btn\" mat-button type=\"button\" (click)=\"doExport()\">\u5BFC\u51FA</button>\r\n\t\t\t\t\t</footer>\r\n\t\t\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\r\n\t<!-- \u76EE\u524D\u4E0D\u4E00\u5B9A\u9700\u8981 -->\r\n <div class=\"expording\" *ngSwitchCase=\"'inTheExpord'\">\r\n\r\n\t\t<div class=\"expording-wrapper\">\r\n\t\t\t<div class=\"expording-title\">\r\n\t\t\t\t\u6570\u636E\u6B63\u5728\u5BFC\u51FA\uFF0C\u5269\u4F59\r\n\t\t\t\t<span class=\"expording-num\">{{ svr.timeRemaining }}</span>\r\n\t\t\t\t\u79D2\r\n\t\t\t</div>\r\n\t\t\t<div class=\"expording-text\">\r\n\t\t\t\t\u540E\u53F0\u6B63\u5728\u5BFC\u51FA\u6570\u636E\uFF0C\u8BF7\u8010\u5FC3\u7B49\u5F85\uFF0C\u7ED3\u675F\u540E\u5373\u53EF\u4E0B\u8F7D\uFF1B\u672C\u9875\u9762\u5173\u95ED\u540E\u53EF\u5728<u class=\"text-check\">\u4EFB\u52A1\u67E5\u8BE2</u>\u4E2D\u67E5\u770B\u8FDB\u5EA6\r\n\t\t\t</div>\r\n\t\t\t<div>\r\n\t\t\t\t<mat-progress-bar color=\"accent\" mode=\"determinate\"\r\n\t\t\t\t\t[value]=\"svr.exportProgress\"> </mat-progress-bar>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t<div class=\"prepare\" *ngSwitchCase=\"'complete'\">\r\n\t\t<div class=\"prepare-wrapper\">\r\n\t\t\t<div class=\"prepare-title\">\u6587\u4EF6\u5DF2\u7ECF\u51C6\u5907\u5B8C\u6BD5</div>\r\n\t\t\t<div class=\"prepare-text\">\r\n\t\t\t\t\u53EF\u67E5\u770B\u4E0B\u8F7D\u6587\u4EF6\u7684\u5185\u5BB9\u6216\u76F4\u63A5\u8FDB\u884C\u4E0B\u8F7D\uFF1B\u672C\u9875\u9762\u5173\u95ED\u540E\u53EF\u5728<u class=\"text-check\"><a\r\n\t\t\t\t\t\t[routerLink]=\"svr.taskInfoURL\">\u4EFB\u52A1\u660E\u7EC6</a></u>\u9875\u9762\u4E2D\u67E5\u770B\u8FDB\u5EA6\r\n\t\t\t</div>\r\n\t\t\t<div class=\"btn\">\r\n\t\t\t\t<a mat-button [href]=\"svr.zipFileURL\"\r\n\t\t\t\t\t*ngIf=\"svr.format !=='mytable'\">\u4E0B\u8F7D</a>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</ng-container>\r\n\r\n",
animations: [exportAnimation],
providers: [ExportService],
styles: ["a{text-decoration:none}.export-data .data-wrapper,.export-data .select-wrapper{max-width:960px;min-width:688px;margin:0 auto;box-sizing:border-box;border-radius:4px;padding:16px 24px;box-shadow:0 5px 13px 0 rgba(0,0,0,.14)}.export-data .data-title,.export-data .select-title{margin-bottom:16px}.export-data .export-table,.export-data .select-table{width:100%}.export-data .data-wrapper{height:160px}.export-data .data-wrapper .data-title{font:20px bold}.export-data .data-wrapper .export-table{font-size:14px}.export-data .data-wrapper .export-table table{width:100%;border-collapse:collapse;box-sizing:border-box}.export-data .data-wrapper .export-table td,.export-data .data-wrapper .export-table th{height:40px;padding:0 8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;box-sizing:border-box}.export-data .data-wrapper .export-table th{text-align:left}.export-data .select-wrapper{height:auto;margin-top:16px}.export-data .select-wrapper .select-title{font:16px bold}.export-data .select-wrapper .select-table{width:100%;max-height:535px;overflow:auto;box-shadow:0 5px 13px 0 rgba(0,0,0,.14)}.export-data .select-wrapper table{width:100%;box-sizing:border-box}.export-data .select-wrapper .slt-checkbox{width:50px}.export-data .select-wrapper td,.export-data .select-wrapper th{height:32px;box-sizing:border-box}.export-data .select-wrapper .btn{width:100%;text-align:right;margin-top:16px}.export-data .select-wrapper .btn .export-btn{width:80px;height:32px;line-height:32px;color:#fff;font-size:14px}.expording{display:flex;justify-content:center;align-items:center;width:100%;height:calc(100vh - 30px)}.expording .expording-wrapper{width:624px;height:456px;margin-top:-60px;background:url(/front/assets/export/prepare.png) top center/300px 300px no-repeat;box-shadow:0 2px 5px 0 rgba(0,0,0,.14);box-sizing:border-box}.expording .expording-wrapper .expording-text,.expording .expording-wrapper .expording-title{width:100%;box-sizing:border-box}.expording .expording-wrapper .expording-title{padding:271px 128px 0;font-size:24px}.expording .expording-wrapper .expording-text{padding:16px 128px 88px;font-size:16px}.expording .expording-wrapper .expording-text .text-check{font-weight:700}.prepare{display:flex;justify-content:center;align-items:center;width:100%;height:calc(100vh - 30px)}.prepare .prepare-wrapper{width:624px;height:456px;margin-top:-60px;background:url(/front/assets/export/done.png) top center/300px 300px no-repeat;box-shadow:0 2px 5px 0 rgba(0,0,0,.14);box-sizing:border-box}.prepare .prepare-wrapper .expording-text,.prepare .prepare-wrapper .expording-title{width:100%;box-sizing:border-box}.prepare .prepare-wrapper .prepare-title{padding:271px 128px 0;font-size:24px}.prepare .prepare-wrapper .prepare-text{padding:16px 128px 0;font-size:16px}.prepare .prepare-wrapper .prepare-text .text-check{font-weight:700}.prepare .prepare-wrapper .btn{width:100%;text-align:right;padding:35px 32px 25px 0;box-sizing:border-box}.prepare .prepare-wrapper .btn a{width:80px;height:32px;line-height:32px;color:#fff;font-size:14px}"]
}] }
];
/** @nocollapse */
ExportComponent.ctorParameters = () => [
{ type: ExportService },
{ type: ProjectService },
{ type: ElementsService },
{ type: CurrentService }
];
ExportComponent.propDecorators = {
hostClass: [{ type: HostBinding, args: ['class.export',] }]
};
if (false) {
/** @type {?} */
ExportComponent.prototype.hostClass;
/** @type {?} */
ExportComponent.prototype.subs;
/** @type {?} */
ExportComponent.prototype.svr;
/** @type {?} */
ExportComponent.prototype.prj;
/**
* @type {?}
* @private
*/
ExportComponent.prototype.eles;
/**
* @type {?}
* @private
*/
ExportComponent.prototype.cur;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2Rid2ViLWNvbW1vbi8iLCJzb3VyY2VzIjpbImxpYi9leHBvcnQvZXhwb3J0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRTFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFMUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsYUFBYSxFQUF1QixNQUFNLGtCQUFrQixDQUFDO0FBU3RFLE1BQU0sT0FBTyxlQUFlOzs7Ozs7O0lBSTNCLFlBQ1EsR0FBa0IsRUFDbEIsR0FBbUIsRUFDbEIsSUFBcUIsRUFDckIsR0FBbUI7UUFIcEIsUUFBRyxHQUFILEdBQUcsQ0FBZTtRQUNsQixRQUFHLEdBQUgsR0FBRyxDQUFnQjtRQUNsQixTQUFJLEdBQUosSUFBSSxDQUFpQjtRQUNyQixRQUFHLEdBQUgsR0FBRyxDQUFnQjtRQVBDLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFDOUMsU0FBSSxHQUFtQixFQUFFLENBQUM7SUFPdkIsQ0FBQzs7OztJQUVKLFFBQVE7UUFDUCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2pCLENBQUM7Ozs7SUFDRCxXQUFXO1FBQ1YsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPOzs7O1FBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUMsQ0FBQztJQUN6QyxDQUFDOzs7OztJQUVELGFBQWEsQ0FBQyxLQUF3QjtRQUNyQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPOzs7O1FBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcs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QzdCLFNBQVMsRUFBRSxDQUFDLGFBQWEsQ0FBQzs7YUFDMUI7Ozs7WUFSUSxhQUFhO1lBSG9CLGNBQWM7WUFBL0IsZUFBZTtZQUEvQixjQUFjOzs7d0JBYXJCLFdBQVcsU0FBQyxjQUFjOzs7O0lBQTNCLG9DQUE4Qzs7SUFDOUMsK0JBQTBCOztJQUd6Qiw4QkFBeUI7O0lBQ3pCLDhCQUEwQjs7Ozs7SUFDMUIsK0JBQTZCOzs7OztJQUM3Qiw4QkFBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RCaW5kaW5nLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveENoYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsJztcclxuaW1wb3J0IHsgQ3VycmVudFNlcnZpY2UsIEVsZW1lbnRzU2VydmljZSwgUHJvamVjdFNlcnZpY2UsIGZ1bGxBcGlQYXRoIH0gZnJvbSAnZGJ3ZWItY29yZSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBleHBvcnRBbmltYXRpb24gfSBmcm9tICcuL2FuaW1hbCc7XHJcbmltcG9ydCB7IEV4cG9ydFNlcnZpY2UsIEV4cG9ydFRhc2tXU01lc3NhZ2UgfSBmcm9tICcuL2V4cG9ydC5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiAnY29tbW9uLWV4cG9ydCcsXHJcblx0dGVtcGxhdGVVcmw6ICcuL2V4cG9ydC5jb21wb25lbnQuaHRtbCcsXHJcblx0c3R5bGVVcmxzOiBbJy4vZXhwb3J0LmNvbXBvbmVudC5zY3NzJ10sXHJcblx0YW5pbWF0aW9uczogW2V4cG9ydEFuaW1hdGlvbl0sXHJcblx0cHJvdmlkZXJzOiBbRXhwb3J0U2VydmljZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIEV4cG9ydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHRASG9zdEJpbmRpbmcoJ2NsYXNzLmV4cG9ydCcpIGhvc3RDbGFzcyA9IHRydWU7XHJcblx0c3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRwdWJsaWMgc3ZyOiBFeHBvcnRTZXJ2aWNlLFxyXG5cdFx0cHVibGljIHByajogUHJvamVjdFNlcnZpY2UsXHJcblx0XHRwcml2YXRlIGVsZXM6IEVsZW1lbnRzU2VydmljZSxcclxuXHRcdHByaXZhdGUgY3VyOiBDdXJyZW50U2VydmljZVxyXG5cdCkge31cclxuXHJcblx0bmdPbkluaXQoKSB7XHJcblx0XHR0aGlzLnN2ci5pbml0KCk7XHJcblx0fVxyXG5cdG5nT25EZXN0cm95KCkge1xyXG5cdFx0dGhpcy5zdWJzLmZvckVhY2godiA9PiB2LnVuc3Vic2NyaWJlKCkpO1xyXG5cdH1cclxuXHJcblx0c2VsZWN0Q2hlY2tlZChldmVudDogTWF0Q2hlY2tib3hDaGFuZ2UpIHtcclxuXHRcdHRoaXMuc3ZyLmNvbHVtbnMuZm9yRWFjaCh2ID0+ICh2LnNlbGVjdGVkID0gZXZlbnQuY2hlY2tlZCkpO1xyXG5cdH1cclxuXHRkb0V4cG9ydCgpIHtcclxuXHRcdHRoaXMuc3ZyXHJcblx0XHRcdC5kb0V4cG9ydCh7XHJcblx0XHRcdFx0Rm9ybWF0OiB0aGlzLnN2ci5mb3JtYXQsXHJcblx0XHRcdFx0REI6IHRoaXMuc3ZyLmRiTmFtZSxcclxuXHRcdFx0XHRUYWJsZU5hbWU6IHRoaXMuc3ZyLnRhYmxlTmFtZSxcclxuXHRcdFx0XHRFbmNvZGluZzogdGhpcy5zdnIuZW5jb2RpbmcsXHJcblx0XHRcdFx0Q29sdW1uczogdGhpcy5zdnIuY29sdW1ucy5maWx0ZXIodiA9PiB2LnNlbGVjdGVkKS5tYXAodiA9PiB2Lk5hbWUpXHJcblx0XHRcdH0pXHJcblx0XHRcdC5zdWJzY3JpYmUodiA9PiB7XHJcblx0XHRcdFx0dGhpcy5zdnIuc3RlcCA9ICdpblRoZUV4cG9yZCc7XHJcblx0XHRcdFx0Y29uc3Qgc3RhcnRUaW1lID0gbmV3IERhdGUoKTtcclxuXHRcdFx0XHR0aGlzLnN2ci50YXNrSW5mb1VSTCA9IHRoaXMucHJqLmZyb250VVJMKCd0YXNrJywgdi5UYXNrSW5mb1VSTCk7XHJcblx0XHRcdFx0dGhpcy5zdnIuemlwRmlsZVVSTCA9IGZ1bGxBcGlQYXRoKHYuWmlwRmlsZVNpZ25VUkwpO1xyXG5cdFx0XHRcdHRoaXMuc3Vicy5wdXNoKFxyXG5cdFx0XHRcdFx0dGhpcy5jdXIud3NDdHJsLm9ic2VydmFibGUuc3Vic2NyaWJlKChtZXM6IEV4cG9ydFRhc2tXU01lc3NhZ2UpID0+IHtcclxuXHRcdFx0XHRcdFx0aWYgKG1lcy5EYXRhLlRhc2tJRCA9PT0gdi5UYXNrSUQpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIW1lcy5EYXRhLkNvbXBsZXRlZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgZyA9IG1lcy5EYXRhLkRhdGEgLyB0aGlzLnN2ci5yb3dDb3VudDtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuc3ZyLmV4cG9ydFByb2dyZXNzID0gZyAqIDEwMDtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0VGltZS5nZXRUaW1lKCk7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnN2ci50aW1lUmVtYWluaW5nID0gKGQgLyBnKSAqICgxIC0gZyk7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuc3ZyLmV4cG9ydFByb2dyZXNzID0gMTAwO1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5zdnIuc3RlcCA9ICdjb21wbGV0ZSc7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdH0pO1xyXG5cdH1cclxuXHRjaGluZXNlU3RyaW5nKHR5cGU6IHN0cmluZykge1xyXG5cdFx0aWYgKHR5cGUgPT09ICdTVFInKSB7XHJcblx0XHRcdHJldHVybiAn5a2X56ym5LiyJztcclxuXHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gJ0lOVCcpIHtcclxuXHRcdFx0cmV0dXJuICfmlbTlnosnO1xyXG5cdFx0fSBlbHNlIGlmICh0eXBlID09PSAnREFURScpIHtcclxuXHRcdFx0cmV0dXJuICfml6XmnJ8nO1xyXG5cdFx0fSBlbHNlIGlmICh0eXBlID09PSAnRkxPQVQnKSB7XHJcblx0XHRcdHJldHVybiAn5rWu54K5JztcclxuXHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gJ0JZVEVBJykge1xyXG5cdFx0XHRyZXR1cm4gJ+S6jOi/m+WItic7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcbiJdfQ==