UNPKG

@vendasta/store

Version:

Components and data for Store

83 lines 18.3 kB
import { Component, Input } from '@angular/core'; import { RevenuePeriod } from '@vendasta/sales-orders'; import { BehaviorSubject } from 'rxjs'; import { salesOrderPeriodToBillingFrequency } from '../../shared/conversion-utils'; import { OrderSummaryService } from '../order-summary.service'; import * as i0 from "@angular/core"; import * as i1 from "@angular/material/expansion"; import * as i2 from "@angular/common"; import * as i3 from "@ngx-translate/core"; import * as i4 from "@vendasta/galaxy/pipes"; const onceFrequency = salesOrderPeriodToBillingFrequency(RevenuePeriod.ONETIME).toUpperCase(); export class OrderSummarizedChargesComponent { constructor() { this.orderCharges$$ = new BehaviorSubject(null); this.orderCharges$ = this.orderCharges$$.asObservable(); } set orderItems(orderItems) { const summaryItems = OrderSummaryService.getPriceSummary(orderItems); this._orderItems = summaryItems.items; this.orderCharges$$.next(this.calculateOrderCharges(this._orderItems, this._taxOptions)); } set taxOptions(taxOptions) { this._taxOptions = taxOptions; this.orderCharges$$.next(this.calculateOrderCharges(this._orderItems, this._taxOptions)); } calculateOrderCharges(orderItems, taxOptions) { const orderCharges = new Map(); (orderItems || []).forEach((orderItem) => { this.addCharge(orderItem.revenueComponents, orderCharges); }); this.addTaxes(taxOptions, orderCharges); this.convertChargesToDollars(orderCharges); return { charges: orderCharges, currency: orderItems.length > 0 ? orderItems[0].currencyCode : null, }; } addCharge(prices, orderCharges) { prices.forEach((price) => { const frequency = salesOrderPeriodToBillingFrequency(price.period); const formattedFrequency = frequency.toUpperCase(); if (formattedFrequency !== onceFrequency) { const frequencyTotal = orderCharges.get(formattedFrequency) || 0; if (frequencyTotal + price.value > 0) { // Don't show free charges. orderCharges.set(formattedFrequency, frequencyTotal + price.value); } } }); } addTaxes(taxOptions, orderCharges) { const orderTaxes = new Map(); (taxOptions || []).forEach((taxOption) => { orderCharges.forEach((frequencyTotal, frequencyKey) => { const frequencyTax = orderTaxes.get(frequencyKey) || 0; const tax = frequencyTotal * taxOption.percentageMultiplier; orderTaxes.set(frequencyKey, frequencyTax + tax); }); }); orderCharges.forEach((frequencyTotal, frequencyKey) => { frequencyTotal += orderTaxes.get(frequencyKey) || 0; orderCharges.set(frequencyKey, frequencyTotal); }); } convertChargesToDollars(orderCharges) { orderCharges.forEach((frequencyTotal, frequencyKey) => { orderCharges.set(frequencyKey, frequencyTotal / 100); }); } } OrderSummarizedChargesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: OrderSummarizedChargesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); OrderSummarizedChargesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.2", type: OrderSummarizedChargesComponent, selector: "app-order-summarized-charges", inputs: { orderItems: "orderItems", taxOptions: "taxOptions", expanded: "expanded" }, ngImport: i0, template: "<ng-container *ngIf=\"orderCharges$ | async as orderCharges\">\n <ng-container *ngIf=\"orderCharges.charges.size > 0\">\n <mat-expansion-panel class=\"charges-panel\" [expanded]=\"expanded\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n {{ 'FRONTEND.STORE.RECURRING_CHARGES_SUMMARY.TITLE' | translate }}\n </mat-panel-title>\n </mat-expansion-panel-header>\n <ng-container *ngFor=\"let frequencyKey of orderCharges.charges.keys()\">\n <div class=\"charges-row\">\n <span>\n {{ 'FRONTEND.STORE.PERIODS.' + frequencyKey | translate }}\n </span>\n <span class=\"recurring-charge\">\n {{\n orderCharges.charges.get(frequencyKey)\n | glxyCurrency: orderCharges.currency\n }}\n </span>\n </div>\n </ng-container>\n </mat-expansion-panel>\n </ng-container>\n</ng-container>\n", styles: ["::ng-deep mat-expansion-panel.charges-panel{background-color:#fafafa;box-shadow:none}::ng-deep mat-expansion-panel.charges-panel.mat-expansion-panel{border-radius:0;border:none;border-top:1px solid #e0e0e0}::ng-deep mat-expansion-panel.charges-panel mat-expansion-panel-header{padding:0 16px}::ng-deep mat-expansion-panel.charges-panel mat-expansion-panel-header span.mat-content{flex:unset}::ng-deep mat-expansion-panel.charges-panel .mat-expansion-panel-body{border-top:none;padding:0 16px 16px}.charges-panel .charges-row{display:flex;flex-direction:row;margin:8px 0}.charges-panel .charges-row .recurring-charge{margin-left:auto}\n"], components: [{ type: i1.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { type: i1.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.MatExpansionPanelTitle, selector: "mat-panel-title" }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "async": i2.AsyncPipe, "translate": i3.TranslatePipe, "glxyCurrency": i4.GalaxyCurrencyPipe } }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: OrderSummarizedChargesComponent, decorators: [{ type: Component, args: [{ selector: 'app-order-summarized-charges', template: "<ng-container *ngIf=\"orderCharges$ | async as orderCharges\">\n <ng-container *ngIf=\"orderCharges.charges.size > 0\">\n <mat-expansion-panel class=\"charges-panel\" [expanded]=\"expanded\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n {{ 'FRONTEND.STORE.RECURRING_CHARGES_SUMMARY.TITLE' | translate }}\n </mat-panel-title>\n </mat-expansion-panel-header>\n <ng-container *ngFor=\"let frequencyKey of orderCharges.charges.keys()\">\n <div class=\"charges-row\">\n <span>\n {{ 'FRONTEND.STORE.PERIODS.' + frequencyKey | translate }}\n </span>\n <span class=\"recurring-charge\">\n {{\n orderCharges.charges.get(frequencyKey)\n | glxyCurrency: orderCharges.currency\n }}\n </span>\n </div>\n </ng-container>\n </mat-expansion-panel>\n </ng-container>\n</ng-container>\n", styles: ["::ng-deep mat-expansion-panel.charges-panel{background-color:#fafafa;box-shadow:none}::ng-deep mat-expansion-panel.charges-panel.mat-expansion-panel{border-radius:0;border:none;border-top:1px solid #e0e0e0}::ng-deep mat-expansion-panel.charges-panel mat-expansion-panel-header{padding:0 16px}::ng-deep mat-expansion-panel.charges-panel mat-expansion-panel-header span.mat-content{flex:unset}::ng-deep mat-expansion-panel.charges-panel .mat-expansion-panel-body{border-top:none;padding:0 16px 16px}.charges-panel .charges-row{display:flex;flex-direction:row;margin:8px 0}.charges-panel .charges-row .recurring-charge{margin-left:auto}\n"] }] }], ctorParameters: function () { return []; }, propDecorators: { orderItems: [{ type: Input }], taxOptions: [{ type: Input }], expanded: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItc3VtbWFyaXplZC1jaGFyZ2VzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc3RvcmUvc3JjL2xpYi9vcmRlci1zdW1tYXJ5L29yZGVyLXN1bW1hcml6ZWQtY2hhcmdlcy9vcmRlci1zdW1tYXJpemVkLWNoYXJnZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zdG9yZS9zcmMvbGliL29yZGVyLXN1bW1hcnkvb3JkZXItc3VtbWFyaXplZC1jaGFyZ2VzL29yZGVyLXN1bW1hcml6ZWQtY2hhcmdlcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQW9CLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdkMsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbkYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7OztBQU8vRCxNQUFNLGFBQWEsR0FBRyxrQ0FBa0MsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7QUFPOUYsTUFBTSxPQUFPLCtCQUErQjtJQXNCMUM7UUFIUSxtQkFBYyxHQUFHLElBQUksZUFBZSxDQUFlLElBQUksQ0FBQyxDQUFDO1FBQzFELGtCQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUUzQyxDQUFDO0lBckJoQixJQUNJLFVBQVUsQ0FBQyxVQUF3QjtRQUNyQyxNQUFNLFlBQVksR0FBRyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLFdBQVcs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LENBQUM7WUFDcEQsWUFBWSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sdUJBQXVCLENBQUMsWUFBaUM7UUFDL0QsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLGNBQWMsRUFBRSxZQUFZLEVBQUUsRUFBRTtZQUNwRCxZQUFZLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxjQUFjLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDdkQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOzs0SEF0RVUsK0JBQStCO2dIQUEvQiwrQkFBK0IsMEpDbkI1Qyw0NkJBd0JBOzJGRExhLCtCQUErQjtrQkFMM0MsU0FBUzsrQkFDRSw4QkFBOEI7MEVBTXBDLFVBQVU7c0JBRGIsS0FBSztnQkFRRixVQUFVO3NCQURiLEtBQUs7Z0JBTUcsUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJldmVudWVDb21wb25lbnQsIFJldmVudWVQZXJpb2QgfSBmcm9tICdAdmVuZGFzdGEvc2FsZXMtb3JkZXJzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU3VtbWFyeUl0ZW0sIFRheE9wdGlvbiwgVUlMaW5lSXRlbSB9IGZyb20gJy4uLy4uL29yZGVyLWZvcm0vb3JkZXItaXRlbS1saXN0L2ludGVyZmFjZSc7XG5pbXBvcnQgeyBzYWxlc09yZGVyUGVyaW9kVG9CaWxsaW5nRnJlcXVlbmN5IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2NvbnZlcnNpb24tdXRpbHMnO1xuaW1wb3J0IHsgT3JkZXJTdW1tYXJ5U2VydmljZSB9IGZyb20gJy4uL29yZGVyLXN1bW1hcnkuc2VydmljZSc7XG5cbmludGVyZmFjZSBPcmRlckNoYXJnZXMge1xuICBjaGFyZ2VzOiBNYXA8c3RyaW5nLCBudW1iZXI+O1xuICBjdXJyZW5jeTogc3RyaW5nO1xufVxuXG5jb25zdCBvbmNlRnJlcXVlbmN5ID0gc2FsZXNPcmRlclBlcmlvZFRvQmlsbGluZ0ZyZXF1ZW5jeShSZXZlbnVlUGVyaW9kLk9ORVRJTUUpLnRvVXBwZXJDYXNlKCk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1vcmRlci1zdW1tYXJpemVkLWNoYXJnZXMnLFxuICB0ZW1wbGF0ZVVybDogJy4vb3JkZXItc3VtbWFyaXplZC1jaGFyZ2VzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vb3JkZXItc3VtbWFyaXplZC1jaGFyZ2VzLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIE9yZGVyU3VtbWFyaXplZENoYXJnZXNDb21wb25lbnQge1xuICBASW5wdXQoKVxuICBzZXQgb3JkZXJJdGVtcyhvcmRlckl0ZW1zOiBVSUxpbmVJdGVtW10pIHtcbiAgICBjb25zdCBzdW1tYXJ5SXRlbXMgPSBPcmRlclN1bW1hcnlTZXJ2aWNlLmdldFByaWNlU3VtbWFyeShvcmRlckl0ZW1zKTtcbiAgICB0aGlzLl9vcmRlckl0ZW1zID0gc3VtbWFyeUl0ZW1zLml0ZW1zO1xuICAgIHRoaXMub3JkZXJDaGFyZ2VzJCQubmV4dCh0aGlzLmNhbGN1bGF0ZU9yZGVyQ2hhcmdlcyh0aGlzLl9vcmRlckl0ZW1zLCB0aGlzLl90YXhPcHRpb25zKSk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgdGF4T3B0aW9ucyh0YXhPcHRpb25zOiBUYXhPcHRpb25bXSkge1xuICAgIHRoaXMuX3RheE9wdGlvbnMgPSB0YXhPcHRpb25zO1xuICAgIHRoaXMub3JkZXJDaGFyZ2VzJCQubmV4dCh0aGlzLmNhbGN1bGF0ZU9yZGVyQ2hhcmdlcyh0aGlzLl9vcmRlckl0ZW1zLCB0aGlzLl90YXhPcHRpb25zKSk7XG4gIH1cblxuICBASW5wdXQoKSBleHBhbmRlZDogYm9vbGVhbjtcblxuICBwcml2YXRlIF9vcmRlckl0ZW1zOiBTdW1tYXJ5SXRlbVtdO1xuICBwcml2YXRlIF90YXhPcHRpb25zOiBUYXhPcHRpb25bXTtcblxuICBwcml2YXRlIG9yZGVyQ2hhcmdlcyQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxPcmRlckNoYXJnZXM+KG51bGwpO1xuICBwdWJsaWMgb3JkZXJDaGFyZ2VzJCA9IHRoaXMub3JkZXJDaGFyZ2VzJCQuYXNPYnNlcnZhYmxlKCk7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlT3JkZXJDaGFyZ2VzKG9yZGVySXRlbXM6IFN1bW1hcnlJdGVtW10sIHRheE9wdGlvbnM6IFRheE9wdGlvbltdKTogT3JkZXJDaGFyZ2VzIHtcbiAgICBjb25zdCBvcmRlckNoYXJnZXMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIChvcmRlckl0ZW1zIHx8IFtdKS5mb3JFYWNoKChvcmRlckl0ZW0pID0+IHtcbiAgICAgIHRoaXMuYWRkQ2hhcmdlKG9yZGVySXRlbS5yZXZlbnVlQ29tcG9uZW50cywgb3JkZXJDaGFyZ2VzKTtcbiAgICB9KTtcbiAgICB0aGlzLmFkZFRheGVzKHRheE9wdGlvbnMsIG9yZGVyQ2hhcmdlcyk7XG4gICAgdGhpcy5jb252ZXJ0Q2hhcmdlc1RvRG9sbGFycyhvcmRlckNoYXJnZXMpO1xuICAgIHJldHVybiB7XG4gICAgICBjaGFyZ2VzOiBvcmRlckNoYXJnZXMsXG4gICAgICBjdXJyZW5jeTogb3JkZXJJdGVtcy5sZW5ndGggPiAwID8gb3JkZXJJdGVtc1swXS5jdXJyZW5jeUNvZGUgOiBudWxsLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFkZENoYXJnZShwcmljZXM6IFJldmVudWVDb21wb25lbnRbXSwgb3JkZXJDaGFyZ2VzOiBNYXA8c3RyaW5nLCBudW1iZXI+KTogdm9pZCB7XG4gICAgcHJpY2VzLmZvckVhY2goKHByaWNlKSA9PiB7XG4gICAgICBjb25zdCBmcmVxdWVuY3kgPSBzYWxlc09yZGVyUGVyaW9kVG9CaWxsaW5nRnJlcXVlbmN5KHByaWNlLnBlcmlvZCk7XG4gICAgICBjb25zdCBmb3JtYXR0ZWRGcmVxdWVuY3kgPSBmcmVxdWVuY3kudG9VcHBlckNhc2UoKTtcbiAgICAgIGlmIChmb3JtYXR0ZWRGcmVxdWVuY3kgIT09IG9uY2VGcmVxdWVuY3kpIHtcbiAgICAgICAgY29uc3QgZnJlcXVlbmN5VG90YWwgPSBvcmRlckNoYXJnZXMuZ2V0KGZvcm1hdHRlZEZyZXF1ZW5jeSkgfHwgMDtcbiAgICAgICAgaWYgKGZyZXF1ZW5jeVRvdGFsICsgcHJpY2UudmFsdWUgPiAwKSB7XG4gICAgICAgICAgLy8gRG9uJ3Qgc2hvdyBmcmVlIGNoYXJnZXMuXG4gICAgICAgICAgb3JkZXJDaGFyZ2VzLnNldChmb3JtYXR0ZWRGcmVxdWVuY3ksIGZyZXF1ZW5jeVRvdGFsICsgcHJpY2UudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFkZFRheGVzKHRheE9wdGlvbnM6IFRheE9wdGlvbltdLCBvcmRlckNoYXJnZXM6IE1hcDxzdHJpbmcsIG51bWJlcj4pOiB2b2lkIHtcbiAgICBjb25zdCBvcmRlclRheGVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICAodGF4T3B0aW9ucyB8fCBbXSkuZm9yRWFjaCgodGF4T3B0aW9uKSA9PiB7XG4gICAgICBvcmRlckNoYXJnZXMuZm9yRWFjaCgoZnJlcXVlbmN5VG90YWwsIGZyZXF1ZW5jeUtleSkgPT4ge1xuICAgICAgICBjb25zdCBmcmVxdWVuY3lUYXggPSBvcmRlclRheGVzLmdldChmcmVxdWVuY3lLZXkpIHx8IDA7XG4gICAgICAgIGNvbnN0IHRheCA9IGZyZXF1ZW5jeVRvdGFsICogdGF4T3B0aW9uLnBlcmNlbnRhZ2VNdWx0aXBsaWVyO1xuICAgICAgICBvcmRlclRheGVzLnNldChmcmVxdWVuY3lLZXksIGZyZXF1ZW5jeVRheCArIHRheCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBvcmRlckNoYXJnZXMuZm9yRWFjaCgoZnJlcXVlbmN5VG90YWwsIGZyZXF1ZW5jeUtleSkgPT4ge1xuICAgICAgZnJlcXVlbmN5VG90YWwgKz0gb3JkZXJUYXhlcy5nZXQoZnJlcXVlbmN5S2V5KSB8fCAwO1xuICAgICAgb3JkZXJDaGFyZ2VzLnNldChmcmVxdWVuY3lLZXksIGZyZXF1ZW5jeVRvdGFsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydENoYXJnZXNUb0RvbGxhcnMob3JkZXJDaGFyZ2VzOiBNYXA8c3RyaW5nLCBudW1iZXI+KTogdm9pZCB7XG4gICAgb3JkZXJDaGFyZ2VzLmZvckVhY2goKGZyZXF1ZW5jeVRvdGFsLCBmcmVxdWVuY3lLZXkpID0+IHtcbiAgICAgIG9yZGVyQ2hhcmdlcy5zZXQoZnJlcXVlbmN5S2V5LCBmcmVxdWVuY3lUb3RhbCAvIDEwMCk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJvcmRlckNoYXJnZXMkIHwgYXN5bmMgYXMgb3JkZXJDaGFyZ2VzXCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJvcmRlckNoYXJnZXMuY2hhcmdlcy5zaXplID4gMFwiPlxuICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsIGNsYXNzPVwiY2hhcmdlcy1wYW5lbFwiIFtleHBhbmRlZF09XCJleHBhbmRlZFwiPlxuICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICA8bWF0LXBhbmVsLXRpdGxlPlxuICAgICAgICAgIHt7ICdGUk9OVEVORC5TVE9SRS5SRUNVUlJJTkdfQ0hBUkdFU19TVU1NQVJZLlRJVExFJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L21hdC1wYW5lbC10aXRsZT5cbiAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmcmVxdWVuY3lLZXkgb2Ygb3JkZXJDaGFyZ2VzLmNoYXJnZXMua2V5cygpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjaGFyZ2VzLXJvd1wiPlxuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAge3sgJ0ZST05URU5ELlNUT1JFLlBFUklPRFMuJyArIGZyZXF1ZW5jeUtleSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlY3VycmluZy1jaGFyZ2VcIj5cbiAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgIG9yZGVyQ2hhcmdlcy5jaGFyZ2VzLmdldChmcmVxdWVuY3lLZXkpXG4gICAgICAgICAgICAgICAgfCBnbHh5Q3VycmVuY3k6IG9yZGVyQ2hhcmdlcy5jdXJyZW5jeVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuIl19