techlify-inventory-common 18.5.0 → 18.7.0

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.
Files changed (22) hide show
  1. package/esm2022/lib/inventory-common/measure/measures-list/measures-list.component.mjs +12 -11
  2. package/esm2022/lib/inventory-common/product/product-list/product-list.component.mjs +18 -8
  3. package/esm2022/lib/inventory-common/reports/inventory-value-report/inventory-value-report.component.mjs +23 -10
  4. package/esm2022/public-api.mjs +9 -1
  5. package/fesm2022/{techlify-inventory-common-category.module-BSXuRnsI.mjs → techlify-inventory-common-category.module-Calv-UiY.mjs} +11 -11
  6. package/fesm2022/{techlify-inventory-common-category.module-BSXuRnsI.mjs.map → techlify-inventory-common-category.module-Calv-UiY.mjs.map} +1 -1
  7. package/fesm2022/{techlify-inventory-common-location.module-hLxnh3np.mjs → techlify-inventory-common-location.module-B3Uv4Pb1.mjs} +10 -10
  8. package/fesm2022/{techlify-inventory-common-location.module-hLxnh3np.mjs.map → techlify-inventory-common-location.module-B3Uv4Pb1.mjs.map} +1 -1
  9. package/fesm2022/{techlify-inventory-common-measure.module-CZcQfmvz.mjs → techlify-inventory-common-measure.module-ow1sUTMy.mjs} +9 -9
  10. package/fesm2022/techlify-inventory-common-measure.module-ow1sUTMy.mjs.map +1 -0
  11. package/fesm2022/{techlify-inventory-common-supplier.module-BzCsszWn.mjs → techlify-inventory-common-supplier.module-BG8UiIBd.mjs} +20 -20
  12. package/fesm2022/{techlify-inventory-common-supplier.module-BzCsszWn.mjs.map → techlify-inventory-common-supplier.module-BG8UiIBd.mjs.map} +1 -1
  13. package/fesm2022/{techlify-inventory-common-techlify-inventory-common-CmIBHBen.mjs → techlify-inventory-common-techlify-inventory-common-BBwGHJmS.mjs} +248 -95
  14. package/fesm2022/techlify-inventory-common-techlify-inventory-common-BBwGHJmS.mjs.map +1 -0
  15. package/fesm2022/techlify-inventory-common.mjs +1 -1
  16. package/lib/inventory-common/reports/inventory-value-report/inventory-value-report.component.d.ts +1 -0
  17. package/package.json +1 -1
  18. package/public-api.d.ts +8 -0
  19. package/fesm2022/techlify-inventory-common-measure.module-CZcQfmvz.mjs.map +0 -1
  20. package/fesm2022/techlify-inventory-common-stock-issuances.module-9HG3-aO_.mjs +0 -147
  21. package/fesm2022/techlify-inventory-common-stock-issuances.module-9HG3-aO_.mjs.map +0 -1
  22. package/fesm2022/techlify-inventory-common-techlify-inventory-common-CmIBHBen.mjs.map +0 -1
@@ -4,14 +4,15 @@ import * as i0 from "@angular/core";
4
4
  import * as i1 from "@angular/forms";
5
5
  import * as i2 from "../measure.service";
6
6
  import * as i3 from "@angular/common";
7
- import * as i4 from "@angular/material/sort";
8
- import * as i5 from "@angular/material/table";
9
- import * as i6 from "@angular/material/card";
10
- import * as i7 from "@angular/material/progress-bar";
11
- import * as i8 from "../measure-form/measure-form-button/measure-form-button.component";
12
- import * as i9 from "../../techlify-filter/techlify-filter.component";
13
- import * as i10 from "ngx-infinite-scroll";
14
- import * as i11 from "../measure-delete/measure-delete-button/measure-delete-button.component";
7
+ import * as i4 from "@angular/router";
8
+ import * as i5 from "@angular/material/sort";
9
+ import * as i6 from "@angular/material/table";
10
+ import * as i7 from "@angular/material/card";
11
+ import * as i8 from "@angular/material/progress-bar";
12
+ import * as i9 from "../measure-form/measure-form-button/measure-form-button.component";
13
+ import * as i10 from "../../techlify-filter/techlify-filter.component";
14
+ import * as i11 from "ngx-infinite-scroll";
15
+ import * as i12 from "../measure-delete/measure-delete-button/measure-delete-button.component";
15
16
  export class MeasuresListComponent extends TechlifyListingControllerInterface {
16
17
  formBuilder;
17
18
  measureService;
@@ -64,10 +65,10 @@ export class MeasuresListComponent extends TechlifyListingControllerInterface {
64
65
  this.filterForm.get('sort_by').setValue(active + '|' + direction);
65
66
  }
66
67
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MeasuresListComponent, deps: [{ token: i1.FormBuilder }, { token: i2.MeasureService }], target: i0.ɵɵFactoryTarget.Component });
67
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MeasuresListComponent, selector: "app-measure-list", usesInheritance: true, ngImport: i0, template: "<mat-card class=\"mb-2\">\n <mat-card-content class=\"d-flex justify-content-between align-items-center gap-3\">\n <div class=\"d-flex justify-content-center align-items-center gap-2\">\n <h3 class=\"mb-0\">Measures</h3>\n <app-measure-form-button class=\"mt-1\" (saved)=\"reload()\"></app-measure-form-button>\n </div>\n <app-techlify-filter [filterForm]=\"filterForm\" (filterUpdated)=\"reload()\"></app-techlify-filter>\n </mat-card-content>\n</mat-card>\n\n<mat-card class=\"p-0\">\n <mat-card-content>\n <table mat-table [dataSource]=\"models\" class=\"w-100\" aria-describedby=\"Service Centers\" infiniteScroll\n [infiniteScrollDistance]=\"2\" [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScroll()\" matSort\n (matSortChange)=\"onSortChange($event)\">\n <!-- # Column -->\n <ng-container matColumnDef=\"no\">\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 <!-- Title Column -->\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Title</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.title }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"products\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Products</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.products_count }}\n </td>\n </ng-container>\n\n <!-- Quantity Measure Column -->\n <ng-container matColumnDef=\"quantity_measure\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Quantity Measure</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.quantity_measure }}\n </td>\n </ng-container>\n\n <!-- Description Column -->\n <ng-container matColumnDef=\"description\">\n <th mat-header-cell *matHeaderCellDef>Description</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.description }}</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=\"d-flex justify-content-start align-items-center gap-2\">\n <app-measure-form-button [measure]=\"element\" (saved)=\"reload()\"\n *ngIf=\"element?.client_id\"></app-measure-form-button>\n <app-measure-delete-button [measure]=\"element\" (deleted)=\"reload()\"\n *ngIf=\"element?.client_id\"></app-measure-delete-button>\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></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>", styles: [""], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i4.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i5.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i5.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i5.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i5.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i5.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i5.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i5.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i5.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i5.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i5.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i6.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i6.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i7.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i8.MeasureFormButtonComponent, selector: "app-measure-form-button", inputs: ["measure"], outputs: ["saved"] }, { kind: "component", type: i9.TechlifyFilterComponent, selector: "app-techlify-filter", inputs: ["filterForm", "filterConfig"], outputs: ["filterUpdated"] }, { kind: "directive", type: i10.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "component", type: i11.MeasureDeleteButtonComponent, selector: "app-measure-delete-button", inputs: ["measure"], outputs: ["deleted"] }], preserveWhitespaces: true });
68
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MeasuresListComponent, selector: "app-measure-list", usesInheritance: true, ngImport: i0, template: "<mat-card class=\"mb-2\">\n <mat-card-content class=\"d-flex justify-content-between align-items-center gap-3\">\n <div class=\"d-flex justify-content-center align-items-center gap-2\">\n <h3 class=\"mb-0\">Measures</h3>\n <app-measure-form-button class=\"mt-1\" (saved)=\"reload()\"></app-measure-form-button>\n </div>\n <app-techlify-filter [filterForm]=\"filterForm\" (filterUpdated)=\"reload()\"></app-techlify-filter>\n </mat-card-content>\n</mat-card>\n\n<mat-card class=\"p-0\">\n <mat-card-content>\n <table mat-table [dataSource]=\"models\" class=\"w-100\" aria-describedby=\"Service Centers\" infiniteScroll\n [infiniteScrollDistance]=\"2\" [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScroll()\" matSort\n (matSortChange)=\"onSortChange($event)\">\n <!-- # Column -->\n <ng-container matColumnDef=\"no\">\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 <!-- Title Column -->\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Title</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.title }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"products\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Products</th>\n <td mat-cell *matCellDef=\"let element\">\n <a\n class=\"cursor-pointer text-dark text-decoration-none\"\n [routerLink]=\"['/inventory/products']\"\n [queryParams]=\"{ measure_ids: element.id }\"\n >\n {{ element?.products_count }} products\n </a>\n </td>\n </ng-container>\n\n <!-- Quantity Measure Column -->\n <ng-container matColumnDef=\"quantity_measure\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Quantity Measure</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.quantity_measure }}\n </td>\n </ng-container>\n\n <!-- Description Column -->\n <ng-container matColumnDef=\"description\">\n <th mat-header-cell *matHeaderCellDef>Description</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.description }}</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=\"d-flex justify-content-start align-items-center gap-2\">\n <app-measure-form-button [measure]=\"element\" (saved)=\"reload()\"\n *ngIf=\"element?.client_id\"></app-measure-form-button>\n <app-measure-delete-button [measure]=\"element\" (deleted)=\"reload()\"\n *ngIf=\"element?.client_id && element?.products_count == 0\"></app-measure-delete-button>\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></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>", styles: [""], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i5.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i5.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i6.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i7.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i7.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i8.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i9.MeasureFormButtonComponent, selector: "app-measure-form-button", inputs: ["measure"], outputs: ["saved"] }, { kind: "component", type: i10.TechlifyFilterComponent, selector: "app-techlify-filter", inputs: ["filterForm", "filterConfig"], outputs: ["filterUpdated"] }, { kind: "directive", type: i11.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { kind: "component", type: i12.MeasureDeleteButtonComponent, selector: "app-measure-delete-button", inputs: ["measure"], outputs: ["deleted"] }], preserveWhitespaces: true });
68
69
  }
69
70
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MeasuresListComponent, decorators: [{
70
71
  type: Component,
71
- args: [{ selector: 'app-measure-list', template: "<mat-card class=\"mb-2\">\n <mat-card-content class=\"d-flex justify-content-between align-items-center gap-3\">\n <div class=\"d-flex justify-content-center align-items-center gap-2\">\n <h3 class=\"mb-0\">Measures</h3>\n <app-measure-form-button class=\"mt-1\" (saved)=\"reload()\"></app-measure-form-button>\n </div>\n <app-techlify-filter [filterForm]=\"filterForm\" (filterUpdated)=\"reload()\"></app-techlify-filter>\n </mat-card-content>\n</mat-card>\n\n<mat-card class=\"p-0\">\n <mat-card-content>\n <table mat-table [dataSource]=\"models\" class=\"w-100\" aria-describedby=\"Service Centers\" infiniteScroll\n [infiniteScrollDistance]=\"2\" [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScroll()\" matSort\n (matSortChange)=\"onSortChange($event)\">\n <!-- # Column -->\n <ng-container matColumnDef=\"no\">\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 <!-- Title Column -->\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Title</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.title }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"products\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Products</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.products_count }}\n </td>\n </ng-container>\n\n <!-- Quantity Measure Column -->\n <ng-container matColumnDef=\"quantity_measure\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Quantity Measure</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.quantity_measure }}\n </td>\n </ng-container>\n\n <!-- Description Column -->\n <ng-container matColumnDef=\"description\">\n <th mat-header-cell *matHeaderCellDef>Description</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.description }}</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=\"d-flex justify-content-start align-items-center gap-2\">\n <app-measure-form-button [measure]=\"element\" (saved)=\"reload()\"\n *ngIf=\"element?.client_id\"></app-measure-form-button>\n <app-measure-delete-button [measure]=\"element\" (deleted)=\"reload()\"\n *ngIf=\"element?.client_id\"></app-measure-delete-button>\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></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>" }]
72
+ args: [{ selector: 'app-measure-list', template: "<mat-card class=\"mb-2\">\n <mat-card-content class=\"d-flex justify-content-between align-items-center gap-3\">\n <div class=\"d-flex justify-content-center align-items-center gap-2\">\n <h3 class=\"mb-0\">Measures</h3>\n <app-measure-form-button class=\"mt-1\" (saved)=\"reload()\"></app-measure-form-button>\n </div>\n <app-techlify-filter [filterForm]=\"filterForm\" (filterUpdated)=\"reload()\"></app-techlify-filter>\n </mat-card-content>\n</mat-card>\n\n<mat-card class=\"p-0\">\n <mat-card-content>\n <table mat-table [dataSource]=\"models\" class=\"w-100\" aria-describedby=\"Service Centers\" infiniteScroll\n [infiniteScrollDistance]=\"2\" [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScroll()\" matSort\n (matSortChange)=\"onSortChange($event)\">\n <!-- # Column -->\n <ng-container matColumnDef=\"no\">\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 <!-- Title Column -->\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Title</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.title }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"products\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Products</th>\n <td mat-cell *matCellDef=\"let element\">\n <a\n class=\"cursor-pointer text-dark text-decoration-none\"\n [routerLink]=\"['/inventory/products']\"\n [queryParams]=\"{ measure_ids: element.id }\"\n >\n {{ element?.products_count }} products\n </a>\n </td>\n </ng-container>\n\n <!-- Quantity Measure Column -->\n <ng-container matColumnDef=\"quantity_measure\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Quantity Measure</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.quantity_measure }}\n </td>\n </ng-container>\n\n <!-- Description Column -->\n <ng-container matColumnDef=\"description\">\n <th mat-header-cell *matHeaderCellDef>Description</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.description }}</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=\"d-flex justify-content-start align-items-center gap-2\">\n <app-measure-form-button [measure]=\"element\" (saved)=\"reload()\"\n *ngIf=\"element?.client_id\"></app-measure-form-button>\n <app-measure-delete-button [measure]=\"element\" (deleted)=\"reload()\"\n *ngIf=\"element?.client_id && element?.products_count == 0\"></app-measure-delete-button>\n </div>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></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>" }]
72
73
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.MeasureService }] });
73
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVhc3VyZXMtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9tZWFzdXJlL21lYXN1cmVzLWxpc3QvbWVhc3VyZXMtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9tZWFzdXJlL21lYXN1cmVzLWxpc3QvbWVhc3VyZXMtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBRWxELE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7Ozs7Ozs7Ozs7O0FBU3ZFLE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxrQ0FBa0M7SUFVdkQ7SUFBa0M7SUFUdEQsZ0JBQWdCLEdBQWE7UUFDM0IsSUFBSTtRQUNKLE9BQU87UUFDUCxVQUFVO1FBQ1Ysa0JBQWtCO1FBQ2xCLGFBQWE7UUFDYixTQUFTO0tBQ1YsQ0FBQztJQUVGLFlBQW9CLFdBQXdCLEVBQVUsY0FBOEI7UUFDbEYsS0FBSyxFQUFFLENBQUM7UUFEVSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUFVLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUVsRixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQ3ZDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNaLE9BQU8sRUFBRSxDQUFDLGlCQUFpQixDQUFDO1NBQzdCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxRQUFRO1FBQ04sTUFBTSxNQUFNLEdBQVE7WUFDbEIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLFNBQVMsRUFBRSxVQUFVO1lBQ3JCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLO1NBQ3pCLENBQUM7UUFDRixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDMUMsSUFBSSxFQUFFLENBQUMsUUFBYSxFQUFFLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2dCQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDakQsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLEVBQUUsU0FBUyxDQUFDO1lBQ3RDLENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztTQUN0QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsWUFBWSxDQUFDLElBQVU7UUFDckIsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osTUFBTSxHQUFHLFlBQVksQ0FBQztRQUN4QixDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsU0FBUyxHQUFHLE1BQU0sQ0FBQztZQUNuQixNQUFNLEdBQUcsWUFBWSxDQUFDO1FBQ3hCLENBQUM7UUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUMsQ0FBQztJQUNwRSxDQUFDO3dHQWxEVSxxQkFBcUI7NEZBQXJCLHFCQUFxQiwrRUNYbEMscytGQXFFVzs7NEZEMURFLHFCQUFxQjtrQkFMakMsU0FBUzsrQkFDRSxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUZWNobGlmeUxpc3RpbmdDb250cm9sbGVySW50ZXJmYWNlIH0gZnJvbSAnbmd4LXRlY2hsaWZ5LWNvcmUnO1xuaW1wb3J0IHsgTWVhc3VyZVNlcnZpY2UgfSBmcm9tICcuLi9tZWFzdXJlLnNlcnZpY2UnO1xuaW1wb3J0IHsgU29ydCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtbWVhc3VyZS1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL21lYXN1cmVzLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tZWFzdXJlcy1saXN0LmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIE1lYXN1cmVzTGlzdENvbXBvbmVudCBleHRlbmRzIFRlY2hsaWZ5TGlzdGluZ0NvbnRyb2xsZXJJbnRlcmZhY2UgaW1wbGVtZW50cyBPbkluaXQge1xuICBkaXNwbGF5ZWRDb2x1bW5zOiBzdHJpbmdbXSA9IFtcbiAgICAnbm8nLFxuICAgICd0aXRsZScsXG4gICAgJ3Byb2R1Y3RzJyxcbiAgICAncXVhbnRpdHlfbWVhc3VyZScsXG4gICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAnYWN0aW9ucydcbiAgXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlciwgcHJpdmF0ZSBtZWFzdXJlU2VydmljZTogTWVhc3VyZVNlcnZpY2UpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZmlsdGVyRm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgc2VhcmNoOiBbJyddLFxuICAgICAgc29ydF9ieTogWydjcmVhdGVkX2F0fGRlc2MnXSxcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZERhdGEoKTtcbiAgfVxuXG4gIGxvYWREYXRhKCk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmFtczogYW55ID0ge1xuICAgICAgcGFnZTogdGhpcy5wYWdlLFxuICAgICAgcGVyUGFnZTogdGhpcy5wZXJQYWdlLFxuICAgICAgd2l0aENvdW50OiAncHJvZHVjdHMnLFxuICAgICAgLi4udGhpcy5maWx0ZXJGb3JtLnZhbHVlLFxuICAgIH07XG4gICAgdGhpcy5pc1dvcmtpbmcgPSB0cnVlO1xuICAgIHRoaXMubWVhc3VyZVNlcnZpY2UuaW5kZXgocGFyYW1zKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5pc1dvcmtpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tb2RlbHMgPSB0aGlzLm1vZGVscy5jb25jYXQocmVzcG9uc2U/LmRhdGEpO1xuICAgICAgICB0aGlzLmxhc3RQYWdlID0gcmVzcG9uc2U/Lmxhc3RfcGFnZTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4gKHRoaXMuaXNXb3JraW5nID0gZmFsc2UpLFxuICAgIH0pO1xuICB9XG5cbiAgb25Tb3J0Q2hhbmdlKHNvcnQ6IFNvcnQpIHtcbiAgICBsZXQgeyBhY3RpdmUsIGRpcmVjdGlvbiB9ID0gc29ydDtcbiAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgYWN0aXZlID0gJ2NyZWF0ZWRfYXQnO1xuICAgIH1cbiAgICBpZiAoIWRpcmVjdGlvbikge1xuICAgICAgZGlyZWN0aW9uID0gJ2Rlc2MnO1xuICAgICAgYWN0aXZlID0gJ2NyZWF0ZWRfYXQnO1xuICAgIH1cbiAgICB0aGlzLmZpbHRlckZvcm0uZ2V0KCdzb3J0X2J5Jykuc2V0VmFsdWUoYWN0aXZlICsgJ3wnICsgZGlyZWN0aW9uKTtcbiAgfVxufVxuIiwiPG1hdC1jYXJkIGNsYXNzPVwibWItMlwiPlxuICA8bWF0LWNhcmQtY29udGVudCBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICA8aDMgY2xhc3M9XCJtYi0wXCI+TWVhc3VyZXM8L2gzPlxuICAgICAgPGFwcC1tZWFzdXJlLWZvcm0tYnV0dG9uIGNsYXNzPVwibXQtMVwiIChzYXZlZCk9XCJyZWxvYWQoKVwiPjwvYXBwLW1lYXN1cmUtZm9ybS1idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGFwcC10ZWNobGlmeS1maWx0ZXIgW2ZpbHRlckZvcm1dPVwiZmlsdGVyRm9ybVwiIChmaWx0ZXJVcGRhdGVkKT1cInJlbG9hZCgpXCI+PC9hcHAtdGVjaGxpZnktZmlsdGVyPlxuICA8L21hdC1jYXJkLWNvbnRlbnQ+XG48L21hdC1jYXJkPlxuXG48bWF0LWNhcmQgY2xhc3M9XCJwLTBcIj5cbiAgPG1hdC1jYXJkLWNvbnRlbnQ+XG4gICAgPHRhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJtb2RlbHNcIiBjbGFzcz1cInctMTAwXCIgYXJpYS1kZXNjcmliZWRieT1cIlNlcnZpY2UgQ2VudGVyc1wiIGluZmluaXRlU2Nyb2xsXG4gICAgICBbaW5maW5pdGVTY3JvbGxEaXN0YW5jZV09XCIyXCIgW2luZmluaXRlU2Nyb2xsVGhyb3R0bGVdPVwiNTBcIiAoc2Nyb2xsZWQpPVwib25TY3JvbGwoKVwiIG1hdFNvcnRcbiAgICAgIChtYXRTb3J0Q2hhbmdlKT1cIm9uU29ydENoYW5nZSgkZXZlbnQpXCI+XG4gICAgICA8IS0tICMgQ29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJub1wiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiM8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudDsgbGV0IGkgPSBpbmRleFwiPnt7IGkgKyAxIH19PC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIFRpdGxlIENvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwidGl0bGVcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+VGl0bGU8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgIHt7IGVsZW1lbnQ/LnRpdGxlIH19XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJwcm9kdWN0c1wiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5Qcm9kdWN0czwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAge3sgZWxlbWVudD8ucHJvZHVjdHNfY291bnQgfX1cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIFF1YW50aXR5IE1lYXN1cmUgQ29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJxdWFudGl0eV9tZWFzdXJlXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPlF1YW50aXR5IE1lYXN1cmU8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgIHt7IGVsZW1lbnQ/LnF1YW50aXR5X21lYXN1cmUgfX1cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIERlc2NyaXB0aW9uIENvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZGVzY3JpcHRpb25cIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5EZXNjcmlwdGlvbjwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3sgZWxlbWVudD8uZGVzY3JpcHRpb24gfX08L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gQWN0aW9ucyBDb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImFjdGlvbnNcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5BY3Rpb25zPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1zdGFydCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxhcHAtbWVhc3VyZS1mb3JtLWJ1dHRvbiBbbWVhc3VyZV09XCJlbGVtZW50XCIgKHNhdmVkKT1cInJlbG9hZCgpXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJlbGVtZW50Py5jbGllbnRfaWRcIj48L2FwcC1tZWFzdXJlLWZvcm0tYnV0dG9uPlxuICAgICAgICAgICAgPGFwcC1tZWFzdXJlLWRlbGV0ZS1idXR0b24gW21lYXN1cmVdPVwiZWxlbWVudFwiIChkZWxldGVkKT1cInJlbG9hZCgpXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJlbGVtZW50Py5jbGllbnRfaWRcIj48L2FwcC1tZWFzdXJlLWRlbGV0ZS1idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICA8L3RhYmxlPlxuXG4gICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiAqbmdJZj1cImlzV29ya2luZ1wiPjwvbWF0LXByb2dyZXNzLWJhcj5cbiAgPC9tYXQtY2FyZC1jb250ZW50PlxuPC9tYXQtY2FyZD4iXX0=
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVhc3VyZXMtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9tZWFzdXJlL21lYXN1cmVzLWxpc3QvbWVhc3VyZXMtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9tZWFzdXJlL21lYXN1cmVzLWxpc3QvbWVhc3VyZXMtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBRWxELE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7Ozs7Ozs7Ozs7OztBQVN2RSxNQUFNLE9BQU8scUJBQXNCLFNBQVEsa0NBQWtDO0lBVXZEO0lBQWtDO0lBVHRELGdCQUFnQixHQUFhO1FBQzNCLElBQUk7UUFDSixPQUFPO1FBQ1AsVUFBVTtRQUNWLGtCQUFrQjtRQUNsQixhQUFhO1FBQ2IsU0FBUztLQUNWLENBQUM7SUFFRixZQUFvQixXQUF3QixFQUFVLGNBQThCO1FBQ2xGLEtBQUssRUFBRSxDQUFDO1FBRFUsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFFbEYsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUN2QyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDWixPQUFPLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztTQUM3QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQsUUFBUTtRQUNOLE1BQU0sTUFBTSxHQUFRO1lBQ2xCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixTQUFTLEVBQUUsVUFBVTtZQUNyQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSztTQUN6QixDQUFDO1FBQ0YsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzFDLElBQUksRUFBRSxDQUFDLFFBQWEsRUFBRSxFQUFFO2dCQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxFQUFFLFNBQVMsQ0FBQztZQUN0QyxDQUFDO1lBQ0QsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7U0FDdEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFVO1FBQ3JCLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sR0FBRyxZQUFZLENBQUM7UUFDeEIsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLFNBQVMsR0FBRyxNQUFNLENBQUM7WUFDbkIsTUFBTSxHQUFHLFlBQVksQ0FBQztRQUN4QixDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFDcEUsQ0FBQzt3R0FsRFUscUJBQXFCOzRGQUFyQixxQkFBcUIsK0VDWGxDLGt2R0EyRVc7OzRGRGhFRSxxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0Usa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVGVjaGxpZnlMaXN0aW5nQ29udHJvbGxlckludGVyZmFjZSB9IGZyb20gJ25neC10ZWNobGlmeS1jb3JlJztcbmltcG9ydCB7IE1lYXN1cmVTZXJ2aWNlIH0gZnJvbSAnLi4vbWVhc3VyZS5zZXJ2aWNlJztcbmltcG9ydCB7IFNvcnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLW1lYXN1cmUtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tZWFzdXJlcy1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbWVhc3VyZXMtbGlzdC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBNZWFzdXJlc0xpc3RDb21wb25lbnQgZXh0ZW5kcyBUZWNobGlmeUxpc3RpbmdDb250cm9sbGVySW50ZXJmYWNlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgZGlzcGxheWVkQ29sdW1uczogc3RyaW5nW10gPSBbXG4gICAgJ25vJyxcbiAgICAndGl0bGUnLFxuICAgICdwcm9kdWN0cycsXG4gICAgJ3F1YW50aXR5X21lYXN1cmUnLFxuICAgICdkZXNjcmlwdGlvbicsXG4gICAgJ2FjdGlvbnMnXG4gIF07XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsIHByaXZhdGUgbWVhc3VyZVNlcnZpY2U6IE1lYXN1cmVTZXJ2aWNlKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmZpbHRlckZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIHNlYXJjaDogWycnXSxcbiAgICAgIHNvcnRfYnk6IFsnY3JlYXRlZF9hdHxkZXNjJ10sXG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWREYXRhKCk7XG4gIH1cblxuICBsb2FkRGF0YSgpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJhbXM6IGFueSA9IHtcbiAgICAgIHBhZ2U6IHRoaXMucGFnZSxcbiAgICAgIHBlclBhZ2U6IHRoaXMucGVyUGFnZSxcbiAgICAgIHdpdGhDb3VudDogJ3Byb2R1Y3RzJyxcbiAgICAgIC4uLnRoaXMuZmlsdGVyRm9ybS52YWx1ZSxcbiAgICB9O1xuICAgIHRoaXMuaXNXb3JraW5nID0gdHJ1ZTtcbiAgICB0aGlzLm1lYXN1cmVTZXJ2aWNlLmluZGV4KHBhcmFtcykuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuaXNXb3JraW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMubW9kZWxzID0gdGhpcy5tb2RlbHMuY29uY2F0KHJlc3BvbnNlPy5kYXRhKTtcbiAgICAgICAgdGhpcy5sYXN0UGFnZSA9IHJlc3BvbnNlPy5sYXN0X3BhZ2U7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+ICh0aGlzLmlzV29ya2luZyA9IGZhbHNlKSxcbiAgICB9KTtcbiAgfVxuXG4gIG9uU29ydENoYW5nZShzb3J0OiBTb3J0KSB7XG4gICAgbGV0IHsgYWN0aXZlLCBkaXJlY3Rpb24gfSA9IHNvcnQ7XG4gICAgaWYgKCFhY3RpdmUpIHtcbiAgICAgIGFjdGl2ZSA9ICdjcmVhdGVkX2F0JztcbiAgICB9XG4gICAgaWYgKCFkaXJlY3Rpb24pIHtcbiAgICAgIGRpcmVjdGlvbiA9ICdkZXNjJztcbiAgICAgIGFjdGl2ZSA9ICdjcmVhdGVkX2F0JztcbiAgICB9XG4gICAgdGhpcy5maWx0ZXJGb3JtLmdldCgnc29ydF9ieScpLnNldFZhbHVlKGFjdGl2ZSArICd8JyArIGRpcmVjdGlvbik7XG4gIH1cbn1cbiIsIjxtYXQtY2FyZCBjbGFzcz1cIm1iLTJcIj5cbiAgPG1hdC1jYXJkLWNvbnRlbnQgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCI+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgPGgzIGNsYXNzPVwibWItMFwiPk1lYXN1cmVzPC9oMz5cbiAgICAgIDxhcHAtbWVhc3VyZS1mb3JtLWJ1dHRvbiBjbGFzcz1cIm10LTFcIiAoc2F2ZWQpPVwicmVsb2FkKClcIj48L2FwcC1tZWFzdXJlLWZvcm0tYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxhcHAtdGVjaGxpZnktZmlsdGVyIFtmaWx0ZXJGb3JtXT1cImZpbHRlckZvcm1cIiAoZmlsdGVyVXBkYXRlZCk9XCJyZWxvYWQoKVwiPjwvYXBwLXRlY2hsaWZ5LWZpbHRlcj5cbiAgPC9tYXQtY2FyZC1jb250ZW50PlxuPC9tYXQtY2FyZD5cblxuPG1hdC1jYXJkIGNsYXNzPVwicC0wXCI+XG4gIDxtYXQtY2FyZC1jb250ZW50PlxuICAgIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwibW9kZWxzXCIgY2xhc3M9XCJ3LTEwMFwiIGFyaWEtZGVzY3JpYmVkYnk9XCJTZXJ2aWNlIENlbnRlcnNcIiBpbmZpbml0ZVNjcm9sbFxuICAgICAgW2luZmluaXRlU2Nyb2xsRGlzdGFuY2VdPVwiMlwiIFtpbmZpbml0ZVNjcm9sbFRocm90dGxlXT1cIjUwXCIgKHNjcm9sbGVkKT1cIm9uU2Nyb2xsKClcIiBtYXRTb3J0XG4gICAgICAobWF0U29ydENoYW5nZSk9XCJvblNvcnRDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgPCEtLSAjIENvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibm9cIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4jPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7IGxldCBpID0gaW5kZXhcIj57eyBpICsgMSB9fTwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBUaXRsZSBDb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInRpdGxlXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPlRpdGxlPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICB7eyBlbGVtZW50Py50aXRsZSB9fVxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwicHJvZHVjdHNcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+UHJvZHVjdHM8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgIDxhXG4gICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyIHRleHQtZGFyayB0ZXh0LWRlY29yYXRpb24tbm9uZVwiXG4gICAgICAgICAgICBbcm91dGVyTGlua109XCJbJy9pbnZlbnRvcnkvcHJvZHVjdHMnXVwiXG4gICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwieyBtZWFzdXJlX2lkczogZWxlbWVudC5pZCB9XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBlbGVtZW50Py5wcm9kdWN0c19jb3VudCB9fSBwcm9kdWN0c1xuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIFF1YW50aXR5IE1lYXN1cmUgQ29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJxdWFudGl0eV9tZWFzdXJlXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPlF1YW50aXR5IE1lYXN1cmU8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgIHt7IGVsZW1lbnQ/LnF1YW50aXR5X21lYXN1cmUgfX1cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIERlc2NyaXB0aW9uIENvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZGVzY3JpcHRpb25cIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5EZXNjcmlwdGlvbjwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3sgZWxlbWVudD8uZGVzY3JpcHRpb24gfX08L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gQWN0aW9ucyBDb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImFjdGlvbnNcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5BY3Rpb25zPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1zdGFydCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxhcHAtbWVhc3VyZS1mb3JtLWJ1dHRvbiBbbWVhc3VyZV09XCJlbGVtZW50XCIgKHNhdmVkKT1cInJlbG9hZCgpXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJlbGVtZW50Py5jbGllbnRfaWRcIj48L2FwcC1tZWFzdXJlLWZvcm0tYnV0dG9uPlxuICAgICAgICAgICAgPGFwcC1tZWFzdXJlLWRlbGV0ZS1idXR0b24gW21lYXN1cmVdPVwiZWxlbWVudFwiIChkZWxldGVkKT1cInJlbG9hZCgpXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJlbGVtZW50Py5jbGllbnRfaWQgJiYgZWxlbWVudD8ucHJvZHVjdHNfY291bnQgPT0gMFwiPjwvYXBwLW1lYXN1cmUtZGVsZXRlLWJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxuICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxuICAgIDwvdGFibGU+XG5cbiAgICA8bWF0LXByb2dyZXNzLWJhciBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiICpuZ0lmPVwiaXNXb3JraW5nXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxuICA8L21hdC1jYXJkLWNvbnRlbnQ+XG48L21hdC1jYXJkPiJdfQ==
@@ -65,8 +65,17 @@ let ProductListComponent = class ProductListComponent extends TechlifyListingCon
65
65
  }
66
66
  const selectedCols = this.selectedColumns.map(col => col.def);
67
67
  const defaultCols = [
68
- '#', 'name', 'sku', 'categories', 'reorder_point',
69
- 'stock_receipts', 'stock_issuances', 'on_hand', 'measure', 'sale_price'
68
+ '#',
69
+ 'name',
70
+ 'sku',
71
+ 'categories',
72
+ 'description',
73
+ 'reorder_point',
74
+ 'stock_receipts',
75
+ 'stock_issuances',
76
+ 'on_hand',
77
+ 'measure',
78
+ 'sale_price'
70
79
  ];
71
80
  const cols = defaultCols.concat(...selectedCols);
72
81
  cols.push('Actions', 'Select');
@@ -82,12 +91,13 @@ let ProductListComponent = class ProductListComponent extends TechlifyListingCon
82
91
  this.requestHelperService = requestHelperService;
83
92
  this.productFormService = productFormService;
84
93
  this.filterForm = this.fb.group({
85
- search: [''],
86
94
  category_ids: [''],
87
- type_ids: [''],
88
- income_account_ids: [''],
89
95
  expense_account_ids: [''],
96
+ income_account_ids: [''],
97
+ measure_ids: [''],
98
+ search: [''],
90
99
  sort_by: [''],
100
+ type_ids: [''],
91
101
  });
92
102
  }
93
103
  ngOnInit() {
@@ -170,7 +180,7 @@ let ProductListComponent = class ProductListComponent extends TechlifyListingCon
170
180
  this.exportInProgress = hideColumns;
171
181
  }
172
182
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProductListComponent, deps: [{ token: i1.FormBuilder }, { token: i2.MatDialog }, { token: i3.ActivatedRoute }, { token: i4.ProductService }, { token: i5.RequestHelperService }, { token: i6.ProductFormService }], target: i0.ɵɵFactoryTarget.Component });
173
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", 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 class=\"mt-2\"></app-product-form-button>\n <span matTooltip=\"Import\" routerLink=\"import\" class=\"cursor-pointer mt-1 material-symbols-outlined\">\n file_upload\n </span>\n <app-export-to-excel-button tableId=\"productTable\" fileName=\"products\" (onExportStart)=\"handleExport(true)\" (onExportEnd)=\"handleExport(false)\"></app-export-to-excel-button>\n <app-column-selector\n mode=\"icon\"\n class=\"mb-2 d-print-none\"\n [columnConfigs]=\"columnConfig\"\n [(selectedColumns)]=\"selectedColumns\"\n ></app-column-selector>\n </div>\n\n <div class=\"d-flex justify-content-start align-items-center gap-2\">\n <mat-form-field>\n <mat-label>Search</mat-label>\n <input matInput placeholder=\"Search products\" formControlName=\"search\" />\n </mat-form-field>\n\n <mat-form-field>\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>\n <mat-label>Type</mat-label>\n <app-searchable-selector\n apiUrl=\"api/product-types\"\n formControlName=\"type_ids\"\n titleField=\"title\"\n [multiple]=\"true\"\n >\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 [style.width]=\"selection.isEmpty() ? '100%' : '85%'\">\n <mat-card-content class=\"p-0\">\n <table\n mat-table\n [dataSource]=\"models\"\n class=\"w-100\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n (scrolled)=\"onScroll()\"\n [fromRoot]=\"true\"\n matSort\n (matSortChange)=\"sortColumn($event)\"\n matSortDisableClear=\"true\"\n aria-describedby=\"Products List\"\n id=\"productTable\"\n >\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\n *ngIf=\"element?.categories?.length > 0\"\n class=\"d-flex justify-content-start align-items-center gap-1 flex-wrap\"\n >\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 <!-- 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 <!-- Last Stock Receipt Date Column -->\n <ng-container matColumnDef=\"last_stock_receipt_date\">\n <th mat-header-cell *matHeaderCellDef>Last Stock Receipt Date</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.last_stock_receipt?.date | date }}\n </td>\n </ng-container>\n\n <!-- Stock Issuances Column -->\n <ng-container matColumnDef=\"stock_issuances\">\n <th mat-header-cell mat-sort-header=\"stock_issuances_sum_quantity\" *matHeaderCellDef>Stock Issuances</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\">{{ element?.stock_issuances_sum_quantity }}</p>\n <small class=\"text-secondary\" *ngIf=\"element?.last_stock_issuance && !exportInProgress\">\n Latest on {{ element?.last_stock_issuance?.date | date }}\n </small>\n </td>\n </ng-container>\n\n <!-- Last Stock Issue Date Column -->\n <ng-container matColumnDef=\"last_stock_issue_date\">\n <th mat-header-cell *matHeaderCellDef>Last Stock Issue Date</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.last_stock_issuance?.date | date }}\n </td>\n </ng-container>\n\n <!-- On Hand Column -->\n <ng-container matColumnDef=\"on_hand\">\n <th mat-header-cell *matHeaderCellDef>On Hand</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.stock_balance }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"measure\">\n <th mat-header-cell *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-product-form-button [product]=\"element\"></app-product-form-button>\n <mat-icon\n class=\"cursor-pointer\"\n matTooltip=\"View\"\n [routerLink]=\"[element.id, 'view']\"\n routerLinkActive=\"route-link-active\"\n >\n remove_red_eye\n </mat-icon>\n\n <app-stock-receipt-form-button [product]=\"element\" (saved)=\"reload()\"></app-stock-receipt-form-button>\n\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()\"\n [aria-label]=\"checkboxLabel()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\"\n [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\n *ngIf=\"!selection.isEmpty()\"\n style=\"width: calc(15% - 1rem)\"\n >\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>\n", dependencies: [{ kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.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: i5.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", "stockIssuance", "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: "component", type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i13.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: i14.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i14.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i15.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i15.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i15.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i15.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i15.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i15.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i15.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i15.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i15.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i15.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i15.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i15.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i16.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i16.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i17.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i18.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: i19.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: i5.ColumnSelectorComponent, selector: "app-column-selector", inputs: ["label", "mode", "columnConfigs", "selectedColumns"], outputs: ["selectedColumnsChange", "displayedColumnsChange"] }, { kind: "component", type: i20.ExportToExcelButtonComponent, selector: "app-export-to-excel-button", inputs: ["tableId", "fileName"], outputs: ["onExportStart", "onExportEnd"] }, { kind: "component", type: i21.ProductFormButtonComponent, selector: "app-product-form-button", inputs: ["product"], outputs: ["saved"] }, { kind: "component", type: i22.ProductBatchUpdateFormComponent, selector: "app-product-batch-update-form", inputs: ["selection"], outputs: ["updated"] }, { kind: "pipe", type: i7.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i7.DatePipe, name: "date" }], preserveWhitespaces: true });
183
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", 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 class=\"mt-2\"></app-product-form-button>\n <span matTooltip=\"Import\" routerLink=\"import\" class=\"cursor-pointer mt-1 material-symbols-outlined\">\n file_upload\n </span>\n <app-export-to-excel-button tableId=\"productTable\" fileName=\"products\" (onExportStart)=\"handleExport(true)\" (onExportEnd)=\"handleExport(false)\"></app-export-to-excel-button>\n <app-column-selector\n mode=\"icon\"\n class=\"mb-2 d-print-none\"\n [columnConfigs]=\"columnConfig\"\n [(selectedColumns)]=\"selectedColumns\"\n ></app-column-selector>\n </div>\n\n <div class=\"d-flex justify-content-start align-items-center gap-2\">\n <mat-form-field>\n <mat-label>Search</mat-label>\n <input matInput placeholder=\"Search products\" formControlName=\"search\" />\n </mat-form-field>\n\n <mat-form-field>\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>\n <mat-label>Type</mat-label>\n <app-searchable-selector\n apiUrl=\"api/product-types\"\n formControlName=\"type_ids\"\n titleField=\"title\"\n [multiple]=\"true\"\n >\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 [style.width]=\"selection.isEmpty() ? '100%' : '85%'\">\n <mat-card-content class=\"p-0\">\n <table\n mat-table\n [dataSource]=\"models\"\n class=\"w-100\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n (scrolled)=\"onScroll()\"\n [fromRoot]=\"true\"\n matSort\n (matSortChange)=\"sortColumn($event)\"\n matSortDisableClear=\"true\"\n aria-describedby=\"Products List\"\n id=\"productTable\"\n >\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\n *ngIf=\"element?.categories?.length > 0\"\n class=\"d-flex justify-content-start align-items-center gap-1 flex-wrap\"\n >\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 <!-- Last Stock Receipt Date Column -->\n <ng-container matColumnDef=\"last_stock_receipt_date\">\n <th mat-header-cell *matHeaderCellDef>Last Stock Receipt Date</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.last_stock_receipt?.date | date }}\n </td>\n </ng-container>\n\n <!-- Stock Issuances Column -->\n <ng-container matColumnDef=\"stock_issuances\">\n <th mat-header-cell mat-sort-header=\"stock_issuances_sum_quantity\" *matHeaderCellDef>Stock Issuances</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\">{{ element?.stock_issuances_sum_quantity }}</p>\n <small class=\"text-secondary\" *ngIf=\"element?.last_stock_issuance && !exportInProgress\">\n Latest on {{ element?.last_stock_issuance?.date | date }}\n </small>\n </td>\n </ng-container>\n\n <!-- Last Stock Issue Date Column -->\n <ng-container matColumnDef=\"last_stock_issue_date\">\n <th mat-header-cell *matHeaderCellDef>Last Stock Issue Date</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.last_stock_issuance?.date | date }}\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_balance }}\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-product-form-button [product]=\"element\"></app-product-form-button>\n <mat-icon\n class=\"cursor-pointer\"\n matTooltip=\"View\"\n [routerLink]=\"[element.id, 'view']\"\n routerLinkActive=\"route-link-active\"\n >\n remove_red_eye\n </mat-icon>\n\n <app-stock-receipt-form-button [product]=\"element\" (saved)=\"reload()\"></app-stock-receipt-form-button>\n\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()\"\n [aria-label]=\"checkboxLabel()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\"\n [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\n *ngIf=\"!selection.isEmpty()\"\n style=\"width: calc(15% - 1rem)\"\n >\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>\n", dependencies: [{ kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.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: i5.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", "stockIssuance", "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: "component", type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i13.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: i14.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i14.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i15.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i15.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i15.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i15.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i15.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i15.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i15.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i15.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i15.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i15.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i15.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i15.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i16.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i16.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i17.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i18.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: i19.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: i5.ColumnSelectorComponent, selector: "app-column-selector", inputs: ["label", "mode", "columnConfigs", "selectedColumns"], outputs: ["selectedColumnsChange", "displayedColumnsChange"] }, { kind: "component", type: i20.ExportToExcelButtonComponent, selector: "app-export-to-excel-button", inputs: ["tableId", "fileName"], outputs: ["onExportStart", "onExportEnd"] }, { kind: "component", type: i21.ProductFormButtonComponent, selector: "app-product-form-button", inputs: ["product"], outputs: ["saved"] }, { kind: "component", type: i22.ProductBatchUpdateFormComponent, selector: "app-product-batch-update-form", inputs: ["selection"], outputs: ["updated"] }, { kind: "pipe", type: i7.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i7.DatePipe, name: "date" }], preserveWhitespaces: true });
174
184
  };
175
185
  ProductListComponent = __decorate([
176
186
  UntilDestroy()
@@ -178,6 +188,6 @@ ProductListComponent = __decorate([
178
188
  export { ProductListComponent };
179
189
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProductListComponent, decorators: [{
180
190
  type: Component,
181
- 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 class=\"mt-2\"></app-product-form-button>\n <span matTooltip=\"Import\" routerLink=\"import\" class=\"cursor-pointer mt-1 material-symbols-outlined\">\n file_upload\n </span>\n <app-export-to-excel-button tableId=\"productTable\" fileName=\"products\" (onExportStart)=\"handleExport(true)\" (onExportEnd)=\"handleExport(false)\"></app-export-to-excel-button>\n <app-column-selector\n mode=\"icon\"\n class=\"mb-2 d-print-none\"\n [columnConfigs]=\"columnConfig\"\n [(selectedColumns)]=\"selectedColumns\"\n ></app-column-selector>\n </div>\n\n <div class=\"d-flex justify-content-start align-items-center gap-2\">\n <mat-form-field>\n <mat-label>Search</mat-label>\n <input matInput placeholder=\"Search products\" formControlName=\"search\" />\n </mat-form-field>\n\n <mat-form-field>\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>\n <mat-label>Type</mat-label>\n <app-searchable-selector\n apiUrl=\"api/product-types\"\n formControlName=\"type_ids\"\n titleField=\"title\"\n [multiple]=\"true\"\n >\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 [style.width]=\"selection.isEmpty() ? '100%' : '85%'\">\n <mat-card-content class=\"p-0\">\n <table\n mat-table\n [dataSource]=\"models\"\n class=\"w-100\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n (scrolled)=\"onScroll()\"\n [fromRoot]=\"true\"\n matSort\n (matSortChange)=\"sortColumn($event)\"\n matSortDisableClear=\"true\"\n aria-describedby=\"Products List\"\n id=\"productTable\"\n >\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\n *ngIf=\"element?.categories?.length > 0\"\n class=\"d-flex justify-content-start align-items-center gap-1 flex-wrap\"\n >\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 <!-- 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 <!-- Last Stock Receipt Date Column -->\n <ng-container matColumnDef=\"last_stock_receipt_date\">\n <th mat-header-cell *matHeaderCellDef>Last Stock Receipt Date</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.last_stock_receipt?.date | date }}\n </td>\n </ng-container>\n\n <!-- Stock Issuances Column -->\n <ng-container matColumnDef=\"stock_issuances\">\n <th mat-header-cell mat-sort-header=\"stock_issuances_sum_quantity\" *matHeaderCellDef>Stock Issuances</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\">{{ element?.stock_issuances_sum_quantity }}</p>\n <small class=\"text-secondary\" *ngIf=\"element?.last_stock_issuance && !exportInProgress\">\n Latest on {{ element?.last_stock_issuance?.date | date }}\n </small>\n </td>\n </ng-container>\n\n <!-- Last Stock Issue Date Column -->\n <ng-container matColumnDef=\"last_stock_issue_date\">\n <th mat-header-cell *matHeaderCellDef>Last Stock Issue Date</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.last_stock_issuance?.date | date }}\n </td>\n </ng-container>\n\n <!-- On Hand Column -->\n <ng-container matColumnDef=\"on_hand\">\n <th mat-header-cell *matHeaderCellDef>On Hand</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.stock_balance }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"measure\">\n <th mat-header-cell *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-product-form-button [product]=\"element\"></app-product-form-button>\n <mat-icon\n class=\"cursor-pointer\"\n matTooltip=\"View\"\n [routerLink]=\"[element.id, 'view']\"\n routerLinkActive=\"route-link-active\"\n >\n remove_red_eye\n </mat-icon>\n\n <app-stock-receipt-form-button [product]=\"element\" (saved)=\"reload()\"></app-stock-receipt-form-button>\n\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()\"\n [aria-label]=\"checkboxLabel()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\"\n [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\n *ngIf=\"!selection.isEmpty()\"\n style=\"width: calc(15% - 1rem)\"\n >\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>\n" }]
191
+ 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 class=\"mt-2\"></app-product-form-button>\n <span matTooltip=\"Import\" routerLink=\"import\" class=\"cursor-pointer mt-1 material-symbols-outlined\">\n file_upload\n </span>\n <app-export-to-excel-button tableId=\"productTable\" fileName=\"products\" (onExportStart)=\"handleExport(true)\" (onExportEnd)=\"handleExport(false)\"></app-export-to-excel-button>\n <app-column-selector\n mode=\"icon\"\n class=\"mb-2 d-print-none\"\n [columnConfigs]=\"columnConfig\"\n [(selectedColumns)]=\"selectedColumns\"\n ></app-column-selector>\n </div>\n\n <div class=\"d-flex justify-content-start align-items-center gap-2\">\n <mat-form-field>\n <mat-label>Search</mat-label>\n <input matInput placeholder=\"Search products\" formControlName=\"search\" />\n </mat-form-field>\n\n <mat-form-field>\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>\n <mat-label>Type</mat-label>\n <app-searchable-selector\n apiUrl=\"api/product-types\"\n formControlName=\"type_ids\"\n titleField=\"title\"\n [multiple]=\"true\"\n >\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 [style.width]=\"selection.isEmpty() ? '100%' : '85%'\">\n <mat-card-content class=\"p-0\">\n <table\n mat-table\n [dataSource]=\"models\"\n class=\"w-100\"\n infiniteScroll\n [infiniteScrollDistance]=\"2\"\n [infiniteScrollThrottle]=\"50\"\n (scrolled)=\"onScroll()\"\n [fromRoot]=\"true\"\n matSort\n (matSortChange)=\"sortColumn($event)\"\n matSortDisableClear=\"true\"\n aria-describedby=\"Products List\"\n id=\"productTable\"\n >\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\n *ngIf=\"element?.categories?.length > 0\"\n class=\"d-flex justify-content-start align-items-center gap-1 flex-wrap\"\n >\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 <!-- Last Stock Receipt Date Column -->\n <ng-container matColumnDef=\"last_stock_receipt_date\">\n <th mat-header-cell *matHeaderCellDef>Last Stock Receipt Date</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.last_stock_receipt?.date | date }}\n </td>\n </ng-container>\n\n <!-- Stock Issuances Column -->\n <ng-container matColumnDef=\"stock_issuances\">\n <th mat-header-cell mat-sort-header=\"stock_issuances_sum_quantity\" *matHeaderCellDef>Stock Issuances</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\">{{ element?.stock_issuances_sum_quantity }}</p>\n <small class=\"text-secondary\" *ngIf=\"element?.last_stock_issuance && !exportInProgress\">\n Latest on {{ element?.last_stock_issuance?.date | date }}\n </small>\n </td>\n </ng-container>\n\n <!-- Last Stock Issue Date Column -->\n <ng-container matColumnDef=\"last_stock_issue_date\">\n <th mat-header-cell *matHeaderCellDef>Last Stock Issue Date</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.last_stock_issuance?.date | date }}\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_balance }}\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-product-form-button [product]=\"element\"></app-product-form-button>\n <mat-icon\n class=\"cursor-pointer\"\n matTooltip=\"View\"\n [routerLink]=\"[element.id, 'view']\"\n routerLinkActive=\"route-link-active\"\n >\n remove_red_eye\n </mat-icon>\n\n <app-stock-receipt-form-button [product]=\"element\" (saved)=\"reload()\"></app-stock-receipt-form-button>\n\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()\"\n [aria-label]=\"checkboxLabel()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection.isSelected(row)\"\n [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\n *ngIf=\"!selection.isEmpty()\"\n style=\"width: calc(15% - 1rem)\"\n >\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>\n" }]
182
192
  }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.MatDialog }, { type: i3.ActivatedRoute }, { type: i4.ProductService }, { type: i5.RequestHelperService }, { type: i6.ProductFormService }] });
183
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ludmVudG9yeS1jb21tb24vc3JjL2xpYi9pbnZlbnRvcnktY29tbW9uL3Byb2R1Y3QvcHJvZHVjdC1saXN0L3Byb2R1Y3QtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9wcm9kdWN0L3Byb2R1Y3QtbGlzdC9wcm9kdWN0LWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFLbEQsT0FBTyxFQUFzQyxrQ0FBa0MsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTNHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHOUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNbkQsSUFBTSxvQkFBb0IsR0FBMUIsTUFBTSxvQkFBcUIsU0FBUSxrQ0FBa0M7SUFpRGhFO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQXBEVixTQUFTLEdBQUcsSUFBSSxjQUFjLENBQU0sSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRTlDLHFDQUFxQztJQUM3QixtQkFBbUIsR0FBYTtRQUN0QyxHQUFHO1FBQ0gsTUFBTTtRQUNOLE1BQU07UUFDTixLQUFLO1FBQ0wsWUFBWTtRQUNaLGVBQWU7UUFDZixnQkFBZ0I7UUFDaEIseUJBQXlCO1FBQ3pCLGlCQUFpQjtRQUNqQix1QkFBdUI7UUFDdkIsU0FBUztRQUNULFNBQVM7UUFDVCxZQUFZO0tBQ2IsQ0FB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QUM7d0dBNUpVLG9CQUFvQjs0RkFBcEIsb0JBQW9CLCtFQ2pCakMsc3VXQStRQTs7QUQ5UGEsb0JBQW9CO0lBTGhDLFlBQVksRUFBRTtHQUtGLG9CQUFvQixDQTZKaEM7OzRGQTdKWSxvQkFBb0I7a0JBSmhDLFNBQVM7K0JBQ0Usa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IENvbHVtbkNvbmZpZywgUmVxdWVzdEhlbHBlclNlcnZpY2UsIFRlY2hsaWZ5TGlzdGluZ0NvbnRyb2xsZXJJbnRlcmZhY2UgfSBmcm9tICduZ3gtdGVjaGxpZnktY29yZSc7XG5pbXBvcnQgeyBQcm9kdWN0U2VydmljZSB9IGZyb20gJy4uL3Byb2R1Y3Quc2VydmljZSc7XG5pbXBvcnQgeyBVbnRpbERlc3Ryb3kgfSBmcm9tICdAbmduZWF0L3VudGlsLWRlc3Ryb3knO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUHJvZHVjdEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9wcm9kdWN0LWZvcm0vcHJvZHVjdC1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9kdWN0Rm9ybVNlcnZpY2UgfSBmcm9tICcuLi9wcm9kdWN0LWZvcm0uc2VydmljZSc7XG5pbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5AVW50aWxEZXN0cm95KClcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1wcm9kdWN0LWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJvZHVjdC1saXN0LmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgUHJvZHVjdExpc3RDb21wb25lbnQgZXh0ZW5kcyBUZWNobGlmeUxpc3RpbmdDb250cm9sbGVySW50ZXJmYWNlIGltcGxlbWVudHMgT25Jbml0IHtcblxuICBzZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uTW9kZWw8YW55Pih0cnVlLCBbXSk7XG4gIFxuICAvLyBDb2x1bW5zIHRvIHVzZSBkdXJpbmcgRXhjZWwgZXhwb3J0XG4gIHByaXZhdGUgY3VzdG9tRXhwb3J0Q29sdW1uczogc3RyaW5nW10gPSBbXG4gICAgJyMnLFxuICAgICduYW1lJyxcbiAgICAndHlwZScsXG4gICAgJ3NrdScsXG4gICAgJ2NhdGVnb3JpZXMnLFxuICAgICdyZW9yZGVyX3BvaW50JyxcbiAgICAnc3RvY2tfcmVjZWlwdHMnLFxuICAgICdsYXN0X3N0b2NrX3JlY2VpcHRfZGF0ZScsXG4gICAgJ3N0b2NrX2lzc3VhbmNlcycsXG4gICAgJ2xhc3Rfc3RvY2tfaXNzdWVfZGF0ZScsXG4gICAgJ29uX2hhbmQnLFxuICAgICdtZWFzdXJlJyxcbiAgICAnc2FsZV9wcmljZSdcbiAgXTtcblxuICBleHBvcnRJblByb2dyZXNzID0gZmFsc2U7XG5cbiAgY29sdW1uQ29uZmlnOiBDb2x1bW5Db25maWdbXSA9IFtcbiAgICB7IGxhYmVsOiAnSW5pdGlhbCBRdWFudGl0eScsIGRlZjogJ2luaXRpYWxfcXVhbnRpdHknLCBpc1NlbGVjdGVkOiBmYWxzZSwgaXNFZGl0YWJsZTogdHJ1ZSB9LFxuICAgIHsgbGFiZWw6ICdJbmNvbWUgQWNjb3VudCcsIGRlZjogJ2luY29tZV9hY2NvdW50JywgaXNTZWxlY3RlZDogZmFsc2UsIGlzRWRpdGFibGU6IHRydWUgfSxcbiAgICB7IGxhYmVsOiAnRXhwZW5zZSBBY2NvdW50JywgZGVmOiAnZXhwZW5zZV9hY2NvdW50JywgaXNTZWxlY3RlZDogZmFsc2UsIGlzRWRpdGFibGU6IHRydWUgfSxcbiAgICB7IGxhYmVsOiAnQ3JlYXRvcicsIGRlZjogJ2NyZWF0b3InLCBpc1NlbGVjdGVkOiBmYWxzZSwgaXNFZGl0YWJsZTogdHJ1ZSB9LFxuICBdO1xuXG4gIHNlbGVjdGVkQ29sdW1uczogQ29sdW1uQ29uZmlnW10gPSB0aGlzLmNvbHVtbkNvbmZpZy5maWx0ZXIoKGNvbCkgPT4gY29sLmlzU2VsZWN0ZWQpO1xuXG4gIGdldCBkaXNwbGF5ZWRDb2x1bW5zKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAodGhpcy5leHBvcnRJblByb2dyZXNzKSB7XG4gICAgICByZXR1cm4gdGhpcy5jdXN0b21FeHBvcnRDb2x1bW5zO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3RlZENvbHMgPSB0aGlzLnNlbGVjdGVkQ29sdW1ucy5tYXAoY29sID0+IGNvbC5kZWYpO1xuICAgIGNvbnN0IGRlZmF1bHRDb2xzID0gW1xuICAgICAgJyMnLCAnbmFtZScsICdza3UnLCAnY2F0ZWdvcmllcycsICdyZW9yZGVyX3BvaW50JyxcbiAgICAgICdzdG9ja19yZWNlaXB0cycsICdzdG9ja19pc3N1YW5jZXMnLCAnb25faGFuZCcsICdtZWFzdXJlJywgJ3NhbGVfcHJpY2UnXG4gICAgXTtcbiAgICBjb25zdCBjb2xzID0gZGVmYXVsdENvbHMuY29uY2F0KC4uLnNlbGVjdGVkQ29scyk7XG4gICAgY29scy5wdXNoKCdBY3Rpb25zJywgJ1NlbGVjdCcpO1xuICAgIHJldHVybiBjb2xzO1xuICB9XG5cbiAgaW1wb3J0SWQhOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHByb2R1Y3RTZXJ2aWNlOiBQcm9kdWN0U2VydmljZSxcbiAgICBwcml2YXRlIHJlcXVlc3RIZWxwZXJTZXJ2aWNlOiBSZXF1ZXN0SGVscGVyU2VydmljZSxcbiAgICBwcml2YXRlIHByb2R1Y3RGb3JtU2VydmljZTogUHJvZHVjdEZvcm1TZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5maWx0ZXJGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBzZWFyY2g6IFsnJ10sXG4gICAgICBjYXRlZ29yeV9pZHM6IFsnJ10sXG4gICAgICB0eXBlX2lkczogWycnXSxcbiAgICAgIGluY29tZV9hY2NvdW50X2lkczogWycnXSxcbiAgICAgIGV4cGVuc2VfYWNjb3VudF9pZHM6IFsnJ10sXG4gICAgICBzb3J0X2J5OiBbJyddLFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucGFyYW1zPy5bJ2ltcG9ydF9pZCddKSB7XG4gICAgICB0aGlzLmltcG9ydElkID0gcGFyc2VJbnQodGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5wYXJhbXM/LlsnaW1wb3J0X2lkJ10pO1xuICAgIH1cbiAgICAvLyB1cGRhdGUgZm9ybSB3aXRoIFVSTCBxdWVyeSBwYXJhbXNcbiAgICB0aGlzLnJlcXVlc3RIZWxwZXJTZXJ2aWNlLnVwZGF0ZUZvcm1XaXRoUXVlcnlQYXJhbXModGhpcy5maWx0ZXJGb3JtLCB7XG4gICAgICB0eXBlX2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgICAgY2F0ZWdvcnlfaWRzOiB7IG11bHRpcGxlOiB0cnVlIH0sXG4gICAgICBpbmNvbWVfYWNjb3VudF9pZHM6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICAgIGV4cGVuc2VfYWNjb3VudF9pZHM6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICB9KTtcbiAgICAvLyBVcGRhdGUgVVJMIHF1ZXJ5IHBhcmFtcyBvbiBmaWx0ZXIgY2hhbmdlXG4gICAgdGhpcy5maWx0ZXJGb3JtLnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZSg4MDApKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5yZXF1ZXN0SGVscGVyU2VydmljZS51cGRhdGVRdWVyeVBhcmFtcyhcbiAgICAgICAgdGhpcy5yZXF1ZXN0SGVscGVyU2VydmljZS5jb252ZXJ0VG9Gb3JtRGF0YSh7XG4gICAgICAgICAgLi4udGhpcy5maWx0ZXJGb3JtLnZhbHVlLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcbiAgICAvLyBmZXRjaCB0YXNrIG9uIHBhcmFtcyBjaGFuZ2VcbiAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnF1ZXJ5UGFyYW1zLnBpcGUoZGVib3VuY2VUaW1lKDgwMCkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlbG9hZCgpKTtcbiAgICAvLyBsaXN0ZW4gZm9ybSBwcm9kdWN0IGFkZCBvciB1cGRhdGUgZXZlbnQgYW5kIHJlbG9hZC5cbiAgICB0aGlzLnByb2R1Y3RGb3JtU2VydmljZS5pc0xpc3RVcGRhdGVkKCkuc3Vic2NyaWJlKCh2YWw6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmICh2YWwgJiYgIXRoaXMuaXNXb3JraW5nKSB7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBsb2FkRGF0YSgpIHtcbiAgICBsZXQgcGFyYW1zOiBhbnkgPSB7XG4gICAgICAuLi50aGlzLnJlcXVlc3RIZWxwZXJTZXJ2aWNlLmNvbnZlcnRUb0Zvcm1EYXRhKHRoaXMuZmlsdGVyRm9ybS52YWx1ZSksXG4gICAgfTtcbiAgICBwYXJhbXMucGFnZSA9IHRoaXMucGFnZTtcbiAgICBwYXJhbXMucGVyUGFnZSA9IHRoaXMucGVyUGFnZTtcbiAgICBwYXJhbXMud2l0aCA9ICdjYXRlZ29yaWVzLGxhc3RTdG9ja1JlY2VpcHQsbGFzdFN0b2NrSXNzdWFuY2UsbWVhc3VyZSxjcmVhdG9yJztcbiAgICBpZiAodGhpcy5pbXBvcnRJZCkge1xuICAgICAgcGFyYW1zLmltcG9ydF9pZCA9IHRoaXMuaW1wb3J0SWQ7XG4gICAgfVxuICAgIHRoaXMuaXNXb3JraW5nID0gdHJ1ZTtcblxuICAgIHRoaXMucHJvZHVjdFNlcnZpY2UuaW5kZXgocGFyYW1zKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuaXNXb3JraW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMubW9kZWxzID0gdGhpcy5tb2RlbHMuY29uY2F0KHJlcz8uZGF0YSk7XG4gICAgICAgIHRoaXMubGFzdFBhZ2UgPSByZXM/Lmxhc3RfcGFnZTtcbiAgICAgICAgLy8gc3RvcCByZWxvYWRpbmcgZGF0YSBvbmNlIGRhdGEgbG9hZGVkLlxuICAgICAgICB0aGlzLnByb2R1Y3RGb3JtU2VydmljZS5saXN0VXBkYXRlZChmYWxzZSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+ICh0aGlzLmlzV29ya2luZyA9IGZhbHNlKSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzc2lnbkZpbHRlcihjb2x1bW46IGFueSwgZGlyZWN0aW9uOiBzdHJpbmcpIHtcbiAgICBpZiAoY29sdW1uKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXJGb3JtLmdldCgnc29ydF9ieScpPy5zZXRWYWx1ZShjb2x1bW4gKyAnfCcgKyBkaXJlY3Rpb24pO1xuICAgIH1cbiAgfVxuXG4gIHNvcnRDb2x1bW4oZXZlbnQ6IGFueSkge1xuICAgIHZhciBkaXJlY3Rpb24gPSBldmVudC5kaXJlY3Rpb24udG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpO1xuICAgIHRoaXMuYXNzaWduRmlsdGVyKGV2ZW50LmFjdGl2ZSwgZGlyZWN0aW9uKTtcbiAgfVxuXG4gIGlzQWxsUm93c1NlbGVjdGVkKCkge1xuICAgIGNvbnN0IG51bVNlbGVjdGVkID0gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoO1xuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLm1vZGVscy5sZW5ndGg7XG4gICAgcmV0dXJuIG51bVNlbGVjdGVkID09PSBudW1Sb3dzO1xuICB9XG5cbiAgLyoqIFNlbGVjdHMgYWxsIHJvd3MgaWYgdGhleSBhcmUgbm90IGFsbCBzZWxlY3RlZDsgb3RoZXJ3aXNlIGNsZWFyIHNlbGVjdGlvbi4gKi9cbiAgdG9nZ2xlQWxsUm93cygpIHtcbiAgICBpZiAodGhpcy5pc0FsbFJvd3NTZWxlY3RlZCgpKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdCguLi50aGlzLm1vZGVscyk7XG4gIH1cblxuICBjaGVja2JveExhYmVsKHJvdz86IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCFyb3cpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmlzQWxsUm93c1NlbGVjdGVkKCkgPyAnZGVzZWxlY3QnIDogJ3NlbGVjdCd9IGFsbGA7XG4gICAgfVxuICAgIHJldHVybiBgJHt0aGlzLnNlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdykgPyAnZGVzZWxlY3QnIDogJ3NlbGVjdCd9IHJvdyAke3Jvdy5wb3NpdGlvbiArIDF9YDtcbiAgfVxuXG4gIGhhbmRsZUV4cG9ydChoaWRlQ29sdW1uczogYm9vbGVhbikge1xuICAgIHRoaXMuZXhwb3J0SW5Qcm9ncmVzcyA9IGhpZGVDb2x1bW5zO1xuICB9XG59XG4iLCI8bWF0LWNhcmQgY2xhc3M9XCJtYi0zXCI+XG4gIDxtYXQtY2FyZC1jb250ZW50PlxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZmlsdGVyRm9ybVwiIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICA8aDMgY2xhc3M9XCJtYi0wXCI+UHJvZHVjdHM8L2gzPlxuICAgICAgICA8YXBwLXByb2R1Y3QtZm9ybS1idXR0b24gY2xhc3M9XCJtdC0yXCI+PC9hcHAtcHJvZHVjdC1mb3JtLWJ1dHRvbj5cbiAgICAgICAgPHNwYW4gbWF0VG9vbHRpcD1cIkltcG9ydFwiIHJvdXRlckxpbms9XCJpbXBvcnRcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyIG10LTEgbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPlxuICAgICAgICAgIGZpbGVfdXBsb2FkXG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGFwcC1leHBvcnQtdG8tZXhjZWwtYnV0dG9uIHRhYmxlSWQ9XCJwcm9kdWN0VGFibGVcIiBmaWxlTmFtZT1cInByb2R1Y3RzXCIgKG9uRXhwb3J0U3RhcnQpPVwiaGFuZGxlRXhwb3J0KHRydWUpXCIgKG9uRXhwb3J0RW5kKT1cImhhbmRsZUV4cG9ydChmYWxzZSlcIj48L2FwcC1leHBvcnQtdG8tZXhjZWwtYnV0dG9uPlxuICAgICAgICA8YXBwLWNvbHVtbi1zZWxlY3RvclxuICAgICAgICAgIG1vZGU9XCJpY29uXCJcbiAgICAgICAgICBjbGFzcz1cIm1iLTIgZC1wcmludC1ub25lXCJcbiAgICAgICAgICBbY29sdW1uQ29uZmlnc109XCJjb2x1bW5Db25maWdcIlxuICAgICAgICAgIFsoc2VsZWN0ZWRDb2x1bW5zKV09XCJzZWxlY3RlZENvbHVtbnNcIlxuICAgICAgICA+PC9hcHAtY29sdW1uLXNlbGVjdG9yPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPG1hdC1sYWJlbD5TZWFyY2g8L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJTZWFyY2ggcHJvZHVjdHNcIiBmb3JtQ29udHJvbE5hbWU9XCJzZWFyY2hcIiAvPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8bWF0LWxhYmVsPkNhdGVnb3J5PC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yIGFwaVVybD1cImFwaS9wcm9kdWN0LWNhdGVnb3JpZXNcIiBmb3JtQ29udHJvbE5hbWU9XCJjYXRlZ29yeV9pZHNcIiBbbXVsdGlwbGVdPVwidHJ1ZVwiPlxuICAgICAgICAgIDwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxtYXQtbGFiZWw+VHlwZTwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvclxuICAgICAgICAgICAgYXBpVXJsPVwiYXBpL3Byb2R1Y3QtdHlwZXNcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidHlwZV9pZHNcIlxuICAgICAgICAgICAgdGl0bGVGaWVsZD1cInRpdGxlXCJcbiAgICAgICAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT5cbiAgPC9tYXQtY2FyZC1jb250ZW50PlxuPC9tYXQtY2FyZD5cblxuPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtc3RhcnQgZ2FwLTNcIj5cbiAgPG1hdC1jYXJkIFtzdHlsZS53aWR0aF09XCJzZWxlY3Rpb24uaXNFbXB0eSgpID8gJzEwMCUnIDogJzg1JSdcIj5cbiAgICA8bWF0LWNhcmQtY29udGVudCBjbGFzcz1cInAtMFwiPlxuICAgICAgPHRhYmxlXG4gICAgICAgIG1hdC10YWJsZVxuICAgICAgICBbZGF0YVNvdXJjZV09XCJtb2RlbHNcIlxuICAgICAgICBjbGFzcz1cInctMTAwXCJcbiAgICAgICAgaW5maW5pdGVTY3JvbGxcbiAgICAgICAgW2luZmluaXRlU2Nyb2xsRGlzdGFuY2VdPVwiMlwiXG4gICAgICAgIFtpbmZpbml0ZVNjcm9sbFRocm90dGxlXT1cIjUwXCJcbiAgICAgICAgKHNjcm9sbGVkKT1cIm9uU2Nyb2xsKClcIlxuICAgICAgICBbZnJvbVJvb3RdPVwidHJ1ZVwiXG4gICAgICAgIG1hdFNvcnRcbiAgICAgICAgKG1hdFNvcnRDaGFuZ2UpPVwic29ydENvbHVtbigkZXZlbnQpXCJcbiAgICAgICAgbWF0U29ydERpc2FibGVDbGVhcj1cInRydWVcIlxuICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiUHJvZHVjdHMgTGlzdFwiXG4gICAgICAgIGlkPVwicHJvZHVjdFRhYmxlXCJcbiAgICAgID5cbiAgICAgICAgPCEtLSAjIENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCIjXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4jPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudDsgbGV0IGkgPSBpbmRleFwiPnt7IGkgKyAxIH19PC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBOYW1lIENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJuYW1lXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCBtYXQtc29ydC1oZWFkZXIgKm1hdEhlYWRlckNlbGxEZWY+TmFtZTwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTFcIj5cbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJ0ZXh0LWRlY29yYXRpb24tbm9uZSB0ZXh0LWRhcmtcIiBbcm91dGVyTGlua109XCJbZWxlbWVudD8uaWQsICd2aWV3J11cIj57eyBlbGVtZW50Lm5hbWUgfX08L2E+XG4gICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtc2Vjb25kYXJ5XCIgKm5nSWY9XCJlbGVtZW50LnR5cGUgJiYgIWV4cG9ydEluUHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgICB7eyBlbGVtZW50LnR5cGU/LnRpdGxlIH19XG4gICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFR5cGUgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInR5cGVcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsIG1hdC1zb3J0LWhlYWRlciAqbWF0SGVhZGVyQ2VsbERlZj5UeXBlPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAge3sgZWxlbWVudD8udHlwZT8udGl0bGUgfX1cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIENhdGVnb3JpZXMgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImNhdGVnb3JpZXNcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPkNhdGVnb3JpZXM8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgc3R5bGU9XCJtYXgtd2lkdGg6IDIwMHB4XCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwiZWxlbWVudD8uY2F0ZWdvcmllcz8ubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1zdGFydCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTEgZmxleC13cmFwXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiZy1zZWNvbmRhcnlcIiAqbmdGb3I9XCJsZXQgY2F0ZWdvcnkgb2YgZWxlbWVudD8uY2F0ZWdvcmllc1wiPlxuICAgICAgICAgICAgICAgIHt7IGNhdGVnb3J5Py50aXRsZSB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFNLVSBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2t1XCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCBtYXQtc29ydC1oZWFkZXIgKm1hdEhlYWRlckNlbGxEZWY+U0tVPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7IGVsZW1lbnQuc2t1IH19PC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBJbml0aWFsIFF1YW50aXR5IENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJpbml0aWFsX3F1YW50aXR5XCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCBtYXQtc29ydC1oZWFkZXIgKm1hdEhlYWRlckNlbGxEZWY+SW5pdGlhbCBRdWFudGl0eTwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMFwiPnt7IGVsZW1lbnQuaW5pdGlhbF9xdWFudGl0eSB9fTwvcD5cbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtc2Vjb25kYXJ5XCIgKm5nSWY9XCJlbGVtZW50Py5pbml0aWFsX3F1YW50aXR5X2RhdGVcIj5cbiAgICAgICAgICAgICAgb24ge3sgZWxlbWVudD8uaW5pdGlhbF9xdWFudGl0eV9kYXRlIHwgZGF0ZSB9fVxuICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFN0b2NrIFJlY2VpcHRzIENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzdG9ja19yZWNlaXB0c1wiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgbWF0LXNvcnQtaGVhZGVyPVwic3RvY2tfcmVjZWlwdHNfc3VtX3F1YW50aXR5XCIgKm1hdEhlYWRlckNlbGxEZWY+U3RvY2sgUmVjZWlwdHM8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTBcIj57eyBlbGVtZW50Py5zdG9ja19yZWNlaXB0c19zdW1fcXVhbnRpdHkgfX08L3A+XG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeVwiICpuZ0lmPVwiZWxlbWVudD8ubGFzdF9zdG9ja19yZWNlaXB0ICYmICFleHBvcnRJblByb2dyZXNzXCI+XG4gICAgICAgICAgICAgIExhdGVzdCBvbiB7eyBlbGVtZW50Py5sYXN0X3N0b2NrX3JlY2VpcHQ/LmRhdGUgfCBkYXRlIH19XG4gICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gTGFzdCBTdG9jayBSZWNlaXB0IERhdGUgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImxhc3Rfc3RvY2tfcmVjZWlwdF9kYXRlXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5MYXN0IFN0b2NrIFJlY2VpcHQgRGF0ZTwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgIHt7IGVsZW1lbnQ/Lmxhc3Rfc3RvY2tfcmVjZWlwdD8uZGF0ZSB8IGRhdGUgfX1cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFN0b2NrIElzc3VhbmNlcyBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic3RvY2tfaXNzdWFuY2VzXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCBtYXQtc29ydC1oZWFkZXI9XCJzdG9ja19pc3N1YW5jZXNfc3VtX3F1YW50aXR5XCIgKm1hdEhlYWRlckNlbGxEZWY+U3RvY2sgSXNzdWFuY2VzPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wXCI+e3sgZWxlbWVudD8uc3RvY2tfaXNzdWFuY2VzX3N1bV9xdWFudGl0eSB9fTwvcD5cbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtc2Vjb25kYXJ5XCIgKm5nSWY9XCJlbGVtZW50Py5sYXN0X3N0b2NrX2lzc3VhbmNlICYmICFleHBvcnRJblByb2dyZXNzXCI+XG4gICAgICAgICAgICAgIExhdGVzdCBvbiB7eyBlbGVtZW50Py5sYXN0X3N0b2NrX2lzc3VhbmNlPy5kYXRlIHwgZGF0ZSB9fVxuICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIExhc3QgU3RvY2sgSXNzdWUgRGF0ZSBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibGFzdF9zdG9ja19pc3N1ZV9kYXRlXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5MYXN0IFN0b2NrIElzc3VlIERhdGU8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICB7eyBlbGVtZW50Py5sYXN0X3N0b2NrX2lzc3VhbmNlPy5kYXRlIHwgZGF0ZSB9fVxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gT24gSGFuZCBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwib25faGFuZFwiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+T24gSGFuZDwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgIHt7IGVsZW1lbnQ/LnN0b2NrX2JhbGFuY2UgfX1cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIm1lYXN1cmVcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPk1lYXN1cmU8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICB7eyBlbGVtZW50Py5tZWFzdXJlPy50aXRsZSB9fVxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gUmVvcmRlciBQb2ludCBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwicmVvcmRlcl9wb2ludFwiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgbWF0LXNvcnQtaGVhZGVyICptYXRIZWFkZXJDZWxsRGVmPlJlb3JkZXIgUG9pbnQ8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICB7eyBlbGVtZW50LnJlb3JkZXJfcG9pbnQgfX1cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFNlbGxpbmcgUHJpY2UgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInNhbGVfcHJpY2VcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsIG1hdC1zb3J0LWhlYWRlciAqbWF0SGVhZGVyQ2VsbERlZj5TZWxsaW5nIFByaWNlPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAge3sgZWxlbWVudC5zYWxlX3ByaWNlIHwgY3VycmVuY3kgfX1cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIEluY29tZSBBY2NvdW50IENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJpbmNvbWVfYWNjb3VudFwiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+SW5jb21lIEFjY291bnQ8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICB7eyBlbGVtZW50Py5pbmNvbWVfYWNjb3VudD8udGl0bGUgfX1cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIEV4cGVuc2UgQWNjb3VudCBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZXhwZW5zZV9hY2NvdW50XCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5FeHBlbnNlIEFjY291bnQ8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICB7eyBlbGVtZW50Py5leHBlbnNlX2FjY291bnQ/LnRpdGxlIH19XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBDcmVhdG9yIENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJjcmVhdG9yXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5DcmVhdG9yPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wXCI+e3sgZWxlbWVudD8uY3JlYXRvcj8ubmFtZSB9fTwvcD5cbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtc2Vjb25kYXJ5XCI+e3sgZWxlbWVudD8uY3JlYXRlZF9hdCB8IGRhdGUgfX08L3NtYWxsPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gQWN0aW9ucyBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiQWN0aW9uc1wiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+QWN0aW9uczwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeSBkLWZsZXggZ2FwLTFcIj5cbiAgICAgICAgICAgICAgPGFwcC1wcm9kdWN0LWZvcm0tYnV0dG9uIFtwcm9kdWN0XT1cImVsZW1lbnRcIj48L2FwcC1wcm9kdWN0LWZvcm0tYnV0dG9uPlxuICAgICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiVmlld1wiXG4gICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiW2VsZW1lbnQuaWQsICd2aWV3J11cIlxuICAgICAgICAgICAgICAgIHJvdXRlckxpbmtBY3RpdmU9XCJyb3V0ZS1saW5rLWFjdGl2ZVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICByZW1vdmVfcmVkX2V5ZVxuICAgICAgICAgICAgICA8L21hdC1pY29uPlxuXG4gICAgICAgICAgICAgIDxhcHAtc3RvY2stcmVjZWlwdC1mb3JtLWJ1dHRvbiBbcHJvZHVjdF09XCJlbGVtZW50XCIgKHNhdmVkKT1cInJlbG9hZCgpXCI+PC9hcHAtc3RvY2stcmVjZWlwdC1mb3JtLWJ1dHRvbj5cblxuICAgICAgICAgICAgICA8YXBwLXN0b2NrLWlzc3VlLWZvcm0tYnV0dG9uIFtwcm9kdWN0XT1cImVsZW1lbnRcIiAoc2F2ZWQpPVwicmVsb2FkKClcIj48L2FwcC1zdG9jay1pc3N1ZS1mb3JtLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiU2VsZWN0XCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggKGNoYW5nZSk9XCIkZXZlbnQgPyB0b2dnbGVBbGxSb3dzKCkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgaXNBbGxSb3dzU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmICFpc0FsbFJvd3NTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2FyaWEtbGFiZWxdPVwiY2hlY2tib3hMYWJlbCgpXCI+XG4gICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cbiAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gc2VsZWN0aW9uLnRvZ2dsZShyb3cpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXJpYS1sYWJlbF09XCJjaGVja2JveExhYmVsKHJvdylcIj5cbiAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkIG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZj48L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zOyBzdGlja3k6IHRydWVcIj48L3RyPlxuICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1uc1wiPjwvdHI+XG4gICAgICA8L3RhYmxlPlxuXG4gICAgICA8bWF0LXByb2dyZXNzLWJhciBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiICpuZ0lmPVwiaXNXb3JraW5nXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxuICAgIDwvbWF0LWNhcmQtY29udGVudD5cbiAgPC9tYXQtY2FyZD5cbiAgPG1hdC1jYXJkXG4gICAgKm5nSWY9XCIhc2VsZWN0aW9uLmlzRW1wdHkoKVwiXG4gICAgc3R5bGU9XCJ3aWR0aDogY2FsYygxNSUgLSAxcmVtKVwiXG4gID5cbiAgICA8bWF0LWNhcmQtY29udGVudD5cbiAgICAgIDxhcHAtcHJvZHVjdC1iYXRjaC11cGRhdGUtZm9ybSBbc2VsZWN0aW9uXT1cInNlbGVjdGlvblwiICh1cGRhdGVkKT1cInJlbG9hZCgpXCI+PC9hcHAtcHJvZHVjdC1iYXRjaC11cGRhdGUtZm9ybT5cbiAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gIDwvbWF0LWNhcmQ+XG48L2Rpdj5cbiJdfQ==
193
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ludmVudG9yeS1jb21tb24vc3JjL2xpYi9pbnZlbnRvcnktY29tbW9uL3Byb2R1Y3QvcHJvZHVjdC1saXN0L3Byb2R1Y3QtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9wcm9kdWN0L3Byb2R1Y3QtbGlzdC9wcm9kdWN0LWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFLbEQsT0FBTyxFQUFzQyxrQ0FBa0MsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTNHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHOUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNbkQsSUFBTSxvQkFBb0IsR0FBMUIsTUFBTSxvQkFBcUIsU0FBUSxrQ0FBa0M7SUEwRGhFO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQTdEVixTQUFTLEdBQUcsSUFBSSxjQUFjLENBQU0sSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRTlDLHFDQUFxQztJQUM3QixtQkFBbUIsR0FBYTtRQUN0QyxHQUFHO1FBQ0gsTUFBTTtRQUNOLE1BQU07UUFDTixLQUFLO1FBQ0wsWUFBWTtRQUNaLGVBQWU7UUFDZixnQkFBZ0I7UUFDaEIseUJBQXlCO1FBQ3pCLGlCQUFpQjtRQUNqQix1QkFBdUI7UUFDdkIsU0FBUztRQUNULFNBQVM7UUFDVCxZQUFZO0tBQ2IsQ0FB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LElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxXQUFXLENBQUM7SUFDdEMsQ0FBQzt3R0F0S1Usb0JBQW9COzRGQUFwQixvQkFBb0IsK0VDakJqQyxtaFhBb1JBOztBRG5RYSxvQkFBb0I7SUFMaEMsWUFBWSxFQUFFO0dBS0Ysb0JBQW9CLENBdUtoQzs7NEZBdktZLG9CQUFvQjtrQkFKaEMsU0FBUzsrQkFDRSxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQ29sdW1uQ29uZmlnLCBSZXF1ZXN0SGVscGVyU2VydmljZSwgVGVjaGxpZnlMaXN0aW5nQ29udHJvbGxlckludGVyZmFjZSB9IGZyb20gJ25neC10ZWNobGlmeS1jb3JlJztcbmltcG9ydCB7IFByb2R1Y3RTZXJ2aWNlIH0gZnJvbSAnLi4vcHJvZHVjdC5zZXJ2aWNlJztcbmltcG9ydCB7IFVudGlsRGVzdHJveSB9IGZyb20gJ0BuZ25lYXQvdW50aWwtZGVzdHJveSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBQcm9kdWN0Rm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL3Byb2R1Y3QtZm9ybS9wcm9kdWN0LWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IFByb2R1Y3RGb3JtU2VydmljZSB9IGZyb20gJy4uL3Byb2R1Y3QtZm9ybS5zZXJ2aWNlJztcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbkBVbnRpbERlc3Ryb3koKVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXByb2R1Y3QtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9kdWN0LWxpc3QuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBQcm9kdWN0TGlzdENvbXBvbmVudCBleHRlbmRzIFRlY2hsaWZ5TGlzdGluZ0NvbnRyb2xsZXJJbnRlcmZhY2UgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxhbnk+KHRydWUsIFtdKTtcblxuICAvLyBDb2x1bW5zIHRvIHVzZSBkdXJpbmcgRXhjZWwgZXhwb3J0XG4gIHByaXZhdGUgY3VzdG9tRXhwb3J0Q29sdW1uczogc3RyaW5nW10gPSBbXG4gICAgJyMnLFxuICAgICduYW1lJyxcbiAgICAndHlwZScsXG4gICAgJ3NrdScsXG4gICAgJ2NhdGVnb3JpZXMnLFxuICAgICdyZW9yZGVyX3BvaW50JyxcbiAgICAnc3RvY2tfcmVjZWlwdHMnLFxuICAgICdsYXN0X3N0b2NrX3JlY2VpcHRfZGF0ZScsXG4gICAgJ3N0b2NrX2lzc3VhbmNlcycsXG4gICAgJ2xhc3Rfc3RvY2tfaXNzdWVfZGF0ZScsXG4gICAgJ29uX2hhbmQnLFxuICAgICdtZWFzdXJlJyxcbiAgICAnc2FsZV9wcmljZSdcbiAgXTtcblxuICBleHBvcnRJblByb2dyZXNzID0gZmFsc2U7XG5cbiAgY29sdW1uQ29uZmlnOiBDb2x1bW5Db25maWdbXSA9IFtcbiAgICB7IGxhYmVsOiAnSW5pdGlhbCBRdWFudGl0eScsIGRlZjogJ2luaXRpYWxfcXVhbnRpdHknLCBpc1NlbGVjdGVkOiBmYWxzZSwgaXNFZGl0YWJsZTogdHJ1ZSB9LFxuICAgIHsgbGFiZWw6ICdJbmNvbWUgQWNjb3VudCcsIGRlZjogJ2luY29tZV9hY2NvdW50JywgaXNTZWxlY3RlZDogZmFsc2UsIGlzRWRpdGFibGU6IHRydWUgfSxcbiAgICB7IGxhYmVsOiAnRXhwZW5zZSBBY2NvdW50JywgZGVmOiAnZXhwZW5zZV9hY2NvdW50JywgaXNTZWxlY3RlZDogZmFsc2UsIGlzRWRpdGFibGU6IHRydWUgfSxcbiAgICB7IGxhYmVsOiAnQ3JlYXRvcicsIGRlZjogJ2NyZWF0b3InLCBpc1NlbGVjdGVkOiBmYWxzZSwgaXNFZGl0YWJsZTogdHJ1ZSB9LFxuICBdO1xuXG4gIHNlbGVjdGVkQ29sdW1uczogQ29sdW1uQ29uZmlnW10gPSB0aGlzLmNvbHVtbkNvbmZpZy5maWx0ZXIoKGNvbCkgPT4gY29sLmlzU2VsZWN0ZWQpO1xuXG4gIGdldCBkaXNwbGF5ZWRDb2x1bW5zKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAodGhpcy5leHBvcnRJblByb2dyZXNzKSB7XG4gICAgICByZXR1cm4gdGhpcy5jdXN0b21FeHBvcnRDb2x1bW5zO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3RlZENvbHMgPSB0aGlzLnNlbGVjdGVkQ29sdW1ucy5tYXAoY29sID0+IGNvbC5kZWYpO1xuICAgIGNvbnN0IGRlZmF1bHRDb2xzID0gW1xuICAgICAgJyMnLFxuICAgICAgJ25hbWUnLCBcbiAgICAgICdza3UnLCBcbiAgICAgICdjYXRlZ29yaWVzJywgXG4gICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgJ3Jlb3JkZXJfcG9pbnQnLFxuICAgICAgJ3N0b2NrX3JlY2VpcHRzJywgXG4gICAgICAnc3RvY2tfaXNzdWFuY2VzJywgXG4gICAgICAnb25faGFuZCcsIFxuICAgICAgJ21lYXN1cmUnLCBcbiAgICAgICdzYWxlX3ByaWNlJ1xuICAgIF07XG4gICAgY29uc3QgY29scyA9IGRlZmF1bHRDb2xzLmNvbmNhdCguLi5zZWxlY3RlZENvbHMpO1xuICAgIGNvbHMucHVzaCgnQWN0aW9ucycsICdTZWxlY3QnKTtcbiAgICByZXR1cm4gY29scztcbiAgfVxuXG4gIGltcG9ydElkITogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSBwcm9kdWN0U2VydmljZTogUHJvZHVjdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZXF1ZXN0SGVscGVyU2VydmljZTogUmVxdWVzdEhlbHBlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwcm9kdWN0Rm9ybVNlcnZpY2U6IFByb2R1Y3RGb3JtU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZmlsdGVyRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgY2F0ZWdvcnlfaWRzOiBbJyddLFxuICAgICAgZXhwZW5zZV9hY2NvdW50X2lkczogWycnXSxcbiAgICAgIGluY29tZV9hY2NvdW50X2lkczogWycnXSxcbiAgICAgIG1lYXN1cmVfaWRzOiBbJyddLFxuICAgICAgc2VhcmNoOiBbJyddLFxuICAgICAgc29ydF9ieTogWycnXSxcbiAgICAgIHR5cGVfaWRzOiBbJyddLFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucGFyYW1zPy5bJ2ltcG9ydF9pZCddKSB7XG4gICAgICB0aGlzLmltcG9ydElkID0gcGFyc2VJbnQodGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5wYXJhbXM/LlsnaW1wb3J0X2lkJ10pO1xuICAgIH1cbiAgICAvLyB1cGRhdGUgZm9ybSB3aXRoIFVSTCBxdWVyeSBwYXJhbXNcbiAgICB0aGlzLnJlcXVlc3RIZWxwZXJTZXJ2aWNlLnVwZGF0ZUZvcm1XaXRoUXVlcnlQYXJhbXModGhpcy5maWx0ZXJGb3JtLCB7XG4gICAgICB0eXBlX2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgICAgY2F0ZWdvcnlfaWRzOiB7IG11bHRpcGxlOiB0cnVlIH0sXG4gICAgICBpbmNvbWVfYWNjb3VudF9pZHM6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICAgIGV4cGVuc2VfYWNjb3VudF9pZHM6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICB9KTtcbiAgICAvLyBVcGRhdGUgVVJMIHF1ZXJ5IHBhcmFtcyBvbiBmaWx0ZXIgY2hhbmdlXG4gICAgdGhpcy5maWx0ZXJGb3JtLnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZSg4MDApKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5yZXF1ZXN0SGVscGVyU2VydmljZS51cGRhdGVRdWVyeVBhcmFtcyhcbiAgICAgICAgdGhpcy5yZXF1ZXN0SGVscGVyU2VydmljZS5jb252ZXJ0VG9Gb3JtRGF0YSh7XG4gICAgICAgICAgLi4udGhpcy5maWx0ZXJGb3JtLnZhbHVlLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcbiAgICAvLyBmZXRjaCB0YXNrIG9uIHBhcmFtcyBjaGFuZ2VcbiAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnF1ZXJ5UGFyYW1zLnBpcGUoZGVib3VuY2VUaW1lKDgwMCkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlbG9hZCgpKTtcbiAgICAvLyBsaXN0ZW4gZm9ybSBwcm9kdWN0IGFkZCBvciB1cGRhdGUgZXZlbnQgYW5kIHJlbG9hZC5cbiAgICB0aGlzLnByb2R1Y3RGb3JtU2VydmljZS5pc0xpc3RVcGRhdGVkKCkuc3Vic2NyaWJlKCh2YWw6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmICh2YWwgJiYgIXRoaXMuaXNXb3JraW5nKSB7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBsb2FkRGF0YSgpIHtcbiAgICBsZXQgcGFyYW1zOiBhbnkgPSB7XG4gICAgICAuLi50aGlzLnJlcXVlc3RIZWxwZXJTZXJ2aWNlLmNvbnZlcnRUb0Zvcm1EYXRhKHRoaXMuZmlsdGVyRm9ybS52YWx1ZSksXG4gICAgfTtcbiAgICBwYXJhbXMucGFnZSA9IHRoaXMucGFnZTtcbiAgICBwYXJhbXMucGVyUGFnZSA9IHRoaXMucGVyUGFnZTtcbiAgICBwYXJhbXMud2l0aCA9ICdjYXRlZ29yaWVzLGxhc3RTdG9ja1JlY2VpcHQsbGFzdFN0b2NrSXNzdWFuY2UsbWVhc3VyZSxjcmVhdG9yJztcbiAgICBpZiAodGhpcy5pbXBvcnRJZCkge1xuICAgICAgcGFyYW1zLmltcG9ydF9pZCA9IHRoaXMuaW1wb3J0SWQ7XG4gICAgfVxuICAgIHRoaXMuaXNXb3JraW5nID0gdHJ1ZTtcblxuICAgIHRoaXMucHJvZHVjdFNlcnZpY2UuaW5kZXgocGFyYW1zKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuaXNXb3JraW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMubW9kZWxzID0gdGhpcy5tb2RlbHMuY29uY2F0KHJlcz8uZGF0YSk7XG4gICAgICAgIHRoaXMubGFzdFBhZ2UgPSByZXM/Lmxhc3RfcGFnZTtcbiAgICAgICAgLy8gc3RvcCByZWxvYWRpbmcgZGF0YSBvbmNlIGRhdGEgbG9hZGVkLlxuICAgICAgICB0aGlzLnByb2R1Y3RGb3JtU2VydmljZS5saXN0VXBkYXRlZChmYWxzZSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+ICh0aGlzLmlzV29ya2luZyA9IGZhbHNlKSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzc2lnbkZpbHRlcihjb2x1bW46IGFueSwgZGlyZWN0aW9uOiBzdHJpbmcpIHtcbiAgICBpZiAoY29sdW1uKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXJGb3JtLmdldCgnc29ydF9ieScpPy5zZXRWYWx1ZShjb2x1bW4gKyAnfCcgKyBkaXJlY3Rpb24pO1xuICAgIH1cbiAgfVxuXG4gIHNvcnRDb2x1bW4oZXZlbnQ6IGFueSkge1xuICAgIHZhciBkaXJlY3Rpb24gPSBldmVudC5kaXJlY3Rpb24udG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpO1xuICAgIHRoaXMuYXNzaWduRmlsdGVyKGV2ZW50LmFjdGl2ZSwgZGlyZWN0aW9uKTtcbiAgfVxuXG4gIGlzQWxsUm93c1NlbGVjdGVkKCkge1xuICAgIGNvbnN0IG51bVNlbGVjdGVkID0gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoO1xuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLm1vZGVscy5sZW5ndGg7XG4gICAgcmV0dXJuIG51bVNlbGVjdGVkID09PSBudW1Sb3dzO1xuICB9XG5cbiAgLyoqIFNlbGVjdHMgYWxsIHJvd3MgaWYgdGhleSBhcmUgbm90IGFsbCBzZWxlY3RlZDsgb3RoZXJ3aXNlIGNsZWFyIHNlbGVjdGlvbi4gKi9cbiAgdG9nZ2xlQWxsUm93cygpIHtcbiAgICBpZiAodGhpcy5pc0FsbFJvd3NTZWxlY3RlZCgpKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdCguLi50aGlzLm1vZGVscyk7XG4gIH1cblxuICBjaGVja2JveExhYmVsKHJvdz86IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCFyb3cpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmlzQWxsUm93c1NlbGVjdGVkKCkgPyAnZGVzZWxlY3QnIDogJ3NlbGVjdCd9IGFsbGA7XG4gICAgfVxuICAgIHJldHVybiBgJHt0aGlzLnNlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdykgPyAnZGVzZWxlY3QnIDogJ3NlbGVjdCd9IHJvdyAke3Jvdy5wb3NpdGlvbiArIDF9YDtcbiAgfVxuXG4gIGhhbmRsZUV4cG9ydChoaWRlQ29sdW1uczogYm9vbGVhbikge1xuICAgIHRoaXMuZXhwb3J0SW5Qcm9ncmVzcyA9IGhpZGVDb2x1bW5zO1xuICB9XG59XG4iLCI8bWF0LWNhcmQgY2xhc3M9XCJtYi0zXCI+XG4gIDxtYXQtY2FyZC1jb250ZW50PlxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZmlsdGVyRm9ybVwiIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICA8aDMgY2xhc3M9XCJtYi0wXCI+UHJvZHVjdHM8L2gzPlxuICAgICAgICA8YXBwLXByb2R1Y3QtZm9ybS1idXR0b24gY2xhc3M9XCJtdC0yXCI+PC9hcHAtcHJvZHVjdC1mb3JtLWJ1dHRvbj5cbiAgICAgICAgPHNwYW4gbWF0VG9vbHRpcD1cIkltcG9ydFwiIHJvdXRlckxpbms9XCJpbXBvcnRcIiBjbGFzcz1cImN1cnNvci1wb2ludGVyIG10LTEgbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPlxuICAgICAgICAgIGZpbGVfdXBsb2FkXG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGFwcC1leHBvcnQtdG8tZXhjZWwtYnV0dG9uIHRhYmxlSWQ9XCJwcm9kdWN0VGFibGVcIiBmaWxlTmFtZT1cInByb2R1Y3RzXCIgKG9uRXhwb3J0U3RhcnQpPVwiaGFuZGxlRXhwb3J0KHRydWUpXCIgKG9uRXhwb3J0RW5kKT1cImhhbmRsZUV4cG9ydChmYWxzZSlcIj48L2FwcC1leHBvcnQtdG8tZXhjZWwtYnV0dG9uPlxuICAgICAgICA8YXBwLWNvbHVtbi1zZWxlY3RvclxuICAgICAgICAgIG1vZGU9XCJpY29uXCJcbiAgICAgICAgICBjbGFzcz1cIm1iLTIgZC1wcmludC1ub25lXCJcbiAgICAgICAgICBbY29sdW1uQ29uZmlnc109XCJjb2x1bW5Db25maWdcIlxuICAgICAgICAgIFsoc2VsZWN0ZWRDb2x1bW5zKV09XCJzZWxlY3RlZENvbHVtbnNcIlxuICAgICAgICA+PC9hcHAtY29sdW1uLXNlbGVjdG9yPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPG1hdC1sYWJlbD5TZWFyY2g8L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJTZWFyY2ggcHJvZHVjdHNcIiBmb3JtQ29udHJvbE5hbWU9XCJzZWFyY2hcIiAvPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8bWF0LWxhYmVsPkNhdGVnb3J5PC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yIGFwaVVybD1cImFwaS9wcm9kdWN0LWNhdGVnb3JpZXNcIiBmb3JtQ29udHJvbE5hbWU9XCJjYXRlZ29yeV9pZHNcIiBbbXVsdGlwbGVdPVwidHJ1ZVwiPlxuICAgICAgICAgIDwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxtYXQtbGFiZWw+VHlwZTwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvclxuICAgICAgICAgICAgYXBpVXJsPVwiYXBpL3Byb2R1Y3QtdHlwZXNcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidHlwZV9pZHNcIlxuICAgICAgICAgICAgdGl0bGVGaWVsZD1cInRpdGxlXCJcbiAgICAgICAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT5cbiAgPC9tYXQtY2FyZC1jb250ZW50PlxuPC9tYXQtY2FyZD5cblxuPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtc3RhcnQgZ2FwLTNcIj5cbiAgPG1hdC1jYXJkIFtzdHlsZS53aWR0aF09XCJzZWxlY3Rpb24uaXNFbXB0eSgpID8gJzEwMCUnIDogJzg1JSdcIj5cbiAgICA8bWF0LWNhcmQtY29udGVudCBjbGFzcz1cInAtMFwiPlxuICAgICAgPHRhYmxlXG4gICAgICAgIG1hdC10YWJsZVxuICAgICAgICBbZGF0YVNvdXJjZV09XCJtb2RlbHNcIlxuICAgICAgICBjbGFzcz1cInctMTAwXCJcbiAgICAgICAgaW5maW5pdGVTY3JvbGxcbiAgICAgICAgW2luZmluaXRlU2Nyb2xsRGlzdGFuY2VdPVwiMlwiXG4gICAgICAgIFtpbmZpbml0ZVNjcm9sbFRocm90dGxlXT1cIjUwXCJcbiAgICAgICAgKHNjcm9sbGVkKT1cIm9uU2Nyb2xsKClcIlxuICAgICAgICBbZnJvbVJvb3RdPVwidHJ1ZVwiXG4gICAgICAgIG1hdFNvcnRcbiAgICAgICAgKG1hdFNvcnRDaGFuZ2UpPVwic29ydENvbHVtbigkZXZlbnQpXCJcbiAgICAgICAgbWF0U29ydERpc2FibGVDbGVhcj1cInRydWVcIlxuICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiUHJvZHVjdHMgTGlzdFwiXG4gICAgICAgIGlkPVwicHJvZHVjdFRhYmxlXCJcbiAgICAgID5cbiAgICAgICAgPCEtLSAjIENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCIjXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4jPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudDsgbGV0IGkgPSBpbmRleFwiPnt7IGkgKyAxIH19PC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBOYW1lIENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJuYW1lXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCBtYXQtc29ydC1oZWFkZXIgKm1hdEhlYWRlckNlbGxEZWY+TmFtZTwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTFcIj5cbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJ0ZXh0LWRlY29yYXRpb24tbm9uZSB0ZXh0LWRhcmtcIiBbcm91dGVyTGlua109XCJbZWxlbWVudD8uaWQsICd2aWV3J11cIj57eyBlbGVtZW50Lm5hbWUgfX08L2E+XG4gICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtc2Vjb25kYXJ5XCIgKm5nSWY9XCJlbGVtZW50LnR5cGUgJiYgIWV4cG9ydEluUHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgICAgICB7eyBlbGVtZW50LnR5cGU/LnRpdGxlIH19XG4gICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFR5cGUgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInR5cGVcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsIG1hdC1zb3J0LWhlYWRlciAqbWF0SGVhZGVyQ2VsbERlZj5UeXBlPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAge3sgZWxlbWVudD8udHlwZT8udGl0bGUgfX1cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIENhdGVnb3JpZXMgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImNhdGVnb3JpZXNcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPkNhdGVnb3JpZXM8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgc3R5bGU9XCJtYXgtd2lkdGg6IDIwMHB4XCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwiZWxlbWVudD8uY2F0ZWdvcmllcz8ubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1zdGFydCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTEgZmxleC13cmFwXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiZy1zZWNvbmRhcnlcIiAqbmdGb3I9XCJsZXQgY2F0ZWdvcnkgb2YgZWxlbWVudD8uY2F0ZWdvcmllc1wiPlxuICAgICAgICAgICAgICAgIHt7IGNhdGVnb3J5Py50aXRsZSB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFNLVSBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2t1XCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCBtYXQtc29ydC1oZWFkZXIgKm1hdEhlYWRlckNlbGxEZWY+U0tVPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7IGVsZW1lbnQuc2t1IH19PC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIFxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCBtYXQtc29ydC1oZWFkZXIgKm1hdEhlYWRlckNlbGxEZWY+RGVzY3JpcHRpb248L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3sgZWxlbWVudC5kZXNjcmlwdGlvbiB9fTwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gSW5pdGlhbCBRdWFudGl0eSBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiaW5pdGlhbF9xdWFudGl0eVwiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgbWF0LXNvcnQtaGVhZGVyICptYXRIZWFkZXJDZWxsRGVmPkluaXRpYWwgUXVhbnRpdHk8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTBcIj57eyBlbGVtZW50LmluaXRpYWxfcXVhbnRpdHkgfX08L3A+XG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeVwiICpuZ0lmPVwiZWxlbWVudD8uaW5pdGlhbF9xdWFudGl0eV9kYXRlXCI+XG4gICAgICAgICAgICAgIG9uIHt7IGVsZW1lbnQ/LmluaXRpYWxfcXVhbnRpdHlfZGF0ZSB8IGRhdGUgfX1cbiAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBTdG9jayBSZWNlaXB0cyBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic3RvY2tfcmVjZWlwdHNcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsIG1hdC1zb3J0LWhlYWRlcj1cInN0b2NrX3JlY2VpcHRzX3N1bV9xdWFudGl0eVwiICptYXRIZWFkZXJDZWxsRGVmPlN0b2NrIFJlY2VpcHRzPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wXCI+e3sgZWxlbWVudD8uc3RvY2tfcmVjZWlwdHNfc3VtX3F1YW50aXR5IH19PC9wPlxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1zZWNvbmRhcnlcIiAqbmdJZj1cImVsZW1lbnQ/Lmxhc3Rfc3RvY2tfcmVjZWlwdCAmJiAhZXhwb3J0SW5Qcm9ncmVzc1wiPlxuICAgICAgICAgICAgICBMYXRlc3Qgb24ge3sgZWxlbWVudD8ubGFzdF9zdG9ja19yZWNlaXB0Py5kYXRlIHwgZGF0ZSB9fVxuICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIExhc3QgU3RvY2sgUmVjZWlwdCBEYXRlIENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJsYXN0X3N0b2NrX3JlY2VpcHRfZGF0ZVwiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+TGFzdCBTdG9jayBSZWNlaXB0IERhdGU8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICB7eyBlbGVtZW50Py5sYXN0X3N0b2NrX3JlY2VpcHQ/LmRhdGUgfCBkYXRlIH19XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBTdG9jayBJc3N1YW5jZXMgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInN0b2NrX2lzc3VhbmNlc1wiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgbWF0LXNvcnQtaGVhZGVyPVwic3RvY2tfaXNzdWFuY2VzX3N1bV9xdWFudGl0eVwiICptYXRIZWFkZXJDZWxsRGVmPlN0b2NrIElzc3VhbmNlczwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMFwiPnt7IGVsZW1lbnQ/LnN0b2NrX2lzc3VhbmNlc19zdW1fcXVhbnRpdHkgfX08L3A+XG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeVwiICpuZ0lmPVwiZWxlbWVudD8ubGFzdF9zdG9ja19pc3N1YW5jZSAmJiAhZXhwb3J0SW5Qcm9ncmVzc1wiPlxuICAgICAgICAgICAgICBMYXRlc3Qgb24ge3sgZWxlbWVudD8ubGFzdF9zdG9ja19pc3N1YW5jZT8uZGF0ZSB8IGRhdGUgfX1cbiAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBMYXN0IFN0b2NrIElzc3VlIERhdGUgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImxhc3Rfc3RvY2tfaXNzdWVfZGF0ZVwiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+TGFzdCBTdG9jayBJc3N1ZSBEYXRlPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAge3sgZWxlbWVudD8ubGFzdF9zdG9ja19pc3N1YW5jZT8uZGF0ZSB8IGRhdGUgfX1cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIE9uIEhhbmQgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIm9uX2hhbmRcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsIG1hdC1zb3J0LWhlYWRlcj0nc3RvY2tfb25faGFuZCcgKm1hdEhlYWRlckNlbGxEZWY+T24gSGFuZDwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgIHt7IGVsZW1lbnQ/LnN0b2NrX2JhbGFuY2UgfX1cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIm1lYXN1cmVcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsIG1hdC1zb3J0LWhlYWRlciAqbWF0SGVhZGVyQ2VsbERlZj5NZWFzdXJlPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAge3sgZWxlbWVudD8ubWVhc3VyZT8udGl0bGUgfX1cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFJlb3JkZXIgUG9pbnQgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInJlb3JkZXJfcG9pbnRcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsIG1hdC1zb3J0LWhlYWRlciAqbWF0SGVhZGVyQ2VsbERlZj5SZW9yZGVyIFBvaW50PC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAge3sgZWxlbWVudC5yZW9yZGVyX3BvaW50IH19XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBTZWxsaW5nIFByaWNlIENvbHVtbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzYWxlX3ByaWNlXCI+XG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCBtYXQtc29ydC1oZWFkZXIgKm1hdEhlYWRlckNlbGxEZWY+U2VsbGluZyBQcmljZTwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgIHt7IGVsZW1lbnQuc2FsZV9wcmljZSB8IGN1cnJlbmN5IH19XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBJbmNvbWUgQWNjb3VudCBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiaW5jb21lX2FjY291bnRcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPkluY29tZSBBY2NvdW50PC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAge3sgZWxlbWVudD8uaW5jb21lX2FjY291bnQ/LnRpdGxlIH19XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBFeHBlbnNlIEFjY291bnQgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImV4cGVuc2VfYWNjb3VudFwiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+RXhwZW5zZSBBY2NvdW50PC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgICAge3sgZWxlbWVudD8uZXhwZW5zZV9hY2NvdW50Py50aXRsZSB9fVxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gQ3JlYXRvciBDb2x1bW4gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiY3JlYXRvclwiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+Q3JlYXRvcjwvdGg+XG4gICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMFwiPnt7IGVsZW1lbnQ/LmNyZWF0b3I/Lm5hbWUgfX08L3A+XG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LXNlY29uZGFyeVwiPnt7IGVsZW1lbnQ/LmNyZWF0ZWRfYXQgfCBkYXRlIH19PC9zbWFsbD5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIEFjdGlvbnMgQ29sdW1uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIkFjdGlvbnNcIj5cbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPkFjdGlvbnM8L3RoPlxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zZWNvbmRhcnkgZC1mbGV4IGdhcC0xXCI+XG4gICAgICAgICAgICAgIDxhcHAtcHJvZHVjdC1mb3JtLWJ1dHRvbiBbcHJvZHVjdF09XCJlbGVtZW50XCI+PC9hcHAtcHJvZHVjdC1mb3JtLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlZpZXdcIlxuICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIltlbGVtZW50LmlkLCAndmlldyddXCJcbiAgICAgICAgICAgICAgICByb3V0ZXJMaW5rQWN0aXZlPVwicm91dGUtbGluay1hY3RpdmVcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgcmVtb3ZlX3JlZF9leWVcbiAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cblxuICAgICAgICAgICAgICA8YXBwLXN0b2NrLXJlY2VpcHQtZm9ybS1idXR0b24gW3Byb2R1Y3RdPVwiZWxlbWVudFwiIChzYXZlZCk9XCJyZWxvYWQoKVwiPjwvYXBwLXN0b2NrLXJlY2VpcHQtZm9ybS1idXR0b24+XG5cbiAgICAgICAgICAgICAgPGFwcC1zdG9jay1pc3N1ZS1mb3JtLWJ1dHRvbiBbcHJvZHVjdF09XCJlbGVtZW50XCIgKHNhdmVkKT1cInJlbG9hZCgpXCI+PC9hcHAtc3RvY2staXNzdWUtZm9ybS1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIlNlbGVjdFwiPlxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICAgICAgICA8bWF0LWNoZWNrYm94IChjaGFuZ2UpPVwiJGV2ZW50ID8gdG9nZ2xlQWxsUm93cygpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmIGlzQWxsUm93c1NlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiAhaXNBbGxSb3dzU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthcmlhLWxhYmVsXT1cImNoZWNrYm94TGFiZWwoKVwiPlxuICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+XG4gICAgICAgICAgICA8bWF0LWNoZWNrYm94IChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIiRldmVudCA/IHNlbGVjdGlvbi50b2dnbGUocm93KSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3Rpb24uaXNTZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2FyaWEtbGFiZWxdPVwiY2hlY2tib3hMYWJlbChyb3cpXCI+XG4gICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDx0ZCBtYXQtZm9vdGVyLWNlbGwgKm1hdEZvb3RlckNlbGxEZWY+PC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uczsgc3RpY2t5OiB0cnVlXCI+PC90cj5cbiAgICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxuICAgICAgPC90YWJsZT5cblxuICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiAqbmdJZj1cImlzV29ya2luZ1wiPjwvbWF0LXByb2dyZXNzLWJhcj5cbiAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gIDwvbWF0LWNhcmQ+XG4gIDxtYXQtY2FyZFxuICAgICpuZ0lmPVwiIXNlbGVjdGlvbi5pc0VtcHR5KClcIlxuICAgIHN0eWxlPVwid2lkdGg6IGNhbGMoMTUlIC0gMXJlbSlcIlxuICA+XG4gICAgPG1hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICA8YXBwLXByb2R1Y3QtYmF0Y2gtdXBkYXRlLWZvcm0gW3NlbGVjdGlvbl09XCJzZWxlY3Rpb25cIiAodXBkYXRlZCk9XCJyZWxvYWQoKVwiPjwvYXBwLXByb2R1Y3QtYmF0Y2gtdXBkYXRlLWZvcm0+XG4gICAgPC9tYXQtY2FyZC1jb250ZW50PlxuICA8L21hdC1jYXJkPlxuPC9kaXY+XG4iXX0=