ngx-agora-sdk-ng
Version:
<div style="display:flex"> <img src="docs/images/angular-logo.svg" width="50px" height="50px" alt="Angular"/> <img src="docs/images/agora-logo.png" width="50px" height="50px" alt="Agora"/> </div>
171 lines • 29.3 kB
JavaScript
import { __awaiter } from "tslib";
import { EventEmitter, Inject, Injectable } from "@angular/core";
import AgoraRTC from "agora-rtc-sdk-ng";
import { JoinAudioChannel, JoinChannel, JoinVideoChannel } from "./services/channel";
import { AgoraConfig } from "./agora-config";
import * as i0 from "@angular/core";
export class NgxAgoraSdkNgService {
constructor(config) {
var _a, _b, _c;
this.config = config;
this._onRemoteUserStateEvent = new EventEmitter();
this._onRemoteUserJoinedEvent = new EventEmitter();
this._onRemoteUserLeftEvent = new EventEmitter();
this._onRemoteVolumeIndicatorEvent = new EventEmitter();
this._onLocalUserJoinedEvent = new EventEmitter();
this._onLocalUserLeftEvent = new EventEmitter();
this._onLocalNetworkQualityChangeEvent = new EventEmitter();
this.agoraClient = AgoraRTC.createClient({
codec: config.Video ? (_a = config.Video) === null || _a === void 0 ? void 0 : _a.codec : 'h264',
mode: config.Video ? (_b = config.Video) === null || _b === void 0 ? void 0 : _b.mode : 'rtc',
role: config.Video ? (_c = config.Video) === null || _c === void 0 ? void 0 : _c.role : 'audience'
});
this.agoraClient.on('user-published', (user, mediaType) => __awaiter(this, void 0, void 0, function* () {
yield this.agoraClient.subscribe(user, mediaType);
this._onRemoteUserStateEvent.emit({
mediaType: mediaType,
connectionState: 'CONNECTED',
user: {
uid: user.uid,
hasVideo: user.hasVideo,
hasAudio: user.hasAudio,
audioTrack: {
setVolume: (volume) => { var _a; return (_a = user.audioTrack) === null || _a === void 0 ? void 0 : _a.setVolume(volume); },
getVolumeLevel: () => { var _a; return (_a = user.audioTrack) === null || _a === void 0 ? void 0 : _a.getVolumeLevel(); },
play: () => { var _a; return (_a = user.audioTrack) === null || _a === void 0 ? void 0 : _a.play(); },
getMediaStream: () => { var _a; return new MediaStream([(_a = user.audioTrack) === null || _a === void 0 ? void 0 : _a.getMediaStreamTrack()]); }
},
videoTrack: {
play: (element) => { var _a; return (_a = user.videoTrack) === null || _a === void 0 ? void 0 : _a.play(element); },
getMediaStream: () => { var _a; return new MediaStream([(_a = user.videoTrack) === null || _a === void 0 ? void 0 : _a.getMediaStreamTrack()]); }
}
}
});
}));
this.agoraClient.on('user-unpublished', user => {
this._onRemoteUserStateEvent.emit({
connectionState: 'DISCONNECTED',
user: {
uid: user.uid,
hasVideo: user.hasVideo,
hasAudio: user.hasAudio,
audioTrack: {
setVolume: (volume) => { var _a; return (_a = user.audioTrack) === null || _a === void 0 ? void 0 : _a.setVolume(volume); },
getVolumeLevel: () => { var _a; return (_a = user.audioTrack) === null || _a === void 0 ? void 0 : _a.getVolumeLevel(); },
play: () => { var _a; return (_a = user.audioTrack) === null || _a === void 0 ? void 0 : _a.play(); },
getMediaStream: () => { var _a; return new MediaStream([(_a = user.audioTrack) === null || _a === void 0 ? void 0 : _a.getMediaStreamTrack()]); }
},
videoTrack: {
play: (element) => { var _a; return (_a = user.videoTrack) === null || _a === void 0 ? void 0 : _a.play(element); },
getMediaStream: () => { var _a; return new MediaStream([(_a = user.videoTrack) === null || _a === void 0 ? void 0 : _a.getMediaStreamTrack()]); }
}
}
});
});
this.agoraClient.on('user-joined', (user) => {
this._onRemoteUserJoinedEvent.emit({
uid: user.uid,
hasVideo: user.hasVideo,
hasAudio: user.hasAudio,
audioTrack: {
setVolume: (volume) => { var _a; return (_a = user.audioTrack) === null || _a === void 0 ? void 0 : _a.setVolume(volume); },
getVolumeLevel: () => { var _a; return (_a = user.audioTrack) === null || _a === void 0 ? void 0 : _a.getVolumeLevel(); },
play: () => { var _a; return (_a = user.audioTrack) === null || _a === void 0 ? void 0 : _a.play(); },
getMediaStream: () => { var _a; return new MediaStream([(_a = user.audioTrack) === null || _a === void 0 ? void 0 : _a.getMediaStreamTrack()]); }
},
videoTrack: {
play: (element) => { var _a; return (_a = user.videoTrack) === null || _a === void 0 ? void 0 : _a.play(element); },
getMediaStream: () => { var _a; return new MediaStream([(_a = user.videoTrack) === null || _a === void 0 ? void 0 : _a.getMediaStreamTrack()]); }
}
});
});
this.agoraClient.on('user-left', (user, reason) => {
this._onRemoteUserLeftEvent.emit({
user: {
uid: user.uid,
hasVideo: user.hasVideo,
hasAudio: user.hasAudio,
audioTrack: {
setVolume: (volume) => { var _a; return (_a = user.audioTrack) === null || _a === void 0 ? void 0 : _a.setVolume(volume); },
getVolumeLevel: () => { var _a; return (_a = user.audioTrack) === null || _a === void 0 ? void 0 : _a.getVolumeLevel(); },
play: () => { var _a; return (_a = user.audioTrack) === null || _a === void 0 ? void 0 : _a.play(); },
getMediaStream: () => { var _a; return new MediaStream([(_a = user.audioTrack) === null || _a === void 0 ? void 0 : _a.getMediaStreamTrack()]); }
},
videoTrack: {
play: (element) => { var _a; return (_a = user.videoTrack) === null || _a === void 0 ? void 0 : _a.play(element); },
getMediaStream: () => { var _a; return new MediaStream([(_a = user.videoTrack) === null || _a === void 0 ? void 0 : _a.getMediaStreamTrack()]); }
}
},
reason: reason
});
});
this.agoraClient.enableAudioVolumeIndicator();
this.agoraClient.on('volume-indicator', (result) => {
this._onRemoteVolumeIndicatorEvent.emit(result);
});
this.agoraClient.on('network-quality', (stats) => {
this._onLocalNetworkQualityChangeEvent.emit({
download: stats.downlinkNetworkQuality,
upload: stats.uplinkNetworkQuality
});
});
}
join(channelName, token, uid) {
let joinChannel = new JoinChannel(this.agoraClient, this.config, channelName, token, uid);
joinChannel.registerUserJoinedEvent(this._onLocalUserJoinedEvent);
return joinChannel;
}
joinVideo(channelName, token, uid) {
return new JoinVideoChannel(this.agoraClient, this.config, channelName, token, uid);
}
joinAudio(channelName, token, uid) {
return new JoinAudioChannel(this.agoraClient, this.config, channelName, token, uid);
}
// remark: review this code.
leave() {
return __awaiter(this, void 0, void 0, function* () {
yield this.agoraClient.leave();
this._onLocalUserLeftEvent.emit();
});
}
getCameras() {
return AgoraRTC.getCameras();
}
getMicrophones() {
return AgoraRTC.getMicrophones();
}
getDevices() {
return AgoraRTC.getDevices();
}
onRemoteUsersStatusChange() {
return this._onRemoteUserStateEvent.asObservable();
}
onRemoteUserJoined() {
return this._onRemoteUserJoinedEvent.asObservable();
}
onRemoteUserLeft() {
return this._onRemoteUserLeftEvent.asObservable();
}
onRemoteVolumeIndicator() {
return this._onRemoteVolumeIndicatorEvent.asObservable();
}
onLocalUserJoined() {
return this._onLocalUserJoinedEvent.asObservable();
}
onLocalUserLeft() {
return this._onLocalUserLeftEvent.asObservable();
}
onLocalNetworkQualityChange() {
return this._onLocalNetworkQualityChangeEvent.asObservable();
}
}
NgxAgoraSdkNgService.ɵprov = i0.ɵɵdefineInjectable({ factory: function NgxAgoraSdkNgService_Factory() { return new NgxAgoraSdkNgService(i0.ɵɵinject("config")); }, token: NgxAgoraSdkNgService, providedIn: "root" });
NgxAgoraSdkNgService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
NgxAgoraSdkNgService.ctorParameters = () => [
{ type: AgoraConfig, decorators: [{ type: Inject, args: ['config',] }] }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWFnb3JhLXNkay1uZy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1hZ29yYS1zZGstbmcvc3JjLyIsInNvdXJjZXMiOlsibGliL25neC1hZ29yYS1zZGstbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sUUFBNkIsTUFBTSxrQkFBa0IsQ0FBQztBQUU3RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQWlCN0MsTUFBTSxPQUFPLG9CQUFvQjtJQUk3QixZQUFzQyxNQUFtQjs7UUFBbkIsV0FBTSxHQUFOLE1BQU0sQ0FBYTtRQXNLakQsNEJBQXVCLEdBQTRCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDdEUsNkJBQXdCLEdBQThCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDekUsMkJBQXNCLEdBQXdELElBQUksWUFBWSxFQUFFLENBQUM7UUFDakcsa0NBQTZCLEdBQWlFLElBQUksWUFBWSxFQUFFLENBQUM7UUFDakgsNEJBQXVCLEdBQXlDLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbkYsMEJBQXFCLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDOUQsc0NBQWlDLEdBQWlDLElBQUksWUFBWSxFQUFFLENBQUM7UUExS3pGLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztZQUNyQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQUMsTUFBTSxDQUFDLEtBQUssMENBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNO1lBQ2xELElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBQyxNQUFNLENBQUMsS0FBSywwQ0FBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUs7WUFDL0MsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFDLE1BQU0sQ0FBQyxLQUFLLDBDQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVTtTQUN2RCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFPLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRTtZQUM1RCxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztZQUVsRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDO2dCQUM5QixTQUFTLEVBQUUsU0FBUztnQkFDcEIsZUFBZSxFQUFFLFdBQVc7Z0JBQzVCLElBQUksRUFBRTtvQkFDRixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7b0JBQ2IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO29CQUN2QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7b0JBQ3ZCLFVBQVUsRUFBRTt3QkFDUixTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSx3QkFBQyxJQUFJLENBQUMsVUFBVSwwQ0FBRSxTQUFTLENBQUMsTUFBTSxJQUFDO3dCQUN6RCxjQUFjLEVBQUUsR0FBRyxFQUFFLFdBQUMsT0FBQSxNQUFRLElBQUksQ0FBQyxVQUFVLDBDQUFFLGNBQWMsRUFBRSxDQUFBLEVBQUE7d0JBQy9ELElBQUksRUFBRSxHQUFHLEVBQUUsd0JBQUMsSUFBSSxDQUFDLFVBQVUsMENBQUUsSUFBSSxLQUFFO3dCQUNuQyxjQUFjLEVBQUUsR0FBRyxFQUFFLFdBQUMsT0FBQSxJQUFJLFdBQVcsQ0FBQyxDQUFDLE1BQWtCLElBQUksQ0FBQyxVQUFVLDBDQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFBLEVBQUE7cUJBQ3BHO29CQUNELFVBQVUsRUFBRTt3QkFDUixJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSx3QkFBQyxJQUFJLENBQUMsVUFBVSwwQ0FBRSxJQUFJLENBQUMsT0FBTyxJQUFDO3dCQUNqRCxjQUFjLEVBQUUsR0FBRyxFQUFFLFdBQUMsT0FBQSxJQUFJLFdBQVcsQ0FBQyxDQUFDLE1BQWtCLElBQUksQ0FBQyxVQUFVLDBDQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFBLEVBQUE7cUJBQ3BHO2lCQUNKO2FBQ0osQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFBLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxFQUFFO1lBQzNDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUM7Z0JBQzlCLGVBQWUsRUFBRSxjQUFjO2dCQUFFLElBQUksRUFBRTtvQkFDbkMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO29CQUNiLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtvQkFDdkIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO29CQUN2QixVQUFVLEVBQUU7d0JBQ1IsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsd0JBQUMsSUFBSSxDQUFDLFVBQVUsMENBQUUsU0FBUyxDQUFDLE1BQU0sSUFBQzt3QkFDekQsY0FBYyxFQUFFLEdBQUcsRUFBRSxXQUFDLE9BQUEsTUFBUSxJQUFJLENBQUMsVUFBVSwwQ0FBRSxjQUFjLEVBQUUsQ0FBQSxFQUFBO3dCQUMvRCxJQUFJLEVBQUUsR0FBRyxFQUFFLHdCQUFDLElBQUksQ0FBQyxVQUFVLDBDQUFFLElBQUksS0FBRTt3QkFDbkMsY0FBYyxFQUFFLEdBQUcsRUFBRSxXQUFDLE9BQUEsSUFBSSxXQUFXLENBQUMsQ0FBQyxNQUFrQixJQUFJLENBQUMsVUFBVSwwQ0FBRSxtQkFBbUIsRUFBRSxDQUFDLENBQUMsQ0FBQSxFQUFBO3FCQUNwRztvQkFDRCxVQUFVLEVBQUU7d0JBQ1IsSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsd0JBQUMsSUFBSSxDQUFDLFVBQVUsMENBQUUsSUFBSSxDQUFDLE9BQU8sSUFBQzt3QkFDakQsY0FBYyxFQUFFLEdBQUcsRUFBRSxXQUFDLE9BQUEsSUFBSSxXQUFXLENBQUMsQ0FBQyxNQUFrQixJQUFJLENBQUMsVUFBVSwwQ0FBRSxtQkFBbUIsRUFBRSxDQUFDLENBQUMsQ0FBQSxFQUFBO3FCQUNwRztpQkFDSjthQUNKLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDeEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQztnQkFDL0IsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO2dCQUNiLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDdkIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUN2QixVQUFVLEVBQUU7b0JBQ1IsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsd0JBQUMsSUFBSSxDQUFDLFVBQVUsMENBQUUsU0FBUyxDQUFDLE1BQU0sSUFBQztvQkFDekQsY0FBYyxFQUFFLEdBQUcsRUFBRSxXQUFDLE9BQUEsTUFBUSxJQUFJLENBQUMsVUFBVSwwQ0FBRSxjQUFjLEVBQUUsQ0FBQSxFQUFBO29CQUMvRCxJQUFJLEVBQUUsR0FBRyxFQUFFLHdCQUFDLElBQUksQ0FBQyxVQUFVLDBDQUFFLElBQUksS0FBRTtvQkFDbkMsY0FBYyxFQUFFLEdBQUcsRUFBRSxXQUFDLE9BQUEsSUFBSSxXQUFXLENBQUMsQ0FBQyxNQUFrQixJQUFJLENBQUMsVUFBVSwwQ0FBRSxtQkFBbUIsRUFBRSxDQUFDLENBQUMsQ0FBQSxFQUFBO2lCQUNwRztnQkFDRCxVQUFVLEVBQUU7b0JBQ1IsSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsd0JBQUMsSUFBSSxDQUFDLFVBQVUsMENBQUUsSUFBSSxDQUFDLE9BQU8sSUFBQztvQkFDakQsY0FBYyxFQUFFLEdBQUcsRUFBRSxXQUFDLE9BQUEsSUFBSSxXQUFXLENBQUMsQ0FBQyxNQUFrQixJQUFJLENBQUMsVUFBVSwwQ0FBRSxtQkFBbUIsRUFBRSxDQUFDLENBQUMsQ0FBQSxFQUFBO2lCQUNwRzthQUNKLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzlDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUM7Z0JBQzdCLElBQUksRUFBRTtvQkFDRixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7b0JBQ2IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO29CQUN2QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7b0JBQ3ZCLFVBQVUsRUFBRTt3QkFDUixTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSx3QkFBQyxJQUFJLENBQUMsVUFBVSwwQ0FBRSxTQUFTLENBQUMsTUFBTSxJQUFDO3dCQUN6RCxjQUFjLEVBQUUsR0FBRyxFQUFFLFdBQUMsT0FBQSxNQUFRLElBQUksQ0FBQyxVQUFVLDBDQUFFLGNBQWMsRUFBRSxDQUFBLEVBQUE7d0JBQy9ELElBQUksRUFBRSxHQUFHLEVBQUUsd0JBQUMsSUFBSSxDQUFDLFVBQVUsMENBQUUsSUFBSSxLQUFFO3dCQUNuQyxjQUFjLEVBQUUsR0FBRyxFQUFFLFdBQUMsT0FBQSxJQUFJLFdBQVcsQ0FBQyxDQUFDLE1BQWtCLElBQUksQ0FBQyxVQUFVLDBDQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFBLEVBQUE7cUJBQ3BHO29CQUNELFVBQVUsRUFBRTt3QkFDUixJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSx3QkFBQyxJQUFJLENBQUMsVUFBVSwwQ0FBRSxJQUFJLENBQUMsT0FBTyxJQUFDO3dCQUNqRCxjQUFjLEVBQUUsR0FBRyxFQUFFLFdBQUMsT0FBQSxJQUFJLFdBQVcsQ0FBQyxDQUFDLE1BQWtCLElBQUksQ0FBQyxVQUFVLDBDQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFBLEVBQUE7cUJBQ3BHO2lCQUNKO2dCQUNELE1BQU0sRUFBRSxNQUFNO2FBQ2pCLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFdBQVcsQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLGtCQUFrQixFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDL0MsSUFBSSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDN0MsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLElBQUksQ0FBQztnQkFDeEMsUUFBUSxFQUFFLEtBQUssQ0FBQyxzQkFBc0I7Z0JBQ3RDLE1BQU0sRUFBRSxLQUFLLENBQUMsb0JBQW9CO2FBQ3JDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFBO0lBRU4sQ0FBQztJQUVNLElBQUksQ0FBQyxXQUFtQixFQUFFLEtBQWEsRUFBRSxHQUFZO1FBQ3hELElBQUksV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFGLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNsRSxPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDO0lBRU0sU0FBUyxDQUFDLFdBQW1CLEVBQUUsS0FBYSxFQUFFLEdBQVk7UUFDN0QsT0FBTyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFFTSxTQUFTLENBQUMsV0FBbUIsRUFBRSxLQUFhLEVBQUUsR0FBWTtRQUM3RCxPQUFPLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVELDRCQUE0QjtJQUNmLEtBQUs7O1lBQ2QsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QyxDQUFDO0tBQUE7SUFFTSxVQUFVO1FBQ2IsT0FBTyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVNLGNBQWM7UUFDakIsT0FBTyxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVNLFVBQVU7UUFDYixPQUFPLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRU0seUJBQXlCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3ZELENBQUM7SUFFTSxrQkFBa0I7UUFDckIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDeEQsQ0FBQztJQUVNLGdCQUFnQjtRQUNuQixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0lBRU0sdUJBQXVCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLDZCQUE2QixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzdELENBQUM7SUFHTSxpQkFBaUI7UUFDcEIsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdkQsQ0FBQztJQUVNLGVBQWU7UUFDbEIsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDckQsQ0FBQztJQUVNLDJCQUEyQjtRQUM5QixPQUFPLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNqRSxDQUFDOzs7O1lBM0tKLFVBQVUsU0FBQztnQkFDUixVQUFVLEVBQUUsTUFBTTthQUNyQjs7O1lBaEJRLFdBQVcsdUJBcUJILE1BQU0sU0FBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IEFnb3JhUlRDLCB7IElBZ29yYVJUQ0NsaWVudCB9IGZyb20gXCJhZ29yYS1ydGMtc2RrLW5nXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IEpvaW5BdWRpb0NoYW5uZWwsIEpvaW5DaGFubmVsLCBKb2luVmlkZW9DaGFubmVsIH0gZnJvbSBcIi4vc2VydmljZXMvY2hhbm5lbFwiO1xuaW1wb3J0IHsgQWdvcmFDb25maWcgfSBmcm9tIFwiLi9hZ29yYS1jb25maWdcIjtcblxuaW1wb3J0IHtcbiAgICBJQXVkaW9UcmFjayxcbiAgICBJTmd4QWdvcmFTZGtOZ1NlcnZpY2UsXG4gICAgSUpvaW5DaGFubmVsLFxuICAgIElNZWRpYVRyYWNrLFxuICAgIElWaWRlb1RyYWNrLFxuICAgIElWaWRlb0pvaW5DaGFubmVsLFxuICAgIElBdWRpb0pvaW5DaGFubmVsXG59IGZyb20gXCIuL2NvcmUvaW50ZXJmYWNlc1wiO1xuXG5pbXBvcnQgeyBJUmVtb3RlVXNlciwgTmV0d29ya1F1YWxpdHksIFVzZXJTdGF0ZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgTmd4QWdvcmFTZGtOZ1NlcnZpY2UgaW1wbGVtZW50cyBJTmd4QWdvcmFTZGtOZ1NlcnZpY2Uge1xuXG4gICAgcHJpdmF0ZSBhZ29yYUNsaWVudCE6IElBZ29yYVJUQ0NsaWVudDtcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoJ2NvbmZpZycpIHByaXZhdGUgY29uZmlnOiBBZ29yYUNvbmZpZykge1xuXG4gICAgICAgIHRoaXMuYWdvcmFDbGllbnQgPSBBZ29yYVJUQy5jcmVhdGVDbGllbnQoe1xuICAgICAgICAgICAgY29kZWM6IGNvbmZpZy5WaWRlbyA/IGNvbmZpZy5WaWRlbz8uY29kZWMgOiAnaDI2NCcsXG4gICAgICAgICAgICBtb2RlOiBjb25maWcuVmlkZW8gPyBjb25maWcuVmlkZW8/Lm1vZGUgOiAncnRjJyxcbiAgICAgICAgICAgIHJvbGU6IGNvbmZpZy5WaWRlbyA/IGNvbmZpZy5WaWRlbz8ucm9sZSA6ICdhdWRpZW5jZSdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hZ29yYUNsaWVudC5vbigndXNlci1wdWJsaXNoZWQnLCBhc3luYyAodXNlciwgbWVkaWFUeXBlKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFnb3JhQ2xpZW50LnN1YnNjcmliZSh1c2VyLCBtZWRpYVR5cGUpO1xuXG4gICAgICAgICAgICB0aGlzLl9vblJlbW90ZVVzZXJTdGF0ZUV2ZW50LmVtaXQoe1xuICAgICAgICAgICAgICAgIG1lZGlhVHlwZTogbWVkaWFUeXBlLFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25TdGF0ZTogJ0NPTk5FQ1RFRCcsXG4gICAgICAgICAgICAgICAgdXNlcjoge1xuICAgICAgICAgICAgICAgICAgICB1aWQ6IHVzZXIudWlkLFxuICAgICAgICAgICAgICAgICAgICBoYXNWaWRlbzogdXNlci5oYXNWaWRlbyxcbiAgICAgICAgICAgICAgICAgICAgaGFzQXVkaW86IHVzZXIuaGFzQXVkaW8sXG4gICAgICAgICAgICAgICAgICAgIGF1ZGlvVHJhY2s6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFZvbHVtZTogKHZvbHVtZSkgPT4gdXNlci5hdWRpb1RyYWNrPy5zZXRWb2x1bWUodm9sdW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldFZvbHVtZUxldmVsOiAoKSA9PiA8bnVtYmVyPnVzZXIuYXVkaW9UcmFjaz8uZ2V0Vm9sdW1lTGV2ZWwoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXk6ICgpID0+IHVzZXIuYXVkaW9UcmFjaz8ucGxheSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWVkaWFTdHJlYW06ICgpID0+IG5ldyBNZWRpYVN0cmVhbShbPE1lZGlhU3RyZWFtVHJhY2s+dXNlci5hdWRpb1RyYWNrPy5nZXRNZWRpYVN0cmVhbVRyYWNrKCldKVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB2aWRlb1RyYWNrOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF5OiAoZWxlbWVudCkgPT4gdXNlci52aWRlb1RyYWNrPy5wbGF5KGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWVkaWFTdHJlYW06ICgpID0+IG5ldyBNZWRpYVN0cmVhbShbPE1lZGlhU3RyZWFtVHJhY2s+dXNlci52aWRlb1RyYWNrPy5nZXRNZWRpYVN0cmVhbVRyYWNrKCldKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWdvcmFDbGllbnQub24oJ3VzZXItdW5wdWJsaXNoZWQnLCB1c2VyID0+IHtcbiAgICAgICAgICAgIHRoaXMuX29uUmVtb3RlVXNlclN0YXRlRXZlbnQuZW1pdCh7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvblN0YXRlOiAnRElTQ09OTkVDVEVEJywgdXNlcjoge1xuICAgICAgICAgICAgICAgICAgICB1aWQ6IHVzZXIudWlkLFxuICAgICAgICAgICAgICAgICAgICBoYXNWaWRlbzogdXNlci5oYXNWaWRlbyxcbiAgICAgICAgICAgICAgICAgICAgaGFzQXVkaW86IHVzZXIuaGFzQXVkaW8sXG4gICAgICAgICAgICAgICAgICAgIGF1ZGlvVHJhY2s6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFZvbHVtZTogKHZvbHVtZSkgPT4gdXNlci5hdWRpb1RyYWNrPy5zZXRWb2x1bWUodm9sdW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldFZvbHVtZUxldmVsOiAoKSA9PiA8bnVtYmVyPnVzZXIuYXVkaW9UcmFjaz8uZ2V0Vm9sdW1lTGV2ZWwoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXk6ICgpID0+IHVzZXIuYXVkaW9UcmFjaz8ucGxheSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWVkaWFTdHJlYW06ICgpID0+IG5ldyBNZWRpYVN0cmVhbShbPE1lZGlhU3RyZWFtVHJhY2s+dXNlci5hdWRpb1RyYWNrPy5nZXRNZWRpYVN0cmVhbVRyYWNrKCldKVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB2aWRlb1RyYWNrOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF5OiAoZWxlbWVudCkgPT4gdXNlci52aWRlb1RyYWNrPy5wbGF5KGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWVkaWFTdHJlYW06ICgpID0+IG5ldyBNZWRpYVN0cmVhbShbPE1lZGlhU3RyZWFtVHJhY2s+dXNlci52aWRlb1RyYWNrPy5nZXRNZWRpYVN0cmVhbVRyYWNrKCldKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWdvcmFDbGllbnQub24oJ3VzZXItam9pbmVkJywgKHVzZXIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX29uUmVtb3RlVXNlckpvaW5lZEV2ZW50LmVtaXQoe1xuICAgICAgICAgICAgICAgIHVpZDogdXNlci51aWQsXG4gICAgICAgICAgICAgICAgaGFzVmlkZW86IHVzZXIuaGFzVmlkZW8sXG4gICAgICAgICAgICAgICAgaGFzQXVkaW86IHVzZXIuaGFzQXVkaW8sXG4gICAgICAgICAgICAgICAgYXVkaW9UcmFjazoge1xuICAgICAgICAgICAgICAgICAgICBzZXRWb2x1bWU6ICh2b2x1bWUpID0+IHVzZXIuYXVkaW9UcmFjaz8uc2V0Vm9sdW1lKHZvbHVtZSksXG4gICAgICAgICAgICAgICAgICAgIGdldFZvbHVtZUxldmVsOiAoKSA9PiA8bnVtYmVyPnVzZXIuYXVkaW9UcmFjaz8uZ2V0Vm9sdW1lTGV2ZWwoKSxcbiAgICAgICAgICAgICAgICAgICAgcGxheTogKCkgPT4gdXNlci5hdWRpb1RyYWNrPy5wbGF5KCksXG4gICAgICAgICAgICAgICAgICAgIGdldE1lZGlhU3RyZWFtOiAoKSA9PiBuZXcgTWVkaWFTdHJlYW0oWzxNZWRpYVN0cmVhbVRyYWNrPnVzZXIuYXVkaW9UcmFjaz8uZ2V0TWVkaWFTdHJlYW1UcmFjaygpXSlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHZpZGVvVHJhY2s6IHtcbiAgICAgICAgICAgICAgICAgICAgcGxheTogKGVsZW1lbnQpID0+IHVzZXIudmlkZW9UcmFjaz8ucGxheShlbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgZ2V0TWVkaWFTdHJlYW06ICgpID0+IG5ldyBNZWRpYVN0cmVhbShbPE1lZGlhU3RyZWFtVHJhY2s+dXNlci52aWRlb1RyYWNrPy5nZXRNZWRpYVN0cmVhbVRyYWNrKCldKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFnb3JhQ2xpZW50Lm9uKCd1c2VyLWxlZnQnLCAodXNlciwgcmVhc29uKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9vblJlbW90ZVVzZXJMZWZ0RXZlbnQuZW1pdCh7XG4gICAgICAgICAgICAgICAgdXNlcjoge1xuICAgICAgICAgICAgICAgICAgICB1aWQ6IHVzZXIudWlkLFxuICAgICAgICAgICAgICAgICAgICBoYXNWaWRlbzogdXNlci5oYXNWaWRlbyxcbiAgICAgICAgICAgICAgICAgICAgaGFzQXVkaW86IHVzZXIuaGFzQXVkaW8sXG4gICAgICAgICAgICAgICAgICAgIGF1ZGlvVHJhY2s6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFZvbHVtZTogKHZvbHVtZSkgPT4gdXNlci5hdWRpb1RyYWNrPy5zZXRWb2x1bWUodm9sdW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldFZvbHVtZUxldmVsOiAoKSA9PiA8bnVtYmVyPnVzZXIuYXVkaW9UcmFjaz8uZ2V0Vm9sdW1lTGV2ZWwoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXk6ICgpID0+IHVzZXIuYXVkaW9UcmFjaz8ucGxheSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWVkaWFTdHJlYW06ICgpID0+IG5ldyBNZWRpYVN0cmVhbShbPE1lZGlhU3RyZWFtVHJhY2s+dXNlci5hdWRpb1RyYWNrPy5nZXRNZWRpYVN0cmVhbVRyYWNrKCldKVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB2aWRlb1RyYWNrOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF5OiAoZWxlbWVudCkgPT4gdXNlci52aWRlb1RyYWNrPy5wbGF5KGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWVkaWFTdHJlYW06ICgpID0+IG5ldyBNZWRpYVN0cmVhbShbPE1lZGlhU3RyZWFtVHJhY2s+dXNlci52aWRlb1RyYWNrPy5nZXRNZWRpYVN0cmVhbVRyYWNrKCldKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZWFzb246IHJlYXNvblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWdvcmFDbGllbnQuZW5hYmxlQXVkaW9Wb2x1bWVJbmRpY2F0b3IoKTtcbiAgICAgICAgdGhpcy5hZ29yYUNsaWVudC5vbigndm9sdW1lLWluZGljYXRvcicsIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX29uUmVtb3RlVm9sdW1lSW5kaWNhdG9yRXZlbnQuZW1pdChyZXN1bHQpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFnb3JhQ2xpZW50Lm9uKCduZXR3b3JrLXF1YWxpdHknLCAoc3RhdHMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX29uTG9jYWxOZXR3b3JrUXVhbGl0eUNoYW5nZUV2ZW50LmVtaXQoe1xuICAgICAgICAgICAgICAgIGRvd25sb2FkOiBzdGF0cy5kb3dubGlua05ldHdvcmtRdWFsaXR5LFxuICAgICAgICAgICAgICAgIHVwbG9hZDogc3RhdHMudXBsaW5rTmV0d29ya1F1YWxpdHlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuXG4gICAgfVxuXG4gICAgcHVibGljIGpvaW4oY2hhbm5lbE5hbWU6IHN0cmluZywgdG9rZW46IHN0cmluZywgdWlkPzogc3RyaW5nKTogSUpvaW5DaGFubmVsPElNZWRpYVRyYWNrPiB7XG4gICAgICAgIGxldCBqb2luQ2hhbm5lbCA9IG5ldyBKb2luQ2hhbm5lbCh0aGlzLmFnb3JhQ2xpZW50LCB0aGlzLmNvbmZpZywgY2hhbm5lbE5hbWUsIHRva2VuLCB1aWQpO1xuICAgICAgICBqb2luQ2hhbm5lbC5yZWdpc3RlclVzZXJKb2luZWRFdmVudCh0aGlzLl9vbkxvY2FsVXNlckpvaW5lZEV2ZW50KTtcbiAgICAgICAgcmV0dXJuIGpvaW5DaGFubmVsO1xuICAgIH1cblxuICAgIHB1YmxpYyBqb2luVmlkZW8oY2hhbm5lbE5hbWU6IHN0cmluZywgdG9rZW46IHN0cmluZywgdWlkPzogc3RyaW5nKTogSVZpZGVvSm9pbkNoYW5uZWw8SVZpZGVvVHJhY2s+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBKb2luVmlkZW9DaGFubmVsKHRoaXMuYWdvcmFDbGllbnQsIHRoaXMuY29uZmlnLCBjaGFubmVsTmFtZSwgdG9rZW4sIHVpZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGpvaW5BdWRpbyhjaGFubmVsTmFtZTogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCB1aWQ/OiBzdHJpbmcpOiBJQXVkaW9Kb2luQ2hhbm5lbDxJQXVkaW9UcmFjaz4ge1xuICAgICAgICByZXR1cm4gbmV3IEpvaW5BdWRpb0NoYW5uZWwodGhpcy5hZ29yYUNsaWVudCwgdGhpcy5jb25maWcsIGNoYW5uZWxOYW1lLCB0b2tlbiwgdWlkKTtcbiAgICB9XG5cbiAgICAvLyByZW1hcms6IHJldmlldyB0aGlzIGNvZGUuXG4gICAgcHVibGljIGFzeW5jIGxlYXZlKCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWdvcmFDbGllbnQubGVhdmUoKTtcbiAgICAgICAgdGhpcy5fb25Mb2NhbFVzZXJMZWZ0RXZlbnQuZW1pdCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDYW1lcmFzKCk6IFByb21pc2U8TWVkaWFEZXZpY2VJbmZvW10+IHtcbiAgICAgICAgcmV0dXJuIEFnb3JhUlRDLmdldENhbWVyYXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TWljcm9waG9uZXMoKTogUHJvbWlzZTxNZWRpYURldmljZUluZm9bXT4ge1xuICAgICAgICByZXR1cm4gQWdvcmFSVEMuZ2V0TWljcm9waG9uZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGV2aWNlcygpOiBQcm9taXNlPE1lZGlhRGV2aWNlSW5mb1tdPiB7XG4gICAgICAgIHJldHVybiBBZ29yYVJUQy5nZXREZXZpY2VzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUmVtb3RlVXNlcnNTdGF0dXNDaGFuZ2UoKTogT2JzZXJ2YWJsZTxVc2VyU3RhdGU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uUmVtb3RlVXNlclN0YXRlRXZlbnQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUmVtb3RlVXNlckpvaW5lZCgpOiBPYnNlcnZhYmxlPElSZW1vdGVVc2VyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vblJlbW90ZVVzZXJKb2luZWRFdmVudC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25SZW1vdGVVc2VyTGVmdCgpOiBPYnNlcnZhYmxlPHsgdXNlcjogSVJlbW90ZVVzZXIsIHJlYXNvbjogc3RyaW5nIH0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uUmVtb3RlVXNlckxlZnRFdmVudC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25SZW1vdGVWb2x1bWVJbmRpY2F0b3IoKTogT2JzZXJ2YWJsZTxBcnJheTx7IGxldmVsOiBudW1iZXIsIHVpZDogbnVtYmVyIHwgc3RyaW5nIH0+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vblJlbW90ZVZvbHVtZUluZGljYXRvckV2ZW50LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuXG4gICAgcHVibGljIG9uTG9jYWxVc2VySm9pbmVkKCk6IE9ic2VydmFibGU8eyB0cmFjazogSU1lZGlhVHJhY2sgfT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25Mb2NhbFVzZXJKb2luZWRFdmVudC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Mb2NhbFVzZXJMZWZ0KCk6IE9ic2VydmFibGU8eyB1c2VyOiBJUmVtb3RlVXNlciwgcmVhc29uOiBzdHJpbmcgfT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25Mb2NhbFVzZXJMZWZ0RXZlbnQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uTG9jYWxOZXR3b3JrUXVhbGl0eUNoYW5nZSgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25Mb2NhbE5ldHdvcmtRdWFsaXR5Q2hhbmdlRXZlbnQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfb25SZW1vdGVVc2VyU3RhdGVFdmVudDogRXZlbnRFbWl0dGVyPFVzZXJTdGF0ZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgcHJpdmF0ZSBfb25SZW1vdGVVc2VySm9pbmVkRXZlbnQ6IEV2ZW50RW1pdHRlcjxJUmVtb3RlVXNlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgcHJpdmF0ZSBfb25SZW1vdGVVc2VyTGVmdEV2ZW50OiBFdmVudEVtaXR0ZXI8eyB1c2VyOiBJUmVtb3RlVXNlciwgcmVhc29uOiBzdHJpbmcgfT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgcHJpdmF0ZSBfb25SZW1vdGVWb2x1bWVJbmRpY2F0b3JFdmVudDogRXZlbnRFbWl0dGVyPEFycmF5PHsgbGV2ZWw6IG51bWJlciwgdWlkOiBudW1iZXIgfCBzdHJpbmcgfT4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHByaXZhdGUgX29uTG9jYWxVc2VySm9pbmVkRXZlbnQ6IEV2ZW50RW1pdHRlcjx7IHRyYWNrOiBJTWVkaWFUcmFjayB9PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBwcml2YXRlIF9vbkxvY2FsVXNlckxlZnRFdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgcHJpdmF0ZSBfb25Mb2NhbE5ldHdvcmtRdWFsaXR5Q2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxOZXR3b3JrUXVhbGl0eT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbn0gICJdfQ==