techlify-inventory-common 18.36.0 → 18.36.1
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.
- package/esm2022/lib/inventory-common/product/product-list/product-list.component.mjs +15 -17
- package/esm2022/lib/inventory-common/product/product-view-page/product-view-page.component.mjs +8 -8
- package/esm2022/lib/inventory-common/product/product.module.mjs +5 -5
- package/esm2022/lib/inventory-common/product/widgets/product-category-badges/product-category-badges.component.mjs +3 -3
- package/esm2022/lib/inventory-common/stock-issuances/stock-issue-list/stock-issue-list.component.mjs +115 -70
- package/esm2022/lib/inventory-common/stock-issuances/stock-issue-page/stock-issue-page.component.mjs +96 -0
- package/esm2022/lib/inventory-common/stock-issuances/{stock-issue-list/stock-issue-list.module.mjs → stock-issue-page/stock-issue-page.module.mjs} +18 -18
- package/esm2022/lib/inventory-common/stock-issuances/stock-issue-products-list/stock-issue-products-list.component.mjs +138 -0
- package/esm2022/lib/inventory-common/stock-issuances/stock-issue-routing.module.mjs +3 -3
- package/esm2022/lib/inventory-common/stock-issuances/stock-issue.module.mjs +5 -5
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-list/stock-receipt-list.component.mjs +153 -0
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-product-list/stock-receipt-product-list.component.mjs +146 -0
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipts-page/stock-receipts-page.component.mjs +70 -0
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipts-routing.module.mjs +3 -3
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipts.module.mjs +16 -16
- package/esm2022/lib/inventory-common/supplier/supplier-view/supplier-view.component.mjs +4 -4
- package/esm2022/public-api.mjs +8 -8
- package/fesm2022/{techlify-inventory-common-category.module-CUqub2ML.mjs → techlify-inventory-common-category.module-qyYKbe_g.mjs} +2 -2
- package/fesm2022/{techlify-inventory-common-category.module-CUqub2ML.mjs.map → techlify-inventory-common-category.module-qyYKbe_g.mjs.map} +1 -1
- package/fesm2022/{techlify-inventory-common-measure.module-CIonhS7Z.mjs → techlify-inventory-common-measure.module-Azgdcpqu.mjs} +2 -2
- package/fesm2022/{techlify-inventory-common-measure.module-CIonhS7Z.mjs.map → techlify-inventory-common-measure.module-Azgdcpqu.mjs.map} +1 -1
- package/fesm2022/{techlify-inventory-common-purchase-order-view.component-5zmdBnE-.mjs → techlify-inventory-common-purchase-order-view.component-tSf0_Lj_.mjs} +2 -2
- package/fesm2022/{techlify-inventory-common-purchase-order-view.component-5zmdBnE-.mjs.map → techlify-inventory-common-purchase-order-view.component-tSf0_Lj_.mjs.map} +1 -1
- package/fesm2022/{techlify-inventory-common-stock-issue-batch-form.component-CnRySjgj.mjs → techlify-inventory-common-stock-issue-batch-form.component-8u8sZ4gb.mjs} +2 -2
- package/fesm2022/{techlify-inventory-common-stock-issue-batch-form.component-CnRySjgj.mjs.map → techlify-inventory-common-stock-issue-batch-form.component-8u8sZ4gb.mjs.map} +1 -1
- package/fesm2022/{techlify-inventory-common-stock-issue-view.component-D1sTvEWD.mjs → techlify-inventory-common-stock-issue-view.component-C-SHFxmY.mjs} +2 -2
- package/fesm2022/{techlify-inventory-common-stock-issue-view.component-D1sTvEWD.mjs.map → techlify-inventory-common-stock-issue-view.component-C-SHFxmY.mjs.map} +1 -1
- package/fesm2022/{techlify-inventory-common-techlify-inventory-common-DVM9NowZ.mjs → techlify-inventory-common-techlify-inventory-common-CqakmnCI.mjs} +1556 -1554
- package/fesm2022/techlify-inventory-common-techlify-inventory-common-CqakmnCI.mjs.map +1 -0
- package/fesm2022/techlify-inventory-common.mjs +1 -1
- package/lib/inventory-common/product/product-view-page/product-view-page.component.d.ts +4 -4
- package/lib/inventory-common/product/product.module.d.ts +2 -2
- package/lib/inventory-common/stock-issuances/stock-issue-list/stock-issue-list.component.d.ts +22 -22
- package/lib/inventory-common/stock-issuances/stock-issue-page/stock-issue-page.component.d.ts +28 -0
- package/lib/inventory-common/stock-issuances/stock-issue-page/stock-issue-page.module.d.ts +21 -0
- package/lib/inventory-common/stock-issuances/{itemized-stock-issue-products-list/itemized-stock-issue-products-list.component.d.ts → stock-issue-products-list/stock-issue-products-list.component.d.ts} +3 -3
- package/lib/inventory-common/stock-issuances/stock-issue.module.d.ts +2 -2
- package/lib/inventory-common/stock-receipts/{grouped-stock-receipt-list/grouped-stock-receipt-list.component.d.ts → stock-receipt-list/stock-receipt-list.component.d.ts} +3 -3
- package/lib/inventory-common/stock-receipts/{itemized-stock-receipt-products-list/itemized-stock-receipt-products-list.component.d.ts → stock-receipt-product-list/stock-receipt-product-list.component.d.ts} +3 -3
- package/lib/inventory-common/stock-receipts/{stock-receipts-list-page/stock-receipts-list-page.component.d.ts → stock-receipts-page/stock-receipts-page.component.d.ts} +3 -3
- package/lib/inventory-common/stock-receipts/stock-receipts.module.d.ts +4 -4
- package/package.json +1 -1
- package/public-api.d.ts +7 -7
- package/esm2022/lib/inventory-common/stock-issuances/grouped-stock-issue-list/grouped-stock-issue-list.component.mjs +0 -139
- package/esm2022/lib/inventory-common/stock-issuances/itemized-stock-issue-products-list/itemized-stock-issue-products-list.component.mjs +0 -138
- package/esm2022/lib/inventory-common/stock-receipts/grouped-stock-receipt-list/grouped-stock-receipt-list.component.mjs +0 -151
- package/esm2022/lib/inventory-common/stock-receipts/itemized-stock-receipt-products-list/itemized-stock-receipt-products-list.component.mjs +0 -146
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipts-list-page/stock-receipts-list-page.component.mjs +0 -70
- package/fesm2022/techlify-inventory-common-techlify-inventory-common-DVM9NowZ.mjs.map +0 -1
- package/lib/inventory-common/stock-issuances/grouped-stock-issue-list/grouped-stock-issue-list.component.d.ts +0 -28
- package/lib/inventory-common/stock-issuances/stock-issue-list/stock-issue-list.module.d.ts +0 -21
|
@@ -12,20 +12,18 @@ import * as i4 from "../product.service";
|
|
|
12
12
|
import * as i5 from "../product-form.service";
|
|
13
13
|
import * as i6 from "@angular/common";
|
|
14
14
|
import * as i7 from "ngx-techlify-core";
|
|
15
|
-
import * as i8 from "
|
|
16
|
-
import * as i9 from "
|
|
17
|
-
import * as i10 from "@angular/material/
|
|
18
|
-
import * as i11 from "@angular/material/
|
|
19
|
-
import * as i12 from "@angular/material/
|
|
20
|
-
import * as i13 from "@angular/material/
|
|
21
|
-
import * as i14 from "@angular/material/
|
|
22
|
-
import * as i15 from "@angular/material/
|
|
23
|
-
import * as i16 from "
|
|
24
|
-
import * as i17 from "
|
|
25
|
-
import * as i18 from "
|
|
26
|
-
import * as i19 from "
|
|
27
|
-
import * as i20 from "../product-form-button/product-form-button.component";
|
|
28
|
-
import * as i21 from "../product-batch-update-form/product-batch-update-form.component";
|
|
15
|
+
import * as i8 from "@angular/material/checkbox";
|
|
16
|
+
import * as i9 from "@angular/material/form-field";
|
|
17
|
+
import * as i10 from "@angular/material/input";
|
|
18
|
+
import * as i11 from "@angular/material/sort";
|
|
19
|
+
import * as i12 from "@angular/material/table";
|
|
20
|
+
import * as i13 from "@angular/material/card";
|
|
21
|
+
import * as i14 from "@angular/material/tooltip";
|
|
22
|
+
import * as i15 from "@angular/material/progress-bar";
|
|
23
|
+
import * as i16 from "ngx-infinite-scroll";
|
|
24
|
+
import * as i17 from "../../shared/export-to-excel-button/export-to-excel-button.component";
|
|
25
|
+
import * as i18 from "../product-form-button/product-form-button.component";
|
|
26
|
+
import * as i19 from "../product-batch-update-form/product-batch-update-form.component";
|
|
29
27
|
let ProductListComponent = class ProductListComponent extends TechlifyListingControllerInterface {
|
|
30
28
|
fb;
|
|
31
29
|
dialog;
|
|
@@ -177,7 +175,7 @@ let ProductListComponent = class ProductListComponent extends TechlifyListingCon
|
|
|
177
175
|
this.exportInProgress = hideColumns;
|
|
178
176
|
}
|
|
179
177
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ProductListComponent, deps: [{ token: i1.FormBuilder }, { token: i2.MatDialog }, { token: i3.ActivatedRoute }, { token: i4.ProductService }, { token: i5.ProductFormService }], target: i0.ɵɵFactoryTarget.Component });
|
|
180
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ProductListComponent, selector: "app-product-list", usesInheritance: true, ngImport: i0, template: "<mat-card class=\"mb-3\">\n <mat-card-content>\n <form [formGroup]=\"filterForm\" class=\"d-flex justify-content-between align-items-center gap-2\">\n <div class=\"d-flex justify-content-center align-items-center gap-2\">\n <h3 class=\"mb-0\">Products</h3>\n <app-product-form-button></app-product-form-button>\n <span matTooltip=\"Import\" routerLink=\"import\" class=\"cursor-pointer material-symbols-outlined\">\n file_upload\n </span>\n <app-export-to-excel-button tableId=\"productTable\" fileName=\"products\" (onExportStart)=\"handleExport(true)\"\n (onExportEnd)=\"handleExport(false)\">\n </app-export-to-excel-button>\n <app-column-selector mode=\"icon\" class=\"d-print-none\" [columnConfigs]=\"columnConfig\"\n [(selectedColumns)]=\"selectedColumns\"></app-column-selector>\n </div>\n\n <div class=\"d-flex justify-content-start align-items-center gap-2\">\n <mat-form-field class='fl-md'>\n <mat-label>Search</mat-label>\n <input matInput placeholder=\"Search products\" formControlName=\"search\" />\n </mat-form-field>\n\n <mat-form-field class='fl-sm'>\n <mat-label>Category</mat-label>\n <app-searchable-selector apiUrl=\"api/product-categories\" formControlName=\"category_ids\" [multiple]=\"true\">\n </app-searchable-selector>\n </mat-form-field>\n\n <mat-form-field class='fl-sm'>\n <mat-label>Type</mat-label>\n <app-searchable-selector apiUrl=\"api/product-types\" formControlName=\"type_ids\" titleField=\"title\"\n [multiple]=\"true\">\n </app-searchable-selector>\n </mat-form-field>\n </div>\n </form>\n </mat-card-content>\n</mat-card>\n\n<div class=\"d-flex justify-content-start gap-3\">\n <mat-card [class.flex-fill]=\"!selection.isEmpty()\" [class.w-100]=\"selection.isEmpty()\">\n <mat-card-content class=\"p-0\">\n <table mat-table [dataSource]=\"models\" class=\"w-100\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScroll()\" [fromRoot]=\"true\" matSort\n (matSortChange)=\"sortColumn($event)\" matSortDisableClear=\"true\" aria-describedby=\"Products List\"\n id=\"productTable\">\n <!-- # Column -->\n <ng-container matColumnDef=\"#\">\n <th mat-header-cell *matHeaderCellDef>#</th>\n <td mat-cell *matCellDef=\"let element; let i = index\">{{ i + 1 }}</td>\n </ng-container>\n\n <!-- Name Column -->\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Name</th>\n <td mat-cell *matCellDef=\"let element\">\n <div class=\"d-flex flex-column gap-1\">\n <a class=\"text-decoration-none text-dark\" [routerLink]=\"[element?.id, 'view']\">{{ element.name }}</a>\n <small class=\"text-secondary\" *ngIf=\"element.type && !exportInProgress\">\n {{ element.type?.title }}\n </small>\n </div>\n </td>\n </ng-container>\n\n <!-- Type Column -->\n <ng-container matColumnDef=\"type\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Type</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.type?.title }}\n </td>\n </ng-container>\n\n <!-- Categories Column -->\n <ng-container matColumnDef=\"categories\">\n <th mat-header-cell *matHeaderCellDef>Categories</th>\n <td mat-cell *matCellDef=\"let element\" style=\"max-width: 200px\">\n <div *ngIf=\"element?.categories?.length > 0\"\n class=\"d-flex justify-content-start align-items-center gap-1 flex-wrap\">\n <span class=\"badge bg-secondary\" *ngFor=\"let category of element?.categories\">\n {{ category?.title }}\n </span>\n </div>\n </td>\n </ng-container>\n\n <!-- SKU Column -->\n <ng-container matColumnDef=\"sku\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>SKU</th>\n <td mat-cell *matCellDef=\"let element\">{{ element.sku }}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"description\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Description</th>\n <td mat-cell *matCellDef=\"let element\">{{ element.description }}</td>\n </ng-container>\n\n <!-- Initial Quantity Column -->\n <ng-container matColumnDef=\"initial_quantity\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Initial Quantity</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\">{{ element.initial_quantity }}</p>\n <small class=\"text-secondary\" *ngIf=\"element?.initial_quantity_date\">\n on {{ element?.initial_quantity_date | date }}\n </small>\n </td>\n </ng-container>\n\n <!-- Stock Receipts Column -->\n <ng-container matColumnDef=\"stock_receipts\">\n <th mat-header-cell mat-sort-header=\"stock_receipts_sum_quantity\" *matHeaderCellDef>Stock Receipts</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\">{{ element?.stock_receipts_sum_quantity }}</p>\n <small class=\"text-secondary\" *ngIf=\"element?.last_stock_receipt && !exportInProgress\">\n Latest on {{ element?.last_stock_receipt?.date | date }}\n </small>\n </td>\n </ng-container>\n\n <!-- Stock Issues Column -->\n <ng-container matColumnDef=\"stock_issues\">\n <th mat-header-cell mat-sort-header=\"stock_issues_sum_quantity\" *matHeaderCellDef>Stock Issues</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\">{{ element?.stock_issues_sum_quantity }}</p>\n <small class=\"text-secondary\" *ngIf=\"element?.last_stock_issue && !exportInProgress\">\n Latest on {{ element?.last_stock_issue?.date | date }}\n </small>\n </td>\n </ng-container>\n\n <!-- On Hand Column -->\n <ng-container matColumnDef=\"on_hand\">\n <th mat-header-cell mat-sort-header='stock_on_hand' *matHeaderCellDef>On Hand</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.stock_on_hand }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"measure\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Measure</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.measure?.title }}\n </td>\n </ng-container>\n\n <!-- Reorder Point Column -->\n <ng-container matColumnDef=\"reorder_point\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Reorder Point</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element.reorder_point }}\n </td>\n </ng-container>\n\n <!-- Selling Price Column -->\n <ng-container matColumnDef=\"sale_price\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Selling Price</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element.sale_price | currency }}\n </td>\n </ng-container>\n\n <!-- Income Account Column -->\n <ng-container matColumnDef=\"income_account\">\n <th mat-header-cell *matHeaderCellDef>Income Account</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.income_account?.title }}\n </td>\n </ng-container>\n\n <!-- Expense Account Column -->\n <ng-container matColumnDef=\"expense_account\">\n <th mat-header-cell *matHeaderCellDef>Expense Account</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.expense_account?.title }}\n </td>\n </ng-container>\n\n <!-- Creator Column -->\n <ng-container matColumnDef=\"creator\">\n <th mat-header-cell *matHeaderCellDef>Creator</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\">{{ element?.creator?.name }}</p>\n <small class=\"text-secondary\">{{ element?.created_at | date }}</small>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"Actions\">\n <th mat-header-cell *matHeaderCellDef>Actions</th>\n <td mat-cell *matCellDef=\"let element\">\n <div class=\"text-secondary d-flex gap-1\">\n <app-techlify-icon name='view' [routerLink]=\"[element.id, 'view']\"\n routerLinkActive=\"route-link-active\"></app-techlify-icon>\n\n <app-product-form-button [product]=\"element\"></app-product-form-button>\n <app-stock-receipt-form-button [product]=\"element\" (saved)=\"reload()\"></app-stock-receipt-form-button>\n <app-stock-issue-form-button [product]=\"element\" (saved)=\"reload()\"></app-stock-issue-form-button>\n </div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"Select\">\n <th mat-header-cell *matHeaderCellDef>\n <mat-checkbox (change)=\"$event ? toggleAllRows() : null\"\n [checked]=\"selection.hasValue() && isAllRowsSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllRowsSelected()\" [aria-label]=\"checkboxLabel()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\" [aria-label]=\"checkboxLabel(row)\">\n </mat-checkbox>\n </td>\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </mat-card-content>\n </mat-card>\n <mat-card *ngIf=\"!selection.isEmpty()\" class=\"batch-update-card\">\n <mat-card-content>\n <app-product-batch-update-form [selection]=\"selection\" (updated)=\"reload()\"></app-product-batch-update-form>\n </mat-card-content>\n </mat-card>\n</div>", styles: [".batch-update-card{width:15%;min-width:300px}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i3.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "component", type: i7.SearchableSelectorComponent, selector: "app-searchable-selector", inputs: ["valueField", "titleField", "subtitleField", "apiUrl", "multiple", "selectedValue", "enableSearch", "add", "addConfig", "edit", "editConfig", "sort", "sortBy", "searchField", "itemComponent", "items", "apiDataProperty", "cache", "perPage", "inDataSearch", "panelWidth", "focusSearchOnOpen", "required", "disabled", "value"], outputs: ["selectedValueChange", "selectionChange", "itemsChange"] }, { kind: "component", type: i8.StockReceiptFormButtonComponent, selector: "app-stock-receipt-form-button", inputs: ["product", "stockReceipt", "latestLocationId", "icon"], outputs: ["saved"] }, { kind: "component", type: i9.StockIssueFormButtonComponent, selector: "app-stock-issue-form-button", inputs: ["product", "stockIssueProduct", "stockIssue", "icon", "issuableType", "issuableId"], outputs: ["saved"] }, { kind: "component", type: i10.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i11.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i11.MatLabel, selector: "mat-label" }, { kind: "directive", type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i13.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i13.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i14.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i14.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i14.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i14.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i14.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i14.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i14.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i14.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i14.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i14.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i14.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i14.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i15.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i15.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i16.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i17.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: i18.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i7.ColumnSelectorComponent, selector: "app-column-selector", inputs: ["label", "mode", "columnConfigs", "selectedColumns", "isExportWorking"], outputs: ["selectedColumnsChange", "displayedColumnsChange"] }, { kind: "component", type: i19.ExportToExcelButtonComponent, selector: "app-export-to-excel-button", inputs: ["tableId", "fileName"], outputs: ["onExportStart", "onExportEnd"] }, { kind: "component", type: i7.TechlifyIconComponent, selector: "app-techlify-icon", inputs: ["name", "size"] }, { kind: "component", type: i20.ProductFormButtonComponent, selector: "app-product-form-button", inputs: ["product"] }, { kind: "component", type: i21.ProductBatchUpdateFormComponent, selector: "app-product-batch-update-form", inputs: ["selection"], outputs: ["updated"] }, { kind: "pipe", type: i6.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i6.DatePipe, name: "date" }], preserveWhitespaces: true });
|
|
178
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ProductListComponent, selector: "app-product-list", usesInheritance: true, ngImport: i0, template: "<mat-card class=\"mb-3\">\n <mat-card-content>\n <form [formGroup]=\"filterForm\" class=\"d-flex justify-content-between align-items-center gap-2\">\n <div class=\"d-flex justify-content-center align-items-center gap-2\">\n <h3 class=\"mb-0\">Products</h3>\n <app-product-form-button></app-product-form-button>\n <span matTooltip=\"Import\" routerLink=\"import\" class=\"cursor-pointer material-symbols-outlined\">\n file_upload\n </span>\n <app-export-to-excel-button tableId=\"productTable\" fileName=\"products\" (onExportStart)=\"handleExport(true)\"\n (onExportEnd)=\"handleExport(false)\">\n </app-export-to-excel-button>\n <app-column-selector mode=\"icon\" class=\"d-print-none\" [columnConfigs]=\"columnConfig\"\n [(selectedColumns)]=\"selectedColumns\"></app-column-selector>\n </div>\n\n <div class=\"d-flex justify-content-start align-items-center gap-2\">\n <mat-form-field class='fl-md'>\n <mat-label>Search</mat-label>\n <input matInput placeholder=\"Search products\" formControlName=\"search\" />\n </mat-form-field>\n\n <mat-form-field class='fl-sm'>\n <mat-label>Category</mat-label>\n <app-searchable-selector apiUrl=\"api/product-categories\" formControlName=\"category_ids\" [multiple]=\"true\">\n </app-searchable-selector>\n </mat-form-field>\n\n <mat-form-field class='fl-sm'>\n <mat-label>Type</mat-label>\n <app-searchable-selector apiUrl=\"api/product-types\" formControlName=\"type_ids\" titleField=\"title\"\n [multiple]=\"true\">\n </app-searchable-selector>\n </mat-form-field>\n </div>\n </form>\n </mat-card-content>\n</mat-card>\n\n<div class=\"d-flex justify-content-start gap-3\">\n <mat-card [class.flex-fill]=\"!selection.isEmpty()\" [class.w-100]=\"selection.isEmpty()\">\n <mat-card-content class=\"p-0\">\n <table mat-table [dataSource]=\"models\" class=\"w-100\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScroll()\" [fromRoot]=\"true\" matSort\n (matSortChange)=\"sortColumn($event)\" matSortDisableClear=\"true\" aria-describedby=\"Products List\"\n id=\"productTable\">\n <!-- # Column -->\n <ng-container matColumnDef=\"#\">\n <th mat-header-cell *matHeaderCellDef>#</th>\n <td mat-cell *matCellDef=\"let element; let i = index\">{{ i + 1 }}</td>\n </ng-container>\n\n <!-- Name Column -->\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Name</th>\n <td mat-cell *matCellDef=\"let element\">\n <div class=\"d-flex flex-column gap-1\">\n <a class=\"text-decoration-none text-dark\" [routerLink]=\"[element?.id, 'view']\">{{ element.name }}</a>\n <small class=\"text-secondary\" *ngIf=\"element.type && !exportInProgress\">\n {{ element.type?.title }}\n </small>\n </div>\n </td>\n </ng-container>\n\n <!-- Type Column -->\n <ng-container matColumnDef=\"type\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Type</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.type?.title }}\n </td>\n </ng-container>\n\n <!-- Categories Column -->\n <ng-container matColumnDef=\"categories\">\n <th mat-header-cell *matHeaderCellDef>Categories</th>\n <td mat-cell *matCellDef=\"let element\" style=\"max-width: 200px\">\n <div *ngIf=\"element?.categories?.length > 0\"\n class=\"d-flex justify-content-start align-items-center gap-1 flex-wrap\">\n <span class=\"badge bg-secondary\" *ngFor=\"let category of element?.categories\">\n {{ category?.title }}\n </span>\n </div>\n </td>\n </ng-container>\n\n <!-- SKU Column -->\n <ng-container matColumnDef=\"sku\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>SKU</th>\n <td mat-cell *matCellDef=\"let element\">{{ element.sku }}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"description\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Description</th>\n <td mat-cell *matCellDef=\"let element\">{{ element.description }}</td>\n </ng-container>\n\n <!-- Initial Quantity Column -->\n <ng-container matColumnDef=\"initial_quantity\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Initial Quantity</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\">{{ element.initial_quantity }}</p>\n <small class=\"text-secondary\" *ngIf=\"element?.initial_quantity_date\">\n on {{ element?.initial_quantity_date | date }}\n </small>\n </td>\n </ng-container>\n\n <!-- Stock Receipts Column -->\n <ng-container matColumnDef=\"stock_receipts\">\n <th mat-header-cell mat-sort-header=\"stock_receipts_sum_quantity\" *matHeaderCellDef>Stock Receipts</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\">{{ element?.stock_receipts_sum_quantity }}</p>\n <small class=\"text-secondary\" *ngIf=\"element?.last_stock_receipt && !exportInProgress\">\n Latest on {{ element?.last_stock_receipt?.date | date }}\n </small>\n </td>\n </ng-container>\n\n <!-- Stock Issues Column -->\n <ng-container matColumnDef=\"stock_issues\">\n <th mat-header-cell mat-sort-header=\"stock_issues_sum_quantity\" *matHeaderCellDef>Stock Issues</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\">{{ element?.stock_issues_sum_quantity }}</p>\n <small class=\"text-secondary\" *ngIf=\"element?.last_stock_issue && !exportInProgress\">\n Latest on {{ element?.last_stock_issue?.date | date }}\n </small>\n </td>\n </ng-container>\n\n <!-- On Hand Column -->\n <ng-container matColumnDef=\"on_hand\">\n <th mat-header-cell mat-sort-header='stock_on_hand' *matHeaderCellDef>On Hand</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.stock_on_hand }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"measure\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Measure</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.measure?.title }}\n </td>\n </ng-container>\n\n <!-- Reorder Point Column -->\n <ng-container matColumnDef=\"reorder_point\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Reorder Point</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element.reorder_point }}\n </td>\n </ng-container>\n\n <!-- Selling Price Column -->\n <ng-container matColumnDef=\"sale_price\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Selling Price</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element.sale_price | currency }}\n </td>\n </ng-container>\n\n <!-- Income Account Column -->\n <ng-container matColumnDef=\"income_account\">\n <th mat-header-cell *matHeaderCellDef>Income Account</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.income_account?.title }}\n </td>\n </ng-container>\n\n <!-- Expense Account Column -->\n <ng-container matColumnDef=\"expense_account\">\n <th mat-header-cell *matHeaderCellDef>Expense Account</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.expense_account?.title }}\n </td>\n </ng-container>\n\n <!-- Creator Column -->\n <ng-container matColumnDef=\"creator\">\n <th mat-header-cell *matHeaderCellDef>Creator</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\">{{ element?.creator?.name }}</p>\n <small class=\"text-secondary\">{{ element?.created_at | date }}</small>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"Actions\">\n <th mat-header-cell *matHeaderCellDef>Actions</th>\n <td mat-cell *matCellDef=\"let element\">\n <div class=\"text-secondary d-flex gap-1\">\n <app-techlify-icon name='view' [routerLink]=\"[element.id, 'view']\"\n routerLinkActive=\"route-link-active\"></app-techlify-icon>\n\n <app-product-form-button [product]=\"element\"></app-product-form-button>\n </div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"Select\">\n <th mat-header-cell *matHeaderCellDef>\n <mat-checkbox (change)=\"$event ? toggleAllRows() : null\"\n [checked]=\"selection.hasValue() && isAllRowsSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllRowsSelected()\" [aria-label]=\"checkboxLabel()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\" [aria-label]=\"checkboxLabel(row)\">\n </mat-checkbox>\n </td>\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </mat-card-content>\n </mat-card>\n <mat-card *ngIf=\"!selection.isEmpty()\" class=\"batch-update-card\">\n <mat-card-content>\n <app-product-batch-update-form [selection]=\"selection\" (updated)=\"reload()\"></app-product-batch-update-form>\n </mat-card-content>\n </mat-card>\n</div>", styles: [".batch-update-card{width:15%;min-width:300px}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i3.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "component", type: i7.SearchableSelectorComponent, selector: "app-searchable-selector", inputs: ["valueField", "titleField", "subtitleField", "apiUrl", "multiple", "selectedValue", "enableSearch", "add", "addConfig", "edit", "editConfig", "sort", "sortBy", "searchField", "itemComponent", "items", "apiDataProperty", "cache", "perPage", "inDataSearch", "panelWidth", "focusSearchOnOpen", "required", "disabled", "value"], outputs: ["selectedValueChange", "selectionChange", "itemsChange"] }, { kind: "component", type: i8.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i11.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i11.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i12.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i12.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i12.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i12.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i12.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i12.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i12.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i12.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i12.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i12.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i12.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i12.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i13.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i13.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i14.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i15.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: i16.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i7.ColumnSelectorComponent, selector: "app-column-selector", inputs: ["label", "mode", "columnConfigs", "selectedColumns", "isExportWorking"], outputs: ["selectedColumnsChange", "displayedColumnsChange"] }, { kind: "component", type: i17.ExportToExcelButtonComponent, selector: "app-export-to-excel-button", inputs: ["tableId", "fileName"], outputs: ["onExportStart", "onExportEnd"] }, { kind: "component", type: i7.TechlifyIconComponent, selector: "app-techlify-icon", inputs: ["name", "size"] }, { kind: "component", type: i18.ProductFormButtonComponent, selector: "app-product-form-button", inputs: ["product"] }, { kind: "component", type: i19.ProductBatchUpdateFormComponent, selector: "app-product-batch-update-form", inputs: ["selection"], outputs: ["updated"] }, { kind: "pipe", type: i6.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i6.DatePipe, name: "date" }], preserveWhitespaces: true });
|
|
181
179
|
};
|
|
182
180
|
ProductListComponent = __decorate([
|
|
183
181
|
UntilDestroy()
|
|
@@ -185,6 +183,6 @@ ProductListComponent = __decorate([
|
|
|
185
183
|
export { ProductListComponent };
|
|
186
184
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ProductListComponent, decorators: [{
|
|
187
185
|
type: Component,
|
|
188
|
-
args: [{ selector: 'app-product-list', template: "<mat-card class=\"mb-3\">\n <mat-card-content>\n <form [formGroup]=\"filterForm\" class=\"d-flex justify-content-between align-items-center gap-2\">\n <div class=\"d-flex justify-content-center align-items-center gap-2\">\n <h3 class=\"mb-0\">Products</h3>\n <app-product-form-button></app-product-form-button>\n <span matTooltip=\"Import\" routerLink=\"import\" class=\"cursor-pointer material-symbols-outlined\">\n file_upload\n </span>\n <app-export-to-excel-button tableId=\"productTable\" fileName=\"products\" (onExportStart)=\"handleExport(true)\"\n (onExportEnd)=\"handleExport(false)\">\n </app-export-to-excel-button>\n <app-column-selector mode=\"icon\" class=\"d-print-none\" [columnConfigs]=\"columnConfig\"\n [(selectedColumns)]=\"selectedColumns\"></app-column-selector>\n </div>\n\n <div class=\"d-flex justify-content-start align-items-center gap-2\">\n <mat-form-field class='fl-md'>\n <mat-label>Search</mat-label>\n <input matInput placeholder=\"Search products\" formControlName=\"search\" />\n </mat-form-field>\n\n <mat-form-field class='fl-sm'>\n <mat-label>Category</mat-label>\n <app-searchable-selector apiUrl=\"api/product-categories\" formControlName=\"category_ids\" [multiple]=\"true\">\n </app-searchable-selector>\n </mat-form-field>\n\n <mat-form-field class='fl-sm'>\n <mat-label>Type</mat-label>\n <app-searchable-selector apiUrl=\"api/product-types\" formControlName=\"type_ids\" titleField=\"title\"\n [multiple]=\"true\">\n </app-searchable-selector>\n </mat-form-field>\n </div>\n </form>\n </mat-card-content>\n</mat-card>\n\n<div class=\"d-flex justify-content-start gap-3\">\n <mat-card [class.flex-fill]=\"!selection.isEmpty()\" [class.w-100]=\"selection.isEmpty()\">\n <mat-card-content class=\"p-0\">\n <table mat-table [dataSource]=\"models\" class=\"w-100\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScroll()\" [fromRoot]=\"true\" matSort\n (matSortChange)=\"sortColumn($event)\" matSortDisableClear=\"true\" aria-describedby=\"Products List\"\n id=\"productTable\">\n <!-- # Column -->\n <ng-container matColumnDef=\"#\">\n <th mat-header-cell *matHeaderCellDef>#</th>\n <td mat-cell *matCellDef=\"let element; let i = index\">{{ i + 1 }}</td>\n </ng-container>\n\n <!-- Name Column -->\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Name</th>\n <td mat-cell *matCellDef=\"let element\">\n <div class=\"d-flex flex-column gap-1\">\n <a class=\"text-decoration-none text-dark\" [routerLink]=\"[element?.id, 'view']\">{{ element.name }}</a>\n <small class=\"text-secondary\" *ngIf=\"element.type && !exportInProgress\">\n {{ element.type?.title }}\n </small>\n </div>\n </td>\n </ng-container>\n\n <!-- Type Column -->\n <ng-container matColumnDef=\"type\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Type</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.type?.title }}\n </td>\n </ng-container>\n\n <!-- Categories Column -->\n <ng-container matColumnDef=\"categories\">\n <th mat-header-cell *matHeaderCellDef>Categories</th>\n <td mat-cell *matCellDef=\"let element\" style=\"max-width: 200px\">\n <div *ngIf=\"element?.categories?.length > 0\"\n class=\"d-flex justify-content-start align-items-center gap-1 flex-wrap\">\n <span class=\"badge bg-secondary\" *ngFor=\"let category of element?.categories\">\n {{ category?.title }}\n </span>\n </div>\n </td>\n </ng-container>\n\n <!-- SKU Column -->\n <ng-container matColumnDef=\"sku\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>SKU</th>\n <td mat-cell *matCellDef=\"let element\">{{ element.sku }}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"description\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Description</th>\n <td mat-cell *matCellDef=\"let element\">{{ element.description }}</td>\n </ng-container>\n\n <!-- Initial Quantity Column -->\n <ng-container matColumnDef=\"initial_quantity\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Initial Quantity</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\">{{ element.initial_quantity }}</p>\n <small class=\"text-secondary\" *ngIf=\"element?.initial_quantity_date\">\n on {{ element?.initial_quantity_date | date }}\n </small>\n </td>\n </ng-container>\n\n <!-- Stock Receipts Column -->\n <ng-container matColumnDef=\"stock_receipts\">\n <th mat-header-cell mat-sort-header=\"stock_receipts_sum_quantity\" *matHeaderCellDef>Stock Receipts</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\">{{ element?.stock_receipts_sum_quantity }}</p>\n <small class=\"text-secondary\" *ngIf=\"element?.last_stock_receipt && !exportInProgress\">\n Latest on {{ element?.last_stock_receipt?.date | date }}\n </small>\n </td>\n </ng-container>\n\n <!-- Stock Issues Column -->\n <ng-container matColumnDef=\"stock_issues\">\n <th mat-header-cell mat-sort-header=\"stock_issues_sum_quantity\" *matHeaderCellDef>Stock Issues</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\">{{ element?.stock_issues_sum_quantity }}</p>\n <small class=\"text-secondary\" *ngIf=\"element?.last_stock_issue && !exportInProgress\">\n Latest on {{ element?.last_stock_issue?.date | date }}\n </small>\n </td>\n </ng-container>\n\n <!-- On Hand Column -->\n <ng-container matColumnDef=\"on_hand\">\n <th mat-header-cell mat-sort-header='stock_on_hand' *matHeaderCellDef>On Hand</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.stock_on_hand }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"measure\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Measure</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.measure?.title }}\n </td>\n </ng-container>\n\n <!-- Reorder Point Column -->\n <ng-container matColumnDef=\"reorder_point\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Reorder Point</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element.reorder_point }}\n </td>\n </ng-container>\n\n <!-- Selling Price Column -->\n <ng-container matColumnDef=\"sale_price\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Selling Price</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element.sale_price | currency }}\n </td>\n </ng-container>\n\n <!-- Income Account Column -->\n <ng-container matColumnDef=\"income_account\">\n <th mat-header-cell *matHeaderCellDef>Income Account</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.income_account?.title }}\n </td>\n </ng-container>\n\n <!-- Expense Account Column -->\n <ng-container matColumnDef=\"expense_account\">\n <th mat-header-cell *matHeaderCellDef>Expense Account</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.expense_account?.title }}\n </td>\n </ng-container>\n\n <!-- Creator Column -->\n <ng-container matColumnDef=\"creator\">\n <th mat-header-cell *matHeaderCellDef>Creator</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\">{{ element?.creator?.name }}</p>\n <small class=\"text-secondary\">{{ element?.created_at | date }}</small>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"Actions\">\n <th mat-header-cell *matHeaderCellDef>Actions</th>\n <td mat-cell *matCellDef=\"let element\">\n <div class=\"text-secondary d-flex gap-1\">\n <app-techlify-icon name='view' [routerLink]=\"[element.id, 'view']\"\n routerLinkActive=\"route-link-active\"></app-techlify-icon>\n\n <app-product-form-button [product]=\"element\"></app-product-form-button>\n <app-stock-receipt-form-button [product]=\"element\" (saved)=\"reload()\"></app-stock-receipt-form-button>\n <app-stock-issue-form-button [product]=\"element\" (saved)=\"reload()\"></app-stock-issue-form-button>\n </div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"Select\">\n <th mat-header-cell *matHeaderCellDef>\n <mat-checkbox (change)=\"$event ? toggleAllRows() : null\"\n [checked]=\"selection.hasValue() && isAllRowsSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllRowsSelected()\" [aria-label]=\"checkboxLabel()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\" [aria-label]=\"checkboxLabel(row)\">\n </mat-checkbox>\n </td>\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </mat-card-content>\n </mat-card>\n <mat-card *ngIf=\"!selection.isEmpty()\" class=\"batch-update-card\">\n <mat-card-content>\n <app-product-batch-update-form [selection]=\"selection\" (updated)=\"reload()\"></app-product-batch-update-form>\n </mat-card-content>\n </mat-card>\n</div>", styles: [".batch-update-card{width:15%;min-width:300px}\n"] }]
|
|
186
|
+
args: [{ selector: 'app-product-list', template: "<mat-card class=\"mb-3\">\n <mat-card-content>\n <form [formGroup]=\"filterForm\" class=\"d-flex justify-content-between align-items-center gap-2\">\n <div class=\"d-flex justify-content-center align-items-center gap-2\">\n <h3 class=\"mb-0\">Products</h3>\n <app-product-form-button></app-product-form-button>\n <span matTooltip=\"Import\" routerLink=\"import\" class=\"cursor-pointer material-symbols-outlined\">\n file_upload\n </span>\n <app-export-to-excel-button tableId=\"productTable\" fileName=\"products\" (onExportStart)=\"handleExport(true)\"\n (onExportEnd)=\"handleExport(false)\">\n </app-export-to-excel-button>\n <app-column-selector mode=\"icon\" class=\"d-print-none\" [columnConfigs]=\"columnConfig\"\n [(selectedColumns)]=\"selectedColumns\"></app-column-selector>\n </div>\n\n <div class=\"d-flex justify-content-start align-items-center gap-2\">\n <mat-form-field class='fl-md'>\n <mat-label>Search</mat-label>\n <input matInput placeholder=\"Search products\" formControlName=\"search\" />\n </mat-form-field>\n\n <mat-form-field class='fl-sm'>\n <mat-label>Category</mat-label>\n <app-searchable-selector apiUrl=\"api/product-categories\" formControlName=\"category_ids\" [multiple]=\"true\">\n </app-searchable-selector>\n </mat-form-field>\n\n <mat-form-field class='fl-sm'>\n <mat-label>Type</mat-label>\n <app-searchable-selector apiUrl=\"api/product-types\" formControlName=\"type_ids\" titleField=\"title\"\n [multiple]=\"true\">\n </app-searchable-selector>\n </mat-form-field>\n </div>\n </form>\n </mat-card-content>\n</mat-card>\n\n<div class=\"d-flex justify-content-start gap-3\">\n <mat-card [class.flex-fill]=\"!selection.isEmpty()\" [class.w-100]=\"selection.isEmpty()\">\n <mat-card-content class=\"p-0\">\n <table mat-table [dataSource]=\"models\" class=\"w-100\" infiniteScroll [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScroll()\" [fromRoot]=\"true\" matSort\n (matSortChange)=\"sortColumn($event)\" matSortDisableClear=\"true\" aria-describedby=\"Products List\"\n id=\"productTable\">\n <!-- # Column -->\n <ng-container matColumnDef=\"#\">\n <th mat-header-cell *matHeaderCellDef>#</th>\n <td mat-cell *matCellDef=\"let element; let i = index\">{{ i + 1 }}</td>\n </ng-container>\n\n <!-- Name Column -->\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Name</th>\n <td mat-cell *matCellDef=\"let element\">\n <div class=\"d-flex flex-column gap-1\">\n <a class=\"text-decoration-none text-dark\" [routerLink]=\"[element?.id, 'view']\">{{ element.name }}</a>\n <small class=\"text-secondary\" *ngIf=\"element.type && !exportInProgress\">\n {{ element.type?.title }}\n </small>\n </div>\n </td>\n </ng-container>\n\n <!-- Type Column -->\n <ng-container matColumnDef=\"type\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Type</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.type?.title }}\n </td>\n </ng-container>\n\n <!-- Categories Column -->\n <ng-container matColumnDef=\"categories\">\n <th mat-header-cell *matHeaderCellDef>Categories</th>\n <td mat-cell *matCellDef=\"let element\" style=\"max-width: 200px\">\n <div *ngIf=\"element?.categories?.length > 0\"\n class=\"d-flex justify-content-start align-items-center gap-1 flex-wrap\">\n <span class=\"badge bg-secondary\" *ngFor=\"let category of element?.categories\">\n {{ category?.title }}\n </span>\n </div>\n </td>\n </ng-container>\n\n <!-- SKU Column -->\n <ng-container matColumnDef=\"sku\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>SKU</th>\n <td mat-cell *matCellDef=\"let element\">{{ element.sku }}</td>\n </ng-container>\n\n <ng-container matColumnDef=\"description\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Description</th>\n <td mat-cell *matCellDef=\"let element\">{{ element.description }}</td>\n </ng-container>\n\n <!-- Initial Quantity Column -->\n <ng-container matColumnDef=\"initial_quantity\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Initial Quantity</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\">{{ element.initial_quantity }}</p>\n <small class=\"text-secondary\" *ngIf=\"element?.initial_quantity_date\">\n on {{ element?.initial_quantity_date | date }}\n </small>\n </td>\n </ng-container>\n\n <!-- Stock Receipts Column -->\n <ng-container matColumnDef=\"stock_receipts\">\n <th mat-header-cell mat-sort-header=\"stock_receipts_sum_quantity\" *matHeaderCellDef>Stock Receipts</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\">{{ element?.stock_receipts_sum_quantity }}</p>\n <small class=\"text-secondary\" *ngIf=\"element?.last_stock_receipt && !exportInProgress\">\n Latest on {{ element?.last_stock_receipt?.date | date }}\n </small>\n </td>\n </ng-container>\n\n <!-- Stock Issues Column -->\n <ng-container matColumnDef=\"stock_issues\">\n <th mat-header-cell mat-sort-header=\"stock_issues_sum_quantity\" *matHeaderCellDef>Stock Issues</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\">{{ element?.stock_issues_sum_quantity }}</p>\n <small class=\"text-secondary\" *ngIf=\"element?.last_stock_issue && !exportInProgress\">\n Latest on {{ element?.last_stock_issue?.date | date }}\n </small>\n </td>\n </ng-container>\n\n <!-- On Hand Column -->\n <ng-container matColumnDef=\"on_hand\">\n <th mat-header-cell mat-sort-header='stock_on_hand' *matHeaderCellDef>On Hand</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.stock_on_hand }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"measure\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Measure</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.measure?.title }}\n </td>\n </ng-container>\n\n <!-- Reorder Point Column -->\n <ng-container matColumnDef=\"reorder_point\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Reorder Point</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element.reorder_point }}\n </td>\n </ng-container>\n\n <!-- Selling Price Column -->\n <ng-container matColumnDef=\"sale_price\">\n <th mat-header-cell mat-sort-header *matHeaderCellDef>Selling Price</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element.sale_price | currency }}\n </td>\n </ng-container>\n\n <!-- Income Account Column -->\n <ng-container matColumnDef=\"income_account\">\n <th mat-header-cell *matHeaderCellDef>Income Account</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.income_account?.title }}\n </td>\n </ng-container>\n\n <!-- Expense Account Column -->\n <ng-container matColumnDef=\"expense_account\">\n <th mat-header-cell *matHeaderCellDef>Expense Account</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.expense_account?.title }}\n </td>\n </ng-container>\n\n <!-- Creator Column -->\n <ng-container matColumnDef=\"creator\">\n <th mat-header-cell *matHeaderCellDef>Creator</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\">{{ element?.creator?.name }}</p>\n <small class=\"text-secondary\">{{ element?.created_at | date }}</small>\n </td>\n </ng-container>\n\n <!-- Actions Column -->\n <ng-container matColumnDef=\"Actions\">\n <th mat-header-cell *matHeaderCellDef>Actions</th>\n <td mat-cell *matCellDef=\"let element\">\n <div class=\"text-secondary d-flex gap-1\">\n <app-techlify-icon name='view' [routerLink]=\"[element.id, 'view']\"\n routerLinkActive=\"route-link-active\"></app-techlify-icon>\n\n <app-product-form-button [product]=\"element\"></app-product-form-button>\n </div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"Select\">\n <th mat-header-cell *matHeaderCellDef>\n <mat-checkbox (change)=\"$event ? toggleAllRows() : null\"\n [checked]=\"selection.hasValue() && isAllRowsSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllRowsSelected()\" [aria-label]=\"checkboxLabel()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\" [aria-label]=\"checkboxLabel(row)\">\n </mat-checkbox>\n </td>\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\n </table>\n\n <mat-progress-bar mode=\"indeterminate\" *ngIf=\"isWorking\"></mat-progress-bar>\n </mat-card-content>\n </mat-card>\n <mat-card *ngIf=\"!selection.isEmpty()\" class=\"batch-update-card\">\n <mat-card-content>\n <app-product-batch-update-form [selection]=\"selection\" (updated)=\"reload()\"></app-product-batch-update-form>\n </mat-card-content>\n </mat-card>\n</div>", styles: [".batch-update-card{width:15%;min-width:300px}\n"] }]
|
|
189
187
|
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.MatDialog }, { type: i3.ActivatedRoute }, { type: i4.ProductService }, { type: i5.ProductFormService }] });
|
|
190
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ludmVudG9yeS1jb21tb24vc3JjL2xpYi9pbnZlbnRvcnktY29tbW9uL3Byb2R1Y3QvcHJvZHVjdC1saXN0L3Byb2R1Y3QtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9wcm9kdWN0L3Byb2R1Y3QtbGlzdC9wcm9kdWN0LWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFJbEQsT0FBTyxFQUFnQixrQ0FBa0MsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXJGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU9uRCxJQUFNLG9CQUFvQixHQUExQixNQUFNLG9CQUFxQixTQUFRLGtDQUFrQztJQTBEaEU7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQTVEVixTQUFTLEdBQUcsSUFBSSxjQUFjLENBQU0sSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRTlDLHFDQUFxQztJQUM3QixtQkFBbUIsR0FBYTtRQUN0QyxHQUFHO1FBQ0gsTUFBTTtRQUNOLE1BQU07UUFDTixLQUFLO1FBQ0wsWUFBWTtRQUNaLGVBQWU7UUFDZixnQkFBZ0I7UUFDaEIseUJBQXlCO1FBQ3pCLGNBQWM7UUFDZCx1QkFBdUI7UUFDdkIsU0FBUztRQUNULFNBQVM7UUFDVCxZQUFZO0tBQ2IsQ0FBQztJQUVGLGdC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OzRGQUFwQixvQkFBb0IsK0VDaEJqQyxxNVVBbU9NOztBRG5OTyxvQkFBb0I7SUFOaEMsWUFBWSxFQUFFO0dBTUYsb0JBQW9CLENBc0toQzs7NEZBdEtZLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDRSxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQ29sdW1uQ29uZmlnLCBUZWNobGlmeUxpc3RpbmdDb250cm9sbGVySW50ZXJmYWNlIH0gZnJvbSAnbmd4LXRlY2hsaWZ5LWNvcmUnO1xuaW1wb3J0IHsgUHJvZHVjdFNlcnZpY2UgfSBmcm9tICcuLi9wcm9kdWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVW50aWxEZXN0cm95IH0gZnJvbSAnQG5nbmVhdC91bnRpbC1kZXN0cm95JztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFByb2R1Y3RGb3JtU2VydmljZSB9IGZyb20gJy4uL3Byb2R1Y3QtZm9ybS5zZXJ2aWNlJztcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbkBVbnRpbERlc3Ryb3koKVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXByb2R1Y3QtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9kdWN0LWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wcm9kdWN0LWxpc3QuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgUHJvZHVjdExpc3RDb21wb25lbnQgZXh0ZW5kcyBUZWNobGlmeUxpc3RpbmdDb250cm9sbGVySW50ZXJmYWNlIGltcGxlbWVudHMgT25Jbml0IHtcblxuICBzZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uTW9kZWw8YW55Pih0cnVlLCBbXSk7XG5cbiAgLy8gQ29sdW1ucyB0byB1c2UgZHVyaW5nIEV4Y2VsIGV4cG9ydFxuICBwcml2YXRlIGN1c3RvbUV4cG9ydENvbHVtbnM6IHN0cmluZ1tdID0gW1xuICAgICcjJyxcbiAgICAnbmFtZScsXG4gICAgJ3R5cGUnLFxuICAgICdza3UnLFxuICAgICdjYXRlZ29yaWVzJyxcbiAgICAncmVvcmRlcl9wb2ludCcsXG4gICAgJ3N0b2NrX3JlY2VpcHRzJyxcbiAgICAnbGFzdF9zdG9ja19yZWNlaXB0X2RhdGUnLFxuICAgICdzdG9ja19pc3N1ZXMnLFxuICAgICdsYXN0X3N0b2NrX2lzc3VlX2RhdGUnLFxuICAgICdvbl9oYW5kJyxcbiAgICAnbWVhc3VyZScsXG4gICAgJ3NhbGVfcHJpY2UnXG4gIF07XG5cbiAgZXhwb3J0SW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gIGNvbHVtbkNvbmZpZzogQ29sdW1uQ29uZmlnW10gPSBbXG4gICAgeyBsYWJlbDogJ0luaXRpYWwgUXVhbnRpdHknLCBkZWY6ICdpbml0aWFsX3F1YW50aXR5JywgaXNTZWxlY3RlZDogZmFsc2UsIGlzRWRpdGFibGU6IHRydWUgfSxcbiAgICB7IGxhYmVsOiAnSW5jb21lIEFjY291bnQnLCBkZWY6ICdpbmNvbWVfYWNjb3VudCcsIGlzU2VsZWN0ZWQ6IGZhbHNlLCBpc0VkaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBsYWJlbDogJ0V4cGVuc2UgQWNjb3VudCcsIGRlZjogJ2V4cGVuc2VfYWNjb3VudCcsIGlzU2VsZWN0ZWQ6IGZhbHNlLCBpc0VkaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBsYWJlbDogJ0NyZWF0b3InLCBkZWY6ICdjcmVhdG9yJywgaXNTZWxlY3RlZDogZmFsc2UsIGlzRWRpdGFibGU6IHRydWUgfSxcbiAgXTtcblxuICBzZWxlY3RlZENvbHVtbnM6IENvbHVtbkNvbmZpZ1tdID0gdGhpcy5jb2x1bW5Db25maWcuZmlsdGVyKChjb2wpID0+IGNvbC5pc1NlbGVjdGVkKTtcblxuICBnZXQgZGlzcGxheWVkQ29sdW1ucygpOiBzdHJpbmdbXSB7XG4gICAgaWYgKHRoaXMuZXhwb3J0SW5Qcm9ncmVzcykge1xuICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tRXhwb3J0Q29sdW1ucztcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0ZWRDb2xzID0gdGhpcy5zZWxlY3RlZENvbHVtbnMubWFwKGNvbCA9PiBjb2wuZGVmKTtcbiAgICBjb25zdCBkZWZhdWx0Q29scyA9IFtcbiAgICAgICcjJyxcbiAgICAgICduYW1lJywgXG4gICAgICAnc2t1JywgXG4gICAgICAnY2F0ZWdvcmllcycsIFxuICAgICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAgICdyZW9yZGVyX3BvaW50JyxcbiAgICAgICdzdG9ja19yZWNlaXB0cycsIFxuICAgICAgJ3N0b2NrX2lzc3VlcycsIFxuICAgICAgJ29uX2hhbmQnLCBcbiAgICAgICdtZWFzdXJlJywgXG4gICAgICAnc2FsZV9wcmljZSdcbiAgICBdO1xuICAgIGNvbnN0IGNvbHMgPSBkZWZhdWx0Q29scy5jb25jYXQoLi4uc2VsZWN0ZWRDb2xzKTtcbiAgICBjb2xzLnB1c2goJ0FjdGlvbnMnLCAnU2VsZWN0Jyk7XG4gICAgcmV0dXJuIGNvbHM7XG4gIH1cblxuICBpbXBvcnRJZCE6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgcHJvZHVjdFNlcnZpY2U6IFByb2R1Y3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgcHJvZHVjdEZvcm1TZXJ2aWNlOiBQcm9kdWN0Rm9ybVNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmZpbHRlckZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGNhdGVnb3J5X2lkczogWycnXSxcbiAgICAgIGV4cGVuc2VfYWNjb3VudF9pZHM6IFsnJ10sXG4gICAgICBpbmNvbWVfYWNjb3VudF9pZHM6IFsnJ10sXG4gICAgICBtZWFzdXJlX2lkczogWycnXSxcbiAgICAgIHNlYXJjaDogWycnXSxcbiAgICAgIHNvcnRfYnk6IFsnJ10sXG4gICAgICB0eXBlX2lkczogWycnXSxcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zPy5bJ2ltcG9ydF9pZCddKSB7XG4gICAgICB0aGlzLmltcG9ydElkID0gcGFyc2VJbnQodGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcz8uWydpbXBvcnRfaWQnXSk7XG4gICAgfVxuICAgIC8vIHVwZGF0ZSBmb3JtIHdpdGggVVJMIHF1ZXJ5IHBhcmFtc1xuICAgIHRoaXMucmVxdWVzdEhlbHBlclNlcnZpY2UudXBkYXRlRm9ybVdpdGhRdWVyeVBhcmFtcyh0aGlzLmZpbHRlckZvcm0sIHtcbiAgICAgIHR5cGVfaWRzOiB7IG11bHRpcGxlOiB0cnVlIH0sXG4gICAgICBjYXRlZ29yeV9pZHM6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICAgIGluY29tZV9hY2NvdW50X2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgICAgZXhwZW5zZV9hY2NvdW50X2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgIH0pO1xuICAgIC8vIFVwZGF0ZSBVUkwgcXVlcnkgcGFyYW1zIG9uIGZpbHRlciBjaGFuZ2VcbiAgICB0aGlzLmZpbHRlckZvcm0udmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDgwMCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnJlcXVlc3RIZWxwZXJTZXJ2aWNlLnVwZGF0ZVF1ZXJ5UGFyYW1zKFxuICAgICAgICB0aGlzLnJlcXVlc3RIZWxwZXJTZXJ2aWNlLmNvbnZlcnRUb0Zvcm1EYXRhKHtcbiAgICAgICAgICAuLi50aGlzLmZpbHRlckZvcm0udmFsdWUsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuICAgIC8vIGZldGNoIHRhc2sgb24gcGFyYW1zIGNoYW5nZVxuICAgIHRoaXMuYWN0aXZhdGVkUm91dGUucXVlcnlQYXJhbXMucGlwZShkZWJvdW5jZVRpbWUoODAwKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMucmVsb2FkKCkpO1xuICAgIC8vIGxpc3RlbiBmb3JtIHByb2R1Y3QgYWRkIG9yIHVwZGF0ZSBldmVudCBhbmQgcmVsb2FkLlxuICAgIHRoaXMucHJvZHVjdEZvcm1TZXJ2aWNlLmlzTGlzdFVwZGF0ZWQoKS5zdWJzY3JpYmUoKHZhbDogYm9vbGVhbikgPT4ge1xuICAgICAgaWYgKHZhbCAmJiAhdGhpcy5pc1dvcmtpbmcpIHtcbiAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGxvYWREYXRhKCkge1xuICAgIGxldCBwYXJhbXM6IGFueSA9IHtcbiAgICAgIC4uLnRoaXMucmVxdWVzdEhlbHBlclNlcnZpY2UuY29udmVydFRvRm9ybURhdGEodGhpcy5maWx0ZXJGb3JtLnZhbHVlKSxcbiAgICB9O1xuICAgIHBhcmFtcy5wYWdlID0gdGhpcy5wYWdlO1xuICAgIHBhcmFtcy5wZXJQYWdlID0gdGhpcy5wZXJQYWdlO1xuICAgIHBhcmFtcy53aXRoID0gJ2NhdGVnb3JpZXMsbGFzdFN0b2NrUmVjZWlwdCxsYXN0U3RvY2tJc3N1ZSxtZWFzdXJlLGNyZWF0b3InO1xuICAgIGlmICh0aGlzLmltcG9ydElkKSB7XG4gICAgICBwYXJhbXMuaW1wb3J0X2lkID0gdGhpcy5pbXBvcnRJZDtcbiAgICB9XG4gICAgdGhpcy5pc1dvcmtpbmcgPSB0cnVlO1xuXG4gICAgdGhpcy5wcm9kdWN0U2VydmljZS5pbmRleChwYXJhbXMpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5pc1dvcmtpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tb2RlbHMgPSB0aGlzLm1vZGVscy5jb25jYXQocmVzPy5kYXRhKTtcbiAgICAgICAgdGhpcy5sYXN0UGFnZSA9IHJlcz8ubGFzdF9wYWdlO1xuICAgICAgICAvLyBzdG9wIHJlbG9hZGluZyBkYXRhIG9uY2UgZGF0YSBsb2FkZWQuXG4gICAgICAgIHRoaXMucHJvZHVjdEZvcm1TZXJ2aWNlLmxpc3RVcGRhdGVkKGZhbHNlKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4gKHRoaXMuaXNXb3JraW5nID0gZmFsc2UpLFxuICAgIH0pO1xuICB9XG5cbiAgYXNzaWduRmlsdGVyKGNvbHVtbjogYW55LCBkaXJlY3Rpb246IHN0cmluZykge1xuICAgIGlmIChjb2x1bW4pIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlckZvcm0uZ2V0KCdzb3J0X2J5Jyk/LnNldFZhbHVlKGNvbHVtbiArICd8JyArIGRpcmVjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgc29ydENvbHVtbihldmVudDogYW55KSB7XG4gICAgdmFyIGRpcmVjdGlvbiA9IGV2ZW50LmRpcmVjdGlvbi50b1N0cmluZygpLnRvVXBwZXJDYXNlKCk7XG4gICAgdGhpcy5hc3NpZ25GaWx0ZXIoZXZlbnQuYWN0aXZlLCBkaXJlY3Rpb24pO1xuICB9XG5cbiAgaXNBbGxSb3dzU2VsZWN0ZWQoKSB7XG4gICAgY29uc3QgbnVtU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGg7XG4gICAgY29uc3QgbnVtUm93cyA9IHRoaXMubW9kZWxzLmxlbmd0aDtcbiAgICByZXR1cm4gbnVtU2VsZWN0ZWQgPT09IG51bVJvd3M7XG4gIH1cblxuICAvKiogU2VsZWN0cyBhbGwgcm93cyBpZiB0aGV5IGFyZSBub3QgYWxsIHNlbGVjdGVkOyBvdGhlcndpc2UgY2xlYXIgc2VsZWN0aW9uLiAqL1xuICB0b2dnbGVBbGxSb3dzKCkge1xuICAgIGlmICh0aGlzLmlzQWxsUm93c1NlbGVjdGVkKCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0KC4uLnRoaXMubW9kZWxzKTtcbiAgfVxuXG4gIGNoZWNrYm94TGFiZWwocm93PzogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoIXJvdykge1xuICAgICAgcmV0dXJuIGAke3RoaXMuaXNBbGxSb3dzU2VsZWN0ZWQoKSA/ICdkZXNlbGVjdCcgOiAnc2VsZWN0J30gYWxsYDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3RoaXMuc2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KSA/ICdkZXNlbGVjdCcgOiAnc2VsZWN0J30gcm93ICR7cm93LnBvc2l0aW9uICsgMX1gO1xuICB9XG5cbiAgaGFuZGxlRXhwb3J0KGhpZGVDb2x1bW5zOiBib29sZWFuKSB7XG4gICAgdGhpcy5leHBvcnRJblByb2dyZXNzID0gaGlkZUNvbHVtbnM7XG4gIH1cbn1cbiIsIjxtYXQtY2FyZCBjbGFzcz1cIm1iLTNcIj5cbiAgPG1hdC1jYXJkLWNvbnRlbnQ+XG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtXCIgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgIDxoMyBjbGFzcz1cIm1iLTBcIj5Qcm9kdWN0czwvaDM+XG4gICAgICAgIDxhcHAtcHJvZHVjdC1mb3JtLWJ1dHRvbj48L2FwcC1wcm9kdWN0LWZvcm0tYnV0dG9uPlxuICAgICAgICA8c3BhbiBtYXRUb29sdGlwPVwiSW1wb3J0XCIgcm91dGVyTGluaz1cImltcG9ydFwiIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPlxuICAgICAgICAgIGZpbGVfdXBsb2FkXG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGFwcC1leHBvcnQtdG8tZXhjZWwtYnV0dG9uIHRhYmxlSWQ9XCJwcm9kdWN0VGFibGVcIiBmaWxlTmFtZT1cInByb2R1Y3RzXCIgKG9uRXhwb3J0U3RhcnQpPVwiaGFuZGxlRXhwb3J0KHRydWUpXCJcbiAgICAgICAgICAob25FeHBvcnRFbmQpPVwiaGFuZGxlRXhwb3J0KGZhbHNlKVwiPlxuICAgICAgICA8L2FwcC1leHBvcnQtdG8tZXhjZWwtYnV0dG9uPlxuICAgICAgICA8YXBwLWNvbHVtbi1zZWxlY3RvciBtb2RlPVwiaWNvblwiIGNsYXNzPVwiZC1wcmludC1ub25lXCIgW2NvbHVtbkNvbmZpZ3NdPVwiY29sdW1uQ29uZmlnXCJcbiAgICAgICAgICBbKHNlbGVjdGVkQ29sdW1ucyldPVwic2VsZWN0ZWRDb2x1bW5zXCI+PC9hcHAtY29sdW1uLXNlbGVjdG9yPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9J2ZsLW1kJz5cbiAgICAgICAgICA8bWF0LWxhYmVsPlNlYXJjaDwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIlNlYXJjaCBwcm9kdWN0c1wiIGZvcm1Db250cm9sTmFtZT1cInNlYXJjaFwiIC8+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPSdmbC1zbSc+XG4gICAgICAgICAgPG1hdC1sYWJlbD5DYXRlZ29yeTwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvciBhcGlVcmw9XCJhcGkvcHJvZHVjdC1jYXRlZ29yaWVzXCIgZm9ybUNvbnRyb2xOYW1lPVwiY2F0ZWdvcnlfaWRzXCIgW211bHRpcGxlXT1cInRydWVcIj5cbiAgICAgICAgICA8L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz0nZmwtc20nPlxuICAgICAgICAgIDxtYXQtbGFiZWw+VHlwZTwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvciBhcGlVcmw9XCJhcGkvcHJvZHVjdC10eXBlc1wiIGZvcm1Db250cm9sTmFtZT1cInR5cGVfaWRzXCIgdGl0bGVGaWVsZD1cInRpdGxlXCJcbiAgICAgICAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCI+XG4gICAgICAgICAgPC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT5cbiAgPC9tYXQtY2FyZC1jb250ZW50PlxuPC9tYXQtY2FyZD5cblxuPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtc3RhcnQgZ2FwLTNcIj5cbiAgPG1hdC1jYXJkIFtjbGFzcy5mbGV4LWZpbGxdPVwiIXNlbGVjdGlvbi5pc0VtcHR5KClcIiBbY2xhc3Mudy0xMDBdPVwic2VsZWN0aW9uLmlzRW1wdHkoKVwiPlxuICAgIDxtYXQtY2FyZC1jb250ZW50IGNsYXNzPVwicC0wXCI+XG4gICAgICA8dGFibGUgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cIm1vZGVsc1wiIGNsYXNzPVwidy0xMDBcIiBpbmZpbml0ZVNjcm9sbCBbaW5maW5pdGVTY3JvbGxEaXN0YW5jZV09XCIyXCJcbiAgICAgICAgW2luZmluaXRlU2Nyb2xsVGhyb3R0bGVdPVwiNTBcIiAoc2Nyb2xsZWQpPVwib25TY3JvbGwoKVwiIFtmcm9tUm9vdF09XCJ0cnVlXCIgbWF0U29ydFxuICAgICAgICAobWF0U29ydENoYW5nZSk9XCJzb3J0Q29sdW1uKCRldmVudClcIiBtYXRTb3J0RGlzYWJsZUNsZWFyPVwidHJ1ZVwiIGFyaWEtZGVzY3JpYmVkYnk9XCJQcm9kdWN0cyBMaXN0XCJcbiAgICAgICAgaWQ9XCJwcm9kdWN0VGFibGVcIj5cbiAgICAgICAgPCEtLSAjIENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCIjXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4jPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudDsgbGV0IGkgPSBpbmRleFwiPnt7IGkgKyAxIH19PC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBOYW1lIENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJuYW1lXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCBtYXQtc29ydC1oZWFkZXIgKm1hdEhlYWRlckNlbGxEZWY+TmFtZTwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTFcIj5cbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJ0ZXh0LWRlY29yYXRpb24tbm9uZSB0ZXh0LWRhcmtcIiBbcm91dGVyTGlua109XCJbZWxlbWVudD8uaWQsICd2aWV3J11cIj57eyBlbGVtZW50Lm5hbWUgfX08L2E+XG4gICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtc2Vjb25kYXJ5XCIgKm5nSWY9XCJlbGVtZW50LnR5cGUgJiYgIWV4cG9ydEluUHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgICB7eyBlbGVtZW50LnR5cGU/LnRpdGxlIH19XG4gICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFR5cGUgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInR5cGVcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsIG1hdC1zb3J0LWhlYWRlciAqbWF0SGVhZGVyQ2VsbERlZj5UeXBlPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAge3sgZWxlbWVudD8udHlwZT8udGl0bGUgfX1cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIENhdGVnb3JpZXMgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImNhdGVnb3JpZXNcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPkNhdGVnb3JpZXM8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgc3R5bGU9XCJtYXgtd2lkdGg6IDIwMHB4XCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZWxlbWVudD8uY2F0ZWdvcmllcz8ubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1zdGFydCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTEgZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctc2Vjb25kYXJ5XCIgKm5nRm9yPVwibGV0IGNhdGVnb3J5IG9mIGVsZW1lbnQ/LmNhdGVnb3JpZXNcIj5cbiAgICAgICAgICAgICAgICB7eyBjYXRlZ29yeT8udGl0bGUgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBTS1UgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInNrdVwiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgbWF0LXNvcnQtaGVhZGVyICptYXRIZWFkZXJDZWxsRGVmPlNLVTwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj57eyBlbGVtZW50LnNrdSB9fTwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsIG1hdC1zb3J0LWhlYWRlciAqbWF0SGVhZGVyQ2VsbERlZj5EZXNjcmlwdGlvbjwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj57eyBlbGVtZW50LmRlc2NyaXB0aW9uIH19PC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBJbml0aWFsIFF1YW50aXR5IENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJpbml0aWFsX3F1YW50aXR5XCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCBtYXQtc29ydC1oZWFkZXIgKm1hdEhlYWRlckNlbGxEZWY+SW5pdGlhbCBRdWFudGl0eTwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMFwiPnt7IGVsZW1lbnQuaW5pdGlhbF9xdWFudGl0eSB9fTwvcD5cbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtc2Vjb25kYXJ5XCIgKm5nSWY9XCJlbGVtZW50Py5pbml0aWFsX3F1YW50aXR5X2RhdGVcIj5cbiAgICAgICAgICAgICAgb24ge3sgZWxlbWVudD8uaW5pdGlhbF9xdWFudGl0eV9kYXRlIHwgZGF0ZSB9fVxuICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFN0b2NrIFJlY2VpcHRzIENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzdG9ja19yZWNlaXB0c1wiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgbWF0LXNvcnQtaGVhZGVyPVwic3RvY2tfcmVjZWlwdHNfc3VtX3F1YW50aXR5XCIgKm1hdEhlYWRlckNlbGxEZWY+U3RvY2sgUmVjZWlwdHM8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTBcIj57eyBlbGVtZW50Py5zdG9ja19yZWNlaXB0c19zdW1fcXVhbnRpdHkgfX08L3A+XG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeVwiICpuZ0lmPVwiZWxlbWVudD8ubGFzdF9zdG9ja19yZWNlaXB0ICYmICFleHBvcnRJblByb2dyZXNzXCI+XG4gICAgICAgICAgICAgIExhdGVzdCBvbiB7eyBlbGVtZW50Py5sYXN0X3N0b2NrX3JlY2VpcHQ/LmRhdGUgfCBkYXRlIH19XG4gICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gU3RvY2sgSXNzdWVzIENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzdG9ja19pc3N1ZXNcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsIG1hdC1zb3J0LWhlYWRlcj1cInN0b2NrX2lzc3Vlc19zdW1fcXVhbnRpdHlcIiAqbWF0SGVhZGVyQ2VsbERlZj5TdG9jayBJc3N1ZXM8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTBcIj57eyBlbGVtZW50Py5zdG9ja19pc3N1ZXNfc3VtX3F1YW50aXR5IH19PC9wPlxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1zZWNvbmRhcnlcIiAqbmdJZj1cImVsZW1lbnQ/Lmxhc3Rfc3RvY2tfaXNzdWUgJiYgIWV4cG9ydEluUHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgTGF0ZXN0IG9uIHt7IGVsZW1lbnQ/Lmxhc3Rfc3RvY2tfaXNzdWU/LmRhdGUgfCBkYXRlIH19XG4gICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gT24gSGFuZCBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwib25faGFuZFwiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgbWF0LXNvcnQtaGVhZGVyPSdzdG9ja19vbl9oYW5kJyAqbWF0SGVhZGVyQ2VsbERlZj5PbiBIYW5kPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAge3sgZWxlbWVudD8uc3RvY2tfb25faGFuZCB9fVxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibWVhc3VyZVwiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgbWF0LXNvcnQtaGVhZGVyICptYXRIZWFkZXJDZWxsRGVmPk1lYXN1cmU8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICB7eyBlbGVtZW50Py5tZWFzdXJlPy50aXRsZSB9fVxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gUmVvcmRlciBQb2ludCBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwicmVvcmRlcl9wb2ludFwiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgbWF0LXNvcnQtaGVhZGVyICptYXRIZWFkZXJDZWxsRGVmPlJlb3JkZXIgUG9pbnQ8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICB7eyBlbGVtZW50LnJlb3JkZXJfcG9pbnQgfX1cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFNlbGxpbmcgUHJpY2UgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInNhbGVfcHJpY2VcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsIG1hdC1zb3J0LWhlYWRlciAqbWF0SGVhZGVyQ2VsbERlZj5TZWxsaW5nIFByaWNlPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAge3sgZWxlbWVudC5zYWxlX3ByaWNlIHwgY3VycmVuY3kgfX1cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIEluY29tZSBBY2NvdW50IENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJpbmNvbWVfYWNjb3VudFwiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+SW5jb21lIEFjY291bnQ8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICB7eyBlbGVtZW50Py5pbmNvbWVfYWNjb3VudD8udGl0bGUgfX1cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIEV4cGVuc2UgQWNjb3VudCBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZXhwZW5zZV9hY2NvdW50XCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5FeHBlbnNlIEFjY291bnQ8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICB7eyBlbGVtZW50Py5leHBlbnNlX2FjY291bnQ/LnRpdGxlIH19XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBDcmVhdG9yIENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJjcmVhdG9yXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5DcmVhdG9yPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wXCI+e3sgZWxlbWVudD8uY3JlYXRvcj8ubmFtZSB9fTwvcD5cbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtc2Vjb25kYXJ5XCI+e3sgZWxlbWVudD8uY3JlYXRlZF9hdCB8IGRhdGUgfX08L3NtYWxsPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gQWN0aW9ucyBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiQWN0aW9uc1wiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+QWN0aW9uczwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeSBkLWZsZXggZ2FwLTFcIj5cbiAgICAgICAgICAgICAgPGFwcC10ZWNobGlmeS1pY29uIG5hbWU9J3ZpZXcnIFtyb3V0ZXJMaW5rXT1cIltlbGVtZW50LmlkLCAndmlldyddXCJcbiAgICAgICAgICAgICAgICByb3V0ZXJMaW5rQWN0aXZlPVwicm91dGUtbGluay1hY3RpdmVcIj48L2FwcC10ZWNobGlmeS1pY29uPlxuXG4gICAgICAgICAgICAgIDxhcHAtcHJvZHVjdC1mb3JtLWJ1dHRvbiBbcHJvZHVjdF09XCJlbGVtZW50XCI+PC9hcHAtcHJvZHVjdC1mb3JtLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPGFwcC1zdG9jay1yZWNlaXB0LWZvcm0tYnV0dG9uIFtwcm9kdWN0XT1cImVsZW1lbnRcIiAoc2F2ZWQpPVwicmVsb2FkKClcIj48L2FwcC1zdG9jay1yZWNlaXB0LWZvcm0tYnV0dG9uPlxuICAgICAgICAgICAgICA8YXBwLXN0b2NrLWlzc3VlLWZvcm0tYnV0dG9uIFtwcm9kdWN0XT1cImVsZW1lbnRcIiAoc2F2ZWQpPVwicmVsb2FkKClcIj48L2FwcC1zdG9jay1pc3N1ZS1mb3JtLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiU2VsZWN0XCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggKGNoYW5nZSk9XCIkZXZlbnQgPyB0b2dnbGVBbGxSb3dzKCkgOiBudWxsXCJcbiAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgaXNBbGxSb3dzU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmICFpc0FsbFJvd3NTZWxlY3RlZCgpXCIgW2FyaWEtbGFiZWxdPVwiY2hlY2tib3hMYWJlbCgpXCI+XG4gICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cbiAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChjaGFuZ2UpPVwiJGV2ZW50ID8gc2VsZWN0aW9uLnRvZ2dsZShyb3cpIDogbnVsbFwiXG4gICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdylcIiBbYXJpYS1sYWJlbF09XCJjaGVja2JveExhYmVsKHJvdylcIj5cbiAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZj48L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zOyBzdGlja3k6IHRydWVcIj48L3RyPlxuICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1uc1wiPjwvdHI+XG4gICAgICA8L3RhYmxlPlxuXG4gICAgICA8bWF0LXByb2dyZXNzLWJhciBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiICpuZ0lmPVwiaXNXb3JraW5nXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxuICAgIDwvbWF0LWNhcmQtY29udGVudD5cbiAgPC9tYXQtY2FyZD5cbiAgPG1hdC1jYXJkICpuZ0lmPVwiIXNlbGVjdGlvbi5pc0VtcHR5KClcIiBjbGFzcz1cImJhdGNoLXVwZGF0ZS1jYXJkXCI+XG4gICAgPG1hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICA8YXBwLXByb2R1Y3QtYmF0Y2gtdXBkYXRlLWZvcm0gW3NlbGVjdGlvbl09XCJzZWxlY3Rpb25cIiAodXBkYXRlZCk9XCJyZWxvYWQoKVwiPjwvYXBwLXByb2R1Y3QtYmF0Y2gtdXBkYXRlLWZvcm0+XG4gICAgPC9tYXQtY2FyZC1jb250ZW50PlxuICA8L21hdC1jYXJkPlxuPC9kaXY+Il19
|
|
188
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ludmVudG9yeS1jb21tb24vc3JjL2xpYi9pbnZlbnRvcnktY29tbW9uL3Byb2R1Y3QvcHJvZHVjdC1saXN0L3Byb2R1Y3QtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9wcm9kdWN0L3Byb2R1Y3QtbGlzdC9wcm9kdWN0LWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFJbEQsT0FBTyxFQUFnQixrQ0FBa0MsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXJGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPbkQsSUFBTSxvQkFBb0IsR0FBMUIsTUFBTSxvQkFBcUIsU0FBUSxrQ0FBa0M7SUEwRGhFO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUE1RFYsU0FBUyxHQUFHLElBQUksY0FBYyxDQUFNLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUU5QyxxQ0FBcUM7SUFDN0IsbUJBQW1CLEdBQWE7UUFDdEMsR0FBRztRQUNILE1BQU07UUFDTixNQUFNO1FBQ04sS0FBSztRQUNMLFlBQVk7UUFDWixlQUFlO1FBQ2YsZ0JBQWdCO1FBQ2hCLHlCQUF5QjtRQUN6QixjQUFjO1FBQ2QsdUJBQXVCO1FBQ3ZCLFNBQVM7UUFDVCxTQUFTO1FBQ1QsWUFBWTtLQUNiLENBQUM7SUFFRixnQkFB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RkFBcEIsb0JBQW9CLCtFQ2hCakMscXFVQWlPTTs7QURqTk8sb0JBQW9CO0lBTmhDLFlBQVksRUFBRTtHQU1GLG9CQUFvQixDQXNLaEM7OzRGQXRLWSxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0Usa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IENvbHVtbkNvbmZpZywgVGVjaGxpZnlMaXN0aW5nQ29udHJvbGxlckludGVyZmFjZSB9IGZyb20gJ25neC10ZWNobGlmeS1jb3JlJztcbmltcG9ydCB7IFByb2R1Y3RTZXJ2aWNlIH0gZnJvbSAnLi4vcHJvZHVjdC5zZXJ2aWNlJztcbmltcG9ydCB7IFVudGlsRGVzdHJveSB9IGZyb20gJ0BuZ25lYXQvdW50aWwtZGVzdHJveSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBQcm9kdWN0Rm9ybVNlcnZpY2UgfSBmcm9tICcuLi9wcm9kdWN0LWZvcm0uc2VydmljZSc7XG5pbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5AVW50aWxEZXN0cm95KClcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1wcm9kdWN0LWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJvZHVjdC1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcHJvZHVjdC1saXN0LmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFByb2R1Y3RMaXN0Q29tcG9uZW50IGV4dGVuZHMgVGVjaGxpZnlMaXN0aW5nQ29udHJvbGxlckludGVyZmFjZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odHJ1ZSwgW10pO1xuXG4gIC8vIENvbHVtbnMgdG8gdXNlIGR1cmluZyBFeGNlbCBleHBvcnRcbiAgcHJpdmF0ZSBjdXN0b21FeHBvcnRDb2x1bW5zOiBzdHJpbmdbXSA9IFtcbiAgICAnIycsXG4gICAgJ25hbWUnLFxuICAgICd0eXBlJyxcbiAgICAnc2t1JyxcbiAgICAnY2F0ZWdvcmllcycsXG4gICAgJ3Jlb3JkZXJfcG9pbnQnLFxuICAgICdzdG9ja19yZWNlaXB0cycsXG4gICAgJ2xhc3Rfc3RvY2tfcmVjZWlwdF9kYXRlJyxcbiAgICAnc3RvY2tfaXNzdWVzJyxcbiAgICAnbGFzdF9zdG9ja19pc3N1ZV9kYXRlJyxcbiAgICAnb25faGFuZCcsXG4gICAgJ21lYXN1cmUnLFxuICAgICdzYWxlX3ByaWNlJ1xuICBdO1xuXG4gIGV4cG9ydEluUHJvZ3Jlc3MgPSBmYWxzZTtcblxuICBjb2x1bW5Db25maWc6IENvbHVtbkNvbmZpZ1tdID0gW1xuICAgIHsgbGFiZWw6ICdJbml0aWFsIFF1YW50aXR5JywgZGVmOiAnaW5pdGlhbF9xdWFudGl0eScsIGlzU2VsZWN0ZWQ6IGZhbHNlLCBpc0VkaXRhYmxlOiB0cnVlIH0sXG4gICAgeyBsYWJlbDogJ0luY29tZSBBY2NvdW50JywgZGVmOiAnaW5jb21lX2FjY291bnQnLCBpc1NlbGVjdGVkOiBmYWxzZSwgaXNFZGl0YWJsZTogdHJ1ZSB9LFxuICAgIHsgbGFiZWw6ICdFeHBlbnNlIEFjY291bnQnLCBkZWY6ICdleHBlbnNlX2FjY291bnQnLCBpc1NlbGVjdGVkOiBmYWxzZSwgaXNFZGl0YWJsZTogdHJ1ZSB9LFxuICAgIHsgbGFiZWw6ICdDcmVhdG9yJywgZGVmOiAnY3JlYXRvcicsIGlzU2VsZWN0ZWQ6IGZhbHNlLCBpc0VkaXRhYmxlOiB0cnVlIH0sXG4gIF07XG5cbiAgc2VsZWN0ZWRDb2x1bW5zOiBDb2x1bW5Db25maWdbXSA9IHRoaXMuY29sdW1uQ29uZmlnLmZpbHRlcigoY29sKSA9PiBjb2wuaXNTZWxlY3RlZCk7XG5cbiAgZ2V0IGRpc3BsYXllZENvbHVtbnMoKTogc3RyaW5nW10ge1xuICAgIGlmICh0aGlzLmV4cG9ydEluUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybiB0aGlzLmN1c3RvbUV4cG9ydENvbHVtbnM7XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdGVkQ29scyA9IHRoaXMuc2VsZWN0ZWRDb2x1bW5zLm1hcChjb2wgPT4gY29sLmRlZik7XG4gICAgY29uc3QgZGVmYXVsdENvbHMgPSBbXG4gICAgICAnIycsXG4gICAgICAnbmFtZScsIFxuICAgICAgJ3NrdScsIFxuICAgICAgJ2NhdGVnb3JpZXMnLCBcbiAgICAgICdkZXNjcmlwdGlvbicsXG4gICAgICAncmVvcmRlcl9wb2ludCcsXG4gICAgICAnc3RvY2tfcmVjZWlwdHMnLCBcbiAgICAgICdzdG9ja19pc3N1ZXMnLCBcbiAgICAgICdvbl9oYW5kJywgXG4gICAgICAnbWVhc3VyZScsIFxuICAgICAgJ3NhbGVfcHJpY2UnXG4gICAgXTtcbiAgICBjb25zdCBjb2xzID0gZGVmYXVsdENvbHMuY29uY2F0KC4uLnNlbGVjdGVkQ29scyk7XG4gICAgY29scy5wdXNoKCdBY3Rpb25zJywgJ1NlbGVjdCcpO1xuICAgIHJldHVybiBjb2xzO1xuICB9XG5cbiAgaW1wb3J0SWQhOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHByb2R1Y3RTZXJ2aWNlOiBQcm9kdWN0U2VydmljZSxcbiAgICBwcml2YXRlIHByb2R1Y3RGb3JtU2VydmljZTogUHJvZHVjdEZvcm1TZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5maWx0ZXJGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBjYXRlZ29yeV9pZHM6IFsnJ10sXG4gICAgICBleHBlbnNlX2FjY291bnRfaWRzOiBbJyddLFxuICAgICAgaW5jb21lX2FjY291bnRfaWRzOiBbJyddLFxuICAgICAgbWVhc3VyZV9pZHM6IFsnJ10sXG4gICAgICBzZWFyY2g6IFsnJ10sXG4gICAgICBzb3J0X2J5OiBbJyddLFxuICAgICAgdHlwZV9pZHM6IFsnJ10sXG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcz8uWydpbXBvcnRfaWQnXSkge1xuICAgICAgdGhpcy5pbXBvcnRJZCA9IHBhcnNlSW50KHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXM/LlsnaW1wb3J0X2lkJ10pO1xuICAgIH1cbiAgICAvLyB1cGRhdGUgZm9ybSB3aXRoIFVSTCBxdWVyeSBwYXJhbXNcbiAgICB0aGlzLnJlcXVlc3RIZWxwZXJTZXJ2aWNlLnVwZGF0ZUZvcm1XaXRoUXVlcnlQYXJhbXModGhpcy5maWx0ZXJGb3JtLCB7XG4gICAgICB0eXBlX2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgICAgY2F0ZWdvcnlfaWRzOiB7IG11bHRpcGxlOiB0cnVlIH0sXG4gICAgICBpbmNvbWVfYWNjb3VudF9pZHM6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICAgIGV4cGVuc2VfYWNjb3VudF9pZHM6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICB9KTtcbiAgICAvLyBVcGRhdGUgVVJMIHF1ZXJ5IHBhcmFtcyBvbiBmaWx0ZXIgY2hhbmdlXG4gICAgdGhpcy5maWx0ZXJGb3JtLnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZSg4MDApKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5yZXF1ZXN0SGVscGVyU2VydmljZS51cGRhdGVRdWVyeVBhcmFtcyhcbiAgICAgICAgdGhpcy5yZXF1ZXN0SGVscGVyU2VydmljZS5jb252ZXJ0VG9Gb3JtRGF0YSh7XG4gICAgICAgICAgLi4udGhpcy5maWx0ZXJGb3JtLnZhbHVlLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcbiAgICAvLyBmZXRjaCB0YXNrIG9uIHBhcmFtcyBjaGFuZ2VcbiAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnF1ZXJ5UGFyYW1zLnBpcGUoZGVib3VuY2VUaW1lKDgwMCkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlbG9hZCgpKTtcbiAgICAvLyBsaXN0ZW4gZm9ybSBwcm9kdWN0IGFkZCBvciB1cGRhdGUgZXZlbnQgYW5kIHJlbG9hZC5cbiAgICB0aGlzLnByb2R1Y3RGb3JtU2VydmljZS5pc0xpc3RVcGRhdGVkKCkuc3Vic2NyaWJlKCh2YWw6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmICh2YWwgJiYgIXRoaXMuaXNXb3JraW5nKSB7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSBsb2FkRGF0YSgpIHtcbiAgICBsZXQgcGFyYW1zOiBhbnkgPSB7XG4gICAgICAuLi50aGlzLnJlcXVlc3RIZWxwZXJTZXJ2aWNlLmNvbnZlcnRUb0Zvcm1EYXRhKHRoaXMuZmlsdGVyRm9ybS52YWx1ZSksXG4gICAgfTtcbiAgICBwYXJhbXMucGFnZSA9IHRoaXMucGFnZTtcbiAgICBwYXJhbXMucGVyUGFnZSA9IHRoaXMucGVyUGFnZTtcbiAgICBwYXJhbXMud2l0aCA9ICdjYXRlZ29yaWVzLGxhc3RTdG9ja1JlY2VpcHQsbGFzdFN0b2NrSXNzdWUsbWVhc3VyZSxjcmVhdG9yJztcbiAgICBpZiAodGhpcy5pbXBvcnRJZCkge1xuICAgICAgcGFyYW1zLmltcG9ydF9pZCA9IHRoaXMuaW1wb3J0SWQ7XG4gICAgfVxuICAgIHRoaXMuaXNXb3JraW5nID0gdHJ1ZTtcblxuICAgIHRoaXMucHJvZHVjdFNlcnZpY2UuaW5kZXgocGFyYW1zKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuaXNXb3JraW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMubW9kZWxzID0gdGhpcy5tb2RlbHMuY29uY2F0KHJlcz8uZGF0YSk7XG4gICAgICAgIHRoaXMubGFzdFBhZ2UgPSByZXM/Lmxhc3RfcGFnZTtcbiAgICAgICAgLy8gc3RvcCByZWxvYWRpbmcgZGF0YSBvbmNlIGRhdGEgbG9hZGVkLlxuICAgICAgICB0aGlzLnByb2R1Y3RGb3JtU2VydmljZS5saXN0VXBkYXRlZChmYWxzZSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+ICh0aGlzLmlzV29ya2luZyA9IGZhbHNlKSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzc2lnbkZpbHRlcihjb2x1bW46IGFueSwgZGlyZWN0aW9uOiBzdHJpbmcpIHtcbiAgICBpZiAoY29sdW1uKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXJGb3JtLmdldCgnc29ydF9ieScpPy5zZXRWYWx1ZShjb2x1bW4gKyAnfCcgKyBkaXJlY3Rpb24pO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIHNvcnRDb2x1bW4oZXZlbnQ6IGFueSkge1xuICAgIHZhciBkaXJlY3Rpb24gPSBldmVudC5kaXJlY3Rpb24udG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpO1xuICAgIHRoaXMuYXNzaWduRmlsdGVyKGV2ZW50LmFjdGl2ZSwgZGlyZWN0aW9uKTtcbiAgfVxuXG4gIGlzQWxsUm93c1NlbGVjdGVkKCkge1xuICAgIGNvbnN0IG51bVNlbGVjdGVkID0gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoO1xuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLm1vZGVscy5sZW5ndGg7XG4gICAgcmV0dXJuIG51bVNlbGVjdGVkID09PSBudW1Sb3dzO1xuICB9XG5cbiAgLyoqIFNlbGVjdHMgYWxsIHJvd3MgaWYgdGhleSBhcmUgbm90IGFsbCBzZWxlY3RlZDsgb3RoZXJ3aXNlIGNsZWFyIHNlbGVjdGlvbi4gKi9cbiAgdG9nZ2xlQWxsUm93cygpIHtcbiAgICBpZiAodGhpcy5pc0FsbFJvd3NTZWxlY3RlZCgpKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdCguLi50aGlzLm1vZGVscyk7XG4gIH1cblxuICBjaGVja2JveExhYmVsKHJvdz86IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCFyb3cpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmlzQWxsUm93c1NlbGVjdGVkKCkgPyAnZGVzZWxlY3QnIDogJ3NlbGVjdCd9IGFsbGA7XG4gICAgfVxuICAgIHJldHVybiBgJHt0aGlzLnNlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdykgPyAnZGVzZWxlY3QnIDogJ3NlbGVjdCd9IHJvdyAke3Jvdy5wb3NpdGlvbiArIDF9YDtcbiAgfVxuXG4gIGhhbmRsZUV4cG9ydChoaWRlQ29sdW1uczogYm9vbGVhbikge1xuICAgIHRoaXMuZXhwb3J0SW5Qcm9ncmVzcyA9IGhpZGVDb2x1bW5zO1xuICB9XG59XG4iLCI8bWF0LWNhcmQgY2xhc3M9XCJtYi0zXCI+XG4gIDxtYXQtY2FyZC1jb250ZW50PlxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZmlsdGVyRm9ybVwiIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICA8aDMgY2xhc3M9XCJtYi0wXCI+UHJvZHVjdHM8L2gzPlxuICAgICAgICA8YXBwLXByb2R1Y3QtZm9ybS1idXR0b24+PC9hcHAtcHJvZHVjdC1mb3JtLWJ1dHRvbj5cbiAgICAgICAgPHNwYW4gbWF0VG9vbHRpcD1cIkltcG9ydFwiIHJvdXRlckxpbms9XCJpbXBvcnRcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyIG1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj5cbiAgICAgICAgICBmaWxlX3VwbG9hZFxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxhcHAtZXhwb3J0LXRvLWV4Y2VsLWJ1dHRvbiB0YWJsZUlkPVwicHJvZHVjdFRhYmxlXCIgZmlsZU5hbWU9XCJwcm9kdWN0c1wiIChvbkV4cG9ydFN0YXJ0KT1cImhhbmRsZUV4cG9ydCh0cnVlKVwiXG4gICAgICAgICAgKG9uRXhwb3J0RW5kKT1cImhhbmRsZUV4cG9ydChmYWxzZSlcIj5cbiAgICAgICAgPC9hcHAtZXhwb3J0LXRvLWV4Y2VsLWJ1dHRvbj5cbiAgICAgICAgPGFwcC1jb2x1bW4tc2VsZWN0b3IgbW9kZT1cImljb25cIiBjbGFzcz1cImQtcHJpbnQtbm9uZVwiIFtjb2x1bW5Db25maWdzXT1cImNvbHVtbkNvbmZpZ1wiXG4gICAgICAgICAgWyhzZWxlY3RlZENvbHVtbnMpXT1cInNlbGVjdGVkQ29sdW1uc1wiPjwvYXBwLWNvbHVtbi1zZWxlY3Rvcj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1zdGFydCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPSdmbC1tZCc+XG4gICAgICAgICAgPG1hdC1sYWJlbD5TZWFyY2g8L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJTZWFyY2ggcHJvZHVjdHNcIiBmb3JtQ29udHJvbE5hbWU9XCJzZWFyY2hcIiAvPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz0nZmwtc20nPlxuICAgICAgICAgIDxtYXQtbGFiZWw+Q2F0ZWdvcnk8L21hdC1sYWJlbD5cbiAgICAgICAgICA8YXBwLXNlYXJjaGFibGUtc2VsZWN0b3IgYXBpVXJsPVwiYXBpL3Byb2R1Y3QtY2F0ZWdvcmllc1wiIGZvcm1Db250cm9sTmFtZT1cImNhdGVnb3J5X2lkc1wiIFttdWx0aXBsZV09XCJ0cnVlXCI+XG4gICAgICAgICAgPC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9J2ZsLXNtJz5cbiAgICAgICAgICA8bWF0LWxhYmVsPlR5cGU8L21hdC1sYWJlbD5cbiAgICAgICAgICA8YXBwLXNlYXJjaGFibGUtc2VsZWN0b3IgYXBpVXJsPVwiYXBpL3Byb2R1Y3QtdHlwZXNcIiBmb3JtQ29udHJvbE5hbWU9XCJ0eXBlX2lkc1wiIHRpdGxlRmllbGQ9XCJ0aXRsZVwiXG4gICAgICAgICAgICBbbXVsdGlwbGVdPVwidHJ1ZVwiPlxuICAgICAgICAgIDwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Zvcm0+XG4gIDwvbWF0LWNhcmQtY29udGVudD5cbjwvbWF0LWNhcmQ+XG5cbjxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0IGdhcC0zXCI+XG4gIDxtYXQtY2FyZCBbY2xhc3MuZmxleC1maWxsXT1cIiFzZWxlY3Rpb24uaXNFbXB0eSgpXCIgW2NsYXNzLnctMTAwXT1cInNlbGVjdGlvbi5pc0VtcHR5KClcIj5cbiAgICA8bWF0LWNhcmQtY29udGVudCBjbGFzcz1cInAtMFwiPlxuICAgICAgPHRhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJtb2RlbHNcIiBjbGFzcz1cInctMTAwXCIgaW5maW5pdGVTY3JvbGwgW2luZmluaXRlU2Nyb2xsRGlzdGFuY2VdPVwiMlwiXG4gICAgICAgIFtpbmZpbml0ZVNjcm9sbFRocm90dGxlXT1cIjUwXCIgKHNjcm9sbGVkKT1cIm9uU2Nyb2xsKClcIiBbZnJvbVJvb3RdPVwidHJ1ZVwiIG1hdFNvcnRcbiAgICAgICAgKG1hdFNvcnRDaGFuZ2UpPVwic29ydENvbHVtbigkZXZlbnQpXCIgbWF0U29ydERpc2FibGVDbGVhcj1cInRydWVcIiBhcmlhLWRlc2NyaWJlZGJ5PVwiUHJvZHVjdHMgTGlzdFwiXG4gICAgICAgIGlkPVwicHJvZHVjdFRhYmxlXCI+XG4gICAgICAgIDwhLS0gIyBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiI1wiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IzwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7IGxldCBpID0gaW5kZXhcIj57eyBpICsgMSB9fTwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gTmFtZSBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibmFtZVwiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgbWF0LXNvcnQtaGVhZGVyICptYXRIZWFkZXJDZWxsRGVmPk5hbWU8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0xXCI+XG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwidGV4dC1kZWNvcmF0aW9uLW5vbmUgdGV4dC1kYXJrXCIgW3JvdXRlckxpbmtdPVwiW2VsZW1lbnQ/LmlkLCAndmlldyddXCI+e3sgZWxlbWVudC5uYW1lIH19PC9hPlxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeVwiICpuZ0lmPVwiZWxlbWVudC50eXBlICYmICFleHBvcnRJblByb2dyZXNzXCI+XG4gICAgICAgICAgICAgICAge3sgZWxlbWVudC50eXBlPy50aXRsZSB9fVxuICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBUeXBlIENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJ0eXBlXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCBtYXQtc29ydC1oZWFkZXIgKm1hdEhlYWRlckNlbGxEZWY+VHlwZTwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgIHt7IGVsZW1lbnQ/LnR5cGU/LnRpdGxlIH19XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBDYXRlZ29yaWVzIENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJjYXRlZ29yaWVzXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5DYXRlZ29yaWVzPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIHN0eWxlPVwibWF4LXdpZHRoOiAyMDBweFwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImVsZW1lbnQ/LmNhdGVnb3JpZXM/Lmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtc3RhcnQgYWxpZ24taXRlbXMtY2VudGVyIGdhcC0xIGZsZXgtd3JhcFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJnLXNlY29uZGFyeVwiICpuZ0Zvcj1cImxldCBjYXRlZ29yeSBvZiBlbGVtZW50Py5jYXRlZ29yaWVzXCI+XG4gICAgICAgICAgICAgICAge3sgY2F0ZWdvcnk/LnRpdGxlIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gU0tVIENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJza3VcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsIG1hdC1zb3J0LWhlYWRlciAqbWF0SGVhZGVyQ2VsbERlZj5TS1U8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3sgZWxlbWVudC5za3UgfX08L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCBtYXQtc29ydC1oZWFkZXIgKm1hdEhlYWRlckNlbGxEZWY+RGVzY3JpcHRpb248L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3sgZWxlbWVudC5kZXNjcmlwdGlvbiB9fTwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gSW5pdGlhbCBRdWFudGl0eSBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiaW5pdGlhbF9xdWFudGl0eVwiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgbWF0LXNvcnQtaGVhZGVyICptYXRIZWFkZXJDZWxsRGVmPkluaXRpYWwgUXVhbnRpdHk8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTBcIj57eyBlbGVtZW50LmluaXRpYWxfcXVhbnRpdHkgfX08L3A+XG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeVwiICpuZ0lmPVwiZWxlbWVudD8uaW5pdGlhbF9xdWFudGl0eV9kYXRlXCI+XG4gICAgICAgICAgICAgIG9uIHt7IGVsZW1lbnQ/LmluaXRpYWxfcXVhbnRpdHlfZGF0ZSB8IGRhdGUgfX1cbiAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBTdG9jayBSZWNlaXB0cyBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic3RvY2tfcmVjZWlwdHNcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsIG1hdC1zb3J0LWhlYWRlcj1cInN0b2NrX3JlY2VpcHRzX3N1bV9xdWFudGl0eVwiICptYXRIZWFkZXJDZWxsRGVmPlN0b2NrIFJlY2VpcHRzPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wXCI+e3sgZWxlbWVudD8uc3RvY2tfcmVjZWlwdHNfc3VtX3F1YW50aXR5IH19PC9wPlxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1zZWNvbmRhcnlcIiAqbmdJZj1cImVsZW1lbnQ/Lmxhc3Rfc3RvY2tfcmVjZWlwdCAmJiAhZXhwb3J0SW5Qcm9ncmVzc1wiPlxuICAgICAgICAgICAgICBMYXRlc3Qgb24ge3sgZWxlbWVudD8ubGFzdF9zdG9ja19yZWNlaXB0Py5kYXRlIHwgZGF0ZSB9fVxuICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFN0b2NrIElzc3VlcyBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic3RvY2tfaXNzdWVzXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCBtYXQtc29ydC1oZWFkZXI9XCJzdG9ja19pc3N1ZXNfc3VtX3F1YW50aXR5XCIgKm1hdEhlYWRlckNlbGxEZWY+U3RvY2sgSXNzdWVzPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wXCI+e3sgZWxlbWVudD8uc3RvY2tfaXNzdWVzX3N1bV9xdWFudGl0eSB9fTwvcD5cbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtc2Vjb25kYXJ5XCIgKm5nSWY9XCJlbGVtZW50Py5sYXN0X3N0b2NrX2lzc3VlICYmICFleHBvcnRJblByb2dyZXNzXCI+XG4gICAgICAgICAgICAgIExhdGVzdCBvbiB7eyBlbGVtZW50Py5sYXN0X3N0b2NrX2lzc3VlPy5kYXRlIHwgZGF0ZSB9fVxuICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIE9uIEhhbmQgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIm9uX2hhbmRcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsIG1hdC1zb3J0LWhlYWRlcj0nc3RvY2tfb25faGFuZCcgKm1hdEhlYWRlckNlbGxEZWY+T24gSGFuZDwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgIHt7IGVsZW1lbnQ/LnN0b2NrX29uX2hhbmQgfX1cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIm1lYXN1cmVcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsIG1hdC1zb3J0LWhlYWRlciAqbWF0SGVhZGVyQ2VsbERlZj5NZWFzdXJlPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAge3sgZWxlbWVudD8ubWVhc3VyZT8udGl0bGUgfX1cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFJlb3JkZXIgUG9pbnQgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInJlb3JkZXJfcG9pbnRcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsIG1hdC1zb3J0LWhlYWRlciAqbWF0SGVhZGVyQ2VsbERlZj5SZW9yZGVyIFBvaW50PC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAge3sgZWxlbWVudC5yZW9yZGVyX3BvaW50IH19XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBTZWxsaW5nIFByaWNlIENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzYWxlX3ByaWNlXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCBtYXQtc29ydC1oZWFkZXIgKm1hdEhlYWRlckNlbGxEZWY+U2VsbGluZyBQcmljZTwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgIHt7IGVsZW1lbnQuc2FsZV9wcmljZSB8IGN1cnJlbmN5IH19XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBJbmNvbWUgQWNjb3VudCBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiaW5jb21lX2FjY291bnRcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPkluY29tZSBBY2NvdW50PC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAge3sgZWxlbWVudD8uaW5jb21lX2FjY291bnQ/LnRpdGxlIH19XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBFeHBlbnNlIEFjY291bnQgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImV4cGVuc2VfYWNjb3VudFwiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+RXhwZW5zZSBBY2NvdW50PC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAge3sgZWxlbWVudD8uZXhwZW5zZV9hY2NvdW50Py50aXRsZSB9fVxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gQ3JlYXRvciBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiY3JlYXRvclwiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+Q3JlYXRvcjwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMFwiPnt7IGVsZW1lbnQ/LmNyZWF0b3I/Lm5hbWUgfX08L3A+XG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeVwiPnt7IGVsZW1lbnQ/LmNyZWF0ZWRfYXQgfCBkYXRlIH19PC9zbWFsbD5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIEFjdGlvbnMgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIkFjdGlvbnNcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPkFjdGlvbnM8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zZWNvbmRhcnkgZC1mbGV4IGdhcC0xXCI+XG4gICAgICAgICAgICAgIDxhcHAtdGVjaGxpZnktaWNvbiBuYW1lPSd2aWV3JyBbcm91dGVyTGlua109XCJbZWxlbWVudC5pZCwgJ3ZpZXcnXVwiXG4gICAgICAgICAgICAgICAgcm91dGVyTGlua0FjdGl2ZT1cInJvdXRlLWxpbmstYWN0aXZlXCI+PC9hcHAtdGVjaGxpZnktaWNvbj5cblxuICAgICAgICAgICAgICA8YXBwLXByb2R1Y3QtZm9ybS1idXR0b24gW3Byb2R1Y3RdPVwiZWxlbWVudFwiPjwvYXBwLXByb2R1Y3QtZm9ybS1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIlNlbGVjdFwiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICAgICAgICA8bWF0LWNoZWNrYm94IChjaGFuZ2UpPVwiJGV2ZW50ID8gdG9nZ2xlQWxsUm93cygpIDogbnVsbFwiXG4gICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmIGlzQWxsUm93c1NlbGVjdGVkKClcIlxuICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiAhaXNBbGxSb3dzU2VsZWN0ZWQoKVwiIFthcmlhLWxhYmVsXT1cImNoZWNrYm94TGFiZWwoKVwiPlxuICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+XG4gICAgICAgICAgICA8bWF0LWNoZWNrYm94IChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoY2hhbmdlKT1cIiRldmVudCA/IHNlbGVjdGlvbi50b2dnbGUocm93KSA6IG51bGxcIlxuICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3Rpb24uaXNTZWxlY3RlZChyb3cpXCIgW2FyaWEtbGFiZWxdPVwiY2hlY2tib3hMYWJlbChyb3cpXCI+XG4gICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDx0ZCBtYXQtZm9vdGVyLWNlbGwgKm1hdEZvb3RlckNlbGxEZWY+PC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uczsgc3RpY2t5OiB0cnVlXCI+PC90cj5cbiAgICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxuICAgICAgPC90YWJsZT5cblxuICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiAqbmdJZj1cImlzV29ya2luZ1wiPjwvbWF0LXByb2dyZXNzLWJhcj5cbiAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gIDwvbWF0LWNhcmQ+XG4gIDxtYXQtY2FyZCAqbmdJZj1cIiFzZWxlY3Rpb24uaXNFbXB0eSgpXCIgY2xhc3M9XCJiYXRjaC11cGRhdGUtY2FyZFwiPlxuICAgIDxtYXQtY2FyZC1jb250ZW50PlxuICAgICAgPGFwcC1wcm9kdWN0LWJhdGNoLXVwZGF0ZS1mb3JtIFtzZWxlY3Rpb25dPVwic2VsZWN0aW9uXCIgKHVwZGF0ZWQpPVwicmVsb2FkKClcIj48L2FwcC1wcm9kdWN0LWJhdGNoLXVwZGF0ZS1mb3JtPlxuICAgIDwvbWF0LWNhcmQtY29udGVudD5cbiAgPC9tYXQtY2FyZD5cbjwvZGl2PiJdfQ==
|
package/esm2022/lib/inventory-common/product/product-view-page/product-view-page.component.mjs
CHANGED
|
@@ -4,8 +4,8 @@ import * as i0 from "@angular/core";
|
|
|
4
4
|
import * as i1 from "../product.service";
|
|
5
5
|
import * as i2 from "@angular/router";
|
|
6
6
|
import * as i3 from "@angular/common";
|
|
7
|
-
import * as i4 from "../../stock-receipts/
|
|
8
|
-
import * as i5 from "../../stock-issuances/
|
|
7
|
+
import * as i4 from "../../stock-receipts/stock-receipt-product-list/stock-receipt-product-list.component";
|
|
8
|
+
import * as i5 from "../../stock-issuances/stock-issue-products-list/stock-issue-products-list.component";
|
|
9
9
|
import * as i6 from "@angular/material/progress-bar";
|
|
10
10
|
import * as i7 from "../product-location/product-location-list/product-location-list.component";
|
|
11
11
|
import * as i8 from "../../stock-transfer/stock-transfer-list/stock-transfer-list.component";
|
|
@@ -21,7 +21,7 @@ export class ProductViewPageComponent {
|
|
|
21
21
|
productLocationList;
|
|
22
22
|
stockTransferList;
|
|
23
23
|
stockReceiptsListPage;
|
|
24
|
-
|
|
24
|
+
stockIssueProductListPage;
|
|
25
25
|
constructor(productService, activatedRoute, location) {
|
|
26
26
|
this.productService = productService;
|
|
27
27
|
this.activatedRoute = activatedRoute;
|
|
@@ -66,11 +66,11 @@ export class ProductViewPageComponent {
|
|
|
66
66
|
this.location.back();
|
|
67
67
|
}
|
|
68
68
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ProductViewPageComponent, deps: [{ token: i1.ProductService }, { token: i2.ActivatedRoute }, { token: i3.Location }], target: i0.ɵɵFactoryTarget.Component });
|
|
69
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ProductViewPageComponent, selector: "app-product-view-page", viewQueries: [{ propertyName: "productLocationList", first: true, predicate: ["productLocationList"], descendants: true }, { propertyName: "stockTransferList", first: true, predicate: ["stockTransferList"], descendants: true }, { propertyName: "stockReceiptsListPage", first: true, predicate: ["stockReceiptsListPage"], descendants: true }, { propertyName: "
|
|
69
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ProductViewPageComponent, selector: "app-product-view-page", viewQueries: [{ propertyName: "productLocationList", first: true, predicate: ["productLocationList"], descendants: true }, { propertyName: "stockTransferList", first: true, predicate: ["stockTransferList"], descendants: true }, { propertyName: "stockReceiptsListPage", first: true, predicate: ["stockReceiptsListPage"], descendants: true }, { propertyName: "stockIssueProductListPage", first: true, predicate: ["stockIssueProductListPage"], descendants: true }], ngImport: i0, template: "<mat-progress-bar mode=\"indeterminate\" *ngIf=\"isLoading\"></mat-progress-bar>\n\n<div *ngIf=\"product\" class=\"d-flex justify-content-start align-items-start gap-3\">\n <div *ngIf=\"product\" class=\"d-flex justify-content-start align-items-start gap-3\">\n <div style=\"width: calc(30% - 1rem)\" class=\"d-flex flex-column gap-3\">\n <app-product-basic-info [product]=\"product\" #productBasicInfoComponent (deleted)=\"onProductDeleted()\"\n (saved)=\"onProductUpdated($event)\"></app-product-basic-info>\n\n <app-product-location-list [product]=\"product\" (updated)=\"stockTransferList.reload(); stockIssueProductListPage.reload()\"\n #productLocationList></app-product-location-list>\n\n <app-note-list labelText=\"Notes\" viewMode=\"timeline\" modelType=\"Product\"\n [relatedModelId]=\"product.id\"></app-note-list>\n\n </div>\n <div style=\"width: calc(75%)\" class=\"d-flex flex-column gap-3\">\n <app-stock-receipt-product-list #stockReceiptsListPage [filters]=\"{ product_ids: product?.id }\"\n [isProductView]=\"true\" (listUpdated)=\"getProduct(this.id);\n productBasicInfoComponent.loadProductStocksSummary();\n productLocationList.reload();\n \"></app-stock-receipt-product-list>\n\n <app-stock-issue-products-list #stockIssueProductListPage [isProductView]=\"true\"\n [filters]=\"{ product_ids: product?.id }\" (listUpdated)=\"\n getProduct(this.id);\n productBasicInfoComponent.loadProductStocksSummary();\n productLocationList.reload();\n \"></app-stock-issue-products-list>\n\n <app-stock-transfer-list #stockTransferList *ngIf=\"product\" [productId]=\"product.id\"></app-stock-transfer-list>\n </div>\n </div>\n</div>", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.StockReceiptProductsListComponent, selector: "app-stock-receipt-product-list", inputs: ["filters", "isProductView", "selectedColumns", "exportInProgress"], outputs: ["listUpdated", "columnConfigReady"] }, { kind: "component", type: i5.StockIssueProductListComponent, selector: "app-stock-issue-products-list", inputs: ["filters", "isProductView", "selectedColumns", "exportInProgress"], outputs: ["listUpdated", "columnConfigReady"] }, { kind: "component", type: i6.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i7.ProductLocationListComponent, selector: "app-product-location-list", inputs: ["product"], outputs: ["updated"] }, { kind: "component", type: i8.StockTransferListComponent, selector: "app-stock-transfer-list", inputs: ["productId"] }, { kind: "component", type: i9.NoteListComponent, selector: "app-note-list", inputs: ["relatedModelId", "modelType", "readonly", "labelText", "commentsView", "viewMode"] }, { kind: "component", type: i10.ProductBasicInfoComponent, selector: "app-product-basic-info", inputs: ["product"], outputs: ["saved", "deleted"] }], preserveWhitespaces: true });
|
|
70
70
|
}
|
|
71
71
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ProductViewPageComponent, decorators: [{
|
|
72
72
|
type: Component,
|
|
73
|
-
args: [{ selector: 'app-product-view-page', template: "<mat-progress-bar mode=\"indeterminate\" *ngIf=\"isLoading\"></mat-progress-bar>\n\n<div *ngIf=\"product\" class=\"d-flex justify-content-start align-items-start gap-3\">\n <div *ngIf=\"product\" class=\"d-flex justify-content-start align-items-start gap-3\">\n <div style=\"width: calc(30% - 1rem)\" class=\"d-flex flex-column gap-3\">\n <app-product-basic-info [product]=\"product\" #productBasicInfoComponent (deleted)=\"onProductDeleted()\"\n (saved)=\"onProductUpdated($event)\"></app-product-basic-info>\n\n <app-product-location-list [product]=\"product\" (updated)=\"stockTransferList.reload();
|
|
73
|
+
args: [{ selector: 'app-product-view-page', template: "<mat-progress-bar mode=\"indeterminate\" *ngIf=\"isLoading\"></mat-progress-bar>\n\n<div *ngIf=\"product\" class=\"d-flex justify-content-start align-items-start gap-3\">\n <div *ngIf=\"product\" class=\"d-flex justify-content-start align-items-start gap-3\">\n <div style=\"width: calc(30% - 1rem)\" class=\"d-flex flex-column gap-3\">\n <app-product-basic-info [product]=\"product\" #productBasicInfoComponent (deleted)=\"onProductDeleted()\"\n (saved)=\"onProductUpdated($event)\"></app-product-basic-info>\n\n <app-product-location-list [product]=\"product\" (updated)=\"stockTransferList.reload(); stockIssueProductListPage.reload()\"\n #productLocationList></app-product-location-list>\n\n <app-note-list labelText=\"Notes\" viewMode=\"timeline\" modelType=\"Product\"\n [relatedModelId]=\"product.id\"></app-note-list>\n\n </div>\n <div style=\"width: calc(75%)\" class=\"d-flex flex-column gap-3\">\n <app-stock-receipt-product-list #stockReceiptsListPage [filters]=\"{ product_ids: product?.id }\"\n [isProductView]=\"true\" (listUpdated)=\"getProduct(this.id);\n productBasicInfoComponent.loadProductStocksSummary();\n productLocationList.reload();\n \"></app-stock-receipt-product-list>\n\n <app-stock-issue-products-list #stockIssueProductListPage [isProductView]=\"true\"\n [filters]=\"{ product_ids: product?.id }\" (listUpdated)=\"\n getProduct(this.id);\n productBasicInfoComponent.loadProductStocksSummary();\n productLocationList.reload();\n \"></app-stock-issue-products-list>\n\n <app-stock-transfer-list #stockTransferList *ngIf=\"product\" [productId]=\"product.id\"></app-stock-transfer-list>\n </div>\n </div>\n</div>" }]
|
|
74
74
|
}], ctorParameters: () => [{ type: i1.ProductService }, { type: i2.ActivatedRoute }, { type: i3.Location }], propDecorators: { productLocationList: [{
|
|
75
75
|
type: ViewChild,
|
|
76
76
|
args: ['productLocationList']
|
|
@@ -80,8 +80,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
80
80
|
}], stockReceiptsListPage: [{
|
|
81
81
|
type: ViewChild,
|
|
82
82
|
args: ['stockReceiptsListPage']
|
|
83
|
-
}],
|
|
83
|
+
}], stockIssueProductListPage: [{
|
|
84
84
|
type: ViewChild,
|
|
85
|
-
args: ['
|
|
85
|
+
args: ['stockIssueProductListPage']
|
|
86
86
|
}] } });
|
|
87
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC12aWV3LXBhZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW52ZW50b3J5LWNvbW1vbi9zcmMvbGliL2ludmVudG9yeS1jb21tb24vcHJvZHVjdC9wcm9kdWN0LXZpZXctcGFnZS9wcm9kdWN0LXZpZXctcGFnZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9wcm9kdWN0L3Byb2R1Y3Qtdmlldy1wYWdlL3Byb2R1Y3Qtdmlldy1wYWdlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFJbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7Ozs7O0FBVTFDLE1BQU0sT0FBTyx3QkFBd0I7SUFXekI7SUFDQTtJQUNBO0lBWkgsT0FBTyxDQUFNO0lBQ3BCLEVBQUUsQ0FBUztJQUNYLFNBQVMsQ0FBVztJQUVjLG1CQUFtQixDQUFnQztJQUNyRCxpQkFBaUIsQ0FBOEI7SUFDM0MscUJBQXFCLENBQXFDO0lBQ3RELHlCQUF5QixDQUFrQztJQUVuRyxZQUNVLGNBQThCLEVBQzlCLGNBQThCLEVBQzlCLFFBQWtCO1FBRmxCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUUxQixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDWixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxVQUFVLENBQUMsU0FBYztRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixNQUFNLE1BQU0sR0FBUTtZQUNsQixJQUFJLEVBQUUscUdBQXFHO1NBQzVHLENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3BELElBQUksRUFBRSxDQUFDLE1BQVcsRUFBRSxFQUFFO2dCQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLEVBQUUsSUFBSSxDQUFDO1lBQzlCLENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztTQUN0QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGdCQUFnQixDQUFDLE9BQVk7UUFDM0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN2QixDQUFDO3dHQXpEVSx3QkFBd0I7NEZBQXhCLHdCQUF3Qiw0Z0JDZHJDLHV1REFnQ007OzRGRGxCTyx3QkFBd0I7a0JBSnBDLFNBQVM7K0JBQ0UsdUJBQXVCO3VJQVFDLG1CQUFtQjtzQkFBcEQsU0FBUzt1QkFBQyxxQkFBcUI7Z0JBQ0EsaUJBQWlCO3NCQUFoRCxTQUFTO3VCQUFDLG1CQUFtQjtnQkFDTSxxQkFBcUI7c0JBQXhELFNBQVM7dUJBQUMsdUJBQXVCO2dCQUNNLHlCQUF5QjtzQkFBaEUsU0FBUzt1QkFBQywyQkFBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUHJvZHVjdFNlcnZpY2UgfSBmcm9tICcuLi9wcm9kdWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQcm9kdWN0TG9jYXRpb25MaXN0Q29tcG9uZW50IH0gZnJvbSAnLi4vcHJvZHVjdC1sb2NhdGlvbi9wcm9kdWN0LWxvY2F0aW9uLWxpc3QvcHJvZHVjdC1sb2NhdGlvbi1saXN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdG9ja1RyYW5zZmVyTGlzdENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3N0b2NrLXRyYW5zZmVyL3N0b2NrLXRyYW5zZmVyLWxpc3Qvc3RvY2stdHJhbnNmZXItbGlzdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3RvY2tSZWNlaXB0UHJvZHVjdHNMaXN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc3RvY2stcmVjZWlwdHMvc3RvY2stcmVjZWlwdC1wcm9kdWN0LWxpc3Qvc3RvY2stcmVjZWlwdC1wcm9kdWN0LWxpc3QuY29tcG9uZW50JztcbmltcG9ydCB7IFN0b2NrSXNzdWVQcm9kdWN0TGlzdENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3N0b2NrLWlzc3VhbmNlcy9zdG9jay1pc3N1ZS1wcm9kdWN0cy1saXN0L3N0b2NrLWlzc3VlLXByb2R1Y3RzLWxpc3QuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXByb2R1Y3Qtdmlldy1wYWdlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Byb2R1Y3Qtdmlldy1wYWdlLmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgUHJvZHVjdFZpZXdQYWdlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHVibGljIHByb2R1Y3Q6IGFueTtcbiAgaWQ6IG51bWJlcjtcbiAgaXNMb2FkaW5nITogYm9vbGVhbjtcblxuICBAVmlld0NoaWxkKCdwcm9kdWN0TG9jYXRpb25MaXN0JykgcHJvZHVjdExvY2F0aW9uTGlzdCE6IFByb2R1Y3RMb2NhdGlvbkxpc3RDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ3N0b2NrVHJhbnNmZXJMaXN0Jykgc3RvY2tUcmFuc2Zlckxpc3QhOiBTdG9ja1RyYW5zZmVyTGlzdENvbXBvbmVudDtcbiAgQFZpZXdDaGlsZCgnc3RvY2tSZWNlaXB0c0xpc3RQYWdlJykgc3RvY2tSZWNlaXB0c0xpc3RQYWdlITogU3RvY2tSZWNlaXB0UHJvZHVjdHNMaXN0Q29tcG9uZW50O1xuICBAVmlld0NoaWxkKCdzdG9ja0lzc3VlUHJvZHVjdExpc3RQYWdlJykgc3RvY2tJc3N1ZVByb2R1Y3RMaXN0UGFnZSE6IFN0b2NrSXNzdWVQcm9kdWN0TGlzdENvbXBvbmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHByb2R1Y3RTZXJ2aWNlOiBQcm9kdWN0U2VydmljZSxcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvblxuICApIHtcbiAgICB0aGlzLmlkID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5wYXJhbXM/LlsnaWQnXTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlkKSB7XG4gICAgICB0aGlzLmdldFByb2R1Y3QodGhpcy5pZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcHJvZHVjdCBkZXRhaWxzLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvZHVjdElkXG4gICAqL1xuICBnZXRQcm9kdWN0KHByb2R1Y3RJZDogYW55KSB7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHBhcmFtczogYW55ID0ge1xuICAgICAgd2l0aDogJ3R5cGUsbWVhc3VyZSxpbmNvbWVBY2NvdW50LGV4cGVuc2VBY2NvdW50LGNhdGVnb3JpZXMsbGFzdFN0b2NrUmVjZWlwdCxsYXN0U3RvY2tJc3N1ZSx0YXhlcy50YXgudHlwZScsXG4gICAgfTtcbiAgICB0aGlzLnByb2R1Y3RTZXJ2aWNlLnNob3cocHJvZHVjdElkLCBwYXJhbXMpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wcm9kdWN0ID0gcmVzdWx0Py5pdGVtO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiAodGhpcy5pc0xvYWRpbmcgPSBmYWxzZSksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHRoZSBvbiBwcm9kdWN0IHVwZGF0ZSBldmVudC5cbiAgICpcbiAgICogQHBhcmFtIHByb2R1Y3RcbiAgICovXG4gIG9uUHJvZHVjdFVwZGF0ZWQocHJvZHVjdDogYW55KSB7XG4gICAgdGhpcy5nZXRQcm9kdWN0KHRoaXMuaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBvbiBwcm9kdWN0IGRlbGV0ZSBldmVudC5cbiAgICovXG4gIG9uUHJvZHVjdERlbGV0ZWQoKSB7XG4gICAgdGhpcy5sb2NhdGlvbi5iYWNrKCk7XG4gIH1cbn1cbiIsIjxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XCJpbmRldGVybWluYXRlXCIgKm5nSWY9XCJpc0xvYWRpbmdcIj48L21hdC1wcm9ncmVzcy1iYXI+XG5cbjxkaXYgKm5nSWY9XCJwcm9kdWN0XCIgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0IGFsaWduLWl0ZW1zLXN0YXJ0IGdhcC0zXCI+XG4gIDxkaXYgKm5nSWY9XCJwcm9kdWN0XCIgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0IGFsaWduLWl0ZW1zLXN0YXJ0IGdhcC0zXCI+XG4gICAgPGRpdiBzdHlsZT1cIndpZHRoOiBjYWxjKDMwJSAtIDFyZW0pXCIgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTNcIj5cbiAgICAgIDxhcHAtcHJvZHVjdC1iYXNpYy1pbmZvIFtwcm9kdWN0XT1cInByb2R1Y3RcIiAjcHJvZHVjdEJhc2ljSW5mb0NvbXBvbmVudCAoZGVsZXRlZCk9XCJvblByb2R1Y3REZWxldGVkKClcIlxuICAgICAgICAoc2F2ZWQpPVwib25Qcm9kdWN0VXBkYXRlZCgkZXZlbnQpXCI+PC9hcHAtcHJvZHVjdC1iYXNpYy1pbmZvPlxuXG4gICAgICA8YXBwLXByb2R1Y3QtbG9jYXRpb24tbGlzdCBbcHJvZHVjdF09XCJwcm9kdWN0XCIgKHVwZGF0ZWQpPVwic3RvY2tUcmFuc2Zlckxpc3QucmVsb2FkKCk7IHN0b2NrSXNzdWVQcm9kdWN0TGlzdFBhZ2UucmVsb2FkKClcIlxuICAgICAgICAjcHJvZHVjdExvY2F0aW9uTGlzdD48L2FwcC1wcm9kdWN0LWxvY2F0aW9uLWxpc3Q+XG5cbiAgICAgIDxhcHAtbm90ZS1saXN0IGxhYmVsVGV4dD1cIk5vdGVzXCIgdmlld01vZGU9XCJ0aW1lbGluZVwiIG1vZGVsVHlwZT1cIlByb2R1Y3RcIlxuICAgICAgICBbcmVsYXRlZE1vZGVsSWRdPVwicHJvZHVjdC5pZFwiPjwvYXBwLW5vdGUtbGlzdD5cblxuICAgIDwvZGl2PlxuICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogY2FsYyg3NSUpXCIgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTNcIj5cbiAgICAgIDxhcHAtc3RvY2stcmVjZWlwdC1wcm9kdWN0LWxpc3QgI3N0b2NrUmVjZWlwdHNMaXN0UGFnZSBbZmlsdGVyc109XCJ7IHByb2R1Y3RfaWRzOiBwcm9kdWN0Py5pZCB9XCJcbiAgICAgICAgW2lzUHJvZHVjdFZpZXddPVwidHJ1ZVwiIChsaXN0VXBkYXRlZCk9XCJnZXRQcm9kdWN0KHRoaXMuaWQpO1xuICAgICAgICBwcm9kdWN0QmFzaWNJbmZvQ29tcG9uZW50LmxvYWRQcm9kdWN0U3RvY2tzU3VtbWFyeSgpO1xuICAgICAgICBwcm9kdWN0TG9jYXRpb25MaXN0LnJlbG9hZCgpO1xuICAgICAgXCI+PC9hcHAtc3RvY2stcmVjZWlwdC1wcm9kdWN0LWxpc3Q+XG5cbiAgICAgIDxhcHAtc3RvY2staXNzdWUtcHJvZHVjdHMtbGlzdCAjc3RvY2tJc3N1ZVByb2R1Y3RMaXN0UGFnZSBbaXNQcm9kdWN0Vmlld109XCJ0cnVlXCJcbiAgICAgICAgW2ZpbHRlcnNdPVwieyBwcm9kdWN0X2lkczogcHJvZHVjdD8uaWQgfVwiIChsaXN0VXBkYXRlZCk9XCJcbiAgICAgICAgZ2V0UHJvZHVjdCh0aGlzLmlkKTtcbiAgICAgICAgcHJvZHVjdEJhc2ljSW5mb0NvbXBvbmVudC5sb2FkUHJvZHVjdFN0b2Nrc1N1bW1hcnkoKTtcbiAgICAgICAgcHJvZHVjdExvY2F0aW9uTGlzdC5yZWxvYWQoKTtcbiAgICAgIFwiPjwvYXBwLXN0b2NrLWlzc3VlLXByb2R1Y3RzLWxpc3Q+XG5cbiAgICAgIDxhcHAtc3RvY2stdHJhbnNmZXItbGlzdCAjc3RvY2tUcmFuc2Zlckxpc3QgKm5nSWY9XCJwcm9kdWN0XCIgW3Byb2R1Y3RJZF09XCJwcm9kdWN0LmlkXCI+PC9hcHAtc3RvY2stdHJhbnNmZXItbGlzdD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
|
|
@@ -15,7 +15,7 @@ import { StockReceiptFormModule } from '../stock-receipts/stock-receipt-form/sto
|
|
|
15
15
|
import { StockIssueFormModule } from '../stock-issuances/stock-issue-form/stock-issue-form.module';
|
|
16
16
|
import { ProductImportPageComponent } from './product-import-page/product-import-page.component';
|
|
17
17
|
import { StockReceiptsModule } from '../stock-receipts/stock-receipts.module';
|
|
18
|
-
import {
|
|
18
|
+
import { StockIssuePageModule } from '../stock-issuances/stock-issue-page/stock-issue-page.module';
|
|
19
19
|
import { MatProgressBarModule } from '@angular/material/progress-bar';
|
|
20
20
|
import { InfiniteScrollModule } from 'ngx-infinite-scroll';
|
|
21
21
|
import { FlexModule } from '@angular/flex-layout';
|
|
@@ -47,7 +47,7 @@ export class ProductModule {
|
|
|
47
47
|
StockIssueFormModule,
|
|
48
48
|
ImportCsvModule,
|
|
49
49
|
StockReceiptsModule,
|
|
50
|
-
|
|
50
|
+
StockIssuePageModule,
|
|
51
51
|
MaterialModule,
|
|
52
52
|
MatProgressBarModule,
|
|
53
53
|
InfiniteScrollModule,
|
|
@@ -77,7 +77,7 @@ export class ProductModule {
|
|
|
77
77
|
StockIssueFormModule,
|
|
78
78
|
ImportCsvModule,
|
|
79
79
|
StockReceiptsModule,
|
|
80
|
-
|
|
80
|
+
StockIssuePageModule,
|
|
81
81
|
MaterialModule,
|
|
82
82
|
MatProgressBarModule,
|
|
83
83
|
InfiniteScrollModule,
|
|
@@ -122,7 +122,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
122
122
|
StockIssueFormModule,
|
|
123
123
|
ImportCsvModule,
|
|
124
124
|
StockReceiptsModule,
|
|
125
|
-
|
|
125
|
+
StockIssuePageModule,
|
|
126
126
|
MaterialModule,
|
|
127
127
|
MatProgressBarModule,
|
|
128
128
|
InfiniteScrollModule,
|
|
@@ -150,4 +150,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
150
150
|
],
|
|
151
151
|
}]
|
|
152
152
|
}] });
|
|
153
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
153
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9wcm9kdWN0L3Byb2R1Y3QubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzdFLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsOEJBQThCLEVBQzlCLG9CQUFvQixFQUNwQixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLGNBQWMsRUFDZCxVQUFVLEVBQ1Ysd0JBQXdCLEVBQ3hCLDZCQUE2QixFQUM3QixrQkFBa0IsRUFDbEIsb0JBQW9CLEdBQ3JCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDckYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0seURBQXlELENBQUM7QUFDdkcsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDcEcsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDM0YsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDakcsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0seURBQXlELENBQUM7QUFDdkcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDOUYsT0FBTyxF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Q1AsWUFBWTt3QkFDWixvQkFBb0I7d0JBQ3BCLHdCQUF3Qjt3QkFDeEIsb0JBQW9CO3dCQUNwQixzQkFBc0I7d0JBQ3RCLG9CQUFvQjt3QkFDcEIsZUFBZTt3QkFDZixtQkFBbUI7d0JBQ25CLG9CQUFvQjt3QkFFcEIsY0FBYzt3QkFDZCxvQkFBb0I7d0JBQ3BCLG9CQUFvQjt3QkFDcEIsVUFBVTt3QkFDVixtQkFBbUI7d0JBQ25CLFdBQVc7d0JBQ1gsb0JBQW9CO3dCQUNwQiw0QkFBNEI7d0JBQzVCLDBCQUEwQjt3QkFDMUIsNEJBQTRCO3dCQUM1QixVQUFVO3dCQUNWLGtCQUFrQjt3QkFDbEIsZUFBZTt3QkFDZixXQUFXO3dCQUNYLDZCQUE2Qjt3QkFDN0IsOEJBQThCO3dCQUM5QixpQkFBaUI7d0JBQ2pCLG9CQUFvQjtxQkFDckI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLG9CQUFvQjt3QkFDcEIseUJBQXlCO3dCQUN6QiwwQkFBMEI7d0JBQzFCLCtCQUErQjtxQkFDaEM7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFByb2R1Y3RSb3V0aW5nTW9kdWxlIH0gZnJvbSAnLi9wcm9kdWN0LXJvdXRpbmcubW9kdWxlJztcbmltcG9ydCB7IFByb2R1Y3RMaXN0Q29tcG9uZW50IH0gZnJvbSAnLi9wcm9kdWN0LWxpc3QvcHJvZHVjdC1saXN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9kdWN0Rm9ybUNvbXBvbmVudCB9IGZyb20gJy4vcHJvZHVjdC1mb3JtL3Byb2R1Y3QtZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgQ29sdW1uU2VsZWN0b3JNb2R1bGUsXG4gIEZvcm1Db25maWd1cmF0aW9uRm9yRm9ybU1vZHVsZSxcbiAgRG9jdW1lbnRWaWV3ZXJNb2R1bGUsXG4gIEZpbGVEcm9wcGVyTW9kdWxlLFxuICBJbXBvcnRDc3ZNb2R1bGUsXG4gIE1hdGVyaWFsTW9kdWxlLFxuICBOb3RlTW9kdWxlLFxuICBTZWFyY2hhYmxlU2VsZWN0b3JNb2R1bGUsXG4gIFRlY2hsaWZ5RGVsZXRlQnV0dG9uQ29tcG9uZW50LFxuICBUZWNobGlmeUljb25Nb2R1bGUsXG4gIFRpbWVsaW5lRmlsdGVyTW9kdWxlLFxufSBmcm9tICduZ3gtdGVjaGxpZnktY29yZSc7XG5pbXBvcnQgeyBQcm9kdWN0TmF2QmFyQ29tcG9uZW50IH0gZnJvbSAnLi9wcm9kdWN0LW5hdi1iYXIvcHJvZHVjdC1uYXYtYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9kdWN0TWVhc3VyZXNMaXN0Q29tcG9uZW50IH0gZnJvbSAnLi9wcm9kdWN0LW1lYXN1cmVzLWxpc3QvcHJvZHVjdC1tZWFzdXJlcy1saXN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9kdWN0TWVhc3VyZUZvcm1Db21wb25lbnQgfSBmcm9tICcuL3Byb2R1Y3QtbWVhc3VyZS1mb3JtL3Byb2R1Y3QtbWVhc3VyZS1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9kdWN0Vmlld1BhZ2VDb21wb25lbnQgfSBmcm9tICcuL3Byb2R1Y3Qtdmlldy1wYWdlL3Byb2R1Y3Qtdmlldy1wYWdlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9kdWN0Rm9ybUJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4vcHJvZHVjdC1mb3JtLWJ1dHRvbi9wcm9kdWN0LWZvcm0tYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9kdWN0RGVsZXRlQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi9wcm9kdWN0LWRlbGV0ZS1idXR0b24vcHJvZHVjdC1kZWxldGUtYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9kdWN0QmFzaWNJbmZvQ29tcG9uZW50IH0gZnJvbSAnLi9wcm9kdWN0LWJhc2ljLWluZm8vcHJvZHVjdC1iYXNpYy1pbmZvLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdG9ja1JlY2VpcHRGb3JtTW9kdWxlIH0gZnJvbSAnLi4vc3RvY2stcmVjZWlwdHMvc3RvY2stcmVjZWlwdC1mb3JtL3N0b2NrLXJlY2VpcHQtZm9ybS5tb2R1bGUnO1xuaW1wb3J0IHsgU3RvY2tJc3N1ZUZvcm1Nb2R1bGUgfSBmcm9tICcuLi9zdG9jay1pc3N1YW5jZXMvc3RvY2staXNzdWUtZm9ybS9zdG9jay1pc3N1ZS1mb3JtLm1vZHVsZSc7XG5pbXBvcnQgeyBQcm9kdWN0SW1wb3J0UGFnZUNvbXBvbmVudCB9IGZyb20gJy4vcHJvZHVjdC1pbXBvcnQtcGFnZS9wcm9kdWN0LWltcG9ydC1wYWdlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdG9ja1JlY2VpcHRzTW9kdWxlIH0gZnJvbSAnLi4vc3RvY2stcmVjZWlwdHMvc3RvY2stcmVjZWlwdHMubW9kdWxlJztcbmltcG9ydCB7IFN0b2NrSXNzdWVQYWdlTW9kdWxlIH0gZnJvbSAnLi4vc3RvY2staXNzdWFuY2VzL3N0b2NrLWlzc3VlLXBhZ2Uvc3RvY2staXNzdWUtcGFnZS5tb2R1bGUnO1xuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NCYXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1iYXInO1xuaW1wb3J0IHsgSW5maW5pdGVTY3JvbGxNb2R1bGUgfSBmcm9tICduZ3gtaW5maW5pdGUtc2Nyb2xsJztcbmltcG9ydCB7IEZsZXhNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mbGV4LWxheW91dCc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgUHJvZHVjdEJhdGNoVXBkYXRlRm9ybUNvbXBvbmVudCB9IGZyb20gJy4vcHJvZHVjdC1iYXRjaC11cGRhdGUtZm9ybS9wcm9kdWN0LWJhdGNoLXVwZGF0ZS1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9kdWN0TG9jYXRpb25MaXN0Q29tcG9uZW50IH0gZnJvbSAnLi9wcm9kdWN0LWxvY2F0aW9uL3Byb2R1Y3QtbG9jYXRpb24tbGlzdC9wcm9kdWN0LWxvY2F0aW9uLWxpc3QuY29tcG9uZW50JztcbmltcG9ydCB7IFN0b2NrVHJhbnNmZXJMaXN0Q29tcG9uZW50IH0gZnJvbSAnLi4vc3RvY2stdHJhbnNmZXIvc3RvY2stdHJhbnNmZXItbGlzdC9zdG9jay10cmFuc2Zlci1saXN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFeHBvcnRUb0V4Y2VsQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vc2hhcmVkL2V4cG9ydC10by1leGNlbC1idXR0b24vZXhwb3J0LXRvLWV4Y2VsLWJ1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgUVJDb2RlQ29tcG9uZW50IH0gZnJvbSAnYW5ndWxhcngtcXJjb2RlJztcbmltcG9ydCB7IE5neEJhcmNvZGU2IH0gZnJvbSAnbmd4LWJhcmNvZGU2JztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgUHJvZHVjdExpc3RDb21wb25lbnQsXG4gICAgUHJvZHVjdEZvcm1Db21wb25lbnQsXG4gICAgUHJvZHVjdE5hdkJhckNvbXBvbmVudCxcbiAgICBQcm9kdWN0TWVhc3VyZXNMaXN0Q29tcG9uZW50LFxuICAgIFByb2R1Y3RNZWFzdXJlRm9ybUNvbXBvbmVudCxcbiAgICBQcm9kdWN0Vmlld1BhZ2VDb21wb25lbnQsXG4gICAgUHJvZHVjdEZvcm1CdXR0b25Db21wb25lbnQsXG4gICAgUHJvZHVjdERlbGV0ZUJ1dHRvbkNvbXBvbmVudCxcbiAgICBQcm9kdWN0QmFzaWNJbmZvQ29tcG9uZW50LFxuICAgIFByb2R1Y3RJbXBvcnRQYWdlQ29tcG9uZW50LFxuICAgIFByb2R1Y3RCYXRjaFVwZGF0ZUZvcm1Db21wb25lbnQsXG4gIF0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgUHJvZHVjdFJvdXRpbmdNb2R1bGUsXG4gICAgU2VhcmNoYWJsZVNlbGVjdG9yTW9kdWxlLFxuICAgIFRpbWVsaW5lRmlsdGVyTW9kdWxlLFxuICAgIFN0b2NrUmVjZWlwdEZvcm1Nb2R1bGUsXG4gICAgU3RvY2tJc3N1ZUZvcm1Nb2R1bGUsXG4gICAgSW1wb3J0Q3N2TW9kdWxlLFxuICAgIFN0b2NrUmVjZWlwdHNNb2R1bGUsXG4gICAgU3RvY2tJc3N1ZVBhZ2VNb2R1bGUsXG5cbiAgICBNYXRlcmlhbE1vZHVsZSxcbiAgICBNYXRQcm9ncmVzc0Jhck1vZHVsZSxcbiAgICBJbmZpbml0ZVNjcm9sbE1vZHVsZSxcbiAgICBGbGV4TW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgQ29sdW1uU2VsZWN0b3JNb2R1bGUsXG4gICAgUHJvZHVjdExvY2F0aW9uTGlzdENvbXBvbmVudCxcbiAgICBTdG9ja1RyYW5zZmVyTGlzdENvbXBvbmVudCxcbiAgICBFeHBvcnRUb0V4Y2VsQnV0dG9uQ29tcG9uZW50LFxuICAgIE5vdGVNb2R1bGUsXG4gICAgVGVjaGxpZnlJY29uTW9kdWxlLFxuICAgIFFSQ29kZUNvbXBvbmVudCxcbiAgICBOZ3hCYXJjb2RlNixcbiAgICBUZWNobGlmeURlbGV0ZUJ1dHRvbkNvbXBvbmVudCxcbiAgICBGb3JtQ29uZmlndXJhdGlvbkZvckZvcm1Nb2R1bGUsXG4gICAgRmlsZURyb3BwZXJNb2R1bGUsXG4gICAgRG9jdW1lbnRWaWV3ZXJNb2R1bGVcbiAgXSxcbiAgZXhwb3J0czogW1xuICAgIFByb2R1Y3RGb3JtQ29tcG9uZW50LFxuICAgIFByb2R1Y3RCYXNpY0luZm9Db21wb25lbnQsXG4gICAgUHJvZHVjdEZvcm1CdXR0b25Db21wb25lbnQsXG4gICAgUHJvZHVjdEJhdGNoVXBkYXRlRm9ybUNvbXBvbmVudFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBQcm9kdWN0TW9kdWxlIHsgfVxuIl19
|
|
@@ -4,12 +4,12 @@ import * as i0 from "@angular/core";
|
|
|
4
4
|
export class ProductCategoryBadgesComponent {
|
|
5
5
|
product;
|
|
6
6
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ProductCategoryBadgesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
7
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ProductCategoryBadgesComponent, isStandalone: true, selector: "app-product-category-badges", inputs: { product: "product" }, ngImport: i0, template: "<div *ngIf=\"product?.categories?.length > 0\" class=\"d-flex justify-content-start align-items-center gap-1 badges-container\">\n <span class=\"badge bg-primary
|
|
7
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ProductCategoryBadgesComponent, isStandalone: true, selector: "app-product-category-badges", inputs: { product: "product" }, ngImport: i0, template: "<div *ngIf=\"product?.categories?.length > 0\" class=\"d-flex justify-content-start align-items-center gap-1 badges-container\">\n <span class=\"badge bg-primary\" *ngFor=\"let category of product?.categories\">\n {{ category?.title }}\n </span>\n</div>\n", styles: [".badges-container{max-width:400px;flex-wrap:wrap}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], preserveWhitespaces: true });
|
|
8
8
|
}
|
|
9
9
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ProductCategoryBadgesComponent, decorators: [{
|
|
10
10
|
type: Component,
|
|
11
|
-
args: [{ selector: 'app-product-category-badges', standalone: true, imports: [NgIf, NgForOf], template: "<div *ngIf=\"product?.categories?.length > 0\" class=\"d-flex justify-content-start align-items-center gap-1 badges-container\">\n <span class=\"badge bg-primary
|
|
11
|
+
args: [{ selector: 'app-product-category-badges', standalone: true, imports: [NgIf, NgForOf], template: "<div *ngIf=\"product?.categories?.length > 0\" class=\"d-flex justify-content-start align-items-center gap-1 badges-container\">\n <span class=\"badge bg-primary\" *ngFor=\"let category of product?.categories\">\n {{ category?.title }}\n </span>\n</div>\n", styles: [".badges-container{max-width:400px;flex-wrap:wrap}\n"] }]
|
|
12
12
|
}], propDecorators: { product: [{
|
|
13
13
|
type: Input
|
|
14
14
|
}] } });
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1jYXRlZ29yeS1iYWRnZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW52ZW50b3J5LWNvbW1vbi9zcmMvbGliL2ludmVudG9yeS1jb21tb24vcHJvZHVjdC93aWRnZXRzL3Byb2R1Y3QtY2F0ZWdvcnktYmFkZ2VzL3Byb2R1Y3QtY2F0ZWdvcnktYmFkZ2VzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ludmVudG9yeS1jb21tb24vc3JjL2xpYi9pbnZlbnRvcnktY29tbW9uL3Byb2R1Y3Qvd2lkZ2V0cy9wcm9kdWN0LWNhdGVnb3J5LWJhZGdlcy9wcm9kdWN0LWNhdGVnb3J5LWJhZGdlcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQVNoRCxNQUFNLE9BQU8sOEJBQThCO0lBQ2hDLE9BQU8sQ0FBTTt3R0FEWCw4QkFBOEI7NEZBQTlCLDhCQUE4Qix1SENWM0Msc1FBS0EsNkdEQ1ksSUFBSSw2RkFBRSxPQUFPOzs0RkFJWiw4QkFBOEI7a0JBUDFDLFNBQVM7K0JBQ0UsNkJBQTZCLGNBQzNCLElBQUksV0FDUCxDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7OEJBS2YsT0FBTztzQkFBZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdGb3JPZiwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1wcm9kdWN0LWNhdGVnb3J5LWJhZGdlcycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtOZ0lmLCBOZ0Zvck9mXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3Byb2R1Y3QtY2F0ZWdvcnktYmFkZ2VzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3Byb2R1Y3QtY2F0ZWdvcnktYmFkZ2VzLmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgUHJvZHVjdENhdGVnb3J5QmFkZ2VzQ29tcG9uZW50IHtcbiAgQElucHV0KCkgcHJvZHVjdDogYW55O1xufVxuIiwiPGRpdiAqbmdJZj1cInByb2R1Y3Q/LmNhdGVnb3JpZXM/Lmxlbmd0aCA+IDBcIiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtc3RhcnQgYWxpZ24taXRlbXMtY2VudGVyIGdhcC0xIGJhZGdlcy1jb250YWluZXJcIj5cbiAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiZy1wcmltYXJ5XCIgKm5nRm9yPVwibGV0IGNhdGVnb3J5IG9mIHByb2R1Y3Q/LmNhdGVnb3JpZXNcIj5cbiAgICB7eyBjYXRlZ29yeT8udGl0bGUgfX1cbiAgPC9zcGFuPlxuPC9kaXY+XG4iXX0=
|