@limble/limble-tree 0.12.4 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +149 -149
  2. package/{esm2015/lib/classes/Branch.js → esm2020/lib/classes/Branch.mjs} +1 -1
  3. package/{esm2015/lib/classes/DropZone.js → esm2020/lib/classes/DropZone.mjs} +1 -1
  4. package/{esm2015/lib/classes/DropZoneLocation.js → esm2020/lib/classes/DropZoneLocation.mjs} +1 -1
  5. package/{esm2015/lib/custom-event-bindings/dragleave-no-change-detect.directive.js → esm2020/lib/custom-event-bindings/dragleave-no-change-detect.directive.mjs} +0 -0
  6. package/{esm2015/lib/custom-event-bindings/dragover-no-change-detect.directive.js → esm2020/lib/custom-event-bindings/dragover-no-change-detect.directive.mjs} +1 -1
  7. package/esm2020/lib/drop-zone/drop-zone.component.mjs +75 -0
  8. package/esm2020/lib/limble-tree-branch/limble-tree-branch.component.mjs +110 -0
  9. package/esm2020/lib/limble-tree-node/limble-tree-node.component.mjs +467 -0
  10. package/{esm2015/lib/limble-tree-placeholder/limble-tree-placeholder.component.js → esm2020/lib/limble-tree-placeholder/limble-tree-placeholder.component.mjs} +3 -8
  11. package/esm2020/lib/limble-tree-root/drop-zone.service.mjs +376 -0
  12. package/esm2020/lib/limble-tree-root/limble-tree-root.component.mjs +172 -0
  13. package/{esm2015/lib/limble-tree-root/tree-construction-status.service.js → esm2020/lib/limble-tree-root/tree-construction-status.service.mjs} +1 -1
  14. package/esm2020/lib/limble-tree-root/tree.service.mjs +297 -0
  15. package/{esm2015/lib/limble-tree.module.js → esm2020/lib/limble-tree.module.mjs} +5 -5
  16. package/{esm2015/lib/singletons/component-creator.service.js → esm2020/lib/singletons/component-creator.service.mjs} +1 -1
  17. package/esm2020/lib/singletons/drag-state.service.mjs +63 -0
  18. package/esm2020/lib/singletons/global-events.service.mjs +136 -0
  19. package/{esm2015/lib/util.js → esm2020/lib/util.mjs} +1 -1
  20. package/{esm2015/limble-limble-tree.js → esm2020/limble-limble-tree.mjs} +0 -0
  21. package/{esm2015/public-api.js → esm2020/public-api.mjs} +1 -1
  22. package/fesm2015/limble-limble-tree.mjs +2256 -0
  23. package/fesm2015/limble-limble-tree.mjs.map +1 -0
  24. package/{fesm2015/limble-limble-tree.js → fesm2020/limble-limble-tree.mjs} +89 -136
  25. package/fesm2020/limble-limble-tree.mjs.map +1 -0
  26. package/{limble-limble-tree.d.ts → index.d.ts} +0 -0
  27. package/lib/custom-event-bindings/dragleave-no-change-detect.directive.d.ts +1 -1
  28. package/lib/custom-event-bindings/dragover-no-change-detect.directive.d.ts +1 -1
  29. package/lib/drop-zone/drop-zone.component.d.ts +1 -1
  30. package/lib/limble-tree-branch/limble-tree-branch.component.d.ts +1 -1
  31. package/lib/limble-tree-node/limble-tree-node.component.d.ts +1 -1
  32. package/lib/limble-tree-placeholder/limble-tree-placeholder.component.d.ts +1 -1
  33. package/lib/limble-tree-root/limble-tree-root.component.d.ts +1 -1
  34. package/package.json +22 -9
  35. package/bundles/limble-limble-tree.umd.js +0 -2910
  36. package/bundles/limble-limble-tree.umd.js.map +0 -1
  37. package/esm2015/lib/drop-zone/drop-zone.component.js +0 -81
  38. package/esm2015/lib/limble-tree-branch/limble-tree-branch.component.js +0 -116
  39. package/esm2015/lib/limble-tree-node/limble-tree-node.component.js +0 -484
  40. package/esm2015/lib/limble-tree-root/drop-zone.service.js +0 -377
  41. package/esm2015/lib/limble-tree-root/limble-tree-root.component.js +0 -178
  42. package/esm2015/lib/limble-tree-root/tree.service.js +0 -301
  43. package/esm2015/lib/singletons/drag-state.service.js +0 -64
  44. package/esm2015/lib/singletons/global-events.service.js +0 -137
  45. package/fesm2015/limble-limble-tree.js.map +0 -1
@@ -0,0 +1,110 @@
1
+ import { Component, Input, ViewChild, ViewContainerRef } from "@angular/core";
2
+ import { DropZone } from "../classes/DropZone";
3
+ import { filter } from "rxjs/operators";
4
+ import { isNestingAllowed } from "../util";
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../limble-tree-root/tree.service";
7
+ import * as i2 from "../limble-tree-root/drop-zone.service";
8
+ import * as i3 from "../limble-tree-root/tree-construction-status.service";
9
+ import * as i4 from "@angular/common";
10
+ import * as i5 from "../drop-zone/drop-zone.component";
11
+ const _c0 = ["children"];
12
+ function LimbleTreeBranchComponent_drop_zone_1_Template(rf, ctx) { if (rf & 1) {
13
+ i0.ɵɵelement(0, "drop-zone", 3);
14
+ } if (rf & 2) {
15
+ const ctx_r0 = i0.ɵɵnextContext();
16
+ i0.ɵɵproperty("dropZone", ctx_r0.dropZoneInside);
17
+ } }
18
+ function LimbleTreeBranchComponent_ng_template_3_Template(rf, ctx) { }
19
+ export class LimbleTreeBranchComponent {
20
+ constructor(treeService, changeDetectorRef, dropZoneService, treeConstructionStatus, ngZone) {
21
+ this.treeService = treeService;
22
+ this.changeDetectorRef = changeDetectorRef;
23
+ this.dropZoneService = dropZoneService;
24
+ this.treeConstructionStatus = treeConstructionStatus;
25
+ this.ngZone = ngZone;
26
+ this.treeConstructionStatus.constructing();
27
+ this.indent = this.treeService.treeOptions?.indent;
28
+ this.renderDropZoneInside = false;
29
+ }
30
+ ngOnInit() {
31
+ this.addDropZoneInside();
32
+ this.ngZone.runOutsideAngular(() => {
33
+ if (this.dropZoneInside === undefined) {
34
+ throw new Error("drop zone inside is not defined");
35
+ }
36
+ this.dropZoneInside
37
+ .getCommChannel()
38
+ .pipe(filter((message) => message === "checkRendered"))
39
+ .subscribe(() => {
40
+ if (this.dropZoneInside === undefined ||
41
+ this.branch === undefined) {
42
+ throw new Error("Zones not registered");
43
+ }
44
+ if (isNestingAllowed(this.treeService.treeOptions, this.branch.data)) {
45
+ this.renderDropZoneInside = this.dropZoneInside.isRendered();
46
+ }
47
+ });
48
+ });
49
+ }
50
+ ngAfterViewInit() {
51
+ this.reRender();
52
+ this.setDropZoneHost();
53
+ this.treeConstructionStatus.doneConstructing();
54
+ this.changeDetectorRef.detectChanges();
55
+ }
56
+ ngOnDestroy() {
57
+ if (this.dropZoneInside !== undefined) {
58
+ this.dropZoneService.removeDropZone(this.dropZoneInside);
59
+ }
60
+ this.treeService.cleanupSignal$.next(true);
61
+ }
62
+ addDropZoneInside() {
63
+ if (this.branch === undefined) {
64
+ throw new Error("failed to register drop zone inside");
65
+ }
66
+ this.dropZoneInside = new DropZone([...this.branch.getCoordinates()], 0);
67
+ this.dropZoneService.addDropZone(this.dropZoneInside);
68
+ }
69
+ reRender() {
70
+ if (this.children === undefined || this.branch === undefined) {
71
+ throw new Error("Failed to render limble tree branch");
72
+ }
73
+ this.treeService.renderBranch(this.children, this.branch);
74
+ }
75
+ setDropZoneHost() {
76
+ if (this.children === undefined || this.dropZoneInside === undefined) {
77
+ throw new Error("Failed to add drop zone host");
78
+ }
79
+ this.dropZoneInside.setHost(this.children);
80
+ }
81
+ }
82
+ LimbleTreeBranchComponent.ɵfac = function LimbleTreeBranchComponent_Factory(t) { return new (t || LimbleTreeBranchComponent)(i0.ɵɵdirectiveInject(i1.TreeService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i2.DropZoneService), i0.ɵɵdirectiveInject(i3.TreeConstructionStatus), i0.ɵɵdirectiveInject(i0.NgZone)); };
83
+ LimbleTreeBranchComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: LimbleTreeBranchComponent, selectors: [["limble-tree-branch"]], viewQuery: function LimbleTreeBranchComponent_Query(rf, ctx) { if (rf & 1) {
84
+ i0.ɵɵviewQuery(_c0, 5, ViewContainerRef);
85
+ } if (rf & 2) {
86
+ let _t;
87
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.children = _t.first);
88
+ } }, inputs: { branch: "branch" }, decls: 5, vars: 4, consts: [[3, "dropZone", 4, "ngIf"], [1, "limble-child-nodes", 3, "hidden"], ["children", ""], [3, "dropZone"]], template: function LimbleTreeBranchComponent_Template(rf, ctx) { if (rf & 1) {
89
+ i0.ɵɵelementStart(0, "div");
90
+ i0.ɵɵtemplate(1, LimbleTreeBranchComponent_drop_zone_1_Template, 1, 1, "drop-zone", 0);
91
+ i0.ɵɵelementStart(2, "span", 1);
92
+ i0.ɵɵtemplate(3, LimbleTreeBranchComponent_ng_template_3_Template, 0, 0, "ng-template", null, 2, i0.ɵɵtemplateRefExtractor);
93
+ i0.ɵɵelementEnd()();
94
+ } if (rf & 2) {
95
+ i0.ɵɵstyleProp("margin-left", ctx.indent, "px");
96
+ i0.ɵɵadvance(1);
97
+ i0.ɵɵproperty("ngIf", ctx.renderDropZoneInside);
98
+ i0.ɵɵadvance(1);
99
+ i0.ɵɵproperty("hidden", ctx.branch && ctx.branch.data.collapsed);
100
+ } }, dependencies: [i4.NgIf, i5.DropZoneComponent] });
101
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LimbleTreeBranchComponent, [{
102
+ type: Component,
103
+ args: [{ selector: "limble-tree-branch", template: "<div [style.marginLeft.px]=\"indent\">\n <drop-zone\n *ngIf=\"renderDropZoneInside\"\n [dropZone]=\"dropZoneInside\"\n ></drop-zone>\n <span [hidden]=\"branch && branch.data.collapsed\" class=\"limble-child-nodes\">\n <ng-template #children></ng-template>\n </span>\n</div>\n" }]
104
+ }], function () { return [{ type: i1.TreeService }, { type: i0.ChangeDetectorRef }, { type: i2.DropZoneService }, { type: i3.TreeConstructionStatus }, { type: i0.NgZone }]; }, { branch: [{
105
+ type: Input
106
+ }], children: [{
107
+ type: ViewChild,
108
+ args: ["children", { read: ViewContainerRef }]
109
+ }] }); })();
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGltYmxlLXRyZWUtYnJhbmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xpbWJsZS10cmVlL3NyYy9saWIvbGltYmxlLXRyZWUtYnJhbmNoL2xpbWJsZS10cmVlLWJyYW5jaC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saW1ibGUtdHJlZS9zcmMvbGliL2xpbWJsZS10cmVlLWJyYW5jaC9saW1ibGUtdHJlZS1icmFuY2guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdKLFNBQVMsRUFDVCxLQUFLLEVBSUwsU0FBUyxFQUNULGdCQUFnQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFNBQVMsQ0FBQzs7Ozs7Ozs7O0lDZHhDLCtCQUdhOzs7SUFEVixnREFBMkI7OztBRHFCakMsTUFBTSxPQUFPLHlCQUF5QjtJQWFuQyxZQUNXLFdBQXdCLEVBQ2YsaUJBQW9DLEVBQ3BDLGVBQWdDLEVBQ2hDLHNCQUE4QyxFQUM5QyxNQUFjO1FBSnZCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ2Ysc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUM5QyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBRS9CLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQztRQUNuRCxJQUFJLENBQUMsb0JB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QW9DO1FBQ2pDLHNGQUdhO1FBQ2IsK0JBQTRFO1FBQ3pFLDJIQUFxQztRQUN4QyxpQkFBTyxFQUFBOztRQVBMLCtDQUE4QjtRQUU1QixlQUEwQjtRQUExQiwrQ0FBMEI7UUFHeEIsZUFBMEM7UUFBMUMsZ0VBQTBDOzt1RkRtQnRDLHlCQUF5QjtjQUxyQyxTQUFTOzJCQUNHLG9CQUFvQjtzTEFNckIsTUFBTTtrQkFBZCxLQUFLO1lBRTZDLFFBQVE7a0JBQTFELFNBQVM7bUJBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgIEFmdGVyVmlld0luaXQsXG4gICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgIENvbXBvbmVudCxcbiAgIElucHV0LFxuICAgTmdab25lLFxuICAgT25EZXN0cm95LFxuICAgT25Jbml0LFxuICAgVmlld0NoaWxkLFxuICAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgVHJlZVNlcnZpY2UgfSBmcm9tIFwiLi4vbGltYmxlLXRyZWUtcm9vdC90cmVlLnNlcnZpY2VcIjtcbmltcG9ydCB0eXBlIHsgQnJhbmNoIH0gZnJvbSBcIi4uL2NsYXNzZXMvQnJhbmNoXCI7XG5pbXBvcnQgeyBEcm9wWm9uZSB9IGZyb20gXCIuLi9jbGFzc2VzL0Ryb3Bab25lXCI7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IGlzTmVzdGluZ0FsbG93ZWQgfSBmcm9tIFwiLi4vdXRpbFwiO1xuaW1wb3J0IHsgRHJvcFpvbmVTZXJ2aWNlIH0gZnJvbSBcIi4uL2xpbWJsZS10cmVlLXJvb3QvZHJvcC16b25lLnNlcnZpY2VcIjtcbmltcG9ydCB7IFRyZWVDb25zdHJ1Y3Rpb25TdGF0dXMgfSBmcm9tIFwiLi4vbGltYmxlLXRyZWUtcm9vdC90cmVlLWNvbnN0cnVjdGlvbi1zdGF0dXMuc2VydmljZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgIHNlbGVjdG9yOiBcImxpbWJsZS10cmVlLWJyYW5jaFwiLFxuICAgdGVtcGxhdGVVcmw6IFwiLi9saW1ibGUtdHJlZS1icmFuY2guY29tcG9uZW50Lmh0bWxcIixcbiAgIHN0eWxlVXJsczogW1wiLi9saW1ibGUtdHJlZS1icmFuY2guY29tcG9uZW50LnNjc3NcIl1cbn0pXG5leHBvcnQgY2xhc3MgTGltYmxlVHJlZUJyYW5jaENvbXBvbmVudFxuICAgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkluaXQsIE9uRGVzdHJveSB7XG4gICBASW5wdXQoKSBicmFuY2g6IEJyYW5jaDxhbnk+IHwgdW5kZWZpbmVkO1xuXG4gICBAVmlld0NoaWxkKFwiY2hpbGRyZW5cIiwgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pIGNoaWxkcmVuOlxuICAgICAgfCBWaWV3Q29udGFpbmVyUmVmXG4gICAgICB8IHVuZGVmaW5lZDtcblxuICAgcHVibGljIGRyb3Bab25lSW5zaWRlOiBEcm9wWm9uZSB8IHVuZGVmaW5lZDtcbiAgIHB1YmxpYyByZW5kZXJEcm9wWm9uZUluc2lkZTogYm9vbGVhbjtcblxuICAgcHVibGljIHJlYWRvbmx5IGluZGVudDtcblxuICAgY29uc3RydWN0b3IoXG4gICAgICBwcml2YXRlIHRyZWVTZXJ2aWNlOiBUcmVlU2VydmljZSxcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgcHJpdmF0ZSByZWFkb25seSBkcm9wWm9uZVNlcnZpY2U6IERyb3Bab25lU2VydmljZSxcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgdHJlZUNvbnN0cnVjdGlvblN0YXR1czogVHJlZUNvbnN0cnVjdGlvblN0YXR1cyxcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgbmdab25lOiBOZ1pvbmVcbiAgICkge1xuICAgICAgdGhpcy50cmVlQ29uc3RydWN0aW9uU3RhdHVzLmNvbnN0cnVjdGluZygpO1xuICAgICAgdGhpcy5pbmRlbnQgPSB0aGlzLnRyZWVTZXJ2aWNlLnRyZWVPcHRpb25zPy5pbmRlbnQ7XG4gICAgICB0aGlzLnJlbmRlckRyb3Bab25lSW5zaWRlID0gZmFsc2U7XG4gICB9XG5cbiAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgIHRoaXMuYWRkRHJvcFpvbmVJbnNpZGUoKTtcbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgIGlmICh0aGlzLmRyb3Bab25lSW5zaWRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImRyb3Agem9uZSBpbnNpZGUgaXMgbm90IGRlZmluZWRcIik7XG4gICAgICAgICB9XG4gICAgICAgICB0aGlzLmRyb3Bab25lSW5zaWRlXG4gICAgICAgICAgICAuZ2V0Q29tbUNoYW5uZWwoKVxuICAgICAgICAgICAgLnBpcGUoZmlsdGVyKChtZXNzYWdlKSA9PiBtZXNzYWdlID09PSBcImNoZWNrUmVuZGVyZWRcIikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcFpvbmVJbnNpZGUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgICAgdGhpcy5icmFuY2ggPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJab25lcyBub3QgcmVnaXN0ZXJlZFwiKTtcbiAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIGlzTmVzdGluZ0FsbG93ZWQoXG4gICAgICAgICAgICAgICAgICAgICB0aGlzLnRyZWVTZXJ2aWNlLnRyZWVPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgdGhpcy5icmFuY2guZGF0YVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckRyb3Bab25lSW5zaWRlID0gdGhpcy5kcm9wWm9uZUluc2lkZS5pc1JlbmRlcmVkKCk7XG4gICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgfVxuXG4gICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgdGhpcy5yZVJlbmRlcigpO1xuICAgICAgdGhpcy5zZXREcm9wWm9uZUhvc3QoKTtcbiAgICAgIHRoaXMudHJlZUNvbnN0cnVjdGlvblN0YXR1cy5kb25lQ29uc3RydWN0aW5nKCk7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgIH1cblxuICAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgICAgaWYgKHRoaXMuZHJvcFpvbmVJbnNpZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgdGhpcy5kcm9wWm9uZVNlcnZpY2UucmVtb3ZlRHJvcFpvbmUodGhpcy5kcm9wWm9uZUluc2lkZSk7XG4gICAgICB9XG4gICAgICB0aGlzLnRyZWVTZXJ2aWNlLmNsZWFudXBTaWduYWwkLm5leHQodHJ1ZSk7XG4gICB9XG5cbiAgIHByaXZhdGUgYWRkRHJvcFpvbmVJbnNpZGUoKSB7XG4gICAgICBpZiAodGhpcy5icmFuY2ggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZmFpbGVkIHRvIHJlZ2lzdGVyIGRyb3Agem9uZSBpbnNpZGVcIik7XG4gICAgICB9XG4gICAgICB0aGlzLmRyb3Bab25lSW5zaWRlID0gbmV3IERyb3Bab25lKFsuLi50aGlzLmJyYW5jaC5nZXRDb29yZGluYXRlcygpXSwgMCk7XG4gICAgICB0aGlzLmRyb3Bab25lU2VydmljZS5hZGREcm9wWm9uZSh0aGlzLmRyb3Bab25lSW5zaWRlKTtcbiAgIH1cblxuICAgcHVibGljIHJlUmVuZGVyKCkge1xuICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gPT09IHVuZGVmaW5lZCB8fCB0aGlzLmJyYW5jaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcmVuZGVyIGxpbWJsZSB0cmVlIGJyYW5jaFwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudHJlZVNlcnZpY2UucmVuZGVyQnJhbmNoKHRoaXMuY2hpbGRyZW4sIHRoaXMuYnJhbmNoKTtcbiAgIH1cblxuICAgcHJpdmF0ZSBzZXREcm9wWm9uZUhvc3QoKSB7XG4gICAgICBpZiAodGhpcy5jaGlsZHJlbiA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuZHJvcFpvbmVJbnNpZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGFkZCBkcm9wIHpvbmUgaG9zdFwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZHJvcFpvbmVJbnNpZGUuc2V0SG9zdCh0aGlzLmNoaWxkcmVuKTtcbiAgIH1cbn1cbiIsIjxkaXYgW3N0eWxlLm1hcmdpbkxlZnQucHhdPVwiaW5kZW50XCI+XG4gICA8ZHJvcC16b25lXG4gICAgICAqbmdJZj1cInJlbmRlckRyb3Bab25lSW5zaWRlXCJcbiAgICAgIFtkcm9wWm9uZV09XCJkcm9wWm9uZUluc2lkZVwiXG4gICA+PC9kcm9wLXpvbmU+XG4gICA8c3BhbiBbaGlkZGVuXT1cImJyYW5jaCAmJiBicmFuY2guZGF0YS5jb2xsYXBzZWRcIiBjbGFzcz1cImxpbWJsZS1jaGlsZC1ub2Rlc1wiPlxuICAgICAgPG5nLXRlbXBsYXRlICNjaGlsZHJlbj48L25nLXRlbXBsYXRlPlxuICAgPC9zcGFuPlxuPC9kaXY+XG4iXX0=