design-angular-kit
Version:
Un toolkit Angular conforme alle linee guida di design per i servizi web della PA
149 lines • 27.6 kB
JavaScript
import { AsyncPipe, NgClass } from '@angular/common';
import { ChangeDetectionStrategy, Component, DestroyRef, EventEmitter, inject, Input, Optional, Output, Self } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { FormControlName, NgModel, ReactiveFormsModule } from '@angular/forms';
import { tap } from 'rxjs';
import { ItAbstractFormComponent } from '../../../abstracts/abstract-form.component';
import { TransferStore } from './store/transfer.store';
import { ItTransferListComponent } from './transfer-list/transfer-list.component';
import { TranslateModule } from '@ngx-translate/core';
import { ItIconComponent } from '../../utils/icon/icon.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "@ngx-translate/core";
import * as i3 from "./store/transfer.store";
/**
* Transfer
* @description Component that allows the creation of checkbox lists.
*/
export class ItTransferComponent extends ItAbstractFormComponent {
constructor(_ngControl, _translateService, store) {
super(_translateService, _ngControl);
this._ngControl = _ngControl;
this._translateService = _translateService;
this.store = store;
/**
* The select options (left side)
*/
this.options = [];
/**
* The selected options (right side)
*/
this.selected = [];
/**
* Fired when there is a transfer, a backtransfer or a reset event
*/
this.transferChanges = new EventEmitter();
/**
* Enable transfer button
* @default false
*/
this.transferEnabled = this.store.transferEnabled;
/**
* Enable backtransfer button
* @default false
*/
this.backtransferEnabled = this.store.backtransferEnabled;
/**
* Enable reset button
* @default false
*/
this.resetEnabled = this.store.resetEnabled;
this.destroyRef = inject(DestroyRef);
}
ngOnInit() {
super.ngOnInit();
this.storeInit();
this.onStoreValueChanged();
}
/**
* Transfer button click handler
*/
transferClickHandler(event) {
this.buttonEventHandler(event, () => this.store.transfer());
}
/**
* Transfer button keypress handler
*/
transferKeyPressHandler(event) {
this.buttonEventHandler(event, () => this.store.transfer());
}
/**
* Backtransfer button click handler
*/
backtransferClickHandler(event) {
this.buttonEventHandler(event, () => this.store.backtransfer());
}
/**
* Backtransfer button keypress handler
*/
backtransferKeyPressHandler(event) {
this.buttonEventHandler(event, () => this.store.backtransfer());
}
/**
* Reset button click handler
*/
resetClickHandler(event) {
this.buttonEventHandler(event, () => this.store.reset());
}
/**
* Reset button keypress handler
*/
resetKeyPressHandler(event) {
this.buttonEventHandler(event, () => this.store.reset());
}
buttonEventHandler(event, updateStoreCb) {
event.preventDefault();
updateStoreCb();
}
storeInit() {
let target = [];
const ngControl = this._ngControl;
const isNgControlDefined = Boolean(this._ngControl);
// if ngControl is defined, take values from it. Input() target will be ignored
if (isNgControlDefined) {
console.debug('ngControl instanceof NgModel:', ngControl instanceof NgModel);
console.debug('ngControl instanceof FormControlName:', ngControl instanceof FormControlName);
// if ngControl is an ngModel (template-driven form use case), take values from it
if (ngControl instanceof NgModel) {
console.debug('ngControl instanceof NgModel');
const model = ngControl.model;
target = Array.isArray(model) ? model : [];
}
// if ngControl is an FormControlName (reactive form use case), take values from it
if (ngControl instanceof FormControlName) {
console.debug('ngControl instanceof FormControlName');
const model = ngControl.control.value;
target = Array.isArray(model) ? model : [];
}
console.debug('ngControl is defined. Input() target will be ignored');
}
else if (this.selected && Array.isArray(this.selected)) {
target = [...this.selected];
}
console.debug('target:', this.selected, 'formControl:', this.control.value, 'ngModel:', this._ngControl);
this.store.init({ source: [...this.options], target });
}
onStoreValueChanged() {
this.store.valueChanged
.pipe(takeUntilDestroyed(this.destroyRef), tap(value => this.writeValue(value)), tap(value => this.onChange(value)), tap(value => this.transferChanges.emit(value)))
.subscribe();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItTransferComponent, deps: [{ token: i1.NgControl, optional: true, self: true }, { token: i2.TranslateService }, { token: i3.TransferStore }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: ItTransferComponent, isStandalone: true, selector: "it-transfer", inputs: { options: "options", selected: "selected" }, outputs: { transferChanges: "transferChanges" }, providers: [TransferStore], usesInheritance: true, ngImport: i0, template: "<div>\n @if (label) {\n <label [for]=\"id\" [class.active]=\"!!control.value\">{{ label }}</label>\n }\n <div class=\"row\">\n <div class=\"col-xs-12 col-md-5\">\n <it-transfer-list sourceType=\"source\" [title]=\"'it.transfer.source' | translate\"></it-transfer-list>\n </div>\n <!-- col -->\n <div class=\"col-xs-12 col-md-2\">\n <!-- transfer buttons-->\n <div class=\"it-transfer-buttons\">\n <a\n class=\"transfer\"\n role=\"button\"\n href=\"#\"\n [ngClass]=\"{ active: transferEnabled | async }\"\n (click)=\"transferClickHandler($event)\"\n (keypress)=\"transferKeyPressHandler($event)\"\n [attr.aria-label]=\"'it.transfer.aria-label-move-forward' | translate\">\n <it-icon name=\"arrow-right\"></it-icon>\n </a>\n <span class=\"visually-hidden\">{{ 'it.transfer.label-move-forward' | translate }}</span>\n <a\n class=\"backtransfer\"\n role=\"button\"\n href=\"#\"\n [ngClass]=\"{ active: backtransferEnabled | async }\"\n (click)=\"backtransferClickHandler($event)\"\n (keypress)=\"backtransferKeyPressHandler($event)\"\n [attr.aria-label]=\"'it.transfer.aria-label-move-backward' | translate\">\n <it-icon name=\"arrow-left\"></it-icon>\n </a>\n <span class=\"visually-hidden\">{{ 'it.transfer.label-move-backward' | translate }}</span>\n <a\n class=\"reset\"\n role=\"button\"\n href=\"#\"\n [ngClass]=\"{ active: resetEnabled | async }\"\n (click)=\"resetClickHandler($event)\"\n (keypress)=\"resetKeyPressHandler($event)\"\n [attr.aria-label]=\"'it.transfer.aria-label-reset' | translate\">\n <it-icon name=\"restore\"></it-icon>\n </a>\n <span class=\"visually-hidden\">{{ 'it.transfer.label-reset' | translate }}</span>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-5\">\n <it-transfer-list sourceType=\"target\" [title]=\"'it.transfer.target' | translate\"></it-transfer-list>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "component", type: ItIconComponent, selector: "it-icon", inputs: ["name", "size", "color", "padded", "svgClass", "title", "labelWaria"] }, { kind: "component", type: ItTransferListComponent, selector: "it-transfer-list" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: ReactiveFormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItTransferComponent, decorators: [{
type: Component,
args: [{ selector: 'it-transfer', standalone: true, imports: [TranslateModule, ItIconComponent, ItTransferListComponent, NgClass, AsyncPipe, ReactiveFormsModule], providers: [TransferStore], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div>\n @if (label) {\n <label [for]=\"id\" [class.active]=\"!!control.value\">{{ label }}</label>\n }\n <div class=\"row\">\n <div class=\"col-xs-12 col-md-5\">\n <it-transfer-list sourceType=\"source\" [title]=\"'it.transfer.source' | translate\"></it-transfer-list>\n </div>\n <!-- col -->\n <div class=\"col-xs-12 col-md-2\">\n <!-- transfer buttons-->\n <div class=\"it-transfer-buttons\">\n <a\n class=\"transfer\"\n role=\"button\"\n href=\"#\"\n [ngClass]=\"{ active: transferEnabled | async }\"\n (click)=\"transferClickHandler($event)\"\n (keypress)=\"transferKeyPressHandler($event)\"\n [attr.aria-label]=\"'it.transfer.aria-label-move-forward' | translate\">\n <it-icon name=\"arrow-right\"></it-icon>\n </a>\n <span class=\"visually-hidden\">{{ 'it.transfer.label-move-forward' | translate }}</span>\n <a\n class=\"backtransfer\"\n role=\"button\"\n href=\"#\"\n [ngClass]=\"{ active: backtransferEnabled | async }\"\n (click)=\"backtransferClickHandler($event)\"\n (keypress)=\"backtransferKeyPressHandler($event)\"\n [attr.aria-label]=\"'it.transfer.aria-label-move-backward' | translate\">\n <it-icon name=\"arrow-left\"></it-icon>\n </a>\n <span class=\"visually-hidden\">{{ 'it.transfer.label-move-backward' | translate }}</span>\n <a\n class=\"reset\"\n role=\"button\"\n href=\"#\"\n [ngClass]=\"{ active: resetEnabled | async }\"\n (click)=\"resetClickHandler($event)\"\n (keypress)=\"resetKeyPressHandler($event)\"\n [attr.aria-label]=\"'it.transfer.aria-label-reset' | translate\">\n <it-icon name=\"restore\"></it-icon>\n </a>\n <span class=\"visually-hidden\">{{ 'it.transfer.label-reset' | translate }}</span>\n </div>\n </div>\n <div class=\"col-xs-12 col-md-5\">\n <it-transfer-list sourceType=\"target\" [title]=\"'it.transfer.target' | translate\"></it-transfer-list>\n </div>\n </div>\n</div>\n" }]
}], ctorParameters: () => [{ type: i1.NgControl, decorators: [{
type: Self
}, {
type: Optional
}] }, { type: i2.TranslateService }, { type: i3.TransferStore }], propDecorators: { options: [{
type: Input
}], selected: [{
type: Input
}], transferChanges: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWFuZ3VsYXIta2l0L3NyYy9saWIvY29tcG9uZW50cy9mb3JtL3RyYW5zZmVyL3RyYW5zZmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS90cmFuc2Zlci90cmFuc2Zlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVJLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQWEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUYsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNyRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFbEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7QUFFbEU7OztHQUdHO0FBU0gsTUFBTSxPQUFPLG1CQUE2QixTQUFRLHVC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bGFzcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBEZXN0cm95UmVmLCBFdmVudEVtaXR0ZXIsIGluamVjdCwgSW5wdXQsIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dCwgU2VsZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2xOYW1lLCBOZ0NvbnRyb2wsIE5nTW9kZWwsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEl0QWJzdHJhY3RGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vYWJzdHJhY3RzL2Fic3RyYWN0LWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IFRyYW5zZmVyU3RvcmUgfSBmcm9tICcuL3N0b3JlL3RyYW5zZmVyLnN0b3JlJztcbmltcG9ydCB7IEl0VHJhbnNmZXJMaXN0Q29tcG9uZW50IH0gZnJvbSAnLi90cmFuc2Zlci1saXN0L3RyYW5zZmVyLWxpc3QuY29tcG9uZW50JztcbmltcG9ydCB7IFRyYW5zZmVySXRlbSB9IGZyb20gJy4vdHJhbnNmZXIubW9kZWwnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBJdEljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi91dGlscy9pY29uL2ljb24uY29tcG9uZW50JztcblxuLyoqXG4gKiBUcmFuc2ZlclxuICogQGRlc2NyaXB0aW9uIENvbXBvbmVudCB0aGF0IGFsbG93cyB0aGUgY3JlYXRpb24gb2YgY2hlY2tib3ggbGlzdHMuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2l0LXRyYW5zZmVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgdGVtcGxhdGVVcmw6ICcuL3RyYW5zZmVyLmNvbXBvbmVudC5odG1sJyxcbiAgaW1wb3J0czogW1RyYW5zbGF0ZU1vZHVsZSwgSXRJY29uQ29tcG9uZW50LCBJdFRyYW5zZmVyTGlzdENvbXBvbmVudCwgTmdDbGFzcywgQXN5bmNQaXBlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlXSxcbiAgcHJvdmlkZXJzOiBbVHJhbnNmZXJTdG9yZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBJdFRyYW5zZmVyQ29tcG9uZW50PFQgPSBhbnk+IGV4dGVuZHMgSXRBYnN0cmFjdEZvcm1Db21wb25lbnQ8VD4gaW1wbGVtZW50cyBPbkluaXQge1xuICAvKipcbiAgICogVGhlIHNlbGVjdCBvcHRpb25zIChsZWZ0IHNpZGUpXG4gICAqL1xuICBASW5wdXQoKSBvcHRpb25zID0gW107XG4gIC8qKlxuICAgKiBUaGUgc2VsZWN0ZWQgb3B0aW9ucyAocmlnaHQgc2lkZSlcbiAgICovXG4gIEBJbnB1dCgpIHNlbGVjdGVkID0gW107XG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIHRoZXJlIGlzIGEgdHJhbnNmZXIsIGEgYmFja3RyYW5zZmVyIG9yIGEgcmVzZXQgZXZlbnRcbiAgICovXG4gIEBPdXRwdXQoKSByZWFkb25seSB0cmFuc2ZlckNoYW5nZXMgPSBuZXcgRXZlbnRFbWl0dGVyPFRyYW5zZmVySXRlbTxUPltdPigpO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgdHJhbnNmZXIgYnV0dG9uXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSB0cmFuc2ZlckVuYWJsZWQgPSB0aGlzLnN0b3JlLnRyYW5zZmVyRW5hYmxlZDtcbiAgLyoqXG4gICAqIEVuYWJsZSBiYWNrdHJhbnNmZXIgYnV0dG9uXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBiYWNrdHJhbnNmZXJFbmFibGVkID0gdGhpcy5zdG9yZS5iYWNrdHJhbnNmZXJFbmFibGVkO1xuICAvKipcbiAgICogRW5hYmxlIHJlc2V0IGJ1dHRvblxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgcmVzZXRFbmFibGVkID0gdGhpcy5zdG9yZS5yZXNldEVuYWJsZWQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBTZWxmKClcbiAgICBAT3B0aW9uYWwoKVxuICAgIG92ZXJyaWRlIHJlYWRvbmx5IF9uZ0NvbnRyb2w6IE5nQ29udHJvbCxcbiAgICBvdmVycmlkZSByZWFkb25seSBfdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlOiBUcmFuc2ZlclN0b3JlPFQ+XG4gICkge1xuICAgIHN1cGVyKF90cmFuc2xhdGVTZXJ2aWNlLCBfbmdDb250cm9sKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nT25Jbml0KCkge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgdGhpcy5zdG9yZUluaXQoKTtcbiAgICB0aGlzLm9uU3RvcmVWYWx1ZUNoYW5nZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2ZlciBidXR0b24gY2xpY2sgaGFuZGxlclxuICAgKi9cbiAgdHJhbnNmZXJDbGlja0hhbmRsZXIoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLmJ1dHRvbkV2ZW50SGFuZGxlcihldmVudCwgKCkgPT4gdGhpcy5zdG9yZS50cmFuc2ZlcigpKTtcbiAgfVxuICAvKipcbiAgICogVHJhbnNmZXIgYnV0dG9uIGtleXByZXNzIGhhbmRsZXJcbiAgICovXG4gIHRyYW5zZmVyS2V5UHJlc3NIYW5kbGVyKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgdGhpcy5idXR0b25FdmVudEhhbmRsZXIoZXZlbnQsICgpID0+IHRoaXMuc3RvcmUudHJhbnNmZXIoKSk7XG4gIH1cbiAgLyoqXG4gICAqIEJhY2t0cmFuc2ZlciBidXR0b24gY2xpY2sgaGFuZGxlclxuICAgKi9cbiAgYmFja3RyYW5zZmVyQ2xpY2tIYW5kbGVyKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy5idXR0b25FdmVudEhhbmRsZXIoZXZlbnQsICgpID0+IHRoaXMuc3RvcmUuYmFja3RyYW5zZmVyKCkpO1xuICB9XG4gIC8qKlxuICAgKiBCYWNrdHJhbnNmZXIgYnV0dG9uIGtleXByZXNzIGhhbmRsZXJcbiAgICovXG4gIGJhY2t0cmFuc2ZlcktleVByZXNzSGFuZGxlcihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIHRoaXMuYnV0dG9uRXZlbnRIYW5kbGVyKGV2ZW50LCAoKSA9PiB0aGlzLnN0b3JlLmJhY2t0cmFuc2ZlcigpKTtcbiAgfVxuICAvKipcbiAgICogUmVzZXQgYnV0dG9uIGNsaWNrIGhhbmRsZXJcbiAgICovXG4gIHJlc2V0Q2xpY2tIYW5kbGVyKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy5idXR0b25FdmVudEhhbmRsZXIoZXZlbnQsICgpID0+IHRoaXMuc3RvcmUucmVzZXQoKSk7XG4gIH1cbiAgLyoqXG4gICAqIFJlc2V0IGJ1dHRvbiBrZXlwcmVzcyBoYW5kbGVyXG4gICAqL1xuICByZXNldEtleVByZXNzSGFuZGxlcihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIHRoaXMuYnV0dG9uRXZlbnRIYW5kbGVyKGV2ZW50LCAoKSA9PiB0aGlzLnN0b3JlLnJlc2V0KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBidXR0b25FdmVudEhhbmRsZXIoZXZlbnQ6IEV2ZW50LCB1cGRhdGVTdG9yZUNiOiAoKSA9PiB2b2lkKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB1cGRhdGVTdG9yZUNiKCk7XG4gIH1cblxuICBwcml2YXRlIHN0b3JlSW5pdCgpIHtcbiAgICBsZXQgdGFyZ2V0ID0gW107XG4gICAgY29uc3QgbmdDb250cm9sID0gdGhpcy5fbmdDb250cm9sO1xuICAgIGNvbnN0IGlzTmdDb250cm9sRGVmaW5lZCA9IEJvb2xlYW4odGhpcy5fbmdDb250cm9sKTtcblxuICAgIC8vIGlmIG5nQ29udHJvbCBpcyBkZWZpbmVkLCB0YWtlIHZhbHVlcyBmcm9tIGl0LiBJbnB1dCgpIHRhcmdldCB3aWxsIGJlIGlnbm9yZWRcbiAgICBpZiAoaXNOZ0NvbnRyb2xEZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKCduZ0NvbnRyb2wgaW5zdGFuY2VvZiBOZ01vZGVsOicsIG5nQ29udHJvbCBpbnN0YW5jZW9mIE5nTW9kZWwpO1xuICAgICAgY29uc29sZS5kZWJ1ZygnbmdDb250cm9sIGluc3RhbmNlb2YgRm9ybUNvbnRyb2xOYW1lOicsIG5nQ29udHJvbCBpbnN0YW5jZW9mIEZvcm1Db250cm9sTmFtZSk7XG5cbiAgICAgIC8vIGlmIG5nQ29udHJvbCBpcyBhbiBuZ01vZGVsICh0ZW1wbGF0ZS1kcml2ZW4gZm9ybSB1c2UgY2FzZSksIHRha2UgdmFsdWVzIGZyb20gaXRcbiAgICAgIGlmIChuZ0NvbnRyb2wgaW5zdGFuY2VvZiBOZ01vZGVsKSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ25nQ29udHJvbCBpbnN0YW5jZW9mIE5nTW9kZWwnKTtcbiAgICAgICAgY29uc3QgbW9kZWwgPSAobmdDb250cm9sIGFzIE5nTW9kZWwpLm1vZGVsO1xuICAgICAgICB0YXJnZXQgPSBBcnJheS5pc0FycmF5KG1vZGVsKSA/IG1vZGVsIDogW107XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIG5nQ29udHJvbCBpcyBhbiBGb3JtQ29udHJvbE5hbWUgKHJlYWN0aXZlIGZvcm0gdXNlIGNhc2UpLCB0YWtlIHZhbHVlcyBmcm9tIGl0XG4gICAgICBpZiAobmdDb250cm9sIGluc3RhbmNlb2YgRm9ybUNvbnRyb2xOYW1lKSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ25nQ29udHJvbCBpbnN0YW5jZW9mIEZvcm1Db250cm9sTmFtZScpO1xuICAgICAgICBjb25zdCBtb2RlbCA9IChuZ0NvbnRyb2wgYXMgRm9ybUNvbnRyb2xOYW1lKS5jb250cm9sLnZhbHVlO1xuICAgICAgICB0YXJnZXQgPSBBcnJheS5pc0FycmF5KG1vZGVsKSA/IG1vZGVsIDogW107XG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUuZGVidWcoJ25nQ29udHJvbCBpcyBkZWZpbmVkLiBJbnB1dCgpIHRhcmdldCB3aWxsIGJlIGlnbm9yZWQnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWQgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGVkKSkge1xuICAgICAgdGFyZ2V0ID0gWy4uLnRoaXMuc2VsZWN0ZWRdO1xuICAgIH1cblxuICAgIGNvbnNvbGUuZGVidWcoJ3RhcmdldDonLCB0aGlzLnNlbGVjdGVkLCAnZm9ybUNvbnRyb2w6JywgdGhpcy5jb250cm9sLnZhbHVlLCAnbmdNb2RlbDonLCB0aGlzLl9uZ0NvbnRyb2wpO1xuICAgIHRoaXMuc3RvcmUuaW5pdCh7IHNvdXJjZTogWy4uLnRoaXMub3B0aW9uc10sIHRhcmdldCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb25TdG9yZVZhbHVlQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnN0b3JlLnZhbHVlQ2hhbmdlZFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpLFxuICAgICAgICB0YXAodmFsdWUgPT4gdGhpcy53cml0ZVZhbHVlKHZhbHVlIGFzIFQpKSxcbiAgICAgICAgdGFwKHZhbHVlID0+IHRoaXMub25DaGFuZ2UodmFsdWUgYXMgVCkpLFxuICAgICAgICB0YXAodmFsdWUgPT4gdGhpcy50cmFuc2ZlckNoYW5nZXMuZW1pdCh2YWx1ZSkpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiIsIjxkaXY+XG4gIEBpZiAobGFiZWwpIHtcbiAgICA8bGFiZWwgW2Zvcl09XCJpZFwiIFtjbGFzcy5hY3RpdmVdPVwiISFjb250cm9sLnZhbHVlXCI+e3sgbGFiZWwgfX08L2xhYmVsPlxuICB9XG4gIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLTEyIGNvbC1tZC01XCI+XG4gICAgICA8aXQtdHJhbnNmZXItbGlzdCBzb3VyY2VUeXBlPVwic291cmNlXCIgW3RpdGxlXT1cIidpdC50cmFuc2Zlci5zb3VyY2UnIHwgdHJhbnNsYXRlXCI+PC9pdC10cmFuc2Zlci1saXN0PlxuICAgIDwvZGl2PlxuICAgIDwhLS0gY29sIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wteHMtMTIgY29sLW1kLTJcIj5cbiAgICAgIDwhLS0gdHJhbnNmZXIgYnV0dG9ucy0tPlxuICAgICAgPGRpdiBjbGFzcz1cIml0LXRyYW5zZmVyLWJ1dHRvbnNcIj5cbiAgICAgICAgPGFcbiAgICAgICAgICBjbGFzcz1cInRyYW5zZmVyXCJcbiAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICBocmVmPVwiI1wiXG4gICAgICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IHRyYW5zZmVyRW5hYmxlZCB8IGFzeW5jIH1cIlxuICAgICAgICAgIChjbGljayk9XCJ0cmFuc2ZlckNsaWNrSGFuZGxlcigkZXZlbnQpXCJcbiAgICAgICAgICAoa2V5cHJlc3MpPVwidHJhbnNmZXJLZXlQcmVzc0hhbmRsZXIoJGV2ZW50KVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInaXQudHJhbnNmZXIuYXJpYS1sYWJlbC1tb3ZlLWZvcndhcmQnIHwgdHJhbnNsYXRlXCI+XG4gICAgICAgICAgPGl0LWljb24gbmFtZT1cImFycm93LXJpZ2h0XCI+PC9pdC1pY29uPlxuICAgICAgICA8L2E+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+e3sgJ2l0LnRyYW5zZmVyLmxhYmVsLW1vdmUtZm9yd2FyZCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgIDxhXG4gICAgICAgICAgY2xhc3M9XCJiYWNrdHJhbnNmZXJcIlxuICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgIGhyZWY9XCIjXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7IGFjdGl2ZTogYmFja3RyYW5zZmVyRW5hYmxlZCB8IGFzeW5jIH1cIlxuICAgICAgICAgIChjbGljayk9XCJiYWNrdHJhbnNmZXJDbGlja0hhbmRsZXIoJGV2ZW50KVwiXG4gICAgICAgICAgKGtleXByZXNzKT1cImJhY2t0cmFuc2ZlcktleVByZXNzSGFuZGxlcigkZXZlbnQpXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidpdC50cmFuc2Zlci5hcmlhLWxhYmVsLW1vdmUtYmFja3dhcmQnIHwgdHJhbnNsYXRlXCI+XG4gICAgICAgICAgPGl0LWljb24gbmFtZT1cImFycm93LWxlZnRcIj48L2l0LWljb24+XG4gICAgICAgIDwvYT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj57eyAnaXQudHJhbnNmZXIubGFiZWwtbW92ZS1iYWNrd2FyZCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgIDxhXG4gICAgICAgICAgY2xhc3M9XCJyZXNldFwiXG4gICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgaHJlZj1cIiNcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiByZXNldEVuYWJsZWQgfCBhc3luYyB9XCJcbiAgICAgICAgICAoY2xpY2spPVwicmVzZXRDbGlja0hhbmRsZXIoJGV2ZW50KVwiXG4gICAgICAgICAgKGtleXByZXNzKT1cInJlc2V0S2V5UHJlc3NIYW5kbGVyKCRldmVudClcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ2l0LnRyYW5zZmVyLmFyaWEtbGFiZWwtcmVzZXQnIHwgdHJhbnNsYXRlXCI+XG4gICAgICAgICAgPGl0LWljb24gbmFtZT1cInJlc3RvcmVcIj48L2l0LWljb24+XG4gICAgICAgIDwvYT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj57eyAnaXQudHJhbnNmZXIubGFiZWwtcmVzZXQnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbC14cy0xMiBjb2wtbWQtNVwiPlxuICAgICAgPGl0LXRyYW5zZmVyLWxpc3Qgc291cmNlVHlwZT1cInRhcmdldFwiIFt0aXRsZV09XCInaXQudHJhbnNmZXIudGFyZ2V0JyB8IHRyYW5zbGF0ZVwiPjwvaXQtdHJhbnNmZXItbGlzdD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==