@tangential/input-widgets
Version:
Input Widgets with persistable, dynamic configuration.
197 lines (193 loc) • 19.8 kB
JavaScript
import { ChangeDetectorRef, Component, EventEmitter, forwardRef, HostBinding, Input, Output, ViewEncapsulation } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { Hacks } from '@tangential/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@tangential/components";
/**
* Provider Expression that allows this widget to register as a ControlValueAccessor.
* This allows it to support [(ngModel)].
* @docs-private
*/
export const TANJ_ICON_RATING_WIDGET_VIEW_CONTROL_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => IconRatingWidgetComponent),
multi: true
};
export class IconRatingWidgetChange {
constructor(source, value) {
this.source = source;
this.value = value;
}
}
export class IconRatingWidgetComponent {
constructor(changeDetectorRef) {
this.changeDetectorRef = changeDetectorRef;
// turn this into a class
this.flex = '';
this.flexLayout = 'column';
this.flexLayoutAlign = 'start';
this.value = 0;
this.valueChange = new EventEmitter(false);
this.labelPosition = 'before';
this.disabled = false;
this.hideLabel = false;
this.onlyLabel = false;
/**
* Configuration Fields
*/
this.label = '';
this.defaultValue = 0;
this.max = 5;
this.offIconNames = [];
this.onIconNames = [];
/* end Configuration Fields */
this.change = new EventEmitter(false);
this.icons = [];
this.onTouched = () => { };
this.controlValueAccessorChangeFn = (value) => { };
}
ngOnInit() {
Hacks.materialDesignPlaceholderText(this.changeDetectorRef);
}
ngOnChanges(changes) {
if (this.max && this.iconFont && this.offIconNames && this.onIconNames) {
this.icons = [];
for (let i = 0; i < this.max; i++) {
const icon = {
font: this.iconFont,
name: i <= this.value ? this.onIconNames[0] : this.offIconNames[0]
// star star_border
};
this.icons.push(icon);
}
}
}
onIconClick(idx) {
if (!this.disabled) {
this.value = idx;
this.valueChange.emit(this.value);
}
}
swipeRight(event) {
}
swipeLeft(event) {
}
emitChangeEvent() {
this.controlValueAccessorChangeFn(this.value);
this.change.emit(new IconRatingWidgetChange(this, this.value));
}
/**
* Boilerplate / required for Angular
*
*/
writeValue(value) {
this.value = value;
}
registerOnChange(fn) {
this.controlValueAccessorChangeFn = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
/**
* Sets the input's disabled state. Implemented as a part of ControlValueAccessor.
* @param isDisabled Whether the input should be disabled.
*/
setDisabledState(isDisabled) {
this.disabled = isDisabled;
}
}
IconRatingWidgetComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: IconRatingWidgetComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
IconRatingWidgetComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.10", type: IconRatingWidgetComponent, selector: "tanj-icon-rating-widget", inputs: { value: "value", labelPosition: "labelPosition", disabled: "disabled", hideLabel: "hideLabel", onlyLabel: "onlyLabel", label: "label", defaultValue: "defaultValue", max: "max", iconFont: "iconFont", offIconNames: "offIconNames", onIconNames: "onIconNames" }, outputs: { valueChange: "valueChange", change: "change" }, host: { properties: { "attr.flex": "this.flex", "attr.layout": "this.flexLayout", "attr.layout-align": "this.flexLayoutAlign" } }, providers: [TANJ_ICON_RATING_WIDGET_VIEW_CONTROL_VALUE_ACCESSOR], usesOnChanges: true, ngImport: i0, template: `<!-- -->
<div flex
class="tanj-input-template tanj-mode-edit"
[ngClass]="{'tanj-disabled': disabled}"
layout="row"
layout-align="center center">
<span *ngIf="!hideLabel && labelPosition == 'before'"
class="tanj-label tanj-icon-rating-widget-label">{{label}}</span>
<div flex class="tanj-widget-input" layout="column" layout-align="start center">
<div *ngIf="!onlyLabel"
class="tanj-icon-rating-stars tanj-widget-input"
layout="column"
layout-align="start"
(swipeRight)="swipeRight($event)"
(swipeLeft)="swipeLeft($event)">
<div flex class="tanj-icon-rating-icons-container" layout="row" layout-align="start">
<tanj-icon *ngFor="let icon of icons; let idx = index" [icon]="icon" (click)="onIconClick(idx)"></tanj-icon>
</div>
</div>
<span *ngIf="!hideLabel && labelPosition == 'below'" class="tanj-label tanj-below">{{label}}</span>
</div>
<span *ngIf="!hideLabel && labelPosition == 'after'" class="tanj-label tanj-after tanj-icon-rating-widget-label">{{label}}</span>
</div>
`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.IconComponent, selector: "tanj-icon", inputs: ["icon", "align", "font", "ligature", "disabled", "label"], outputs: ["click"] }], encapsulation: i0.ViewEncapsulation.None });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: IconRatingWidgetComponent, decorators: [{
type: Component,
args: [{
selector: 'tanj-icon-rating-widget',
template: `<!-- -->
<div flex
class="tanj-input-template tanj-mode-edit"
[ngClass]="{'tanj-disabled': disabled}"
layout="row"
layout-align="center center">
<span *ngIf="!hideLabel && labelPosition == 'before'"
class="tanj-label tanj-icon-rating-widget-label">{{label}}</span>
<div flex class="tanj-widget-input" layout="column" layout-align="start center">
<div *ngIf="!onlyLabel"
class="tanj-icon-rating-stars tanj-widget-input"
layout="column"
layout-align="start"
(swipeRight)="swipeRight($event)"
(swipeLeft)="swipeLeft($event)">
<div flex class="tanj-icon-rating-icons-container" layout="row" layout-align="start">
<tanj-icon *ngFor="let icon of icons; let idx = index" [icon]="icon" (click)="onIconClick(idx)"></tanj-icon>
</div>
</div>
<span *ngIf="!hideLabel && labelPosition == 'below'" class="tanj-label tanj-below">{{label}}</span>
</div>
<span *ngIf="!hideLabel && labelPosition == 'after'" class="tanj-label tanj-after tanj-icon-rating-widget-label">{{label}}</span>
</div>
`,
providers: [TANJ_ICON_RATING_WIDGET_VIEW_CONTROL_VALUE_ACCESSOR],
encapsulation: ViewEncapsulation.None
}]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { flex: [{
type: HostBinding,
args: ['attr.flex']
}], flexLayout: [{
type: HostBinding,
args: ['attr.layout']
}], flexLayoutAlign: [{
type: HostBinding,
args: ['attr.layout-align']
}], value: [{
type: Input
}], valueChange: [{
type: Output
}], labelPosition: [{
type: Input
}], disabled: [{
type: Input
}], hideLabel: [{
type: Input
}], onlyLabel: [{
type: Input
}], label: [{
type: Input
}], defaultValue: [{
type: Input
}], max: [{
type: Input
}], iconFont: [{
type: Input
}], offIconNames: [{
type: Input
}], onIconNames: [{
type: Input
}], change: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi1yYXRpbmctd2lkZ2V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdlbnRpYWwvaW5wdXQtd2lkZ2V0cy9zcmMvbGliL2ljb24tcmF0aW5nLXdpZGdldC9pY29uLXJhdGluZy13aWRnZXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLEtBQUssRUFHTCxNQUFNLEVBRU4saUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFFTCxpQkFBaUIsRUFDbEIsTUFBTSxnQkFBZ0IsQ0FBQTtBQUV2QixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sa0JBQWtCLENBQUE7Ozs7QUFHdEM7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1EQUFtRCxHQUFRO0lBQ3RFLE9BQU8sRUFBTSxpQkFBaUI7SUFDOUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQztJQUN4RCxLQUFLLEVBQVEsSUFBSTtDQUNsQixDQUFDO0FBRUYsTUFBTSxPQUFPLHNCQUFzQjtJQUVqQyxZQUFtQixNQUFpQyxFQUFTLEtBQWE7UUFBdkQsV0FBTSxHQUFOLE1BQU0sQ0FBMkI7UUFBUyxVQUFLLEdBQUwsS0FBSyxDQUFRO0lBQzFFLENBQUM7Q0FDRjtBQWtDRCxNQUFNLE9BQU8seUJBQXlCO0lBa0NwQyxZQUFvQixpQkFBb0M7UUFBcEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQWhDeEQseUJBQXlCO1FBQ0MsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUNSLGVBQVUsR0FBRyxRQUFRLENBQUM7UUFDaEIsb0JBQWUsR0FBRyxPQUFPLENBQUM7UUFFbkQsVUFBSyxHQUFXLENBQUMsQ0FBQTtRQUNoQixnQkFB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Q0FBQyxtREFBbUQsQ0FBQywrQ0ExQnJEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tCQXlCQzs0RkFJTCx5QkFBeUI7a0JBL0JyQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBTyx5QkFBeUI7b0JBQ3hDLFFBQVEsRUFBTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztrQkF5QkM7b0JBQ2hCLFNBQVMsRUFBTSxDQUFDLG1EQUFtRCxDQUFDO29CQUNwRSxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtpQkFDdEM7d0dBSTJCLElBQUk7c0JBQTdCLFdBQVc7dUJBQUMsV0FBVztnQkFDSSxVQUFVO3NCQUFyQyxXQUFXO3VCQUFDLGFBQWE7Z0JBQ1EsZUFBZTtzQkFBaEQsV0FBVzt1QkFBQyxtQkFBbUI7Z0JBRXZCLEtBQUs7c0JBQWIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNO2dCQUVFLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBS0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdJLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2UsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQge1xuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgTkdfVkFMVUVfQUNDRVNTT1Jcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnXG5pbXBvcnQge0ljb25JRn0gZnJvbSAnQHRhbmdlbnRpYWwvY29tcG9uZW50cydcbmltcG9ydCB7SGFja3N9IGZyb20gJ0B0YW5nZW50aWFsL2NvcmUnXG5cblxuLyoqXG4gKiBQcm92aWRlciBFeHByZXNzaW9uIHRoYXQgYWxsb3dzIHRoaXMgd2lkZ2V0IHRvIHJlZ2lzdGVyIGFzIGEgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gKiBUaGlzIGFsbG93cyBpdCB0byBzdXBwb3J0IFsobmdNb2RlbCldLlxuICogQGRvY3MtcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgVEFOSl9JQ09OX1JBVElOR19XSURHRVRfVklFV19DT05UUk9MX1ZBTFVFX0FDQ0VTU09SOiBhbnkgPSB7XG4gIHByb3ZpZGU6ICAgICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gSWNvblJhdGluZ1dpZGdldENvbXBvbmVudCksXG4gIG11bHRpOiAgICAgICB0cnVlXG59O1xuXG5leHBvcnQgY2xhc3MgSWNvblJhdGluZ1dpZGdldENoYW5nZSB7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHNvdXJjZTogSWNvblJhdGluZ1dpZGdldENvbXBvbmVudCwgcHVibGljIHZhbHVlOiBudW1iZXIpIHtcbiAgfVxufVxuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogICAgICAndGFuai1pY29uLXJhdGluZy13aWRnZXQnLFxuICB0ZW1wbGF0ZTogICAgICBgPCEtLSAtLT5cbiAgPGRpdiBmbGV4XG4gICAgICAgY2xhc3M9XCJ0YW5qLWlucHV0LXRlbXBsYXRlIHRhbmotbW9kZS1lZGl0XCJcbiAgICAgICBbbmdDbGFzc109XCJ7J3RhbmotZGlzYWJsZWQnOiBkaXNhYmxlZH1cIlxuICAgICAgIGxheW91dD1cInJvd1wiXG4gICAgICAgbGF5b3V0LWFsaWduPVwiY2VudGVyIGNlbnRlclwiPlxuICAgIDxzcGFuICpuZ0lmPVwiIWhpZGVMYWJlbCAmJiBsYWJlbFBvc2l0aW9uID09ICdiZWZvcmUnXCJcbiAgICAgICAgICBjbGFzcz1cInRhbmotbGFiZWwgdGFuai1pY29uLXJhdGluZy13aWRnZXQtbGFiZWxcIj57e2xhYmVsfX08L3NwYW4+XG4gICAgPGRpdiBmbGV4IGNsYXNzPVwidGFuai13aWRnZXQtaW5wdXRcIiBsYXlvdXQ9XCJjb2x1bW5cIiBsYXlvdXQtYWxpZ249XCJzdGFydCBjZW50ZXJcIj5cbiAgICAgIDxkaXYgKm5nSWY9XCIhb25seUxhYmVsXCJcbiAgICAgICAgICAgY2xhc3M9XCJ0YW5qLWljb24tcmF0aW5nLXN0YXJzIHRhbmotd2lkZ2V0LWlucHV0XCJcbiAgICAgICAgICAgbGF5b3V0PVwiY29sdW1uXCJcbiAgICAgICAgICAgbGF5b3V0LWFsaWduPVwic3RhcnRcIlxuICAgICAgICAgICAoc3dpcGVSaWdodCk9XCJzd2lwZVJpZ2h0KCRldmVudClcIlxuICAgICAgICAgICAoc3dpcGVMZWZ0KT1cInN3aXBlTGVmdCgkZXZlbnQpXCI+XG5cbiAgICAgICAgPGRpdiBmbGV4IGNsYXNzPVwidGFuai1pY29uLXJhdGluZy1pY29ucy1jb250YWluZXJcIiBsYXlvdXQ9XCJyb3dcIiBsYXlvdXQtYWxpZ249XCJzdGFydFwiPlxuICAgICAgICAgIDx0YW5qLWljb24gKm5nRm9yPVwibGV0IGljb24gb2YgaWNvbnM7IGxldCBpZHggPSBpbmRleFwiIFtpY29uXT1cImljb25cIiAoY2xpY2spPVwib25JY29uQ2xpY2soaWR4KVwiPjwvdGFuai1pY29uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9kaXY+XG4gICAgICA8c3BhbiAqbmdJZj1cIiFoaWRlTGFiZWwgJiYgbGFiZWxQb3NpdGlvbiA9PSAnYmVsb3cnXCIgY2xhc3M9XCJ0YW5qLWxhYmVsIHRhbmotYmVsb3dcIj57e2xhYmVsfX08L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPHNwYW4gKm5nSWY9XCIhaGlkZUxhYmVsICYmIGxhYmVsUG9zaXRpb24gPT0gJ2FmdGVyJ1wiIGNsYXNzPVwidGFuai1sYWJlbCB0YW5qLWFmdGVyIHRhbmotaWNvbi1yYXRpbmctd2lkZ2V0LWxhYmVsXCI+e3tsYWJlbH19PC9zcGFuPlxuICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgYCxcbiAgcHJvdmlkZXJzOiAgICAgW1RBTkpfSUNPTl9SQVRJTkdfV0lER0VUX1ZJRVdfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUl0sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgSWNvblJhdGluZ1dpZGdldENvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkluaXQsIE9uQ2hhbmdlcyB7XG5cbiAgLy8gdHVybiB0aGlzIGludG8gYSBjbGFzc1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuZmxleCcpIGZsZXggPSAnJztcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmxheW91dCcpIGZsZXhMYXlvdXQgPSAnY29sdW1uJztcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmxheW91dC1hbGlnbicpIGZsZXhMYXlvdXRBbGlnbiA9ICdzdGFydCc7XG5cbiAgQElucHV0KCkgdmFsdWU6IG51bWJlciA9IDBcbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpXG5cbiAgQElucHV0KCkgbGFiZWxQb3NpdGlvbjogJ2JlZm9yZScgfCAnYWZ0ZXInIHwgJ2JlbG93JyA9ICdiZWZvcmUnXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2VcbiAgQElucHV0KCkgaGlkZUxhYmVsOiBib29sZWFuID0gZmFsc2VcbiAgQElucHV0KCkgb25seUxhYmVsOiBib29sZWFuID0gZmFsc2VcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBGaWVsZHNcbiAgICovXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnJ1xuICBASW5wdXQoKSBkZWZhdWx0VmFsdWU6IG51bWJlciA9IDBcbiAgQElucHV0KCkgbWF4OiBudW1iZXIgPSA1XG4gIEBJbnB1dCgpIGljb25Gb250OiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgQElucHV0KCkgb2ZmSWNvbk5hbWVzOiBzdHJpbmdbXSA9IFtdXG4gIEBJbnB1dCgpIG9uSWNvbk5hbWVzOiBzdHJpbmdbXSA9IFtdXG4gIC8qIGVuZCBDb25maWd1cmF0aW9uIEZpZWxkcyAqL1xuXG4gIEBPdXRwdXQoKSBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSlcblxuICBpY29uczogSWNvbklGW10gPSBbXVxuXG4gIG9uVG91Y2hlZDogKCkgPT4gYW55ID0gKCkgPT4geyB9O1xuICBwcml2YXRlIGNvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm46ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKHZhbHVlKSA9PiB7IH07XG5cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICB9XG5cblxuICBuZ09uSW5pdCgpIHtcbiAgICBIYWNrcy5tYXRlcmlhbERlc2lnblBsYWNlaG9sZGVyVGV4dCh0aGlzLmNoYW5nZURldGVjdG9yUmVmKVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogeyBjb25maWc6IFNpbXBsZUNoYW5nZSwgaXZhbDogU2ltcGxlQ2hhbmdlIH0pIHtcbiAgICBpZiAodGhpcy5tYXggJiYgdGhpcy5pY29uRm9udCAmJiB0aGlzLm9mZkljb25OYW1lcyAmJiB0aGlzLm9uSWNvbk5hbWVzKSB7XG4gICAgICB0aGlzLmljb25zID0gW11cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tYXg7IGkrKykge1xuICAgICAgICBjb25zdCBpY29uOiBJY29uSUYgPSB7XG4gICAgICAgICAgZm9udDogdGhpcy5pY29uRm9udCxcbiAgICAgICAgICBuYW1lOiBpIDw9IHRoaXMudmFsdWUgPyB0aGlzLm9uSWNvbk5hbWVzWzBdIDogdGhpcy5vZmZJY29uTmFtZXNbMF1cbiAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXIgICAgICAgICAgICAgICAgIHN0YXJfYm9yZGVyXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pY29ucy5wdXNoKGljb24pXG4gICAgICB9XG4gICAgfVxuICB9XG5cblxuICBvbkljb25DbGljayhpZHg6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy52YWx1ZSA9IGlkeFxuICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMudmFsdWUpXG4gICAgfVxuICB9XG5cblxuICBzd2lwZVJpZ2h0KGV2ZW50OiBhbnkpIHtcbiAgfVxuXG4gIHN3aXBlTGVmdChldmVudDogYW55KSB7XG4gIH1cblxuXG4gIGVtaXRDaGFuZ2VFdmVudCgpIHtcbiAgICB0aGlzLmNvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm4odGhpcy52YWx1ZSk7XG4gICAgdGhpcy5jaGFuZ2UuZW1pdChuZXcgSWNvblJhdGluZ1dpZGdldENoYW5nZSh0aGlzLCB0aGlzLnZhbHVlKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBCb2lsZXJwbGF0ZSAvIHJlcXVpcmVkIGZvciBBbmd1bGFyXG4gICAqXG4gICAqL1xuICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuID0gZm47XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgaW5wdXQncyBkaXNhYmxlZCBzdGF0ZS4gSW1wbGVtZW50ZWQgYXMgYSBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLlxuICAgKiBAcGFyYW0gaXNEaXNhYmxlZCBXaGV0aGVyIHRoZSBpbnB1dCBzaG91bGQgYmUgZGlzYWJsZWQuXG4gICAqL1xuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxufVxuIl19