@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
61 lines • 18.7 kB
JavaScript
import { Component, ElementRef, Input, ViewChild } from '@angular/core';
import { InventoryService, OperationService } from '@c8y/client';
import { AlertService, gettext } from '@c8y/ngx-components';
import { ACTIONS_OPERATIONS, BULK_OPERATION_EVENT, COMPONENTS } from '@c8y/ngx-components/operations/product-experience';
import { OPERATION_STATUS_LABELS, OPERATION_STATUS_OPTIONS_MAP } from '@c8y/ngx-components/operations/shared';
import { omit } from 'lodash-es';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/ngx-components";
import * as i2 from "@c8y/client";
import * as i3 from "@angular/common";
import * as i4 from "ngx-bootstrap/popover";
import * as i5 from "@angular/router";
import * as i6 from "ngx-bootstrap/tooltip";
export class SingleOperationItemComponent {
constructor(alertService, inventoryService, operationService) {
this.alertService = alertService;
this.inventoryService = inventoryService;
this.operationService = operationService;
this.BULK_OPERATION_EVENT = BULK_OPERATION_EVENT;
this.ACTIONS = ACTIONS_OPERATIONS;
this.COMPONENTS = COMPONENTS;
this.device = {};
this.OPERATION_STATUS_LABELS = OPERATION_STATUS_LABELS;
this.OPERATION_STATUS_OPTIONS_MAP = OPERATION_STATUS_OPTIONS_MAP;
this.readOnly = false;
}
async ngOnInit() {
this.device = (await this.inventoryService.detail(this.operation.deviceId))?.data;
}
async retrySingleOperation(singleOperation) {
const operationToCreate = omit(singleOperation, [
'id',
'self',
'status',
'failureReason',
'creationTime',
'delivery'
]);
try {
await this.operationService.create(operationToCreate);
this.alertService.success(gettext('Operation created.'));
}
catch (er) {
this.alertService.addServerFailure(er);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SingleOperationItemComponent, deps: [{ token: i1.AlertService }, { token: i2.InventoryService }, { token: i2.OperationService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SingleOperationItemComponent, selector: "c8y-single-operation-item", inputs: { operation: "operation", readOnly: "readOnly" }, viewQueries: [{ propertyName: "failureReasonRef", first: true, predicate: ["failureReason"], descendants: true, static: true }], ngImport: i0, template: "<c8y-li class=\"c8y-list__item--double-actions\">\n <c8y-li-icon>\n <i\n [c8yIcon]=\"OPERATION_STATUS_OPTIONS_MAP[operation.status].icon\"\n [tooltip]=\"operation.status.toString() | translate\"\n [ngClass]=\"OPERATION_STATUS_OPTIONS_MAP[operation.status].styleClass\"\n ></i>\n </c8y-li-icon>\n <div [ngClass]=\"{ 'content-flex-80': !readOnly, 'content-flex-50': readOnly }\">\n <div class=\"col-4\">\n <span class=\"m-r-4\">\n <device-status [mo]=\"device\"></device-status>\n </span>\n <a\n [routerLink]=\"['/device', operation.deviceId, 'device-info']\"\n routerLinkActive=\"active\"\n >\n {{ operation.deviceName }}\n </a>\n </div>\n <div class=\"col-3\">\n <small class=\"icon-flex text-muted\">\n <i\n class=\"m-r-4\"\n c8yIcon=\"calendar\"\n ></i>\n {{ operation.creationTime | c8yDate }}\n </small>\n </div>\n <div class=\"col-5\">\n <div class=\"d-flex a-i-center\">\n <span\n class=\"text-truncate\"\n #failureReason\n >\n {{ operation.failureReason | translate }}\n </span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ operation.failureReason | translate }}\"\n placement=\"left\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"failureReason.offsetWidth < failureReason.scrollWidth\"\n >\n <i [c8yIcon]=\"'info-circle'\"></i>\n </button>\n <div\n class=\"showOnHover p-l-8 p-r-8 fit-h-20 m-l-auto\"\n *ngIf=\"\n !readOnly &&\n operation.status.toString() == OPERATION_STATUS_OPTIONS_MAP.FAILED.status.toString()\n \"\n >\n <button\n class=\"btn btn-default btn-xs\"\n title=\"{{ 'Retry operation' | translate }}\"\n type=\"button\"\n (click)=\"retrySingleOperation(operation)\"\n c8yProductExperience\n [actionName]=\"BULK_OPERATION_EVENT\"\n [actionData]=\"{ action: ACTIONS.RETRY, component: COMPONENTS.SINGLE_OPERATION_ITEM }\"\n >\n <i [c8yIcon]=\"'repeat m-r-4'\"></i>\n {{ 'Retry operation' | translate }}\n </button>\n </div>\n </div>\n </div>\n </div>\n</c8y-li>\n", dependencies: [{ kind: "directive", type: i1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1.DeviceStatusComponent, selector: "device-status, c8y-device-status", inputs: ["mo", "size"] }, { kind: "component", type: i1.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i1.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "directive", type: i1.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "directive", type: i4.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: i5.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i5.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: i6.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i1.DatePipe, name: "c8yDate" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SingleOperationItemComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-single-operation-item', template: "<c8y-li class=\"c8y-list__item--double-actions\">\n <c8y-li-icon>\n <i\n [c8yIcon]=\"OPERATION_STATUS_OPTIONS_MAP[operation.status].icon\"\n [tooltip]=\"operation.status.toString() | translate\"\n [ngClass]=\"OPERATION_STATUS_OPTIONS_MAP[operation.status].styleClass\"\n ></i>\n </c8y-li-icon>\n <div [ngClass]=\"{ 'content-flex-80': !readOnly, 'content-flex-50': readOnly }\">\n <div class=\"col-4\">\n <span class=\"m-r-4\">\n <device-status [mo]=\"device\"></device-status>\n </span>\n <a\n [routerLink]=\"['/device', operation.deviceId, 'device-info']\"\n routerLinkActive=\"active\"\n >\n {{ operation.deviceName }}\n </a>\n </div>\n <div class=\"col-3\">\n <small class=\"icon-flex text-muted\">\n <i\n class=\"m-r-4\"\n c8yIcon=\"calendar\"\n ></i>\n {{ operation.creationTime | c8yDate }}\n </small>\n </div>\n <div class=\"col-5\">\n <div class=\"d-flex a-i-center\">\n <span\n class=\"text-truncate\"\n #failureReason\n >\n {{ operation.failureReason | translate }}\n </span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ operation.failureReason | translate }}\"\n placement=\"left\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"failureReason.offsetWidth < failureReason.scrollWidth\"\n >\n <i [c8yIcon]=\"'info-circle'\"></i>\n </button>\n <div\n class=\"showOnHover p-l-8 p-r-8 fit-h-20 m-l-auto\"\n *ngIf=\"\n !readOnly &&\n operation.status.toString() == OPERATION_STATUS_OPTIONS_MAP.FAILED.status.toString()\n \"\n >\n <button\n class=\"btn btn-default btn-xs\"\n title=\"{{ 'Retry operation' | translate }}\"\n type=\"button\"\n (click)=\"retrySingleOperation(operation)\"\n c8yProductExperience\n [actionName]=\"BULK_OPERATION_EVENT\"\n [actionData]=\"{ action: ACTIONS.RETRY, component: COMPONENTS.SINGLE_OPERATION_ITEM }\"\n >\n <i [c8yIcon]=\"'repeat m-r-4'\"></i>\n {{ 'Retry operation' | translate }}\n </button>\n </div>\n </div>\n </div>\n </div>\n</c8y-li>\n" }]
}], ctorParameters: () => [{ type: i1.AlertService }, { type: i2.InventoryService }, { type: i2.OperationService }], propDecorators: { operation: [{
type: Input
}], readOnly: [{
type: Input
}], failureReasonRef: [{
type: ViewChild,
args: ['failureReason', { static: true }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlLW9wZXJhdGlvbi1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL29wZXJhdGlvbnMvYnVsay1zaW5nbGUtb3BlcmF0aW9ucy1saXN0L3NpbmdsZS1vcGVyYXRpb24taXRlbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9vcGVyYXRpb25zL2J1bGstc2luZ2xlLW9wZXJhdGlvbnMtbGlzdC9zaW5nbGUtb3BlcmF0aW9uLWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQWMsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0UsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQixVQUFVLEVBQ1gsTUFBTSxtREFBbUQsQ0FBQztBQUMzRCxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLDRCQUE0QixFQUM3QixNQUFNLHVDQUF1QyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7Ozs7Ozs7O0FBTWpDLE1BQU0sT0FBTyw0QkFBNEI7SUFhdkMsWUFDVSxZQUEwQixFQUMxQixnQkFBa0MsRUFDbEMsZ0JBQWtDO1FBRmxDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQWY1Qyx5QkFBb0IsR0FBRyxvQkFBb0IsQ0FBQztRQUM1QyxZQUFPLEdBQUcsa0JBQWtCLENBQUM7UUFDN0IsZUFBVSxHQUFHLFVBQVUsQ0FBQztRQUN4QixXQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ1osNEJBQXVCLEdBQUcsdUJBQXVCLENBQUM7UUFDbEQsaUNBQTRCLEdBQW9DLDRCQUE0QixDQUFDO1FBSTdGLGFBQVEsR0FBRyxLQUFLLENBQUM7SUFPZCxDQUFDO0lBRUosS0FBSyxDQUFDLFFBQVE7UUFDWixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7SUFDcEYsQ0FBQztJQUVELEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlO1FBQ3hDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUM5QyxJQUFJO1lBQ0osTUFBTTtZQUNOLFFBQVE7WUFDUixlQUFlO1lBQ2YsY0FBYztZQUNkLFVBQVU7U0FDWCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ1osSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FBQzsrR0F2Q1UsNEJBQTRCO21HQUE1Qiw0QkFBNEIsNFBDbkJ6QyxxNEVBd0VBOzs0RkRyRGEsNEJBQTRCO2tCQUp4QyxTQUFTOytCQUNFLDJCQUEyQjsrSUFXckMsU0FBUztzQkFEUixLQUFLO2dCQUdOLFFBQVE7c0JBRFAsS0FBSztnQkFFd0MsZ0JBQWdCO3NCQUE3RCxTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEludmVudG9yeVNlcnZpY2UsIElPcGVyYXRpb24sIE9wZXJhdGlvblNlcnZpY2UgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UsIGdldHRleHQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7XG4gIEFDVElPTlNfT1BFUkFUSU9OUyxcbiAgQlVMS19PUEVSQVRJT05fRVZFTlQsXG4gIENPTVBPTkVOVFNcbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9vcGVyYXRpb25zL3Byb2R1Y3QtZXhwZXJpZW5jZSc7XG5pbXBvcnQge1xuICBPcGVyYXRpb25TdGF0dXNPcHRpb25zTWFwU2hhcmVkLFxuICBPUEVSQVRJT05fU1RBVFVTX0xBQkVMUyxcbiAgT1BFUkFUSU9OX1NUQVRVU19PUFRJT05TX01BUFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL29wZXJhdGlvbnMvc2hhcmVkJztcbmltcG9ydCB7IG9taXQgfSBmcm9tICdsb2Rhc2gtZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktc2luZ2xlLW9wZXJhdGlvbi1pdGVtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NpbmdsZS1vcGVyYXRpb24taXRlbS5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgU2luZ2xlT3BlcmF0aW9uSXRlbUNvbXBvbmVudCB7XG4gIEJVTEtfT1BFUkFUSU9OX0VWRU5UID0gQlVMS19PUEVSQVRJT05fRVZFTlQ7XG4gIEFDVElPTlMgPSBBQ1RJT05TX09QRVJBVElPTlM7XG4gIENPTVBPTkVOVFMgPSBDT01QT05FTlRTO1xuICBkZXZpY2UgPSB7fTtcbiAgT1BFUkFUSU9OX1NUQVRVU19MQUJFTFMgPSBPUEVSQVRJT05fU1RBVFVTX0xBQkVMUztcbiAgT1BFUkFUSU9OX1NUQVRVU19PUFRJT05TX01BUDogT3BlcmF0aW9uU3RhdHVzT3B0aW9uc01hcFNoYXJlZCA9IE9QRVJBVElPTl9TVEFUVVNfT1BUSU9OU19NQVA7XG4gIEBJbnB1dCgpXG4gIG9wZXJhdGlvbjogSU9wZXJhdGlvbjtcbiAgQElucHV0KClcbiAgcmVhZE9ubHkgPSBmYWxzZTtcbiAgQFZpZXdDaGlsZCgnZmFpbHVyZVJlYXNvbicsIHsgc3RhdGljOiB0cnVlIH0pIGZhaWx1cmVSZWFzb25SZWY6IEVsZW1lbnRSZWY7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIGludmVudG9yeVNlcnZpY2U6IEludmVudG9yeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBvcGVyYXRpb25TZXJ2aWNlOiBPcGVyYXRpb25TZXJ2aWNlXG4gICkge31cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmRldmljZSA9IChhd2FpdCB0aGlzLmludmVudG9yeVNlcnZpY2UuZGV0YWlsKHRoaXMub3BlcmF0aW9uLmRldmljZUlkKSk/LmRhdGE7XG4gIH1cblxuICBhc3luYyByZXRyeVNpbmdsZU9wZXJhdGlvbihzaW5nbGVPcGVyYXRpb24pIHtcbiAgICBjb25zdCBvcGVyYXRpb25Ub0NyZWF0ZSA9IG9taXQoc2luZ2xlT3BlcmF0aW9uLCBbXG4gICAgICAnaWQnLFxuICAgICAgJ3NlbGYnLFxuICAgICAgJ3N0YXR1cycsXG4gICAgICAnZmFpbHVyZVJlYXNvbicsXG4gICAgICAnY3JlYXRpb25UaW1lJyxcbiAgICAgICdkZWxpdmVyeSdcbiAgICBdKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLm9wZXJhdGlvblNlcnZpY2UuY3JlYXRlKG9wZXJhdGlvblRvQ3JlYXRlKTtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnT3BlcmF0aW9uIGNyZWF0ZWQuJykpO1xuICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGVyKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxjOHktbGkgY2xhc3M9XCJjOHktbGlzdF9faXRlbS0tZG91YmxlLWFjdGlvbnNcIj5cbiAgPGM4eS1saS1pY29uPlxuICAgIDxpXG4gICAgICBbYzh5SWNvbl09XCJPUEVSQVRJT05fU1RBVFVTX09QVElPTlNfTUFQW29wZXJhdGlvbi5zdGF0dXNdLmljb25cIlxuICAgICAgW3Rvb2x0aXBdPVwib3BlcmF0aW9uLnN0YXR1cy50b1N0cmluZygpIHwgdHJhbnNsYXRlXCJcbiAgICAgIFtuZ0NsYXNzXT1cIk9QRVJBVElPTl9TVEFUVVNfT1BUSU9OU19NQVBbb3BlcmF0aW9uLnN0YXR1c10uc3R5bGVDbGFzc1wiXG4gICAgPjwvaT5cbiAgPC9jOHktbGktaWNvbj5cbiAgPGRpdiBbbmdDbGFzc109XCJ7ICdjb250ZW50LWZsZXgtODAnOiAhcmVhZE9ubHksICdjb250ZW50LWZsZXgtNTAnOiByZWFkT25seSB9XCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbC00XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cIm0tci00XCI+XG4gICAgICAgIDxkZXZpY2Utc3RhdHVzIFttb109XCJkZXZpY2VcIj48L2RldmljZS1zdGF0dXM+XG4gICAgICA8L3NwYW4+XG4gICAgICA8YVxuICAgICAgICBbcm91dGVyTGlua109XCJbJy9kZXZpY2UnLCBvcGVyYXRpb24uZGV2aWNlSWQsICdkZXZpY2UtaW5mbyddXCJcbiAgICAgICAgcm91dGVyTGlua0FjdGl2ZT1cImFjdGl2ZVwiXG4gICAgICA+XG4gICAgICAgIHt7IG9wZXJhdGlvbi5kZXZpY2VOYW1lIH19XG4gICAgICA8L2E+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbC0zXCI+XG4gICAgICA8c21hbGwgY2xhc3M9XCJpY29uLWZsZXggdGV4dC1tdXRlZFwiPlxuICAgICAgICA8aVxuICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgIGM4eUljb249XCJjYWxlbmRhclwiXG4gICAgICAgID48L2k+XG4gICAgICAgIHt7IG9wZXJhdGlvbi5jcmVhdGlvblRpbWUgfCBjOHlEYXRlIH19XG4gICAgICA8L3NtYWxsPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtNVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhLWktY2VudGVyXCI+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCJcbiAgICAgICAgICAjZmFpbHVyZVJlYXNvblxuICAgICAgICA+XG4gICAgICAgICAge3sgb3BlcmF0aW9uLmZhaWx1cmVSZWFzb24gfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJidG4taGVscCBidG4taGVscC0tc21cIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBwb3BvdmVyPVwie3sgb3BlcmF0aW9uLmZhaWx1cmVSZWFzb24gfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgIHBsYWNlbWVudD1cImxlZnRcIlxuICAgICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICpuZ0lmPVwiZmFpbHVyZVJlYXNvbi5vZmZzZXRXaWR0aCA8IGZhaWx1cmVSZWFzb24uc2Nyb2xsV2lkdGhcIlxuICAgICAgICA+XG4gICAgICAgICAgPGkgW2M4eUljb25dPVwiJ2luZm8tY2lyY2xlJ1wiPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInNob3dPbkhvdmVyIHAtbC04IHAtci04IGZpdC1oLTIwIG0tbC1hdXRvXCJcbiAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgIXJlYWRPbmx5ICYmXG4gICAgICAgICAgICBvcGVyYXRpb24uc3RhdHVzLnRvU3RyaW5nKCkgPT0gT1BFUkFUSU9OX1NUQVRVU19PUFRJT05TX01BUC5GQUlMRUQuc3RhdHVzLnRvU3RyaW5nKClcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXhzXCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ1JldHJ5IG9wZXJhdGlvbicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwicmV0cnlTaW5nbGVPcGVyYXRpb24ob3BlcmF0aW9uKVwiXG4gICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgW2FjdGlvbk5hbWVdPVwiQlVMS19PUEVSQVRJT05fRVZFTlRcIlxuICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwieyBhY3Rpb246IEFDVElPTlMuUkVUUlksIGNvbXBvbmVudDogQ09NUE9ORU5UUy5TSU5HTEVfT1BFUkFUSU9OX0lURU0gfVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgW2M4eUljb25dPVwiJ3JlcGVhdCBtLXItNCdcIj48L2k+XG4gICAgICAgICAgICB7eyAnUmV0cnkgb3BlcmF0aW9uJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvYzh5LWxpPlxuIl19