@tekdi/sunbird-quml-player
Version:
The QuML player library components are powered by Angular. This player is primarily designed to be used on Sunbird consumption platforms (mobile app, web portal, offline desktop app) to drive reusability and maintainability, hence reducing the redundant d
66 lines • 22.7 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { fromEvent } from 'rxjs';
import { eventName, pageId, TelemetryType } from '../telemetry-constants';
import * as i0 from "@angular/core";
import * as i1 from "../services/viewer-service/viewer-service";
import * as i2 from "@angular/common";
export class ScoreboardComponent {
constructor(viewerService) {
this.viewerService = viewerService;
this.submitClicked = new EventEmitter();
this.emitQuestionNo = new EventEmitter();
this.scoreBoardLoaded = new EventEmitter();
}
ngOnInit() {
this.scoreBoardLoaded.emit({
scoreBoardLoaded: true
});
this.subscription = fromEvent(document, 'keydown').subscribe((e) => {
/* istanbul ignore else */
if (e['key'] === 'Enter') {
e.stopPropagation();
document.activeElement.click();
}
});
}
goToQuestion(index, identifier) {
this.emitQuestionNo.emit({ questionNo: index, identifier });
}
onReviewClicked() {
if (this.isSections) {
this.goToQuestion(1, this.scores[0].identifier);
}
else {
this.goToQuestion(1);
}
this.viewerService.raiseHeartBeatEvent(eventName.scoreBoardReviewClicked, TelemetryType.interact, pageId.submitPage);
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ScoreboardComponent, deps: [{ token: i1.ViewerService }], target: i0.ɵɵFactoryTarget.Component }); }
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ScoreboardComponent, selector: "quml-scoreboard", inputs: { scores: "scores", totalNoOfQuestions: "totalNoOfQuestions", contentName: "contentName", showFeedBack: "showFeedBack", isSections: "isSections", summary: "summary" }, outputs: { submitClicked: "submitClicked", emitQuestionNo: "emitQuestionNo", scoreBoardLoaded: "scoreBoardLoaded" }, ngImport: i0, template: "<div class=\"scoreboard\">\n <div class=\"scoreboard__header\">\n <div class=\"scoreboard__title\">\n Are you ready to submit?\n </div>\n <div class=\"scoreboard__subtitle\">\n {{contentName}}\n </div>\n </div>\n\n <div class=\"sections-score-card\">\n <div class=\"sections-score-count-info\">\n <div class=\"mb-15\">Total Questions: {{totalNoOfQuestions}}</div>\n <div class=\"mb-15\">Questions Answered: {{summary?.correct + summary?.wrong}}</div>\n <div class=\"mb-15\">Questions Skipped: {{summary?.skipped}}</div>\n <div class=\"mb-15\">Questions not Viewed: {{totalNoOfQuestions - (summary?.correct + summary?.wrong + summary?.skipped)}}</div>\n </div>\n\n <div class=\"sections-score-count-sections\">\n <div class=\"scoreboard__points\" *ngIf=\"!isSections\">\n <div *ngFor=\"let score of scores; let i = index\" class=\"scoreboard__index\" (click)=\"goToQuestion(i+1)\"\n tabindex=\"0\" attr.aria-label=\"question number {{score.index}}\"\n [ngClass]=\"showFeedBack ? score.class : (score.class === 'skipped' ? score.class : (score.class === 'unattempted' ? score.class : 'attempted'))\">\n {{score.index}}\n </div>\n </div>\n\n <div *ngIf=\"isSections\">\n <div *ngFor=\"let section of scores\" class=\"sections-score-counts\">\n <div class=\"sections-score-card__title\">Section {{section?.index}}</div>\n <div class=\"sections-score-card__points\">\n <div *ngFor=\"let score of section?.children; let i = index\" class=\"scoreboard__index\" tabindex=\"0\"\n attr.aria-label=\"question number {{score.index}}\" (click)=\"goToQuestion(i+1, section.identifier)\"\n [ngClass]=\"score.showFeedback ? score.class : (score.class === 'skipped' ? score.class : (score.class === 'unattempted' ? score.class : 'attempted'))\">\n {{score.index}}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"scoreboard__btn-container\">\n <button type=\"submit\" class=\"sb-btn sb-btn-outline-primary sb-btn-normal sb-btn-radius px-20 mx-8\"\n (click)=\"onReviewClicked()\">Review</button>\n <button type=\"submit\" class=\"sb-btn sb-btn-primary sb-btn-normal sb-btn-radius px-20 mx-8\"\n (click)=\"submitClicked.emit({type:'submit-clicked'})\">Submit</button>\n </div>\n</div>", styles: ["::ng-deep :root{--quml-scoreboard-sub-title: #6d7278;--quml-scoreboard-skipped: #969696;--quml-scoreboard-unattempted: #575757;--quml-color-success: #08bc82;--quml-color-danger: #f1635d;--quml-color-primary-contrast: #333}.scoreboard{display:flex;flex-direction:column;align-items:center;width:100%;height:100%;padding:3.5rem 2.5rem 0}@media (max-width: 767px){.scoreboard{top:0;height:calc(100% + -0px)}}.scoreboard__header{font-weight:700;text-align:center;line-height:normal;height:5rem}.scoreboard__title{color:var(--primary-color);font-size:1.25rem}.scoreboard__subtitle{color:var(--quml-scoreboard-sub-title);font-size:.875rem;margin-top:.5rem}.scoreboard__points{display:flex;flex-wrap:wrap;margin:0 auto;width:100%;max-height:calc(100vh - 12rem);align-items:center;overflow-y:auto;justify-content:center}.scoreboard__btn-container{display:flex;height:5rem;align-items:center}.scoreboard__index{font-size:.625rem;font-weight:500;border-radius:50%;width:1.5rem;height:1.5rem;display:flex;align-items:center;justify-content:center;margin:0rem 1rem 1rem;cursor:pointer}.scoreboard__index.skipped{color:var(--white);background:var(--quml-scoreboard-skipped);border:.0625rem solid var(--quml-scoreboard-skipped)}.scoreboard__index.partial,.scoreboard__index.wrong,.scoreboard__index.correct{color:var(--white);border:0px solid transparent}.scoreboard__index.correct{--correct-bg: var(--quml-color-success);background:var(--correct-bg)}.scoreboard__index.wrong{--wrong-bg: var(--quml-color-danger);background:var(--wrong-bg)}.scoreboard__index.partial{--partial-bg: linear-gradient( 180deg, rgba(71, 164, 128, 1) 0%, rgba(71, 164, 128, 1) 50%, rgba(249, 122, 116, 1) 50%, rgba(249, 122, 116, 1) 100% );background:var(--partial-bg)}.scoreboard__index.unattempted{color:var(--quml-scoreboard-unattempted);border:.03125rem solid var(--quml-scoreboard-unattempted)}.scoreboard__index.unattempted:hover{border:.0625rem solid var(--primary-color);color:var(--primary-color)}.scoreboard__index.attempted{color:var(--white)!important;background:var(--primary-color);border:.03125rem solid var(--primary-color)}@media screen and (orientation: landscape){.scoreboard .scoreboard__header{display:block;width:100%;text-align:left}}.sections-score-card{width:100%;height:calc(100% - 10rem);overflow-y:auto;display:flex}.sections-score-card__title{width:100%;color:var(--quml-color-primary-contrast);font-size:.875rem;font-weight:700;text-align:center;margin-bottom:1rem}.sections-score-card__points{display:flex;flex-wrap:wrap;margin:.5rem auto 0;width:100%;max-height:100%;align-items:center;overflow-y:auto;justify-content:center}@media screen and (orientation: portrait){.sections-score-card{flex-direction:column;text-align:center}}.sections-score-card .sections-score-count-info{width:100%;display:block;border-right:0;padding-bottom:1.5rem;position:sticky;top:0;background:#fff}@media screen and (orientation: landscape){.sections-score-card .sections-score-count-info{width:40%;border-right:1px solid #979797}}@media screen and (orientation: landscape){.sections-score-card .sections-score-count-sections{width:60%}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ScoreboardComponent, decorators: [{
type: Component,
args: [{ selector: 'quml-scoreboard', template: "<div class=\"scoreboard\">\n <div class=\"scoreboard__header\">\n <div class=\"scoreboard__title\">\n Are you ready to submit?\n </div>\n <div class=\"scoreboard__subtitle\">\n {{contentName}}\n </div>\n </div>\n\n <div class=\"sections-score-card\">\n <div class=\"sections-score-count-info\">\n <div class=\"mb-15\">Total Questions: {{totalNoOfQuestions}}</div>\n <div class=\"mb-15\">Questions Answered: {{summary?.correct + summary?.wrong}}</div>\n <div class=\"mb-15\">Questions Skipped: {{summary?.skipped}}</div>\n <div class=\"mb-15\">Questions not Viewed: {{totalNoOfQuestions - (summary?.correct + summary?.wrong + summary?.skipped)}}</div>\n </div>\n\n <div class=\"sections-score-count-sections\">\n <div class=\"scoreboard__points\" *ngIf=\"!isSections\">\n <div *ngFor=\"let score of scores; let i = index\" class=\"scoreboard__index\" (click)=\"goToQuestion(i+1)\"\n tabindex=\"0\" attr.aria-label=\"question number {{score.index}}\"\n [ngClass]=\"showFeedBack ? score.class : (score.class === 'skipped' ? score.class : (score.class === 'unattempted' ? score.class : 'attempted'))\">\n {{score.index}}\n </div>\n </div>\n\n <div *ngIf=\"isSections\">\n <div *ngFor=\"let section of scores\" class=\"sections-score-counts\">\n <div class=\"sections-score-card__title\">Section {{section?.index}}</div>\n <div class=\"sections-score-card__points\">\n <div *ngFor=\"let score of section?.children; let i = index\" class=\"scoreboard__index\" tabindex=\"0\"\n attr.aria-label=\"question number {{score.index}}\" (click)=\"goToQuestion(i+1, section.identifier)\"\n [ngClass]=\"score.showFeedback ? score.class : (score.class === 'skipped' ? score.class : (score.class === 'unattempted' ? score.class : 'attempted'))\">\n {{score.index}}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"scoreboard__btn-container\">\n <button type=\"submit\" class=\"sb-btn sb-btn-outline-primary sb-btn-normal sb-btn-radius px-20 mx-8\"\n (click)=\"onReviewClicked()\">Review</button>\n <button type=\"submit\" class=\"sb-btn sb-btn-primary sb-btn-normal sb-btn-radius px-20 mx-8\"\n (click)=\"submitClicked.emit({type:'submit-clicked'})\">Submit</button>\n </div>\n</div>", styles: ["::ng-deep :root{--quml-scoreboard-sub-title: #6d7278;--quml-scoreboard-skipped: #969696;--quml-scoreboard-unattempted: #575757;--quml-color-success: #08bc82;--quml-color-danger: #f1635d;--quml-color-primary-contrast: #333}.scoreboard{display:flex;flex-direction:column;align-items:center;width:100%;height:100%;padding:3.5rem 2.5rem 0}@media (max-width: 767px){.scoreboard{top:0;height:calc(100% + -0px)}}.scoreboard__header{font-weight:700;text-align:center;line-height:normal;height:5rem}.scoreboard__title{color:var(--primary-color);font-size:1.25rem}.scoreboard__subtitle{color:var(--quml-scoreboard-sub-title);font-size:.875rem;margin-top:.5rem}.scoreboard__points{display:flex;flex-wrap:wrap;margin:0 auto;width:100%;max-height:calc(100vh - 12rem);align-items:center;overflow-y:auto;justify-content:center}.scoreboard__btn-container{display:flex;height:5rem;align-items:center}.scoreboard__index{font-size:.625rem;font-weight:500;border-radius:50%;width:1.5rem;height:1.5rem;display:flex;align-items:center;justify-content:center;margin:0rem 1rem 1rem;cursor:pointer}.scoreboard__index.skipped{color:var(--white);background:var(--quml-scoreboard-skipped);border:.0625rem solid var(--quml-scoreboard-skipped)}.scoreboard__index.partial,.scoreboard__index.wrong,.scoreboard__index.correct{color:var(--white);border:0px solid transparent}.scoreboard__index.correct{--correct-bg: var(--quml-color-success);background:var(--correct-bg)}.scoreboard__index.wrong{--wrong-bg: var(--quml-color-danger);background:var(--wrong-bg)}.scoreboard__index.partial{--partial-bg: linear-gradient( 180deg, rgba(71, 164, 128, 1) 0%, rgba(71, 164, 128, 1) 50%, rgba(249, 122, 116, 1) 50%, rgba(249, 122, 116, 1) 100% );background:var(--partial-bg)}.scoreboard__index.unattempted{color:var(--quml-scoreboard-unattempted);border:.03125rem solid var(--quml-scoreboard-unattempted)}.scoreboard__index.unattempted:hover{border:.0625rem solid var(--primary-color);color:var(--primary-color)}.scoreboard__index.attempted{color:var(--white)!important;background:var(--primary-color);border:.03125rem solid var(--primary-color)}@media screen and (orientation: landscape){.scoreboard .scoreboard__header{display:block;width:100%;text-align:left}}.sections-score-card{width:100%;height:calc(100% - 10rem);overflow-y:auto;display:flex}.sections-score-card__title{width:100%;color:var(--quml-color-primary-contrast);font-size:.875rem;font-weight:700;text-align:center;margin-bottom:1rem}.sections-score-card__points{display:flex;flex-wrap:wrap;margin:.5rem auto 0;width:100%;max-height:100%;align-items:center;overflow-y:auto;justify-content:center}@media screen and (orientation: portrait){.sections-score-card{flex-direction:column;text-align:center}}.sections-score-card .sections-score-count-info{width:100%;display:block;border-right:0;padding-bottom:1.5rem;position:sticky;top:0;background:#fff}@media screen and (orientation: landscape){.sections-score-card .sections-score-count-info{width:40%;border-right:1px solid #979797}}@media screen and (orientation: landscape){.sections-score-card .sections-score-count-sections{width:60%}}\n"] }]
}], ctorParameters: function () { return [{ type: i1.ViewerService }]; }, propDecorators: { scores: [{
type: Input
}], totalNoOfQuestions: [{
type: Input
}], contentName: [{
type: Input
}], showFeedBack: [{
type: Input
}], isSections: [{
type: Input
}], summary: [{
type: Input
}], submitClicked: [{
type: Output
}], emitQuestionNo: [{
type: Output
}], scoreBoardLoaded: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NvcmVib2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9xdW1sLWxpYnJhcnkvc3JjL2xpYi9zY29yZWJvYXJkL3Njb3JlYm9hcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcXVtbC1saWJyYXJ5L3NyYy9saWIvc2NvcmVib2FyZC9zY29yZWJvYXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxTQUFTLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBRy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7O0FBTzFFLE1BQU0sT0FBTyxtQkFBbUI7SUFZOUIsWUFBb0IsYUFBNEI7UUFBNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFMdEMsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3hDLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUN6QyxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBR0QsQ0FBQztJQUVyRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQztZQUN6QixnQkFBZ0IsRUFBRSxJQUFJO1NBQ3ZCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFnQixFQUFFLEVBQUU7WUFDaEYsMEJBQTBCO1lBQzFCLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLE9BQU8sRUFBRTtnQkFDeEIsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUNuQixRQUFRLENBQUMsYUFBOEIsQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUNsRDtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFhLEVBQUUsVUFBbUI7UUFDN0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNqRDthQUFNO1lBQ0wsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN0QjtRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLHVCQUF1QixFQUFFLGFBQWEsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNsQyxDQUFDO2tJQTNDVSxtQkFBbUI7c0hBQW5CLG1CQUFtQiw0VkNYaEMsNDNFQWdETTs7NEZEckNPLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxpQkFBaUI7b0dBS2xCLE1BQU07c0JBQWQsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNJLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZyb21FdmVudCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJU3VtbWFyeSB9IGZyb20gJy4uL3F1bWwtbGlicmFyeS1pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVmlld2VyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3ZpZXdlci1zZXJ2aWNlL3ZpZXdlci1zZXJ2aWNlJztcbmltcG9ydCB7IGV2ZW50TmFtZSwgcGFnZUlkLCBUZWxlbWV0cnlUeXBlIH0gZnJvbSAnLi4vdGVsZW1ldHJ5LWNvbnN0YW50cyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3F1bWwtc2NvcmVib2FyZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zY29yZWJvYXJkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2NvcmVib2FyZC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFNjb3JlYm9hcmRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIHNjb3JlczogYW55O1xuICBASW5wdXQoKSB0b3RhbE5vT2ZRdWVzdGlvbnM6IG51bWJlcjtcbiAgQElucHV0KCkgY29udGVudE5hbWU6IHN0cmluZztcbiAgQElucHV0KCkgc2hvd0ZlZWRCYWNrOiBib29sZWFuO1xuICBASW5wdXQoKSBpc1NlY3Rpb25zOiBib29sZWFuO1xuICBASW5wdXQoKSBzdW1tYXJ5OiBJU3VtbWFyeTtcbiAgQE91dHB1dCgpIHN1Ym1pdENsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIGVtaXRRdWVzdGlvbk5vID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBzY29yZUJvYXJkTG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdmlld2VyU2VydmljZTogVmlld2VyU2VydmljZSkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zY29yZUJvYXJkTG9hZGVkLmVtaXQoe1xuICAgICAgc2NvcmVCb2FyZExvYWRlZDogdHJ1ZVxuICAgIH0pO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSBmcm9tRXZlbnQoZG9jdW1lbnQsICdrZXlkb3duJykuc3Vic2NyaWJlKChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKGVbJ2tleSddID09PSAnRW50ZXInKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ICBhcyBIVE1MRWxlbWVudCkuY2xpY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdvVG9RdWVzdGlvbihpbmRleDogbnVtYmVyLCBpZGVudGlmaWVyPzogc3RyaW5nKSB7XG4gICAgdGhpcy5lbWl0UXVlc3Rpb25Oby5lbWl0KHsgcXVlc3Rpb25ObzogaW5kZXgsIGlkZW50aWZpZXIgfSk7XG4gIH1cblxuICBvblJldmlld0NsaWNrZWQoKSB7XG4gICAgaWYgKHRoaXMuaXNTZWN0aW9ucykge1xuICAgICAgdGhpcy5nb1RvUXVlc3Rpb24oMSwgdGhpcy5zY29yZXNbMF0uaWRlbnRpZmllcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ29Ub1F1ZXN0aW9uKDEpO1xuICAgIH1cbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudChldmVudE5hbWUuc2NvcmVCb2FyZFJldmlld0NsaWNrZWQsIFRlbGVtZXRyeVR5cGUuaW50ZXJhY3QsIHBhZ2VJZC5zdWJtaXRQYWdlKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzY29yZWJvYXJkXCI+XG4gIDxkaXYgY2xhc3M9XCJzY29yZWJvYXJkX19oZWFkZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwic2NvcmVib2FyZF9fdGl0bGVcIj5cbiAgICAgIEFyZSB5b3UgcmVhZHkgdG8gc3VibWl0P1xuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJzY29yZWJvYXJkX19zdWJ0aXRsZVwiPlxuICAgICAge3tjb250ZW50TmFtZX19XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJzZWN0aW9ucy1zY29yZS1jYXJkXCI+XG4gICAgPGRpdiBjbGFzcz1cInNlY3Rpb25zLXNjb3JlLWNvdW50LWluZm9cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xNVwiPlRvdGFsIFF1ZXN0aW9uczoge3t0b3RhbE5vT2ZRdWVzdGlvbnN9fTwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTE1XCI+UXVlc3Rpb25zIEFuc3dlcmVkOiB7e3N1bW1hcnk/LmNvcnJlY3QgKyBzdW1tYXJ5Py53cm9uZ319PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItMTVcIj5RdWVzdGlvbnMgU2tpcHBlZDoge3tzdW1tYXJ5Py5za2lwcGVkfX08L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xNVwiPlF1ZXN0aW9ucyBub3QgVmlld2VkOiB7e3RvdGFsTm9PZlF1ZXN0aW9ucyAtIChzdW1tYXJ5Py5jb3JyZWN0ICsgc3VtbWFyeT8ud3JvbmcgKyBzdW1tYXJ5Py5za2lwcGVkKX19PC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbnMtc2NvcmUtY291bnQtc2VjdGlvbnNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzY29yZWJvYXJkX19wb2ludHNcIiAqbmdJZj1cIiFpc1NlY3Rpb25zXCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHNjb3JlIG9mIHNjb3JlczsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwic2NvcmVib2FyZF9faW5kZXhcIiAoY2xpY2spPVwiZ29Ub1F1ZXN0aW9uKGkrMSlcIlxuICAgICAgICAgIHRhYmluZGV4PVwiMFwiIGF0dHIuYXJpYS1sYWJlbD1cInF1ZXN0aW9uIG51bWJlciB7e3Njb3JlLmluZGV4fX1cIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInNob3dGZWVkQmFjayA/IHNjb3JlLmNsYXNzIDogKHNjb3JlLmNsYXNzID09PSAnc2tpcHBlZCcgPyBzY29yZS5jbGFzcyA6IChzY29yZS5jbGFzcyA9PT0gJ3VuYXR0ZW1wdGVkJyA/IHNjb3JlLmNsYXNzIDogJ2F0dGVtcHRlZCcpKVwiPlxuICAgICAgICAgIHt7c2NvcmUuaW5kZXh9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwiaXNTZWN0aW9uc1wiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzZWN0aW9uIG9mIHNjb3Jlc1wiIGNsYXNzPVwic2VjdGlvbnMtc2NvcmUtY291bnRzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb25zLXNjb3JlLWNhcmRfX3RpdGxlXCI+U2VjdGlvbiB7e3NlY3Rpb24/LmluZGV4fX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbnMtc2NvcmUtY2FyZF9fcG9pbnRzXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzY29yZSBvZiBzZWN0aW9uPy5jaGlsZHJlbjsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwic2NvcmVib2FyZF9faW5kZXhcIiB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICBhdHRyLmFyaWEtbGFiZWw9XCJxdWVzdGlvbiBudW1iZXIge3tzY29yZS5pbmRleH19XCIgKGNsaWNrKT1cImdvVG9RdWVzdGlvbihpKzEsIHNlY3Rpb24uaWRlbnRpZmllcilcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJzY29yZS5zaG93RmVlZGJhY2sgPyBzY29yZS5jbGFzcyA6IChzY29yZS5jbGFzcyA9PT0gJ3NraXBwZWQnID8gc2NvcmUuY2xhc3MgOiAoc2NvcmUuY2xhc3MgPT09ICd1bmF0dGVtcHRlZCcgPyBzY29yZS5jbGFzcyA6ICdhdHRlbXB0ZWQnKSlcIj5cbiAgICAgICAgICAgICAge3tzY29yZS5pbmRleH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cInNjb3JlYm9hcmRfX2J0bi1jb250YWluZXJcIj5cbiAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cInNiLWJ0biBzYi1idG4tb3V0bGluZS1wcmltYXJ5IHNiLWJ0bi1ub3JtYWwgc2ItYnRuLXJhZGl1cyBweC0yMCBteC04XCJcbiAgICAgIChjbGljayk9XCJvblJldmlld0NsaWNrZWQoKVwiPlJldmlldzwvYnV0dG9uPlxuICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1wcmltYXJ5IHNiLWJ0bi1ub3JtYWwgc2ItYnRuLXJhZGl1cyBweC0yMCBteC04XCJcbiAgICAgIChjbGljayk9XCJzdWJtaXRDbGlja2VkLmVtaXQoe3R5cGU6J3N1Ym1pdC1jbGlja2VkJ30pXCI+U3VibWl0PC9idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+Il19