dbweb-common
Version:
用`yarn add dbweb-common`安装,不要忘记修改`angular.json`里的 `architect\build\options\assets`,加上
439 lines • 30.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { HttpEventType } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { CurrentApiService, ProjectService, ElementsService } from 'dbweb-core';
import { MatSnackBar } from '@angular/material';
/** @type {?} */
const MUST = 'MUST';
/**
* @record
*/
function ImportField() { }
if (false) {
/** @type {?} */
ImportField.prototype.Name;
/** @type {?} */
ImportField.prototype.Alias;
/** @type {?} */
ImportField.prototype.Type;
/** @type {?} */
ImportField.prototype.MaxLength;
/** @type {?} */
ImportField.prototype.Style;
/** @type {?} */
ImportField.prototype.PrimaryKey;
/** @type {?} */
ImportField.prototype.Remark;
}
/**
* @record
*/
function MapField() { }
if (false) {
/** @type {?} */
MapField.prototype.Name;
/** @type {?} */
MapField.prototype.Style;
/** @type {?} */
MapField.prototype.MapName;
/** @type {?} */
MapField.prototype.Value;
/** @type {?} */
MapField.prototype.Remark;
}
/**
* @record
*/
function RefreshPreviewParam() { }
if (false) {
/** @type {?} */
RefreshPreviewParam.prototype.FileName;
/** @type {?} */
RefreshPreviewParam.prototype.Format;
/** @type {?} */
RefreshPreviewParam.prototype.Encoding;
/** @type {?} */
RefreshPreviewParam.prototype.FirstHead;
}
/**
* @record
*/
function RefreshPreviewResult() { }
if (false) {
/** @type {?} */
RefreshPreviewResult.prototype.Title;
/** @type {?} */
RefreshPreviewResult.prototype.Rows;
/** @type {?} */
RefreshPreviewResult.prototype.Error;
}
/**
* @record
*/
function DoImportParam() { }
if (false) {
/** @type {?} */
DoImportParam.prototype.FileName;
/** @type {?} */
DoImportParam.prototype.FirstHead;
/** @type {?} */
DoImportParam.prototype.Encoding;
/** @type {?} */
DoImportParam.prototype.Format;
/** @type {?} */
DoImportParam.prototype.Fields;
}
/**
* @record
*/
export function DoImportResult() { }
if (false) {
/** @type {?} */
DoImportResult.prototype.TaskInfoURL;
/** @type {?} */
DoImportResult.prototype.TaskInfoSign;
/** @type {?} */
DoImportResult.prototype.BrowseTaskElement;
}
/**
* @record
*/
export function ImportInfo() { }
if (false) {
/** @type {?} */
ImportInfo.prototype.TableName;
/** @type {?} */
ImportInfo.prototype.TableTotal;
/** @type {?} */
ImportInfo.prototype.TableCanRemove;
/** @type {?} */
ImportInfo.prototype.Fields;
/** @type {?} */
ImportInfo.prototype.NullIden;
}
/**
* @record
*/
export function RemoveTableDataResult() { }
if (false) {
/** @type {?} */
RemoveTableDataResult.prototype.Total;
/** @type {?} */
RemoveTableDataResult.prototype.CanRemove;
}
export class ImportService {
/**
* @param {?} api
* @param {?} prj
* @param {?} eles
* @param {?} snackBar
*/
constructor(api, prj, eles, snackBar) {
this.api = api;
this.prj = prj;
this.eles = eles;
this.snackBar = snackBar;
this.step = 'select-file';
// 服务端唯一的临时文件名
this.firstHead = true; // 是否是首行的标识
// 是否是首行的标识
this.format = 'CSV';
this.encoding = 'UTF8';
this.previewData = { Have: false, Title: null, Rows: null, Error: '' };
}
/**
* @return {?}
*/
init() {
this.GetImportInfo().subscribe((/**
* @param {?} v
* @return {?}
*/
v => {
this.tableName = v.TableName;
this.tableTotal = v.TableTotal;
this.tableCanRemove = v.TableCanRemove;
this.fields = v.Fields;
this.nullIden = v.NullIden;
this.mapFields = v.Fields.map((/**
* @param {?} fld
* @return {?}
*/
fld => ({
Name: fld.Name,
Style: fld.Style,
MapName: '',
Value: '',
Remark: fld.Remark
})));
}));
}
/**
* @return {?}
*/
GetImportInfo() {
return this.api.get('get-import-info');
}
/**
* @return {?}
*/
mustFields() {
if (this.fields) {
return this.fields.filter((/**
* @param {?} v
* @return {?}
*/
v => v.Style === MUST)).map((/**
* @param {?} v
* @return {?}
*/
v => v.Name));
}
else {
return [];
}
}
/**
* @return {?}
*/
primaryKeyFields() {
if (this.fields) {
return this.fields.filter((/**
* @param {?} v
* @return {?}
*/
v => v.PrimaryKey)).map((/**
* @param {?} v
* @return {?}
*/
v => v.Name));
}
else {
return [];
}
}
/**
* @return {?}
*/
fileType() {
if (this.file) {
/** @type {?} */
const list = this.file.name.split('.');
if (list.length > 1) {
return '.' + list[1];
}
}
return '';
}
// 上传文件使用了返回的路由,所以需要自己调用原生的http请求
/**
* @return {?}
*/
upload() {
/** @type {?} */
let sentBegin;
this.api.upload(this.file, 'content', 'upload-import-file').subscribe((/**
* @param {?} event
* @return {?}
*/
event => {
switch (event.type) {
case HttpEventType.Sent:
// 小于500毫秒的上传,不显示中间的上传进度界面,防止界面闪烁
sentBegin = setTimeout((/**
* @return {?}
*/
() => {
this.step = 'upload';
sentBegin = null;
}), 500);
break;
case HttpEventType.UploadProgress:
this.uploadProgress = Math.round(event.loaded / event.total * 100);
break;
case HttpEventType.Response:
if (sentBegin) {
clearTimeout(sentBegin);
sentBegin = null;
}
this.step = 'setting';
this.serverTempFileName = event.body;
this.previewData.Error = '';
this.previewData.Have = false;
break;
default:
console.log(event);
break;
}
}));
}
/**
* @return {?}
*/
refreshPreview() {
this.api
.post('refresh-preview', (/** @type {?} */ ({
FileName: this.serverTempFileName,
Format: this.format,
Encoding: this.encoding,
FirstHead: this.firstHead
})))
.subscribe((/**
* @param {?} rev
* @return {?}
*/
rev => {
this.previewData.Have = true;
this.previewData.Title = rev.Title;
this.previewData.Rows = rev.Rows;
this.previewData.Error = rev.Error;
this.mapFields.forEach((/**
* @param {?} v
* @param {?} index
* @return {?}
*/
(v, index) => {
if (this.firstHead) {
v.MapName = this.previewData.Title.find((/**
* @param {?} str
* @return {?}
*/
str => str.toLowerCase() === v.Name.toLowerCase()));
if (!v.MapName) {
// 根据别名再找一遍
/** @type {?} */
const alias = this.fields.find((/**
* @param {?} afield
* @return {?}
*/
afield => afield.Name === v.Name)).Alias;
v.MapName = this.previewData.Title.find((/**
* @param {?} str
* @return {?}
*/
str => str.toLowerCase() === alias.toLowerCase()));
}
}
else {
v.MapName = this.previewData.Title[index];
}
if (v.MapName === undefined) {
v.MapName = '(SKIP)';
}
}));
console.log('------', this.previewData.Have || this.previewData.Error);
}));
}
/**
* @return {?}
*/
doImport() {
this.api
.post('do-import', (/** @type {?} */ ({
FileName: this.serverTempFileName,
FirstHead: this.firstHead,
Encoding: this.encoding,
Format: this.format,
Fields: this.mapFields.map((/**
* @param {?} v
* @return {?}
*/
v => ({
Name: v.Name,
MapName: v.MapName,
Value: v.Value
}))),
NullIden: this.nullIden
})))
.subscribe((/**
* @param {?} v
* @return {?}
*/
v => {
this.step = 'done';
this.taskInfoURL = this.prj.frontURL('task', v.TaskInfoURL);
this.eles.addElement(v.BrowseTaskElement);
this.eles.setURLSign(v.TaskInfoURL, v.TaskInfoSign);
}));
}
/**
* @return {?}
*/
removeTableData() {
this.api.post('remove-table-data').subscribe((/**
* @param {?} v
* @return {?}
*/
v => {
this.tableTotal = v.Total;
this.tableCanRemove = v.CanRemove;
this.snackBar.open('成功删除数据', '关闭', { duration: 5000 });
}));
}
}
ImportService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
ImportService.ctorParameters = () => [
{ type: CurrentApiService },
{ type: ProjectService },
{ type: ElementsService },
{ type: MatSnackBar }
];
if (false) {
/** @type {?} */
ImportService.prototype.step;
/** @type {?} */
ImportService.prototype.tableName;
/** @type {?} */
ImportService.prototype.tableTotal;
/** @type {?} */
ImportService.prototype.tableCanRemove;
/** @type {?} */
ImportService.prototype.fields;
/** @type {?} */
ImportService.prototype.file;
/** @type {?} */
ImportService.prototype.uploadProgress;
/** @type {?} */
ImportService.prototype.serverTempFileName;
/** @type {?} */
ImportService.prototype.firstHead;
/** @type {?} */
ImportService.prototype.format;
/** @type {?} */
ImportService.prototype.encoding;
/** @type {?} */
ImportService.prototype.nullIden;
/** @type {?} */
ImportService.prototype.previewData;
/** @type {?} */
ImportService.prototype.mapFields;
/** @type {?} */
ImportService.prototype.taskInfoURL;
/**
* @type {?}
* @private
*/
ImportService.prototype.api;
/**
* @type {?}
* @private
*/
ImportService.prototype.prj;
/**
* @type {?}
* @private
*/
ImportService.prototype.eles;
/**
* @type {?}
* @private
*/
ImportService.prototype.snackBar;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9kYndlYi1jb21tb24vIiwic291cmNlcyI6WyJsaWIvaW1wb3J0L2ltcG9ydC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBWSxNQUFNLFlBQVksQ0FBQztBQUMxRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7O01BQzFDLElBQUksR0FBRyxNQUFNOzs7O0FBRW5CLDBCQVFDOzs7SUFQQSwyQkFBYTs7SUFDYiw0QkFBYzs7SUFDZCwyQkFBYTs7SUFDYixnQ0FBa0I7O0lBQ2xCLDRCQUFjOztJQUNkLGlDQUFvQjs7SUFDcEIsNkJBQWU7Ozs7O0FBRWhCLHVCQU1DOzs7SUFMQSx3QkFBYTs7SUFDYix5QkFBYzs7SUFDZCwyQkFBZ0I7O0lBQ2hCLHlCQUFjOztJQUNkLDBCQUFlOzs7OztBQUVoQixrQ0FLQzs7O0lBSkEsdUNBQWlCOztJQUNqQixxQ0FBZTs7SUFDZix1Q0FBaUI7O0lBQ2pCLHdDQUFtQjs7Ozs7QUFFcEIsbUNBSUM7OztJQUhBLHFDQUFnQjs7SUFDaEIsb0NBQWlCOztJQUNqQixxQ0FBYzs7Ozs7QUFFZiw0QkFVQzs7O0lBVEEsaUNBQWlCOztJQUNqQixrQ0FBbUI7O0lBQ25CLGlDQUFpQjs7SUFDakIsK0JBQWU7O0lBQ2YsK0JBSUk7Ozs7O0FBRUwsb0NBSUM7OztJQUhBLHFDQUFvQjs7SUFDcEIsc0NBQXFCOztJQUNyQiwyQ0FBNEI7Ozs7O0FBRTdCLGdDQU1DOzs7SUFMQSwrQkFBa0I7O0lBQ2xCLGdDQUFtQjs7SUFDbkIsb0NBQXVCOztJQUN2Qiw0QkFBc0I7O0lBQ3RCLDhCQUFpQjs7Ozs7QUFFbEIs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Q0FBc0I7O0lBRXRCLG9DQUFvQjs7Ozs7SUFHbkIsNEJBQThCOzs7OztJQUM5Qiw0QkFBMkI7Ozs7O0lBQzNCLDZCQUE2Qjs7Ozs7SUFDN0IsaUNBQTZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEV2ZW50VHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDdXJyZW50QXBpU2VydmljZSwgUHJvamVjdFNlcnZpY2UsIEVsZW1lbnRzU2VydmljZSwgSUVsZW1lbnQgfSBmcm9tICdkYndlYi1jb3JlJztcclxuaW1wb3J0IHsgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XHJcbmNvbnN0IE1VU1QgPSAnTVVTVCc7XHJcblxyXG5pbnRlcmZhY2UgSW1wb3J0RmllbGQge1xyXG5cdE5hbWU6IHN0cmluZztcclxuXHRBbGlhczogc3RyaW5nO1xyXG5cdFR5cGU6IHN0cmluZztcclxuXHRNYXhMZW5ndGg6IG51bWJlcjtcclxuXHRTdHlsZTogc3RyaW5nO1xyXG5cdFByaW1hcnlLZXk6IGJvb2xlYW47XHJcblx0UmVtYXJrOiBzdHJpbmc7XHJcbn1cclxuaW50ZXJmYWNlIE1hcEZpZWxkIHtcclxuXHROYW1lOiBzdHJpbmc7XHJcblx0U3R5bGU6IHN0cmluZztcclxuXHRNYXBOYW1lOiBzdHJpbmc7XHJcblx0VmFsdWU6IHN0cmluZztcclxuXHRSZW1hcms6IHN0cmluZztcclxufVxyXG5pbnRlcmZhY2UgUmVmcmVzaFByZXZpZXdQYXJhbSB7XHJcblx0RmlsZU5hbWU6IHN0cmluZztcclxuXHRGb3JtYXQ6IHN0cmluZztcclxuXHRFbmNvZGluZzogc3RyaW5nO1xyXG5cdEZpcnN0SGVhZDogYm9vbGVhbjtcclxufVxyXG5pbnRlcmZhY2UgUmVmcmVzaFByZXZpZXdSZXN1bHQge1xyXG5cdFRpdGxlOiBzdHJpbmdbXTtcclxuXHRSb3dzOiBzdHJpbmdbXVtdO1xyXG5cdEVycm9yOiBzdHJpbmc7XHJcbn1cclxuaW50ZXJmYWNlIERvSW1wb3J0UGFyYW0ge1xyXG5cdEZpbGVOYW1lOiBzdHJpbmc7XHJcblx0Rmlyc3RIZWFkOiBib29sZWFuO1xyXG5cdEVuY29kaW5nOiBzdHJpbmc7XHJcblx0Rm9ybWF0OiBzdHJpbmc7XHJcblx0RmllbGRzOiB7XHJcblx0XHROYW1lOiBzdHJpbmc7XHJcblx0XHRNYXBOYW1lOiBzdHJpbmc7XHJcblx0XHRWYWx1ZTogc3RyaW5nO1xyXG5cdH1bXTtcclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIERvSW1wb3J0UmVzdWx0IHtcclxuXHRUYXNrSW5mb1VSTDogc3RyaW5nO1xyXG5cdFRhc2tJbmZvU2lnbjogc3RyaW5nO1xyXG5cdEJyb3dzZVRhc2tFbGVtZW50OiBJRWxlbWVudDtcclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIEltcG9ydEluZm8ge1xyXG5cdFRhYmxlTmFtZTogc3RyaW5nO1xyXG5cdFRhYmxlVG90YWw6IG51bWJlcjtcclxuXHRUYWJsZUNhblJlbW92ZTogbnVtYmVyO1xyXG5cdEZpZWxkczogSW1wb3J0RmllbGRbXTtcclxuXHROdWxsSWRlbjogc3RyaW5nO1xyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3ZlVGFibGVEYXRhUmVzdWx0IHtcclxuXHRUb3RhbDogbnVtYmVyO1xyXG5cdENhblJlbW92ZTogbnVtYmVyO1xyXG59XHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEltcG9ydFNlcnZpY2Uge1xyXG5cdHN0ZXA6ICdzZWxlY3QtZmlsZScgfCAndXBsb2FkJyB8ICdzZXR0aW5nJyB8ICdkb25lJyA9ICdzZWxlY3QtZmlsZSc7XHJcblx0dGFibGVOYW1lOiBzdHJpbmc7XHJcblx0dGFibGVUb3RhbDogbnVtYmVyO1xyXG5cdHRhYmxlQ2FuUmVtb3ZlOiBudW1iZXI7XHJcblx0ZmllbGRzOiBJbXBvcnRGaWVsZFtdO1xyXG5cdGZpbGU6IEZpbGU7XHJcblx0dXBsb2FkUHJvZ3Jlc3M6IG51bWJlcjtcclxuXHRzZXJ2ZXJUZW1wRmlsZU5hbWU6IHN0cmluZzsgLy8g5pyN5Yqh56uv5ZSv5LiA55qE5Li05pe25paH5Lu25ZCNXHJcblxyXG5cdGZpcnN0SGVhZCA9IHRydWU7IC8vIOaYr+WQpuaYr+mmluihjOeahOagh+ivhlxyXG5cdGZvcm1hdDogJ0NTVicgfCAnVFhUJyA9ICdDU1YnO1xyXG5cdGVuY29kaW5nOiAnVVRGOCcgfCAnR0JLJyA9ICdVVEY4JztcclxuXHRudWxsSWRlbjogc3RyaW5nO1xyXG5cdHByZXZpZXdEYXRhOiB7XHJcblx0XHRIYXZlOiBib29sZWFuO1xyXG5cdFx0VGl0bGU6IHN0cmluZ1tdO1xyXG5cdFx0Um93czogc3RyaW5nW11bXTtcclxuXHRcdEVycm9yOiBzdHJpbmc7XHJcblx0fSA9IHsgSGF2ZTogZmFsc2UsIFRpdGxlOiBudWxsLCBSb3dzOiBudWxsLCBFcnJvcjogJycgfTtcclxuXHRtYXBGaWVsZHM6IE1hcEZpZWxkW107XHJcblxyXG5cdHRhc2tJbmZvVVJMOiBzdHJpbmc7XHJcblxyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHJpdmF0ZSBhcGk6IEN1cnJlbnRBcGlTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBwcmo6IFByb2plY3RTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBlbGVzOiBFbGVtZW50c1NlcnZpY2UsXHJcblx0XHRwcml2YXRlIHNuYWNrQmFyOiBNYXRTbmFja0JhclxyXG5cdCkge31cclxuXHRpbml0KCkge1xyXG5cdFx0dGhpcy5HZXRJbXBvcnRJbmZvKCkuc3Vic2NyaWJlKHYgPT4ge1xyXG5cdFx0XHR0aGlzLnRhYmxlTmFtZSA9IHYuVGFibGVOYW1lO1xyXG5cdFx0XHR0aGlzLnRhYmxlVG90YWwgPSB2LlRhYmxlVG90YWw7XHJcblx0XHRcdHRoaXMudGFibGVDYW5SZW1vdmUgPSB2LlRhYmxlQ2FuUmVtb3ZlO1xyXG5cdFx0XHR0aGlzLmZpZWxkcyA9IHYuRmllbGRzO1xyXG5cdFx0XHR0aGlzLm51bGxJZGVuID0gdi5OdWxsSWRlbjtcclxuXHRcdFx0dGhpcy5tYXBGaWVsZHMgPSB2LkZpZWxkcy5tYXAoZmxkID0+ICh7XHJcblx0XHRcdFx0TmFtZTogZmxkLk5hbWUsXHJcblx0XHRcdFx0U3R5bGU6IGZsZC5TdHlsZSxcclxuXHRcdFx0XHRNYXBOYW1lOiAnJyxcclxuXHRcdFx0XHRWYWx1ZTogJycsXHJcblx0XHRcdFx0UmVtYXJrOiBmbGQuUmVtYXJrXHJcblx0XHRcdH0pKTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHRHZXRJbXBvcnRJbmZvKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuYXBpLmdldDxJbXBvcnRJbmZvPignZ2V0LWltcG9ydC1pbmZvJyk7XHJcblx0fVxyXG5cdG11c3RGaWVsZHMoKSB7XHJcblx0XHRpZiAodGhpcy5maWVsZHMpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuZmllbGRzLmZpbHRlcih2ID0+IHYuU3R5bGUgPT09IE1VU1QpLm1hcCh2ID0+IHYuTmFtZSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRyZXR1cm4gW107XHJcblx0XHR9XHJcblx0fVxyXG5cdHByaW1hcnlLZXlGaWVsZHMoKSB7XHJcblx0XHRpZiAodGhpcy5maWVsZHMpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuZmllbGRzLmZpbHRlcih2ID0+IHYuUHJpbWFyeUtleSkubWFwKHYgPT4gdi5OYW1lKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHJldHVybiBbXTtcclxuXHRcdH1cclxuXHR9XHJcblx0ZmlsZVR5cGUoKSB7XHJcblx0XHRpZiAodGhpcy5maWxlKSB7XHJcblx0XHRcdGNvbnN0IGxpc3QgPSB0aGlzLmZpbGUubmFtZS5zcGxpdCgnLicpO1xyXG5cdFx0XHRpZiAobGlzdC5sZW5ndGggPiAxKSB7XHJcblx0XHRcdFx0cmV0dXJuICcuJyArIGxpc3RbMV07XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiAnJztcclxuXHR9XHJcblx0Ly8g5LiK5Lyg5paH5Lu25L2/55So5LqG6L+U5Zue55qE6Lev55Sx77yM5omA5Lul6ZyA6KaB6Ieq5bex6LCD55So5Y6f55Sf55qEaHR0cOivt+axglxyXG5cdHVwbG9hZCgpIHtcclxuXHRcdGxldCBzZW50QmVnaW46IE5vZGVKUy5UaW1lb3V0O1xyXG5cdFx0dGhpcy5hcGkudXBsb2FkPHN0cmluZz4odGhpcy5maWxlLCAnY29udGVudCcsICd1cGxvYWQtaW1wb3J0LWZpbGUnKS5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG5cdFx0XHRzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcclxuXHRcdFx0XHRjYXNlIEh0dHBFdmVudFR5cGUuU2VudDpcclxuXHRcdFx0XHRcdC8vIOWwj+S6jjUwMOavq+enkueahOS4iuS8oO+8jOS4jeaYvuekuuS4remXtOeahOS4iuS8oOi/m+W6pueVjOmdou+8jOmYsuatoueVjOmdoumXqueDgVxyXG5cdFx0XHRcdFx0c2VudEJlZ2luID0gc2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdFx0XHRcdHRoaXMuc3RlcCA9ICd1cGxvYWQnO1xyXG5cdFx0XHRcdFx0XHRzZW50QmVnaW4gPSBudWxsO1xyXG5cdFx0XHRcdFx0fSwgNTAwKTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgSHR0cEV2ZW50VHlwZS5VcGxvYWRQcm9ncmVzczpcclxuXHRcdFx0XHRcdHRoaXMudXBsb2FkUHJvZ3Jlc3MgPSBNYXRoLnJvdW5kKGV2ZW50LmxvYWRlZCAvIGV2ZW50LnRvdGFsICogMTAwKTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGNhc2UgSHR0cEV2ZW50VHlwZS5SZXNwb25zZTpcclxuXHRcdFx0XHRcdGlmIChzZW50QmVnaW4pIHtcclxuXHRcdFx0XHRcdFx0Y2xlYXJUaW1lb3V0KHNlbnRCZWdpbik7XHJcblx0XHRcdFx0XHRcdHNlbnRCZWdpbiA9IG51bGw7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR0aGlzLnN0ZXAgPSAnc2V0dGluZyc7XHJcblx0XHRcdFx0XHR0aGlzLnNlcnZlclRlbXBGaWxlTmFtZSA9IGV2ZW50LmJvZHk7XHJcblx0XHRcdFx0XHR0aGlzLnByZXZpZXdEYXRhLkVycm9yID0gJyc7XHJcblx0XHRcdFx0XHR0aGlzLnByZXZpZXdEYXRhLkhhdmUgPSBmYWxzZTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHRjb25zb2xlLmxvZyhldmVudCk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cdHJlZnJlc2hQcmV2aWV3KCkge1xyXG5cdFx0dGhpcy5hcGlcclxuXHRcdFx0LnBvc3Q8UmVmcmVzaFByZXZpZXdSZXN1bHQ+KCdyZWZyZXNoLXByZXZpZXcnLCB7XHJcblx0XHRcdFx0RmlsZU5hbWU6IHRoaXMuc2VydmVyVGVtcEZpbGVOYW1lLFxyXG5cdFx0XHRcdEZvcm1hdDogdGhpcy5mb3JtYXQsXHJcblx0XHRcdFx0RW5jb2Rpbmc6IHRoaXMuZW5jb2RpbmcsXHJcblx0XHRcdFx0Rmlyc3RIZWFkOiB0aGlzLmZpcnN0SGVhZFxyXG5cdFx0XHR9IGFzIFJlZnJlc2hQcmV2aWV3UGFyYW0pXHJcblx0XHRcdC5zdWJzY3JpYmUocmV2ID0+IHtcclxuXHRcdFx0XHR0aGlzLnByZXZpZXdEYXRhLkhhdmUgPSB0cnVlO1xyXG5cdFx0XHRcdHRoaXMucHJldmlld0RhdGEuVGl0bGUgPSByZXYuVGl0bGU7XHJcblx0XHRcdFx0dGhpcy5wcmV2aWV3RGF0YS5Sb3dzID0gcmV2LlJvd3M7XHJcblx0XHRcdFx0dGhpcy5wcmV2aWV3RGF0YS5FcnJvciA9IHJldi5FcnJvcjtcclxuXHRcdFx0XHR0aGlzLm1hcEZpZWxkcy5mb3JFYWNoKCh2LCBpbmRleCkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuZmlyc3RIZWFkKSB7XHJcblx0XHRcdFx0XHRcdHYuTWFwTmFtZSA9IHRoaXMucHJldmlld0RhdGEuVGl0bGUuZmluZChzdHIgPT4gc3RyLnRvTG93ZXJDYXNlKCkgPT09IHYuTmFtZS50b0xvd2VyQ2FzZSgpKTtcclxuXHRcdFx0XHRcdFx0aWYgKCF2Lk1hcE5hbWUpIHtcclxuXHRcdFx0XHRcdFx0XHQvLyDmoLnmja7liKvlkI3lho3mib7kuIDpgY1cclxuXHRcdFx0XHRcdFx0XHRjb25zdCBhbGlhcyA9IHRoaXMuZmllbGRzLmZpbmQoYWZpZWxkID0+IGFmaWVsZC5OYW1lID09PSB2Lk5hbWUpLkFsaWFzO1xyXG5cdFx0XHRcdFx0XHRcdHYuTWFwTmFtZSA9IHRoaXMucHJldmlld0RhdGEuVGl0bGUuZmluZChzdHIgPT4gc3RyLnRvTG93ZXJDYXNlKCkgPT09IGFsaWFzLnRvTG93ZXJDYXNlKCkpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHR2Lk1hcE5hbWUgPSB0aGlzLnByZXZpZXdEYXRhLlRpdGxlW2luZGV4XTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmICh2Lk1hcE5hbWUgPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHR2Lk1hcE5hbWUgPSAnKFNLSVApJztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0XHRjb25zb2xlLmxvZygnLS0tLS0tJywgdGhpcy5wcmV2aWV3RGF0YS5IYXZlIHx8IHRoaXMucHJldmlld0RhdGEuRXJyb3IpO1xyXG5cdFx0XHR9KTtcclxuXHR9XHJcblx0ZG9JbXBvcnQoKSB7XHJcblx0XHR0aGlzLmFwaVxyXG5cdFx0XHQucG9zdDxEb0ltcG9ydFJlc3VsdD4oJ2RvLWltcG9ydCcsIHtcclxuXHRcdFx0XHRGaWxlTmFtZTogdGhpcy5zZXJ2ZXJUZW1wRmlsZU5hbWUsXHJcblx0XHRcdFx0Rmlyc3RIZWFkOiB0aGlzLmZpcnN0SGVhZCxcclxuXHRcdFx0XHRFbmNvZGluZzogdGhpcy5lbmNvZGluZyxcclxuXHRcdFx0XHRGb3JtYXQ6IHRoaXMuZm9ybWF0LFxyXG5cdFx0XHRcdEZpZWxkczogdGhpcy5tYXBGaWVsZHMubWFwKHYgPT4gKHtcclxuXHRcdFx0XHRcdE5hbWU6IHYuTmFtZSxcclxuXHRcdFx0XHRcdE1hcE5hbWU6IHYuTWFwTmFtZSxcclxuXHRcdFx0XHRcdFZhbHVlOiB2LlZhbHVlXHJcblx0XHRcdFx0fSkpLFxyXG5cdFx0XHRcdE51bGxJZGVuOiB0aGlzLm51bGxJZGVuXHJcblx0XHRcdH0gYXMgRG9JbXBvcnRQYXJhbSlcclxuXHRcdFx0LnN1YnNjcmliZSh2ID0+IHtcclxuXHRcdFx0XHR0aGlzLnN0ZXAgPSAnZG9uZSc7XHJcblx0XHRcdFx0dGhpcy50YXNrSW5mb1VSTCA9IHRoaXMucHJqLmZyb250VVJMKCd0YXNrJywgdi5UYXNrSW5mb1VSTCk7XHJcblx0XHRcdFx0dGhpcy5lbGVzLmFkZEVsZW1lbnQodi5Ccm93c2VUYXNrRWxlbWVudCk7XHJcblx0XHRcdFx0dGhpcy5lbGVzLnNldFVSTFNpZ24odi5UYXNrSW5mb1VSTCwgdi5UYXNrSW5mb1NpZ24pO1xyXG5cdFx0XHR9KTtcclxuXHR9XHJcblx0cmVtb3ZlVGFibGVEYXRhKCkge1xyXG5cdFx0dGhpcy5hcGkucG9zdDxSZW1vdmVUYWJsZURhdGFSZXN1bHQ+KCdyZW1vdmUtdGFibGUtZGF0YScpLnN1YnNjcmliZSh2ID0+IHtcclxuXHRcdFx0dGhpcy50YWJsZVRvdGFsID0gdi5Ub3RhbDtcclxuXHRcdFx0dGhpcy50YWJsZUNhblJlbW92ZSA9IHYuQ2FuUmVtb3ZlO1xyXG5cdFx0XHR0aGlzLnNuYWNrQmFyLm9wZW4oJ+aIkOWKn+WIoOmZpOaVsOaNricsICflhbPpl60nLCB7IGR1cmF0aW9uOiA1MDAwIH0pO1xyXG5cdFx0fSk7XHJcblx0fVxyXG59XHJcbiJdfQ==