techlify-inventory-common 18.24.1 → 18.25.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.
- package/esm2022/lib/inventory-common/inventory-common-routing.module.mjs +2 -2
- package/esm2022/lib/inventory-common/product/product-view-page/product-view-page.component.mjs +4 -4
- package/esm2022/lib/inventory-common/product/product.module.mjs +5 -5
- package/esm2022/lib/inventory-common/reports/inventory-value-report/inventory-value-report.component.mjs +5 -3
- package/esm2022/lib/inventory-common/stock-issuances/stock-issuance-delete-button/stock-issuance-delete-button.component.mjs +8 -8
- package/esm2022/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form/stock-issue-form.component.mjs +9 -9
- package/esm2022/lib/inventory-common/stock-issuances/stock-issue-list/stock-issue-list.component.mjs +179 -0
- package/esm2022/lib/inventory-common/stock-issuances/stock-issue-list/stock-issue-list.module.mjs +67 -0
- package/esm2022/lib/inventory-common/stock-issuances/stock-issue-routing.module.mjs +36 -0
- package/esm2022/lib/inventory-common/stock-issuances/stock-issue-view/stock-issue-view.component.mjs +68 -0
- package/esm2022/lib/inventory-common/stock-issuances/stock-issue.module.mjs +67 -0
- package/esm2022/lib/inventory-common/stock-issuances/stock-issue.service.mjs +18 -0
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-view/stock-receipt-view.component.mjs +3 -3
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipts-list-page/stock-receipts-list-page.component.mjs +18 -3
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipts.module.mjs +7 -4
- package/esm2022/public-api.mjs +4 -4
- package/fesm2022/{techlify-inventory-common-category.module-DmlWI9xk.mjs → techlify-inventory-common-category.module-CW1zB9DQ.mjs} +4 -4
- package/fesm2022/{techlify-inventory-common-category.module-DmlWI9xk.mjs.map → techlify-inventory-common-category.module-CW1zB9DQ.mjs.map} +1 -1
- package/fesm2022/{techlify-inventory-common-measure.module-NTiKN2Rg.mjs → techlify-inventory-common-measure.module-DJqtbIad.mjs} +4 -4
- package/fesm2022/{techlify-inventory-common-measure.module-NTiKN2Rg.mjs.map → techlify-inventory-common-measure.module-DJqtbIad.mjs.map} +1 -1
- package/fesm2022/techlify-inventory-common-stock-issue-view.component-eeonvCBl.mjs +66 -0
- package/fesm2022/techlify-inventory-common-stock-issue-view.component-eeonvCBl.mjs.map +1 -0
- package/fesm2022/techlify-inventory-common-techlify-inventory-common-EAdspCEd.mjs +6328 -0
- package/fesm2022/techlify-inventory-common-techlify-inventory-common-EAdspCEd.mjs.map +1 -0
- package/fesm2022/techlify-inventory-common.mjs +1 -6290
- package/fesm2022/techlify-inventory-common.mjs.map +1 -1
- package/lib/inventory-common/product/product-view-page/product-view-page.component.d.ts +2 -2
- package/lib/inventory-common/product/product.module.d.ts +2 -2
- package/lib/inventory-common/stock-issuances/stock-issuance-delete-button/stock-issuance-delete-button.component.d.ts +3 -3
- package/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form/stock-issue-form.component.d.ts +3 -3
- package/lib/inventory-common/stock-issuances/{stock-issuances-list/stock-issuances-list.component.d.ts → stock-issue-list/stock-issue-list.component.d.ts} +8 -6
- package/lib/inventory-common/stock-issuances/stock-issue-list/stock-issue-list.module.d.ts +17 -0
- package/lib/inventory-common/stock-issuances/stock-issue-routing.module.d.ts +7 -0
- package/lib/inventory-common/stock-issuances/stock-issue-view/stock-issue-view.component.d.ts +19 -0
- package/lib/inventory-common/stock-issuances/stock-issue.module.d.ts +19 -0
- package/lib/inventory-common/stock-issuances/stock-issue.service.d.ts +7 -0
- package/lib/inventory-common/stock-receipts/stock-receipts-list-page/stock-receipts-list-page.component.d.ts +3 -0
- package/lib/inventory-common/stock-receipts/stock-receipts.module.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +3 -3
- package/esm2022/lib/inventory-common/stock-issuances/stock-issuance.service.mjs +0 -18
- package/esm2022/lib/inventory-common/stock-issuances/stock-issuances-list/stock-issuances-list.component.mjs +0 -170
- package/esm2022/lib/inventory-common/stock-issuances/stock-issuances-list/stock-issuances-list.module.mjs +0 -64
- package/esm2022/lib/inventory-common/stock-issuances/stock-issuances-routing.module.mjs +0 -31
- package/esm2022/lib/inventory-common/stock-issuances/stock-issuances.module.mjs +0 -67
- package/lib/inventory-common/stock-issuances/stock-issuance.service.d.ts +0 -7
- package/lib/inventory-common/stock-issuances/stock-issuances-list/stock-issuances-list.module.d.ts +0 -17
- package/lib/inventory-common/stock-issuances/stock-issuances-routing.module.d.ts +0 -7
- package/lib/inventory-common/stock-issuances/stock-issuances.module.d.ts +0 -19
|
@@ -5,7 +5,7 @@ import { Location } from '@angular/common';
|
|
|
5
5
|
import { ProductLocationListComponent } from '../product-location/product-location-list/product-location-list.component';
|
|
6
6
|
import { StockTransferListComponent } from '../../stock-transfer/stock-transfer-list/stock-transfer-list.component';
|
|
7
7
|
import { StockReceiptsListPageComponent } from '../../stock-receipts/stock-receipts-list-page/stock-receipts-list-page.component';
|
|
8
|
-
import {
|
|
8
|
+
import { StockIssueListComponent } from '../../stock-issuances/stock-issue-list/stock-issue-list.component';
|
|
9
9
|
import * as i0 from "@angular/core";
|
|
10
10
|
export declare class ProductViewPageComponent implements OnInit {
|
|
11
11
|
private productService;
|
|
@@ -17,7 +17,7 @@ export declare class ProductViewPageComponent implements OnInit {
|
|
|
17
17
|
productLocationList: ProductLocationListComponent;
|
|
18
18
|
stockTransferList: StockTransferListComponent;
|
|
19
19
|
stockReceiptsListPage: StockReceiptsListPageComponent;
|
|
20
|
-
stockIssueListPage:
|
|
20
|
+
stockIssueListPage: StockIssueListComponent;
|
|
21
21
|
constructor(productService: ProductService, activatedRoute: ActivatedRoute, location: Location);
|
|
22
22
|
ngOnInit(): void;
|
|
23
23
|
/**
|
|
@@ -16,7 +16,7 @@ import * as i14 from "ngx-techlify-core";
|
|
|
16
16
|
import * as i15 from "../stock-receipts/stock-receipt-form/stock-receipt-form.module";
|
|
17
17
|
import * as i16 from "../stock-issuances/stock-issue-form/stock-issue-form.module";
|
|
18
18
|
import * as i17 from "../stock-receipts/stock-receipts.module";
|
|
19
|
-
import * as i18 from "../stock-issuances/stock-
|
|
19
|
+
import * as i18 from "../stock-issuances/stock-issue-list/stock-issue-list.module";
|
|
20
20
|
import * as i19 from "./product-tax/product-tax.module";
|
|
21
21
|
import * as i20 from "@angular/material/progress-bar";
|
|
22
22
|
import * as i21 from "ngx-infinite-scroll";
|
|
@@ -27,6 +27,6 @@ import * as i25 from "../stock-transfer/stock-transfer-list/stock-transfer-list.
|
|
|
27
27
|
import * as i26 from "../shared/export-to-excel-button/export-to-excel-button.component";
|
|
28
28
|
export declare class ProductModule {
|
|
29
29
|
static ɵfac: i0.ɵɵFactoryDeclaration<ProductModule, never>;
|
|
30
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<ProductModule, [typeof i1.ProductListComponent, typeof i2.ProductFormComponent, typeof i3.ProductNavBarComponent, typeof i4.ProductMeasuresListComponent, typeof i5.ProductMeasureFormComponent, typeof i6.ProductViewPageComponent, typeof i7.ProductFormButtonComponent, typeof i8.ProductDeleteButtonComponent, typeof i9.ProductBasicInfoComponent, typeof i10.ProductImportPageComponent, typeof i11.ProductBatchUpdateFormComponent], [typeof i12.CommonModule, typeof i13.ProductRoutingModule, typeof i14.SearchableSelectorModule, typeof i14.TimelineFilterModule, typeof i15.StockReceiptFormModule, typeof i16.StockIssueFormModule, typeof i14.ImportCsvModule, typeof i17.StockReceiptsModule, typeof i18.
|
|
30
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<ProductModule, [typeof i1.ProductListComponent, typeof i2.ProductFormComponent, typeof i3.ProductNavBarComponent, typeof i4.ProductMeasuresListComponent, typeof i5.ProductMeasureFormComponent, typeof i6.ProductViewPageComponent, typeof i7.ProductFormButtonComponent, typeof i8.ProductDeleteButtonComponent, typeof i9.ProductBasicInfoComponent, typeof i10.ProductImportPageComponent, typeof i11.ProductBatchUpdateFormComponent], [typeof i12.CommonModule, typeof i13.ProductRoutingModule, typeof i14.SearchableSelectorModule, typeof i14.TimelineFilterModule, typeof i15.StockReceiptFormModule, typeof i16.StockIssueFormModule, typeof i14.ImportCsvModule, typeof i17.StockReceiptsModule, typeof i18.StockIssueListModule, typeof i19.ProductTaxModule, typeof i14.MaterialModule, typeof i20.MatProgressBarModule, typeof i21.InfiniteScrollModule, typeof i22.FlexModule, typeof i23.ReactiveFormsModule, typeof i23.FormsModule, typeof i14.ColumnSelectorModule, typeof i24.ProductLocationListComponent, typeof i25.StockTransferListComponent, typeof i26.ExportToExcelButtonComponent], [typeof i2.ProductFormComponent, typeof i9.ProductBasicInfoComponent, typeof i7.ProductFormButtonComponent, typeof i11.ProductBatchUpdateFormComponent]>;
|
|
31
31
|
static ɵinj: i0.ɵɵInjectorDeclaration<ProductModule>;
|
|
32
32
|
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { EventEmitter, TemplateRef } from '@angular/core';
|
|
2
2
|
import { MatDialog } from '@angular/material/dialog';
|
|
3
|
-
import {
|
|
3
|
+
import { StockIssueService } from '../stock-issue.service';
|
|
4
4
|
import { AlertService } from 'ngx-techlify-core';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
export declare class StockIssuanceDeleteButtonComponent {
|
|
7
7
|
private matDialog;
|
|
8
|
-
private
|
|
8
|
+
private stockIssueService;
|
|
9
9
|
private alertService;
|
|
10
10
|
stockIssuance: any;
|
|
11
11
|
deleted: EventEmitter<any>;
|
|
12
12
|
isDeleting: boolean;
|
|
13
|
-
constructor(matDialog: MatDialog,
|
|
13
|
+
constructor(matDialog: MatDialog, stockIssueService: StockIssueService, alertService: AlertService);
|
|
14
14
|
showDeleteConfirmModel(templateRef: TemplateRef<any>): void;
|
|
15
15
|
delete(): void;
|
|
16
16
|
static ɵfac: i0.ɵɵFactoryDeclaration<StockIssuanceDeleteButtonComponent, never>;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { EventEmitter, OnInit } from '@angular/core';
|
|
2
2
|
import { AlertService, DateUtils, FormValidatorService, SearchableSelectorComponent, TechlifyFormComponentInterface } from 'ngx-techlify-core';
|
|
3
3
|
import { FormBuilder } from '@angular/forms';
|
|
4
|
-
import {
|
|
4
|
+
import { StockIssueService } from '../../stock-issue.service';
|
|
5
5
|
import { LocationService } from '../../../location/location.service';
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
7
|
export declare class StockIssueFormComponent extends TechlifyFormComponentInterface implements OnInit {
|
|
8
8
|
private formBuilder;
|
|
9
|
-
private
|
|
9
|
+
private stockIssueService;
|
|
10
10
|
private alertService;
|
|
11
11
|
private dateUtils;
|
|
12
12
|
private locationService;
|
|
@@ -22,7 +22,7 @@ export declare class StockIssueFormComponent extends TechlifyFormComponentInterf
|
|
|
22
22
|
private locationsCountValue;
|
|
23
23
|
batchesApiUrl: string;
|
|
24
24
|
isBatchPatched: boolean;
|
|
25
|
-
constructor(formValidatorService: FormValidatorService, formBuilder: FormBuilder,
|
|
25
|
+
constructor(formValidatorService: FormValidatorService, formBuilder: FormBuilder, stockIssueService: StockIssueService, alertService: AlertService, dateUtils: DateUtils, locationService: LocationService);
|
|
26
26
|
ngOnInit(): void;
|
|
27
27
|
patchFormData(): void;
|
|
28
28
|
patchFormProducts(stockIssuance: any): void;
|
|
@@ -2,12 +2,12 @@ import { EventEmitter, OnInit } from '@angular/core';
|
|
|
2
2
|
import { ColumnConfig, TechlifyFeatureService, TechlifyListingControllerInterface, TimelineValue } from 'ngx-techlify-core';
|
|
3
3
|
import { FormBuilder } from '@angular/forms';
|
|
4
4
|
import { Sort } from '@angular/material/sort';
|
|
5
|
-
import {
|
|
5
|
+
import { StockIssueService } from '../stock-issue.service';
|
|
6
6
|
import { ActivatedRoute } from '@angular/router';
|
|
7
7
|
import * as i0 from "@angular/core";
|
|
8
|
-
export declare class
|
|
8
|
+
export declare class StockIssueListComponent extends TechlifyListingControllerInterface implements OnInit {
|
|
9
9
|
private formBuilder;
|
|
10
|
-
private
|
|
10
|
+
private stockIssueService;
|
|
11
11
|
private activatedRoute;
|
|
12
12
|
private featureService;
|
|
13
13
|
product: any;
|
|
@@ -21,7 +21,9 @@ export declare class StockIssuancesListComponent extends TechlifyListingControll
|
|
|
21
21
|
columnConfig: ColumnConfig[];
|
|
22
22
|
selectedColumns: ColumnConfig[];
|
|
23
23
|
get displayedColumns(): string[];
|
|
24
|
-
|
|
24
|
+
get totalQuantity(): number;
|
|
25
|
+
get footerColumns(): string[];
|
|
26
|
+
constructor(formBuilder: FormBuilder, stockIssueService: StockIssueService, activatedRoute: ActivatedRoute, featureService: TechlifyFeatureService);
|
|
25
27
|
ngOnInit(): void;
|
|
26
28
|
loadData(): void;
|
|
27
29
|
onSortChange(sort: Sort): void;
|
|
@@ -30,6 +32,6 @@ export declare class StockIssuancesListComponent extends TechlifyListingControll
|
|
|
30
32
|
private subscribeToRouteChanges;
|
|
31
33
|
onDurationChange(timelineValue: TimelineValue): void;
|
|
32
34
|
private loadFeatures;
|
|
33
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<
|
|
34
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<
|
|
35
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<StockIssueListComponent, never>;
|
|
36
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<StockIssueListComponent, "app-stock-issue-list", never, { "product": { "alias": "product"; "required": false; }; "issuableType": { "alias": "issuableType"; "required": false; }; "issuableId": { "alias": "issuableId"; "required": false; }; "label": { "alias": "label"; "required": false; }; "showActions": { "alias": "showActions"; "required": false; }; "showFilters": { "alias": "showFilters"; "required": false; }; }, { "listUpdated": "listUpdated"; }, never, never, false, never>;
|
|
35
37
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import * as i1 from "./stock-issue-list.component";
|
|
3
|
+
import * as i2 from "@angular/common";
|
|
4
|
+
import * as i3 from "ngx-techlify-core";
|
|
5
|
+
import * as i4 from "../../techlify-filter/techlify-filter.module";
|
|
6
|
+
import * as i5 from "../stock-issue-form/stock-issue-form.module";
|
|
7
|
+
import * as i6 from "ngx-infinite-scroll";
|
|
8
|
+
import * as i7 from "../stock-issuance-delete-button/stock-issuance-delete-button.module";
|
|
9
|
+
import * as i8 from "@angular/material/progress-bar";
|
|
10
|
+
import * as i9 from "@angular/router";
|
|
11
|
+
import * as i10 from "@angular/forms";
|
|
12
|
+
import * as i11 from "../../product/widgets/product-category-badges/product-category-badges.component";
|
|
13
|
+
export declare class StockIssueListModule {
|
|
14
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<StockIssueListModule, never>;
|
|
15
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<StockIssueListModule, [typeof i1.StockIssueListComponent], [typeof i2.CommonModule, typeof i3.MaterialModule, typeof i4.TechlifyFilterModule, typeof i5.StockIssueFormModule, typeof i6.InfiniteScrollModule, typeof i7.StockIssuanceDeleteButtonModule, typeof i8.MatProgressBarModule, typeof i9.RouterModule, typeof i3.SearchableSelectorModule, typeof i3.TimelineFilterModule, typeof i10.ReactiveFormsModule, typeof i11.ProductCategoryBadgesComponent, typeof i3.ColumnSelectorModule, typeof i3.TechlifyIconModule], [typeof i1.StockIssueListComponent]>;
|
|
16
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<StockIssueListModule>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import * as i1 from "@angular/router";
|
|
3
|
+
export declare class StockIssueRoutingModule {
|
|
4
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<StockIssueRoutingModule, never>;
|
|
5
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<StockIssueRoutingModule, never, [typeof i1.RouterModule], [typeof i1.RouterModule]>;
|
|
6
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<StockIssueRoutingModule>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { OnInit } from '@angular/core';
|
|
2
|
+
import { Location } from '@angular/common';
|
|
3
|
+
import { ActivatedRoute } from '@angular/router';
|
|
4
|
+
import { StockIssueService } from '../stock-issue.service';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export declare class StockIssueViewComponent implements OnInit {
|
|
7
|
+
private activatedRoute;
|
|
8
|
+
private service;
|
|
9
|
+
private location;
|
|
10
|
+
id: number;
|
|
11
|
+
isLoading: boolean;
|
|
12
|
+
stockIssue: any;
|
|
13
|
+
constructor(activatedRoute: ActivatedRoute, service: StockIssueService, location: Location);
|
|
14
|
+
ngOnInit(): void;
|
|
15
|
+
loadData(): void;
|
|
16
|
+
redirectBack(): void;
|
|
17
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<StockIssueViewComponent, never>;
|
|
18
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<StockIssueViewComponent, "app-stock-issue-view", never, {}, {}, never, never, true, never>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import * as i1 from "@angular/common";
|
|
3
|
+
import * as i2 from "./stock-issue-routing.module";
|
|
4
|
+
import * as i3 from "@angular/material/card";
|
|
5
|
+
import * as i4 from "../techlify-filter/techlify-filter.module";
|
|
6
|
+
import * as i5 from "ngx-infinite-scroll";
|
|
7
|
+
import * as i6 from "@angular/material/progress-bar";
|
|
8
|
+
import * as i7 from "@angular/material/sort";
|
|
9
|
+
import * as i8 from "@angular/material/table";
|
|
10
|
+
import * as i9 from "../stock-receipts/stock-receipt-form/stock-receipt-form.module";
|
|
11
|
+
import * as i10 from "./stock-issue-form/stock-issue-form.module";
|
|
12
|
+
import * as i11 from "@angular/material/dialog";
|
|
13
|
+
import * as i12 from "@angular/material/button";
|
|
14
|
+
import * as i13 from "./stock-issue-list/stock-issue-list.module";
|
|
15
|
+
export declare class StockIssueModule {
|
|
16
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<StockIssueModule, never>;
|
|
17
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<StockIssueModule, never, [typeof i1.CommonModule, typeof i2.StockIssueRoutingModule, typeof i3.MatCardModule, typeof i4.TechlifyFilterModule, typeof i5.InfiniteScrollModule, typeof i6.MatProgressBarModule, typeof i7.MatSortModule, typeof i8.MatTableModule, typeof i9.StockReceiptFormModule, typeof i10.StockIssueFormModule, typeof i11.MatDialogModule, typeof i12.MatButtonModule, typeof i13.StockIssueListModule], never>;
|
|
18
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<StockIssueModule>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { HttpService, TechlifyServiceBaseClass } from 'ngx-techlify-core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class StockIssueService extends TechlifyServiceBaseClass {
|
|
4
|
+
constructor(httpService: HttpService);
|
|
5
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<StockIssueService, never>;
|
|
6
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<StockIssueService>;
|
|
7
|
+
}
|
|
@@ -18,6 +18,9 @@ export declare class StockReceiptsListPageComponent extends TechlifyListingContr
|
|
|
18
18
|
columnConfig: ColumnConfig[];
|
|
19
19
|
selectedColumns: ColumnConfig[];
|
|
20
20
|
get displayedColumns(): string[];
|
|
21
|
+
get totalPurchasePrice(): number;
|
|
22
|
+
get totalValue(): number;
|
|
23
|
+
get footerColumns(): string[];
|
|
21
24
|
constructor(stockReceiptService: StockReceiptService, formBuilder: FormBuilder, activatedRoute: ActivatedRoute, router: Router, featureService: TechlifyFeatureService);
|
|
22
25
|
ngOnInit(): void;
|
|
23
26
|
loadData(): void;
|
|
@@ -17,6 +17,6 @@ import * as i15 from "./stock-receipt-form/stock-receipt-form.module";
|
|
|
17
17
|
import * as i16 from "../product/widgets/product-category-badges/product-category-badges.component";
|
|
18
18
|
export declare class StockReceiptsModule {
|
|
19
19
|
static ɵfac: i0.ɵɵFactoryDeclaration<StockReceiptsModule, never>;
|
|
20
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<StockReceiptsModule, [typeof i1.StockReceiptsListPageComponent, typeof i2.StockReceiptDeleteButtonComponent, typeof i3.StockReceiptViewComponent], [typeof i4.CommonModule, typeof i5.StockReceiptsRoutingModule, typeof i6.MatCardModule, typeof i7.TechlifyFilterModule, typeof i8.MatTableModule, typeof i9.MatFormFieldModule, typeof i10.SearchableSelectorModule, typeof i10.TimelineFilterModule, typeof i11.ReactiveFormsModule, typeof i12.PayeeSelectorModule, typeof i13.MatProgressBarModule, typeof i14.InfiniteScrollModule, typeof i10.MaterialModule, typeof i15.StockReceiptFormModule, typeof i16.ProductCategoryBadgesComponent, typeof i10.ColumnSelectorModule, typeof i10.EntityFilesViewAllModule, typeof i10.TechlifyFeatureModule], [typeof i2.StockReceiptDeleteButtonComponent, typeof i1.StockReceiptsListPageComponent]>;
|
|
20
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<StockReceiptsModule, [typeof i1.StockReceiptsListPageComponent, typeof i2.StockReceiptDeleteButtonComponent, typeof i3.StockReceiptViewComponent], [typeof i4.CommonModule, typeof i5.StockReceiptsRoutingModule, typeof i6.MatCardModule, typeof i7.TechlifyFilterModule, typeof i8.MatTableModule, typeof i9.MatFormFieldModule, typeof i10.SearchableSelectorModule, typeof i10.TimelineFilterModule, typeof i11.ReactiveFormsModule, typeof i12.PayeeSelectorModule, typeof i13.MatProgressBarModule, typeof i14.InfiniteScrollModule, typeof i10.MaterialModule, typeof i15.StockReceiptFormModule, typeof i16.ProductCategoryBadgesComponent, typeof i10.ColumnSelectorModule, typeof i10.EntityFilesViewAllModule, typeof i10.TechlifyFeatureModule, typeof i10.NoteModule], [typeof i2.StockReceiptDeleteButtonComponent, typeof i1.StockReceiptsListPageComponent]>;
|
|
21
21
|
static ɵinj: i0.ɵɵInjectorDeclaration<StockReceiptsModule>;
|
|
22
22
|
}
|
package/package.json
CHANGED
package/public-api.d.ts
CHANGED
|
@@ -16,9 +16,9 @@ export * from './lib/inventory-common/product/product-form.service';
|
|
|
16
16
|
export * from './lib/inventory-common/product/product-batch-update-form/product-batch-update-form.component';
|
|
17
17
|
export * from './lib/inventory-common/product/product-import-page/product-import-page.component';
|
|
18
18
|
export * from './lib/inventory-common/product/product-view-page/product-view-page.component';
|
|
19
|
-
export * from './lib/inventory-common/stock-issuances/stock-
|
|
20
|
-
export * from './lib/inventory-common/stock-issuances/stock-
|
|
21
|
-
export * from './lib/inventory-common/stock-issuances/stock-
|
|
19
|
+
export * from './lib/inventory-common/stock-issuances/stock-issue.module';
|
|
20
|
+
export * from './lib/inventory-common/stock-issuances/stock-issue-list/stock-issue-list.component';
|
|
21
|
+
export * from './lib/inventory-common/stock-issuances/stock-issue-list/stock-issue-list.module';
|
|
22
22
|
export * from './lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form.module';
|
|
23
23
|
export * from './lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form-button/stock-issue-form-button.component';
|
|
24
24
|
export * from './lib/inventory-common/stock-receipts/stock-receipts.module';
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { TechlifyServiceBaseClass } from 'ngx-techlify-core';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "ngx-techlify-core";
|
|
5
|
-
export class StockIssuanceService extends TechlifyServiceBaseClass {
|
|
6
|
-
constructor(httpService) {
|
|
7
|
-
super(httpService, 'stock-issuances');
|
|
8
|
-
}
|
|
9
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StockIssuanceService, deps: [{ token: i1.HttpService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
10
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StockIssuanceService, providedIn: 'root' });
|
|
11
|
-
}
|
|
12
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StockIssuanceService, decorators: [{
|
|
13
|
-
type: Injectable,
|
|
14
|
-
args: [{
|
|
15
|
-
providedIn: 'root',
|
|
16
|
-
}]
|
|
17
|
-
}], ctorParameters: () => [{ type: i1.HttpService }] });
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvY2staXNzdWFuY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ludmVudG9yeS1jb21tb24vc3JjL2xpYi9pbnZlbnRvcnktY29tbW9uL3N0b2NrLWlzc3VhbmNlcy9zdG9jay1pc3N1YW5jZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFlLHdCQUF3QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7OztBQUsxRSxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsd0JBQXdCO0lBQ2hFLFlBQVksV0FBd0I7UUFDbEMsS0FBSyxDQUFDLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7d0dBSFUsb0JBQW9COzRHQUFwQixvQkFBb0IsY0FGbkIsTUFBTTs7NEZBRVAsb0JBQW9CO2tCQUhoQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBTZXJ2aWNlLCBUZWNobGlmeVNlcnZpY2VCYXNlQ2xhc3MgfSBmcm9tICduZ3gtdGVjaGxpZnktY29yZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBTdG9ja0lzc3VhbmNlU2VydmljZSBleHRlbmRzIFRlY2hsaWZ5U2VydmljZUJhc2VDbGFzcyB7XG4gIGNvbnN0cnVjdG9yKGh0dHBTZXJ2aWNlOiBIdHRwU2VydmljZSkge1xuICAgIHN1cGVyKGh0dHBTZXJ2aWNlLCAnc3RvY2staXNzdWFuY2VzJyk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
-
import { TechlifyListingControllerInterface } from 'ngx-techlify-core';
|
|
3
|
-
import { debounceTime, distinctUntilChanged } from 'rxjs';
|
|
4
|
-
import moment from 'moment';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/forms";
|
|
7
|
-
import * as i2 from "../stock-issuance.service";
|
|
8
|
-
import * as i3 from "@angular/router";
|
|
9
|
-
import * as i4 from "ngx-techlify-core";
|
|
10
|
-
import * as i5 from "@angular/common";
|
|
11
|
-
import * as i6 from "@angular/material/form-field";
|
|
12
|
-
import * as i7 from "@angular/material/input";
|
|
13
|
-
import * as i8 from "@angular/material/sort";
|
|
14
|
-
import * as i9 from "@angular/material/table";
|
|
15
|
-
import * as i10 from "@angular/material/card";
|
|
16
|
-
import * as i11 from "@angular/material/tooltip";
|
|
17
|
-
import * as i12 from "@angular/material/progress-bar";
|
|
18
|
-
import * as i13 from "../stock-issue-form/stock-issue-form-button/stock-issue-form-button.component";
|
|
19
|
-
import * as i14 from "ngx-infinite-scroll";
|
|
20
|
-
import * as i15 from "../stock-issuance-delete-button/stock-issuance-delete-button.component";
|
|
21
|
-
import * as i16 from "../../product/widgets/product-category-badges/product-category-badges.component";
|
|
22
|
-
export class StockIssuancesListComponent extends TechlifyListingControllerInterface {
|
|
23
|
-
formBuilder;
|
|
24
|
-
stockIssuanceService;
|
|
25
|
-
activatedRoute;
|
|
26
|
-
featureService;
|
|
27
|
-
product;
|
|
28
|
-
issuableType;
|
|
29
|
-
issuableId;
|
|
30
|
-
label = 'Stock Issues';
|
|
31
|
-
showActions = true;
|
|
32
|
-
showFilters = true;
|
|
33
|
-
listUpdated = new EventEmitter();
|
|
34
|
-
defaultSelectedColumns = [
|
|
35
|
-
'no', 'product', 'sku', 'date', 'quantity', 'measure', 'location', 'related', 'particulars',
|
|
36
|
-
];
|
|
37
|
-
columnConfig = [
|
|
38
|
-
{ label: 'Creator', def: 'creator', isSelected: false, isEditable: true },
|
|
39
|
-
];
|
|
40
|
-
selectedColumns = this.columnConfig.filter(col => col.isSelected);
|
|
41
|
-
get displayedColumns() {
|
|
42
|
-
const selectedColumns = this.selectedColumns.map(col => col.def);
|
|
43
|
-
return this.defaultSelectedColumns.concat(...selectedColumns, 'actions');
|
|
44
|
-
}
|
|
45
|
-
constructor(formBuilder, stockIssuanceService, activatedRoute, featureService) {
|
|
46
|
-
super();
|
|
47
|
-
this.formBuilder = formBuilder;
|
|
48
|
-
this.stockIssuanceService = stockIssuanceService;
|
|
49
|
-
this.activatedRoute = activatedRoute;
|
|
50
|
-
this.featureService = featureService;
|
|
51
|
-
this.lastPage = 0;
|
|
52
|
-
this.filterForm = this.formBuilder.group({
|
|
53
|
-
category_ids: [''],
|
|
54
|
-
date_from: [''],
|
|
55
|
-
date_to: [''],
|
|
56
|
-
duration: [''],
|
|
57
|
-
import_id: [''],
|
|
58
|
-
location_ids: [''],
|
|
59
|
-
measure_ids: [''],
|
|
60
|
-
product_ids: [''],
|
|
61
|
-
search: [''],
|
|
62
|
-
sort_by: ['date|desc'],
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
ngOnInit() {
|
|
66
|
-
this.loadFeatures();
|
|
67
|
-
if (this.product) {
|
|
68
|
-
this.filterForm.get('product_ids')?.setValue(this.product?.id);
|
|
69
|
-
this.defaultSelectedColumns = this.defaultSelectedColumns.filter(c => c !== 'product' && c !== 'sku');
|
|
70
|
-
}
|
|
71
|
-
this.updateFormWithQueryParams();
|
|
72
|
-
this.subscribeToFormChanges();
|
|
73
|
-
this.subscribeToRouteChanges();
|
|
74
|
-
}
|
|
75
|
-
loadData() {
|
|
76
|
-
const params = {
|
|
77
|
-
page: this.page,
|
|
78
|
-
perPage: this.perPage,
|
|
79
|
-
with: `creator,issuable.fixedAsset,stockIssueProducts.product,stockIssueProducts.location,stockIssueProducts.product.categories,stockTransfer,stockIssueProducts.batch`,
|
|
80
|
-
...this.requestHelperService.convertToFormData(this.filterForm.value),
|
|
81
|
-
};
|
|
82
|
-
if (this.issuableId && this.issuableType) {
|
|
83
|
-
params.issuable_ids = this.issuableId;
|
|
84
|
-
params.issuable_types = this.issuableType;
|
|
85
|
-
}
|
|
86
|
-
this.isWorking = true;
|
|
87
|
-
this.stockIssuanceService.index(params).subscribe({
|
|
88
|
-
next: (response) => {
|
|
89
|
-
this.models = this.models.concat(response?.data);
|
|
90
|
-
this.lastPage = response?.last_page;
|
|
91
|
-
this.isWorking = false;
|
|
92
|
-
},
|
|
93
|
-
error: () => {
|
|
94
|
-
this.isWorking = false;
|
|
95
|
-
},
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
onSortChange(sort) {
|
|
99
|
-
let { active, direction } = sort;
|
|
100
|
-
if (!active) {
|
|
101
|
-
active = 'date';
|
|
102
|
-
}
|
|
103
|
-
if (!direction) {
|
|
104
|
-
direction = 'desc';
|
|
105
|
-
active = 'date';
|
|
106
|
-
}
|
|
107
|
-
this.filterForm.get('sort_by').setValue(active + '|' + direction);
|
|
108
|
-
}
|
|
109
|
-
updateFormWithQueryParams() {
|
|
110
|
-
this.requestHelperService.updateFormWithQueryParams(this.filterForm, {
|
|
111
|
-
product_ids: { multiple: true },
|
|
112
|
-
measure_ids: { multiple: true },
|
|
113
|
-
category_ids: { multiple: true },
|
|
114
|
-
supplier_ids: { multiple: true },
|
|
115
|
-
location_ids: { multiple: true },
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
subscribeToFormChanges() {
|
|
119
|
-
this.filterForm.valueChanges.pipe(debounceTime(800)).subscribe({
|
|
120
|
-
next: () => {
|
|
121
|
-
this.requestHelperService.updateQueryParams(this.requestHelperService.convertToFormData(this.filterForm.value));
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
subscribeToRouteChanges() {
|
|
126
|
-
this.activatedRoute.queryParams
|
|
127
|
-
.pipe(debounceTime(500), distinctUntilChanged())
|
|
128
|
-
.subscribe(() => {
|
|
129
|
-
this.reload();
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
onDurationChange(timelineValue) {
|
|
133
|
-
let { date_to, date_from } = timelineValue;
|
|
134
|
-
this.filterForm.patchValue({
|
|
135
|
-
date_from: date_from ? moment(date_from).format("YYYY-MM-DD") : "",
|
|
136
|
-
date_to: date_to ? moment(date_to).format("YYYY-MM-DD") : "",
|
|
137
|
-
}, { emitEvent: false });
|
|
138
|
-
}
|
|
139
|
-
loadFeatures() {
|
|
140
|
-
let isBatchEnabled = this.featureService.isFeatureExists('product-batch-numbers');
|
|
141
|
-
// now update displayedColumns accordingly
|
|
142
|
-
if (isBatchEnabled) {
|
|
143
|
-
const qtyIndex = this.defaultSelectedColumns.indexOf('quantity');
|
|
144
|
-
if (qtyIndex >= 0) {
|
|
145
|
-
this.defaultSelectedColumns.splice(qtyIndex + 1, 0, 'batch');
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StockIssuancesListComponent, deps: [{ token: i1.FormBuilder }, { token: i2.StockIssuanceService }, { token: i3.ActivatedRoute }, { token: i4.TechlifyFeatureService }], target: i0.ɵɵFactoryTarget.Component });
|
|
150
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: StockIssuancesListComponent, selector: "app-stock-issuances-list", inputs: { product: "product", issuableType: "issuableType", issuableId: "issuableId", label: "label", showActions: "showActions", showFilters: "showFilters" }, outputs: { listUpdated: "listUpdated" }, usesInheritance: true, ngImport: i0, template: "<mat-card *ngIf=\"!product\" 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-start align-items-center gap-2\">\n <h3 class=\"mb-0\">{{ label }}</h3>\n\n <app-stock-issue-form-button icon=\"add\" [issuableType]=\"issuableType\" [issuableId]=\"issuableId\"\n (saved)=\"reload()\"></app-stock-issue-form-button>\n\n <span *ngIf=\"showActions\" matTooltip=\"Import\" routerLink=\"import\"\n class=\"cursor-pointer material-symbols-outlined\">\n file_upload\n </span>\n\n <app-column-selector *ngIf=\"showActions\" mode=\"icon\" class=\"mt-2 d-print-none\" [columnConfigs]=\"columnConfig\"\n [(selectedColumns)]=\"selectedColumns\"></app-column-selector>\n </div>\n\n <form [formGroup]=\"filterForm\" *ngIf=\"showFilters\">\n <mat-form-field>\n <mat-label>Search</mat-label>\n <input matInput placeholder=\"Search products\" formControlName=\"search\" />\n </mat-form-field>\n\n <app-timeline-filter appearance=\"fill\" labelText=\"Date\" formControlName=\"duration\"\n (selectionChange)=\"onDurationChange($event)\" [showClearButton]=\"true\" [dateFrom]=\"filterForm.value?.date_from\"\n [dateTo]=\"filterForm.value?.date_to\"></app-timeline-filter>\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>Measure</mat-label>\n <app-searchable-selector apiUrl=\"api/product-measures\" formControlName=\"measure_ids\" [multiple]=\"true\">\n </app-searchable-selector>\n </mat-form-field>\n\n <mat-form-field>\n <mat-label>Location</mat-label>\n <app-searchable-selector apiUrl=\"api/inventory-locations\" formControlName=\"location_ids\" [multiple]=\"true\">\n </app-searchable-selector>\n </mat-form-field>\n </form>\n </mat-card-content>\n</mat-card>\n\n<mat-card>\n <mat-card-content *ngIf=\"product\" class=\"mb-0\">\n <div class=\"d-flex justify-content-start align-items-center gap-2 mb-2\">\n <span class=\"material-symbols-outlined\"> ungroup </span>\n <h3 class=\"mb-0\">Stock Issues</h3>\n\n <app-stock-issue-form-button class=\"mt-2\" [product]=\"product\" icon=\"add\"\n (saved)=\"reload(); listUpdated.emit()\"></app-stock-issue-form-button>\n </div>\n </mat-card-content>\n <mat-card-content class=\"p-0\">\n <table mat-table [dataSource]=\"models\" class=\"w-100\" aria-describedby=\"Stock Issuances\" 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 <!-- Product Column -->\n <ng-container matColumnDef=\"product\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Product</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\"\n [routerLink]=\"['/inventory/products', element?.stock_issue_products[0]?.product?.id, 'view']\">\n {{ element?.stock_issue_products[0]?.product.name }}\n </a>\n <app-product-category-badges\n [product]=\"element?.stock_issue_products[0]?.product\"></app-product-category-badges>\n </div>\n </td>\n </ng-container>\n\n <!-- SKU Column -->\n <ng-container matColumnDef=\"sku\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>SKU</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.stock_issue_products[0]?.product.sku }}</td>\n </ng-container>\n\n <!-- Date Column -->\n <ng-container matColumnDef=\"date\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Date</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.date | date }}</td>\n </ng-container>\n\n <!-- Location Column -->\n <ng-container matColumnDef=\"location\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Location</th>\n <td mat-cell *matCellDef=\"let element\">\n <a class=\"text-decoration-none text-dark\"\n [routerLink]=\"['/inventory/locations', element?.stock_issue_products[0]?.location_id, 'view']\">\n {{ element?.stock_issue_products[0]?.location?.title }}\n </a>\n </td>\n </ng-container>\n\n <!-- Related Column -->\n <ng-container matColumnDef=\"related\">\n <th mat-header-cell *matHeaderCellDef>Related</th>\n <td mat-cell *matCellDef=\"let element\">\n <a class=\"text-dark\" *ngIf=\"element?.issuable\" [routerLink]=\"['/maintenances', element?.issuable_id, 'view']\">\n Maintenance for {{ element?.issuable?.fixed_asset?.name }}\n </a>\n </td>\n </ng-container>\n\n <!-- Quantity Column -->\n <ng-container matColumnDef=\"quantity\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Quantity</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.stock_issue_products[0]?.quantity }} {{\n element?.stock_issue_products[0]?.product.measure?.title }}</td>\n </ng-container>\n\n <!-- Batch Column -->\n <ng-container matColumnDef=\"batch\">\n <th mat-header-cell *matHeaderCellDef>Batch</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\" *ngIf=\"element?.stock_issue_products[0]?.batch?.batch_number\">{{ element?.stock_issue_products[0]?.batch?.batch_number }}</p>\n <small class=\"text-secondary\" *ngIf=\"element?.stock_issue_products[0]?.batch?.expires_on\">\n Expires {{ element?.stock_issue_products[0]?.batch?.expires_on | date }}\n </small>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"measure\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Measure</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.stock_issue_products[0]?.product.measure?.title }}</td>\n </ng-container>\n\n <!-- Purchase Price Column -->\n <ng-container matColumnDef=\"purchase_price\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Purchase Price</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.purchase_price | currency }}\n </td>\n </ng-container>\n\n <!-- Total Value Column -->\n <ng-container matColumnDef=\"amount\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Total Value</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.amount | currency }}\n </td>\n </ng-container>\n\n <!-- Particulars Column -->\n <ng-container matColumnDef=\"particulars\">\n <th mat-header-cell *matHeaderCellDef>Particulars</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.stock_issue_products[0]?.particulars }}</td>\n </ng-container>\n\n <!-- Supplier Column -->\n <ng-container matColumnDef=\"supplier\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Supplier</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.supplier?.company_name }}\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-1\">{{ 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 *ngIf=\"!element.stock_transfer\" class=\"d-flex gap-1\">\n <app-stock-issue-form-button [stockIssue]=\"element\"\n (saved)=\"reload(); listUpdated.emit()\"></app-stock-issue-form-button>\n <app-stock-issuance-delete-button [stockIssuance]=\"element\"\n (deleted)=\"reload(); listUpdated.emit()\"></app-stock-issuance-delete-button>\n </div>\n\n <span *ngIf=\"element.stock_transfer\" class=\"badge rounded-pill text-bg-secondary\">Stock Transfer</span>\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 *ngIf=\"isWorking\" mode=\"indeterminate\"></mat-progress-bar>\n </mat-card-content>\n</mat-card>", styles: [""], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.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: i8.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i8.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i9.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i9.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i9.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i9.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i9.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i9.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i9.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i9.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i9.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i9.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i10.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i10.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i11.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i12.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i13.StockIssueFormButtonComponent, selector: "app-stock-issue-form-button", inputs: ["product", "stockIssueProduct", "stockIssue", "icon", "issuableType", "issuableId"], outputs: ["saved"] }, { kind: "directive", type: i14.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: i15.StockIssuanceDeleteButtonComponent, selector: "app-stock-issuance-delete-button", inputs: ["stockIssuance"], outputs: ["deleted"] }, { kind: "directive", type: i3.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i4.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: i4.TimelineFilterComponent, selector: "app-timeline-filter", inputs: ["defaultValue", "required", "disabled", "value", "timelines", "dateFrom", "dateTo", "appearance", "showClearButton", "form", "labelText"], outputs: ["selectionChange"] }, { 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: i16.ProductCategoryBadgesComponent, selector: "app-product-category-badges", inputs: ["product"] }, { kind: "component", type: i4.ColumnSelectorComponent, selector: "app-column-selector", inputs: ["label", "mode", "columnConfigs", "selectedColumns"], outputs: ["selectedColumnsChange", "displayedColumnsChange"] }, { kind: "pipe", type: i5.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i5.DatePipe, name: "date" }], preserveWhitespaces: true });
|
|
151
|
-
}
|
|
152
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StockIssuancesListComponent, decorators: [{
|
|
153
|
-
type: Component,
|
|
154
|
-
args: [{ selector: 'app-stock-issuances-list', template: "<mat-card *ngIf=\"!product\" 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-start align-items-center gap-2\">\n <h3 class=\"mb-0\">{{ label }}</h3>\n\n <app-stock-issue-form-button icon=\"add\" [issuableType]=\"issuableType\" [issuableId]=\"issuableId\"\n (saved)=\"reload()\"></app-stock-issue-form-button>\n\n <span *ngIf=\"showActions\" matTooltip=\"Import\" routerLink=\"import\"\n class=\"cursor-pointer material-symbols-outlined\">\n file_upload\n </span>\n\n <app-column-selector *ngIf=\"showActions\" mode=\"icon\" class=\"mt-2 d-print-none\" [columnConfigs]=\"columnConfig\"\n [(selectedColumns)]=\"selectedColumns\"></app-column-selector>\n </div>\n\n <form [formGroup]=\"filterForm\" *ngIf=\"showFilters\">\n <mat-form-field>\n <mat-label>Search</mat-label>\n <input matInput placeholder=\"Search products\" formControlName=\"search\" />\n </mat-form-field>\n\n <app-timeline-filter appearance=\"fill\" labelText=\"Date\" formControlName=\"duration\"\n (selectionChange)=\"onDurationChange($event)\" [showClearButton]=\"true\" [dateFrom]=\"filterForm.value?.date_from\"\n [dateTo]=\"filterForm.value?.date_to\"></app-timeline-filter>\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>Measure</mat-label>\n <app-searchable-selector apiUrl=\"api/product-measures\" formControlName=\"measure_ids\" [multiple]=\"true\">\n </app-searchable-selector>\n </mat-form-field>\n\n <mat-form-field>\n <mat-label>Location</mat-label>\n <app-searchable-selector apiUrl=\"api/inventory-locations\" formControlName=\"location_ids\" [multiple]=\"true\">\n </app-searchable-selector>\n </mat-form-field>\n </form>\n </mat-card-content>\n</mat-card>\n\n<mat-card>\n <mat-card-content *ngIf=\"product\" class=\"mb-0\">\n <div class=\"d-flex justify-content-start align-items-center gap-2 mb-2\">\n <span class=\"material-symbols-outlined\"> ungroup </span>\n <h3 class=\"mb-0\">Stock Issues</h3>\n\n <app-stock-issue-form-button class=\"mt-2\" [product]=\"product\" icon=\"add\"\n (saved)=\"reload(); listUpdated.emit()\"></app-stock-issue-form-button>\n </div>\n </mat-card-content>\n <mat-card-content class=\"p-0\">\n <table mat-table [dataSource]=\"models\" class=\"w-100\" aria-describedby=\"Stock Issuances\" 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 <!-- Product Column -->\n <ng-container matColumnDef=\"product\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Product</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\"\n [routerLink]=\"['/inventory/products', element?.stock_issue_products[0]?.product?.id, 'view']\">\n {{ element?.stock_issue_products[0]?.product.name }}\n </a>\n <app-product-category-badges\n [product]=\"element?.stock_issue_products[0]?.product\"></app-product-category-badges>\n </div>\n </td>\n </ng-container>\n\n <!-- SKU Column -->\n <ng-container matColumnDef=\"sku\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>SKU</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.stock_issue_products[0]?.product.sku }}</td>\n </ng-container>\n\n <!-- Date Column -->\n <ng-container matColumnDef=\"date\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Date</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.date | date }}</td>\n </ng-container>\n\n <!-- Location Column -->\n <ng-container matColumnDef=\"location\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Location</th>\n <td mat-cell *matCellDef=\"let element\">\n <a class=\"text-decoration-none text-dark\"\n [routerLink]=\"['/inventory/locations', element?.stock_issue_products[0]?.location_id, 'view']\">\n {{ element?.stock_issue_products[0]?.location?.title }}\n </a>\n </td>\n </ng-container>\n\n <!-- Related Column -->\n <ng-container matColumnDef=\"related\">\n <th mat-header-cell *matHeaderCellDef>Related</th>\n <td mat-cell *matCellDef=\"let element\">\n <a class=\"text-dark\" *ngIf=\"element?.issuable\" [routerLink]=\"['/maintenances', element?.issuable_id, 'view']\">\n Maintenance for {{ element?.issuable?.fixed_asset?.name }}\n </a>\n </td>\n </ng-container>\n\n <!-- Quantity Column -->\n <ng-container matColumnDef=\"quantity\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Quantity</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.stock_issue_products[0]?.quantity }} {{\n element?.stock_issue_products[0]?.product.measure?.title }}</td>\n </ng-container>\n\n <!-- Batch Column -->\n <ng-container matColumnDef=\"batch\">\n <th mat-header-cell *matHeaderCellDef>Batch</th>\n <td mat-cell *matCellDef=\"let element\">\n <p class=\"mb-0\" *ngIf=\"element?.stock_issue_products[0]?.batch?.batch_number\">{{ element?.stock_issue_products[0]?.batch?.batch_number }}</p>\n <small class=\"text-secondary\" *ngIf=\"element?.stock_issue_products[0]?.batch?.expires_on\">\n Expires {{ element?.stock_issue_products[0]?.batch?.expires_on | date }}\n </small>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"measure\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Measure</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.stock_issue_products[0]?.product.measure?.title }}</td>\n </ng-container>\n\n <!-- Purchase Price Column -->\n <ng-container matColumnDef=\"purchase_price\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Purchase Price</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.purchase_price | currency }}\n </td>\n </ng-container>\n\n <!-- Total Value Column -->\n <ng-container matColumnDef=\"amount\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Total Value</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.amount | currency }}\n </td>\n </ng-container>\n\n <!-- Particulars Column -->\n <ng-container matColumnDef=\"particulars\">\n <th mat-header-cell *matHeaderCellDef>Particulars</th>\n <td mat-cell *matCellDef=\"let element\">{{ element?.stock_issue_products[0]?.particulars }}</td>\n </ng-container>\n\n <!-- Supplier Column -->\n <ng-container matColumnDef=\"supplier\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>Supplier</th>\n <td mat-cell *matCellDef=\"let element\">\n {{ element?.supplier?.company_name }}\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-1\">{{ 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 *ngIf=\"!element.stock_transfer\" class=\"d-flex gap-1\">\n <app-stock-issue-form-button [stockIssue]=\"element\"\n (saved)=\"reload(); listUpdated.emit()\"></app-stock-issue-form-button>\n <app-stock-issuance-delete-button [stockIssuance]=\"element\"\n (deleted)=\"reload(); listUpdated.emit()\"></app-stock-issuance-delete-button>\n </div>\n\n <span *ngIf=\"element.stock_transfer\" class=\"badge rounded-pill text-bg-secondary\">Stock Transfer</span>\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 *ngIf=\"isWorking\" mode=\"indeterminate\"></mat-progress-bar>\n </mat-card-content>\n</mat-card>" }]
|
|
155
|
-
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.StockIssuanceService }, { type: i3.ActivatedRoute }, { type: i4.TechlifyFeatureService }], propDecorators: { product: [{
|
|
156
|
-
type: Input
|
|
157
|
-
}], issuableType: [{
|
|
158
|
-
type: Input
|
|
159
|
-
}], issuableId: [{
|
|
160
|
-
type: Input
|
|
161
|
-
}], label: [{
|
|
162
|
-
type: Input
|
|
163
|
-
}], showActions: [{
|
|
164
|
-
type: Input
|
|
165
|
-
}], showFilters: [{
|
|
166
|
-
type: Input
|
|
167
|
-
}], listUpdated: [{
|
|
168
|
-
type: Output
|
|
169
|
-
}] } });
|
|
170
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvY2staXNzdWFuY2VzLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW52ZW50b3J5LWNvbW1vbi9zcmMvbGliL2ludmVudG9yeS1jb21tb24vc3RvY2staXNzdWFuY2VzL3N0b2NrLWlzc3VhbmNlcy1saXN0L3N0b2NrLWlzc3VhbmNlcy1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ludmVudG9yeS1jb21tb24vc3JjL2xpYi9pbnZlbnRvcnktY29tbW9uL3N0b2NrLWlzc3VhbmNlcy9zdG9jay1pc3N1YW5jZXMtbGlzdC9zdG9jay1pc3N1YW5jZXMtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFFTCxrQ0FBa0MsRUFDbkMsTUFBTSxtQkFBbUIsQ0FBQztBQUUzQixPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSTFELE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTzVCLE1BQU0sT0FBTywyQkFBNEIsU0FBUSxrQ0FBa0M7SUF5QnZFO0lBQ0E7SUFDQTtJQUNBO0lBM0JELE9BQU8sQ0FBTTtJQUNiLFlBQVksQ0FBVTtJQUN0QixVQUFVLENBQVU7SUFDcEIsS0FBSyxHQUFHLGNBQWMsQ0FBQztJQUN2QixXQUFXLEdBQVksSUFBSSxDQUFDO0lBQzVCLFdBQVcsR0FBWSxJQUFJLENBQUM7SUFDM0IsV0FBVyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO0lBRW5FLHNCQUFzQixHQUFhO1FBQ2pDLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxV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LENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtTQUM3RCxFQUNELEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUNyQixDQUFDO0lBQ0osQ0FBQztJQUVPLFlBQVk7UUFDbEIsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNsRiwwQ0FBMEM7UUFDMUMsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2pFLElBQUksUUFBUSxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQy9ELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQzt3R0E5SVUsMkJBQTJCOzRGQUEzQiwyQkFBMkIsZ1NDakJ4QyxrOFJBdU1XOzs0RkR0TEUsMkJBQTJCO2tCQUx2QyxTQUFTOytCQUNFLDBCQUEwQjtxTEFLM0IsT0FBTztzQkFBZixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDb2x1bW5Db25maWcsIFJlcXVlc3RIZWxwZXJTZXJ2aWNlLCBUZWNobGlmeUZlYXR1cmVTZXJ2aWNlLFxuICBUZWNobGlmeUxpc3RpbmdDb250cm9sbGVySW50ZXJmYWNlLCBUaW1lbGluZVZhbHVlXG59IGZyb20gJ25neC10ZWNobGlmeS1jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTb3J0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQgeyBTdG9ja0lzc3VhbmNlU2VydmljZSB9IGZyb20gJy4uL3N0b2NrLWlzc3VhbmNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtc3RvY2staXNzdWFuY2VzLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RvY2staXNzdWFuY2VzLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdG9jay1pc3N1YW5jZXMtbGlzdC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBTdG9ja0lzc3VhbmNlc0xpc3RDb21wb25lbnQgZXh0ZW5kcyBUZWNobGlmeUxpc3RpbmdDb250cm9sbGVySW50ZXJmYWNlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgcHJvZHVjdDogYW55O1xuICBASW5wdXQoKSBpc3N1YWJsZVR5cGUhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGlzc3VhYmxlSWQhOiBudW1iZXI7XG4gIEBJbnB1dCgpIGxhYmVsID0gJ1N0b2NrIElzc3Vlcyc7XG4gIEBJbnB1dCgpIHNob3dBY3Rpb25zOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd0ZpbHRlcnM6IGJvb2xlYW4gPSB0cnVlO1xuICBAT3V0cHV0KCkgbGlzdFVwZGF0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgZGVmYXVsdFNlbGVjdGVkQ29sdW1uczogc3RyaW5nW10gPSBbXG4gICAgJ25vJywgJ3Byb2R1Y3QnLCAnc2t1JywgJ2RhdGUnLCAncXVhbnRpdHknLCAnbWVhc3VyZScsICdsb2NhdGlvbicsICdyZWxhdGVkJywgJ3BhcnRpY3VsYXJzJyxcbiAgXTtcblxuICBjb2x1bW5Db25maWc6IENvbHVtbkNvbmZpZ1tdID0gW1xuICAgIHsgbGFiZWw6ICdDcmVhdG9yJywgZGVmOiAnY3JlYXRvcicsIGlzU2VsZWN0ZWQ6IGZhbHNlLCBpc0VkaXRhYmxlOiB0cnVlIH0sXG4gIF07XG5cbiAgc2VsZWN0ZWRDb2x1bW5zOiBDb2x1bW5Db25maWdbXSA9IHRoaXMuY29sdW1uQ29uZmlnLmZpbHRlcihjb2wgPT4gY29sLmlzU2VsZWN0ZWQpO1xuXG4gIGdldCBkaXNwbGF5ZWRDb2x1bW5zKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzZWxlY3RlZENvbHVtbnM6IHN0cmluZ1tdID0gdGhpcy5zZWxlY3RlZENvbHVtbnMubWFwKGNvbCA9PiBjb2wuZGVmKTtcbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0U2VsZWN0ZWRDb2x1bW5zLmNvbmNhdCguLi5zZWxlY3RlZENvbHVtbnMsICdhY3Rpb25zJyk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIHN0b2NrSXNzdWFuY2VTZXJ2aWNlOiBTdG9ja0lzc3VhbmNlU2VydmljZSxcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIGZlYXR1cmVTZXJ2aWNlOiBUZWNobGlmeUZlYXR1cmVTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5sYXN0UGFnZSA9IDA7XG4gICAgdGhpcy5maWx0ZXJGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBjYXRlZ29yeV9pZHM6IFsnJ10sXG4gICAgICBkYXRlX2Zyb206IFsnJ10sXG4gICAgICBkYXRlX3RvOiBbJyddLFxuICAgICAgZHVyYXRpb246IFsnJ10sXG4gICAgICBpbXBvcnRfaWQ6IFsnJ10sXG4gICAgICBsb2NhdGlvbl9pZHM6IFsnJ10sXG4gICAgICBtZWFzdXJlX2lkczogWycnXSxcbiAgICAgIHByb2R1Y3RfaWRzOiBbJyddLFxuICAgICAgc2VhcmNoOiBbJyddLFxuICAgICAgc29ydF9ieTogWydkYXRlfGRlc2MnXSxcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZEZlYXR1cmVzKCk7XG4gICAgaWYgKHRoaXMucHJvZHVjdCkge1xuICAgICAgdGhpcy5maWx0ZXJGb3JtLmdldCgncHJvZHVjdF9pZHMnKT8uc2V0VmFsdWUodGhpcy5wcm9kdWN0Py5pZCk7XG4gICAgICB0aGlzLmRlZmF1bHRTZWxlY3RlZENvbHVtbnMgPSB0aGlzLmRlZmF1bHRTZWxlY3RlZENvbHVtbnMuZmlsdGVyKGMgPT4gYyAhPT0gJ3Byb2R1Y3QnICYmIGMgIT09ICdza3UnKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUZvcm1XaXRoUXVlcnlQYXJhbXMoKTtcbiAgICB0aGlzLnN1YnNjcmliZVRvRm9ybUNoYW5nZXMoKTtcbiAgICB0aGlzLnN1YnNjcmliZVRvUm91dGVDaGFuZ2VzKCk7XG4gIH1cblxuICBsb2FkRGF0YSgpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJhbXM6IGFueSA9IHtcbiAgICAgIHBhZ2U6IHRoaXMucGFnZSxcbiAgICAgIHBlclBhZ2U6IHRoaXMucGVyUGFnZSxcbiAgICAgIHdpdGg6IGBjcmVhdG9yLGlzc3VhYmxlLmZpeGVkQXNzZXQsc3RvY2tJc3N1ZVByb2R1Y3RzLnByb2R1Y3Qsc3RvY2tJc3N1ZVByb2R1Y3RzLmxvY2F0aW9uLHN0b2NrSXNzdWVQcm9kdWN0cy5wcm9kdWN0LmNhdGVnb3JpZXMsc3RvY2tUcmFuc2ZlcixzdG9ja0lzc3VlUHJvZHVjdHMuYmF0Y2hgLFxuICAgICAgLi4udGhpcy5yZXF1ZXN0SGVscGVyU2VydmljZS5jb252ZXJ0VG9Gb3JtRGF0YSh0aGlzLmZpbHRlckZvcm0udmFsdWUpLFxuICAgIH07XG4gICAgaWYgKHRoaXMuaXNzdWFibGVJZCAmJiB0aGlzLmlzc3VhYmxlVHlwZSkge1xuICAgICAgcGFyYW1zLmlzc3VhYmxlX2lkcyA9IHRoaXMuaXNzdWFibGVJZDtcbiAgICAgIHBhcmFtcy5pc3N1YWJsZV90eXBlcyA9IHRoaXMuaXNzdWFibGVUeXBlO1xuICAgIH1cbiAgICB0aGlzLmlzV29ya2luZyA9IHRydWU7XG4gICAgdGhpcy5zdG9ja0lzc3VhbmNlU2VydmljZS5pbmRleChwYXJhbXMpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm1vZGVscyA9IHRoaXMubW9kZWxzLmNvbmNhdChyZXNwb25zZT8uZGF0YSk7XG4gICAgICAgIHRoaXMubGFzdFBhZ2UgPSByZXNwb25zZT8ubGFzdF9wYWdlO1xuICAgICAgICB0aGlzLmlzV29ya2luZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNXb3JraW5nID0gZmFsc2U7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgb25Tb3J0Q2hhbmdlKHNvcnQ6IFNvcnQpIHtcbiAgICBsZXQgeyBhY3RpdmUsIGRpcmVjdGlvbiB9ID0gc29ydDtcbiAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgYWN0aXZlID0gJ2RhdGUnO1xuICAgIH1cbiAgICBpZiAoIWRpcmVjdGlvbikge1xuICAgICAgZGlyZWN0aW9uID0gJ2Rlc2MnO1xuICAgICAgYWN0aXZlID0gJ2RhdGUnO1xuICAgIH1cbiAgICB0aGlzLmZpbHRlckZvcm0uZ2V0KCdzb3J0X2J5Jykuc2V0VmFsdWUoYWN0aXZlICsgJ3wnICsgZGlyZWN0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRm9ybVdpdGhRdWVyeVBhcmFtcygpOiB2b2lkIHtcbiAgICB0aGlzLnJlcXVlc3RIZWxwZXJTZXJ2aWNlLnVwZGF0ZUZvcm1XaXRoUXVlcnlQYXJhbXModGhpcy5maWx0ZXJGb3JtLCB7XG4gICAgICBwcm9kdWN0X2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgICAgbWVhc3VyZV9pZHM6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICAgIGNhdGVnb3J5X2lkczogeyBtdWx0aXBsZTogdHJ1ZSB9LFxuICAgICAgc3VwcGxpZXJfaWRzOiB7IG11bHRpcGxlOiB0cnVlIH0sXG4gICAgICBsb2NhdGlvbl9pZHM6IHsgbXVsdGlwbGU6IHRydWUgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9Gb3JtQ2hhbmdlcygpOiB2b2lkIHtcbiAgICAodGhpcy5maWx0ZXJGb3JtIGFzIEZvcm1Hcm91cCkudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDgwMCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVxdWVzdEhlbHBlclNlcnZpY2UudXBkYXRlUXVlcnlQYXJhbXMoXG4gICAgICAgICAgdGhpcy5yZXF1ZXN0SGVscGVyU2VydmljZS5jb252ZXJ0VG9Gb3JtRGF0YSh0aGlzLmZpbHRlckZvcm0udmFsdWUpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZVRvUm91dGVDaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZhdGVkUm91dGUucXVlcnlQYXJhbXNcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSg1MDApLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG9uRHVyYXRpb25DaGFuZ2UodGltZWxpbmVWYWx1ZTogVGltZWxpbmVWYWx1ZSkge1xuICAgIGxldCB7IGRhdGVfdG8sIGRhdGVfZnJvbSB9ID0gdGltZWxpbmVWYWx1ZTtcbiAgICB0aGlzLmZpbHRlckZvcm0ucGF0Y2hWYWx1ZShcbiAgICAgIHtcbiAgICAgICAgZGF0ZV9mcm9tOiBkYXRlX2Zyb20gPyBtb21lbnQoZGF0ZV9mcm9tKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpIDogXCJcIixcbiAgICAgICAgZGF0ZV90bzogZGF0ZV90byA/IG1vbWVudChkYXRlX3RvKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpIDogXCJcIixcbiAgICAgIH0sXG4gICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRGZWF0dXJlcygpIHtcbiAgICBsZXQgaXNCYXRjaEVuYWJsZWQgPSB0aGlzLmZlYXR1cmVTZXJ2aWNlLmlzRmVhdHVyZUV4aXN0cygncHJvZHVjdC1iYXRjaC1udW1iZXJzJyk7XG4gICAgLy8gbm93IHVwZGF0ZSBkaXNwbGF5ZWRDb2x1bW5zIGFjY29yZGluZ2x5XG4gICAgaWYgKGlzQmF0Y2hFbmFibGVkKSB7XG4gICAgICBjb25zdCBxdHlJbmRleCA9IHRoaXMuZGVmYXVsdFNlbGVjdGVkQ29sdW1ucy5pbmRleE9mKCdxdWFudGl0eScpO1xuICAgICAgaWYgKHF0eUluZGV4ID49IDApIHtcbiAgICAgICAgdGhpcy5kZWZhdWx0U2VsZWN0ZWRDb2x1bW5zLnNwbGljZShxdHlJbmRleCArIDEsIDAsICdiYXRjaCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPG1hdC1jYXJkICpuZ0lmPVwiIXByb2R1Y3RcIiBjbGFzcz1cIm1iLTJcIj5cbiAgPG1hdC1jYXJkLWNvbnRlbnQgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCI+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtc3RhcnQgYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICA8aDMgY2xhc3M9XCJtYi0wXCI+e3sgbGFiZWwgfX08L2gzPlxuXG4gICAgICA8YXBwLXN0b2NrLWlzc3VlLWZvcm0tYnV0dG9uIGljb249XCJhZGRcIiBbaXNzdWFibGVUeXBlXT1cImlzc3VhYmxlVHlwZVwiIFtpc3N1YWJsZUlkXT1cImlzc3VhYmxlSWRcIlxuICAgICAgICAoc2F2ZWQpPVwicmVsb2FkKClcIj48L2FwcC1zdG9jay1pc3N1ZS1mb3JtLWJ1dHRvbj5cblxuICAgICAgPHNwYW4gKm5nSWY9XCJzaG93QWN0aW9uc1wiIG1hdFRvb2x0aXA9XCJJbXBvcnRcIiByb3V0ZXJMaW5rPVwiaW1wb3J0XCJcbiAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCI+XG4gICAgICAgIGZpbGVfdXBsb2FkXG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDxhcHAtY29sdW1uLXNlbGVjdG9yICpuZ0lmPVwic2hvd0FjdGlvbnNcIiBtb2RlPVwiaWNvblwiIGNsYXNzPVwibXQtMiBkLXByaW50LW5vbmVcIiBbY29sdW1uQ29uZmlnc109XCJjb2x1bW5Db25maWdcIlxuICAgICAgICBbKHNlbGVjdGVkQ29sdW1ucyldPVwic2VsZWN0ZWRDb2x1bW5zXCI+PC9hcHAtY29sdW1uLXNlbGVjdG9yPlxuICAgIDwvZGl2PlxuXG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtXCIgKm5nSWY9XCJzaG93RmlsdGVyc1wiPlxuICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8bWF0LWxhYmVsPlNlYXJjaDwvbWF0LWxhYmVsPlxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJTZWFyY2ggcHJvZHVjdHNcIiBmb3JtQ29udHJvbE5hbWU9XCJzZWFyY2hcIiAvPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgPGFwcC10aW1lbGluZS1maWx0ZXIgYXBwZWFyYW5jZT1cImZpbGxcIiBsYWJlbFRleHQ9XCJEYXRlXCIgZm9ybUNvbnRyb2xOYW1lPVwiZHVyYXRpb25cIlxuICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uRHVyYXRpb25DaGFuZ2UoJGV2ZW50KVwiIFtzaG93Q2xlYXJCdXR0b25dPVwidHJ1ZVwiIFtkYXRlRnJvbV09XCJmaWx0ZXJGb3JtLnZhbHVlPy5kYXRlX2Zyb21cIlxuICAgICAgICBbZGF0ZVRvXT1cImZpbHRlckZvcm0udmFsdWU/LmRhdGVfdG9cIj48L2FwcC10aW1lbGluZS1maWx0ZXI+XG5cbiAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPG1hdC1sYWJlbD5DYXRlZ29yeTwvbWF0LWxhYmVsPlxuICAgICAgICA8YXBwLXNlYXJjaGFibGUtc2VsZWN0b3IgYXBpVXJsPVwiYXBpL3Byb2R1Y3QtY2F0ZWdvcmllc1wiIGZvcm1Db250cm9sTmFtZT1cImNhdGVnb3J5X2lkc1wiIFttdWx0aXBsZV09XCJ0cnVlXCI+XG4gICAgICAgIDwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDxtYXQtbGFiZWw+TWVhc3VyZTwvbWF0LWxhYmVsPlxuICAgICAgICA8YXBwLXNlYXJjaGFibGUtc2VsZWN0b3IgYXBpVXJsPVwiYXBpL3Byb2R1Y3QtbWVhc3VyZXNcIiBmb3JtQ29udHJvbE5hbWU9XCJtZWFzdXJlX2lkc1wiIFttdWx0aXBsZV09XCJ0cnVlXCI+XG4gICAgICAgIDwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDxtYXQtbGFiZWw+TG9jYXRpb248L21hdC1sYWJlbD5cbiAgICAgICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yIGFwaVVybD1cImFwaS9pbnZlbnRvcnktbG9jYXRpb25zXCIgZm9ybUNvbnRyb2xOYW1lPVwibG9jYXRpb25faWRzXCIgW211bHRpcGxlXT1cInRydWVcIj5cbiAgICAgICAgPC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9mb3JtPlxuICA8L21hdC1jYXJkLWNvbnRlbnQ+XG48L21hdC1jYXJkPlxuXG48bWF0LWNhcmQ+XG4gIDxtYXQtY2FyZC1jb250ZW50ICpuZ0lmPVwicHJvZHVjdFwiIGNsYXNzPVwibWItMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LXN0YXJ0IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBtYi0yXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gdW5ncm91cCA8L3NwYW4+XG4gICAgICA8aDMgY2xhc3M9XCJtYi0wXCI+U3RvY2sgSXNzdWVzPC9oMz5cblxuICAgICAgPGFwcC1zdG9jay1pc3N1ZS1mb3JtLWJ1dHRvbiBjbGFzcz1cIm10LTJcIiBbcHJvZHVjdF09XCJwcm9kdWN0XCIgaWNvbj1cImFkZFwiXG4gICAgICAgIChzYXZlZCk9XCJyZWxvYWQoKTsgbGlzdFVwZGF0ZWQuZW1pdCgpXCI+PC9hcHAtc3RvY2staXNzdWUtZm9ybS1idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvbWF0LWNhcmQtY29udGVudD5cbiAgPG1hdC1jYXJkLWNvbnRlbnQgY2xhc3M9XCJwLTBcIj5cbiAgICA8dGFibGUgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cIm1vZGVsc1wiIGNsYXNzPVwidy0xMDBcIiBhcmlhLWRlc2NyaWJlZGJ5PVwiU3RvY2sgSXNzdWFuY2VzXCIgaW5maW5pdGVTY3JvbGxcbiAgICAgIFtpbmZpbml0ZVNjcm9sbERpc3RhbmNlXT1cIjJcIiBbaW5maW5pdGVTY3JvbGxUaHJvdHRsZV09XCI1MFwiIChzY3JvbGxlZCk9XCJvblNjcm9sbCgpXCIgbWF0U29ydFxuICAgICAgKG1hdFNvcnRDaGFuZ2UpPVwib25Tb3J0Q2hhbmdlKCRldmVudClcIj5cbiAgICAgIDwhLS0gIyBDb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIm5vXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IzwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50OyBsZXQgaSA9IGluZGV4XCI+e3sgaSArIDEgfX08L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gUHJvZHVjdCBDb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInByb2R1Y3RcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+UHJvZHVjdDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBnYXAtMVwiPlxuICAgICAgICAgICAgPGEgY2xhc3M9XCJ0ZXh0LWRlY29yYXRpb24tbm9uZSB0ZXh0LWRhcmtcIlxuICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJbJy9pbnZlbnRvcnkvcHJvZHVjdHMnLCBlbGVtZW50Py5zdG9ja19pc3N1ZV9wcm9kdWN0c1swXT8ucHJvZHVjdD8uaWQsICd2aWV3J11cIj5cbiAgICAgICAgICAgICAge3sgZWxlbWVudD8uc3RvY2tfaXNzdWVfcHJvZHVjdHNbMF0/LnByb2R1Y3QubmFtZSB9fVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPGFwcC1wcm9kdWN0LWNhdGVnb3J5LWJhZGdlc1xuICAgICAgICAgICAgICBbcHJvZHVjdF09XCJlbGVtZW50Py5zdG9ja19pc3N1ZV9wcm9kdWN0c1swXT8ucHJvZHVjdFwiPjwvYXBwLXByb2R1Y3QtY2F0ZWdvcnktYmFkZ2VzPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gU0tVIENvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2t1XCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPlNLVTwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3sgZWxlbWVudD8uc3RvY2tfaXNzdWVfcHJvZHVjdHNbMF0/LnByb2R1Y3Quc2t1IH19PC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIERhdGUgQ29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJkYXRlXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPkRhdGU8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7IGVsZW1lbnQ/LmRhdGUgfCBkYXRlIH19PC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIExvY2F0aW9uIENvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibG9jYXRpb25cIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+TG9jYXRpb248L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgIDxhIGNsYXNzPVwidGV4dC1kZWNvcmF0aW9uLW5vbmUgdGV4dC1kYXJrXCJcbiAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIlsnL2ludmVudG9yeS9sb2NhdGlvbnMnLCBlbGVtZW50Py5zdG9ja19pc3N1ZV9wcm9kdWN0c1swXT8ubG9jYXRpb25faWQsICd2aWV3J11cIj5cbiAgICAgICAgICAgIHt7IGVsZW1lbnQ/LnN0b2NrX2lzc3VlX3Byb2R1Y3RzWzBdPy5sb2NhdGlvbj8udGl0bGUgfX1cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBSZWxhdGVkIENvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwicmVsYXRlZFwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlJlbGF0ZWQ8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgIDxhIGNsYXNzPVwidGV4dC1kYXJrXCIgKm5nSWY9XCJlbGVtZW50Py5pc3N1YWJsZVwiIFtyb3V0ZXJMaW5rXT1cIlsnL21haW50ZW5hbmNlcycsIGVsZW1lbnQ/Lmlzc3VhYmxlX2lkLCAndmlldyddXCI+XG4gICAgICAgICAgICBNYWludGVuYW5jZSBmb3Ige3sgZWxlbWVudD8uaXNzdWFibGU/LmZpeGVkX2Fzc2V0Py5uYW1lIH19XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gUXVhbnRpdHkgQ29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJxdWFudGl0eVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5RdWFudGl0eTwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3sgZWxlbWVudD8uc3RvY2tfaXNzdWVfcHJvZHVjdHNbMF0/LnF1YW50aXR5IH19IHt7XG4gICAgICAgICAgZWxlbWVudD8uc3RvY2tfaXNzdWVfcHJvZHVjdHNbMF0/LnByb2R1Y3QubWVhc3VyZT8udGl0bGUgfX08L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gQmF0Y2ggQ29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJiYXRjaFwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPkJhdGNoPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICA8cCBjbGFzcz1cIm1iLTBcIiAqbmdJZj1cImVsZW1lbnQ/LnN0b2NrX2lzc3VlX3Byb2R1Y3RzWzBdPy5iYXRjaD8uYmF0Y2hfbnVtYmVyXCI+e3sgZWxlbWVudD8uc3RvY2tfaXNzdWVfcHJvZHVjdHNbMF0/LmJhdGNoPy5iYXRjaF9udW1iZXIgfX08L3A+XG4gICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1zZWNvbmRhcnlcIiAqbmdJZj1cImVsZW1lbnQ/LnN0b2NrX2lzc3VlX3Byb2R1Y3RzWzBdPy5iYXRjaD8uZXhwaXJlc19vblwiPlxuICAgICAgICAgICAgRXhwaXJlcyB7eyBlbGVtZW50Py5zdG9ja19pc3N1ZV9wcm9kdWN0c1swXT8uYmF0Y2g/LmV4cGlyZXNfb24gfCBkYXRlIH19XG4gICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIm1lYXN1cmVcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+TWVhc3VyZTwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3sgZWxlbWVudD8uc3RvY2tfaXNzdWVfcHJvZHVjdHNbMF0/LnByb2R1Y3QubWVhc3VyZT8udGl0bGUgfX08L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gUHVyY2hhc2UgUHJpY2UgQ29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJwdXJjaGFzZV9wcmljZVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5QdXJjaGFzZSBQcmljZTwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XG4gICAgICAgICAge3sgZWxlbWVudD8ucHVyY2hhc2VfcHJpY2UgfCBjdXJyZW5jeSB9fVxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gVG90YWwgVmFsdWUgQ29sdW1uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJhbW91bnRcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+VG90YWwgVmFsdWU8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgIHt7IGVsZW1lbnQ/LmFtb3VudCB8IGN1cnJlbmN5IH19XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBQYXJ0aWN1bGFycyBDb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInBhcnRpY3VsYXJzXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+UGFydGljdWxhcnM8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7IGVsZW1lbnQ/LnN0b2NrX2lzc3VlX3Byb2R1Y3RzWzBdPy5wYXJ0aWN1bGFycyB9fTwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTdXBwbGllciBDb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInN1cHBsaWVyXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPlN1cHBsaWVyPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cbiAgICAgICAgICB7eyBlbGVtZW50Py5zdXBwbGllcj8uY29tcGFueV9uYW1lIH19XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBDcmVhdG9yIENvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiY3JlYXRvclwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPkNyZWF0b3I8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgIDxwIGNsYXNzPVwibWItMVwiPnt7IGVsZW1lbnQ/LmNyZWF0b3I/Lm5hbWUgfX08L3A+XG4gICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1zZWNvbmRhcnlcIj57eyBlbGVtZW50Py5jcmVhdGVkX2F0IHwgZGF0ZSB9fTwvc21hbGw+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBBY3Rpb25zIENvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiYWN0aW9uc1wiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPkFjdGlvbnM8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIhZWxlbWVudC5zdG9ja190cmFuc2ZlclwiIGNsYXNzPVwiZC1mbGV4IGdhcC0xXCI+XG4gICAgICAgICAgICA8YXBwLXN0b2NrLWlzc3VlLWZvcm0tYnV0dG9uIFtzdG9ja0lzc3VlXT1cImVsZW1lbnRcIlxuICAgICAgICAgICAgICAoc2F2ZWQpPVwicmVsb2FkKCk7IGxpc3RVcGRhdGVkLmVtaXQoKVwiPjwvYXBwLXN0b2NrLWlzc3VlLWZvcm0tYnV0dG9uPlxuICAgICAgICAgICAgPGFwcC1zdG9jay1pc3N1YW5jZS1kZWxldGUtYnV0dG9uIFtzdG9ja0lzc3VhbmNlXT1cImVsZW1lbnRcIlxuICAgICAgICAgICAgICAoZGVsZXRlZCk9XCJyZWxvYWQoKTsgbGlzdFVwZGF0ZWQuZW1pdCgpXCI+PC9hcHAtc3RvY2staXNzdWFuY2UtZGVsZXRlLWJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZWxlbWVudC5zdG9ja190cmFuc2ZlclwiIGNsYXNzPVwiYmFkZ2Ugcm91bmRlZC1waWxsIHRleHQtYmctc2Vjb25kYXJ5XCI+U3RvY2sgVHJhbnNmZXI8L3NwYW4+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICA8L3RhYmxlPlxuXG4gICAgPG1hdC1wcm9ncmVzcy1iYXIgKm5nSWY9XCJpc1dvcmtpbmdcIiBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiPjwvbWF0LXByb2dyZXNzLWJhcj5cbiAgPC9tYXQtY2FyZC1jb250ZW50PlxuPC9tYXQtY2FyZD4iXX0=
|