barsa-user-workspace 0.0.0-watch

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +24 -0
  2. package/esm2022/barsa-user-workspace.mjs +5 -0
  3. package/esm2022/lib/barsa-user-workspace.module.mjs +82 -0
  4. package/esm2022/lib/coercion/boolean-property.mjs +5 -0
  5. package/esm2022/lib/coercion/number-property.mjs +14 -0
  6. package/esm2022/lib/directives/drag-handle.mjs +29 -0
  7. package/esm2022/lib/directives/placeholder.mjs +31 -0
  8. package/esm2022/lib/directives/resize-handle.mjs +29 -0
  9. package/esm2022/lib/grid/grid.component.mjs +609 -0
  10. package/esm2022/lib/grid-item/grid-item.component.mjs +196 -0
  11. package/esm2022/lib/grid.definitions.mjs +3 -0
  12. package/esm2022/lib/grid.service.mjs +49 -0
  13. package/esm2022/lib/layout-container/layout-container.component.mjs +213 -0
  14. package/esm2022/lib/layout-grid-mapper.pipe.mjs +29 -0
  15. package/esm2022/lib/nav-container/nav-container.component.mjs +27 -0
  16. package/esm2022/lib/report-grid-layout/report-grid-layout.component.mjs +15 -0
  17. package/esm2022/lib/utils/client-rect.mjs +57 -0
  18. package/esm2022/lib/utils/grid.utils.mjs +225 -0
  19. package/esm2022/lib/utils/operators.mjs +17 -0
  20. package/esm2022/lib/utils/passive-listeners.mjs +29 -0
  21. package/esm2022/lib/utils/pointer.utils.mjs +110 -0
  22. package/esm2022/lib/utils/react-grid-layout.utils.mjs +493 -0
  23. package/esm2022/lib/utils/scroll.mjs +233 -0
  24. package/esm2022/lib/utils/transition-duration.mjs +34 -0
  25. package/esm2022/lib/utils.mjs +14 -0
  26. package/esm2022/public-api.mjs +15 -0
  27. package/esm2022/types.mjs +2 -0
  28. package/fesm2022/barsa-user-workspace.mjs +2469 -0
  29. package/fesm2022/barsa-user-workspace.mjs.map +1 -0
  30. package/index.d.ts +5 -0
  31. package/lib/barsa-user-workspace.module.d.ts +34 -0
  32. package/lib/coercion/boolean-property.d.ts +7 -0
  33. package/lib/coercion/number-property.d.ts +9 -0
  34. package/lib/directives/drag-handle.d.ts +15 -0
  35. package/lib/directives/placeholder.d.ts +17 -0
  36. package/lib/directives/resize-handle.d.ts +15 -0
  37. package/lib/grid/grid.component.d.ts +147 -0
  38. package/lib/grid-item/grid-item.component.d.ts +83 -0
  39. package/lib/grid.definitions.d.ts +61 -0
  40. package/lib/grid.service.d.ts +15 -0
  41. package/lib/layout-container/layout-container.component.d.ts +79 -0
  42. package/lib/layout-grid-mapper.pipe.d.ts +9 -0
  43. package/lib/nav-container/nav-container.component.d.ts +10 -0
  44. package/lib/report-grid-layout/report-grid-layout.component.d.ts +7 -0
  45. package/lib/utils/client-rect.d.ts +36 -0
  46. package/lib/utils/grid.utils.d.ts +45 -0
  47. package/lib/utils/operators.d.ts +6 -0
  48. package/lib/utils/passive-listeners.d.ts +12 -0
  49. package/lib/utils/pointer.utils.d.ts +29 -0
  50. package/lib/utils/react-grid-layout.utils.d.ts +177 -0
  51. package/lib/utils/scroll.d.ts +28 -0
  52. package/lib/utils/transition-duration.d.ts +6 -0
  53. package/lib/utils.d.ts +6 -0
  54. package/package.json +25 -0
  55. package/public-api.d.ts +12 -0
  56. package/types.d.ts +3 -0
@@ -0,0 +1,29 @@
1
+ import { Pipe } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class LayoutGridMapperPipe {
4
+ transform(molist) {
5
+ const x = molist.map((c) => ({
6
+ id: c.Id,
7
+ x: +c.x,
8
+ y: +c.y,
9
+ w: +c.w,
10
+ h: +c.h,
11
+ minW: c.minW,
12
+ minH: c.minH,
13
+ maxW: c.maxW,
14
+ maxH: c.maxH,
15
+ ejrayOlgo: c.EjrayOlgo
16
+ }));
17
+ return x;
18
+ }
19
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LayoutGridMapperPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
20
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: LayoutGridMapperPipe, name: "layoutGridMapper" }); }
21
+ }
22
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LayoutGridMapperPipe, decorators: [{
23
+ type: Pipe,
24
+ args: [{
25
+ name: 'layoutGridMapper',
26
+ standalone: false
27
+ }]
28
+ }] });
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LWdyaWQtbWFwcGVyLnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS11c2VyLXdvcmtzcGFjZS9zcmMvbGliL2xheW91dC1ncmlkLW1hcHBlci5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQVFwRCxNQUFNLE9BQU8sb0JBQW9CO0lBQzdCLFNBQVMsQ0FBQyxNQUE2QjtRQUNuQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3pCLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtZQUNSLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDUCxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1AsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO1lBQ1osSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO1lBQ1osSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO1lBQ1osSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO1lBQ1osU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTO1NBQ3pCLENBQUMsQ0FBQyxDQUFDO1FBQ0osT0FBTyxDQUFDLENBQUM7SUFDYixDQUFDOytHQWZRLG9CQUFvQjs2R0FBcEIsb0JBQW9COzs0RkFBcEIsb0JBQW9CO2tCQUpoQyxJQUFJO21CQUFDO29CQUNGLElBQUksRUFBRSxrQkFBa0I7b0JBQ3hCLFVBQVUsRUFBRSxLQUFLO2lCQUNwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGVUcmFuc2Zvcm0sIFBpcGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWV0YW9iamVjdERhdGFNb2RlbCB9IGZyb20gJ2JhcnNhLW5vdmluLXJheS1jb3JlJztcclxuaW1wb3J0IHsgS3RkR3JpZExheW91dCB9IGZyb20gJy4vZ3JpZC5kZWZpbml0aW9ucyc7XHJcblxyXG5AUGlwZSh7XHJcbiAgICBuYW1lOiAnbGF5b3V0R3JpZE1hcHBlcicsXHJcbiAgICBzdGFuZGFsb25lOiBmYWxzZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTGF5b3V0R3JpZE1hcHBlclBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcclxuICAgIHRyYW5zZm9ybShtb2xpc3Q6IE1ldGFvYmplY3REYXRhTW9kZWxbXSk6IEt0ZEdyaWRMYXlvdXQge1xyXG4gICAgICAgIGNvbnN0IHggPSBtb2xpc3QubWFwKChjKSA9PiAoe1xyXG4gICAgICAgICAgICBpZDogYy5JZCxcclxuICAgICAgICAgICAgeDogK2MueCxcclxuICAgICAgICAgICAgeTogK2MueSxcclxuICAgICAgICAgICAgdzogK2MudyxcclxuICAgICAgICAgICAgaDogK2MuaCxcclxuICAgICAgICAgICAgbWluVzogYy5taW5XLFxyXG4gICAgICAgICAgICBtaW5IOiBjLm1pbkgsXHJcbiAgICAgICAgICAgIG1heFc6IGMubWF4VyxcclxuICAgICAgICAgICAgbWF4SDogYy5tYXhILFxyXG4gICAgICAgICAgICBlanJheU9sZ286IGMuRWpyYXlPbGdvXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIHJldHVybiB4O1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,27 @@
1
+ import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
2
+ import { Router } from '@angular/router';
3
+ import { BaseComponent } from 'barsa-novin-ray-core';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@fundamental-ngx/platform/icon-tab-bar";
6
+ export class NavContainerComponent extends BaseComponent {
7
+ constructor() {
8
+ super(...arguments);
9
+ this._router = inject(Router);
10
+ }
11
+ onTabSelect(e) {
12
+ console.log(e);
13
+ if (e.label === 'صفحه اصلی') {
14
+ this._router.navigate(['/home']);
15
+ }
16
+ if (e.label === 'برنامه ها') {
17
+ this._router.navigate(['/home/launchpad']);
18
+ }
19
+ }
20
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NavContainerComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
21
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NavContainerComponent, selector: "buw-nav-container", providers: [], usesInheritance: true, ngImport: i0, template: "<div class=\"fd-shellbar fd-shellbar--xl\">\r\n <fdp-icon-tab-bar layoutMode=\"row\" maxContentHeight=\"250px\" (iconTabSelected)=\"onTabSelect($event)\">\r\n <fdp-icon-tab-bar-tab label=\"\u0635\u0641\u062D\u0647 \u0627\u0635\u0644\u06CC\" active> </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632 \u06A9\u0627\u0631 \u0645\u0646\"> </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u062A\u06CC\u06A9\u062A\u06CC\u0646\u06AF\">\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632\u06A9\u0627\u06311\"> </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632\u06A9\u0627\u06312\"> </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632\u06A9\u0627\u06313\"> </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632\u06A9\u0627\u06314\"> </fdp-icon-tab-bar-tab>\r\n </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u0646\u0627\u0628\u0639 \u0627\u0646\u0633\u0627\u0646\u06CC\">\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632\u06A9\u0627\u06311\"> </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632\u06A9\u0627\u06312\"> </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632\u06A9\u0627\u06313\"> </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632\u06A9\u0627\u06314\"> </fdp-icon-tab-bar-tab>\r\n </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632\u06A9\u0627\u0631\u0647\u0627\">\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632\u06A9\u0627\u06311\"> </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632\u06A9\u0627\u06312\"> </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632\u06A9\u0627\u06313\"> </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632\u06A9\u0627\u06314\"> </fdp-icon-tab-bar-tab>\r\n </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\"> </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0627\u0628\u0632\u0627\u0631\u0647\u0627\"> </fdp-icon-tab-bar-tab>\r\n </fdp-icon-tab-bar>\r\n</div>", styles: [":host{display:block}:host ::ng-deep>div ul{background-color:transparent}:host ::ng-deep>div ul .fd-icon-tab-bar__tag{color:#fff}:host ::ng-deep>div ul fd-icon,:host ::ng-deep>div ul .fd-icon-tab-bar__arrow{color:#fff!important}:host ::ng-deep>div ul .fd-icon-tab-bar__tab[aria-selected=true]:after{background-color:#fff}\n"], dependencies: [{ kind: "component", type: i1.IconTabBarComponent, selector: "fdp-icon-tab-bar", inputs: ["stackContent", "iconTabType", "tabsConfig", "densityMode", "iconTabFont", "enableTabReordering", "showTotalTab", "multiClick", "layoutMode", "iconTabBackground", "iconTabSize", "colorAssociations", "maxContentHeight"], outputs: ["tabsConfigChange", "densityModeChange", "iconTabSelected", "iconTabReordered", "closeTab"] }, { kind: "component", type: i1.IconTabBarTabComponent, selector: "fdp-icon-tab-bar-tab", inputs: ["label", "color", "icon", "iconFont", "counter", "active", "badge", "closable", "id"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
22
+ }
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NavContainerComponent, decorators: [{
24
+ type: Component,
25
+ args: [{ selector: 'buw-nav-container', providers: [], changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<div class=\"fd-shellbar fd-shellbar--xl\">\r\n <fdp-icon-tab-bar layoutMode=\"row\" maxContentHeight=\"250px\" (iconTabSelected)=\"onTabSelect($event)\">\r\n <fdp-icon-tab-bar-tab label=\"\u0635\u0641\u062D\u0647 \u0627\u0635\u0644\u06CC\" active> </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632 \u06A9\u0627\u0631 \u0645\u0646\"> </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u062A\u06CC\u06A9\u062A\u06CC\u0646\u06AF\">\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632\u06A9\u0627\u06311\"> </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632\u06A9\u0627\u06312\"> </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632\u06A9\u0627\u06313\"> </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632\u06A9\u0627\u06314\"> </fdp-icon-tab-bar-tab>\r\n </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u0646\u0627\u0628\u0639 \u0627\u0646\u0633\u0627\u0646\u06CC\">\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632\u06A9\u0627\u06311\"> </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632\u06A9\u0627\u06312\"> </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632\u06A9\u0627\u06313\"> </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632\u06A9\u0627\u06314\"> </fdp-icon-tab-bar-tab>\r\n </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632\u06A9\u0627\u0631\u0647\u0627\">\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632\u06A9\u0627\u06311\"> </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632\u06A9\u0627\u06312\"> </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632\u06A9\u0627\u06313\"> </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0645\u06CC\u0632\u06A9\u0627\u06314\"> </fdp-icon-tab-bar-tab>\r\n </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\"> </fdp-icon-tab-bar-tab>\r\n <fdp-icon-tab-bar-tab label=\"\u0627\u0628\u0632\u0627\u0631\u0647\u0627\"> </fdp-icon-tab-bar-tab>\r\n </fdp-icon-tab-bar>\r\n</div>", styles: [":host{display:block}:host ::ng-deep>div ul{background-color:transparent}:host ::ng-deep>div ul .fd-icon-tab-bar__tag{color:#fff}:host ::ng-deep>div ul fd-icon,:host ::ng-deep>div ul .fd-icon-tab-bar__arrow{color:#fff!important}:host ::ng-deep>div ul .fd-icon-tab-bar__tab[aria-selected=true]:after{background-color:#fff}\n"] }]
26
+ }] });
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2LWNvbnRhaW5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS11c2VyLXdvcmtzcGFjZS9zcmMvbGliL25hdi1jb250YWluZXIvbmF2LWNvbnRhaW5lci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS11c2VyLXdvcmtzcGFjZS9zcmMvbGliL25hdi1jb250YWluZXIvbmF2LWNvbnRhaW5lci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFxQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXpDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBVXJELE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxhQUFhO0lBUnhEOztRQVNJLFlBQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7S0FVNUI7SUFURyxXQUFXLENBQUMsQ0FBQztRQUNULE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFDRCxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNMLENBQUM7K0dBVlEscUJBQXFCO21HQUFyQixxQkFBcUIsNENBSm5CLEVBQUUsaURDVGpCLGsxRUF5Qk07OzRGRFpPLHFCQUFxQjtrQkFSakMsU0FBUzsrQkFDSSxtQkFBbUIsYUFHbEIsRUFBRSxtQkFDSSx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcblxyXG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50IH0gZnJvbSAnYmFyc2Etbm92aW4tcmF5LWNvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2J1dy1uYXYtY29udGFpbmVyJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9uYXYtY29udGFpbmVyLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL25hdi1jb250YWluZXIuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIHByb3ZpZGVyczogW10sXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICAgIHN0YW5kYWxvbmU6IGZhbHNlXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOYXZDb250YWluZXJDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgX3JvdXRlciA9IGluamVjdChSb3V0ZXIpO1xyXG4gICAgb25UYWJTZWxlY3QoZSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGUpO1xyXG4gICAgICAgIGlmIChlLmxhYmVsID09PSAn2LXZgdit2Ycg2KfYtdmE24wnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbJy9ob21lJ10pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZS5sYWJlbCA9PT0gJ9io2LHZhtin2YXZhyDZh9inJykge1xyXG4gICAgICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoWycvaG9tZS9sYXVuY2hwYWQnXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJmZC1zaGVsbGJhciBmZC1zaGVsbGJhci0teGxcIj5cclxuICAgIDxmZHAtaWNvbi10YWItYmFyIGxheW91dE1vZGU9XCJyb3dcIiBtYXhDb250ZW50SGVpZ2h0PVwiMjUwcHhcIiAoaWNvblRhYlNlbGVjdGVkKT1cIm9uVGFiU2VsZWN0KCRldmVudClcIj5cclxuICAgICAgICA8ZmRwLWljb24tdGFiLWJhci10YWIgbGFiZWw9XCLYtdmB2K3ZhyDYp9i12YTbjFwiIGFjdGl2ZT4gPC9mZHAtaWNvbi10YWItYmFyLXRhYj5cclxuICAgICAgICA8ZmRwLWljb24tdGFiLWJhci10YWIgbGFiZWw9XCLZhduM2LIg2qnYp9ixINmF2YZcIj4gPC9mZHAtaWNvbi10YWItYmFyLXRhYj5cclxuICAgICAgICA8ZmRwLWljb24tdGFiLWJhci10YWIgbGFiZWw9XCLYqtuM2qnYqtuM2Ybar1wiPlxyXG4gICAgICAgICAgICA8ZmRwLWljb24tdGFiLWJhci10YWIgbGFiZWw9XCLZhduM2LLaqdin2LExXCI+IDwvZmRwLWljb24tdGFiLWJhci10YWI+XHJcbiAgICAgICAgICAgIDxmZHAtaWNvbi10YWItYmFyLXRhYiBsYWJlbD1cItmF24zYstqp2KfYsTJcIj4gPC9mZHAtaWNvbi10YWItYmFyLXRhYj5cclxuICAgICAgICAgICAgPGZkcC1pY29uLXRhYi1iYXItdGFiIGxhYmVsPVwi2YXbjNiy2qnYp9ixM1wiPiA8L2ZkcC1pY29uLXRhYi1iYXItdGFiPlxyXG4gICAgICAgICAgICA8ZmRwLWljb24tdGFiLWJhci10YWIgbGFiZWw9XCLZhduM2LLaqdin2LE0XCI+IDwvZmRwLWljb24tdGFiLWJhci10YWI+XHJcbiAgICAgICAgPC9mZHAtaWNvbi10YWItYmFyLXRhYj5cclxuICAgICAgICA8ZmRwLWljb24tdGFiLWJhci10YWIgbGFiZWw9XCLZhdmG2KfYqNi5INin2YbYs9in2YbbjFwiPlxyXG4gICAgICAgICAgICA8ZmRwLWljb24tdGFiLWJhci10YWIgbGFiZWw9XCLZhduM2LLaqdin2LExXCI+IDwvZmRwLWljb24tdGFiLWJhci10YWI+XHJcbiAgICAgICAgICAgIDxmZHAtaWNvbi10YWItYmFyLXRhYiBsYWJlbD1cItmF24zYstqp2KfYsTJcIj4gPC9mZHAtaWNvbi10YWItYmFyLXRhYj5cclxuICAgICAgICAgICAgPGZkcC1pY29uLXRhYi1iYXItdGFiIGxhYmVsPVwi2YXbjNiy2qnYp9ixM1wiPiA8L2ZkcC1pY29uLXRhYi1iYXItdGFiPlxyXG4gICAgICAgICAgICA8ZmRwLWljb24tdGFiLWJhci10YWIgbGFiZWw9XCLZhduM2LLaqdin2LE0XCI+IDwvZmRwLWljb24tdGFiLWJhci10YWI+XHJcbiAgICAgICAgPC9mZHAtaWNvbi10YWItYmFyLXRhYj5cclxuICAgICAgICA8ZmRwLWljb24tdGFiLWJhci10YWIgbGFiZWw9XCLZhduM2LLaqdin2LHZh9inXCI+XHJcbiAgICAgICAgICAgIDxmZHAtaWNvbi10YWItYmFyLXRhYiBsYWJlbD1cItmF24zYstqp2KfYsTFcIj4gPC9mZHAtaWNvbi10YWItYmFyLXRhYj5cclxuICAgICAgICAgICAgPGZkcC1pY29uLXRhYi1iYXItdGFiIGxhYmVsPVwi2YXbjNiy2qnYp9ixMlwiPiA8L2ZkcC1pY29uLXRhYi1iYXItdGFiPlxyXG4gICAgICAgICAgICA8ZmRwLWljb24tdGFiLWJhci10YWIgbGFiZWw9XCLZhduM2LLaqdin2LEzXCI+IDwvZmRwLWljb24tdGFiLWJhci10YWI+XHJcbiAgICAgICAgICAgIDxmZHAtaWNvbi10YWItYmFyLXRhYiBsYWJlbD1cItmF24zYstqp2KfYsTRcIj4gPC9mZHAtaWNvbi10YWItYmFyLXRhYj5cclxuICAgICAgICA8L2ZkcC1pY29uLXRhYi1iYXItdGFiPlxyXG4gICAgICAgIDxmZHAtaWNvbi10YWItYmFyLXRhYiBsYWJlbD1cItio2LHZhtin2YXZhyDZh9inXCI+IDwvZmRwLWljb24tdGFiLWJhci10YWI+XHJcbiAgICAgICAgPGZkcC1pY29uLXRhYi1iYXItdGFiIGxhYmVsPVwi2KfYqNiy2KfYsdmH2KdcIj4gPC9mZHAtaWNvbi10YWItYmFyLXRhYj5cclxuICAgIDwvZmRwLWljb24tdGFiLWJhcj5cclxuPC9kaXY+Il19
@@ -0,0 +1,15 @@
1
+ import { ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { ReportViewBaseComponent } from 'barsa-novin-ray-core';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "barsa-novin-ray-core";
5
+ import * as i2 from "../layout-container/layout-container.component";
6
+ import * as i3 from "../layout-grid-mapper.pipe";
7
+ export class ReportGridLayoutComponent extends ReportViewBaseComponent {
8
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ReportGridLayoutComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
9
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ReportGridLayoutComponent, selector: "buw-report-grid-layout", providers: [], usesInheritance: true, ngImport: i0, template: "<div style=\"position: relative\" dir=\"ltr\" fillEmptySpace [setMinHeight]=\"true\">\r\n <buw-layout-container [moDataList]=\"moDataList\" [layout]=\"moDataList | layoutGridMapper\"> </buw-layout-container>\r\n</div>\r\n", styles: [":host{display:block}:host ::ng-deep .grid-item-content{box-sizing:border-box;background:#ccc;border:1px solid;width:100%;height:100%;-webkit-user-select:none;user-select:none;display:flex;align-items:center;justify-content:center}:host ::ng-deep .grid-item-remove-handle{position:absolute;cursor:pointer;display:flex;justify-content:center;width:20px;height:20px;top:0;right:0}:host ::ng-deep .grid-item-remove-handle:after{content:\"x\";color:#121212;font-size:16px;font-weight:300;font-family:Arial,sans-serif}\n"], dependencies: [{ kind: "directive", type: i1.FillEmptySpaceDirective, selector: "[fillEmptySpace]", inputs: ["containerDom", "decrement", "disable", "height", "dontUseTopBound", "setMinHeight"], exportAs: ["fillEmptySpace"] }, { kind: "component", type: i2.LayoutContainerComponent, selector: "buw-layout-container", inputs: ["layout", "moDataList"] }, { kind: "pipe", type: i3.LayoutGridMapperPipe, name: "layoutGridMapper" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
10
+ }
11
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ReportGridLayoutComponent, decorators: [{
12
+ type: Component,
13
+ args: [{ selector: 'buw-report-grid-layout', providers: [], changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<div style=\"position: relative\" dir=\"ltr\" fillEmptySpace [setMinHeight]=\"true\">\r\n <buw-layout-container [moDataList]=\"moDataList\" [layout]=\"moDataList | layoutGridMapper\"> </buw-layout-container>\r\n</div>\r\n", styles: [":host{display:block}:host ::ng-deep .grid-item-content{box-sizing:border-box;background:#ccc;border:1px solid;width:100%;height:100%;-webkit-user-select:none;user-select:none;display:flex;align-items:center;justify-content:center}:host ::ng-deep .grid-item-remove-handle{position:absolute;cursor:pointer;display:flex;justify-content:center;width:20px;height:20px;top:0;right:0}:host ::ng-deep .grid-item-remove-handle:after{content:\"x\";color:#121212;font-size:16px;font-weight:300;font-family:Arial,sans-serif}\n"] }]
14
+ }] });
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWdyaWQtbGF5b3V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLXVzZXItd29ya3NwYWNlL3NyYy9saWIvcmVwb3J0LWdyaWQtbGF5b3V0L3JlcG9ydC1ncmlkLWxheW91dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS11c2VyLXdvcmtzcGFjZS9zcmMvbGliL3JlcG9ydC1ncmlkLWxheW91dC9yZXBvcnQtZ3JpZC1sYXlvdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFdEYsT0FBTyxFQUFFLHVCQUF1QixFQUEyQixNQUFNLHNCQUFzQixDQUFDOzs7OztBQVV4RixNQUFNLE9BQU8seUJBQ1QsU0FBUSx1QkFBZ0Q7K0dBRC9DLHlCQUF5QjttR0FBekIseUJBQXlCLGlEQUp2QixFQUFFLGlEQ1JqQixrT0FHQTs7NEZEU2EseUJBQXlCO2tCQVJyQyxTQUFTOytCQUNJLHdCQUF3QixhQUd2QixFQUFFLG1CQUNJLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBSZXBvcnRWaWV3QmFzZUNvbXBvbmVudCwgVWlSZXBvcnRWaWV3QmFzZVNldHRpbmcgfSBmcm9tICdiYXJzYS1ub3Zpbi1yYXktY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYnV3LXJlcG9ydC1ncmlkLWxheW91dCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vcmVwb3J0LWdyaWQtbGF5b3V0LmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL3JlcG9ydC1ncmlkLWxheW91dC5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgcHJvdmlkZXJzOiBbXSxcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gICAgc3RhbmRhbG9uZTogZmFsc2VcclxufSlcclxuZXhwb3J0IGNsYXNzIFJlcG9ydEdyaWRMYXlvdXRDb21wb25lbnRcclxuICAgIGV4dGVuZHMgUmVwb3J0Vmlld0Jhc2VDb21wb25lbnQ8VWlSZXBvcnRWaWV3QmFzZVNldHRpbmc+XHJcbiAgICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHt9XHJcbiIsIjxkaXYgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmVcIiBkaXI9XCJsdHJcIiBmaWxsRW1wdHlTcGFjZSBbc2V0TWluSGVpZ2h0XT1cInRydWVcIj5cclxuICAgIDxidXctbGF5b3V0LWNvbnRhaW5lciBbbW9EYXRhTGlzdF09XCJtb0RhdGFMaXN0XCIgW2xheW91dF09XCJtb0RhdGFMaXN0IHwgbGF5b3V0R3JpZE1hcHBlclwiPiA8L2J1dy1sYXlvdXQtY29udGFpbmVyPlxyXG48L2Rpdj5cclxuIl19
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Client rect utilities.
3
+ * This file is taken from Angular Material repository.
4
+ */
5
+ /** Gets a mutable version of an element's bounding `ClientRect`. */
6
+ export function getMutableClientRect(element) {
7
+ const clientRect = element.getBoundingClientRect();
8
+ // We need to clone the `clientRect` here, because all the values on it are readonly
9
+ // and we need to be able to update them. Also we can't use a spread here, because
10
+ // the values on a `ClientRect` aren't own properties. See:
11
+ // https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect#Notes
12
+ return {
13
+ top: clientRect.top,
14
+ right: clientRect.right,
15
+ bottom: clientRect.bottom,
16
+ left: clientRect.left,
17
+ width: clientRect.width,
18
+ height: clientRect.height
19
+ };
20
+ }
21
+ /**
22
+ * Checks whether some coordinates are within a `ClientRect`.
23
+ * @param clientRect ClientRect that is being checked.
24
+ * @param x Coordinates along the X axis.
25
+ * @param y Coordinates along the Y axis.
26
+ */
27
+ export function isInsideClientRect(clientRect, x, y) {
28
+ const { top, bottom, left, right } = clientRect;
29
+ return y >= top && y <= bottom && x >= left && x <= right;
30
+ }
31
+ /**
32
+ * Updates the top/left positions of a `ClientRect`, as well as their bottom/right counterparts.
33
+ * @param clientRect `ClientRect` that should be updated.
34
+ * @param top Amount to add to the `top` position.
35
+ * @param left Amount to add to the `left` position.
36
+ */
37
+ export function adjustClientRect(clientRect, top, left) {
38
+ clientRect.top += top;
39
+ clientRect.bottom = clientRect.top + clientRect.height;
40
+ clientRect.left += left;
41
+ clientRect.right = clientRect.left + clientRect.width;
42
+ }
43
+ /**
44
+ * Checks whether the pointer coordinates are close to a ClientRect.
45
+ * @param rect ClientRect to check against.
46
+ * @param threshold Threshold around the ClientRect.
47
+ * @param pointerX Coordinates along the X axis.
48
+ * @param pointerY Coordinates along the Y axis.
49
+ */
50
+ export function isPointerNearClientRect(rect, threshold, pointerX, pointerY) {
51
+ const { top, right, bottom, left, width, height } = rect;
52
+ const xThreshold = width * threshold;
53
+ const yThreshold = height * threshold;
54
+ return pointerY > top - yThreshold && pointerY < bottom + yThreshold &&
55
+ pointerX > left - xThreshold && pointerX < right + xThreshold;
56
+ }
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LXJlY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS11c2VyLXdvcmtzcGFjZS9zcmMvbGliL3V0aWxzL2NsaWVudC1yZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQWFILG9FQUFvRTtBQUNwRSxNQUFNLFVBQVUsb0JBQW9CLENBQUMsT0FBZ0I7SUFDakQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFFbkQsb0ZBQW9GO0lBQ3BGLGtGQUFrRjtJQUNsRiwyREFBMkQ7SUFDM0QsdUZBQXVGO0lBQ3ZGLE9BQU87UUFDSCxHQUFHLEVBQUUsVUFBVSxDQUFDLEdBQUc7UUFDbkIsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLO1FBQ3ZCLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTTtRQUN6QixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7UUFDckIsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLO1FBQ3ZCLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTTtLQUM1QixDQUFDO0FBQ04sQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLFVBQXNCLEVBQUUsQ0FBUyxFQUFFLENBQVM7SUFDM0UsTUFBTSxFQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBQyxHQUFHLFVBQVUsQ0FBQztJQUM5QyxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLE1BQU0sSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUM7QUFDOUQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFVBQXlCLEVBQUUsR0FBVyxFQUFFLElBQVk7SUFDakYsVUFBVSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDdEIsVUFBVSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7SUFFdkQsVUFBVSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUM7SUFDeEIsVUFBVSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7QUFDMUQsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxJQUFtQixFQUNuQixTQUFpQixFQUNqQixRQUFnQixFQUNoQixRQUFnQjtJQUNwRCxNQUFNLEVBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdkQsTUFBTSxVQUFVLEdBQUcsS0FBSyxHQUFHLFNBQVMsQ0FBQztJQUNyQyxNQUFNLFVBQVUsR0FBRyxNQUFNLEdBQUcsU0FBUyxDQUFDO0lBRXRDLE9BQU8sUUFBUSxHQUFHLEdBQUcsR0FBRyxVQUFVLElBQUksUUFBUSxHQUFHLE1BQU0sR0FBRyxVQUFVO1FBQ2hFLFFBQVEsR0FBRyxJQUFJLEdBQUcsVUFBVSxJQUFJLFFBQVEsR0FBRyxLQUFLLEdBQUcsVUFBVSxDQUFDO0FBQ3RFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENsaWVudCByZWN0IHV0aWxpdGllcy5cbiAqIFRoaXMgZmlsZSBpcyB0YWtlbiBmcm9tIEFuZ3VsYXIgTWF0ZXJpYWwgcmVwb3NpdG9yeS5cbiAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIEt0ZENsaWVudFJlY3Qge1xuICAgIHRvcDogbnVtYmVyO1xuICAgIGJvdHRvbTogbnVtYmVyO1xuICAgIGxlZnQ6IG51bWJlcjtcbiAgICByaWdodDogbnVtYmVyO1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbi8qKiBHZXRzIGEgbXV0YWJsZSB2ZXJzaW9uIG9mIGFuIGVsZW1lbnQncyBib3VuZGluZyBgQ2xpZW50UmVjdGAuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TXV0YWJsZUNsaWVudFJlY3QoZWxlbWVudDogRWxlbWVudCk6IEt0ZENsaWVudFJlY3Qge1xuICAgIGNvbnN0IGNsaWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgLy8gV2UgbmVlZCB0byBjbG9uZSB0aGUgYGNsaWVudFJlY3RgIGhlcmUsIGJlY2F1c2UgYWxsIHRoZSB2YWx1ZXMgb24gaXQgYXJlIHJlYWRvbmx5XG4gICAgLy8gYW5kIHdlIG5lZWQgdG8gYmUgYWJsZSB0byB1cGRhdGUgdGhlbS4gQWxzbyB3ZSBjYW4ndCB1c2UgYSBzcHJlYWQgaGVyZSwgYmVjYXVzZVxuICAgIC8vIHRoZSB2YWx1ZXMgb24gYSBgQ2xpZW50UmVjdGAgYXJlbid0IG93biBwcm9wZXJ0aWVzLiBTZWU6XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvZ2V0Qm91bmRpbmdDbGllbnRSZWN0I05vdGVzXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdG9wOiBjbGllbnRSZWN0LnRvcCxcbiAgICAgICAgcmlnaHQ6IGNsaWVudFJlY3QucmlnaHQsXG4gICAgICAgIGJvdHRvbTogY2xpZW50UmVjdC5ib3R0b20sXG4gICAgICAgIGxlZnQ6IGNsaWVudFJlY3QubGVmdCxcbiAgICAgICAgd2lkdGg6IGNsaWVudFJlY3Qud2lkdGgsXG4gICAgICAgIGhlaWdodDogY2xpZW50UmVjdC5oZWlnaHRcbiAgICB9O1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHNvbWUgY29vcmRpbmF0ZXMgYXJlIHdpdGhpbiBhIGBDbGllbnRSZWN0YC5cbiAqIEBwYXJhbSBjbGllbnRSZWN0IENsaWVudFJlY3QgdGhhdCBpcyBiZWluZyBjaGVja2VkLlxuICogQHBhcmFtIHggQ29vcmRpbmF0ZXMgYWxvbmcgdGhlIFggYXhpcy5cbiAqIEBwYXJhbSB5IENvb3JkaW5hdGVzIGFsb25nIHRoZSBZIGF4aXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0luc2lkZUNsaWVudFJlY3QoY2xpZW50UmVjdDogQ2xpZW50UmVjdCwgeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICBjb25zdCB7dG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0fSA9IGNsaWVudFJlY3Q7XG4gICAgcmV0dXJuIHkgPj0gdG9wICYmIHkgPD0gYm90dG9tICYmIHggPj0gbGVmdCAmJiB4IDw9IHJpZ2h0O1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHRvcC9sZWZ0IHBvc2l0aW9ucyBvZiBhIGBDbGllbnRSZWN0YCwgYXMgd2VsbCBhcyB0aGVpciBib3R0b20vcmlnaHQgY291bnRlcnBhcnRzLlxuICogQHBhcmFtIGNsaWVudFJlY3QgYENsaWVudFJlY3RgIHRoYXQgc2hvdWxkIGJlIHVwZGF0ZWQuXG4gKiBAcGFyYW0gdG9wIEFtb3VudCB0byBhZGQgdG8gdGhlIGB0b3BgIHBvc2l0aW9uLlxuICogQHBhcmFtIGxlZnQgQW1vdW50IHRvIGFkZCB0byB0aGUgYGxlZnRgIHBvc2l0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRqdXN0Q2xpZW50UmVjdChjbGllbnRSZWN0OiBLdGRDbGllbnRSZWN0LCB0b3A6IG51bWJlciwgbGVmdDogbnVtYmVyKSB7XG4gICAgY2xpZW50UmVjdC50b3AgKz0gdG9wO1xuICAgIGNsaWVudFJlY3QuYm90dG9tID0gY2xpZW50UmVjdC50b3AgKyBjbGllbnRSZWN0LmhlaWdodDtcblxuICAgIGNsaWVudFJlY3QubGVmdCArPSBsZWZ0O1xuICAgIGNsaWVudFJlY3QucmlnaHQgPSBjbGllbnRSZWN0LmxlZnQgKyBjbGllbnRSZWN0LndpZHRoO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBwb2ludGVyIGNvb3JkaW5hdGVzIGFyZSBjbG9zZSB0byBhIENsaWVudFJlY3QuXG4gKiBAcGFyYW0gcmVjdCBDbGllbnRSZWN0IHRvIGNoZWNrIGFnYWluc3QuXG4gKiBAcGFyYW0gdGhyZXNob2xkIFRocmVzaG9sZCBhcm91bmQgdGhlIENsaWVudFJlY3QuXG4gKiBAcGFyYW0gcG9pbnRlclggQ29vcmRpbmF0ZXMgYWxvbmcgdGhlIFggYXhpcy5cbiAqIEBwYXJhbSBwb2ludGVyWSBDb29yZGluYXRlcyBhbG9uZyB0aGUgWSBheGlzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQb2ludGVyTmVhckNsaWVudFJlY3QocmVjdDogS3RkQ2xpZW50UmVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGQ6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyWDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJZOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCB7dG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LCB3aWR0aCwgaGVpZ2h0fSA9IHJlY3Q7XG4gICAgY29uc3QgeFRocmVzaG9sZCA9IHdpZHRoICogdGhyZXNob2xkO1xuICAgIGNvbnN0IHlUaHJlc2hvbGQgPSBoZWlnaHQgKiB0aHJlc2hvbGQ7XG5cbiAgICByZXR1cm4gcG9pbnRlclkgPiB0b3AgLSB5VGhyZXNob2xkICYmIHBvaW50ZXJZIDwgYm90dG9tICsgeVRocmVzaG9sZCAmJlxuICAgICAgICBwb2ludGVyWCA+IGxlZnQgLSB4VGhyZXNob2xkICYmIHBvaW50ZXJYIDwgcmlnaHQgKyB4VGhyZXNob2xkO1xufVxuIl19
@@ -0,0 +1,225 @@
1
+ import { compact, getFirstCollision, moveElement } from './react-grid-layout.utils';
2
+ import { ktdPointerClientX, ktdPointerClientY } from './pointer.utils';
3
+ /** Tracks items by id. This function is mean to be used in conjunction with the ngFor that renders the 'buw-grid-items' */
4
+ export function ktdTrackById(index, item) {
5
+ return item.id;
6
+ }
7
+ /** Given a layout, the gridHeight and the gap return the resulting rowHeight */
8
+ export function ktdGetGridItemRowHeight(layout, gridHeight, gap) {
9
+ const numberOfRows = layout.reduce((acc, cur) => Math.max(acc, Math.max(cur.y + cur.h, 0)), 0);
10
+ const gapTotalHeight = (numberOfRows - 1) * gap;
11
+ const gridHeightMinusGap = gridHeight - gapTotalHeight;
12
+ return gridHeightMinusGap / numberOfRows;
13
+ }
14
+ /**
15
+ * Call react-grid-layout utils 'compact()' function and return the compacted layout.
16
+ * @param layout to be compacted.
17
+ * @param compactType, type of compaction.
18
+ * @param cols, number of columns of the grid.
19
+ */
20
+ export function ktdGridCompact(layout, compactType, cols) {
21
+ return (compact(layout, compactType, cols)
22
+ // Prune react-grid-layout compact extra properties.
23
+ .map((item) => ({
24
+ id: item.id,
25
+ x: item.x,
26
+ y: item.y,
27
+ w: item.w,
28
+ h: item.h,
29
+ minW: item.minW,
30
+ minH: item.minH,
31
+ maxW: item.maxW,
32
+ maxH: item.maxH
33
+ })));
34
+ }
35
+ function screenXToGridX(screenXPos, cols, width, gap) {
36
+ const widthMinusGaps = width - gap * (cols - 1);
37
+ const itemWidth = widthMinusGaps / cols;
38
+ const widthMinusOneItem = width - itemWidth;
39
+ const colWidthWithGap = widthMinusOneItem / (cols - 1);
40
+ return Math.round(screenXPos / colWidthWithGap);
41
+ }
42
+ function screenYToGridY(screenYPos, rowHeight, height, gap) {
43
+ return Math.round(screenYPos / (rowHeight + gap));
44
+ }
45
+ function screenWidthToGridWidth(gridScreenWidth, cols, width, gap) {
46
+ const widthMinusGaps = width - gap * (cols - 1);
47
+ const itemWidth = widthMinusGaps / cols;
48
+ const gridScreenWidthMinusFirst = gridScreenWidth - itemWidth;
49
+ return Math.round(gridScreenWidthMinusFirst / (itemWidth + gap)) + 1;
50
+ }
51
+ function screenHeightToGridHeight(gridScreenHeight, rowHeight, height, gap) {
52
+ const gridScreenHeightMinusFirst = gridScreenHeight - rowHeight;
53
+ return Math.round(gridScreenHeightMinusFirst / (rowHeight + gap)) + 1;
54
+ }
55
+ /** Returns a Dictionary where the key is the id and the value is the change applied to that item. If no changes Dictionary is empty. */
56
+ export function ktdGetGridLayoutDiff(gridLayoutA, gridLayoutB) {
57
+ const diff = {};
58
+ gridLayoutA.forEach((itemA) => {
59
+ const itemB = gridLayoutB.find((_itemB) => _itemB.id === itemA.id);
60
+ if (itemB != null) {
61
+ const posChanged = itemA.x !== itemB.x || itemA.y !== itemB.y;
62
+ const sizeChanged = itemA.w !== itemB.w || itemA.h !== itemB.h;
63
+ const change = posChanged && sizeChanged ? 'moveresize' : posChanged ? 'move' : sizeChanged ? 'resize' : null;
64
+ if (change) {
65
+ diff[itemB.id] = { change };
66
+ }
67
+ }
68
+ });
69
+ return diff;
70
+ }
71
+ /**
72
+ * Given the grid config & layout data and the current drag position & information, returns the corresponding layout and drag item position
73
+ * @param gridItem grid item that is been dragged
74
+ * @param config current grid configuration
75
+ * @param compactionType type of compaction that will be performed
76
+ * @param draggingData contains all the information about the drag
77
+ */
78
+ export function ktdGridItemDragging(gridItem, config, compactionType, draggingData) {
79
+ const { pointerDownEvent, pointerDragEvent, gridElemClientRect, dragElemClientRect, scrollDifference } = draggingData;
80
+ const gridItemId = gridItem.id;
81
+ const draggingElemPrevItem = config.layout.find((item) => item.id === gridItemId);
82
+ const clientStartX = ktdPointerClientX(pointerDownEvent);
83
+ const clientStartY = ktdPointerClientY(pointerDownEvent);
84
+ const clientX = ktdPointerClientX(pointerDragEvent);
85
+ const clientY = ktdPointerClientY(pointerDragEvent);
86
+ const offsetX = clientStartX - dragElemClientRect.left;
87
+ const offsetY = clientStartY - dragElemClientRect.top;
88
+ // Grid element positions taking into account the possible scroll total difference from the beginning.
89
+ const gridElementLeftPosition = gridElemClientRect.left + scrollDifference.left;
90
+ const gridElementTopPosition = gridElemClientRect.top + scrollDifference.top;
91
+ // Calculate position relative to the grid element.
92
+ const gridRelXPos = clientX - gridElementLeftPosition - offsetX;
93
+ const gridRelYPos = clientY - gridElementTopPosition - offsetY;
94
+ const rowHeightInPixels = config.rowHeight === 'fit'
95
+ ? ktdGetGridItemRowHeight(config.layout, config.height ?? gridElemClientRect.height, config.gap)
96
+ : config.rowHeight;
97
+ // Get layout item position
98
+ const layoutItem = {
99
+ ...draggingElemPrevItem,
100
+ x: screenXToGridX(gridRelXPos, config.cols, gridElemClientRect.width, config.gap),
101
+ y: screenYToGridY(gridRelYPos, rowHeightInPixels, gridElemClientRect.height, config.gap)
102
+ };
103
+ // Correct the values if they overflow, since 'moveElement' function doesn't do it
104
+ layoutItem.x = Math.max(0, layoutItem.x);
105
+ layoutItem.y = Math.max(0, layoutItem.y);
106
+ if (layoutItem.x + layoutItem.w > config.cols) {
107
+ layoutItem.x = Math.max(0, config.cols - layoutItem.w);
108
+ }
109
+ // Parse to LayoutItem array data in order to use 'react.grid-layout' utils
110
+ const layoutItems = config.layout;
111
+ const draggedLayoutItem = layoutItems.find((item) => item.id === gridItemId);
112
+ let newLayoutItems = moveElement(layoutItems, draggedLayoutItem, layoutItem.x, layoutItem.y, true, config.preventCollision, compactionType, config.cols);
113
+ newLayoutItems = compact(newLayoutItems, compactionType, config.cols);
114
+ return {
115
+ layout: newLayoutItems,
116
+ draggedItemPos: {
117
+ top: gridRelYPos,
118
+ left: gridRelXPos,
119
+ width: dragElemClientRect.width,
120
+ height: dragElemClientRect.height
121
+ }
122
+ };
123
+ }
124
+ /**
125
+ * Given the grid config & layout data and the current drag position & information, returns the corresponding layout and drag item position
126
+ * @param gridItem grid item that is been dragged
127
+ * @param config current grid configuration
128
+ * @param compactionType type of compaction that will be performed
129
+ * @param draggingData contains all the information about the drag
130
+ */
131
+ export function ktdGridItemResizing(gridItem, config, compactionType, draggingData) {
132
+ const { pointerDownEvent, pointerDragEvent, gridElemClientRect, dragElemClientRect, scrollDifference } = draggingData;
133
+ const gridItemId = gridItem.id;
134
+ const clientStartX = ktdPointerClientX(pointerDownEvent);
135
+ const clientStartY = ktdPointerClientY(pointerDownEvent);
136
+ const clientX = ktdPointerClientX(pointerDragEvent);
137
+ const clientY = ktdPointerClientY(pointerDragEvent);
138
+ // Get the difference between the mouseDown and the position 'right' of the resize element.
139
+ const resizeElemOffsetX = dragElemClientRect.width - (clientStartX - dragElemClientRect.left);
140
+ const resizeElemOffsetY = dragElemClientRect.height - (clientStartY - dragElemClientRect.top);
141
+ const draggingElemPrevItem = config.layout.find((item) => item.id === gridItemId);
142
+ const width = clientX + resizeElemOffsetX - (dragElemClientRect.left + scrollDifference.left);
143
+ const height = clientY + resizeElemOffsetY - (dragElemClientRect.top + scrollDifference.top);
144
+ const rowHeightInPixels = config.rowHeight === 'fit'
145
+ ? ktdGetGridItemRowHeight(config.layout, config.height ?? gridElemClientRect.height, config.gap)
146
+ : config.rowHeight;
147
+ // Get layout item grid position
148
+ const layoutItem = {
149
+ ...draggingElemPrevItem,
150
+ w: screenWidthToGridWidth(width, config.cols, gridElemClientRect.width, config.gap),
151
+ h: screenHeightToGridHeight(height, rowHeightInPixels, gridElemClientRect.height, config.gap)
152
+ };
153
+ layoutItem.w = limitNumberWithinRange(layoutItem.w, gridItem.minW ?? layoutItem.minW, gridItem.maxW ?? layoutItem.maxW);
154
+ layoutItem.h = limitNumberWithinRange(layoutItem.h, gridItem.minH ?? layoutItem.minH, gridItem.maxH ?? layoutItem.maxH);
155
+ if (layoutItem.x + layoutItem.w > config.cols) {
156
+ layoutItem.w = Math.max(1, config.cols - layoutItem.x);
157
+ }
158
+ if (config.preventCollision) {
159
+ const maxW = layoutItem.w;
160
+ const maxH = layoutItem.h;
161
+ let colliding = hasCollision(config.layout, layoutItem);
162
+ let shrunkDimension;
163
+ while (colliding) {
164
+ shrunkDimension = getDimensionToShrink(layoutItem, shrunkDimension);
165
+ layoutItem[shrunkDimension]--;
166
+ colliding = hasCollision(config.layout, layoutItem);
167
+ }
168
+ if (shrunkDimension === 'w') {
169
+ layoutItem.h = maxH;
170
+ colliding = hasCollision(config.layout, layoutItem);
171
+ while (colliding) {
172
+ layoutItem.h--;
173
+ colliding = hasCollision(config.layout, layoutItem);
174
+ }
175
+ }
176
+ if (shrunkDimension === 'h') {
177
+ layoutItem.w = maxW;
178
+ colliding = hasCollision(config.layout, layoutItem);
179
+ while (colliding) {
180
+ layoutItem.w--;
181
+ colliding = hasCollision(config.layout, layoutItem);
182
+ }
183
+ }
184
+ }
185
+ const newLayoutItems = config.layout.map((item) => (item.id === gridItemId ? layoutItem : item));
186
+ return {
187
+ layout: compact(newLayoutItems, compactionType, config.cols),
188
+ draggedItemPos: {
189
+ top: dragElemClientRect.top - gridElemClientRect.top,
190
+ left: dragElemClientRect.left - gridElemClientRect.left,
191
+ width,
192
+ height
193
+ }
194
+ };
195
+ }
196
+ function hasCollision(layout, layoutItem) {
197
+ return !!getFirstCollision(layout, layoutItem);
198
+ }
199
+ function getDimensionToShrink(layoutItem, lastShrunk) {
200
+ if (layoutItem.h <= 1) {
201
+ return 'w';
202
+ }
203
+ if (layoutItem.w <= 1) {
204
+ return 'h';
205
+ }
206
+ return lastShrunk === 'w' ? 'h' : 'w';
207
+ }
208
+ /**
209
+ * Given the current number and min/max values, returns the number within the range
210
+ * @param number can be any numeric value
211
+ * @param min minimum value of range
212
+ * @param max maximum value of range
213
+ */
214
+ function limitNumberWithinRange(num, min = 1, max = Infinity) {
215
+ return Math.min(Math.max(num, min < 1 ? 1 : min), max);
216
+ }
217
+ /** Returns true if both item1 and item2 KtdGridLayoutItems are equivalent. */
218
+ export function ktdGridItemLayoutItemAreEqual(item1, item2) {
219
+ return (item1.id === item2.id &&
220
+ item1.x === item2.x &&
221
+ item1.y === item2.y &&
222
+ item1.w === item2.w &&
223
+ item1.h === item2.h);
224
+ }
225
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLXVzZXItd29ya3NwYWNlL3NyYy9saWIvdXRpbHMvZ3JpZC51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFlLGlCQUFpQixFQUFzQixXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQVNySCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUl2RSwySEFBMkg7QUFDM0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUFhLEVBQUUsSUFBb0I7SUFDNUQsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ25CLENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLHVCQUF1QixDQUFDLE1BQXFCLEVBQUUsVUFBa0IsRUFBRSxHQUFXO0lBQzFGLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9GLE1BQU0sY0FBYyxHQUFHLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNoRCxNQUFNLGtCQUFrQixHQUFHLFVBQVUsR0FBRyxjQUFjLENBQUM7SUFDdkQsT0FBTyxrQkFBa0IsR0FBRyxZQUFZLENBQUM7QUFDN0MsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxNQUFxQixFQUFFLFdBQStCLEVBQUUsSUFBWTtJQUMvRixPQUFPLENBQ0gsT0FBTyxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDO1FBQzlCLG9EQUFvRDtTQUNuRCxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDWixFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7UUFDWCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDVCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDVCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDVCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDVCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7UUFDZixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7UUFDZixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7UUFDZixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7S0FDbEIsQ0FBQyxDQUFDLENBQ1YsQ0FBQztBQUNOLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxVQUFrQixFQUFFLElBQVksRUFBRSxLQUFhLEVBQUUsR0FBVztJQUNoRixNQUFNLGNBQWMsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sU0FBUyxHQUFHLGNBQWMsR0FBRyxJQUFJLENBQUM7SUFDeEMsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLEdBQUcsU0FBUyxDQUFDO0lBQzVDLE1BQU0sZUFBZSxHQUFHLGlCQUFpQixHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsZUFBZSxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLFVBQWtCLEVBQUUsU0FBaUIsRUFBRSxNQUFjLEVBQUUsR0FBVztJQUN0RixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQUMsZUFBdUIsRUFBRSxJQUFZLEVBQUUsS0FBYSxFQUFFLEdBQVc7SUFDN0YsTUFBTSxjQUFjLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNoRCxNQUFNLFNBQVMsR0FBRyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQ3hDLE1BQU0seUJBQXlCLEdBQUcsZUFBZSxHQUFHLFNBQVMsQ0FBQztJQUM5RCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMseUJBQXlCLEdBQUcsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVELFNBQVMsd0JBQXdCLENBQUMsZ0JBQXdCLEVBQUUsU0FBaUIsRUFBRSxNQUFjLEVBQUUsR0FBVztJQUN0RyxNQUFNLDBCQUEwQixHQUFHLGdCQUFnQixHQUFHLFNBQVMsQ0FBQztJQUNoRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEdBQUcsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUUsQ0FBQztBQUVELHdJQUF3STtBQUN4SSxNQUFNLFVBQVUsb0JBQW9CLENBQ2hDLFdBQWdDLEVBQ2hDLFdBQWdDO0lBRWhDLE1BQU0sSUFBSSxHQUFnRSxFQUFFLENBQUM7SUFFN0UsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQzFCLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2hCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDOUQsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMvRCxNQUFNLE1BQU0sR0FDUixVQUFVLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ25HLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1QsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ2hDLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUMvQixRQUE4QixFQUM5QixNQUFrQixFQUNsQixjQUEyQixFQUMzQixZQUE2QjtJQUU3QixNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsR0FDbEcsWUFBWSxDQUFDO0lBRWpCLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUM7SUFFL0IsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUUsQ0FBQztJQUVuRixNQUFNLFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sWUFBWSxHQUFHLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDekQsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNwRCxNQUFNLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBRXBELE1BQU0sT0FBTyxHQUFHLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7SUFDdkQsTUFBTSxPQUFPLEdBQUcsWUFBWSxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQztJQUV0RCxzR0FBc0c7SUFDdEcsTUFBTSx1QkFBdUIsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO0lBQ2hGLE1BQU0sc0JBQXNCLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQztJQUU3RSxtREFBbUQ7SUFDbkQsTUFBTSxXQUFXLEdBQUcsT0FBTyxHQUFHLHVCQUF1QixHQUFHLE9BQU8sQ0FBQztJQUNoRSxNQUFNLFdBQVcsR0FBRyxPQUFPLEdBQUcsc0JBQXNCLEdBQUcsT0FBTyxDQUFDO0lBRS9ELE1BQU0saUJBQWlCLEdBQ25CLE1BQU0sQ0FBQyxTQUFTLEtBQUssS0FBSztRQUN0QixDQUFDLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxJQUFJLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDO1FBQ2hHLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO0lBRTNCLDJCQUEyQjtJQUMzQixNQUFNLFVBQVUsR0FBc0I7UUFDbEMsR0FBRyxvQkFBb0I7UUFDdkIsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUNqRixDQUFDLEVBQUUsY0FBYyxDQUFDLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQztLQUMzRixDQUFDO0lBRUYsa0ZBQWtGO0lBQ2xGLFVBQVUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLElBQUksVUFBVSxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1QyxVQUFVLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsTUFBTSxXQUFXLEdBQWlCLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDaEQsTUFBTSxpQkFBaUIsR0FBZSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFVBQVUsQ0FBRSxDQUFDO0lBRTFGLElBQUksY0FBYyxHQUFpQixXQUFXLENBQzFDLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsVUFBVSxDQUFDLENBQUMsRUFDWixVQUFVLENBQUMsQ0FBQyxFQUNaLElBQUksRUFDSixNQUFNLENBQUMsZ0JBQWdCLEVBQ3ZCLGNBQWMsRUFDZCxNQUFNLENBQUMsSUFBSSxDQUNkLENBQUM7SUFFRixjQUFjLEdBQUcsT0FBTyxDQUFDLGNBQWMsRUFBRSxjQUFjLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXRFLE9BQU87UUFDSCxNQUFNLEVBQUUsY0FBYztRQUN0QixjQUFjLEVBQUU7WUFDWixHQUFHLEVBQUUsV0FBVztZQUNoQixJQUFJLEVBQUUsV0FBVztZQUNqQixLQUFLLEVBQUUsa0JBQWtCLENBQUMsS0FBSztZQUMvQixNQUFNLEVBQUUsa0JBQWtCLENBQUMsTUFBTTtTQUNwQztLQUNKLENBQUM7QUFDTixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUMvQixRQUE4QixFQUM5QixNQUFrQixFQUNsQixjQUEyQixFQUMzQixZQUE2QjtJQUU3QixNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsR0FDbEcsWUFBWSxDQUFDO0lBQ2pCLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUM7SUFFL0IsTUFBTSxZQUFZLEdBQUcsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN6RCxNQUFNLFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sT0FBTyxHQUFHLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDcEQsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUVwRCwyRkFBMkY7SUFDM0YsTUFBTSxpQkFBaUIsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxZQUFZLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUYsTUFBTSxpQkFBaUIsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxZQUFZLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFOUYsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUUsQ0FBQztJQUNuRixNQUFNLEtBQUssR0FBRyxPQUFPLEdBQUcsaUJBQWlCLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUYsTUFBTSxNQUFNLEdBQUcsT0FBTyxHQUFHLGlCQUFpQixHQUFHLENBQUMsa0JBQWtCLENBQUMsR0FBRyxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTdGLE1BQU0saUJBQWlCLEdBQ25CLE1BQU0sQ0FBQyxTQUFTLEtBQUssS0FBSztRQUN0QixDQUFDLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxJQUFJLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDO1FBQ2hHLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO0lBRTNCLGdDQUFnQztJQUNoQyxNQUFNLFVBQVUsR0FBc0I7UUFDbEMsR0FBRyxvQkFBb0I7UUFDdkIsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDO1FBQ25GLENBQUMsRUFBRSx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUM7S0FDaEcsQ0FBQztJQUVGLFVBQVUsQ0FBQyxDQUFDLEdBQUcsc0JBQXNCLENBQ2pDLFVBQVUsQ0FBQyxDQUFDLEVBQ1osUUFBUSxDQUFDLElBQUksSUFBSSxVQUFVLENBQUMsSUFBSSxFQUNoQyxRQUFRLENBQUMsSUFBSSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQ25DLENBQUM7SUFDRixVQUFVLENBQUMsQ0FBQyxHQUFHLHNCQUFzQixDQUNqQyxVQUFVLENBQUMsQ0FBQyxFQUNaLFFBQVEsQ0FBQyxJQUFJLElBQUksVUFBVSxDQUFDLElBQUksRUFDaEMsUUFBUSxDQUFDLElBQUksSUFBSSxVQUFVLENBQUMsSUFBSSxDQUNuQyxDQUFDO0lBRUYsSUFBSSxVQUFVLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzVDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUMxQixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBRTFCLElBQUksU0FBUyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3hELElBQUksZUFBc0MsQ0FBQztRQUUzQyxPQUFPLFNBQVMsRUFBRSxDQUFDO1lBQ2YsZUFBZSxHQUFHLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUNwRSxVQUFVLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztZQUM5QixTQUFTLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUVELElBQUksZUFBZSxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQzFCLFVBQVUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBRXBCLFNBQVMsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNwRCxPQUFPLFNBQVMsRUFBRSxDQUFDO2dCQUNmLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDZixTQUFTLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDeEQsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLGVBQWUsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUMxQixVQUFVLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUVwQixTQUFTLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDcEQsT0FBTyxTQUFTLEVBQUUsQ0FBQztnQkFDZixVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2YsU0FBUyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3hELENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sY0FBYyxHQUFpQixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRXBILE9BQU87UUFDSCxNQUFNLEVBQUUsT0FBTyxDQUFDLGNBQWMsRUFBRSxjQUFjLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQztRQUM1RCxjQUFjLEVBQUU7WUFDWixHQUFHLEVBQUUsa0JBQWtCLENBQUMsR0FBRyxHQUFHLGtCQUFrQixDQUFDLEdBQUc7WUFDcEQsSUFBSSxFQUFFLGtCQUFrQixDQUFDLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxJQUFJO1lBQ3ZELEtBQUs7WUFDTCxNQUFNO1NBQ1Q7S0FDSixDQUFDO0FBQ04sQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLE1BQWMsRUFBRSxVQUFzQjtJQUN4RCxPQUFPLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQUMsVUFBVSxFQUFFLFVBQVU7SUFDaEQsSUFBSSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3BCLE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUNELElBQUksVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNwQixPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRCxPQUFPLFVBQVUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQzFDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsc0JBQXNCLENBQUMsR0FBVyxFQUFFLE1BQWMsQ0FBQyxFQUFFLE1BQWMsUUFBUTtJQUNoRixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQsOEVBQThFO0FBQzlFLE1BQU0sVUFBVSw2QkFBNkIsQ0FBQyxLQUF3QixFQUFFLEtBQXdCO0lBQzVGLE9BQU8sQ0FDSCxLQUFLLENBQUMsRUFBRSxLQUFLLEtBQUssQ0FBQyxFQUFFO1FBQ3JCLEtBQUssQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUM7UUFDbkIsS0FBSyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQztRQUNuQixLQUFLLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDO1FBQ25CLEtBQUssQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FDdEIsQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wYWN0LCBDb21wYWN0VHlwZSwgZ2V0Rmlyc3RDb2xsaXNpb24sIExheW91dCwgTGF5b3V0SXRlbSwgbW92ZUVsZW1lbnQgfSBmcm9tICcuL3JlYWN0LWdyaWQtbGF5b3V0LnV0aWxzJztcbmltcG9ydCB7XG4gICAgS3RkRHJhZ2dpbmdEYXRhLFxuICAgIEt0ZEdyaWRDZmcsXG4gICAgS3RkR3JpZENvbXBhY3RUeXBlLFxuICAgIEt0ZEdyaWRJdGVtUmVjdCxcbiAgICBLdGRHcmlkTGF5b3V0LFxuICAgIEt0ZEdyaWRMYXlvdXRJdGVtXG59IGZyb20gJy4uL2dyaWQuZGVmaW5pdGlvbnMnO1xuaW1wb3J0IHsga3RkUG9pbnRlckNsaWVudFgsIGt0ZFBvaW50ZXJDbGllbnRZIH0gZnJvbSAnLi9wb2ludGVyLnV0aWxzJztcbmltcG9ydCB7IEt0ZERpY3Rpb25hcnkgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBLdGRHcmlkSXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL2dyaWQtaXRlbS9ncmlkLWl0ZW0uY29tcG9uZW50JztcblxuLyoqIFRyYWNrcyBpdGVtcyBieSBpZC4gVGhpcyBmdW5jdGlvbiBpcyBtZWFuIHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgbmdGb3IgdGhhdCByZW5kZXJzIHRoZSAnYnV3LWdyaWQtaXRlbXMnICovXG5leHBvcnQgZnVuY3Rpb24ga3RkVHJhY2tCeUlkKGluZGV4OiBudW1iZXIsIGl0ZW06IHsgaWQ6IHN0cmluZyB9KTogYW55IHtcbiAgICByZXR1cm4gaXRlbS5pZDtcbn1cblxuLyoqIEdpdmVuIGEgbGF5b3V0LCB0aGUgZ3JpZEhlaWdodCBhbmQgdGhlIGdhcCByZXR1cm4gdGhlIHJlc3VsdGluZyByb3dIZWlnaHQgKi9cbmV4cG9ydCBmdW5jdGlvbiBrdGRHZXRHcmlkSXRlbVJvd0hlaWdodChsYXlvdXQ6IEt0ZEdyaWRMYXlvdXQsIGdyaWRIZWlnaHQ6IG51bWJlciwgZ2FwOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IG51bWJlck9mUm93cyA9IGxheW91dC5yZWR1Y2UoKGFjYywgY3VyKSA9PiBNYXRoLm1heChhY2MsIE1hdGgubWF4KGN1ci55ICsgY3VyLmgsIDApKSwgMCk7XG4gICAgY29uc3QgZ2FwVG90YWxIZWlnaHQgPSAobnVtYmVyT2ZSb3dzIC0gMSkgKiBnYXA7XG4gICAgY29uc3QgZ3JpZEhlaWdodE1pbnVzR2FwID0gZ3JpZEhlaWdodCAtIGdhcFRvdGFsSGVpZ2h0O1xuICAgIHJldHVybiBncmlkSGVpZ2h0TWludXNHYXAgLyBudW1iZXJPZlJvd3M7XG59XG5cbi8qKlxuICogQ2FsbCByZWFjdC1ncmlkLWxheW91dCB1dGlscyAnY29tcGFjdCgpJyBmdW5jdGlvbiBhbmQgcmV0dXJuIHRoZSBjb21wYWN0ZWQgbGF5b3V0LlxuICogQHBhcmFtIGxheW91dCB0byBiZSBjb21wYWN0ZWQuXG4gKiBAcGFyYW0gY29tcGFjdFR5cGUsIHR5cGUgb2YgY29tcGFjdGlvbi5cbiAqIEBwYXJhbSBjb2xzLCBudW1iZXIgb2YgY29sdW1ucyBvZiB0aGUgZ3JpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGt0ZEdyaWRDb21wYWN0KGxheW91dDogS3RkR3JpZExheW91dCwgY29tcGFjdFR5cGU6IEt0ZEdyaWRDb21wYWN0VHlwZSwgY29sczogbnVtYmVyKTogS3RkR3JpZExheW91dCB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgY29tcGFjdChsYXlvdXQsIGNvbXBhY3RUeXBlLCBjb2xzKVxuICAgICAgICAgICAgLy8gUHJ1bmUgcmVhY3QtZ3JpZC1sYXlvdXQgY29tcGFjdCBleHRyYSBwcm9wZXJ0aWVzLlxuICAgICAgICAgICAgLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgICAgICAgICBpZDogaXRlbS5pZCxcbiAgICAgICAgICAgICAgICB4OiBpdGVtLngsXG4gICAgICAgICAgICAgICAgeTogaXRlbS55LFxuICAgICAgICAgICAgICAgIHc6IGl0ZW0udyxcbiAgICAgICAgICAgICAgICBoOiBpdGVtLmgsXG4gICAgICAgICAgICAgICAgbWluVzogaXRlbS5taW5XLFxuICAgICAgICAgICAgICAgIG1pbkg6IGl0ZW0ubWluSCxcbiAgICAgICAgICAgICAgICBtYXhXOiBpdGVtLm1heFcsXG4gICAgICAgICAgICAgICAgbWF4SDogaXRlbS5tYXhIXG4gICAgICAgICAgICB9KSlcbiAgICApO1xufVxuXG5mdW5jdGlvbiBzY3JlZW5YVG9HcmlkWChzY3JlZW5YUG9zOiBudW1iZXIsIGNvbHM6IG51bWJlciwgd2lkdGg6IG51bWJlciwgZ2FwOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHdpZHRoTWludXNHYXBzID0gd2lkdGggLSBnYXAgKiAoY29scyAtIDEpO1xuICAgIGNvbnN0IGl0ZW1XaWR0aCA9IHdpZHRoTWludXNHYXBzIC8gY29scztcbiAgICBjb25zdCB3aWR0aE1pbnVzT25lSXRlbSA9IHdpZHRoIC0gaXRlbVdpZHRoO1xuICAgIGNvbnN0IGNvbFdpZHRoV2l0aEdhcCA9IHdpZHRoTWludXNPbmVJdGVtIC8gKGNvbHMgLSAxKTtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChzY3JlZW5YUG9zIC8gY29sV2lkdGhXaXRoR2FwKTtcbn1cblxuZnVuY3Rpb24gc2NyZWVuWVRvR3JpZFkoc2NyZWVuWVBvczogbnVtYmVyLCByb3dIZWlnaHQ6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGdhcDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChzY3JlZW5ZUG9zIC8gKHJvd0hlaWdodCArIGdhcCkpO1xufVxuXG5mdW5jdGlvbiBzY3JlZW5XaWR0aFRvR3JpZFdpZHRoKGdyaWRTY3JlZW5XaWR0aDogbnVtYmVyLCBjb2xzOiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGdhcDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCB3aWR0aE1pbnVzR2FwcyA9IHdpZHRoIC0gZ2FwICogKGNvbHMgLSAxKTtcbiAgICBjb25zdCBpdGVtV2lkdGggPSB3aWR0aE1pbnVzR2FwcyAvIGNvbHM7XG4gICAgY29uc3QgZ3JpZFNjcmVlbldpZHRoTWludXNGaXJzdCA9IGdyaWRTY3JlZW5XaWR0aCAtIGl0ZW1XaWR0aDtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChncmlkU2NyZWVuV2lkdGhNaW51c0ZpcnN0IC8gKGl0ZW1XaWR0aCArIGdhcCkpICsgMTtcbn1cblxuZnVuY3Rpb24gc2NyZWVuSGVpZ2h0VG9HcmlkSGVpZ2h0KGdyaWRTY3JlZW5IZWlnaHQ6IG51bWJlciwgcm93SGVpZ2h0OiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBnYXA6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgZ3JpZFNjcmVlbkhlaWdodE1pbnVzRmlyc3QgPSBncmlkU2NyZWVuSGVpZ2h0IC0gcm93SGVpZ2h0O1xuICAgIHJldHVybiBNYXRoLnJvdW5kKGdyaWRTY3JlZW5IZWlnaHRNaW51c0ZpcnN0IC8gKHJvd0hlaWdodCArIGdhcCkpICsgMTtcbn1cblxuLyoqIFJldHVybnMgYSBEaWN0aW9uYXJ5IHdoZXJlIHRoZSBrZXkgaXMgdGhlIGlkIGFuZCB0aGUgdmFsdWUgaXMgdGhlIGNoYW5nZSBhcHBsaWVkIHRvIHRoYXQgaXRlbS4gSWYgbm8gY2hhbmdlcyBEaWN0aW9uYXJ5IGlzIGVtcHR5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGt0ZEdldEdyaWRMYXlvdXREaWZmKFxuICAgIGdyaWRMYXlvdXRBOiBLdGRHcmlkTGF5b3V0SXRlbVtdLFxuICAgIGdyaWRMYXlvdXRCOiBLdGRHcmlkTGF5b3V0SXRlbVtdXG4pOiBLdGREaWN0aW9uYXJ5PHsgY2hhbmdlOiAnbW92ZScgfCAncmVzaXplJyB8ICdtb3ZlcmVzaXplJyB9PiB7XG4gICAgY29uc3QgZGlmZjogS3RkRGljdGlvbmFyeTx7IGNoYW5nZTogJ21vdmUnIHwgJ3Jlc2l6ZScgfCAnbW92ZXJlc2l6ZScgfT4gPSB7fTtcblxuICAgIGdyaWRMYXlvdXRBLmZvckVhY2goKGl0ZW1BKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1CID0gZ3JpZExheW91dEIuZmluZCgoX2l0ZW1CKSA9PiBfaXRlbUIuaWQgPT09IGl0ZW1BLmlkKTtcbiAgICAgICAgaWYgKGl0ZW1CICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvc0NoYW5nZWQgPSBpdGVtQS54ICE9PSBpdGVtQi54IHx8IGl0ZW1BLnkgIT09IGl0ZW1CLnk7XG4gICAgICAgICAgICBjb25zdCBzaXplQ2hhbmdlZCA9IGl0ZW1BLncgIT09IGl0ZW1CLncgfHwgaXRlbUEuaCAhPT0gaXRlbUIuaDtcbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZTogJ21vdmUnIHwgJ3Jlc2l6ZScgfCAnbW92ZXJlc2l6ZScgfCBudWxsID1cbiAgICAgICAgICAgICAgICBwb3NDaGFuZ2VkICYmIHNpemVDaGFuZ2VkID8gJ21vdmVyZXNpemUnIDogcG9zQ2hhbmdlZCA/ICdtb3ZlJyA6IHNpemVDaGFuZ2VkID8gJ3Jlc2l6ZScgOiBudWxsO1xuICAgICAgICAgICAgaWYgKGNoYW5nZSkge1xuICAgICAgICAgICAgICAgIGRpZmZbaXRlbUIuaWRdID0geyBjaGFuZ2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkaWZmO1xufVxuXG4vKipcbiAqIEdpdmVuIHRoZSBncmlkIGNvbmZpZyAmIGxheW91dCBkYXRhIGFuZCB0aGUgY3VycmVudCBkcmFnIHBvc2l0aW9uICYgaW5mb3JtYXRpb24sIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgbGF5b3V0IGFuZCBkcmFnIGl0ZW0gcG9zaXRpb25cbiAqIEBwYXJhbSBncmlkSXRlbSBncmlkIGl0ZW0gdGhhdCBpcyBiZWVuIGRyYWdnZWRcbiAqIEBwYXJhbSBjb25maWcgY3VycmVudCBncmlkIGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSBjb21wYWN0aW9uVHlwZSB0eXBlIG9mIGNvbXBhY3Rpb24gdGhhdCB3aWxsIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIGRyYWdnaW5nRGF0YSBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkcmFnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBrdGRHcmlkSXRlbURyYWdnaW5nKFxuICAgIGdyaWRJdGVtOiBLdGRHcmlkSXRlbUNvbXBvbmVudCxcbiAgICBjb25maWc6IEt0ZEdyaWRDZmcsXG4gICAgY29tcGFjdGlvblR5cGU6IENvbXBhY3RUeXBlLFxuICAgIGRyYWdnaW5nRGF0YTogS3RkRHJhZ2dpbmdEYXRhXG4pOiB7IGxheW91dDogS3RkR3JpZExheW91dEl0ZW1bXTsgZHJhZ2dlZEl0ZW1Qb3M6IEt0ZEdyaWRJdGVtUmVjdCB9IHtcbiAgICBjb25zdCB7IHBvaW50ZXJEb3duRXZlbnQsIHBvaW50ZXJEcmFnRXZlbnQsIGdyaWRFbGVtQ2xpZW50UmVjdCwgZHJhZ0VsZW1DbGllbnRSZWN0LCBzY3JvbGxEaWZmZXJlbmNlIH0gPVxuICAgICAgICBkcmFnZ2luZ0RhdGE7XG5cbiAgICBjb25zdCBncmlkSXRlbUlkID0gZ3JpZEl0ZW0uaWQ7XG5cbiAgICBjb25zdCBkcmFnZ2luZ0VsZW1QcmV2SXRlbSA9IGNvbmZpZy5sYXlvdXQuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gZ3JpZEl0ZW1JZCkhO1xuXG4gICAgY29uc3QgY2xpZW50U3RhcnRYID0ga3RkUG9pbnRlckNsaWVudFgocG9pbnRlckRvd25FdmVudCk7XG4gICAgY29uc3QgY2xpZW50U3RhcnRZID0ga3RkUG9pbnRlckNsaWVudFkocG9pbnRlckRvd25FdmVudCk7XG4gICAgY29uc3QgY2xpZW50WCA9IGt0ZFBvaW50ZXJDbGllbnRYKHBvaW50ZXJEcmFnRXZlbnQpO1xuICAgIGNvbnN0IGNsaWVudFkgPSBrdGRQb2ludGVyQ2xpZW50WShwb2ludGVyRHJhZ0V2ZW50KTtcblxuICAgIGNvbnN0IG9mZnNldFggPSBjbGllbnRTdGFydFggLSBkcmFnRWxlbUNsaWVudFJlY3QubGVmdDtcbiAgICBjb25zdCBvZmZzZXRZID0gY2xpZW50U3RhcnRZIC0gZHJhZ0VsZW1DbGllbnRSZWN0LnRvcDtcblxuICAgIC8vIEdyaWQgZWxlbWVudCBwb3NpdGlvbnMgdGFraW5nIGludG8gYWNjb3VudCB0aGUgcG9zc2libGUgc2Nyb2xsIHRvdGFsIGRpZmZlcmVuY2UgZnJvbSB0aGUgYmVnaW5uaW5nLlxuICAgIGNvbnN0IGdyaWRFbGVtZW50TGVmdFBvc2l0aW9uID0gZ3JpZEVsZW1DbGllbnRSZWN0LmxlZnQgKyBzY3JvbGxEaWZmZXJlbmNlLmxlZnQ7XG4gICAgY29uc3QgZ3JpZEVsZW1lbnRUb3BQb3NpdGlvbiA9IGdyaWRFbGVtQ2xpZW50UmVjdC50b3AgKyBzY3JvbGxEaWZmZXJlbmNlLnRvcDtcblxuICAgIC8vIENhbGN1bGF0ZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgZ3JpZCBlbGVtZW50LlxuICAgIGNvbnN0IGdyaWRSZWxYUG9zID0gY2xpZW50WCAtIGdyaWRFbGVtZW50TGVmdFBvc2l0aW9uIC0gb2Zmc2V0WDtcbiAgICBjb25zdCBncmlkUmVsWVBvcyA9IGNsaWVudFkgLSBncmlkRWxlbWVudFRvcFBvc2l0aW9uIC0gb2Zmc2V0WTtcblxuICAgIGNvbnN0IHJvd0hlaWdodEluUGl4ZWxzID1cbiAgICAgICAgY29uZmlnLnJvd0hlaWdodCA9PT0gJ2ZpdCdcbiAgICAgICAgICAgID8ga3RkR2V0R3JpZEl0ZW1Sb3dIZWlnaHQoY29uZmlnLmxheW91dCwgY29uZmlnLmhlaWdodCA/PyBncmlkRWxlbUNsaWVudFJlY3QuaGVpZ2h0LCBjb25maWcuZ2FwKVxuICAgICAgICAgICAgOiBjb25maWcucm93SGVpZ2h0O1xuXG4gICAgLy8gR2V0IGxheW91dCBpdGVtIHBvc2l0aW9uXG4gICAgY29uc3QgbGF5b3V0SXRlbTogS3RkR3JpZExheW91dEl0ZW0gPSB7XG4gICAgICAgIC4uLmRyYWdnaW5nRWxlbVByZXZJdGVtLFxuICAgICAgICB4OiBzY3JlZW5YVG9HcmlkWChncmlkUmVsWFBvcywgY29uZmlnLmNvbHMsIGdyaWRFbGVtQ2xpZW50UmVjdC53aWR0aCwgY29uZmlnLmdhcCksXG4gICAgICAgIHk6IHNjcmVlbllUb0dyaWRZKGdyaWRSZWxZUG9zLCByb3dIZWlnaHRJblBpeGVscywgZ3JpZEVsZW1DbGllbnRSZWN0LmhlaWdodCwgY29uZmlnLmdhcClcbiAgICB9O1xuXG4gICAgLy8gQ29ycmVjdCB0aGUgdmFsdWVzIGlmIHRoZXkgb3ZlcmZsb3csIHNpbmNlICdtb3ZlRWxlbWVudCcgZnVuY3Rpb24gZG9lc24ndCBkbyBpdFxuICAgIGxheW91dEl0ZW0ueCA9IE1hdGgubWF4KDAsIGxheW91dEl0ZW0ueCk7XG4gICAgbGF5b3V0SXRlbS55ID0gTWF0aC5tYXgoMCwgbGF5b3V0SXRlbS55KTtcbiAgICBpZiAobGF5b3V0SXRlbS54ICsgbGF5b3V0SXRlbS53ID4gY29uZmlnLmNvbHMpIHtcbiAgICAgICAgbGF5b3V0SXRlbS54ID0gTWF0aC5tYXgoMCwgY29uZmlnLmNvbHMgLSBsYXlvdXRJdGVtLncpO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIHRvIExheW91dEl0ZW0gYXJyYXkgZGF0YSBpbiBvcmRlciB0byB1c2UgJ3JlYWN0LmdyaWQtbGF5b3V0JyB1dGlsc1xuICAgIGNvbnN0IGxheW91dEl0ZW1zOiBMYXlvdXRJdGVtW10gPSBjb25maWcubGF5b3V0O1xuICAgIGNvbnN0IGRyYWdnZWRMYXlvdXRJdGVtOiBMYXlvdXRJdGVtID0gbGF5b3V0SXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gZ3JpZEl0ZW1JZCkhO1xuXG4gICAgbGV0IG5ld0xheW91dEl0ZW1zOiBMYXlvdXRJdGVtW10gPSBtb3ZlRWxlbWVudChcbiAgICAgICAgbGF5b3V0SXRlbXMsXG4gICAgICAgIGRyYWdnZWRMYXlvdXRJdGVtLFxuICAgICAgICBsYXlvdXRJdGVtLngsXG4gICAgICAgIGxheW91dEl0ZW0ueSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgY29uZmlnLnByZXZlbnRDb2xsaXNpb24sXG4gICAgICAgIGNvbXBhY3Rpb25UeXBlLFxuICAgICAgICBjb25maWcuY29sc1xuICAgICk7XG5cbiAgICBuZXdMYXlvdXRJdGVtcyA9IGNvbXBhY3QobmV3TGF5b3V0SXRlbXMsIGNvbXBhY3Rpb25UeXBlLCBjb25maWcuY29scyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBsYXlvdXQ6IG5ld0xheW91dEl0ZW1zLFxuICAgICAgICBkcmFnZ2VkSXRlbVBvczoge1xuICAgICAgICAgICAgdG9wOiBncmlkUmVsWVBvcyxcbiAgICAgICAgICAgIGxlZnQ6IGdyaWRSZWxYUG9zLFxuICAgICAgICAgICAgd2lkdGg6IGRyYWdFbGVtQ2xpZW50UmVjdC53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogZHJhZ0VsZW1DbGllbnRSZWN0LmhlaWdodFxuICAgICAgICB9XG4gICAgfTtcbn1cblxuLyoqXG4gKiBHaXZlbiB0aGUgZ3JpZCBjb25maWcgJiBsYXlvdXQgZGF0YSBhbmQgdGhlIGN1cnJlbnQgZHJhZyBwb3NpdGlvbiAmIGluZm9ybWF0aW9uLCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGxheW91dCBhbmQgZHJhZyBpdGVtIHBvc2l0aW9uXG4gKiBAcGFyYW0gZ3JpZEl0ZW0gZ3JpZCBpdGVtIHRoYXQgaXMgYmVlbiBkcmFnZ2VkXG4gKiBAcGFyYW0gY29uZmlnIGN1cnJlbnQgZ3JpZCBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0gY29tcGFjdGlvblR5cGUgdHlwZSBvZiBjb21wYWN0aW9uIHRoYXQgd2lsbCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSBkcmFnZ2luZ0RhdGEgY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZHJhZ1xuICovXG5leHBvcnQgZnVuY3Rpb24ga3RkR3JpZEl0ZW1SZXNpemluZyhcbiAgICBncmlkSXRlbTogS3RkR3JpZEl0ZW1Db21wb25lbnQsXG4gICAgY29uZmlnOiBLdGRHcmlkQ2ZnLFxuICAgIGNvbXBhY3Rpb25UeXBlOiBDb21wYWN0VHlwZSxcbiAgICBkcmFnZ2luZ0RhdGE6IEt0ZERyYWdnaW5nRGF0YVxuKTogeyBsYXlvdXQ6IEt0ZEdyaWRMYXlvdXRJdGVtW107IGRyYWdnZWRJdGVtUG9zOiBLdGRHcmlkSXRlbVJlY3QgfSB7XG4gICAgY29uc3QgeyBwb2ludGVyRG93bkV2ZW50LCBwb2ludGVyRHJhZ0V2ZW50LCBncmlkRWxlbUNsaWVudFJlY3QsIGRyYWdFbGVtQ2xpZW50UmVjdCwgc2Nyb2xsRGlmZmVyZW5jZSB9ID1cbiAgICAgICAgZHJhZ2dpbmdEYXRhO1xuICAgIGNvbnN0IGdyaWRJdGVtSWQgPSBncmlkSXRlbS5pZDtcblxuICAgIGNvbnN0IGNsaWVudFN0YXJ0WCA9IGt0ZFBvaW50ZXJDbGllbnRYKHBvaW50ZXJEb3duRXZlbnQpO1xuICAgIGNvbnN0IGNsaWVudFN0YXJ0WSA9IGt0ZFBvaW50ZXJDbGllbnRZKHBvaW50ZXJEb3duRXZlbnQpO1xuICAgIGNvbnN0IGNsaWVudFggPSBrdGRQb2ludGVyQ2xpZW50WChwb2ludGVyRHJhZ0V2ZW50KTtcbiAgICBjb25zdCBjbGllbnRZID0ga3RkUG9pbnRlckNsaWVudFkocG9pbnRlckRyYWdFdmVudCk7XG5cbiAgICAvLyBHZXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbW91c2VEb3duIGFuZCB0aGUgcG9zaXRpb24gJ3JpZ2h0JyBvZiB0aGUgcmVzaXplIGVsZW1lbnQuXG4gICAgY29uc3QgcmVzaXplRWxlbU9mZnNldFggPSBkcmFnRWxlbUNsaWVudFJlY3Qud2lkdGggLSAoY2xpZW50U3RhcnRYIC0gZHJhZ0VsZW1DbGllbnRSZWN0LmxlZnQpO1xuICAgIGNvbnN0IHJlc2l6ZUVsZW1PZmZzZXRZID0gZHJhZ0VsZW1DbGllbnRSZWN0LmhlaWdodCAtIChjbGllbnRTdGFydFkgLSBkcmFnRWxlbUNsaWVudFJlY3QudG9wKTtcblxuICAgIGNvbnN0IGRyYWdnaW5nRWxlbVByZXZJdGVtID0gY29uZmlnLmxheW91dC5maW5kKChpdGVtKSA9PiBpdGVtLmlkID09PSBncmlkSXRlbUlkKSE7XG4gICAgY29uc3Qgd2lkdGggPSBjbGllbnRYICsgcmVzaXplRWxlbU9mZnNldFggLSAoZHJhZ0VsZW1DbGllbnRSZWN0LmxlZnQgKyBzY3JvbGxEaWZmZXJlbmNlLmxlZnQpO1xuICAgIGNvbnN0IGhlaWdodCA9IGNsaWVudFkgKyByZXNpemVFbGVtT2Zmc2V0WSAtIChkcmFnRWxlbUNsaWVudFJlY3QudG9wICsgc2Nyb2xsRGlmZmVyZW5jZS50b3ApO1xuXG4gICAgY29uc3Qgcm93SGVpZ2h0SW5QaXhlbHMgPVxuICAgICAgICBjb25maWcucm93SGVpZ2h0ID09PSAnZml0J1xuICAgICAgICAgICAgPyBrdGRHZXRHcmlkSXRlbVJvd0hlaWdodChjb25maWcubGF5b3V0LCBjb25maWcuaGVpZ2h0ID8/IGdyaWRFbGVtQ2xpZW50UmVjdC5oZWlnaHQsIGNvbmZpZy5nYXApXG4gICAgICAgICAgICA6IGNvbmZpZy5yb3dIZWlnaHQ7XG5cbiAgICAvLyBHZXQgbGF5b3V0IGl0ZW0gZ3JpZCBwb3NpdGlvblxuICAgIGNvbnN0IGxheW91dEl0ZW06IEt0ZEdyaWRMYXlvdXRJdGVtID0ge1xuICAgICAgICAuLi5kcmFnZ2luZ0VsZW1QcmV2SXRlbSxcbiAgICAgICAgdzogc2NyZWVuV2lkdGhUb0dyaWRXaWR0aCh3aWR0aCwgY29uZmlnLmNvbHMsIGdyaWRFbGVtQ2xpZW50UmVjdC53aWR0aCwgY29uZmlnLmdhcCksXG4gICAgICAgIGg6IHNjcmVlbkhlaWdodFRvR3JpZEhlaWdodChoZWlnaHQsIHJvd0hlaWdodEluUGl4ZWxzLCBncmlkRWxlbUNsaWVudFJlY3QuaGVpZ2h0LCBjb25maWcuZ2FwKVxuICAgIH07XG5cbiAgICBsYXlvdXRJdGVtLncgPSBsaW1pdE51bWJlcldpdGhpblJhbmdlKFxuICAgICAgICBsYXlvdXRJdGVtLncsXG4gICAgICAgIGdyaWRJdGVtLm1pblcgPz8gbGF5b3V0SXRlbS5taW5XLFxuICAgICAgICBncmlkSXRlbS5tYXhXID8/IGxheW91dEl0ZW0ubWF4V1xuICAgICk7XG4gICAgbGF5b3V0SXRlbS5oID0gbGltaXROdW1iZXJXaXRoaW5SYW5nZShcbiAgICAgICAgbGF5b3V0SXRlbS5oLFxuICAgICAgICBncmlkSXRlbS5taW5IID8/IGxheW91dEl0ZW0ubWluSCxcbiAgICAgICAgZ3JpZEl0ZW0ubWF4SCA/PyBsYXlvdXRJdGVtLm1heEhcbiAgICApO1xuXG4gICAgaWYgKGxheW91dEl0ZW0ueCArIGxheW91dEl0ZW0udyA+IGNvbmZpZy5jb2xzKSB7XG4gICAgICAgIGxheW91dEl0ZW0udyA9IE1hdGgubWF4KDEsIGNvbmZpZy5jb2xzIC0gbGF5b3V0SXRlbS54KTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLnByZXZlbnRDb2xsaXNpb24pIHtcbiAgICAgICAgY29uc3QgbWF4VyA9IGxheW91dEl0ZW0udztcbiAgICAgICAgY29uc3QgbWF4SCA9IGxheW91dEl0ZW0uaDtcblxuICAgICAgICBsZXQgY29sbGlkaW5nID0gaGFzQ29sbGlzaW9uKGNvbmZpZy5sYXlvdXQsIGxheW91dEl0ZW0pO1xuICAgICAgICBsZXQgc2hydW5rRGltZW5zaW9uOiAndycgfCAnaCcgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgd2hpbGUgKGNvbGxpZGluZykge1xuICAgICAgICAgICAgc2hydW5rRGltZW5zaW9uID0gZ2V0RGltZW5zaW9uVG9TaHJpbmsobGF5b3V0SXRlbSwgc2hydW5rRGltZW5zaW9uKTtcbiAgICAgICAgICAgIGxheW91dEl0ZW1bc2hydW5rRGltZW5zaW9uXS0tO1xuICAgICAgICAgICAgY29sbGlkaW5nID0gaGFzQ29sbGlzaW9uKGNvbmZpZy5sYXlvdXQsIGxheW91dEl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNocnVua0RpbWVuc2lvbiA9PT0gJ3cnKSB7XG4gICAgICAgICAgICBsYXlvdXRJdGVtLmggPSBtYXhIO1xuXG4gICAgICAgICAgICBjb2xsaWRpbmcgPSBoYXNDb2xsaXNpb24oY29uZmlnLmxheW91dCwgbGF5b3V0SXRlbSk7XG4gICAgICAgICAgICB3aGlsZSAoY29sbGlkaW5nKSB7XG4gICAgICAgICAgICAgICAgbGF5b3V0SXRlbS5oLS07XG4gICAgICAgICAgICAgICAgY29sbGlkaW5nID0gaGFzQ29sbGlzaW9uKGNvbmZpZy5sYXlvdXQsIGxheW91dEl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzaHJ1bmtEaW1lbnNpb24gPT09ICdoJykge1xuICAgICAgICAgICAgbGF5b3V0SXRlbS53ID0gbWF4VztcblxuICAgICAgICAgICAgY29sbGlkaW5nID0gaGFzQ29sbGlzaW9uKGNvbmZpZy5sYXlvdXQsIGxheW91dEl0ZW0pO1xuICAgICAgICAgICAgd2hpbGUgKGNvbGxpZGluZykge1xuICAgICAgICAgICAgICAgIGxheW91dEl0ZW0udy0tO1xuICAgICAgICAgICAgICAgIGNvbGxpZGluZyA9IGhhc0NvbGxpc2lvbihjb25maWcubGF5b3V0LCBsYXlvdXRJdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG5ld0xheW91dEl0ZW1zOiBMYXlvdXRJdGVtW10gPSBjb25maWcubGF5b3V0Lm1hcCgoaXRlbSk6IGFueSA9PiAoaXRlbS5pZCA9PT0gZ3JpZEl0ZW1JZCA/IGxheW91dEl0ZW0gOiBpdGVtKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBsYXlvdXQ6IGNvbXBhY3QobmV3TGF5b3V0SXRlbXMsIGNvbXBhY3Rpb25UeXBlLCBjb25maWcuY29scyksXG4gICAgICAgIGRyYWdnZWRJdGVtUG9zOiB7XG4gICAgICAgICAgICB0b3A6IGRyYWdFbGVtQ2xpZW50UmVjdC50b3AgLSBncmlkRWxlbUNsaWVudFJlY3QudG9wLFxuICAgICAgICAgICAgbGVmdDogZHJhZ0VsZW1DbGllbnRSZWN0LmxlZnQgLSBncmlkRWxlbUNsaWVudFJlY3QubGVmdCxcbiAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBoYXNDb2xsaXNpb24obGF5b3V0OiBMYXlvdXQsIGxheW91dEl0ZW06IExheW91dEl0ZW0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFnZXRGaXJzdENvbGxpc2lvbihsYXlvdXQsIGxheW91dEl0ZW0pO1xufVxuXG5mdW5jdGlvbiBnZXREaW1lbnNpb25Ub1NocmluayhsYXlvdXRJdGVtLCBsYXN0U2hydW5rKTogJ3cnIHwgJ2gnIHtcbiAgICBpZiAobGF5b3V0SXRlbS5oIDw9IDEpIHtcbiAgICAgICAgcmV0dXJuICd3JztcbiAgICB9XG4gICAgaWYgKGxheW91dEl0ZW0udyA8PSAxKSB7XG4gICAgICAgIHJldHVybiAnaCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhc3RTaHJ1bmsgPT09ICd3JyA/ICdoJyA6ICd3Jztcbn1cblxuLyoqXG4gKiBHaXZlbiB0aGUgY3VycmVudCBudW1iZXIgYW5kIG1pbi9tYXggdmFsdWVzLCByZXR1cm5zIHRoZSBudW1iZXIgd2l0aGluIHRoZSByYW5nZVxuICogQHBhcmFtIG51bWJlciBjYW4gYmUgYW55IG51bWVyaWMgdmFsdWVcbiAqIEBwYXJhbSBtaW4gbWluaW11bSB2YWx1ZSBvZiByYW5nZVxuICogQHBhcmFtIG1heCBtYXhpbXVtIHZhbHVlIG9mIHJhbmdlXG4gKi9cbmZ1bmN0aW9uIGxpbWl0TnVtYmVyV2l0aGluUmFuZ2UobnVtOiBudW1iZXIsIG1pbjogbnVtYmVyID0gMSwgbWF4OiBudW1iZXIgPSBJbmZpbml0eSk6IGFueSB7XG4gICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KG51bSwgbWluIDwgMSA/IDEgOiBtaW4pLCBtYXgpO1xufVxuXG4vKiogUmV0dXJucyB0cnVlIGlmIGJvdGggaXRlbTEgYW5kIGl0ZW0yIEt0ZEdyaWRMYXlvdXRJdGVtcyBhcmUgZXF1aXZhbGVudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBrdGRHcmlkSXRlbUxheW91dEl0ZW1BcmVFcXVhbChpdGVtMTogS3RkR3JpZExheW91dEl0ZW0sIGl0ZW0yOiBLdGRHcmlkTGF5b3V0SXRlbSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAgIGl0ZW0xLmlkID09PSBpdGVtMi5pZCAmJlxuICAgICAgICBpdGVtMS54ID09PSBpdGVtMi54ICYmXG4gICAgICAgIGl0ZW0xLnkgPT09IGl0ZW0yLnkgJiZcbiAgICAgICAgaXRlbTEudyA9PT0gaXRlbTIudyAmJlxuICAgICAgICBpdGVtMS5oID09PSBpdGVtMi5oXG4gICAgKTtcbn1cblxuIl19
@@ -0,0 +1,17 @@
1
+ import { Observable } from 'rxjs';
2
+ import { filter } from 'rxjs/operators';
3
+ /** Runs source observable outside the zone */
4
+ export function ktdOutsideZone(zone) {
5
+ return (source) => {
6
+ return new Observable(observer => {
7
+ return zone.runOutsideAngular(() => source.subscribe(observer));
8
+ });
9
+ };
10
+ }
11
+ /** Rxjs operator that makes source observable to no emit any data */
12
+ export function ktdNoEmit() {
13
+ return (source$) => {
14
+ return source$.pipe(filter(() => false));
15
+ };
16
+ }
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2EtdXNlci13b3Jrc3BhY2Uvc3JjL2xpYi91dGlscy9vcGVyYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDaEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXhDLDhDQUE4QztBQUM5QyxNQUFNLFVBQVUsY0FBYyxDQUFJLElBQVk7SUFDMUMsT0FBTyxDQUFDLE1BQXFCLEVBQUUsRUFBRTtRQUM3QixPQUFPLElBQUksVUFBVSxDQUFJLFFBQVEsQ0FBQyxFQUFFO1lBQ2hDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFlLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNsRixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQztBQUNOLENBQUM7QUFHRCxxRUFBcUU7QUFDckUsTUFBTSxVQUFVLFNBQVM7SUFDckIsT0FBTyxDQUFDLE9BQXdCLEVBQW1CLEVBQUU7UUFDakQsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzdDLENBQUMsQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG4vKiogUnVucyBzb3VyY2Ugb2JzZXJ2YWJsZSBvdXRzaWRlIHRoZSB6b25lICovXG5leHBvcnQgZnVuY3Rpb24ga3RkT3V0c2lkZVpvbmU8VD4oem9uZTogTmdab25lKSB7XG4gICAgcmV0dXJuIChzb3VyY2U6IE9ic2VydmFibGU8VD4pID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPFQ+KG9ic2VydmVyID0+IHtcbiAgICAgICAgICAgIHJldHVybiB6b25lLnJ1bk91dHNpZGVBbmd1bGFyPFN1YnNjcmlwdGlvbj4oKCkgPT4gc291cmNlLnN1YnNjcmliZShvYnNlcnZlcikpO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG5cbi8qKiBSeGpzIG9wZXJhdG9yIHRoYXQgbWFrZXMgc291cmNlIG9ic2VydmFibGUgdG8gbm8gZW1pdCBhbnkgZGF0YSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGt0ZE5vRW1pdCgpIHtcbiAgICByZXR1cm4gKHNvdXJjZSQ6IE9ic2VydmFibGU8YW55Pik6IE9ic2VydmFibGU8YW55PiA9PiB7XG4gICAgICAgIHJldHVybiBzb3VyY2UkLnBpcGUoZmlsdGVyKCgpID0+IGZhbHNlKSk7XG4gICAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,29 @@
1
+ /** Cached result of whether the user's browser supports passive event listeners. */
2
+ let supportsPassiveEvents;
3
+ /**
4
+ * Checks whether the user's browser supports passive event listeners.
5
+ * See: https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md
6
+ */
7
+ export function ktdSupportsPassiveEventListeners() {
8
+ if (supportsPassiveEvents == null && typeof window !== 'undefined') {
9
+ try {
10
+ window.addEventListener('test', null, Object.defineProperty({}, 'passive', {
11
+ get: () => supportsPassiveEvents = true
12
+ }));
13
+ }
14
+ finally {
15
+ supportsPassiveEvents = supportsPassiveEvents || false;
16
+ }
17
+ }
18
+ return supportsPassiveEvents;
19
+ }
20
+ /**
21
+ * Normalizes an `AddEventListener` object to something that can be passed
22
+ * to `addEventListener` on any browser, no matter whether it supports the
23
+ * `options` parameter.
24
+ * @param options Object to be normalized.
25
+ */
26
+ export function ktdNormalizePassiveListenerOptions(options) {
27
+ return ktdSupportsPassiveEventListeners() ? options : !!options.capture;
28
+ }
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc2l2ZS1saXN0ZW5lcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS11c2VyLXdvcmtzcGFjZS9zcmMvbGliL3V0aWxzL3Bhc3NpdmUtbGlzdGVuZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9GQUFvRjtBQUNwRixJQUFJLHFCQUE4QixDQUFDO0FBRW5DOzs7R0FHRztBQUNILE1BQU0sVUFBVSxnQ0FBZ0M7SUFDNUMsSUFBSSxxQkFBcUIsSUFBSSxJQUFJLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7UUFDakUsSUFBSSxDQUFDO1lBQ0QsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxJQUFLLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFO2dCQUN4RSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMscUJBQXFCLEdBQUcsSUFBSTthQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUM7Z0JBQVMsQ0FBQztZQUNQLHFCQUFxQixHQUFHLHFCQUFxQixJQUFJLEtBQUssQ0FBQztRQUMzRCxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8scUJBQXFCLENBQUM7QUFDakMsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGtDQUFrQyxDQUFDLE9BQWdDO0lBRS9FLE9BQU8sZ0NBQWdDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUM1RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIENhY2hlZCByZXN1bHQgb2Ygd2hldGhlciB0aGUgdXNlcidzIGJyb3dzZXIgc3VwcG9ydHMgcGFzc2l2ZSBldmVudCBsaXN0ZW5lcnMuICovXG5sZXQgc3VwcG9ydHNQYXNzaXZlRXZlbnRzOiBib29sZWFuO1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSB1c2VyJ3MgYnJvd3NlciBzdXBwb3J0cyBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycy5cbiAqIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL1dJQ0cvRXZlbnRMaXN0ZW5lck9wdGlvbnMvYmxvYi9naC1wYWdlcy9leHBsYWluZXIubWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGt0ZFN1cHBvcnRzUGFzc2l2ZUV2ZW50TGlzdGVuZXJzKCk6IGJvb2xlYW4ge1xuICAgIGlmIChzdXBwb3J0c1Bhc3NpdmVFdmVudHMgPT0gbnVsbCAmJiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBudWxsISwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAncGFzc2l2ZScsIHtcbiAgICAgICAgICAgICAgICBnZXQ6ICgpID0+IHN1cHBvcnRzUGFzc2l2ZUV2ZW50cyA9IHRydWVcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHN1cHBvcnRzUGFzc2l2ZUV2ZW50cyA9IHN1cHBvcnRzUGFzc2l2ZUV2ZW50cyB8fCBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdXBwb3J0c1Bhc3NpdmVFdmVudHM7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhbiBgQWRkRXZlbnRMaXN0ZW5lcmAgb2JqZWN0IHRvIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBwYXNzZWRcbiAqIHRvIGBhZGRFdmVudExpc3RlbmVyYCBvbiBhbnkgYnJvd3Nlciwgbm8gbWF0dGVyIHdoZXRoZXIgaXQgc3VwcG9ydHMgdGhlXG4gKiBgb3B0aW9uc2AgcGFyYW1ldGVyLlxuICogQHBhcmFtIG9wdGlvbnMgT2JqZWN0IHRvIGJlIG5vcm1hbGl6ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBrdGROb3JtYWxpemVQYXNzaXZlTGlzdGVuZXJPcHRpb25zKG9wdGlvbnM6IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zKTpcbiAgICBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyB8IGJvb2xlYW4ge1xuICAgIHJldHVybiBrdGRTdXBwb3J0c1Bhc3NpdmVFdmVudExpc3RlbmVycygpID8gb3B0aW9ucyA6ICEhb3B0aW9ucy5jYXB0dXJlO1xufVxuIl19