three-nebula 11.0.0 → 11.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/three-nebula.cjs +109 -0
  3. package/dist/three-nebula.cjs.map +1 -0
  4. package/dist/three-nebula.mjs +2968 -0
  5. package/dist/three-nebula.mjs.map +1 -0
  6. package/dist/three-nebula.umd.js +109 -0
  7. package/dist/three-nebula.umd.js.map +1 -0
  8. package/package.json +23 -47
  9. package/specs/01-emitter-hierarchy.md +200 -0
  10. package/specs/02-determinism-scrubbing.md +188 -0
  11. package/specs/03-sound-renderer.md +183 -0
  12. package/specs/04-schema-versioning.md +140 -0
  13. package/specs/05-content-addressed-assets.md +288 -0
  14. package/specs/README.md +80 -0
  15. package/build/cjs/behaviour/Alpha.js +0 -189
  16. package/build/cjs/behaviour/Attraction.js +0 -189
  17. package/build/cjs/behaviour/Behaviour.js +0 -253
  18. package/build/cjs/behaviour/Collision.js +0 -146
  19. package/build/cjs/behaviour/Color.js +0 -148
  20. package/build/cjs/behaviour/CrossZone.js +0 -141
  21. package/build/cjs/behaviour/Force.js +0 -126
  22. package/build/cjs/behaviour/Gravity.js +0 -78
  23. package/build/cjs/behaviour/RandomDrift.js +0 -153
  24. package/build/cjs/behaviour/Repulsion.js +0 -123
  25. package/build/cjs/behaviour/Rotate.js +0 -265
  26. package/build/cjs/behaviour/Scale.js +0 -177
  27. package/build/cjs/behaviour/Spring.js +0 -133
  28. package/build/cjs/behaviour/constants.js +0 -28
  29. package/build/cjs/behaviour/index.js +0 -112
  30. package/build/cjs/behaviour/types.js +0 -33
  31. package/build/cjs/constants/index.js +0 -61
  32. package/build/cjs/core/Particle.js +0 -390
  33. package/build/cjs/core/Pool.js +0 -203
  34. package/build/cjs/core/System.js +0 -366
  35. package/build/cjs/core/constants.js +0 -163
  36. package/build/cjs/core/fromJSON.js +0 -128
  37. package/build/cjs/core/fromJSONAsync.js +0 -239
  38. package/build/cjs/core/index.js +0 -32
  39. package/build/cjs/core/three/Euler.js +0 -233
  40. package/build/cjs/core/three/Math.js +0 -91
  41. package/build/cjs/core/three/Matrix4.js +0 -745
  42. package/build/cjs/core/three/Quaternion.js +0 -451
  43. package/build/cjs/core/three/Vector3.js +0 -464
  44. package/build/cjs/core/three/constants.js +0 -298
  45. package/build/cjs/core/three/index.js +0 -48
  46. package/build/cjs/core/types.js +0 -13
  47. package/build/cjs/debug/Debug.js +0 -209
  48. package/build/cjs/debug/constants.js +0 -19
  49. package/build/cjs/debug/index.js +0 -24
  50. package/build/cjs/debug/log.js +0 -38
  51. package/build/cjs/ease/index.js +0 -149
  52. package/build/cjs/emitter/Emitter.js +0 -798
  53. package/build/cjs/emitter/FollowEmitter.js +0 -146
  54. package/build/cjs/emitter/constants.js +0 -20
  55. package/build/cjs/emitter/index.js +0 -24
  56. package/build/cjs/emitter/types.js +0 -11
  57. package/build/cjs/events/EventDispatcher.js +0 -105
  58. package/build/cjs/events/constants.js +0 -23
  59. package/build/cjs/events/index.js +0 -27
  60. package/build/cjs/index.js +0 -151
  61. package/build/cjs/initializer/Body.js +0 -122
  62. package/build/cjs/initializer/BodySprite.js +0 -146
  63. package/build/cjs/initializer/Initializer.js +0 -109
  64. package/build/cjs/initializer/InitializerUtil.js +0 -54
  65. package/build/cjs/initializer/Life.js +0 -106
  66. package/build/cjs/initializer/Mass.js +0 -101
  67. package/build/cjs/initializer/Position.js +0 -152
  68. package/build/cjs/initializer/Radius.js +0 -118
  69. package/build/cjs/initializer/Rate.js +0 -150
  70. package/build/cjs/initializer/Rotation.js +0 -95
  71. package/build/cjs/initializer/Texture.js +0 -139
  72. package/build/cjs/initializer/Velocity/PolarVelocity.js +0 -102
  73. package/build/cjs/initializer/Velocity/RadialVelocity.js +0 -111
  74. package/build/cjs/initializer/Velocity/VectorVelocity.js +0 -108
  75. package/build/cjs/initializer/Velocity/Velocity.js +0 -94
  76. package/build/cjs/initializer/Velocity/index.js +0 -32
  77. package/build/cjs/initializer/constants.js +0 -43
  78. package/build/cjs/initializer/index.js +0 -108
  79. package/build/cjs/initializer/types.js +0 -37
  80. package/build/cjs/math/ArraySpan.js +0 -103
  81. package/build/cjs/math/Box.js +0 -46
  82. package/build/cjs/math/ColorSpan.js +0 -113
  83. package/build/cjs/math/MathUtils.js +0 -57
  84. package/build/cjs/math/Polar3D.js +0 -115
  85. package/build/cjs/math/Span.js +0 -88
  86. package/build/cjs/math/Vector3D.js +0 -76
  87. package/build/cjs/math/constants.js +0 -35
  88. package/build/cjs/math/index.js +0 -122
  89. package/build/cjs/math/integration.js +0 -59
  90. package/build/cjs/math/types.js +0 -19
  91. package/build/cjs/renderer/BaseRenderer.js +0 -108
  92. package/build/cjs/renderer/CustomRenderer.js +0 -65
  93. package/build/cjs/renderer/GPURenderer/Desktop/index.js +0 -371
  94. package/build/cjs/renderer/GPURenderer/Desktop/shaders/fragmentShader.js +0 -13
  95. package/build/cjs/renderer/GPURenderer/Desktop/shaders/index.js +0 -22
  96. package/build/cjs/renderer/GPURenderer/Desktop/shaders/vertexShader.js +0 -17
  97. package/build/cjs/renderer/GPURenderer/Mobile/index.js +0 -385
  98. package/build/cjs/renderer/GPURenderer/Mobile/shaders/fragmentShader.js +0 -13
  99. package/build/cjs/renderer/GPURenderer/Mobile/shaders/index.js +0 -22
  100. package/build/cjs/renderer/GPURenderer/Mobile/shaders/vertexShader.js +0 -15
  101. package/build/cjs/renderer/GPURenderer/common/ParticleBuffer/constants.js +0 -58
  102. package/build/cjs/renderer/GPURenderer/common/ParticleBuffer/index.js +0 -93
  103. package/build/cjs/renderer/GPURenderer/common/TextureAtlas/constants.js +0 -9
  104. package/build/cjs/renderer/GPURenderer/common/TextureAtlas/index.js +0 -221
  105. package/build/cjs/renderer/GPURenderer/common/constants.js +0 -22
  106. package/build/cjs/renderer/GPURenderer/common/index.js +0 -38
  107. package/build/cjs/renderer/GPURenderer/common/shaders/constants.js +0 -9
  108. package/build/cjs/renderer/GPURenderer/common/stores/Target.js +0 -45
  109. package/build/cjs/renderer/GPURenderer/common/stores/UniqueList.js +0 -51
  110. package/build/cjs/renderer/GPURenderer/common/stores/index.js +0 -22
  111. package/build/cjs/renderer/GPURenderer/index.js +0 -97
  112. package/build/cjs/renderer/MeshRenderer.js +0 -136
  113. package/build/cjs/renderer/SpriteRenderer.js +0 -68
  114. package/build/cjs/renderer/index.js +0 -40
  115. package/build/cjs/renderer/types.js +0 -21
  116. package/build/cjs/utils/ColorUtil.js +0 -39
  117. package/build/cjs/utils/PUID.js +0 -26
  118. package/build/cjs/utils/THREEUtil.js +0 -40
  119. package/build/cjs/utils/Util.js +0 -69
  120. package/build/cjs/utils/index.js +0 -61
  121. package/build/cjs/utils/uid.js +0 -12
  122. package/build/cjs/zone/BoxZone.js +0 -178
  123. package/build/cjs/zone/LineZone.js +0 -101
  124. package/build/cjs/zone/MeshZone.js +0 -101
  125. package/build/cjs/zone/PointZone.js +0 -99
  126. package/build/cjs/zone/ScreenZone.js +0 -164
  127. package/build/cjs/zone/SphereZone.js +0 -155
  128. package/build/cjs/zone/Zone.js +0 -172
  129. package/build/cjs/zone/index.js +0 -56
  130. package/build/cjs/zone/types.js +0 -21
  131. package/build/esm/behaviour/Alpha.js +0 -134
  132. package/build/esm/behaviour/Attraction.js +0 -135
  133. package/build/esm/behaviour/Behaviour.js +0 -215
  134. package/build/esm/behaviour/Collision.js +0 -100
  135. package/build/esm/behaviour/Color.js +0 -101
  136. package/build/esm/behaviour/CrossZone.js +0 -82
  137. package/build/esm/behaviour/Force.js +0 -83
  138. package/build/esm/behaviour/Gravity.js +0 -40
  139. package/build/esm/behaviour/RandomDrift.js +0 -97
  140. package/build/esm/behaviour/Repulsion.js +0 -81
  141. package/build/esm/behaviour/Rotate.js +0 -214
  142. package/build/esm/behaviour/Scale.js +0 -131
  143. package/build/esm/behaviour/Spring.js +0 -90
  144. package/build/esm/behaviour/constants.js +0 -11
  145. package/build/esm/behaviour/index.js +0 -14
  146. package/build/esm/behaviour/types.js +0 -14
  147. package/build/esm/constants/index.js +0 -42
  148. package/build/esm/core/Particle.js +0 -357
  149. package/build/esm/core/Pool.js +0 -161
  150. package/build/esm/core/System.js +0 -320
  151. package/build/esm/core/constants.js +0 -127
  152. package/build/esm/core/fromJSON.js +0 -107
  153. package/build/esm/core/fromJSONAsync.js +0 -210
  154. package/build/esm/core/index.js +0 -4
  155. package/build/esm/core/three/Euler.js +0 -224
  156. package/build/esm/core/three/Math.js +0 -84
  157. package/build/esm/core/three/Matrix4.js +0 -739
  158. package/build/esm/core/three/Quaternion.js +0 -445
  159. package/build/esm/core/three/Vector3.js +0 -457
  160. package/build/esm/core/three/constants.js +0 -148
  161. package/build/esm/core/three/index.js +0 -5
  162. package/build/esm/core/types.js +0 -4
  163. package/build/esm/debug/Debug.js +0 -195
  164. package/build/esm/debug/constants.js +0 -7
  165. package/build/esm/debug/index.js +0 -3
  166. package/build/esm/debug/log.js +0 -31
  167. package/build/esm/ease/index.js +0 -113
  168. package/build/esm/emitter/Emitter.js +0 -708
  169. package/build/esm/emitter/FollowEmitter.js +0 -97
  170. package/build/esm/emitter/constants.js +0 -7
  171. package/build/esm/emitter/index.js +0 -3
  172. package/build/esm/emitter/types.js +0 -3
  173. package/build/esm/events/EventDispatcher.js +0 -82
  174. package/build/esm/events/constants.js +0 -9
  175. package/build/esm/events/index.js +0 -4
  176. package/build/esm/index.js +0 -13
  177. package/build/esm/initializer/Body.js +0 -83
  178. package/build/esm/initializer/BodySprite.js +0 -108
  179. package/build/esm/initializer/Initializer.js +0 -84
  180. package/build/esm/initializer/InitializerUtil.js +0 -48
  181. package/build/esm/initializer/Life.js +0 -66
  182. package/build/esm/initializer/Mass.js +0 -60
  183. package/build/esm/initializer/Position.js +0 -98
  184. package/build/esm/initializer/Radius.js +0 -75
  185. package/build/esm/initializer/Rate.js +0 -107
  186. package/build/esm/initializer/Rotation.js +0 -54
  187. package/build/esm/initializer/Texture.js +0 -101
  188. package/build/esm/initializer/Velocity/PolarVelocity.js +0 -63
  189. package/build/esm/initializer/Velocity/RadialVelocity.js +0 -72
  190. package/build/esm/initializer/Velocity/VectorVelocity.js +0 -69
  191. package/build/esm/initializer/Velocity/Velocity.js +0 -52
  192. package/build/esm/initializer/Velocity/index.js +0 -4
  193. package/build/esm/initializer/constants.js +0 -26
  194. package/build/esm/initializer/index.js +0 -12
  195. package/build/esm/initializer/types.js +0 -16
  196. package/build/esm/math/ArraySpan.js +0 -62
  197. package/build/esm/math/Box.js +0 -25
  198. package/build/esm/math/ColorSpan.js +0 -71
  199. package/build/esm/math/MathUtils.js +0 -48
  200. package/build/esm/math/Polar3D.js +0 -81
  201. package/build/esm/math/Span.js +0 -63
  202. package/build/esm/math/Vector3D.js +0 -34
  203. package/build/esm/math/constants.js +0 -24
  204. package/build/esm/math/index.js +0 -10
  205. package/build/esm/math/integration.js +0 -47
  206. package/build/esm/math/types.js +0 -7
  207. package/build/esm/renderer/BaseRenderer.js +0 -78
  208. package/build/esm/renderer/CustomRenderer.js +0 -23
  209. package/build/esm/renderer/GPURenderer/Desktop/index.js +0 -357
  210. package/build/esm/renderer/GPURenderer/Desktop/shaders/fragmentShader.js +0 -30
  211. package/build/esm/renderer/GPURenderer/Desktop/shaders/index.js +0 -3
  212. package/build/esm/renderer/GPURenderer/Desktop/shaders/vertexShader.js +0 -36
  213. package/build/esm/renderer/GPURenderer/Mobile/index.js +0 -375
  214. package/build/esm/renderer/GPURenderer/Mobile/shaders/fragmentShader.js +0 -27
  215. package/build/esm/renderer/GPURenderer/Mobile/shaders/index.js +0 -3
  216. package/build/esm/renderer/GPURenderer/Mobile/shaders/vertexShader.js +0 -33
  217. package/build/esm/renderer/GPURenderer/common/ParticleBuffer/constants.js +0 -30
  218. package/build/esm/renderer/GPURenderer/common/ParticleBuffer/index.js +0 -70
  219. package/build/esm/renderer/GPURenderer/common/TextureAtlas/constants.js +0 -2
  220. package/build/esm/renderer/GPURenderer/common/TextureAtlas/index.js +0 -206
  221. package/build/esm/renderer/GPURenderer/common/constants.js +0 -13
  222. package/build/esm/renderer/GPURenderer/common/index.js +0 -4
  223. package/build/esm/renderer/GPURenderer/common/shaders/constants.js +0 -2
  224. package/build/esm/renderer/GPURenderer/common/stores/Target.js +0 -26
  225. package/build/esm/renderer/GPURenderer/common/stores/UniqueList.js +0 -29
  226. package/build/esm/renderer/GPURenderer/common/stores/index.js +0 -3
  227. package/build/esm/renderer/GPURenderer/index.js +0 -57
  228. package/build/esm/renderer/MeshRenderer.js +0 -93
  229. package/build/esm/renderer/SpriteRenderer.js +0 -30
  230. package/build/esm/renderer/index.js +0 -5
  231. package/build/esm/renderer/types.js +0 -8
  232. package/build/esm/utils/ColorUtil.js +0 -32
  233. package/build/esm/utils/PUID.js +0 -19
  234. package/build/esm/utils/THREEUtil.js +0 -31
  235. package/build/esm/utils/Util.js +0 -60
  236. package/build/esm/utils/index.js +0 -13
  237. package/build/esm/utils/uid.js +0 -3
  238. package/build/esm/zone/BoxZone.js +0 -133
  239. package/build/esm/zone/LineZone.js +0 -61
  240. package/build/esm/zone/MeshZone.js +0 -60
  241. package/build/esm/zone/PointZone.js +0 -59
  242. package/build/esm/zone/ScreenZone.js +0 -116
  243. package/build/esm/zone/SphereZone.js +0 -113
  244. package/build/esm/zone/Zone.js +0 -141
  245. package/build/esm/zone/index.js +0 -7
  246. package/build/esm/zone/types.js +0 -8
  247. package/build/three-nebula.js +0 -2
  248. package/build/three-nebula.js.map +0 -1
@@ -1,798 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- var _typeof = require("@babel/runtime/helpers/typeof");
6
-
7
- Object.defineProperty(exports, "__esModule", {
8
- value: true
9
- });
10
- exports["default"] = void 0;
11
-
12
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13
-
14
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
15
-
16
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
17
-
18
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
19
-
20
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
21
-
22
- var _constants = require("./constants");
23
-
24
- var _events = _interopRequireWildcard(require("../events"));
25
-
26
- var _math = require("../math");
27
-
28
- var _utils = require("../utils");
29
-
30
- var _initializer = require("../initializer");
31
-
32
- var _Particle2 = _interopRequireDefault(require("../core/Particle"));
33
-
34
- var _isNumber = _interopRequireDefault(require("lodash/isNumber"));
35
-
36
- var _types = require("./types");
37
-
38
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
39
-
40
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
41
-
42
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
43
-
44
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
45
-
46
- /**
47
- * Emitters are the System engine's particle factories. They cause particles to
48
- * be rendered by emitting them, and store all particle initializers and behaviours.
49
- *
50
- */
51
- var Emitter = /*#__PURE__*/function (_Particle) {
52
- (0, _inherits2["default"])(Emitter, _Particle);
53
-
54
- var _super = _createSuper(Emitter);
55
-
56
- /**
57
- * Constructs an Emitter instance.
58
- *
59
- * @param {object} properties - The properties to instantiate the emitter with
60
- * @return void
61
- */
62
- function Emitter(properties) {
63
- var _this;
64
-
65
- (0, _classCallCheck2["default"])(this, Emitter);
66
- _this = _super.call(this, properties);
67
- /**
68
- * @desc The class type.
69
- * @type {string}
70
- */
71
-
72
- _this.type = _types.EMITTER_TYPE_EMITTER;
73
- /**
74
- * @desc The particles emitted by this emitter.
75
- * @type {array}
76
- */
77
-
78
- _this.particles = [];
79
- /**
80
- * @desc The initializers for particles emitted by this emitter.
81
- * @type {array}
82
- */
83
-
84
- _this.initializers = [];
85
- /**
86
- * @desc The behaviours for particles emitted by this emitter.
87
- * @type {array}
88
- */
89
-
90
- _this.behaviours = [];
91
- /**
92
- * @desc The behaviours for the emitter.
93
- * @type {array}
94
- */
95
-
96
- _this.emitterBehaviours = [];
97
- /**
98
- * @desc The current emit iteration.
99
- * @type {integer}
100
- */
101
-
102
- _this.currentEmitTime = 0;
103
- /**
104
- * @desc The total number of times the emitter should emit particles.
105
- * @type {integer}
106
- */
107
-
108
- _this.totalEmitTimes = -1;
109
- /**
110
- * @desc The friction coefficient for all particle to emit by.
111
- * @type {number}
112
- */
113
-
114
- _this.damping = _constants.DEFAULT_DAMPING;
115
- /**
116
- * @desc Ensures that particles emitted by this emitter are positioned
117
- * according to the emitter's properties.
118
- * @type {boolean}
119
- */
120
-
121
- _this.bindEmitter = _constants.DEFAULT_BIND_EMITTER;
122
- /**
123
- * @desc Determines if the emitter will dispatch internal events. Defaults
124
- * to false
125
- * @type {boolean}
126
- */
127
-
128
- _this.bindEmitterEvent = _constants.DEFAULT_BIND_EMITTER_EVENT;
129
- /**
130
- * @desc The number of particles to emit per second (a [particle]/b [s])
131
- * @type {Rate}
132
- */
133
-
134
- _this.rate = _constants.DEFAULT_EMITTER_RATE;
135
- /**
136
- * @desc Determines if the emitter is emitting particles or not.
137
- * @type {boolean}
138
- */
139
-
140
- _this.isEmitting = false;
141
- /**
142
- * @desc The emitter's id.
143
- * @type {string}
144
- */
145
-
146
- _this.id = "emitter-".concat((0, _utils.uid)());
147
- _this.cID = 0;
148
- _this.name = 'Emitter';
149
- /**
150
- * @desc The index of the emitter as it is added to the system.
151
- * @type {number|undefined}
152
- */
153
-
154
- _this.index = _constants.DEFAULT_EMITTER_INDEX;
155
- /**
156
- * @desc The emitter's internal event dispatcher.
157
- * @type {EventDispatcher}
158
- */
159
-
160
- _this.eventDispatcher = new _events["default"]();
161
- return _this;
162
- }
163
- /**
164
- * Proxy method for the internal event dispatcher's dispatchEvent method.
165
- *
166
- * @param {string} event - The event to dispatch
167
- * @param {object<Particle>} [target=this] - The event target
168
- */
169
-
170
-
171
- (0, _createClass2["default"])(Emitter, [{
172
- key: "dispatch",
173
- value: function dispatch(event) {
174
- var target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this;
175
- this.eventDispatcher.dispatchEvent(event, target);
176
- }
177
- /**
178
- * Sets the emitter rate.
179
- *
180
- * @param {Rate} rate - a rate initializer object
181
- * @return {Emitter}
182
- */
183
-
184
- }, {
185
- key: "setRate",
186
- value: function setRate(rate) {
187
- this.rate = rate;
188
- return this;
189
- }
190
- /**
191
- * Sets the position of the emitter.
192
- *
193
- * @param {object} newPosition - an object the new x, y and z props
194
- * @return {Emitter}
195
- */
196
-
197
- }, {
198
- key: "setPosition",
199
- value: function setPosition() {
200
- var newPosition = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
201
- var position = this.position;
202
- var _newPosition$x = newPosition.x,
203
- x = _newPosition$x === void 0 ? position.x : _newPosition$x,
204
- _newPosition$y = newPosition.y,
205
- y = _newPosition$y === void 0 ? position.y : _newPosition$y,
206
- _newPosition$z = newPosition.z,
207
- z = _newPosition$z === void 0 ? position.z : _newPosition$z;
208
- this.position.set(x, y, z);
209
- return this;
210
- }
211
- /**
212
- * Sets the rotation of the emitter.
213
- *
214
- * @param {object} newRotation - an object the new x, y and z props
215
- * @return {Emitter}
216
- */
217
-
218
- }, {
219
- key: "setRotation",
220
- value: function setRotation() {
221
- var newRotation = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
222
- var rotation = this.rotation;
223
- var _newRotation$x = newRotation.x,
224
- x = _newRotation$x === void 0 ? rotation.x : _newRotation$x,
225
- _newRotation$y = newRotation.y,
226
- y = _newRotation$y === void 0 ? rotation.y : _newRotation$y,
227
- _newRotation$z = newRotation.z,
228
- z = _newRotation$z === void 0 ? rotation.z : _newRotation$z;
229
- this.rotation.set(x, y, z);
230
- return this;
231
- }
232
- /**
233
- * Sets the total number of times the emitter should emit particles as well as
234
- * the emitter's life. Also intializes the emitter rate.
235
- * This enables the emitter to emit particles.
236
- *
237
- * @param {number} [totalEmitTimes=Infinity] - the total number of times to emit particles
238
- * @param {number} [life=Infinity] - the life of this emitter in milliseconds
239
- * @return {Emitter}
240
- */
241
-
242
- }, {
243
- key: "emit",
244
- value: function emit() {
245
- var totalEmitTimes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Infinity;
246
- var life = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Infinity;
247
- this.currentEmitTime = 0;
248
- this.totalEmitTimes = (0, _isNumber["default"])(totalEmitTimes) ? totalEmitTimes : Infinity;
249
-
250
- if (totalEmitTimes === 1) {
251
- this.life = totalEmitTimes;
252
- } else {
253
- this.life = (0, _isNumber["default"])(life) ? life : Infinity;
254
- }
255
-
256
- this.rate.init();
257
- this.isEmitting = true;
258
- return this;
259
- }
260
- /**
261
- * Experimental emit method that is designed to be called from the System.emit method.
262
- *
263
- * @return {Emitter}
264
- */
265
-
266
- }, {
267
- key: "experimental_emit",
268
- value: function experimental_emit() {
269
- var isEmitting = this.isEmitting,
270
- totalEmitTimes = this.totalEmitTimes,
271
- life = this.life;
272
-
273
- if (!isEmitting) {
274
- this.currentEmitTime = 0;
275
-
276
- if (!totalEmitTimes) {
277
- this.setTotalEmitTimes(Infinity);
278
- }
279
-
280
- if (!life) {
281
- this.setLife(Infinity);
282
- }
283
-
284
- this.rate.init();
285
- this.isEmitting = true;
286
- }
287
-
288
- return this;
289
- }
290
- /**
291
- * Sets the total emit times for the emitter.
292
- *
293
- * @param {number} [totalEmitTimes=Infinity] - the total number of times to emit particles
294
- * @return {Emitter}
295
- */
296
-
297
- }, {
298
- key: "setTotalEmitTimes",
299
- value: function setTotalEmitTimes() {
300
- var totalEmitTimes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Infinity;
301
- this.totalEmitTimes = (0, _isNumber["default"])(totalEmitTimes) ? totalEmitTimes : Infinity;
302
- return this;
303
- }
304
- /**
305
- * Sets the life of the emitter.
306
- *
307
- * @param {number} [life=Infinity] - the life of this emitter in milliseconds
308
- * @return {Emitter}
309
- */
310
-
311
- }, {
312
- key: "setLife",
313
- value: function setLife() {
314
- var life = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Infinity;
315
-
316
- if (this.totalEmitTimes === 1) {
317
- this.life = this.totalEmitTimes;
318
- } else {
319
- this.life = (0, _isNumber["default"])(life) ? life : Infinity;
320
- }
321
-
322
- return this;
323
- }
324
- /**
325
- * Stops the emitter from emitting particles.
326
- *
327
- * @return void
328
- */
329
-
330
- }, {
331
- key: "stopEmit",
332
- value: function stopEmit() {
333
- this.totalEmitTimes = -1;
334
- this.currentEmitTime = 0;
335
- this.isEmitting = false;
336
- }
337
- /**
338
- * Kills all of the emitter's particles.
339
- *
340
- * @return void
341
- */
342
-
343
- }, {
344
- key: "removeAllParticles",
345
- value: function removeAllParticles() {
346
- var i = this.particles.length;
347
-
348
- while (i--) {
349
- this.particles[i].dead = true;
350
- }
351
- }
352
- /**
353
- * Adds a particle initializer to the emitter.
354
- * Each initializer is run on each particle when they are created.
355
- *
356
- * @param {Initializer} initializer - The initializer to add
357
- * @return {Emitter}
358
- */
359
-
360
- }, {
361
- key: "addInitializer",
362
- value: function addInitializer(initializer) {
363
- this.initializers.push(initializer);
364
- return this;
365
- }
366
- /**
367
- * Adds multiple particle initializers to the emitter.
368
- *
369
- * @param {array<Initializer>} initializers - an array of particle initializers
370
- * @return {Emitter}
371
- */
372
-
373
- }, {
374
- key: "addInitializers",
375
- value: function addInitializers(initializers) {
376
- var i = initializers.length;
377
-
378
- while (i--) {
379
- this.addInitializer(initializers[i]);
380
- }
381
-
382
- return this;
383
- }
384
- /**
385
- * Sets the emitter's particle initializers.
386
- *
387
- * @param {array<Initializer>} initializers - an array of particle initializers
388
- * @return {Emitter}
389
- */
390
-
391
- }, {
392
- key: "setInitializers",
393
- value: function setInitializers(initializers) {
394
- this.initializers = initializers;
395
- return this;
396
- }
397
- /**
398
- * Removes an initializer from the emitter's initializers array.
399
- *
400
- * @param {Initializer} initializer - The initializer to remove
401
- * @return {Emitter}
402
- */
403
-
404
- }, {
405
- key: "removeInitializer",
406
- value: function removeInitializer(initializer) {
407
- var index = this.initializers.indexOf(initializer);
408
-
409
- if (index > -1) {
410
- this.initializers.splice(index, 1);
411
- }
412
-
413
- return this;
414
- }
415
- /**
416
- * Removes all initializers.
417
- *
418
- * @return {Emitter}
419
- */
420
-
421
- }, {
422
- key: "removeAllInitializers",
423
- value: function removeAllInitializers() {
424
- _utils.Util.destroyArray(this.initializers);
425
-
426
- return this;
427
- }
428
- /**
429
- * Adds a behaviour to the emitter. All emitter behaviours are added to each particle when
430
- * they are emitted.
431
- *
432
- * @param {Behaviour} behaviour - The behaviour to add to the emitter
433
- * @return {Emitter}
434
- */
435
-
436
- }, {
437
- key: "addBehaviour",
438
- value: function addBehaviour(behaviour) {
439
- this.behaviours.push(behaviour);
440
- return this;
441
- }
442
- /**
443
- * Adds multiple behaviours to the emitter.
444
- *
445
- * @param {array<Behaviour>} behaviours - an array of emitter behaviours
446
- * @return {Emitter}
447
- */
448
-
449
- }, {
450
- key: "addBehaviours",
451
- value: function addBehaviours(behaviours) {
452
- var i = behaviours.length;
453
-
454
- while (i--) {
455
- this.addBehaviour(behaviours[i]);
456
- }
457
-
458
- return this;
459
- }
460
- /**
461
- * Sets the emitter's behaviours.
462
- *
463
- * @param {array<Behaviour>} behaviours - an array of emitter behaviours
464
- * @return {Emitter}
465
- */
466
-
467
- }, {
468
- key: "setBehaviours",
469
- value: function setBehaviours(behaviours) {
470
- this.behaviours = behaviours;
471
- return this;
472
- }
473
- /**
474
- * Removes the behaviour from the emitter's behaviours array.
475
- *
476
- * @param {Behaviour} behaviour - The behaviour to remove
477
- * @return {Emitter}
478
- */
479
-
480
- }, {
481
- key: "removeBehaviour",
482
- value: function removeBehaviour(behaviour) {
483
- var index = this.behaviours.indexOf(behaviour);
484
-
485
- if (index > -1) {
486
- this.behaviours.splice(index, 1);
487
- }
488
-
489
- return this;
490
- }
491
- /**
492
- * Removes all behaviours from the emitter.
493
- *
494
- * @return {Emitter}
495
- */
496
-
497
- }, {
498
- key: "removeAllBehaviours",
499
- value: function removeAllBehaviours() {
500
- _utils.Util.destroyArray(this.behaviours);
501
-
502
- return this;
503
- }
504
- /**
505
- * Adds an emitter behaviour to the emitter.
506
- *
507
- * @param {Behaviour} behaviour - The behaviour to add to the emitter
508
- * @return {Emitter}
509
- */
510
-
511
- }, {
512
- key: "addEmitterBehaviour",
513
- value: function addEmitterBehaviour(behaviour) {
514
- this.emitterBehaviours.push(behaviour);
515
- behaviour.initialize(this);
516
- return this;
517
- }
518
- /**
519
- * Adds multiple behaviours to the emitter.
520
- *
521
- * @param {array<Behaviour>} behaviours - an array of emitter behaviours
522
- * @return {Emitter}
523
- */
524
-
525
- }, {
526
- key: "addEmitterBehaviours",
527
- value: function addEmitterBehaviours(behaviours) {
528
- var i = behaviours.length;
529
-
530
- while (i--) {
531
- this.addEmitterBehaviour(behaviours[i]);
532
- }
533
-
534
- return this;
535
- }
536
- /**
537
- * Sets the emitter's behaviours.
538
- *
539
- * @param {array<Behaviour>} behaviours - an array of emitter behaviours
540
- * @return {Emitter}
541
- */
542
-
543
- }, {
544
- key: "setEmitterBehaviours",
545
- value: function setEmitterBehaviours(behaviours) {
546
- var length = behaviours.length;
547
- this.emitterBehaviours = behaviours;
548
-
549
- for (var i = 0; i < length; i++) {
550
- this.emitterBehaviours[i].initialize(this);
551
- }
552
-
553
- return this;
554
- }
555
- /**
556
- * Removes the behaviour from the emitter's behaviours array.
557
- *
558
- * @param {Behaviour} behaviour - The behaviour to remove
559
- * @return {Emitter}
560
- */
561
-
562
- }, {
563
- key: "removeEmitterBehaviour",
564
- value: function removeEmitterBehaviour(behaviour) {
565
- var index = this.emitterBehaviours.indexOf(behaviour);
566
-
567
- if (index > -1) {
568
- this.emitterBehaviours.splice(index, 1);
569
- }
570
-
571
- return this;
572
- }
573
- /**
574
- * Removes all behaviours from the emitter.
575
- *
576
- * @return {Emitter}
577
- */
578
-
579
- }, {
580
- key: "removeAllEmitterBehaviours",
581
- value: function removeAllEmitterBehaviours() {
582
- _utils.Util.destroyArray(this.emitterBehaviours);
583
-
584
- return this;
585
- }
586
- /**
587
- * Adds the event listener for the EMITTER_DEAD event.
588
- *
589
- * @param {onEmitterDead} - The function to call when the EMITTER_DEAD is dispatched.
590
- * @return {Emitter}
591
- */
592
-
593
- }, {
594
- key: "addOnEmitterDeadEventListener",
595
- value: function addOnEmitterDeadEventListener(onEmitterDead) {
596
- this.eventDispatcher.addEventListener("".concat(this.id, "_").concat(_events.EMITTER_DEAD), function () {
597
- return onEmitterDead();
598
- });
599
- return this;
600
- }
601
- /**
602
- * Creates a particle by retreiving one from the pool and setting it up with
603
- * the supplied initializer and behaviour.
604
- *
605
- * @return {Emitter}
606
- */
607
-
608
- }, {
609
- key: "createParticle",
610
- value: function createParticle() {
611
- var particle = this.parent.pool.get(_Particle2["default"]);
612
- var index = this.particles.length;
613
- this.setupParticle(particle, index);
614
- this.parent && this.parent.dispatch(_events.PARTICLE_CREATED, particle);
615
- this.bindEmitterEvent && this.dispatch(_events.PARTICLE_CREATED, particle);
616
- return particle;
617
- }
618
- /**
619
- * Sets up a particle by running all initializers on it and setting its behaviours.
620
- * Also adds the particle to this.particles.
621
- *
622
- * @param {Particle} particle - The particle to setup
623
- * @return void
624
- */
625
-
626
- }, {
627
- key: "setupParticle",
628
- value: function setupParticle(particle, index) {
629
- var initializers = this.initializers,
630
- behaviours = this.behaviours;
631
-
632
- _initializer.InitializerUtil.initialize(this, particle, initializers);
633
-
634
- particle.addBehaviours(behaviours);
635
- particle.parent = this;
636
- particle.index = index;
637
- this.particles.push(particle);
638
- }
639
- /**
640
- * Updates the emitter according to the time passed by calling the generate
641
- * and integrate methods. The generate method creates particles, the integrate
642
- * method updates existing particles.
643
- *
644
- * If the emitter age is greater than time, the emitter is killed.
645
- *
646
- * This method also indexes/deindexes particles.
647
- *
648
- * @param {number} time - System engine time
649
- * @return void
650
- */
651
-
652
- }, {
653
- key: "update",
654
- value: function update(time) {
655
- if (!this.isEmitting && this.particles.length === 0) {
656
- return;
657
- }
658
-
659
- this.age += time;
660
-
661
- if (this.dead || this.age >= this.life) {
662
- this.destroy();
663
- }
664
-
665
- if (this.isEmitting) {
666
- this.generate(time);
667
- }
668
-
669
- this.integrate(time);
670
- var i = this.particles.length;
671
-
672
- while (i--) {
673
- var particle = this.particles[i];
674
-
675
- if (particle.dead) {
676
- this.parent && this.parent.dispatch(_events.PARTICLE_DEAD, particle);
677
- this.bindEmitterEvent && this.dispatch(_events.PARTICLE_DEAD, particle);
678
- this.parent.pool.expire(particle.reset());
679
- this.particles.splice(i, 1);
680
-
681
- if (this.particles.length === 0) {
682
- this.parent && this.parent.dispatch(_events.SYSTEM_UPDATE);
683
- }
684
- }
685
- }
686
-
687
- this.updateEmitterBehaviours(time);
688
- }
689
- /**
690
- * Updates the emitter's emitter behaviours.
691
- *
692
- * @param {number} time - System engine time
693
- * @return void
694
- */
695
-
696
- }, {
697
- key: "updateEmitterBehaviours",
698
- value: function updateEmitterBehaviours(time) {
699
- if (this.sleep) {
700
- return;
701
- }
702
-
703
- var length = this.emitterBehaviours.length;
704
-
705
- for (var i = 0; i < length; i++) {
706
- this.emitterBehaviours[i].applyBehaviour(this, time, i);
707
- }
708
- }
709
- /**
710
- * Runs the integration algorithm on the emitter and all particles.
711
- * Updates the particles with the timstamp passed.
712
- *
713
- * @param {number} time - System engine time
714
- * @return void
715
- */
716
-
717
- }, {
718
- key: "integrate",
719
- value: function integrate(time) {
720
- var integrationType = this.parent ? this.parent.integrationType : _math.INTEGRATION_TYPE_EULER;
721
- var damping = 1 - this.damping;
722
- (0, _math.integrate)(this, time, damping, integrationType);
723
- var index = this.particles.length;
724
-
725
- while (index--) {
726
- var particle = this.particles[index];
727
- particle.update(time, index);
728
- (0, _math.integrate)(particle, time, damping, integrationType);
729
- this.parent && this.parent.dispatch(_events.PARTICLE_UPDATE, particle);
730
- this.bindEmitterEvent && this.dispatch(_events.PARTICLE_UPDATE, particle);
731
- }
732
- }
733
- /**
734
- * Generates new particles.
735
- *
736
- * @param {number} time - System engine time
737
- * @return void
738
- */
739
-
740
- }, {
741
- key: "generate",
742
- value: function generate(time) {
743
- if (this.totalEmitTimes === 1) {
744
- var i = this.rate.getValue(99999);
745
-
746
- if (i > 0) {
747
- this.cID = i;
748
- }
749
-
750
- while (i--) {
751
- this.createParticle();
752
- }
753
-
754
- this.totalEmitTimes = 0;
755
- return;
756
- }
757
-
758
- this.currentEmitTime += time;
759
-
760
- if (this.currentEmitTime < this.totalEmitTimes) {
761
- var _i = this.rate.getValue(time);
762
-
763
- if (_i > 0) {
764
- this.cID = _i;
765
- }
766
-
767
- while (_i--) {
768
- this.createParticle();
769
- }
770
- }
771
- }
772
- /**
773
- * Kills the emitter.
774
- *
775
- * @return void
776
- */
777
-
778
- }, {
779
- key: "destroy",
780
- value: function destroy() {
781
- this.dead = true;
782
- this.energy = 0;
783
- this.totalEmitTimes = -1;
784
-
785
- if (this.particles.length == 0) {
786
- this.isEmitting = false;
787
- this.removeAllInitializers();
788
- this.removeAllBehaviours();
789
- this.dispatch("".concat(this.id, "_").concat(_events.EMITTER_DEAD));
790
- this.parent && this.parent.removeEmitter(this);
791
- }
792
- }
793
- }]);
794
- return Emitter;
795
- }(_Particle2["default"]);
796
-
797
- exports["default"] = Emitter;
798
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbWl0dGVyL0VtaXR0ZXIuanMiXSwibmFtZXMiOlsiRW1pdHRlciIsInByb3BlcnRpZXMiLCJ0eXBlIiwicGFydGljbGVzIiwiaW5pdGlhbGl6ZXJzIiwiYmVoYXZpb3VycyIsImVtaXR0ZXJCZWhhdmlvdXJzIiwiY3VycmVudEVtaXRUaW1lIiwidG90YWxFbWl0VGltZXMiLCJkYW1waW5nIiwiREVGQVVMVF9EQU1QSU5HIiwiYmluZEVtaXR0ZXIiLCJERUZBVUxUX0JJTkRfRU1JVFRFUiIsImJpbmRFbWl0dGVyRXZlbnQiLCJERUZBVUxUX0JJTkRfRU1JVFRFUl9FVkVOVCIsInJhdGUiLCJERUZBVUxUX0VNSVRURVJfUkFURSIsImlzRW1pdHRpbmciLCJpZCIsImNJRCIsIm5hbWUiLCJpbmRleCIsIkRFRkFVTFRfRU1JVFRFUl9JTkRFWCIsImV2ZW50RGlzcGF0Y2hlciIsIkV2ZW50RGlzcGF0Y2hlciIsImV2ZW50IiwidGFyZ2V0IiwiZGlzcGF0Y2hFdmVudCIsIm5ld1Bvc2l0aW9uIiwicG9zaXRpb24iLCJ4IiwieSIsInoiLCJzZXQiLCJuZXdSb3RhdGlvbiIsInJvdGF0aW9uIiwiSW5maW5pdHkiLCJsaWZlIiwiaW5pdCIsInNldFRvdGFsRW1pdFRpbWVzIiwic2V0TGlmZSIsImkiLCJsZW5ndGgiLCJkZWFkIiwiaW5pdGlhbGl6ZXIiLCJwdXNoIiwiYWRkSW5pdGlhbGl6ZXIiLCJpbmRleE9mIiwic3BsaWNlIiwiVXRpbCIsImRlc3Ryb3lBcnJheSIsImJlaGF2aW91ciIsImFkZEJlaGF2aW91ciIsImluaXRpYWxpemUiLCJhZGRFbWl0dGVyQmVoYXZpb3VyIiwib25FbWl0dGVyRGVhZCIsImFkZEV2ZW50TGlzdGVuZXIiLCJFTUlUVEVSX0RFQUQiLCJwYXJ0aWNsZSIsInBhcmVudCIsInBvb2wiLCJnZXQiLCJQYXJ0aWNsZSIsInNldHVwUGFydGljbGUiLCJkaXNwYXRjaCIsIlBBUlRJQ0xFX0NSRUFURUQiLCJJbml0aWFsaXplclV0aWwiLCJhZGRCZWhhdmlvdXJzIiwidGltZSIsImFnZSIsImRlc3Ryb3kiLCJnZW5lcmF0ZSIsImludGVncmF0ZSIsIlBBUlRJQ0xFX0RFQUQiLCJleHBpcmUiLCJyZXNldCIsIlNZU1RFTV9VUERBVEUiLCJ1cGRhdGVFbWl0dGVyQmVoYXZpb3VycyIsInNsZWVwIiwiYXBwbHlCZWhhdmlvdXIiLCJpbnRlZ3JhdGlvblR5cGUiLCJJTlRFR1JBVElPTl9UWVBFX0VVTEVSIiwidXBkYXRlIiwiUEFSVElDTEVfVVBEQVRFIiwiZ2V0VmFsdWUiLCJjcmVhdGVQYXJ0aWNsZSIsImVuZXJneSIsInJlbW92ZUFsbEluaXRpYWxpemVycyIsInJlbW92ZUFsbEJlaGF2aW91cnMiLCJyZW1vdmVFbWl0dGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFPQTs7QUFPQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7SUFDcUJBLE87Ozs7O0FBQ25CO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNFLG1CQUFZQyxVQUFaLEVBQXdCO0FBQUE7O0FBQUE7QUFDdEIsOEJBQU1BLFVBQU47QUFFQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxVQUFLQyxJQUFMLEdBQVlBLDJCQUFaO0FBRUE7QUFDSjtBQUNBO0FBQ0E7O0FBQ0ksVUFBS0MsU0FBTCxHQUFpQixFQUFqQjtBQUVBO0FBQ0o7QUFDQTtBQUNBOztBQUNJLFVBQUtDLFlBQUwsR0FBb0IsRUFBcEI7QUFFQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxVQUFLQyxVQUFMLEdBQWtCLEVBQWxCO0FBRUE7QUFDSjtBQUNBO0FBQ0E7O0FBQ0ksVUFBS0MsaUJBQUwsR0FBeUIsRUFBekI7QUFFQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxVQUFLQyxlQUFMLEdBQXVCLENBQXZCO0FBRUE7QUFDSjtBQUNBO0FBQ0E7O0FBQ0ksVUFBS0MsY0FBTCxHQUFzQixDQUFDLENBQXZC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V0FBSzFDLElBQUwsR0FBWSxJQUFaO0FBQ0EsV0FBSzJDLE1BQUwsR0FBYyxDQUFkO0FBQ0EsV0FBSzlFLGNBQUwsR0FBc0IsQ0FBQyxDQUF2Qjs7QUFFQSxVQUFJLEtBQUtMLFNBQUwsQ0FBZXVDLE1BQWYsSUFBeUIsQ0FBN0IsRUFBZ0M7QUFDOUIsYUFBS3pCLFVBQUwsR0FBa0IsS0FBbEI7QUFDQSxhQUFLc0UscUJBQUw7QUFDQSxhQUFLQyxtQkFBTDtBQUNBLGFBQUt4QixRQUFMLFdBQWlCLEtBQUs5QyxFQUF0QixjQUE0QnVDLG9CQUE1QjtBQUVBLGFBQUtFLE1BQUwsSUFBZSxLQUFLQSxNQUFMLENBQVk4QixhQUFaLENBQTBCLElBQTFCLENBQWY7QUFDRDtBQUNGOzs7RUFqcUJrQzNCLHFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgREVGQVVMVF9CSU5EX0VNSVRURVIsXG4gIERFRkFVTFRfQklORF9FTUlUVEVSX0VWRU5ULFxuICBERUZBVUxUX0RBTVBJTkcsXG4gIERFRkFVTFRfRU1JVFRFUl9JTkRFWCxcbiAgREVGQVVMVF9FTUlUVEVSX1JBVEUsXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCBFdmVudERpc3BhdGNoZXIsIHtcbiAgRU1JVFRFUl9ERUFELFxuICBQQVJUSUNMRV9DUkVBVEVELFxuICBQQVJUSUNMRV9ERUFELFxuICBQQVJUSUNMRV9VUERBVEUsXG4gIFNZU1RFTV9VUERBVEUsXG59IGZyb20gJy4uL2V2ZW50cyc7XG5pbXBvcnQgeyBJTlRFR1JBVElPTl9UWVBFX0VVTEVSLCBpbnRlZ3JhdGUgfSBmcm9tICcuLi9tYXRoJztcbmltcG9ydCB7IFV0aWwsIHVpZCB9IGZyb20gJy4uL3V0aWxzJztcblxuaW1wb3J0IHsgSW5pdGlhbGl6ZXJVdGlsIH0gZnJvbSAnLi4vaW5pdGlhbGl6ZXInO1xuaW1wb3J0IFBhcnRpY2xlIGZyb20gJy4uL2NvcmUvUGFydGljbGUnO1xuaW1wb3J0IGlzTnVtYmVyIGZyb20gJ2xvZGFzaC9pc051bWJlcic7XG5pbXBvcnQgeyBFTUlUVEVSX1RZUEVfRU1JVFRFUiBhcyB0eXBlIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogRW1pdHRlcnMgYXJlIHRoZSBTeXN0ZW0gZW5naW5lJ3MgcGFydGljbGUgZmFjdG9yaWVzLiBUaGV5IGNhdXNlIHBhcnRpY2xlcyB0b1xuICogYmUgcmVuZGVyZWQgYnkgZW1pdHRpbmcgdGhlbSwgYW5kIHN0b3JlIGFsbCBwYXJ0aWNsZSBpbml0aWFsaXplcnMgYW5kIGJlaGF2aW91cnMuXG4gKlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbWl0dGVyIGV4dGVuZHMgUGFydGljbGUge1xuICAvKipcbiAgICogQ29uc3RydWN0cyBhbiBFbWl0dGVyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gcHJvcGVydGllcyAtIFRoZSBwcm9wZXJ0aWVzIHRvIGluc3RhbnRpYXRlIHRoZSBlbWl0dGVyIHdpdGhcbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzKSB7XG4gICAgc3VwZXIocHJvcGVydGllcyk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgY2xhc3MgdHlwZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgcGFydGljbGVzIGVtaXR0ZWQgYnkgdGhpcyBlbWl0dGVyLlxuICAgICAqIEB0eXBlIHthcnJheX1cbiAgICAgKi9cbiAgICB0aGlzLnBhcnRpY2xlcyA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIGluaXRpYWxpemVycyBmb3IgcGFydGljbGVzIGVtaXR0ZWQgYnkgdGhpcyBlbWl0dGVyLlxuICAgICAqIEB0eXBlIHthcnJheX1cbiAgICAgKi9cbiAgICB0aGlzLmluaXRpYWxpemVycyA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIGJlaGF2aW91cnMgZm9yIHBhcnRpY2xlcyBlbWl0dGVkIGJ5IHRoaXMgZW1pdHRlci5cbiAgICAgKiBAdHlwZSB7YXJyYXl9XG4gICAgICovXG4gICAgdGhpcy5iZWhhdmlvdXJzID0gW107XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgYmVoYXZpb3VycyBmb3IgdGhlIGVtaXR0ZXIuXG4gICAgICogQHR5cGUge2FycmF5fVxuICAgICAqL1xuICAgIHRoaXMuZW1pdHRlckJlaGF2aW91cnMgPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBjdXJyZW50IGVtaXQgaXRlcmF0aW9uLlxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxuICAgICAqL1xuICAgIHRoaXMuY3VycmVudEVtaXRUaW1lID0gMDtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSB0b3RhbCBudW1iZXIgb2YgdGltZXMgdGhlIGVtaXR0ZXIgc2hvdWxkIGVtaXQgcGFydGljbGVzLlxuICAgICAqIEB0eXBlIHtpbnRlZ2VyfVxuICAgICAqL1xuICAgIHRoaXMudG90YWxFbWl0VGltZXMgPSAtMTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBmcmljdGlvbiBjb2VmZmljaWVudCBmb3IgYWxsIHBhcnRpY2xlIHRvIGVtaXQgYnkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICB0aGlzLmRhbXBpbmcgPSBERUZBVUxUX0RBTVBJTkc7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBFbnN1cmVzIHRoYXQgcGFydGljbGVzIGVtaXR0ZWQgYnkgdGhpcyBlbWl0dGVyIGFyZSBwb3NpdGlvbmVkXG4gICAgICogYWNjb3JkaW5nIHRvIHRoZSBlbWl0dGVyJ3MgcHJvcGVydGllcy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICB0aGlzLmJpbmRFbWl0dGVyID0gREVGQVVMVF9CSU5EX0VNSVRURVI7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBEZXRlcm1pbmVzIGlmIHRoZSBlbWl0dGVyIHdpbGwgZGlzcGF0Y2ggaW50ZXJuYWwgZXZlbnRzLiBEZWZhdWx0c1xuICAgICAqIHRvIGZhbHNlXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgdGhpcy5iaW5kRW1pdHRlckV2ZW50ID0gREVGQVVMVF9CSU5EX0VNSVRURVJfRVZFTlQ7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgbnVtYmVyIG9mIHBhcnRpY2xlcyB0byBlbWl0IHBlciBzZWNvbmQgKGEgW3BhcnRpY2xlXS9iIFtzXSlcbiAgICAgKiBAdHlwZSB7UmF0ZX1cbiAgICAgKi9cbiAgICB0aGlzLnJhdGUgPSBERUZBVUxUX0VNSVRURVJfUkFURTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIERldGVybWluZXMgaWYgdGhlIGVtaXR0ZXIgaXMgZW1pdHRpbmcgcGFydGljbGVzIG9yIG5vdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICB0aGlzLmlzRW1pdHRpbmcgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIFRoZSBlbWl0dGVyJ3MgaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLmlkID0gYGVtaXR0ZXItJHt1aWQoKX1gO1xuICAgIHRoaXMuY0lEID0gMDtcbiAgICB0aGlzLm5hbWUgPSAnRW1pdHRlcic7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyBUaGUgaW5kZXggb2YgdGhlIGVtaXR0ZXIgYXMgaXQgaXMgYWRkZWQgdG8gdGhlIHN5c3RlbS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH1cbiAgICAgKi9cbiAgICB0aGlzLmluZGV4ID0gREVGQVVMVF9FTUlUVEVSX0lOREVYO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2MgVGhlIGVtaXR0ZXIncyBpbnRlcm5hbCBldmVudCBkaXNwYXRjaGVyLlxuICAgICAqIEB0eXBlIHtFdmVudERpc3BhdGNoZXJ9XG4gICAgICovXG4gICAgdGhpcy5ldmVudERpc3BhdGNoZXIgPSBuZXcgRXZlbnREaXNwYXRjaGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogUHJveHkgbWV0aG9kIGZvciB0aGUgaW50ZXJuYWwgZXZlbnQgZGlzcGF0Y2hlcidzIGRpc3BhdGNoRXZlbnQgbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgLSBUaGUgZXZlbnQgdG8gZGlzcGF0Y2hcbiAgICogQHBhcmFtIHtvYmplY3Q8UGFydGljbGU+fSBbdGFyZ2V0PXRoaXNdIC0gVGhlIGV2ZW50IHRhcmdldFxuICAgKi9cbiAgZGlzcGF0Y2goZXZlbnQsIHRhcmdldCA9IHRoaXMpIHtcbiAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5kaXNwYXRjaEV2ZW50KGV2ZW50LCB0YXJnZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGVtaXR0ZXIgcmF0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtSYXRlfSByYXRlIC0gYSByYXRlIGluaXRpYWxpemVyIG9iamVjdFxuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgc2V0UmF0ZShyYXRlKSB7XG4gICAgdGhpcy5yYXRlID0gcmF0ZTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBlbWl0dGVyLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gbmV3UG9zaXRpb24gLSBhbiBvYmplY3QgdGhlIG5ldyB4LCB5IGFuZCB6IHByb3BzXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICBzZXRQb3NpdGlvbihuZXdQb3NpdGlvbiA9IHt9KSB7XG4gICAgY29uc3QgeyBwb3NpdGlvbiB9ID0gdGhpcztcbiAgICBjb25zdCB7IHggPSBwb3NpdGlvbi54LCB5ID0gcG9zaXRpb24ueSwgeiA9IHBvc2l0aW9uLnogfSA9IG5ld1Bvc2l0aW9uO1xuXG4gICAgdGhpcy5wb3NpdGlvbi5zZXQoeCwgeSwgeik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSByb3RhdGlvbiBvZiB0aGUgZW1pdHRlci5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG5ld1JvdGF0aW9uIC0gYW4gb2JqZWN0IHRoZSBuZXcgeCwgeSBhbmQgeiBwcm9wc1xuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgc2V0Um90YXRpb24obmV3Um90YXRpb24gPSB7fSkge1xuICAgIGNvbnN0IHsgcm90YXRpb24gfSA9IHRoaXM7XG4gICAgY29uc3QgeyB4ID0gcm90YXRpb24ueCwgeSA9IHJvdGF0aW9uLnksIHogPSByb3RhdGlvbi56IH0gPSBuZXdSb3RhdGlvbjtcblxuICAgIHRoaXMucm90YXRpb24uc2V0KHgsIHksIHopO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRoZSBlbWl0dGVyIHNob3VsZCBlbWl0IHBhcnRpY2xlcyBhcyB3ZWxsIGFzXG4gICAqIHRoZSBlbWl0dGVyJ3MgbGlmZS4gQWxzbyBpbnRpYWxpemVzIHRoZSBlbWl0dGVyIHJhdGUuXG4gICAqIFRoaXMgZW5hYmxlcyB0aGUgZW1pdHRlciB0byBlbWl0IHBhcnRpY2xlcy5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IFt0b3RhbEVtaXRUaW1lcz1JbmZpbml0eV0gLSB0aGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRvIGVtaXQgcGFydGljbGVzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbGlmZT1JbmZpbml0eV0gLSB0aGUgbGlmZSBvZiB0aGlzIGVtaXR0ZXIgaW4gbWlsbGlzZWNvbmRzXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICBlbWl0KHRvdGFsRW1pdFRpbWVzID0gSW5maW5pdHksIGxpZmUgPSBJbmZpbml0eSkge1xuICAgIHRoaXMuY3VycmVudEVtaXRUaW1lID0gMDtcbiAgICB0aGlzLnRvdGFsRW1pdFRpbWVzID0gaXNOdW1iZXIodG90YWxFbWl0VGltZXMpID8gdG90YWxFbWl0VGltZXMgOiBJbmZpbml0eTtcblxuICAgIGlmICh0b3RhbEVtaXRUaW1lcyA9PT0gMSkge1xuICAgICAgdGhpcy5saWZlID0gdG90YWxFbWl0VGltZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGlmZSA9IGlzTnVtYmVyKGxpZmUpID8gbGlmZSA6IEluZmluaXR5O1xuICAgIH1cblxuICAgIHRoaXMucmF0ZS5pbml0KCk7XG4gICAgdGhpcy5pc0VtaXR0aW5nID0gdHJ1ZTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGVyaW1lbnRhbCBlbWl0IG1ldGhvZCB0aGF0IGlzIGRlc2lnbmVkIHRvIGJlIGNhbGxlZCBmcm9tIHRoZSBTeXN0ZW0uZW1pdCBtZXRob2QuXG4gICAqXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICBleHBlcmltZW50YWxfZW1pdCgpIHtcbiAgICBjb25zdCB7IGlzRW1pdHRpbmcsIHRvdGFsRW1pdFRpbWVzLCBsaWZlIH0gPSB0aGlzO1xuXG4gICAgaWYgKCFpc0VtaXR0aW5nKSB7XG4gICAgICB0aGlzLmN1cnJlbnRFbWl0VGltZSA9IDA7XG5cbiAgICAgIGlmICghdG90YWxFbWl0VGltZXMpIHtcbiAgICAgICAgdGhpcy5zZXRUb3RhbEVtaXRUaW1lcyhJbmZpbml0eSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghbGlmZSkge1xuICAgICAgICB0aGlzLnNldExpZmUoSW5maW5pdHkpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJhdGUuaW5pdCgpO1xuICAgICAgdGhpcy5pc0VtaXR0aW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB0b3RhbCBlbWl0IHRpbWVzIGZvciB0aGUgZW1pdHRlci5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IFt0b3RhbEVtaXRUaW1lcz1JbmZpbml0eV0gLSB0aGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRvIGVtaXQgcGFydGljbGVzXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICBzZXRUb3RhbEVtaXRUaW1lcyh0b3RhbEVtaXRUaW1lcyA9IEluZmluaXR5KSB7XG4gICAgdGhpcy50b3RhbEVtaXRUaW1lcyA9IGlzTnVtYmVyKHRvdGFsRW1pdFRpbWVzKSA/IHRvdGFsRW1pdFRpbWVzIDogSW5maW5pdHk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBsaWZlIG9mIHRoZSBlbWl0dGVyLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2xpZmU9SW5maW5pdHldIC0gdGhlIGxpZmUgb2YgdGhpcyBlbWl0dGVyIGluIG1pbGxpc2Vjb25kc1xuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgc2V0TGlmZShsaWZlID0gSW5maW5pdHkpIHtcbiAgICBpZiAodGhpcy50b3RhbEVtaXRUaW1lcyA9PT0gMSkge1xuICAgICAgdGhpcy5saWZlID0gdGhpcy50b3RhbEVtaXRUaW1lcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5saWZlID0gaXNOdW1iZXIobGlmZSkgPyBsaWZlIDogSW5maW5pdHk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIGVtaXR0ZXIgZnJvbSBlbWl0dGluZyBwYXJ0aWNsZXMuXG4gICAqXG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgc3RvcEVtaXQoKSB7XG4gICAgdGhpcy50b3RhbEVtaXRUaW1lcyA9IC0xO1xuICAgIHRoaXMuY3VycmVudEVtaXRUaW1lID0gMDtcbiAgICB0aGlzLmlzRW1pdHRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBLaWxscyBhbGwgb2YgdGhlIGVtaXR0ZXIncyBwYXJ0aWNsZXMuXG4gICAqXG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgcmVtb3ZlQWxsUGFydGljbGVzKCkge1xuICAgIGxldCBpID0gdGhpcy5wYXJ0aWNsZXMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgdGhpcy5wYXJ0aWNsZXNbaV0uZGVhZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBwYXJ0aWNsZSBpbml0aWFsaXplciB0byB0aGUgZW1pdHRlci5cbiAgICogRWFjaCBpbml0aWFsaXplciBpcyBydW4gb24gZWFjaCBwYXJ0aWNsZSB3aGVuIHRoZXkgYXJlIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7SW5pdGlhbGl6ZXJ9IGluaXRpYWxpemVyIC0gVGhlIGluaXRpYWxpemVyIHRvIGFkZFxuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgYWRkSW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXIpIHtcbiAgICB0aGlzLmluaXRpYWxpemVycy5wdXNoKGluaXRpYWxpemVyKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgbXVsdGlwbGUgcGFydGljbGUgaW5pdGlhbGl6ZXJzIHRvIHRoZSBlbWl0dGVyLlxuICAgKlxuICAgKiBAcGFyYW0ge2FycmF5PEluaXRpYWxpemVyPn0gaW5pdGlhbGl6ZXJzIC0gYW4gYXJyYXkgb2YgcGFydGljbGUgaW5pdGlhbGl6ZXJzXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICBhZGRJbml0aWFsaXplcnMoaW5pdGlhbGl6ZXJzKSB7XG4gICAgbGV0IGkgPSBpbml0aWFsaXplcnMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgdGhpcy5hZGRJbml0aWFsaXplcihpbml0aWFsaXplcnNbaV0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGVtaXR0ZXIncyBwYXJ0aWNsZSBpbml0aWFsaXplcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXk8SW5pdGlhbGl6ZXI+fSBpbml0aWFsaXplcnMgLSBhbiBhcnJheSBvZiBwYXJ0aWNsZSBpbml0aWFsaXplcnNcbiAgICogQHJldHVybiB7RW1pdHRlcn1cbiAgICovXG4gIHNldEluaXRpYWxpemVycyhpbml0aWFsaXplcnMpIHtcbiAgICB0aGlzLmluaXRpYWxpemVycyA9IGluaXRpYWxpemVycztcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gaW5pdGlhbGl6ZXIgZnJvbSB0aGUgZW1pdHRlcidzIGluaXRpYWxpemVycyBhcnJheS5cbiAgICpcbiAgICogQHBhcmFtIHtJbml0aWFsaXplcn0gaW5pdGlhbGl6ZXIgLSBUaGUgaW5pdGlhbGl6ZXIgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICByZW1vdmVJbml0aWFsaXplcihpbml0aWFsaXplcikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbml0aWFsaXplcnMuaW5kZXhPZihpbml0aWFsaXplcik7XG5cbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgdGhpcy5pbml0aWFsaXplcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFsbCBpbml0aWFsaXplcnMuXG4gICAqXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICByZW1vdmVBbGxJbml0aWFsaXplcnMoKSB7XG4gICAgVXRpbC5kZXN0cm95QXJyYXkodGhpcy5pbml0aWFsaXplcnMpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGJlaGF2aW91ciB0byB0aGUgZW1pdHRlci4gQWxsIGVtaXR0ZXIgYmVoYXZpb3VycyBhcmUgYWRkZWQgdG8gZWFjaCBwYXJ0aWNsZSB3aGVuXG4gICAqIHRoZXkgYXJlIGVtaXR0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7QmVoYXZpb3VyfSBiZWhhdmlvdXIgLSBUaGUgYmVoYXZpb3VyIHRvIGFkZCB0byB0aGUgZW1pdHRlclxuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgYWRkQmVoYXZpb3VyKGJlaGF2aW91cikge1xuICAgIHRoaXMuYmVoYXZpb3Vycy5wdXNoKGJlaGF2aW91cik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIG11bHRpcGxlIGJlaGF2aW91cnMgdG8gdGhlIGVtaXR0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXk8QmVoYXZpb3VyPn0gYmVoYXZpb3VycyAtIGFuIGFycmF5IG9mIGVtaXR0ZXIgYmVoYXZpb3Vyc1xuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgYWRkQmVoYXZpb3VycyhiZWhhdmlvdXJzKSB7XG4gICAgbGV0IGkgPSBiZWhhdmlvdXJzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHRoaXMuYWRkQmVoYXZpb3VyKGJlaGF2aW91cnNbaV0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGVtaXR0ZXIncyBiZWhhdmlvdXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge2FycmF5PEJlaGF2aW91cj59IGJlaGF2aW91cnMgLSBhbiBhcnJheSBvZiBlbWl0dGVyIGJlaGF2aW91cnNcbiAgICogQHJldHVybiB7RW1pdHRlcn1cbiAgICovXG4gIHNldEJlaGF2aW91cnMoYmVoYXZpb3Vycykge1xuICAgIHRoaXMuYmVoYXZpb3VycyA9IGJlaGF2aW91cnM7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBiZWhhdmlvdXIgZnJvbSB0aGUgZW1pdHRlcidzIGJlaGF2aW91cnMgYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSB7QmVoYXZpb3VyfSBiZWhhdmlvdXIgLSBUaGUgYmVoYXZpb3VyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgcmVtb3ZlQmVoYXZpb3VyKGJlaGF2aW91cikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5iZWhhdmlvdXJzLmluZGV4T2YoYmVoYXZpb3VyKTtcblxuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLmJlaGF2aW91cnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFsbCBiZWhhdmlvdXJzIGZyb20gdGhlIGVtaXR0ZXIuXG4gICAqXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICByZW1vdmVBbGxCZWhhdmlvdXJzKCkge1xuICAgIFV0aWwuZGVzdHJveUFycmF5KHRoaXMuYmVoYXZpb3Vycyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGVtaXR0ZXIgYmVoYXZpb3VyIHRvIHRoZSBlbWl0dGVyLlxuICAgKlxuICAgKiBAcGFyYW0ge0JlaGF2aW91cn0gYmVoYXZpb3VyIC0gVGhlIGJlaGF2aW91ciB0byBhZGQgdG8gdGhlIGVtaXR0ZXJcbiAgICogQHJldHVybiB7RW1pdHRlcn1cbiAgICovXG4gIGFkZEVtaXR0ZXJCZWhhdmlvdXIoYmVoYXZpb3VyKSB7XG4gICAgdGhpcy5lbWl0dGVyQmVoYXZpb3Vycy5wdXNoKGJlaGF2aW91cik7XG5cbiAgICBiZWhhdmlvdXIuaW5pdGlhbGl6ZSh0aGlzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgbXVsdGlwbGUgYmVoYXZpb3VycyB0byB0aGUgZW1pdHRlci5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheTxCZWhhdmlvdXI+fSBiZWhhdmlvdXJzIC0gYW4gYXJyYXkgb2YgZW1pdHRlciBiZWhhdmlvdXJzXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICBhZGRFbWl0dGVyQmVoYXZpb3VycyhiZWhhdmlvdXJzKSB7XG4gICAgbGV0IGkgPSBiZWhhdmlvdXJzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHRoaXMuYWRkRW1pdHRlckJlaGF2aW91cihiZWhhdmlvdXJzW2ldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBlbWl0dGVyJ3MgYmVoYXZpb3Vycy5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheTxCZWhhdmlvdXI+fSBiZWhhdmlvdXJzIC0gYW4gYXJyYXkgb2YgZW1pdHRlciBiZWhhdmlvdXJzXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICBzZXRFbWl0dGVyQmVoYXZpb3VycyhiZWhhdmlvdXJzKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gYmVoYXZpb3Vycy5sZW5ndGg7XG5cbiAgICB0aGlzLmVtaXR0ZXJCZWhhdmlvdXJzID0gYmVoYXZpb3VycztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZW1pdHRlckJlaGF2aW91cnNbaV0uaW5pdGlhbGl6ZSh0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBiZWhhdmlvdXIgZnJvbSB0aGUgZW1pdHRlcidzIGJlaGF2aW91cnMgYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSB7QmVoYXZpb3VyfSBiZWhhdmlvdXIgLSBUaGUgYmVoYXZpb3VyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJuIHtFbWl0dGVyfVxuICAgKi9cbiAgcmVtb3ZlRW1pdHRlckJlaGF2aW91cihiZWhhdmlvdXIpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZW1pdHRlckJlaGF2aW91cnMuaW5kZXhPZihiZWhhdmlvdXIpO1xuXG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuZW1pdHRlckJlaGF2aW91cnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFsbCBiZWhhdmlvdXJzIGZyb20gdGhlIGVtaXR0ZXIuXG4gICAqXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICByZW1vdmVBbGxFbWl0dGVyQmVoYXZpb3VycygpIHtcbiAgICBVdGlsLmRlc3Ryb3lBcnJheSh0aGlzLmVtaXR0ZXJCZWhhdmlvdXJzKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdGhlIGV2ZW50IGxpc3RlbmVyIGZvciB0aGUgRU1JVFRFUl9ERUFEIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge29uRW1pdHRlckRlYWR9IC0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgRU1JVFRFUl9ERUFEIGlzIGRpc3BhdGNoZWQuXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICBhZGRPbkVtaXR0ZXJEZWFkRXZlbnRMaXN0ZW5lcihvbkVtaXR0ZXJEZWFkKSB7XG4gICAgdGhpcy5ldmVudERpc3BhdGNoZXIuYWRkRXZlbnRMaXN0ZW5lcihgJHt0aGlzLmlkfV8ke0VNSVRURVJfREVBRH1gLCAoKSA9PlxuICAgICAgb25FbWl0dGVyRGVhZCgpXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBwYXJ0aWNsZSBieSByZXRyZWl2aW5nIG9uZSBmcm9tIHRoZSBwb29sIGFuZCBzZXR0aW5nIGl0IHVwIHdpdGhcbiAgICogdGhlIHN1cHBsaWVkIGluaXRpYWxpemVyIGFuZCBiZWhhdmlvdXIuXG4gICAqXG4gICAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gICAqL1xuICBjcmVhdGVQYXJ0aWNsZSgpIHtcbiAgICBjb25zdCBwYXJ0aWNsZSA9IHRoaXMucGFyZW50LnBvb2wuZ2V0KFBhcnRpY2xlKTtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMucGFydGljbGVzLmxlbmd0aDtcblxuICAgIHRoaXMuc2V0dXBQYXJ0aWNsZShwYXJ0aWNsZSwgaW5kZXgpO1xuICAgIHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LmRpc3BhdGNoKFBBUlRJQ0xFX0NSRUFURUQsIHBhcnRpY2xlKTtcbiAgICB0aGlzLmJpbmRFbWl0dGVyRXZlbnQgJiYgdGhpcy5kaXNwYXRjaChQQVJUSUNMRV9DUkVBVEVELCBwYXJ0aWNsZSk7XG5cbiAgICByZXR1cm4gcGFydGljbGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCBhIHBhcnRpY2xlIGJ5IHJ1bm5pbmcgYWxsIGluaXRpYWxpemVycyBvbiBpdCBhbmQgc2V0dGluZyBpdHMgYmVoYXZpb3Vycy5cbiAgICogQWxzbyBhZGRzIHRoZSBwYXJ0aWNsZSB0byB0aGlzLnBhcnRpY2xlcy5cbiAgICpcbiAgICogQHBhcmFtIHtQYXJ0aWNsZX0gcGFydGljbGUgLSBUaGUgcGFydGljbGUgdG8gc2V0dXBcbiAgICogQHJldHVybiB2b2lkXG4gICAqL1xuICBzZXR1cFBhcnRpY2xlKHBhcnRpY2xlLCBpbmRleCkge1xuICAgIGNvbnN0IHsgaW5pdGlhbGl6ZXJzLCBiZWhhdmlvdXJzIH0gPSB0aGlzO1xuXG4gICAgSW5pdGlhbGl6ZXJVdGlsLmluaXRpYWxpemUodGhpcywgcGFydGljbGUsIGluaXRpYWxpemVycyk7XG5cbiAgICBwYXJ0aWNsZS5hZGRCZWhhdmlvdXJzKGJlaGF2aW91cnMpO1xuICAgIHBhcnRpY2xlLnBhcmVudCA9IHRoaXM7XG4gICAgcGFydGljbGUuaW5kZXggPSBpbmRleDtcblxuICAgIHRoaXMucGFydGljbGVzLnB1c2gocGFydGljbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGVtaXR0ZXIgYWNjb3JkaW5nIHRvIHRoZSB0aW1lIHBhc3NlZCBieSBjYWxsaW5nIHRoZSBnZW5lcmF0ZVxuICAgKiBhbmQgaW50ZWdyYXRlIG1ldGhvZHMuIFRoZSBnZW5lcmF0ZSBtZXRob2QgY3JlYXRlcyBwYXJ0aWNsZXMsIHRoZSBpbnRlZ3JhdGVcbiAgICogbWV0aG9kIHVwZGF0ZXMgZXhpc3RpbmcgcGFydGljbGVzLlxuICAgKlxuICAgKiBJZiB0aGUgZW1pdHRlciBhZ2UgaXMgZ3JlYXRlciB0aGFuIHRpbWUsIHRoZSBlbWl0dGVyIGlzIGtpbGxlZC5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgYWxzbyBpbmRleGVzL2RlaW5kZXhlcyBwYXJ0aWNsZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIC0gU3lzdGVtIGVuZ2luZSB0aW1lXG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgdXBkYXRlKHRpbWUpIHtcbiAgICBpZiAoIXRoaXMuaXNFbWl0dGluZyAmJiB0aGlzLnBhcnRpY2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFnZSArPSB0aW1lO1xuXG4gICAgaWYgKHRoaXMuZGVhZCB8fCB0aGlzLmFnZSA+PSB0aGlzLmxpZmUpIHtcbiAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzRW1pdHRpbmcpXG4gICAge1xuICAgICAgdGhpcy5nZW5lcmF0ZSh0aW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLmludGVncmF0ZSh0aW1lKTtcblxuICAgIGxldCBpID0gdGhpcy5wYXJ0aWNsZXMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgY29uc3QgcGFydGljbGUgPSB0aGlzLnBhcnRpY2xlc1tpXTtcblxuICAgICAgaWYgKHBhcnRpY2xlLmRlYWQpIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQuZGlzcGF0Y2goUEFSVElDTEVfREVBRCwgcGFydGljbGUpO1xuICAgICAgICB0aGlzLmJpbmRFbWl0dGVyRXZlbnQgJiYgdGhpcy5kaXNwYXRjaChQQVJUSUNMRV9ERUFELCBwYXJ0aWNsZSk7XG4gICAgICAgIHRoaXMucGFyZW50LnBvb2wuZXhwaXJlKHBhcnRpY2xlLnJlc2V0KCkpO1xuICAgICAgICB0aGlzLnBhcnRpY2xlcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGlmKHRoaXMucGFydGljbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAge1xuICAgICAgICAgIHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LmRpc3BhdGNoKFNZU1RFTV9VUERBVEUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVFbWl0dGVyQmVoYXZpb3Vycyh0aW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBlbWl0dGVyJ3MgZW1pdHRlciBiZWhhdmlvdXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFN5c3RlbSBlbmdpbmUgdGltZVxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIHVwZGF0ZUVtaXR0ZXJCZWhhdmlvdXJzKHRpbWUpIHtcbiAgICBpZiAodGhpcy5zbGVlcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMuZW1pdHRlckJlaGF2aW91cnMubGVuZ3RoO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbWl0dGVyQmVoYXZpb3Vyc1tpXS5hcHBseUJlaGF2aW91cih0aGlzLCB0aW1lLCBpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyB0aGUgaW50ZWdyYXRpb24gYWxnb3JpdGhtIG9uIHRoZSBlbWl0dGVyIGFuZCBhbGwgcGFydGljbGVzLlxuICAgKiBVcGRhdGVzIHRoZSBwYXJ0aWNsZXMgd2l0aCB0aGUgdGltc3RhbXAgcGFzc2VkLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZSAtIFN5c3RlbSBlbmdpbmUgdGltZVxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIGludGVncmF0ZSh0aW1lKSB7XG4gICAgY29uc3QgaW50ZWdyYXRpb25UeXBlID0gdGhpcy5wYXJlbnRcbiAgICAgID8gdGhpcy5wYXJlbnQuaW50ZWdyYXRpb25UeXBlXG4gICAgICA6IElOVEVHUkFUSU9OX1RZUEVfRVVMRVI7XG4gICAgY29uc3QgZGFtcGluZyA9IDEgLSB0aGlzLmRhbXBpbmc7XG5cbiAgICBpbnRlZ3JhdGUodGhpcywgdGltZSwgZGFtcGluZywgaW50ZWdyYXRpb25UeXBlKTtcblxuICAgIGxldCBpbmRleCA9IHRoaXMucGFydGljbGVzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICBjb25zdCBwYXJ0aWNsZSA9IHRoaXMucGFydGljbGVzW2luZGV4XTtcblxuICAgICAgcGFydGljbGUudXBkYXRlKHRpbWUsIGluZGV4KTtcbiAgICAgIGludGVncmF0ZShwYXJ0aWNsZSwgdGltZSwgZGFtcGluZywgaW50ZWdyYXRpb25UeXBlKTtcblxuICAgICAgdGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQuZGlzcGF0Y2goUEFSVElDTEVfVVBEQVRFLCBwYXJ0aWNsZSk7XG4gICAgICB0aGlzLmJpbmRFbWl0dGVyRXZlbnQgJiYgdGhpcy5kaXNwYXRjaChQQVJUSUNMRV9VUERBVEUsIHBhcnRpY2xlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIG5ldyBwYXJ0aWNsZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lIC0gU3lzdGVtIGVuZ2luZSB0aW1lXG4gICAqIEByZXR1cm4gdm9pZFxuICAgKi9cbiAgZ2VuZXJhdGUodGltZSkge1xuICAgIGlmICh0aGlzLnRvdGFsRW1pdFRpbWVzID09PSAxKSB7XG4gICAgICBsZXQgaSA9IHRoaXMucmF0ZS5nZXRWYWx1ZSg5OTk5OSk7XG5cbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICB0aGlzLmNJRCA9IGk7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgdGhpcy5jcmVhdGVQYXJ0aWNsZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnRvdGFsRW1pdFRpbWVzID0gMDtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudEVtaXRUaW1lICs9IHRpbWU7XG5cbiAgICBpZiAodGhpcy5jdXJyZW50RW1pdFRpbWUgPCB0aGlzLnRvdGFsRW1pdFRpbWVzKSB7XG4gICAgICBsZXQgaSA9IHRoaXMucmF0ZS5nZXRWYWx1ZSh0aW1lKTtcblxuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIHRoaXMuY0lEID0gaTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICB0aGlzLmNyZWF0ZVBhcnRpY2xlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEtpbGxzIHRoZSBlbWl0dGVyLlxuICAgKlxuICAgKiBAcmV0dXJuIHZvaWRcbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZWFkID0gdHJ1ZTtcbiAgICB0aGlzLmVuZXJneSA9IDA7XG4gICAgdGhpcy50b3RhbEVtaXRUaW1lcyA9IC0xO1xuXG4gICAgaWYgKHRoaXMucGFydGljbGVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aGlzLmlzRW1pdHRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVtb3ZlQWxsSW5pdGlhbGl6ZXJzKCk7XG4gICAgICB0aGlzLnJlbW92ZUFsbEJlaGF2aW91cnMoKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2goYCR7dGhpcy5pZH1fJHtFTUlUVEVSX0RFQUR9YCk7XG5cbiAgICAgIHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LnJlbW92ZUVtaXR0ZXIodGhpcyk7XG4gICAgfVxuICB9XG59XG4iXX0=