UNPKG

@dicdikshaorg/epub-player-v9

Version:

Contains Epub player library components powered by angular. These components are designed to be used in sunbird consumption platforms *(mobile app, web portal, offline desktop app)* to drive reusability, maintainability hence reducing the redundant develo

502 lines 72.9 kB
import { __awaiter } from "tslib"; import { EventEmitter, Component, Output, Input, HostListener, ElementRef, ViewChild, Renderer2 } from '@angular/core'; import { ViwerService } from './services/viewerService/viwer-service'; import { EpubPlayerService } from './sunbird-epub-player.service'; import { epubPlayerConstants, pageId, telemetryType } from './sunbird-epub.constant'; import { ErrorService, errorCode, errorMessage } from '@project-sunbird/sunbird-player-sdk-v9'; import { UtilService } from './services/utilService/util.service'; import { HttpClient, HttpHeaders } from "@angular/common/http"; import { ToastrService } from './services/toastService/toastr.service'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import * as _ from 'lodash'; export class EpubPlayerComponent { constructor(viwerService, epubPlayerService, errorService, utilService, renderer2, http, toastrService) { this.viwerService = viwerService; this.epubPlayerService = epubPlayerService; this.errorService = errorService; this.utilService = utilService; this.renderer2 = renderer2; this.http = http; this.toastrService = toastrService; this.fromConst = epubPlayerConstants; this.showFullScreen = false; this.headerActionsEvent = new EventEmitter(); this.telemetryEvent = new EventEmitter(); this.showControls = true; this.validPage = true; this.sideMenuConfig = { showShare: false, showDownload: false, showReplay: false, showExit: false, showPrint: false }; this.urlTTS = 'https://dhruva-api.bhashini.gov.in/services/inference/pipeline'; this.urlDetectLang = 'https://dhruva-api.bhashini.gov.in/services/inference/txtlangdetection'; this.audio = ''; this.audioQueue = []; this.playerState = { isPlaying: false }; this.counter = 0; this.loading = false; this.chunks = []; this.isStreamIntrupted = false; this.cancelRequests$ = new Subject(); this.languageList = [ { languageCode: 'en', modelId: 'Bhashini/IITM/TTS' }, { languageCode: 'hi', modelId: 'Bhashini/IITM/TTS' }, { languageCode: 'as', modelId: 'Bhashini/IITM/TTS' }, { languageCode: 'bn', modelId: 'Bhashini/IITM/TTS' }, { languageCode: 'gu', modelId: 'Bhashini/IITM/TTS' }, { languageCode: 'kn', modelId: 'Bhashini/IITM/TTS' }, { languageCode: 'mr', modelId: 'Bhashini/IITM/TTS' }, { languageCode: 'or', modelId: 'Bhashini/IITM/TTS' }, { languageCode: 'pa', modelId: 'Bhashini/IITM/TTS' }, { languageCode: 'ta', modelId: 'Bhashini/IITM/TTS' }, { languageCode: 'te', modelId: 'Bhashini/IITM/TTS' }, { languageCode: 'ur', modelId: 'Bhashini/IITM/TTS' } ]; this.isInitialized = false; this.viewState = this.fromConst.LOADING; this.progress = 0; this.currentPageIndex = 1; this.headerConfiguration = { rotation: false, goto: true, navigation: true, zoom: false }; this.playbackRate = 1.0; this.langCode = ''; this.playerEvent = this.viwerService.playerEvent; } onTelemetryEvent(event) { this.telemetryEvent.emit(event.detail); } ngOnInit() { var _a, _b, _c, _d; return __awaiter(this, void 0, void 0, function* () { this.mimeType = _.get(this.playerConfig, 'metadata.mimeType'); this.isInitialized = true; if (this.playerConfig) { if (typeof this.playerConfig === 'string') { try { this.playerConfig = JSON.parse(this.playerConfig); } catch (error) { console.error('Invalid playerConfig: ', error); } } } // initializing services this.viwerService.initialize(this.playerConfig); this.epubPlayerService.initialize(this.playerConfig); this.traceId = (_b = (_a = this.playerConfig) === null || _a === void 0 ? void 0 : _a.config) === null || _b === void 0 ? void 0 : _b.traceId; // checks online error while loading epub if (!navigator.onLine && !this.viwerService.isAvailableLocally) { // tslint:disable-next-line:max-line-length this.viwerService.raiseExceptionLog(errorCode.internetConnectivity, this.currentPageIndex, errorMessage.internetConnectivity, this.traceId, new Error(errorMessage.internetConnectivity)); } // checks content compatibility error const contentCompabilityLevel = (_d = (_c = this.playerConfig) === null || _c === void 0 ? void 0 : _c.metadata) === null || _d === void 0 ? void 0 : _d.compatibilityLevel; if (contentCompabilityLevel) { const checkContentCompatible = this.errorService.checkContentCompatibility(contentCompabilityLevel); if (!(checkContentCompatible === null || checkContentCompatible === void 0 ? void 0 : checkContentCompatible.isCompitable)) { // tslint:disable-next-line:max-line-length this.viwerService.raiseExceptionLog(errorCode.contentCompatibility, this.currentPageIndex, errorCode.contentCompatibility, this.traceId, checkContentCompatible.error); } } this.showEpubViewer = true; this.sideMenuConfig = Object.assign(Object.assign({}, this.sideMenuConfig), this.playerConfig.config.sideMenu); this.getEpubLoadingProgress(); this.nextContent = this.playerConfig.config.nextContent; }); } ngOnChanges(changes) { var _a; if (changes.showFullScreen && !((_a = changes === null || changes === void 0 ? void 0 : changes.showFullScreen) === null || _a === void 0 ? void 0 : _a.firstChange)) { this.showFullScreen = changes.showFullScreen.currentValue; } if (changes.playerConfig.firstChange && this.isInitialized) { // Calling for web component explicitly and life cycle works in different order this.ngOnInit(); } } ngAfterViewInit() { const epubPlayerElement = this.epubPlayerRef.nativeElement; this.unlistenMouseEnter = this.renderer2.listen(epubPlayerElement, 'mouseenter', () => { this.showControls = true; }); this.unlistenMouseLeave = this.renderer2.listen(epubPlayerElement, 'mouseleave', () => { this.showControls = false; }); } headerActions(eventdata) { this.headerActionsEvent.emit(eventdata); } onPlaybackRateChange(event) { this.playbackRate = parseFloat(event.target.value); if (this.audio) { this.audio.playbackRate = this.playbackRate; } } handleNotification() { this.handleButtonstop(); } handleButtonplay() { this.audio.play(); } handleButtonpause() { this.audio.pause(); } handleButtonstop() { if (this.audio && typeof this.audio.pause === 'function') { this.audio.pause(); this.audio.src = ''; this.isStreamIntrupted = true; this.counter = 0; this.playerState.isPlaying = false; } this.cancelRequests(); this.audioQueue = []; } getModelId(languageCode) { if (languageCode == 'unknown') { this.toastrService.show('Sorry, we are currently unable to provide Audio for this document.', 'error'); } const language = this.languageList.find(lang => lang.languageCode === languageCode); return language ? language.modelId : null; } detectLanguage(chunk) { return __awaiter(this, void 0, void 0, function* () { return new Promise((resolve, reject) => { const headers = new HttpHeaders({ Authorization: 'Rl1KVAwFU5lUDH2fLfJ_4EJrroYZUGhG06oJbWemJOC3pFw9XA0tVpqKhroKQirW', }); const payload = { config: { serviceId: "bhashini/iiiith/indic-lang-detection-all" }, input: [ { source: chunk } ] }; this.http.post(this.urlDetectLang, payload, { headers }).subscribe((res) => { this.langCode = res.output[0].langPrediction[0].langCode; const modelId = this.getModelId(this.langCode); resolve(modelId); }, error => { console.error('Error detecting language:', error); this.toastrService.show('Something Went Wrong', 'error'); resolve(null); // Resolve with null if there's an error }); }); }); } handleButtonClick(gender) { return __awaiter(this, void 0, void 0, function* () { this.toastrService.show('Please wait , Audio Processing...', 'info'); this.isStreamIntrupted = false; this.audioQueue = []; let epubjsId = document.querySelector('[id^="epubjs-view-"]').id; if (epubjsId) { let epubHTML = document.getElementById(epubjsId).getAttribute("srcdoc"); const parser = new DOMParser(); const htmlDoc = parser.parseFromString(epubHTML, "text/html"); let hTags = htmlDoc.querySelector("body"); if (hTags) { let speechText = this.extractTextFromElement(hTags); this.chunks = this.chunkText(speechText, 250); if (!this.chunks || this.chunks.length === 0) { this.toastrService.show('Text is unavailable in current Page', 'error'); } // Detect language with the first chunk const serviceId = yield this.detectLanguage(this.chunks[0]); for (let i = 0; i < this.chunks.length; i++) { if (!this.isStreamIntrupted) { yield this.processChunk(this.chunks[i], gender, serviceId); } else { this.chunks = []; break; } } } } else { console.log("No epubjsId found"); } }); } extractTextFromElement(element) { if (!element) return ""; let text = ""; element.childNodes.forEach(node => { if (node.nodeType === Node.TEXT_NODE) { text += node.textContent.trim() + " "; } else if (node.nodeType === Node.ELEMENT_NODE) { text += this.extractTextFromElement(node); } }); return text.trim(); } processChunk(chunk, gender, serviceId) { return __awaiter(this, void 0, void 0, function* () { if (!serviceId) { console.error('Model ID not found.'); return; } const headers = new HttpHeaders({ Authorization: 'Rl1KVAwFU5lUDH2fLfJ_4EJrroYZUGhG06oJbWemJOC3pFw9XA0tVpqKhroKQirW', }); const payload = { pipelineTasks: [ { taskType: 'tts', config: { language: { sourceLanguage: this.langCode, }, serviceId: serviceId, gender: gender, speed: 1, samplingRate: 16000, }, }, ], inputData: { input: [ { source: chunk, }, ], }, }; try { // Use RxJS to handle cancellation const response = yield this.http .post(this.urlTTS, payload, { headers }) .pipe(takeUntil(this.cancelRequests$)) .toPromise(); if (response) { const audioContent = response.pipelineResponse[0].audio[0].audioContent; const base64Audio = audioContent; const audioUrl = 'data:audio/mp3;base64,' + base64Audio; this.audioQueue.push(audioUrl); if (!this.playerState.isPlaying) { this.playNextAudio(); } } } catch (error) { this.loading = false; this.toastrService.show('Something Went Wrong', 'error'); } }); } cancelRequests() { this.cancelRequests$.next(); this.cancelRequests$.complete(); this.cancelRequests$ = new Subject(); } playNextAudio() { if (this.audioQueue.length > 0 && !this.isStreamIntrupted) { this.loading = false; const audioUrl = this.audioQueue[this.counter++]; this.audio = new Audio(audioUrl); this.audio.controls = true; this.audio.playbackRate = this.playbackRate; this.playerState.isPlaying = true; this.audio.play(); this.audio.addEventListener('ended', () => { this.playerState.isPlaying = false; this.playNextAudio(); }); } else { this.playerState.isPlaying = false; } } chunkText(text, chunkSize) { const chunks = []; if (!text) return chunks; let startIndex = 0; while (startIndex < text.length) { let endIndex = Math.min(startIndex + chunkSize, text.length); // Ensure we don't split a word if (endIndex < text.length && text[endIndex] !== ' ') { while (endIndex > startIndex && text[endIndex] !== ' ') { endIndex--; } // If no space was found, set endIndex to chunkSize if (endIndex === startIndex) { endIndex = Math.min(startIndex + chunkSize, text.length); } } chunks.push(text.substring(startIndex, endIndex).trim()); startIndex = endIndex + 1; // Move past the space } return chunks; } viewerEvent(event) { if (event.type === this.fromConst.EPUBLOADED) { this.onEpubLoaded(event); } if (event.type === this.fromConst.PAGECHANGE) { this.onPageChange(event); } if (event.type === this.fromConst.END) { this.onEpubEnded(event); } if (event.type === this.fromConst.ERROR) { this.onEpubLoadFailed(event); } if (event.type === this.fromConst.NAVIGATE_TO_PAGE) { this.onJumpToPage(event); } if (event.type === this.fromConst.INVALID_PAGE_ERROR) { this.validPage = event.data; this.resetValidPage(); } } resetValidPage() { setTimeout(() => { this.validPage = true; }, 5000); } onEpubLoaded(event) { var _a, _b, _c; clearInterval(this.intervalRef); this.viewState = this.fromConst.START; this.viwerService.raiseStartEvent(event.data); if (((_b = (_a = this.playerConfig.config) === null || _a === void 0 ? void 0 : _a.pagesVisited) === null || _b === void 0 ? void 0 : _b.length) && ((_c = this.playerConfig.config) === null || _c === void 0 ? void 0 : _c.currentLocation)) { this.currentPageIndex = this.playerConfig.config.pagesVisited[this.playerConfig.config.pagesVisited.length - 1]; } this.viwerService.metaData.pagesVisited.push(this.currentPageIndex); } onPageChange(event) { var _a; if ((_a = event === null || event === void 0 ? void 0 : event.data) === null || _a === void 0 ? void 0 : _a.index) { this.currentPageIndex = event.data.index; } this.currentPageIndex = this.utilService.getCurrentIndex(event, this.currentPageIndex); this.viwerService.raiseHeartBeatEvent(event, telemetryType.INTERACT); this.viwerService.raiseHeartBeatEvent(event, telemetryType.IMPRESSION); this.viwerService.metaData.pagesVisited.push(this.currentPageIndex); } onJumpToPage(type) { var _a; this.currentPageIndex = (_a = type === null || type === void 0 ? void 0 : type.event) === null || _a === void 0 ? void 0 : _a.data; this.viwerService.raiseHeartBeatEvent(type, telemetryType.INTERACT); this.viwerService.raiseHeartBeatEvent(type, telemetryType.IMPRESSION); this.viwerService.metaData.pagesVisited.push(this.currentPageIndex); } onEpubEnded(event) { this.handleButtonstop(); this.viewState = this.fromConst.END; this.showEpubViewer = false; event.data.index = this.currentPageIndex; this.viwerService.raiseEndEvent(event); } onEpubLoadFailed(error) { this.showContentError = true; this.viewState = this.fromConst.LOADING; // tslint:disable-next-line:max-line-length this.viwerService.raiseExceptionLog(error.errorCode, this.currentPageIndex, error.errorMessage, this.traceId, new Error(error.errorMessage)); } replayContent(event) { this.currentPageIndex = 1; this.viwerService.raiseHeartBeatEvent(event, telemetryType.INTERACT); this.viewState = this.fromConst.START; this.viwerService.metaData.pagesVisited.push(this.currentPageIndex); this.ngOnInit(); } exitContent(event) { this.viwerService.raiseHeartBeatEvent(event, telemetryType.INTERACT); } sideBarEvents(event) { this.viwerService.raiseHeartBeatEvent(event, telemetryType.INTERACT); if (event.type === 'DOWNLOAD') { this.downloadEpub(); } } sidebarMenuEvent(event) { this.viwerService.raiseHeartBeatEvent(event, telemetryType.INTERACT); } getEpubLoadingProgress() { this.intervalRef = setInterval(() => { if (this.progress < 95) { this.progress = this.progress + 5; } }, 10); } downloadEpub() { const a = document.createElement('a'); a.href = this.viwerService.artifactUrl; a.download = this.viwerService.contentName; a.target = '_blank'; document.body.appendChild(a); a.click(); a.remove(); this.viwerService.raiseHeartBeatEvent('DOWNLOAD'); } ngOnDestroy() { this.handleButtonstop(); const EndEvent = { type: this.fromConst.END, data: { index: this.currentPageIndex } }; this.viwerService.raiseEndEvent(EndEvent); this.viwerService.isEndEventRaised = false; this.unlistenMouseEnter(); this.unlistenMouseLeave(); } // Function to play next content playNextContent(event) { this.viwerService.raiseHeartBeatEventNew(event === null || event === void 0 ? void 0 : event.type, telemetryType.INTERACT, pageId.endPage, event === null || event === void 0 ? void 0 : event.identifier); } } /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ EpubPlayerComponent.decorators = [ { type: Component, args: [{ // tslint:disable-next-line:component-selector selector: 'sunbird-epub-player', template: "<div class=\"sunbird-epub-container\" #epubPlayer>\r\n<div *ngIf=\"viewState === fromConst.LOADING\">\r\n <sb-player-start-page [title]=\"viwerService.contentName\" [progress]=\"progress\"></sb-player-start-page>\r\n</div>\r\n<div class=\"epub-container\" *ngIf=\"showEpubViewer\">\r\n <ng-container *ngIf=\"viewState === fromConst.START\">\r\n <sb-player-header class=\"notVisible\" [playerState]=\"playerState\" [mimeType]=\"mimeType\" (buttonclick)=\"handleButtonClick($event)\" (buttonstop)=\"handleButtonstop()\" (buttonPause)=\"handleButtonpause()\" (buttonPlay)=\"handleButtonplay()\" (notify)=\"handleNotification()\" (changePlaybackrate)=\"onPlaybackRateChange($event)\" [totalPages]=\"viwerService?.totalNumberOfPages\" [pageNumber]=\"currentPageIndex\" [config]=\"headerConfiguration\" (actions)=\"headerActions($event)\" [ngClass]=\"{'isVisible': showControls}\"></sb-player-header>\r\n <sb-player-side-menu-icon class=\"notVisible\" [ngClass]=\"{'isVisible': showControls}\" (sidebarMenuEvent)=\"sidebarMenuEvent($event)\">\r\n </sb-player-side-menu-icon>\r\n <sb-player-sidebar [title]=\"viwerService.contentName\" (sidebarEvent)=\"sideBarEvents($event)\"\r\n [config]=\"sideMenuConfig\"></sb-player-sidebar>\r\n <div class=\"sb-epub-reading-status\" *ngIf=\"currentPageIndex && viwerService?.totalNumberOfPages\">\r\n Page {{currentPageIndex}} of {{viwerService?.totalNumberOfPages}} <span></span> {{((currentPageIndex/viwerService?.totalNumberOfPages) * 100).toFixed(0)}}%\r\n </div>\r\n \r\n </ng-container>\r\n <epub-viewer [actions]=\"headerActionsEvent\" [epubSrc]=\"viwerService.src\" [identifier]=\"viwerService.identifier\"\r\n (viewerEvent)=\"viewerEvent($event)\" [config]=\"playerConfig.config\" [showFullScreen]=\"showFullScreen\">\r\n </epub-viewer>\r\n</div>\r\n<sb-player-end-page *ngIf=\"viewState === fromConst.END\" [contentName]=\"viwerService.contentName\"\r\n [outcomeLabel]=\"'Pages read: '\" [outcome]=\"(currentPageIndex -1)\" [showExit]=\"sideMenuConfig.showExit\" [userName]=\"viwerService.userName\"\r\n [timeSpentLabel]=\"viwerService.timeSpent\" (replayContent)=\"replayContent($event)\" (exitContent)=\"exitContent($event)\" [nextContent]=\"nextContent\" (playNextContent)=\"playNextContent($event)\">\r\n</sb-player-end-page>\r\n<sb-player-contenterror *ngIf=\"showContentError\"></sb-player-contenterror>\r\n</div>\r\n<div class=\"pagenotfound__tooltip\" *ngIf=\"!validPage\">\r\n <div class=\"pagenotfound__icon\"></div>\r\n <div class=\"pagenotfound__text\">Page Not Found</div>\r\n</div>\r\n\r\n<toastr></toastr>", styles: [".sunbird-epub-container{height:100%;width:100%;background-color:#fff}.sunbird-epub-palyer-container{width:100%;height:100%;overflow:hidden;position:relative}.sb-epub-reading-status{color:var(--gray-800);font-size:.75rem;position:absolute;left:1rem;bottom:.75rem;display:flex;align-items:center;background:var(--white);border-radius:.5rem;padding:.25em .5rem;z-index:5;line-height:normal}.sb-epub-reading-status span{background:var(--gray-800);width:4px;height:4px;display:block;margin:0 .5em;border-radius:50%}.notVisible,.BtmNotVisible{transition:all .3s ease-in-out;position:absolute;width:100%}.notVisible{top:-10rem}.notVisible.isVisible{top:0rem}.BtmNotVisible{bottom:-10rem}.BtmNotVisible.isVisible{bottom:0rem}:host::ng-deep .sb-player-splash-container{height:100vh!important}:host::ng-deep epub-viewer{position:absolute;top:48px;width:100%;height:calc(100% - 48px);overflow-y:auto;overflow-x:hidden;left:0;background-color:#fff}:host::ng-deep .epub-container{height:100%;position:relative;overflow-x:hidden!important}.pagenotfound__tooltip{position:absolute;top:10%;left:50%;transform:translate(-50%);background:#333;z-index:11111;padding:calculateRem(8px) calculateRem(20px);font-size:calculateRem(14px);color:#fff;border-radius:calculateRem(4px);display:flex;align-items:center}.pagenotfound__icon{width:calculateRem(22px);height:calculateRem(22px);margin-right:calculateRem(12px);background:white;border-radius:50%;position:relative}.pagenotfound__icon:after{content:\"!\";position:absolute;top:50%;left:50%;color:#333;font-size:18px;transform:translate(-50%,-50%)}\n"] },] } ]; /** * @type {function(): !Array<(null|{ * type: ?, * decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>), * })>} * @nocollapse */ EpubPlayerComponent.ctorParameters = () => [ { type: ViwerService }, { type: EpubPlayerService }, { type: ErrorService }, { type: UtilService }, { type: Renderer2 }, { type: HttpClient }, { type: ToastrService } ]; /** @type {!Object<string, !Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ EpubPlayerComponent.propDecorators = { epubPlayerRef: [{ type: ViewChild, args: ['epubPlayer', { static: true },] }], playerConfig: [{ type: Input }], showFullScreen: [{ type: Input }], headerActionsEvent: [{ type: Output }], telemetryEvent: [{ type: Output }], playerEvent: [{ type: Output }], onTelemetryEvent: [{ type: HostListener, args: ['document:TelemetryEvent', ['$event'],] }], ngOnDestroy: [{ type: HostListener, args: ['window:beforeunload',] }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VuYmlyZC1lcHViLXBsYXllci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zdW5iaXJkLWVwdWItcGxheWVyL3NyYy9saWIvc3VuYmlyZC1lcHViLXBsYXllci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsWUFBWSxFQUN4RCxVQUFVLEVBQUUsU0FBUyxFQUFpQixTQUFTLEVBQTRCLE1BQU0sZUFBZSxDQUFDO0FBQzlHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV0RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQy9GLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUVsRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzlELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQVE1QixNQUFNLE9BQU8sbUJBQW1CO0lBK0Q5QixZQUNTLFlBQTBCLEVBQ3pCLGlCQUFvQyxFQUNyQyxZQUEwQixFQUMxQixXQUF3QixFQUN2QixTQUFvQixFQUNyQixJQUFnQixFQUNmLGFBQTRCO1FBTjdCLGlC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cUI7Z0JBQy9CLDBuRkFBbUQ7O2FBRXBEOzs7Ozs7Ozs7O1lBbEJRLFlBQVk7WUFFWixpQkFBaUI7WUFFakIsWUFBWTtZQUNaLFdBQVc7WUFOK0IsU0FBUztZQVFuRCxVQUFVO1lBQ1YsYUFBYTs7Ozs0QkFhbkIsU0FBUyxTQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7MkJBQ3hDLEtBQUs7NkJBQ0wsS0FBSztpQ0FDTCxNQUFNOzZCQUNOLE1BQU07MEJBQ04sTUFBTTsrQkFvRU4sWUFBWSxTQUFDLHlCQUF5QixFQUFFLENBQUMsUUFBUSxDQUFDOzBCQWlhbEQsWUFBWSxTQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciwgQ29tcG9uZW50LCBPdXRwdXQsIElucHV0LCBPbkluaXQsIEhvc3RMaXN0ZW5lcixcclxuICBPbkRlc3Ryb3ksIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCwgQWZ0ZXJWaWV3SW5pdCwgUmVuZGVyZXIyLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVml3ZXJTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy92aWV3ZXJTZXJ2aWNlL3Zpd2VyLXNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQbGF5ZXJDb25maWcgfSBmcm9tICcuL3N1bmJpcmQtZXB1Yi1wbGF5ZXIuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgRXB1YlBsYXllclNlcnZpY2UgfSBmcm9tICcuL3N1bmJpcmQtZXB1Yi1wbGF5ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IGVwdWJQbGF5ZXJDb25zdGFudHMsIHBhZ2VJZCwgdGVsZW1ldHJ5VHlwZSB9IGZyb20gJy4vc3VuYmlyZC1lcHViLmNvbnN0YW50JztcclxuaW1wb3J0IHsgRXJyb3JTZXJ2aWNlLCBlcnJvckNvZGUsIGVycm9yTWVzc2FnZSB9IGZyb20gJ0Bwcm9qZWN0LXN1bmJpcmQvc3VuYmlyZC1wbGF5ZXItc2RrLXY5JztcclxuaW1wb3J0IHsgVXRpbFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3V0aWxTZXJ2aWNlL3V0aWwuc2VydmljZSc7XHJcbmltcG9ydCB7IE5leHRDb250ZW50IH0gZnJvbSAnQHByb2plY3Qtc3VuYmlyZC9zdW5iaXJkLXBsYXllci1zZGstdjkvc3VuYmlyZC1wbGF5ZXItc2RrLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdG9hc3RTZXJ2aWNlL3RvYXN0ci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjb21wb25lbnQtc2VsZWN0b3JcclxuICBzZWxlY3RvcjogJ3N1bmJpcmQtZXB1Yi1wbGF5ZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zdW5iaXJkLWVwdWItcGxheWVyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9zdW5iaXJkLWVwdWItcGxheWVyLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEVwdWJQbGF5ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcclxuICBmcm9tQ29uc3QgPSBlcHViUGxheWVyQ29uc3RhbnRzO1xyXG4gIEBWaWV3Q