@schneideress/dashboardframework 0.0.279 → 17.0.1

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 (159) hide show
  1. package/README.md +2 -2
  2. package/esm2022/gridster/index.mjs +12 -0
  3. package/esm2022/gridster/lib/gridster.component.mjs +627 -0
  4. package/esm2022/gridster/lib/gridster.interface.mjs +3 -0
  5. package/esm2022/gridster/lib/gridster.module.mjs +17 -0
  6. package/esm2022/gridster/lib/gridsterCompact.service.mjs +126 -0
  7. package/esm2022/gridster/lib/gridsterConfig.constant.mjs +118 -0
  8. package/esm2022/gridster/lib/gridsterConfig.interface.mjs +37 -0
  9. package/esm2022/gridster/lib/gridsterConfigS.interface.mjs +2 -0
  10. package/esm2022/gridster/lib/gridsterDraggable.service.mjs +405 -0
  11. package/esm2022/gridster/lib/gridsterEmptyCell.service.mjs +255 -0
  12. package/esm2022/gridster/lib/gridsterItem.component.mjs +228 -0
  13. package/esm2022/gridster/lib/gridsterItem.interface.mjs +3 -0
  14. package/esm2022/gridster/lib/gridsterPreview.component.mjs +36 -0
  15. package/esm2022/gridster/lib/gridsterPush.service.mjs +316 -0
  16. package/esm2022/gridster/lib/gridsterPushResize.service.mjs +225 -0
  17. package/esm2022/gridster/lib/gridsterRenderer.interface.mjs +2 -0
  18. package/esm2022/gridster/lib/gridsterRenderer.service.mjs +274 -0
  19. package/esm2022/gridster/lib/gridsterResizable.service.mjs +470 -0
  20. package/esm2022/gridster/lib/gridsterResizeEventType.interface.mjs +2 -0
  21. package/esm2022/gridster/lib/gridsterScroll.service.mjs +134 -0
  22. package/esm2022/gridster/lib/gridsterSwap.service.mjs +87 -0
  23. package/esm2022/gridster/lib/gridsterUtils.service.mjs +92 -0
  24. package/esm2022/lib/custom.notifier.options.mjs +41 -0
  25. package/esm2022/lib/ra-dashboard-area/ra.dashboard.area.mjs +460 -0
  26. package/esm2022/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.mjs +43 -0
  27. package/esm2022/lib/ra-widget-container/ra.widget.container.component.mjs +767 -0
  28. package/esm2022/lib/ra.base.dashboard.filter.mjs +41 -0
  29. package/esm2022/lib/ra.base.dashboard.template.mjs +33 -0
  30. package/esm2022/lib/ra.dashbard.event.bus.mjs +46 -0
  31. package/esm2022/lib/ra.dashboard.module.mjs +55 -0
  32. package/esm2022/lib/ra.dashboard.responsive.service.mjs +139 -0
  33. package/esm2022/lib/ra.dashboard.service.mjs +77 -0
  34. package/esm2022/lib/ra.event.enum.mjs +60 -0
  35. package/esm2022/lib/ra.gridster.config.mjs +56 -0
  36. package/esm2022/public-api.mjs +13 -0
  37. package/esm2022/schneideress-dashboardframework.mjs +5 -0
  38. package/fesm2022/schneideress-dashboardframework.mjs +5198 -0
  39. package/fesm2022/schneideress-dashboardframework.mjs.map +1 -0
  40. package/gridster/index.d.ts +9 -11
  41. package/gridster/lib/gridster.component.d.ts +79 -67
  42. package/gridster/lib/gridster.interface.d.ts +49 -46
  43. package/gridster/lib/gridster.module.d.ts +8 -2
  44. package/gridster/lib/gridsterCompact.service.d.ts +11 -15
  45. package/gridster/lib/gridsterConfig.constant.d.ts +2 -2
  46. package/gridster/lib/gridsterConfig.interface.d.ts +155 -133
  47. package/gridster/lib/gridsterConfigS.interface.d.ts +107 -93
  48. package/gridster/lib/gridsterDraggable.service.d.ts +68 -59
  49. package/gridster/lib/gridsterEmptyCell.service.d.ts +31 -29
  50. package/gridster/lib/gridsterItem.component.d.ts +61 -32
  51. package/gridster/lib/gridsterItem.interface.d.ts +64 -21
  52. package/gridster/lib/gridsterPreview.component.d.ts +17 -10
  53. package/gridster/lib/gridsterPush.service.d.ts +34 -33
  54. package/gridster/lib/gridsterPushResize.service.d.ts +26 -26
  55. package/gridster/lib/gridsterRenderer.interface.d.ts +14 -0
  56. package/gridster/lib/gridsterRenderer.service.d.ts +37 -38
  57. package/gridster/lib/gridsterResizable.service.d.ts +86 -67
  58. package/gridster/lib/gridsterResizeEventType.interface.d.ts +6 -6
  59. package/gridster/lib/gridsterScroll.service.d.ts +7 -4
  60. package/gridster/lib/gridsterSwap.service.d.ts +13 -13
  61. package/gridster/lib/gridsterUtils.service.d.ts +16 -16
  62. package/index.d.ts +5 -0
  63. package/lib/custom.notifier.options.d.ts +2 -2
  64. package/lib/ra-dashboard-area/ra.dashboard.area.d.ts +88 -86
  65. package/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.d.ts +20 -17
  66. package/lib/ra-widget-container/ra.widget.container.component.d.ts +142 -140
  67. package/lib/ra.base.dashboard.filter.d.ts +17 -16
  68. package/lib/ra.base.dashboard.template.d.ts +18 -16
  69. package/lib/ra.dashbard.event.bus.d.ts +23 -20
  70. package/lib/ra.dashboard.module.d.ts +16 -2
  71. package/lib/ra.dashboard.responsive.service.d.ts +24 -21
  72. package/lib/ra.dashboard.service.d.ts +25 -23
  73. package/lib/ra.event.enum.d.ts +57 -57
  74. package/lib/ra.gridster.config.d.ts +2 -2
  75. package/package.json +19 -19
  76. package/public-api.d.ts +9 -9
  77. package/bundles/schneideress-dashboardframework.umd.js +0 -5103
  78. package/bundles/schneideress-dashboardframework.umd.js.map +0 -1
  79. package/bundles/schneideress-dashboardframework.umd.min.js +0 -16
  80. package/bundles/schneideress-dashboardframework.umd.min.js.map +0 -1
  81. package/esm2015/gridster/index.js +0 -14
  82. package/esm2015/gridster/lib/gridster.component.js +0 -471
  83. package/esm2015/gridster/lib/gridster.interface.js +0 -3
  84. package/esm2015/gridster/lib/gridster.module.js +0 -25
  85. package/esm2015/gridster/lib/gridsterCompact.service.js +0 -162
  86. package/esm2015/gridster/lib/gridsterConfig.constant.js +0 -104
  87. package/esm2015/gridster/lib/gridsterConfig.interface.js +0 -27
  88. package/esm2015/gridster/lib/gridsterConfigS.interface.js +0 -1
  89. package/esm2015/gridster/lib/gridsterDraggable.service.js +0 -351
  90. package/esm2015/gridster/lib/gridsterEmptyCell.service.js +0 -216
  91. package/esm2015/gridster/lib/gridsterItem.component.js +0 -141
  92. package/esm2015/gridster/lib/gridsterItem.interface.js +0 -1
  93. package/esm2015/gridster/lib/gridsterItemComponent.interface.js +0 -3
  94. package/esm2015/gridster/lib/gridsterPreview.component.js +0 -45
  95. package/esm2015/gridster/lib/gridsterPush.service.js +0 -296
  96. package/esm2015/gridster/lib/gridsterPushResize.service.js +0 -225
  97. package/esm2015/gridster/lib/gridsterRenderer.service.js +0 -208
  98. package/esm2015/gridster/lib/gridsterResizable.service.js +0 -368
  99. package/esm2015/gridster/lib/gridsterResizeEventType.interface.js +0 -1
  100. package/esm2015/gridster/lib/gridsterScroll.service.js +0 -119
  101. package/esm2015/gridster/lib/gridsterSwap.service.js +0 -85
  102. package/esm2015/gridster/lib/gridsterUtils.service.js +0 -89
  103. package/esm2015/lib/custom.notifier.options.js +0 -41
  104. package/esm2015/lib/ra-dashboard-area/ra.dashboard.area.js +0 -492
  105. package/esm2015/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.js +0 -48
  106. package/esm2015/lib/ra-widget-container/ra.widget.container.component.js +0 -829
  107. package/esm2015/lib/ra.base.dashboard.filter.js +0 -54
  108. package/esm2015/lib/ra.base.dashboard.template.js +0 -33
  109. package/esm2015/lib/ra.dashbard.event.bus.js +0 -46
  110. package/esm2015/lib/ra.dashboard.module.js +0 -44
  111. package/esm2015/lib/ra.dashboard.responsive.service.js +0 -140
  112. package/esm2015/lib/ra.dashboard.service.js +0 -82
  113. package/esm2015/lib/ra.event.enum.js +0 -60
  114. package/esm2015/lib/ra.gridster.config.js +0 -56
  115. package/esm2015/public-api.js +0 -13
  116. package/esm2015/schneideress-dashboardframework.js +0 -11
  117. package/esm5/gridster/index.js +0 -14
  118. package/esm5/gridster/lib/gridster.component.js +0 -474
  119. package/esm5/gridster/lib/gridster.interface.js +0 -7
  120. package/esm5/gridster/lib/gridster.module.js +0 -28
  121. package/esm5/gridster/lib/gridsterCompact.service.js +0 -163
  122. package/esm5/gridster/lib/gridsterConfig.constant.js +0 -104
  123. package/esm5/gridster/lib/gridsterConfig.interface.js +0 -27
  124. package/esm5/gridster/lib/gridsterConfigS.interface.js +0 -1
  125. package/esm5/gridster/lib/gridsterDraggable.service.js +0 -356
  126. package/esm5/gridster/lib/gridsterEmptyCell.service.js +0 -220
  127. package/esm5/gridster/lib/gridsterItem.component.js +0 -142
  128. package/esm5/gridster/lib/gridsterItem.interface.js +0 -1
  129. package/esm5/gridster/lib/gridsterItemComponent.interface.js +0 -7
  130. package/esm5/gridster/lib/gridsterPreview.component.js +0 -46
  131. package/esm5/gridster/lib/gridsterPush.service.js +0 -297
  132. package/esm5/gridster/lib/gridsterPushResize.service.js +0 -226
  133. package/esm5/gridster/lib/gridsterRenderer.service.js +0 -209
  134. package/esm5/gridster/lib/gridsterResizable.service.js +0 -373
  135. package/esm5/gridster/lib/gridsterResizeEventType.interface.js +0 -1
  136. package/esm5/gridster/lib/gridsterScroll.service.js +0 -119
  137. package/esm5/gridster/lib/gridsterSwap.service.js +0 -86
  138. package/esm5/gridster/lib/gridsterUtils.service.js +0 -93
  139. package/esm5/lib/custom.notifier.options.js +0 -41
  140. package/esm5/lib/ra-dashboard-area/ra.dashboard.area.js +0 -503
  141. package/esm5/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.js +0 -50
  142. package/esm5/lib/ra-widget-container/ra.widget.container.component.js +0 -891
  143. package/esm5/lib/ra.base.dashboard.filter.js +0 -57
  144. package/esm5/lib/ra.base.dashboard.template.js +0 -36
  145. package/esm5/lib/ra.dashbard.event.bus.js +0 -47
  146. package/esm5/lib/ra.dashboard.module.js +0 -47
  147. package/esm5/lib/ra.dashboard.responsive.service.js +0 -151
  148. package/esm5/lib/ra.dashboard.service.js +0 -85
  149. package/esm5/lib/ra.event.enum.js +0 -60
  150. package/esm5/lib/ra.gridster.config.js +0 -56
  151. package/esm5/public-api.js +0 -13
  152. package/esm5/schneideress-dashboardframework.js +0 -11
  153. package/fesm2015/schneideress-dashboardframework.js +0 -4749
  154. package/fesm2015/schneideress-dashboardframework.js.map +0 -1
  155. package/fesm5/schneideress-dashboardframework.js +0 -4883
  156. package/fesm5/schneideress-dashboardframework.js.map +0 -1
  157. package/gridster/lib/gridsterItemComponent.interface.d.ts +0 -25
  158. package/schneideress-dashboardframework.d.ts +0 -10
  159. package/schneideress-dashboardframework.metadata.json +0 -1
@@ -0,0 +1,225 @@
1
+ export class GridsterPushResize {
2
+ constructor(gridsterItem) {
3
+ this.pushedItems = [];
4
+ this.pushedItemsPath = [];
5
+ this.gridsterItem = gridsterItem;
6
+ this.gridster = gridsterItem.gridster;
7
+ this.tryPattern = {
8
+ fromEast: this.tryWest,
9
+ fromWest: this.tryEast,
10
+ fromNorth: this.trySouth,
11
+ fromSouth: this.tryNorth
12
+ };
13
+ this.fromSouth = 'fromSouth';
14
+ this.fromNorth = 'fromNorth';
15
+ this.fromEast = 'fromEast';
16
+ this.fromWest = 'fromWest';
17
+ }
18
+ destroy() {
19
+ this.gridster = this.gridsterItem = null;
20
+ }
21
+ pushItems(direction) {
22
+ if (this.gridster.$options.pushResizeItems) {
23
+ return this.push(this.gridsterItem, direction);
24
+ }
25
+ else {
26
+ return false;
27
+ }
28
+ }
29
+ restoreItems() {
30
+ let i = 0;
31
+ const l = this.pushedItems.length;
32
+ let pushedItem;
33
+ for (; i < l; i++) {
34
+ pushedItem = this.pushedItems[i];
35
+ pushedItem.$item.x = pushedItem.item.x || 0;
36
+ pushedItem.$item.y = pushedItem.item.y || 0;
37
+ pushedItem.$item.cols = pushedItem.item.cols || 1;
38
+ pushedItem.$item.row = pushedItem.item.row || 1;
39
+ pushedItem.setSize();
40
+ }
41
+ this.pushedItems = [];
42
+ this.pushedItemsPath = [];
43
+ }
44
+ setPushedItems() {
45
+ let i = 0;
46
+ const l = this.pushedItems.length;
47
+ let pushedItem;
48
+ for (; i < l; i++) {
49
+ pushedItem = this.pushedItems[i];
50
+ pushedItem.checkItemChanges(pushedItem.$item, pushedItem.item);
51
+ }
52
+ this.pushedItems = [];
53
+ this.pushedItemsPath = [];
54
+ }
55
+ checkPushBack() {
56
+ let i = this.pushedItems.length - 1;
57
+ let change = false;
58
+ for (; i > -1; i--) {
59
+ if (this.checkPushedItem(this.pushedItems[i], i)) {
60
+ change = true;
61
+ }
62
+ }
63
+ if (change) {
64
+ this.checkPushBack();
65
+ }
66
+ }
67
+ push(gridsterItem, direction) {
68
+ const gridsterItemCollision = this.gridster.checkCollision(gridsterItem.$item);
69
+ if (gridsterItemCollision &&
70
+ gridsterItemCollision !== true &&
71
+ gridsterItemCollision !== this.gridsterItem &&
72
+ gridsterItemCollision.canBeResized()) {
73
+ let tryPattern = this.tryPattern;
74
+ if (tryPattern[direction].call(this, gridsterItemCollision, gridsterItem, direction)) {
75
+ return true;
76
+ }
77
+ }
78
+ else if (gridsterItemCollision === false) {
79
+ return true;
80
+ }
81
+ return false;
82
+ }
83
+ trySouth(gridsterItemCollide, gridsterItem, direction) {
84
+ const backUpY = gridsterItemCollide.$item.y;
85
+ const backUpRows = gridsterItemCollide.$item.rows;
86
+ gridsterItemCollide.$item.y =
87
+ gridsterItem.$item.y + gridsterItem.$item.rows;
88
+ gridsterItemCollide.$item.rows =
89
+ backUpRows + backUpY - gridsterItemCollide.$item.y;
90
+ if (!this.gridster.checkCollisionTwoItems(gridsterItemCollide.$item, gridsterItem.$item) &&
91
+ !this.gridster.checkGridCollision(gridsterItemCollide.$item)) {
92
+ gridsterItemCollide.setSize();
93
+ this.addToPushed(gridsterItemCollide);
94
+ this.push(gridsterItem, direction);
95
+ return true;
96
+ }
97
+ else {
98
+ gridsterItemCollide.$item.y = backUpY;
99
+ gridsterItemCollide.$item.rows = backUpRows;
100
+ }
101
+ return false;
102
+ }
103
+ tryNorth(gridsterItemCollide, gridsterItem, direction) {
104
+ const backUpRows = gridsterItemCollide.$item.rows;
105
+ gridsterItemCollide.$item.rows =
106
+ gridsterItem.$item.y - gridsterItemCollide.$item.y;
107
+ if (!this.gridster.checkCollisionTwoItems(gridsterItemCollide.$item, gridsterItem.$item) &&
108
+ !this.gridster.checkGridCollision(gridsterItemCollide.$item)) {
109
+ gridsterItemCollide.setSize();
110
+ this.addToPushed(gridsterItemCollide);
111
+ this.push(gridsterItem, direction);
112
+ return true;
113
+ }
114
+ else {
115
+ gridsterItemCollide.$item.rows = backUpRows;
116
+ }
117
+ return false;
118
+ }
119
+ tryEast(gridsterItemCollide, gridsterItem, direction) {
120
+ const backUpX = gridsterItemCollide.$item.x;
121
+ const backUpCols = gridsterItemCollide.$item.cols;
122
+ gridsterItemCollide.$item.x =
123
+ gridsterItem.$item.x + gridsterItem.$item.cols;
124
+ gridsterItemCollide.$item.cols =
125
+ backUpCols + backUpX - gridsterItemCollide.$item.x;
126
+ if (!this.gridster.checkCollisionTwoItems(gridsterItemCollide.$item, gridsterItem.$item) &&
127
+ !this.gridster.checkGridCollision(gridsterItemCollide.$item)) {
128
+ gridsterItemCollide.setSize();
129
+ this.addToPushed(gridsterItemCollide);
130
+ this.push(gridsterItem, direction);
131
+ return true;
132
+ }
133
+ else {
134
+ gridsterItemCollide.$item.x = backUpX;
135
+ gridsterItemCollide.$item.cols = backUpCols;
136
+ }
137
+ return false;
138
+ }
139
+ tryWest(gridsterItemCollide, gridsterItem, direction) {
140
+ const backUpCols = gridsterItemCollide.$item.cols;
141
+ gridsterItemCollide.$item.cols =
142
+ gridsterItem.$item.x - gridsterItemCollide.$item.x;
143
+ if (!this.gridster.checkCollisionTwoItems(gridsterItemCollide.$item, gridsterItem.$item) &&
144
+ !this.gridster.checkGridCollision(gridsterItemCollide.$item)) {
145
+ gridsterItemCollide.setSize();
146
+ this.addToPushed(gridsterItemCollide);
147
+ this.push(gridsterItem, direction);
148
+ return true;
149
+ }
150
+ else {
151
+ gridsterItemCollide.$item.cols = backUpCols;
152
+ }
153
+ return false;
154
+ }
155
+ addToPushed(gridsterItem) {
156
+ if (this.pushedItems.indexOf(gridsterItem) < 0) {
157
+ this.pushedItems.push(gridsterItem);
158
+ this.pushedItemsPath.push([
159
+ {
160
+ x: gridsterItem.item.x || 0,
161
+ y: gridsterItem.item.y || 0,
162
+ cols: gridsterItem.item.cols || 0,
163
+ rows: gridsterItem.item.rows || 0
164
+ },
165
+ {
166
+ x: gridsterItem.$item.x,
167
+ y: gridsterItem.$item.y,
168
+ cols: gridsterItem.$item.cols,
169
+ rows: gridsterItem.$item.rows
170
+ }
171
+ ]);
172
+ }
173
+ else {
174
+ const i = this.pushedItems.indexOf(gridsterItem);
175
+ this.pushedItemsPath[i].push({
176
+ x: gridsterItem.$item.x,
177
+ y: gridsterItem.$item.y,
178
+ cols: gridsterItem.$item.cols,
179
+ rows: gridsterItem.$item.rows
180
+ });
181
+ }
182
+ }
183
+ removeFromPushed(i) {
184
+ if (i > -1) {
185
+ this.pushedItems.splice(i, 1);
186
+ this.pushedItemsPath.splice(i, 1);
187
+ }
188
+ }
189
+ checkPushedItem(pushedItem, i) {
190
+ const path = this.pushedItemsPath[i];
191
+ let j = path.length - 2;
192
+ let lastPosition;
193
+ let x;
194
+ let y;
195
+ let cols;
196
+ let rows;
197
+ for (; j > -1; j--) {
198
+ lastPosition = path[j];
199
+ x = pushedItem.$item.x;
200
+ y = pushedItem.$item.y;
201
+ cols = pushedItem.$item.cols;
202
+ rows = pushedItem.$item.rows;
203
+ pushedItem.$item.x = lastPosition.x;
204
+ pushedItem.$item.y = lastPosition.y;
205
+ pushedItem.$item.cols = lastPosition.cols;
206
+ pushedItem.$item.rows = lastPosition.rows;
207
+ if (!this.gridster.findItemWithItem(pushedItem.$item)) {
208
+ pushedItem.setSize();
209
+ path.splice(j + 1, path.length - 1 - j);
210
+ }
211
+ else {
212
+ pushedItem.$item.x = x;
213
+ pushedItem.$item.y = y;
214
+ pushedItem.$item.cols = cols;
215
+ pushedItem.$item.rows = rows;
216
+ }
217
+ }
218
+ if (path.length < 2) {
219
+ this.removeFromPushed(i);
220
+ return true;
221
+ }
222
+ return false;
223
+ }
224
+ }
225
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXJQdXNoUmVzaXplLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yYS1kYXNoYm9hcmQtZnJhbWV3b3JrL3NyYy9ncmlkc3Rlci9saWIvZ3JpZHN0ZXJQdXNoUmVzaXplLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsTUFBTSxPQUFPLGtCQUFrQjtJQWdDN0IsWUFBWSxZQUE0QztRQUN0RCxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUM7UUFDdEMsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNoQixRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDdEIsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3RCLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN4QixTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDekIsQ0FBQztRQUNGLElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDO1FBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDO1FBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQzdCLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUssQ0FBQztJQUM1QyxDQUFDO0lBRUQsU0FBUyxDQUFDLFNBQWlCO1FBQ3pCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDM0MsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FB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LEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLENBQUMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN2QixDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDdkIsSUFBSSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQzdCLElBQUksR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztZQUM3QixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDcEMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQztZQUMxQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDO1lBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN0RCxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN2QixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZCLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDN0IsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQy9CLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEdyaWRzdGVySXRlbSxcbiAgR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlXG59IGZyb20gJy4vZ3JpZHN0ZXJJdGVtLmludGVyZmFjZSc7XG5pbXBvcnQgeyBHcmlkc3RlckNvbXBvbmVudEludGVyZmFjZSB9IGZyb20gJy4vZ3JpZHN0ZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIEdyaWRzdGVyUHVzaFJlc2l6ZSB7XG4gIHB1YmxpYyBmcm9tU291dGg6IHN0cmluZztcbiAgcHVibGljIGZyb21Ob3J0aDogc3RyaW5nO1xuICBwdWJsaWMgZnJvbUVhc3Q6IHN0cmluZztcbiAgcHVibGljIGZyb21XZXN0OiBzdHJpbmc7XG4gIHByaXZhdGUgcHVzaGVkSXRlbXM6IEFycmF5PEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZT47XG4gIHByaXZhdGUgcHVzaGVkSXRlbXNQYXRoOiBBcnJheTxBcnJheTxHcmlkc3Rlckl0ZW0+PjtcbiAgcHJpdmF0ZSBncmlkc3Rlckl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZTtcbiAgcHJpdmF0ZSBncmlkc3RlcjogR3JpZHN0ZXJDb21wb25lbnRJbnRlcmZhY2U7XG4gIHByaXZhdGUgdHJ5UGF0dGVybjoge1xuICAgIGZyb21FYXN0OiAoXG4gICAgICBncmlkc3Rlckl0ZW1Db2xsaWRlOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UsXG4gICAgICBncmlkc3Rlckl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSxcbiAgICAgIGRpcmVjdGlvbjogc3RyaW5nXG4gICAgKSA9PiBib29sZWFuO1xuICAgIGZyb21XZXN0OiAoXG4gICAgICBncmlkc3Rlckl0ZW1Db2xsaWRlOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UsXG4gICAgICBncmlkc3Rlckl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSxcbiAgICAgIGRpcmVjdGlvbjogc3RyaW5nXG4gICAgKSA9PiBib29sZWFuO1xuICAgIGZyb21Ob3J0aDogKFxuICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlLFxuICAgICAgZ3JpZHN0ZXJJdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UsXG4gICAgICBkaXJlY3Rpb246IHN0cmluZ1xuICAgICkgPT4gYm9vbGVhbjtcbiAgICBmcm9tU291dGg6IChcbiAgICAgIGdyaWRzdGVySXRlbUNvbGxpZGU6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSxcbiAgICAgIGdyaWRzdGVySXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlLFxuICAgICAgZGlyZWN0aW9uOiBzdHJpbmdcbiAgICApID0+IGJvb2xlYW47XG4gIH07XG5cbiAgY29uc3RydWN0b3IoZ3JpZHN0ZXJJdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UpIHtcbiAgICB0aGlzLnB1c2hlZEl0ZW1zID0gW107XG4gICAgdGhpcy5wdXNoZWRJdGVtc1BhdGggPSBbXTtcbiAgICB0aGlzLmdyaWRzdGVySXRlbSA9IGdyaWRzdGVySXRlbTtcbiAgICB0aGlzLmdyaWRzdGVyID0gZ3JpZHN0ZXJJdGVtLmdyaWRzdGVyO1xuICAgIHRoaXMudHJ5UGF0dGVybiA9IHtcbiAgICAgIGZyb21FYXN0OiB0aGlzLnRyeVdlc3QsXG4gICAgICBmcm9tV2VzdDogdGhpcy50cnlFYXN0LFxuICAgICAgZnJvbU5vcnRoOiB0aGlzLnRyeVNvdXRoLFxuICAgICAgZnJvbVNvdXRoOiB0aGlzLnRyeU5vcnRoXG4gICAgfTtcbiAgICB0aGlzLmZyb21Tb3V0aCA9ICdmcm9tU291dGgnO1xuICAgIHRoaXMuZnJvbU5vcnRoID0gJ2Zyb21Ob3J0aCc7XG4gICAgdGhpcy5mcm9tRWFzdCA9ICdmcm9tRWFzdCc7XG4gICAgdGhpcy5mcm9tV2VzdCA9ICdmcm9tV2VzdCc7XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZ3JpZHN0ZXIgPSB0aGlzLmdyaWRzdGVySXRlbSA9IG51bGwhO1xuICB9XG5cbiAgcHVzaEl0ZW1zKGRpcmVjdGlvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMucHVzaFJlc2l6ZUl0ZW1zKSB7XG4gICAgICByZXR1cm4gdGhpcy5wdXNoKHRoaXMuZ3JpZHN0ZXJJdGVtLCBkaXJlY3Rpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmVzdG9yZUl0ZW1zKCk6IHZvaWQge1xuICAgIGxldCBpID0gMDtcbiAgICBjb25zdCBsOiBudW1iZXIgPSB0aGlzLnB1c2hlZEl0ZW1zLmxlbmd0aDtcbiAgICBsZXQgcHVzaGVkSXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlO1xuICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBwdXNoZWRJdGVtID0gdGhpcy5wdXNoZWRJdGVtc1tpXTtcbiAgICAgIHB1c2hlZEl0ZW0uJGl0ZW0ueCA9IHB1c2hlZEl0ZW0uaXRlbS54IHx8IDA7XG4gICAgICBwdXNoZWRJdGVtLiRpdGVtLnkgPSBwdXNoZWRJdGVtLml0ZW0ueSB8fCAwO1xuICAgICAgcHVzaGVkSXRlbS4kaXRlbS5jb2xzID0gcHVzaGVkSXRlbS5pdGVtLmNvbHMgfHwgMTtcbiAgICAgIHB1c2hlZEl0ZW0uJGl0ZW0ucm93ID0gcHVzaGVkSXRlbS5pdGVtLnJvdyB8fCAxO1xuICAgICAgcHVzaGVkSXRlbS5zZXRTaXplKCk7XG4gICAgfVxuICAgIHRoaXMucHVzaGVkSXRlbXMgPSBbXTtcbiAgICB0aGlzLnB1c2hlZEl0ZW1zUGF0aCA9IFtdO1xuICB9XG5cbiAgc2V0UHVzaGVkSXRlbXMoKTogdm9pZCB7XG4gICAgbGV0IGkgPSAwO1xuICAgIGNvbnN0IGw6IG51bWJlciA9IHRoaXMucHVzaGVkSXRlbXMubGVuZ3RoO1xuICAgIGxldCBwdXNoZWRJdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U7XG4gICAgZm9yICg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHB1c2hlZEl0ZW0gPSB0aGlzLnB1c2hlZEl0ZW1zW2ldO1xuICAgICAgcHVzaGVkSXRlbS5jaGVja0l0ZW1DaGFuZ2VzKHB1c2hlZEl0ZW0uJGl0ZW0sIHB1c2hlZEl0ZW0uaXRlbSk7XG4gICAgfVxuICAgIHRoaXMucHVzaGVkSXRlbXMgPSBbXTtcbiAgICB0aGlzLnB1c2hlZEl0ZW1zUGF0aCA9IFtdO1xuICB9XG5cbiAgY2hlY2tQdXNoQmFjaygpOiB2b2lkIHtcbiAgICBsZXQgaTogbnVtYmVyID0gdGhpcy5wdXNoZWRJdGVtcy5sZW5ndGggLSAxO1xuICAgIGxldCBjaGFuZ2UgPSBmYWxzZTtcbiAgICBmb3IgKDsgaSA+IC0xOyBpLS0pIHtcbiAgICAgIGlmICh0aGlzLmNoZWNrUHVzaGVkSXRlbSh0aGlzLnB1c2hlZEl0ZW1zW2ldLCBpKSkge1xuICAgICAgICBjaGFuZ2UgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlKSB7XG4gICAgICB0aGlzLmNoZWNrUHVzaEJhY2soKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHB1c2goXG4gICAgZ3JpZHN0ZXJJdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UsXG4gICAgZGlyZWN0aW9uOiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZ3JpZHN0ZXJJdGVtQ29sbGlzaW9uOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UgfCBib29sZWFuID1cbiAgICAgIHRoaXMuZ3JpZHN0ZXIuY2hlY2tDb2xsaXNpb24oZ3JpZHN0ZXJJdGVtLiRpdGVtKTtcbiAgICBpZiAoXG4gICAgICBncmlkc3Rlckl0ZW1Db2xsaXNpb24gJiZcbiAgICAgIGdyaWRzdGVySXRlbUNvbGxpc2lvbiAhPT0gdHJ1ZSAmJlxuICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlzaW9uICE9PSB0aGlzLmdyaWRzdGVySXRlbSAmJlxuICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlzaW9uLmNhbkJlUmVzaXplZCgpXG4gICAgKSB7XG4gICAgICBsZXQgdHJ5UGF0dGVybjogYW55ID0gdGhpcy50cnlQYXR0ZXJuO1xuICAgICAgaWYgKFxuICAgICAgICB0cnlQYXR0ZXJuW2RpcmVjdGlvbl0uY2FsbChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGdyaWRzdGVySXRlbUNvbGxpc2lvbixcbiAgICAgICAgICBncmlkc3Rlckl0ZW0sXG4gICAgICAgICAgZGlyZWN0aW9uXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGdyaWRzdGVySXRlbUNvbGxpc2lvbiA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHRyeVNvdXRoKFxuICAgIGdyaWRzdGVySXRlbUNvbGxpZGU6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSxcbiAgICBncmlkc3Rlckl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSxcbiAgICBkaXJlY3Rpb246IHN0cmluZ1xuICApOiBib29sZWFuIHtcbiAgICBjb25zdCBiYWNrVXBZID0gZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS55O1xuICAgIGNvbnN0IGJhY2tVcFJvd3MgPSBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLnJvd3M7XG4gICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS55ID1cbiAgICAgIGdyaWRzdGVySXRlbS4kaXRlbS55ICsgZ3JpZHN0ZXJJdGVtLiRpdGVtLnJvd3M7XG4gICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS5yb3dzID1cbiAgICAgIGJhY2tVcFJvd3MgKyBiYWNrVXBZIC0gZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS55O1xuICAgIGlmIChcbiAgICAgICF0aGlzLmdyaWRzdGVyLmNoZWNrQ29sbGlzaW9uVHdvSXRlbXMoXG4gICAgICAgIGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0sXG4gICAgICAgIGdyaWRzdGVySXRlbS4kaXRlbVxuICAgICAgKSAmJlxuICAgICAgIXRoaXMuZ3JpZHN0ZXIuY2hlY2tHcmlkQ29sbGlzaW9uKGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0pXG4gICAgKSB7XG4gICAgICBncmlkc3Rlckl0ZW1Db2xsaWRlLnNldFNpemUoKTtcbiAgICAgIHRoaXMuYWRkVG9QdXNoZWQoZ3JpZHN0ZXJJdGVtQ29sbGlkZSk7XG4gICAgICB0aGlzLnB1c2goZ3JpZHN0ZXJJdGVtLCBkaXJlY3Rpb24pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0ueSA9IGJhY2tVcFk7XG4gICAgICBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLnJvd3MgPSBiYWNrVXBSb3dzO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHRyeU5vcnRoKFxuICAgIGdyaWRzdGVySXRlbUNvbGxpZGU6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSxcbiAgICBncmlkc3Rlckl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSxcbiAgICBkaXJlY3Rpb246IHN0cmluZ1xuICApOiBib29sZWFuIHtcbiAgICBjb25zdCBiYWNrVXBSb3dzID0gZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS5yb3dzO1xuICAgIGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0ucm93cyA9XG4gICAgICBncmlkc3Rlckl0ZW0uJGl0ZW0ueSAtIGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0ueTtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5ncmlkc3Rlci5jaGVja0NvbGxpc2lvblR3b0l0ZW1zKFxuICAgICAgICBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLFxuICAgICAgICBncmlkc3Rlckl0ZW0uJGl0ZW1cbiAgICAgICkgJiZcbiAgICAgICF0aGlzLmdyaWRzdGVyLmNoZWNrR3JpZENvbGxpc2lvbihncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtKVxuICAgICkge1xuICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS5zZXRTaXplKCk7XG4gICAgICB0aGlzLmFkZFRvUHVzaGVkKGdyaWRzdGVySXRlbUNvbGxpZGUpO1xuICAgICAgdGhpcy5wdXNoKGdyaWRzdGVySXRlbSwgZGlyZWN0aW9uKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLnJvd3MgPSBiYWNrVXBSb3dzO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHRyeUVhc3QoXG4gICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlLFxuICAgIGdyaWRzdGVySXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlLFxuICAgIGRpcmVjdGlvbjogc3RyaW5nXG4gICk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGJhY2tVcFggPSBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLng7XG4gICAgY29uc3QgYmFja1VwQ29scyA9IGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0uY29scztcbiAgICBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLnggPVxuICAgICAgZ3JpZHN0ZXJJdGVtLiRpdGVtLnggKyBncmlkc3Rlckl0ZW0uJGl0ZW0uY29scztcbiAgICBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLmNvbHMgPVxuICAgICAgYmFja1VwQ29scyArIGJhY2tVcFggLSBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLng7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuZ3JpZHN0ZXIuY2hlY2tDb2xsaXNpb25Ud29JdGVtcyhcbiAgICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbSxcbiAgICAgICAgZ3JpZHN0ZXJJdGVtLiRpdGVtXG4gICAgICApICYmXG4gICAgICAhdGhpcy5ncmlkc3Rlci5jaGVja0dyaWRDb2xsaXNpb24oZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbSlcbiAgICApIHtcbiAgICAgIGdyaWRzdGVySXRlbUNvbGxpZGUuc2V0U2l6ZSgpO1xuICAgICAgdGhpcy5hZGRUb1B1c2hlZChncmlkc3Rlckl0ZW1Db2xsaWRlKTtcbiAgICAgIHRoaXMucHVzaChncmlkc3Rlckl0ZW0sIGRpcmVjdGlvbik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS54ID0gYmFja1VwWDtcbiAgICAgIGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0uY29scyA9IGJhY2tVcENvbHM7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgdHJ5V2VzdChcbiAgICBncmlkc3Rlckl0ZW1Db2xsaWRlOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UsXG4gICAgZ3JpZHN0ZXJJdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UsXG4gICAgZGlyZWN0aW9uOiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYmFja1VwQ29scyA9IGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0uY29scztcbiAgICBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLmNvbHMgPVxuICAgICAgZ3JpZHN0ZXJJdGVtLiRpdGVtLnggLSBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLng7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuZ3JpZHN0ZXIuY2hlY2tDb2xsaXNpb25Ud29JdGVtcyhcbiAgICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbSxcbiAgICAgICAgZ3JpZHN0ZXJJdGVtLiRpdGVtXG4gICAgICApICYmXG4gICAgICAhdGhpcy5ncmlkc3Rlci5jaGVja0dyaWRDb2xsaXNpb24oZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbSlcbiAgICApIHtcbiAgICAgIGdyaWRzdGVySXRlbUNvbGxpZGUuc2V0U2l6ZSgpO1xuICAgICAgdGhpcy5hZGRUb1B1c2hlZChncmlkc3Rlckl0ZW1Db2xsaWRlKTtcbiAgICAgIHRoaXMucHVzaChncmlkc3Rlckl0ZW0sIGRpcmVjdGlvbik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS5jb2xzID0gYmFja1VwQ29scztcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRUb1B1c2hlZChncmlkc3Rlckl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnB1c2hlZEl0ZW1zLmluZGV4T2YoZ3JpZHN0ZXJJdGVtKSA8IDApIHtcbiAgICAgIHRoaXMucHVzaGVkSXRlbXMucHVzaChncmlkc3Rlckl0ZW0pO1xuICAgICAgdGhpcy5wdXNoZWRJdGVtc1BhdGgucHVzaChbXG4gICAgICAgIHtcbiAgICAgICAgICB4OiBncmlkc3Rlckl0ZW0uaXRlbS54IHx8IDAsXG4gICAgICAgICAgeTogZ3JpZHN0ZXJJdGVtLml0ZW0ueSB8fCAwLFxuICAgICAgICAgIGNvbHM6IGdyaWRzdGVySXRlbS5pdGVtLmNvbHMgfHwgMCxcbiAgICAgICAgICByb3dzOiBncmlkc3Rlckl0ZW0uaXRlbS5yb3dzIHx8IDBcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHg6IGdyaWRzdGVySXRlbS4kaXRlbS54LFxuICAgICAgICAgIHk6IGdyaWRzdGVySXRlbS4kaXRlbS55LFxuICAgICAgICAgIGNvbHM6IGdyaWRzdGVySXRlbS4kaXRlbS5jb2xzLFxuICAgICAgICAgIHJvd3M6IGdyaWRzdGVySXRlbS4kaXRlbS5yb3dzXG4gICAgICAgIH1cbiAgICAgIF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpID0gdGhpcy5wdXNoZWRJdGVtcy5pbmRleE9mKGdyaWRzdGVySXRlbSk7XG4gICAgICB0aGlzLnB1c2hlZEl0ZW1zUGF0aFtpXS5wdXNoKHtcbiAgICAgICAgeDogZ3JpZHN0ZXJJdGVtLiRpdGVtLngsXG4gICAgICAgIHk6IGdyaWRzdGVySXRlbS4kaXRlbS55LFxuICAgICAgICBjb2xzOiBncmlkc3Rlckl0ZW0uJGl0ZW0uY29scyxcbiAgICAgICAgcm93czogZ3JpZHN0ZXJJdGVtLiRpdGVtLnJvd3NcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRnJvbVB1c2hlZChpOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoaSA+IC0xKSB7XG4gICAgICB0aGlzLnB1c2hlZEl0ZW1zLnNwbGljZShpLCAxKTtcbiAgICAgIHRoaXMucHVzaGVkSXRlbXNQYXRoLnNwbGljZShpLCAxKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrUHVzaGVkSXRlbShcbiAgICBwdXNoZWRJdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UsXG4gICAgaTogbnVtYmVyXG4gICk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhdGggPSB0aGlzLnB1c2hlZEl0ZW1zUGF0aFtpXTtcbiAgICBsZXQgaiA9IHBhdGgubGVuZ3RoIC0gMjtcbiAgICBsZXQgbGFzdFBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyBjb2xzOiBudW1iZXI7IHJvd3M6IG51bWJlciB9O1xuICAgIGxldCB4O1xuICAgIGxldCB5O1xuICAgIGxldCBjb2xzO1xuICAgIGxldCByb3dzO1xuICAgIGZvciAoOyBqID4gLTE7IGotLSkge1xuICAgICAgbGFzdFBvc2l0aW9uID0gcGF0aFtqXTtcbiAgICAgIHggPSBwdXNoZWRJdGVtLiRpdGVtLng7XG4gICAgICB5ID0gcHVzaGVkSXRlbS4kaXRlbS55O1xuICAgICAgY29scyA9IHB1c2hlZEl0ZW0uJGl0ZW0uY29scztcbiAgICAgIHJvd3MgPSBwdXNoZWRJdGVtLiRpdGVtLnJvd3M7XG4gICAgICBwdXNoZWRJdGVtLiRpdGVtLnggPSBsYXN0UG9zaXRpb24ueDtcbiAgICAgIHB1c2hlZEl0ZW0uJGl0ZW0ueSA9IGxhc3RQb3NpdGlvbi55O1xuICAgICAgcHVzaGVkSXRlbS4kaXRlbS5jb2xzID0gbGFzdFBvc2l0aW9uLmNvbHM7XG4gICAgICBwdXNoZWRJdGVtLiRpdGVtLnJvd3MgPSBsYXN0UG9zaXRpb24ucm93cztcbiAgICAgIGlmICghdGhpcy5ncmlkc3Rlci5maW5kSXRlbVdpdGhJdGVtKHB1c2hlZEl0ZW0uJGl0ZW0pKSB7XG4gICAgICAgIHB1c2hlZEl0ZW0uc2V0U2l6ZSgpO1xuICAgICAgICBwYXRoLnNwbGljZShqICsgMSwgcGF0aC5sZW5ndGggLSAxIC0gaik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwdXNoZWRJdGVtLiRpdGVtLnggPSB4O1xuICAgICAgICBwdXNoZWRJdGVtLiRpdGVtLnkgPSB5O1xuICAgICAgICBwdXNoZWRJdGVtLiRpdGVtLmNvbHMgPSBjb2xzO1xuICAgICAgICBwdXNoZWRJdGVtLiRpdGVtLnJvd3MgPSByb3dzO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocGF0aC5sZW5ndGggPCAyKSB7XG4gICAgICB0aGlzLnJlbW92ZUZyb21QdXNoZWQoaSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXJSZW5kZXJlci5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yYS1kYXNoYm9hcmQtZnJhbWV3b3JrL3NyYy9ncmlkc3Rlci9saWIvZ3JpZHN0ZXJSZW5kZXJlci5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgQ29tbW9uR3JpZFN0eWxlIHtcbiAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbW1vbkdyaWRDYWNoZWRTdHlsZSB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBzdHlsZTogQ29tbW9uR3JpZFN0eWxlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdyaWRDb2x1bW5DYWNoZWRTdHlsZSBleHRlbmRzIENvbW1vbkdyaWRDYWNoZWRTdHlsZSB7XG4gIGxlZnQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHcmlkUm93Q2FjaGVkU3R5bGUgZXh0ZW5kcyBDb21tb25HcmlkQ2FjaGVkU3R5bGUge1xuICB0b3A6IG51bWJlcjtcbn1cbiJdfQ==
@@ -0,0 +1,274 @@
1
+ import { DirTypes, GridType } from './gridsterConfig.interface';
2
+ export class GridsterRenderer {
3
+ constructor(gridster) {
4
+ this.gridster = gridster;
5
+ /**
6
+ * Caches the last grid column styles.
7
+ * This improves the grid responsiveness by caching and reusing the last style object instead of creating a new one.
8
+ */
9
+ this.lastGridColumnStyles = {};
10
+ /**
11
+ * Caches the last grid column styles.
12
+ * This improves the grid responsiveness by caching and reusing the last style object instead of creating a new one.
13
+ */
14
+ this.lastGridRowStyles = {};
15
+ }
16
+ destroy() {
17
+ this.gridster = null;
18
+ }
19
+ updateItem(el, item, renderer) {
20
+ if (this.gridster.mobile) {
21
+ this.clearCellPosition(renderer, el);
22
+ if (this.gridster.$options.keepFixedHeightInMobile) {
23
+ renderer.setStyle(el, 'height', (item.rows - 1) * this.gridster.$options.margin +
24
+ item.rows * this.gridster.$options.fixedRowHeight +
25
+ 'px');
26
+ }
27
+ else {
28
+ renderer.setStyle(el, 'height', (item.rows * this.gridster.curWidth) / item.cols + 'px');
29
+ }
30
+ if (this.gridster.$options.keepFixedWidthInMobile) {
31
+ renderer.setStyle(el, 'width', this.gridster.$options.fixedColWidth + 'px');
32
+ }
33
+ else {
34
+ renderer.setStyle(el, 'width', '');
35
+ }
36
+ renderer.setStyle(el, 'margin-bottom', this.gridster.$options.margin + 'px');
37
+ renderer.setStyle(el, DirTypes.LTR ? 'margin-right' : 'margin-left', '');
38
+ }
39
+ else {
40
+ const x = Math.round(this.gridster.curColWidth * item.x);
41
+ const y = Math.round(this.gridster.curRowHeight * item.y);
42
+ const width = this.gridster.curColWidth * item.cols - this.gridster.$options.margin;
43
+ const height = this.gridster.curRowHeight * item.rows - this.gridster.$options.margin;
44
+ // set the cell style
45
+ this.setCellPosition(renderer, el, x, y);
46
+ renderer.setStyle(el, 'width', width + 'px');
47
+ renderer.setStyle(el, 'height', height + 'px');
48
+ let marginBottom = null;
49
+ let marginRight = null;
50
+ if (this.gridster.$options.outerMargin) {
51
+ if (this.gridster.rows === item.rows + item.y) {
52
+ if (this.gridster.$options.outerMarginBottom !== null) {
53
+ marginBottom = this.gridster.$options.outerMarginBottom + 'px';
54
+ }
55
+ else {
56
+ marginBottom = this.gridster.$options.margin + 'px';
57
+ }
58
+ }
59
+ if (this.gridster.columns === item.cols + item.x) {
60
+ if (this.gridster.$options.outerMarginBottom !== null) {
61
+ marginRight = this.gridster.$options.outerMarginRight + 'px';
62
+ }
63
+ else {
64
+ marginRight = this.gridster.$options.margin + 'px';
65
+ }
66
+ }
67
+ }
68
+ renderer.setStyle(el, 'margin-bottom', marginBottom);
69
+ renderer.setStyle(el, DirTypes.LTR ? 'margin-right' : 'margin-left', marginRight);
70
+ }
71
+ }
72
+ updateGridster() {
73
+ let addClass = '';
74
+ let removeClass1 = '';
75
+ let removeClass2 = '';
76
+ let removeClass3 = '';
77
+ if (this.gridster.$options.gridType === GridType.Fit) {
78
+ addClass = GridType.Fit;
79
+ removeClass1 = GridType.ScrollVertical;
80
+ removeClass2 = GridType.ScrollHorizontal;
81
+ removeClass3 = GridType.Fixed;
82
+ }
83
+ else if (this.gridster.$options.gridType === GridType.ScrollVertical) {
84
+ this.gridster.curRowHeight =
85
+ this.gridster.curColWidth * this.gridster.$options.rowHeightRatio;
86
+ addClass = GridType.ScrollVertical;
87
+ removeClass1 = GridType.Fit;
88
+ removeClass2 = GridType.ScrollHorizontal;
89
+ removeClass3 = GridType.Fixed;
90
+ }
91
+ else if (this.gridster.$options.gridType === GridType.ScrollHorizontal) {
92
+ const widthRatio = this.gridster.$options.rowHeightRatio;
93
+ const calWidthRatio = widthRatio >= 1 ? widthRatio : widthRatio + 1;
94
+ this.gridster.curColWidth = this.gridster.curRowHeight * calWidthRatio;
95
+ addClass = GridType.ScrollHorizontal;
96
+ removeClass1 = GridType.Fit;
97
+ removeClass2 = GridType.ScrollVertical;
98
+ removeClass3 = GridType.Fixed;
99
+ }
100
+ else if (this.gridster.$options.gridType === GridType.Fixed) {
101
+ this.gridster.curColWidth =
102
+ this.gridster.$options.fixedColWidth +
103
+ (this.gridster.$options.ignoreMarginInRow
104
+ ? 0
105
+ : this.gridster.$options.margin);
106
+ this.gridster.curRowHeight =
107
+ this.gridster.$options.fixedRowHeight +
108
+ (this.gridster.$options.ignoreMarginInRow
109
+ ? 0
110
+ : this.gridster.$options.margin);
111
+ addClass = GridType.Fixed;
112
+ removeClass1 = GridType.Fit;
113
+ removeClass2 = GridType.ScrollVertical;
114
+ removeClass3 = GridType.ScrollHorizontal;
115
+ }
116
+ else if (this.gridster.$options.gridType === GridType.VerticalFixed) {
117
+ this.gridster.curRowHeight =
118
+ this.gridster.$options.fixedRowHeight +
119
+ (this.gridster.$options.ignoreMarginInRow
120
+ ? 0
121
+ : this.gridster.$options.margin);
122
+ addClass = GridType.ScrollVertical;
123
+ removeClass1 = GridType.Fit;
124
+ removeClass2 = GridType.ScrollHorizontal;
125
+ removeClass3 = GridType.Fixed;
126
+ }
127
+ else if (this.gridster.$options.gridType === GridType.HorizontalFixed) {
128
+ this.gridster.curColWidth =
129
+ this.gridster.$options.fixedColWidth +
130
+ (this.gridster.$options.ignoreMarginInRow
131
+ ? 0
132
+ : this.gridster.$options.margin);
133
+ addClass = GridType.ScrollHorizontal;
134
+ removeClass1 = GridType.Fit;
135
+ removeClass2 = GridType.ScrollVertical;
136
+ removeClass3 = GridType.Fixed;
137
+ }
138
+ if (this.gridster.mobile ||
139
+ (this.gridster.$options.setGridSize &&
140
+ this.gridster.$options.gridType !== GridType.Fit)) {
141
+ this.gridster.renderer.removeClass(this.gridster.el, addClass);
142
+ }
143
+ else {
144
+ this.gridster.renderer.addClass(this.gridster.el, addClass);
145
+ }
146
+ this.gridster.renderer.removeClass(this.gridster.el, removeClass1);
147
+ this.gridster.renderer.removeClass(this.gridster.el, removeClass2);
148
+ this.gridster.renderer.removeClass(this.gridster.el, removeClass3);
149
+ }
150
+ getGridColumnStyle(i) {
151
+ // generates the new style
152
+ const newPos = {
153
+ left: this.gridster.curColWidth * i,
154
+ width: this.gridster.curColWidth - this.gridster.$options.margin,
155
+ height: this.gridster.gridRows.length * this.gridster.curRowHeight -
156
+ this.gridster.$options.margin,
157
+ style: {}
158
+ };
159
+ newPos.style = {
160
+ ...this.getLeftPosition(newPos.left),
161
+ width: newPos.width + 'px',
162
+ height: newPos.height + 'px'
163
+ };
164
+ // use the last cached style if it has same values as the generated one
165
+ const last = this.lastGridColumnStyles[i];
166
+ if (last &&
167
+ last.left === newPos.left &&
168
+ last.width === newPos.width &&
169
+ last.height === newPos.height) {
170
+ return last.style;
171
+ }
172
+ // cache and set new style
173
+ this.lastGridColumnStyles[i] = newPos;
174
+ return newPos.style;
175
+ }
176
+ getGridRowStyle(i) {
177
+ // generates the new style
178
+ const newPos = {
179
+ top: this.gridster.curRowHeight * i,
180
+ width: this.gridster.gridColumns.length * this.gridster.curColWidth +
181
+ this.gridster.$options.margin,
182
+ height: this.gridster.curRowHeight - this.gridster.$options.margin,
183
+ style: {}
184
+ };
185
+ newPos.style = {
186
+ ...this.getTopPosition(newPos.top),
187
+ width: newPos.width + 'px',
188
+ height: newPos.height + 'px'
189
+ };
190
+ // use the last cached style if it has same values as the generated one
191
+ const last = this.lastGridRowStyles[i];
192
+ if (last &&
193
+ last.top === newPos.top &&
194
+ last.width === newPos.width &&
195
+ last.height === newPos.height) {
196
+ return last.style;
197
+ }
198
+ // cache and set new style
199
+ this.lastGridRowStyles[i] = newPos;
200
+ return newPos.style;
201
+ }
202
+ getLeftPosition(d) {
203
+ const dPosition = this.gridster.$options.dirType === DirTypes.RTL ? -d : d;
204
+ if (this.gridster.$options.useTransformPositioning) {
205
+ return {
206
+ transform: 'translateX(' + dPosition + 'px)'
207
+ };
208
+ }
209
+ else {
210
+ return {
211
+ left: this.getLeftMargin() + dPosition + 'px'
212
+ };
213
+ }
214
+ }
215
+ getTopPosition(d) {
216
+ if (this.gridster.$options.useTransformPositioning) {
217
+ return {
218
+ transform: 'translateY(' + d + 'px)'
219
+ };
220
+ }
221
+ else {
222
+ return {
223
+ top: this.getTopMargin() + d + 'px'
224
+ };
225
+ }
226
+ }
227
+ clearCellPosition(renderer, el) {
228
+ if (this.gridster.$options.useTransformPositioning) {
229
+ renderer.setStyle(el, 'transform', '');
230
+ }
231
+ else {
232
+ renderer.setStyle(el, 'top', '');
233
+ renderer.setStyle(el, 'left', '');
234
+ }
235
+ }
236
+ setCellPosition(renderer, el, x, y) {
237
+ const xPosition = this.gridster.$options.dirType === DirTypes.RTL ? -x : x;
238
+ if (this.gridster.$options.useTransformPositioning) {
239
+ const transform = 'translate3d(' + xPosition + 'px, ' + y + 'px, 0)';
240
+ renderer.setStyle(el, 'transform', transform);
241
+ }
242
+ else {
243
+ renderer.setStyle(el, 'left', this.getLeftMargin() + xPosition + 'px');
244
+ renderer.setStyle(el, 'top', this.getTopMargin() + y + 'px');
245
+ }
246
+ }
247
+ getLeftMargin() {
248
+ if (this.gridster.$options.outerMargin) {
249
+ if (this.gridster.$options.outerMarginLeft !== null) {
250
+ return this.gridster.$options.outerMarginLeft;
251
+ }
252
+ else {
253
+ return this.gridster.$options.margin;
254
+ }
255
+ }
256
+ else {
257
+ return 0;
258
+ }
259
+ }
260
+ getTopMargin() {
261
+ if (this.gridster.$options.outerMargin) {
262
+ if (this.gridster.$options.outerMarginTop !== null) {
263
+ return this.gridster.$options.outerMarginTop;
264
+ }
265
+ else {
266
+ return this.gridster.$options.margin;
267
+ }
268
+ }
269
+ else {
270
+ return 0;
271
+ }
272
+ }
273
+ }
274
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXJSZW5kZXJlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmEtZGFzaGJvYXJkLWZyYW1ld29yay9zcmMvZ3JpZHN0ZXIvbGliL2dyaWRzdGVyUmVuZGVyZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBUWhFLE1BQU0sT0FBTyxnQkFBZ0I7SUFhM0IsWUFBb0IsUUFBb0M7UUFBcEMsYUFBUSxHQUFSLFFBQVEsQ0FBNEI7UUFaeEQ7OztXQUdHO1FBQ0sseUJBQW9CLEdBQTBDLEVBQUUsQ0FBQztRQUV6RTs7O1dBR0c7UUFDSyxzQkFBaUIsR0FBdUMsRUFBRSxDQUFDO0lBRVIsQ0FBQztJQUU1RCxPQUFPO1FBQ0wsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVELFVBQVUsQ0FBQyxFQUFXLEVBQUUsSUFBa0IsRUFBRSxRQUFtQjtRQUM3RCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNyQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLHVCQUF1QixFQUFFLENBQUM7Z0JBQ25ELFFBQVEsQ0FBQyxRQUFRLENBQ2YsRUFBRSxFQUNGLFFBQVEsRUFDUixDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTTtvQkFDN0MsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjO29CQUNqRCxJQUFJLENBQ1AsQ0FBQztZQUNKLENBQUM7aUJBQU0sQ0FBQztnQkFDTixRQUFR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LENBQUMsUUFBUSxDQUFDLGVBQWUsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDcEQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7WUFDaEQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ3ZDLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztJQUNILENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN2QyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDbkQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUM7WUFDL0MsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ3ZDLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBHcmlkc3RlckNvbXBvbmVudEludGVyZmFjZSB9IGZyb20gJy4vZ3JpZHN0ZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IERpclR5cGVzLCBHcmlkVHlwZSB9IGZyb20gJy4vZ3JpZHN0ZXJDb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IEdyaWRzdGVySXRlbSB9IGZyb20gJy4vZ3JpZHN0ZXJJdGVtLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBDb21tb25HcmlkU3R5bGUsXG4gIEdyaWRDb2x1bW5DYWNoZWRTdHlsZSxcbiAgR3JpZFJvd0NhY2hlZFN0eWxlXG59IGZyb20gJy4vZ3JpZHN0ZXJSZW5kZXJlci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgR3JpZHN0ZXJSZW5kZXJlciB7XG4gIC8qKlxuICAgKiBDYWNoZXMgdGhlIGxhc3QgZ3JpZCBjb2x1bW4gc3R5bGVzLlxuICAgKiBUaGlzIGltcHJvdmVzIHRoZSBncmlkIHJlc3BvbnNpdmVuZXNzIGJ5IGNhY2hpbmcgYW5kIHJldXNpbmcgdGhlIGxhc3Qgc3R5bGUgb2JqZWN0IGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBsYXN0R3JpZENvbHVtblN0eWxlczogUmVjb3JkPG51bWJlciwgR3JpZENvbHVtbkNhY2hlZFN0eWxlPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBDYWNoZXMgdGhlIGxhc3QgZ3JpZCBjb2x1bW4gc3R5bGVzLlxuICAgKiBUaGlzIGltcHJvdmVzIHRoZSBncmlkIHJlc3BvbnNpdmVuZXNzIGJ5IGNhY2hpbmcgYW5kIHJldXNpbmcgdGhlIGxhc3Qgc3R5bGUgb2JqZWN0IGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBsYXN0R3JpZFJvd1N0eWxlczogUmVjb3JkPG51bWJlciwgR3JpZFJvd0NhY2hlZFN0eWxlPiA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZ3JpZHN0ZXI6IEdyaWRzdGVyQ29tcG9uZW50SW50ZXJmYWNlKSB7fVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5ncmlkc3RlciA9IG51bGwhO1xuICB9XG5cbiAgdXBkYXRlSXRlbShlbDogRWxlbWVudCwgaXRlbTogR3JpZHN0ZXJJdGVtLCByZW5kZXJlcjogUmVuZGVyZXIyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIubW9iaWxlKSB7XG4gICAgICB0aGlzLmNsZWFyQ2VsbFBvc2l0aW9uKHJlbmRlcmVyLCBlbCk7XG4gICAgICBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5rZWVwRml4ZWRIZWlnaHRJbk1vYmlsZSkge1xuICAgICAgICByZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgICBlbCxcbiAgICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgICAoaXRlbS5yb3dzIC0gMSkgKiB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbiArXG4gICAgICAgICAgICBpdGVtLnJvd3MgKiB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmZpeGVkUm93SGVpZ2h0ICtcbiAgICAgICAgICAgICdweCdcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgICdoZWlnaHQnLFxuICAgICAgICAgIChpdGVtLnJvd3MgKiB0aGlzLmdyaWRzdGVyLmN1cldpZHRoKSAvIGl0ZW0uY29scyArICdweCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmtlZXBGaXhlZFdpZHRoSW5Nb2JpbGUpIHtcbiAgICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgICB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmZpeGVkQ29sV2lkdGggKyAncHgnXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZW5kZXJlci5zZXRTdHlsZShlbCwgJ3dpZHRoJywgJycpO1xuICAgICAgfVxuXG4gICAgICByZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgZWwsXG4gICAgICAgICdtYXJnaW4tYm90dG9tJyxcbiAgICAgICAgdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5tYXJnaW4gKyAncHgnXG4gICAgICApO1xuICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoZWwsIERpclR5cGVzLkxUUiA/ICdtYXJnaW4tcmlnaHQnIDogJ21hcmdpbi1sZWZ0JywgJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB4ID0gTWF0aC5yb3VuZCh0aGlzLmdyaWRzdGVyLmN1ckNvbFdpZHRoICogaXRlbS54KTtcbiAgICAgIGNvbnN0IHkgPSBNYXRoLnJvdW5kKHRoaXMuZ3JpZHN0ZXIuY3VyUm93SGVpZ2h0ICogaXRlbS55KTtcbiAgICAgIGNvbnN0IHdpZHRoID1cbiAgICAgICAgdGhpcy5ncmlkc3Rlci5jdXJDb2xXaWR0aCAqIGl0ZW0uY29scyAtIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMubWFyZ2luO1xuICAgICAgY29uc3QgaGVpZ2h0ID1cbiAgICAgICAgdGhpcy5ncmlkc3Rlci5jdXJSb3dIZWlnaHQgKiBpdGVtLnJvd3MgLSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbjtcbiAgICAgIC8vIHNldCB0aGUgY2VsbCBzdHlsZVxuICAgICAgdGhpcy5zZXRDZWxsUG9zaXRpb24ocmVuZGVyZXIsIGVsLCB4LCB5KTtcbiAgICAgIHJlbmRlcmVyLnNldFN0eWxlKGVsLCAnd2lkdGgnLCB3aWR0aCArICdweCcpO1xuICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoZWwsICdoZWlnaHQnLCBoZWlnaHQgKyAncHgnKTtcbiAgICAgIGxldCBtYXJnaW5Cb3R0b206IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IG1hcmdpblJpZ2h0OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm91dGVyTWFyZ2luKSB7XG4gICAgICAgIGlmICh0aGlzLmdyaWRzdGVyLnJvd3MgPT09IGl0ZW0ucm93cyArIGl0ZW0ueSkge1xuICAgICAgICAgIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm91dGVyTWFyZ2luQm90dG9tICE9PSBudWxsKSB7XG4gICAgICAgICAgICBtYXJnaW5Cb3R0b20gPSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm91dGVyTWFyZ2luQm90dG9tICsgJ3B4JztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWFyZ2luQm90dG9tID0gdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5tYXJnaW4gKyAncHgnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ncmlkc3Rlci5jb2x1bW5zID09PSBpdGVtLmNvbHMgKyBpdGVtLngpIHtcbiAgICAgICAgICBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5vdXRlck1hcmdpbkJvdHRvbSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbWFyZ2luUmlnaHQgPSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm91dGVyTWFyZ2luUmlnaHQgKyAncHgnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtYXJnaW5SaWdodCA9IHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMubWFyZ2luICsgJ3B4JztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoZWwsICdtYXJnaW4tYm90dG9tJywgbWFyZ2luQm90dG9tKTtcbiAgICAgIHJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICBlbCxcbiAgICAgICAgRGlyVHlwZXMuTFRSID8gJ21hcmdpbi1yaWdodCcgOiAnbWFyZ2luLWxlZnQnLFxuICAgICAgICBtYXJnaW5SaWdodFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVHcmlkc3RlcigpOiB2b2lkIHtcbiAgICBsZXQgYWRkQ2xhc3MgPSAnJztcbiAgICBsZXQgcmVtb3ZlQ2xhc3MxID0gJyc7XG4gICAgbGV0IHJlbW92ZUNsYXNzMiA9ICcnO1xuICAgIGxldCByZW1vdmVDbGFzczMgPSAnJztcbiAgICBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5ncmlkVHlwZSA9PT0gR3JpZFR5cGUuRml0KSB7XG4gICAgICBhZGRDbGFzcyA9IEdyaWRUeXBlLkZpdDtcbiAgICAgIHJlbW92ZUNsYXNzMSA9IEdyaWRUeXBlLlNjcm9sbFZlcnRpY2FsO1xuICAgICAgcmVtb3ZlQ2xhc3MyID0gR3JpZFR5cGUuU2Nyb2xsSG9yaXpvbnRhbDtcbiAgICAgIHJlbW92ZUNsYXNzMyA9IEdyaWRUeXBlLkZpeGVkO1xuICAgIH0gZWxzZSBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5ncmlkVHlwZSA9PT0gR3JpZFR5cGUuU2Nyb2xsVmVydGljYWwpIHtcbiAgICAgIHRoaXMuZ3JpZHN0ZXIuY3VyUm93SGVpZ2h0ID1cbiAgICAgICAgdGhpcy5ncmlkc3Rlci5jdXJDb2xXaWR0aCAqIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMucm93SGVpZ2h0UmF0aW87XG4gICAgICBhZGRDbGFzcyA9IEdyaWRUeXBlLlNjcm9sbFZlcnRpY2FsO1xuICAgICAgcmVtb3ZlQ2xhc3MxID0gR3JpZFR5cGUuRml0O1xuICAgICAgcmVtb3ZlQ2xhc3MyID0gR3JpZFR5cGUuU2Nyb2xsSG9yaXpvbnRhbDtcbiAgICAgIHJlbW92ZUNsYXNzMyA9IEdyaWRUeXBlLkZpeGVkO1xuICAgIH0gZWxzZSBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5ncmlkVHlwZSA9PT0gR3JpZFR5cGUuU2Nyb2xsSG9yaXpvbnRhbCkge1xuICAgICAgY29uc3Qgd2lkdGhSYXRpbyA9IHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMucm93SGVpZ2h0UmF0aW87XG4gICAgICBjb25zdCBjYWxXaWR0aFJhdGlvID0gd2lkdGhSYXRpbyA+PSAxID8gd2lkdGhSYXRpbyA6IHdpZHRoUmF0aW8gKyAxO1xuICAgICAgdGhpcy5ncmlkc3Rlci5jdXJDb2xXaWR0aCA9IHRoaXMuZ3JpZHN0ZXIuY3VyUm93SGVpZ2h0ICogY2FsV2lkdGhSYXRpbztcbiAgICAgIGFkZENsYXNzID0gR3JpZFR5cGUuU2Nyb2xsSG9yaXpvbnRhbDtcbiAgICAgIHJlbW92ZUNsYXNzMSA9IEdyaWRUeXBlLkZpdDtcbiAgICAgIHJlbW92ZUNsYXNzMiA9IEdyaWRUeXBlLlNjcm9sbFZlcnRpY2FsO1xuICAgICAgcmVtb3ZlQ2xhc3MzID0gR3JpZFR5cGUuRml4ZWQ7XG4gICAgfSBlbHNlIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmdyaWRUeXBlID09PSBHcmlkVHlwZS5GaXhlZCkge1xuICAgICAgdGhpcy5ncmlkc3Rlci5jdXJDb2xXaWR0aCA9XG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZml4ZWRDb2xXaWR0aCArXG4gICAgICAgICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmlnbm9yZU1hcmdpbkluUm93XG4gICAgICAgICAgPyAwXG4gICAgICAgICAgOiB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbik7XG4gICAgICB0aGlzLmdyaWRzdGVyLmN1clJvd0hlaWdodCA9XG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZml4ZWRSb3dIZWlnaHQgK1xuICAgICAgICAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5pZ25vcmVNYXJnaW5JblJvd1xuICAgICAgICAgID8gMFxuICAgICAgICAgIDogdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5tYXJnaW4pO1xuICAgICAgYWRkQ2xhc3MgPSBHcmlkVHlwZS5GaXhlZDtcbiAgICAgIHJlbW92ZUNsYXNzMSA9IEdyaWRUeXBlLkZpdDtcbiAgICAgIHJlbW92ZUNsYXNzMiA9IEdyaWRUeXBlLlNjcm9sbFZlcnRpY2FsO1xuICAgICAgcmVtb3ZlQ2xhc3MzID0gR3JpZFR5cGUuU2Nyb2xsSG9yaXpvbnRhbDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZ3JpZFR5cGUgPT09IEdyaWRUeXBlLlZlcnRpY2FsRml4ZWQpIHtcbiAgICAgIHRoaXMuZ3JpZHN0ZXIuY3VyUm93SGVpZ2h0ID1cbiAgICAgICAgdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5maXhlZFJvd0hlaWdodCArXG4gICAgICAgICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmlnbm9yZU1hcmdpbkluUm93XG4gICAgICAgICAgPyAwXG4gICAgICAgICAgOiB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbik7XG4gICAgICBhZGRDbGFzcyA9IEdyaWRUeXBlLlNjcm9sbFZlcnRpY2FsO1xuICAgICAgcmVtb3ZlQ2xhc3MxID0gR3JpZFR5cGUuRml0O1xuICAgICAgcmVtb3ZlQ2xhc3MyID0gR3JpZFR5cGUuU2Nyb2xsSG9yaXpvbnRhbDtcbiAgICAgIHJlbW92ZUNsYXNzMyA9IEdyaWRUeXBlLkZpeGVkO1xuICAgIH0gZWxzZSBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5ncmlkVHlwZSA9PT0gR3JpZFR5cGUuSG9yaXpvbnRhbEZpeGVkKSB7XG4gICAgICB0aGlzLmdyaWRzdGVyLmN1ckNvbFdpZHRoID1cbiAgICAgICAgdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5maXhlZENvbFdpZHRoICtcbiAgICAgICAgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuaWdub3JlTWFyZ2luSW5Sb3dcbiAgICAgICAgICA/IDBcbiAgICAgICAgICA6IHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMubWFyZ2luKTtcbiAgICAgIGFkZENsYXNzID0gR3JpZFR5cGUuU2Nyb2xsSG9yaXpvbnRhbDtcbiAgICAgIHJlbW92ZUNsYXNzMSA9IEdyaWRUeXBlLkZpdDtcbiAgICAgIHJlbW92ZUNsYXNzMiA9IEdyaWRUeXBlLlNjcm9sbFZlcnRpY2FsO1xuICAgICAgcmVtb3ZlQ2xhc3MzID0gR3JpZFR5cGUuRml4ZWQ7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5ncmlkc3Rlci5tb2JpbGUgfHxcbiAgICAgICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLnNldEdyaWRTaXplICYmXG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZ3JpZFR5cGUgIT09IEdyaWRUeXBlLkZpdClcbiAgICApIHtcbiAgICAgIHRoaXMuZ3JpZHN0ZXIucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5ncmlkc3Rlci5lbCwgYWRkQ2xhc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdyaWRzdGVyLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZ3JpZHN0ZXIuZWwsIGFkZENsYXNzKTtcbiAgICB9XG4gICAgdGhpcy5ncmlkc3Rlci5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmdyaWRzdGVyLmVsLCByZW1vdmVDbGFzczEpO1xuICAgIHRoaXMuZ3JpZHN0ZXIucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5ncmlkc3Rlci5lbCwgcmVtb3ZlQ2xhc3MyKTtcbiAgICB0aGlzLmdyaWRzdGVyLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZ3JpZHN0ZXIuZWwsIHJlbW92ZUNsYXNzMyk7XG4gIH1cblxuICBnZXRHcmlkQ29sdW1uU3R5bGUoaTogbnVtYmVyKTogQ29tbW9uR3JpZFN0eWxlIHtcbiAgICAvLyBnZW5lcmF0ZXMgdGhlIG5ldyBzdHlsZVxuICAgIGNvbnN0IG5ld1BvczogR3JpZENvbHVtbkNhY2hlZFN0eWxlID0ge1xuICAgICAgbGVmdDogdGhpcy5ncmlkc3Rlci5jdXJDb2xXaWR0aCAqIGksXG4gICAgICB3aWR0aDogdGhpcy5ncmlkc3Rlci5jdXJDb2xXaWR0aCAtIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMubWFyZ2luLFxuICAgICAgaGVpZ2h0OlxuICAgICAgICB0aGlzLmdyaWRzdGVyLmdyaWRSb3dzLmxlbmd0aCAqIHRoaXMuZ3JpZHN0ZXIuY3VyUm93SGVpZ2h0IC1cbiAgICAgICAgdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5tYXJnaW4sXG4gICAgICBzdHlsZToge31cbiAgICB9O1xuICAgIG5ld1Bvcy5zdHlsZSA9IHtcbiAgICAgIC4uLnRoaXMuZ2V0TGVmdFBvc2l0aW9uKG5ld1Bvcy5sZWZ0KSxcbiAgICAgIHdpZHRoOiBuZXdQb3Mud2lkdGggKyAncHgnLFxuICAgICAgaGVpZ2h0OiBuZXdQb3MuaGVpZ2h0ICsgJ3B4J1xuICAgIH07XG5cbiAgICAvLyB1c2UgdGhlIGxhc3QgY2FjaGVkIHN0eWxlIGlmIGl0IGhhcyBzYW1lIHZhbHVlcyBhcyB0aGUgZ2VuZXJhdGVkIG9uZVxuICAgIGNvbnN0IGxhc3QgPSB0aGlzLmxhc3RHcmlkQ29sdW1uU3R5bGVzW2ldO1xuICAgIGlmIChcbiAgICAgIGxhc3QgJiZcbiAgICAgIGxhc3QubGVmdCA9PT0gbmV3UG9zLmxlZnQgJiZcbiAgICAgIGxhc3Qud2lkdGggPT09IG5ld1Bvcy53aWR0aCAmJlxuICAgICAgbGFzdC5oZWlnaHQgPT09IG5ld1Bvcy5oZWlnaHRcbiAgICApIHtcbiAgICAgIHJldHVybiBsYXN0LnN0eWxlO1xuICAgIH1cblxuICAgIC8vIGNhY2hlIGFuZCBzZXQgbmV3IHN0eWxlXG4gICAgdGhpcy5sYXN0R3JpZENvbHVtblN0eWxlc1tpXSA9IG5ld1BvcztcbiAgICByZXR1cm4gbmV3UG9zLnN0eWxlO1xuICB9XG5cbiAgZ2V0R3JpZFJvd1N0eWxlKGk6IG51bWJlcik6IENvbW1vbkdyaWRTdHlsZSB7XG4gICAgLy8gZ2VuZXJhdGVzIHRoZSBuZXcgc3R5bGVcbiAgICBjb25zdCBuZXdQb3M6IEdyaWRSb3dDYWNoZWRTdHlsZSA9IHtcbiAgICAgIHRvcDogdGhpcy5ncmlkc3Rlci5jdXJSb3dIZWlnaHQgKiBpLFxuICAgICAgd2lkdGg6XG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIuZ3JpZENvbHVtbnMubGVuZ3RoICogdGhpcy5ncmlkc3Rlci5jdXJDb2xXaWR0aCArXG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMubWFyZ2luLFxuICAgICAgaGVpZ2h0OiB0aGlzLmdyaWRzdGVyLmN1clJvd0hlaWdodCAtIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMubWFyZ2luLFxuICAgICAgc3R5bGU6IHt9XG4gICAgfTtcbiAgICBuZXdQb3Muc3R5bGUgPSB7XG4gICAgICAuLi50aGlzLmdldFRvcFBvc2l0aW9uKG5ld1Bvcy50b3ApLFxuICAgICAgd2lkdGg6IG5ld1Bvcy53aWR0aCArICdweCcsXG4gICAgICBoZWlnaHQ6IG5ld1Bvcy5oZWlnaHQgKyAncHgnXG4gICAgfTtcblxuICAgIC8vIHVzZSB0aGUgbGFzdCBjYWNoZWQgc3R5bGUgaWYgaXQgaGFzIHNhbWUgdmFsdWVzIGFzIHRoZSBnZW5lcmF0ZWQgb25lXG4gICAgY29uc3QgbGFzdCA9IHRoaXMubGFzdEdyaWRSb3dTdHlsZXNbaV07XG4gICAgaWYgKFxuICAgICAgbGFzdCAmJlxuICAgICAgbGFzdC50b3AgPT09IG5ld1Bvcy50b3AgJiZcbiAgICAgIGxhc3Qud2lkdGggPT09IG5ld1Bvcy53aWR0aCAmJlxuICAgICAgbGFzdC5oZWlnaHQgPT09IG5ld1Bvcy5oZWlnaHRcbiAgICApIHtcbiAgICAgIHJldHVybiBsYXN0LnN0eWxlO1xuICAgIH1cblxuICAgIC8vIGNhY2hlIGFuZCBzZXQgbmV3IHN0eWxlXG4gICAgdGhpcy5sYXN0R3JpZFJvd1N0eWxlc1tpXSA9IG5ld1BvcztcbiAgICByZXR1cm4gbmV3UG9zLnN0eWxlO1xuICB9XG5cbiAgZ2V0TGVmdFBvc2l0aW9uKGQ6IG51bWJlcik6IHsgbGVmdDogc3RyaW5nIH0gfCB7IHRyYW5zZm9ybTogc3RyaW5nIH0ge1xuICAgIGNvbnN0IGRQb3NpdGlvbiA9IHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZGlyVHlwZSA9PT0gRGlyVHlwZXMuUlRMID8gLWQgOiBkO1xuICAgIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLnVzZVRyYW5zZm9ybVBvc2l0aW9uaW5nKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKCcgKyBkUG9zaXRpb24gKyAncHgpJ1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogdGhpcy5nZXRMZWZ0TWFyZ2luKCkgKyBkUG9zaXRpb24gKyAncHgnXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGdldFRvcFBvc2l0aW9uKGQ6IG51bWJlcik6IHsgdG9wOiBzdHJpbmcgfSB8IHsgdHJhbnNmb3JtOiBzdHJpbmcgfSB7XG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMudXNlVHJhbnNmb3JtUG9zaXRpb25pbmcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoJyArIGQgKyAncHgpJ1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9wOiB0aGlzLmdldFRvcE1hcmdpbigpICsgZCArICdweCdcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgY2xlYXJDZWxsUG9zaXRpb24ocmVuZGVyZXI6IFJlbmRlcmVyMiwgZWw6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy51c2VUcmFuc2Zvcm1Qb3NpdGlvbmluZykge1xuICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoZWwsICd0cmFuc2Zvcm0nLCAnJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlbmRlcmVyLnNldFN0eWxlKGVsLCAndG9wJywgJycpO1xuICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoZWwsICdsZWZ0JywgJycpO1xuICAgIH1cbiAgfVxuXG4gIHNldENlbGxQb3NpdGlvbihcbiAgICByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIGVsOiBFbGVtZW50LFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXJcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgeFBvc2l0aW9uID0gdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5kaXJUeXBlID09PSBEaXJUeXBlcy5SVEwgPyAteCA6IHg7XG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMudXNlVHJhbnNmb3JtUG9zaXRpb25pbmcpIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybSA9ICd0cmFuc2xhdGUzZCgnICsgeFBvc2l0aW9uICsgJ3B4LCAnICsgeSArICdweCwgMCknO1xuICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoZWwsICd0cmFuc2Zvcm0nLCB0cmFuc2Zvcm0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZW5kZXJlci5zZXRTdHlsZShlbCwgJ2xlZnQnLCB0aGlzLmdldExlZnRNYXJnaW4oKSArIHhQb3NpdGlvbiArICdweCcpO1xuICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoZWwsICd0b3AnLCB0aGlzLmdldFRvcE1hcmdpbigpICsgeSArICdweCcpO1xuICAgIH1cbiAgfVxuXG4gIGdldExlZnRNYXJnaW4oKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5vdXRlck1hcmdpbikge1xuICAgICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMub3V0ZXJNYXJnaW5MZWZ0ICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm91dGVyTWFyZ2luTGVmdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG5cbiAgZ2V0VG9wTWFyZ2luKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMub3V0ZXJNYXJnaW4pIHtcbiAgICAgIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm91dGVyTWFyZ2luVG9wICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm91dGVyTWFyZ2luVG9wO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMubWFyZ2luO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==