UNPKG

design-angular-kit

Version:

Un toolkit Angular conforme alle linee guida di design per i servizi web della PA

303 lines (301 loc) 31.3 kB
import { AsyncPipe, NgTemplateOutlet } from '@angular/common'; import { ChangeDetectionStrategy, Component, DestroyRef, inject, Input, ViewChild, ViewEncapsulation, } from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { BehaviorSubject, delay, tap } from 'rxjs'; import videojs from 'video.js'; import { ItAbstractComponent } from '../../../abstracts/abstract.component'; import { VideoPlayerI18nService } from './video-player-i18n.service'; import { cookies } from './video-player.cookie'; import * as i0 from "@angular/core"; import * as i1 from "./video-player.config"; var ViewType; (function (ViewType) { ViewType["Default"] = "DEFAULT"; ViewType["Overlay"] = "OVERLAY"; })(ViewType || (ViewType = {})); /** * Video Player * @description Component that allows playing a video. */ export class ItVideoPlayerComponent extends ItAbstractComponent { #destroyRef; get viewType() { return this.viewType$.value; } constructor(config) { super(); this.config = config; this.viewTypes = ViewType; this.viewType$ = new BehaviorSubject(undefined); this.cookieAccepted$ = new BehaviorSubject(false); this.i18nService = inject(VideoPlayerI18nService); this.#destroyRef = inject(DestroyRef); } async ngOnInit() { const config = this.config.mergeConfig(this.options); this.setViewType(config); await this.config.configureTech(config); if (!this.videoPlayerRef) { this.cookieAccepted$ .pipe(takeUntilDestroyed(this.#destroyRef), delay(0), tap({ next: value => { if (value && !this.player) { this.initVideoPlayer(); } }, })) .subscribe(); return; } this.initVideoPlayer(); } ngAfterViewInit() { if (this.viewType === ViewType.Overlay && cookies.isChoiceRemembered('youtube.com')) { this.hideOverlay(); } } ngOnDestroy() { if (this.player) { this.player.dispose(); } } acceptCookieHandler() { this.rememberHandler(); this.hideOverlay(); this.cookieAccepted$.next(true); } initVideoPlayer() { const config = this.config.mergeConfig(this.options); this.setVideoAttributes(config); this.setVideoPlayer(); } setVideoPlayer() { const config = this.config.mergeConfig(this.options); const onPlayerReadyCb = () => { if (!this.player) { return; } this.i18nService.init(this.player, this.#destroyRef); }; if (!this.videoPlayerRef) { throw Error('videoPlayerRef is undefined'); } this.player = videojs(this.videoPlayerRef.nativeElement, config, onPlayerReadyCb.bind(this)); } setViewType(config) { this.viewType$.next(config.tech === 'youtube' ? ViewType.Overlay : ViewType.Default); this.cookieAccepted$.next(this.viewType === ViewType.Overlay && cookies.isChoiceRemembered('youtube.com')); } hideOverlay() { if (!this.acceptOverlayableRef) { return; } const classes = ['show']; this.acceptOverlayableRef.nativeElement.classList.remove(...classes); if (!this.acceptOveralyRef) { return; } this.acceptOveralyRef.nativeElement.classList.remove(...classes); this.acceptOveralyRef.nativeElement.setAttribute('aria-hidden', 'true'); } rememberHandler() { if (!this.chrRememberRef) { return; } const remember = this.chrRememberRef.nativeElement.checked; cookies.rememberChoice('youtube.com', remember); } setVideoAttributes(options) { if (!this.videoPlayerRef) { return; } const v = this.videoPlayerRef.nativeElement; const { autoplay, controls, loop, muted, poster, fluid } = options; if (autoplay) { v.setAttribute('autoplay', autoplay.toString()); } if (controls) { v.setAttribute('controls', ''); } if (loop) { v.setAttribute('loop', ''); } if (muted) { v.setAttribute('muted', ''); } if (poster) { v.setAttribute('poster', poster); } if (fluid) { v.setAttribute('fluid', ''); } v.setAttribute('preload', 'none'); v.setAttribute('playsinline', ''); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItVideoPlayerComponent, deps: [{ token: i1.VideoPlayerConfigService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: ItVideoPlayerComponent, isStandalone: true, selector: "it-video-player", inputs: { options: "options" }, viewQueries: [{ propertyName: "videoPlayerRef", first: true, predicate: ["videoPlayer"], descendants: true }, { propertyName: "acceptOveralyRef", first: true, predicate: ["acceptOveraly"], descendants: true }, { propertyName: "acceptOverlayableRef", first: true, predicate: ["acceptOverlayable"], descendants: true }, { propertyName: "chrRememberRef", first: true, predicate: ["chkRemember"], descendants: true }], usesInheritance: true, ngImport: i0, template: `@switch (viewType$ | async) { @case (viewTypes.Default) { <div class="row"> <ng-container *ngTemplateOutlet="videoTemplate"></ng-container> <ng-container *ngTemplateOutlet="transcriptionTemplate"></ng-container> </div> } @case (viewTypes.Overlay) { <div #acceptOverlayable class="acceptoverlayable show"> <div #acceptOveraly class="acceptoverlay acceptoverlay-primary fade show"> <div class="acceptoverlay-inner"> <div class="acceptoverlay-icon"> <svg class="icon icon-xl"><use href="/bootstrap-italia/dist/svg/sprites.svg#it-video"></use></svg> </div> <p> Accetta i cookie di YouTube per vedere il video. Puoi gestire le preferenze nella <a href="#" class="text-white">cookie policy</a>. </p> <div class="acceptoverlay-buttons bg-dark"> <button type="button" class="btn btn-primary" (click)="acceptCookieHandler()">Accetta</button> <div class="form-check"> <input id="chk-remember{{ id }}" type="checkbox" #chkRemember /> <label for="chk-remember{{ id }}">Ricorda per tutti i video</label> </div> </div> </div> </div> @if (cookieAccepted$ | async) { <div> <ng-container *ngTemplateOutlet="videoTemplate"></ng-container> <ng-container *ngTemplateOutlet="transcriptionTemplate"></ng-container> </div> } </div> } @default { <h1>No video provider</h1> } } <ng-template #videoTemplate> <div> <video #videoPlayer class="video-js vjs-theme-bootstrap-italia vjs-fluid vjs-big-play-centered"></video> </div> </ng-template> <ng-template #transcriptionTemplate> <div class="vjs-transcription accordion"> <div class="accordion-item"> <h2 class="accordion-header " id="transcription-{{ id }}-head"> <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" [attr.data-bs-target]="'#transcription-' + id" [attr.aria-controls]="'transcription-' + id" aria-expanded="true"> <ng-content select="[transcriptionTitle]">Trascrizione</ng-content> </button> </h2> <div id="transcription-{{ id }}" class="accordion-collapse collapse" role="region" [attr.aria-labelledby]="'transcription-' + id + '-head'"> <div class="accordion-body"> <ng-content select="[transcriptionText]">-</ng-content> </div> </div> </div> </div> </ng-template> `, isInline: true, dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: ItVideoPlayerComponent, decorators: [{ type: Component, args: [{ standalone: true, selector: 'it-video-player', template: `@switch (viewType$ | async) { @case (viewTypes.Default) { <div class="row"> <ng-container *ngTemplateOutlet="videoTemplate"></ng-container> <ng-container *ngTemplateOutlet="transcriptionTemplate"></ng-container> </div> } @case (viewTypes.Overlay) { <div #acceptOverlayable class="acceptoverlayable show"> <div #acceptOveraly class="acceptoverlay acceptoverlay-primary fade show"> <div class="acceptoverlay-inner"> <div class="acceptoverlay-icon"> <svg class="icon icon-xl"><use href="/bootstrap-italia/dist/svg/sprites.svg#it-video"></use></svg> </div> <p> Accetta i cookie di YouTube per vedere il video. Puoi gestire le preferenze nella <a href="#" class="text-white">cookie policy</a>. </p> <div class="acceptoverlay-buttons bg-dark"> <button type="button" class="btn btn-primary" (click)="acceptCookieHandler()">Accetta</button> <div class="form-check"> <input id="chk-remember{{ id }}" type="checkbox" #chkRemember /> <label for="chk-remember{{ id }}">Ricorda per tutti i video</label> </div> </div> </div> </div> @if (cookieAccepted$ | async) { <div> <ng-container *ngTemplateOutlet="videoTemplate"></ng-container> <ng-container *ngTemplateOutlet="transcriptionTemplate"></ng-container> </div> } </div> } @default { <h1>No video provider</h1> } } <ng-template #videoTemplate> <div> <video #videoPlayer class="video-js vjs-theme-bootstrap-italia vjs-fluid vjs-big-play-centered"></video> </div> </ng-template> <ng-template #transcriptionTemplate> <div class="vjs-transcription accordion"> <div class="accordion-item"> <h2 class="accordion-header " id="transcription-{{ id }}-head"> <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" [attr.data-bs-target]="'#transcription-' + id" [attr.aria-controls]="'transcription-' + id" aria-expanded="true"> <ng-content select="[transcriptionTitle]">Trascrizione</ng-content> </button> </h2> <div id="transcription-{{ id }}" class="accordion-collapse collapse" role="region" [attr.aria-labelledby]="'transcription-' + id + '-head'"> <div class="accordion-body"> <ng-content select="[transcriptionText]">-</ng-content> </div> </div> </div> </div> </ng-template> `, imports: [AsyncPipe, NgTemplateOutlet], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, }] }], ctorParameters: () => [{ type: i1.VideoPlayerConfigService }], propDecorators: { options: [{ type: Input }], videoPlayerRef: [{ type: ViewChild, args: ['videoPlayer', { static: false }] }], acceptOveralyRef: [{ type: ViewChild, args: ['acceptOveraly', { static: false }] }], acceptOverlayableRef: [{ type: ViewChild, args: ['acceptOverlayable', { static: false }] }], chrRememberRef: [{ type: ViewChild, args: ['chkRemember', { static: false }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlkZW8tcGxheWVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvY29yZS92aWRlby1wbGF5ZXIvdmlkZW8tcGxheWVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUQsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUVWLE1BQU0sRUFDTixLQUFLLEVBR0wsU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxPQUFPLE1BQU0sVUFBVSxDQUFDO0FBRS9CLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRXJFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7O0FBR2hELElBQUssUUFHSjtBQUhELFdBQUssUUFBUTtJQUNYLCtCQUFtQixDQUFBO0lBQ25CLCtCQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFISSxRQUFRLEtBQVIsUUFBUSxRQUdaO0FBRUQ7OztHQUdHO0FBK0VILE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxtQkFBbUI7SUF3QnBELFdBQVcsQ0FBc0I7SUFFMUMsSUFBWSxRQUFRO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7SUFDOUIsQ0FBQztJQUVELFlBQW9CLE1BQWdDO1FB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O1FBQ2xDLENBQUMsQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7OEdBaEtVLHNCQUFzQjtrR0FBdEIsc0JBQXNCLGlpQkEzRXZCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29CQXNFUSx1REFDUixTQUFTLDhDQUFFLGdCQUFnQjs7MkZBSTFCLHNCQUFzQjtrQkE5RWxDLFNBQVM7bUJBQUM7b0JBQ1QsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSxpQkFBaUI7b0JBQzNCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFzRVE7b0JBQ2xCLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQztvQkFDdEMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7b0JBQ3JDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUNoRDs2RkFLVSxPQUFPO3NCQUFmLEtBQUs7Z0JBRXVDLGNBQWM7c0JBQTFELFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFFSSxnQkFBZ0I7c0JBQTlELFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFFTSxvQkFBb0I7c0JBQXRFLFNBQVM7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUVKLGNBQWM7c0JBQTFELFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFzeW5jUGlwZSwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBEZXN0cm95UmVmLFxuICBFbGVtZW50UmVmLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGRlbGF5LCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB2aWRlb2pzIGZyb20gJ3ZpZGVvLmpzJztcbmltcG9ydCBQbGF5ZXIgZnJvbSAndmlkZW8uanMvZGlzdC90eXBlcy9wbGF5ZXInO1xuaW1wb3J0IHsgSXRBYnN0cmFjdENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2Fic3RyYWN0cy9hYnN0cmFjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVmlkZW9QbGF5ZXJJMThuU2VydmljZSB9IGZyb20gJy4vdmlkZW8tcGxheWVyLWkxOG4uc2VydmljZSc7XG5pbXBvcnQgeyBUZWNoLCBWaWRlb1BsYXllckNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL3ZpZGVvLXBsYXllci5jb25maWcnO1xuaW1wb3J0IHsgY29va2llcyB9IGZyb20gJy4vdmlkZW8tcGxheWVyLmNvb2tpZSc7XG5pbXBvcnQgeyBJdFZpZGVvUGxheWVyQ29uZmlnLCBJdFZpZGVvUGxheWVyT3B0aW9ucyB9IGZyb20gJy4vdmlkZW8tcGxheWVyLm1vZGVsJztcblxuZW51bSBWaWV3VHlwZSB7XG4gIERlZmF1bHQgPSAnREVGQVVMVCcsXG4gIE92ZXJsYXkgPSAnT1ZFUkxBWScsXG59XG5cbi8qKlxuICogVmlkZW8gUGxheWVyXG4gKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50IHRoYXQgYWxsb3dzIHBsYXlpbmcgYSB2aWRlby5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnaXQtdmlkZW8tcGxheWVyJyxcbiAgdGVtcGxhdGU6IGBAc3dpdGNoICh2aWV3VHlwZSQgfCBhc3luYykge1xuICAgICAgQGNhc2UgKHZpZXdUeXBlcy5EZWZhdWx0KSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidmlkZW9UZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0cmFuc2NyaXB0aW9uVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICBAY2FzZSAodmlld1R5cGVzLk92ZXJsYXkpIHtcbiAgICAgICAgPGRpdiAjYWNjZXB0T3ZlcmxheWFibGUgY2xhc3M9XCJhY2NlcHRvdmVybGF5YWJsZSBzaG93XCI+XG4gICAgICAgICAgPGRpdiAjYWNjZXB0T3ZlcmFseSBjbGFzcz1cImFjY2VwdG92ZXJsYXkgYWNjZXB0b3ZlcmxheS1wcmltYXJ5IGZhZGUgc2hvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY2VwdG92ZXJsYXktaW5uZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY2VwdG92ZXJsYXktaWNvblwiPlxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJpY29uIGljb24teGxcIj48dXNlIGhyZWY9XCIvYm9vdHN0cmFwLWl0YWxpYS9kaXN0L3N2Zy9zcHJpdGVzLnN2ZyNpdC12aWRlb1wiPjwvdXNlPjwvc3ZnPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgQWNjZXR0YSBpIGNvb2tpZSBkaSBZb3VUdWJlIHBlciB2ZWRlcmUgaWwgdmlkZW8uIFB1b2kgZ2VzdGlyZSBsZSBwcmVmZXJlbnplIG5lbGxhXG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cInRleHQtd2hpdGVcIj5jb29raWUgcG9saWN5PC9hPi5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjZXB0b3ZlcmxheS1idXR0b25zIGJnLWRhcmtcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJhY2NlcHRDb29raWVIYW5kbGVyKClcIj5BY2NldHRhPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cImNoay1yZW1lbWJlcnt7IGlkIH19XCIgdHlwZT1cImNoZWNrYm94XCIgI2Noa1JlbWVtYmVyIC8+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2hrLXJlbWVtYmVye3sgaWQgfX1cIj5SaWNvcmRhIHBlciB0dXR0aSBpIHZpZGVvPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBAaWYgKGNvb2tpZUFjY2VwdGVkJCB8IGFzeW5jKSB7XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidmlkZW9UZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidHJhbnNjcmlwdGlvblRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGRlZmF1bHQge1xuICAgICAgICA8aDE+Tm8gdmlkZW8gcHJvdmlkZXI8L2gxPlxuICAgICAgfVxuICAgIH1cbiAgICA8bmctdGVtcGxhdGUgI3ZpZGVvVGVtcGxhdGU+XG4gICAgICA8ZGl2PlxuICAgICAgICA8dmlkZW8gI3ZpZGVvUGxheWVyIGNsYXNzPVwidmlkZW8tanMgdmpzLXRoZW1lLWJvb3RzdHJhcC1pdGFsaWEgdmpzLWZsdWlkIHZqcy1iaWctcGxheS1jZW50ZXJlZFwiPjwvdmlkZW8+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPG5nLXRlbXBsYXRlICN0cmFuc2NyaXB0aW9uVGVtcGxhdGU+XG4gICAgICA8ZGl2IGNsYXNzPVwidmpzLXRyYW5zY3JpcHRpb24gYWNjb3JkaW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY2NvcmRpb24taXRlbVwiPlxuICAgICAgICAgIDxoMiBjbGFzcz1cImFjY29yZGlvbi1oZWFkZXIgXCIgaWQ9XCJ0cmFuc2NyaXB0aW9uLXt7IGlkIH19LWhlYWRcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJhY2NvcmRpb24tYnV0dG9uIGNvbGxhcHNlZFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBkYXRhLWJzLXRvZ2dsZT1cImNvbGxhcHNlXCJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS1icy10YXJnZXRdPVwiJyN0cmFuc2NyaXB0aW9uLScgKyBpZFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiJ3RyYW5zY3JpcHRpb24tJyArIGlkXCJcbiAgICAgICAgICAgICAgYXJpYS1leHBhbmRlZD1cInRydWVcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3RyYW5zY3JpcHRpb25UaXRsZV1cIj5UcmFzY3JpemlvbmU8L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2gyPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGlkPVwidHJhbnNjcmlwdGlvbi17eyBpZCB9fVwiXG4gICAgICAgICAgICBjbGFzcz1cImFjY29yZGlvbi1jb2xsYXBzZSBjb2xsYXBzZVwiXG4gICAgICAgICAgICByb2xlPVwicmVnaW9uXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCIndHJhbnNjcmlwdGlvbi0nICsgaWQgKyAnLWhlYWQnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWJvZHlcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3RyYW5zY3JpcHRpb25UZXh0XVwiPi08L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPiBgLFxuICBpbXBvcnRzOiBbQXN5bmNQaXBlLCBOZ1RlbXBsYXRlT3V0bGV0XSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEl0VmlkZW9QbGF5ZXJDb21wb25lbnQgZXh0ZW5kcyBJdEFic3RyYWN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogT3B0aW9ucyBmb3IgdmlkZW8gcGxheWVyIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIEBJbnB1dCgpIG9wdGlvbnMhOiBJdFZpZGVvUGxheWVyT3B0aW9ucztcblxuICBAVmlld0NoaWxkKCd2aWRlb1BsYXllcicsIHsgc3RhdGljOiBmYWxzZSB9KSB2aWRlb1BsYXllclJlZj86IEVsZW1lbnRSZWY8SFRNTFZpZGVvRWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZCgnYWNjZXB0T3ZlcmFseScsIHsgc3RhdGljOiBmYWxzZSB9KSBhY2NlcHRPdmVyYWx5UmVmPzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZCgnYWNjZXB0T3ZlcmxheWFibGUnLCB7IHN0YXRpYzogZmFsc2UgfSkgYWNjZXB0T3ZlcmxheWFibGVSZWY/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBAVmlld0NoaWxkKCdjaGtSZW1lbWJlcicsIHsgc3RhdGljOiBmYWxzZSB9KSBjaHJSZW1lbWJlclJlZj86IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG5cbiAgcGxheWVyPzogUGxheWVyO1xuXG4gIHJlYWRvbmx5IHZpZXdUeXBlcyA9IFZpZXdUeXBlO1xuXG4gIHJlYWRvbmx5IHZpZXdUeXBlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Vmlld1R5cGUgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgcmVhZG9ubHkgY29va2llQWNjZXB0ZWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGkxOG5TZXJ2aWNlID0gaW5qZWN0KFZpZGVvUGxheWVySTE4blNlcnZpY2UpO1xuXG4gIHJlYWRvbmx5ICNkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIHByaXZhdGUgZ2V0IHZpZXdUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnZpZXdUeXBlJC52YWx1ZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY29uZmlnOiBWaWRlb1BsYXllckNvbmZpZ1NlcnZpY2UpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWcubWVyZ2VDb25maWcodGhpcy5vcHRpb25zKTtcbiAgICB0aGlzLnNldFZpZXdUeXBlKGNvbmZpZyk7XG4gICAgYXdhaXQgdGhpcy5jb25maWcuY29uZmlndXJlVGVjaChjb25maWcgYXMgeyB0ZWNoOiBUZWNoIH0pO1xuXG4gICAgaWYgKCF0aGlzLnZpZGVvUGxheWVyUmVmKSB7XG4gICAgICB0aGlzLmNvb2tpZUFjY2VwdGVkJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy4jZGVzdHJveVJlZiksXG4gICAgICAgICAgZGVsYXkoMCksXG4gICAgICAgICAgdGFwKHtcbiAgICAgICAgICAgIG5leHQ6IHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgaWYgKHZhbHVlICYmICF0aGlzLnBsYXllcikge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFZpZGVvUGxheWVyKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pbml0VmlkZW9QbGF5ZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBpZiAodGhpcy52aWV3VHlwZSA9PT0gVmlld1R5cGUuT3ZlcmxheSAmJiBjb29raWVzLmlzQ2hvaWNlUmVtZW1iZXJlZCgneW91dHViZS5jb20nKSkge1xuICAgICAgdGhpcy5oaWRlT3ZlcmxheSgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnBsYXllcikge1xuICAgICAgdGhpcy5wbGF5ZXIuZGlzcG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIGFjY2VwdENvb2tpZUhhbmRsZXIoKSB7XG4gICAgdGhpcy5yZW1lbWJlckhhbmRsZXIoKTtcbiAgICB0aGlzLmhpZGVPdmVybGF5KCk7XG4gICAgdGhpcy5jb29raWVBY2NlcHRlZCQubmV4dCh0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFZpZGVvUGxheWVyKCkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnLm1lcmdlQ29uZmlnKHRoaXMub3B0aW9ucyk7XG4gICAgdGhpcy5zZXRWaWRlb0F0dHJpYnV0ZXMoY29uZmlnKTtcbiAgICB0aGlzLnNldFZpZGVvUGxheWVyKCk7XG4gIH1cblxuICBwcml2YXRlIHNldFZpZGVvUGxheWVyKCkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnLm1lcmdlQ29uZmlnKHRoaXMub3B0aW9ucyk7XG4gICAgY29uc3Qgb25QbGF5ZXJSZWFkeUNiID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnBsYXllcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmkxOG5TZXJ2aWNlLmluaXQodGhpcy5wbGF5ZXIsIHRoaXMuI2Rlc3Ryb3lSZWYpO1xuICAgIH07XG5cbiAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXJSZWYpIHtcbiAgICAgIHRocm93IEVycm9yKCd2aWRlb1BsYXllclJlZiBpcyB1bmRlZmluZWQnKTtcbiAgICB9XG5cbiAgICB0aGlzLnBsYXllciA9IHZpZGVvanModGhpcy52aWRlb1BsYXllclJlZi5uYXRpdmVFbGVtZW50LCBjb25maWcsIG9uUGxheWVyUmVhZHlDYi5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Vmlld1R5cGUoY29uZmlnOiBJdFZpZGVvUGxheWVyQ29uZmlnKSB7XG4gICAgdGhpcy52aWV3VHlwZSQubmV4dChjb25maWcudGVjaCA9PT0gJ3lvdXR1YmUnID8gVmlld1R5cGUuT3ZlcmxheSA6IFZpZXdUeXBlLkRlZmF1bHQpO1xuXG4gICAgdGhpcy5jb29raWVBY2NlcHRlZCQubmV4dCh0aGlzLnZpZXdUeXBlID09PSBWaWV3VHlwZS5PdmVybGF5ICYmIGNvb2tpZXMuaXNDaG9pY2VSZW1lbWJlcmVkKCd5b3V0dWJlLmNvbScpKTtcbiAgfVxuXG4gIHByaXZhdGUgaGlkZU92ZXJsYXkoKSB7XG4gICAgaWYgKCF0aGlzLmFjY2VwdE92ZXJsYXlhYmxlUmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNsYXNzZXMgPSBbJ3Nob3cnXTtcbiAgICB0aGlzLmFjY2VwdE92ZXJsYXlhYmxlUmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSguLi5jbGFzc2VzKTtcbiAgICBpZiAoIXRoaXMuYWNjZXB0T3ZlcmFseVJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFjY2VwdE92ZXJhbHlSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKC4uLmNsYXNzZXMpO1xuICAgIHRoaXMuYWNjZXB0T3ZlcmFseVJlZi5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1lbWJlckhhbmRsZXIoKSB7XG4gICAgaWYgKCF0aGlzLmNoclJlbWVtYmVyUmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlbWVtYmVyID0gdGhpcy5jaHJSZW1lbWJlclJlZi5uYXRpdmVFbGVtZW50LmNoZWNrZWQ7XG4gICAgY29va2llcy5yZW1lbWJlckNob2ljZSgneW91dHViZS5jb20nLCByZW1lbWJlcik7XG4gIH1cblxuICBwcml2YXRlIHNldFZpZGVvQXR0cmlidXRlcyhvcHRpb25zOiBJdFZpZGVvUGxheWVyT3B0aW9ucykge1xuICAgIGlmICghdGhpcy52aWRlb1BsYXllclJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2ID0gdGhpcy52aWRlb1BsYXllclJlZi5uYXRpdmVFbGVtZW50O1xuXG4gICAgY29uc3QgeyBhdXRvcGxheSwgY29udHJvbHMsIGxvb3AsIG11dGVkLCBwb3N0ZXIsIGZsdWlkIH0gPSBvcHRpb25zO1xuXG4gICAgaWYgKGF1dG9wbGF5KSB7XG4gICAgICB2LnNldEF0dHJpYnV0ZSgnYXV0b3BsYXknLCBhdXRvcGxheS50b1N0cmluZygpKTtcbiAgICB9XG5cbiAgICBpZiAoY29udHJvbHMpIHtcbiAgICAgIHYuc2V0QXR0cmlidXRlKCdjb250cm9scycsICcnKTtcbiAgICB9XG5cbiAgICBpZiAobG9vcCkge1xuICAgICAgdi5zZXRBdHRyaWJ1dGUoJ2xvb3AnLCAnJyk7XG4gICAgfVxuXG4gICAgaWYgKG11dGVkKSB7XG4gICAgICB2LnNldEF0dHJpYnV0ZSgnbXV0ZWQnLCAnJyk7XG4gICAgfVxuXG4gICAgaWYgKHBvc3Rlcikge1xuICAgICAgdi5zZXRBdHRyaWJ1dGUoJ3Bvc3RlcicsIHBvc3Rlcik7XG4gICAgfVxuXG4gICAgaWYgKGZsdWlkKSB7XG4gICAgICB2LnNldEF0dHJpYnV0ZSgnZmx1aWQnLCAnJyk7XG4gICAgfVxuXG4gICAgdi5zZXRBdHRyaWJ1dGUoJ3ByZWxvYWQnLCAnbm9uZScpO1xuICAgIHYuc2V0QXR0cmlidXRlKCdwbGF5c2lubGluZScsICcnKTtcbiAgfVxufVxuIl19