angular-slickgrid 3.1.0 → 3.3.2
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/README.md +20 -24
- package/angular-slickgrid.metadata.json +1 -1
- package/app/modules/angular-slickgrid/components/angular-slickgrid.component.d.ts +11 -3
- package/app/modules/angular-slickgrid/index.d.ts +0 -1
- package/bundles/angular-slickgrid.umd.js +63 -212
- package/bundles/angular-slickgrid.umd.js.map +1 -1
- package/esm2015/app/modules/angular-slickgrid/components/angular-slickgrid.component.js +56 -36
- package/esm2015/app/modules/angular-slickgrid/extensions/rowDetailViewExtension.js +2 -2
- package/esm2015/app/modules/angular-slickgrid/index.js +1 -2
- package/esm2015/app/modules/angular-slickgrid/modules/angular-slickgrid.module.js +1 -4
- package/fesm2015/angular-slickgrid.js +59 -173
- package/fesm2015/angular-slickgrid.js.map +1 -1
- package/package.json +18 -10
- package/app/modules/angular-slickgrid/components/slick-pagination.component.d.ts +0 -42
- package/esm2015/app/modules/angular-slickgrid/components/slick-pagination.component.js +0 -137
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "angular-slickgrid",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.3.2",
|
|
4
4
|
"description": "Slickgrid components made available in Angular",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"angular",
|
|
@@ -11,27 +11,35 @@
|
|
|
11
11
|
],
|
|
12
12
|
"license": "MIT",
|
|
13
13
|
"author": "Ghislain B.",
|
|
14
|
+
"homepage": "https://ghiscoding.github.io/Angular-Slickgrid/",
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/ghiscoding/Angular-Slickgrid/issues"
|
|
17
|
+
},
|
|
14
18
|
"repository": {
|
|
15
19
|
"type": "git",
|
|
16
20
|
"url": "http://github.com/ghiscoding/angular-slickgrid"
|
|
17
21
|
},
|
|
18
22
|
"main": "bundles/angular-slickgrid.umd.js",
|
|
19
23
|
"private": false,
|
|
24
|
+
"comments": {
|
|
25
|
+
"new-release": "1- build library (ng-packagr), 2- 'prepare-release' (npm script) & publish to npm, typically 'npm publish dist' works if it does not then run script 'pack-lib' and 'npm publish [tar file]'"
|
|
26
|
+
},
|
|
20
27
|
"dependencies": {
|
|
21
|
-
"@slickgrid-universal/common": "^0.
|
|
22
|
-
"@slickgrid-universal/custom-footer-component": "^0.
|
|
23
|
-
"@slickgrid-universal/empty-warning-component": "^0.
|
|
24
|
-
"@slickgrid-universal/event-pub-sub": "^0.
|
|
25
|
-
"@slickgrid-universal/
|
|
26
|
-
"@
|
|
27
|
-
"@types/
|
|
28
|
+
"@slickgrid-universal/common": "^0.19.2",
|
|
29
|
+
"@slickgrid-universal/custom-footer-component": "^0.19.2",
|
|
30
|
+
"@slickgrid-universal/empty-warning-component": "^0.19.2",
|
|
31
|
+
"@slickgrid-universal/event-pub-sub": "^0.19.2",
|
|
32
|
+
"@slickgrid-universal/pagination-component": "^0.19.2",
|
|
33
|
+
"@slickgrid-universal/rxjs-observable": "^0.19.2",
|
|
34
|
+
"@types/dompurify": "^2.3.1",
|
|
35
|
+
"@types/jquery": "^3.5.8",
|
|
28
36
|
"dequal": "^2.0.2",
|
|
29
|
-
"dompurify": "^2.3.
|
|
37
|
+
"dompurify": "^2.3.3",
|
|
30
38
|
"font-awesome": "^4.7.0",
|
|
31
39
|
"jquery": "~3.5.1",
|
|
32
40
|
"jquery-ui-dist": "^1.12.1",
|
|
33
41
|
"moment-mini": "^2.24.0",
|
|
34
|
-
"rxjs": "
|
|
42
|
+
"rxjs": ">=7.0.0",
|
|
35
43
|
"tslib": "^2.2.0"
|
|
36
44
|
},
|
|
37
45
|
"peerDependencies": {
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { OnDestroy, OnInit } from '@angular/core';
|
|
2
|
-
import { TranslateService } from '@ngx-translate/core';
|
|
3
|
-
import { PaginationService } from '@slickgrid-universal/common';
|
|
4
|
-
import { GridOption } from './../models/index';
|
|
5
|
-
export declare class SlickPaginationComponent implements OnDestroy, OnInit {
|
|
6
|
-
private readonly translate;
|
|
7
|
-
gridOptions: GridOption;
|
|
8
|
-
paginationService: PaginationService;
|
|
9
|
-
private subscriptions;
|
|
10
|
-
private _enableTranslate;
|
|
11
|
-
private _gridOptions;
|
|
12
|
-
private _locales;
|
|
13
|
-
textItemsPerPage: string;
|
|
14
|
-
textItems: string;
|
|
15
|
-
textOf: string;
|
|
16
|
-
textPage: string;
|
|
17
|
-
/** Constructor */
|
|
18
|
-
constructor(translate: TranslateService);
|
|
19
|
-
get availablePageSizes(): number[];
|
|
20
|
-
get dataFrom(): number;
|
|
21
|
-
get dataTo(): number;
|
|
22
|
-
/** is the left side pagination disabled? */
|
|
23
|
-
get isLeftPaginationDisabled(): boolean;
|
|
24
|
-
/** is the right side pagination disabled? */
|
|
25
|
-
get isRightPaginationDisabled(): boolean;
|
|
26
|
-
get itemsPerPage(): number;
|
|
27
|
-
get pageCount(): number;
|
|
28
|
-
get pageNumber(): number;
|
|
29
|
-
set pageNumber(page: number);
|
|
30
|
-
get totalItems(): number;
|
|
31
|
-
ngOnDestroy(): void;
|
|
32
|
-
ngOnInit(): void;
|
|
33
|
-
changeToFirstPage(event: MouseEvent): void;
|
|
34
|
-
changeToLastPage(event: MouseEvent): void;
|
|
35
|
-
changeToNextPage(event: MouseEvent): void;
|
|
36
|
-
changeToPreviousPage(event: MouseEvent): void;
|
|
37
|
-
changeToCurrentPage(event: any): void;
|
|
38
|
-
changeItemPerPage(event: any): void;
|
|
39
|
-
dispose(): void;
|
|
40
|
-
/** Translate all the texts shown in the UI, use ngx-translate service when available or custom locales when service is null */
|
|
41
|
-
private translateAllUiTexts;
|
|
42
|
-
}
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import { Component, Input, Optional } from '@angular/core';
|
|
2
|
-
import { TranslateService } from '@ngx-translate/core';
|
|
3
|
-
import { getTranslationPrefix } from '@slickgrid-universal/common';
|
|
4
|
-
import { Constants } from '../constants';
|
|
5
|
-
import { unsubscribeAllObservables } from '../services/utilities';
|
|
6
|
-
export class SlickPaginationComponent {
|
|
7
|
-
/** Constructor */
|
|
8
|
-
constructor(translate) {
|
|
9
|
-
this.translate = translate;
|
|
10
|
-
this.subscriptions = [];
|
|
11
|
-
this._enableTranslate = false;
|
|
12
|
-
// text translations (handled by ngx-translate or by custom locale)
|
|
13
|
-
this.textItemsPerPage = 'items per page';
|
|
14
|
-
this.textItems = 'items';
|
|
15
|
-
this.textOf = 'of';
|
|
16
|
-
this.textPage = 'Page';
|
|
17
|
-
}
|
|
18
|
-
get availablePageSizes() {
|
|
19
|
-
return this.paginationService.availablePageSizes;
|
|
20
|
-
}
|
|
21
|
-
get dataFrom() {
|
|
22
|
-
return this.paginationService.dataFrom;
|
|
23
|
-
}
|
|
24
|
-
get dataTo() {
|
|
25
|
-
return this.paginationService.dataTo;
|
|
26
|
-
}
|
|
27
|
-
/** is the left side pagination disabled? */
|
|
28
|
-
get isLeftPaginationDisabled() {
|
|
29
|
-
return this.pageNumber === 1 || this.totalItems === 0;
|
|
30
|
-
}
|
|
31
|
-
/** is the right side pagination disabled? */
|
|
32
|
-
get isRightPaginationDisabled() {
|
|
33
|
-
return this.pageNumber === this.pageCount || this.totalItems === 0;
|
|
34
|
-
}
|
|
35
|
-
get itemsPerPage() {
|
|
36
|
-
return this.paginationService.itemsPerPage;
|
|
37
|
-
}
|
|
38
|
-
get pageCount() {
|
|
39
|
-
return this.paginationService.pageCount;
|
|
40
|
-
}
|
|
41
|
-
get pageNumber() {
|
|
42
|
-
return this.paginationService.pageNumber;
|
|
43
|
-
}
|
|
44
|
-
set pageNumber(page) {
|
|
45
|
-
// the setter has to be declared but we won't use it, instead we will use the "changeToCurrentPage()" to only update the value after ENTER keydown event
|
|
46
|
-
}
|
|
47
|
-
get totalItems() {
|
|
48
|
-
return this.paginationService.totalItems;
|
|
49
|
-
}
|
|
50
|
-
ngOnDestroy() {
|
|
51
|
-
this.dispose();
|
|
52
|
-
}
|
|
53
|
-
ngOnInit() {
|
|
54
|
-
this._gridOptions = this.gridOptions || {};
|
|
55
|
-
this._enableTranslate = this._gridOptions && this._gridOptions.enableTranslate || false;
|
|
56
|
-
this._locales = this._gridOptions && this._gridOptions.locales || Constants.locales;
|
|
57
|
-
if (this._enableTranslate && !this.translate) {
|
|
58
|
-
throw new Error('[Angular-Slickgrid] requires "ngx-translate" to be installed and configured when the grid option "enableTranslate" is enabled.');
|
|
59
|
-
}
|
|
60
|
-
this.translateAllUiTexts(this._locales);
|
|
61
|
-
// translate all the text using ngx-translate or custom locales
|
|
62
|
-
if (this._enableTranslate && this.translate && this.translate.onLangChange) {
|
|
63
|
-
this.subscriptions.push(this.translate.onLangChange.subscribe(() => this.translateAllUiTexts(this._locales)));
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
changeToFirstPage(event) {
|
|
67
|
-
if (!this.isLeftPaginationDisabled) {
|
|
68
|
-
this.paginationService.goToFirstPage(event);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
changeToLastPage(event) {
|
|
72
|
-
if (!this.isRightPaginationDisabled) {
|
|
73
|
-
this.paginationService.goToLastPage(event);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
changeToNextPage(event) {
|
|
77
|
-
if (!this.isRightPaginationDisabled) {
|
|
78
|
-
this.paginationService.goToNextPage(event);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
changeToPreviousPage(event) {
|
|
82
|
-
if (!this.isLeftPaginationDisabled) {
|
|
83
|
-
this.paginationService.goToPreviousPage(event);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
changeToCurrentPage(event) {
|
|
87
|
-
let pageNumber = 1;
|
|
88
|
-
if (event && event.currentTarget && event.currentTarget.value) {
|
|
89
|
-
pageNumber = +(event.currentTarget.value);
|
|
90
|
-
}
|
|
91
|
-
this.paginationService.goToPageNumber(pageNumber, event);
|
|
92
|
-
}
|
|
93
|
-
changeItemPerPage(event) {
|
|
94
|
-
let itemsPerPage = 1;
|
|
95
|
-
if (event && event.currentTarget && event.currentTarget.value) {
|
|
96
|
-
itemsPerPage = +(event.currentTarget.value);
|
|
97
|
-
}
|
|
98
|
-
this.paginationService.changeItemPerPage(itemsPerPage, event);
|
|
99
|
-
}
|
|
100
|
-
dispose() {
|
|
101
|
-
// also unsubscribe all Angular Subscriptions
|
|
102
|
-
this.subscriptions = unsubscribeAllObservables(this.subscriptions);
|
|
103
|
-
}
|
|
104
|
-
// --
|
|
105
|
-
// private functions
|
|
106
|
-
// --------------------
|
|
107
|
-
/** Translate all the texts shown in the UI, use ngx-translate service when available or custom locales when service is null */
|
|
108
|
-
translateAllUiTexts(locales) {
|
|
109
|
-
if (this._enableTranslate && this.translate && this.translate.instant && this.translate.currentLang) {
|
|
110
|
-
const translationPrefix = getTranslationPrefix(this._gridOptions);
|
|
111
|
-
this.textItemsPerPage = this.translate.instant(`${translationPrefix}ITEMS_PER_PAGE`);
|
|
112
|
-
this.textItems = this.translate.instant(`${translationPrefix}ITEMS`);
|
|
113
|
-
this.textOf = this.translate.instant(`${translationPrefix}OF`);
|
|
114
|
-
this.textPage = this.translate.instant(`${translationPrefix}PAGE`);
|
|
115
|
-
}
|
|
116
|
-
else if (locales) {
|
|
117
|
-
this.textItemsPerPage = locales.TEXT_ITEMS_PER_PAGE || 'TEXT_ITEMS_PER_PAGE';
|
|
118
|
-
this.textItems = locales.TEXT_ITEMS || 'TEXT_ITEMS';
|
|
119
|
-
this.textOf = locales.TEXT_OF || 'TEXT_OF';
|
|
120
|
-
this.textPage = locales.TEXT_PAGE || 'TEXT_PAGE';
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
SlickPaginationComponent.decorators = [
|
|
125
|
-
{ type: Component, args: [{
|
|
126
|
-
selector: 'slick-pagination',
|
|
127
|
-
template: "<div class=\"slick-pagination\">\r\n <div class=\"slick-pagination-nav\">\r\n <nav aria-label=\"Page navigation\">\r\n <ul class=\"pagination\">\r\n <li class=\"page-item\" [ngClass]=\"isLeftPaginationDisabled ? 'disabled' : ''\">\r\n <a class=\"page-link icon-seek-first fa fa-angle-double-left\" aria-label=\"First\"\r\n (click)=\"changeToFirstPage($event)\">\r\n </a>\r\n </li>\r\n <li class=\"page-item\" [ngClass]=\"isLeftPaginationDisabled ? 'disabled' : ''\">\r\n <a class=\"page-link icon-seek-prev fa fa-angle-left\" aria-label=\"Previous\"\r\n (click)=\"changeToPreviousPage($event)\">\r\n </a>\r\n </li>\r\n </ul>\r\n </nav>\r\n\r\n <div class=\"slick-page-number\">\r\n <span>{{textPage}}</span>\r\n <input type=\"text\" class=\"form-control\" data-test=\"page-number-input\" [value]=\"pageNumber\" size=\"1\"\r\n [readOnly]=\"totalItems === 0\" (change)=\"changeToCurrentPage($event)\">\r\n <span>{{textOf}}</span><span data-test=\"page-count\"> {{pageCount}}</span>\r\n </div>\r\n\r\n <nav aria-label=\"Page navigation\">\r\n <ul class=\"pagination\">\r\n <li class=\"page-item\" [ngClass]=\"isRightPaginationDisabled ? 'disabled' : ''\">\r\n <a class=\"page-link icon-seek-next text-center fa fa-lg fa-angle-right\" aria-label=\"Next\"\r\n (click)=\"changeToNextPage($event)\">\r\n </a>\r\n </li>\r\n <li class=\"page-item\" [ngClass]=\"isRightPaginationDisabled ? 'disabled' : ''\">\r\n <a class=\"page-link icon-seek-end fa fa-lg fa-angle-double-right\" aria-label=\"Last\"\r\n (click)=\"changeToLastPage($event)\">\r\n </a>\r\n </li>\r\n </ul>\r\n </nav>\r\n </div>\r\n <span class=\"slick-pagination-settings\">\r\n <select id=\"items-per-page-label\" (change)=\"changeItemPerPage($event)\">\r\n <option value=\"{{pageSize}}\" [selected]=\"pageSize === itemsPerPage\" *ngFor=\"let pageSize of availablePageSizes\">{{pageSize}}</option>\r\n </select>\r\n <span>{{textItemsPerPage}}</span>,\r\n <span class=\"slick-pagination-count\">\r\n <span *ngIf=\"totalItems\">\r\n <span class=\"page-info-from-to\">\r\n <span data-test=\"item-from\">{{dataFrom}}</span>-<span data-test=\"item-to\">{{dataTo}}</span>\r\n {{textOf}}\r\n </span>\r\n </span>\r\n <span class=\"page-info-total-items\">\r\n <span data-test=\"total-items\">{{totalItems}}</span> {{textItems}}\r\n </span>\r\n </span>\r\n </span>\r\n</div>\r\n"
|
|
128
|
-
},] }
|
|
129
|
-
];
|
|
130
|
-
SlickPaginationComponent.ctorParameters = () => [
|
|
131
|
-
{ type: TranslateService, decorators: [{ type: Optional }] }
|
|
132
|
-
];
|
|
133
|
-
SlickPaginationComponent.propDecorators = {
|
|
134
|
-
gridOptions: [{ type: Input }],
|
|
135
|
-
paginationService: [{ type: Input }]
|
|
136
|
-
};
|
|
137
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2stcGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvYW5ndWxhci1zbGlja2dyaWQvY29tcG9uZW50cy9zbGljay1wYWdpbmF0aW9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBcUIsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxvQkFBb0IsRUFBNkIsTUFBTSw2QkFBNkIsQ0FBQztBQUc5RixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXpDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBTWxFLE1BQU0sT0FBTyx3QkFBd0I7SUFlbkMsa0JBQWtCO0lBQ2xCLFlBQXlDLFNBQTJCO1FBQTNCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBWjVELGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztRQUNuQyxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFJakMsbUVBQW1FO1FBQ25FLHFCQUFnQixHQUFHLGdCQUFnQixDQUFDO1FBQ3BDLGNBQVMsR0FBRyxPQUFPLENBQUM7UUFDcEIsV0FBTSxHQUFHLElBQUksQ0FBQztRQUNkLGFBQVEsR0FBRyxNQUFNLENBQUM7SUFHc0QsQ0FBQztJQUV6RSxJQUFJLGtCQUFrQjtRQUNwQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQztJQUNuRCxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENB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Z0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLGlCQUFpQixnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3JGLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxpQkFBaUIsT0FBTyxDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLGlCQUFpQixJQUFJLENBQUMsQ0FBQztZQUMvRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsaUJBQWlCLE1BQU0sQ0FBQyxDQUFDO1NBQ3BFO2FBQU0sSUFBSSxPQUFPLEVBQUU7WUFDbEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsSUFBSSxxQkFBcUIsQ0FBQztZQUM3RSxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxVQUFVLElBQUksWUFBWSxDQUFDO1lBQ3BELElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxTQUFTLENBQUM7WUFDM0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLFdBQVcsQ0FBQztTQUNsRDtJQUNILENBQUM7OztZQW5KRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGtCQUFrQjtnQkFDNUIsc21GQUFnRDthQUNqRDs7O1lBWFEsZ0JBQWdCLHVCQTRCVixRQUFROzs7MEJBZnBCLEtBQUs7Z0NBQ0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7IGdldFRyYW5zbGF0aW9uUHJlZml4LCBMb2NhbGUsIFBhZ2luYXRpb25TZXJ2aWNlIH0gZnJvbSAnQHNsaWNrZ3JpZC11bml2ZXJzYWwvY29tbW9uJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tICcuLi9jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBHcmlkT3B0aW9uLCB9IGZyb20gJy4vLi4vbW9kZWxzL2luZGV4JztcclxuaW1wb3J0IHsgdW5zdWJzY3JpYmVBbGxPYnNlcnZhYmxlcyB9IGZyb20gJy4uL3NlcnZpY2VzL3V0aWxpdGllcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NsaWNrLXBhZ2luYXRpb24nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zbGljay1wYWdpbmF0aW9uLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU2xpY2tQYWdpbmF0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBPbkluaXQge1xyXG4gIEBJbnB1dCgpIGdyaWRPcHRpb25zITogR3JpZE9wdGlvbjtcclxuICBASW5wdXQoKSBwYWdpbmF0aW9uU2VydmljZSE6IFBhZ2luYXRpb25TZXJ2aWNlO1xyXG5cclxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcbiAgcHJpdmF0ZSBfZW5hYmxlVHJhbnNsYXRlID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfZ3JpZE9wdGlvbnMhOiBHcmlkT3B0aW9uO1xyXG4gIHByaXZhdGUgX2xvY2FsZXMhOiBMb2NhbGU7XHJcblxyXG4gIC8vIHRleHQgdHJhbnNsYXRpb25zIChoYW5kbGVkIGJ5IG5neC10cmFuc2xhdGUgb3IgYnkgY3VzdG9tIGxvY2FsZSlcclxuICB0ZXh0SXRlbXNQZXJQYWdlID0gJ2l0ZW1zIHBlciBwYWdlJztcclxuICB0ZXh0SXRlbXMgPSAnaXRlbXMnO1xyXG4gIHRleHRPZiA9ICdvZic7XHJcbiAgdGV4dFBhZ2UgPSAnUGFnZSc7XHJcblxyXG4gIC8qKiBDb25zdHJ1Y3RvciAqL1xyXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlKSB7IH1cclxuXHJcbiAgZ2V0IGF2YWlsYWJsZVBhZ2VTaXplcygpOiBudW1iZXJbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5wYWdpbmF0aW9uU2VydmljZS5hdmFpbGFibGVQYWdlU2l6ZXM7XHJcbiAgfVxyXG5cclxuICBnZXQgZGF0YUZyb20oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLmRhdGFGcm9tO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRhdGFUbygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMucGFnaW5hdGlvblNlcnZpY2UuZGF0YVRvO1xyXG4gIH1cclxuXHJcbiAgLyoqIGlzIHRoZSBsZWZ0IHNpZGUgcGFnaW5hdGlvbiBkaXNhYmxlZD8gKi9cclxuICBnZXQgaXNMZWZ0UGFnaW5hdGlvbkRpc2FibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucGFnZU51bWJlciA9PT0gMSB8fCB0aGlzLnRvdGFsSXRlbXMgPT09IDA7XHJcbiAgfVxyXG5cclxuICAvKiogaXMgdGhlIHJpZ2h0IHNpZGUgcGFnaW5hdGlvbiBkaXNhYmxlZD8gKi9cclxuICBnZXQgaXNSaWdodFBhZ2luYXRpb25EaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnBhZ2VOdW1iZXIgPT09IHRoaXMucGFnZUNvdW50IHx8IHRoaXMudG90YWxJdGVtcyA9PT0gMDtcclxuICB9XHJcblxyXG4gIGdldCBpdGVtc1BlclBhZ2UoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLml0ZW1zUGVyUGFnZTtcclxuICB9XHJcblxyXG4gIGdldCBwYWdlQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLnBhZ2VDb3VudDtcclxuICB9XHJcblxyXG4gIGdldCBwYWdlTnVtYmVyKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5wYWdpbmF0aW9uU2VydmljZS5wYWdlTnVtYmVyO1xyXG4gIH1cclxuICBzZXQgcGFnZU51bWJlcihwYWdlOiBudW1iZXIpIHtcclxuICAgIC8vIHRoZSBzZXR0ZXIgaGFzIHRvIGJlIGRlY2xhcmVkIGJ1dCB3ZSB3b24ndCB1c2UgaXQsIGluc3RlYWQgd2Ugd2lsbCB1c2UgdGhlIFwiY2hhbmdlVG9DdXJyZW50UGFnZSgpXCIgdG8gb25seSB1cGRhdGUgdGhlIHZhbHVlIGFmdGVyIEVOVEVSIGtleWRvd24gZXZlbnRcclxuICB9XHJcblxyXG4gIGdldCB0b3RhbEl0ZW1zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucGFnaW5hdGlvblNlcnZpY2UudG90YWxJdGVtcztcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5kaXNwb3NlKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuX2dyaWRPcHRpb25zID0gdGhpcy5ncmlkT3B0aW9ucyB8fCB7fTtcclxuICAgIHRoaXMuX2VuYWJsZVRyYW5zbGF0ZSA9IHRoaXMuX2dyaWRPcHRpb25zICYmIHRoaXMuX2dyaWRPcHRpb25zLmVuYWJsZVRyYW5zbGF0ZSB8fCBmYWxzZTtcclxuICAgIHRoaXMuX2xvY2FsZXMgPSB0aGlzLl9ncmlkT3B0aW9ucyAmJiB0aGlzLl9ncmlkT3B0aW9ucy5sb2NhbGVzIHx8IENvbnN0YW50cy5sb2NhbGVzO1xyXG5cclxuICAgIGlmICh0aGlzLl9lbmFibGVUcmFuc2xhdGUgJiYgIXRoaXMudHJhbnNsYXRlKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignW0FuZ3VsYXItU2xpY2tncmlkXSByZXF1aXJlcyBcIm5neC10cmFuc2xhdGVcIiB0byBiZSBpbnN0YWxsZWQgYW5kIGNvbmZpZ3VyZWQgd2hlbiB0aGUgZ3JpZCBvcHRpb24gXCJlbmFibGVUcmFuc2xhdGVcIiBpcyBlbmFibGVkLicpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudHJhbnNsYXRlQWxsVWlUZXh0cyh0aGlzLl9sb2NhbGVzKTtcclxuXHJcbiAgICAvLyB0cmFuc2xhdGUgYWxsIHRoZSB0ZXh0IHVzaW5nIG5neC10cmFuc2xhdGUgb3IgY3VzdG9tIGxvY2FsZXNcclxuICAgIGlmICh0aGlzLl9lbmFibGVUcmFuc2xhdGUgJiYgdGhpcy50cmFuc2xhdGUgJiYgdGhpcy50cmFuc2xhdGUub25MYW5nQ2hhbmdlKSB7XHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMudHJhbnNsYXRlLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoKCkgPT4gdGhpcy50cmFuc2xhdGVBbGxVaVRleHRzKHRoaXMuX2xvY2FsZXMpKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VUb0ZpcnN0UGFnZShldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKCF0aGlzLmlzTGVmdFBhZ2luYXRpb25EaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLmdvVG9GaXJzdFBhZ2UoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hhbmdlVG9MYXN0UGFnZShldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKCF0aGlzLmlzUmlnaHRQYWdpbmF0aW9uRGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5nb1RvTGFzdFBhZ2UoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hhbmdlVG9OZXh0UGFnZShldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKCF0aGlzLmlzUmlnaHRQYWdpbmF0aW9uRGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5nb1RvTmV4dFBhZ2UoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hhbmdlVG9QcmV2aW91c1BhZ2UoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGlmICghdGhpcy5pc0xlZnRQYWdpbmF0aW9uRGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5nb1RvUHJldmlvdXNQYWdlKGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNoYW5nZVRvQ3VycmVudFBhZ2UoZXZlbnQ6IGFueSkge1xyXG4gICAgbGV0IHBhZ2VOdW1iZXIgPSAxO1xyXG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LmN1cnJlbnRUYXJnZXQgJiYgZXZlbnQuY3VycmVudFRhcmdldC52YWx1ZSkge1xyXG4gICAgICBwYWdlTnVtYmVyID0gKyhldmVudC5jdXJyZW50VGFyZ2V0LnZhbHVlKTtcclxuICAgIH1cclxuICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UuZ29Ub1BhZ2VOdW1iZXIocGFnZU51bWJlciwgZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgY2hhbmdlSXRlbVBlclBhZ2UoZXZlbnQ6IGFueSkge1xyXG4gICAgbGV0IGl0ZW1zUGVyUGFnZSA9IDE7XHJcbiAgICBpZiAoZXZlbnQgJiYgZXZlbnQuY3VycmVudFRhcmdldCAmJiBldmVudC5jdXJyZW50VGFyZ2V0LnZhbHVlKSB7XHJcbiAgICAgIGl0ZW1zUGVyUGFnZSA9ICsoZXZlbnQuY3VycmVudFRhcmdldC52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLmNoYW5nZUl0ZW1QZXJQYWdlKGl0ZW1zUGVyUGFnZSwgZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgIC8vIGFsc28gdW5zdWJzY3JpYmUgYWxsIEFuZ3VsYXIgU3Vic2NyaXB0aW9uc1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zID0gdW5zdWJzY3JpYmVBbGxPYnNlcnZhYmxlcyh0aGlzLnN1YnNjcmlwdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgLy8gLS1cclxuICAvLyBwcml2YXRlIGZ1bmN0aW9uc1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKiBUcmFuc2xhdGUgYWxsIHRoZSB0ZXh0cyBzaG93biBpbiB0aGUgVUksIHVzZSBuZ3gtdHJhbnNsYXRlIHNlcnZpY2Ugd2hlbiBhdmFpbGFibGUgb3IgY3VzdG9tIGxvY2FsZXMgd2hlbiBzZXJ2aWNlIGlzIG51bGwgKi9cclxuICBwcml2YXRlIHRyYW5zbGF0ZUFsbFVpVGV4dHMobG9jYWxlczogTG9jYWxlKSB7XHJcbiAgICBpZiAodGhpcy5fZW5hYmxlVHJhbnNsYXRlICYmIHRoaXMudHJhbnNsYXRlICYmIHRoaXMudHJhbnNsYXRlLmluc3RhbnQgJiYgdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmcpIHtcclxuICAgICAgY29uc3QgdHJhbnNsYXRpb25QcmVmaXggPSBnZXRUcmFuc2xhdGlvblByZWZpeCh0aGlzLl9ncmlkT3B0aW9ucyk7XHJcbiAgICAgIHRoaXMudGV4dEl0ZW1zUGVyUGFnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dHJhbnNsYXRpb25QcmVmaXh9SVRFTVNfUEVSX1BBR0VgKTtcclxuICAgICAgdGhpcy50ZXh0SXRlbXMgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RyYW5zbGF0aW9uUHJlZml4fUlURU1TYCk7XHJcbiAgICAgIHRoaXMudGV4dE9mID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0cmFuc2xhdGlvblByZWZpeH1PRmApO1xyXG4gICAgICB0aGlzLnRleHRQYWdlID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0cmFuc2xhdGlvblByZWZpeH1QQUdFYCk7XHJcbiAgICB9IGVsc2UgaWYgKGxvY2FsZXMpIHtcclxuICAgICAgdGhpcy50ZXh0SXRlbXNQZXJQYWdlID0gbG9jYWxlcy5URVhUX0lURU1TX1BFUl9QQUdFIHx8ICdURVhUX0lURU1TX1BFUl9QQUdFJztcclxuICAgICAgdGhpcy50ZXh0SXRlbXMgPSBsb2NhbGVzLlRFWFRfSVRFTVMgfHwgJ1RFWFRfSVRFTVMnO1xyXG4gICAgICB0aGlzLnRleHRPZiA9IGxvY2FsZXMuVEVYVF9PRiB8fCAnVEVYVF9PRic7XHJcbiAgICAgIHRoaXMudGV4dFBhZ2UgPSBsb2NhbGVzLlRFWFRfUEFHRSB8fCAnVEVYVF9QQUdFJztcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
|