UNPKG

dbweb-common

Version:

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

226 lines 25.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, HostBinding, ViewChild } from '@angular/core'; import { CurrentService } from 'dbweb-core'; import { of } from 'rxjs'; import { debounceTime, startWith } from 'rxjs/operators'; import { BillComponent } from '../bill/bill.component'; import { UserBack, RoleType } from './back'; import pinyin from 'pinyin'; /** * @record */ function ModelUserRole() { } if (false) { /** @type {?} */ ModelUserRole.prototype.UserName; /** @type {?} */ ModelUserRole.prototype.RoleName; } export class UserComponent { /** * @param {?} back * @param {?} curr */ constructor(back, curr) { this.back = back; this.curr = curr; this.hostClass = true; this.roles = {}; this.roleTypeAlways = RoleType.always; this.beforeSave = this.beforeSave.bind(this); } /** * @return {?} */ ngOnInit() { this.back.fetchRoles().subscribe((/** * @param {?} v * @return {?} */ v => { this.validRoles = v; this.roleLists = this.validRoles.map((/** * @param {?} num * @return {?} */ num => num.Name)); this.roleLitters = map2WithLetter(this.roleLists); })); } /** * @param {?} selft * @return {?} */ beforeSave(selft) { return of((/** @type {?} */ ({ record: { Password: selft.typeRecord.Password ? btoa(selft.typeRecord.Password) : null, Roles: Object.keys(this.roles) .filter((/** * @param {?} v * @return {?} */ v => this.roles[v])) .map((/** * @param {?} v * @return {?} */ v => ({ UserName: selft.typeRecord.Name, RoleName: v }))) } }))); } /** * @return {?} */ ngAfterViewInit() { this.bill.init.subscribe((/** * @return {?} */ () => { this.bill.formGroup.get('Password').patchValue(null); ((/** @type {?} */ ((this.bill.typeRecord.Roles || [])))).forEach((/** * @param {?} v * @return {?} */ v => { this.roles[v.RoleName] = true; })); this.bill.formGroup .get('Dept') .valueChanges.pipe(startWith(this.curr.data.Dept.Code), debounceTime(500)) .subscribe((/** * @param {?} val * @return {?} */ val => { this.filterDeptList = this.back.fetchFilterDept(val); console.log('内:', this.filterDeptList); })); })); this.bill.onBeforeSave = this.beforeSave; } /** * @param {?} event * @param {?} roleName * @return {?} */ roleChange(event, roleName) { if (event.checked) { this.roles[roleName] = true; } else { delete this.roles[roleName]; } } /** * @param {?} letter * @return {?} */ acronymFun(letter) { document.querySelector('#' + letter).scrollIntoView(true); } /** * @return {?} */ try() { console.log(this.filterDeptList); } } UserComponent.decorators = [ { type: Component, args: [{ selector: 'common-user', template: "<common-bill #bill>\r\n\r\n\t<div [formGroup]=\"bill.formGroup\" *ngIf=\"bill.formGroup\" class=\"main mat-elevation-z2 dis-row-sb\">\r\n\t\t<section class=\"section-1\">\r\n\t\t\t<header class=\"title\">\u4FEE\u6539\u7528\u6237</header>\r\n\t\t\t<section class=\"s1-content\">\r\n\t\t\t\t<div class=\"box-1\">\r\n\t\t\t\t\t<div class=\"wrapper\">\r\n\t\t\t\t\t\t<div class=\"title\">\u540D\u79F0</div>\r\n\t\t\t\t\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t\t\t\t\t<input matInput formControlName=\"Name\"\r\n\t\t\t\t\t\t\t\tcommonBillField>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"wrapper\">\r\n\t\t\t\t\t\t<div class=\"title\">\u6635\u79F0</div>\r\n\t\t\t\t\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t\t\t\t\t<input matInput formControlName=\"NickName\"\r\n\t\t\t\t\t\t\t\tcommonBillField>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"wrapper\">\r\n\t\t\t\t\t\t<div class=\"title\">\u5BC6\u7801</div>\r\n\t\t\t\t\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t\t\t\t\t<input matInput type=\"password\"\r\n\t\t\t\t\t\t\t\tformControlName=\"Password\" commonBillField>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"wrapper\">\r\n\t\t\t\t\t\t<div class=\"title\">\u6240\u5C5E\u90E8\u95E8</div>\r\n\t\t\t\t\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t\t\t\t\t<input matInput formControlName=\"Dept\"\r\n\t\t\t\t\t\t\t\tcommonBillField [matAutocomplete]=\"autoDept\">\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t<mat-autocomplete #autoDept=\"matAutocomplete\">\r\n\t\t\t\t\t\t\t<mat-option *ngFor=\"let dept of filterDeptList|async\" [value]=\"dept.Code\">{{dept.Code}} - {{dept.Name}}\r\n\t\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t\t</mat-autocomplete>\r\n\t\t\t\t\t</div>\r\n\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class=\"box-2\">\r\n\t\t\t\t\t<div class=\"wrapper freeze-time\">\r\n\t\t\t\t\t\t<div class=\"title\">\u51BB\u7ED3\u65E5\u671F</div>\r\n\t\t\t\t\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t\t\t\t\t<input matInput type=\"datetime-local\" \r\n\t\t\t\t\t\t\t\tformControlName=\"FreezeTime\" commonBillField\r\n\t\t\t\t\t\t\t\tstep=\"1\">\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"wrapper\">\r\n\t\t\t\t\t\t<div class=\"title\">\u51BB\u7ED3\u539F\u56E0</div>\r\n\t\t\t\t\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t\t\t\t\t<input matInput formControlName=\"FreezeDesc\"\r\n\t\t\t\t\t\t\t\tcommonBillField>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"wrapper\">\r\n\t\t\t\t\t\t<div class=\"title\">\u9644\u52A0\u4FE1\u606F</div>\r\n\t\t\t\t\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t\t\t\t\t<textarea matInput matTextareaAutosize matAutosizeMinRows=2 matAutosizeMaxRows=5 formControlName=\"Tag\"\r\n\t\t\t\t\t\t\t\tcommonBillField></textarea>\r\n\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</section>\r\n\t\t</section>\r\n\t\t<section class=\"section-2\">\r\n\t\t\t\r\n\t\t\t<section class=\"s2-content\">\r\n\t\t\t\t<header class=\"title\">\u89D2\u8272</header>\r\n\t\t\t\t<div class=\"s2-box-1\">\r\n\t\t\t\t\t<div class=\"wrapper-box\" *ngFor=\"let letter of roleLitters\">\r\n\t\t\t\t\t\t<div class=\"s2-title\" id=\"{{ letter.Letter }}\">{{letter.Letter | uppercase}}</div>\r\n\t\t\t\t\t\t<div class=\"s2-wrapper\" *ngFor=\"let list of letter.Columns\">\r\n\t\t\t\t\t\t\t<mat-checkbox [checked]=\"roles[list]\" (change)=\"roleChange($event,list)\"></mat-checkbox>\r\n\t\t\t\t\t\t\t<span>{{list}}</span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t\r\n\t\t\t\t</div>\r\n\t\t\t\r\n\t\t\t</section>\r\n\t\t\t<section class=\"s2-content-2\">\r\n\t\t\t\t<div class=\"s2-title\" *ngFor=\"let letter of roleLitters\">\r\n\t\t\t\t\t<span (click)=\"acronymFun(letter.Letter)\">{{letter.Letter | uppercase}}</span>\r\n\t\t\t\t</div>\r\n\t\t\t</section>\r\n\t\t</section>\r\n\t</div>\r\n<button (click)=\"try()\">111</button>\r\n</common-bill>\r\n\r\n\r\n<!-- 0: {Name: \"Name\", DBName: \"NAME\", Type: \"STR\", MaxLength: 50, Hidden: true, \u2026}\r\n1: {Name: \"NickName\", DBName: \"NICKNAME\", Type: \"STR\", MaxLength: 50, Null: true, \u2026}\r\n2: {Name: \"Salt\", DBName: \"SALT\", Type: \"BYTEA\", Value: \"pMA8mf37dmKZ8QKiZ/1FiA==\"}\r\n3: {Name: \"Password\", DBName: \"PASSWORD\", Type: \"BYTEA\", Value: \"ul0c07xKTaeYr2IX/jd6VI8iRnkWlCukaMF0Q4JyEic=\"}\r\n4: {Name: \"Dept\", DBName: \"DEPT\", Type: \"STR\", MaxLength: 50, Value: \"r\"}\r\n5: {Name: \"Tag\", DBName: \"TAG\", Type: \"STR\", MaxLength: 300, Null: true, \u2026}\r\n6: {Name: \"FreezeTime\", DBName: \"FREEZETIME\", Type: \"DATE\", Null: true, Value: \"\"}\r\n7: {Name: \"FreezeDesc\", DBName: \"FREEZEDESC\", Type: \"STR\", MaxLength: 300, Null: true, \u2026}\r\n8: {Name: \"HeadPortrait\", DBName: \"HEADPORTRAIT\", Type: \"BYTEA\", Null: true, Value: \"\"}\r\n9: {Name: \"HeadPortraitType\", DBName: \"HEADPORTRAITTYPE\", Type: \"STR\", MaxLength: 15, Null: true, \u2026}\r\n10: {Name: \"HeadPortraitTime\", DBName: \"HEADPORTRAITTIME\", Type: \"DATE\", Null: true, Value: \"\"}\r\n11: {Name: \"IndexSetting\", DBName: \"INDEXSETTING\", Type: \"BY -->\r\n\r\n\r\n\r\n<!-- \r\n<common-bill #bill>\r\n\t<div [formGroup]=\"bill.formGroup\" *ngIf=\"bill.formGroup\" class=\"main\">\r\n\t\t<span>\u540D\u79F0</span>\r\n\t\t<mat-form-field>\r\n\t\t\t<input matInput formControlName=\"Name\" commonBillField>\r\n\t\t</mat-form-field>\r\n\t\t<span>\u6635\u79F0</span>\r\n\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t<input matInput formControlName=\"NickName\" commonBillField>\r\n\t\t</mat-form-field>\r\n\t\t<span>\u5BC6\u7801</span>\r\n\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t<input matInput type=\"password\" formControlName=\"Password\" commonBillField>\r\n\t\t</mat-form-field>\r\n\t\t<span>\u6240\u5C5E\u90E8\u95E8</span>\r\n\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t<input matInput formControlName=\"Dept\" commonBillField [matAutocomplete]=\"autoDept\">\r\n\t\t</mat-form-field>\r\n\t\t<mat-autocomplete #autoDept=\"matAutocomplete\">\r\n\t\t\t<mat-option *ngFor=\"let dept of filterDeptList|async\" [value]=\"dept.Code\">{{dept.Code}} - {{dept.Name}}\r\n\t\t\t</mat-option>\r\n\t\t</mat-autocomplete>\r\n\t\t<span>\u51BB\u7ED3\u5230\u671F</span>\r\n\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t<input type=\"datetime-local\" matInput formControlName=\"FreezeTime\" commonBillField step=\"1\">\r\n\t\t</mat-form-field>\r\n\t\t<span>\u51BB\u7ED3\u539F\u56E0</span>\r\n\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t<input matInput formControlName=\"FreezeDesc\" commonBillField>\r\n\t\t</mat-form-field>\r\n\t\t<span>\u9644\u52A0\u4FE1\u606F</span>\r\n\t\t<mat-form-field appearance=\"outline\">\r\n\t\t\t<input matInput formControlName=\"Tag\" commonBillField>\r\n\t\t</mat-form-field>\r\n\t</div>\r\n\t<ng-container *ngFor=\"let role of validRoles\">\r\n\t\t<mat-checkbox *ngIf=\"role.Type==='roleTypeAlways';else normalRole\" [checked]=\"roles[role.Name]\"\r\n\t\t\t(click)=\"$event.preventDefault()\" (change)=\"roleChange($event,role.Name)\">\r\n\t\t\t{{role.Name}}\r\n\t\t</mat-checkbox>\r\n\t\t<ng-template #normalRole>\r\n\t\t\t<mat-checkbox [checked]=\"roles[role.Name]\" (change)=\"roleChange($event,role.Name)\">\r\n\t\t\t\t{{role.Name}}\r\n\t\t\t</mat-checkbox>\r\n\t\t</ng-template>\r\n\t</ng-container>\r\n\r\n</common-bill> -->", providers: [UserBack], styles: ["@charset \"UTF-8\";.dis-row-c{display:flex;justify-content:center}.dis-row-sb{display:flex;justify-content:space-between}.main{width:100%;max-width:960px;min-width:300px;height:calc(100% - 48px - 40px);box-sizing:border-box;margin:48px auto;border-radius:4px}.main .mat-form-field ::ng-deep .mat-form-field-wrapper{margin:0;padding-bottom:0}.main .mat-form-field ::ng-deep .mat-form-field-infix{border:0;padding:14px 0 11px}.section-1{width:65%;max-width:664px;min-width:100px;box-sizing:border-box;margin-top:24px;margin-left:24px}.section-1 .title{font-size:20px}.s1-content{display:flex;width:100%;max-width:664px;min-width:300px;height:100%;box-sizing:border-box}.s1-content .title{padding-top:24px;padding-bottom:8px}.box-1{width:35%;max-width:216px;min-width:100px;box-sizing:border-box;padding-right:32px;height:calc(100% - 48px - 24px)}.box-1 .wrapper{width:100%;max-width:100%}.box-1 .wrapper .title{font-size:12px}.box-1 .wrapper .mat-form-field{width:100%;font-size:14px}.box-2{width:65%;max-width:304px;min-width:100px;box-sizing:border-box;margin-left:32px;height:368px}.box-2 .wrapper{width:100%;max-width:100%}.box-2 .wrapper .title{font-size:12px}.box-2 .wrapper .mat-form-field{width:100%;font-size:14px}.section-2{position:relative;width:30%;max-width:296px;min-width:100px;box-sizing:border-box}.s2-content{padding-left:24px}.s2-content header{padding-top:24px;margin-bottom:8px;font-size:14px}.s2-title{font-size:12px}.s2-box-1{height:100%;max-height:calc(100vh - 96px - 192px);box-sizing:border-box;overflow:auto}.s2-box-1 .wrapper-box{margin-bottom:8px}.s2-box-1 .s2-wrapper{font-size:14px;height:40px;line-height:40px}.s2-box-1 .s2-wrapper span{margin-left:16px}.s2-content-2{position:absolute;top:0;right:0;margin-top:74px;margin-right:12px}"] }] } ]; /** @nocollapse */ UserComponent.ctorParameters = () => [ { type: UserBack }, { type: CurrentService } ]; UserComponent.propDecorators = { hostClass: [{ type: HostBinding, args: ['class.c-user',] }], bill: [{ type: ViewChild, args: ['bill', { static: true },] }] }; if (false) { /** @type {?} */ UserComponent.prototype.hostClass; /** @type {?} */ UserComponent.prototype.bill; /** @type {?} */ UserComponent.prototype.filterDeptList; /** @type {?} */ UserComponent.prototype.validRoles; /** @type {?} */ UserComponent.prototype.roles; /** @type {?} */ UserComponent.prototype.roleLists; /** @type {?} */ UserComponent.prototype.roleLitters; /** @type {?} */ UserComponent.prototype.roleTypeAlways; /** * @type {?} * @private */ UserComponent.prototype.back; /** * @type {?} * @private */ UserComponent.prototype.curr; } /** * @param {?} v * @return {?} */ function map2WithLetter(v) { /** @type {?} */ const mapList = new Map(); v.forEach((/** * @param {?} vv * @return {?} */ vv => { /** @type {?} */ let headerLetter = pinyin(vv, { style: pinyin.STYLE_FIRST_LETTER }).map((/** * @param {?} s * @return {?} */ s => s[0]))[0]; if (headerLetter.length > 1) { headerLetter = headerLetter[0]; } if (mapList.has(headerLetter)) { mapList.get(headerLetter).push(vv); } else { mapList.set(headerLetter, [vv]); } })); // 排序 /** @type {?} */ const rev = (/** @type {?} */ ([])); mapList.forEach((/** * @param {?} columns * @param {?} letter * @return {?} */ (columns, letter) => { rev.push((/** @type {?} */ ({ Letter: letter, Columns: columns }))); })); return rev.sort((/** * @param {?} a * @param {?} b * @return {?} */ (a, b) => a.Letter.localeCompare(b.Letter))); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9kYndlYi1jb21tb24vIiwic291cmNlcyI6WyJsaWIvdXNlci91c2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsV0FBVyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RixPQUFPLEVBQVMsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ25ELE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RCxPQUFPLEVBQW1CLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxRQUFRLEVBQVksUUFBUSxFQUFxQixNQUFNLFFBQVEsQ0FBQztBQUN6RSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7Ozs7QUFFNUIsNEJBR0M7OztJQUZBLGlDQUFpQjs7SUFDakIsaUNBQWlCOztBQVFsQixNQUFNLE9BQU8sYUFBYTs7Ozs7SUFXekIsWUFBb0IsSUFBYyxFQUFVLElBQW9CO1FBQTVDLFNBQUksR0FBSixJQUFJLENBQVU7UUFBVSxTQUFJLEdBQUosSUFBSSxDQUFnQjtRQVZuQyxjQUFTLEdBQUcsSUFBSSxDQUFDO1FBSzlDLFVBQUssR0FBK0IsRUFBRSxDQUFDO1FBSTlCLG1CQUFjLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUV6QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlDLENBQUM7Ozs7SUFFRCxRQUFRO1FBQ1AsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxTQUFTOzs7O1FBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDcEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENB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WSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNoQztJQUNGLENBQUMsRUFBQyxDQUFDOzs7VUFHRyxHQUFHLEdBQUcsbUJBQUEsRUFBRSxFQUF1QjtJQUNyQyxPQUFPLENBQUMsT0FBTzs7Ozs7SUFBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNuQyxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFBLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQXFCLENBQUMsQ0FBQztJQUNyRSxDQUFDLEVBQUMsQ0FBQztJQUNILE9BQU8sR0FBRyxDQUFDLElBQUk7Ozs7O0lBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQztBQUM3RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBIb3N0QmluZGluZywgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0Q2hlY2tib3hDaGFuZ2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XHJcbmltcG9ydCB7IElEZXB0LCBDdXJyZW50U2VydmljZSB9IGZyb20gJ2Rid2ViLWNvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQmVmb3JlU2F2ZVBhcmFtLCBCaWxsQ29tcG9uZW50IH0gZnJvbSAnLi4vYmlsbC9iaWxsLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFVzZXJCYWNrLCBVc2VyUm9sZSwgUm9sZVR5cGUsIENvbHVtbnNXaXRoTGV0dGVyIH0gZnJvbSAnLi9iYWNrJztcclxuaW1wb3J0IHBpbnlpbiBmcm9tICdwaW55aW4nO1xyXG5cclxuaW50ZXJmYWNlIE1vZGVsVXNlclJvbGUge1xyXG5cdFVzZXJOYW1lOiBzdHJpbmc7XHJcblx0Um9sZU5hbWU6IHN0cmluZztcclxufVxyXG5AQ29tcG9uZW50KHtcclxuXHRzZWxlY3RvcjogJ2NvbW1vbi11c2VyJyxcclxuXHR0ZW1wbGF0ZVVybDogJy4vdXNlci5jb21wb25lbnQuaHRtbCcsXHJcblx0c3R5bGVVcmxzOiBbJy4vdXNlci5jb21wb25lbnQuc2NzcyddLFxyXG5cdHByb3ZpZGVyczogW1VzZXJCYWNrXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVXNlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcblx0QEhvc3RCaW5kaW5nKCdjbGFzcy5jLXVzZXInKSBob3N0Q2xhc3MgPSB0cnVlO1xyXG5cdEBWaWV3Q2hpbGQoJ2JpbGwnLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG5cdGJpbGw6IEJpbGxDb21wb25lbnQ7XHJcblx0ZmlsdGVyRGVwdExpc3Q6IE9ic2VydmFibGU8SURlcHRbXT47XHJcblx0dmFsaWRSb2xlczogVXNlclJvbGVbXTtcclxuXHRyb2xlczogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcclxuXHRyb2xlTGlzdHM6IHN0cmluZ1tdO1xyXG5cdHJvbGVMaXR0ZXJzOiBDb2x1bW5zV2l0aExldHRlcltdO1xyXG5cclxuXHRyZWFkb25seSByb2xlVHlwZUFsd2F5cyA9IFJvbGVUeXBlLmFsd2F5cztcclxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGJhY2s6IFVzZXJCYWNrLCBwcml2YXRlIGN1cnI6IEN1cnJlbnRTZXJ2aWNlKSB7XHJcblx0XHR0aGlzLmJlZm9yZVNhdmUgPSB0aGlzLmJlZm9yZVNhdmUuYmluZCh0aGlzKTtcclxuXHR9XHJcblxyXG5cdG5nT25Jbml0KCkge1xyXG5cdFx0dGhpcy5iYWNrLmZldGNoUm9sZXMoKS5zdWJzY3JpYmUodiA9PiB7XHJcblx0XHRcdHRoaXMudmFsaWRSb2xlcyA9IHY7XHJcblx0XHRcdHRoaXMucm9sZUxpc3RzID0gdGhpcy52YWxpZFJvbGVzLm1hcChudW0gPT4gbnVtLk5hbWUpO1xyXG5cdFx0XHR0aGlzLnJvbGVMaXR0ZXJzID0gbWFwMldpdGhMZXR0ZXIodGhpcy5yb2xlTGlzdHMpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRiZWZvcmVTYXZlKHNlbGZ0OiBCaWxsQ29tcG9uZW50KTogT2JzZXJ2YWJsZTxCZWZvcmVTYXZlUGFyYW0+IHtcclxuXHRcdHJldHVybiBvZih7XHJcblx0XHRcdHJlY29yZDoge1xyXG5cdFx0XHRcdFBhc3N3b3JkOiBzZWxmdC50eXBlUmVjb3JkLlBhc3N3b3JkID8gYnRvYShzZWxmdC50eXBlUmVjb3JkLlBhc3N3b3JkKSA6IG51bGwsXHJcblx0XHRcdFx0Um9sZXM6IE9iamVjdC5rZXlzKHRoaXMucm9sZXMpXHJcblx0XHRcdFx0XHQuZmlsdGVyKHYgPT4gdGhpcy5yb2xlc1t2XSlcclxuXHRcdFx0XHRcdC5tYXAodiA9PiAoe1xyXG5cdFx0XHRcdFx0XHRVc2VyTmFtZTogc2VsZnQudHlwZVJlY29yZC5OYW1lLFxyXG5cdFx0XHRcdFx0XHRSb2xlTmFtZTogdlxyXG5cdFx0XHRcdFx0fSkpXHJcblx0XHRcdH1cclxuXHRcdH0gYXMgQmVmb3JlU2F2ZVBhcmFtKTtcclxuXHR9XHJcblx0bmdBZnRlclZpZXdJbml0KCkge1xyXG5cdFx0dGhpcy5iaWxsLmluaXQuc3Vic2NyaWJlKCgpID0+IHtcclxuXHRcdFx0dGhpcy5iaWxsLmZvcm1Hcm91cC5nZXQoJ1Bhc3N3b3JkJykucGF0Y2hWYWx1ZShudWxsKTtcclxuXHRcdFx0KCh0aGlzLmJpbGwudHlwZVJlY29yZC5Sb2xlcyB8fCBbXSkgYXMgTW9kZWxVc2VyUm9sZVtdKS5mb3JFYWNoKHYgPT4ge1xyXG5cdFx0XHRcdHRoaXMucm9sZXNbdi5Sb2xlTmFtZV0gPSB0cnVlO1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdHRoaXMuYmlsbC5mb3JtR3JvdXBcclxuXHRcdFx0XHQuZ2V0KCdEZXB0JylcclxuXHRcdFx0XHQudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKHRoaXMuY3Vyci5kYXRhLkRlcHQuQ29kZSksIGRlYm91bmNlVGltZSg1MDApKVxyXG5cdFx0XHRcdC5zdWJzY3JpYmUodmFsID0+IHtcclxuXHRcdFx0XHRcdHRoaXMuZmlsdGVyRGVwdExpc3QgPSB0aGlzLmJhY2suZmV0Y2hGaWx0ZXJEZXB0KHZhbCk7XHJcblx0XHRcdFx0XHRjb25zb2xlLmxvZygn5YaF77yaJywgdGhpcy5maWx0ZXJEZXB0TGlzdCk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHRcdHRoaXMuYmlsbC5vbkJlZm9yZVNhdmUgPSB0aGlzLmJlZm9yZVNhdmU7XHJcblx0fVxyXG5cdHJvbGVDaGFuZ2UoZXZlbnQ6IE1hdENoZWNrYm94Q2hhbmdlLCByb2xlTmFtZTogc3RyaW5nKSB7XHJcblx0XHRpZiAoZXZlbnQuY2hlY2tlZCkge1xyXG5cdFx0XHR0aGlzLnJvbGVzW3JvbGVOYW1lXSA9IHRydWU7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRkZWxldGUgdGhpcy5yb2xlc1tyb2xlTmFtZV07XHJcblx0XHR9XHJcblx0fVxyXG5cdGFjcm9ueW1GdW4obGV0dGVyOiBzdHJpbmcpIHtcclxuXHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgbGV0dGVyKS5zY3JvbGxJbnRvVmlldyh0cnVlKTtcclxuXHR9XHJcblx0dHJ5KCkge1xyXG5cdFx0Y29uc29sZS5sb2codGhpcy5maWx0ZXJEZXB0TGlzdCk7XHJcblx0fVxyXG59XHJcbmZ1bmN0aW9uIG1hcDJXaXRoTGV0dGVyKHY6IHN0cmluZ1tdKSB7XHJcblx0Y29uc3QgbWFwTGlzdCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcclxuXHR2LmZvckVhY2godnYgPT4ge1xyXG5cdFx0bGV0IGhlYWRlckxldHRlciA9IHBpbnlpbih2diwgeyBzdHlsZTogcGlueWluLlNUWUxFX0ZJUlNUX0xFVFRFUiB9KS5tYXAocyA9PiBzWzBdKVswXTtcclxuXHRcdGlmIChoZWFkZXJMZXR0ZXIubGVuZ3RoID4gMSkge1xyXG5cdFx0XHRoZWFkZXJMZXR0ZXIgPSBoZWFkZXJMZXR0ZXJbMF07XHJcblx0XHR9XHJcblx0XHRpZiAobWFwTGlzdC5oYXMoaGVhZGVyTGV0dGVyKSkge1xyXG5cdFx0XHRtYXBMaXN0LmdldChoZWFkZXJMZXR0ZXIpLnB1c2godnYpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0bWFwTGlzdC5zZXQoaGVhZGVyTGV0dGVyLCBbdnZdKTtcclxuXHRcdH1cclxuXHR9KTtcclxuXHQvLyDmjpLluo9cclxuXHJcblx0Y29uc3QgcmV2ID0gW10gYXMgQ29sdW1uc1dpdGhMZXR0ZXJbXTtcclxuXHRtYXBMaXN0LmZvckVhY2goKGNvbHVtbnMsIGxldHRlcikgPT4ge1xyXG5cdFx0cmV2LnB1c2goeyBMZXR0ZXI6IGxldHRlciwgQ29sdW1uczogY29sdW1ucyB9IGFzIENvbHVtbnNXaXRoTGV0dGVyKTtcclxuXHR9KTtcclxuXHRyZXR1cm4gcmV2LnNvcnQoKGEsIGIpID0+IGEuTGV0dGVyLmxvY2FsZUNvbXBhcmUoYi5MZXR0ZXIpKTtcclxufVxyXG4iXX0=