@schneideress/dashboardframework 0.0.71 → 0.0.73

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 (113) hide show
  1. package/README.md +24 -24
  2. package/bundles/schneideress-dashboardframework.umd.js +6997 -6992
  3. package/bundles/schneideress-dashboardframework.umd.js.map +1 -1
  4. package/bundles/schneideress-dashboardframework.umd.min.js +1 -1
  5. package/bundles/schneideress-dashboardframework.umd.min.js.map +1 -1
  6. package/esm2015/gridster/index.js +18 -18
  7. package/esm2015/gridster/lib/gridster.component.js +700 -700
  8. package/esm2015/gridster/lib/gridster.interface.js +84 -84
  9. package/esm2015/gridster/lib/gridster.module.js +27 -27
  10. package/esm2015/gridster/lib/gridsterCompact.service.js +223 -223
  11. package/esm2015/gridster/lib/gridsterConfig.constant.js +179 -179
  12. package/esm2015/gridster/lib/gridsterConfig.interface.js +219 -219
  13. package/esm2015/gridster/lib/gridsterConfigS.interface.js +161 -161
  14. package/esm2015/gridster/lib/gridsterDraggable.service.js +510 -510
  15. package/esm2015/gridster/lib/gridsterEmptyCell.service.js +317 -317
  16. package/esm2015/gridster/lib/gridsterItem.component.js +213 -213
  17. package/esm2015/gridster/lib/gridsterItem.interface.js +46 -46
  18. package/esm2015/gridster/lib/gridsterItemComponent.interface.js +48 -48
  19. package/esm2015/gridster/lib/gridsterPreview.component.js +66 -66
  20. package/esm2015/gridster/lib/gridsterPush.service.js +467 -467
  21. package/esm2015/gridster/lib/gridsterPushResize.service.js +358 -358
  22. package/esm2015/gridster/lib/gridsterRenderer.service.js +277 -277
  23. package/esm2015/gridster/lib/gridsterResizable.service.js +552 -552
  24. package/esm2015/gridster/lib/gridsterResizeEventType.interface.js +19 -19
  25. package/esm2015/gridster/lib/gridsterScroll.service.js +195 -195
  26. package/esm2015/gridster/lib/gridsterSwap.service.js +134 -134
  27. package/esm2015/gridster/lib/gridsterUtils.service.js +137 -137
  28. package/esm2015/lib/custom.notifier.options.js +46 -46
  29. package/esm2015/lib/ra-dashboard-area/ra.dashboard.area.js +494 -494
  30. package/esm2015/lib/ra-widget-container/ra.widget.container.component.js +461 -456
  31. package/esm2015/lib/ra.base.dashboard.filter.js +75 -75
  32. package/esm2015/lib/ra.base.dashboard.template.js +71 -71
  33. package/esm2015/lib/ra.dashbard.event.bus.js +85 -85
  34. package/esm2015/lib/ra.dashboard.module.js +49 -49
  35. package/esm2015/lib/ra.dashboard.service.js +144 -144
  36. package/esm2015/lib/ra.event.enum.js +51 -51
  37. package/esm2015/lib/ra.gridster.config.js +67 -67
  38. package/esm2015/public-api.js +16 -16
  39. package/esm2015/schneideress-dashboardframework.js +13 -13
  40. package/esm5/gridster/index.js +18 -18
  41. package/esm5/gridster/lib/gridster.component.js +803 -803
  42. package/esm5/gridster/lib/gridster.interface.js +94 -94
  43. package/esm5/gridster/lib/gridster.module.js +31 -31
  44. package/esm5/gridster/lib/gridsterCompact.service.js +253 -253
  45. package/esm5/gridster/lib/gridsterConfig.constant.js +179 -179
  46. package/esm5/gridster/lib/gridsterConfig.interface.js +219 -219
  47. package/esm5/gridster/lib/gridsterConfigS.interface.js +161 -161
  48. package/esm5/gridster/lib/gridsterDraggable.service.js +549 -549
  49. package/esm5/gridster/lib/gridsterEmptyCell.service.js +358 -358
  50. package/esm5/gridster/lib/gridsterItem.component.js +238 -238
  51. package/esm5/gridster/lib/gridsterItem.interface.js +46 -46
  52. package/esm5/gridster/lib/gridsterItemComponent.interface.js +58 -58
  53. package/esm5/gridster/lib/gridsterPreview.component.js +70 -70
  54. package/esm5/gridster/lib/gridsterPush.service.js +547 -547
  55. package/esm5/gridster/lib/gridsterPushResize.service.js +423 -423
  56. package/esm5/gridster/lib/gridsterRenderer.service.js +323 -323
  57. package/esm5/gridster/lib/gridsterResizable.service.js +629 -629
  58. package/esm5/gridster/lib/gridsterResizeEventType.interface.js +19 -19
  59. package/esm5/gridster/lib/gridsterScroll.service.js +195 -195
  60. package/esm5/gridster/lib/gridsterSwap.service.js +152 -152
  61. package/esm5/gridster/lib/gridsterUtils.service.js +177 -177
  62. package/esm5/lib/custom.notifier.options.js +46 -46
  63. package/esm5/lib/ra-dashboard-area/ra.dashboard.area.js +586 -586
  64. package/esm5/lib/ra-widget-container/ra.widget.container.component.js +574 -569
  65. package/esm5/lib/ra.base.dashboard.filter.js +81 -81
  66. package/esm5/lib/ra.base.dashboard.template.js +74 -74
  67. package/esm5/lib/ra.dashbard.event.bus.js +125 -125
  68. package/esm5/lib/ra.dashboard.module.js +53 -53
  69. package/esm5/lib/ra.dashboard.service.js +221 -221
  70. package/esm5/lib/ra.event.enum.js +51 -51
  71. package/esm5/lib/ra.gridster.config.js +67 -67
  72. package/esm5/public-api.js +16 -16
  73. package/esm5/schneideress-dashboardframework.js +13 -13
  74. package/fesm2015/schneideress-dashboardframework.js +6104 -6099
  75. package/fesm2015/schneideress-dashboardframework.js.map +1 -1
  76. package/fesm5/schneideress-dashboardframework.js +7001 -6996
  77. package/fesm5/schneideress-dashboardframework.js.map +1 -1
  78. package/gridster/index.d.ts +11 -11
  79. package/gridster/lib/gridster.component.d.ts +67 -67
  80. package/gridster/lib/gridster.interface.d.ts +46 -46
  81. package/gridster/lib/gridster.module.d.ts +2 -2
  82. package/gridster/lib/gridsterCompact.service.d.ts +15 -15
  83. package/gridster/lib/gridsterConfig.constant.d.ts +2 -2
  84. package/gridster/lib/gridsterConfig.interface.d.ts +133 -133
  85. package/gridster/lib/gridsterConfigS.interface.d.ts +93 -93
  86. package/gridster/lib/gridsterDraggable.service.d.ts +59 -59
  87. package/gridster/lib/gridsterEmptyCell.service.d.ts +29 -29
  88. package/gridster/lib/gridsterItem.component.d.ts +32 -32
  89. package/gridster/lib/gridsterItem.interface.d.ts +21 -21
  90. package/gridster/lib/gridsterItemComponent.interface.d.ts +25 -25
  91. package/gridster/lib/gridsterPreview.component.d.ts +10 -10
  92. package/gridster/lib/gridsterPush.service.d.ts +33 -33
  93. package/gridster/lib/gridsterPushResize.service.d.ts +26 -26
  94. package/gridster/lib/gridsterRenderer.service.d.ts +38 -38
  95. package/gridster/lib/gridsterResizable.service.d.ts +67 -67
  96. package/gridster/lib/gridsterResizeEventType.interface.d.ts +6 -6
  97. package/gridster/lib/gridsterScroll.service.d.ts +4 -4
  98. package/gridster/lib/gridsterSwap.service.d.ts +13 -13
  99. package/gridster/lib/gridsterUtils.service.d.ts +16 -16
  100. package/lib/custom.notifier.options.d.ts +2 -2
  101. package/lib/ra-dashboard-area/ra.dashboard.area.d.ts +64 -64
  102. package/lib/ra-widget-container/ra.widget.container.component.d.ts +63 -63
  103. package/lib/ra.base.dashboard.filter.d.ts +10 -10
  104. package/lib/ra.base.dashboard.template.d.ts +15 -15
  105. package/lib/ra.dashbard.event.bus.d.ts +20 -20
  106. package/lib/ra.dashboard.module.d.ts +2 -2
  107. package/lib/ra.dashboard.service.d.ts +22 -22
  108. package/lib/ra.event.enum.d.ts +42 -42
  109. package/lib/ra.gridster.config.d.ts +2 -2
  110. package/package.json +1 -1
  111. package/public-api.d.ts +8 -8
  112. package/schneideress-dashboardframework.d.ts +9 -9
  113. package/schneideress-dashboardframework.metadata.json +1 -1
@@ -1,549 +1,549 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- import { Injectable, NgZone } from '@angular/core';
6
- import { GridsterSwap } from './gridsterSwap.service';
7
- import { cancelScroll, scroll } from './gridsterScroll.service';
8
- import { GridsterPush } from './gridsterPush.service';
9
- import { GridsterUtils } from './gridsterUtils.service';
10
- import { GridsterItemComponentInterface } from './gridsterItemComponent.interface';
11
- import { GridsterComponentInterface } from './gridster.interface';
12
- var GridsterDraggable = /** @class */ (function () {
13
- function GridsterDraggable(gridsterItem, gridster, zone) {
14
- this.zone = zone;
15
- this.collision = false;
16
- this.gridsterItem = gridsterItem;
17
- this.gridster = gridster;
18
- this.lastMouse = {
19
- clientX: 0,
20
- clientY: 0
21
- };
22
- this.path = [];
23
- }
24
- /**
25
- * @return {?}
26
- */
27
- GridsterDraggable.prototype.destroy = /**
28
- * @return {?}
29
- */
30
- function () {
31
- if (this.gridster.previewStyle) {
32
- this.gridster.previewStyle(true);
33
- }
34
- delete this.gridsterItem;
35
- delete this.gridster;
36
- delete this.collision;
37
- if (this.mousedown) {
38
- this.mousedown();
39
- this.touchstart();
40
- }
41
- };
42
- /**
43
- * @param {?} e
44
- * @return {?}
45
- */
46
- GridsterDraggable.prototype.dragStart = /**
47
- * @param {?} e
48
- * @return {?}
49
- */
50
- function (e) {
51
- var _this = this;
52
- switch (e.which) {
53
- case 1:
54
- // left mouse button
55
- break;
56
- case 2:
57
- case 3:
58
- // right or middle mouse button
59
- return;
60
- }
61
- if (this.gridster.options.draggable && this.gridster.options.draggable.start) {
62
- this.gridster.options.draggable.start(this.gridsterItem.item, this.gridsterItem, e);
63
- }
64
- e.stopPropagation();
65
- e.preventDefault();
66
- this.dragFunction = this.dragMove.bind(this);
67
- this.dragStopFunction = this.dragStop.bind(this);
68
- this.zone.runOutsideAngular((/**
69
- * @return {?}
70
- */
71
- function () {
72
- _this.mousemove = _this.gridsterItem.renderer.listen('document', 'mousemove', _this.dragFunction);
73
- _this.touchmove = _this.gridster.renderer.listen(_this.gridster.el, 'touchmove', _this.dragFunction);
74
- }));
75
- this.mouseup = this.gridsterItem.renderer.listen('document', 'mouseup', this.dragStopFunction);
76
- this.mouseleave = this.gridsterItem.renderer.listen('document', 'mouseleave', this.dragStopFunction);
77
- this.cancelOnBlur = this.gridsterItem.renderer.listen('window', 'blur', this.dragStopFunction);
78
- this.touchend = this.gridsterItem.renderer.listen('document', 'touchend', this.dragStopFunction);
79
- this.touchcancel = this.gridsterItem.renderer.listen('document', 'touchcancel', this.dragStopFunction);
80
- this.gridsterItem.renderer.addClass(this.gridsterItem.el, 'gridster-item-moving');
81
- this.margin = this.gridster.$options.margin;
82
- this.offsetLeft = this.gridster.el.scrollLeft - this.gridster.el.offsetLeft;
83
- this.offsetTop = this.gridster.el.scrollTop - this.gridster.el.offsetTop;
84
- this.left = this.gridsterItem.left - this.margin;
85
- this.top = this.gridsterItem.top - this.margin;
86
- this.width = this.gridsterItem.width;
87
- this.height = this.gridsterItem.height;
88
- this.diffLeft = e.clientX + this.offsetLeft - this.margin - this.left;
89
- this.diffTop = e.clientY + this.offsetTop - this.margin - this.top;
90
- this.gridster.movingItem = this.gridsterItem.$item;
91
- this.gridster.previewStyle(true);
92
- this.push = new GridsterPush(this.gridsterItem);
93
- this.swap = new GridsterSwap(this.gridsterItem);
94
- this.gridster.dragInProgress = true;
95
- this.gridster.updateGrid();
96
- this.path.push({ x: this.gridsterItem.item.x || 0, y: this.gridsterItem.item.y || 0 });
97
- };
98
- /**
99
- * @param {?} e
100
- * @return {?}
101
- */
102
- GridsterDraggable.prototype.dragMove = /**
103
- * @param {?} e
104
- * @return {?}
105
- */
106
- function (e) {
107
- e.stopPropagation();
108
- e.preventDefault();
109
- GridsterUtils.checkTouchEvent(e);
110
- this.offsetLeft = this.gridster.el.scrollLeft - this.gridster.el.offsetLeft;
111
- this.offsetTop = this.gridster.el.scrollTop - this.gridster.el.offsetTop;
112
- scroll(this.gridster, this.left, this.top, this.width, this.height, e, this.lastMouse, this.calculateItemPositionFromMousePosition.bind(this));
113
- this.calculateItemPositionFromMousePosition(e);
114
- };
115
- /**
116
- * @param {?} e
117
- * @return {?}
118
- */
119
- GridsterDraggable.prototype.calculateItemPositionFromMousePosition = /**
120
- * @param {?} e
121
- * @return {?}
122
- */
123
- function (e) {
124
- var _this = this;
125
- this.left = e.clientX + this.offsetLeft - this.diffLeft;
126
- this.top = e.clientY + this.offsetTop - this.diffTop;
127
- this.calculateItemPosition();
128
- this.lastMouse.clientX = e.clientX;
129
- this.lastMouse.clientY = e.clientY;
130
- this.zone.run((/**
131
- * @return {?}
132
- */
133
- function () {
134
- _this.gridster.updateGrid();
135
- }));
136
- };
137
- /**
138
- * @param {?} e
139
- * @return {?}
140
- */
141
- GridsterDraggable.prototype.dragStop = /**
142
- * @param {?} e
143
- * @return {?}
144
- */
145
- function (e) {
146
- var _this = this;
147
- e.stopPropagation();
148
- e.preventDefault();
149
- cancelScroll();
150
- this.cancelOnBlur();
151
- this.mousemove();
152
- this.mouseup();
153
- this.mouseleave();
154
- this.touchmove();
155
- this.touchend();
156
- this.touchcancel();
157
- this.gridsterItem.renderer.removeClass(this.gridsterItem.el, 'gridster-item-moving');
158
- this.gridster.dragInProgress = false;
159
- this.gridster.updateGrid();
160
- this.path = [];
161
- if (this.gridster.options.draggable && this.gridster.options.draggable.stop) {
162
- Promise.resolve(this.gridster.options.draggable.stop(this.gridsterItem.item, this.gridsterItem, e))
163
- .then(this.makeDrag.bind(this), this.cancelDrag.bind(this));
164
- }
165
- else {
166
- this.makeDrag();
167
- }
168
- setTimeout((/**
169
- * @return {?}
170
- */
171
- function () {
172
- if (_this.gridster) {
173
- _this.gridster.movingItem = null;
174
- _this.gridster.previewStyle(true);
175
- }
176
- }));
177
- };
178
- /**
179
- * @return {?}
180
- */
181
- GridsterDraggable.prototype.cancelDrag = /**
182
- * @return {?}
183
- */
184
- function () {
185
- this.gridsterItem.$item.x = this.gridsterItem.item.x || 0;
186
- this.gridsterItem.$item.y = this.gridsterItem.item.y || 0;
187
- this.gridsterItem.setSize();
188
- if (this.push) {
189
- this.push.restoreItems();
190
- }
191
- if (this.swap) {
192
- this.swap.restoreSwapItem();
193
- }
194
- if (this.push) {
195
- this.push.destroy();
196
- delete this.push;
197
- }
198
- if (this.swap) {
199
- this.swap.destroy();
200
- delete this.swap;
201
- }
202
- };
203
- /**
204
- * @return {?}
205
- */
206
- GridsterDraggable.prototype.makeDrag = /**
207
- * @return {?}
208
- */
209
- function () {
210
- if (this.gridster.$options.draggable.dropOverItems && this.gridster.options.draggable
211
- && this.gridster.options.draggable.dropOverItemsCallback
212
- && this.collision && this.collision !== true && this.collision.$item) {
213
- this.gridster.options.draggable.dropOverItemsCallback(this.gridsterItem.item, this.collision.item, this.gridster);
214
- }
215
- this.collision = false;
216
- this.gridsterItem.setSize();
217
- this.gridsterItem.checkItemChanges(this.gridsterItem.$item, this.gridsterItem.item);
218
- if (this.push) {
219
- this.push.setPushedItems();
220
- }
221
- if (this.swap) {
222
- this.swap.setSwapItem();
223
- }
224
- if (this.push) {
225
- this.push.destroy();
226
- delete this.push;
227
- }
228
- if (this.swap) {
229
- this.swap.destroy();
230
- delete this.swap;
231
- }
232
- };
233
- /**
234
- * @return {?}
235
- */
236
- GridsterDraggable.prototype.checkforavailableSpaceintheArea = /**
237
- * @return {?}
238
- */
239
- function () {
240
- /** @type {?} */
241
- var itemRowsbackup = this.gridsterItem.$item.rows;
242
- /** @type {?} */
243
- var itemColsbackup = this.gridsterItem.$item.cols;
244
- this.gridsterItem.$item.x = this.positionX;
245
- this.gridsterItem.$item.y = this.positionY;
246
- /**
247
- * isCollide = 2 - no collision
248
- * @type {?}
249
- */
250
- var isCollide = 1;
251
- /** To iterate over the width of the gridster iTem and to check for collision */
252
- do {
253
- this.gridsterItem.$item.rows = itemRowsbackup;
254
- /** To iterate over the height of the gridster Item and check for collision */
255
- for (var rowcount = this.gridsterItem.$item.rows; rowcount >= 15; rowcount--) {
256
- if (!this.gridster.checkCollision(this.gridsterItem.$item)) {
257
- isCollide = 2;
258
- break;
259
- }
260
- else { /** has collision - check with x-1 position and*/
261
- /**
262
- * has collision - check with x-1 position and
263
- * @type {?}
264
- */
265
- var rowbkup = this.gridsterItem.$item.x;
266
- /** @type {?} */
267
- var lastPossiblePositionX = this.gridsterItem.$item.x;
268
- do {
269
- this.gridsterItem.$item.x = this.gridsterItem.$item.x - 1;
270
- if (!this.gridster.checkCollision(this.gridsterItem.$item)) {
271
- lastPossiblePositionX = this.gridsterItem.$item.x;
272
- }
273
- else {
274
- this.gridsterItem.$item.x = lastPossiblePositionX;
275
- /** @type {?} */
276
- var originalCols = this.gridsterItem.$item.cols;
277
- /** @type {?} */
278
- var lastPossibleCols = this.gridsterItem.$item.cols;
279
- do {
280
- this.gridsterItem.$item.cols = this.gridsterItem.$item.cols + 1;
281
- if (this.gridster.checkCollision(this.gridsterItem.$item)) {
282
- this.gridsterItem.$item.cols = lastPossibleCols;
283
- break;
284
- }
285
- else {
286
- lastPossibleCols = this.gridsterItem.$item.cols;
287
- }
288
- } while (this.gridsterItem.$item.cols - originalCols < 15);
289
- break;
290
- }
291
- } while (this.gridsterItem.$item.x > 0);
292
- if (this.gridster.checkCollision(this.gridsterItem.$item)) {
293
- this.gridsterItem.$item.rows = this.gridsterItem.$item.rows - 1;
294
- this.gridsterItem.$item.x = rowbkup;
295
- }
296
- else {
297
- isCollide = 2;
298
- break;
299
- }
300
- }
301
- }
302
- if (isCollide == 2) {
303
- break;
304
- }
305
- this.gridsterItem.$item.cols = this.gridsterItem.$item.cols - 1;
306
- } while (this.gridsterItem.$item.cols >= 15);
307
- // while (this.gridsterItem.$item.rows>=15 || this.gridsterItem.$item.cols>=15);
308
- if (isCollide == 1) {
309
- this.gridsterItem.$item.x = this.positionXBackup;
310
- this.gridsterItem.$item.y = this.positionYBackup;
311
- this.gridsterItem.$item.cols = itemColsbackup;
312
- this.gridsterItem.$item.rows = itemRowsbackup;
313
- }
314
- else {
315
- // this.gridsterItem.item.rows=this.gridsterItem.$item.rows;
316
- // this.gridsterItem.item.cols=this.gridsterItem.$item.cols;
317
- }
318
- return this.gridsterItem.$item;
319
- };
320
- /**
321
- * @return {?}
322
- */
323
- GridsterDraggable.prototype.calculateItemPosition = /**
324
- * @return {?}
325
- */
326
- function () {
327
- this.gridster.movingItem = this.gridsterItem.$item;
328
- this.positionX = this.gridster.pixelsToPositionX(this.left, Math.round);
329
- this.positionY = this.gridster.pixelsToPositionY(this.top, Math.round);
330
- this.positionXBackup = this.gridsterItem.$item.x;
331
- this.positionYBackup = this.gridsterItem.$item.y;
332
- this.gridsterItem.$item.x = this.positionX;
333
- if (this.gridster.checkGridCollision(this.gridsterItem.$item)) {
334
- this.gridsterItem.$item.x = this.positionXBackup;
335
- }
336
- this.gridsterItem.$item.y = this.positionY;
337
- if (this.gridster.checkGridCollision(this.gridsterItem.$item)) {
338
- this.gridsterItem.$item.y = this.positionYBackup;
339
- }
340
- if (this.gridster.options.autoResizeonDrag) {
341
- this.gridsterItem.$item = this.checkforavailableSpaceintheArea();
342
- this.gridsterItem.setSize();
343
- }
344
- this.gridster.gridRenderer.setCellPosition(this.gridsterItem.renderer, this.gridsterItem.el, this.left, this.top);
345
- if (this.positionXBackup !== this.gridsterItem.$item.x || this.positionYBackup !== this.gridsterItem.$item.y) {
346
- /** @type {?} */
347
- var lastPosition = this.path[this.path.length - 1];
348
- /** @type {?} */
349
- var direction = '';
350
- if (lastPosition.x < this.gridsterItem.$item.x) {
351
- direction = this.push.fromWest;
352
- }
353
- else if (lastPosition.x > this.gridsterItem.$item.x) {
354
- direction = this.push.fromEast;
355
- }
356
- else if (lastPosition.y < this.gridsterItem.$item.y) {
357
- direction = this.push.fromNorth;
358
- }
359
- else if (lastPosition.y > this.gridsterItem.$item.y) {
360
- direction = this.push.fromSouth;
361
- }
362
- this.push.pushItems(direction, this.gridster.$options.disablePushOnDrag);
363
- this.swap.swapItems();
364
- this.collision = this.gridster.checkCollision(this.gridsterItem.$item);
365
- if (this.collision) {
366
- this.gridsterItem.$item.x = this.positionXBackup;
367
- this.gridsterItem.$item.y = this.positionYBackup;
368
- if (this.gridster.$options.draggable.dropOverItems && this.collision !== true && this.collision.$item) {
369
- this.gridster.movingItem = null;
370
- }
371
- }
372
- else {
373
- this.path.push({ x: this.gridsterItem.$item.x, y: this.gridsterItem.$item.y });
374
- }
375
- this.push.checkPushBack();
376
- }
377
- this.gridster.previewStyle(true);
378
- };
379
- /**
380
- * @return {?}
381
- */
382
- GridsterDraggable.prototype.toggle = /**
383
- * @return {?}
384
- */
385
- function () {
386
- /** @type {?} */
387
- var enableDrag = this.gridsterItem.canBeDragged();
388
- if (!this.enabled && enableDrag) {
389
- this.enabled = !this.enabled;
390
- this.dragStartFunction = this.dragStartDelay.bind(this);
391
- this.mousedown = this.gridsterItem.renderer.listen(this.gridsterItem.el, 'mousedown', this.dragStartFunction);
392
- this.touchstart = this.gridsterItem.renderer.listen(this.gridsterItem.el, 'touchstart', this.dragStartFunction);
393
- }
394
- else if (this.enabled && !enableDrag) {
395
- this.enabled = !this.enabled;
396
- this.mousedown();
397
- this.touchstart();
398
- }
399
- };
400
- /**
401
- * @param {?} e
402
- * @return {?}
403
- */
404
- GridsterDraggable.prototype.dragStartDelay = /**
405
- * @param {?} e
406
- * @return {?}
407
- */
408
- function (e) {
409
- var _this = this;
410
- if (e.target.hasAttribute('class') && e.target.getAttribute('class').split(' ').indexOf('gridster-item-resizable-handler') > -1) {
411
- return;
412
- }
413
- if (GridsterUtils.checkContentClassForEvent(this.gridster, e)) {
414
- return;
415
- }
416
- GridsterUtils.checkTouchEvent(e);
417
- if (!this.gridster.$options.draggable.delayStart) {
418
- this.dragStart(e);
419
- return;
420
- }
421
- /** @type {?} */
422
- var timeout = setTimeout((/**
423
- * @return {?}
424
- */
425
- function () {
426
- _this.dragStart(e);
427
- cancelDrag();
428
- }), this.gridster.$options.draggable.delayStart);
429
- /** @type {?} */
430
- var cancelMouse = this.gridsterItem.renderer.listen('document', 'mouseup', cancelDrag);
431
- /** @type {?} */
432
- var cancelMouseLeave = this.gridsterItem.renderer.listen('document', 'mouseleave', cancelDrag);
433
- /** @type {?} */
434
- var cancelOnBlur = this.gridsterItem.renderer.listen('window', 'blur', cancelDrag);
435
- /** @type {?} */
436
- var cancelTouchMove = this.gridsterItem.renderer.listen('document', 'touchmove', cancelMove);
437
- /** @type {?} */
438
- var cancelTouchEnd = this.gridsterItem.renderer.listen('document', 'touchend', cancelDrag);
439
- /** @type {?} */
440
- var cancelTouchCancel = this.gridsterItem.renderer.listen('document', 'touchcancel', cancelDrag);
441
- /**
442
- * @param {?} eventMove
443
- * @return {?}
444
- */
445
- function cancelMove(eventMove) {
446
- GridsterUtils.checkTouchEvent(eventMove);
447
- if (Math.abs(eventMove.clientX - e.clientX) > 9 || Math.abs(eventMove.clientY - e.clientY) > 9) {
448
- cancelDrag();
449
- }
450
- }
451
- /**
452
- * @return {?}
453
- */
454
- function cancelDrag() {
455
- clearTimeout(timeout);
456
- cancelOnBlur();
457
- cancelMouse();
458
- cancelMouseLeave();
459
- cancelTouchMove();
460
- cancelTouchEnd();
461
- cancelTouchCancel();
462
- }
463
- };
464
- GridsterDraggable.decorators = [
465
- { type: Injectable }
466
- ];
467
- /** @nocollapse */
468
- GridsterDraggable.ctorParameters = function () { return [
469
- { type: GridsterItemComponentInterface },
470
- { type: GridsterComponentInterface },
471
- { type: NgZone }
472
- ]; };
473
- return GridsterDraggable;
474
- }());
475
- export { GridsterDraggable };
476
- if (false) {
477
- /** @type {?} */
478
- GridsterDraggable.prototype.gridsterItem;
479
- /** @type {?} */
480
- GridsterDraggable.prototype.gridster;
481
- /** @type {?} */
482
- GridsterDraggable.prototype.lastMouse;
483
- /** @type {?} */
484
- GridsterDraggable.prototype.offsetLeft;
485
- /** @type {?} */
486
- GridsterDraggable.prototype.offsetTop;
487
- /** @type {?} */
488
- GridsterDraggable.prototype.margin;
489
- /** @type {?} */
490
- GridsterDraggable.prototype.diffTop;
491
- /** @type {?} */
492
- GridsterDraggable.prototype.diffLeft;
493
- /** @type {?} */
494
- GridsterDraggable.prototype.top;
495
- /** @type {?} */
496
- GridsterDraggable.prototype.left;
497
- /** @type {?} */
498
- GridsterDraggable.prototype.height;
499
- /** @type {?} */
500
- GridsterDraggable.prototype.width;
501
- /** @type {?} */
502
- GridsterDraggable.prototype.positionX;
503
- /** @type {?} */
504
- GridsterDraggable.prototype.positionY;
505
- /** @type {?} */
506
- GridsterDraggable.prototype.positionXBackup;
507
- /** @type {?} */
508
- GridsterDraggable.prototype.positionYBackup;
509
- /** @type {?} */
510
- GridsterDraggable.prototype.enabled;
511
- /** @type {?} */
512
- GridsterDraggable.prototype.dragStartFunction;
513
- /** @type {?} */
514
- GridsterDraggable.prototype.dragFunction;
515
- /** @type {?} */
516
- GridsterDraggable.prototype.dragStopFunction;
517
- /** @type {?} */
518
- GridsterDraggable.prototype.mousemove;
519
- /** @type {?} */
520
- GridsterDraggable.prototype.mouseup;
521
- /** @type {?} */
522
- GridsterDraggable.prototype.mouseleave;
523
- /** @type {?} */
524
- GridsterDraggable.prototype.cancelOnBlur;
525
- /** @type {?} */
526
- GridsterDraggable.prototype.touchmove;
527
- /** @type {?} */
528
- GridsterDraggable.prototype.touchend;
529
- /** @type {?} */
530
- GridsterDraggable.prototype.touchcancel;
531
- /** @type {?} */
532
- GridsterDraggable.prototype.mousedown;
533
- /** @type {?} */
534
- GridsterDraggable.prototype.touchstart;
535
- /** @type {?} */
536
- GridsterDraggable.prototype.push;
537
- /** @type {?} */
538
- GridsterDraggable.prototype.swap;
539
- /** @type {?} */
540
- GridsterDraggable.prototype.path;
541
- /** @type {?} */
542
- GridsterDraggable.prototype.collision;
543
- /**
544
- * @type {?}
545
- * @private
546
- */
547
- GridsterDraggable.prototype.zone;
548
- }
549
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXJEcmFnZ2FibGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzY2huZWlkZXJlc3MvZGFzaGJvYXJkZnJhbWV3b3JrLyIsInNvdXJjZXMiOlsiZ3JpZHN0ZXIvbGliL2dyaWRzdGVyRHJhZ2dhYmxlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbEU7SUF1Q0UsMkJBQVksWUFBNEMsRUFBRSxRQUFvQyxFQUFVLElBQVk7UUFBWixTQUFJLEdBQUosSUFBSSxDQUFRO1FBRnBILGNBQVMsR0FBNkMsS0FBSyxDQUFDO1FBRzFELElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUc7WUFDZixPQUFPLEVBQUUsQ0FBQztZQUNWLE9BQU8sRUFBRSxDQUFDO1NBQ1gsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLENBQUM7Ozs7SUFFRCxtQ0FBTzs7O0lBQVA7UUFDRSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFO1lBQzlCLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElB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SUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDNUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDO1FBQzVFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQztRQUN6RSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDakQsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQy9DLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDckMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztRQUN2QyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDdEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ25FLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO1FBQ25ELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxZQUFZ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aUJBQWlCLEVBQUUsQ0FBQztRQUN0QixDQUFDO0lBQ0gsQ0FBQzs7Z0JBMVlGLFVBQVU7Ozs7Z0JBSEYsOEJBQThCO2dCQUM5QiwwQkFBMEI7Z0JBUGQsTUFBTTs7SUFvWjNCLHdCQUFDO0NBQUEsQUEzWUQsSUEyWUM7U0ExWVksaUJBQWlCOzs7SUFDNUIseUNBQTZDOztJQUM3QyxxQ0FBcUM7O0lBQ3JDLHNDQUdFOztJQUNGLHVDQUFtQjs7SUFDbkIsc0NBQWtCOztJQUNsQixtQ0FBZTs7SUFDZixvQ0FBZ0I7O0lBQ2hCLHFDQUFpQjs7SUFDakIsZ0NBQVk7O0lBQ1osaUNBQWE7O0lBQ2IsbUNBQWU7O0lBQ2Ysa0NBQWM7O0lBQ2Qsc0NBQWtCOztJQUNsQixzQ0FBa0I7O0lBQ2xCLDRDQUF3Qjs7SUFDeEIsNENBQXdCOztJQUN4QixvQ0FBaUI7O0lBQ2pCLDhDQUF3Qzs7SUFDeEMseUNBQW1DOztJQUNuQyw2Q0FBdUM7O0lBQ3ZDLHNDQUFvQjs7SUFDcEIsb0NBQWtCOztJQUNsQix1Q0FBcUI7O0lBQ3JCLHlDQUF1Qjs7SUFDdkIsc0NBQW9COztJQUNwQixxQ0FBbUI7O0lBQ25CLHdDQUFzQjs7SUFDdEIsc0NBQW9COztJQUNwQix1Q0FBcUI7O0lBQ3JCLGlDQUFtQjs7SUFDbkIsaUNBQW1COztJQUNuQixpQ0FBc0M7O0lBQ3RDLHNDQUE0RDs7Ozs7SUFFb0MsaUNBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgeyBHcmlkc3RlclN3YXAgfSBmcm9tICcuL2dyaWRzdGVyU3dhcC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgY2FuY2VsU2Nyb2xsLCBzY3JvbGwgfSBmcm9tICcuL2dyaWRzdGVyU2Nyb2xsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBHcmlkc3RlclB1c2ggfSBmcm9tICcuL2dyaWRzdGVyUHVzaC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgR3JpZHN0ZXJVdGlscyB9IGZyb20gJy4vZ3JpZHN0ZXJVdGlscy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlIH0gZnJvbSAnLi9ncmlkc3Rlckl0ZW1Db21wb25lbnQuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgR3JpZHN0ZXJDb21wb25lbnRJbnRlcmZhY2UgfSBmcm9tICcuL2dyaWRzdGVyLmludGVyZmFjZSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBHcmlkc3RlckRyYWdnYWJsZSB7XHJcbiAgZ3JpZHN0ZXJJdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U7XHJcbiAgZ3JpZHN0ZXI6IEdyaWRzdGVyQ29tcG9uZW50SW50ZXJmYWNlO1xyXG4gIGxhc3RNb3VzZToge1xyXG4gICAgY2xpZW50WDogbnVtYmVyLFxyXG4gICAgY2xpZW50WTogbnVtYmVyXHJcbiAgfTtcclxuICBvZmZzZXRMZWZ0OiBudW1iZXI7XHJcbiAgb2Zmc2V0VG9wOiBudW1iZXI7XHJcbiAgbWFyZ2luOiBudW1iZXI7XHJcbiAgZGlmZlRvcDogbnVtYmVyO1xyXG4gIGRpZmZMZWZ0OiBudW1iZXI7XHJcbiAgdG9wOiBudW1iZXI7XHJcbiAgbGVmdDogbnVtYmVyO1xyXG4gIGhlaWdodDogbnVtYmVyO1xyXG4gIHdpZHRoOiBudW1iZXI7XHJcbiAgcG9zaXRpb25YOiBudW1iZXI7XHJcbiAgcG9zaXRpb25ZOiBudW1iZXI7XHJcbiAgcG9zaXRpb25YQmFja3VwOiBudW1iZXI7XHJcbiAgcG9zaXRpb25ZQmFja3VwOiBudW1iZXI7XHJcbiAgZW5hYmxlZDogYm9vbGVhbjtcclxuICBkcmFnU3RhcnRGdW5jdGlvbjogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XHJcbiAgZHJhZ0Z1bmN0aW9uOiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcclxuICBkcmFnU3RvcEZ1bmN0aW9uOiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcclxuICBtb3VzZW1vdmU6IEZ1bmN0aW9uO1xyXG4gIG1vdXNldXA6IEZ1bmN0aW9uO1xyXG4gIG1vdXNlbGVhdmU6IEZ1bmN0aW9uO1xyXG4gIGNhbmNlbE9uQmx1cjogRnVuY3Rpb247XHJcbiAgdG91Y2htb3ZlOiBGdW5jdGlvbjtcclxuICB0b3VjaGVuZDogRnVuY3Rpb247XHJcbiAgdG91Y2hjYW5jZWw6IEZ1bmN0aW9uO1xyXG4gIG1vdXNlZG93bjogRnVuY3Rpb247XHJcbiAgdG91Y2hzdGFydDogRnVuY3Rpb247XHJcbiAgcHVzaDogR3JpZHN0ZXJQdXNoO1xyXG4gIHN3YXA6IEdyaWRzdGVyU3dhcDtcclxuICBwYXRoOiBBcnJheTx7IHg6IG51bWJlciwgeTogbnVtYmVyIH0+O1xyXG4gIGNvbGxpc2lvbjogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlIHwgYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihncmlkc3Rlckl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSwgZ3JpZHN0ZXI6IEdyaWRzdGVyQ29tcG9uZW50SW50ZXJmYWNlLCBwcml2YXRlIHpvbmU6IE5nWm9uZSkge1xyXG4gICAgdGhpcy5ncmlkc3Rlckl0ZW0gPSBncmlkc3Rlckl0ZW07XHJcbiAgICB0aGlzLmdyaWRzdGVyID0gZ3JpZHN0ZXI7XHJcbiAgICB0aGlzLmxhc3RNb3VzZSA9IHtcclxuICAgICAgY2xpZW50WDogMCxcclxuICAgICAgY2xpZW50WTogMFxyXG4gICAgfTtcclxuICAgIHRoaXMucGF0aCA9IFtdO1xyXG4gIH1cclxuXHJcbiAgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmdyaWRzdGVyLnByZXZpZXdTdHlsZSkge1xyXG4gICAgICB0aGlzLmdyaWRzdGVyLnByZXZpZXdTdHlsZSh0cnVlKTtcclxuICAgIH1cclxuICAgIGRlbGV0ZSB0aGlzLmdyaWRzdGVySXRlbTtcclxuICAgIGRlbGV0ZSB0aGlzLmdyaWRzdGVyO1xyXG4gICAgZGVsZXRlIHRoaXMuY29sbGlzaW9uO1xyXG4gICAgaWYgKHRoaXMubW91c2Vkb3duKSB7XHJcbiAgICAgIHRoaXMubW91c2Vkb3duKCk7XHJcbiAgICAgIHRoaXMudG91Y2hzdGFydCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZHJhZ1N0YXJ0KGU6IGFueSk6IHZvaWQge1xyXG4gICAgc3dpdGNoIChlLndoaWNoKSB7XHJcbiAgICAgIGNhc2UgMTpcclxuICAgICAgICAvLyBsZWZ0IG1vdXNlIGJ1dHRvblxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgIGNhc2UgMzpcclxuICAgICAgICAvLyByaWdodCBvciBtaWRkbGUgbW91c2UgYnV0dG9uXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmdyaWRzdGVyLm9wdGlvbnMuZHJhZ2dhYmxlICYmIHRoaXMuZ3JpZHN0ZXIub3B0aW9ucy5kcmFnZ2FibGUuc3RhcnQpIHtcclxuICAgICAgdGhpcy5ncmlkc3Rlci5vcHRpb25zLmRyYWdnYWJsZS5zdGFydCh0aGlzLmdyaWRzdGVySXRlbS5pdGVtLCB0aGlzLmdyaWRzdGVySXRlbSwgZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuZHJhZ0Z1bmN0aW9uID0gdGhpcy5kcmFnTW92ZS5iaW5kKHRoaXMpO1xyXG4gICAgdGhpcy5kcmFnU3RvcEZ1bmN0aW9uID0gdGhpcy5kcmFnU3RvcC5iaW5kKHRoaXMpO1xyXG5cclxuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcbiAgICAgIHRoaXMubW91c2Vtb3ZlID0gdGhpcy5ncmlkc3Rlckl0ZW0ucmVuZGVyZXIubGlzdGVuKCdkb2N1bWVudCcsICdtb3VzZW1vdmUnLCB0aGlzLmRyYWdGdW5jdGlvbik7XHJcbiAgICAgIHRoaXMudG91Y2htb3ZlID0gdGhpcy5ncmlkc3Rlci5yZW5kZXJlci5saXN0ZW4odGhpcy5ncmlkc3Rlci5lbCwgJ3RvdWNobW92ZScsIHRoaXMuZHJhZ0Z1bmN0aW9uKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5tb3VzZXVwID0gdGhpcy5ncmlkc3Rlckl0ZW0ucmVuZGVyZXIubGlzdGVuKCdkb2N1bWVudCcsICdtb3VzZXVwJywgdGhpcy5kcmFnU3RvcEZ1bmN0aW9uKTtcclxuICAgIHRoaXMubW91c2VsZWF2ZSA9IHRoaXMuZ3JpZHN0ZXJJdGVtLnJlbmRlcmVyLmxpc3RlbignZG9jdW1lbnQnLCAnbW91c2VsZWF2ZScsIHRoaXMuZHJhZ1N0b3BGdW5jdGlvbik7XHJcbiAgICB0aGlzLmNhbmNlbE9uQmx1ciA9IHRoaXMuZ3JpZHN0ZXJJdGVtLnJlbmRlcmVyLmxpc3Rlbignd2luZG93JywgJ2JsdXInLCB0aGlzLmRyYWdTdG9wRnVuY3Rpb24pO1xyXG4gICAgdGhpcy50b3VjaGVuZCA9IHRoaXMuZ3JpZHN0ZXJJdGVtLnJlbmRlcmVyLmxpc3RlbignZG9jdW1lbnQnLCAndG91Y2hlbmQnLCB0aGlzLmRyYWdTdG9wRnVuY3Rpb24pO1xyXG4gICAgdGhpcy50b3VjaGNhbmNlbCA9IHRoaXMuZ3JpZHN0ZXJJdGVtLnJlbmRlcmVyLmxpc3RlbignZG9jdW1lbnQnLCAndG91Y2hjYW5jZWwnLCB0aGlzLmRyYWdTdG9wRnVuY3Rpb24pO1xyXG4gICAgdGhpcy5ncmlkc3Rlckl0ZW0ucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5ncmlkc3Rlckl0ZW0uZWwsICdncmlkc3Rlci1pdGVtLW1vdmluZycpO1xyXG4gICAgdGhpcy5tYXJnaW4gPSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbjtcclxuICAgIHRoaXMub2Zmc2V0TGVmdCA9IHRoaXMuZ3JpZHN0ZXIuZWwuc2Nyb2xsTGVmdCAtIHRoaXMuZ3JpZHN0ZXIuZWwub2Zmc2V0TGVmdDtcclxuICAgIHRoaXMub2Zmc2V0VG9wID0gdGhpcy5ncmlkc3Rlci5lbC5zY3JvbGxUb3AgLSB0aGlzLmdyaWRzdGVyLmVsLm9mZnNldFRvcDtcclxuICAgIHRoaXMubGVmdCA9IHRoaXMuZ3JpZHN0ZXJJdGVtLmxlZnQgLSB0aGlzLm1hcmdpbjtcclxuICAgIHRoaXMudG9wID0gdGhpcy5ncmlkc3Rlckl0ZW0udG9wIC0gdGhpcy5tYXJnaW47XHJcbiAgICB0aGlzLndpZHRoID0gdGhpcy5ncmlkc3Rlckl0ZW0ud2lkdGg7XHJcbiAgICB0aGlzLmhlaWdodCA9IHRoaXMuZ3JpZHN0ZXJJdGVtLmhlaWdodDtcclxuICAgIHRoaXMuZGlmZkxlZnQgPSBlLmNsaWVudFggKyB0aGlzLm9mZnNldExlZnQgLSB0aGlzLm1hcmdpbiAtIHRoaXMubGVmdDtcclxuICAgIHRoaXMuZGlmZlRvcCA9IGUuY2xpZW50WSArIHRoaXMub2Zmc2V0VG9wIC0gdGhpcy5tYXJnaW4gLSB0aGlzLnRvcDtcclxuICAgIHRoaXMuZ3JpZHN0ZXIubW92aW5nSXRlbSA9IHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtO1xyXG4gICAgdGhpcy5ncmlkc3Rlci5wcmV2aWV3U3R5bGUodHJ1ZSk7XHJcbiAgICB0aGlzLnB1c2ggPSBuZXcgR3JpZHN0ZXJQdXNoKHRoaXMuZ3JpZHN0ZXJJdGVtKTtcclxuICAgIHRoaXMuc3dhcCA9IG5ldyBHcmlkc3RlclN3YXAodGhpcy5ncmlkc3Rlckl0ZW0pO1xyXG4gICAgdGhpcy5ncmlkc3Rlci5kcmFnSW5Qcm9ncmVzcyA9IHRydWU7XHJcbiAgICB0aGlzLmdyaWRzdGVyLnVwZGF0ZUdyaWQoKTtcclxuICAgIHRoaXMucGF0aC5wdXNoKHsgeDogdGhpcy5ncmlkc3Rlckl0ZW0uaXRlbS54IHx8IDAsIHk6IHRoaXMuZ3JpZHN0ZXJJdGVtLml0ZW0ueSB8fCAwIH0pO1xyXG4gIH1cclxuXHJcbiAgZHJhZ01vdmUoZTogYW55KTogdm9pZCB7XHJcblxyXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIEdyaWRzdGVyVXRpbHMuY2hlY2tUb3VjaEV2ZW50KGUpO1xyXG4gICAgdGhpcy5vZmZzZXRMZWZ0ID0gdGhpcy5ncmlkc3Rlci5lbC5zY3JvbGxMZWZ0IC0gdGhpcy5ncmlkc3Rlci5lbC5vZmZzZXRMZWZ0O1xyXG4gICAgdGhpcy5vZmZzZXRUb3AgPSB0aGlzLmdyaWRzdGVyLmVsLnNjcm9sbFRvcCAtIHRoaXMuZ3JpZHN0ZXIuZWwub2Zmc2V0VG9wO1xyXG4gICAgc2Nyb2xsKHRoaXMuZ3JpZHN0ZXIsIHRoaXMubGVmdCwgdGhpcy50b3AsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCBlLCB0aGlzLmxhc3RNb3VzZSxcclxuICAgICAgdGhpcy5jYWxjdWxhdGVJdGVtUG9zaXRpb25Gcm9tTW91c2VQb3NpdGlvbi5iaW5kKHRoaXMpKTtcclxuXHJcbiAgICB0aGlzLmNhbGN1bGF0ZUl0ZW1Qb3NpdGlvbkZyb21Nb3VzZVBvc2l0aW9uKGUpO1xyXG4gIH1cclxuXHJcbiAgY2FsY3VsYXRlSXRlbVBvc2l0aW9uRnJvbU1vdXNlUG9zaXRpb24oZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmxlZnQgPSBlLmNsaWVudFggKyB0aGlzLm9mZnNldExlZnQgLSB0aGlzLmRpZmZMZWZ0O1xyXG4gICAgdGhpcy50b3AgPSBlLmNsaWVudFkgKyB0aGlzLm9mZnNldFRvcCAtIHRoaXMuZGlmZlRvcDtcclxuICAgIHRoaXMuY2FsY3VsYXRlSXRlbVBvc2l0aW9uKCk7XHJcbiAgICB0aGlzLmxhc3RNb3VzZS5jbGllbnRYID0gZS5jbGllbnRYO1xyXG4gICAgdGhpcy5sYXN0TW91c2UuY2xpZW50WSA9IGUuY2xpZW50WTtcclxuICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICB0aGlzLmdyaWRzdGVyLnVwZGF0ZUdyaWQoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZHJhZ1N0b3AoZTogYW55KTogdm9pZCB7XHJcblxyXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICBjYW5jZWxTY3JvbGwoKTtcclxuICAgIHRoaXMuY2FuY2VsT25CbHVyKCk7XHJcbiAgICB0aGlzLm1vdXNlbW92ZSgpO1xyXG4gICAgdGhpcy5tb3VzZXVwKCk7XHJcbiAgICB0aGlzLm1vdXNlbGVhdmUoKTtcclxuICAgIHRoaXMudG91Y2htb3ZlKCk7XHJcbiAgICB0aGlzLnRvdWNoZW5kKCk7XHJcbiAgICB0aGlzLnRvdWNoY2FuY2VsKCk7XHJcbiAgICB0aGlzLmdyaWRzdGVySXRlbS5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmdyaWRzdGVySXRlbS5lbCwgJ2dyaWRzdGVyLWl0ZW0tbW92aW5nJyk7XHJcbiAgICB0aGlzLmdyaWRzdGVyLmRyYWdJblByb2dyZXNzID0gZmFsc2U7XHJcbiAgICB0aGlzLmdyaWRzdGVyLnVwZGF0ZUdyaWQoKTtcclxuICAgIHRoaXMucGF0aCA9IFtdO1xyXG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIub3B0aW9ucy5kcmFnZ2FibGUgJiYgdGhpcy5ncmlkc3Rlci5vcHRpb25zLmRyYWdnYWJsZS5zdG9wKSB7XHJcbiAgICAgIFByb21pc2UucmVzb2x2ZSh0aGlzLmdyaWRzdGVyLm9wdGlvbnMuZHJhZ2dhYmxlLnN0b3AodGhpcy5ncmlkc3Rlckl0ZW0uaXRlbSwgdGhpcy5ncmlkc3Rlckl0ZW0sIGUpKVxyXG4gICAgICAgIC50aGVuKHRoaXMubWFrZURyYWcuYmluZCh0aGlzKSwgdGhpcy5jYW5jZWxEcmFnLmJpbmQodGhpcykpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5tYWtlRHJhZygpO1xyXG4gICAgfVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmdyaWRzdGVyKSB7XHJcbiAgICAgICAgdGhpcy5ncmlkc3Rlci5tb3ZpbmdJdGVtID0gbnVsbDtcclxuICAgICAgICB0aGlzLmdyaWRzdGVyLnByZXZpZXdTdHlsZSh0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjYW5jZWxEcmFnKCkge1xyXG4gICAgdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueCA9IHRoaXMuZ3JpZHN0ZXJJdGVtLml0ZW0ueCB8fCAwO1xyXG4gICAgdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueSA9IHRoaXMuZ3JpZHN0ZXJJdGVtLml0ZW0ueSB8fCAwO1xyXG4gICAgdGhpcy5ncmlkc3Rlckl0ZW0uc2V0U2l6ZSgpO1xyXG4gICAgaWYgKHRoaXMucHVzaCkge1xyXG4gICAgICB0aGlzLnB1c2gucmVzdG9yZUl0ZW1zKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zd2FwKSB7XHJcbiAgICAgIHRoaXMuc3dhcC5yZXN0b3JlU3dhcEl0ZW0oKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnB1c2gpIHtcclxuICAgICAgdGhpcy5wdXNoLmRlc3Ryb3koKTtcclxuICAgICAgZGVsZXRlIHRoaXMucHVzaDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnN3YXApIHtcclxuICAgICAgdGhpcy5zd2FwLmRlc3Ryb3koKTtcclxuICAgICAgZGVsZXRlIHRoaXMuc3dhcDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1ha2VEcmFnKCkge1xyXG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZHJhZ2dhYmxlLmRyb3BPdmVySXRlbXMgJiYgdGhpcy5ncmlkc3Rlci5vcHRpb25zLmRyYWdnYWJsZVxyXG4gICAgICAmJiB0aGlzLmdyaWRzdGVyLm9wdGlvbnMuZHJhZ2dhYmxlLmRyb3BPdmVySXRlbXNDYWxsYmFja1xyXG4gICAgICAmJiB0aGlzLmNvbGxpc2lvbiAmJiB0aGlzLmNvbGxpc2lvbiAhPT0gdHJ1ZSAmJiB0aGlzLmNvbGxpc2lvbi4kaXRlbSkge1xyXG4gICAgICB0aGlzLmdyaWRzdGVyLm9wdGlvbnMuZHJhZ2dhYmxlLmRyb3BPdmVySXRlbXNDYWxsYmFjayh0aGlzLmdyaWRzdGVySXRlbS5pdGVtLCB0aGlzLmNvbGxpc2lvbi5pdGVtLCB0aGlzLmdyaWRzdGVyKTtcclxuICAgIH1cclxuICAgIHRoaXMuY29sbGlzaW9uID0gZmFsc2U7XHJcbiAgICB0aGlzLmdyaWRzdGVySXRlbS5zZXRTaXplKCk7XHJcbiAgICB0aGlzLmdyaWRzdGVySXRlbS5jaGVja0l0ZW1DaGFuZ2VzKHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLCB0aGlzLmdyaWRzdGVySXRlbS5pdGVtKTtcclxuICAgIGlmICh0aGlzLnB1c2gpIHtcclxuICAgICAgdGhpcy5wdXNoLnNldFB1c2hlZEl0ZW1zKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zd2FwKSB7XHJcbiAgICAgIHRoaXMuc3dhcC5zZXRTd2FwSXRlbSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucHVzaCkge1xyXG4gICAgICB0aGlzLnB1c2guZGVzdHJveSgpO1xyXG4gICAgICBkZWxldGUgdGhpcy5wdXNoO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc3dhcCkge1xyXG4gICAgICB0aGlzLnN3YXAuZGVzdHJveSgpO1xyXG4gICAgICBkZWxldGUgdGhpcy5zd2FwO1xyXG4gICAgfVxyXG4gIH1cclxuICBjaGVja2ZvcmF2YWlsYWJsZVNwYWNlaW50aGVBcmVhKCkge1xyXG4gICAgbGV0IGl0ZW1Sb3dzYmFja3VwID0gdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ucm93cztcclxuICAgIGxldCBpdGVtQ29sc2JhY2t1cCA9IHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLmNvbHM7XHJcblxyXG4gICAgdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueCA9IHRoaXMucG9zaXRpb25YO1xyXG4gICAgdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueSA9IHRoaXMucG9zaXRpb25ZO1xyXG4gICAgLyoqIGlzQ29sbGlkZSA9IDIgLSBubyBjb2xsaXNpb24gICovXHJcbiAgICB2YXIgaXNDb2xsaWRlID0gMTtcclxuXHJcbiAgICAvKiogVG8gaXRlcmF0ZSBvdmVyIHRoZSB3aWR0aCBvZiB0aGUgZ3JpZHN0ZXIgaVRlbSBhbmQgdG8gY2hlY2sgZm9yIGNvbGxpc2lvbiAqL1xyXG4gICAgZG8ge1xyXG5cclxuICAgICAgdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ucm93cyA9IGl0ZW1Sb3dzYmFja3VwO1xyXG5cclxuICAgICAgLyoqIFRvIGl0ZXJhdGUgb3ZlciB0aGUgaGVpZ2h0IG9mIHRoZSBncmlkc3RlciBJdGVtIGFuZCBjaGVjayBmb3IgY29sbGlzaW9uICovXHJcbiAgICAgIGZvciAobGV0IHJvd2NvdW50ID0gdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ucm93czsgcm93Y291bnQgPj0gMTU7IHJvd2NvdW50LS0pIHtcclxuICAgICAgICBpZiAoIXRoaXMuZ3JpZHN0ZXIuY2hlY2tDb2xsaXNpb24odGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0pKSB7XHJcbiAgICAgICAgICBpc0NvbGxpZGUgPSAyO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgeyAvKiogaGFzIGNvbGxpc2lvbiAtICBjaGVjayB3aXRoIHgtMSBwb3NpdGlvbiBhbmQqL1xyXG4gICAgICAgICAgbGV0IHJvd2JrdXAgPSB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS54O1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICBsZXQgbGFzdFBvc3NpYmxlUG9zaXRpb25YPXRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLng7XHJcbiAgICAgICAgICBkb3tcclxuICAgICAgICAgICAgdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueCA9IHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnggLSAxO1xyXG4gICAgICAgICAgICBpZighdGhpcy5ncmlkc3Rlci5jaGVja0NvbGxpc2lvbih0aGlzLmdyaWRzdGVySXRlbS4kaXRlbSkpe1xyXG4gICAgICAgICAgICAgIGxhc3RQb3NzaWJsZVBvc2l0aW9uWD10aGlzLmdyaWRzdGVySXRlbS4kaXRlbS54O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueD1sYXN0UG9zc2libGVQb3NpdGlvblg7XHJcbiAgICAgICAgICAgICAgbGV0IG9yaWdpbmFsQ29scz10aGlzLmdyaWRzdGVySXRlbS4kaXRlbS5jb2xzO1xyXG4gICAgICAgICAgICAgIGxldCBsYXN0UG9zc2libGVDb2xzPXRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLmNvbHM7XHJcbiAgICAgICAgICAgICAgZG97XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS5jb2xzPXRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLmNvbHMrMTtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuZ3JpZHN0ZXIuY2hlY2tDb2xsaXNpb24odGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0pKXtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0uY29scz1sYXN0UG9zc2libGVDb2xzO1xyXG4gICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgICAgIGxhc3RQb3NzaWJsZUNvbHM9dGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0uY29scztcclxuICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHdoaWxlKHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLmNvbHMtb3JpZ2luYWxDb2xzIDwxNSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHdoaWxlKHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLng+MClcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgaWYgKHRoaXMuZ3JpZHN0ZXIuY2hlY2tDb2xsaXNpb24odGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0pKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnJvd3MgPSB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS5yb3dzIC0gMTtcclxuICAgICAgICAgICAgdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueCA9IHJvd2JrdXA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNle1xyXG4gICAgICAgICAgICBpc0NvbGxpZGUgPSAyO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGlzQ29sbGlkZSA9PSAyKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0uY29scyA9IHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLmNvbHMgLSAxO1xyXG5cclxuICAgIH1cclxuICAgIHdoaWxlICh0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS5jb2xzID49IDE1KTtcclxuICAgIC8vIHdoaWxlICh0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS5yb3dzPj0xNSB8fCB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS5jb2xzPj0xNSk7XHJcbiAgICBpZiAoaXNDb2xsaWRlID09IDEpIHtcclxuICAgICAgdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueCA9IHRoaXMucG9zaXRpb25YQmFja3VwO1xyXG4gICAgICB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS55ID0gdGhpcy5wb3NpdGlvbllCYWNrdXA7XHJcbiAgICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLmNvbHMgPSBpdGVtQ29sc2JhY2t1cDtcclxuICAgICAgdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ucm93cyA9IGl0ZW1Sb3dzYmFja3VwO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIHRoaXMuZ3JpZHN0ZXJJdGVtLml0ZW0ucm93cz10aGlzLmdyaWRzdGVySXRlbS4kaXRlbS5yb3dzO1xyXG4gICAgICAvLyB0aGlzLmdyaWRzdGVySXRlbS5pdGVtLmNvbHM9dGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0uY29scztcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbTtcclxuICB9XHJcblxyXG4gIGNhbGN1bGF0ZUl0ZW1Qb3NpdGlvbigpIHtcclxuICAgIHRoaXMuZ3JpZHN0ZXIubW92aW5nSXRlbSA9IHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtO1xyXG4gICAgdGhpcy5wb3NpdGlvblggPSB0aGlzLmdyaWRzdGVyLnBpeGVsc1RvUG9zaXRpb25YKHRoaXMubGVmdCwgTWF0aC5yb3VuZCk7XHJcbiAgICB0aGlzLnBvc2l0aW9uWSA9IHRoaXMuZ3JpZHN0ZXIucGl4ZWxzVG9Qb3NpdGlvblkodGhpcy50b3AsIE1hdGgucm91bmQpO1xyXG5cclxuICAgIHRoaXMucG9zaXRpb25YQmFja3VwID0gdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueDtcclxuICAgIHRoaXMucG9zaXRpb25ZQmFja3VwID0gdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueTtcclxuICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnggPSB0aGlzLnBvc2l0aW9uWDtcclxuXHJcbiAgICBpZiAodGhpcy5ncmlkc3Rlci5jaGVja0dyaWRDb2xsaXNpb24odGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0pKSB7XHJcbiAgICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnggPSB0aGlzLnBvc2l0aW9uWEJhY2t1cDtcclxuICAgIH1cclxuICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnkgPSB0aGlzLnBvc2l0aW9uWTtcclxuICAgIGlmICh0aGlzLmdyaWRzdGVyLmNoZWNrR3JpZENvbGxpc2lvbih0aGlzLmdyaWRzdGVySXRlbS4kaXRlbSkpIHtcclxuICAgICAgdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueSA9IHRoaXMucG9zaXRpb25ZQmFja3VwO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIub3B0aW9ucy5hdXRvUmVzaXplb25EcmFnKSB7XHJcbiAgICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtID0gdGhpcy5jaGVja2ZvcmF2YWlsYWJsZVNwYWNlaW50aGVBcmVhKCk7XHJcbiAgICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLnNldFNpemUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmdyaWRzdGVyLmdyaWRSZW5kZXJlci5zZXRDZWxsUG9zaXRpb24odGhpcy5ncmlkc3Rlckl0ZW0ucmVuZGVyZXIsIHRoaXMuZ3JpZHN0ZXJJdGVtLmVsLCB0aGlzLmxlZnQsIHRoaXMudG9wKTtcclxuXHJcbiAgICBpZiAodGhpcy5wb3NpdGlvblhCYWNrdXAgIT09IHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnggfHwgdGhpcy5wb3NpdGlvbllCYWNrdXAgIT09IHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnkpIHtcclxuICAgICAgY29uc3QgbGFzdFBvc2l0aW9uID0gdGhpcy5wYXRoW3RoaXMucGF0aC5sZW5ndGggLSAxXTtcclxuICAgICAgbGV0IGRpcmVjdGlvbiA9ICcnO1xyXG4gICAgICBpZiAobGFzdFBvc2l0aW9uLnggPCB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS54KSB7XHJcbiAgICAgICAgZGlyZWN0aW9uID0gdGhpcy5wdXNoLmZyb21XZXN0O1xyXG4gICAgICB9IGVsc2UgaWYgKGxhc3RQb3NpdGlvbi54ID4gdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueCkge1xyXG4gICAgICAgIGRpcmVjdGlvbiA9IHRoaXMucHVzaC5mcm9tRWFzdDtcclxuICAgICAgfSBlbHNlIGlmIChsYXN0UG9zaXRpb24ueSA8IHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnkpIHtcclxuICAgICAgICBkaXJlY3Rpb24gPSB0aGlzLnB1c2guZnJvbU5vcnRoO1xyXG4gICAgICB9IGVsc2UgaWYgKGxhc3RQb3NpdGlvbi55ID4gdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueSkge1xyXG4gICAgICAgIGRpcmVjdGlvbiA9IHRoaXMucHVzaC5mcm9tU291dGg7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5wdXNoLnB1c2hJdGVtcyhkaXJlY3Rpb24sIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZGlzYWJsZVB1c2hPbkRyYWcpO1xyXG4gICAgICB0aGlzLnN3YXAuc3dhcEl0ZW1zKCk7XHJcbiAgICAgIHRoaXMuY29sbGlzaW9uID0gdGhpcy5ncmlkc3Rlci5jaGVja0NvbGxpc2lvbih0aGlzLmdyaWRzdGVySXRlbS4kaXRlbSk7XHJcbiAgICAgIGlmICh0aGlzLmNvbGxpc2lvbikge1xyXG4gICAgICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnggPSB0aGlzLnBvc2l0aW9uWEJhY2t1cDtcclxuICAgICAgICB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS55ID0gdGhpcy5wb3NpdGlvbllCYWNrdXA7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZHJhZ2dhYmxlLmRyb3BPdmVySXRlbXMgJiYgdGhpcy5jb2xsaXNpb24gIT09IHRydWUgJiYgdGhpcy5jb2xsaXNpb24uJGl0ZW0pIHtcclxuICAgICAgICAgIHRoaXMuZ3JpZHN0ZXIubW92aW5nSXRlbSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucGF0aC5wdXNoKHsgeDogdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueCwgeTogdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueSB9KTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnB1c2guY2hlY2tQdXNoQmFjaygpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5ncmlkc3Rlci5wcmV2aWV3U3R5bGUodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGUoKSB7XHJcbiAgICBjb25zdCBlbmFibGVEcmFnID0gdGhpcy5ncmlkc3Rlckl0ZW0uY2FuQmVEcmFnZ2VkKCk7XHJcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCAmJiBlbmFibGVEcmFnKSB7XHJcbiAgICAgIHRoaXMuZW5hYmxlZCA9ICF0aGlzLmVuYWJsZWQ7XHJcbiAgICAgIHRoaXMuZHJhZ1N0YXJ0RnVuY3Rpb24gPSB0aGlzLmRyYWdTdGFydERlbGF5LmJpbmQodGhpcyk7XHJcbiAgICAgIHRoaXMubW91c2Vkb3duID0gdGhpcy5ncmlkc3Rlckl0ZW0ucmVuZGVyZXIubGlzdGVuKHRoaXMuZ3JpZHN0ZXJJdGVtLmVsLCAnbW91c2Vkb3duJywgdGhpcy5kcmFnU3RhcnRGdW5jdGlvbik7XHJcbiAgICAgIHRoaXMudG91Y2hzdGFydCA9IHRoaXMuZ3JpZHN0ZXJJdGVtLnJlbmRlcmVyLmxpc3Rlbih0aGlzLmdyaWRzdGVySXRlbS5lbCwgJ3RvdWNoc3RhcnQnLCB0aGlzLmRyYWdTdGFydEZ1bmN0aW9uKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5lbmFibGVkICYmICFlbmFibGVEcmFnKSB7XHJcbiAgICAgIHRoaXMuZW5hYmxlZCA9ICF0aGlzLmVuYWJsZWQ7XHJcbiAgICAgIHRoaXMubW91c2Vkb3duKCk7XHJcbiAgICAgIHRoaXMudG91Y2hzdGFydCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZHJhZ1N0YXJ0RGVsYXkoZTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoZS50YXJnZXQuaGFzQXR0cmlidXRlKCdjbGFzcycpICYmIGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnY2xhc3MnKS5zcGxpdCgnICcpLmluZGV4T2YoJ2dyaWRzdGVyLWl0ZW0tcmVzaXphYmxlLWhhbmRsZXInKSA+IC0xKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChHcmlkc3RlclV0aWxzLmNoZWNrQ29udGVudENsYXNzRm9yRXZlbnQodGhpcy5ncmlkc3RlciwgZSkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgR3JpZHN0ZXJVdGlscy5jaGVja1RvdWNoRXZlbnQoZSk7XHJcbiAgICBpZiAoIXRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZHJhZ2dhYmxlLmRlbGF5U3RhcnQpIHtcclxuICAgICAgdGhpcy5kcmFnU3RhcnQoZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5kcmFnU3RhcnQoZSk7XHJcbiAgICAgIGNhbmNlbERyYWcoKTtcclxuICAgIH0sIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZHJhZ2dhYmxlLmRlbGF5U3RhcnQpO1xyXG4gICAgY29uc3QgY2FuY2VsTW91c2UgPSB0aGlzLmdyaWRzdGVySXRlbS5yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ21vdXNldXAnLCBjYW5jZWxEcmFnKTtcclxuICAgIGNvbnN0IGNhbmNlbE1vdXNlTGVhdmUgPSB0aGlzLmdyaWRzdGVySXRlbS5yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ21vdXNlbGVhdmUnLCBjYW5jZWxEcmFnKTtcclxuICAgIGNvbnN0IGNhbmNlbE9uQmx1ciA9IHRoaXMuZ3JpZHN0ZXJJdGVtLnJlbmRlcmVyLmxpc3Rlbignd2luZG93JywgJ2JsdXInLCBjYW5jZWxEcmFnKTtcclxuICAgIGNvbnN0IGNhbmNlbFRvdWNoTW92ZSA9IHRoaXMuZ3JpZHN0ZXJJdGVtLnJlbmRlcmVyLmxpc3RlbignZG9jdW1lbnQnLCAndG91Y2htb3ZlJywgY2FuY2VsTW92ZSk7XHJcbiAgICBjb25zdCBjYW5jZWxUb3VjaEVuZCA9IHRoaXMuZ3JpZHN0ZXJJdGVtLnJlbmRlcmVyLmxpc3RlbignZG9jdW1lbnQnLCAndG91Y2hlbmQnLCBjYW5jZWxEcmFnKTtcclxuICAgIGNvbnN0IGNhbmNlbFRvdWNoQ2FuY2VsID0gdGhpcy5ncmlkc3Rlckl0ZW0ucmVuZGVyZXIubGlzdGVuKCdkb2N1bWVudCcsICd0b3VjaGNhbmNlbCcsIGNhbmNlbERyYWcpO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNhbmNlbE1vdmUoZXZlbnRNb3ZlOiBhbnkpIHtcclxuICAgICAgR3JpZHN0ZXJVdGlscy5jaGVja1RvdWNoRXZlbnQoZXZlbnRNb3ZlKTtcclxuICAgICAgaWYgKE1hdGguYWJzKGV2ZW50TW92ZS5jbGllbnRYIC0gZS5jbGllbnRYKSA+IDkgfHwgTWF0aC5hYnMoZXZlbnRNb3ZlLmNsaWVudFkgLSBlLmNsaWVudFkpID4gOSkge1xyXG4gICAgICAgIGNhbmNlbERyYWcoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNhbmNlbERyYWcoKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcclxuICAgICAgY2FuY2VsT25CbHVyKCk7XHJcbiAgICAgIGNhbmNlbE1vdXNlKCk7XHJcbiAgICAgIGNhbmNlbE1vdXNlTGVhdmUoKTtcclxuICAgICAgY2FuY2VsVG91Y2hNb3ZlKCk7XHJcbiAgICAgIGNhbmNlbFRvdWNoRW5kKCk7XHJcbiAgICAgIGNhbmNlbFRvdWNoQ2FuY2VsKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
+ */
5
+ import { Injectable, NgZone } from '@angular/core';
6
+ import { GridsterSwap } from './gridsterSwap.service';
7
+ import { cancelScroll, scroll } from './gridsterScroll.service';
8
+ import { GridsterPush } from './gridsterPush.service';
9
+ import { GridsterUtils } from './gridsterUtils.service';
10
+ import { GridsterItemComponentInterface } from './gridsterItemComponent.interface';
11
+ import { GridsterComponentInterface } from './gridster.interface';
12
+ var GridsterDraggable = /** @class */ (function () {
13
+ function GridsterDraggable(gridsterItem, gridster, zone) {
14
+ this.zone = zone;
15
+ this.collision = false;
16
+ this.gridsterItem = gridsterItem;
17
+ this.gridster = gridster;
18
+ this.lastMouse = {
19
+ clientX: 0,
20
+ clientY: 0
21
+ };
22
+ this.path = [];
23
+ }
24
+ /**
25
+ * @return {?}
26
+ */
27
+ GridsterDraggable.prototype.destroy = /**
28
+ * @return {?}
29
+ */
30
+ function () {
31
+ if (this.gridster.previewStyle) {
32
+ this.gridster.previewStyle(true);
33
+ }
34
+ delete this.gridsterItem;
35
+ delete this.gridster;
36
+ delete this.collision;
37
+ if (this.mousedown) {
38
+ this.mousedown();
39
+ this.touchstart();
40
+ }
41
+ };
42
+ /**
43
+ * @param {?} e
44
+ * @return {?}
45
+ */
46
+ GridsterDraggable.prototype.dragStart = /**
47
+ * @param {?} e
48
+ * @return {?}
49
+ */
50
+ function (e) {
51
+ var _this = this;
52
+ switch (e.which) {
53
+ case 1:
54
+ // left mouse button
55
+ break;
56
+ case 2:
57
+ case 3:
58
+ // right or middle mouse button
59
+ return;
60
+ }
61
+ if (this.gridster.options.draggable && this.gridster.options.draggable.start) {
62
+ this.gridster.options.draggable.start(this.gridsterItem.item, this.gridsterItem, e);
63
+ }
64
+ e.stopPropagation();
65
+ e.preventDefault();
66
+ this.dragFunction = this.dragMove.bind(this);
67
+ this.dragStopFunction = this.dragStop.bind(this);
68
+ this.zone.runOutsideAngular((/**
69
+ * @return {?}
70
+ */
71
+ function () {
72
+ _this.mousemove = _this.gridsterItem.renderer.listen('document', 'mousemove', _this.dragFunction);
73
+ _this.touchmove = _this.gridster.renderer.listen(_this.gridster.el, 'touchmove', _this.dragFunction);
74
+ }));
75
+ this.mouseup = this.gridsterItem.renderer.listen('document', 'mouseup', this.dragStopFunction);
76
+ this.mouseleave = this.gridsterItem.renderer.listen('document', 'mouseleave', this.dragStopFunction);
77
+ this.cancelOnBlur = this.gridsterItem.renderer.listen('window', 'blur', this.dragStopFunction);
78
+ this.touchend = this.gridsterItem.renderer.listen('document', 'touchend', this.dragStopFunction);
79
+ this.touchcancel = this.gridsterItem.renderer.listen('document', 'touchcancel', this.dragStopFunction);
80
+ this.gridsterItem.renderer.addClass(this.gridsterItem.el, 'gridster-item-moving');
81
+ this.margin = this.gridster.$options.margin;
82
+ this.offsetLeft = this.gridster.el.scrollLeft - this.gridster.el.offsetLeft;
83
+ this.offsetTop = this.gridster.el.scrollTop - this.gridster.el.offsetTop;
84
+ this.left = this.gridsterItem.left - this.margin;
85
+ this.top = this.gridsterItem.top - this.margin;
86
+ this.width = this.gridsterItem.width;
87
+ this.height = this.gridsterItem.height;
88
+ this.diffLeft = e.clientX + this.offsetLeft - this.margin - this.left;
89
+ this.diffTop = e.clientY + this.offsetTop - this.margin - this.top;
90
+ this.gridster.movingItem = this.gridsterItem.$item;
91
+ this.gridster.previewStyle(true);
92
+ this.push = new GridsterPush(this.gridsterItem);
93
+ this.swap = new GridsterSwap(this.gridsterItem);
94
+ this.gridster.dragInProgress = true;
95
+ this.gridster.updateGrid();
96
+ this.path.push({ x: this.gridsterItem.item.x || 0, y: this.gridsterItem.item.y || 0 });
97
+ };
98
+ /**
99
+ * @param {?} e
100
+ * @return {?}
101
+ */
102
+ GridsterDraggable.prototype.dragMove = /**
103
+ * @param {?} e
104
+ * @return {?}
105
+ */
106
+ function (e) {
107
+ e.stopPropagation();
108
+ e.preventDefault();
109
+ GridsterUtils.checkTouchEvent(e);
110
+ this.offsetLeft = this.gridster.el.scrollLeft - this.gridster.el.offsetLeft;
111
+ this.offsetTop = this.gridster.el.scrollTop - this.gridster.el.offsetTop;
112
+ scroll(this.gridster, this.left, this.top, this.width, this.height, e, this.lastMouse, this.calculateItemPositionFromMousePosition.bind(this));
113
+ this.calculateItemPositionFromMousePosition(e);
114
+ };
115
+ /**
116
+ * @param {?} e
117
+ * @return {?}
118
+ */
119
+ GridsterDraggable.prototype.calculateItemPositionFromMousePosition = /**
120
+ * @param {?} e
121
+ * @return {?}
122
+ */
123
+ function (e) {
124
+ var _this = this;
125
+ this.left = e.clientX + this.offsetLeft - this.diffLeft;
126
+ this.top = e.clientY + this.offsetTop - this.diffTop;
127
+ this.calculateItemPosition();
128
+ this.lastMouse.clientX = e.clientX;
129
+ this.lastMouse.clientY = e.clientY;
130
+ this.zone.run((/**
131
+ * @return {?}
132
+ */
133
+ function () {
134
+ _this.gridster.updateGrid();
135
+ }));
136
+ };
137
+ /**
138
+ * @param {?} e
139
+ * @return {?}
140
+ */
141
+ GridsterDraggable.prototype.dragStop = /**
142
+ * @param {?} e
143
+ * @return {?}
144
+ */
145
+ function (e) {
146
+ var _this = this;
147
+ e.stopPropagation();
148
+ e.preventDefault();
149
+ cancelScroll();
150
+ this.cancelOnBlur();
151
+ this.mousemove();
152
+ this.mouseup();
153
+ this.mouseleave();
154
+ this.touchmove();
155
+ this.touchend();
156
+ this.touchcancel();
157
+ this.gridsterItem.renderer.removeClass(this.gridsterItem.el, 'gridster-item-moving');
158
+ this.gridster.dragInProgress = false;
159
+ this.gridster.updateGrid();
160
+ this.path = [];
161
+ if (this.gridster.options.draggable && this.gridster.options.draggable.stop) {
162
+ Promise.resolve(this.gridster.options.draggable.stop(this.gridsterItem.item, this.gridsterItem, e))
163
+ .then(this.makeDrag.bind(this), this.cancelDrag.bind(this));
164
+ }
165
+ else {
166
+ this.makeDrag();
167
+ }
168
+ setTimeout((/**
169
+ * @return {?}
170
+ */
171
+ function () {
172
+ if (_this.gridster) {
173
+ _this.gridster.movingItem = null;
174
+ _this.gridster.previewStyle(true);
175
+ }
176
+ }));
177
+ };
178
+ /**
179
+ * @return {?}
180
+ */
181
+ GridsterDraggable.prototype.cancelDrag = /**
182
+ * @return {?}
183
+ */
184
+ function () {
185
+ this.gridsterItem.$item.x = this.gridsterItem.item.x || 0;
186
+ this.gridsterItem.$item.y = this.gridsterItem.item.y || 0;
187
+ this.gridsterItem.setSize();
188
+ if (this.push) {
189
+ this.push.restoreItems();
190
+ }
191
+ if (this.swap) {
192
+ this.swap.restoreSwapItem();
193
+ }
194
+ if (this.push) {
195
+ this.push.destroy();
196
+ delete this.push;
197
+ }
198
+ if (this.swap) {
199
+ this.swap.destroy();
200
+ delete this.swap;
201
+ }
202
+ };
203
+ /**
204
+ * @return {?}
205
+ */
206
+ GridsterDraggable.prototype.makeDrag = /**
207
+ * @return {?}
208
+ */
209
+ function () {
210
+ if (this.gridster.$options.draggable.dropOverItems && this.gridster.options.draggable
211
+ && this.gridster.options.draggable.dropOverItemsCallback
212
+ && this.collision && this.collision !== true && this.collision.$item) {
213
+ this.gridster.options.draggable.dropOverItemsCallback(this.gridsterItem.item, this.collision.item, this.gridster);
214
+ }
215
+ this.collision = false;
216
+ this.gridsterItem.setSize();
217
+ this.gridsterItem.checkItemChanges(this.gridsterItem.$item, this.gridsterItem.item);
218
+ if (this.push) {
219
+ this.push.setPushedItems();
220
+ }
221
+ if (this.swap) {
222
+ this.swap.setSwapItem();
223
+ }
224
+ if (this.push) {
225
+ this.push.destroy();
226
+ delete this.push;
227
+ }
228
+ if (this.swap) {
229
+ this.swap.destroy();
230
+ delete this.swap;
231
+ }
232
+ };
233
+ /**
234
+ * @return {?}
235
+ */
236
+ GridsterDraggable.prototype.checkforavailableSpaceintheArea = /**
237
+ * @return {?}
238
+ */
239
+ function () {
240
+ /** @type {?} */
241
+ var itemRowsbackup = this.gridsterItem.$item.rows;
242
+ /** @type {?} */
243
+ var itemColsbackup = this.gridsterItem.$item.cols;
244
+ this.gridsterItem.$item.x = this.positionX;
245
+ this.gridsterItem.$item.y = this.positionY;
246
+ /**
247
+ * isCollide = 2 - no collision
248
+ * @type {?}
249
+ */
250
+ var isCollide = 1;
251
+ /** To iterate over the width of the gridster iTem and to check for collision */
252
+ do {
253
+ this.gridsterItem.$item.rows = itemRowsbackup;
254
+ /** To iterate over the height of the gridster Item and check for collision */
255
+ for (var rowcount = this.gridsterItem.$item.rows; rowcount >= 15; rowcount--) {
256
+ if (!this.gridster.checkCollision(this.gridsterItem.$item)) {
257
+ isCollide = 2;
258
+ break;
259
+ }
260
+ else { /** has collision - check with x-1 position and*/
261
+ /**
262
+ * has collision - check with x-1 position and
263
+ * @type {?}
264
+ */
265
+ var rowbkup = this.gridsterItem.$item.x;
266
+ /** @type {?} */
267
+ var lastPossiblePositionX = this.gridsterItem.$item.x;
268
+ do {
269
+ this.gridsterItem.$item.x = this.gridsterItem.$item.x - 1;
270
+ if (!this.gridster.checkCollision(this.gridsterItem.$item)) {
271
+ lastPossiblePositionX = this.gridsterItem.$item.x;
272
+ }
273
+ else {
274
+ this.gridsterItem.$item.x = lastPossiblePositionX;
275
+ /** @type {?} */
276
+ var originalCols = this.gridsterItem.$item.cols;
277
+ /** @type {?} */
278
+ var lastPossibleCols = this.gridsterItem.$item.cols;
279
+ do {
280
+ this.gridsterItem.$item.cols = this.gridsterItem.$item.cols + 1;
281
+ if (this.gridster.checkCollision(this.gridsterItem.$item)) {
282
+ this.gridsterItem.$item.cols = lastPossibleCols;
283
+ break;
284
+ }
285
+ else {
286
+ lastPossibleCols = this.gridsterItem.$item.cols;
287
+ }
288
+ } while (this.gridsterItem.$item.cols - originalCols < 15);
289
+ break;
290
+ }
291
+ } while (this.gridsterItem.$item.x > 0);
292
+ if (this.gridster.checkCollision(this.gridsterItem.$item)) {
293
+ this.gridsterItem.$item.rows = this.gridsterItem.$item.rows - 1;
294
+ this.gridsterItem.$item.x = rowbkup;
295
+ }
296
+ else {
297
+ isCollide = 2;
298
+ break;
299
+ }
300
+ }
301
+ }
302
+ if (isCollide == 2) {
303
+ break;
304
+ }
305
+ this.gridsterItem.$item.cols = this.gridsterItem.$item.cols - 1;
306
+ } while (this.gridsterItem.$item.cols >= 15);
307
+ // while (this.gridsterItem.$item.rows>=15 || this.gridsterItem.$item.cols>=15);
308
+ if (isCollide == 1) {
309
+ this.gridsterItem.$item.x = this.positionXBackup;
310
+ this.gridsterItem.$item.y = this.positionYBackup;
311
+ this.gridsterItem.$item.cols = itemColsbackup;
312
+ this.gridsterItem.$item.rows = itemRowsbackup;
313
+ }
314
+ else {
315
+ // this.gridsterItem.item.rows=this.gridsterItem.$item.rows;
316
+ // this.gridsterItem.item.cols=this.gridsterItem.$item.cols;
317
+ }
318
+ return this.gridsterItem.$item;
319
+ };
320
+ /**
321
+ * @return {?}
322
+ */
323
+ GridsterDraggable.prototype.calculateItemPosition = /**
324
+ * @return {?}
325
+ */
326
+ function () {
327
+ this.gridster.movingItem = this.gridsterItem.$item;
328
+ this.positionX = this.gridster.pixelsToPositionX(this.left, Math.round);
329
+ this.positionY = this.gridster.pixelsToPositionY(this.top, Math.round);
330
+ this.positionXBackup = this.gridsterItem.$item.x;
331
+ this.positionYBackup = this.gridsterItem.$item.y;
332
+ this.gridsterItem.$item.x = this.positionX;
333
+ if (this.gridster.checkGridCollision(this.gridsterItem.$item)) {
334
+ this.gridsterItem.$item.x = this.positionXBackup;
335
+ }
336
+ this.gridsterItem.$item.y = this.positionY;
337
+ if (this.gridster.checkGridCollision(this.gridsterItem.$item)) {
338
+ this.gridsterItem.$item.y = this.positionYBackup;
339
+ }
340
+ if (this.gridster.options.autoResizeonDrag) {
341
+ this.gridsterItem.$item = this.checkforavailableSpaceintheArea();
342
+ this.gridsterItem.setSize();
343
+ }
344
+ this.gridster.gridRenderer.setCellPosition(this.gridsterItem.renderer, this.gridsterItem.el, this.left, this.top);
345
+ if (this.positionXBackup !== this.gridsterItem.$item.x || this.positionYBackup !== this.gridsterItem.$item.y) {
346
+ /** @type {?} */
347
+ var lastPosition = this.path[this.path.length - 1];
348
+ /** @type {?} */
349
+ var direction = '';
350
+ if (lastPosition.x < this.gridsterItem.$item.x) {
351
+ direction = this.push.fromWest;
352
+ }
353
+ else if (lastPosition.x > this.gridsterItem.$item.x) {
354
+ direction = this.push.fromEast;
355
+ }
356
+ else if (lastPosition.y < this.gridsterItem.$item.y) {
357
+ direction = this.push.fromNorth;
358
+ }
359
+ else if (lastPosition.y > this.gridsterItem.$item.y) {
360
+ direction = this.push.fromSouth;
361
+ }
362
+ this.push.pushItems(direction, this.gridster.$options.disablePushOnDrag);
363
+ this.swap.swapItems();
364
+ this.collision = this.gridster.checkCollision(this.gridsterItem.$item);
365
+ if (this.collision) {
366
+ this.gridsterItem.$item.x = this.positionXBackup;
367
+ this.gridsterItem.$item.y = this.positionYBackup;
368
+ if (this.gridster.$options.draggable.dropOverItems && this.collision !== true && this.collision.$item) {
369
+ this.gridster.movingItem = null;
370
+ }
371
+ }
372
+ else {
373
+ this.path.push({ x: this.gridsterItem.$item.x, y: this.gridsterItem.$item.y });
374
+ }
375
+ this.push.checkPushBack();
376
+ }
377
+ this.gridster.previewStyle(true);
378
+ };
379
+ /**
380
+ * @return {?}
381
+ */
382
+ GridsterDraggable.prototype.toggle = /**
383
+ * @return {?}
384
+ */
385
+ function () {
386
+ /** @type {?} */
387
+ var enableDrag = this.gridsterItem.canBeDragged();
388
+ if (!this.enabled && enableDrag) {
389
+ this.enabled = !this.enabled;
390
+ this.dragStartFunction = this.dragStartDelay.bind(this);
391
+ this.mousedown = this.gridsterItem.renderer.listen(this.gridsterItem.el, 'mousedown', this.dragStartFunction);
392
+ this.touchstart = this.gridsterItem.renderer.listen(this.gridsterItem.el, 'touchstart', this.dragStartFunction);
393
+ }
394
+ else if (this.enabled && !enableDrag) {
395
+ this.enabled = !this.enabled;
396
+ this.mousedown();
397
+ this.touchstart();
398
+ }
399
+ };
400
+ /**
401
+ * @param {?} e
402
+ * @return {?}
403
+ */
404
+ GridsterDraggable.prototype.dragStartDelay = /**
405
+ * @param {?} e
406
+ * @return {?}
407
+ */
408
+ function (e) {
409
+ var _this = this;
410
+ if (e.target.hasAttribute('class') && e.target.getAttribute('class').split(' ').indexOf('gridster-item-resizable-handler') > -1) {
411
+ return;
412
+ }
413
+ if (GridsterUtils.checkContentClassForEvent(this.gridster, e)) {
414
+ return;
415
+ }
416
+ GridsterUtils.checkTouchEvent(e);
417
+ if (!this.gridster.$options.draggable.delayStart) {
418
+ this.dragStart(e);
419
+ return;
420
+ }
421
+ /** @type {?} */
422
+ var timeout = setTimeout((/**
423
+ * @return {?}
424
+ */
425
+ function () {
426
+ _this.dragStart(e);
427
+ cancelDrag();
428
+ }), this.gridster.$options.draggable.delayStart);
429
+ /** @type {?} */
430
+ var cancelMouse = this.gridsterItem.renderer.listen('document', 'mouseup', cancelDrag);
431
+ /** @type {?} */
432
+ var cancelMouseLeave = this.gridsterItem.renderer.listen('document', 'mouseleave', cancelDrag);
433
+ /** @type {?} */
434
+ var cancelOnBlur = this.gridsterItem.renderer.listen('window', 'blur', cancelDrag);
435
+ /** @type {?} */
436
+ var cancelTouchMove = this.gridsterItem.renderer.listen('document', 'touchmove', cancelMove);
437
+ /** @type {?} */
438
+ var cancelTouchEnd = this.gridsterItem.renderer.listen('document', 'touchend', cancelDrag);
439
+ /** @type {?} */
440
+ var cancelTouchCancel = this.gridsterItem.renderer.listen('document', 'touchcancel', cancelDrag);
441
+ /**
442
+ * @param {?} eventMove
443
+ * @return {?}
444
+ */
445
+ function cancelMove(eventMove) {
446
+ GridsterUtils.checkTouchEvent(eventMove);
447
+ if (Math.abs(eventMove.clientX - e.clientX) > 9 || Math.abs(eventMove.clientY - e.clientY) > 9) {
448
+ cancelDrag();
449
+ }
450
+ }
451
+ /**
452
+ * @return {?}
453
+ */
454
+ function cancelDrag() {
455
+ clearTimeout(timeout);
456
+ cancelOnBlur();
457
+ cancelMouse();
458
+ cancelMouseLeave();
459
+ cancelTouchMove();
460
+ cancelTouchEnd();
461
+ cancelTouchCancel();
462
+ }
463
+ };
464
+ GridsterDraggable.decorators = [
465
+ { type: Injectable }
466
+ ];
467
+ /** @nocollapse */
468
+ GridsterDraggable.ctorParameters = function () { return [
469
+ { type: GridsterItemComponentInterface },
470
+ { type: GridsterComponentInterface },
471
+ { type: NgZone }
472
+ ]; };
473
+ return GridsterDraggable;
474
+ }());
475
+ export { GridsterDraggable };
476
+ if (false) {
477
+ /** @type {?} */
478
+ GridsterDraggable.prototype.gridsterItem;
479
+ /** @type {?} */
480
+ GridsterDraggable.prototype.gridster;
481
+ /** @type {?} */
482
+ GridsterDraggable.prototype.lastMouse;
483
+ /** @type {?} */
484
+ GridsterDraggable.prototype.offsetLeft;
485
+ /** @type {?} */
486
+ GridsterDraggable.prototype.offsetTop;
487
+ /** @type {?} */
488
+ GridsterDraggable.prototype.margin;
489
+ /** @type {?} */
490
+ GridsterDraggable.prototype.diffTop;
491
+ /** @type {?} */
492
+ GridsterDraggable.prototype.diffLeft;
493
+ /** @type {?} */
494
+ GridsterDraggable.prototype.top;
495
+ /** @type {?} */
496
+ GridsterDraggable.prototype.left;
497
+ /** @type {?} */
498
+ GridsterDraggable.prototype.height;
499
+ /** @type {?} */
500
+ GridsterDraggable.prototype.width;
501
+ /** @type {?} */
502
+ GridsterDraggable.prototype.positionX;
503
+ /** @type {?} */
504
+ GridsterDraggable.prototype.positionY;
505
+ /** @type {?} */
506
+ GridsterDraggable.prototype.positionXBackup;
507
+ /** @type {?} */
508
+ GridsterDraggable.prototype.positionYBackup;
509
+ /** @type {?} */
510
+ GridsterDraggable.prototype.enabled;
511
+ /** @type {?} */
512
+ GridsterDraggable.prototype.dragStartFunction;
513
+ /** @type {?} */
514
+ GridsterDraggable.prototype.dragFunction;
515
+ /** @type {?} */
516
+ GridsterDraggable.prototype.dragStopFunction;
517
+ /** @type {?} */
518
+ GridsterDraggable.prototype.mousemove;
519
+ /** @type {?} */
520
+ GridsterDraggable.prototype.mouseup;
521
+ /** @type {?} */
522
+ GridsterDraggable.prototype.mouseleave;
523
+ /** @type {?} */
524
+ GridsterDraggable.prototype.cancelOnBlur;
525
+ /** @type {?} */
526
+ GridsterDraggable.prototype.touchmove;
527
+ /** @type {?} */
528
+ GridsterDraggable.prototype.touchend;
529
+ /** @type {?} */
530
+ GridsterDraggable.prototype.touchcancel;
531
+ /** @type {?} */
532
+ GridsterDraggable.prototype.mousedown;
533
+ /** @type {?} */
534
+ GridsterDraggable.prototype.touchstart;
535
+ /** @type {?} */
536
+ GridsterDraggable.prototype.push;
537
+ /** @type {?} */
538
+ GridsterDraggable.prototype.swap;
539
+ /** @type {?} */
540
+ GridsterDraggable.prototype.path;
541
+ /** @type {?} */
542
+ GridsterDraggable.prototype.collision;
543
+ /**
544
+ * @type {?}
545
+ * @private
546
+ */
547
+ GridsterDraggable.prototype.zone;
548
+ }
549
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXJEcmFnZ2FibGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzY2huZWlkZXJlc3MvZGFzaGJvYXJkZnJhbWV3b3JrLyIsInNvdXJjZXMiOlsiZ3JpZHN0ZXIvbGliL2dyaWRzdGVyRHJhZ2dhYmxlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbEU7SUF1Q0UsMkJBQVksWUFBNEMsRUFBRSxRQUFvQyxFQUFVLElBQVk7UUFBWixTQUFJLEdBQUosSUFBSSxDQUFRO1FBRnBILGNBQVMsR0FBNkMsS0FBSyxDQUFDO1FBRzFELElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUc7WUFDZixPQUFPLEVBQUUsQ0FBQztZQUNWLE9BQU8sRUFBRSxDQUFDO1NBQ1gsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLENBQUM7Ozs7SUFFRCxtQ0FBTzs7O0lBQVA7UUFDRSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFO1lBQzlCLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElB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SUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDNUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDO1FBQzVFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQztRQUN6RSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDakQsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQy9DLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDckMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztRQUN2QyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDdEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ25FLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO1FBQ25ELElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxZQUFZ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aUJBQWlCLEVBQUUsQ0FBQztRQUN0QixDQUFDO0lBQ0gsQ0FBQzs7Z0JBMVlGLFVBQVU7Ozs7Z0JBSEYsOEJBQThCO2dCQUM5QiwwQkFBMEI7Z0JBUGQsTUFBTTs7SUFvWjNCLHdCQUFDO0NBQUEsQUEzWUQsSUEyWUM7U0ExWVksaUJBQWlCOzs7SUFDNUIseUNBQTZDOztJQUM3QyxxQ0FBcUM7O0lBQ3JDLHNDQUdFOztJQUNGLHVDQUFtQjs7SUFDbkIsc0NBQWtCOztJQUNsQixtQ0FBZTs7SUFDZixvQ0FBZ0I7O0lBQ2hCLHFDQUFpQjs7SUFDakIsZ0NBQVk7O0lBQ1osaUNBQWE7O0lBQ2IsbUNBQWU7O0lBQ2Ysa0NBQWM7O0lBQ2Qsc0NBQWtCOztJQUNsQixzQ0FBa0I7O0lBQ2xCLDRDQUF3Qjs7SUFDeEIsNENBQXdCOztJQUN4QixvQ0FBaUI7O0lBQ2pCLDhDQUF3Qzs7SUFDeEMseUNBQW1DOztJQUNuQyw2Q0FBdUM7O0lBQ3ZDLHNDQUFvQjs7SUFDcEIsb0NBQWtCOztJQUNsQix1Q0FBcUI7O0lBQ3JCLHlDQUF1Qjs7SUFDdkIsc0NBQW9COztJQUNwQixxQ0FBbUI7O0lBQ25CLHdDQUFzQjs7SUFDdEIsc0NBQW9COztJQUNwQix1Q0FBcUI7O0lBQ3JCLGlDQUFtQjs7SUFDbkIsaUNBQW1COztJQUNuQixpQ0FBc0M7O0lBQ3RDLHNDQUE0RDs7Ozs7SUFFb0MsaUNBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEdyaWRzdGVyU3dhcCB9IGZyb20gJy4vZ3JpZHN0ZXJTd2FwLnNlcnZpY2UnO1xuaW1wb3J0IHsgY2FuY2VsU2Nyb2xsLCBzY3JvbGwgfSBmcm9tICcuL2dyaWRzdGVyU2Nyb2xsLnNlcnZpY2UnO1xuaW1wb3J0IHsgR3JpZHN0ZXJQdXNoIH0gZnJvbSAnLi9ncmlkc3RlclB1c2guc2VydmljZSc7XG5pbXBvcnQgeyBHcmlkc3RlclV0aWxzIH0gZnJvbSAnLi9ncmlkc3RlclV0aWxzLnNlcnZpY2UnO1xuaW1wb3J0IHsgR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlIH0gZnJvbSAnLi9ncmlkc3Rlckl0ZW1Db21wb25lbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IEdyaWRzdGVyQ29tcG9uZW50SW50ZXJmYWNlIH0gZnJvbSAnLi9ncmlkc3Rlci5pbnRlcmZhY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgR3JpZHN0ZXJEcmFnZ2FibGUge1xuICBncmlkc3Rlckl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZTtcbiAgZ3JpZHN0ZXI6IEdyaWRzdGVyQ29tcG9uZW50SW50ZXJmYWNlO1xuICBsYXN0TW91c2U6IHtcbiAgICBjbGllbnRYOiBudW1iZXIsXG4gICAgY2xpZW50WTogbnVtYmVyXG4gIH07XG4gIG9mZnNldExlZnQ6IG51bWJlcjtcbiAgb2Zmc2V0VG9wOiBudW1iZXI7XG4gIG1hcmdpbjogbnVtYmVyO1xuICBkaWZmVG9wOiBudW1iZXI7XG4gIGRpZmZMZWZ0OiBudW1iZXI7XG4gIHRvcDogbnVtYmVyO1xuICBsZWZ0OiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICBwb3NpdGlvblg6IG51bWJlcjtcbiAgcG9zaXRpb25ZOiBudW1iZXI7XG4gIHBvc2l0aW9uWEJhY2t1cDogbnVtYmVyO1xuICBwb3NpdGlvbllCYWNrdXA6IG51bWJlcjtcbiAgZW5hYmxlZDogYm9vbGVhbjtcbiAgZHJhZ1N0YXJ0RnVuY3Rpb246IChldmVudDogYW55KSA9PiB2b2lkO1xuICBkcmFnRnVuY3Rpb246IChldmVudDogYW55KSA9PiB2b2lkO1xuICBkcmFnU3RvcEZ1bmN0aW9uOiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgbW91c2Vtb3ZlOiBGdW5jdGlvbjtcbiAgbW91c2V1cDogRnVuY3Rpb247XG4gIG1vdXNlbGVhdmU6IEZ1bmN0aW9uO1xuICBjYW5jZWxPbkJsdXI6IEZ1bmN0aW9uO1xuICB0b3VjaG1vdmU6IEZ1bmN0aW9uO1xuICB0b3VjaGVuZDogRnVuY3Rpb247XG4gIHRvdWNoY2FuY2VsOiBGdW5jdGlvbjtcbiAgbW91c2Vkb3duOiBGdW5jdGlvbjtcbiAgdG91Y2hzdGFydDogRnVuY3Rpb247XG4gIHB1c2g6IEdyaWRzdGVyUHVzaDtcbiAgc3dhcDogR3JpZHN0ZXJTd2FwO1xuICBwYXRoOiBBcnJheTx7IHg6IG51bWJlciwgeTogbnVtYmVyIH0+O1xuICBjb2xsaXNpb246IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSB8IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihncmlkc3Rlckl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSwgZ3JpZHN0ZXI6IEdyaWRzdGVyQ29tcG9uZW50SW50ZXJmYWNlLCBwcml2YXRlIHpvbmU6IE5nWm9uZSkge1xuICAgIHRoaXMuZ3JpZHN0ZXJJdGVtID0gZ3JpZHN0ZXJJdGVtO1xuICAgIHRoaXMuZ3JpZHN0ZXIgPSBncmlkc3RlcjtcbiAgICB0aGlzLmxhc3RNb3VzZSA9IHtcbiAgICAgIGNsaWVudFg6IDAsXG4gICAgICBjbGllbnRZOiAwXG4gICAgfTtcbiAgICB0aGlzLnBhdGggPSBbXTtcbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIucHJldmlld1N0eWxlKSB7XG4gICAgICB0aGlzLmdyaWRzdGVyLnByZXZpZXdTdHlsZSh0cnVlKTtcbiAgICB9XG4gICAgZGVsZXRlIHRoaXMuZ3JpZHN0ZXJJdGVtO1xuICAgIGRlbGV0ZSB0aGlzLmdyaWRzdGVyO1xuICAgIGRlbGV0ZSB0aGlzLmNvbGxpc2lvbjtcbiAgICBpZiAodGhpcy5tb3VzZWRvd24pIHtcbiAgICAgIHRoaXMubW91c2Vkb3duKCk7XG4gICAgICB0aGlzLnRvdWNoc3RhcnQoKTtcbiAgICB9XG4gIH1cblxuICBkcmFnU3RhcnQoZTogYW55KTogdm9pZCB7XG4gICAgc3dpdGNoIChlLndoaWNoKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIC8vIGxlZnQgbW91c2UgYnV0dG9uXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgY2FzZSAzOlxuICAgICAgICAvLyByaWdodCBvciBtaWRkbGUgbW91c2UgYnV0dG9uXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5ncmlkc3Rlci5vcHRpb25zLmRyYWdnYWJsZSAmJiB0aGlzLmdyaWRzdGVyLm9wdGlvbnMuZHJhZ2dhYmxlLnN0YXJ0KSB7XG4gICAgICB0aGlzLmdyaWRzdGVyLm9wdGlvbnMuZHJhZ2dhYmxlLnN0YXJ0KHRoaXMuZ3JpZHN0ZXJJdGVtLml0ZW0sIHRoaXMuZ3JpZHN0ZXJJdGVtLCBlKTtcbiAgICB9XG5cbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmRyYWdGdW5jdGlvbiA9IHRoaXMuZHJhZ01vdmUuYmluZCh0aGlzKTtcbiAgICB0aGlzLmRyYWdTdG9wRnVuY3Rpb24gPSB0aGlzLmRyYWdTdG9wLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5tb3VzZW1vdmUgPSB0aGlzLmdyaWRzdGVySXRlbS5yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ21vdXNlbW92ZScsIHRoaXMuZHJhZ0Z1bmN0aW9uKTtcbiAgICAgIHRoaXMudG91Y2htb3ZlID0gdGhpcy5ncmlkc3Rlci5yZW5kZXJlci5saXN0ZW4odGhpcy5ncmlkc3Rlci5lbCwgJ3RvdWNobW92ZScsIHRoaXMuZHJhZ0Z1bmN0aW9uKTtcbiAgICB9KTtcbiAgICB0aGlzLm1vdXNldXAgPSB0aGlzLmdyaWRzdGVySXRlbS5yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ21vdXNldXAnLCB0aGlzLmRyYWdTdG9wRnVuY3Rpb24pO1xuICAgIHRoaXMubW91c2VsZWF2ZSA9IHRoaXMuZ3JpZHN0ZXJJdGVtLnJlbmRlcmVyLmxpc3RlbignZG9jdW1lbnQnLCAnbW91c2VsZWF2ZScsIHRoaXMuZHJhZ1N0b3BGdW5jdGlvbik7XG4gICAgdGhpcy5jYW5jZWxPbkJsdXIgPSB0aGlzLmdyaWRzdGVySXRlbS5yZW5kZXJlci5saXN0ZW4oJ3dpbmRvdycsICdibHVyJywgdGhpcy5kcmFnU3RvcEZ1bmN0aW9uKTtcbiAgICB0aGlzLnRvdWNoZW5kID0gdGhpcy5ncmlkc3Rlckl0ZW0ucmVuZGVyZXIubGlzdGVuKCdkb2N1bWVudCcsICd0b3VjaGVuZCcsIHRoaXMuZHJhZ1N0b3BGdW5jdGlvbik7XG4gICAgdGhpcy50b3VjaGNhbmNlbCA9IHRoaXMuZ3JpZHN0ZXJJdGVtLnJlbmRlcmVyLmxpc3RlbignZG9jdW1lbnQnLCAndG91Y2hjYW5jZWwnLCB0aGlzLmRyYWdTdG9wRnVuY3Rpb24pO1xuICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZ3JpZHN0ZXJJdGVtLmVsLCAnZ3JpZHN0ZXItaXRlbS1tb3ZpbmcnKTtcbiAgICB0aGlzLm1hcmdpbiA9IHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMubWFyZ2luO1xuICAgIHRoaXMub2Zmc2V0TGVmdCA9IHRoaXMuZ3JpZHN0ZXIuZWwuc2Nyb2xsTGVmdCAtIHRoaXMuZ3JpZHN0ZXIuZWwub2Zmc2V0TGVmdDtcbiAgICB0aGlzLm9mZnNldFRvcCA9IHRoaXMuZ3JpZHN0ZXIuZWwuc2Nyb2xsVG9wIC0gdGhpcy5ncmlkc3Rlci5lbC5vZmZzZXRUb3A7XG4gICAgdGhpcy5sZWZ0ID0gdGhpcy5ncmlkc3Rlckl0ZW0ubGVmdCAtIHRoaXMubWFyZ2luO1xuICAgIHRoaXMudG9wID0gdGhpcy5ncmlkc3Rlckl0ZW0udG9wIC0gdGhpcy5tYXJnaW47XG4gICAgdGhpcy53aWR0aCA9IHRoaXMuZ3JpZHN0ZXJJdGVtLndpZHRoO1xuICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5ncmlkc3Rlckl0ZW0uaGVpZ2h0O1xuICAgIHRoaXMuZGlmZkxlZnQgPSBlLmNsaWVudFggKyB0aGlzLm9mZnNldExlZnQgLSB0aGlzLm1hcmdpbiAtIHRoaXMubGVmdDtcbiAgICB0aGlzLmRpZmZUb3AgPSBlLmNsaWVudFkgKyB0aGlzLm9mZnNldFRvcCAtIHRoaXMubWFyZ2luIC0gdGhpcy50b3A7XG4gICAgdGhpcy5ncmlkc3Rlci5tb3ZpbmdJdGVtID0gdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW07XG4gICAgdGhpcy5ncmlkc3Rlci5wcmV2aWV3U3R5bGUodHJ1ZSk7XG4gICAgdGhpcy5wdXNoID0gbmV3IEdyaWRzdGVyUHVzaCh0aGlzLmdyaWRzdGVySXRlbSk7XG4gICAgdGhpcy5zd2FwID0gbmV3IEdyaWRzdGVyU3dhcCh0aGlzLmdyaWRzdGVySXRlbSk7XG4gICAgdGhpcy5ncmlkc3Rlci5kcmFnSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgdGhpcy5ncmlkc3Rlci51cGRhdGVHcmlkKCk7XG4gICAgdGhpcy5wYXRoLnB1c2goeyB4OiB0aGlzLmdyaWRzdGVySXRlbS5pdGVtLnggfHwgMCwgeTogdGhpcy5ncmlkc3Rlckl0ZW0uaXRlbS55IHx8IDAgfSk7XG4gIH1cblxuICBkcmFnTW92ZShlOiBhbnkpOiB2b2lkIHtcblxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIEdyaWRzdGVyVXRpbHMuY2hlY2tUb3VjaEV2ZW50KGUpO1xuICAgIHRoaXMub2Zmc2V0TGVmdCA9IHRoaXMuZ3JpZHN0ZXIuZWwuc2Nyb2xsTGVmdCAtIHRoaXMuZ3JpZHN0ZXIuZWwub2Zmc2V0TGVmdDtcbiAgICB0aGlzLm9mZnNldFRvcCA9IHRoaXMuZ3JpZHN0ZXIuZWwuc2Nyb2xsVG9wIC0gdGhpcy5ncmlkc3Rlci5lbC5vZmZzZXRUb3A7XG4gICAgc2Nyb2xsKHRoaXMuZ3JpZHN0ZXIsIHRoaXMubGVmdCwgdGhpcy50b3AsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCBlLCB0aGlzLmxhc3RNb3VzZSxcbiAgICAgIHRoaXMuY2FsY3VsYXRlSXRlbVBvc2l0aW9uRnJvbU1vdXNlUG9zaXRpb24uYmluZCh0aGlzKSk7XG5cbiAgICB0aGlzLmNhbGN1bGF0ZUl0ZW1Qb3NpdGlvbkZyb21Nb3VzZVBvc2l0aW9uKGUpO1xuICB9XG5cbiAgY2FsY3VsYXRlSXRlbVBvc2l0aW9uRnJvbU1vdXNlUG9zaXRpb24oZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5sZWZ0ID0gZS5jbGllbnRYICsgdGhpcy5vZmZzZXRMZWZ0IC0gdGhpcy5kaWZmTGVmdDtcbiAgICB0aGlzLnRvcCA9IGUuY2xpZW50WSArIHRoaXMub2Zmc2V0VG9wIC0gdGhpcy5kaWZmVG9wO1xuICAgIHRoaXMuY2FsY3VsYXRlSXRlbVBvc2l0aW9uKCk7XG4gICAgdGhpcy5sYXN0TW91c2UuY2xpZW50WCA9IGUuY2xpZW50WDtcbiAgICB0aGlzLmxhc3RNb3VzZS5jbGllbnRZID0gZS5jbGllbnRZO1xuICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5ncmlkc3Rlci51cGRhdGVHcmlkKCk7XG4gICAgfSk7XG4gIH1cblxuICBkcmFnU3RvcChlOiBhbnkpOiB2b2lkIHtcblxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY2FuY2VsU2Nyb2xsKCk7XG4gICAgdGhpcy5jYW5jZWxPbkJsdXIoKTtcbiAgICB0aGlzLm1vdXNlbW92ZSgpO1xuICAgIHRoaXMubW91c2V1cCgpO1xuICAgIHRoaXMubW91c2VsZWF2ZSgpO1xuICAgIHRoaXMudG91Y2htb3ZlKCk7XG4gICAgdGhpcy50b3VjaGVuZCgpO1xuICAgIHRoaXMudG91Y2hjYW5jZWwoKTtcbiAgICB0aGlzLmdyaWRzdGVySXRlbS5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmdyaWRzdGVySXRlbS5lbCwgJ2dyaWRzdGVyLWl0ZW0tbW92aW5nJyk7XG4gICAgdGhpcy5ncmlkc3Rlci5kcmFnSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIHRoaXMuZ3JpZHN0ZXIudXBkYXRlR3JpZCgpO1xuICAgIHRoaXMucGF0aCA9IFtdO1xuICAgIGlmICh0aGlzLmdyaWRzdGVyLm9wdGlvbnMuZHJhZ2dhYmxlICYmIHRoaXMuZ3JpZHN0ZXIub3B0aW9ucy5kcmFnZ2FibGUuc3RvcCkge1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKHRoaXMuZ3JpZHN0ZXIub3B0aW9ucy5kcmFnZ2FibGUuc3RvcCh0aGlzLmdyaWRzdGVySXRlbS5pdGVtLCB0aGlzLmdyaWRzdGVySXRlbSwgZSkpXG4gICAgICAgIC50aGVuKHRoaXMubWFrZURyYWcuYmluZCh0aGlzKSwgdGhpcy5jYW5jZWxEcmFnLmJpbmQodGhpcykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1ha2VEcmFnKCk7XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZ3JpZHN0ZXIpIHtcbiAgICAgICAgdGhpcy5ncmlkc3Rlci5tb3ZpbmdJdGVtID0gbnVsbDtcbiAgICAgICAgdGhpcy5ncmlkc3Rlci5wcmV2aWV3U3R5bGUodHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjYW5jZWxEcmFnKCkge1xuICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnggPSB0aGlzLmdyaWRzdGVySXRlbS5pdGVtLnggfHwgMDtcbiAgICB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS55ID0gdGhpcy5ncmlkc3Rlckl0ZW0uaXRlbS55IHx8IDA7XG4gICAgdGhpcy5ncmlkc3Rlckl0ZW0uc2V0U2l6ZSgpO1xuICAgIGlmICh0aGlzLnB1c2gpIHtcbiAgICAgIHRoaXMucHVzaC5yZXN0b3JlSXRlbXMoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3dhcCkge1xuICAgICAgdGhpcy5zd2FwLnJlc3RvcmVTd2FwSXRlbSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wdXNoKSB7XG4gICAgICB0aGlzLnB1c2guZGVzdHJveSgpO1xuICAgICAgZGVsZXRlIHRoaXMucHVzaDtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3dhcCkge1xuICAgICAgdGhpcy5zd2FwLmRlc3Ryb3koKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnN3YXA7XG4gICAgfVxuICB9XG5cbiAgbWFrZURyYWcoKSB7XG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZHJhZ2dhYmxlLmRyb3BPdmVySXRlbXMgJiYgdGhpcy5ncmlkc3Rlci5vcHRpb25zLmRyYWdnYWJsZVxuICAgICAgJiYgdGhpcy5ncmlkc3Rlci5vcHRpb25zLmRyYWdnYWJsZS5kcm9wT3Zlckl0ZW1zQ2FsbGJhY2tcbiAgICAgICYmIHRoaXMuY29sbGlzaW9uICYmIHRoaXMuY29sbGlzaW9uICE9PSB0cnVlICYmIHRoaXMuY29sbGlzaW9uLiRpdGVtKSB7XG4gICAgICB0aGlzLmdyaWRzdGVyLm9wdGlvbnMuZHJhZ2dhYmxlLmRyb3BPdmVySXRlbXNDYWxsYmFjayh0aGlzLmdyaWRzdGVySXRlbS5pdGVtLCB0aGlzLmNvbGxpc2lvbi5pdGVtLCB0aGlzLmdyaWRzdGVyKTtcbiAgICB9XG4gICAgdGhpcy5jb2xsaXNpb24gPSBmYWxzZTtcbiAgICB0aGlzLmdyaWRzdGVySXRlbS5zZXRTaXplKCk7XG4gICAgdGhpcy5ncmlkc3Rlckl0ZW0uY2hlY2tJdGVtQ2hhbmdlcyh0aGlzLmdyaWRzdGVySXRlbS4kaXRlbSwgdGhpcy5ncmlkc3Rlckl0ZW0uaXRlbSk7XG4gICAgaWYgKHRoaXMucHVzaCkge1xuICAgICAgdGhpcy5wdXNoLnNldFB1c2hlZEl0ZW1zKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN3YXApIHtcbiAgICAgIHRoaXMuc3dhcC5zZXRTd2FwSXRlbSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wdXNoKSB7XG4gICAgICB0aGlzLnB1c2guZGVzdHJveSgpO1xuICAgICAgZGVsZXRlIHRoaXMucHVzaDtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3dhcCkge1xuICAgICAgdGhpcy5zd2FwLmRlc3Ryb3koKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnN3YXA7XG4gICAgfVxuICB9XG4gIGNoZWNrZm9yYXZhaWxhYmxlU3BhY2VpbnRoZUFyZWEoKSB7XG4gICAgbGV0IGl0ZW1Sb3dzYmFja3VwID0gdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ucm93cztcbiAgICBsZXQgaXRlbUNvbHNiYWNrdXAgPSB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS5jb2xzO1xuXG4gICAgdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueCA9IHRoaXMucG9zaXRpb25YO1xuICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnkgPSB0aGlzLnBvc2l0aW9uWTtcbiAgICAvKiogaXNDb2xsaWRlID0gMiAtIG5vIGNvbGxpc2lvbiAgKi9cbiAgICB2YXIgaXNDb2xsaWRlID0gMTtcblxuICAgIC8qKiBUbyBpdGVyYXRlIG92ZXIgdGhlIHdpZHRoIG9mIHRoZSBncmlkc3RlciBpVGVtIGFuZCB0byBjaGVjayBmb3IgY29sbGlzaW9uICovXG4gICAgZG8ge1xuXG4gICAgICB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS5yb3dzID0gaXRlbVJvd3NiYWNrdXA7XG5cbiAgICAgIC8qKiBUbyBpdGVyYXRlIG92ZXIgdGhlIGhlaWdodCBvZiB0aGUgZ3JpZHN0ZXIgSXRlbSBhbmQgY2hlY2sgZm9yIGNvbGxpc2lvbiAqL1xuICAgICAgZm9yIChsZXQgcm93Y291bnQgPSB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS5yb3dzOyByb3djb3VudCA+PSAxNTsgcm93Y291bnQtLSkge1xuICAgICAgICBpZiAoIXRoaXMuZ3JpZHN0ZXIuY2hlY2tDb2xsaXNpb24odGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0pKSB7XG4gICAgICAgICAgaXNDb2xsaWRlID0gMjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLyoqIGhhcyBjb2xsaXNpb24gLSAgY2hlY2sgd2l0aCB4LTEgcG9zaXRpb24gYW5kKi9cbiAgICAgICAgICBsZXQgcm93Ymt1cCA9IHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLng7XG4gICAgICAgICAgXG4gICAgICAgICAgbGV0IGxhc3RQb3NzaWJsZVBvc2l0aW9uWD10aGlzLmdyaWRzdGVySXRlbS4kaXRlbS54O1xuICAgICAgICAgIGRve1xuICAgICAgICAgICAgdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueCA9IHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnggLSAxO1xuICAgICAgICAgICAgaWYoIXRoaXMuZ3JpZHN0ZXIuY2hlY2tDb2xsaXNpb24odGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0pKXtcbiAgICAgICAgICAgICAgbGFzdFBvc3NpYmxlUG9zaXRpb25YPXRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLng7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgICB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS54PWxhc3RQb3NzaWJsZVBvc2l0aW9uWDtcbiAgICAgICAgICAgICAgbGV0IG9yaWdpbmFsQ29scz10aGlzLmdyaWRzdGVySXRlbS4kaXRlbS5jb2xzO1xuICAgICAgICAgICAgICBsZXQgbGFzdFBvc3NpYmxlQ29scz10aGlzLmdyaWRzdGVySXRlbS4kaXRlbS5jb2xzO1xuICAgICAgICAgICAgICBkb3tcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS5jb2xzPXRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLmNvbHMrMTtcbiAgICAgICAgICAgICAgICBpZih0aGlzLmdyaWRzdGVyLmNoZWNrQ29sbGlzaW9uKHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtKSl7XG4gICAgICAgICAgICAgICAgICB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS5jb2xzPWxhc3RQb3NzaWJsZUNvbHM7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICAgIGxhc3RQb3NzaWJsZUNvbHM9dGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0uY29scztcbiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHdoaWxlKHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLmNvbHMtb3JpZ2luYWxDb2xzIDwxNSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB3aGlsZSh0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS54PjApXG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKHRoaXMuZ3JpZHN0ZXIuY2hlY2tDb2xsaXNpb24odGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0pKSB7XG4gICAgICAgICAgICB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS5yb3dzID0gdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ucm93cyAtIDE7XG4gICAgICAgICAgICB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS54ID0gcm93Ymt1cDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgIGlzQ29sbGlkZSA9IDI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc0NvbGxpZGUgPT0gMikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLmNvbHMgPSB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS5jb2xzIC0gMTtcblxuICAgIH1cbiAgICB3aGlsZSAodGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0uY29scyA+PSAxNSk7XG4gICAgLy8gd2hpbGUgKHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnJvd3M+PTE1IHx8IHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLmNvbHM+PTE1KTtcbiAgICBpZiAoaXNDb2xsaWRlID09IDEpIHtcbiAgICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnggPSB0aGlzLnBvc2l0aW9uWEJhY2t1cDtcbiAgICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnkgPSB0aGlzLnBvc2l0aW9uWUJhY2t1cDtcbiAgICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLmNvbHMgPSBpdGVtQ29sc2JhY2t1cDtcbiAgICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnJvd3MgPSBpdGVtUm93c2JhY2t1cDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAvLyB0aGlzLmdyaWRzdGVySXRlbS5pdGVtLnJvd3M9dGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ucm93cztcbiAgICAgIC8vIHRoaXMuZ3JpZHN0ZXJJdGVtLml0ZW0uY29scz10aGlzLmdyaWRzdGVySXRlbS4kaXRlbS5jb2xzO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW07XG4gIH1cblxuICBjYWxjdWxhdGVJdGVtUG9zaXRpb24oKSB7XG4gICAgdGhpcy5ncmlkc3Rlci5tb3ZpbmdJdGVtID0gdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW07XG4gICAgdGhpcy5wb3NpdGlvblggPSB0aGlzLmdyaWRzdGVyLnBpeGVsc1RvUG9zaXRpb25YKHRoaXMubGVmdCwgTWF0aC5yb3VuZCk7XG4gICAgdGhpcy5wb3NpdGlvblkgPSB0aGlzLmdyaWRzdGVyLnBpeGVsc1RvUG9zaXRpb25ZKHRoaXMudG9wLCBNYXRoLnJvdW5kKTtcblxuICAgIHRoaXMucG9zaXRpb25YQmFja3VwID0gdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueDtcbiAgICB0aGlzLnBvc2l0aW9uWUJhY2t1cCA9IHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnk7XG4gICAgdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueCA9IHRoaXMucG9zaXRpb25YO1xuXG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIuY2hlY2tHcmlkQ29sbGlzaW9uKHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtKSkge1xuICAgICAgdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueCA9IHRoaXMucG9zaXRpb25YQmFja3VwO1xuICAgIH1cbiAgICB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS55ID0gdGhpcy5wb3NpdGlvblk7XG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIuY2hlY2tHcmlkQ29sbGlzaW9uKHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtKSkge1xuICAgICAgdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueSA9IHRoaXMucG9zaXRpb25ZQmFja3VwO1xuICAgIH1cbiAgICBpZiAodGhpcy5ncmlkc3Rlci5vcHRpb25zLmF1dG9SZXNpemVvbkRyYWcpIHtcbiAgICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtID0gdGhpcy5jaGVja2ZvcmF2YWlsYWJsZVNwYWNlaW50aGVBcmVhKCk7XG4gICAgICB0aGlzLmdyaWRzdGVySXRlbS5zZXRTaXplKCk7XG4gICAgfVxuXG4gICAgdGhpcy5ncmlkc3Rlci5ncmlkUmVuZGVyZXIuc2V0Q2VsbFBvc2l0aW9uKHRoaXMuZ3JpZHN0ZXJJdGVtLnJlbmRlcmVyLCB0aGlzLmdyaWRzdGVySXRlbS5lbCwgdGhpcy5sZWZ0LCB0aGlzLnRvcCk7XG5cbiAgICBpZiAodGhpcy5wb3NpdGlvblhCYWNrdXAgIT09IHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnggfHwgdGhpcy5wb3NpdGlvbllCYWNrdXAgIT09IHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnkpIHtcbiAgICAgIGNvbnN0IGxhc3RQb3NpdGlvbiA9IHRoaXMucGF0aFt0aGlzLnBhdGgubGVuZ3RoIC0gMV07XG4gICAgICBsZXQgZGlyZWN0aW9uID0gJyc7XG4gICAgICBpZiAobGFzdFBvc2l0aW9uLnggPCB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS54KSB7XG4gICAgICAgIGRpcmVjdGlvbiA9IHRoaXMucHVzaC5mcm9tV2VzdDtcbiAgICAgIH0gZWxzZSBpZiAobGFzdFBvc2l0aW9uLnggPiB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS54KSB7XG4gICAgICAgIGRpcmVjdGlvbiA9IHRoaXMucHVzaC5mcm9tRWFzdDtcbiAgICAgIH0gZWxzZSBpZiAobGFzdFBvc2l0aW9uLnkgPCB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS55KSB7XG4gICAgICAgIGRpcmVjdGlvbiA9IHRoaXMucHVzaC5mcm9tTm9ydGg7XG4gICAgICB9IGVsc2UgaWYgKGxhc3RQb3NpdGlvbi55ID4gdGhpcy5ncmlkc3Rlckl0ZW0uJGl0ZW0ueSkge1xuICAgICAgICBkaXJlY3Rpb24gPSB0aGlzLnB1c2guZnJvbVNvdXRoO1xuICAgICAgfVxuICAgICAgdGhpcy5wdXNoLnB1c2hJdGVtcyhkaXJlY3Rpb24sIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZGlzYWJsZVB1c2hPbkRyYWcpO1xuICAgICAgdGhpcy5zd2FwLnN3YXBJdGVtcygpO1xuICAgICAgdGhpcy5jb2xsaXNpb24gPSB0aGlzLmdyaWRzdGVyLmNoZWNrQ29sbGlzaW9uKHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtKTtcbiAgICAgIGlmICh0aGlzLmNvbGxpc2lvbikge1xuICAgICAgICB0aGlzLmdyaWRzdGVySXRlbS4kaXRlbS54ID0gdGhpcy5wb3NpdGlvblhCYWNrdXA7XG4gICAgICAgIHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnkgPSB0aGlzLnBvc2l0aW9uWUJhY2t1cDtcbiAgICAgICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZHJhZ2dhYmxlLmRyb3BPdmVySXRlbXMgJiYgdGhpcy5jb2xsaXNpb24gIT09IHRydWUgJiYgdGhpcy5jb2xsaXNpb24uJGl0ZW0pIHtcbiAgICAgICAgICB0aGlzLmdyaWRzdGVyLm1vdmluZ0l0ZW0gPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBhdGgucHVzaCh7IHg6IHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLngsIHk6IHRoaXMuZ3JpZHN0ZXJJdGVtLiRpdGVtLnkgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLnB1c2guY2hlY2tQdXNoQmFjaygpO1xuICAgIH1cbiAgICB0aGlzLmdyaWRzdGVyLnByZXZpZXdTdHlsZSh0cnVlKTtcbiAgfVxuXG4gIHRvZ2dsZSgpIHtcbiAgICBjb25zdCBlbmFibGVEcmFnID0gdGhpcy5ncmlkc3Rlckl0ZW0uY2FuQmVEcmFnZ2VkKCk7XG4gICAgaWYgKCF0aGlzLmVuYWJsZWQgJiYgZW5hYmxlRHJhZykge1xuICAgICAgdGhpcy5lbmFibGVkID0gIXRoaXMuZW5hYmxlZDtcbiAgICAgIHRoaXMuZHJhZ1N0YXJ0RnVuY3Rpb24gPSB0aGlzLmRyYWdTdGFydERlbGF5LmJpbmQodGhpcyk7XG4gICAgICB0aGlzLm1vdXNlZG93biA9IHRoaXMuZ3JpZHN0ZXJJdGVtLnJlbmRlcmVyLmxpc3Rlbih0aGlzLmdyaWRzdGVySXRlbS5lbCwgJ21vdXNlZG93bicsIHRoaXMuZHJhZ1N0YXJ0RnVuY3Rpb24pO1xuICAgICAgdGhpcy50b3VjaHN0YXJ0ID0gdGhpcy5ncmlkc3Rlckl0ZW0ucmVuZGVyZXIubGlzdGVuKHRoaXMuZ3JpZHN0ZXJJdGVtLmVsLCAndG91Y2hzdGFydCcsIHRoaXMuZHJhZ1N0YXJ0RnVuY3Rpb24pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5lbmFibGVkICYmICFlbmFibGVEcmFnKSB7XG4gICAgICB0aGlzLmVuYWJsZWQgPSAhdGhpcy5lbmFibGVkO1xuICAgICAgdGhpcy5tb3VzZWRvd24oKTtcbiAgICAgIHRoaXMudG91Y2hzdGFydCgpO1xuICAgIH1cbiAgfVxuXG4gIGRyYWdTdGFydERlbGF5KGU6IGFueSk6IHZvaWQge1xuICAgIGlmIChlLnRhcmdldC5oYXNBdHRyaWJ1dGUoJ2NsYXNzJykgJiYgZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdjbGFzcycpLnNwbGl0KCcgJykuaW5kZXhPZignZ3JpZHN0ZXItaXRlbS1yZXNpemFibGUtaGFuZGxlcicpID4gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKEdyaWRzdGVyVXRpbHMuY2hlY2tDb250ZW50Q2xhc3NGb3JFdmVudCh0aGlzLmdyaWRzdGVyLCBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBHcmlkc3RlclV0aWxzLmNoZWNrVG91Y2hFdmVudChlKTtcbiAgICBpZiAoIXRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZHJhZ2dhYmxlLmRlbGF5U3RhcnQpIHtcbiAgICAgIHRoaXMuZHJhZ1N0YXJ0KGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmRyYWdTdGFydChlKTtcbiAgICAgIGNhbmNlbERyYWcoKTtcbiAgICB9LCB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmRyYWdnYWJsZS5kZWxheVN0YXJ0KTtcbiAgICBjb25zdCBjYW5jZWxNb3VzZSA9IHRoaXMuZ3JpZHN0ZXJJdGVtLnJlbmRlcmVyLmxpc3RlbignZG9jdW1lbnQnLCAnbW91c2V1cCcsIGNhbmNlbERyYWcpO1xuICAgIGNvbnN0IGNhbmNlbE1vdXNlTGVhdmUgPSB0aGlzLmdyaWRzdGVySXRlbS5yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ21vdXNlbGVhdmUnLCBjYW5jZWxEcmFnKTtcbiAgICBjb25zdCBjYW5jZWxPbkJsdXIgPSB0aGlzLmdyaWRzdGVySXRlbS5yZW5kZXJlci5saXN0ZW4oJ3dpbmRvdycsICdibHVyJywgY2FuY2VsRHJhZyk7XG4gICAgY29uc3QgY2FuY2VsVG91Y2hNb3ZlID0gdGhpcy5ncmlkc3Rlckl0ZW0ucmVuZGVyZXIubGlzdGVuKCdkb2N1bWVudCcsICd0b3VjaG1vdmUnLCBjYW5jZWxNb3ZlKTtcbiAgICBjb25zdCBjYW5jZWxUb3VjaEVuZCA9IHRoaXMuZ3JpZHN0ZXJJdGVtLnJlbmRlcmVyLmxpc3RlbignZG9jdW1lbnQnLCAndG91Y2hlbmQnLCBjYW5jZWxEcmFnKTtcbiAgICBjb25zdCBjYW5jZWxUb3VjaENhbmNlbCA9IHRoaXMuZ3JpZHN0ZXJJdGVtLnJlbmRlcmVyLmxpc3RlbignZG9jdW1lbnQnLCAndG91Y2hjYW5jZWwnLCBjYW5jZWxEcmFnKTtcblxuICAgIGZ1bmN0aW9uIGNhbmNlbE1vdmUoZXZlbnRNb3ZlOiBhbnkpIHtcbiAgICAgIEdyaWRzdGVyVXRpbHMuY2hlY2tUb3VjaEV2ZW50KGV2ZW50TW92ZSk7XG4gICAgICBpZiAoTWF0aC5hYnMoZXZlbnRNb3ZlLmNsaWVudFggLSBlLmNsaWVudFgpID4gOSB8fCBNYXRoLmFicyhldmVudE1vdmUuY2xpZW50WSAtIGUuY2xpZW50WSkgPiA5KSB7XG4gICAgICAgIGNhbmNlbERyYWcoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYW5jZWxEcmFnKCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgY2FuY2VsT25CbHVyKCk7XG4gICAgICBjYW5jZWxNb3VzZSgpO1xuICAgICAgY2FuY2VsTW91c2VMZWF2ZSgpO1xuICAgICAgY2FuY2VsVG91Y2hNb3ZlKCk7XG4gICAgICBjYW5jZWxUb3VjaEVuZCgpO1xuICAgICAgY2FuY2VsVG91Y2hDYW5jZWwoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==