UNPKG

ng-devui

Version:

DevUI components based on Angular

585 lines 78 kB
import { ComponentFactoryResolver, Directive, ElementRef, EventEmitter, Host, Input, Optional, Output, Self, SkipSelf, } from '@angular/core'; import { AbstractControlDirective, ControlContainer, NgControl, } from '@angular/forms'; import { I18nService } from 'ng-devui/i18n'; import { OverlayContainerRef } from 'ng-devui/overlay-container'; import { PopoverComponent } from 'ng-devui/popover'; import { Subject, fromEvent, merge, timer } from 'rxjs'; import { map, switchMap, takeUntil } from 'rxjs/operators'; import { FormItemComponent } from '../form-item.component'; import { dDefaultValidators, ruleReservedWords, } from './validate.type'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "ng-devui/i18n"; import * as i3 from "../form-item.component"; import * as i4 from "ng-devui/overlay-container"; export class DAbstractControlRuleDirective { set locale(key) { this._locale = key; this._parseErrors(this._cd.control.errors); this.updateStatusAndMessageToView(this._cd.control.status); } get locale() { return this._locale; } get errorMessage() { return this._cd && this._cd.control.invalid ? this._errorMessage || (this._rules && this._rules.message) : null; } set errorMessage(msg) { if (this._cd && this._cd.control.invalid) { this._errorMessage = msg; } else { this._errorMessage = null; } } constructor(cd, parent) { /* 统一设置错误抛出策略 */ this._errorStrategy = 'dirty'; // 统一设置错误抛出策略 /* 是否已经注册监听 */ this._registered = false; this._errorMessage = null; this.dRulesStatusChange = new EventEmitter(); this._cd = cd; this._parent = parent; } get isReady() { return this._cd.control ? !(this._cd.control.invalid || this._cd.control.pending) : true; } get pending() { return this._cd.control ? this._cd.control.pending : true; } /* 包含继承自父级的rule */ get fullRules() { const keysCanInherit = ['messageShowType', 'errorStrategy', 'messageToView', 'popPosition', 'asyncDebounceTime']; const resRules = { ...this._rules }; keysCanInherit.forEach((key) => { if (this._parent && this._parent.fullRules) { resRules[key] = resRules[key] !== undefined ? resRules[key] : this._parent.fullRules[key]; } }); return resRules; } get asyncValidatorDebounceTime() { const time = this.fullRules.asyncDebounceTime; return time === undefined ? 300 : time; } ngOnChanges(changes) { if ('rules' in changes && !this._rules) { // TODO:提供外部调用可手动更新rule方法 this._rules = { ...this._originRules, ...this._translateRulesToObject(changes.rules.currentValue) }; this.setupOrUpdateRules(); } if (!this._registered) { this._registerOnStatusChange(); } } updateRules(rules) { this._rules = { ...this._originRules, ...this._translateRulesToObject(rules) }; this.setupOrUpdateRules(); } setOriginRules(rules) { this._originRules = this._translateRulesToObject(rules); } setupOrUpdateRules() { // TODO:校验rules规则是否合法 this._transformRulesAndUpdateToModel(); this._setUpdateStrategy(); } _transformRulesAndUpdateToModel() { this._messageOpts = {}; if (!Array.isArray(this._rules)) { if (this._rules.validators) { const validators = this._transformValidatorsToFnArray(this._rules.validators); this._updateValidators(validators); } if (this._rules.asyncValidators) { const asyncValidators = this._transformValidatorsToFnArray(this._rules.asyncValidators, true); this._updateAsyncValidators(asyncValidators); } } else { const validators = this._transformValidatorsToFnArray(this._rules); this._updateValidators(validators); } this._updateValueAndValidity(); } _transformValidatorsToFnArray(validators, async = false) { const resultFns = []; validators.forEach((validatorRule) => { // TODO: 提供可全局统一注册方法 const validatorId = this._autoGetIdFromRule(validatorRule); let validator = null; if (!validatorId) { // TODO:抛出错误 } if (validatorId in dDefaultValidators) { validator = this._generateValidatorFnFromDefault(validatorId, validatorRule[validatorId]); } else { if (typeof validatorRule[validatorId] === 'string') { validator = validatorRule.validator; } else { validator = validatorRule[validatorId]; } if (!validatorRule.isNgValidator) { if (!async) { validator = this._transformRuleToNgValidator(validatorId, validator, validatorRule.message); } else { validator = this._transformRuleToNgAsyncValidator(validatorId, validator, validatorRule.message); } } } if (validator) { if (async && this.asyncValidatorDebounceTime) { const oldValidator = validator; validator = (control) => { return timer(this.asyncValidatorDebounceTime).pipe(switchMap(() => { return oldValidator(control); })); }; } resultFns.push(validator); this._messageOpts[validatorId] = validatorRule; } // else { // // TODO: 抛出错误 // } }); return resultFns; } _translateRulesToObject(rules) { if (Array.isArray(rules)) { return { validators: rules, }; } return rules; } _findNgValidatorInDefault(validatorRule) { for (const key in dDefaultValidators) { if (Object.prototype.hasOwnProperty.call(validatorRule, key)) { return { id: key, ngValidator: this._generateValidatorFnFromDefault(key, validatorRule[key]) }; } } return null; } _generateValidatorFnFromDefault(key, value) { if (typeof value === 'boolean' && value) { // boolean无需再执行函数进行传值 return dDefaultValidators[key]; } else if (typeof value !== 'boolean') { return dDefaultValidators[key](value); } return null; } _transformRuleToNgValidator(id, validatorFn, message) { return (control) => { const res = validatorFn(control.value); return this._transValidatorResultToNgError(id, res, message); }; } _transformRuleToNgAsyncValidator(id, validator, message) { return (control) => { return validator(control.value).pipe(map((res) => { return this._transValidatorResultToNgError(id, res, message); })); }; } _transValidatorResultToNgError(id, res, message) { let error = null; if (typeof res === 'boolean' && !res) { error = {}; error[id] = message; } else if (typeof res === 'string' || (res && typeof res === 'object')) { // 兼容国际化词条 error = {}; error[id] = res; } return error; } _autoGetIdFromRule(rule) { for (const key in rule) { if (!(key in ruleReservedWords)) { return key; } } return rule.id || null; } // TODO: 考虑自定义函数返回多种key场景 get dClassError() { if (this._errorStrategy === 'dirty') { return this._cd.control ? this._cd.control.invalid && this._cd.control.dirty : false; } else { return this._cd.control ? this._cd.control.invalid : false; } } get showError() { return this.dClassError; } get showStatus() { if (this._errorStrategy === 'dirty') { return this._cd.control ? this._cd.control.dirty : false; } else { return true; } } get dClassSuccess() { // COMMENT: 暂不默认提供 if (this._rules.errorStrategy === 'dirty') { return this._cd.control ? this._cd.control.valid && this._cd.control.dirty : false; } else if (!this._rules.errorStrategy) { return false; } else { return this._cd.control ? this._cd.control.valid : false; } } get dClassWarning() { return this._warning ? true : false; } get invalid() { return this._cd.control ? this._cd.control.invalid : false; } _registerOnStatusChange() { if (this._cd && this._cd.control) { this._cd.control.statusChanges.subscribe((status) => { this._parseErrors(this._cd.control.errors); this._updateParent(); // update error message to parent directive this.updateStatusAndMessageToView(status); }); this._registered = true; } } _parseErrors(errors) { if (!errors) { this._errorMessage = null; } else { /* if a rule did not have a message, we will try to get a message from errors by id */ const { resId, resRule } = this._getARuleByErrors(errors); this._errorStrategy = this._getErrorStrategy(resRule); this._errorMessage = resRule && (resRule.message || this._getMessageFormErrorsById(errors, resId) || this._getDefaultErrorMessage(resRule, resId) || this._rules.message); } this.dRulesStatusChange.emit({ showError: this.showError, errorMessage: this._errorMessage, errors: errors, }); } _getDefaultErrorMessage(rule, id) { return rule && rule[id] && this.i18nFormText[id] && this.i18nFormText[id](rule[id]); } _getErrorStrategy(rule) { return (rule && rule.errorStrategy) || this._rules.errorStrategy || 'dirty'; } _getMessageFormErrorsById(errors, id) { if (errors[id] && typeof errors[id] === 'string') { return errors[id]; } else if (errors[id] && typeof errors[id] === 'object' && (errors[id][this.locale] || errors[id].default)) { return errors[id]; } else { return null; } } _getARuleByErrors(errors) { // TODO:处理errors为null let resId; let resRule = null; for (const key of Object.keys(errors)) { if (this._messageOpts[key]) { if (resRule) { const priority = resRule.priority || 0; if (this._messageOpts[key].priority && this._messageOpts[key].priority > priority) { resId = key; resRule = this._messageOpts[key]; } } else { resId = key; resRule = this._messageOpts[key]; } } } return { resId: resId, resRule: resRule }; } _updateParent() { if (this._parent) { // TODO } } _setUpdateStrategy() { if (!Array.isArray(this._rules) && typeof this._rules === 'object' && this._rules.updateOn) { this._cd.control._updateOn = this._rules.updateOn; } } _updateValueAndValidity() { if (this._cd && this._cd.control) { this._cd.control.updateValueAndValidity(); } } _updateValidators(newValidator) { if (this._cd && this._cd.control) { this._cd.control.setValidators(newValidator); } } _updateAsyncValidators(newValidator) { if (this._cd && this._cd.control) { this._cd.control.setAsyncValidators(newValidator); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DAbstractControlRuleDirective, deps: [{ token: i1.AbstractControlDirective }, { token: DAbstractControlRuleDirective }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: DAbstractControlRuleDirective, outputs: { dRulesStatusChange: "dRulesStatusChange" }, usesOnChanges: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DAbstractControlRuleDirective, decorators: [{ type: Directive }], ctorParameters: () => [{ type: i1.AbstractControlDirective }, { type: DAbstractControlRuleDirective }], propDecorators: { dRulesStatusChange: [{ type: Output }] } }); const dControlErrorStatusHost = { '[class.devui-error]': 'dClassError', '[class.devui-success]': 'dClassSuccess', '[class.devui-warning]': 'dClassWarning', }; export class DFormGroupRuleDirective extends DAbstractControlRuleDirective { constructor(cd, parentDir, i18n) { super(cd, parentDir); this.i18n = i18n; this.dRulesStatusChange = new EventEmitter(); this.destroy$ = new Subject(); } ngOnInit() { this.i18nFormText = this.i18n.getI18nText().form; this.locale = this.i18n.getI18nText().locale; this.i18n .langChange() .pipe(takeUntil(this.destroy$)) .subscribe((data) => { this.i18nFormText = data.form; this.locale = data.locale; }); } ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); } setErrorMessageByChild(msg) { if (!this.errorMessage) { this.errorMessage = msg; } } updateStatusAndMessageToView(status) { // do nothing } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DFormGroupRuleDirective, deps: [{ token: i1.ControlContainer, self: true }, { token: DFormGroupRuleDirective, host: true, optional: true, skipSelf: true }, { token: i2.I18nService }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: DFormGroupRuleDirective, selector: "[dValidateRules][formGroupName],[dValidateRules][formArrayName],[dValidateRules][ngModelGroup],\n [dValidateRules][formGroup],[dValidateRules]form:not([ngNoForm]),[dValidateRules][ngForm]", inputs: { rules: ["dValidateRules", "rules"] }, outputs: { dRulesStatusChange: "dRulesStatusChange" }, host: { properties: { "class.devui-error": "dClassError", "class.devui-success": "dClassSuccess", "class.devui-warning": "dClassWarning" } }, exportAs: ["dValidateRules"], usesInheritance: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DFormGroupRuleDirective, decorators: [{ type: Directive, args: [{ selector: `[dValidateRules][formGroupName],[dValidateRules][formArrayName],[dValidateRules][ngModelGroup], [dValidateRules][formGroup],[dValidateRules]form:not([ngNoForm]),[dValidateRules][ngForm]`, /* eslint-disable-next-line @angular-eslint/no-host-metadata-property*/ host: dControlErrorStatusHost, exportAs: 'dValidateRules', }] }], ctorParameters: () => [{ type: i1.ControlContainer, decorators: [{ type: Self }] }, { type: DFormGroupRuleDirective, decorators: [{ type: Optional }, { type: Host }, { type: SkipSelf }] }, { type: i2.I18nService }], propDecorators: { rules: [{ type: Input, args: ['dValidateRules'] }], dRulesStatusChange: [{ type: Output }] } }); export class DFormControlRuleDirective extends DAbstractControlRuleDirective { get showType() { return this.fullRules.messageShowType || 'popover'; } get popPosition() { return this.fullRules.popPosition || ['right', 'bottom']; } constructor(cd, dFormItem, parentDir, i18n, triggerElementRef, overlayContainerRef, componentFactoryResolver) { super(cd, parentDir); this.dFormItem = dFormItem; this.i18n = i18n; this.triggerElementRef = triggerElementRef; this.overlayContainerRef = overlayContainerRef; this.componentFactoryResolver = componentFactoryResolver; this.dRulesStatusChange = new EventEmitter(); this.destroy$ = new Subject(); } ngOnInit() { this.setI18nText(); this._registerFocusChange(); } setI18nText() { this.i18nFormText = this.i18n.getI18nText().form; this.locale = this.i18n.getI18nText().locale; this.i18n .langChange() .pipe(takeUntil(this.destroy$)) .subscribe((data) => { this.i18nFormText = data.form; this.locale = data.locale; }); } _registerFocusChange() { merge(fromEvent(this.triggerElementRef.nativeElement, 'focusin'), fromEvent(this.triggerElementRef.nativeElement, 'focusout')) .pipe(takeUntil(this.destroy$)) .subscribe((event) => { if (event.type === 'focusin') { this.showPopMessage(); } if (event.type === 'focusout') { this.hidePopMessage(); } }); } _updateFormContainer(status, message) { if (this.dFormItem) { this.dFormItem.updateFeedback(status, message); } } _updatePopMessage(status, message) { this.popMessage = status === 'error' ? message : null; // 暂不提供除errorMessage外提示 if (this.popoverComponentRef) { if (this._prevMessage !== this.popMessage) { this.hidePopMessage(); this.showPopMessage(); this._prevMessage = this.popMessage; } } } updateStatusAndMessageToView(status) { let controlStatus = null; let message = null; if (this.showStatus) { [controlStatus, message] = this.getFormControlStatusAndMessage(status); } /* 国际化适配 */ if (message && typeof message === 'object') { message = message[this.locale] || message.default || message; } if (this.showType === 'popover') { this._updatePopMessage(controlStatus, message); this._updateFormContainer(controlStatus, null); } else if (this.showType === 'text') { this._updateFormContainer(controlStatus, message); } } getFormControlStatusAndMessage(ngStatus) { let status = null; let message = null; if (ngStatus === 'INVALID') { status = 'error'; message = this.errorMessage; } else if (ngStatus === 'PENDING') { status = 'pending'; } else if (ngStatus === 'VALID') { status = 'success'; } return [status, message]; } createPopover(type, content) { this.popoverComponentRef = this.overlayContainerRef.createComponent(this.componentFactoryResolver.resolveComponentFactory(PopoverComponent)); Object.assign(this.popoverComponentRef.instance, { content: content, triggerElementRef: this.triggerElementRef, position: this.popPosition, popType: type, popMaxWidth: this.popConfig?.popMaxWidth || 200, scrollElement: this.popConfig?.scrollElement, zIndex: this.popConfig?.zIndex || 1060, showAnimation: this.popConfig?.showAnimation ?? true, appendToBody: true, }); } showPopMessage() { this.showPop('error', this.popMessage); if (this.popMessage) { this._updateFormContainer(null, null); } } hidePopMessage() { this.hidePop(); if (this.popMessage) { this._updateFormContainer(this.showError ? 'error' : null, null); } } showPop(type, message) { this.hidePop(); this.createPopover(type, message); } hidePop() { if (this.popoverComponentRef) { this.destroyPop(); } } destroyPop() { if (this.popoverComponentRef) { this.popoverComponentRef.destroy(); this.popoverComponentRef = null; } } ngOnDestroy() { this.destroyPop(); this.destroy$.next(); this.destroy$.complete(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DFormControlRuleDirective, deps: [{ token: i1.NgControl, self: true }, { token: i3.FormItemComponent, host: true, optional: true }, { token: DFormGroupRuleDirective, host: true, optional: true, skipSelf: true }, { token: i2.I18nService }, { token: i0.ElementRef }, { token: i4.OverlayContainerRef }, { token: i0.ComponentFactoryResolver }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: DFormControlRuleDirective, selector: "[dValidateRules][formControlName],[dValidateRules][ngModel],[dValidateRules][formControl]", inputs: { rules: ["dValidateRules", "rules"], popConfig: ["dValidatePopConfig", "popConfig"] }, outputs: { dRulesStatusChange: "dRulesStatusChange" }, host: { properties: { "class.devui-error": "dClassError", "class.devui-success": "dClassSuccess", "class.devui-warning": "dClassWarning" } }, exportAs: ["dValidateRules"], usesInheritance: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DFormControlRuleDirective, decorators: [{ type: Directive, args: [{ selector: '[dValidateRules][formControlName],[dValidateRules][ngModel],[dValidateRules][formControl]', /* eslint-disable-next-line @angular-eslint/no-host-metadata-property*/ host: dControlErrorStatusHost, exportAs: 'dValidateRules', }] }], ctorParameters: () => [{ type: i1.NgControl, decorators: [{ type: Self }] }, { type: i3.FormItemComponent, decorators: [{ type: Optional }, { type: Host }] }, { type: DFormGroupRuleDirective, decorators: [{ type: Optional }, { type: Host }, { type: SkipSelf }] }, { type: i2.I18nService }, { type: i0.ElementRef }, { type: i4.OverlayContainerRef }, { type: i0.ComponentFactoryResolver }], propDecorators: { rules: [{ type: Input, args: ['dValidateRules'] }], dRulesStatusChange: [{ type: Output }], popConfig: [{ type: Input, args: ['dValidatePopConfig'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1jb250cm9sLXJ1bGVzLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2RldnVpL2Zvcm0vdmFsaWRhdG9yLWRpcmVjdGl2ZS9mb3JtLWNvbnRyb2wtcnVsZXMuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx3QkFBd0IsRUFFeEIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osSUFBSSxFQUNKLEtBQUssRUFJTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLElBQUksRUFFSixRQUFRLEdBRVQsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUVMLHdCQUF3QixFQUV4QixnQkFBZ0IsRUFDaEIsU0FBUyxHQUdWLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFpQixXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFjLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRCxPQUFPLEVBUUwsa0JBQWtCLEVBQ2xCLGlCQUFpQixHQUNsQixNQUFNLGlCQUFpQixDQUFDOzs7Ozs7QUFHekIsTUFBTSxPQUFnQiw2QkFBNkI7SUFrQ2pELElBQUksTUFBTSxDQUFDLEdBQVc7UUFDcEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7UUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FB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QkFDaEIsUUFBUTs7MEJBQUksSUFBSTs7MEJBQUksUUFBUTtxS0FyQlosS0FBSztzQkFBN0IsS0FBSzt1QkFBQyxnQkFBZ0I7Z0JBQ2Isa0JBQWtCO3NCQUEzQixNQUFNO2dCQUVzQixTQUFTO3NCQUFyQyxLQUFLO3VCQUFDLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gIENvbXBvbmVudFJlZixcclxuICBEaXJlY3RpdmUsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSG9zdCxcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPcHRpb25hbCxcclxuICBPdXRwdXQsXHJcbiAgU2VsZixcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFNraXBTZWxmLFxyXG4gIFRlbXBsYXRlUmVmLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICBBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmUsXHJcbiAgQXN5bmNWYWxpZGF0b3JGbixcclxuICBDb250cm9sQ29udGFpbmVyLFxyXG4gIE5nQ29udHJvbCxcclxuICBWYWxpZGF0aW9uRXJyb3JzLFxyXG4gIFZhbGlkYXRvckZuLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgSTE4bkludGVyZmFjZSwgSTE4blNlcnZpY2UgfSBmcm9tICduZy1kZXZ1aS9pMThuJztcclxuaW1wb3J0IHsgT3ZlcmxheUNvbnRhaW5lclJlZiB9IGZyb20gJ25nLWRldnVpL292ZXJsYXktY29udGFpbmVyJztcclxuaW1wb3J0IHsgUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJ25nLWRldnVpL3BvcG92ZXInO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBmcm9tRXZlbnQsIG1lcmdlLCB0aW1lciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBtYXAsIHN3aXRjaE1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBGb3JtSXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0taXRlbS5jb21wb25lbnQnO1xyXG5pbXBvcnQge1xyXG4gIERBc3luY1ZhbGlkYXRlUnVsZSxcclxuICBERm9ybUNvbnRyb2xTdGF0dXMsXHJcbiAgRFBvcENvbmZpZyxcclxuICBEVmFsaWRhdGVFcnJvclN0YXR1cyxcclxuICBEVmFsaWRhdGVSdWxlLFxyXG4gIERWYWxpZGF0ZVJ1bGVzLFxyXG4gIERWYWxpZGF0aW9uRXJyb3JTdHJhdGVneSxcclxuICBkRGVmYXVsdFZhbGlkYXRvcnMsXHJcbiAgcnVsZVJlc2VydmVkV29yZHMsXHJcbn0gZnJvbSAnLi92YWxpZGF0ZS50eXBlJztcclxuXHJcbkBEaXJlY3RpdmUoKVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgREFic3RyYWN0Q29udHJvbFJ1bGVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG4gIC8qIG1vZGUgaXMgX2NkLmNvbnRyb2wgKi9cclxuICBwdWJsaWMgcmVhZG9ubHkgX2NkOiBBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmU7IC8vIG1vZGVsIGlzIF9jZC5jb250cm9sXHJcblxyXG4gIC8qI