@pie-lib/plot 3.1.1-next.1 → 3.2.0-next.2

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.
@@ -0,0 +1,285 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
5
+ var _react = require("@testing-library/react");
6
+ var _react2 = _interopRequireDefault(require("react"));
7
+ var _root = require("../root");
8
+ var _d3Selection = require("d3-selection");
9
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
10
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
11
+ jest.mock('d3-selection', function () {
12
+ return {
13
+ select: jest.fn(),
14
+ pointer: jest.fn()
15
+ };
16
+ });
17
+ var scaleMock = function scaleMock() {
18
+ var fn = jest.fn(function (n) {
19
+ return n;
20
+ });
21
+ fn.invert = jest.fn(function (n) {
22
+ return n;
23
+ });
24
+ return fn;
25
+ };
26
+ var graphProps = function graphProps() {
27
+ return {
28
+ scale: {
29
+ x: scaleMock(),
30
+ y: scaleMock()
31
+ },
32
+ snap: {
33
+ x: jest.fn(function (n) {
34
+ return n;
35
+ }),
36
+ y: jest.fn(function (n) {
37
+ return n;
38
+ })
39
+ },
40
+ domain: {
41
+ min: 0,
42
+ max: 1,
43
+ step: 1
44
+ },
45
+ range: {
46
+ min: 0,
47
+ max: 1,
48
+ step: 1
49
+ },
50
+ size: {
51
+ width: 400,
52
+ height: 400
53
+ }
54
+ };
55
+ };
56
+ describe('root', function () {
57
+ var mockOn;
58
+ var defaultProps;
59
+ beforeEach(function () {
60
+ mockOn = jest.fn();
61
+ _d3Selection.select.mockReturnValue({
62
+ on: mockOn
63
+ });
64
+ _d3Selection.pointer.mockReturnValue([0, 0]);
65
+ defaultProps = {
66
+ classes: {},
67
+ graphProps: graphProps()
68
+ };
69
+ });
70
+ afterEach(function () {
71
+ (0, _react.cleanup)();
72
+ jest.clearAllMocks();
73
+ });
74
+ it('renders with children', function () {
75
+ var _render = (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_root.Root, defaultProps, "hi")),
76
+ container = _render.container,
77
+ getByText = _render.getByText;
78
+ expect(container.firstChild).toBeInTheDocument();
79
+ expect(getByText('hi')).toBeInTheDocument();
80
+ });
81
+ describe('logic', function () {
82
+ describe('mousemove', function () {
83
+ describe('mount/unmount', function () {
84
+ it('adds mousemove listener on componentDidMount', function () {
85
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_root.Root, defaultProps, "hi"));
86
+
87
+ // Verify that select was called with the g element
88
+ expect(_d3Selection.select).toHaveBeenCalled();
89
+
90
+ // Verify that on() was called with 'mousemove' and a function
91
+ expect(mockOn).toHaveBeenCalledWith('mousemove', expect.any(Function));
92
+ });
93
+ it('removes mousemove listener on componentWillUnmount', function () {
94
+ var _render2 = (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_root.Root, defaultProps, "hi")),
95
+ unmount = _render2.unmount;
96
+
97
+ // Clear previous calls to isolate unmount behavior
98
+ mockOn.mockClear();
99
+ _d3Selection.select.mockClear();
100
+ unmount();
101
+
102
+ // Verify that select was called during unmount
103
+ expect(_d3Selection.select).toHaveBeenCalled();
104
+
105
+ // Verify that on() was called with 'mousemove' and null to remove the listener
106
+ expect(mockOn).toHaveBeenCalledWith('mousemove', null);
107
+ });
108
+ });
109
+ describe('mouseMove function', function () {
110
+ it('calls pointer with correct arguments', function () {
111
+ var onMouseMove = jest.fn();
112
+ var gp = graphProps();
113
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
114
+ onMouseMove: onMouseMove,
115
+ graphProps: gp
116
+ });
117
+ var mockNode = document.createElement('div');
118
+ var mockEvent = {
119
+ clientX: 10,
120
+ clientY: 20
121
+ };
122
+ var mockSelection = {
123
+ _groups: [[mockNode]],
124
+ node: function node() {
125
+ return mockNode;
126
+ }
127
+ };
128
+
129
+ // Mock select to return our mockSelection
130
+ _d3Selection.select.mockReturnValue(_objectSpread(_objectSpread({}, mockSelection), {}, {
131
+ on: function on(event, handler) {
132
+ mockOn(event, handler);
133
+ // When 'mousemove' is registered, immediately test it
134
+ if (event === 'mousemove' && handler) {
135
+ _d3Selection.pointer.mockReturnValue([10, 20]);
136
+ // Handler is bound with mockSelection as first arg, so call with event
137
+ handler(mockEvent);
138
+ }
139
+ }
140
+ }));
141
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_root.Root, props, "hi"));
142
+
143
+ // Verify pointer was called with the event and correct node
144
+ expect(_d3Selection.pointer).toHaveBeenCalledWith(mockEvent, mockNode);
145
+ });
146
+ it('calls scale.x.invert and scale.y.invert', function () {
147
+ var onMouseMove = jest.fn();
148
+ var gp = graphProps();
149
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
150
+ onMouseMove: onMouseMove,
151
+ graphProps: gp
152
+ });
153
+ var mockNode = document.createElement('div');
154
+ var mockEvent = {
155
+ clientX: 15,
156
+ clientY: 25
157
+ };
158
+ var mockSelection = {
159
+ _groups: [[mockNode]],
160
+ node: function node() {
161
+ return mockNode;
162
+ }
163
+ };
164
+ _d3Selection.select.mockReturnValue(_objectSpread(_objectSpread({}, mockSelection), {}, {
165
+ on: function on(event, handler) {
166
+ mockOn(event, handler);
167
+ if (event === 'mousemove' && handler) {
168
+ _d3Selection.pointer.mockReturnValue([15, 25]);
169
+ handler(mockEvent);
170
+ }
171
+ }
172
+ }));
173
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_root.Root, props, "hi"));
174
+ expect(gp.scale.x.invert).toHaveBeenCalledWith(15);
175
+ expect(gp.scale.y.invert).toHaveBeenCalledWith(25);
176
+ });
177
+ it('calls snap.x and snap.y with inverted coordinates', function () {
178
+ var onMouseMove = jest.fn();
179
+ var gp = graphProps();
180
+ gp.scale.x.invert = jest.fn().mockReturnValue(5);
181
+ gp.scale.y.invert = jest.fn().mockReturnValue(10);
182
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
183
+ onMouseMove: onMouseMove,
184
+ graphProps: gp
185
+ });
186
+ var mockNode = document.createElement('div');
187
+ var mockEvent = {
188
+ clientX: 100,
189
+ clientY: 200
190
+ };
191
+ var mockSelection = {
192
+ _groups: [[mockNode]],
193
+ node: function node() {
194
+ return mockNode;
195
+ }
196
+ };
197
+ _d3Selection.select.mockReturnValue(_objectSpread(_objectSpread({}, mockSelection), {}, {
198
+ on: function on(event, handler) {
199
+ mockOn(event, handler);
200
+ if (event === 'mousemove' && handler) {
201
+ _d3Selection.pointer.mockReturnValue([100, 200]);
202
+ handler();
203
+ }
204
+ }
205
+ }));
206
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_root.Root, props, "hi"));
207
+ expect(gp.snap.x).toHaveBeenCalledWith(5);
208
+ expect(gp.snap.y).toHaveBeenCalledWith(10);
209
+ });
210
+ it('calls onMouseMove handler with snapped coordinates', function () {
211
+ var onMouseMove = jest.fn();
212
+ var gp = graphProps();
213
+ gp.scale.x.invert = jest.fn().mockReturnValue(7);
214
+ gp.scale.y.invert = jest.fn().mockReturnValue(14);
215
+ gp.snap.x = jest.fn().mockReturnValue(10);
216
+ gp.snap.y = jest.fn().mockReturnValue(15);
217
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
218
+ onMouseMove: onMouseMove,
219
+ graphProps: gp
220
+ });
221
+ var mockNode = document.createElement('div');
222
+ var mockEvent = {
223
+ clientX: 100,
224
+ clientY: 200
225
+ };
226
+ var mockSelection = {
227
+ _groups: [[mockNode]],
228
+ node: function node() {
229
+ return mockNode;
230
+ }
231
+ };
232
+ _d3Selection.select.mockReturnValue(_objectSpread(_objectSpread({}, mockSelection), {}, {
233
+ on: function on(event, handler) {
234
+ mockOn(event, handler);
235
+ if (event === 'mousemove' && handler) {
236
+ _d3Selection.pointer.mockReturnValue([100, 200]);
237
+ handler(mockEvent);
238
+ }
239
+ }
240
+ }));
241
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_root.Root, props, "hi"));
242
+ expect(onMouseMove).toHaveBeenCalledWith({
243
+ x: 10,
244
+ y: 15
245
+ });
246
+ });
247
+ it('does not call onMouseMove when handler is not provided', function () {
248
+ var gp = graphProps();
249
+ var props = _objectSpread(_objectSpread({}, defaultProps), {}, {
250
+ graphProps: gp
251
+ });
252
+ var mockNode = document.createElement('div');
253
+ var mockEvent = {
254
+ clientX: 100,
255
+ clientY: 200
256
+ };
257
+ var mockSelection = {
258
+ _groups: [[mockNode]],
259
+ node: function node() {
260
+ return mockNode;
261
+ }
262
+ };
263
+ _d3Selection.select.mockReturnValue(_objectSpread(_objectSpread({}, mockSelection), {}, {
264
+ on: function on(event, handler) {
265
+ mockOn(event, handler);
266
+ if (event === 'mousemove' && handler) {
267
+ _d3Selection.pointer.mockReturnValue([100, 200]);
268
+ // Should not throw error when onMouseMove is not provided
269
+ expect(function () {
270
+ return handler(mockEvent);
271
+ }).not.toThrow();
272
+ }
273
+ }
274
+ }));
275
+ (0, _react.render)(/*#__PURE__*/_react2["default"].createElement(_root.Root, props, "hi"));
276
+
277
+ // Verify scale methods were not called (early return in mouseMove)
278
+ expect(gp.scale.x.invert).not.toHaveBeenCalled();
279
+ expect(gp.scale.y.invert).not.toHaveBeenCalled();
280
+ });
281
+ });
282
+ });
283
+ });
284
+ });
285
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX3JlYWN0MiIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfcm9vdCIsIl9kM1NlbGVjdGlvbiIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiamVzdCIsIm1vY2siLCJzZWxlY3QiLCJmbiIsInBvaW50ZXIiLCJzY2FsZU1vY2siLCJuIiwiaW52ZXJ0IiwiZ3JhcGhQcm9wcyIsInNjYWxlIiwieCIsInkiLCJzbmFwIiwiZG9tYWluIiwibWluIiwibWF4Iiwic3RlcCIsInJhbmdlIiwic2l6ZSIsIndpZHRoIiwiaGVpZ2h0IiwiZGVzY3JpYmUiLCJtb2NrT24iLCJkZWZhdWx0UHJvcHMiLCJiZWZvcmVFYWNoIiwibW9ja1JldHVyblZhbHVlIiwib24iLCJjbGFzc2VzIiwiYWZ0ZXJFYWNoIiwiY2xlYW51cCIsImNsZWFyQWxsTW9ja3MiLCJpdCIsIl9yZW5kZXIiLCJyZW5kZXIiLCJjcmVhdGVFbGVtZW50IiwiUm9vdCIsImNvbnRhaW5lciIsImdldEJ5VGV4dCIsImV4cGVjdCIsImZpcnN0Q2hpbGQiLCJ0b0JlSW5UaGVEb2N1bWVudCIsInRvSGF2ZUJlZW5DYWxsZWQiLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsImFueSIsIkZ1bmN0aW9uIiwiX3JlbmRlcjIiLCJ1bm1vdW50IiwibW9ja0NsZWFyIiwib25Nb3VzZU1vdmUiLCJncCIsInByb3BzIiwibW9ja05vZGUiLCJkb2N1bWVudCIsIm1vY2tFdmVudCIsImNsaWVudFgiLCJjbGllbnRZIiwibW9ja1NlbGVjdGlvbiIsIl9ncm91cHMiLCJub2RlIiwiZXZlbnQiLCJoYW5kbGVyIiwibm90IiwidG9UaHJvdyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vcm9vdC50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjbGVhbnVwLCByZW5kZXIgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBSb290IH0gZnJvbSAnLi4vcm9vdCc7XG5pbXBvcnQgeyBwb2ludGVyLCBzZWxlY3QgfSBmcm9tICdkMy1zZWxlY3Rpb24nO1xuXG5qZXN0Lm1vY2soJ2QzLXNlbGVjdGlvbicsICgpID0+ICh7XG4gIHNlbGVjdDogamVzdC5mbigpLFxuICBwb2ludGVyOiBqZXN0LmZuKCksXG59KSk7XG5cbmNvbnN0IHNjYWxlTW9jayA9ICgpID0+IHtcbiAgY29uc3QgZm4gPSBqZXN0LmZuKChuKSA9PiBuKTtcbiAgZm4uaW52ZXJ0ID0gamVzdC5mbigobikgPT4gbik7XG4gIHJldHVybiBmbjtcbn07XG5cbmNvbnN0IGdyYXBoUHJvcHMgPSAoKSA9PiAoe1xuICBzY2FsZToge1xuICAgIHg6IHNjYWxlTW9jaygpLFxuICAgIHk6IHNjYWxlTW9jaygpLFxuICB9LFxuICBzbmFwOiB7XG4gICAgeDogamVzdC5mbigobikgPT4gbiksXG4gICAgeTogamVzdC5mbigobikgPT4gbiksXG4gIH0sXG4gIGRvbWFpbjoge1xuICAgIG1pbjogMCxcbiAgICBtYXg6IDEsXG4gICAgc3RlcDogMSxcbiAgfSxcbiAgcmFuZ2U6IHtcbiAgICBtaW46IDAsXG4gICAgbWF4OiAxLFxuICAgIHN0ZXA6IDEsXG4gIH0sXG4gIHNpemU6IHtcbiAgICB3aWR0aDogNDAwLFxuICAgIGhlaWdodDogNDAwLFxuICB9LFxufSk7XG5cbmRlc2NyaWJlKCdyb290JywgKCkgPT4ge1xuICBsZXQgbW9ja09uO1xuICBsZXQgZGVmYXVsdFByb3BzO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIG1vY2tPbiA9IGplc3QuZm4oKTtcbiAgICBzZWxlY3QubW9ja1JldHVyblZhbHVlKHtcbiAgICAgIG9uOiBtb2NrT24sXG4gICAgfSk7XG4gICAgcG9pbnRlci5tb2NrUmV0dXJuVmFsdWUoWzAsIDBdKTtcblxuICAgIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgIGNsYXNzZXM6IHt9LFxuICAgICAgZ3JhcGhQcm9wczogZ3JhcGhQcm9wcygpLFxuICAgIH07XG4gIH0pO1xuXG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgY2xlYW51cCgpO1xuICAgIGplc3QuY2xlYXJBbGxNb2NrcygpO1xuICB9KTtcblxuICBpdCgncmVuZGVycyB3aXRoIGNoaWxkcmVuJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyLCBnZXRCeVRleHQgfSA9IHJlbmRlcig8Um9vdCB7Li4uZGVmYXVsdFByb3BzfT5oaTwvUm9vdD4pO1xuICAgIGV4cGVjdChjb250YWluZXIuZmlyc3RDaGlsZCkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICBleHBlY3QoZ2V0QnlUZXh0KCdoaScpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnbG9naWMnLCAoKSA9PiB7XG4gICAgZGVzY3JpYmUoJ21vdXNlbW92ZScsICgpID0+IHtcbiAgICAgIGRlc2NyaWJlKCdtb3VudC91bm1vdW50JywgKCkgPT4ge1xuICAgICAgICBpdCgnYWRkcyBtb3VzZW1vdmUgbGlzdGVuZXIgb24gY29tcG9uZW50RGlkTW91bnQnLCAoKSA9PiB7XG4gICAgICAgICAgcmVuZGVyKDxSb290IHsuLi5kZWZhdWx0UHJvcHN9PmhpPC9Sb290Pik7XG5cbiAgICAgICAgICAvLyBWZXJpZnkgdGhhdCBzZWxlY3Qgd2FzIGNhbGxlZCB3aXRoIHRoZSBnIGVsZW1lbnRcbiAgICAgICAgICBleHBlY3Qoc2VsZWN0KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG5cbiAgICAgICAgICAvLyBWZXJpZnkgdGhhdCBvbigpIHdhcyBjYWxsZWQgd2l0aCAnbW91c2Vtb3ZlJyBhbmQgYSBmdW5jdGlvblxuICAgICAgICAgIGV4cGVjdChtb2NrT24pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdtb3VzZW1vdmUnLCBleHBlY3QuYW55KEZ1bmN0aW9uKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdyZW1vdmVzIG1vdXNlbW92ZSBsaXN0ZW5lciBvbiBjb21wb25lbnRXaWxsVW5tb3VudCcsICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IHVubW91bnQgfSA9IHJlbmRlcig8Um9vdCB7Li4uZGVmYXVsdFByb3BzfT5oaTwvUm9vdD4pO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgcHJldmlvdXMgY2FsbHMgdG8gaXNvbGF0ZSB1bm1vdW50IGJlaGF2aW9yXG4gICAgICAgICAgbW9ja09uLm1vY2tDbGVhcigpO1xuICAgICAgICAgIHNlbGVjdC5tb2NrQ2xlYXIoKTtcblxuICAgICAgICAgIHVubW91bnQoKTtcblxuICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHNlbGVjdCB3YXMgY2FsbGVkIGR1cmluZyB1bm1vdW50XG4gICAgICAgICAgZXhwZWN0KHNlbGVjdCkudG9IYXZlQmVlbkNhbGxlZCgpO1xuXG4gICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgb24oKSB3YXMgY2FsbGVkIHdpdGggJ21vdXNlbW92ZScgYW5kIG51bGwgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lclxuICAgICAgICAgIGV4cGVjdChtb2NrT24pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdtb3VzZW1vdmUnLCBudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ21vdXNlTW92ZSBmdW5jdGlvbicsICgpID0+IHtcbiAgICAgICAgaXQoJ2NhbGxzIHBvaW50ZXIgd2l0aCBjb3JyZWN0IGFyZ3VtZW50cycsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBvbk1vdXNlTW92ZSA9IGplc3QuZm4oKTtcbiAgICAgICAgICBjb25zdCBncCA9IGdyYXBoUHJvcHMoKTtcbiAgICAgICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgICAgIC4uLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgICAgIG9uTW91c2VNb3ZlLFxuICAgICAgICAgICAgZ3JhcGhQcm9wczogZ3AsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IG1vY2tOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgY29uc3QgbW9ja0V2ZW50ID0geyBjbGllbnRYOiAxMCwgY2xpZW50WTogMjAgfTtcbiAgICAgICAgICBjb25zdCBtb2NrU2VsZWN0aW9uID0ge1xuICAgICAgICAgICAgX2dyb3VwczogW1ttb2NrTm9kZV1dLFxuICAgICAgICAgICAgbm9kZTogKCkgPT4gbW9ja05vZGUsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIE1vY2sgc2VsZWN0IHRvIHJldHVybiBvdXIgbW9ja1NlbGVjdGlvblxuICAgICAgICAgIHNlbGVjdC5tb2NrUmV0dXJuVmFsdWUoe1xuICAgICAgICAgICAgLi4ubW9ja1NlbGVjdGlvbixcbiAgICAgICAgICAgIG9uOiAoZXZlbnQsIGhhbmRsZXIpID0+IHtcbiAgICAgICAgICAgICAgbW9ja09uKGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgLy8gV2hlbiAnbW91c2Vtb3ZlJyBpcyByZWdpc3RlcmVkLCBpbW1lZGlhdGVseSB0ZXN0IGl0XG4gICAgICAgICAgICAgIGlmIChldmVudCA9PT0gJ21vdXNlbW92ZScgJiYgaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIHBvaW50ZXIubW9ja1JldHVyblZhbHVlKFsxMCwgMjBdKTtcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGVyIGlzIGJvdW5kIHdpdGggbW9ja1NlbGVjdGlvbiBhcyBmaXJzdCBhcmcsIHNvIGNhbGwgd2l0aCBldmVudFxuICAgICAgICAgICAgICAgIGhhbmRsZXIobW9ja0V2ZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJlbmRlcig8Um9vdCB7Li4ucHJvcHN9PmhpPC9Sb290Pik7XG5cbiAgICAgICAgICAvLyBWZXJpZnkgcG9pbnRlciB3YXMgY2FsbGVkIHdpdGggdGhlIGV2ZW50IGFuZCBjb3JyZWN0IG5vZGVcbiAgICAgICAgICBleHBlY3QocG9pbnRlcikudG9IYXZlQmVlbkNhbGxlZFdpdGgobW9ja0V2ZW50LCBtb2NrTm9kZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdjYWxscyBzY2FsZS54LmludmVydCBhbmQgc2NhbGUueS5pbnZlcnQnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb25Nb3VzZU1vdmUgPSBqZXN0LmZuKCk7XG4gICAgICAgICAgY29uc3QgZ3AgPSBncmFwaFByb3BzKCk7XG4gICAgICAgICAgY29uc3QgcHJvcHMgPSB7XG4gICAgICAgICAgICAuLi5kZWZhdWx0UHJvcHMsXG4gICAgICAgICAgICBvbk1vdXNlTW92ZSxcbiAgICAgICAgICAgIGdyYXBoUHJvcHM6IGdwLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBtb2NrTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIGNvbnN0IG1vY2tFdmVudCA9IHsgY2xpZW50WDogMTUsIGNsaWVudFk6IDI1IH07XG4gICAgICAgICAgY29uc3QgbW9ja1NlbGVjdGlvbiA9IHtcbiAgICAgICAgICAgIF9ncm91cHM6IFtbbW9ja05vZGVdXSxcbiAgICAgICAgICAgIG5vZGU6ICgpID0+IG1vY2tOb2RlLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBzZWxlY3QubW9ja1JldHVyblZhbHVlKHtcbiAgICAgICAgICAgIC4uLm1vY2tTZWxlY3Rpb24sXG4gICAgICAgICAgICBvbjogKGV2ZW50LCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICAgIG1vY2tPbihldmVudCwgaGFuZGxlcik7XG4gICAgICAgICAgICAgIGlmIChldmVudCA9PT0gJ21vdXNlbW92ZScgJiYgaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIHBvaW50ZXIubW9ja1JldHVyblZhbHVlKFsxNSwgMjVdKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKG1vY2tFdmVudCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZW5kZXIoPFJvb3Qgey4uLnByb3BzfT5oaTwvUm9vdD4pO1xuXG4gICAgICAgICAgZXhwZWN0KGdwLnNjYWxlLnguaW52ZXJ0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgxNSk7XG4gICAgICAgICAgZXhwZWN0KGdwLnNjYWxlLnkuaW52ZXJ0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgyNSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdjYWxscyBzbmFwLnggYW5kIHNuYXAueSB3aXRoIGludmVydGVkIGNvb3JkaW5hdGVzJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9uTW91c2VNb3ZlID0gamVzdC5mbigpO1xuICAgICAgICAgIGNvbnN0IGdwID0gZ3JhcGhQcm9wcygpO1xuICAgICAgICAgIGdwLnNjYWxlLnguaW52ZXJ0ID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSg1KTtcbiAgICAgICAgICBncC5zY2FsZS55LmludmVydCA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoMTApO1xuICAgICAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICAgICAgb25Nb3VzZU1vdmUsXG4gICAgICAgICAgICBncmFwaFByb3BzOiBncCxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgbW9ja05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICBjb25zdCBtb2NrRXZlbnQgPSB7IGNsaWVudFg6IDEwMCwgY2xpZW50WTogMjAwIH07XG4gICAgICAgICAgY29uc3QgbW9ja1NlbGVjdGlvbiA9IHtcbiAgICAgICAgICAgIF9ncm91cHM6IFtbbW9ja05vZGVdXSxcbiAgICAgICAgICAgIG5vZGU6ICgpID0+IG1vY2tOb2RlLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBzZWxlY3QubW9ja1JldHVyblZhbHVlKHtcbiAgICAgICAgICAgIC4uLm1vY2tTZWxlY3Rpb24sXG4gICAgICAgICAgICBvbjogKGV2ZW50LCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICAgIG1vY2tPbihldmVudCwgaGFuZGxlcik7XG4gICAgICAgICAgICAgIGlmIChldmVudCA9PT0gJ21vdXNlbW92ZScgJiYgaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIHBvaW50ZXIubW9ja1JldHVyblZhbHVlKFsxMDAsIDIwMF0pO1xuICAgICAgICAgICAgICAgIGhhbmRsZXIoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJlbmRlcig8Um9vdCB7Li4ucHJvcHN9PmhpPC9Sb290Pik7XG5cbiAgICAgICAgICBleHBlY3QoZ3Auc25hcC54KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCg1KTtcbiAgICAgICAgICBleHBlY3QoZ3Auc25hcC55KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgxMCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdjYWxscyBvbk1vdXNlTW92ZSBoYW5kbGVyIHdpdGggc25hcHBlZCBjb29yZGluYXRlcycsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBvbk1vdXNlTW92ZSA9IGplc3QuZm4oKTtcbiAgICAgICAgICBjb25zdCBncCA9IGdyYXBoUHJvcHMoKTtcbiAgICAgICAgICBncC5zY2FsZS54LmludmVydCA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoNyk7XG4gICAgICAgICAgZ3Auc2NhbGUueS5pbnZlcnQgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDE0KTtcbiAgICAgICAgICBncC5zbmFwLnggPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDEwKTtcbiAgICAgICAgICBncC5zbmFwLnkgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKDE1KTtcblxuICAgICAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICAgICAgb25Nb3VzZU1vdmUsXG4gICAgICAgICAgICBncmFwaFByb3BzOiBncCxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgbW9ja05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICBjb25zdCBtb2NrRXZlbnQgPSB7IGNsaWVudFg6IDEwMCwgY2xpZW50WTogMjAwIH07XG4gICAgICAgICAgY29uc3QgbW9ja1NlbGVjdGlvbiA9IHtcbiAgICAgICAgICAgIF9ncm91cHM6IFtbbW9ja05vZGVdXSxcbiAgICAgICAgICAgIG5vZGU6ICgpID0+IG1vY2tOb2RlLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBzZWxlY3QubW9ja1JldHVyblZhbHVlKHtcbiAgICAgICAgICAgIC4uLm1vY2tTZWxlY3Rpb24sXG4gICAgICAgICAgICBvbjogKGV2ZW50LCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICAgIG1vY2tPbihldmVudCwgaGFuZGxlcik7XG4gICAgICAgICAgICAgIGlmIChldmVudCA9PT0gJ21vdXNlbW92ZScgJiYgaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIHBvaW50ZXIubW9ja1JldHVyblZhbHVlKFsxMDAsIDIwMF0pO1xuICAgICAgICAgICAgICAgIGhhbmRsZXIobW9ja0V2ZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJlbmRlcig8Um9vdCB7Li4ucHJvcHN9PmhpPC9Sb290Pik7XG5cbiAgICAgICAgICBleHBlY3Qob25Nb3VzZU1vdmUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHsgeDogMTAsIHk6IDE1IH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnZG9lcyBub3QgY2FsbCBvbk1vdXNlTW92ZSB3aGVuIGhhbmRsZXIgaXMgbm90IHByb3ZpZGVkJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGdwID0gZ3JhcGhQcm9wcygpO1xuICAgICAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAgICAgLi4uZGVmYXVsdFByb3BzLFxuICAgICAgICAgICAgZ3JhcGhQcm9wczogZ3AsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IG1vY2tOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgY29uc3QgbW9ja0V2ZW50ID0geyBjbGllbnRYOiAxMDAsIGNsaWVudFk6IDIwMCB9O1xuICAgICAgICAgIGNvbnN0IG1vY2tTZWxlY3Rpb24gPSB7XG4gICAgICAgICAgICBfZ3JvdXBzOiBbW21vY2tOb2RlXV0sXG4gICAgICAgICAgICBub2RlOiAoKSA9PiBtb2NrTm9kZSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgc2VsZWN0Lm1vY2tSZXR1cm5WYWx1ZSh7XG4gICAgICAgICAgICAuLi5tb2NrU2VsZWN0aW9uLFxuICAgICAgICAgICAgb246IChldmVudCwgaGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgICBtb2NrT24oZXZlbnQsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICBpZiAoZXZlbnQgPT09ICdtb3VzZW1vdmUnICYmIGhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICBwb2ludGVyLm1vY2tSZXR1cm5WYWx1ZShbMTAwLCAyMDBdKTtcbiAgICAgICAgICAgICAgICAvLyBTaG91bGQgbm90IHRocm93IGVycm9yIHdoZW4gb25Nb3VzZU1vdmUgaXMgbm90IHByb3ZpZGVkXG4gICAgICAgICAgICAgICAgZXhwZWN0KCgpID0+IGhhbmRsZXIobW9ja0V2ZW50KSkubm90LnRvVGhyb3coKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJlbmRlcig8Um9vdCB7Li4ucHJvcHN9PmhpPC9Sb290Pik7XG5cbiAgICAgICAgICAvLyBWZXJpZnkgc2NhbGUgbWV0aG9kcyB3ZXJlIG5vdCBjYWxsZWQgKGVhcmx5IHJldHVybiBpbiBtb3VzZU1vdmUpXG4gICAgICAgICAgZXhwZWN0KGdwLnNjYWxlLnguaW52ZXJ0KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICAgIGV4cGVjdChncC5zY2FsZS55LmludmVydCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLEtBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFlBQUEsR0FBQUosT0FBQTtBQUErQyxTQUFBSyxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFB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
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
5
+ var _trig = require("../trig");
6
+ var _utils = require("../utils");
7
+ var _debug = _interopRequireDefault(require("debug"));
8
+ var _templateObject, _templateObject2, _templateObject3;
9
+ var log = (0, _debug["default"])('pie-lib:plot:trig:test');
10
+ var vs = function vs(v) {
11
+ if (!v) {
12
+ return '';
13
+ }
14
+ if (Number.isFinite(v.x) && Number.isFinite(v.y)) {
15
+ return "[".concat(v.x, ",").concat(v.y, "]");
16
+ }
17
+ return JSON.stringify(v);
18
+ };
19
+ var p = function p(strings) {
20
+ for (var _len = arguments.length, values = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
21
+ values[_key - 1] = arguments[_key];
22
+ }
23
+ return strings.reduce(function (acc, s, index) {
24
+ return "".concat(acc).concat(s).concat(vs(values[index]));
25
+ }, '');
26
+ };
27
+ describe('trig', function () {
28
+ describe('angle', function () {
29
+ var assertAngle = function assertAngle(a, b, expected) {
30
+ it(p(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["", ", ", " => ", ""])), a, b, (0, _trig.toDegrees)(expected)), function () {
31
+ var result = (0, _trig.angle)(a, b);
32
+ expect(result).toBeCloseTo(expected);
33
+ });
34
+ };
35
+ assertAngle((0, _utils.xy)(0, 0), (0, _utils.xy)(1, 1), (0, _trig.toRadians)(45));
36
+ assertAngle((0, _utils.xy)(0, 0), (0, _utils.xy)(0, 1), (0, _trig.toRadians)(90));
37
+ assertAngle((0, _utils.xy)(0, 0), (0, _utils.xy)(-1, 1), (0, _trig.toRadians)(135));
38
+ assertAngle((0, _utils.xy)(0, 0), (0, _utils.xy)(-1, 0), (0, _trig.toRadians)(180));
39
+ assertAngle((0, _utils.xy)(0, 0), (0, _utils.xy)(-1, -1), (0, _trig.toRadians)(225));
40
+ assertAngle((0, _utils.xy)(0, 0), (0, _utils.xy)(0, -1), (0, _trig.toRadians)(270));
41
+ assertAngle((0, _utils.xy)(0, 0), (0, _utils.xy)(1, -1), (0, _trig.toRadians)(315));
42
+ assertAngle((0, _utils.xy)(1, 1), (0, _utils.xy)(0, 0), (0, _trig.toRadians)(225));
43
+ assertAngle((0, _utils.xy)(0, 0), (0, _utils.xy)(1, 1), (0, _trig.toRadians)(45));
44
+ assertAngle((0, _utils.xy)(0, 0), (0, _utils.xy)(2, 1), (0, _trig.toRadians)(26.565));
45
+ assertAngle((0, _utils.xy)(0, 0), (0, _utils.xy)(3, 1), (0, _trig.toRadians)(18.434));
46
+ assertAngle((0, _utils.xy)(0, 0), (0, _utils.xy)(4, 1), (0, _trig.toRadians)(14.036));
47
+ assertAngle((0, _utils.xy)(0, 0), (0, _utils.xy)(5, 1), (0, _trig.toRadians)(11.309));
48
+ });
49
+ describe('acuteXAngle', function () {
50
+ var assertAcute = function assertAcute(input, expected) {
51
+ it("".concat((0, _trig.toDegrees)(input), " => ").concat((0, _trig.toDegrees)(expected)), function () {
52
+ var result = (0, _trig.acuteXAngle)(input);
53
+ log("result: ".concat((0, _trig.toDegrees)(result)));
54
+ expect(result).toBeCloseTo(expected);
55
+ });
56
+ };
57
+ assertAcute((0, _trig.toRadians)(45), (0, _trig.toRadians)(45));
58
+ assertAcute((0, _trig.toRadians)(100), (0, _trig.toRadians)(80));
59
+ assertAcute((0, _trig.toRadians)(190), (0, _trig.toRadians)(10));
60
+ assertAcute((0, _trig.toRadians)(350), (0, _trig.toRadians)(10));
61
+ });
62
+ describe('acuteYAngle', function () {
63
+ var assertAcute = function assertAcute(input, expected) {
64
+ it("".concat((0, _trig.toDegrees)(input), " => ").concat((0, _trig.toDegrees)(expected)), function () {
65
+ var result = (0, _trig.acuteYAngle)(input);
66
+ log("result: ".concat((0, _trig.toDegrees)(result)));
67
+ expect(result).toBeCloseTo(expected);
68
+ });
69
+ };
70
+ assertAcute((0, _trig.toRadians)(45), (0, _trig.toRadians)(45));
71
+ assertAcute((0, _trig.toRadians)(100), (0, _trig.toRadians)(10));
72
+ assertAcute((0, _trig.toRadians)(190), (0, _trig.toRadians)(80));
73
+ assertAcute((0, _trig.toRadians)(350), (0, _trig.toRadians)(80));
74
+ });
75
+ describe('edges', function () {
76
+ var assertEdges = function assertEdges(domain, range) {
77
+ return function (from, to, expected) {
78
+ it(p(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["", ", ", " + ", " -> ", " => ", "", ""])), domain, range, from, to, expected[0], expected[1]), function () {
79
+ var result = (0, _trig.edges)(domain, range)(from, to);
80
+ expect(result[0].x).toBeCloseTo(expected[0].x);
81
+ expect(result[0].y).toBeCloseTo(expected[0].y);
82
+ expect(result[1].x).toBeCloseTo(expected[1].x);
83
+ expect(result[1].y).toBeCloseTo(expected[1].y);
84
+ });
85
+ };
86
+ };
87
+ var one = assertEdges({
88
+ min: -4,
89
+ max: 4
90
+ }, {
91
+ min: -4,
92
+ max: 4
93
+ });
94
+ one((0, _utils.xy)(0, 0), (0, _utils.xy)(1, 1), [(0, _utils.xy)(4, 4), (0, _utils.xy)(-4, -4)]);
95
+ one((0, _utils.xy)(0, 0), (0, _utils.xy)(2, 1), [(0, _utils.xy)(4, 2), (0, _utils.xy)(-4, -2)]);
96
+ one((0, _utils.xy)(1, 1), (0, _utils.xy)(2, 2), [(0, _utils.xy)(4, 4), (0, _utils.xy)(-4, -4)]);
97
+ one((0, _utils.xy)(1, 0), (0, _utils.xy)(2, 0), [(0, _utils.xy)(4, 0), (0, _utils.xy)(-4, 0)]);
98
+ one((0, _utils.xy)(1, 0), (0, _utils.xy)(-2, 0), [(0, _utils.xy)(-4, 0), (0, _utils.xy)(4, 0)]);
99
+
100
+ /**
101
+ * domain {min: -5, max: 5, padding: 0, step: 1, labelStep: 1}labelStep: 1max: 5min: -5padding: 0step: 1__proto__: Object range: {min: -5, max: 5, padding: 0, step: 1, labelStep: 1} a: {x: -5, y: 0} b: {x: -5, y: 2} edges: Point {x: -5, y: 5} Point {x: -5, y: 2}
102
+ */
103
+ var lineIssue = assertEdges({
104
+ min: -5,
105
+ max: 5
106
+ }, {
107
+ min: -5,
108
+ max: 5
109
+ });
110
+ lineIssue((0, _utils.xy)(-5, -0), (0, _utils.xy)(-5, 2), [(0, _utils.xy)(-5, 5), (0, _utils.xy)(-5, -5)]);
111
+ });
112
+ describe('diffEdge', function () {
113
+ var assertDiffEdge = function assertDiffEdge(bounds, from, to, expected) {
114
+ it(p(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["<", "> ", " -> ", " => ", ""])), bounds, from, to, expected), function () {
115
+ var result = (0, _trig.diffEdge)(bounds, from, to);
116
+ expect(result.x).toBeCloseTo(expected.x);
117
+ expect(result.y).toBeCloseTo(expected.y);
118
+ });
119
+ };
120
+ var twoTwo = assertDiffEdge.bind(null, (0, _utils.xy)(2, 2));
121
+ twoTwo((0, _utils.xy)(0, 0), (0, _utils.xy)(1, 1), (0, _utils.xy)(2, 2));
122
+ twoTwo((0, _utils.xy)(0, 0), (0, _utils.xy)(1, 2), (0, _utils.xy)(1, 2));
123
+ twoTwo((0, _utils.xy)(0, 0), (0, _utils.xy)(2, 2), (0, _utils.xy)(2, 2));
124
+ twoTwo((0, _utils.xy)(0, 0), (0, _utils.xy)(2, 2), (0, _utils.xy)(2, 2));
125
+ twoTwo((0, _utils.xy)(0, 0), (0, _utils.xy)(-1, 1), (0, _utils.xy)(-2, 2));
126
+ twoTwo((0, _utils.xy)(0, 0), (0, _utils.xy)(-1, -1), (0, _utils.xy)(-2, -2));
127
+ var fourFour = assertDiffEdge.bind(null, (0, _utils.xy)(4, 4));
128
+ fourFour((0, _utils.xy)(0, 0), (0, _utils.xy)(1, 1), (0, _utils.xy)(4, 4));
129
+ fourFour((0, _utils.xy)(0, 0), (0, _utils.xy)(1, 2), (0, _utils.xy)(2, 4));
130
+ fourFour((0, _utils.xy)(0, 0), (0, _utils.xy)(2, 1), (0, _utils.xy)(4, 2));
131
+ fourFour((0, _utils.xy)(0, 0), (0, _utils.xy)(-1, 1), (0, _utils.xy)(-4, 4));
132
+ fourFour((0, _utils.xy)(0, 0), (0, _utils.xy)(-1, 1), (0, _utils.xy)(-4, 4));
133
+ assertDiffEdge((0, _utils.xy)(-4, -4), (0, _utils.xy)(0, 0), (0, _utils.xy)(-1, -1), (0, _utils.xy)(-4, -4));
134
+ assertDiffEdge((0, _utils.xy)(4, 4), (0, _utils.xy)(1, 1), (0, _utils.xy)(2, 2), (0, _utils.xy)(4, 4));
135
+ assertDiffEdge((0, _utils.xy)(4, 4), (0, _utils.xy)(2, 2), (0, _utils.xy)(3, 3), (0, _utils.xy)(4, 4));
136
+ assertDiffEdge((0, _utils.xy)(-4, -4), (0, _utils.xy)(-1, -1), (0, _utils.xy)(-2, -2), (0, _utils.xy)(-4, -4));
137
+ assertDiffEdge((0, _utils.xy)(-4, 4), (0, _utils.xy)(-1, -1), (0, _utils.xy)(-2, 0), (0, _utils.xy)(-4, 2));
138
+ var lineIssue = assertDiffEdge.bind(null, (0, _utils.xy)(-5, -5));
139
+ lineIssue((0, _utils.xy)(-5, 2), (0, _utils.xy)(-5, 0), (0, _utils.xy)(-5, -5));
140
+ //Top Right
141
+ assertDiffEdge((0, _utils.xy)(5, 5), (0, _utils.xy)(0, 5), (0, _utils.xy)(2, 5), (0, _utils.xy)(5, 5));
142
+ assertDiffEdge((0, _utils.xy)(5, 5), (0, _utils.xy)(5, 0), (0, _utils.xy)(5, 1), (0, _utils.xy)(5, 5));
143
+
144
+ // //Bottom Right
145
+ assertDiffEdge((0, _utils.xy)(5, -5), (0, _utils.xy)(5, 0), (0, _utils.xy)(5, -0.1), (0, _utils.xy)(5, -5));
146
+ assertDiffEdge((0, _utils.xy)(5, -5), (0, _utils.xy)(0, -5), (0, _utils.xy)(1, -5), (0, _utils.xy)(5, -5));
147
+
148
+ //Top Left
149
+ assertDiffEdge((0, _utils.xy)(-5, 5), (0, _utils.xy)(-5, 0), (0, _utils.xy)(-5, 0.1), (0, _utils.xy)(-5, 5));
150
+ assertDiffEdge((0, _utils.xy)(-5, 5), (0, _utils.xy)(0, 5), (0, _utils.xy)(-1, 5), (0, _utils.xy)(-5, 5));
151
+
152
+ //Bottom Left
153
+ assertDiffEdge((0, _utils.xy)(-5, -5), (0, _utils.xy)(-5, 0), (0, _utils.xy)(-5, -0.1), (0, _utils.xy)(-5, -5));
154
+ assertDiffEdge((0, _utils.xy)(-5, -5), (0, _utils.xy)(0, -5), (0, _utils.xy)(-1, -5), (0, _utils.xy)(-5, -5));
155
+ });
156
+ describe('getOpposingSide', function () {
157
+ var assertOpposingSide = function assertOpposingSide(hyp, angle, expected) {
158
+ it("".concat(hyp, ", ").concat(angle, " = ").concat(expected), function () {
159
+ var radians = (0, _trig.toRadians)(angle);
160
+ var result = (0, _trig.getOpposingSide)(hyp, radians);
161
+ expect(result).toBeCloseTo(expected);
162
+ });
163
+ };
164
+ assertOpposingSide(1, 45, 0.707);
165
+ assertOpposingSide(1.25, 45, 0.88);
166
+ });
167
+ });
168
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdHJpZyIsInJlcXVpcmUiLCJfdXRpbHMiLCJfZGVidWciLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX3RlbXBsYXRlT2JqZWN0IiwiX3RlbXBsYXRlT2JqZWN0MiIsIl90ZW1wbGF0ZU9iamVjdDMiLCJsb2ciLCJkZWJ1ZyIsInZzIiwidiIsIk51bWJlciIsImlzRmluaXRlIiwieCIsInkiLCJjb25jYXQiLCJKU09OIiwic3RyaW5naWZ5IiwicCIsInN0cmluZ3MiLCJfbGVuIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidmFsdWVzIiwiQXJyYXkiLCJfa2V5IiwicmVkdWNlIiwiYWNjIiwicyIsImluZGV4IiwiZGVzY3JpYmUiLCJhc3NlcnRBbmdsZSIsImEiLCJiIiwiZXhwZWN0ZWQiLCJpdCIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwidG9EZWdyZWVzIiwicmVzdWx0IiwiYW5nbGUiLCJleHBlY3QiLCJ0b0JlQ2xvc2VUbyIsInh5IiwidG9SYWRpYW5zIiwiYXNzZXJ0QWN1dGUiLCJpbnB1dCIsImFjdXRlWEFuZ2xlIiwiYWN1dGVZQW5nbGUiLCJhc3NlcnRFZGdlcyIsImRvbWFpbiIsInJhbmdlIiwiZnJvbSIsInRvIiwiZWRnZXMiLCJvbmUiLCJtaW4iLCJtYXgiLCJsaW5lSXNzdWUiLCJhc3NlcnREaWZmRWRnZSIsImJvdW5kcyIsImRpZmZFZGdlIiwidHdvVHdvIiwiYmluZCIsImZvdXJGb3VyIiwiYXNzZXJ0T3Bwb3NpbmdTaWRlIiwiaHlwIiwicmFkaWFucyIsImdldE9wcG9zaW5nU2lkZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vdHJpZy50ZXN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFjdXRlWEFuZ2xlLCBhY3V0ZVlBbmdsZSwgYW5nbGUsIGRpZmZFZGdlLCBlZGdlcywgZ2V0T3Bwb3NpbmdTaWRlLCB0b0RlZ3JlZXMsIHRvUmFkaWFucyB9IGZyb20gJy4uL3RyaWcnO1xuaW1wb3J0IHsgeHkgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgZGVidWcgZnJvbSAnZGVidWcnO1xuXG5jb25zdCBsb2cgPSBkZWJ1ZygncGllLWxpYjpwbG90OnRyaWc6dGVzdCcpO1xuXG5jb25zdCB2cyA9ICh2KSA9PiB7XG4gIGlmICghdikge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmIChOdW1iZXIuaXNGaW5pdGUodi54KSAmJiBOdW1iZXIuaXNGaW5pdGUodi55KSkge1xuICAgIHJldHVybiBgWyR7di54fSwke3YueX1dYDtcbiAgfVxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG59O1xuY29uc3QgcCA9IChzdHJpbmdzLCAuLi52YWx1ZXMpID0+IHtcbiAgcmV0dXJuIHN0cmluZ3MucmVkdWNlKChhY2MsIHMsIGluZGV4KSA9PiB7XG4gICAgcmV0dXJuIGAke2FjY30ke3N9JHt2cyh2YWx1ZXNbaW5kZXhdKX1gO1xuICB9LCAnJyk7XG59O1xuZGVzY3JpYmUoJ3RyaWcnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdhbmdsZScsICgpID0+IHtcbiAgICBjb25zdCBhc3NlcnRBbmdsZSA9IChhLCBiLCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQocGAke2F9LCAke2J9ID0+ICR7dG9EZWdyZWVzKGV4cGVjdGVkKX1gLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGFuZ2xlKGEsIGIpO1xuICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlQ2xvc2VUbyhleHBlY3RlZCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXNzZXJ0QW5nbGUoeHkoMCwgMCksIHh5KDEsIDEpLCB0b1JhZGlhbnMoNDUpKTtcbiAgICBhc3NlcnRBbmdsZSh4eSgwLCAwKSwgeHkoMCwgMSksIHRvUmFkaWFucyg5MCkpO1xuICAgIGFzc2VydEFuZ2xlKHh5KDAsIDApLCB4eSgtMSwgMSksIHRvUmFkaWFucygxMzUpKTtcbiAgICBhc3NlcnRBbmdsZSh4eSgwLCAwKSwgeHkoLTEsIDApLCB0b1JhZGlhbnMoMTgwKSk7XG4gICAgYXNzZXJ0QW5nbGUoeHkoMCwgMCksIHh5KC0xLCAtMSksIHRvUmFkaWFucygyMjUpKTtcbiAgICBhc3NlcnRBbmdsZSh4eSgwLCAwKSwgeHkoMCwgLTEpLCB0b1JhZGlhbnMoMjcwKSk7XG4gICAgYXNzZXJ0QW5nbGUoeHkoMCwgMCksIHh5KDEsIC0xKSwgdG9SYWRpYW5zKDMxNSkpO1xuICAgIGFzc2VydEFuZ2xlKHh5KDEsIDEpLCB4eSgwLCAwKSwgdG9SYWRpYW5zKDIyNSkpO1xuICAgIGFzc2VydEFuZ2xlKHh5KDAsIDApLCB4eSgxLCAxKSwgdG9SYWRpYW5zKDQ1KSk7XG4gICAgYXNzZXJ0QW5nbGUoeHkoMCwgMCksIHh5KDIsIDEpLCB0b1JhZGlhbnMoMjYuNTY1KSk7XG4gICAgYXNzZXJ0QW5nbGUoeHkoMCwgMCksIHh5KDMsIDEpLCB0b1JhZGlhbnMoMTguNDM0KSk7XG4gICAgYXNzZXJ0QW5nbGUoeHkoMCwgMCksIHh5KDQsIDEpLCB0b1JhZGlhbnMoMTQuMDM2KSk7XG4gICAgYXNzZXJ0QW5nbGUoeHkoMCwgMCksIHh5KDUsIDEpLCB0b1JhZGlhbnMoMTEuMzA5KSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhY3V0ZVhBbmdsZScsICgpID0+IHtcbiAgICBjb25zdCBhc3NlcnRBY3V0ZSA9IChpbnB1dCwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGl0KGAke3RvRGVncmVlcyhpbnB1dCl9ID0+ICR7dG9EZWdyZWVzKGV4cGVjdGVkKX1gLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGFjdXRlWEFuZ2xlKGlucHV0KTtcbiAgICAgICAgbG9nKGByZXN1bHQ6ICR7dG9EZWdyZWVzKHJlc3VsdCl9YCk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVDbG9zZVRvKGV4cGVjdGVkKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhc3NlcnRBY3V0ZSh0b1JhZGlhbnMoNDUpLCB0b1JhZGlhbnMoNDUpKTtcbiAgICBhc3NlcnRBY3V0ZSh0b1JhZGlhbnMoMTAwKSwgdG9SYWRpYW5zKDgwKSk7XG4gICAgYXNzZXJ0QWN1dGUodG9SYWRpYW5zKDE5MCksIHRvUmFkaWFucygxMCkpO1xuICAgIGFzc2VydEFjdXRlKHRvUmFkaWFucygzNTApLCB0b1JhZGlhbnMoMTApKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FjdXRlWUFuZ2xlJywgKCkgPT4ge1xuICAgIGNvbnN0IGFzc2VydEFjdXRlID0gKGlucHV0LCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQoYCR7dG9EZWdyZWVzKGlucHV0KX0gPT4gJHt0b0RlZ3JlZXMoZXhwZWN0ZWQpfWAsICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYWN1dGVZQW5nbGUoaW5wdXQpO1xuICAgICAgICBsb2coYHJlc3VsdDogJHt0b0RlZ3JlZXMocmVzdWx0KX1gKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZUNsb3NlVG8oZXhwZWN0ZWQpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydEFjdXRlKHRvUmFkaWFucyg0NSksIHRvUmFkaWFucyg0NSkpO1xuICAgIGFzc2VydEFjdXRlKHRvUmFkaWFucygxMDApLCB0b1JhZGlhbnMoMTApKTtcbiAgICBhc3NlcnRBY3V0ZSh0b1JhZGlhbnMoMTkwKSwgdG9SYWRpYW5zKDgwKSk7XG4gICAgYXNzZXJ0QWN1dGUodG9SYWRpYW5zKDM1MCksIHRvUmFkaWFucyg4MCkpO1xuICB9KTtcblxuICBkZXNjcmliZSgnZWRnZXMnLCAoKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0RWRnZXMgPSAoZG9tYWluLCByYW5nZSkgPT4gKGZyb20sIHRvLCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQocGAke2RvbWFpbn0sICR7cmFuZ2V9ICsgJHtmcm9tfSAtPiAke3RvfSA9PiAke2V4cGVjdGVkWzBdfSR7ZXhwZWN0ZWRbMV19YCwgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBlZGdlcyhkb21haW4sIHJhbmdlKShmcm9tLCB0byk7XG4gICAgICAgIGV4cGVjdChyZXN1bHRbMF0ueCkudG9CZUNsb3NlVG8oZXhwZWN0ZWRbMF0ueCk7XG4gICAgICAgIGV4cGVjdChyZXN1bHRbMF0ueSkudG9CZUNsb3NlVG8oZXhwZWN0ZWRbMF0ueSk7XG4gICAgICAgIGV4cGVjdChyZXN1bHRbMV0ueCkudG9CZUNsb3NlVG8oZXhwZWN0ZWRbMV0ueCk7XG4gICAgICAgIGV4cGVjdChyZXN1bHRbMV0ueSkudG9CZUNsb3NlVG8oZXhwZWN0ZWRbMV0ueSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb25lID0gYXNzZXJ0RWRnZXMoeyBtaW46IC00LCBtYXg6IDQgfSwgeyBtaW46IC00LCBtYXg6IDQgfSk7XG4gICAgb25lKHh5KDAsIDApLCB4eSgxLCAxKSwgW3h5KDQsIDQpLCB4eSgtNCwgLTQpXSk7XG4gICAgb25lKHh5KDAsIDApLCB4eSgyLCAxKSwgW3h5KDQsIDIpLCB4eSgtNCwgLTIpXSk7XG4gICAgb25lKHh5KDEsIDEpLCB4eSgyLCAyKSwgW3h5KDQsIDQpLCB4eSgtNCwgLTQpXSk7XG4gICAgb25lKHh5KDEsIDApLCB4eSgyLCAwKSwgW3h5KDQsIDApLCB4eSgtNCwgMCldKTtcbiAgICBvbmUoeHkoMSwgMCksIHh5KC0yLCAwKSwgW3h5KC00LCAwKSwgeHkoNCwgMCldKTtcblxuICAgIC8qKlxuICAgICAqIGRvbWFpbiB7bWluOiAtNSwgbWF4OiA1LCBwYWRkaW5nOiAwLCBzdGVwOiAxLCBsYWJlbFN0ZXA6IDF9bGFiZWxTdGVwOiAxbWF4OiA1bWluOiAtNXBhZGRpbmc6IDBzdGVwOiAxX19wcm90b19fOiBPYmplY3QgcmFuZ2U6ICB7bWluOiAtNSwgbWF4OiA1LCBwYWRkaW5nOiAwLCBzdGVwOiAxLCBsYWJlbFN0ZXA6IDF9IGE6IHt4OiAtNSwgeTogMH0gYjoge3g6IC01LCB5OiAyfSBlZGdlczogUG9pbnTCoHt4OiAtNSwgeTogNX0gUG9pbnTCoHt4OiAtNSwgeTogMn1cbiAgICAgKi9cbiAgICBjb25zdCBsaW5lSXNzdWUgPSBhc3NlcnRFZGdlcyh7IG1pbjogLTUsIG1heDogNSB9LCB7IG1pbjogLTUsIG1heDogNSB9KTtcbiAgICBsaW5lSXNzdWUoeHkoLTUsIC0wKSwgeHkoLTUsIDIpLCBbeHkoLTUsIDUpLCB4eSgtNSwgLTUpXSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdkaWZmRWRnZScsICgpID0+IHtcbiAgICBjb25zdCBhc3NlcnREaWZmRWRnZSA9IChib3VuZHMsIGZyb20sIHRvLCBleHBlY3RlZCkgPT4ge1xuICAgICAgaXQocGA8JHtib3VuZHN9PiAke2Zyb219IC0+ICR7dG99ID0+ICR7ZXhwZWN0ZWR9YCwgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBkaWZmRWRnZShib3VuZHMsIGZyb20sIHRvKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC54KS50b0JlQ2xvc2VUbyhleHBlY3RlZC54KTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC55KS50b0JlQ2xvc2VUbyhleHBlY3RlZC55KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCB0d29Ud28gPSBhc3NlcnREaWZmRWRnZS5iaW5kKG51bGwsIHh5KDIsIDIpKTtcbiAgICB0d29Ud28oeHkoMCwgMCksIHh5KDEsIDEpLCB4eSgyLCAyKSk7XG4gICAgdHdvVHdvKHh5KDAsIDApLCB4eSgxLCAyKSwgeHkoMSwgMikpO1xuICAgIHR3b1R3byh4eSgwLCAwKSwgeHkoMiwgMiksIHh5KDIsIDIpKTtcbiAgICB0d29Ud28oeHkoMCwgMCksIHh5KDIsIDIpLCB4eSgyLCAyKSk7XG4gICAgdHdvVHdvKHh5KDAsIDApLCB4eSgtMSwgMSksIHh5KC0yLCAyKSk7XG4gICAgdHdvVHdvKHh5KDAsIDApLCB4eSgtMSwgLTEpLCB4eSgtMiwgLTIpKTtcbiAgICBjb25zdCBmb3VyRm91ciA9IGFzc2VydERpZmZFZGdlLmJpbmQobnVsbCwgeHkoNCwgNCkpO1xuXG4gICAgZm91ckZvdXIoeHkoMCwgMCksIHh5KDEsIDEpLCB4eSg0LCA0KSk7XG4gICAgZm91ckZvdXIoeHkoMCwgMCksIHh5KDEsIDIpLCB4eSgyLCA0KSk7XG4gICAgZm91ckZvdXIoeHkoMCwgMCksIHh5KDIsIDEpLCB4eSg0LCAyKSk7XG4gICAgZm91ckZvdXIoeHkoMCwgMCksIHh5KC0xLCAxKSwgeHkoLTQsIDQpKTtcbiAgICBmb3VyRm91cih4eSgwLCAwKSwgeHkoLTEsIDEpLCB4eSgtNCwgNCkpO1xuXG4gICAgYXNzZXJ0RGlmZkVkZ2UoeHkoLTQsIC00KSwgeHkoMCwgMCksIHh5KC0xLCAtMSksIHh5KC00LCAtNCkpO1xuICAgIGFzc2VydERpZmZFZGdlKHh5KDQsIDQpLCB4eSgxLCAxKSwgeHkoMiwgMiksIHh5KDQsIDQpKTtcbiAgICBhc3NlcnREaWZmRWRnZSh4eSg0LCA0KSwgeHkoMiwgMiksIHh5KDMsIDMpLCB4eSg0LCA0KSk7XG4gICAgYXNzZXJ0RGlmZkVkZ2UoeHkoLTQsIC00KSwgeHkoLTEsIC0xKSwgeHkoLTIsIC0yKSwgeHkoLTQsIC00KSk7XG4gICAgYXNzZXJ0RGlmZkVkZ2UoeHkoLTQsIDQpLCB4eSgtMSwgLTEpLCB4eSgtMiwgMCksIHh5KC00LCAyKSk7XG5cbiAgICBjb25zdCBsaW5lSXNzdWUgPSBhc3NlcnREaWZmRWRnZS5iaW5kKG51bGwsIHh5KC01LCAtNSkpO1xuXG4gICAgbGluZUlzc3VlKHh5KC01LCAyKSwgeHkoLTUsIDApLCB4eSgtNSwgLTUpKTtcbiAgICAvL1RvcCBSaWdodFxuICAgIGFzc2VydERpZmZFZGdlKHh5KDUsIDUpLCB4eSgwLCA1KSwgeHkoMiwgNSksIHh5KDUsIDUpKTtcbiAgICBhc3NlcnREaWZmRWRnZSh4eSg1LCA1KSwgeHkoNSwgMCksIHh5KDUsIDEpLCB4eSg1LCA1KSk7XG5cbiAgICAvLyAvL0JvdHRvbSBSaWdodFxuICAgIGFzc2VydERpZmZFZGdlKHh5KDUsIC01KSwgeHkoNSwgMCksIHh5KDUsIC0wLjEpLCB4eSg1LCAtNSkpO1xuICAgIGFzc2VydERpZmZFZGdlKHh5KDUsIC01KSwgeHkoMCwgLTUpLCB4eSgxLCAtNSksIHh5KDUsIC01KSk7XG5cbiAgICAvL1RvcCBMZWZ0XG4gICAgYXNzZXJ0RGlmZkVkZ2UoeHkoLTUsIDUpLCB4eSgtNSwgMCksIHh5KC01LCAwLjEpLCB4eSgtNSwgNSkpO1xuICAgIGFzc2VydERpZmZFZGdlKHh5KC01LCA1KSwgeHkoMCwgNSksIHh5KC0xLCA1KSwgeHkoLTUsIDUpKTtcblxuICAgIC8vQm90dG9tIExlZnRcbiAgICBhc3NlcnREaWZmRWRnZSh4eSgtNSwgLTUpLCB4eSgtNSwgMCksIHh5KC01LCAtMC4xKSwgeHkoLTUsIC01KSk7XG4gICAgYXNzZXJ0RGlmZkVkZ2UoeHkoLTUsIC01KSwgeHkoMCwgLTUpLCB4eSgtMSwgLTUpLCB4eSgtNSwgLTUpKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldE9wcG9zaW5nU2lkZScsICgpID0+IHtcbiAgICBjb25zdCBhc3NlcnRPcHBvc2luZ1NpZGUgPSAoaHlwLCBhbmdsZSwgZXhwZWN0ZWQpID0+IHtcbiAgICAgIGl0KGAke2h5cH0sICR7YW5nbGV9ID0gJHtleHBlY3RlZH1gLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJhZGlhbnMgPSB0b1JhZGlhbnMoYW5nbGUpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBnZXRPcHBvc2luZ1NpZGUoaHlwLCByYWRpYW5zKTtcbiAgICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZUNsb3NlVG8oZXhwZWN0ZWQpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGFzc2VydE9wcG9zaW5nU2lkZSgxLCA0NSwgMC43MDcpO1xuICAgIGFzc2VydE9wcG9zaW5nU2lkZSgxLjI1LCA0NSwgMC44OCk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxJQUFBQSxLQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxNQUFBLEdBQUFDLHNCQUFBLENBQUFILE9BQUE7QUFBMEIsSUFBQUksZUFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQTtBQUUxQixJQUFNQyxHQUFHLEdB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QUUsRUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUFDLGVBQVMsRUFBQyxHQUFHLENBQUMsQ0FBQztJQUNqRFosV0FBVyxDQUFDLElBQUFXLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUFDLGVBQVMsRUFBQyxHQUFHLENBQUMsQ0FBQztJQUNoRFosV0FBVyxDQUFDLElBQUFXLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUFDLGVBQVMsRUFBQyxHQUFHLENBQUMsQ0FBQztJQUNoRFosV0FBVyxDQUFDLElBQUFXLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQyxlQUFTLEVBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0NaLFdBQVcsQ0FBQyxJQUFBVyxTQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUFBLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUMsZUFBUyxFQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlDWixXQUFXLENBQUMsSUFBQVcsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUFDLGVBQVMsRUFBQyxNQUFNLENBQUMsQ0FBQztJQUNsRFosV0FBVyxDQUFDLElBQUFXLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQyxlQUFTLEVBQUMsTUFBTSxDQUFDLENBQUM7SUFDbERaLFdBQVcsQ0FBQyxJQUFBVyxTQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUFBLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUMsZUFBUyxFQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xEWixXQUFXLENBQUMsSUFBQVcsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUFDLGVBQVMsRUFBQyxNQUFNLENBQUMsQ0FBQztFQUNwRCxDQUFDLENBQUM7RUFFRmIsUUFBUSxDQUFDLGFBQWEsRUFBRSxZQUFNO0lBQzVCLElBQU1jLFdBQVcsR0FBRyxTQUFkQSxXQUFXQSxDQUFJQyxLQUFLLEVBQUVYLFFBQVEsRUFBSztNQUN2Q0MsRUFBRSxJQUFBcEIsTUFBQSxDQUFJLElBQUFzQixlQUFTLEVBQUNRLEtBQUssQ0FBQyxVQUFBOUIsTUFBQSxDQUFPLElBQUFzQixlQUFTLEVBQUNILFFBQVEsQ0FBQyxHQUFJLFlBQU07UUFDeEQsSUFBTUksTUFBTSxHQUFHLElBQUFRLGlCQUFXLEVBQUNELEtBQUssQ0FBQztRQUNqQ3RDLEdBQUcsWUFBQVEsTUFBQSxDQUFZLElBQUFzQixlQUFTLEVBQUNDLE1BQU0sQ0FBQyxDQUFFLENBQUM7UUFDbkNFLE1BQU0sQ0FBQ0YsTUFBTSxDQUFDLENBQUNHLFdBQVcsQ0FBQ1AsUUFBUSxDQUFDO01BQ3RDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRFUsV0FBVyxDQUFDLElBQUFELGVBQVMsRUFBQyxFQUFFLENBQUMsRUFBRSxJQUFBQSxlQUFTLEVBQUMsRUFBRSxDQUFDLENBQUM7SUFDekNDLFdBQVcsQ0FBQyxJQUFBRCxlQUFTLEVBQUMsR0FBRyxDQUFDLEVBQUUsSUFBQUEsZUFBUyxFQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzFDQyxXQUFXLENBQUMsSUFBQUQsZUFBUyxFQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUFBLGVBQVMsRUFBQyxFQUFFLENBQUMsQ0FBQztJQUMxQ0MsV0FBVyxDQUFDLElBQUFELGVBQVMsRUFBQyxHQUFHLENBQUMsRUFBRSxJQUFBQSxlQUFTLEVBQUMsRUFBRSxDQUFDLENBQUM7RUFDNUMsQ0FBQyxDQUFDO0VBRUZiLFFBQVEsQ0FBQyxhQUFhLEVBQUUsWUFBTTtJQUM1QixJQUFNYyxXQUFXLEdBQUcsU0FBZEEsV0FBV0EsQ0FBSUMsS0FBSyxFQUFFWCxRQUFRLEVBQUs7TUFDdkNDLEVBQUUsSUFBQXBCLE1BQUEsQ0FBSSxJQUFBc0IsZUFBUyxFQUFDUSxLQUFLLENBQUMsVUFBQTlCLE1BQUEsQ0FBTyxJQUFBc0IsZUFBUyxFQUFDSCxRQUFRLENBQUMsR0FBSSxZQUFNO1FBQ3hELElBQU1JLE1BQU0sR0FBRyxJQUFBUyxpQkFBVyxFQUFDRixLQUFLLENBQUM7UUFDakN0QyxHQUFHLFlBQUFRLE1BQUEsQ0FBWSxJQUFBc0IsZUFBUyxFQUFDQyxNQUFNLENBQUMsQ0FBRSxDQUFDO1FBQ25DRSxNQUFNLENBQUNGLE1BQU0sQ0FBQyxDQUFDRyxXQUFXLENBQUNQLFFBQVEsQ0FBQztNQUN0QyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRURVLFdBQVcsQ0FBQyxJQUFBRCxlQUFTLEVBQUMsRUFBRSxDQUFDLEVBQUUsSUFBQUEsZUFBUyxFQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDQyxXQUFXLENBQUMsSUFBQUQsZUFBUyxFQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUFBLGVBQVMsRUFBQyxFQUFFLENBQUMsQ0FBQztJQUMxQ0MsV0FBVyxDQUFDLElBQUFELGVBQVMsRUFBQyxHQUFHLENBQUMsRUFBRSxJQUFBQSxlQUFTLEVBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUNDLFdBQVcsQ0FBQyxJQUFBRCxlQUFTLEVBQUMsR0FBRyxDQUFDLEVBQUUsSUFBQUEsZUFBUyxFQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQzVDLENBQUMsQ0FBQztFQUVGYixRQUFRLENBQUMsT0FBTyxFQUFFLFlBQU07SUFDdEIsSUFBTWtCLFdBQVcsR0FBRyxTQUFkQSxXQUFXQSxDQUFJQyxNQUFNLEVBQUVDLEtBQUs7TUFBQSxPQUFLLFVBQUNDLElBQUksRUFBRUMsRUFBRSxFQUFFbEIsUUFBUSxFQUFLO1FBQzdEQyxFQUFFLENBQUNqQixDQUFDLENBQUFiLGdCQUFBLEtBQUFBLGdCQUFBLE9BQUErQix1QkFBQSwwREFBR2EsTUFBTSxFQUFLQyxLQUFLLEVBQU1DLElBQUksRUFBT0MsRUFBRSxFQUFPbEIsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFHQSxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUksWUFBTTtVQUNsRixJQUFNSSxNQUFNLEdBQUcsSUFBQWUsV0FBSyxFQUFDSixNQUFNLEVBQUVDLEtBQUssQ0FBQyxDQUFDQyxJQUFJLEVBQUVDLEVBQUUsQ0FBQztVQUM3Q1osTUFBTSxDQUFDRixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUN6QixDQUFDLENBQUMsQ0FBQzRCLFdBQVcsQ0FBQ1AsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDckIsQ0FBQyxDQUFDO1VBQzlDMkIsTUFBTSxDQUFDRixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUN4QixDQUFDLENBQUMsQ0FBQzJCLFdBQVcsQ0FBQ1AsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDcEIsQ0FBQyxDQUFDO1VBQzlDMEIsTUFBTSxDQUFDRixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUN6QixDQUFDLENBQUMsQ0FBQzRCLFdBQVcsQ0FBQ1AsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDckIsQ0FBQyxDQUFDO1VBQzlDMkIsTUFBTSxDQUFDRixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUN4QixDQUFDLENBQUMsQ0FBQzJCLFdBQVcsQ0FBQ1AsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDcEIsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQztNQUNKLENBQUM7SUFBQTtJQUVELElBQU13QyxHQUFHLEdBQUdOLFdBQVcsQ0FBQztNQUFFTyxHQUFHLEVBQUUsQ0FBQyxDQUFDO01BQUVDLEdBQUcsRUFBRTtJQUFFLENBQUMsRUFBRTtNQUFFRCxHQUFHLEVBQUUsQ0FBQyxDQUFDO01BQUVDLEdBQUcsRUFBRTtJQUFFLENBQUMsQ0FBQztJQUNqRUYsR0FBRyxDQUFDLElBQUFaLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUFBLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQ1ksR0FBRyxDQUFDLElBQUFaLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUFBLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQ1ksR0FBRyxDQUFDLElBQUFaLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUFBLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQ1ksR0FBRyxDQUFDLElBQUFaLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUFBLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUNZLEdBQUcsQ0FBQyxJQUFBWixTQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUFBLFNBQUUsRUFBQyxDQUFDLENB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Q0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdENtQixNQUFNLENBQUMsSUFBQW5CLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEMsSUFBTXFCLFFBQVEsR0FBR0wsY0FBYyxDQUFDSSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUFwQixTQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRXBEcUIsUUFBUSxDQUFDLElBQUFyQixTQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUFBLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0Q3FCLFFBQVEsQ0FBQyxJQUFBckIsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUFBLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdENxQixRQUFRLENBQUMsSUFBQXJCLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RDcUIsUUFBUSxDQUFDLElBQUFyQixTQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUFBLFNBQUUsRUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeENxQixRQUFRLENBQUMsSUFBQXJCLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUFBLFNBQUUsRUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUV4Q2dCLGNBQWMsQ0FBQyxJQUFBaEIsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RGdCLGNBQWMsQ0FBQyxJQUFBaEIsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUFBLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RGdCLGNBQWMsQ0FBQyxJQUFBaEIsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUFBLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RGdCLGNBQWMsQ0FBQyxJQUFBaEIsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOURnQixjQUFjLENBQUMsSUFBQWhCLFNBQUUsRUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTNELElBQU1lLFNBQVMsR0FBR0MsY0FBYyxDQUFDSSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUFwQixTQUFFLEVBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV2RGUsU0FBUyxDQUFDLElBQUFmLFNBQUUsRUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0M7SUFDQWdCLGNBQWMsQ0FBQyxJQUFBaEIsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUFBLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RGdCLGNBQWMsQ0FBQyxJQUFBaEIsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFBQSxTQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUFBLFNBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBQUEsU0FBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs7SUFFdEQ7SUFDQWdCLGNBQWMsQ0FBQyxJQUFBaEIsU0FB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