@sam17896/ngx-speech-recognition
Version:
Angular 5+ speech recognition service (based on browser implementation such as Chrome).
235 lines • 21.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/service/rx-speech-recognition.service.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Observable, pipe, Subject, BehaviorSubject, } from 'rxjs';
import { filter, map } from 'rxjs/operators';
import { Injectable, ApplicationRef, Inject, Optional } from '@angular/core';
import { SpeechRecognitionGrammars, SpeechRecognitionLang, SpeechRecognitionContinuous, SpeechRecognitionInterimResults, SpeechRecognitionMaxAlternatives, SpeechRecognitionServiceUri, } from './speech-recognition.token';
import { SpeechRecognitionCommon, } from './speech-recognition.common';
/** @type {?} */
var onType = (/**
* @param {?} type
* @return {?}
*/
function (type) {
return filter((/**
* @param {?} e
* @return {?}
*/
function (e) { return (e.type === type); }));
});
var ɵ0 = onType;
/** @type {?} */
export var resultList = pipe(onType('result'), map((/**
* @param {?} e
* @return {?}
*/
function (e) { return e.results; })));
var RxSpeechRecognitionService = /** @class */ (function (_super) {
tslib_1.__extends(RxSpeechRecognitionService, _super);
function RxSpeechRecognitionService(ref, grammars, lang, continuous, interimResults, maxAlternatives, serviceURI) {
var _this = _super.call(this, grammars, lang, continuous, interimResults, maxAlternatives, serviceURI) || this;
_this.ref = ref;
_this.proxy$ = new Subject();
_this._started$ = new BehaviorSubject(false);
_this.initInternal();
return _this;
}
Object.defineProperty(RxSpeechRecognitionService.prototype, "$", {
get: /**
* @return {?}
*/
function () {
return (/** @type {?} */ (this.proxy$));
},
enumerable: true,
configurable: true
});
Object.defineProperty(RxSpeechRecognitionService.prototype, "started$", {
get: /**
* @return {?}
*/
function () {
return (/** @type {?} */ (this._started$));
},
enumerable: true,
configurable: true
});
/**
* @private
* @return {?}
*/
RxSpeechRecognitionService.prototype.initInternal = /**
* @private
* @return {?}
*/
function () {
var _this = this;
// set handlers
/** @type {?} */
var handler = (/**
* @param {?} e
* @return {?}
*/
function (e) {
_this.proxy$.next(e);
_this.ref.tick();
});
/** @type {?} */
var errHandler = (/**
* @param {?} e
* @return {?}
*/
function (e) {
_this.proxy$.error(e);
_this.ref.tick();
});
this.internal.onaudiostart = handler;
this.internal.onsoundstart = handler;
this.internal.onspeechstart = handler;
this.internal.onspeechend = handler;
this.internal.onsoundend = handler;
this.internal.onaudioend = handler;
this.internal.onresult = handler;
this.internal.onnomatch = handler;
this.internal.onerror = errHandler;
this.internal.onstart = handler;
this.internal.onend = handler;
// see setter methods
this.grammars = this._grammars;
this.lang = this._lang;
this.continuous = this._continuous;
this.interimResults = this._interimResults;
this.maxAlternatives = this._maxAlternatives;
this.serviceURI = this._serviceURI;
this.proxy$.subscribe((/**
* @param {?} e
* @return {?}
*/
function (e) {
switch (e.type) {
case 'start':
_this._started$.next(true);
break;
case 'end':
_this._started$.next(false);
break;
}
}));
};
// The listen() method aims to recognize the grammar associated with the current SpeechRecognition,
// Observable is returned for handling voice recognition service listening to incoming voice.
// When you subscrive the return value, listening begins and listening ends when an end event occurs.
// Interrupt listening by unsubscribing in the middle.
//
// listen() メソッドは、現在のSpeechRecognitionに
// 関連付けられた文法を認識することを目的として、
// 着信音声を聴取する音声認識サービスを扱うためのObservableが返されます。
// 返り値をsubscriveすると聴取が開始され、endのイベントが発生すると聴取を終了します。
// 途中でunsbscriveすることで聴取を中断します。
// The listen() method aims to recognize the grammar associated with the current SpeechRecognition,
// Observable is returned for handling voice recognition service listening to incoming voice.
// When you subscrive the return value, listening begins and listening ends when an end event occurs.
// Interrupt listening by unsubscribing in the middle.
//
// listen() メソッドは、現在のSpeechRecognitionに
// 関連付けられた文法を認識することを目的として、
// 着信音声を聴取する音声認識サービスを扱うためのObservableが返されます。
// 返り値をsubscriveすると聴取が開始され、endのイベントが発生すると聴取を終了します。
// 途中でunsbscriveすることで聴取を中断します。
/**
* @return {?}
*/
RxSpeechRecognitionService.prototype.listen =
// The listen() method aims to recognize the grammar associated with the current SpeechRecognition,
// Observable is returned for handling voice recognition service listening to incoming voice.
// When you subscrive the return value, listening begins and listening ends when an end event occurs.
// Interrupt listening by unsubscribing in the middle.
//
// listen() メソッドは、現在のSpeechRecognitionに
// 関連付けられた文法を認識することを目的として、
// 着信音声を聴取する音声認識サービスを扱うためのObservableが返されます。
// 返り値をsubscriveすると聴取が開始され、endのイベントが発生すると聴取を終了します。
// 途中でunsbscriveすることで聴取を中断します。
/**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var listener = new Observable((/**
* @param {?} ovserver
* @return {?}
*/
function (ovserver) {
// create subscriotion
/** @type {?} */
var subscriotion = _this.proxy$.subscribe({
next: (/**
* @param {?} e
* @return {?}
*/
function (e) {
ovserver.next(e);
if (e.type && e.type === 'end') {
_this.internal.stop();
ovserver.complete();
subscriotion.unsubscribe();
}
}),
error: (/**
* @param {?} e
* @return {?}
*/
function (e) { return ovserver.error(e); }),
});
// Speech Recognition start
_this.internal.start();
return (/**
* @return {?}
*/
function () {
_this.internal.abort();
subscriotion.unsubscribe();
});
}));
return listener;
};
RxSpeechRecognitionService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
RxSpeechRecognitionService.ctorParameters = function () { return [
{ type: ApplicationRef },
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [SpeechRecognitionGrammars,] }] },
{ type: String, decorators: [{ type: Optional }, { type: Inject, args: [SpeechRecognitionLang,] }] },
{ type: Boolean, decorators: [{ type: Optional }, { type: Inject, args: [SpeechRecognitionContinuous,] }] },
{ type: Boolean, decorators: [{ type: Optional }, { type: Inject, args: [SpeechRecognitionInterimResults,] }] },
{ type: Number, decorators: [{ type: Optional }, { type: Inject, args: [SpeechRecognitionMaxAlternatives,] }] },
{ type: String, decorators: [{ type: Optional }, { type: Inject, args: [SpeechRecognitionServiceUri,] }] }
]; };
return RxSpeechRecognitionService;
}(SpeechRecognitionCommon));
export { RxSpeechRecognitionService };
if (false) {
/**
* @type {?}
* @private
*/
RxSpeechRecognitionService.prototype.proxy$;
/**
* @type {?}
* @private
*/
RxSpeechRecognitionService.prototype._started$;
/**
* @type {?}
* @private
*/
RxSpeechRecognitionService.prototype.ref;
}
export { ɵ0 };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicngtc3BlZWNoLXJlY29nbml0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2FtMTc4OTYvbmd4LXNwZWVjaC1yZWNvZ25pdGlvbi8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlL3J4LXNwZWVjaC1yZWNvZ25pdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsSUFBSSxFQUVKLE9BQU8sRUFDUCxlQUFlLEdBQ2hCLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdFLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIscUJBQXFCLEVBQ3JCLDJCQUEyQixFQUMzQiwrQkFBK0IsRUFDL0IsZ0NBQWdDLEVBQ2hDLDJCQUEyQixHQUM1QixNQUFNLDRCQUE0QixDQUFDO0FBT3BDLE9BQU8sRUFDTCx1QkFBdUIsR0FDeEIsTUFBTSw2QkFBNkIsQ0FBQzs7SUFFL0IsTUFBTTs7OztBQUFHLFVBQUMsSUFBWTtJQUMxQixPQUFPLE1BQU07Ozs7SUFBQyxVQUFDLENBQWdDLElBQUssT0FBQSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQWpCLENBQWlCLEVBQUMsQ0FBQztBQUN6RSxDQUFDLENBQUE7OztBQUVELE1BQU0sS0FBTyxVQUFVLEdBQStGLElBQUksQ0FDeEgsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUNoQixHQUFHOzs7O0FBQUMsVUFBQyxDQUF5QixJQUFrQyxPQUFBLENBQUMsQ0FBQyxPQUFPLEVBQVQsQ0FBUyxFQUFDLENBQzNFO0FBRUQ7SUFDZ0Qsc0RBQXVCO0lBY3JFLG9DQUNVLEdBQW1CLEVBRzNCLFFBQStCLEVBRy9CLElBQVksRUFHWixVQUFt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QzlCLFFBQVEsWUFBSSxNQUFNLFNBQUMseUJBQXlCOzZDQUc1QyxRQUFRLFlBQUksTUFBTSxTQUFDLHFCQUFxQjs4Q0FHeEMsUUFBUSxZQUFJLE1BQU0sU0FBQywyQkFBMkI7OENBRzlDLFFBQVEsWUFBSSxNQUFNLFNBQUMsK0JBQStCOzZDQUdsRCxRQUFRLFlBQUksTUFBTSxTQUFDLGdDQUFnQzs2Q0FHbkQsUUFBUSxZQUFJLE1BQU0sU0FBQywyQkFBMkI7O0lBMkZuRCxpQ0FBQztDQUFBLEFBNUhELENBQ2dELHVCQUF1QixHQTJIdEU7U0EzSFksMEJBQTBCOzs7Ozs7SUFFckMsNENBQXVFOzs7OztJQUV2RSwrQ0FBd0Q7Ozs7O0lBV3RELHlDQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgT2JzZXJ2YWJsZSxcclxuICBwaXBlLFxyXG4gIFVuYXJ5RnVuY3Rpb24sXHJcbiAgU3ViamVjdCxcclxuICBCZWhhdmlvclN1YmplY3QsXHJcbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbHRlciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgQXBwbGljYXRpb25SZWYsIEluamVjdCwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7XHJcbiAgU3BlZWNoUmVjb2duaXRpb25HcmFtbWFycyxcclxuICBTcGVlY2hSZWNvZ25pdGlvbkxhbmcsXHJcbiAgU3BlZWNoUmVjb2duaXRpb25Db250aW51b3VzLFxyXG4gIFNwZWVjaFJlY29nbml0aW9uSW50ZXJpbVJlc3VsdHMsXHJcbiAgU3BlZWNoUmVjb2duaXRpb25NYXhBbHRlcm5hdGl2ZXMsXHJcbiAgU3BlZWNoUmVjb2duaXRpb25TZXJ2aWNlVXJpLFxyXG59IGZyb20gJy4vc3BlZWNoLXJlY29nbml0aW9uLnRva2VuJztcclxuXHJcbmltcG9ydCB7XHJcbiAgU3BlZWNoR3JhbW1hckxpc3RUeXBlLFxyXG4gIFNwZWVjaFJlY29nbml0aW9uU2VydmljZUV2ZW50LFxyXG59IGZyb20gJy4uL2FkYXB0ZXInO1xyXG5cclxuaW1wb3J0IHtcclxuICBTcGVlY2hSZWNvZ25pdGlvbkNvbW1vbixcclxufSBmcm9tICcuL3NwZWVjaC1yZWNvZ25pdGlvbi5jb21tb24nO1xyXG5cclxuY29uc3Qgb25UeXBlID0gKHR5cGU6IHN0cmluZykgPT4ge1xyXG4gIHJldHVybiBmaWx0ZXIoKGU6IFNwZWVjaFJlY29nbml0aW9uU2VydmljZUV2ZW50KSA9PiAoZS50eXBlID09PSB0eXBlKSk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgcmVzdWx0TGlzdDogVW5hcnlGdW5jdGlvbjxPYnNlcnZhYmxlPFNwZWVjaFJlY29nbml0aW9uRXZlbnQ+LCBPYnNlcnZhYmxlPFNwZWVjaFJlY29nbml0aW9uUmVzdWx0TGlzdD4+ID0gcGlwZShcclxuICBvblR5cGUoJ3Jlc3VsdCcpLFxyXG4gIG1hcCgoZTogU3BlZWNoUmVjb2duaXRpb25FdmVudCk6IFNwZWVjaFJlY29nbml0aW9uUmVzdWx0TGlzdCA9PiBlLnJlc3VsdHMpLFxyXG4pO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgUnhTcGVlY2hSZWNvZ25pdGlvblNlcnZpY2UgZXh0ZW5kcyBTcGVlY2hSZWNvZ25pdGlvbkNvbW1vbiB7XHJcblxyXG4gIHByaXZhdGUgcHJveHkkOiBTdWJqZWN0PFNwZWVjaFJlY29nbml0aW9uU2VydmljZUV2ZW50PiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIHByaXZhdGUgX3N0YXJ0ZWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gIGdldCAkKCk6IE9ic2VydmFibGU8U3BlZWNoUmVjb2duaXRpb25TZXJ2aWNlRXZlbnQ+IHtcclxuICAgIHJldHVybiB0aGlzLnByb3h5JCBhcyBPYnNlcnZhYmxlPFNwZWVjaFJlY29nbml0aW9uU2VydmljZUV2ZW50PjtcclxuICB9XHJcblxyXG4gIGdldCBzdGFydGVkJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLl9zdGFydGVkJCBhcyBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlZjogQXBwbGljYXRpb25SZWYsXHJcblxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChTcGVlY2hSZWNvZ25pdGlvbkdyYW1tYXJzKVxyXG4gICAgZ3JhbW1hcnM6IFNwZWVjaEdyYW1tYXJMaXN0VHlwZSxcclxuXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFNwZWVjaFJlY29nbml0aW9uTGFuZylcclxuICAgIGxhbmc6IHN0cmluZyxcclxuXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFNwZWVjaFJlY29nbml0aW9uQ29udGludW91cylcclxuICAgIGNvbnRpbnVvdXM6IGJvb2xlYW4sXHJcblxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChTcGVlY2hSZWNvZ25pdGlvbkludGVyaW1SZXN1bHRzKVxyXG4gICAgaW50ZXJpbVJlc3VsdHM6IGJvb2xlYW4sXHJcblxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChTcGVlY2hSZWNvZ25pdGlvbk1heEFsdGVybmF0aXZlcylcclxuICAgIG1heEFsdGVybmF0aXZlczogbnVtYmVyLFxyXG5cclxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoU3BlZWNoUmVjb2duaXRpb25TZXJ2aWNlVXJpKVxyXG4gICAgc2VydmljZVVSSTogc3RyaW5nLFxyXG4gICkge1xyXG4gICAgc3VwZXIoZ3JhbW1hcnMsIGxhbmcsIGNvbnRpbnVvdXMsIGludGVyaW1SZXN1bHRzLCBtYXhBbHRlcm5hdGl2ZXMsIHNlcnZpY2VVUkkpO1xyXG4gICAgdGhpcy5pbml0SW50ZXJuYWwoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdEludGVybmFsKCkge1xyXG4gICAgLy8gc2V0IGhhbmRsZXJzXHJcbiAgICBjb25zdCBoYW5kbGVyID0gKGUpID0+IHtcclxuICAgICAgdGhpcy5wcm94eSQubmV4dChlKTtcclxuICAgICAgdGhpcy5yZWYudGljaygpO1xyXG4gICAgfTtcclxuICAgIGNvbnN0IGVyckhhbmRsZXIgPSAoZSkgPT4ge1xyXG4gICAgICB0aGlzLnByb3h5JC5lcnJvcihlKTtcclxuICAgICAgdGhpcy5yZWYudGljaygpO1xyXG4gICAgfTtcclxuICAgIHRoaXMuaW50ZXJuYWwub25hdWRpb3N0YXJ0ID0gaGFuZGxlcjtcclxuICAgIHRoaXMuaW50ZXJuYWwub25zb3VuZHN0YXJ0ID0gaGFuZGxlcjtcclxuICAgIHRoaXMuaW50ZXJuYWwub25zcGVlY2hzdGFydCA9IGhhbmRsZXI7XHJcblxyXG4gICAgdGhpcy5pbnRlcm5hbC5vbnNwZWVjaGVuZCA9IGhhbmRsZXI7XHJcbiAgICB0aGlzLmludGVybmFsLm9uc291bmRlbmQgPSBoYW5kbGVyO1xyXG4gICAgdGhpcy5pbnRlcm5hbC5vbmF1ZGlvZW5kID0gaGFuZGxlcjtcclxuXHJcbiAgICB0aGlzLmludGVybmFsLm9ucmVzdWx0ID0gaGFuZGxlcjtcclxuICAgIHRoaXMuaW50ZXJuYWwub25ub21hdGNoID0gaGFuZGxlcjtcclxuICAgIHRoaXMuaW50ZXJuYWwub25lcnJvciA9IGVyckhhbmRsZXI7XHJcblxyXG4gICAgdGhpcy5pbnRlcm5hbC5vbnN0YXJ0ID0gaGFuZGxlcjtcclxuICAgIHRoaXMuaW50ZXJuYWwub25lbmQgPSBoYW5kbGVyO1xyXG5cclxuICAgIC8vIHNlZSBzZXR0ZXIgbWV0aG9kc1xyXG4gICAgdGhpcy5ncmFtbWFycyA9IHRoaXMuX2dyYW1tYXJzO1xyXG4gICAgdGhpcy5sYW5nID0gdGhpcy5fbGFuZztcclxuICAgIHRoaXMuY29udGludW91cyA9IHRoaXMuX2NvbnRpbnVvdXM7XHJcbiAgICB0aGlzLmludGVyaW1SZXN1bHRzID0gdGhpcy5faW50ZXJpbVJlc3VsdHM7XHJcbiAgICB0aGlzLm1heEFsdGVybmF0aXZlcyA9IHRoaXMuX21heEFsdGVybmF0aXZlcztcclxuICAgIHRoaXMuc2VydmljZVVSSSA9IHRoaXMuX3NlcnZpY2VVUkk7XHJcblxyXG4gICAgdGhpcy5wcm94eSQuc3Vic2NyaWJlKChlKSA9PiB7XHJcbiAgICAgIHN3aXRjaCAoZS50eXBlKSB7XHJcbiAgICAgICAgY2FzZSAnc3RhcnQnOlxyXG4gICAgICAgICAgdGhpcy5fc3RhcnRlZCQubmV4dCh0cnVlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ2VuZCc6XHJcbiAgICAgICAgICB0aGlzLl9zdGFydGVkJC5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIFRoZSBsaXN0ZW4oKSBtZXRob2QgYWltcyB0byByZWNvZ25pemUgdGhlIGdyYW1tYXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IFNwZWVjaFJlY29nbml0aW9uLFxyXG4gIC8vIE9ic2VydmFibGUgaXMgcmV0dXJuZWQgZm9yIGhhbmRsaW5nIHZvaWNlIHJlY29nbml0aW9uIHNlcnZpY2UgbGlzdGVuaW5nIHRvIGluY29taW5nIHZvaWNlLlxyXG4gIC8vIFdoZW4geW91IHN1YnNjcml2ZSB0aGUgcmV0dXJuIHZhbHVlLCBsaXN0ZW5pbmcgYmVnaW5zIGFuZCBsaXN0ZW5pbmcgZW5kcyB3aGVuIGFuIGVuZCBldmVudCBvY2N1cnMuXHJcbiAgLy8gSW50ZXJydXB0IGxpc3RlbmluZyBieSB1bnN1YnNjcmliaW5nIGluIHRoZSBtaWRkbGUuXHJcbiAgLy9cclxuICAvLyBsaXN0ZW4oKSDjg6Hjgr3jg4Pjg4njga/jgIHnj77lnKjjga5TcGVlY2hSZWNvZ25pdGlvbuOBq1xyXG4gIC8vIOmWoumAo+S7mOOBkeOCieOCjOOBn+aWh+azleOCkuiqjeitmOOBmeOCi+OBk+OBqOOCkuebrueahOOBqOOBl+OBpuOAgVxyXG4gIC8vIOedgOS/oemfs+WjsOOCkuiBtOWPluOBmeOCi+mfs+WjsOiqjeitmOOCteODvOODk+OCueOCkuaJseOBhuOBn+OCgeOBrk9ic2VydmFibGXjgYzov5TjgZXjgozjgb7jgZnjgIJcclxuICAvLyDov5TjgorlgKTjgpJzdWJzY3JpdmXjgZnjgovjgajogbTlj5bjgYzplovlp4vjgZXjgozjgIFlbmTjga7jgqTjg5njg7Pjg4jjgYznmbrnlJ/jgZnjgovjgajogbTlj5bjgpLntYLkuobjgZfjgb7jgZnjgIJcclxuICAvLyDpgJTkuK3jgad1bnNic2NyaXZl44GZ44KL44GT44Go44Gn6IG05Y+W44KS5Lit5pat44GX44G+44GZ44CCXHJcbiAgcHVibGljIGxpc3RlbigpOiBPYnNlcnZhYmxlPFNwZWVjaFJlY29nbml0aW9uU2VydmljZUV2ZW50PiB7XHJcblxyXG4gICAgY29uc3QgbGlzdGVuZXIgPSBuZXcgT2JzZXJ2YWJsZTxTcGVlY2hSZWNvZ25pdGlvblNlcnZpY2VFdmVudD4oKG92c2VydmVyKSA9PiB7XHJcbiAgICAgIC8vIGNyZWF0ZSBzdWJzY3Jpb3Rpb25cclxuICAgICAgY29uc3Qgc3Vic2NyaW90aW9uID0gdGhpcy5wcm94eSQuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAoZSkgPT4ge1xyXG4gICAgICAgICAgb3ZzZXJ2ZXIubmV4dChlKTtcclxuXHJcbiAgICAgICAgICBpZiAoZS50eXBlICYmIGUudHlwZSA9PT0gJ2VuZCcpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnRlcm5hbC5zdG9wKCk7XHJcbiAgICAgICAgICAgIG92c2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgIHN1YnNjcmlvdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlKSA9PiBvdnNlcnZlci5lcnJvcihlKSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBTcGVlY2ggUmVjb2duaXRpb24gc3RhcnRcclxuICAgICAgdGhpcy5pbnRlcm5hbC5zdGFydCgpO1xyXG5cclxuICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICB0aGlzLmludGVybmFsLmFib3J0KCk7XHJcbiAgICAgICAgc3Vic2NyaW90aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gbGlzdGVuZXI7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=