@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
81 lines • 20.2 kB
JavaScript
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import { gettext } from '@c8y/ngx-components';
import { OperationStatus } from '@c8y/client';
import { StatusFilterComponent } from '@c8y/ngx-components/operations/status-filter';
import { BulkOperationsService } from '@c8y/ngx-components/operations/bulk-operations-service';
import { OPERATION_STATUS_LABELS, OPERATION_STATUS_OPTIONS_MAP } from '@c8y/ngx-components/operations/shared';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/ngx-components/operations/bulk-operations-service";
import * as i2 from "@c8y/ngx-components";
import * as i3 from "@angular/common";
import * as i4 from "@c8y/ngx-components/operations/status-filter";
import * as i5 from "./single-operation-item.component";
export class SingleOperationsListComponent {
constructor(bulkOperationsService) {
this.bulkOperationsService = bulkOperationsService;
this.readOnly = false;
this.onRetryFailedOperations = new EventEmitter();
this.OPERATION_STATUS = { ...OperationStatus, ALL: gettext('ALL') };
this.OPERATION_STATUS_LABELS = OPERATION_STATUS_LABELS;
this.OPERATION_STATUS_OPTIONS_MAP = OPERATION_STATUS_OPTIONS_MAP;
}
async ngAfterViewInit() {
if (this.statusFilter) {
this.filterOperationsByType();
}
}
ngOnChanges(changes) {
if (changes.bulkOperation && !changes.bulkOperation.firstChange) {
this.filterOperationsByType();
}
}
filterOperationsByType() {
if (this.statusFilter) {
const typeFilter = this.getFilterTypeOfSingleOperations();
this.statusFilter.preset(typeFilter === this.OPERATION_STATUS.ALL
? []
: [{ label: this.OPERATION_STATUS_LABELS[typeFilter] }]);
}
else {
setTimeout(this.filterOperationsByType.bind(this));
}
}
getFilterTypeOfSingleOperations() {
const progress = this.bulkOperation.progress;
if (progress.failed > 0) {
return this.OPERATION_STATUS.FAILED;
}
else if (progress.failed === 0 && progress.successful === 0 && progress.pending === 0) {
return this.OPERATION_STATUS.EXECUTING;
}
else if (progress.failed === 0 && progress.successful === 0 && progress.executing === 0) {
return this.OPERATION_STATUS.PENDING;
}
else if (progress.failed === 0 && progress.pending === 0 && progress.executing === 0) {
return this.OPERATION_STATUS.SUCCESSFUL;
}
return this.OPERATION_STATUS.ALL;
}
async getOperationsByStatus(filter) {
this.singleOperations = await this.bulkOperationsService.getSingleOperationsByStatus(filter[0] && filter[0].label, this.bulkOperation.id);
}
retryBulkOperation() {
this.onRetryFailedOperations.emit(this.bulkOperation);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SingleOperationsListComponent, deps: [{ token: i1.BulkOperationsService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SingleOperationsListComponent, selector: "c8y-single-operations-list", inputs: { bulkOperation: "bulkOperation", readOnly: "readOnly" }, outputs: { onRetryFailedOperations: "onRetryFailedOperations" }, viewQueries: [{ propertyName: "statusFilter", first: true, predicate: StatusFilterComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container\n *ngIf=\"\n bulkOperation.progress.failed ||\n bulkOperation.progress.executing ||\n bulkOperation.progress.pending ||\n bulkOperation.progress.successful\n \"\n>\n <div class=\"legend form-block p-t-16 m-b-0\" translate>Operations</div>\n <div class=\"d-flex a-i-center\">\n <div class=\"d-flex a-i-center p-b-8\">\n <span class=\"m-r-4 text-medium\" translate>Filter by status</span>\n <c8y-status-filter\n small\n [options]=\"OPERATION_STATUS_OPTIONS_MAP\"\n (onFilterChanged)=\"getOperationsByStatus($event)\"\n ></c8y-status-filter>\n </div>\n <div class=\"m-l-auto p-b-8\" *ngIf=\"!readOnly && bulkOperation.progress.failed > 0\">\n <button\n class=\"btn btn-navbar\"\n (click)=\"retryBulkOperation()\"\n title=\"{{ 'Retry failed operations' | translate }}\"\n >\n <i c8yIcon=\"repeat\" class=\"m-r-4\"></i> <span translate>Retry failed operations</span>\n </button>\n </div>\n </div>\n <div class=\"inner-scroll\">\n <c8y-list-group>\n <div class=\"d-contents\" *c8yFor=\"let operation of singleOperations; loadMore: 'auto'\">\n <c8y-single-operation-item [operation]=\"operation\" [readOnly]=\"readOnly\" class=\"d-contents\">\n </c8y-single-operation-item>\n </div>\n\n <c8y-li *ngIf=\"singleOperations && singleOperations.data.length === 0\">\n <c8y-li-body>\n <div class=\"c8y-empty-state text-center\">\n <h2 class=\"c8y-icon c8y-icon-energy c8y-icon-duocolor m-b-16\"></h2>\n <div>\n <h3 translate>No single operations of the selected status to display.</h3>\n <p class=\"m-b-16\" translate>Single operations will be displayed here</p>\n </div>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n </div>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: i2.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i2.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i2.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i4.StatusFilterComponent, selector: "c8y-status-filter", inputs: ["options", "multiple", "small"], outputs: ["onFilterChanged"] }, { kind: "component", type: i5.SingleOperationItemComponent, selector: "c8y-single-operation-item", inputs: ["operation", "readOnly"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SingleOperationsListComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-single-operations-list', template: "<ng-container\n *ngIf=\"\n bulkOperation.progress.failed ||\n bulkOperation.progress.executing ||\n bulkOperation.progress.pending ||\n bulkOperation.progress.successful\n \"\n>\n <div class=\"legend form-block p-t-16 m-b-0\" translate>Operations</div>\n <div class=\"d-flex a-i-center\">\n <div class=\"d-flex a-i-center p-b-8\">\n <span class=\"m-r-4 text-medium\" translate>Filter by status</span>\n <c8y-status-filter\n small\n [options]=\"OPERATION_STATUS_OPTIONS_MAP\"\n (onFilterChanged)=\"getOperationsByStatus($event)\"\n ></c8y-status-filter>\n </div>\n <div class=\"m-l-auto p-b-8\" *ngIf=\"!readOnly && bulkOperation.progress.failed > 0\">\n <button\n class=\"btn btn-navbar\"\n (click)=\"retryBulkOperation()\"\n title=\"{{ 'Retry failed operations' | translate }}\"\n >\n <i c8yIcon=\"repeat\" class=\"m-r-4\"></i> <span translate>Retry failed operations</span>\n </button>\n </div>\n </div>\n <div class=\"inner-scroll\">\n <c8y-list-group>\n <div class=\"d-contents\" *c8yFor=\"let operation of singleOperations; loadMore: 'auto'\">\n <c8y-single-operation-item [operation]=\"operation\" [readOnly]=\"readOnly\" class=\"d-contents\">\n </c8y-single-operation-item>\n </div>\n\n <c8y-li *ngIf=\"singleOperations && singleOperations.data.length === 0\">\n <c8y-li-body>\n <div class=\"c8y-empty-state text-center\">\n <h2 class=\"c8y-icon c8y-icon-energy c8y-icon-duocolor m-b-16\"></h2>\n <div>\n <h3 translate>No single operations of the selected status to display.</h3>\n <p class=\"m-b-16\" translate>Single operations will be displayed here</p>\n </div>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n </div>\n</ng-container>\n" }]
}], ctorParameters: () => [{ type: i1.BulkOperationsService }], propDecorators: { bulkOperation: [{
type: Input
}], readOnly: [{
type: Input
}], onRetryFailedOperations: [{
type: Output
}], statusFilter: [{
type: ViewChild,
args: [StatusFilterComponent, { static: false }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlLW9wZXJhdGlvbnMtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9vcGVyYXRpb25zL2J1bGstc2luZ2xlLW9wZXJhdGlvbnMtbGlzdC9zaW5nbGUtb3BlcmF0aW9ucy1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL29wZXJhdGlvbnMvYnVsay1zaW5nbGUtb3BlcmF0aW9ucy1saXN0L3NpbmdsZS1vcGVyYXRpb25zLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzlDLE9BQU8sRUFBMkMsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQy9GLE9BQU8sRUFHTCx1QkFBdUIsRUFDdkIsNEJBQTRCLEVBQzdCLE1BQU0sdUNBQXVDLENBQUM7Ozs7Ozs7QUFNL0MsTUFBTSxPQUFPLDZCQUE2QjtJQWV4QyxZQUFvQixxQkFBNEM7UUFBNUMsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQVhoRSxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ1AsNEJBQXVCLEdBQTBDLElBQUksWUFBWSxFQUFFLENBQUM7UUFLOUYscUJBQWdCLEdBQUcsRUFBRSxHQUFHLGVBQWUsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDL0QsNEJBQXVCLEdBQUcsdUJBQXVCLENBQUM7UUFDbEQsaUNBQTRCLEdBQW9DLDRCQUE0QixDQUFDO0lBRzFCLENBQUM7SUFF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QUdQLFlBQVk7c0JBRFgsU0FBUzt1QkFBQyxxQkFBcUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBJT3BlcmF0aW9uLCBJT3BlcmF0aW9uQnVsaywgSVJlc3VsdExpc3QsIE9wZXJhdGlvblN0YXR1cyB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IFN0YXR1c0ZpbHRlckNvbXBvbmVudCB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvb3BlcmF0aW9ucy9zdGF0dXMtZmlsdGVyJztcbmltcG9ydCB7IEJ1bGtPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvb3BlcmF0aW9ucy9idWxrLW9wZXJhdGlvbnMtc2VydmljZSc7XG5pbXBvcnQge1xuICBPcGVyYXRpb25TdGF0dXNPcHRpb24sXG4gIE9wZXJhdGlvblN0YXR1c09wdGlvbnNNYXBTaGFyZWQsXG4gIE9QRVJBVElPTl9TVEFUVVNfTEFCRUxTLFxuICBPUEVSQVRJT05fU1RBVFVTX09QVElPTlNfTUFQXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvb3BlcmF0aW9ucy9zaGFyZWQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktc2luZ2xlLW9wZXJhdGlvbnMtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zaW5nbGUtb3BlcmF0aW9ucy1saXN0LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBTaW5nbGVPcGVyYXRpb25zTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpXG4gIGJ1bGtPcGVyYXRpb246IFBhcnRpYWw8SU9wZXJhdGlvbkJ1bGs+O1xuICBASW5wdXQoKVxuICByZWFkT25seSA9IGZhbHNlO1xuICBAT3V0cHV0KCkgb25SZXRyeUZhaWxlZE9wZXJhdGlvbnM6IEV2ZW50RW1pdHRlcjxQYXJ0aWFsPElPcGVyYXRpb25CdWxrPj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQFZpZXdDaGlsZChTdGF0dXNGaWx0ZXJDb21wb25lbnQsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBzdGF0dXNGaWx0ZXI6IFN0YXR1c0ZpbHRlckNvbXBvbmVudDtcblxuICBPUEVSQVRJT05fU1RBVFVTID0geyAuLi5PcGVyYXRpb25TdGF0dXMsIEFMTDogZ2V0dGV4dCgnQUxMJykgfTtcbiAgT1BFUkFUSU9OX1NUQVRVU19MQUJFTFMgPSBPUEVSQVRJT05fU1RBVFVTX0xBQkVMUztcbiAgT1BFUkFUSU9OX1NUQVRVU19PUFRJT05TX01BUDogT3BlcmF0aW9uU3RhdHVzT3B0aW9uc01hcFNoYXJlZCA9IE9QRVJBVElPTl9TVEFUVVNfT1BUSU9OU19NQVA7XG4gIHNpbmdsZU9wZXJhdGlvbnM6IElSZXN1bHRMaXN0PElPcGVyYXRpb24+O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYnVsa09wZXJhdGlvbnNTZXJ2aWNlOiBCdWxrT3BlcmF0aW9uc1NlcnZpY2UpIHt9XG5cbiAgYXN5bmMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGlmICh0aGlzLnN0YXR1c0ZpbHRlcikge1xuICAgICAgdGhpcy5maWx0ZXJPcGVyYXRpb25zQnlUeXBlKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLmJ1bGtPcGVyYXRpb24gJiYgIWNoYW5nZXMuYnVsa09wZXJhdGlvbi5maXJzdENoYW5nZSkge1xuICAgICAgdGhpcy5maWx0ZXJPcGVyYXRpb25zQnlUeXBlKCk7XG4gICAgfVxuICB9XG5cbiAgZmlsdGVyT3BlcmF0aW9uc0J5VHlwZSgpIHtcbiAgICBpZiAodGhpcy5zdGF0dXNGaWx0ZXIpIHtcbiAgICAgIGNvbnN0IHR5cGVGaWx0ZXIgPSB0aGlzLmdldEZpbHRlclR5cGVPZlNpbmdsZU9wZXJhdGlvbnMoKTtcbiAgICAgIHRoaXMuc3RhdHVzRmlsdGVyLnByZXNldChcbiAgICAgICAgdHlwZUZpbHRlciA9PT0gdGhpcy5PUEVSQVRJT05fU1RBVFVTLkFMTFxuICAgICAgICAgID8gW11cbiAgICAgICAgICA6IFt7IGxhYmVsOiB0aGlzLk9QRVJBVElPTl9TVEFUVVNfTEFCRUxTW3R5cGVGaWx0ZXJdIH1dXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRUaW1lb3V0KHRoaXMuZmlsdGVyT3BlcmF0aW9uc0J5VHlwZS5iaW5kKHRoaXMpKTtcbiAgICB9XG4gIH1cblxuICBnZXRGaWx0ZXJUeXBlT2ZTaW5nbGVPcGVyYXRpb25zKCkge1xuICAgIGNvbnN0IHByb2dyZXNzID0gdGhpcy5idWxrT3BlcmF0aW9uLnByb2dyZXNzO1xuXG4gICAgaWYgKHByb2dyZXNzLmZhaWxlZCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLk9QRVJBVElPTl9TVEFUVVMuRkFJTEVEO1xuICAgIH0gZWxzZSBpZiAocHJvZ3Jlc3MuZmFpbGVkID09PSAwICYmIHByb2dyZXNzLnN1Y2Nlc3NmdWwgPT09IDAgJiYgcHJvZ3Jlc3MucGVuZGluZyA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuT1BFUkFUSU9OX1NUQVRVUy5FWEVDVVRJTkc7XG4gICAgfSBlbHNlIGlmIChwcm9ncmVzcy5mYWlsZWQgPT09IDAgJiYgcHJvZ3Jlc3Muc3VjY2Vzc2Z1bCA9PT0gMCAmJiBwcm9ncmVzcy5leGVjdXRpbmcgPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLk9QRVJBVElPTl9TVEFUVVMuUEVORElORztcbiAgICB9IGVsc2UgaWYgKHByb2dyZXNzLmZhaWxlZCA9PT0gMCAmJiBwcm9ncmVzcy5wZW5kaW5nID09PSAwICYmIHByb2dyZXNzLmV4ZWN1dGluZyA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuT1BFUkFUSU9OX1NUQVRVUy5TVUNDRVNTRlVMO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLk9QRVJBVElPTl9TVEFUVVMuQUxMO1xuICB9XG5cbiAgYXN5bmMgZ2V0T3BlcmF0aW9uc0J5U3RhdHVzKGZpbHRlcjogT3BlcmF0aW9uU3RhdHVzT3B0aW9uW10pIHtcbiAgICB0aGlzLnNpbmdsZU9wZXJhdGlvbnMgPSBhd2FpdCB0aGlzLmJ1bGtPcGVyYXRpb25zU2VydmljZS5nZXRTaW5nbGVPcGVyYXRpb25zQnlTdGF0dXMoXG4gICAgICBmaWx0ZXJbMF0gJiYgZmlsdGVyWzBdLmxhYmVsLFxuICAgICAgdGhpcy5idWxrT3BlcmF0aW9uLmlkXG4gICAgKTtcbiAgfVxuXG4gIHJldHJ5QnVsa09wZXJhdGlvbigpIHtcbiAgICB0aGlzLm9uUmV0cnlGYWlsZWRPcGVyYXRpb25zLmVtaXQodGhpcy5idWxrT3BlcmF0aW9uKTtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lclxuICAqbmdJZj1cIlxuICAgIGJ1bGtPcGVyYXRpb24ucHJvZ3Jlc3MuZmFpbGVkIHx8XG4gICAgYnVsa09wZXJhdGlvbi5wcm9ncmVzcy5leGVjdXRpbmcgfHxcbiAgICBidWxrT3BlcmF0aW9uLnByb2dyZXNzLnBlbmRpbmcgfHxcbiAgICBidWxrT3BlcmF0aW9uLnByb2dyZXNzLnN1Y2Nlc3NmdWxcbiAgXCJcbj5cbiAgPGRpdiBjbGFzcz1cImxlZ2VuZCBmb3JtLWJsb2NrIHAtdC0xNiBtLWItMFwiIHRyYW5zbGF0ZT5PcGVyYXRpb25zPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJkLWZsZXggYS1pLWNlbnRlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYS1pLWNlbnRlciBwLWItOFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJtLXItNCB0ZXh0LW1lZGl1bVwiIHRyYW5zbGF0ZT5GaWx0ZXIgYnkgc3RhdHVzPC9zcGFuPlxuICAgICAgPGM4eS1zdGF0dXMtZmlsdGVyXG4gICAgICAgIHNtYWxsXG4gICAgICAgIFtvcHRpb25zXT1cIk9QRVJBVElPTl9TVEFUVVNfT1BUSU9OU19NQVBcIlxuICAgICAgICAob25GaWx0ZXJDaGFuZ2VkKT1cImdldE9wZXJhdGlvbnNCeVN0YXR1cygkZXZlbnQpXCJcbiAgICAgID48L2M4eS1zdGF0dXMtZmlsdGVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtLWwtYXV0byBwLWItOFwiICpuZ0lmPVwiIXJlYWRPbmx5ICYmIGJ1bGtPcGVyYXRpb24ucHJvZ3Jlc3MuZmFpbGVkID4gMFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0biBidG4tbmF2YmFyXCJcbiAgICAgICAgKGNsaWNrKT1cInJldHJ5QnVsa09wZXJhdGlvbigpXCJcbiAgICAgICAgdGl0bGU9XCJ7eyAnUmV0cnkgZmFpbGVkIG9wZXJhdGlvbnMnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgID5cbiAgICAgICAgPGkgYzh5SWNvbj1cInJlcGVhdFwiIGNsYXNzPVwibS1yLTRcIj48L2k+IDxzcGFuIHRyYW5zbGF0ZT5SZXRyeSBmYWlsZWQgb3BlcmF0aW9uczwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImlubmVyLXNjcm9sbFwiPlxuICAgIDxjOHktbGlzdC1ncm91cD5cbiAgICAgIDxkaXYgY2xhc3M9XCJkLWNvbnRlbnRzXCIgKmM4eUZvcj1cImxldCBvcGVyYXRpb24gb2Ygc2luZ2xlT3BlcmF0aW9uczsgbG9hZE1vcmU6ICdhdXRvJ1wiPlxuICAgICAgICA8Yzh5LXNpbmdsZS1vcGVyYXRpb24taXRlbSBbb3BlcmF0aW9uXT1cIm9wZXJhdGlvblwiIFtyZWFkT25seV09XCJyZWFkT25seVwiIGNsYXNzPVwiZC1jb250ZW50c1wiPlxuICAgICAgICA8L2M4eS1zaW5nbGUtb3BlcmF0aW9uLWl0ZW0+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGM4eS1saSAqbmdJZj1cInNpbmdsZU9wZXJhdGlvbnMgJiYgc2luZ2xlT3BlcmF0aW9ucy5kYXRhLmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICA8Yzh5LWxpLWJvZHk+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImM4eS1lbXB0eS1zdGF0ZSB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgPGgyIGNsYXNzPVwiYzh5LWljb24gYzh5LWljb24tZW5lcmd5IGM4eS1pY29uLWR1b2NvbG9yIG0tYi0xNlwiPjwvaDI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8aDMgdHJhbnNsYXRlPk5vIHNpbmdsZSBvcGVyYXRpb25zIG9mIHRoZSBzZWxlY3RlZCBzdGF0dXMgdG8gZGlzcGxheS48L2gzPlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cIm0tYi0xNlwiIHRyYW5zbGF0ZT5TaW5nbGUgb3BlcmF0aW9ucyB3aWxsIGJlIGRpc3BsYXllZCBoZXJlPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvYzh5LWxpLWJvZHk+XG4gICAgICA8L2M4eS1saT5cbiAgICA8L2M4eS1saXN0LWdyb3VwPlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuIl19