@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
121 lines • 33.7 kB
JavaScript
import { Component, Input, SecurityContext, Output, EventEmitter } from '@angular/core';
import * as _ from 'lodash-es';
import * as i0 from "@angular/core";
import * as i1 from "@angular/platform-browser";
import * as i2 from "../util-service";
import * as i3 from "@angular/common";
import * as i4 from "../mcq-question/mcq-question.component";
import * as i5 from "../mcq-option/mcq-option.component";
import * as i6 from "../quml-popup/quml-popup.component";
export class McqComponent {
constructor(domSanitizer, utilService) {
this.domSanitizer = domSanitizer;
this.utilService = utilService;
this.componentLoaded = new EventEmitter();
this.answerChanged = new EventEmitter();
this.optionSelected = new EventEmitter();
this.mcqOptions = [];
this.showQumlPopup = false;
}
ngOnInit() {
this.numberOfCorrectOptions = _.castArray(this.question.responseDeclaration.response1.correctResponse.value).length;
if (this.question?.solutions) {
this.solutions = this.question.solutions;
}
let key = this.utilService.getKeyValue(Object.keys(this.question.responseDeclaration));
this.cardinality = this.question.responseDeclaration[key]['cardinality'];
switch (this.question.templateId) {
case "mcq-vertical":
this.layout = 'DEFAULT';
break;
case "mcq-horizontal":
this.layout = 'IMAGEGRID';
break;
case "mcq-vertical-split":
this.layout = 'IMAGEQAGRID';
break;
case "mcq-grid-split":
this.layout = 'MULTIIMAGEGRID';
break;
default:
console.error("Invalid templateId");
}
this.renderLatex();
this.mcqQuestion = this.domSanitizer.sanitize(SecurityContext.HTML, this.domSanitizer.bypassSecurityTrustHtml(this.question.body));
this.options = this.question.interactions[key].options;
this.initOptions();
}
ngAfterViewInit() {
const el = document.getElementsByClassName('mcq-options');
if (el != null && el.length > 0) {
el[0].remove();
}
}
initOptions() {
for (let j = 0; j < this.options.length; j++) {
let imageUrl;
if (this.options[j].url) {
imageUrl = this.options[j].url;
}
const option = this.options[j];
const optionValue = option.value.body;
const optionHtml = this.domSanitizer.sanitize(SecurityContext.HTML, this.domSanitizer.bypassSecurityTrustHtml(optionValue));
const optionToBePushed = {};
optionToBePushed.index = j;
optionToBePushed.optionHtml = optionHtml;
optionToBePushed.selected = false;
optionToBePushed.url = imageUrl;
this.mcqOptions.push(optionToBePushed);
}
}
renderLatex() {
setTimeout(() => {
this.replaceLatexText();
}, 100);
}
replaceLatexText() {
const questionElement = document.getElementById(this.identifier);
if (questionElement != null) {
const mathTextDivs = questionElement.getElementsByClassName('mathText');
for (let i = 0; i < mathTextDivs.length; i++) {
const mathExp = mathTextDivs[i];
const textToRender = mathExp.innerHTML;
katex.render(textToRender, mathExp, { displayMode: false, output: 'html', throwOnError: true });
}
}
}
getSelectedOptionAndResult(optionObj) {
this.optionSelected.emit(optionObj);
}
showPopup() {
this.showQumlPopup = true;
}
closePopUp() {
this.showQumlPopup = false;
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: McqComponent, deps: [{ token: i1.DomSanitizer }, { token: i2.UtilService }], target: i0.ɵɵFactoryTarget.Component }); }
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: McqComponent, selector: "quml-mcq", inputs: { shuffleOptions: "shuffleOptions", question: "question", identifier: "identifier", layout: "layout", replayed: "replayed", tryAgain: "tryAgain" }, outputs: { componentLoaded: "componentLoaded", answerChanged: "answerChanged", optionSelected: "optionSelected" }, ngImport: i0, template: "<!-- Default Layout-->\n<div class=\"quml-mcq layoutDefault\" *ngIf=\"layout=='DEFAULT'\">\n <div class=\"quml-mcq--question mb-16\">\n <quml-mcq-question [mcqQuestion]=\"mcqQuestion\" [layout]=\"layout\" (showPopup)=\"showPopup()\"></quml-mcq-question>\n </div>\n <div class=\"quml-mcq--option\">\n <quml-mcq-option [mcqOptions]=\"options\" [replayed]=\"replayed\" [cardinality]=\"cardinality\"\n [solutions]=\"solutions\" [layout]=\"layout\" [numberOfCorrectOptions]=\"numberOfCorrectOptions\" (optionSelected)=\"getSelectedOptionAndResult($event)\"\n (showPopup)=\"showPopup()\" [tryAgain]=\"tryAgain\"></quml-mcq-option>\n </div>\n</div>\n<!-- End of Default Layout-->\n<!--Image Grid Layout-->\n<div class=\"quml-mcq layoutImageGrid-mcq-horizontal\" *ngIf=\"layout=='IMAGEGRID'\">\n <div class=\"quml-mcq--question mb-16\">\n <quml-mcq-question [mcqQuestion]=\"mcqQuestion\" [layout]=\"layout\"></quml-mcq-question>\n </div>\n <div class=\"quml-mcq--option\">\n <quml-mcq-option [mcqOptions]=\"options\" [replayed]=\"replayed\" [cardinality]=\"cardinality\" [layout]=\"layout\"\n [solutions]=\"solutions\" (optionSelected)=\"getSelectedOptionAndResult($event)\" [tryAgain]=\"tryAgain\"\n [numberOfCorrectOptions]=\"numberOfCorrectOptions\">\n </quml-mcq-option>\n </div>\n</div>\n<!--End of Grid Layout-->\n<!--Image Multi Grid Layout-->\n<div class=\"quml-mcq layoutMultiImageGrid\" *ngIf=\"layout==='MULTIIMAGEGRID'\">\n <div class=\"imageqa-wrapper image-grid\">\n <div class=\"quml-mcq--question mb-16\">\n <quml-mcq-question [mcqQuestion]=\"mcqQuestion\" [layout]=\"layout\"></quml-mcq-question>\n </div>\n <div class=\"quml-mcq--option\">\n <quml-mcq-option [shuffleOptions]=\"shuffleOptions\" [mcqOptions]=\"options\" [replayed]=\"replayed\" [cardinality]=\"cardinality\"\n [solutions]=\"solutions\" (optionSelected)=\"getSelectedOptionAndResult($event)\" [layout]=\"layout\" [tryAgain]=\"tryAgain\"\n [numberOfCorrectOptions]=\"numberOfCorrectOptions\">\n </quml-mcq-option>\n </div>\n </div>\n</div>\n<!--End of Image Multi Grid Layout-->\n<!--Image QA Grid Layout-->\n<div class=\"quml-mcq layoutImageQAGridMCQ-vSplit\" *ngIf=\"layout=='IMAGEQAGRID'\">\n <div class=\"imageqa-wrapper\">\n <div class=\"quml-mcq--question mb-16\">\n <quml-mcq-question [mcqQuestion]=\"mcqQuestion\" [layout]=\"layout\"></quml-mcq-question>\n </div>\n <div class=\"quml-mcq--option\">\n <quml-mcq-option [mcqOptions]=\"options\" [replayed]=\"replayed\" [cardinality]=\"cardinality\"\n [solutions]=\"solutions\" (optionSelected)=\"getSelectedOptionAndResult($event)\" [layout]=\"layout\"\n [tryAgain]=\"tryAgain\" [numberOfCorrectOptions]=\"numberOfCorrectOptions\">\n </quml-mcq-option>\n </div>\n </div>\n</div>\n<!--End of Image QA Grid Layout-->\n<!--Image QOption Layout-->\n<div class=\"quml-mcq layoutImageOption\" *ngIf=\"layout=='IMAGEQOPTION'\">\n <div class=\"columnBlock questionBlock quml-mcq--question mb-16\">\n <quml-mcq-question [mcqQuestion]=\"mcqQuestion\" [layout]=\"layout\"></quml-mcq-question>\n </div>\n <div class=\"columnBlock quml-mcq--option\">\n <quml-mcq-option [mcqOptions]=\"options\" [replayed]=\"replayed\" [cardinality]=\"cardinality\"\n [solutions]=\"solutions\" [layout]=\"layout\" (optionSelected)=\"getSelectedOptionAndResult($event)\"\n [tryAgain]=\"tryAgain\" [numberOfCorrectOptions]=\"numberOfCorrectOptions\">\n </quml-mcq-option>\n </div>\n</div>\n\n<!--End of Image QOption Layout-->\n<quml-quml-popup *ngIf=\"showQumlPopup\" (popUpClose)=\"closePopUp()\"></quml-quml-popup>\n", styles: [".quml-mcq{padding:0}.quml-mcq .columnBlock{display:inline-block;min-width:12.5rem;padding:.25rem;min-height:12.5rem;vertical-align:top}.quml-mcq .questionBlock{max-width:17.1875rem;width:30%}.quml-mcq .quml-mcq--option{overflow-x:auto}.quml-mcq .image-grid{display:flex}.quml-mcq .image-grid .quml-mcq--question{flex-basis:25%}.quml-mcq .image-grid .quml-mcq--option{flex:1 1 75%}::ng-deep .layoutImageGrid-mcq-horizontal .quml-mcq--option .qumlImageOption .wrapper{grid-template-columns:repeat(4,1fr)}@media only screen and (min-width: 360px) and (max-width: 640px){::ng-deep .layoutImageGrid-mcq-horizontal .quml-mcq--option .qumlImageOption .wrapper{grid-template-columns:repeat(2,1fr)}}::ng-deep .layoutImageGrid-mcq-horizontal .quml-mcq-option-card .magnify-icon{width:1rem;height:1rem;right:-.25rem;bottom:-.25rem;border-top-left-radius:.4rem}::ng-deep .layoutImageGrid-mcq-horizontal .quml-mcq-option-card .magnify-icon:after{width:.75rem;height:.75rem;bottom:.0625rem;right:.0625rem}\n", ".answer{border:1px solid;padding:.2em;margin:.5em}.icon{width:15%;max-width:70px;min-width:50px;display:inline-block;vertical-align:top}.mcqText{display:inline-block;word-break:break-word}.mcq-option{background:var(--white);border-radius:5px;margin:8px 16px;padding:8px}.options{word-break:break-word;padding:15px 5px}.even,.odd{width:47%;display:inline-block;vertical-align:middle}.column-block{display:inline-block;width:48%;vertical-align:middle}.selected{background:var(--primary-color);color:var(--white);box-shadow:1px 2px 1px 3px var(--black)}.mathText{display:inline!important}.padding-top{padding-top:16px}@media only screen and (min-width: 100px) and (max-width: 481px){.mcqText{width:75%}.even,.odd{width:38%;display:inline-block;vertical-align:middle}.column-block{display:inline-block;width:42%;vertical-align:middle}}@media only screen and (min-width: 481px) and (max-width: 800px){.mcqText{width:85%}.even,.odd{width:43%;display:inline-block;vertical-align:middle}.column-block{display:inline-block;width:45%;vertical-align:middle}}@media only screen and (min-width: 801px) and (max-width: 1200px){.even,.odd{width:45%}.column-block{display:inline-block;width:45%;vertical-align:middle}}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.McqQuestionComponent, selector: "quml-mcq-question", inputs: ["mcqQuestion", "layout"], outputs: ["showPopup"] }, { kind: "component", type: i5.McqOptionComponent, selector: "quml-mcq-option", inputs: ["shuffleOptions", "mcqOptions", "solutions", "layout", "cardinality", "numberOfCorrectOptions", "replayed", "tryAgain"], outputs: ["showPopup", "optionSelected"] }, { kind: "component", type: i6.QumlPopupComponent, selector: "quml-quml-popup", inputs: ["image", "htmlTag"], outputs: ["popUpClose"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: McqComponent, decorators: [{
type: Component,
args: [{ selector: 'quml-mcq', template: "<!-- Default Layout-->\n<div class=\"quml-mcq layoutDefault\" *ngIf=\"layout=='DEFAULT'\">\n <div class=\"quml-mcq--question mb-16\">\n <quml-mcq-question [mcqQuestion]=\"mcqQuestion\" [layout]=\"layout\" (showPopup)=\"showPopup()\"></quml-mcq-question>\n </div>\n <div class=\"quml-mcq--option\">\n <quml-mcq-option [mcqOptions]=\"options\" [replayed]=\"replayed\" [cardinality]=\"cardinality\"\n [solutions]=\"solutions\" [layout]=\"layout\" [numberOfCorrectOptions]=\"numberOfCorrectOptions\" (optionSelected)=\"getSelectedOptionAndResult($event)\"\n (showPopup)=\"showPopup()\" [tryAgain]=\"tryAgain\"></quml-mcq-option>\n </div>\n</div>\n<!-- End of Default Layout-->\n<!--Image Grid Layout-->\n<div class=\"quml-mcq layoutImageGrid-mcq-horizontal\" *ngIf=\"layout=='IMAGEGRID'\">\n <div class=\"quml-mcq--question mb-16\">\n <quml-mcq-question [mcqQuestion]=\"mcqQuestion\" [layout]=\"layout\"></quml-mcq-question>\n </div>\n <div class=\"quml-mcq--option\">\n <quml-mcq-option [mcqOptions]=\"options\" [replayed]=\"replayed\" [cardinality]=\"cardinality\" [layout]=\"layout\"\n [solutions]=\"solutions\" (optionSelected)=\"getSelectedOptionAndResult($event)\" [tryAgain]=\"tryAgain\"\n [numberOfCorrectOptions]=\"numberOfCorrectOptions\">\n </quml-mcq-option>\n </div>\n</div>\n<!--End of Grid Layout-->\n<!--Image Multi Grid Layout-->\n<div class=\"quml-mcq layoutMultiImageGrid\" *ngIf=\"layout==='MULTIIMAGEGRID'\">\n <div class=\"imageqa-wrapper image-grid\">\n <div class=\"quml-mcq--question mb-16\">\n <quml-mcq-question [mcqQuestion]=\"mcqQuestion\" [layout]=\"layout\"></quml-mcq-question>\n </div>\n <div class=\"quml-mcq--option\">\n <quml-mcq-option [shuffleOptions]=\"shuffleOptions\" [mcqOptions]=\"options\" [replayed]=\"replayed\" [cardinality]=\"cardinality\"\n [solutions]=\"solutions\" (optionSelected)=\"getSelectedOptionAndResult($event)\" [layout]=\"layout\" [tryAgain]=\"tryAgain\"\n [numberOfCorrectOptions]=\"numberOfCorrectOptions\">\n </quml-mcq-option>\n </div>\n </div>\n</div>\n<!--End of Image Multi Grid Layout-->\n<!--Image QA Grid Layout-->\n<div class=\"quml-mcq layoutImageQAGridMCQ-vSplit\" *ngIf=\"layout=='IMAGEQAGRID'\">\n <div class=\"imageqa-wrapper\">\n <div class=\"quml-mcq--question mb-16\">\n <quml-mcq-question [mcqQuestion]=\"mcqQuestion\" [layout]=\"layout\"></quml-mcq-question>\n </div>\n <div class=\"quml-mcq--option\">\n <quml-mcq-option [mcqOptions]=\"options\" [replayed]=\"replayed\" [cardinality]=\"cardinality\"\n [solutions]=\"solutions\" (optionSelected)=\"getSelectedOptionAndResult($event)\" [layout]=\"layout\"\n [tryAgain]=\"tryAgain\" [numberOfCorrectOptions]=\"numberOfCorrectOptions\">\n </quml-mcq-option>\n </div>\n </div>\n</div>\n<!--End of Image QA Grid Layout-->\n<!--Image QOption Layout-->\n<div class=\"quml-mcq layoutImageOption\" *ngIf=\"layout=='IMAGEQOPTION'\">\n <div class=\"columnBlock questionBlock quml-mcq--question mb-16\">\n <quml-mcq-question [mcqQuestion]=\"mcqQuestion\" [layout]=\"layout\"></quml-mcq-question>\n </div>\n <div class=\"columnBlock quml-mcq--option\">\n <quml-mcq-option [mcqOptions]=\"options\" [replayed]=\"replayed\" [cardinality]=\"cardinality\"\n [solutions]=\"solutions\" [layout]=\"layout\" (optionSelected)=\"getSelectedOptionAndResult($event)\"\n [tryAgain]=\"tryAgain\" [numberOfCorrectOptions]=\"numberOfCorrectOptions\">\n </quml-mcq-option>\n </div>\n</div>\n\n<!--End of Image QOption Layout-->\n<quml-quml-popup *ngIf=\"showQumlPopup\" (popUpClose)=\"closePopUp()\"></quml-quml-popup>\n", styles: [".quml-mcq{padding:0}.quml-mcq .columnBlock{display:inline-block;min-width:12.5rem;padding:.25rem;min-height:12.5rem;vertical-align:top}.quml-mcq .questionBlock{max-width:17.1875rem;width:30%}.quml-mcq .quml-mcq--option{overflow-x:auto}.quml-mcq .image-grid{display:flex}.quml-mcq .image-grid .quml-mcq--question{flex-basis:25%}.quml-mcq .image-grid .quml-mcq--option{flex:1 1 75%}::ng-deep .layoutImageGrid-mcq-horizontal .quml-mcq--option .qumlImageOption .wrapper{grid-template-columns:repeat(4,1fr)}@media only screen and (min-width: 360px) and (max-width: 640px){::ng-deep .layoutImageGrid-mcq-horizontal .quml-mcq--option .qumlImageOption .wrapper{grid-template-columns:repeat(2,1fr)}}::ng-deep .layoutImageGrid-mcq-horizontal .quml-mcq-option-card .magnify-icon{width:1rem;height:1rem;right:-.25rem;bottom:-.25rem;border-top-left-radius:.4rem}::ng-deep .layoutImageGrid-mcq-horizontal .quml-mcq-option-card .magnify-icon:after{width:.75rem;height:.75rem;bottom:.0625rem;right:.0625rem}\n", ".answer{border:1px solid;padding:.2em;margin:.5em}.icon{width:15%;max-width:70px;min-width:50px;display:inline-block;vertical-align:top}.mcqText{display:inline-block;word-break:break-word}.mcq-option{background:var(--white);border-radius:5px;margin:8px 16px;padding:8px}.options{word-break:break-word;padding:15px 5px}.even,.odd{width:47%;display:inline-block;vertical-align:middle}.column-block{display:inline-block;width:48%;vertical-align:middle}.selected{background:var(--primary-color);color:var(--white);box-shadow:1px 2px 1px 3px var(--black)}.mathText{display:inline!important}.padding-top{padding-top:16px}@media only screen and (min-width: 100px) and (max-width: 481px){.mcqText{width:75%}.even,.odd{width:38%;display:inline-block;vertical-align:middle}.column-block{display:inline-block;width:42%;vertical-align:middle}}@media only screen and (min-width: 481px) and (max-width: 800px){.mcqText{width:85%}.even,.odd{width:43%;display:inline-block;vertical-align:middle}.column-block{display:inline-block;width:45%;vertical-align:middle}}@media only screen and (min-width: 801px) and (max-width: 1200px){.even,.odd{width:45%}.column-block{display:inline-block;width:45%;vertical-align:middle}}\n"] }]
}], ctorParameters: function () { return [{ type: i1.DomSanitizer }, { type: i2.UtilService }]; }, propDecorators: { shuffleOptions: [{
type: Input
}], question: [{
type: Input
}], identifier: [{
type: Input
}], layout: [{
type: Input
}], replayed: [{
type: Input
}], tryAgain: [{
type: Input
}], componentLoaded: [{
type: Output
}], answerChanged: [{
type: Output
}], optionSelected: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNxLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3F1bWwtbGlicmFyeS9zcmMvbGliL21jcS9tY3EuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcXVtbC1saWJyYXJ5L3NyYy9saWIvbWNxL21jcS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFJL0csT0FBTyxLQUFLLENBQUMsTUFBTSxXQUFXLENBQUM7Ozs7Ozs7O0FBVS9CLE1BQU0sT0FBTyxZQUFZO0lBcUJ2QixZQUNTLFlBQTBCLEVBQzFCLFdBQXdCO1FBRHhCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBaEJ2QixvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDMUMsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3hDLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUl0RCxlQUFVLEdBQVUsRUFBRSxDQUFDO1FBRXZCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO0lBU3RCLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLHNCQUFzQixHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNwSCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFO1lBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7U0FDMUM7UUFDRCxJQUFJLEdBQUcsR0FBUSxJQUFJLENBQUMs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Q0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNJLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBTZWN1cml0eUNvbnRleHQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBBZnRlclZpZXdJbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IGthdGV4IH0gZnJvbSAna2F0ZXgnO1xuaW1wb3J0IHsgVXRpbFNlcnZpY2UgfSBmcm9tICcuLi91dGlsLXNlcnZpY2UnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gtZXMnO1xuXG5kZWNsYXJlIGNvbnN0IGthdGV4OiBhbnk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3F1bWwtbWNxJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21jcS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21jcS5jb21wb25lbnQuc2NzcycsICcuLi9xdW1sLWxpYnJhcnkuY29tcG9uZW50LnNjc3MnXSxcblxufSlcbmV4cG9ydCBjbGFzcyBNY3FDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuICBASW5wdXQoKSBzaHVmZmxlT3B0aW9ucz86IGJvb2xlYW47XG4gIEBJbnB1dCgpIHF1ZXN0aW9uPzogYW55O1xuICBASW5wdXQoKSBpZGVudGlmaWVyOiBhbnk7XG4gIEBJbnB1dCgpIGxheW91dD86IHN0cmluZztcbiAgQElucHV0KCkgcmVwbGF5ZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHRyeUFnYWluPzogYm9vbGVhbjtcbiAgQE91dHB1dCgpIGNvbXBvbmVudExvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgYW5zd2VyQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgb3B0aW9uU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICBtY3FRdWVzdGlvbjogYW55O1xuICBvcHRpb25zOiBhbnk7XG4gIG1jcU9wdGlvbnM6IGFueVtdID0gW107XG4gIHNlbGVjdGVkT3B0aW9uVGFyZ2V0OiBhbnk7XG4gIHNob3dRdW1sUG9wdXAgPSBmYWxzZTtcbiAgc29sdXRpb25zOiBBcnJheTxbXT47XG4gIGNhcmRpbmFsaXR5OiBzdHJpbmc7XG4gIG51bWJlck9mQ29ycmVjdE9wdGlvbnM6IG51bWJlcjtcbiAgXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRvbVNhbml0aXplcjogRG9tU2FuaXRpemVyLFxuICAgIHB1YmxpYyB1dGlsU2VydmljZTogVXRpbFNlcnZpY2UpIHtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubnVtYmVyT2ZDb3JyZWN0T3B0aW9ucyA9IF8uY2FzdEFycmF5KHRoaXMucXVlc3Rpb24ucmVzcG9uc2VEZWNsYXJhdGlvbi5yZXNwb25zZTEuY29ycmVjdFJlc3BvbnNlLnZhbHVlKS5sZW5ndGg7XG4gICAgaWYgKHRoaXMucXVlc3Rpb24/LnNvbHV0aW9ucykge1xuICAgICAgdGhpcy5zb2x1dGlvbnMgPSB0aGlzLnF1ZXN0aW9uLnNvbHV0aW9ucztcbiAgICB9XG4gICAgbGV0IGtleTogYW55ID0gdGhpcy51dGlsU2VydmljZS5nZXRLZXlWYWx1ZShPYmplY3Qua2V5cyh0aGlzLnF1ZXN0aW9uLnJlc3BvbnNlRGVjbGFyYXRpb24pKTtcbiAgICB0aGlzLmNhcmRpbmFsaXR5ID0gdGhpcy5xdWVzdGlvbi5yZXNwb25zZURlY2xhcmF0aW9uW2tleV1bJ2NhcmRpbmFsaXR5J107XG5cbiAgICBzd2l0Y2godGhpcy5xdWVzdGlvbi50ZW1wbGF0ZUlkKSB7XG4gICAgICBjYXNlIFwibWNxLXZlcnRpY2FsXCI6IFxuICAgICAgICB0aGlzLmxheW91dCA9ICdERUZBVUxUJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwibWNxLWhvcml6b250YWxcIjogXG4gICAgICAgIHRoaXMubGF5b3V0ID0gJ0lNQUdFR1JJRCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIm1jcS12ZXJ0aWNhbC1zcGxpdFwiOlxuICAgICAgICB0aGlzLmxheW91dCA9ICdJTUFHRVFBR1JJRCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIm1jcS1ncmlkLXNwbGl0XCI6XG4gICAgICAgIHRoaXMubGF5b3V0ID0gJ01VTFRJSU1BR0VHUklEJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zb2xlLmVycm9yKFwiSW52YWxpZCB0ZW1wbGF0ZUlkXCIpO1xuICAgIH1cblxuICAgIHRoaXMucmVuZGVyTGF0ZXgoKTtcbiAgICB0aGlzLm1jcVF1ZXN0aW9uID0gdGhpcy5kb21TYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LkhUTUwsXG4gICAgICB0aGlzLmRvbVNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbCh0aGlzLnF1ZXN0aW9uLmJvZHkpKTtcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLnF1ZXN0aW9uLmludGVyYWN0aW9uc1trZXldLm9wdGlvbnM7XG4gICAgdGhpcy5pbml0T3B0aW9ucygpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbWNxLW9wdGlvbnMnKTtcbiAgICBpZiAoZWwgIT0gbnVsbCAmJiBlbC5sZW5ndGggPiAwKSB7XG4gICAgICBlbFswXS5yZW1vdmUoKTtcbiAgICB9XG4gIH1cblxuICBpbml0T3B0aW9ucygpIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMub3B0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgbGV0IGltYWdlVXJsO1xuICAgICAgaWYgKHRoaXMub3B0aW9uc1tqXS51cmwpIHtcbiAgICAgICAgaW1hZ2VVcmwgPSB0aGlzLm9wdGlvbnNbal0udXJsO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5vcHRpb25zW2pdO1xuICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSBvcHRpb24udmFsdWUuYm9keTtcbiAgICAgIGNvbnN0IG9wdGlvbkh0bWwgPSB0aGlzLmRvbVNhbml0aXplci5zYW5pdGl6ZShTZWN1cml0eUNvbnRleHQuSFRNTCwgdGhpcy5kb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwob3B0aW9uVmFsdWUpKTtcbiAgICAgIGNvbnN0IG9wdGlvblRvQmVQdXNoZWQ6IGFueSA9IHt9O1xuICAgICAgb3B0aW9uVG9CZVB1c2hlZC5pbmRleCA9IGo7XG4gICAgICBvcHRpb25Ub0JlUHVzaGVkLm9wdGlvbkh0bWwgPSBvcHRpb25IdG1sO1xuICAgICAgb3B0aW9uVG9CZVB1c2hlZC5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgb3B0aW9uVG9CZVB1c2hlZC51cmwgPSBpbWFnZVVybDtcbiAgICAgIHRoaXMubWNxT3B0aW9ucy5wdXNoKG9wdGlvblRvQmVQdXNoZWQpO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlckxhdGV4KCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZXBsYWNlTGF0ZXhUZXh0KCk7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIHJlcGxhY2VMYXRleFRleHQoKSB7XG4gICAgY29uc3QgcXVlc3Rpb25FbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5pZGVudGlmaWVyKTtcbiAgICBpZiAocXVlc3Rpb25FbGVtZW50ICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IG1hdGhUZXh0RGl2cyA9IHF1ZXN0aW9uRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdtYXRoVGV4dCcpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXRoVGV4dERpdnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbWF0aEV4cCA9IG1hdGhUZXh0RGl2c1tpXTtcbiAgICAgICAgY29uc3QgdGV4dFRvUmVuZGVyID0gbWF0aEV4cC5pbm5lckhUTUw7XG4gICAgICAgIGthdGV4LnJlbmRlcih0ZXh0VG9SZW5kZXIsIG1hdGhFeHAsIHsgZGlzcGxheU1vZGU6IGZhbHNlLCBvdXRwdXQ6ICdodG1sJywgdGhyb3dPbkVycm9yOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldFNlbGVjdGVkT3B0aW9uQW5kUmVzdWx0KG9wdGlvbk9iaikge1xuICAgIHRoaXMub3B0aW9uU2VsZWN0ZWQuZW1pdChvcHRpb25PYmopO1xuICB9XG5cbiAgc2hvd1BvcHVwKCkge1xuICAgIHRoaXMuc2hvd1F1bWxQb3B1cCA9IHRydWU7XG4gIH1cblxuICBjbG9zZVBvcFVwKCkge1xuICAgIHRoaXMuc2hvd1F1bWxQb3B1cCA9IGZhbHNlO1xuICB9XG59XG4iLCI8IS0tIERlZmF1bHQgTGF5b3V0LS0+XG48ZGl2IGNsYXNzPVwicXVtbC1tY3EgbGF5b3V0RGVmYXVsdFwiICpuZ0lmPVwibGF5b3V0PT0nREVGQVVMVCdcIj5cbiAgICA8ZGl2IGNsYXNzPVwicXVtbC1tY3EtLXF1ZXN0aW9uIG1iLTE2XCI+XG4gICAgICAgIDxxdW1sLW1jcS1xdWVzdGlvbiBbbWNxUXVlc3Rpb25dPVwibWNxUXVlc3Rpb25cIiBbbGF5b3V0XT1cImxheW91dFwiIChzaG93UG9wdXApPVwic2hvd1BvcHVwKClcIj48L3F1bWwtbWNxLXF1ZXN0aW9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJxdW1sLW1jcS0tb3B0aW9uXCI+XG4gICAgICAgIDxxdW1sLW1jcS1vcHRpb24gW21jcU9wdGlvbnNdPVwib3B0aW9uc1wiIFtyZXBsYXllZF09XCJyZXBsYXllZFwiIFtjYXJkaW5hbGl0eV09XCJjYXJkaW5hbGl0eVwiXG4gICAgICAgICAgICBbc29sdXRpb25zXT1cInNvbHV0aW9uc1wiIFtsYXlvdXRdPVwibGF5b3V0XCIgW251bWJlck9mQ29ycmVjdE9wdGlvbnNdPVwibnVtYmVyT2ZDb3JyZWN0T3B0aW9uc1wiIChvcHRpb25TZWxlY3RlZCk9XCJnZXRTZWxlY3RlZE9wdGlvbkFuZFJlc3VsdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzaG93UG9wdXApPVwic2hvd1BvcHVwKClcIiBbdHJ5QWdhaW5dPVwidHJ5QWdhaW5cIj48L3F1bWwtbWNxLW9wdGlvbj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPCEtLSBFbmQgb2YgRGVmYXVsdCBMYXlvdXQtLT5cbjwhLS1JbWFnZSBHcmlkIExheW91dC0tPlxuPGRpdiBjbGFzcz1cInF1bWwtbWNxIGxheW91dEltYWdlR3JpZC1tY3EtaG9yaXpvbnRhbFwiICpuZ0lmPVwibGF5b3V0PT0nSU1BR0VHUklEJ1wiPlxuICAgIDxkaXYgY2xhc3M9XCJxdW1sLW1jcS0tcXVlc3Rpb24gbWItMTZcIj5cbiAgICAgICAgPHF1bWwtbWNxLXF1ZXN0aW9uIFttY3FRdWVzdGlvbl09XCJtY3FRdWVzdGlvblwiIFtsYXlvdXRdPVwibGF5b3V0XCI+PC9xdW1sLW1jcS1xdWVzdGlvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicXVtbC1tY3EtLW9wdGlvblwiPlxuICAgICAgICA8cXVtbC1tY3Etb3B0aW9uIFttY3FPcHRpb25zXT1cIm9wdGlvbnNcIiBbcmVwbGF5ZWRdPVwicmVwbGF5ZWRcIiBbY2FyZGluYWxpdHldPVwiY2FyZGluYWxpdHlcIiBbbGF5b3V0XT1cImxheW91dFwiXG4gICAgICAgICAgICBbc29sdXRpb25zXT1cInNvbHV0aW9uc1wiIChvcHRpb25TZWxlY3RlZCk9XCJnZXRTZWxlY3RlZE9wdGlvbkFuZFJlc3VsdCgkZXZlbnQpXCIgW3RyeUFnYWluXT1cInRyeUFnYWluXCJcbiAgICAgICAgICAgIFtudW1iZXJPZkNvcnJlY3RPcHRpb25zXT1cIm51bWJlck9mQ29ycmVjdE9wdGlvbnNcIj5cbiAgICAgICAgPC9xdW1sLW1jcS1vcHRpb24+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjwhLS1FbmQgb2YgR3JpZCBMYXlvdXQtLT5cbjwhLS1JbWFnZSBNdWx0aSBHcmlkIExheW91dC0tPlxuPGRpdiBjbGFzcz1cInF1bWwtbWNxIGxheW91dE11bHRpSW1hZ2VHcmlkXCIgKm5nSWY9XCJsYXlvdXQ9PT0nTVVMVElJTUFHRUdSSUQnXCI+XG4gICAgPGRpdiBjbGFzcz1cImltYWdlcWEtd3JhcHBlciBpbWFnZS1ncmlkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJxdW1sLW1jcS0tcXVlc3Rpb24gbWItMTZcIj5cbiAgICAgICAgICAgIDxxdW1sLW1jcS1xdWVzdGlvbiBbbWNxUXVlc3Rpb25dPVwibWNxUXVlc3Rpb25cIiBbbGF5b3V0XT1cImxheW91dFwiPjwvcXVtbC1tY3EtcXVlc3Rpb24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicXVtbC1tY3EtLW9wdGlvblwiPlxuICAgICAgICAgICAgPHF1bWwtbWNxLW9wdGlvbiBbc2h1ZmZsZU9wdGlvbnNdPVwic2h1ZmZsZU9wdGlvbnNcIiBbbWNxT3B0aW9uc109XCJvcHRpb25zXCIgW3JlcGxheWVkXT1cInJlcGxheWVkXCIgW2NhcmRpbmFsaXR5XT1cImNhcmRpbmFsaXR5XCJcbiAgICAgICAgICAgICAgICBbc29sdXRpb25zXT1cInNvbHV0aW9uc1wiIChvcHRpb25TZWxlY3RlZCk9XCJnZXRTZWxlY3RlZE9wdGlvbkFuZFJlc3VsdCgkZXZlbnQpXCIgW2xheW91dF09XCJsYXlvdXRcIiBbdHJ5QWdhaW5dPVwidHJ5QWdhaW5cIlxuICAgICAgICAgICAgICAgIFtudW1iZXJPZkNvcnJlY3RPcHRpb25zXT1cIm51bWJlck9mQ29ycmVjdE9wdGlvbnNcIj5cbiAgICAgICAgICAgIDwvcXVtbC1tY3Etb3B0aW9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPCEtLUVuZCBvZiBJbWFnZSBNdWx0aSBHcmlkIExheW91dC0tPlxuPCEtLUltYWdlIFFBIEdyaWQgTGF5b3V0LS0+XG48ZGl2IGNsYXNzPVwicXVtbC1tY3EgbGF5b3V0SW1hZ2VRQUdyaWRNQ1EtdlNwbGl0XCIgKm5nSWY9XCJsYXlvdXQ9PSdJTUFHRVFBR1JJRCdcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaW1hZ2VxYS13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJxdW1sLW1jcS0tcXVlc3Rpb24gbWItMTZcIj5cbiAgICAgICAgICAgIDxxdW1sLW1jcS1xdWVzdGlvbiBbbWNxUXVlc3Rpb25dPVwibWNxUXVlc3Rpb25cIiBbbGF5b3V0XT1cImxheW91dFwiPjwvcXVtbC1tY3EtcXVlc3Rpb24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicXVtbC1tY3EtLW9wdGlvblwiPlxuICAgICAgICAgICAgPHF1bWwtbWNxLW9wdGlvbiBbbWNxT3B0aW9uc109XCJvcHRpb25zXCIgW3JlcGxheWVkXT1cInJlcGxheWVkXCIgW2NhcmRpbmFsaXR5XT1cImNhcmRpbmFsaXR5XCJcbiAgICAgICAgICAgICAgICBbc29sdXRpb25zXT1cInNvbHV0aW9uc1wiIChvcHRpb25TZWxlY3RlZCk9XCJnZXRTZWxlY3RlZE9wdGlvbkFuZFJlc3VsdCgkZXZlbnQpXCIgW2xheW91dF09XCJsYXlvdXRcIlxuICAgICAgICAgICAgICAgIFt0cnlBZ2Fpbl09XCJ0cnlBZ2FpblwiIFtudW1iZXJPZkNvcnJlY3RPcHRpb25zXT1cIm51bWJlck9mQ29ycmVjdE9wdGlvbnNcIj5cbiAgICAgICAgICAgIDwvcXVtbC1tY3Etb3B0aW9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPCEtLUVuZCBvZiBJbWFnZSBRQSBHcmlkIExheW91dC0tPlxuPCEtLUltYWdlIFFPcHRpb24gTGF5b3V0LS0+XG48ZGl2IGNsYXNzPVwicXVtbC1tY3EgbGF5b3V0SW1hZ2VPcHRpb25cIiAqbmdJZj1cImxheW91dD09J0lNQUdFUU9QVElPTidcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sdW1uQmxvY2sgcXVlc3Rpb25CbG9jayBxdW1sLW1jcS0tcXVlc3Rpb24gbWItMTZcIj5cbiAgICAgICAgPHF1bWwtbWNxLXF1ZXN0aW9uIFttY3FRdWVzdGlvbl09XCJtY3FRdWVzdGlvblwiIFtsYXlvdXRdPVwibGF5b3V0XCI+PC9xdW1sLW1jcS1xdWVzdGlvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sdW1uQmxvY2sgcXVtbC1tY3EtLW9wdGlvblwiPlxuICAgICAgICA8cXVtbC1tY3Etb3B0aW9uIFttY3FPcHRpb25zXT1cIm9wdGlvbnNcIiBbcmVwbGF5ZWRdPVwicmVwbGF5ZWRcIiBbY2FyZGluYWxpdHldPVwiY2FyZGluYWxpdHlcIlxuICAgICAgICAgICAgW3NvbHV0aW9uc109XCJzb2x1dGlvbnNcIiBbbGF5b3V0XT1cImxheW91dFwiIChvcHRpb25TZWxlY3RlZCk9XCJnZXRTZWxlY3RlZE9wdGlvbkFuZFJlc3VsdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIFt0cnlBZ2Fpbl09XCJ0cnlBZ2FpblwiIFtudW1iZXJPZkNvcnJlY3RPcHRpb25zXT1cIm51bWJlck9mQ29ycmVjdE9wdGlvbnNcIj5cbiAgICAgICAgPC9xdW1sLW1jcS1vcHRpb24+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLUVuZCBvZiBJbWFnZSBRT3B0aW9uIExheW91dC0tPlxuPHF1bWwtcXVtbC1wb3B1cCAqbmdJZj1cInNob3dRdW1sUG9wdXBcIiAocG9wVXBDbG9zZSk9XCJjbG9zZVBvcFVwKClcIj48L3F1bWwtcXVtbC1wb3B1cD5cbiJdfQ==