UNPKG

dbweb-common

Version:

用`yarn add dbweb-common`安装,不要忘记修改`angular.json`里的 `architect\build\options\assets`,加上

269 lines 28 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { OverlayContainer } from '@angular/cdk/overlay'; import { HttpClient } from '@angular/common/http'; import { Component, ElementRef, HostBinding, ViewChild } from '@angular/core'; import { MatDialog } from '@angular/material'; import { CurrentApiService, CurrentService, fullApiPath } from 'dbweb-core'; import { MainNavService } from '../services/main-nav.service'; import { ThemeService } from '../services/theme.service'; import { PortraitEditComponent } from './portrait-edit/portrait-edit.component'; import { portraitDefault } from '../const'; export class UserinfoComponent { /** * @param {?} overlayContainer * @param {?} curr * @param {?} httpClient * @param {?} api * @param {?} theme * @param {?} dialog * @param {?} mainNav */ constructor(overlayContainer, curr, httpClient, api, theme, dialog, mainNav) { this.overlayContainer = overlayContainer; this.curr = curr; this.httpClient = httpClient; this.api = api; this.theme = theme; this.dialog = dialog; this.mainNav = mainNav; this.hostClass = true; this.num = 0; this.isEditNickName = false; this.nickName = ''; this.subject = []; this.subject.push(this.mainNav.navMin.subscribe((/** * @param {?} v * @return {?} */ v => { if (v) { this.mainNavStyle = 'min'; } else { this.mainNavStyle = 'full'; } })), this.curr.change$.subscribe((/** * @param {?} v * @return {?} */ v => { if (v && v.HeadPortrait) { this.portraitURL = v.portraitURL; } else { this.portraitURL = portraitDefault; } }))); } /** * @return {?} */ ngOnDestroy() { this.subject.forEach((/** * @param {?} v * @return {?} */ v => v.unsubscribe())); } /** * @return {?} */ ngOnInit() { this.subject.push(this.theme.theme.subscribe((/** * @param {?} v * @return {?} */ v => { this.themeColor = v.color; this.themeModel = v.model; })), this.api.get('get-user-portrait-url').subscribe((/** * @param {?} u * @return {?} */ u => { this.uploadURL = fullApiPath(u); }))); } /** * @return {?} */ setTheme() { this.theme.setTheme(this.themeColor + '-' + this.themeModel + '-theme'); } /** * @param {?} fileToUpload * @return {?} */ postFile(fileToUpload) { /** @type {?} */ const formData = new FormData(); formData.append('portrait', fileToUpload, fileToUpload.name); return this.httpClient.post(this.uploadURL, formData, { withCredentials: true }).subscribe((/** * @return {?} */ () => { this.curr.setPortrait(true); this.num++; }), (/** * @param {?} error * @return {?} */ (error) => { console.log(error); })); } /** * @return {?} */ editNickName() { this.nickName = this.curr.data.NickName; this.isEditNickName = true; } /** * @return {?} */ editDone() { this.api.post('change-user-nickname', this.nickName).subscribe((/** * @return {?} */ () => { this.curr.setNickName(this.nickName); this.isEditNickName = false; })); } /** * @return {?} */ showPortraitEdit() { /** @type {?} */ const dialogRef = this.dialog.open(PortraitEditComponent, { width: '480px', data: (/** @type {?} */ ({ img: this.portraitImage.nativeElement, default: this.portraitURL === portraitDefault })) }); dialogRef.afterClosed().subscribe((/** * @param {?} result * @return {?} */ (result) => { if (result && result.ok) { if (result.data) { this.postFile(dataURLtoFile(result.data, 'portrait.jpg')); } else { this.api.post('clear-user-portrait').subscribe((/** * @return {?} */ () => { this.curr.setPortrait(false); })); } } })); } /** * @param {?} event * @return {?} */ navStyleChange(event) { this.mainNav.setNavMin(event.value === 'min'); } } UserinfoComponent.decorators = [ { type: Component, args: [{ selector: 'common-userinfo', template: "<div class=\"main\">\r\n\t<div class=\"top\">\r\n\t\t<div class=\"head-portrait mat-elevation-z2\">\r\n\t\t\t<div class=\"picture\">\r\n\t\t\t\t<img class=\"\u5934\u50CF\u56FE\u7247\" #portraitImage [src]=\"portraitURL\" />\r\n\t\t\t\t<div class=\"\u5934\u50CF\u7F16\u8F91\" (click)=\"showPortraitEdit()\">\r\n\t\t\t\t\t<mat-icon svgIcon=\"photo_camera\"></mat-icon>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<div class=\"\u4FEE\u6539\u6635\u79F0\" *ngIf=\"isEditNickName; else nickNameTxt\">\r\n\t\t\t\t<mat-form-field>\r\n\t\t\t\t\t<input class=\" \u8F93\u5165\u6635\u79F0 \u4E00\u7EA7\u6807\u9898\u8272\u503C\" matInput [(ngModel)]=\"nickName\" />\r\n\t\t\t\t</mat-form-field>\r\n\t\t\t\t<mat-icon class=\"close\" svgIcon=\"close\" (click)=\"isEditNickName = false\"></mat-icon>\r\n\t\t\t\t<mat-icon color=\"primary\" svgIcon=\"done\" (click)=\"editDone()\"> </mat-icon>\r\n\t\t\t\t<!-- <button mat-stroked-button class=\" \u53D6\u6D88\" color=\"primary\" mat-button>\r\n\t\t\t\t\t\u53D6\u6D88\r\n\t\t\t\t</button>\r\n\t\t\t\t<button mat-raised-button class=\"\" color=\"primary\">\u786E\u5B9A</button> -->\r\n\t\t\t</div>\r\n\r\n\t\t\t<ng-template #nickNameTxt>\r\n\t\t\t\t<div class=\"\u6635\u79F0\">\r\n\t\t\t\t\t<span class=\" \u4E00\u7EA7\u6807\u9898\u8272\u503C\">{{ curr.data.NickName }}</span>\r\n\t\t\t\t\t<mat-icon class=\"\u7F16\u8F91\" (click)=\"editNickName()\" svgIcon=\"edit\"></mat-icon>\r\n\t\t\t\t</div>\r\n\t\t\t</ng-template>\r\n\t\t</div>\r\n\t\t<div class=\"theme mat-elevation-z2\">\r\n\t\t\t<p class=\"title \u4E00\u7EA7\u6807\u9898\u8272\u503C\">\u4E3B\u9898\u989C\u8272</p>\r\n\t\t\t<div class=\"colors\">\r\n\t\t\t\t<div class=\"theme-button\">\r\n\t\t\t\t\t<div class=\"cicle deep-purple\" (click)=\"themeColor = 'deep-purple'; setTheme()\">\r\n\t\t\t\t\t\t<mat-icon svgIcon=\"done\" *ngIf=\"themeColor == 'deep-purple'\"></mat-icon>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"text\">\u6D6A\u6F2B\u7D2B</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class=\"theme-button\">\r\n\t\t\t\t\t<div class=\"cicle blue\" (click)=\"themeColor = 'blue'; setTheme()\">\r\n\t\t\t\t\t\t<mat-icon svgIcon=\"done\" *ngIf=\"themeColor == 'blue'\"> </mat-icon>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"text\">\u9ED8\u8BA4</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class=\"theme-button\">\r\n\t\t\t\t\t<div class=\"cicle pink\" (click)=\"themeColor = 'pink'; setTheme()\">\r\n\t\t\t\t\t\t<mat-icon svgIcon=\"done\" *ngIf=\"themeColor == 'pink'\"> </mat-icon>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"text\">\u6E29\u60C5\u7C89</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class=\"theme-button\">\r\n\t\t\t\t\t<div class=\"cicle orange\" (click)=\"themeColor = 'orange'; setTheme()\">\r\n\t\t\t\t\t\t<mat-icon svgIcon=\"done\" *ngIf=\"themeColor == 'orange'\"> </mat-icon>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"text\">\u6D3B\u529B\u6A59</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class=\"theme-button\">\r\n\t\t\t\t\t<div class=\"cicle green\" (click)=\"themeColor = 'green'; setTheme()\">\r\n\t\t\t\t\t\t<mat-icon svgIcon=\"done\" *ngIf=\"themeColor == 'green'\"> </mat-icon>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"text\">\u6E05\u65B0\u7EFF</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<div class=\"title \u4E00\u7EA7\u6807\u9898\u8272\u503C\">\u6A21\u5F0F</div>\r\n\t\t\t<div class=\"select-model\">\r\n\t\t\t\t<div\r\n\t\t\t\t\tclass=\"color-model\"\r\n\t\t\t\t\t[ngClass]=\"{ selected: themeModel === 'light' }\"\r\n\t\t\t\t\t(click)=\"themeModel = 'light'; setTheme()\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<mat-icon svgIcon=\"brightness_7\"></mat-icon>\r\n\t\t\t\t\t<span>\u6D45\u8272\u6A21\u5F0F</span>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div\r\n\t\t\t\t\tclass=\"color-model\"\r\n\t\t\t\t\t[ngClass]=\"{ selected: themeModel === 'dark' }\"\r\n\t\t\t\t\t(click)=\"themeModel = 'dark'; setTheme()\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<mat-icon svgIcon=\"brightness_2\"></mat-icon>\r\n\t\t\t\t\t<span>\u6DF1\u8272\u6A21\u5F0F</span>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"setting mat-elevation-z2\">\r\n\t\t<div class=\"\u504F\u597D\u8BBE\u7F6E \u4E00\u7EA7\u6807\u9898\u8272\u503C\">\u504F\u597D\u8BBE\u7F6E</div>\r\n\t\t<div class=\"one-setting\">\r\n\t\t\t<div class=\"default\">\u9ED8\u8BA4\u5BFC\u822A\u6837\u5F0F</div>\r\n\t\t\t<div class=\"default-radio\">\r\n\t\t\t\t<mat-radio-group aria-label=\"Select an option\" [value]=\"mainNavStyle\" (change)=\"navStyleChange($event)\">\r\n\t\t\t\t\t<mat-radio-button [class.selected]=\"mainNavStyle == 'full'\" value=\"full\">\u5B8C\u6574\u6A21\u5F0F</mat-radio-button>\r\n\t\t\t\t\t<mat-radio-button [class.selected]=\"mainNavStyle == 'min'\" value=\"min\">\u7B80\u6D01\u6A21\u5F0F</mat-radio-button>\r\n\t\t\t\t</mat-radio-group>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.main{display:flex;flex-direction:column;height:100%;max-width:960px;margin:0 auto;width:100%}.main .top{margin-top:24px;display:flex}.main .top .head-portrait{display:flex;flex-direction:column;align-items:center;position:relative;width:256px;height:256px;border-radius:2px}.main .top .head-portrait .picture{width:112px;height:112px;margin:32px 0 16px;border-radius:128px;overflow:hidden;position:relative}.main .top .head-portrait .picture .\u5934\u50CF\u56FE\u7247{width:100%;height:100%}.main .top .head-portrait .picture .\u5934\u50CF\u7F16\u8F91{width:100%;height:100%;position:absolute;left:0;top:0;background-color:rgba(0,0,0,.4);display:none;cursor:pointer}.main .top .head-portrait .picture .\u5934\u50CF\u7F16\u8F91 .mat-icon{color:#fff;margin:44px}.main .top .head-portrait .picture:hover .\u5934\u50CF\u7F16\u8F91{display:block}.main .top .head-portrait .\u7F16\u8F91{cursor:pointer;display:inline-block;vertical-align:top;margin-left:4px;opacity:0}.main .top .head-portrait .\u6635\u79F0{width:232px;font-size:20px;height:24px;line-height:24px;font-weight:700;text-align:center;-webkit-transform:translateX(12px);transform:translateX(12px)}.main .top .head-portrait .\u6635\u79F0 span{display:inline-block;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.main .top .head-portrait .\u6635\u79F0:hover .\u7F16\u8F91{opacity:1}.main .top .head-portrait .\u4FEE\u6539\u6635\u79F0{padding:0 8px;box-sizing:border-box;display:flex;align-items:center}.main .top .head-portrait .\u4FEE\u6539\u6635\u79F0 .mat-icon{cursor:pointer;line-height:24px}.main .top .head-portrait .\u4FEE\u6539\u6635\u79F0 .\u8F93\u5165\u6635\u79F0{font-weight:700;font-size:14px}.main .top .head-portrait .\u4FEE\u6539\u6635\u79F0 .close{margin:0 8px 0 12px}.main .top .head-portrait .mat-form-field{width:172px}.main .top .head-portrait .mat-form-field ::ng-deep .mat-form-field-infix{border:0;height:16px}.main .top .theme{flex-grow:1;margin-left:24px;display:flex;flex-direction:column;border-radius:4px}.main .top .theme .title{font-size:20px;font-weight:700;margin:16px 0 16px 24px}.main .top .theme .colors{display:flex;margin:4px 0}.main .top .theme .colors .theme-button{margin:0 5px 0 40px}.main .top .theme .colors .cicle{width:40px;height:40px;cursor:pointer;border-radius:20px;display:flex;justify-content:center;align-items:center;color:#fff}.main .top .theme .colors .text{text-align:center;margin:16px 0 0;font-size:14px}.main .top .theme .select-model{display:flex}.main .top .theme .select-model .color-model{cursor:pointer;display:flex;margin-left:32px}.main .top .theme .select-model .color-model span{font-size:14px;margin-left:8px}.main .setting{border-radius:4px;flex-grow:1;flex-flow:1;margin:24px 0 64px}.main .setting .\u504F\u597D\u8BBE\u7F6E{font-size:20px;font-weight:700;margin:16px}.main .setting .one-setting{display:flex}.main .setting .one-setting .default{margin-left:32px;font-size:16px}.main .setting .one-setting .default-radio{margin-left:256px;font-size:14px}.main .setting .one-setting .default-radio .mat-radio-button{margin-left:8px}"] }] } ]; /** @nocollapse */ UserinfoComponent.ctorParameters = () => [ { type: OverlayContainer }, { type: CurrentService }, { type: HttpClient }, { type: CurrentApiService }, { type: ThemeService }, { type: MatDialog }, { type: MainNavService } ]; UserinfoComponent.propDecorators = { hostClass: [{ type: HostBinding, args: ['class.user-info',] }], portraitImage: [{ type: ViewChild, args: ['portraitImage', { static: false },] }] }; if (false) { /** @type {?} */ UserinfoComponent.prototype.hostClass; /** @type {?} */ UserinfoComponent.prototype.portraitImage; /** @type {?} */ UserinfoComponent.prototype.uploadURL; /** @type {?} */ UserinfoComponent.prototype.num; /** @type {?} */ UserinfoComponent.prototype.isEditNickName; /** @type {?} */ UserinfoComponent.prototype.nickName; /** @type {?} */ UserinfoComponent.prototype.themeColor; /** @type {?} */ UserinfoComponent.prototype.themeModel; /** @type {?} */ UserinfoComponent.prototype.mainNavStyle; /** @type {?} */ UserinfoComponent.prototype.portraitURL; /** * @type {?} * @private */ UserinfoComponent.prototype.subject; /** @type {?} */ UserinfoComponent.prototype.overlayContainer; /** @type {?} */ UserinfoComponent.prototype.curr; /** * @type {?} * @private */ UserinfoComponent.prototype.httpClient; /** * @type {?} * @private */ UserinfoComponent.prototype.api; /** * @type {?} * @private */ UserinfoComponent.prototype.theme; /** @type {?} */ UserinfoComponent.prototype.dialog; /** @type {?} */ UserinfoComponent.prototype.mainNav; } /** * @param {?} dataurl * @param {?} filename * @return {?} */ function dataURLtoFile(dataurl, filename) { /** @type {?} */ const arr = dataurl.split(','); /** @type {?} */ const mime = arr[0].match(/:(.*?);/)[1]; /** @type {?} */ const bstr = atob(arr[1]); /** @type {?} */ let n = bstr.length; /** @type {?} */ const u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } return new File([u8arr], filename, { type: mime }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlcmluZm8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZGJ3ZWItY29tbW9uLyIsInNvdXJjZXMiOlsibGliL3VzZXJpbmZvL3VzZXJpbmZvLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFVBQVUsRUFBcUIsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQXFCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRyxPQUFPLEVBQUUsU0FBUyxFQUFrQixNQUFNLG1CQUFtQixDQUFDO0FBQzlELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRTVFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsWUFBWSxFQUEwQixNQUFNLDJCQUEyQixDQUFDO0FBQ2pGLE9BQU8sRUFDTixxQkFBcUIsRUFHckIsTUFBTSx5Q0FBeUMsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBTTNDLE1BQU0sT0FBTyxpQkFBaUI7Ozs7Ozs7Ozs7SUFZN0IsWUFDUSxnQkFBa0MsRUFDbEMsSUFBb0IsRUFDbkIsVUFBc0IsRUFDdEIsR0FBc0IsRUFDdEIsS0FBbUIsRUFDcEIsTUFBaUIsRUFDakIsT0FBdUI7UUFOdkIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxTQUFJLEdBQUosSUFBSSxDQUFnQjtRQUNuQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLFVBQUssR0FBTCxLQUFLLENBQWM7UUFDcEIsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNqQixZQUFPLEdBQVAsT0FB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QUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDOUI7SUFDRCxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDcEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE92ZXJsYXlDb250YWluZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEhvc3RCaW5kaW5nLCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0UmFkaW9DaGFuZ2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XHJcbmltcG9ydCB7IEN1cnJlbnRBcGlTZXJ2aWNlLCBDdXJyZW50U2VydmljZSwgZnVsbEFwaVBhdGggfSBmcm9tICdkYndlYi1jb3JlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1haW5OYXZTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbWFpbi1uYXYuc2VydmljZSc7XHJcbmltcG9ydCB7IFRoZW1lU2VydmljZSwgVGhlbWVNb2RlbCwgVGhlbWVDb2xvciB9IGZyb20gJy4uL3NlcnZpY2VzL3RoZW1lLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG5cdFBvcnRyYWl0RWRpdENvbXBvbmVudCxcclxuXHRQb3J0cmFpdEVkaXRDb21wb25lbnREYXRhLFxyXG5cdFBvcnRyYWl0RWRpdENvbXBvbmVudFJlc3VsdERhdGFcclxufSBmcm9tICcuL3BvcnRyYWl0LWVkaXQvcG9ydHJhaXQtZWRpdC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBwb3J0cmFpdERlZmF1bHQgfSBmcm9tICcuLi9jb25zdCc7XHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiAnY29tbW9uLXVzZXJpbmZvJyxcclxuXHR0ZW1wbGF0ZVVybDogJy4vdXNlcmluZm8uY29tcG9uZW50Lmh0bWwnLFxyXG5cdHN0eWxlVXJsczogWycuL3VzZXJpbmZvLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFVzZXJpbmZvQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG5cdEBIb3N0QmluZGluZygnY2xhc3MudXNlci1pbmZvJykgaG9zdENsYXNzID0gdHJ1ZTtcclxuXHRAVmlld0NoaWxkKCdwb3J0cmFpdEltYWdlJywgeyBzdGF0aWM6IGZhbHNlIH0pIHBvcnRyYWl0SW1hZ2U6IEVsZW1lbnRSZWY8SFRNTEltYWdlRWxlbWVudD47XHJcblx0dXBsb2FkVVJMOiBzdHJpbmc7XHJcblx0bnVtID0gMDtcclxuXHRpc0VkaXROaWNrTmFtZSA9IGZhbHNlO1xyXG5cdG5pY2tOYW1lID0gJyc7XHJcblx0dGhlbWVDb2xvcjogVGhlbWVDb2xvcjtcclxuXHR0aGVtZU1vZGVsOiBUaGVtZU1vZGVsO1xyXG5cdG1haW5OYXZTdHlsZTogJ2Z1bGwnIHwgJ21pbic7XHJcblx0cG9ydHJhaXRVUkw6IHN0cmluZztcclxuXHRwcml2YXRlIHN1YmplY3Q6IFN1YnNjcmlwdGlvbltdID0gW107XHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRwdWJsaWMgb3ZlcmxheUNvbnRhaW5lcjogT3ZlcmxheUNvbnRhaW5lcixcclxuXHRcdHB1YmxpYyBjdXJyOiBDdXJyZW50U2VydmljZSxcclxuXHRcdHByaXZhdGUgaHR0cENsaWVudDogSHR0cENsaWVudCxcclxuXHRcdHByaXZhdGUgYXBpOiBDdXJyZW50QXBpU2VydmljZSxcclxuXHRcdHByaXZhdGUgdGhlbWU6IFRoZW1lU2VydmljZSxcclxuXHRcdHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZyxcclxuXHRcdHB1YmxpYyBtYWluTmF2OiBNYWluTmF2U2VydmljZVxyXG5cdCkge1xyXG5cdFx0dGhpcy5zdWJqZWN0LnB1c2goXHJcblx0XHRcdHRoaXMubWFpbk5hdi5uYXZNaW4uc3Vic2NyaWJlKHYgPT4ge1xyXG5cdFx0XHRcdGlmICh2KSB7XHJcblx0XHRcdFx0XHR0aGlzLm1haW5OYXZTdHlsZSA9ICdtaW4nO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHR0aGlzLm1haW5OYXZTdHlsZSA9ICdmdWxsJztcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pLFxyXG5cdFx0XHR0aGlzLmN1cnIuY2hhbmdlJC5zdWJzY3JpYmUodiA9PiB7XHJcblx0XHRcdFx0aWYgKHYgJiYgdi5IZWFkUG9ydHJhaXQpIHtcclxuXHRcdFx0XHRcdHRoaXMucG9ydHJhaXRVUkwgPSB2LnBvcnRyYWl0VVJMO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHR0aGlzLnBvcnRyYWl0VVJMID0gcG9ydHJhaXREZWZhdWx0O1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSlcclxuXHRcdCk7XHJcblx0fVxyXG5cdG5nT25EZXN0cm95KCkge1xyXG5cdFx0dGhpcy5zdWJqZWN0LmZvckVhY2godiA9PiB2LnVuc3Vic2NyaWJlKCkpO1xyXG5cdH1cclxuXHJcblx0bmdPbkluaXQoKSB7XHJcblx0XHR0aGlzLnN1YmplY3QucHVzaChcclxuXHRcdFx0dGhpcy50aGVtZS50aGVtZS5zdWJzY3JpYmUodiA9PiB7XHJcblx0XHRcdFx0dGhpcy50aGVtZUNvbG9yID0gdi5jb2xvcjtcclxuXHRcdFx0XHR0aGlzLnRoZW1lTW9kZWwgPSB2Lm1vZGVsO1xyXG5cdFx0XHR9KSxcclxuXHRcdFx0dGhpcy5hcGkuZ2V0PHN0cmluZz4oJ2dldC11c2VyLXBvcnRyYWl0LXVybCcpLnN1YnNjcmliZSh1ID0+IHtcclxuXHRcdFx0XHR0aGlzLnVwbG9hZFVSTCA9IGZ1bGxBcGlQYXRoKHUpO1xyXG5cdFx0XHR9KVxyXG5cdFx0KTtcclxuXHR9XHJcblx0c2V0VGhlbWUoKSB7XHJcblx0XHR0aGlzLnRoZW1lLnNldFRoZW1lKHRoaXMudGhlbWVDb2xvciArICctJyArIHRoaXMudGhlbWVNb2RlbCArICctdGhlbWUnKTtcclxuXHR9XHJcblxyXG5cdHBvc3RGaWxlKGZpbGVUb1VwbG9hZDogRmlsZSkge1xyXG5cdFx0Y29uc3QgZm9ybURhdGE6IEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XHJcblx0XHRmb3JtRGF0YS5hcHBlbmQoJ3BvcnRyYWl0JywgZmlsZVRvVXBsb2FkLCBmaWxlVG9VcGxvYWQubmFtZSk7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBvc3QodGhpcy51cGxvYWRVUkwsIGZvcm1EYXRhLCB7IHdpdGhDcmVkZW50aWFsczogdHJ1ZSB9KS5zdWJzY3JpYmUoXHJcblx0XHRcdCgpID0+IHtcclxuXHRcdFx0XHR0aGlzLmN1cnIuc2V0UG9ydHJhaXQodHJ1ZSk7XHJcblx0XHRcdFx0dGhpcy5udW0rKztcclxuXHRcdFx0fSxcclxuXHRcdFx0KGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG5cdFx0XHRcdGNvbnNvbGUubG9nKGVycm9yKTtcclxuXHRcdFx0fVxyXG5cdFx0KTtcclxuXHR9XHJcblx0ZWRpdE5pY2tOYW1lKCkge1xyXG5cdFx0dGhpcy5uaWNrTmFtZSA9IHRoaXMuY3Vyci5kYXRhLk5pY2tOYW1lO1xyXG5cdFx0dGhpcy5pc0VkaXROaWNrTmFtZSA9IHRydWU7XHJcblx0fVxyXG5cdGVkaXREb25lKCkge1xyXG5cdFx0dGhpcy5hcGkucG9zdDxib29sZWFuPignY2hhbmdlLXVzZXItbmlja25hbWUnLCB0aGlzLm5pY2tOYW1lKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG5cdFx0XHR0aGlzLmN1cnIuc2V0Tmlja05hbWUodGhpcy5uaWNrTmFtZSk7XHJcblx0XHRcdHRoaXMuaXNFZGl0Tmlja05hbWUgPSBmYWxzZTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHRzaG93UG9ydHJhaXRFZGl0KCkge1xyXG5cdFx0Y29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihQb3J0cmFpdEVkaXRDb21wb25lbnQsIHtcclxuXHRcdFx0d2lkdGg6ICc0ODBweCcsXHJcblx0XHRcdGRhdGE6IHtcclxuXHRcdFx0XHRpbWc6IHRoaXMucG9ydHJhaXRJbWFnZS5uYXRpdmVFbGVtZW50LFxyXG5cdFx0XHRcdGRlZmF1bHQ6IHRoaXMucG9ydHJhaXRVUkwgPT09IHBvcnRyYWl0RGVmYXVsdFxyXG5cdFx0XHR9IGFzIFBvcnRyYWl0RWRpdENvbXBvbmVudERhdGFcclxuXHRcdH0pO1xyXG5cclxuXHRcdGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0OiBQb3J0cmFpdEVkaXRDb21wb25lbnRSZXN1bHREYXRhKSA9PiB7XHJcblx0XHRcdGlmIChyZXN1bHQgJiYgcmVzdWx0Lm9rKSB7XHJcblx0XHRcdFx0aWYgKHJlc3VsdC5kYXRhKSB7XHJcblx0XHRcdFx0XHR0aGlzLnBvc3RGaWxlKGRhdGFVUkx0b0ZpbGUocmVzdWx0LmRhdGEsICdwb3J0cmFpdC5qcGcnKSk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHRoaXMuYXBpLnBvc3Q8Ym9vbGVhbj4oJ2NsZWFyLXVzZXItcG9ydHJhaXQnKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmN1cnIuc2V0UG9ydHJhaXQoZmFsc2UpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblx0bmF2U3R5bGVDaGFuZ2UoZXZlbnQ6IE1hdFJhZGlvQ2hhbmdlKSB7XHJcblx0XHR0aGlzLm1haW5OYXYuc2V0TmF2TWluKGV2ZW50LnZhbHVlID09PSAnbWluJyk7XHJcblx0fVxyXG59XHJcbmZ1bmN0aW9uIGRhdGFVUkx0b0ZpbGUoZGF0YXVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKTogRmlsZSB7XHJcblx0Y29uc3QgYXJyID0gZGF0YXVybC5zcGxpdCgnLCcpLFxyXG5cdFx0bWltZSA9IGFyclswXS5tYXRjaCgvOiguKj8pOy8pWzFdLFxyXG5cdFx0YnN0ciA9IGF0b2IoYXJyWzFdKTtcclxuXHRsZXQgbiA9IGJzdHIubGVuZ3RoO1xyXG5cdGNvbnN0IHU4YXJyID0gbmV3IFVpbnQ4QXJyYXkobik7XHJcblxyXG5cdHdoaWxlIChuLS0pIHtcclxuXHRcdHU4YXJyW25dID0gYnN0ci5jaGFyQ29kZUF0KG4pO1xyXG5cdH1cclxuXHRyZXR1cm4gbmV3IEZpbGUoW3U4YXJyXSwgZmlsZW5hbWUsIHsgdHlwZTogbWltZSB9KTtcclxufVxyXG4iXX0=