UNPKG

@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

508 lines 43.3 kB
/** * @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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZGljZGlrc2hhb3JnL3ZpZGVvLXBsYXllci1tb2JpbGUtdjkvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvdmlld2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRyxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDekUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxLQUFLLENBQUMsTUFBTSxXQUFXLENBQUM7Ozs7OztBQUUvQjtJQWtDRSx1QkFBb0Isa0JBQTZDLEVBQzdDLFdBQXdCLEVBQ3hCLElBQWdCLEVBQ0wsY0FBOEI7UUFIekMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUEyQjtRQUM3QyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ0wsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBaEN0RCxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDakIsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBY3RDLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFM0MsdUJBQWtCLEdBQUcsS0FBSyxDQUFDO1FBRTNCLDBCQUFxQixHQUFRLEVBQUUsQ0FBQztRQUNoQyxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLGtCQUFhLEdBQVEsQ0FBQyxDQUFDO1FBR3ZCLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFDaEIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBTTlCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xELENBQUM7Ozs7O0lBRUQsa0NBQVU7Ozs7SUFBVixVQUFXLEVBQTJDO1lBQXpDLG9CQUFPLEVBQUUsa0JBQU0sRUFBRSxzQkFBUTtRQUNwQyxJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDakMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQztRQUN0RCxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDcEYsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDMUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQztRQUN0RCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDOUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQztRQUN0RCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUU7WUFDWixJQUFBLHFCQUFpQyxFQUFyQix3QkFBUyxFQUFFLHNCQUFVO1lBQ3pDLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBSSxTQUFTLFNBQUksUUFBVSxDQUFDO1NBQ2pGO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRztZQUNkLE9BQU8sRUFBRSxFQUNSO1lBQ0QsTUFBTSxFQUFFLEVBQUU7WUFDVixjQUFjLEVBQUUsRUFBRTtZQUNsQixhQUFhLEVBQUUsQ0FBQztZQUNoQixLQUFLLEVBQUUsU0FBUztZQUNoQixlQUFlLEVBQUUsU0FBUztZQUMxQixXQUFXLEVBQUUsRUFBRTtTQUNoQixDQUFDO1FBQ0YsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDcEUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTs7Z0JBQ3JCLFFBQVEsR0FBRyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQzVHLElBQUksQ0FBQyxZQUFZLEdBQU0sUUFBUSxTQUFJLFFBQVEsQ0FBQyxXQUFhLENBQUM7WUFDMUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO1NBQ25DO0lBQ0gsQ0FBQzs7Ozs7SUFDRCw2Q0FBcUI7Ozs7SUFBckIsVUFBc0IsbUJBQW1CO1FBQXpDLGlCQW1CQztRQWxCQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxtQkFBbUIsQ0FBQztRQUNoRCxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLDZCQUE2QixFQUFFLFlBQVksRUFBRSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNoSSxPQUFPLEVBQUUsQ0FBQztTQUNYO2FBQU07WUFDQSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXOzs7O1lBQUUsVUFBQyxLQUFLO2dCQUNyQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7b0JBQ3ZGLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNuRSxLQUFJLENBQUMsaUJBQWlCLENBQUMseUJBQXlCLEVBQUUsWUFBWSxFQUM3RCxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxFQUFFLEtBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDN0UsT0FBTyxFQUFFLENBQUM7aUJBQ1g7cUJBQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUM7b0JBQ3hDLENBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEtBQUssSUFBSyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFO29CQUNqRyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztpQkFDdEI7WUFDSCxDQUFDLEVBQUMsQ0FBQztTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7Ozs7SUFDSyx3Q0FBZ0I7OztJQUF0Qjs7Ozs7Ozs2QkFDTSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQWxCLHdCQUFrQjt3QkFDcEIsc0JBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFDOzRCQUVuRCxxQkFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSzs7Ozt3QkFBQyxVQUFBLEtBQUs7NEJBQ3BHLDJDQUEyQzs0QkFDM0MsS0FBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRyxZQUFZLENBQUMsbUJBQW1CLEVBQUcsSUFBSSxLQUFLLENBQUMsa0NBQWdDLEtBQUksQ0FBQyxZQUFjLENBQUMsRUFBRSxLQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQzFLLENBQUMsRUFBQyxFQUFBOzt3QkFISSxJQUFJLEdBQUcsU0FHWDt3QkFDRixJQUFJLElBQUksRUFBRTs0QkFDUixzQkFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFDO3lCQUMxRDs2QkFBTTs0QkFDTCxzQkFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUM7eUJBQ2pFOzs7Ozs7S0FFSjs7OztJQUVELGtDQUFVOzs7SUFBVjs7UUFDRSxnQkFBSSxJQUFJLDBDQUFFLGtCQUFrQiwwQ0FBRSxLQUFLLEVBQUU7WUFDbkMsSUFBSTs7b0JBQ0ksa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQjtnQkFDbEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLE9BQU8sa0JBQWtCLENBQUMsS0FBSyxDQUFDLEdBQUc7Ozs7Z0JBQUMsVUFBQyxFQUFxQzt3QkFBcEMsd0NBQWlCLEVBQUUsMEJBQVUsRUFBRSxjQUFJO29CQUN6RSxPQUFPLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLElBQUksTUFBQSxFQUFFLFVBQVUsWUFBQSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDbEUsQ0FBQyxFQUFDLENBQUM7YUFDSjtZQUFDLE9BQU8sS0FBSyxFQUFFO2dCQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyw4QkFBOEIsRUFBRSw2Q0FBNkMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ2pILElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2FBQ3hCO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Ozs7O0lBR0Qsc0NBQWM7Ozs7SUFBZCxVQUFlLFVBQVU7UUFBekIsaUJBZUM7O1lBZE8sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDO1FBQzNDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtnQkFDeEIsT0FBTyxJQUFJLENBQUM7YUFDYjtpQkFBTTtnQkFDUixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQztxQkFDcEQsSUFBSSxDQUFDLEdBQUc7Ozs7Z0JBQUMsVUFBQyxRQUFRO29CQUNoQixLQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7b0JBQ25ELE9BQU8sS0FBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDcEMsQ0FBQyxFQUFDLENBQUMsQ0FBQzthQUNKO1NBQ0Y7YUFBTTtZQUNMLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQzs7OztJQUVELHVDQUFlOzs7SUFBZjs7WUFDUSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRTtRQUN2QyxJQUFJLFVBQVUsRUFBRTs7Z0JBQ1IsVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVO1lBQ3hDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzVDO0lBQ0gsQ0FBQzs7OztJQUVELHFDQUFhOzs7SUFBYjs7WUFDUSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUU7O1lBQy9DLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFO1FBQ3JDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQztTQUFFO1FBRWxDLE9BQU8sV0FBVyxDQUFDLElBQUk7Ozs7UUFBQyxVQUFBLE1BQU07O2dCQUN0QixVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUk7WUFDOUIsT0FBTyxVQUFVLEdBQUcsV0FBVyxDQUFDO1FBQ2xDLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7SUFFRCx1Q0FBZTs7OztJQUFmLFVBQWdCLEtBQUs7O1lBQ2IsUUFBUSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLG1CQUFtQjs7WUFDMUQsVUFBVSxHQUFHO1lBQ2pCLEdBQUcsRUFBRSxPQUFPO1lBQ1osR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ2pCLEtBQUssRUFBRTtnQkFDTCxJQUFJLEVBQUUsT0FBTztnQkFDYixJQUFJLEVBQUUsTUFBTTtnQkFDWixRQUFRLFVBQUE7YUFDVDtZQUNELFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtTQUN4QjtRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbEQsQ0FBQzs7OztJQUVELHNDQUFjOzs7SUFBZDtRQUNFLElBQUksQ0FBQyxhQUFhLEdBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNO1FBQ3BFLDZDQUE2Qzs7Ozs7OztRQUM3QyxVQUFDLEdBQUcsRUFBRSxRQUFRLElBQUssT0FBQSxHQUFHLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUF2QixDQUF1QixHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7Ozs7SUFFRCxxQ0FBYTs7O0lBQWI7UUFDRSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQzFCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQzs7Z0JBQ2hCLFFBQVEsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxtQkFBbUI7O2dCQUMxRCxRQUFRLEdBQUc7Z0JBQ2YsR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPO2dCQUNqQixLQUFLLEVBQUU7b0JBQ0wsSUFBSSxFQUFFLEtBQUs7b0JBQ1gsV0FBVyxFQUFFLElBQUksQ0FBQyxhQUFhO29CQUMvQixTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVc7b0JBQzNCLFFBQVEsVUFBQTtpQkFDVDtnQkFDRCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7YUFDeEI7WUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQ3pCLFFBQVEsRUFDUixJQUFJLENBQUMsV0FBVyxFQUNoQixJQUFJLENBQUMsYUFBYSxFQUNsQixJQUFJLENBQUMsV0FBVyxFQUNoQixJQUFJLENBQUMsaUJBQWlCLEVBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxFQUN6QixJQUFJLENBQUMsYUFBYSxDQUNuQixDQUFDO1lBQ0YsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztTQUM5QjtJQUNILENBQUM7Ozs7OztJQUdELDJDQUFtQjs7Ozs7SUFBbkIsVUFBb0IsSUFBWSxFQUFFLFdBQVk7UUFDNUMsSUFBSSxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUM7U0FDeEI7O1lBQ0ssYUFBYSxHQUFHO1lBQ3BCLEdBQUcsRUFBRSxXQUFXO1lBQ2hCLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTztZQUNqQixLQUFLLEVBQUU7Z0JBQ0wsSUFBSSxNQUFBO2dCQUNKLFdBQVcsRUFBRSxZQUFZO2dCQUN6QixLQUFLLEVBQUUsV0FBVzthQUNuQjtZQUNELFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtTQUN4QjtRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7O1lBQzNDLGFBQWEsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxNQUFNO1lBQ3JFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsa0JBQWtCO1lBQy9ELE1BQU0sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsdUJBQXVCO1lBQy9HLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUseUJBQXlCO1lBQ3RHLDhCQUE4QixFQUFFLHVCQUF1QjtTQUN4RDtRQUNELElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNoQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7U0FDakY7SUFDSCxDQUFDOzs7Ozs7SUFFRCw0Q0FBb0I7Ozs7O0lBQXBCLFVBQXFCLE1BQWMsRUFBRSxLQUFlO1FBQWYsc0JBQUEsRUFBQSxVQUFlO1FBQ2xELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxnREFBZ0Q7Ozs7Ozs7OztJQUNoRCx5Q0FBaUI7Ozs7Ozs7OztJQUFqQixVQUFrQixTQUFpQixFQUFFLFNBQWlCLEVBQUUsVUFBVSxFQUFFLE9BQU87O1lBQ25FLGlCQUFpQixHQUFHO1lBQ3hCLEdBQUcsRUFBRSxPQUFPO1lBQ1osS0FBSyxFQUFFO2dCQUNMLEdBQUcsRUFBRSxTQUFTO2dCQUNkLE9BQU8sRUFBRSxTQUFTO2dCQUNsQixTQUFTLEVBQUUsT0FBTyxJQUFJLEVBQUU7Z0JBQ3hCLFVBQVUsRUFBRSxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFO2FBQ3hEO1NBQ0Y7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFHLFNBQVMsRUFBRyxVQUFVLENBQUMsQ0FBQztJQUNwRSxDQUFDOztnQkF4UUYsVUFBVSxTQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7OztnQkFWUSx5QkFBeUI7Z0JBQ3pCLFdBQVc7Z0JBSlgsVUFBVTtnQkFNVixjQUFjLHVCQTBDUixRQUFROzs7d0JBaER2QjtDQXFSQyxBQTFRRCxJQTBRQztTQXZRWSxhQUFhOzs7SUFFeEIsb0NBQTJCOztJQUMzQixrQ0FBeUI7Ozs7O0lBQ3pCLGdDQUF3Qjs7SUFDeEIsb0NBQTZDOztJQUM3QyxvQ0FBMkI7O0lBQzNCLDBDQUFrQzs7SUFDbEMscUNBQTRCOztJQUM1QixpQ0FBd0I7O0lBQ3hCLHlDQUFnQzs7SUFDaEMsaUNBQXdCOztJQUN4QixpQ0FBcUI7O0lBQ3JCLDRDQUFtQzs7SUFDbkMsb0NBQW1COztJQUNuQixzQ0FBcUI7O0lBQ3JCLDBDQUF5Qjs7SUFDekIsb0NBQW1COztJQUNuQixzQ0FBcUI7O0lBQ3JCLHlDQUFrRDs7SUFDbEQsZ0NBQXVCOztJQUN2QiwyQ0FBa0M7O0lBQ2xDLDJDQUErQjs7SUFDL0IsOENBQXVDOztJQUN2QyxrQ0FBeUI7O0lBQ3pCLHNDQUE4Qjs7SUFDOUIsaUNBQXdCOztJQUN4Qix1Q0FBMkI7O0lBQzNCLG1DQUF1Qjs7SUFDdkIseUNBQWdDOztJQUNoQyxvQ0FBZ0M7Ozs7O0lBQ3BCLDJDQUFxRDs7Ozs7SUFDckQsb0NBQWdDOzs7OztJQUNoQyw2QkFBd0I7O0lBQ3hCLHVDQUFpRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQbGF5ZXJDb25maWcsIFRyYW5zY3JpcHRzIH0gZnJvbSAnLi4vcGxheWVySW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBTdW5iaXJkVmlkZW9QbGF5ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc3VuYmlyZC12aWRlby1wbGF5ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBVdGlsU2VydmljZSB9IGZyb20gJy4vdXRpbC5zZXJ2aWNlJztcbmltcG9ydCB7IGVycm9yQ29kZSAsIGVycm9yTWVzc2FnZSB9IGZyb20gJ0BkaWNkaWtzaGFvcmcvcGxheWVyLXNkay12OSc7XG5pbXBvcnQgeyBRdWVzdGlvbkN1cnNvciB9IGZyb20gJ0Bwcm9qZWN0LXN1bmJpcmQvc3VuYmlyZC1xdW1sLXBsYXllci12OSc7XG5pbXBvcnQgeyBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gtZXMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBWaWV3ZXJTZXJ2aWNlIHtcblxuICBwdWJsaWMgZW5kUGFnZVNlZW4gPSBmYWxzZTtcbiAgcHVibGljIHRpbWVTcGVudCA9ICcwOjAnO1xuICBwcml2YXRlIHZlcnNpb24gPSAnMS4wJztcbiAgcHVibGljIHBsYXllckV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIHB1YmxpYyBjb250ZW50TmFtZTogc3RyaW5nO1xuICBwdWJsaWMgc2hvd0Rvd25sb2FkUG9wdXA6IGJvb2xlYW47XG4gIHB1YmxpYyBzdHJlYW1pbmdVcmw6IHN0cmluZztcbiAgcHVibGljIG1pbWVUeXBlOiBzdHJpbmc7XG4gIHB1YmxpYyBhcnRpZmFjdE1pbWVUeXBlOiBzdHJpbmc7XG4gIHB1YmxpYyB1c2VyTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgbWV0YURhdGE6IGFueTtcbiAgcHVibGljIFBsYXllckxvYWRTdGFydGVkQXQ6IG51bWJlcjtcbiAgcHVibGljIHRvdGFsTGVuZ3RoO1xuICBwdWJsaWMgY3VycmVudGxlbmd0aDtcbiAgcHVibGljIHRvdGFsU2Vla2VkTGVuZ3RoO1xuICBwdWJsaWMgYXJ0aWZhY3RVcmw7XG4gIHB1YmxpYyB2aXNpdGVkTGVuZ3RoO1xuICBwdWJsaWMgc2lkZWJhck1lbnVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBwdWJsaWMgdHJhY2VJZDogc3RyaW5nO1xuICBwdWJsaWMgaXNBdmFpbGFibGVMb2NhbGx5ID0gZmFsc2U7XG4gIHB1YmxpYyBpbnRlcmNlcHRpb25Qb2ludHM6IGFueTtcbiAgcHVibGljIGludGVyY2VwdGlvblJlc3BvbnNlczogYW55ID0ge307XG4gIHB1YmxpYyBzaG93U2NvcmUgPSBmYWxzZTtcbiAgcHVibGljIHNjb3JlT2J0YWluZWQ6IGFueSA9IDA7XG4gIHB1YmxpYyBtYXhTY29yZTogbnVtYmVyO1xuICBwdWJsaWMgcGxheWVySW5zdGFuY2U6IGFueTtcbiAgcHVibGljIGNvbnRlbnRNYXAgPSB7fTtcbiAgcHVibGljIGlzRW5kRXZlbnRSYWlzZWQgPSBmYWxzZTtcbiAgcHVibGljIHRyYW5zY3JpcHRzOiBUcmFuc2NyaXB0cztcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB2aWRlb1BsYXllclNlcnZpY2U6IFN1bmJpcmRWaWRlb1BsYXllclNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgdXRpbFNlcnZpY2U6IFV0aWxTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIHB1YmxpYyBxdWVzdGlvbkN1cnNvcjogUXVlc3Rpb25DdXJzb3IpIHtcbiAgICB0aGlzLlBsYXllckxvYWRTdGFydGVkQXQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgfVxuXG4gIGluaXRpYWxpemUoeyBjb250ZXh0LCBjb25maWcsIG1ldGFkYXRhIH06IFBsYXllckNvbmZpZykge1xuICAgIHRoaXMuY29udGVudE5hbWUgPSBtZXRhZGF0YS5uYW1lO1xuICAgIHRoaXMuaXNBdmFpbGFibGVMb2NhbGx5ID0gbWV0YWRhdGEuaXNBdmFpbGFibGVMb2NhbGx5O1xuICAgIHRoaXMuc3RyZWFtaW5nVXJsID0gbWV0YWRhdGEuc3RyZWFtaW5nVXJsO1xuICAgIHRoaXMuYXJ0aWZhY3RVcmwgPSBtZXRhZGF0YS5hcnRpZmFjdFVybDtcbiAgICB0aGlzLm1pbWVUeXBlID0gbWV0YWRhdGEuc3RyZWFtaW5nVXJsID8gJ2FwcGxpY2F0aW9uL3gtbXBlZ1VSTCcgOiBtZXRhZGF0YS5taW1lVHlwZTtcbiAgICB0aGlzLmFydGlmYWN0TWltZVR5cGUgPSBtZXRhZGF0YS5taW1lVHlwZTtcbiAgICB0aGlzLmlzQXZhaWxhYmxlTG9jYWxseSA9IG1ldGFkYXRhLmlzQXZhaWxhYmxlTG9jYWxseTtcbiAgICB0aGlzLnRyYWNlSWQgPSBjb25maWcudHJhY2VJZDtcbiAgICB0aGlzLmludGVyY2VwdGlvblBvaW50cyA9IG1ldGFkYXRhLmludGVyY2VwdGlvblBvaW50cztcbiAgICBpZiAoY29udGV4dC51c2VyRGF0YSkge1xuICAgICAgY29uc3QgeyB1c2VyRGF0YTogeyBmaXJzdE5hbWUsIGxhc3ROYW1lIH0gfSA9IGNvbnRleHQ7XG4gICAgICB0aGlzLnVzZXJOYW1lID0gZmlyc3ROYW1lID09PSBsYXN0TmFtZSA/IGZpcnN0TmFtZSA6IGAke2ZpcnN0TmFtZX0gJHtsYXN0TmFtZX1gO1xuICAgIH1cbiAgICB0aGlzLm1ldGFEYXRhID0ge1xuICAgICAgYWN0aW9uczogW1xuICAgICAgXSxcbiAgICAgIHZvbHVtZTogW10sXG4gICAgICBwbGF5QmFja1NwZWVkczogW10sXG4gICAgICB0b3RhbER1cmF0aW9uOiAwLFxuICAgICAgbXV0ZWQ6IHVuZGVmaW5lZCxcbiAgICAgIGN1cnJlbnREdXJhdGlvbjogdW5kZWZpbmVkLFxuICAgICAgdHJhbnNjcmlwdHM6IFtdXG4gICAgfTtcbiAgICB0aGlzLnRyYW5zY3JpcHRzID0gbWV0YWRhdGEudHJhbnNjcmlwdHMgPyBtZXRhZGF0YS50cmFuc2NyaXB0cyA6IFtdO1xuICAgIHRoaXMuc2hvd0Rvd25sb2FkUG9wdXAgPSBmYWxzZTtcbiAgICB0aGlzLmVuZFBhZ2VTZWVuID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuaXNBdmFpbGFibGVMb2NhbGx5KSB7XG4gICAgICBjb25zdCBiYXNlUGF0aCA9IChtZXRhZGF0YS5zdHJlYW1pbmdVcmwpID8gKG1ldGFkYXRhLnN0cmVhbWluZ1VybCkgOiAobWV0YWRhdGEuYmFzZVBhdGggfHwgbWV0YWRhdGEuYmFzZURpcik7XG4gICAgICB0aGlzLnN0cmVhbWluZ1VybCA9IGAke2Jhc2VQYXRofS8ke21ldGFkYXRhLmFydGlmYWN0VXJsfWA7XG4gICAgICB0aGlzLm1pbWVUeXBlID0gbWV0YWRhdGEubWltZVR5cGU7XG4gICAgfVxuICB9XG4gIGhhbmRsZVRyYW5zY3JpcHRzRGF0YShzZWxlY3RlZFRyYW5zY3JpcHRzKSB7XG4gICAgdGhpcy5tZXRhRGF0YS50cmFuc2NyaXB0cyA9IHNlbGVjdGVkVHJhbnNjcmlwdHM7XG4gICAgaWYgKCFfLmlzQXJyYXkodGhpcy50cmFuc2NyaXB0cykpIHtcbiAgICAgIHRoaXMucmFpc2VFeGNlcHRpb25Mb2coJ0lOVkFMSURfVFJBTlNDUklQVF9EQVRBVFlQRScsICdUUkFOU0NSSVBUJywgbmV3IEVycm9yKCdUcmFuc2NyaXB0IGRhdGEgc2hvdWxkIGJlIGFycmF5JyksIHRoaXMudHJhY2VJZCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfSBlbHNlIHtcbiAgICAgICAgICAgXy5mb3JFYWNoKHRoaXMudHJhbnNjcmlwdHMsICh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAoIShfLnNvbWUodGhpcy50cmFuc2NyaXB0cywgeyBsYW5ndWFnZTogdmFsdWUubGFuZ3VhZ2UsIGFydGlmYWN0VXJsOiB2YWx1ZS5hcnRpZmFjdFVybCAsXG4gICAgICAgICAgbGFuZ3VhZ2VDb2RlOiB2YWx1ZS5sYW5ndWFnZUNvZGUsIGlkZW50aWZpZXI6IHZhbHVlLmlkZW50aWZpZXJ9KSkpIHtcbiAgICAgICAgICB0aGlzLnJhaXNlRXhjZXB0aW9uTG9nKCdUUkFOU0NSSVBUX0RBVEFfTUlTU0lORycsICdUUkFOU0NSSVBUJyxcbiAgICAgICAgICAgbmV3IEVycm9yKCdUcmFuc2NyaXB0IG9iamVjdCBkb3NlIG5vdCBoYXZlIHJlcXVpcmVkIGZpZWxkcycpLCB0aGlzLnRyYWNlSWQpO1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfSBlbHNlIGlmICghXy5pc0VtcHR5KHNlbGVjdGVkVHJhbnNjcmlwdHMpICYmXG4gICAgICAgICAgKCBfLmxhc3Qoc2VsZWN0ZWRUcmFuc2NyaXB0cykgIT09ICdvZmYnICYmICBfLmxhc3Qoc2VsZWN0ZWRUcmFuc2NyaXB0cykgPT09IHZhbHVlLmxhbmd1YWdlQ29kZSkpIHtcbiAgICAgICAgICB2YWx1ZS5kZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRyYW5zY3JpcHRzO1xuICB9XG4gIGFzeW5jIGdldFBsYXllck9wdGlvbnMoKSB7XG4gICAgaWYgKCF0aGlzLnN0cmVhbWluZ1VybCkge1xuICAgICAgcmV0dXJuIFt7IHNyYzogdGhpcy5hcnRpZmFjdFVybCwgdHlwZTogdGhpcy5hcnRpZmFjdE1pbWVUeXBlIH1dO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5odHRwLmhlYWQodGhpcy5zdHJlYW1pbmdVcmwsIHsgcmVzcG9uc2VUeXBlOiAnYmxvYicgfSkudG9Qcm9taXNlKCkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIHRoaXMucmFpc2VFeGNlcHRpb25Mb2coZXJyb3JDb2RlLnN0cmVhbWluZ1VybFN1cHBvcnQgLCBlcnJvck1lc3NhZ2Uuc3RyZWFtaW5nVXJsU3VwcG9ydCAsIG5ldyBFcnJvcihgU3RyZWFtaW5nIFVybCBOb3QgU3VwcG9ydGVkICAke3RoaXMuc3RyZWFtaW5nVXJsfWApLCB0aGlzLnRyYWNlSWQpO1xuICAgICAgfSk7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICByZXR1cm4gW3sgc3JjOiB0aGlzLnN0cmVhbWluZ1VybCwgdHlwZTogdGhpcy5taW1lVHlwZSB9XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbeyBzcmM6IHRoaXMuYXJ0aWZhY3RVcmwsIHR5cGU6IHRoaXMuYXJ0aWZhY3RNaW1lVHlwZSB9XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRNYXJrZXJzKCkgIHtcbiAgICBpZiAodGhpcz8uaW50ZXJjZXB0aW9uUG9pbnRzPy5pdGVtcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaW50ZXJjZXB0aW9uUG9pbnRzID0gdGhpcy5pbnRlcmNlcHRpb25Qb2ludHM7XG4gICAgICAgIHRoaXMuc2hvd1Njb3JlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGludGVyY2VwdGlvblBvaW50cy5pdGVtcy5tYXAoKHtpbnRlcmNlcHRpb25Qb2ludCwgaWRlbnRpZmllciwgdHlwZX0pID0+IHtcbiAgICAgICAgcmV0dXJuIHsgdGltZTogaW50ZXJjZXB0aW9uUG9pbnQsIHR5cGUsIGlkZW50aWZpZXIsIGR1cmF0aW9uOiAzIH07XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICB0aGlzLnJhaXNlRXhjZXB0aW9uTG9nKCdDUFYyX0NPTlRfSU5URVJDRVBUSU9OX1BBUlNFJywgJ2Vycm9yIHBhcnNpbmcgdGhlIGludGVjZXB0aW9uIHBvaW50cyBzdHJpbmcnLCBlcnJvciwgJycpO1xuICAgICAgICB0aGlzLnNob3dTY29yZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG5cbiAgZ2V0UXVlc3Rpb25TZXQoaWRlbnRpZmllcikge1xuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmNvbnRlbnRNYXBbaWRlbnRpZmllcl07XG4gICAgaWYgKCFjb250ZW50KSB7XG4gICAgICBpZiAoIXRoaXMucXVlc3Rpb25DdXJzb3IpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbkN1cnNvci5nZXRRdWVzdGlvblNldChpZGVudGlmaWVyKVxuICAgICAucGlwZShtYXAoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRoaXMuY29udGVudE1hcFtpZGVudGlmaWVyXSA9IHJlc3BvbnNlLnF1ZXN0aW9uU2V0O1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50TWFwW2lkZW50aWZpZXJdO1xuICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9mKGNvbnRlbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByZUZldGNoQ29udGVudCgpIHtcbiAgICBjb25zdCBuZXh0TWFya2VyID0gdGhpcy5nZXROZXh0TWFya2VyKCk7XG4gICAgaWYgKG5leHRNYXJrZXIpIHtcbiAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBuZXh0TWFya2VyLmlkZW50aWZpZXI7XG4gICAgICB0aGlzLmdldFF1ZXN0aW9uU2V0KG5leHRNYXJrZXIuaWRlbnRpZmllcik7XG4gICAgfVxuICB9XG5cbiAgZ2V0TmV4dE1hcmtlcigpIHtcbiAgICBjb25zdCBjdXJyZW50VGltZSA9IHRoaXMucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUoKTtcbiAgICBjb25zdCBtYXJrZXJzTGlzdCA9IHRoaXMuZ2V0TWFya2VycygpO1xuICAgIGlmICghbWFya2Vyc0xpc3QpIHsgcmV0dXJuIG51bGw7IH1cblxuICAgIHJldHVybiBtYXJrZXJzTGlzdC5maW5kKG1hcmtlciA9PiB7XG4gICAgICBjb25zdCBtYXJrZXJUaW1lID0gbWFya2VyLnRpbWU7XG4gICAgICByZXR1cm4gbWFya2VyVGltZSA+IGN1cnJlbnRUaW1lO1xuICAgIH0pO1xuICB9XG5cbiAgcmFpc2VTdGFydEV2ZW50KGV2ZW50KSB7XG4gICAgY29uc3QgZHVyYXRpb24gPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHRoaXMuUGxheWVyTG9hZFN0YXJ0ZWRBdDtcbiAgICBjb25zdCBzdGFydEV2ZW50ID0ge1xuICAgICAgZWlkOiAnU1RBUlQnLFxuICAgICAgdmVyOiB0aGlzLnZlcnNpb24sXG4gICAgICBlZGF0YToge1xuICAgICAgICB0eXBlOiAnU1RBUlQnLFxuICAgICAgICBtb2RlOiAncGxheScsXG4gICAgICAgIGR1cmF0aW9uXG4gICAgICB9LFxuICAgICAgbWV0YURhdGE6IHRoaXMubWV0YURhdGFcbiAgICB9O1xuICAgIHRoaXMucGxheWVyRXZlbnQuZW1pdChzdGFydEV2ZW50KTtcbiAgICB0aGlzLnZpZGVvUGxheWVyU2VydmljZS5zdGFydChkdXJhdGlvbik7XG4gICAgdGhpcy5QbGF5ZXJMb2FkU3RhcnRlZEF0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gIH1cblxuICBjYWxjdWxhdGVTY29yZSgpIHtcbiAgICB0aGlzLnNjb3JlT2J0YWluZWQgPSAgT2JqZWN0LnZhbHVlcyh0aGlzLmludGVyY2VwdGlvblJlc3BvbnNlcykucmVkdWNlKFxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXN0cmluZy1saXRlcmFsXG4gICAgICAoYWNjLCByZXNwb25zZSkgPT4gYWNjICsgcmVzcG9uc2VbJ3Njb3JlJ10gLCAwKTtcbiAgfVxuXG4gIHJhaXNlRW5kRXZlbnQoKSB7XG4gICAgaWYgKCF0aGlzLmlzRW5kRXZlbnRSYWlzZWQpIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlU2NvcmUoKTtcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSB0aGlzLlBsYXllckxvYWRTdGFydGVkQXQ7XG4gICAgICBjb25zdCBlbmRFdmVudCA9IHtcbiAgICAgICAgZWlkOiAnRU5EJyxcbiAgICAgICAgdmVyOiB0aGlzLnZlcnNpb24sXG4gICAgICAgIGVkYXRhOiB7XG4gICAgICAgICAgdHlwZTogJ0VORCcsXG4gICAgICAgICAgY3VycmVudFRpbWU6IHRoaXMuY3VycmVudGxlbmd0aCxcbiAgICAgICAgICB0b3RhbFRpbWU6IHRoaXMudG90YWxMZW5ndGgsXG4gICAgICAgICAgZHVyYXRpb25cbiAgICAgICAgfSxcbiAgICAgICAgbWV0YURhdGE6IHRoaXMubWV0YURhdGFcbiAgICAgIH07XG4gICAgICB0aGlzLnBsYXllckV2ZW50LmVtaXQoZW5kRXZlbnQpO1xuICAgICAgdGhpcy50aW1lU3BlbnQgPSB0aGlzLnV0aWxTZXJ2aWNlLmdldFRpbWVTcGVudFRleHQodGhpcy52aXNpdGVkTGVuZ3RoKTtcbiAgICAgIHRoaXMudmlkZW9QbGF5ZXJTZXJ2aWNlLmVuZChcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICAgIHRoaXMudG90YWxMZW5ndGgsXG4gICAgICAgIHRoaXMuY3VycmVudGxlbmd0aCxcbiAgICAgICAgdGhpcy5lbmRQYWdlU2VlbixcbiAgICAgICAgdGhpcy50b3RhbFNlZWtlZExlbmd0aCxcbiAgICAgICAgdGhpcy52aXNpdGVkTGVuZ3RoIC8gMTAwMCxcbiAgICAgICAgdGhpcy5zY29yZU9idGFpbmVkXG4gICAgICApO1xuICAgICAgdGhpcy5pc0VuZEV2ZW50UmFpc2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuXG4gIHJhaXNlSGVhcnRCZWF0RXZlbnQodHlwZTogc3RyaW5nLCBleHRyYVZhbHVlcz8pIHtcbiAgICBpZiAodHlwZSA9PT0gJ1JFUExBWScpIHtcbiAgICAgIHRoaXMuaW50ZXJjZXB0aW9uUmVzcG9uc2VzID0ge307XG4gICAgICB0aGlzLnNob3dTY29yZSA9IGZhbHNlO1xuICAgICAgdGhpcy5zY29yZU9idGFpbmVkID0gMDtcbiAgICB9XG4gICAgY29uc3QgaGVhckJlYXRFdmVudCA9IHtcbiAgICAgIGVpZDogJ0hFQVJUQkVBVCcsXG4gICAgICB2ZXI6IHRoaXMudmVyc2lvbixcbiAgICAgIGVkYXRhOiB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIGN1cnJlbnRQYWdlOiAndmlkZW9zdGFnZScsXG4gICAgICAgIGV4dHJhOiBleHRyYVZhbHVlc1xuICAgICAgfSxcbiAgICAgIG1ldGFEYXRhOiB0aGlzLm1ldGFEYXRhXG4gICAgfTtcbiAgICB0aGlzLnBsYXllckV2ZW50LmVtaXQoaGVhckJlYXRFdmVudCk7XG4gICAgdGhpcy52aWRlb1BsYXllclNlcnZpY2UuaGVhcnRCZWF0KGhlYXJCZWF0RXZlbnQpO1xuICAgIGNvbnN0IGludGVyYWN0SXRlbXMgPSBbJ1BMQVknLCAnUEFVU0UnLCAnRVhJVCcsICdWT0xVTUVfQ0hBTkdFJywgJ0RSQUcnLFxuICAgICAgJ1JBVEVfQ0hBTkdFJywgJ0NMT1NFX0RPV05MT0FEJywgJ0RPV05MT0FEJywgJ05BVklHQVRFX1RPX1BBR0UnLFxuICAgICAgJ05FWFQnLCAnT1BFTl9NRU5VJywgJ1BSRVZJT1VTJywgJ0NMT1NFX01FTlUnLCAnRE9XTkxPQURfTUVOVScsICdET1dOTE9BRF9QT1BVUF9DTE9TRScsICdET1dOTE9BRF9QT1BVUF9DQU5DRUwnLFxuICAgICAgJ1NIQVJFJywgJ1JFUExBWScsICdGT1JXQVJEJywgJ0JBQ0tXQVJEJywgJ0ZVTExTQ1JFRU4nLCAnTkVYVF9DT05URU5UX1BMQVknLCAnVFJBTlNDUklQVF9MQU5HVUFHRV9PRkYnLFxuICAgICAgJ1RSQU5TQ1JJUFRfTEFOR1VBR0VfU0VMRUNURUQnLCAnVklERU9fTUFSS0VSX1NFTEVDVEVEJ1xuICAgIF07XG4gICAgaWYgKGludGVyYWN0SXRlbXMuaW5jbHVkZXModHlwZSkpIHtcbiAgICAgIHRoaXMudmlkZW9QbGF5ZXJTZXJ2aWNlLmludGVyYWN0KHR5cGUudG9Mb3dlckNhc2UoKSwgJ3ZpZGVvc3RhZ2UnLCBleHRyYVZhbHVlcyk7XG4gICAgfVxuICB9XG5cbiAgcmFpc2VJbXByZXNzaW9uRXZlbnQocGFnZUlkOiBzdHJpbmcsIGNkYXRhOiBhbnkgPSB7fSkge1xuICAgIHRoaXMudmlkZW9QbGF5ZXJTZXJ2aWNlLmltcHJlc3Npb24ocGFnZUlkLCBjZGF0YSk7XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tc2hhZG93ZWQtdmFyaWFibGVcbiAgcmFpc2VFeGNlcHRpb25Mb2coZXJyb3JDb2RlOiBzdHJpbmcsIGVycm9yVHlwZTogc3RyaW5nLCBzdGFja3RyYWNlLCB0cmFjZUlkKSB7XG4gICAgY29uc3QgZXhjZXB0aW9uTG9nRXZlbnQgPSB7XG4gICAgICBlaWQ6ICdFUlJPUicsXG4gICAgICBlZGF0YToge1xuICAgICAgICBlcnI6IGVycm9yQ29kZSxcbiAgICAgICAgZXJydHlwZTogZXJyb3JUeXBlLFxuICAgICAgICByZXF1ZXN0aWQ6IHRyYWNlSWQgfHwgJycsXG4gICAgICAgIHN0YWNrdHJhY2U6IChzdGFja3RyYWNlICYmIHN0YWNrdHJhY2UudG9TdHJpbmcoKSkgfHwgJycsXG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLnBsYXllckV2ZW50LmVtaXQoZXhjZXB0aW9uTG9nRXZlbnQpO1xuICAgIHRoaXMudmlkZW9QbGF5ZXJTZXJ2aWNlLmVycm9yKGVycm9yQ29kZSAsIGVycm9yVHlwZSAsIHN0YWNrdHJhY2UpO1xuICB9XG5cbn1cbiJdfQ==