angular-onscreen-material-keyboard
Version:
This package is forked from ngx-material-keyboard with bug fixes and additional features
226 lines • 29.9 kB
JavaScript
import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, HostListener, Inject, LOCALE_ID, ViewChildren } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { KEYBOARD_ICONS } from '../../configs/keyboard-icons.config';
import { KeyboardClassKey } from '../../enums/keyboard-class-key.enum';
import { KeyboardModifier } from '../../enums/keyboard-modifier.enum';
import { MatKeyboardService } from '../../services/keyboard.service';
import { MatKeyboardKeyComponent } from '../keyboard-key/keyboard-key.component';
/**
* A component used to open as the default keyboard, matching material spec.
* This should only be used internally by the keyboard service.
*/
export class MatKeyboardComponent {
// inject dependencies
constructor(_locale, _keyboardService) {
this._locale = _locale;
this._keyboardService = _keyboardService;
this._darkTheme = new BehaviorSubject(false);
this._isDebug = new BehaviorSubject(false);
this._inputInstance$ = new BehaviorSubject(null);
this._modifier = KeyboardModifier.None;
this._capsLocked = false;
this._icons = KEYBOARD_ICONS;
this.cssClass = true;
this.enterClick = new EventEmitter();
this.capsClick = new EventEmitter();
this.altClick = new EventEmitter();
this.shiftClick = new EventEmitter();
}
// returns an observable of the input instance
get inputInstance() {
return this._inputInstance$.asObservable();
}
set icons(icons) {
Object.assign(this._icons, icons);
}
set darkTheme(darkTheme) {
if (this._darkTheme.getValue() !== darkTheme) {
this._darkTheme.next(darkTheme);
}
}
set isDebug(isDebug) {
if (this._isDebug.getValue() !== isDebug) {
this._isDebug.next(isDebug);
}
}
get darkTheme$() {
return this._darkTheme.asObservable();
}
get isDebug$() {
return this._isDebug.asObservable();
}
setInputInstance(inputInstance) {
this._inputInstance$.next(inputInstance);
}
attachControl(control) {
this.control = control;
}
ngOnInit() {
// set a fallback using the locale
if (!this.layout) {
this.locale = this._keyboardService.mapLocale(this._locale) ? this._locale : 'en-US';
this.layout = this._keyboardService.getLayoutForLocale(this.locale);
}
}
/**
* dismisses the keyboard
*/
dismiss() {
this.keyboardRef.dismiss();
}
/**
* checks if a given key is currently pressed
* @param key
* @param
*/
isActive(key) {
const modifiedKey = this.getModifiedKey(key);
const isActiveCapsLock = modifiedKey === KeyboardClassKey.Caps && this._capsLocked;
const isActiveModifier = modifiedKey === KeyboardModifier[this._modifier];
return isActiveCapsLock || isActiveModifier;
}
// retrieves modified key
getModifiedKey(key) {
let modifier = this._modifier;
// `CapsLock` inverts the meaning of `Shift`
if (this._capsLocked) {
modifier = this._invertShiftModifier(this._modifier);
}
return key[modifier];
}
// retrieves icon for given key
getKeyIcon(key) {
return this._icons[key[KeyboardModifier.None]];
}
/**
* listens to users keyboard inputs to simulate on virtual keyboard, too
* @param event
*/
onKeyDown(event) {
// 'activate' corresponding key
this._keys
.filter((key) => key.key === event.key)
.forEach((key) => {
key.pressed = true;
});
// simulate modifier press
if (event.key === KeyboardClassKey.Caps) {
this.onCapsClick(event.getModifierState(KeyboardClassKey.Caps));
}
if (event.key === KeyboardClassKey.Alt && this._modifier !== KeyboardModifier.Alt && this._modifier !== KeyboardModifier.ShiftAlt) {
this.onAltClick();
}
if (event.key === KeyboardClassKey.Shift && this._modifier !== KeyboardModifier.Shift && this._modifier !== KeyboardModifier.ShiftAlt) {
this.onShiftClick();
}
}
/**
* listens to users keyboard inputs to simulate on virtual keyboard, too
* @param event
*/
onKeyUp(event) {
// 'deactivate' corresponding key
this._keys
.filter((key) => key.key === event.key)
.forEach((key) => {
key.pressed = false;
});
// simulate modifier release
if (event.key === KeyboardClassKey.Alt && (this._modifier === KeyboardModifier.Alt || this._modifier === KeyboardModifier.ShiftAlt)) {
this.onAltClick();
}
if (event.key === KeyboardClassKey.Shift && (this._modifier === KeyboardModifier.Shift || this._modifier === KeyboardModifier.ShiftAlt)) {
this.onShiftClick();
}
}
/**
* bubbles event if submit is potentially triggered
*/
onEnterClick() {
// notify subscribers
this.enterClick.next();
}
/**
* simulates clicking `CapsLock` key
* @param targetState
*/
onCapsClick(targetState = !this._capsLocked) {
// not implemented
this._capsLocked = targetState;
// notify subscribers
this.capsClick.next();
}
/*
* non-modifier keys are clicked
*/
onKeyClick() {
if (this._modifier === KeyboardModifier.Shift || this._modifier === KeyboardModifier.ShiftAlt) {
this._modifier = this._invertShiftModifier(this._modifier);
}
if (this._modifier === KeyboardModifier.Alt || this._modifier === KeyboardModifier.ShiftAlt) {
this._modifier = this._invertAltModifier(this._modifier);
}
}
/**
* simulates clicking `Alt` key
*/
onAltClick() {
// invert modifier meaning
this._modifier = this._invertAltModifier(this._modifier);
// notify subscribers
this.altClick.next();
}
/**
* simulates clicking `Shift` key
*/
onShiftClick() {
// invert modifier meaning
this._modifier = this._invertShiftModifier(this._modifier);
// notify subscribers
this.shiftClick.next();
}
_invertAltModifier(modifier) {
switch (modifier) {
case KeyboardModifier.None:
return KeyboardModifier.Alt;
case KeyboardModifier.Shift:
return KeyboardModifier.ShiftAlt;
case KeyboardModifier.ShiftAlt:
return KeyboardModifier.Shift;
case KeyboardModifier.Alt:
return KeyboardModifier.None;
}
}
_invertShiftModifier(modifier) {
switch (modifier) {
case KeyboardModifier.None:
return KeyboardModifier.Shift;
case KeyboardModifier.Alt:
return KeyboardModifier.ShiftAlt;
case KeyboardModifier.ShiftAlt:
return KeyboardModifier.Alt;
case KeyboardModifier.Shift:
return KeyboardModifier.None;
}
}
}
MatKeyboardComponent.decorators = [
{ type: Component, args: [{
selector: 'mat-keyboard',
template: "<div class=\"mat-keyboard-wrapper\"\n [class.dark-theme]=\"darkTheme$ | async\"\n [class.debug]=\"isDebug$ | async\"\n>\n <nav class=\"mat-keyboard-layout\">\n <div class=\"mat-keyboard-row\"\n *ngFor=\"let row of layout.keys\"\n >\n <ng-container *ngFor=\"let key of row\">\n <mat-keyboard-key class=\"mat-keyboard-col\"\n *ngIf=\"getModifiedKey(key)\"\n [key]=\"getModifiedKey(key)\"\n [icon]=\"getKeyIcon(key)\"\n [active]=\"isActive(key)\"\n [input]=\"inputInstance | async\"\n [control]=\"control\"\n (enterClick)=\"onEnterClick()\"\n (capsClick)=\"onCapsClick()\"\n (altClick)=\"onAltClick()\"\n (shiftClick)=\"onShiftClick()\"\n (keyClick)=\"onKeyClick()\"\n ></mat-keyboard-key>\n </ng-container>\n </div>\n </nav>\n</div>\n",
changeDetection: ChangeDetectionStrategy.OnPush,
preserveWhitespaces: false,
styles: [".mat-keyboard-wrapper{background-color:#f5f5f5;border-radius:2px;display:flex;font-family:Roboto,Helvetica Neue,sans-serif;font-size:14px;justify-content:space-between;line-height:20px;padding:14px 24px}.mat-keyboard-wrapper.dark-theme{background-color:#424242}.mat-keyboard-action{background:none;color:inherit;flex-shrink:0;font-family:inherit;font-size:inherit;font-weight:600;line-height:1;margin-left:8px;text-transform:uppercase}:host(.dark-theme) .mat-keyboard-action{color:#f5f5f5}.mat-keyboard-layout{width:100%}.mat-keyboard-row{align-items:stretch;display:flex;flex-direction:row;flex-wrap:nowrap}.mat-keyboard-col{box-sizing:border-box;flex:1 1 auto;padding:4px}.mat-keyboard-key{min-width:0;width:100%}:host(.dark-theme) .mat-keyboard-key{background-color:#616161;color:#f5f5f5}:host(.debug) .mat-keyboard-key-deadkey{background-color:#5f9ea0}:host(.debug) .mat-keyboard-key-modifier{background-color:#7fffd4}:host(.debug.dark-theme) .mat-keyboard-key-deadkey{background-color:#639}:host(.debug.dark-theme) .mat-keyboard-key-modifier{background-color:#9370db}"]
},] }
];
MatKeyboardComponent.ctorParameters = () => [
{ type: String, decorators: [{ type: Inject, args: [LOCALE_ID,] }] },
{ type: MatKeyboardService }
];
MatKeyboardComponent.propDecorators = {
_keys: [{ type: ViewChildren, args: [MatKeyboardKeyComponent,] }],
cssClass: [{ type: HostBinding, args: ['class.mat-keyboard',] }],
onKeyDown: [{ type: HostListener, args: ['document:keydown', ['$event'],] }],
onKeyUp: [{ type: HostListener, args: ['document:keyup', ['$event'],] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Ym9hcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvcmUvc3JjL2NvbXBvbmVudHMva2V5Ym9hcmQva2V5Ym9hcmQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBcUIsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTVLLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFFbkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBR3RFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRWpGOzs7R0FHRztBQVFILE1BQU0sT0FBTyxvQkFBb0I7SUFtRS9CLHNCQUFzQjtJQUN0QixZQUF1QyxPQUFlLEVBQ2xDLGdCQUFvQztRQURqQixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2xDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBb0I7UUFuRWhELGVBQVUsR0FBNkIsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbEUsYUFBUSxHQUE2QixJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVoRSxvQkFBZSxHQUF1QyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUtoRixjQUFTLEdBQXFCLGdCQUFnQixDQUFDLElBQUksQ0FBQztRQUVwRCxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUVwQixXQUFN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WUFFbkMsS0FBSyxnQkFBZ0IsQ0FBQyxRQUFRO2dCQUM1QixPQUFPLGdCQUFnQixDQUFDLEtBQUssQ0FBQztZQUVoQyxLQUFLLGdCQUFnQixDQUFDLEdBQUc7Z0JBQ3ZCLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFDO1NBQ2hDO0lBQ0gsQ0FBQztJQUVPLG9CQUFvQixDQUFDLFFBQTBCO1FBQ3JELFFBQVEsUUFBUSxFQUFFO1lBQ2hCLEtBQUssZ0JBQWdCLENBQUMsSUFBSTtnQkFDeEIsT0FBTyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7WUFFaEMsS0FBSyxnQkFBZ0IsQ0FBQyxHQUFHO2dCQUN2QixPQUFPLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztZQUVuQyxLQUFLLGdCQUFnQixDQUFDLFFBQVE7Z0JBQzVCLE9BQU8sZ0JBQWdCLENBQUMsR0FBRyxDQUFDO1lBRTlCLEtBQUssZ0JBQWdCLENBQUMsS0FBSztnQkFDekIsT0FBTyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7U0FDaEM7SUFDSCxDQUFDOzs7WUF0UUYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxjQUFjO2dCQUN4Qiw4aUNBQXdDO2dCQUV4QyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtnQkFDL0MsbUJBQW1CLEVBQUUsS0FBSzs7YUFDM0I7Ozt5Q0FxRWMsTUFBTSxTQUFDLFNBQVM7WUFsRnRCLGtCQUFrQjs7O29CQXNCeEIsWUFBWSxTQUFDLHVCQUF1Qjt1QkFtQnBDLFdBQVcsU0FBQyxvQkFBb0I7d0JBb0doQyxZQUFZLFNBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUM7c0JBeUIzQyxZQUFZLFNBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIsIEluamVjdCwgTE9DQUxFX0lELCBPbkluaXQsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkcmVuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1hdEtleWJvYXJkUmVmIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9rZXlib2FyZC1yZWYuY2xhc3MnO1xuaW1wb3J0IHsgS0VZQk9BUkRfSUNPTlMgfSBmcm9tICcuLi8uLi9jb25maWdzL2tleWJvYXJkLWljb25zLmNvbmZpZyc7XG5pbXBvcnQgeyBLZXlib2FyZENsYXNzS2V5IH0gZnJvbSAnLi4vLi4vZW51bXMva2V5Ym9hcmQtY2xhc3Mta2V5LmVudW0nO1xuaW1wb3J0IHsgS2V5Ym9hcmRNb2RpZmllciB9IGZyb20gJy4uLy4uL2VudW1zL2tleWJvYXJkLW1vZGlmaWVyLmVudW0nO1xuaW1wb3J0IHsgSUtleWJvYXJkSWNvbnMsIElNYXRJY29uIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9rZXlib2FyZC1pY29ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUtleWJvYXJkTGF5b3V0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9rZXlib2FyZC1sYXlvdXQuaW50ZXJmYWNlJztcbmltcG9ydCB7IE1hdEtleWJvYXJkU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2tleWJvYXJkLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWF0S2V5Ym9hcmRLZXlDb21wb25lbnQgfSBmcm9tICcuLi9rZXlib2FyZC1rZXkva2V5Ym9hcmQta2V5LmNvbXBvbmVudCc7XG5cbi8qKlxuICogQSBjb21wb25lbnQgdXNlZCB0byBvcGVuIGFzIHRoZSBkZWZhdWx0IGtleWJvYXJkLCBtYXRjaGluZyBtYXRlcmlhbCBzcGVjLlxuICogVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGludGVybmFsbHkgYnkgdGhlIGtleWJvYXJkIHNlcnZpY2UuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21hdC1rZXlib2FyZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9rZXlib2FyZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2tleWJvYXJkLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZVxufSlcbmV4cG9ydCBjbGFzcyBNYXRLZXlib2FyZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgcHJpdmF0ZSBfZGFya1RoZW1lOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblxuICBwcml2YXRlIF9pc0RlYnVnOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblxuICBwcml2YXRlIF9pbnB1dEluc3RhbmNlJDogQmVoYXZpb3JTdWJqZWN0PEVsZW1lbnRSZWYgfCBudWxsPiA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XG5cbiAgQFZpZXdDaGlsZHJlbihNYXRLZXlib2FyZEtleUNvbXBvbmVudClcbiAgcHJpdmF0ZSBfa2V5czogUXVlcnlMaXN0PE1hdEtleWJvYXJkS2V5Q29tcG9uZW50PjtcblxuICBwcml2YXRlIF9tb2RpZmllcjogS2V5Ym9hcmRNb2RpZmllciA9IEtleWJvYXJkTW9kaWZpZXIuTm9uZTtcblxuICBwcml2YXRlIF9jYXBzTG9ja2VkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfaWNvbnM6IElLZXlib2FyZEljb25zID0gS0VZQk9BUkRfSUNPTlM7XG5cbiAgLy8gdGhlIHNlcnZpY2UgcHJvdmlkZXMgYSBsb2NhbGUgb3IgbGF5b3V0IG9wdGlvbmFsbHlcbiAgbG9jYWxlPzogc3RyaW5nO1xuXG4gIGxheW91dDogSUtleWJvYXJkTGF5b3V0O1xuXG4gIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbDtcblxuICAvLyB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNvbXBvbmVudCBtYWtpbmcgdXAgdGhlIGNvbnRlbnQgb2YgdGhlIGtleWJvYXJkXG4gIGtleWJvYXJkUmVmOiBNYXRLZXlib2FyZFJlZjxNYXRLZXlib2FyZENvbXBvbmVudD47XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5tYXQta2V5Ym9hcmQnKVxuICBjc3NDbGFzcyA9IHRydWU7XG5cbiAgZW50ZXJDbGljazogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIGNhcHNDbGljazogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIGFsdENsaWNrOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgc2hpZnRDbGljazogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8vIHJldHVybnMgYW4gb2JzZXJ2YWJsZSBvZiB0aGUgaW5wdXQgaW5zdGFuY2VcbiAgZ2V0IGlucHV0SW5zdGFuY2UoKTogT2JzZXJ2YWJsZTxFbGVtZW50UmVmIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLl9pbnB1dEluc3RhbmNlJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHNldCBpY29ucyhpY29uczogSUtleWJvYXJkSWNvbnMpIHtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuX2ljb25zLCBpY29ucyk7XG4gIH1cblxuICBzZXQgZGFya1RoZW1lKGRhcmtUaGVtZTogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLl9kYXJrVGhlbWUuZ2V0VmFsdWUoKSAhPT0gZGFya1RoZW1lKSB7XG4gICAgICB0aGlzLl9kYXJrVGhlbWUubmV4dChkYXJrVGhlbWUpO1xuICAgIH1cbiAgfVxuXG4gIHNldCBpc0RlYnVnKGlzRGVidWc6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5faXNEZWJ1Zy5nZXRWYWx1ZSgpICE9PSBpc0RlYnVnKSB7XG4gICAgICB0aGlzLl9pc0RlYnVnLm5leHQoaXNEZWJ1Zyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGRhcmtUaGVtZSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhcmtUaGVtZS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldCBpc0RlYnVnJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5faXNEZWJ1Zy5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8vIGluamVjdCBkZXBlbmRlbmNpZXNcbiAgY29uc3RydWN0b3IoQEluamVjdChMT0NBTEVfSUQpIHByaXZhdGUgX2xvY2FsZTogc3RyaW5nLFxuICAgICAgICAgICAgICBwcml2YXRlIF9rZXlib2FyZFNlcnZpY2U6IE1hdEtleWJvYXJkU2VydmljZSkgeyB9XG5cbiAgc2V0SW5wdXRJbnN0YW5jZShpbnB1dEluc3RhbmNlOiBFbGVtZW50UmVmKSB7XG4gICAgdGhpcy5faW5wdXRJbnN0YW5jZSQubmV4dChpbnB1dEluc3RhbmNlKTtcbiAgfVxuXG4gIGF0dGFjaENvbnRyb2woY29udHJvbDogQWJzdHJhY3RDb250cm9sKSB7XG4gICAgdGhpcy5jb250cm9sID0gY29udHJvbDtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIHNldCBhIGZhbGxiYWNrIHVzaW5nIHRoZSBsb2NhbGVcbiAgICBpZiAoIXRoaXMubGF5b3V0KSB7XG4gICAgICB0aGlzLmxvY2FsZSA9IHRoaXMuX2tleWJvYXJkU2VydmljZS5tYXBMb2NhbGUodGhpcy5fbG9jYWxlKSA/IHRoaXMuX2xvY2FsZSA6ICdlbi1VUyc7XG4gICAgICB0aGlzLmxheW91dCA9IHRoaXMuX2tleWJvYXJkU2VydmljZS5nZXRMYXlvdXRGb3JMb2NhbGUodGhpcy5sb2NhbGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBkaXNtaXNzZXMgdGhlIGtleWJvYXJkXG4gICAqL1xuICBkaXNtaXNzKCkge1xuICAgIHRoaXMua2V5Ym9hcmRSZWYuZGlzbWlzcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIGNoZWNrcyBpZiBhIGdpdmVuIGtleSBpcyBjdXJyZW50bHkgcHJlc3NlZFxuICAgKiBAcGFyYW0ga2V5XG4gICAqIEBwYXJhbVxuICAgKi9cbiAgaXNBY3RpdmUoa2V5OiAoc3RyaW5nIHwgS2V5Ym9hcmRDbGFzc0tleSlbXSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG1vZGlmaWVkS2V5OiBzdHJpbmcgPSB0aGlzLmdldE1vZGlmaWVkS2V5KGtleSk7XG4gICAgY29uc3QgaXNBY3RpdmVDYXBzTG9jazogYm9vbGVhbiA9IG1vZGlmaWVkS2V5ID09PSBLZXlib2FyZENsYXNzS2V5LkNhcHMgJiYgdGhpcy5fY2Fwc0xvY2tlZDtcbiAgICBjb25zdCBpc0FjdGl2ZU1vZGlmaWVyOiBib29sZWFuID0gbW9kaWZpZWRLZXkgPT09IEtleWJvYXJkTW9kaWZpZXJbdGhpcy5fbW9kaWZpZXJdO1xuICAgIHJldHVybiBpc0FjdGl2ZUNhcHNMb2NrIHx8IGlzQWN0aXZlTW9kaWZpZXI7XG4gIH1cblxuICAvLyByZXRyaWV2ZXMgbW9kaWZpZWQga2V5XG4gIGdldE1vZGlmaWVkS2V5KGtleTogKHN0cmluZyB8IEtleWJvYXJkQ2xhc3NLZXkpW10pOiBzdHJpbmcge1xuICAgIGxldCBtb2RpZmllcjogS2V5Ym9hcmRNb2RpZmllciA9IHRoaXMuX21vZGlmaWVyO1xuXG4gICAgLy8gYENhcHNMb2NrYCBpbnZlcnRzIHRoZSBtZWFuaW5nIG9mIGBTaGlmdGBcbiAgICBpZiAodGhpcy5fY2Fwc0xvY2tlZCkge1xuICAgICAgbW9kaWZpZXIgPSB0aGlzLl9pbnZlcnRTaGlmdE1vZGlmaWVyKHRoaXMuX21vZGlmaWVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4ga2V5W21vZGlmaWVyXTtcbiAgfVxuXG4gIC8vIHJldHJpZXZlcyBpY29uIGZvciBnaXZlbiBrZXlcbiAgZ2V0S2V5SWNvbihrZXk6IChzdHJpbmcgfCBLZXlib2FyZENsYXNzS2V5KVtdKTogSU1hdEljb24ge1xuICAgIHJldHVybiB0aGlzLl9pY29uc1trZXlbS2V5Ym9hcmRNb2RpZmllci5Ob25lXV07XG4gIH1cblxuICAvKipcbiAgICogbGlzdGVucyB0byB1c2VycyBrZXlib2FyZCBpbnB1dHMgdG8gc2ltdWxhdGUgb24gdmlydHVhbCBrZXlib2FyZCwgdG9vXG4gICAqIEBwYXJhbSBldmVudFxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIC8vICdhY3RpdmF0ZScgY29ycmVzcG9uZGluZyBrZXlcbiAgICB0aGlzLl9rZXlzXG4gICAgICAuZmlsdGVyKChrZXk6IE1hdEtleWJvYXJkS2V5Q29tcG9uZW50KSA9PiBrZXkua2V5ID09PSBldmVudC5rZXkpXG4gICAgICAuZm9yRWFjaCgoa2V5OiBNYXRLZXlib2FyZEtleUNvbXBvbmVudCkgPT4ge1xuICAgICAgICBrZXkucHJlc3NlZCA9IHRydWU7XG4gICAgICB9KTtcblxuICAgIC8vIHNpbXVsYXRlIG1vZGlmaWVyIHByZXNzXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gS2V5Ym9hcmRDbGFzc0tleS5DYXBzKSB7XG4gICAgICB0aGlzLm9uQ2Fwc0NsaWNrKGV2ZW50LmdldE1vZGlmaWVyU3RhdGUoS2V5Ym9hcmRDbGFzc0tleS5DYXBzKSk7XG4gICAgfVxuICAgIGlmIChldmVudC5rZXkgPT09IEtleWJvYXJkQ2xhc3NLZXkuQWx0ICYmIHRoaXMuX21vZGlmaWVyICE9PSBLZXlib2FyZE1vZGlmaWVyLkFsdCAmJiB0aGlzLl9tb2RpZmllciAhPT0gS2V5Ym9hcmRNb2RpZmllci5TaGlmdEFsdCkge1xuICAgICAgdGhpcy5vbkFsdENsaWNrKCk7XG4gICAgfVxuICAgIGlmIChldmVudC5rZXkgPT09IEtleWJvYXJkQ2xhc3NLZXkuU2hpZnQgJiYgdGhpcy5fbW9kaWZpZXIgIT09IEtleWJvYXJkTW9kaWZpZXIuU2hpZnQgJiYgdGhpcy5fbW9kaWZpZXIgIT09IEtleWJvYXJkTW9kaWZpZXIuU2hpZnRBbHQpIHtcbiAgICAgIHRoaXMub25TaGlmdENsaWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGxpc3RlbnMgdG8gdXNlcnMga2V5Ym9hcmQgaW5wdXRzIHRvIHNpbXVsYXRlIG9uIHZpcnR1YWwga2V5Ym9hcmQsIHRvb1xuICAgKiBAcGFyYW0gZXZlbnRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleXVwJywgWyckZXZlbnQnXSlcbiAgb25LZXlVcChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIC8vICdkZWFjdGl2YXRlJyBjb3JyZXNwb25kaW5nIGtleVxuICAgIHRoaXMuX2tleXNcbiAgICAgIC5maWx0ZXIoKGtleTogTWF0S2V5Ym9hcmRLZXlDb21wb25lbnQpID0+IGtleS5rZXkgPT09IGV2ZW50LmtleSlcbiAgICAgIC5mb3JFYWNoKChrZXk6IE1hdEtleWJvYXJkS2V5Q29tcG9uZW50KSA9PiB7XG4gICAgICAgIGtleS5wcmVzc2VkID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgIC8vIHNpbXVsYXRlIG1vZGlmaWVyIHJlbGVhc2VcbiAgICBpZiAoZXZlbnQua2V5ID09PSBLZXlib2FyZENsYXNzS2V5LkFsdCAmJiAodGhpcy5fbW9kaWZpZXIgPT09IEtleWJvYXJkTW9kaWZpZXIuQWx0IHx8IHRoaXMuX21vZGlmaWVyID09PSBLZXlib2FyZE1vZGlmaWVyLlNoaWZ0QWx0KSkge1xuICAgICAgdGhpcy5vbkFsdENsaWNrKCk7XG4gICAgfVxuICAgIGlmIChldmVudC5rZXkgPT09IEtleWJvYXJkQ2xhc3NLZXkuU2hpZnQgJiYgKHRoaXMuX21vZGlmaWVyID09PSBLZXlib2FyZE1vZGlmaWVyLlNoaWZ0IHx8IHRoaXMuX21vZGlmaWVyID09PSBLZXlib2FyZE1vZGlmaWVyLlNoaWZ0QWx0KSkge1xuICAgICAgdGhpcy5vblNoaWZ0Q2xpY2soKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYnViYmxlcyBldmVudCBpZiBzdWJtaXQgaXMgcG90ZW50aWFsbHkgdHJpZ2dlcmVkXG4gICAqL1xuICBvbkVudGVyQ2xpY2soKSB7XG4gICAgLy8gbm90aWZ5IHN1YnNjcmliZXJzXG4gICAgdGhpcy5lbnRlckNsaWNrLm5leHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzaW11bGF0ZXMgY2xpY2tpbmcgYENhcHNMb2NrYCBrZXlcbiAgICogQHBhcmFtIHRhcmdldFN0YXRlXG4gICAqL1xuICBvbkNhcHNDbGljayh0YXJnZXRTdGF0ZSA9ICF0aGlzLl9jYXBzTG9ja2VkKSB7XG4gICAgLy8gbm90IGltcGxlbWVudGVkXG4gICAgdGhpcy5fY2Fwc0xvY2tlZCA9IHRhcmdldFN0YXRlO1xuXG4gICAgLy8gbm90aWZ5IHN1YnNjcmliZXJzXG4gICAgdGhpcy5jYXBzQ2xpY2submV4dCgpO1xuICB9XG5cbiAgLypcbiAgICogbm9uLW1vZGlmaWVyIGtleXMgYXJlIGNsaWNrZWRcbiAgICovXG4gIG9uS2V5Q2xpY2soKSB7XG4gICAgaWYgKHRoaXMuX21vZGlmaWVyID09PSBLZXlib2FyZE1vZGlmaWVyLlNoaWZ0IHx8IHRoaXMuX21vZGlmaWVyID09PSBLZXlib2FyZE1vZGlmaWVyLlNoaWZ0QWx0KSB7XG4gICAgICB0aGlzLl9tb2RpZmllciA9IHRoaXMuX2ludmVydFNoaWZ0TW9kaWZpZXIodGhpcy5fbW9kaWZpZXIpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9tb2RpZmllciA9PT0gS2V5Ym9hcmRNb2RpZmllci5BbHQgfHwgdGhpcy5fbW9kaWZpZXIgPT09IEtleWJvYXJkTW9kaWZpZXIuU2hpZnRBbHQpIHtcbiAgICAgIHRoaXMuX21vZGlmaWVyID0gdGhpcy5faW52ZXJ0QWx0TW9kaWZpZXIodGhpcy5fbW9kaWZpZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBzaW11bGF0ZXMgY2xpY2tpbmcgYEFsdGAga2V5XG4gICAqL1xuICBvbkFsdENsaWNrKCkge1xuICAgIC8vIGludmVydCBtb2RpZmllciBtZWFuaW5nXG4gICAgdGhpcy5fbW9kaWZpZXIgPSB0aGlzLl9pbnZlcnRBbHRNb2RpZmllcih0aGlzLl9tb2RpZmllcik7XG5cbiAgICAvLyBub3RpZnkgc3Vic2NyaWJlcnNcbiAgICB0aGlzLmFsdENsaWNrLm5leHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzaW11bGF0ZXMgY2xpY2tpbmcgYFNoaWZ0YCBrZXlcbiAgICovXG4gIG9uU2hpZnRDbGljaygpIHtcbiAgICAvLyBpbnZlcnQgbW9kaWZpZXIgbWVhbmluZ1xuICAgIHRoaXMuX21vZGlmaWVyID0gdGhpcy5faW52ZXJ0U2hpZnRNb2RpZmllcih0aGlzLl9tb2RpZmllcik7XG5cbiAgICAvLyBub3RpZnkgc3Vic2NyaWJlcnNcbiAgICB0aGlzLnNoaWZ0Q2xpY2submV4dCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW52ZXJ0QWx0TW9kaWZpZXIobW9kaWZpZXI6IEtleWJvYXJkTW9kaWZpZXIpOiBLZXlib2FyZE1vZGlmaWVyIHtcbiAgICBzd2l0Y2ggKG1vZGlmaWVyKSB7XG4gICAgICBjYXNlIEtleWJvYXJkTW9kaWZpZXIuTm9uZTpcbiAgICAgICAgcmV0dXJuIEtleWJvYXJkTW9kaWZpZXIuQWx0O1xuXG4gICAgICBjYXNlIEtleWJvYXJkTW9kaWZpZXIuU2hpZnQ6XG4gICAgICAgIHJldHVybiBLZXlib2FyZE1vZGlmaWVyLlNoaWZ0QWx0O1xuXG4gICAgICBjYXNlIEtleWJvYXJkTW9kaWZpZXIuU2hpZnRBbHQ6XG4gICAgICAgIHJldHVybiBLZXlib2FyZE1vZGlmaWVyLlNoaWZ0O1xuXG4gICAgICBjYXNlIEtleWJvYXJkTW9kaWZpZXIuQWx0OlxuICAgICAgICByZXR1cm4gS2V5Ym9hcmRNb2RpZmllci5Ob25lO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2ludmVydFNoaWZ0TW9kaWZpZXIobW9kaWZpZXI6IEtleWJvYXJkTW9kaWZpZXIpOiBLZXlib2FyZE1vZGlmaWVyIHtcbiAgICBzd2l0Y2ggKG1vZGlmaWVyKSB7XG4gICAgICBjYXNlIEtleWJvYXJkTW9kaWZpZXIuTm9uZTpcbiAgICAgICAgcmV0dXJuIEtleWJvYXJkTW9kaWZpZXIuU2hpZnQ7XG5cbiAgICAgIGNhc2UgS2V5Ym9hcmRNb2RpZmllci5BbHQ6XG4gICAgICAgIHJldHVybiBLZXlib2FyZE1vZGlmaWVyLlNoaWZ0QWx0O1xuXG4gICAgICBjYXNlIEtleWJvYXJkTW9kaWZpZXIuU2hpZnRBbHQ6XG4gICAgICAgIHJldHVybiBLZXlib2FyZE1vZGlmaWVyLkFsdDtcblxuICAgICAgY2FzZSBLZXlib2FyZE1vZGlmaWVyLlNoaWZ0OlxuICAgICAgICByZXR1cm4gS2V5Ym9hcmRNb2RpZmllci5Ob25lO1xuICAgIH1cbiAgfVxuXG59XG4iXX0=