@alauda-fe/common
Version:
Alauda frontend team common codes.
208 lines • 29.1 kB
JavaScript
import { ButtonModule, IconModule, InputModule, SelectModule, } from '@alauda/ui';
import { CommonModule } from '@angular/common';
import { ChangeDetectionStrategy, Component, forwardRef } from '@angular/core';
import { FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, } from '@angular/forms';
import { PurePipe, TaintEffect, createNestedFormControl, } from '../../core/public-api';
import { EffectDirectiveModule } from '../../effect-directive/module';
import { TranslateModule } from '../../translate/public-api';
import { ErrorsMapperModule } from '../errors-mapper/public-api';
import { ValidatorsModule } from '../validators/public-api';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "../../translate/translate.pipe";
import * as i3 from "@angular/forms";
import * as i4 from "@alauda/ui";
import * as i5 from "../validators/function-validator.directive";
import * as i6 from "../validators/maxlength-minlength-validator.directive";
import * as i7 from "../errors-mapper/errors-mapper-component/component";
import * as i8 from "../../effect-directive/e2e-attribute-binding.directive";
import * as i9 from "../../effect-directive/validators.directive";
function TaintsEditorComponent_tr_15_acl_errors_mapper_4_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "acl-errors-mapper", 22);
} if (rf & 2) {
i0.ɵɵnextContext();
const key_r4 = i0.ɵɵreference(3);
i0.ɵɵproperty("errors", key_r4.errors);
} }
function TaintsEditorComponent_tr_15_acl_errors_mapper_8_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "acl-errors-mapper", 22);
} if (rf & 2) {
i0.ɵɵnextContext();
const value_r5 = i0.ɵɵreference(7);
i0.ɵɵproperty("errors", value_r5.errors);
} }
function TaintsEditorComponent_tr_15_aui_option_11_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "aui-option", 23);
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const effect_r6 = ctx.$implicit;
i0.ɵɵproperty("value", effect_r6);
i0.ɵɵadvance();
i0.ɵɵtextInterpolate1(" ", effect_r6, " ");
} }
function TaintsEditorComponent_tr_15_Template(rf, ctx) { if (rf & 1) {
const _r1 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "tr")(1, "td")(2, "input", 14, 0);
i0.ɵɵlistener("ngModelChange", function TaintsEditorComponent_tr_15_Template_input_ngModelChange_2_listener($event) { const index_r2 = i0.ɵɵrestoreView(_r1).index; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.editTaint(index_r2, "key", $event)); });
i0.ɵɵelementEnd();
i0.ɵɵtemplate(4, TaintsEditorComponent_tr_15_acl_errors_mapper_4_Template, 1, 1, "acl-errors-mapper", 15);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(5, "td")(6, "input", 16, 1);
i0.ɵɵlistener("ngModelChange", function TaintsEditorComponent_tr_15_Template_input_ngModelChange_6_listener($event) { const index_r2 = i0.ɵɵrestoreView(_r1).index; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.editTaint(index_r2, "value", $event)); });
i0.ɵɵelementEnd();
i0.ɵɵtemplate(8, TaintsEditorComponent_tr_15_acl_errors_mapper_8_Template, 1, 1, "acl-errors-mapper", 15);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(9, "td")(10, "aui-select", 17);
i0.ɵɵlistener("ngModelChange", function TaintsEditorComponent_tr_15_Template_aui_select_ngModelChange_10_listener($event) { const index_r2 = i0.ɵɵrestoreView(_r1).index; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.editTaint(index_r2, "effect", $event)); });
i0.ɵɵtemplate(11, TaintsEditorComponent_tr_15_aui_option_11_Template, 2, 2, "aui-option", 18);
i0.ɵɵelementEnd()();
i0.ɵɵelementStart(12, "td", 19)(13, "button", 20);
i0.ɵɵlistener("click", function TaintsEditorComponent_tr_15_Template_button_click_13_listener() { const index_r2 = i0.ɵɵrestoreView(_r1).index; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.removeTaint(index_r2)); });
i0.ɵɵelement(14, "aui-icon", 21);
i0.ɵɵelementEnd()()();
} if (rf & 2) {
const taint_r7 = ctx.$implicit;
const key_r4 = i0.ɵɵreference(3);
const value_r5 = i0.ɵɵreference(7);
const ctx_r2 = i0.ɵɵnextContext();
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngModel", taint_r7.key)("aclValidateFn", ctx_r2.keyPattern);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", ctx_r2.submitted || key_r4.dirty);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngModel", taint_r7.value);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", ctx_r2.submitted || value_r5.dirty);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngModel", taint_r7.effect);
i0.ɵɵadvance();
i0.ɵɵproperty("ngForOf", ctx_r2.effects);
i0.ɵɵadvance(2);
i0.ɵɵproperty("square", true)("plain", true);
} }
function TaintsEditorComponent_tr_16_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "tr")(1, "td", 10)(2, "div", 24);
i0.ɵɵtext(3);
i0.ɵɵpipe(4, "translate");
i0.ɵɵelementEnd()()();
} if (rf & 2) {
i0.ɵɵadvance(3);
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 1, "no_taint"));
} }
export class TaintsEditorComponent extends createNestedFormControl() {
constructor() {
super(...arguments);
this.effects = Object.values(TaintEffect);
}
addTaint() {
this.model = this.model ?? [];
this.model.push({ key: '', value: '', effect: TaintEffect.NoSchedule });
}
editTaint(index, key, value) {
this.model[index][key] = value;
this.emitModel();
}
removeTaint(index) {
this.model.splice(index, 1);
this.emitModel();
}
keyPattern(control) {
if (!control.value) {
return null;
}
const [name, prefix = ''] = control.value.split('/').reverse();
if (name.length > 63 ||
/^(([\dA-Za-z][\w.-]*)?[\dA-Za-z])$/.test(name) === false) {
return { pattern: true };
}
if (!!prefix &&
(prefix.length > 253 ||
/^[\da-z]([\da-z-]*[\da-z])?(\.[\da-z]([\da-z-]*[\da-z])?)*$/.test(prefix) === false)) {
return { pattern: true };
}
return null;
}
static { this.ɵfac = /*@__PURE__*/ (() => { let ɵTaintsEditorComponent_BaseFactory; return function TaintsEditorComponent_Factory(t) { return (ɵTaintsEditorComponent_BaseFactory || (ɵTaintsEditorComponent_BaseFactory = i0.ɵɵgetInheritedFactory(TaintsEditorComponent)))(t || TaintsEditorComponent); }; })(); }
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TaintsEditorComponent, selectors: [["acl-taints-editor"]], standalone: true, features: [i0.ɵɵProvidersFeature([
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => TaintsEditorComponent),
multi: true,
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => TaintsEditorComponent),
multi: true,
},
]), i0.ɵɵInheritDefinitionFeature, i0.ɵɵStandaloneFeature], decls: 25, vars: 18, consts: [["key", "ngModel"], ["value", "ngModel"], [1, "acl-array-form-table", "mp-sticky-table-header", "mp-sticky-table-actions"], ["required", "", "width", "40%"], ["width", "40%"], ["width", "20%"], [2, "min-width", "44px"], [4, "ngFor", "ngForOf"], [4, "ngIf"], [1, "acl-array-form-table--row-action"], ["colspan", "100"], [1, "acl-array-form-table__bottom-control-buttons"], ["aui-button", "primary", "size", "mini", "type", "button", 3, "click", "plain", "disabled"], ["icon", "plus_circle"], ["aui-input", "", "size", "small", "name", "key", "required", "", 3, "ngModelChange", "ngModel", "aclValidateFn"], [3, "errors", 4, "ngIf"], ["aui-input", "", "size", "small", "name", "value", "aclMaxlength", "63", "pattern", "^(([\\dA-Za-z][\\w.-]*)?[\\dA-Za-z])?$", 3, "ngModelChange", "ngModel"], ["size", "small", "name", "effect", 3, "ngModelChange", "ngModel"], [3, "value", 4, "ngFor", "ngForOf"], [1, "acl-array-form-table__action-col"], ["aui-button", "text", "size", "small", "type", "button", 3, "click", "square", "plain"], ["icon", "minus_circle"], [3, "errors"], [3, "value"], [1, "placeholder"]], template: function TaintsEditorComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "table", 2)(1, "thead")(2, "tr")(3, "th", 3)(4, "span");
i0.ɵɵtext(5);
i0.ɵɵpipe(6, "translate");
i0.ɵɵelementEnd()();
i0.ɵɵelementStart(7, "th", 4);
i0.ɵɵtext(8);
i0.ɵɵpipe(9, "translate");
i0.ɵɵelementEnd();
i0.ɵɵelementStart(10, "th", 5);
i0.ɵɵtext(11);
i0.ɵɵpipe(12, "translate");
i0.ɵɵelementEnd();
i0.ɵɵelement(13, "th", 6);
i0.ɵɵelementEnd()();
i0.ɵɵelementStart(14, "tbody");
i0.ɵɵtemplate(15, TaintsEditorComponent_tr_15_Template, 15, 9, "tr", 7)(16, TaintsEditorComponent_tr_16_Template, 5, 3, "tr", 8);
i0.ɵɵelementStart(17, "tr", 9)(18, "td", 10)(19, "div", 11)(20, "button", 12);
i0.ɵɵlistener("click", function TaintsEditorComponent_Template_button_click_20_listener() { return ctx.addTaint(); });
i0.ɵɵelement(21, "aui-icon", 13);
i0.ɵɵelementStart(22, "span");
i0.ɵɵtext(23);
i0.ɵɵpipe(24, "translate");
i0.ɵɵelementEnd()()()()()()();
} if (rf & 2) {
i0.ɵɵclassProp("submitted", ctx.submitted);
i0.ɵɵadvance(5);
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(6, 10, "key"));
i0.ɵɵadvance(3);
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(9, 12, "value"));
i0.ɵɵadvance(3);
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(12, 14, "type"));
i0.ɵɵadvance(4);
i0.ɵɵproperty("ngForOf", ctx.model);
i0.ɵɵadvance();
i0.ɵɵproperty("ngIf", !(ctx.model == null ? null : ctx.model.length));
i0.ɵɵadvance(4);
i0.ɵɵproperty("plain", true)("disabled", (ctx.model == null ? null : ctx.model.length) >= 50);
i0.ɵɵadvance(3);
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(24, 16, "add"), " ");
} }, dependencies: [CommonModule, i1.NgForOf, i1.NgIf, TranslateModule, i2.TranslatePipe, FormsModule, i3.DefaultValueAccessor, i3.NgControlStatus, i3.RequiredValidator, i3.PatternValidator, i3.NgModel, InputModule, i4.InputComponent, SelectModule, i4.SelectComponent, i4.OptionComponent, ValidatorsModule, i5.FunctionValidatorDirective, i6.MaxLengthValidatorDirective, ErrorsMapperModule, i7.ErrorsMapperComponent, IconModule, i4.IconComponent, ButtonModule, i4.ButtonComponent, EffectDirectiveModule, i8.E2eAttributeBindingDirective, i9.ValidatorsDirective], styles: ["[_nghost-%COMP%] {display:block;width:100%}[_nghost-%COMP%] .acl-array-form-table tbody td{vertical-align:top;line-height:var(--aui-inline-height-s)}[_nghost-%COMP%] .acl-array-form-table tbody tr .placeholder{text-align:center;color:rgb(var(--aui-color-help-text))}"], changeDetection: 0 }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TaintsEditorComponent, [{
type: Component,
args: [{ standalone: true, selector: 'acl-taints-editor', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
CommonModule,
TranslateModule,
FormsModule,
InputModule,
SelectModule,
ValidatorsModule,
ErrorsMapperModule,
IconModule,
ButtonModule,
PurePipe,
EffectDirectiveModule,
], providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => TaintsEditorComponent),
multi: true,
},
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => TaintsEditorComponent),
multi: true,
},
], template: "<table\n class=\"acl-array-form-table mp-sticky-table-header mp-sticky-table-actions\"\n [class.submitted]=\"submitted\"\n>\n <thead>\n <tr>\n <th\n required\n width=\"40%\"\n >\n <span>{{ 'key' | translate }}</span>\n </th>\n <th width=\"40%\">{{ 'value' | translate }}</th>\n <th width=\"20%\">{{ 'type' | translate }}</th>\n <th style=\"min-width: 44px\"></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let taint of model; let index = index\">\n <td>\n <input\n aui-input\n size=\"small\"\n name=\"key\"\n #key=\"ngModel\"\n [ngModel]=\"taint.key\"\n (ngModelChange)=\"editTaint(index, 'key', $event)\"\n required\n [aclValidateFn]=\"keyPattern\"\n />\n <acl-errors-mapper\n *ngIf=\"submitted || key.dirty\"\n [errors]=\"key.errors\"\n ></acl-errors-mapper>\n </td>\n <td>\n <input\n aui-input\n size=\"small\"\n name=\"value\"\n #value=\"ngModel\"\n [ngModel]=\"taint.value\"\n (ngModelChange)=\"editTaint(index, 'value', $event)\"\n aclMaxlength=\"63\"\n pattern=\"^(([\\dA-Za-z][\\w.-]*)?[\\dA-Za-z])?$\"\n />\n <acl-errors-mapper\n *ngIf=\"submitted || value.dirty\"\n [errors]=\"value.errors\"\n ></acl-errors-mapper>\n </td>\n <td>\n <aui-select\n size=\"small\"\n name=\"effect\"\n [ngModel]=\"taint.effect\"\n (ngModelChange)=\"editTaint(index, 'effect', $event)\"\n >\n <aui-option\n *ngFor=\"let effect of effects\"\n [value]=\"effect\"\n >\n {{ effect }}\n </aui-option>\n </aui-select>\n </td>\n <td class=\"acl-array-form-table__action-col\">\n <button\n aui-button=\"text\"\n size=\"small\"\n type=\"button\"\n [square]=\"true\"\n [plain]=\"true\"\n (click)=\"removeTaint(index)\"\n >\n <aui-icon icon=\"minus_circle\"></aui-icon>\n </button>\n </td>\n </tr>\n <tr *ngIf=\"!model?.length\">\n <td colspan=\"100\">\n <div class=\"placeholder\">{{ 'no_taint' | translate }}</div>\n </td>\n </tr>\n <tr class=\"acl-array-form-table--row-action\">\n <td colspan=\"100\">\n <div class=\"acl-array-form-table__bottom-control-buttons\">\n <button\n aui-button=\"primary\"\n [plain]=\"true\"\n size=\"mini\"\n type=\"button\"\n (click)=\"addTaint()\"\n [disabled]=\"model?.length >= 50\"\n >\n <aui-icon icon=\"plus_circle\"></aui-icon>\n <span>\n {{ 'add' | translate }}\n </span>\n </button>\n </div>\n </td>\n </tr>\n </tbody>\n</table>\n", styles: [":host::ng-deep{display:block;width:100%}:host::ng-deep .acl-array-form-table tbody td{vertical-align:top;line-height:var(--aui-inline-height-s)}:host::ng-deep .acl-array-form-table tbody tr .placeholder{text-align:center;color:rgb(var(--aui-color-help-text))}\n"] }]
}], null, null); })();
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TaintsEditorComponent, { className: "TaintsEditorComponent" }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2Zvcm0vdGFpbnRzLWVkaXRvci9jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvZm9ybS90YWludHMtZWRpdG9yL3RlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksR0FDYixNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUVMLFdBQVcsRUFDWCxhQUFhLEVBQ2IsaUJBQWlCLEdBQ2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUNMLFFBQVEsRUFDUixXQUFXLEVBQ1gsdUJBQXVCLEdBQ3hCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7Ozs7SUNPcEQsd0NBR3FCOzs7O0lBRG5CLHNDQUFxQjs7O0lBY3ZCLHdDQUdxQjs7OztJQURuQix3Q0FBdUI7OztJQVV2QixzQ0FHQztJQUNDLFlBQ0Y7SUFBQSxpQkFBYTs7O0lBSFgsaUNBQWdCO0lBRWhCLGNBQ0Y7SUFERSwwQ0FDRjs7OztJQTNDRixBQURGLEFBREYsMEJBQW1ELFNBQzdDLG1CQVVBO0lBSEEsNk5BQWlC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QWdCLGlFQUNoQixrQkFBa0IsNEJBQ2xCLFVBQVUsb0JBQ1YsWUFBWSxzQkFFWixxQkFBcUI7O2lGQWVaLHFCQUFxQjtjQWhDakMsU0FBUzs2QkFDSSxJQUFJLFlBQ04sbUJBQW1CLG1CQUdaLHVCQUF1QixDQUFDLE1BQU0sV0FDdEM7b0JBQ1AsWUFBWTtvQkFDWixlQUFlO29CQUNmLFdBQVc7b0JBQ1gsV0FBVztvQkFDWCxZQUFZO29CQUNaLGdCQUFnQjtvQkFDaEIsa0JBQWtCO29CQUNsQixVQUFVO29CQUNWLFlBQVk7b0JBQ1osUUFBUTtvQkFDUixxQkFBcUI7aUJBQ3RCLGFBQ1U7b0JBQ1Q7d0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjt3QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsc0JBQXNCLENBQUM7d0JBQ3BELEtBQUssRUFBRSxJQUFJO3FCQUNaO29CQUNEO3dCQUNFLE9BQU8sRUFBRSxhQUFhO3dCQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxzQkFBc0IsQ0FBQzt3QkFDcEQsS0FBSyxFQUFFLElBQUk7cUJBQ1o7aUJBQ0Y7O2tGQUVVLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJ1dHRvbk1vZHVsZSxcbiAgSWNvbk1vZHVsZSxcbiAgSW5wdXRNb2R1bGUsXG4gIFNlbGVjdE1vZHVsZSxcbn0gZnJvbSAnQGFsYXVkYS91aSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgZm9yd2FyZFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBGb3Jtc01vZHVsZSxcbiAgTkdfVkFMSURBVE9SUyxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHtcbiAgUHVyZVBpcGUsXG4gIFRhaW50RWZmZWN0LFxuICBjcmVhdGVOZXN0ZWRGb3JtQ29udHJvbCxcbn0gZnJvbSAnLi4vLi4vY29yZS9wdWJsaWMtYXBpJztcbmltcG9ydCB7IEVmZmVjdERpcmVjdGl2ZU1vZHVsZSB9IGZyb20gJy4uLy4uL2VmZmVjdC1kaXJlY3RpdmUvbW9kdWxlJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJy4uLy4uL3RyYW5zbGF0ZS9wdWJsaWMtYXBpJztcbmltcG9ydCB7IEVycm9yc01hcHBlck1vZHVsZSB9IGZyb20gJy4uL2Vycm9ycy1tYXBwZXIvcHVibGljLWFwaSc7XG5pbXBvcnQgeyBWYWxpZGF0b3JzTW9kdWxlIH0gZnJvbSAnLi4vdmFsaWRhdG9ycy9wdWJsaWMtYXBpJztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnYWNsLXRhaW50cy1lZGl0b3InLFxuICB0ZW1wbGF0ZVVybDogJy4vdGVtcGxhdGUuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3N0eWxlLnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIElucHV0TW9kdWxlLFxuICAgIFNlbGVjdE1vZHVsZSxcbiAgICBWYWxpZGF0b3JzTW9kdWxlLFxuICAgIEVycm9yc01hcHBlck1vZHVsZSxcbiAgICBJY29uTW9kdWxlLFxuICAgIEJ1dHRvbk1vZHVsZSxcbiAgICBQdXJlUGlwZSxcbiAgICBFZmZlY3REaXJlY3RpdmVNb2R1bGUsXG4gIF0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVGFpbnRzRWRpdG9yQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFRhaW50c0VkaXRvckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBUYWludHNFZGl0b3JDb21wb25lbnQgZXh0ZW5kcyBjcmVhdGVOZXN0ZWRGb3JtQ29udHJvbDxUYWludFtdPigpIHtcbiAgZWZmZWN0cyA9IE9iamVjdC52YWx1ZXMoVGFpbnRFZmZlY3QpO1xuXG4gIGFkZFRhaW50KCkge1xuICAgIHRoaXMubW9kZWwgPSB0aGlzLm1vZGVsID8/IFtdO1xuICAgIHRoaXMubW9kZWwucHVzaCh7IGtleTogJycsIHZhbHVlOiAnJywgZWZmZWN0OiBUYWludEVmZmVjdC5Ob1NjaGVkdWxlIH0pO1xuICB9XG5cbiAgZWRpdFRhaW50KFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAga2V5OiBrZXlvZiBPbWl0PFRhaW50LCAnZWZmZWN0Jz4sXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgKTogdm9pZDtcblxuICBlZGl0VGFpbnQoaW5kZXg6IG51bWJlciwga2V5OiAnZWZmZWN0JywgdmFsdWU6IFRhaW50RWZmZWN0KTogdm9pZDtcbiAgZWRpdFRhaW50KGluZGV4OiBudW1iZXIsIGtleToga2V5b2YgVGFpbnQsIHZhbHVlOiBzdHJpbmcgfCBUYWludEVmZmVjdCkge1xuICAgIHRoaXMubW9kZWxbaW5kZXhdW2tleV0gPSB2YWx1ZSBhcyBhbnk7XG4gICAgdGhpcy5lbWl0TW9kZWwoKTtcbiAgfVxuXG4gIHJlbW92ZVRhaW50KGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLm1vZGVsLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5lbWl0TW9kZWwoKTtcbiAgfVxuXG4gIGtleVBhdHRlcm4oY29udHJvbDogQWJzdHJhY3RDb250cm9sPHN0cmluZz4pIHtcbiAgICBpZiAoIWNvbnRyb2wudmFsdWUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBbbmFtZSwgcHJlZml4ID0gJyddID0gY29udHJvbC52YWx1ZS5zcGxpdCgnLycpLnJldmVyc2UoKTtcbiAgICBpZiAoXG4gICAgICBuYW1lLmxlbmd0aCA+IDYzIHx8XG4gICAgICAvXigoW1xcZEEtWmEtel1bXFx3Li1dKik/W1xcZEEtWmEtel0pJC8udGVzdChuYW1lKSA9PT0gZmFsc2VcbiAgICApIHtcbiAgICAgIHJldHVybiB7IHBhdHRlcm46IHRydWUgfTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAhIXByZWZpeCAmJlxuICAgICAgKHByZWZpeC5sZW5ndGggPiAyNTMgfHxcbiAgICAgICAgL15bXFxkYS16XShbXFxkYS16LV0qW1xcZGEtel0pPyhcXC5bXFxkYS16XShbXFxkYS16LV0qW1xcZGEtel0pPykqJC8udGVzdChcbiAgICAgICAgICBwcmVmaXgsXG4gICAgICAgICkgPT09IGZhbHNlKVxuICAgICkge1xuICAgICAgcmV0dXJuIHsgcGF0dGVybjogdHJ1ZSB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmludGVyZmFjZSBUYWludCB7XG4gIGtleTogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBlZmZlY3Q6IFRhaW50RWZmZWN0O1xufVxuIiwiPHRhYmxlXG4gIGNsYXNzPVwiYWNsLWFycmF5LWZvcm0tdGFibGUgbXAtc3RpY2t5LXRhYmxlLWhlYWRlciBtcC1zdGlja3ktdGFibGUtYWN0aW9uc1wiXG4gIFtjbGFzcy5zdWJtaXR0ZWRdPVwic3VibWl0dGVkXCJcbj5cbiAgPHRoZWFkPlxuICAgIDx0cj5cbiAgICAgIDx0aFxuICAgICAgICByZXF1aXJlZFxuICAgICAgICB3aWR0aD1cIjQwJVwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuPnt7ICdrZXknIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgPC90aD5cbiAgICAgIDx0aCB3aWR0aD1cIjQwJVwiPnt7ICd2YWx1ZScgfCB0cmFuc2xhdGUgfX08L3RoPlxuICAgICAgPHRoIHdpZHRoPVwiMjAlXCI+e3sgJ3R5cGUnIHwgdHJhbnNsYXRlIH19PC90aD5cbiAgICAgIDx0aCBzdHlsZT1cIm1pbi13aWR0aDogNDRweFwiPjwvdGg+XG4gICAgPC90cj5cbiAgPC90aGVhZD5cbiAgPHRib2R5PlxuICAgIDx0ciAqbmdGb3I9XCJsZXQgdGFpbnQgb2YgbW9kZWw7IGxldCBpbmRleCA9IGluZGV4XCI+XG4gICAgICA8dGQ+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIGF1aS1pbnB1dFxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgbmFtZT1cImtleVwiXG4gICAgICAgICAgI2tleT1cIm5nTW9kZWxcIlxuICAgICAgICAgIFtuZ01vZGVsXT1cInRhaW50LmtleVwiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZWRpdFRhaW50KGluZGV4LCAna2V5JywgJGV2ZW50KVwiXG4gICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICBbYWNsVmFsaWRhdGVGbl09XCJrZXlQYXR0ZXJuXCJcbiAgICAgICAgLz5cbiAgICAgICAgPGFjbC1lcnJvcnMtbWFwcGVyXG4gICAgICAgICAgKm5nSWY9XCJzdWJtaXR0ZWQgfHwga2V5LmRpcnR5XCJcbiAgICAgICAgICBbZXJyb3JzXT1cImtleS5lcnJvcnNcIlxuICAgICAgICA+PC9hY2wtZXJyb3JzLW1hcHBlcj5cbiAgICAgIDwvdGQ+XG4gICAgICA8dGQ+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIGF1aS1pbnB1dFxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgbmFtZT1cInZhbHVlXCJcbiAgICAgICAgICAjdmFsdWU9XCJuZ01vZGVsXCJcbiAgICAgICAgICBbbmdNb2RlbF09XCJ0YWludC52YWx1ZVwiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZWRpdFRhaW50KGluZGV4LCAndmFsdWUnLCAkZXZlbnQpXCJcbiAgICAgICAgICBhY2xNYXhsZW5ndGg9XCI2M1wiXG4gICAgICAgICAgcGF0dGVybj1cIl4oKFtcXGRBLVphLXpdW1xcdy4tXSopP1tcXGRBLVphLXpdKT8kXCJcbiAgICAgICAgLz5cbiAgICAgICAgPGFjbC1lcnJvcnMtbWFwcGVyXG4gICAgICAgICAgKm5nSWY9XCJzdWJtaXR0ZWQgfHwgdmFsdWUuZGlydHlcIlxuICAgICAgICAgIFtlcnJvcnNdPVwidmFsdWUuZXJyb3JzXCJcbiAgICAgICAgPjwvYWNsLWVycm9ycy1tYXBwZXI+XG4gICAgICA8L3RkPlxuICAgICAgPHRkPlxuICAgICAgICA8YXVpLXNlbGVjdFxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgbmFtZT1cImVmZmVjdFwiXG4gICAgICAgICAgW25nTW9kZWxdPVwidGFpbnQuZWZmZWN0XCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJlZGl0VGFpbnQoaW5kZXgsICdlZmZlY3QnLCAkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxhdWktb3B0aW9uXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgZWZmZWN0IG9mIGVmZmVjdHNcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImVmZmVjdFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgZWZmZWN0IH19XG4gICAgICAgICAgPC9hdWktb3B0aW9uPlxuICAgICAgICA8L2F1aS1zZWxlY3Q+XG4gICAgICA8L3RkPlxuICAgICAgPHRkIGNsYXNzPVwiYWNsLWFycmF5LWZvcm0tdGFibGVfX2FjdGlvbi1jb2xcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGF1aS1idXR0b249XCJ0ZXh0XCJcbiAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIFtzcXVhcmVdPVwidHJ1ZVwiXG4gICAgICAgICAgW3BsYWluXT1cInRydWVcIlxuICAgICAgICAgIChjbGljayk9XCJyZW1vdmVUYWludChpbmRleClcIlxuICAgICAgICA+XG4gICAgICAgICAgPGF1aS1pY29uIGljb249XCJtaW51c19jaXJjbGVcIj48L2F1aS1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgICA8dHIgKm5nSWY9XCIhbW9kZWw/Lmxlbmd0aFwiPlxuICAgICAgPHRkIGNvbHNwYW49XCIxMDBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBsYWNlaG9sZGVyXCI+e3sgJ25vX3RhaW50JyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICAgIDx0ciBjbGFzcz1cImFjbC1hcnJheS1mb3JtLXRhYmxlLS1yb3ctYWN0aW9uXCI+XG4gICAgICA8dGQgY29sc3Bhbj1cIjEwMFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWNsLWFycmF5LWZvcm0tdGFibGVfX2JvdHRvbS1jb250cm9sLWJ1dHRvbnNcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBhdWktYnV0dG9uPVwicHJpbWFyeVwiXG4gICAgICAgICAgICBbcGxhaW5dPVwidHJ1ZVwiXG4gICAgICAgICAgICBzaXplPVwibWluaVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhZGRUYWludCgpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtb2RlbD8ubGVuZ3RoID49IDUwXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8YXVpLWljb24gaWNvbj1cInBsdXNfY2lyY2xlXCI+PC9hdWktaWNvbj5cbiAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICB7eyAnYWRkJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgPC90Ym9keT5cbjwvdGFibGU+XG4iXX0=