dictrigyn-video-player
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
508 lines • 44.5 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, __generator } 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";
var ViewerService = /** @class */ (function () {
function ViewerService(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 {?}
*/
ViewerService.prototype.initialize = /**
* @param {?} __0
* @return {?}
*/
function (_a) {
var context = _a.context, config = _a.config, metadata = _a.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) {
var _b = context.userData, firstName = _b.firstName, lastName = _b.lastName;
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 {?} */
var basePath = (metadata.streamingUrl) ? (metadata.streamingUrl) : (metadata.basePath || metadata.baseDir);
this.streamingUrl = basePath + "/" + metadata.artifactUrl;
this.mimeType = metadata.mimeType;
}
};
/**
* @param {?} selectedTranscripts
* @return {?}
*/
ViewerService.prototype.handleTranscriptsData = /**
* @param {?} selectedTranscripts
* @return {?}
*/
function (selectedTranscripts) {
var _this = this;
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 {?}
*/
function (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 {?}
*/
ViewerService.prototype.getPlayerOptions = /**
* @return {?}
*/
function () {
return __awaiter(this, void 0, void 0, function () {
var data;
var _this = this;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (!!this.streamingUrl) return [3 /*break*/, 1];
return [2 /*return*/, [{ src: this.artifactUrl, type: this.artifactMimeType }]];
case 1: return [4 /*yield*/, this.http.head(this.streamingUrl, { responseType: 'blob' }).toPromise().catch((/**
* @param {?} error
* @return {?}
*/
function (error) {
// tslint:disable-next-line:max-line-length
_this.raiseExceptionLog(errorCode.streamingUrlSupport, errorMessage.streamingUrlSupport, new Error("Streaming Url Not Supported " + _this.streamingUrl), _this.traceId);
}))];
case 2:
data = _a.sent();
if (data) {
return [2 /*return*/, [{ src: this.streamingUrl, type: this.mimeType }]];
}
else {
return [2 /*return*/, [{ src: this.artifactUrl, type: this.artifactMimeType }]];
}
_a.label = 3;
case 3: return [2 /*return*/];
}
});
});
};
/**
* @return {?}
*/
ViewerService.prototype.getMarkers = /**
* @return {?}
*/
function () {
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 {?} */
var interceptionPoints = this.interceptionPoints;
this.showScore = true;
return interceptionPoints.items.map((/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var interceptionPoint = _a.interceptionPoint, identifier = _a.identifier, type = _a.type;
return { time: interceptionPoint, type: type, identifier: 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 {?}
*/
ViewerService.prototype.getQuestionSet = /**
* @param {?} identifier
* @return {?}
*/
function (identifier) {
var _this = this;
/** @type {?} */
var content = this.contentMap[identifier];
if (!content) {
if (!this.questionCursor) {
return null;
}
else {
return this.questionCursor.getQuestionSet(identifier)
.pipe(map((/**
* @param {?} response
* @return {?}
*/
function (response) {
_this.contentMap[identifier] = response.questionSet;
return _this.contentMap[identifier];
})));
}
}
else {
return of(content);
}
};
/**
* @return {?}
*/
ViewerService.prototype.preFetchContent = /**
* @return {?}
*/
function () {
/** @type {?} */
var nextMarker = this.getNextMarker();
if (nextMarker) {
/** @type {?} */
var identifier = nextMarker.identifier;
this.getQuestionSet(nextMarker.identifier);
}
};
/**
* @return {?}
*/
ViewerService.prototype.getNextMarker = /**
* @return {?}
*/
function () {
/** @type {?} */
var currentTime = this.playerInstance.currentTime();
/** @type {?} */
var markersList = this.getMarkers();
if (!markersList) {
return null;
}
return markersList.find((/**
* @param {?} marker
* @return {?}
*/
function (marker) {
/** @type {?} */
var markerTime = marker.time;
return markerTime > currentTime;
}));
};
/**
* @param {?} event
* @return {?}
*/
ViewerService.prototype.raiseStartEvent = /**
* @param {?} event
* @return {?}
*/
function (event) {
/** @type {?} */
var duration = new Date().getTime() - this.PlayerLoadStartedAt;
/** @type {?} */
var startEvent = {
eid: 'START',
ver: this.version,
edata: {
type: 'START',
mode: 'play',
duration: duration
},
metaData: this.metaData
};
this.playerEvent.emit(startEvent);
this.videoPlayerService.start(duration);
this.PlayerLoadStartedAt = new Date().getTime();
};
/**
* @return {?}
*/
ViewerService.prototype.calculateScore = /**
* @return {?}
*/
function () {
this.scoreObtained = Object.values(this.interceptionResponses).reduce((
// tslint:disable-next-line:no-string-literal
// tslint:disable-next-line:no-string-literal
/**
* @param {?} acc
* @param {?} response
* @return {?}
*/
function (acc, response) { return acc + response['score']; }), 0);
};
/**
* @return {?}
*/
ViewerService.prototype.raiseEndEvent = /**
* @return {?}
*/
function () {
if (!this.isEndEventRaised) {
this.calculateScore();
/** @type {?} */
var duration = new Date().getTime() - this.PlayerLoadStartedAt;
/** @type {?} */
var endEvent = {
eid: 'END',
ver: this.version,
edata: {
type: 'END',
currentTime: this.currentlength,
totalTime: this.totalLength,
duration: 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 {?}
*/
ViewerService.prototype.raiseHeartBeatEvent = /**
* @param {?} type
* @param {?=} extraValues
* @return {?}
*/
function (type, extraValues) {
if (type === 'REPLAY') {
this.interceptionResponses = {};
this.showScore = false;
this.scoreObtained = 0;
}
/** @type {?} */
var hearBeatEvent = {
eid: 'HEARTBEAT',
ver: this.version,
edata: {
type: type,
currentPage: 'videostage',
extra: extraValues
},
metaData: this.metaData
};
this.playerEvent.emit(hearBeatEvent);
this.videoPlayerService.heartBeat(hearBeatEvent);
/** @type {?} */
var 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 {?}
*/
ViewerService.prototype.raiseImpressionEvent = /**
* @param {?} pageId
* @param {?=} cdata
* @return {?}
*/
function (pageId, cdata) {
if (cdata === void 0) { cdata = {}; }
this.videoPlayerService.impression(pageId, cdata);
};
// tslint:disable-next-line:no-shadowed-variable
// tslint:disable-next-line:no-shadowed-variable
/**
* @param {?} errorCode
* @param {?} errorType
* @param {?} stacktrace
* @param {?} traceId
* @return {?}
*/
ViewerService.prototype.raiseExceptionLog =
// tslint:disable-next-line:no-shadowed-variable
/**
* @param {?} errorCode
* @param {?} errorType
* @param {?} stacktrace
* @param {?} traceId
* @return {?}
*/
function (errorCode, errorType, stacktrace, traceId) {
/** @type {?} */
var 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 = function () { return [
{ 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" });
return ViewerService;
}());
export { ViewerService };
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9kaWN0cmlneW4tdmlkZW8tcGxheWVyLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL3ZpZXdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDNUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxTQUFTLEVBQUcsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUIsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sS0FBSyxDQUFDLE1BQU0sV0FBVyxDQUFDOzs7Ozs7QUFFL0I7SUFrQ0UsdUJBQW9CLGtCQUE2QyxFQUM3QyxXQUF3QixFQUN4QixJQUFnQixFQUNMLGNBQThCO1FBSHpDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBMkI7UUFDN0MsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNMLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQWhDdEQsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNqQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQWN0QyxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FB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eEIsaUNBQXFCOztJQUNyQiw0Q0FBbUM7O0lBQ25DLG9DQUFtQjs7SUFDbkIsc0NBQXFCOztJQUNyQiwwQ0FBeUI7O0lBQ3pCLG9DQUFtQjs7SUFDbkIsc0NBQXFCOztJQUNyQix5Q0FBa0Q7O0lBQ2xELGdDQUF1Qjs7SUFDdkIsMkNBQWtDOztJQUNsQywyQ0FBK0I7O0lBQy9CLDhDQUF1Qzs7SUFDdkMsa0NBQXlCOztJQUN6QixzQ0FBOEI7O0lBQzlCLGlDQUF3Qjs7SUFDeEIsdUNBQTJCOztJQUMzQixtQ0FBdUI7O0lBQ3ZCLHlDQUFnQzs7SUFDaEMsb0NBQWdDOzs7OztJQUNwQiwyQ0FBcUQ7Ozs7O0lBQ3JELG9DQUFnQzs7Ozs7SUFDaEMsNkJBQXdCOztJQUN4Qix1Q0FBaUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFBsYXllckNvbmZpZywgVHJhbnNjcmlwdHMgfSBmcm9tICcuLi9wbGF5ZXJJbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgU3VuYmlyZFZpZGVvUGxheWVyU2VydmljZSB9IGZyb20gJy4uL3N1bmJpcmQtdmlkZW8tcGxheWVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVdGlsU2VydmljZSB9IGZyb20gJy4vdXRpbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgZXJyb3JDb2RlICwgZXJyb3JNZXNzYWdlIH0gZnJvbSAnQGRpY2Rpa3NoYW9yZy9wbGF5ZXItc2RrLXY5JztcclxuaW1wb3J0IHsgUXVlc3Rpb25DdXJzb3IgfSBmcm9tICdAcHJvamVjdC1zdW5iaXJkL3N1bmJpcmQtcXVtbC1wbGF5ZXItdjknO1xyXG5pbXBvcnQgeyBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoLWVzJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFZpZXdlclNlcnZpY2Uge1xyXG5cclxuICBwdWJsaWMgZW5kUGFnZVNlZW4gPSBmYWxzZTtcclxuICBwdWJsaWMgdGltZVNwZW50ID0gJzA6MCc7XHJcbiAgcHJpdmF0ZSB2ZXJzaW9uID0gJzEuMCc7XHJcbiAgcHVibGljIHBsYXllckV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgcHVibGljIGNvbnRlbnROYW1lOiBzdHJpbmc7XHJcbiAgcHVibGljIHNob3dEb3dubG9hZFBvcHVwOiBib29sZWFuO1xyXG4gIHB1YmxpYyBzdHJlYW1pbmdVcmw6IHN0cmluZztcclxuICBwdWJsaWMgbWltZVR5cGU6IHN0cmluZztcclxuICBwdWJsaWMgYXJ0aWZhY3RNaW1lVHlwZTogc3RyaW5nO1xyXG4gIHB1YmxpYyB1c2VyTmFtZTogc3RyaW5nO1xyXG4gIHB1YmxpYyBtZXRhRGF0YTogYW55O1xyXG4gIHB1YmxpYyBQbGF5ZXJMb2FkU3RhcnRlZEF0OiBudW1iZXI7XHJcbiAgcHVibGljIHRvdGFsTGVuZ3RoO1xyXG4gIHB1YmxpYyBjdXJyZW50bGVuZ3RoO1xyXG4gIHB1YmxpYyB0b3RhbFNlZWtlZExlbmd0aDtcclxuICBwdWJsaWMgYXJ0aWZhY3RVcmw7XHJcbiAgcHVibGljIHZpc2l0ZWRMZW5ndGg7XHJcbiAgcHVibGljIHNpZGViYXJNZW51RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBwdWJsaWMgdHJhY2VJZDogc3RyaW5nO1xyXG4gIHB1YmxpYyBpc0F2YWlsYWJsZUxvY2FsbHkgPSBmYWxzZTtcclxuICBwdWJsaWMgaW50ZXJjZXB0aW9uUG9pbnRzOiBhbnk7XHJcbiAgcHVibGljIGludGVyY2VwdGlvblJlc3BvbnNlczogYW55ID0ge307XHJcbiAgcHVibGljIHNob3dTY29yZSA9IGZhbHNlO1xyXG4gIHB1YmxpYyBzY29yZU9idGFpbmVkOiBhbnkgPSAwO1xyXG4gIHB1YmxpYyBtYXhTY29yZTogbnVtYmVyO1xyXG4gIHB1YmxpYyBwbGF5ZXJJbnN0YW5jZTogYW55O1xyXG4gIHB1YmxpYyBjb250ZW50TWFwID0ge307XHJcbiAgcHVibGljIGlzRW5kRXZlbnRSYWlzZWQgPSBmYWxzZTtcclxuICBwdWJsaWMgdHJhbnNjcmlwdHM6IFRyYW5zY3JpcHRzO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdmlkZW9QbGF5ZXJTZXJ2aWNlOiBTdW5iaXJkVmlkZW9QbGF5ZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgdXRpbFNlcnZpY2U6IFV0aWxTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBwdWJsaWMgcXVlc3Rpb25DdXJzb3I6IFF1ZXN0aW9uQ3Vyc29yKSB7XHJcbiAgICB0aGlzLlBsYXllckxvYWRTdGFydGVkQXQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICB9XHJcblxyXG4gIGluaXRpYWxpemUoeyBjb250ZXh0LCBjb25maWcsIG1ldGFkYXRhIH06IFBsYXllckNvbmZpZykge1xyXG4gICAgdGhpcy5jb250ZW50TmFtZSA9IG1ldGFkYXRhLm5hbWU7XHJcbiAgICB0aGlzLmlzQXZhaWxhYmxlTG9jYWxseSA9IG1ldGFkYXRhLmlzQXZhaWxhYmxlTG9jYWxseTtcclxuICAgIHRoaXMuc3RyZWFtaW5nVXJsID0gbWV0YWRhdGEuc3RyZWFtaW5nVXJsO1xyXG4gICAgdGhpcy5hcnRpZmFjdFVybCA9IG1ldGFkYXRhLmFydGlmYWN0VXJsO1xyXG4gICAgdGhpcy5taW1lVHlwZSA9IG1ldGFkYXRhLnN0cmVhbWluZ1VybCA/ICdhcHBsaWNhdGlvbi94LW1wZWdVUkwnIDogbWV0YWRhdGEubWltZVR5cGU7XHJcbiAgICB0aGlzLmFydGlmYWN0TWltZVR5cGUgPSBtZXRhZGF0YS5taW1lVHlwZTtcclxuICAgIHRoaXMuaXNBdmFpbGFibGVMb2NhbGx5ID0gbWV0YWRhdGEuaXNBdmFpbGFibGVMb2NhbGx5O1xyXG4gICAgdGhpcy50cmFjZUlkID0gY29uZmlnLnRyYWNlSWQ7XHJcbiAgICB0aGlzLmludGVyY2VwdGlvblBvaW50cyA9IG1ldGFkYXRhLmludGVyY2VwdGlvblBvaW50cztcclxuICAgIGlmIChjb250ZXh0LnVzZXJEYXRhKSB7XHJcbiAgICAgIGNvbnN0IHsgdXNlckRhdGE6IHsgZmlyc3ROYW1lLCBsYXN0TmFtZSB9IH0gPSBjb250ZXh0O1xyXG4gICAgICB0aGlzLnVzZXJOYW1lID0gZmlyc3ROYW1lID09PSBsYXN0TmFtZSA/IGZpcnN0TmFtZSA6IGAke2ZpcnN0TmFtZX0gJHtsYXN0TmFtZX1gO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tZXRhRGF0YSA9IHtcclxuICAgICAgYWN0aW9uczogW1xyXG4gICAgICBdLFxyXG4gICAgICB2b2x1bWU6IFtdLFxyXG4gICAgICBwbGF5QmFja1NwZWVkczogW10sXHJcbiAgICAgIHRvdGFsRHVyYXRpb246IDAsXHJcbiAgICAgIG11dGVkOiB1bmRlZmluZWQsXHJcbiAgICAgIGN1cnJlbnREdXJhdGlvbjogdW5kZWZpbmVkLFxyXG4gICAgICB0cmFuc2NyaXB0czogW11cclxuICAgIH07XHJcbiAgICB0aGlzLnRyYW5zY3JpcHRzID0gbWV0YWRhdGEudHJhbnNjcmlwdHMgPyBtZXRhZGF0YS50cmFuc2NyaXB0cyA6IFtdO1xyXG4gICAgdGhpcy5zaG93RG93bmxvYWRQb3B1cCA9IGZhbHNlO1xyXG4gICAgdGhpcy5lbmRQYWdlU2VlbiA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuaXNBdmFpbGFibGVMb2NhbGx5KSB7XHJcbiAgICAgIGNvbnN0IGJhc2VQYXRoID0gKG1ldGFkYXRhLnN0cmVhbWluZ1VybCkgPyAobWV0YWRhdGEuc3RyZWFtaW5nVXJsKSA6IChtZXRhZGF0YS5iYXNlUGF0aCB8fCBtZXRhZGF0YS5iYXNlRGlyKTtcclxuICAgICAgdGhpcy5zdHJlYW1pbmdVcmwgPSBgJHtiYXNlUGF0aH0vJHttZXRhZGF0YS5hcnRpZmFjdFVybH1gO1xyXG4gICAgICB0aGlzLm1pbWVUeXBlID0gbWV0YWRhdGEubWltZVR5cGU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGhhbmRsZVRyYW5zY3JpcHRzRGF0YShzZWxlY3RlZFRyYW5zY3JpcHRzKSB7XHJcbiAgICB0aGlzLm1ldGFEYXRhLnRyYW5zY3JpcHRzID0gc2VsZWN0ZWRUcmFuc2NyaXB0cztcclxuICAgIGlmICghXy5pc0FycmF5KHRoaXMudHJhbnNjcmlwdHMpKSB7XHJcbiAgICAgIHRoaXMucmFpc2VFeGNlcHRpb25Mb2coJ0lOVkFMSURfVFJBTlNDUklQVF9EQVRBVFlQRScsICdUUkFOU0NSSVBUJywgbmV3IEVycm9yKCdUcmFuc2NyaXB0IGRhdGEgc2hvdWxkIGJlIGFycmF5JyksIHRoaXMudHJhY2VJZCk7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgXy5mb3JFYWNoKHRoaXMudHJhbnNjcmlwdHMsICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGlmICghKF8uc29tZSh0aGlzLnRyYW5zY3JpcHRzLCB7IGxhbmd1YWdlOiB2YWx1ZS5sYW5ndWFnZSwgYXJ0aWZhY3RVcmw6IHZhbHVlLmFydGlmYWN0VXJsICxcclxuICAgICAgICAgIGxhbmd1YWdlQ29kZTogdmFsdWUubGFuZ3VhZ2VDb2RlLCBpZGVudGlmaWVyOiB2YWx1ZS5pZGVudGlmaWVyfSkpKSB7XHJcbiAgICAgICAgICB0aGlzLnJhaXNlRXhjZXB0aW9uTG9nKCdUUkFOU0NSSVBUX0RBVEFfTUlTU0lORycsICdUUkFOU0NSSVBUJyxcclxuICAgICAgICAgICBuZXcgRXJyb3IoJ1RyYW5zY3JpcHQgb2JqZWN0IGRvc2Ugbm90IGhhdmUgcmVxdWlyZWQgZmllbGRzJyksIHRoaXMudHJhY2VJZCk7XHJcbiAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfSBlbHNlIGlmICghXy5pc0VtcHR5KHNlbGVjdGVkVHJhbnNjcmlwdHMpICYmXHJcbiAgICAgICAgICAoIF8ubGFzdChzZWxlY3RlZFRyYW5zY3JpcHRzKSAhPT0gJ29mZicgJiYgIF8ubGFzdChzZWxlY3RlZFRyYW5zY3JpcHRzKSA9PT0gdmFsdWUubGFuZ3VhZ2VDb2RlKSkge1xyXG4gICAgICAgICAgdmFsdWUuZGVmYXVsdCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnRyYW5zY3JpcHRzO1xyXG4gIH1cclxuICBhc3luYyBnZXRQbGF5ZXJPcHRpb25zKCkge1xyXG4gICAgaWYgKCF0aGlzLnN0cmVhbWluZ1VybCkge1xyXG4gICAgICByZXR1cm4gW3sgc3JjOiB0aGlzLmFydGlmYWN0VXJsLCB0eXBlOiB0aGlzLmFydGlmYWN0TWltZVR5cGUgfV07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5odHRwLmhlYWQodGhpcy5zdHJlYW1pbmdVcmwsIHsgcmVzcG9uc2VUeXBlOiAnYmxvYicgfSkudG9Qcm9taXNlKCkuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgICAgICB0aGlzLnJhaXNlRXhjZXB0aW9uTG9nKGVycm9yQ29kZS5zdHJlYW1pbmdVcmxTdXBwb3J0ICwgZXJyb3JNZXNzYWdlLnN0cmVhbWluZ1VybFN1cHBvcnQgLCBuZXcgRXJyb3IoYFN0cmVhbWluZyBVcmwgTm90IFN1cHBvcnRlZCAgJHt0aGlzLnN0cmVhbWluZ1VybH1gKSwgdGhpcy50cmFjZUlkKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIFt7IHNyYzogdGhpcy5zdHJlYW1pbmdVcmwsIHR5cGU6IHRoaXMubWltZVR5cGUgfV07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIFt7IHNyYzogdGhpcy5hcnRpZmFjdFVybCwgdHlwZTogdGhpcy5hcnRpZmFjdE1pbWVUeXBlIH1dO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRNYXJrZXJzKCkgIHtcclxuICAgIGlmICh0aGlzPy5pbnRlcmNlcHRpb25Qb2ludHM/Lml0ZW1zKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgaW50ZXJjZXB0aW9uUG9pbnRzID0gdGhpcy5pbnRlcmNlcHRpb25Qb2ludHM7XHJcbiAgICAgICAgdGhpcy5zaG93U2NvcmUgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiBpbnRlcmNlcHRpb25Qb2ludHMuaXRlbXMubWFwKCh7aW50ZXJjZXB0aW9uUG9pbnQsIGlkZW50aWZpZXIsIHR5cGV9KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHsgdGltZTogaW50ZXJjZXB0aW9uUG9pbnQsIHR5cGUsIGlkZW50aWZpZXIsIGR1cmF0aW9uOiAzIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgIHRoaXMucmFpc2VFeGNlcHRpb25Mb2coJ0NQVjJfQ09OVF9JTlRFUkNFUFRJT05fUEFSU0UnLCAnZXJyb3IgcGFyc2luZyB0aGUgaW50ZWNlcHRpb24gcG9pbnRzIHN0cmluZycsIGVycm9yLCAnJyk7XHJcbiAgICAgICAgdGhpcy5zaG93U2NvcmUgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0UXVlc3Rpb25TZXQoaWRlbnRpZmllcikge1xyXG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuY29udGVudE1hcFtpZGVudGlmaWVyXTtcclxuICAgIGlmICghY29udGVudCkge1xyXG4gICAgICBpZiAoIXRoaXMucXVlc3Rpb25DdXJzb3IpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbkN1cnNvci5nZXRRdWVzdGlvblNldChpZGVudGlmaWVyKVxyXG4gICAgIC5waXBlKG1hcCgocmVzcG9uc2UpID0+IHtcclxuICAgICAgICB0aGlzLmNvbnRlbnRNYXBbaWRlbnRpZmllcl0gPSByZXNwb25zZS5xdWVzdGlvblNldDtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50TWFwW2lkZW50aWZpZXJdO1xyXG4gICAgICAgfSkpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gb2YoY29udGVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcmVGZXRjaENvbnRlbnQoKSB7XHJcbiAgICBjb25zdCBuZXh0TWFya2VyID0gdGhpcy5nZXROZXh0TWFya2VyKCk7XHJcbiAgICBpZiAobmV4dE1hcmtlcikge1xyXG4gICAgICBjb25zdCBpZGVudGlmaWVyID0gbmV4dE1hcmtlci5pZGVudGlmaWVyO1xyXG4gICAgICB0aGlzLmdldFF1ZXN0aW9uU2V0KG5leHRNYXJrZXIuaWRlbnRpZmllcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXROZXh0TWFya2VyKCkge1xyXG4gICAgY29uc3QgY3VycmVudFRpbWUgPSB0aGlzLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKCk7XHJcbiAgICBjb25zdCBtYXJrZXJzTGlzdCA9IHRoaXMuZ2V0TWFya2VycygpO1xyXG4gICAgaWYgKCFtYXJrZXJzTGlzdCkgeyByZXR1cm4gbnVsbDsgfVxyXG5cclxuICAgIHJldHVybiBtYXJrZXJzTGlzdC5maW5kKG1hcmtlciA9PiB7XHJcbiAgICAgIGNvbnN0IG1hcmtlclRpbWUgPSBtYXJrZXIudGltZTtcclxuICAgICAgcmV0dXJuIG1hcmtlclRpbWUgPiBjdXJyZW50VGltZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmFpc2VTdGFydEV2ZW50KGV2ZW50KSB7XHJcbiAgICBjb25zdCBkdXJhdGlvbiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gdGhpcy5QbGF5ZXJMb2FkU3RhcnRlZEF0O1xyXG4gICAgY29uc3Qgc3RhcnRFdmVudCA9IHtcclxuICAgICAgZWlkOiAnU1RBUlQnLFxyXG4gICAgICB2ZXI6IHRoaXMudmVyc2lvbixcclxuICAgICAgZWRhdGE6IHtcclxuICAgICAgICB0eXBlOiAnU1RBUlQnLFxyXG4gICAgICAgIG1vZGU6ICdwbGF5JyxcclxuICAgICAgICBkdXJhdGlvblxyXG4gICAgICB9LFxyXG4gICAgICBtZXRhRGF0YTogdGhpcy5tZXRhRGF0YVxyXG4gICAgfTtcclxuICAgIHRoaXMucGxheWVyRXZlbnQuZW1pdChzdGFydEV2ZW50KTtcclxuICAgIHRoaXMudmlkZW9QbGF5ZXJTZXJ2aWNlLnN0YXJ0KGR1cmF0aW9uKTtcclxuICAgIHRoaXMuUGxheWVyTG9hZFN0YXJ0ZWRBdCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gIH1cclxuXHJcbiAgY2FsY3VsYXRlU2NvcmUoKSB7XHJcbiAgICB0aGlzLnNjb3JlT2J0YWluZWQgPSAgT2JqZWN0LnZhbHVlcyh0aGlzLmludGVyY2VwdGlvblJlc3BvbnNlcykucmVkdWNlKFxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tc3RyaW5nLWxpdGVyYWxcclxuICAgICAgKGFjYywgcmVzcG9uc2UpID0+IGFjYyArIHJlc3BvbnNlWydzY29yZSddICwgMCk7XHJcbiAgfVxyXG5cclxuICByYWlzZUVuZEV2ZW50KCkge1xyXG4gICAgaWYgKCF0aGlzLmlzRW5kRXZlbnRSYWlzZWQpIHtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVTY29yZSgpO1xyXG4gICAgICBjb25zdCBkdXJhdGlvbiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gdGhpcy5QbGF5ZXJMb2FkU3RhcnRlZEF0O1xyXG4gICAgICBjb25zdCBlbmRFdmVudCA9IHtcclxuICAgICAgICBlaWQ6ICdFTkQnLFxyXG4gICAgICAgIHZlcjogdGhpcy52ZXJzaW9uLFxyXG4gICAgICAgIGVkYXRhOiB7XHJcbiAgICAgICAgICB0eXBlOiAnRU5EJyxcclxuICAgICAgICAgIGN1cnJlbnRUaW1lOiB0aGlzLmN1cnJlbnRsZW5ndGgsXHJcbiAgICAgICAgICB0b3RhbFRpbWU6IHRoaXMudG90YWxMZW5ndGgsXHJcbiAgICAgICAgICBkdXJhdGlvblxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgbWV0YURhdGE6IHRoaXMubWV0YURhdGFcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5wbGF5ZXJFdmVudC5lbWl0KGVuZEV2ZW50KTtcclxuICAgICAgdGhpcy50aW1lU3BlbnQgPSB0aGlzLnV0aWxTZXJ2aWNlLmdldFRpbWVTcGVudFRleHQodGhpcy52aXNpdGVkTGVuZ3RoKTtcclxuICAgICAgdGhpcy52aWRlb1BsYXllclNlcnZpY2UuZW5kKFxyXG4gICAgICAgIGR1cmF0aW9uLFxyXG4gICAgICAgIHRoaXMudG90YWxMZW5ndGgsXHJcbiAgICAgICAgdGhpcy5jdXJyZW50bGVuZ3RoLFxyXG4gICAgICAgIHRoaXMuZW5kUGFnZVNlZW4sXHJcbiAgICAgICAgdGhpcy50b3RhbFNlZWtlZExlbmd0aCxcclxuICAgICAgICB0aGlzLnZpc2l0ZWRMZW5ndGggLyAxMDAwLFxyXG4gICAgICAgIHRoaXMuc2NvcmVPYnRhaW5lZFxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmlzRW5kRXZlbnRSYWlzZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHJhaXNlSGVhcnRCZWF0RXZlbnQodHlwZTogc3RyaW5nLCBleHRyYVZhbHVlcz8pIHtcclxuICAgIGlmICh0eXBlID09PSAnUkVQTEFZJykge1xyXG4gICAgICB0aGlzLmludGVyY2VwdGlvblJlc3BvbnNlcyA9IHt9O1xyXG4gICAgICB0aGlzLnNob3dTY29yZSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnNjb3JlT2J0YWluZWQgPSAwO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaGVhckJlYXRFdmVudCA9IHtcclxuICAgICAgZWlkOiAnSEVBUlRCRUFUJyxcclxuICAgICAgdmVyOiB0aGlzLnZlcnNpb24sXHJcbiAgICAgIGVkYXRhOiB7XHJcbiAgICAgICAgdHlwZSxcclxuICAgICAgICBjdXJyZW50UGFnZTogJ3ZpZGVvc3RhZ2UnLFxyXG4gICAgICAgIGV4dHJhOiBleHRyYVZhbHVlc1xyXG4gICAgICB9LFxyXG4gICAgICBtZXRhRGF0YTogdGhpcy5tZXRhRGF0YVxyXG4gICAgfTtcclxuICAgIHRoaXMucGxheWVyRXZlbnQuZW1pdChoZWFyQmVhdEV2ZW50KTtcclxuICAgIHRoaXMudmlkZW9QbGF5ZXJTZXJ2aWNlLmhlYXJ0QmVhdChoZWFyQmVhdEV2ZW50KTtcclxuICAgIGNvbnN0IGludGVyYWN0SXRlbXMgPSBbJ1BMQVknLCAnUEFVU0UnLCAnRVhJVCcsICdWT0xVTUVfQ0hBTkdFJywgJ0RSQUcnLFxyXG4gICAgICAnUkFURV9DSEFOR0UnLCAnQ0xPU0VfRE9XTkxPQUQnLCAnRE9XTkxPQUQnLCAnTkFWSUdBVEVfVE9fUEFHRScsXHJcbiAgICAgICdORVhUJywgJ09QRU5fTUVOVScsICdQUkVWSU9VUycsICdDTE9TRV9NRU5VJywgJ0RPV05MT0FEX01FTlUnLCAnRE9XTkxPQURfUE9QVVBfQ0xPU0UnLCAnRE9XTkxPQURfUE9QVVBfQ0FOQ0VMJyxcclxuICAgICAgJ1NIQVJFJywgJ1JFUExBWScsICdGT1JXQVJEJywgJ0JBQ0tXQVJEJywgJ0ZVTExTQ1JFRU4nLCAnTkVYVF9DT05URU5UX1BMQVknLCAnVFJBTlNDUklQVF9MQU5HVUFHRV9PRkYnLFxyXG4gICAgICAnVFJBTlNDUklQVF9MQU5HVUFHRV9TRUxFQ1RFRCcsICdWSURFT19NQVJLRVJfU0VMRUNURUQnXHJcbiAgICBdO1xyXG4gICAgaWYgKGludGVyYWN0SXRlbXMuaW5jbHVkZXModHlwZSkpIHtcclxuICAgICAgdGhpcy52aWRlb1BsYXllclNlcnZpY2UuaW50ZXJhY3QodHlwZS50b0xvd2VyQ2FzZSgpLCAndmlkZW9zdGFnZScsIGV4dHJhVmFsdWVzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJhaXNlSW1wcmVzc2lvbkV2ZW50KHBhZ2VJZDogc3RyaW5nLCBjZGF0YTogYW55ID0ge30pIHtcclxuICAgIHRoaXMudmlkZW9QbGF5ZXJTZXJ2aWNlLmltcHJlc3Npb24ocGFnZUlkLCBjZGF0YSk7XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tc2hhZG93ZWQtdmFyaWFibGVcclxuICByYWlzZUV4Y2VwdGlvbkxvZyhlcnJvckNvZGU6IHN0cmluZywgZXJyb3JUeXBlOiBzdHJpbmcsIHN0YWNrdHJhY2UsIHRyYWNlSWQpIHtcclxuICAgIGNvbnN0IGV4Y2VwdGlvbkxvZ0V2ZW50ID0ge1xyXG4gICAgICBlaWQ6ICdFUlJPUicsXHJcbiAgICAgIGVkYXRhOiB7XHJcbiAgICAgICAgZXJyOiBlcnJvckNvZGUsXHJcbiAgICAgICAgZXJydHlwZTogZXJyb3JUeXBlLFxyXG4gICAgICAgIHJlcXVlc3RpZDogdHJhY2VJZCB8fCAnJyxcclxuICAgICAgICBzdGFja3RyYWNlOiAoc3RhY2t0cmFjZSAmJiBzdGFja3RyYWNlLnRvU3RyaW5nKCkpIHx8ICcnLFxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhpcy5wbGF5ZXJFdmVudC5lbWl0KGV4Y2VwdGlvbkxvZ0V2ZW50KTtcclxuICAgIHRoaXMudmlkZW9QbGF5ZXJTZXJ2aWNlLmVycm9yKGVycm9yQ29kZSAsIGVycm9yVHlwZSAsIHN0YWNrdHJhY2UpO1xyXG4gIH1cclxuXHJcbn1cclxuIl19