@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
267 lines • 23 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: fullscreen.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Input, Inject, ElementRef, Output, EventEmitter } from '@angular/core';
import { DOCUMENT } from '@angular/common';
import { DEFAULT_ZINDEX, DEFAULT_MODE, ESC_KEYCODE } from './fullscreen.config';
export class FullscreenComponent {
/**
* @param {?} elementRef
* @param {?} doc
*/
constructor(elementRef, doc) {
this.elementRef = elementRef;
this.doc = doc;
this.isFullscreen = false;
this.mode = DEFAULT_MODE;
this.zIndex = DEFAULT_ZINDEX;
this.fullscreenLaunch = new EventEmitter();
this.onFullScreenChange = (/**
* @param {?} event
* @return {?}
*/
(event) => {
if (this.currentTarget) {
/** @type {?} */
const targetElement = this.currentTarget;
if (this.doc.fullscreenElement) { // 进入全屏
this.launchNormalFullscreen(targetElement);
}
else { // 退出全屏
this.currentTarget = null;
this.exitNormalFullscreen(targetElement);
}
// F11退出全屏时,需要将全屏状态传出去
/** @type {?} */
const isFullscreen = !!this.doc.fullscreenElement;
this.fullscreenLaunch.emit({
isFullscreen
});
this.isFullscreen = isFullscreen;
}
});
this.handleFullscreen = (/**
* @return {?}
*/
() => tslib_1.__awaiter(this, void 0, void 0, function* () {
/** @type {?} */
const targetElement = this.elementRef.nativeElement.querySelector('[fullscreen-target]');
/** @type {?} */
let isFullscreen;
if (this.mode === 'normal') {
/** @type {?} */
const fullscreen = targetElement.classList.contains('fullscreen');
if (!fullscreen) { // 进入全屏
this.launchNormalFullscreen(targetElement);
isFullscreen = true;
}
else { // 退出全屏
this.exitNormalFullscreen(targetElement);
isFullscreen = false;
}
}
else {
this.currentTarget = targetElement;
if (this.doc.fullscreenElement) {
isFullscreen = yield this.exitImmersiveFullScreen(this.doc);
}
else {
isFullscreen = yield this.launchImmersiveFullScreen(this.doc.documentElement);
}
}
this.isFullscreen = isFullscreen;
this.fullscreenLaunch.emit({
isFullscreen
});
}));
this.handleKeyDown = (/**
* @param {?} event
* @return {?}
*/
(event) => {
if (event.keyCode === ESC_KEYCODE) { // 按ESC键退出全屏
if (this.isFullscreen) {
/** @type {?} */
const targetElement = this.elementRef.nativeElement.querySelector('[fullscreen-target]');
if (this.mode === 'normal') {
this.exitNormalFullscreen(targetElement);
}
else {
if (this.doc.fullscreenElement) {
this.exitImmersiveFullScreen(this.doc);
}
}
this.fullscreenLaunch.emit({
isFullscreen: false
});
this.isFullscreen = false;
}
}
});
}
/**
* @return {?}
*/
ngOnInit() {
document.addEventListener('fullscreenchange', this.onFullScreenChange);
document.addEventListener('keydown', this.handleKeyDown);
/** @type {?} */
const btnLaunch = this.elementRef.nativeElement.querySelector('[fullscreen-launch]');
if (btnLaunch) {
btnLaunch.addEventListener('click', this.handleFullscreen);
}
}
/**
* @private
* @param {?} targetElement
* @return {?}
*/
launchNormalFullscreen(targetElement) {
targetElement.classList.add('fullscreen');
if (this.zIndex) {
targetElement.setAttribute('style', `z-index: ${this.zIndex}`);
}
}
/**
* @private
* @param {?} targetElement
* @return {?}
*/
exitNormalFullscreen(targetElement) {
targetElement.classList.remove('fullscreen');
targetElement.style.zIndex = null;
}
/**
* @private
* @param {?} docElement
* @return {?}
*/
launchImmersiveFullScreen(docElement) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
/** @type {?} */
let fullscreenLaunch;
if (docElement.requestFullscreen) {
fullscreenLaunch = docElement.requestFullscreen();
}
else if (docElement.mozRequestFullScreen) {
fullscreenLaunch = docElement.mozRequestFullScreen();
}
else if (docElement.webkitRequestFullScreen) {
fullscreenLaunch = docElement.webkitRequestFullScreen();
}
else if (docElement.msRequestFullscreen) {
fullscreenLaunch = docElement.msRequestFullscreen();
}
return yield fullscreenLaunch.then((/**
* @return {?}
*/
() => !!this.doc.fullscreenElement));
});
}
/**
* @private
* @param {?} doc
* @return {?}
*/
exitImmersiveFullScreen(doc) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
/** @type {?} */
let fullscreenExit;
if (doc.exitFullscreen) {
fullscreenExit = doc.exitFullscreen();
}
else if (doc.mozCancelFullScreen) {
fullscreenExit = doc.mozCancelFullScreen();
}
else if (doc.webkitCancelFullScreen) {
fullscreenExit = doc.webkitCancelFullScreen();
}
else if (doc.msExitFullscreen) {
fullscreenExit = doc.msExitFullscreen();
}
return yield fullscreenExit.then((/**
* @return {?}
*/
() => !!this.doc.fullscreenElement));
});
}
/**
* @return {?}
*/
ngOnDestroy() {
document.removeEventListener('fullscreenchange', this.onFullScreenChange);
document.removeEventListener('keydown', this.handleKeyDown);
/** @type {?} */
const btnLaunch = this.elementRef.nativeElement.querySelector('[fullscreen-launch]');
if (btnLaunch) {
btnLaunch.removeEventListener('click', this.handleFullscreen);
}
}
}
FullscreenComponent.decorators = [
{ type: Component, args: [{
selector: 'd-fullscreen',
template: "<div class=\"fullscreen-container\">\r\n <ng-content select=\"[fullscreen-launch]\"></ng-content>\r\n <ng-content select=\"[fullscreen-target]\"></ng-content>\r\n</div>\r\n",
styles: [":host ::ng-deep .fullscreen{position:fixed;top:0;left:0;width:100%;height:100%;z-index:10;overflow:auto;background-color:#fff}"]
}] }
];
/** @nocollapse */
FullscreenComponent.ctorParameters = () => [
{ type: ElementRef },
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
];
FullscreenComponent.propDecorators = {
mode: [{ type: Input }],
zIndex: [{ type: Input }],
target: [{ type: Input }],
fullscreenLaunch: [{ type: Output }]
};
if (false) {
/**
* @type {?}
* @private
*/
FullscreenComponent.prototype.currentTarget;
/**
* @type {?}
* @private
*/
FullscreenComponent.prototype.isFullscreen;
/** @type {?} */
FullscreenComponent.prototype.mode;
/** @type {?} */
FullscreenComponent.prototype.zIndex;
/** @type {?} */
FullscreenComponent.prototype.target;
/** @type {?} */
FullscreenComponent.prototype.fullscreenLaunch;
/**
* @type {?}
* @private
*/
FullscreenComponent.prototype.onFullScreenChange;
/**
* @type {?}
* @private
*/
FullscreenComponent.prototype.handleFullscreen;
/**
* @type {?}
* @private
*/
FullscreenComponent.prototype.handleKeyDown;
/**
* @type {?}
* @private
*/
FullscreenComponent.prototype.elementRef;
/**
* @type {?}
* @private
*/
FullscreenComponent.prototype.doc;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVsbHNjcmVlbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1kZXZ1aS9mdWxsc2NyZWVuLyIsInNvdXJjZXMiOlsiZnVsbHNjcmVlbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFPaEYsTUFBTSxPQUFPLG1CQUFtQjs7Ozs7SUFVOUIsWUFDVSxVQUFzQixFQUNKLEdBQVE7UUFEMUIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUNKLFFBQUcsR0FBSCxHQUFHLENBQUs7UUFWNUIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFFcEIsU0FBSSxHQUFtQixZQUFZLENBQUM7UUFDcEMsV0FBTSxHQUFHLGNBQWMsQ0FBQztRQUd2QixxQkFBZ0IsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQXNEM0QsdUJBQWtCOzs7O1FBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNyQyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7O3NCQUNoQixhQUFhLEdBQWdCLElBQUksQ0FBQyxhQUFhO2dCQUNyRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxPQUFPO29CQUN2QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLENBQUM7aUJBQzVDO3FCQUFNLEVBQUUsT0FBTztvQkFDZCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztvQkFDMUIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxDQUFDO2lCQUMxQzs7O3NCQUVLLFlB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LE1BQU07Ozs7Ozs7SUFQUCw0Q0FBbUM7Ozs7O0lBQ25DLDJDQUE2Qjs7SUFFN0IsbUNBQTZDOztJQUM3QyxxQ0FBaUM7O0lBQ2pDLHFDQUE2Qjs7SUFFN0IsK0NBQW1FOzs7OztJQXNEbkUsaURBZ0JDOzs7OztJQUVELCtDQXlCQzs7Ozs7SUFFRCw0Q0FlQzs7Ozs7SUEvR0MseUNBQThCOzs7OztJQUM5QixrQ0FBa0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBJbnB1dCwgSW5qZWN0LCBFbGVtZW50UmVmLCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEZ1bGxzY3JlZW5Nb2RlIH0gZnJvbSAnLi9mdWxsc2NyZWVuLnR5cGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX1pJTkRFWCwgREVGQVVMVF9NT0RFLCBFU0NfS0VZQ09ERSB9IGZyb20gJy4vZnVsbHNjcmVlbi5jb25maWcnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkLWZ1bGxzY3JlZW4nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9mdWxsc2NyZWVuLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsgJy4vZnVsbHNjcmVlbi5jb21wb25lbnQuc2NzcycgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRnVsbHNjcmVlbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBwcml2YXRlIGN1cnJlbnRUYXJnZXQ6IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgaXNGdWxsc2NyZWVuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIG1vZGU6IEZ1bGxzY3JlZW5Nb2RlID0gREVGQVVMVF9NT0RFO1xyXG4gIEBJbnB1dCgpIHpJbmRleCA9IERFRkFVTFRfWklOREVYO1xyXG4gIEBJbnB1dCgpIHRhcmdldDogSFRNTEVsZW1lbnQ7XHJcblxyXG4gIEBPdXRwdXQoKSBmdWxsc2NyZWVuTGF1bmNoOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvYzogYW55XHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdmdWxsc2NyZWVuY2hhbmdlJywgdGhpcy5vbkZ1bGxTY3JlZW5DaGFuZ2UpO1xyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5RG93bik7XHJcbiAgICBjb25zdCBidG5MYXVuY2ggPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdbZnVsbHNjcmVlbi1sYXVuY2hdJyk7XHJcbiAgICBpZiAoYnRuTGF1bmNoKSB7IGJ0bkxhdW5jaC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlRnVsbHNjcmVlbik7IH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbGF1bmNoTm9ybWFsRnVsbHNjcmVlbih0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgdGFyZ2V0RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmdWxsc2NyZWVuJyk7XHJcbiAgICBpZiAodGhpcy56SW5kZXgpIHtcclxuICAgICAgdGFyZ2V0RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgYHotaW5kZXg6ICR7dGhpcy56SW5kZXh9YCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGV4aXROb3JtYWxGdWxsc2NyZWVuKHRhcmdldEVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XHJcbiAgICB0YXJnZXRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Z1bGxzY3JlZW4nKTtcclxuICAgIHRhcmdldEVsZW1lbnQuc3R5bGUuekluZGV4ID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbGF1bmNoSW1tZXJzaXZlRnVsbFNjcmVlbihkb2NFbGVtZW50OiBhbnkpIHtcclxuICAgIGxldCBmdWxsc2NyZWVuTGF1bmNoO1xyXG4gICAgaWYgKGRvY0VsZW1lbnQucmVxdWVzdEZ1bGxzY3JlZW4pIHtcclxuICAgICAgZnVsbHNjcmVlbkxhdW5jaCA9IGRvY0VsZW1lbnQucmVxdWVzdEZ1bGxzY3JlZW4oKTtcclxuICAgIH0gZWxzZSBpZiAoZG9jRWxlbWVudC5tb3pSZXF1ZXN0RnVsbFNjcmVlbikge1xyXG4gICAgICBmdWxsc2NyZWVuTGF1bmNoID0gZG9jRWxlbWVudC5tb3pSZXF1ZXN0RnVsbFNjcmVlbigpO1xyXG4gICAgfSBlbHNlIGlmIChkb2NFbGVtZW50LndlYmtpdFJlcXVlc3RGdWxsU2NyZWVuKSB7XHJcbiAgICAgIGZ1bGxzY3JlZW5MYXVuY2ggPSBkb2NFbGVtZW50LndlYmtpdFJlcXVlc3RGdWxsU2NyZWVuKCk7XHJcbiAgICB9IGVsc2UgaWYgKGRvY0VsZW1lbnQubXNSZXF1ZXN0RnVsbHNjcmVlbikge1xyXG4gICAgICBmdWxsc2NyZWVuTGF1bmNoID0gZG9jRWxlbWVudC5tc1JlcXVlc3RGdWxsc2NyZWVuKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXdhaXQgZnVsbHNjcmVlbkxhdW5jaC50aGVuKCgpID0+ICEhdGhpcy5kb2MuZnVsbHNjcmVlbkVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBleGl0SW1tZXJzaXZlRnVsbFNjcmVlbihkb2M6IGFueSkge1xyXG4gICAgbGV0IGZ1bGxzY3JlZW5FeGl0O1xyXG4gICAgaWYgKGRvYy5leGl0RnVsbHNjcmVlbikge1xyXG4gICAgICBmdWxsc2NyZWVuRXhpdCA9IGRvYy5leGl0RnVsbHNjcmVlbigpO1xyXG4gICAgfSBlbHNlIGlmIChkb2MubW96Q2FuY2VsRnVsbFNjcmVlbikge1xyXG4gICAgICBmdWxsc2NyZWVuRXhpdCA9IGRvYy5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7XHJcbiAgICB9IGVsc2UgaWYgKGRvYy53ZWJraXRDYW5jZWxGdWxsU2NyZWVuKSB7XHJcbiAgICAgIGZ1bGxzY3JlZW5FeGl0ID0gZG9jLndlYmtpdENhbmNlbEZ1bGxTY3JlZW4oKTtcclxuICAgIH0gZWxzZSBpZiAoZG9jLm1zRXhpdEZ1bGxzY3JlZW4pIHtcclxuICAgICAgZnVsbHNjcmVlbkV4aXQgPSBkb2MubXNFeGl0RnVsbHNjcmVlbigpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGF3YWl0IGZ1bGxzY3JlZW5FeGl0LnRoZW4oKCkgPT4gISF0aGlzLmRvYy5mdWxsc2NyZWVuRWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uRnVsbFNjcmVlbkNoYW5nZSA9IChldmVudCkgPT4ge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudFRhcmdldCkge1xyXG4gICAgICBjb25zdCB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCA9IHRoaXMuY3VycmVudFRhcmdldDtcclxuICAgICAgaWYgKHRoaXMuZG9jLmZ1bGxzY3JlZW5FbGVtZW50KSB7IC8vIOi/m+WFpeWFqOWxj1xyXG4gICAgICAgIHRoaXMubGF1bmNoTm9ybWFsRnVsbHNjcmVlbih0YXJnZXRFbGVtZW50KTtcclxuICAgICAgfSBlbHNlIHsgLy8g6YCA5Ye65YWo5bGPXHJcbiAgICAgICAgdGhpcy5jdXJyZW50VGFyZ2V0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLmV4aXROb3JtYWxGdWxsc2NyZWVuKHRhcmdldEVsZW1lbnQpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIEYxMemAgOWHuuWFqOWxj+aXtu+8jOmcgOimgeWwhuWFqOWxj+eKtuaAgeS8oOWHuuWOu1xyXG4gICAgICBjb25zdCBpc0Z1bGxzY3JlZW4gPSAhIXRoaXMuZG9jLmZ1bGxzY3JlZW5FbGVtZW50O1xyXG4gICAgICB0aGlzLmZ1bGxzY3JlZW5MYXVuY2guZW1pdCh7XHJcbiAgICAgICAgaXNGdWxsc2NyZWVuXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmlzRnVsbHNjcmVlbiA9IGlzRnVsbHNjcmVlbjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlRnVsbHNjcmVlbiA9IGFzeW5jICgpID0+IHtcclxuICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdbZnVsbHNjcmVlbi10YXJnZXRdJyk7XHJcbiAgICBsZXQgaXNGdWxsc2NyZWVuO1xyXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ25vcm1hbCcpIHtcclxuICAgICAgY29uc3QgZnVsbHNjcmVlbiA9IHRhcmdldEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdmdWxsc2NyZWVuJyk7XHJcbiAgICAgIGlmICghZnVsbHNjcmVlbikgeyAvLyDov5vlhaXlhajlsY9cclxuICAgICAgICB0aGlzLmxhdW5jaE5vcm1hbEZ1bGxzY3JlZW4odGFyZ2V0RWxlbWVudCk7XHJcbiAgICAgICAgaXNGdWxsc2NyZWVuID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHsgLy8g6YCA5Ye65YWo5bGPXHJcbiAgICAgICAgdGhpcy5leGl0Tm9ybWFsRnVsbHNjcmVlbih0YXJnZXRFbGVtZW50KTtcclxuICAgICAgICBpc0Z1bGxzY3JlZW4gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jdXJyZW50VGFyZ2V0ID0gdGFyZ2V0RWxlbWVudDtcclxuICAgICAgaWYgKHRoaXMuZG9jLmZ1bGxzY3JlZW5FbGVtZW50KSB7XHJcbiAgICAgICAgaXNGdWxsc2NyZWVuID0gYXdhaXQgdGhpcy5leGl0SW1tZXJzaXZlRnVsbFNjcmVlbih0aGlzLmRvYyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaXNGdWxsc2NyZWVuID0gYXdhaXQgdGhpcy5sYXVuY2hJbW1lcnNpdmVGdWxsU2NyZWVuKHRoaXMuZG9jLmRvY3VtZW50RWxlbWVudCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlzRnVsbHNjcmVlbiA9IGlzRnVsbHNjcmVlbjtcclxuICAgIHRoaXMuZnVsbHNjcmVlbkxhdW5jaC5lbWl0KHtcclxuICAgICAgaXNGdWxsc2NyZWVuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlS2V5RG93biA9IChldmVudCkgPT4ge1xyXG4gICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEVTQ19LRVlDT0RFKSB7IC8vIOaMiUVTQ+mUrumAgOWHuuWFqOWxj1xyXG4gICAgICBpZiAodGhpcy5pc0Z1bGxzY3JlZW4pIHtcclxuICAgICAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignW2Z1bGxzY3JlZW4tdGFyZ2V0XScpO1xyXG4gICAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdub3JtYWwnKSB7XHJcbiAgICAgICAgICB0aGlzLmV4aXROb3JtYWxGdWxsc2NyZWVuKHRhcmdldEVsZW1lbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5kb2MuZnVsbHNjcmVlbkVsZW1lbnQpIHsgdGhpcy5leGl0SW1tZXJzaXZlRnVsbFNjcmVlbih0aGlzLmRvYyk7IH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mdWxsc2NyZWVuTGF1bmNoLmVtaXQoe1xyXG4gICAgICAgICAgaXNGdWxsc2NyZWVuOiBmYWxzZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuaXNGdWxsc2NyZWVuID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZnVsbHNjcmVlbmNoYW5nZScsIHRoaXMub25GdWxsU2NyZWVuQ2hhbmdlKTtcclxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleURvd24pO1xyXG4gICAgY29uc3QgYnRuTGF1bmNoID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignW2Z1bGxzY3JlZW4tbGF1bmNoXScpO1xyXG4gICAgaWYgKGJ0bkxhdW5jaCkgeyBidG5MYXVuY2gucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUZ1bGxzY3JlZW4pOyB9XHJcbiAgfVxyXG59XHJcbiJdfQ==