@dicdikshaorg/video-player-mobile-v9
Version:
Contains Video 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 devel
445 lines • 40.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/services/viewer.service.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { __awaiter } from "tslib";
import { HttpClient } from '@angular/common/http';
import { EventEmitter, Injectable, Optional } from '@angular/core';
import { SunbirdVideoPlayerService } from '../sunbird-video-player.service';
import { UtilService } from './util.service';
import { errorCode, errorMessage } from '@dicdikshaorg/player-sdk-v9';
import { QuestionCursor } from '@project-sunbird/sunbird-quml-player-v9';
import { of } from 'rxjs';
import { map } from 'rxjs/operators';
import * as _ from 'lodash-es';
import * as i0 from "@angular/core";
import * as i1 from "../sunbird-video-player.service";
import * as i2 from "./util.service";
import * as i3 from "@angular/common/http";
import * as i4 from "@project-sunbird/sunbird-quml-player-v9";
export class ViewerService {
/**
* @param {?} videoPlayerService
* @param {?} utilService
* @param {?} http
* @param {?} questionCursor
*/
constructor(videoPlayerService, utilService, http, questionCursor) {
this.videoPlayerService = videoPlayerService;
this.utilService = utilService;
this.http = http;
this.questionCursor = questionCursor;
this.endPageSeen = false;
this.timeSpent = '0:0';
this.version = '1.0';
this.playerEvent = new EventEmitter();
this.sidebarMenuEvent = new EventEmitter();
this.isAvailableLocally = false;
this.interceptionResponses = {};
this.showScore = false;
this.scoreObtained = 0;
this.contentMap = {};
this.isEndEventRaised = false;
this.PlayerLoadStartedAt = new Date().getTime();
}
/**
* @param {?} __0
* @return {?}
*/
initialize({ context, config, metadata }) {
this.contentName = metadata.name;
this.isAvailableLocally = metadata.isAvailableLocally;
this.streamingUrl = metadata.streamingUrl;
this.artifactUrl = metadata.artifactUrl;
this.mimeType = metadata.streamingUrl ? 'application/x-mpegURL' : metadata.mimeType;
this.artifactMimeType = metadata.mimeType;
this.isAvailableLocally = metadata.isAvailableLocally;
this.traceId = config.traceId;
this.interceptionPoints = metadata.interceptionPoints;
if (context.userData) {
const { userData: { firstName, lastName } } = context;
this.userName = firstName === lastName ? firstName : `${firstName} ${lastName}`;
}
this.metaData = {
actions: [],
volume: [],
playBackSpeeds: [],
totalDuration: 0,
muted: undefined,
currentDuration: undefined,
transcripts: []
};
this.transcripts = metadata.transcripts ? metadata.transcripts : [];
this.showDownloadPopup = false;
this.endPageSeen = false;
if (this.isAvailableLocally) {
/** @type {?} */
const basePath = (metadata.streamingUrl) ? (metadata.streamingUrl) : (metadata.basePath || metadata.baseDir);
this.streamingUrl = `${basePath}/${metadata.artifactUrl}`;
this.mimeType = metadata.mimeType;
}
}
/**
* @param {?} selectedTranscripts
* @return {?}
*/
handleTranscriptsData(selectedTranscripts) {
this.metaData.transcripts = selectedTranscripts;
if (!_.isArray(this.transcripts)) {
this.raiseExceptionLog('INVALID_TRANSCRIPT_DATATYPE', 'TRANSCRIPT', new Error('Transcript data should be array'), this.traceId);
return [];
}
else {
_.forEach(this.transcripts, (/**
* @param {?} value
* @return {?}
*/
(value) => {
if (!(_.some(this.transcripts, { language: value.language, artifactUrl: value.artifactUrl,
languageCode: value.languageCode, identifier: value.identifier }))) {
this.raiseExceptionLog('TRANSCRIPT_DATA_MISSING', 'TRANSCRIPT', new Error('Transcript object dose not have required fields'), this.traceId);
return [];
}
else if (!_.isEmpty(selectedTranscripts) &&
(_.last(selectedTranscripts) !== 'off' && _.last(selectedTranscripts) === value.languageCode)) {
value.default = true;
}
}));
}
return this.transcripts;
}
/**
* @return {?}
*/
getPlayerOptions() {
return __awaiter(this, void 0, void 0, function* () {
if (!this.streamingUrl) {
return [{ src: this.artifactUrl, type: this.artifactMimeType }];
}
else {
/** @type {?} */
const data = yield this.http.head(this.streamingUrl, { responseType: 'blob' }).toPromise().catch((/**
* @param {?} error
* @return {?}
*/
error => {
// tslint:disable-next-line:max-line-length
this.raiseExceptionLog(errorCode.streamingUrlSupport, errorMessage.streamingUrlSupport, new Error(`Streaming Url Not Supported ${this.streamingUrl}`), this.traceId);
}));
if (data) {
return [{ src: this.streamingUrl, type: this.mimeType }];
}
else {
return [{ src: this.artifactUrl, type: this.artifactMimeType }];
}
}
});
}
/**
* @return {?}
*/
getMarkers() {
var _a, _b;
if ((_b = (_a = this) === null || _a === void 0 ? void 0 : _a.interceptionPoints) === null || _b === void 0 ? void 0 : _b.items) {
try {
/** @type {?} */
const interceptionPoints = this.interceptionPoints;
this.showScore = true;
return interceptionPoints.items.map((/**
* @param {?} __0
* @return {?}
*/
({ interceptionPoint, identifier, type }) => {
return { time: interceptionPoint, type, identifier, duration: 3 };
}));
}
catch (error) {
console.log(error);
this.raiseExceptionLog('CPV2_CONT_INTERCEPTION_PARSE', 'error parsing the inteception points string', error, '');
this.showScore = false;
}
}
return null;
}
/**
* @param {?} identifier
* @return {?}
*/
getQuestionSet(identifier) {
/** @type {?} */
const content = this.contentMap[identifier];
if (!content) {
if (!this.questionCursor) {
return null;
}
else {
return this.questionCursor.getQuestionSet(identifier)
.pipe(map((/**
* @param {?} response
* @return {?}
*/
(response) => {
this.contentMap[identifier] = response.questionSet;
return this.contentMap[identifier];
})));
}
}
else {
return of(content);
}
}
/**
* @return {?}
*/
preFetchContent() {
/** @type {?} */
const nextMarker = this.getNextMarker();
if (nextMarker) {
/** @type {?} */
const identifier = nextMarker.identifier;
this.getQuestionSet(nextMarker.identifier);
}
}
/**
* @return {?}
*/
getNextMarker() {
/** @type {?} */
const currentTime = this.playerInstance.currentTime();
/** @type {?} */
const markersList = this.getMarkers();
if (!markersList) {
return null;
}
return markersList.find((/**
* @param {?} marker
* @return {?}
*/
marker => {
/** @type {?} */
const markerTime = marker.time;
return markerTime > currentTime;
}));
}
/**
* @param {?} event
* @return {?}
*/
raiseStartEvent(event) {
/** @type {?} */
const duration = new Date().getTime() - this.PlayerLoadStartedAt;
/** @type {?} */
const startEvent = {
eid: 'START',
ver: this.version,
edata: {
type: 'START',
mode: 'play',
duration
},
metaData: this.metaData
};
this.playerEvent.emit(startEvent);
this.videoPlayerService.start(duration);
this.PlayerLoadStartedAt = new Date().getTime();
}
/**
* @return {?}
*/
calculateScore() {
this.scoreObtained = Object.values(this.interceptionResponses).reduce((
// tslint:disable-next-line:no-string-literal
/**
* @param {?} acc
* @param {?} response
* @return {?}
*/
(acc, response) => acc + response['score']), 0);
}
/**
* @return {?}
*/
raiseEndEvent() {
if (!this.isEndEventRaised) {
this.calculateScore();
/** @type {?} */
const duration = new Date().getTime() - this.PlayerLoadStartedAt;
/** @type {?} */
const endEvent = {
eid: 'END',
ver: this.version,
edata: {
type: 'END',
currentTime: this.currentlength,
totalTime: this.totalLength,
duration
},
metaData: this.metaData
};
this.playerEvent.emit(endEvent);
this.timeSpent = this.utilService.getTimeSpentText(this.visitedLength);
this.videoPlayerService.end(duration, this.totalLength, this.currentlength, this.endPageSeen, this.totalSeekedLength, this.visitedLength / 1000, this.scoreObtained);
this.isEndEventRaised = true;
}
}
/**
* @param {?} type
* @param {?=} extraValues
* @return {?}
*/
raiseHeartBeatEvent(type, extraValues) {
if (type === 'REPLAY') {
this.interceptionResponses = {};
this.showScore = false;
this.scoreObtained = 0;
}
/** @type {?} */
const hearBeatEvent = {
eid: 'HEARTBEAT',
ver: this.version,
edata: {
type,
currentPage: 'videostage',
extra: extraValues
},
metaData: this.metaData
};
this.playerEvent.emit(hearBeatEvent);
this.videoPlayerService.heartBeat(hearBeatEvent);
/** @type {?} */
const interactItems = ['PLAY', 'PAUSE', 'EXIT', 'VOLUME_CHANGE', 'DRAG',
'RATE_CHANGE', 'CLOSE_DOWNLOAD', 'DOWNLOAD', 'NAVIGATE_TO_PAGE',
'NEXT', 'OPEN_MENU', 'PREVIOUS', 'CLOSE_MENU', 'DOWNLOAD_MENU', 'DOWNLOAD_POPUP_CLOSE', 'DOWNLOAD_POPUP_CANCEL',
'SHARE', 'REPLAY', 'FORWARD', 'BACKWARD', 'FULLSCREEN', 'NEXT_CONTENT_PLAY', 'TRANSCRIPT_LANGUAGE_OFF',
'TRANSCRIPT_LANGUAGE_SELECTED', 'VIDEO_MARKER_SELECTED'
];
if (interactItems.includes(type)) {
this.videoPlayerService.interact(type.toLowerCase(), 'videostage', extraValues);
}
}
/**
* @param {?} pageId
* @param {?=} cdata
* @return {?}
*/
raiseImpressionEvent(pageId, cdata = {}) {
this.videoPlayerService.impression(pageId, cdata);
}
// tslint:disable-next-line:no-shadowed-variable
/**
* @param {?} errorCode
* @param {?} errorType
* @param {?} stacktrace
* @param {?} traceId
* @return {?}
*/
raiseExceptionLog(errorCode, errorType, stacktrace, traceId) {
/** @type {?} */
const exceptionLogEvent = {
eid: 'ERROR',
edata: {
err: errorCode,
errtype: errorType,
requestid: traceId || '',
stacktrace: (stacktrace && stacktrace.toString()) || '',
}
};
this.playerEvent.emit(exceptionLogEvent);
this.videoPlayerService.error(errorCode, errorType, stacktrace);
}
}
ViewerService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
ViewerService.ctorParameters = () => [
{ type: SunbirdVideoPlayerService },
{ type: UtilService },
{ type: HttpClient },
{ type: QuestionCursor, decorators: [{ type: Optional }] }
];
/** @nocollapse */ ViewerService.ɵprov = i0.ɵɵdefineInjectable({ factory: function ViewerService_Factory() { return new ViewerService(i0.ɵɵinject(i1.SunbirdVideoPlayerService), i0.ɵɵinject(i2.UtilService), i0.ɵɵinject(i3.HttpClient), i0.ɵɵinject(i4.QuestionCursor, 8)); }, token: ViewerService, providedIn: "root" });
if (false) {
/** @type {?} */
ViewerService.prototype.endPageSeen;
/** @type {?} */
ViewerService.prototype.timeSpent;
/**
* @type {?}
* @private
*/
ViewerService.prototype.version;
/** @type {?} */
ViewerService.prototype.playerEvent;
/** @type {?} */
ViewerService.prototype.contentName;
/** @type {?} */
ViewerService.prototype.showDownloadPopup;
/** @type {?} */
ViewerService.prototype.streamingUrl;
/** @type {?} */
ViewerService.prototype.mimeType;
/** @type {?} */
ViewerService.prototype.artifactMimeType;
/** @type {?} */
ViewerService.prototype.userName;
/** @type {?} */
ViewerService.prototype.metaData;
/** @type {?} */
ViewerService.prototype.PlayerLoadStartedAt;
/** @type {?} */
ViewerService.prototype.totalLength;
/** @type {?} */
ViewerService.prototype.currentlength;
/** @type {?} */
ViewerService.prototype.totalSeekedLength;
/** @type {?} */
ViewerService.prototype.artifactUrl;
/** @type {?} */
ViewerService.prototype.visitedLength;
/** @type {?} */
ViewerService.prototype.sidebarMenuEvent;
/** @type {?} */
ViewerService.prototype.traceId;
/** @type {?} */
ViewerService.prototype.isAvailableLocally;
/** @type {?} */
ViewerService.prototype.interceptionPoints;
/** @type {?} */
ViewerService.prototype.interceptionResponses;
/** @type {?} */
ViewerService.prototype.showScore;
/** @type {?} */
ViewerService.prototype.scoreObtained;
/** @type {?} */
ViewerService.prototype.maxScore;
/** @type {?} */
ViewerService.prototype.playerInstance;
/** @type {?} */
ViewerService.prototype.contentMap;
/** @type {?} */
ViewerService.prototype.isEndEventRaised;
/** @type {?} */
ViewerService.prototype.transcripts;
/**
* @type {?}
* @private
*/
ViewerService.prototype.videoPlayerService;
/**
* @type {?}
* @private
*/
ViewerService.prototype.utilService;
/**
* @type {?}
* @private
*/
ViewerService.prototype.http;
/** @type {?} */
ViewerService.prototype.questionCursor;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZGljZGlrc2hhb3JnL3ZpZGVvLXBsYXllci1tb2JpbGUtdjkvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvdmlld2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRyxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDekUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxLQUFLLENBQUMsTUFBTSxXQUFXLENBQUM7Ozs7OztBQUsvQixNQUFNLE9BQU8sYUFBYTs7Ozs7OztJQStCeEIsWUFBb0Isa0JBQTZDLEVBQzdDLFdBQXdCLEVBQ3hCLElBQWdCLEVBQ0wsY0FBOEI7UUFIekMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUEyQjtRQUM3QyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ0wsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBaEN0RCxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDakIsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBY3RD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LDhDQUF1Qzs7SUFDdkMsa0NBQXlCOztJQUN6QixzQ0FBOEI7O0lBQzlCLGlDQUF3Qjs7SUFDeEIsdUNBQTJCOztJQUMzQixtQ0FBdUI7O0lBQ3ZCLHlDQUFnQzs7SUFDaEMsb0NBQWdDOzs7OztJQUNwQiwyQ0FBcUQ7Ozs7O0lBQ3JELG9DQUFnQzs7Ozs7SUFDaEMsNkJBQXdCOztJQUN4Qix1Q0FBaUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGxheWVyQ29uZmlnLCBUcmFuc2NyaXB0cyB9IGZyb20gJy4uL3BsYXllckludGVyZmFjZXMnO1xuaW1wb3J0IHsgU3VuYmlyZFZpZGVvUGxheWVyU2VydmljZSB9IGZyb20gJy4uL3N1bmJpcmQtdmlkZW8tcGxheWVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXRpbFNlcnZpY2UgfSBmcm9tICcuL3V0aWwuc2VydmljZSc7XG5pbXBvcnQgeyBlcnJvckNvZGUgLCBlcnJvck1lc3NhZ2UgfSBmcm9tICdAZGljZGlrc2hhb3JnL3BsYXllci1zZGstdjknO1xuaW1wb3J0IHsgUXVlc3Rpb25DdXJzb3IgfSBmcm9tICdAcHJvamVjdC1zdW5iaXJkL3N1bmJpcmQtcXVtbC1wbGF5ZXItdjknO1xuaW1wb3J0IHsgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoLWVzJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVmlld2VyU2VydmljZSB7XG5cbiAgcHVibGljIGVuZFBhZ2VTZWVuID0gZmFsc2U7XG4gIHB1YmxpYyB0aW1lU3BlbnQgPSAnMDowJztcbiAgcHJpdmF0ZSB2ZXJzaW9uID0gJzEuMCc7XG4gIHB1YmxpYyBwbGF5ZXJFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBwdWJsaWMgY29udGVudE5hbWU6IHN0cmluZztcbiAgcHVibGljIHNob3dEb3dubG9hZFBvcHVwOiBib29sZWFuO1xuICBwdWJsaWMgc3RyZWFtaW5nVXJsOiBzdHJpbmc7XG4gIHB1YmxpYyBtaW1lVHlwZTogc3RyaW5nO1xuICBwdWJsaWMgYXJ0aWZhY3RNaW1lVHlwZTogc3RyaW5nO1xuICBwdWJsaWMgdXNlck5hbWU6IHN0cmluZztcbiAgcHVibGljIG1ldGFEYXRhOiBhbnk7XG4gIHB1YmxpYyBQbGF5ZXJMb2FkU3RhcnRlZEF0OiBudW1iZXI7XG4gIHB1YmxpYyB0b3RhbExlbmd0aDtcbiAgcHVibGljIGN1cnJlbnRsZW5ndGg7XG4gIHB1YmxpYyB0b3RhbFNlZWtlZExlbmd0aDtcbiAgcHVibGljIGFydGlmYWN0VXJsO1xuICBwdWJsaWMgdmlzaXRlZExlbmd0aDtcbiAgcHVibGljIHNpZGViYXJNZW51RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgcHVibGljIHRyYWNlSWQ6IHN0cmluZztcbiAgcHVibGljIGlzQXZhaWxhYmxlTG9jYWxseSA9IGZhbHNlO1xuICBwdWJsaWMgaW50ZXJjZXB0aW9uUG9pbnRzOiBhbnk7XG4gIHB1YmxpYyBpbnRlcmNlcHRpb25SZXNwb25zZXM6IGFueSA9IHt9O1xuICBwdWJsaWMgc2hvd1Njb3JlID0gZmFsc2U7XG4gIHB1YmxpYyBzY29yZU9idGFpbmVkOiBhbnkgPSAwO1xuICBwdWJsaWMgbWF4U2NvcmU6IG51bWJlcjtcbiAgcHVibGljIHBsYXllckluc3RhbmNlOiBhbnk7XG4gIHB1YmxpYyBjb250ZW50TWFwID0ge307XG4gIHB1YmxpYyBpc0VuZEV2ZW50UmFpc2VkID0gZmFsc2U7XG4gIHB1YmxpYyB0cmFuc2NyaXB0czogVHJhbnNjcmlwdHM7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdmlkZW9QbGF5ZXJTZXJ2aWNlOiBTdW5iaXJkVmlkZW9QbGF5ZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIHV0aWxTZXJ2aWNlOiBVdGlsU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBwdWJsaWMgcXVlc3Rpb25DdXJzb3I6IFF1ZXN0aW9uQ3Vyc29yKSB7XG4gICAgdGhpcy5QbGF5ZXJMb2FkU3RhcnRlZEF0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gIH1cblxuICBpbml0aWFsaXplKHsgY29udGV4dCwgY29uZmlnLCBtZXRhZGF0YSB9OiBQbGF5ZXJDb25maWcpIHtcbiAgICB0aGlzLmNvbnRlbnROYW1lID0gbWV0YWRhdGEubmFtZTtcbiAgICB0aGlzLmlzQXZhaWxhYmxlTG9jYWxseSA9IG1ldGFkYXRhLmlzQXZhaWxhYmxlTG9jYWxseTtcbiAgICB0aGlzLnN0cmVhbWluZ1VybCA9IG1ldGFkYXRhLnN0cmVhbWluZ1VybDtcbiAgICB0aGlzLmFydGlmYWN0VXJsID0gbWV0YWRhdGEuYXJ0aWZhY3RVcmw7XG4gICAgdGhpcy5taW1lVHlwZSA9IG1ldGFkYXRhLnN0cmVhbWluZ1VybCA/ICdhcHBsaWNhdGlvbi94LW1wZWdVUkwnIDogbWV0YWRhdGEubWltZVR5cGU7XG4gICAgdGhpcy5hcnRpZmFjdE1pbWVUeXBlID0gbWV0YWRhdGEubWltZVR5cGU7XG4gICAgdGhpcy5pc0F2YWlsYWJsZUxvY2FsbHkgPSBtZXRhZGF0YS5pc0F2YWlsYWJsZUxvY2FsbHk7XG4gICAgdGhpcy50cmFjZUlkID0gY29uZmlnLnRyYWNlSWQ7XG4gICAgdGhpcy5pbnRlcmNlcHRpb25Qb2ludHMgPSBtZXRhZGF0YS5pbnRlcmNlcHRpb25Qb2ludHM7XG4gICAgaWYgKGNvbnRleHQudXNlckRhdGEpIHtcbiAgICAgIGNvbnN0IHsgdXNlckRhdGE6IHsgZmlyc3ROYW1lLCBsYXN0TmFtZSB9IH0gPSBjb250ZXh0O1xuICAgICAgdGhpcy51c2VyTmFtZSA9IGZpcnN0TmFtZSA9PT0gbGFzdE5hbWUgPyBmaXJzdE5hbWUgOiBgJHtmaXJzdE5hbWV9ICR7bGFzdE5hbWV9YDtcbiAgICB9XG4gICAgdGhpcy5tZXRhRGF0YSA9IHtcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgIF0sXG4gICAgICB2b2x1bWU6IFtdLFxuICAgICAgcGxheUJhY2tTcGVlZHM6IFtdLFxuICAgICAgdG90YWxEdXJhdGlvbjogMCxcbiAgICAgIG11dGVkOiB1bmRlZmluZWQsXG4gICAgICBjdXJyZW50RHVyYXRpb246IHVuZGVmaW5lZCxcbiAgICAgIHRyYW5zY3JpcHRzOiBbXVxuICAgIH07XG4gICAgdGhpcy50cmFuc2NyaXB0cyA9IG1ldGFkYXRhLnRyYW5zY3JpcHRzID8gbWV0YWRhdGEudHJhbnNjcmlwdHMgOiBbXTtcbiAgICB0aGlzLnNob3dEb3dubG9hZFBvcHVwID0gZmFsc2U7XG4gICAgdGhpcy5lbmRQYWdlU2VlbiA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmlzQXZhaWxhYmxlTG9jYWxseSkge1xuICAgICAgY29uc3QgYmFzZVBhdGggPSAobWV0YWRhdGEuc3RyZWFtaW5nVXJsKSA/IChtZXRhZGF0YS5zdHJlYW1pbmdVcmwpIDogKG1ldGFkYXRhLmJhc2VQYXRoIHx8IG1ldGFkYXRhLmJhc2VEaXIpO1xuICAgICAgdGhpcy5zdHJlYW1pbmdVcmwgPSBgJHtiYXNlUGF0aH0vJHttZXRhZGF0YS5hcnRpZmFjdFVybH1gO1xuICAgICAgdGhpcy5taW1lVHlwZSA9IG1ldGFkYXRhLm1pbWVUeXBlO1xuICAgIH1cbiAgfVxuICBoYW5kbGVUcmFuc2NyaXB0c0RhdGEoc2VsZWN0ZWRUcmFuc2NyaXB0cykge1xuICAgIHRoaXMubWV0YURhdGEudHJhbnNjcmlwdHMgPSBzZWxlY3RlZFRyYW5zY3JpcHRzO1xuICAgIGlmICghXy5pc0FycmF5KHRoaXMudHJhbnNjcmlwdHMpKSB7XG4gICAgICB0aGlzLnJhaXNlRXhjZXB0aW9uTG9nKCdJTlZBTElEX1RSQU5TQ1JJUFRfREFUQVRZUEUnLCAnVFJBTlNDUklQVCcsIG5ldyBFcnJvcignVHJhbnNjcmlwdCBkYXRhIHNob3VsZCBiZSBhcnJheScpLCB0aGlzLnRyYWNlSWQpO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLnRyYW5zY3JpcHRzLCAodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKCEoXy5zb21lKHRoaXMudHJhbnNjcmlwdHMsIHsgbGFuZ3VhZ2U6IHZhbHVlLmxhbmd1YWdlLCBhcnRpZmFjdFVybDogdmFsdWUuYXJ0aWZhY3RVcmwgLFxuICAgICAgICAgIGxhbmd1YWdlQ29kZTogdmFsdWUubGFuZ3VhZ2VDb2RlLCBpZGVudGlmaWVyOiB2YWx1ZS5pZGVudGlmaWVyfSkpKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZUV4Y2VwdGlvbkxvZygnVFJBTlNDUklQVF9EQVRBX01JU1NJTkcnLCAnVFJBTlNDUklQVCcsXG4gICAgICAgICAgIG5ldyBFcnJvcignVHJhbnNjcmlwdCBvYmplY3QgZG9zZSBub3QgaGF2ZSByZXF1aXJlZCBmaWVsZHMnKSwgdGhpcy50cmFjZUlkKTtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH0gZWxzZSBpZiAoIV8uaXNFbXB0eShzZWxlY3RlZFRyYW5zY3JpcHRzKSAmJlxuICAgICAgICAgICggXy5sYXN0KHNlbGVjdGVkVHJhbnNjcmlwdHMpICE9PSAnb2ZmJyAmJiAgXy5sYXN0KHNlbGVjdGVkVHJhbnNjcmlwdHMpID09PSB2YWx1ZS5sYW5ndWFnZUNvZGUpKSB7XG4gICAgICAgICAgdmFsdWUuZGVmYXVsdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50cmFuc2NyaXB0cztcbiAgfVxuICBhc3luYyBnZXRQbGF5ZXJPcHRpb25zKCkge1xuICAgIGlmICghdGhpcy5zdHJlYW1pbmdVcmwpIHtcbiAgICAgIHJldHVybiBbeyBzcmM6IHRoaXMuYXJ0aWZhY3RVcmwsIHR5cGU6IHRoaXMuYXJ0aWZhY3RNaW1lVHlwZSB9XTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuaHR0cC5oZWFkKHRoaXMuc3RyZWFtaW5nVXJsLCB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InIH0pLnRvUHJvbWlzZSgpLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICB0aGlzLnJhaXNlRXhjZXB0aW9uTG9nKGVycm9yQ29kZS5zdHJlYW1pbmdVcmxTdXBwb3J0ICwgZXJyb3JNZXNzYWdlLnN0cmVhbWluZ1VybFN1cHBvcnQgLCBuZXcgRXJyb3IoYFN0cmVhbWluZyBVcmwgTm90IFN1cHBvcnRlZCAgJHt0aGlzLnN0cmVhbWluZ1VybH1gKSwgdGhpcy50cmFjZUlkKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIFt7IHNyYzogdGhpcy5zdHJlYW1pbmdVcmwsIHR5cGU6IHRoaXMubWltZVR5cGUgfV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW3sgc3JjOiB0aGlzLmFydGlmYWN0VXJsLCB0eXBlOiB0aGlzLmFydGlmYWN0TWltZVR5cGUgfV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0TWFya2VycygpICB7XG4gICAgaWYgKHRoaXM/LmludGVyY2VwdGlvblBvaW50cz8uaXRlbXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGludGVyY2VwdGlvblBvaW50cyA9IHRoaXMuaW50ZXJjZXB0aW9uUG9pbnRzO1xuICAgICAgICB0aGlzLnNob3dTY29yZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBpbnRlcmNlcHRpb25Qb2ludHMuaXRlbXMubWFwKCh7aW50ZXJjZXB0aW9uUG9pbnQsIGlkZW50aWZpZXIsIHR5cGV9KSA9PiB7XG4gICAgICAgIHJldHVybiB7IHRpbWU6IGludGVyY2VwdGlvblBvaW50LCB0eXBlLCBpZGVudGlmaWVyLCBkdXJhdGlvbjogMyB9O1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgdGhpcy5yYWlzZUV4Y2VwdGlvbkxvZygnQ1BWMl9DT05UX0lOVEVSQ0VQVElPTl9QQVJTRScsICdlcnJvciBwYXJzaW5nIHRoZSBpbnRlY2VwdGlvbiBwb2ludHMgc3RyaW5nJywgZXJyb3IsICcnKTtcbiAgICAgICAgdGhpcy5zaG93U2NvcmUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuXG4gIGdldFF1ZXN0aW9uU2V0KGlkZW50aWZpZXIpIHtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5jb250ZW50TWFwW2lkZW50aWZpZXJdO1xuICAgIGlmICghY29udGVudCkge1xuICAgICAgaWYgKCF0aGlzLnF1ZXN0aW9uQ3Vyc29yKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb25DdXJzb3IuZ2V0UXVlc3Rpb25TZXQoaWRlbnRpZmllcilcbiAgICAgLnBpcGUobWFwKChyZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLmNvbnRlbnRNYXBbaWRlbnRpZmllcl0gPSByZXNwb25zZS5xdWVzdGlvblNldDtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudE1hcFtpZGVudGlmaWVyXTtcbiAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvZihjb250ZW50KTtcbiAgICB9XG4gIH1cblxuICBwcmVGZXRjaENvbnRlbnQoKSB7XG4gICAgY29uc3QgbmV4dE1hcmtlciA9IHRoaXMuZ2V0TmV4dE1hcmtlcigpO1xuICAgIGlmIChuZXh0TWFya2VyKSB7XG4gICAgICBjb25zdCBpZGVudGlmaWVyID0gbmV4dE1hcmtlci5pZGVudGlmaWVyO1xuICAgICAgdGhpcy5nZXRRdWVzdGlvblNldChuZXh0TWFya2VyLmlkZW50aWZpZXIpO1xuICAgIH1cbiAgfVxuXG4gIGdldE5leHRNYXJrZXIoKSB7XG4gICAgY29uc3QgY3VycmVudFRpbWUgPSB0aGlzLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKCk7XG4gICAgY29uc3QgbWFya2Vyc0xpc3QgPSB0aGlzLmdldE1hcmtlcnMoKTtcbiAgICBpZiAoIW1hcmtlcnNMaXN0KSB7IHJldHVybiBudWxsOyB9XG5cbiAgICByZXR1cm4gbWFya2Vyc0xpc3QuZmluZChtYXJrZXIgPT4ge1xuICAgICAgY29uc3QgbWFya2VyVGltZSA9IG1hcmtlci50aW1lO1xuICAgICAgcmV0dXJuIG1hcmtlclRpbWUgPiBjdXJyZW50VGltZTtcbiAgICB9KTtcbiAgfVxuXG4gIHJhaXNlU3RhcnRFdmVudChldmVudCkge1xuICAgIGNvbnN0IGR1cmF0aW9uID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSB0aGlzLlBsYXllckxvYWRTdGFydGVkQXQ7XG4gICAgY29uc3Qgc3RhcnRFdmVudCA9IHtcbiAgICAgIGVpZDogJ1NUQVJUJyxcbiAgICAgIHZlcjogdGhpcy52ZXJzaW9uLFxuICAgICAgZWRhdGE6IHtcbiAgICAgICAgdHlwZTogJ1NUQVJUJyxcbiAgICAgICAgbW9kZTogJ3BsYXknLFxuICAgICAgICBkdXJhdGlvblxuICAgICAgfSxcbiAgICAgIG1ldGFEYXRhOiB0aGlzLm1ldGFEYXRhXG4gICAgfTtcbiAgICB0aGlzLnBsYXllckV2ZW50LmVtaXQoc3RhcnRFdmVudCk7XG4gICAgdGhpcy52aWRlb1BsYXllclNlcnZpY2Uuc3RhcnQoZHVyYXRpb24pO1xuICAgIHRoaXMuUGxheWVyTG9hZFN0YXJ0ZWRBdCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICB9XG5cbiAgY2FsY3VsYXRlU2NvcmUoKSB7XG4gICAgdGhpcy5zY29yZU9idGFpbmVkID0gIE9iamVjdC52YWx1ZXModGhpcy5pbnRlcmNlcHRpb25SZXNwb25zZXMpLnJlZHVjZShcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1zdHJpbmctbGl0ZXJhbFxuICAgICAgKGFjYywgcmVzcG9uc2UpID0+IGFjYyArIHJlc3BvbnNlWydzY29yZSddICwgMCk7XG4gIH1cblxuICByYWlzZUVuZEV2ZW50KCkge1xuICAgIGlmICghdGhpcy5pc0VuZEV2ZW50UmFpc2VkKSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZVNjb3JlKCk7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gdGhpcy5QbGF5ZXJMb2FkU3RhcnRlZEF0O1xuICAgICAgY29uc3QgZW5kRXZlbnQgPSB7XG4gICAgICAgIGVpZDogJ0VORCcsXG4gICAgICAgIHZlcjogdGhpcy52ZXJzaW9uLFxuICAgICAgICBlZGF0YToge1xuICAgICAgICAgIHR5cGU6ICdFTkQnLFxuICAgICAgICAgIGN1cnJlbnRUaW1lOiB0aGlzLmN1cnJlbnRsZW5ndGgsXG4gICAgICAgICAgdG90YWxUaW1lOiB0aGlzLnRvdGFsTGVuZ3RoLFxuICAgICAgICAgIGR1cmF0aW9uXG4gICAgICAgIH0sXG4gICAgICAgIG1ldGFEYXRhOiB0aGlzLm1ldGFEYXRhXG4gICAgICB9O1xuICAgICAgdGhpcy5wbGF5ZXJFdmVudC5lbWl0KGVuZEV2ZW50KTtcbiAgICAgIHRoaXMudGltZVNwZW50ID0gdGhpcy51dGlsU2VydmljZS5nZXRUaW1lU3BlbnRUZXh0KHRoaXMudmlzaXRlZExlbmd0aCk7XG4gICAgICB0aGlzLnZpZGVvUGxheWVyU2VydmljZS5lbmQoXG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgICB0aGlzLnRvdGFsTGVuZ3RoLFxuICAgICAgICB0aGlzLmN1cnJlbnRsZW5ndGgsXG4gICAgICAgIHRoaXMuZW5kUGFnZVNlZW4sXG4gICAgICAgIHRoaXMudG90YWxTZWVrZWRMZW5ndGgsXG4gICAgICAgIHRoaXMudmlzaXRlZExlbmd0aCAvIDEwMDAsXG4gICAgICAgIHRoaXMuc2NvcmVPYnRhaW5lZFxuICAgICAgKTtcbiAgICAgIHRoaXMuaXNFbmRFdmVudFJhaXNlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cblxuICByYWlzZUhlYXJ0QmVhdEV2ZW50KHR5cGU6IHN0cmluZywgZXh0cmFWYWx1ZXM/KSB7XG4gICAgaWYgKHR5cGUgPT09ICdSRVBMQVknKSB7XG4gICAgICB0aGlzLmludGVyY2VwdGlvblJlc3BvbnNlcyA9IHt9O1xuICAgICAgdGhpcy5zaG93U2NvcmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2NvcmVPYnRhaW5lZCA9IDA7XG4gICAgfVxuICAgIGNvbnN0IGhlYXJCZWF0RXZlbnQgPSB7XG4gICAgICBlaWQ6ICdIRUFSVEJFQVQnLFxuICAgICAgdmVyOiB0aGlzLnZlcnNpb24sXG4gICAgICBlZGF0YToge1xuICAgICAgICB0eXBlLFxuICAgICAgICBjdXJyZW50UGFnZTogJ3ZpZGVvc3RhZ2UnLFxuICAgICAgICBleHRyYTogZXh0cmFWYWx1ZXNcbiAgICAgIH0sXG4gICAgICBtZXRhRGF0YTogdGhpcy5tZXRhRGF0YVxuICAgIH07XG4gICAgdGhpcy5wbGF5ZXJFdmVudC5lbWl0KGhlYXJCZWF0RXZlbnQpO1xuICAgIHRoaXMudmlkZW9QbGF5ZXJTZXJ2aWNlLmhlYXJ0QmVhdChoZWFyQmVhdEV2ZW50KTtcbiAgICBjb25zdCBpbnRlcmFjdEl0ZW1zID0gWydQTEFZJywgJ1BBVVNFJywgJ0VYSVQnLCAnVk9MVU1FX0NIQU5HRScsICdEUkFHJyxcbiAgICAgICdSQVRFX0NIQU5HRScsICdDTE9TRV9ET1dOTE9BRCcsICdET1dOTE9BRCcsICdOQVZJR0FURV9UT19QQUdFJyxcbiAgICAgICdORVhUJywgJ09QRU5fTUVOVScsICdQUkVWSU9VUycsICdDTE9TRV9NRU5VJywgJ0RPV05MT0FEX01FTlUnLCAnRE9XTkxPQURfUE9QVVBfQ0xPU0UnLCAnRE9XTkxPQURfUE9QVVBfQ0FOQ0VMJyxcbiAgICAgICdTSEFSRScsICdSRVBMQVknLCAnRk9SV0FSRCcsICdCQUNLV0FSRCcsICdGVUxMU0NSRUVOJywgJ05FWFRfQ09OVEVOVF9QTEFZJywgJ1RSQU5TQ1JJUFRfTEFOR1VBR0VfT0ZGJyxcbiAgICAgICdUUkFOU0NSSVBUX0xBTkdVQUdFX1NFTEVDVEVEJywgJ1ZJREVPX01BUktFUl9TRUxFQ1RFRCdcbiAgICBdO1xuICAgIGlmIChpbnRlcmFjdEl0ZW1zLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICB0aGlzLnZpZGVvUGxheWVyU2VydmljZS5pbnRlcmFjdCh0eXBlLnRvTG93ZXJDYXNlKCksICd2aWRlb3N0YWdlJywgZXh0cmFWYWx1ZXMpO1xuICAgIH1cbiAgfVxuXG4gIHJhaXNlSW1wcmVzc2lvbkV2ZW50KHBhZ2VJZDogc3RyaW5nLCBjZGF0YTogYW55ID0ge30pIHtcbiAgICB0aGlzLnZpZGVvUGxheWVyU2VydmljZS5pbXByZXNzaW9uKHBhZ2VJZCwgY2RhdGEpO1xuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXNoYWRvd2VkLXZhcmlhYmxlXG4gIHJhaXNlRXhjZXB0aW9uTG9nKGVycm9yQ29kZTogc3RyaW5nLCBlcnJvclR5cGU6IHN0cmluZywgc3RhY2t0cmFjZSwgdHJhY2VJZCkge1xuICAgIGNvbnN0IGV4Y2VwdGlvbkxvZ0V2ZW50ID0ge1xuICAgICAgZWlkOiAnRVJST1InLFxuICAgICAgZWRhdGE6IHtcbiAgICAgICAgZXJyOiBlcnJvckNvZGUsXG4gICAgICAgIGVycnR5cGU6IGVycm9yVHlwZSxcbiAgICAgICAgcmVxdWVzdGlkOiB0cmFjZUlkIHx8ICcnLFxuICAgICAgICBzdGFja3RyYWNlOiAoc3RhY2t0cmFjZSAmJiBzdGFja3RyYWNlLnRvU3RyaW5nKCkpIHx8ICcnLFxuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5wbGF5ZXJFdmVudC5lbWl0KGV4Y2VwdGlvbkxvZ0V2ZW50KTtcbiAgICB0aGlzLnZpZGVvUGxheWVyU2VydmljZS5lcnJvcihlcnJvckNvZGUgLCBlcnJvclR5cGUgLCBzdGFja3RyYWNlKTtcbiAgfVxuXG59XG4iXX0=