libey-ng-component-library 0.0.19 → 0.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -22,8 +22,10 @@ export class LibeyNgSignatureComponent {
22
22
  minWidth: 5,
23
23
  canvasWidth: this.widthView,
24
24
  canvasHeight: this.heightView,
25
- backgroundColor: 'rgba(242,242,242,1)',
26
25
  };
26
+ this.FileValidated = false;
27
+ this.NotDriver = false;
28
+ this.UploadFile = null;
27
29
  }
28
30
  ngAfterViewInit() {
29
31
  this.InitDevice();
@@ -33,6 +35,9 @@ export class LibeyNgSignatureComponent {
33
35
  this._destroy$.next(true);
34
36
  }
35
37
  ChangeDevice() {
38
+ this.NotDriver = false;
39
+ this.UploadFile = null;
40
+ this.File = null;
36
41
  setTimeout(() => {
37
42
  this.InitDevice();
38
43
  }, 200);
@@ -51,62 +56,126 @@ export class LibeyNgSignatureComponent {
51
56
  SigWebTablet.SetTabletState(0, this.tmr, null);
52
57
  }
53
58
  onSign() {
54
- console.log('onSign Clicked!');
55
- SigWebTablet.SetDisplayXSize(this.widthRender);
56
- SigWebTablet.SetDisplayYSize(this.heightRender);
57
- SigWebTablet.SetTabletState(0, this.tmr, null);
58
- SigWebTablet.SetJustifyMode(0);
59
- SigWebTablet.ClearTablet();
60
- if (this.tmr == null) {
61
- this.tmr = SigWebTablet.SetTabletState(1, this.cnvContext, 50);
59
+ this.NotDriver = false;
60
+ this.UploadFile = null;
61
+ var driver = SigWebTablet.GetVersionString();
62
+ if (driver == null) {
63
+ this.NotDriver = true;
62
64
  }
63
65
  else {
66
+ this.NotDriver = false;
67
+ console.log('onSign Clicked!');
68
+ SigWebTablet.SetDisplayXSize(this.widthRender);
69
+ SigWebTablet.SetDisplayYSize(this.heightRender);
64
70
  SigWebTablet.SetTabletState(0, this.tmr, null);
65
- this.tmr = null;
66
- this.tmr = SigWebTablet.SetTabletState(1, this.cnvContext, 50);
71
+ SigWebTablet.SetJustifyMode(0);
72
+ SigWebTablet.ClearTablet();
73
+ if (this.tmr == null) {
74
+ this.tmr = SigWebTablet.SetTabletState(1, this.cnvContext, 50);
75
+ }
76
+ else {
77
+ SigWebTablet.SetTabletState(0, this.tmr, null);
78
+ this.tmr = null;
79
+ this.tmr = SigWebTablet.SetTabletState(1, this.cnvContext, 50);
80
+ }
67
81
  }
68
82
  }
69
83
  onClear() {
70
- if (this.DeviceType == 'pinpad') {
71
- SigWebTablet.ClearTablet();
72
- if (this.cnvContext) {
73
- this.cnvContext.clearRect(0, 0, this.canvas.nativeElement.width, this.canvas.nativeElement.height);
84
+ if (this.UploadFile == null) {
85
+ if (this.DeviceType == 'pinpad') {
86
+ SigWebTablet.ClearTablet();
87
+ if (this.cnvContext) {
88
+ this.cnvContext.clearRect(0, 0, this.canvas.nativeElement.width, this.canvas.nativeElement.height);
89
+ }
90
+ }
91
+ if (this.DeviceType == 'mousepad') {
92
+ this.signaturePad.clear();
74
93
  }
75
94
  }
76
- if (this.DeviceType == 'mousepad') {
77
- this.signaturePad.clear();
95
+ else {
96
+ this.File = null;
97
+ this.UploadFile = null;
98
+ this.ChangeDevice();
78
99
  }
79
100
  }
80
101
  onDone() {
81
- if (this.DeviceType == 'pinpad') {
82
- // if (Number(SigWebTablet.NumberOfTabletPoints()) === 0) {
83
- // alert('Por favor firme antes de continuar');
84
- // } else {
85
- SigWebTablet.SetTabletState(0, this.tmr, null);
86
- SigWebTablet.SetSigCompressionMode(1);
87
- var result = new OutputMessage();
88
- result.bioSigData = SigWebTablet.GetSigString();
89
- result.sigImgData = SigWebTablet.GetSigString();
90
- SigWebTablet.SetImageXSize(this.widthRender);
91
- SigWebTablet.SetImageYSize(this.heightRender);
92
- SigWebTablet.SetImagePenWidth(5);
93
- SigWebTablet.GetSigImageB64((base64) => {
94
- result.sigString = "data:image/png;base64," + base64;
102
+ var result = new OutputMessage();
103
+ if (this.UploadFile == null) {
104
+ if (this.DeviceType == 'pinpad') {
105
+ // if (Number(SigWebTablet.NumberOfTabletPoints()) === 0) {
106
+ // alert('Por favor firme antes de continuar');
107
+ // } else {
108
+ SigWebTablet.SetTabletState(0, this.tmr, null);
109
+ SigWebTablet.SetSigCompressionMode(1);
110
+ result.bioSigData = SigWebTablet.GetSigString();
111
+ result.sigImgData = SigWebTablet.GetSigString();
112
+ SigWebTablet.SetImageXSize(this.widthRender);
113
+ SigWebTablet.SetImageYSize(this.heightRender);
114
+ SigWebTablet.SetImagePenWidth(5);
115
+ SigWebTablet.GetSigImageB64((base64) => {
116
+ result.sigString = "data:image/png;base64," + base64;
117
+ this.OutputSignature.emit(result);
118
+ });
119
+ // }
120
+ }
121
+ if (this.DeviceType == 'mousepad') {
122
+ var result = new OutputMessage();
123
+ result.sigString = this.signaturePad.toDataURL();
95
124
  this.OutputSignature.emit(result);
96
- });
97
- // }
125
+ }
98
126
  }
99
- if (this.DeviceType == 'mousepad') {
100
- var result = new OutputMessage();
101
- result.sigString = this.signaturePad.toDataURL();
127
+ else {
128
+ result.sigString = this.UploadFile;
102
129
  this.OutputSignature.emit(result);
103
130
  }
104
131
  }
105
- drawComplete() { }
106
- drawStart() { }
132
+ fileEvent(event) {
133
+ this.UploadFile = null;
134
+ this.FileValidated = false;
135
+ const file = event.target.files[0];
136
+ if (file.type == 'image/jpeg' || file.type == 'image/png') {
137
+ this.FileValidated = false;
138
+ const newWidth = this.widthRender;
139
+ const newHeight = this.heightRender;
140
+ this.resizeImage(file, newWidth, newHeight)
141
+ .then((resizedImageDataUrl) => {
142
+ this.UploadFile = resizedImageDataUrl;
143
+ })
144
+ .catch((error) => {
145
+ console.error('Error al redimensionar la imagen:', error);
146
+ });
147
+ }
148
+ else {
149
+ this.File = null;
150
+ this.UploadFile = null;
151
+ this.FileValidated = true;
152
+ }
153
+ }
154
+ resizeImage(image, newWidth, newHeight) {
155
+ return new Promise((resolve, reject) => {
156
+ const reader = new FileReader();
157
+ reader.onload = (e) => {
158
+ const img = new Image();
159
+ img.src = e.target.result;
160
+ img.onload = () => {
161
+ const canvas = document.createElement('canvas');
162
+ const ctx = canvas.getContext('2d');
163
+ canvas.width = newWidth;
164
+ canvas.height = newHeight;
165
+ ctx.drawImage(img, 0, 0, newWidth, newHeight);
166
+ const resizedImageDataUrl = canvas.toDataURL(image.type);
167
+ resolve(resizedImageDataUrl);
168
+ };
169
+ img.onerror = (error) => {
170
+ reject(error);
171
+ };
172
+ };
173
+ reader.readAsDataURL(image);
174
+ });
175
+ }
107
176
  }
108
177
  LibeyNgSignatureComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: LibeyNgSignatureComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
109
- LibeyNgSignatureComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: LibeyNgSignatureComponent, selector: "lib-libey-ng-signature", inputs: { DeviceType: "DeviceType" }, outputs: { OutputSignature: "OutputSignature" }, viewQueries: [{ propertyName: "canvas", first: true, predicate: ["sigImg"], descendants: true }, { propertyName: "signaturePad", first: true, predicate: SignaturePad, descendants: true }], ngImport: i0, template: "<div class=\"container\">\n <div *ngIf=\"DeviceType=='pinpad'\">\n <canvas #sigImg [width]=\"widthView\" [height]=\"heightView\" style=\"background-color: rgba(242,242,242,1);\"></canvas> \n </div>\n <div *ngIf=\"DeviceType=='mousepad'\">\n <signature-pad [options]=\"signaturePadOptions\" (onBeginEvent)=\"drawStart()\" (onEndEvent)=\"drawComplete()\"></signature-pad>\n </div>\n <div class=\"row\">\n <button *ngIf=\"DeviceType=='pinpad'\" mat-raised-button (click)=\"onSign()\">Firmar</button>\n <button mat-raised-button (click)=\"onClear()\">Limpiar</button>\n <button mat-raised-button (click)=\"onDone()\">Guardar</button>\n </div>\n <div class=\"row\">\n <ng-select [(ngModel)]=\"DeviceType\" class=\"ng-select\" placeholder=\"Seleccionar\" [clearable]=\"false\"\n (change)=\"ChangeDevice()\">\n <ng-option [value]=\"'pinpad'\">Pinpad</ng-option>\n <ng-option [value]=\"'mousepad'\">Mousepad</ng-option>\n </ng-select>\n </div>\n</div>", styles: [".container{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center}.row{display:flex;justify-content:center;grid-gap:10px;gap:10px}\n"], components: [{ type: i1.SignaturePad, selector: "signature-pad", inputs: ["options"], outputs: ["onBeginEvent", "onEndEvent"] }, { type: i2.NgSelectComponent, selector: "ng-select", inputs: ["markFirst", "dropdownPosition", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "bufferAmount", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "bindLabel", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "virtualScroll", "openOnEnter", "appendTo", "bindValue", "appearance", "maxSelectedItems", "groupBy", "groupValue", "tabIndex", "typeahead"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { type: i2.ɵr, selector: "ng-option", inputs: ["disabled", "value"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
178
+ LibeyNgSignatureComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: LibeyNgSignatureComponent, selector: "lib-libey-ng-signature", inputs: { DeviceType: "DeviceType" }, outputs: { OutputSignature: "OutputSignature" }, viewQueries: [{ propertyName: "canvas", first: true, predicate: ["sigImg"], descendants: true }, { propertyName: "signaturePad", first: true, predicate: SignaturePad, descendants: true }], ngImport: i0, template: "<div class=\"container\">\n <div *ngIf=\"UploadFile==null\">\n <div *ngIf=\"DeviceType=='pinpad'\" style=\"cursor: pointer; border: 1px ridge #d2d2d2;\">\n <canvas (click)=\"onSign()\" #sigImg [width]=\"widthView\" [height]=\"heightView\"></canvas> \n </div>\n <div *ngIf=\"DeviceType=='mousepad'\" style=\"border: 1px ridge #d2d2d2;\">\n <signature-pad [options]=\"signaturePadOptions\"></signature-pad>\n </div>\n </div>\n <div *ngIf=\"UploadFile!=null\" style=\"border: 1px ridge #d2d2d2;\">\n <img [src]=\"UploadFile\" [width]=\"widthView\" [height]=\"heightView\" />\n </div>\n</div>\n<div class=\"row\">\n <div class=\"col-md-12\" style=\"padding-top: 17px !important; padding-bottom: 17px !important;\">\n <input type=\"file\" (change)=\"fileEvent($event)\" [(ngModel)]=\"File\" class=\"form-control form-control-ph\"\n accept=\"image/png, image/jpeg\" style=\"border: none;\">\n <label *ngIf=\"FileValidated\" [ngClass]=\"'text-danger'\">Archivo requerido. Formatos permitidos (jpeg, jpg, png)</label>\n </div>\n</div>\n<div class=\"row\">\n <div class=\"col-md-6\">\n <ng-select [(ngModel)]=\"DeviceType\" class=\"ng-select\" placeholder=\"Seleccionar\" [clearable]=\"false\"\n (change)=\"ChangeDevice()\">\n <ng-option [value]=\"'pinpad'\">Pinpad</ng-option>\n <ng-option [value]=\"'mousepad'\">Mousepad</ng-option>\n </ng-select>\n <label *ngIf=\"NotDriver\" [ngClass]=\"'text-danger'\">No tiene el driver instalado</label>\n </div>\n <div class=\"col-md-6\">\n <p class=\"text-primary font-link-rp\" style=\"text-align: right; cursor: pointer;\" (click)=\"onClear()\">\n Limpiar firma\n </p>\n </div>\n</div>\n\n<div class=\"modal-footer mt-15 mb-4\">\n <button type=\"button\" class=\"btn btn-primary btn-save-rp\" (click)=\"onDone()\"> \n <i class=\"icon-save-white\"></i> Guardar\n </button>\n</div>", styles: [".container{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center}\n"], components: [{ type: i1.SignaturePad, selector: "signature-pad", inputs: ["options"], outputs: ["onBeginEvent", "onEndEvent"] }, { type: i2.NgSelectComponent, selector: "ng-select", inputs: ["markFirst", "dropdownPosition", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "bufferAmount", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "bindLabel", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "virtualScroll", "openOnEnter", "appendTo", "bindValue", "appearance", "maxSelectedItems", "groupBy", "groupValue", "tabIndex", "typeahead"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { type: i2.ɵr, selector: "ng-option", inputs: ["disabled", "value"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
110
179
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: LibeyNgSignatureComponent, decorators: [{
111
180
  type: Component,
112
181
  args: [{
@@ -125,4 +194,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
125
194
  type: ViewChild,
126
195
  args: [SignaturePad]
127
196
  }] } });
128
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliZXktbmctc2lnbmF0dXJlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xpYmV5LW5nLWNvbXBvbmVudC1saWJyYXJ5L3NyYy9saWIvc2lnbmF0dXJlL2xpYmV5LW5nLXNpZ25hdHVyZS9saWJleS1uZy1zaWduYXR1cmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbGliZXktbmctY29tcG9uZW50LWxpYnJhcnkvc3JjL2xpYi9zaWduYXR1cmUvbGliZXktbmctc2lnbmF0dXJlL2xpYmV5LW5nLXNpZ25hdHVyZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUdULFNBQVMsRUFDVCxNQUFNLEVBQ04sWUFBWSxFQUNaLEtBQUssR0FDTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFNUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7OztBQU9yRCxNQUFNLGFBQWE7Q0FJbEI7QUFPRCxNQUFNLE9BQU8seUJBQXlCO0lBcUJwQztRQXBCVSxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFrQixDQUFDO1FBQ3RELGVBQVUsR0FBVyxVQUFVLENBQUM7UUFFakMsY0FBUyxHQUFxQixJQUFJLE9BQU8sRUFBVyxDQUFDO1FBTTdELGNBQVMsR0FBVyxHQUFHLENBQUM7UUFDeEIsZUFBVSxHQUFXLEdBQUcsQ0FBQztRQUN6QixnQkFBVyxHQUFXLEdBQUcsQ0FBQztRQUMxQixpQkFBWSxHQUFXLEdBQUcsQ0FBQztRQUMzQix3QkFBbUIsR0FBVztZQUM1QixRQUFRLEVBQUUsQ0FBQztZQUNYLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUztZQUMz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dUhBckhILHlCQUF5QjsyR0FBekIseUJBQXlCLHNSQU96QixZQUFZLGdEQ3RDekIsNDlCQW1CTTs0RkRZTyx5QkFBeUI7a0JBTHJDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHdCQUF3QjtvQkFDbEMsV0FBVyxFQUFFLHFDQUFxQztvQkFDbEQsU0FBUyxFQUFFLENBQUMsb0NBQW9DLENBQUM7aUJBQ2xEOzBFQUVXLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0UsVUFBVTtzQkFBbEIsS0FBSztnQkFJTixNQUFNO3NCQURMLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFFYixZQUFZO3NCQUFwQyxTQUFTO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIE9uRGVzdHJveSxcbiAgVmlld0NoaWxkLFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU2lnV2ViVGFibGV0IH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvU2lnV2ViL1NpZ1dlYic7XG5pbXBvcnQgeyBGb3JtLCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFNpZ25hdHVyZVBhZCB9IGZyb20gJ2FuZ3VsYXIyLXNpZ25hdHVyZXBhZCc7XG5pbnRlcmZhY2UgSU91dHB1dE1lc3NhZ2Uge1xuICBiaW9TaWdEYXRhOiBzdHJpbmc7XG4gIHNpZ0ltZ0RhdGE6IHN0cmluZztcbiAgc2lnU3RyaW5nOiBzdHJpbmc7XG59XG5cbmNsYXNzIE91dHB1dE1lc3NhZ2UgaW1wbGVtZW50cyBJT3V0cHV0TWVzc2FnZSB7XG4gIGJpb1NpZ0RhdGE6IHN0cmluZztcbiAgc2lnSW1nRGF0YTogc3RyaW5nO1xuICBzaWdTdHJpbmc6IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWxpYmV5LW5nLXNpZ25hdHVyZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9saWJleS1uZy1zaWduYXR1cmUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9saWJleS1uZy1zaWduYXR1cmUuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJleU5nU2lnbmF0dXJlQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgQE91dHB1dCgpIE91dHB1dFNpZ25hdHVyZSA9IG5ldyBFdmVudEVtaXR0ZXI8SU91dHB1dE1lc3NhZ2U+KCk7XG4gIEBJbnB1dCgpIERldmljZVR5cGU6IHN0cmluZyA9ICdtb3VzZXBhZCc7XG5cbiAgcHJpdmF0ZSBfZGVzdHJveSQ6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICBAVmlld0NoaWxkKCdzaWdJbWcnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgY2FudmFzITogRWxlbWVudFJlZjxIVE1MQ2FudmFzRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoU2lnbmF0dXJlUGFkKSBzaWduYXR1cmVQYWQ6IFNpZ25hdHVyZVBhZDtcbiAgY252Q29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuICB0bXI6IGFueTtcbiAgd2lkdGhWaWV3OiBudW1iZXIgPSA1MDA7XG4gIGhlaWdodFZpZXc6IG51bWJlciA9IDIwMDtcbiAgd2lkdGhSZW5kZXI6IG51bWJlciA9IDUwMDtcbiAgaGVpZ2h0UmVuZGVyOiBudW1iZXIgPSAyMDA7XG4gIHNpZ25hdHVyZVBhZE9wdGlvbnM6IE9iamVjdCA9IHtcbiAgICBtaW5XaWR0aDogNSxcbiAgICBjYW52YXNXaWR0aDogdGhpcy53aWR0aFZpZXcsXG4gICAgY2FudmFzSGVpZ2h0OiB0aGlzLmhlaWdodFZpZXcsXG4gICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgyNDIsMjQyLDI0MiwxKScsXG4gIH07XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLkluaXREZXZpY2UoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2luZ1NpZ1dlYigpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gIH1cblxuICBDaGFuZ2VEZXZpY2UoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLkluaXREZXZpY2UoKTtcbiAgICB9LCAyMDApO1xuICB9XG5cbiAgSW5pdERldmljZSgpIHtcbiAgICBpZiAodGhpcy5EZXZpY2VUeXBlID09ICdwaW5wYWQnKSB7XG4gICAgICB0aGlzLmNudkNvbnRleHQgPSAoPEhUTUxDYW52YXNFbGVtZW50PihcbiAgICAgICAgdGhpcy5jYW52YXMubmF0aXZlRWxlbWVudFxuICAgICAgKSkuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuRGV2aWNlVHlwZSA9PSAnbW91c2VwYWQnKSB7XG4gICAgICB0aGlzLnNpZ25hdHVyZVBhZC5zZXQoJ21pbldpZHRoJywgNSk7XG4gICAgICB0aGlzLnNpZ25hdHVyZVBhZC5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIGNsb3NpbmdTaWdXZWIoKSB7XG4gICAgU2lnV2ViVGFibGV0LkNsZWFyVGFibGV0KCk7XG4gICAgU2lnV2ViVGFibGV0LlNldFRhYmxldFN0YXRlKDAsIHRoaXMudG1yLCBudWxsKTtcbiAgfVxuXG4gIG9uU2lnbigpIHtcbiAgICBjb25zb2xlLmxvZygnb25TaWduIENsaWNrZWQhJyk7XG4gICAgU2lnV2ViVGFibGV0LlNldERpc3BsYXlYU2l6ZSh0aGlzLndpZHRoUmVuZGVyKTtcbiAgICBTaWdXZWJUYWJsZXQuU2V0RGlzcGxheVlTaXplKHRoaXMuaGVpZ2h0UmVuZGVyKTtcbiAgICBTaWdXZWJUYWJsZXQuU2V0VGFibGV0U3RhdGUoMCwgdGhpcy50bXIsIG51bGwpO1xuICAgIFNpZ1dlYlRhYmxldC5TZXRKdXN0aWZ5TW9kZSgwKTtcbiAgICBTaWdXZWJUYWJsZXQuQ2xlYXJUYWJsZXQoKTtcblxuICAgIGlmICh0aGlzLnRtciA9PSBudWxsKSB7XG4gICAgICB0aGlzLnRtciA9IFNpZ1dlYlRhYmxldC5TZXRUYWJsZXRTdGF0ZSgxLCB0aGlzLmNudkNvbnRleHQsIDUwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgU2lnV2ViVGFibGV0LlNldFRhYmxldFN0YXRlKDAsIHRoaXMudG1yLCBudWxsKTtcbiAgICAgIHRoaXMudG1yID0gbnVsbDtcbiAgICAgIHRoaXMudG1yID0gU2lnV2ViVGFibGV0LlNldFRhYmxldFN0YXRlKDEsIHRoaXMuY252Q29udGV4dCwgNTApO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2xlYXIoKSB7XG4gICAgaWYgKHRoaXMuRGV2aWNlVHlwZSA9PSAncGlucGFkJykge1xuICAgICAgU2lnV2ViVGFibGV0LkNsZWFyVGFibGV0KCk7XG4gICAgICBpZiAodGhpcy5jbnZDb250ZXh0KSB7XG4gICAgICAgIHRoaXMuY252Q29udGV4dC5jbGVhclJlY3QoXG4gICAgICAgICAgMCxcbiAgICAgICAgICAwLFxuICAgICAgICAgIHRoaXMuY2FudmFzLm5hdGl2ZUVsZW1lbnQud2lkdGgsXG4gICAgICAgICAgdGhpcy5jYW52YXMubmF0aXZlRWxlbWVudC5oZWlnaHRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuRGV2aWNlVHlwZSA9PSAnbW91c2VwYWQnKSB7XG4gICAgICB0aGlzLnNpZ25hdHVyZVBhZC5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIG9uRG9uZSgpIHtcbiAgICBpZiAodGhpcy5EZXZpY2VUeXBlID09ICdwaW5wYWQnKSB7XG4gICAgICAvLyBpZiAoTnVtYmVyKFNpZ1dlYlRhYmxldC5OdW1iZXJPZlRhYmxldFBvaW50cygpKSA9PT0gMCkge1xuICAgICAgLy8gICBhbGVydCgnUG9yIGZhdm9yIGZpcm1lIGFudGVzIGRlIGNvbnRpbnVhcicpO1xuICAgICAgLy8gfSBlbHNlIHtcbiAgICAgIFNpZ1dlYlRhYmxldC5TZXRUYWJsZXRTdGF0ZSgwLCB0aGlzLnRtciwgbnVsbCk7XG5cbiAgICAgIFNpZ1dlYlRhYmxldC5TZXRTaWdDb21wcmVzc2lvbk1vZGUoMSk7XG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IE91dHB1dE1lc3NhZ2UoKTtcbiAgICAgIHJlc3VsdC5iaW9TaWdEYXRhID0gU2lnV2ViVGFibGV0LkdldFNpZ1N0cmluZygpO1xuICAgICAgcmVzdWx0LnNpZ0ltZ0RhdGEgPSBTaWdXZWJUYWJsZXQuR2V0U2lnU3RyaW5nKCk7XG4gICAgICBTaWdXZWJUYWJsZXQuU2V0SW1hZ2VYU2l6ZSh0aGlzLndpZHRoUmVuZGVyKTtcbiAgICAgIFNpZ1dlYlRhYmxldC5TZXRJbWFnZVlTaXplKHRoaXMuaGVpZ2h0UmVuZGVyKTtcbiAgICAgIFNpZ1dlYlRhYmxldC5TZXRJbWFnZVBlbldpZHRoKDUpO1xuICAgICAgU2lnV2ViVGFibGV0LkdldFNpZ0ltYWdlQjY0KChiYXNlNjQ6IHN0cmluZykgPT4ge1xuICAgICAgICByZXN1bHQuc2lnU3RyaW5nID0gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsXCIgKyBiYXNlNjQ7XG4gICAgICAgIHRoaXMuT3V0cHV0U2lnbmF0dXJlLmVtaXQocmVzdWx0KTtcbiAgICAgIH0pO1xuICAgICAgLy8gfVxuICAgIH1cbiAgICBpZiAodGhpcy5EZXZpY2VUeXBlID09ICdtb3VzZXBhZCcpIHtcbiAgICAgIHZhciByZXN1bHQgPSBuZXcgT3V0cHV0TWVzc2FnZSgpO1xuICAgICAgcmVzdWx0LnNpZ1N0cmluZyA9IHRoaXMuc2lnbmF0dXJlUGFkLnRvRGF0YVVSTCgpO1xuICAgICAgdGhpcy5PdXRwdXRTaWduYXR1cmUuZW1pdChyZXN1bHQpO1xuICAgIH1cbiAgfVxuICBkcmF3Q29tcGxldGUoKSB7fVxuXG4gIGRyYXdTdGFydCgpIHt9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG4gIDxkaXYgKm5nSWY9XCJEZXZpY2VUeXBlPT0ncGlucGFkJ1wiPlxuICAgIDxjYW52YXMgI3NpZ0ltZyBbd2lkdGhdPVwid2lkdGhWaWV3XCIgW2hlaWdodF09XCJoZWlnaHRWaWV3XCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI0MiwyNDIsMjQyLDEpO1wiPjwvY2FudmFzPiAgXG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwiRGV2aWNlVHlwZT09J21vdXNlcGFkJ1wiPlxuICAgIDxzaWduYXR1cmUtcGFkIFtvcHRpb25zXT1cInNpZ25hdHVyZVBhZE9wdGlvbnNcIiAob25CZWdpbkV2ZW50KT1cImRyYXdTdGFydCgpXCIgKG9uRW5kRXZlbnQpPVwiZHJhd0NvbXBsZXRlKClcIj48L3NpZ25hdHVyZS1wYWQ+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgPGJ1dHRvbiAqbmdJZj1cIkRldmljZVR5cGU9PSdwaW5wYWQnXCIgbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cIm9uU2lnbigpXCI+RmlybWFyPC9idXR0b24+XG4gICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwib25DbGVhcigpXCI+TGltcGlhcjwvYnV0dG9uPlxuICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cIm9uRG9uZSgpXCI+R3VhcmRhcjwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgIDxuZy1zZWxlY3QgWyhuZ01vZGVsKV09XCJEZXZpY2VUeXBlXCIgY2xhc3M9XCJuZy1zZWxlY3RcIiBwbGFjZWhvbGRlcj1cIlNlbGVjY2lvbmFyXCIgW2NsZWFyYWJsZV09XCJmYWxzZVwiXG4gICAgKGNoYW5nZSk9XCJDaGFuZ2VEZXZpY2UoKVwiPlxuICAgICAgPG5nLW9wdGlvbiBbdmFsdWVdPVwiJ3BpbnBhZCdcIj5QaW5wYWQ8L25nLW9wdGlvbj5cbiAgICAgIDxuZy1vcHRpb24gW3ZhbHVlXT1cIidtb3VzZXBhZCdcIj5Nb3VzZXBhZDwvbmctb3B0aW9uPlxuICAgIDwvbmctc2VsZWN0PlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
197
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliZXktbmctc2lnbmF0dXJlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xpYmV5LW5nLWNvbXBvbmVudC1saWJyYXJ5L3NyYy9saWIvc2lnbmF0dXJlL2xpYmV5LW5nLXNpZ25hdHVyZS9saWJleS1uZy1zaWduYXR1cmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbGliZXktbmctY29tcG9uZW50LWxpYnJhcnkvc3JjL2xpYi9zaWduYXR1cmUvbGliZXktbmctc2lnbmF0dXJlL2xpYmV5LW5nLXNpZ25hdHVyZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUdULFNBQVMsRUFDVCxNQUFNLEVBQ04sWUFBWSxFQUNaLEtBQUssR0FDTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFNUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7OztBQU9yRCxNQUFNLGFBQWE7Q0FJbEI7QUFPRCxNQUFNLE9BQU8seUJBQXlCO0lBdUJwQztRQXRCVSxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFrQixDQUFDO1FBQ3RELGVBQVUsR0FBVyxVQUFVLENBQUM7UUFFakMsY0FBUyxHQUFxQixJQUFJLE9BQU8sRUFBVyxDQUFDO1FBTTdELGNBQVMsR0FBVyxHQUFHLENBQUM7UUFDeEIsZUFBVSxHQUFXLEdBQUcsQ0FBQztRQUN6QixnQkFBVyxHQUFXLEdBQUcsQ0FBQztRQUMxQixpQkFBWSxHQUFXLEdBQUcsQ0FBQztRQUMzQix3QkFBbUIsR0FBVztZQUM1QixRQUFRLEVBQUUsQ0FBQztZQUNYLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUztZQUMz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bXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgT25EZXN0cm95LFxuICBWaWV3Q2hpbGQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTaWdXZWJUYWJsZXQgfSBmcm9tICcuLi8uLi8uLi91dGlscy9TaWdXZWIvU2lnV2ViJztcbmltcG9ydCB7IEZvcm0sIEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU2lnbmF0dXJlUGFkIH0gZnJvbSAnYW5ndWxhcjItc2lnbmF0dXJlcGFkJztcbmludGVyZmFjZSBJT3V0cHV0TWVzc2FnZSB7XG4gIGJpb1NpZ0RhdGE6IHN0cmluZztcbiAgc2lnSW1nRGF0YTogc3RyaW5nO1xuICBzaWdTdHJpbmc6IHN0cmluZztcbn1cblxuY2xhc3MgT3V0cHV0TWVzc2FnZSBpbXBsZW1lbnRzIElPdXRwdXRNZXNzYWdlIHtcbiAgYmlvU2lnRGF0YTogc3RyaW5nO1xuICBzaWdJbWdEYXRhOiBzdHJpbmc7XG4gIHNpZ1N0cmluZzogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItbGliZXktbmctc2lnbmF0dXJlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xpYmV5LW5nLXNpZ25hdHVyZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2xpYmV5LW5nLXNpZ25hdHVyZS5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIExpYmV5TmdTaWduYXR1cmVDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBAT3V0cHV0KCkgT3V0cHV0U2lnbmF0dXJlID0gbmV3IEV2ZW50RW1pdHRlcjxJT3V0cHV0TWVzc2FnZT4oKTtcbiAgQElucHV0KCkgRGV2aWNlVHlwZTogc3RyaW5nID0gJ21vdXNlcGFkJztcblxuICBwcml2YXRlIF9kZXN0cm95JDogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG4gIEBWaWV3Q2hpbGQoJ3NpZ0ltZycsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBjYW52YXMhOiBFbGVtZW50UmVmPEhUTUxDYW52YXNFbGVtZW50PjtcbiAgQFZpZXdDaGlsZChTaWduYXR1cmVQYWQpIHNpZ25hdHVyZVBhZDogU2lnbmF0dXJlUGFkO1xuICBjbnZDb250ZXh0OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG4gIHRtcjogYW55O1xuICB3aWR0aFZpZXc6IG51bWJlciA9IDUwMDtcbiAgaGVpZ2h0VmlldzogbnVtYmVyID0gMjAwO1xuICB3aWR0aFJlbmRlcjogbnVtYmVyID0gNTAwO1xuICBoZWlnaHRSZW5kZXI6IG51bWJlciA9IDIwMDtcbiAgc2lnbmF0dXJlUGFkT3B0aW9uczogT2JqZWN0ID0ge1xuICAgIG1pbldpZHRoOiA1LFxuICAgIGNhbnZhc1dpZHRoOiB0aGlzLndpZHRoVmlldyxcbiAgICBjYW52YXNIZWlnaHQ6IHRoaXMuaGVpZ2h0VmlldyxcbiAgfTtcbiAgRmlsZVZhbGlkYXRlZCA9IGZhbHNlO1xuICBOb3REcml2ZXIgPSBmYWxzZTtcbiAgVXBsb2FkRmlsZTogc3RyaW5nID0gbnVsbDtcbiAgRmlsZTogYW55O1xuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuSW5pdERldmljZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zaW5nU2lnV2ViKCk7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgfVxuXG4gIENoYW5nZURldmljZSgpIHtcbiAgICB0aGlzLk5vdERyaXZlciA9IGZhbHNlO1xuICAgIHRoaXMuVXBsb2FkRmlsZSA9IG51bGw7XG4gICAgdGhpcy5GaWxlID0gbnVsbDtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuSW5pdERldmljZSgpO1xuICAgIH0sIDIwMCk7XG4gIH1cblxuICBJbml0RGV2aWNlKCkge1xuICAgIGlmICh0aGlzLkRldmljZVR5cGUgPT0gJ3BpbnBhZCcpIHtcbiAgICAgIHRoaXMuY252Q29udGV4dCA9ICg8SFRNTENhbnZhc0VsZW1lbnQ+KFxuICAgICAgICB0aGlzLmNhbnZhcy5uYXRpdmVFbGVtZW50XG4gICAgICApKS5nZXRDb250ZXh0KCcyZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5EZXZpY2VUeXBlID09ICdtb3VzZXBhZCcpIHtcbiAgICAgIHRoaXMuc2lnbmF0dXJlUGFkLnNldCgnbWluV2lkdGgnLCA1KTtcbiAgICAgIHRoaXMuc2lnbmF0dXJlUGFkLmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbiAgY2xvc2luZ1NpZ1dlYigpIHtcbiAgICBTaWdXZWJUYWJsZXQuQ2xlYXJUYWJsZXQoKTtcbiAgICBTaWdXZWJUYWJsZXQuU2V0VGFibGV0U3RhdGUoMCwgdGhpcy50bXIsIG51bGwpO1xuICB9XG5cbiAgb25TaWduKCkge1xuICAgIHRoaXMuTm90RHJpdmVyID0gZmFsc2U7XG4gICAgdGhpcy5VcGxvYWRGaWxlID0gbnVsbDtcbiAgICB2YXIgZHJpdmVyID0gU2lnV2ViVGFibGV0LkdldFZlcnNpb25TdHJpbmcoKTtcbiAgICBpZihkcml2ZXIgPT0gbnVsbCl7XG4gICAgICB0aGlzLk5vdERyaXZlciA9IHRydWU7XG4gICAgfWVsc2V7XG4gICAgICB0aGlzLk5vdERyaXZlciA9IGZhbHNlO1xuICAgICAgY29uc29sZS5sb2coJ29uU2lnbiBDbGlja2VkIScpO1xuICAgICAgU2lnV2ViVGFibGV0LlNldERpc3BsYXlYU2l6ZSh0aGlzLndpZHRoUmVuZGVyKTtcbiAgICAgIFNpZ1dlYlRhYmxldC5TZXREaXNwbGF5WVNpemUodGhpcy5oZWlnaHRSZW5kZXIpO1xuICAgICAgU2lnV2ViVGFibGV0LlNldFRhYmxldFN0YXRlKDAsIHRoaXMudG1yLCBudWxsKTtcbiAgICAgIFNpZ1dlYlRhYmxldC5TZXRKdXN0aWZ5TW9kZSgwKTtcbiAgICAgIFNpZ1dlYlRhYmxldC5DbGVhclRhYmxldCgpO1xuXG4gICAgICBpZiAodGhpcy50bXIgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLnRtciA9IFNpZ1dlYlRhYmxldC5TZXRUYWJsZXRTdGF0ZSgxLCB0aGlzLmNudkNvbnRleHQsIDUwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFNpZ1dlYlRhYmxldC5TZXRUYWJsZXRTdGF0ZSgwLCB0aGlzLnRtciwgbnVsbCk7XG4gICAgICAgIHRoaXMudG1yID0gbnVsbDtcbiAgICAgICAgdGhpcy50bXIgPSBTaWdXZWJUYWJsZXQuU2V0VGFibGV0U3RhdGUoMSwgdGhpcy5jbnZDb250ZXh0LCA1MCk7XG4gICAgICB9XG4gICAgfSAgICBcbiAgfVxuXG4gIG9uQ2xlYXIoKSB7XG4gICAgaWYodGhpcy5VcGxvYWRGaWxlID09IG51bGwpe1xuICAgICAgaWYgKHRoaXMuRGV2aWNlVHlwZSA9PSAncGlucGFkJykge1xuICAgICAgICBTaWdXZWJUYWJsZXQuQ2xlYXJUYWJsZXQoKTtcbiAgICAgICAgaWYgKHRoaXMuY252Q29udGV4dCkge1xuICAgICAgICAgIHRoaXMuY252Q29udGV4dC5jbGVhclJlY3QoXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLm5hdGl2ZUVsZW1lbnQud2lkdGgsXG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5uYXRpdmVFbGVtZW50LmhlaWdodFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLkRldmljZVR5cGUgPT0gJ21vdXNlcGFkJykge1xuICAgICAgICB0aGlzLnNpZ25hdHVyZVBhZC5jbGVhcigpO1xuICAgICAgfVxuICAgIH1lbHNle1xuICAgICAgdGhpcy5GaWxlID0gbnVsbDtcbiAgICAgIHRoaXMuVXBsb2FkRmlsZSA9IG51bGw7XG4gICAgICB0aGlzLkNoYW5nZURldmljZSgpO1xuICAgIH1cbiAgfVxuXG4gIG9uRG9uZSgpIHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IE91dHB1dE1lc3NhZ2UoKTtcbiAgICBpZih0aGlzLlVwbG9hZEZpbGUgPT0gbnVsbCl7XG4gICAgICBpZiAodGhpcy5EZXZpY2VUeXBlID09ICdwaW5wYWQnKSB7XG4gICAgICAgIC8vIGlmIChOdW1iZXIoU2lnV2ViVGFibGV0Lk51bWJlck9mVGFibGV0UG9pbnRzKCkpID09PSAwKSB7XG4gICAgICAgIC8vICAgYWxlcnQoJ1BvciBmYXZvciBmaXJtZSBhbnRlcyBkZSBjb250aW51YXInKTtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgU2lnV2ViVGFibGV0LlNldFRhYmxldFN0YXRlKDAsIHRoaXMudG1yLCBudWxsKTtcblxuICAgICAgICBTaWdXZWJUYWJsZXQuU2V0U2lnQ29tcHJlc3Npb25Nb2RlKDEpO1xuICAgICAgICByZXN1bHQuYmlvU2lnRGF0YSA9IFNpZ1dlYlRhYmxldC5HZXRTaWdTdHJpbmcoKTtcbiAgICAgICAgcmVzdWx0LnNpZ0ltZ0RhdGEgPSBTaWdXZWJUYWJsZXQuR2V0U2lnU3RyaW5nKCk7XG4gICAgICAgIFNpZ1dlYlRhYmxldC5TZXRJbWFnZVhTaXplKHRoaXMud2lkdGhSZW5kZXIpO1xuICAgICAgICBTaWdXZWJUYWJsZXQuU2V0SW1hZ2VZU2l6ZSh0aGlzLmhlaWdodFJlbmRlcik7XG4gICAgICAgIFNpZ1dlYlRhYmxldC5TZXRJbWFnZVBlbldpZHRoKDUpO1xuICAgICAgICBTaWdXZWJUYWJsZXQuR2V0U2lnSW1hZ2VCNjQoKGJhc2U2NDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgcmVzdWx0LnNpZ1N0cmluZyA9IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LFwiICsgYmFzZTY0O1xuICAgICAgICAgIHRoaXMuT3V0cHV0U2lnbmF0dXJlLmVtaXQocmVzdWx0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLkRldmljZVR5cGUgPT0gJ21vdXNlcGFkJykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IE91dHB1dE1lc3NhZ2UoKTtcbiAgICAgICAgcmVzdWx0LnNpZ1N0cmluZyA9IHRoaXMuc2lnbmF0dXJlUGFkLnRvRGF0YVVSTCgpO1xuICAgICAgICB0aGlzLk91dHB1dFNpZ25hdHVyZS5lbWl0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgfWVsc2V7XG4gICAgICByZXN1bHQuc2lnU3RyaW5nID0gdGhpcy5VcGxvYWRGaWxlO1xuICAgICAgdGhpcy5PdXRwdXRTaWduYXR1cmUuZW1pdChyZXN1bHQpO1xuICAgIH1cbiAgfVxuICBmaWxlRXZlbnQoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuVXBsb2FkRmlsZSA9IG51bGw7XG4gICAgdGhpcy5GaWxlVmFsaWRhdGVkID0gZmFsc2U7XG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LnRhcmdldC5maWxlc1swXTtcbiAgICBpZiAoZmlsZS50eXBlID09ICdpbWFnZS9qcGVnJyB8fCBmaWxlLnR5cGUgPT0gJ2ltYWdlL3BuZycpIHtcbiAgICAgIHRoaXMuRmlsZVZhbGlkYXRlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgbmV3V2lkdGggPSB0aGlzLndpZHRoUmVuZGVyO1xuICAgICAgY29uc3QgbmV3SGVpZ2h0ID0gdGhpcy5oZWlnaHRSZW5kZXI7XG4gICAgICB0aGlzLnJlc2l6ZUltYWdlKGZpbGUsIG5ld1dpZHRoLCBuZXdIZWlnaHQpXG4gICAgICAgIC50aGVuKChyZXNpemVkSW1hZ2VEYXRhVXJsKSA9PiB7XG4gICAgICAgICAgdGhpcy5VcGxvYWRGaWxlID0gcmVzaXplZEltYWdlRGF0YVVybDtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGFsIHJlZGltZW5zaW9uYXIgbGEgaW1hZ2VuOicsIGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfWVsc2V7XG4gICAgICB0aGlzLkZpbGUgPSBudWxsO1xuICAgICAgdGhpcy5VcGxvYWRGaWxlID0gbnVsbDtcbiAgICAgIHRoaXMuRmlsZVZhbGlkYXRlZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJlc2l6ZUltYWdlKGltYWdlOiBGaWxlLCBuZXdXaWR0aDogbnVtYmVyLCBuZXdIZWlnaHQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICByZWFkZXIub25sb2FkID0gKGUpID0+IHtcbiAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGltZy5zcmMgPSBlLnRhcmdldC5yZXN1bHQgYXMgc3RyaW5nO1xuICAgICAgICBpbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICAgIGNhbnZhcy53aWR0aCA9IG5ld1dpZHRoO1xuICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBuZXdIZWlnaHQ7XG4gICAgICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDAsIG5ld1dpZHRoLCBuZXdIZWlnaHQpO1xuICAgICAgICAgIGNvbnN0IHJlc2l6ZWRJbWFnZURhdGFVcmwgPSBjYW52YXMudG9EYXRhVVJMKGltYWdlLnR5cGUpO1xuICAgICAgICAgIHJlc29sdmUocmVzaXplZEltYWdlRGF0YVVybCk7XG4gICAgICAgIH07XG4gICAgICAgIGltZy5vbmVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChpbWFnZSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgPGRpdiAqbmdJZj1cIlVwbG9hZEZpbGU9PW51bGxcIj5cbiAgICA8ZGl2ICpuZ0lmPVwiRGV2aWNlVHlwZT09J3BpbnBhZCdcIiBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgYm9yZGVyOiAxcHggcmlkZ2UgI2QyZDJkMjtcIj5cbiAgICAgIDxjYW52YXMgIChjbGljayk9XCJvblNpZ24oKVwiICNzaWdJbWcgW3dpZHRoXT1cIndpZHRoVmlld1wiIFtoZWlnaHRdPVwiaGVpZ2h0Vmlld1wiPjwvY2FudmFzPiAgXG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cIkRldmljZVR5cGU9PSdtb3VzZXBhZCdcIiBzdHlsZT1cImJvcmRlcjogMXB4IHJpZGdlICNkMmQyZDI7XCI+XG4gICAgICA8c2lnbmF0dXJlLXBhZCBbb3B0aW9uc109XCJzaWduYXR1cmVQYWRPcHRpb25zXCI+PC9zaWduYXR1cmUtcGFkPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiAqbmdJZj1cIlVwbG9hZEZpbGUhPW51bGxcIiBzdHlsZT1cImJvcmRlcjogMXB4IHJpZGdlICNkMmQyZDI7XCI+XG4gICAgPGltZyBbc3JjXT1cIlVwbG9hZEZpbGVcIiBbd2lkdGhdPVwid2lkdGhWaWV3XCIgW2hlaWdodF09XCJoZWlnaHRWaWV3XCIgLz5cbiAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiIHN0eWxlPVwicGFkZGluZy10b3A6IDE3cHggIWltcG9ydGFudDsgcGFkZGluZy1ib3R0b206IDE3cHggIWltcG9ydGFudDtcIj5cbiAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiAoY2hhbmdlKT1cImZpbGVFdmVudCgkZXZlbnQpXCIgWyhuZ01vZGVsKV09XCJGaWxlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXBoXCJcbiAgICBhY2NlcHQ9XCJpbWFnZS9wbmcsIGltYWdlL2pwZWdcIiBzdHlsZT1cImJvcmRlcjogbm9uZTtcIj5cbiAgICA8bGFiZWwgKm5nSWY9XCJGaWxlVmFsaWRhdGVkXCIgW25nQ2xhc3NdPVwiJ3RleHQtZGFuZ2VyJ1wiPkFyY2hpdm8gcmVxdWVyaWRvLiBGb3JtYXRvcyBwZXJtaXRpZG9zIChqcGVnLCBqcGcsIHBuZyk8L2xhYmVsPlxuICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cInJvd1wiPlxuICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cbiAgICAgIDxuZy1zZWxlY3QgWyhuZ01vZGVsKV09XCJEZXZpY2VUeXBlXCIgY2xhc3M9XCJuZy1zZWxlY3RcIiBwbGFjZWhvbGRlcj1cIlNlbGVjY2lvbmFyXCIgW2NsZWFyYWJsZV09XCJmYWxzZVwiXG4gICAgICAoY2hhbmdlKT1cIkNoYW5nZURldmljZSgpXCI+XG4gICAgICAgICAgPG5nLW9wdGlvbiBbdmFsdWVdPVwiJ3BpbnBhZCdcIj5QaW5wYWQ8L25nLW9wdGlvbj5cbiAgICAgICAgICA8bmctb3B0aW9uIFt2YWx1ZV09XCInbW91c2VwYWQnXCI+TW91c2VwYWQ8L25nLW9wdGlvbj5cbiAgICAgIDwvbmctc2VsZWN0PlxuICAgICAgPGxhYmVsICpuZ0lmPVwiTm90RHJpdmVyXCIgW25nQ2xhc3NdPVwiJ3RleHQtZGFuZ2VyJ1wiPk5vIHRpZW5lIGVsIGRyaXZlciBpbnN0YWxhZG88L2xhYmVsPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XG4gICAgICA8cCBjbGFzcz1cInRleHQtcHJpbWFyeSBmb250LWxpbmstcnBcIiBzdHlsZT1cInRleHQtYWxpZ246IHJpZ2h0OyBjdXJzb3I6IHBvaW50ZXI7XCIgKGNsaWNrKT1cIm9uQ2xlYXIoKVwiPlxuICAgICAgICAgIExpbXBpYXIgZmlybWFcbiAgICAgIDwvcD5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlciBtdC0xNSBtYi00XCI+XG4gIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zYXZlLXJwXCIgKGNsaWNrKT1cIm9uRG9uZSgpXCI+IFxuICAgICAgPGkgY2xhc3M9XCJpY29uLXNhdmUtd2hpdGVcIj48L2k+IEd1YXJkYXJcbiAgPC9idXR0b24+XG48L2Rpdj4iXX0=